@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,3 +1,3 @@
1
- import{createHmac as d,randomBytes as n,randomInt as m,scryptSync as o,timingSafeEqual as w}from"node:crypto";import{chmodSync as g,existsSync as p,mkdirSync as a,readFileSync as y,renameSync as P,rmSync as k,writeFileSync as c}from"node:fs";import h from"node:path";import{getAuthPath as x,getInitialPasswordPath as v}from"../db/paths.js";export const SESSION_COOKIE="weave_session",LOCAL_TOKEN_HEADER="x-weave-local",SESSION_TTL_MS=720*60*60*1e3;const l=64,O=16,u="abcdefghjkmnpqrstuvwxyz23456789";export function generatePassword(){const s=()=>Array.from({length:4},()=>u[m(u.length)]??"a").join("");return[s(),s(),s(),s()].join("-")}function f(s,t){const e=n(O).toString("hex");return{algo:"scrypt",salt:e,hash:o(s,e,l).toString("hex"),updatedAt:t}}function r(s,t){const e=Buffer.from(s),i=Buffer.from(t);return e.length===i.length&&w(e,i)}export function readCookie(s,t){if(s)for(const e of s.split(";")){const i=e.indexOf("=");if(!(i<0)&&e.slice(0,i).trim()===t)return e.slice(i+1).trim()}}export function sessionCookie(s){return`${SESSION_COOKIE}=${s}; HttpOnly; SameSite=Lax; Path=/; Max-Age=${Math.floor(SESSION_TTL_MS/1e3)}`}export function clearedSessionCookie(){return`${SESSION_COOKIE}=; HttpOnly; SameSite=Lax; Path=/; Max-Age=0`}function T(s){if(!p(s))return null;try{const t=JSON.parse(y(s,"utf8"));return t?.version!==1||typeof t.sessionSecret!="string"||typeof t.localToken!="string"?null:{version:1,password:t.password??null,sessionSecret:t.sessionSecret,localToken:t.localToken,createdAt:typeof t.createdAt=="string"?t.createdAt:new Date().toISOString()}}catch{return null}}function S(s,t){a(h.dirname(s),{recursive:!0});const e=`${s}.tmp`;c(e,`${JSON.stringify(t,null,2)}
2
- `,{encoding:"utf8",mode:384}),P(e,s);try{g(s,384)}catch{}}export class AuthService{file;authPath;markerPath;now;initialPassword;constructor(t={}){this.authPath=t.authPath??x(),this.markerPath=t.initialPasswordPath??v(),this.now=t.now??Date.now;const e=T(this.authPath);if(e){this.file=e,this.initialPassword=null;return}const i=generatePassword();this.file={version:1,password:f(i,this.nowIso()),sessionSecret:n(32).toString("hex"),localToken:n(24).toString("hex"),createdAt:this.nowIso()},S(this.authPath,this.file),this.writeMarker(i),this.initialPassword=i}isPasswordSet(){return this.file.password!==null}verifyPassword(t){const e=this.file.password;return e?r(o(t,e.salt,l).toString("hex"),e.hash):!1}setPassword(t){this.file={...this.file,password:f(t,this.nowIso()),sessionSecret:n(32).toString("hex")},S(this.authPath,this.file),k(this.markerPath,{force:!0})}getLocalToken(){return this.file.localToken}verifyLocalToken(t){return typeof t=="string"&&t!==""&&r(t,this.file.localToken)}issueSession(){const t=this.now()+SESSION_TTL_MS;return`${t}.${this.sign(t)}`}verifySession(t){if(!t)return!1;const e=t.indexOf(".");if(e<=0)return!1;const i=Number(t.slice(0,e));return!Number.isFinite(i)||i<=this.now()?!1:r(t.slice(e+1),this.sign(i))}isAuthenticated(t){return this.isLocallyTrusted(t)?!0:this.verifySession(readCookie(t.cookie,SESSION_COOKIE))}isLocallyTrusted(t){const e=t[LOCAL_TOKEN_HEADER];return this.verifyLocalToken(typeof e=="string"?e:void 0)}sign(t){return d("sha256",this.file.sessionSecret).update(`weave-session:${t}`).digest("hex")}nowIso(){return new Date(this.now()).toISOString()}writeMarker(t){a(h.dirname(this.markerPath),{recursive:!0}),c(this.markerPath,`${t}
1
+ import{createHmac as d,randomBytes as s,randomInt as m,scryptSync as o,timingSafeEqual as w}from"node:crypto";import{chmodSync as g,existsSync as p,mkdirSync as a,readFileSync as y,renameSync as P,rmSync as x,writeFileSync as c}from"node:fs";import h from"node:path";import{getAuthPath as k,getInitialPasswordPath as A}from"../db/paths.js";export const SESSION_COOKIE="weave_session",LOCAL_TOKEN_HEADER="x-weave-local",SESSION_TTL_MS=720*60*60*1e3;const u=64,T=16,l="abcdefghjkmnpqrstuvwxyz23456789";export function generatePassword(){const r=()=>Array.from({length:4},()=>l[m(l.length)]??"a").join("");return[r(),r(),r(),r()].join("-")}function f(r,t){const e=s(T).toString("hex");return{algo:"scrypt",salt:e,hash:o(r,e,u).toString("hex"),updatedAt:t}}function i(r,t){const e=Buffer.from(r),n=Buffer.from(t);return e.length===n.length&&w(e,n)}export function readCookie(r,t){if(r)for(const e of r.split(";")){const n=e.indexOf("=");if(!(n<0)&&e.slice(0,n).trim()===t)return e.slice(n+1).trim()}}export function sessionCookie(r){return`${SESSION_COOKIE}=${r}; HttpOnly; SameSite=Lax; Path=/; Max-Age=${Math.floor(SESSION_TTL_MS/1e3)}`}export function clearedSessionCookie(){return`${SESSION_COOKIE}=; HttpOnly; SameSite=Lax; Path=/; Max-Age=0`}function O(r){if(!p(r))return null;try{const t=JSON.parse(y(r,"utf8"));return t?.version!==1||typeof t.sessionSecret!="string"||typeof t.localToken!="string"?null:{version:1,password:t.password??null,sessionSecret:t.sessionSecret,localToken:t.localToken,createdAt:typeof t.createdAt=="string"?t.createdAt:new Date().toISOString()}}catch{return null}}function S(r,t){a(h.dirname(r),{recursive:!0});const e=`${r}.tmp`;c(e,`${JSON.stringify(t,null,2)}
2
+ `,{encoding:"utf8",mode:384}),P(e,r);try{g(r,384)}catch{}}export class AuthService{file;authPath;markerPath;now;initialPassword;constructor(t={}){this.authPath=t.authPath??k(),this.markerPath=t.initialPasswordPath??A(),this.now=t.now??Date.now;const e=O(this.authPath);if(e){this.file=e,this.initialPassword=null;return}const n=generatePassword();this.file={version:1,password:f(n,this.nowIso()),sessionSecret:s(32).toString("hex"),localToken:s(24).toString("hex"),createdAt:this.nowIso()},S(this.authPath,this.file),this.writeMarker(n),this.initialPassword=n}isPasswordSet(){return this.file.password!==null}verifyPassword(t){const e=this.file.password;return e?i(o(t,e.salt,u).toString("hex"),e.hash):!1}setPassword(t){this.file={...this.file,password:f(t,this.nowIso()),sessionSecret:s(32).toString("hex")},S(this.authPath,this.file),x(this.markerPath,{force:!0})}getLocalToken(){return this.file.localToken}verifyLocalToken(t){return typeof t=="string"&&t!==""&&i(t,this.file.localToken)}issueSession(){const t=this.now()+SESSION_TTL_MS;return`${t}.${this.sign(t)}`}verifySession(t){if(!t)return!1;const e=t.indexOf(".");if(e<=0)return!1;const n=Number(t.slice(0,e));return!Number.isFinite(n)||n<=this.now()?!1:i(t.slice(e+1),this.sign(n))}isAuthenticated(t){return this.isLocallyTrusted(t)?!0:this.verifySession(readCookie(t.cookie,SESSION_COOKIE))}isLocallyTrusted(t){const e=t[LOCAL_TOKEN_HEADER];return this.verifyLocalToken(typeof e=="string"?e:void 0)}sign(t){return d("sha256",this.file.sessionSecret).update(`weave-session:${t}`).digest("hex")}nowIso(){return new Date(this.now()).toISOString()}writeMarker(t){a(h.dirname(this.markerPath),{recursive:!0}),c(this.markerPath,`${t}
3
3
  `,{encoding:"utf8",mode:384})}}
@@ -1 +1 @@
1
- import{RATE_BUCKET_MS as s}from"../hooks/dashboard-rate.js";export const DASHBOARD_WINDOW_MS=36e5;const w=60,f=1e3,h=6e4;export function startDashboardPusher(e){let o=!1,c={projects:0,sessions:0},a=0;const r=()=>{c={projects:e.projects.list().length,sessions:e.sessions.countAll()},a=Date.now()},l=()=>({...c,...e.rate.totals}),p=()=>{queueMicrotask(()=>{const n=Date.now(),i=DASHBOARD_WINDOW_MS/s,u=Math.floor(n/s)*s-(i-1)*s,S=e.projects.list().map(t=>t.id);e.rate.isSeeded||(e.rate.seed(e.events.seriesBySecond(S,new Date(u).toISOString())),e.rate.seedTotals(e.events.countAll(),e.events.countSince(S,new Date(new Date(n).setHours(0,0,0,0)).toISOString())),r()),Date.now()-a>h&&r();const D=new Date(n).toISOString();e.bus.emit({kind:"dashboard.totals",at:D,totals:l()});for(let t=0;t<i;t+=w){const I=Math.min(w,i-t),b=u+t*s,g=e.rate.bucketsFor(b,I);e.bus.emit({kind:"dashboard.series",at:D,series:g.map((k,O)=>({at:new Date(b+O*s).toISOString().slice(0,19),n:k}))})}})},m=e.bus.subscribe(n=>{n.kind==="event.ingested"&&(o=!0)}),d=setInterval(()=>{o&&(o=!1,Date.now()-a>h&&r(),e.bus.emit({kind:"dashboard.delta",at:new Date().toISOString(),series:e.rate.recentBuckets(12),totals:l()}))},f);return d.unref?.(),{attach:p,stop:()=>{m(),clearInterval(d)}}}
1
+ import{RATE_BUCKET_MS as s}from"../hooks/dashboard-rate.js";export const DASHBOARD_WINDOW_MS=36e5;const b=60,d=1e3,h=6e4;export function startDashboardPusher(t){let o=!1,i={projects:0,sessions:0},a=0;const r=()=>{i={projects:t.projects.list().length,sessions:t.sessions.countAll()},a=Date.now()},l=()=>({...i,...t.rate.totals}),m=()=>{queueMicrotask(()=>{const n=Date.now(),c=DASHBOARD_WINDOW_MS/s,u=Math.floor(n/s)*s-(c-1)*s,f=t.projects.list().map(e=>e.id);t.rate.isSeeded||(t.rate.seed(t.events.seriesBySecond(f,new Date(u).toISOString())),t.rate.seedTotals(t.events.countAll(),t.events.countSince(f,new Date(new Date(n).setHours(0,0,0,0)).toISOString())),r()),Date.now()-a>h&&r();const D=new Date(n).toISOString();t.bus.emit({kind:"dashboard.totals",at:D,totals:l()});for(let e=0;e<c;e+=b){const E=Math.min(b,c-e),_=u+e*s,I=t.rate.bucketsFor(_,E);t.bus.emit({kind:"dashboard.series",at:D,series:I.map((A,M)=>({at:new Date(_+M*s).toISOString().slice(0,19),n:A}))})}})},w=t.bus.subscribe(n=>{n.kind==="event.ingested"&&(o=!0)}),S=setInterval(()=>{o&&(o=!1,Date.now()-a>h&&r(),t.bus.emit({kind:"dashboard.delta",at:new Date().toISOString(),series:t.rate.recentBuckets(12),totals:l()}))},d);return S.unref?.(),{attach:m,stop:()=>{w(),clearInterval(S)}}}
@@ -1 +1 @@
1
- import{EventEmitter as s}from"node:events";export class DataBus{emitter=new s;subscribers=0;constructor(){this.emitter.setMaxListeners(100)}emit(t){this.emitter.emit("change",t)}hasSubscribers(){return this.subscribers>0}subscribe(t){return this.subscribers+=1,this.emitter.on("change",t),()=>{this.subscribers-=1,this.emitter.off("change",t)}}}
1
+ import{EventEmitter as t}from"node:events";export class DataBus{emitter=new t;subscribers=0;constructor(){this.emitter.setMaxListeners(100)}emit(s){this.emitter.emit("change",s)}hasSubscribers(){return this.subscribers>0}subscribe(s){return this.subscribers+=1,this.emitter.on("change",s),()=>{this.subscribers-=1,this.emitter.off("change",s)}}}
@@ -1,2 +1,2 @@
1
- import{chmodSync as t,existsSync as c,mkdirSync as o,readFileSync as s,renameSync as a,rmSync as y,writeFileSync as u}from"node:fs";import l from"node:path";import{getDecisionKeyPath as n}from"../db/paths.js";export function readDecisionKey(i=n()){if(!c(i))return null;try{const e=JSON.parse(s(i,"utf8"));return typeof e.apiKey=="string"&&e.apiKey!==""?e.apiKey:null}catch{return null}}export function writeDecisionKey(i,e=n()){if(i===null||i===""){y(e,{force:!0});return}o(l.dirname(e),{recursive:!0});const r=`${e}.tmp`;u(r,`${JSON.stringify({apiKey:i},null,2)}
2
- `,{encoding:"utf8",mode:384}),a(r,e);try{t(e,384)}catch{}}export function hasDecisionKey(i=n()){return readDecisionKey(i)!==null}
1
+ import{chmodSync as o,existsSync as c,mkdirSync as i,readFileSync as u,renameSync as y,rmSync as m,writeFileSync as s}from"node:fs";import p from"node:path";import{getDecisionKeyPath as t}from"../db/paths.js";export function readDecisionKey(n=t()){if(!c(n))return null;try{const r=JSON.parse(u(n,"utf8"));return typeof r.apiKey=="string"&&r.apiKey!==""?r.apiKey:null}catch{return null}}export function writeDecisionKey(n,r=t()){if(n===null||n===""){m(r,{force:!0});return}i(p.dirname(r),{recursive:!0});const e=`${r}.tmp`;s(e,`${JSON.stringify({apiKey:n},null,2)}
2
+ `,{encoding:"utf8",mode:384}),y(e,r);try{o(r,384)}catch{}}export function hasDecisionKey(n=t()){return readDecisionKey(n)!==null}
@@ -1 +1 @@
1
- import ds from"node:http";import{openDatabase as hs}from"../db/db.js";import{ProjectRepository as fs}from"../repositories/projects.js";import{HookEventRepository as ws}from"../repositories/hook-events.js";import{LibraryRepository as Ss}from"../repositories/libraries.js";import{HookRuleRepository as os}from"../repositories/hook-rules.js";import{HookDispatchRepository as gs}from"../repositories/hook-dispatches.js";import{PluginStateRepository as D}from"../repositories/plugin-states.js";import{SessionRepository as bs}from"../repositories/sessions.js";import{createRuntimeRegistry as vs}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as Rs,isHarness as ys}from"@weavecode/core";import{messagingSurfaceFor as ks}from"../surfaces.js";import{syntheticSessionIds as Es}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Ds}from"../hooks/edge-extract.js";import{HookRuleRegistry as Ps}from"../hooks/registry.js";import{HookDispatcher as Is}from"../hooks/dispatcher.js";import{HookEventBus as Ts}from"../hooks/bus.js";import{ResumeRunner as As}from"../hooks/resume-runner.js";import{HeadlessRunner as Cs}from"../hooks/headless-runner.js";import{MessageDeliverer as Os}from"../hooks/message-deliverer.js";import{QuestionTracker as Hs}from"../hooks/question-tracker.js";import{SideQuestionRepository as $s}from"../repositories/side-questions.js";import{claimSideAnswer as js}from"../hooks/side-questions.js";import{DashboardRateCache as Fs}from"../hooks/dashboard-rate.js";import{startDashboardPusher as _s}from"./dashboard-pusher.js";import{startPromptFlusher as Bs}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Ls}from"../repositories/session-watches.js";import{PushSubscriptionRepository as Us}from"../repositories/push-subscriptions.js";import{UploadRepository as Ms}from"../repositories/uploads.js";import{defaultUploadSessions as Ns}from"./upload-sessions.js";import{PushNotifier as Ws}from"../hooks/push-notify.js";import{OrchestrationRepository as qs,OrchestrationRunRepository as xs}from"../repositories/orchestrations.js";import{WatchEngine as Qs}from"../hooks/watch-engine.js";import{OrchestrationEngine as Gs,createForkConditionJudge as Js}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as Ks}from"../hooks/decision-judge.js";import{readDecisionKey as Vs}from"./decision-config.js";import{openSessionTerminal as Ys}from"./session-open.js";import{loadAllPlugins as zs}from"../hooks/plugin-loader.js";import{ensureBuiltinMarket as Xs,builtinMarketDir as Zs}from"../market/builtin.js";import{ToolkitService as se}from"../hooks/toolkit.js";import{startSessionSweeper as ee}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as oe}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as te}from"../statusline/manager.js";import{WatchService as re}from"../watch/watch-service.js";import{weaveRequestHandler as ne}from"./server.js";import{startTlsServer as ie}from"./tls.js";import{DataBus as ae}from"./data-bus.js";import{TerminalTopologyRefresher as le}from"./terminal-topology-refresher.js";import{SnapshotRefresher as U}from"./snapshot-refresher.js";import{SessionProbe as pe,dbModelFactResolver as ce,dbTranscriptPathResolver as me}from"./session-probe.js";import{InflightCountsRefresher as ue}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as de}from"./project-updates-refresher.js";import{FingerprintCache as he}from"../install/fingerprint.js";import{detectProjectUpdateCounts as fe}from"../install/updates.js";import{claudeLivenessById as ts,pidAliveOf as we}from"./claude-liveness.js";import{promptTerminalChannel as Se,readTerminalCounts as ge}from"./opener.js";import{wireHookFilePipeline as be}from"./hook-pipeline.js";import{DEFAULT_PORT as M,DAEMON_HOST as ve,DEFAULT_BIND_HOST as Re,findFreePort as ye,isPortFree as ke}from"./port.js";import{writeDaemonState as rs}from"./state.js";import{ensureDataLayout as Ee}from"../db/layout.js";import{pruneFileIndexes as De}from"./project-files.js";import{readDaemonSettingsSync as P,setDaemonSettingsDb as Pe,DEFAULT_SERVER_SETTINGS as Ie}from"./settings.js";import{AuthService as Te}from"./dashboard-auth.js";import{resolveStaticDir as Ae}from"./static.js";const Ce="CLAUDE_CODE_CHILD_SESSION"in process.env;delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const c of Rs)delete process.env[c];async function Oe(){Ee();const c=await ke(M)?M:await ye(M+1);rs({pid:process.pid,port:c,startedAt:new Date().toISOString()});const o=hs();Pe(o);const h=P().server?.bindHost??Re,I=P().server?.tlsPort??Ie.tlsPort,T=new Te;T.initialPassword&&console.log(`[dev] initial dashboard password: ${T.initialPassword}`);const r=new fs(o);De(r.list().map(s=>s.id));const a=new ws(o),u=new Ss(o),b=vs(),ns=b.byCapability("events").flatMap(s=>s.events??[]),v=new Ps(new os(o)),R=new gs(o),t=new bs(o),n=new Ts;{const s=await Xs({libraries:u});s.error?console.error(`[dev] builtin market unavailable: ${s.error}`):s.changed&&console.log(`[dev] builtin market ${s.form==="link"?"linked":"copied"} -> ${Zs(u.dataRoot)}`)}const{loader:m}=await zs({rules:new os(o),registry:v,states:new D(o),bus:n,libraries:u},r.list());{const s=m.list().filter(e=>e.status==="rejected");console.log(`[dev] plugins loaded: ${m.list().length} (rejected: ${s.length})`);for(const e of s)console.log(`[dev] rejected ${e.id}: ${e.error}`)}m.watchRoots();const N={list:()=>m.list(),setPluginEnabled:(s,e)=>m.setPluginEnabled(s,e),reloadAll:()=>m.reloadAll(),rescan:()=>m.rescanRoots(r.list(),u)},is=new se({projects:r,states:new D(o),plugins:N,libraries:u}),A={run:null},W=new Is({registry:v,dispatches:R,bus:n,projects:r,sessions:t,plugins:m,pluginStates:new D(o),classify:s=>A.run?A.run(s):Promise.resolve(null)}),y=new Cs,as=new As({dispatches:R,sessions:t,projects:r,bus:n,resumeSpec:b.get("claude")?.resume,headless:y}),p=new Os({sessions:t,projects:r,hookEvents:a,bus:n,headless:y,terminal:Se(()=>P().terminal),blockedByQuestion:s=>f.get(s)!=null});Bs(p);const C=new Ls(o),O=new Qs({watches:C,deliverer:p,sessions:t,bus:n}),q=new Us(o),H=new Ms(o),ls=new Ws({subscriptions:q,sessions:t,bus:n}),$=new qs(o),x=new xs(o),d=new pe(me(a),ce(a,s=>t.getBySessionId(s)?.harness??null)),f=new Hs({sessions:t,hookEvents:a,onPending:s=>{n.emit({kind:"question.pending",sessionId:s.sessionId,harness:s.harness,count:s.questions.length,at:s.at})},interruptedAt:s=>{const e=t.getBySessionId(s);return e?d.interruptedAt(s,e.lastSeenAt):null}});f.seedFromDb();const Q=new $s(o),G=new Fs,j=_s({rate:G,events:a,sessions:t,projects:r,bus:n}),J={repo:Q,bus:n,settle:s=>{p.interrupt(s.sessionId)}},K=new re(r);K.start();const i=new ae,k=new le(async()=>({counts:await ge(r.list()),terminals:await p.sessionTerminals()}),i,{shouldRun:()=>i.hasSubscribers(),graceMs:1e4});k.start();const F=new U(()=>{const s=ts(),e={};for(const l of t.listWithCounts()){const g=we(l,s);g!==null&&(e[l.sessionId]=g)}return{alive:e}},i,{key:"sessionLiveness",shouldRun:()=>i.hasSubscribers()});F.start();const _=new U(()=>{const s={};for(const e of t.listWithCounts()){if(e.turnOpen!==!0)continue;const l=d.interruptedAt(e.sessionId,e.lastSeenAt);l!==null&&(s[e.sessionId]=l)}return{interrupted:s}},i,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>i.hasSubscribers()});_.start(),new U(()=>{const s={};for(const e of r.list())s[e.id]=te(e.path);return s},i,{key:"statusline",intervalMs:5e3,shouldRun:()=>i.hasSubscribers(),invalidateOnly:!0}).start();const ps=new ue(()=>p.listInflightCounts(),i,n);let V=null;const w=Ds({sessions:t,projects:r,harnessOf:s=>{const e=a.listBySession(s,1),l=e[e.length-1]?.source;return ys(l)?l:null},surfaceFor:ks,headless:y,onSyntheticChange:()=>V?.pushSyntheticSessions(Es())});A.run=s=>w.run(s);const cs=Ks({config:async()=>{const s=P().decision;if(!s?.baseUrl||!s.model)return null;const e=Vs();return e?{baseUrl:s.baseUrl,model:s.model,apiKey:e}:null},fallback:Js({supports:s=>w.supports(s),extract:s=>w.run(s)})}),S=new Gs({orchestrations:$,runs:x,deliverer:p,sessions:t,bus:n,supportsExtract:s=>w.supports(s),extract:s=>w.run(s),conditionJudge:cs,deferWhenUserPresent:!0,ensureOpen:async s=>{const e=a.listBySession(s,1).at(-1)?.id??0,l=await Ys({hookSessions:t,hookEvents:a,projects:r,harnesses:b,sessionProbe:d,terminalRefresher:k},s);if(!l.ok)return l;let g=!1;for(let es=0;es<60;es++){if(a.listBySession(s,20).some(E=>E.id>e&&E.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};ts().get(s)===!0&&(g=!0),await new Promise(E=>setTimeout(E,250))}return g?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}}});S.rearm();const Y=setInterval(()=>S.cronTick(),3e4);Y.unref();const ms=new he,us=new de(()=>fe(r.list(),u.list(),ms),i,n,()=>i.hasSubscribers());ee({sessions:t,events:a,dispatches:R,deliverer:p,watches:C,orchestrations:$,watchEngine:O,orchestrationEngine:S,questions:f,sideQuestions:Q,probe:d,uploads:H,uploadSessions:Ns}),oe();const B=be({projects:r,rules:v,sessions:t,bus:n,dispatcher:W,watchEngine:O,orchestrationEngine:S,messagePipe:p,questionTracker:f,sideQuestions:{onEvent:s=>{js(J,s)}},sessionProbe:d,uploads:H,dashboardRate:G});V=B;const L=Ae(),z=ne({projects:r,port:c,tlsPort:I,watch:K,hookEvents:a,adapters:ns,harnesses:b,libraries:u,staticDir:L,hookRegistry:v,hookDispatches:R,hookSessions:t,hookBus:n,dataBus:i,terminalRefresher:k,interruptRefresher:_,livenessRefresher:F,sessionProbe:d,inflightRefresher:ps,updatesRefresher:us,hookDispatcher:W,hookRunner:as,messageDeliverer:p,uploads:H,questionTracker:f,sideQuestions:J,sessionWatches:C,watchEngine:O,orchestrations:$,orchestrationRuns:x,orchestrationEngine:S,pushSubscriptions:q,pushNotifier:ls,onAttach:j.attach,dashboardRefresh:j.attach,hookPlugins:N,hookMirror:B.mirror,pluginStates:new D(o),toolkit:is,auth:T}),X=ds.createServer(z);let Z=null;ie({port:I,bindHost:h,handler:z}).then(s=>{Z=s,s&&console.log(`[dev] weave daemon tls listening on https://${h}:${s.port}`)});const ss=()=>{k.stop(),F.stop(),_.stop(),y.killAll(),clearInterval(Y),j.stop(),B.stop(),X.close(),Z?.server.close(),process.exit(0)};process.on("SIGTERM",ss),process.on("SIGINT",ss),X.listen(c,h,()=>{rs({pid:process.pid,port:c,startedAt:new Date().toISOString(),host:h,tlsPort:I}),console.log(`[dev] weave daemon listening on http://${h}:${c}`),console.log(`[dev] cli/dashboard local url: http://${ve}:${c}`),console.log(`[dev] child-session marker stripped: ${Ce}`),console.log(L?`[dev] static: ${L}`:"[dev] static: (web/dist not built \u2014 run pnpm build:web)")})}Oe();
1
+ import we from"node:http";import{openDatabase as ge}from"../db/db.js";import{ProjectRepository as Se}from"../repositories/projects.js";import{HookEventRepository as ve}from"../repositories/hook-events.js";import{LibraryRepository as be}from"../repositories/libraries.js";import{HookRuleRepository as ne}from"../repositories/hook-rules.js";import{HookDispatchRepository as Re}from"../repositories/hook-dispatches.js";import{PluginStateRepository as T}from"../repositories/plugin-states.js";import{SessionRepository as ye}from"../repositories/sessions.js";import{createRuntimeRegistry as ke}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as De,isHarness as W}from"@weavecode/core";import{messagingSurfaceFor as Pe,narrationSurfaceFor as Ee}from"../surfaces.js";import{syntheticSessionIds as Te}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Oe}from"../hooks/edge-extract.js";import{HookRuleRegistry as Ie}from"../hooks/registry.js";import{HookDispatcher as Ae}from"../hooks/dispatcher.js";import{HookEventBus as Ce}from"../hooks/bus.js";import{ResumeRunner as _e}from"../hooks/resume-runner.js";import{HeadlessRunner as Fe}from"../hooks/headless-runner.js";import{MessageDeliverer as He}from"../hooks/message-deliverer.js";import{QuestionTracker as $e}from"../hooks/question-tracker.js";import{SideQuestionRepository as Be}from"../repositories/side-questions.js";import{claimSideAnswer as Me}from"../hooks/side-questions.js";import{DashboardRateCache as Le}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Ue}from"./dashboard-pusher.js";import{startPromptFlusher as Ne}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as We}from"../repositories/session-watches.js";import{PushSubscriptionRepository as je}from"../repositories/push-subscriptions.js";import{UploadRepository as xe}from"../repositories/uploads.js";import{defaultUploadSessions as Qe}from"./upload-sessions.js";import{PushNotifier as qe}from"../hooks/push-notify.js";import{OrchestrationRepository as Ke,OrchestrationRunRepository as Ge}from"../repositories/orchestrations.js";import{WatchEngine as Je}from"../hooks/watch-engine.js";import{OrchestrationEngine as Ve,createForkConditionJudge as Ye}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as ze}from"../hooks/decision-judge.js";import{readDecisionKey as Xe}from"./decision-config.js";import{openSessionTerminal as Ze}from"./session-open.js";import{loadAllPlugins as es}from"../hooks/plugin-loader.js";import{ensureBuiltinMarket as ss,builtinMarketDir as ts}from"../market/builtin.js";import{ToolkitService as os}from"../hooks/toolkit.js";import{startSessionSweeper as rs}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as ns}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as is}from"../statusline/manager.js";import{WatchService as as}from"../watch/watch-service.js";import{weaveRequestHandler as ls}from"./server.js";import{startTlsServer as cs}from"./tls.js";import{DataBus as ps}from"./data-bus.js";import{TerminalTopologyRefresher as ms}from"./terminal-topology-refresher.js";import{SnapshotRefresher as j}from"./snapshot-refresher.js";import{SessionProbe as us,dbModelFactResolver as ds,dbTranscriptPathResolver as fs}from"./session-probe.js";import{NarrationWatcher as hs}from"./narration-watcher.js";import{InflightCountsRefresher as ws}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as gs}from"./project-updates-refresher.js";import{FingerprintCache as Ss}from"../install/fingerprint.js";import{detectProjectUpdateCounts as vs}from"../install/updates.js";import{pidAliveOf as bs}from"./claude-liveness.js";import{combinedLivenessOf as R}from"./liveness.js";import{promptTerminalChannel as ie,readTerminalCounts as Rs}from"./opener.js";import{wireHookFilePipeline as ys}from"./hook-pipeline.js";import{DEFAULT_PORT as x,DAEMON_HOST as ks,DEFAULT_BIND_HOST as Ds,findFreePort as Ps,isPortFree as Es}from"./port.js";import{writeDaemonState as ae}from"./state.js";import{ensureDataLayout as Ts}from"../db/layout.js";import{pruneFileIndexes as Os}from"./project-files.js";import{pruneInstallTmp as Is}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as y,setDaemonSettingsDb as As,DEFAULT_SERVER_SETTINGS as Cs}from"./settings.js";import{AuthService as _s}from"./dashboard-auth.js";import{resolveStaticDir as Fs}from"./static.js";const Hs="CLAUDE_CODE_CHILD_SESSION"in process.env;delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const p of De)delete process.env[p];async function $s(){Ts();const p=await Es(x)?x:await Ps(x+1);ae({pid:process.pid,port:p,startedAt:new Date().toISOString()});const t=ge();As(t);const f=y().server?.bindHost??Ds,O=y().server?.tlsPort??Cs.tlsPort,I=new _s;I.initialPassword&&console.log(`[dev] initial dashboard password: ${I.initialPassword}`);const r=new Se(t);Os(r.list().map(e=>e.id)),Is();const a=new ve(t),u=new be(t),h=ke(),le=h.byCapability("events").flatMap(e=>e.events??[]),k=new Ie(new ne(t)),D=new Re(t),o=new ye(t),n=new Ce;{const e=await ss({libraries:u});e.error?console.error(`[dev] builtin market unavailable: ${e.error}`):e.changed&&console.log(`[dev] builtin market ${e.form==="link"?"linked":"copied"} -> ${ts(u.dataRoot)}`)}const{loader:m}=await es({rules:new ne(t),registry:k,states:new T(t),bus:n,libraries:u},r.list());{const e=m.list().filter(s=>s.status==="rejected");console.log(`[dev] plugins loaded: ${m.list().length} (rejected: ${e.length})`);for(const s of e)console.log(`[dev] rejected ${s.id}: ${s.error}`)}m.watchRoots();const Q={list:()=>m.list(),setPluginEnabled:(e,s)=>m.setPluginEnabled(e,s),reloadAll:()=>m.reloadAll(),rescan:()=>m.rescanRoots(r.list(),u)},ce=new os({projects:r,states:new T(t),plugins:Q,libraries:u}),A={run:null},q=new Ae({registry:k,dispatches:D,bus:n,projects:r,sessions:o,plugins:m,pluginStates:new T(t),classify:e=>A.run?A.run(e):Promise.resolve(null),sessionTitleOf:async e=>{const s=a.listBySession(e,1).at(-1)?.source;return W(s)?h.get(s)?.titles?.sessionTitleOf(e)??null:null}}),P=new Fe,pe=new _e({dispatches:D,sessions:o,projects:r,bus:n,resumeSpec:h.get("claude")?.resume,headless:P}),c=new He({sessions:o,projects:r,hookEvents:a,bus:n,headless:P,terminal:ie(()=>y().terminal),blockedByQuestion:e=>w.get(e)!=null,livenessOf:R,sideAnswerStore:{answerById:(e,s,i)=>{$.answerById(e,s,i)}}});Ne(c);const C=new We(t),_=new Je({watches:C,deliverer:c,sessions:o,bus:n,livenessOf:R}),K=new je(t),F=new xe(t),me=new qe({subscriptions:K,sessions:o,bus:n}),H=new Ke(t),G=new Ge(t),d=new us(fs(a),ds(a,e=>o.getBySessionId(e)?.harness??null)),J=new hs(n,e=>Ee(W(e)?e:"claude"),e=>d.transcriptPathOf(e),e=>o.livenessRowOf(e)?.harness??null);J.start();const w=new $e({sessions:o,hookEvents:a,onPending:e=>{n.emit({kind:"question.pending",sessionId:e.sessionId,harness:e.harness,count:e.questions.length,at:e.at})},interruptedAt:e=>{const s=o.getBySessionId(e);return s?d.interruptedAt(e,s.lastSeenAt):null}});w.seedFromDb();const $=new Be(t),V=new Le,B=Ue({rate:V,events:a,sessions:o,projects:r,bus:n}),Y={repo:$,bus:n,settle:e=>{c.interrupt(e.sessionId)}},z=new as(r);z.start();const l=new ps,g=new ms(async()=>({counts:await Rs(r.list()),terminals:await c.sessionTerminals()}),l,{shouldRun:()=>l.hasSubscribers(),graceMs:1e4});g.start();const M=new j(()=>{const e=R(),s={};for(const i of o.listWithCounts()){const b=bs(i,e);b!==null&&(s[i.sessionId]=b)}return{alive:s}},l,{key:"sessionLiveness",shouldRun:()=>l.hasSubscribers()});M.start();const L=new j(()=>{const e={};for(const s of o.listWithCounts()){if(s.turnOpen!==!0)continue;const i=d.interruptedAt(s.sessionId,s.lastSeenAt);i!==null&&(e[s.sessionId]=i)}return{interrupted:e}},l,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>l.hasSubscribers()});L.start(),new j(()=>{const e={};for(const s of r.list())e[s.id]=is(s.path);return e},l,{key:"statusline",intervalMs:5e3,shouldRun:()=>l.hasSubscribers(),invalidateOnly:!0}).start();const ue=new ws(()=>c.listInflightCounts(),l,n);let X=null;const S=Oe({sessions:o,projects:r,harnessOf:e=>{const s=a.listBySession(e,1),i=s[s.length-1]?.source;return W(i)?i:null},surfaceFor:Pe,headless:P,onSyntheticChange:()=>X?.pushSyntheticSessions(Te())});A.run=e=>S.run(e);const de=ze({config:async()=>{const e=y().decision;if(!e?.baseUrl||!e.model)return null;const s=Xe();return s?{baseUrl:e.baseUrl,model:e.model,apiKey:s}:null},fallback:Ye({supports:e=>S.supports(e),extract:e=>S.run(e)})}),v=new Ve({orchestrations:H,runs:G,deliverer:c,sessions:o,bus:n,supportsExtract:e=>S.supports(e),extract:e=>S.run(e),conditionJudge:de,deferWhenUserPresent:!0,ensureOpen:async e=>{const s=a.listBySession(e,1).at(-1)?.id??0,i=await Ze({hookSessions:o,hookEvents:a,projects:r,harnesses:h,sessionProbe:d,terminalRefresher:g},e);if(!i.ok)return i;let b=!1;for(let re=0;re<60;re++){if(a.listBySession(e,20).some(E=>E.id>s&&E.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};R().get(e)===!0&&(b=!0),await new Promise(E=>setTimeout(E,250))}return b?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}}});v.rearm();const Z=setInterval(()=>v.cronTick(),3e4);Z.unref();const fe=new Ss,he=new gs(()=>vs(r.list(),u.list(),fe),l,n,()=>l.hasSubscribers());rs({sessions:o,events:a,dispatches:D,deliverer:c,watches:C,orchestrations:H,watchEngine:_,orchestrationEngine:v,questions:w,sideQuestions:$,probe:d,uploads:F,uploadSessions:Qe,livenessOf:R}),ns();const U=ys({projects:r,rules:k,sessions:o,bus:n,dispatcher:q,watchEngine:_,orchestrationEngine:v,messagePipe:c,questionTracker:w,sideQuestions:{onEvent:e=>{Me(Y,e)}},sessionProbe:d,uploads:F,dashboardRate:V,terminalTopologyKick:()=>{g.refreshNow()}});X=U;const N=Fs(),ee=ls({projects:r,port:p,tlsPort:O,watch:z,hookEvents:a,adapters:le,harnesses:h,libraries:u,staticDir:N,hookRegistry:k,hookDispatches:D,hookSessions:o,hookBus:n,dataBus:l,terminalRefresher:g,interruptRefresher:L,livenessRefresher:M,sessionProbe:d,inflightRefresher:ue,updatesRefresher:he,hookDispatcher:q,hookRunner:pe,messageDeliverer:c,terminal:ie(()=>y().terminal),uploads:F,questionTracker:w,sideQuestions:Y,sessionWatches:C,watchEngine:_,orchestrations:H,orchestrationRuns:G,orchestrationEngine:v,pushSubscriptions:K,pushNotifier:me,onAttach:B.attach,dashboardRefresh:B.attach,hookPlugins:Q,hookMirror:U.mirror,pluginStates:new T(t),toolkit:ce,auth:I}),se=we.createServer(ee);let te=null;cs({port:O,bindHost:f,handler:ee}).then(e=>{te=e,e&&console.log(`[dev] weave daemon tls listening on https://${f}:${e.port}`)});const oe=()=>{g.stop(),M.stop(),L.stop(),P.killAll(),clearInterval(Z),J.stop(),B.stop(),U.stop(),se.close(),te?.server.close(),process.exit(0)};process.on("SIGTERM",oe),process.on("SIGINT",oe),se.listen(p,f,()=>{ae({pid:process.pid,port:p,startedAt:new Date().toISOString(),host:f,tlsPort:O}),console.log(`[dev] weave daemon listening on http://${f}:${p}`),console.log(`[dev] cli/dashboard local url: http://${ks}:${p}`),console.log(`[dev] child-session marker stripped: ${Hs}`),console.log(N?`[dev] static: ${N}`:"[dev] static: (web/dist not built \u2014 run pnpm build:web)")})}$s();
@@ -1 +1 @@
1
- import{readdir as p,stat as u}from"node:fs/promises";import f from"node:os";import s from"node:path";function d(n,r){return new Promise((t,o)=>{const a=setTimeout(()=>o(new Error("timeout")),r);n.then(i=>{clearTimeout(a),t(i)},i=>{clearTimeout(a),o(i)})})}let c=null;const w=5*6e4;async function h(){if(c&&Date.now()-c.at<w)return c.drives;const n="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),r=(await Promise.all(n.map(async t=>{const o=`${t}:\\`;try{return await d(u(o),4e3),o}catch{return null}}))).filter(t=>t!==null);return c={at:Date.now(),drives:r},r}export async function listBrowseRoots(n){const r=[],t=new Set,o=(e,m)=>{t.has(e)||(t.add(e),r.push({path:e,kind:m}))},a=f.homedir();o(a,"home");const i=[["Desktop","desktop"],["Downloads","downloads"],["Documents","documents"]];for(const[e,m]of i){const l=s.join(a,e);try{await u(l),o(l,m)}catch{}}for(const e of n)typeof e=="string"&&e&&o(s.dirname(e),"library-parent");if(process.platform==="win32")for(const e of await h())o(e,"drive");else o(s.parse(a).root,"root");return r}export async function listDirectoryChildren(n){const r=(await p(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>({name:t.name,path:s.join(n,t.name)}));return r.sort((t,o)=>t.name.localeCompare(o.name,void 0,{numeric:!0})),r}
1
+ import{readdir as d,stat as l}from"node:fs/promises";import p from"node:os";import a from"node:path";function f(n,s){return new Promise((r,t)=>{const e=setTimeout(()=>t(new Error("timeout")),s);n.then(i=>{clearTimeout(e),r(i)},i=>{clearTimeout(e),t(i)})})}let c=null;const h=5*6e4;async function w(){if(c&&Date.now()-c.at<h)return c.drives;const n="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),r=(await Promise.all(n.map(async t=>{const e=`${t}:\\`;try{return await f(l(e),4e3),e}catch{return null}}))).filter(t=>t!==null);return c={at:Date.now(),drives:r},r}export async function listBrowseRoots(n){const s=[],r=new Set,t=(o,m)=>{r.has(o)||(r.add(o),s.push({path:o,kind:m}))},e=p.homedir();t(e,"home");const i=[["Desktop","desktop"],["Downloads","downloads"],["Documents","documents"]];for(const[o,m]of i){const u=a.join(e,o);try{await l(u),t(u,m)}catch{}}for(const o of n)typeof o=="string"&&o&&t(a.dirname(o),"library-parent");if(process.platform==="win32")for(const o of await w())t(o,"drive");else t(a.parse(e).root,"root");return s}export async function listDirectoryChildren(n){const r=(await d(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>({name:t.name,path:a.join(n,t.name)}));return r.sort((t,e)=>t.name.localeCompare(e.name,void 0,{numeric:!0})),r}
@@ -43,6 +43,8 @@ export interface HookPipelineDeps {
43
43
  uploads?: {
44
44
  linkToEvent(eventId: number, uploadIds: readonly string[]): void;
45
45
  };
46
+ /** 终端拓扑即时对账(会话退出后立刻摘出终端分组,不等 30s 周期)。 */
47
+ terminalTopologyKick?: () => void;
46
48
  }
47
49
  /** 删除一个项目的全部管道文件(忽略不存在)。删项目路由落地时一行调用。 */
48
50
  export declare function purgeProjectPipeline(hooksDir: string, token: string): void;
@@ -1 +1 @@
1
- import{readdirSync as u,unlinkSync as c}from"node:fs";import{join as a}from"node:path";import{getDbPath as f}from"../db/paths.js";import{MirrorWriter as d,hookShardId as p,hooksRoot as m,mirrorPathOf as b,outboxPathOf as k}from"../hooks/mirror.js";import{promptboxPathOf as g}from"../hooks/promptbox.js";import{startInboxWorker as x,handleIngestedRecords as P,unparkFailedInbox as j,INBOX_CLAIM_SUFFIX as h,INBOX_FAILED_SUFFIX as l}from"../hooks/inbox-worker.js";function $(e,s){return[a(e,"inbox",`${s}.jsonl`),a(e,"inbox",`${s}${h}`),a(e,"inbox",`${s}${l}`),b(e,s),k(e,s),g(e,s)]}export function purgeProjectPipeline(e,s){for(const r of $(e,p(s)))try{c(r)}catch{}}function w(e){return(e.endsWith(".tmp")?e.slice(0,-4):e).replace(new RegExp(`(${h}|${l})$`),"").replace(/\.(jsonl|json)$/,"")}const y=/^[0-9a-f]{16}$/;export function purgeOrphanPipelineFiles(e){const s=new Set(e.projects.list().map(t=>p(t.token)));let r=0;for(const t of["inbox","mirror","outbox","promptbox"]){let n;try{n=u(a(e.hooksDir,t))}catch{continue}for(const i of n){const o=w(i);if(!(!y.test(o)||s.has(o)))try{c(a(e.hooksDir,t,i)),r++}catch{}}}return r}export function wireHookFilePipeline(e){const s=m(),r=purgeOrphanPipelineFiles({projects:e.projects,hooksDir:s});r>0&&console.log(`[weave] hook pipeline: purged ${r} orphan file(s)`);const t=j(s);t>0&&console.log(`[weave] hook pipeline: revived ${t} parked inbox file(s)`);const n=new d({projects:e.projects,rules:e.rules,sessions:e.sessions});e.rules.onChange=()=>n.syncAll(),n.attachToBus(e.bus),n.syncAll();const i=x({dbPath:f(),hooksDir:s});return i.on("message",o=>{P({projects:e.projects,hooksDir:s,bus:e.bus,dispatcher:e.dispatcher,watchEngine:e.watchEngine,orchestrationEngine:e.orchestrationEngine,messagePipe:e.messagePipe,questionTracker:e.questionTracker,sideQuestions:e.sideQuestions,dashboardRate:e.dashboardRate,sessionProbe:e.sessionProbe,uploads:e.uploads},o)}),i.on("error",o=>console.error("[weave] inbox worker failed:",o)),{mirror:n,pushSyntheticSessions:o=>i.postMessage({type:"synthetic-sessions",ids:o}),stop:()=>i.terminate().then(()=>{})}}
1
+ import{readdirSync as m,unlinkSync as a}from"node:fs";import{join as c}from"node:path";import{getDbPath as h}from"../db/paths.js";import{MirrorWriter as b,hookShardId as l,hooksRoot as g,mirrorPathOf as x,outboxPathOf as k}from"../hooks/mirror.js";import{promptboxPathOf as P}from"../hooks/promptbox.js";import{messagingSurfaceFor as S}from"../surfaces.js";import{startInboxWorker as j,handleIngestedRecords as y,unparkFailedInbox as $,INBOX_CLAIM_SUFFIX as p,INBOX_FAILED_SUFFIX as u}from"../hooks/inbox-worker.js";function v(o,e){return[c(o,"inbox",`${e}.jsonl`),c(o,"inbox",`${e}${p}`),c(o,"inbox",`${e}${u}`),x(o,e),k(o,e),P(o,e)]}export function purgeProjectPipeline(o,e){for(const n of v(o,l(e)))try{a(n)}catch{}}function w(o){return(o.endsWith(".tmp")?o.slice(0,-4):o).replace(new RegExp(`(${p}|${u})$`),"").replace(/\.(jsonl|json)$/,"")}const F=/^[0-9a-f]{16}$/;export function purgeOrphanPipelineFiles(o){const e=new Set(o.projects.list().map(t=>l(t.token)));let n=0;for(const t of["inbox","mirror","outbox","promptbox"]){let i;try{i=m(c(o.hooksDir,t))}catch{continue}for(const s of i){const r=w(s);if(!(!F.test(r)||e.has(r)))try{a(c(o.hooksDir,t,s)),n++}catch{}}}return n}export function wireHookFilePipeline(o){const e=g(),n=purgeOrphanPipelineFiles({projects:o.projects,hooksDir:e});n>0&&console.log(`[weave] hook pipeline: purged ${n} orphan file(s)`);const t=$(e);t>0&&console.log(`[weave] hook pipeline: revived ${t} parked inbox file(s)`);const i=new b({projects:o.projects,rules:o.rules,sessions:o.sessions});o.rules.onChange=()=>i.syncAll(),i.attachToBus(o.bus),i.syncAll();const s=j({dbPath:h(),hooksDir:e});return s.on("message",r=>{y({projects:o.projects,hooksDir:e,bus:o.bus,dispatcher:o.dispatcher,watchEngine:o.watchEngine,orchestrationEngine:o.orchestrationEngine,messagePipe:o.messagePipe,questionTracker:o.questionTracker,sideQuestions:o.sideQuestions,dashboardRate:o.dashboardRate,sessionProbe:o.sessionProbe,uploads:o.uploads,terminalTopologyKick:o.terminalTopologyKick,paneEnvSource:f=>S(f).paneEnvSource},r)}),s.on("error",r=>console.error("[weave] inbox worker failed:",r)),{mirror:i,pushSyntheticSessions:r=>s.postMessage({type:"synthetic-sessions",ids:r}),stop:()=>s.terminate().then(()=>{})}}
@@ -1 +1 @@
1
- import{z as f}from"zod";import{HARNESS_SESSION_CONTROL as E,isHarness as C}from"@weavecode/core";import{aliasOfModel as j,modelAliasTargets as D}from"@weavecode/harness";import{readJson as I,sendJson as t}from"./http.js";import{purgeSession as O}from"../hooks/session-purge.js";import{readDaemonSettingsSync as A,readHooksEnabled as M}from"./settings.js";import{handleOrchestrationRoutes as W}from"./routes/orchestration.js";import{handleHookAdminRoutes as H}from"./routes/hooks-admin.js";import{handleUploadRoutes as q}from"./routes/uploads.js";import{handleSessionControlRoutes as U}from"./routes/session-control.js";import{handlePathRefRoutes as N}from"./routes/path-refs.js";import{handleSessionInsightRoutes as $}from"./routes/session-insights.js";import{handleWatchRoutes as K}from"./routes/watches.js";import{openSessionTerminal as B,transcriptState as G}from"./session-open.js";import{claudeLivenessById as T,pidAliveOf as w}from"./claude-liveness.js";import{captureSurfaces as L,messagingSurfaces as Q}from"../surfaces.js";import{getDataDir as V}from"../db/paths.js";import{WEAVE_VERSION as _}from"../version.js";const J=f.object({title:f.string().min(1).max(200)}),z=f.object({text:f.string().max(2e4),fromKind:f.enum(["dashboard","session"]).optional(),fromSessionId:f.string().min(1).nullable().optional(),attachments:f.array(f.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),images:f.array(f.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),forceTerminal:f.boolean().optional()});function F(i,s){return i.queuedPrompt!==null||i.prompt!==null||s}function X(i){const{diag:s,capture:e,eventCount:r}=i,l=[];return!e||e.source==="none"||!e.present?l.push("no-hook-script"):e.weaveOwned?!e.reportsInbox&&s?.inbox.reason!=="no-mechanism"&&l.push("hook-script-stale"):l.push("hook-script-not-weave"),r===0&&l.push("no-events"),s&&(s.alive===!1&&l.push("not-running"),s.inbox.reason==="no-credentials"&&e?.reportsInbox===!0&&l.push("no-inbox-credentials"),s.inbox.reason==="auth-token-required"&&l.push("inbox-token-required"),s.relay.reason==="no-peer-name"&&l.push("no-peer-name"),s.terminal.reason==="no-backend"&&l.push("terminal-no-backend"),s.terminal.reason==="no-pane-env"&&l.push("terminal-no-pane-env"),s.pending>0&&l.push("queued"),s.stalled&&l.push("stalled")),l}export async function handleHooksRoutes(i,s,e,r,l){if(!(r.startsWith("/hooks/")||r==="/dashboard/refresh"||r==="/sessions"||r.startsWith("/sessions/")||r.startsWith("/messaging")||r.startsWith("/webhooks/orchestrate/")||r==="/uploads"||r.startsWith("/uploads/")||r.startsWith("/images/")))return!1;if(await H(i,s,e,r,l))return!0;if(r==="/dashboard/refresh"&&i.method==="POST")return e.dashboardRefresh?.(),t(s,200,{ok:!0}),!0;if(r==="/sessions"&&i.method==="GET"){if(!e.hookSessions)return t(s,503,{error:"Hooks subsystem unavailable"}),!0;const n=l.searchParams.get("projectId"),a=n!=null&&n!==""?Number(n):void 0,o=e.hookSessions.listWithCounts(a),p=T(),c=e.terminalRefresher?.lastSnapshot?.terminals??{},h={};for(const m of o){const g=m.harness??"";g in h||(h[g]=D(E[m.harness]?.modelNames??[]))}return t(s,200,{sessions:o.map(m=>{const g=e.sessionProbe?.currentModel(m.sessionId)??null,d=e.sessionProbe?.transcriptPresent(m.sessionId)??null,u=C(m.harness)?e.harnesses?.get(m.harness)?.resume:void 0;return{...m,pidAlive:w(m,p),canOpenTerminal:!!(u?.supported&&u.openArgs),terminal:c[m.sessionId]??null,interruptedAt:m.turnOpen===!0?e.sessionProbe?.interruptedAt(m.sessionId,m.lastSeenAt)??null:null,model:g,modelAlias:j(h[m.harness??""]??[],g),mode:e.sessionProbe?.currentMode(m.sessionId)??null,effort:e.sessionProbe?.currentEffort(m.sessionId)??null,contextTokens:e.sessionProbe?.currentContextTokens(m.sessionId)??null,transcriptPresent:G(d,m.hasRun)}}),modelCatalog:h}),!0}const v=r.match(/^\/sessions\/([^/]+)$/);if(v&&i.method==="PATCH"){if(!e.hookSessions)return t(s,503,{error:"Hooks subsystem unavailable"}),!0;const n=decodeURIComponent(v[1]);if(!e.hookSessions.getBySessionId(n))return t(s,404,{error:"Session not found"}),!0;try{const a=J.parse(await I(i)),o=e.hookSessions.setPendingTitle(n,a.title);o?.projectId!=null&&e.hookMirror?.syncProject(o.projectId),t(s,200,{session:o})}catch(a){t(s,400,{error:a instanceof Error?a.message:"Invalid body"})}return!0}if(v&&i.method==="DELETE"){if(!e.hookSessions||!e.hookEvents)return t(s,503,{error:"Hooks subsystem unavailable"}),!0;const n=decodeURIComponent(v[1]),a=e.hookSessions.getBySessionId(n);if(!a)return t(s,404,{error:"Session not found"}),!0;const o=O({sessions:e.hookSessions,events:e.hookEvents,dispatches:e.hookDispatches,deliverer:e.messageDeliverer,watches:e.sessionWatches,orchestrations:e.orchestrations,questions:e.questionTracker,sideQuestions:e.sideQuestions?.repo,probe:e.sessionProbe,uploads:e.uploads},n);return a.projectId!=null&&e.hookMirror?.syncProject(a.projectId),t(s,200,{ok:!0,sessionId:n,...o}),!0}const S=r.match(/^\/sessions\/([^/]+)\/open-terminal$/);if(S&&i.method==="POST"){const n=decodeURIComponent(S[1]);let a;try{const p=await I(i);typeof p?.target=="string"&&p.target&&(a=p.target)}catch{}const o=await B(e,n,a);return o.ok?(t(s,200,{ok:!0,sessionId:o.sessionId,command:o.command,cwd:o.cwd,...o.target?{target:o.target}:{}}),!0):(t(s,o.status,{error:o.error}),!0)}if(await q(i,s,e,r,l))return!0;const y=r.match(/^\/sessions\/([^/]+)\/messages$/);if(y){const n=decodeURIComponent(y[1]);if(i.method==="GET")return e.messageDeliverer?e.hookSessions?.getBySessionId(n)?(t(s,200,{messages:e.messageDeliverer.listVisible(n)}),!0):(t(s,404,{error:"Session not found"}),!0):(t(s,503,{error:"Messaging subsystem unavailable"}),!0);if(i.method==="POST"){if(!e.messageDeliverer||!e.hookSessions)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;let a;try{a=z.parse(await I(i))}catch(h){return t(s,400,{error:h instanceof Error?h.message:"Invalid body"}),!0}const o=[...a.attachments??[],...a.images??[]];if(!a.text.trim()&&o.length===0)return t(s,400,{error:"Message is empty"}),!0;let p=[];if(o.length>0){const h=e.uploads?.refsOf(o)??null;if(!h)return t(s,404,{error:"Attachment not found"}),!0;p=h}const c=await e.messageDeliverer.send({toSessionId:n,text:a.text,...p.length>0?{attachments:p}:{},...a.forceTerminal===!0?{forceTerminal:!0}:{},mode:"prompt",fromKind:a.fromKind??"dashboard",fromSessionId:a.fromSessionId??null,oneWay:!0});return c.ok?t(s,201,{ok:!0,messageId:c.messageId,status:c.status,message:c.message}):t(s,c.status,{error:c.error}),!0}}if(await $(i,s,e,r,l)||await N(i,s,e,r,l))return!0;const R=r.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/resend$/);if(R&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const n=await e.messageDeliverer.resend(decodeURIComponent(R[2]));return n.ok?t(s,200,{ok:!0,messageId:n.messageId,status:n.status,message:n.message}):t(s,n.status,{error:n.error}),!0}const k=r.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/dismiss$/);if(k&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const n=e.messageDeliverer.dismiss(decodeURIComponent(k[1]),decodeURIComponent(k[2]));return n.ok?t(s,200,{ok:!0}):t(s,n.status,{error:n.error}),!0}if(await U(i,s,e,r,l)||await K(i,s,e,r)||await W(i,s,e,r,l))return!0;if(r==="/messaging/capabilities"&&i.method==="GET"){const n=e.messageDeliverer?.hasTerminalChannel()??!1;return t(s,200,{capabilities:Q().map(({harness:a,surface:o})=>({harness:a,discovery:o.discovery,prompt:F(o,n),inject:o.inject!==null,headless:o.headless!==null,watch:o.idleSignals.length>0,attachKinds:o.attach?.kinds??[],pathRefs:o.pathRefs!==null,pathRefLines:o.pathRefs?.lines===!0,pathRefKinds:o.pathRefs?.kinds??[],sideQuestion:o.sideQuestion!==null,unsupportedReasons:o.unsupportedReasons??null}))}),!0}if(r==="/messaging/diagnostics"&&i.method==="GET"){if(!e.messageDeliverer||!e.hookSessions)return t(s,503,{error:"Message subsystem unavailable"}),!0;const n=l.searchParams.get("session"),a=l.searchParams.get("project"),o=L(),p=e.projects.list(),c=await Promise.all(p.map(async d=>({id:d.id,name:d.name,path:d.path,captures:await Promise.all(o.map(async({harness:u,surface:b})=>({harness:u,...await b.scriptHealth({projectPath:d.path})})))}))),h=(d,u)=>c.find(b=>b.id===d)?.captures.find(b=>b.harness===u)??null,m=T(),g=e.hookSessions.listWithCounts(n?void 0:a?Number(a):void 0).filter(d=>n?d.sessionId===n:w(d,m)!==!1).map(d=>{const u=e.messageDeliverer.diagnose(d.sessionId),b=h(d.projectId,d.harness??null),P={inbox:u.inbox,queue:u.queue,relay:u.relay,terminal:u.terminal};return{sessionId:d.sessionId,projectId:d.projectId,harness:d.harness??null,title:d.title,lastSeenAt:d.lastSeenAt,eventCount:d.eventCount??0,lastEventType:d.lastEventType??null,alive:u.alive,paneEnvReported:u.paneEnvReported,channels:P,queue:{pending:u.pending,stalled:u.stalled},reachable:Object.values(P).some(x=>x.status==="ready"),hints:X({diag:u,capture:b,eventCount:d.eventCount??0})}});return t(s,200,{daemon:{version:_,platform:process.platform,dataDir:V(),uptimeMs:Math.round(process.uptime()*1e3),terminalPreset:A().terminal.preset,terminalTextChannel:e.messageDeliverer.hasTerminalChannel(),hooksEnabled:M()},projects:c,sessions:g}),!0}return!1}
1
+ import{z as g}from"zod";import{HARNESS_SESSION_CONTROL as x,isHarness as P}from"@weavecode/core";import{aliasOfModel as O,modelAliasTargets as M}from"@weavecode/harness";import{readJson as k,sendJson as n}from"./http.js";import{purgeSession as D}from"../hooks/session-purge.js";import{readDaemonSettingsSync as A,readHooksEnabled as H}from"./settings.js";import{handleOrchestrationRoutes as W}from"./routes/orchestration.js";import{handleHookAdminRoutes as U}from"./routes/hooks-admin.js";import{handleUploadRoutes as N}from"./routes/uploads.js";import{handleSessionControlRoutes as $}from"./routes/session-control.js";import{handlePathRefRoutes as B}from"./routes/path-refs.js";import{handleSessionInsightRoutes as K}from"./routes/session-insights.js";import{handleWatchRoutes as G}from"./routes/watches.js";import{openSessionTerminal as L,transcriptState as Q}from"./session-open.js";import{pidAliveOf as j}from"./claude-liveness.js";import{combinedLivenessOf as E}from"./liveness.js";import{captureSurfaces as _,messagingSurfaces as F,sessionTitleSurfaceFor as V}from"../surfaces.js";import{getDataDir as J}from"../db/paths.js";import{WEAVE_VERSION as z}from"../version.js";const X=g.object({title:g.string().min(1).max(200)}),Y=g.object({text:g.string().max(2e4),fromKind:g.enum(["dashboard","session"]).optional(),fromSessionId:g.string().min(1).nullable().optional(),attachments:g.array(g.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),images:g.array(g.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),forceTerminal:g.boolean().optional()});function Z(a,s){return a.queuedPrompt!==null||a.prompt!==null||s}function q(a){const{diag:s,capture:e,eventCount:i}=a,l=[];return!e||e.source==="none"||!e.present?l.push("no-hook-script"):e.weaveOwned?!e.reportsInbox&&s?.inbox.reason!=="no-mechanism"&&l.push("hook-script-stale"):l.push("hook-script-not-weave"),i===0&&l.push("no-events"),s&&(s.alive===!1&&l.push("not-running"),s.inbox.reason==="no-credentials"&&e?.reportsInbox===!0&&l.push("no-inbox-credentials"),s.inbox.reason==="auth-token-required"&&l.push("inbox-token-required"),s.relay.reason==="no-peer-name"&&l.push("no-peer-name"),s.terminal.reason==="no-backend"&&l.push("terminal-no-backend"),s.terminal.reason==="no-pane-env"&&l.push("terminal-no-pane-env"),s.pending>0&&l.push("queued"),s.stalled&&l.push("stalled")),l}export async function handleHooksRoutes(a,s,e,i,l){if(!(i.startsWith("/hooks/")||i==="/dashboard/refresh"||i==="/sessions"||i.startsWith("/sessions/")||i.startsWith("/messaging")||i.startsWith("/webhooks/orchestrate/")||i==="/uploads"||i.startsWith("/uploads/")||i.startsWith("/images/")))return!1;if(await U(a,s,e,i,l))return!0;if(i==="/dashboard/refresh"&&a.method==="POST")return e.dashboardRefresh?.(),n(s,200,{ok:!0}),!0;if(i==="/sessions"&&a.method==="GET"){if(!e.hookSessions)return n(s,503,{error:"Hooks subsystem unavailable"}),!0;const t=l.searchParams.get("projectId"),r=t!=null&&t!==""?Number(t):void 0,o=e.hookSessions.listWithCounts(r),d=E(),h=e.terminalRefresher?.lastSnapshot?.terminals??{},m={};for(const u of o){const p=u.harness??"";p in m||(m[p]=M(x[u.harness]?.modelNames??[]))}return n(s,200,{sessions:o.map(u=>{const p=e.sessionProbe?.currentModel(u.sessionId)??null,S=e.sessionProbe?.transcriptPresent(u.sessionId)??null,c=P(u.harness)?e.harnesses?.get(u.harness)?.resume:void 0;return{...u,pidAlive:j(u,d),canOpenTerminal:!!(c?.supported&&c.openArgs),terminal:h[u.sessionId]??null,interruptedAt:u.turnOpen===!0?e.sessionProbe?.interruptedAt(u.sessionId,u.lastSeenAt)??null:null,model:p,modelAlias:O(m[u.harness??""]??[],p),mode:e.sessionProbe?.currentMode(u.sessionId)??null,effort:e.sessionProbe?.currentEffort(u.sessionId)??null,contextTokens:e.sessionProbe?.currentContextTokens(u.sessionId)??null,transcriptPresent:Q(S,u.hasRun)}}),modelCatalog:m}),!0}const v=i.match(/^\/sessions\/([^/]+)$/);if(v&&a.method==="PATCH"){if(!e.hookSessions)return n(s,503,{error:"Hooks subsystem unavailable"}),!0;const t=decodeURIComponent(v[1]);if(!e.hookSessions.getBySessionId(t))return n(s,404,{error:"Session not found"}),!0;try{const r=X.parse(await k(a)),o=e.hookEvents?.listBySession(t,1),d=o?.[o.length-1]?.source,h=P(d)?V(d):null;if(h){try{await h.setSessionTitle(t,r.title)}catch(p){return n(s,502,{error:p instanceof Error?p.message:"Host rename failed"}),!0}const u=e.hookSessions.setTitle(t,r.title);return u?.projectId!=null&&e.hookMirror?.syncProject(u.projectId),n(s,200,{session:u}),!0}const m=e.hookSessions.setPendingTitle(t,r.title);m?.projectId!=null&&e.hookMirror?.syncProject(m.projectId),n(s,200,{session:m})}catch(r){n(s,400,{error:r instanceof Error?r.message:"Invalid body"})}return!0}if(v&&a.method==="DELETE"){if(!e.hookSessions||!e.hookEvents)return n(s,503,{error:"Hooks subsystem unavailable"}),!0;const t=decodeURIComponent(v[1]),r=e.hookSessions.getBySessionId(t);if(!r)return n(s,404,{error:"Session not found"}),!0;const o=D({sessions:e.hookSessions,events:e.hookEvents,dispatches:e.hookDispatches,deliverer:e.messageDeliverer,watches:e.sessionWatches,orchestrations:e.orchestrations,questions:e.questionTracker,sideQuestions:e.sideQuestions?.repo,probe:e.sessionProbe,uploads:e.uploads},t);return r.projectId!=null&&e.hookMirror?.syncProject(r.projectId),n(s,200,{ok:!0,sessionId:t,...o}),!0}const y=i.match(/^\/sessions\/([^/]+)\/open-terminal$/);if(y&&a.method==="POST"){const t=decodeURIComponent(y[1]);let r;try{const d=await k(a);typeof d?.target=="string"&&d.target&&(r=d.target)}catch{}const o=await L(e,t,r);return o.ok?(n(s,200,{ok:!0,sessionId:o.sessionId,command:o.command,cwd:o.cwd,...o.target?{target:o.target}:{}}),!0):(n(s,o.status,{error:o.error}),!0)}if(await N(a,s,e,i,l))return!0;const R=i.match(/^\/sessions\/([^/]+)\/messages$/);if(R){const t=decodeURIComponent(R[1]);if(a.method==="GET")return e.messageDeliverer?e.hookSessions?.getBySessionId(t)?(n(s,200,{messages:e.messageDeliverer.listVisible(t)}),!0):(n(s,404,{error:"Session not found"}),!0):(n(s,503,{error:"Messaging subsystem unavailable"}),!0);if(a.method==="POST"){if(!e.messageDeliverer||!e.hookSessions)return n(s,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=Y.parse(await k(a))}catch(m){return n(s,400,{error:m instanceof Error?m.message:"Invalid body"}),!0}const o=[...r.attachments??[],...r.images??[]];if(!r.text.trim()&&o.length===0)return n(s,400,{error:"Message is empty"}),!0;let d=[];if(o.length>0){const m=e.uploads?.refsOf(o)??null;if(!m)return n(s,404,{error:"Attachment not found"}),!0;d=m}const h=await e.messageDeliverer.send({toSessionId:t,text:r.text,...d.length>0?{attachments:d}:{},...r.forceTerminal===!0?{forceTerminal:!0}:{},mode:"prompt",fromKind:r.fromKind??"dashboard",fromSessionId:r.fromSessionId??null,oneWay:!0});return h.ok?n(s,201,{ok:!0,messageId:h.messageId,status:h.status,message:h.message}):n(s,h.status,{error:h.error}),!0}}if(await K(a,s,e,i,l)||await B(a,s,e,i,l))return!0;const w=i.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/resend$/);if(w&&a.method==="POST"){if(!e.messageDeliverer)return n(s,503,{error:"Messaging subsystem unavailable"}),!0;const t=await e.messageDeliverer.resend(decodeURIComponent(w[2]));return t.ok?n(s,200,{ok:!0,messageId:t.messageId,status:t.status,message:t.message}):n(s,t.status,{error:t.error}),!0}const I=i.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/dismiss$/);if(I&&a.method==="POST"){if(!e.messageDeliverer)return n(s,503,{error:"Messaging subsystem unavailable"}),!0;const t=e.messageDeliverer.dismiss(decodeURIComponent(I[1]),decodeURIComponent(I[2]));return t.ok?n(s,200,{ok:!0}):n(s,t.status,{error:t.error}),!0}if(await $(a,s,e,i,l)||await G(a,s,e,i)||await W(a,s,e,i,l))return!0;if(i==="/messaging/capabilities"&&a.method==="GET"){const t=e.messageDeliverer?.hasTerminalChannel()??!1;return n(s,200,{capabilities:F().map(({harness:r,surface:o})=>({harness:r,discovery:o.discovery,prompt:Z(o,t),inject:o.inject!==null,headless:o.headless!==null,watch:o.idleSignals.length>0,attachKinds:o.attach?.kinds??[],pathRefs:o.pathRefs!==null,pathRefLines:o.pathRefs?.lines===!0,pathRefKinds:o.pathRefs?.kinds??[],sideQuestion:o.sideQuestion!==null,unsupportedReasons:o.unsupportedReasons??null}))}),!0}if(i==="/messaging/diagnostics"&&a.method==="GET"){if(!e.messageDeliverer||!e.hookSessions)return n(s,503,{error:"Message subsystem unavailable"}),!0;const t=l.searchParams.get("session"),r=l.searchParams.get("project"),o=_(),d=e.projects.list(),h=await Promise.all(d.map(async c=>({id:c.id,name:c.name,path:c.path,captures:await Promise.all(o.map(async({harness:f,surface:b})=>({harness:f,...await b.scriptHealth({projectPath:c.path})})))}))),m=(c,f)=>h.find(b=>b.id===c)?.captures.find(b=>b.harness===f)??null,u=E(),S=e.hookSessions.listWithCounts(t?void 0:r?Number(r):void 0).filter(c=>t?c.sessionId===t:j(c,u)!==!1).map(c=>{const f=e.messageDeliverer.diagnose(c.sessionId),b=m(c.projectId,c.harness??null),T={inbox:f.inbox,queue:f.queue,relay:f.relay,terminal:f.terminal};return{sessionId:c.sessionId,projectId:c.projectId,harness:c.harness??null,title:c.title,lastSeenAt:c.lastSeenAt,eventCount:c.eventCount??0,lastEventType:c.lastEventType??null,alive:f.alive,paneEnvReported:f.paneEnvReported,channels:T,queue:{pending:f.pending,stalled:f.stalled},reachable:Object.values(T).some(C=>C.status==="ready"),hints:q({diag:f,capture:b,eventCount:c.eventCount??0})}});return n(s,200,{daemon:{version:z,platform:process.platform,dataDir:J(),uptimeMs:Math.round(process.uptime()*1e3),terminalPreset:A().terminal.preset,terminalTextChannel:e.messageDeliverer.hasTerminalChannel(),hooksEnabled:H()},projects:h,sessions:S}),!0}return!1}
@@ -1 +1 @@
1
- import{noteRequestBody as d}from"./api-log.js";export function readBody(o){return new Promise((t,r)=>{const n=[];o.on("data",e=>n.push(e)),o.on("end",()=>{const e=Buffer.concat(n).toString("utf8");d(o,e),t(e)}),o.on("error",r)})}export async function readJson(o){return JSON.parse(await readBody(o))}export function readRawBody(o,t){return new Promise((r,n)=>{const e=[];let a=0;o.on("data",s=>{if(a+=s.length,a>t){o.destroy(),n(new Error("body too large"));return}e.push(s)}),o.on("end",()=>r(Buffer.concat(e))),o.on("error",n)})}export function sendJson(o,t,r){o.statusCode=t,o.setHeader("content-type","application/json"),o.end(JSON.stringify(r))}
1
+ import{noteRequestBody as u}from"./api-log.js";export function readBody(n){return new Promise((t,e)=>{const r=[];n.on("data",o=>r.push(o)),n.on("end",()=>{const o=Buffer.concat(r).toString("utf8");u(n,o),t(o)}),n.on("error",e)})}export async function readJson(n){return JSON.parse(await readBody(n))}export function readRawBody(n,t){return new Promise((e,r)=>{const o=[];let a=0;n.on("data",s=>{if(a+=s.length,a>t){n.destroy(),r(new Error("body too large"));return}o.push(s)}),n.on("end",()=>e(Buffer.concat(o))),n.on("error",r)})}export function sendJson(n,t,e){n.statusCode=t,n.setHeader("content-type","application/json"),n.end(JSON.stringify(e))}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 全 harness 合并存活图:claude 现算 + codex 缓存。两实现只输出判得动的
3
+ * 条目,「查不到」当未知——消费方 `pidAliveOf` 的三态合成不受影响。
4
+ */
5
+ export declare function combinedLivenessOf(): Map<string, boolean>;
6
+ /** 测试用:清 codex 缓存与刷新循环状态。 */
7
+ export declare function resetCombinedLivenessForTest(): void;
@@ -0,0 +1 @@
1
+ import{claudeLivenessById as s}from"./claude-liveness.js";import{codexLivenessById as c}from"@weavecode/harness";const i=15e3;let o=new Map;async function a(n){try{o=await c(void 0,n)}catch{}}let e=null;function f(){e||(e=setInterval(()=>{a(Date.now())},i),e.unref())}export function combinedLivenessOf(){f();const n=s();for(const[t,r]of o)n.set(t,r);return n}export function resetCombinedLivenessForTest(){e&&(clearInterval(e),e=null),o=new Map}
@@ -1 +1 @@
1
- import{Server as g}from"@modelcontextprotocol/sdk/server/index.js";import{StreamableHTTPServerTransport as b}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{CallToolRequestSchema as f,ListToolsRequestSchema as S}from"@modelcontextprotocol/sdk/types.js";import{readBody as j,sendJson as w}from"./http.js";async function a(t,s,e,r){const n=await fetch(`http://127.0.0.1:${t.port}/api${e}`,{method:s,headers:{...t.token?{"x-weave-local":t.token}:{},...r===void 0?{}:{"content-type":"application/json"}},...r===void 0?{}:{body:JSON.stringify(r)}}),i=await n.text(),p=(()=>{try{return JSON.parse(i)}catch{return{raw:i}}})();if(!n.ok){const l=p&&typeof p=="object"&&"error"in p?String(p.error):`HTTP ${n.status}`;throw new Error(l)}return p}const d=t=>{const s=new URLSearchParams;for(const[r,n]of Object.entries(t))n!==void 0&&n!==""&&s.set(r,String(n));const e=s.toString();return e?`?${e}`:""},u={type:"object",required:["id","kind"],properties:{id:{type:"string",description:'session id, or "w:<uuid>" for a webhook node'},kind:{type:"string",enum:["session","webhook"]},webhookToken:{type:"string"},url:{type:"string",description:"webhook exit: outbound URL"},secret:{type:"string",description:"webhook exit: optional HMAC secret"}}},m={type:"object",required:["id","from","to","text"],properties:{id:{type:"string"},from:{type:"string"},to:{type:"string"},text:{type:"string",description:"message body; {upstream}/{summary}/{session} are substituted"},extract:{type:"string",description:"optional extraction prompt for {summary}"}}},c={type:"object",additionalProperties:!0},y={type:"object",additionalProperties:!0},I=[{name:"list_orchestrations",description:"List orchestrations (optionally by project). Returns { orchestrations: OrchestrationRow[] }; each row has id/name/projectId/startText/nodes/edges/enabled/cron/nextRunAt.",inputSchema:{type:"object",properties:{projectId:{type:"number"}}},outputSchema:{type:"object",properties:{orchestrations:{type:"array",items:c}},required:["orchestrations"]}},{name:"get_orchestration",description:"Get one orchestration definition (nodes, edges, startText, cron, enabled). Returns { orchestration }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{orchestration:c},required:["orchestration"]}},{name:"create_orchestration",description:"Create an orchestration. enabled defaults to true, which makes the entry session auto-fire the graph on EVERY natural turn \u2014 pass enabled:false when the run should be triggered manually. Edges support {upstream}/{summary}/{session}; a cycle is rejected. Returns { ok, orchestration }.",inputSchema:{type:"object",required:["name","nodes","edges"],properties:{name:{type:"string"},startText:{type:"string",description:"first message for session entries (manual trigger)"},projectId:{type:"number",description:"webhook-only orchestrations"},nodes:{type:"array",items:u},edges:{type:"array",items:m},cron:{type:["string","null"]},enabled:{type:"boolean"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestration:c},required:["ok","orchestration"]}},{name:"update_orchestration",description:"Update part of an orchestration (omit fields to keep them; changing the graph does not affect a run already in flight). Returns { ok, orchestration }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"},name:{type:"string"},startText:{type:"string"},nodes:{type:"array",items:u},edges:{type:"array",items:m},cron:{type:["string","null"]},enabled:{type:"boolean"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestration:c},required:["ok","orchestration"]}},{name:"delete_orchestration",description:"Delete a definition. Run history (orchestration_runs) is kept. Returns { ok, orchestrationId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestrationId:{type:"number"}},required:["ok","orchestrationId"]}},{name:"trigger_orchestration",description:"Start a run. Manual trigger works even when enabled=false. Optional text overrides startText; entries restricts which entry nodes run. Dead target sessions are opened automatically, and delivery waits for their SessionStart. Returns { ok, runId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"},text:{type:"string"},entries:{type:"array",items:{type:"string"}}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},runId:{type:"number"}},required:["ok","runId"]}},{name:"list_runs",description:"List runs, newest first. Returns { runs: RunSummary[], nextBefore }. RunSummary has id/orchestrationId/name/status/deliveries/pendingCounts/createdAt.",inputSchema:{type:"object",properties:{orchestrationId:{type:"number"},projectId:{type:"number"},status:{type:"string"},limit:{type:"number"},before:{type:"number"}}},outputSchema:{type:"object",properties:{runs:{type:"array",items:y},nextBefore:{type:["number","null"]}},required:["runs"]}},{name:"get_run",description:'Get a run with state.events (deliveries and stage:"ensure" opens) and state.pending per session. Returns { run }. status becomes interrupted when the daemon restarts (runs are not resumed).',inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{run:y},required:["run"]}},{name:"cancel_run",description:"Cancel a running run. Returns { ok, runId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},runId:{type:"number"}},required:["ok","runId"]}},{name:"list_sessions",description:"List sessions for picking graph nodes; minimal fields only (sessionId/projectId/title/harness/lastSeenAt/turnOpen/pidAlive). Returns { sessions }.",inputSchema:{type:"object",properties:{projectId:{type:"number"}}},outputSchema:{type:"object",properties:{sessions:{type:"array",items:{type:"object",additionalProperties:!0}}},required:["sessions"]}}],o=t=>typeof t=="number"?t:void 0,h=t=>typeof t=="string"?t:void 0;async function k(t,s,e){switch(s){case"list_orchestrations":return a(t,"GET",`/messaging/orchestrations${d({projectId:o(e.projectId)})}`);case"get_orchestration":{const r=(await a(t,"GET","/messaging/orchestrations")).orchestrations.find(n=>n.id===o(e.id));if(!r)throw new Error(`Orchestration not found: ${String(e.id)}`);return{orchestration:r}}case"create_orchestration":return a(t,"POST","/messaging/orchestrations",{name:e.name,startText:e.startText,projectId:o(e.projectId),nodes:e.nodes,edges:e.edges,cron:e.cron??null,enabled:e.enabled});case"update_orchestration":{const r=o(e.id);return a(t,"PUT",`/messaging/orchestrations/${r}`,{...e.name===void 0?{}:{name:e.name},...e.startText===void 0?{}:{startText:e.startText},...e.nodes===void 0?{}:{nodes:e.nodes},...e.edges===void 0?{}:{edges:e.edges},...e.cron===void 0?{}:{cron:e.cron},...e.enabled===void 0?{}:{enabled:e.enabled}})}case"delete_orchestration":return a(t,"DELETE",`/messaging/orchestrations/${o(e.id)}`);case"trigger_orchestration":return a(t,"POST",`/messaging/orchestrations/${o(e.id)}/trigger`,{...h(e.text)?{text:e.text}:{},...Array.isArray(e.entries)?{entries:e.entries}:{}});case"list_runs":return a(t,"GET",`/messaging/orchestration-runs${d({orchestrationId:o(e.orchestrationId),projectId:o(e.projectId),status:h(e.status),limit:o(e.limit),before:o(e.before)})}`);case"get_run":return a(t,"GET",`/messaging/orchestration-runs/${o(e.id)}`);case"cancel_run":return a(t,"POST",`/messaging/orchestration-runs/${o(e.id)}/cancel`);case"list_sessions":return{sessions:(await a(t,"GET",`/sessions${d({projectId:o(e.projectId)})}`)).sessions.map(r=>({sessionId:r.sessionId,projectId:r.projectId,title:r.title,harness:r.harness,lastSeenAt:r.lastSeenAt,turnOpen:r.turnOpen,pidAlive:r.pidAlive}))};default:throw new Error(`Unknown tool: ${s}`)}}function x(t){const s=new g({name:"weave-orchestration",version:"0.1.0"},{capabilities:{tools:{}}});return s.setRequestHandler(S,async()=>({tools:I})),s.setRequestHandler(f,async e=>{const{name:r,arguments:n}=e.params;try{const i=await k(t,r,n??{});return{content:[{type:"text",text:JSON.stringify(i,null,2)}],structuredContent:i}}catch(i){return{isError:!0,content:[{type:"text",text:i instanceof Error?i.message:String(i)}]}}}),s}export async function handleMcpRequest(t,s,e){const r=x(e),n=new b({sessionIdGenerator:void 0,enableJsonResponse:!0});s.on("close",()=>{n.close(),r.close()}),await r.connect(n);let i;if(t.method==="POST"){const p=await j(t);try{i=p.trim()?JSON.parse(p):void 0}catch{w(s,400,{error:"Invalid JSON body"});return}}await n.handleRequest(t,s,i)}
1
+ import{Server as b}from"@modelcontextprotocol/sdk/server/index.js";import{StreamableHTTPServerTransport as f}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{CallToolRequestSchema as g,ListToolsRequestSchema as S}from"@modelcontextprotocol/sdk/types.js";import{readBody as j,sendJson as w}from"./http.js";async function a(t,n,e,o){const r=await fetch(`http://127.0.0.1:${t.port}/api${e}`,{method:n,headers:{...t.token?{"x-weave-local":t.token}:{},...o===void 0?{}:{"content-type":"application/json"}},...o===void 0?{}:{body:JSON.stringify(o)}}),s=await r.text(),p=(()=>{try{return JSON.parse(s)}catch{return{raw:s}}})();if(!r.ok){const l=p&&typeof p=="object"&&"error"in p?String(p.error):`HTTP ${r.status}`;throw new Error(l)}return p}const d=t=>{const n=new URLSearchParams;for(const[o,r]of Object.entries(t))r!==void 0&&r!==""&&n.set(o,String(r));const e=n.toString();return e?`?${e}`:""},u={type:"object",required:["id","kind"],properties:{id:{type:"string",description:'session id, or "w:<uuid>" for a webhook node'},kind:{type:"string",enum:["session","webhook"]},webhookToken:{type:"string"},url:{type:"string",description:"webhook exit: outbound URL"},secret:{type:"string",description:"webhook exit: optional HMAC secret"}}},m={type:"object",required:["id","from","to","text"],properties:{id:{type:"string"},from:{type:"string"},to:{type:"string"},text:{type:"string",description:"message body; {upstream}/{summary}/{session} are substituted"},extract:{type:"string",description:"optional extraction prompt for {summary}"}}},c={type:"object",additionalProperties:!0},h={type:"object",additionalProperties:!0},k=[{name:"list_orchestrations",description:"List orchestrations (optionally by project). Returns { orchestrations: OrchestrationRow[] }; each row has id/name/projectId/startText/nodes/edges/enabled/cron/nextRunAt.",inputSchema:{type:"object",properties:{projectId:{type:"number"}}},outputSchema:{type:"object",properties:{orchestrations:{type:"array",items:c}},required:["orchestrations"]}},{name:"get_orchestration",description:"Get one orchestration definition (nodes, edges, startText, cron, enabled). Returns { orchestration }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{orchestration:c},required:["orchestration"]}},{name:"create_orchestration",description:"Create an orchestration. enabled defaults to true, which makes the entry session auto-fire the graph on EVERY natural turn \u2014 pass enabled:false when the run should be triggered manually. Edges support {upstream}/{summary}/{session}; a cycle is rejected. Returns { ok, orchestration }.",inputSchema:{type:"object",required:["name","nodes","edges"],properties:{name:{type:"string"},startText:{type:"string",description:"first message for session entries (manual trigger)"},projectId:{type:"number",description:"webhook-only orchestrations"},nodes:{type:"array",items:u},edges:{type:"array",items:m},cron:{type:["string","null"]},enabled:{type:"boolean"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestration:c},required:["ok","orchestration"]}},{name:"update_orchestration",description:"Update part of an orchestration (omit fields to keep them; changing the graph does not affect a run already in flight). Returns { ok, orchestration }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"},name:{type:"string"},startText:{type:"string"},nodes:{type:"array",items:u},edges:{type:"array",items:m},cron:{type:["string","null"]},enabled:{type:"boolean"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestration:c},required:["ok","orchestration"]}},{name:"delete_orchestration",description:"Delete a definition. Run history (orchestration_runs) is kept. Returns { ok, orchestrationId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestrationId:{type:"number"}},required:["ok","orchestrationId"]}},{name:"trigger_orchestration",description:"Start a run. Manual trigger works even when enabled=false. Optional text overrides startText; entries restricts which entry nodes run. Dead target sessions are opened automatically, and delivery waits for their SessionStart. Returns { ok, runId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"},text:{type:"string"},entries:{type:"array",items:{type:"string"}}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},runId:{type:"number"}},required:["ok","runId"]}},{name:"list_runs",description:"List runs, newest first. Returns { runs: RunSummary[], nextBefore }. RunSummary has id/orchestrationId/name/status/deliveries/pendingCounts/createdAt.",inputSchema:{type:"object",properties:{orchestrationId:{type:"number"},projectId:{type:"number"},status:{type:"string"},limit:{type:"number"},before:{type:"number"}}},outputSchema:{type:"object",properties:{runs:{type:"array",items:h},nextBefore:{type:["number","null"]}},required:["runs"]}},{name:"get_run",description:'Get a run with state.events (deliveries and stage:"ensure" opens) and state.pending per session. Returns { run }. status becomes interrupted when the daemon restarts (runs are not resumed).',inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{run:h},required:["run"]}},{name:"cancel_run",description:"Cancel a running run. Returns { ok, runId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},runId:{type:"number"}},required:["ok","runId"]}},{name:"list_sessions",description:"List sessions for picking graph nodes; minimal fields only (sessionId/projectId/title/harness/lastSeenAt/turnOpen/pidAlive). Returns { sessions }.",inputSchema:{type:"object",properties:{projectId:{type:"number"}}},outputSchema:{type:"object",properties:{sessions:{type:"array",items:{type:"object",additionalProperties:!0}}},required:["sessions"]}}],i=t=>typeof t=="number"?t:void 0,y=t=>typeof t=="string"?t:void 0;async function I(t,n,e){switch(n){case"list_orchestrations":return a(t,"GET",`/messaging/orchestrations${d({projectId:i(e.projectId)})}`);case"get_orchestration":{const r=(await a(t,"GET","/messaging/orchestrations")).orchestrations.find(s=>s.id===i(e.id));if(!r)throw new Error(`Orchestration not found: ${String(e.id)}`);return{orchestration:r}}case"create_orchestration":return a(t,"POST","/messaging/orchestrations",{name:e.name,startText:e.startText,projectId:i(e.projectId),nodes:e.nodes,edges:e.edges,cron:e.cron??null,enabled:e.enabled});case"update_orchestration":{const o=i(e.id);return a(t,"PUT",`/messaging/orchestrations/${o}`,{...e.name===void 0?{}:{name:e.name},...e.startText===void 0?{}:{startText:e.startText},...e.nodes===void 0?{}:{nodes:e.nodes},...e.edges===void 0?{}:{edges:e.edges},...e.cron===void 0?{}:{cron:e.cron},...e.enabled===void 0?{}:{enabled:e.enabled}})}case"delete_orchestration":return a(t,"DELETE",`/messaging/orchestrations/${i(e.id)}`);case"trigger_orchestration":return a(t,"POST",`/messaging/orchestrations/${i(e.id)}/trigger`,{...y(e.text)?{text:e.text}:{},...Array.isArray(e.entries)?{entries:e.entries}:{}});case"list_runs":return a(t,"GET",`/messaging/orchestration-runs${d({orchestrationId:i(e.orchestrationId),projectId:i(e.projectId),status:y(e.status),limit:i(e.limit),before:i(e.before)})}`);case"get_run":return a(t,"GET",`/messaging/orchestration-runs/${i(e.id)}`);case"cancel_run":return a(t,"POST",`/messaging/orchestration-runs/${i(e.id)}/cancel`);case"list_sessions":return{sessions:(await a(t,"GET",`/sessions${d({projectId:i(e.projectId)})}`)).sessions.map(r=>({sessionId:r.sessionId,projectId:r.projectId,title:r.title,harness:r.harness,lastSeenAt:r.lastSeenAt,turnOpen:r.turnOpen,pidAlive:r.pidAlive}))};default:throw new Error(`Unknown tool: ${n}`)}}function T(t){const n=new b({name:"weave-orchestration",version:"0.1.0"},{capabilities:{tools:{}}});return n.setRequestHandler(S,async()=>({tools:k})),n.setRequestHandler(g,async e=>{const{name:o,arguments:r}=e.params;try{const s=await I(t,o,r??{});return{content:[{type:"text",text:JSON.stringify(s,null,2)}],structuredContent:s}}catch(s){return{isError:!0,content:[{type:"text",text:s instanceof Error?s.message:String(s)}]}}}),n}export async function handleMcpRequest(t,n,e){const o=T(e),r=new f({sessionIdGenerator:void 0,enableJsonResponse:!0});n.on("close",()=>{r.close(),o.close()}),await o.connect(r);let s;if(t.method==="POST"){const p=await j(t);try{s=p.trim()?JSON.parse(p):void 0}catch{w(n,400,{error:"Invalid JSON body"});return}}await r.handleRequest(t,n,s)}
@@ -0,0 +1,28 @@
1
+ import type { HookEventBus } from '../hooks/bus.js';
2
+ import type { NarrationSurface, NarrationText } from '@weavecode/harness';
3
+ /** 广播出去的一帧。 */
4
+ export interface NarrationUpdatedFrame {
5
+ kind: 'narration.updated';
6
+ sessionId: string;
7
+ /** 本拍新认出的段(时间序)。 */
8
+ segs: NarrationText[];
9
+ at: string;
10
+ }
11
+ export declare class NarrationWatcher {
12
+ private readonly bus;
13
+ private readonly surfaceOf;
14
+ private readonly pathOf;
15
+ private readonly harnessOf;
16
+ private readonly cursors;
17
+ private readonly timers;
18
+ private off;
19
+ constructor(bus: HookEventBus, surfaceOf: (harness: string) => NarrationSurface | null, pathOf: (sessionId: string) => string | null, harnessOf: (sessionId: string) => string | null);
20
+ /** 挂上 hookBus(daemon 装配时调一次)。 */
21
+ start(): void;
22
+ stop(): void;
23
+ private schedule;
24
+ /** 测试口:跳过 debounce 直接泵一次(装配不变)。 */
25
+ pumpForTest(sessionId?: string): Promise<void>;
26
+ /** 一拍:增量读该会话转录的新增字节,新段广播。 */
27
+ private pump;
28
+ }
@@ -0,0 +1,2 @@
1
+ import{openSync as p,readSync as m,closeSync as y,statSync as O}from"node:fs";const S=500;export class NarrationWatcher{bus;surfaceOf;pathOf;harnessOf;cursors=new Map;timers=new Map;off=null;constructor(t,e,o,n){this.bus=t,this.surfaceOf=e,this.pathOf=o,this.harnessOf=n}start(){this.off||(this.off=this.bus.subscribe(t=>{t.kind!=="event.ingested"||!t.sessionId||this.schedule(t.sessionId)}))}stop(){this.off?.(),this.off=null;for(const t of this.timers.values())clearTimeout(t);this.timers.clear()}schedule(t){this.timers.get(t)||this.timers.set(t,setTimeout(()=>{this.timers.delete(t),this.pump(t)},S))}pumpForTest(t="test"){return this.pump(t)}async pump(t){const e=this.harnessOf(t),n=(e?this.surfaceOf(e):null)?.lineParser,f=this.pathOf(t);if(!n||!f)return;let r;try{r=O(f).size}catch{this.cursors.delete(t);return}const s=this.cursors.get(t);if(!s||s.path!==f||r<s.offset){this.cursors.set(t,{offset:r,carry:"",path:f});return}if(r===s.offset)return;let h;const u=p(f,"r");try{const i=Buffer.alloc(r-s.offset);m(u,i,0,i.length,s.offset),h=i.toString("utf8")}catch{return}finally{y(u)}const a=(s.carry+h).split(`
2
+ `);s.carry=a.pop()??"",s.offset=r;const c=[];for(const i of a){const l=n(i);l&&c.push(l)}c.length>0&&this.bus.emit({kind:"narration.updated",sessionId:t,segs:c,at:new Date().toISOString()})}}
@@ -0,0 +1,16 @@
1
+ import { TerminalBackend, type LaunchOrigin, type TerminalLaunch } from './backend.js';
2
+ /**
3
+ * ghostty:Linux 上先走 `+new-window` IPC(窗口开进已运行实例,1.2.0+;GTK
4
+ * 实现,见源码 src/apprt/gtk/ipc)——IPC 是短命 CLI、按退出码判成败,不能进
5
+ * 候选表(trySpawn 只看进程起了没,会假成功),故覆写 open/run。无实例/未配
6
+ * D-Bus 激活时非零退出 → 兜底独立进程候选。`-e` 后的 argv 原样直达(中间无
7
+ * shell),与 send-text 路径不同、无需引号。反查无通道(无 list 类命令),
8
+ * 不谎报。
9
+ */
10
+ export declare class GhosttyBackend extends TerminalBackend {
11
+ constructor(platform: NodeJS.Platform);
12
+ candidates(dir: string, run?: string[]): TerminalLaunch[];
13
+ private openViaIpcThenStandalone;
14
+ open(dir: string): Promise<void>;
15
+ run(dir: string, argv: string[]): Promise<LaunchOrigin | null>;
16
+ }
@@ -0,0 +1 @@
1
+ import{captureCommand as a}from"./wezterm-mux.js";import{PRESET_CANDIDATES as s,TerminalBackend as i}from"./backend.js";export class GhosttyBackend extends i{constructor(t){super("ghostty",!1,t)}candidates(t,n){return s.ghostty(t,n,this.platform)}async openViaIpcThenStandalone(t,n){if(this.platform==="linux"){const e=["+new-window",`--working-directory=${t}`,...n.length>0?["-e",...n]:[]];if((await a("ghostty",e))?.ok)return}await this.spawnFirst(this.candidates(t,n.length>0?n:void 0),`Terminal preset "${this.preset}" is unavailable on this platform`)}open(t){return this.openViaIpcThenStandalone(t,[])}async run(t,n){return await this.openViaIpcThenStandalone(t,n),null}}
@@ -0,0 +1,20 @@
1
+ import { TerminalBackend, type TerminalLaunch } from './backend.js';
2
+ /**
3
+ * iTerm2(macOS):`ITERM_SESSION_ID`(`w0t0p0:<UUID>`)一条就唯一定位一个会话,
4
+ * 文本走 AppleScript `write text`。**只有文本通道**——iTerm2 没有裸键序入口,
5
+ * 中断/作答在这条路上诚实不支持(`sendKeys` 走基类拒绝,不假装能打)。
6
+ * 同 Konsole:本机无法实机验证。
7
+ */
8
+ export declare class ItermBackend extends TerminalBackend {
9
+ constructor(platform: NodeJS.Platform);
10
+ candidates(dir: string, run?: string[]): TerminalLaunch[];
11
+ locatePane(env: Record<string, string>): Promise<string | null>;
12
+ ownsPaneId(paneId: string): boolean;
13
+ sendPromptText(paneId: string, text: string): Promise<void>;
14
+ }
15
+ /** iTerm2 的 pane id ↔ 会话 unique id;坏 id → null。 */
16
+ export declare function parseItermPaneId(paneId: string): string | null;
17
+ /** 上报的 pane env → iTerm2 的 pane id;不是 iTerm 会话(缺键)→ null。 */
18
+ export declare function itermPaneFromEnv(env: Record<string, string>): string | null;
19
+ /** AppleScript 字符串字面量转义(反斜杠先转,免把引号转义再转一遍)。 */
20
+ export declare function applescriptString(text: string): string;
@@ -0,0 +1,12 @@
1
+ import{TERMINAL_LOCATOR_ENV as i}from"@weavecode/core";import{captureCommand as o}from"./wezterm-mux.js";import{PRESET_CANDIDATES as s,TerminalBackend as a}from"./backend.js";export class ItermBackend extends a{constructor(e){super("iterm",!1,e,e==="darwin")}candidates(e,n){return s.iterm(e,n,this.platform)}async locatePane(e){return itermPaneFromEnv(e)}ownsPaneId(e){return parseItermPaneId(e)!==null}async sendPromptText(e,n){const t=parseItermPaneId(e);if(!t)throw new Error(`Invalid prompt pane "${e}"`);await c(t,n)}}export function parseItermPaneId(r){const e=/^iterm:(w\d+t\d+p\d+:[0-9A-Fa-f-]+)$/.exec(r);return e?e[1]:null}export function itermPaneFromEnv(r){const[e]=i.iterm,n=r[e];if(!n)return null;const t=`iterm:${n}`;return parseItermPaneId(t)?t:null}export function applescriptString(r){return r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}async function c(r,e){const n=`tell application "iTerm2"
2
+ repeat with w in windows
3
+ repeat with t in tabs of w
4
+ repeat with s in sessions of t
5
+ if unique id of s is "${r}" then
6
+ tell s to write text "${applescriptString(e)}"
7
+ return "ok"
8
+ end if
9
+ end repeat
10
+ end repeat
11
+ end repeat
12
+ end tell`,t=await o("osascript",["-e",n],void 0,8e3);if(!t)throw new Error("osascript is unavailable \u2014 cannot send text into iTerm2");if(!t.ok||!t.out.includes("ok"))throw new Error(`iTerm2 write text failed: ${t.err||t.out||"unknown error"}`)}
@@ -0,0 +1,23 @@
1
+ import { TerminalBackend, type TerminalLaunch } from './backend.js';
2
+ /**
3
+ * Konsole(KDE/Linux):每个会话一条 D-Bus 路径(`KONSOLE_DBUS_SERVICE` +
4
+ * `KONSOLE_DBUS_SESSION`),文本/键序走 `sendText` / `sendKey`。本机无法实机
5
+ * 验证(Linux 专属),通道按官方文档实现。
6
+ */
7
+ export declare class KonsoleBackend extends TerminalBackend {
8
+ constructor(platform: NodeJS.Platform);
9
+ candidates(dir: string, run?: string[]): TerminalLaunch[];
10
+ locatePane(env: Record<string, string>): Promise<string | null>;
11
+ ownsPaneId(paneId: string): boolean;
12
+ sendPromptText(paneId: string, text: string): Promise<void>;
13
+ sendKeys(paneId: string, keys: string): Promise<void>;
14
+ }
15
+ /** Konsole 的 pane id ↔ (D-Bus 服务名, 会话路径);坏 id → null。 */
16
+ export declare function parseKonsolePaneId(id: string): {
17
+ service: string;
18
+ session: string;
19
+ } | null;
20
+ /** 上报的 pane env → Konsole 的 pane id;不是 Konsole 会话(缺键)→ null。 */
21
+ export declare function konsolePaneFromEnv(env: Record<string, string>): string | null;
22
+ /** 字符 → Qt 键值:控制键给真值,其余用码位(ASCII 与 Qt::Key 一致)。 */
23
+ export declare function qtKeyOf(ch: string): number;
@@ -0,0 +1,2 @@
1
+ import{TERMINAL_LOCATOR_ENV as u}from"@weavecode/core";import{captureCommand as d}from"./wezterm-mux.js";import{PRESET_CANDIDATES as f,TerminalBackend as m}from"./backend.js";export class KonsoleBackend extends m{constructor(n){super("konsole",!1,n,n==="linux")}candidates(n,s){return f.konsole(n,s,this.platform)}async locatePane(n){return konsolePaneFromEnv(n)}ownsPaneId(n){return parseKonsolePaneId(n)!==null}async sendPromptText(n,s){const o=parseKonsolePaneId(n);if(!o)throw new Error(`Invalid prompt pane "${n}"`);s&&await c(o,"sendText",s),await c(o,"sendKey",String(l))}async sendKeys(n,s){const o=parseKonsolePaneId(n);if(!o)throw new Error(`Invalid prompt pane "${n}"`);for(const r of s)await c(o,"sendKey",String(qtKeyOf(r)))}}export function parseKonsolePaneId(e){const n=/^konsole:([\w.:-]+)\|(\/[\w/]+)$/.exec(e);return n?{service:n[1],session:n[2]}:null}export function konsolePaneFromEnv(e){const[n,s]=u.konsole,o=e[n],r=e[s];if(!o||!r)return null;const t=`konsole:${o}|${r}`;return parseKonsolePaneId(t)?t:null}const l=16777220;export function qtKeyOf(e){switch(e){case"\x1B":return 16777216;case"\r":case`
2
+ `:return l;case" ":return 16777217;case"\b":return 16777219;default:return e.codePointAt(0)??0}}async function c(e,n,s){const o=[...["qdbus6","qdbus5","qdbus"].map(a=>({command:a,args:[e.service,e.session,n,s]})),{command:"dbus-send",args:["--session","--type=method_call",`--dest=${e.service}`,e.session,`org.kde.konsole.Session.${n}`,`string:${s}`]}];let r=null;for(const a of o){const i=await d(a.command,a.args,void 0,5e3);if(i?.ok)return;r=i}const t=r?r.err||r.out||"unknown error":"no qdbus / dbus-send on PATH";throw new Error(`Konsole D-Bus call "${n}" failed: ${t}`)}
@@ -0,0 +1,19 @@
1
+ import type { AttachTarget } from './wezterm-mux.js';
2
+ import { TerminalBackend, type LaunchOrigin, type TerminalLaunch } from './backend.js';
3
+ /**
4
+ * Terminal.app(macOS):枚举/定点全走 osascript + ps + lsof——tab 的 tty →
5
+ * 该 tty 的进程树根(shell;被 exec 替换成 claude 时就是 claude 本身)→ lsof
6
+ * 取 cwd。无分屏,tab 即整面;「pane 分屏」的等价物是新 tab:run 复用同项目
7
+ * 窗口开新 tab,定点附加落在所选 tab 的窗口。枚举通道只在 darwin 存在,其它
8
+ * 平台 enumerable=false。
9
+ */
10
+ export declare class TerminalAppBackend extends TerminalBackend {
11
+ constructor(platform: NodeJS.Platform);
12
+ candidates(dir: string, run?: string[]): TerminalLaunch[];
13
+ /** 同项目已有 Terminal.app 窗口 → 在那个窗口开新 tab;窗口中途没了 → 落回新窗。 */
14
+ run(dir: string, argv: string[]): Promise<LaunchOrigin | null>;
15
+ countWindows(dirs: readonly string[]): Promise<Map<string, number>>;
16
+ listTargets(dir: string): Promise<AttachTarget[]>;
17
+ /** 定点附加:落点是所选 tab 的窗口(do script 在该窗口开新 tab);osascript 无回执。 */
18
+ runAt(dir: string, argv: string[], targetId: string): Promise<LaunchOrigin | null>;
19
+ }
@@ -0,0 +1 @@
1
+ import{doScriptInTerminalWindow as i,listTerminalAppSurfaces as e,listTerminalAppTargets as s,parseTerminalAppTargetId as p,pickTerminalAppWindow as l,terminalAppSurfacesCached as o}from"./pty-terminals.js";import{countWindowsByDir as w}from"./wezterm-mux.js";import{PRESET_CANDIDATES as m,TerminalBackend as c}from"./backend.js";export class TerminalAppBackend extends c{constructor(a){super("terminal",a==="darwin",a)}candidates(a,t){return m.terminal(a,t,this.platform)}async run(a,t){if(this.platform==="darwin"){const n=await e(this.platform),r=l(n,a,this.platform);if(r&&await i(a,t,r.windowId))return null}return await this.spawnFirst(this.candidates(a,t),`Terminal preset "${this.preset}" is unavailable on this platform`),null}async countWindows(a){if(a.length===0||this.platform!=="darwin")return new Map(a.map(n=>[n,0]));const t=await o(this.platform);return t.length===0?new Map(a.map(n=>[n,0])):w(a,t.flatMap(n=>n.cwd?[{muxKey:"terminal.app",windowId:n.windowId,tabId:n.tabIndex,cwd:n.cwd}]:[]))}listTargets(a){return s(a,this.platform)}async runAt(a,t,n){const r=p(n);if(!r)throw new Error(`Invalid terminal target "${n}"`);if(!await i(a,t,r.windowId))throw new Error("Terminal window is gone \u2014 pick a terminal again");return null}}
@@ -0,0 +1,87 @@
1
+ import { type AttachTarget, type SessionTerminal, type WeztermMux } from './wezterm-mux.js';
2
+ import { TerminalBackend, type LaunchOrigin, type PromptPaneTarget, type TerminalLaunch } from './backend.js';
3
+ export declare function weztermLiveMuxesCached(): Promise<{
4
+ muxes: WeztermMux[];
5
+ candidates: string[];
6
+ }>;
7
+ /**
8
+ * wezterm 后端:唯一满能力后端(枚举/附加/唤出/注入/读屏/关 pane 全有)。
9
+ * run 走 mux 通道(legacy `start -- PROG` 绕过 default_prog,且 mux 在时会挂死
10
+ * 出无窗僵尸而 trySpawn 假成功);窗口/pane 反查走 `cli list`;prompt 文本走
11
+ * send-text。
12
+ */
13
+ export declare class WeztermBackend extends TerminalBackend {
14
+ constructor(platform: NodeJS.Platform);
15
+ candidates(dir: string, run?: string[]): TerminalLaunch[];
16
+ /**
17
+ * 开终端(不带命令):有活实例 → 在实例里开新窗口落子(与会话列表的新终端
18
+ * 同一条 mux 通道);一个活实例都没有 → 回落 legacy `start` 起新 GUI(第一台
19
+ * 终端总得有人开)。**不能只靠 `start`**:Windows 上它恒起一个新 GUI 进程、
20
+ * 不并进已开实例(实测 `WEZTERM_UNIX_SOCKET` 指着活实例也照样新起),那是
21
+ * 另一套窗口/实例,跟用户日常那个 wezterm 不是一回事。
22
+ */
23
+ open(dir: string): Promise<void>;
24
+ /**
25
+ * 带命令开终端:有活实例 → mux 落子;**一个活实例都没有 → 回落 legacy `start`**
26
+ * (与 `open` 同一条回落)——那是「用户此刻还没开 wezterm」的常态,不是错误:
27
+ * `start --cwd dir <cmd>` 起新 GUI 并把命令跑在里面。原先这里一律 400
28
+ * 「wezterm mux undiscoverable — is wezterm running?」,用户点「打开终端」得到的
29
+ * 却是一条报错;「`start` 在 mux 在时会挂死出无窗僵尸」那条只对活实例成立。
30
+ */
31
+ run(dir: string, argv: string[]): Promise<LaunchOrigin | null>;
32
+ countWindows(dirs: readonly string[]): Promise<Map<string, number>>;
33
+ listTargets(dir: string): Promise<AttachTarget[]>;
34
+ runAt(dir: string, argv: string[], targetId: string): Promise<LaunchOrigin | null>;
35
+ /** 唤出两步:`activate-pane` 只切 mux 内部的焦点(实测不抬 OS 窗口、不解最小化),
36
+ * Windows 上还得在那个 GUI 进程的窗口里按标题认出来抬(OS 窗口标题 = 该窗口活动
37
+ * pane 的标题)。 */
38
+ focusTarget(_dir: string, targetId: string): Promise<void>;
39
+ /** prompt 层②:跨 mux 摊平全部 pane(实时枚举——落点决策必须看实时世界)。 */
40
+ listPromptPanes(): Promise<PromptPaneTarget[]>;
41
+ /**
42
+ * 层② 定位(hook 旁路上报的 pane env → prompt pane id):pane 号 + mux socket
43
+ * 归位到该实例的活动 pane。**含存在性校验**——socket 对不上活 mux、pane 已不在
44
+ * 一律 null(调用方回落标题+cwd 启发式,宁可少答也不往别人的 pane 打键)。
45
+ */
46
+ locatePane(env: Record<string, string>): Promise<string | null>;
47
+ /** 本后端的 pane id 表示法 = `<mux 短哈希>:<paneId>`(见 parsePromptPaneId)。 */
48
+ ownsPaneId(paneId: string): boolean;
49
+ /**
50
+ * 会话 → 可见屏幕(会话列表分块):与 locatePane 同一份旁路 env,但**吃 10s
51
+ * 探活缓存**——分组是展示面,滞后十秒无感,而它由计数探活同一轮触发(共用一次
52
+ * `cli list`),不为此多 spawn。
53
+ */
54
+ locateScreens(envs: Record<string, Record<string, string>>): Promise<Record<string, SessionTerminal | null>>;
55
+ /**
56
+ * prompt 层② 注入(spike 字节级实测配方):bracketed paste 打原文(内含
57
+ * CR 是字面内容、不会被终端解释提交)→ `--no-paste` 补一记 CR 提交。mux
58
+ * 实时重枚举定位,目标没了 throw(消息转可见失败,不静默丢)。
59
+ */
60
+ sendPromptText(paneId: string, text: string): Promise<void>;
61
+ /**
62
+ * 裸键序进 pty(阻塞问答作答 / 会话中断的 ESC 共用这一条通道):`--no-paste`
63
+ * 绕过 bracketed paste,CR 字节即回车键、ESC 即中断。mux 定位口径与
64
+ * sendPromptText 同。
65
+ */
66
+ sendKeys(paneId: string, keys: string): Promise<void>;
67
+ /**
68
+ * 关 pane(`wezterm cli kill-pane`):宿主随 pane 一起退出——这就是「退出会话」
69
+ * 的远程等价(harness 没有「请退出」这种信号,pane 没了它就没了)。mux 定位口径
70
+ * 与 sendKeys 同;目标没了 throw,不静默假装关掉了。
71
+ */
72
+ closePane(paneId: string): Promise<void>;
73
+ /** 读 pane 可视屏(`cli get-text`):mux 定位口径与 sendKeys 同;失败 null(不猜)。 */
74
+ getPaneText(paneId: string): Promise<string | null>;
75
+ }
76
+ /**
77
+ * 定点附加(用户在会话终端弹窗里选的 tab):实时重枚举定位目标,目标不在了
78
+ * 就 throw——让前端报「该终端已关闭,请重选」,绝不静默换到别处(换了就是
79
+ * 「我点了 A,命令进了 B」);已长满同样明确拒绝(**不擅自另开窗口**,那也是
80
+ * 换地方),前端同一事实置灰,用户自己决定开新终端还是挑别的。
81
+ */
82
+ export declare function runInWeztermAt(dir: string, argv: string[], targetId: string, platform?: NodeJS.Platform): Promise<LaunchOrigin | null>;
83
+ /** prompt pane id ↔ (mux, paneId) 解码;坏 id → null。 */
84
+ export declare function parsePromptPaneId(id: string): {
85
+ muxKey: string;
86
+ paneId: number;
87
+ } | null;
@@ -0,0 +1 @@
1
+ import{TERMINAL_LOCATOR_ENV as g}from"@weavecode/core";import{MAX_PANES_PER_SCREEN as f,countWindowsByDir as I,listAttachTargets as y,openInWezterm as E,parseAttachTargetId as h,planWeztermGrid as z,runInWezterm as P,weztermCli as p,weztermGuiPidOf as K,weztermLiveMuxes as u,weztermMuxForId as d,weztermMuxKey as x,weztermPaneFromEnv as b,sessionScreensFromEnvs as S,weztermSpawnAndSend as T,weztermStepError as m}from"./wezterm-mux.js";import{winRaiseTerminalWindow as M}from"./win-raise.js";import{throughCmd as A}from"./shared.js";import{TerminalBackend as $}from"./backend.js";let l=null;export async function weztermLiveMuxesCached(){if(l&&Date.now()-l.at<1e4)return l;const{muxes:w,candidates:e}=await u(!0);return l={at:Date.now(),muxes:w,candidates:e},l}export class WeztermBackend extends ${constructor(e){super("wezterm",!0,e,!0)}candidates(e,n){return[{command:"wezterm",args:["start","--cwd",e,...A(n,this.platform==="win32")??[]]}]}async open(e){await E(e)||await super.open(e)}async run(e,n){const t=await P(e,n);return t||super.run(e,n)}async countWindows(e){if(e.length===0)return new Map;const{muxes:n}=await weztermLiveMuxesCached();return n.length===0?new Map(e.map(t=>[t,0])):I(e,n.flatMap(t=>t.panes.map(r=>({muxKey:t.socket,windowId:r.windowId,tabId:r.tabId,cwd:r.cwd}))))}listTargets(e){return y(e,this.platform)}runAt(e,n,t){return runInWeztermAt(e,n,t,this.platform)}async focusTarget(e,n){const t=h(n);if(!t)throw new Error(`Invalid terminal target "${n}"`);const r=await d(t.muxKey);if(!r)throw new Error("wezterm instance is gone \u2014 cannot bring the terminal to the front");const a=r.panes.find(i=>i.windowId===t.windowId&&i.tabId===t.tabId);if(!a)throw new Error("That terminal is gone \u2014 reopen the list");const o=["cli","activate-pane","--pane-id",String(a.paneId)],s=await p(o,r.socket);if(!s?.ok)throw new Error(m(o,r.socket,s));if(this.platform!=="win32")return;const c=(await d(t.muxKey))?.panes??r.panes,k=[(c.find(i=>i.paneId===a.paneId)??a).title,...c.filter(i=>i.windowId===t.windowId).map(i=>i.title)].filter(i=>!!i);await M({guiPid:K(r.socket)??void 0,titles:k})}async listPromptPanes(){const{muxes:e}=await u();return e.flatMap(n=>n.panes.map(t=>({id:`${x(n.socket)}:${t.paneId}`,title:t.title,cwd:t.cwd})))}async locatePane(e){const[n,t]=g.wezterm,r=e[t];if(!e[n]||!r)return null;const{muxes:a}=await u(!0,r);return b(e,a,this.platform)}ownsPaneId(e){return parsePromptPaneId(e)!==null}async locateScreens(e){if(Object.keys(e).length===0)return{};const{muxes:n,candidates:t}=await weztermLiveMuxesCached();return S(e,n,t,this.platform)}async sendPromptText(e,n){const t=parsePromptPaneId(e);if(!t)throw new Error(`Invalid prompt pane "${e}"`);const r=await d(t.muxKey);if(!r)throw new Error("wezterm instance is gone \u2014 cannot deliver prompt");const a=String(t.paneId);if(n){const s=await p(["cli","send-text","--pane-id",a,n],r.socket);if(!s?.ok)throw new Error(m(["cli","send-text","--pane-id",a,"<prompt text>"],r.socket,s))}const o=await p(["cli","send-text","--pane-id",a,"--no-paste","\r"],r.socket);if(!o?.ok)throw new Error(m(["cli","send-text","--pane-id",a,"--no-paste","<CR>"],r.socket,o))}async sendKeys(e,n){const t=parsePromptPaneId(e);if(!t)throw new Error(`Invalid prompt pane "${e}"`);const r=await d(t.muxKey);if(!r)throw new Error("wezterm instance is gone \u2014 cannot send keys to the pane");const a=String(t.paneId),o=await p(["cli","send-text","--pane-id",a,"--no-paste",n],r.socket);if(!o?.ok)throw new Error(m(["cli","send-text","--pane-id",a,"--no-paste","<keys>"],r.socket,o))}async closePane(e){const n=parsePromptPaneId(e);if(!n)throw new Error(`Invalid prompt pane "${e}"`);const t=await d(n.muxKey);if(!t)throw new Error("wezterm instance is gone \u2014 cannot close the pane");const r=String(n.paneId),a=await p(["cli","kill-pane","--pane-id",r],t.socket);if(!a?.ok)throw new Error(m(["cli","kill-pane","--pane-id",r],t.socket,a))}async getPaneText(e){const n=parsePromptPaneId(e);if(!n)return null;const t=await d(n.muxKey);if(!t)return null;const r=await p(["cli","get-text","--pane-id",String(n.paneId)],t.socket);return r?.ok?r.out:null}}export async function runInWeztermAt(w,e,n,t=process.platform){const r=h(n);if(!r)throw new Error(`Invalid terminal target "${n}"`);const{muxes:a}=await u(),o=a.find(c=>x(c.socket)===r.muxKey);if(!o)throw new Error("wezterm instance is gone \u2014 pick a terminal again");const s=o.panes.filter(c=>c.windowId===r.windowId&&c.tabId===r.tabId);if(s.length===0)throw new Error("terminal tab is gone \u2014 pick a terminal again");if(s.length>=f)throw new Error(`terminal is full (${f} panes) \u2014 pick another terminal or open a new one`);return T(o.socket,w,e,z(s),o.workspace,t)}export function parsePromptPaneId(w){const e=/^([0-9a-f]{8}):(\d+)$/.exec(w);return e?{muxKey:e[1],paneId:Number(e[2])}:null}