common-memory-core 0.2.0

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.
Files changed (284) hide show
  1. package/.env.sample +3 -0
  2. package/CHANGELOG.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +120 -0
  5. package/SECURITY.md +48 -0
  6. package/dist/cli/codex/transcript-0.153.4.d.ts +20 -0
  7. package/dist/cli/codex/transcript-0.153.4.d.ts.map +1 -0
  8. package/dist/cli/codex/transcript-0.153.4.js +78 -0
  9. package/dist/cli/codex/transcript-0.153.4.js.map +1 -0
  10. package/dist/cli/codex-config.d.ts +2 -0
  11. package/dist/cli/codex-config.d.ts.map +1 -0
  12. package/dist/cli/codex-config.js +5 -0
  13. package/dist/cli/codex-config.js.map +1 -0
  14. package/dist/cli/codex-hook.d.ts +18 -0
  15. package/dist/cli/codex-hook.d.ts.map +1 -0
  16. package/dist/cli/codex-hook.js +140 -0
  17. package/dist/cli/codex-hook.js.map +1 -0
  18. package/dist/cli/codex-session.d.ts +3 -0
  19. package/dist/cli/codex-session.d.ts.map +1 -0
  20. package/dist/cli/codex-session.js +3 -0
  21. package/dist/cli/codex-session.js.map +1 -0
  22. package/dist/cli/flush-command.d.ts +6 -0
  23. package/dist/cli/flush-command.d.ts.map +1 -0
  24. package/dist/cli/flush-command.js +30 -0
  25. package/dist/cli/flush-command.js.map +1 -0
  26. package/dist/cli/host-launch.d.ts +28 -0
  27. package/dist/cli/host-launch.d.ts.map +1 -0
  28. package/dist/cli/host-launch.js +16 -0
  29. package/dist/cli/host-launch.js.map +1 -0
  30. package/dist/cli/host-process.d.ts +3 -0
  31. package/dist/cli/host-process.d.ts.map +1 -0
  32. package/dist/cli/host-process.js +35 -0
  33. package/dist/cli/host-process.js.map +1 -0
  34. package/dist/cli/host-session.d.ts +22 -0
  35. package/dist/cli/host-session.d.ts.map +1 -0
  36. package/dist/cli/host-session.js +204 -0
  37. package/dist/cli/host-session.js.map +1 -0
  38. package/dist/cli/import-command.d.ts +20 -0
  39. package/dist/cli/import-command.d.ts.map +1 -0
  40. package/dist/cli/import-command.js +98 -0
  41. package/dist/cli/import-command.js.map +1 -0
  42. package/dist/cli/interactive-process.d.ts +3 -0
  43. package/dist/cli/interactive-process.d.ts.map +1 -0
  44. package/dist/cli/interactive-process.js +15 -0
  45. package/dist/cli/interactive-process.js.map +1 -0
  46. package/dist/cli/main.d.ts +3 -0
  47. package/dist/cli/main.d.ts.map +1 -0
  48. package/dist/cli/main.js +151 -0
  49. package/dist/cli/main.js.map +1 -0
  50. package/dist/cli/mcp-config.d.ts +16 -0
  51. package/dist/cli/mcp-config.d.ts.map +1 -0
  52. package/dist/cli/mcp-config.js +108 -0
  53. package/dist/cli/mcp-config.js.map +1 -0
  54. package/dist/cli/network-test.d.ts +4 -0
  55. package/dist/cli/network-test.d.ts.map +1 -0
  56. package/dist/cli/network-test.js +28 -0
  57. package/dist/cli/network-test.js.map +1 -0
  58. package/dist/cli/operations.d.ts +26 -0
  59. package/dist/cli/operations.d.ts.map +1 -0
  60. package/dist/cli/operations.js +55 -0
  61. package/dist/cli/operations.js.map +1 -0
  62. package/dist/cli/session-drain.d.ts +3 -0
  63. package/dist/cli/session-drain.d.ts.map +1 -0
  64. package/dist/cli/session-drain.js +34 -0
  65. package/dist/cli/session-drain.js.map +1 -0
  66. package/dist/cli/storage-paths.d.ts +4 -0
  67. package/dist/cli/storage-paths.d.ts.map +1 -0
  68. package/dist/cli/storage-paths.js +15 -0
  69. package/dist/cli/storage-paths.js.map +1 -0
  70. package/dist/cli/tui-integrations.d.ts +4 -0
  71. package/dist/cli/tui-integrations.d.ts.map +1 -0
  72. package/dist/cli/tui-integrations.js +143 -0
  73. package/dist/cli/tui-integrations.js.map +1 -0
  74. package/dist/cli/tui-prompts.d.ts +22 -0
  75. package/dist/cli/tui-prompts.d.ts.map +1 -0
  76. package/dist/cli/tui-prompts.js +64 -0
  77. package/dist/cli/tui-prompts.js.map +1 -0
  78. package/dist/cli/tui-settings.d.ts +21 -0
  79. package/dist/cli/tui-settings.d.ts.map +1 -0
  80. package/dist/cli/tui-settings.js +198 -0
  81. package/dist/cli/tui-settings.js.map +1 -0
  82. package/dist/cli/tui.d.ts +4 -0
  83. package/dist/cli/tui.d.ts.map +1 -0
  84. package/dist/cli/tui.js +292 -0
  85. package/dist/cli/tui.js.map +1 -0
  86. package/dist/cli/work-config.d.ts +24 -0
  87. package/dist/cli/work-config.d.ts.map +1 -0
  88. package/dist/cli/work-config.js +147 -0
  89. package/dist/cli/work-config.js.map +1 -0
  90. package/dist/config/config.d.ts +41 -0
  91. package/dist/config/config.d.ts.map +1 -0
  92. package/dist/config/config.js +193 -0
  93. package/dist/config/config.js.map +1 -0
  94. package/dist/config/private-env.d.ts +8 -0
  95. package/dist/config/private-env.d.ts.map +1 -0
  96. package/dist/config/private-env.js +38 -0
  97. package/dist/config/private-env.js.map +1 -0
  98. package/dist/config/runtime.d.ts +32 -0
  99. package/dist/config/runtime.d.ts.map +1 -0
  100. package/dist/config/runtime.js +85 -0
  101. package/dist/config/runtime.js.map +1 -0
  102. package/dist/core/contracts/errors.d.ts +10 -0
  103. package/dist/core/contracts/errors.d.ts.map +1 -0
  104. package/dist/core/contracts/errors.js +23 -0
  105. package/dist/core/contracts/errors.js.map +1 -0
  106. package/dist/core/safety/external-preflight.d.ts +7 -0
  107. package/dist/core/safety/external-preflight.d.ts.map +1 -0
  108. package/dist/core/safety/external-preflight.js +47 -0
  109. package/dist/core/safety/external-preflight.js.map +1 -0
  110. package/dist/core/safety/redaction.d.ts +2 -0
  111. package/dist/core/safety/redaction.d.ts.map +1 -0
  112. package/dist/core/safety/redaction.js +4 -0
  113. package/dist/core/safety/redaction.js.map +1 -0
  114. package/dist/core/safety/rules.d.ts +6 -0
  115. package/dist/core/safety/rules.d.ts.map +1 -0
  116. package/dist/core/safety/rules.js +14 -0
  117. package/dist/core/safety/rules.js.map +1 -0
  118. package/dist/core/safety/scanner.d.ts +11 -0
  119. package/dist/core/safety/scanner.d.ts.map +1 -0
  120. package/dist/core/safety/scanner.js +18 -0
  121. package/dist/core/safety/scanner.js.map +1 -0
  122. package/dist/core/transaction/fsync.d.ts +6 -0
  123. package/dist/core/transaction/fsync.d.ts.map +1 -0
  124. package/dist/core/transaction/fsync.js +41 -0
  125. package/dist/core/transaction/fsync.js.map +1 -0
  126. package/dist/index.d.ts +16 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +13 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/mcp/ingress.d.ts +61 -0
  131. package/dist/mcp/ingress.d.ts.map +1 -0
  132. package/dist/mcp/ingress.js +134 -0
  133. package/dist/mcp/ingress.js.map +1 -0
  134. package/dist/mcp/server.d.ts +4 -0
  135. package/dist/mcp/server.d.ts.map +1 -0
  136. package/dist/mcp/server.js +92 -0
  137. package/dist/mcp/server.js.map +1 -0
  138. package/dist/mcp/stdio.d.ts +5 -0
  139. package/dist/mcp/stdio.d.ts.map +1 -0
  140. package/dist/mcp/stdio.js +115 -0
  141. package/dist/mcp/stdio.js.map +1 -0
  142. package/dist/memory-manager/contracts/diagnostic.d.ts +14 -0
  143. package/dist/memory-manager/contracts/diagnostic.d.ts.map +1 -0
  144. package/dist/memory-manager/contracts/diagnostic.js +17 -0
  145. package/dist/memory-manager/contracts/diagnostic.js.map +1 -0
  146. package/dist/memory-manager/contracts/disclosure.d.ts +12 -0
  147. package/dist/memory-manager/contracts/disclosure.d.ts.map +1 -0
  148. package/dist/memory-manager/contracts/disclosure.js +8 -0
  149. package/dist/memory-manager/contracts/disclosure.js.map +1 -0
  150. package/dist/memory-manager/contracts/errors.d.ts +15 -0
  151. package/dist/memory-manager/contracts/errors.d.ts.map +1 -0
  152. package/dist/memory-manager/contracts/errors.js +25 -0
  153. package/dist/memory-manager/contracts/errors.js.map +1 -0
  154. package/dist/memory-manager/contracts/model-port.d.ts +38 -0
  155. package/dist/memory-manager/contracts/model-port.d.ts.map +1 -0
  156. package/dist/memory-manager/contracts/model-port.js +2 -0
  157. package/dist/memory-manager/contracts/model-port.js.map +1 -0
  158. package/dist/memory-manager/network/client.d.ts +13 -0
  159. package/dist/memory-manager/network/client.d.ts.map +1 -0
  160. package/dist/memory-manager/network/client.js +122 -0
  161. package/dist/memory-manager/network/client.js.map +1 -0
  162. package/dist/memory-manager/network/route.d.ts +31 -0
  163. package/dist/memory-manager/network/route.d.ts.map +1 -0
  164. package/dist/memory-manager/network/route.js +148 -0
  165. package/dist/memory-manager/network/route.js.map +1 -0
  166. package/dist/memory-manager/openai/abort.d.ts +4 -0
  167. package/dist/memory-manager/openai/abort.d.ts.map +1 -0
  168. package/dist/memory-manager/openai/abort.js +19 -0
  169. package/dist/memory-manager/openai/abort.js.map +1 -0
  170. package/dist/memory-manager/openai/bounded-body.d.ts +2 -0
  171. package/dist/memory-manager/openai/bounded-body.d.ts.map +1 -0
  172. package/dist/memory-manager/openai/bounded-body.js +49 -0
  173. package/dist/memory-manager/openai/bounded-body.js.map +1 -0
  174. package/dist/memory-manager/openai/openai-chat-adapter.d.ts +16 -0
  175. package/dist/memory-manager/openai/openai-chat-adapter.d.ts.map +1 -0
  176. package/dist/memory-manager/openai/openai-chat-adapter.js +51 -0
  177. package/dist/memory-manager/openai/openai-chat-adapter.js.map +1 -0
  178. package/dist/memory-manager/openai/openai-responses-adapter.d.ts +15 -0
  179. package/dist/memory-manager/openai/openai-responses-adapter.d.ts.map +1 -0
  180. package/dist/memory-manager/openai/openai-responses-adapter.js +14 -0
  181. package/dist/memory-manager/openai/openai-responses-adapter.js.map +1 -0
  182. package/dist/memory-manager/openai/options.d.ts +14 -0
  183. package/dist/memory-manager/openai/options.d.ts.map +1 -0
  184. package/dist/memory-manager/openai/options.js +29 -0
  185. package/dist/memory-manager/openai/options.js.map +1 -0
  186. package/dist/memory-manager/openai/remote-http.d.ts +33 -0
  187. package/dist/memory-manager/openai/remote-http.d.ts.map +1 -0
  188. package/dist/memory-manager/openai/remote-http.js +207 -0
  189. package/dist/memory-manager/openai/remote-http.js.map +1 -0
  190. package/dist/memory-manager/openai/response-decoder.d.ts +3 -0
  191. package/dist/memory-manager/openai/response-decoder.d.ts.map +1 -0
  192. package/dist/memory-manager/openai/response-decoder.js +57 -0
  193. package/dist/memory-manager/openai/response-decoder.js.map +1 -0
  194. package/dist/memory-manager/openai/retry.d.ts +8 -0
  195. package/dist/memory-manager/openai/retry.d.ts.map +1 -0
  196. package/dist/memory-manager/openai/retry.js +18 -0
  197. package/dist/memory-manager/openai/retry.js.map +1 -0
  198. package/dist/pi-extension/extraction-runtime.d.ts +51 -0
  199. package/dist/pi-extension/extraction-runtime.d.ts.map +1 -0
  200. package/dist/pi-extension/extraction-runtime.js +87 -0
  201. package/dist/pi-extension/extraction-runtime.js.map +1 -0
  202. package/dist/pi-extension/index.d.ts +19 -0
  203. package/dist/pi-extension/index.d.ts.map +1 -0
  204. package/dist/pi-extension/index.js +172 -0
  205. package/dist/pi-extension/index.js.map +1 -0
  206. package/dist/v2/canonical.d.ts +53 -0
  207. package/dist/v2/canonical.d.ts.map +1 -0
  208. package/dist/v2/canonical.js +321 -0
  209. package/dist/v2/canonical.js.map +1 -0
  210. package/dist/v2/contract.d.ts +34 -0
  211. package/dist/v2/contract.d.ts.map +1 -0
  212. package/dist/v2/contract.js +53 -0
  213. package/dist/v2/contract.js.map +1 -0
  214. package/dist/v2/document-import.d.ts +100 -0
  215. package/dist/v2/document-import.d.ts.map +1 -0
  216. package/dist/v2/document-import.js +259 -0
  217. package/dist/v2/document-import.js.map +1 -0
  218. package/dist/v2/errors.d.ts +6 -0
  219. package/dist/v2/errors.d.ts.map +1 -0
  220. package/dist/v2/errors.js +29 -0
  221. package/dist/v2/errors.js.map +1 -0
  222. package/dist/v2/import.d.ts +26 -0
  223. package/dist/v2/import.d.ts.map +1 -0
  224. package/dist/v2/import.js +48 -0
  225. package/dist/v2/import.js.map +1 -0
  226. package/dist/v2/lock.d.ts +3 -0
  227. package/dist/v2/lock.d.ts.map +1 -0
  228. package/dist/v2/lock.js +47 -0
  229. package/dist/v2/lock.js.map +1 -0
  230. package/dist/v2/memory-maintainer.md +38 -0
  231. package/dist/v2/read-guidance.d.ts +3 -0
  232. package/dist/v2/read-guidance.d.ts.map +1 -0
  233. package/dist/v2/read-guidance.js +3 -0
  234. package/dist/v2/read-guidance.js.map +1 -0
  235. package/dist/v2/reader.d.ts +25 -0
  236. package/dist/v2/reader.d.ts.map +1 -0
  237. package/dist/v2/reader.js +38 -0
  238. package/dist/v2/reader.js.map +1 -0
  239. package/dist/v2/registry.d.ts +14 -0
  240. package/dist/v2/registry.d.ts.map +1 -0
  241. package/dist/v2/registry.js +46 -0
  242. package/dist/v2/registry.js.map +1 -0
  243. package/dist/v2/runtime.d.ts +133 -0
  244. package/dist/v2/runtime.d.ts.map +1 -0
  245. package/dist/v2/runtime.js +326 -0
  246. package/dist/v2/runtime.js.map +1 -0
  247. package/dist/v2/session-drain.d.ts +14 -0
  248. package/dist/v2/session-drain.d.ts.map +1 -0
  249. package/dist/v2/session-drain.js +16 -0
  250. package/dist/v2/session-drain.js.map +1 -0
  251. package/dist/v2/session.d.ts +54 -0
  252. package/dist/v2/session.d.ts.map +1 -0
  253. package/dist/v2/session.js +158 -0
  254. package/dist/v2/session.js.map +1 -0
  255. package/dist/v2/writer.d.ts +40 -0
  256. package/dist/v2/writer.d.ts.map +1 -0
  257. package/dist/v2/writer.js +327 -0
  258. package/dist/v2/writer.js.map +1 -0
  259. package/docs/00-index.md +19 -0
  260. package/docs/03-target-architecture.md +49 -0
  261. package/docs/init-v0.1-closeout.md +152 -0
  262. package/docs/init-v0.1-design.md +237 -0
  263. package/docs/init-v0.1-verification.md +303 -0
  264. package/docs/outbound-network-design.md +100 -0
  265. package/docs/outbound-network-verification.json +300 -0
  266. package/docs/provider-verification.md +94 -0
  267. package/docs/releasing.md +138 -0
  268. package/docs/session-integration.md +134 -0
  269. package/docs/tui-workbench.md +173 -0
  270. package/docs/usage.md +815 -0
  271. package/docs/v2-ablation-results.json +12035 -0
  272. package/docs/v2-ablation.md +117 -0
  273. package/docs/v2-evaluation-repeat-results.json +7 -0
  274. package/docs/v2-evaluation-scripted-results.json +67 -0
  275. package/docs/v2-evaluation.md +35 -0
  276. package/docs/v2-optimization-plan.md +23 -0
  277. package/docs/v2-performance-baseline-runtime.js.txt +231 -0
  278. package/docs/v2-performance-baseline.json +338 -0
  279. package/docs/v2-performance-behavior-equivalence.json +17 -0
  280. package/docs/v2-performance-results.json +585 -0
  281. package/docs/v2-performance.md +88 -0
  282. package/docs/v2-replacement-test-map.md +14 -0
  283. package/docs/v2-verification.md +49 -0
  284. package/package.json +87 -0
