fuli-context 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -13
- package/README.zh-CN.md +60 -14
- package/dist/web/assets/{AboutPage-ByCUor-j.js → AboutPage-BcZeFcHe.js} +1 -1
- package/dist/web/assets/{ConnectionsPage-DkdkZ40Q.js → ConnectionsPage-xAQYl1SQ.js} +1 -1
- package/dist/web/assets/EmployeeRecruitDialog-CbPAmhy7.js +1 -0
- package/dist/web/assets/EmployeeRecruitDialog-CfFlyKSh.css +1 -0
- package/dist/web/assets/EmployeeWorkbenchPage-BQvTLoc8.css +1 -0
- package/dist/web/assets/EmployeeWorkbenchPage-DF3EL0Ui.js +1 -0
- package/dist/web/assets/KnowledgeEditDialog-UnnBDt0I.js +1 -0
- package/dist/web/assets/{KnowledgeEditDialog-DWUV_NPp.css → KnowledgeEditDialog-iv-dgUeD.css} +1 -1
- package/dist/web/assets/{KnowledgeInspector-CYAjAb9J.js → KnowledgeInspector-BqPJH5Rr.js} +1 -1
- package/dist/web/assets/{KnowledgeOrganizerPage-CV4F54R_.js → KnowledgeOrganizerPage-CyvRflXM.js} +1 -1
- package/dist/web/assets/KnowledgePage-59eczTqe.js +1 -0
- package/dist/web/assets/{KnowledgeWorkspace-z4u5mXOG.js → KnowledgeWorkspace-CfIjhOog.js} +1 -1
- package/dist/web/assets/{OverviewPage-BWOfeS6k.js → OverviewPage-Xyfm5xkZ.js} +1 -1
- package/dist/web/assets/{PersonalProfilePage-c3w4-h7a.js → PersonalProfilePage-DB9mByB3.js} +1 -1
- package/dist/web/assets/PersonalProjectsPage-_-YXVi5O.js +1 -0
- package/dist/web/assets/ProjectAgentsPage-C3vW6wmk.css +1 -0
- package/dist/web/assets/ProjectAgentsPage-DeeQByPX.js +11 -0
- package/dist/web/assets/{PublicProjectsPage-DdH0oGB3.js → PublicProjectsPage-BEZ1YPs3.js} +1 -1
- package/dist/web/assets/{ReviewPage-BYIpcIHG.js → ReviewPage-CQYGwFBH.js} +1 -1
- package/dist/web/assets/SearchableSelect-D27H0MoP.js +1 -0
- package/dist/web/assets/{SettingsPage-2VkbXgZi.js → SettingsPage-BlEZ03Yi.js} +1 -1
- package/dist/web/assets/{WritingTastePage-BOPQZuva.js → WritingTastePage-DvRt_nmP.js} +1 -1
- package/dist/web/assets/catalog-DFvIaHVS.js +1 -0
- package/dist/web/assets/{console-BlAhujsH.js → console-tOxOl8Vq.js} +1 -1
- package/dist/web/assets/conversation-launcher-settings-DuFSpPAo.js +1 -0
- package/dist/web/assets/{i18n-Ci3heuiL.js → i18n-CgBHZthI.js} +3 -3
- package/dist/web/assets/{identity-4_-v6cB7.js → identity-CFo_Uw1H.js} +1 -1
- package/dist/web/assets/index-CJc5ppXH.css +1 -0
- package/dist/web/assets/index-yCi3cz2l.js +2 -0
- package/dist/web/assets/{model-yG0YqUyZ.js → model-BtnVr7fX.js} +1 -1
- package/dist/web/assets/{useApi-CROJJdhE-twhdZArA.js → useApi-CROJJdhE-B6MHm_Av.js} +1 -1
- package/dist/web/assets/{vue-router-C-wot_Di.js → vue-router-CzHm-y-x.js} +1 -1
- package/dist/web/index.html +7 -6
- package/docs/employee-agents.md +99 -0
- package/docs/project-agent-memory.md +479 -0
- package/graph-provider/fuli_graph/knowledge_audit_models.py +171 -0
- package/graph-provider/fuli_graph/model_base.py +5 -0
- package/graph-provider/fuli_graph/model_validation.py +32 -0
- package/graph-provider/fuli_graph/models.py +26 -170
- package/graph-provider/fuli_graph/project_agent_context_models.py +29 -0
- package/graph-provider/fuli_graph/project_agent_coordination_models.py +22 -0
- package/graph-provider/fuli_graph/project_agent_executor_models.py +35 -7
- package/graph-provider/fuli_graph/project_agent_memory_models.py +79 -0
- package/graph-provider/fuli_graph/project_agent_memory_routes.py +46 -0
- package/graph-provider/fuli_graph/project_agent_models.py +9 -0
- package/graph-provider/fuli_graph/project_agent_recruitment_values.py +48 -0
- package/graph-provider/fuli_graph/project_agent_routes.py +50 -1
- package/graph-provider/fuli_graph/project_agent_task_models.py +220 -29
- package/graph-provider/fuli_graph/runtime.py +37 -1
- package/graph-provider/fuli_graph/store.py +6 -0
- package/graph-provider/fuli_graph/store_project_agent_context.py +65 -0
- package/graph-provider/fuli_graph/store_project_agent_coordination_policy.py +122 -0
- package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +175 -11
- package/graph-provider/fuli_graph/store_project_agent_executor_routing.py +33 -10
- package/graph-provider/fuli_graph/store_project_agent_executors.py +181 -14
- package/graph-provider/fuli_graph/store_project_agent_memory.py +174 -0
- package/graph-provider/fuli_graph/store_project_agent_task_activity.py +423 -0
- package/graph-provider/fuli_graph/store_project_agent_task_persistence.py +152 -0
- package/graph-provider/fuli_graph/store_project_agent_task_reads.py +187 -21
- package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +756 -164
- package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +396 -7
- package/graph-provider/fuli_graph/store_project_agent_tasks.py +265 -465
- package/graph-provider/fuli_graph/store_project_agents.py +214 -46
- package/graph-provider/fuli_graph/store_task_contexts.py +217 -0
- package/graph-provider/fuli_graph/store_transactions.py +40 -0
- package/graph-provider/fuli_graph/task_context_models.py +50 -0
- package/graph-provider/fuli_graph/task_context_routes.py +31 -0
- package/graph-provider/fuli_graph/workflow_observation_models.py +1 -1
- package/graph-provider/pyproject.toml +1 -1
- package/npm-shrinkwrap.json +8 -8
- package/package.json +5 -2
- package/skills/capturing-session-knowledge/SKILL.md +18 -6
- package/src/adaptive-runtime/executor-pool.js +46 -5
- package/src/adaptive-runtime/graph-services.js +10 -3
- package/src/adaptive-runtime/lease-client.js +66 -14
- package/src/adaptive-runtime/runtime-broker.js +24 -9
- package/src/agent-tools/employee-definitions.js +43 -0
- package/src/agent-tools/graph-definitions.js +48 -6
- package/src/agent-tools/graph-handlers.js +15 -0
- package/src/agent-tools/project-agent-definitions.js +35 -4
- package/src/agent-tools/project-agent-memory-definitions.js +36 -0
- package/src/agent-tools.js +6 -2
- package/src/agents/codex/lifecycle-hook.js +107 -0
- package/src/agents/codex/lifecycle-hooks.js +231 -0
- package/src/agents/cursor/lifecycle-hook.js +133 -0
- package/src/agents/cursor/lifecycle-hooks.js +50 -0
- package/src/agents/lifecycle-message.js +19 -0
- package/src/app/agent-request-context.js +23 -0
- package/src/cli/command-registry.js +2 -0
- package/src/cli/employee-command.js +17 -0
- package/src/cli/remote-mcp-command.js +282 -0
- package/src/cli/setup-command.js +5 -0
- package/src/cli.js +10 -0
- package/src/employees/catalog/jefa.json +21 -0
- package/src/employees/install-package.js +77 -0
- package/src/employees/management-policy.js +88 -0
- package/src/employees/manifest.js +53 -0
- package/src/employees/package-registry.js +107 -0
- package/src/employees/project-selection.js +50 -0
- package/src/employees/recruitment.js +199 -0
- package/src/employees/service.js +83 -0
- package/src/employees/task-entry.js +39 -0
- package/src/graphiti/agent-knowledge-workflows.js +135 -25
- package/src/graphiti/federated-application.js +78 -35
- package/src/graphiti/project-agent-control-plane.js +32 -3
- package/src/graphiti/project-agent-mapping.js +175 -4
- package/src/graphiti/project-agent-memory.js +115 -0
- package/src/graphiti/project-agent-task-entry.js +126 -0
- package/src/graphiti/project-agent-workflows.js +49 -14
- package/src/graphiti/provider-client.js +78 -4
- package/src/http/api-router.js +25 -5
- package/src/http/employee-api-router.js +64 -0
- package/src/http/error-mapping.js +4 -0
- package/src/http/graph-api-router.js +14 -0
- package/src/http/request-policy.js +6 -3
- package/src/http/static-handler.js +4 -3
- package/src/mcp/create-mcp-server.js +98 -37
- package/src/mcp/direct-call.js +38 -0
- package/src/mcp/instructions.js +8 -7
- package/src/mcp/provider-task-context-registry.js +74 -0
- package/src/mcp/remote-http-server.js +761 -0
- package/src/mcp/session-id.js +29 -3
- package/src/mcp/task-context-registry.js +88 -29
- package/src/mcp/tool-annotations.js +12 -2
- package/src/mcp/tool-result.js +8 -3
- package/src/mcp-server.js +20 -8
- package/src/native-runtime/runtime.js +58 -8
- package/src/server.js +76 -28
- package/src/setup/agent-installation-status.js +38 -6
- package/src/setup/agents.js +20 -8
- package/src/setup/claude-code-config.js +55 -13
- package/src/setup/codex-bootstrap.js +11 -10
- package/src/setup/codex-config.js +74 -7
- package/src/setup/config-backup.js +18 -2
- package/src/setup/cursor-config.js +22 -5
- package/src/setup/setup.js +30 -22
- package/src/storage/json-file.js +11 -3
- package/dist/web/assets/KnowledgeEditDialog-DSe3Gwep.js +0 -1
- package/dist/web/assets/KnowledgePage-vYYXipOi.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-B7AlLEwf.js +0 -1
- package/dist/web/assets/ProjectAgentsPage-CgftpIPB.css +0 -1
- package/dist/web/assets/ProjectAgentsPage-DTHcL_ox.js +0 -11
- package/dist/web/assets/SearchableSelect-Dz13ClQb.js +0 -1
- package/dist/web/assets/conversation-launcher-settings-DTYxiLJt.js +0 -1
- package/dist/web/assets/index-BnH5mcZx.css +0 -1
- package/dist/web/assets/index-C67Q0JY2.js +0 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Specialist Agents
|
|
2
|
+
|
|
3
|
+
An employee template is a reusable role with an optional FULI-hosted workbench. Recruitment reuses the existing durable Project Agent identity and assignment model. The first built-in template is **Jefa, project manager**; adding another employee does not require a host-side special case.
|
|
4
|
+
|
|
5
|
+
## User flow
|
|
6
|
+
|
|
7
|
+
Open **Project Agents → Hire an Agent**, select a template and its responsibility policy, then hire. The custom project picker supports multiple selection, individual exclusions, search, and **Invert selection**. A newly recruited Jefa defaults to **All projects**, including future active projects unless explicitly excluded. **Selected projects** keeps a fixed selection; selecting none in that mode hires without a project. The Agent directory reflects the persistent identity; **Specialist Agents → Jefa** in the sidebar opens its installed board directly. No project is created implicitly. A missing project can be created from the existing personal-project directory.
|
|
8
|
+
|
|
9
|
+
Specialist workspaces use a compact host toolbar rather than the generic console heading. They keep the workspace's own navigation and content, plus the host's project switcher and responsibility editor. The selected project is reflected in the URL; an unauthorized explicit deep link is never silently redirected to a different project. Empty assignments, unavailable templates and catalog errors each have an actionable state. The `employee` CLI/API/manifest names are unchanged for compatibility.
|
|
10
|
+
|
|
11
|
+
If a page was open across a build update and its lazy-loaded files are no longer available, the console retains the current page and offers **Reload and open** for the intended destination. It does not automatically discard the current page or enter a reload loop. Application HTML is revalidated and missing assets are not cached.
|
|
12
|
+
|
|
13
|
+
**All projects is a standing policy; Selected projects is a snapshot.** An upgrade preserves the selection of existing employees until the user explicitly enables the new policy. Archived projects are unavailable. For an existing employee, use **Manage assigned projects** in its details or workbench; the older assignment action routes to the same editor. Removing a project ends its assignment with temporal history and excludes it from all-project management; it does not delete the employee, project, board, or tasks. Existing archived-project history and unavailable exclusion IDs are preserved.
|
|
14
|
+
|
|
15
|
+
The directory's **Filter projects** control supports multi-selection and inversion but only changes which Agents are shown. Its unrestricted view includes unassigned Agents; employee project views use effective responsibility, not ended history. Filtering never changes permissions or preselects additional projects in the editor. The editor retains its last-read baseline even if another consumer refreshes the catalog. The workbench's **Currently viewing** selector switches one isolated board; its separate management action edits responsibility. Future-project policy coverage does not fabricate Provider assignment history.
|
|
16
|
+
|
|
17
|
+
Repeat recruitment is idempotent. Customized profile preferences and executor/model policies are preserved. One employee identity can have multiple project assignments. Reactivating an inactive identity is an explicit action; a conflicting unrelated identity is never overwritten. Recruitment does not start an executor or constitute model usage.
|
|
18
|
+
|
|
19
|
+
The catalog shows whether a workbench package is actually installed. Identity-only templates need no runtime and remain valid employees without a sidebar workbench.
|
|
20
|
+
|
|
21
|
+
## Local installation
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
fl employee install <built-package-directory>
|
|
25
|
+
fl employee install <built-package-directory> --replace
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
An optional `--runtime-config <file>` selects a specific existing FULI runtime. The command only installs the local directory supplied by the operator. It does not download a package, execute an install script, change Agent client settings or start another server.
|
|
29
|
+
|
|
30
|
+
Packages live under the configured FULI data directory, separately from employee board data. Changed packages require `--replace`; upgrades keep a backup and never overwrite board data. Content identity is verified from the files, not merely from the installation receipt. A loaded runtime changes after FULI restarts.
|
|
31
|
+
|
|
32
|
+
Only a regular `.installation.json` at the package root is excluded from content identity as host-generated metadata. File-type validation still rejects receipt symlinks before installation can write through them. Files with that name in subdirectories remain package content: changes require an explicit replacement, and directory contents still undergo normal validation.
|
|
33
|
+
|
|
34
|
+
**Installed runtimes are trusted JavaScript running with the host's privileges, not sandboxed plugins.** Only install trusted packages. Path confinement, manifest validation, size limits, rejection of symlinks, `.env`, `.git` and `node_modules` protect the installation boundary; they do not make malicious runtime code safe.
|
|
35
|
+
|
|
36
|
+
## Manifest API v1
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"schemaVersion": 1,
|
|
41
|
+
"id": "release-reviewer",
|
|
42
|
+
"version": "1.0.0",
|
|
43
|
+
"name": "Release reviewer",
|
|
44
|
+
"role": "Release reviewer",
|
|
45
|
+
"description": "Reviews a project's release checklist.",
|
|
46
|
+
"occupationEmoji": "🔎",
|
|
47
|
+
"capabilities": ["Release review"],
|
|
48
|
+
"workKinds": ["release_review"],
|
|
49
|
+
"initialPreferences": ["Read the checklist before proposing changes."],
|
|
50
|
+
"permissions": ["release.read"],
|
|
51
|
+
"runtime": null
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
For a workbench, replace `runtime: null` with:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{ "apiVersion": 1, "entry": "runtime/index.mjs", "webRoot": "web" }
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The runtime exports `createEmployeeRuntime({ dataDirectory, packageDirectory, manifest })`, returning:
|
|
62
|
+
|
|
63
|
+
| Method | Contract |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| `describeTools()` | Tool names, descriptions, required manifest permission and JSON input schemas |
|
|
66
|
+
| `callTool(name, arguments, context)` | Validate arguments and execute inside the supplied space/project |
|
|
67
|
+
| `handleHttp(request, response, context)` | Serve the workbench without creating a listener |
|
|
68
|
+
| `close()` | Release database handles and other owned resources |
|
|
69
|
+
|
|
70
|
+
Context includes `personalSpaceId`, `project`, `agentId`, and `basePath`; HTTP adds `origin` and `relativePath`. Runtime code must not substitute a caller-supplied project for trusted context. A tool can be called only if its permission is declared by the manifest. New public catalog metadata is not an authorization grant to execute shell commands or use external credentials.
|
|
71
|
+
|
|
72
|
+
Optional manifest fields `defaultProjectScope: "all" | "selected"` and `taskEntry: { "boardTool": "read_board", "titleTool": "prepare_session_title" }` declare defaults and task-entry participation without a template-specific host branch. Context also carries the trusted `management` policy and native `session` identity when available. Task-entry board tools must declare `board.read`; the host returns bounded data and guidance, not an automatically started worker. A failed employee runtime degrades manager context without breaking collaboration preferences.
|
|
73
|
+
|
|
74
|
+
The reserved identity is `employee.<template-id>`, recognized by the generic `fuli.employee:<template-id>` capability. Preserve this marker when customizing employee profiles. The actual role, history, memory and project assignments remain in FULI's existing Agent model.
|
|
75
|
+
|
|
76
|
+
## HTTP and MCP
|
|
77
|
+
|
|
78
|
+
The host serves `/api/employee-templates`, recruitment/workspace/tool endpoints below it, and `/employee-workspaces/<template-id>/<project-id>/…`. Existing Host/Origin, JSON-body and LAN authorization checks apply. All workbench requests require an active matching identity and authorized responsibility policy, including assets and Agent discovery. Selected mode additionally requires an active assignment; all mode includes future active projects but enforces explicit exclusions and ended assignments before reaching the runtime.
|
|
79
|
+
|
|
80
|
+
The existing FULI MCP exposes `list_employee_templates`, `recruit_employee`, `list_employee_tools`, and `call_employee_tool`. Workbench operations resolve an exact registered `projectPath`; unresolved or mismatched projects fail closed. Clients need to rediscover tools after upgrading the FULI installation they launch. Editing a source checkout does not update an already installed server or active MCP session.
|
|
81
|
+
|
|
82
|
+
Recruitment accepts an exact `projectPath` (MCP), a legacy `personalProjectId`/`personalProjectIds` selection, or a `management` policy; legacy project selectors cannot be mixed with a policy. Policy shape: `{ mode, projectIds, excludedProjectIds, titleMode, titleStyle }`. `all` stores exclusions and no inclusion list; `selected` stores a fixed project list and no exclusions. Omission for a new identity uses the template default; explicit empty selection recruits without an assignment. Arrays are deduplicated and bounded to 500 entries, and validated before writes. Existing policy replacement requires `replaceAssignments: true` plus the last-read `expectedAssignmentsVersion`. A stale selection fails with `assignment_scope_conflict`; an identical retry is idempotent. Changes preserve customized preferences, role, and executor policies.
|
|
83
|
+
|
|
84
|
+
Management policy is stored beside the employee data in SQLite with cross-process compare-and-swap protection. It is saved before Provider changes so excluded access fails closed even after a partial failure. Assignment changes are individually durable, not one Provider transaction; removals precede additions. If a batch fails, `assignment_update_incomplete` requires reloading actual state before retrying. Receipts include the new version, policy, counts, and records. MCP results remain bounded and may report `truncated`; never treat truncated assignment records as a complete scope. Workbench, task entry, A2A and tool-call gates enforce the current policy on every request.
|
|
85
|
+
|
|
86
|
+
Jefa supplies eight workbench tools for board/task reading, task creation, optimistic-concurrency updates, status questions, and session-title preparation/receipts. Its data and in-process API/A2A implementations belong to the Jefa package; the host does not import a Jefa dependency or bind another employee port. Title settings allow automatic actions, suggestions, or off. Native rename execution belongs to the current client: the employee must not claim success before an actual client receipt, overwrite a manually locked title, or edit client databases/transcripts. Clients lacking native rename capability retain suggestions.
|
|
87
|
+
|
|
88
|
+
## Verification and release boundary
|
|
89
|
+
|
|
90
|
+
Run FULI's normal Node/web tests and typecheck. For an actual Jefa build:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
node scripts/employee-package-smoke.js <built-package-directory>
|
|
94
|
+
node scripts/employee-package-smoke.js <built-package-directory> --serve
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The smoke fixture uses a synthetic FULI directory but the real installed employee bundle, SQLite and MCP transport. The UI mode does not query a personal provider or external model. It deletes its temporary test data on shutdown.
|
|
98
|
+
|
|
99
|
+
Signing, remote catalog distribution, a runtime sandbox, database migration/uninstall UX, and production multi-user authorization remain separate release work. This feature does not authorize or publish a Feishu application.
|
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
# 角色 Agent:持久记忆、唯一负责人和自动唤醒
|
|
2
|
+
|
|
3
|
+
角色是长期身份;Claude Code、Cursor、Codex 是执行入口。切换入口不等于换人。
|
|
4
|
+
本实现复用现有 Neo4j,不增加第二个数据库,不把聊天记录当记忆库。
|
|
5
|
+
|
|
6
|
+
## 当前验收结论(2026-09-01)
|
|
7
|
+
|
|
8
|
+
| 原始目标 | 已有证据 | 仍未完成 |
|
|
9
|
+
| --- | --- | --- |
|
|
10
|
+
| 每个角色保留独立记忆 | 真实 Neo4j 验证版本、隔离、CAS、幂等和进程重建后的恢复 | 不代表模型对项目无所不知,仍须检索和核实当前代码 |
|
|
11
|
+
| 同一任务一个负责人 | 真实 HTTP/Neo4j 验证能力匹配、负载排序、身份保持和显式改选 | 并行 worker 的实际执行仍须单独派发和上报 |
|
|
12
|
+
| 跨客户端接续 | 真实 Claude Code → Codex CLI 显式工具调用已读写同一份隔离记忆 | Cursor、云端及普通输入自动接续未验收 |
|
|
13
|
+
| 自动唤醒和回写 | 三端适配已安装,协议级入口与结束检查已测试 | Codex hooks 仍未信任;尚无完整普通输入 hook → 模型回写 → 独立读回证据 |
|
|
14
|
+
| 更新本机运行版本 | 每次限定更新都先备份程序、数据与客户端配置,再离线安装、刷新连接、重启和验证;具体范围以最近一次安装报告为准 | 既有客户端进程重连不能由配置刷新结果代替 |
|
|
15
|
+
| Claude Code 全面代码复审 | 除既有八个 clean 区块外,独立 actual/outcome、项目任职路由、Node 映射和部署流水线也已完成“发现问题→修复→复审 clean”闭环 | 尚未取得整仓 clean;其他范围及真实 hooks 验收仍待完成 |
|
|
16
|
+
|
|
17
|
+
下文各轮测试数量是各自时点的记录,不相加为一个总数。所有隔离验收角色、会话和记忆
|
|
18
|
+
均为合成样本;真实数据库、协议子进程、产品客户端三个证据层级不能互相替代。
|
|
19
|
+
恢复后的审查显式使用用户指定的 `claude-gpt-5.6-sol`(GPT 5.6 Sol 网关别名);
|
|
20
|
+
Claude Code 是执行客户端,不表示本轮模型仍是 Opus。CLI 统计窗口为 200k,不按旧 1M 使用。
|
|
21
|
+
|
|
22
|
+
本次新增两项运行时保护:外部执行器最后一个租约释放后删除临时运行条目,不删除持久
|
|
23
|
+
角色身份、工作记忆或任务历史;异常成功租约响应不再静默作为关闭模式继续执行。
|
|
24
|
+
有返回 ID 时尝试回收,没有 ID 或回收失败时仍依赖远端 TTL,不宣称立即释放成功。
|
|
25
|
+
后续第三次限定更新已将这些修复、员工 URL 编码保护、checkpoint 记忆存在性绑定和选人
|
|
26
|
+
解释一起安装;离线备份校验与新的 23 项安装检查通过。检查结果针对限定候选,
|
|
27
|
+
不表示部署了工作区的其他构建变化,也不代表既有客户端会话已热重载。
|
|
28
|
+
第四次限定更新另将招聘事务、HR 守卫和旧策略警告一起安装,25 项安装检查全部通过,
|
|
29
|
+
其中包括在线旧策略 schema 与 deprecated 路由。最新源码真实库核心 48 项通过;
|
|
30
|
+
候选另外通过 25 项 Node、45 项真实库核心和 6 项 HTTP/MCP 接续。测试数据均为合成样本,
|
|
31
|
+
不等于普通输入自动唤醒已验收,未改动宿主信任或其他员工包。
|
|
32
|
+
|
|
33
|
+
## 记忆分层
|
|
34
|
+
|
|
35
|
+
| 层 | 内容 | 边界 |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| 身份与任职 | 稳定 Agent ID、职责、能力、个人初始偏好、项目任职 | 身份属于个人空间,任职属于项目 |
|
|
38
|
+
| 私有工作记忆 | 当前摘要、重要决策、未完成问题、下一步 | 严格按个人空间 + 项目 + Agent 隔离 |
|
|
39
|
+
| 项目知识 | 已记录的需求、架构、约束、来源与确认状态 | 当前项目共享;其他角色私有知识不注入 |
|
|
40
|
+
| 任务生命周期 | 本次负责人、宿主会话、回写状态 | 持久化元数据,不保存输入提示词、本机目录或完整对话 |
|
|
41
|
+
|
|
42
|
+
工作记忆是有来源和时间的工作上下文,不是新的用户指令,也不是自动确认的事实。
|
|
43
|
+
共享知识仍走原有知识提炼和确认流程。每份工作摘要限制在 32 KiB 内;历史版本保留,
|
|
44
|
+
入口只取当前版本和少量相关知识,需要更多时按主题检索。对项目的熟悉来自“恢复摘要 +
|
|
45
|
+
读取有来源的项目知识 + 检查当前代码”,不是无限复制全部聊天。
|
|
46
|
+
|
|
47
|
+
## 如何分配一个负责人
|
|
48
|
+
|
|
49
|
+
1. 精确解析当前项目;多项目歧义不猜测,不跨项目读取私有记忆。
|
|
50
|
+
2. 同一已开始任务再次加载上下文,复用持久化的负责人;宿主提供稳定 turn ID 时,同轮重试也不换人。
|
|
51
|
+
3. 对新任务,显式指定的有效 Agent 优先,且必须有有效任职、允许该客户端。
|
|
52
|
+
4. 自动选择先满足全部显式能力要求,再优先匹配工作类型。
|
|
53
|
+
5. 同等匹配时,优先当前负载较低者,再看项目工作历史、已有记忆,最后稳定排序。
|
|
54
|
+
6. 无显式能力要求、没有专门匹配者时,任务入口可选项目默认负责人;不会凭空宣称具备能力。
|
|
55
|
+
7. 项目关闭自动复用时,返回需要显式选人的状态。没有合格角色不会偷偷招聘。
|
|
56
|
+
|
|
57
|
+
当前实现约定:非空任职能力列表覆盖角色档案能力,不做并集;空任职列表则回退到档案。
|
|
58
|
+
全部能力要求是新任务自动选择的门槛,不会暗中替换显式指定的有效角色或当前任务负责人。
|
|
59
|
+
自动选择的说明同时给出工作类型匹配情况、所选角色当前任务数,以及工作类型和负载优先于
|
|
60
|
+
历史的顺序。无精确工作类型的兜底明确标注仅用于连续性,不是理解任务内容后的语义匹配;
|
|
61
|
+
项目默认路径报告实际合格候选数。这些说明不改变排序或机器可读 reason。
|
|
62
|
+
实际招聘确认只由项目级 `askBeforeRecruitment` 控制。旧空间级 recruitment-policy
|
|
63
|
+
接口保留读写兼容,但响应明确标注 `superseded`、不生效及替代工具,OpenAPI/MCP 也标明
|
|
64
|
+
废弃;它不会覆盖任何项目开关。需要改变实际授权时必须指定确切项目。
|
|
65
|
+
审批招聘时,HR 必须仍处于 active;inactive/archived HR 不得创建身份,但不阻止取消。
|
|
66
|
+
前置招聘的 claim/audit 保留用于 TTL 后重试;未过期的 claim 不允许被立即重放抢占。
|
|
67
|
+
创建身份、任职和 fulfillment 使用同一请求私有事务,按 task → recruitment 加锁,
|
|
68
|
+
最终守卫失败整体回滚,不留下“返回失败但角色已创建”的部分状态。
|
|
69
|
+
首次任务提交还在更外层使用一个请求私有事务,把协调、招聘、claim/provision、身份、任职、
|
|
70
|
+
执行器决策、任务主记录及其关系一起提交。任一点失败都不留下任务、招聘审计、身份或任职,
|
|
71
|
+
同一幂等请求可立即安全重试。独立审批流程仍保留自己的 requested 审计和 TTL 恢复语义。
|
|
72
|
+
显式指定另一个有效角色可覆盖当前会话负责人;其他客户端即使提交同名 session ID,
|
|
73
|
+
也不会继承该会话的负责人。角色能否接新工作与“这次任务是谁在做”应分别判断。
|
|
74
|
+
|
|
75
|
+
执行器路由对任职采取 fail-closed:任职必须属于目标项目且为 active,缺失、失效或其他项目的
|
|
76
|
+
assignment 都会被拒绝。工作类型是自动选人的排序偏好,不是对已经由显式任职或能力筛选选中的
|
|
77
|
+
角色再加一道绝对门槛;因此一个满足所需能力的有效任职可以承担另一种工作。调用方没有传入
|
|
78
|
+
assignment ID、要求执行器自行解析任职时,仍须匹配该 work kind,避免无依据地扩大职责。
|
|
79
|
+
|
|
80
|
+
负载包含协调任务和最近两小时未回写的当前宿主任务;旧的中断会话不会永远占用名额。
|
|
81
|
+
这是选人提示,不是“某个模型进程正在运行”的证据。同一个角色可以在不同宿主执行不同任务,
|
|
82
|
+
但每个任务只有一个负责人;需要并行协作者时仍通过协调计划、租约和实际执行报告管理。
|
|
83
|
+
|
|
84
|
+
新任务的主记录、初始事件、路由决策、参与者和招聘关联在同一 Neo4j 事务中保存。
|
|
85
|
+
关系写入异常或目标缺失时整体回滚,公开列表不会暴露一个只保存了一半的任务。
|
|
86
|
+
相同幂等键重试不会重置既有参与者状态和事件;旧版本遗留的缺边仍通过重试修复,
|
|
87
|
+
修复事务先锁住任务,再读取最新状态和更新时间。并发取消已提交时,新补的参与者关系
|
|
88
|
+
继承取消状态与终止时间,不覆盖既有参与者和事件;该交错顺序已用公开 HTTP + 隔离 Neo4j 验证。
|
|
89
|
+
|
|
90
|
+
活动接口也以单个事务保存任务状态、参与者、事件、实际执行器观察、结果证据、统计汇总与
|
|
91
|
+
临时角色归档。任何验证或数据库写入失败都会整体回滚,不占用该次事件的幂等键。
|
|
92
|
+
事务在读取状态和版本前锁住目标任务;同一 `expected_revision` 的并发修改只能有一个成功,
|
|
93
|
+
同键同载荷重放不会重复推进版本。每个请求使用自己的事务入口,不替换共享运行时的驱动。
|
|
94
|
+
这不自动修补旧版本已经留下的缺失审计。
|
|
95
|
+
|
|
96
|
+
源码中的独立 actual 接口也使用请求私有事务,按 task → Agent → executor → permission
|
|
97
|
+
加锁后重新校验客户端、策略、预检与权限。迟到观察保留在历史里,不覆盖更晚的当前执行;
|
|
98
|
+
旧投影没有执行时间时,从其关联观察恢复时间,缺少关联证据时保留原投影等待修复。
|
|
99
|
+
独立 outcome、ignore、reset 与对应统计汇总原子提交,同一统计组的并发更新串行处理。
|
|
100
|
+
|
|
101
|
+
新的 outcome 写入必须匹配任务参与者、工作类型、策略及已记录执行。`runId` 可以省略,
|
|
102
|
+
但不能把未记录的执行器当成已执行者记分;指定 run 时必须属于该任务、Agent 和执行器。
|
|
103
|
+
系统终态只接受匹配活动事件的状态、时间、引用与 canonical 幂等键,不允许换键重复记分。
|
|
104
|
+
外部测试与用户反馈的引用仍是授权调用方提供的声明,不是系统独立验证或用户本人认证。
|
|
105
|
+
新增 actual/outcome/reset 时间必须带时区;旧无时区评价仍可读取、忽略,不猜测其原始时区。
|
|
106
|
+
存在旧无时区评价或重置时间时,统计返回 `validationWarnings`、中性贡献及 `ignored=true`,
|
|
107
|
+
暂停整个统计组的学习权重。逐条显式忽略问题评价,或以新幂等键提交带时区的重置后恢复;
|
|
108
|
+
不自动改写原时间、不把未知先后次序用于算分。实际模型也必须满足任务模式、推理强度及能力提示。
|
|
109
|
+
这些独立证据修复已通过隔离 Neo4j 回归和两轮 Claude Code 复审;首轮指出同次运行的旧投影
|
|
110
|
+
会污染新观察的时间基线,修复后复审为 clean。它们不追溯伪造旧历史;是否已进入当前运行实例,
|
|
111
|
+
仍以相应的安装后文件、在线接口和客户端连接验证为准,不能仅由源码结果推断。
|
|
112
|
+
|
|
113
|
+
## 入口、回写和休眠
|
|
114
|
+
|
|
115
|
+
- `begin_task_context`:解析项目、选择负责人、恢复记忆和偏好,并持久化任务上下文。
|
|
116
|
+
- `get_collaboration_preferences`:无入口注入时的回退,也返回角色上下文。
|
|
117
|
+
有宿主会话标识时传 `sessionId`,使回退绑定同一任务负责人。
|
|
118
|
+
- `get_project_agent_context`:显式角色与 worker 的隔离上下文,也包含工作记忆、项目摘要和近期任务。
|
|
119
|
+
- `get_project_agent_memory`:写之前读取完整当前版本;不要从被截断的入口内容覆盖记忆。
|
|
120
|
+
- `checkpoint_project_agent_memory`:独立保存角色摘要。`expectedRevision` 防止覆盖他人的新版本,
|
|
121
|
+
`idempotencyKey` 防止同一写入重试产生重复历史。
|
|
122
|
+
- `checkpoint_task_knowledge`:结束时完成一次知识检查;选择 `capture_candidates` 或 `retain_nothing`。
|
|
123
|
+
角色上下文有变化时可同时传 `agentMemory: { expectedRevision, memory }`。
|
|
124
|
+
角色目标从持久化任务取得,调用方不能另填一个角色覆盖。
|
|
125
|
+
- `verify_task_checkpoint`:从 Provider 检查,不依赖入口进程的内存。
|
|
126
|
+
未回写时给出原任务 token;自动继续不会创建一个新的待回写任务而陷入循环。
|
|
127
|
+
|
|
128
|
+
Stop hook 不生成或保存工作摘要。第一次检查未完成时,宿主继续提示模型,由模型调用
|
|
129
|
+
checkpoint。Codex 的受信任本地 Stop 适配器若在这次继续后仍发现同一 token 未完成,
|
|
130
|
+
只为该 token 写入 `retain_nothing` 作为防循环兜底;它不会生成候选知识、角色记忆或摘要。
|
|
131
|
+
因此仍须同时验证宿主确实继续执行以及 Provider 最终返回 `checkpointed`。仅看到 Stop 配置
|
|
132
|
+
或 `checkpoint_required` 返回值,不能证明自动收尾已经完成。
|
|
133
|
+
|
|
134
|
+
角色工作记忆冲突返回 409:读最新版、保留仍有效内容、合并后重试;禁止盲目覆盖。
|
|
135
|
+
角色、记忆头、历史和任务上下文的读取都先绑定个人空间与目标项目;相同 Agent ID 或记忆 ID
|
|
136
|
+
不能从另一个项目借用。列表也不会因为调用方只知道空间而混入其他项目的角色或私有历史。
|
|
137
|
+
同一已完成检查的重试不重复写入;不同检查内容不能复用同一个已认领的 checkpoint。
|
|
138
|
+
候选知识的本地校验在 checkpoint 认领和角色记忆写入之前完成;缺少推理依据等校验错误
|
|
139
|
+
可以修正后用原任务 token 重试,不会提前推进记忆版本。附带工作记忆时,Provider 将
|
|
140
|
+
`prepare` 认领和记忆 CAS 放在同一事务:竞争检查、新轮次替代、记忆版本冲突或客户端
|
|
141
|
+
授权失败导致准备被拒时,两者一起回滚。记忆目标及会话来源从持久任务取得,不接受调用方另指定。
|
|
142
|
+
成功 `prepare` 是记忆提交点;后续知识提炼及 `complete` 不在这个数据库事务中,失败时
|
|
143
|
+
已提交记忆不会撤销。已知 CAS 失败后可读取新版、合并并重试;准备响应丢失等结果不确定时,
|
|
144
|
+
必须以相同内容重试,不能用另一份内容覆盖已认领检查。跨应用实例的重试也不会重复增加记忆版本。
|
|
145
|
+
首次认领还绑定是否携带工作记忆:没有记忆的检查不能在后续 prepare 重放或完成后再追加记忆,
|
|
146
|
+
即便调用方重复使用相同指纹也返回 409。旧记录通过该 token 的既有记忆检查兼容;同内容记忆
|
|
147
|
+
重试仍保持原版本,不额外增加历史。成功 prepare 后若被新轮次替代,旧 token 的 complete
|
|
148
|
+
仍被拒绝;已提交记忆保留,新轮次暴露上次未完成回写,不能据此宣称整个捕获流程原子化。
|
|
149
|
+
此原子路径要求 MCP 与 Provider 一起更新;不能以工作区测试结果推断当前安装版已经支持。
|
|
150
|
+
关闭 capture 后不写工作记忆或知识,生命周期本身仍只记录完成检查所需的最小元数据。
|
|
151
|
+
临时角色、已结束的任职、归档角色不能写持久工作记忆。
|
|
152
|
+
角色限定的 `allowed_clients` 同样适用于工作记忆写入,未获该角色允许的来源返回 403。
|
|
153
|
+
任务 token 是空间内的唯一句柄,不得借给另一个会话;重复占用返回 409,而非数据库异常。
|
|
154
|
+
同一当前轮次可幂等恢复;已被新轮次替代的旧轮次返回明确 409,不返回随后无法回写的旧 token。
|
|
155
|
+
入口记录的 `memory_revision` 是该轮观察到的基线,不是长期读锁;写入仍须用 `expectedRevision`
|
|
156
|
+
与最新记忆头做 CAS 校验。
|
|
157
|
+
|
|
158
|
+
“唤醒”有两层:宿主的任务入口恢复角色上下文;启用原有 adaptive runtime 时,
|
|
159
|
+
真实图请求通过租约唤醒 Provider / Neo4j。空闲后释放运行资源,数据库里的身份和记忆不消失。
|
|
160
|
+
本改动不为每个角色常驻进程,也不自动启动一个未获授权的外部模型。
|
|
161
|
+
|
|
162
|
+
运行租约的有效期从唤醒和执行资源准备完成后开始计时。冷启动期间调用方尚未拿到
|
|
163
|
+
租约句柄,不能要求它提前发送心跳;启动耗时不会提前消耗交付给调用方的续期窗口。
|
|
164
|
+
若协调器在排队或唤醒期间关闭,尚未交付的租约获取失败,不返回已被清理的成功句柄。
|
|
165
|
+
一次瞬时续期失败不会永久终止心跳;后续周期重试,直到显式释放/关闭或远端确认租约失效。
|
|
166
|
+
休眠失败至少等待 30 秒再重试,状态接口同步显示退避后的时间,避免过期闲置期限引发忙循环。
|
|
167
|
+
启动失败的错误摘要保留在运行状态中,便于诊断。
|
|
168
|
+
托管执行器关闭会等待其适配器停止;没有托管适配器的外部宿主不会被启停。
|
|
169
|
+
闲置时托管停止失败后间隔 30 秒重试;新获取须先确认失败实例已清理,避免重复启动。
|
|
170
|
+
部分启动失败仍清理资源,但保留原始启动错误。显式关闭会等待所有托管停止完成,
|
|
171
|
+
任何停止失败都返回错误;同时仍关闭服务拥有的 application。`createServer()` 返回的
|
|
172
|
+
`close()` 可等待完整关闭,重复调用保留同一结果;旧的 `server.close()` 仍兼容并记录收尾错误。
|
|
173
|
+
监听失败也会等待运行时清理;若清理同时失败,聚合两种错误并保留启动 cause。
|
|
174
|
+
响应已经发送后若租约清理失败,不再发送第二个响应。
|
|
175
|
+
HTTP 调用方在冷启动等待期间断开后,迟到租约立即释放,不等待整个 TTL。
|
|
176
|
+
容器停机只检查现有引擎,不调用会启动 Docker/Rancher 的唤醒方法。
|
|
177
|
+
|
|
178
|
+
## 执行会话与上报会话
|
|
179
|
+
|
|
180
|
+
持久 Agent、具体 worker、报告者宿主是不同身份。`record_project_agent_task_activity`
|
|
181
|
+
仍由 MCP 把外层 `sourceApplication` / `sourceSessionId` 绑定到报告者,调用者不能用子
|
|
182
|
+
执行器的 ID 覆盖它。可选 `workerRuntime` 单独保存实际观察到的执行器应用、会话 ID 和
|
|
183
|
+
已知链接,例如:
|
|
184
|
+
|
|
185
|
+
```json
|
|
186
|
+
{
|
|
187
|
+
"workerId": "verification-worker",
|
|
188
|
+
"workerRuntime": {
|
|
189
|
+
"application": "claude_code",
|
|
190
|
+
"sessionId": "observed-worker-session",
|
|
191
|
+
"sessionUrl": null
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
这是活动请求中的证据片段,不是完整可调用参数,也不证明模型请求成功。报告仍须提供
|
|
197
|
+
已参与任务的 Agent;报告者和 worker 应用都须符合该 Agent 的客户端限制。会话 URL
|
|
198
|
+
不能含凭据、查询参数或片段,未知链接留空;表格不会给子会话借用宿主链接。
|
|
199
|
+
|
|
200
|
+
`executionSummary` 每个已观察 worker 一行,展示当前会话的最新累积用量,不把重试
|
|
201
|
+
快照相加。同一 worker 换应用或会话 ID 后,模型、工具、Token 从新会话重新取证;旧事件
|
|
202
|
+
仍保留。空工具列表是已报告为空,缺少 Token 是未知而不是零;错误回执中的零仅代表该
|
|
203
|
+
回执范围,不能据此声称整任务免费。仅追加同一会话链接时可以保留此前的有效执行证据。
|
|
204
|
+
|
|
205
|
+
此契约需要 Provider、MCP 和 Web 使用支持该字段的版本;本地测试通过不等于正在运行的
|
|
206
|
+
服务已更新,也不能替代真实外部执行器验收。
|
|
207
|
+
|
|
208
|
+
## 不同宿主的支持范围
|
|
209
|
+
|
|
210
|
+
| 宿主 | 接入方式 | 注意事项 |
|
|
211
|
+
| --- | --- | --- |
|
|
212
|
+
| Codex | `UserPromptSubmit` MCP tool + 受信任的本地 `Stop` 命令,保留原有指令回退 | 重连 Fuli 后,按宿主要求审阅并信任 hooks;首次 Stop 让模型完成 checkpoint,二次重入仅以 `retain_nothing` 防循环;不会改信任存储或绕过审查 |
|
|
213
|
+
| Claude Code | 现有 `UserPromptSubmit` / `Stop` 的 MCP tool hooks | MCP 必须已连接,结束检查现在跨进程持久化 |
|
|
214
|
+
| Cursor | `sessionStart` 注入引导;`beforeSubmitPrompt` 建立任务;`stop` 做有限次数的回写提醒 | 原生 prompt hook 没有同轮上下文注入字段;每轮按引导调用偏好入口,传入宿主 sessionId |
|
|
215
|
+
| 云端环境 | 需部署同一受保护的 Provider,并为该宿主配置授权连接和相同项目映射 | 云机器无法直接访问本机 loopback;用户级本机 hooks 不自动同步到云端 |
|
|
216
|
+
| Claude 网页版 / Cowork 的远程连接器 | `fuli remote-mcp` 提供受 bearer 保护、绑定单一项目的 Streamable HTTP 上游;来源独立记录为 `claude` | 命令只监听 loopback,必须放在公开 HTTPS + OAuth 2.1 代理之后;远程连接器没有 Claude Code 的本地 hooks,初始化指令会要求每项任务先恢复角色、结束前 checkpoint,但仍须做真实 claude.ai 产品验收 |
|
|
217
|
+
|
|
218
|
+
安装器只合并或移除 Fuli 管理的 hooks,保留其他配置。更新 Provider 与客户端代码后,
|
|
219
|
+
在 Fuli 的接入设置中重新连接相应宿主,再新建任务。配置已写入不等于实际客户端已加载、
|
|
220
|
+
hooks 已受信任、角色已执行或结果已通过验收。
|
|
221
|
+
|
|
222
|
+
直接 CLI 调用同样先走工具名、参数 schema、空间/项目/会话绑定校验;未知字段、缺失必填字段、
|
|
223
|
+
错误会话或损坏的 Provider 2xx 响应都明确失败,不能绕过 MCP 会话边界进入存储层。配置备份目录
|
|
224
|
+
和文件分别使用 0700/0600,回滚前重新校验摘要;这些保护不等同于宿主已重新加载配置。
|
|
225
|
+
|
|
226
|
+
`fl setup` 安装或更新 Codex hooks 后会保留 `trustReviewRequired`,并提示在 Codex CLI
|
|
227
|
+
使用 `/hooks` 审阅、信任 Fuli 项。重复安装若未改变配置,仍提示 setup 不验证宿主信任状态,
|
|
228
|
+
不会据此宣称 hooks 已受信任。安装器不读取或改写信任存储;其他 Agent 的安装输出不受影响。
|
|
229
|
+
公开 CLI 回归在临时目录中使用真实配置、备份与 Skill 安装;仅图运行时启动使用替身。
|
|
230
|
+
这两项回归验证安装交付提示,不等于已完成普通输入自动唤醒。
|
|
231
|
+
|
|
232
|
+
真实产品验收也必须隔离客户端配置。Codex 可用临时调用的 `--ignore-user-config`、
|
|
233
|
+
`--ephemeral`、只读 sandbox 与精确 MCP 工具白名单;这不代替 hooks 信任。
|
|
234
|
+
Cursor 的 `CURSOR_CONFIG_DIR` 文档只承诺 CLI 配置目录覆盖;当前安装版 MCP 加载器
|
|
235
|
+
仍读取用户级 MCP 文件。不能把临时项目目录或该变量当作全局 MCP 隔离,更不能在未核实
|
|
236
|
+
配置来源时用 `--approve-mcps` 自动批准所有服务。参见
|
|
237
|
+
[Codex CLI](https://developers.openai.com/codex/cli/reference)、
|
|
238
|
+
[Cursor CLI 配置](https://prod.cursor.com/docs/cli/reference/configuration) 与
|
|
239
|
+
[Cursor CLI MCP](https://prod.cursor.com/docs/cli/mcp)。
|
|
240
|
+
|
|
241
|
+
宿主行为依据:[Codex hooks](https://learn.chatgpt.com/docs/hooks)、
|
|
242
|
+
[Claude Code hooks](https://code.claude.com/docs/en/hooks)、[Cursor hooks](https://cursor.com/docs/hooks)。
|
|
243
|
+
Claude 远程连接从 Anthropic 云端发起,而非本机;Claude Desktop 的本地 MCP 是另一种机制。
|
|
244
|
+
这两个入口不能混称为“已支持 Claude 网页版”。见 [Claude 远程 MCP 连接说明](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp)。
|
|
245
|
+
|
|
246
|
+
### 远程 Claude / Cowork 上游
|
|
247
|
+
|
|
248
|
+
`fuli remote-mcp` 不暴露管理台、HTTP Provider 或 Neo4j,只提供任务入口、checkpoint、
|
|
249
|
+
当前项目检索、角色上下文/记忆与任务证据读取。每个进程绑定一个明确的
|
|
250
|
+
`personalProjectId` 和当前个人空间;客户端传入的路径、项目、空间、来源与宿主会话归因
|
|
251
|
+
会被服务端绑定值覆盖,不属于工具 schema 的身份字段会直接被拒绝。请求必须带内部
|
|
252
|
+
bearer,跨站 `Origin` 会被拒绝。任务入口自动选择的角色会绑定到当前 MCP 会话;角色上下文
|
|
253
|
+
与私有记忆读取只能访问该角色。checkpoint token 还同时绑定该进程的项目和创建它的 MCP
|
|
254
|
+
会话,其他项目或同项目的其他远程会话都不能借用。
|
|
255
|
+
|
|
256
|
+
```sh
|
|
257
|
+
umask 077
|
|
258
|
+
openssl rand -hex 32 > ./fuli-remote.token
|
|
259
|
+
fuli remote-mcp \
|
|
260
|
+
--personal-project-id YOUR_PROJECT_ID \
|
|
261
|
+
--bearer-token-file ./fuli-remote.token \
|
|
262
|
+
--port 2728
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
POSIX 上 token 以 nonblocking + no-follow 打开并要求 `0600`;Windows 无法经 Node.js 获得
|
|
266
|
+
等价的 `O_NOFOLLOW` 与 POSIX mode 保证,必须用 Windows ACL 保护 token 所在目录,并确保
|
|
267
|
+
它是普通文件而不是链接。
|
|
268
|
+
|
|
269
|
+
进程启动前会确认项目存在于当前个人空间,默认限制 8 个并发会话并清理空闲超过
|
|
270
|
+
15 分钟的会话;可通过 `--max-sessions` 和 `--session-idle-ttl-seconds` 调整。“空闲”指没有
|
|
271
|
+
已完成的 MCP 应用请求:静默的独立 SSE 通知流不视为持续活动,也不会永久占用会话槽;
|
|
272
|
+
达到 TTL 后客户端须重新连接并初始化。关闭服务时,已进入分发的请求、会话关闭与 HTTP
|
|
273
|
+
连接共用一个真实时间宽限截止点,任一清理步骤都不能无限延长关闭。若代理转发
|
|
274
|
+
`Origin` 或保留公网 Host,必须显式增加
|
|
275
|
+
`--allowed-origin https://connector.example --allowed-host connector.example`;否则代理必须把
|
|
276
|
+
Host 重写为实际 loopback 上游地址。服务端始终按监听地址和显式 allowlist 独立核对 Host。
|
|
277
|
+
|
|
278
|
+
监听器固定为 loopback。生产接入必须由 HTTPS/OAuth 代理完成用户登录、token audience
|
|
279
|
+
校验、最小 scope、限流与审计,再把请求转发到本机上游;外部 OAuth token 不得透传给
|
|
280
|
+
其他服务,代理也不得开放 Fuli Provider 或 Neo4j 端口。Claude 自定义连接器从 Anthropic
|
|
281
|
+
云端发起请求,只有完成公开域名、OAuth 与连接器配置后才算产品接入。本仓库不会自动创建
|
|
282
|
+
公网隧道、域名、证书或 OAuth 客户端,也不会把内部 bearer 写入仓库或客户端配置。
|
|
283
|
+
|
|
284
|
+
## 验证与复跑
|
|
285
|
+
|
|
286
|
+
仓库内自动测试分两类,不混同证据等级:
|
|
287
|
+
|
|
288
|
+
- 普通测试:MCP 工具边界、schema、授权客户端、配置保留、有限输出、禁用 capture、入口不递归等。
|
|
289
|
+
包括候选校验失败后修正输入、用原任务 token 继续完成检查。
|
|
290
|
+
部分使用明确的 HTTP 边界替身;不能据此证明数据库持久化。
|
|
291
|
+
- 可选真实验收:真实 Neo4j、FastAPI HTTP Provider、独立 Node/MCP 子进程,使用隔离样本。
|
|
292
|
+
覆盖 Provider 重建后的记忆恢复、并发冲突与幂等、空间/项目/角色隔离、归档禁写、唯一负责人、
|
|
293
|
+
当前会话复用,以及 Codex、Claude、Claude Code、Cursor 四个来源标识的连续写读、分进程结束检查和继续任务的协议语义。
|
|
294
|
+
每个来源还验证:候选知识被本地拒绝时,附带的角色记忆不会推进版本,修正后可以完成回写。
|
|
295
|
+
这些工具调用由测试直接发起,不是三个真实客户端的原生 hook 事件。
|
|
296
|
+
|
|
297
|
+
普通输入自动唤醒须另做产品验收:使用同一个隔离项目,提示中不包含工具名、隐藏摘要、
|
|
298
|
+
任务 token、固定角色或调用协议;hooks 必须由宿主真实加载并获用户审核。证据应同时包含
|
|
299
|
+
模型处理前的入口 hook、恢复的角色上下文、结束 hook 及必要的继续执行,并用独立 HTTP
|
|
300
|
+
读回核验记忆版本与内容。工具返回中的 hook 名称、来源标签、模型自报或版本增长单独出现,
|
|
301
|
+
都不能证明该调用来自宿主 hook。若宿主不能提供足够的事件来源证据,结果应保留为未验证。
|
|
302
|
+
Claude Code 的 stream-json 输出可用 `--include-hook-events` 提供 `hook_started`、
|
|
303
|
+
`hook_progress` 和 `hook_response` 事件,后续应据此核对来源及顺序;仅确认 CLI 支持参数
|
|
304
|
+
不等于已观察到自动入口。见 [Claude Code CLI](https://code.claude.com/docs/en/cli-reference)。
|
|
305
|
+
|
|
306
|
+
先启动专用于测试的可丢弃 loopback Neo4j,再显式设置测试环境变量:
|
|
307
|
+
|
|
308
|
+
```sh
|
|
309
|
+
npm run test:node
|
|
310
|
+
npm run typecheck:web
|
|
311
|
+
npm run test:web
|
|
312
|
+
graph-provider/.venv/bin/python -m pytest graph-provider/tests -q
|
|
313
|
+
|
|
314
|
+
# 内存紧张或默认 worker 启动停滞时,已验证的低并发全量路径:
|
|
315
|
+
npm run test:web -- --pool=forks --maxWorkers=1 --no-file-parallelism
|
|
316
|
+
|
|
317
|
+
# 下面两项只能指向可丢弃测试数据库,不能指向日常 Fuli 数据库。
|
|
318
|
+
# bootstrap 会轮换该测试库的管理员 token;两套真实 DB 测试应顺序运行。
|
|
319
|
+
FULI_TEST_NEO4J_URI=bolt://127.0.0.1:17687 FULI_TEST_NEO4J_EPHEMERAL=1 \
|
|
320
|
+
graph-provider/.venv/bin/python -m pytest graph-provider/tests/test_project_agent_memory_neo4j.py \
|
|
321
|
+
graph-provider/tests/test_project_agent_task_atomicity_neo4j.py \
|
|
322
|
+
graph-provider/tests/test_project_agent_activity_atomicity_neo4j.py \
|
|
323
|
+
graph-provider/tests/test_project_agent_staffing_neo4j.py -q
|
|
324
|
+
FULI_TEST_NEO4J_URI=bolt://127.0.0.1:17687 FULI_TEST_NEO4J_EPHEMERAL=1 \
|
|
325
|
+
node --test --test-concurrency=1 test/project-agent-memory-acceptance.test.js \
|
|
326
|
+
test/task-memory-checkpoint-atomicity.test.js
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### 检查准备与记忆原子性补充(2026-09-01)
|
|
330
|
+
|
|
331
|
+
新增 5 项真实 HTTP/Neo4j 用例:另一个检查先完成、新轮次先替代、记忆 CAS 冲突回滚后
|
|
332
|
+
合并重试、准备响应丢失后换应用重试、Provider 客户端授权拒绝。前两项修改前均复现了
|
|
333
|
+
准备请求被拒却已推进记忆版本,修改后均保持原版本。后续三项验证回滚、幂等和授权边界。
|
|
334
|
+
连同原有独立 MCP 进程接续验收,显式启用的 6 项全部通过,临时数据库已停止。
|
|
335
|
+
|
|
336
|
+
该阶段正式 Node 全量为 685 项中 679 通过、6 条件跳过;这 6 项即当时单独启用通过的真实验收。
|
|
337
|
+
Provider 默认全量为 326 通过、33 条件跳过,保留 192 项依赖及既有夹具警告,并出现既有
|
|
338
|
+
未 await 协程的清理警告。另增 5 项模型校验测试覆盖阶段、记忆目标字段和长度限制。
|
|
339
|
+
共享事务改动后顺序重跑记忆、任务创建、活动与负责人四套真实数据库回归,30 项通过,
|
|
340
|
+
保留 7 项依赖 schema 警告;使用另一份临时数据库,结束后已停止。
|
|
341
|
+
全部样本为合成数据,HTTP、数据库与 MCP 子进程真实;没有启动产品客户端或模型。
|
|
342
|
+
这些新修复仍在工作区,未再次部署,也未取得 Claude Code 全面复审通过结论。
|
|
343
|
+
|
|
344
|
+
### 后续本机配套更新(2026-09-01)
|
|
345
|
+
|
|
346
|
+
上节记录的是修复验证结束时的状态;随后已完成一次有备份的本机配套更新。以当时已安装
|
|
347
|
+
版本为基线,仅加入本轮 7 个实现文件及本说明,保留既有 Web 构建与依赖清单。除记忆和
|
|
348
|
+
启动清理修复外,纳入已核实的 HTML/缺失资源缓存头修复;未打包其他并行界面改动。
|
|
349
|
+
隔离候选先出现两项缓存头断言失败,补入该既有修复后,54 项核心回归及 6 项真实数据库
|
|
350
|
+
验收全部通过。Provider 候选的默认全量 326 通过、33 跳过,仍有既有警告。
|
|
351
|
+
|
|
352
|
+
安装前完成旧代码、Provider 环境、配置和离线数据库备份,离线数据按内容摘要核验。
|
|
353
|
+
本地 npm 包及 wheel 的内容校验覆盖 287 个包文件、67 个 Python 源文件;实际安装后
|
|
354
|
+
23 项检查通过,包括 200 个 Node/Web 文件、67 个 Provider 源文件、在线原子记忆 schema、
|
|
355
|
+
新 MCP 进程的工具及字段、原图身份配置、其他 MCP/hooks 的保留。
|
|
356
|
+
这些安装检查比较的是隔离候选,不是仍在变化的整个工作区;未上传或发布。
|
|
357
|
+
|
|
358
|
+
客户端配置刷新不等于已有进程重载。安装器在连接路径未变时返回 `newTaskRequired=false`,
|
|
359
|
+
它没有验证正在运行的 MCP 进程使用哪个代码版本,因此不能用该值宣称热更新完成。
|
|
360
|
+
实际 Codex CLI 仍列出两项 enabled、untrusted 的 Fuli hooks;须用户审阅信任后,另做
|
|
361
|
+
普通输入自动入口验收。Claude 执行器的健康状态仍为 degraded,全面复审和 Cursor/云端
|
|
362
|
+
自动入口仍未通过;本机配套更新不会自行解决这些宿主条件。
|
|
363
|
+
|
|
364
|
+
### 负责人组合验收补充(2026-09-01)
|
|
365
|
+
|
|
366
|
+
新增 `test_project_agent_staffing_neo4j.py`,9 项真实数据库验收通过:三个客户端来源下
|
|
367
|
+
多项能力必须同时满足,context 与实际任务保存选出同一个唯一 lead;非空任职能力覆盖档案、
|
|
368
|
+
空列表回退档案;工作类型先于负载与其他工作历史、低负载先于连续性、负载相同时历史续用;
|
|
369
|
+
成功历史优先于更近的失败历史;当前会话身份保持及显式改选、不同客户端同名会话隔离。
|
|
370
|
+
与记忆及两组事务测试顺序合跑为 30 项通过,保留 7 项依赖 schema 警告。
|
|
371
|
+
默认 Provider 全量为 321 通过、33 条件跳过,仍有依赖及既有测试夹具协程清理警告。
|
|
372
|
+
|
|
373
|
+
所有角色、会话和成功/失败执行报告都是明确的合成测试数据;HTTP 与 Neo4j 真实,
|
|
374
|
+
未启动模型或产品客户端,不能作为自动 hooks 或 Claude 全面复审证据。测试数据库已停止。
|
|
375
|
+
本次只增加验收和说明,没有修改或再次部署生产实现。
|
|
376
|
+
|
|
377
|
+
### 本轮实际结果(2026-08-31)
|
|
378
|
+
|
|
379
|
+
使用 Node.js 24、Python 3.12 和隔离的 Neo4j 5.26.28;样本均为专用合成数据。
|
|
380
|
+
|
|
381
|
+
| 验证 | 结果 |
|
|
382
|
+
| --- | --- |
|
|
383
|
+
| Node 核心回归 `node --test --test-concurrency=2 test/*.test.js` | 602 通过,1 项真实数据库验收按默认条件跳过 |
|
|
384
|
+
| 候选校验修正后的 MCP / capture / 角色记忆回归 | 10 通过;新增场景先复现失败,再验证修复 |
|
|
385
|
+
| 最后一次安装器校验修正后的 hooks / Cursor / 备份回归 | 13 通过,含新增的无效 hooks 配置禁写与卸载保留测试 |
|
|
386
|
+
| Python Provider 回归 | 303 通过,9 跳过;依赖仍有弃用和测试夹具协程清理警告 |
|
|
387
|
+
| 显式启用的真实 Neo4j 验收 | 6 通过 |
|
|
388
|
+
| 真实 HTTP Provider + 独立 MCP 进程连续验收 | 1 通过(约 19.5 秒);三个来源、九个独立 MCP 进程,拒绝无效候选不改记忆,正常回写版本 0 → 3 |
|
|
389
|
+
| Web 类型检查 | 通过 |
|
|
390
|
+
| 角色目录页面 `ProjectAgentsPage.spec.ts` | 单 worker / threads 模式下 18 通过 |
|
|
391
|
+
| 全量 Web 回归 | forks 单 worker、关闭文件并行:原生 Luna 与主线程独立复跑均为 49 个文件、168 项通过(约 74 / 95 秒);未修改源码、配置或依赖 |
|
|
392
|
+
| npm 发布包与隔离安装 smoke | 通过;先复现角色记忆说明未随包发布,再补齐清单;267 个文件,隔离安装后的 `fl` / `fuli` 命令及 Web 静态服务检查通过 |
|
|
393
|
+
| 补丁空白检查 | 通过 |
|
|
394
|
+
|
|
395
|
+
真实数据库服务已在测试后停止,未改动日常数据库。不同测试层级不能合并解释为产品登录验收。
|
|
396
|
+
Web 先前有过 worker 启动超时和测试发现阶段长时间停滞;当前低并发全量路径已实际完成。
|
|
397
|
+
资源压力与调度是有采样支持的推断,并非已确定的内部根因,也不表示 threads 池必然失败。
|
|
398
|
+
|
|
399
|
+
用户恢复登录后,Claude Code 2.1.251 的真实只读 smoke 已通过:实际读取仓库
|
|
400
|
+
`AGENTS.md`,标题和模块规则与文件一致,没有写文件、执行命令或调用 MCP。
|
|
401
|
+
第一轮整仓只读审查实际读取了源码(包含新增员工模块),但在 30 分钟上限结束,
|
|
402
|
+
未返回最终报告,不能计为通过。现按明确范围分区取得报告,再核实、修复与复审;
|
|
403
|
+
全面范围不因分区而缩小。此前的 `401 authentication failed` 不再是当前认证状态的证据。
|
|
404
|
+
|
|
405
|
+
登录恢复后的本地复跑:Node 基线 627 通过、1 跳过,Python 321 通过、9 跳过,
|
|
406
|
+
Web 类型检查通过,Web 全量 53 个文件、198 项通过。冷启动租约缺陷通过真实 HTTP
|
|
407
|
+
接口和虚拟时钟先复现失败,再验证修复;连同唤醒期间关闭的用例,租约/运行时相关 17 项
|
|
408
|
+
测试通过。这里的
|
|
409
|
+
时钟和图服务启动是测试替身,不是日常数据库故障复现,也不能确定此前 MCP 内部错误的根因。
|
|
410
|
+
新建隔离 Neo4j 后再次通过 6 项持久化测试,以及真实 HTTP Provider + 独立 MCP 进程
|
|
411
|
+
接续测试;临时数据库已经停止,未操作日常数据库。
|
|
412
|
+
随后全量 Node 回归出现一项结构门禁失败:并发更新后的 `ProjectAgentsPage.vue`
|
|
413
|
+
超过既有 1,300 行限制;不能将较早基线表述为当前工作树全绿。单独排除结构门禁后,
|
|
414
|
+
其余 Node 测试已通过;此排除只用于定位,不作为完整回归通过的依据。
|
|
415
|
+
|
|
416
|
+
Claude Code 两个有界区块已分别返回角色记忆与员工包的候选反馈,实际响应模型元数据为
|
|
417
|
+
`claude-opus-5`。主 Agent 没有自动接受所有反馈:角色记忆的客户端限制缺失、跨会话 token
|
|
418
|
+
冲突变为 500、旧轮次重放返回失效 token 三项已通过真实 Neo4j + 公共 ASGI HTTP 接口
|
|
419
|
+
先失败后通过。修复后该持久化套件 9 项通过,真实 TCP HTTP Provider + 9 个独立 MCP
|
|
420
|
+
进程接续 1 项通过;隔离数据库已停止。默认 Python 全量 321 项通过、12 项条件跳过,
|
|
421
|
+
保留既有依赖/测试替身的警告。第二轮 Claude 已静态确认上述三项修复并撤销多数无充分
|
|
422
|
+
上层依据的候选,但仍保留重放确定性和任务边崩溃窗口的反馈,未认定该区块或整仓通过。
|
|
423
|
+
员工反馈核验也尚未结束。
|
|
424
|
+
以上是分区证据,不能替代整仓审查或真实产品会话验收。
|
|
425
|
+
并发改动后的 Web 类型检查通过;最新全量测试仅完成 52 个文件、179 项,
|
|
426
|
+
`ProjectAgentsPage.spec.ts` 的 forks worker 启动超时导致运行失败,不能写成全部通过。
|
|
427
|
+
该页面随后单独复跑 24 项通过;正在重新完成全量路径。
|
|
428
|
+
随后将活动日历的数据整理逻辑局部提取为独立模块,保留页面既有与并发新增功能。
|
|
429
|
+
最终 Node 全量 632 项通过、1 项条件跳过,原有结构门禁通过;Web 类型检查通过,
|
|
430
|
+
最终 Web 全量 53 个文件、203 项通过。运行时又新增三项接口回归(瞬时心跳恢复、
|
|
431
|
+
休眠失败退避、启动错误保留),相关套件合计 20 项通过。修复后的运行时仍需 Claude 复审,
|
|
432
|
+
全部通过的本地测试不等于整仓审查结案。
|
|
433
|
+
|
|
434
|
+
后续复审又复现并修复四项:旧 token 与当前 turn 混用的错误成功、客户端关闭后迟到租约
|
|
435
|
+
重新开始心跳、Codex bootstrap 重复要求 fallback、工作类型兜底选择未披露。
|
|
436
|
+
token 精确匹配优先后,历史 token 的混用明确返回 409;普通当前 turn 重试仍返回首次 token。
|
|
437
|
+
关闭客户端会等待在途获取并回收迟到句柄,不再接受新获取。入口已有 hook 上下文时不重复
|
|
438
|
+
获取偏好;此修复只更新仓库安装器生成内容,未更改用户实际安装配置。
|
|
439
|
+
无工作类型匹配时的通用角色选择标为 `project_context_fallback`,仅表示恢复项目连续性,
|
|
440
|
+
不声称专长匹配,也不越过显式能力要求或启动 worker。
|
|
441
|
+
|
|
442
|
+
本轮最后一次 Node 全量 633 通过、1 跳过;Python 默认全量 321 通过、13 跳过;隔离数据库
|
|
443
|
+
10 项通过;宿主/文档相关 42 项通过;运行时相关 21 项通过。Web 未改动,沿用上轮 203 项
|
|
444
|
+
与类型检查结果,不声称本轮重跑。Claude 第三轮确认 token 修复,但新增兜底披露、bootstrap
|
|
445
|
+
和客户端关闭修复仍需后续独立复审;托管执行器生命周期及任务边持久化等事项尚未结案。
|
|
446
|
+
|
|
447
|
+
### 完整目标的完成性核对
|
|
448
|
+
|
|
449
|
+
| 用户目标 | 当前能证明什么 | 尚缺的验收 |
|
|
450
|
+
| --- | --- | --- |
|
|
451
|
+
| 每个角色拥有自己的记忆 | 私有工作记忆、版本历史、作用域隔离与重启恢复已有源码及真实数据库测试 | 更新后的日常客户端实际读写 |
|
|
452
|
+
| 熟悉当前项目 | 入口恢复项目摘要、该角色记忆、近期任务和有来源的知识检索 | 用真实项目任务检查召回和续接质量;不能承诺自动全知或无条件正确 |
|
|
453
|
+
| 跨 Claude / Claude Code / Cursor / Codex 接续 | 本地 stdio 的跨进程链路已扩为四个独立来源;远程 `claude` Streamable HTTP 的 bearer、会话、项目绑定与最小工具面有协议测试;另已用真实 Claude Code → 全新 Codex CLI 验证同一角色摘要与版本 1 → 2 → 3 | Cursor 实际产品与 claude.ai 公开 HTTPS/OAuth 连接器仍未验收 |
|
|
454
|
+
| 自动唤醒和结束回写 | 宿主 hooks 配置与生命周期协议已实现并验证 | 实际 hooks 已加载、获准执行,并在普通用户输入时自动触发 |
|
|
455
|
+
| 多角色中只有一个负责人 | 真实数据库验证资格过滤、负载分配及任务固定负责人;两个真实 CLI 在三角色样本中均选中 engineer | 日常项目长期使用的选角质量与中断恢复 |
|
|
456
|
+
| Cloud 入口也共享记忆 | 新增绑定单项目的远程 MCP 上游,远程来源与 Claude Code 分开归因;存储和角色身份仍在同一 Neo4j/Provider | 部署公开 HTTPS/OAuth 代理、把连接器加入 Claude 并在真实会话完成入口→checkpoint→新会话读回;云端开发环境还须单独配置网络和项目映射 |
|
|
457
|
+
|
|
458
|
+
续轮只读核对发现:当前会话加载的 Fuli 工具没有 `get_project_agent_memory`、
|
|
459
|
+
`checkpoint_project_agent_memory`,其 `checkpoint_task_knowledge` 也未声明 `agentMemory`;
|
|
460
|
+
仓库中的工具定义已包含这些能力。因此此时只能确认源码已更新,不能确认正在使用的 MCP
|
|
461
|
+
连接已加载新版本。本机能运行三个宿主的版本查询,也不构成登录、hooks 信任或模型执行证据。
|
|
462
|
+
|
|
463
|
+
Codex 的非托管 hooks 必须由用户审阅并信任当前定义;安装器不会代替该决定。
|
|
464
|
+
确认接入目标后,按顺序更新服务、重连宿主、完成必要的 hooks 审阅,再进行真实会话验收。
|
|
465
|
+
|
|
466
|
+
### 真实客户端接续补充验收
|
|
467
|
+
|
|
468
|
+
2026-08-31,使用合成的 engineer、reviewer、backup-engineer 和独占临时 Neo4j:
|
|
469
|
+
先通过公开 HTTP 写入一个随机摘要,不把它放进客户端提示;真实 Claude Code 恢复角色并
|
|
470
|
+
checkpoint 到版本 2,全新 Codex CLI 读取包含 Claude 续写内容的摘要,再 checkpoint 到版本 3。
|
|
471
|
+
主 Agent 通过公开 HTTP 校验精确摘要、版本和来源,两个产品都正常退出,Provider 已停止。
|
|
472
|
+
这是实际产品的显式 MCP 调用验收,不是普通输入 hooks 验收,也不是“已安装到所有日常客户端”。
|
|
473
|
+
Claude 使用自身常规登录环境,禁用 hooks/文件/Shell/其他 MCP;Codex 保持只读 sandbox,
|
|
474
|
+
仅为本次测试样本的 checkpoint 工具设置许可。没有复制登录凭据或修改全局客户端配置。
|
|
475
|
+
在这些证据齐全之前,整个跨端目标保持未完成状态。
|
|
476
|
+
|
|
477
|
+
这不是已登录 Codex / Claude Code / Cursor 产品界面的真人会话验收,也不是云端联网验收。
|
|
478
|
+
实际启用后应再用三个客户端依次读取同一测试角色的摘要,修改一次,再确认新客户端能续接。
|
|
479
|
+
若 Provider 不可达或旧版本不支持此接口,入口会明确返回 unavailable/degraded,不能宣称记忆已恢复。
|