@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
@@ -1 +1 @@
1
- import{sendJson as e}from"./http.js";import{ToolkitError as h}from"../hooks/toolkit.js";export async function handleToolkitRoutes(n,o,r,a,f){if(!a.includes("/toolkit"))return!1;if(!r.toolkit)return e(o,503,{error:"Toolkit unavailable"}),!0;const l=t=>{if(t instanceof h){e(o,t.code==="not-found"?404:400,{error:t.message,code:t.code});return}e(o,400,{error:t instanceof Error?t.message:"Toolkit operation failed"})},u=a.match(/^\/projects\/(\d+)\/toolkit$/);if(u){if(n.method!=="GET")return e(o,405,{error:"Method not allowed"}),!0;try{e(o,200,await r.toolkit.list(Number(u[1])))}catch(t){l(t)}return!0}const i=a.match(/^\/projects\/(\d+)\/toolkit\/([^/]+)\/(enable|disable|uninstall)$/);if(i){if(n.method!=="POST")return e(o,405,{error:"Method not allowed"}),!0;const t=Number(i[1]),s=decodeURIComponent(i[2]),m=i[3],c=f.searchParams.get("source");try{const d=m==="enable"?await r.toolkit.enable(t,s,c??void 0):m==="disable"?await r.toolkit.disable(t,s,c??void 0):await r.toolkit.uninstall(t,s,c??void 0);r.dataBus?.emit({key:"toolkit"}),e(o,200,d)}catch(d){l(d)}return!0}const k=a.match(/^\/projects\/(\d+)\/toolkit\/legacy-copies\/cleanup$/);if(k){if(n.method!=="POST")return e(o,405,{error:"Method not allowed"}),!0;try{const t=await r.toolkit.cleanupLegacyCopies(Number(k[1]));r.dataBus?.emit({key:"toolkit"}),e(o,200,t)}catch(t){l(t)}return!0}return!1}
1
+ import{sendJson as e}from"./http.js";import{ToolkitError as h}from"../hooks/toolkit.js";export async function handleToolkitRoutes(a,o,r,i,m){if(!i.includes("/toolkit"))return!1;if(!r.toolkit)return e(o,503,{error:"Toolkit unavailable"}),!0;const l=t=>{if(t instanceof h){e(o,t.code==="not-found"?404:400,{error:t.message,code:t.code});return}e(o,400,{error:t instanceof Error?t.message:"Toolkit operation failed"})},s=i.match(/^\/projects\/(\d+)\/toolkit$/);if(s){if(a.method!=="GET")return e(o,405,{error:"Method not allowed"}),!0;try{e(o,200,await r.toolkit.list(Number(s[1])))}catch(t){l(t)}return!0}const n=i.match(/^\/projects\/(\d+)\/toolkit\/([^/]+)\/(enable|disable|uninstall)$/);if(n){if(a.method!=="POST")return e(o,405,{error:"Method not allowed"}),!0;const t=Number(n[1]),c=decodeURIComponent(n[2]),k=n[3],u=m.searchParams.get("source");try{const d=k==="enable"?await r.toolkit.enable(t,c,u??void 0):k==="disable"?await r.toolkit.disable(t,c,u??void 0):await r.toolkit.uninstall(t,c,u??void 0);r.dataBus?.emit({key:"toolkit"}),e(o,200,d)}catch(d){l(d)}return!0}const f=i.match(/^\/projects\/(\d+)\/toolkit\/legacy-copies\/cleanup$/);if(f){if(a.method!=="POST")return e(o,405,{error:"Method not allowed"}),!0;try{const t=await r.toolkit.cleanupLegacyCopies(Number(f[1]));r.dataBus?.emit({key:"toolkit"}),e(o,200,t)}catch(t){l(t)}return!0}return!1}
@@ -1 +1 @@
1
- import{randomUUID as p}from"node:crypto";import{open as o,mkdir as u,readFile as f,readdir as w,rm as c,stat as m,writeFile as l}from"node:fs/promises";import n from"node:path";import{getTmpDir as y}from"../db/paths.js";export const UPLOAD_SESSION_MAX_AGE_MS=1440*6e4;const d=/^[0-9a-f-]{36}$/;export class UploadSessions{dir;handles=new Map;constructor(e=n.join(y(),"uploads")){this.dir=e}part(e){return n.join(this.dir,`${e}.part`)}meta(e){return n.join(this.dir,`${e}.json`)}async begin(e){await u(this.dir,{recursive:!0});const t=p();await l(this.meta(t),JSON.stringify({name:e.name,mediaType:e.mediaType,size:e.size,received:0,dir:e.dir??null}),"utf8");const a=await o(this.part(t),"w");return await a.truncate(e.size),this.handles.set(t,a),{id:t,...e,received:0}}async get(e){if(!d.test(e))return null;try{const t=JSON.parse(await f(this.meta(e),"utf8"));if(typeof t.name!="string"||typeof t.mediaType!="string"||typeof t.size!="number")return null;const a=typeof t.received=="number"?t.received:(await m(this.part(e))).size;return{id:e,name:t.name,mediaType:t.mediaType,size:t.size,received:a,dir:typeof t.dir=="string"?t.dir:null}}catch{return null}}async append(e,t,a){const i=await this.get(e);if(!i)return{kind:"missing"};if(t!==i.received)return{kind:"conflict",received:i.received};if(i.received+a.length>i.size)return{kind:"overflow",received:i.received};let r=this.handles.get(e);r||(r=await o(this.part(e),"r+"),this.handles.set(e,r));const s=i.received+a.length;return await r.write(a,0,a.length,t),await r.truncate(s),await l(this.meta(e),JSON.stringify({name:i.name,mediaType:i.mediaType,size:i.size,received:s,dir:i.dir??null}),"utf8"),{kind:"ok",received:s}}async finish(e){const t=await this.get(e);return!t||t.received!==t.size?null:{name:t.name,mediaType:t.mediaType,file:this.part(e),size:t.size,dir:t.dir}}async abort(e){d.test(e)&&(await this.handles.get(e)?.close().catch(()=>{}),this.handles.delete(e),await c(this.part(e),{force:!0}),await c(this.meta(e),{force:!0}))}async sweep(e=UPLOAD_SESSION_MAX_AGE_MS,t=Date.now()){let a;try{a=await w(this.dir)}catch{return 0}let i=0;for(const r of a){if(!r.endsWith(".json"))continue;const s=r.slice(0,-5);if(d.test(s))try{const h=await m(this.meta(s));if(t-h.mtimeMs<e)continue;await this.abort(s),i++}catch{}}return i}}export const defaultUploadSessions=new UploadSessions;
1
+ import{randomUUID as u}from"node:crypto";import{open as o,mkdir as f,readFile as p,readdir as w,rm as d,stat as m,writeFile as l}from"node:fs/promises";import s from"node:path";import{getTmpDir as y}from"../db/paths.js";export const UPLOAD_SESSION_MAX_AGE_MS=1440*6e4;const c=/^[0-9a-f-]{36}$/;export class UploadSessions{dir;handles=new Map;constructor(e=s.join(y(),"uploads")){this.dir=e}part(e){return s.join(this.dir,`${e}.part`)}meta(e){return s.join(this.dir,`${e}.json`)}async begin(e){await f(this.dir,{recursive:!0});const t=u();await l(this.meta(t),JSON.stringify({name:e.name,mediaType:e.mediaType,size:e.size,received:0,dir:e.dir??null}),"utf8");const r=await o(this.part(t),"w");return await r.truncate(e.size),this.handles.set(t,r),{id:t,...e,received:0}}async get(e){if(!c.test(e))return null;try{const t=JSON.parse(await p(this.meta(e),"utf8"));if(typeof t.name!="string"||typeof t.mediaType!="string"||typeof t.size!="number")return null;const r=typeof t.received=="number"?t.received:(await m(this.part(e))).size;return{id:e,name:t.name,mediaType:t.mediaType,size:t.size,received:r,dir:typeof t.dir=="string"?t.dir:null}}catch{return null}}async append(e,t,r){const i=await this.get(e);if(!i)return{kind:"missing"};if(t!==i.received)return{kind:"conflict",received:i.received};if(i.received+r.length>i.size)return{kind:"overflow",received:i.received};let a=this.handles.get(e);a||(a=await o(this.part(e),"r+"),this.handles.set(e,a));const n=i.received+r.length;return await a.write(r,0,r.length,t),await a.truncate(n),await l(this.meta(e),JSON.stringify({name:i.name,mediaType:i.mediaType,size:i.size,received:n,dir:i.dir??null}),"utf8"),{kind:"ok",received:n}}async finish(e){const t=await this.get(e);return!t||t.received!==t.size?null:{name:t.name,mediaType:t.mediaType,file:this.part(e),size:t.size,dir:t.dir}}async abort(e){c.test(e)&&(await this.handles.get(e)?.close().catch(()=>{}),this.handles.delete(e),await d(this.part(e),{force:!0}),await d(this.meta(e),{force:!0}))}async sweep(e=UPLOAD_SESSION_MAX_AGE_MS,t=Date.now()){let r;try{r=await w(this.dir)}catch{return 0}let i=0;for(const a of r){if(!a.endsWith(".json"))continue;const n=a.slice(0,-5);if(c.test(n))try{const h=await m(this.meta(n));if(t-h.mtimeMs<e)continue;await this.abort(n),i++}catch{}}return i}}export const defaultUploadSessions=new UploadSessions;
@@ -1,4 +1,4 @@
1
- import{mkdirSync as t}from"node:fs";import N from"node:path";import{DatabaseSync as i}from"node:sqlite";import{getDbPath as o}from"./paths.js";import{projectKey as a}from"../repositories/projects.js";const L=`
1
+ import{mkdirSync as i}from"node:fs";import o from"node:path";import{DatabaseSync as n}from"node:sqlite";import{getDbPath as r}from"./paths.js";import{projectKey as a}from"../repositories/projects.js";const L=`
2
2
  CREATE TABLE IF NOT EXISTS projects (
3
3
  id INTEGER PRIMARY KEY AUTOINCREMENT,
4
4
  path TEXT NOT NULL UNIQUE,
@@ -23,6 +23,9 @@ CREATE TABLE IF NOT EXISTS hook_events (
23
23
  );
24
24
  CREATE INDEX IF NOT EXISTS idx_hook_events_project ON hook_events(project_id, created_at);
25
25
  CREATE INDEX IF NOT EXISTS idx_hook_events_session ON hook_events(session_id);
26
+ -- \u5168\u5C40\u641C\u7D22\uFF08GET /search\uFF09\u7684\u804A\u5929\u8BB0\u5F55\u8DEF\uFF1Aevent_type \u5148\u6536\u7A84\u5230\u5BF9\u8BDD\u7C7B\uFF08\u7EA6\u5360 2%\uFF09\uFF0C
27
+ -- \u518D\u5BF9 payload \u505A json_extract + LIKE\u2014\u2014\u6CA1\u6709\u8FD9\u628A\u7D22\u5F15\u5C31\u662F 20 \u4E07\u884C\u5168\u8868\u626B\u3002
28
+ CREATE INDEX IF NOT EXISTS idx_hook_events_type ON hook_events(event_type);
26
29
 
27
30
  CREATE TABLE IF NOT EXISTS libraries (
28
31
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -197,4 +200,4 @@ CREATE TABLE IF NOT EXISTS event_images (
197
200
  upload_id TEXT NOT NULL,
198
201
  PRIMARY KEY (event_id, upload_id)
199
202
  );
200
- `;export function openDatabase(E=o()){E!==":memory:"&&t(N.dirname(E),{recursive:!0});const u=new i(E);return u.exec("PRAGMA busy_timeout = 5000"),u.exec("PRAGMA journal_mode = WAL"),u.exec("PRAGMA foreign_keys = ON"),d(u),u.exec(L),u.exec("DROP TABLE IF EXISTS session_messages"),_(u),r(u),n(u),A(u),D(u),u}function n(E){const u=E.prepare("SELECT id, path FROM projects ORDER BY id").all(),T=new Set(u.map(F=>F.path)),s=E.prepare("UPDATE projects SET path = ? WHERE id = ?");for(const F of u){const e=a(F.path);e===F.path||T.has(e)||(T.delete(F.path),T.add(e),s.run(e,F.id))}}function A(E){const u=new Set(E.prepare("PRAGMA table_info(session_watches)").all().map(T=>String(T.name)));u.size!==0&&(u.has("on_events")||E.exec("ALTER TABLE session_watches ADD COLUMN on_events TEXT"),u.has("remaining")||(E.exec("ALTER TABLE session_watches ADD COLUMN remaining INTEGER"),E.exec("UPDATE session_watches SET remaining = 1")))}function r(E){const u=new Set(E.prepare("PRAGMA table_info(projects)").all().map(T=>String(T.name)));u.size!==0&&(u.has("sort_order")||E.exec("ALTER TABLE projects ADD COLUMN sort_order INTEGER"),u.has("archived_at")||E.exec("ALTER TABLE projects ADD COLUMN archived_at TEXT"))}function D(E){const u=new Set(E.prepare("PRAGMA table_info(uploads)").all().map(T=>String(T.name)));u.size!==0&&(u.has("dir")||E.exec("ALTER TABLE uploads ADD COLUMN dir TEXT"))}function d(E){const u=E.prepare("PRAGMA table_info(orchestrations)").all();u.length===0||u.some(T=>T.name==="enabled")||E.exec("DROP TABLE orchestrations")}function _(E){const u=new Set(E.prepare("PRAGMA table_info(hook_rules)").all().map(T=>String(T.name)));u.size!==0&&(u.has("origin")||E.exec("ALTER TABLE hook_rules ADD COLUMN origin TEXT NOT NULL DEFAULT 'user'"),u.has("plugin_id")||E.exec("ALTER TABLE hook_rules ADD COLUMN plugin_id TEXT"),E.exec("CREATE INDEX IF NOT EXISTS idx_hook_rules_plugin ON hook_rules(plugin_id)"))}
203
+ `;export function openDatabase(e=r()){e!==":memory:"&&i(o.dirname(e),{recursive:!0});const T=new n(e);return T.exec("PRAGMA busy_timeout = 5000"),T.exec("PRAGMA journal_mode = WAL"),T.exec("PRAGMA foreign_keys = ON"),c(T),T.exec(L),T.exec("DROP TABLE IF EXISTS session_messages"),R(T),O(T),_(T),d(T),A(T),T}function _(e){const T=e.prepare("SELECT id, path FROM projects ORDER BY id").all(),E=new Set(T.map(s=>s.path)),N=e.prepare("UPDATE projects SET path = ? WHERE id = ?");for(const s of T){const t=a(s.path);t===s.path||E.has(t)||(E.delete(s.path),E.add(t),N.run(t,s.id))}}function d(e){const T=new Set(e.prepare("PRAGMA table_info(session_watches)").all().map(E=>String(E.name)));T.size!==0&&(T.has("on_events")||e.exec("ALTER TABLE session_watches ADD COLUMN on_events TEXT"),T.has("remaining")||(e.exec("ALTER TABLE session_watches ADD COLUMN remaining INTEGER"),e.exec("UPDATE session_watches SET remaining = 1")))}function O(e){const T=new Set(e.prepare("PRAGMA table_info(projects)").all().map(E=>String(E.name)));T.size!==0&&(T.has("sort_order")||e.exec("ALTER TABLE projects ADD COLUMN sort_order INTEGER"),T.has("archived_at")||e.exec("ALTER TABLE projects ADD COLUMN archived_at TEXT"))}function A(e){const T=new Set(e.prepare("PRAGMA table_info(uploads)").all().map(E=>String(E.name)));T.size!==0&&(T.has("dir")||e.exec("ALTER TABLE uploads ADD COLUMN dir TEXT"))}function c(e){const T=e.prepare("PRAGMA table_info(orchestrations)").all();T.length===0||T.some(E=>E.name==="enabled")||e.exec("DROP TABLE orchestrations")}function R(e){const T=new Set(e.prepare("PRAGMA table_info(hook_rules)").all().map(E=>String(E.name)));T.size!==0&&(T.has("origin")||e.exec("ALTER TABLE hook_rules ADD COLUMN origin TEXT NOT NULL DEFAULT 'user'"),T.has("plugin_id")||e.exec("ALTER TABLE hook_rules ADD COLUMN plugin_id TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_hook_rules_plugin ON hook_rules(plugin_id)"))}
@@ -1 +1 @@
1
- import{existsSync as u,lstatSync as g,mkdirSync as p,readFileSync as S,readdirSync as f,renameSync as m,rmSync as b,symlinkSync as w}from"node:fs";import e from"node:path";import{dataRoots as y,getDataDir as l}from"./paths.js";const h={data:["market","uploads","plugins"],local:["auth.json","ai.json","push.json","initial-password","certs","weave-autostart.vbs"],cache:["logs","statusline","hooks","tmp","daemon.json"]},D="weave.db",j=["hooks","statusline"];export function liveDaemonPid(o=l()){const t=y(o);for(const i of[e.join(t.cache,"daemon.json"),e.join(o,"daemon.json")])try{const s=Number(JSON.parse(S(i,"utf-8")).pid);if(s>0&&x(s))return s}catch{}return null}function x(o){try{return process.kill(o,0),!0}catch{return!1}}function L(o){try{return g(o).isSymbolicLink()}catch{return!1}}function k(o,t){p(t,{recursive:!0});for(const i of f(o,{withFileTypes:!0})){const s=e.join(o,i.name),a=e.join(t,i.name);i.isDirectory()?k(s,a):u(a)||m(s,a)}b(o,{recursive:!0,force:!0})}export function ensureDataLayout(o=l()){const t=migrateDataLayout(o);return t.moved.length>0&&console.log(`[weave] data layout: moved ${t.moved.join(", ")}`),t.kept.length>0&&console.log(`[weave] data layout: kept ${t.kept.join(", ")} (target exists)`),t}export function migrateDataLayout(o=l()){const t={moved:[],kept:[],bridged:[],busyPid:null},i=liveDaemonPid(o);if(i!==null)return t.busyPid=i,t;let s;try{s=f(o)}catch{return t}const a=Object.keys(h),d=y(o);for(const n of s){if(L(e.join(o,n)))continue;const c=a.find(v=>h[v].includes(n))??(n.startsWith(D)?"data":null);if(!c)continue;const r=d[c];if(u(e.join(r,n))&&j.includes(n)){try{k(e.join(o,n),e.join(r,n)),t.moved.push(n)}catch{t.kept.push(n)}continue}if(u(e.join(r,n))){t.kept.push(n);continue}try{p(r,{recursive:!0}),m(e.join(o,n),e.join(r,n)),t.moved.push(n)}catch{t.kept.push(n)}}for(const n of j){const c=e.join(o,n),r=e.join(d.cache,n);if(!(!u(r)||u(c)))try{w(r,c,process.platform==="win32"?"junction":"dir"),t.bridged.push(n)}catch{}}return t}
1
+ import{existsSync as u,lstatSync as g,mkdirSync as f,readFileSync as S,readdirSync as p,renameSync as m,rmSync as b,symlinkSync as D}from"node:fs";import o from"node:path";import{dataRoots as y,getDataDir as l}from"./paths.js";const h={data:["market","uploads","plugins"],local:["auth.json","ai.json","push.json","initial-password","certs","weave-autostart.vbs"],cache:["logs","statusline","hooks","tmp","daemon.json"]},w="weave.db",j=["hooks","statusline"];export function liveDaemonPid(n=l()){const t=y(n);for(const i of[o.join(t.cache,"daemon.json"),o.join(n,"daemon.json")])try{const s=Number(JSON.parse(S(i,"utf-8")).pid);if(s>0&&x(s))return s}catch{}return null}function x(n){try{return process.kill(n,0),!0}catch{return!1}}function L(n){try{return g(n).isSymbolicLink()}catch{return!1}}function k(n,t){f(t,{recursive:!0});for(const i of p(n,{withFileTypes:!0})){const s=o.join(n,i.name),r=o.join(t,i.name);i.isDirectory()?k(s,r):u(r)||m(s,r)}b(n,{recursive:!0,force:!0})}export function ensureDataLayout(n=l()){const t=migrateDataLayout(n);return t.moved.length>0&&console.log(`[weave] data layout: moved ${t.moved.join(", ")}`),t.kept.length>0&&console.log(`[weave] data layout: kept ${t.kept.join(", ")} (target exists)`),t}export function migrateDataLayout(n=l()){const t={moved:[],kept:[],bridged:[],busyPid:null},i=liveDaemonPid(n);if(i!==null)return t.busyPid=i,t;let s;try{s=p(n)}catch{return t}const r=Object.keys(h),d=y(n);for(const e of s){if(L(o.join(n,e)))continue;const a=r.find(v=>h[v].includes(e))??(e.startsWith(w)?"data":null);if(!a)continue;const c=d[a];if(u(o.join(c,e))&&j.includes(e)){try{k(o.join(n,e),o.join(c,e)),t.moved.push(e)}catch{t.kept.push(e)}continue}if(u(o.join(c,e))){t.kept.push(e);continue}try{f(c,{recursive:!0}),m(o.join(n,e),o.join(c,e)),t.moved.push(e)}catch{t.kept.push(e)}}for(const e of j){const a=o.join(n,e),c=o.join(d.cache,e);if(!(!u(c)||u(a)))try{D(c,a,process.platform==="win32"?"junction":"dir"),t.bridged.push(e)}catch{}}return t}
@@ -1 +1 @@
1
- const l=" ";export function composeAnswerAtoms(i,p){if(i.every(o=>o.options.length===0))return{ok:!1,error:"Question face has no answerable options"};const u=new Map(p.map(o=>[o.questionKey,o]));for(const o of u.keys())if(!i.some(s=>s.key===o))return{ok:!1,error:`Unknown question: ${o}`};const n=[];for(const o of i){const s=u.get(o.key),t=(s?.options??[]).map(e=>o.options[e]);if(t.some(e=>!e))return{ok:!1,error:`Invalid option index: ${o.key}`};if(o.submit&&t.length!==1)return{ok:!1,error:"Submit choice required to finish the call"};const c=t.filter(e=>!e.input);if(!o.multiSelect&&c.length>1)return{ok:!1,error:`Single-select question got ${c.length} options: ${o.key}`};const f=s?.text?.trim()??"",r=t.find(e=>e.input);if(r&&!f)return{ok:!1,error:`Text required for this option: ${o.key}`};for(const e of t)n.push(...e.keys);if(r)n.push(...r.textFocus??[],f,...r.textTail??["\r"]);else for(const e of t)n.push(...e.commit??[]);if(o.submit||t.some(e=>e.chat))break;!r&&(o.multiSelect||t.length===0)&&n.push(" ")}return{ok:!0,atoms:n}}
1
+ const p=" ";export function composeAnswerAtoms(i,l){if(i.every(e=>e.options.length===0))return{ok:!1,error:"Question face has no answerable options"};const f=new Map(l.map(e=>[e.questionKey,e]));for(const e of f.keys())if(!i.some(s=>s.key===e))return{ok:!1,error:`Unknown question: ${e}`};const n=[];for(const e of i){const s=f.get(e.key),t=(s?.options??[]).map(o=>e.options[o]);if(t.some(o=>!o))return{ok:!1,error:`Invalid option index: ${e.key}`};if(e.submit&&t.length!==1)return{ok:!1,error:"Submit choice required to finish the call"};const c=t.filter(o=>!o.input);if(!e.multiSelect&&c.length>1)return{ok:!1,error:`Single-select question got ${c.length} options: ${e.key}`};const u=s?.text?.trim()??"",r=t.find(o=>o.input);if(r&&!u)return{ok:!1,error:`Text required for this option: ${e.key}`};for(const o of t)n.push(...o.keys);if(r)n.push(...r.textFocus??[],u,...r.textTail??["\r"]);else for(const o of t)n.push(...o.commit??[]);if(e.submit||t.some(o=>o.chat))break;!r&&(e.multiSelect||t.length===0)&&n.push(" ")}return{ok:!0,atoms:n}}
@@ -18,6 +18,8 @@ export type HookBusMessage = {
18
18
  id: string;
19
19
  status: string;
20
20
  }>;
21
+ /** raw.source(SessionStart 的 startup/resume/compact/clear——压缩收尾笔靠它认)。 */
22
+ rawSource?: string;
21
23
  at: string;
22
24
  } | {
23
25
  kind: 'rule.matched';
@@ -126,6 +128,14 @@ export type HookBusMessage = {
126
128
  sessionId: string;
127
129
  sideQuestionId: number;
128
130
  at: string;
131
+ } | {
132
+ kind: 'narration.updated';
133
+ sessionId: string;
134
+ segs: Array<{
135
+ at: string | null;
136
+ text: string;
137
+ }>;
138
+ at: string;
129
139
  } | {
130
140
  kind: 'dashboard.totals';
131
141
  at: string;
@@ -1 +1 @@
1
- import{EventEmitter as t}from"node:events";export class HookEventBus{emitter=new t;constructor(){this.emitter.setMaxListeners(100)}emit(e){this.emitter.emit("change",e)}subscribe(e){return this.emitter.on("change",e),()=>this.emitter.off("change",e)}}
1
+ import{EventEmitter as e}from"node:events";export class HookEventBus{emitter=new e;constructor(){this.emitter.setMaxListeners(100)}emit(t){this.emitter.emit("change",t)}subscribe(t){return this.emitter.on("change",t),()=>this.emitter.off("change",t)}}
@@ -1 +1 @@
1
- export const RATE_BUCKET_MS=1e4,RATE_RETAIN_MS=864e5;const h=6e4;export class DashboardRateCache{buckets=new Map;seeded=!1;lastPrune=0;events=0;today=0;dayKey="";get isSeeded(){return this.seeded}record(e=Date.now()){const t=Math.floor(e/1e4)*1e4;this.buckets.set(t,(this.buckets.get(t)??0)+1),this.events+=1;const s=new Date(e).toDateString();s!==this.dayKey&&(this.dayKey=s,this.today!==0&&(this.today=0)),this.today+=1,this.prune(e)}get totals(){return{events:this.events,today:this.today}}seedTotals(e,t){this.events=Math.max(this.events,e),this.today=Math.max(this.today,t),this.dayKey=new Date().toDateString()}recentBuckets(e,t=Date.now()){const s=Math.floor(t/1e4)*1e4-(e-1)*1e4;return Array.from({length:e},(o,n)=>{const a=s+n*1e4;return{at:new Date(a).toISOString().slice(0,19),n:this.buckets.get(a)??0}})}seed(e){const t=new Map;for(const{at:s,n:o}of e){const n=Date.parse(`${s}Z`);if(!Number.isFinite(n))continue;const a=Math.floor(n/1e4)*1e4;t.set(a,(t.get(a)??0)+o)}for(const[s,o]of t)this.buckets.set(s,Math.max(this.buckets.get(s)??0,o));this.seeded=!0}bucketsFor(e,t){return Array.from({length:t},(s,o)=>this.buckets.get(e+o*1e4)??0)}prune(e){if(e-this.lastPrune<6e4)return;this.lastPrune=e;const t=e-864e5;for(const s of this.buckets.keys())s<t&&this.buckets.delete(s)}}
1
+ export const RATE_BUCKET_MS=1e4,RATE_RETAIN_MS=864e5;const h=6e4;export class DashboardRateCache{buckets=new Map;seeded=!1;lastPrune=0;events=0;today=0;dayKey="";get isSeeded(){return this.seeded}record(t=Date.now()){const e=Math.floor(t/1e4)*1e4;this.buckets.set(e,(this.buckets.get(e)??0)+1),this.events+=1;const s=new Date(t).toDateString();s!==this.dayKey&&(this.dayKey=s,this.today!==0&&(this.today=0)),this.today+=1,this.prune(t)}get totals(){return{events:this.events,today:this.today}}seedTotals(t,e){this.events=Math.max(this.events,t),this.today=Math.max(this.today,e),this.dayKey=new Date().toDateString()}recentBuckets(t,e=Date.now()){const a=Math.floor(e/1e4)*1e4-(t-1)*1e4;return Array.from({length:t},(o,n)=>{const r=a+n*1e4;return{at:new Date(r).toISOString().slice(0,19),n:this.buckets.get(r)??0}})}seed(t){const e=new Map;for(const{at:s,n:a}of t){const o=Date.parse(`${s}Z`);if(!Number.isFinite(o))continue;const n=Math.floor(o/1e4)*1e4;e.set(n,(e.get(n)??0)+a)}for(const[s,a]of e)this.buckets.set(s,Math.max(this.buckets.get(s)??0,a));this.seeded=!0}bucketsFor(t,e){return Array.from({length:e},(s,a)=>this.buckets.get(t+a*1e4)??0)}prune(t){if(t-this.lastPrune<6e4)return;this.lastPrune=t;const e=t-864e5;for(const s of this.buckets.keys())s<e&&this.buckets.delete(s)}}
@@ -1 +1 @@
1
- const p=.7,y=.3,k=1e4;export function createDecisionConditionJudge(s){const r=(t,e)=>({...t,source:"decision-model",...e!==null?{detail:`P(yes)=${e}`}:{}}),c=t=>t>=.7?r({ok:!0},t):t<=.3?r({ok:!1,reason:"condition answered no"},t):{ok:!1};return{async judge(t){const e=t.upstream;if(!e)return{...await s.fallback.judge(t),source:"fork"};const i=await s.config();if(!i)return{...await s.fallback.judge(t),source:"fork"};let o=null;try{o=await m(i,t.condition,e,s)}catch{o=null}if(o===null)return{...await s.fallback.judge(t),source:"fork"};const n=c(o);return!n.ok&&n.source!=="decision-model"?{...await s.fallback.judge(t),source:"fork"}:n},async judgeBatch(t){if(!t.upstream)return Promise.all(t.items.map(async n=>({...await s.fallback.judge({sessionId:t.sessionId,condition:n.condition,upstream:null}),source:"fork"})));const e=await s.config();if(!e)return Promise.all(t.items.map(async n=>({...await s.fallback.judge({sessionId:t.sessionId,condition:n.condition,upstream:t.upstream}),source:"fork"})));const i={};for(const n of t.items)i[n.key]={type:"noul",instructions:n.condition};let o=null;try{o=await l(e,i,t.upstream,s)}catch{o=null}return o?Promise.all(t.items.map(async n=>{const a=o[n.key];return typeof a!="number"||!Number.isFinite(a)?{...await s.fallback.judge({sessionId:t.sessionId,condition:n.condition,upstream:t.upstream}),source:"fork"}:c(a)})):Promise.all(t.items.map(async n=>({...await this.judge({sessionId:t.sessionId,condition:n.condition,upstream:t.upstream})})))}}}async function m(s,r,c,t){return(await l(s,{proceed:{type:"noul",instructions:r}},c,t))?.proceed??null}async function l(s,r,c,t){const e=new AbortController,i=setTimeout(()=>e.abort(),t.timeoutMs??1e4);try{const o=await(t.fetchImpl??fetch)(`${s.baseUrl.replace(/\/+$/,"")}/v1/systemone`,{method:"POST",headers:{authorization:`Bearer ${s.apiKey}`,"content-type":"application/json"},body:JSON.stringify({model:s.model,state:c,questions:r}),signal:e.signal});if(!o.ok)return null;const n=(await o.json()).answers;if(!n||typeof n!="object")return null;const a={};for(const[d,f]of Object.entries(n)){const u=f?.noul;typeof u=="number"&&Number.isFinite(u)&&(a[d]=u)}return Object.keys(a).length>0?a:null}finally{clearTimeout(i)}}
1
+ const k=.7,w=.3,b=1e4;export function createDecisionConditionJudge(o){const i=(e,n)=>({...e,source:"decision-model",...n!==null?{detail:`P(yes)=${n}`}:{}}),c=e=>e>=.7?i({ok:!0},e):e<=.3?i({ok:!1,reason:"condition answered no"},e):{ok:!1};return{async judge(e){const n=e.upstream;if(!n)return{...await o.fallback.judge(e),source:"fork"};const r=await o.config();if(!r)return{...await o.fallback.judge(e),source:"fork"};let s=null;try{s=await y(r,e.condition,n,o)}catch{s=null}if(s===null)return{...await o.fallback.judge(e),source:"fork"};const t=c(s);return!t.ok&&t.source!=="decision-model"?{...await o.fallback.judge(e),source:"fork"}:t},async judgeBatch(e){if(!e.upstream)return Promise.all(e.items.map(async t=>({...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:null}),source:"fork"})));const n=await o.config();if(!n)return Promise.all(e.items.map(async t=>({...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream}),source:"fork"})));const r={};for(const t of e.items)r[t.key]={type:"noul",instructions:t.condition};let s=null;try{s=await f(n,r,e.upstream,o)}catch{s=null}return s?Promise.all(e.items.map(async t=>{const a=s[t.key];return typeof a!="number"||!Number.isFinite(a)?{...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream}),source:"fork"}:c(a)})):Promise.all(e.items.map(async t=>({...await this.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream})})))}}}async function y(o,i,c,e){return(await f(o,{proceed:{type:"noul",instructions:i}},c,e))?.proceed??null}async function f(o,i,c,e){const n=new AbortController,r=setTimeout(()=>n.abort(),e.timeoutMs??1e4);try{const s=await(e.fetchImpl??fetch)(`${o.baseUrl.replace(/\/+$/,"")}/v1/systemone`,{method:"POST",headers:{authorization:`Bearer ${o.apiKey}`,"content-type":"application/json"},body:JSON.stringify({model:o.model,state:c,questions:i}),signal:n.signal});if(!s.ok)return null;const a=(await s.json()).answers;if(!a||typeof a!="object")return null;const l={};for(const[m,d]of Object.entries(a)){const u=d?.noul;typeof u=="number"&&Number.isFinite(u)&&(l[m]=u)}return Object.keys(l).length>0?l:null}finally{clearTimeout(r)}}
@@ -72,8 +72,19 @@ export declare class AckGate {
72
72
  * 斜杠命令的回执收尾:给一个短窗口等 UPS——skill/插件命令会报,届时正常核销;
73
73
  * 窗口过期还没回执 = 宿主内建命令(`/compact` 之类压根不发 UPS),按已送达收、
74
74
  * 解闸续排,**不布防未回执闸**(否则压缩几分钟里整段显示「发送中」)。
75
+ * 翻牌要发帧:web 只靠 message.* 帧刷新投递行,静默翻牌 = 「已发出」挂到行消失。
75
76
  */
76
77
  armCommandAck(messageId: string, onRelease: (sessionId: string) => void): void;
78
+ /**
79
+ * 活动旁证翻牌:内建命令没有 UPS 回执,宿主受理命令后的任何 hook 事件
80
+ * (`/compact` → PreCompact…)都是「命令已执行」的证据——该会话还挂着
81
+ * 「已发出未回执」的命令行就及时翻牌(5s 短窗口只是兜底)。普通文本行有
82
+ * UPS 正路,不掺和(会话重启清空输入框那类「发了没进」要靠未回执闸说话)。
83
+ * 返回是否翻了牌(测试用)。
84
+ */
85
+ noteActivity(sessionId: string): boolean;
86
+ /** 翻牌收尾(armCommandAck / noteActivity 共用):标 acked + 撤防 + 帧。 */
87
+ private acknowledge_;
77
88
  /** 置闸:成因消息标记 stalled(常驻在途视图)+ message.stalled 帧(web 重拉)。 */
78
89
  stall(sessionId: string, msg: PipeMessage, reason: StallReason): void;
79
90
  /**
@@ -94,6 +105,8 @@ export declare class AckGate {
94
105
  * 核销多条在途(宿主把连发的几条合成一次提交);返回命中消息的随附图 id。
95
106
  * 比对规则:剥跨会话壳折叠空白后「包含」;短文本(< `ackMinText`)认**尾部相等**
96
107
  * (层② 往框里追加,框里先在的内容只会垫在前面);带图消息再去尽空白比一次。
108
+ * 占位内联的图片路径(web 胶囊原地展开)宿主会剥掉换成 `[Image #N]`——比对前
109
+ * 把 want 里的图片附件路径一并剥掉(与 web 对话面的 claims 同一条规则)。
97
110
  */
98
111
  acknowledge(sessionId: string, prompt: string, eventId: number | undefined, opts: {
99
112
  ackMinText: number;
@@ -107,3 +120,10 @@ export declare class AckGate {
107
120
  export declare function normalizePromptText(text: string): string;
108
121
  /** 带图消息的二次归一(粘贴处理器会把多行 chunk 用空串连起来):去尽空白再比。 */
109
122
  export declare function stripSpace(text: string): string;
123
+ /** 占位内联的图片路径从 want 里剥掉(宿主粘贴处理器把它们换成 `[Image #N]`,
124
+ * 回执原文里路径没了——不剥就永远比不中)。只剥**图片**附件的路径:文件路径
125
+ * 宿主不转记号、原样留在 UPS 里,剥了反而制造假命中。 */
126
+ export declare function dropInlineImagePaths(text: string, attachments: readonly {
127
+ path: string;
128
+ mediaType: string;
129
+ }[] | undefined): string;
@@ -1 +1 @@
1
- const u=r=>new Promise(e=>setTimeout(e,r));export class AckGate{store;times;events;constructor(e,t,s){this.store=e,this.times=t,this.events=s}open(e){const t=this.store.awaitingAck.get(e);if(t===void 0)return!0;const s=this.store.memory.get(t);return s&&s.acked!==!0&&s.status!=="failed"&&s.status!=="timeout"?!1:(this.store.awaitingAck.delete(e),!0)}awaiting(e){return!this.open(e)}headOf(e){return this.store.awaitingAck.get(e)}await(e,t){this.store.awaitingAck.set(e,t)}release(e,t){if(t===void 0){this.store.awaitingAck.delete(e);return}this.store.awaitingAck.get(e)===t&&this.store.awaitingAck.delete(e)}isStalled(e){return this.store.stalled.has(e)}stallCause(e){return this.store.stalled.get(e)}clearStall(e,t){const s=this.store.stalled.get(e);s&&(t===void 0||s.messageId===t)&&this.store.stalled.delete(e)}armAckWatch(e){setTimeout(()=>{const t=this.store.memory.get(e.id);!t||t.acked||t.status!=="delivered"||this.stall(e.sessionId,t,"unacked")},this.times.ackStallMs).unref?.()}armCommandAck(e,t){setTimeout(()=>{const s=this.store.memory.get(e);!s||s.acked||s.status!=="delivered"||(this.store.memory.set(e,{...s,acked:!0}),this.release(s.sessionId,e),t(s.sessionId))},this.times.commandAckGraceMs).unref?.()}stall(e,t,s){this.store.stalled.set(e,{messageId:t.id,reason:s});const a=this.store.memory.get(t.id),o=a&&a.status==="delivered"&&a.acked!==!0?new Date(Date.now()+this.times.ackStallReleaseMs).toISOString():null;a&&this.store.memory.set(t.id,{...a,stalled:!0,releaseAt:o}),this.events.emit({kind:"message.stalled",messageId:t.id,sessionId:e,reason:s,at:new Date().toISOString()}),setTimeout(()=>this.autoRelease(e,t.id),this.times.ackStallReleaseMs).unref?.()}autoRelease(e,t){if(this.store.stalled.get(e)?.messageId!==t)return;const s=this.store.memory.get(t);if(s&&s.status==="delivered"&&s.acked!==!0){this.dropAndRelease(e,t);return}this.store.stalled.delete(e),this.release(e,t),this.onAutoRelease?.(e)}dropAndRelease(e,t){this.store.memory.delete(t),this.store.stalled.delete(e),this.release(e,t),this.events.emit({kind:"message.dismissed",messageId:t,sessionId:e,at:new Date().toISOString()}),this.onAutoRelease?.(e)}onAutoRelease;hitLast=!1;acknowledge(e,t,s,a){const o=normalizePromptText(t),h=o.replace(/\[Image #\d+\]/gi,"").trim(),l=[];let d=!1;this.hitLast=!1;for(const i of[...this.store.memory.values()].reverse()){if(i.sessionId!==e||i.acked||i.mode!=="prompt")continue;const n=normalizePromptText(i.text),m=!!n&&(n.length>=a.ackMinText?o.includes(n):o.endsWith(n)),c=(i.attachments?.length??0)>0&&(n?stripSpace(o).includes(stripSpace(n)):h.length===0);!m&&!c||(d=!0,this.store.memory.set(i.id,{...i,acked:!0,stalled:!1,...s===void 0?{}:{ackedEventId:s}}),this.store.stalled.get(e)?.messageId===i.id&&this.store.stalled.delete(e),this.release(e,i.id),l.push(...i.attachments?.map(g=>g.id)??[]),this.events.emit({kind:"message.acknowledged",messageId:i.id,sessionId:e,at:new Date().toISOString()}))}return this.hitLast=d,d?l:[]}sessionExited(e){this.release(e)}static sleep=u}export function normalizePromptText(r){return r.replace(/<\/?cross-session-message[^>]*>/g,"").replace(/\s+/g," ").trim()}export function stripSpace(r){return r.replace(/\s+/g,"")}
1
+ import{isSlashCommand as f}from"../message-deliverer.js";import{isImageMediaType as k}from"../../repositories/uploads.js";const p=a=>new Promise(e=>setTimeout(e,a));export class AckGate{store;times;events;constructor(e,t,s){this.store=e,this.times=t,this.events=s}open(e){const t=this.store.awaitingAck.get(e);if(t===void 0)return!0;const s=this.store.memory.get(t);return s&&s.acked!==!0&&s.status!=="failed"&&s.status!=="timeout"?!1:(this.store.awaitingAck.delete(e),!0)}awaiting(e){return!this.open(e)}headOf(e){return this.store.awaitingAck.get(e)}await(e,t){this.store.awaitingAck.set(e,t)}release(e,t){if(t===void 0){this.store.awaitingAck.delete(e);return}this.store.awaitingAck.get(e)===t&&this.store.awaitingAck.delete(e)}isStalled(e){return this.store.stalled.has(e)}stallCause(e){return this.store.stalled.get(e)}clearStall(e,t){const s=this.store.stalled.get(e);s&&(t===void 0||s.messageId===t)&&this.store.stalled.delete(e)}armAckWatch(e){setTimeout(()=>{const s=this.store.memory.get(e.id);!s||s.acked||s.status!=="delivered"||this.stall(e.sessionId,s,"unacked")},this.times.ackStallMs).unref?.()}armCommandAck(e,t){setTimeout(()=>{const i=this.store.memory.get(e);!i||i.acked||i.status!=="delivered"||(this.acknowledge_(i.sessionId,e),t(i.sessionId))},this.times.commandAckGraceMs).unref?.()}noteActivity(e){let t=!1;for(const s of this.store.memory.values())s.sessionId!==e||s.acked||s.status!=="delivered"||s.mode!=="prompt"||!f(s.text)||(this.acknowledge_(e,s.id),t=!0);return t}acknowledge_(e,t){const s=this.store.memory.get(t);!s||s.acked||(this.store.memory.set(t,{...s,acked:!0}),this.release(e,t),this.events.emit({kind:"message.acknowledged",messageId:t,sessionId:e,at:new Date().toISOString()}))}stall(e,t,s){this.store.stalled.set(e,{messageId:t.id,reason:s});const i=this.store.memory.get(t.id),n=i&&i.status==="delivered"&&i.acked!==!0?new Date(Date.now()+this.times.ackStallReleaseMs).toISOString():null;i&&this.store.memory.set(t.id,{...i,stalled:!0,releaseAt:n}),this.events.emit({kind:"message.stalled",messageId:t.id,sessionId:e,reason:s,at:new Date().toISOString()}),setTimeout(()=>this.autoRelease(e,t.id),this.times.ackStallReleaseMs).unref?.()}autoRelease(e,t){if(this.store.stalled.get(e)?.messageId!==t)return;const s=this.store.memory.get(t);if(s&&s.status==="delivered"&&s.acked!==!0){this.dropAndRelease(e,t);return}this.store.stalled.delete(e),this.release(e,t),this.onAutoRelease?.(e)}dropAndRelease(e,t){this.store.memory.delete(t),this.store.stalled.delete(e),this.release(e,t),this.events.emit({kind:"message.dismissed",messageId:t,sessionId:e,at:new Date().toISOString()}),this.onAutoRelease?.(e)}onAutoRelease;hitLast=!1;acknowledge(e,t,s,i){const n=normalizePromptText(t),l=n.replace(/\[Image #\d+\]/gi,"").trim(),d=[];let c=!1;this.hitLast=!1;for(const r of[...this.store.memory.values()].reverse()){if(r.sessionId!==e||r.acked||r.mode!=="prompt")continue;const o=normalizePromptText(r.text),h=dropInlineImagePaths(o,r.attachments),u=!!o&&(o.length>=i.ackMinText?n.includes(o):n.endsWith(o)),m=(r.attachments?.length??0)>0&&(h?stripSpace(l).includes(stripSpace(h))||stripSpace(n).includes(stripSpace(o)):l.length===0);!u&&!m||(c=!0,this.store.memory.set(r.id,{...r,acked:!0,stalled:!1,...s===void 0?{}:{ackedEventId:s}}),this.store.stalled.get(e)?.messageId===r.id&&this.store.stalled.delete(e),this.release(e,r.id),d.push(...r.attachments?.map(g=>g.id)??[]),this.events.emit({kind:"message.acknowledged",messageId:r.id,sessionId:e,at:new Date().toISOString()}))}return this.hitLast=c,c?d:[]}sessionExited(e){this.release(e)}static sleep=p}export function normalizePromptText(a){return a.replace(/<\/?cross-session-message[^>]*>/g,"").replace(/\s+/g," ").trim()}export function stripSpace(a){return a.replace(/\s+/g,"")}export function dropInlineImagePaths(a,e){const t=(e??[]).filter(s=>s.path&&k(s.mediaType)).map(s=>s.path.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.length===0?a:a.replace(new RegExp(t.join("|"),"g"),"")}
@@ -1 +1 @@
1
- import{spawn as p}from"node:child_process";import{defaultKill as f}from"../headless-runner.js";import{tmpdir as l}from"node:os";import{isImageMediaType as w}from"../../repositories/uploads.js";export function wireTextOf(e,t){const o=e.attachments;return!o||o.length===0?e.text:t(e.sessionId)?.attach?.composePrompt(e.text,o)??e.text}export function hasImages(e){return(e.attachments??[]).some(t=>w(t.mediaType))}export function spawnOnce(e,t,o,r){const u=r??((a,n,s)=>p(a,[...n],s));return new Promise((a,n)=>{const s=u(e,t,{cwd:l(),windowsHide:!0,stdio:["ignore","pipe","pipe"]}),m=[];s.stdout?.on("data",i=>m.push(i)),s.stderr?.on("data",i=>m.push(i));const d=setTimeout(()=>{if(s.pid!==void 0)try{f(s.pid)}catch{}n(new Error(`queue timeout after ${o}ms`))},o);s.on("error",i=>{clearTimeout(d),n(i)}),s.on("exit",i=>{if(clearTimeout(d),i===0){a();return}const c=Buffer.concat(m).toString("utf8").slice(-500);n(new Error(`queue exit ${i}${c?`: ${c}`:""}`))})})}export function settleDelivered(e,t,o){const r={...t,status:"delivered",via:o,settledAt:new Date().toISOString()};return e.setMemory(r),e.awaitAck(t.sessionId,t.id),e.isSlashCommand(t.text)?e.armCommandAck(t.id):e.armAckWatch(r),e.emit({kind:"message.delivered",messageId:t.id,sessionId:t.sessionId,at:new Date().toISOString()}),r}
1
+ import{spawn as f}from"node:child_process";import{defaultKill as p}from"../headless-runner.js";import{tmpdir as l}from"node:os";import{isImageMediaType as w}from"../../repositories/uploads.js";export function wireTextOf(t,e){const i=t.attachments;return!i||i.length===0?t.text:e(t.sessionId)?.attach?.composePrompt(t.text,i)??t.text}export function hasImages(t){return(t.attachments??[]).some(e=>w(e.mediaType))}export function spawnOnce(t,e,i,s){const c=s??((a,n,o)=>f(a,[...n],o));return new Promise((a,n)=>{const o=c(t,e,{cwd:l(),windowsHide:!0,stdio:["ignore","pipe","pipe"]}),m=[];o.stdout?.on("data",r=>m.push(r)),o.stderr?.on("data",r=>m.push(r));const d=setTimeout(()=>{if(o.pid!==void 0)try{p(o.pid)}catch{}n(new Error(`queue timeout after ${i}ms`))},i);o.on("error",r=>{clearTimeout(d),n(r)}),o.on("exit",r=>{if(clearTimeout(d),r===0){a();return}const u=Buffer.concat(m).toString("utf8").slice(-500);n(new Error(`queue exit ${r}${u?`: ${u}`:""}`))})})}export function settleDelivered(t,e,i){const s={...e,status:"delivered",via:i,settledAt:new Date().toISOString()};return t.setMemory(s),t.awaitAck(e.sessionId,e.id),t.isSlashCommand(e.text)?t.armCommandAck(e.id):t.armAckWatch(s),t.emit({kind:"message.delivered",messageId:e.id,sessionId:e.sessionId,at:new Date().toISOString()}),s}
@@ -20,7 +20,13 @@ export declare const CTRL_C = "\u0003";
20
20
  export declare const MODEL_NAME: RegExp;
21
21
  export declare const modelCommand: (name: string) => string;
22
22
  export declare const effortCommand: (level: string) => string;
23
- /** 作答原子形态与原子间隔(宿主把连打的字符当粘贴/筛选输入,必须一次一个)。 */
23
+ /**
24
+ * 作答原子形态与原子间隔(宿主把连打的字符当粘贴/筛选输入,必须一次一个)。
25
+ * 字母原子 = 两家宿主模态框的**稳定快捷键**:`n`(claude 备注 / codex decline)、
26
+ * `y`/`d`(codex 审批 overlay 的 approve/deny,keymap 硬编码默认)——键序本身
27
+ * 仍由 harness 规格拼出,白名单只挡任意击键。`\x1b[Z` = shift+tab(plan 反馈行
28
+ * 的提交键;与下移 `\x1b[B` 同构,逐字符写 conhost 后 TUI 读到的就是这条字节流)。
29
+ */
24
30
  export declare const ANSWER_ATOM: RegExp;
25
31
  export declare const ANSWER_TEXT: RegExp;
26
32
  export declare const ANSWER_ATOM_GAP_MS = 120;
@@ -1 +1 @@
1
- import{HARNESS_SESSION_CONTROL as A,isHarness as f}from"@weavecode/core";import{normalizeDirKey as E}from"../../daemon/opener.js";export const ESC="\x1B",SHIFT_TAB="\x1B[Z",ENTER="\r",CTRL_C="",MODEL_NAME=/^[^\s\x00-\x1f\x7f]{1,128}$/,modelCommand=t=>`/model ${t}`,effortCommand=t=>`/effort ${t}`,ANSWER_ATOM=/^(?:[1-9]|n|\t|\r|\x1b\[B)$/,ANSWER_TEXT=/^[^\x00-\x1f\x7f]*$/,ANSWER_ATOM_GAP_MS=120,sleep=t=>new Promise(u=>setTimeout(u,t));export async function sessionKeysTarget(t,u,e="\u51FB\u952E",r="both"){const n=t.sessions.getBySessionId(u);if(!n)return{ok:!1,status:404,error:"Session not found"};if(n.projectId==null)return{ok:!1,status:400,error:"Session is not bound to a project"};const s=t.projects.getById(n.projectId);if(!s)return{ok:!1,status:404,error:"Project not found"};const i=t.terminalChannel();if(!i)return{ok:!1,status:409,error:`\u7EC8\u7AEF\u901A\u9053\u672A\u88C5\u914D\uFF0C\u65E0\u6CD5\u8FDC\u7A0B${e}`};const l=await t.terminalPaneFor(n,s,r);return l?{ok:!0,terminal:i,paneId:l.id}:{ok:!1,status:409,error:`\u627E\u4E0D\u5230\u4F1A\u8BDD\u6240\u5728\u7684\u7EC8\u7AEF\u7A97\u53E3\u2014\u2014\u8FD9\u4E2A\u4F1A\u8BDD\u6240\u5728\u7EC8\u7AEF\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7A0B${e}\u901A\u9053`}}export function effortLevelsOf(t,u){const e=t.listBySession(u,1),r=e[e.length-1]?.source;return f(r)?A[r]?.effortLevels??[]:[]}export function sideQuestionSurfaceOf(t,u,e){const r=t.listBySession(u,1),n=r[r.length-1]?.source;return f(n)?e?.(n)??null:null}export async function locateTerminalPane(t,u,e,r,n="both"){if(!t)return null;const s=n==="heuristic"?void 0:u.get(e.sessionId);if(s){const o=await t.locatePane?.(s).catch(()=>null);if(o)return{id:o}}if(!e.title)return null;const i=e.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,""),l=E(r.path,process.platform);let a;try{a=await t.listPanes()}catch{return null}const c=a.filter(o=>o.title!=null&&o.cwd!=null&&l!=null&&o.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,"")===i&&E(o.cwd,process.platform)===l);return c.length===1?c[0]:null}
1
+ import{HARNESS_SESSION_CONTROL as x,isHarness as f}from"@weavecode/core";import{normalizeDirKey as p}from"../../daemon/opener.js";export const ESC="\x1B",SHIFT_TAB="\x1B[Z",ENTER="\r",CTRL_C="",MODEL_NAME=/^[^\s\x00-\x1f\x7f]{1,128}$/,modelCommand=t=>`/model ${t}`,effortCommand=t=>`/effort ${t}`,ANSWER_ATOM=/^(?:[1-9]|y|n|d|\t|\r|\x1b\[B|\x1b\[Z)$/,ANSWER_TEXT=/^[^\x00-\x1f\x7f]*$/,ANSWER_ATOM_GAP_MS=120,sleep=t=>new Promise(o=>setTimeout(o,t));export async function sessionKeysTarget(t,o,e="\u51FB\u952E",r="both"){const n=t.sessions.getBySessionId(o);if(!n)return{ok:!1,status:404,error:"Session not found"};if(n.projectId==null)return{ok:!1,status:400,error:"Session is not bound to a project"};const l=t.projects.getById(n.projectId);if(!l)return{ok:!1,status:404,error:"Project not found"};const i=t.terminalChannel();if(!i)return{ok:!1,status:409,error:`\u7EC8\u7AEF\u901A\u9053\u672A\u88C5\u914D\uFF0C\u65E0\u6CD5\u8FDC\u7A0B${e}`};const c=await t.terminalPaneFor(n,l,r);return c?{ok:!0,terminal:i,paneId:c.id}:{ok:!1,status:409,error:`\u627E\u4E0D\u5230\u4F1A\u8BDD\u6240\u5728\u7684\u7EC8\u7AEF\u7A97\u53E3\u2014\u2014\u8FD9\u4E2A\u4F1A\u8BDD\u6240\u5728\u7EC8\u7AEF\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7A0B${e}\u901A\u9053`}}export function effortLevelsOf(t,o){const e=t.listBySession(o,1),r=e[e.length-1]?.source;return f(r)?x[r]?.effortLevels??[]:[]}export function sideQuestionSurfaceOf(t,o,e){const r=t.listBySession(o,1),n=r[r.length-1]?.source;return f(n)?e?.(n)??null:null}export async function locateTerminalPane(t,o,e,r,n="both"){if(!t)return null;const l=n==="heuristic"?void 0:o.get(e.sessionId);if(l){const s=await t.locatePane?.(l).catch(()=>null);if(s)return{id:s}}if(!e.title)return null;const i=e.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,""),c=p(r.path,process.platform);let a;try{a=await t.listPanes()}catch{return null}const u=a.filter(s=>s.title!=null&&s.cwd!=null&&c!=null&&s.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,"")===i&&p(s.cwd,process.platform)===c);return u.length===1?u[0]:null}
@@ -13,10 +13,10 @@ export declare const OFFLINE_ERROR = "Session is not running";
13
13
  /** 入队(promptbox 追加;会话索引由宿主登记)。 */
14
14
  export declare function appendQueueEntry(hooksDir: string, token: string, entry: PipeMessage): void;
15
15
  /**
16
- * 该会话是否已判死:claude 注册表 `pidAlive === false` 才认,`null` 不猜
17
- * (codex / 新会话豁免窗 / SessionStart 空壳行都落 null)。判据与「已终止」
18
- * 态、两条 terminated 补射同源(claude-liveness 的 pidAliveOf)——消息行与
19
- * 会话行不会各说各话。
16
+ * 该会话是否已判死:存活图 `pidAlive === false` 才认,`null` 不猜
17
+ * (codex 锁宽限窗 / 新会话豁免窗 / SessionStart 空壳行都落 null)。判据与
18
+ * 「已终止」态、两条 terminated 补射同源(claude-liveness 的 pidAliveOf)
19
+ * ——消息行与会话行不会各说各话。
20
20
  */
21
21
  export declare function sessionJudgedDead(sessions: Pick<SessionRepository, 'livenessRowOf'>, sessionId: string, liveness?: Map<string, boolean>): boolean;
22
22
  /**
@@ -1 +1 @@
1
- import{claudeLivenessById as c,pidAliveOf as f}from"../../daemon/claude-liveness.js";import{appendPromptbox as m,removePromptboxEntries as p}from"../promptbox.js";export const OFFLINE_ERROR="Session is not running";export function appendQueueEntry(n,s,e){m(n,s,[{id:e.id,sessionId:e.sessionId,text:e.text,oneWay:e.oneWay===!0,...e.forceTerminal===!0?{forceTerminal:!0}:{},...e.attachments&&e.attachments.length>0?{attachments:e.attachments}:{}}])}export function sessionJudgedDead(n,s,e=c()){const o=n.livenessRowOf(s);return o?f(o,e)===!1:!1}export function failOffline(n,s,e){const o=new Date().toISOString(),a={...e,status:"failed",reason:"offline",error:OFFLINE_ERROR,settledAt:o};return n.set(e.id,a),s({kind:"message.finished",messageId:e.id,sessionId:e.sessionId,status:"failed",at:o}),a}export function failQueuedOffline(n,s,e,o,a,i){const r=n.sessions.getBySessionId(a),d=r?.projectId==null?null:n.projects.getById(r.projectId);if(!(!d||i.length===0)){for(const t of i)failOffline(e,o,{id:t.id,sessionId:a,text:t.text,...t.attachments&&t.attachments.length>0?{attachments:t.attachments}:{},mode:"prompt",oneWay:t.oneWay===!0,channel:"prompt",status:"pending",at:t.at});p(s,d.token,new Set(i.map(t=>t.id)))}}
1
+ import{pidAliveOf as f}from"../../daemon/claude-liveness.js";import{combinedLivenessOf as c}from"../../daemon/liveness.js";import{appendPromptbox as m,removePromptboxEntries as p}from"../promptbox.js";export const OFFLINE_ERROR="Session is not running";export function appendQueueEntry(n,o,t){m(n,o,[{id:t.id,sessionId:t.sessionId,text:t.text,oneWay:t.oneWay===!0,...t.forceTerminal===!0?{forceTerminal:!0}:{},...t.attachments&&t.attachments.length>0?{attachments:t.attachments}:{}}])}export function sessionJudgedDead(n,o,t=c()){const s=n.livenessRowOf(o);return s?f(s,t)===!1:!1}export function failOffline(n,o,t){const s=new Date().toISOString(),i={...t,status:"failed",reason:"offline",error:OFFLINE_ERROR,settledAt:s};return n.set(t.id,i),o({kind:"message.finished",messageId:t.id,sessionId:t.sessionId,status:"failed",at:s}),i}export function failQueuedOffline(n,o,t,s,i,a){const r=n.sessions.getBySessionId(i),d=r?.projectId==null?null:n.projects.getById(r.projectId);if(!(!d||a.length===0)){for(const e of a)failOffline(t,s,{id:e.id,sessionId:i,text:e.text,...e.attachments&&e.attachments.length>0?{attachments:e.attachments}:{},mode:"prompt",oneWay:e.oneWay===!0,channel:"prompt",status:"pending",at:e.at});p(o,d.token,new Set(a.map(e=>e.id)))}}
@@ -1 +1 @@
1
- import{tmpdir as a}from"node:os";import{isSlashCommand as i}from"../message-deliverer.js";export function runRelay(e,r,n,s,o){try{return e.headless.run({sessionId:`prompt-relay:${r.sessionId}`,cwd:a(),prompt:n.instruction(s,o,{oneWay:r.oneWay===!0}),spec:{supported:!0,bin:n.bin,args:()=>[...n.args],promptStdin:!0},bin:e.bin??process.env.WEAVE_CLAUDE_BIN??n.bin,timeoutMs:e.relayTimeoutMs??0,detached:!1,onSettle:t=>settleRelay(e,r.id,t)})}catch(t){return settleRelay(e,r.id,{status:"failed",output:null,error:t instanceof Error?t.message:String(t)}),!0}}export function settleRelay(e,r,n){const s=e.getMemory(r);if(!s)return;if(n.status==="succeeded"){e.onReleased(s.sessionId);const t={...s,status:"delivered",settledAt:new Date().toISOString()};e.setMemory(t),i(s.text)?e.armCommandAck(r,e.onReleased):e.armAckWatch(t),e.emit({kind:"message.delivered",messageId:r,sessionId:s.sessionId,at:new Date().toISOString()});return}if(s.acked===!0){const t=new Date().toISOString();e.setMemory({...s,status:"delivered",settledAt:t}),e.emit({kind:"message.delivered",messageId:r,sessionId:s.sessionId,at:t});return}const o={...s,status:"failed",error:n.error??`prompt relay ${n.status}`,settledAt:new Date().toISOString()};e.setMemory(o),e.stall(s.sessionId,o,"failed"),e.emit({kind:"message.finished",messageId:r,sessionId:s.sessionId,status:"failed",at:new Date().toISOString()})}export{a as tmpdir};
1
+ import{tmpdir as o}from"node:os";import{isSlashCommand as a}from"../message-deliverer.js";export function runRelay(t,s,i,e,n){try{return t.headless.run({sessionId:`prompt-relay:${s.sessionId}`,cwd:o(),prompt:i.instruction(e,n,{oneWay:s.oneWay===!0}),spec:{supported:!0,bin:i.bin,args:()=>[...i.args],promptStdin:!0},bin:t.bin??process.env.WEAVE_CLAUDE_BIN??i.bin,timeoutMs:t.relayTimeoutMs??0,detached:!1,onSettle:r=>settleRelay(t,s.id,r)})}catch(r){return settleRelay(t,s.id,{status:"failed",output:null,error:r instanceof Error?r.message:String(r)}),!0}}export function settleRelay(t,s,i){const e=t.getMemory(s);if(!e)return;if(i.status==="succeeded"){t.onReleased(e.sessionId);const r={...e,status:"delivered",settledAt:new Date().toISOString()};t.setMemory(r),a(e.text)?t.armCommandAck(s,t.onReleased):t.armAckWatch(r),t.emit({kind:"message.delivered",messageId:s,sessionId:e.sessionId,at:new Date().toISOString()});return}if(e.acked===!0){const r=new Date().toISOString();t.setMemory({...e,status:"delivered",settledAt:r}),t.emit({kind:"message.delivered",messageId:s,sessionId:e.sessionId,at:r});return}const n={...e,status:"failed",error:i.error??`prompt relay ${i.status}`,settledAt:new Date().toISOString()};t.setMemory(n),t.stall(e.sessionId,n,"failed"),t.emit({kind:"message.finished",messageId:s,sessionId:e.sessionId,status:"failed",at:new Date().toISOString()})}export{o as tmpdir};
@@ -1,3 +1,3 @@
1
- import{appendOutbox as p}from"../mirror.js";export function resolveChannel(e,s,n,o,t){if(n==="prompt")return t.prompt||t.queuedPrompt||s()?"prompt":{reason:t.unsupportedReasons?.prompt??`Harness "${t.harness}" has no native prompt channel and the configured terminal cannot inject text`};if(n==="inject"||n==="headless")return(n==="inject"?t.inject:t.headless)?n:{reason:unsupportedReason(t,n)};const i=e.turnOpenOf(o)?"inject":"headless";return(i==="inject"?t.inject:t.headless)?i:{reason:unsupportedReason(t,i)}}export function unsupportedReason(e,s){return e.unsupportedReasons?.[s]??`Harness "${e.harness}" does not support the ${s} messaging channel`}export function renderEnvelope(e,s,n){return n.renderEnvelope?.(e,s)??`[weave message] from=${s.fromLabel} at=${s.at} mode=${s.mode}
1
+ import{appendOutbox as m}from"../mirror.js";export function resolveChannel(e,t,s,o,n){if(s==="prompt")return n.prompt||n.queuedPrompt||t()?"prompt":{reason:n.unsupportedReasons?.prompt??`Harness "${n.harness}" has no native prompt channel and the configured terminal cannot inject text`};if(s==="inject"||s==="headless")return(s==="inject"?n.inject:n.headless)?s:{reason:unsupportedReason(n,s)};const i=e.turnOpenOf(o)?"inject":"headless";return(i==="inject"?n.inject:n.headless)?i:{reason:unsupportedReason(n,i)}}export function unsupportedReason(e,t){return e.unsupportedReasons?.[t]??`Harness "${e.harness}" does not support the ${t} messaging channel`}export function renderEnvelope(e,t,s){return s.renderEnvelope?.(e,t)??`[weave message] from=${t.fromLabel} at=${t.at} mode=${t.mode}
2
2
 
3
- ${e}`}export function deliverInject(e,s,n,o,t,i){const d=renderEnvelope(i,o,t);p(e.hooksDir,n,[{sessionId:s.sessionId,text:d}]);const r={...s,status:"injected",settledAt:new Date().toISOString()};return e.memory.set(r.id,r),e.bus.emit({kind:"message.delivered",messageId:r.id,sessionId:s.sessionId,at:new Date().toISOString()}),{ok:!0,messageId:r.id,status:"injected",message:r}}export function deliverHeadless(e,s,n,o,t,i){const d=t.headless,r={...s,status:"running"};e.memory.set(r.id,r);const u={settled:!1};try{e.headless.run({sessionId:r.sessionId,cwd:n,prompt:renderEnvelope(i,o,t),spec:d,bin:e.bin??process.env.WEAVE_CLAUDE_BIN??d.bin,timeoutMs:e.timeoutMs,onSettle:a=>m(e,r,u,a)})||m(e,r,u,{status:"failed",output:null,error:"Session already has a running run"})}catch(a){m(e,r,u,{status:"failed",output:null,error:a instanceof Error?a.message:String(a)})}return{ok:!0,messageId:r.id,status:"running",message:e.memory.get(r.id)}}function m(e,s,n,o){if(n.settled)return;n.settled=!0;const t=e.memory.get(s.id);if(t)try{e.memory.set(s.id,{...t,status:o.status,output:o.output,error:o.error,settledAt:new Date().toISOString()}),e.bus.emit({kind:"message.finished",messageId:s.id,sessionId:s.sessionId,status:o.status,at:new Date().toISOString()})}catch{}}
3
+ ${e}`}export function deliverInject(e,t,s,o,n,a){const i=renderEnvelope(a,o,n);m(e.hooksDir,s,[{sessionId:t.sessionId,text:i}]);const r={...t,status:"injected",settledAt:new Date().toISOString()};return e.memory.set(r.id,r),e.bus.emit({kind:"message.delivered",messageId:r.id,sessionId:t.sessionId,at:new Date().toISOString()}),{ok:!0,messageId:r.id,status:"injected",message:r}}export function deliverHeadless(e,t,s,o,n,a){const i=n.headless,r={...t,status:"running"};e.memory.set(r.id,r);const u={settled:!1};try{e.headless.run({sessionId:r.sessionId,cwd:s,prompt:renderEnvelope(a,o,n),spec:i,bin:e.bin??process.env.WEAVE_CLAUDE_BIN??i.bin,timeoutMs:e.timeoutMs,onSettle:l=>p(e,r,u,l)})||p(e,r,u,{status:"failed",output:null,error:"Session already has a running run"})}catch(d){p(e,r,u,{status:"failed",output:null,error:d instanceof Error?d.message:String(d)})}return{ok:!0,messageId:r.id,status:"running",message:e.memory.get(r.id)}}function p(e,t,s,o){if(s.settled)return;s.settled=!0;const n=e.memory.get(t.id);if(n)try{e.memory.set(t.id,{...n,status:o.status,output:o.output,error:o.error,settledAt:new Date().toISOString()}),e.bus.emit({kind:"message.finished",messageId:t.id,sessionId:t.sessionId,status:o.status,at:new Date().toISOString()})}catch{}}
@@ -26,4 +26,6 @@ export declare function sessionTerminals(deps: {
26
26
  livenessOf?: () => Map<string, boolean>;
27
27
  }, terminal: {
28
28
  locateScreens?(envs: Record<string, Record<string, string>>): Promise<Record<string, SessionTerminal | null>>;
29
- } | null, paneEnvs: Map<string, Record<string, string>>, persistPaneEnvs: () => void): Promise<Record<string, SessionTerminal | null>>;
29
+ } | null, paneEnvs: Map<string, Record<string, string>>, persistPaneEnvs: () => void,
30
+ /** 定位已被撤销的会话(会话退出):显式回 null 摘出分组,报完即焚。 */
31
+ revoked?: Set<string>): Promise<Record<string, SessionTerminal | null>>;
@@ -1 +1 @@
1
- import{claudeLivenessById as d}from"../../daemon/claude-liveness.js";import{readAllPromptbox as l,readPromptbox as f}from"../promptbox.js";import{sessionJudgedDead as p}from"./queue.js";function m(n,s){return{id:s.id,sessionId:n,text:s.text,...s.attachments&&s.attachments.length>0?{attachments:s.attachments}:{},mode:"prompt",oneWay:s.oneWay===!0,...s.forceTerminal===!0?{forceTerminal:!0}:{},channel:"prompt",status:"pending",at:s.at}}export function listVisible(n,s,o,a,e){const c=Date.now(),i=[],r=n.sessions.getBySessionId(a);if(r?.projectId!=null){const t=n.projects.getById(r.projectId);if(t)for(const u of f(s,t.token))u.sessionId===a&&i.push(m(a,u))}for(const t of o.values()){if(t.sessionId!==a)continue;if(t.stalled===!0||t.status==="delivering"||t.status==="running"){i.push(t);continue}if(t.status==="failed"||t.status==="timeout"){i.push(t);continue}const u=t.settledAt?Date.parse(t.settledAt):NaN;(t.status==="delivered"&&t.acked!==!0||!Number.isNaN(u)&&c-u<e)&&i.push(t)}return i.sort((t,u)=>t.at<u.at?-1:1)}export function listInflightCounts(n,s){const o=new Map,a=e=>{o.set(e,(o.get(e)??0)+1)};for(const e of l(n))a(e.sessionId);for(const e of s.values())(e.status==="delivering"||e.status==="running")&&a(e.sessionId);return o}export async function sessionTerminals(n,s,o,a){if(!s?.locateScreens||o.size===0)return{};const e={},c={},i=n.livenessOf?.()??d();for(const[r,t]of o){if(p(n.sessions,r,i)){o.delete(r),a(),c[r]=null;continue}e[r]=t}return{...c,...await s.locateScreens(e)}}
1
+ import{combinedLivenessOf as f}from"../../daemon/liveness.js";import{readAllPromptbox as l,readPromptbox as d}from"../promptbox.js";import{sessionJudgedDead as m}from"./queue.js";function p(n,s){return{id:s.id,sessionId:n,text:s.text,...s.attachments&&s.attachments.length>0?{attachments:s.attachments}:{},mode:"prompt",oneWay:s.oneWay===!0,...s.forceTerminal===!0?{forceTerminal:!0}:{},channel:"prompt",status:"pending",at:s.at}}export function listVisible(n,s,o,i,e){const r=Date.now(),u=[],a=n.sessions.getBySessionId(i);if(a?.projectId!=null){const t=n.projects.getById(a.projectId);if(t)for(const c of d(s,t.token))c.sessionId===i&&u.push(p(i,c))}for(const t of o.values()){if(t.sessionId!==i)continue;if(t.stalled===!0||t.status==="delivering"||t.status==="running"){u.push(t);continue}if(t.status==="failed"||t.status==="timeout"){u.push(t);continue}const c=t.settledAt?Date.parse(t.settledAt):NaN;(t.status==="delivered"&&t.acked!==!0||!Number.isNaN(c)&&r-c<e)&&u.push(t)}return u.sort((t,c)=>t.at<c.at?-1:1)}export function listInflightCounts(n,s){const o=new Map,i=e=>{o.set(e,(o.get(e)??0)+1)};for(const e of l(n))i(e.sessionId);for(const e of s.values())(e.status==="delivering"||e.status==="running")&&i(e.sessionId);return o}export async function sessionTerminals(n,s,o,i,e){const r={};if(e&&e.size>0){for(const t of e)r[t]=null;e.clear()}if(!s?.locateScreens||o.size===0)return r;const u={},a=n.livenessOf?.()??f();for(const[t,c]of o){if(m(n.sessions,t,a)){o.delete(t),i(),r[t]=null;continue}u[t]=c}return{...r,...await s.locateScreens(u)}}
@@ -71,6 +71,11 @@ export declare class HookDispatcher {
71
71
  sessionId: string;
72
72
  prompt: string;
73
73
  }) => Promise<string | null>;
74
+ /**
75
+ * 宿主侧用户自定义名(titles 面;装配侧按会话 harness 分派,claude 无此
76
+ * 通道恒 null)。读方向 diff 采纳:TUI 改名后下一次 hook 事件反显前端。
77
+ */
78
+ sessionTitleOf?: (sessionId: string) => Promise<string | null>;
74
79
  });
75
80
  onIngest(ctx: IngestContext): Promise<IngestOutcome>;
76
81
  /** 入池 + 广播 dispatch.created(inject/manual/webhook/plugin 四路共用的建池路径)。 */
@@ -1,11 +1,11 @@
1
- import{INJECTABLE_EVENTS as b,TITLE_EFFECTIVE_EVENTS as S,hookSourceHarness as w}from"@weavecode/core";import{createPluginLogger as P}from"./plugin-loader.js";import{readHooksEnabled as k}from"../daemon/settings.js";import{effective as v,pluginsStateOf as j}from"./plugin-project-state.js";import{postJson as D,runWebhook as T}from"./handlers/webhook.js";import{DISPATCH_MARKER as g,extractFilePath as h,isCrossProjectPath as W,matchesAnyGlob as C,projectLabel as E,renderTemplate as A,templateVars as O}from"./match.js";function $(c){if(!c)return null;const t=c.match(/\{[\s\S]*\}/);if(t)try{const i=JSON.parse(t[0]);if(typeof i.label=="string"&&i.label.trim())return i.label.trim()}catch{}const s=/label\s*[:=]\s*"?([A-Za-z0-9_-]+)/i.exec(c);return s?s[1]:null}const y=6e4,N=10*6e4,x=4,H=4,L=3e3;export class HookDispatcher{deps;runningWebhooks=new Set;lastClassifyAt=new Map;recentPool=new Map;activeWebhooks=0;pendingWebhooks=[];activePlugins=0;pendingPlugins=[];constructor(t){this.deps=t}async onIngest(t){try{if(!k())return{};this.deps.plugins?.notifyEvent?.(t.payload.eventType,t.payload,t.sessionId);const s={};if(t.sessionId){const e=_(t.payload);e!==null&&this.deps.sessions.applyReportedTitle(t.sessionId,e)&&this.deps.bus.emit({kind:"session.renamed",sessionId:t.sessionId,title:e,at:new Date().toISOString()});const n=this.deps.sessions.getBySessionId(t.sessionId)?.pendingTitle;if(n){s.sessionTitle=n;const r=S[t.source].includes(t.payload.eventType);(t.deliveredTitle===n&&r||e!==null)&&this.deps.sessions.confirmPendingTitle(t.sessionId,n)&&this.deps.bus.emit({kind:"session.renamed",sessionId:t.sessionId,title:n,at:new Date().toISOString()})}}const i=this.match(t);if(i.length===0)return s;const a=[],o=[],d=Date.now(),l=d+L;for(const e of i)if(this.deps.bus.emit({kind:"rule.matched",ruleId:e.id,eventId:t.eventId,sessionId:t.sessionId,at:new Date(d).toISOString()}),e.handler.type!=="log"){if(e.handler.type==="manual"||e.handler.type==="inject"){if(this.dedupe(e,t,d))continue;const n=A(e.handler.template,O({event:t.payload.eventType,tool:t.payload.toolName,filePath:h(t.payload.toolInput),cwd:t.payload.cwd,session:t.sessionId,project:E(t.project.path),rule:e.name}))+`
2
- ${g}`,r=e.handler.type==="inject"?"injected":"pending";this.createDispatch(e,t,{prompt:n,status:r,mode:e.handler.type==="inject"?"auto":"manual"}),e.handler.type==="inject"&&(e.filter.crossProjectOnly?o.push(n):a.push(n));continue}if(e.handler.type==="webhook"){if(this.runningWebhooks.has(e.id))continue;this.runningWebhooks.add(e.id);const n=this.createDispatch(e,t,{prompt:`webhook ${e.handler.url}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:e.id,dispatchId:n.id,sessionId:t.sessionId,at:new Date().toISOString()}),this.runWebhookAsync(e,this.summary(e,t),n.id);continue}if(e.handler.type==="classify"){const n=this.turnText(t);if(!n)continue;const r=e.handler,p=n.toLowerCase();if(r.prefilter&&r.prefilter.length>0&&!r.prefilter.some(m=>p.includes(m.toLowerCase())))continue;const u=`classify:${e.id}`,f=r.cooldownMs??N;if(d-(this.lastClassifyAt.get(u)??0)<f||this.runningWebhooks.has(u))continue;this.lastClassifyAt.set(u,d),this.runningWebhooks.add(u);const I=this.createDispatch(e,t,{prompt:`classify \u2192 ${r.routes.map(m=>m.label).join("/")}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:e.id,dispatchId:I.id,sessionId:t.sessionId,at:new Date().toISOString()}),this.runClassifyAsync(e,t,I.id,n);continue}if(e.handler.type==="plugin"){const n=this.deps.plugins;if(!n)continue;const r=n.getHandler(e.handler.pluginId,e.handler.handlerType);if(!r||this.dedupe(e,t,d))continue;if(!this.injectable(t)){this.runPluginDetached(e,t,n,r);continue}const p=l-Date.now();if(p<=0)continue;const u=await this.runPluginHandler(e,t,n,r,p);if(!u)continue;u.prompt&&this.createDispatch(e,t,{prompt:u.prompt+`
3
- ${g}`,status:"pending",mode:"auto"}),u.additionalContext&&o.push(u.additionalContext)}}return(a.length>0||o.length>0)&&(s.additionalContext=[...a,...o].join(`
1
+ import{INJECTABLE_EVENTS as b,TITLE_EFFECTIVE_EVENTS as S,hookSourceHarness as w}from"@weavecode/core";import{createPluginLogger as P}from"./plugin-loader.js";import{readHooksEnabled as k}from"../daemon/settings.js";import{effective as v,pluginsStateOf as T}from"./plugin-project-state.js";import{postJson as D,runWebhook as j}from"./handlers/webhook.js";import{DISPATCH_MARKER as g,extractFilePath as c,isCrossProjectPath as W,matchesAnyGlob as C,projectLabel as O,renderTemplate as _,templateVars as E}from"./match.js";function N(h){if(!h)return null;const e=h.match(/\{[\s\S]*\}/);if(e)try{const n=JSON.parse(e[0]);if(typeof n.label=="string"&&n.label.trim())return n.label.trim()}catch{}const s=/label\s*[:=]\s*"?([A-Za-z0-9_-]+)/i.exec(h);return s?s[1]:null}const I=6e4,A=10*6e4,$=4,L=4,M=3e3;export class HookDispatcher{deps;runningWebhooks=new Set;lastClassifyAt=new Map;recentPool=new Map;activeWebhooks=0;pendingWebhooks=[];activePlugins=0;pendingPlugins=[];constructor(e){this.deps=e}async onIngest(e){try{if(!k())return{};this.deps.plugins?.notifyEvent?.(e.payload.eventType,e.payload,e.sessionId);const s={};if(e.sessionId){const t=H(e.payload);let i=null;if(t===null&&this.deps.sessionTitleOf)try{i=await this.deps.sessionTitleOf(e.sessionId)}catch{}const r=t??i;r!==null&&this.deps.sessions.applyReportedTitle(e.sessionId,r)&&this.deps.bus.emit({kind:"session.renamed",sessionId:e.sessionId,title:r,at:new Date().toISOString()});const d=this.deps.sessions.getBySessionId(e.sessionId)?.pendingTitle;if(d){s.sessionTitle=d;const p=S[e.source].includes(e.payload.eventType);(e.deliveredTitle===d&&p||t!==null)&&this.deps.sessions.confirmPendingTitle(e.sessionId,d)&&this.deps.bus.emit({kind:"session.renamed",sessionId:e.sessionId,title:d,at:new Date().toISOString()})}}const n=this.match(e);if(n.length===0)return s;const a=[],o=[],l=Date.now(),u=l+M;for(const t of n)if(this.deps.bus.emit({kind:"rule.matched",ruleId:t.id,eventId:e.eventId,sessionId:e.sessionId,at:new Date(l).toISOString()}),t.handler.type!=="log"){if(t.handler.type==="manual"||t.handler.type==="inject"){if(this.dedupe(t,e,l))continue;const i=_(t.handler.template,E({event:e.payload.eventType,tool:e.payload.toolName,filePath:c(e.payload.toolInput),cwd:e.payload.cwd,session:e.sessionId,project:O(e.project.path),rule:t.name}))+`
2
+ ${g}`,r=t.handler.type==="inject"?"injected":"pending";this.createDispatch(t,e,{prompt:i,status:r,mode:t.handler.type==="inject"?"auto":"manual"}),t.handler.type==="inject"&&(t.filter.crossProjectOnly?o.push(i):a.push(i));continue}if(t.handler.type==="webhook"){if(this.runningWebhooks.has(t.id))continue;this.runningWebhooks.add(t.id);const i=this.createDispatch(t,e,{prompt:`webhook ${t.handler.url}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:t.id,dispatchId:i.id,sessionId:e.sessionId,at:new Date().toISOString()}),this.runWebhookAsync(t,this.summary(t,e),i.id);continue}if(t.handler.type==="classify"){const i=this.turnText(e);if(!i)continue;const r=t.handler,d=i.toLowerCase();if(r.prefilter&&r.prefilter.length>0&&!r.prefilter.some(m=>d.includes(m.toLowerCase())))continue;const p=`classify:${t.id}`,f=r.cooldownMs??A;if(l-(this.lastClassifyAt.get(p)??0)<f||this.runningWebhooks.has(p))continue;this.lastClassifyAt.set(p,l),this.runningWebhooks.add(p);const y=this.createDispatch(t,e,{prompt:`classify \u2192 ${r.routes.map(m=>m.label).join("/")}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:t.id,dispatchId:y.id,sessionId:e.sessionId,at:new Date().toISOString()}),this.runClassifyAsync(t,e,y.id,i);continue}if(t.handler.type==="plugin"){const i=this.deps.plugins;if(!i)continue;const r=i.getHandler(t.handler.pluginId,t.handler.handlerType);if(!r||this.dedupe(t,e,l))continue;if(!this.injectable(e)){this.runPluginDetached(t,e,i,r);continue}const d=u-Date.now();if(d<=0)continue;const p=await this.runPluginHandler(t,e,i,r,d);if(!p)continue;p.prompt&&this.createDispatch(t,e,{prompt:p.prompt+`
3
+ ${g}`,status:"pending",mode:"auto"}),p.additionalContext&&o.push(p.additionalContext)}}return(a.length>0||o.length>0)&&(s.additionalContext=[...a,...o].join(`
4
4
 
5
5
  `)),o.length>0&&(s.deferred=o.join(`
6
6
 
7
- `)),s}catch{return{}}}createDispatch(t,s,i){const a=this.deps.dispatches.insert({ruleId:t.id,eventId:s.eventId,sessionId:s.sessionId,...i});return this.deps.bus.emit({kind:"dispatch.created",ruleId:t.id,dispatchId:a.id,status:i.status,mode:a.mode,sessionId:s.sessionId,at:a.startedAt}),a}dedupe(t,s,i){const a=`${t.id}:${s.sessionId??""}`,o=this.recentPool.get(a);return o!==void 0&&i-o<y?!0:(this.recentPool.set(a,i),this.trimDedupe(i),!1)}match(t){const s=this.deps.pluginStates,i=s?j(t.project.meta).enabled:null;let a=null;return this.deps.registry.candidates(t.payload.eventType,s?{includeDisabled:!0}:void 0).filter(o=>{const d=w(o.source);if(d!==null&&d!=="any"&&d!==t.source||o.projectId!==null&&o.projectId!==t.project.id)return!1;if(o.pluginId!==null){if(!o.enabled&&i?.[o.pluginId]!==!0||s&&!v(t.project,o.pluginId,{states:s}))return!1}else if(!o.enabled)return!1;const l=o.filter;if(l.toolNames?.length&&(!t.payload.toolName||!l.toolNames.includes(t.payload.toolName)))return!1;if(l.pathGlobs?.length){const e=h(t.payload.toolInput);if(!e||!C(e,l.pathGlobs))return!1}if(l.crossProjectOnly){const e=h(t.payload.toolInput)??t.payload.cwd;if(!e||(a??=this.deps.projects.list().map(n=>n.path).filter(n=>n!==t.project.path),!W(e,t.project.path,a)))return!1}return!0})}injectable(t){const s=t.payload.eventType;return s!==null&&b[t.source].includes(s)}async runPluginHandler(t,s,i,a,o){if(t.handler.type!=="plugin")return;const{pluginId:d}=t.handler,l=P(d),e=o===void 0?t.timeoutMs:Math.min(t.timeoutMs,o);let n;try{const r=(async()=>{await this.acquirePluginSlot();try{return await a.execute({event:s.payload,rule:t,config:i.getConfig(d),logger:l})}finally{this.releasePluginSlot()}})(),p=await Promise.race([r,new Promise((u,f)=>{n=setTimeout(()=>f(new Error("plugin handler timeout")),e)})]);return p&&typeof p=="object"?p:void 0}catch{return}finally{n&&clearTimeout(n)}}async runPluginDetached(t,s,i,a){try{const o=await this.runPluginHandler(t,s,i,a);if(!o?.prompt)return;this.createDispatch(t,s,{prompt:o.prompt+`
8
- ${g}`,status:"pending",mode:"auto"})}catch{}}summary(t,s){return{ruleId:t.id,ruleName:t.name,projectId:s.project.id,sessionId:s.sessionId,event:s.payload.eventType,toolName:s.payload.toolName,filePath:h(s.payload.toolInput),cwd:s.payload.cwd,at:new Date().toISOString()}}turnText(t){const s=t.payload.raw?.last_assistant_message;return typeof s=="string"?s.trim():""}async runClassifyAsync(t,s,i,a){const o=t.handler;if(o.type!=="classify")return;const d=`classify:${t.id}`;try{const l=await this.deps.classify?.({sessionId:s.sessionId??"",prompt:`${o.prompt}
7
+ `)),s}catch{return{}}}createDispatch(e,s,n){const a=this.deps.dispatches.insert({ruleId:e.id,eventId:s.eventId,sessionId:s.sessionId,...n});return this.deps.bus.emit({kind:"dispatch.created",ruleId:e.id,dispatchId:a.id,status:n.status,mode:a.mode,sessionId:s.sessionId,at:a.startedAt}),a}dedupe(e,s,n){const a=`${e.id}:${s.sessionId??""}`,o=this.recentPool.get(a);return o!==void 0&&n-o<I?!0:(this.recentPool.set(a,n),this.trimDedupe(n),!1)}match(e){const s=this.deps.pluginStates,n=s?T(e.project.meta).enabled:null;let a=null;return this.deps.registry.candidates(e.payload.eventType,s?{includeDisabled:!0}:void 0).filter(o=>{const l=w(o.source);if(l!==null&&l!=="any"&&l!==e.source||o.projectId!==null&&o.projectId!==e.project.id)return!1;if(o.pluginId!==null){if(!o.enabled&&n?.[o.pluginId]!==!0||s&&!v(e.project,o.pluginId,{states:s}))return!1}else if(!o.enabled)return!1;const u=o.filter;if(u.toolNames?.length&&(!e.payload.toolName||!u.toolNames.includes(e.payload.toolName)))return!1;if(u.pathGlobs?.length){const t=c(e.payload.toolInput);if(!t||!C(t,u.pathGlobs))return!1}if(u.crossProjectOnly){const t=c(e.payload.toolInput)??e.payload.cwd;if(!t||(a??=this.deps.projects.list().map(i=>i.path).filter(i=>i!==e.project.path),!W(t,e.project.path,a)))return!1}return!0})}injectable(e){const s=e.payload.eventType;return s!==null&&b[e.source].includes(s)}async runPluginHandler(e,s,n,a,o){if(e.handler.type!=="plugin")return;const{pluginId:l}=e.handler,u=P(l),t=o===void 0?e.timeoutMs:Math.min(e.timeoutMs,o);let i;try{const r=(async()=>{await this.acquirePluginSlot();try{return await a.execute({event:s.payload,rule:e,config:n.getConfig(l),logger:u})}finally{this.releasePluginSlot()}})(),d=await Promise.race([r,new Promise((p,f)=>{i=setTimeout(()=>f(new Error("plugin handler timeout")),t)})]);return d&&typeof d=="object"?d:void 0}catch{return}finally{i&&clearTimeout(i)}}async runPluginDetached(e,s,n,a){try{const o=await this.runPluginHandler(e,s,n,a);if(!o?.prompt)return;this.createDispatch(e,s,{prompt:o.prompt+`
8
+ ${g}`,status:"pending",mode:"auto"})}catch{}}summary(e,s){return{ruleId:e.id,ruleName:e.name,projectId:s.project.id,sessionId:s.sessionId,event:s.payload.eventType,toolName:s.payload.toolName,filePath:c(s.payload.toolInput),cwd:s.payload.cwd,at:new Date().toISOString()}}turnText(e){const n=e.payload.raw?.last_assistant_message;return typeof n=="string"?n.trim():""}async runClassifyAsync(e,s,n,a){const o=e.handler;if(o.type!=="classify")return;const l=`classify:${e.id}`;try{const u=await this.deps.classify?.({sessionId:s.sessionId??"",prompt:`${o.prompt}
9
9
 
10
10
  \u672C\u8F6E\u6700\u7EC8\u8F93\u51FA\uFF1A
11
- ${a.slice(0,8e3)}`}),e=$(l),n=e?o.routes.find(p=>p.label.toLowerCase()===e.toLowerCase()):void 0;if(!n){this.deps.dispatches.updateStatus(i,{status:"succeeded",output:e?`label=${e} (no route)`:"no label",finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:"succeeded",sessionId:s.sessionId,at:new Date().toISOString()});return}const r=await D(n.url,n.secret,{...this.summary(t,s),label:e,verdict:l?.slice(0,500)},this.deps.fetchImpl);this.deps.dispatches.updateStatus(i,{status:r.status,output:`label=${e} ${r.output??""}`.trim(),error:r.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:r.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(l){this.deps.dispatches.updateStatus(i,{status:"failed",error:String(l),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(d)}}async runWebhookAsync(t,s,i){await this.acquireWebhookSlot();try{const a=await T(t,s,this.deps.fetchImpl);this.deps.dispatches.updateStatus(i,{status:a.status,output:a.output??null,error:a.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:a.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(a){this.deps.dispatches.updateStatus(i,{status:"failed",error:String(a),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(t.id),this.releaseWebhookSlot()}}acquireWebhookSlot(){return this.activeWebhooks<x?(this.activeWebhooks++,Promise.resolve()):new Promise(t=>{this.pendingWebhooks.push(()=>{this.activeWebhooks++,t()})})}releaseWebhookSlot(){this.activeWebhooks--;const t=this.pendingWebhooks.shift();t&&t()}acquirePluginSlot(){return this.activePlugins<H?(this.activePlugins++,Promise.resolve()):new Promise(t=>{this.pendingPlugins.push(()=>{this.activePlugins++,t()})})}releasePluginSlot(){this.activePlugins--;const t=this.pendingPlugins.shift();t&&t()}trimDedupe(t){if(!(this.recentPool.size<1e3))for(const[s,i]of this.recentPool)t-i>=y&&this.recentPool.delete(s)}}function _(c){const t=c.raw;if(typeof t!="object"||t===null)return null;const s=t.session_title;return typeof s=="string"&&s.length>0?s:null}
11
+ ${a.slice(0,8e3)}`}),t=N(u),i=t?o.routes.find(d=>d.label.toLowerCase()===t.toLowerCase()):void 0;if(!i){this.deps.dispatches.updateStatus(n,{status:"succeeded",output:t?`label=${t} (no route)`:"no label",finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:"succeeded",sessionId:s.sessionId,at:new Date().toISOString()});return}const r=await D(i.url,i.secret,{...this.summary(e,s),label:t,verdict:u?.slice(0,500)},this.deps.fetchImpl);this.deps.dispatches.updateStatus(n,{status:r.status,output:`label=${t} ${r.output??""}`.trim(),error:r.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:r.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(u){this.deps.dispatches.updateStatus(n,{status:"failed",error:String(u),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(l)}}async runWebhookAsync(e,s,n){await this.acquireWebhookSlot();try{const a=await j(e,s,this.deps.fetchImpl);this.deps.dispatches.updateStatus(n,{status:a.status,output:a.output??null,error:a.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:a.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(a){this.deps.dispatches.updateStatus(n,{status:"failed",error:String(a),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(e.id),this.releaseWebhookSlot()}}acquireWebhookSlot(){return this.activeWebhooks<$?(this.activeWebhooks++,Promise.resolve()):new Promise(e=>{this.pendingWebhooks.push(()=>{this.activeWebhooks++,e()})})}releaseWebhookSlot(){this.activeWebhooks--;const e=this.pendingWebhooks.shift();e&&e()}acquirePluginSlot(){return this.activePlugins<L?(this.activePlugins++,Promise.resolve()):new Promise(e=>{this.pendingPlugins.push(()=>{this.activePlugins++,e()})})}releasePluginSlot(){this.activePlugins--;const e=this.pendingPlugins.shift();e&&e()}trimDedupe(e){if(!(this.recentPool.size<1e3))for(const[s,n]of this.recentPool)e-n>=I&&this.recentPool.delete(s)}}function H(h){const e=h.raw;if(typeof e!="object"||e===null)return null;const s=e.session_title;return typeof s=="string"&&s.length>0?s:null}
@@ -1 +1 @@
1
- import{isSyntheticSession as f,registerSyntheticSession as S,syntheticSessionIds as g}from"./synthetic-sessions.js";const y=8e3;export function createEdgeExtract(s){const d=s.concurrency??4;let o=0;return{supports(t){const r=s.harnessOf(t);return r?s.surfaceFor(r).headless?.extractArgs!=null:!1},run({sessionId:t,prompt:r}){if(o>=d)return Promise.resolve(null);const i=s.harnessOf(t),c=s.sessions.getBySessionId(t);if(!i||!c?.projectId)return Promise.resolve(null);const u=s.projects.getById(c.projectId),n=s.surfaceFor(i).headless,l=process.env.WEAVE_CLAUDE_BIN??n?.bin;if(!u||!n?.extractArgs||!l)return Promise.resolve(null);const h=S();return s.onSyntheticChange(),o++,new Promise(m=>{let a=!1;const p=e=>{a||(a=!0,o--,m(e))};s.headless.run({sessionId:h,cwd:u.path,prompt:r,spec:n,bin:l,argsOf:e=>n.extractArgs(t,e),timeoutMs:s.timeoutMs??12e4,onSettle:e=>{p(e.status==="succeeded"&&e.output?.trim()?e.output.trim().slice(0,y):null)}})||p(null)})}}}export{f as isSyntheticSession,g as syntheticSessionIds};
1
+ import{isSyntheticSession as g,registerSyntheticSession as d,syntheticSessionIds as x}from"./synthetic-sessions.js";const y=8e3;export function createEdgeExtract(t){const h=t.concurrency??4;let o=0;return{supports(s){const r=t.harnessOf(s);return r?t.surfaceFor(r).headless?.extractArgs!=null:!1},run({sessionId:s,prompt:r}){if(o>=h)return Promise.resolve(null);const c=t.harnessOf(s),i=t.sessions.getBySessionId(s);if(!c||!i?.projectId)return Promise.resolve(null);const u=t.projects.getById(i.projectId),n=t.surfaceFor(c).headless,a=process.env.WEAVE_CLAUDE_BIN??n?.bin;if(!u||!n?.extractArgs||!a)return Promise.resolve(null);const m=d();return t.onSyntheticChange(),o++,new Promise(S=>{let l=!1;const f=e=>{l||(l=!0,o--,S(e))};t.headless.run({sessionId:m,cwd:u.path,prompt:r,spec:n,bin:a,argsOf:e=>n.extractArgs(s,e),timeoutMs:t.timeoutMs??12e4,onSettle:e=>{f(e.status==="succeeded"&&e.output?.trim()?e.output.trim().slice(0,y):null)}})||f(null)})}}}export{g as isSyntheticSession,x as syntheticSessionIds};
@@ -1 +1 @@
1
- import{createHmac as l}from"node:crypto";const c=5e3,d=4096;export async function postJson(o,s,n,e=fetch){let r;try{r=new URL(o)}catch{return{ok:!1,status:"failed",error:`invalid url: ${o}`}}if(r.protocol!=="http:"&&r.protocol!=="https:")return{ok:!1,status:"failed",error:`unsupported protocol: ${r.protocol}`};const u=JSON.stringify(n),i={"content-type":"application/json","user-agent":"weave-daemon"};s&&(i["x-weave-signature"]=`sha256=${l("sha256",s).update(u).digest("hex")}`);try{const t=await e(r,{method:"POST",headers:i,body:u,signal:AbortSignal.timeout(c)}),a=(await t.text()).slice(0,d);return t.ok?{ok:!0,status:"succeeded",output:a||`HTTP ${t.status}`}:{ok:!1,status:"failed",error:`HTTP ${t.status}`,output:a}}catch(t){const a=t instanceof Error&&(t.name==="TimeoutError"||t.name==="AbortError");return{ok:!1,status:a?"timeout":"failed",error:a?`webhook timed out after ${c}ms`:String(t)}}}export async function runWebhook(o,s,n=fetch){const e=o.handler;return e.type!=="webhook"?{ok:!1,status:"failed",error:`rule ${o.id} is not a webhook handler`}:postJson(e.url,e.secret,s,n)}
1
+ import{createHmac as l}from"node:crypto";const c=5e3,f=4096;export async function postJson(e,s,n,o=fetch){let r;try{r=new URL(e)}catch{return{ok:!1,status:"failed",error:`invalid url: ${e}`}}if(r.protocol!=="http:"&&r.protocol!=="https:")return{ok:!1,status:"failed",error:`unsupported protocol: ${r.protocol}`};const u=JSON.stringify(n),i={"content-type":"application/json","user-agent":"weave-daemon"};s&&(i["x-weave-signature"]=`sha256=${l("sha256",s).update(u).digest("hex")}`);try{const t=await o(r,{method:"POST",headers:i,body:u,signal:AbortSignal.timeout(c)}),a=(await t.text()).slice(0,f);return t.ok?{ok:!0,status:"succeeded",output:a||`HTTP ${t.status}`}:{ok:!1,status:"failed",error:`HTTP ${t.status}`,output:a}}catch(t){const a=t instanceof Error&&(t.name==="TimeoutError"||t.name==="AbortError");return{ok:!1,status:a?"timeout":"failed",error:a?`webhook timed out after ${c}ms`:String(t)}}}export async function runWebhook(e,s,n=fetch){const o=e.handler;return o.type!=="webhook"?{ok:!1,status:"failed",error:`rule ${e.id} is not a webhook handler`}:postJson(o.url,o.secret,s,n)}
@@ -1,2 +1,2 @@
1
- import{spawn as k}from"node:child_process";const L=3e5,y=32*1024,E=2e3;export class HeadlessRunner{spawnImpl;killImpl;active=new Set;livePids=new Map;constructor(t={}){this.spawnImpl=t.spawnImpl??k,this.killImpl=t.killImpl??defaultKill}isBusy(t){return this.active.has(t)}killAll(){let t=0;for(const e of this.livePids.values())try{this.killImpl(e),t++}catch{}return this.livePids.clear(),t}run(t){if(this.active.has(t.sessionId))return!1;this.active.add(t.sessionId);const e={settled:!1};try{this.watch(t,e)}catch(n){this.settle(t,e,{status:"failed",output:null,error:P(n)})}return!0}watch(t,e){const n=t.timeoutMs??L,a=t.spec.promptStdin===!0,f=t.argsOf?t.argsOf(t.sessionId):t.spec.args(t.sessionId,a?"":t.prompt),d=a&&process.platform==="win32"&&!/[\s"\\/]/.test(t.bin),T=(t.detached??!0)&&!d,m={cwd:t.cwd,detached:T,windowsHide:!0,shell:d,stdio:[a?"pipe":"ignore","pipe","pipe"],env:(()=>{const s={...process.env,WEAVE_HOOK_DISPATCH:"1"};return delete s.CLAUDE_CODE_CHILD_SESSION,s})()},i=d?this.spawnImpl([t.bin,...f].join(" "),[],m):this.spawnImpl(t.bin,f,m);if(i.pid!==void 0&&this.livePids.set(t.sessionId,i.pid),a){i.stdin?.on("error",()=>{});try{i.stdin?.write(t.prompt),i.stdin?.end()}catch{}}const I=[],p=[];let w=0,v=0;const g=(s,o,l)=>{if(o>=y)return o;const c=y-o;return s.push(l.length>c?l.subarray(0,c):l),o+Math.min(l.length,c)},h=()=>Buffer.concat([...I,...p]).toString("utf8"),H=()=>{const s=Buffer.concat(p).toString("utf8");return s.length>E?s.slice(-E):s};i.stdout?.on("data",s=>{w=g(I,w,s)}),i.stderr?.on("data",s=>{v=g(p,v,s)});const u=n>0?setTimeout(()=>{if(i.pid!==void 0)try{this.killImpl(i.pid)}catch{}this.settle(t,e,{status:"timeout",output:h(),error:`Timeout after ${n}ms`})},n):null;i.on("error",s=>{u!==null&&clearTimeout(u),this.settle(t,e,{status:"failed",output:h(),error:P(s)})}),i.on("exit",(s,o)=>{u!==null&&clearTimeout(u);const l=h();if(s===0){this.settle(t,e,{status:"succeeded",output:l,error:null});return}const c=s!==null?`exit ${s}`:`exit signal ${o??"unknown"}`,S=H();this.settle(t,e,{status:"failed",output:l,error:S?`${c}
2
- ${S}`:c})})}settle(t,e,n){if(!e.settled){e.settled=!0,this.active.delete(t.sessionId),this.livePids.delete(t.sessionId);try{t.onSettle(n)}catch{}}}}export function defaultKill(r){if(process.platform==="win32"){try{k("taskkill",["/PID",String(r),"/T","/F"],{windowsHide:!0,stdio:"ignore"}).on("error",()=>{})}catch{}return}try{process.kill(-r,"SIGKILL")}catch{try{process.kill(r,"SIGKILL")}catch{}}}function P(r){return r instanceof Error?r.message:String(r)}
1
+ import{spawn as k}from"node:child_process";const A=3e5,T=32*1024,_=2e3;export class HeadlessRunner{spawnImpl;killImpl;active=new Set;livePids=new Map;constructor(t={}){this.spawnImpl=t.spawnImpl??k,this.killImpl=t.killImpl??defaultKill}isBusy(t){return this.active.has(t)}killAll(){let t=0;for(const e of this.livePids.values())try{this.killImpl(e),t++}catch{}return this.livePids.clear(),t}run(t){if(this.active.has(t.sessionId))return!1;this.active.add(t.sessionId);const e={settled:!1};try{this.watch(t,e)}catch(l){this.settle(t,e,{status:"failed",output:null,error:y(l)})}return!0}watch(t,e){const l=t.timeoutMs??A,a=t.spec.promptStdin===!0,m=t.argsOf?t.argsOf(t.sessionId):t.spec.args(t.sessionId,a?"":t.prompt),h=a&&process.platform==="win32"&&!/[\s"\\/]/.test(t.bin),E=(t.detached??!0)&&!h,p={cwd:t.cwd,detached:E,windowsHide:!0,shell:h,stdio:[a?"pipe":"ignore","pipe","pipe"],env:(()=>{const s={...process.env,WEAVE_HOOK_DISPATCH:"1"};return delete s.CLAUDE_CODE_CHILD_SESSION,s})()},r=h?this.spawnImpl([t.bin,...m].join(" "),[],p):this.spawnImpl(t.bin,m,p);if(r.pid!==void 0&&this.livePids.set(t.sessionId,r.pid),a){r.stdin?.on("error",()=>{});try{r.stdin?.write(t.prompt),r.stdin?.end()}catch{}}const I=[],u=[];let w=0,S=0;const g=(s,n,o)=>{if(n>=T)return n;const c=T-n;return s.push(o.length>c?o.subarray(0,c):o),n+Math.min(o.length,c)},f=()=>Buffer.concat([...I,...u]).toString("utf8"),M=()=>{const s=Buffer.concat(u).toString("utf8");return s.length>_?s.slice(-_):s};r.stdout?.on("data",s=>{w=g(I,w,s)}),r.stderr?.on("data",s=>{S=g(u,S,s)});const d=l>0?setTimeout(()=>{if(r.pid!==void 0)try{this.killImpl(r.pid)}catch{}this.settle(t,e,{status:"timeout",output:f(),error:`Timeout after ${l}ms`})},l):null;r.on("error",s=>{d!==null&&clearTimeout(d),this.settle(t,e,{status:"failed",output:f(),error:y(s)})}),r.on("exit",(s,n)=>{d!==null&&clearTimeout(d);const o=f();if(s===0){this.settle(t,e,{status:"succeeded",output:o,error:null});return}const c=s!==null?`exit ${s}`:`exit signal ${n??"unknown"}`,v=M();this.settle(t,e,{status:"failed",output:o,error:v?`${c}
2
+ ${v}`:c})})}settle(t,e,l){if(!e.settled){e.settled=!0,this.active.delete(t.sessionId),this.livePids.delete(t.sessionId);try{t.onSettle(l)}catch{}}}}export function defaultKill(i){if(process.platform==="win32"){try{k("taskkill",["/PID",String(i),"/T","/F"],{windowsHide:!0,stdio:"ignore"}).on("error",()=>{})}catch{}return}try{process.kill(-i,"SIGKILL")}catch{try{process.kill(i,"SIGKILL")}catch{}}}function y(i){return i instanceof Error?i.message:String(i)}
@@ -1,2 +1,2 @@
1
- import k from"node:net";import{chmodSync as m,mkdirSync as y,readFileSync as S,renameSync as b,writeFileSync as d}from"node:fs";import{dirname as x}from"node:path";export function inboxSocketPathOf(s){return s.startsWith("uds:")?s.slice(4):s}export function deliverViaInboxSocket(s,t,e,o={}){const c=o.platform??process.platform,n=o.timeoutMs??3e3,u=inboxSocketPathOf(t.socket);return s.requiresAuthOn(c)&&!t.token?Promise.reject(new Error(`inbox delivery requires a token on platform "${c}"`)):new Promise((a,l)=>{const p=s.frame({token:t.token,text:e});let f=!1;const h=r=>{f||(f=!0,i.destroy(),l(r))},i=k.connect(u);i.setTimeout(n),i.on("timeout",()=>h(new Error(`inbox socket timeout after ${n}ms`))),i.on("error",r=>h(r)),i.on("connect",()=>{i.write(p,r=>{r?h(r):i.end()})}),i.on("close",()=>{f||(f=!0,a())})})}export const INBOX_TARGETS_FILE="inbox-targets.json";function g(s){try{const t=JSON.parse(S(s,"utf8"));if(typeof t!="object"||t===null)return{};const e={};for(const[o,c]of Object.entries(t)){const n=c;typeof n?.socket!="string"||!n.socket||(e[o]={socket:n.socket,token:typeof n.token=="string"&&n.token?n.token:null})}return e}catch{return{}}}export class InboxSocketRegistry{file;bySession;persisted;constructor(t){this.file=t;const e=t?g(t):{};this.bySession=new Map(Object.entries(e)),this.persisted=JSON.stringify(e)}set(t,e){const o=this.bySession.get(t);if(!e?.socket){o&&(this.bySession.delete(t),this.persist());return}o&&o.socket===e.socket&&o.token===e.token||(this.bySession.set(t,e),this.persist())}get(t){return this.bySession.get(t)}forget(t){this.bySession.delete(t)&&this.persist()}persist(){if(!this.file)return;const t=JSON.stringify(Object.fromEntries(this.bySession));if(t!==this.persisted)try{y(x(this.file),{recursive:!0});const e=`${this.file}.tmp`;d(e,`${t}
2
- `,{encoding:"utf8",mode:384}),b(e,this.file),m(this.file,384),this.persisted=t}catch{}}}
1
+ import a from"node:net";import{chmodSync as y,mkdirSync as d,readFileSync as k,renameSync as S,writeFileSync as b}from"node:fs";import{dirname as x}from"node:path";export function inboxSocketPathOf(s){return s.startsWith("uds:")?s.slice(4):s}export function deliverViaInboxSocket(s,t,e,o={}){const c=o.platform??process.platform,n=o.timeoutMs??3e3,l=inboxSocketPathOf(t.socket);return s.requiresAuthOn(c)&&!t.token?Promise.reject(new Error(`inbox delivery requires a token on platform "${c}"`)):new Promise((p,m)=>{const h=s.frame({token:t.token,text:e});let f=!1;const u=i=>{f||(f=!0,r.destroy(),m(i))},r=a.connect(l);r.setTimeout(n),r.on("timeout",()=>u(new Error(`inbox socket timeout after ${n}ms`))),r.on("error",i=>u(i)),r.on("connect",()=>{r.write(h,i=>{i?u(i):r.end()})}),r.on("close",()=>{f||(f=!0,p())})})}export const INBOX_TARGETS_FILE="inbox-targets.json";function O(s){try{const t=JSON.parse(k(s,"utf8"));if(typeof t!="object"||t===null)return{};const e={};for(const[o,c]of Object.entries(t)){const n=c;typeof n?.socket!="string"||!n.socket||(e[o]={socket:n.socket,token:typeof n.token=="string"&&n.token?n.token:null})}return e}catch{return{}}}export class InboxSocketRegistry{file;bySession;persisted;constructor(t){this.file=t;const e=t?O(t):{};this.bySession=new Map(Object.entries(e)),this.persisted=JSON.stringify(e)}set(t,e){const o=this.bySession.get(t);if(!e?.socket){o&&(this.bySession.delete(t),this.persist());return}o&&o.socket===e.socket&&o.token===e.token||(this.bySession.set(t,e),this.persist())}get(t){return this.bySession.get(t)}forget(t){this.bySession.delete(t)&&this.persist()}persist(){if(!this.file)return;const t=JSON.stringify(Object.fromEntries(this.bySession));if(t!==this.persisted)try{d(x(this.file),{recursive:!0});const e=`${this.file}.tmp`;b(e,`${t}
2
+ `,{encoding:"utf8",mode:384}),S(e,this.file),y(this.file,384),this.persisted=t}catch{}}}
@@ -1,5 +1,7 @@
1
1
  import { Worker } from 'node:worker_threads';
2
2
  import { type EventSource, type LogSource } from '@weavecode/harness';
3
+ import { type Harness } from '@weavecode/core';
4
+ import type { PaneEnvSource } from '@weavecode/harness';
3
5
  import { HookEventRepository, type HookEventInput } from '../repositories/hook-events.js';
4
6
  import { ProjectRepository } from '../repositories/projects.js';
5
7
  import { SessionRepository } from '../repositories/sessions.js';
@@ -116,12 +118,25 @@ export interface IngestedHandlerDeps {
116
118
  } | null): void;
117
119
  /** hook 旁路上报的会话 pane 定位 env(内存态;层② 精确定位用)。 */
118
120
  notePaneEnv?(sessionId: string, env: Record<string, string>): void;
121
+ /** 认领起点候选(weave 起会话的 spawn 回执;paneEnvSource='launch' 的 harness 用)。 */
122
+ claimPendingOrigin?(sessionId: string, harness: Harness, projectId: number): void;
119
123
  /** UPS 事件 = 投递回执判据(prompt 原文与在途条目匹配);返回命中消息的随附图 id。
120
124
  * `eventId` 随回执记下(对话面按它把投递行挂到这条事件的气泡上)。 */
121
125
  onSessionPrompt?(sessionId: string, prompt: string, eventId?: number): string[];
126
+ /** 活动旁证:内建命令没有 UPS,宿主后续任何 hook 事件即「命令已执行」的证据,
127
+ * 及时翻牌该会话「已发出未回执」的命令行(5s 短窗口只是兜底)。 */
128
+ noteActivity?(sessionId: string): void;
122
129
  /** 会话退出事件(`HARNESS_LIFECYCLE[<harness>].sessionExit`)= 旁路事实作废点。 */
123
130
  sessionExited?(sessionId: string): void;
124
131
  };
132
+ /** 终端拓扑即时对账(会话退出后立刻摘出终端分组,不等 30s 周期);缺省跳过。 */
133
+ terminalTopologyKick?: () => void;
134
+ /**
135
+ * pane 定位 env 的信源(能力面声明):'hook' 采旁路上报(缺省 = 现行为);
136
+ * 'launch' 忽略上报(hook 由宿主共享 daemon 代跑、env 冻结失真),改认领
137
+ * weave 起会话的起点候选。
138
+ */
139
+ paneEnvSource?: (harness: Harness) => PaneEnvSource;
125
140
  /** 阻塞式问答跟踪(toolName 不进帧域,挂点在此);缺省不跟踪。 */
126
141
  questionTracker?: Pick<QuestionTracker, 'onEvent'>;
127
142
  /** 旁路会话回答认领(claude = `/btw`):判据归 harness 能力面;缺省不认领。 */