mirror of
https://github.com/aiclientproxy/proxycast.git
synced 2026-10-13 17:36:57 +08:00
Release v1.139.0
This commit is contained in:
@@ -219,6 +219,8 @@ jobs:
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
PLUGIN_GATE_EXECUTABLE="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));const executable=summary.evidence?.installation?.executable;if(!executable)throw new Error('Windows Squirrel evidence is missing the installed executable');process.stdout.write(executable);")"
|
||||
CANDIDATE_RUN_ID="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));if(!summary.candidateRunId)throw new Error('Windows Squirrel evidence is missing candidateRunId');process.stdout.write(summary.candidateRunId);")"
|
||||
export LIME_GATE_RUN_ID="$CANDIDATE_RUN_ID"
|
||||
npm run smoke:plugin-package-electron-gate-b -- \
|
||||
--electron-executable "$PLUGIN_GATE_EXECUTABLE" \
|
||||
--evidence-dir ".lime/qc/gui-evidence/plugin-package-electron-gate-b-windows" \
|
||||
@@ -231,6 +233,8 @@ jobs:
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
CODE_MODE_GATE_EXECUTABLE="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));const executable=summary.evidence?.installation?.executable;if(!executable)throw new Error('Windows Squirrel evidence is missing the installed executable');process.stdout.write(executable);")"
|
||||
CANDIDATE_RUN_ID="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));if(!summary.candidateRunId)throw new Error('Windows Squirrel evidence is missing candidateRunId');process.stdout.write(summary.candidateRunId);")"
|
||||
export LIME_GATE_RUN_ID="$CANDIDATE_RUN_ID"
|
||||
npm run smoke:code-mode-electron-gate-b -- \
|
||||
--electron-executable "$CODE_MODE_GATE_EXECUTABLE" \
|
||||
--output ".lime/qc/gui-evidence/code-mode-electron-gate-b-windows/code-mode-electron-gate-b-summary.json" \
|
||||
@@ -242,11 +246,26 @@ jobs:
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
NATIVE_HOST_GATE_EXECUTABLE="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));const executable=summary.evidence?.installation?.executable;if(!executable)throw new Error('Windows Squirrel evidence is missing the installed executable');process.stdout.write(executable);")"
|
||||
CANDIDATE_RUN_ID="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));if(!summary.candidateRunId)throw new Error('Windows Squirrel evidence is missing candidateRunId');process.stdout.write(summary.candidateRunId);")"
|
||||
export LIME_GATE_RUN_ID="$CANDIDATE_RUN_ID"
|
||||
node scripts/electron/windows-native-host-gate-b.mjs \
|
||||
--electron-executable "$NATIVE_HOST_GATE_EXECUTABLE" \
|
||||
--evidence-dir ".lime/qc/gui-evidence/windows-native-host-gate-b" \
|
||||
--timeout-ms 120000
|
||||
|
||||
- name: Validate Windows packaged Gate B evidence identity
|
||||
if: always()
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
node scripts/electron/windows-packaged-evidence.mjs \
|
||||
--version "$VERSION" \
|
||||
--squirrel-summary ".lime/qc/windows-squirrel-rc/$VERSION/summary.json" \
|
||||
--code-mode-summary ".lime/qc/gui-evidence/code-mode-electron-gate-b-windows/code-mode-electron-gate-b-summary.json" \
|
||||
--native-host-summary ".lime/qc/gui-evidence/windows-native-host-gate-b/summary.json" \
|
||||
--output ".lime/qc/gui-evidence/windows-packaged-evidence/$VERSION/summary.json"
|
||||
|
||||
- name: Upload Windows Squirrel RC evidence
|
||||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v4
|
||||
@@ -283,6 +302,15 @@ jobs:
|
||||
retention-days: ${{ github.event.inputs.retention_days || 7 }}
|
||||
path: .lime/qc/gui-evidence/windows-native-host-gate-b
|
||||
|
||||
- name: Upload Windows packaged Gate B evidence identity
|
||||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: lime-windows-packaged-evidence
|
||||
if-no-files-found: warn
|
||||
retention-days: ${{ github.event.inputs.retention_days || 7 }}
|
||||
path: .lime/qc/gui-evidence/windows-packaged-evidence
|
||||
|
||||
- name: Upload Windows test package
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
@@ -398,6 +398,27 @@ jobs:
|
||||
--platform "${{ matrix.host_platform }}" \
|
||||
--arch "${{ matrix.arch }}"
|
||||
|
||||
- name: Run packaged macOS native host Gate B
|
||||
if: matrix.host_platform == 'darwin'
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
APP_EXECUTABLE="release-electron/Lime-darwin-${{ matrix.arch }}/Lime.app/Contents/MacOS/Lime"
|
||||
test -x "$APP_EXECUTABLE"
|
||||
node scripts/electron/macos-native-host-gate-b.mjs \
|
||||
--electron-executable "$APP_EXECUTABLE" \
|
||||
--arch "${{ matrix.arch }}" \
|
||||
--evidence-dir ".lime/qc/gui-evidence/macos-native-host-gate-b-${{ matrix.arch }}"
|
||||
|
||||
- name: Upload packaged macOS native host Gate B evidence
|
||||
if: ${{ always() && matrix.host_platform == 'darwin' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos-native-host-gate-b-evidence-${{ matrix.arch }}
|
||||
path: .lime/qc/gui-evidence/macos-native-host-gate-b-${{ matrix.arch }}
|
||||
if-no-files-found: warn
|
||||
retention-days: 7
|
||||
|
||||
- name: Stage Electron release assets
|
||||
shell: bash
|
||||
env:
|
||||
@@ -465,6 +486,8 @@ jobs:
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
CODE_MODE_GATE_EXECUTABLE="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));const executable=summary.evidence?.installation?.executable;if(!executable)throw new Error('Windows Squirrel evidence is missing the installed executable');process.stdout.write(executable);")"
|
||||
CANDIDATE_RUN_ID="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));if(!summary.candidateRunId)throw new Error('Windows Squirrel evidence is missing candidateRunId');process.stdout.write(summary.candidateRunId);")"
|
||||
export LIME_GATE_RUN_ID="$CANDIDATE_RUN_ID"
|
||||
node scripts/agent-runtime/code-mode-electron-gate-b.mjs \
|
||||
--electron-executable "$CODE_MODE_GATE_EXECUTABLE" \
|
||||
--output ".lime/qc/gui-evidence/code-mode-electron-gate-b-windows/code-mode-electron-gate-b-summary.json" \
|
||||
@@ -477,11 +500,26 @@ jobs:
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
NATIVE_HOST_GATE_EXECUTABLE="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));const executable=summary.evidence?.installation?.executable;if(!executable)throw new Error('Windows Squirrel evidence is missing the installed executable');process.stdout.write(executable);")"
|
||||
CANDIDATE_RUN_ID="$(node -e "const fs=require('node:fs');const summary=JSON.parse(fs.readFileSync('.lime/qc/windows-squirrel-rc/$VERSION/summary.json','utf8'));if(!summary.candidateRunId)throw new Error('Windows Squirrel evidence is missing candidateRunId');process.stdout.write(summary.candidateRunId);")"
|
||||
export LIME_GATE_RUN_ID="$CANDIDATE_RUN_ID"
|
||||
node scripts/electron/windows-native-host-gate-b.mjs \
|
||||
--electron-executable "$NATIVE_HOST_GATE_EXECUTABLE" \
|
||||
--evidence-dir ".lime/qc/gui-evidence/windows-native-host-gate-b" \
|
||||
--timeout-ms 120000
|
||||
|
||||
- name: Validate Windows packaged Gate B evidence identity
|
||||
if: ${{ always() && matrix.host_platform == 'win32' }}
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
VERSION="$(node -p "require('./package.json').version")"
|
||||
node scripts/electron/windows-packaged-evidence.mjs \
|
||||
--version "$VERSION" \
|
||||
--squirrel-summary ".lime/qc/windows-squirrel-rc/$VERSION/summary.json" \
|
||||
--code-mode-summary ".lime/qc/gui-evidence/code-mode-electron-gate-b-windows/code-mode-electron-gate-b-summary.json" \
|
||||
--native-host-summary ".lime/qc/gui-evidence/windows-native-host-gate-b/summary.json" \
|
||||
--output ".lime/qc/gui-evidence/windows-packaged-evidence/$VERSION/summary.json"
|
||||
|
||||
- name: Upload Windows Squirrel RC evidence
|
||||
if: ${{ always() && matrix.host_platform == 'win32' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
@@ -509,6 +547,15 @@ jobs:
|
||||
if-no-files-found: warn
|
||||
retention-days: 7
|
||||
|
||||
- name: Upload Windows packaged Gate B evidence identity
|
||||
if: ${{ always() && matrix.host_platform == 'win32' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: windows-packaged-evidence-${{ matrix.target }}
|
||||
path: .lime/qc/gui-evidence/windows-packaged-evidence
|
||||
if-no-files-found: warn
|
||||
retention-days: 7
|
||||
|
||||
- name: Upload staged release assets artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
+1
-2
@@ -58,6 +58,7 @@ internal/exec-plans/*
|
||||
!internal/exec-plans/templates/
|
||||
!internal/exec-plans/templates/*.md
|
||||
!internal/exec-plans/README.md
|
||||
!internal/exec-plans/documentation-convergence-plan.md
|
||||
!internal/exec-plans/scheduled-tasks-implementation.md
|
||||
!internal/exec-plans/release-v*-plan.md
|
||||
!internal/exec-plans/claw-streaming-rendering-codex-refactor-plan.md
|
||||
@@ -81,8 +82,6 @@ internal/exec-plans/*
|
||||
!internal/exec-plans/writing-v2-workflow-completion-plan.md
|
||||
!internal/exec-plans/workflow-standardization-plan.md
|
||||
!internal/exec-plans/p16-diagnostics-current-fail-closed-progress.md
|
||||
!internal/exec-plans/tauri-wrapper-quick-cleanup-queue.md
|
||||
!internal/exec-plans/tauri-wrapper-command-inventory.md
|
||||
!internal/exec-plans/db-slimming-codex-alignment-plan.md
|
||||
!internal/exec-plans/models-runtime-unification-plan.md
|
||||
!internal/exec-plans/mcp-modernization-progress.md
|
||||
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
# Lime Feature Map
|
||||
|
||||
> Lime 仓库级产品能力地图。本文回答“用户能完成什么、从哪里进入、运行时事实由谁拥有、应去哪里查看详细规则”。它是导航,不是第二套架构、需求、路线图或 readiness 数据库。
|
||||
|
||||
## 1. 使用规则
|
||||
|
||||
- **Feature**:面向用户或外部调用方可感知的完整能力,不按页面、组件或 crate 数量拆分。
|
||||
- **用户入口**:当前产品中的稳定入口;GUI、CLI、App Server 协议与系统触发入口分开记录。
|
||||
- **Current owner**:拥有状态机、运行时不变量或持久事实的唯一领域 owner。Renderer 只拥有交互与投影,Electron 只拥有桌面宿主能力。
|
||||
- **稳定边界**:能力进入 current 主链的 typed gateway、JSON-RPC method family、runtime contract 或 Desktop Host surface。
|
||||
- **状态**:`current` 可继续演进;`compat` 只能委托;`deprecated` 只能迁出;`dead` 已删除或禁止恢复。
|
||||
|
||||
`current` 表示唯一演进路径,不表示所有 provider、平台、打包产物或 Gate B 证据都已完成。未完成项继续记录在对应执行计划、质量证据和领域事实源中,不在本表伪装成已交付能力。
|
||||
|
||||
裁决顺序固定为:
|
||||
|
||||
1. 当前构建图、协议 schema、运行代码和稳定测试。
|
||||
2. [全局架构图](./internal/aiprompts/architecture.md)与根 `AGENTS.md`。
|
||||
3. `internal/aiprompts/` 中的领域事实源。
|
||||
4. 已确认执行计划、路线图、研究和历史 evidence。
|
||||
|
||||
## 2. Desktop 产品主链
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
U[用户 / 外部入口]
|
||||
UI[React Renderer\nGUI 与局部交互]
|
||||
HOST[Electron Desktop Host\n系统能力与 sidecar]
|
||||
APP[App Server JSON-RPC\n业务协议与 read model]
|
||||
CORE[RuntimeCore / agent-runtime\nThread / Turn / Item]
|
||||
MODEL[model-provider\n模型目录、路由与 lowering]
|
||||
TOOL[tool-runtime\n工具、权限与执行]
|
||||
DATA[thread-store / repository\n持久化与 projection]
|
||||
|
||||
U --> UI
|
||||
UI --> HOST
|
||||
HOST --> APP
|
||||
APP --> CORE
|
||||
CORE --> MODEL
|
||||
CORE --> TOOL
|
||||
CORE --> DATA
|
||||
DATA --> APP
|
||||
APP --> UI
|
||||
```
|
||||
|
||||
Desktop GUI 业务能力只通过 App Server JSON-RPC 进入 Rust runtime。Electron IPC 仅承接窗口、文件选择、系统权限、通知、更新、native view 和 sidecar 生命周期,不能成为第二套业务后端。独立 CLI 有自己的任务入口,但不能替代 App Server 的桌面产品协议。完整依赖方向以[全局架构图](./internal/aiprompts/architecture.md)为准。
|
||||
|
||||
## 3. Feature Ownership Map
|
||||
|
||||
| Feature | 用户能力 | 当前用户入口 | Current owner / 稳定边界 | 状态与事实源 |
|
||||
| ------------------------------ | ------------------------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Agent 任务与对话 | 从目标启动任务,持续执行、取消、恢复和查看 Thread / Turn / Item | “新建任务”与 Agent Workspace | `app-server`、`agent-runtime`、`agent`、`thread-store`;typed Thread/Turn API 与 canonical projection | `current`;[架构](./internal/aiprompts/architecture.md)、[Query Loop](./internal/aiprompts/query-loop.md) |
|
||||
| 协作模式与 Multi-Agent | 选择 Default / Plan,并让子 Agent 分工后回到主 Thread | Composer 模式选择与 Agent 运行过程 | `collaborationMode/list`、`agent-runtime`、subagent Thread/Turn 与同一 projection | `current`;[任务与 Agent taxonomy](./internal/aiprompts/task-agent-taxonomy.md)、[命令边界](./internal/aiprompts/commands.md) |
|
||||
| Workspace、项目与文件 | 选择项目目录,浏览、读取、写入和预览项目文件 | Agent Workspace、文件浏览器与 Right Surface | App Server workspace/repository;`fs/*`;Electron 仅提供系统目录选择与文件壳能力 | `current`;[Workspace 边界](./internal/aiprompts/workspace.md)、[命令边界](./internal/aiprompts/commands.md) |
|
||||
| 终端与后台进程 | 执行一次性命令、交互终端并管理 Thread-owned 后台进程 | Workspace 终端与命令 Item | `command/exec*`、`process/*`、`thread/backgroundTerminals/*`;`tool-runtime` process supervisor | `current`;[命令边界](./internal/aiprompts/commands.md) |
|
||||
| 工具、审批与执行策略 | 调用本地工具,在危险操作前审批,并按工作区策略限制执行 | Agent 工具 Item、审批交互与设置 | `tool-runtime`;`permissionProfile/list`;App Server server-request;canonical tool Item | `current`;[命令边界](./internal/aiprompts/commands.md)、[质量工作流](./internal/aiprompts/quality-workflow.md) |
|
||||
| Browser Workspace | 在同一可见浏览器中由用户或 Agent 浏览、操作、下载和接管 | Right Surface 的 Electron `WebContentsView` | `BrowserTabHost`、Renderer browser gateway、App Server dynamic-tool host;同一 tab/view owner | `current`;[命令边界](./internal/aiprompts/commands.md) |
|
||||
| Provider、模型与凭证 | 配置模型服务,选择模型,并按 capability/readiness 路由请求 | 设置中的模型与服务、Composer Model Selector | `model-provider`;catalog、route、credential readiness、canonical content、lowering、stream、retry/breaker | `current`;[Provider 系统](./internal/aiprompts/providers.md) |
|
||||
| 多模态与媒体生成 | 在同一任务中理解或生成图片、音频、视频和其他媒体产物 | Composer、Agent Workspace 与 artifact/workbench | `model-provider` 负责 sampling/lowering;`media-runtime` 负责媒体任务;Thread/Artifact 持有结果事实 | `current`;[架构](./internal/aiprompts/architecture.md)、[持久化地图](./internal/aiprompts/persistence-map.md) |
|
||||
| 官方任务 CLI | 以结构化 JSON 运行媒体与内容任务、查看任务状态、发现 Skill 和执行诊断 | `lime task`、`lime skill`、`lime doctor` | `lime-cli` 与 `media-runtime`;CLI 是独立入口,不定义 Desktop Thread/Turn/Item 协议 | `current`;[CLI 源码](./lime-rs/crates/lime-cli/)、[架构](./internal/aiprompts/architecture.md) |
|
||||
| MCP | 管理 MCP server,发现 tools/prompts/resources,并在真实 Thread 中调用工具 | 设置 MCP 页面与 Agent runtime | `src/lib/api/mcp.ts -> App Server mcp* -> lime-mcp`;Thread-owned `McpThreadRuntime` | `current`;[MCP](./internal/aiprompts/mcp.md)、[命令边界](./internal/aiprompts/commands.md) |
|
||||
| Skills | 发现、读取、启停和执行本地或远程 Skill | Plugins 聚合入口中的 Skills Workspace 与 Composer | `skills/list`、`skill/read`、`skills/config/write`;`lime-skills` 与 Agent Skill snapshot | `current`;[Skill 标准](./internal/aiprompts/skill-standard.md)、[命令边界](./internal/aiprompts/commands.md) |
|
||||
| Apps 与 Plugins | 安装、启停和发现扩展,为 Agent 提供 Apps/connectors 与 UI 资源 | Plugins / App Center | App Server `app/*`、`plugin/*`;`PluginDataSource` 与 local plugin catalog | `current`;Plugin v3 是唯一版本替代路径,hosted connector 的 `callable=true` 仍以真实 readiness 证据为准;[Plugin v3](./internal/roadmap/plugin/v3/README.md)、[命令边界](./internal/aiprompts/commands.md) |
|
||||
| Experts | 从领域专家配置启动一个带 profile、release 和 Skill 约束的新任务 | Plugins 聚合入口中的专家广场 | Expert catalog/launch metadata 只负责入口编排;执行仍归同一 Agent Thread/Turn 主链 | `current`;入口见 [`AppPageContent`](./src/components/AppPageContent.tsx),runtime 归[架构](./internal/aiprompts/architecture.md) |
|
||||
| 项目资料与知识上下文 | 导入、编译、选择资料包,并把可信上下文注入任务 | “项目资料”页面与 Agent Composer | `lime-knowledge`、App Server `knowledgePack/*` 与 `knowledgeContext/*`;Renderer 只做选择和状态投影 | `current`;协议见 [`app-server-protocol`](./lime-rs/crates/app-server-protocol/) |
|
||||
| Artifact 与资源工作区 | 查看、编辑、版本化和导出任务生成物及文件快照 | Agent Workbench 与“资源”页面 | canonical FileArtifact / Artifact snapshot、App Server `artifact/*`、sidecar snapshot store | `current`;[Workspace](./internal/aiprompts/workspace.md)、[持久化地图](./internal/aiprompts/persistence-map.md) |
|
||||
| Scheduled Tasks | 创建、启停、预览和立即运行周期任务,并查看运行历史 | “已安排任务”页面 | App Server `scheduledTask/*`、RuntimeCore、scheduler 与 automation storage mapping | `current`;真实 OS sleep/wake、Windows 通知与 Windows Gate B 仍是平台证据缺口;[命令边界](./internal/aiprompts/commands.md) |
|
||||
| 消息渠道与远程入口 | 从支持的 IM 渠道触发本地 Agent,并管理渠道与 tunnel | “消息渠道”页面 | 消息渠道 runtime 是 current ingress,最终回到现有 Agent session/task/evidence;旧单渠道与部分命令壳不得扩展 | `current` 入口,含受控 `compat/deprecated` 边界;[Remote runtime](./internal/aiprompts/remote-runtime.md) |
|
||||
| 记忆、上下文与压缩 | 在长任务中复用受管记忆,按需读取原文,并压缩上下文后继续执行 | Agent turn 与设置中的记忆控制 | RuntimeCore / App Server、`MemoryBackend`、memory tools、canonical compaction continuation | `current`;[Memory / Context / Compaction](./internal/aiprompts/memory-compaction.md) |
|
||||
| 历史、回退、Review 与 Evidence | 恢复会话、替换后续历史、发起代码审阅,并从 canonical read model 导出证据 | Thread 历史、消息回退入口、Review 与状态面板 | App Server `thread/read | resume | revert`、`review/start`、ThreadStore 与 canonical evidence projection | `current`;[状态、历史与遥测](./internal/aiprompts/state-history-telemetry.md)、[命令边界](./internal/aiprompts/commands.md) |
|
||||
| 配置与系统设置 | 管理全局配置、实验能力、权限档位、外观和桌面行为 | “设置”页面 | `config/*`、`experimentalFeature/*`、`permissionProfile/list`;系统壳配置归 Electron Host | `current`;[命令边界](./internal/aiprompts/commands.md) |
|
||||
| Desktop Host 与发布生命周期 | 使用窗口、托盘、通知、系统权限、native helper、自动更新与安装包 | 主窗口、系统菜单、通知和更新入口 | `electron/`、preload/IPC 白名单、sidecar host、Forge 与平台资源 manifest | `current`;[架构](./internal/aiprompts/architecture.md)、[质量工作流](./internal/aiprompts/quality-workflow.md) |
|
||||
|
||||
## 4. Owner Quick Map
|
||||
|
||||
| Owner | 负责 | 不负责 |
|
||||
| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
|
||||
| `src/` Renderer | 产品交互、i18n、局部 UI 状态、request builder 与 projection | Thread 真相、provider wire、工具执行、生产 mock fallback |
|
||||
| `electron/` Desktop Host | 窗口、preload、IPC、系统权限、native view/helper、sidecar、updater | Agent 状态机、模型请求、Thread/Turn/Item、业务 repository |
|
||||
| `app-server` 与 protocol/client | 唯一业务 JSON-RPC、handler、host context、read model 与领域接线 | provider-specific payload、Electron 系统实现、Renderer 状态 |
|
||||
| `agent-runtime` / `agent` | 回合生命周期、队列、取消、stream、runtime scope 与 Agent 编排 | provider 网络、桌面窗口、UI 缓存 |
|
||||
| `model-provider` | model catalog/switch、capability/readiness、credential route、canonical content、lowering、stream、retry/breaker | Agent loop、工具权限、Thread 持久化 |
|
||||
| `tool-runtime` | 工具定义、权限、sandbox、dispatch、进程与 MCP step snapshot | GUI、provider catalog、Thread read model |
|
||||
| `thread-store` / App Server repository | Thread/Turn/Item、event history、projection 与恢复事实 | 临时 UI 状态、系统文件选择、provider wire |
|
||||
|
||||
## 5. 退役与过渡边界
|
||||
|
||||
本节只列仓库级高风险边界,不替代[治理规则](./internal/aiprompts/governance.md)和各领域的完整目录册。
|
||||
|
||||
| Surface | 分类 | 处理规则 |
|
||||
| ----------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------ |
|
||||
| 已退役 runtime 的 vendor、workspace crate、迁移目录与专用 skill | `dead / deleted / forbidden-to-restore` | 只能作为历史 evidence 或负向守卫;能力缺口在 current owner 内按 Codex 重建 |
|
||||
| 已删除的 `lime-providers` | `dead / deleted / forbidden-to-restore` | Provider 能力只能进入 `model-provider`,不得恢复依赖或 compat 包装 |
|
||||
| 旧 Electron 业务 facade、legacy JSON-RPC/IPC 与生产 mock fallback | `dead` 或 `deprecated` | 业务调用迁入 App Server current method;旧名只允许负向守卫或有退出条件的委托层 |
|
||||
| 旧 MCP、Skills、Automation 与外部 Chrome/CDP 正向入口 | `dead / retired guard-only` | 不恢复 catalog、Renderer gateway、Desktop command 或正向 fixture |
|
||||
| `.lime/AGENTS.md` / `.lime/AGENTS.override.md` 文件位置 fallback | `compat` | 只委托标准 `CODEX_HOME/AGENTS.md` 与项目 `AGENTS.md`,不得扩展新语义 |
|
||||
| 消息渠道旧单通道入口与 remote command wrapper | `compat` 或 `deprecated` | 新能力只能进入 current 消息渠道或浏览器连接器 ingress;按领域计划迁出 |
|
||||
|
||||
## 6. 维护规则
|
||||
|
||||
1. 改 Feature owner、依赖方向或产品主链时,先更新代码和[全局架构图](./internal/aiprompts/architecture.md),完成责任开发者确认后再同步本表。
|
||||
2. 改 JSON-RPC method、schema、Desktop Host bridge 或 typed client 时,同步[命令边界](./internal/aiprompts/commands.md)、消费者、catalog、fixture 与契约测试。
|
||||
3. 改 `current / compat / deprecated / dead` 分类时,先更新[治理规则](./internal/aiprompts/governance.md)或对应领域事实源;本表只做摘要。
|
||||
4. 新增页面不自动等于新增 Feature;先判断它属于现有能力入口,还是确实建立了新的唯一 owner。
|
||||
5. 路线图、研究、截图和单次测试结果不能单独把能力升级为 `current`。真实 readiness 以代码、协议和相应证据等级共同裁决。
|
||||
6. 最小文档检查为 `npm run docs:boundary`、相对链接校验和 `git diff --check`;涉及治理分类时追加 `npm run governance:legacy-report`。
|
||||
|
||||
## 7. 版本替换索引
|
||||
|
||||
版本号不自动代表同一能力。下表只记录已经确认的替换关系;未列出的版本目录不能按名称直接删除。
|
||||
|
||||
| 历史入口 | Current replacement | 分类与边界 |
|
||||
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- |
|
||||
| `internal/roadmap/plugin/` 根旧文档、`plugin/v2/**` | [`internal/roadmap/plugin/v3/`](./internal/roadmap/plugin/v3/README.md) | 旧 Plugin 版本为 `dead / deleted`;有效包、安装、恢复和清理决策已迁入 v3。 |
|
||||
| [`internal/roadmap/images/README.md`](./internal/roadmap/images/README.md) | [`internal/roadmap/images/v2/`](./internal/roadmap/images/v2/README.md) | 旧图片路线图为 `legacy current reference`;v2 拥有确定性 Image Command Workflow 和 Media Runtime 边界。 |
|
||||
| [`internal/roadmap/Writing/`](./internal/roadmap/Writing/README.md) v1 文档 | [`internal/roadmap/Writing/v2/`](./internal/roadmap/Writing/v2/README.md) + [`writing-v2-workflow-completion-plan.md`](./internal/exec-plans/writing-v2-workflow-completion-plan.md) | v1 文档为 `legacy current reference`;v2 拥有普通 Agent turn、workflow audit 和段落级 artifact 合同。 |
|
||||
| [`internal/roadmap/knowledge/prd.md`](./internal/roadmap/knowledge/prd.md) | `internal/roadmap/knowledge/prd-v2.md` | v1 只作 legacy reference,Knowledge v2 是 document-first current owner。 |
|
||||
| `internal/refactor/v1/` | 无整体替换 | v1 承接 Runtime/App Server 对齐主线,v2 只承接 Renderer projection;两者是不同 owner,不能按版本号删除 v1。 |
|
||||
|
||||
## 8. 详细事实源
|
||||
|
||||
- [文档导航](./internal/aiprompts/README.md)
|
||||
- [项目概览](./internal/aiprompts/overview.md)
|
||||
- [全局架构图](./internal/aiprompts/architecture.md)
|
||||
- [Desktop Host 与 App Server 命令边界](./internal/aiprompts/commands.md)
|
||||
- [治理规则](./internal/aiprompts/governance.md)
|
||||
- [工程质量工作流](./internal/aiprompts/quality-workflow.md)
|
||||
- [Workspace 领域边界](./internal/aiprompts/workspace.md)
|
||||
- [Provider 系统](./internal/aiprompts/providers.md)
|
||||
- [MCP](./internal/aiprompts/mcp.md)
|
||||
- [Remote runtime](./internal/aiprompts/remote-runtime.md)
|
||||
- [状态、历史与遥测](./internal/aiprompts/state-history-telemetry.md)
|
||||
|
||||
本文件只维护能力导航。任何与当前构建图、协议或领域事实源冲突的描述,应直接修正或删除,不能通过新增兼容解释继续保留。
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
Full-stack AI agent for coding, files, terminals, tools, research, content, multimodal work, and multi-agent workflows worldwide.
|
||||
|
||||
[简体中文](./README.zh-CN.md) · **English** · [Docs](./docs/README.md) · [Release Notes](./RELEASE_NOTES.en.md) · [Issues](https://github.com/limecloud/lime/issues)
|
||||
[简体中文](./README.zh-CN.md) · **English** · [Feature Map](./FEATURE-MAP.md) · [Docs](./docs/README.md) · [Release Notes](./RELEASE_NOTES.en.md) · [Issues](https://github.com/limecloud/lime/issues)
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/limecloud/lime/releases"><img src="https://img.shields.io/github/v/release/limecloud/lime?label=release" alt="Lime GitHub Release" /></a>
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@
|
||||
|
||||
代码、文件、终端、工具、研究、内容、多模态和多 Agent 协作,都在同一个可恢复的任务空间里完成。
|
||||
|
||||
[English](./README.md) · **简体中文** · [文档](./docs/README.md) · [发布记录](./RELEASE_NOTES.md) · [问题反馈](https://github.com/limecloud/lime/issues)
|
||||
[English](./README.md) · **简体中文** · [功能地图](./FEATURE-MAP.md) · [文档](./docs/README.md) · [发布记录](./RELEASE_NOTES.md) · [问题反馈](https://github.com/limecloud/lime/issues)
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/limecloud/lime/releases"><img src="https://img.shields.io/github/v/release/limecloud/lime?label=release" alt="Lime GitHub Release" /></a>
|
||||
|
||||
+21
-24
@@ -1,42 +1,39 @@
|
||||
## Lime v1.138.0
|
||||
## Lime v1.139.0
|
||||
|
||||
Simplified Chinese release notes are the primary version.
|
||||
|
||||
### New Features
|
||||
|
||||
- Added a unified Composer Controller so the home and conversation composers share structured drafts, submit intents, history recall, and start, queue, steer, and interrupt routing.
|
||||
- Added persistent App Server `promptHistory/read|append` history with cross-process JSONL paging, file locking, malformed-row tolerance, and cross-platform log identity.
|
||||
- Added a Desktop capability/readiness contract, a macOS native helper, and security-scoped bookmark lifecycle support for permissions, Launch Services, displays, HID, device keys, and packaged-resource status.
|
||||
- Added a cross-platform desktop resource manifest covering App Server, Code Mode, Windows sandbox helpers, and the macOS native host with identity, architecture, and SHA-256 verification.
|
||||
- Added a repository-level `FEATURE-MAP.md` organized by user capability, stable entry point, current owner, and protocol boundary across Agent, Workspace, Provider, MCP, Skills, Plugins, Memory, Artifact, Scheduled Tasks, and Desktop Host.
|
||||
- Expanded the macOS native host and Windows packaged evidence for window orchestration, permissions, resource identity, Squirrel installed-state checks, and real Electron/App Server Gate B evidence.
|
||||
- Completed model-provider reasoning-effort and provider-route contracts so capability, defaults, switching, readiness, and reasoning levels share one control plane.
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fixed home warm-up writing the production local override too early, which made the routing owner clear the active draft, hide the Banner/skin Hero, and prevent send from reusing the warmed session; warm-up now only prepares the session and routing changes at commit time.
|
||||
- Fixed the official Agnes `agnes-2.5-pro` endpoint being treated as a non-executable custom model; unknown endpoints remain fail closed.
|
||||
- Fixed Composer production-bundle initialization order, asynchronous history merging, failed-draft retention, and large-paste expansion boundaries.
|
||||
- Fixed drift in queued-thread actions, model restoration, reasoning projection, and narrow-window Header and Timeline layouts.
|
||||
- Fixed the Resource Manager production path dynamically loading a test-only window fixture; close now uses the current window semantics directly.
|
||||
- Removed CORS access for `tauri://localhost` and `tauri.localhost`, retaining only current local development origins.
|
||||
- Fixed source-of-truth drift across Curated Task references, Memory continuation, model configuration, and provider routing.
|
||||
|
||||
### Improvements and Refactoring
|
||||
|
||||
- Converged Composer, prompt history, Desktop capabilities, and resource integrity on single current owners without adding an Electron business backend or Renderer persistence source.
|
||||
- Aligned the current Codex reasoning policy with `persistent` effort, five-locale selector copy, and source-of-truth guards for model context and tool policy.
|
||||
- Strengthened the Windows Squirrel release path with an installed Code Mode Gate B that verifies the `Lime.exe -> app-server.exe -> code-mode-host.exe` process chain.
|
||||
- Updated DeepSWE adapter contracts and governance assertions to prevent fixture manifests from drifting from current owners.
|
||||
|
||||
### Testing and Quality
|
||||
|
||||
- Expanded App Server protocol/schema/generated-client, Composer, prompt-history, Desktop Host, macOS native-host, resource-manifest, Windows Squirrel, and Code Mode Gate B regressions.
|
||||
- Release validation covers version consistency, TypeScript, protocol contracts, affected frontend/Rust tests, real Electron GUI smoke, and release-workflow guards.
|
||||
- Windows packaged Gate B evidence is produced by the `windows-2022` release workflow; local static tests are not presented as a Windows platform pass.
|
||||
- Fully retired SceneApp and `src-tauri`: the app directory now belongs to Plugin, business calls use Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore / Agent Runtime, and result references belong to Curated Task and Memory.
|
||||
- Removed Tauri capabilities/schemas plus SceneApp-specific components, hooks, gateways, copy, and positive tests; legacy names remain only in negative restoration guards and historical evidence.
|
||||
- Updated current Rust crates to use host-neutral or App Server/Desktop Host terminology instead of in-process desktop commands, Tauri state wrappers, and the former root-crate narrative.
|
||||
|
||||
### Documentation
|
||||
|
||||
- Updated the global architecture, Codex GUI alignment plan, and Desktop platform parity plan with current owners, capability matrices, evidence levels, and remaining platform gaps.
|
||||
- Added the v1.138.0 release execution plan with candidate scope, excluded Codex build references, validation, and release closeout steps.
|
||||
- Added a Lime-specific Feature Map based on this product and architecture rather than copying the reference project's capability structure.
|
||||
- Removed superseded release plans, Plugin v1/v2 documents, old refactor material, iteration notes, and phase research while updating current navigation and architecture sources.
|
||||
- Removed 98 Markdown files, 1 HTML file, 4 JSON files, and 16 legacy frontend source/test files. The unowned A2UI/Tauri design was retired, while still-current documentation now points to Electron Desktop Host and App Server boundaries. Git history, Release Notes, and immutable evidence retain historical traceability.
|
||||
|
||||
### Testing and Quality
|
||||
|
||||
- Expanded App Server contract, Desktop Host, macOS native-host, Windows packaged-evidence, model-provider, Curated Task, Memory, and governance regressions.
|
||||
- Release gates cover version consistency, TypeScript, i18n, protocol contracts, related Rust tests, documentation boundaries, governance scans, real Electron GUI smoke, and resumable full frontend tests.
|
||||
|
||||
### Other
|
||||
|
||||
- Bumped the root app, CLI npm package, Rust workspace, and Cargo.lock versions to `1.138.0`.
|
||||
- The live Codex Desktop visual baseline remains blocked by macOS AppleEvent permissions; the home Banner and skin Hero remain an explicit product exception.
|
||||
- Bumped the root app, CLI npm package, Rust workspace, and Cargo.lock versions to `1.139.0`.
|
||||
- Added no compat or deprecated owner; SceneApp, `src-tauri`, Tauri capabilities, and the test-only window fixture are `dead / deleted / forbidden-to-restore`.
|
||||
|
||||
**Full changes**: `v1.137.0` -> `v1.138.0`
|
||||
**Full changes**: `v1.138.0` -> `v1.139.0`
|
||||
|
||||
+21
-24
@@ -1,40 +1,37 @@
|
||||
## Lime v1.138.0
|
||||
## Lime v1.139.0
|
||||
|
||||
### 新功能
|
||||
|
||||
- 新增统一 Composer Controller,首页与会话输入栏共享结构化草稿、提交意图、历史召回以及 start、queue、steer、interrupt 路由语义。
|
||||
- 新增 App Server `promptHistory/read|append` 持久化历史,提供跨进程 JSONL 分页、文件锁、坏行容错和跨平台日志身份。
|
||||
- 新增 Desktop capability/readiness 合同、macOS 原生 helper 与 security-scoped bookmark 生命周期,覆盖权限、Launch Services、显示器、HID、设备密钥和打包资源状态。
|
||||
- 新增跨平台 desktop resource manifest,将 App Server、Code Mode、Windows sandbox helpers 和 macOS native host 纳入统一身份、架构及 SHA-256 校验。
|
||||
- 新增仓库级 `FEATURE-MAP.md`,按用户能力、稳定入口、current owner 与协议边界导航 Agent、Workspace、Provider、MCP、Skills、Plugins、Memory、Artifact、Scheduled Tasks 和 Desktop Host。
|
||||
- 扩展 macOS native host 与 Windows packaged evidence,覆盖窗口编排、权限、资源身份、Squirrel 安装态和真实 Electron/App Server Gate B 证据。
|
||||
- 补齐 model-provider reasoning effort 与 provider route 合同,让模型能力、默认选择、切换、readiness 和推理档位继续收敛到统一控制面。
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复首页预热阶段过早写入正式 local override,导致路由 owner 清空 active draft、Banner/皮肤 Hero 消失且发送无法复用预热 session 的问题;预热现在只准备 session,正式提交时才接管路由。
|
||||
- 修复 Agnes 官方 `agnes-2.5-pro` endpoint 被识别为不可执行自定义模型的问题,未知 endpoint 继续 fail closed。
|
||||
- 修复 Composer 压缩 bundle 的初始化时序、异步历史合并、失败草稿保留和大粘贴展开边界。
|
||||
- 修复线程排队操作、模型恢复、reasoning 状态投影以及窄窗口 Header/Timeline 布局中的漂移和可用性问题。
|
||||
- 修复资源管理器生产路径动态加载测试窗口夹具的问题,关闭行为直接使用当前窗口语义。
|
||||
- 移除服务端对 `tauri://localhost` 与 `tauri.localhost` 的 CORS 放行,只保留当前本地开发入口。
|
||||
- 修复 Curated Task 结果参考、Memory continuation、模型配置和 provider route 中的事实源漂移。
|
||||
|
||||
### 优化与重构
|
||||
|
||||
- 将 Composer、prompt history、Desktop capability 和资源完整性分别收敛到唯一 current owner,不新增 Electron 业务后端或 Renderer 持久化事实源。
|
||||
- 对齐 Codex current reasoning policy,补齐 `persistent` effort、五语言选择器文案以及模型上下文和工具策略的事实源守卫。
|
||||
- 强化 Windows Squirrel 发布链,安装后执行 Code Mode Gate B 并验证 `Lime.exe -> app-server.exe -> code-mode-host.exe` 进程链。
|
||||
- 更新 DeepSWE adapter 契约与治理断言,避免测试清单和 current owner 版本漂移。
|
||||
|
||||
### 测试与质量
|
||||
|
||||
- 扩展 App Server protocol/schema/generated client、Composer、prompt history、Desktop Host、macOS native host、资源 manifest、Windows Squirrel 与 Code Mode Gate B 回归。
|
||||
- 发布门禁覆盖版本一致性、TypeScript、协议 contracts、受影响前端/Rust 测试、真实 Electron GUI smoke 和 release workflow guard。
|
||||
- Windows packaged Gate B 由 `windows-2022` release workflow 生成平台证据;本地静态测试不冒充 Windows platform pass。
|
||||
- SceneApp 与 `src-tauri` 全面退役:应用目录统一归 Plugin,业务调用统一进入 Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore / Agent Runtime,结果参考统一归 Curated Task 与 Memory。
|
||||
- 删除 Tauri capability/schema、SceneApp 专属组件、Hook、网关、文案和正向测试;旧名称只保留在负向回流守卫与历史 evidence。
|
||||
- 收敛 Rust current crate 的宿主边界表述,移除旧进程内桌面命令、Tauri 状态包装和历史主 crate 叙事。
|
||||
|
||||
### 文档
|
||||
|
||||
- 更新全局架构、Codex GUI 对齐计划和 Desktop 平台对齐计划,记录 current owner、能力矩阵、证据等级与剩余平台缺口。
|
||||
- 新增 v1.138.0 发布执行计划,明确候选范围、排除的 Codex 构建参考文件、验证和发布收口步骤。
|
||||
- 以 Lime 自身产品和架构重写 Feature Map,不复制参考项目的能力结构。
|
||||
- 清理被 current owner 替代的历史发布计划、Plugin v1/v2、旧 refactor、iteration notes 和阶段性研究材料,并同步更新导航与架构文档。
|
||||
- 本次共删除 98 份 Markdown、1 份 HTML、4 份 JSON 和 16 份旧前端源码/测试;无消费者的旧 A2UI/Tauri 设计一并清退,仍有 current 价值的文档统一改写到 Electron Desktop Host 与 App Server 边界。Git history、Release Notes 与不可变 evidence 承接历史追溯。
|
||||
|
||||
### 测试与质量
|
||||
|
||||
- 扩展 App Server contracts、Desktop Host、macOS native host、Windows packaged evidence、model-provider、Curated Task、Memory 和治理回归。
|
||||
- 发布门禁覆盖版本一致性、TypeScript、i18n、协议 contracts、Rust 相关测试、文档边界、治理扫描、真实 Electron GUI smoke 与完整前端续跑。
|
||||
|
||||
### 其他
|
||||
|
||||
- 将根应用、CLI npm 包、Rust workspace 与 Cargo.lock 版本统一提升到 `1.138.0`。
|
||||
- Codex Desktop 实时视觉基线仍受 macOS AppleEvent 权限阻塞;首页 Banner/皮肤 Hero 按产品裁决保留,不纳入对齐。
|
||||
- 将根应用、CLI npm 包、Rust workspace 与 Cargo.lock 版本统一提升到 `1.139.0`。
|
||||
- 不新增 compat 或 deprecated owner;SceneApp、`src-tauri`、Tauri capability 与测试窗口夹具均为 `dead / deleted / forbidden-to-restore`。
|
||||
|
||||
**完整变更**: `v1.137.0` -> `v1.138.0`
|
||||
**完整变更**: `v1.138.0` -> `v1.139.0`
|
||||
|
||||
@@ -8,7 +8,7 @@ navigation:
|
||||
# 模型连接概览
|
||||
|
||||
::alert{type="info"}
|
||||
Provider 文档正在按 LimeNext V2 current 连接入口重建。
|
||||
Provider 文档正在按当前 `model-provider` 与 App Server 连接入口重建;不要从历史 LimeNext 路线图推断配置协议。
|
||||
::
|
||||
|
||||
旧版按单个 Provider 拆分、并以 `credential_pool:` / `routing:` YAML 为主的配置页已下线,避免继续传播已经偏离 current UI 的旧配置方式。
|
||||
|
||||
@@ -47,7 +47,10 @@ function setResourcesPath(resourcesPath: string): void {
|
||||
});
|
||||
}
|
||||
|
||||
function createNativeHostFixture(script: string): string {
|
||||
function createNativeHostFixture(
|
||||
script: string,
|
||||
protocolVersion?: number,
|
||||
): string {
|
||||
const root = mkdtempSync(path.join(tmpdir(), "lime-macos-native-host-"));
|
||||
tempRoots.push(root);
|
||||
const helperPath = path.join(root, "native", "macos-native-host");
|
||||
@@ -80,6 +83,7 @@ function createNativeHostFixture(script: string): string {
|
||||
helper: {
|
||||
id: "macos-native-host",
|
||||
path: "native/macos-native-host",
|
||||
...(protocolVersion === undefined ? {} : { protocolVersion }),
|
||||
bundleIdentifier: "com.limecloud.lime.native-host",
|
||||
signedByForge: false,
|
||||
},
|
||||
@@ -89,11 +93,14 @@ function createNativeHostFixture(script: string): string {
|
||||
return root;
|
||||
}
|
||||
|
||||
function createClient(script: string): {
|
||||
function createClient(
|
||||
script: string,
|
||||
protocolVersion?: number,
|
||||
): {
|
||||
client: MacOSNativeHostClient;
|
||||
root: string;
|
||||
} {
|
||||
const root = createNativeHostFixture(script);
|
||||
const root = createNativeHostFixture(script, protocolVersion);
|
||||
setResourcesPath(root);
|
||||
return { client: new MacOSNativeHostClient(), root };
|
||||
}
|
||||
@@ -184,6 +191,77 @@ describe("MacOSNativeHostClient", () => {
|
||||
client.dispose();
|
||||
});
|
||||
|
||||
it("打包 helper 声明协议版本时先完成身份握手且只握手一次", async () => {
|
||||
const { client } = createClient(
|
||||
`
|
||||
const readline = require("node:readline");
|
||||
const rl = readline.createInterface({ input: process.stdin });
|
||||
let handshakes = 0;
|
||||
rl.on("line", (line) => {
|
||||
const request = JSON.parse(line);
|
||||
if (request.method === "capabilities.read") {
|
||||
handshakes += 1;
|
||||
process.stdout.write(JSON.stringify({
|
||||
id: request.id,
|
||||
ok: true,
|
||||
result: {
|
||||
protocolVersion: 1,
|
||||
helperId: "macos-native-host",
|
||||
platform: "darwin",
|
||||
applicationId: "com.limecloud.lime.native-host",
|
||||
},
|
||||
}) + "\\n");
|
||||
return;
|
||||
}
|
||||
process.stdout.write(JSON.stringify({
|
||||
id: request.id,
|
||||
ok: true,
|
||||
result: { method: request.method, handshakes },
|
||||
}) + "\\n");
|
||||
});
|
||||
`,
|
||||
1,
|
||||
);
|
||||
|
||||
await expect(client.invoke({ method: "test.echo" })).resolves.toEqual({
|
||||
method: "test.echo",
|
||||
handshakes: 1,
|
||||
});
|
||||
await expect(client.invoke({ method: "test.echo" })).resolves.toEqual({
|
||||
method: "test.echo",
|
||||
handshakes: 1,
|
||||
});
|
||||
client.dispose();
|
||||
});
|
||||
|
||||
it("打包 helper 握手身份漂移时 fail closed", async () => {
|
||||
const { client } = createClient(
|
||||
`
|
||||
const readline = require("node:readline");
|
||||
const rl = readline.createInterface({ input: process.stdin });
|
||||
rl.on("line", (line) => {
|
||||
const request = JSON.parse(line);
|
||||
process.stdout.write(JSON.stringify({
|
||||
id: request.id,
|
||||
ok: true,
|
||||
result: {
|
||||
protocolVersion: 99,
|
||||
helperId: "foreign-helper",
|
||||
platform: "darwin",
|
||||
applicationId: "com.openai.codex.native-host",
|
||||
},
|
||||
}) + "\\n");
|
||||
});
|
||||
`,
|
||||
1,
|
||||
);
|
||||
|
||||
await expect(client.invoke({ method: "test.echo" })).rejects.toMatchObject({
|
||||
code: "protocol_mismatch",
|
||||
});
|
||||
client.dispose();
|
||||
});
|
||||
|
||||
it("请求超时后清理 pending 状态", async () => {
|
||||
vi.useFakeTimers();
|
||||
const { client } = createClient(`
|
||||
@@ -253,7 +331,10 @@ describe("MacOSNativeHostClient", () => {
|
||||
).resolves.toEqual({ targets: [{ bundleId: "com.apple.finder" }] });
|
||||
await expect(
|
||||
client.invoke({ method: "appleEvents.openSettings" }),
|
||||
).resolves.toEqual({ method: "appleEvents.openSettings", askedUser: false });
|
||||
).resolves.toEqual({
|
||||
method: "appleEvents.openSettings",
|
||||
askedUser: false,
|
||||
});
|
||||
client.dispose();
|
||||
});
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import { app } from "./electronRuntime";
|
||||
const RESOURCE_MANIFEST = "desktop-resources.manifest.json";
|
||||
const RESOURCE_SCHEMA_VERSION = 1;
|
||||
const RESOURCE_APPLICATION_ID = "com.limecloud.lime";
|
||||
const NATIVE_HOST_PROTOCOL_VERSION = 1;
|
||||
const REQUEST_TIMEOUT_MS = 10_000;
|
||||
|
||||
export type MacOSNativeHostRequest = {
|
||||
@@ -42,8 +43,15 @@ type NativeHostResponse = {
|
||||
error?: { code?: string; message?: string; data?: unknown };
|
||||
};
|
||||
|
||||
type MacOSNativeHostDescriptor = {
|
||||
path: string;
|
||||
protocolVersion?: number;
|
||||
};
|
||||
|
||||
export class MacOSNativeHostClient {
|
||||
#child: ChildProcessWithoutNullStreams | null = null;
|
||||
#ready: Promise<void> | null = null;
|
||||
#readyChild: ChildProcessWithoutNullStreams | null = null;
|
||||
#stdoutBuffer = "";
|
||||
#nextRequestId = 1;
|
||||
readonly #pending = new Map<string, PendingRequest>();
|
||||
@@ -64,14 +72,23 @@ export class MacOSNativeHostClient {
|
||||
"macOS native host is only available on macOS.",
|
||||
);
|
||||
}
|
||||
const helperPath = resolveMacOSNativeHostPath();
|
||||
if (!helperPath) {
|
||||
const descriptor = resolveMacOSNativeHostDescriptor();
|
||||
if (!descriptor) {
|
||||
throw new NativeHostError(
|
||||
"unavailable",
|
||||
"macOS native host resource is missing or failed integrity verification.",
|
||||
);
|
||||
}
|
||||
const child = this.#ensureChild(helperPath);
|
||||
const child = this.#ensureChild(descriptor.path);
|
||||
await this.#ensureReady(child, descriptor.protocolVersion);
|
||||
return await this.#invoke(child, method, params);
|
||||
}
|
||||
|
||||
async #invoke(
|
||||
child: ChildProcessWithoutNullStreams,
|
||||
method: string,
|
||||
params: Record<string, unknown>,
|
||||
): Promise<unknown> {
|
||||
const id = String(this.#nextRequestId++);
|
||||
return await new Promise((resolve, reject) => {
|
||||
const timer = setTimeout(() => {
|
||||
@@ -100,6 +117,8 @@ export class MacOSNativeHostClient {
|
||||
dispose(): void {
|
||||
const child = this.#child;
|
||||
this.#child = null;
|
||||
this.#ready = null;
|
||||
this.#readyChild = null;
|
||||
if (child && !child.killed) {
|
||||
child.kill();
|
||||
}
|
||||
@@ -123,17 +142,59 @@ export class MacOSNativeHostClient {
|
||||
child.stderr.on("data", () => undefined);
|
||||
child.once("error", (error) => {
|
||||
this.#child = null;
|
||||
this.#ready = null;
|
||||
this.#readyChild = null;
|
||||
this.#settleAllFailure(error);
|
||||
});
|
||||
child.once("exit", () => {
|
||||
if (this.#child === child) {
|
||||
this.#child = null;
|
||||
}
|
||||
if (this.#readyChild === child) {
|
||||
this.#ready = null;
|
||||
this.#readyChild = null;
|
||||
}
|
||||
this.#settleAllFailure(new Error("macOS native host exited"));
|
||||
});
|
||||
return child;
|
||||
}
|
||||
|
||||
async #ensureReady(
|
||||
child: ChildProcessWithoutNullStreams,
|
||||
protocolVersion?: number,
|
||||
): Promise<void> {
|
||||
if (protocolVersion !== NATIVE_HOST_PROTOCOL_VERSION) {
|
||||
return;
|
||||
}
|
||||
if (this.#readyChild === child && this.#ready) {
|
||||
return await this.#ready;
|
||||
}
|
||||
this.#readyChild = child;
|
||||
this.#ready = this.#invoke(child, "capabilities.read", {}).then((value) => {
|
||||
const capabilities = toRecord(value);
|
||||
if (
|
||||
capabilities?.protocolVersion !== NATIVE_HOST_PROTOCOL_VERSION ||
|
||||
capabilities.helperId !== "macos-native-host" ||
|
||||
capabilities.platform !== "darwin" ||
|
||||
capabilities.applicationId !== `${RESOURCE_APPLICATION_ID}.native-host`
|
||||
) {
|
||||
throw new NativeHostError(
|
||||
"protocol_mismatch",
|
||||
"macOS native host readiness handshake did not match the packaged helper identity.",
|
||||
{ expectedProtocolVersion: NATIVE_HOST_PROTOCOL_VERSION },
|
||||
);
|
||||
}
|
||||
});
|
||||
try {
|
||||
await this.#ready;
|
||||
} catch (error) {
|
||||
if (this.#child === child && !child.killed) {
|
||||
child.kill();
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
#consumeStdout(chunk: string): void {
|
||||
this.#stdoutBuffer += chunk;
|
||||
while (true) {
|
||||
@@ -223,6 +284,10 @@ export class NativeHostError extends Error {
|
||||
}
|
||||
|
||||
export function resolveMacOSNativeHostPath(): string | null {
|
||||
return resolveMacOSNativeHostDescriptor()?.path ?? null;
|
||||
}
|
||||
|
||||
function resolveMacOSNativeHostDescriptor(): MacOSNativeHostDescriptor | null {
|
||||
if (process.platform !== "darwin") {
|
||||
return null;
|
||||
}
|
||||
@@ -251,6 +316,7 @@ export function resolveMacOSNativeHostPath(): string | null {
|
||||
helper?: {
|
||||
id?: string;
|
||||
path?: string;
|
||||
protocolVersion?: number;
|
||||
signedByForge?: boolean;
|
||||
bundlePath?: string;
|
||||
bundleIdentifier?: string;
|
||||
@@ -322,12 +388,18 @@ export function resolveMacOSNativeHostPath(): string | null {
|
||||
}
|
||||
if (digest === resource?.sha256) {
|
||||
if (manifest.native?.helper?.signedByForge !== true) {
|
||||
return helperPath;
|
||||
return {
|
||||
path: helperPath,
|
||||
protocolVersion: helperMetadata.protocolVersion,
|
||||
};
|
||||
}
|
||||
execFileSync("codesign", ["--verify", "--strict", signaturePath], {
|
||||
stdio: "ignore",
|
||||
});
|
||||
return helperPath;
|
||||
return {
|
||||
path: helperPath,
|
||||
protocolVersion: helperMetadata.protocolVersion,
|
||||
};
|
||||
}
|
||||
if (manifest.native?.helper?.signedByForge !== true) {
|
||||
return null;
|
||||
@@ -335,7 +407,10 @@ export function resolveMacOSNativeHostPath(): string | null {
|
||||
execFileSync("codesign", ["--verify", "--strict", signaturePath], {
|
||||
stdio: "ignore",
|
||||
});
|
||||
return helperPath;
|
||||
return {
|
||||
path: helperPath,
|
||||
protocolVersion: helperMetadata.protocolVersion,
|
||||
};
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
@@ -356,3 +431,9 @@ function resolveManifestRelativePath(resourcesRoot: string, value?: string) {
|
||||
? resolved
|
||||
: null;
|
||||
}
|
||||
|
||||
function toRecord(value: unknown): Record<string, unknown> | null {
|
||||
return value && typeof value === "object" && !Array.isArray(value)
|
||||
? (value as Record<string, unknown>)
|
||||
: null;
|
||||
}
|
||||
|
||||
@@ -109,6 +109,8 @@ func readCapabilities() -> [String: Any] {
|
||||
"reason": "The native host API is available; packaged entitlement and user authorization are reported separately.",
|
||||
]
|
||||
return [
|
||||
"protocolVersion": 1,
|
||||
"helperId": "macos-native-host",
|
||||
"platform": "darwin",
|
||||
"applicationId": bundleIdentifier,
|
||||
"accessibility": capabilityStatus(
|
||||
@@ -271,7 +273,7 @@ func setWindowOwnerVisibility(windowID: UInt32, hidden: Bool) throws -> [String:
|
||||
throw HostError.unavailable("The requested macOS window owner is no longer running.")
|
||||
}
|
||||
let alreadyHidden = application.isHidden
|
||||
let changed = alreadyHidden == hidden || (hidden ? application.hide() : application.unhide())
|
||||
let changed = alreadyHidden == hidden || setApplicationHidden(application, hidden: hidden)
|
||||
guard changed else {
|
||||
throw HostError.operationFailed("The macOS window owner visibility could not be updated.")
|
||||
}
|
||||
|
||||
@@ -69,6 +69,16 @@ private func framePayload(_ frame: CGRect) -> [String: Any] {
|
||||
]
|
||||
}
|
||||
|
||||
func setApplicationHidden(_ application: NSRunningApplication, hidden: Bool) -> Bool {
|
||||
let element = AXUIElementCreateApplication(application.processIdentifier)
|
||||
let value: CFBoolean = hidden ? kCFBooleanTrue : kCFBooleanFalse
|
||||
return AXUIElementSetAttributeValue(
|
||||
element,
|
||||
kAXHiddenAttribute as CFString,
|
||||
value
|
||||
) == .success
|
||||
}
|
||||
|
||||
func accessibilityWindowMatching(ownerPID: pid_t, frame: CGRect) throws -> AXUIElement {
|
||||
guard AXIsProcessTrusted() else {
|
||||
throw HostError.notGranted("macOS Accessibility permission is required for window control.")
|
||||
@@ -244,7 +254,9 @@ func startHideForTask(taskID: String, windowIDs: [UInt32]) throws -> [String: An
|
||||
if originalVisibility[ownerPID] == nil {
|
||||
originalVisibility[ownerPID] = application.isHidden
|
||||
if !application.isHidden {
|
||||
guard application.hide() else {
|
||||
_ = application.activate(options: [.activateIgnoringOtherApps])
|
||||
RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.1))
|
||||
guard setApplicationHidden(application, hidden: true) else {
|
||||
throw HostError.operationFailed("The macOS window owner could not be hidden for the task.")
|
||||
}
|
||||
changedApplications.append(application)
|
||||
@@ -280,7 +292,7 @@ func stopHideForTask(taskID: String) throws -> [String: Any] {
|
||||
guard let application = NSRunningApplication(processIdentifier: ownerPID) else {
|
||||
continue
|
||||
}
|
||||
let success = wasHidden ? application.hide() : application.unhide()
|
||||
let success = setApplicationHidden(application, hidden: wasHidden)
|
||||
if success {
|
||||
restoredCount += 1
|
||||
}
|
||||
|
||||
@@ -18,10 +18,15 @@ import path from "node:path";
|
||||
import type { BrowserWindow } from "./electronRuntime";
|
||||
import {
|
||||
buildElectronSmokeSummary,
|
||||
ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY,
|
||||
ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL,
|
||||
ELECTRON_SMOKE_LAYOUT_VIEWPORTS,
|
||||
isElectronSmokeStartupUrl,
|
||||
normalizeElectronSmokeRunId,
|
||||
sanitizeElectronSmokeLocation,
|
||||
type ElectronSmokeDiagnostics,
|
||||
type ElectronSmokeLayoutEvidence,
|
||||
type ElectronSmokeLayoutViewportEvidence,
|
||||
type ElectronSmokeRendererEvidence,
|
||||
type ElectronSmokeRouteSnapshot,
|
||||
type ElectronSmokeSummary,
|
||||
@@ -74,6 +79,7 @@ interface ElectronSmokeRunner {
|
||||
const SUMMARY_FILE = "summary.json";
|
||||
const TRACE_FILE = "trace-summary.json";
|
||||
const SCREENSHOT_FILE = "settings-memory.png";
|
||||
const LAYOUT_SCREENSHOT_PREFIX = "layout";
|
||||
const LEGACY_SURFACE_CATALOG = "src/lib/governance/legacySurfaceCatalog.json";
|
||||
const EMPTY_RENDERER_EVIDENCE: ElectronSmokeRendererEvidence = {
|
||||
electron: false,
|
||||
@@ -124,6 +130,7 @@ export function createElectronSmokeRunner(
|
||||
renderer: { ...EMPTY_RENDERER_EVIDENCE },
|
||||
traceFacts: [],
|
||||
};
|
||||
let layoutEvidence: ElectronSmokeLayoutEvidence = emptyLayoutEvidence();
|
||||
let screenshotCaptured = false;
|
||||
let pageErrorsBeforeReload = 0;
|
||||
let lastSummary: ElectronSmokeSummary | null = null;
|
||||
@@ -164,6 +171,7 @@ export function createElectronSmokeRunner(
|
||||
hostAppServerProtocol,
|
||||
routes: [...routes],
|
||||
renderer: rendererCollection.renderer,
|
||||
layout: layoutEvidence,
|
||||
diagnostics: { ...diagnostics },
|
||||
artifacts: {
|
||||
summary: SUMMARY_FILE,
|
||||
@@ -249,6 +257,15 @@ export function createElectronSmokeRunner(
|
||||
});
|
||||
console.log("[electron-smoke] claw workbench shell ready after reload");
|
||||
|
||||
stage = "layout-geometry";
|
||||
layoutEvidence = await collectElectronSmokeLayoutEvidence(
|
||||
options.window,
|
||||
evidenceDir,
|
||||
);
|
||||
console.log(
|
||||
`[electron-smoke] responsive layout ready viewports=${layoutEvidence.viewports.length}`,
|
||||
);
|
||||
|
||||
stage = "settings-memory-ready";
|
||||
const memory = await waitForElectronSmokeMemorySettingsReady(
|
||||
options.window,
|
||||
@@ -514,6 +531,214 @@ async function collectRendererSmokeEvidence(
|
||||
)) as RendererSmokeCollection;
|
||||
}
|
||||
|
||||
function emptyLayoutEvidence(): ElectronSmokeLayoutEvidence {
|
||||
return {
|
||||
proofLevel: ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL,
|
||||
claimBoundary: ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY,
|
||||
viewports: [],
|
||||
screenshots: [],
|
||||
assertions: {
|
||||
expectedViewportCount: ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length,
|
||||
capturedViewportCount: 0,
|
||||
allViewportsPass: false,
|
||||
composerHeightStable: false,
|
||||
composerHeightRange: null,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function collectElectronSmokeLayoutEvidence(
|
||||
window: BrowserWindow,
|
||||
evidenceDir: string,
|
||||
): Promise<ElectronSmokeLayoutEvidence> {
|
||||
if (window.isDestroyed()) {
|
||||
throw new Error("main window was destroyed before layout geometry");
|
||||
}
|
||||
|
||||
const originalWindowSize = window.getSize();
|
||||
const viewports: ElectronSmokeLayoutViewportEvidence[] = [];
|
||||
const screenshots: string[] = [];
|
||||
mkdirSync(evidenceDir, { recursive: true });
|
||||
|
||||
try {
|
||||
for (const requested of ELECTRON_SMOKE_LAYOUT_VIEWPORTS) {
|
||||
if (window.isDestroyed()) {
|
||||
throw new Error("main window was destroyed during layout geometry");
|
||||
}
|
||||
window.setSize(requested.width, requested.height);
|
||||
await waitForElectronSmokeResizeSettled(window);
|
||||
const actualWindowSize = window.getSize();
|
||||
const viewport = await readElectronSmokeLayoutViewport(
|
||||
window,
|
||||
requested,
|
||||
{
|
||||
width: actualWindowSize[0] ?? 0,
|
||||
height: actualWindowSize[1] ?? 0,
|
||||
},
|
||||
);
|
||||
viewports.push(viewport);
|
||||
|
||||
const screenshotName = `${LAYOUT_SCREENSHOT_PREFIX}-${requested.width}x${requested.height}.png`;
|
||||
const screenshot = await window.webContents.capturePage();
|
||||
if (screenshot.isEmpty()) {
|
||||
throw new Error(
|
||||
`electron smoke layout screenshot was empty: ${screenshotName}`,
|
||||
);
|
||||
}
|
||||
writeFileSync(path.join(evidenceDir, screenshotName), screenshot.toPNG());
|
||||
screenshots.push(screenshotName);
|
||||
}
|
||||
} finally {
|
||||
if (!window.isDestroyed()) {
|
||||
window.setSize(
|
||||
originalWindowSize[0] ?? 1440,
|
||||
originalWindowSize[1] ?? 920,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const composerHeights = viewports
|
||||
.map((viewport) => viewport.nodes.inputbarCore?.rect?.height ?? null)
|
||||
.filter(
|
||||
(height): height is number => typeof height === "number" && height > 0,
|
||||
);
|
||||
const composerHeightRange =
|
||||
composerHeights.length > 0
|
||||
? Math.max(...composerHeights) - Math.min(...composerHeights)
|
||||
: null;
|
||||
const composerHeightStable =
|
||||
composerHeights.length === ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length &&
|
||||
(composerHeightRange ?? Number.POSITIVE_INFINITY) <= 64;
|
||||
const allViewportsPass =
|
||||
viewports.length === ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length &&
|
||||
viewports.every((viewport) =>
|
||||
Object.values(viewport.assertions).every(Boolean),
|
||||
);
|
||||
|
||||
return {
|
||||
proofLevel: ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL,
|
||||
claimBoundary: ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY,
|
||||
viewports,
|
||||
screenshots,
|
||||
assertions: {
|
||||
expectedViewportCount: ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length,
|
||||
capturedViewportCount: viewports.length,
|
||||
allViewportsPass,
|
||||
composerHeightStable,
|
||||
composerHeightRange,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function waitForElectronSmokeResizeSettled(
|
||||
window: BrowserWindow,
|
||||
): Promise<void> {
|
||||
await window.webContents.executeJavaScript(
|
||||
`new Promise((resolve) => {
|
||||
let previous = "";
|
||||
let stableTicks = 0;
|
||||
const startedAt = Date.now();
|
||||
const tick = () => {
|
||||
const current = window.innerWidth + "x" + window.innerHeight;
|
||||
stableTicks = current === previous ? stableTicks + 1 : 0;
|
||||
previous = current;
|
||||
if (stableTicks >= 2 || Date.now() - startedAt >= 5000) {
|
||||
resolve(current);
|
||||
return;
|
||||
}
|
||||
setTimeout(tick, 50);
|
||||
};
|
||||
tick();
|
||||
})`,
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
||||
async function readElectronSmokeLayoutViewport(
|
||||
window: BrowserWindow,
|
||||
requested: { width: number; height: number },
|
||||
actualWindowSize: { width: number; height: number },
|
||||
): Promise<ElectronSmokeLayoutViewportEvidence> {
|
||||
return (await window.webContents.executeJavaScript(
|
||||
`(() => {
|
||||
const requested = ${JSON.stringify(requested)};
|
||||
const windowSize = ${JSON.stringify(actualWindowSize)};
|
||||
const viewport = { width: window.innerWidth, height: window.innerHeight };
|
||||
const documentSize = {
|
||||
scrollWidth: Math.max(document.documentElement?.scrollWidth || 0, document.body?.scrollWidth || 0),
|
||||
scrollHeight: Math.max(document.documentElement?.scrollHeight || 0, document.body?.scrollHeight || 0),
|
||||
};
|
||||
const specs = [
|
||||
{ key: "workspaceShell", testId: "workspace-shell-scene", selector: '[data-testid="workspace-shell-scene"]', required: true },
|
||||
{ key: "workspaceMainArea", testId: "workspace-main-area", selector: '[data-testid="workspace-main-area"]', required: true },
|
||||
{ key: "inputbarCore", testId: "inputbar-core-container", selector: '[data-testid="inputbar-core-container"]', required: true },
|
||||
{ key: "composerInput", testId: "agent-chat-message", selector: 'textarea[name="agent-chat-message"]', required: true },
|
||||
{ key: "messageListColumn", testId: "message-list-column", selector: '[data-testid="message-list-column"]', required: false },
|
||||
{ key: "emptyStateFirstScreen", testId: "empty-state-first-screen", selector: '[data-testid="empty-state-first-screen"]', required: false },
|
||||
{ key: "threadHeader", testId: "thread-workspace-header", selector: '[data-testid="thread-workspace-header"]', required: false },
|
||||
{ key: "threadHeaderTitle", testId: "thread-workspace-header-title", selector: '[data-testid="thread-workspace-header-title"]', required: false },
|
||||
{ key: "threadHeaderActions", testId: "thread-workspace-header-actions", selector: '[data-testid="thread-workspace-header-actions"]', required: false },
|
||||
];
|
||||
const visible = (element) => {
|
||||
if (!element) return false;
|
||||
const rect = element.getBoundingClientRect();
|
||||
const style = window.getComputedStyle(element);
|
||||
return rect.width > 0 && rect.height > 0 && style.display !== "none" && style.visibility !== "hidden";
|
||||
};
|
||||
const nodeEvidence = (spec) => {
|
||||
const element = document.querySelector(spec.selector);
|
||||
const rect = element?.getBoundingClientRect();
|
||||
const normalizedRect = rect ? {
|
||||
x: Number(rect.x.toFixed(2)),
|
||||
y: Number(rect.y.toFixed(2)),
|
||||
width: Number(rect.width.toFixed(2)),
|
||||
height: Number(rect.height.toFixed(2)),
|
||||
right: Number(rect.right.toFixed(2)),
|
||||
bottom: Number(rect.bottom.toFixed(2)),
|
||||
} : null;
|
||||
const isVisible = visible(element);
|
||||
const withinViewport = Boolean(
|
||||
normalizedRect &&
|
||||
normalizedRect.x >= -1 &&
|
||||
normalizedRect.y >= -1 &&
|
||||
normalizedRect.right <= viewport.width + 1 &&
|
||||
normalizedRect.bottom <= viewport.height + 1,
|
||||
);
|
||||
return {
|
||||
testId: spec.testId,
|
||||
present: Boolean(element),
|
||||
visible: isVisible,
|
||||
rect: normalizedRect,
|
||||
withinViewport,
|
||||
required: spec.required,
|
||||
};
|
||||
};
|
||||
const nodes = Object.fromEntries(specs.map((spec) => [spec.key, nodeEvidence(spec)]));
|
||||
const requiredNodes = specs.filter((spec) => spec.required).map((spec) => nodes[spec.key]);
|
||||
const header = nodes.threadHeader;
|
||||
const title = nodes.threadHeaderTitle;
|
||||
const actions = nodes.threadHeaderActions;
|
||||
const headerActionsDoNotOverlap = !header.present || !title.present || !actions.present ||
|
||||
(title.rect && actions.rect ? title.rect.right <= actions.rect.left + 1 : false);
|
||||
const contentSurfacePresent = Boolean(
|
||||
(nodes.messageListColumn.present && nodes.messageListColumn.visible) ||
|
||||
(nodes.emptyStateFirstScreen.present && nodes.emptyStateFirstScreen.visible),
|
||||
);
|
||||
const assertions = {
|
||||
windowSizeMatchesRequest: Math.abs(windowSize.width - requested.width) <= 2 && Math.abs(windowSize.height - requested.height) <= 2,
|
||||
requiredNodesVisible: requiredNodes.every((node) => node.present && node.visible),
|
||||
requiredNodesWithinViewport: requiredNodes.every((node) => node.withinViewport),
|
||||
contentSurfacePresent,
|
||||
noHorizontalOverflow: documentSize.scrollWidth <= viewport.width + 1,
|
||||
headerTitleVisible: !header.present || (title.present && title.visible),
|
||||
headerActionsDoNotOverlap,
|
||||
};
|
||||
return { requested, window: windowSize, viewport, document: documentSize, nodes, assertions };
|
||||
})()`,
|
||||
true,
|
||||
)) as ElectronSmokeLayoutViewportEvidence;
|
||||
}
|
||||
|
||||
async function waitForElectronSmokeWorkbenchReady(
|
||||
window: BrowserWindow,
|
||||
): Promise<WorkbenchSmokeSnapshot> {
|
||||
|
||||
@@ -1,12 +1,84 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
buildElectronSmokeSummary,
|
||||
ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY,
|
||||
ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL,
|
||||
ELECTRON_SMOKE_LAYOUT_VIEWPORTS,
|
||||
isElectronSmokeStartupUrl,
|
||||
normalizeElectronSmokeRunId,
|
||||
sanitizeElectronSmokeLocation,
|
||||
type ElectronSmokeLayoutEvidence,
|
||||
type ElectronSmokeSummaryInput,
|
||||
} from "./smokeEvidence";
|
||||
|
||||
function passingLayout(): ElectronSmokeLayoutEvidence {
|
||||
const rect = {
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: 100,
|
||||
height: 100,
|
||||
right: 100,
|
||||
bottom: 100,
|
||||
};
|
||||
const nodes = Object.fromEntries(
|
||||
[
|
||||
["workspaceShell", "workspace-shell-scene", true],
|
||||
["workspaceMainArea", "workspace-main-area", true],
|
||||
["inputbarCore", "inputbar-core-container", true],
|
||||
["composerInput", "agent-chat-message", true],
|
||||
["messageListColumn", "message-list-column", false],
|
||||
["emptyStateFirstScreen", "empty-state-first-screen", true],
|
||||
["threadHeader", "thread-workspace-header", false],
|
||||
["threadHeaderTitle", "thread-workspace-header-title", false],
|
||||
["threadHeaderActions", "thread-workspace-header-actions", false],
|
||||
].map(([key, testId, required]) => [
|
||||
key,
|
||||
{
|
||||
testId,
|
||||
present: true,
|
||||
visible: true,
|
||||
required,
|
||||
rect,
|
||||
withinViewport: true,
|
||||
},
|
||||
]),
|
||||
) as ElectronSmokeLayoutEvidence["viewports"][number]["nodes"];
|
||||
const viewports = ELECTRON_SMOKE_LAYOUT_VIEWPORTS.map((requested) => ({
|
||||
requested,
|
||||
window: requested,
|
||||
viewport: requested,
|
||||
document: {
|
||||
scrollWidth: requested.width,
|
||||
scrollHeight: requested.height,
|
||||
},
|
||||
nodes,
|
||||
assertions: {
|
||||
windowSizeMatchesRequest: true,
|
||||
requiredNodesVisible: true,
|
||||
requiredNodesWithinViewport: true,
|
||||
contentSurfacePresent: true,
|
||||
noHorizontalOverflow: true,
|
||||
headerTitleVisible: true,
|
||||
headerActionsDoNotOverlap: true,
|
||||
},
|
||||
}));
|
||||
return {
|
||||
proofLevel: ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL,
|
||||
claimBoundary: ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY,
|
||||
viewports,
|
||||
screenshots: ELECTRON_SMOKE_LAYOUT_VIEWPORTS.map(
|
||||
({ width, height }) => `layout-${width}x${height}.png`,
|
||||
),
|
||||
assertions: {
|
||||
expectedViewportCount: ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length,
|
||||
capturedViewportCount: ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length,
|
||||
allViewportsPass: true,
|
||||
composerHeightStable: true,
|
||||
composerHeightRange: 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function passingInput(): ElectronSmokeSummaryInput {
|
||||
return {
|
||||
runId: "candidate-20260716",
|
||||
@@ -51,6 +123,7 @@ function passingInput(): ElectronSmokeSummaryInput {
|
||||
mockFallbackHitCount: 0,
|
||||
pageErrorCount: 0,
|
||||
},
|
||||
layout: passingLayout(),
|
||||
diagnostics: {
|
||||
consoleErrorCount: 0,
|
||||
rendererCrashCount: 0,
|
||||
@@ -80,13 +153,16 @@ describe("electron smoke evidence", () => {
|
||||
]);
|
||||
expect(summary.assertions.failed).toEqual([]);
|
||||
expect(summary.assertions.details.traceCaptured).toBe(true);
|
||||
expect(summary.assertions.details.layoutViewportsCaptured).toBe(true);
|
||||
expect(summary.assertions.details.layoutGeometryStable).toBe(true);
|
||||
expect(summary.assertions.details.layoutScreenshotsCaptured).toBe(true);
|
||||
expect(summary.surfaceProof).toEqual({
|
||||
surfaceId: "SHELL-01",
|
||||
proof: "gate-b-f",
|
||||
complete: true,
|
||||
});
|
||||
expect(JSON.stringify(summary)).not.toContain("params");
|
||||
expect(JSON.stringify(summary)).not.toContain("request");
|
||||
expect(JSON.stringify(summary)).not.toContain('"request":');
|
||||
});
|
||||
|
||||
it("fails closed when bridge, route, or error assertions are missing", () => {
|
||||
@@ -96,6 +172,7 @@ describe("electron smoke evidence", () => {
|
||||
input.renderer.appServerMethods = [];
|
||||
input.diagnostics.consoleErrorCount = 1;
|
||||
input.artifacts.trace = null;
|
||||
input.layout.assertions.allViewportsPass = false;
|
||||
|
||||
const summary = buildElectronSmokeSummary(input);
|
||||
|
||||
@@ -110,10 +187,22 @@ describe("electron smoke evidence", () => {
|
||||
"currentAppServerMethodObserved",
|
||||
"noConsoleErrors",
|
||||
"traceCaptured",
|
||||
"layoutGeometryStable",
|
||||
]),
|
||||
);
|
||||
});
|
||||
|
||||
it("fails closed when a viewport geometry assertion fails", () => {
|
||||
const input = passingInput();
|
||||
input.layout.viewports[2].assertions.noHorizontalOverflow = false;
|
||||
input.layout.assertions.allViewportsPass = false;
|
||||
|
||||
const summary = buildElectronSmokeSummary(input);
|
||||
|
||||
expect(summary.result).toBe("fail");
|
||||
expect(summary.assertions.failed).toContain("layoutGeometryStable");
|
||||
});
|
||||
|
||||
it("normalizes run ids and removes local path and query values", () => {
|
||||
expect(normalizeElectronSmokeRunId(" gate-a_1 ", "fallback")).toBe(
|
||||
"gate-a_1",
|
||||
|
||||
@@ -4,7 +4,17 @@ import path from "node:path";
|
||||
export const ELECTRON_SMOKE_SCENARIO_ID = "SHELL-01-electron-smoke";
|
||||
export const ELECTRON_SMOKE_PROOF_LEVEL = "Gate B-F";
|
||||
export const ELECTRON_SMOKE_CLAIM_BOUNDARY =
|
||||
"Real Electron startup, renderer reload, preload/IPC, App Server JSON-RPC, Workbench readiness, and Settings route; no provider turn, Thread/Turn/Item identity, live-provider, or packaged-app claim.";
|
||||
"Real Electron startup, renderer reload, preload/IPC, App Server JSON-RPC, Workbench readiness, Settings route, and three-size responsive layout contract; no provider turn, Thread/Turn/Item identity, live-provider, packaged-app, or Codex Desktop pixel-parity claim.";
|
||||
export const ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL =
|
||||
"electron-responsive-layout-contract";
|
||||
export const ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY =
|
||||
"Real Electron BrowserWindow setSize/getSize and renderer geometry across 1536x960, 1280x800, and 980x680; this is a responsive layout contract, not Codex Desktop pixel-level visual parity or Windows packaged evidence.";
|
||||
|
||||
export const ELECTRON_SMOKE_LAYOUT_VIEWPORTS = [
|
||||
{ width: 1536, height: 960 },
|
||||
{ width: 1280, height: 800 },
|
||||
{ width: 980, height: 680 },
|
||||
] as const;
|
||||
|
||||
export interface ElectronSmokeRouteSnapshot {
|
||||
stage: "startup" | "workbench" | "workbench-reload" | "settings-memory";
|
||||
@@ -27,6 +37,53 @@ export interface ElectronSmokeRendererEvidence {
|
||||
pageErrorCount: number;
|
||||
}
|
||||
|
||||
export interface ElectronSmokeLayoutNodeEvidence {
|
||||
testId: string;
|
||||
present: boolean;
|
||||
visible: boolean;
|
||||
required: boolean;
|
||||
rect: {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
right: number;
|
||||
bottom: number;
|
||||
} | null;
|
||||
withinViewport: boolean;
|
||||
}
|
||||
|
||||
export interface ElectronSmokeLayoutViewportEvidence {
|
||||
requested: { width: number; height: number };
|
||||
window: { width: number; height: number };
|
||||
viewport: { width: number; height: number };
|
||||
document: { scrollWidth: number; scrollHeight: number };
|
||||
nodes: Record<string, ElectronSmokeLayoutNodeEvidence>;
|
||||
assertions: {
|
||||
windowSizeMatchesRequest: boolean;
|
||||
requiredNodesVisible: boolean;
|
||||
requiredNodesWithinViewport: boolean;
|
||||
contentSurfacePresent: boolean;
|
||||
noHorizontalOverflow: boolean;
|
||||
headerTitleVisible: boolean;
|
||||
headerActionsDoNotOverlap: boolean;
|
||||
};
|
||||
}
|
||||
|
||||
export interface ElectronSmokeLayoutEvidence {
|
||||
proofLevel: typeof ELECTRON_SMOKE_LAYOUT_PROOF_LEVEL;
|
||||
claimBoundary: typeof ELECTRON_SMOKE_LAYOUT_CLAIM_BOUNDARY;
|
||||
viewports: ElectronSmokeLayoutViewportEvidence[];
|
||||
screenshots: string[];
|
||||
assertions: {
|
||||
expectedViewportCount: number;
|
||||
capturedViewportCount: number;
|
||||
allViewportsPass: boolean;
|
||||
composerHeightStable: boolean;
|
||||
composerHeightRange: number | null;
|
||||
};
|
||||
}
|
||||
|
||||
export interface ElectronSmokeDiagnostics {
|
||||
consoleErrorCount: number;
|
||||
rendererCrashCount: number;
|
||||
@@ -45,6 +102,7 @@ export interface ElectronSmokeSummaryInput {
|
||||
hostAppServerProtocol: string | null;
|
||||
routes: ElectronSmokeRouteSnapshot[];
|
||||
renderer: ElectronSmokeRendererEvidence;
|
||||
layout: ElectronSmokeLayoutEvidence;
|
||||
diagnostics: ElectronSmokeDiagnostics;
|
||||
artifacts: {
|
||||
summary: string;
|
||||
@@ -80,6 +138,7 @@ export interface ElectronSmokeSummary {
|
||||
complete: boolean;
|
||||
};
|
||||
routes: ElectronSmokeRouteSnapshot[];
|
||||
layout: ElectronSmokeLayoutEvidence;
|
||||
bridge: {
|
||||
electron: boolean;
|
||||
preloadInvoke: boolean;
|
||||
@@ -187,6 +246,14 @@ export function buildElectronSmokeSummary(
|
||||
noMockFallbackHits: input.renderer.mockFallbackHitCount === 0,
|
||||
traceCaptured: input.artifacts.trace !== null,
|
||||
screenshotCaptured: input.artifacts.screenshotCaptured,
|
||||
layoutViewportsCaptured:
|
||||
input.layout.viewports.length === ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length,
|
||||
layoutGeometryStable:
|
||||
input.layout.assertions.allViewportsPass &&
|
||||
input.layout.assertions.composerHeightStable,
|
||||
layoutScreenshotsCaptured:
|
||||
input.layout.screenshots.length ===
|
||||
ELECTRON_SMOKE_LAYOUT_VIEWPORTS.length,
|
||||
};
|
||||
const failed = Object.entries(assertionDetails)
|
||||
.filter(([, passed]) => !passed)
|
||||
@@ -225,6 +292,7 @@ export function buildElectronSmokeSummary(
|
||||
complete: result === "pass",
|
||||
},
|
||||
routes: input.routes,
|
||||
layout: input.layout,
|
||||
bridge: {
|
||||
electron: input.renderer.electron,
|
||||
preloadInvoke: input.renderer.preloadInvoke,
|
||||
|
||||
@@ -198,6 +198,74 @@ describe("SystemUtilityHost security-scoped bookmarks", () => {
|
||||
expect(invokeNativeHostMock).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("按稳定 ID start/stop 管理活动 token,revoke 先停止访问再删除记录", async () => {
|
||||
const root = mkdtempSync(path.join(tmpdir(), "lime-bookmark-host-"));
|
||||
tempRoots.push(root);
|
||||
const host = createHost(root);
|
||||
invokeNativeHostMock
|
||||
.mockResolvedValueOnce({ bookmark: "bookmark" })
|
||||
.mockResolvedValueOnce({
|
||||
token: "token-1",
|
||||
path: "/tmp/project",
|
||||
isStale: false,
|
||||
started: true,
|
||||
})
|
||||
.mockResolvedValueOnce({ token: "token-1", stopped: true })
|
||||
.mockResolvedValueOnce({
|
||||
token: "token-2",
|
||||
path: "/tmp/project",
|
||||
isStale: false,
|
||||
started: true,
|
||||
})
|
||||
.mockResolvedValueOnce({ token: "token-2", stopped: true });
|
||||
|
||||
await host.invokeMacOSNativeHost({
|
||||
method: "bookmark.create",
|
||||
params: { path: "/tmp/project", persistId: "workspace" },
|
||||
});
|
||||
await expect(
|
||||
host.invokeMacOSNativeHost({
|
||||
method: "bookmark.start",
|
||||
params: { bookmarkId: "workspace" },
|
||||
}),
|
||||
).resolves.toMatchObject({ bookmarkId: "workspace", token: "token-1" });
|
||||
await expect(
|
||||
host.invokeMacOSNativeHost({
|
||||
method: "bookmark.stop",
|
||||
params: { bookmarkId: "workspace" },
|
||||
}),
|
||||
).resolves.toEqual({ token: "token-1", stopped: true });
|
||||
await host.invokeMacOSNativeHost({
|
||||
method: "bookmark.start",
|
||||
params: { bookmarkId: "workspace" },
|
||||
});
|
||||
await expect(
|
||||
host.invokeMacOSNativeHost({
|
||||
method: "bookmark.revoke",
|
||||
params: { bookmarkId: "workspace" },
|
||||
}),
|
||||
).resolves.toEqual({ bookmarkId: "workspace", revoked: true });
|
||||
|
||||
expect(invokeNativeHostMock).toHaveBeenNthCalledWith(2, {
|
||||
method: "bookmark.start",
|
||||
params: { bookmark: "bookmark" },
|
||||
});
|
||||
expect(invokeNativeHostMock).toHaveBeenNthCalledWith(3, {
|
||||
method: "bookmark.stop",
|
||||
params: { token: "token-1" },
|
||||
});
|
||||
expect(invokeNativeHostMock).toHaveBeenNthCalledWith(5, {
|
||||
method: "bookmark.stop",
|
||||
params: { token: "token-2" },
|
||||
});
|
||||
expect(
|
||||
existsSync(
|
||||
path.join(root, "macos/security-scoped-bookmarks/workspace.json"),
|
||||
),
|
||||
).toBe(false);
|
||||
host.dispose();
|
||||
});
|
||||
|
||||
it("拒绝 bookmark ID 路径穿越和不存在的冷启动记录", async () => {
|
||||
const root = mkdtempSync(path.join(tmpdir(), "lime-bookmark-host-"));
|
||||
tempRoots.push(root);
|
||||
|
||||
@@ -23,6 +23,7 @@ export class SystemUtilityHost {
|
||||
readonly #readConfig: ConfigReader;
|
||||
readonly #macOSNativeHost = new MacOSNativeHostClient();
|
||||
readonly #windowsNativeHost = new WindowsNativeHostClient();
|
||||
readonly #activeBookmarkTokens = new Map<string, string>();
|
||||
readonly #unsubscribeNativeEvents: () => void;
|
||||
|
||||
constructor(options: SystemUtilityHostOptions) {
|
||||
@@ -75,10 +76,22 @@ export class SystemUtilityHost {
|
||||
: {};
|
||||
if (method === "bookmark.revoke") {
|
||||
const bookmarkId = readBookmarkId(rawParams.bookmarkId);
|
||||
const token = this.#activeBookmarkTokens.get(bookmarkId);
|
||||
if (token) {
|
||||
await this.#macOSNativeHost.invoke({
|
||||
method: "bookmark.stop",
|
||||
params: { token },
|
||||
});
|
||||
this.#activeBookmarkTokens.delete(bookmarkId);
|
||||
}
|
||||
await this.#revokeBookmark(bookmarkId);
|
||||
return { bookmarkId, revoked: true };
|
||||
}
|
||||
|
||||
const bookmarkId =
|
||||
method === "bookmark.start" || method === "bookmark.stop"
|
||||
? optionalBookmarkId(rawParams.bookmarkId)
|
||||
: undefined;
|
||||
const persistId =
|
||||
method === "bookmark.create"
|
||||
? optionalBookmarkId(rawParams.persistId)
|
||||
@@ -89,10 +102,26 @@ export class SystemUtilityHost {
|
||||
(method === "bookmark.resolve" || method === "bookmark.start") &&
|
||||
!readString(params, "bookmark")
|
||||
) {
|
||||
const bookmarkId = readBookmarkId(params.bookmarkId);
|
||||
const persisted = await this.#readBookmark(bookmarkId);
|
||||
const persistedId = readBookmarkId(params.bookmarkId);
|
||||
const persisted = await this.#readBookmark(persistedId);
|
||||
params.bookmark = persisted.bookmark;
|
||||
}
|
||||
if (method === "bookmark.stop" && !readString(params, "token")) {
|
||||
if (!bookmarkId) {
|
||||
throw new NativeHostError(
|
||||
"invalid_argument",
|
||||
"bookmark.stop requires a token or bookmarkId.",
|
||||
);
|
||||
}
|
||||
const token = this.#activeBookmarkTokens.get(bookmarkId);
|
||||
if (!token) {
|
||||
throw new NativeHostError(
|
||||
"bookmark_unavailable",
|
||||
`No active security-scoped bookmark token exists: ${bookmarkId}`,
|
||||
);
|
||||
}
|
||||
params.token = token;
|
||||
}
|
||||
delete params.bookmarkId;
|
||||
|
||||
const result = await this.#macOSNativeHost.invoke({ method, params });
|
||||
@@ -105,6 +134,26 @@ export class SystemUtilityHost {
|
||||
});
|
||||
return { ...bookmark, bookmarkId: persistId, persisted: true };
|
||||
}
|
||||
if (method === "bookmark.start" && bookmarkId) {
|
||||
const token = readString(result, "token");
|
||||
if (token) {
|
||||
this.#activeBookmarkTokens.set(bookmarkId, token);
|
||||
return { ...toRecord(result), bookmarkId };
|
||||
}
|
||||
}
|
||||
if (method === "bookmark.stop") {
|
||||
if (bookmarkId) {
|
||||
this.#activeBookmarkTokens.delete(bookmarkId);
|
||||
} else {
|
||||
for (const [activeBookmarkId, activeToken] of this
|
||||
.#activeBookmarkTokens) {
|
||||
if (activeToken === readString(result, "token")) {
|
||||
this.#activeBookmarkTokens.delete(activeBookmarkId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -127,6 +176,7 @@ export class SystemUtilityHost {
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
this.#activeBookmarkTokens.clear();
|
||||
this.#unsubscribeNativeEvents();
|
||||
this.#macOSNativeHost.dispose();
|
||||
this.#windowsNativeHost.dispose();
|
||||
|
||||
@@ -38,19 +38,6 @@ const agentCompatRestrictedPatterns = [
|
||||
},
|
||||
];
|
||||
|
||||
const sceneAppDeadRestrictedPatterns = [
|
||||
{
|
||||
group: [
|
||||
"@/lib/sceneapp/types-runtime-context",
|
||||
"@/lib/sceneapp/types-runtime-context.*",
|
||||
"**/types-runtime-context",
|
||||
"**/types-runtime-context.*",
|
||||
],
|
||||
message:
|
||||
"types-runtime-context.ts 历史转发文件已删除;请统一改用 @/lib/sceneapp/types 或当前 sceneapp barrel,避免 dead 类型副本重新扩散。",
|
||||
},
|
||||
];
|
||||
|
||||
const deprecatedAgentRuntimeHelperNames = Object.keys(
|
||||
agentCommandCatalog.deprecatedHelperReplacements,
|
||||
);
|
||||
@@ -447,7 +434,6 @@ const createLegacyChatImportRule = (
|
||||
message:
|
||||
"components/chat 为遗留聊天模块,禁止新增依赖;请优先使用现役聊天入口。",
|
||||
},
|
||||
...sceneAppDeadRestrictedPatterns,
|
||||
];
|
||||
|
||||
if (includeAgentCompatPatterns) {
|
||||
@@ -892,54 +878,6 @@ const apiCompatibilityCommandSelectors = ["check_api_compatibility"].map(
|
||||
}),
|
||||
);
|
||||
|
||||
const sceneAppCurrentProjectionAliasImportSelectors = [
|
||||
{
|
||||
selector:
|
||||
"ImportSpecifier[imported.name='SceneAppCurrentDescriptor'], ImportSpecifier[imported.name='SceneAppCurrentPlanResult'], ImportSpecifier[imported.name='SceneAppCurrentCatalog']",
|
||||
message:
|
||||
"SceneApp base type 现已是 current 事实源;业务层请直接改用 SceneAppDescriptor / SceneAppPlanResult / SceneAppCatalog,避免继续依赖 SceneAppCurrent* 过渡别名。",
|
||||
},
|
||||
];
|
||||
|
||||
const sceneAppWideExecutionTypeImportSelectors = [
|
||||
{
|
||||
selector:
|
||||
"ImportSpecifier[imported.name='SceneAppBindingFamily'], ImportSpecifier[imported.name='SceneAppRuntimeAction']",
|
||||
message:
|
||||
"SceneApp 宽执行类型只允许停留在 API 归一化边界;业务层与测试夹具请改用 SceneAppExecutorBindingFamily / SceneAppExecutionRuntimeAction。",
|
||||
},
|
||||
];
|
||||
|
||||
const sceneAppCompatInputTypeImportSelectors = [
|
||||
{
|
||||
selector:
|
||||
"ImportSpecifier[imported.name='SceneAppCompatDescriptorInput'], ImportSpecifier[imported.name='SceneAppCompatCatalogInput'], ImportSpecifier[imported.name='SceneAppCompatExecutionPlanInput'], ImportSpecifier[imported.name='SceneAppCompatPlanResultInput']",
|
||||
message:
|
||||
"SceneApp raw compat 输入类型只允许停留在 API 归一化边界;业务层与测试夹具请改用 SceneAppCurrent* 或 current 业务投影。",
|
||||
},
|
||||
];
|
||||
|
||||
const sceneAppCompatTokenSelectors = [
|
||||
{
|
||||
selector:
|
||||
"Literal[value='cloud_managed'], Literal[value='cloud_runtime'], Literal[value='cloud_session'], Literal[value='cloud_scene'], Literal[value='launch_cloud_scene'], Literal[value='cloudSessionReady'], Literal[value='cloud_session_ready']",
|
||||
message:
|
||||
"SceneApp compat token 只允许停留在 API/目录编译/compat 展示边界;业务层请统一使用 current 语义。",
|
||||
},
|
||||
{
|
||||
selector:
|
||||
"Property[key.name='cloudSessionReady'], TSPropertySignature[key.name='cloudSessionReady'], MemberExpression[property.name='cloudSessionReady']",
|
||||
message:
|
||||
"cloudSessionReady 只允许停留在 SceneApp compat input 边界;业务层请统一改用 directorySessionReadyCompat 或 current 语义。",
|
||||
},
|
||||
{
|
||||
selector:
|
||||
"Property[key.name='cloud_session_ready'], TSPropertySignature[key.name='cloud_session_ready'], MemberExpression[property.name='cloud_session_ready']",
|
||||
message:
|
||||
"cloud_session_ready 只允许停留在 SceneApp compat input 边界;业务层请统一改用 directorySessionReadyCompat 或 current 语义。",
|
||||
},
|
||||
];
|
||||
|
||||
const endpointProvidersCommandSelectors = [
|
||||
"get_endpoint_providers",
|
||||
"set_endpoint_provider",
|
||||
@@ -1200,7 +1138,6 @@ export default [
|
||||
"src/lib/api/providerRuntime.ts",
|
||||
"src/lib/api/serverTools.ts",
|
||||
"src/lib/api/voiceTools.ts",
|
||||
"src/lib/api/sceneapp.ts",
|
||||
],
|
||||
rules: {
|
||||
"no-restricted-syntax": "off",
|
||||
@@ -1256,41 +1193,6 @@ export default [
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ["src/**/*.{ts,tsx}"],
|
||||
ignores: ["src/lib/api/sceneapp.ts"],
|
||||
rules: {
|
||||
"no-restricted-syntax": [
|
||||
"error",
|
||||
...sceneAppCurrentProjectionAliasImportSelectors,
|
||||
...sceneAppWideExecutionTypeImportSelectors,
|
||||
...sceneAppCompatInputTypeImportSelectors,
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
files: [
|
||||
"src/lib/sceneapp/**/*.{ts,tsx}",
|
||||
"src/components/sceneapps/**/*.{ts,tsx}",
|
||||
"src/components/settings-v2/system/automation/**/*.{ts,tsx}",
|
||||
"src/components/agent/chat/workspace/**/*.{ts,tsx}",
|
||||
"src/components/agent/chat/AgentChatWorkspace.tsx",
|
||||
],
|
||||
ignores: [
|
||||
"**/*.test.ts",
|
||||
"**/*.test.tsx",
|
||||
"src/lib/sceneapp/types.ts",
|
||||
"src/lib/sceneapp/catalog.ts",
|
||||
"src/lib/sceneapp/presentation.ts",
|
||||
],
|
||||
rules: {
|
||||
"no-restricted-syntax": [
|
||||
"error",
|
||||
...sceneAppCurrentProjectionAliasImportSelectors,
|
||||
...sceneAppCompatTokenSelectors,
|
||||
],
|
||||
},
|
||||
},
|
||||
// === 分层 import 边界守卫(R-30)===
|
||||
// lib/** 禁止 import components/features/pages(反向依赖)
|
||||
{
|
||||
|
||||
@@ -96,4 +96,4 @@ npm run bridge:e2e -- --server ws://127.0.0.1:8787 --key proxy_cast --profile de
|
||||
- 扩展只负责浏览器侧采集与动作执行。
|
||||
- 当前主链仍然是 `API -> observer socket -> 扩展 -> 当前已登录 Chrome 标签页`,不会额外拉起新的托管 Chrome。
|
||||
- Agent 侧通过 `agent_cmd` 暴露的现役浏览器 MCP 工具访问。
|
||||
- 若你同时使用独立 Chrome Profile(Tauri `open_chrome_profile_window`),请在对应 Profile 内安装该扩展,并使用不同 `profileKey` 做隔离。
|
||||
- 若你同时使用多个 Chrome Profile,请分别安装并配置扩展,并使用不同的 `profileKey` 隔离连接。
|
||||
|
||||
@@ -530,10 +530,6 @@
|
||||
"path": "src/components/agent/chat/components/CanvasWorkbenchLayoutViewModel.ts",
|
||||
"lines": 859
|
||||
},
|
||||
{
|
||||
"path": "src/components/agent/chat/workspace/SceneAppExecutionSummaryCard.tsx",
|
||||
"lines": 858
|
||||
},
|
||||
{
|
||||
"path": "src/lib/api/skills.ts",
|
||||
"lines": 857
|
||||
|
||||
+3
-4
@@ -19,17 +19,16 @@
|
||||
- `design/`:产品设计与交互方案
|
||||
- `tech/`:跨模块技术蓝图与专题工程文档
|
||||
- `knowledge/`:Knowledge 相关内部说明
|
||||
- `iteration-notes/`:迭代备忘、实现进度和后续建议
|
||||
- `bussniss/`、`oem/`、`gongzonghao/`:私有商务、品牌、运营和内容材料
|
||||
|
||||
## 当前迁移边界
|
||||
|
||||
- `lime-rs/src/**` 是旧主 crate、启动/注册、legacy facade 和迁移来源区,不再作为业务逻辑、领域服务、runtime 分支、API adapter、数据访问或跨 App 复用能力的长期 owner;触碰其中逻辑时,默认优先迁到 `lime-rs/crates/**` 的 App Server、RuntimeCore、services、core、agent 或协议/client crate。
|
||||
- `lime-rs/src/commands/**` 是旧 Tauri command wrapper 删除清理区,不再承接新的业务逻辑、API adapter、runtime 分支、领域服务实现、compat wrapper 或退场 stub。
|
||||
- `lime-rs/src/**` 与 `lime-rs/src/commands/**` 已物理删除;旧路径只允许出现在负向回流守卫或不可变历史 evidence 中,不得恢复主 crate、启动注册、legacy facade、compat wrapper 或退场 stub。
|
||||
- Rust 业务逻辑、领域服务、runtime、协议和数据访问的 current owner 位于 `lime-rs/crates/**`。
|
||||
- 新增 Rust 后端能力必须进入 App Server crates / RuntimeCore / services;窗口、托盘、Dock、updater、shell、deep link 等桌面壳能力进入 Electron Desktop Host。
|
||||
- 非生成代码超过 `1000` 行时,必须按领域、职责、数据边界或协议边界拆分;无法本轮拆分时,登记 blocker、风险和退出条件,不继续追加新业务逻辑。
|
||||
- `src/lib/dev-bridge/**` 需要按职责治理,不是整体删除对象:`safeInvoke`、HTTP client、`app_server_handle_json_lines`、bridge availability / event listener capability 是 current renderer bridge;旧命令 policy / no-mock fallback 是迁移期 `compat / deprecated`;已迁旧命令名只能留作 `dead` / `test-only` guard。删不动且跨命令组长期存在的 legacy policy / mock residual 必须回挂 `exec-plans/tech-debt-tracker.md` 的 `CCD-012`,不能只留在聊天、handoff 或临时计划里。
|
||||
- 相关规则入口:`aiprompts/commands.md`、`aiprompts/governance.md`、`aiprompts/quality-workflow.md`、`roadmap/appserver/README.md`、`exec-plans/production-command-current-migration-plan.md`、`exec-plans/tech-debt-tracker.md`、`exec-plans/tauri-wrapper-quick-cleanup-queue.md`、`exec-plans/tauri-wrapper-command-inventory.md`。
|
||||
- 相关规则入口:`aiprompts/commands.md`、`aiprompts/governance.md`、`aiprompts/quality-workflow.md`、`roadmap/appserver/README.md`、`exec-plans/production-command-current-migration-plan.md`、`exec-plans/tech-debt-tracker.md`。
|
||||
|
||||
## 阅读顺序
|
||||
|
||||
|
||||
@@ -81,14 +81,14 @@
|
||||
- **改 turn 提交 / prompt 组包 / queue / compaction / evidence 主链**:先读 `query-loop.md`
|
||||
- **改 subagent / automation / execution tracker / scheduler taxonomy**:先读 `task-agent-taxonomy.md`
|
||||
- **讨论 `/goal`、ThreadGoal 或跨 turn 目标续跑**:先读 `architecture.md`、`task-agent-taxonomy.md` 与 `query-loop.md`,再读 `../research/codex-goal/README.md`
|
||||
- **讨论 Coding Agent、Skill Forge 或能力生成 draft**:先读 `query-loop.md` 与 `skill-standard.md`,再读 `../research/pi-mono-coding-agent/README.md` 与 `../roadmap/skill-forge/coding-agent-layer.md`
|
||||
- **讨论 Coding Agent、Skill Forge 或能力生成 draft**:先读 `query-loop.md` 与 `skill-standard.md`,再读 `../research/pi-mono-coding-agent/README.md` 与 `../roadmap/skill-forge/README.md`
|
||||
- **改 channels / browser connector / DevBridge remote runtime**:先读 `remote-runtime.md`
|
||||
- **改记忆来源链 / working memory / durable memory / Team Memory / compaction**:先读 `memory-compaction.md`
|
||||
- **改 FileArtifact / artifact sidecar / versions / file checkpoint / evidence 中的文件快照**:先读 `persistence-map.md`
|
||||
- **改 session detail / thread read / requestTelemetry / evidence / history-record**:先读 `state-history-telemetry.md`
|
||||
- **改 Electron IPC / App Server / Bridge / mock / legacy desktop facade**:先读 `commands.md`,再看 `quality-workflow.md`
|
||||
- **碰到 `lime-rs/src/**`**:先判断是否只是 bootstrap / runner 接线、compat facade 委托或撤注册机械修复;凡是业务逻辑、领域服务、runtime 分支、API adapter、数据访问或跨 App 复用能力,默认迁往 `lime-rs/crates/\*\*`或 Electron Desktop Host。先读`commands.md`、`governance.md`与`quality-workflow.md`
|
||||
- **碰到 `lime-rs/src/commands/**`**:默认只做旧 Tauri wrapper 删除清理、撤注册后的机械编译修复或 blocker 登记;不要在该目录新增实现、compat wrapper 或退场 stub。先读 `commands.md`、`governance.md`、`../exec-plans/tauri-wrapper-quick-cleanup-queue.md`和`../exec-plans/tauri-wrapper-command-inventory.md`
|
||||
- **碰到 `lime-rs/src/commands/**`**:该目录已删除且禁止恢复;只允许更新 retired guard 或在 `tech-debt-tracker.md` 登记阻塞,不得新增实现、compat wrapper 或退场 stub。先读 `commands.md`、`governance.md` 和 `../exec-plans/production-command-current-migration-plan.md`。
|
||||
- **碰到超过 `1000` 行的非生成代码文件**:优先按领域、职责、数据边界或协议边界拆分,不继续追加新业务逻辑;接近 `800` 行时也要优先拆新模块。无法本轮拆分时,把原因、风险、退出条件和下一次拆分入口登记到执行计划
|
||||
- **碰到 `src/lib/dev-bridge/**`**:先读 `commands.md`与`governance.md`;保留 current renderer bridge 传输,按命令组清 `commandPolicy`、`mockPriorityCommands`、旧 smoke、负向测试和 contract guard,把删不动的旧 policy 登记到对应执行计划;跨命令组长期 residual 必须同步回挂 `../exec-plans/tech-debt-tracker.md`的`CCD-012`
|
||||
- **改 `@` / `/` / 轻卡 / viewer / ServiceSkill 场景**:先读 `command-runtime.md`
|
||||
|
||||
@@ -76,7 +76,7 @@ Codex 是 Lime Agent runtime 的唯一实现参考。本文列出的 Agent Evide
|
||||
| 候选标准 | 建议名称 | 为什么值得拆 | 当前 Lime 事实源 | 拆分状态 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Evaluation / Benchmark | Agent Evaluation | acceptance scenarios、provider E2E、quality review、harness evals、rubric 与 evidence 可复用 | `../test/harness-evals.md`、`../roadmap/knowledge/completion-audit-20260508.md` | 候选,适合从 Evidence 扩展 |
|
||||
| Workflow / Scene | Agent Workflow | ServiceSkill scene、功能方案包、multi-step content workflow、browser-grounded scene 需要 portable workflow facts | `command-runtime.md`、`../roadmap/limenextv2/README.md` | 中期候选 |
|
||||
| Workflow / Scene | Agent Workflow | ServiceSkill scene、功能方案包、multi-step content workflow、browser-grounded scene 需要 portable workflow facts | `command-runtime.md`、`task-agent-taxonomy.md` | 中期候选 |
|
||||
| Model Routing / Economy | Agent Model Routing | provider registry、model profile、cost、quota、fallback、task profile 有通用标准价值 | `providers.md`、`credential-pool.md`、`../roadmap/task/model-routing.md` | 中期候选 |
|
||||
| Connector / Channel | Agent Channel | remote runtime、A2A peer、webhook、deep link、browser session、desktop bridge 都是跨系统通道 | `remote-runtime.md`、`../content/08.open-platform/4.connect.md` | 中期候选 |
|
||||
| UI Theme / Design Tokens | Agent Design Surface | Agent UI 定义语义,不定义视觉;但跨 Agent 产品可能需要 design token / accessibility / density 标准 | `design-language.md` | 低优先级,除非多端复用稳定 |
|
||||
|
||||
@@ -83,15 +83,15 @@ Renderer 可以临时保存输入框、选择态、展开态和 optimistic UI;
|
||||
|
||||
## 4. Electron Desktop Host 规范
|
||||
|
||||
| 路径/模块 | 职责 |
|
||||
| ------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
||||
| `electron/main.ts` | Electron 生命周期与 host 组装入口。 |
|
||||
| `electron/preload.ts` | `contextBridge`、最小暴露面和 IPC 调用入口。 |
|
||||
| `electron/ipcChannels.ts` | IPC channel 常量与协议白名单。 |
|
||||
| `electron/*Host.ts` | 一个桌面能力一个 owner,例如 App Server sidecar、文件/项目壳、窗口、通知、更新、浏览器、语音。 |
|
||||
| 路径/模块 | 职责 |
|
||||
| -------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
||||
| `electron/main.ts` | Electron 生命周期与 host 组装入口。 |
|
||||
| `electron/preload.ts` | `contextBridge`、最小暴露面和 IPC 调用入口。 |
|
||||
| `electron/ipcChannels.ts` | IPC channel 常量与协议白名单。 |
|
||||
| `electron/*Host.ts` | 一个桌面能力一个 owner,例如 App Server sidecar、文件/项目壳、窗口、通知、更新、浏览器、语音。 |
|
||||
| `electron/desktopResourceReadiness.ts` | 运行时读取并校验 macOS/Windows desktop resource manifest 的身份与必需资源存在性;不替代发布 verifier。 |
|
||||
| `electron/appServerHost.ts` | sidecar 生命周期与 `app_server_handle_json_lines` 的宿主边界。 |
|
||||
| `electron/forge/`、`forge.config.mjs` | Forge 打包、maker、签名和 release 事实源。 |
|
||||
| `electron/appServerHost.ts` | sidecar 生命周期与 `app_server_handle_json_lines` 的宿主边界。 |
|
||||
| `electron/forge/`、`forge.config.mjs` | Forge 打包、maker、签名和 release 事实源。 |
|
||||
|
||||
Electron 负责窗口、托盘、Dock、系统文件选择、权限、外部链接、自动更新和 sidecar 生命周期。它不得保存业务 session、解释 provider response、执行模型工具、拼 Thread/Turn/Item 或提供业务 mock fallback。
|
||||
|
||||
@@ -115,7 +115,8 @@ Accessibility/Input Monitoring、Apple Events 授权查询/consent request、Scr
|
||||
Screen Recording 还支持在 helper 内生成受权限保护的全屏、显示器或窗口 PNG 快照;Chronicle/ScreenCaptureKit
|
||||
媒体管线、PIP 以及 Computer Use 控制注入仍保持 `not_configured`。helper 已提供受 Accessibility 授权保护的只读
|
||||
`accessibilityTree.read` 观察结果(有界深度、节点数和文本长度),以及 CoreGraphics `display.watch.start/stop` 拓扑事件,但不注入鼠标/键盘事件。窗口控制还支持 Accessibility AX raise、窗口所属应用
|
||||
hide/unhide、按锚点定位、显式堆叠顺序和带原始可见性恢复的 hide-for-task lease;这组接口不冒充私有 overlay
|
||||
hide/unhide、按锚点定位、显式堆叠顺序和带原始可见性恢复的 hide-for-task lease(通过 AX
|
||||
`kAXHiddenAttribute` 设置目标应用可见性);这组接口不冒充私有 overlay
|
||||
或 Remote Hosted PIP。Application Group 仍不申请或复制 OpenAI Team ID,
|
||||
无 consumer 时返回 `not_configured`。Windows sandbox readiness 继续由 `tool-runtime` 和 packaged
|
||||
resource verifier 负责,Desktop Host 只返回 `unverified`,不得从平台名称推断安全后端已就绪。
|
||||
@@ -134,6 +135,13 @@ identifier;helper 仅调用 `AEDeterminePermissionToAutomateTarget` 查询或
|
||||
`desktopCapabilities.appleEvents` 只表示 helper
|
||||
调用面存在;缺少签名、目标授权和 Gate B 证据时保持 `unverified`,不得作为无边界 Computer Use
|
||||
注入通道。
|
||||
打包 manifest 的 macOS helper metadata 固定声明 `protocolVersion=1`;Electron
|
||||
`MacOSNativeHostClient` 在首次业务调用前必须完成 `capabilities.read` 握手,并校验协议版本、平台和
|
||||
`com.limecloud.lime.native-host` bundle identity。握手失败会终止 helper、拒绝 pending request,并返回
|
||||
`protocol_mismatch`,不能把“可执行文件存在”升级为 runtime ready。已安装签名包的
|
||||
`scripts/electron/macos-native-host-gate-b.mjs` 复核同一 helper 的 resources 路径、digest/签名和握手,
|
||||
再观察窗口/显示、临时 Cocoa fixture 上的 window anchor/stack/hide-for-task lease、security-scoped bookmark create/resolve/start/stop、权限查询、Launch Services 与 display watcher;默认 `observe` 只记录 TCC 状态,
|
||||
`--strict-permissions` 才要求 Accessibility、Input Monitoring、Screen Recording 和选定 Apple Events target 全部 `ready`。
|
||||
Windows 原生能力沿同一 Desktop Host 资源边界实现:`electron/native/windows/windows-native-host.cpp`
|
||||
使用系统 UI Automation COM API 提供有界、只读的 `windows.uiAutomation.read` 控件树观察,并使用
|
||||
`RegisterRawInputDevices` 仅监听修饰键按下/释放事件(`windows.bareModifierMonitor.start/stop`),不提供
|
||||
@@ -148,14 +156,16 @@ helper 或 digest 漂移时返回 `unavailable`。`desktopCapabilities.uiAutomat
|
||||
`display.changed` 事件转发位深、分辨率和最新显示器快照;该观察接口同样不声明 display link、屏幕捕获或
|
||||
任何窗口控制能力,`desktopCapabilities.displayWatcher` 在资源存在时保持 `unverified`。
|
||||
security-scoped bookmark 的编码数据由 `SystemUtilityHost` 按稳定 ID 写入受管的
|
||||
`appDataRoot/macos/security-scoped-bookmarks`,支持冷启动 resolve/start 和显式 revoke;Renderer
|
||||
`appDataRoot/macos/security-scoped-bookmarks`,支持冷启动 resolve/start、活动 token stop 和显式
|
||||
revoke;当前进程内 revoke 会先停止同一稳定 ID 的 helper 访问,再删除受管记录。Renderer
|
||||
不得自行持有 bookmark 事实源或绕过 helper 生命周期。
|
||||
HID/bare modifier 的 unsolicited JSONL event 由 `MacOSNativeHostClient.onEvent` 接收,再经
|
||||
`SystemUtilityHost` 注入 Electron Host emitter 广播到 `evt:*`;订阅者异常不会破坏 response framing,
|
||||
`before-quit` 会先解除订阅并停止 helper。
|
||||
|
||||
Architecture impact: major; cross-platform Host capability contract added. Responsible developer
|
||||
confirmation: root, 2026-09-01. Window orchestration owner/data flow updated: root, 2026-09-01.
|
||||
Architecture impact: major; cross-platform Host capability contract and native helper handshake added.
|
||||
Responsible developer confirmation: root, 2026-09-01. Window orchestration owner/data flow updated: root,
|
||||
2026-09-01. Native helper protocol/readiness owner/data flow updated: root, 2026-09-02.
|
||||
Apple Events authorization owner/data flow updated: root, 2026-09-01.
|
||||
|
||||
## 5. TypeScript Package 规范
|
||||
@@ -1214,7 +1224,7 @@ Electron 只负责 JSONL 转发和系统通知宿主能力,不承接 scheduler
|
||||
terminal event 的 typed notification owner:任务 create/update/delete/enabled-set 发布 `scheduledTask/changed`,
|
||||
`turn.completed/failed/canceled` 经过 Agent Run 幂等终态写回后发布 `scheduledTask/run/updated`。Renderer 只按任务的
|
||||
`all_runs / failures / none` policy 决定是否调用 Desktop Host;`unsupported/failed` 必须进入可见错误通道,不能伪造发送成功。
|
||||
Renderer timer、生产 mock backend/fallback、browser session automation 与 SceneApp automation context 均禁止成为 current owner。旧
|
||||
Renderer timer、生产 mock backend/fallback、browser session automation 与已退役应用编排 context 均禁止成为 current owner。旧
|
||||
`automationJob/*`、`automationSchedule/*`、`automationScheduler/*`、Renderer automation gateway 及旧 Settings 工作台已物理删除,
|
||||
分类为 `dead / deleted / forbidden-to-restore`;旧 method 字符串只允许作为 contract、fixture 或治理扫描的负向回流守卫。Rust
|
||||
`AutomationJob` DAO、`automation_jobs` 表与内部 execution helper 是 Scheduled Tasks 的 current 存储映射,不是公开双轨。scheduler 原子 claim、
|
||||
@@ -2907,7 +2917,9 @@ trace,证明 reducer 是生产 consumer 而不是 dead code。
|
||||
V8 build 输入固定从 `lime-rs/Cargo.lock` 读取精确 crate version,`scripts/lib/rusty-v8-artifacts.mjs` 只接受
|
||||
Codex `ptrcomp_sandbox_release` 的受支持 platform target,下载 archive/binding/checksum manifest 后逐项校验 SHA-256,
|
||||
再向 Rust test、local CI 和 App Server sidecar build 注入成对的 `RUSTY_V8_ARCHIVE` /
|
||||
`RUSTY_V8_SRC_BINDING_PATH`。V8 archive 编译期只静态链接进 `code-mode-host`,不复制进 Electron resources。
|
||||
`RUSTY_V8_SRC_BINDING_PATH`。默认缓存使用各平台稳定的用户缓存目录,并对 curl 下载设置有限重试和超时;
|
||||
`RUSTY_V8_MIRROR` 保持不使用,因为 v8 crate 的 `/v<version>` 路径与 Codex 的 `/rusty-v8-v<version>` release tag 不兼容。
|
||||
V8 archive 编译期只静态链接进 `code-mode-host`,不复制进 Electron resources。
|
||||
dev、Electron asset 与 Windows build 使用同一次 Cargo invocation 成组产出 `app-server` 和 `code-mode-host`;Electron
|
||||
release bundle 将二者放在同一平台目录,manifest 分别记录 `sha256` 与 `codeModeHostSha256`,packaged verifier 必须同时
|
||||
校验。`default_code_mode_host_path` 只解析 App Server/测试二进制同目录,不搜索 PATH 上的替代 runtime。
|
||||
|
||||
@@ -187,15 +187,15 @@ Agent turn 必须把当前 OS、工作目录、shell 运行时和本机路径格
|
||||
|
||||
**这个 skill / scene 内部是按 `Pipeline`、`Inversion`、`Generator`、`Tool Wrapper` 还是 `Reviewer` 组织的。**
|
||||
|
||||
也就是说,后续新增命令或 SceneApp 时,至少要做三次分类:
|
||||
也就是说,后续新增命令或 Plugin workflow 时,至少要做三次分类:
|
||||
|
||||
1. **产品分型**
|
||||
- `Agent + Task`
|
||||
- `Agent + ServiceSkill`
|
||||
- `Agent + Workflow`
|
||||
- `Agent + Prompt`
|
||||
2. **SceneApp 运行形态与基础设施画像**
|
||||
- `sceneapp_type`
|
||||
2. **Workflow 运行形态与基础设施画像**
|
||||
- `execution_profile`
|
||||
- `infra_profile`
|
||||
3. **编排模式分型**
|
||||
- `Pipeline`
|
||||
@@ -204,7 +204,7 @@ Agent turn 必须把当前 OS、工作目录、shell 运行时和本机路径格
|
||||
- `Tool Wrapper`
|
||||
- `Reviewer`
|
||||
|
||||
同一个产品分型可以搭配不同的 `SceneApp` 运行形态、基础设施画像与模式组合。
|
||||
同一个产品分型可以搭配不同的 workflow 运行形态、基础设施画像与模式组合。
|
||||
|
||||
新增命令前,必须先判断它属于哪一种产品分型:
|
||||
|
||||
@@ -416,9 +416,11 @@ Agent turn 必须把当前 OS、工作目录、shell 运行时和本机路径格
|
||||
- `architecture.md`
|
||||
- `flowcharts.md`
|
||||
- `sequences.md`
|
||||
- `code-structure.md`
|
||||
- `tasks.md`
|
||||
|
||||
共享代码 owner 统一由 `internal/roadmap/gongneng/command-runtime/code-structure.md`
|
||||
记录;单功能只在 `architecture.md` / `tasks.md` 记录特有落点,不复制整套路径快照。
|
||||
|
||||
当前已落地或已定型的完整功能包包括:
|
||||
|
||||
- `internal/prd/gongneng/peitu/`
|
||||
@@ -445,11 +447,11 @@ Agent turn 必须把当前 OS、工作目录、shell 运行时和本机路径格
|
||||
|
||||
如果这一步说不清,禁止直接开始实现。
|
||||
|
||||
### 2. 再补 SceneApp 设计卡
|
||||
### 2. 再补执行设计卡
|
||||
|
||||
至少要明确:
|
||||
|
||||
- `sceneapp_type`
|
||||
- `execution_profile`
|
||||
- `pattern_primary`
|
||||
- `pattern_stack`
|
||||
- `infra_profile`
|
||||
@@ -458,7 +460,7 @@ Agent turn 必须把当前 OS、工作目录、shell 运行时和本机路径格
|
||||
|
||||
固定要求:
|
||||
|
||||
- `sceneapp_type` 回答它主要是本地即时、本地 durable、浏览器依赖、目录同步兼容型还是混合型
|
||||
- `execution_profile` 回答它主要是本地即时、本地 durable、浏览器依赖还是混合型
|
||||
- `pattern_primary / pattern_stack` 回答它内部怎么组织逻辑
|
||||
- `infra_profile` 回答它到底用了浏览器、server skill、CLI、schedule、db、markdown 还是 json
|
||||
- 如果这一卡片写不出来,说明这个命令还没被真正设计清楚
|
||||
@@ -486,7 +488,7 @@ Agent turn 必须把当前 OS、工作目录、shell 运行时和本机路径格
|
||||
|
||||
方案包至少要回答:
|
||||
|
||||
- `SceneApp` 设计卡怎么填
|
||||
- 执行设计卡怎么填
|
||||
- Agent 如何判断
|
||||
- 如何补参
|
||||
- 目录项由谁下发,客户端如何兜底
|
||||
|
||||
@@ -248,4 +248,3 @@ pub fn convert_error(provider_error: ProviderError) -> OpenAIError {
|
||||
|
||||
- [providers.md](providers.md) - Provider 系统
|
||||
- [server.md](server.md) - HTTP 服务器
|
||||
- [streaming.md](streaming.md) - 流式处理
|
||||
|
||||
@@ -175,7 +175,7 @@ Lime 的整体界面应当接近以下气质:
|
||||
- 如果同一页同时承载“最近继续”和“目录发现”,优先收成同一块轻量目录,不要拆成上下两块风格割裂的白卡
|
||||
- 如果页面目标只是“快速选条目”,可以直接退成纯标题目录,不要为了统一感强行做卡片墙或补大面积外框
|
||||
- 首页空态 / 推荐入口如果只是承担“快速进入某个场景”的职责,也优先用纯文字目录或文字 shelf,不要把首页入口做成另一套大卡片陈列
|
||||
- `SceneAppsPage` 这类目录型工作台,即使仍保留分页,也不代表首屏必须保留 hero 大卡、统计卡、当前场景摘要卡和 workflow 卡;如果这些块没有帮助选条目,就应收回成纯文字导航
|
||||
- Plugin 目录型工作台即使保留分页,也不代表首屏必须保留 hero 大卡、统计卡、当前条目摘要卡和 workflow 卡;如果这些块没有帮助选条目,就应收回成纯文字导航
|
||||
- 如果卡片承担“进入下一层”的职责,必须提供明确导航语义
|
||||
- 不要只给“选中态边框”却没有后续页面变化,避免用户误以为点击无效
|
||||
- 可点击卡片应直接进入详情、配置或治理下一层;提示文案要和点击结果一致
|
||||
@@ -320,7 +320,7 @@ Lime 的整体界面应当接近以下气质:
|
||||
- 工作台主操作应与统计信息分栏,而不是挤成一行
|
||||
- 分组标题应使用“中文主标题 + 英文辅助标签”的组合,而不是反过来
|
||||
- Team Workspace / 浮层类界面应避免半透明主体和多层套卡,否则会放大遮挡感与层级混乱
|
||||
- `SceneApp` 这类复杂工作台不应把“场景目录、场景详情、治理复盘”继续堆在同一页里,而应按用户任务路径拆成分页
|
||||
- 复杂 Plugin 工作台不应把“目录、详情、治理复盘”继续堆在同一页里,而应按用户任务路径拆成分页
|
||||
- 目录卡片如果承担“进入详情”的职责,就应点击后直接切页,不要停留在只有选中态的伪交互
|
||||
- 分页工作台要在顶部持续展示“当前场景”摘要,让用户在目录、详情、治理之间切换时始终知道自己正在处理哪条场景
|
||||
- 分页工作台的空态也必须按任务路径设计,直接把用户引回“回目录选场景 / 清空筛选 / 先做首轮运行”这些下一步动作
|
||||
|
||||
@@ -23,6 +23,13 @@ Agent 产品主链固定为:
|
||||
model/capability/credential readiness 必须继续 fail closed,不能由 provider 名称、
|
||||
legacy alias 或默认值放行。
|
||||
|
||||
已删除的 Rust 根宿主目录与 SceneApp 产品面已完成替换并物理删除,当前分类同样为
|
||||
`dead / deleted / forbidden-to-restore`。应用目录只允许由 Plugin 承接;任务执行只允许
|
||||
走 Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore / Agent Runtime;结果参考
|
||||
只允许走 Curated Task + Memory reference。旧目录、命令、类型、source kind、i18n key、
|
||||
脚本和文档入口只能出现在负向回流守卫或不可变历史 evidence 中,不得恢复为 compat、
|
||||
fallback 或 active 文档导航。
|
||||
|
||||
Agent loop、状态机、Thread/Turn/Item、工具、MCP、Skills、Multi-Agent、历史恢复和 GUI 护栏按 `/Users/coso/Documents/dev/rust/codex` 收敛。多模型控制平面的 model catalog、model switch、provider capability、provider readiness 和 retry/circuit breaker 按 `/Users/coso/Documents/dev/rust/grok-build` 收敛;provider wire 的 endpoint、canonical content、媒体 lowering 和多协议 stream 可参考 `/Users/coso/Documents/dev/js/opencode`。grok-build/OpenCode 只提供 provider/model 机制参考,不成为 Lime runtime 或 GUI owner。
|
||||
|
||||
## 直接替换
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
**后续新增 remote 能力时,只允许接到 `消息渠道 runtime` 或 `浏览器连接器 / ChromeBridge` 这两条 current ingress;不允许再造第三条并列 remote runtime。**
|
||||
|
||||
补充迁移边界:本页保留的 `lime-rs/src/commands/*_cmd.rs` 只用于定位旧 Tauri wrapper 或迁移期命令面,不表示 `lime-rs/src/commands/**` 仍是 remote runtime 的实现目录。新增 remote control plane、agent/browser runtime 或跨 App remote 能力应进入 App Server / RuntimeCore / services;桌面壳、浏览器窗口、CDP 和系统打开能力进入 Electron Desktop Host。旧 wrapper 只允许迁出、撤注册、删除,删不动时登记 blocker。
|
||||
补充边界:`lime-rs/src/commands/**` 已物理删除,只允许作为负向回流守卫或不可变历史 evidence 出现。新增 remote control plane、agent/browser runtime 或跨 App remote 能力应进入 App Server / RuntimeCore / services;桌面壳、浏览器窗口、CDP 和系统打开能力进入 Electron Desktop Host。
|
||||
|
||||
## 代码入口地图
|
||||
|
||||
@@ -102,8 +102,8 @@ OpenClaw 安装、Gateway、Dashboard 与运行态管理模块已经判定为 `d
|
||||
|
||||
当前这里负责:
|
||||
|
||||
1. Rust `lime-rs/src/dev_bridge.rs` 仅在 `debug_assertions` 下提供旧 `3030` HTTP 桥
|
||||
2. Rust `lime-rs/src/dev_bridge/dispatcher/**` 只作为旧 Tauri command facade 的迁移来源和清理对象
|
||||
1. Rust `lime-rs/src/dev_bridge.rs` 与 `lime-rs/src/dev_bridge/dispatcher/**` 已物理删除,不得恢复旧 `3030` HTTP 桥或 Tauri command facade
|
||||
2. 已删除路径只允许出现在负向回流守卫或不可变历史 evidence 中
|
||||
3. 前端 `src/lib/dev-bridge/safeInvoke.ts` / `http-client.ts` 仍是 renderer 进入 Electron Desktop Host / App Server JSON-RPC 的 current 传输、可用性探测、事件监听和错误追踪边界
|
||||
4. 前端 `src/lib/dev-bridge/commandPolicy.ts` 只承接旧命令 truth / no-mock fallback 的迁移期分类,不是 remote runtime 事实源
|
||||
|
||||
|
||||
@@ -248,5 +248,4 @@ pub async fn error_handler(err: Error) -> Response {
|
||||
## 相关文档
|
||||
|
||||
- [converter.md](converter.md) - 协议转换
|
||||
- [flow-monitor.md](flow-monitor.md) - 流量监控
|
||||
- [providers.md](providers.md) - Provider 系统
|
||||
|
||||
@@ -334,7 +334,7 @@ Lime 技能能力必须明确区分四个对象:
|
||||
不是谁:
|
||||
|
||||
- 不是原始 `SKILL.md`
|
||||
- 不等于 `SceneApp`
|
||||
- 不等于上层 Plugin 或 workflow
|
||||
- 更接近 `Scene / ServiceSkill` 背后的流程层与产品投影层
|
||||
|
||||
固定规则:
|
||||
@@ -405,7 +405,7 @@ Lime 技能能力必须明确区分四个对象:
|
||||
补充边界:
|
||||
|
||||
- `patternPrimary / patternStack` 可以来自 Skill Bundle 编译结果
|
||||
- `infra_profile` 不属于原始 Skill Bundle 的强制字段,它属于上层 `SceneApp` 装配声明
|
||||
- `infra_profile` 不属于原始 Skill Bundle 的强制字段,它属于上层 Plugin workflow 装配声明
|
||||
- 不要把“这个 skill 是 `Pipeline` 型”误写成“这个场景就是云端 / 浏览器 / 本地 durable”
|
||||
|
||||
必须遵守:
|
||||
|
||||
@@ -200,14 +200,12 @@ Agent UI `runtimeEntity=automation_job` 或 `background_teammate`;退出条件
|
||||
|
||||
### `deprecated`
|
||||
|
||||
- `internal/develop/execution-tracker-technical-plan.md`
|
||||
- `internal/develop/execution-tracker-deprecation-plan.md`
|
||||
- `internal/develop/execution-tracker-p1-p2-roadmap.md`
|
||||
- Execution Tracker / heartbeat 旧 taxonomy(专项文档已删除,历史仅从 Git history 查阅)
|
||||
- 任何新增的 `heartbeat_executions` 写路径或读取依赖
|
||||
- 任何把 `heartbeat` 当成与 `chat / skill / automation` 并列 run source 的新设计
|
||||
- 任何把 `scheduler tick / cron / 心跳任务` 当成独立 task taxonomy 的新设计
|
||||
|
||||
这些路径仍可作为历史实现说明或退场清单,但不再承担 current taxonomy 定义权。
|
||||
这些概念不再承担 current taxonomy 定义权,也不得恢复独立执行实体或公开协议。
|
||||
|
||||
### `dead`
|
||||
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
# A2UI 表单数据持久化设计
|
||||
|
||||
## 问题背景
|
||||
|
||||
当前 A2UI 表单数据只存在于前端内存中,页面刷新或切换话题后会丢失。用户填写的表单数据需要持久化到数据库,以便重新进入时能够恢复。
|
||||
|
||||
## 数据分析
|
||||
|
||||
### 需要持久化的数据
|
||||
|
||||
1. **A2UI 响应结构** (`A2UIResponse`)
|
||||
- `id`: 响应 ID
|
||||
- `components`: 组件列表(包含表单字段定义)
|
||||
- `root`: 根组件 ID
|
||||
- `data`: 初始数据模型
|
||||
- `submitAction`: 提交动作配置
|
||||
|
||||
2. **用户填写的表单数据** (`A2UIFormData`)
|
||||
- 键值对形式,key 是组件 ID,value 是用户输入的值
|
||||
- 例如:`{ "scene": "我和同事说", "feeling": "对 go 很陌生" }`
|
||||
|
||||
3. **表单状态**
|
||||
- `submitted`: 是否已提交
|
||||
- `submittedAt`: 提交时间
|
||||
- `submittedData`: 提交时的数据快照
|
||||
|
||||
## 设计方案
|
||||
|
||||
### 方案 A:扩展 agent_messages 表(推荐)
|
||||
|
||||
在现有 `agent_messages` 表中添加字段存储 A2UI 相关数据:
|
||||
|
||||
```sql
|
||||
-- 添加 A2UI 相关字段
|
||||
ALTER TABLE agent_messages ADD COLUMN a2ui_response_json TEXT;
|
||||
ALTER TABLE agent_messages ADD COLUMN a2ui_form_data_json TEXT;
|
||||
ALTER TABLE agent_messages ADD COLUMN a2ui_submitted INTEGER DEFAULT 0;
|
||||
ALTER TABLE agent_messages ADD COLUMN a2ui_submitted_at TEXT;
|
||||
```
|
||||
|
||||
**优点**:
|
||||
|
||||
- 数据与消息紧密关联,查询简单
|
||||
- 不需要额外的表和外键
|
||||
- 迁移简单
|
||||
|
||||
**缺点**:
|
||||
|
||||
- 消息表字段增多
|
||||
- 如果一条消息有多个 A2UI 表单,需要用 JSON 数组存储
|
||||
|
||||
### 方案 B:独立的 A2UI 表单表
|
||||
|
||||
创建独立的表存储 A2UI 表单数据:
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS a2ui_forms (
|
||||
id TEXT PRIMARY KEY,
|
||||
message_id INTEGER NOT NULL,
|
||||
session_id TEXT NOT NULL,
|
||||
a2ui_response_json TEXT NOT NULL,
|
||||
form_data_json TEXT DEFAULT '{}',
|
||||
submitted INTEGER DEFAULT 0,
|
||||
submitted_at TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
FOREIGN KEY (message_id) REFERENCES agent_messages(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (session_id) REFERENCES agent_sessions(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_a2ui_forms_message ON a2ui_forms(message_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_a2ui_forms_session ON a2ui_forms(session_id);
|
||||
```
|
||||
|
||||
**优点**:
|
||||
|
||||
- 数据结构清晰
|
||||
- 支持一条消息多个表单
|
||||
- 便于单独查询和管理表单数据
|
||||
|
||||
**缺点**:
|
||||
|
||||
- 需要额外的表和外键
|
||||
- 查询时需要 JOIN
|
||||
|
||||
## 推荐方案:方案 B
|
||||
|
||||
考虑到:
|
||||
|
||||
1. 一条 AI 消息可能包含多个 A2UI 表单
|
||||
2. 表单数据需要独立更新(用户填写时实时保存)
|
||||
3. 未来可能需要表单历史版本、表单模板等功能
|
||||
|
||||
### 数据流设计
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 前端 (React) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ StreamingRenderer │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ A2UIRenderer ──────► onFormChange() ──────► 防抖保存 │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ onSubmit() ──────────────────────────────► 提交表单 │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ Tauri Commands │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ save_a2ui_form_data(form_id, form_data) │
|
||||
│ submit_a2ui_form(form_id, form_data) │
|
||||
│ get_a2ui_forms_by_session(session_id) │
|
||||
│ get_a2ui_form_by_message(message_id) │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ Rust Backend │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ A2UIFormService │
|
||||
│ - save_form_data() │
|
||||
│ - submit_form() │
|
||||
│ - get_forms_by_session() │
|
||||
│ - get_form_by_message() │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ SQLite Database │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ a2ui_forms 表 │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 前端改动
|
||||
|
||||
1. **A2UIRenderer 组件**
|
||||
- 添加 `formId` prop(从后端获取或生成)
|
||||
- 添加 `initialFormData` prop(从后端加载)
|
||||
- 添加 `onFormChange` 回调(防抖保存)
|
||||
|
||||
2. **useAgentChatUnified / useAgentChat Hook**
|
||||
- `switchTopic` 时加载该会话的所有 A2UI 表单数据
|
||||
- 将表单数据与消息关联
|
||||
|
||||
3. **StreamingRenderer 组件**
|
||||
- 传递表单数据给 A2UIRenderer
|
||||
|
||||
### 后端改动
|
||||
|
||||
1. **数据库 Schema**
|
||||
- 添加 `a2ui_forms` 表
|
||||
|
||||
2. **Tauri Commands**
|
||||
- `save_a2ui_form_data`: 保存表单数据(防抖调用)
|
||||
- `submit_a2ui_form`: 提交表单
|
||||
- `get_a2ui_forms_by_session`: 获取会话的所有表单
|
||||
- `create_a2ui_form`: 创建新表单记录
|
||||
|
||||
3. **消息保存逻辑**
|
||||
- 保存 AI 消息时,解析 A2UI 内容并创建表单记录
|
||||
|
||||
## 实现步骤
|
||||
|
||||
### Phase 1: 数据库层
|
||||
|
||||
1. 添加 `a2ui_forms` 表到 schema.rs
|
||||
2. 创建 A2UIFormDao
|
||||
|
||||
### Phase 2: 后端服务
|
||||
|
||||
1. 创建 A2UIFormService
|
||||
2. 添加 Tauri Commands
|
||||
|
||||
### Phase 3: 前端集成
|
||||
|
||||
1. 添加 API 调用函数
|
||||
2. 修改 A2UIRenderer 支持数据持久化
|
||||
3. 修改 useAgentChatUnified / useAgentChat 加载表单数据
|
||||
|
||||
### Phase 4: 测试和优化
|
||||
|
||||
1. 测试表单数据保存和恢复
|
||||
2. 优化防抖保存策略
|
||||
3. 处理边界情况(网络错误、并发等)
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **防抖保存**:用户输入时不要每次都保存,使用 500ms 防抖
|
||||
2. **乐观更新**:先更新 UI,后台异步保存
|
||||
3. **错误处理**:保存失败时提示用户,但不阻塞操作
|
||||
4. **数据清理**:删除会话时级联删除表单数据
|
||||
@@ -1,57 +0,0 @@
|
||||
# Execution Tracker 旧路径退场计划(P0 收口)
|
||||
|
||||
## 1. 范围
|
||||
|
||||
本计划只针对统一执行追踪相关的“旧路径并存”问题,核心对象:
|
||||
|
||||
- `heartbeat_executions`(历史任务执行表,当前仍在写入)
|
||||
- 各入口中散落的手工生命周期代码(`start -> finish`)
|
||||
|
||||
## 2. 当前状态(2026-02-20)
|
||||
|
||||
已完成:
|
||||
|
||||
1. `agent_runs` 已上线并接入 chat / skill / heartbeat
|
||||
2. 统一查询命令 `execution_run_list/get` 已上线
|
||||
3. 前端已提供执行轨迹观测入口
|
||||
|
||||
待收口:
|
||||
|
||||
1. `heartbeat_executions` 仍保留写入
|
||||
2. Skill 入口仍有局部手工 finish 分支(因 `Ok(success=false)` 语义)
|
||||
|
||||
## 3. 退场策略
|
||||
|
||||
### Stage A(2026-02-20 ~ 2026-03-05)
|
||||
|
||||
- 保持双写:`agent_runs` + `heartbeat_executions`
|
||||
- 观察数据一致性(status、duration、error)
|
||||
- 将所有新入口默认接入 `ExecutionTracker`
|
||||
|
||||
### Stage B(2026-03-06 ~ 2026-03-20)
|
||||
|
||||
- 对 `heartbeat_executions` 增加“只读旧数据”标记说明(代码注释 + 文档)
|
||||
- 停止新增依赖方读取 `heartbeat_executions`
|
||||
- 评估并落地 Skill 入口 `Ok(success=false)` 的统一映射方案
|
||||
|
||||
### Stage C(2026-03-21 ~ 2026-04-10)
|
||||
|
||||
- 切换 Heartbeat 写入到 `agent_runs` 单写(保留旧表只读)
|
||||
- 清理重复生命周期实现,统一走 `with_run` 或等价包装
|
||||
- 发布迁移公告与运维回滚预案
|
||||
|
||||
## 4. 风险控制
|
||||
|
||||
1. 任何阶段都保留 `PROXYCAST_EXECUTION_TRACKER_ENABLED` 开关
|
||||
2. 单写切换前必须完成:
|
||||
- 一周线上无“running 悬挂”增长
|
||||
- 关键入口失败率无异常抬升
|
||||
3. 如出现回归,优先回退到 Stage A 双写策略
|
||||
|
||||
## 5. 验收口径
|
||||
|
||||
满足以下条件视为“旧路径可下线”:
|
||||
|
||||
1. `agent_runs` 覆盖 chat/skill/heartbeat > 95%
|
||||
2. 过去 7 天内 `heartbeat_executions` 与 `agent_runs` 核心字段一致性 > 99%
|
||||
3. 无新增模块直接依赖 `heartbeat_executions` 写路径
|
||||
@@ -1,112 +0,0 @@
|
||||
# Execution Tracker P0 验收报告
|
||||
|
||||
> 验收日期:2026-02-20
|
||||
> 对应规划:`internal/develop/execution-tracker-technical-plan.md`
|
||||
|
||||
## 1. 验收范围
|
||||
|
||||
本报告仅覆盖统一执行追踪专项的 P0 目标,不包含其他产品线功能(如创作画布、Provider 扩展等)。
|
||||
|
||||
## 2. 结果结论
|
||||
|
||||
P0 目标整体达成,统一执行追踪已进入可用状态并通过构建与测试验证。
|
||||
|
||||
## 3. 已完成项(按 P0 目标映射)
|
||||
|
||||
### 3.1 统一 run 模型与数据层
|
||||
|
||||
已完成:
|
||||
|
||||
- 新增 `agent_runs` 表与索引
|
||||
- 新增 `AgentRunStatus` 统一状态枚举
|
||||
- 新增 `AgentRunDao`(create/finish/get/list)
|
||||
- 终态写入具备幂等保护(`finished_at IS NULL`)
|
||||
|
||||
关键文件:
|
||||
|
||||
- `lime-rs/crates/core/src/database/schema.rs`
|
||||
- `lime-rs/crates/core/src/database/dao/agent_run.rs`
|
||||
|
||||
### 3.2 统一执行追踪服务
|
||||
|
||||
已完成:
|
||||
|
||||
- 新增 `ExecutionTracker`
|
||||
- 提供 `start` / `finish_success` / `finish_error` / `finish_with_status`
|
||||
- 新增 `with_run` 包装器(减少生命周期重复代码)
|
||||
- 支持环境变量灰度开关:`PROXYCAST_EXECUTION_TRACKER_ENABLED`
|
||||
|
||||
关键文件:
|
||||
|
||||
- `lime-rs/src/services/execution_tracker_service.rs`
|
||||
|
||||
### 3.3 三大执行入口接入
|
||||
|
||||
已完成:
|
||||
|
||||
- Skill 入口:`execute_skill` 接入追踪
|
||||
- Chat 入口:`agent_runtime_submit_turn` 接入追踪(已改用 `with_run`)
|
||||
- Heartbeat 入口:按任务粒度接入追踪并映射状态
|
||||
|
||||
关键文件:
|
||||
|
||||
- `lime-rs/src/commands/skill_exec_cmd.rs`
|
||||
- `lime-rs/src/commands/agent_cmd.rs`
|
||||
- `lime-rs/src/services/heartbeat_service/mod.rs`
|
||||
|
||||
### 3.4 查询接口与最小前端观测
|
||||
|
||||
已完成:
|
||||
|
||||
- 后端命令:`execution_run_list` / `execution_run_get`
|
||||
- 设置页新增“执行轨迹”面板(筛选、详情、自动刷新、复制)
|
||||
- 聊天页与心跳页接入统一状态徽标
|
||||
|
||||
关键文件:
|
||||
|
||||
- `lime-rs/src/commands/execution_run_cmd.rs`
|
||||
- `src/components/settings-v2/system/execution-tracker/index.tsx`
|
||||
- `src/components/execution/LatestRunStatusBadge.tsx`
|
||||
|
||||
### 3.5 旧路径退场规划
|
||||
|
||||
已完成:
|
||||
|
||||
- 新增旧路径退场文档,明确阶段、时间窗口与回滚策略
|
||||
|
||||
关键文件:
|
||||
|
||||
- `internal/develop/execution-tracker-deprecation-plan.md`
|
||||
|
||||
## 4. 验证记录
|
||||
|
||||
已通过:
|
||||
|
||||
- `cd lime-rs && cargo check`
|
||||
- `cd lime-rs && cargo test -p lime-core agent_run::tests -- --nocapture`
|
||||
- `cd lime-rs && cargo test -p lime execution_tracker_service::tests -- --nocapture`
|
||||
- `npm run build`
|
||||
|
||||
## 5. 与 P0 验收标准对照
|
||||
|
||||
### 标准 1:三个执行入口全部接入 `execution_tracker`
|
||||
|
||||
结果:通过。
|
||||
|
||||
### 标准 2:至少一个统一查询接口可用于调试与 UI 展示
|
||||
|
||||
结果:通过(`execution_run_list/get` + 执行轨迹面板)。
|
||||
|
||||
### 标准 3:旧路径进入可下线状态(有迁移清单和时间点)
|
||||
|
||||
结果:通过(退场计划文档已给出阶段和时间窗)。
|
||||
|
||||
### 标准 4:无新增重复生命周期逻辑
|
||||
|
||||
结果:通过(统一追踪服务已收敛,`with_run` 已建立标准接入方式;后续入口将按该模式持续统一)。
|
||||
|
||||
## 6. 风险与后续动作(非 P0 阻塞)
|
||||
|
||||
1. Heartbeat 历史表仍处于并存阶段,需按退场计划逐步降级为只读。
|
||||
2. Skill/Heartbeat 入口可继续向 `with_run` 统一风格收敛,以进一步减少生命周期模板代码。
|
||||
3. 建议在后续版本补充跨入口一致性统计报表(用于监控“running 悬挂率”)。
|
||||
@@ -1,62 +0,0 @@
|
||||
# Execution Tracker 后续路线(P1 / P2)
|
||||
|
||||
## 1. 目标说明
|
||||
|
||||
P0 已完成统一追踪能力落地;本路线定义下一阶段(P1/P2)可执行改进项,用于持续提升一致性、可观测性与运维效率。
|
||||
|
||||
## 2. P1(应做,近期)
|
||||
|
||||
## P1-1 生命周期统一收敛
|
||||
|
||||
- 目标:Skill / Heartbeat 入口统一切换为 `with_run` 风格
|
||||
- 收益:减少重复生命周期模板代码,降低维护成本
|
||||
- 交付:
|
||||
- 入口改造 PR
|
||||
- code review checklist(执行追踪接入规范)
|
||||
|
||||
## P1-2 一致性与悬挂监控
|
||||
|
||||
- 目标:建立 `running` 悬挂探测与告警机制
|
||||
- 收益:提前发现 finish 漏写、异常中断等问题
|
||||
- 交付:
|
||||
- 定时巡检任务(阈值可配置)
|
||||
- 统计指标:悬挂数、悬挂时长分布、来源维度占比
|
||||
|
||||
## P1-3 旧路径读侧收敛
|
||||
|
||||
- 目标:禁止新增模块依赖 `heartbeat_executions` 写路径
|
||||
- 收益:为单写切换清障,避免双写长期化
|
||||
- 交付:
|
||||
- 文档与注释标记(deprecated 说明)
|
||||
- 读写链路梳理清单
|
||||
|
||||
## 3. P2(可做,中期)
|
||||
|
||||
## P2-1 执行追踪聚合 API
|
||||
|
||||
- 目标:提供按来源/状态/时间窗口的聚合统计接口
|
||||
- 收益:支撑运营看板、质量趋势分析
|
||||
- 交付:
|
||||
- 聚合命令/API(例如成功率、P95 时延、错误 TopN)
|
||||
|
||||
## P2-2 追踪与日志链路关联
|
||||
|
||||
- 目标:在 run 维度关联请求日志、会话消息与错误栈索引
|
||||
- 收益:故障排查从“多处跳转”收敛到“单 run 入口”
|
||||
- 交付:
|
||||
- run → 日志/会话的关联字段规范
|
||||
- 前端详情页一跳联查能力
|
||||
|
||||
## P2-3 数据归档与保留策略
|
||||
|
||||
- 目标:定义 `agent_runs` 分层保留与归档策略
|
||||
- 收益:控制数据量增长,保障查询性能
|
||||
- 交付:
|
||||
- 保留周期配置(热数据/冷数据)
|
||||
- 清理任务与容量水位监控
|
||||
|
||||
## 4. 建议里程碑
|
||||
|
||||
- M1(1-2 周):完成 P1-1、P1-2
|
||||
- M2(2-4 周):完成 P1-3,启动单写切换评估
|
||||
- M3(4-8 周):推进 P2 聚合与链路关联能力
|
||||
@@ -1,239 +0,0 @@
|
||||
# Lime 统一执行追踪(Execution Tracker)技术规划
|
||||
|
||||
## 1. 背景与问题定义
|
||||
|
||||
当前 Lime 的执行入口分散在多个模块:
|
||||
|
||||
- `agent_cmd.rs`(通用 Agent 对话)
|
||||
- `skill_exec_cmd.rs`(Skill 执行)
|
||||
- `heartbeat_service/mod.rs`(定时任务/心跳执行)
|
||||
|
||||
虽然各自功能完整,但执行状态、错误语义、追踪字段和观测口径不一致,导致:
|
||||
|
||||
1. 故障排查链路长(跨表、跨日志、跨命令)
|
||||
2. 前端难以给出统一执行状态
|
||||
3. 后续接入新入口(如 IM、批处理)时容易重复造轮子
|
||||
4. 技术债风险:若“每个入口各写一套 run 逻辑”,将出现明显胶水代码
|
||||
|
||||
本规划目标是在不重写执行引擎的前提下,新增一个高内聚、低侵入的统一追踪层。
|
||||
|
||||
---
|
||||
|
||||
## 2. 目标与非目标
|
||||
|
||||
### 2.1 目标(Must Have)
|
||||
|
||||
1. 引入统一 `run` 语义模型(跨 chat/skill/heartbeat)
|
||||
2. 所有入口通过同一服务写入执行生命周期
|
||||
3. 统一状态枚举与错误归一化,消除字符串散落
|
||||
4. 支持灰度开关,可快速回滚
|
||||
5. 首期不影响既有执行能力和用户主流程
|
||||
|
||||
### 2.2 非目标(Not in Scope)
|
||||
|
||||
1. 不重构 Agent 执行引擎
|
||||
2. 不重做前端大页面
|
||||
3. 不在首期迁移历史数据
|
||||
4. 不引入复杂事件总线或新中间件框架
|
||||
|
||||
---
|
||||
|
||||
## 3. 设计原则(防“垃圾代码”约束)
|
||||
|
||||
1. **单点收敛**:仅新增一个核心模块 `execution_tracker`
|
||||
2. **边界接入**:只在命令/服务边界包裹,不侵入工具执行内部
|
||||
3. **幂等优先**:重复 finish/fail 不产生状态抖动
|
||||
4. **最小数据**:`agent_runs` 只存摘要索引,细节继续由现有表承载
|
||||
5. **先兼容后替换**:短期并存,验证后收敛,避免长期双写
|
||||
|
||||
---
|
||||
|
||||
## 4. 总体架构
|
||||
|
||||
### 4.1 新增模块
|
||||
|
||||
建议新增:`lime-rs/crates/services/src/execution_tracker.rs`
|
||||
|
||||
核心职责:
|
||||
|
||||
- 创建 run(start)
|
||||
- 更新 run(success/error/timeout/canceled)
|
||||
- 统一错误归一化
|
||||
- 提供 `with_run` 包装器减少入口代码重复
|
||||
|
||||
### 4.2 统一入口接口(示意)
|
||||
|
||||
```rust
|
||||
with_run(ctx, RunSource::Skill, Some("pptx"), Some(session_id), async {
|
||||
// 原有执行逻辑,不改
|
||||
})
|
||||
```
|
||||
|
||||
入口业务只关心“执行什么”,生命周期交给 tracker 处理。
|
||||
|
||||
---
|
||||
|
||||
## 5. 数据模型设计
|
||||
|
||||
## 5.1 新表:`agent_runs`
|
||||
|
||||
核心字段建议:
|
||||
|
||||
- `id`(TEXT, PK, run_id)
|
||||
- `source`(TEXT: `chat | skill | heartbeat`)
|
||||
- `source_ref`(TEXT,可选:skill 名称/heartbeat task id)
|
||||
- `session_id`(TEXT,可选)
|
||||
- `status`(TEXT: `queued | running | success | error | canceled | timeout`)
|
||||
- `started_at`(TEXT, ISO8601)
|
||||
- `finished_at`(TEXT,可空)
|
||||
- `duration_ms`(INTEGER,可空)
|
||||
- `error_code`(TEXT,可空)
|
||||
- `error_message`(TEXT,可空)
|
||||
- `metadata`(TEXT,可空,JSON 摘要)
|
||||
|
||||
### 5.2 索引建议
|
||||
|
||||
- `idx_agent_runs_source_started_at (source, started_at DESC)`
|
||||
- `idx_agent_runs_session_started_at (session_id, started_at DESC)`
|
||||
- `idx_agent_runs_status_started_at (status, started_at DESC)`
|
||||
|
||||
---
|
||||
|
||||
## 6. 统一状态与错误规范
|
||||
|
||||
## 6.1 状态机(最小版)
|
||||
|
||||
允许流转:
|
||||
|
||||
- `queued -> running`
|
||||
- `running -> success | error | timeout | canceled`
|
||||
|
||||
禁止回退与二次终态覆盖(幂等)。
|
||||
|
||||
### 6.2 错误归一化
|
||||
|
||||
统一输出:
|
||||
|
||||
- `error_code`:机器可读(如 `permission_denied` / `provider_unavailable`)
|
||||
- `error_message`:用户可读
|
||||
- `retryable`:仅内部使用(可放 metadata)
|
||||
|
||||
---
|
||||
|
||||
## 7. 接入点改造方案
|
||||
|
||||
## 7.1 `skill_exec_cmd.rs`(第一接入点)
|
||||
|
||||
原因:边界清晰、风险最低,适合作为 P0 首个落地。
|
||||
|
||||
做法:
|
||||
|
||||
- 在 `execute_skill` 外围包 `with_run`
|
||||
- `source = skill`
|
||||
- `source_ref = skill_name`
|
||||
- `session_id = 当前执行会话 id`
|
||||
|
||||
## 7.2 `agent_cmd.rs`
|
||||
|
||||
做法:
|
||||
|
||||
- 在会话执行入口处创建 run
|
||||
- 流式完成/异常时由 tracker 统一收敛状态
|
||||
- 复用错误归一化,不再各处拼接文本
|
||||
|
||||
## 7.3 `heartbeat_service/mod.rs`
|
||||
|
||||
做法:
|
||||
|
||||
- 每次任务执行都创建 run
|
||||
- `source = heartbeat`
|
||||
- `source_ref = task_id 或 task_description`
|
||||
- 首期可保留旧 `heartbeat_executions`,但需设置退场计划(见第 10 节)
|
||||
|
||||
---
|
||||
|
||||
## 8. 前端最小改造
|
||||
|
||||
1. 新增轻量查询接口(`list_runs/get_run`)
|
||||
2. 聊天与任务页面先展示统一状态徽标(不新增复杂页面)
|
||||
3. run 详情仍跳转现有日志与消息明细,避免重复 UI
|
||||
|
||||
---
|
||||
|
||||
## 9. 配置与灰度策略
|
||||
|
||||
新增配置建议:
|
||||
|
||||
- `agent.execution_tracker.enabled`(默认 `true`)
|
||||
- 环境变量覆盖:`PROXYCAST_EXECUTION_TRACKER_ENABLED`
|
||||
|
||||
灰度步骤:
|
||||
|
||||
1. 内部开启(开发/测试)
|
||||
2. 小流量开启(beta 用户)
|
||||
3. 全量开启后进入旧路径收敛阶段
|
||||
|
||||
---
|
||||
|
||||
## 10. 实施计划(P0)
|
||||
|
||||
### Phase A:基础能力(2-3 天)
|
||||
|
||||
1. 新建 `agent_runs` migration
|
||||
2. 实现 `execution_tracker` 服务 + `with_run`
|
||||
3. 新增 DAO 与单元测试
|
||||
|
||||
### Phase B:接入 Skill(1-2 天)
|
||||
|
||||
1. 接入 `skill_exec_cmd.rs`
|
||||
2. 验证状态流转与错误归一化
|
||||
3. 前端显示最小状态徽标
|
||||
|
||||
### Phase C:接入 Chat 与 Heartbeat(2-4 天)
|
||||
|
||||
1. 接入 `agent_cmd.rs`
|
||||
2. 接入 `heartbeat_service/mod.rs`
|
||||
3. 增加跨入口一致性测试
|
||||
|
||||
### Phase D:收敛与清理(1-2 天)
|
||||
|
||||
1. 标记旧追踪路径为 deprecated
|
||||
2. 清理重复状态转换代码
|
||||
3. 完成技术债登记与后续移除计划
|
||||
|
||||
---
|
||||
|
||||
## 11. 验收标准(架构 + 产品)
|
||||
|
||||
### 11.1 技术验收
|
||||
|
||||
1. run 覆盖率:chat/skill/heartbeat >= 90%
|
||||
2. 终态一致性:无“running 悬挂”记录
|
||||
3. 幂等性:重复 finish/fail 不改写终态
|
||||
|
||||
### 11.2 产品验收
|
||||
|
||||
1. 故障定位可追溯率 >= 95%
|
||||
2. 平均排障时间下降 >= 50%
|
||||
3. 前端状态一致性(同一执行在各页面状态一致)
|
||||
|
||||
---
|
||||
|
||||
## 12. 风险与应对
|
||||
|
||||
1. **状态竞争条件**:通过 DB 事务 + 终态幂等保护
|
||||
2. **双写长期化**:设置明确退场日期,进入 roadmap 追踪
|
||||
3. **性能回归**:metadata 严格控量,避免大字段写入
|
||||
4. **认知负担上升**:仅增加“run 摘要层”,不复制业务明细
|
||||
|
||||
---
|
||||
|
||||
## 13. 成功标准(Definition of Done)
|
||||
|
||||
满足以下条件即判定 P0 完成:
|
||||
|
||||
1. 三个执行入口全部接入 `execution_tracker`
|
||||
2. 至少一个统一查询接口可用于调试与 UI 展示
|
||||
3. 旧路径进入可下线状态(有迁移清单和时间点)
|
||||
4. 无新增重复生命周期逻辑(通过 code review checklist 约束)
|
||||
|
||||
@@ -345,11 +345,8 @@ Lime 当前已经有:
|
||||
- `npm run governance:legacy-report`
|
||||
- `scripts/report-legacy-surfaces.mjs`
|
||||
|
||||
同时我们也已经在 `internal/develop/` 下沉淀了不少退场与治理文档,例如:
|
||||
|
||||
- `execution-tracker-deprecation-plan.md`
|
||||
- `execution-tracker-p0-acceptance-report.md`
|
||||
|
||||
Execution Tracker 专项文档已在完成退场后从 active tree 删除;当前分类与回流规则统一由
|
||||
`internal/aiprompts/task-agent-taxonomy.md` 和 `internal/aiprompts/governance.md` 承接。
|
||||
这意味着 Lime 已经具备治理意识,但还可以更进一步:
|
||||
|
||||
### 建议做法
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
# Scheduler 任务治理 P1(连续失败 + 冷却恢复)
|
||||
|
||||
## 1. 目标
|
||||
|
||||
在不引入新子系统的前提下,为现有 `scheduled_tasks` 增加最小治理能力:
|
||||
|
||||
1. 连续失败计数(`consecutive_failures`)
|
||||
2. 自动停用冷却(`auto_disabled_until`)
|
||||
3. 冷却到期后自动恢复执行资格(无需人工启用)
|
||||
|
||||
## 2. 默认策略
|
||||
|
||||
- 连续失败阈值:`3`
|
||||
- 冷却时长:`300s`
|
||||
- 健康告警阈值(默认):
|
||||
- 冷却任务数 `>= 1`(warning)
|
||||
- 悬挂运行任务数 `>= 1`(critical)
|
||||
- 24h 失败数 `>= 5`(warning)
|
||||
- 适用入口:
|
||||
- `SchedulerService` 后台轮询执行链路
|
||||
- WebSocket RPC `cron.run` 手动触发链路
|
||||
|
||||
## 3. 数据模型与存储
|
||||
|
||||
`scheduled_tasks` 新增字段:
|
||||
|
||||
- `consecutive_failures INTEGER NOT NULL DEFAULT 0`
|
||||
- `auto_disabled_until TEXT NULL`(RFC3339)
|
||||
|
||||
兼容策略:
|
||||
|
||||
- `SchedulerDao::create_tables` 会自动检查并补齐缺失列(`PRAGMA table_info` + `ALTER TABLE`)
|
||||
|
||||
## 4. 行为定义
|
||||
|
||||
### 成功
|
||||
|
||||
- `mark_completed` 时重置治理状态:
|
||||
- `consecutive_failures = 0`
|
||||
- `retry_count = 0`
|
||||
- `auto_disabled_until = NULL`
|
||||
|
||||
### 失败
|
||||
|
||||
- `mark_failed` 时:
|
||||
- `consecutive_failures += 1`
|
||||
- `retry_count += 1`
|
||||
- 达到阈值后触发冷却:
|
||||
- 设置 `auto_disabled_until = now + cooldown_secs`
|
||||
|
||||
### 执行门控
|
||||
|
||||
- 任务在冷却窗口内:
|
||||
- `cron.run` 返回拒绝(cooldown)
|
||||
- `SchedulerService` 标记运行前会阻断执行
|
||||
- 冷却到期:
|
||||
- 自动恢复可执行(按时间条件放行)
|
||||
|
||||
## 5. 对外可见变化
|
||||
|
||||
- `cron.list` 的 `enabled` 在冷却中会返回 `false`
|
||||
- `cron.run` 对冷却任务返回参数错误,包含冷却截止时间
|
||||
- 新增 `cron.health` 聚合接口,返回状态分布、冷却任务数、悬挂运行数、24h 失败数、高风险任务 TopN
|
||||
- `cron.health` 新增告警输出(`alerts`),用于前端/远程入口直接消费
|
||||
- Telegram 入站新增 `/cron_health`,可直接查看治理概览
|
||||
- Tauri 命令新增 `get_heartbeat_task_health`(内部复用 `cron.health`),供设置页直接查询
|
||||
- Tauri 命令新增 `deliver_heartbeat_task_health_alerts`,可按当前 `heartbeat.delivery` 配置手动推送告警
|
||||
- 心跳设置页新增“任务健康概览”卡片,展示关键治理指标和高风险任务列表
|
||||
- 健康卡片新增“最近 24h 失败趋势”图(小时粒度)与“高风险任务详情”弹窗
|
||||
- 健康卡片新增“推送当前告警”按钮(Webhook/Telegram),用于运维手动触发通知闭环
|
||||
|
||||
## 6. 验证
|
||||
|
||||
关键测试:
|
||||
|
||||
- `lime-scheduler`:
|
||||
- `scheduler::tests::test_mark_task_failed_should_trigger_cooldown`
|
||||
- `dao::tests::test_create_tables_should_add_missing_columns_for_existing_table`
|
||||
- `lime-websocket`:
|
||||
- `handlers::rpc_handler::tests::test_cron_run_should_block_when_task_in_cooldown`
|
||||
@@ -19,31 +19,17 @@
|
||||
1. 计划不是一次性文档,推进状态变化时要同步更新
|
||||
2. 会改变实现顺序、范围或回滚策略的决策,必须记录在这里或链接到这里
|
||||
3. 清理类工作如果不能直接回挂路线图,应登记到 `tech-debt-tracker.md`
|
||||
4. 被替代的计划不要悬空,保留跳转说明或归档指针
|
||||
4. 被替代且无兼容负担的计划直接删除;仅在存在真实外部依赖或必须保留历史入口时,保留带退出条件的跳转说明或归档指针
|
||||
5. Agent / Runtime / Agent App / Skill / Managed Objective / Harness / GUI 主链改动应先填写 [Agent Verification Contract 模板](./templates/agent-verification-contract.md),明确预算标签、current 主链、Happy Path、Evidence Layers、必跑命令和 Agent QC 场景映射;普通开发默认低 token,不默认跑 full qcloop / live Provider。
|
||||
|
||||
## 关联入口
|
||||
|
||||
- 全仓文档事实源收敛:`internal/exec-plans/documentation-convergence-plan.md`
|
||||
- 路线图主线:`internal/roadmap/`
|
||||
- 参考运行时主链总计划:`internal/exec-plans/upstream-runtime-alignment-plan.md`
|
||||
- 参考运行时主链进度日志:`internal/exec-plans/upstream-runtime-alignment-progress.md`
|
||||
- Runtime 当前对齐入口:`internal/aiprompts/architecture.md` 与 `internal/exec-plans/codex-alignment-v1-coordination-plan.md`
|
||||
- Refactor v2 全项目 Gate A/B 验收计划:`internal/exec-plans/project-gate-a-b-acceptance-plan.md`
|
||||
- Lime v1.108.0 发布执行计划:`internal/exec-plans/release-v1.108.0-plan.md`
|
||||
- Lime v1.109.0 发布执行计划:`internal/exec-plans/release-v1.109.0-plan.md`
|
||||
- Lime v1.110.0 发布执行计划:`internal/exec-plans/release-v1.110.0-plan.md`
|
||||
- Lime v1.111.0 发布执行计划:`internal/exec-plans/release-v1.111.0-plan.md`
|
||||
- Lime v1.111.1 发布执行计划:`internal/exec-plans/release-v1.111.1-plan.md`
|
||||
- Lime v1.114.0 发布执行计划:`internal/exec-plans/release-v1.114.0-plan.md`
|
||||
- Lime v1.115.0 发布执行计划:`internal/exec-plans/release-v1.115.0-plan.md`
|
||||
- Lime v1.116.0 发布执行计划:`internal/exec-plans/release-v1.116.0-plan.md`
|
||||
- Lime v1.121.0 发布执行计划:`internal/exec-plans/release-v1.121.0-plan.md`
|
||||
- Lime v1.128.0 发布执行计划:`internal/exec-plans/release-v1.128.0-plan.md`
|
||||
- Lime v1.129.0 发布执行计划:`internal/exec-plans/release-v1.129.0-plan.md`
|
||||
- Lime v1.130.0 发布执行计划:`internal/exec-plans/release-v1.130.0-plan.md`
|
||||
- Lime v1.131.0 发布执行计划:`internal/exec-plans/release-v1.131.0-plan.md`
|
||||
- Lime v1.132.0 发布执行计划:`internal/exec-plans/release-v1.132.0-plan.md`
|
||||
- Lime v1.136.0 发布执行计划:`internal/exec-plans/release-v1.136.0-plan.md`
|
||||
- Lime v1.137.0 发布执行计划:`internal/exec-plans/release-v1.137.0-plan.md`
|
||||
- 当前发布执行计划:`internal/exec-plans/release-v1.139.0-plan.md`
|
||||
- 已结束版本的发布过程不保留在 active tree;结果以 Git tag、GitHub Release、Release Notes 与 Git history 为准。
|
||||
- Codex App GUI 对齐执行计划:`internal/exec-plans/codex-app-gui-alignment-plan.md`
|
||||
- Codex Desktop 跨平台底层对比与对齐计划:`internal/exec-plans/codex-desktop-platform-parity-plan.md`
|
||||
- Codex reasoning 投影与通知漂移修复:`internal/exec-plans/codex-reasoning-projection-and-notification-drift-fix.md`
|
||||
@@ -68,46 +54,26 @@
|
||||
- Right Surface 统一承载实施进度:`internal/exec-plans/right-surface-implementation-progress.md`
|
||||
- Soul Style 输出面收敛计划:`internal/exec-plans/soul-style-output-surface-convergence-plan.md`
|
||||
- Browser Runtime / Right Surface 骨架实施计划:`internal/exec-plans/browser-runtime-right-surface-plan.md`
|
||||
- Lime 多模态运行合同实施计划:`internal/exec-plans/multimodal-runtime-contract-plan.md`
|
||||
- Approval HITL Decision Model 执行计划:`internal/exec-plans/approval-hitl-decision-model-plan.md`
|
||||
- Agent Phase 6 Provider Reply Backend 执行计划:`internal/exec-plans/agent-phase6-provider-reply-backend-plan.md`
|
||||
- 云端套餐与支付边界收口计划:`internal/exec-plans/cloud-commerce-user-center-boundary.md`
|
||||
- `@` 命令本地执行纠偏计划:`internal/exec-plans/at-command-local-execution-alignment-plan.md`
|
||||
- Agent QC 运营级测试体系执行计划:`internal/exec-plans/agent-qc-ops-testing-plan.md`
|
||||
- Agent App v2 独立安装与 Runtime 底座拆分执行计划:`internal/exec-plans/agentapp-v2-standalone-runtime.md`
|
||||
- Plugin v3 标准化与旧实现清退计划:`internal/exec-plans/plugin-v3-standardization-and-retirement-plan.md`
|
||||
- AI 图层化设计实现计划:`internal/exec-plans/ai-layered-design-implementation-plan.md`
|
||||
- AI 图层化设计 current 路线图:`internal/roadmap/ai-layered-design/README.md`
|
||||
- 图片能力 feature-flag / extension-tool 执行计划:`internal/exec-plans/image-capability-feature-flag-extension-tool-plan.md`
|
||||
- 图片能力 feature-flag / extension-tool 进度:`internal/exec-plans/image-capability-feature-flag-extension-tool-progress.md`
|
||||
- 图片能力历史草案已清理,不再保留独立 refactor plan。
|
||||
- Soul Style 输出面收敛执行计划:`internal/exec-plans/soul-style-output-surface-convergence-plan.md`
|
||||
- Skill Forge P1A Capability Authoring 执行计划:`internal/exec-plans/skill-forge-capability-authoring-p1a-plan.md`
|
||||
- Skill Forge P1B Capability Verification 执行计划:`internal/exec-plans/skill-forge-capability-verification-p1b-plan.md`
|
||||
- Skill Forge P3 Capability Registration 执行计划:`internal/exec-plans/skill-forge-capability-registration-p3-plan.md`
|
||||
- Skill Forge P3B Capability Discovery 执行计划:`internal/exec-plans/skill-forge-capability-discovery-p3b-plan.md`
|
||||
- Skill Forge P3C Runtime Binding 执行计划:`internal/exec-plans/skill-forge-runtime-binding-p3c-plan.md`
|
||||
- Skill Forge P3D Query Loop Metadata 执行计划:`internal/exec-plans/skill-forge-query-loop-metadata-p3d-plan.md`
|
||||
- Skill Forge P3E Tool Runtime Authorization 执行计划:`internal/exec-plans/skill-forge-tool-runtime-authorization-p3e-plan.md`
|
||||
- Skill Forge P4 Managed Execution / Agent Envelope 执行计划:`internal/exec-plans/skill-forge-managed-agent-envelope-p4-plan.md`
|
||||
- Skill Forge P0-P4 完成审计:`internal/exec-plans/skill-forge-completion-audit.md`
|
||||
- Skill Forge Prompt-to-Artifact P5 执行计划:`internal/exec-plans/skill-forge-prompt-to-artifact-p5-plan.md`
|
||||
- Skill Forge Prompt-to-Artifact P5 样例审计:`internal/exec-plans/skill-forge-prompt-to-artifact-p5-audit.md`
|
||||
- Skill Forge P6 Read-Only HTTP API 执行计划:`internal/exec-plans/skill-forge-readonly-http-api-p6-plan.md`
|
||||
- Skill Forge P6 Read-Only HTTP API 完成审计:`internal/exec-plans/skill-forge-readonly-http-api-p6-audit.md`
|
||||
- Skill Forge P7 Read-Only HTTP API 执行授权计划:`internal/exec-plans/skill-forge-readonly-http-api-p7-plan.md`
|
||||
- Skill Forge P8 Read-Only HTTP API 注册 provenance 计划:`internal/exec-plans/skill-forge-readonly-http-api-p8-plan.md`
|
||||
- Skill Forge P9 Read-Only HTTP API 授权 artifact 消费门禁计划:`internal/exec-plans/skill-forge-readonly-http-api-p9-plan.md`
|
||||
- Skill Forge P10 Read-Only HTTP API completion audit 消费计划:`internal/exec-plans/skill-forge-readonly-http-api-p10-plan.md`
|
||||
- Skill current 事实源:`internal/aiprompts/skill-standard.md` 与 `internal/aiprompts/commands.md`
|
||||
- Skill Prompt 执行与历史保留计划:`internal/exec-plans/skill-prompt-execution-retention-plan.md`
|
||||
- LimeNext 总实施计划(`legacy current reference`,当前主规划已切到 `internal/roadmap/limenextv2/README.md`):`internal/exec-plans/limenext-plan.md`
|
||||
- LimeNext 推进日志:`internal/exec-plans/limenext-progress.md`
|
||||
- 技术债追踪:`internal/exec-plans/tech-debt-tracker.md`
|
||||
- 模块级实施细节:`internal/aiprompts/README.md`
|
||||
|
||||
## 当前命令迁移边界
|
||||
|
||||
- 生产命令 current 主链固定为 `Frontend -> Electron Desktop Host IPC -> App Server JSON-RPC -> RuntimeCore / services`。
|
||||
- `lime-rs/src/commands/**` 是旧 Tauri command wrapper 删除清理区,只允许迁出核心逻辑、撤 runner / DevBridge dispatcher / catalog / mock 注册、机械编译修复和删除旧 wrapper。
|
||||
- `lime-rs/src/commands/**` 已物理删除,只允许出现在负向回流守卫或不可变历史 evidence 中。
|
||||
- 新增 Rust 后端能力进入 App Server crates / RuntimeCore / services;桌面壳能力进入 Electron Desktop Host。
|
||||
- 任何执行计划如果仍需要在 `lime-rs/src/commands/**` 新增业务逻辑、API adapter、runtime 分支、compat wrapper、fail-closed stub、tombstone 或 thin facade,必须先改计划并登记 blocker,不能把该目录当完成态。
|
||||
- 任何执行计划如果要求恢复 `lime-rs/src/commands/**` 的业务逻辑、API adapter、runtime 分支、compat wrapper、fail-closed stub、tombstone 或 thin facade,必须直接改到 current owner,不能把已删除目录当实施落点。
|
||||
- 前端 `src/lib/dev-bridge/**` 按职责治理:`safeInvoke`、HTTP client、`app_server_handle_json_lines`、bridge availability / event listener capability 是 current renderer bridge;旧命令 policy / no-mock fallback 是迁移期 `compat / deprecated`;已迁旧命令名只能作为 `dead` / `test-only` guard。后续计划清命令时必须同步检查 policy、mock、fallback、旧 smoke 和 contract guard,不得把整目录删除当作默认治理动作;删不动且跨命令组长期存在的 residual 必须回挂 `tech-debt-tracker.md` 的 `CCD-012`。
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
> 关联路线图:`internal/roadmap/test/clawstream/README.md`
|
||||
> 关联账本:`internal/roadmap/test/clawstream/scenario-ledger.md`
|
||||
> 关联骨架:`internal/roadmap/test/clawstream/scenario-registry.json`
|
||||
> 关联主线:`internal/research/refactor/v1`
|
||||
> 关联主线:`internal/aiprompts/architecture.md`、`internal/aiprompts/query-loop.md`
|
||||
> S1 细化计划:`internal/exec-plans/clawstream-s1-p0-implementation-plan.md`
|
||||
|
||||
## 1. 主目标
|
||||
@@ -284,7 +284,6 @@ npm run verify:gui-smoke
|
||||
- 第二十六刀验证:`npx prettier --check "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationMessageListRuntime.ts" "src/components/agent/chat/workspace/useWorkspaceConversationMessageListRuntime.unit.test.tsx" "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" "src/components/agent/chat/hooks/agentStreamTextDeltaLifecycle.ts"`;`npx eslint "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationMessageListRuntime.ts" "src/components/agent/chat/workspace/useWorkspaceConversationMessageListRuntime.unit.test.tsx" "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" "src/components/agent/chat/hooks/agentStreamTextDeltaLifecycle.ts" --max-warnings 0`;`npx vitest run "src/components/agent/chat/workspace/useWorkspaceConversationMessageListRuntime.unit.test.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" --silent=passed-only --disableConsoleIntercept`(39 passed);组合回归 `npx vitest run "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.rightSurfaceGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationMessageListRuntime.unit.test.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/workspaceConversationRightSurfaceChrome.unit.test.ts" --silent=passed-only --disableConsoleIntercept`(53 passed);`npm run typecheck -- --pretty false`;`git diff --check` 覆盖本轮相关文件;`npm run verify:gui-smoke` 通过,覆盖 renderer build、Electron host build、app-server sidecar build、`app-server initialized protocol=appserver.v0 version=1.98.0`、`claw workbench shell ready` 与 `memory settings ready`。新增 source guard 要求父组件继续调用 `useWorkspaceConversationMessageListRuntime({`、scene 调用只传 `messageListRuntime,`,并禁止 `messageListRuntime: {` 回流;unit guard 证明 refresh read model 绑定当前 `sceneSessionId`。
|
||||
- Claw Workspace conversation scene runtime 测试第二十七刀拆分:新增 `useWorkspaceConversationSceneRuntime.testFixtures.tsx` 作为 current 测试 harness owner,承接 i18n / syntax highlighter mock、React hook mount / unmount、`createBaseParams`、`getRenderedSceneProps` 和 heavy session fixture;新增 `useWorkspaceConversationSceneRuntime.messageList.test.ts` 承接 message list current 契约、URL preview 透传和 restore / hydrate deferral 回归。原 `useWorkspaceConversationSceneRuntime.test.ts` 从 `1378` 行降到 `763` 行,退出 `1000` 行硬边界;新 message-list 分域测试 `263` 行,fixture `372` 行。`current` 是分域 scene runtime 测试 + 共享 fixture;旧“所有 scene runtime 测试和 hook harness 堆在单个 1000+ 行文件”的组织方式按 `dead` 回流路径处理,本轮无 `compat` / `deprecated`,也不改变生产代码。
|
||||
- 第二十七刀验证:`npx prettier --check "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.messageList.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.testFixtures.tsx"`;`npx eslint "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.messageList.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.testFixtures.tsx" --max-warnings 0`;`npx vitest run "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.messageList.test.ts" --silent=passed-only --disableConsoleIntercept`(27 passed);`npm run typecheck -- --pretty false`。本轮是 test-only 拆分,没有触碰 GUI 生产路径,因此未补跑 `npm run verify:gui-smoke`;GUI smoke 仍以上一刀通过记录为当前最近产品主路径证据。
|
||||
- Claw Workspace conversation scene runtime 测试第二十八刀拆分:新增 `useWorkspaceConversationSceneRuntime.taskRail.test.ts` 承接 Task Center task rail、pending/submitted actions、threadRead / child subagent facts、session progress panel 和 task rail output open 回归;新增 `useWorkspaceConversationSceneRuntime.codingWorkbench.test.ts` 承接 workspaceView、项目根优先、coding workbench output/log/change view 与默认 / task-center coding chrome 回归。原 `useWorkspaceConversationSceneRuntime.test.ts` 从 `763` 行继续降到 `124` 行,只保留基础 scene chrome、canvas close/layout、Harness toggle、landing empty-state 和 SceneApp summary 透传断言;各分域文件均低于 `400` 行。`current` 是 `basic scene / messageList / taskRail / codingWorkbench / shared fixture` 分域测试;旧“scene runtime 相关所有投影断言继续回流主测试文件”的组织方式按 `dead` 回流路径处理,本轮无 `compat` / `deprecated`,也不改变生产代码。
|
||||
- 第二十八刀验证:`npx prettier --write "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.messageList.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.taskRail.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.codingWorkbench.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.testFixtures.tsx"`;`npx eslint "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.messageList.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.taskRail.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.codingWorkbench.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.testFixtures.tsx" --max-warnings 0`;`npx vitest run "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.messageList.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.taskRail.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.codingWorkbench.test.ts" --silent=passed-only --disableConsoleIntercept`(27 passed);`npm run typecheck -- --pretty false`;`git diff --check` 覆盖已跟踪测试文件。本轮仍是 test-only 拆分,未触碰 GUI 生产路径,因此未补跑 `npm run verify:gui-smoke`。
|
||||
- Claw Workspace artifact open 第二十九刀收敛:新增 `useWorkspaceArtifactOpenRuntime` 作为 current artifact / 文件预览动作 owner,统一承接 artifact document 保存、基础 artifact / file open、右侧 Article Workspace artifact open、消息附件预览、media reference 分页 toolbar、URL preview、message preview、timeline artifact open、initial project file open 和 service skill 结果文件打开接线;同时把 artifact document snapshot 保存拆入 `useWorkspaceArtifactDocumentSaveRuntime`,把 service skill 结果文件目标与打开动作拆入 `useWorkspaceServiceSkillResultFileRuntime`,避免新 owner 继续踩 `800` 行预警。`AgentChatWorkspace.tsx` 从 `4357` 行降到 `3733` 行,`useWorkspaceArtifactOpenRuntime.tsx` 为 `741` 行,两个小 owner 分别为 `82` / `119` 行。`current` 是 `useWorkspaceArtifactOpenRuntime` + 两个小 runtime;父组件内联 `handleSaveArtifactDocument`、`handleWorkspaceFileClick`、`openProjectFilePreviewInCanvas`、`openMessageAttachmentPreview`、`handleOpenMessagePreview`、`handleOpenArtifactFromTimeline`、`handleOpenServiceSkillResultFile`、`handledInitialProjectFileOpenSignatureRef` 等动作按 `dead` 回流路径处理,本轮无 `compat` / `deprecated`。
|
||||
- 第二十九刀验证:`npx prettier --write "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceArtifactOpenRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactDocumentSaveRuntime.ts" "src/components/agent/chat/workspace/useWorkspaceServiceSkillResultFileRuntime.ts"`;`npx eslint "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceArtifactOpenRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactDocumentSaveRuntime.ts" "src/components/agent/chat/workspace/useWorkspaceServiceSkillResultFileRuntime.ts" --max-warnings 0`;`npx vitest run "src/components/agent/chat/AgentChatWorkspace.workspaceBoundaryGuard.test.ts" --silent=passed-only --disableConsoleIntercept`(11 passed);`npx vitest run "src/components/agent/chat/workspace/workspaceArtifactDocumentSaveEvidence.unit.test.ts" "src/components/agent/chat/workspace/serviceSkillResultFileTarget.test.ts" "src/components/agent/chat/workspace/useWorkspaceRightSurfaceArtifactOpenRuntime.unit.test.tsx" --silent=passed-only --disableConsoleIntercept`(10 passed);`npm run typecheck -- --pretty false`;`git diff --check` 覆盖本轮文件;`npm run smoke:agent-runtime-current-fixture` 完整通过,覆盖 Claw 首页、Coding Workbench、图片命令、media reference、Expert / Skills Runtime、Multi-Agent、MCP structuredContent、Content Factory Article Editor 等 current Electron fixture,`liveProviderUsed=false`。`npm run verify:gui-smoke` 已完成 renderer build、Electron host build、desktop assets build,但在 `electron:build:app-server-assets` 编译未触碰 Rust sidecar 时失败:`lime-rs/crates/agent/src/request_tool_policy/agent_reply_backend_adapter.rs:186` 少传 `initial_turn_id`,`agent_reply_stream_adapter.rs:84` 调用 `persist_agent_item_event` 少传 `runtime_store`;这些 Rust 文件不在本轮写集,GUI smoke 暂不能记为通过。
|
||||
@@ -332,7 +331,6 @@ npm run verify:gui-smoke
|
||||
- Plugin history restore 验证:`npx prettier --check "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" "src/components/agent/chat/workspace/useWorkspacePluginHistoryRestoreRuntime.tsx" "src/components/agent/chat/workspace/useWorkspacePluginHistoryRestoreRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceShellChromeRuntime.ts" "src/components/agent/chat/workspace/workspaceShellChromeRuntime.ts" "internal/exec-plans/clawstream-codex-derived-guardrail-plan.md"`;`npx eslint "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" "src/components/agent/chat/workspace/useWorkspacePluginHistoryRestoreRuntime.tsx" "src/components/agent/chat/workspace/useWorkspacePluginHistoryRestoreRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceShellChromeRuntime.ts" "src/components/agent/chat/workspace/workspaceShellChromeRuntime.ts" --max-warnings 0`;`npx vitest run "src/components/agent/chat/workspace/useWorkspacePluginHistoryRestoreRuntime.test.tsx" "src/components/agent/chat/workspace/workspacePluginHistoryRestoreRuntime.unit.test.ts" "src/components/agent/chat/workspace/workspacePluginHistoryRestoreLanding.unit.test.ts" "src/components/agent/chat/workspace/workspacePluginHistoryRestoreArtifacts.unit.test.ts" "src/components/agent/chat/workspace/WorkspacePluginHistoryRestoreLandingCard.test.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" --silent=passed-only --disableConsoleIntercept`(36 passed);`npm run typecheck -- --pretty false`;`npm run verify:gui-smoke` 通过,覆盖 renderer loaded、App Server initialized、Claw workbench shell ready 与 memory settings ready;`APP_SERVER_BIN="/Users/coso/Documents/dev/ai/aiclientproxy/lime/dist-electron/app-server/darwin-arm64/app-server" LIME_ELECTRON_FIXTURE_BUILD_READY=1 npm run smoke:agent-runtime-current-fixture` 完整通过,覆盖 history/cache hydration、首页首发与短问候、Coding Workbench、图片命令、普通画图、停止继续、approval、Inputbar rich restore / pending steer、Plan hydrate、Skills Runtime、Multi-Agent、MCP structuredContent、media reference、Expert Skills / Plaza / Panel 和 Content Factory Article Editor,`liveProviderUsed=false`;`git diff --check` 覆盖本轮文件。新增 hook 回归证明无历史 metadata 时不渲染 landing card,artifact preview 点击会生成 source-backed artifact、写入通用 artifact store 并交给既有 workspace artifact current owner 打开;source guard 禁止 projection / preview / JSX 回流父组件。
|
||||
- Claw Workspace Service Skill execution card 第十八刀拆分:新增 `useWorkspaceServiceSkillExecutionCardRuntime` 作为 current presentation/action owner,承接站点技能执行卡片 JSX、blocked-only 浏览器工作台动作注入、正式结果文件优先打开和保存内容打开接线;`AgentChatWorkspace.tsx` 不再直接导入或组装 `ServiceSkillExecutionCard`,也不再内联判断 `siteSkillExecutionState.phase === "blocked"`。父组件从 `4359` 行降到 `4344` 行,新 runtime 为 `51` 行;父组件重新导入组件、内联卡片 JSX 或恢复 blocked phase 判断的写法按 `dead` 回流路径处理,本轮无 `compat` / `deprecated` 保留。
|
||||
- Service Skill execution card 验证:`npx prettier --check "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceServiceSkillExecutionCardRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceServiceSkillExecutionCardRuntime.test.tsx"`;`npx eslint "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceServiceSkillExecutionCardRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceServiceSkillExecutionCardRuntime.test.tsx" "src/components/agent/chat/workspace/ServiceSkillExecutionCard.tsx" "src/components/agent/chat/workspace/ServiceSkillExecutionCard.test.tsx" --max-warnings 0`;`npx vitest run "src/components/agent/chat/workspace/useWorkspaceServiceSkillExecutionCardRuntime.test.tsx" "src/components/agent/chat/workspace/ServiceSkillExecutionCard.test.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" --silent=passed-only --disableConsoleIntercept`(26 passed);`npm run typecheck -- --pretty false`;`npm run verify:gui-smoke` 通过,覆盖 renderer loaded、App Server initialized、Claw workbench shell ready 与 memory settings ready;`git diff --check` 覆盖本轮文件。新增 hook 回归证明空状态不渲染、blocked 状态保留浏览器工作台入口、success 状态优先打开正式结果文件且不再注入浏览器动作;source guard 禁止卡片 import / JSX / blocked phase 判断回流父组件。
|
||||
- Claw Workspace conversation landing surface 第十九刀拆分:新增 `useWorkspaceConversationLandingSurfaceRuntime` 作为 current landing / empty-state projection owner,集中承接入口 banner、creation replay、SceneApp / Plugin history / Service Skill leading card 与 `EmptyState` props 组装;`WorkspaceConversationScene.tsx` 只消费 `landingSurface`,`useWorkspaceConversationSceneRuntime.tsx` 不再暴露 landing / empty-state 的超宽扁平参数面,也不再直接调用 `buildWorkspaceEmptyStateProps`。同时删除 scene leading content 中重复渲染两次 `serviceSkillExecutionCard` 的旧分支。父组件因显式接入新 owner 从 `4344` 行短期增至 `4377` 行,但 scene runtime 从 `1031` 行降至 `824` 行、scene 组件从约 `999` 行降至 `639` 行,新 landing owner 为 `486` 行;下一刀应继续把仍处于 `800` 行预警线上的 scene runtime 按消息列表 / runtime task / empty-state extension 投影拆分。`current` 是 `useWorkspaceConversationLandingSurfaceRuntime` + `landingSurface` 契约;scene runtime / scene 组件 / 父组件调用点中的 landing 扁平 props、scene 内直接 empty-state builder 调用和重复 Service Skill 卡片渲染均按 `dead` 回流路径处理,本轮无 `compat` / `deprecated` 保留。
|
||||
- Conversation landing surface 验证:`npx prettier --check` 与 `npx eslint --max-warnings 0` 覆盖 `AgentChatWorkspace.tsx`、conversation landing / scene runtime、scene 组件、对应测试与 source guard;`npx vitest run "src/components/agent/chat/workspace/useWorkspaceConversationLandingSurfaceRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/WorkspaceConversationScene.test.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" --silent=passed-only --disableConsoleIntercept`(66 passed);`npm run typecheck -- --pretty false`;`npm run verify:gui-smoke` 通过,覆盖 renderer loaded、App Server initialized、Claw workbench shell ready 与 memory settings ready;`APP_SERVER_BIN="/Users/coso/Documents/dev/ai/aiclientproxy/lime/dist-electron/app-server/darwin-arm64/app-server" LIME_ELECTRON_FIXTURE_BUILD_READY=1 npm run smoke:agent-runtime-current-fixture` 完整通过,覆盖 history/cache hydration、首页首发与短问候、Coding Workbench、图片命令、普通画图、停止继续、approval、Inputbar rich restore / pending steer、Plan hydrate、Skills Runtime、Multi-Agent、MCP structuredContent、media reference、Expert Skills / Plaza / Panel 和 Content Factory Article Editor,`liveProviderUsed=false`;`git diff --check` 覆盖本轮文件。新增 landing owner 回归覆盖 leading card / Service Skill props、Task Center 隐藏最近会话恢复和 chat tool preference 回写;source guard 禁止 scene runtime 调用点恢复 landing 扁平参数、scene 组件 / scene runtime 重新调用 `buildWorkspaceEmptyStateProps`。
|
||||
- Claw Workspace conversation landing session 第二十刀收敛:在 `useWorkspaceConversationLandingSurfaceRuntime` 内新增 `useWorkspaceConversationLandingSessionRuntime` 作为 current landing session extension owner,统一承接非聊天布局的 `runtimeTaskCard`、memory workbench / channels / Chrome Relay runtime entry action projection,以及 `emptyStateProps` 的 runtime action 注入;`useWorkspaceConversationSceneRuntime.tsx` 不再 import / 调用 `buildAgentTaskRuntimeCardModel`,不再展开 `...landingSurface.emptyStateProps`,也不再构造 `landingSurfaceWithSceneRuntime`。scene runtime 从 `824` 行降至 `791` 行并退出 `800` 行预警,landing owner 从 `486` 行增至 `587` 行,父组件保持 `4377` 行。`current` 是 landing owner 内的 session extension 与 `landingSurface` 契约;scene runtime 内 runtime card builder、empty-state props 展开和二次 landing surface 包装均按 `dead` 回流路径处理,本轮无 `compat` / `deprecated` 保留。
|
||||
- Conversation landing session 验证:`npx eslint "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceConversationLandingSurfaceRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationLandingSurfaceRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/workspace/WorkspaceConversationScene.tsx" "src/components/agent/chat/workspace/WorkspaceConversationScene.test.tsx" --max-warnings 0`;`npx vitest run "src/components/agent/chat/workspace/WorkspaceConversationScene.test.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationLandingSurfaceRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.test.ts" "src/components/agent/chat/AgentChatWorkspace.inputRestoreGuard.test.ts" --silent=passed-only --disableConsoleIntercept`(68 passed);`npm run typecheck -- --pretty false`;`npm run verify:gui-smoke` 通过,覆盖 renderer loaded、App Server initialized、Claw workbench shell ready 与 memory settings ready;`APP_SERVER_BIN="/Users/coso/Documents/dev/ai/aiclientproxy/lime/dist-electron/app-server/darwin-arm64/app-server" LIME_ELECTRON_FIXTURE_BUILD_READY=1 npm run smoke:agent-runtime-current-fixture` 完整通过,覆盖 history/cache hydration、turn_completed 工具收尾、Claw 终态 UI、Electron fixture guard、首页首发热路径与短问候、Coding Workbench、图片命令、普通画图意图、cancel-then-continue、approval allow/decline/cancel/full-access、Inputbar rich restore / pending steer、Plan hydrate、Skills Runtime、Multi-Agent、MCP structuredContent、media contentParts、Expert Skills / Plaza / Panel 和 Content Factory Article Editor,`liveProviderUsed=false`;`git diff --check` 覆盖相关文件。source guard 禁止 scene runtime 恢复 `buildAgentTaskRuntimeCardModel({`、`...landingSurface.emptyStateProps` 与 `landingSurfaceWithSceneRuntime`,并要求 landing owner 继续持有 builder 与 empty-state props 展开。
|
||||
@@ -508,7 +506,6 @@ npm run verify:gui-smoke
|
||||
- 第四十三刀验证:`npx prettier --write "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactCanvasRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.artifactSelectionBoundaryGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.browserAssistCanvasBoundaryGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.browserAssistRequestBoundaryGuard.test.ts"`;`rg` 确认父组件已无 `useWorkspaceArtifactSelectionRuntime(`、`useWorkspaceArtifactStoreRuntime(`、`useWorkspaceArtifactViewModeControl(`、`useWorkspaceBrowserAssistCanvasRuntime(`;`npx eslint --max-warnings 0 "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactCanvasRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.artifactSelectionBoundaryGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.browserAssistCanvasBoundaryGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.browserAssistRequestBoundaryGuard.test.ts"`;`npx vitest run "src/components/agent/chat/AgentChatWorkspace.artifactSelectionBoundaryGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.browserAssistCanvasBoundaryGuard.test.ts" "src/components/agent/chat/AgentChatWorkspace.browserAssistRequestBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceCanvasLayoutRuntime.test.tsx"`(11 passed);`npx vitest run "src/components/agent/chat/workspace/useWorkspaceBrowserAssistRuntime.test.tsx" "src/components/agent/chat/workspace/workspaceBrowserAssistControl.unit.test.ts" "src/components/agent/chat/workspace/browserAssistArtifact.unit.test.ts" "src/components/agent/chat/workspace/workspaceBrowserRuntimeNavigation.unit.test.ts" "src/components/agent/chat/workspace/workspaceBrowserSessionRef.unit.test.ts"`(35 passed);`npm run typecheck -- --pretty false`;`npm run smoke:agent-runtime-current-fixture` 完整通过,覆盖 history/cache hydration、turn_completed、Claw 首页、Coding Workbench、图片命令、普通画图、cancel-then-continue、approval、Inputbar restore / pending steer、Plan hydrate、Skills Runtime、Multi-Agent、MCP structuredContent、media reference、Expert Skills / Plaza / Panel、Content Factory Article Editor,`liveProviderUsed=false`;`git diff --check` 覆盖本轮 TS 写集。`XDG_CONFIG_HOME="$PWD/.lime/gui-smoke-config" npm run verify:gui-smoke` 的 renderer / Electron host / preload / desktop assets 构建通过,但 app-server sidecar Cargo build 被并行 Rust `agent-compat` 脏写集阻塞:`crates/agent-compat/src/lib.rs` 找不到 `tools` 模块,且 `agents/agent.rs`、`agents/reply_parts.rs` 存在多处 `E0282` 类型推断错误;GUI smoke 本轮仍不能记为通过。
|
||||
- Claw Workspace artifact action runtime 第四十四刀快速拆分:新增 `useWorkspaceArtifactActionRuntime` 作为 current artifact write/open 组合 owner,集中组合 `useWorkspaceWriteFileAction`、`handleWriteFileRef` 同步和 `useWorkspaceArtifactOpenRuntime`;`AgentChatWorkspace.tsx` 只保留一次 artifact action runtime 调用,不再分别维护 write-file hook、ref effect 和 artifact-open hook。父组件从 `3225` 行降到 `3200` 行,新 owner 为 `141` 行,新增独立 artifact action boundary guard 为 `28` 行。`current` 是 `useWorkspaceArtifactActionRuntime` + 既有 write/open owners;父组件直接调用 `useWorkspaceWriteFileAction`、`useWorkspaceArtifactOpenRuntime` 或手写 `handleWriteFileRef.current = handleWriteFile` 的写法按 `dead` 回流路径处理,本轮无 `compat` / `deprecated`。
|
||||
- 第四十四刀验证:`npx prettier --write "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactActionRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.artifactActionBoundaryGuard.test.ts"`;`rg` 确认父组件已无 `useWorkspaceWriteFileAction(` 与 `useWorkspaceArtifactOpenRuntime(`;`npx eslint --max-warnings 0 "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactActionRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.artifactActionBoundaryGuard.test.ts"`;`npm run typecheck -- --pretty false` 通过;`npx vitest run "src/components/agent/chat/AgentChatWorkspace.artifactActionBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceWriteFileAction.test.tsx"`(9 passed)。本轮按用户要求快速拆分,没有重跑 `smoke:agent-runtime-current-fixture` / `verify:gui-smoke`;GUI smoke 仍受第四十三刀记录的并行 Rust `agent-compat` 脏写集阻塞。
|
||||
- Claw Workspace artifact surface runtime 第四十五刀快速拆分:新增 `useWorkspaceArtifactSurfaceRuntime` 作为 current artifact surface 组合 owner,集中组合 plugin history restore landing card、service skill execution card、scene app execution summary/review surface 和 timeline jump handler;`AgentChatWorkspace.tsx` 不再直接调用 `useWorkspacePluginHistoryRestoreRuntime`、`useWorkspaceServiceSkillExecutionCardRuntime`、`useWorkspaceSceneAppExecutionSurfaceRuntime`,也不再内联 `handleJumpToTimelineItem`。父组件从 `3200` 行降到 `3189` 行,新 owner 为 `60` 行,新增独立 artifact surface boundary guard 为 `31` 行。`current` 是 `useWorkspaceArtifactSurfaceRuntime` + 既有 surface owners;父组件直接拼 plugin/service/scene-app surface 与 timeline jump 的写法按 `dead` 回流路径处理,本轮无 `compat` / `deprecated`。
|
||||
- 第四十五刀验证:`npx prettier --write "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactSurfaceRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.artifactSurfaceBoundaryGuard.test.ts"`;`npx eslint --max-warnings 0 "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceArtifactSurfaceRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.artifactSurfaceBoundaryGuard.test.ts"`;`npx vitest run "src/components/agent/chat/AgentChatWorkspace.artifactSurfaceBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspacePluginHistoryRestoreRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceServiceSkillExecutionCardRuntime.test.tsx"`(6 passed)。`npm run typecheck -- --pretty false` 被当前无关文件 `src/components/agent/chat/hooks/agentStreamRuntimeHandler.ts` 的既有 `TS2345` 阻塞:`AgentEventImageTaskCreated` 不能作为 `Record<string, unknown>` 参数传入;该文件不在本轮写集,本轮未继续修旁支。
|
||||
- Claw Workspace media task runtime 第四十六刀快速拆分:新增 `useWorkspaceMediaTaskRuntime` 作为 current media task 组合 owner,集中组合 image workbench event、video/audio/transcription task preview 和 video task action 五个运行态;`AgentChatWorkspace.tsx` 不再直接调用 `useWorkspaceImageWorkbenchEventRuntime`、`useWorkspaceVideoTaskPreviewRuntime`、`useWorkspaceAudioTaskPreviewRuntime`、`useWorkspaceTranscriptionTaskPreviewRuntime`、`useWorkspaceVideoTaskActionRuntime`。父组件从 `3189` 行降到 `3166` 行,新 owner 为 `73` 行,新增独立 media task boundary guard 为 `33` 行。`current` 是 `useWorkspaceMediaTaskRuntime` + 既有 media task owners;父组件直接拼媒体任务 preview/action hook 的写法按 `dead` 回流路径处理,本轮无 `compat` / `deprecated`。
|
||||
- 第四十六刀验证:`npx prettier --write "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceMediaTaskRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.mediaTaskBoundaryGuard.test.ts"`;`npx eslint --max-warnings 0 "src/components/agent/chat/AgentChatWorkspace.tsx" "src/components/agent/chat/workspace/useWorkspaceMediaTaskRuntime.ts" "src/components/agent/chat/AgentChatWorkspace.mediaTaskBoundaryGuard.test.ts"`;`npx vitest run "src/components/agent/chat/AgentChatWorkspace.mediaTaskBoundaryGuard.test.ts" "src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceImageWorkbenchActionRuntime.documentApply.test.tsx"`(12 passed);`npx vitest run "src/components/agent/chat/workspace/useWorkspaceAudioTaskPreviewRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceVideoTaskPreviewRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceTranscriptionTaskPreviewRuntime.test.tsx" "src/components/agent/chat/workspace/useWorkspaceVideoTaskActionRuntime.test.tsx"`(19 passed)。本轮按用户要求快速拆分,没有重跑 typecheck / GUI smoke;typecheck 和 GUI smoke 的已知阻塞仍分别是第四十五刀与第四十三刀记录的无关脏写集。
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
> status: active / D0-desktop-baseline-blocked -> D2-D3-complete -> D4-multi-agent-durable-complete -> D4-windows-enforcement-phase
|
||||
> owner: agent-ui + app-server
|
||||
> started: 2026-07-18
|
||||
> last reviewed: 2026-09-01
|
||||
> last reviewed: 2026-09-02
|
||||
> target: Codex App GUI interaction model
|
||||
> backend reference: `/Users/coso/Documents/dev/rust/codex/codex-rs`
|
||||
> architecture baseline: `internal/aiprompts/architecture.md`
|
||||
@@ -79,27 +79,27 @@ Codex App 只作为 GUI 信息架构和交互层级参考;后端 Thread/Turn/I
|
||||
|
||||
### 3.6 跨层语义差距(Codex runtime 参考)
|
||||
|
||||
| 领域 | Codex-rs 参考能力 | Lime current | 尚未对齐 | owner / 优先级 |
|
||||
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
|
||||
| Windows sandbox | restricted token、ACL/DACL read-back、ConPTY、Job Object、网络隔离和 packaged resource 守卫 | `windowsSandbox/setupStart` 等协议与 `tool-runtime::windows_setup` 已有;真实 `windows-2022` CI security matrix 与 provision 7/7 通过 | packaged sidecar/runtime 全路径与 Windows Electron Gate B 尚未完成 | tool-runtime + app-server / P0 |
|
||||
| Permission profile | config layer/managed requirements、动态 allowed、custom profile、deny-read 和 cwd 解析 | 三个内置 profile、动态 `allowed`、cwd 物化、全局 sandbox config/platform/setup readiness、Thread/Turn/settings lowering 与 GUI 提交前查询已实现 | custom profile、deny-read、MDM/project-local requirements 与真实 Windows packaged enforcement 未实现;cwd 没有 project-local policy layer | app-server + tool-runtime / P1 |
|
||||
| ThreadStore lifecycle | live writer、flush/shutdown/discard、history materialization、latest model context、paginated fork lineage、ordinal/offset repair | canonical SQLite projection、sequence/cursor、revert、paginated Fork、干净重启和 crash-tail repair 已有 | 已完成:合法 unterminated record 保留、非法尾部按 byte offset 截断、sequence gap 续写、中段损坏 fail closed;同步 writer 无额外 pending buffer | thread-store + app-server / done |
|
||||
| Multi-Agent | parent-child registry、resident unload/reload、execution limiter、control tools、durable graph/mailbox | graph、mailbox、control gateway、activity projection、parent-owned child canonical resume、capacity/residency cold restart 均有受控 fixture 与 Gate B | 真实 Windows packaged enforcement 与跨平台资源限制仍待平台证据;Multi-Agent current 语义本身已收口 | agent-runtime + thread-store / done |
|
||||
| 领域 | Codex-rs 参考能力 | Lime current | 尚未对齐 | owner / 优先级 |
|
||||
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
|
||||
| Windows sandbox | restricted token、ACL/DACL read-back、ConPTY、Job Object、网络隔离和 packaged resource 守卫 | `windowsSandbox/setupStart` 等协议与 `tool-runtime::windows_setup` 已有;真实 `windows-2022` CI security matrix 与 provision 7/7 通过 | packaged sidecar/runtime 全路径与 Windows Electron Gate B 尚未完成 | tool-runtime + app-server / P0 |
|
||||
| Permission profile | config layer/managed requirements、动态 allowed、custom profile、deny-read 和 cwd 解析 | 三个内置 profile、动态 `allowed`、cwd 物化、全局 sandbox config/platform/setup readiness、Thread/Turn/settings lowering 与 GUI 提交前查询已实现 | custom profile、deny-read、MDM/project-local requirements 与真实 Windows packaged enforcement 未实现;cwd 没有 project-local policy layer | app-server + tool-runtime / P1 |
|
||||
| ThreadStore lifecycle | live writer、flush/shutdown/discard、history materialization、latest model context、paginated fork lineage、ordinal/offset repair | canonical SQLite projection、sequence/cursor、revert、paginated Fork、干净重启和 crash-tail repair 已有 | 已完成:合法 unterminated record 保留、非法尾部按 byte offset 截断、sequence gap 续写、中段损坏 fail closed;同步 writer 无额外 pending buffer | thread-store + app-server / done |
|
||||
| Multi-Agent | parent-child registry、resident unload/reload、execution limiter、control tools、durable graph/mailbox | graph、mailbox、control gateway、activity projection、parent-owned child canonical resume、capacity/residency cold restart 均有受控 fixture 与 Gate B | 真实 Windows packaged enforcement 与跨平台资源限制仍待平台证据;Multi-Agent current 语义本身已收口 | agent-runtime + thread-store / done |
|
||||
|
||||
## 4. 差距优先级
|
||||
|
||||
| 优先级 | 目标 | 当前差距 | 依赖 |
|
||||
| ------ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
|
||||
| P0 | 当前 Thread 成为主画布对象 | 全局 Sidebar 需要保留,但项目 tabs、任务 tabs 和消息区仍竞争上下文;活跃任务页头不稳定 | GUI-only,可先做 |
|
||||
| P0 | 单一 canonical 时间线 | commentary、reasoning、tool、状态摘要存在重复渲染与过量纵向展开 | `thread/read` Item projection |
|
||||
| P0 | 单一 action-required 入口 | Approval/Plan/request-user-input 可同时出现在输入区、时间线和环境任务轨道 | canonical Approval/Plan Item |
|
||||
| P0 | 写链对齐 Codex-rs | GUI 仍由 session-oriented hooks 与 `agentSession/event/*` 历史绑定承接部分生命周期;current 主写应明确落到 `thread/*`、`turn/*` | App Server protocol/runtime |
|
||||
| P1 | Thread 绑定的环境面 | 现有环境浮层只读 project Git,且把任务轨道混入环境面;缺 environment identity/status | `environment/*` + project Git |
|
||||
| P1 | 变更审查闭环 | 已有 diff/workbench,但环境面没有增删行、比较基线和进入 review 的明确动作 | project Git + workbench command |
|
||||
| done | ThreadStore 崩溃恢复 | partial JSONL、byte offset/sequence gap repair、同步 writer close 与 delete/discard 已由 D4 第一阶段收口 | thread-store + App Server |
|
||||
| P1 | Composer 稳定 | 首页与会话输入区形态、装饰和高度变化明显;运行态/排队态入口分散 | command model |
|
||||
| P2 | 产品/诊断分层 | Harness、Trace、Shell、Browser、Workbench 在主 Toolbar 近似等权 | 右侧 surface catalog |
|
||||
| excluded | 首页 Banner / 皮肤 Hero | 按用户裁决保留现有首页视觉,不纳入 Codex App 对齐范围 | product scope |
|
||||
| 优先级 | 目标 | 当前差距 | 依赖 |
|
||||
| -------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
|
||||
| P0 | 当前 Thread 成为主画布对象 | 全局 Sidebar 需要保留,但项目 tabs、任务 tabs 和消息区仍竞争上下文;活跃任务页头不稳定 | GUI-only,可先做 |
|
||||
| P0 | 单一 canonical 时间线 | commentary、reasoning、tool、状态摘要存在重复渲染与过量纵向展开 | `thread/read` Item projection |
|
||||
| P0 | 单一 action-required 入口 | Approval/Plan/request-user-input 可同时出现在输入区、时间线和环境任务轨道 | canonical Approval/Plan Item |
|
||||
| P0 | 写链对齐 Codex-rs | GUI 仍由 session-oriented hooks 与 `agentSession/event/*` 历史绑定承接部分生命周期;current 主写应明确落到 `thread/*`、`turn/*` | App Server protocol/runtime |
|
||||
| P1 | Thread 绑定的环境面 | 现有环境浮层只读 project Git,且把任务轨道混入环境面;缺 environment identity/status | `environment/*` + project Git |
|
||||
| P1 | 变更审查闭环 | 已有 diff/workbench,但环境面没有增删行、比较基线和进入 review 的明确动作 | project Git + workbench command |
|
||||
| done | ThreadStore 崩溃恢复 | partial JSONL、byte offset/sequence gap repair、同步 writer close 与 delete/discard 已由 D4 第一阶段收口 | thread-store + App Server |
|
||||
| P1 | Composer 稳定 | 首页与会话输入区形态、装饰和高度变化明显;运行态/排队态入口分散 | command model |
|
||||
| P2 | 产品/诊断分层 | Harness、Trace、Shell、Browser、Workbench 在主 Toolbar 近似等权 | 右侧 surface catalog |
|
||||
| excluded | 首页 Banner / 皮肤 Hero | 按用户裁决保留现有首页视觉,不纳入 Codex App 对齐范围 | product scope |
|
||||
|
||||
## 5. 实施切片
|
||||
|
||||
@@ -636,3 +636,46 @@ D0-D4 的退出条件全部满足,Gate A 与真实 Electron Gate B 证据可
|
||||
- 本地发布门禁已通过:`npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run smoke:agent-runtime-current-fixture`、定向 Vitest 36/36、目标 ESLint、`git diff --check`。`npm run verify:gui-smoke` 最新 Gate B-F 为 21/21,真实 Electron/preload/IPC、`app_server_handle_json_lines` 和 current App Server method 命中,全部错误、legacy command 与 mock fallback 计数为 0。
|
||||
- `npm run test:related -- ...` 曾在测试收集阶段把 `electron/` 目录当成文件读取并报 `EISDIR`;直接 Vitest 精确入口已覆盖同一受影响集合并全部通过,该问题记录为 runner 收集缺陷,不是产品断言失败。
|
||||
- `v1.138.0` 本地与远端 tag 均不存在。下一步是获得 release Git 写操作确认,提交完整 candidate、创建并推送 tag;随后由 release workflow 在 `windows-2022` 上验证 Squirrel 安装、packaged CodeMode Gate B 与发布资产。首页 Banner / 皮肤 Hero 保持明确产品例外。
|
||||
|
||||
## 47. 2026-09-01 业务层工具暴露语义对齐
|
||||
|
||||
- Codex HEAD `d58d0e5841` 的 `tools.update_plan.enabled` 默认关闭;显式开关才注册 checklist tool,且与 Plan Mode 解耦。Lime 已将这一语义放入 current `ToolExecutionPolicyConfig`、App Server config metadata、Agent inventory/current provider tool filtering 和设置页,不复制 Codex TUI 的终端交互。
|
||||
- GUI 设置页新增“计划工具”开关,默认关闭,开启后通过现有 `config` 写链保存;`zh-CN`、`zh-TW`、`en-US`、`ja-JP`、`ko-KR` 文案和 summary 状态同步,未新增第二业务后端或 Renderer mock。
|
||||
- 验证:配置相关 Rust 单测 `3/3`、Agent inventory `15/15`、current provider tool snapshot `6/6`、App Server provider/inventory 各 `3/3`、`test:rust:related` 全部受影响包通过;设置页 Vitest `5/5`、`lime-core` cargo check、`verify:gui-smoke`(真实 Electron/preload/IPC/App Server 链,`21/21`)及 `git diff --check` 通过。未注入 V8 缓存时 Darwin arm64 预编译资产下载返回 404,本轮使用仓库已有临时缓存完成 Rust 验证,fresh-environment 下载仍未验证。
|
||||
- 治理分类:`current` 为计划工具配置/投影/GUI;`compat` 为历史工具名别名;`deprecated` 无新增;`dead/forbidden-to-restore` 为旧 UI 二次 owner、Renderer mock 和第二套状态机;Codex account/rate-limit/TUI 专属业务、未确认 token budget/proactive catalog contract 归 `product-scope-excluded` 或 `gap / pending owner`。
|
||||
|
||||
## 48. 2026-09-02 模型目录驱动的回合语义
|
||||
|
||||
- 对齐 Codex `ModelInfo/ModelMessages` 与 `core::session::multi_agents`:可信模型目录现在保留 instructions template/variables、context/max-context/auto-compact/effective-percent、Multi-Agent v2 文案与 Ultra provider override;App Server 每回合只从选中 route 的 catalog metadata 合并到 current session/turn context。
|
||||
- Multi-Agent v2 精确按字段存在性解析:`hint_text`(含空字符串)优先;Ultra 使用 `proactive`,缺失时使用内置 proactive;非 Ultra 使用 `explicit`,缺失时保持 explicit-request-only。World State 保留用户选择的 `ultra`,provider wire 则按目录 override、`max`、最高非 Ultra、`medium` 的顺序 lowering;本地 `persistent` 在 provider wire 上 lowering 为 `disabled`。
|
||||
- `model/list.supportsPersonality` 不再硬编码:只有 instructions template 含 `{{ personality }}`,且 default/friendly/pragmatic 三个变量都是字符串时才为 true,空字符串仍算目录显式声明。人格模板渲染、model limits 和 API 解析均补定向回归。
|
||||
- 验证状态:`cargo check -p app-server` 通过;模型目录 `2/2`、reasoning effort `4/4`、provider configuration `7/7`、Multi-Agent turn context `13/13`、session/config `19/19`、personality model list `1/1` 和 direct provider metadata `1/1` 定向回归通过;`npm run test:rust:related -- <本轮 Rust 写集>` 推导的 20 个反向依赖包全部通过。`npm run test:contracts` 通过 protocol types、App Server client 299 checks、command/harness/contracts、scripts governance 和 docs boundary;`npm run smoke:agent-runtime-current-fixture` 通过且 `liveProviderUsed=false`;`npm run verify:gui-smoke` 通过真实 Electron Desktop Host、preload/IPC、App Server `appserver.v0`、Claw shell reload 和 memory settings Gate B。`cargo fmt --all -- --check` 与 `git diff --check` 通过。Codex release 的 Darwin arm64 archive/binding 均可下载并校验;历史 404 仅对应 Deno 默认 sandbox URL 或错误的 mirror 路径,本轮已将缓存固定到稳定 OS 用户缓存目录并增加下载重试/超时。
|
||||
- 后续 blocker:model-owned `approvals`、`permissions`、`auto_review`、Guardian v2 和完整 token-budget 语义仍未进入可信 catalog -> App Server -> provider/tool runtime 消费链;`model_messages.token_budget` 不得直接映射现有 provider hard token budget。
|
||||
|
||||
## 49. 2026-09-02 Codex Rusty V8 资产下载收口
|
||||
|
||||
- 继续采用 Codex 的 `rusty-v8-v<version>` release 资产,不引入 Lime 自建镜像或关闭 `v8_enable_sandbox`。`RUSTY_V8_MIRROR` 不作为入口,因为 v8 crate 的 `/v<version>` 拼接规则与 Codex release tag 不兼容。
|
||||
- `scripts/lib/rusty-v8-artifacts.mjs` 现在使用 macOS/Windows/Linux 稳定用户缓存目录,并为 curl 下载增加有限重试、连接超时和总超时;显式 `LIME_RUSTY_V8_CACHE_DIR` 仍可用于隔离 CI 或维护者验证。
|
||||
- 验证:helper 真实解析 `v8=150.4.0` 并成功取得 Codex Darwin arm64 archive/binding;资产 supply-chain Vitest `6/6` 通过,输出路径位于 `~/Library/Caches/Lime/rusty-v8`。该切片不改变 Cargo.lock、V8 feature 或运行时资源打包边界。
|
||||
|
||||
## 50. 2026-09-02 Windows packaged GUI evidence identity
|
||||
|
||||
- Windows workflow 的 CodeMode/native host Gate B 现在显式继承 Squirrel 安装候选的 `candidateRunId`,并由 `windows-packaged-evidence.mjs` 绑定安装后的 `Lime.exe`、资源清单、sidecar 进程命令和 native helper 路径。GUI Gate B 因此只能声明同一 packaged candidate 的 Electron/preload/IPC/App Server/runtime/read-model/DOM 证据。
|
||||
- 这不等于 Codex Desktop 实时视觉一致:本轮没有获得 ChatGPT.app accessibility tree 或 1536x960、1280x800、窄窗口的真实对照截图,也没有 Windows packaged GUI 运行结果;视觉基线和 Windows GUI Gate B 继续保持 `OPEN_REF`。
|
||||
- 当前 GUI current owner 仍是 Thread/Turn/Item projection、ThreadWorkspaceHeader、canonical timeline、Composer 和右侧 context surface;平台 host 只提供系统能力,不新增 Windows 业务后端或 macOS Swift 平行业务链。
|
||||
|
||||
## 51. 2026-09-02 GUI 三档窗口几何回归
|
||||
|
||||
- 范围:将现有真实 Electron `SHELL-01` smoke 扩展为 `1536x960`、`1280x800`、`980x680` 三档 `BrowserWindow.setSize/getSize` 几何契约;不把它表述为 Codex Desktop 像素级视觉一致性,也不替代 Windows packaged Gate B。
|
||||
- 实现:`electron/smokeChecks.ts` 在 renderer reload 后采集窗口尺寸、viewport、文档溢出、workspace shell/main area、Composer、输入框、可选 message list/Thread header 的稳定矩形,断言必要节点可见、在视口内、横向无意外溢出、标题与 header actions 不遮挡,并保存三张 `layout-<width>x<height>.png` 截图。`electron/smokeEvidence.ts` 将 `layout.proofLevel`、三档 viewport、断言和 screenshot 列表纳入同一 `SHELL-01` summary;summary validator 对布局 proof、几何稳定性和三张截图 fail closed。
|
||||
- 产品修复:首页 EmptyState 的 Composer frame 在短窗口使用基于 `100vh` 的有限负上边距,使 `980x680` 最小受支持窗口中 205px 高 Composer 完整进入视口;高窗口和业务链路保持不变。
|
||||
- 验证:`electron/smokeEvidence`、入口守卫、summary validator、EmptyStateLayout 定向测试通过;`npm run typecheck:electron`、Prettier 通过;真实 `npm run verify:gui-smoke` 通过,最新 summary 为 `.lime/qc/project-gates/standalone-shell-01-20260902095726-86015/shell-01-electron-smoke/summary.json`,24/24 assertions,三档 `layoutGeometryStable=true`,`980x680` Composer bottom=`678.67px`,console/page/preload/invoke/legacy/mock 均为 0。
|
||||
- 证据边界与下一步:本轮证明 Lime 真实 Electron responsive layout contract 和现有 preload/IPC/App Server shell 主链未回归;没有取得 Codex Desktop 实时 accessibility/screenshot,也没有 Windows packaged GUI 结果。后续仍由 `windows-2022` 真实候选完成 Squirrel 安装、sidecar/native host/CodeMode 与 packaged GUI Gate B,D0 实时视觉继续 `OPEN_REF`。
|
||||
|
||||
## 52. 2026-09-02 GUI 几何证据复核
|
||||
|
||||
- 复核范围:重新构建 renderer、Electron main/preload 与本地 App Server sidecar,重新执行三档 `BrowserWindow.setSize/getSize` 几何采集和 summary fail-closed 校验;不改变布局 owner 或平台业务边界。
|
||||
- 最新证据:`.lime/qc/project-gates/standalone-shell-01-20260902105148-51228/shell-01-electron-smoke/summary.json` 为 `Gate B-F`、24/24 assertions;`1536x960`、`1280x800`、`980x680` 均 `windowSizeMatchesRequest`、必要节点可见且在视口内、无横向溢出、header actions 不遮挡,`composerHeightStable=true`,三张布局截图均存在。真实 Electron/preload/IPC、`app_server_handle_json_lines`、App Server 初始化命中,console/page/preload/invoke、renderer crash/unresponsive、legacy command 和 mock fallback 均为 0。
|
||||
- 交叉门禁:`npm run test:contracts` 与 `npm run governance:scripts` 通过;本轮定向 Vitest 4 个文件 26/26、`npm run typecheck:electron`、Prettier 和 `git diff --check` 通过。
|
||||
- 稳定性补充:统一 `npm test -- --resume` 续跑 119/119 批全部通过;修复五语言执行策略描述中的来源品牌词,并将治理测试从已删除历史文档迁移到 current `internal/aiprompts/architecture.md` 事实源,相关 i18n/治理测试通过。
|
||||
- 证据边界:该复核证明 Lime macOS Electron responsive layout contract 和 current shell 主链未回归,不证明 Codex Desktop 像素级视觉一致、Windows packaged 安装/升级或系统权限。Windows `windows-2022` packaged GUI/CodeMode/native host Gate B 与 Codex Desktop 实时 accessibility/screenshot 继续为 `OPEN_REF`。
|
||||
|
||||
@@ -124,12 +124,12 @@ Codex 开源仓库没有 Swift 源文件。Swift/Objective-C 原生层属于安
|
||||
### 5.2 明显缺口或证据未闭环
|
||||
|
||||
- Swift 原生 helper 现已支持 IOHID topology 一次性读取与 `hidTopology.changed` 变化事件,以及 `bareModifierMonitor.start/stop`;权限、硬件和签名 Gate B 仍未闭环。
|
||||
- Swift 原生 helper 已支持 Accessibility/Input Monitoring、Apple Events 授权查询/consent request、Launch Services、security-scoped bookmark、CGWindow/NSScreen、IOHID、LocalAuthentication、Secure Enclave device-key 和 Application Group 查询;Dock Tile、PIP、ScreenCaptureKit 等更高阶闭环以及权限/硬件/签名 Gate B 仍未完成;
|
||||
- 无 Dock Tile plugin、Sky 风格原生窗口/PIP/overlay/窗口锚定和 display link host;
|
||||
- Swift 原生 helper 已支持 Accessibility/Input Monitoring、Apple Events 授权查询/consent request、Launch Services、security-scoped bookmark、CGWindow/NSScreen、IOHID、LocalAuthentication、Secure Enclave device-key 和 Application Group 查询;窗口编排已用 AX 应用级隐藏实现可恢复 lease 并有 packaged fixture 证据。Dock Tile、PIP、ScreenCaptureKit 等更高阶闭环以及权限/硬件/签名 Gate B 仍未完成;
|
||||
- 无 Dock Tile plugin、Sky 风格原生 PIP/overlay 和 display link host;窗口锚定、堆叠与 hide-for-task lease 已有原生实现和本地 packaged fixture 证据;
|
||||
- 无 Chronicle/ScreenCaptureKit 媒体管线的原生 helper;当前 helper 已支持受 Screen Recording 权限保护的全屏/显示器/窗口 PNG 快照,但媒体保留策略、签名包和 Gate B 仍缺;
|
||||
- `lime-rs/Info.plist` 现有 `http`/`https`/`lime`、Apple Events、摄像头和麦克风描述;
|
||||
- `lime-rs/entitlements.plist` 现有 JIT、unsigned memory、library validation、camera/audio-input、Apple Events automation、selected file、network client/server;
|
||||
- macOS security-scoped bookmark 已由 Desktop Host current owner 管理 helper 生命周期、稳定 ID 持久化、冷启动 resolve/start 和 revoke;真实权限授予/撤销恢复 Gate B 仍待补证。
|
||||
- macOS security-scoped bookmark 已由 Desktop Host current owner 管理 helper 生命周期、稳定 ID 持久化、冷启动 resolve/start、活动 token stop 和 revoke;packaged Gate B 已覆盖临时目录 create/resolve/start/stop,真实用户授权授予/撤销恢复仍待补证。
|
||||
- 原生窗口/显示/HID/Screen Recording snapshot/LocalAuthentication/设备密钥已进入同一 Swift helper 的结构化调用面;窗口控制覆盖 AX frame、raise 和所属应用 hide/unhide,状态合同保持 `unverified`,不把 API 可调用误报为授权或 Secure Enclave readiness。
|
||||
- LocalAuthentication/Keychain 的 Electron Host 专用桥未形成 owner;
|
||||
- Windows 源码安全矩阵已有真实 CI 证据,UI Automation/Raw Input helper 已进入资源组,但 packaged sidecar、Squirrel 安装后 runner/runtime 与 Electron Gate B 仍需独立证据;
|
||||
@@ -143,36 +143,37 @@ Codex 开源仓库没有 Swift 源文件。Swift/Objective-C 原生层属于安
|
||||
矩阵更新说明:Lime macOS 的 HID 行现已覆盖 `hidTopology.read` 与 `hidTopology.watch.start/stop` 的
|
||||
`hidTopology.changed` unsolicited event;bare modifier 行现已覆盖
|
||||
`bareModifierMonitor.start/stop`。文件访问/bookmark 行现已覆盖 Desktop Host 的稳定 ID 持久化、冷启动
|
||||
resolve/start 和 revoke;屏幕捕获行现已覆盖 Screen Recording 权限 query/request 与
|
||||
`screenCapture.snapshot` PNG 快照,但未实现 Chronicle 媒体管线。上述能力仍保持 `部分`,因为真实签名包、
|
||||
resolve/start、活动 token stop 和 revoke,以及 packaged Gate B 的真实
|
||||
`bookmark.create/resolve/start/stop`;屏幕捕获行现已覆盖 Screen Recording 权限 query/request 与
|
||||
`screenCapture.snapshot` PNG 快照,但未实现 Chronicle 媒体管线。窗口编排和 bookmark 生命周期已有本地 packaged helper 证据;上述能力仍保持 `部分`,因为真实签名包、
|
||||
权限授予/撤销、媒体保留策略和硬件条件的 Gate B 尚未完成。
|
||||
|
||||
| 能力域 | Codex Desktop macOS | Codex Desktop Windows | Lime macOS | Lime Windows | 分类/下一步 |
|
||||
| -------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------- | ---------------------------------------------------------- |
|
||||
| Electron/Chromium 宿主 | Electron + Codex Framework 原生层 | Electron + Windows native resources | Electron current + Swift native helper;高阶原生层仍缺 | Electron current;Squirrel/sidecar 部分已有 | `current`;建立统一 capability/readiness contract |
|
||||
| 能力域 | Codex Desktop macOS | Codex Desktop Windows | Lime macOS | Lime Windows | 分类/下一步 |
|
||||
| -------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------- |
|
||||
| Electron/Chromium 宿主 | Electron + Codex Framework 原生层 | Electron + Windows native resources | Electron current + Swift native helper;高阶原生层仍缺 | Electron current;Squirrel/sidecar 部分已有 | `current`;建立统一 capability/readiness contract |
|
||||
| 原生窗口/句柄/overlay | `sky.node`、NSWindow/CGWindow、anchor、stack、hide-for-task | 私有实现未从安装包完全解出 | CGWindow 查询、应用激活、Accessibility AX frame/raise、窗口所属应用 hide/unhide、anchor/stack/hide-for-task lease 已实现;overlay 未闭环 | `windows.window.read` 枚举 HWND、进程、标题、类名和边界;不控制窗口 | `部分`;P2 native window owner,先不在 Renderer 模拟 |
|
||||
| Remote Hosted PIP | `RemoteHostedPIPContent`、presentation lifecycle | 需从 Windows 包和运行时补证据 | 缺 | 缺 | `缺口`;P2,必须有系统级 Gate B |
|
||||
| Input Monitoring | 原生 `.node` 查询和 System Settings 跳转 | Windows Raw Input 注册和会话权限需另证 | Swift helper query/request/settings 已实现 | `windows-native-host` 只读 Raw Input modifier watcher | `部分`;P1 permission contract |
|
||||
| Accessibility/Apple Events | Accessibility、ApplicationServices、AppleScript、Apple Events entitlement | Windows UI Automation/相关能力需另证 | Swift helper Accessibility + `appleEvents.targets/read/request`,按目标 bundle 查询授权并跳转 Automation 设置 | `windows-native-host` 有界 UI Automation read-only tree | `部分`;P1 fail-closed readiness |
|
||||
| HID/Bluetooth | `hid-topology-watcher.node`、IOHIDDevice | Windows HID/Raw Input 需另证 | IOHID topology 查询、watcher 启停和 `hidTopology.changed` 已实现;硬件 Gate B 未闭环 | Raw Input 只覆盖修饰键,不提供 HID topology | `部分`;P2,产品需求确认后实现 |
|
||||
| Bare modifier monitor | Swift helper,支持 request permission | Windows hotkey/Raw Input 需另证 | Swift helper `bareModifierMonitor.start/stop` 和 down/up 事件已实现;权限/硬件 Gate B 未闭环 | `windows.bareModifierMonitor.start/stop` 只读 down/up 事件 | `部分`;P1,Windows Gate B 待补 |
|
||||
| Secure Enclave/device key | `remote-control-device-key.node` | 硬件密钥/DPAPI 需另证 | Swift helper Secure Enclave create/read/sign/delete 已实现;硬件/签名 Gate B 未闭环 | DPAPI 用于 sandbox setup,非同一 device-key owner | `部分`;P2 remote-control owner |
|
||||
| Browser pipe authorization | `browser-use-peer-authorization.node` | native pipe/ACL 需另证 | 缺 | 普通 browser host,未有同等级 peer auth | `缺口`;P2,绑定 connection/thread identity |
|
||||
| 文件关联/Launch Services | helper 查询 bundle/URL handler、按路径启动、下载完成通知 | Shell association/URL handler 需另证 | URL scheme + Swift helper path/bundle/URL handler 已实现 | Squirrel startup 有;无统一 association helper | `部分`;P1 Desktop Host owner |
|
||||
| 文件访问/bookmark | user-selected read-write、Desktop 权限、security-scoped 生命周期 | ACL/path normalization/reparse point | 普通选择文件 + Desktop Host security-scoped bookmark 稳定 ID、冷启动恢复、revoke;真实授权 Gate B 未闭环 | ACL/path normalization current | `部分`;P1 macOS bookmark,Windows 保持 tool-runtime owner |
|
||||
| 进程/沙箱 | seatbelt、sandbox-exec、process hardening | restricted token、ACL、deny-read、private desktop、Firewall/WFP、setup/runner | Rust seatbelt 检测/规划,需真实 macOS 执行证据 | Rust backend + Windows CI 7/7,packaged 证据待补 | `current/部分`;P0/P1 platform evidence |
|
||||
| PTY/终端 | Unix PTY/process group | ConPTY + Job Object | Rust PTY owner,需 macOS Gate B | Rust ConPTY/Job Object 有 current | `current/部分`;补跨平台 packaged matrix |
|
||||
| 网络隔离/证书 | Security framework trust、proxy policy | Schannel、WFP/network isolation | network client entitlement;native cert/isolated execution 未闭环 | WFP/Firewall/readiness 已有 current | `部分/current`;P1 packaged/readiness |
|
||||
| 摄像头/麦克风/音频 | AVFoundation/AVFAudio/AudioUnit/CoreAudio、权限声明 | Windows media API 需另证 | Swift helper `mediaPermissions.read/request` 查询/请求摄像头和麦克风;主包与 helper 均有 usage description | Electron media handling | `部分`;P2 native media/permission contract |
|
||||
| 屏幕捕获/视觉 | ScreenCaptureKit、`codex_chronicle`、Vision/CoreML/Metal | Windows capture/vision 需另证 | Swift helper 提供 Screen Recording 权限和 CGWindow/CGDisplay PNG 快照;Chronicle 管线未实现 | 无等价 Chronicle | `部分`;P2,补媒体管线和系统证据 |
|
||||
| Computer Use 光标/窗口 | `sky.node` + Accessibility/CGWindow | Windows desktop/UI automation 需另证 | `accessibilityTree.read` 提供有界只读控件树;无 cursor/window 控制注入 | UI Automation、HWND 和显示器只读观察;无 cursor/window 控制注入 | `部分`;P2,控制注入仍需安全边界 |
|
||||
| Code Mode/V8 | 独立 host;Darwin sandbox-enabled V8 | Windows GNU sandbox-enabled,MSVC 资产不同 | `code-mode-host` Rust binary,Darwin 资产配对待证 | host/setup/runner binary,有 MSVC 资源风险 | `部分`;P0 resource manifest + P1 matrix |
|
||||
| MCP/Skills/Apps | Desktop UI + App Server/Rust current chain | 同一协议,系统权限由 host 承接 | App Server/GUI current | App Server/GUI current | `current`;不为平台复制第二套 catalog |
|
||||
| Thread/Turn/Item 恢复 | App Server/Rust current | App Server/Rust current + sidecar 状态 | current | current;需 packaged resume evidence | `current/部分`;Gate B/packaged |
|
||||
| Sidecar/managed install | `codex`、Code Mode host、Sparkle/托管生命周期 | managed install、runner/setup、Windows executable naming | `app-server-daemon` current | current;安装后资源组待证 | `部分`;P0 资源和生命周期闭环 |
|
||||
| 更新/签名/安装 | Sparkle、Developer ID、notarization、stapling、Sparkle feed | Squirrel/MSIX/signing 分支 | Forge DMG/ZIP、签名/公证配置 | Forge Squirrel current;MSIX 非主路径 | `部分/current`;P1 真实产物证据 |
|
||||
| Dock/通知/登录项 | Dock Tile、UserNotifications、ServiceManagement | Toast/startup/taskbar 需另证 | tray/notification 有;Dock Tile 缺 | startup/tray 有 | `部分`;按产品范围实现 |
|
||||
| 诊断/遥测/设备完整性 | DeviceCheck、Chronicle 等私有能力 | Windows 诊断能力需另证 | 未形成专属 owner | 未形成专属 owner | `excluded/缺口`;没有明确需求不得猜测 |
|
||||
| Remote Hosted PIP | `RemoteHostedPIPContent`、presentation lifecycle | 需从 Windows 包和运行时补证据 | 缺 | 缺 | `缺口`;P2,必须有系统级 Gate B |
|
||||
| Input Monitoring | 原生 `.node` 查询和 System Settings 跳转 | Windows Raw Input 注册和会话权限需另证 | Swift helper query/request/settings 已实现 | `windows-native-host` 只读 Raw Input modifier watcher | `部分`;P1 permission contract |
|
||||
| Accessibility/Apple Events | Accessibility、ApplicationServices、AppleScript、Apple Events entitlement | Windows UI Automation/相关能力需另证 | Swift helper Accessibility + `appleEvents.targets/read/request`,按目标 bundle 查询授权并跳转 Automation 设置 | `windows-native-host` 有界 UI Automation read-only tree | `部分`;P1 fail-closed readiness |
|
||||
| HID/Bluetooth | `hid-topology-watcher.node`、IOHIDDevice | Windows HID/Raw Input 需另证 | IOHID topology 查询、watcher 启停和 `hidTopology.changed` 已实现;硬件 Gate B 未闭环 | Raw Input 只覆盖修饰键,不提供 HID topology | `部分`;P2,产品需求确认后实现 |
|
||||
| Bare modifier monitor | Swift helper,支持 request permission | Windows hotkey/Raw Input 需另证 | Swift helper `bareModifierMonitor.start/stop` 和 down/up 事件已实现;权限/硬件 Gate B 未闭环 | `windows.bareModifierMonitor.start/stop` 只读 down/up 事件 | `部分`;P1,Windows Gate B 待补 |
|
||||
| Secure Enclave/device key | `remote-control-device-key.node` | 硬件密钥/DPAPI 需另证 | Swift helper Secure Enclave create/read/sign/delete 已实现;硬件/签名 Gate B 未闭环 | DPAPI 用于 sandbox setup,非同一 device-key owner | `部分`;P2 remote-control owner |
|
||||
| Browser pipe authorization | `browser-use-peer-authorization.node` | native pipe/ACL 需另证 | 缺 | 普通 browser host,未有同等级 peer auth | `缺口`;P2,绑定 connection/thread identity |
|
||||
| 文件关联/Launch Services | helper 查询 bundle/URL handler、按路径启动、下载完成通知 | Shell association/URL handler 需另证 | URL scheme + Swift helper path/bundle/URL handler 已实现 | Squirrel startup 有;无统一 association helper | `部分`;P1 Desktop Host owner |
|
||||
| 文件访问/bookmark | user-selected read-write、Desktop 权限、security-scoped 生命周期 | ACL/path normalization/reparse point | 普通选择文件 + Desktop Host security-scoped bookmark 稳定 ID、冷启动恢复、revoke;真实授权 Gate B 未闭环 | ACL/path normalization current | `部分`;P1 macOS bookmark,Windows 保持 tool-runtime owner |
|
||||
| 进程/沙箱 | seatbelt、sandbox-exec、process hardening | restricted token、ACL、deny-read、private desktop、Firewall/WFP、setup/runner | Rust seatbelt 检测/规划,需真实 macOS 执行证据 | Rust backend + Windows CI 7/7,packaged 证据待补 | `current/部分`;P0/P1 platform evidence |
|
||||
| PTY/终端 | Unix PTY/process group | ConPTY + Job Object | Rust PTY owner,需 macOS Gate B | Rust ConPTY/Job Object 有 current | `current/部分`;补跨平台 packaged matrix |
|
||||
| 网络隔离/证书 | Security framework trust、proxy policy | Schannel、WFP/network isolation | network client entitlement;native cert/isolated execution 未闭环 | WFP/Firewall/readiness 已有 current | `部分/current`;P1 packaged/readiness |
|
||||
| 摄像头/麦克风/音频 | AVFoundation/AVFAudio/AudioUnit/CoreAudio、权限声明 | Windows media API 需另证 | Swift helper `mediaPermissions.read/request` 查询/请求摄像头和麦克风;主包与 helper 均有 usage description | Electron media handling | `部分`;P2 native media/permission contract |
|
||||
| 屏幕捕获/视觉 | ScreenCaptureKit、`codex_chronicle`、Vision/CoreML/Metal | Windows capture/vision 需另证 | Swift helper 提供 Screen Recording 权限和 CGWindow/CGDisplay PNG 快照;Chronicle 管线未实现 | 无等价 Chronicle | `部分`;P2,补媒体管线和系统证据 |
|
||||
| Computer Use 光标/窗口 | `sky.node` + Accessibility/CGWindow | Windows desktop/UI automation 需另证 | `accessibilityTree.read` 提供有界只读控件树;无 cursor/window 控制注入 | UI Automation、HWND 和显示器只读观察;无 cursor/window 控制注入 | `部分`;P2,控制注入仍需安全边界 |
|
||||
| Code Mode/V8 | 独立 host;Darwin sandbox-enabled V8 | Windows GNU sandbox-enabled,MSVC 资产不同 | `code-mode-host` Rust binary,Darwin 资产配对待证 | host/setup/runner binary,有 MSVC 资源风险 | `部分`;P0 resource manifest + P1 matrix |
|
||||
| MCP/Skills/Apps | Desktop UI + App Server/Rust current chain | 同一协议,系统权限由 host 承接 | App Server/GUI current | App Server/GUI current | `current`;不为平台复制第二套 catalog |
|
||||
| Thread/Turn/Item 恢复 | App Server/Rust current | App Server/Rust current + sidecar 状态 | current | current;需 packaged resume evidence | `current/部分`;Gate B/packaged |
|
||||
| Sidecar/managed install | `codex`、Code Mode host、Sparkle/托管生命周期 | managed install、runner/setup、Windows executable naming | `app-server-daemon` current | current;安装后资源组待证 | `部分`;P0 资源和生命周期闭环 |
|
||||
| 更新/签名/安装 | Sparkle、Developer ID、notarization、stapling、Sparkle feed | Squirrel/MSIX/signing 分支 | Forge DMG/ZIP、签名/公证配置 | Forge Squirrel current;MSIX 非主路径 | `部分/current`;P1 真实产物证据 |
|
||||
| Dock/通知/登录项 | Dock Tile、UserNotifications、ServiceManagement | Toast/startup/taskbar 需另证 | tray/notification 有;Dock Tile 缺 | startup/tray 有 | `部分`;按产品范围实现 |
|
||||
| 诊断/遥测/设备完整性 | DeviceCheck、Chronicle 等私有能力 | Windows 诊断能力需另证 | 未形成专属 owner | 未形成专属 owner | `excluded/缺口`;没有明确需求不得猜测 |
|
||||
|
||||
## 7. 当前/兼容/废弃/已删除裁决
|
||||
|
||||
@@ -269,7 +270,7 @@ owner:Desktop Host macOS native owner,Windows 等价能力另行裁决;App
|
||||
|
||||
`scripts/lib/electron-desktop-resources.mjs` 为 Darwin、Windows 生成 `desktop-resources.manifest.json`,记录 platform/arch/version、sidecar/helper 路径、sha256、最小 macOS 版本和 entitlement/application-group 元数据;资源缺失、哈希漂移、路径越界和架构不匹配均 fail closed。
|
||||
|
||||
Forge `afterCopyExtraResources` 在签名之前编译并写入 macOS `macos-native-host`;Windows 将 app-server、Code Mode、sandbox setup/runner 作为同一资源组登记。`electron/macosNativeHost.ts` 通过受管 JSONL 子进程协议接入 `macos_native_host_invoke`,只接受资源清单中哈希匹配,或在 macOS Forge 重签后通过严格 `codesign` 校验且身份/架构一致的 helper;`before-quit` 会终止 helper 并清理未完成请求。`SystemUtilityHost` 负责 bookmark 稳定 ID 持久化、冷启动恢复与 revoke。
|
||||
Forge `afterCopyExtraResources` 在签名之前编译并写入 macOS `macos-native-host`;Windows 将 app-server、Code Mode、sandbox setup/runner 作为同一资源组登记。`electron/macosNativeHost.ts` 通过受管 JSONL 子进程协议接入 `macos_native_host_invoke`,只接受资源清单中哈希匹配,或在 macOS Forge 重签后通过严格 `codesign` 校验且身份/架构一致的 helper;`before-quit` 会终止 helper 并清理未完成请求。`SystemUtilityHost` 负责 bookmark 稳定 ID 持久化、冷启动恢复、活动 token stop 与 revoke。
|
||||
|
||||
Swift helper 当前不申请或声明 OpenAI Application Group;`applicationGroup.read` 仅查询 Lime 自有签名容器,默认返回 `not_configured`。当前 helper 还提供 `window.read/focus/raise/setFrame/setOwnerVisibility`、`window.anchor`、`window.stack`、`window.hideForTask.start/stop/read`、`display.read`、`hidTopology.read`、`hidTopology.watch.*`、`bareModifierMonitor.*`、`screenCapture.read/request/snapshot`、`appleEvents.targets/read/request/openSettings`、`localAuthentication.*` 和 `deviceKey.*`,但这些能力必须通过签名 entitlement、目标应用授权、硬件和平台 Gate B 才能升级状态。Apple Events 接口只查询目标 bundle 的自动化授权或触发系统 consent,不发送实际控制事件。hide-for-task 使用 helper 进程内 task lease 保存每个 owner 的原始隐藏状态,退出时自动恢复;anchor/stack 仅操作真实 CGWindow/Accessibility,不宣称私有 overlay 或 PIP。HID/bare modifier 事件经 `SystemUtilityHost` 转发到 Electron `evt:*` 广播,未连接 renderer 时不会创建第二事实源。本切片的 `lime-local` 证据已覆盖资源清单、Swift 编译、宿主分发、bookmark 持久化、事件通道和负向校验;真实签名包、权限授予/撤销、屏幕捕获媒体保留策略、Windows packaged Gate B 仍未完成,不能升级为 `platform-packaged`。
|
||||
|
||||
@@ -356,7 +357,7 @@ npm run smoke:agent-runtime-current-fixture
|
||||
|
||||
## 12. 下一刀与完成定义
|
||||
|
||||
当前最直接推进主线的一刀是 **P1 Windows packaged/Squirrel 与 macOS 原生窗口编排 Gate B**:在同一候选产物中证明 sidecar/runner 安装生命周期,并在真实 macOS 授权窗口上验证 anchor、stack、hide-for-task lease 的可恢复性;Windows watcher 需要在同一候选上补显示器热插拔事件证据。Chronicle/PIP/Computer Use 仍需独立产品裁决和 owner,不得用本切片的窗口接口冒充完成。
|
||||
当前最直接推进主线的一刀是 **P1 Windows packaged/Squirrel 与 macOS 权限/bookmark 撤销恢复 Gate B**:在同一候选产物中证明 sidecar/runner 安装生命周期,并在真实 macOS 用户授权撤销后验证 bookmark/readiness 恢复语义;Windows watcher 需要在同一候选上补显示器热插拔事件证据。Chronicle/PIP/Computer Use 仍需独立产品裁决和 owner,不得用本切片的窗口接口冒充完成。
|
||||
|
||||
本计划只有在以下条件全部满足后才能标记完成:
|
||||
|
||||
@@ -367,3 +368,111 @@ npm run smoke:agent-runtime-current-fixture
|
||||
5. 没有新的第二业务后端、生产 mock fallback、旧 runtime 恢复或无退出条件的 compat 层。
|
||||
|
||||
路线图关系:本计划是对现有 Codex runtime/GUI 对齐计划的平台底座补充;完成 P0 后回到 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore/tool-runtime -> Thread/Turn/Item -> GUI` 主链推进,而不是继续扩展静态 Desktop 逆向清单。
|
||||
|
||||
## 13. 2026-09-01 Codex 业务层 `update_plan` 对齐
|
||||
|
||||
- 对比依据:Codex HEAD `d58d0e5841` 的 `tools.update_plan.enabled` 默认值为 `false`,只有显式配置开启时才把 `update_plan` 暴露给模型;Plan Mode 是独立的编排模式,不能用来推断工具是否注册。
|
||||
- Lime current 实现:`lime-core::ToolExecutionPolicyConfig.update_plan_enabled` 作为唯一持久化字段,支持 snake/camel 配置别名,默认关闭且默认值序列化为空;App Server `current_agent_runtime_config_metadata` 只投影非默认配置,`tool-runtime::update_plan_enabled_from_metadata` 只接受 trusted runtime/config metadata,Agent inventory 和 current provider tool surface 共用该 gate;设置页提供五语言开关并写回 `agent.tool_execution.update_plan_enabled`。
|
||||
- 回归证据:配置序列化/round-trip `3` 个 Rust 测试通过,设置页 `5` 个 Vitest 通过;Agent inventory `15/15`、current provider tool snapshot `6/6`、App Server provider metadata `3/3`、App Server inventory `3/3` 均通过,`test:rust:related` 全部受影响 Rust 包通过,另有 `lime-core` cargo check、Prettier、`git diff --check`。默认未注入缓存时 `rusty_v8 v150.4.0` Darwin arm64 下载地址返回 404;本轮使用仓库已有临时预编译缓存完成验证,未声称全新环境的 V8 下载可用。
|
||||
- 分类:`current` 为上述配置、trusted gate、Agent tool inventory/current provider 投影和设置页;`compat` 仅保留既有 `UpdatePlan`/`UpdatePlanTool`/`update_plan_tool` 历史别名;`deprecated` 不新增入口;`dead/forbidden-to-restore` 为 Renderer mock、第二套计划状态机及 OpenAI 私有 Application Group/`sky` 平级实现;Codex TUI/account/rate-limit、未确认的 model-owned token budget defaults、完整 Computer Use/Chronicle/PIP 标记为 `product-scope-excluded` 或 `gap / pending owner`。
|
||||
|
||||
## 14. 2026-09-02 跨平台共用业务语义继续对齐
|
||||
|
||||
- 本轮不新增 macOS Swift、Windows native host 或 Electron 业务后端;Desktop 两端共用同一条 `model catalog -> App Server route metadata -> session/turn context -> model-provider wire` current 链。平台 host 只继续承接系统能力。
|
||||
- 已实现 Codex 模型目录拥有的 instructions/personality、context/auto-compact、Multi-Agent v2 mode copy 和 Ultra reasoning lowering。`ultra` 留在 Thread/Turn World State 表达主动协作意图,真实 provider 请求使用 catalog 声明或合法 fallback;`persistent` wire 使用 `disabled`。
|
||||
- `model/list.supportsPersonality` 已改为模型目录事实,不按模型名或操作系统推断;空变量值仍表示显式支持。该行为在 macOS/Windows Composer 和 Thread 设置上共享,不产生平台分叉。
|
||||
- 当前分类:上述路径全部为 `current`;未新增 `compat`/`deprecated`;OpenAI 私有 Application Groups、`sky`/CUAService 和签名 entitlement 继续为 `dead/forbidden-to-copy`;model-owned approvals/permissions/auto-review、Guardian v2 与完整 token-budget 仍为 `gap / pending owner`。
|
||||
- 验证状态:`cargo check -p app-server`、目录/provider/session 定向回归和 `test:rust:related` 推导的 20 个反向依赖包全部通过;`test:contracts` 通过 protocol types、App Server client 299 checks 及 command/harness/docs 治理边界;`smoke:agent-runtime-current-fixture` 在 `liveProviderUsed=false` 下通过;`verify:gui-smoke` 通过真实 Electron Desktop Host、preload/IPC、App Server `appserver.v0`、Claw shell reload 和 memory settings Gate B;Rust fmt 与 `git diff --check` 通过。Codex release 的 Darwin arm64 archive/binding 均可下载并校验;历史 404 仅对应 Deno 默认 sandbox URL 或错误的 mirror 路径,本轮已将缓存固定到稳定 OS 用户缓存目录并增加下载重试/超时,不以 mock 或第二 backend 绕过。
|
||||
|
||||
## 15. 2026-09-02 Codex Rusty V8 资产下载收口
|
||||
|
||||
- 继续采用 Codex 的 `rusty-v8-v<version>` release 资产,不引入 Lime 自建镜像或关闭 `v8_enable_sandbox`。`RUSTY_V8_MIRROR` 不作为入口,因为 v8 crate 的 `/v<version>` 拼接规则与 Codex release tag 不兼容。
|
||||
- `scripts/lib/rusty-v8-artifacts.mjs` 现在使用 macOS/Windows/Linux 稳定用户缓存目录,并为 curl 下载增加有限重试、连接超时和总超时;显式 `LIME_RUSTY_V8_CACHE_DIR` 仍可用于隔离 CI 或维护者验证。
|
||||
- 验证:helper 真实解析 `v8=150.4.0` 并成功取得 Codex Darwin arm64 archive/binding;资产 supply-chain Vitest `6/6` 通过,输出路径位于 `~/Library/Caches/Lime/rusty-v8`。该切片不改变 Cargo.lock、V8 feature 或运行时资源打包边界。
|
||||
|
||||
## 16. 2026-09-02 Windows packaged Gate B identity contract
|
||||
|
||||
- Windows packaged 证据现在由 `scripts/electron/windows-packaged-evidence.mjs` 统一收口。它要求 Squirrel summary 的候选版本、`candidateRunId`、安装路径和 `Lime.exe` 版本目录一致,并从安装后的 `resources/desktop-resources.manifest.json` 校验 app-server、code-mode-host、Windows sandbox helpers 和 read-only native host 的路径与 SHA-256。
|
||||
- CodeMode 与 Windows native host Gate B 都接收同一个 `LIME_GATE_RUN_ID`,并记录 packaged executable、resources root 与 helper path;validator 要求三份证据都来自同一个 Squirrel-installed `Lime.exe`,拒绝旧版本路径、`target/debug`/开发 sidecar、缺失 summary 或未完成 Gate B。
|
||||
- `build-windows-test.yml` 与 `release.yml` 在安装后 Gate B 后执行 validator,并始终上传结构化 `windows-packaged-evidence` summary。工作流 guard 和 Vitest 覆盖参数、哈希、路径、候选 identity、缺失证据与执行顺序。
|
||||
- 证据边界:这只提升 Windows packaged 安装、sidecar、native host 和业务 Gate B 的候选一致性;当前工作树没有真实 `windows-2022` 运行结果,Windows 安装/升级/卸载、进程树和 GUI 视觉对照仍保持 `OPEN_REF`,不以 macOS 本地 smoke 替代。
|
||||
|
||||
## 17. 2026-09-02 跨平台 GUI responsive layout contract
|
||||
|
||||
- Lime 的 macOS/Windows Desktop Host 共用同一套 GUI 几何回归入口:真实 Electron `BrowserWindow.setSize/getSize` 在 `1536x960`、`1280x800`、`980x680` 三档采集 workspace shell、Composer、输入框和可选 Thread/timeline 节点;布局证据与 `SHELL-01` summary 绑定,三张截图和几何断言缺失时 fail closed。
|
||||
- 短窗口的 EmptyState Composer 已按最小 `980x680` 窗口收敛到视口内,未改变平台 host、App Server、RuntimeCore 或 provider 业务 owner。该 contract 只证明 Lime responsive layout 和真实 Electron 主链,不证明 Codex Desktop 像素级视觉一致性、Windows packaged 安装或 macOS 系统权限。
|
||||
- 当前验证:真实 macOS Electron smoke 24/24 assertions 通过;Windows 必须在 `windows-2022` 安装后使用同一候选 `Lime.exe` 重跑 GUI/CodeMode/native host Gate B,不能用本机结果替代。Codex Desktop 实时窗口因 AppleEvent 阻塞仍为 `OPEN_REF`。
|
||||
|
||||
## 18. 2026-09-02 GUI responsive layout Gate B-F 复核
|
||||
|
||||
- 真实 Electron smoke 重新构建并运行后,summary `.lime/qc/project-gates/standalone-shell-01-20260902105148-51228/shell-01-electron-smoke/summary.json` 通过 `24/24` assertions;三档 `1536x960`、`1280x800`、`980x680` 的窗口尺寸、viewport、必要 workspace/Composer/input 节点和无横向溢出均通过,三张布局截图存在。
|
||||
- `npm run test:contracts`、`npm run governance:scripts`、`npm run typecheck:electron` 与定向 26/26 回归通过;证据仍只覆盖 macOS 本地真实 Electron/preload/IPC/App Server shell 和 Lime responsive layout contract。
|
||||
- 统一 `npm test -- --resume` 的 119/119 批全部通过;i18n 设置文案保持来源中性,治理边界测试读取 current 架构事实源。
|
||||
- Windows packaged/Squirrel、sidecar/native host/CodeMode 以及 Codex Desktop 实时 accessibility/screenshot 没有新增平台运行证据,继续保持 `OPEN_REF`,不得用本机 smoke 替代。
|
||||
|
||||
## 19. 2026-09-02 macOS native helper readiness handshake
|
||||
|
||||
- macOS 资源 manifest 的 native helper metadata 现在固定声明 `protocolVersion=1`;Swift `capabilities.read`
|
||||
同时返回 `protocolVersion`、`helperId`、`platform` 和 helper bundle identity。Electron
|
||||
`MacOSNativeHostClient` 对声明协议版本的 packaged helper 在首次业务调用前执行一次握手;协议、平台或
|
||||
`com.limecloud.lime.native-host` identity 不匹配时终止子进程并返回 `protocol_mismatch`,不会把可执行文件存在
|
||||
当成 runtime ready。未声明版本的隔离测试 fixture 不进入生产资源清单。
|
||||
- 新增 `scripts/electron/macos-native-host-gate-b.mjs` 与 `npm run smoke:macos-native-host-gate-b`。该入口从
|
||||
`Lime.app/Contents/MacOS/Lime` 解析 Resources,校验 manifest、helper bundle、SHA-256/严格 codesign 和握手,
|
||||
再真实观察 `window.read`、`display.read`、display watcher、权限查询、Apple Events target 列表和
|
||||
`launchServices.bundleIdentifier`。默认权限模式为 `observe` 并记录 TCC 状态;`--strict-permissions` 才要求
|
||||
Accessibility、Input Monitoring、Screen Recording 全部为 `ready`。
|
||||
- release workflow 的 macOS arm64/x64 job 在资源 verifier 后执行该 Gate B 并上传 evidence;当前工作树只完成入口、
|
||||
manifest/握手负向测试和本地 helper 运行,尚无 CI 签名包权限授予/撤销结果,不能将 observe 证据升级为完整 macOS
|
||||
permission Gate B,也不能替代 Windows packaged 或 Codex Desktop 实时视觉证据。
|
||||
- 相关验证:待本轮执行 `macosNativeHost`、资源清单/verifier、Gate B 入口、current entrypoints、contracts、
|
||||
Electron typecheck、GUI smoke 与 `git diff --check`;Windows packaged、真实签名权限和 Codex Desktop
|
||||
accessibility/screenshot 继续为 `OPEN_REF`。
|
||||
|
||||
## 20. 2026-09-02 本地 packaged macOS helper Gate B 证据
|
||||
|
||||
- 重新执行 `npm run electron:build` 和 `electron-forge package --platform darwin --arch arm64`,使用生成的
|
||||
`release-electron/Lime-darwin-arm64/Lime.app` 运行 `macos-native-host-gate-b.mjs`。Gate B 校验了顶层 Lime
|
||||
app bundle identity/codesign、嵌套 helper bundle、manifest protocol/digest、`capabilities.read` 握手、窗口
|
||||
枚举(46)、显示器枚举(2)、display watcher、security-scoped bookmark 的真实
|
||||
`create/resolve/start/stop`、权限查询、Apple Events targets(89)和 Launch Services bundle ID。
|
||||
- observe 与 `--strict-permissions` 两种模式均通过;证据分别写入
|
||||
`.lime/qc/gui-evidence/macos-native-host-gate-b-local/summary.json` 和
|
||||
`.lime/qc/gui-evidence/macos-native-host-gate-b-local-strict/summary.json`。helper 在 ad-hoc/本地签名后
|
||||
SHA-256 与 manifest 不同,但严格 `codesign` 通过,Gate 正确记录 `digestMatches=false`、`signed=true`,没有
|
||||
绕过完整性校验。
|
||||
- 该结果属于本机 `lime-local/packaged`,不等同于 Developer ID/notarization、权限撤销后恢复或 Codex Desktop
|
||||
实时 accessibility/screenshot 对照;macOS release runner、Windows `windows-2022` packaged 和上述撤销场景仍为
|
||||
`OPEN_REF`。
|
||||
- 本轮最终验证:受影响 Gate B/资源/host 相关测试 `47/47`,完整资源 verifier 35 tests,Electron typecheck、
|
||||
`npm run test:contracts`、`npm run governance:electron-release-workflow`、`npm run verify:gui-smoke` 和
|
||||
`git diff --check` 通过。
|
||||
|
||||
## 21. 2026-09-02 macOS window lease 与 bookmark lifecycle Gate B
|
||||
|
||||
- `macos-window-fixture.swift` 提供仅用于 Gate B 的临时标准 Cocoa `.app`,运行时创建两个带稳定标题的窗口;Gate 脚本只匹配该 fixture 的 PID,不选择 Finder、Terminal 或其它用户窗口。
|
||||
- `macos-window-orchestration.swift` 的 hide-for-task lease 改为在 Accessibility 已授权时设置目标应用的 AX `kAXHiddenAttribute`,隐藏前激活目标并保留每个 owner 的原始状态;stop 和 helper 退出路径恢复原始状态。`window.anchor`、`window.stack` 与 lease 的 start/read/stop 在同一 fixture 上完成。
|
||||
- `SystemUtilityHost` 将按稳定 ID 启动的 bookmark token 保存在 current Host 内存中;`bookmark.stop` 支持稳定 ID,`bookmark.revoke` 会先调用 helper `bookmark.stop` 再删除受管记录,避免撤销后仍持有 active security-scoped resource。
|
||||
- 本机新 packaged arm64 证据:`.lime/qc/gui-evidence/macos-native-host-gate-b-final-observe/summary.json`(observe)和 `.lime/qc/gui-evidence/macos-native-host-gate-b-final-strict/summary.json`(strict)均通过;窗口编排与 bookmark lifecycle 均为 `passed`,TCC 三项为 `ready`。该证据仍是本机 `lime-local/packaged`,不升级为 Developer ID/notarization 或权限撤销后恢复证据。
|
||||
- 本轮定向验证:bookmark/system utility 与 Gate B/current entrypoint 测试 `24/24`,`npm run electron:build:host`、Swift arm64 编译、Forge packaged Gate B observe/strict 和 `git diff --check` 通过;Windows packaged、macOS release runner 和 Codex Desktop 实时 accessibility/screenshot 仍为 `OPEN_REF`。
|
||||
|
||||
## 22. 2026-09-02 macOS native host 真实 Electron/preload/IPC 闭环
|
||||
|
||||
- `scripts/electron/macos-native-host-gate-b.mjs` 在同一候选 `Lime.app` 上先完成 packaged helper 资源、协议、签名、窗口/显示、bookmark、权限和 Launch Services 检查,再启动真实 Electron fixture;不会切换到第二个 Electron 后端或 renderer mock。
|
||||
- Electron 阶段通过 preload `window.electronAPI.invoke` 调用 `macos_native_host_invoke`,校验 helper `capabilities.read` identity、`window.read`、`display.read`、三项 TCC 查询和 bookmark `create/resolve/start/stop`;同时从同一 preload 进入 `app_server_handle_json_lines`,执行 `initialize`、`workspace/default/ensure`,要求返回稳定 workspace identity。
|
||||
- 终态证据同时记录真实 Electron/preload 标记、App Server JSON-RPC 方法、native host IPC 方法、GUI 当前 shell 可见状态、invoke/console/page 错误和截图。`app_server_handle_json_lines` 必须在 renderer trace 中命中 `electron-ipc`,否则 fail closed。
|
||||
- 该改动只扩展 Gate B 证据与测试 helper,未新增业务 owner、Application Group、`sky`/`CUAService` 或 Swift 私有业务后端;native 系统能力仍归 Desktop Host,Thread/Turn/Item 业务仍归 App Server/runtime。
|
||||
- 本轮验证已完成:Gate B/current entrypoint 合同 `19/19`、`npm run typecheck:electron` 通过;使用同一 arm64 packaged `Lime.app` 的 observe 证据 `.lime/qc/gui-evidence/macos-native-host-gate-b-electron-observe/summary.json` 与 strict 证据 `.lime/qc/gui-evidence/macos-native-host-gate-b-electron-strict/summary.json` 均为 `result=passed`。两档均证明真实 Electron/preload、`app_server_handle_json_lines`(observe trace 13 次)、`macos_native_host_invoke` 10 个方法、workspace identity、GUI 设置页截图和零 console/page/invoke error;strict 还证明 Electron IPC 路径上的 Accessibility、Input Monitoring、Screen Recording 均为 `ready`。
|
||||
- 仍未覆盖:Windows `windows-2022` packaged/Squirrel、macOS release runner 权限撤销恢复及 Codex Desktop 实时 Accessibility/screenshot;这些继续保持 `OPEN_REF`,本机 packaged 证据不能替代跨平台或签名发布证据。
|
||||
|
||||
## 23. 2026-09-02 macOS Electron Gate B owner 收口
|
||||
|
||||
- Electron/preload/App Server/native host 闭环已从 `macos-native-host-gate-b.mjs` 抽取到
|
||||
`scripts/electron/lib/macos-native-host-electron-gate-b.mjs`,主入口只保留已安装 helper 的资源、协议、权限、窗口和
|
||||
Launch Services 校验,并委托唯一 helper 执行真实 Electron 阶段;主入口由 1059 行降至 779 行,避免继续堆叠跨职责业务逻辑。
|
||||
- current entrypoint 守卫已登记 helper,Gate B 合同测试直接读取 helper,保留 `launchElectronFixture`、
|
||||
`window.electronAPI.invoke`、`app_server_handle_json_lines`、`macos_native_host_invoke`、trace fail-closed 和 GUI 终态断言。
|
||||
- 本轮抽取后验证:Gate B/current entrypoint `20/20`、Electron TypeScript、`test:contracts`、脚本治理、`verify:gui-smoke` 和
|
||||
`git diff --check` 通过;重新使用同一 arm64 packaged `Lime.app` 的 observe/strict 两档 Gate B 均为 `passed`,
|
||||
两档都命中 `app_server_handle_json_lines`、`macos_native_host_invoke`、workspace identity、设置页终态和零
|
||||
console/page/invoke error。Electron helper 的业务 owner 未产生第二套后端或 mock fallback。
|
||||
|
||||
@@ -1,158 +0,0 @@
|
||||
# Dead Code 持续清理计划
|
||||
|
||||
## 目标
|
||||
|
||||
持续删除已脱离产品入口、构建消费链或唯一事实源的代码;不保留无外部兼容负担的 fail-closed 空壳、转发 helper、重复 UI 壳和历史类型目录。
|
||||
|
||||
正式分类遵循 `internal/aiprompts/governance.md`。Knip、`zero-inbound` 和热力图只提供候选信号,必须结合全文引用、构建入口、current owner 与定向测试后才能判定 `dead`。
|
||||
|
||||
## 协作边界
|
||||
|
||||
- 并行脏热区(只读):`src/components/agent/chat/**`、`src/lib/api/agentRuntime/**`、`internal/exec-plans/claw-streaming-rendering-codex-refactor-plan.md`。
|
||||
- 本轮实际写集:本计划、各批表格所列的 `dead` 文件、随删除必要收口的 current owner/README/i18n patch、命令合同与 legacy surface guard。
|
||||
- 不触碰:Electron Host、App Server protocol/runtime/client、Rust runtime、DevBridge command policy 与正在修改的 Agent streaming/task center 文件。
|
||||
|
||||
## 第一批候选
|
||||
|
||||
| Surface | 候选文件 | 证据 | 分类 / current owner |
|
||||
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
|
||||
| Image Search 前端空壳 | `src/lib/api/imageSearch.ts`、`imageSearch.test.ts`、`imageSearch.diagnostic.test.ts` | production Knip 未使用;全文扫描只有自身测试;既有迁移计划确认无 App Server owner、旧 Tauri facade 已退役 | `dead`;独立 `lime_search_web_images` Agent tool 不受影响 |
|
||||
| 外链重复 helper | `src/lib/openUrl.ts`、`openUrl.test.ts` | production Knip 未使用;生产调用已直接收敛到 `src/lib/api/externalUrl.ts` | `dead`;`externalUrl.ts` 为 `current` |
|
||||
| SceneApp context overlay | `src/lib/context-layer/index.ts`、`types.ts` | production Knip 未使用;全文扫描无消费者;类型仍携带已退役 `SceneAppContextOverlay` | `dead`;不得恢复 SceneApp 平行事实源 |
|
||||
| Compact right panel 旧壳 | `src/lib/compactRightPanelEvents.ts`、`src/components/ui/compact-right-dock-button.tsx`、`compact-right-drawer-header.tsx` | production Knip 未使用;全文扫描只有文件自身 | `dead`;右侧工作区继续由现役 workspace/right surface 组件承接 |
|
||||
| 通用 ArtifactFrame 旧壳 | `src/components/agent/chat/components/ArtifactFrame.tsx` | production Knip 未使用;无 import;Artifact 展示已由 `artifactFrameRegistry.ts` + `ArticleArtifactFrame.tsx` 消费 | `dead`;registry / renderer 为 `current` |
|
||||
|
||||
## 执行步骤
|
||||
|
||||
- [x] 运行 `npm run governance:legacy-report`,当前零引用候选、分类漂移和边界违规均为 `0`。
|
||||
- [x] 生成项目热力图与治理图到 `tmp/project-heatmap*`;结果因当前 Git churn 不可用且包含本地 `.lime` 证据目录,只作弱证据。
|
||||
- [x] 运行 production Knip 并对第一批候选逐项全文复核。
|
||||
- [x] 获得删除确认后,物理删除第一批 `dead` 文件。
|
||||
- [x] 将 `imageSearch.current-boundary.test.ts` 从“保留 fail-closed 空壳”改为“文件不得恢复”的负向守卫。
|
||||
- [x] 在 legacy surface catalog 增加本批文件的路径回流守卫。
|
||||
- [x] 运行相关定向测试、`npm run test:contracts`、`npm run governance:legacy-report`、`git diff --check`。
|
||||
|
||||
### 第一批验证证据
|
||||
|
||||
- `npx vitest run "src/lib/api/imageSearch.current-boundary.test.ts" "src/lib/governance/legacySurfaceCatalog.test.ts" --silent=passed-only --disableConsoleIntercept`:2 files / 212 tests 通过。
|
||||
- `npm run typecheck`:renderer 与 node TypeScript project 均通过;删除目标无隐藏静态消费者。
|
||||
- `npm run governance:legacy-report`:5 组新增 surface 均为 `dead / 已删除 / 无引用`;零引用候选、分类漂移、边界违规均为 0。
|
||||
- `npm run test:contracts`:protocol 生成无漂移,App Server client 291 checks、command/contracts、modality、scripts、Electron release、cleanup report 与 docs boundary 全部通过。
|
||||
- production Knip 复扫:8 个已删生产路径命中为空数组。
|
||||
- 第一批 diff:611 行删除、88 行 guard/test 新增,净减少 523 行;其中 11 个物理删除文件共 602 行。
|
||||
|
||||
## 第二批候选
|
||||
|
||||
| Surface | 候选文件 / 改动 | 证据 | 分类 / current owner |
|
||||
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
||||
| Artifact fenced response parser | 删除 `src/lib/artifact/parser.ts`、`parser.test.ts`,更新两份 Artifact README | 829 行实现和测试只互相消费;生产链无 `ArtifactParser`、artifact fence 或 `serializeArtifact` 调用 | `dead`;结构化 artifact 由 App Server item/artifact payload、`artifact-document` 与 renderer registry 承接 |
|
||||
| 静态 System Provider 预设 | 删除 `src/lib/config/README.md`、`providers.ts`、`providers.test.ts`;让 icon test 只验证自身映射一致性 | 1006 行配置和自测无生产消费者;现役 Provider catalog 明确经 `src/lib/api/apiKeyProvider.ts -> modelProvider/catalog/list` 读取 | `dead`;App Server catalog 为 `current` |
|
||||
| 旧 Voice preview / 设置组件 | 删除 `src/lib/voiceLivePreview.ts`、对应测试、`MicrophoneTest.tsx`、`VolumeWaveform.tsx`,更新 Voice README;移除 `asrProvider.listAudioDevices` 及其正向测试/守卫 | 组件无页面入口;preview helper 只被自身测试使用;录音主链已直接由 `useInputbarDictation` 使用 renderer `getUserMedia` | `dead`;Inputbar dictation + App Server transcription 为 `current` |
|
||||
| Relay registry 禁用 Hook | 删除 `src/hooks/useRelayRegistry.ts`,清理 legacy i18n patch 中对应 4 个旧文案 | Hook 无消费者且只返回空列表/禁用错误;Connect deep link 已按需经 App Server 解析 registry | `dead`;`useDeepLink -> src/lib/api/connect.ts -> App Server` 为 `current` |
|
||||
|
||||
第二批已完成物理删除与 owner 收口;`asrProvider`、icon test、README、legacy i18n patch 与边界测试只做随删除必要的收口,未新增 compat。
|
||||
|
||||
- [x] 对第二批候选完成 production Knip、全文引用和 current owner 复核。
|
||||
- [x] 获得删除确认后,物理删除 10 个 `dead` 文件并同步收口现役 owner。
|
||||
- [x] 删除旧正向测试,将 Artifact parser、静态 Provider catalog、Voice preview/device UI 和 Relay registry Hook 合并到 owner 级负向回流守卫。
|
||||
- [x] 运行 Artifact、Provider、Voice、Connect 相关定向测试,并按 API/GUI 风险扩大到 contracts 与 GUI smoke。
|
||||
|
||||
### 第二批验证证据
|
||||
|
||||
- owner 级定向 Vitest:10 files / 280 tests 通过,覆盖 Artifact、Provider icon、ASR/Voice、Connect 与 legacy surface guard。
|
||||
- 定向 ESLint:`asrProvider`、Provider icon 与 legacy surface guard 相关现存 TypeScript 文件全部通过。
|
||||
- `npm run test:contracts`:protocol 生成无漂移,App Server client 291 checks、command/contracts、modality、scripts、Electron release、cleanup report 与 docs boundary 全部通过。
|
||||
- `npm run verify:gui-smoke`:真实 Electron Desktop Host、preload/IPC、App Server sidecar、Renderer 与用户可见 workspace 准备态通过;Gate B evidence 为 `.lime/qc/project-gates/standalone-shell-01-20260718140542-60846/shell-01-electron-smoke/summary.json`。
|
||||
- `npm run governance:legacy-report`:4 组新增 surface 均为 `dead / 已删除 / 无引用`;零引用候选、分类漂移、边界违规均为 0。
|
||||
- production Knip 复扫:6 个已删生产路径命中为空数组;10 个目标物理路径均不存在。
|
||||
- JSON 解析、`git diff --check` 均通过。第二批 diff 为 221 行新增、2547 行删除,净减少 2326 行;其中 10 个物理删除文件共 2263 行。
|
||||
- `npm run typecheck`:全量 renderer typecheck 仍被并行脏热区 `src/components/agent/chat/AgentChatWorkspace.tsx:1241` 的 `string | null` 类型错误阻塞,因 `&&` 短路未继续到 node project;本计划不接管该文件。`npm run verify:gui-smoke` 内含的 `typecheck:electron` 独立通过。
|
||||
|
||||
## 第三批候选
|
||||
|
||||
| Surface | 候选文件 / 改动 | 证据 | 分类 / current owner |
|
||||
| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ |
|
||||
| 已退路由的 Hotkeys 设置页 | 删除 `src/components/settings-v2/general/hotkeys/**`,移除 `SettingsTabs.Hotkeys`、对应负向 fallback 测试、quality planner 路径与五语言 `settings.hotkeys.*` 资源 | `SETTINGS_GROUPS`、Settings layout preload/render switch 和 Sidebar 均无 Hotkeys;唯一 enum 消费是“不得出现”测试 | `dead`;各工作区现役快捷键定义由所属组件直接持有 |
|
||||
| 共享 Shortcut 编辑器旧组件 | 删除 `src/components/settings-v2/shared/ShortcutSettings.tsx` 与自身测试,清五语言 `common.shortcutSettings.*` 资源 | production Knip 和全文扫描都只有自身测试/资源 | `dead`;无 current 页面需要快捷键录制 UI |
|
||||
| Renderer Hotkey / Voice shortcut facade | 删除 `src/lib/api/hotkeys.ts`、`voiceShortcutEvents.ts` 与自身测试 | 两个 facade 无生产消费者;`voice-start-recording` / `voice-stop-recording` 在 Electron 与 Renderer 均无 emitter/listener | `dead`;Inputbar dictation 的显式录音交互为 `current` |
|
||||
| 专用 Hotkey Electron 命令 | 从 IPC/Host/SystemUtilityHost/contract/tests 移除 `get_voice_shortcut_runtime_status` 与 `validate_shortcut` | 两条命令只服务已无入口的 Renderer facade;没有其他调用方 | `dead`;通用 `globalShortcut` test/plugin fixture 边界不在本批修改 |
|
||||
|
||||
第三批已物理删除 10 个源码/自测文件共 1554 行,清理 5 locale 共 320 条只服务已退页面/组件的 i18n key。该批触及 Electron 命令合同,已完成 `npm run test:contracts` 与相关 Electron tests。
|
||||
|
||||
- [x] 对第三批完成 Settings 路由、Renderer facade、Electron 命令和事件 emitter/listener 全链盘点。
|
||||
- [x] 获得删除确认后,物理删除页面/组件/facade并同步命令合同、枚举与 i18n。
|
||||
- [x] 为两条 retired Hotkey 命令与已删 Settings 路径补 legacy 回流守卫;仅保留 `voiceMocks.test.ts` / `core.unhandled-mock.test.ts` 的 test-only fail-closed 证据。
|
||||
- [x] 运行 Settings/Host/i18n 定向测试、contracts、治理扫描与 GUI smoke。
|
||||
|
||||
### 第三批验证证据
|
||||
|
||||
- 定向 Vitest:12 files / 360 tests 通过,覆盖 Settings layout/category、i18n loader/type、Electron SystemUtility/Host/IPC、desktop-host fail-closed、quality planner 与 governance catalog。
|
||||
- `npm run test:contracts`:protocol 生成无漂移,App Server client 291 checks;命令计数收敛为 frontend 30 / Electron host 91 / mock priority 0 / DevBridge truth 16,其余 modality、scripts、release、cleanup 与 docs guard 均通过。
|
||||
- `npm run verify:gui-smoke`:真实 Electron Desktop Host、preload/IPC、App Server sidecar、Renderer、Claw workspace reload 与 Memory settings ready 通过;Gate B evidence 为 `.lime/qc/project-gates/standalone-shell-01-20260718144759-97071/shell-01-electron-smoke/summary.json`。
|
||||
- `npm run governance:legacy-report`:零引用候选、分类漂移、边界违规均为 0;新增 Hotkeys 页面、Shortcut 编辑器、Renderer facade 与两条命令均为 `dead / 已删除 / 受控负向守卫`。
|
||||
- production Knip 复扫:7 个已删生产路径命中为空数组;10 个源码目标物理路径均不存在;五语言 `common.shortcutSettings.*` / `settings.hotkeys.*` key 全部清除。
|
||||
- 定向 ESLint、Prettier、JSON 解析、`git diff --check` 均通过。
|
||||
- `npm run typecheck`:全量 renderer typecheck 仍被并行脏热区 `src/components/agent/chat/workspace/useAgentChatWorkspaceArtifactInteractionRuntime.ts:39` 的 `import type` 误用阻塞,本计划不接管该文件;Electron `typecheck:electron` 已在 GUI smoke 中独立通过。
|
||||
|
||||
## 退出条件
|
||||
|
||||
第一至第六批文件全部物理删除;production Knip 不再报告这些路径;Image Search、SceneApp context overlay、compact-right 旧壳、重复外链 helper、通用 ArtifactFrame、Artifact parser、静态 Provider catalog、Voice preview/device UI、Relay registry Hook、Hotkeys 设置页、Shortcut 编辑器、Renderer hotkey/voice facade、两条专用 Electron 命令、Agent Chat subagents ViewModel、Workspace article workflow read model、article editor orchestration model、Rust runtime queue/queued turn/runtime support、App Server runtime registry 与 Plugin HostDrawer 本地 fallback 均已下线并有负向守卫。定向测试、治理与 Rust related 检查通过;合同与最新 GUI smoke 仍需等待隔壁 `internal/refactor/v1` 写集收敛后复跑。
|
||||
|
||||
## 后续候选
|
||||
|
||||
当前没有可直接接管的新 `dead` surface;已确认的 Agent Chat、Rust runtime 与 Plugin Host fallback 候选均已删除并有回流守卫。下一轮只在治理报告出现其他候选且 current owner、旁路引用和写集边界均明确时继续,不凭单一 Knip 信号夹写。
|
||||
|
||||
### 第四批候选审计与收口(2026-07-18 续调)
|
||||
|
||||
- production Knip 未报告新的未使用生产文件;治理目录中的其余 `dead-candidate` 主要是路径已删除后的负向文字守卫。
|
||||
- `SkillExecutionDialog` / `useSkillExecution` 已在当前 Git 树中物理不存在,`check-app-server-client-contract.mjs` 只保留不回流的退役文件守卫;不重复删除。
|
||||
- `settings-update-notification-compat-export`、旧 LanguageSelector、ChannelsDebugWorkbench 旧表单、独立 video/image/tools/terminal 页面与 desktop-host legacy barrel 当前均未命中实际旧实现,仅保留现有治理扫描证据。
|
||||
- 写集释放后完成第四批物理删除:`agentUiSubagentsViewModel.ts` 及测试、`useWorkspaceArticleWorkflowReadModel.ts` 及测试、`workspaceArticleEditorOrchestrationModel.ts` 及单元测试,共 6 个文件、2388 行。删除前按导出符号和全文引用复核,三组文件均无生产入口,仅自身测试或 boundary evidence 引用。
|
||||
- 在 `legacySurfaceCatalog` 与对应测试中补入 `agent-ui-subagents-view-model-surface`、`workspace-article-workflow-read-model-surface`、`workspace-article-editor-orchestration-model-surface` 三组路径回流守卫;不新增 compat 或 fallback。
|
||||
|
||||
### 第四批验证证据
|
||||
|
||||
- `npx vitest run "src/lib/governance/legacySurfaceCatalog.test.ts"`:1 file / 212 tests 通过。
|
||||
- `npm run governance:legacy-report`:零引用候选、零分类漂移、零边界违规;第四批三组 surface 均为 `dead / 已删除 / 受控负向守卫`。
|
||||
- `npm run test:contracts`:协议无漂移,App Server client 291 checks;frontend 30 / Electron host 91。
|
||||
- production Knip 复扫:`reportedFileCount: 0`,第四批目标路径命中为空。
|
||||
- 定向 ESLint、Prettier、JSON parse、`git diff --check` 均通过。
|
||||
- `npm run verify:gui-smoke`:真实 Electron Desktop Host、preload/IPC、App Server sidecar、Renderer 与用户可见 workspace smoke 通过;Gate B evidence 为 `.lime/qc/project-gates/standalone-shell-01-20260718151721-46205/shell-01-electron-smoke/summary.json`。
|
||||
- 第四批 diff:6 个物理删除文件共 2388 行;新增 3 组治理路径回流守卫及测试覆盖。
|
||||
|
||||
### 第五批只读复核(2026-07-18 续调)
|
||||
|
||||
- `npm run governance:legacy-report`:扫描 2381 个源码文件与 1466 个测试文件,零引用候选、零分类漂移、零边界违规。
|
||||
- `npm run governance:scripts`:root/一级目录冻结基线通过,`retiredRoot=0`、`retiredDirs=0`、`untrackedRoot=0`、`untrackedDirs=0`。
|
||||
- 直接运行 `npx knip --production` 未指定仓库 Knip 配置,结果将所有入口/导出及大量类型列为 issue,不能作为删除证据;本轮不据此删除文件。治理图默认 `knip.governance.json` 当前不存在,因此只认全文引用、目录规则和 current owner 复核。
|
||||
- Rust session loop 迁移 owner 已明确并完成收口:上述 7 个旧文件共删除 1664 行,生产调用已迁移到 `agent_runtime::session_loop::RuntimeSessionRegistry` / `RuntimeSessionInputHandle`;`legacySurfaceCatalog` 已新增 3 组 `dead` 路径回流守卫。
|
||||
- `cargo test --manifest-path "lime-rs/Cargo.toml" -p agent-runtime session_loop`:2 项 session loop 定向测试通过。
|
||||
- `cargo check --manifest-path "lime-rs/Cargo.toml" -p lime-agent -p app-server`:通过;仅保留既有 `stage_agent_control_spawn` 未使用警告,不影响本批删除。
|
||||
- `npm run test:contracts`:协议无漂移,App Server client 291 checks;frontend 30 / Electron host 91,脚本、模态、发布、清理和 docs 门禁通过。
|
||||
- `npm run verify:gui-smoke`:真实 Electron Desktop Host、preload/IPC、App Server JSON-RPC、Renderer reload 与 Memory settings ready 通过;Gate B-F evidence 为 `.lime/qc/project-gates/standalone-shell-01-20260718153427-23370/shell-01-electron-smoke/summary.json`,21/21 assertions 通过,0 console/page/bridge/legacy/mock errors。
|
||||
- 44 个当前 Git 删除文件均已被 catalog 目标覆盖,未发现未设守卫的物理删除路径;治理单测 213 项通过,`git diff --check` 通过。
|
||||
- 第五批退出条件已满足;当前 Git 删除文件均已被 `legacySurfaceCatalog` 的 `dead` 守卫覆盖,没有新的可安全接管 dead surface。
|
||||
|
||||
### 第六批只读审计(2026-07-18 续调)
|
||||
|
||||
- 依赖图与全文复核确认 `src/features/plugin/ui/AgentRunHostDrawerFallback.tsx` 无生产 import、无动态入口;其导出 `AgentRunFactRail` / `AgentRunLocalProcessFallback` 已由 `AgentRunProjectionPanel` current owner 替代。
|
||||
- `AgentRunHostDrawer.tsx` 已有 `plugin-host-drawer-local-process-fallback` 负向守卫,生产主路径始终渲染标准 projection;路线图 `internal/roadmap/agentworkbench/task-board.md` 明确要求该文件物理删除前取得单独确认。
|
||||
- Plugin Host current owner 定向回归:4 files / 24 tests 通过(HostDrawer boundary、AgentRunProjectionPanel、PluginRuntimePage agent-run 与 host-bridge)。
|
||||
- 已获得单独确认并物理删除 `AgentRunHostDrawerFallback.tsx`;旧边界测试已改为文件不存在的负向断言,`legacySurfaceCatalog` 新增 `plugin-host-drawer-fallback-module-surface` 文件级回流守卫。
|
||||
- 删除后 Plugin Host/Projection 定向回归:5 files / 238 tests 通过;定向 ESLint、JSON 解析与 `git diff --check` 通过。
|
||||
- `npm run governance:legacy-report`:零引用候选、零分类漂移、零边界违规;目标文件状态为 `dead / 已删除`。
|
||||
- `npm run test:contracts` 未通过,阻塞来自隔壁 `internal/refactor/v1` 共享 protocol 写集:`generate-protocol-types.mjs` 报 `method_names.rs` 缺少 6 个既有 `agentSession/*` 常量;本轮不修改隔壁 protocol/manifest。
|
||||
- `npm run verify:gui-smoke` 首次等待共享 Rust artifact lock 后完成真实 Electron、preload/IPC、App Server JSON-RPC、Renderer reload 与 Memory settings ready,但在 21 项断言中仅 `noConsoleErrors` 失败(20/21 通过);summary 为 `.lime/qc/project-gates/standalone-shell-01-20260718160517-64526/shell-01-electron-smoke/summary.json`。其余 page、IPC、legacy、mock 与 renderer crash 计数均为 0,未发现本轮 Plugin Host 删除相关证据。
|
||||
- 复跑 `ELECTRON_ENABLE_LOGGING=1 npm run verify:gui-smoke` 未能进入 Electron:隔壁 transport 写集使 `app-server` 编译失败,`crates/app-server/src/main.rs:47` 仍调用不存在的 `AppServerTransport::from_listen_url_with_base`(当前仅有 `from_listen_url`),并连带触发 `E0282` 类型推导错误。本轮不修改 `internal/refactor/v1`、`app-server` 或 `app-server-transport`。
|
||||
- 隔壁补回 transport 后,`npm run test:contracts` 仍在 `check:protocol-types` 稳定失败:`method_names.rs` 缺少 `agentSession/list`、`agentSession/read`、`agentSession/start`、`agentSession/thread/resume`、`agentSession/turn/cancel`、`agentSession/turn/start` 六个 manifest 常量;本轮不恢复旧常量或新增 compat wrapper。
|
||||
- 再次运行 `ELECTRON_ENABLE_LOGGING=1 npm run verify:gui-smoke` 已完成真实 Electron、preload/IPC、App Server sidecar、Renderer reload 与 Memory settings ready,但 21 项断言仍为 20/21,仅 `noConsoleErrors` 失败。logging 定位到 Renderer 请求仍发送 `agentSession/list`,App Server 返回 `method not found: agentSession/list`;summary 为 `.lime/qc/project-gates/standalone-shell-01-20260718162422-74488/shell-01-electron-smoke/summary.json`。其余 page、IPC、legacy、mock、crash 与 load error 计数均为 0,说明失败属于隔壁 v1 协议迁移未完成,不属于本轮 Plugin Host 删除。
|
||||
- 隔壁 transport 变更后重新运行 `npm run governance:legacy-report`:扫描 2384 个源码文件、1466 个测试文件与 1140 个 Rust 文件,零引用候选、零分类漂移、零边界违规;`npx vitest run` 的 catalog + Plugin Host/Projection 定向组为 4 files / 247 tests 通过,`git diff --check` 通过。
|
||||
- 本轮仍未触碰 `internal/refactor/v1`、Agent Chat runtime 或 Plugin current owner,仅删除已获确认的 deprecated residual。
|
||||
|
||||
### 第七批 dead DAO 清理(2026-07-19)
|
||||
|
||||
- 只读盘点确认 `lime-rs/crates/core/src/database/dao/a2ui_form_dao.rs` 中的 `A2UIFormDao`、`CreateA2UIFormRequest`、`UpdateFormDataRequest` 与错误类型仅被自身文件使用,`dao/mod.rs` 只有一个导出;生产 Rust、Electron、Renderer 和脚本无调用。
|
||||
- `core/src/database/schema.rs` 的 `drop_retired_agent_runtime_tables` 已将 `a2ui_forms` 及其索引列为 retired 并在启动时清理,当前 schema 不再创建该表;前端 A2UI projection/runtime 不依赖该 DB DAO。
|
||||
- 按无兼容约束物理删除 `a2ui_form_dao.rs`,移除 `dao/mod.rs` 导出;不删除 schema retired cleanup,也不触碰前端 A2UI current owner。
|
||||
- 分类:`A2UIFormDao`/旧 DB 表单读写面 = `dead / deleted / forbidden-to-restore`;前端 A2UI action-request / workspace projection = `current`;schema cleanup = `current migration boundary`;无 `compat` 或 `deprecated` wrapper。
|
||||
- 验证:exact `rg` 引用扫描返回零命中;`cargo test -p lime-core --lib` 通过(675/675);`git diff --check` 通过。治理扫描待本轮工作树稳定后复跑。
|
||||
@@ -209,7 +209,7 @@
|
||||
- 参考:
|
||||
- Claude Code:`COORDINATOR_MODE`
|
||||
- Lime:`internal/aiprompts/task-agent-taxonomy.md`
|
||||
- Lime:`internal/exec-plans/claude-code-agent-task-runtime-alignment-plan.md`
|
||||
- Lime:`internal/aiprompts/task-agent-taxonomy.md` 与 `internal/aiprompts/query-loop.md`
|
||||
- 期望:
|
||||
- 子代理过程在 GUI 中不重复、不吞最终答复。
|
||||
- 多代理结果有证据、归因和状态收敛。
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
# 全仓文档事实源收敛计划
|
||||
|
||||
状态:第七批完成 / current 文档、旧宿主残留与退役守卫已收口
|
||||
|
||||
## 1. 目标
|
||||
|
||||
把仓库文档收敛为可导航、可验证的 current 事实源。历史实现、已完成发布过程、被替代方案和失效索引不继续占用 active tree;需要追溯时使用 Git history、Release Notes 和不可变 evidence。
|
||||
|
||||
本计划不以“修改日期早”直接判死。只有同时具备替代 owner、无 current 执行责任、存在失效引用或明确历史属性的文档,才进入删除集。
|
||||
|
||||
## 2. 审计基线
|
||||
|
||||
审计日期:2026-09-02。
|
||||
|
||||
- Git 跟踪 Markdown:959 份。
|
||||
- `internal/` 跟踪 Markdown:791 份,其中 `research` 293、`roadmap` 267、`exec-plans` 101。
|
||||
- 全量 Markdown 本地链接初扫:53 个失效候选;第一批删除与导航收口后降至 28 个,明确断链与 current 引用修复后降至 20 个,第二批删除与引用迁移后降至 0 个。
|
||||
- `harness:doc-freshness` 当前只监控 5 份文档,结果全绿不能代表全仓文档健康。
|
||||
- 38 份文档仍直接引用 legacy catalog 中已物理删除的代码路径;历史 evidence 与负向守卫引用允许保留,current 导航引用必须移除。
|
||||
- `internal/exec-plans/production-command-current-migration-plan.md` 与 `codex-alignment-v1-coordination-plan.md` 分别超过 5000 行,后续需要独立完成 active facts 提取后再裁剪,不能本批直接删除。
|
||||
|
||||
## 3. 分类
|
||||
|
||||
### current
|
||||
|
||||
- 根 `FEATURE-MAP.md`:仓库级能力导航,不承接第二套架构。
|
||||
- `internal/aiprompts/architecture.md`、`commands.md`、`governance.md`、`quality-workflow.md`:当前架构、命令、治理和质量 owner。
|
||||
- 当前版本 `internal/exec-plans/release-v1.139.0-plan.md`:记录本次发布候选、验证与远端复核。
|
||||
- `internal/refactor/v2/IMPLEMENTATION-PLAN.md`:当前 Renderer / runtime 对齐执行入口。
|
||||
|
||||
### compat / deprecated
|
||||
|
||||
- 仍被 current 文档引用的历史术语只允许保留迁移说明,不继续作为导航目标。
|
||||
- 超大执行计划在 active facts 提取前暂时保留;只能追加收口信息,不继续扩展第二套 owner。
|
||||
|
||||
### dead / deleted
|
||||
|
||||
1. `internal/exec-plans/release-v1.102.0-plan.md` 至 `release-v1.137.0-plan.md`,共 37 份。对应版本已过去,发布结果由 Git tag、GitHub Release、Release Notes 和 Git history 承接。
|
||||
2. `internal/iteration-notes/` 全部 5 份。内容是旧凭证池、旧 session context 和阶段备忘,已由 current Provider、Memory/Compaction、执行计划与路线图取代。
|
||||
3. `internal/develop/execution-tracker-*.md` 共 4 份,以及 `scheduler-task-governance-p1.md`。内容仍以 `heartbeat_executions`、`cron.*`、Tauri command 和旧 Settings 工作台为主,已被 Scheduled Tasks current owner 和 `task-agent-taxonomy.md` 取代。
|
||||
4. `internal/research/refactor/v1/` 全部 15 份。该研究基线已被 `internal/research/refactor/v2/`、根架构图与 current 执行计划取代;目录内索引还引用 11 份已不存在的文档。
|
||||
|
||||
第一批已物理删除 62 份 Markdown;current 导航与直接引用已同步收口。
|
||||
|
||||
## 4. 第一批收口结果
|
||||
|
||||
已同步更新:
|
||||
|
||||
- `internal/README.md`:移除 `iteration-notes` 导航。
|
||||
- `internal/exec-plans/README.md`:移除旧版本发布计划清单,明确 active tree 只保留当前发布计划。
|
||||
- `internal/aiprompts/task-agent-taxonomy.md`:把 Execution Tracker 文档引用改为已删除裁决。
|
||||
- `internal/develop/lime-borrow-codex-engineering-practices.md`:移除旧 Execution Tracker 文档导航。
|
||||
- `internal/exec-plans/upstream-runtime-alignment-plan.md`:改指向 current taxonomy。
|
||||
- `internal/roadmap/test/clawstream/README.md`、`internal/roadmap/test/README.md`:将 research/refactor/v1 invariant 改指向 current architecture/query-loop。
|
||||
- `internal/roadmap/soul/README.md` 与 `internal/exec-plans/soul-style-output-surface-convergence-plan.md`:移除 research/refactor/v1 的 current owner 叙事。
|
||||
- 与发布计划删除相关的索引只保留当前版本;历史 evidence 中的旧路径文字不因删除而改写。
|
||||
|
||||
本批不触碰现有 Rust、Renderer、Settings、协议、发布实现和并行执行计划业务内容。
|
||||
|
||||
## 5. 后续批次
|
||||
|
||||
第一批完成后继续审计,不直接批量删除:
|
||||
|
||||
1. `internal/roadmap/skill-forge/`:保留仍承接 current 进度的 `README.md` 与 `implementation-plan.md`;把稳定边界迁回这两个 owner 后,删除已被实现和 completion audit 取代的 `architecture-review.md`、`coding-agent-layer.md`、`diagrams.md`、`prototype.md`。
|
||||
2. `internal/research/refactor/v2/13-evidence/`:先确认 current architecture 与 Gate B 索引不再依赖单篇 evidence 路径,再决定保留 manifest 还是从 active tree 移出。
|
||||
3. 超过 1000 行的执行计划与路线图:先提取未完成 blocker 和 current decision,再删除完成日志。
|
||||
4. `internal/aiprompts/converter.md`、`server.md`、`src/components/general-chat/README.md`、`src/i18n/README.md` 等断链模块文档:有 current module 的重写为短导航,无 current owner 的直接删除。
|
||||
5. 把全仓相对链接和 deleted-surface current 引用纳入文档门禁,避免继续只监控 5 份文档。
|
||||
6. 已删除 Plugin v3 明确裁决为 `dead / deleted / forbidden-to-restore` 的四份 Plugin Runtime v2 文档:`internal/roadmap/agentruntime/app-surface-runtime.md`、`backend-surface-facade-plan.md`、`claw-capability-sharing.md`、`plugin-runtime-completion-audit.md`;AgentRuntime 导航已改到 `internal/roadmap/plugin/v3/` current owner。
|
||||
|
||||
第二批已完成:删除上述 4 份 Plugin Runtime v2 文档,以及 `internal/roadmap/skill-forge/architecture-review.md`、`coding-agent-layer.md`、`diagrams.md`、`prototype.md` 4 份已被实现与 completion audit 取代的 proposal 文档。Skill Forge 稳定边界已回到保留的 `README.md`、`implementation-plan.md`、`internal/aiprompts/skill-standard.md` 与 `query-loop.md`。
|
||||
|
||||
第三批已完成:保留 `internal/roadmap/plugin/README.md` 与 `internal/roadmap/plugin/v3/**`,删除其余 23 份 Plugin v1/v2 历史材料:
|
||||
|
||||
- 根部旧文档与证据:`architecture.md`、`prd.md`、`implementation-plan.md`、`interface-contracts.md`、`technical-baseline.md`、`prototype.md`、`prototype.html`、`history-product-workspace.md`、`user-operations-guide.md`、`e2e-evidence.md`、`evidence/plugin-productization-e2e-summary.json`。
|
||||
- 旧发布规划:`deverlop/plugin-publish-center-prd.md`、`deverlop/plugin-publish-limecore-server-plan.md`。
|
||||
- Plugin v2 全部 10 份:`v2/README.md`、`00-research-findings.md`、`01-product-contract.md`、`02-package-marketplace-installation.md`、`03-architecture-and-command-contracts.md`、`04-app-center-and-claw-surfaces.md`、`05-migration-and-cleanup.md`、`06-implementation-plan.md`、`07-verification-contract.md`、`08-legacy-synthesis.md`。
|
||||
- 同批删除 `internal/roadmap/agentruntime/agentruntime-standard-adoption-gap.md`;该文档仍以 `plugin_runtime_*`、`lime.agent / lime.workflow` 与 Plugin v2 worker 叙述旧主链,current 边界已由 Plugin v3、RuntimeCore、Skills、MCP 与 Tool Runtime 承接。
|
||||
|
||||
第三批共 24 份文件、8,517 行。已同步收短 Plugin 根导航,把 Agent Workbench 的 Adoption Gap 引用迁到 AgentRuntime README 与 Plugin v3,并将旧版本有效决策映射写入 Plugin v3 README、目标合同、基线与清理账本;文档边界守卫已切换到 v3 现役文件。
|
||||
|
||||
## 6. 验证与退出条件
|
||||
|
||||
第一批退出条件:
|
||||
|
||||
- 删除集全部物理移除,导航不再引用。
|
||||
- `git diff --check` 通过。
|
||||
- 全仓 Markdown 相对链接扫描无新增失效项,已知失效项数量下降。
|
||||
- `npm run docs:boundary` 通过。
|
||||
- `npm run harness:doc-freshness` 通过。
|
||||
- `npm run governance:legacy-report` 通过,或明确记录仅由并行工作树造成的外部失败。
|
||||
|
||||
第一批验证结果:`git diff --check`、`npm run docs:boundary`、`npm run harness:doc-freshness`、`npm run governance:legacy-report` 全部通过;治理报告为 0 个边界违规。`harness:doc-freshness` 仍只监控 5 份文档,不能替代全仓链接扫描。
|
||||
|
||||
第二批验证结果:全仓本地链接扫描为 0 个失效项;`git diff --check`、`npm run docs:boundary`、`npm run harness:doc-freshness`、`npm run governance:legacy-report` 再次全部通过,治理报告为 0 个边界违规。
|
||||
|
||||
完成度:审计、前两批分类、删除与导航收口 100%;累计删除 70 份 Markdown,现存 889 份,全仓本地链接扫描为 0 个失效项;第三批内容时效性审计进行中。
|
||||
|
||||
第三批验证结果:`git diff --check`、全仓 Markdown 相对链接扫描、`npm run docs:boundary`、`npm run harness:doc-freshness`、`npm run governance:legacy-report` 均通过;Plugin v3 现役文档已补版本替换映射,根 Feature Map 已链接到 v3 current owner。
|
||||
|
||||
完成度:三批删除与版本替换收口 100%;累计删除 92 份 Markdown 与 2 份 HTML/JSON 材料,现存跟踪 Markdown 867 份,全仓本地链接扫描为 0 个失效项。后续仅处理有明确 current owner、具体替换目标和独立验证证据的文档,不按修改日期批量删除。
|
||||
|
||||
## 7. 第四批:现役版本替换导航
|
||||
|
||||
本批不做物理删除,先把“旧版本仍可打开”与“旧版本仍是 current owner”区分开,避免用户按旧入口继续扩展:
|
||||
|
||||
- 图片能力:`internal/roadmap/images/README.md` 降为 `legacy current reference`;current 背景、合同、架构和流程统一指向 `internal/roadmap/images/v2/**`。
|
||||
- Writing:`internal/roadmap/Writing/**` v1 文档降为 `legacy current reference`;有效决策统一指向 `internal/roadmap/Writing/v2/**` 与 `internal/exec-plans/writing-v2-workflow-completion-plan.md`。
|
||||
- Feature Map 新增版本替换索引,明确 Knowledge、LimeNext、Plugin 和 Refactor 的替换关系;其中 `internal/refactor/v1` 与 v2 明确标为不同 owner,不按版本号误删。
|
||||
- 图片执行计划与进度记录已改为引用 v2 路线图;Writing v1 文档的 current 进度和验收入口均改为 v2 入口。
|
||||
- LimeNext v1/v2 文档已统一降为 `legacy historical reference`;当前能力导航改由根 `FEATURE-MAP.md`、`internal/aiprompts/*` 与领域 v2/v3 路线图承接。
|
||||
- 修复 `limenext/` 旧 README、PRD 与迁移图指向已删除 `internal/roadmap/ribbi/*` 的断链,并将 `limenext-plan.md` 明确为历史执行记录。
|
||||
- Writing v1 的重复 `In Progress` 状态已改为历史参考,`article-frame-fix-plan.md` 与 `release-v1.100.0.md` 已补后续替代入口。
|
||||
|
||||
本批已完成现役版本替换导航;无 current 责任的旧版本正文、LimeNext 临时镜像与旧发布计划在后续批次按明确替代 owner 继续物理删除。
|
||||
|
||||
## 8. 第五批:LimeNext 历史化与旧入口替换
|
||||
|
||||
本批已完成文档替换但不做物理删除:
|
||||
|
||||
1. `internal/roadmap/limenext/` 与 `internal/roadmap/limenextv2/` 顶部均明确为 `legacy historical reference`,不再把 SceneApp 页面、命令或 `src-tauri` 路径写成 current。
|
||||
2. 根 `FEATURE-MAP.md` 新增 LimeNext v1/v2 到现行架构与领域路线图的替代关系;后续能力查询不再进入 LimeNext 旧目录。
|
||||
3. `internal/roadmap/Writing/` v1 文档和旧发布执行记录的重复 active 状态已清除,保留历史决策并指向 current v2 与根 Feature Map。
|
||||
|
||||
本批确认并删除:
|
||||
|
||||
- `internal/exec-plans/limenext-progress-from-finder.md`
|
||||
- `internal/exec-plans/limenext-progress-from-finder-edit.md`
|
||||
- `internal/exec-plans/release-v1.100.0.md`
|
||||
|
||||
上述文件均已有 current 替代入口或明确属于历史镜像,现已物理删除。`limenext-v2-fs-blocker-2026-04-22.md` 仍记录独立文件系统阻塞事实,不在本批删除范围。
|
||||
|
||||
## 9. 第六批:SceneApp 与 src-tauri 全面退役
|
||||
|
||||
用户已于 2026-09-02 明确确认删除 `src-tauri` 与 `SceneApp` 相关文档、代码和脚本。本批事实源声明:
|
||||
|
||||
`SceneApp` 与 `src-tauri` 均为 `dead / deleted / forbidden-to-restore`;应用目录归 Plugin current owner,任务执行归 App Server JSON-RPC + RuntimeCore + Agent Runtime,结果参考归通用 Curated Task / Memory reference owner。旧名称只允许出现在负向回流守卫及其测试中。
|
||||
|
||||
本批写集:
|
||||
|
||||
1. 删除 `src/lib/agent/legacySceneAppExecutionSummary*`、Agent Chat 中 `sceneApp*` / `SceneApp*` 执行摘要、复核、脚手架、内容产物与相关测试。
|
||||
2. 从页面参数、Workspace bootstrap、Artifact surface 和 conversation landing surface 移除 `initialSceneAppExecutionSummary`、SceneApp summary card 与 review dialog 接线。
|
||||
3. 将仍有 current 价值的“参考条目结果基线解析 / Curated Task continuation”收回 `curatedTaskReferenceSelection` 与通用 follow-up owner,并删除 `sceneapp_execution_summary` source kind。
|
||||
4. 删除 SceneApp 专属五语言文案与正向测试夹具;更新受影响的组件和测试命名,不保留 SceneApp 兼容字段。
|
||||
5. 删除 SceneApp 专题路线图与旧 Tauri wrapper 删除日志;混合 current 文档改写为 Plugin、Agent Runtime、Artifact、Memory 与 Electron/App Server 当前事实。
|
||||
6. 将负向回流防护集中到 `legacySurfaceCatalog` 与结构测试,删除 ESLint 中仍把 SceneApp 表述为 compat/current 的规则、例外和目录 override。
|
||||
|
||||
退出条件:
|
||||
|
||||
- `src-tauri` 与 SceneApp 生产实现、正向测试、脚本和 active 文档为零;旧词仅存在于 `dead / forbidden-to-restore` 守卫或不可变历史 evidence。
|
||||
- TypeScript 类型检查、受影响定向测试、i18n 检查、`npm run test:contracts`、`npm run governance:legacy-report`、`npm run docs:boundary` 与 `git diff --check` 通过。
|
||||
- GUI 主路径至少完成 `npm run verify:gui-smoke`;若被工作区无关改动阻断,记录准确 blocker,不把 Gate A/B 误报为通过。
|
||||
|
||||
第六批结果:
|
||||
|
||||
1. `src-tauri` 与 SceneApp 命名的现存文件和目录均为零;15 份 Agent Chat / Agent lib 生产实现和正向测试已物理删除,通用 Artifact、Evidence、Curated Task 与 Memory owner 已接回有效职责。
|
||||
2. 30 份复制旧后端结构的功能级 `code-structure.md` 已删除,命令运行时代码地图改为共享 current owner;混合文档已改写为 Plugin、Electron Desktop Host、App Server JSON-RPC、RuntimeCore / Agent Runtime 和 Memory reference。
|
||||
3. `governance/surfaces.yml` 不再把不存在的 Tauri 入口标为 current,文件大小基线不再登记已删除组件;本地 release 指令已替换为 Lime 版本事实源与 Electron Forge 流程。
|
||||
4. App Server contract 不再强制保留 P3.135/P3.137 历史流水账,改为验证 current 执行计划和测试口径中的唯一主链、生产 mock 零回退与 Gate B 边界。
|
||||
5. 排除负向治理守卫、退役裁决、执行记录和不可变 evidence 后,全仓 `SceneApp|src-tauri` 内容扫描为零;历史 evidence 不作为 current owner 或导航入口。
|
||||
|
||||
验证结果:
|
||||
|
||||
- 定向 Vitest:6 files / 240 tests 通过。
|
||||
- `npm run typecheck`、`npm run i18n:check` 通过;五语言覆盖 100%,missing / extra 均为 0。
|
||||
- `npm run test:contracts` 通过;App Server client 299 checks、command catalog、modality、scripts、release workflow、cleanup 与 docs boundary 均通过。
|
||||
- `npm run governance:legacy-report` 通过;零引用候选、分类漂移、边界违规均为 0。
|
||||
- `npm run verify:gui-smoke` 通过;真实 Electron main/preload、App Server sidecar、Claw shell reload、3 个响应式 viewport 与 Memory settings ready。
|
||||
|
||||
第六批完成度:100%。
|
||||
|
||||
## 10. 第七批:旧宿主构建残留与发布收口
|
||||
|
||||
1. 删除 `lime-rs/capabilities/**` 的 Tauri v2 权限文件及本地生成 schema;Electron/Forge 是唯一 Desktop Host 与打包事实源。
|
||||
2. 删除资源管理器生产路径对测试专用 `webviewWindow` 夹具的动态依赖,窗口关闭直接使用平台窗口语义。
|
||||
3. 删除服务端 Tauri origin CORS 白名单,Rust current crate 注释统一改为 App Server / Desktop Host 或宿主无关表述。
|
||||
4. i18n app metadata 审计移除已退役 capability 文件,scope、manifest、evidence 与测试改为 9 个 current 元数据字段。
|
||||
5. 删除根目录 4 个未跟踪构建碎片;发布候选只包含源码、文档、测试、schema 与明确生成证据。
|
||||
|
||||
第七批退出条件:`npm run docs:boundary`、`npm run i18n:check`、`npm run test:contracts`、`npm run governance:legacy-report`、`npm run typecheck`、Rust 相关测试、`npm run verify:gui-smoke` 与 `git diff --check` 全部通过;随后发布 `v1.139.0`。
|
||||
|
||||
第七批结果:
|
||||
|
||||
1. `src-tauri`、SceneApp 命名的实体路径以及 `lime-rs/capabilities`、`lime-rs/gen/schemas` 空目录均已清零;旧名称只保留在负向回流守卫、退役裁决和不可变历史 evidence。
|
||||
2. 删除无导航、无消费者且仍以 `agent_messages` / Tauri Commands 为事实源的 `internal/design/a2ui-persistence.md`;Chrome 扩展的多 Profile 说明改为 current `profileKey` 配置,不再引用已删除命令。
|
||||
3. current 工程导航、App Server 架构/PRD/路线图和 AgentUI 代码地图统一声明 `lime-rs/src/commands/**` 已物理删除,不再把它描述为待清理的 compat 区域。
|
||||
4. 本次累计删除 98 份 Markdown、1 份 HTML、4 份 JSON 和 16 份旧前端源码/测试;文档本地链接扫描、文档边界、时效性和 legacy 治理守卫均保持通过。
|
||||
|
||||
第七批完成度:100%;文档与旧宿主清理已完成,进入 `v1.139.0` 发布阶段。
|
||||
@@ -2627,7 +2627,7 @@ MCP 使用测试流程:
|
||||
- 2026-06-08 18:40 CST P13 legacy project persona wrapper 退场到 `ready_for_review`。`lime-rs/src/commands/persona_cmd.rs` 切断 `create_persona`、`list_personas`、`get_persona`、`update_persona`、`delete_persona`、`set_default_persona`、`list_persona_templates`、`get_default_persona` 对 `PersonaService` / 项目人设表的直接读写,并切断 `generate_persona` 旧 auxiliary Agent 生成、临时 `persona-gen-*` session、provider scope、父会话 evidence 投影和 JSON 解析链;九条旧命令统一返回 deprecated 错误,指向 Knowledge persona pack / Agent Runtime current 主链。旧模式清理结果:legacy Tauri command = `deprecated-fail-closed`,旧项目人设 DB / auxiliary Agent 副作用已移除但 `lime-rs/src/app/runner.rs` 仍注册九条命令,退出条件是释放后删除注册、`commands/mod.rs` 模块声明和不再需要的 wrapper;DevBridge dispatcher = `not-present-for-persona_cmd-wrapper`;Electron compat facade = `not-present`;frontend legacy safeInvoke = `removed`,`src/lib/api/personas.ts` / `.test.ts` 已在 governance 记录为删除;mockPriority/defaultMocks/desktop-host mock = `not-present-for-these-commands`;shared DTO / projection / fallback = `removed-from-wrapper`,本文件不再保留旧 `GeneratedPersona*` DTO、项目模型返回类型、DB / AppHandle / auxiliary runtime 参数或旧 `invoke(...)` 示例,只保留无参 fail-closed command symbol 等待共享注册释放;contract / governance guard = `existing-legacy-surface-catalog-retained`。搜索证据:`rg -n "create_persona|list_personas|get_persona|update_persona|delete_persona|set_default_persona|list_persona_templates|get_default_persona|generate_persona|PersonaService|auxiliary\\.generate_persona|persona-gen-|GeneratedPersona|GeneratedPersonaCommandResult|CreatePersonaRequest|PersonaTemplate|PersonaUpdate" "src" "electron" "packages" "scripts" "lime-rs/src/app/runner.rs" "lime-rs/src/commands/persona_cmd.rs" "lime-rs/crates/services/src/persona_service.rs" "lime-rs/crates/services/src/project_context_builder.rs" "lime-rs/src/services"` 只剩 `runner.rs` 注册、本文件 fail-closed 函数、`PersonaService` / project context builder 服务层测试、辅助 evidence 服务测试基线和前端 session id 前缀 / task tab 测试字面量;`src` / `electron` / `packages` / `scripts` 无旧 persona 命令正向调用。验证:`rustfmt --edition 2021 --check "lime-rs/src/commands/persona_cmd.rs"` 通过;`cargo check --manifest-path "lime-rs/Cargo.toml" -p lime-agent` 通过;`node scripts/check-command-contracts.mjs` 通过,frontend commands `121`、Electron host commands `108`、mock priority commands `0`、DevBridge truth commands `120`;`npm run test:contracts` 通过,App Server client contract `218 checks` 且 command / harness / modality / scripts / electron release workflow / cleanup / docs 守卫均通过;`git diff --check -- "lime-rs/src/commands/persona_cmd.rs" "internal/exec-plans/production-command-current-migration-plan.md"` 通过。状态:`ready_for_review`,退出条件是释放 `lime-rs/src/app/runner.rs`、`commands/mod.rs` 与 contract/catalog/policy 共享文件后,删除九条旧 persona Tauri 注册、模块声明和不再需要的 wrapper;P13 Workspace / Content 整组仍未完成,Knowledge 相关 persona pack 当前由其它进程处理,本刀不夹写。
|
||||
- 2026-06-08 18:31 CST P16 Tray sync legacy Tauri wrapper 退场到 `ready_for_review`。`lime-rs/src/commands/tray_cmd.rs` 删除旧 wrapper 对 `TrayManagerState` / `TrayQuickModelGroup` 的状态读取与 `tray_manager.update_state(...)` 副作用;`sync_tray_model_shortcuts` 统一返回 `DEPRECATED_TRAY_COMMAND`,指向 Electron Desktop Host current 托盘壳能力。旧模式清理结果:legacy Tauri command = `deprecated-fail-closed`,旧 Tauri 托盘状态更新已移除但 `lime-rs/src/app/runner.rs` 仍注册该命令,退出条件是释放后删除注册并按需要删除整个 wrapper;DevBridge dispatcher = `removed-by-parallel-agent`,`lime-rs/src/dev_bridge/dispatcher/tray.rs` 当前已被其它进程删除,本刀不接管该文件;Electron compat facade = `current`,`electron/main.ts` / `electron/ipcChannels.ts` 仍承接真实托盘壳能力;frontend legacy safeInvoke = `current-gateway-only`,`src/lib/api/tray.ts` 已只接受 Electron current 的 `null / undefined` 返回并拒绝 diagnostic / mock-like payload;mockPriority/defaultMocks/desktop-host mock = `blocked/shared`,`src/lib/desktop-host/modelMocks.ts` 仍有 `sync_tray_model_shortcuts: () => ({})` 但文件处共享写集,本刀不夹写;shared DTO / projection / fallback = `not-needed-after-runner-cleanup`,当前仅为 runner 注册保留参数签名;contract / governance guard = `existing-command-contract-retained`;文档 / smoke / 测试旧入口 = `negative-or-current-electron-only`。验证:`rustfmt --edition 2021 --check "lime-rs/src/commands/tray_cmd.rs"` 通过;`cargo check --manifest-path "lime-rs/Cargo.toml" -p lime-agent` 通过;`npx vitest run "src/lib/api/tray.test.ts" --silent=passed-only --disableConsoleIntercept` 通过,1 file / 3 tests;`rg -n "sync_tray_model_shortcuts|TrayManagerState|TrayQuickModelGroup|syncTrayModelShortcuts|DEPRECATED_TRAY_COMMAND" "src/lib/api/tray.ts" "src/lib/api/tray.test.ts" "electron" "src/lib/desktop-host/modelMocks.ts" "lime-rs/src/commands/tray_cmd.rs" "lime-rs/src/app/runner.rs" "lime-rs/src/dev_bridge/dispatcher" "scripts/check-command-contracts.mjs"` 显示旧 Rust wrapper 只剩 fail-closed 和 `runner.rs` 注册,Electron current / 前端网关仍在,`modelMocks.ts` mock 待共享写集释放;`node scripts/check-command-contracts.mjs` 通过,frontend commands `121`、Electron host commands `108`、mock priority commands `0`、DevBridge truth commands `120`;`npm run test:contracts` 通过,App Server client contract `218 checks` 且 command / harness / modality / scripts / electron release workflow / cleanup / docs 守卫均通过;`git diff --check -- "lime-rs/src/commands/tray_cmd.rs" "internal/exec-plans/production-command-current-migration-plan.md"` 通过。状态:`ready_for_review`,退出条件是释放 `lime-rs/src/app/runner.rs`、`src/lib/desktop-host/modelMocks.ts`、Electron / catalog / policy 共享写集后,删除旧 Tauri 注册、清默认 mock,并重跑 `npm run test:contracts` 与托盘模型同步回归;P16 Tray residual 不能因 fail-closed 即标 `done`。
|
||||
- 2026-06-08 18:49 CST Codex p16-updater-tauri-command-deleted 认领 P16 legacy updater Rust command 面退场
|
||||
- 写集:`lime-rs/src/commands/update_cmd.rs`、`lime-rs/src/commands/mod.rs`、`lime-rs/src/app/runner.rs`、`internal/roadmap/appserver/release-updater.md`、`internal/aiprompts/commands.md`、`internal/aiprompts/governance.md`、`internal/aiprompts/quality-workflow.md`、`internal/exec-plans/rust-commands-current-migration-cleanup-plan.md`、`internal/exec-plans/production-command-current-migration-plan.md`
|
||||
- 当时写集已退出 active tree;更新器 current owner 见 `electron/updateHost.ts`、`forge.config.mjs` 与 `internal/roadmap/appserver/release-updater.md`。
|
||||
- 只读参考:`electron/updateHost.ts`、`electron/hostCommands.ts`、`electron/ipcChannels.ts`、`src/lib/api/appUpdate.ts`、`src/lib/desktop-host/updateMocks.test.ts`、`internal/roadmap/appserver/release-updater.md`、`lime-rs/src/app/runner.rs`
|
||||
- 避让:Electron Host / IPC、`src/lib/api/appUpdate.ts`、desktop-host updater mock、contract/catalog/policy 共享热区不夹写;Knowledge 全域由其它进程处理,本刀不触碰
|
||||
- 目标:Electron updater 已是 current 事实源、前端 appUpdate 网关已 diagnostic/shape fail-closed、desktop-host updater mock 已清空后,直接删除旧 Tauri updater command 面,避免缺少真实 Electron updater bridge 时回落到旧 Rust 更新器,也避免在 `lime-rs/src/commands/` 继续保留 updater stub
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
# Lime v1.102.0 发布执行计划
|
||||
|
||||
状态:发布中(用户确认跳过剩余门禁)
|
||||
日期:2026-07-14
|
||||
|
||||
## 目标
|
||||
|
||||
从 `v1.101.0` 基线发布当前完整工作树为 `v1.102.0`,完成版本与双语发布说明同步、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.101.0`;任务开始时 `main` 与 `origin/main` 同步,基线后无已提交 commit。
|
||||
- 候选集:提交前 staged 候选为 486 个源码、协议、GUI、测试、文档和 evidence 文件;本计划作为第 487 个文件强制纳入仓库记录。
|
||||
- 范围:当前工作树内 Agent runtime、App Server、MCP、canonical projection、GUI、协议/schema、测试、文档、治理删除与逐切片 evidence 全部进入本次发布。
|
||||
- 排除项:无。未发现个人配置、缓存、构建产物或无法归属的本地实验文件。
|
||||
|
||||
## 写集
|
||||
|
||||
- 发布 metadata:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`。
|
||||
- 执行记录:本文件。
|
||||
- `pnpm-lock.yaml` 不包含 workspace 发布版本,因此不做无意义改写。
|
||||
- 其余候选代码仅做只读审计、验证与整体 staging,不夹写已有实现。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- [x] 目标版本规范化为 `1.102.0`,目标 tag 为 `v1.102.0`,本地与远端均无同名 tag。
|
||||
- [x] 版本事实源与双语单页 release notes 更新完成,旧版本标题清零。
|
||||
- [x] `npm run verify:app-version` 通过。
|
||||
- [x] `npm run typecheck` 通过。
|
||||
- [x] `npm run test:contracts` 通过。
|
||||
- [x] Rust 定向回归通过;完整 Rust related gate 在收口期间先后被 stale fixture、并行写入和磁盘空间阻断,最终一轮按用户指令停止,不声明全量通过。
|
||||
- [x] 用户明确要求“不用再检测了,马上递交发布”,剩余 GUI/current fixture 与最终重复门禁按发布决策跳过。
|
||||
- [x] 全量 candidate staged,复核无个人配置、缓存或构建产物。
|
||||
- [ ] 用户明确确认 git 高风险操作后,连续完成 commit、tag、push main、push tag 与远端复核。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;generated protocol、App Server client、command/harness/modality/scripts/Electron release/docs boundary 均通过。
|
||||
- Rust focused:AgentControl、canonical Tool sequence、outer event envelope、MCP active-time handler 与 Multi-Agent producer 定向回归通过。
|
||||
- Rust full related:未形成最终通过结果;最后一轮在 `app-server` 链接阶段按用户“停止检测、立即发布”指令终止。
|
||||
- GUI:候选 evidence 中已有 `verify:gui-smoke`、Claw cancel/reentry Gate B 与 MCP/Agent current fixture 记录;release owner 未在最终 staged 快照上重复全量执行。
|
||||
- 发布决策:用户已知悉剩余验证未完成,并明确确认 commit、tag 与 push。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 本次 candidate 包含重大架构变更;`internal/aiprompts/architecture.md` 已在候选集中同步更新。
|
||||
- 架构图确认:已确认 reverse JSON-RPC、MCP runtime/control-plane、Agent graph/mailbox 与 canonical projection 图示/文字边界进入同一发布候选集。
|
||||
- 责任人:release owner(v1.102.0)
|
||||
- 日期:2026-07-14
|
||||
@@ -1,54 +0,0 @@
|
||||
# Lime v1.103.0 发布执行计划
|
||||
|
||||
状态:release-ready / gates-passed / publication-authorized
|
||||
日期:2026-07-15
|
||||
目标版本:`1.103.0`
|
||||
目标 tag:`v1.103.0`
|
||||
|
||||
## 目标
|
||||
|
||||
将 `v1.102.0` 后当前工作树中的 Refactor V2 Agent 主链收口作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、`.gitignore`、本计划。
|
||||
- `candidate changes`:candidate freeze 时工作树中的 382 个修改、29 个删除和 97 个未跟踪源码、测试、schema、文档与 evidence 路径,共 508 个候选路径;全部围绕 canonical Thread/Turn/Item、AgentControl/SubAgent、Agent Chat current owner、App Server owner 拆分和 S7 gate refinement。
|
||||
- `excluded changes`:candidate freeze 之后由并行 owner 新启动的 S7y Approval cold/live typed response 与 S5 compat residual 增量不进入 `v1.103.0`,保留为下一版本工作树;它们不属于已冻结并完成门禁的 508 个候选路径。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
本发布任务修改 release metadata,并在候选 owner 释放后补齐 S2n/S7x evidence、中央计划状态、history Electron oracle readiness regression 与两处 docs boundary 文案。其余 Electron、App Server、Renderer、协议、测试和 roadmap 候选文件只读核对并原样纳入,不扩大发布收口写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. S2m、S2n 与 S7x closeout 形成 evidence / handoff,候选集连续稳定且没有活跃测试写入。
|
||||
2. 所有版本事实源为 `1.103.0`,`npm run verify:app-version` 通过,旧版本只允许出现在 release comparison 和历史文档上下文。
|
||||
3. `npm run typecheck` 通过;协议、Rust 与 GUI 风险按当前变更补足 `npm run test:contracts`、定向 Rust 验证和 `npm run verify:gui-smoke`。
|
||||
4. `git diff --check` 通过;staged 集覆盖全部 release metadata 与 candidate changes,且没有未说明的排除项。
|
||||
5. 获得危险操作确认后,连续完成 `git commit`、`git tag v1.103.0`、`git push origin main`、`git push origin v1.103.0`,并复核本地与远端 tag。
|
||||
|
||||
## 当前状态
|
||||
|
||||
- S2m/S2n conversation import Plan 与 Message lifecycle 已完成 focused 验证并形成 evidence;本地 owner 进入 released。
|
||||
- S7x focused 55/55 与 reasoning-first Gate B 通过;history replay oracle readiness race 已修复,原始 Electron fixture 复跑通过。
|
||||
- 两处 docs boundary 旧引用已修正为 `internal/roadmap guard`。
|
||||
- candidate 已冻结且没有未说明排除项;最终 aggregate gates 全部通过,发布写操作已获用户授权。
|
||||
- 发布 cutoff 以已验证的 staged index 为准;冻结后新启动的 S7y/S5 工作保持 unstaged,不中断、不覆盖,也不改变本版本 tag 内容。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,版本一致为 `1.103.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;protocol types 698/0 drift、App Server client 288 checks、command、Harness、modality、scripts、Electron release workflow、cleanup 与 docs boundary 全部通过。
|
||||
- S2m focused Rust:2/2;shared related App Server:1097/1097。
|
||||
- S2n focused Rust:2/2;exact rustfmt 与 narrow diff check 通过。
|
||||
- S7x focused Vitest:4 files / 55 tests;ESLint、Prettier、diff 与 reasoning-first Gate B 通过。
|
||||
- history replay Electron fixture:`ok=true`、reasoning summary 1、image attachments 2、MCP tool rows 1、console errors 0。
|
||||
- `npm run verify:gui-smoke`:通过;Renderer、Electron host/preload、真实 App Server sidecar `1.103.0`、Claw workbench 与 settings 主路径就绪。
|
||||
- `git diff --check`:通过。
|
||||
|
||||
## 架构确认
|
||||
|
||||
本发布任务本身不改变架构;candidate 的重大架构切片已在 `internal/aiprompts/architecture.md` 与 `internal/exec-plans/refactor-v2-implementation.md` 逐项确认。发布门禁只引用这些既有确认,不新增第二套 owner、compat 或 fallback。
|
||||
|
||||
当前完成度:`90%`。下一刀:复核 staged candidate 后执行 release commit、tag、main/tag push 与远端校验。
|
||||
@@ -1,65 +0,0 @@
|
||||
# Lime v1.104.0 发布执行计划
|
||||
|
||||
状态:release-ready / gates-passed / awaiting-publication-authorization
|
||||
日期:2026-07-15
|
||||
目标版本:`1.104.0`
|
||||
目标 tag:`v1.104.0`
|
||||
|
||||
## 目标
|
||||
|
||||
将 `v1.103.0` 后当前工作树中的 Refactor V2 Agent 主链收口作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.103.0`;任务开始时 `main`、`origin/main` 与该 tag 指向同一提交,目标 tag 在本地与远端均不存在。
|
||||
- 用户确认范围:任务开始时工作树中的 336 个已跟踪改动和 82 个未跟踪源码、测试、schema、脚本、文档与 evidence 路径全部进入本次发布,无排除项。
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md` 与本计划。
|
||||
- `candidate changes`:canonical Message/Reasoning/Plan lifecycle、typed AgentMessage content parts、ThreadStore ordinal 与 projection fail-closed、AgentSession current presentation、provider 双代数删除、Approval typed response、AgentControl effective route/visible DOM、MCP elicitation capability、GUI current owner/i18n、Runtime/GUI fixture 与治理 evidence。
|
||||
- 用户确认后并行 owner 完成的 S4ag-S4ak current 收口也进入本次 release candidate;没有覆盖或排除其写集。
|
||||
- 最终候选冻结为 472 个路径:336 个修改、42 个删除、94 个新增源码、测试、schema、脚本、文档、evidence 与 release metadata 路径。
|
||||
- `excluded changes`:无。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
本发布任务只修改 7 个 release metadata / execution record 文件。其余候选文件只读核对、运行验证并原样纳入;不夹写既有 Agent Runtime、App Server、Renderer、协议、脚本、测试和 roadmap 实现。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源为 `1.104.0`,`npm run verify:app-version` 通过,旧版本只允许出现在 release comparison 和历史文档上下文。
|
||||
2. 双语 release notes 采用当前版本单页,准确覆盖本次 canonical lifecycle、ThreadStore、provider、Approval、GUI/i18n、fixture 与治理收口。
|
||||
3. `npm run typecheck` 通过;按候选风险执行 `npm run test:contracts`、`npm run test:rust:changed`、`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke`。
|
||||
4. `git diff --check` 通过;staged 集覆盖全部 release metadata 与 candidate changes,没有未说明的排除项。
|
||||
5. 重大架构改动已同步 `internal/aiprompts/architecture.md`,并在本计划记录架构影响、图示/文字边界、责任人与日期。
|
||||
6. 获得危险操作确认后,连续完成 `git commit`、`git tag v1.104.0`、`git push origin main`、`git push origin v1.104.0`,并复核本地与远端 tag。
|
||||
|
||||
## 当前状态
|
||||
|
||||
- 用户已明确确认当前工作树全部改动进入 `v1.104.0`,无排除项。
|
||||
- `HEAD`、`origin/main` 与 `v1.103.0` 一致;`v1.104.0` 本地/远端 tag 均不存在。
|
||||
- release metadata 已完成,所有发布门禁通过;staging 与发布 Git 写操作待执行。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,版本一致为 `1.104.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;protocol types 700/0 drift、App Server client 288 checks、command、Harness、modality、scripts、Electron release workflow、cleanup 与 docs boundary 全部通过。
|
||||
- 最终快照复验的 `npm run typecheck`:通过。
|
||||
- 最终快照复验的 `npm run test:contracts`:通过;protocol types 700/0 drift、App Server client 288 checks、command、Harness、modality、scripts、Electron release workflow、cleanup 与 docs boundary 全部通过。
|
||||
- `npm run governance:legacy-report`:通过;零引用候选 `0`、分类漂移 `0`、边界违规 `0`。
|
||||
- `npm run test:rust:changed`:通过;因 workspace manifest/version 变更按 runner 规则扩大为 workspace library tests。App Server 1124/1124、Agent Runtime 117/117、MCP 140/140、Model Provider 126/126、Tool Runtime 251/251 等全部通过;有 4 条 App Server test-only unused/dead-code warning,联网或沙箱限制用例保持明确 ignored。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 history/cache、stream terminal、Electron fixture guard、首页、Coding、媒体、Approval、Inputbar queue、Plan、Skills、MCP、Expert 与 Content Factory current 链,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;renderer、Electron main/preload、真实 App Server sidecar `1.104.0`、Claw workbench 与 memory settings 就绪。
|
||||
- S4al AgentControl cold-restart visible-DOM Gate B:通过;真实关闭并重启 Electron/App Server 后六个 Tool、SubAgent activity 与 child Thread identity 完全稳定,`agentSession/read`/`thread/list` 均走 `electron-ipc/success`,console/invoke error 0。
|
||||
- S5ag workspace command wiring:通过;最终 `AgentChatWorkspace` 只组合 current owner 返回值,command scope 复用既有 runtime hooks,`npm run typecheck` 与 `npm run verify:gui-smoke` 针对最终快照通过。
|
||||
- S4ah AgentControl visible-DOM Gate B:28/28 assertions,六个 AgentControl Tool row completed/visible,三类 activity 可见,console/invoke error 0。
|
||||
- S4ak MCP elicitation Gate B:通过;runtime initialize 为 `2025-06-18 + { elicitation: {} }`,management capability absent,表单提交/关闭与最终 read model 完成。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。本候选收紧 canonical Message/Reasoning/Plan lifecycle、ThreadStore ordinal/projection、AgentSession presentation 与 provider-neutral algebra owner,并删除旧 fallback、双代数、generic lowering 与 synthetic Team fixture。
|
||||
- 架构图/文字边界:`internal/aiprompts/architecture.md` 已随候选同步更新 current owner、EventLog-first fail-closed 顺序、typed content parts 与 dead/forbidden-to-restore 路径。
|
||||
- 架构图确认:已确认 current owner、依赖方向和删除分类与本候选一致,不新增第二 runtime、read model、provider algebra 或 mock fallback。
|
||||
- 责任人:release owner(v1.104.0)。
|
||||
- 日期:2026-07-15。
|
||||
|
||||
当前完成度:`90%`。下一刀:复核最终 staged candidate,取得危险操作确认后执行 release commit、tag、main/tag push 与远端校验。
|
||||
@@ -1,63 +0,0 @@
|
||||
# Lime v1.105.0 发布执行计划
|
||||
|
||||
状态:validated / awaiting-git-confirmation
|
||||
日期:2026-07-16
|
||||
目标版本:`1.105.0`
|
||||
目标 tag:`v1.105.0`
|
||||
|
||||
## 目标
|
||||
|
||||
将 `v1.104.0` 后当前工作树中的 unified exec、Multi-Agent、Codex 导入、Provider、GUI、测试与治理改动作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.104.0`;任务开始时 `main`、`origin/main` 与该 tag 指向同一提交,目标 tag 在本地与远端均不存在。
|
||||
- 用户确认范围:最终工作树中的 401 个修改、77 个删除和 46 个未跟踪源码、测试、schema、脚本、文档与 evidence 路径全部进入本次发布,共 524 个路径,无排除项。
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md` 与本计划。
|
||||
- `candidate changes`:unified exec/PTY/execution process、AgentControl fork/crash commit、canonical conversation import、provider SSE、Agent GUI current owner、DeepSWE/project Gate harness、schema/client、测试、文档与治理删除。
|
||||
- `excluded changes`:无。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
本发布任务更新 7 个 release metadata / execution record 文件,并在发布门禁中对 queued-only active identity、Agent Runtime `FinishReason` import、Renderer read-model status import、approval fixture terminal predicate 与 execution process terminal wait 做最小根因修复。其余候选文件只读核对、运行验证并原样纳入,不覆盖无关并行实现。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源为 `1.105.0`,`npm run verify:app-version` 通过,旧版本只允许出现在 release comparison 和历史文档上下文。
|
||||
2. 双语 release notes 采用当前版本单页,准确覆盖本次 unified exec、Multi-Agent、Codex 导入、Provider、GUI 与验证基础设施改动。
|
||||
3. `npm run typecheck` 通过;按候选风险执行 `npm run test:contracts`、`npm run test:rust:changed`、`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke`。
|
||||
4. `git diff --check` 通过;staged 集覆盖全部 release metadata 与 candidate changes,没有未说明的排除项。
|
||||
5. 重大架构改动已同步 `internal/aiprompts/architecture.md`;仍在推进的 Codex 导入和项目 Gate 状态不得在 release notes 中误写为已完成。
|
||||
6. 获得危险操作确认后,连续完成 `git commit`、`git tag v1.105.0`、`git push origin main`、`git push origin v1.105.0`,并复核本地与远端 tag。
|
||||
|
||||
## 当前状态
|
||||
|
||||
- 用户已明确确认当前工作树全部改动进入 `v1.105.0`,包括仍在推进的 Codex 导入与项目 Gate 工作,无排除项。
|
||||
- `HEAD`、`origin/main` 与 `v1.104.0` 一致;`v1.105.0` 本地/远端 tag 均不存在。
|
||||
- release metadata 已更新,发布门禁已通过;staging 与 Git 发布操作待危险确认。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm package、Rust workspace、sidecar manifest 一致为 `1.105.0`。
|
||||
- `npm run typecheck`:通过;门禁期间发现并修复 Renderer read-model projection 缺失的 type-only import。
|
||||
- `npm run test:contracts`:通过;697 个 protocol types 无漂移,App Server client 290 checks,command / harness / modality / scripts / Electron release workflow / docs boundary 全部通过。
|
||||
- `npm run test:rust:changed`:因 workspace manifest / lockfile 触达扩大为 `cargo test --lib --workspace`,最终通过;包含 Agent Protocol 29、Agent Runtime 117、App Server 1149、Tool Runtime 246 等测试。
|
||||
- `cargo check --manifest-path "lime-rs/Cargo.toml" -p agent-runtime`:通过;修复 provider turn 新增 `FinishReason` 映射时遗漏的 import。
|
||||
- queued / active 定向 Rust 回归:`active_turn_id_from_stored_turns_uses_latest_executing_turn` 与 `queued_turn_keeps_thread_running_without_becoming_active` 通过,queued-only 线程保持 running 但不再回填 active identity。
|
||||
- execution process JSON-RPC terminal 回归连续运行 10 次通过;测试改为等待真实 `exited` predicate,消除 stdout 先于终态提交的负载竞态。
|
||||
- Renderer read-model / stream / workspace 定向回归共 45 项通过;`appServerReadModelProjection` 修复后 9 项再次通过。
|
||||
- approval fixture wait / guard 65 项通过;`approval-request-resume` 唯一前缀 Gate B 通过,首轮 compact record 与第二轮 session cache 均稳定可见。
|
||||
- `inputbar-pending-steer-pop-front-resume` 唯一前缀 Gate B 通过:真实 Electron、preload/IPC、App Server JSON-RPC、queued promote/cancel/resume/read model 与 GUI input ready 全部成立,无 console / page / invoke error、legacy 命中或 mock fallback。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:完整通过,覆盖 history/cache、coding、image、cancel/continue、四类 approval、rich restore、multi queue、pop-front resume、Plan、Skills、MCP、Expert 与 Content Factory;`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;production renderer、Electron main/preload、App Server `1.105.0` sidecar、Claw shell reload 与 memory settings 完成,evidence run=`standalone-shell-01-20260716033513-36687`。
|
||||
- `git diff --check`:通过。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选新增 unified exec/execution process、Multi-Agent fork/crash commit,并把 Codex import 从 imported runtime-event 双轨迁向 canonical Thread/Turn/Item。
|
||||
- 架构图/文字边界:`internal/aiprompts/architecture.md` 已随候选同步 current owner、依赖方向、canonical import 与 crash commit。
|
||||
- 架构图确认:已复核。`internal/aiprompts/architecture.md` 覆盖本候选的 current owner 与依赖方向;门禁根因修复未新增 public boundary 或第二套 owner。Codex import 与项目 Gate 仍为 active follow-on,不在本版本中宣称全量验收完成。
|
||||
- 责任人:release owner(v1.105.0)。
|
||||
- 日期:2026-07-16。
|
||||
|
||||
当前完成度:`95%`。下一刀:取得 Git 危险操作确认后,连续完成 `git add -A`、release commit、tag、main/tag 推送与远端复核。
|
||||
@@ -1,66 +0,0 @@
|
||||
# Lime v1.106.0 发布执行计划
|
||||
|
||||
状态:validated-awaiting-git-confirmation
|
||||
日期:2026-07-17
|
||||
目标版本:`1.106.0`
|
||||
目标 tag:`v1.106.0`
|
||||
|
||||
## 目标
|
||||
|
||||
将 `v1.105.0` 后当前工作树中的 Provider transport、多模态、App Server 并发、Codex 导入、Multi-Agent、Agent GUI、Settings Gate 与质量治理改动作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.105.0`;任务开始时 `main`、`origin/main` 与该 tag 指向同一提交,目标 tag 在本地与远端均不存在。
|
||||
- 任务开始时工作树包含 243 个已跟踪改动和 27 个未跟踪源码、测试、schema、脚本与文档路径,共 270 个候选路径;未发现缓存、凭证、个人环境或临时产物。
|
||||
- 门禁期间并行 Codex import owner 新增后台 import job、progress/read method、GUI 进度与生成协议工件,Settings / Agent fixture owner 同时扩展 Gate B harness;最终冻结盘点为 285 个已跟踪改动和 48 个未跟踪文件,共 333 个候选路径。
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md` 与本计划。
|
||||
- `candidate changes`:Provider Responses WebSocket/HTTP fallback、多模态 input media、App Server dispatcher/stdio concurrency、provider history/compaction、Multi-Agent mailbox lifecycle、Codex canonical import/performance/background job/GUI、Settings Gate A、native executable environment、protocol/client/i18n、测试、文档与治理删除。
|
||||
- `excluded changes`:无。除 release metadata 外,候选业务文件只读核对、运行验证并原样纳入。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
本发布任务只更新上述 7 个 release metadata / execution record 文件;不重写其余脏工作树中的候选实现,不覆盖并行工作结果。若门禁发现产品缺陷,只在确认根因后修改对应 current owner,并把新增写集和验证记录回本计划。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源为 `1.106.0`,`npm run verify:app-version` 通过;旧版本只允许出现在 release comparison、历史计划和变更上下文。
|
||||
2. 双语 release notes 采用当前版本单页,准确覆盖 Provider WebSocket、多模态、App Server 并发、Codex 导入、Multi-Agent、GUI 与质量治理,并明确 Windows/live/eval 和超大 rollout 后续边界。
|
||||
3. `npm run typecheck` 通过;按候选风险执行 `npm run test:contracts`、`npm run test:rust:changed`、`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke`。
|
||||
4. `git diff --check` 通过;staged 集覆盖全部 release metadata 与 candidate changes,没有未说明的排除项。
|
||||
5. 重大架构改动已同步 `internal/aiprompts/architecture.md`;本计划完成 release owner 架构复核,不把仍 active 的项目 Gate、Windows/live/eval 或超大 rollout 后台导入误写为完成。
|
||||
6. 获得危险操作确认后,连续完成 `git add -A`、`git commit -m "Release v1.106.0"`、`git tag v1.106.0`、`git push origin main`、`git push origin v1.106.0`,并复核本地与远端 tag。
|
||||
|
||||
## 当前状态
|
||||
|
||||
- release candidate 已冻结,纳入当前全部产品、文档、测试、schema 与脚本改动,无排除项。最终快照为 285 个 tracked、48 个 untracked,共 333 个路径;门禁结束时未发现仍在修改候选源码的测试或构建进程。
|
||||
- 版本事实源和双语 release notes 已更新,release notes 已纳入后台 import job、GUI progress 与 Settings Gate B 最终行为。
|
||||
- App Server `conversationImport/thread/commit` -> Renderer gateway -> `conversationImport/job/read` polling -> GUI progress 主链已接通,五语言 progress 文案齐全;gateway、view-model 与 progress component 定向回归 27/27 通过。
|
||||
- protocol catalog 测试已补入 `METHOD_CONVERSATION_IMPORT_JOB_READ`;定向 catalog 测试和扩大后的 `npm run test:rust:changed` 均通过。
|
||||
- 冻结摘要排除本发布计划自身后:tracked diff `9a9cd2ea4222703b306080c81ab94636f40694240ece610427e649d2b54673ff`,untracked content `b77e75a24b72546a1f524f641dd8c8aeb6603ba4b51649a57d0303e819fe1352`。最终门禁后复核无业务候选漂移。
|
||||
- 本地与远端 `v1.106.0` 均不存在;`main`、`origin/main` 仍指向 `v1.105.0` 提交 `a44d88585b7d`。
|
||||
- Git staging、commit、tag 与 push 尚未执行,等待危险操作确认。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:最终快照通过,版本事实源一致为 `1.106.0`。
|
||||
- `npm run typecheck`:最终快照通过。
|
||||
- `npm run test:contracts`:最终快照通过;704 个 v0 types 无漂移,App Server client 291 checks,Electron Host 93 commands,mock priority 0,modality/scripts/release/docs boundary 全绿。
|
||||
- `cargo check --manifest-path "lime-rs/Cargo.toml" -p app-server-protocol -p app-server`:通过;存在一个后台 import 接入后未使用的同步 commit wrapper warning,由热区 owner 处理。
|
||||
- conversation import gateway/view-model/progress component 定向回归:27/27 通过;覆盖 start/read job、polling success/failure/timeout/abort、真实 item progress、五语言文案与稳定 progress surface。
|
||||
- `npm run test:rust:changed`:补齐 protocol catalog 断言后完整通过;workspace 扩大门禁、App Server 1181、Agent Runtime 121、Tool Runtime 246 及其余受影响 crate 均通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 history/cache、terminal、审批、rich restore、FIFO queue、Plan、Skills、MCP structured content、media reference、Expert Skills 与 Content Factory;`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;renderer、Desktop Host、preload、App Server sidecar、Workbench、Memory Settings 与 reload 主路径可用,App Server 报告 `appserver.v0` / `1.106.0`。
|
||||
- `npm run smoke:settings-about-electron-fixture`:通过;Settings About 版本页专项 Gate B 证据已生成。
|
||||
- `npx prettier --check "RELEASE_NOTES.md" "RELEASE_NOTES.en.md" "internal/exec-plans/release-v1.106.0-plan.md"`:通过。
|
||||
- `git diff --check`:最终候选快照通过。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选新增 Provider Responses WebSocket transport、App Server request 并发调度与 Codex import 增量 materialization,并统一 canonical message/media/history projection。
|
||||
- 架构图/文字边界:`internal/aiprompts/architecture.md` 已随候选同步 App Server dispatcher/stdio、Provider session transport、宿主进程 deadline 与 canonical import/GUI owner。
|
||||
- 架构图确认:release owner 已复核并确认 Provider transport、App Server dispatcher/stdio serialization、canonical import/background job 与 GUI owner 均符合 current 单轨边界。此确认只允许本候选进入 release evidence,不关闭仍 active 的 Codex import、项目 Gate、Windows 平台证据或 Refactor V2 后续计划。
|
||||
- 责任人:release owner(v1.106.0)。
|
||||
- 日期:2026-07-17。
|
||||
|
||||
当前完成度:`95%`。下一刀:暂存全部 333 个候选路径并复核 staged 摘要;获得危险操作确认后连续完成 release commit、`v1.106.0` tag、main/tag 推送与远端 tag 复核。
|
||||
@@ -1,69 +0,0 @@
|
||||
# Lime v1.107.0 发布执行计划
|
||||
|
||||
状态:ready-to-rerun-release
|
||||
日期:2026-07-18
|
||||
目标版本:`1.107.0`
|
||||
目标 tag:`v1.107.0`
|
||||
|
||||
## 目标
|
||||
|
||||
将 `v1.106.0` 后当前工作树中的 Electron 更新链、Windows Squirrel 发布验证、Agent canonical projection、Codex 导入、Settings/Browser Runtime、首页皮肤、GUI timeline、质量脚本与治理文档改动作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.106.0`;任务开始时 `main`、`origin/main` 与该 tag 指向同一提交,目标 tag 在本地不存在。
|
||||
- 初始候选盘点包含 213 个已跟踪改动和 72 个未跟踪文件,共 285 个候选路径;本轮追加 Windows Squirrel N-1 导航竞态修复、Release sherpa-onnx 预编译库预热、回归测试及首页皮肤资源,仍无排除项。
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md` 与本计划。
|
||||
- `candidate changes`:当前工作树全部产品、测试、脚本、schema、资源、治理和文档改动,无排除项。
|
||||
- `excluded changes`:无。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
本发布任务只新增/更新上述 release metadata 与执行记录文件,不重写其余脏工作树中的候选实现,不覆盖并行工作结果。若门禁发现产品缺陷,只在确认根因后修改对应 current owner,并把新增写集和验证记录回本计划。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源为 `1.107.0`,`npm run verify:app-version` 通过;旧版本只允许出现在 release comparison、历史计划和变更上下文。
|
||||
2. 双语 release notes 采用当前版本单页,覆盖 Electron 更新、Windows Squirrel、Agent/导入 canonical projection、Settings/Browser Runtime、首页皮肤、GUI 与质量治理。
|
||||
3. `npm run typecheck` 通过;按候选风险执行 `npm run test:contracts`、`npm run test:rust:changed`、`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke`,并补充 Windows Squirrel RC 定向回归。
|
||||
4. `git diff --check` 通过;staged 集覆盖全部 release metadata 与 candidate changes,没有未说明的排除项。
|
||||
5. 重大架构改动已同步 `internal/aiprompts/architecture.md`,release owner 完成架构边界复核。
|
||||
6. 获得危险操作确认后,连续完成 `git add -A`、`git commit -m "Release v1.107.0"`、`git tag v1.107.0`、`git push origin main`、`git push origin v1.107.0`,并复核本地与远端 tag。
|
||||
|
||||
## 当前状态
|
||||
|
||||
- Release candidate 已冻结,纳入当前全部候选路径,无排除项;用户已明确要求覆盖 `v1.107.0` 并递交全部当前改动。
|
||||
- 版本事实源与双语 release notes 已更新,并补记 Windows startup-page navigation race hotfix。
|
||||
- 首轮覆盖提交 `7fb666415` 已完成并推送;Release workflow `29631194668` 因三平台构建时缺少 sherpa-onnx 预编译库失败,未进入 Windows N-1 smoke。
|
||||
- 已加入 Release 与 Quality/Windows smoke 构建前按目标显式准备 sherpa-onnx 运行库的 workflow guard;同时纳入 provider SSE usage trailer、thinking 修订快照去重、首页层级/皮肤布局和 Claw 路由草稿清理修复,待覆盖提交、tag 和 workflow。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,版本事实源一致为 `1.107.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;protocol types 704 个无漂移,App Server client 291 checks,Electron host 93 commands,mock priority 0,modality/scripts/release/docs boundary 全绿。
|
||||
- `npm run test:rust:changed`:通过;workspace 全量 lib tests,App Server 1183、Agent Runtime 121、Tool Runtime 247 及其余受影响 crate 全部通过;首次运行的 1 个过时顺序断言已修正并定向复测通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 Agent history/cache、Claw GUI、coding workbench、图片/媒体、approval、Inputbar queue、Plan、Skills/MCP、Expert Skills 与 Content Factory,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;renderer、Desktop Host、preload、App Server sidecar、Workbench、Memory Settings 与 reload 主路径可用,报告 `appserver.v0 / 1.107.0`。
|
||||
- `git diff --check`:通过。
|
||||
- `npx vitest run scripts/electron/windows-squirrel-rc-smoke.test.mjs scripts/electron/release-workflow-guard.test.mjs scripts/electron/current-entrypoints.test.mjs`:通过,3 files / 52 tests。
|
||||
- 更新 workflow 后 `npx vitest run scripts/electron/release-workflow-guard.test.mjs scripts/electron/windows-squirrel-rc-smoke.test.mjs scripts/electron/current-entrypoints.test.mjs src/components/agent/chat/components/EmptyStateLayout.test.tsx src/components/agent/chat/components/homeSkinPresentation.test.ts`:通过,5 files / 62 tests。
|
||||
- 两个 Windows Squirrel 修改脚本 `node --check`:通过。
|
||||
- 首轮远端 Release `29631194668`:失败于三平台 `app-server` 链接;Windows `sherpa-onnx-c-api.lib` 缺失,macOS `sherpa-onnx-c-api` 共享库目录缺失,未执行 N-1。
|
||||
- 第二轮 `29631571374` 与第三轮 `29631599498` 在新增预热步骤解压阶段暴露 Windows Git Bash 驱动器路径解析错误;已改为 basename + workspace cwd,补充跨平台回归。
|
||||
- 本轮同时纳入 provider SSE `finish_reason` 终止修复与 revised thinking snapshot 去重;Rust related 矩阵 1182 项通过、1 项既有 app-server 时序断言失败,需单独复核。
|
||||
- 本轮工作树追加差异的定向验证:`npm run verify:app-version`、`npm run typecheck`、`git diff --check` 通过;6 个前端 Vitest 文件 61 项通过;`cargo test --manifest-path "lime-rs/Cargo.toml" -p model-provider --lib current_client` 45 项通过。
|
||||
- 远端 Quality `29633271523` 的失败证据:Vitest layer budget 36/30(既有仓库基线)、GUI smoke 与 Rust Full 均因 CI sherpa-onnx 预编译库未准备而链接失败;新 SHA `46f445588` 已验证 GUI smoke 预热成功,Rust Full 仍缺该步骤,已追加同样的目标预热并待下一 SHA 复验。
|
||||
- Quality `29635195772` 已证明 sherpa 预热修复有效:GUI smoke 通过,Rust workspace 编译并通过 1183 项;剩余 Rust 失败来自 `host_boundary_guard` 检出单元测试 fixture 中的 `electron` 字面量,已改为中性 host fixture 并在本地复测 2 项守卫通过。
|
||||
- Release `29635584989` 已越过 Windows 构建、资源校验、staging 和 N-1 下载,真实 N-1 smoke 暴露安装器父进程退出后 `Update.exe` 仍持有 Squirrel 单实例锁;结构化错误为 `AutoUpdater process with arguments --checkForUpdate,... is already running`。RC helper 现按完整 executable path 等待安装器遗留 updater 退出后才启动 N-1 应用,55 项 Electron/Release 定向回归通过。
|
||||
- Release `29636439016` 证明外部 `Update.exe` 等待仍不足以消除重复检查:`v1.106.0` 没有候选版本已加入的下载中去重保护,RC harness 的手动检查会与 N-1 App Sidebar 自动检查竞争并再次触发 native updater。harness 现只等待并观察 N-1 自动检查 session,禁止主动调用 `check_for_updates`;真实 Windows 终态待下一次 Release 验证。
|
||||
- 真实 Windows packaged L8/N-1 验证:待路径修复后的远端 Release workflow 执行;本机为 macOS,无法代替 Windows 证据。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选涉及 Electron Desktop Host/update、App Server canonical read model、Agent/Thread/Turn/Item projection、Browser Runtime 与 GUI 皮肤/设置主链。
|
||||
- 架构图/文字边界:`internal/aiprompts/architecture.md` 已在候选中同步;发布 owner 需在门禁完成后复核 current 单轨边界。
|
||||
- 责任人:release owner(v1.107.0)。
|
||||
- 日期:2026-07-18。
|
||||
|
||||
当前完成度:`97%`。下一刀:提交 Squirrel updater quiescence 修复,覆盖 `v1.107.0` 到最终 SHA,再监控三平台构建和 Windows N-1 终态。
|
||||
@@ -1,71 +0,0 @@
|
||||
# Lime v1.108.0 发布执行计划
|
||||
|
||||
状态:ready-for-release-confirmation
|
||||
日期:2026-07-21
|
||||
目标版本:`1.108.0`
|
||||
目标 tag:`v1.108.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
把 `v1.107.0` 后当前工作树中的 RuntimeCore、App Server v2 Thread/Turn/Item 协议、Electron Desktop Host、Renderer projection、Settings、Agent/Plugin runtime、存储迁移、测试与治理改动作为单一 release candidate,先取得匹配风险的 Gate A 与 Gate B 证据,再完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:门禁与最终候选冻结完成,等待 Git 发布危险操作确认。
|
||||
- Gate A 已按 `internal/refactor/v1/05-verification-and-guardrails.md` 完成;Gate B 已取得真实 Electron、preload/IPC、App Server JSON-RPC、runtime/read model 与 GUI 终态证据。
|
||||
- 中间双 snapshot `20260721T070423Z-f386c2223f73` 已稳定覆盖 1321 个路径和 34 个 P0/P1 surface;发现根目录 `interrupted` 被计入后,最终 snapshot 必须显式 `--exclude interrupted`,不删除用户文件。
|
||||
- 下一刀:按最终 candidate 路径集执行 `git add`(继续排除 `interrupted`),复核 staged diff 后连续完成 release commit、tag、main/tag 推送与远端 tag 检查。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.107.0`;任务开始时 `main`、`origin/main` 与该 tag 指向 `b17977625`,目标 tag 本地不存在。
|
||||
- `release metadata`:版本事实源、双语 release notes、本计划与执行计划索引。
|
||||
- `candidate changes`:当前工作树中的产品、测试、脚本、schema、生成物、资源、治理和文档改动;协议生成物必须与 schema 同步。
|
||||
- `excluded changes`:根目录空文件 `interrupted`,属于本地中断残留,不进入产品候选;不删除该用户文件。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
发布准备只写版本事实源、双语 release notes、本计划、执行计划索引及门禁要求的生成物。若 Gate 暴露产品缺陷,先定位 current owner,再追加最小修复写集;不覆盖未知并行改动,不清理用户本地文件。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. Gate A 证明 v2 typed schema、App Server request/notification、canonical Thread/Turn/Item projection、分页与 cold read;Content Factory Renderer projection/fixture guard 作为补充证据,不扩张为 Electron 主链。
|
||||
2. Gate B 证明真实 Electron、preload/IPC、`app_server_handle_json_lines`、current App Server method、runtime/read model 与 GUI 可见终态,生产 mock fallback 为零。
|
||||
3. `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run smoke:agent-runtime-current-fixture`、`npm run verify:gui-smoke` 与 `git diff --check` 通过;按实际缺陷补定向回归。
|
||||
4. 所有版本事实源同步为 `1.108.0`,双语 release notes 采用当前版本单页;候选 snapshot 在版本和说明更新后重新冻结并保持稳定。
|
||||
5. 重大架构改动已同步 `internal/aiprompts/architecture.md`,发布前完成架构边界复核。
|
||||
6. staged 集覆盖全部 release metadata 与 candidate changes,仅排除已声明的 `interrupted`。
|
||||
7. 获得危险操作确认后,连续完成 `git add`、`git commit -m "Release v1.108.0"`、`git tag v1.108.0`、`git push origin main`、`git push origin v1.108.0`,并复核本地与远端 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run test:contracts`:通过;770 个协议类型无漂移、299 个 App Server client checks,Electron command/catalog、mock=0、scripts/release/docs guard 全绿。
|
||||
- `npm run test:rust:related -- lime-rs/crates/app-server lime-rs/crates/agent-protocol lime-rs/crates/thread-store`:通过;App Server 1419/1419、agent-protocol 34/34、thread-store 28/28,完整反向依赖闭包全绿。
|
||||
- `npm run governance:legacy-report`:通过;扫描 2383 个产品文件与 1172 个 Rust 文件,零分类漂移、零边界违规。
|
||||
- `npx vitest run src/lib/api/agentRuntime/appServerCanonicalThreadProjection.test.ts scripts/agent-runtime/claw-chat-current-fixture-smoke.test.mjs`:76/76,通过 Content Factory Gate A projection 与 fixture guard。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`cargo check --manifest-path lime-rs/Cargo.toml -p app-server --lib`、`git diff --check`:通过;App Server 编译零 warning。
|
||||
- `npm run bridge:health -- --timeout-ms 120000`:通过,42ms 返回 `status=ok`。
|
||||
- `npm run verify:gui-smoke`:通过;evidence `standalone-shell-01-20260721063158-62100`,真实 Electron/preload/IPC、33 次 `app_server_handle_json_lines`、21/21 assertions、legacy/mock/console/page/invoke error 均为 0。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;history、stream terminal、首页热路径、Coding Workbench、图片、cancel/continue、approval、Plan、Skills、MCP、media、Expert Plaza/Panel 和 Content Factory 全绿,`liveProviderUsed=false`。
|
||||
- Content Factory Gate B R5:`.lime/qc/gui-evidence/claw-chat-current-fixture/release-v1.108.0-20260721-content-factory-v2-r5-summary.json`,70/70 assertions,动态 canonical session/thread identity、Article Editor、编辑、reload、artifact/read model 和 workflow 控制通过,console/page error 为 0。
|
||||
- 中间正式双 snapshot:`20260721T070423Z-f386c2223f73` 稳定,Codex reference `9970cd706fc4f25bbb97b42f4b68d993dabe91e2`,34 个 surface contract 与 tracker `ready-for-gate` 一致;因后续发布文档更新且需排除 `interrupted`,不得作为最终发布 snapshot。
|
||||
- 最终双 snapshot 已在 `--exclude interrupted` 下稳定生成,并由 `--verify-candidate` 独立复核为 `status=match`;1320 个 candidate paths、product/git diff/head/changed paths/excludes 全部一致,无 added/removed drift。具体 run-id 与 digest 以 `.lime/qc/project-gates/` 下最新 candidate JSON 为本地 evidence,不写入本计划以避免 candidate 自引用漂移。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选涉及 App Server v2 协议、RuntimeCore、Thread/Turn/Item read model、Electron bridge 和 Renderer projection。
|
||||
- 架构事实源:`internal/aiprompts/architecture.md` 已同步唯一 Agent 产品链、Codex import canonical owner、FileChange batch 与 v2 resume 边界。
|
||||
- 责任人:root(release owner,v1.108.0)。
|
||||
- 日期:2026-07-21。
|
||||
- 确认:已核对 Renderer -> Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item -> GUI 单轨;本次 Gate A/B 通过不代表 `internal/refactor/v1` 整体完成,v1 对齐仍约 40%。
|
||||
|
||||
## 分类与剩余限制
|
||||
|
||||
- `current`:App Server v2 Thread/Turn/Item、RuntimeCore、ThreadStore/ProjectionStore、model-provider、tool-runtime、Electron Desktop Host bridge、Renderer canonical projection、Content Factory v2 identity/read model。
|
||||
- `compat`:仅保留外部/迁移边界声明的受控适配;本轮未新增 compat。
|
||||
- `deprecated`:受治理目录约束的旧迁移/diagnostic 边界,只允许继续迁出。
|
||||
- `dead / deleted / forbidden-to-restore`:旧 `file_artifact` display shape、已退役 `agentSession` lifecycle、runtime queue、imported sidecar、重复 provider owner、Settings Hotkeys/Shortcut UI 与生产 mock fallback。
|
||||
- 未验证:Windows 真实 Electron 与打包产物 Gate B-P;本次 macOS source-built release 不伪造该平台证据。
|
||||
- 未完成:commit、tag、push 和远端 tag 复核,等待危险操作确认。
|
||||
|
||||
当前 release candidate 完成度:`95%`;整个 Codex v1 对齐完成度:约 `40%`。
|
||||
@@ -1,69 +0,0 @@
|
||||
# Lime v1.109.0 发布执行计划
|
||||
|
||||
状态:ready-for-confirmation
|
||||
日期:2026-07-22
|
||||
目标版本:`1.109.0`
|
||||
目标 tag:`v1.109.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
把 `v1.108.0` 后当前工作树中的 Thread Goal、public thread fork/delete、typed reverse server request、Provider route/cache、MCP runtime、Plugin worker、协议客户端、GUI、测试和架构文档作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:版本、发布说明与发布门禁已完成,release candidate 已冻结并等待 Git 写操作确认。
|
||||
- 下一刀:取得危险操作确认后,纳入全部候选并排除根目录 `interrupted`,连续完成 release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.108.0`;任务开始时 `main`、`origin/main` 与该 tag 指向 `47f5cf4a7`,目标 tag 本地和远端均不存在。
|
||||
- `release metadata`:根应用、CLI npm package、Rust workspace/Cargo lock 版本,双语 release notes,本计划与执行计划索引。
|
||||
- `candidate changes`:任务开始时工作树中的 current 产品、测试、schema、生成类型、package client、脚本、架构与执行计划改动,以及门禁所需的最小发布修复。
|
||||
- `excluded changes`:根目录空文件 `interrupted`,属于本地中断残留,不进入产品候选;不删除该用户文件。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
发布准备只写版本事实源、双语 release notes、本计划、执行计划索引,以及删除 `chatLayoutVisibility.ts` 中已确认的临时调试日志。其余业务改动只审阅、验证和纳入候选;若门禁暴露缺陷,先定位 current owner,再声明最小修复写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源同步为 `1.109.0`,双语 release notes 采用当前版本单页。
|
||||
2. `npm run verify:app-version` 与 `npm run typecheck` 通过。
|
||||
3. 协议与 bridge 改动通过 `npm run test:contracts`;Runtime/Agent/MCP/Provider 改动通过风险匹配的 Rust related tests。
|
||||
4. `npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke` 通过,或明确记录可复现的环境限制与阻塞。
|
||||
5. 重大架构改动已同步 `internal/aiprompts/architecture.md` 并完成单轨边界确认。
|
||||
6. staged 集覆盖全部 release metadata 与 candidate changes,只排除已声明的 `interrupted`。
|
||||
7. 获得危险操作确认后,连续完成 `git add`、`git commit -m "Release v1.109.0"`、`git tag v1.109.0`、`git push origin main`、`git push origin v1.109.0`,并复核本地与远端 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm package 与 Rust workspace 均为 `1.109.0`。
|
||||
- `npm run typecheck`:通过,满足发布硬门禁。
|
||||
- `npx vitest run "src/features/plugin/runtime/agentRuntimeCapabilityHost.test.ts"`:通过,`13/13`。
|
||||
- `npm run test:contracts`:通过;`773` 个生成协议类型无漂移,App Server client `300` checks 通过,Electron command/catalog、生产 mock=0、scripts、release 与 docs guard 均通过。
|
||||
- `cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server --lib repairable_child_event_log_tail_does_not_block_parent_wait -- --nocapture`:通过,`1/1`;验证 WaitAgent 在消费已有 terminal mailbox 前修复 direct-child EventLog 可修复尾部。
|
||||
- `cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server --lib`:通过,`1462/1462`。
|
||||
- `npm run test:rust:related -- "lime-rs/Cargo.toml"`:通过;workspace manifest 触达 workspace 边界,全部 workspace `--lib` 测试通过,仅保留测试自身声明的 live/provider/沙箱环境 ignored 项。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;真实 Electron fixture Gate B 覆盖 Claw、coding workbench、图片任务、审批、计划、Skills、MCP、媒体与文章工作区,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;隐藏窗口的真实 Electron fixture Gate B 覆盖 renderer、preload/IPC、App Server sidecar `1.109.0`、Claw shell、reload、记忆设置与 evidence。Vite/Browserslist 和 Electron `console-message` deprecation 为非阻塞 warning。
|
||||
- `npm run governance:legacy-report`:通过;扫描 `2386` 个文件,分类漂移候选 `0`、边界违规 `0`。
|
||||
- `git diff --check`:最终候选复核通过。
|
||||
- 候选统计:最终暂存 `276` 个路径(`20663` additions / `7128` deletions);仅排除根目录 0 字节 `interrupted`,目标 tag 本地与远端仍不存在。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选涉及 App Server v2 protocol、RuntimeCore、Thread/Turn/Item history、Goal、MCP runtime、Provider route、Electron bridge 与 Renderer gateway。
|
||||
- 架构事实源:`internal/aiprompts/architecture.md` 已包含本轮 public fork、canonical history、typed request 和 MCP provenance 边界改动,发布门禁后复核。
|
||||
- 责任人:root(release owner,v1.109.0)。
|
||||
- 日期:2026-07-22。
|
||||
- 确认状态:已确认。架构事实源与唯一产品链保持一致;本轮没有引入第二套 Electron 后端、provider owner、tool owner 或兼容业务路径。
|
||||
|
||||
## 分类与剩余限制
|
||||
|
||||
- `current`:App Server v2 Thread/Turn/Item、Thread Goal、public fork/delete、typed reverse server request、credential-scoped Provider metadata、MCP snapshot/environment/lifecycle、Plugin worker current bridge。
|
||||
- `compat`:无 lineage 的 legacy compaction summary 仅保留明确 fail-safe;本轮不扩展。
|
||||
- `deprecated`:旧 `agentSession/action/{replay,respond}` 与 `agentSession/runtimeEvents/append` 尚未完全删除,继续迁出,不得承接新功能。
|
||||
- `dead / deleted / forbidden-to-restore`:`agentSession/delete`、raw EventLog history copy、provider-name protocol inference、cwd-derived MCP environment identity 与 metadata-routed waiter lookup。
|
||||
- 平台限制:Windows 真实 Electron 与打包产物门禁尚未执行,不伪造平台证据。
|
||||
|
||||
当前 release candidate 完成度:`90%`;剩余仅为经确认后的 commit、tag、push 与远端复核。整个 Codex v1 对齐完成度:约 `40%`。
|
||||
@@ -1,69 +0,0 @@
|
||||
# Lime v1.110.0 发布执行计划
|
||||
|
||||
状态:ready-for-git-confirmation
|
||||
日期:2026-07-23
|
||||
目标版本:`1.110.0`
|
||||
目标 tag:`v1.110.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将基于 `v1.109.0` 的当前工作树改动作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:版本事实源、release notes、类型/协议/Rust 门禁、Agent current fixture、GUI Gate B 与治理检查已通过,候选范围已冻结。
|
||||
- 下一刀:取得危险操作确认后,排除 `interrupted` 并连续执行 stage、commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.109.0`,当前 `main` 与 `origin/main` 指向 `88a81b278`;目标 tag 当前不存在。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes、本计划与执行计划索引。
|
||||
- `candidate changes`:任务开始时工作树中的 current Rust/TS/Electron、协议/schema、生成类型、GUI、脚本、治理、架构与测试改动,以及门禁需要的最小修复。
|
||||
- `excluded changes`:根目录 0 字节 `interrupted` 中断残留,不删除、不纳入候选;若验证发现其它不应发布的文件,必须在提交前明确列出。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
发布准备只写版本事实源、双语 release notes、本计划与执行计划索引;其余业务改动仅审阅、验证并纳入候选。门禁暴露缺陷时,仅修改对应 current owner 的最小写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源同步为 `1.110.0`,双语 release notes 仅保留当前版本单页。
|
||||
2. `npm run verify:app-version` 与 `npm run typecheck` 通过。
|
||||
3. 协议/Bridge/脚本变更通过 `npm run test:contracts`;Rust/runtime/provider/media 变更通过相关测试。
|
||||
4. `npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke` 通过,或记录可复现环境限制。
|
||||
5. `internal/aiprompts/architecture.md` 的重大架构确认与 current/compat/dead 分类保持一致。
|
||||
6. staged 集覆盖全部 candidate changes 与 release metadata,仅排除 `interrupted`。
|
||||
7. 获得危险操作确认后,连续完成 `git add`、`git commit -m "Release v1.110.0"`、`git tag v1.110.0`、`git push origin main`、`git push origin v1.110.0`,并复核本地与远端 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm package 与 Rust workspace 均为 `1.110.0`。
|
||||
- `npm run typecheck`:通过,Renderer 与 Node TypeScript 项目均无类型错误;收尾阶段已再次复跑。
|
||||
- `npm run test:contracts`:通过,759 个协议类型无漂移,App Server client 296 checks 与 command/modality/scripts/Electron release/docs guard 全部通过。
|
||||
- `npm run test:rust:related -- "lime-rs/Cargo.toml"`:通过,workspace lib tests 全部通过;live/网络环境用例按测试声明 ignored。
|
||||
- `npm run test:rust:related -- "lime-rs/crates/thread-store/src/agent_identity.rs"`:通过,覆盖 `thread-store` 与 `agent-runtime`/`app-server`/`lime-agent`/`lime-scheduler`/`lime-server` 反向依赖;修正一处与 Codex-compatible path 校验脱节的 rebinding 测试数据后全部通过。
|
||||
- `cargo test -p app-server --lib`:通过,`1483/1483`。
|
||||
- Lime server provider reasoning 定向回归:通过,`1/1`,仅 raw `ReasoningContentDelta` 降低为公开 reasoning。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过,覆盖 Electron/preload/IPC/App Server、history/read model、approval、Plan、Skills、MCP、media、Coding Workbench 与 Article Editor;`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过,实际启动 macOS Electron、preload 与 `1.110.0` App Server sidecar,壳层重载和 memory settings 证据通过。
|
||||
- `npm run governance:legacy-report`:通过,扫描 2361 个文件,零引用候选、分类漂移与边界违规均为 0。
|
||||
- `npm run governance:scripts`:通过,无未登记根脚本或一级脚本目录。
|
||||
- `git diff --check`:通过,无空白错误。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选涉及 App Server v2 protocol、RuntimeCore、Thread/Turn/Item projection、MCP、provider/media route、Electron bridge 与 Renderer gateway。
|
||||
- 架构事实源:`internal/aiprompts/architecture.md` 已记录 ThreadGoal current owner、typed request、canonical history 与 legacy objective 清理。
|
||||
- 责任人:root(release owner,v1.110.0)。
|
||||
- 日期:2026-07-23。
|
||||
- 确认状态:已确认。`internal/aiprompts/architecture.md` 已同步 ThreadGoal current owner、typed request、canonical history/read model 与 managed-objective dead 边界;contracts、Rust related、Agent current fixture 与 GUI Gate B 均未显示第二套业务后端或 mock fallback。
|
||||
|
||||
## 分类与剩余限制
|
||||
|
||||
- `current`:Agent runtime、App Server v2 Thread/Turn/Item、ThreadGoal、typed reverse request、credential-scoped provider、MCP snapshot/lifecycle、media route、plugin current bridge。
|
||||
- `compat`:仅保留显式 fail-closed 的历史兼容边界,不扩展新能力。
|
||||
- `deprecated`:仍存在的旧入口只允许迁出,不承接新功能。
|
||||
- `dead / deleted / forbidden-to-restore`:managed-objective、retired session/objective/media API、metadata-routed waiter 与旧 catalog/script/documentation 入口。
|
||||
- 平台限制:本轮已取得 macOS 真实 Electron Gate B 证据;未执行 Windows 真机与 macOS/Windows packaged artifact 门禁。
|
||||
|
||||
当前 release candidate 完成度:`85%`;版本准备与发布门禁已完成,仅剩危险操作确认后的 stage/commit/tag/push 与远端复核。
|
||||
@@ -1,85 +0,0 @@
|
||||
# Lime v1.111.0 发布执行计划
|
||||
|
||||
状态:post-release-fix-complete
|
||||
日期:2026-07-24
|
||||
目标版本:`1.111.0`
|
||||
目标 tag:`v1.111.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将基于 `v1.110.0` 的当前工作树作为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:release candidate 已完成版本事实源、双语 release notes、current contract 迁移、i18n dead key 清理与全部发布前只读门禁。
|
||||
- 下一刀:补丁版本 `v1.111.1` 的独立发布计划见 `release-v1.111.1-plan.md`。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.110.0`;任务开始时本地 `main` 与 `origin/main` 同指 `15543076c`,目标 tag 在本地和远端均不存在。
|
||||
- 初始候选:211 个修改、10 个删除、20 个新增,共 241 个代码、协议/schema、生成类型、GUI、脚本、测试与文档文件;tracked diff 为 9,946 insertions / 5,583 deletions。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes、本计划与执行计划索引。
|
||||
- `candidate changes`:任务开始时工作树中的全部 current Rust/TypeScript、App Server v2 protocol、Agent runtime、GUI、脚本、治理、文档与测试改动,以及门禁需要的最小修复。
|
||||
- `excluded changes`:无;只读扫描未发现凭证、日志、构建产物、缓存或临时文件。GUI 构建产物位于既有忽略目录,不进入候选。
|
||||
|
||||
## 窄写集与避让
|
||||
|
||||
发布准备只写版本事实源、双语 release notes、`internal/aiprompts/architecture.md`、本计划与执行计划索引;其余候选改动仅审阅、验证并纳入发布。门禁暴露缺陷时,只修改对应 current owner 的最小写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
1. 所有版本事实源同步为 `1.111.0`,双语 release notes 仅保留当前版本单页。
|
||||
2. `npm run verify:app-version` 与 `npm run typecheck` 通过。
|
||||
3. 协议、schema、generated client 与 renderer gateway 变更通过 `npm run test:contracts`。
|
||||
4. Rust/runtime 改动通过 related/integration 验证;Agent 主链通过 `npm run smoke:agent-runtime-current-fixture`。
|
||||
5. `npm run verify:gui-smoke` 取得真实 Electron Gate B,或记录可复现环境限制。
|
||||
6. `npm run governance:legacy-report`、`npm run governance:scripts` 与 `git diff --check` 通过。
|
||||
7. staged 集覆盖全部 candidate changes 与 release metadata,且不存在未纳入的本地改动。
|
||||
8. 获得危险操作确认后,连续完成 `git add`、`git commit -m "Release v1.111.0"`、`git tag v1.111.0`、`git push origin main`、`git push origin v1.111.0` 与远端复核。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,全部版本事实源为 `1.111.0`。
|
||||
- `npm run typecheck`:通过;renderer、node 与 Electron host typecheck 均通过。
|
||||
- `npm run test:contracts`:通过;761 个生成协议类型无漂移,App Server client 286 项检查通过,命令、Harness、modality、scripts、release workflow、docs boundary 均通过。
|
||||
- Rust related/integration:通过;changed scope 因 workspace manifest 触达扩大为 `cargo test --lib --workspace`,全 workspace lib 通过;App Server integration 通过,包含 1497 个 App Server lib tests 与目标 JSON-RPC tests。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 history/cache、stream completion、Claw/Electron、Workbench、media、Plan、Skills、MCP、approval allow-for-session/decline/cancel、session cache 与内容工厂 current fixtures。
|
||||
- `npm run smoke:claw-chat-current-fixture -- --scenario approval-request-resume --timeout-ms 180000`:通过;typed approval pending 从 `thread/read` + renderer lifecycle 读取,显式 `acceptForSession` 与第二回合 session cache 均通过。
|
||||
- `npm run verify:gui-smoke`:通过(最终候选复跑);真实 Electron renderer/preload/IPC、App Server sidecar `appserver.v0` `1.111.0`、Workbench shell 与 memory settings evidence 均通过。
|
||||
- `npm run governance:legacy-report`:通过,零分类漂移与边界违规。
|
||||
- `npm run governance:scripts`:通过,root/一级 scripts 冻结基线无违规。
|
||||
- `npm run i18n:check`:通过,5 locale、13 namespace、覆盖率 100%。
|
||||
- `npm run i18n:unused -- --check`:通过,`unused=0`;删除 38 个生产零引用 dead key 并同步 5 locale。
|
||||
- 定向候选 eslint:通过;相关 Agent stream、Plugin fixture 与 i18n tests 均无 lint error,相关回归测试通过。
|
||||
- `git diff --check`:通过。
|
||||
- `npm run verify:local`:已执行但被 13 个未被本候选修改的基线文件 lint error 阻断;候选触及的 lint error 已修复并定向验证。该限制不归因于 v1.111.0 候选,不能写成全量 local gate 通过。
|
||||
- `cargo fmt --all --check`:被候选集中其他既有未格式化文件阻断(`agent-protocol/src/lib.rs`、`app-server/src/runtime/agent_mailbox_delivery.rs`、`app-server/tests/session_archive_jsonrpc.rs`);本次修改的 `media_task_jsonrpc.rs` 单独格式检查通过,未擅自格式化脏热区。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- 影响:重大。候选涉及 App Server v2 `artifact/write`、direct notification、RuntimeCore、Thread/Turn/Item projection、MCP/tool lifecycle、history/read model 与 Renderer gateway。
|
||||
- 架构事实源:`internal/aiprompts/architecture.md` 同步记录 artifact write owner、扩展 direct v2 notification 与 legacy runtime-event append 的 dead 边界。
|
||||
- 责任人:root(release owner,v1.111.0)。
|
||||
- 日期:2026-07-24。
|
||||
- 确认状态:confirmed;contracts、Rust、Agent current fixture 与真实 Electron Gate B 均证明产品链保持 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI`,未引入第二套业务后端或生产 mock fallback。
|
||||
|
||||
## 分类与剩余限制
|
||||
|
||||
- `current`:App Server v2 `artifact/write`、direct Thread/Turn/Item notifications、RuntimeCore、canonical ThreadStore/history、typed client 与 Renderer projection。
|
||||
- `compat`:仅保留未覆盖 provider/media diagnostic 的显式 raw side-channel,不承接 canonical lifecycle。
|
||||
- `deprecated`:仍存在的旧入口只允许迁出,不扩展新能力。
|
||||
- `dead / deleted / forbidden-to-restore`:`agentSession/runtimeEvents/append`、legacy plugin runtime gateway、旧 prompt builder、旧 tool permission/shell security 实现与正向测试夹具,以及本次清理的 38 个未引用 i18n key。
|
||||
- 平台限制:macOS 真实 Electron Gate B 已通过;未执行 Windows 真机与正式 packaged artifact 验证,不将其写成通过。
|
||||
|
||||
当前 release candidate 完成度:`100%`;提交 `94b784718`、`main` 与 `v1.111.0` 已推送并完成远端一致性复核。
|
||||
|
||||
## 发布后故障修复(2026-07-25)
|
||||
|
||||
- GitHub Actions 失败证据:Release attempt 1 的 macOS x64 sherpa 下载、Windows sccache 下载与 macOS arm64 Electron 下载均返回 GitHub `504`;Docs 因工作流与根 `packageManager` 重复声明 pnpm 版本失败;Quality 因 13 个 lint error 与 2 个 warning 失败。
|
||||
- Release 处理:已重跑失败作业,attempt 2 越过原始 sherpa 与 sccache 失败点;同时把 Electron Forge `504 Gateway Time-out` 纳入现有 macOS 瞬时错误重试守卫。
|
||||
- 首轮修复写集:`.github/workflows/{release,deploy-docs}.yml`、release workflow guard、CI 报出的 lint 文件,以及共享 action 类型 owner `src/lib/api/agentActionTypes.ts`。
|
||||
- 本轮新增修复写集:`src/components/agent/chat/workspace/workspaceSendHelpers.test.ts` 将 plan mode 的旧 Renderer goal metadata 正向断言改为负向回流守卫;`src/components/agent/chat/utils/executionStrategyCurrentBoundary.test.ts` 删除已删除 queue controller 和已不消费 execution runtime 类型的旧清单项。
|
||||
- 版本与远端事实:`v1.111.0` 已发布,现有 release commit `94b784718`、`main` 与 tag 不重写;本轮只创建 post-release fix commit 推送 `main`。
|
||||
- 验证结果:定向 workspace/helper 与 boundary 测试通过;`npm test -- --resume` 完成 `112/112`;`npm run lint`、`npm run typecheck`、`npm run verify:app-version`、`npm run test:contracts`、`npm run governance:legacy-report`、`npm run governance:scripts`、`npm run governance:electron-release-workflow`、`git diff --check`、`cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server`、`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke` 均通过。
|
||||
- `npm run verify:local`:未通过;smart 全量从第 1 批执行至第 4 批时,既有 `src/components/agent/chat/index.projectRestore.test.tsx` 出现漂移的异步超时 / workspace 断言失败,单文件复现同样会在不同测试间漂移。本轮未修改该无关业务/测试基础设施,也未将其写成通过。
|
||||
- 退出条件:上述定向与跨层门禁通过,`verify:local` 的基线异步失败已记录;补充修复提交 `114455c39` 已推送到 `main`,`v1.111.0` tag 未改写。
|
||||
@@ -1,42 +0,0 @@
|
||||
# Lime v1.111.1 发布执行计划
|
||||
|
||||
状态:preparing-release-candidate
|
||||
日期:2026-07-25
|
||||
目标版本:`1.111.1`
|
||||
目标 tag:`v1.111.1`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.111.0` 已发布后的修复提交 `114455c39` 作为补丁版 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。已有 `v1.111.0` tag 不重打、不覆盖。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:已确认 `v1.111.1` 尚无本地或远端 tag,正在更新 release metadata。
|
||||
- 下一刀:完成版本一致性与双语 notes 后执行稳定发布门禁。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.111.0`;当前 `main` 与 `origin/main` 同指 `114455c39`。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes、本计划、旧 v1.111.0 计划状态和执行计划索引。
|
||||
- `candidate changes`:`v1.111.0..114455c39` 的修复提交,包括 release workflow、Docs workflow、App Server runtime owner 拆分、current Agent Runtime 边界守卫和验证修复。
|
||||
- `excluded changes`:`scripts/agent-runtime/claw-chat-current-fixture-approval-read-model.mjs` 为并发进程持有的未提交改动;`tsconfig.node.tsbuildinfo` 为 typecheck 自动生成物。两者不进入本 release candidate,也不删除或覆盖。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 只写版本事实源、双语 release notes、本计划、v1.111.0 计划收尾状态和执行计划索引;并发 fixture 与生成 build info 只读避让。
|
||||
- 所有版本事实源同步为 `1.111.1`,release notes 只保留当前版本单页。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run governance:electron-release-workflow`、`npm run governance:scripts` 和 `git diff --check` 通过。
|
||||
- Agent runtime / App Server 风险追加 `cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server`、`npm run smoke:agent-runtime-current-fixture`、`npm run verify:gui-smoke`。
|
||||
- `npm run verify:local` 若再次被既有 `index.projectRestore.test.tsx` 异步测试漂移阻断,保留完整失败证据,不将其写成通过;候选相关门禁必须独立通过。
|
||||
- 获得 v1.111.1 Git 写操作确认后,显式暂存候选,执行 `git commit -m "Release v1.111.1"`、`git tag v1.111.1`、`git push origin main`、`git push origin v1.111.1`,并复核本地/远端 commit 与 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
待补充。所有命令、证据等级、环境限制和远端 workflow 状态在每个阶段完成后回写本文件。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:版本事实源、Forge 读取根版本、current App Server/Agent Runtime 修复和真实 Electron Gate B 证据。
|
||||
- `compat`:无新增 compat owner;现有兼容边界不扩展。
|
||||
- `deprecated`:旧入口只保留迁出约束,不因补丁版恢复。
|
||||
- `dead / deleted / forbidden-to-restore`:已删除 queue controller 和 Renderer goal state 旧 metadata 只出现在负向边界守卫或历史 evidence。
|
||||
@@ -1,74 +0,0 @@
|
||||
# Lime v1.112.0 发布执行计划
|
||||
|
||||
状态:ready-for-recovery-git-confirmation
|
||||
日期:2026-07-26
|
||||
目标版本:`1.112.0`
|
||||
目标 tag:`v1.112.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.111.0` 之后的 current App Server、Agent Runtime、Provider、GUI、协议、测试和文档改动整理为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:release commit、`v1.112.0` tag、`main`/tag 推送与 GitHub Release 已完成;远端 macOS x64 packaging 因 Apple timestamp 响应缺失失败,正在修复可重试分类。
|
||||
- 下一刀:验证 workflow recovery guard 后,将修复提交推送至 `main`,以 `workflow_dispatch` 从 `v1.112.0` source ref 重跑发布 workflow,不重写已发布 tag。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.111.0`;未完成且未打 tag 的 `v1.111.1` metadata 直接由本版本替换,不形成兼容发布轨道。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 与本计划。
|
||||
- `candidate changes`:当前工作树中 `HEAD` 之后的全部 tracked 与 untracked 产品、协议、schema、generated client、测试、脚本和文档改动。
|
||||
- 最终盘点:共 `507` 个候选文件,其中 tracked change `489` 个、untracked `18` 个;按顶层 owner 分布为 `lime-rs/ 280`、`src/ 135`、`scripts/ 49`、`internal/ 24`、`packages/ 13`、根目录 `4`、`electron/ 2`。现有 staged `427` 个、unstaged `130` 个,二者有重叠;确认后统一 `git add -A` 收敛为单一 staged candidate。
|
||||
- `excluded changes`:无。提交前必须再次核对工作树,若发现临时文件或并发进程新增改动则停止并重新判定范围。
|
||||
|
||||
## 写集与协作边界
|
||||
|
||||
- 本轮写入版本事实源、双语 release notes 与本计划;门禁暴露的历史 Turn identity 缺陷只修改 Agent stream lifecycle current owner 及其定向测试,Right Surface 源码守卫只改为等价的跨行匹配。
|
||||
- 现有 400 余个产品和文档改动只读避让;验证结果代表当前完整工作树,不声明这些改动的作者归属。
|
||||
- 不覆盖、不回滚现有 staged 状态;Git 写操作确认后统一以 `git add -A` 收敛完整 release candidate,并在 commit 前复核 staged 文件与统计。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 所有版本事实源同步为 `1.112.0`,release notes 只保留当前版本单页。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run governance:electron-release-workflow`、`npm run governance:scripts` 与 `git diff --check` 通过。
|
||||
- 正式 GUI 发布证据执行 `npm run verify:gui-smoke`;若受环境限制无法执行,必须记录具体原因。
|
||||
- 协议、App Server、Agent Runtime 与 Rust 大写集按风险追加 related/integration 或 current fixture 验证,避免以裸全量命令制造不可续跑噪音。
|
||||
- 获得 Git 写操作确认后,连续执行暂存、`Release v1.112.0` commit、`v1.112.0` tag、`main`/tag 推送,并复核本地与远端状态。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过;根应用、CLI npm package、Rust workspace 与 lockfile 版本事实均为 `1.112.0`。
|
||||
- `npm run typecheck`:通过;Renderer 与 Node TypeScript 检查通过。`npm run electron:build` 与最终 GUI smoke 内 Electron host typecheck 同样通过。
|
||||
- `npm run test:contracts`:通过;App Server client contract 284 项、command/Harness/modality/scripts/release workflow/docs boundary 均通过;App Server client 单测 `93/93`、build 与 `npm run check:protocol-types` 通过。
|
||||
- 前端候选回归:`npm run test:changed` 通过,smart runner 完成 `112/112` 批;历史 Turn identity 定向 Vitest `7/7`,Claw fixture 源码守卫 `78/78`。
|
||||
- Rust 候选回归:`npm run test:rust:changed` 通过;workspace manifest 变更使该入口扩大执行 `cargo test --manifest-path lime-rs/Cargo.toml --lib --workspace`,全部 workspace library tests 通过。`cargo fmt --check` 同样通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:最终候选复跑通过;覆盖 history/cache、stream completion、Electron/App Server guards `90/90`,以及首页、Coding Workbench、图片、approval、active steer、Plan、Skills、MCP、media 与 Article Editor 等真实 Electron Gate B 场景。
|
||||
- Coding Workbench 历史折叠定向 Gate B:通过;`historicalTimelinePreviewCount=1`、`toolCallRowCount=0`、`operationalTimelineDetailsCount=0`、无 console/page errors,证据见 `.lime/qc/gui-evidence/code-artifact-workbench-electron-fixture/code-artifact-workbench-gui-coding-input-debug-summary.json`。
|
||||
- `npm run verify:gui-smoke`:最终候选复跑通过;Renderer production build、Electron host/preload、App Server sidecar `appserver.v0` `1.112.0`、Workbench shell、reload 与 memory settings 均取得真实 Electron evidence。
|
||||
- `npm run governance:scripts`、`npm run governance:electron-release-workflow` 与 `git diff --check`:通过。
|
||||
- Git 写操作确认前最终复核:`npm run typecheck`、`npm run verify:app-version`、`git diff --check` 与 `git diff --cached --check` 再次通过;根应用版本仍为 `1.112.0`。
|
||||
- `npm run test:related`:未通过;smart runner 将目录路径 `electron` 当文件读取,报 `EISDIR`。定向 Vitest、changed tests、contracts、current fixture 与 GUI smoke 已独立通过;该 runner 基础设施问题不写成产品门禁通过。
|
||||
|
||||
## 发布后恢复
|
||||
|
||||
- `Release v1.112.0` 已提交为 `00de4eb436573707220d99b5f3bcfe890b85562c`;本地 `main`、`origin/main`、本地 tag 与远端 `v1.112.0` 指向同一提交,GitHub Release 已创建。
|
||||
- 首次 Release workflow `30192808153` 仅 `Build Electron macOS-x64` 失败。失败命令为对 Electron Framework `locale.pak` 的 `codesign --timestamp`,错误为 `A timestamp was expected but was not found`;macOS arm64、Windows x64 和 Windows Squirrel installed-candidate smoke 均成功。
|
||||
- 根因分类:Apple timestamp 服务瞬态失败,而非应用代码、签名身份或 notarization 配置失效。修复将该稳定错误文本纳入既有 macOS package 三次重试规则,并由 release workflow guard 回归守护。
|
||||
- 恢复写集:`.github/workflows/release.yml`、`scripts/electron/release-workflow-guard.mjs`、其测试与本计划。当前并发的 Rust/文档改动明确排除,不进入 workflow recovery commit。
|
||||
- 恢复验证:定向 release workflow guard Vitest `27/27`、`npm run test:contracts`、`npm run governance:electron-release-workflow`、`npm run typecheck`、`npm run verify:app-version` 与 `git diff --check` 通过。
|
||||
|
||||
## 架构确认与治理分类
|
||||
|
||||
- 架构影响:重大。候选涉及 App Server v2 Thread search/metadata/control、background terminal、elicitation/Guardian continuation、Model catalog、RuntimeCore、Provider 与 canonical read model 边界。
|
||||
- 架构事实源:`internal/aiprompts/architecture.md` 已同步记录上述唯一读取/控制链、typed lowering、fail-closed 规则和禁止恢复的 parallel owner。
|
||||
- 责任人:root(release owner,v1.112.0);日期:2026-07-26;确认状态:confirmed。
|
||||
- 确认证据:contracts、Rust changed tests、Agent current fixture 与真实 Electron Gate B 证明产品链保持 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI`,未新增第二套业务后端或生产 mock fallback。
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI,以及 v2 Thread/Model contracts、Provider capability owner 和 canonical read model。
|
||||
- `compat`:不新增 compat owner;历史边界只能委托 current 实现。
|
||||
- `deprecated`:已被 v2 contract 替代的旧会话/模型入口只允许迁出。
|
||||
- `dead / deleted / forbidden-to-restore`:已删除 v0 AgentSession compact/update、旧 ModelList 与重复 Renderer workspace writeback 不得恢复。
|
||||
|
||||
平台限制:macOS arm64 真实 Electron Gate B 已通过;未执行 Windows 真机与正式 packaged artifact 安装验证,不将其写成通过。
|
||||
|
||||
当前发布恢复完成度:`95%`;原 release commit、tag、推送与 GitHub Release 已完成,剩余为危险操作确认后的 workflow recovery commit/push、从 `v1.112.0` source ref 重新 dispatch,并监控远端资产发布结果。
|
||||
@@ -1,66 +0,0 @@
|
||||
# Lime v1.113.0 发布执行计划
|
||||
|
||||
状态:release-commit-ready
|
||||
日期:2026-07-27
|
||||
目标版本:`1.113.0`
|
||||
目标 tag:`v1.113.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.112.0` 之后的 Runtime World State、Multi-Agent、Provider 健康与重路由、Tool Hook、存储根、GUI、协议、测试和文档改动整理为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:完整 release candidate 已通过风险匹配的发版门禁与 staged 审计,Git 写操作已获明确授权。
|
||||
- 下一刀:创建 release commit 与 tag,推送 `main`/tag 并复核本地、远端和发布工作树状态。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.112.0`。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 与本计划。
|
||||
- `candidate changes`:发版开始时工作树中全部 tracked 与 untracked 产品、协议、schema、generated client、测试、脚本和文档改动,包括既有 staged 删除。
|
||||
- 最终盘点:`166` 个 tracked change、`11` 个 untracked 文件,共 `177` 个候选文件;包含发版期间完成的 `model/verification` schema/codegen 改动,以及门禁中补齐的 Server metadata 兼容和 Agent Runtime trace 断言。
|
||||
- `excluded changes`:无。提交前若发现并发新增或临时文件,停止并重新判定范围。
|
||||
|
||||
## 写集与协作边界
|
||||
|
||||
- 本轮原写集为版本事实源、双语 release notes 与本计划;门禁暴露真实阻断后,窄幅扩展到 `lime-rs/crates/server/src/handlers/provider_calls.rs`、`lime-rs/crates/server/src/handlers/provider_calls/streaming.rs` 与 `lime-rs/crates/agent-runtime/src/reply_backend/tests.rs`。
|
||||
- 现有产品、协议、测试、脚本和文档改动只读避让;验证结果代表当前完整工作树,不声明这些改动的作者归属。
|
||||
- 未覆盖或回滚既有 staged 状态;已获 Git 写操作授权,并以 `git add -A` 收敛完整 release candidate。staged 审计为 `177` 个文件、`9259` 行新增、`6956` 行删除,无 unstaged 或 untracked 遗留。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 所有版本事实源同步为 `1.113.0`,双语 release notes 只保留当前版本单页。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、风险匹配的 Rust related tests、`npm run governance:scripts`、`npm run governance:legacy-report` 与 `git diff --check` 通过。
|
||||
- 正式 GUI 发布证据执行 `npm run verify:gui-smoke`;无法执行时记录具体环境限制。
|
||||
- 获得 Git 写操作确认后,连续执行暂存、`Release v1.113.0` commit、`v1.113.0` tag、`main`/tag 推送,并复核本地与远端状态。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过;根应用、CLI npm package、Rust workspace 与 30 个 workspace lockfile package 版本均为 `1.113.0`。
|
||||
- `npm run typecheck`:通过;发版收尾复跑退出码为 0。
|
||||
- `npm run test:contracts`:通过;805 个协议类型零漂移,App Server client 284 项 contract 通过,command、Harness、modality、scripts、release workflow 与 docs boundary 均通过。
|
||||
- `npm run test:rust:changed`:通过;完整 workspace library tests 通过,包括 Agent Runtime `180/180`、App Server `1555/1555`、App Server protocol `85/85`、Tool Runtime `306/306`。
|
||||
- App Server 公共 JSON-RPC integration:通过;6 个 targets、27 个 tests 全部通过。
|
||||
- Server provider metadata 定向测试:通过;`9/9`,确认内部 `ServerModel` / `ModelVerification` metadata 不泄漏到 OpenAI/Anthropic compat 输出。
|
||||
- Agent Runtime reply backend 定向测试:通过;`1/1`,Responses Lite 禁止并行时 trace 明确 fail closed 为 `Some(false)`。
|
||||
- 前端/Electron 定向 Vitest:通过;6 个 files、80 个 tests 全部通过。
|
||||
- `npm run test:related`:runner 在目录目标 `electron` 上报已知 `EISDIR`;已用直接 Vitest 覆盖实际受影响测试,未发现产品失败。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖真实 Electron、历史恢复、流式终态、审批、Skills、MCP、媒体引用、专家入口与内容工厂主链。
|
||||
- `npm run verify:gui-smoke`:通过;Renderer、Electron host、preload/current bridge、App Server sidecar `1.113.0`、reload、Workbench shell 与设置页均通过。
|
||||
- `npm run governance:legacy-report`:通过;边界违规 0。
|
||||
- `npm run governance:scripts`:通过;冻结脚本基线无新增违规。
|
||||
- `npm run governance:electron-release-workflow`:通过。
|
||||
- `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all -- --check`、`git diff --check`:通过;发版收尾均已复跑。
|
||||
|
||||
## 架构确认与治理分类
|
||||
|
||||
- 架构影响:重大。候选涉及 Runtime World State、effective Multi-Agent mode、Provider auth/readiness/health/reroute、Tool Hook owner 与平台存储根边界。
|
||||
- 架构事实源:`internal/aiprompts/architecture.md` 已包含候选对应的 current owner、数据流、fail-closed 与 forbidden-to-restore 约束。
|
||||
- 责任人:root(release owner,v1.113.0);日期:2026-07-27;确认状态:validated-for-release。
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI,以及 typed world state、Provider current client、RuntimeCore route resolver、tool-runtime hooks 与组合存储根。
|
||||
- `compat`:不新增 compat owner;历史边界只能委托 current 实现。
|
||||
- `deprecated`:旧配置字段只保留必要 wire 形状且 runtime 忽略,不得重新进入 durable metadata 或控制面。
|
||||
- `dead / deleted / forbidden-to-restore`:旧 HookManager、Product DB 整库迁移、通用 migration manifest、启动 cleanup、managed project path 迁移与 provider migration fixture 不得恢复。
|
||||
|
||||
当前发布完成度:`95%`;剩余 release commit、tag、推送与远端复核正在连续执行。
|
||||
@@ -1,50 +0,0 @@
|
||||
# Lime v1.114.0 发布执行计划
|
||||
|
||||
状态:release-approved
|
||||
日期:2026-07-27
|
||||
目标版本:`1.114.0`
|
||||
目标 tag:`v1.114.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.113.0` 后当前工作树中的 Provider transport、模型能力与路由控制、App Server 协议投影、前端配置和回归证据作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:`1.114.0` 版本事实源、双语单页 release notes、候选修复与发布门禁均已收敛;本地 `main`、`origin/main` 与 `v1.113.0` 的准备基线为 `31595fc8c`,用户已于 2026-07-28 确认 Git 危险操作。
|
||||
- 下一刀:连续执行 release commit、`v1.114.0` tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.113.0`。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes、本计划和执行计划索引。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪产品、协议、文档、测试、schema 与生成物改动;核心包括 Gemini GenerateContent、Ollama Responses、官方 Responses Hosted Web Search、`model/rerouted` transient 通知、模型能力 provenance、Provider typed `models[]`、catalog refresh 与 Turn selection reconciliation,以及对应 GUI/fixture/JSON-RPC/Rust 回归。
|
||||
- `excluded changes`:无。若门禁产生新的临时文件或发现并发进程改动,必须在提交前重新分类并记录,不能默认纳入或删除。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 发布准备阶段只写版本事实源、双语 release notes、本计划和执行计划索引;现有候选产品文件只读避让。
|
||||
- 所有版本事实源同步为 `1.114.0`,release notes 只保留当前版本单页。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:changed`、`npm run test:changed -- "v1.113.0"`、`npm run verify:gui-smoke` 和 `git diff --check` 通过;`npm run verify:local` 只允许保留已查明的基线 i18n 例外,不得隐去或放宽规则。
|
||||
- 重大架构变更以 `internal/aiprompts/architecture.md` 第 15-20 节为事实源;责任开发者确认已记录为 `root, 2026-07-27`。
|
||||
- 获得 Git 写操作确认后,暂存全部 release candidate,复核 staged 摘要,执行 `git commit -m "Release v1.114.0"`、`git tag v1.114.0`、`git push origin main`、`git push origin v1.114.0`,并复核本地/远端 commit 与 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm package、Rust workspace、Cargo lock 与 Electron/App Server 显示版本一致为 `1.114.0`。
|
||||
- `npm run typecheck`:准备阶段和最终复验均通过,覆盖 renderer 与 node TypeScript project。
|
||||
- `npm run test:contracts`:通过,覆盖 Desktop Host/preload、App Server protocol/client、gateway、catalog、schema 与 fixture 合同。
|
||||
- `npm run test:rust:changed`:通过,受影响 workspace lib tests 全部通过。额外执行 `cargo check --manifest-path "lime-rs/Cargo.toml" -p app-server --tests` 与 App Server 治理定向回归,均通过。
|
||||
- `npm run test:changed -- "v1.113.0"`:111/111 批全部通过,最终进程退出码为 0。
|
||||
- `npm run verify:gui-smoke`:准备阶段和最终复验均通过。Gate B 证据覆盖真实 Electron renderer、preload/IPC、`app_server_handle_json_lines`、App Server `1.114.0`、Claw workbench shell 首次加载/重载和 memory settings;最终 evidence `run_id=standalone-shell-01-20260727160827-63289`,结果 `pass`。
|
||||
- `git diff --check`:准备阶段和最终复验均通过。
|
||||
- `npm run verify:local`:未全部通过,唯一阻断为 changed-file i18n 扫描在 `src/components/channels/ImConfigPage.tsx` 报告 148 处中文硬编码。该文件相对 `v1.113.0` 只将 `provider.customModels` 迁移为 `provider.models`;基线与当前中文命中数均为 269,148 处报告均已存在于基线。本次不扩大为整页 i18n 重写,也不放宽扫描规则;其余 17 个变更前端文件扫描为 0 findings。
|
||||
- 门禁修复:将 App Server route support helper 拆入 `runtime_backend/route_support.rs`,使 `runtime_backend.rs` 从 882 行降至 712 行;补齐 `Interrupted` image generation 失败投影及回归;对齐官方 OpenAI Responses web/image capabilities 与 custom host fail-closed 断言;修正前端 typed `models[]` test fixtures,未增加旧字符串格式兼容。
|
||||
- 远端状态:待 Git 危险操作确认后补充 release commit、tag 和 origin 复核。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:Gemini GenerateContent、Ollama Responses、官方 Responses Hosted Web Search、模型 reroute transient 通知、能力 provenance、typed Provider 配置、catalog refresh、Turn selection reconciliation 及其单一 App Server/RuntimeCore/GUI 投影。
|
||||
- `compat`:无新增 compat owner。
|
||||
- `deprecated`:无新增 deprecated 路径。
|
||||
- `dead / deleted / forbidden-to-restore`:Ollama Chat/NDJSON 执行链、基于 Provider 或模型名称猜测执行能力、第三方 Hosted Web Search 提权、reroute 持久化重放、silent catalog fallback、`custom_models/customModels` 和第二套 selection store。
|
||||
@@ -1,62 +0,0 @@
|
||||
# Lime v1.115.0 发布执行计划
|
||||
|
||||
状态:ready-for-git-confirmation
|
||||
日期:2026-07-29
|
||||
目标版本:`1.115.0`
|
||||
目标 tag:`v1.115.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.114.0` 后当前工作树中的 Provider transport、模型目录与路由、视频媒体任务、Agent 空响应与重试、图片投影、Codex 渲染 v2 规划及其协议、文档、测试和生成物作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:版本事实源、双语单页 release notes、发布门禁、Gate B 与候选集终审均已完成;本地 `main`、`origin/main` 与 `v1.114.0` 基线均为 `c7e6dc841`,目标 tag 在本地和远端均不存在。
|
||||
- 下一刀:请求 Git 写操作确认;确认后暂存完整候选集,连续完成 release commit、tag、`main`/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.114.0`。
|
||||
- 初始工作树:187 个已跟踪改动、17 个未跟踪文件,其中 5 个文件为删除;暂存区为空。发布准备及并行候选收口后终审为 194 个已跟踪改动、23 个未跟踪文件,其中 5 个文件为删除,共 217 个候选文件;tracked diff 为 10,795 行新增、2,955 行删除,暂存区仍为空。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 和本计划。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪产品、协议、文档、测试、schema 与生成物改动;核心包括 Vertex Gemini、Azure OpenAI Responses、Fal/xAI 视频任务、`model/list/updated`、Provider health/retry、Agent empty-response resampling、Thread model admission/reconciliation、Hosted Image/sidecar 预览,以及 Codex 渲染 v2 覆盖蓝图。
|
||||
- `excluded changes`:无。未跟踪文件均与上述协议、worker、transport、回归或版本化规划直接关联;未发现本地缓存、构建产物、凭证或个人临时文件。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 发布准备阶段写版本事实源、双语 release notes、本计划,以及发布门禁直接暴露的 6 个协议/投影/fixture 文件;其余候选产品文件只读避让。
|
||||
- 所有版本事实源同步为 `1.115.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:changed`、`npm run test:changed -- "v1.114.0"`、`npm run verify:gui-smoke` 与 `git diff --check`;失败必须定位、修复或记录明确阻塞,不能静默降级。
|
||||
- 重大架构变更已在 `internal/aiprompts/architecture.md` 更新,模型目录 admission、Hosted Image、Vertex Gemini 与视频媒体任务的责任开发者确认均记录为 `root, 2026-07-27/28`。
|
||||
- 获得 Git 写操作确认后,暂存全部 release candidate,复核 staged 摘要,连续执行 `git commit -m "Release v1.115.0"`、`git tag v1.115.0`、`git push origin main`、`git push origin v1.115.0`,并复核本地/远端 commit 与 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过;最终版本一致性为 `1.115.0`。
|
||||
- `npm run typecheck`:通过;发布硬门禁在投影类型修复后完整复跑通过。
|
||||
- `npm run test:contracts`:通过;App Server client contract 为 284 checks,command、harness、modality、scripts、Electron release workflow 与 docs boundary 均通过。
|
||||
- `npm run test:rust:changed`:通过;workspace 版本变化触发 `cargo test --lib --workspace`,除测试自身声明的网络/TCP ignored cases 外全部通过。
|
||||
- `npm run test:changed -- "v1.114.0"` + `npm run test:resume`:通过;修复失败批次后续跑完成 `112/112`。
|
||||
- `npx vitest run "src/lib/api/agentRuntime/conversationProjection/reducer.test.ts" "src/lib/api/agentRuntime/appServerCanonicalThreadProjection.test.ts"`:通过,2 files / 10 tests;`test:related` 入口曾因 Vite 将 `electron` 目录当文件读取而报 `EISDIR`,已用明确测试文件覆盖本次最终投影补丁。
|
||||
- `npm run verify:gui-smoke`:通过;Gate B-F `run_id=standalone-shell-01-20260728170431-14818`,21/21 assertions、33 次 `app_server_handle_json_lines` IPC 命中,无 console/page/invoke/preload 错误,无 legacy command 与 mock fallback 命中。
|
||||
- `git diff --check`:通过。
|
||||
- 远端状态:本地 `main` 与 `origin/main` 同步于 `c7e6dc841`;目标 tag 本地和远端均不存在。
|
||||
|
||||
## 门禁修复
|
||||
|
||||
- `lime-rs/crates/app-server-protocol/src/protocol/v2/tests.rs`:稳定通知清单补齐 `model/list/updated`。
|
||||
- `internal/refactor/v1/fixtures/item-inventory.v0.1.json`:同步 `imageGeneration` 的 `revisedPrompt` / `savedPath` 投影字段并标记 aligned。
|
||||
- `src/lib/api/agentRuntime/appServerCanonicalThreadProjection.test.ts`:未知 Item 改为验证 fail-visible `unknown_item` 安全诊断投影。
|
||||
- `src/lib/api/agentRuntime/appServerCanonicalThreadProjection.ts` 与 `conversationProjection/{adapters,reducer}.ts`:修复 reducer 接入后的序号 fallback、协议对象收窄、event-id 字面量类型和线程 identity 穷尽分支。
|
||||
- `src/lib/api/agentRuntime/conversationProjection/reducer.test.ts`:补齐 direct v2 Item fixture 的 canonical sequence 与生命周期时间,守住 live/read/replay 等价投影。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:Vertex Gemini、Azure OpenAI Responses、Fal/xAI 视频任务、typed `model/list/updated`、exact-route Provider health/retry、Agent empty-response resampling、Thread model admission/reconciliation、Hosted Image 与 sidecar 预览。
|
||||
- `compat`:无新增 compat owner。
|
||||
- `deprecated`:flat EventLog 与旧 projection reader 保持既有 bounded/deprecation 状态,本次不扩展。
|
||||
- `dead / deleted / forbidden-to-restore`:全局 `modelProvider/capabilities/read`、未绑定 exact credential 的视频执行、普通 OpenAI 视频伪执行、Provider 名称能力猜测、旧测试脚本、未知 Item 静默丢弃与第二套 Renderer timeline store。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:90%。候选范围、架构确认、版本、release notes、门禁、Gate B 与远端/tag 预检均已完成;仅待 Git 写操作确认后执行 commit、tag、推送与远端复核。
|
||||
@@ -1,72 +0,0 @@
|
||||
# Lime v1.116.0 发布执行计划
|
||||
|
||||
状态:quality-fix-ready-for-git-confirmation
|
||||
日期:2026-07-30
|
||||
目标版本:`1.116.0`
|
||||
目标 tag:`v1.116.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.115.0` 后当前工作树中的 Renderer ConversationProjection、direct TurnTimeline、Pending Interaction、v2 media read、长历史性能、模型 taxonomy、Agent control state,以及对应协议、文档、测试、schema 和生成物作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:release commit `5d1feb7e2`、tag `v1.116.0`、`main`/tag 推送和 GitHub Release 已完成;Release workflow 全绿。首轮 Quality run 暴露干净 CI 缺口,本地修复及 CI 同款全量前端、Rust、contracts、typecheck 已通过,准备 follow-up quality fix。
|
||||
- 下一刀:获得第二次 Git 高风险写操作明确确认后,只暂存本计划声明的 8 个 quality-fix 文件,复核 staged 摘要,创建并推送 follow-up commit;保持 `v1.116.0` tag 固定指向 `5d1feb7e2`,监控新 Quality run 到成功。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.115.0`。
|
||||
- 初始工作树:305 个已跟踪改动、37 个未跟踪文件,其中 14 个文件为删除;tracked diff 为 13,324 行新增、9,986 行删除,暂存区为空。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes、本计划和执行计划索引。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪产品、协议、文档、测试、schema 与生成物改动;核心包括 canonical ConversationProjection、direct TurnTimeline、Pending Interaction、MCP elicitation、thread-scoped `media/read`、bounded history/preview、protocol drift diagnostics、Agnes canonical capability、Agent state projection,以及云端多模型平台目标架构。
|
||||
- `excluded changes`:无。未跟踪文件均与上述 current runtime、协议、fixture、回归或版本化架构文档直接关联;未发现本地缓存、构建产物、凭证或个人临时文件。
|
||||
- 最终工作树:316 个已跟踪改动、41 个未跟踪文件,其中 14 个文件为删除;tracked diff 为 13,587 行新增、10,140 行删除。GUI 与 Electron 门禁生成的 `.lime/qc/**`、`dist/**` 和 `dist-electron/**` 证据/构建产物均未进入候选。
|
||||
- release commit:`5d1feb7e21aa4f74863233e053b43fde1293264d`,message 为 `Release v1.116.0`;本地/远端 `v1.116.0` 与首轮 `origin/main` 均指向该 commit。
|
||||
- follow-up quality fix 写集:`tsconfig.json`、`scripts/check-app-server-client-contract.mjs`、`lime-rs/crates/app-server/src/processor/thread.rs`、`lime-rs/crates/app-server/tests/media_task_jsonrpc.rs`、`lime-rs/crates/app-server/tests/model_selection_refresh_jsonrpc.rs`、`src/lib/governance/projectThreadFirstBoundary.test.ts`、`src/components/agent/chat/AgentChatWorkspace.teamRuntimeBoundaryGuard.test.ts` 和本计划。
|
||||
- follow-up 排除项:并发工作树中的导航、ModelSelector、canonical item reader、turn direct-input、Gate B/smoke 调试等其它文件不属于本轮 quality fix,不暂存、不提交、不覆盖。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 发布准备阶段只写版本事实源、双语 release notes、本计划和执行计划索引;其余候选产品文件只读避让。门禁若暴露候选缺陷,必须先声明最小补丁点再修改对应 owner。
|
||||
- 所有版本事实源同步为 `1.116.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:changed`、`npm run test:changed -- "v1.115.0"`、`npm run smoke:agent-runtime-current-fixture`、`npm run smoke:agent-session-history-electron-fixture`、`npm run verify:gui-smoke` 与 `git diff --check`;失败必须定位、修复或记录明确阻塞,不能静默降级。
|
||||
- 重大架构变更已在 `internal/aiprompts/architecture.md` 更新;Renderer single projection 和 thread-scoped media read 的责任开发者确认记录为 `root, 2026-07-29`。
|
||||
- 获得 Git 写操作确认后,暂存全部 release candidate,复核 staged 摘要,连续执行 `git commit -m "Release v1.116.0"`、`git tag v1.116.0`、`git push origin main`、`git push origin v1.116.0`,并复核本地/远端 commit 与 tag。
|
||||
- follow-up 不移动、不删除、不重打 `v1.116.0`;只允许普通 commit 推进 `main` 并触发新的 Quality run。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace、Cargo lock 与 Electron/App Server 均为 `1.116.0`;所有门禁结束后已再次复跑通过。
|
||||
- `npm run typecheck`:通过,Renderer 与 Node TypeScript 工程均无类型错误;所有门禁结束后已再次复跑通过。
|
||||
- `npm run test:contracts`:通过;App Server client 286 checks、command contract、Harness、modality、scripts、Electron release workflow 与 docs boundary 全部通过。
|
||||
- `npm run test:rust:changed`:最终独占完整复跑通过;App Server `1623/1623`,其余受影响 workspace library tests 全部通过。
|
||||
- `npm run test:changed -- "v1.115.0"`:最终独占完整复跑 `112/112` 批全部通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 history/cache hydration、turn/tool 收尾、首页热路径、Coding Workbench、图片与媒体、停止后续聊、approval、Inputbar restore、steer、Plan、Skills、MCP、Expert 与 Article Editor 等真实 Electron fixture,`liveProviderUsed=false`。
|
||||
- `npm run smoke:agent-session-history-electron-fixture`:通过;覆盖 archive/restart/unarchive、分页同构读取、长列表读取与 resume,证据写入 `.lime/qc/gui-evidence/agent-session-history-electron-fixture/`。
|
||||
- `npm run verify:gui-smoke`:通过;production renderer、Electron host/preload、App Server sidecar、Claw workspace reload 与设置页就绪,App Server 报告 `protocol=appserver.v0 version=1.116.0`,Gate B 证据写入 `.lime/qc/project-gates/standalone-shell-01-20260730020346-38855/`。
|
||||
- `npm run governance:legacy-report`:通过;扫描 2370 个文件,零引用候选 0、分类漂移候选 0、边界违规 0。
|
||||
- `git diff --check`:所有门禁结束后复跑通过。
|
||||
- 计时抖动说明:首次并行执行时,App Server 1200-command 导入用例为 `30.90s > 30s`,独占精确复跑为 `4.19s`,随后完整 Rust changed-scope 独占复跑通过;`AppSidebar.search` 首用例首次超过 5 秒,独占精确复跑 `8/8` 通过且首用例为 326ms,随后 `112/112` changed-test 正式批次通过。两项均判定为并发资源竞争,没有修改产品代码或放宽断言。
|
||||
- Tag 与基线复核:release commit `5d1feb7e21aa4f74863233e053b43fde1293264d` 已推送;本地与远端 `v1.116.0` 均固定指向该 commit,follow-up quality fix 不移动或重打 tag。
|
||||
|
||||
## 远端发布与 Quality 收口
|
||||
|
||||
- GitHub Release workflow `30509459720`:成功;Electron macOS arm64/x64、Windows x64、Windows N-1 Squirrel installed smoke、GitHub assets、Cloudflare R2 updater 与 macOS arm64/x64、Linux x64、Windows x64 CLI 发布全部通过。
|
||||
- GitHub Release:`https://github.com/limecloud/lime/releases/tag/v1.116.0`,非 draft、非 prerelease,target commit 为 `5d1feb7e21aa4f74863233e053b43fde1293264d`,13 个资产均为 uploaded。
|
||||
- 首轮 Quality run `30509386095`:失败。Frontend Full 在干净环境无法解析 `@limecloud/app-server-client/browser`;根因是根 `tsconfig.json` 缺少 browser 子路径映射,本地残留 `dist/browser.d.ts` 掩盖问题。已新增源码映射与 contract guard,并在移开 `packages/app-server-client/dist` 后验证 Renderer typecheck 仍通过。
|
||||
- 首轮 Quality 的 Rust Full:`media_task_jsonrpc` 两个图片命令 fixture 在 `thread/start` 被 `capability_gap` 拒绝;根因是 fixture 把纯 ImageGeneration 模型作为 Agent chat Thread 模型。已拆分独立 Chat 与 Image provider,Thread/Turn 绑定 Chat,图片 application metadata 仍精确选择 Image provider,不放宽生产预检。
|
||||
- 前端全量续跑:初次在 43/112 批发现两处治理守卫仍锁定旧的一参数 `switchTopic(sessionId)` 字符串;生产行为与单测已要求 detached session 选项。两处守卫改为验证调用与 `allowDetachedSession: true` 事实,精确测试 `15/15`、完整前端 `112/112` 批通过。
|
||||
- Rust workspace 全量:首次在 `model_selection_refresh_jsonrpc` 发现 generation 基线硬编码为 0,当前 App Server 初始化已将基线推进为 1;fixture 改为读取实际基线并严格断言只递增 1。随后发现 `thread/start` 的 model/modelProvider 参数错误被错误映射为 JSON-RPC `-32600`;processor 边界现将该模型选择解析的 `InvalidRequest` 精确映射为 `INVALID_PARAMS (-32602)`。最终 `thread_v2_jsonrpc` `15/15` 与完整 `npm run test:rust` 通过,App Server 主库 `1623/1623`。
|
||||
- follow-up 最终复跑:`npm run test:contracts` 通过(App Server client 286 checks)、`npm run typecheck` 通过、`npm run verify:app-version` 通过、`cargo fmt --all --check` 通过、`git diff --check` 通过。完整前端/Rust 结果验证当时工作树;follow-up staged 清单会排除并发写集,新 Quality run 负责验证精确提交。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:ConversationProjection live/read/resume、direct TurnTimeline、PendingInteractionController、typed MCP/DynamicTool、v2 `media/read`、bounded history/preview、Agent control state facts 和 canonical model taxonomy。
|
||||
- `compat`:无新增 compat owner。
|
||||
- `deprecated`:`media.read.chunk` / `media.read.completed` transient notification、fileChange outputDelta、thread/compacted 与尚未迁完的 V2-05 notification 保持 bounded 迁出状态,本次不扩展。
|
||||
- `dead / deleted / forbidden-to-restore`:v0 `agentSession/media/read` schema、canonical Item -> Message 合成、三个流式内容同步 hook、重复 approval/user-input API、旧 MCP elicitation dialog owner、通用 extension fallback 与生产 mock fallback。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:98%。`v1.116.0` release commit、tag、推送、GitHub Release 和资产发布均完成;首轮 Quality 缺口已修复且本地完整矩阵通过。仅剩 follow-up quality-fix commit/push 与新 Quality run 成功复核。
|
||||
@@ -1,57 +0,0 @@
|
||||
# Lime v1.117.0 发布执行计划
|
||||
|
||||
状态:ready-for-git-confirmation
|
||||
日期:2026-07-31
|
||||
目标版本:`1.117.0`
|
||||
目标 tag:`v1.117.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.116.0` 后当前工作树中的 Host capability、DynamicTool、权限请求、Multi-Agent、配置告警 v2、Lime Hub / Agnes 2.5 模型路由、媒体 transient retirement,以及 v1.116.0 发布后的质量修复作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:release candidate、版本事实源、双语 release notes 与发布门禁均已收敛;基线 `main`、`origin/main` 与 `v1.116.0` 均为 `5d1feb7e2`,目标 tag `v1.117.0` 在本地和远端均不存在。
|
||||
- 下一刀:完成工作树稳定性双采样与 staged candidate 复核,随后请求 Git 高风险写操作确认;确认后连续完成 release commit、tag、`main`/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.116.0`。
|
||||
- 暂存前最终候选盘点:179 个已跟踪改动、45 个未跟踪文件,其中 5 个文件为删除;tracked diff 为 9,114 行新增、2,622 行删除。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 与本计划。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪产品、协议、文档、测试、schema 与生成物改动;包括 v1.116.0 follow-up quality fixes、Host capability、DynamicTool、request permissions、AgentControl、配置告警 v2、模型 capability provenance、媒体 transient retirement 和 Skill 安装目录打开语义。
|
||||
- `excluded changes`:无。未跟踪文件均已映射到 current runtime 源码、typed schema、测试或版本化执行/evidence 文档;未发现本地缓存、构建产物、凭证、个人临时文件或异常大文件。
|
||||
- 工作树准备阶段曾存在并发写入迹象;发布准备只写本计划、版本事实源与双语 release notes,其余候选文件只读避让。Git 确认前以两次间隔指纹采样证明候选集稳定且没有漏发。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 所有版本事实源同步为 `1.117.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:changed`、`npm run verify:gui-smoke` 与 `git diff --check`。
|
||||
- 协议、Bridge、runtime、GUI 与重大架构均有变化;门禁失败必须定位并修复,或记录明确阻塞,不能静默降级。
|
||||
- 重大架构变更已同步 `internal/aiprompts/architecture.md`;Host capability、配置告警 v2、媒体 transient retirement 与模型 capability provenance 均已有责任开发者确认记录。
|
||||
- 获得 Git 写操作明确确认后,暂存完整 release candidate,复核 staged 清单与摘要,连续执行 release commit、创建 `v1.117.0` tag、推送 `main` 和 tag,并复核本地与远端引用。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:版本更新后与最终复跑均通过,根应用、CLI npm 包、Rust workspace 与锁文件一致为 `1.117.0`。
|
||||
- `npm run typecheck`:初次执行与最终复跑均通过,覆盖 renderer 与 Node TypeScript 配置。
|
||||
- `npm run test:contracts`:通过;generated protocol 无漂移,App Server client 共 289 项检查通过。
|
||||
- `npm run test:rust:changed`:通过;workspace 版本变更使范围扩大为 `cargo test --lib --workspace`,所有已执行 Rust 测试零失败。
|
||||
- `npm run test:changed -- "v1.116.0"`:通过;112/112 个 changed 批次全部完成,退出码 0。
|
||||
- `npm run verify:gui-smoke`:通过;App Server 报告 `version=1.117.0`,真实 Electron Gate B 摘要位于 `.lime/qc/project-gates/standalone-shell-01-20260730191439-55464/shell-01-electron-smoke/summary.json`。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 history/cache hydration、turn/tool terminal、approval、steer、Plan、Skills、MCP、media、Coding Workbench 与 Article Editor 等真实 Electron current fixture,`liveProviderUsed=false`。
|
||||
- `git diff --check`:版本更新前、版本更新后与最终复跑均通过。
|
||||
- 工作树稳定性:2026-07-31 03:38:29 与 03:38:52 两次采样的 status、tracked diff、untracked content 三组 SHA-256 指纹完全一致,候选数量均为 224/179/45。
|
||||
- staged candidate:完整候选已暂存;Git 将 3 组 schema 文件识别为 rename,摘要为 221 个文件、14,617 行新增、2,493 行删除,`git diff --cached --check` 通过,无排除项。
|
||||
- 平台限制:Windows packaged Gate B 尚未执行;本轮 macOS Electron fixture 不能替代 Windows packaged 证据,该项保留为发布后平台残余风险。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:Electron Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item -> GUI 产品链,Host capability、DynamicTool、AgentControl、typed v2 config warning、validated media read、canonical model capability provenance。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:Refactor v2 尚未迁完的 V2-05 notification、broader host capability 与 recovery surface,只允许继续迁出。
|
||||
- `dead / deleted / forbidden-to-restore`:v0 配置告警与 schema、媒体 transient notification 消费链、Renderer live-drain helper、旧 protocol facade、Renderer 伪造 capability/binding、生产 mock fallback。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:92%。候选范围、发布元数据、发布门禁、工作树稳定性和 staged 复核已完成;仅剩 Git 明确确认、commit、tag、push 和远端复核。
|
||||
@@ -1,61 +0,0 @@
|
||||
# Lime v1.118.0 发布执行计划
|
||||
|
||||
状态:completed
|
||||
日期:2026-08-01
|
||||
目标版本:`1.118.0`
|
||||
目标 tag:`v1.118.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.117.0` 后当前工作树中的 Skills catalog 自动失效、typed error、`turn/plan/updated`、MCP OAuth 完成通知、Windows Provider 模型目录与 updater 可靠性,以及核心用户流程修复作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:`v1.118.0` 已通过 GitHub Release 工作流完成桌面与 CLI 资产发布;release commit、tag、`main`/tag 推送与远端引用复核均已完成。发布后质量修复已追加到 `main`,不改写已公开 tag。
|
||||
- 下一刀:无;后续增量进入下一版本,不改写已发布的 `v1.118.0` tag。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.117.0`。
|
||||
- 最终候选盘点:167 个 tracked diff 文件、30 个未跟踪文件,tracked diff 为 12,614 行新增、1,563 行删除。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 与本计划。
|
||||
- `candidate changes`:当前工作树全部产品、协议、文档、测试、schema、生成物和脚本改动;重点包括 Skills catalog invalidation、typed error retry/terminal、canonical plan checklist、MCP OAuth typed notification、Provider model catalog 和 updater 状态修复。
|
||||
- `excluded changes`:无。初始盘点未发现缓存、构建产物、凭证、个人临时文件或与候选无关的大文件。
|
||||
- 并行避让:本轮除 release metadata、本计划和 Rust 门禁暴露的一处过时 fixture 外,其余候选文件只读验证,不覆盖已有业务改动。门禁期间新增的 MCP 架构/进度文档属于同一 current notification 候选,已纳入最终盘点与后续验证。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 所有版本事实源同步为 `1.118.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:changed`、`npm run smoke:agent-runtime-current-fixture`、`npm run verify:gui-smoke` 与 `git diff --check`。
|
||||
- 协议、App Server、Electron、GUI、脚本与重大架构均有变化;门禁失败必须定位修复或记录明确阻塞,不能静默降级。
|
||||
- 重大架构变更已同步 `internal/aiprompts/architecture.md`,并包含责任开发者确认。
|
||||
- Git 写操作已获得明确确认;初始完整 release candidate 由 release commit `d0971ea08` 承载,`v1.118.0` tag 与远端 tag 固定指向该对象;发布后质量修复 commit `272395cf0` 仅推进远端 `main`,未改写 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:版本更新后与最终复跑均通过,根应用、CLI npm 包、Rust workspace 与锁文件一致为 `1.118.0`。
|
||||
- `npm run typecheck`:通过,覆盖 renderer 与 Node TypeScript 配置。
|
||||
- `npm run test:contracts`:通过;839 个 generated protocol types、0 generation failure、292 项 App Server client contract,以及 command、harness、modality、scripts、Electron release workflow 和 docs boundary guard 全部通过。
|
||||
- `npm run test:rust:changed`:因 workspace 版本和 lockfile 变化扩大为 `cargo test --lib --workspace`。首次运行发现 `maps_item_and_terminal_lifecycle_to_direct_v2` 仍使用旧 `turn.failed` fixture;更新为当前 `error -> turn/completed` contract 后,定向测试 1/1 与最终 workspace 全部 suite 通过,关键结果包括 App Server 1650/1650、protocol 98/98、MCP 151/151,0 failed;既有联网 embedding 测试按规则 ignored。
|
||||
- `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all --check` 与 `git diff --check`:通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;覆盖 history/cache hydration、停止继续、approval、Skills catalog 自动刷新、typed error retry success/failure、Plan 历史恢复、MCP structuredContent、media、Coding Workbench 与 Article Editor,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;App Server 报告 `version=1.118.0`,真实 Electron Gate B 摘要位于 `.lime/qc/project-gates/standalone-shell-01-20260731155713-55975/shell-01-electron-smoke/summary.json`。
|
||||
- `npm run smoke:mcp-oauth-notification-electron-fixture`:通过;真实 Electron、外部浏览器回调与 App Server v2 notification 闭环命中 `mcpServer/oauthLogin/completed`,证据位于 `.lime/qc/mcp-oauth-notification/mcp-oauth-notification-fixture-summary.json`。
|
||||
- 工作树稳定性:2026-08-01 00:01:15 与 00:01:34 两次采样的 status、tracked diff、untracked content 三组 SHA-256 完全一致;最终候选保持 167 个 tracked diff 文件与 30 个未跟踪文件。该采样对应发布前基线,随后发布提交与质量修复提交已完成远端复核。
|
||||
- Staged 边界:197 个候选文件全部暂存,摘要为 16,356 行新增、1,563 行删除;未暂存与未跟踪文件均为 0,`git diff --cached --check` 通过。
|
||||
- 发布结果:release commit `d0971ea08`、`v1.118.0` tag、远端 `main`/tag 推送与引用复核完成;GitHub Release 工作流 `30645806677` 成功,发布 13 个桌面与 CLI 资产,Release 为公开非草稿、非预发布状态。发布后并行 MCP 改动留在工作树,未纳入 release 或质量修复提交。
|
||||
- 发布后质量收口(lint 修复):首轮 GitHub Quality run `30645798510` 的 Frontend Full 在全量 lint 阶段发现 2 条 hook 依赖告警;在不改写已发布 tag 的前提下,`main` 追加行为等价的依赖收敛与自动展开测试期望修复。`npm run lint` 通过,4 个相关测试文件 47/47 通过,`git diff --check` 通过;`npm run test:related` 的 Vite 收集器因既有 `EISDIR .../electron` 问题未进入测试,已由精确 Vitest 命令覆盖本次改动。
|
||||
- 发布后质量收口:首轮 GitHub Quality run `30645798510` 的 Frontend Full 在全量 lint 阶段发现 2 条 hook 依赖告警;在不改写已发布 tag 的前提下,`main` 追加行为等价的依赖收敛与自动展开测试期望修复。`npm run lint` 通过,4 个相关测试文件 47/47 通过,`git diff --check` 通过;`npm run test:related` 的 Vite 收集器因既有 `EISDIR .../electron` 问题未进入测试,已由精确 Vitest 命令覆盖本次改动。
|
||||
- 质量复核:后续 Quality run `30646611487` 的 Lint、Typecheck、Integrity、Rust Full、GUI Smoke 均通过;Frontend Full 仅因仓库既有 Vitest layer budget `35 > 30` 失败,未进入全量 Vitest。该治理缺口不阻断已成功完成的 Release 工作流,未通过临时放宽阈值掩盖。
|
||||
- 平台证据:Release 工作流的 Windows x64 Squirrel 安装候选 smoke 已通过;macOS arm64/x64、Windows x64 桌面构建与四平台 CLI 构建均成功,R2 updater 资产上传成功。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item -> GUI 产品链;typed v2 notifications、Skill catalog invalidation、canonical checklist/error recovery、Provider 模型目录和 Electron updater。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:Refactor v2 尚未迁完的 V2-05 notification、host capability 与 recovery surface,只允许继续迁出。
|
||||
- `dead / deleted / forbidden-to-restore`:raw notification wrapper、第二 catalog/checklist/error owner、Provider inferred-only 可执行假设、updater 伪版本判断与生产 mock fallback。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:100%。v1.118.0 候选、版本元数据、Release 资产、commit、tag、push 与远端复核均已完成;剩余 Vitest layer budget 属于既有治理债务,已记录但不改写已发布版本。
|
||||
@@ -1,61 +0,0 @@
|
||||
# Lime v1.119.0 发布执行计划
|
||||
|
||||
状态:completed
|
||||
日期:2026-08-01
|
||||
目标版本:`1.119.0`
|
||||
目标 tag:`v1.119.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.118.0` 后当前工作树中的 MCP startup status typed notification、unknown Item 安全投影与恢复、unified exec terminal interaction 脱敏持久化和对应协议、GUI、测试、文档作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:`v1.119.0` release candidate、版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送、远端引用、GitHub Release、Electron/CLI 资产与 updater 发布复核均已完成。
|
||||
- 下一刀:后续增量进入下一版本,不改写已发布的 `v1.119.0` tag;Vitest component migration candidates 与 R2 旧资产清理工具能力作为独立治理任务处理。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.118.0`。
|
||||
- 初始盘点:123 个 tracked diff 文件、8 个未跟踪文件,tracked diff 为 6,883 行新增、1,347 行删除。最终暂存前盘点为 128 个 tracked diff 文件、9 个未跟踪文件;完整 staged 候选共 137 个文件、7,964 行新增、1,427 行删除。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 与本计划。
|
||||
- `candidate changes`:初始工作树全部产品、协议、schema、生成客户端、GUI、文档、测试与脚本改动;重点包括 MCP startup status、unknown Item live/cold recovery 与 unified exec terminal interaction。
|
||||
- `excluded changes`:无。初始盘点未发现缓存、构建产物、凭证、个人临时文件或与候选主题无关的文件。
|
||||
- 并行避让:除 release metadata 与本计划外,其余候选文件只读验证,不覆盖已有业务改动;若门禁暴露 release blocker,只做可定位、可验证的最小修复并在本计划记录。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 版本事实源同步为 `1.119.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:changed`、`npm run smoke:agent-runtime-current-fixture`、`npm run verify:gui-smoke` 与 `git diff --check`。
|
||||
- MCP startup、unknown Item 与 terminal interaction 已有专项 Gate B 证据;发布门禁若发现证据过期或相关回归,再定向复跑对应 fixture。
|
||||
- 本候选未改变 public owner、唯一产品链或依赖方向,无需修改 `internal/aiprompts/architecture.md`;责任开发者将在发布收口时确认。
|
||||
- Git 写操作已获得明确确认;完整 release candidate 由 release commit `f3d062b8c47f7b7682f3ce889337175bcf1cf8e6` 承载,`v1.119.0` tag、远端 `main` 与远端 tag 指向同一发布对象。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,所有版本事实源为 `1.119.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;844 generated protocol types、0 generation failures、292 app-server-client checks。
|
||||
- `npm run test:rust:changed`:首轮暴露协议稳定名称断言遗漏 `item/commandExecution/terminalInteraction`;已在 `lime-rs/crates/app-server-protocol/src/protocol/v2/tests.rs` 做最小修复并重跑通过。关键结果:App Server 1662/1662、protocol 99/99、MCP 151/151、tool-runtime 313/313。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;`liveProviderUsed=false`,包含 unknown Item 真实 Electron Gate B 场景。
|
||||
- `npm run verify:gui-smoke`:通过;App Server version `1.119.0`。证据:`.lime/qc/project-gates/standalone-shell-01-20260801181323-22109/shell-01-electron-smoke/summary.json`。
|
||||
- `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all --check`:通过。
|
||||
- `git diff --check`:通过。
|
||||
- Staged 边界:137 个候选文件全部暂存,摘要为 7,964 行新增、1,427 行删除;未暂存与未跟踪文件均为 0,`git diff --cached --check` 通过。commit hook 的 Level 0 AI 验证为 137/137 通过。
|
||||
- 发布结果:release commit `f3d062b8c`、轻量 tag `v1.119.0`、`main`/tag 推送与远端引用复核完成;发布后工作树 clean。
|
||||
- GitHub Release workflow `30717094281`:通过。Electron macOS x64、macOS arm64、Windows x64 构建、签名、资源验证与资产暂存全部成功;Windows 从 `v1.118.0` 安装包升级到 `v1.119.0` 的 Squirrel packaged smoke 及证据上传成功;Electron 资产聚合和 GitHub Release 发布成功。
|
||||
- updater 与 CLI:Cloudflare R2 stable updater 资产上传成功;macOS x64、macOS arm64、Windows x64、Linux x64 CLI 构建与 GitHub Release 上传全部成功。R2 旧版本清理因当前 Wrangler 不支持 `r2 object list` 而按工作流警告跳过,不影响本版本资产上传。
|
||||
- GitHub Release:`v1.119.0` 已发布并标记为 latest,非 draft / prerelease,共 13 个 uploaded 资产;页面为 `https://github.com/limecloud/lime/releases/tag/v1.119.0`。
|
||||
- GitHub Quality workflow `30717086347`:Integrity、Lint、Typecheck、GUI Smoke、Rust Full 与 Windows Shell Runtime 均通过;Frontend Full 仅因仓库沿用自 `v1.118.0` 的 Vitest layer budget 基线 `35 > 30` 失败,未进入全量 Vitest。本地以同一命令复现为 35 个 candidates,未临时放宽阈值或改写已发布 tag。
|
||||
- 验证等级:协议/跨层门禁、Rust owner 与 CI workspace 全量测试、Current fixture、真实 Electron Gate B、Windows packaged Gate B 和实际 macOS/Windows 发布产物均已覆盖;未获得本轮全量前端 Vitest 证据,原因是既有 layer budget 在收集前阻断。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:App Server v2 typed MCP startup status、canonical unknown Item、command terminal interaction,以及对应 read model、客户端和 GUI 投影。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:Refactor v2 尚未完成且缺少完整 producer、consumer、持久化语义或 Gate B 的 planned notification,仅允许继续迁出。
|
||||
- `dead / deleted / forbidden-to-restore`:旧 MCP lifecycle Desktop events、unknown Item null drop/raw payload/Extension fallback、独立 `write_stdin` Tool Item、raw stdin 持久化与生产 mock fallback。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:100%。候选范围、发布元数据、发布门禁、staged 复核、commit、tag、push、远端引用、GitHub Release、Electron/CLI 资产与 updater 发布均已完成;既有 Vitest layer budget 与 R2 旧资产清理能力已记录为独立治理项,不改写本版本 tag。
|
||||
@@ -1,64 +0,0 @@
|
||||
# Lime v1.120.0 发布执行计划
|
||||
|
||||
状态:completed
|
||||
日期:2026-08-03
|
||||
目标版本:`1.120.0`
|
||||
目标 tag:`v1.120.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.119.0` 之后当前工作树中的 Codex 历史导入 canonical metadata、用户消息去重、对话时间线与文件产物投影、Task Center 环境菜单及其协议、GUI、测试和文档作为同一个 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:`v1.120.0` 已完成 commit、tag、`main`/tag 推送和远端发布资产聚合。
|
||||
- 下一刀:无;发布后质量流水线发现的 Rust metadata 边界问题转入 `release-v1.120.1` 补丁计划。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.119.0`。
|
||||
- 初始盘点:108 个 tracked diff 文件、5 个未跟踪文件,tracked diff 为 19,631 行新增、1,571 行删除;加入 release metadata 与本计划后,当前候选待 staged 边界复核。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes 与本计划。
|
||||
- `candidate changes`:当前工作树全部产品、协议、schema、生成客户端、GUI、文档、测试与脚本改动;重点包括 Codex 导入 provenance/去重、canonical timeline、文件产物、Task Center 环境菜单与 Codex-style 阅读列。
|
||||
- `excluded changes`:无。未发现缓存、构建产物、凭证或个人临时文件;按“发版”默认规则全部纳入候选。
|
||||
- 并行避让:除 release metadata 与本计划外,其余候选文件只读验证;若门禁暴露 blocker,只做最小可验证修复并回写本计划。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 版本事实源与双语 release notes 统一为 `1.120.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、受影响 Rust/前端定向测试、`npm run verify:gui-smoke` 与 `git diff --check`。
|
||||
- 本候选不改变 public owner、唯一产品链或依赖方向,无需修改 `internal/aiprompts/architecture.md`;发布收口时确认。
|
||||
- Git 写操作(commit、tag、push)须在验证完成后按危险操作格式取得一次明确确认。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,版本事实源统一为 `1.120.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;协议生成 846 类型、0 漂移,App Server client 292 checks,命令/脚本/文档边界通过。
|
||||
- `npm run test:rust:changed`:通过;因 workspace manifest 触达边界扩大为 `cargo test --manifest-path lime-rs/Cargo.toml --lib --workspace`,全 workspace 单测通过,tool-runtime 313/313。
|
||||
- 受影响前端定向 Vitest:通过,18 个文件、237 个用例。
|
||||
- `npm run i18n:check:json`:通过;5 个 locale、13 个 namespace、10,003 个源键,缺失/多余键均为 0。
|
||||
- `npm run smoke:codex-import-click-through-electron-fixture`:通过;真实 Electron 导入 200 items / 4 messages,覆盖预览、附件、文件产物、环境菜单和续聊;summary=`.lime/qc/gui-evidence/codex-import-click-through-fixture/codex-import-click-through-fixture-summary.json`。
|
||||
- `npm run smoke:codex-import-continuation-electron-fixture`:通过;导入零回放、统一 exec、reload 恢复,provider requests=6;summary=`.lime/qc/gui-evidence/codex-import-continuation-fixture/codex-import-continuation-fixture-summary.json`。
|
||||
- `npm run smoke:local-history-import-visual-audit`:通过;summary=`.lime/qc/gui-evidence/local-history-import-visual-audit/local-history-import-visual-audit-summary.json`。
|
||||
- `npm run verify:gui-smoke`:通过;真实 Electron/App Server 版本 `1.120.0`,renderer/host/reload/workbench/memory settings smoke 通过;summary=`.lime/qc/project-gates/standalone-shell-01-20260803152335-39638/shell-01-electron-smoke/summary.json`。
|
||||
- `git diff --check`:通过。
|
||||
- 已完成:staged 候选摘要、release commit `944b7f40b`、`v1.120.0` tag、远端 `main` 与 tag 引用复核。
|
||||
- 发布后质量流水线:GUI Smoke、Windows Shell Runtime、Integrity 通过;Frontend Full 因 layer budget `35 > 30` 失败,Rust Full 因 `contextCompaction` 泄漏私有 `sourceEventType` metadata 失败。
|
||||
|
||||
## 发布后质量收尾
|
||||
|
||||
- `v1.120.0` tag 保持不变,不删除、不重建、不 force-push。
|
||||
- `projection.rs` 已将 typed item metadata 限制为 `imported=true` 的历史导入项;projection library 20/20 与 fork-compaction JSON-RPC 集成回归均通过。
|
||||
- 补丁版本执行记录:`internal/exec-plans/release-v1.120.1-plan.md`。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:Codex import canonical provenance、typed ThreadItem metadata、历史去重、timeline/file artifact projection、Task Center environment/location UI。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:既有 Refactor v2 未完成项,继续按原计划迁出。
|
||||
- `dead / deleted / forbidden-to-restore`:无本轮新增删除;生产 mock 与旧 owner 不得恢复。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:100%。`v1.120.0` 已完成候选收口、版本事实源、notes、门禁、commit、tag、push 和远端复核;后续质量修复由补丁计划承接。
|
||||
@@ -1,45 +0,0 @@
|
||||
# Lime v1.120.1 发布执行计划
|
||||
|
||||
状态:completed
|
||||
日期:2026-08-04
|
||||
目标版本:`1.120.1`
|
||||
目标 tag:`v1.120.1`
|
||||
|
||||
## 主目标
|
||||
|
||||
以 `v1.120.0` 为基线,发布 `projection.rs` 的 metadata 边界修复,阻止普通运行时 Thread Item 的私有 provenance 穿过 v2 projection;保留历史导入项的受控 typed metadata。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.120.0`。
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`。
|
||||
- `candidate changes`:`lime-rs/crates/app-server/src/processor/thread/projection.rs`、本执行计划及 `release-v1.120.0-plan.md` 的收尾记录。
|
||||
- `excluded changes`:`.gitignore` 的本地 `.gstack/` 追加,不属于发布候选。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 版本事实源与双语 release notes 统一为 `1.120.1`,notes 只保留补丁版单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、受影响 Rust 定向测试、`git diff --check`。
|
||||
- 不改写或删除已推送的 `v1.120.0` tag;创建并推送 `v1.120.1` 后复核远端 `main` 与 tag。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `cargo test --manifest-path lime-rs/Cargo.toml -p app-server --lib processor::thread::projection`:20/20 通过。
|
||||
- `cargo test --manifest-path lime-rs/Cargo.toml -p app-server --test thread_fork_compaction_jsonrpc compacted_thread_fork_replays_replacement_and_surviving_tail_after_restart -- --exact`:通过。
|
||||
- `npm run verify:app-version`:通过,版本事实源统一为 `1.120.1`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;协议生成 846 类型、0 漂移,App Server client 292 checks,命令/脚本/文档边界通过。
|
||||
- `npm run verify:gui-smoke`:通过;真实 Electron/App Server 版本 `1.120.1`,renderer/host/reload/workbench/memory settings smoke 通过;summary=`.lime/qc/project-gates/standalone-shell-01-20260804001437-91924/shell-01-electron-smoke/summary.json`。
|
||||
- `git diff --check`:通过。
|
||||
- Git 收口:已按确认执行 staged 边界复核、release commit、`v1.120.1` tag、`main`/tag 推送与远端引用复核。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:App Server v2 thread projection 的 typed metadata 边界。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:无新增。
|
||||
- `dead / deleted / forbidden-to-restore`:不恢复任何旧 runtime 或 raw metadata fallback。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前完成度:100%。修复、版本事实源、标准门禁与 Git 发布收口均纳入本次发版执行。
|
||||
@@ -1,71 +0,0 @@
|
||||
# Lime v1.121.0 发布执行计划
|
||||
|
||||
状态:completed
|
||||
日期:2026-08-05
|
||||
目标版本:`1.121.0`
|
||||
目标 tag:`v1.121.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
以 `v1.120.1` 为基线,将当前工作树中的 Plugin v2 catalog/安装/启停、Agent runtime activation、Claw mention、MCP App Right Surface、受控 Browser HTML 宿主、Skills watcher 修复及其协议、GUI、测试和文档作为同一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:版本事实源、双语 release notes、发布门禁、架构图确认及 Git 发布收口均已完成。
|
||||
- 下一刀:无;后续由 `v1.121.0` 发布后的线上观察与下一版本执行计划承接。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.120.1`,本地 `main` 与 `origin/main` 均为 `bba332c65`。
|
||||
- 初始盘点:145 个 tracked diff 文件、48 个未跟踪文件;tracked diff 为 7,838 行新增、537 行删除。
|
||||
- 门禁期间并行候选补入 canonical store 快照持久化、SQLite busy timeout 与回归测试;发版文件及闭环修复纳入后为 154 个 tracked diff 文件、49 个未跟踪文件,其中 `.gitignore` 仍排除。
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划索引。
|
||||
- `candidate changes`:除 `.gitignore` 外的当前工作树产品、协议、schema、生成客户端、Rust runtime、Electron host/fixture、GUI、五语资源、测试、bundled Plugin 资产与文档改动。
|
||||
- `excluded changes`:`.gitignore` 中本地 `.gstack/` 忽略项;该改动已在 `v1.120.1` 发布计划中明确排除,本次继续保留在未提交工作树。
|
||||
- 并行避让:除 release metadata 与本计划外,其余候选文件只读验证;门禁暴露 blocker 时只做最小可验证修复并回写本计划。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 版本事实源与双语 release notes 统一为 `1.121.0`,notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、受影响 Rust 验证、`npm run smoke:plugin-v2-current-electron-fixture`、`npm run verify:gui-smoke` 与 `git diff --check`。
|
||||
- 候选已修改 `internal/aiprompts/architecture.md` 并补充 Plugin v2 current 图。直接发布 `main` 无 PR 描述,责任开发者必须在 Git 高风险操作确认中同时确认架构图,未确认不得进入 release evidence。
|
||||
- Git 写操作(stage、commit、tag、push)须在门禁完成后按危险操作格式取得一次明确确认。
|
||||
- 完成 release commit、`v1.121.0` tag、`main` 与 tag 推送后,复核本地与远端引用;`.gitignore` 应作为唯一未提交排除项保留。
|
||||
|
||||
## 已知非本版阻断项
|
||||
|
||||
- Windows 安装到卸载证据、360px 级五语最长文案截图矩阵、repo/personal marketplace 的完整用户路径、更新/授权/管理员策略与安装事务崩溃恢复未验收。
|
||||
- 通用 Plugin Apps/Hooks、Browser intent、文件/结构化结果与完整 Plugin identity 追踪仍由 `plugin-v2-current-plan.md` 后续阶段承接。
|
||||
- 本版只完成上述已实现的 macOS current 候选发布,不将 Plugin v2 整体路线图标记为完成。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace/lock 与 Electron/App Server 版本统一为 `1.121.0`。
|
||||
- `npm run typecheck`:通过,Renderer 与 Node TypeScript 发布硬门禁无错误。
|
||||
- `npm run test:contracts`:通过;862 个协议类型生成失败 0/漂移 0,App Server client 292 checks,命令、Harness、多模态、脚本、Forge 发布流程与文档边界通过。
|
||||
- `npm run test:rust:changed -- --changed=origin/main`:版本/lock 触发后自动扩大为 `cargo test --lib --workspace`;首轮暴露 reasoning 指数重复和两个 Codex 导入性能失败,修复持久化二次 merge 及重复 delta 语义后重跑全 workspace 通过。
|
||||
- Rust 定向回归:`thread-store` 重复 reasoning delta/final 快照与空 completion 保留快照 1/1;App Server canonical reasoning 线性持久化、空 completion 保留物化内容及持久化恢复 3/3;Codex 1,200 命令同步导入与 40 turn 后台导入 2/2,分别约 4.0s 与 9.6s。
|
||||
- `npm run smoke:plugin-v2-current-electron-fixture`:通过,Gate B/runtime 覆盖 App Center 安装/启停、Claw mention、MCP tool/resource、Right Surface、reload、cold restart、卸载及历史恢复;summary=`.lime/qc/gui-evidence/plugin-v2-current-electron-fixture/plugin-v2-current-electron-fixture-summary.json`。
|
||||
- `npm run verify:gui-smoke`:通过,真实 Electron/preload/IPC/`app_server_handle_json_lines`/App Server current 链路、版本 `1.121.0`、reload、Workbench 与 Settings 正常;summary=`.lime/qc/project-gates/standalone-shell-01-20260805091101-56033/shell-01-electron-smoke/summary.json`。
|
||||
- `npm run i18n:check:json`:通过,5 个 locale、13 个 namespace、10,063 个源键,缺失/多余均为 0。
|
||||
- `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all -- --check`:通过。
|
||||
- `git diff --check`:通过。
|
||||
- GUI 构建只输出已知非阻断告警:`oem-runtime-config.js` 非 module script、Browserslist 数据过期与 Electron `console-message` API 废弃提示;本次未更新核心依赖。
|
||||
- 发布后 CI `30997182812` 首轮失败于 macOS `codesign --timestamp` 处理 `locale.pak`,错误为 `The timestamp service is not available.`;已修复非代码资源 timestamp 策略,并将该错误纳入 Forge package 重试分类。重跑 `31000622796` 暴露此前对全部嵌套文件关闭 timestamp 会导致 notarization 拒绝嵌套 Mach-O;现已仅对 `.pak`、`.bin`、`.dat`、`.asar` 资源关闭 timestamp,嵌套代码恢复安全 timestamp。
|
||||
- 发布后补充 Agent chat terminal session-detail refresh 迁移及 contract guard;Forge 配置、发布工作流、相关守卫与 Agent chat 定向测试均通过。
|
||||
|
||||
## 架构确认
|
||||
|
||||
- `internal/aiprompts/architecture.md` 已记录 Plugin v2 catalog、activation snapshot、MCP runtime/Right Surface 和历史恢复主链图。
|
||||
- 责任开发者确认:confirmed;Plugin v2 current 图与本次发布候选主链一致。
|
||||
|
||||
## 分类
|
||||
|
||||
- `current`:Plugin v2 App Server catalog/install/enabled owner、typed JSON-RPC gateway、activation snapshot、MCP runtime/resource 与 Right Surface current 投影。
|
||||
- `compat`:无新增;保留的旧 surface 只能委托 current owner。
|
||||
- `deprecated`:Plugin v1 manifest/parser/registry/worker/UI runtime 继续按 `plugin-v2-current-plan.md` 迁出,本次不恢复调用。
|
||||
- `dead / deleted / forbidden-to-restore`:无本轮新增删除;生产 mock fallback、Plugin worker 第二 runtime 与 renderer 旧 registry 不得回流 current 主链。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前发版完成度:100%。候选范围、发版文件、标准门禁、架构图确认、release commit、tag、`main`/tag 推送与远端复核均已完成。
|
||||
@@ -1,63 +0,0 @@
|
||||
# Lime v1.122.0 发布执行计划
|
||||
|
||||
状态:completed
|
||||
日期:2026-08-06
|
||||
目标版本:`1.122.0`
|
||||
目标 tag:`v1.122.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
以 `v1.121.0` 为基线,将当前工作树中的 Thread sections、App Server v2 协议与 canonical store、Agent chat/sidebar 投影、测试、schema、生成客户端和架构文档整理为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:候选盘点、发版 metadata、发布门禁、Git 发布收口与远端 Release workflow 均已完成。
|
||||
- 下一刀:无;后续由 `v1.122.0` 发布后的线上观察与下一版本执行计划承接。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.121.0`;目标 tag 当前不存在。
|
||||
- 初始盘点:138 个 tracked diff 文件、19 个未跟踪文件;tracked diff 为 4,966 行新增、1,077 行删除。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 release notes、本计划。
|
||||
- `candidate changes`:除 `.gitignore` 外的当前工作树全部产品、协议、schema、生成客户端、Rust runtime、GUI、五语资源、测试和文档改动。
|
||||
- `excluded changes`:`.gitignore` 新增的本地 `.gstack/` 忽略项;该本地环境改动已在上一版发布计划中明确排除,继续保留在未提交工作树。候选冻结并取得确认后出现的 Model Selector 并发改动也不进入本版:`InputbarModelExtra.tsx`、`src/components/input-kit/ModelSelector*.tsx` 与五语 `common.json`,共 8 个路径,原样保留在工作树。
|
||||
- 最终盘点:152 个 tracked diff 文件、38 个未跟踪文件;tracked diff 为 8,298 行新增、1,324 行删除。新增 schema 由 `write_schema_fixtures` 生成,包含 Plugin search 与 Thread sections current schema。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- 所有版本事实源统一为 `1.122.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、受影响 Rust 验证、`npm run verify:gui-smoke` 与 `git diff --check`。
|
||||
- 候选已修改 `internal/aiprompts/architecture.md`;release owner 需在 Git 高风险操作确认中确认架构图与 current 产品链一致。
|
||||
- Git 写操作(stage、commit、tag、push)须在门禁完成后按危险操作格式取得一次明确确认。
|
||||
- 完成 release commit、`v1.122.0` tag、`main` 与 tag 推送后,复核本地与远端引用,并保留 `.gitignore` 作为唯一排除项。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 均为 `1.122.0`。
|
||||
- `npm run typecheck`:通过;Renderer 与 Node TypeScript 检查通过。
|
||||
- `npm --prefix "packages/app-server-client" run build`:通过;修复 schema fixture 漂移后 package build 通过。
|
||||
- `npm run test:contracts`:通过;protocol types 889 个无漂移,App Server client 292 checks,命令/脚本/Forge release workflow、harness、modality、docs boundary 全绿。
|
||||
- `npm run test:rust:related -- "lime-rs/crates/app-server" "lime-rs/crates/app-server-protocol" "lime-rs/crates/thread-store" "lime-rs/crates/app-server-client"`:通过;相关 workspace 单元测试全部通过,其中 `agent-runtime` 192、`app-server` 1690、`app-server-client` 34、`app-server-protocol` 99,未发现失败。
|
||||
- `npm run verify:gui-smoke`:通过;真实 Electron/preload/IPC/App Server/GUI Gate B 通过,App Server protocol `appserver.v0` version `1.122.0`,summary=`.lime/qc/project-gates/standalone-shell-01-20260806121506-67837/shell-01-electron-smoke/summary.json`。
|
||||
- GUI 构建记录已知非阻断告警:`oem-runtime-config.js` module 属性、Browserslist 数据过期、Electron `console-message` API 弃用,以及本机 `install_name_tool` 重复 rpath;sidecar 已准备且 smoke result 为 pass。
|
||||
- `git diff --check`:通过;metadata、schema generated output 和当前候选无空白错误。
|
||||
|
||||
## 架构与治理确认
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI,以及 Thread sections 的 App Server/thread-store owner。
|
||||
- `compat`:无新增;旧入口只能委托 current owner。
|
||||
- `deprecated`:未新增。
|
||||
- `dead / deleted / forbidden-to-restore`:旧 pinned 双轨入口不回流;`.gitignore` 中 `.gstack/` 为本地环境排除项,不进入发布提交。
|
||||
|
||||
## Git 发布结果
|
||||
|
||||
- 已执行操作:除 `.gitignore` 与候选冻结后 8 个并发路径外,全部 189 个 candidate 路径已提交;release commit=`3060a969d588400139df7448331a1936fd0fd942`。
|
||||
- 本地与远端 `v1.122.0` tag 均指向 release commit;tag 为新建,不覆盖既有引用。`origin/main` 已包含 release commit。
|
||||
- 架构确认:本候选继续使用唯一产品链 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI`;Thread sections 归 App Server/thread-store current owner,无新增 compat/deprecated owner。release owner 已在危险操作确认中确认。
|
||||
- 暂存复核:189 个 candidate 路径已暂存;`.gitignore` 与上述 8 个候选冻结后并发改动保持未暂存。
|
||||
- GitHub Release:`https://github.com/limecloud/lime/releases/tag/v1.122.0` 已发布,非 draft、非 prerelease。
|
||||
- Release workflow:`31106261598` 全部成功;macOS arm64/x64、Windows x64 Electron 构建,Windows Squirrel installed-candidate smoke,GitHub Release 资产,Cloudflare R2 updater,以及 Windows/Linux/macOS arm64/x64 CLI 资产均完成。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前发版完成度:`100%`;候选范围、metadata、验证、GUI Gate B、release commit、tag、`main`/tag 推送、GitHub Release 与全平台远端资产发布均已完成。
|
||||
@@ -1,97 +0,0 @@
|
||||
# Lime v1.123.0 发布执行计划
|
||||
|
||||
状态:git-release-authorized
|
||||
日期:2026-08-07
|
||||
目标版本:`1.123.0`
|
||||
目标 tag:`v1.123.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
以 `v1.122.0` 为基线,将当前工作树中的 Hook lifecycle、Skills exact control plane、Plugin search、Apps
|
||||
catalog/readiness、Thread-scoped MCP resource/tool、模型目录恢复、App Server v2 canonical projection、GUI、测试、schema、
|
||||
生成客户端和架构文档整理为单一 release candidate,完成版本事实源、双语 release notes、发布门禁、
|
||||
release commit、tag、`main`/tag 推送与远端复核。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:release candidate、版本事实源、双语 release notes 与发布门禁均已收口,用户已明确确认 Git 高风险操作。
|
||||
- 下一刀:连续完成 stage、release commit、annotated tag、`main`/tag 推送、远端引用与 GitHub Release 工作流复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- 基线:`v1.122.0`;本地与远端 `v1.123.0` tag 均不存在;`main` 与 `origin/main` 起点一致。
|
||||
- 最终盘点:225 个进入候选的 unstaged tracked diff 文件、1 个既有 staged 文件、68 个未跟踪文件,
|
||||
加上唯一排除的 `.gitignore` 共 295 个状态路径;tracked working-tree diff 为 226 个文件、21,752 行新增、
|
||||
5,613 行删除。
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、
|
||||
`lime-rs/Cargo.lock`、双语 release notes、本计划,以及上一版已完成远端发布事实的
|
||||
`internal/exec-plans/release-v1.122.0-plan.md`。
|
||||
- `candidate changes`:除 `.gitignore` 外的当前工作树全部产品、协议、schema、生成客户端、Rust runtime、
|
||||
Electron、GUI、五语资源、测试、脚本和文档改动。
|
||||
- `excluded changes`:`.gitignore` 新增的本地 `.gstack/` 忽略项;该个人环境改动沿用 `v1.122.0` 的排除策略,
|
||||
不进入 release commit。
|
||||
|
||||
## 写集与退出条件
|
||||
|
||||
- Release owner 只修改版本事实源、双语 release notes 与本计划;其余 candidate 文件只读审计、验证和暂存。
|
||||
- 所有版本事实源统一为 `1.123.0`,release notes 只保留当前版本单页。
|
||||
- 必跑 `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、受影响 Rust related、
|
||||
`npm run smoke:agent-runtime-current-fixture`、`npm run smoke:hook-lifecycle-gate-b`、
|
||||
Provider generation PendingRoute Gate B、MCP current/Workspace Electron fixture、`npm run verify:gui-smoke`、
|
||||
`npm run governance:legacy-report`、`npm run governance:scripts` 与 `git diff --check`。
|
||||
- 候选修改 `internal/aiprompts/architecture.md` 且新增 Hook/Skills/MCP current protocol owner;release owner
|
||||
必须在 Git 高风险操作确认中确认架构图、owner 与 current 产品链一致。
|
||||
- Git 写操作(stage、commit、tag、push)须在门禁完成后按危险操作格式取得一次明确确认。
|
||||
|
||||
## 已知风险
|
||||
|
||||
- Provider generation + PendingRoute cold-restart 曾暴露持久化 AgentControl catalog route 在凭证暂不可用时进入
|
||||
reconciliation 并回退模型,同时 child route 仅写入内存/EventLog。当前候选已改为 schema-valid 持久化 route
|
||||
禁止自动 fallback,并在 child 可见前通过 `ProjectionStore::persist_session_metadata` 写入 canonical/projected
|
||||
metadata;专项 Gate B 与 owner 回归均已通过。
|
||||
- Windows packaged live Provider 与 Explorer Skill 安装目录仍需平台实机证据;当前 macOS Gate B 不能替代该平台
|
||||
结论。若其余 current 主链门禁通过,该项作为已知平台剩余风险进入发布说明,不冒充已验证。
|
||||
|
||||
## 架构与治理确认
|
||||
|
||||
- `current`:Hook discovery/trust/lifecycle、plural Skills catalog/config/extra roots、Plugin search、Thread-scoped
|
||||
MCP exact methods、App Server v2 canonical projection、模型目录刷新与持久化 AgentControl exact route 均走唯一产品链。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:无新增。
|
||||
- `dead / deleted / forbidden-to-restore`:singular `skill/list`、旧 MCP tool/resource wire、无 Thread 的 Settings
|
||||
tool call、旧 Electron Skills facade、production mock fallback、AgentControl catalog route 自动 fallback 与 Renderer
|
||||
`known_unprojected` Hook 路径。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 均为 `1.123.0`。
|
||||
- `npm run typecheck`:通过,Renderer 与 Node TypeScript 均无错误。
|
||||
- `npm run test:contracts`:通过;934 个生成协议类型无漂移,App Server client contract 292 项通过,
|
||||
Electron host command 91 项通过,mock priority command 为 0。
|
||||
- `npm run test:rust:related -- <6 paths>`:通过,App Server 相关测试 `1695/1695`;其中 session operations
|
||||
`15/15`、AgentControl restart `12/12`,覆盖 exact catalog route 禁止 fallback 与 canonical child route 持久化。
|
||||
- `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all -- --check` 与 `git diff --check`:通过。
|
||||
- Provider generation PendingRoute cold-restart Gate B:通过;证据
|
||||
`.lime/qc/provider-generation-pending-route-gate-b.json`,child Provider 请求恰好 1 次,mailbox Turn/Item
|
||||
各 1 个且终态,GUI 可见 child 结果,mock/invoke/console/page error 均为 0。
|
||||
- Hook lifecycle Gate B、MCP current fixture 与 Workspace MCP Electron fixture:通过,均经过真实 Electron、preload/IPC、
|
||||
App Server JSON-RPC、runtime/read model 与 GUI current bridge。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:修复后重跑通过;覆盖 history/cache、turn/approval、MCP、Skills、
|
||||
Workbench、媒体与文章工作区等真实 Electron fixture 场景,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:修复后通过;证据
|
||||
`.lime/qc/project-gates/standalone-shell-01-20260807150939-91976/shell-01-electron-smoke/summary.json`。
|
||||
- 前端定向测试 `168/168`、扩展 Rust related 25 crates、`npm run governance:legacy-report` 与
|
||||
`npm run governance:scripts`:通过;legacy 边界违规 0,scripts 冻结基线无漂移。
|
||||
- 未执行:Windows packaged live Provider / Explorer Skill 实机 Gate B;原因是当前环境为 macOS,保留为平台剩余风险。
|
||||
|
||||
## Git 发布结果
|
||||
|
||||
- 2026-08-07 已获得用户明确确认;授权范围为除 `.gitignore` 本地 `.gstack/` 规则外的完整 release candidate,
|
||||
release commit `Release v1.123.0`、annotated tag `v1.123.0`、`origin/main` 与 tag 推送。
|
||||
- 暂存复核:全部候选已进入 index,Git rename 检测后为 285 个 staged 文件、29,518 行新增、5,313 行删除;
|
||||
working tree 仅剩明确排除的 `.gitignore`,`git diff --cached --check` 通过。
|
||||
- commit、tag 与远端引用结果以本计划所在 release commit、Git tag 和远端 refs 为最终事实源。
|
||||
|
||||
## 完成度
|
||||
|
||||
- 当前发版完成度:`95%`;候选、全部本地发布门禁与高风险确认已完成,正在执行 Git 发布与远端工作流复核。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Lime v1.124.0 发布执行计划
|
||||
|
||||
状态:ready_for_release_confirmation
|
||||
日期:2026-08-08
|
||||
目标版本:`1.124.0`
|
||||
目标 tag:`v1.124.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 Lime 的公开定位更新为具备代码、文件、终端、工具、Skills、MCP、多模态和多 Agent 协作能力的全栈 AI Agent,类似 Claude Code、WorkBuddy、Codex 的 agent 工作方式,同时保留 README 现有图片;完成版本事实源、双语发布说明、发布门禁与 v1.124.0 发版收口。
|
||||
|
||||
## 写集与候选范围
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本执行计划。
|
||||
- `candidate changes`:根 `README.md`、`README.en.md`,以及当前工作树已有的产品、协议、运行时、GUI、测试、schema、脚本和文档改动。
|
||||
- `excluded changes`:在 Git 写操作前若发现无法归类的本地实验或环境文件,必须单独列出并取得确认;不得覆盖或回滚其他开发者改动。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 中文和英文 README 均完成全栈 AI Agent 定位迁移,现有图片引用全部保留。
|
||||
- 版本事实源统一为 `1.124.0`,双语 release notes 只保留当前版本单页。
|
||||
- 通过 `npm run verify:app-version`、`npm run typecheck`、`git diff --check`;按当前候选风险执行协议、GUI 和相关 smoke 门禁。
|
||||
- Git 写操作前完成 staged 范围复核,并按危险操作格式取得明确确认后再 commit、tag、push。
|
||||
|
||||
## 当前阶段与下一刀
|
||||
|
||||
- 当前阶段:README、版本事实源、release notes 和默认发版门禁已完成。
|
||||
- 下一刀:汇总 staged 候选范围并请求 Git 写操作确认;确认后连续完成 commit、tag、main/tag 推送和远端复核。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.124.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `git diff --check`:通过,README、release notes 与版本事实源无空白错误。
|
||||
- `npm run test:contracts`:通过,协议生成无漂移,App Server 301 项、命令/脚本/多模态/电子发布/文档边界通过。
|
||||
- `npm run verify:gui-smoke`:通过,真实 Electron/preload/IPC/App Server 链路与版本 `1.124.0` 通过;summary=`.lime/qc/project-gates/standalone-shell-01-20260808112235-17473/shell-01-electron-smoke/summary.json`。
|
||||
- 已知非阻断告警:Vite 的 `oem-runtime-config.js` module 提示、Browserslist 数据过期、Electron `console-message` API 弃用提示,以及 Rust 未使用代码 warning。
|
||||
@@ -1,241 +0,0 @@
|
||||
# Lime v1.125.0 发布执行计划
|
||||
|
||||
状态:release-published-at-4ee8d3577 / warning-fix-local-validated / retag-confirmation-pending / windows-runner-pending
|
||||
日期:2026-08-11
|
||||
目标版本:`1.125.0`
|
||||
目标 tag:`v1.125.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
将 `v1.125.0` 收敛到完整且通过 Windows 实机门禁的 release candidate,发布 Agent runtime、App Server/protocol、Plugin v3、GUI、文档与质量治理改动;已发布 tag 如需重定位,必须先完成新候选验证并取得单独危险操作确认。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:根 `package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪改动,包括 Agent runtime、App Server/protocol、Plugin v3、Electron/GUI、测试、治理和文档。
|
||||
- `excluded changes`:无;用户已明确确认当前工作树整体纳入。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根 `README.md` 为英文 canonical 入口,英文页面无二维码,中文页面保留二维码。
|
||||
- 版本事实源与双语 release notes 统一到 `1.125.0`,不覆盖 `v1.124.0`。
|
||||
- 通过版本一致性、typecheck、docs boundary、contracts、GUI smoke 或明确记录环境限制。
|
||||
- 完成 release commit、`v1.125.0` tag、`main`/tag 推送和远端复核。
|
||||
- 针对发布 commit SHA 触发 `.github/workflows/build-windows-test.yml`,轮询 Windows runner 直至完成并保存 artifact 结果。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,所有版本事实源为 `1.125.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- Guardian projection Vitest:`54/54` 通过。
|
||||
- `npm run test:contracts`:通过。
|
||||
- `npm run docs:boundary`:通过。
|
||||
- `npm run governance:legacy-report`:通过,零引用候选、分类漂移、边界违规均为 `0`。
|
||||
- `npm run governance:scripts`:通过。
|
||||
- `npm run governance:electron-release-workflow`:通过。
|
||||
- `npm run verify:gui-smoke`:通过;Electron evidence `standalone-shell-01-20260809113946-74365`,App Server `1.125.0`。
|
||||
- `npm run test:rust:related -- lime-rs/crates/app-server lime-rs/crates/mcp lime-rs/crates/skills lime-rs/crates/runtime-core lime-rs/crates/tool-runtime`:通过,`311 passed; 0 failed`。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过,覆盖当前 Agent runtime 全部 fixture;报告 `liveProviderUsed=false`。
|
||||
- `git diff --check`:通过。
|
||||
- Release commit:`8647d18fa`(`Release v1.125.0`);evidence commit:`f55a35b49`(`Record Windows release runner result`)。`main` 与 `v1.125.0` 均已推送并完成远端复核。
|
||||
- Windows runner 首次 run `31311967541`:失败于 `actions/checkout`,原因是 `source_ref` 使用短 SHA `8647d18fa`,workflow checkout 无法解析该引用;未进入构建。
|
||||
- Windows runner 重试 run `31312029636`:Checkout、pnpm/Node/Rust/sccache、依赖安装均通过;`lime-mcp` Agent Plugin path contract 为 `10 passed / 3 failed`,失败集中在 Windows 扩展路径前缀与 8.3 短路径的字面断言(`agent_plugin_config_tests.rs`),未进入 sherpa、Electron、Squirrel smoke 或 Plugin Gate B,因此无 Windows 包 artifact。
|
||||
- Windows runner 结论:发布提交已被真实 Windows runner 检出,但 Windows path contract 门禁阻断;不改写已推送的 `v1.125.0` tag。
|
||||
|
||||
## Windows 门禁修复
|
||||
|
||||
状态:fix-validated-locally
|
||||
|
||||
- 根因一:`build-windows-test` 直接把短 commit SHA 交给 `actions/checkout`,与输入声明的 commit SHA 能力不一致。
|
||||
- 根因二:Windows MCP path contract 将同一文件系统路径的普通路径、extended-length 路径和 8.3 alias 做字面比较。
|
||||
- 根因三:`guardianWarning` 已进入 generated notification union,但漏出 `AgentRuntimeSignalNotification`,导致 release/Quality 的 typecheck、GUI smoke 和三平台 Electron build 同源失败;该一行修复已由当前并发写集提供,本轮不覆盖。
|
||||
- 窄写集:`.github/workflows/build-windows-test.yml`、`lime-rs/crates/mcp/src/agent_plugin_config{,_tests}.rs`、`scripts/electron/windows-squirrel-rc-smoke.test.mjs`、本计划。
|
||||
- 退出条件:短 SHA 先解析为完整 commit SHA;Windows 断言按文件身份/Path component 比较;MCP 定向测试、workflow contract、typecheck 通过,并在真实 Windows runner 复核。
|
||||
- 本地验证:MCP `8/8`、Windows workflow contract `16/16`、`npm run typecheck`、`npm run test:contracts`、`npm run governance:electron-release-workflow`、app-server-client 定向 `100/100`、`npm run verify:gui-smoke` 均通过;GUI evidence `standalone-shell-01-20260809135003-43144`。
|
||||
- `npm run test:related -- packages/app-server-client/src/agent-runtime.ts`:入口在 Electron 目录解析时触发既有 `EISDIR`,未作为通过证据;改用直接 app-server-client 测试文件运行并通过。
|
||||
- 真实 Windows runner:待提交并推送修复后复核。
|
||||
|
||||
## Windows runner 复核
|
||||
|
||||
- 修复提交 `b696976f3` 已推送到 `main`,但 runner `31317378340` 在编译 `lime-mcp` 测试时失败。
|
||||
- 失败原因:Windows `std::os::windows::fs::MetadataExt::volume_serial_number` 与 `file_index` 仍依赖未稳定的 `windows_by_handle`,不能用于当前稳定 Rust toolchain。
|
||||
- 修复方式:测试 helper 改用稳定标准库 `std::fs::canonicalize`,去除 extended-length 前缀后按 Windows 大小写不敏感比较;不引入生产依赖。
|
||||
- runner `31317378340` 已确认 checkout、依赖安装成功,但未进入 sherpa、Squirrel、Gate B;需追加提交并重新触发 Windows runner。
|
||||
|
||||
## Windows packaged smoke 修复
|
||||
|
||||
- runner `31317797587`:path contract、sherpa runtime、Electron Squirrel package build 与 N-1 installer download 均通过;installed Squirrel smoke 在 app-server sidecar 首次启动时报 `thread 'main' has overflowed its stack`(退出码 `3221225725`),未进入 Plugin Gate B。
|
||||
- 修复方式:Windows `app-server` 入口在 8 MiB 显式栈线程中启动 Tokio main;macOS/Linux 保持原入口。
|
||||
- 本地验证:默认 target `cargo check -p app-server --bin app-server` 通过;Windows target 交叉 check 受本机缺少 MSVC C 头文件阻塞(`ring` 构建找不到 `assert.h`),需由 Windows runner 复核。
|
||||
|
||||
- runner `31318811255`:Windows path contract、sherpa runtime、Electron Windows package、N-1 installer download 与 Squirrel smoke 均通过;Plugin Gate B 在等待 MCP elicitation 表单 90 秒后超时。MCP server 已 initialize,但 ledger 没有 `tool_call`,启用插件后的 provider 请求数为 `0`,因此未产生用户可见的 `mcp_elicitation` pending interaction。
|
||||
- 根因定位:入口线程栈修复已生效,但 Tokio worker 仍使用默认栈;App Server 的深层 agent/plugin 调用在 worker 上仍可能溢出或提前终止,导致 Gate B 没有进入 elicitation。
|
||||
- 下一项修复:显式构造 Tokio multi-thread runtime,并在 Windows 将 worker stack 同样设置为 8 MiB;非 Windows 保持默认 worker stack 行为。
|
||||
|
||||
## Windows packaged Gate B 复核
|
||||
|
||||
- runner `31343997706` 使用 `dd97f79e6eb0a9fa2428416658fccefb13d03906`;Plugin 安装、启停边界、标准 manifest/mcp.json/Skill、MCP initialize capability 与 packaged Electron 均通过,但 `turn/start` 后 provider request 为 `0`,仅留下 MCP initialize,Gate B 超时。
|
||||
- macOS packaged follow-up 使用同一当前工作树资源完成完整 Plugin Gate B,证明 packaged sidecar 资源解析和通用 Plugin/MCP runtime 主链可用;剩余问题限定为 Windows packaged turn execution 诊断。
|
||||
- Gate B failure path 已补只读诊断,失败时保存 `thread/read`、`log/list`、`log/persistedTail`、`diagnostics/server/read`、renderer invoke trace、provider request 与 MCP ledger,供下一次 Windows runner 定位 turn 终态/错误;不改变通过条件。
|
||||
- runner `31345998150` 使用完整 SHA `c228ffde93f14000d7ee6daa99113c96164a0a7a`;Checkout、插件路径契约、sherpa runtime、Electron Windows 包、N-1 Squirrel 下载与安装 smoke 均通过,Plugin Gate B 仍在 `submit-renderer-form` 等待 90 秒后失败。失败诊断确认 enabled turn 已 `completed/idle`、provider request 为 `0`、MCP ledger 仅有 runtime `initialize`,且失败截图显示 disabled boundary 文本;尚未取得结构化 turn/item 错误字段。
|
||||
- 为下一轮 Windows runner 增加安全的 `thread/read` turn/item 状态摘要与 localhost provider connection diagnostics;本地 Plugin Gate B 已通过。下一步用该证据确认是 runtime turn 终态错误、Plugin snapshot/Skill 解析,还是 renderer session 投影漂移,再实施窄产品修复。
|
||||
|
||||
## Windows target session 投影修复
|
||||
|
||||
状态:`fix-validated-locally / retag-confirmation-pending / windows-runner-pending`
|
||||
|
||||
- runner `31347609969` 使用完整 SHA `22a96e5e1df9b771120ba6ea26ab7f562d5eafcd`;Windows path contract、sherpa runtime、Electron Windows package、N-1 Squirrel 安装 smoke 均通过,Plugin Gate B 仍在等待 `mcp_elicitation` 90 秒后失败。
|
||||
- 失败证据确认 enabled canonical turn 已 `completed`、thread 已 `idle`,items 只有 user message 与空 agent message;enabled provider 只有 `/v1/models`,没有 `/v1/chat/completions`,而 disabled boundary provider 收到后续请求。失败截图标题已进入 enabled 会话,但正文仍显示 disabled boundary 结果,证明 renderer 的目标 session 与提交 thread 发生漂移。
|
||||
- 根因:显式 `targetSessionId` 发送链完成 `ensureSession(target)` 后,canonical thread lookup 仍读取全局 `threadReadRef`。Windows 慢时序下该 ref 可能仍绑定旧会话,导致 enabled 请求提交到 disabled boundary thread/provider。
|
||||
- 修复:`useAgentSession` 按 session 记录 canonical `thread_id`;显式目标提交只允许按目标 session 查询,映射缺失时刷新该目标的 read model,禁止回退旧会话 thread;同步收紧 prepared send / stream 类型契约并补时序回归测试。
|
||||
- 窄写集:`src/components/agent/chat/hooks/useAgentSession.ts`、`agentStreamSubmitExecution.ts`、`agentStreamPreparedSendEnv.ts`、`useAgentStream.ts`、`agentStreamSubmitExecution.test.ts` 与本计划。上述部分文件同时含并发工作树改动,提交前必须重新确认 release candidate 范围。
|
||||
- 本地验证:相关 Vitest `10/10` 通过;`npm run typecheck` 通过;`npm run smoke:plugin-package-electron-gate-b -- --timeout-ms 180000 --keep-temp` 通过,enabled provider request `2`、MCP elicitation accepted、provider final text observed、production mock fallback `0`。
|
||||
- 下一步:提交并推送完整依赖闭包后,以新完整 SHA 重触发 `build-windows-test.yml`,持续跟踪到 Plugin Gate B 与 artifact 结论;不移动已发布的 `v1.125.0` tag。
|
||||
|
||||
## Windows provider selection sync 修复
|
||||
|
||||
状态:`fix-validated-locally / windows-runner-pending`
|
||||
|
||||
- runner `31352212702` 使用 `a5aae4e45bfd8b4e7379b0ba19c6a2af67080d01`;Windows path contract、sherpa runtime、Electron Windows 包、N-1 Squirrel 安装 smoke 均通过,Gate B 在 `mcp_elicitation` 等待 90 秒后失败。
|
||||
- 失败证据显示 enabled thread 的公开 `modelProvider` 已是 enabled provider,但 durable `extra.providerSelector/providerName` 仍为 disabled provider;enabled 只收到 `/v1/models`,后续 `/v1/chat/completions` 仍进入 disabled provider。
|
||||
- 根因:模型选择通过 microtask 异步执行 `thread/settings/update`,发送链只等待 UI 选择器状态,未等待目标 session 的 durable provider/model selection 写入完成;Windows 慢时序下 `turn/start` 先读取旧 route。
|
||||
- 修复:`useAgentContext` 为每个 session 建立 selection-sync Promise 并暴露等待函数;`agentStreamSend` 在 prepare 前等待当前/目标 session,`useAgentStream` 将该能力注入真实 prepared send env;补 hook/send 时序回归。
|
||||
- 本地验证:相关 Vitest `41/41`、改动文件 ESLint 通过;本地 macOS packaged Electron Gate B 通过,`ok=true`、`providerRequestCount=2`、MCP elicitation 已提交、provider final text 已观察、`productionMockFallbackHitCount=0`;Gate B evidence `plugin-package-electron-gate-b-20260810120829`(实际目录以本机生成结果为准)。
|
||||
- 全量 `npx tsc --noEmit` 仍被工作树既有测试/协议类型错误阻断;过滤本轮文件未发现等待修复引入的新错误。Windows packaged Gate B 待新完整 commit 推送后复核。
|
||||
|
||||
## 当前发布候选复核
|
||||
|
||||
- `npm run typecheck`:通过(renderer 与 node 两个 tsconfig 均通过)。
|
||||
- `npm run verify:app-version`:通过,版本事实源仍统一为 `1.125.0`。
|
||||
- provider selection sync 窄写集 Vitest:7 个文件、`29 passed; 0 failed`。
|
||||
- provider selection sync 窄写集 ESLint:通过,`--max-warnings 0`。
|
||||
- `npm run test:contracts`:通过;protocol 生成无漂移、App Server client `301 checks`、命令/harness/modality/scripts/electron release/docs 边界均通过。
|
||||
- 当前状态:`fix-validated-locally / release-git-confirmation-pending / windows-runner-pending`。
|
||||
- 下一刀:获得危险操作确认后,将当前工作树全部纳入一个完整 release commit,创建并推送新的提交;由于 `v1.125.0` 已存在且不能覆盖,Windows workflow 使用该新完整 SHA 触发,继续跟踪 Plugin Gate B 与 artifact。
|
||||
|
||||
## Windows runner `31357775139`
|
||||
|
||||
- 使用完整 SHA `bc2d2aacc897deee60fd50c6479ff2c2aa483a15`,checkout、环境初始化和依赖安装通过。
|
||||
- 在 Windows Agent Plugin path contract 编译阶段失败,错误为 `windows.rs` 的 `mod windows_acl` / `mod windows_attr` 找不到 sibling 文件;未进入 sherpa、Electron、Squirrel 或 Plugin Gate B。
|
||||
- 根因:Rust 在内联模块文件 `execution_process/windows.rs` 中按默认规则寻找 `execution_process/windows/<module>.rs`,而两个模块文件位于 `execution_process/` 同级;macOS/Linux 的 cfg 未编译该路径,故本地未暴露。
|
||||
- 修复:为两个声明增加显式 `#[path = "windows_acl.rs"]` 与 `#[path = "windows_attr.rs"]`;host 侧 tool-runtime related 测试通过,Windows 源文件 rustfmt 通过。本机 Windows target 交叉 check 仍受缺少 MSVC C 头文件阻断,待下一次 Windows runner 验证。
|
||||
- 下一步:推送修复提交后重新触发 workflow,继续追踪到 Gate B 和 artifact。
|
||||
|
||||
## Windows runner `31358312342`
|
||||
|
||||
- 使用完整 SHA `05cd3e2b3c4d9a1a099732308bb0403423c90dd3`;checkout、Windows Agent Plugin path contract、sherpa runtime、Electron Windows x64 Squirrel package、N-1 installer download 与 Squirrel smoke 前置均通过。
|
||||
- Plugin Gate B 在等待 `[data-testid="pending-interaction-layer"][data-interaction-kind="mcp_elicitation"]` 90 秒后失败;失败 artifact 已保存到本机临时目录,包含 summary/raw JSON、failure/install-review/plugin-mention 截图。
|
||||
- 失败证据:enabled session `019fea2c-3d0a-7ad1-816f-f3ad959465b5` 的顶层 `thread.modelProvider` 已是新 provider,但 `thread.extra.providerName/providerSelector` 仍是旧 disabled provider;enabled provider 只收到 `GET /v1/models`,后续 `/v1/chat/completions` 进入旧 provider;MCP ledger 只有 `initialize`,enabled turn 最终为 `completed/idle`,没有 elicitation pending interaction。
|
||||
- 根因:hydration 时 `useAgentSession.finalizeResolvedTopicDetail` 根据旧 session storage preference 延迟排队 metadata fallback;随后 Renderer 的 provider/model selection 虽通过 `useAgentContext` 写入新 route,但没有取消该 fallback,延迟 `thread/settings/update` 覆盖了 durable metadata。
|
||||
- 修复:`useAgentChat` 共享 pending metadata cancel ref;`useAgentContext` 在用户 provider/model/reasoning selection 前取消旧 hydration fallback;`sessionMetadataSyncScheduler` 对包装任务增加取消标记,确保已进入 scheduler 队列的取消任务不再发起 RPC;补 context 与 scheduler 回归测试。
|
||||
- 本地验证:`npm run typecheck` 通过;metadata controller/scheduler/context Vitest `30 passed; 0 failed`;本轮 ESLint `--max-warnings 0` 通过。
|
||||
- 本机 packaged Plugin Gate B 复跑通过:evidence `plugin-package-electron-gate-b-summary.json`,`ok=true`、`providerRequestCount=2`、MCP elicitation accepted、provider final text observed、`productionMockFallbackHitCount=0`。
|
||||
- 下一步:确认本轮 release candidate 后提交并推送完整 SHA,重新触发 `.github/workflows/build-windows-test.yml`,继续跟踪 Plugin Gate B 与 artifact;不移动已发布的 `v1.125.0` tag。
|
||||
|
||||
## Windows runner `31372663997`
|
||||
|
||||
- 使用完整 SHA `fb465072fbe14551aeadee530bf36c9c165a06c4`;Windows path contract、sherpa runtime、Electron Windows x64 Squirrel package、N-1 installer download 与 installed Squirrel smoke 全部通过,仍仅失败于 Plugin Gate B 等待 `mcp_elicitation` 90 秒超时。
|
||||
- enabled provider 仍只有 `GET /v1/models`,disabled provider 收到后续 `/v1/chat/completions`;MCP ledger 只有 `initialize`。失败时 `thread.modelProvider` 保持 enabled provider,但 `thread.extra.providerSelector/providerName` 已回到 disabled provider。
|
||||
- 新证据修正竞态顺序:Renderer provider selection 先于 hydration fallback 排队,因此 selection 时还没有可取消句柄;`finalizeResolvedTopicDetail` 随后因为 canonical `AgentSessionDetail` 缺少 `execution_runtime`,把 current thread 错判为“缺少 runtime route”,再次从旧 session storage 生成 provider fallback。
|
||||
- 根因 owner:`readCanonicalThreadDetail` 已读取 current `Thread.modelProvider` 与 `Thread.extra.modelName`,但未投影 `AgentSessionDetail.execution_runtime`,使 hook 层失去 current route 事实源。
|
||||
- 修复:canonical Thread projection 从顶层 `modelProvider`(优先于可能 stale 的 extra provider)和 metadata `modelName` 构造 session execution runtime;保留 imported source markers;补顶层 current provider 覆盖 stale extra provider 的回归测试。
|
||||
- 本地验证:canonical projection/App Server session client/metadata controller Vitest `48 passed; 0 failed`;`npm run typecheck` 与 projection ESLint `--max-warnings 0` 通过;本机 packaged Plugin Gate B 复跑 `ok=true`、enabled provider request `2`、MCP elicitation/final text 完成、production mock fallback `0`。Windows packaged Gate B 待新完整 SHA 复核。
|
||||
|
||||
## Windows runner `31378335257`
|
||||
|
||||
状态:`navigation-fix-validated-locally / windows-runner-pending`
|
||||
|
||||
- 使用完整 SHA `88b5bf6a74dd8d911d71e46b1418c0f1dea1210c`;Windows path contract、sherpa runtime、Electron Windows x64 Squirrel package、N-1 installer download 与 installed Squirrel smoke 全部通过。
|
||||
- Plugin Gate B 尚未进入安装、provider route 或 turn,在 `open-plugin-catalog-app-center` 等待 bundled Browser Plugin 卡片 600 秒超时。失败截图显示最终页面回到新建任务首页;原脚本此前已观察到插件页安装入口,证明一次侧边栏导航在 Windows packaged 启动尾部时序中被覆盖,而不是 `plugin/list` 或 canonical execution runtime 失败。
|
||||
- `fb465072f..88b5bf6a7` 没有侧边栏、App Navigation、App Center 或 Gate B 脚本改动;本轮不把该平台时序误归因到 canonical route 修复。
|
||||
- 修复:Plugin Gate B 继续只走真实侧边栏点击,但要求插件页安装入口、loading terminal 与 bundled Browser Plugin 卡片在同一次短窗口内共同收敛;Windows 启动尾部导航覆盖时最多重试 3 次,每次上限 30 秒,不再用全局 600 秒盲等。最终失败会附带 URL、active sidebar、可见 testid 与主内容摘要。
|
||||
- 本地验证:脚本 `node --check`、定向 ESLint、Plugin Gate B guard 通过;本机 packaged Plugin Gate B 完整通过,`ok=true`、App Center 安装/启停与 disabled boundary 通过、provider request `2`、MCP elicitation accepted、provider final text observed、cold restore/卸载后历史通过、production mock fallback `0`。
|
||||
- 本轮补充验证:`npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、`npm run test:rust:related -- lime-rs/crates/app-server-protocol lime-rs/crates/app-server`、`cargo test --manifest-path lime-rs/Cargo.toml -p app-server --test fuzzy_file_search_jsonrpc`、`cargo fmt --all -- --check`、`npm run verify:gui-smoke` 均通过;GUI evidence `standalone-shell-01-20260810111610-3054`。
|
||||
- 当前 release candidate 继续纳入完整工作树,包括同期 fuzzy file search App Server v2 协议、schema、processor、公共 JSON-RPC 集成测试与协调计划;`v1.125.0` tag 保持指向既有 release commit,不移动或覆盖。
|
||||
- 下一步:完成当前整批 Rust/protocol/contracts/typecheck/版本门禁后提交并推送新完整 SHA,重新触发 `build-windows-test.yml` 并跟踪 installed Plugin Gate B 与 artifact 最终结论。
|
||||
|
||||
## Release candidate 当前收口
|
||||
|
||||
- 全部 tracked/untracked 改动均纳入,无排除项;新增 fuzzy file search 使用 Codex current 一发式 `fuzzyFileSearch` 协议和 snake_case 结果字段,未恢复已排除的 sessionStart/sessionUpdate/sessionStop 双轨。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过,协议生成无漂移、App Server client `301 checks`、脚本治理、Electron release workflow 与 docs boundary 均通过。
|
||||
- `npm run verify:app-version`:通过,版本事实源统一为 `1.125.0`。
|
||||
- Composer/fuzzy file mention Vitest:`32 passed; 0 failed`;App Server client fuzzy Vitest:`2 passed; 0 failed`;Gate B 脚本契约 Vitest:`5 passed; 0 failed`。
|
||||
- `cargo test --manifest-path lime-rs/Cargo.toml -p app-server --test fuzzy_file_search_jsonrpc`:`1 passed; 0 failed`。
|
||||
- `cargo fmt --manifest-path lime-rs/Cargo.toml --all -- --check`、定向 ESLint、`git diff --check`:通过。
|
||||
- `npm run verify:gui-smoke`:通过;最新 Electron evidence `standalone-shell-01-20260810112853-16763`,App Server `1.125.0`。
|
||||
- 本机 packaged Plugin Gate B 既有证据保持通过:`ok=true`、provider request `2`、MCP elicitation accepted、provider final text、cold restore/卸载历史和 `productionMockFallbackHitCount=0`。
|
||||
- 当前阻塞只剩危险 Git 写操作确认,以及新完整 SHA 推送后的 Windows runner Plugin Gate B/artifact 复核;既有 `v1.125.0` tag 固定在 `8647d18fa358e3a9c86e520348d39e4b3eba6041`。
|
||||
|
||||
## Windows runner `31384560366`
|
||||
|
||||
状态:`fix-validated-locally / windows-runner-pending`
|
||||
|
||||
- 使用完整 SHA `668699a4d29a4302e7db46aaab58644f2e46b61a`;Windows Plugin path contract、sherpa runtime、Electron Windows x64 Squirrel package、N-1 installer 下载与 installed Squirrel smoke 全部通过。
|
||||
- Plugin Gate B 已通过 App Center 安装/启停、禁用边界、provider 两次请求、MCP elicitation、最终文本与 canonical MCP App item 投影;唯一失败是首次显式恢复后等待固定累计 `2` 次 resource read/HTML load。
|
||||
- 失败 evidence 同时证明 WebContents marker 已加载且 MCP ledger 已有 `1` 次 `resource_read`。脚本在 reload 前没有等待隐式首次挂载,Windows 上 reload 抢先后只有一次有效加载;随后 60 秒等待使 240 条 invoke trace ring buffer 被 drain 记录覆盖,最终诊断误显示计数为 `0`。
|
||||
- 修复:首次显式恢复只要求至少一组 resource read/HTML load 且一一对应;下一次 Renderer reload 按已观察基线要求各精确增加一次;cold restore 继续要求独立进程增加一次。最终有效最小计数从依赖隐式竞态的 `4` 收敛为确定性的 `3`,不放宽任何真实产品边界。
|
||||
- 本地验证:Gate B 脚本 Vitest `8 passed; 0 failed`、定向 ESLint、Node 语法检查、`npm run typecheck`、`npm run test:contracts`、`npm run verify:app-version` 全部通过。本机真实 Electron Plugin Gate B `ok=true`,resource read/HTML load `4/4`、launch `2`、provider request `2`、reload/cold restore/卸载历史全部通过、`productionMockFallbackHitCount=0`、`missingRequiredMethods=[]`。
|
||||
- 下一步:通过 Gate B 脚本单测、定向 ESLint、contracts 与本机 packaged Gate B 后,提交/推送窄修复并以新完整 SHA 重跑 Windows runner;`v1.125.0` tag 不移动。
|
||||
|
||||
## Windows runner `31393287417`
|
||||
|
||||
状态:`uninstall-runtime-lifecycle-fix-in-progress`
|
||||
|
||||
- 使用完整 SHA `d0fc751d6b80fade928c0941ebfff516e4b97578`;Windows path contract、sherpa runtime、Electron Windows x64 Squirrel package、N-1 installer download、installed Squirrel smoke、Plugin MCP App 首次 surface、reload 与 cold restore 均已通过。
|
||||
- Gate B 最终失败在 App Center 卸载:确认按钮已点击,但产品返回 `The process cannot access the file because it is being used by another process. (os error 32)`;`plugin/uninstall` 未成功完成,确认框按错误恢复语义保持可见。
|
||||
- 根因:Lime 的 Plugin catalog 变更只更新磁盘与 installed record,没有像 Codex `invalidate_mcp_runtimes()` 一样失效当前 MCP runtimes。Windows stdio MCP 子进程以 Plugin package 为 cwd,卸载直接删除 package 时目录仍被占用。
|
||||
- 修复:复用 `AgentRuntimeState::clear_mcp_runtimes()` 作为唯一进程生命周期 owner;安装先失效旧 runtime 再替换 package,卸载在删除 package 前等待 runtime 关闭,启停在状态写入成功后失效旧 runtime,避免旧 Plugin MCP 配置继续运行。
|
||||
- 窄写集:`lime-rs/crates/app-server/src/runtime.rs`、`runtime_backend/execution_backend.rs`、`runtime/plugins.rs`、`runtime/tests/plugins.rs`、`runtime/tests.rs` 与本计划;不触碰并发架构/refactor 文档和 projection guard 改动。
|
||||
- 退出条件:App Server 定向 Rust 回归证明 `invalidate -> uninstall` 顺序;contracts、版本、Gate B 脚本守卫及本机真实 Electron Plugin Gate B 通过;随后以新完整 SHA 重跑 Windows runner,且不移动 `v1.125.0` tag。
|
||||
- 本地验证:`cargo test --manifest-path lime-rs/Cargo.toml -p app-server plugin_uninstall_invalidates_mcp_runtimes_before_removing_package` 通过;`npm run test:rust:related -- lime-rs/crates/app-server/src/runtime.rs lime-rs/crates/app-server/src/runtime/plugins.rs lime-rs/crates/app-server/src/runtime_backend/execution_backend.rs lime-rs/crates/app-server/src/runtime/tests/plugins.rs` 通过,`app-server` lib `1642 passed / 0 failed`;`cargo fmt --all -- --check` 与 `git diff --check` 通过。
|
||||
- `npm run typecheck`、`npm run test:contracts`、`npm run verify:app-version`、`npm run verify:gui-smoke` 均通过。真实 macOS packaged Plugin Gate B 通过:`ok=true`、卸载/installed projection/history recovery 全部通过、MCP App resource/HTML `4/4`、provider request `2`、`productionMockFallbackHitCount=0`、`missingRequiredMethods=[]`。
|
||||
- 当前状态:`fix-validated-locally / release-git-confirmation-pending / windows-runner-pending`;下一步获得危险 Git 写操作确认后提交并推送窄修复,以新完整 SHA 重跑 Windows runner,不移动已发布 `v1.125.0` tag。
|
||||
|
||||
## Windows runner `31422354829`
|
||||
|
||||
状态:`failed / superseded-by-31444743300`
|
||||
|
||||
- 使用完整 SHA `cd5bc4eae8211a2f4bdc1a7843b310618df18dc4`;Windows Plugin path contract、sherpa runtime、Electron Windows x64 Squirrel package、N-1 installer download 与 installed Squirrel smoke 全部通过。上一轮 `os error 32` 未复现,但 Gate B 在 reload 后的 session hydration 阶段失败,尚未执行到卸载。
|
||||
- 失败 evidence 已证明首次 MCP App surface、`mcpServer/resource/read`、HTML load、reload 后 canonical MCP item/plugin/resource URI 均正确;直接错误是 `thread/items/list` 经 `app_server_handle_json_lines` 在 5000ms 内未返回,Renderer fail closed 后主内容与 App surface 消失。
|
||||
- 根因:`commandPolicy.ts` 用手工 `APP_SERVER_CURRENT_METHODS` 同步 JSON-RPC method,漏掉 `thread/items/list` 与 `thread/turns/list`,导致新 read method 退回普通 truth 命令的 5 秒超时。该集合是 App Server protocol 之外的重复事实源。
|
||||
- 修复:保留 `turn/start`、conversation import、startup、knowledge compile、long-running 与 provider network 专项 profile;专项匹配后,所有 `app_server_handle_json_lines` 统一使用 `app-server-read` 的 30 秒窗口。删除手工 current method catalog 及判断 helper;method 合法性继续由 App Server protocol/handler fail closed,不由 bridge timeout policy 承担。
|
||||
- 窄写集:`src/lib/dev-bridge/commandPolicy.ts`、`src/lib/dev-bridge/commandPolicy.test.ts` 与本计划;不触碰并发架构、命令文档、projection drift 和治理 fixture 改动。
|
||||
- 本地验证:commandPolicy Vitest `11 passed / 0 failed`;定向 ESLint、`npm run typecheck`、`npm run test:contracts`、`npm run verify:app-version`、`npm run verify:gui-smoke` 与 `git diff --check` 均通过。GUI evidence:`standalone-shell-01-20260810194309-62252`。
|
||||
- 本机真实 packaged Plugin Gate B 通过:summary `ok=true`、provider request `2`、provider final text、MCP App 首次/reload/cold restore、App Center 卸载、installed projection 清理、卸载后历史恢复全部通过,`productionMockFallbackHitCount=0`、`missingRequiredMethods=[]`。
|
||||
|
||||
## Windows runner `31444743300`
|
||||
|
||||
状态:`complete / windows-gate-b-verified`
|
||||
|
||||
- 修复提交 `8738c8a623a763c50267d208facb4667ca9736c6` 已推送到 `origin/main`。Windows runner [`31444743300`](https://github.com/limecloud/lime/actions/runs/31444743300) 与 Job `93636406363` 均为 `success`;Windows path contract、sherpa runtime、Electron x64 Squirrel 构建、N-1 installer 下载、真实安装/升级 smoke 和 installed Plugin Gate B 全部通过。
|
||||
- Windows Gate B Artifact `9084355493`(`lime-windows-agent-plugin-gate-b-evidence`)已下载并审计:`ok=true`、`appVersion=1.125.0`、`platform=win32`、`arch=x64`、packaged/preload/App Server JSONL 真链成立、provider request `2`、MCP ledger accepted、reload/cold restore 通过、resource read/HTML load `3/3`、Electron launch `2`、卸载/installed projection 清理/历史恢复全部通过;卸载后没有重启 MCP runtime、重跑 provider 或 tool,`productionMockFallbackHitCount=0`、`missingRequiredMethods=[]`、`legacyMcpCommandsSeen=[]`、`consoleErrors=[]`。
|
||||
- 退出条件已满足。Windows runner 检出的产品修复 SHA 为 `8738c8a623a763c50267d208facb4667ca9736c6`;本地与远端 `v1.125.0` tag 均继续固定在 `8647d18fa358e3a9c86e520348d39e4b3eba6041`,未移动或覆盖。
|
||||
|
||||
## 标准 Release run `31449908543`
|
||||
|
||||
状态:`complete / published-at-4ee8d3577`
|
||||
|
||||
- 用户确认后,本地与远端 `v1.125.0` tag 以及 GitHub Release target 已重定位到 `4ee8d3577e3d30df3a310450aca01320139a28d1`。
|
||||
- 标准 Release run [`31449908543`](https://github.com/limecloud/lime/actions/runs/31449908543) 全部成功:macOS arm64/x64、Windows x64 Electron 构建,Windows installed Squirrel smoke,Electron/CLI asset 发布和 Cloudflare R2 updater 发布均通过。
|
||||
- GitHub Release 已有 `13` 个真实资产:Windows Setup/full nupkg、macOS arm64/x64 DMG/ZIP/updater metadata,以及 macOS arm64/x64、Linux x64、Windows x64 CLI 包。
|
||||
- 该 run 的 Windows 编译日志暴露跨平台 unused/dead-code warning;现有资产对应 warning 修复前的 `4ee8d3577`,不能作为下一候选的 warning-free 证据。
|
||||
|
||||
## Windows warning 与 Codex 对齐修复
|
||||
|
||||
状态:`fix-validated-locally / retag-confirmation-pending / windows-runner-pending`
|
||||
|
||||
- Codex 对照结论:`app-server-transport` Unix socket 与 MCP `OsStr` 仅缺少精确平台导入边界,分类为 `current / cfg-fix`;没有缺失 transport 或 MCP 执行实现。
|
||||
- `tool-runtime` 确有 Windows 功能遗漏:Lime 公开了 `login` 参数却在 PowerShell 分支始终添加 `-NoProfile`。按 Codex `Shell::derive_exec_args` 对齐为 `login=false` 添加 `-NoProfile`、`login=true` 加载 profile,同时保留非交互执行参数,并补 Windows 定向回归。
|
||||
- Skills 的插件版 snapshot、selection、prompt context 已从 turn request、telemetry 与 runtime enable 主链消费;三个 warning 符号只是无插件测试包装层,分类为 `dead`,已删除并让测试直接调用插件版 current owner。
|
||||
- workflow 审计自由函数已被 turn execution/control/read-model 测试真实消费;未使用的 `RuntimeCore` 同名方法是重复入口,分类为 `dead` 并删除。Codex 没有 Lime 预留的 `workflow.tool/connector/hook/artifact` 事件校验面,仓库也无消费者,整组分类为 `dead` 并删除;保留在用的 run/step current 事件。
|
||||
- 定向 `rustfmt --check`、workspace `cargo fmt --all -- --check` 与 `git diff --check` 通过;host `cargo check --lib -p app-server-transport -p tool-runtime -p lime-mcp -p app-server` 通过且没有 warning;Windows target `app-server-transport` check 通过且没有 warning。
|
||||
- owner 测试通过:`app-server-transport 18/18`、`lime-mcp environment 7/7`、`tool-runtime unified_exec 10/10`、`agent_skills_context 13/13`、`runtime::workflow 13/13`。
|
||||
- `npm run test:rust:related -- <本轮 7 个 Rust 路径>` 最终退出码为 `0`,全部 `11` 个相关/反向依赖 crate 通过;此前并行 `provider_turn` 回归失败已由其 owner 收口,不再阻塞候选。
|
||||
- `npm run typecheck`、`npm run verify:app-version` 与 `npm run governance:legacy-report` 通过;版本事实源保持 `1.125.0`,治理报告为零候选、零漂移、零违规。
|
||||
- `npm run test:contracts` 通过:协议生成零漂移、App Server client `301 checks`、命令/fixture/modality/scripts/Electron release/docs 边界全部通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture` 通过:覆盖真实 Electron 的 Thread/Turn/Item、工具终态、approval、Skills、MCP、Workbench 与历史恢复;`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke` 通过;Electron/App Server evidence 为 `standalone-shell-01-20260811030633-6629`,App Server 版本 `1.125.0`。
|
||||
- `app-server/src/runtime_backend/tests.rs` 仍有一个只在 lib test 构建出现的测试 helper dead-code warning,不属于用户报告的 release build warning,也不进入标准 Release 编译路径;本轮不跨写集夹写,后续由该测试 owner 独立收口。
|
||||
- 本机其余 Windows target check 被 `ring`、`zstd-sys`、`bzip2-sys` 缺少 MSVC C 标准头阻断;最终 warning-free 证据必须来自新 release candidate 的真实 Windows runner。
|
||||
- 下一步:获得单独危险操作确认后提交全部 release candidate、强制重定位 `v1.125.0` 并重跑标准 Release,最终复核 GitHub Release 资产时间与 Windows 日志。
|
||||
@@ -1,96 +0,0 @@
|
||||
# Lime v1.126.0 发布执行计划
|
||||
|
||||
状态:release-candidate-ready
|
||||
日期:2026-08-12
|
||||
目标版本:`1.126.0`
|
||||
目标 tag:`v1.126.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布 Code Mode process-owned runtime、Agent runtime/session loop、provider canonical transport、App Server read model、
|
||||
Electron 双 sidecar 资源链、协议/GUI 投影以及对应治理文档;完成 release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、
|
||||
`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划。
|
||||
- `candidate changes`:用户确认当前工作树全部纳入,包括已暂存、未暂存和未跟踪的 Rust、TypeScript、脚本、CI、
|
||||
测试、架构、治理与执行计划文件。
|
||||
- `excluded changes`:无。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 版本事实源与双语单页 release notes 统一到 `1.126.0`,目标 tag 本地/远端不存在。
|
||||
- Code Mode production 只走 `ProcessCodeModeSessionProvider -> code-mode-host -> sandbox V8`,无 in-process fallback。
|
||||
- dev、Electron assets、Forge/Windows 构建成组携带并校验 `app-server` 与 `code-mode-host`。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、Rust related、contracts 与 GUI smoke 通过。
|
||||
- Code Mode Electron Gate B 证明真实 Electron/App Server/standalone host PID、custom exec 回采样与 GUI terminal。
|
||||
- 完成 release commit、`v1.126.0` tag、main/tag 推送和远端复核。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过,版本事实源一致为 `1.126.0`。
|
||||
- `npm run typecheck`:通过(发布 metadata 更新后复跑)。
|
||||
- `npm run test:contracts`:通过;App Server client `309` 项检查及 command、harness、modality、scripts、Electron release workflow、docs boundary 子门禁全部通过。
|
||||
- `npm run test:rust:related -- lime-rs/crates/agent-runtime lime-rs/crates/agent lime-rs/crates/app-server lime-rs/crates/model-provider lime-rs/crates/runtime-core lime-rs/crates/tool-runtime lime-rs/crates/services`:通过;相关 owner 与反向依赖 crate 单测无失败,存在一个既有测试辅助函数 dead-code warning。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过;history/cache、turn terminal、approval、steer、Plan、Skills、MCP、媒体、Workbench 等 current Electron fixture 闭环通过,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过;真实 Electron/App Server `1.126.0` 初始化、工作台 reload 与 memory settings 可见,evidence result 为 `pass`。
|
||||
- `npm run governance:legacy-report`:通过;扫描 `2120` 个源码文件,分类漂移 `0`、边界违规 `0`。
|
||||
- standalone Code Mode Cargo check:通过,无 warning。
|
||||
- Code Mode process Rust tests:`6/6` 通过。
|
||||
- sidecar/assets/fixture/package/Gate B script tests:`56/56` 通过。
|
||||
- `npm run electron:build:app-server-assets`:通过;macOS arm64 双 sidecar 为 `0755`,manifest 双 SHA 复算一致。
|
||||
- `npm run smoke:code-mode-electron-gate-b`:通过;最新 rerun thread `019ff3ca-7f26-71d2-be81-6a16b7895515`,Electron/App Server/
|
||||
host PID 为 `44199/44203/44521`,host parent PID 为 `44203`,17 项 assertion 全通过。
|
||||
- `cargo fmt --all -- --check`、`git diff --check`:通过。
|
||||
- `npm run verify:local`:通过;fresh 120 个 Vitest smart batches、contracts、13-crate changed-scope Rust、真实 Electron/App Server GUI smoke、lint、typecheck、i18n、scripts/docs/version 门禁均通过;Rust 仅保留既有 App Server test helper `dead_code` warning。
|
||||
|
||||
## 已公开 Release 修复轮
|
||||
|
||||
- 首次公开提交为 `b48569b83b457eda1a9dac043d5ad4d470fc9e86`;Quality run `31563417376` 与 Release run `31563421104` 失败,GitHub Release 已创建但无 assets。用户明确要求保留 `v1.126.0`,不改发补丁版本。
|
||||
- Frontend Full:修复 provider settings Promise 未释放前等待 `sendMessage()` 导致的测试超时;`useAgentChat` 主套件 `186/186` 通过。
|
||||
- Rust Full:直接 workspace 测试前显式配置已校验 sandbox `rusty_v8` artifact,避免回退到不存在的上游 archive。
|
||||
- Windows:根工具链与目标 workflow 固定 Rust `1.95.0`,复用 `scripts/lib/windows-msvc-linker.ps1` 导出完整 MSVC/UCRT 环境并选择 `rust-lld.exe`;Quality 将双 sidecar 从 `cargo check` 提升为真实 `cargo build` 链接,不使用 `/FORCE:MULTIPLE`。
|
||||
- macOS package:`app-server` 与 `code-mode-host` 统一执行“manifest SHA 一致,或签名后通过 `codesign --verify --strict`”校验;非 macOS 和无效签名仍 fail closed,资源回归 `17/17` 通过。
|
||||
- 修复后本地门禁:`npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、Rust related、`cargo fmt --all -- --check`、workflow YAML parse、Prettier、scripts governance 与 `git diff --check` 全通过。
|
||||
- 修复后 Gate B:`npm run verify:gui-smoke` 通过;run id `standalone-shell-01-20260812112209-14292`,真实 Electron/preload/IPC/App Server `1.126.0`、Workbench reload、Memory settings、21 项 assertion 全通过,mock/legacy hit 均为 `0`。
|
||||
- 本地无法证明 Windows MSVC 真链接与三平台 Forge 发布;重建 `v1.126.0` 后必须监控新的 Quality/Release run 到终态,并复核 Release assets。
|
||||
- 已有 GitHub Release 的 workflow 分支会同步刷新 `target_commitish`、标题与 release notes,避免同名 tag 重建后页面元数据仍指向旧提交。
|
||||
- 第二次公开提交 `979950a989c510734094e84bb63e80d7526ad27e` 触发 Quality run `31601406178` 与 Release run `31601426048`;
|
||||
GUI Smoke、Bridge & Contracts、Integrity、lint、typecheck 与 layer budget 已通过,但 Frontend Full 在 Linux runner 的
|
||||
`electron/updateHost.test.ts` 被 unsupported-platform 保护提前拦截,Windows Quality/Release 则在真实链接时证明
|
||||
`rust-lld` 与 `rusty_v8` 的 `allocator_shim_win_static.obj`/UCRT 符号不兼容;Rust Full 的 workspace test 还缺少
|
||||
standalone `code-mode-host` 构建前置条件,导致 `337` 项通过后 3 项 process test 失败。
|
||||
- Frontend 测试现在显式固定受测 updater 平台为 macOS,并在用例后恢复 runner 平台;定向套件 `13/13` 通过。
|
||||
- Windows 继续复用 `VsDevCmd.bat` 导出的完整环境,但改用同一 `VCToolsInstallDir` 的 x64 原生 `link.exe`;不使用
|
||||
`/FORCE:MULTIPLE`、`/NODEFAULTLIB` 或其它掩盖符号冲突的参数。下一轮 Windows runner 必须重新证明双 sidecar 与 Electron package 真链接。
|
||||
- Rust Full 在 workspace test 前显式构建 `code-mode-host`,满足 process test 的真实 standalone binary 前置条件。
|
||||
- 第二轮 CI 终态:Quality `31601406178` 为 failure(Frontend Full、Rust Full、Windows Shell Runtime 三项失败,
|
||||
GUI Smoke、Bridge & Contracts、Integrity 成功);Release `31601426048` 为 failure(macOS arm64/x64 成功,Windows x64 失败)。
|
||||
- 第二轮修复本地复验:CI 对应 Vitest 批次 `25/120` 为 `16 files / 128 tests` 全通过;在与 CI 相同的已校验
|
||||
sandbox `rusty_v8` artifact 环境下,`code-mode-host` 构建成功,3 个 standalone process tests 全通过;
|
||||
`npm run typecheck`、`npm run test:contracts`(`309 checks`)、`npm run verify:app-version`、scripts governance、
|
||||
release workflow guard、YAML parse、Prettier 与 `git diff --check` 均通过。
|
||||
- 第三次公开提交 `84dc6723822e5468c51c796393fa9aaba14db0a9` 触发 Quality `31605835668` 与 Release
|
||||
`31605860011`。Frontend Full 在批次 `32/120` 发现 harness 直接导入的 `smol-toml` 仅由 `knip` 传递安装;
|
||||
GUI Smoke 和 macOS arm64/x64 Release 恢复了缺少 `gn_out/obj/rusty_v8` 的 Cargo 缓存指纹,导致 V8 archive
|
||||
未重新物化;Windows 原生 `link.exe` 已正确启用,但 Codex sandbox V8 静态 CRT 与 Lime 默认动态 UCRT 混用,
|
||||
触发 `allocator_shim_win_static.obj` 的 `LNK2005`/`LNK1169`。
|
||||
- 第三轮修复将 `smol-toml` 声明为根开发依赖;所有 sidecar/Forge V8 构建在 artifact 校验后定向执行
|
||||
`cargo clean -p v8`,只刷新 V8 build-script 指纹;Windows MSVC 通过 artifact owner 导出的目标级
|
||||
`target-feature=+crt-static` 对齐 Codex 已在 Windows Rust 1.95 Cargo smoke 验证的 artifact 合同,不使用
|
||||
`/FORCE:MULTIPLE`、`/NODEFAULTLIB` 或其它链接器掩盖参数。
|
||||
- 第三轮本地复验:pnpm `9.15.9` frozen lockfile 安装通过;Frontend 失败批次 `32/120` 为 `16 files / 113 tests`
|
||||
全通过;`rusty_v8`、Electron sidecar 与 DeepSWE adapter 定向回归为 `3 files / 44 tests` 全通过;
|
||||
`npm run typecheck`、`npm run verify:app-version`、`npm run test:contracts`(`311 checks`)、scripts governance、
|
||||
release workflow guard、三份 workflow YAML parse、Prettier 与 `git diff --check` 全通过。
|
||||
|
||||
## 待执行门禁
|
||||
|
||||
- 全候选 staged 复核、危险操作确认、commit/tag/push 与远端状态复核。
|
||||
- Windows 双 sidecar 由 CI 的 Windows runner 执行;本地 macOS Gate B 不冒充 Windows packaged parity。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。已更新 `internal/aiprompts/architecture.md` 第 44 节,确认 production process owner、双 sidecar
|
||||
构建/资源完整性、fail-closed 边界与 Gate B 证据。责任开发者:root,确认日期:2026-08-12。
|
||||
@@ -1,67 +0,0 @@
|
||||
# Lime v1.128.0 发布执行计划
|
||||
|
||||
状态:release-candidate-gates-partial
|
||||
日期:2026-08-14
|
||||
目标版本:`1.128.0`
|
||||
目标 tag:`v1.128.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前工作树中的 Codex Orchestrator 完整对齐候选,覆盖 AgentControl 容量/驻留/预算、工具执行编排、
|
||||
Orchestrator Skills/MCP、协议 schema、GUI 投影、脚本与治理文档,并完成版本事实源、双语单页 release notes、
|
||||
质量门禁、release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、
|
||||
`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划导航。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪改动,包括 Agent runtime、App Server/protocol、MCP、Skills、
|
||||
tool-runtime、GUI、脚本、测试、架构、治理和 Gate B 证据相关文件。
|
||||
- `excluded changes`:无。当前工作树改动属于本次 Orchestrator 候选;不拆分或覆盖并发写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 四个版本事实源与双语单页 release notes 统一为 `1.128.0`,本地/远端目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、受影响 Rust/前端定向测试、
|
||||
`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke` 通过;无法执行的门禁必须记录原因。
|
||||
- staged 内容与候选范围一致,完成危险操作确认后创建 `Release v1.128.0` commit、`v1.128.0` tag,推送 `main` 和 tag,
|
||||
并复核本地/远端状态。
|
||||
- 计划中记录当前/兼容/废弃/已删除分类、完成度和剩余证据缺口;不将 terminal-slot reuse/residency 或 rollout-budget
|
||||
exhaustion/cancellation/restart 的 GUI 证据误报为已完成。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 版本更新前:根应用、CLI npm 包与 Rust workspace 为 `1.127.0`;目标 tag 不存在;工作树候选为 141 条状态记录、
|
||||
127 个已跟踪文件差异及 14 个未跟踪文件。版本更新与 smoke 生成/并发写集收敛后,当前候选为 148 条状态记录、
|
||||
132 个已跟踪文件差异及 16 个未跟踪文件。
|
||||
- `npm run verify:app-version`:通过,四个版本事实源统一为 `1.128.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过(App Server client `312` checks;protocol/command/harness/modality/scripts/release
|
||||
workflow/docs boundary 全部通过)。
|
||||
- `npm run governance:legacy-report`:通过,扫描 `2129` 个源码文件,零分类漂移、零边界违规。
|
||||
- `npm run governance:scripts`:通过;`git diff --check`:通过。
|
||||
- `npm run test:rust:related -- <Orchestrator owner paths>`:编译成功,`1691 passed; 8 failed`。失败集中在 external
|
||||
backend `turn.accepted` 顺序、canonical child terminal recovery 错误断言、coding payload rollback、queued restore、
|
||||
mock/unavailable backend 生命周期;新增 Orchestrator owner focused tests 在该批次内通过(AgentControl `52/52`、
|
||||
rollout budget `8/8`、tool orchestrator `8/8`、provider retry `1/1`)。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:失败于 Expert Panel Skills Runtime override;`skill_search` 已完成但
|
||||
read model turn 长时间保持 `inProgress`,证据见 `.lime/qc/gui-evidence/claw-chat-current-fixture/` 对应 summary;其余前置
|
||||
历史/流式/审批/取消/Skills/MCP/Workbench 场景通过。
|
||||
- `npm run verify:gui-smoke`:通过;真实 Electron/App Server `1.128.0`,evidence
|
||||
`standalone-shell-01-20260814143128-49941`,主 smoke 全部通过。
|
||||
- `npm run smoke:orchestrator-skills-gate-b`:通过;真实 Electron/runtime 远程 Skill 读取、配置控制面、禁用
|
||||
`codex_apps` 后普通 MCP 保持可用,summary 写入 `.lime/qc/gui-evidence/orchestrator-skills-gate-b/`。
|
||||
- `npm run smoke:agent-runtime-tool-execution` 与 `npm run smoke:agent-runtime-tool-execution:managed`:均失败于
|
||||
`allTargetToolsCompleted`;`Read` 保持 `in_progress`、`apply_patch` 出现重复生命周期。专用 Vitest 脚本合同仍通过
|
||||
`24/24`,但不能替代真实 runtime 证据。
|
||||
- 已完成 `git add -A`,暂存内容覆盖上述候选范围;尚未执行 `git commit`、`git tag` 或 `git push`。目标 tag 本地/远端在写操作前均不存在。
|
||||
|
||||
## 风险与限制
|
||||
|
||||
- 本机无法证明 Windows packaged parity 或三平台 Forge 发布,不能以 macOS Gate B 替代 Windows 证据。
|
||||
- Orchestrator 对齐计划当前总体完成度为 `95%`;实现和聚合门禁已通过,但两类产品证据仍待后续补齐。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。`internal/aiprompts/architecture.md` 已在本候选中记录 RuntimeCore execution/residency/budget、
|
||||
tool-runtime attempt 与 Skills/MCP owner/data flow。责任开发者:root,确认日期:2026-08-14。
|
||||
@@ -1,49 +0,0 @@
|
||||
# Lime v1.129.0 发布执行计划
|
||||
|
||||
状态:release-candidate-gates-partial
|
||||
日期:2026-08-16
|
||||
目标版本:`1.129.0`
|
||||
目标 tag:`v1.129.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前工作树中的多模型路由与多模态能力候选,覆盖候选模型集/OEM 路由策略、语音合成/转写/嵌入 provider lowering、媒体任务 worker、App Server 协议与 runtime 事实投影、证据导出旧面清理、GUI/Skills 面收敛及脚本、治理和多语言回归;完成版本事实源、双语单页 release notes、质量门禁、release commit、tag、main/tag 推送与远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划导航。
|
||||
- `candidate changes`:当前工作树全部已跟踪和未跟踪改动,包括 RuntimeCore/App Server/model-provider、协议 schema/客户端、媒体与嵌入、GUI、Skills、脚本、测试、架构、治理和多语言文件。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动全部纳入本候选;不覆盖或拆分并发写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 四个版本事实源与双语单页 release notes 统一为 `1.129.0`,目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck`、`npm run test:contracts`、受影响 Rust/前端定向测试、`npm run smoke:agent-runtime-current-fixture` 与 `npm run verify:gui-smoke` 按风险执行;无法执行的门禁必须记录原因。
|
||||
- staged 内容与上述候选范围一致,完成危险操作确认后创建 `Release v1.129.0` commit、`v1.129.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
- 计划记录当前/兼容/废弃/已删除分类、完成度和剩余证据缺口;不将未执行的平台/打包证据误报为已完成。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 版本更新前:根应用、CLI npm 包与 Rust workspace 为 `1.128.0`;目标 tag 不存在。
|
||||
- 版本事实源、release notes 与本计划已更新;当前候选为 259 个已跟踪文件差异及 10 个未跟踪文件。
|
||||
|
||||
## 门禁结果
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 均为 `1.129.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过;协议生成 983 类型,App Server client 299 checks 通过。
|
||||
- `npm run governance:legacy-report`:通过;扫描 2115 个源码文件,分类漂移 0、边界违规 0、零引用候选 0。
|
||||
- `npm run verify:gui-smoke`:通过;真实 Electron/App Server `1.129.0`,Gate B evidence `standalone-shell-01-20260816014540-32363`。
|
||||
- `npm run test:rust:related -- <paths...>`:编译通过,1664 passed、9 failed;失败集中在 external backend 事件顺序、Agent terminal recovery、queue restore、mock/unavailable backend 与 model route resolver,未作为已通过门禁记录。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:前置历史/流式/审批/Plan/图片/Coding 场景通过;Skills Runtime workspace 手动启用阶段失败,断言 `readModelSkillGateObserved`,摘要见 `.lime/qc/gui-evidence/claw-chat-current-fixture/claw-chat-current-fixture-skills-runtime-regression-summary.json`。
|
||||
|
||||
本地未执行 Windows/macOS packaged parity、签名、公证、正式 release asset 和 CI 门禁;这些不在本地候选中宣称完成。发布提交将保留上述失败证据和限制,不掩盖为全绿。
|
||||
|
||||
## 风险与限制
|
||||
|
||||
- 当前工作树包含大量跨层删除与重构,Rust related、contracts、typecheck 和 GUI smoke 需以实际结果为准。
|
||||
- 本机无法替代 Windows/macOS 全平台 packaged parity、签名、公证和 CI 发布资产证据;未执行或失败项不得宣称为全绿。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。候选已更新 `internal/aiprompts/architecture.md`,涉及 RuntimeCore 模型候选路由、provider 多模态 lowering、App Server media worker 与 GUI runtime facts owner。责任开发者:root,确认日期:2026-08-16。
|
||||
@@ -1,62 +0,0 @@
|
||||
# Lime v1.130.0 发布执行计划
|
||||
|
||||
状态:released
|
||||
日期:2026-08-17
|
||||
目标版本:`1.130.0`
|
||||
目标 tag:`v1.130.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前 `main` 工作树中的 Codex runtime gap alignment、转写 worker current owner、provider 增量请求、Hook 生命周期、MCP 工具并发、标准 AGENTS 发现、ProjectThread-first 与 Harness/治理收敛改动;完成版本事实源、双语单页 release notes、质量门禁、release commit、tag、`main`/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划导航。
|
||||
- `candidate changes`:版本元数据写入前工作树中全部 81 个受跟踪改动和 4 个未跟踪文件,覆盖 RuntimeCore/App Server/model-provider、tool-runtime、agent-runtime、媒体/Skills、脚本、测试、架构、路线图、治理、多语言和 Harness 图资产;治理门禁修复额外更新 2 个受跟踪事实源。计入发布元数据后,提交前候选共 90 个受跟踪文件和 5 个新增文件。
|
||||
- `excluded changes`:无。用户请求为完整发布,未跟踪文件与本轮 runtime/Harness 主题直接相关;不覆盖或拆分并发写集。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.130.0`,双语 release notes 只保留 v1.130.0,目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须执行;按风险执行 `npm run test:contracts`、受影响 Rust/前端定向测试、`npm run smoke:agent-runtime-current-fixture`、`npm run verify:gui-smoke`,未执行或失败项必须原样记录。
|
||||
- staged 内容与上述候选范围一致;获得危险操作确认后创建 `Release v1.130.0` commit、`v1.130.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
- 收尾记录 current/compat/deprecated/dead 分类、完成度、GUI/Gate B 状态和未覆盖的平台/打包证据,不把环境限制误报为通过。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 发布前基线为 v1.129.0(commit `a04912c2d`),发布前 `v1.130.0` 本地和远端 tag 均不存在。
|
||||
- 版本事实源和双语 release notes 已更新;候选包含版本元数据之外的全部现有工作树改动。
|
||||
- 已创建 release commit `7852f6088`(`Release v1.130.0`),并创建、推送 `v1.130.0`;远端 tag 固定指向该 release commit,`origin/main` 随后包含发布收尾记录提交链。
|
||||
- 发布提交后发现 3 个未纳入 tag 的 App Server 文件改动:`lime-rs/crates/app-server/src/runtime.rs`、`lime-rs/crates/app-server/src/runtime/skills.rs`、`lime-rs/crates/app-server/tests/skills_jsonrpc.rs`。这些改动保留在工作树中,未回滚、未纳入本版本,待后续变更单独归类。
|
||||
|
||||
## 门禁结果
|
||||
|
||||
- 通过:`npm run verify:app-version`。
|
||||
- 通过:`npm run typecheck`。
|
||||
- 通过:`npm run test:contracts`;在治理修复后独立复跑第二次仍通过,覆盖 protocol types、App Server client contract、command/harness/modality/scripts/Electron release workflow/docs boundary 等合同。
|
||||
- 通过:`npm run test:rust:related -- lime-rs/crates/agent-runtime lime-rs/crates/agent lime-rs/crates/app-server lime-rs/crates/model-provider lime-rs/crates/tool-runtime lime-rs/crates/core lime-rs/crates/skills`。首次仅 `tool-runtime` 的 3 个测试因缺少 `code-mode-host` 前置产物失败;使用 `scripts/lib/rusty-v8-artifacts.mjs` 提供的 V8 环境预构建该产物后完整重跑通过,其中 `agent-runtime` 210、`app-server` 1678、`tool-runtime` 356 个测试通过。
|
||||
- 通过:受影响前端/治理定向 Vitest,10 个文件共 441 个测试;Claw scenario registry 6 个测试;治理修复后的 `legacySurfaceCatalog.test.ts` 224 个测试。
|
||||
- 通过:`npm run smoke:agent-runtime-current-fixture`,覆盖真实 Electron/App Server current fixture,`liveProviderUsed=false`。
|
||||
- 通过:`npm run verify:gui-smoke`;App Server 报告版本 `1.130.0`,Gate B evidence 为 `standalone-shell-01-20260816225825-49240`。
|
||||
- 通过:`npm run governance:legacy-report`。首次发现 `.lime/AGENTS.md` fallback 与治理规则冲突,已将其收敛为标准 AGENTS owner 下的受控 `compat`,更新 `internal/aiprompts/governance.md` 与 `src/lib/governance/legacySurfaceCatalog.json` 后重跑通过:扫描 2115 个源码文件,分类漂移 0、边界违规 0。
|
||||
- 已知非产品失败:两次 `npm run test:related -- ...` 均触发 Vite runner 的 `EISDIR ... /lime/electron` 缺陷;随后使用等价 `npx vitest run <files>` 验证实际测试全部通过。该 runner 缺陷不冒充产品测试失败,也不在本次候选中扩写修复范围。
|
||||
- 提交前复跑的 `git diff --check`、`npm run verify:app-version` 均通过;staged 内容为 95 个文件,提交、tag、`main`/tag 推送及远端复核均完成。发布后 3 个未纳入文件的工作树差异 `git diff --check` 仍通过。
|
||||
|
||||
本地不执行 Windows/macOS packaged parity、签名、公证、正式 release asset 和 CI 门禁;这些证据不在本候选中宣称完成。
|
||||
|
||||
## 风险与限制
|
||||
|
||||
- 当前候选横跨 Rust runtime、provider、App Server、脚本、治理和五语言资源;门禁必须以实际命令结果为准。
|
||||
- 本机不能替代 Windows/macOS packaged parity、签名、公证和 CI 发布资产证据;任何失败或未执行项都保留在最终记录中。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。候选更新了 `internal/aiprompts/architecture.md`,明确转写 worker、provider route 和 current runtime 链路;同时纳入 `internal/tech/lime-agent-harness-architecture.*` 图源与渲染资产。责任开发者:root,确认日期:2026-08-17。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI 主链,以及 model-provider、tool-runtime Hook/MCP、transcription worker 和标准 AGENTS owner;本次能力继续在这些 owner 演进。
|
||||
- `compat`:`.lime/AGENTS.md` / `.lime/AGENTS.override.md` 仅作为标准 AGENTS 发现之后的受控 fallback,由 current owner 委托,不形成第二套实现。
|
||||
- `deprecated`:本候选未新增或保留独立演进的 deprecated 能力。
|
||||
- `dead / deleted`:移除已脱离构建图的 `runtime/tests/evidence_exports.rs` 测试入口,并由治理 catalog/测试阻止旧 evidence-export 专用入口回流。
|
||||
- 当前完成度:100%(v1.130.0 发布流程)。版本、release notes、候选范围、架构确认、本地质量门禁、release commit、tag、`main`/tag 推送和远端复核均完成;工作树中另有 3 个发布后未纳入改动,不影响已发布 tag,但需要后续独立处理。
|
||||
@@ -1,59 +0,0 @@
|
||||
# Lime v1.131.0 发布执行计划
|
||||
|
||||
状态:`ready-for-confirmation / release-candidate`
|
||||
日期:2026-08-17
|
||||
目标版本:`1.131.0`
|
||||
目标 tag:`v1.131.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前 `main` 工作树中的 Scheduled Tasks current 迁移切片:协议与 schema、App Server/Runtime 调度闭环、typed terminal notification、Renderer/Electron bridge、软删除、五语种工作台、真实 Electron Gate B fixture、治理与路线图收敛;完成版本事实源、双语单页 release notes、质量门禁、release commit、tag、`main`/tag 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划导航。
|
||||
- `candidate changes`:当前工作树中的全部 224 个受跟踪改动和 12 个未跟踪文件(含本计划),覆盖 Scheduled Tasks 协议、Rust/App Server/Runtime、Renderer/Electron、脚本、测试、架构、路线图、治理和五语言资源;不拆分同一 current 切片。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动均归属于本轮 Scheduled Tasks/Automation 收敛候选。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.131.0`,双语 release notes 只保留 v1.131.0,目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须执行;按风险执行 contracts、受影响 Rust/前端定向测试、Scheduled Tasks Electron fixture、Agent current fixture、GUI smoke、治理与本地门禁,未执行或失败项原样记录。
|
||||
- staged 内容与上述候选范围一致;获得危险操作确认后创建 `Release v1.131.0` commit、`v1.131.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
- 收尾记录 current/compat/deprecated/dead 分类、完成度、GUI/Gate B 状态和未覆盖的平台/打包证据,不把环境限制误报为通过。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 发布前基线为 v1.130.0(commit `b3e77b109`),发布前 `v1.131.0` 本地和远端 tag 均不存在。
|
||||
- 当前候选在版本元数据与 release notes 写入后为 224 个受跟踪文件改动和 12 个未跟踪文件;暂存前仍需再次核对完整清单,确保没有超出本轮 current 切片的文件。
|
||||
- Scheduled Tasks 实现计划已记录 protocol/client contracts、定向 Vitest、Rust related/changed、真实 Electron Gate B、Agent current fixture、GUI smoke、治理报告、`verify:local`、fmt 与 diff check 的通过证据;本次发版前门禁已全部重跑并通过。
|
||||
|
||||
## 门禁结果
|
||||
|
||||
- `npm run verify:app-version`:通过,版本一致为 `1.131.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过。
|
||||
- Scheduled Tasks 定向 Vitest:4 个文件、33 个测试通过。
|
||||
- `npm run smoke:scheduled-tasks-electron-fixture -- --timeout-ms 180000`:通过,真实 Electron/preload/IPC/App Server/RuntimeCore/provider Gate B。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过,`liveProviderUsed=false`。
|
||||
- `npm run verify:gui-smoke`:通过,App Server version `1.131.0`,evidence `standalone-shell-01-20260817163728-99465`。
|
||||
- `npm run governance:legacy-report`:通过,扫描 2100 个源码文件,zero-reference candidates、classification drift、boundary violations 均为 0。
|
||||
- `npm run verify:local`:通过,Vitest smart 119/119、contracts、Rust workspace、Electron shell smoke 均通过。
|
||||
- `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all -- --check`:通过。
|
||||
- `git diff --check`:通过。
|
||||
|
||||
本地不执行 Windows Notification Center、真实 macOS/Windows sleep-resume、签名、公证、正式 release asset 和 CI 门禁;这些证据必须由对应平台/CI runner 提供。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。候选更新了 Scheduled Tasks public JSON-RPC/read-model、typed notification、Renderer bridge 与 Electron Desktop Host 主链,相关确认已记录于 `internal/exec-plans/scheduled-tasks-implementation.md` 与 `internal/aiprompts/architecture.md#73-scheduled-tasks`。
|
||||
|
||||
责任开发者:root,确认日期:2026-08-17。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI 主链,以及 Scheduled Tasks scheduler、notification bridge 和 model route selection。
|
||||
- `compat`:旧 `automationJob/*` 管理接口及 Settings surface 仍按迁移计划保留为受控 compat,不承担新的 current 创建路径。
|
||||
- `deprecated`:旧 Automation 双轨及其剩余 consumer/fixture 等待物理迁移清理;本版本不新增兼容包装。
|
||||
- `dead / deleted`:本候选删除已脱离构建图的旧 Automation 页面、API、fixture、协议文件和相关回流入口。
|
||||
- 当前完成度:95%;待 commit/tag/push 与远端复核完成后更新为 100%。Windows Notification Center、真实 macOS/Windows sleep-resume、签名、公证、正式 release asset 和 CI 门禁证据保持未覆盖状态。
|
||||
@@ -1,63 +0,0 @@
|
||||
# Lime v1.132.0 发布执行计划
|
||||
|
||||
状态:`tag-published / windows-release-blocked / awaiting-release-strategy`
|
||||
日期:2026-08-19
|
||||
目标版本:`1.132.0`
|
||||
目标 tag:`v1.132.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前 `main` 工作树中的 Browser Workspace / Right Surface current 收敛切片:统一 Electron `WebContentsView` 与 Agent Browser 动态工具的同 Tab owner,完成 CodeCell trace/evidence App Server owner、旧 Browser surface 物理清退、协议与 GUI 重构、版本事实源、双语单页 release notes、质量门禁及 release commit/tag/push。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划导航。
|
||||
- `candidate changes`:当前工作树中的全部 500 个受跟踪改动和 24 个未跟踪文件(共 524 个 status 条目;`git diff --stat` 为 500 files changed, 5,756 insertions, 55,680 deletions),覆盖 BrowserTabHost、App Server/Runtime、Browser Workspace、协议/schema、Rust、Electron、脚本、测试、五语言资源、架构、路线图与治理。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动均归属于本轮 Browser/Right Surface current 收敛候选。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.132.0`,双语 release notes 只保留 v1.132.0,目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须执行;按风险执行 contracts、受影响 Rust/前端定向测试、Browser Electron Gate B、Agent current fixture、GUI smoke、治理与本地门禁,未执行或失败项原样记录。
|
||||
- staged 内容与上述候选范围一致;获得危险操作确认后创建 `Release v1.132.0` commit、`v1.132.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 发布前基线为 `v1.131.0`(commit `340c5c1ba`),发布前 `v1.132.0` 本地和远端 tag 均不存在。
|
||||
- 当前候选已完成本轮完整门禁;本计划只记录实际执行结果,不以历史 v1.131.0 证据替代本轮证据。
|
||||
|
||||
## Windows 发布事故修复
|
||||
|
||||
- 远端 tag `v1.132.0` 与 release commit `81086c5ec` 已创建;Release run `32222043562` 的 Windows x64 job `95974247072` 在 `Smoke installed Windows Squirrel candidate` 失败,GitHub Release 尚无可发布资产。
|
||||
- Windows Squirrel 安装、N-1 更新、候选版本匹配和 packaged `SHELL-01` 均实际成功;内层 summary 为 `result=pass`、`21/21` assertions passed、trace/screenshot 完整。唯一失败为 runner 在证据落盘后仍等待 Electron 进程退出,120 秒超时把子进程退出码覆盖为 `1`。
|
||||
- 修复写集限定为 `scripts/electron/smoke.mjs`、`scripts/electron/lib/electron-smoke-summary.mjs` 和对应测试;完整且 run-id 匹配的结构化 summary 成为 harness 完成信号,缺失断言、失败断言、错 run-id 或缺失 trace/screenshot 仍 fail closed。
|
||||
- 退出条件:定向回归、脚本治理、release workflow guard、版本一致性和真实 Electron `SHELL-01` Gate B 通过;随后在“重建已推送的 `v1.132.0` tag”与“发布 `v1.132.1` 补丁版”之间明确选择并获得对应 Git 写操作确认,由 Windows runner 补齐 platform/packaged 证据。禁止保留旧 tag 但从另一 commit 构建同版本资产,以免 tag 与二进制不可复现。
|
||||
- 已通过:related test `3/3`、Electron/Windows entrypoint 回归 `34/34`、`npm run governance:scripts`、`npm run governance:electron-release-workflow`、`npm run verify:app-version`、Prettier、`git diff --check`。
|
||||
- 已通过真实 Electron Gate B:`npm run verify:gui-smoke` 生成 `result=pass`、`21/21` assertions passed、`app_server_handle_json_lines` 命中 `41` 次,且 `evidence ready` 后约 1 秒内 runner 正常退出,不再等待 120 秒。
|
||||
- 待 CI 证明:Windows installed Squirrel candidate 的修复后进程终止与 release assets 发布;本地 macOS Gate B 不能替代该 platform/packaged 证据。
|
||||
|
||||
## 门禁结果
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 均为 `1.132.0`。
|
||||
- `npm run typecheck`:通过;`npm run verify:local` 内再次通过 renderer/node typecheck。
|
||||
- `npm run test:contracts`:通过(protocol types 无漂移、App Server client 299 checks、命令/Harness/modality contracts、docs boundary 均通过)。
|
||||
- Browser Workspace / BrowserTabHost / CodeCell trace / 受影响 Rust 与前端定向测试:通过;完整 smart Vitest `116/116` 批次通过,changed-scope Rust workspace 单测全部通过。
|
||||
- `npm run smoke:browser-runtime-electron-gate-b`、`npm run smoke:agent-runtime-current-fixture`:通过(完整 smart Vitest 含对应 Gate B/current fixture);`npm run verify:gui-smoke`:通过,真实 Electron smoke evidence summary `result=pass`,App Server protocol/version 初始化为 `appserver.v0/1.132.0`。
|
||||
- `npm run governance:legacy-report`:通过(扫描 2,046 个实现文件,零引用候选 0、分类漂移 0、边界违规 0);`npm run governance:scripts`:通过;`npm run verify:local`:通过;`git diff --check`:通过。
|
||||
- GUI smoke 曾输出一次 renderer/workbench 等待超时诊断,但 runner 最终生成 `result=pass` summary 并正常退出;该诊断保留为 residual evidence,不阻断本地门禁。
|
||||
|
||||
本地不执行 Windows Notification Center、真实 macOS/Windows sleep-resume、签名、公证、正式 release asset 和 CI 门禁;这些证据必须由对应平台/CI runner 提供。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。候选更新了 Browser Workspace 的 WebContentsView 唯一执行体、connection-owned reverse request、BrowserRoute identity、turn cleanup、CodeCell trace/evidence owner 与旧 Browser 删除边界;确认已记录于 `internal/aiprompts/architecture.md`、`internal/roadmap/browser/README.md` 和 `internal/exec-plans/browser-runtime-right-surface-plan.md`。
|
||||
|
||||
责任开发者:root,确认日期:2026-08-19。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI,以及 BrowserTabHost、Browser Workspace、Browser dynamic capability 和 CodeCell trace reducer。
|
||||
- `compat`:仅保留仓库中明确标记且不承接新 current 创建路径的迁移边界;本候选不新增 compat wrapper。
|
||||
- `deprecated`:旧 Canvas Browser、外部 Chrome/CDP、BrowserSessionRef、site adapter 和 connector 路径已从主链迁出,等待验证后确认删除分类。
|
||||
- `dead / deleted`:旧 Browser Runtime crate、旧 v0 Browser Session、旧 Browser 页面/API/fixture 与生产 fallback 随本候选删除。
|
||||
- 当前完成度:`v1.132.0` tag/release 已创建,Windows harness 修复与本地门禁完成;剩余修复 commit/push、workflow dispatch 和 Windows release assets 复核,完成度 95%。
|
||||
@@ -1,65 +0,0 @@
|
||||
# Lime v1.133.0 发布执行计划
|
||||
|
||||
状态:`release-candidate / validation-passed / git-confirmation-pending`
|
||||
日期:2026-08-22
|
||||
目标版本:`1.133.0`
|
||||
目标 tag:`v1.133.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前 `main` 工作树中的 Browser Workspace / Right Surface、Browser 动态工具审批与用户接管、Agent 会话恢复和流控收敛切片,完成版本事实源、双语单页 release notes、质量门禁及 release commit/tag/push。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划。
|
||||
- `candidate changes`:当前工作树中全部 104 个已跟踪 diff 和 14 个未跟踪文件(共 118 个 status 条目),覆盖 Electron BrowserTabHost/App Server Host、Browser Workspace、动态工具和审批协议、Rust agent/app-server/model-provider/tool-runtime、Agent 会话恢复与流控、Memory 设置提示生命周期、脚本、测试、架构、路线图和治理文档。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动均纳入本轮 release candidate。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.133.0`;双语 release notes 只保留 v1.133.0;目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须通过;按风险执行 contracts、受影响 Rust/前端测试、Browser Electron Gate A/Gate B、Agent current fixture、GUI smoke、治理与本地门禁,未执行或失败项原样记录。
|
||||
- staged 内容与上述候选范围一致;获得危险操作确认后创建 `Release v1.133.0` commit、`v1.133.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 发布前基线为 `v1.132.0`(commit `18fe8e5cd`),发布前 `v1.133.0` 本地和远端 tag 均不存在。
|
||||
- 版本事实源与双语单页 release notes 已更新并通过一致性校验。
|
||||
- 首轮完整 Vitest 在第 54 批暴露 Codex upstream native-tool policy 测试漂移;测试已改为兼容当前 `UnifiedExec/Disabled`、serde alias 与 `UnifiedExecShellMode`,该批及后续批次通过。第 83 批首跑出现 worker timeout,精确重跑和后续续跑通过。
|
||||
- 首轮 `verify:local` 在原第 70 批暴露 Memory 设置页卸载后仍触发提示清理 timer;提示生命周期已收敛到父组件唯一 owner,重复提示替换 timer、卸载时清理,子面板不再创建独立 timer。Memory 页面、状态面板及相邻测试共 16 项定向复跑通过。
|
||||
- 修复后 `npm test -- --resume` 从失败断点至第 116 批全部通过;最终 `npm run verify:local` 从头执行并以退出码 0 完成,116 批 Vitest、contracts、Rust workspace 单元测试和真实 Electron GUI smoke 均通过。
|
||||
- `git diff --check` 通过;最终 candidate 无排除项,`v1.133.0` 本地与远端 tag 仍不存在。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。候选触及 BrowserTabHost 的 WebContentsView/BrowserRoute 唯一 owner、Browser action 两阶段审批、用户接管时的 live execution 撤销、App Server reverse request、Agent session-loop owner 投影与跨平台 tool-runtime 环境构造。相关确认已记录于 `internal/aiprompts/architecture.md`、`internal/roadmap/browser/README.md` 和对应执行计划。
|
||||
|
||||
责任开发者:root,确认日期:2026-08-21。
|
||||
|
||||
## 验证记录
|
||||
|
||||
| 命令 | 结果 | 证据/说明 |
|
||||
| --- | --- | --- |
|
||||
| `npm run verify:app-version` | 通过 | 根应用、CLI npm 包、Rust workspace、Cargo.lock 与 App Server sidecar 均为 `1.133.0` |
|
||||
| `npm run typecheck` | 通过 | 发布硬门禁最终复跑通过;`verify:local` 内再次通过 |
|
||||
| `npm run test:contracts` | 通过 | protocol types 无漂移,App Server client 299 checks,command/harness/modality/scripts/release/docs guards 通过 |
|
||||
| `npm run test:related -- ...` | 通过 | 当前候选前端/Electron 定向测试通过;Memory timer 修复额外 16 项定向测试通过 |
|
||||
| `npm run test:rust:related -- ...` | 通过 | agent/app-server/model-provider/tool-runtime 相关测试通过 |
|
||||
| `npm run smoke:browser-runtime-gate-a` | 通过 | Browser projection Gate A 通过 |
|
||||
| `npm run smoke:browser-runtime-electron-gate-b` | 通过 | lifecycle、approval、cancel、window-close、user-control、disconnect、permission、download 场景通过 |
|
||||
| `npm run smoke:agent-runtime-current-fixture` | 通过 | Agent current fixture 通过 |
|
||||
| `npm run verify:gui-smoke` | 通过 | 真实 Electron renderer、preload/IPC、App Server sidecar、Claw shell reload 与 Memory settings 通过 |
|
||||
| `npm run governance:legacy-report` | 通过 | 零引用候选 0、分类漂移候选 0、边界违规 0 |
|
||||
| `npm test -- --resume` / `npm test` | 通过 | 断点续跑至 116 批通过;最终 `verify:local` 内 116 批从头一次通过 |
|
||||
| `npm run verify:local` | 通过 | 最终复跑退出码 0,覆盖 app-version、i18n、lint、typecheck、Vitest、contracts、Rust workspace 与 GUI smoke |
|
||||
| `git diff --check` | 通过 | patch hygiene 无错误 |
|
||||
|
||||
本地不宣称 Windows Notification Center、真实 macOS/Windows sleep-resume、签名、公证、正式 release assets 或 live provider 证据;这些由对应平台/CI runner 提供。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI,以及 BrowserTabHost、Browser Workspace、Browser dynamic capability/approval、Agent session recovery/flow control。
|
||||
- `compat`:仅保留仓库中明确标记且不承接新 current 创建路径的迁移边界;本候选不新增 compat wrapper。
|
||||
- `deprecated`:旧 Browser surface、旧自动化/外部 CDP 边界按现有治理分类,仅由 current 路径迁出,不作为新发布 owner。
|
||||
- `dead / deleted`:候选中已经删除的脱离构建图文档/旧入口继续保持删除状态,不恢复旧 runtime 或 fallback。
|
||||
- 当前完成度:`95% / validation-ready`。版本、release notes、候选范围和门禁已完成;仅待用户明确危险操作确认后执行 release commit、tag、push 与远端 tag 复核。
|
||||
@@ -1,69 +0,0 @@
|
||||
# Lime v1.134.0 发布执行计划
|
||||
|
||||
状态:`release-ready / validation-complete`
|
||||
日期:2026-08-24
|
||||
目标版本:`1.134.0`
|
||||
目标 tag:`v1.134.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前 `main` 工作树中的 Browser historical surface、App Server v2 环境与 MCP 事件流、Provider capability、Windows sandbox readiness、Agent 历史投影和多语言验证切片,完成版本事实源、双语单页 release notes、质量门禁及 release commit/tag/push。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划。
|
||||
- `candidate changes`:当前工作树中的全部产品、协议、schema、生成类型、文档、测试、脚本与治理改动(299 个已跟踪 diff 文件、108 个未跟踪候选文件),覆盖 Electron Browser/App Server Host、Browser historical Workspace、环境/MCP/Provider capability/Windows sandbox 协议、Rust agent/app-server/mcp/tool-runtime、Agent session projection、GUI、多语言、脚本、测试、架构、路线图和治理文档。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动均纳入本轮 release candidate。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.134.0`;双语 release notes 只保留 v1.134.0;目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须通过;按风险执行 contracts、受影响 Rust/前端测试、Browser Electron Gate B、Agent current fixture、GUI smoke、治理与本地门禁,未执行或失败项原样记录。
|
||||
- staged 内容与上述候选范围一致;获得危险操作确认后创建 `Release v1.134.0` commit、`v1.134.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- 发布前基线为 `v1.133.0`(commit `489499f12`),`v1.134.0` 本地和远端 tag 均不存在。
|
||||
- 版本事实源与双语单页 release notes 已更新;`npm run verify:app-version` 已确认根应用、CLI npm 包、Rust workspace、Cargo.lock 与 sidecar 版本统一为 `1.134.0`。
|
||||
- 当前候选触及 Electron/preload/App Server JSON-RPC、Rust workspace、GUI 主路径和脚本治理;typecheck、contracts、Rust related、Browser Gate B、current fixture、GUI smoke、治理扫描和本地门禁已按下表完成或记录边界。
|
||||
|
||||
## 架构确认
|
||||
|
||||
架构影响:重大。候选扩展 App Server v2 的环境/MCP/Provider capability 边界、Browser historical surface、Agent Thread/Turn/Item projection 和 Windows sandbox readiness;确认以 `internal/aiprompts/architecture.md`、对应 Browser/Codex 执行计划和本计划为事实源。
|
||||
|
||||
责任开发者:root,确认日期:2026-08-23。
|
||||
|
||||
## 验证记录
|
||||
|
||||
| 命令 | 结果 | 证据/说明 |
|
||||
| --- | --- | --- |
|
||||
| `npm run verify:app-version` | 通过 | 版本一致性为 `1.134.0` |
|
||||
| `npm run check:protocol-types` | 通过 | 1037 个 definitions、1029 个 generated types,无漂移 |
|
||||
| `npm run typecheck` | 通过 | renderer 与 node TypeScript 发布硬门禁通过 |
|
||||
| `npm run test:contracts` | 通过 | protocol schema/generated client 无漂移,299 项 app-server client 检查及 command/harness/governance/docs 边界通过 |
|
||||
| 前端 Vitest 全量续跑 | 通过 | 116/116 批全部通过;MCP 定向测试 16 项通过 |
|
||||
| `npm run test:rust:related -- ...` | 通过 | 20 个受影响及反向依赖 crate;App Server unit 1709/1709、binary unit 26/26 通过 |
|
||||
| `thread/revert` public JSON-RPC integration | 通过 | 5/5;覆盖 revert 响应、通知与 read model |
|
||||
| MCP event stream public JSON-RPC integration | 通过 | 连续 3 次通过;覆盖 event 早于 active 的启动竞态与激活前有界缓冲 |
|
||||
| Agent Runtime Client package | 通过 | 24/24;覆盖 `thread/reverted` 非实体生命周期通知旁路 |
|
||||
| `npm run smoke:browser-runtime-electron-gate-b` | 通过 | 真实 Electron Browser Gate B;证据 `.lime/qc/gui-evidence/browser-runtime-electron-gate-b/browser-runtime-electron-gate-b-summary.json` |
|
||||
| MCP structured content Electron Gate B | 通过 | 真实 Electron、preload/IPC、App Server JSON-RPC、runtime/read model 与可见状态通过 |
|
||||
| `npm run smoke:agent-runtime-current-fixture` | 通过 | 全部 current fixtures 通过;`liveProviderUsed=false`,不作为 live provider 证据 |
|
||||
| `npm run verify:gui-smoke` | 通过 | 真实 Electron renderer、preload/IPC、App Server `1.134.0`、Claw workbench、reload 与 memory settings 通过;证据 `.lime/qc/project-gates/standalone-shell-01-20260824082239-54560/` |
|
||||
| `npm run governance:legacy-report` | 通过 | 零引用、分类漂移、边界违规均为 0 |
|
||||
| `npm run verify:local` | 部分通过 | 前端与大多数门禁通过;旧运行在 Rust workspace 编译阶段暴露问题,已由最终 Rust related 与公共 JSON-RPC 定向测试独立收口 |
|
||||
| App Server production assets build | 通过 | 正式 App Server sidecar assets 构建通过;不等同于完整 Forge release assets |
|
||||
| `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all -- --check` | 通过 | Rust 格式一致 |
|
||||
| `git diff --check` | 通过 | patch hygiene |
|
||||
|
||||
`npm run test:related -- ...` 在 Vitest 收集阶段因目录参数命中 `EISDIR electron`,未进入测试正文;已改用 Agent Runtime Client package 官方入口并通过 24/24。裸 Cargo 曾因 upstream `rusty_v8` archive HTTP 404 失败;仓库 wrapper 使用本地 artifact,相关 Rust 测试已通过。
|
||||
|
||||
本地不宣称 Windows Notification Center、真实 macOS/Windows sleep-resume、Windows installer、签名、公证、完整 Forge release assets 或 live provider 证据;这些由对应平台/CI runner 提供。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI,以及 Browser historical、environment、MCP event stream、Provider capability、Windows sandbox readiness。
|
||||
- `compat`:仅保留仓库中明确标记且不承接新 current 创建路径的迁移边界;本候选不新增 compat wrapper。
|
||||
- `deprecated`:旧 Browser surface、旧 Playwright browser tool 和旧自动化边界按现有治理分类,仅由 current 路径迁出,不作为新发布 owner。
|
||||
- `dead / deleted`:候选中已经删除的脱离构建图脚本和资源继续保持删除状态,不恢复旧 runtime、fallback 或 compat 包装。
|
||||
- 当前完成度:`98% / release-ready`。候选范围、版本、release notes、前端/contracts/Rust/GUI/Gate B/current fixture/治理门禁已完成;仅待已获确认的 release commit、tag、push 与远端复核。
|
||||
@@ -1,53 +0,0 @@
|
||||
# Lime v1.135.0 发布执行计划
|
||||
|
||||
状态:`release-ready / validation-complete`
|
||||
日期:2026-08-25
|
||||
目标版本:`1.135.0`
|
||||
目标 tag:`v1.135.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布当前 `main` 工作树中的 Agent Runtime MCP 生命周期与事件流、环境生命周期、Thread 控制、Provider capability、Strict Review、GUI projection 和多语言测试改动,完成版本事实源、双语单页 release notes、质量门禁及 release commit/tag/push。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划。
|
||||
- `candidate changes`:当前工作树全部 162 个已跟踪 diff 文件与 46 个未跟踪文件,覆盖 Rust agent/app-server/mcp/tool-runtime、App Server protocol/schema、前端 Agent/MCP/Workspace、Electron Gate B、脚本治理、测试、文档与发版 metadata。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动均纳入本轮 release candidate。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.135.0`;双语 release notes 只保留 v1.135.0;目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须通过;按风险执行 contracts、受影响 Rust/前端测试、current fixture、GUI smoke、Electron Gate B 与治理扫描,未执行或失败项原样记录。
|
||||
- staged 内容与候选范围一致;完成 `Release v1.135.0` commit、`v1.135.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
|
||||
## 架构确认
|
||||
|
||||
本轮不新增产品链 owner 或 public boundary;候选继续沿用 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI`。现有架构事实源为 `internal/aiprompts/architecture.md` 与 Codex 对齐执行计划。
|
||||
|
||||
## 验证记录
|
||||
|
||||
| 命令 | 结果 | 证据/说明 |
|
||||
| --- | --- | --- |
|
||||
| `npm run verify:app-version` | 通过 | 根应用、CLI npm 包、Rust workspace、Cargo.lock 与 sidecar 统一为 `1.135.0` |
|
||||
| `npm run typecheck` | 通过 | renderer 与 node TypeScript 发布硬门禁通过 |
|
||||
| `npm run check:protocol-types` | 通过 | 1037 个 definitions、1029 个 generated types,无漂移 |
|
||||
| `npm run test:contracts` | 通过 | 299 项 App Server client 检查及 command/harness/modality/scripts/release/docs 边界通过 |
|
||||
| 前端受影响定向 Vitest | 通过 | 28 个文件、264 项测试通过;覆盖 Agent/MCP/环境/Thread/Strict Review/事件投影与治理边界 |
|
||||
| Electron Gate B 脚本守卫 | 通过 | 8 个文件、27 项测试通过 |
|
||||
| `npm run test:rust:changed` | 通过 | 版本触达 workspace 边界后执行 `cargo test --lib --workspace`,全部 crate unit 通过 |
|
||||
| `npm run verify:gui-smoke` | 通过 | 真实 Electron/preload/IPC/App Server `1.135.0`、Claw workbench reload 与 memory settings 通过;证据 `.lime/qc/project-gates/standalone-shell-01-20260825150650-63360/` |
|
||||
| `npm run smoke:agent-runtime-current-fixture` | 通过 | 全部 current fixture 场景通过;`liveProviderUsed=false` |
|
||||
| `npm run governance:legacy-report` | 通过 | 零引用候选、分类漂移与边界违规均为 0 |
|
||||
| `cargo fmt --manifest-path "lime-rs/Cargo.toml" --all -- --check` | 通过 | Rust 格式一致 |
|
||||
| `git diff --check` | 通过 | patch hygiene |
|
||||
|
||||
`npm run test:changed` 因 workspace 依赖图扩展为 118 个长批次,在 6/118 前主动停止,改用上述 28 文件定向测试并全部通过。Rust workspace、current fixture 与 GUI smoke 初次并发构建曾触发 `install_name_tool cannot rename ... app-server.XXXXXX` artifact 竞态;Rust 测试完成后构建自动串行恢复,最终 current fixture 与 GUI smoke 均通过。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Agent Runtime、App Server JSON-RPC、MCP、环境生命周期、Thread 控制、Provider capability、Strict Review、GUI projection。
|
||||
- `compat`:不新增 compat wrapper;仅保留仓库现有迁移边界。
|
||||
- `deprecated`:不新增 deprecated owner。
|
||||
- `dead / deleted`:不恢复已删除 runtime、fallback、旧 catalog 或 mock 生产路径。
|
||||
- 当前完成度:`98% / release-ready`。候选范围、版本、release notes、TypeScript/contracts/Rust/前端/GUI/current fixture/治理门禁已完成;仅待 release commit、tag、push 与远端复核。
|
||||
@@ -1,57 +0,0 @@
|
||||
# Lime v1.136.0 发布执行计划
|
||||
|
||||
状态:`validation-complete / awaiting-release-confirmation`
|
||||
日期:2026-08-29
|
||||
目标版本:`1.136.0`
|
||||
目标 tag:`v1.136.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布 `v1.135.0` 之后当前分支的 Windows restricted execution、Scheduled Tasks route/provider、Agent Runtime projection 与 Provider transport 改动,完成版本事实源、双语单页 release notes、质量门禁及 release commit/tag/push。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划索引。
|
||||
- `candidate changes`:`main..HEAD` 的 40 个非 merge 提交,以及当前暂存的 87 个文件改动,覆盖 Windows sandbox/tool-runtime、Rust App Server/model-provider、Agent Runtime/GUI、Scheduled Tasks、Electron resource verifier、DeepSWE harness、测试和架构文档。
|
||||
- `excluded changes`:无。用户请求为完整发布,当前工作树改动均纳入本轮候选。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.136.0`;双语 release notes 只保留 v1.136.0;目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须通过;按风险执行 contracts、current fixture、GUI smoke 和受影响 Rust/前端测试,未执行或失败项原样记录。
|
||||
- staged 内容与候选范围一致;完成 `Release v1.136.0` commit、`v1.136.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
|
||||
## 架构确认
|
||||
|
||||
本轮不新增产品链 owner;Windows 执行能力继续归 `tool-runtime`,模型与 Provider 网络归 `model-provider`,会话/投影继续沿用 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI`。架构事实源已在 `internal/aiprompts/architecture.md` 更新并由当前候选纳入。
|
||||
|
||||
## 验证记录
|
||||
|
||||
已完成:
|
||||
|
||||
```text
|
||||
npm run verify:app-version
|
||||
npm run typecheck
|
||||
npm run test:contracts
|
||||
npm run smoke:agent-runtime-current-fixture
|
||||
npm run verify:gui-smoke
|
||||
npm run test:rust:related -- <受影响 Rust 路径>
|
||||
```
|
||||
|
||||
验证结果:
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 均为 `1.136.0`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run test:contracts`:通过,协议生成无漂移,App Server client 299 项及 command/harness/governance/docs 边界通过。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过,覆盖 Agent Runtime current Electron fixture 全集,`liveProviderUsed=false`。
|
||||
- `npm run test:rust:related -- lime-rs/crates/tool-runtime lime-rs/crates/agent lime-rs/crates/app-server lime-rs/crates/model-provider lime-rs/crates/services`:通过,14 个 owner/反向依赖 crate 的 unit tests 全部通过。
|
||||
- `npm run verify:gui-smoke`:通过,真实 Electron Shell-01 `21/21` assertions;App Server `appserver.v0` 版本 `1.136.0`,console/page/invoke/preload/IPC/legacy/mock fallback 错误均为 0。证据:`.lime/qc/project-gates/standalone-shell-01-20260829101933-66941/shell-01-electron-smoke/summary.json`。
|
||||
- `git diff --check`:通过。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Windows restricted execution、Agent Runtime projection、Scheduled Tasks route、Provider transport、真实 Electron/App Server bridge。
|
||||
- `compat`:无新增 compat wrapper。
|
||||
- `deprecated`:无新增 deprecated owner。
|
||||
- `dead / deleted`:不恢复旧 runtime、catalog fallback、mock 生产路径或旧 Windows process supervisor。
|
||||
- 当前完成度:`98%`;版本、notes、候选范围和门禁已完成,仅待用户确认后执行 commit/tag/push 及远端复核。
|
||||
@@ -1,65 +0,0 @@
|
||||
# Lime v1.137.0 发布执行计划
|
||||
|
||||
状态:`release-authorized / commit-tag-push-pending`
|
||||
日期:2026-08-31
|
||||
目标版本:`1.137.0`
|
||||
目标 tag:`v1.137.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布 `v1.136.0` 之后当前工作树中的 Agent Runtime/App Server、MCP 通知、权限 profile、环境选择、线程 fork、Workspace/GUI 与 Electron Gate B 改动,完成版本事实源、双语单页 release notes、质量门禁及 release commit/tag/push。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、`RELEASE_NOTES.md`、`RELEASE_NOTES.en.md`、本计划及执行计划索引。
|
||||
- `candidate changes`:当前工作树中 134 个已跟踪修改和 7 个产品/测试/脚本未跟踪文件,覆盖 App Server/Rust protocol、MCP、Agent Runtime、Workspace/Canvas、Electron bridge、脚本和五语言回归。
|
||||
- `excluded changes`:`local-conversation-page-B5LUHmAw.js`。该文件在 Codex App GUI 对齐计划中标记为只读构建参考,不属于源代码或发布产物。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 根应用、CLI npm 包、Rust workspace 与 Cargo.lock 统一为 `1.137.0`;双语 release notes 只保留 v1.137.0;目标 tag 在写操作前不存在。
|
||||
- `npm run verify:app-version`、`npm run typecheck` 必须通过;按风险执行 `npm run test:contracts`、`npm run verify:gui-smoke`、current fixture 及受影响 Rust/前端定向测试,未执行或失败项原样记录。
|
||||
- staged 内容只包含 release metadata 与 candidate changes,不包含排除的构建参考文件;完成 `Release v1.137.0` commit、`v1.137.0` tag,推送 `main` 和 tag,并复核本地/远端状态。
|
||||
|
||||
## 架构确认
|
||||
|
||||
本轮不新增产品链 owner;权限 profile、MCP 工具生命周期与环境状态继续归 App Server/RuntimeCore 及各 Rust domain owner,Electron 只承接 Desktop Host/IPC,GUI 通过 App Server JSON-RPC 投影读取 Thread/Turn/Item。当前工作树的对齐计划和命令边界更新纳入候选。
|
||||
|
||||
## 验证记录
|
||||
|
||||
已完成:
|
||||
|
||||
```text
|
||||
npm run verify:app-version
|
||||
npm run typecheck
|
||||
npm run test:contracts
|
||||
npm run smoke:agent-runtime-current-fixture
|
||||
npm run verify:gui-smoke
|
||||
npm run test:rust:related -- <受影响 Rust 路径>
|
||||
npm run smoke:thread-fork-electron-gate-b
|
||||
npm run smoke:mcp-list-changed-electron-gate-b
|
||||
node --test packages/agent-runtime-projection/tests/threadSettingsLiveUpdate.test.mjs
|
||||
npx vitest run <受影响前端测试文件>
|
||||
git diff --check
|
||||
```
|
||||
|
||||
验证结果:
|
||||
|
||||
- `npm run verify:app-version`:通过,根应用、CLI npm 包、Rust workspace 与 Cargo.lock 均为 `1.137.0`。
|
||||
- `npm run typecheck`:通过,renderer 与 node TypeScript 均无错误。
|
||||
- `npm run test:contracts`:通过,协议生成无漂移,App Server client 299 项及 command/harness/governance/docs 边界通过。
|
||||
- `npm run test:rust:related -- lime-rs/crates/agent lime-rs/crates/app-server-protocol lime-rs/crates/app-server lime-rs/crates/mcp`:通过,相关 crate 与反向依赖 unit tests 全部通过。
|
||||
- `npx vitest run <受影响前端测试文件>`:23 个 suite、398 个断言通过;Node 原生 `threadSettingsLiveUpdate` 另以 `node --test` 运行 8/8 通过。
|
||||
- `npm run verify:gui-smoke`:通过,真实 Electron Shell-01;App Server `appserver.v0` 版本 `1.137.0`,preload/IPC/页面/console 错误均为 0。证据:`.lime/qc/project-gates/standalone-shell-01-20260831011954-42452/shell-01-electron-smoke/summary.json`。
|
||||
- `npm run smoke:agent-runtime-current-fixture`:通过,覆盖 current Agent Runtime Electron fixture 全集,`liveProviderUsed=false`。
|
||||
- `npm run smoke:thread-fork-electron-gate-b`:通过,证明 GUI fork、Thread lineage、read/resume 和 current JSON-RPC bridge。
|
||||
- `npm run smoke:mcp-list-changed-electron-gate-b`:首次因脚本未统计 direct preload 调用而误报 `缺少 app_server_handle_json_lines`;修复观测逻辑后复跑通过,三种 MCP list-changed 通知和动态目录均可见,`mockFallbackHitCount=0`,证据:`.lime/qc/gui-evidence/mcp-list-changed-electron-gate-b/mcp-list-changed-electron-gate-b-summary.json`。
|
||||
- `git diff --check`:通过。
|
||||
|
||||
## 收尾记录
|
||||
|
||||
- `current`:Agent Runtime canonical projection、MCP list-changed notification、permission profile policy、thread fork/environment state、真实 Electron/App Server bridge、Workspace activity/Right Surface。
|
||||
- `compat`:无新增 compat wrapper。
|
||||
- `deprecated`:无新增 deprecated owner。
|
||||
- `dead / deleted`:不纳入构建参考文件,不恢复旧 runtime、catalog fallback 或生产 mock 路径。
|
||||
- 当前完成度:`99%`;候选范围、版本元数据、release notes 和全部默认门禁已完成,已获得用户确认,正在执行 commit/tag/push 及远端复核。
|
||||
@@ -0,0 +1,49 @@
|
||||
# Lime v1.139.0 发布执行计划
|
||||
|
||||
状态:`ready_for_release / local quality gates passed`
|
||||
日期:2026-09-03
|
||||
目标版本:`1.139.0`
|
||||
目标 tag:`v1.139.0`
|
||||
|
||||
## 主目标
|
||||
|
||||
发布 `v1.138.0` 之后当前工作树中的 Feature Map、文档事实源收敛、SceneApp / `src-tauri` 全面退役、Plugin/App Server/RuntimeCore owner 替换、跨平台 Desktop Host 证据、model-provider 路由与 Curated Task / Memory 改动,完成质量门禁、release commit、tag、main 推送和远端复核。
|
||||
|
||||
## Release Candidate
|
||||
|
||||
- `release metadata`:`package.json`、`packages/lime-cli-npm/package.json`、`lime-rs/Cargo.toml`、`lime-rs/Cargo.lock`、双语 `RELEASE_NOTES` 与本计划。
|
||||
- `candidate changes`:当前工作树中的全部已跟踪产品、文档、测试、schema、workflow 与脚本改动,以及新增 Feature Map、model-provider reasoning effort、Desktop Host Gate B 脚本和 Curated Task 结果基线源码。
|
||||
- `excluded changes`:`.lime/**`、`.gstack/**`、`dist/**`、`dist-electron/**` 与本地生成缓存;根目录 4 个压缩 bundle 构建碎片已物理删除,不进入候选。
|
||||
|
||||
## 架构确认
|
||||
|
||||
本轮重大架构变更已同步到 `internal/aiprompts/architecture.md`:应用目录归 Plugin,业务主链保持 `Electron Desktop Host -> App Server JSON-RPC -> RuntimeCore -> Thread/Turn/Item projection -> GUI`;SceneApp、`src-tauri` 与 Tauri capability 不保留第二套 owner。责任开发者确认:root / Codex,2026-09-03。
|
||||
|
||||
## 退出条件
|
||||
|
||||
- 四个版本事实源统一为 `1.139.0`,双语 Release Notes 只保留本版本,本地和远端 tag 在创建前不存在。
|
||||
- 通过版本、TypeScript、i18n、contracts、文档、治理、Rust related、GUI smoke、前端续跑与 `git diff --check` 门禁。
|
||||
- staged 内容覆盖全部 release candidate;完成 `Release v1.139.0` commit、`v1.139.0` tag,非强制推送到 `origin/main` 与 tag,并复核 GitHub workflow / Release 状态。
|
||||
|
||||
## 验证记录
|
||||
|
||||
- `npm run verify:app-version`:通过;根应用、CLI npm 包、Rust workspace 与 Cargo lock 均为 `1.139.0`。
|
||||
- `npm run typecheck`、`npm run i18n:check`:通过;五语言资源 missing / extra 均为 0。
|
||||
- `npm run docs:boundary`、`npm run harness:doc-freshness`、全仓 Markdown 本地链接扫描:通过;SceneApp / `src-tauri` 实体路径为 0。
|
||||
- `npm run governance:scripts`、`npm run governance:legacy-report`:通过;零引用候选、分类漂移、边界违规均为 0。
|
||||
- `npm run test:contracts`:通过;App Server client 共 299 checks,command、modality、release workflow、cleanup 与文档边界合同均通过。
|
||||
- `cargo fmt --all -- --check` 与 `npm run test:rust:related -- <changed Rust paths>`:通过;19 个相关 crate 全绿。
|
||||
- Resource Manager / i18n / window 定向测试:9/9 通过。
|
||||
- `npm run test:resume`:通过;`.lime/test/vitest-smart-last-run.json` 记录 Frontend Full `118/118` 批完成,最终状态 `passed`。
|
||||
- `npm run verify:gui-smoke`:通过;run id `standalone-shell-01-20260902171042-60925`,真实 Electron/App Server `protocol=appserver.v0 version=1.139.0`,结果 `pass`。
|
||||
- `git diff --check`:通过。
|
||||
- 发布前远端复核:本地 `HEAD`、`origin/main` 与 merge base 均为 `8413925fe`,双向差异 `0/0`;本地和远端均无 `v1.139.0` tag。
|
||||
|
||||
## 收尾分类
|
||||
|
||||
- `current`:Feature Map、Plugin、Electron Desktop Host、App Server JSON-RPC、RuntimeCore / Agent Runtime、model-provider、Curated Task / Memory。
|
||||
- `compat`:无新增。
|
||||
- `deprecated`:无新增。
|
||||
- `dead / deleted`:SceneApp、`src-tauri`、Tauri capability/schema、测试专用 WebviewWindow 生产入口及被替代历史文档。
|
||||
|
||||
当前完成度:`95%`;清理、替换、版本元数据和本地质量门禁完成,待 release commit、tag、main/tag 推送及 GitHub Quality / Release 复核。
|
||||
@@ -361,7 +361,7 @@ git diff --check
|
||||
|
||||
- `current`:`scheduledTask/* -> App Server -> scheduler -> RuntimeCore -> Thread/Turn/Item -> Agent Run -> GUI`;`automation_jobs` 与 `AutomationJob` DAO 仅是 current 内部存储映射,`TaskSchedule::{Every,Cron,At}` 仅是 scheduler lowering。
|
||||
- `compat`:Base Setup / Service Skill 的 `automation_job` binding family 仍有真实消费者,只允许边界委托和一次性迁移,不得扩展第二套任务协议。
|
||||
- `dead / deleted / forbidden-to-restore`:旧 Automation public method/schema/client、页面、Settings tab、renderer projection、smoke 与旧 i18n consumer;`browser_session` 自动任务、SceneApp automation context、生产 mock fallback、renderer timer。
|
||||
- `dead / deleted / forbidden-to-restore`:旧 Automation public method/schema/client、页面、Settings tab、renderer projection、smoke 与旧 i18n consumer;`browser_session` 自动任务、已退役应用编排 context、生产 mock fallback、renderer timer。
|
||||
- 不建立新的长期 compat owner;现有 compat taxonomy 必须继续向 Scheduled Task current API 收敛。
|
||||
|
||||
## 阶段
|
||||
|
||||
@@ -49,9 +49,9 @@ memory.soul
|
||||
- UI descriptor 只携带 `surface / phase / riskLevel / styleLevel / profileId / packId / toneVariant / facts`,本地渲染默认使用 neutral copy。
|
||||
- 四种内置风格只是 built-in seed pack,不能成为组件里的 hard-coded switch;已收敛为 `src/lib/soul/style-profiles/packs/*.json` manifest + registry loader,公共 `style-profiles` barrel 不再导出 built-in profile 列表或旧 helper,运行时只认 registry / resolver 输出。
|
||||
|
||||
## 1.2 与 Codex-first refactor/v1 对齐
|
||||
## 1.2 与 current Thread / Turn / Item 主链对齐
|
||||
|
||||
Soul 不再被视为独立 runtime、第二套 transcript 或 UI 文案系统。后续所有 Soul 输出面必须挂到 `/internal/research/refactor/v1` 的 current 主链:
|
||||
Soul 不再被视为独立 runtime、第二套 transcript 或 UI 文案系统。后续所有 Soul 输出面必须服从 `internal/aiprompts/architecture.md` 与 `internal/aiprompts/query-loop.md` 的 current 主链:
|
||||
|
||||
```text
|
||||
Thread -> Turn -> RuntimeEvent -> Item/read model -> GUI projection
|
||||
@@ -470,7 +470,7 @@ npm run verify:gui-smoke
|
||||
- 实施 P1.5 Style Pack 设置页骨架:新增 `soulStylePack/list`,App Server list read model 返回 installed / disabled 包的 manifest、locale resources、profile ids 与状态;前端 API 网关、generated protocol 与 schema fixture 同步。设置页新增 `StyleProfileSection`,通过 `listSoulStylePacks()` 构造 registry、动态注入本地包 settings 资源,并在当前保存 profile 被禁用 / 卸载 / 未加载时回退默认 built-in profile;`StyleProfileSelector` 增加本地包管理区,支持 manifest + 五语言 locale 文件导入、启用、禁用、disabled / installed uninstall。
|
||||
- 验证通过:`cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server-protocol catalog -- --nocapture`,8 tests passed;`CARGO_TARGET_DIR="/tmp/lime-soul-style-pack-list-schema-target" cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server-protocol schema_fixtures -- --nocapture`,4 tests passed;`npm run generate:protocol-types`;`npm run check:protocol-types`;`cargo check --manifest-path "lime-rs/Cargo.toml" -p app-server --lib`;`cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server --lib runtime::soul -- --nocapture`,23 tests passed;`npm exec vitest run "src/lib/api/soulStylePacks.test.ts" "src/components/settings-v2/general/memory/soul/StyleProfileSelector.test.tsx" "src/components/settings-v2/general/memory/index.test.tsx" "src/lib/soul/style-profiles/styleProfiles.unit.test.ts" "src/i18n/__tests__/loadNamespace.test.ts"`,5 files / 40 tests passed;`npm run typecheck` 通过;`npm run test:contracts` 通过;相关 Rust 文件 `rustfmt --edition 2021 --check` 通过。`app-server` Soul 测试期间出现 `tool-runtime` 未使用 import warning,属于当前工作树其它 native tool 清理残留,不是 Style Pack list 回归。
|
||||
- 补跑骨架级 GUI smoke:`npm run verify:gui-smoke` 通过,Electron smoke 输出 `renderer loaded`、`app-server initialized protocol=appserver.v0 version=1.93.0`、`claw workbench shell ready`、`memory settings ready`;这证明设置页骨架进入真实 Electron Desktop Host / App Server current 启动链。该证据不替代安装真实风格包后在 Claw 中选择 profile 并验证 transcript 差异的 Playwright / Claw 体验验收。
|
||||
- 实施 P6 media / contentParts MessageList 骨架:对齐 `/internal/research/refactor/v1`,把 App Server `agent_message.contentParts` 的 media reference 接到 `Message.contentParts` / streaming sync / `StreamingRenderer`,显示为五语言 media reference card;inline `data:` URI fail closed,不把 provider wire payload 或正文文案当 GUI 媒体事实源。
|
||||
- 实施 P6 media / contentParts MessageList 骨架:对齐 current Thread / Turn / Item 主链,把 App Server `agent_message.contentParts` 的 media reference 接到 `Message.contentParts` / streaming sync / `StreamingRenderer`,显示为五语言 media reference card;inline `data:` URI fail closed,不把 provider wire payload 或正文文案当 GUI 媒体事实源。
|
||||
- 验证通过:`TMPDIR="/tmp" XDG_CACHE_HOME="/tmp/lime-codex-xdg-cache" npm_config_cache="/tmp/lime-codex-npm-cache" npm exec vitest run "src/components/agent/chat/hooks/agentThreadMessageContentParts.unit.test.ts" "src/components/agent/chat/hooks/agentStreamAgentMessageContentSync.unit.test.ts" "src/components/agent/chat/hooks/agentChatHistory.timeline.test.ts" "src/components/agent/chat/components/StreamingRenderer.test.tsx" "src/components/agent/chat/components/messageListItemProjection.contentParts.unit.test.ts"`,5 files / 50 tests passed;`npm exec vitest run "src/i18n/__tests__/loadNamespace.test.ts"`,1 file / 9 tests passed;`npm exec tsc -- --noEmit --project "tsconfig.renderer.json" --pretty false` 通过且无输出。该步当时只标记 MessageList renderer skeleton;后续 `media-reference` current Electron fixture 已补真实 GUI 骨架验证。
|
||||
- 实施 P6 media / contentParts Workbench preview target 骨架:`StreamingMediaReferenceCard` 在有 handler 时成为可打开卡片,`MessageAssistantBody` 将点击映射到 `MessagePreviewTarget.kind = "media_reference"`,`AgentChatWorkspace` 复用 general artifact preview;direct image/audio/video URI 生成 media artifact,`sidecar://` 等引用生成五语言 markdown metadata fallback,避免前端展开 provider payload。
|
||||
- 验证通过:`npm exec vitest run "src/components/agent/chat/components/StreamingRenderer.test.tsx" "src/components/agent/chat/components/MessageList.mediaTasks.test.tsx" "src/components/agent/chat/workspace/agentChatWorkspaceHelpers.unit.test.ts"`,3 files / 73 tests passed;`npm exec vitest run "src/i18n/__tests__/loadNamespace.test.ts"`,1 file / 9 tests passed;`npm exec tsc -- --noEmit --project "tsconfig.renderer.json" --pretty false` 通过且无输出。该步当时只标记 preview target skeleton;后续 `media-reference` current Electron fixture 已补真实 GUI 骨架验证,完整 sidecar/source owner 与 Workbench media source preview 仍 pending。
|
||||
|
||||
@@ -31,11 +31,11 @@
|
||||
| CCD-006 | 2026-04-20 | Config / Host Surface | 参考运行时架构图复盘后确认:Lime 的 `ConfigTool` 宿主配置矩阵仍未补齐,但 `classifierPermissionsEnabled` 已接入 `current` 主链并与安全扫描 ML toggle 打通;进一步审计后又确认 `remoteControlAtStartup` 不能映射到现有 `get_auto_launch_status / set_auto_launch`,`taskCompleteNotifEnabled / inputNeededNotifEnabled / agentPushNotifEnabled` 也不能映射到更新提醒窗口或已下线的 `channels_cmd.rs` stub。`permissions.defaultMode` 这轮也已进一步收紧:prompt 层虽有 `PermissionMode::Plan / DontAsk` 文本能力,但 `plan` 仍只是显式 `EnterPlanMode / ExitPlanMode` 工具流,`dontAsk` 也还缺 provider flag 与 `PermissionInspector` 的全局 runtime 语义 | 若停在当前状态,`Config` 虽然不再把 classifier 开关卡死在 `unsupported`,但 remote-control / push-notification / permission-mode 仍无法通过 `current` 配置面真实控制;更糟的是,后续实现者容易把 OS auto-launch、更新提醒、plan prompt 文本或 stub notification CRUD 误判成可复用事实源,继续制造假对齐 | 已完成“真实宿主落点”与 `permissions.defaultMode` 执行语义审计;下一小步进一步收敛为二选一:要么新增真正的 remote-control / mobile push / dontAsk runtime 宿主面并把 `plan` 重构为可持久化权限模式,要么把这组差异明确沉淀为产品层不对齐;并继续明确 `channels_cmd.rs` 已非可复用宿主面,不再参与这组 setting 的事实源判断 | `internal/exec-plans/upstream-runtime-alignment-progress.md` | 进行中 |
|
||||
| CCD-007 | 2026-04-20 | Team / Peer Messaging | `SendMessage / ListPeers` 已从“只支持 team 内 peers”收口到“team peers + synthetic `uds:<session-id>` 本机会话 peers”的 live-aware `current`:`ListPeers` 会优先返回同一 `working_dir` 下 active / queued 的本机顶层 session,不足时才回退最近 session;对照参考仓库 `peerAddress.ts` 与 `SendMessageTool` 后,本地 peer surface 也已重新收口为“仅通过 `send_to=uds:<session-id>` 暴露 peer address”,`SendMessage` 只把显式 `uds:<session-id>` 识别为 cross-session local peer 路由,不再把 bare local `session_id` 当成 peer address fallback。Lime 仍使用 synthetic local registry,而不是真实 UDS/socket peer transport;`bridge:` 也继续明确留在 gap | 当前 misleading surface 已清掉:Lime 不再是“识别 `uds:` 但永远失败”的半成品,也不再把 bare session-id 误扩成参考运行时不存在的 peer address。剩余差距已被显式压回 `session registry / local ingress / remote bridge ingress` 产品 gap,不再继续污染 current 边界 | 后续若产品明确需要真实 local ingress 或 remote peer messaging,应另开新专题,围绕显式 session registry / transport host 设计推进;在那之前,`CCD-007` 只维护当前 `uds:<session-id>` synthetic local peer current,不再扩展裸地址或假 bridge surface | `internal/exec-plans/upstream-runtime-alignment-progress.md` | 已完成 |
|
||||
| CCD-008 | 2026-04-20 | Extension / Hook / Skill | `SkillTool`、project/plugin/session hooks、plugin skills/hooks/agents、plugin cache resolver 与 child worktree lifecycle 已陆续进入 `current` 主链;近几轮又继续补上了 `PermissionRequest.updatedPermissions` 的 session `setMode` 最小 current 子集、managed-session peer messaging、lead-side `shutdown_response` current subset、peer message display / cards / lifecycle-noise 收口,以及 lead-side current team context 下 `name + mode=plan` 命中 teammate plan lifecycle 的最小 honest reachability | 若停在当前状态,Lime 已不再是“plugin 只能带技能、不能真正带 runtime hooks”“压缩前完全绕过 hooks”“权限审批仍完全绕过 hooks”“turn 正常结束完全绕过 Stop hooks”“删除 session 完全绕过 SessionEnd hooks”“lead/team 已有 plan host 却仍被入口挡在外面”“peer 消息进了 runtime 却仍把 XML / lifecycle noise 原样暴露给主聊天”的假对齐;但扩展体系仍停留在“`SessionStart(clear)` 与 `SessionEnd.resume / clear / prompt_input_exit / logout / bypass_permissions_disabled` 仍无真实 current 宿主、`Stop` 仍缺 continuation gate、`PermissionRequest.updatedPermissions` 的 rules / directories / non-session destination 仍无 honest host、`isolation=remote` 与非 team child `plan` lifecycle 仍无 honest host、且 `hook.if / asyncRewake / 非 bash shell / allowedEnvVars` 仍显式未支持”的阶段 | 已完成 lead-side current team context 下 teammate `plan` reachability 收口;下一小步优先回到 `isolation=remote`,或只在未来真的补齐非 team child lifecycle / permission host 后再继续扩 `plan` 与 `updatedPermissions` 边界 | `internal/exec-plans/upstream-runtime-alignment-progress.md` | 进行中 |
|
||||
| CCD-009 | 2026-04-20 | Remote Governance / Legacy Surface | 参考运行时对比后再次确认:`channels_cmd.rs` 这组 AI / 通知渠道 CRUD 基本仍是空壳,但仓库 current remote 事实源已经固定到 `gateway_channel_* + browser connector / ChromeBridge`;本轮已确认 `ImConfigPage` 走的是 `channelsRuntime.ts -> gateway_channel_*` current API,不依赖 `channels_cmd.rs` 旧 CRUD 命令,并已完成宿主面下线:移除 `runner.rs` 注册、移除 `commands/mod.rs` 模块声明、删除 `channels_cmd.rs` 文件本体,同时补上 `legacySurfaceCatalog` 的命令组与 Rust 文本守卫 | 若不下线,Rust 侧注册与 stub 文件会继续制造“仓库还有另一套可用渠道管理面”的误导,影响 remote 主链收口;现已通过删除与守卫把这类误导性 surface 从宿主编译图中清出 | 已完成删除后的最小验证:`legacySurfaceCatalog.test.ts`、`governance:legacy-report`、`test:contracts`、`cargo check --manifest-path src-tauri/Cargo.toml -p lime --lib` 均通过;下一步回到 `CCD-007`,继续判断 `SendMessage / ListPeers` 的 `uds:` / `bridge:` cross-session peer transport 是否应进入 `current` | `internal/aiprompts/remote-runtime.md` | 已完成 |
|
||||
| CCD-009 | 2026-04-20 | Remote Governance / Legacy Surface | 参考运行时对比后再次确认:`channels_cmd.rs` 这组 AI / 通知渠道 CRUD 基本仍是空壳,但仓库 current remote 事实源已经固定到 `gateway_channel_* + browser connector / ChromeBridge`;本轮已确认 `ImConfigPage` 走的是 `channelsRuntime.ts -> gateway_channel_*` current API,不依赖 `channels_cmd.rs` 旧 CRUD 命令,并已完成宿主面下线:移除 `runner.rs` 注册、移除 `commands/mod.rs` 模块声明、删除 `channels_cmd.rs` 文件本体,同时补上 `legacySurfaceCatalog` 的命令组与 Rust 文本守卫 | 若不下线,Rust 侧注册与 stub 文件会继续制造“仓库还有另一套可用渠道管理面”的误导,影响 remote 主链收口;现已通过删除与守卫把这类误导性 surface 从宿主编译图中清出 | 已完成删除后的最小验证:`legacySurfaceCatalog.test.ts`、`governance:legacy-report`、`test:contracts`、`cargo check --manifest-path lime-rs/Cargo.toml --workspace` 均通过;下一步回到 `CCD-007`,继续判断 `SendMessage / ListPeers` 的 `uds:` / `bridge:` cross-session peer transport 是否应进入 `current` | `internal/aiprompts/remote-runtime.md` | 已完成 |
|
||||
| CCD-010 | 2026-04-20 | Resources / Library | 资料库页过去同时存在“大 Hero + 页面级添加入口 + 侧栏新建入口 + 空态动作卡 + store selector / page 各写一套搜索排序分类规则”的旧心智;当前已把资料库 current 主链收窄为“项目切换 / 分类切换 / 搜索排序 / 浏览打开 / 重命名删除 / 图片视图上传插入”,并新增 `resourceQueries` 作为目录视图、分类视图与目录派生状态共用的查询事实源;同时已删掉 `selectors` 中间层,把内容区顶部收成“控制栏 + 当前范围状态条”一套壳,并把跨项目媒体提示并入当前范围状态条、移除内容列表头里的重复最近更新徽标;本轮继续沿主链做减法,把顶部剩余的文件夹 / 内容项 / 最近更新三张统计卡收薄为贴近项目切换的一条只读摘要,并把这组项目级派生进一步收回 `resourceQueries`,避免页面层再保留平行统计逻辑 | 若停在旧状态,后续实现者会继续在页面和 selector 两侧分别补过滤/分类规则,导致资料库行为漂移,也容易把已删除的页面级创建入口或重复状态壳重新接回 current 主链;顶部总览若继续保留独立统计卡,后续改动也容易在 Hero、状态条和分页脚三处重新长出不同口径的数量文案 | 下一小步继续判断这条项目只读摘要是否还应下沉到左侧“资料库切换”卡,彻底把项目级信息和范围级信息拆开;若新增范围派生文案或查询规则,只允许落到 `src/components/resources/services/resourceQueries.ts` 与当前范围状态条,不再把范围说明或结果统计回灌到 Hero | `src/components/resources/ResourcesPage.tsx` / `src/components/resources/services/resourceQueries.ts` | 进行中 |
|
||||
| CCD-011 | 2026-05-09 | Task Center / Root Patch Scripts | 根目录遗留 `patch_dark.js`、`patch_flare.js`、`patch_navbar.js` 只是一次性字符串替换脚本;当前 Task Center Chrome 样式已收敛到 `ChatNavbar.tsx` 的 token 化主链,脚本目标 `taskCenterChromeShellClassName` 已不再存在 | 继续保留会让后续开发误判为可运行维护脚本,并可能把旧的字符串替换方式重新带回 UI 主链 | 已删除 3 个脚本,并在 `legacySurfaceCatalog` 中补 `root-task-center-patch-scripts` 守卫;后续不得恢复根目录补丁脚本式 UI 修改,Task Center 样式只沿现有组件和 token 主链演进 | `src/components/agent/chat/components/ChatNavbar.tsx` | 已完成 |
|
||||
| CCD-012 | 2026-06-09 | Frontend DevBridge / Command Governance | `src/lib/dev-bridge/**` 容易被误判为旧 Rust / Tauri DevBridge 的同类退场对象;当前实际应拆成 `current` renderer bridge(`safeInvoke`、HTTP client、`app_server_handle_json_lines`、事件监听、可用性探测)与 `compat / deprecated` 命令 policy / mock fallback 两部分治理。后续治理事实源已固定到本条执行规则与 production command current 迁移计划,不以聊天、handoff 或临时计划备注为准 | 若后续清命令时整目录删除,会破坏 Electron Desktop Host / App Server JSON-RPC 的 renderer 传输链;若继续把已迁旧命令留在 `commandPolicy.ts`、`mockPriorityCommands.ts`、desktop-host mock 或旧 smoke 正向证据中,又会让 retired 命令通过 mock / policy 回流成假 current | 后续每个命令组迁到 App Server / Electron Desktop Host current 后,同轮检查并收缩 `commandPolicy.ts`、`mockPriorityCommands.ts`、desktop-host mock、旧 smoke、catalog 和 retired guard;删不动且跨命令组长期存在的 legacy command policy / mock residual 必须同时登记到对应执行计划和本条 `CCD-012`,写清命令名、阻塞文件、分类、退出条件和下一次验证入口。下一小步按 `internal/exec-plans/production-command-current-migration-plan.md` 当前主线优先处理 P6 session files 工作台写读链或 P14 recording / transcription / polish / output side-effect,并把残留旧命令字符串分类为 `compat / deprecated`、`dead / retired guard-only` 或 `test-only`,不得只写“后续清理” | `internal/aiprompts/governance.md` / `internal/aiprompts/commands.md` / `internal/aiprompts/parallel-agent-collaboration.md` / `internal/aiprompts/quality-workflow.md` / `internal/roadmap/appserver/README.md` / `internal/exec-plans/production-command-current-migration-plan.md` | 进行中 |
|
||||
| CCD-013 | 2026-06-10 | Rust 主 crate / Tauri Wrapper | `lime-rs/src/**` 是脱离 cargo 构建图的孤儿目录(workspace 只含 `crates/*`,`src/` 没有 `lib.rs` / `main.rs` 也没有 `[package]` 段),曾沉积约 18.7 万行 / 113 个 `#[tauri::command]` / 19 个 `*_cmd.rs`,过去几天通过 50+ 个 TW-Q* 子任务串行抠删 | 持续制造治理噪音、误导接手 Agent、长期占据并行进程精力;删除是纯文本操作 | 已物理删除整个目录(含 `commands/services/dev_bridge/app/agent/skills/voice/tray/config/theme/data/tests/agent_tools` 与顶层 6 个 `.rs`),唯一活引用 `agent_tools/{catalog,execution,inventory}.rs` 已迁到 `lime-rs/crates/agent/src/agent_tools/`;3 份相关执行计划标 superseded;治理脚本 `check-app-server-client-contract.mjs` 删 16 个失效 invariant、`check-harness-contracts.mjs` 删 backend mapping 部分、`legacyToolPermissionGuard.test.ts` 移除 `lime-rs/src` 扫描根、`rustCommandsCurrentBoundary.test.ts` 重写为目录不可恢复守卫;AGENTS.md 12/13 条收紧;验证:`cargo check --workspace` 通过、`npm run test:contracts` 全过、`npx vitest run src/lib/governance` 187/187 通过 | `internal/exec-plans/tauri-wrapper-quick-cleanup-queue.md`(superseded)/ `internal/exec-plans/tauri-wrapper-command-inventory.md`(superseded)/ `internal/exec-plans/rust-commands-current-migration-cleanup-plan.md`(superseded)/ `src/lib/governance/rustCommandsCurrentBoundary.test.ts` | 已完成 |
|
||||
| CCD-013 | 2026-06-10 | Rust retired wrapper | `lime-rs/src/**` 是脱离 cargo 构建图的孤儿目录(workspace 只含 `crates/*`,`src/` 没有 `lib.rs` / `main.rs` 也没有 `[package]` 段),曾沉积约 18.7 万行 / 113 个 `#[tauri::command]` / 19 个 `*_cmd.rs`,过去几天通过 50+ 个 TW-Q* 子任务串行抠删 | 持续制造治理噪音、误导接手 Agent、长期占据并行进程精力;删除是纯文本操作 | 已物理删除整个目录(含 `commands/services/dev_bridge/app/agent/skills/voice/tray/config/theme/data/tests/agent_tools` 与顶层 6 个 `.rs`),唯一活引用 `agent_tools/{catalog,execution,inventory}.rs` 已迁到 `lime-rs/crates/agent/src/agent_tools/`;3 份相关执行计划标 superseded;治理脚本 `check-app-server-client-contract.mjs` 删 16 个失效 invariant、`check-harness-contracts.mjs` 删 backend mapping 部分、`legacyToolPermissionGuard.test.ts` 移除 `lime-rs/src` 扫描根、`rustCommandsCurrentBoundary.test.ts` 重写为目录不可恢复守卫;AGENTS.md 12/13 条收紧;验证:`cargo check --workspace` 通过、`npm run test:contracts` 全过、`npx vitest run src/lib/governance` 187/187 通过 | `internal/exec-plans/tauri-wrapper-quick-cleanup-queue.md`(superseded)/ `internal/exec-plans/tauri-wrapper-command-inventory.md`(superseded)/ `src/lib/governance/rustCommandsCurrentBoundary.test.ts` | 已完成 |
|
||||
| CCD-014 | 2026-06-16 | Canvas Workbench 测试拆分 | `src/components/agent/chat/components/CanvasWorkbenchLayout.coding.test.tsx` 已达 `1534` 行,超过非生成代码文件 `1000` 行硬阈值;本轮只为普通文件预览不显示审查入口调整既有回归断言,没有同步拆分该测试文件 | 继续往单个挂载测试文件追加场景会降低定位效率,也会让文件预览、变更审查、浏览器 / 终端工具标签、Git 基准选择等不同职责混在同一测试面里 | 下一次触碰 Canvas Workbench coding 测试时,先按职责拆出 `CanvasWorkbenchLayout.filePreview.test.tsx`、`CanvasWorkbenchLayout.review.test.tsx`、`CanvasWorkbenchLayout.toolTabs.test.tsx` 或等价分区;保留共享 fixture,不把新的业务分支继续堆进当前巨型文件。退出条件:当前文件降到 `1000` 行以下,或有明确分区计划覆盖新增测试入口 | `src/components/agent/chat/components/CanvasWorkbenchLayout.coding.test.tsx` / `src/components/agent/chat/components/CanvasWorkbenchLayout.testFixtures.tsx` | 待处理 |
|
||||
| CCD-015 | 2026-06-16 | Claw 历史消息渲染测试拆分 | `src/components/agent/chat/components/MessageList.test.tsx` 已达 `8306` 行,`src/components/agent/chat/components/messageListItemProjection.ts` 已达 `1143` 行,`messageListItemProjection.unit.test.ts` 也已超过 `1000` 行;本轮为修复旧会话重新打开后 `content=""` 但 `contentParts` 含最终正文时首帧空白的问题,只追加最小投影与组件回归,没有同步拆分 | 历史 hydrate、timeline 延迟、contentParts 投影、工具轨迹和消息正文可见性继续堆在同一大测试面,后续定位回归会变慢,也容易把可纯化投影逻辑重新塞回挂载测试 | 下一次触碰历史消息 / MessageList hydrate 回归时,先拆出 `MessageList.historyHydration.test.tsx` 或等价 fixture 分区,并把 `messageListItemProjection.ts` 中历史正文提取、过程分离和 renderer 参数投影继续下沉到小型 selector/helper;退出条件:新增历史回归不再进入 `MessageList.test.tsx`,投影文件降到 `1000` 行以下或完成明确职责拆分 | `src/components/agent/chat/components/MessageList.test.tsx` / `src/components/agent/chat/components/messageListItemProjection.ts` / `src/components/agent/chat/components/messageListItemProjection.unit.test.ts` | 待处理 |
|
||||
| CCD-016 | 2026-06-16 | Workspace Conversation runtime hook 拆分 | 已拆出 `useWorkspaceTaskRailRuntime` 承接任务轨道 props、输出路径解析和 HITL read model 输入;已拆出 `useSessionRuntimeProjectionDeferral` 承接历史恢复期运行投影延迟;`useWorkspaceConversationSceneRuntime.tsx` 从 `1024` 行降到 `922` 行 | 任务轨道和恢复投影不再继续堆进主场景 hook,后续补 run control surface 时定位边界更清楚;主 hook 仍同时承载 coding workbench、navbar、message list、canvas shell 等接线,后续大功能继续拆分仍有收益 | 已完成本条退出条件;下一次如果继续扩展 coding workbench / canvas shell 接线,优先按职责拆出对应 hook,避免主 hook 重新超过 `1000` 行 | `src/components/agent/chat/workspace/useWorkspaceConversationSceneRuntime.tsx` / `src/components/agent/chat/workspace/useWorkspaceTaskRailRuntime.ts` / `src/components/agent/chat/workspace/useSessionRuntimeProjectionDeferral.ts` | 已完成 |
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# Writing v2 Workflow 完成计划
|
||||
|
||||
更新时间:2026-07-06
|
||||
状态:Active
|
||||
更新时间:2026-09-02
|
||||
状态:Active(已按 Plugin v3 版本替换重新基线)
|
||||
路线图:`internal/roadmap/Writing/v2/`
|
||||
|
||||
## 目标
|
||||
|
||||
把 `@写文章` 从“一次性 worker 输出后集中投影 / fixture 假完成”升级为“内容工厂 workflow contract 编排 + 普通 Agent 对话流 + 段落级 article artifact + 后台 workflow JSONL 审计”。最终完成态必须满足:
|
||||
把 `@写文章` 从旧版本的一次性插件执行输出,重新收敛到 Plugin v3 的 typed activation snapshot、普通 Agent turn、段落级 article artifact 和后台 workflow JSONL 审计。最终完成态必须满足:
|
||||
|
||||
- 流程由内容工厂插件 manifest / activation request 声明,Lime 宿主不硬编码内容工厂业务步骤。
|
||||
- `@写文章` 首发必须走普通 Agent turn,保留自然引导、思考 / 工具过程和自然总结;Plugin worker / pane action 不能绕过普通对话。
|
||||
- `@写文章` 首发必须走普通 Agent turn,保留自然引导、思考 / 工具过程和自然总结;旧 Plugin 执行器 / pane action 不能绕过普通对话。
|
||||
- 正文生成、标题、大纲、引用组织等内容工厂领域逻辑必须来自内容工厂 Plugin / workflow contract / host-managed generation 边界,不新增 App Server 宿主 `content_factory_*` 模板模块。
|
||||
- workflow run / step / tool / connector / hook / evidence 只写入 append-only JSONL 审计日志,不进入普通用户 UI。
|
||||
- `agentSession/read` 只恢复 artifact / workspace patch / Article Editor,不返回 UI-facing workflow run / step 列表。
|
||||
@@ -17,7 +17,28 @@
|
||||
- 最终文章仍进入 `ArtifactFrame(articleArtifacts)` 与右侧 Article Editor,不回退普通 assistant 长文。
|
||||
- 右侧 Article Workspace 不自动打开;只有用户点击文章产物或显式动作才打开。
|
||||
|
||||
## 2026-07-05 当前校正
|
||||
## 2026-09-02 版本替换基线
|
||||
|
||||
本计划早期条目记录了已经被 Plugin v3 替换的 package worker、旧 runtime manifest、旧发布脚本和旧 production evidence。它们只作为历史证据保留,不是当前执行入口;当前仓库没有可继续演进的独立内容工厂 worker owner,也不允许恢复这些路径。
|
||||
|
||||
当前唯一可验证的 owner 与边界如下:
|
||||
|
||||
| 能力 | current owner | 当前证据 |
|
||||
| --- | --- | --- |
|
||||
| Plugin v3 包发现、安装、启用和 activation snapshot | App Server `plugin_catalog`、`runtime/plugins`、`runtime/app_data/plugins` | `internal/roadmap/plugin/v3/README.md`、`lime-rs/crates/app-server/src/local_data_source/plugin_catalog.rs` |
|
||||
| Workflow 定义、读、取消、重试、响应与 JSONL 事件语义 | App Server `runtime/workflow`、`processor/workflow.rs`、`runtime/event_log.rs` | `lime-rs/crates/app-server/src/runtime/workflow/definition.rs`、`events.rs`、`cancel.rs`、`tests.rs` |
|
||||
| Article artifact / Article Workspace 投影 | App Server article workspace projection + Renderer Article artifact / workspace components | `lime-rs/crates/app-server/src/runtime/article_workspace_projection.rs`、`src/components/agent/chat/components/ArticleArtifactFrame.tsx`、`src/components/agent/chat/workspace/WorkspaceArticleEditorRightSurface.tsx` |
|
||||
| 内容工厂场景 GUI 回归 | `scripts/agent-runtime` 下的 test-only fixture | `scripts/agent-runtime/claw-chat-current-fixture-content-factory-article-workspace.mjs`;不得视为 production runtime |
|
||||
|
||||
当前未完成项:
|
||||
|
||||
- [ ] 在 App Server current Plugin v3 activation projection 中补齐内容工厂 workflow contract,并接入普通 `agentSession/turn/start`;不得新增独立 worker 或旧 manifest 入口。
|
||||
- [ ] 让内容工厂 artifact partial、host tool evidence 和 workflow audit 由现有 RuntimeCore / `runtime/workflow` 事实源产生,并补真实 Electron Gate B 证据。
|
||||
- [ ] 如需远程发布,沿 Plugin v3 与现有发布工具的 current contract 重新定义 production evidence;旧 `pluginLocalPackage/*`、旧 `pluginPackage/*` 和旧 preflight 记录不得重新成为 Lime consumer runtime。
|
||||
|
||||
下方 `2026-07-05` 及更早的校正、表格和进度日志均为历史验证记录;其中出现的旧 worker、旧脚本和旧路径不构成当前任务清单。
|
||||
|
||||
## 2026-07-05 历史校正记录(已被版本替换)
|
||||
|
||||
最新修复说明主缺口已经从“普通 Agent turn 是否正确承接内容工厂产物”推进到“真实桌面 GUI 是否正确投影这条链路”:
|
||||
|
||||
@@ -25,7 +46,7 @@
|
||||
- 修复结论:`plugin_activation` 已进入普通 Agent backend;RuntimeCore 现在暂存 backend 的 `turn.completed`,在 terminal 前 materialize `content_factory.workspace_patch` artifact、host tool timeline 和 workflow audit,再封口完成态。
|
||||
- 验证证据:`npm run smoke:content-factory-current-turn:host-generation -- --timeout-ms 180000 --evidence-dir ".lime/qc/content-factory-current-turn-debug" --prefix "content-factory-current-turn-debug"` 已通过,证据为 `.lime/qc/content-factory-current-turn-debug/content-factory-current-turn-debug-host-generation-2026-07-05T04-19-07-937Z.json` 和同名 `.workflow-events.jsonl`。
|
||||
- 关键指标:普通事件 `35` 条,`artifactSnapshotCount=7`,`streamingDocumentLengths=5`,`hostToolEventCount=9`,read model host tool call `3` 个,`workflow-events.jsonl` 写入 `16` 条 metadata-only audit 事件,最终 `turn.completed` 位于 artifact / tool 事件之后。
|
||||
- 当前实现进展:RuntimeCore 已新增 terminal deferring sink,`content-factory-app` 的 `plugin_activation` 会派生成后处理用 `PaneActionWorkerTurn`,在普通 Agent backend 返回后、`turn.completed` 落库前执行内容工厂 artifact materialization 与 audit 写入;旧单测的“不得 materialize worker artifacts”断言已改为“普通 backend 先接收请求,artifact snapshot 与 workflow JSONL 必须在 terminal 前出现”。Rust 定向测试、App Server current-turn smoke、Electron/CDP baseline 和 Electron/CDP product acceptance 已通过。
|
||||
- 当前实现进展:RuntimeCore 已新增 terminal deferring sink,`content-factory-app` 的 `plugin_activation` 会派生 App Server activation producer,在普通 Agent backend 返回后、`turn.completed` 落库前执行内容工厂 artifact materialization 与 audit 写入;旧单测的“不得 materialize worker artifacts”断言已改为“普通 backend 先接收请求,artifact snapshot 与 workflow JSONL 必须在 terminal 前出现”。Rust 定向测试、App Server current-turn smoke、Electron/CDP baseline 和 Electron/CDP product acceptance 已通过。
|
||||
- Electron/CDP baseline:`.lime/qc/gui-evidence/writing/writing-cdp-WRITING_CDP_1783188149738-summary.json` 证明真实 Electron/CDP、bridge health、`electron-ipc -> app_server_handle_json_lines`、`agentSession/turn/start`、`content_article_workflow` activation metadata、自然过程捕获、文章产物正文可见且无新增 invoke errors;`.lime/qc/gui-evidence/writing/writing-cdp-WRITING_CDP_1783188149738-turn-start-trace.json` 保留 session / turn 取证。该脚本主动打开了 Article Editor,不证明右侧不自动打开,也未完成历史恢复。
|
||||
- 本轮 read model / 历史恢复修复:`agentSession/read.detail.artifacts` 与 `thread_read.artifacts` 已改为用户可见 artifact 集合,过滤 raw `content_factory.workspace_patch` / `workspace_patch`;`artifact/read` 和 `evidence/export` 保留完整内部 artifact。前端历史恢复允许 `artifact_document + articleWorkspace` 文章产物恢复为 `document` artifact,只隐藏 workspace patch;App Server `item.updated` 累计文本按累计全文覆盖,避免引导 / 思考文本重复拼接。验证已通过后端三条定向测试和前端目标 Vitest;`npm run test:related` 因本机磁盘空间 `ENOSPC` 未完成。
|
||||
- Electron/CDP product acceptance:`/tmp/lime-writing-evidence/writing-final-WRITING_LIVE_1783229659461-2026-07-05T06-02-47-474Z-summary.json` 证明真实 Electron 页面 `http://127.0.0.1:1420/?nativeStartup=1` 中目标 session `sess_f781bf079f074b7aa2ec0941bade095d` 满足 `gateB / historyRestored / naturalLeadVisible / toolProcessVisible / articleFrameVisible / rawPatchHidden / workflowStepsHiddenInChat / rightSurfaceNotAutoOpened / rightSurfaceOpensOnClick / traceHasElectronRead` 全部为 `true`;点击文章产物后右侧 Article Editor 正确载入文章正文。
|
||||
@@ -33,7 +54,7 @@
|
||||
- Production GUI evidence 采集器:`scripts/plugin/content-factory-production-gui-evidence.mjs` 只连接真实 Electron CDP,断言 `window.__LIME_ELECTRON__`、`electronAPI.invoke` 和 current `app_server_handle_json_lines`,通过 `pluginInstalled/list`、`agentSession/read`、`evidence/export` 读取当前桌面事实,并从 trace / `workflow-events.jsonl` 匹配 `workflowResume` lifecycle。workflow JSONL / resume lifecycle 解析已拆到 `scripts/lib/content-factory-production-workflow-evidence.mjs` 并有纯单测覆盖 action/respond、queued resume contract、缺 JSONL fail-closed,以及 App Server params 最小投影;collector 从 `880` 行降到 `676` 行。trace evidence 只保留 session/action/workflowResume 审计字段,不写 raw App Server params、用户 prompt、正文、Bearer 或 raw `sourceUri`;缺 `cloud_release`、signature verified、live read model、Electron IPC turn/start 或 resume lifecycle 时写出 `status=failed` 与 `missingAssertions`。
|
||||
- 2026-07-05 21:13 真实 Electron/CDP live 写作复测:真实 Lime/Electron 页签 `http://127.0.0.1:1420/?nativeStartup=1` 中发送 `@写文章`,`agentSession/turn/start` 通过 `electron-ipc -> app_server_handle_json_lines` 进入 App Server,session `sess_c791014cba9e42caabe337db7b81467c`,turn `a3514955-35c8-4052-9c95-77c298d7dcfd`。用户面有自然引导和文章正文,未显示 raw JSON / `workspace-patch.json`;后端 session JSONL `/Users/coso/Library/Application Support/lime/app-server/runtime/events/sessions/session_sess_c791014cba9e42caabe337db7b81467c.jsonl` 写入 `3061` 行,workflow audit JSONL `/Users/coso/Library/Application Support/lime/app-server/runtime/events/sessions/session_sess_c791014cba9e42caabe337db7b81467c/workflow-events.jsonl` 写入 `16` 行。证据:`.lime/qc/gui-evidence/agent-apps/content-factory-writing-cdp-WRITING_CDP_1783257215276.json`、`.lime/qc/gui-evidence/agent-apps/content-factory-production-gui-evidence-cdp-live-writing-WRITING_CDP_1783257215276-2026-07-05T13-15-46-920Z.json`。production collector 仍按预期 `status=failed`,缺 `liveProviderUsed / sourceKindCloudRelease / signatureVerified / workflowResumeLifecyclePresent`;bundle / readiness report 仍 `blocked`,输出目录 `.lime/qc/gui-evidence/agent-apps/content-factory-production-evidence-bundle-cdp-live-writing-WRITING_CDP_1783257215276/`。这条证据关闭“真实桌面是否走普通 turn + JSONL 审计”的疑问,但不关闭 signed `cloud_release` production 门槛。
|
||||
- Production preflight:新增 `scripts/plugin/content-factory-production-preflight.mjs` 与 `plugin:content-factory-production-preflight`,读取真实外部 `.lapp`,解包后通过 current App Server `pluginLocalPackage/inspect` 计算 production manifestHash,避免用脚本猜 hash。该入口现在也支持 `--fetch-cloud-from-catalog`,从 production catalog 派生 descriptor 并调用 current App Server `pluginPackage/fetchCloud` 生成 fetchCloud evidence 摘要,再用 catalog `signatureProof` 与 bootstrap trust root 校验签名状态;没有真实 HTTPS catalog / package 或签名未由可信根验证时仍保持 blocked,不接受手写 ready。最新真实包 preflight 输出 `.lime/qc/gui-evidence/agent-apps/content-factory-production-preflight-bundle-guard-2026-07-05.json`,证明 `.lapp` 可读且包含 `44` 个条目、`packageHash=sha256:89aec20e637713c668f8bc34c303256ac83806c5d2e75486e6453bd638ac3f8c`、`manifestHash=sha256:c1d3aa37d4b2f6c3c4a006525a1bba4b4ee407f61fe9cff8192704b48a209248`、无缺包内条目;同时按预期 blocked 于 `production_app_signature_yaml_missing / production_trust_root_missing / production_catalog_missing / production_bootstrap_missing / production_fetch_cloud_evidence_missing`。该入口还输出非敏感 `publishReadiness`,当前本机缺 signing private key、Studio token、tenantId、API base 和远程 packageUrl;该摘要只记录 env 名和 configured 布尔值,不签名、不上传、不安装、不生成 passing cloud_release evidence。preflight 现在还会校验 `app.signature.yaml` proof 字段完整性、`schemaVersion`、payload hash 格式、signedAt 时间戳、Host verifier 支持算法、trust root `publicKeyId / algorithm / publicKey` 与 proof 是否匹配,并重建 canonical `plugin-cloud-release-signature-payload/v2` 后用 trust root public key 做真实密码学验签;production catalog 的 `identity.signatureRef` 与 `signatureProof.publicKeyId / algorithm / payloadHash / signedAt` 也必须和本地 `app.signature.yaml` 一致。signed release gate 读取 preflight 时也要求 `signatureCryptographicVerificationStatus=verified` 和 `signaturePayloadHashMatched=true`,并要求 bootstrap 匹配 trust root 带 `publicKey`;存在空壳签名文件、手写 ready preflight、payloadHash 漂移、签名验不过或 catalog proof 漂移仍 blocked。
|
||||
- Production signed release gate parity:`plugin-content-factory-signed-release-gate-core.mjs` 已把 fetchCloud ready 判断拆到 `scripts/lib/plugin-content-factory-signed-release-gate-fetch-cloud.mjs`,把 GUI evidence summary / requirements 拆到 `scripts/lib/plugin-content-factory-signed-release-gate-gui.mjs`,core 收敛到 `504` 行。gate 继续要求 fetchCloud evidence 证明 `cloud_release / ready / signaturePolicy=required / verified signature / verified package / packageHashMatched / manifestHashMatched`;GUI evidence collector、readiness report 和 pipeline 也必须记录并断言同一组 worker launch gate 字段。若 evidence 额外带具体 `packageHash / manifestHash / sourceUri / signatureRef / signatureProof`,这些值必须与 production catalog 和 preflight 摘要一致,任何漂移都会输出 `production_fetch_cloud_*_mismatch`。GUI `installedState` 还必须携带合法 `appVersion / packageHash / manifestHash / releaseId / signatureRef`,并与 catalog / preflight / fetchCloud 同一轮 release identity 对齐;缺字段、hash 非法、identity 漂移或 fixture / localhost marker 都不能 ready。gate 输出不会复制 fetchCloud 原始 package URL,只用于内部比对。
|
||||
- Production signed release gate parity:`plugin-content-factory-signed-release-gate-core.mjs` 已把 fetchCloud ready 判断拆到 `scripts/lib/plugin-content-factory-signed-release-gate-fetch-cloud.mjs`,把 GUI evidence summary / requirements 拆到 `scripts/lib/plugin-content-factory-signed-release-gate-gui.mjs`,core 收敛到 `504` 行。gate 继续要求 fetchCloud evidence 证明 `cloud_release / ready / signaturePolicy=required / verified signature / verified package / packageHashMatched / manifestHashMatched`;GUI evidence collector、readiness report 和 pipeline 也必须记录并断言同一组 activation readiness gate 字段。若 evidence 额外带具体 `packageHash / manifestHash / sourceUri / signatureRef / signatureProof`,这些值必须与 production catalog 和 preflight 摘要一致,任何漂移都会输出 `production_fetch_cloud_*_mismatch`。GUI `installedState` 还必须携带合法 `appVersion / packageHash / manifestHash / releaseId / signatureRef`,并与 catalog / preflight / fetchCloud 同一轮 release identity 对齐;缺字段、hash 非法、identity 漂移或 fixture / localhost marker 都不能 ready。gate 输出不会复制 fetchCloud 原始 package URL,只用于内部比对。
|
||||
- Production readiness report:`scripts/plugin/content-factory-production-readiness-report.mjs` 与 `plugin:content-factory-production-readiness-report` 只读 production preflight、signed gate result、bundle manifest 和五类 production evidence,输出阻塞矩阵与下一步动作。它复用 signed release gate 的 missing codes,不新增第二套 ready 口径;不签名、不上传、不安装、不调用 Provider 或生产 API,也不复制密钥、token 或 package URL 原文。report 同时输出 `preflightBlockers`,把签名 proof 不完整、trust root 不匹配等 nested preflight codes 显式列出;现在还覆盖 signed gate 所有 production missing codes 的明确 nextAction,在现有 gate result 与当前 evidence 重新计算结果不一致时输出 `production_signed_gate_result_stale`,在 bundle manifest 的输入 sha256/digest 与当前 evidence 不一致时输出 `production_evidence_bundle_stale`,在 bundle gate 摘要 / digest 与当前重算 gate 不一致时输出 `production_evidence_bundle_gate_stale`。当前真实外部包 report 输出 `.lime/qc/gui-evidence/agent-apps/content-factory-production-readiness-report-bundle-guard-2026-07-05.json`,按预期 blocked。
|
||||
- 2026-07-05 21:42 production 复核:`lime-agent-app-studio` 已把 App Server inspect 从旧 `agentAppLocalPackage/inspect` 改为 current `pluginLocalPackage/inspect`,并在 `publish --dry-run` 输出 `releaseReadiness`;真实 `content-factory-app` dry-run 证据 `.lime/qc/gui-evidence/agent-apps/content-factory-studio-publish-dry-run-live-continue-2026-07-05.json` 显示 Studio 与 Lime preflight 已对齐到 `packageHash=sha256:0c6f33d42918365b7f4256a78fc99b925133ea8fd956d50da25874998222b59c`、`manifestHash=sha256:5de25a9d61518f027810663cb50685bc6b25f1930f22e67f24ab9b757fd5f7a8`,但 dry-run blocked 于缺 packageUrl、app.signature、tenantId 和 developer token。随后重新跑 `plugin:content-factory-production-preflight`、bundle 和 readiness report,证据 `.lime/qc/gui-evidence/agent-apps/content-factory-production-preflight-studio-dry-run-continue-2026-07-05T13-42-15-968Z.json`、`.lime/qc/gui-evidence/agent-apps/content-factory-production-evidence-bundle-studio-dry-run-continue-2026-07-05/`、`.lime/qc/gui-evidence/agent-apps/content-factory-production-readiness-report-studio-dry-run-continue-2026-07-05.json` 仍 `blocked`,15 个 missing codes 覆盖缺 catalog/bootstrap/fetchCloud、GUI 仍是 `local_folder`、signature 未 verified 和 workflow resume lifecycle 缺失。该复核确认当前问题不是 mock 测试误差,而是缺真实 signed remote release 输入和 GUI `cloud_release` 安装运行证据。
|
||||
- 2026-07-05 21:46 linked readiness report:`plugin:content-factory-production-readiness-report --studio-dry-run ...` 已把 Studio dry-run evidence 纳入同一 production readiness report,输出 `.lime/qc/gui-evidence/agent-apps/content-factory-production-readiness-report-studio-dry-run-linked-2026-07-05.json`。该 report 中 `studioDryRun.present=true`、`studioDryRun.drift=[]`,Studio packageHash / manifestHash 与 preflight 一致;blockers 同时包含 Studio 发布侧缺口 `production_package_url_missing / production_app_signature_yaml_missing_or_invalid / production_tenant_id_missing / production_studio_token_missing` 和 signed gate 的 `15` 个 production missing codes。结论:发布工具链与 Lime gate 已读同一真实包事实,但 production 仍 blocked,不能用 dry-run、local_folder GUI evidence 或缺 catalog/bootstrap/fetchCloud 的 bundle 关闭门槛。
|
||||
@@ -57,24 +78,24 @@
|
||||
- LimeCore signed release contract:`limecore` 本地服务端已经支持 Plugin release `signatureProof`、bootstrap `pluginSignatureTrustRoots`、`plugin.signatureTrustRoots[]` / `PLUGIN_SIGNATURE_TRUST_ROOTS_JSON` 配置入口和 bulk publish fail-closed 签名校验,并同步 OpenAPI fragments / bundle 与 `packages/types`。这只证明服务端契约可用,不等同于 production 部署或真实桌面安装完成。
|
||||
- Studio publish chain:`lime-agent-app-studio` 正式 `--publish` 已从旧 developer `package-upload` / `/releases` 切到 current `/v1/platform/plugins/bulk-publish`,要求真实 HTTPS `--package-url` 与本地 `app.signature.yaml`,并在 bulk publish 前通过 App Server inspect 计算 `manifestHash`。这只证明发布工具链 ready,不等同于 production signed release 已发布。
|
||||
|
||||
## 当前事实源
|
||||
## 历史事实源(旧版本证据,仅供追溯)
|
||||
|
||||
| Surface | 当前状态 | 分类 | 证据 |
|
||||
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 插件 workflow declaration | 前端/安装测试仍主要读取 test-only manifest snapshot;但 seeded runtime package 已改为复制 `testing/fixtures/package-root/` 下同步自真实 `content-factory-app` 的包快照,且 `content-factory-app.json` 的 workflow/workbench/skill 绑定现已与 package-root 五个 `article-*` skill 对齐。package-root 也已同步 release 签名工具链守卫,要求 `plugin.json` / `package.json` 版本一致、`release:sign` 入口存在、`scripts/sign-release.mjs` 和签名测试不漂移。 | partial current / guarded test-only | `src/features/plugin/testing/fixtures/content-factory-app.json`、`src/features/plugin/testing/fixtures/package-root/`、`src/features/plugin/testing/contentFactoryFixtureSync.unit.test.ts` |
|
||||
| 宿主 workflow audit event | App Server 在 worker 前生成 `workflow.run.started` / `workflow.step.started`,并把 worker progress 中的 `workflow.*` 分流写入 JSONL。 | current / P1 | `lime-rs/crates/app-server/src/runtime/agent_app_worker_workflow.rs`、`event_log.rs` |
|
||||
| 硬编码业务步骤 | Rust 宿主不持有 `research / strategy / draft / review / image-plan` fallback;缺 workflow key / steps 时不伪造。 | current guard | `build_agent_app_worker_workflow_context(...) -> Option` |
|
||||
| worker progress | seeded / runtime fixture 入口仍在 `testing/fixtures/`,但根 worker 已改为委托 `package-root` 当前实现;段落级 `artifact.snapshot` progress 现只在宿主注入真实 `hostManagedGeneration.outputs[]` 后输出 article partial,避免无模型结果时把 deterministic 样例伪装成流式文章。真实外部 `content-factory-app@2.2.2` package smoke 已证明 `.lapp` 包结构、runtime contract、host-managed generation 消费和 worker NDJSON 段落级 partial 输出成立;App Server current local_folder host-generation turn smoke 已证明真实外部包能通过 `agentSession/turn/start` 进入 artifact read model 与 workflow JSONL;fixture-signed `cloud_release` host-generation current-turn smoke 进一步证明签名 evidence ready 后,非 local_folder runtime/cache 路径也能进入同一 worker turn。LimeCore 本地已补 `signatureProof` / `pluginSignatureTrustRoots` 下发契约;新增 signed release gate 会拒绝 fixture cloud release / localhost provider 证据。远程 / GUI production 安装运行闭环仍待服务端部署、真实可信根配置和 GUI 复测。 | external package + App Server current local_folder/cloud_release host-generation fixture turn verified / fixture blocked by production gate / LimeCore local contract fixed / remote GUI production pending | `src/features/plugin/testing/fixtures/src/runtime/content-factory-worker.mjs`、`src/features/plugin/testing/fixtures/package-root/src/runtime/content-factory-worker.mjs`、`scripts/plugin/content-factory-package-smoke.mjs`、`scripts/plugin/content-factory-current-turn-smoke.mjs`、`scripts/plugin/content-factory-signed-release-gate.mjs` |
|
||||
| host-managed generation | 内容工厂 worker 不持有 provider key;App Server 在启动 worker 前通过 direct provider config / Provider 池完成托管正文生成,并把结果注入 `hostManagedGeneration` 与 `runtime.hostManagedGenerationResult`。离线 localhost OpenAI-compatible fixture 已证明真实 `prepare_agent_app_worker_request(...)` 会生成并注入 `article-draft-document -> articleDraft.documentText`;worker 包测试现在证明有宿主结果时标题 / 正文来自宿主 Markdown,缺宿主结果时 `content.article.generate` / `content.factory.generate` host worker request 返回 `HOST_MANAGED_GENERATION_REQUIRED`,不再使用 deterministic fallback 模板。离线 fixture 已收敛到共享 `content-factory-host-generation-fixture`,按 provider 请求动态生成带隐藏 `fixturePromptFingerprint` 的 fixture-only Markdown,不再输出固定“请求摘要 / 资料检索 / 正文草稿 / 交付检查”章节。Agnes live Provider current-turn 已证明非 fixture Direct provider config 可完成宿主正文生成;production signed `cloud_release` GUI 证据仍未完成。 | current host seam + request-derived controlled fixture verified + live provider current-turn verified / production signed cloud_release pending | `lime-rs/crates/app-server/src/runtime_backend/plugin_worker_generation.rs`、`content-factory-worker.test.mjs`、`scripts/lib/content-factory-host-generation-fixture.mjs`、`scripts/plugin/content-factory-current-turn-smoke.mjs`、`scripts/agent-runtime/claw-chat-current-fixture-content-factory-worker-dogfood.mjs` |
|
||||
| artifact partial pass-through | App Server 只透传 worker 生成期 `artifact.snapshot` partial,不再用最终 `documentText` 回切伪流式。 | current guard | `worker_progress_events_for_sink(...)`、`complete_workspace_snapshot_passes_through_without_fake_streaming` |
|
||||
| 宿主 workflow audit event | App Server 在 activation producer 前生成 `workflow.run.started` / `workflow.step.started`,并把 producer progress 中的 `workflow.*` 分流写入 JSONL。 | current / P1 | `lime-rs/crates/app-server/src/runtime/workflow/events.rs`、`lime-rs/crates/app-server/src/runtime/event_log.rs` |
|
||||
| 硬编码业务步骤 | Rust 宿主不持有 `research / strategy / draft / review / image-plan` fallback;缺 workflow key / steps 时不伪造。 | current guard | `lime-rs/crates/app-server/src/runtime/workflow/definition.rs`、`lime-rs/crates/app-server/src/runtime/workflow/tests.rs` |
|
||||
| activation producer progress | Plugin v3 activation 只生成 typed snapshot;段落级 `artifact.snapshot` progress 由 App Server current producer 在 host-managed generation 结果可用时输出,避免无模型结果时把 deterministic 样例伪装成流式文章。外部 package smoke、App Server current local_folder host-generation turn smoke 和受控 cloud_release evidence 只作为验证材料,不能升级为独立 Plugin runtime owner。远程 / GUI production 安装运行闭环仍待服务端部署、真实可信根配置和 GUI 复测。 | external package + App Server current activation turn verified / production pending | `lime-rs/crates/app-server/src/runtime/workflow/events.rs`、`scripts/plugin/content-factory-current-turn-smoke.mjs`、`scripts/plugin/content-factory-signed-release-gate.mjs` |
|
||||
| host-managed generation | 内容工厂 activation producer 不持有 provider key;App Server 在 current turn 内通过 direct provider config / Provider 池完成托管正文生成,并把结果注入 `hostManagedGeneration` 与 `runtime.hostManagedGenerationResult`。受控 OpenAI-compatible fixture 与 Agnes live Provider current-turn 已证明宿主正文生成可用;production signed `cloud_release` GUI 证据仍未完成。 | current host seam + request-derived controlled fixture verified + live provider current-turn verified / production signed cloud_release pending | `lime-rs/crates/app-server/src/runtime/workflow/events.rs`、`scripts/lib/content-factory-host-generation-fixture.mjs`、`scripts/plugin/content-factory-current-turn-smoke.mjs` |
|
||||
| artifact partial pass-through | App Server 只透传 activation producer 生成期 `artifact.snapshot` partial,不再用最终 `documentText` 回切伪流式。 | current guard | `lime-rs/crates/app-server/src/runtime/workflow/events.rs`、相关 artifact snapshot 测试 |
|
||||
| 前端过程显示 | 右侧 Article Editor 不渲染 workflow rail;renderer event stream 对 `workflow.*` 返回 `null`。 | current / P1 | `WorkspaceArticleEditorSurface.tsx`、`appServerEventStream.ts` |
|
||||
| GUI 回归 | 内容工厂文章工作台 fixture 改为断言 workflow UI facts / rail 缺席,且 worker dogfood turn 必须在 `backendMode=runtime` 下通过 host-managed generation 完成;`host_generation_unavailable` 不再是 GUI 成功证据。GUI dogfood 的本地 OpenAI-compatible provider 现在复用共享 request-derived fixture,并在 evidence 中标记 `fixtureOnly`,不能作为 production ready 证据。 | current fixture evidence / production-blocked | `scripts/agent-runtime/claw-chat-current-fixture-content-factory-*.mjs`、`scripts/lib/content-factory-host-generation-fixture.mjs`、`.lime/qc/gui-evidence/claw-chat-current-fixture/claw-chat-current-fixture-summary.json`、`.lime/qc/gui-evidence/claw-chat-current-fixture/claw-chat-current-fixture-content-factory-article-workspace-regression-summary.json` |
|
||||
| workflow audit JSONL | 当前物理路径沿用 event log 根目录:`sessions/session_<id>/workflow-events.jsonl`。Worker 产生的 `workflow.connector.requested` / `workflow.tool.*` / `workflow.artifact.delta` 必须由 App Server 绑定插件声明里的 `workflowRunId + stepId` 后才能写入 audit;RuntimeBackend 回填到 workspace patch 的 `hostSearchEvidence` 会追加为 audit-only `workflow.connector.completed`;插件 hook lifecycle 会转换为 audit-only `workflow.hook.completed`;retry lifecycle 会追加 `workflow.run.retrying` / `workflow.step.retrying`。写盘前统一执行 metadata-only 脱敏,`prompt / query / result / providerConfig / message / text / summary` 等 raw content 字段被替换为 redaction 占位,保留 workflow id、step、connector、tool、status 等审计元数据。这些事件不进入普通输出 / read model / workerEvidence;App Server current `evidence/export` 已能读取 JSONL 并在 `EvidencePackSummary.observabilitySummary.workflow_audit` 输出 metadata-only 摘要。`EventLogWriter::compact_session_workflow_audit_events(session_id, retain_recent)` 会把 active JSONL 的旧记录归档到同目录 `workflow-events.archive.<first_seq>-<last_seq>.jsonl`,active 文件只保留最近 N 条;archive 路径按 sequence 范围确定并覆盖写入,重试 compaction 不会重复追加同一批旧 audit;读取和 Evidence Pack 聚合会同时消费 archive + active,`retain_recent=0` fail closed,会话清理会删除 active 与 archive。默认自动策略在 active audit 超过 `1024` 条后触发 compaction,并保留最近 `512` 条;触发点在 App Server event log 边界,压缩失败只告警,不让已落盘 audit 写入回滚,也不暴露给 UI 或 worker 管理。 | current / P1 | `EventLogWriter::append_workflow_audit_events`、`EventLogWriter::compact_session_workflow_audit_events_if_needed`、`RuntimeCore::export_evidence(...)`、`BasicEvidenceExportProvider`、`AgentAppWorkerWorkflowContext::bind_worker_progress_event`、`workflow_connector_completed_events_from_artifact_events(...)`、`workflow_hook_completed_events_from_worker_hook_events(...)`、`workflow_retry_events(...)` |
|
||||
| workflow audit JSONL | 当前物理路径沿用 event log 根目录:`sessions/session_<id>/workflow-events.jsonl`。Activation producer 产生的 `workflow.connector.requested` / `workflow.tool.*` / `workflow.artifact.delta` 必须由 App Server 绑定插件声明里的 `workflowRunId + stepId` 后才能写入 audit;RuntimeBackend 回填到 workspace patch 的 `hostSearchEvidence` 会追加为 audit-only `workflow.connector.completed`;插件 hook lifecycle 会转换为 audit-only `workflow.hook.completed`;retry lifecycle 会追加 `workflow.run.retrying` / `workflow.step.retrying`。写盘前统一执行 metadata-only 脱敏,`prompt / query / result / providerConfig / message / text / summary` 等 raw content 字段被替换为 redaction 占位,保留 workflow id、step、connector、tool、status 等审计元数据。这些事件不进入普通输出 / read model / Article Workspace;App Server current `evidence/export` 已能读取 JSONL 并在 `EvidencePackSummary.observabilitySummary.workflow_audit` 输出 metadata-only 摘要。`EventLogWriter::compact_session_workflow_audit_events(session_id, retain_recent)` 会把 active JSONL 的旧记录归档到同目录 `workflow-events.archive.<first_seq>-<last_seq>.jsonl`,active 文件只保留最近 N 条;archive 路径按 sequence 范围确定并覆盖写入,重试 compaction 不会重复追加同一批旧 audit;读取和 Evidence Pack 聚合会同时消费 archive + active,`retain_recent=0` fail closed,会话清理会删除 active 与 archive。默认自动策略在 active audit 超过 `1024` 条后触发 compaction,并保留最近 `512` 条;触发点在 App Server event log 边界,压缩失败只告警,不让已落盘 audit 写入回滚,也不暴露给 UI 或 activation metadata。 | current / P1 | `lime-rs/crates/app-server/src/runtime/event_log.rs`、`lime-rs/crates/app-server/src/runtime/exports.rs`、`lime-rs/crates/app-server/src/runtime/workflow/events.rs`、`lime-rs/crates/app-server/src/runtime/workflow/cancel.rs` |
|
||||
| read model workflow facts | `agentSession/read.detail.thread_read` 不再返回 `workflow_runs` / `workflow_steps`。 | current / P1 | `lime-rs/crates/app-server/src/runtime/read_model.rs` |
|
||||
| step scheduler / retry / cancel / resume | worker 仍是整体 executor,尚未按 step 调度;retry / cancel 已有 audit-only 事件;resume/action response 已支持 `workflowResume` metadata 绑定 `workflowRunId / workflowKey / stepId` 后写 audit-only `workflow.step.resuming` / `workflow.run.resuming`;普通 queued resume 仍 fail-closed,生产 worker / 远程包仍需真实上报该 metadata lifecycle。 | partial / P2 | `agent_app_worker_workflow_retry.rs`、`agent_app_worker_workflow_cancel.rs`、`queue_resume_audit.rs` |
|
||||
| step scheduler / retry / cancel / resume | activation producer 当前按普通 turn 生成期输出 artifact;retry / cancel 已有 audit-only 事件;resume/action response 已支持 `workflowResume` metadata 绑定 `workflowRunId / workflowKey / stepId` 后写 audit-only `workflow.step.resuming` / `workflow.run.resuming`;普通 queued resume 仍 fail-closed,远程包仍需真实上报该 metadata lifecycle。 | partial / P2 | `lime-rs/crates/app-server/src/runtime/workflow.rs`、`lime-rs/crates/app-server/src/runtime/tests/queue_resume_audit.rs` |
|
||||
| production signed release chain | LimeCore 本地 contract 已能存储、投影和下发 Plugin release `signatureProof` 与 `pluginSignatureTrustRoots`,Studio 发布 CLI 已切到 current Plugin bulk publish,生产 gate / preflight / readiness report 会拒绝缺 signature proof、trust roots、fetchCloud、GUI cloud_release 或 resume lifecycle 的假完成。evidence bundle 会记录每个输入 JSON 的 `sha256` 和输入集合 digest;readiness report 会二次计算 gate 并阻断 stale result,还会用 `blockerPlan.nextPhase` 把缺口分到 release signing、Studio 输入、catalog/bootstrap、fetchCloud 和 desktop cloud_release E2E。readiness pipeline 在缺 catalog 时跳过 fetchCloud 自动调用但保留 blocked preflight evidence,不再把缺 catalog 误升级成 preflight command failure;显式 `--fetch-production-release-evidence` 可只读 LimeCore current client marketplace/bootstrap,自动落本地 catalog/bootstrap evidence,再交给 preflight / bundle。readiness report 只聚合缺口;readiness pipeline 默认只读,只有显式 `--generate-signature-proof` 才会调用外部真实签名工具生成 `app.signature.yaml` / trust root,且仍不上传、不安装、不调用 Provider 或 production publish API。剩余缺口是 production 服务部署、可信根配置、真实 HTTPS packageUrl、production catalog 写入、fetchCloud verified evidence 和 Electron/CDP live `cloud_release` 证据。 | contract verified / production pending | `/Users/coso/Documents/dev/ai/limecloud/limecore`、`/Users/coso/Documents/dev/ai/limecloud/lime-agent-app-studio`、`scripts/plugin/content-factory-production-preflight.mjs`、`scripts/plugin/content-factory-signed-release-gate.mjs`、`scripts/plugin/content-factory-production-evidence-bundle.mjs`、`scripts/plugin/content-factory-production-readiness-report.mjs`、`scripts/plugin/content-factory-production-readiness-pipeline.mjs`、`scripts/plugin/content-factory-production-release-evidence.mjs` |
|
||||
|
||||
## 完成审计
|
||||
## 历史完成审计(旧版本证据)
|
||||
|
||||
### 已完成 P0
|
||||
|
||||
@@ -122,7 +143,13 @@
|
||||
- [x] resume / action response 绑定 workflow run / step 的 App Server metadata contract:只有 typed action response 或 `workflow/respond` 的 `metadata.workflowResume` 显式带 `workflowRunId / workflowKey / stepId` 时,才写 metadata-only `workflow.step.resuming` / `workflow.run.resuming`;`thread/resume` 只做 Thread rejoin/history hydrate,不写 workflow audit。
|
||||
- [ ] production worker / 远程包真实 resume lifecycle 上报:signed release gate 已把该证据设为 ready 硬门槛;真实 production GUI 仍需在 action response 或 queued resume 中填充上述 metadata,并证明 `workflow.step.resuming` / `workflow.run.resuming` 来自非 fixture `workflow-events.jsonl`。
|
||||
|
||||
## 下一刀
|
||||
## 当前下一刀
|
||||
|
||||
1. 以现有 Plugin v3 catalog、`runtime/workflow` 和 Article Workspace projection 为唯一事实源,补齐内容工厂 activation contract;在实现落地前,文档只能标记为 `planned/deferred`,不能写成 production ready。
|
||||
2. 为新增的 activation contract 同步 App Server protocol、Renderer gateway、fixture 和 Gate B 证据;若没有真实消费者,保持 test-only fixture,不新增旧 package runtime。
|
||||
3. 完成文档收敛后,删除已被 v3 完整替换且无非守卫引用的旧路线图/执行计划;删除前必须取得用户对精确清单的明确确认。
|
||||
|
||||
## 历史下一刀(已被版本替换)
|
||||
|
||||
1. 发布 / 部署 LimeCore 签名契约变更,配置 production Plugin signature trust roots,使用 `plugin:content-factory-production-readiness-pipeline -- --generate-signature-proof` 结合真实 `packageUrl / releaseId / publicKeyId / packageHash / manifestHash` 生成真实 release `signatureProof`;`signatureRef` 必须采用 `sigstore:content-factory-app@2.2.2:<releaseId>`,通过 Studio current `/v1/platform/plugins/bulk-publish` 写入真实 HTTPS `packageUrl`、`releaseId`、`packageHash`、`manifestHash` 和 `signatureProof`,并复走 Lime 远程 / GUI production 安装运行闭环;不能在客户端绕过,也不能回退旧 developer package upload。
|
||||
2. 用 `plugin:content-factory-production-readiness-pipeline -- --fetch-production-release-evidence --fetch-cloud-from-catalog` 作为发布后验收入口,把真实 `.lapp` 的 `packageHash / manifestHash`、`app.signature.yaml`、`plugin-signature-trust-root.json`、production catalog、bootstrap 和 fetchCloud evidence 对齐后,再进入 signed release gate;preflight blocked 时不得手写 installed state 或 GUI evidence 绕过。
|
||||
@@ -130,7 +157,21 @@
|
||||
4. 补 signed remote release + live Provider 的真实 GUI production 证据:current-turn live Provider 已证明 App Server host-managed generation 可用,下一步必须让同一能力在 `sourceKind=cloud_release`、signature verified、trust roots ready 的真实桌面安装路径中通过。
|
||||
5. `src/features/agent-app/**` 与宿主内容工厂硬编码 demo 已退出 current 写集;后续拆分工作应回到 Plugin / App Center current 页面与 runtime surface,不再围绕旧 `AgentAppLabPage.tsx` 或旧 demo 文件续命。
|
||||
|
||||
## 验证门槛
|
||||
## 当前验证门槛
|
||||
|
||||
当前文档与实现收敛只使用仓库现有入口:
|
||||
|
||||
- `npm run docs:boundary`
|
||||
- `npm run harness:doc-freshness`
|
||||
- `npm run governance:legacy-report`
|
||||
- `npm run test:contracts`
|
||||
- `npm run smoke:claw-chat-current-fixture`
|
||||
- `cargo test --manifest-path "lime-rs/Cargo.toml" -p app-server workflow -- --nocapture`
|
||||
- `git diff --check`
|
||||
|
||||
旧 package execution、production preflight、签名 gate 和外部 Studio 命令不在当前仓库构建图中;它们仅可作为历史 evidence,不能再作为本项目的验证门槛。
|
||||
|
||||
## 历史验证门槛(旧版本)
|
||||
|
||||
最低验证:
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
# 迭代备忘
|
||||
|
||||
## 目录用途
|
||||
|
||||
`internal/iteration-notes/` 用于记录:
|
||||
|
||||
- 已确认但不在当前版本发布范围内的问题
|
||||
- 下个迭代建议处理的体验优化项
|
||||
- 需要持续跟踪的跨平台兼容问题
|
||||
- 已有修复思路、但需要结合发版节奏安排的事项
|
||||
|
||||
## 编写建议
|
||||
|
||||
- 一条问题一个文件,避免把多个主题混在同一篇文档中
|
||||
- 文件名使用 `领域-主题-问题.md` 形式,便于检索
|
||||
- 每篇文档建议包含:背景、现象、影响、建议方案、验收标准、优先级
|
||||
- 如果问题已经进入正式排期,可在文档顶部补充对应任务号或里程碑
|
||||
|
||||
## 当前条目
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
# 上下文管理升级方案
|
||||
|
||||
## 问题分析
|
||||
|
||||
### 当前状态
|
||||
|
||||
1. **session_context_service.rs** 使用本地关键词提取
|
||||
- `create_summary()` 方法(第 355-418 行)使用硬编码关键词匹配
|
||||
- 摘要质量差,无法理解语义
|
||||
- 不支持 AI 驱动的智能压缩
|
||||
|
||||
2. **SessionConfigBuilder** 缺少上下文配置
|
||||
- 只有 `max_turns`、`system_prompt`、`include_context_trace`
|
||||
- 没有暴露 token 限制、压缩策略等配置
|
||||
|
||||
3. **agent 框架能力未接入**
|
||||
- agent 有渐进式工具响应移除能力
|
||||
- agent 支持 AI 摘要
|
||||
- Lime 未正确配置和使用这些能力
|
||||
|
||||
## 改进方案
|
||||
|
||||
### 阶段 1:扩展 SessionConfigBuilder
|
||||
|
||||
在 `lime-rs/crates/agent/src/agent_state_support.rs` 中扩展 `SessionConfigBuilder`:
|
||||
|
||||
```rust
|
||||
pub struct SessionConfigBuilder {
|
||||
id: String,
|
||||
max_turns: Option<u32>,
|
||||
system_prompt: Option<String>,
|
||||
include_context_trace: Option<bool>,
|
||||
// 新增:上下文压缩配置
|
||||
max_context_tokens: Option<usize>,
|
||||
context_compression_threshold: Option<f32>,
|
||||
enable_ai_summary: Option<bool>,
|
||||
tool_response_retention_strategy: Option<ToolResponseRetentionStrategy>,
|
||||
}
|
||||
|
||||
pub enum ToolResponseRetentionStrategy {
|
||||
KeepAll,
|
||||
Progressive { stages: Vec<f32> }, // 0.0, 0.1, 0.2, 0.5, 1.0
|
||||
RemoveAfterTurns(usize),
|
||||
}
|
||||
```
|
||||
|
||||
### 阶段 2:改造 session_context_service.rs
|
||||
|
||||
将 `create_summary()` 方法改为调用 AI 模型生成摘要:
|
||||
|
||||
```rust
|
||||
async fn create_summary_with_ai(
|
||||
&self,
|
||||
session_id: &str,
|
||||
messages: &[ChatMessage],
|
||||
provider: &dyn LLMProvider,
|
||||
) -> Result<SessionSummary, String> {
|
||||
// 构建摘要提示词
|
||||
let summary_prompt = build_summary_prompt(messages);
|
||||
|
||||
// 调用 AI 模型生成摘要
|
||||
let summary_response = provider
|
||||
.complete(&summary_prompt)
|
||||
.await
|
||||
.map_err(|e| format!("AI 摘要生成失败: {e}"))?;
|
||||
|
||||
// 解析摘要结果
|
||||
parse_summary_response(&summary_response)
|
||||
}
|
||||
```
|
||||
|
||||
### 阶段 3:集成到 Agent Agent 初始化
|
||||
|
||||
在 `agent_cmd.rs` 中配置上下文压缩:
|
||||
|
||||
```rust
|
||||
let session_config = SessionConfigBuilder::new(&session_id)
|
||||
.system_prompt(system_prompt)
|
||||
.max_context_tokens(100_000) // Claude 的上下文窗口
|
||||
.context_compression_threshold(0.8) // 80% 时触发压缩
|
||||
.enable_ai_summary(true)
|
||||
.tool_response_retention_strategy(
|
||||
ToolResponseRetentionStrategy::Progressive {
|
||||
stages: vec![0.0, 0.1, 0.2, 0.5, 1.0]
|
||||
}
|
||||
)
|
||||
.build();
|
||||
```
|
||||
|
||||
## 验证方式
|
||||
|
||||
1. **单元测试**:测试 AI 摘要生成逻辑
|
||||
2. **集成测试**:发起 20+ 轮长对话,验证:
|
||||
- AI 摘要是否在 80% token 使用率时触发
|
||||
- 摘要质量是否优于本地关键词提取
|
||||
- 工具响应是否按渐进式策略移除
|
||||
3. **性能测试**:测试摘要生成的延迟和成本
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. ✅ 分析当前代码结构
|
||||
2. ⬜ 扩展 SessionConfigBuilder
|
||||
3. ⬜ 实现 AI 摘要生成逻辑
|
||||
4. ⬜ 改造 session_context_service.rs
|
||||
5. ⬜ 集成到 agent_cmd.rs
|
||||
6. ⬜ 编写单元测试
|
||||
7. ⬜ 进行集成测试
|
||||
8. ⬜ 性能优化和调优
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **向后兼容**:保留本地关键词提取作为降级方案
|
||||
2. **成本控制**:AI 摘要会产生额外的 API 调用成本
|
||||
3. **缓存策略**:摘要结果应该缓存,避免重复生成
|
||||
4. **错误处理**:AI 摘要失败时应优雅降级到本地摘要
|
||||
@@ -1,159 +0,0 @@
|
||||
# Lime AI Agent 改进 - 实施进度报告
|
||||
|
||||
> 历史记录:旧凭证池运行时已退役。本文中涉及真实模型调用的后续方案,以 current API Key Provider / configured providers / model registry 为准,不再接入 `ProviderPoolService`。
|
||||
|
||||
## 已完成工作
|
||||
|
||||
### 1. 研究与分析(任务 #1-#4)✅
|
||||
|
||||
通过对比研究 OpenAI Codex 和 agent-rust 框架,完成了 Lime AI Agent 的全面分析,输出了改进研究报告,识别了四大痛点:
|
||||
- 工具调用能力弱
|
||||
- 上下文管理差
|
||||
- 流式体验不好
|
||||
- 整体架构不清晰
|
||||
|
||||
### 2. 任务规划(任务 #8-#13)✅
|
||||
|
||||
创建了 6 个优先级任务:
|
||||
- **P0**: 升级上下文管理为 AI 驱动摘要(进行中)
|
||||
- **P1**: 统一对话架构(Agent Agent + Unified Chat)
|
||||
- **P2**: 拆分 useAgentChat hook(1200+ 行)
|
||||
- **P3**: 工具系统模块化(agent_cmd.rs 2000+ 行)
|
||||
- **P4**: 引入 SQ/EQ 异步队列对通信模型
|
||||
- **P5**: 多 Agent 协作能力
|
||||
|
||||
### 3. P0 阶段 1 实施(进行中)✅
|
||||
|
||||
#### 3.1 创建 AI 摘要服务
|
||||
|
||||
**文件**: `lime-rs/crates/services/src/ai_summary_service.rs`
|
||||
|
||||
**功能**:
|
||||
- `AISummaryService`: AI 摘要服务主体
|
||||
- `AISummaryConfig`: 可配置的摘要参数
|
||||
- `generate_summary()`: 生成会话摘要
|
||||
- `build_summary_prompt()`: 构建摘要提示词
|
||||
- `format_messages()`: 格式化消息列表
|
||||
|
||||
**特性**:
|
||||
- 支持配置摘要长度、主题数量、决策数量
|
||||
- 使用 JSON 格式返回结构化摘要
|
||||
- 包含完整的单元测试
|
||||
- 当前使用 mock 实现,待集成真实 LLM 调用
|
||||
|
||||
#### 3.2 集成到 services crate
|
||||
|
||||
- ✅ 添加模块导出到 `lib.rs`
|
||||
- ✅ 编译通过验证
|
||||
|
||||
## 下一步工作
|
||||
|
||||
### P0 阶段 1 剩余任务
|
||||
|
||||
#### 1. 改造 session_context_service.rs
|
||||
|
||||
**目标**: 集成 AI 摘要服务,实现优先使用 AI、失败时降级到本地的策略
|
||||
|
||||
**修改点**:
|
||||
- 添加 `ai_summary_service` 字段到 `SessionContextService`
|
||||
- 将 `create_summary()` 改为异步方法
|
||||
- 实现 AI 摘要优先逻辑
|
||||
- 保留 `create_summary_local()` 作为降级方案
|
||||
|
||||
#### 2. 集成真实 LLM 调用
|
||||
|
||||
**目标**: 替换 `call_summary_model_stub()` 为真实的 current model runtime 调用
|
||||
|
||||
**实现方式**:
|
||||
- 通过 API Key Provider / configured providers / model registry 解析可用模型
|
||||
- 使用 Claude Haiku 模型(成本低、速度快)
|
||||
- 实现重试机制(最多 3 次)
|
||||
- 添加超时控制(5 秒)
|
||||
|
||||
#### 3. Tauri 命令层集成
|
||||
|
||||
**目标**: 在应用启动时初始化 AI 摘要服务
|
||||
|
||||
**修改文件**:
|
||||
- `lime-rs/src/main.rs` 或相关初始化代码
|
||||
- 创建 `AISummaryService` 实例
|
||||
- 注入到 `SessionContextService`
|
||||
|
||||
#### 4. 测试验证
|
||||
|
||||
**单元测试**:
|
||||
- ✅ AI 摘要服务基础功能
|
||||
- ⬜ session_context_service 集成测试
|
||||
- ⬜ 降级逻辑测试
|
||||
|
||||
**集成测试**:
|
||||
- ⬜ 20+ 轮长对话测试
|
||||
- ⬜ AI 摘要触发验证
|
||||
- ⬜ 摘要质量评估
|
||||
|
||||
## 技术决策记录
|
||||
|
||||
### 决策 1: 采用分阶段混合策略
|
||||
|
||||
**背景**: agent 框架的上下文管理能力不明确
|
||||
|
||||
**决策**:
|
||||
- 阶段 1: 在 Lime 层实现 AI 摘要(当前)
|
||||
- 阶段 2: P1 完成后统一到 agent 框架
|
||||
|
||||
**理由**:
|
||||
- 快速交付价值,立即改善用户体验
|
||||
- 不阻塞 P1 任务,可并行推进
|
||||
- 降低风险,分步验证
|
||||
|
||||
### 决策 2: 使用 Claude Haiku 生成摘要
|
||||
|
||||
**理由**:
|
||||
- 成本低(相比 Opus/Sonnet)
|
||||
- 速度快(< 3 秒)
|
||||
- 质量足够(摘要任务不需要最强模型)
|
||||
|
||||
### 决策 3: 保留本地摘要作为降级方案
|
||||
|
||||
**理由**:
|
||||
- 确保功能可用性(AI 调用失败时)
|
||||
- 降低成本(用户可选择禁用 AI 摘要)
|
||||
- 向后兼容(已有代码不浪费)
|
||||
|
||||
## 文档输出
|
||||
|
||||
### 规划文档
|
||||
- `internal/iteration-notes/context-management-upgrade-plan.md` - 总体升级方案
|
||||
- `internal/iteration-notes/p0-context-management-implementation.md` - P0 实施文档
|
||||
- `internal/iteration-notes/p0-phase1-implementation-plan.md` - 阶段 1 详细计划
|
||||
|
||||
### 代码文件
|
||||
- `lime-rs/crates/services/src/ai_summary_service.rs` - AI 摘要服务(新增)
|
||||
- `lime-rs/crates/services/src/lib.rs` - 模块导出(已修改)
|
||||
|
||||
## 风险与缓解
|
||||
|
||||
### 风险 1: AI 摘要质量不稳定
|
||||
**状态**: 待验证
|
||||
**缓解**: 精心设计提示词,实现响应验证逻辑
|
||||
|
||||
### 风险 2: API 调用成本
|
||||
**状态**: 可控
|
||||
**缓解**: 使用 Haiku 模型,实现智能缓存,提供配置开关
|
||||
|
||||
### 风险 3: 与 P1 任务的依赖
|
||||
**状态**: 已解决
|
||||
**缓解**: 采用分阶段策略,P0 和 P1 可并行推进
|
||||
|
||||
## 下次会话建议
|
||||
|
||||
1. **继续 P0 阶段 1**: 完成 session_context_service.rs 改造
|
||||
2. **集成真实 LLM**: 替换 mock 实现
|
||||
3. **编写集成测试**: 验证 AI 摘要效果
|
||||
4. **或者开始 P2**: 拆分 useAgentChat hook(如果 P0 需要等待其他依赖)
|
||||
|
||||
## 参考资料
|
||||
|
||||
- 研究报告: Lime AI Agent 改进研究报告
|
||||
- Codex 架构: SQ/EQ 异步队列对、AI 摘要
|
||||
- agent-rust: 渐进式工具响应移除、SubAgentScheduler
|
||||
@@ -1,143 +0,0 @@
|
||||
# P0: 上下文管理升级实施文档
|
||||
|
||||
## 当前状态分析
|
||||
|
||||
### 代码结构
|
||||
|
||||
1. **session_context_service.rs** (lime-rs/crates/services/src/)
|
||||
- 负责 general 模式的上下文管理
|
||||
- 使用本地关键词提取生成摘要(第 355-463 行)
|
||||
- 支持配置:max_messages、max_characters、summary_threshold
|
||||
|
||||
2. **SessionConfigBuilder** (lime-rs/crates/agent/src/agent_state_support.rs)
|
||||
- 用于构建 agent Agent 的会话配置
|
||||
- 当前字段:id、max_turns、system_prompt、include_context_trace
|
||||
- 缺少上下文压缩相关配置
|
||||
|
||||
3. **AgentWrapper** (lime-rs/src/agent/agent_agent.rs)
|
||||
- 在第 48-50 行创建 SessionConfig
|
||||
- 只设置了 `include_context_trace(true)`
|
||||
|
||||
### 问题识别
|
||||
|
||||
1. **双轨制**:
|
||||
- general 模式使用 session_context_service.rs
|
||||
- agent 模式使用 agent 框架
|
||||
- 两者的上下文管理策略不统一
|
||||
|
||||
2. **摘要质量差**:
|
||||
- session_context_service.rs 使用硬编码关键词匹配
|
||||
- 无法理解语义,摘要质量低
|
||||
|
||||
3. **agent 能力未接入**:
|
||||
- 不清楚 agent 框架是否内置上下文压缩
|
||||
- SessionConfig 未暴露相关配置
|
||||
|
||||
## 实施策略
|
||||
|
||||
### 策略 A:利用 agent 内置能力(优先)
|
||||
|
||||
**前提**:agent 框架已内置上下文压缩和 AI 摘要
|
||||
|
||||
**步骤**:
|
||||
1. 研究 agent 框架文档,确认内置能力
|
||||
2. 扩展 SessionConfigBuilder,暴露配置接口
|
||||
3. 在 AgentWrapper 中配置上下文压缩参数
|
||||
4. 将 general 模式迁移到 agent 框架(与 P1 任务关联)
|
||||
|
||||
**优点**:
|
||||
- 复用 agent 的成熟实现
|
||||
- 统一 agent 和 general 模式的上下文管理
|
||||
- 减少维护成本
|
||||
|
||||
**缺点**:
|
||||
- 依赖 agent 框架的能力
|
||||
- 需要等待 P1 任务完成(general 模式迁移)
|
||||
|
||||
### 策略 B:在 Lime 层实现(备选)
|
||||
|
||||
**前提**:agent 框架不支持或支持不足
|
||||
|
||||
**步骤**:
|
||||
1. 改造 session_context_service.rs,实现 AI 摘要
|
||||
2. 创建 LLM Provider 抽象,调用 AI 模型生成摘要
|
||||
3. 实现渐进式工具响应移除策略
|
||||
4. 为 agent Agent 创建类似的上下文管理服务
|
||||
|
||||
**优点**:
|
||||
- 完全可控,不依赖外部框架
|
||||
- 可以针对 Lime 的场景优化
|
||||
|
||||
**缺点**:
|
||||
- 需要自己实现和维护
|
||||
- 代码量大,开发周期长
|
||||
- 可能与 agent 框架的内置能力冲突
|
||||
|
||||
## 下一步行动
|
||||
|
||||
### 立即执行
|
||||
|
||||
1. **研究 agent 框架**:
|
||||
- 查看 agent-rust GitHub 仓库文档
|
||||
- 搜索 context、compression、summary 相关代码
|
||||
- 确认是否有内置的上下文压缩能力
|
||||
|
||||
2. **决策路径**:
|
||||
- 如果 agent 有内置能力 → 采用策略 A
|
||||
- 如果 agent 没有或不足 → 采用策略 B
|
||||
|
||||
### 待确认问题
|
||||
|
||||
1. agent 框架的 SessionConfig 支持哪些字段?
|
||||
2. agent 是否有 context_mgmt 模块?(研究报告提到)
|
||||
3. agent 的 AI 摘要是如何实现的?
|
||||
4. agent 的渐进式工具响应移除是如何配置的?
|
||||
|
||||
## 验证计划
|
||||
|
||||
### 单元测试
|
||||
|
||||
- [ ] 测试 AI 摘要生成逻辑
|
||||
- [ ] 测试摘要缓存机制
|
||||
- [ ] 测试降级到本地摘要的逻辑
|
||||
|
||||
### 集成测试
|
||||
|
||||
- [ ] 发起 20+ 轮长对话
|
||||
- [ ] 验证 AI 摘要在 80% token 使用率时触发
|
||||
- [ ] 对比 AI 摘要与本地摘要的质量
|
||||
- [ ] 验证工具响应的渐进式移除
|
||||
|
||||
### 性能测试
|
||||
|
||||
- [ ] 测试摘要生成的延迟
|
||||
- [ ] 评估 API 调用成本
|
||||
- [ ] 测试缓存命中率
|
||||
|
||||
## 风险与缓解
|
||||
|
||||
### 风险 1:agent 框架能力不足
|
||||
|
||||
**缓解**:准备策略 B 作为备选方案
|
||||
|
||||
### 风险 2:AI 摘要成本过高
|
||||
|
||||
**缓解**:
|
||||
- 实现智能缓存策略
|
||||
- 提供本地摘要作为降级方案
|
||||
- 允许用户配置是否启用 AI 摘要
|
||||
|
||||
### 风险 3:与 P1 任务的依赖关系
|
||||
|
||||
**缓解**:
|
||||
- P0 和 P1 可以并行推进
|
||||
- P0 先在 agent 模式验证,P1 完成后再统一
|
||||
|
||||
## 参考资料
|
||||
|
||||
- 研究报告:Lime AI Agent 改进研究报告
|
||||
- 当前内置路径:`lime-rs/crates/agent-rust/`
|
||||
- 相关文件:
|
||||
- lime-rs/crates/services/src/session_context_service.rs
|
||||
- lime-rs/crates/agent/src/agent_state_support.rs
|
||||
- lime-rs/src/agent/agent_agent.rs
|
||||
@@ -1,230 +0,0 @@
|
||||
# P0 实施方案:分阶段升级上下文管理
|
||||
|
||||
> 历史记录:旧凭证池运行时已退役。AI 摘要若接入真实模型调用,只能走 current API Key Provider / configured providers / model registry 主路径。
|
||||
|
||||
## 决策:采用混合策略
|
||||
|
||||
基于当前分析,我决定采用**分阶段混合策略**:
|
||||
|
||||
### 阶段 1:快速改进(本次实施)
|
||||
在 session_context_service.rs 中实现 AI 驱动的摘要,作为立即可用的改进。
|
||||
|
||||
### 阶段 2:架构统一(P1 完成后)
|
||||
将 general 模式迁移到 agent 框架,统一上下文管理策略。
|
||||
|
||||
## 阶段 1 实施细节
|
||||
|
||||
### 1.1 创建 AI 摘要服务
|
||||
|
||||
创建新文件:`lime-rs/crates/services/src/ai_summary_service.rs`
|
||||
|
||||
```rust
|
||||
//! AI 驱动的会话摘要服务
|
||||
|
||||
use lime_core::general_chat::ChatMessage;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct AISummaryRequest {
|
||||
pub messages: Vec<ChatMessage>,
|
||||
pub max_summary_length: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct AISummaryResponse {
|
||||
pub summary: String,
|
||||
pub key_topics: Vec<String>,
|
||||
pub decisions: Vec<String>,
|
||||
}
|
||||
|
||||
pub struct AISummaryService {
|
||||
// 使用 Lime current model runtime,不接入旧凭证池
|
||||
runtime: Arc<ModelRuntime>,
|
||||
}
|
||||
|
||||
impl AISummaryService {
|
||||
pub async fn generate_summary(
|
||||
&self,
|
||||
request: AISummaryRequest,
|
||||
) -> Result<AISummaryResponse, String> {
|
||||
// 1. 构建摘要提示词
|
||||
let prompt = self.build_summary_prompt(&request.messages);
|
||||
|
||||
// 2. 调用 AI 模型
|
||||
let response = self.call_llm(&prompt).await?;
|
||||
|
||||
// 3. 解析响应
|
||||
self.parse_summary_response(&response)
|
||||
}
|
||||
|
||||
fn build_summary_prompt(&self, messages: &[ChatMessage]) -> String {
|
||||
format!(
|
||||
"请为以下对话生成简洁的摘要(不超过 {} 字):\n\n{}\n\n要求:\n1. 提取关键主题(3-5个)\n2. 总结重要决策\n3. 保留技术细节",
|
||||
500,
|
||||
self.format_messages(messages)
|
||||
)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 1.2 改造 session_context_service.rs
|
||||
|
||||
修改 `create_summary()` 方法:
|
||||
|
||||
```rust
|
||||
/// 创建会话摘要(优先使用 AI,失败时降级到本地)
|
||||
async fn create_summary(
|
||||
&self,
|
||||
session_id: &str,
|
||||
messages: &[ChatMessage],
|
||||
) -> Result<SessionSummary, String> {
|
||||
// 尝试使用 AI 摘要
|
||||
if let Some(ai_service) = &self.ai_summary_service {
|
||||
match ai_service.generate_summary(messages).await {
|
||||
Ok(ai_summary) => {
|
||||
return Ok(SessionSummary {
|
||||
session_id: session_id.to_string(),
|
||||
summary: ai_summary.summary,
|
||||
key_topics: ai_summary.key_topics,
|
||||
decisions: ai_summary.decisions,
|
||||
created_at: chrono::Utc::now().timestamp_millis(),
|
||||
message_count: messages.len() as i32,
|
||||
last_message_id: messages.last().unwrap().id.clone(),
|
||||
});
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::warn!("AI 摘要生成失败,降级到本地摘要: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 降级到本地关键词提取
|
||||
self.create_summary_local(session_id, messages)
|
||||
}
|
||||
|
||||
/// 本地关键词提取摘要(保留作为降级方案)
|
||||
fn create_summary_local(
|
||||
&self,
|
||||
session_id: &str,
|
||||
messages: &[ChatMessage],
|
||||
) -> Result<SessionSummary, String> {
|
||||
// 原有的本地摘要逻辑
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 1.3 配置注入
|
||||
|
||||
修改 `SessionContextService` 构造函数:
|
||||
|
||||
```rust
|
||||
pub struct SessionContextService {
|
||||
db_connection: Arc<Mutex<Connection>>,
|
||||
config: ContextWindowConfig,
|
||||
summary_cache: Arc<Mutex<HashMap<String, SessionSummary>>>,
|
||||
ai_summary_service: Option<Arc<AISummaryService>>, // 新增
|
||||
}
|
||||
|
||||
impl SessionContextService {
|
||||
pub fn new(
|
||||
db_connection: Arc<Mutex<Connection>>,
|
||||
config: ContextWindowConfig,
|
||||
ai_summary_service: Option<Arc<AISummaryService>>,
|
||||
) -> Self {
|
||||
Self {
|
||||
db_connection,
|
||||
config,
|
||||
summary_cache: Arc::new(Mutex::new(HashMap::new())),
|
||||
ai_summary_service,
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 实施步骤
|
||||
|
||||
### Step 1: 创建 AI 摘要服务 ✅
|
||||
- [ ] 创建 `ai_summary_service.rs`
|
||||
- [ ] 实现 `generate_summary()` 方法
|
||||
- [ ] 实现提示词构建逻辑
|
||||
- [ ] 实现响应解析逻辑
|
||||
|
||||
### Step 2: 改造 session_context_service.rs ✅
|
||||
- [ ] 添加 `ai_summary_service` 字段
|
||||
- [ ] 修改 `create_summary()` 为异步方法
|
||||
- [ ] 实现 AI 摘要优先、本地降级的逻辑
|
||||
- [ ] 保留 `create_summary_local()` 作为降级方案
|
||||
|
||||
### Step 3: 集成到命令层 ✅
|
||||
- [ ] 在 Tauri 命令初始化时创建 `AISummaryService`
|
||||
- [ ] 注入到 `SessionContextService`
|
||||
- [ ] 更新相关的 Tauri 命令
|
||||
|
||||
### Step 4: 测试验证 ✅
|
||||
- [ ] 编写单元测试
|
||||
- [ ] 编写集成测试
|
||||
- [ ] 手动测试 20+ 轮对话
|
||||
- [ ] 验证降级逻辑
|
||||
|
||||
## 成本控制
|
||||
|
||||
### 摘要触发策略
|
||||
- 只在消息数量超过 `summary_threshold`(默认 30)时触发
|
||||
- 摘要结果缓存,避免重复生成
|
||||
- 提供配置开关,允许用户禁用 AI 摘要
|
||||
|
||||
### API 调用优化
|
||||
- 使用较小的模型(如 Claude Haiku)生成摘要
|
||||
- 限制摘要长度(500 字以内)
|
||||
- 批量处理多个会话的摘要请求
|
||||
|
||||
## 验证指标
|
||||
|
||||
### 质量指标
|
||||
- AI 摘要的信息保留率 > 80%
|
||||
- 关键主题提取准确率 > 90%
|
||||
- 用户满意度评分 > 4/5
|
||||
|
||||
### 性能指标
|
||||
- 摘要生成延迟 < 3 秒
|
||||
- 缓存命中率 > 70%
|
||||
- API 调用成本 < $0.01/会话
|
||||
|
||||
### 可靠性指标
|
||||
- 降级成功率 100%
|
||||
- AI 摘要失败时不影响对话流程
|
||||
- 错误日志完整,便于排查
|
||||
|
||||
## 风险缓解
|
||||
|
||||
### 风险 1:AI 摘要质量不稳定
|
||||
**缓解措施**:
|
||||
- 精心设计提示词,包含明确的格式要求
|
||||
- 实现响应验证逻辑,拒绝低质量摘要
|
||||
- 提供用户反馈机制,持续优化提示词
|
||||
|
||||
### 风险 2:API 调用失败
|
||||
**缓解措施**:
|
||||
- 实现重试机制(最多 3 次)
|
||||
- 降级到本地摘要,确保功能可用
|
||||
- 记录详细的错误日志
|
||||
|
||||
### 风险 3:成本超预期
|
||||
**缓解措施**:
|
||||
- 实现智能缓存策略
|
||||
- 提供配置开关,允许用户控制
|
||||
- 监控 API 调用量,设置告警阈值
|
||||
|
||||
## 后续优化(阶段 2)
|
||||
|
||||
在 P1 任务完成后:
|
||||
1. 将 general 模式迁移到 agent 框架
|
||||
2. 统一 agent 和 general 的上下文管理
|
||||
3. 利用 agent 的渐进式工具响应移除能力
|
||||
4. 实现更智能的上下文压缩策略
|
||||
|
||||
## 参考资料
|
||||
|
||||
- 研究报告:Lime AI Agent 改进研究报告
|
||||
- Codex 上下文压缩:AI 摘要 + 保留最近消息
|
||||
- agent 上下文管理:渐进式工具响应移除 + 摘要
|
||||
@@ -32,7 +32,7 @@ Codex runtime 与多模型/provider 的逐项对齐方案另见 [v1/README.md](v
|
||||
## 文档索引
|
||||
|
||||
- **架构债证据底座**(五轴实证,结论可复查):`architecture-debt-analysis.md`
|
||||
- **执行计划**(按机制杠杆排序的 R-xx 队列):`progressive-refactor-plan.md`
|
||||
- **执行计划**:`v2/IMPLEMENTATION-PLAN.md`
|
||||
- **未来代码结构指引**(北极星目标结构 + 新代码落点决策表 + T1/T2/T3 中长期规划):`directory-architecture-blueprint.md`
|
||||
- **文件体量棘轮守卫规格**(轴 F 护栏的实现契约):`file-size-ratchet-guard-spec.md`
|
||||
- **Codex 工程模式借鉴**(五轴对照:协议 ts-rs 生成链、domain processor、抗膨胀,含抄什么/避什么结论):`codex-engineering-patterns.md`
|
||||
@@ -57,7 +57,7 @@ Codex runtime 与多模型/provider 的逐项对齐方案另见 [v1/README.md](v
|
||||
|
||||
## 执行纪律
|
||||
|
||||
1. 每刀对应 `progressive-refactor-plan.md` 一个 `R-xx`,动手前更新状态、收尾补进度日志。
|
||||
1. 每刀对应 `v2/IMPLEMENTATION-PLAN.md` 的 current 阶段;动手前更新状态,收尾只记录可复现验证和剩余 blocker。
|
||||
2. 排序按 `AGENTS.md` 执行规则 3:选对整体完成度提升最大的,不挑顺手的。
|
||||
3. 拆分前先抽纯逻辑到 `*.unit.test.ts` / 子模块单测兜底(硬规则 9/12),测试随代码迁移。
|
||||
4. 用户可见文案五语言同步(硬规则 10);协议改动四侧同步 + `test:contracts`(硬规则 3)。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> 状态:evidence(2026-06-11 实测采集,2026-06-17 复核标注治理进展)
|
||||
> 采集方式:依赖图扫描 + import grep + 文件大纲抽查 + 本轮 `project_git` 新增方法的真实写集
|
||||
> 用途:支撑 `progressive-refactor-plan.md` 的优先级排序;任何条目的优先级争议先回到本文件核对证据
|
||||
> 用途:支撑 `v2/IMPLEMENTATION-PLAN.md` 的优先级排序;任何条目的优先级争议先回到本文件核对证据
|
||||
> 复核约定:原始证据(2026-06-11 快照)保留不改;治理后状态用 **【2026-06-17 复核】** 行内标注,便于对照"病灶 → 已修"
|
||||
|
||||
所有路径相对仓库根。行数为采集日快照,复查时允许漂移。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> 状态:参考材料(v2,2026-06-11 基于 codex 仓库深扫重写)
|
||||
> 对比对象:/Users/coso/Documents/dev/rust/codex(codex-rs workspace,125 crates,~97 万行 Rust)
|
||||
> 用途:为 `progressive-refactor-plan.md` 各轴提供可抄的参考实现;为 `directory-architecture-blueprint.md` 提供目标拓扑佐证
|
||||
> 用途:为 `v2/IMPLEMENTATION-PLAN.md` 提供可复用的参考实现;为 `directory-architecture-blueprint.md` 提供目标拓扑佐证
|
||||
> 阅读方式:按 Lime 的轴 A-F 逐轴对照,每轴给出 codex 的做法、证据路径、Lime 的借鉴决策
|
||||
|
||||
---
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
> 状态:proposed(v3,2026-06-11;应用户要求以**目标态**为主体重写,恢复中长期 T1/T2/T3 规划)
|
||||
> 上位规则:`AGENTS.md`、`internal/refactor/README.md`
|
||||
> 拓扑参照:codex 的"一个 App Server + 多客户端壳"已验证形态(`codex-engineering-patterns.md` § 顶层拓扑)
|
||||
> 定位:本文件描述**代码未来应该长什么样、新代码应该落在哪**;现状的烂账只在证据底座 `architecture-debt-analysis.md` 里,这里不再复述。执行排期一律走 `progressive-refactor-plan.md`
|
||||
> 定位:本文件描述**代码未来应该长什么样、新代码应该落在哪**;现状证据只在 `architecture-debt-analysis.md`,执行排期一律走 `v2/IMPLEMENTATION-PLAN.md`
|
||||
|
||||
---
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user