@weavecode/weave 0.1.3 → 0.1.4

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 (451) hide show
  1. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/.editorconfig +1 -1
  2. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/CHANGELOG.md +45 -22
  3. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/README.md +26 -1
  4. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/dist/qs.js +27 -27
  5. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/eslint.config.mjs +61 -50
  6. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/formats.js +7 -2
  7. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/parse.js +13 -6
  8. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/stringify.js +5 -3
  9. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/utils.js +15 -7
  10. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/package.json +6 -6
  11. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/dist/common.js +2 -2
  12. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/package.json +2 -2
  13. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/README.md +2 -3
  14. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +8 -3
  15. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/index.js +1 -1
  16. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/route/index.js +3 -1
  17. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/jsx/base.js +1 -1
  18. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +8 -0
  19. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/serve-static/index.js +3 -1
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/trie-router/node.js +2 -2
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +11 -6
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +8 -3
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/index.js +1 -1
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/route/index.js +3 -1
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/jsx/base.js +1 -1
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +8 -0
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/serve-static/index.js +3 -1
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/trie-router/node.js +2 -2
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +1 -1
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +1 -1
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +1 -1
  32. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +1 -1
  33. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +1 -1
  34. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +1 -1
  35. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +1 -1
  36. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +1 -1
  37. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +1 -1
  38. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +1 -1
  39. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/helper/testing/index.d.ts +2 -1
  40. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/hono-base.d.ts +21 -9
  41. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/index.d.ts +1 -1
  42. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/components.d.ts +2 -2
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/context.d.ts +2 -2
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/dom/components.d.ts +2 -2
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/dom/css.d.ts +2 -2
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/streaming.d.ts +4 -3
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +2 -1
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +3 -3
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +3 -3
  50. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/ipaddr.d.ts +1 -1
  51. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +11 -6
  52. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
  53. package/node_modules/@weavecode/cli/dist/cli.js +4 -4
  54. package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
  55. package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
  56. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  57. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
  58. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  59. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  60. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  61. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  62. package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
  63. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +2 -1
  64. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +14 -0
  65. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +4 -3
  66. package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
  67. package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
  68. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
  69. package/node_modules/@weavecode/cli/dist/init/executor.d.ts +5 -4
  70. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  71. package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
  72. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  73. package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
  74. package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
  75. package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
  76. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  77. package/node_modules/@weavecode/cli/dist/init/provision.d.ts +25 -0
  78. package/node_modules/@weavecode/cli/dist/init/provision.js +1 -0
  79. package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
  80. package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
  81. package/node_modules/@weavecode/cli/dist/parser.js +1 -1
  82. package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
  83. package/node_modules/@weavecode/cli/dist/statusline/mock-input.js +1 -1
  84. package/node_modules/@weavecode/cli/dist/statusline/preview.js +2 -2
  85. package/node_modules/@weavecode/cli/package.json +5 -5
  86. package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
  87. package/node_modules/@weavecode/core/dist/harness.d.ts +13 -1
  88. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  89. package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
  90. package/node_modules/@weavecode/core/dist/index.js +1 -1
  91. package/node_modules/@weavecode/core/dist/platform.js +1 -1
  92. package/node_modules/@weavecode/core/dist/types.js +1 -1
  93. package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
  94. package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
  95. package/node_modules/@weavecode/core/package.json +1 -1
  96. package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
  97. package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
  98. package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -3
  99. package/node_modules/@weavecode/harness/dist/claude/config.d.ts +9 -0
  100. package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
  101. package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
  102. package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
  103. package/node_modules/@weavecode/harness/dist/claude/event-source.d.ts +2 -0
  104. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  105. package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
  106. package/node_modules/@weavecode/harness/dist/claude/index.d.ts +4 -2
  107. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  108. package/node_modules/@weavecode/harness/dist/claude/liveness.d.ts +64 -0
  109. package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -0
  110. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
  111. package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
  112. package/node_modules/@weavecode/harness/dist/claude/model-aliases.d.ts +4 -0
  113. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
  114. package/node_modules/@weavecode/harness/dist/claude/narration.d.ts +13 -0
  115. package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -0
  116. package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
  117. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
  118. package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
  119. package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
  120. package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
  121. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
  122. package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
  123. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
  124. package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
  125. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +14 -14
  126. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
  127. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
  128. package/node_modules/@weavecode/harness/dist/claude/transcript.d.ts +13 -0
  129. package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -6
  130. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  131. package/node_modules/@weavecode/harness/dist/codex/capture.d.ts +1 -2
  132. package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
  133. package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
  134. package/node_modules/@weavecode/harness/dist/codex/config.d.ts +10 -0
  135. package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
  136. package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
  137. package/node_modules/@weavecode/harness/dist/codex/event-source.d.ts +1 -1
  138. package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
  139. package/node_modules/@weavecode/harness/dist/codex/images.d.ts +2 -0
  140. package/node_modules/@weavecode/harness/dist/codex/images.js +1 -0
  141. package/node_modules/@weavecode/harness/dist/codex/index.d.ts +13 -2
  142. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  143. package/node_modules/@weavecode/harness/dist/codex/liveness.d.ts +38 -0
  144. package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -0
  145. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
  146. package/node_modules/@weavecode/harness/dist/codex/messaging.d.ts +7 -3
  147. package/node_modules/@weavecode/harness/dist/codex/messaging.js +3 -3
  148. package/node_modules/@weavecode/harness/dist/codex/narration.d.ts +10 -0
  149. package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -0
  150. package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
  151. package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
  152. package/node_modules/@weavecode/harness/dist/codex/provision.d.ts +12 -0
  153. package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -0
  154. package/node_modules/@weavecode/harness/dist/codex/questions.d.ts +9 -0
  155. package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -0
  156. package/node_modules/@weavecode/harness/dist/codex/resume.js +1 -1
  157. package/node_modules/@weavecode/harness/dist/codex/rollout.d.ts +8 -5
  158. package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
  159. package/node_modules/@weavecode/harness/dist/codex/side-question.d.ts +12 -0
  160. package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -0
  161. package/node_modules/@weavecode/harness/dist/codex/titles.d.ts +8 -0
  162. package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -0
  163. package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
  164. package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
  165. package/node_modules/@weavecode/harness/dist/driver.d.ts +162 -8
  166. package/node_modules/@weavecode/harness/dist/driver.js +1 -1
  167. package/node_modules/@weavecode/harness/dist/index.d.ts +1 -0
  168. package/node_modules/@weavecode/harness/dist/index.js +1 -1
  169. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
  170. package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
  171. package/node_modules/@weavecode/harness/dist/install.d.ts +9 -0
  172. package/node_modules/@weavecode/harness/dist/install.js +1 -0
  173. package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
  174. package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
  175. package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
  176. package/node_modules/@weavecode/harness/dist/zcode/assets.js +1 -1
  177. package/node_modules/@weavecode/harness/dist/zcode/capture.js +3 -3
  178. package/node_modules/@weavecode/harness/dist/zcode/mcp.js +2 -2
  179. package/node_modules/@weavecode/harness/package.json +2 -2
  180. package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
  181. package/node_modules/@weavecode/server/dist/config/profiles.d.ts +10 -1
  182. package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
  183. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  184. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  185. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  186. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
  187. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  188. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
  189. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  190. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.d.ts +4 -55
  191. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.js +1 -1
  192. package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
  193. package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
  194. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  195. package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
  196. package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
  197. package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
  198. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  199. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  200. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.d.ts +2 -0
  201. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  202. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  203. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  204. package/node_modules/@weavecode/server/dist/daemon/liveness.d.ts +7 -0
  205. package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -0
  206. package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
  207. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.d.ts +28 -0
  208. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -0
  209. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.d.ts +16 -0
  210. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -0
  211. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.d.ts +20 -0
  212. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +12 -0
  213. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.d.ts +23 -0
  214. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -0
  215. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.d.ts +19 -0
  216. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -0
  217. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.d.ts +87 -0
  218. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -0
  219. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.d.ts +45 -0
  220. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -0
  221. package/node_modules/@weavecode/server/dist/daemon/opener/backend.d.ts +115 -0
  222. package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -0
  223. package/node_modules/@weavecode/server/dist/daemon/opener/launch.js +1 -1
  224. package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
  225. package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
  226. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.d.ts +8 -5
  227. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
  228. package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
  229. package/node_modules/@weavecode/server/dist/daemon/opener.d.ts +23 -120
  230. package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -13
  231. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  232. package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +17 -2
  233. package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -1
  234. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.d.ts +2 -0
  235. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  236. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  237. package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
  238. package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
  239. package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
  240. package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
  241. package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
  242. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.d.ts +6 -0
  243. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -0
  244. package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
  245. package/node_modules/@weavecode/server/dist/daemon/routes/search.d.ts +38 -0
  246. package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -0
  247. package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
  248. package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
  249. package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
  250. package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
  251. package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
  252. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +8 -2
  253. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
  254. package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +10 -1
  255. package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
  256. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  257. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  258. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  259. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
  260. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  261. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  262. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  263. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
  264. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  265. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  266. package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
  267. package/node_modules/@weavecode/server/dist/db/db.js +5 -2
  268. package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
  269. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  270. package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +10 -0
  271. package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
  272. package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
  273. package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
  274. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.d.ts +20 -0
  275. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
  276. package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
  277. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.d.ts +7 -1
  278. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
  279. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.d.ts +4 -4
  280. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
  281. package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
  282. package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
  283. package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
  284. package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
  285. package/node_modules/@weavecode/server/dist/hooks/dispatcher.d.ts +5 -0
  286. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  287. package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
  288. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  289. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  290. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
  291. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.d.ts +15 -0
  292. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  293. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  294. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.d.ts +64 -6
  295. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +3 -2
  296. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  297. package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
  298. package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
  299. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.d.ts +5 -0
  300. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  301. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  302. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  303. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  304. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  305. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  306. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  307. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  308. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  309. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  310. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.d.ts +2 -0
  311. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.js +1 -1
  312. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
  313. package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
  314. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  315. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  316. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  317. package/node_modules/@weavecode/server/dist/index.d.ts +1 -0
  318. package/node_modules/@weavecode/server/dist/index.js +1 -1
  319. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  320. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  321. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  322. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  323. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  324. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
  325. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  326. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
  327. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  328. package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
  329. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  330. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  331. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  332. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  333. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  334. package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
  335. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  336. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  337. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  338. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  339. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  340. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  341. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  342. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  343. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  344. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  345. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  346. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  347. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
  348. package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +19 -1
  349. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +9 -3
  350. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  351. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  352. package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
  353. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  354. package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
  355. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  356. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  357. package/node_modules/@weavecode/server/dist/repositories/sessions.d.ts +12 -2
  358. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  359. package/node_modules/@weavecode/server/dist/repositories/side-questions.d.ts +7 -0
  360. package/node_modules/@weavecode/server/dist/repositories/side-questions.js +8 -5
  361. package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
  362. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  363. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
  364. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
  365. package/node_modules/@weavecode/server/dist/surfaces.d.ts +8 -1
  366. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  367. package/node_modules/@weavecode/server/dist/version.d.ts +1 -11
  368. package/node_modules/@weavecode/server/dist/version.js +1 -1
  369. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  370. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  371. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  372. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  373. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  374. package/node_modules/@weavecode/server/package.json +4 -4
  375. package/node_modules/@weavecode/server/web/dist/assets/{abnfDiagram-WEYOIA3C-etRkSvQM.js → abnfDiagram-WEYOIA3C-DA-K085F.js} +1 -1
  376. package/node_modules/@weavecode/server/web/dist/assets/{arc-FxRZALAZ.js → arc-BI1jnmdZ.js} +1 -1
  377. package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-5OxZ-ffz.js → architectureDiagram-ZHVYKT53-DbdBgric.js} +1 -1
  378. package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-C-CgMF0O.js → blockDiagram-RJAE7QA3-BPRBmzb-.js} +1 -1
  379. package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-B6TqN1Pw.js → c4Diagram-XDPPPE54-C4D5sRs1.js} +1 -1
  380. package/node_modules/@weavecode/server/web/dist/assets/channel-DcCJrvon.js +1 -0
  381. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-Bdzr5RRj.js → chunk-2E7WHVMD-9ZSKiNU3.js} +1 -1
  382. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-gBZASjAC.js → chunk-2Q5K7J3B-i0AOjw_8.js} +1 -1
  383. package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DSlUhKMw.js → chunk-4EMNKR2T-DTpLfX1H.js} +1 -1
  384. package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-BDQ6zpGR.js → chunk-55XCU76K-COQYRD4q.js} +1 -1
  385. package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-DPnewKbl.js → chunk-5VM5RSS4-VsftEbvo.js} +1 -1
  386. package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-DagmT8Cc.js → chunk-JWPE2WC7-DonektJN.js} +1 -1
  387. package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-Da_2PxfM.js → chunk-VQ5W62QI-CaKUwuul.js} +1 -1
  388. package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-Cdaysois.js → chunk-XXDRQBXY-DXH3D_MT.js} +1 -1
  389. package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-CvgYfbjU.js → chunk-ZCHMQSOR-COwyAuGn.js} +2 -2
  390. package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-ahplYD2h.js → classDiagram-v2-4MYWR3UA-DEvMZ6mX.js} +1 -1
  391. package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-DFyUfgKj.js → cose-bilkent-JH36ORCC-6JBJHfH6.js} +1 -1
  392. package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-mr2qRwod.js → cynefin-EF2NZ3EQ-C4GM4sjT.js} +1 -1
  393. package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-BC26VqNp.js → cynefinDiagram-WF24UDRP-Cqgi0MBP.js} +1 -1
  394. package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-DoKn_P1x.js → dagre-NK4GIZVX-CljrnkCY.js} +1 -1
  395. package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-C9WfEmt3.js → diagram-CBK3MWTC-C3PyOj5J.js} +1 -1
  396. package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-D4Ibieda.js → diagram-I5XIIV2D-I5brQlaZ.js} +1 -1
  397. package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-wsLbYLi0.js → diagram-ODIL2UCW-BX9uFNbU.js} +1 -1
  398. package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-DBioMmDk.js → diagram-PFBEJUXE-y7D-VmqJ.js} +1 -1
  399. package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-Cl5gKsWm.js → diagram-RJA3I4VV-DLUL8W42.js} +1 -1
  400. package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-BSXOaZic.js → diagram-TYUNFSNR-DLCC3ILi.js} +1 -1
  401. package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-CJIGOag6.js → ebnfDiagram-V4P3TTPT-D7vALia7.js} +1 -1
  402. package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-D6nd2OVX.js → elk-QONTBCTQ-Ct2_hatz.js} +1 -1
  403. package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-gmXjWsuF.js → erDiagram-KYQIGQAA-DxLai58T.js} +1 -1
  404. package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-DWAiZ43K.js → flowDiagram-IUGLLWBU-AWn2IHrF.js} +1 -1
  405. package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-De4v6Wtt.js → ganttDiagram-R7GPNTJY-DmRHd4Wz.js} +1 -1
  406. package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-CouLBWOB.js → gitGraphDiagram-PDYL7XHY-Ccj-t3zg.js} +1 -1
  407. package/node_modules/@weavecode/server/web/dist/assets/index-BSxzia7U.js +1031 -0
  408. package/node_modules/@weavecode/server/web/dist/assets/index-CEpJpR7P.css +11 -0
  409. package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-CeMCdduD.js → infoDiagram-MVDRKAX5-BHquFlQa.js} +1 -1
  410. package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-DK6hETwg.js → ishikawaDiagram-HPEHV2GE-CVogEbdm.js} +1 -1
  411. package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-BcgwTlST.js → journeyDiagram-BOSHW7O7-DC9XG9oh.js} +1 -1
  412. package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CTVMJNz2.js → kanban-definition-FNSA4HC5-C_eu7DC_.js} +1 -1
  413. package/node_modules/@weavecode/server/web/dist/assets/{linear-CqQf5eWO.js → linear-keTbWHJ-.js} +1 -1
  414. package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-B6KZaljU.js → mermaid.core-4sbg0MnY.js} +4 -4
  415. package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-cpKvrQTI.js → mindmap-definition-6OY57UG3-kMQS0S2l.js} +1 -1
  416. package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-Bv2bNqMZ.js → pegDiagram-ECIUJNBX-DcUFoEwP.js} +1 -1
  417. package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-CXOnA429.js → pieDiagram-GNMPY74T-BQJ7WDCx.js} +1 -1
  418. package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-BFDUpWZb.js → quadrantDiagram-D57K4MC3-C7Oi1-sq.js} +1 -1
  419. package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-BHoDSO0D.js → railroadDiagram-Y72NRBL7-CEF2QbOF.js} +1 -1
  420. package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-B8JGji7q.js → requirementDiagram-EQYSW5RA-CTjjFS7X.js} +1 -1
  421. package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BbE2-6ZM.js → sankeyDiagram-SY24JHO5-j0S5kubS.js} +1 -1
  422. package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-DwK4X2MT.js → sequenceDiagram-BLEHNHQU-B76EsZp4.js} +1 -1
  423. package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-CY10zRMe.js → sizeCapture-INFHLROL-r0DZuqAy.js} +1 -1
  424. package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-32t4Zx8b.js → stateDiagram-v2-A6IESKWZ-B4DR9LHz.js} +1 -1
  425. package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-CZlYQ8_g.js → swimlanes-B3ENRKFQ-Dbcl85ro.js} +1 -1
  426. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-CZ_6SSBd.js +8 -0
  427. package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-8VsB-Jwg.js → timeline-definition-JXYKGLGB-BlBXXRNf.js} +1 -1
  428. package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-CKOTONay.js → usecaseDiagram-WPOLBNNX-Ck1M0dpc.js} +1 -1
  429. package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-BzrNjxtm.js → vennDiagram-Q3Y3IDCW-N8B-ohWk.js} +1 -1
  430. package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-CrSd-v8I.js → wardleyDiagram-IVAIDKWA-DX-AMXq_.js} +1 -1
  431. package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-t9cV9_9b.js → xychartDiagram-4URNHDU4-4fgL48Yl.js} +1 -1
  432. package/node_modules/@weavecode/server/web/dist/index.html +5 -4
  433. package/node_modules/@weavecode/templates/package.json +2 -2
  434. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/@peculiar/asn1-x509-attr/package.json +3 -3
  435. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/package.json +4 -4
  436. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/package.json +3 -3
  437. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/package.json +3 -3
  438. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-pfx/package.json +5 -5
  439. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-pkcs8/package.json +3 -3
  440. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-x509-attr/package.json +3 -3
  441. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/package.json +7 -7
  442. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/package.json +3 -3
  443. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/package.json +1 -1
  444. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/build/cjs/time.js +1 -1
  445. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/build/es2015/time.js +1 -1
  446. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/package.json +2 -2
  447. package/package.json +6 -6
  448. package/node_modules/@weavecode/server/web/dist/assets/channel-Dv4QUMOJ.js +0 -1
  449. package/node_modules/@weavecode/server/web/dist/assets/index-BXhLerZ4.js +0 -1008
  450. package/node_modules/@weavecode/server/web/dist/assets/index-BYRxC-Zz.css +0 -11
  451. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-BlIxQLON.js +0 -8