@@ -0,0 +1,134 @@
1
+ # 会话接入:当前实现与验收边界
2
+
3
+ 2026-09-09。此文替代历史记录中的 Pi 六条触发、每轮自动读、Codex 只读 Hook
4
+ 及退出只排队的描述。Canonical Markdown、Core 写权限和 MCP stdio 固定 capability
5
+ 没有改变;没有新增检索、索引、长期记忆 revision、监听同步或一致性协议。
6
+
7
+ ## 持久状态与处理链
8
+
9
+ `src/v2/session.ts` 提供 SessionIngress:open、capture、settle、seal、end、status。
10
+ 身份是 client(pi/codex/chatgpt-work)+processInstance+真实 session ID 的摘要;真实结束后再启动附加独立 activation 标识,cwd 只用于范围选择。
11
+ SQLite 增加 sessions、session_turns、session_messages、session_batches;旧 observations、
12
+ leases、jobs、receipts、associations 继续承担队列与恢复职责。迁移幂等且事务化。
13
+ 用户正文存在 observations 一处,session_messages 只存其引用;assistant/tool 正文
14
+ 只作为上下文缓存。每条消息有稳定身份、角色、来源、顺序和摘要;重放相同消息是
15
+ no-op,冲突拒绝。一个交互必须含实际已交付用户表达;候选输入不算轮。
16
+
17
+ 满十次 settled(含终止后的 interrupted)即原子封逻辑批次。未满十轮保持 buffered,
18
+ 不受 legacy 六条/字节/idle/flush 触发;退出将 open 标为 incomplete 并封尾。
19
+ 关闭屏障由 sessions.closing 与该 session 全部观察的持久状态共同构成。
20
+ complete 要求 closing、全部处理成功且不存在 incomplete 回合;dead/quarantined
21
+ 或未完成尾轮保留 incomplete。空尾不制造证据。status 命令列出各 session 汇总,
22
+ 不打印正文;显式 retry 后状态可重新计算,不存容易失真的成功标志。
23
+
24
+ Writer 的 `conversation_turns` 保留整轮消息关系。当前用户表达仍各自获得 ev 引用;
25
+ assistant、工具、前轮上下文都是 context_only,不能单独作为 retain/forget 证据。
26
+ 跨批尾上下文通过旧 turn/observation 引用读取,无永久正文副本。forget、人工改文档
27
+ 导致来源失效、processed prune 都通过 SQLite trigger 同步清空同轮 assistant/tool
28
+ 正文;重放同身份不会复活正文。敏感上下文记录不可用;用户正文仍由既有 Writer
29
+ 安全扫描保护。引用、建议不会被预处理提升为用户确认。
30
+
31
+ `conversation_context` 是单独披露权限,旧配置不会自动获得。未授权时会话请求包含
32
+ 不可用原因,legacy 前轮上下文也不再发送,不用 user_explicit 绕过。contextTailTurns 默认 2,最多读取同 session、
33
+ 同 scope 的已处理回合。Writer 先舍弃可选历史上下文,再按整轮拆请求;单轮连同
34
+ 用户确认与相关上下文仍超限则整轮隔离并保留正文。session、legacy relay 和两类
35
+ import 不混批,模型输出仍是 memory_maintenance_v2。
36
+
37
+ 可选 sessionCache 默认 maxSessionBytes=8 MiB、maxTotalBytes=64 MiB、contextTailTurns=2。
38
+ 数字是保守工程默认,没有容量实证或远距离指代充分性保证。正文容量包含候选输入、
39
+ 交付缓存、session 正文、待交接 Codex/Work inbox 和唯一 host_snapshots 正文。超限事务回滚,保留已有数据及位置,
40
+ 终止信封无需新增正文空间。摘要、状态、receipt 等元数据不计入正文容量。
41
+
42
+ ## 宿主适配
43
+
44
+ Pi 0.84.4:`src/pi-extension/` 保留来源候选匹配、变换/混合来源隔离、稳定 Entry
45
+ 绑定。最终 agent_settled 封口;tool loop、retry、compact 不计数。真实 quit 才 end,
46
+ reload/new/resume/fork 的 extension shutdown 只关闭本地资源。进程随机身份与附加
47
+ 记忆块通过 globalThis 保留跨 reload 状态;数据Root+session 冻结附加块,每轮与
48
+ 当时的宿主 systemPrompt 组合。startup 读一次,后续生命周期不补读;原生 memory_read
49
+ 及 promptSnippet/promptGuidelines 按当前授权主动读取。Pi 直接写公共 ingress。
50
+
51
+ Codex 0.153.4:`src/cli/codex/transcript-0.153.4.ts` 独立解析 rollout。只认该版本
52
+ session_meta 与已知顶层记录。user_message 与 item_completed/UserMessage 是交付来源;world_state、token_usage_record 为非证据记录;response_item 中环境、hook
53
+ 和 compact 重放的 user 消息不成为证据。task_started 分组,task_complete 或
54
+ turn_aborted 确认终态;Stop/Interrupt 只登记核对,不假定其时 transcript 已写终态。
55
+ UserPromptSubmit 候选按 session/turn/digest 独立保存并冻结输入时的 scope,user_message 必须精确匹配;
56
+ 匹配成功在同一事务清空候选正文并转存交付,保留摘要用于重试。候选不当作已交付证据,
57
+ 也不作为自动记忆返回正文。无法匹配时保留 inbox,明确报告未确认交付。
58
+
59
+ `src/cli/host-session.ts` 是 Codex/Work 共享 adapter(codex-session 保留兼容导出),将尾部 JSONL 正文和信封放进同一 runtime.sqlite 的 durable
60
+ inbox,SQLite WAL+synchronous=FULL 提供原子、fsync 持久性。Hook 使用 150ms SQLite
61
+ busy timeout,生成器给三秒宿主期限;不在 hook 内运行模型。首次合格 startup/resume 读取有界快照;普通轮次不重复追加。compact/clear/reload 只重挂缓存。显式刷新由 PostToolUse 或下一 UserPromptSubmit 交付。进程身份取 Linux/WSL boot ID+Codex 祖先进程 PID+
62
+ 启动时间;PID 复用和不同工作目录不会错误共享 session。未知版本、路径替换、未确认交付、
63
+ 尾部不完整或容量不足均显式失败,不前移消费位置。SessionEnd 快照不依赖退出后文件存在。
64
+
65
+ `src/cli/session-drain.ts` 使用 detached+独立 stdio+unref 启动真正的 configured Writer。
66
+ 它先事务性将 inbox 正文转为 session 状态,同事务删除副本;Stop 核对会继续读取后续
67
+ 终态记录,不等待下一输入。单次核对最多 60 秒,失败保留 durable watch。消费者使用
68
+ `src/v2/session-drain.ts` 等待正常租约、退避,直到已封工作处理或 dead/quarantined。
69
+ 消费者崩溃后可由下一次写端事件或 `common-memory session-drain` 恢复;不会清空数据。
70
+ 父宿主与 MCP 退出不会撤销独立消费者。kill、重启、磁盘失败不承诺正常结束保证。
71
+
72
+ 两端共用 `src/v2/read-guidance.ts`。缺少用户背景/偏好/兴趣/目标/工作方式/项目约束时
73
+ 主动读,例如个性化最优化课程推荐、按研究方向比较项目;普通梯度下降解释或已具备
74
+ 充分个人上下文不机械读。contextId 只选授权范围,空结果不是负面个人事实,缺项未知。
75
+
76
+ ## 验收证据与限制
77
+
78
+ - `tests/v2/session.test.ts`:A/B 各九轮隔离,第十轮 settled 即可领取;21 轮形成
79
+ 10+10+1;steering、重复交付/封口、容量回滚、incomplete 尾轮、混合来源隔离、
80
+ 独立上下文权限、forget 清理后重放不复活、完整回合拆请求和真实退避等待。
81
+ - `tests/cli/codex-hook.test.ts`:一次启动读取、新进程恢复、compact 不补读;Stop 重复
82
+ 且终态延迟写入;排除 response_item 用户环境文本;删除 transcript 后仍交接尾批;
83
+ 未知格式保留 inbox、版本拒绝、部分行拒绝、输入/快照上限、五种事件配置。
84
+ - `tests/v2/pi-integration.test.ts`:保留交付认证、队列来源、图片隔离;冻结附加块与
85
+ 宿主新 systemPrompt 组合、reload 保留快照。
86
+ - `tests/cli/session-drain.test.ts`:实际 Node 宿主退出与 MCP EOF 后才释放本地假提供者,
87
+ 独立消费者仍提交 canonical Markdown、receipt 与完成状态;强杀消费者后显式重启恢复。
88
+ 这不是只验证 Node 子进程能存活,而是执行实际 configured Writer 与 Core 提交。
89
+
90
+ ## Work、activation 与刷新
91
+
92
+ host_activations 在同一 Runtime 保存 client、原生宿主实例、真实 thread、cwd 和 active
93
+ 状态;host_snapshots 只有每个 activation 的唯一正文 slot 与 pending 标志。真实
94
+ SessionEnd 入队时关闭 activation 并删除 snapshot,不提前关闭待消费 session 或删除
95
+ 尾批。再次合格 startup/resume 创建独立 session key。unsubscribe 不映射 SessionEnd。
96
+ 刷新依赖宿主祖先进程身份及 CODEX_THREAD_ID,无法唯一定位就失败;读取和替换在同一
97
+ 事务中,容量失败也回滚。普通 memory_read 不接触该 slot,read MCP 不打开 Runtime。
98
+ 同进程 resume 不重读;compact/clear/reload 重挂已有块;新进程首次 resume 自动读取。
99
+
100
+ `work-config --mode posix|windows-wsl --output <absolute-directory>` 生成可检查配置、
101
+ 显式 memory-refresh Skill 和必要的 PowerShell bridge。无法从环境确定 agent 模式时
102
+ 要求选择,不用终端类型或 WSL_DISTRO_NAME 代替。`codex-config` 同样支持 bundle 参数,
103
+ 无参数继续打印 profile。共用 host-launch 固定 Node、CLI、home 与 WSL distro/user。
104
+ Work 的 read 和 init 分进程;init 保留 chatgpt-desktop identity,Codex profile 禁用 init。
105
+ 所有 Hook 均保留宿主信任机制,不写信任 store、不生成绕过选项。
106
+
107
+ Windows bridge 从原生祖先进程读取 PID/CreationDate,转换 cwd/transcript 路径,使用
108
+ UTF-8 STDIO 并保留退出码;生成 ps1 含 UTF-8 BOM,兼容 Windows PowerShell 5.1。
109
+ 启动器宜安装到 Windows 本地路径:UNC 脚本可能被本机签名策略拒绝,生成器不改策略。
110
+ macOS 直接使用绝对 POSIX 启动参数,身份取 ps 的 PID/启动时间。WSL 内的 agent 使用
111
+ 直接 POSIX 模式。Linux 检查不代表 Desktop 在 Linux 上的产品支持。
112
+
113
+ 新增 `tests/cli/work-session.test.ts` 验证 A→B 刷新后 canonical C 不渗入、空 prompt
114
+ 显式 Skill 路径、重复刷新、失败/容量回滚、客户端/线程/进程/重新启动隔离、十轮
115
+ item_completed 交付及旧格式去重、未确认内容保留 inbox、配置与 Skill invocation policy。
116
+ `node scripts/smoke-work-bridge.mjs` 是构建后的 Windows→WSL 合成宿主实测入口,使用
117
+ 本地假提供者执行 configured Writer/Core;无真实模型调用或个人资料。
118
+
119
+ 协议依据:[官方 Hooks](https://learn.chatgpt.com/docs/hooks)、
120
+ [官方 MCP](https://learn.chatgpt.com/docs/extend/mcp)、
121
+ [Windows agent 环境](https://learn.chatgpt.com/docs/windows/windows-app)。
122
+ rollout 不是稳定公共接口,未来版本需要新适配与新验收。
123
+
124
+ 真实 Desktop UI 的 Hook 信任、真实模型主动读取与完整真实客户端事件组合尚未验证。
125
+ macOS 本轮只有逻辑与配置生成验证,真机验收留给后续测试者;Linux 测试不证明 Windows CI。
126
+
127
+ 最终验证(Node 24.20.0):`node scripts/verify.mjs` 通过 typecheck、58 源文件边界
128
+ 检查、32 测试文件 / 387 项测试和 build;构建后 `npm run test:consumer` 通过真实
129
+ tarball typed consumer、prompt asset、Writer、Pi load 与 CLI startup。生成的 Work
130
+ 和 Codex Skill 均通过 skill-creator quick_validate,invocation policy 另由测试断言。
131
+ Windows PowerShell 5.1 → Ubuntu WSL 的合成宿主测试验证 Unicode STDIO、原生实例
132
+ 身份、路径转换、A→B 刷新不被 C 覆盖、退出码,以及父宿主退出后 configured Writer/Core
133
+ 提交 canonical Markdown;同脚本还独立验证直接 WSL 祖先进程身份及启动读取。
134
+ 此项是合成宿主的真实跨边界执行,不等同于 Desktop UI 验收。
@@ -0,0 +1,173 @@
1
+ # Common Memory 交互工作台
2
+
3
+ ## 设计判断与调研依据
4
+
5
+ 统一的是用户的操作旅程,不是协议、宿主生命周期或授权来源。默认运行
6
+ `common-memory` 打开一个持续运行、可以返回的任务工作台;自动化命令和协议
7
+ 入口继续存在。采用已有 Clack 的菜单、表单、分页查看,不引入全屏渲染框架、
8
+ 第二份业务实现或新的后台服务。
9
+
10
+ 本次调研核对了以下官方/项目一手文档,设计借鉴不等于性能实测:
11
+
12
+ - [Command Line Interface Guidelines](https://clig.dev):人类优先但保留组合能力;
13
+ 仅在 TTY 提示;明确确认危险操作;取消不能伪装成功。
14
+ - [Lazygit 导航](https://lazygit.dev/docs)及[项目快捷键](https://github.com/jesseduffield/lazygit/blob/master/docs/keybindings/Keybindings_en.md):
15
+ 以当前对象和任务组织操作,导航/上下文动作可发现。借鉴分区和逐层进入,
16
+ **不**照搬 Git 面板、快捷键数量或 Undo 能力。
17
+ - [Clack Prompts](https://bomb.sh/docs/clack/packages/prompts):沿用 select、
18
+ multiselect、text、password、confirm 和 cancel。API 与取消键同时核对了本地
19
+ 已安装的 `@clack/prompts` 类型声明和 `@clack/core` 实现。
20
+ - [Codex Hooks](https://learn.chatgpt.com/docs/hooks):非托管 Hook 必须通过宿主
21
+ `/hooks` 检查和信任;多个来源的 Hook 可以同时运行,生成文件不等于启用。
22
+ - [MCP stdio](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/stdio):
23
+ stdout 只能传协议消息,不能混入 TUI 提示。
24
+ - Pi 官方安装包中的完整 `README.md`、`docs/packages.md`:本地 package 使用
25
+ `pi install <path>`/`pi remove <path>`;`pi list` 检查注册,`pi config` 管理资源。
26
+ 工作台交给 Pi 自己执行这些命令,不实现另一套 Pi settings/trust 编辑器。
27
+
28
+ 阅读本仓库 `AGENTS.md`、README、[架构](03-target-architecture.md)、
29
+ [会话接入](session-integration.md)和 CLI/MCP/Pi/宿主适配代码后,确认以下边界:
30
+ Markdown 是事实来源;Runtime SQLite 是持久队列,不是可重建索引;TUI 不增加
31
+ 写权限、检索、跨项目读取、导入的用户证据地位或 MCP capabilities。
32
+
33
+ ## 原入口清单与归属
34
+
35
+ | 原入口 | 性质 | 工作台位置/保留理由 |
36
+ | --- | --- | --- |
37
+ | 无参数 TUI:Status/API/Network | 人类入口 | 改为完整 Home 和六个任务分区 |
38
+ | `config`、`config --network` | 人类表单快捷入口 | Settings;保留直接表单快捷方式,非 TTY 明确失败 |
39
+ | `status`、`show` | 人类+自动化 | Overview、Memory;保留脚本输出,查看走同一业务函数 |
40
+ | `import` | 人类+自动化 | Memory 导入向导;仍调用同一 Writer 入队/处理路径 |
41
+ | `project register/list/remove` | 人类+自动化 | Projects & permissions;CLI 参数和注册语义保留 |
42
+ | `retry`、`flush` | 运维+自动化 | Maintenance;保留脚本退出码、正常退避和租约行为 |
43
+ | `network-test` | 显式诊断+自动化 | Settings;用户确认后才发合成请求 |
44
+ | `mcp-config` | 配置生成+自动化 | Integrations 预览/导出;继续提供 stdout TOML |
45
+ | `codex-config`、`work-config` | 配置生成+自动化 | Integrations 预览/导出 bundle,CLI 继续支持无人值守生成 |
46
+ | `mcp` | **机器协议** | 保留独立 stdio,固定 relay/init/read;不得显示 TUI |
47
+ | `codex-hook`、`work-hook` | **宿主 Hook 协议** | 保留 JSON stdin/stdout、持久 inbox 和宿主身份 |
48
+ | `session-drain` | **机器消费者**+显式恢复 | 保留 detached 使用;工作台可前台启动同一入口并等待结果 |
49
+ | `session-refresh` | **宿主身份相关操作** | 保留显式 Skill 命令;不能由 TUI 用 cwd 猜测活动会话 |
50
+ | Pi Extension、`memory_read`、`/memory-flush`、`/memory-refresh` | **宿主生命周期/会话内交互** | 保留原生入口;外部工作台不能替换它们的会话上下文 |
51
+ | Codex/Work 的 `/hooks`、宿主 MCP 设置 | **宿主所有的信任和启停** | 工作台提供安装/停用说明,不修改 trust store |
52
+ | 本地 `config.json`、private `.env`、Canonical Markdown | 用户所有的文件 | 不隐藏、不迁移、不删除;设置表单复用配置验证和私有文件写入 |
53
+
54
+ 没有删除已有命令;CLI 和 TUI 是同一产品的两种操作方式。
55
+
56
+ ## 最终信息架构
57
+
58
+ ```text
59
+ common-memory
60
+ Home(当前 model/API、dataRoot、导航提示;未配置时只提供配置和退出)
61
+ ├─ Overview
62
+ │ ├─ 配置/真实存储路径/密钥是否存在/网络选择(不是连通性结果)
63
+ │ └─ 队列摘要、刷新、转入维护
64
+ ├─ Memory
65
+ │ ├─ 选择 global/已注册项目 → 文档 → 分页查看
66
+ │ └─ Markdown 导入:文件、范围、作者、标签、处理方式 → 确认 → 结果
67
+ ├─ Projects & permissions
68
+ │ ├─ 注册、项目详情、只移除注册
69
+ │ └─ 独立选择 disclosure scopes、writable scopes、provenance
70
+ ├─ Integrations
71
+ │ ├─ 本地就绪条件(宿主状态明确标为未验证)
72
+ │ ├─ Pi:确认后交给 pi list/install/config/remove
73
+ │ ├─ Codex:会话 Hook + read MCP + 显式 refresh Skill bundle
74
+ │ ├─ ChatGPT Work:会话 Hook + 独立 read/init MCP + refresh Skill bundle
75
+ │ └─ MCP-only:独立 init/read 配置块预览/导出
76
+ ├─ Maintenance
77
+ │ ├─ 队列/job 诊断/dead job retry/无正文 session 摘要
78
+ │ ├─ flush:处理队列,不封未结束的会话尾批
79
+ │ └─ session-drain:恢复持久 handoff,等待正常租约/退避
80
+ └─ Settings
81
+ ├─ model、显式 API 模式、可选密钥更新
82
+ ├─ network、proxy、CA;单独确认的合成连通测试
83
+ ├─ 授权(复用同一表单)
84
+ └─ advanced:输出/thinking 参数、调度/cache/字节限制、切换 dataRoot
85
+ ```
86
+
87
+ 高级参数在工作台内编辑受验证的 JSON 对象,不引入另一份参数 schema;切换
88
+ API 会说明并清除不兼容的 thinking 参数,其他设置保留。切换 dataRoot 是
89
+ **选择另一个 store**,不是迁移,需要先停止客户端;原 Markdown/SQLite 不动。
90
+
91
+ 上下键、Enter 和多选 Space 沿用 Clack;每个分区有 Back。表单 Esc/Ctrl+C
92
+ 返回当前分区,分区菜单取消返回 Home,Home 取消退出。操作失败留在分区内显示,
93
+ 不污染下一次操作的退出码。只在 stdin 和 stdout 都是 TTY 时打开界面;无参数
94
+ 非 TTY 输出入口说明并退出,直接配置表单非 TTY 报错,不等待输入。
95
+
96
+ 文档查看是同一次授权读取的分页快照,重新打开 Browse 获取新内容;没有检索、
97
+ 排名、跨项目汇总或直接编辑 Canonical 的新接口。终端控制字符可见转义,只影响
98
+ TUI 呈现,原 Markdown 和消费者/CLI 原文不变。状态只显示计数、ID 和受控诊断,
99
+ 不打印用户、assistant/tool、inbox 正文。现有 Runtime 存在时状态路径仍通过
100
+ RuntimeStore 打开,可能执行其已有幂等 schema 初始化;不是全新的数据库只读模式。
101
+ Runtime 不存在时不创建它。MCP read-only 进程的“从不开 Runtime”边界不变。
102
+
103
+ ## Integration management 的界限
104
+
105
+ 生成前必须自行选择宿主运行环境(同一 POSIX 或 Windows→WSL),不能仅根据
106
+ `WSL_DISTRO_NAME` 推测桌面进程在哪里。可选项目来自本地 registry,未授权项目有
107
+ 明确提示,生成过程不自动添加授权。配置、Skill 和可选 PowerShell bridge 均可
108
+ 分页预览;确认后才写文件,不携带 API key 或代理秘密。
109
+
110
+ 工作台 bundle 选择新目录;自动化生成器仍兼容已有目录,但先检查所有目标文件
111
+ 是否冲突、bundle 内目录是否为 symlink,再开始写文件,使用独占创建,不覆盖
112
+ 旧文件。检查到后面的 Skill 文件冲突也不会先写前面的 TOML。磁盘中途失败可能
113
+ 留下部分新 bundle,需要检查错误并使用新目录重试,不假装全部成功。
114
+
115
+ Codex/Work/MCP 的宿主配置合并、Hook 信任、MCP 启停仍由宿主所有者完成。
116
+ 工作台提供步骤和移除说明,没有通用宿主配置自动编辑器,也不写信任 store。
117
+ Pi 可以从工作台确认后调用 PATH 上的官方 `pi` 管理命令,使用 argument array、
118
+ 继承终端并固定当前 COMMON_MEMORY_HOME,不拼 shell 命令。成功退出只证明该
119
+ Pi 命令结束,不证明扩展正在捕获或真实模型已读到记忆。
120
+
121
+ session-refresh 必须来自实际宿主实例+thread,继续在会话内执行。
122
+ session-drain 的工作台动作前台启动原机器入口;Ctrl+C 停止该 consumer,持久
123
+ 未完成工作留待恢复。flush/import/network-test 在进程内复用既有操作,取消信号
124
+ 传给对应模型请求。保存配置不执行网络测试、不热更新/热撤销现存客户端。
125
+
126
+ ## 关键解耦
127
+
128
+ - `src/cli/operations.ts`:共享状态快照、授权读取、项目注册/移除、retry;
129
+ `main.ts` 和 TUI 都调用这些函数,没有各自一份 SQL/权限选择/锁实现。
130
+ - `tui-settings.ts`:配置表单、状态格式;保留可选 sessionCache、旧 proxy 字段缺省、
131
+ 未修改的密钥和 CA。保存前检查配置是否被外部编辑,防止长时间表单覆盖已观察到
132
+ 的新版本;这不是多个配置文件的原子事务或完整的并发锁协议。
133
+ - `tui-prompts.ts`:TTY、返回/取消、错误隔离、终端文本和分页呈现。
134
+ - `tui-integrations.ts`:宿主工作流和就绪说明;生成内容仍来自原 generator。
135
+ - `work-config.ts`:准备/渲染与写 bundle 分开,CLI 和 TUI 共用,预览没有文件写入。
136
+ - `interactive-process.ts`:有界的原生宿主/消费者命令交接,不调用 shell。
137
+ - import/flush 使用原函数;network-test 加可注入日志和取消信号,仍不打开 SQLite。
138
+
139
+ 没有修改 Core、Writer 决策协议、scope/provenance 映射、MCP 或 Pi capture 代码。
140
+ 配置保存仍由现有 validator 和 private file writer 完成。secret 和 JSON 是两个
141
+ 独立私有文件,不承诺它们跨文件提交的原子性。
142
+
143
+ ## 验证与剩余限制
144
+
145
+ 测试入口:
146
+
147
+ - `tests/cli/tui.test.ts`:真实业务配置/文件+脚本化 prompt 驱动导航,覆盖取消、
148
+ 错误、授权分离、导入/flush/probe/recovery 路由、配置保留、终端转义和 Pi 交接。
149
+ - `tests/cli/workbench-entries.test.ts`:真实子进程非 TTY/CLI、机器错误通道、
150
+ scope 隔离、无正文 job/session 状态、bundle 冲突/symlink 和共享生成结果。
151
+ - `tests/cli/network-test.test.ts`:合成 probe 输出、取消信号和连接/监听器清理。
152
+ - 既有 import、MCP、Pi、Codex/Work、session-drain 测试继续覆盖下层真实路径。
153
+
154
+ 完整 gate 使用 Node 24.x:`node scripts/verify.mjs`;构建后追加
155
+ `npm run test:consumer`。无需个人记忆、真实模型或生产集成设置。
156
+
157
+ 本次结果(Node 24.20.0):
158
+
159
+ - 完整 gate 通过:typecheck、63 个源文件边界检查、35 个测试文件/425 项测试、build。
160
+ - tarball consumer 通过:typed consumer、维护 prompt asset、Writer、Pi load、CLI startup。
161
+ - 构建产物的真实 Linux PTY 冒烟通过:Home→Overview→Memory、授权文档分页、
162
+ 终端 resize、逐层 Esc 返回和正常退出;确认未创建 SQLite、未改变 Markdown。
163
+ - `git diff --check` 通过。没有调用真实模型,也没有安装/修改用户生产宿主配置。
164
+ - 首次全量 gate 暴露了预览测试的分页断言错误,已修正;另一个既有网络测试依赖
165
+ `.invalid` 必然 DNS 失败,但此环境实测解析成 `198.18.0.87`。测试改为受控
166
+ `dns.lookup` 返回 ENOTFOUND,仍经过真实 NetworkClient 的错误处理;生产网络
167
+ 代码未因该测试改变。复验全部通过。现有 TLS-IP 弃用和 SOCKS5 实验性警告仍存在。
168
+
169
+ 尚未覆盖:真实 Desktop UI 的信任、宿主配置合并后的端到端启用;本次 Linux
170
+ 终端检查不证明 Windows/macOS 真机体验或 CI。宿主安装和存活状态不做猜测,
171
+ 必须在宿主核验。不存在统一的一键暂停所有消费者/撤销已披露记忆的能力。
172
+ 已损坏或不支持版本的配置仍 fail closed,需要先在文件中修复;没有静默重置或
173
+ 迁移。高级参数仍是受校验 JSON 表单,不是每个参数独立控件。