@@ -0,0 +1,10 @@
1
+ import type { NarrationSurface } from '../driver.js';
2
+ /**
3
+ * 旁白(codex):模型在一轮里的全部 assistant 正文——hook 域只有 Stop 的
4
+ * `last_assistant_message` 一个文本载体,中间输出只在 rollout 里。
5
+ *
6
+ * rollout 的 assistant 输出 = `event_msg` 条目 `payload.type ===
7
+ * 'AgentMessage'` 的 `payload.message`(与 images 面同一条目族;`UserMessage`
8
+ * 是用户侧、`AgentMessage` 是模型侧)。文本原样保留,时刻取条目 timestamp。
9
+ */
10
+ export declare const CODEX_NARRATION: NarrationSurface;
@@ -0,0 +1 @@
1
+ import{createReadStream as a}from"node:fs";import{createInterface as i}from"node:readline";export const CODEX_NARRATION={async sessionNarration({transcriptPath:n}){if(!n)return null;const e=[],t=i({input:a(n,{encoding:"utf8"}),crlfDelay:1/0});try{for await(const r of t){const s=l(r);s&&e.push(s)}}catch{return null}finally{t.close()}return e},lineParser:l};function l(n){if(!n.includes('"AgentMessage"'))return null;let e;try{e=JSON.parse(n)}catch{return null}if(e.type!=="event_msg")return null;const t=e.payload;if(t?.type!=="AgentMessage")return null;const r=typeof t.message=="string"?t.message:"";return r.trim()?{at:typeof e.timestamp=="string"?e.timestamp:null,text:r}:null}
@@ -1 +1 @@
1
- import{access as l,mkdir as m,readFile as i,writeFile as u}from"node:fs/promises";import{homedir as n}from"node:os";import p from"node:path";import{parse as s}from"smol-toml";import{CODEX_ASSETS as f}from"./assets.js";import{CodexTomlCorruptError as d,upsertCodexPluginEnabledInText as b}from"./toml.js";const c=e=>l(e).then(()=>!0,()=>!1);async function w(e){if(!await c(e))return{};try{const o=s(await i(e,"utf-8")).plugins;if(!o||typeof o!="object"||Array.isArray(o))return{};const r={};for(const[a,t]of Object.entries(o))t&&typeof t=="object"&&typeof t.enabled=="boolean"&&(r[a]=t.enabled);return r}catch{return{}}}export const CODEX_PLUGIN_STATE={readGlobalEnabled:()=>w(f.userConfigFile(n())),async writeGlobalEnabled(e,o){const r=f.userConfigFile(n());let a="";if(await c(r)){a=await i(r,"utf-8");try{s(a)}catch(t){throw new d(`${r} is not valid TOML \u2014 refusing to write: ${t instanceof Error?t.message:String(t)}`)}}await m(p.dirname(r),{recursive:!0}),await u(r,b(a,e,o),"utf-8")}};
1
+ import{access as u,mkdir as p,readFile as n,writeFile as d}from"node:fs/promises";import{homedir as s}from"node:os";import m from"node:path";import{parse as f}from"smol-toml";import{CODEX_ASSETS as l}from"./assets.js";import{CodexTomlCorruptError as b,upsertCodexPluginEnabledInText as w}from"./toml.js";const c=r=>u(r).then(()=>!0,()=>!1);async function E(r){if(!await c(r))return{};try{const t=f(await n(r,"utf-8")).plugins;if(!t||typeof t!="object"||Array.isArray(t))return{};const e={};for(const[o,a]of Object.entries(t))a&&typeof a=="object"&&typeof a.enabled=="boolean"&&(e[o]=a.enabled);return e}catch{return{}}}export const CODEX_PLUGIN_STATE={readGlobalEnabled:()=>E(l.userConfigFile(s())),async writeGlobalEnabled(r,i){const t=l.userConfigFile(s());let e="";if(await c(t)){e=await n(t,"utf-8");try{f(e)}catch(o){throw new b(`${t} is not valid TOML \u2014 refusing to write: ${o instanceof Error?o.message:String(o)}`)}}await p(m.dirname(t),{recursive:!0}),await d(t,w(e,r,i),"utf-8")}};
@@ -1,3 +1,3 @@
1
- import{spawn as T}from"node:child_process";import{homedir as I}from"node:os";import{lstat as M,mkdir as v,readFile as S,readdir as j,writeFile as x}from"node:fs/promises";import l from"node:path";import{CODEX_ASSETS as K}from"./assets.js";import{parseSectionEntries as L,removeTomlSection as N,splitTomlSections as O,upsertCodexPluginEnabledInText as P}from"./toml.js";export const CODEX_MARKETPLACE="weave";const _=6e4,D=2e3,A=64*1024;export function codexCommandLine(a){return["codex",...a.map(y=>`"${y.replace(/"/g,'\\"')}"`)].join(" ")}function q(a){if(!(a.exitCode!==null||a.signalCode!==null)){if(process.platform==="win32"&&a.pid!==void 0){T("taskkill",["/pid",String(a.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"}).unref();return}a.kill("SIGKILL")}}function F(a){return a.length>D?`${a.slice(0,D)}\u2026`:a}const J=(a,y)=>new Promise((h,u)=>{const k=process.platform==="win32",c=T(k?process.env.ComSpec||"cmd.exe":"codex",k?["/d","/s","/c",codexCommandLine(a)]:a,{windowsHide:!0,windowsVerbatimArguments:k,stdio:["ignore","pipe","pipe"]}),d=`codex ${a.join(" ")}`;let p="",m="",f=!1;const E=e=>{f||(f=!0,clearTimeout(t),u(new Error(F(e))))},t=setTimeout(()=>{q(c),E(`${d}: timed out after ${y.timeoutMs}ms`)},y.timeoutMs);c.stdout?.setEncoding("utf8"),c.stdout?.on("data",e=>{p.length<A&&(p+=e)}),c.stderr?.setEncoding("utf8"),c.stderr?.on("data",e=>{m.length<A&&(m+=e)}),c.on("error",e=>E(`${d}: ${e.message}`)),c.on("close",e=>{if(f)return;if(f=!0,clearTimeout(t),e===0){h({stdout:p,stderr:m});return}const i=[m,p].filter(Boolean).join(`
2
- `).trim()||`exit ${e}`;u(new Error(F(`${d}: ${i}`)))})});export function createCodexPluginSurface(a={}){const y=a.exec??J,h=t=>y(t,{timeoutMs:_}),u=()=>K.userConfigFile(I()),k=()=>l.join(I(),".codex","plugins","cache"),c=(t,e)=>`${t}@${e??CODEX_MARKETPLACE}`,d=async()=>{try{return await S(u(),"utf8")}catch{return null}},p=t=>{if(!t)return{};const e=O(t),i={};for(const n of e)if(!(!n.key||n.key.length!==2||n.key[0]!=="plugins"))for(const[r,o]of L(n.lines.slice(1))){if(r!=="enabled")continue;const s=o.split("=")[1]?.trim();(s==="true"||s==="false")&&(i[n.key[1]]=s==="true")}return i},m=async()=>{const t=k(),e={};let i;try{i=await j(t,{withFileTypes:!0})}catch{return e}for(const n of i){if(!n.isDirectory()&&!n.isSymbolicLink())continue;const r=l.join(t,n.name);let o;try{o=await j(r,{withFileTypes:!0})}catch{continue}for(const s of o){if(!s.isDirectory()&&!s.isSymbolicLink())continue;const w=l.join(r,s.name);let g;try{g=await j(w,{withFileTypes:!0})}catch{continue}const $=g.filter(b=>b.isDirectory()||b.isSymbolicLink());if($.length===0)continue;const C=$.map(b=>b.name).sort().pop(),G=`${s.name}@${n.name}`;e[G]=[{scope:"user",installPath:l.join(w,C),version:C}]}}return e},f=(t,e,i)=>{const n=e?.[e.length-1];return{key:t,alreadyInstalled:i,...n?.scope?{scope:n.scope}:{},...n?.installPath?{installPath:n.installPath}:{},...n?.version?{version:n.version}:{}}},E=async(t,e,i)=>{if(!t.dir)throw new Error(`marketplace dir required for ${e}@${t.name}`);if((await M(t.dir)).isSymbolicLink())return;const n=l.join(t.dir,".claude-plugin","marketplace.json");let r={};try{r=JSON.parse(await S(n,"utf8"))}catch{r={}}const o=Array.isArray(r.plugins)?[...r.plugins]:[],s=`./${l.relative(t.dir,i).split(l.sep).join("/")}`,w={name:e,source:s},g=o.findIndex($=>$?.name===e);g>=0?o[g]=w:o.push(w),r.name=t.name,r.owner||(r.owner={name:"weave"}),r.plugins=o,await v(l.dirname(n),{recursive:!0}),await x(n,`${JSON.stringify(r,null,2)}
3
- `,"utf8")};return{projectPluginDir:t=>l.join(t,".codex","plugins"),pluginKey:c,parsePluginKey(t){const e=t.lastIndexOf("@");return e>0?{name:t.slice(0,e),market:t.slice(e+1)}:{name:t,market:CODEX_MARKETPLACE}},async globalInstall(t,e={}){let i=e.name;if(!i)try{const s=JSON.parse(await S(l.join(t,".claude-plugin","plugin.json"),"utf8"));i=typeof s.name=="string"?s.name:void 0}catch{i=void 0}if(!i)throw new Error(`plugin manifest missing name: ${t}`);const n=e.marketplace,r=c(i,n?.name),o=(await m())[r];if(o&&o.length>0)return f(r,o,!0);if(n)await E(n,i,t),await h(["plugin","marketplace","add",n.dir??""]);else throw new Error(`codex plugin install requires a marketplace (got none for ${r}); weave-managed packs must come from a market directory`);return await h(["plugin","add",r,"--json"]),f(r,(await m())[r],!1)},readInstalled:m,async isInstalled(t,e){const i=(await m())[c(t,e)];return!!i&&i.length>0},async uninstall(t,e){const i=c(t,e),n=(await m())[i];!n||n.length===0||await h(["plugin","remove",i,"--json"])},async removeMarketplace(t){const e=await d();if(!e)return;const i=l.resolve(t),n=O(e);let r;for(const o of n)if(!(!o.key||o.key.length!==2||o.key[0]!=="marketplaces")){for(const[s,w]of L(o.lines.slice(1))){if(s!=="source")continue;const g=w.split("=").slice(1).join("=").trim().replace(/^"(.*)"$/,"$1");if(l.resolve(g)===i){r=o.key[1];break}}if(r)break}r&&await h(["plugin","marketplace","remove",r])},async readProjectEnabled(t,e,i){return p(await d())[c(e,i)]??!1},async setProjectEnabled(t,e,i,n){const r=c(e,n),o=await d()??"";await v(l.dirname(u()),{recursive:!0}),await x(u(),P(o,r,i),"utf8")},async readGlobalEnabled(){return p(await d())},async writeGlobalEnabled(t,e){const i=await d()??"";await v(l.dirname(u()),{recursive:!0}),await x(u(),P(i,t,e),"utf8")},pluginScopes:()=>["user"],async readEnabledOverrides(t){return{user:await this.readGlobalEnabled(),project:{},local:{}}},async setEnabledOverride(t,e,i,n){if(e!=="user")throw new Error(`codex plugins only support user-scope overrides (got ${e})`);const r=await d()??"";if(n==="inherit"){const{text:o,removed:s}=N(r,["plugins",i]);if(!s)return;await v(l.dirname(u()),{recursive:!0}),await x(u(),o,"utf8");return}await v(l.dirname(u()),{recursive:!0}),await x(u(),P(r,i,n==="on"),"utf8")}}}export const CODEX_PLUGINS=createCodexPluginSurface();
1
+ import{spawn as C}from"node:child_process";import{homedir as I}from"node:os";import{lstat as A,mkdir as v,readFile as $,readdir as P,writeFile as E}from"node:fs/promises";import c from"node:path";import{CODEX_ASSETS as U}from"./assets.js";import{parseSectionEntries as L,removeTomlSection as G,splitTomlSections as O,upsertCodexPluginEnabledInText as S}from"./toml.js";export const CODEX_MARKETPLACE="weave";const K=6e4,_=2e3,M=64*1024;export function codexCommandLine(a){return["codex",...a.map(g=>`"${g.replace(/"/g,'\\"')}"`)].join(" ")}function N(a){if(!(a.exitCode!==null||a.signalCode!==null)){if(process.platform==="win32"&&a.pid!==void 0){C("taskkill",["/pid",String(a.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"}).unref();return}a.kill("SIGKILL")}}function D(a){return a.length>_?`${a.slice(0,_)}\u2026`:a}const q=(a,g)=>new Promise((y,u)=>{const x=process.platform==="win32",l=C(x?process.env.ComSpec||"cmd.exe":"codex",x?["/d","/s","/c",codexCommandLine(a)]:a,{windowsHide:!0,windowsVerbatimArguments:x,stdio:["ignore","pipe","pipe"]}),d=`codex ${a.join(" ")}`;let p="",f="",m=!1;const b=e=>{m||(m=!0,clearTimeout(t),u(new Error(D(e))))},t=setTimeout(()=>{N(l),b(`${d}: timed out after ${g.timeoutMs}ms`)},g.timeoutMs);l.stdout?.setEncoding("utf8"),l.stdout?.on("data",e=>{p.length<M&&(p+=e)}),l.stderr?.setEncoding("utf8"),l.stderr?.on("data",e=>{f.length<M&&(f+=e)}),l.on("error",e=>b(`${d}: ${e.message}`)),l.on("close",e=>{if(m)return;if(m=!0,clearTimeout(t),e===0){y({stdout:p,stderr:f});return}const i=[f,p].filter(Boolean).join(`
2
+ `).trim()||`exit ${e}`;u(new Error(D(`${d}: ${i}`)))})});export function createCodexPluginSurface(a={}){const g=a.exec??q,y=t=>g(t,{timeoutMs:K}),u=()=>U.userConfigFile(I()),x=()=>c.join(I(),".codex","plugins","cache"),l=(t,e)=>`${t}@${e??CODEX_MARKETPLACE}`,d=async()=>{try{return await $(u(),"utf8")}catch{return null}},p=t=>{if(!t)return{};const e=O(t),i={};for(const n of e)if(!(!n.key||n.key.length!==2||n.key[0]!=="plugins"))for(const[r,o]of L(n.lines.slice(1))){if(r!=="enabled")continue;const s=o.split("=")[1]?.trim();(s==="true"||s==="false")&&(i[n.key[1]]=s==="true")}return i},f=async()=>{const t=x(),e={};let i;try{i=await P(t,{withFileTypes:!0})}catch{return e}for(const n of i){if(!n.isDirectory()&&!n.isSymbolicLink())continue;const r=c.join(t,n.name);let o;try{o=await P(r,{withFileTypes:!0})}catch{continue}for(const s of o){if(!s.isDirectory()&&!s.isSymbolicLink())continue;const w=c.join(r,s.name);let h;try{h=await P(w,{withFileTypes:!0})}catch{continue}const k=h.filter(j=>j.isDirectory()||j.isSymbolicLink());if(k.length===0)continue;const T=k.map(j=>j.name).sort().pop(),F=`${s.name}@${n.name}`;e[F]=[{scope:"user",installPath:c.join(w,T),version:T}]}}return e},m=(t,e,i)=>{const n=e?.[e.length-1];return{key:t,alreadyInstalled:i,...n?.scope?{scope:n.scope}:{},...n?.installPath?{installPath:n.installPath}:{},...n?.version?{version:n.version}:{}}},b=async(t,e,i)=>{if(!t.dir)throw new Error(`marketplace dir required for ${e}@${t.name}`);if((await A(t.dir)).isSymbolicLink())return;const n=c.join(t.dir,".claude-plugin","marketplace.json");let r={};try{r=JSON.parse(await $(n,"utf8"))}catch{r={}}const o=Array.isArray(r.plugins)?[...r.plugins]:[],s=`./${c.relative(t.dir,i).split(c.sep).join("/")}`,w={name:e,source:s},h=o.findIndex(k=>k?.name===e);h>=0?o[h]=w:o.push(w),r.name=t.name,r.owner||(r.owner={name:"weave"}),r.plugins=o,await v(c.dirname(n),{recursive:!0}),await E(n,`${JSON.stringify(r,null,2)}
3
+ `,"utf8")};return{projectPluginDir:t=>c.join(t,".codex","plugins"),pluginKey:l,parsePluginKey(t){const e=t.lastIndexOf("@");return e>0?{name:t.slice(0,e),market:t.slice(e+1)}:{name:t,market:CODEX_MARKETPLACE}},async globalInstall(t,e={}){let i=e.name;if(!i)try{const s=JSON.parse(await $(c.join(t,".claude-plugin","plugin.json"),"utf8"));i=typeof s.name=="string"?s.name:void 0}catch{i=void 0}if(!i)throw new Error(`plugin manifest missing name: ${t}`);const n=e.marketplace,r=l(i,n?.name),o=(await f())[r];if(o&&o.length>0)return m(r,o,!0);if(n)await b(n,i,t),await y(["plugin","marketplace","add",n.dir??""]);else throw new Error(`codex plugin install requires a marketplace (got none for ${r}); weave-managed packs must come from a market directory`);return await y(["plugin","add",r,"--json"]),m(r,(await f())[r],!1)},readInstalled:f,async isInstalled(t,e){const i=(await f())[l(t,e)];return!!i&&i.length>0},async uninstall(t,e){const i=l(t,e),n=(await f())[i];!n||n.length===0||await y(["plugin","remove",i,"--json"])},async removeMarketplace(t){const e=await d();if(!e)return;const i=c.resolve(t),n=O(e);let r;for(const o of n)if(!(!o.key||o.key.length!==2||o.key[0]!=="marketplaces")){for(const[s,w]of L(o.lines.slice(1))){if(s!=="source")continue;const k=w.split("=").slice(1).join("=").trim().replace(/^"(.*)"$/,"$1");if(c.resolve(k)===i){r=o.key[1];break}}if(r)break}r&&await y(["plugin","marketplace","remove",r])},async readProjectEnabled(t,e,i){return p(await d())[l(e,i)]??!1},async setProjectEnabled(t,e,i,n){const r=l(e,n),o=await d()??"";await v(c.dirname(u()),{recursive:!0}),await E(u(),S(o,r,i),"utf8")},async readGlobalEnabled(){return p(await d())},async writeGlobalEnabled(t,e){const i=await d()??"";await v(c.dirname(u()),{recursive:!0}),await E(u(),S(i,t,e),"utf8")},pluginScopes:()=>["user"],async readEnabledOverrides(t){return{user:await this.readGlobalEnabled(),project:{},local:{}}},async setEnabledOverride(t,e,i,n){if(e!=="user")throw new Error(`codex plugins only support user-scope overrides (got ${e})`);const r=await d()??"";if(n==="inherit"){const{text:o,removed:s}=G(r,["plugins",i]);if(!s)return;await v(c.dirname(u()),{recursive:!0}),await E(u(),o,"utf8");return}await v(c.dirname(u()),{recursive:!0}),await E(u(),S(r,i,n==="on"),"utf8")}}}export const CODEX_PLUGINS=createCodexPluginSurface();
@@ -0,0 +1,12 @@
1
+ import type { ProvisionCheck, ProvisionSurface } from '../driver.js';
2
+ /**
3
+ * `check` 的探测注入口:`daemonVersions` 跑 `codex app-server daemon version`
4
+ * 并解析 JSON(daemon 未跑/未装时回 null——那时无人持有快照,无回写风险)。
5
+ * 缺省真跑子进程;CLI 侧测试注入假实现。
6
+ */
7
+ export type DaemonVersionProbe = () => Promise<{
8
+ managedCodexVersion: string;
9
+ cliVersion: string;
10
+ } | null>;
11
+ export declare function codexProvisionCheck(bin: string, probe?: DaemonVersionProbe, home?: string): Promise<ProvisionCheck>;
12
+ export declare const CODEX_PROVISION: ProvisionSurface;
@@ -0,0 +1 @@
1
+ import{existsSync as d}from"node:fs";import{homedir as c}from"node:os";import p from"node:path";import{codexHome as m}from"./home.js";function l(o){return p.join(process.env.LOCALAPPDATA||p.join(o,"AppData","Local"),"OpenAI","Codex")}function u(o){return p.join(m(o),"packages","app-server-daemon")}async function f(o){const{spawn:a}=await import("node:child_process");return new Promise(n=>{let r="";const s=process.platform==="win32"?a(`${o} app-server daemon version`,{windowsHide:!0,shell:!0,stdio:["ignore","pipe","pipe"]}):a(o,["app-server","daemon","version"],{windowsHide:!0,stdio:["ignore","pipe","pipe"]}),i=setTimeout(()=>{s.kill("SIGKILL"),n(null)},8e3);s.stdout?.on("data",e=>r+=e.toString()),s.on("error",()=>{clearTimeout(i),n(null)}),s.on("close",()=>{clearTimeout(i);try{const e=JSON.parse(r);typeof e.managedCodexVersion=="string"&&typeof e.cliVersion=="string"?n({managedCodexVersion:e.managedCodexVersion,cliVersion:e.cliVersion}):n(null)}catch{n(null)}})})}export async function codexProvisionCheck(o,a=()=>f(o),n=c()){const r=[],s=[],i=d(l(n)),e=d(u(n));if(i&&!e&&(r.push("codex desktop app detected without the shared app-server daemon package \u2014 the two faces share ~/.codex, and version skew makes the older side rewrite config.toml from its stale snapshot (wiping manual provider / hooks-trust edits)"),s.push("codex app-server daemon update --from-cli --yes")),e){const t=await a();t&&t.managedCodexVersion!==t.cliVersion&&(r.push(`codex shared daemon (${t.managedCodexVersion}) differs from CLI (${t.cliVersion}) \u2014 the older side rewrites ~/.codex/config.toml from its stale snapshot on startup, wiping manual edits`),s.push("codex app-server daemon update --from-cli --yes"))}return{desktopApp:i,daemonPackage:e,warnings:r,hints:s}}export const CODEX_PROVISION={harness:"codex",check:codexProvisionCheck};
@@ -0,0 +1,9 @@
1
+ import type { BlockingPromptSpec } from '../driver.js';
2
+ /**
3
+ * Codex 阻塞式交互规格。codex 没有阻塞工具(`request_user_input` 的事件
4
+ * transient 且不落 rollout,hook 采集链路不可达——Plan 模式的结构化问答暂缓),
5
+ * `blockingTools` 恒空、`parseQuestions` 不可达;权限确认走 `eventQuestion`
6
+ * (PermissionRequest 事件),不经 Notification(`permissionNotificationType`
7
+ * = null ⇒ tracker 的 Notification 分支对 codex 永远短路)。
8
+ */
9
+ export declare const CODEX_QUESTIONS: BlockingPromptSpec;
@@ -0,0 +1,2 @@
1
+ const m="y",p="n",d="d",f="1",c={key:"codex:opaque",header:null,question:"The session is waiting for input (options unavailable \u2014 answer in its terminal)",multiSelect:!1,options:[]};function r(n){const e=n&&typeof n=="object"?n:{},o=Array.isArray(e.command)?e.command.filter(i=>typeof i=="string").join(" "):typeof e.command=="string"?e.command:"",s=typeof e.description=="string"?e.description:null,t=o||s||"Codex wants to run a command";return t.length>200?`${t.slice(0,200)}\u2026`:t}function a(n){const e=n&&typeof n=="object"?n:{},o=typeof e.command=="string"?e.command:"";if(!o)return"Codex wants to apply a patch";const s=[...o.matchAll(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm)].map(i=>i[1]),t=s.length>0?s.join(", "):o.split(`
2
+ `)[0]??"patch";return t.length>200?`${t.slice(0,200)}\u2026`:t}function u(n,e){const o=e&&typeof e=="object"&&Object.keys(e).length>0?JSON.stringify(e):"",s=`Codex wants to call ${n}`,t=o?`${s} ${o}`:s;return t.length>200?`${t.slice(0,200)}\u2026`:t}function l(n,e){return[{keys:["y"],label:n},{keys:["n"],label:e}]}export const CODEX_QUESTIONS={plan:null,blockingTools:[],permissionNotificationType:null,silentPermissionModes:["bypassPermissions"],permissionQuestion(){return{...c,key:"codex:permission"}},parseQuestions(){return[{...c}]},eventQuestion(n,e){if(n!=="PermissionRequest")return null;const o=e.raw&&typeof e.raw=="object"?e.raw:{},s=e.toolName,t=e.toolInput;return(typeof o.permission_mode=="string"?o.permission_mode:null)==="bypassPermissions"||s==null?null:s.startsWith("mcp__")?{key:"PermissionRequest:mcp",header:"MCP tool approval",question:u(s,t),multiSelect:!1,options:[{keys:["1"],label:"Yes, run the tool and continue"}]}:s==="apply_patch"?{key:"PermissionRequest:patch",header:"Apply patch",question:a(t),multiSelect:!1,options:l("Yes, proceed","No, and tell Codex what to do differently")}:s==="request_permissions"?{key:"PermissionRequest:permissions",header:"Permissions",question:r(t),multiSelect:!1,options:[{keys:["y"],label:"Yes, grant these permissions for this turn"},{keys:["d"],label:"No, continue without permissions"}]}:s==="write_stdin"?{key:"PermissionRequest:write_stdin",header:"Command approval",question:r(t),multiSelect:!1,options:l("Yes, proceed","No, cancel")}:{key:"PermissionRequest:exec",header:"Command approval",question:r(t),multiSelect:!1,options:l("Yes, proceed","No, and tell Codex what to do differently")}}};
@@ -1 +1 @@
1
- export const CODEX_RESUME={supported:!0,bin:"codex",args:e=>["exec","resume",e,"-"],promptStdin:!0,openArgs:e=>["resume",e]};
1
+ export const CODEX_RESUME={supported:!0,bin:"codex",args:e=>["exec","resume",e,"-"],promptStdin:!0,openArgs:e=>["resume",e],bootstrapText:e=>`/rename ${e}`};
@@ -6,12 +6,15 @@ export declare class CodexLogSource implements LogSource {
6
6
  private lastError;
7
7
  private capture;
8
8
  /**
9
- * 采集装上就由 hooks 主供事件——这时 rollout 再读一遍,同一条用户输入 / 回合
10
- * 收尾会入库两次。停止轮询是本槽唯一安全的兜底语义:hooks 一装上,兜底就该让位
11
- * (codex 还没信任 hooks 的那段时间确实看不到新事件,`scriptHealth` 与
12
- * `weave doctor` 是明说这一点的诊断面)。
9
+ * 采集装上就由 hooks 主供事件——rollout 再读一遍,同一条用户输入 / 回合收尾会
10
+ * 入库两次。但 hooks 的 SessionStart 是**懒触发**(首条消息才发,实测 0.164),
11
+ * 「TUI 开着还没说话」的会话 hooks 一条都不发,rollout 若也让位,这段窗口里
12
+ * 会话列表就没有行。故让位是**部分的**:capture 已装时只采 `session_meta`
13
+ * (会话启动信号,hooks 懒触发期间唯一漏掉的行型),其余行型照旧让位。
14
+ * codex 还没信任 hooks 的那段时间看不到任何 hook 事件——那不是本槽的锅,
15
+ * `scriptHealth` 与 `weave doctor` 是明说这一点的诊断面。
13
16
  */
14
- private hooksTakeOver;
17
+ private captureInstalled;
15
18
  poll(options: LogPollOptions): Promise<LogRecord[]>;
16
19
  health(options: {
17
20
  stateDir: string;
@@ -1,5 +1,5 @@
1
- import{mkdir as S,open as M,readdir as F,readFile as k,stat as z,utimes as T,writeFile as g}from"node:fs/promises";import h from"node:path";import{CodexTurnBuffer as A,metaOfLine as J}from"./event-source.js";import{readUserCapture as W}from"./capture.js";import{codexHome as O}from"./home.js";const v=512*1024,_=256*1024,$=2*6e4,P=1024*1024,U=10080*6e4,G=400,H=4*1024*1024,I=128*1024,E="cursors.json",X=".lock",q=6e4;function K(){const n=O();return[h.join(n,"sessions"),h.join(n,"archived_sessions")]}function N(n){const t=h.resolve(n);return process.platform==="win32"?t.toLowerCase():t}function B(n){try{const t=JSON.parse(n);return!t||typeof t!="object"||Array.isArray(t)?null:t}catch{return null}}async function Q(){const n=[],t=async(e,i)=>{if(i>4)return;let o;try{o=await F(e,{withFileTypes:!0})}catch{return}for(const a of o){const c=h.join(e,a.name);if(a.isDirectory()){await t(c,i+1);continue}if(!a.isFile()||!a.name.startsWith("rollout-")||!a.name.endsWith(".jsonl"))continue;const u=await z(c).catch(()=>null);u&&n.push({path:c,size:u.size,mtimeMs:u.mtimeMs})}};for(const e of K())await t(e,0);return n}async function V(n){const t=await M(n,"r").catch(()=>null);if(!t)return null;try{const e=Buffer.alloc(I),{bytesRead:i}=await t.read(e,0,I,0),o=e.subarray(0,i).toString("utf8"),a=o.indexOf(`
2
- `);if(a<0)return null;const c=B(o.slice(0,a));return c?J(c):null}finally{await t.close()}}async function Y(n,t,e){const i=await M(n,"r").catch(()=>null);if(!i)return null;try{const o=Buffer.alloc(e),{bytesRead:a}=await i.read(o,0,e,t);return{text:o.subarray(0,a).toString("utf8"),bytes:a}}finally{await i.close()}}async function C(n){try{const t=await k(h.join(n,E),"utf8"),e=JSON.parse(t);if(e&&typeof e=="object"&&e.files&&typeof e.files=="object")return e}catch{}return{at:null,files:{}}}async function Z(n,t){t.at=new Date().toISOString(),await S(n,{recursive:!0}),await g(h.join(n,E),JSON.stringify(t))}function tt(n){const t=Number(n);if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}async function et(n){await S(n,{recursive:!0});const t=h.join(n,X),e=`${process.pid}`;try{return await g(t,e,{flag:"wx"}),!0}catch{}const i=(await k(t,"utf8").catch(()=>"")).trim();if(i===e){const o=await z(t).catch(()=>null);if(!o||Date.now()-o.mtimeMs>q){const a=new Date;await T(t,a,a).catch(()=>{})}return!0}return i&&tt(i)?!1:g(t,e).then(()=>!0,()=>!1)}const st=1e4;export class CodexLogSource{harness="codex";buffers=new Map;lastError=null;capture=null;async hooksTakeOver(){const t=Date.now(),e=O();if(this.capture&&this.capture.root===e&&t-this.capture.at<st)return this.capture.on;const i=(await W()).installed;return this.capture={root:e,at:t,on:i},i}async poll(t){if(await this.hooksTakeOver())return[];if(!await et(t.stateDir))return[];const e=(await Q()).sort((s,r)=>s.mtimeMs-r.mtimeMs),i=await C(t.stateDir);if(e.length===0&&Object.keys(i.files).length===0)return[];const o=new Map(t.cwdWhitelist.map(s=>[N(s),s])),a=t.maxRecords??G;let c=t.maxBytes??H;const u=[];let l=!1;for(const s of e){if(u.length>=a||c<=0)break;let r=i.files[s.path],y=!1;if(!r){const f=await V(s.path);if(!f){i.files[s.path]={offset:s.size,sessionId:null,cwd:null},l=!0;continue}r={offset:0,sessionId:f.sessionId,cwd:f.cwd},i.files[s.path]=r,l=!0,Date.now()-s.mtimeMs>U?r.offset=s.size:Date.now()-s.mtimeMs<$&&s.size<P?r.offset=0:(r.offset=Math.max(0,s.size-_),y=!0)}const x=r.cwd?o.get(N(r.cwd)):void 0;if(!x){r.offset!==s.size&&(r.offset=s.size,l=!0);continue}if(s.size<r.offset&&(r.offset=0,y=!1,this.buffers.delete(s.path),l=!0),s.size===r.offset)continue;const w=await Y(s.path,r.offset,Math.min(s.size-r.offset,c));if(!w){this.lastError=`read failed: ${s.path}`;continue}c-=w.bytes;let p=w.text,m=r.offset;if(y){const f=p.indexOf(`
3
- `);if(f<0){r.offset=m+w.bytes,l=!0;continue}m+=Buffer.byteLength(p.slice(0,f+1),"utf8"),p=p.slice(f+1)}const D=p.lastIndexOf(`
4
- `);if(D<0){p.length>v&&(r.offset=m+w.bytes,this.lastError=`oversized line skipped: ${h.basename(s.path)}`,l=!0);continue}let j=m;const R=this.bufferOf(s.path);for(const f of p.slice(0,D).split(`
5
- `)){if(u.length>=a)break;if(j+=Buffer.byteLength(f,"utf8")+1,!f||f.length>v)continue;const b=B(f);if(!b)continue;const d=R.report(b);d&&(d.sessionId=r.sessionId??void 0,d.cwd=x,u.push({report:d,at:nt(b,s.mtimeMs)}))}r.offset=j,l=!0}const L=new Set(e.map(s=>s.path));for(const s of Object.keys(i.files))L.has(s)||(delete i.files[s],this.buffers.delete(s),l=!0);return l&&await Z(t.stateDir,i).catch(()=>{}),u}async health(t){const e=await C(t.stateDir),i=O();let o=0;for(const a of Object.values(e.files))a.cwd&&o++;return{root:i,files:o,lastPollAt:e.at,lastError:this.lastError}}bufferOf(t){let e=this.buffers.get(t);return e||(e=new A,this.buffers.set(t,e)),e}}function nt(n,t){if(typeof n.timestamp=="string"&&n.timestamp){const e=Date.parse(n.timestamp);if(!Number.isNaN(e))return new Date(e).toISOString()}return new Date(t).toISOString()}export const CODEX_LOG_SOURCE=new CodexLogSource;
1
+ import{mkdir as x,open as C,readdir as N,readFile as I,stat as L,utimes as T,writeFile as _}from"node:fs/promises";import l from"node:path";import{CodexTurnBuffer as B,metaOfLine as H}from"./event-source.js";import{readUserCapture as U}from"./capture.js";import{codexHome as O}from"./home.js";const A=512*1024,X=256*1024,W=2*6e4,J=1024*1024,K=10080*6e4,Y=400,P=4*1024*1024,E=128*1024,R="cursors.json",$=".lock",G=6e4;function q(){const n=O();return[l.join(n,"sessions"),l.join(n,"archived_sessions")]}function j(n){const t=l.resolve(n);return process.platform==="win32"?t.toLowerCase():t}function k(n){try{const t=JSON.parse(n);return!t||typeof t!="object"||Array.isArray(t)?null:t}catch{return null}}async function Q(){const n=[],t=async(e,r)=>{if(r>4)return;let i;try{i=await N(e,{withFileTypes:!0})}catch{return}for(const a of i){const f=l.join(e,a.name);if(a.isDirectory()){await t(f,r+1);continue}if(!a.isFile()||!a.name.startsWith("rollout-")||!a.name.endsWith(".jsonl"))continue;const h=await L(f).catch(()=>null);h&&n.push({path:f,size:h.size,mtimeMs:h.mtimeMs})}};for(const e of q())await t(e,0);return n}async function V(n){const t=await C(n,"r").catch(()=>null);if(!t)return null;try{const e=Buffer.alloc(E),{bytesRead:r}=await t.read(e,0,E,0),i=e.subarray(0,r).toString("utf8"),a=i.indexOf(`
2
+ `);if(a<0)return r<E?"pending":null;const f=k(i.slice(0,a));return f?H(f):null}finally{await t.close()}}async function Z(n,t,e){const r=await C(n,"r").catch(()=>null);if(!r)return null;try{const i=Buffer.alloc(e),{bytesRead:a}=await r.read(i,0,e,t);return{text:i.subarray(0,a).toString("utf8"),bytes:a}}finally{await r.close()}}async function z(n){try{const t=await I(l.join(n,R),"utf8"),e=JSON.parse(t);if(e&&typeof e=="object"&&e.files&&typeof e.files=="object")return e}catch{}return{at:null,files:{}}}async function tt(n,t){t.at=new Date().toISOString(),await x(n,{recursive:!0}),await _(l.join(n,R),JSON.stringify(t))}function et(n){const t=Number(n);if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}async function st(n){await x(n,{recursive:!0});const t=l.join(n,$),e=`${process.pid}`;try{return await _(t,e,{flag:"wx"}),!0}catch{}const r=(await I(t,"utf8").catch(()=>"")).trim();if(r===e){const i=await L(t).catch(()=>null);if(!i||Date.now()-i.mtimeMs>G){const a=new Date;await T(t,a,a).catch(()=>{})}return!0}return r&&et(r)?!1:_(t,e).then(()=>!0,()=>!1)}const nt=1e4;export class CodexLogSource{harness="codex";buffers=new Map;lastError=null;capture=null;async captureInstalled(){const t=Date.now(),e=O();if(this.capture&&this.capture.root===e&&t-this.capture.at<nt)return this.capture.on;const r=(await U()).installed;return this.capture={root:e,at:t,on:r},r}async poll(t){const e=await this.captureInstalled();if(!await st(t.stateDir))return[];const r=(await Q()).sort((s,o)=>s.mtimeMs-o.mtimeMs),i=await z(t.stateDir);if(r.length===0&&Object.keys(i.files).length===0)return[];const a=new Map(t.cwdWhitelist.map(s=>[j(s),s])),f=t.maxRecords??Y;let h=t.maxBytes??P;const d=[];let u=!1;for(const s of r){if(d.length>=f||h<=0)break;let o=i.files[s.path],S=!1;if(!o){const c=await V(s.path);if(c==="pending")continue;if(!c){i.files[s.path]={offset:s.size,sessionId:null,cwd:null},u=!0;continue}o={offset:0,sessionId:c.sessionId,cwd:c.cwd},i.files[s.path]=o,u=!0,Date.now()-s.mtimeMs>K?o.offset=s.size:Date.now()-s.mtimeMs<W&&s.size<J?o.offset=0:(o.offset=Math.max(0,s.size-X),S=!0)}const M=o.cwd?a.get(j(o.cwd)):void 0;if(!M){o.offset!==s.size&&(o.offset=s.size,u=!0);continue}if(s.size<o.offset&&(o.offset=0,S=!1,this.buffers.delete(s.path),u=!0),s.size===o.offset)continue;const p=await Z(s.path,o.offset,Math.min(s.size-o.offset,h));if(!p){this.lastError=`read failed: ${s.path}`;continue}h-=p.bytes;let w=p.text,m=o.offset;if(S){const c=w.indexOf(`
3
+ `);if(c<0){o.offset=m+p.bytes,u=!0;continue}m+=Buffer.byteLength(w.slice(0,c+1),"utf8"),w=w.slice(c+1)}const g=w.lastIndexOf(`
4
+ `);if(g<0){w.length>A&&(o.offset=m+p.bytes,this.lastError=`oversized line skipped: ${l.basename(s.path)}`,u=!0);continue}let D=m;const F=this.bufferOf(s.path);for(const c of w.slice(0,g).split(`
5
+ `)){if(d.length>=f)break;if(D+=Buffer.byteLength(c,"utf8")+1,!c||c.length>A)continue;const y=k(c);if(!y||e&&y.type!=="session_meta")continue;const b=F.report(y);b&&(b.sessionId=o.sessionId??void 0,b.cwd=M,d.push({report:b,at:rt(y,s.mtimeMs)}))}o.offset=D,u=!0}const v=new Set(r.map(s=>s.path));for(const s of Object.keys(i.files))v.has(s)||(delete i.files[s],this.buffers.delete(s),u=!0);return u&&await tt(t.stateDir,i).catch(()=>{}),d}async health(t){const e=await z(t.stateDir),r=O();let i=0;for(const a of Object.values(e.files))a.cwd&&i++;return{root:r,files:i,lastPollAt:e.at,lastError:this.lastError}}bufferOf(t){let e=this.buffers.get(t);return e||(e=new B,this.buffers.set(t,e)),e}}function rt(n,t){if(typeof n.timestamp=="string"&&n.timestamp){const e=Date.parse(n.timestamp);if(!Number.isNaN(e))return new Date(e).toISOString()}return new Date(t).toISOString()}export const CODEX_LOG_SOURCE=new CodexLogSource;
@@ -0,0 +1,12 @@
1
+ import type { SideQuestionSpec } from '../driver.js';
2
+ /**
3
+ * Codex 旁路会话面(`/side`,0.164 实测):主线程发过消息后,`/side` 开侧边
4
+ * 面板(父线程的 fork——继承历史作参考、子 agent 禁用、非变异探索为主),
5
+ * 问句在面板输入框里提交,回答**只在屏幕上**(ephemeral:零落盘、零 hook
6
+ * 事件、关面板即丢)。
7
+ *
8
+ * 回答只能读屏取:锚定我们发出的问句行,取它到 `Worked for` 收尾行之间的
9
+ * `•` 块。收尾(关面板)前必须确认面板还开着——用户中途 ctrl+c 关掉后,
10
+ * 再打 ctrl+c 会落进主线程语境(忙 = 中断确认菜单、闲 = 退出 TUI)。
11
+ */
12
+ export declare const CODEX_SIDE_QUESTION: SideQuestionSpec;
@@ -0,0 +1,4 @@
1
+ const I=2e3,a=/^[^\x00-\x1f\x7f]+$/,_="Side from main thread",f=/•\s+Working\s*\(/,E=/^\s*Worked for\s+/,O=/^\s*└\s+Tip:/,P="\u203A ";function R(e,t,s){const l="\u203A "+e,c=s.split(`
2
+ `);let u=-1;for(let n=c.length-1;n>=0;n--){const i=c[n].trim();if(i===l&&!k(t,l)){u=n;break}if(i===l){u=n;break}}if(u<0)return null;const o=[];for(let n=u+1;n<c.length;n++){const i=c[n],r=i.trim();if(r){if(E.test(r))break;if(f.test(r))return null;if(!O.test(i)){if(r.startsWith("\u203A ".trim()))break;if(r.startsWith("\u2022")){o.push(r.replace(/^•\s*/,""));continue}o.length>0&&o.push(r)}}}return o.length>0?o.join(`
3
+ `):null}function k(e,t){return e.split(`
4
+ `).some(s=>s.trim()===t)}export const CODEX_SIDE_QUESTION={command(e){return e},validate(e){const t=e.trim();return t?t.length>2e3?{ok:!1,error:"\u95EE\u9898\u8FC7\u957F\uFF08\u4E0A\u9650 2000 \u5B57\u7B26\uFF09"}:a.test(t)?{ok:!0,text:t}:{ok:!1,error:"\u95EE\u9898\u4E0D\u80FD\u542B\u6362\u884C\u6216\u63A7\u5236\u5B57\u7B26\uFF08\u4F1A\u63D0\u524D\u63D0\u4EA4\uFF09"}:{ok:!1,error:"\u95EE\u9898\u4E0D\u80FD\u4E3A\u7A7A"}},answerOf(){return null},prerequisite:"\u4E3B\u7EBF\u7A0B\u81F3\u5C11\u53D1\u8FC7\u4E00\u6761\u6D88\u606F\u540E\u624D\u80FD\u5F00\u4FA7\u8FB9\u4F1A\u8BDD\uFF08\u5BBF\u4E3B\u9650\u5236\uFF09",screen:{openKeys:"/side",submitKey:"\r",closeKey:"",panelOpen(e){return e.includes(_)},extractAnswer(e,t,s){return f.test(s)?{answer:null,done:!1}:{answer:R(e,t,s),done:!0}}}};
@@ -0,0 +1,8 @@
1
+ import type { SessionTitleSurface } from '../driver.js';
2
+ export declare function codexSessionTitleOf(sessionId: string, home?: string): string | null;
3
+ /** 与 officialSkills 同款 app-server JSON-RPC:握手后一发一收即杀树。 */
4
+ export declare function codexSetSessionTitle(sessionId: string, name: string): Promise<void>;
5
+ export declare function createCodexTitleSurface(deps?: {
6
+ home?: string;
7
+ }): SessionTitleSurface;
8
+ export declare const CODEX_TITLES: SessionTitleSurface;
@@ -0,0 +1,4 @@
1
+ import{spawn as h}from"node:child_process";import{readFileSync as S,statSync as g}from"node:fs";import v from"node:path";import{codexHome as y}from"./home.js";import{codexCommandLine as T}from"./plugins.js";const E=1e4,u=new Map;export function codexSessionTitleOf(c,s){const n=v.join(y(s),"session_index.jsonl");let r;try{r=g(n)}catch{return null}const d=u.get(n);if(!d||d.mtimeMs!==r.mtimeMs||d.size!==r.size){const e=new Map;try{for(const l of S(n,"utf8").split(`
2
+ `)){const o=l.trim();if(o)try{const t=JSON.parse(o);typeof t.id=="string"&&typeof t.thread_name=="string"&&e.set(t.id,t.thread_name)}catch{}}}catch{return null}u.set(n,{mtimeMs:r.mtimeMs,size:r.size,names:e})}const i=u.get(n).names.get(c)??null;return i!=null&&i.trim()?i:null}export function codexSetSessionTitle(c,s){return new Promise((n,r)=>{const d=s.trim();if(!d){r(new Error("thread name must not be empty"));return}const i=process.platform==="win32",e=h(i?process.env.ComSpec||"cmd.exe":"codex",i?["/d","/s","/c",T(["app-server"])]:["app-server"],{windowsHide:!0,windowsVerbatimArguments:i,stdio:["pipe","pipe","pipe"]});let l=!1,o="";const t=a=>{l||(l=!0,clearTimeout(w),i&&e.pid!==void 0?h("taskkill",["/pid",String(e.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"}).unref():e.kill("SIGKILL"),a?r(a):n())},w=setTimeout(()=>t(new Error("codex app-server thread/name/set timed out")),E),p=a=>{e.stdin?.write(`${JSON.stringify(a)}
3
+ `)};e.on("error",()=>t(new Error("failed to spawn codex app-server"))),e.on("exit",()=>t(new Error("codex app-server exited before thread/name/set"))),e.stdin?.on("error",()=>t(new Error("codex app-server stdin closed"))),p({jsonrpc:"2.0",id:1,method:"initialize",params:{clientInfo:{name:"weave",title:"weave",version:"1.0.0"}}}),e.stdout?.setEncoding("utf8"),e.stdout?.on("data",a=>{o+=a;let f;for(;(f=o.indexOf(`
4
+ `))>=0;){const x=o.slice(0,f);o=o.slice(f+1);let m=null;try{m=JSON.parse(x)}catch{continue}if(m?.id===1){p({jsonrpc:"2.0",method:"initialized",params:{}}),p({jsonrpc:"2.0",id:2,method:"thread/name/set",params:{threadId:c,name:d}});continue}m?.id===2&&t(m.error?new Error(String(m.error.message??"thread/name/set failed")):null)}})})}export function createCodexTitleSurface(c={}){return{harness:"codex",sessionTitleOf:s=>Promise.resolve(codexSessionTitleOf(s,c.home)),setSessionTitle:(s,n)=>codexSetSessionTitle(s,n)}}export const CODEX_TITLES=createCodexTitleSurface();
@@ -1,17 +1,17 @@
1
- import{parse as W}from"smol-toml";export class CodexTomlCorruptError extends Error{constructor(n){super(n),this.name="CodexTomlCorruptError"}}function S(t){return/[A-Za-z0-9_-]/.test(t)}function x(t){return t===" "||t===" "}const $={b:"\b",t:" ",n:`
2
- `,f:"\f",r:"\r",'"':'"',"\\":"\\"};export function parseDottedKey(t){const n=[];let e=0;for(;;){for(;e<t.length&&x(t[e]);)e++;if(e>=t.length)return null;const r=t[e];if(r==='"'||r==="'"){e++;let i="";for(;e<t.length;){const o=t[e];if(r==='"'&&o==="\\"){const s=t[e+1];if(s===void 0||!(s in $))return null;i+=$[s],e+=2;continue}if(o===r)break;i+=o,e++}if(e>=t.length)return null;e++,n.push(i)}else{const i=e;for(;e<t.length&&S(t[e]);)e++;if(e===i)return null;n.push(t.slice(i,e))}for(;e<t.length&&x(t[e]);)e++;if(e>=t.length)return n;if(t[e]!==".")return null;e++}}export function sectionHeaderKey(t){const n=t.trim();if(!n.startsWith("["))return null;const e=n.startsWith("[[");let r=e?2:1,i="",o=!1;for(;r<n.length;){const l=n[r];if(l==='"'||l==="'"){const u=l;for(i+=u,r++;r<n.length;){if(u==='"'&&n[r]==="\\"){if(r+1>=n.length)return null;i+=n[r]+n[r+1],r+=2;continue}if(n[r]===u)break;i+=n[r],r++}if(r>=n.length)return null;i+=u,r++;continue}if(l==="]"){if(e){if(n[r+1]!=="]")return null;r+=2}else r++;o=!0;break}i+=l,r++}if(!o)return null;const s=n.slice(r).trim();return s!==""&&!s.startsWith("#")?null:parseDottedKey(i)}export function renderTomlKey(t){return/^[A-Za-z0-9_-]+$/.test(t)?t:`"${y(t)}"`}export function renderTomlHeader(t){return`[${t.map(renderTomlKey).join(".")}]`}function y(t){let n="";for(const e of t)e==="\\"?n+="\\\\":e==='"'?n+='\\"':e===`
3
- `?n+="\\n":e==="\r"?n+="\\r":e===" "?n+="\\t":e<" "||e==="\x7F"?n+=`\\u${e.charCodeAt(0).toString(16).padStart(4,"0")}`:n+=e;return n}export function renderTomlString(t){const n=t.includes("\\"),e=!t.includes("'")&&!/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f\n]/.test(t);return n&&e?`'${t}'`:`"${y(t)}"`}export function splitTomlSections(t){const n=t.split(`
4
- `),e=[];let r={key:null,lines:[]};for(const i of n){const o=sectionHeaderKey(i);o!==null?(e.push(r),r={key:o,lines:[i]}):r.lines.push(i)}return e.push(r),e}export function sameKey(t,n){return t!==null&&t.length===n.length&&t.every((e,r)=>e===n[r])}function g(t,n){return t!==null&&t.length>n.length&&n.every((e,r)=>t[r]===e)}function A(t){let n=0;for(let e=t.length-1;e>=0&&t[e].trim()==="";e--)n++;return n}function p(t){const n=t.replace(/(?:\r?\n)+[ \t]*$/,"");return n===""?"":`${n}
5
- `}function C(t,n){const e=t.replace(/(?:\r?\n)+[ \t]*$/,"");return e.trim()===""?`${n.join(`
1
+ import{parse as W}from"smol-toml";export class CodexTomlCorruptError extends Error{constructor(t){super(t),this.name="CodexTomlCorruptError"}}function A(n){return/[A-Za-z0-9_-]/.test(n)}function y(n){return n===" "||n===" "}const $={b:"\b",t:" ",n:`
2
+ `,f:"\f",r:"\r",'"':'"',"\\":"\\"};export function parseDottedKey(n){const t=[];let e=0;for(;;){for(;e<n.length&&y(n[e]);)e++;if(e>=n.length)return null;const r=n[e];if(r==='"'||r==="'"){e++;let o="";for(;e<n.length;){const i=n[e];if(r==='"'&&i==="\\"){const s=n[e+1];if(s===void 0||!(s in $))return null;o+=$[s],e+=2;continue}if(i===r)break;o+=i,e++}if(e>=n.length)return null;e++,t.push(o)}else{const o=e;for(;e<n.length&&A(n[e]);)e++;if(e===o)return null;t.push(n.slice(o,e))}for(;e<n.length&&y(n[e]);)e++;if(e>=n.length)return t;if(n[e]!==".")return null;e++}}export function sectionHeaderKey(n){const t=n.trim();if(!t.startsWith("["))return null;const e=t.startsWith("[[");let r=e?2:1,o="",i=!1;for(;r<t.length;){const l=t[r];if(l==='"'||l==="'"){const c=l;for(o+=c,r++;r<t.length;){if(c==='"'&&t[r]==="\\"){if(r+1>=t.length)return null;o+=t[r]+t[r+1],r+=2;continue}if(t[r]===c)break;o+=t[r],r++}if(r>=t.length)return null;o+=c,r++;continue}if(l==="]"){if(e){if(t[r+1]!=="]")return null;r+=2}else r++;i=!0;break}o+=l,r++}if(!i)return null;const s=t.slice(r).trim();return s!==""&&!s.startsWith("#")?null:parseDottedKey(o)}export function renderTomlKey(n){return/^[A-Za-z0-9_-]+$/.test(n)?n:`"${x(n)}"`}export function renderTomlHeader(n){return`[${n.map(renderTomlKey).join(".")}]`}function x(n){let t="";for(const e of n)e==="\\"?t+="\\\\":e==='"'?t+='\\"':e===`
3
+ `?t+="\\n":e==="\r"?t+="\\r":e===" "?t+="\\t":e<" "||e==="\x7F"?t+=`\\u${e.charCodeAt(0).toString(16).padStart(4,"0")}`:t+=e;return t}export function renderTomlString(n){const t=n.includes("\\"),e=!n.includes("'")&&!/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f\n]/.test(n);return t&&e?`'${n}'`:`"${x(n)}"`}export function splitTomlSections(n){const t=n.split(`
4
+ `),e=[];let r={key:null,lines:[]};for(const o of t){const i=sectionHeaderKey(o);i!==null?(e.push(r),r={key:i,lines:[o]}):r.lines.push(o)}return e.push(r),e}export function sameKey(n,t){return n!==null&&n.length===t.length&&n.every((e,r)=>e===t[r])}function m(n,t){return n!==null&&n.length>t.length&&t.every((e,r)=>n[r]===e)}function C(n){let t=0;for(let e=n.length-1;e>=0&&n[e].trim()==="";e--)t++;return t}function h(n){const t=n.replace(/(?:\r?\n)+[ \t]*$/,"");return t===""?"":`${t}
5
+ `}function w(n,t){const e=n.replace(/(?:\r?\n)+[ \t]*$/,"");return e.trim()===""?`${t.join(`
6
6
  `)}
7
7
  `:`${e}
8
8
 
9
- ${n.join(`
9
+ ${t.join(`
10
10
  `)}
11
- `}export function upsertTomlSection(t,n,e){const r=splitTomlSections(t);let i=-1,o=-1;const s=new Set;for(let f=0;f<r.length;f++){const h=r[f].key;sameKey(h,n)?(i<0&&(i=f),s.add(f),o=f):g(h,n)&&(s.add(f),o=f)}if(i<0)return C(t,[renderTomlHeader(n),...e]);const l=r[o].lines,u=l.slice(l.length-A(l)),c=[renderTomlHeader(n),...e,...u],a=[];for(let f=0;f<r.length;f++)f===i&&a.push(...c),!s.has(f)&&a.push(...r[f].lines);return p(a.join(`
12
- `))}export function removeTomlSection(t,n){const e=splitTomlSections(t),r=new Set;for(let o=0;o<e.length;o++){const s=e[o].key;(sameKey(s,n)||g(s,n))&&r.add(o)}if(r.size===0)return{text:t,removed:!1};const i=[];for(let o=0;o<e.length;o++)r.has(o)||i.push(...e[o].lines);return{text:p(i.join(`
13
- `)),removed:!0}}export function parseSectionEntries(t){const n=[];for(const e of t){const r=e.trim();if(r===""||r.startsWith("#")||r.startsWith("["))continue;const i=/^("[^"]*"|'[^']*'|[A-Za-z0-9_-]+)\s*=/.exec(r);if(!i)continue;const o=parseDottedKey(i[1]);o===null||o.length!==1||n.push([o[0],e])}return n}export function upsertCodexPluginEnabledInText(t,n,e){const r=["plugins",n],i=splitTomlSections(t).find(s=>sameKey(s.key,r)),o=[`enabled = ${e?"true":"false"}`];if(i)for(const[s,l]of parseSectionEntries(i.lines.slice(1)))s!=="enabled"&&o.push(l);return upsertTomlSection(t,r,o)}export function renderTomlValue(t){return t==null?'""':typeof t=="boolean"?t?"true":"false":typeof t=="number"?Number.isFinite(t)?String(t):'""':typeof t=="string"?renderTomlString(t):Array.isArray(t)?`[${t.map(renderTomlValue).join(", ")}]`:`{ ${Object.entries(t).filter(([,n])=>n!==void 0).map(([n,e])=>`${renderTomlKey(n)} = ${renderTomlValue(e)}`).join(", ")} }`}export function setTomlValueInText(t,n,e){if(n.length===0)return t;const r=`${renderTomlKey(n[n.length-1])} = ${renderTomlValue(e)}`,i=n.slice(0,-1);if(i.length===0){const h=splitTomlSections(t),d=h[0],k=n[0],m=b(d.lines,k,r);if(m===d.lines)return t;const j=h.flatMap((T,v)=>v===0?m:T.lines);return p(j.join(`
14
- `))}let o=I(t,i);const s=splitTomlSections(o),l=s.findIndex(h=>sameKey(h.key,i));if(l<0)return o;const u=s[l],c=n[n.length-1],a=b(u.lines,c,r);if(a===u.lines)return o;const f=s.flatMap((h,d)=>d===l?a:h.lines);return p(f.join(`
15
- `))}export function removeTomlValueInText(t,n){if(n.length===0)return{text:t,removed:!1};const e=splitTomlSections(t),r=n.slice(0,-1),i=n[n.length-1];for(let o=0;o<e.length;o++){const s=e[o];if(!(r.length===0?s.key===null:sameKey(s.key,r)))continue;const l=E(s.lines,i);if(l!==s.lines){const u=e.flatMap((c,a)=>a===o?l:c.lines);return{text:p(u.join(`
16
- `)),removed:!0}}}return{text:t,removed:!1}}function b(t,n,e){const r=[];let i=!1;for(let s=0;s<t.length;s++){const l=t[s],u=l.trim();if(!i&&(u.startsWith(`${n} =`)||u.startsWith(`${n}=`))){r.push(e),i=!0;continue}r.push(l)}if(i)return r;let o=-1;for(let s=t.length-1;s>=0;s--){const l=t[s].trim();if(l!==""&&!l.startsWith("#")){o=s;break}}return r.splice(o+1,0,e),r}function E(t,n){const e=[];let r=!1;for(const i of t){const o=i.trim();if(!r&&(o.startsWith(`${n} =`)||o.startsWith(`${n}=`))){r=!0;continue}e.push(i)}return r?e:t}function I(t,n){let e=t;for(let r=1;r<=n.length;r++){const i=n.slice(0,r),o=splitTomlSections(e);if(o.some(c=>sameKey(c.key,i)||c.key!==null&&g(c.key,i)))continue;const s=i.slice(0,-1),l=s.length===0?o[0]:o.find(c=>sameKey(c.key,s)),u=i[r-1];if(l){const c=K(l.lines,u);if(c){const a=o.indexOf(l);e=p([...o.flatMap((f,h)=>h===a?c.lines:f.lines),...c.sectionLines].join(`
17
- `));continue}}e=upsertTomlSection(e,[...i],[])}return e}function K(t,n){const e=t.findIndex(c=>{const a=c.trim();return a.startsWith(`${n} =`)&&a.includes("{")});if(e<0)return null;const r=t[e].trim(),i=r.slice(r.indexOf("=")+1).trim();let o;try{o=W(`v = ${i}`)}catch{return null}const s=o.v;if(!s||typeof s!="object"||Array.isArray(s))return null;const l=Object.entries(s).map(([c,a])=>`${renderTomlKey(c)} = ${renderTomlValue(a)}`),u=[...t];return u.splice(e,1),{lines:u,sectionLines:[`[${n}]`,...l]}}
11
+ `}export function upsertTomlSection(n,t,e){const r=splitTomlSections(n);let o=-1,i=-1;const s=new Set;for(let u=0;u<r.length;u++){const d=r[u].key;sameKey(d,t)?(o<0&&(o=u),s.add(u),i=u):m(d,t)&&(s.add(u),i=u)}if(o<0)return w(n,[renderTomlHeader(t),...e]);const l=r[i].lines,c=l.slice(l.length-C(l)),f=[renderTomlHeader(t),...e,...c],a=[];for(let u=0;u<r.length;u++)u===o&&a.push(...f),!s.has(u)&&a.push(...r[u].lines);return h(a.join(`
12
+ `))}export function removeTomlSection(n,t){const e=splitTomlSections(n),r=new Set;for(let i=0;i<e.length;i++){const s=e[i].key;(sameKey(s,t)||m(s,t))&&r.add(i)}if(r.size===0)return{text:n,removed:!1};const o=[];for(let i=0;i<e.length;i++)r.has(i)||o.push(...e[i].lines);return{text:h(o.join(`
13
+ `)),removed:!0}}export function parseSectionEntries(n){const t=[];for(const e of n){const r=e.trim();if(r===""||r.startsWith("#")||r.startsWith("["))continue;const o=/^("[^"]*"|'[^']*'|[A-Za-z0-9_-]+)\s*=/.exec(r);if(!o)continue;const i=parseDottedKey(o[1]);i===null||i.length!==1||t.push([i[0],e])}return t}export function upsertCodexPluginEnabledInText(n,t,e){const r=["plugins",t],i=splitTomlSections(n).find(l=>sameKey(l.key,r)),s=[`enabled = ${e?"true":"false"}`];if(i)for(const[l,c]of parseSectionEntries(i.lines.slice(1)))l!=="enabled"&&s.push(c);return upsertTomlSection(n,r,s)}export function renderTomlValue(n){return n==null?'""':typeof n=="boolean"?n?"true":"false":typeof n=="number"?Number.isFinite(n)?String(n):'""':typeof n=="string"?renderTomlString(n):Array.isArray(n)?`[${n.map(renderTomlValue).join(", ")}]`:`{ ${Object.entries(n).filter(([,e])=>e!==void 0).map(([e,r])=>`${renderTomlKey(e)} = ${renderTomlValue(r)}`).join(", ")} }`}export function setTomlValueInText(n,t,e){if(t.length===0)return n;const r=`${renderTomlKey(t[t.length-1])} = ${renderTomlValue(e)}`,o=t.slice(0,-1);if(o.length===0){const d=splitTomlSections(n),p=d[0],k=t[0],g=b(p.lines,k,r);if(g===p.lines)return n;const S=d.flatMap((T,j)=>j===0?g:T.lines);return h(S.join(`
14
+ `))}let i=I(n,o);const s=splitTomlSections(i),l=s.findIndex(d=>sameKey(d.key,o));if(l<0)return i;const c=s[l],f=t[t.length-1],a=b(c.lines,f,r);if(a===c.lines)return i;const u=s.flatMap((d,p)=>p===l?a:d.lines);return h(u.join(`
15
+ `))}export function removeTomlValueInText(n,t){if(t.length===0)return{text:n,removed:!1};const e=splitTomlSections(n),r=t.slice(0,-1),o=t[t.length-1];for(let i=0;i<e.length;i++){const s=e[i];if(!(r.length===0?s.key===null:sameKey(s.key,r)))continue;const c=E(s.lines,o);if(c!==s.lines){const f=e.flatMap((a,u)=>u===i?c:a.lines);return{text:h(f.join(`
16
+ `)),removed:!0}}}return{text:n,removed:!1}}function b(n,t,e){const r=[];let o=!1;for(let s=0;s<n.length;s++){const l=n[s],c=l.trim();if(!o&&(c.startsWith(`${t} =`)||c.startsWith(`${t}=`))){r.push(e),o=!0;continue}r.push(l)}if(o)return r;let i=-1;for(let s=n.length-1;s>=0;s--){const l=n[s].trim();if(l!==""&&!l.startsWith("#")){i=s;break}}return r.splice(i+1,0,e),r}function E(n,t){const e=[];let r=!1;for(const o of n){const i=o.trim();if(!r&&(i.startsWith(`${t} =`)||i.startsWith(`${t}=`))){r=!0;continue}e.push(o)}return r?e:n}function I(n,t){let e=n;for(let r=1;r<=t.length;r++){const o=t.slice(0,r),i=splitTomlSections(e);if(i.some(f=>sameKey(f.key,o)||f.key!==null&&m(f.key,o)))continue;const s=o.slice(0,-1),l=s.length===0?i[0]:i.find(f=>sameKey(f.key,s)),c=o[r-1];if(l){const f=K(l.lines,c);if(f){const a=i.indexOf(l);e=h([...i.flatMap((u,d)=>d===a?f.lines:u.lines),...f.sectionLines].join(`
17
+ `));continue}}e=upsertTomlSection(e,[...o],[])}return e}function K(n,t){const e=n.findIndex(f=>{const a=f.trim();return a.startsWith(`${t} =`)&&a.includes("{")});if(e<0)return null;const r=n[e].trim(),o=r.slice(r.indexOf("=")+1).trim();let i;try{i=W(`v = ${o}`)}catch{return null}const s=i.v;if(!s||typeof s!="object"||Array.isArray(s))return null;const l=Object.entries(s).map(([f,a])=>`${renderTomlKey(f)} = ${renderTomlValue(a)}`),c=[...n];return c.splice(e,1),{lines:c,sectionLines:[`[${t}]`,...l]}}
@@ -1,2 +1,2 @@
1
- export function codexInterruptMarkerAt(o){let t=null;for(const n of o.split(`
2
- `)){if(!n.includes('"turn_aborted"'))continue;let r;try{r=JSON.parse(n)}catch{continue}const i=r;if(i?.payload?.type!=="turn_aborted")continue;const e=Date.parse(String(i.timestamp??""));Number.isFinite(e)&&(t===null||e>t)&&(t=e)}return t}
1
+ export function codexInterruptMarkerAt(o){let t=null;for(const e of o.split(`
2
+ `)){if(!e.includes('"turn_aborted"'))continue;let r;try{r=JSON.parse(e)}catch{continue}const i=r;if(i?.payload?.type!=="turn_aborted")continue;const n=Date.parse(String(i.timestamp??""));Number.isFinite(n)&&(t===null||n>t)&&(t=n)}return t}
@@ -7,7 +7,7 @@ import type { FileAssetCategory } from './shared/file-specs.js';
7
7
  * 依赖硬约束:本包仅依赖 @weavecode/core(永不依赖 server/cli,防 statusline/i18n 成环)。
8
8
  */
9
9
  /** 可插拔能力槽——driver 声明持有哪些,注册表按能力检索。 */
10
- export type HarnessCapability = 'init' | 'events' | 'assets' | 'resume' | 'detect' | 'plugins' | 'pluginState' | 'messaging' | 'questions' | 'capture' | 'statusline' | 'logs' | 'config' | 'edits' | 'images' | 'commands';
10
+ export type HarnessCapability = 'init' | 'events' | 'assets' | 'resume' | 'detect' | 'plugins' | 'pluginState' | 'messaging' | 'questions' | 'capture' | 'statusline' | 'logs' | 'config' | 'edits' | 'images' | 'narration' | 'commands' | 'provision' | 'liveness';
11
11
  /**
12
12
  * 采集集成的 user 档状态(tool-object-model §2.6 基石)。
13
13
  */
@@ -243,6 +243,11 @@ export interface ResumeCommandSpec {
243
243
  * 「在默认终端打开会话」消费;缺省 = 该 harness 不支持交互式打开(501)。
244
244
  */
245
245
  openArgs?(sessionId: string): string[];
246
+ /**
247
+ * 交互式启动的固定旗标(置于 openArgs 之前):只加在「终端里起交互会话」
248
+ * 这一侧(new-session / open-terminal),无头 `args` 不带。
249
+ */
250
+ launchArgs?: string[];
246
251
  /**
247
252
  * 编排边级提取的无头 fork 参数:从上游会话派生一个**一次性 fork 回合**提炼
248
253
  * 信息(`['--resume', sessionId, '--fork-session', '--no-session-persistence',
@@ -256,6 +261,13 @@ export interface ResumeCommandSpec {
256
261
  * 新会话(UI 置灰并说明)。缺省 = 不设闸。
257
262
  */
258
263
  minVersion?: string;
264
+ /**
265
+ * 起会话后的引导注入文本(weave new-session spawn 成功后延时打进 pane 并提交)。
266
+ * 使命:懒建会话档案的宿主(codex 的 rollout 首条消息才落盘)靠一条**零模型调用**
267
+ * 的本地命令(如 `/rename <项目名>`)强制建档,会话行即刻进列表。缺省 = 该
268
+ * harness 无需引导(claude 启动即发 SessionStart)。
269
+ */
270
+ bootstrapText?(projectName: string): string;
259
271
  }
260
272
  /** 消息通道名——支持矩阵与原因文案的键。 */
261
273
  export type MessagingChannel = 'discovery' | 'prompt' | 'inject' | 'headless' | 'watch' | 'sideQuestion' | 'pathRefs';
@@ -306,7 +318,8 @@ export interface AttachSpec {
306
318
  /**
307
319
  * 把「用户原文 + 已落盘附件」合成投递 prompt 文本。files 恒非空;text 可为空
308
320
  * (纯附件发送)。返回值走三条层投递,**用户原文不得被改写**(回执比对靠它做包含
309
- * 匹配)——只允许追加引用形态。
321
+ * 匹配)——只允许追加引用形态。原文里已含某附件路径(web 占位胶囊的原地展开)
322
+ * 时该附件不再追加;删掉胶囊路径即从原文消失,追加自动恢复。
310
323
  */
311
324
  composePrompt(text: string, files: readonly {
312
325
  path: string;
@@ -378,6 +391,38 @@ export interface SideQuestionSpec {
378
391
  * 普通子 agent 与 skill 子 agent 都有转录,skipTranscript 的 fork 才没有)。
379
392
  */
380
393
  answerOf(eventType: string, payload: unknown): string | null;
394
+ /**
395
+ * 读屏通道(codex = `/side`):宿主的侧边会话 ephemeral——零落盘、零 hook
396
+ * 事件,回答只能从 pane 屏幕取。声明了它,server 走「开面板 → 发问句 →
397
+ * 轮询读屏 → 关面板」的同步路径;缺省 = 事件认领路径(claude)。
398
+ */
399
+ screen?: SideQuestionScreenSpec;
400
+ /** 发起侧问的前置条件说明(不满足时 409 文案直用);缺省 = 无前置。 */
401
+ prerequisite?: string;
402
+ }
403
+ /** 读屏通道的 harness 侧文法(屏幕形态是版本耦合知识,判据全在这里)。 */
404
+ export interface SideQuestionScreenSpec {
405
+ /** 开侧边面板的键序(如 `/side` + 提交键)。 */
406
+ openKeys: string;
407
+ /** 提交键(实测 CR 单发比连体稳——TUI 启动/切换面板时常吃掉连体的 CR)。 */
408
+ submitKey: string;
409
+ /** 关面板键(codex = ctrl+c)。 */
410
+ closeKey: string;
411
+ /**
412
+ * 屏幕上有没有开着的侧边面板(收尾键序的前置闸:面板已被用户关掉时,
413
+ * closeKey 会落进主线程语境——忙时弹中断确认菜单、闲时直接退出 TUI,
414
+ * 盲打比不收尾糟得多)。
415
+ */
416
+ panelOpen(screen: string): boolean;
417
+ /**
418
+ * 从屏幕文本提取回答。`before` = 问句发出前的屏幕快照(区分新旧内容);
419
+ * `done` = 回合已落定(还在跑时 false,调用方继续轮询);`answer` = null 且
420
+ * done = 判不出(如实落 timeout,不猜——屏幕文法随宿主版本变)。
421
+ */
422
+ extractAnswer(question: string, before: string, now: string): {
423
+ answer: string | null;
424
+ done: boolean;
425
+ };
381
426
  }
382
427
  /** 信封渲染入参。 */
383
428
  export interface MessageMeta {
@@ -447,6 +492,12 @@ export interface PlanSpec {
447
492
  /** 这次工具调用带的计划内容;与计划无关返回 null。 */
448
493
  draftOf(toolName: string | null, toolInput: unknown, toolResponse: unknown): PlanDraft | null;
449
494
  }
495
+ /** 阻塞提问前模型写下的说明正文(转录里认)。 */
496
+ export interface PreQuestionText {
497
+ /** 该条 assistant 消息的时刻(ISO UTC,转录 timestamp)。 */
498
+ at: string;
499
+ text: string;
500
+ }
450
501
  /**
451
502
  * 阻塞式交互面(会话卡住等输入:AskUserQuestion / 计划确认 / 权限确认):
452
503
  * 哪些工具会挂起、权限通知类型、问题面归一化与作答键序全归 harness——
@@ -480,12 +531,25 @@ export interface BlockingPromptSpec {
480
531
  /** 阻塞工具的 PreToolUse toolInput → 问题列表(含合成问题:计划确认的 toolInput 恒空)。 */
481
532
  parseQuestions(toolName: string, toolInput: unknown): BlockingQuestion[];
482
533
  /**
483
- * 事件弹框(不是工具、也非权限提醒的对话框,如 claude 的「Switch model?」):
484
- * 事件到达且**对话框确实要弹**时返回问题面,否则 null。条件(弹不弹)是 harness
485
- * 知识——宿主自己有一套触发判据,猜错就成幽灵问题(面板有问、终端无框,键序
486
- * 会打进输入框)。落定沿用 permission 态口径(后续任何非 Notification 事件即了结)。
534
+ * 事件弹框(不是工具、也非权限提醒的对话框,如 claude 的「Switch model?」、
535
+ * codex 的审批框):事件到达且**对话框确实要弹**时返回问题面,否则 null。条件
536
+ * (弹不弹)是 harness 知识——宿主自己有一套触发判据,猜错就成幽灵问题(面板
537
+ * 有问、终端无框,键序会打进输入框)。落定沿用 permission 态口径(后续任何非
538
+ * Notification 事件即了结)。载荷 = 归一化视图(toolName/toolInput 已提升到
539
+ * 顶层;raw 里的同名键被 compactRaw 折叠成引用,读工具面必须走顶层)。
540
+ */
541
+ eventQuestion(eventType: string, payload: {
542
+ raw: unknown;
543
+ toolName: string | null;
544
+ toolInput: unknown;
545
+ }): BlockingQuestion | null;
546
+ /**
547
+ * 阻塞提问前模型写下的说明正文(转录尾部最后一条阻塞工具调用之前的 assistant
548
+ * 文本;claude 把一条 assistant 消息拆成相邻多行,正文与工具调用同 message.id)。
549
+ * 阻塞提问不发 Stop ⇒ hook 事件里没有这段话,转录是唯一来源。null = 没有
550
+ * (没在提问 / 提问前没写字)。
487
551
  */
488
- eventQuestion(eventType: string, raw: unknown): BlockingQuestion | null;
552
+ preQuestion?(transcriptPath: string | null): Promise<PreQuestionText | null>;
489
553
  }
490
554
  /**
491
555
  * 会话本地收件箱直投规格(层①-a,**harness 专属机制**:claude = inbox socket)。
@@ -522,6 +586,12 @@ export interface QueuedPromptSpec {
522
586
  /** 单次超时(毫秒)——队列是一次性小操作,挂住即当失败回落下一层。 */
523
587
  readonly timeoutMs?: number;
524
588
  }
589
+ /**
590
+ * 会话 pane 定位 env 的信源。hook 旁路上报的 env 生在会话自己的进程树里才可信
591
+ * (claude);hook 由宿主共享 daemon 代跑的 harness(codex)env 冻结在 daemon
592
+ * 启动地,系统性失真——改信 weave 起会话时的 spawn 回执起点(`launch`)。
593
+ */
594
+ export type PaneEnvSource = 'hook' | 'launch';
525
595
  /**
526
596
  * 会话消息能力面(session-orchestration 批 1):每 harness 一份声明式规格,
527
597
  * server 的 MessageDeliverer 按面裁决支持状态与编排控制;claude = 完整参考实现,
@@ -544,6 +614,8 @@ export interface MessagingSurface {
544
614
  readonly headless: ResumeCommandSpec | null;
545
615
  /** 空闲信号事件名(watch 触发源);空数组 = 不支持空闲订阅。 */
546
616
  readonly idleSignals: readonly string[];
617
+ /** 会话 pane 定位 env 的信源(hook 旁路上报 vs weave 起会话的 spawn 回执起点)。 */
618
+ readonly paneEnvSource: PaneEnvSource;
547
619
  /** 注入信封渲染(缺省 = server 的 weave 统一信封)。 */
548
620
  renderEnvelope?(text: string, meta: MessageMeta): string;
549
621
  /** 附件随 prompt 的对齐面;null = 该 harness 不收附件(web 据此置灰附件钮)。 */
@@ -807,10 +879,14 @@ export interface ConfigSurface {
807
879
  managedEntries(values: Record<string, unknown>): readonly ConfigManagedEntry[];
808
880
  /**
809
881
  * 模型列表(HTTP 调宿主自己的 API)。`baseUrl` / 凭据缺省时由实现从配置里取;
810
- * 传输在实现侧,server 只传语义参数。
882
+ * 传输在实现侧,server 只传语义参数。`homedir` 供实现解析配置里的相对路径
883
+ * (codex 的 `model_catalog_json` 相对 CODEX_HOME)。`file` 让实现知道当前
884
+ * 档位——项目档缺地址/凭据时可继承 user 档的 env(claude)。
811
885
  */
812
886
  models(input: {
813
887
  values: Record<string, unknown>;
888
+ file?: ConfigFileId;
889
+ homedir?: string;
814
890
  baseUrl?: string | null;
815
891
  apiKey?: string | null;
816
892
  authToken?: string | null;
@@ -882,6 +958,33 @@ export interface ImagesSurface {
882
958
  transcriptPath: string | null;
883
959
  }): Promise<PromptImageSet[] | null>;
884
960
  }
961
+ /** 转录里的一段 assistant 正文(时间序)。 */
962
+ export interface NarrationText {
963
+ /** 该条 assistant 消息的时刻(ISO UTC,转录 timestamp);宿主没带 → null。 */
964
+ at: string | null;
965
+ text: string;
966
+ }
967
+ /**
968
+ * 旁白采集面:模型在一轮里的**全部** assistant 正文(时间序)。hook 域只有
969
+ * Stop 的 `last_assistant_message` 一个文本载体——一轮里多次输出(写工具后又
970
+ * 补一段收尾)只有最后一句能进对话气泡,前面的没有任何事件照会,转录是唯一
971
+ * 来源。缺这个槽 = 该 harness 的中间输出无处可取(对话里只有每轮收尾那句)。
972
+ */
973
+ export interface NarrationSurface {
974
+ /** 全部 assistant 正文(时间序,含每轮收尾那句);读不到 → null(不猜)。 */
975
+ sessionNarration(req: {
976
+ sessionId: string;
977
+ /** 转录路径(server 的探针答,宿主不自己拼目录);null = 不知道在哪。 */
978
+ transcriptPath: string | null;
979
+ }): Promise<NarrationText[] | null>;
980
+ /**
981
+ * 行文法(增量监视用):喂一行转录原文,吐该行认出的段(0 或 1 段)。
982
+ * 与 `sessionNarration` 共用同一份文法——全量读是「逐行 feed」,增量监视是
983
+ * 「只 feed 新增字节切出的行」。缺省 = 该 harness 不支持增量监视(web 退回
984
+ * 轮边界补采)。
985
+ */
986
+ lineParser?(line: string): NarrationText | null;
987
+ }
885
988
  /**
886
989
  * 聊天窗口 `/` 提示里的一条命令:内建命令来自宿主(版本快照,随升级复核),
887
990
  * 其余按目录现扫(自定义命令 / skill / 插件 skill)。
@@ -920,6 +1023,52 @@ export interface CommandsSurface {
920
1023
  /** 转录里的命令执行(时间序);读不到(无转录 / 路径未知 / 半路出错)→ null(不猜)。 */
921
1024
  executions(transcriptPath: string | null): Promise<CommandExecution[] | null>;
922
1025
  }
1026
+ /**
1027
+ * 安装形态检查面(init 环境备置消费):答「这台机器上该 harness 的多副面孔是否
1028
+ * 互相打架」。有桌面端 + CLI 双形态的 harness(codex)在此声明冲突判据与修法;
1029
+ * 单形态 harness(claude)不补槽——没有冲突可言,调用方按槽缺席跳过。
1030
+ */
1031
+ export interface ProvisionCheck {
1032
+ /** 桌面端(GUI app)是否在本机。 */
1033
+ desktopApp: boolean;
1034
+ /** 共享后台(daemon 包)是否在本机。 */
1035
+ daemonPackage: boolean;
1036
+ /** 检出的冲突(英文原文,i18n 由调用方包一层)。 */
1037
+ warnings: readonly string[];
1038
+ /** 每条冲突对应的官方修法命令。 */
1039
+ hints: readonly string[];
1040
+ }
1041
+ export interface ProvisionSurface {
1042
+ readonly harness: Harness;
1043
+ check(bin: string): Promise<ProvisionCheck>;
1044
+ }
1045
+ /**
1046
+ * 会话存活面:答「这个 harness 的会话进程还活着吗」。判据是 harness 专属知识
1047
+ * (claude = `~/.claude/sessions/<pid>.json` 注册表 + kill 0;codex = thread-writer-locks
1048
+ * 独占锁),server 不自拼。探测是异步批量(codex 的锁探针要 spawn PowerShell),
1049
+ * 消费方要同步 map——由装配层缓存(见 server 的 liveness 装配助手)。
1050
+ */
1051
+ export interface LivenessSurface {
1052
+ readonly harness: Harness;
1053
+ /**
1054
+ * 批量探测给定会话的存活。只输出**判得动**的条目(判不动的会话不进 map,
1055
+ * 上游把「查不到」当未知,不许误判死);`ids` 缺省 = 全量。
1056
+ */
1057
+ alive(ids?: readonly string[]): Promise<Map<string, boolean>>;
1058
+ }
1059
+ /**
1060
+ * 会话标题读写面:宿主侧**用户自定义名**(codex = thread name,落 session_index
1061
+ * 与 sqlite threads.name)的读/写通道。读 = 宿主持久层 diff 采纳(TUI 改名反显
1062
+ * 前端);写 = 官方 RPC(thread/name/set,前端改名进宿主)。claude 不挂此槽——
1063
+ * 它的名字通道是 hook session_title 双向管线,不经这里。
1064
+ */
1065
+ export interface SessionTitleSurface {
1066
+ readonly harness: Harness;
1067
+ /** 宿主侧当前用户自定义名;无名/无文件返回 null(宿主清除名字时置空串 → null)。 */
1068
+ sessionTitleOf(sessionId: string): Promise<string | null>;
1069
+ /** 经官方通道写宿主侧名字;trim 后空串抛错,宿主拒绝/超时/协议不认识抛错。 */
1070
+ setSessionTitle(sessionId: string, name: string): Promise<void>;
1071
+ }
923
1072
  /** 单个 harness 的驱动:id/displayName 必填,能力槽按批次补齐。 */
924
1073
  export interface HarnessDriver {
925
1074
  id: Harness;
@@ -940,7 +1089,12 @@ export interface HarnessDriver {
940
1089
  config?: ConfigSurface;
941
1090
  edits?: EditsSurface;
942
1091
  images?: ImagesSurface;
1092
+ narration?: NarrationSurface;
943
1093
  commands?: CommandsSurface;
1094
+ provision?: ProvisionSurface;
1095
+ liveness?: LivenessSurface;
1096
+ /** 不入 capabilities 清单——无 web 面,消费点仅 server 两处(dispatcher diff 采纳 / PATCH rename RPC)。 */
1097
+ titles?: SessionTitleSurface;
944
1098
  }
945
1099
  /**
946
1100
  * 能力槽注册表:先到先得(同 id 重复注册抛错,对齐插件先加载者胜);
@@ -1 +1 @@
1
- export class HarnessRegistry{drivers=new Map;register(r){if(this.drivers.has(r.id))throw new Error(`harness driver already registered: ${r.id}`);this.drivers.set(r.id,r);let i=!1;return()=>{i||(i=!0,this.drivers.get(r.id)===r&&this.drivers.delete(r.id))}}get(r){return this.drivers.get(r)}all(){return[...this.drivers.values()]}byCapability(r){return this.all().filter(i=>i.capabilities.includes(r))}initFor(r){return this.drivers.get(r)?.init}unregister(r){return this.drivers.delete(r)}}export function supports(e,r){return e.capabilities.includes(r)}
1
+ export class HarnessRegistry{drivers=new Map;register(e){if(this.drivers.has(e.id))throw new Error(`harness driver already registered: ${e.id}`);this.drivers.set(e.id,e);let r=!1;return()=>{r||(r=!0,this.drivers.get(e.id)===e&&this.drivers.delete(e.id))}}get(e){return this.drivers.get(e)}all(){return[...this.drivers.values()]}byCapability(e){return this.all().filter(r=>r.capabilities.includes(e))}initFor(e){return this.drivers.get(e)?.init}unregister(e){return this.drivers.delete(e)}}export function supports(i,e){return i.capabilities.includes(e)}
@@ -2,6 +2,7 @@ export * from './driver.js';
2
2
  export * from './init/pipeline.js';
3
3
  export * from './init/generated.js';
4
4
  export * from './registry-wiring.js';
5
+ export * from './install.js';
5
6
  export * from './shared/file-specs.js';
6
7
  export * from './shared/install-link.js';
7
8
  export * from './shared/turn-output.js';
@@ -1 +1 @@
1
- export*from"./driver.js";export*from"./init/pipeline.js";export*from"./init/generated.js";export*from"./registry-wiring.js";export*from"./shared/file-specs.js";export*from"./shared/install-link.js";export*from"./shared/turn-output.js";export*from"./claude/index.js";export*from"./codex/index.js";
1
+ export*from"./driver.js";export*from"./init/pipeline.js";export*from"./init/generated.js";export*from"./registry-wiring.js";export*from"./install.js";export*from"./shared/file-specs.js";export*from"./shared/install-link.js";export*from"./shared/turn-output.js";export*from"./claude/index.js";export*from"./codex/index.js";