@weavecode/weave 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/.editorconfig +1 -1
  2. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/CHANGELOG.md +45 -22
  3. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/README.md +26 -1
  4. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/dist/qs.js +27 -27
  5. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/eslint.config.mjs +61 -50
  6. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/formats.js +7 -2
  7. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/parse.js +13 -6
  8. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/stringify.js +5 -3
  9. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/utils.js +15 -7
  10. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/package.json +6 -6
  11. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/dist/common.js +2 -2
  12. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/package.json +2 -2
  13. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/README.md +2 -3
  14. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +8 -3
  15. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/index.js +1 -1
  16. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/route/index.js +3 -1
  17. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/jsx/base.js +1 -1
  18. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +8 -0
  19. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/serve-static/index.js +3 -1
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/trie-router/node.js +2 -2
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +11 -6
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +8 -3
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/index.js +1 -1
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/route/index.js +3 -1
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/jsx/base.js +1 -1
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +8 -0
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/serve-static/index.js +3 -1
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/trie-router/node.js +2 -2
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +1 -1
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +1 -1
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +1 -1
  32. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +1 -1
  33. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +1 -1
  34. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +1 -1
  35. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +1 -1
  36. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +1 -1
  37. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +1 -1
  38. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +1 -1
  39. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/helper/testing/index.d.ts +2 -1
  40. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/hono-base.d.ts +21 -9
  41. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/index.d.ts +1 -1
  42. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/components.d.ts +2 -2
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/context.d.ts +2 -2
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/dom/components.d.ts +2 -2
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/dom/css.d.ts +2 -2
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/streaming.d.ts +4 -3
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +2 -1
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +3 -3
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +3 -3
  50. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/ipaddr.d.ts +1 -1
  51. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +11 -6
  52. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
  53. package/node_modules/@weavecode/cli/dist/cli.js +4 -4
  54. package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
  55. package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
  56. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  57. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
  58. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  59. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  60. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  61. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  62. package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
  63. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +2 -1
  64. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +14 -0
  65. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +4 -3
  66. package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
  67. package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
  68. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
  69. package/node_modules/@weavecode/cli/dist/init/executor.d.ts +5 -4
  70. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  71. package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
  72. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  73. package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
  74. package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
  75. package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
  76. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  77. package/node_modules/@weavecode/cli/dist/init/provision.d.ts +25 -0
  78. package/node_modules/@weavecode/cli/dist/init/provision.js +1 -0
  79. package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
  80. package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
  81. package/node_modules/@weavecode/cli/dist/parser.js +1 -1
  82. package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
  83. package/node_modules/@weavecode/cli/dist/statusline/mock-input.js +1 -1
  84. package/node_modules/@weavecode/cli/dist/statusline/preview.js +2 -2
  85. package/node_modules/@weavecode/cli/package.json +5 -5
  86. package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
  87. package/node_modules/@weavecode/core/dist/harness.d.ts +13 -1
  88. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  89. package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
  90. package/node_modules/@weavecode/core/dist/index.js +1 -1
  91. package/node_modules/@weavecode/core/dist/platform.js +1 -1
  92. package/node_modules/@weavecode/core/dist/types.js +1 -1
  93. package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
  94. package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
  95. package/node_modules/@weavecode/core/package.json +1 -1
  96. package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
  97. package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
  98. package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -3
  99. package/node_modules/@weavecode/harness/dist/claude/config.d.ts +9 -0
  100. package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
  101. package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
  102. package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
  103. package/node_modules/@weavecode/harness/dist/claude/event-source.d.ts +2 -0
  104. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  105. package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
  106. package/node_modules/@weavecode/harness/dist/claude/index.d.ts +4 -2
  107. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  108. package/node_modules/@weavecode/harness/dist/claude/liveness.d.ts +64 -0
  109. package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -0
  110. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
  111. package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
  112. package/node_modules/@weavecode/harness/dist/claude/model-aliases.d.ts +4 -0
  113. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
  114. package/node_modules/@weavecode/harness/dist/claude/narration.d.ts +13 -0
  115. package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -0
  116. package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
  117. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
  118. package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
  119. package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
  120. package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
  121. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
  122. package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
  123. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
  124. package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
  125. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +14 -14
  126. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
  127. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
  128. package/node_modules/@weavecode/harness/dist/claude/transcript.d.ts +13 -0
  129. package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -6
  130. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  131. package/node_modules/@weavecode/harness/dist/codex/capture.d.ts +1 -2
  132. package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
  133. package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
  134. package/node_modules/@weavecode/harness/dist/codex/config.d.ts +10 -0
  135. package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
  136. package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
  137. package/node_modules/@weavecode/harness/dist/codex/event-source.d.ts +1 -1
  138. package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
  139. package/node_modules/@weavecode/harness/dist/codex/images.d.ts +2 -0
  140. package/node_modules/@weavecode/harness/dist/codex/images.js +1 -0
  141. package/node_modules/@weavecode/harness/dist/codex/index.d.ts +13 -2
  142. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  143. package/node_modules/@weavecode/harness/dist/codex/liveness.d.ts +38 -0
  144. package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -0
  145. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
  146. package/node_modules/@weavecode/harness/dist/codex/messaging.d.ts +7 -3
  147. package/node_modules/@weavecode/harness/dist/codex/messaging.js +3 -3
  148. package/node_modules/@weavecode/harness/dist/codex/narration.d.ts +10 -0
  149. package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -0
  150. package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
  151. package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
  152. package/node_modules/@weavecode/harness/dist/codex/provision.d.ts +12 -0
  153. package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -0
  154. package/node_modules/@weavecode/harness/dist/codex/questions.d.ts +9 -0
  155. package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -0
  156. package/node_modules/@weavecode/harness/dist/codex/resume.js +1 -1
  157. package/node_modules/@weavecode/harness/dist/codex/rollout.d.ts +8 -5
  158. package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
  159. package/node_modules/@weavecode/harness/dist/codex/side-question.d.ts +12 -0
  160. package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -0
  161. package/node_modules/@weavecode/harness/dist/codex/titles.d.ts +8 -0
  162. package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -0
  163. package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
  164. package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
  165. package/node_modules/@weavecode/harness/dist/driver.d.ts +162 -8
  166. package/node_modules/@weavecode/harness/dist/driver.js +1 -1
  167. package/node_modules/@weavecode/harness/dist/index.d.ts +1 -0
  168. package/node_modules/@weavecode/harness/dist/index.js +1 -1
  169. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
  170. package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
  171. package/node_modules/@weavecode/harness/dist/install.d.ts +9 -0
  172. package/node_modules/@weavecode/harness/dist/install.js +1 -0
  173. package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
  174. package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
  175. package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
  176. package/node_modules/@weavecode/harness/dist/zcode/assets.js +1 -1
  177. package/node_modules/@weavecode/harness/dist/zcode/capture.js +3 -3
  178. package/node_modules/@weavecode/harness/dist/zcode/mcp.js +2 -2
  179. package/node_modules/@weavecode/harness/package.json +2 -2
  180. package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
  181. package/node_modules/@weavecode/server/dist/config/profiles.d.ts +10 -1
  182. package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
  183. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  184. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  185. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  186. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
  187. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  188. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
  189. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  190. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.d.ts +4 -55
  191. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.js +1 -1
  192. package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
  193. package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
  194. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  195. package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
  196. package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
  197. package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
  198. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  199. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  200. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.d.ts +2 -0
  201. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  202. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  203. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  204. package/node_modules/@weavecode/server/dist/daemon/liveness.d.ts +7 -0
  205. package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -0
  206. package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
  207. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.d.ts +28 -0
  208. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -0
  209. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.d.ts +16 -0
  210. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -0
  211. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.d.ts +20 -0
  212. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +12 -0
  213. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.d.ts +23 -0
  214. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -0
  215. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.d.ts +19 -0
  216. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -0
  217. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.d.ts +87 -0
  218. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -0
  219. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.d.ts +45 -0
  220. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -0
  221. package/node_modules/@weavecode/server/dist/daemon/opener/backend.d.ts +115 -0
  222. package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -0
  223. package/node_modules/@weavecode/server/dist/daemon/opener/launch.js +1 -1
  224. package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
  225. package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
  226. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.d.ts +8 -5
  227. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
  228. package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
  229. package/node_modules/@weavecode/server/dist/daemon/opener.d.ts +23 -120
  230. package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -13
  231. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  232. package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +17 -2
  233. package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -1
  234. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.d.ts +2 -0
  235. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  236. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  237. package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
  238. package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
  239. package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
  240. package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
  241. package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
  242. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.d.ts +6 -0
  243. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -0
  244. package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
  245. package/node_modules/@weavecode/server/dist/daemon/routes/search.d.ts +38 -0
  246. package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -0
  247. package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
  248. package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
  249. package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
  250. package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
  251. package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
  252. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +8 -2
  253. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
  254. package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +10 -1
  255. package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
  256. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  257. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  258. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  259. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
  260. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  261. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  262. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  263. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
  264. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  265. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  266. package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
  267. package/node_modules/@weavecode/server/dist/db/db.js +5 -2
  268. package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
  269. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  270. package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +10 -0
  271. package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
  272. package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
  273. package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
  274. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.d.ts +20 -0
  275. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
  276. package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
  277. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.d.ts +7 -1
  278. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
  279. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.d.ts +4 -4
  280. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
  281. package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
  282. package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
  283. package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
  284. package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
  285. package/node_modules/@weavecode/server/dist/hooks/dispatcher.d.ts +5 -0
  286. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  287. package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
  288. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  289. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  290. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
  291. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.d.ts +15 -0
  292. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  293. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  294. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.d.ts +64 -6
  295. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +3 -2
  296. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  297. package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
  298. package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
  299. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.d.ts +5 -0
  300. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  301. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  302. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  303. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  304. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  305. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  306. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  307. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  308. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  309. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  310. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.d.ts +2 -0
  311. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.js +1 -1
  312. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
  313. package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
  314. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  315. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  316. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  317. package/node_modules/@weavecode/server/dist/index.d.ts +1 -0
  318. package/node_modules/@weavecode/server/dist/index.js +1 -1
  319. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  320. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  321. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  322. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  323. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  324. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
  325. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  326. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
  327. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  328. package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
  329. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  330. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  331. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  332. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  333. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  334. package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
  335. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  336. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  337. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  338. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  339. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  340. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  341. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  342. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  343. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  344. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  345. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  346. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  347. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
  348. package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +19 -1
  349. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +9 -3
  350. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  351. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  352. package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
  353. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  354. package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
  355. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  356. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  357. package/node_modules/@weavecode/server/dist/repositories/sessions.d.ts +12 -2
  358. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  359. package/node_modules/@weavecode/server/dist/repositories/side-questions.d.ts +7 -0
  360. package/node_modules/@weavecode/server/dist/repositories/side-questions.js +8 -5
  361. package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
  362. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  363. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
  364. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
  365. package/node_modules/@weavecode/server/dist/surfaces.d.ts +8 -1
  366. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  367. package/node_modules/@weavecode/server/dist/version.d.ts +1 -11
  368. package/node_modules/@weavecode/server/dist/version.js +1 -1
  369. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  370. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  371. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  372. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  373. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  374. package/node_modules/@weavecode/server/package.json +4 -4
  375. package/node_modules/@weavecode/server/web/dist/assets/{abnfDiagram-WEYOIA3C-etRkSvQM.js → abnfDiagram-WEYOIA3C-DA-K085F.js} +1 -1
  376. package/node_modules/@weavecode/server/web/dist/assets/{arc-FxRZALAZ.js → arc-BI1jnmdZ.js} +1 -1
  377. package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-5OxZ-ffz.js → architectureDiagram-ZHVYKT53-DbdBgric.js} +1 -1
  378. package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-C-CgMF0O.js → blockDiagram-RJAE7QA3-BPRBmzb-.js} +1 -1
  379. package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-B6TqN1Pw.js → c4Diagram-XDPPPE54-C4D5sRs1.js} +1 -1
  380. package/node_modules/@weavecode/server/web/dist/assets/channel-DcCJrvon.js +1 -0
  381. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-Bdzr5RRj.js → chunk-2E7WHVMD-9ZSKiNU3.js} +1 -1
  382. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-gBZASjAC.js → chunk-2Q5K7J3B-i0AOjw_8.js} +1 -1
  383. package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DSlUhKMw.js → chunk-4EMNKR2T-DTpLfX1H.js} +1 -1
  384. package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-BDQ6zpGR.js → chunk-55XCU76K-COQYRD4q.js} +1 -1
  385. package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-DPnewKbl.js → chunk-5VM5RSS4-VsftEbvo.js} +1 -1
  386. package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-DagmT8Cc.js → chunk-JWPE2WC7-DonektJN.js} +1 -1
  387. package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-Da_2PxfM.js → chunk-VQ5W62QI-CaKUwuul.js} +1 -1
  388. package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-Cdaysois.js → chunk-XXDRQBXY-DXH3D_MT.js} +1 -1
  389. package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-CvgYfbjU.js → chunk-ZCHMQSOR-COwyAuGn.js} +2 -2
  390. package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-ahplYD2h.js → classDiagram-v2-4MYWR3UA-DEvMZ6mX.js} +1 -1
  391. package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-DFyUfgKj.js → cose-bilkent-JH36ORCC-6JBJHfH6.js} +1 -1
  392. package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-mr2qRwod.js → cynefin-EF2NZ3EQ-C4GM4sjT.js} +1 -1
  393. package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-BC26VqNp.js → cynefinDiagram-WF24UDRP-Cqgi0MBP.js} +1 -1
  394. package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-DoKn_P1x.js → dagre-NK4GIZVX-CljrnkCY.js} +1 -1
  395. package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-C9WfEmt3.js → diagram-CBK3MWTC-C3PyOj5J.js} +1 -1
  396. package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-D4Ibieda.js → diagram-I5XIIV2D-I5brQlaZ.js} +1 -1
  397. package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-wsLbYLi0.js → diagram-ODIL2UCW-BX9uFNbU.js} +1 -1
  398. package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-DBioMmDk.js → diagram-PFBEJUXE-y7D-VmqJ.js} +1 -1
  399. package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-Cl5gKsWm.js → diagram-RJA3I4VV-DLUL8W42.js} +1 -1
  400. package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-BSXOaZic.js → diagram-TYUNFSNR-DLCC3ILi.js} +1 -1
  401. package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-CJIGOag6.js → ebnfDiagram-V4P3TTPT-D7vALia7.js} +1 -1
  402. package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-D6nd2OVX.js → elk-QONTBCTQ-Ct2_hatz.js} +1 -1
  403. package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-gmXjWsuF.js → erDiagram-KYQIGQAA-DxLai58T.js} +1 -1
  404. package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-DWAiZ43K.js → flowDiagram-IUGLLWBU-AWn2IHrF.js} +1 -1
  405. package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-De4v6Wtt.js → ganttDiagram-R7GPNTJY-DmRHd4Wz.js} +1 -1
  406. package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-CouLBWOB.js → gitGraphDiagram-PDYL7XHY-Ccj-t3zg.js} +1 -1
  407. package/node_modules/@weavecode/server/web/dist/assets/index-BSxzia7U.js +1031 -0
  408. package/node_modules/@weavecode/server/web/dist/assets/index-CEpJpR7P.css +11 -0
  409. package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-CeMCdduD.js → infoDiagram-MVDRKAX5-BHquFlQa.js} +1 -1
  410. package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-DK6hETwg.js → ishikawaDiagram-HPEHV2GE-CVogEbdm.js} +1 -1
  411. package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-BcgwTlST.js → journeyDiagram-BOSHW7O7-DC9XG9oh.js} +1 -1
  412. package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CTVMJNz2.js → kanban-definition-FNSA4HC5-C_eu7DC_.js} +1 -1
  413. package/node_modules/@weavecode/server/web/dist/assets/{linear-CqQf5eWO.js → linear-keTbWHJ-.js} +1 -1
  414. package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-B6KZaljU.js → mermaid.core-4sbg0MnY.js} +4 -4
  415. package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-cpKvrQTI.js → mindmap-definition-6OY57UG3-kMQS0S2l.js} +1 -1
  416. package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-Bv2bNqMZ.js → pegDiagram-ECIUJNBX-DcUFoEwP.js} +1 -1
  417. package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-CXOnA429.js → pieDiagram-GNMPY74T-BQJ7WDCx.js} +1 -1
  418. package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-BFDUpWZb.js → quadrantDiagram-D57K4MC3-C7Oi1-sq.js} +1 -1
  419. package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-BHoDSO0D.js → railroadDiagram-Y72NRBL7-CEF2QbOF.js} +1 -1
  420. package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-B8JGji7q.js → requirementDiagram-EQYSW5RA-CTjjFS7X.js} +1 -1
  421. package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BbE2-6ZM.js → sankeyDiagram-SY24JHO5-j0S5kubS.js} +1 -1
  422. package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-DwK4X2MT.js → sequenceDiagram-BLEHNHQU-B76EsZp4.js} +1 -1
  423. package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-CY10zRMe.js → sizeCapture-INFHLROL-r0DZuqAy.js} +1 -1
  424. package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-32t4Zx8b.js → stateDiagram-v2-A6IESKWZ-B4DR9LHz.js} +1 -1
  425. package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-CZlYQ8_g.js → swimlanes-B3ENRKFQ-Dbcl85ro.js} +1 -1
  426. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-CZ_6SSBd.js +8 -0
  427. package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-8VsB-Jwg.js → timeline-definition-JXYKGLGB-BlBXXRNf.js} +1 -1
  428. package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-CKOTONay.js → usecaseDiagram-WPOLBNNX-Ck1M0dpc.js} +1 -1
  429. package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-BzrNjxtm.js → vennDiagram-Q3Y3IDCW-N8B-ohWk.js} +1 -1
  430. package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-CrSd-v8I.js → wardleyDiagram-IVAIDKWA-DX-AMXq_.js} +1 -1
  431. package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-t9cV9_9b.js → xychartDiagram-4URNHDU4-4fgL48Yl.js} +1 -1
  432. package/node_modules/@weavecode/server/web/dist/index.html +5 -4
  433. package/node_modules/@weavecode/templates/package.json +2 -2
  434. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/@peculiar/asn1-x509-attr/package.json +3 -3
  435. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/package.json +4 -4
  436. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/package.json +3 -3
  437. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/package.json +3 -3
  438. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-pfx/package.json +5 -5
  439. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-pkcs8/package.json +3 -3
  440. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-x509-attr/package.json +3 -3
  441. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/package.json +7 -7
  442. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/package.json +3 -3
  443. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/package.json +1 -1
  444. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/build/cjs/time.js +1 -1
  445. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/build/es2015/time.js +1 -1
  446. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/package.json +2 -2
  447. package/package.json +6 -6
  448. package/node_modules/@weavecode/server/web/dist/assets/channel-Dv4QUMOJ.js +0 -1
  449. package/node_modules/@weavecode/server/web/dist/assets/index-BXhLerZ4.js +0 -1008
  450. package/node_modules/@weavecode/server/web/dist/assets/index-BYRxC-Zz.css +0 -11
  451. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-BlIxQLON.js +0 -8
@@ -0,0 +1,38 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { WeaveServerDeps } from '../server.js';
3
+ export interface SearchMessageHit {
4
+ eventId: number;
5
+ sessionId: string | null;
6
+ projectId: number;
7
+ source: string;
8
+ eventType: string;
9
+ at: string;
10
+ /** 命中窗口(命中点前后各 MESSAGE_CONTEXT_CHARS 字符;不足即全文)。 */
11
+ text: string;
12
+ /** 命中起点在 `text` 内的偏移(前端高亮用)。 */
13
+ offset: number;
14
+ /** 正文比窗口长(前端提示「截断」)。 */
15
+ clipped: boolean;
16
+ }
17
+ export interface SearchFileHit {
18
+ projectId: number;
19
+ path: string;
20
+ kind: 'file' | 'dir';
21
+ /** 命中区间(对 `path` 而言),复用 PathHit 的形状。 */
22
+ ranges: [number, number][];
23
+ }
24
+ export interface SearchResponse {
25
+ q: string;
26
+ sessions: Array<{
27
+ sessionId: string;
28
+ projectId: number | null;
29
+ title: string | null;
30
+ }>;
31
+ messages: SearchMessageHit[];
32
+ files: SearchFileHit[];
33
+ truncated: {
34
+ messages: boolean;
35
+ files: boolean;
36
+ };
37
+ }
38
+ export declare function handleSearchRoutes(req: IncomingMessage, res: ServerResponse, deps: WeaveServerDeps, pathname: string, url: URL): Promise<boolean>;
@@ -0,0 +1 @@
1
+ import{sendJson as i}from"../http.js";import{matchPaths as T,peekCachedIndex as E}from"../project-files.js";const _=8,p=12,g=6,m=18,v=1440*6e4,l=80;export async function handleSearchRoutes(e,n,a,o,r){if(o!=="/search"||e.method!=="GET")return!1;if(!a.hookEvents||!a.hookSessions)return i(n,503,{error:"Hooks subsystem unavailable"}),!0;const s=(r.searchParams.get("q")??"").trim();if(!s)return i(n,200,{q:s,sessions:[],messages:[],files:[],truncated:{messages:!1,files:!1}}),!0;const[u,d]=await Promise.all([a.hookSessions.searchByTitle(s,_),a.hookEvents.searchConversationTexts(s,p)]),S=a.projects.list().filter(t=>!t.archivedAt),I=(await Promise.all(S.map(async t=>{const f=await E(t.id,t.path,{maxStaleMs:v});if(!f)return[];const{hits:x}=await T(f,s,g,"");return x.map(c=>({projectId:t.id,path:c.path,kind:c.kind,ranges:c.ranges}))}))).flat().slice(0,m);return i(n,200,{q:s,sessions:u.map(t=>({sessionId:t.sessionId,projectId:t.projectId,title:t.title})),messages:d.map(t=>M(t,s)),files:I,truncated:{messages:d.length>=p,files:I.length>=m}}),!0}function M(e,n){const o=e.text.toLowerCase().indexOf(n.toLowerCase());if(o<0||e.text.length<=l*2)return{eventId:e.eventId,sessionId:e.sessionId,projectId:e.projectId,source:e.source,eventType:e.eventType,at:e.at,text:e.text,offset:Math.max(o,0),clipped:!1};const r=Math.max(0,o-l),s=Math.min(e.text.length,o+n.length+l);return{eventId:e.eventId,sessionId:e.sessionId,projectId:e.projectId,source:e.source,eventType:e.eventType,at:e.at,text:e.text.slice(r,s),offset:o-r,clipped:r>0||s<e.text.length}}
@@ -1 +1 @@
1
- import{z as m}from"zod";import{readJson as f,sendJson as t}from"../http.js";import{composeAnswerAtoms as R}from"../../hooks/answer-keys.js";import{readSideQuestions as C}from"../../hooks/side-questions.js";const M=m.object({question:m.string().min(1).max(4e3)}),Q=m.object({model:m.string().min(1).max(128)}),U=m.object({level:m.string().min(1).max(32)}),$=m.object({answers:m.array(m.object({questionKey:m.string().min(1),options:m.array(m.number().int().min(0)).max(32),text:m.string().max(2e3).optional()})).min(1)}),O=1200;async function P(i,s){await new Promise(a=>setTimeout(a,O));const e=i();return e!==null&&e>s}export async function handleSessionControlRoutes(i,s,e,a,p){const h=a.match(/^\/sessions\/([^/]+)\/interrupt$/);if(h&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(h[1]),o=e.sessionProbe,n=e.hookSessions?.getBySessionId(r)??null,u=!!o&&!!n&&o.transcriptPresent(r)!==null,c=()=>u?o.interruptedAt(r,n.lastSeenAt)??null:null,l=c()??0,d=await e.messageDeliverer.interrupt(r);if(!d.ok)return t(s,d.status,{error:d.error}),!0;let g=null;if(u&&(g=await P(c,l),g===!1)){const q=await e.messageDeliverer.interrupt(r,"heuristic",d.paneId);q.ok&&q.sent&&(g=await P(c,l))}return setTimeout(()=>e.interruptRefresher?.tick(),1500),t(s,200,{ok:!0,sessionId:r,interrupted:g}),!0}const v=a.match(/^\/sessions\/([^/]+)\/close-pane$/);if(v&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(v[1]),o=await e.messageDeliverer.closePane(r);return o.ok?(setTimeout(()=>{e.livenessRefresher?.tick(),e.terminalRefresher?.refreshNow()},600),t(s,200,{ok:!0,sessionId:r}),!0):(t(s,o.status,{error:o.error}),!0)}const k=a.match(/^\/sessions\/([^/]+)\/mode$/);if(k&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(k[1]),o=await e.messageDeliverer.cycleMode(r);return o.ok?(t(s,200,{ok:!0,sessionId:r}),!0):(t(s,o.status,{error:o.error}),!0)}const b=a.match(/^\/sessions\/([^/]+)\/enter$/);if(b&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(b[1]),o=await e.messageDeliverer.pressEnter(r);return o.ok?(t(s,200,{ok:!0,sessionId:r}),!0):(t(s,o.status,{error:o.error}),!0)}const I=a.match(/^\/sessions\/([^/]+)\/ctrl-c$/);if(I&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(I[1]),o=await e.messageDeliverer.pressCtrlC(r);return o.ok?(t(s,200,{ok:!0,sessionId:r}),!0):(t(s,o.status,{error:o.error}),!0)}const w=a.match(/^\/sessions\/([^/]+)\/model$/);if(w&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(w[1]),o=Q.parse(await f(i)),n=await e.messageDeliverer.setModel(r,o.model);return n.ok?(setTimeout(()=>e.interruptRefresher?.tick(),1500),t(s,200,{ok:!0,sessionId:r}),!0):(t(s,n.status,{error:n.error}),!0)}const y=a.match(/^\/sessions\/([^/]+)\/effort$/);if(y&&i.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(y[1]),o=U.parse(await f(i)),n=await e.messageDeliverer.setEffort(r,o.level);return n.ok?(t(s,200,{ok:!0,sessionId:r}),!0):(t(s,n.status,{error:n.error}),!0)}if(a==="/messaging/questions"&&i.method==="GET")return e.questionTracker?(t(s,200,{questions:e.questionTracker.snapshot()}),!0):(t(s,503,{error:"Question tracking unavailable"}),!0);const T=a.match(/^\/sessions\/([^/]+)\/answer$/);if(T&&i.method==="POST"){if(!e.questionTracker||!e.messageDeliverer)return t(s,503,{error:"Question tracking unavailable"}),!0;const r=decodeURIComponent(T[1]);let o;try{o=$.parse(await f(i))}catch(l){return t(s,400,{error:l instanceof Error?l.message:"Invalid body"}),!0}const n=e.questionTracker.get(r);if(!n)return t(s,409,{error:"Session has no pending question"}),!0;const u=R(n.questions,o.answers);if(!u.ok)return t(s,400,{error:u.error}),!0;const c=await e.messageDeliverer.answer(r,u.atoms);return c.ok?(e.questionTracker.markAnswered(r),t(s,200,{ok:!0,sessionId:r}),!0):(t(s,c.status,{error:c.error}),!0)}const D=a.match(/^\/sessions\/([^/]+)\/side-question$/);if(D&&i.method==="POST"){if(!e.messageDeliverer||!e.sideQuestions)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(D[1]);let o;try{o=M.parse(await f(i))}catch(c){return t(s,400,{error:c instanceof Error?c.message:"Invalid body"}),!0}const n=await e.messageDeliverer.askSideQuestion(r,o.question);if(!n.ok)return t(s,n.status,{error:n.error}),!0;const u=e.sideQuestions.repo.insert({sessionId:r,projectId:e.hookSessions?.getBySessionId(r)?.projectId??null,question:n.question});return t(s,200,{ok:!0,sideQuestion:u}),!0}const S=a.match(/^\/sessions\/([^/]+)\/side-questions$/);if(S&&i.method==="GET"){if(!e.sideQuestions)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const r=decodeURIComponent(S[1]),o=Number(p.searchParams.get("limit")),n=Number(p.searchParams.get("beforeId")),u=C(e.sideQuestions,r,{limit:Number.isFinite(o)&&o>0?Math.min(o,100):20,beforeId:Number.isFinite(n)&&n>0?n:void 0});return t(s,200,{sideQuestions:u}),!0}return!1}
1
+ import{z as a}from"zod";import{readJson as g,sendJson as s}from"../http.js";import{composeAnswerAtoms as C}from"../../hooks/answer-keys.js";import{readSideQuestions as O}from"../../hooks/side-questions.js";const Q=a.object({question:a.string().min(1).max(4e3)}),U=a.object({model:a.string().min(1).max(128)}),$=a.object({level:a.string().min(1).max(32)}),j=a.object({answers:a.array(a.object({questionKey:a.string().min(1),options:a.array(a.number().int().min(0)).max(32),text:a.string().max(2e3).optional()})).min(1)}),A=1200;async function P(i,r){await new Promise(u=>setTimeout(u,A));const e=i();return e!==null&&e>r}export async function handleSessionControlRoutes(i,r,e,u,b){const h=u.match(/^\/sessions\/([^/]+)\/interrupt$/);if(h&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(h[1]),o=e.sessionProbe,n=e.hookSessions?.getBySessionId(t)??null,c=!!o&&!!n&&o.transcriptPresent(t)!==null,m=()=>c?o.interruptedAt(t,n.lastSeenAt)??null:null,l=m()??0,f=await e.messageDeliverer.interrupt(t);if(!f.ok)return s(r,f.status,{error:f.error}),!0;let d=null;if(c&&(d=await P(m,l),d===!1)){const D=await e.messageDeliverer.interrupt(t,"heuristic",f.paneId);D.ok&&D.sent&&(d=await P(m,l))}return setTimeout(()=>e.interruptRefresher?.tick(),1500),s(r,200,{ok:!0,sessionId:t,interrupted:d}),!0}const k=u.match(/^\/sessions\/([^/]+)\/close-pane$/);if(k&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(k[1]),o=await e.messageDeliverer.closePane(t);return o.ok?(setTimeout(()=>{e.livenessRefresher?.tick(),e.terminalRefresher?.refreshNow()},600),s(r,200,{ok:!0,sessionId:t}),!0):(s(r,o.status,{error:o.error}),!0)}const v=u.match(/^\/sessions\/([^/]+)\/mode$/);if(v&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(v[1]),o=await e.messageDeliverer.cycleMode(t);return o.ok?(s(r,200,{ok:!0,sessionId:t}),!0):(s(r,o.status,{error:o.error}),!0)}const I=u.match(/^\/sessions\/([^/]+)\/enter$/);if(I&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(I[1]),o=await e.messageDeliverer.pressEnter(t);return o.ok?(s(r,200,{ok:!0,sessionId:t}),!0):(s(r,o.status,{error:o.error}),!0)}const w=u.match(/^\/sessions\/([^/]+)\/ctrl-c$/);if(w&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(w[1]),o=await e.messageDeliverer.pressCtrlC(t);return o.ok?(s(r,200,{ok:!0,sessionId:t}),!0):(s(r,o.status,{error:o.error}),!0)}const y=u.match(/^\/sessions\/([^/]+)\/model$/);if(y&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(y[1]),o=U.parse(await g(i)),n=await e.messageDeliverer.setModel(t,o.model);return n.ok?(setTimeout(()=>e.interruptRefresher?.tick(),1500),s(r,200,{ok:!0,sessionId:t}),!0):(s(r,n.status,{error:n.error}),!0)}const M=u.match(/^\/sessions\/([^/]+)\/effort$/);if(M&&i.method==="POST"){if(!e.messageDeliverer)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(M[1]),o=$.parse(await g(i)),n=await e.messageDeliverer.setEffort(t,o.level);return n.ok?(s(r,200,{ok:!0,sessionId:t}),!0):(s(r,n.status,{error:n.error}),!0)}if(u==="/messaging/questions"&&i.method==="GET")return e.questionTracker?(s(r,200,{questions:e.questionTracker.snapshot()}),!0):(s(r,503,{error:"Question tracking unavailable"}),!0);const T=u.match(/^\/sessions\/([^/]+)\/answer$/);if(T&&i.method==="POST"){if(!e.questionTracker||!e.messageDeliverer)return s(r,503,{error:"Question tracking unavailable"}),!0;const t=decodeURIComponent(T[1]);let o;try{o=j.parse(await g(i))}catch(l){return s(r,400,{error:l instanceof Error?l.message:"Invalid body"}),!0}const n=e.questionTracker.get(t);if(!n)return s(r,409,{error:"Session has no pending question"}),!0;const c=C(n.questions,o.answers);if(!c.ok)return s(r,400,{error:c.error}),!0;const m=await e.messageDeliverer.answer(t,c.atoms);return m.ok?(e.questionTracker.markAnswered(t),s(r,200,{ok:!0,sessionId:t}),!0):(s(r,m.status,{error:m.error}),!0)}const S=u.match(/^\/sessions\/([^/]+)\/side-question$/);if(S&&i.method==="POST"){if(!e.messageDeliverer||!e.sideQuestions)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(S[1]);let o;try{o=Q.parse(await g(i))}catch(m){return s(r,400,{error:m instanceof Error?m.message:"Invalid body"}),!0}const n=await e.messageDeliverer.askSideQuestion(t,o.question);if(!n.ok)return s(r,n.status,{error:n.error}),!0;const c=e.sideQuestions.repo.insert({sessionId:t,projectId:e.hookSessions?.getBySessionId(t)?.projectId??null,question:n.question});return s(r,200,{ok:!0,sideQuestion:c}),!0}const R=u.match(/^\/sessions\/([^/]+)\/side-questions$/);if(R&&i.method==="GET"){if(!e.sideQuestions)return s(r,503,{error:"Messaging subsystem unavailable"}),!0;const t=decodeURIComponent(R[1]),o=Number(b.searchParams.get("limit")),n=Number(b.searchParams.get("beforeId")),c=O(e.sideQuestions,t,{limit:Number.isFinite(o)&&o>0?Math.min(o,100):20,beforeId:Number.isFinite(n)&&n>0?n:void 0});return s(r,200,{sideQuestions:c}),!0}return!1}
@@ -1 +1 @@
1
- import{readFileSync as F}from"node:fs";import I from"node:path";import{isHarness as y}from"@weavecode/core";import{sendJson as l}from"../http.js";import{blockingPromptFor as R,commandsSurfaceFor as w,editSurfaceFor as N}from"../../surfaces.js";function E(o,n,t){if(!n.hookSessions||!n.hookEvents)return l(o,503,{error:"Hooks subsystem unavailable"}),null;const s=n.hookSessions.getBySessionId(t);return s?s.projectId==null?(l(o,400,{error:"Session is not bound to a project"}),null):n.projects.getById(s.projectId)||(l(o,404,{error:"Project not found"}),null):(l(o,404,{error:"Session not found"}),null)}function P(o,n){if(!o.hookEvents)return null;const t=o.hookEvents.listBySession(n,1),s=t[t.length-1]?.source;return y(s)?s:null}const x=20,C=2e5;function H(o){try{const n=JSON.parse(o);return[typeof n.toolName=="string"?n.toolName:null,n.toolInput??null,n.toolResponse??null]}catch{return[null,null,null]}}function j(o){if(!o)return null;try{const n=F(o,"utf8");return n.trim()?n:null}catch{return null}}const T=2e5,O=4e6;function G(o,n){const t=I.relative(n,o);return(t&&!t.startsWith("..")&&!I.isAbsolute(t)?t:o).split(I.sep).join("/")}function B(o){if(!o)return null;const n=Date.parse(o);return Number.isFinite(n)?n:null}function U(o,n,t){if(n===null&&t===null)return!0;if(!o)return!1;const s=Date.parse(o);return!(!Number.isFinite(s)||n!==null&&s<=n||t!==null&&s>t)}function $(o,n){const t=[],s=new Map;let d=O,m=0,h=!1;for(const c of o){const p=c.hunk.before.slice(0,T),e=c.hunk.after.slice(0,T),u=p.length<c.hunk.before.length||e.length<c.hunk.after.length;u&&(h=!0);const i=p.length+e.length;if(i>d){h=!0;continue}d-=i;const r=G(c.path,n);let a=s.get(r);a||(a={path:r,hunks:[]},s.set(r,a),t.push(a)),a.hunks.push({before:p,after:e,at:c.at,...u?{clamped:!0}:{}}),m++}return{files:t,hunks:m,truncated:h}}export async function handleSessionInsightRoutes(o,n,t,s,d){const m=s.match(/^\/sessions\/([^/]+)\/plan$/);if(m&&o.method==="GET"){const e=decodeURIComponent(m[1]);if(!t.hookEvents)return l(n,503,{error:"Hook ingestion unavailable"}),!0;const u=t.hookEvents.listBySession(e,1),i=u[u.length-1]?.source,r=y(i)?R(i)?.plan??null:null;if(!r)return l(n,200,{plan:null}),!0;const a=g=>g.flatMap(S=>{const v=r.draftOf(...H(S.payload));return v?[{row:S,draft:v}]:[]}),[f]=a(t.hookEvents.listByTools(e,[r.tool],null,x));if(!f)return l(n,200,{plan:null}),!0;const[k]=a(t.hookEvents.listByTools(e,r.writeTools,r.fileHint,x)).filter(g=>g.row.id<f.row.id),b=f.draft.text??j(f.draft.filePath)??k?.draft.text??j(k?.draft.filePath??null);return b?(l(n,200,{plan:{eventId:f.row.id,at:f.row.createdAt,text:b.slice(0,C)}}),!0):(l(n,200,{plan:null}),!0)}const h=s.match(/^\/sessions\/([^/]+)\/commands$/);if(h&&o.method==="GET"){const e=decodeURIComponent(h[1]),u=E(n,t,e);if(!u)return!0;const i=P(t,e),r=i?w(i):null;return r?(l(n,200,{supported:!0,commands:await r.list({projectPath:u.path})}),!0):(l(n,200,{supported:!1,commands:[]}),!0)}const c=s.match(/^\/sessions\/([^/]+)\/command-executions$/);if(c&&o.method==="GET"){const e=decodeURIComponent(c[1]);if(!E(n,t,e))return!0;const u=P(t,e),i=u?w(u):null;if(!i)return l(n,200,{supported:!1,executions:null}),!0;const r=await i.executions(t.sessionProbe?.transcriptPathOf(e)??null);return l(n,200,{supported:r!==null,executions:r}),!0}const p=s.match(/^\/sessions\/([^/]+)\/edits$/);if(p&&o.method==="GET"){const e=decodeURIComponent(p[1]),u=E(n,t,e);if(!u)return!0;const i=P(t,e),r=i?N(i):null;if(!r)return l(n,200,{files:null,hunks:0,truncated:!1,reason:"unsupported"}),!0;const a=await r.sessionEdits({sessionId:e,transcriptPath:t.sessionProbe?.transcriptPathOf(e)??null});if(!a)return l(n,200,{files:null,hunks:0,truncated:!1,reason:"unreadable"}),!0;const f=B(d.searchParams.get("since")),k=B(d.searchParams.get("until")),b=f!==null||k!==null?a.filter(g=>U(g.at,f,k)):a;return l(n,200,$(b,u.path)),!0}return!1}
1
+ import{readFileSync as C}from"node:fs";import y from"node:path";import{isHarness as _}from"@weavecode/core";import{sendJson as i}from"../http.js";import{blockingPromptFor as R,commandsSurfaceFor as j,editSurfaceFor as F,narrationSurfaceFor as N}from"../../surfaces.js";function E(o,t,n){if(!t.hookSessions||!t.hookEvents)return i(o,503,{error:"Hooks subsystem unavailable"}),null;const r=t.hookSessions.getBySessionId(n);if(!r)return i(o,404,{error:"Session not found"}),null;if(r.projectId==null)return i(o,400,{error:"Session is not bound to a project"}),null;const f=t.projects.getById(r.projectId);return f||(i(o,404,{error:"Project not found"}),null)}function S(o,t){if(!o.hookEvents)return null;const n=o.hookEvents.listBySession(t,1),r=n[n.length-1]?.source;return _(r)?r:null}const v=20,O=2e5;function H(o){try{const t=JSON.parse(o);return[typeof t.toolName=="string"?t.toolName:null,t.toolInput??null,t.toolResponse??null]}catch{return[null,null,null]}}function w(o){if(!o)return null;try{const t=C(o,"utf8");return t.trim()?t:null}catch{return null}}const x=2e5,B=4e6;function G(o,t){const n=y.relative(t,o);return(!!n&&!n.startsWith("..")&&!y.isAbsolute(n)?n:o).split(y.sep).join("/")}function M(o){if(!o)return null;const t=Date.parse(o);return Number.isFinite(t)?t:null}function U(o,t,n){if(t===null&&n===null)return!0;if(!o)return!1;const r=Date.parse(o);return!(!Number.isFinite(r)||t!==null&&r<=t||n!==null&&r>n)}function $(o,t){const n=[],r=new Map;let f=B,I=0,h=!1;for(const c of o){const d=c.hunk.before.slice(0,x),p=c.hunk.after.slice(0,x),P=d.length<c.hunk.before.length||p.length<c.hunk.after.length;P&&(h=!0);const e=d.length+p.length;if(e>f){h=!0;continue}f-=e;const s=G(c.path,t);let u=r.get(s);u||(u={path:s,hunks:[]},r.set(s,u),n.push(u)),u.hunks.push({before:d,after:p,at:c.at,...P?{clamped:!0}:{}}),I++}return{files:n,hunks:I,truncated:h}}export async function handleSessionInsightRoutes(o,t,n,r,f){const I=r.match(/^\/sessions\/([^/]+)\/plan$/);if(I&&o.method==="GET"){const e=decodeURIComponent(I[1]);if(!n.hookEvents)return i(t,503,{error:"Hook ingestion unavailable"}),!0;const s=n.hookEvents.listBySession(e,1),u=s[s.length-1]?.source,l=_(u)?R(u)?.plan??null:null;if(!l)return i(t,200,{plan:null}),!0;const m=g=>g.flatMap(T=>{const A=l.draftOf(...H(T.payload));return A?[{row:T,draft:A}]:[]}),[a]=m(n.hookEvents.listByTools(e,[l.tool],null,v));if(!a)return i(t,200,{plan:null}),!0;const[k]=m(n.hookEvents.listByTools(e,l.writeTools,l.fileHint,v)).filter(g=>g.row.id<a.row.id),b=a.draft.text??w(a.draft.filePath)??k?.draft.text??w(k?.draft.filePath??null);return b?(i(t,200,{plan:{eventId:a.row.id,at:a.row.createdAt,text:b.slice(0,O)}}),!0):(i(t,200,{plan:null}),!0)}const h=r.match(/^\/sessions\/([^/]+)\/pre-question$/);if(h&&o.method==="GET"){const e=decodeURIComponent(h[1]);if(!E(t,n,e))return!0;const s=S(n,e),l=await(s?R(s):null)?.preQuestion?.(n.sessionProbe?.transcriptPathOf(e)??null);return i(t,200,{preQuestion:l??null}),!0}const c=r.match(/^\/sessions\/([^/]+)\/narration$/);if(c&&o.method==="GET"){const e=decodeURIComponent(c[1]);if(!E(t,n,e))return!0;const s=S(n,e),u=s?N(s):null;if(!u)return i(t,200,{supported:!1,narration:null}),!0;const l=await u.sessionNarration({sessionId:e,transcriptPath:n.sessionProbe?.transcriptPathOf(e)??null});return i(t,200,{supported:l!==null,narration:l}),!0}const d=r.match(/^\/sessions\/([^/]+)\/commands$/);if(d&&o.method==="GET"){const e=decodeURIComponent(d[1]),s=E(t,n,e);if(!s)return!0;const u=S(n,e),l=u?j(u):null;return l?(i(t,200,{supported:!0,commands:await l.list({projectPath:s.path})}),!0):(i(t,200,{supported:!1,commands:[]}),!0)}const p=r.match(/^\/sessions\/([^/]+)\/command-executions$/);if(p&&o.method==="GET"){const e=decodeURIComponent(p[1]);if(!E(t,n,e))return!0;const s=S(n,e),u=s?j(s):null;if(!u)return i(t,200,{supported:!1,executions:null}),!0;const l=await u.executions(n.sessionProbe?.transcriptPathOf(e)??null);return i(t,200,{supported:l!==null,executions:l}),!0}const P=r.match(/^\/sessions\/([^/]+)\/edits$/);if(P&&o.method==="GET"){const e=decodeURIComponent(P[1]),s=E(t,n,e);if(!s)return!0;const u=S(n,e),l=u?F(u):null;if(!l)return i(t,200,{files:null,hunks:0,truncated:!1,reason:"unsupported"}),!0;const m=await l.sessionEdits({sessionId:e,transcriptPath:n.sessionProbe?.transcriptPathOf(e)??null});if(!m)return i(t,200,{files:null,hunks:0,truncated:!1,reason:"unreadable"}),!0;const a=M(f.searchParams.get("since")),k=M(f.searchParams.get("until")),b=a!==null||k!==null?m.filter(g=>U(g.at,a,k)):m;return i(t,200,$(b,s.path)),!0}return!1}
@@ -1 +1 @@
1
- import{readBody as u,sendJson as r}from"../http.js";import{DEFAULT_AI_SETTINGS as T,DEFAULT_DECISION_SETTINGS as b,readDaemonSettings as m,writeDaemonSettings as E,terminalPresetsFor as K}from"../settings.js";import{readAiKey as G,writeAiKey as N}from"../ai-config.js";import{readDecisionKey as I,writeDecisionKey as U}from"../decision-config.js";import{accessUrls as j}from"../tls.js";import{applyLaunchOnLogin as A}from"../auto-start.js";import{readProjectConfig as h,writeProjectConfig as O}from"../../install/project-config.js";import{readStatuslineConfig as y,readStatuslineScript as C,readStatuslineFacts as v,applyStatuslineConfig as g,readGlobalStatuslineConfig as S,writeGlobalStatuslineConfig as D}from"../../statusline/manager.js";import{DEFAULT_STATUSLINE_CONFIG as J}from"../../statusline/config.js";import{listBrowseRoots as F,listDirectoryChildren as B}from"../fs-browser.js";import{projectFileNamespaces as L}from"../../hooks/toolkit.js";import{listGlobalFileAssets as _}from"../../install/global-file-assets.js";function w(i,e,s){const n=i.ai??T,l=i.decision??b,p=G(e),d=I(s);return{...i,ai:{baseUrl:n.baseUrl,model:n.model,apiKey:p,apiKeySet:p!==null},decision:{baseUrl:l.baseUrl,model:l.model,apiKey:d,apiKeySet:d!==null}}}function P(i){if(!i)return;const{apiKey:e,...s}=i;return s}export async function handleSettingsRoutes(i,e,s,n,l){if(n==="/settings"){if(i.method==="GET")return r(e,200,{settings:w(await m(),s.aiKeyPath,s.decisionKeyPath),presets:K(process.platform),platform:process.platform,urls:j(s.port,s.tlsPort??0)}),!0;if(i.method==="PUT"){let t;try{t=JSON.parse(await u(i))}catch{return r(e,400,{error:"Invalid JSON body"}),!0}const a=t.ai?.apiKey;a!==void 0&&N(typeof a=="string"?a:null,s.aiKeyPath);const o=t.decision?.apiKey;o!==void 0&&U(typeof o=="string"?o:null,s.decisionKeyPath);const c=await m(),f=await E({...c,...t,ai:t.ai?P(t.ai):c.ai,decision:t.decision?P(t.decision):c.decision});return s.hookEvents?.resetPrune(),(s.autoStart??A)(f.startup?.launchOnLogin??!1),s.dataBus?.emit({key:"settings"}),r(e,200,w(f,s.aiKeyPath,s.decisionKeyPath)),!0}}if(n==="/fs/roots"&&i.method==="GET"){const t=s.libraries?s.libraries.list().map(o=>o.path):[],a=await F(t);return r(e,200,{roots:a}),!0}if(n==="/fs/children"&&i.method==="GET"){const t=l.searchParams.get("path");if(!t)return r(e,400,{error:'Missing "path" query parameter'}),!0;try{const a=await B(t);r(e,200,{children:a})}catch(a){r(e,400,{error:`Cannot list directory: ${String(a)}`})}return!0}const p=n.match(/^\/projects\/(\d+)\/config$/);if(p){const t=s.projects.getById(Number(p[1]));if(!t)return r(e,404,{error:"Project not found"}),!0;if(i.method==="GET")return r(e,200,await h(t.path)),!0;if(i.method==="PUT"){let a;try{a=JSON.parse(await u(i))}catch{return r(e,400,{error:"Invalid JSON body"}),!0}const o=await h(t.path),c={lastSyncAt:a.lastSyncAt??o.lastSyncAt};return await O(t.path,c),r(e,200,c),!0}}if(n==="/statusline/global"){if(i.method==="GET")return r(e,200,{config:await S()}),!0;if(i.method==="PUT"){let t;try{t=JSON.parse(await u(i))}catch{return r(e,400,{error:"Invalid JSON body"}),!0}try{await D(t);for(const a of s.projects.list()){const o=await y(a.path);o.source==="global"&&await g(a.path,o)}s.dataBus?.emit({key:"statusline"}),r(e,200,{ok:!0})}catch(a){r(e,400,{error:a instanceof Error?a.message:"Global statusline update failed"})}return!0}}if(n==="/statusline/default"&&i.method==="GET")return r(e,200,{config:J}),!0;const d=n.match(/^\/projects\/(\d+)\/statusline$/);if(d){const t=s.projects.getById(Number(d[1]));if(!t)return r(e,404,{error:"Project not found"}),!0;if(i.method==="GET"){const[a,o,c]=await Promise.all([y(t.path),C(t.path),S()]);return r(e,200,{config:a,script:o,globalConfig:c,facts:v(t.path)}),!0}if(i.method==="PUT"){let a;try{a=JSON.parse(await u(i))}catch{return r(e,400,{error:"Invalid JSON body"}),!0}try{await g(t.path,a),s.dataBus?.emit({key:"statusline",projectPath:t.path}),r(e,200,{ok:!0})}catch(o){r(e,400,{error:o instanceof Error?o.message:"Statusline update failed"})}return!0}}if(n==="/assets"&&i.method==="GET"){const t=l.searchParams.get("path");if(!t)return r(e,400,{error:'Missing "path" query parameter'}),!0;if(!s.watch)return r(e,503,{error:"Watch service unavailable"}),!0;const a=await L(t),o=s.watch.getAssets(t).map(c=>{const f=a.get(c.relPath);return f?{...c,namespace:f}:c});return r(e,200,{projectPath:t,assets:o}),!0}return n==="/global-file-assets"&&i.method==="GET"?(r(e,200,{assets:await _()}),!0):!1}
1
+ import{readBody as m,sendJson as i}from"../http.js";import{DEFAULT_AI_SETTINGS as P,DEFAULT_DECISION_SETTINGS as K,readDaemonSettings as y,writeDaemonSettings as E,terminalPresetsFor as T}from"../settings.js";import{readAiKey as N,writeAiKey as G}from"../ai-config.js";import{readDecisionKey as j,writeDecisionKey as A}from"../decision-config.js";import{accessUrls as I}from"../tls.js";import{applyLaunchOnLogin as O}from"../auto-start.js";import{WEAVE_VERSION as U}from"../../version.js";import{readProjectConfig as h,writeProjectConfig as C}from"../../install/project-config.js";import{readStatuslineConfig as p,readStatuslineScript as v,readStatuslineFacts as D,applyStatuslineConfig as g,readGlobalStatuslineConfig as S,writeGlobalStatuslineConfig as J}from"../../statusline/manager.js";import{DEFAULT_STATUSLINE_CONFIG as F}from"../../statusline/config.js";import{listBrowseRoots as _,listDirectoryChildren as B}from"../fs-browser.js";import{projectFileNamespaces as L}from"../../hooks/toolkit.js";import{listGlobalFileAssets as k}from"../../install/global-file-assets.js";function w(a,r,o){const s=a.ai??P,u=a.decision??K,l=N(r),f=j(o);return{...a,ai:{baseUrl:s.baseUrl,model:s.model,apiKey:l,apiKeySet:l!==null},decision:{baseUrl:u.baseUrl,model:u.model,apiKey:f,apiKeySet:f!==null}}}function b(a){if(!a)return;const{apiKey:r,...o}=a;return o}export async function handleSettingsRoutes(a,r,o,s,u){if(s==="/settings"){if(a.method==="GET")return i(r,200,{settings:w(await y(),o.aiKeyPath,o.decisionKeyPath),presets:T(process.platform),platform:process.platform,urls:I(o.port,o.tlsPort??0),version:U,repoUrl:"https://github.com/zijing66/weave"}),!0;if(a.method==="PUT"){let t;try{t=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}const e=t.ai?.apiKey;e!==void 0&&G(typeof e=="string"?e:null,o.aiKeyPath);const n=t.decision?.apiKey;n!==void 0&&A(typeof n=="string"?n:null,o.decisionKeyPath);const c=await y(),d=await E({...c,...t,ai:t.ai?b(t.ai):c.ai,decision:t.decision?b(t.decision):c.decision});return o.hookEvents?.resetPrune(),(o.autoStart??O)(d.startup?.launchOnLogin??!1),o.dataBus?.emit({key:"settings"}),i(r,200,w(d,o.aiKeyPath,o.decisionKeyPath)),!0}}if(s==="/fs/roots"&&a.method==="GET"){const t=o.libraries?o.libraries.list().map(n=>n.path):[],e=await _(t);return i(r,200,{roots:e}),!0}if(s==="/fs/children"&&a.method==="GET"){const t=u.searchParams.get("path");if(!t)return i(r,400,{error:'Missing "path" query parameter'}),!0;try{const e=await B(t);i(r,200,{children:e})}catch(e){i(r,400,{error:`Cannot list directory: ${String(e)}`})}return!0}const l=s.match(/^\/projects\/(\d+)\/config$/);if(l){const t=o.projects.getById(Number(l[1]));if(!t)return i(r,404,{error:"Project not found"}),!0;if(a.method==="GET")return i(r,200,await h(t.path)),!0;if(a.method==="PUT"){let e;try{e=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}const n=await h(t.path),c={lastSyncAt:e.lastSyncAt??n.lastSyncAt};return await C(t.path,c),i(r,200,c),!0}}if(s==="/statusline/global"){if(a.method==="GET")return i(r,200,{config:await S()}),!0;if(a.method==="PUT"){let t;try{t=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}try{await J(t);for(const e of o.projects.list()){const n=await p(e.path);n.source==="global"&&await g(e.path,n)}o.dataBus?.emit({key:"statusline"}),i(r,200,{ok:!0})}catch(e){i(r,400,{error:e instanceof Error?e.message:"Global statusline update failed"})}return!0}}if(s==="/statusline/default"&&a.method==="GET")return i(r,200,{config:F}),!0;const f=s.match(/^\/projects\/(\d+)\/statusline$/);if(f){const t=o.projects.getById(Number(f[1]));if(!t)return i(r,404,{error:"Project not found"}),!0;if(a.method==="GET"){const[e,n,c]=await Promise.all([p(t.path),v(t.path),S()]);return i(r,200,{config:e,script:n,globalConfig:c,facts:D(t.path)}),!0}if(a.method==="PUT"){let e;try{e=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}try{await g(t.path,e),o.dataBus?.emit({key:"statusline",projectPath:t.path}),i(r,200,{ok:!0})}catch(n){i(r,400,{error:n instanceof Error?n.message:"Statusline update failed"})}return!0}}if(s==="/assets"&&a.method==="GET"){const t=u.searchParams.get("path");if(!t)return i(r,400,{error:'Missing "path" query parameter'}),!0;if(!o.watch)return i(r,503,{error:"Watch service unavailable"}),!0;const e=await L(t),n=o.watch.getAssets(t).map(c=>{const d=e.get(c.relPath);return d?{...c,namespace:d}:c});return i(r,200,{projectPath:t,assets:n}),!0}return s==="/global-file-assets"&&a.method==="GET"?(i(r,200,{assets:await k()}),!0):!1}
@@ -1 +1 @@
1
- import{createReadStream as w}from"node:fs";import{z as u}from"zod";import{readJson as c,readRawBody as E,sendJson as o}from"../http.js";import{isImageMediaType as I,maxUploadBytes as b}from"../../repositories/uploads.js";import{defaultUploadSessions as S}from"../upload-sessions.js";const z=u.object({name:u.string().min(1).max(200),mediaType:u.string().min(1).max(100),data:u.string().min(1),projectId:u.number().int().positive().optional()}),B=u.object({name:u.string().min(1).max(200),mediaType:u.string().min(1).max(100),size:u.number().int().positive(),projectId:u.number().int().positive().optional()});function j(s,e){return(I(e)?s?.images:s?.files)??null}const x=16*1024*1024;function f(s){return{id:s.id,name:s.name,mediaType:s.mediaType,size:s.size}}function g(s,e,a){if(!s.projects.getById(e))return null;const d=s.projects.getMeta(e);return j(d?.storage,a)}export async function handleUploadRoutes(s,e,a,d,h){const l=a.uploadSessions??S;if(d==="/uploads/begin"&&s.method==="POST"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;let r;try{r=B.parse(await c(s))}catch(n){return o(e,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}if(r.size>b(r.mediaType))return o(e,413,{error:"File too large"}),!0;const t=r.projectId?g(a,r.projectId,r.mediaType):null,i=await l.begin({...r,dir:t});return o(e,201,{uploadId:i.id,received:0,size:i.size}),!0}const p=d.match(/^\/uploads\/([0-9a-f-]{36})\/finish$/);if(p&&s.method==="POST"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;const r=await l.finish(p[1]);if(!r)return o(e,409,{error:"Upload incomplete"}),!0;const t=await a.uploads.adoptFromFile(r);return await l.abort(p[1]),o(e,201,{upload:f(t)}),!0}const y=d.match(/^\/uploads\/([0-9a-f-]{36})$/);if(y){const r=y[1];if(s.method==="GET"){const t=await l.get(r);return t?(o(e,200,{received:t.received,size:t.size,name:t.name,mediaType:t.mediaType}),!0):(o(e,404,{error:"Upload not found"}),!0)}if(s.method==="PUT"){const t=Number(h.searchParams.get("offset")??"");if(!Number.isInteger(t)||t<0)return o(e,400,{error:"Invalid offset"}),!0;const i=await E(s,x).catch(()=>null);if(!i)return o(e,413,{error:"Chunk too large"}),!0;const n=await l.append(r,t,i);return n.kind==="missing"?(o(e,404,{error:"Upload not found"}),!0):n.kind==="conflict"?(o(e,409,{received:n.received}),!0):n.kind==="overflow"?(o(e,413,{received:n.received,error:"Exceeds declared size"}),!0):(o(e,200,{received:n.received}),!0)}if(s.method==="DELETE")return await l.abort(r),o(e,200,{ok:!0}),!0}if(d==="/uploads"&&s.method==="POST"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;let r;try{r=z.parse(await c(s))}catch(n){return o(e,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}const t=Buffer.from(r.data,"base64");if(t.length===0)return o(e,400,{error:"Empty upload"}),!0;if(t.length>b(r.mediaType))return o(e,413,{error:"File too large"}),!0;const i=a.uploads.save({name:r.name,mediaType:r.mediaType,bytes:t,dir:r.projectId?g(a,r.projectId,r.mediaType):null});return o(e,201,{upload:f(i)}),!0}const m=d.match(/^\/sessions\/([^/]+)\/uploads$/);if(m&&s.method==="GET"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;const r=a.uploads.uploadsBySession(decodeURIComponent(m[1]));return o(e,200,{uploads:(r??[]).map(t=>({...f(t),createdAt:t.createdAt})),totalBytes:(r??[]).reduce((t,i)=>t+i.size,0)}),!0}if(m&&s.method==="DELETE"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;const r=a.uploads.uploadsBySession(decodeURIComponent(m[1]));if(!r)return o(e,200,{removed:0,freedBytes:0}),!0;const t=r.reduce((n,U)=>n+U.size,0),i=a.uploads.removeMany(r.map(n=>n.id));return a.dataBus?.emit({key:"sessions"}),o(e,200,{removed:i,freedBytes:t}),!0}if(d==="/uploads/unreferenced"&&s.method==="GET")return a.uploads?(o(e,200,a.uploads.unreferencedStats()),!0):(o(e,503,{error:"Upload subsystem unavailable"}),!0);if(d==="/uploads/overview"&&s.method==="GET")return a.uploads?(o(e,200,a.uploads.overview()),!0):(o(e,503,{error:"Upload subsystem unavailable"}),!0);const T=u.object({ids:u.array(u.string().regex(/^[a-f0-9]{64}$/)).min(1).max(500)});if(d==="/uploads/remove"&&s.method==="POST"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;let r;try{r=T.parse(await c(s))}catch(i){return o(e,400,{error:i instanceof Error?i.message:"Invalid body"}),!0}const t=a.uploads.removeMany(r.ids);return a.dataBus?.emit({key:"sessions"}),o(e,200,{removed:t}),!0}if(d==="/uploads/usage"&&s.method==="GET")return a.uploads?(o(e,200,{sessions:a.uploads.usageBySession()}),!0):(o(e,503,{error:"Upload subsystem unavailable"}),!0);if(d==="/uploads/unreferenced"&&s.method==="POST"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;let r={done:0,total:0};const t=a.uploads.cleanupUnreferenced((i,n)=>{r={done:i,total:n}});return a.dataBus?.emit({key:"sessions"}),o(e,200,{removed:t,...r}),!0}const v=d.match(/^\/images\/([a-f0-9]{64})$/);if(v&&s.method==="GET"){if(!a.uploads)return o(e,503,{error:"Upload subsystem unavailable"}),!0;const r=a.uploads.fileStatOf(v[1]);if(!r)return o(e,404,{error:"Image not found"}),!0;e.writeHead(200,{"content-type":r.row.mediaType,"content-length":String(r.size),"cache-control":"private, max-age=31536000, immutable"});const t=w(r.file);return t.on("error",()=>{typeof e.destroy=="function"&&e.destroy()}),t.pipe(e),!0}return!1}
1
+ import{createReadStream as B}from"node:fs";import{z as d}from"zod";import{readJson as p,readRawBody as E,sendJson as r}from"../http.js";import{isImageMediaType as I,maxUploadBytes as g}from"../../repositories/uploads.js";import{defaultUploadSessions as S}from"../upload-sessions.js";const w=d.object({name:d.string().min(1).max(200),mediaType:d.string().min(1).max(100),data:d.string().min(1),projectId:d.number().int().positive().optional()}),j=d.object({name:d.string().min(1).max(200),mediaType:d.string().min(1).max(100),size:d.number().int().positive(),projectId:d.number().int().positive().optional()});function z(i,e){return(I(e)?i?.images:i?.files)??null}const x=16*1024*1024;function y(i,e){return{id:e.id,name:e.name,mediaType:e.mediaType,size:e.size,path:i.uploads.filePath(e.id,e.mediaType,e.name,e.dir??i.uploads.defaultDir)}}function T(i,e,o){if(!i.projects.getById(e))return null;const c=i.projects.getMeta(e);return z(c?.storage,o)}export async function handleUploadRoutes(i,e,o,s,c){const l=o.uploadSessions??S;if(s==="/uploads/begin"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t;try{t=j.parse(await p(i))}catch(n){return r(e,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}if(t.size>g(t.mediaType))return r(e,413,{error:"File too large"}),!0;const a=t.projectId?T(o,t.projectId,t.mediaType):null,u=await l.begin({...t,dir:a});return r(e,201,{uploadId:u.id,received:0,size:u.size}),!0}const f=s.match(/^\/uploads\/([0-9a-f-]{36})\/finish$/);if(f&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=await l.finish(f[1]);if(!t)return r(e,409,{error:"Upload incomplete"}),!0;const a=await o.uploads.adoptFromFile(t);return await l.abort(f[1]),r(e,201,{upload:y(o,a)}),!0}const b=s.match(/^\/uploads\/([0-9a-f-]{36})$/);if(b){const t=b[1];if(i.method==="GET"){const a=await l.get(t);return a?(r(e,200,{received:a.received,size:a.size,name:a.name,mediaType:a.mediaType}),!0):(r(e,404,{error:"Upload not found"}),!0)}if(i.method==="PUT"){const a=Number(c.searchParams.get("offset")??"");if(!Number.isInteger(a)||a<0)return r(e,400,{error:"Invalid offset"}),!0;const u=await E(i,x).catch(()=>null);if(!u)return r(e,413,{error:"Chunk too large"}),!0;const n=await l.append(t,a,u);return n.kind==="missing"?(r(e,404,{error:"Upload not found"}),!0):n.kind==="conflict"?(r(e,409,{received:n.received}),!0):n.kind==="overflow"?(r(e,413,{received:n.received,error:"Exceeds declared size"}),!0):(r(e,200,{received:n.received}),!0)}if(i.method==="DELETE")return await l.abort(t),r(e,200,{ok:!0}),!0}if(s==="/uploads"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t;try{t=w.parse(await p(i))}catch(n){return r(e,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}const a=Buffer.from(t.data,"base64");if(a.length===0)return r(e,400,{error:"Empty upload"}),!0;if(a.length>g(t.mediaType))return r(e,413,{error:"File too large"}),!0;const u=o.uploads.save({name:t.name,mediaType:t.mediaType,bytes:a,dir:t.projectId?T(o,t.projectId,t.mediaType):null});return r(e,201,{upload:y(o,u)}),!0}const m=s.match(/^\/sessions\/([^/]+)\/uploads$/);if(m&&i.method==="GET"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=o.uploads.uploadsBySession(decodeURIComponent(m[1]));return r(e,200,{uploads:(t??[]).map(a=>({...y(o,a),createdAt:a.createdAt})),totalBytes:(t??[]).reduce((a,u)=>a+u.size,0)}),!0}if(m&&i.method==="DELETE"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=o.uploads.uploadsBySession(decodeURIComponent(m[1]));if(!t)return r(e,200,{removed:0,freedBytes:0}),!0;const a=t.reduce((n,U)=>n+U.size,0),u=o.uploads.removeMany(t.map(n=>n.id));return o.dataBus?.emit({key:"sessions"}),r(e,200,{removed:u,freedBytes:a}),!0}if(s==="/uploads/unreferenced"&&i.method==="GET")return o.uploads?(r(e,200,o.uploads.unreferencedStats()),!0):(r(e,503,{error:"Upload subsystem unavailable"}),!0);if(s==="/uploads/overview"&&i.method==="GET")return o.uploads?(r(e,200,o.uploads.overview()),!0):(r(e,503,{error:"Upload subsystem unavailable"}),!0);const h=d.object({ids:d.array(d.string().regex(/^[a-f0-9]{64}$/)).min(1).max(500)});if(s==="/uploads/remove"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t;try{t=h.parse(await p(i))}catch(u){return r(e,400,{error:u instanceof Error?u.message:"Invalid body"}),!0}const a=o.uploads.removeMany(t.ids);return o.dataBus?.emit({key:"sessions"}),r(e,200,{removed:a}),!0}if(s==="/uploads/usage"&&i.method==="GET")return o.uploads?(r(e,200,{sessions:o.uploads.usageBySession()}),!0):(r(e,503,{error:"Upload subsystem unavailable"}),!0);if(s==="/uploads/unreferenced"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t={done:0,total:0};const a=o.uploads.cleanupUnreferenced((u,n)=>{t={done:u,total:n}});return o.dataBus?.emit({key:"sessions"}),r(e,200,{removed:a,...t}),!0}const v=s.match(/^\/images\/([a-f0-9]{64})$/);if(v&&i.method==="GET"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=o.uploads.fileStatOf(v[1]);if(!t)return r(e,404,{error:"Image not found"}),!0;e.writeHead(200,{"content-type":t.row.mediaType,"content-length":String(t.size),"cache-control":"private, max-age=31536000, immutable"});const a=B(t.file);return a.on("error",()=>{typeof e.destroy=="function"&&e.destroy()}),a.pipe(e),!0}return!1}
@@ -1 +1 @@
1
- import{z as o}from"zod";import{isHarness as I}from"@weavecode/core";import{readJson as m,sendJson as e}from"../http.js";import{messagingSurfaceFor as v}from"../../surfaces.js";import{DEFAULT_WATCH_ON as E}from"../../repositories/session-watches.js";const k=o.object({watcherSessionId:o.string().min(1).nullable().optional(),notify:o.string().min(1).max(2e4).nullable().optional(),on:o.array(o.enum(["idle","turnEnd","messageFailed"])).min(1).optional(),times:o.number().int().min(1).max(100).nullable().optional()}),W=o.object({watchId:o.number().int().positive()}),T=o.object({endpoint:o.string().url(),keys:o.object({p256dh:o.string().min(1),auth:o.string().min(1)})}),B=o.object({endpoint:o.string().url()});function P(i,s){return i.queuedPrompt!==null||i.prompt!==null||s}export async function handleWatchRoutes(i,s,t,d){const f=d.match(/^\/sessions\/([^/]+)\/watch$/);if(f){const n=decodeURIComponent(f[1]);if(i.method==="POST"){if(!t.sessionWatches||!t.hookSessions||!t.hookEvents)return e(s,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=k.parse(await m(i))}catch(u){return e(s,400,{error:u instanceof Error?u.message:"Invalid body"}),!0}if(!t.hookSessions.getBySessionId(n))return e(s,404,{error:"Session not found"}),!0;const c=t.hookEvents.listBySession(n,1),a=c[c.length-1]?.source;if(!I(a))return e(s,400,{error:"Session has no hook events to determine its harness"}),!0;const h=v(a),l=r.on??[...E];if((l.includes("idle")||l.includes("turnEnd"))&&h.idleSignals.length===0)return e(s,409,{error:h.unsupportedReasons?.watch??`Harness "${a}" does not support idle watching`}),!0;if(l.includes("messageFailed")&&!(P(h,t.messageDeliverer?.hasTerminalChannel()??!1)||h.inject!==null||h.headless!==null))return e(s,409,{error:h.unsupportedReasons?.prompt??`Harness "${a}" supports no messaging channel`}),!0;if(r.watcherSessionId){if(!t.hookSessions.getBySessionId(r.watcherSessionId))return e(s,404,{error:"Watcher session not found"}),!0;const u=t.hookEvents.listBySession(r.watcherSessionId,1),g=u[u.length-1]?.source;if(!I(g))return e(s,400,{error:"Watcher session has no hook events to determine its harness"}),!0;const w=v(g);if(!w.inject)return e(s,409,{error:w.unsupportedReasons?.inject??`Harness "${g}" cannot receive watch notifications`}),!0}const b=r.times===void 0?1:r.times,y=(r.watcherSessionId??null)===null?t.sessionWatches.listPendingByTarget(n).find(u=>u.watcherSessionId===null):void 0,S=y?t.sessionWatches.updateById(y.id,{onEvents:l,remaining:b}):void 0,p=S??t.sessionWatches.insert({watcherSessionId:r.watcherSessionId??null,targetSessionId:n,notify:r.notify??null,onEvents:l,times:b});return t.watchEngine?.created(p),e(s,S?200:201,{ok:!0,watchId:p.id,watch:p}),!0}if(i.method==="DELETE"){if(!t.sessionWatches)return e(s,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=W.parse(await m(i))}catch(a){return e(s,400,{error:a instanceof Error?a.message:"Invalid body"}),!0}const c=t.sessionWatches.getById(r.watchId);return!c||c.targetSessionId!==n||c.firedAt!==null?(e(s,404,{error:"Watch not found"}),!0):(t.sessionWatches.deleteById(r.watchId),e(s,200,{ok:!0,watchId:r.watchId}),!0)}}if(d==="/messaging/watches"&&i.method==="GET")return t.sessionWatches?(e(s,200,{watches:t.sessionWatches.listPending()}),!0):(e(s,503,{error:"Messaging subsystem unavailable"}),!0);if(d==="/messaging/push/key"&&i.method==="GET")return t.pushNotifier?(e(s,200,{publicKey:t.pushNotifier.publicKey()}),!0):(e(s,503,{error:"Push subsystem unavailable"}),!0);if(d==="/messaging/push/subscribe"&&i.method==="POST"){if(!t.pushSubscriptions)return e(s,503,{error:"Push subsystem unavailable"}),!0;try{const n=T.parse(await m(i)),r=t.pushSubscriptions.upsert({endpoint:n.endpoint,p256dh:n.keys.p256dh,auth:n.keys.auth,userAgent:i.headers["user-agent"]??null});e(s,201,{ok:!0,subscription:r})}catch(n){e(s,400,{error:n instanceof Error?n.message:"Invalid body"})}return!0}if(d==="/messaging/push/unsubscribe"&&i.method==="POST"){if(!t.pushSubscriptions)return e(s,503,{error:"Push subsystem unavailable"}),!0;try{const n=B.parse(await m(i));t.pushSubscriptions.deleteByEndpoint(n.endpoint),e(s,200,{ok:!0})}catch(n){e(s,400,{error:n instanceof Error?n.message:"Invalid body"})}return!0}return!1}
1
+ import{z as o}from"zod";import{isHarness as E}from"@weavecode/core";import{readJson as g,sendJson as t}from"../http.js";import{messagingSurfaceFor as k}from"../../surfaces.js";import{DEFAULT_WATCH_ON as W}from"../../repositories/session-watches.js";const B=o.object({watcherSessionId:o.string().min(1).nullable().optional(),notify:o.string().min(1).max(2e4).nullable().optional(),on:o.array(o.enum(["idle","turnEnd","messageFailed"])).min(1).optional(),times:o.number().int().min(1).max(100).nullable().optional()}),P=o.object({watchId:o.number().int().positive()}),T=o.object({endpoint:o.string().url(),keys:o.object({p256dh:o.string().min(1),auth:o.string().min(1)})}),j=o.object({endpoint:o.string().url()});function C(i,e){return i.queuedPrompt!==null||i.prompt!==null||e}export async function handleWatchRoutes(i,e,n,c){const y=c.match(/^\/sessions\/([^/]+)\/watch$/);if(y){const s=decodeURIComponent(y[1]);if(i.method==="POST"){if(!n.sessionWatches||!n.hookSessions||!n.hookEvents)return t(e,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=B.parse(await g(i))}catch(u){return t(e,400,{error:u instanceof Error?u.message:"Invalid body"}),!0}if(!n.hookSessions.getBySessionId(s))return t(e,404,{error:"Session not found"}),!0;const h=n.hookEvents.listBySession(s,1),m=h[h.length-1]?.source;if(!E(m))return t(e,400,{error:"Session has no hook events to determine its harness"}),!0;const a=k(m),l=r.on??[...W];if((l.includes("idle")||l.includes("turnEnd"))&&a.idleSignals.length===0)return t(e,409,{error:a.unsupportedReasons?.watch??`Harness "${m}" does not support idle watching`}),!0;if(l.includes("messageFailed")&&!(C(a,n.messageDeliverer?.hasTerminalChannel()??!1)||a.inject!==null||a.headless!==null))return t(e,409,{error:a.unsupportedReasons?.prompt??`Harness "${m}" supports no messaging channel`}),!0;if(r.watcherSessionId){if(!n.hookSessions.getBySessionId(r.watcherSessionId))return t(e,404,{error:"Watcher session not found"}),!0;const I=n.hookEvents.listBySession(r.watcherSessionId,1),b=I[I.length-1]?.source;if(!E(b))return t(e,400,{error:"Watcher session has no hook events to determine its harness"}),!0;const v=k(b);if(!v.inject)return t(e,409,{error:v.unsupportedReasons?.inject??`Harness "${b}" cannot receive watch notifications`}),!0}const p=r.times===void 0?1:r.times,w=(r.watcherSessionId??null)===null?n.sessionWatches.listPendingByTarget(s).find(u=>u.watcherSessionId===null):void 0,S=w?n.sessionWatches.updateById(w.id,{onEvents:l,remaining:p}):void 0,f=S??n.sessionWatches.insert({watcherSessionId:r.watcherSessionId??null,targetSessionId:s,notify:r.notify??null,onEvents:l,times:p});return n.watchEngine?.created(f),t(e,S?200:201,{ok:!0,watchId:f.id,watch:f}),!0}if(i.method==="DELETE"){if(!n.sessionWatches)return t(e,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=P.parse(await g(i))}catch(h){return t(e,400,{error:h instanceof Error?h.message:"Invalid body"}),!0}const d=n.sessionWatches.getById(r.watchId);return!d||d.targetSessionId!==s||d.firedAt!==null?(t(e,404,{error:"Watch not found"}),!0):(n.sessionWatches.deleteById(r.watchId),t(e,200,{ok:!0,watchId:r.watchId}),!0)}}if(c==="/messaging/watches"&&i.method==="GET")return n.sessionWatches?(t(e,200,{watches:n.sessionWatches.listPending()}),!0):(t(e,503,{error:"Messaging subsystem unavailable"}),!0);if(c==="/messaging/push/key"&&i.method==="GET")return n.pushNotifier?(t(e,200,{publicKey:n.pushNotifier.publicKey()}),!0):(t(e,503,{error:"Push subsystem unavailable"}),!0);if(c==="/messaging/push/subscribe"&&i.method==="POST"){if(!n.pushSubscriptions)return t(e,503,{error:"Push subsystem unavailable"}),!0;try{const s=T.parse(await g(i)),r=n.pushSubscriptions.upsert({endpoint:s.endpoint,p256dh:s.keys.p256dh,auth:s.keys.auth,userAgent:i.headers["user-agent"]??null});t(e,201,{ok:!0,subscription:r})}catch(s){t(e,400,{error:s instanceof Error?s.message:"Invalid body"})}return!0}if(c==="/messaging/push/unsubscribe"&&i.method==="POST"){if(!n.pushSubscriptions)return t(e,503,{error:"Push subsystem unavailable"}),!0;try{const s=j.parse(await g(i));n.pushSubscriptions.deleteByEndpoint(s.endpoint),t(e,200,{ok:!0})}catch(s){t(e,400,{error:s instanceof Error?s.message:"Invalid body"})}return!0}return!1}
@@ -17,7 +17,7 @@ import type { SnapshotRefresher } from './snapshot-refresher.js';
17
17
  import type { SessionProbe } from './session-probe.js';
18
18
  import type { ProjectUpdatesRefresher } from './project-updates-refresher.js';
19
19
  import type { ResumeRunner } from '../hooks/resume-runner.js';
20
- import type { MessageDeliverer } from '../hooks/message-deliverer.js';
20
+ import type { MessageDeliverer, PromptTerminal } from '../hooks/message-deliverer.js';
21
21
  import type { QuestionTracker } from '../hooks/question-tracker.js';
22
22
  import type { SideQuestionDeps } from '../hooks/side-questions.js';
23
23
  import type { WatchEngine } from '../hooks/watch-engine.js';
@@ -36,7 +36,7 @@ import { ApiLogger } from './api-log.js';
36
36
  import type { ToolkitService } from '../hooks/toolkit.js';
37
37
  import type { ProjectOpener } from './opener.js';
38
38
  import type { AuthService } from './dashboard-auth.js';
39
- export declare const DAEMON_VERSION = "0.1.0";
39
+ export declare const DAEMON_VERSION: string;
40
40
  export interface WeaveServerDeps {
41
41
  projects: ProjectRepository;
42
42
  port: number;
@@ -99,6 +99,12 @@ export interface WeaveServerDeps {
99
99
  hookRunner?: ResumeRunner;
100
100
  /** 消息域投递器(消息域重塑:纯管道裁决 + prompt 三层);/sessions/:id/messages 依赖它。 */
101
101
  messageDeliverer?: MessageDeliverer;
102
+ /**
103
+ * 层② 终端通道(promptTerminalChannel 的产物,与 messageDeliverer 的 terminal
104
+ * 同一实例):new-session 的引导注入(`resume.bootstrapText`)借它定位 pane env
105
+ * → pane id 并打文本。缺省 = 无引导注入(会话行等宿主自己的建档节奏)。
106
+ */
107
+ terminal?: PromptTerminal;
102
108
  /** 会话上传件(内容寻址落盘 + event_images 指针);/uploads 与 /images/:id 依赖它。 */
103
109
  uploads?: UploadRepository;
104
110
  /** 分块上传的半截件(cache/tmp);/uploads/begin 等依赖它(缺省用进程内默认落点)。 */
@@ -1,13 +1,13 @@
1
- import y from"node:http";import{WEAVE_VERSION as S}from"../version.js";import{isHarness as E}from"@weavecode/core";import h from"node:fs";import l from"node:path";import{SseHub as H}from"./sse-hub.js";import{importPromptImagesOnce as N,needsImageImport as R}from"./prompt-images.js";import{sendJson as m}from"./http.js";import{FingerprintCache as P}from"../install/fingerprint.js";import{ApiLogger as k}from"./api-log.js";import{handleHooksRoutes as j}from"./hooks-routes.js";import{handleMcpRequest as x}from"./mcp-orchestration.js";import{handleToolkitRoutes as W}from"./toolkit-routes.js";import{handleCaptureRoutes as O}from"./capture-routes.js";import{handleConfigRoutes as T}from"./config-routes.js";import{handleMarketRoutes as A}from"./routes/market.js";import{handleProjectRoutes as I}from"./routes/projects.js";import{handleSettingsRoutes as M}from"./routes/settings-statusline.js";import{DAEMON_HOST as C}from"./port.js";import{handleAuthRoutes as D}from"./auth-routes.js";import{handleAiRoutes as J}from"./ai-routes.js";export const DAEMON_VERSION=S;export function weaveRequestHandler(e){const r=e.fingerprintCache??new P,t=e.apiLog??new k,o=e.sseHub??new H(e),a={...e,fingerprintCache:r,apiLog:t,sseHub:o};return(n,s)=>{t.begin(n,s),$(n,s,a)}}export function createWeaveServer(e){return y.createServer(weaveRequestHandler(e))}async function $(e,r,t){const o=new URL(e.url??"/",`http://${C}`);let a=o.pathname;if(a.startsWith("/api/")?a=a.slice(4):a==="/api"&&(a="/"),a==="/health"&&e.method==="GET"){m(r,200,{service:"weave-daemon",version:DAEMON_VERSION,pid:process.pid,port:t.port,uptimeMs:Math.round(process.uptime()*1e3)});return}if(await D(e,r,t,a)||await J(e,r,t,a))return;if(t.auth&&!z(e,a,t)&&!t.auth.isAuthenticated(e.headers)){m(r,401,{error:"Unauthorized"});return}if(a==="/mcp"){await x(e,r,{port:t.port,token:t.auth?.getLocalToken()??null});return}if(a==="/api-logs"&&e.method==="GET"){if(!t.apiLog){m(r,503,{error:"API log unavailable"});return}const s=o.searchParams.get("status"),c=o.searchParams.get("limit"),i=await t.apiLog.query({from:o.searchParams.get("from")??void 0,to:o.searchParams.get("to")??void 0,path:o.searchParams.get("path")??void 0,method:o.searchParams.get("method")??void 0,status:s==null?void 0:Number(s),limit:c==null?void 0:Number(c)});m(r,200,i);return}if(await j(e,r,t,a,o)||await W(e,r,t,a,o)||await O(e,r,t,a)||await T(e,r,t,a,o))return;const n=a.match(/^\/projects\/(\d+)\/hooks$/);if(n&&e.method==="GET"){if(!t.hookEvents){m(r,503,{error:"Hook ingestion unavailable"});return}const s=Number(n[1]),c=q(o.searchParams.get("limit")),i=o.searchParams.get("sessionId"),f=o.searchParams.get("beforeId"),u=f?Number(f):void 0,w=(o.searchParams.get("types")??"").split(",").map(p=>p.trim()).filter(Boolean);if(i){const p=t.hookEvents.listBySession(i,c??300,u,w);let v=t.uploads?.imagesBySession(i);if(R(p,v)){const d=t.projects.getMeta(s);await N({hookEvents:t.hookEvents,uploads:t.uploads,sessionProbe:t.sessionProbe,uploadDir:d?.storage?.images??null},i,_(p))&&(v=t.uploads?.imagesBySession(i))}m(r,200,{events:p.map(d=>{const b=v?.get(d.id);return b?.length?{...d,images:b.map(g=>({id:g.id,name:g.name,mediaType:g.mediaType,size:g.size}))}:d})});return}m(r,200,{events:t.hookEvents.listByProject(s,c)});return}if(!await A(e,r,t,a,o)&&!await M(e,r,t,a,o)){if(a==="/events"&&e.method==="GET"){L(e,r,t,o);return}if(!await I(e,r,t,a)){if(e.method==="GET"&&t.staticDir){G(r,a,t.staticDir);return}m(r,404,{error:"Not found"})}}}const B=25e3;function L(e,r,t,o){const a=t.sseHub;if(!a||!t.watch&&!t.hookBus&&!t.dataBus){r.statusCode=503,r.setHeader("content-type","application/json"),r.end(JSON.stringify({error:"Event stream unavailable"}));return}const n=e.headers["last-event-id"],s=(Array.isArray(n)?n[0]:n)??o.searchParams.get("since")??null,c=a.replay(s);r.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive","x-accel-buffering":"no"}),r.write(`: connected
1
+ import y from"node:http";import{WEAVE_VERSION as S}from"../version.js";import{isHarness as R}from"@weavecode/core";import h from"node:fs";import d from"node:path";import{SseHub as E}from"./sse-hub.js";import{importPromptImagesOnce as H,needsImageImport as N}from"./prompt-images.js";import{sendJson as u}from"./http.js";import{FingerprintCache as P}from"../install/fingerprint.js";import{ApiLogger as j}from"./api-log.js";import{handleHooksRoutes as k}from"./hooks-routes.js";import{handleMcpRequest as x}from"./mcp-orchestration.js";import{handleToolkitRoutes as I}from"./toolkit-routes.js";import{handleCaptureRoutes as T}from"./capture-routes.js";import{handleConfigRoutes as A}from"./config-routes.js";import{handleMarketRoutes as O}from"./routes/market.js";import{handleProjectRoutes as W}from"./routes/projects.js";import{handleSettingsRoutes as M}from"./routes/settings-statusline.js";import{handleSearchRoutes as C}from"./routes/search.js";import{handleProjectFileRoutes as B}from"./routes/project-files.js";import{DAEMON_HOST as J}from"./port.js";import{handleAuthRoutes as L}from"./auth-routes.js";import{handleAiRoutes as $}from"./ai-routes.js";export const DAEMON_VERSION=S;export function weaveRequestHandler(t){const n=t.fingerprintCache??new P,e=t.apiLog??new j,r=t.sseHub??new E(t),i={...t,fingerprintCache:n,apiLog:e,sseHub:r};return(s,o)=>{e.begin(s,o),D(s,o,i)}}export function createWeaveServer(t){return y.createServer(weaveRequestHandler(t))}async function D(t,n,e){const r=new URL(t.url??"/",`http://${J}`);let i=r.pathname;if(i.startsWith("/api/")?i=i.slice(4):i==="/api"&&(i="/"),i==="/health"&&t.method==="GET"){u(n,200,{service:"weave-daemon",version:DAEMON_VERSION,pid:process.pid,port:e.port,uptimeMs:Math.round(process.uptime()*1e3)});return}if(await L(t,n,e,i)||await $(t,n,e,i))return;if(e.auth&&!G(t,i,e)&&!e.auth.isAuthenticated(t.headers)){u(n,401,{error:"Unauthorized"});return}if(i==="/mcp"){await x(t,n,{port:e.port,token:e.auth?.getLocalToken()??null});return}if(i==="/api-logs"&&t.method==="GET"){if(!e.apiLog){u(n,503,{error:"API log unavailable"});return}const o=r.searchParams.get("status"),c=r.searchParams.get("limit"),a=await e.apiLog.query({from:r.searchParams.get("from")??void 0,to:r.searchParams.get("to")??void 0,path:r.searchParams.get("path")??void 0,method:r.searchParams.get("method")??void 0,status:o==null?void 0:Number(o),limit:c==null?void 0:Number(c)});u(n,200,a);return}if(await k(t,n,e,i,r)||await I(t,n,e,i,r)||await T(t,n,e,i)||await A(t,n,e,i,r))return;const s=i.match(/^\/projects\/(\d+)\/hooks$/);if(s&&t.method==="GET"){if(!e.hookEvents){u(n,503,{error:"Hook ingestion unavailable"});return}const o=Number(s[1]),c=Q(r.searchParams.get("limit")),a=r.searchParams.get("sessionId"),p=r.searchParams.get("beforeId"),m=p?Number(p):void 0,v=(r.searchParams.get("types")??"").split(",").map(f=>f.trim()).filter(Boolean);if(a){const f=e.hookEvents.listBySession(a,c??300,m,v);let b=e.uploads?.imagesBySession(a);if(N(f,b)){const l=e.projects.getMeta(o);await H({hookEvents:e.hookEvents,uploads:e.uploads,sessionProbe:e.sessionProbe,uploadDir:l?.storage?.images??null},a,K(f))&&(b=e.uploads?.imagesBySession(a))}u(n,200,{events:f.map(l=>{const w=b?.get(l.id);return w?.length?{...l,images:w.map(g=>({id:g.id,name:g.name,mediaType:g.mediaType,size:g.size}))}:l})});return}u(n,200,{events:e.hookEvents.listByProject(o,c)});return}if(!await O(t,n,e,i,r)&&!await M(t,n,e,i,r)&&!await C(t,n,e,i,r)&&!await B(t,n,e,i,r)){if(i==="/events"&&t.method==="GET"){z(t,n,e,r);return}if(!await W(t,n,e,i)){if(t.method==="GET"&&e.staticDir){V(n,i,e.staticDir);return}u(n,404,{error:"Not found"})}}}const F=25e3;function z(t,n,e,r){const i=e.sseHub;if(!i||!e.watch&&!e.hookBus&&!e.dataBus){n.statusCode=503,n.setHeader("content-type","application/json"),n.end(JSON.stringify({error:"Event stream unavailable"}));return}const s=t.headers["last-event-id"],o=(Array.isArray(s)?s[0]:s)??r.searchParams.get("since")??null,c=i.replay(o);n.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive","x-accel-buffering":"no"}),n.write(`: connected
2
2
 
3
- `);const i=setInterval(()=>{r.writableEnded||r.write(`data: ${JSON.stringify({type:"ping"})}
3
+ `);const a=setInterval(()=>{n.writableEnded||n.write(`data: ${JSON.stringify({type:"ping"})}
4
4
 
5
- `)},B);i.unref?.(),c.gap&&r.write(`data: ${JSON.stringify({type:"resync"})}
5
+ `)},F);a.unref?.(),c.gap&&n.write(`data: ${JSON.stringify({type:"resync"})}
6
6
 
7
- `);for(const u of c.frames)r.write(`id: ${u.id}
8
- data: ${u.data}
7
+ `);for(const m of c.frames)n.write(`id: ${m.id}
8
+ data: ${m.data}
9
9
 
10
- `);const f=a.subscribe(u=>{r.write(`id: ${u.id}
11
- data: ${u.data}
10
+ `);const p=i.subscribe(m=>{n.write(`id: ${m.id}
11
+ data: ${m.data}
12
12
 
13
- `)});t.inflightRefresher?.refreshNow(),t.terminalRefresher?.onSubscriberJoin(),t.updatesRefresher?.onSubscriberJoin(),e.on("close",()=>{clearInterval(i),f()})}function z(e,r,t){if(r==="/health"||r.startsWith("/webhooks/orchestrate/"))return!0;if(e.method!=="GET")return!1;if((e.headers.accept??"").includes("text/html"))return!0;if(!t.staticDir)return!1;const o=l.normalize(r).replace(/^([/\\]\.\.[/\\])+/,""),a=l.join(t.staticDir,o);return a.startsWith(t.staticDir)&&h.existsSync(a)&&h.statSync(a).isFile()}function F(e,r){e.setHeader("cache-control",r.startsWith("/assets/")?"public, max-age=31536000, immutable":"no-cache")}function G(e,r,t){const o=l.normalize(r).replace(/^([/\\]\.\.[/\\])+/,""),a=l.join(t,o);if(!a.startsWith(t)){e.statusCode=403,e.setHeader("content-type","application/json"),e.end(JSON.stringify({error:"Forbidden"}));return}h.stat(a,(n,s)=>{if(!n&&s.isFile()){e.setHeader("content-type",V(a)),F(e,r),e.setHeader("content-length",String(s.size)),h.createReadStream(a).pipe(e);return}h.readFile(l.join(t,"index.html"),(c,i)=>{if(c){e.statusCode=404,e.setHeader("content-type","application/json"),e.end(JSON.stringify({error:"Not found"}));return}e.setHeader("content-type","text/html"),e.setHeader("cache-control","no-cache"),e.end(i)})})}function V(e){return e.endsWith(".js")?"text/javascript":e.endsWith(".css")?"text/css":e.endsWith(".html")?"text/html":e.endsWith(".svg")?"image/svg+xml":e.endsWith(".json")?"application/json":"application/octet-stream"}function _(e){for(let r=e.length-1;r>=0;r--){const t=e[r].source;if(E(t))return t}return null}function q(e){const r=Number(e??"100");return!Number.isFinite(r)||r<=0?100:Math.min(Math.floor(r),500)}
13
+ `)});e.inflightRefresher?.refreshNow(),e.terminalRefresher?.onSubscriberJoin(),e.updatesRefresher?.onSubscriberJoin(),t.on("close",()=>{clearInterval(a),p()})}function G(t,n,e){if(n==="/health"||n.startsWith("/webhooks/orchestrate/"))return!0;if(t.method!=="GET")return!1;if((t.headers.accept??"").includes("text/html"))return!0;if(!e.staticDir)return!1;const r=d.normalize(n).replace(/^([/\\]\.\.[/\\])+/,""),i=d.join(e.staticDir,r);return i.startsWith(e.staticDir)&&h.existsSync(i)&&h.statSync(i).isFile()}function _(t,n){t.setHeader("cache-control",n.startsWith("/assets/")?"public, max-age=31536000, immutable":"no-cache")}function V(t,n,e){const r=d.normalize(n).replace(/^([/\\]\.\.[/\\])+/,""),i=d.join(e,r);if(!i.startsWith(e)){t.statusCode=403,t.setHeader("content-type","application/json"),t.end(JSON.stringify({error:"Forbidden"}));return}h.stat(i,(s,o)=>{if(!s&&o.isFile()){t.setHeader("content-type",U(i)),_(t,n),t.setHeader("content-length",String(o.size)),h.createReadStream(i).pipe(t);return}h.readFile(d.join(e,"index.html"),(c,a)=>{if(c){t.statusCode=404,t.setHeader("content-type","application/json"),t.end(JSON.stringify({error:"Not found"}));return}t.setHeader("content-type","text/html"),t.setHeader("cache-control","no-cache"),t.end(a)})})}function U(t){return t.endsWith(".js")?"text/javascript":t.endsWith(".css")?"text/css":t.endsWith(".html")?"text/html":t.endsWith(".svg")?"image/svg+xml":t.endsWith(".json")?"application/json":"application/octet-stream"}function K(t){for(let n=t.length-1;n>=0;n--){const e=t[n].source;if(R(e))return e}return null}function Q(t){const n=Number(t??"100");return!Number.isFinite(n)||n<=0?100:Math.min(Math.floor(n),500)}
@@ -7,7 +7,7 @@ import type { WeaveServerDeps } from './server.js';
7
7
  * 丢失」。false 因此只有一种含义:真丢了。
8
8
  */
9
9
  export declare function transcriptState(present: boolean | null, hasRun: boolean | undefined): boolean | null;
10
- export type SessionOpenDeps = Pick<WeaveServerDeps, 'hookSessions' | 'hookEvents' | 'projects' | 'harnesses' | 'sessionProbe' | 'opener' | 'terminalRefresher'>;
10
+ export type SessionOpenDeps = Pick<WeaveServerDeps, 'hookSessions' | 'hookEvents' | 'projects' | 'harnesses' | 'sessionProbe' | 'opener' | 'terminalRefresher' | 'messageDeliverer'>;
11
11
  export type SessionOpenResult = {
12
12
  ok: true;
13
13
  sessionId: string;
@@ -19,6 +19,15 @@ export type SessionOpenResult = {
19
19
  status: 400 | 404 | 409 | 501 | 503;
20
20
  error: string;
21
21
  };
22
+ /**
23
+ * 引导注入(`resume.bootstrapText`,懒建档宿主的会话行加速):spawn 成功后延时把
24
+ * 引导文本贴进起点 pane 并提交——codex 的 `/rename` 是零模型调用的本地命令,注入
25
+ * 即建 rollout,会话行即刻进列表(起点候选也在同一拍被认领,分组同时点亮)。
26
+ * fire-and-forget:不阻塞响应、失败静默(注入只是加速,宿主自己的建档节奏照常兜底)。
27
+ */
28
+ export declare function scheduleBootstrapInjection(deps: Pick<WeaveServerDeps, 'terminal'>, origin: {
29
+ env: Record<string, string>;
30
+ }, text: string): void;
22
31
  /**
23
32
  * 在默认终端打开会话(spawn 独立终端跑 harness 交互式 resume,如 `claude --resume <id>`)。
24
33
  * 路由与编排引擎的「目标会话没开就拉起来」共用这一份:判据、能力面取法与错误码只有一处。
@@ -1 +1 @@
1
- import{stat as f}from"node:fs/promises";import{isHarness as h}from"@weavecode/core";import{readDaemonSettings as k}from"./settings.js";import{defaultProjectOpener as d,terminalBackendFor as g}from"./opener.js";export function transcriptState(t,e){return t!==!1?t:e===!0?!1:null}export async function openSessionTerminal(t,e,o){if(!t.hookSessions)return{ok:!1,status:503,error:"Hooks subsystem unavailable"};const a=t.hookSessions.getBySessionId(e);if(!a)return{ok:!1,status:404,error:"Session not found"};if(!t.hookEvents)return{ok:!1,status:503,error:"Hook ingestion unavailable"};const c=t.hookEvents.listBySession(e,1),i=c[c.length-1]?.source;if(!h(i))return{ok:!1,status:400,error:"Session has no hook events to determine its harness"};const n=t.harnesses?.get(i)?.resume;if(!n?.supported||!n.openArgs)return{ok:!1,status:501,error:`Harness "${i}" does not support interactive resume`};if(!a.projectId)return{ok:!1,status:400,error:"Session is not bound to a project"};const s=t.projects?.getById(a.projectId);if(!s)return{ok:!1,status:404,error:"Project not found"};const l=t.sessionProbe?.transcriptPresent(e)??null;if(transcriptState(l,t.hookSessions.hasRunOf(e))===!1)return{ok:!1,status:409,error:"Session transcript is missing \u2014 nothing to resume"};const p=t.opener??d;try{if(!(await f(s.path)).isDirectory())throw new Error(`Not a directory: ${s.path}`);const r=await k(),u=[n.bin,...n.openArgs(e)];if(o){if(!g(r.terminal).enumerable)throw new Error(`Terminal preset "${r.terminal.preset}" cannot attach to a chosen pane \u2014 pick wezterm, wt or Terminal.app in settings`);const m=p.runInTerminalAt;if(!m)throw new Error("Targeted attach is unavailable");await m(s.path,u,o,r.terminal)}else await p.runInTerminal(s.path,u,r.terminal);return setTimeout(()=>{t.terminalRefresher?.refreshNow()},600),{ok:!0,sessionId:e,command:u.join(" "),cwd:s.path,...o?{target:o}:{}}}catch(r){return{ok:!1,status:400,error:r instanceof Error?r.message:"Open failed"}}}
1
+ import{stat as w}from"node:fs/promises";import{isHarness as T}from"@weavecode/core";import{readDaemonSettings as g}from"./settings.js";import{defaultProjectOpener as v,terminalBackendFor as y}from"./opener.js";import{messagingSurfaceFor as O}from"../surfaces.js";const m=8e3,P=11e3,E=14e3;export function transcriptState(t,e){return t!==!1?t:e===!0?!1:null}function p(t,e,n,r){!r||O(e).paneEnvSource!=="launch"||t.messageDeliverer?.notePaneEnv(n,r.env)}export function scheduleBootstrapInjection(t,e,n){const r=t.terminal;r&&(async()=>{await new Promise(s=>setTimeout(s,m));const a=await r.locatePane?.(e.env).catch(()=>null)??null;if(!a)return;const o=async()=>{try{await r.sendText(a,n)}catch{return}};await o(),setTimeout(()=>{r.sendKeys(a,"\r").catch(()=>{})},P-m),setTimeout(()=>{o()},E-m)})()}export async function openSessionTerminal(t,e,n){if(!t.hookSessions)return{ok:!1,status:503,error:"Hooks subsystem unavailable"};const r=t.hookSessions.getBySessionId(e);if(!r)return{ok:!1,status:404,error:"Session not found"};if(!t.hookEvents)return{ok:!1,status:503,error:"Hook ingestion unavailable"};const a=t.hookEvents.listBySession(e,1),o=a[a.length-1]?.source;if(!T(o))return{ok:!1,status:400,error:"Session has no hook events to determine its harness"};const s=t.harnesses?.get(o)?.resume;if(!s?.supported||!s.openArgs)return{ok:!1,status:501,error:`Harness "${o}" does not support interactive resume`};if(!r.projectId)return{ok:!1,status:400,error:"Session is not bound to a project"};const i=t.projects?.getById(r.projectId);if(!i)return{ok:!1,status:404,error:"Project not found"};const k=t.sessionProbe?.transcriptPresent(e)??null;if(transcriptState(k,t.hookSessions.hasRunOf(e))===!1)return{ok:!1,status:409,error:"Session transcript is missing \u2014 nothing to resume"};const h=t.opener??v;try{if(!(await w(i.path)).isDirectory())throw new Error(`Not a directory: ${i.path}`);const c=await g(),f=[s.bin,...s.launchArgs??[],...s.openArgs(e)];if(n){if(!y(c.terminal).enumerable)throw new Error(`Terminal preset "${c.terminal.preset}" cannot attach to a chosen pane \u2014 pick wezterm, wt or Terminal.app in settings`);const u=h.runInTerminalAt;if(!u)throw new Error("Targeted attach is unavailable");const S=await u(i.path,f,n,c.terminal);p(t,o,e,S)}else{const u=await h.runInTerminal(i.path,f,c.terminal);p(t,o,e,u)}return setTimeout(()=>{t.terminalRefresher?.refreshNow()},600),{ok:!0,sessionId:e,command:f.join(" "),cwd:i.path,...n?{target:n}:{}}}catch(l){return{ok:!1,status:400,error:l instanceof Error?l.message:"Open failed"}}}
@@ -1 +1 @@
1
- import{closeSync as h,openSync as u,readSync as f,statSync as a}from"node:fs";import{bareModelName as i,codexInterruptMarkerAt as d,currentContextTokensAt as p,currentEffortAt as m,currentModelAt as k,currentModeAt as w,interruptMarkerAt as M,switchedModelOf as O}from"@weavecode/harness";import{HARNESS_SESSION_CONTROL as S,isHarness as x}from"@weavecode/core";const b=64*1024,y={model:null,mode:null,effort:null,contextTokens:null};export function readTail(l,t=b){try{const e=a(l).size,s=Math.max(0,e-t),n=u(l,"r");try{const r=Buffer.alloc(e-s);return f(n,r,0,r.length,s),r.toString("utf8")}finally{h(n)}}catch{return null}}export function dbTranscriptPathResolver(l){return t=>{try{const e=JSON.parse(l.listBySession(t,1)[0]?.payload??"");return typeof e.transcriptPath=="string"&&e.transcriptPath?e.transcriptPath:null}catch{return null}}}export function dbModelFactResolver(l,t){return e=>{const s=t(e),n=s&&x(s)?S[s].modelFactEvents:[];if(n.length===0)return null;const r=l.listBySession(e,1,void 0,n),o=r[r.length-1];if(!o)return null;try{const c=JSON.parse(o.payload).raw;return O(o.eventType,c)}catch{return null}}}function T(l){const t=M(l),e=d(l);return t===null?e:e===null?t:Math.max(t,e)}export class SessionProbe{fallbackPath;fallbackSwitch;constructor(t,e){this.fallbackPath=t,this.fallbackSwitch=e}paths=new Map;marks=new Map;known=new Map;switched=new Map;probed=new Set;efforts=new Map;modes=new Map;noteTranscript(t,e){e&&this.paths.set(t,e)}pathOf(t){const e=this.paths.get(t);if(e)return e;const s=this.fallbackPath?.(t)??null;return s&&this.paths.set(t,s),s}transcriptPathOf(t){return this.pathOf(t)}forget(t){this.paths.delete(t),this.known.delete(t),this.switched.delete(t),this.probed.delete(t),this.efforts.delete(t),this.modes.delete(t)}noteEffort(t,e){this.efforts.set(t,e)}currentEffort(t){return this.efforts.get(t)??this.latched(t).effort}currentContextTokens(t){return this.latched(t).contextTokens}noteModel(t,e){const s=this.pathOf(t);this.switched.set(t,{stale:s?this.factsOf(s).model:null,model:e})}sessionStarted(t,e){this.known.delete(t),this.switched.delete(t),this.probed.delete(t),e&&this.noteModel(t,e)}transcriptPresent(t){const e=this.pathOf(t);return e?this.factsOf(e).size>0:null}interruptedAt(t,e){const s=this.pathOf(t);if(!s)return null;const n=this.factsOf(s).markerAt;if(n===null)return null;const r=Date.parse(e);return Number.isFinite(r)&&n>r?n:null}currentModel(t){return this.latched(t).model}noteMode(t,e){this.modes.set(t,e)}currentMode(t){return this.modes.get(t)??this.latched(t).mode}latched(t){const e=this.pathOf(t),s=e?this.factsOf(e):y,n=this.known.get(t),r={model:this.switchedModel(t,s.model)??n?.model??null,mode:s.mode??n?.mode??null,effort:s.effort??n?.effort??null,contextTokens:s.contextTokens??n?.contextTokens??null};return(!n||n.model!==r.model||n.mode!==r.mode||n.effort!==r.effort||n.contextTokens!==r.contextTokens)&&this.known.set(t,r),r}switchedModel(t,e){const s=this.switchOf(t,e);return s&&e===s.stale?s.model:e}switchOf(t,e){const s=this.switched.get(t);if(s||!e||this.probed.has(t))return s;this.probed.add(t);const n=this.fallbackSwitch?.(t);if(!n||n.from===null||i(n.from)!==i(e))return;const r={stale:e,model:n.to};return this.switched.set(t,r),r}factsOf(t){let e;try{e=a(t).size}catch{return{size:-1,markerAt:null,model:null,mode:null,effort:null,contextTokens:null}}const s=this.marks.get(t);if(s&&s.size===e)return s;const n=readTail(t),r={size:e,markerAt:n===null?null:T(n),model:n===null?null:k(n),mode:n===null?null:w(n),effort:n===null?null:m(n),contextTokens:n===null?null:p(n)};return this.marks.set(t,r),r}}
1
+ import{closeSync as u,openSync as f,readSync as i,statSync as c}from"node:fs";import{bareModelName as a,codexInterruptMarkerAt as d,currentContextTokensAt as p,currentEffortAt as m,currentModelAt as k,currentModeAt as w,interruptMarkerAt as M,switchedModelOf as O}from"@weavecode/harness";import{HARNESS_SESSION_CONTROL as S,isHarness as x}from"@weavecode/core";const b=64*1024,y={model:null,mode:null,effort:null,contextTokens:null};export function readTail(o,t=b){try{const e=c(o).size,r=Math.max(0,e-t),n=f(o,"r");try{const l=Buffer.alloc(e-r);return i(n,l,0,l.length,r),l.toString("utf8")}finally{u(n)}}catch{return null}}export function dbTranscriptPathResolver(o){return t=>{try{const e=JSON.parse(o.listBySession(t,1)[0]?.payload??"");return typeof e.transcriptPath=="string"&&e.transcriptPath?e.transcriptPath:null}catch{return null}}}export function dbModelFactResolver(o,t){return e=>{const r=t(e),n=r&&x(r)?S[r].modelFactEvents:[];if(n.length===0)return null;const l=o.listBySession(e,1,void 0,n),s=l[l.length-1];if(!s)return null;try{const h=JSON.parse(s.payload).raw;return O(s.eventType,h)}catch{return null}}}function T(o){const t=M(o),e=d(o);return t===null?e:e===null?t:Math.max(t,e)}export class SessionProbe{fallbackPath;fallbackSwitch;constructor(t,e){this.fallbackPath=t,this.fallbackSwitch=e}paths=new Map;marks=new Map;known=new Map;switched=new Map;probed=new Set;efforts=new Map;modes=new Map;noteTranscript(t,e){e&&this.paths.set(t,e)}pathOf(t){const e=this.paths.get(t);if(e)return e;const r=this.fallbackPath?.(t)??null;return r&&this.paths.set(t,r),r}transcriptPathOf(t){return this.pathOf(t)}forget(t){this.paths.delete(t),this.known.delete(t),this.switched.delete(t),this.probed.delete(t),this.efforts.delete(t),this.modes.delete(t)}noteEffort(t,e){this.efforts.set(t,e)}currentEffort(t){return this.efforts.get(t)??this.latched(t).effort}currentContextTokens(t){return this.latched(t).contextTokens}noteModel(t,e){const r=this.pathOf(t);this.switched.set(t,{stale:r?this.factsOf(r).model:null,model:e})}sessionStarted(t,e){this.known.delete(t),this.switched.delete(t),this.probed.delete(t),e&&this.noteModel(t,e)}transcriptPresent(t){const e=this.pathOf(t);return e?this.factsOf(e).size>0:null}interruptedAt(t,e){const r=this.pathOf(t);if(!r)return null;const n=this.factsOf(r).markerAt;if(n===null)return null;const l=Date.parse(e);return Number.isFinite(l)&&n>l?n:null}currentModel(t){return this.latched(t).model}noteMode(t,e){this.modes.set(t,e)}currentMode(t){return this.modes.get(t)??this.latched(t).mode}latched(t){const e=this.pathOf(t),r=e?this.factsOf(e):y,n=this.known.get(t),l={model:this.switchedModel(t,r.model)??n?.model??null,mode:r.mode??n?.mode??null,effort:r.effort??n?.effort??null,contextTokens:r.contextTokens??n?.contextTokens??null};return(!n||n.model!==l.model||n.mode!==l.mode||n.effort!==l.effort||n.contextTokens!==l.contextTokens)&&this.known.set(t,l),l}switchedModel(t,e){const r=this.switchOf(t,e);return r&&e===r.stale?r.model:e}switchOf(t,e){const r=this.switched.get(t);if(r||!e||this.probed.has(t))return r;this.probed.add(t);const n=this.fallbackSwitch?.(t);if(!n||n.from===null||a(n.from)!==a(e))return;const l={stale:e,model:n.to};return this.switched.set(t,l),l}factsOf(t){let e;try{e=c(t).size}catch{return{size:-1,markerAt:null,model:null,mode:null,effort:null,contextTokens:null}}const r=this.marks.get(t);if(r&&r.size===e)return r;const n=readTail(t),l={size:e,markerAt:n===null?null:T(n),model:n===null?null:k(n),mode:n===null?null:w(n),effort:n===null?null:m(n),contextTokens:n===null?null:p(n)};return this.marks.set(t,l),l}}
@@ -1,2 +1,2 @@
1
- import{openDatabase as b}from"../db/db.js";import{getDbPath as f}from"../db/paths.js";import{DEFAULT_BIND_HOST as p}from"./port.js";export const SUPPORTED_LOCALES=["zh-CN","en"],DEFAULT_LOCALE="zh-CN",DEFAULT_TERMINAL_SETTINGS={preset:"auto",customCommand:""},DEFAULT_HOOKS_SETTINGS={enabled:!0},DEFAULT_EVENT_RETENTION_DAYS=90,DEFAULT_EVENTS_SETTINGS={retentionDays:DEFAULT_EVENT_RETENTION_DAYS},DEFAULT_SESSION_IDLE_DAYS=90,DEFAULT_SESSIONS_SETTINGS={idleDays:DEFAULT_SESSION_IDLE_DAYS},DEFAULT_STARTUP_SETTINGS={launchOnLogin:!1},DEFAULT_SERVER_SETTINGS={bindHost:p,tlsPort:6443},DEFAULT_AI_SETTINGS={baseUrl:"",model:""},DEFAULT_DECISION_SETTINGS={baseUrl:"",model:""},DEFAULT_HTML_EXPORT_SETTINGS={activeId:null,profiles:[]},DEFAULT_DAEMON_SETTINGS={terminal:DEFAULT_TERMINAL_SETTINGS,locale:DEFAULT_LOCALE,hooks:DEFAULT_HOOKS_SETTINGS,decision:DEFAULT_DECISION_SETTINGS,events:DEFAULT_EVENTS_SETTINGS,sessions:DEFAULT_SESSIONS_SETTINGS,startup:DEFAULT_STARTUP_SETTINGS,server:DEFAULT_SERVER_SETTINGS,ai:DEFAULT_AI_SETTINGS,htmlExport:DEFAULT_HTML_EXPORT_SETTINGS};export function resolveLocale(e){return SUPPORTED_LOCALES.includes(e)?e:DEFAULT_LOCALE}export const ALL_TERMINAL_PRESETS=["auto","wt","powershell","cmd","terminal","iterm","gnome","konsole","wezterm","ghostty","custom"];const L={auto:"\u81EA\u52A8\uFF08\u63A2\u6D4B\u53EF\u7528\u7EC8\u7AEF\uFF09",wt:"Windows Terminal",powershell:"PowerShell",cmd:"\u547D\u4EE4\u63D0\u793A\u7B26 (cmd)",terminal:"Terminal.app",iterm:"iTerm2",gnome:"gnome-terminal",konsole:"Konsole",wezterm:"WezTerm",ghostty:"Ghostty",custom:"\u81EA\u5B9A\u4E49\u547D\u4EE4"};export function terminalPresetsFor(e){return(e==="win32"?["auto","wt","wezterm","powershell","cmd","custom"]:e==="darwin"?["auto","terminal","iterm","wezterm","ghostty","custom"]:["auto","gnome","konsole","wezterm","ghostty","custom"]).map(n=>({id:n,label:L[n]}))}function v(e){return Number.isInteger(e)&&e>=0&&e<=65535?e:DEFAULT_SERVER_SETTINGS.tlsPort}const U=50,I=2e5;function A(e){const n=e??{},o=new Set,r=[];for(const a of Array.isArray(n.profiles)?n.profiles:[]){const s=a??{};if(!(typeof s.id!="string"||s.id===""||o.has(s.id))&&!(typeof s.name!="string"||typeof s.head!="string")&&(o.add(s.id),r.push({id:s.id,name:s.name.trim()||`profile-${r.length+1}`,head:s.head.slice(0,I)}),r.length>=U))break}return{activeId:typeof n.activeId=="string"&&o.has(n.activeId)?n.activeId:null,profiles:r}}function h(e){const n=e??{},o=n.terminal??{},r=n.hooks??{},a=n.events??{},s=n.sessions??{},E=n.startup??{},l=n.server??{},u=n.ai??{},m=n.decision??{},D=A(n.htmlExport),y=Number.isInteger(a.retentionDays)&&a.retentionDays>=1?a.retentionDays:DEFAULT_EVENTS_SETTINGS.retentionDays,S=Number.isInteger(s.idleDays)&&s.idleDays>=1?s.idleDays:DEFAULT_SESSIONS_SETTINGS.idleDays;return{terminal:{preset:ALL_TERMINAL_PRESETS.includes(o.preset)?o.preset:DEFAULT_TERMINAL_SETTINGS.preset,customCommand:typeof o.customCommand=="string"?o.customCommand:""},locale:resolveLocale(n.locale),hooks:{enabled:typeof r.enabled=="boolean"?r.enabled:DEFAULT_HOOKS_SETTINGS.enabled},events:{retentionDays:y},sessions:{idleDays:S},startup:{launchOnLogin:typeof E.launchOnLogin=="boolean"?E.launchOnLogin:DEFAULT_STARTUP_SETTINGS.launchOnLogin},server:{bindHost:typeof l.bindHost=="string"&&l.bindHost.trim()!==""?l.bindHost.trim():DEFAULT_SERVER_SETTINGS.bindHost,tlsPort:v(l.tlsPort)},ai:{baseUrl:typeof u.baseUrl=="string"?u.baseUrl.trim():"",model:typeof u.model=="string"?u.model.trim():""},decision:{baseUrl:typeof m.baseUrl=="string"?m.baseUrl.trim():"",model:typeof m.model=="string"?m.model.trim():""},htmlExport:D}}const t={terminalPreset:"terminal.preset",terminalCustomCommand:"terminal.customCommand",locale:"locale",hooksEnabled:"hooks.enabled",eventRetentionDays:"events.retentionDays",sessionIdleDays:"sessions.idleDays",startupLaunchOnLogin:"startup.launchOnLogin",serverBindHost:"server.bindHost",serverTlsPort:"server.tlsPort",aiBaseUrl:"ai.baseUrl",aiModel:"ai.model",decisionBaseUrl:"decision.baseUrl",decisionModel:"decision.model",htmlExport:"htmlExport"};let i=null,d=null;export function setDaemonSettingsDb(e){i=e,d=null}function g(e){if(i)return e(i);const n=b(f());try{return e(n)}finally{n.close()}}function N(e){const n=e.prepare("SELECT key, value FROM settings").all();return new Map(n.map(o=>[o.key,o.value]))}function O(e){return h({terminal:{preset:e.get(t.terminalPreset),customCommand:e.get(t.terminalCustomCommand)},locale:e.get(t.locale),...e.has(t.hooksEnabled)?{hooks:{enabled:e.get(t.hooksEnabled)==="true"}}:{},...e.has(t.eventRetentionDays)?{events:{retentionDays:Number(e.get(t.eventRetentionDays))}}:{},...e.has(t.sessionIdleDays)?{sessions:{idleDays:Number(e.get(t.sessionIdleDays))}}:{},...e.has(t.startupLaunchOnLogin)?{startup:{launchOnLogin:e.get(t.startupLaunchOnLogin)==="true"}}:{},...e.has(t.serverBindHost)||e.has(t.serverTlsPort)?{server:{...e.has(t.serverBindHost)?{bindHost:e.get(t.serverBindHost)}:{},...e.has(t.serverTlsPort)?{tlsPort:Number(e.get(t.serverTlsPort))}:{}}}:{},...e.has(t.aiBaseUrl)||e.has(t.aiModel)?{ai:{baseUrl:e.get(t.aiBaseUrl)??"",model:e.get(t.aiModel)??""}}:{},...e.has(t.decisionBaseUrl)||e.has(t.decisionModel)?{decision:{baseUrl:e.get(t.decisionBaseUrl)??"",model:e.get(t.decisionModel)??""}}:{},...T(e.get(t.htmlExport))!=null?{htmlExport:T(e.get(t.htmlExport))}:{}})}function T(e){if(!e)return null;try{const n=JSON.parse(e);return n!=null&&typeof n=="object"?n:null}catch{return null}}function _(e){return[[t.terminalPreset,e.terminal.preset],[t.terminalCustomCommand,e.terminal.customCommand],[t.locale,e.locale],[t.hooksEnabled,String(e.hooks.enabled)],[t.eventRetentionDays,String(e.events?.retentionDays??DEFAULT_EVENT_RETENTION_DAYS)],[t.sessionIdleDays,String(e.sessions?.idleDays??DEFAULT_SESSION_IDLE_DAYS)],[t.startupLaunchOnLogin,String(e.startup?.launchOnLogin??!1)],[t.serverBindHost,e.server?.bindHost??p],[t.serverTlsPort,String(e.server?.tlsPort??DEFAULT_SERVER_SETTINGS.tlsPort)],[t.aiBaseUrl,e.ai?.baseUrl??""],[t.aiModel,e.ai?.model??""],[t.decisionBaseUrl,e.decision?.baseUrl??""],[t.decisionModel,e.decision?.model??""],[t.htmlExport,JSON.stringify(e.htmlExport??DEFAULT_HTML_EXPORT_SETTINGS)]]}function P(e,n){const o=e.prepare(`INSERT INTO settings (key, value) VALUES (?, ?)
2
- ON CONFLICT(key) DO UPDATE SET value = excluded.value`);e.exec("BEGIN");try{for(const[r,a]of n)o.run(r,a);e.exec("COMMIT")}catch(r){throw e.exec("ROLLBACK"),r}}function c(){try{return g(e=>O(N(e)))}catch{return DEFAULT_DAEMON_SETTINGS}}export async function readDaemonSettings(){return c()}export function readDaemonSettingsSync(){return c()}export function readHooksEnabled(){const e=d;if(e&&e.db===i)return e.value;const n=c().hooks.enabled;return d={db:i,value:n},n}export async function writeDaemonSettings(e){const n=h(e);return g(o=>P(o,_(n))),d=null,n}
1
+ import{openDatabase as f}from"../db/db.js";import{getDbPath as g}from"../db/paths.js";import{DEFAULT_BIND_HOST as h}from"./port.js";export const SUPPORTED_LOCALES=["zh-CN","en"],DEFAULT_LOCALE="zh-CN",DEFAULT_TERMINAL_SETTINGS={preset:"auto",customCommand:""},DEFAULT_HOOKS_SETTINGS={enabled:!0},DEFAULT_EVENT_RETENTION_DAYS=90,DEFAULT_EVENTS_SETTINGS={retentionDays:DEFAULT_EVENT_RETENTION_DAYS},DEFAULT_SESSION_IDLE_DAYS=90,DEFAULT_SESSIONS_SETTINGS={idleDays:DEFAULT_SESSION_IDLE_DAYS},DEFAULT_STARTUP_SETTINGS={launchOnLogin:!1},DEFAULT_SERVER_SETTINGS={bindHost:h,tlsPort:6443},DEFAULT_AI_SETTINGS={baseUrl:"",model:""},DEFAULT_DECISION_SETTINGS={baseUrl:"",model:""},DEFAULT_HTML_EXPORT_SETTINGS={activeId:null,profiles:[]},DEFAULT_DAEMON_SETTINGS={terminal:DEFAULT_TERMINAL_SETTINGS,locale:DEFAULT_LOCALE,hooks:DEFAULT_HOOKS_SETTINGS,decision:DEFAULT_DECISION_SETTINGS,events:DEFAULT_EVENTS_SETTINGS,sessions:DEFAULT_SESSIONS_SETTINGS,startup:DEFAULT_STARTUP_SETTINGS,server:DEFAULT_SERVER_SETTINGS,ai:DEFAULT_AI_SETTINGS,htmlExport:DEFAULT_HTML_EXPORT_SETTINGS};export function resolveLocale(e){return SUPPORTED_LOCALES.includes(e)?e:DEFAULT_LOCALE}export const ALL_TERMINAL_PRESETS=["auto","wt","powershell","cmd","terminal","iterm","gnome","konsole","wezterm","ghostty","custom"];const L={auto:"\u81EA\u52A8\uFF08\u63A2\u6D4B\u53EF\u7528\u7EC8\u7AEF\uFF09",wt:"Windows Terminal",powershell:"PowerShell",cmd:"\u547D\u4EE4\u63D0\u793A\u7B26 (cmd)",terminal:"Terminal.app",iterm:"iTerm2",gnome:"gnome-terminal",konsole:"Konsole",wezterm:"WezTerm",ghostty:"Ghostty",custom:"\u81EA\u5B9A\u4E49\u547D\u4EE4"};export function terminalPresetsFor(e){return(e==="win32"?["auto","wt","wezterm","powershell","cmd","custom"]:e==="darwin"?["auto","terminal","iterm","wezterm","ghostty","custom"]:["auto","gnome","konsole","wezterm","ghostty","custom"]).map(n=>({id:n,label:L[n]}))}function v(e){return Number.isInteger(e)&&e>=0&&e<=65535?e:DEFAULT_SERVER_SETTINGS.tlsPort}const _=50,U=2e5;function I(e){const o=e??{},n=new Set,r=[];for(const l of Array.isArray(o.profiles)?o.profiles:[]){const s=l??{};if(!(typeof s.id!="string"||s.id===""||n.has(s.id))&&!(typeof s.name!="string"||typeof s.head!="string")&&(n.add(s.id),r.push({id:s.id,name:s.name.trim()||`profile-${r.length+1}`,head:s.head.slice(0,U)}),r.length>=_))break}return{activeId:typeof o.activeId=="string"&&n.has(o.activeId)?o.activeId:null,profiles:r}}function T(e){const o=e??{},n=o.terminal??{},r=o.hooks??{},i=o.events??{},l=o.sessions??{},s=o.startup??{},c=o.server??{},d=o.ai??{},u=o.decision??{},y=I(o.htmlExport),D=Number.isInteger(i.retentionDays)&&i.retentionDays>=1?i.retentionDays:DEFAULT_EVENTS_SETTINGS.retentionDays,b=Number.isInteger(l.idleDays)&&l.idleDays>=1?l.idleDays:DEFAULT_SESSIONS_SETTINGS.idleDays;return{terminal:{preset:ALL_TERMINAL_PRESETS.includes(n.preset)?n.preset:DEFAULT_TERMINAL_SETTINGS.preset,customCommand:typeof n.customCommand=="string"?n.customCommand:""},locale:resolveLocale(o.locale),hooks:{enabled:typeof r.enabled=="boolean"?r.enabled:DEFAULT_HOOKS_SETTINGS.enabled},events:{retentionDays:D},sessions:{idleDays:b},startup:{launchOnLogin:typeof s.launchOnLogin=="boolean"?s.launchOnLogin:DEFAULT_STARTUP_SETTINGS.launchOnLogin},server:{bindHost:typeof c.bindHost=="string"&&c.bindHost.trim()!==""?c.bindHost.trim():DEFAULT_SERVER_SETTINGS.bindHost,tlsPort:v(c.tlsPort)},ai:{baseUrl:typeof d.baseUrl=="string"?d.baseUrl.trim():"",model:typeof d.model=="string"?d.model.trim():""},decision:{baseUrl:typeof u.baseUrl=="string"?u.baseUrl.trim():"",model:typeof u.model=="string"?u.model.trim():""},htmlExport:y}}const t={terminalPreset:"terminal.preset",terminalCustomCommand:"terminal.customCommand",locale:"locale",hooksEnabled:"hooks.enabled",eventRetentionDays:"events.retentionDays",sessionIdleDays:"sessions.idleDays",startupLaunchOnLogin:"startup.launchOnLogin",serverBindHost:"server.bindHost",serverTlsPort:"server.tlsPort",aiBaseUrl:"ai.baseUrl",aiModel:"ai.model",decisionBaseUrl:"decision.baseUrl",decisionModel:"decision.model",htmlExport:"htmlExport"};let a=null,m=null;export function setDaemonSettingsDb(e){a=e,m=null}function p(e){if(a)return e(a);const o=f(g());try{return e(o)}finally{o.close()}}function x(e){const o=e.prepare("SELECT key, value FROM settings").all();return new Map(o.map(n=>[n.key,n.value]))}function O(e){return T({terminal:{preset:e.get(t.terminalPreset),customCommand:e.get(t.terminalCustomCommand)},locale:e.get(t.locale),...e.has(t.hooksEnabled)?{hooks:{enabled:e.get(t.hooksEnabled)==="true"}}:{},...e.has(t.eventRetentionDays)?{events:{retentionDays:Number(e.get(t.eventRetentionDays))}}:{},...e.has(t.sessionIdleDays)?{sessions:{idleDays:Number(e.get(t.sessionIdleDays))}}:{},...e.has(t.startupLaunchOnLogin)?{startup:{launchOnLogin:e.get(t.startupLaunchOnLogin)==="true"}}:{},...e.has(t.serverBindHost)||e.has(t.serverTlsPort)?{server:{...e.has(t.serverBindHost)?{bindHost:e.get(t.serverBindHost)}:{},...e.has(t.serverTlsPort)?{tlsPort:Number(e.get(t.serverTlsPort))}:{}}}:{},...e.has(t.aiBaseUrl)||e.has(t.aiModel)?{ai:{baseUrl:e.get(t.aiBaseUrl)??"",model:e.get(t.aiModel)??""}}:{},...e.has(t.decisionBaseUrl)||e.has(t.decisionModel)?{decision:{baseUrl:e.get(t.decisionBaseUrl)??"",model:e.get(t.decisionModel)??""}}:{},...S(e.get(t.htmlExport))!=null?{htmlExport:S(e.get(t.htmlExport))}:{}})}function S(e){if(!e)return null;try{const o=JSON.parse(e);return o!=null&&typeof o=="object"?o:null}catch{return null}}function N(e){return[[t.terminalPreset,e.terminal.preset],[t.terminalCustomCommand,e.terminal.customCommand],[t.locale,e.locale],[t.hooksEnabled,String(e.hooks.enabled)],[t.eventRetentionDays,String(e.events?.retentionDays??DEFAULT_EVENT_RETENTION_DAYS)],[t.sessionIdleDays,String(e.sessions?.idleDays??DEFAULT_SESSION_IDLE_DAYS)],[t.startupLaunchOnLogin,String(e.startup?.launchOnLogin??!1)],[t.serverBindHost,e.server?.bindHost??h],[t.serverTlsPort,String(e.server?.tlsPort??DEFAULT_SERVER_SETTINGS.tlsPort)],[t.aiBaseUrl,e.ai?.baseUrl??""],[t.aiModel,e.ai?.model??""],[t.decisionBaseUrl,e.decision?.baseUrl??""],[t.decisionModel,e.decision?.model??""],[t.htmlExport,JSON.stringify(e.htmlExport??DEFAULT_HTML_EXPORT_SETTINGS)]]}function A(e,o){const n=e.prepare(`INSERT INTO settings (key, value) VALUES (?, ?)
2
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value`);e.exec("BEGIN");try{for(const[r,i]of o)n.run(r,i);e.exec("COMMIT")}catch(r){throw e.exec("ROLLBACK"),r}}function E(){try{return p(e=>O(x(e)))}catch{return DEFAULT_DAEMON_SETTINGS}}export async function readDaemonSettings(){return E()}export function readDaemonSettingsSync(){return E()}export function readHooksEnabled(){const e=m;if(e&&e.db===a)return e.value;const o=E().hooks.enabled;return m={db:a,value:o},o}export async function writeDaemonSettings(e){const o=T(e);return p(n=>A(n,N(o))),m=null,o}
@@ -1 +1 @@
1
- export class SnapshotRefresher{snapshot;bus;options;timer;lastFingerprint=null;constructor(t,s,i){this.snapshot=t,this.bus=s,this.options=i}start(){this.timer||(this.timer=setInterval(()=>this.tick(),this.options.intervalMs??15e3))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}tick(){if(!(this.options.shouldRun&&!this.options.shouldRun()))try{const t=this.snapshot(),s=JSON.stringify(t);if(s===this.lastFingerprint)return;this.lastFingerprint=s,this.bus.emit(this.options.invalidateOnly?{key:this.options.key}:{key:this.options.key,payload:t})}catch{}}}
1
+ export class SnapshotRefresher{snapshot;bus;options;timer;lastFingerprint=null;constructor(t,i,s){this.snapshot=t,this.bus=i,this.options=s}start(){this.timer||(this.timer=setInterval(()=>this.tick(),this.options.intervalMs??15e3))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}tick(){if(!(this.options.shouldRun&&!this.options.shouldRun()))try{const t=this.snapshot(),i=JSON.stringify(t);if(i===this.lastFingerprint)return;this.lastFingerprint=i,this.bus.emit(this.options.invalidateOnly?{key:this.options.key}:{key:this.options.key,payload:t})}catch{}}}
@@ -1 +1 @@
1
- import{randomBytes as a}from"node:crypto";const u=1e3,c=6e4;export class SseHub{sources;epoch=a(4).toString("hex");seq=0;buffer=[];subs=new Set;detach=null;graceTimer=null;brokenAt=0;constructor(s){this.sources=s}subscribe(s){return this.subs.add(s),this.attach(),()=>{this.subs.delete(s),this.subs.size===0&&this.scheduleDetach()}}push(s){const r=++this.seq,i=JSON.stringify(s);this.buffer.push({seq:r,data:i}),this.buffer.length>u&&this.buffer.shift();const e={id:this.frameId(r),data:i};for(const t of this.subs)t(e)}replay(s){if(!s)return{frames:[],gap:!1};const[r,i]=s.split("-"),e=Number(i);if(r!==this.epoch||!Number.isInteger(e)||e<0)return{frames:[],gap:!0};const t=this.buffer[0]?.seq;return e<=this.brokenAt||t!==void 0&&e<t-1?{frames:[],gap:!0}:{frames:this.buffer.filter(h=>h.seq>e).map(h=>({id:this.frameId(h.seq),data:h.data})),gap:!1}}frameId(s){return`${this.epoch}-${s}`}attach(){if(this.graceTimer!==null&&(clearTimeout(this.graceTimer),this.graceTimer=null),this.detach)return;this.sources.onAttach?.();const s=[],{watch:r,hookBus:i,dataBus:e}=this.sources;r&&(s.push(r.subscribe(t=>this.push({type:"asset",...t}))),s.push(r.subscribeProjects(t=>this.push({type:"project",...t})))),i&&s.push(i.subscribe(t=>this.push({type:"hook",...t}))),e&&s.push(e.subscribe(t=>this.push({type:t.payload===void 0?"invalidate":"push",...t}))),this.detach=()=>{for(const t of s)t()}}scheduleDetach(){this.graceTimer!==null||!this.detach||(this.graceTimer=setTimeout(()=>{this.graceTimer=null,this.brokenAt=this.seq,this.detach?.(),this.detach=null},c),this.graceTimer.unref?.())}}
1
+ import{randomBytes as u}from"node:crypto";const a=1e3,c=6e4;export class SseHub{sources;epoch=u(4).toString("hex");seq=0;buffer=[];subs=new Set;detach=null;graceTimer=null;brokenAt=0;constructor(s){this.sources=s}subscribe(s){return this.subs.add(s),this.attach(),()=>{this.subs.delete(s),this.subs.size===0&&this.scheduleDetach()}}push(s){const i=++this.seq,r=JSON.stringify(s);this.buffer.push({seq:i,data:r}),this.buffer.length>a&&this.buffer.shift();const t={id:this.frameId(i),data:r};for(const e of this.subs)e(t)}replay(s){if(!s)return{frames:[],gap:!1};const[i,r]=s.split("-"),t=Number(r);if(i!==this.epoch||!Number.isInteger(t)||t<0)return{frames:[],gap:!0};const e=this.buffer[0]?.seq;return t<=this.brokenAt||e!==void 0&&t<e-1?{frames:[],gap:!0}:{frames:this.buffer.filter(h=>h.seq>t).map(h=>({id:this.frameId(h.seq),data:h.data})),gap:!1}}frameId(s){return`${this.epoch}-${s}`}attach(){if(this.graceTimer!==null&&(clearTimeout(this.graceTimer),this.graceTimer=null),this.detach)return;this.sources.onAttach?.();const s=[],{watch:i,hookBus:r,dataBus:t}=this.sources;i&&(s.push(i.subscribe(e=>this.push({type:"asset",...e}))),s.push(i.subscribeProjects(e=>this.push({type:"project",...e})))),r&&s.push(r.subscribe(e=>this.push({type:"hook",...e}))),t&&s.push(t.subscribe(e=>this.push({type:e.payload===void 0?"invalidate":"push",...e}))),this.detach=()=>{for(const e of s)e()}}scheduleDetach(){this.graceTimer!==null||!this.detach||(this.graceTimer=setTimeout(()=>{this.graceTimer=null,this.brokenAt=this.seq,this.detach?.(),this.detach=null},c),this.graceTimer.unref?.())}}
@@ -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 gs}from"../repositories/libraries.js";import{HookRuleRepository as ts}from"../repositories/hook-rules.js";import{HookDispatchRepository as Ss}from"../repositories/hook-dispatches.js";import{PluginStateRepository as E}from"../repositories/plugin-states.js";import{SessionRepository as bs}from"../repositories/sessions.js";import{createRuntimeRegistry as Rs}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as ys,isHarness as vs}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{startSessionSweeper as Ps}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as Is}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as Ts}from"../statusline/manager.js";import{wireHookFilePipeline as Cs}from"./hook-pipeline.js";import{ensureBuiltinMarket as As,builtinMarketDir as Hs}from"../market/builtin.js";import{HookRuleRegistry as Os}from"../hooks/registry.js";import{HookDispatcher as Bs}from"../hooks/dispatcher.js";import{HookEventBus as js}from"../hooks/bus.js";import{ResumeRunner as Fs}from"../hooks/resume-runner.js";import{HeadlessRunner as Ls}from"../hooks/headless-runner.js";import{MessageDeliverer as Ms}from"../hooks/message-deliverer.js";import{QuestionTracker as Us}from"../hooks/question-tracker.js";import{SideQuestionRepository as _s}from"../repositories/side-questions.js";import{claimSideAnswer as Ns}from"../hooks/side-questions.js";import{DashboardRateCache as xs}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Ws}from"./dashboard-pusher.js";import{startPromptFlusher as qs}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Qs}from"../repositories/session-watches.js";import{PushSubscriptionRepository as $s}from"../repositories/push-subscriptions.js";import{UploadRepository as Gs}from"../repositories/uploads.js";import{defaultUploadSessions as Js}from"./upload-sessions.js";import{PushNotifier as Ks}from"../hooks/push-notify.js";import{OrchestrationRepository as Vs,OrchestrationRunRepository as Ys}from"../repositories/orchestrations.js";import{WatchEngine as zs}from"../hooks/watch-engine.js";import{OrchestrationEngine as Xs,createForkConditionJudge as Zs}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as se}from"../hooks/decision-judge.js";import{readDecisionKey as ee}from"./decision-config.js";import{openSessionTerminal as re}from"./session-open.js";import{loadAllPlugins as oe}from"../hooks/plugin-loader.js";import{ToolkitService as te}from"../hooks/toolkit.js";import{WatchService as ne}from"../watch/watch-service.js";import{SyncScheduler as ie}from"../watch/sync-scheduler.js";import{FingerprintCache as ae}from"../install/fingerprint.js";import{detectProjectUpdateCounts as le}from"../install/updates.js";import{weaveRequestHandler as pe}from"./server.js";import{startTlsServer as me}from"./tls.js";import{DataBus as ce}from"./data-bus.js";import{TerminalTopologyRefresher as ue}from"./terminal-topology-refresher.js";import{SnapshotRefresher as W}from"./snapshot-refresher.js";import{SessionProbe as de,dbModelFactResolver as he,dbTranscriptPathResolver as fe}from"./session-probe.js";import{InflightCountsRefresher as we}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as ge}from"./project-updates-refresher.js";import{claudeLivenessById as ns,pidAliveOf as Se}from"./claude-liveness.js";import{promptTerminalChannel as be,readTerminalCounts as Re}from"./opener.js";import{DEFAULT_BIND_HOST as ye}from"./port.js";import{readDaemonState as ve,writeDaemonState as ke}from"./state.js";import{ensureDataLayout as Ee}from"../db/layout.js";import{pruneFileIndexes as De}from"./project-files.js";import{readDaemonSettingsSync as D,setDaemonSettingsDb as Pe,DEFAULT_SERVER_SETTINGS as Ie}from"./settings.js";import{AuthService as Te}from"./dashboard-auth.js";import{syncLaunchOnLogin as Ce}from"./auto-start.js";import{resolveStaticDir as Ae}from"./static.js";delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const c of ys)delete process.env[c];export function startDaemon(){Ee();const c=ve();c||(console.error("Daemon state not found. Run `weave daemon start` first."),process.exit(1));const r=hs();Pe(r);const P=D().server?.bindHost??ye,I=D().server?.tlsPort??Ie.tlsPort,T=new Te;T.initialPassword&&console.log(`[weave] initial dashboard password: ${T.initialPassword}`);const o=new fs(r);De(o.list().map(s=>s.id));const l=new ws(r),m=new gs(r),S=Rs(),is=S.byCapability("events").flatMap(s=>s.events??[]),b=new Os(new ts(r)),R=new Ss(r),t=new bs(r),n=new js,C={getHandler:()=>{},getConfig:()=>({})};let u;const A={list:()=>u?.list()??[],setPluginEnabled:(s,e)=>u?.setPluginEnabled(s,e)??!1,reloadAll:async()=>{await u?.reloadAll()},rescan:async()=>{await u?.rescanRoots(o.list(),m)}},as=new te({projects:o,states:new E(r),plugins:A,libraries:m}),H={run:null},q=new Bs({registry:b,dispatches:R,bus:n,projects:o,sessions:t,plugins:C,pluginStates:new E(r),classify:s=>H.run?H.run(s):Promise.resolve(null)});As({libraries:m}).then(s=>(s.error?console.error(`[weave] builtin market unavailable: ${s.error}`):s.changed&&console.log(`[weave] builtin market ${s.form==="link"?"linked":"copied"} -> ${Hs(m.dataRoot)}`),oe({rules:new ts(r),registry:b,states:new E(r),bus:n,libraries:m},o.list()))).then(({loader:s})=>{u=s,C.getHandler=(e,i)=>s.getHandler(e,i),C.getConfig=e=>s.getConfig(e),s.watchRoots()});const y=new Ls,ls=new Fs({dispatches:R,sessions:t,projects:o,bus:n,resumeSpec:S.get("claude")?.resume,headless:y}),p=new Ms({sessions:t,projects:o,hookEvents:l,bus:n,headless:y,terminal:be(()=>D().terminal),blockedByQuestion:s=>h.get(s)!=null});qs(p);const O=new Qs(r),B=new zs({watches:O,deliverer:p,sessions:t,bus:n}),Q=new $s(r),j=new Gs(r),ps=new Ks({subscriptions:Q,sessions:t,bus:n}),F=new Vs(r),$=new Ys(r),d=new de(fe(l),he(l,s=>t.getBySessionId(s)?.harness??null)),h=new Us({sessions:t,hookEvents:l,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}});h.seedFromDb();const G=new _s(r),J=new xs,L=Ws({rate:J,events:l,sessions:t,projects:o,bus:n}),K={repo:G,bus:n,settle:s=>{p.interrupt(s.sessionId)}},M=new ne(o);M.start();const U=new ae,a=new ce,V=new ge(()=>le(o.list(),m.list(),U),a,n,()=>a.hasSubscribers()),Y=new ie(o,m,{cache:U,plugins:A,onSynced:()=>{V.refreshNow(!0)}});Y.start();const v=new ue(async()=>({counts:await Re(o.list()),terminals:await p.sessionTerminals()}),a,{shouldRun:()=>a.hasSubscribers(),graceMs:1e4});v.start();const _=new W(()=>{const s=ns(),e={};for(const i of t.listWithCounts()){const g=Se(i,s);g!==null&&(e[i.sessionId]=g)}return{alive:e}},a,{key:"sessionLiveness",shouldRun:()=>a.hasSubscribers()});_.start();const N=new W(()=>{const s={};for(const e of t.listWithCounts()){if(e.turnOpen!==!0)continue;const i=d.interruptedAt(e.sessionId,e.lastSeenAt);i!==null&&(s[e.sessionId]=i)}return{interrupted:s}},a,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>a.hasSubscribers()});N.start(),new W(()=>{const s={};for(const e of o.list())s[e.id]=Ts(e.path);return s},a,{key:"statusline",intervalMs:5e3,shouldRun:()=>a.hasSubscribers(),invalidateOnly:!0}).start();const ms=new we(()=>p.listInflightCounts(),a,n);let z=null;const f=Ds({sessions:t,projects:o,harnessOf:s=>{const e=l.listBySession(s,1),i=e[e.length-1]?.source;return vs(i)?i:null},surfaceFor:ks,headless:y,onSyntheticChange:()=>z?.pushSyntheticSessions(Es())});H.run=s=>f.run(s);const cs=se({config:async()=>{const s=D().decision;if(!s?.baseUrl||!s.model)return null;const e=ee();return e?{baseUrl:s.baseUrl,model:s.model,apiKey:e}:null},fallback:Zs({supports:s=>f.supports(s),extract:s=>f.run(s)})}),w=new Xs({orchestrations:F,runs:$,deliverer:p,sessions:t,bus:n,supportsExtract:s=>f.supports(s),extract:s=>f.run(s),conditionJudge:cs,deferWhenUserPresent:!0,ensureOpen:async s=>{const e=l.listBySession(s,1).at(-1)?.id??0,i=await re({hookSessions:t,hookEvents:l,projects:o,harnesses:S,sessionProbe:d,terminalRefresher:v},s);if(!i.ok)return i;let g=!1;for(let os=0;os<60;os++){if(l.listBySession(s,20).some(k=>k.id>e&&k.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};ns().get(s)===!0&&(g=!0),await new Promise(k=>setTimeout(k,250))}return g?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}}});w.rearm();const X=setInterval(()=>w.cronTick(),3e4);X.unref(),Ps({sessions:t,events:l,dispatches:R,deliverer:p,watches:O,orchestrations:F,watchEngine:B,orchestrationEngine:w,questions:h,sideQuestions:G,probe:d,uploads:j,uploadSessions:Js}),Is();const x=Cs({projects:o,rules:b,sessions:t,bus:n,dispatcher:q,watchEngine:B,orchestrationEngine:w,messagePipe:p,questionTracker:h,sideQuestions:{onEvent:s=>{Ns(K,s)}},sessionProbe:d,uploads:j,dashboardRate:J});z=x;const us=Ae(),Z=pe({projects:o,port:c.port,tlsPort:I,watch:M,hookEvents:l,adapters:is,harnesses:S,libraries:m,fingerprintCache:U,staticDir:us,hookRegistry:b,hookDispatches:R,hookSessions:t,hookBus:n,dataBus:a,terminalRefresher:v,interruptRefresher:N,livenessRefresher:_,sessionProbe:d,inflightRefresher:ms,updatesRefresher:V,hookDispatcher:q,hookRunner:ls,messageDeliverer:p,uploads:j,questionTracker:h,sideQuestions:K,sessionWatches:O,watchEngine:B,orchestrations:F,orchestrationRuns:$,orchestrationEngine:w,pushSubscriptions:Q,pushNotifier:ps,onAttach:L.attach,dashboardRefresh:L.attach,hookPlugins:A,hookMirror:x.mirror,pluginStates:new E(r),toolkit:as,auth:T}),ss=ds.createServer(Z);let es=null;me({port:I,bindHost:P,handler:Z}).then(s=>{es=s});const rs=()=>{u?.stopWatching(),v.stop(),_.stop(),N.stop(),Y.stop(),M.stop(),y.killAll(),clearInterval(X),L.stop(),x.stop(),ss.close(),es?.server.close(),process.exit(0)};process.on("SIGTERM",rs),process.on("SIGINT",rs),ss.listen(c.port,P,()=>{ke({...c,pid:process.pid,host:P,tlsPort:I}),Ce()})}
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 Re}from"../repositories/hook-events.js";import{LibraryRepository as ve}from"../repositories/libraries.js";import{HookRuleRepository as ae}from"../repositories/hook-rules.js";import{HookDispatchRepository as be}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 j}from"@weavecode/core";import{messagingSurfaceFor as Pe,narrationSurfaceFor as Te}from"../surfaces.js";import{syntheticSessionIds as Ee}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Ce}from"../hooks/edge-extract.js";import{startSessionSweeper as Oe}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as Ie}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as He}from"../statusline/manager.js";import{wireHookFilePipeline as Ae}from"./hook-pipeline.js";import{ensureBuiltinMarket as Be,builtinMarketDir as _e}from"../market/builtin.js";import{HookRuleRegistry as Fe}from"../hooks/registry.js";import{HookDispatcher as Le}from"../hooks/dispatcher.js";import{HookEventBus as Me}from"../hooks/bus.js";import{ResumeRunner as Ne}from"../hooks/resume-runner.js";import{HeadlessRunner as Ue}from"../hooks/headless-runner.js";import{MessageDeliverer as We}from"../hooks/message-deliverer.js";import{QuestionTracker as xe}from"../hooks/question-tracker.js";import{SideQuestionRepository as Qe}from"../repositories/side-questions.js";import{claimSideAnswer as qe}from"../hooks/side-questions.js";import{DashboardRateCache as je}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Ke}from"./dashboard-pusher.js";import{startPromptFlusher as $e}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Ge}from"../repositories/session-watches.js";import{PushSubscriptionRepository as Je}from"../repositories/push-subscriptions.js";import{UploadRepository as Ve}from"../repositories/uploads.js";import{defaultUploadSessions as Ye}from"./upload-sessions.js";import{PushNotifier as ze}from"../hooks/push-notify.js";import{OrchestrationRepository as Xe,OrchestrationRunRepository as Ze}from"../repositories/orchestrations.js";import{WatchEngine as es}from"../hooks/watch-engine.js";import{OrchestrationEngine as ss,createForkConditionJudge as ts}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as os}from"../hooks/decision-judge.js";import{readDecisionKey as rs}from"./decision-config.js";import{openSessionTerminal as ns}from"./session-open.js";import{loadAllPlugins as is}from"../hooks/plugin-loader.js";import{ToolkitService as as}from"../hooks/toolkit.js";import{WatchService as ls}from"../watch/watch-service.js";import{SyncScheduler as cs}from"../watch/sync-scheduler.js";import{FingerprintCache as ps}from"../install/fingerprint.js";import{detectProjectUpdateCounts as ms}from"../install/updates.js";import{weaveRequestHandler as us}from"./server.js";import{startTlsServer as fs}from"./tls.js";import{DataBus as ds}from"./data-bus.js";import{TerminalTopologyRefresher as hs}from"./terminal-topology-refresher.js";import{SnapshotRefresher as K}from"./snapshot-refresher.js";import{SessionProbe as ws,dbModelFactResolver as gs,dbTranscriptPathResolver as Ss}from"./session-probe.js";import{NarrationWatcher as Rs}from"./narration-watcher.js";import{InflightCountsRefresher as vs}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as bs}from"./project-updates-refresher.js";import{pidAliveOf as ys}from"./claude-liveness.js";import{combinedLivenessOf as v}from"./liveness.js";import{promptTerminalChannel as le,readTerminalCounts as ks}from"./opener.js";import{DEFAULT_BIND_HOST as Ds}from"./port.js";import{readDaemonState as Ps,writeDaemonState as Ts}from"./state.js";import{ensureDataLayout as Es}from"../db/layout.js";import{pruneFileIndexes as Cs}from"./project-files.js";import{pruneInstallTmp as Os}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as b,setDaemonSettingsDb as Is,DEFAULT_SERVER_SETTINGS as Hs}from"./settings.js";import{AuthService as As}from"./dashboard-auth.js";import{syncLaunchOnLogin as Bs}from"./auto-start.js";import{resolveStaticDir as _s}from"./static.js";delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const u of De)delete process.env[u];export function startDaemon(){Es();const u=Ps();u||(console.error("Daemon state not found. Run `weave daemon start` first."),process.exit(1));const t=ge();Is(t);const E=b().server?.bindHost??Ds,C=b().server?.tlsPort??Hs.tlsPort,O=new As;O.initialPassword&&console.log(`[weave] initial dashboard password: ${O.initialPassword}`);const r=new Se(t);Cs(r.list().map(e=>e.id)),Os();const a=new Re(t),p=new ve(t),d=ke(),ce=d.byCapability("events").flatMap(e=>e.events??[]),y=new Fe(new ae(t)),k=new be(t),o=new ye(t),n=new Me,I={getHandler:()=>{},getConfig:()=>({})};let f;const H={list:()=>f?.list()??[],setPluginEnabled:(e,s)=>f?.setPluginEnabled(e,s)??!1,reloadAll:async()=>{await f?.reloadAll()},rescan:async()=>{await f?.rescanRoots(r.list(),p)}},pe=new as({projects:r,states:new T(t),plugins:H,libraries:p}),A={run:null},$=new Le({registry:y,dispatches:k,bus:n,projects:r,sessions:o,plugins:I,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 j(s)?d.get(s)?.titles?.sessionTitleOf(e)??null:null}});Be({libraries:p}).then(e=>(e.error?console.error(`[weave] builtin market unavailable: ${e.error}`):e.changed&&console.log(`[weave] builtin market ${e.form==="link"?"linked":"copied"} -> ${_e(p.dataRoot)}`),is({rules:new ae(t),registry:y,states:new T(t),bus:n,libraries:p},r.list()))).then(({loader:e})=>{f=e,I.getHandler=(s,i)=>e.getHandler(s,i),I.getConfig=s=>e.getConfig(s),e.watchRoots()});const D=new Ue,me=new Ne({dispatches:k,sessions:o,projects:r,bus:n,resumeSpec:d.get("claude")?.resume,headless:D}),c=new We({sessions:o,projects:r,hookEvents:a,bus:n,headless:D,terminal:le(()=>b().terminal),blockedByQuestion:e=>h.get(e)!=null,livenessOf:v,sideAnswerStore:{answerById:(e,s,i)=>{M.answerById(e,s,i)}}});$e(c);const B=new Ge(t),_=new es({watches:B,deliverer:c,sessions:o,bus:n,livenessOf:v}),G=new Je(t),F=new Ve(t),ue=new ze({subscriptions:G,sessions:o,bus:n}),L=new Xe(t),J=new Ze(t),m=new ws(Ss(a),gs(a,e=>o.getBySessionId(e)?.harness??null)),V=new Rs(n,e=>Te(j(e)?e:"claude"),e=>m.transcriptPathOf(e),e=>o.livenessRowOf(e)?.harness??null);V.start();const h=new xe({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?m.interruptedAt(e,s.lastSeenAt):null}});h.seedFromDb();const M=new Qe(t),Y=new je,N=Ke({rate:Y,events:a,sessions:o,projects:r,bus:n}),z={repo:M,bus:n,settle:e=>{c.interrupt(e.sessionId)}},U=new ls(r);U.start();const W=new ps,l=new ds,X=new bs(()=>ms(r.list(),p.list(),W),l,n,()=>l.hasSubscribers()),Z=new cs(r,p,{cache:W,plugins:H,onSynced:()=>{X.refreshNow(!0)}});Z.start();const w=new hs(async()=>({counts:await ks(r.list()),terminals:await c.sessionTerminals()}),l,{shouldRun:()=>l.hasSubscribers(),graceMs:1e4});w.start();const x=new K(()=>{const e=v(),s={};for(const i of o.listWithCounts()){const R=ys(i,e);R!==null&&(s[i.sessionId]=R)}return{alive:s}},l,{key:"sessionLiveness",shouldRun:()=>l.hasSubscribers()});x.start();const Q=new K(()=>{const e={};for(const s of o.listWithCounts()){if(s.turnOpen!==!0)continue;const i=m.interruptedAt(s.sessionId,s.lastSeenAt);i!==null&&(e[s.sessionId]=i)}return{interrupted:e}},l,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>l.hasSubscribers()});Q.start(),new K(()=>{const e={};for(const s of r.list())e[s.id]=He(s.path);return e},l,{key:"statusline",intervalMs:5e3,shouldRun:()=>l.hasSubscribers(),invalidateOnly:!0}).start();const fe=new vs(()=>c.listInflightCounts(),l,n);let ee=null;const g=Ce({sessions:o,projects:r,harnessOf:e=>{const s=a.listBySession(e,1),i=s[s.length-1]?.source;return j(i)?i:null},surfaceFor:Pe,headless:D,onSyntheticChange:()=>ee?.pushSyntheticSessions(Ee())});A.run=e=>g.run(e);const de=os({config:async()=>{const e=b().decision;if(!e?.baseUrl||!e.model)return null;const s=rs();return s?{baseUrl:e.baseUrl,model:e.model,apiKey:s}:null},fallback:ts({supports:e=>g.supports(e),extract:e=>g.run(e)})}),S=new ss({orchestrations:L,runs:J,deliverer:c,sessions:o,bus:n,supportsExtract:e=>g.supports(e),extract:e=>g.run(e),conditionJudge:de,deferWhenUserPresent:!0,ensureOpen:async e=>{const s=a.listBySession(e,1).at(-1)?.id??0,i=await ns({hookSessions:o,hookEvents:a,projects:r,harnesses:d,sessionProbe:m,terminalRefresher:w},e);if(!i.ok)return i;let R=!1;for(let ie=0;ie<60;ie++){if(a.listBySession(e,20).some(P=>P.id>s&&P.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};v().get(e)===!0&&(R=!0),await new Promise(P=>setTimeout(P,250))}return R?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}}});S.rearm();const se=setInterval(()=>S.cronTick(),3e4);se.unref(),Oe({sessions:o,events:a,dispatches:k,deliverer:c,watches:B,orchestrations:L,watchEngine:_,orchestrationEngine:S,questions:h,sideQuestions:M,probe:m,uploads:F,uploadSessions:Ye,livenessOf:v}),Ie();const q=Ae({projects:r,rules:y,sessions:o,bus:n,dispatcher:$,watchEngine:_,orchestrationEngine:S,messagePipe:c,questionTracker:h,sideQuestions:{onEvent:e=>{qe(z,e)}},sessionProbe:m,uploads:F,dashboardRate:Y,terminalTopologyKick:()=>{w.refreshNow()}});ee=q;const he=_s(),te=us({projects:r,port:u.port,tlsPort:C,watch:U,hookEvents:a,adapters:ce,harnesses:d,libraries:p,fingerprintCache:W,staticDir:he,hookRegistry:y,hookDispatches:k,hookSessions:o,hookBus:n,dataBus:l,terminalRefresher:w,interruptRefresher:Q,livenessRefresher:x,sessionProbe:m,inflightRefresher:fe,updatesRefresher:X,hookDispatcher:$,hookRunner:me,messageDeliverer:c,terminal:le(()=>b().terminal),uploads:F,questionTracker:h,sideQuestions:z,sessionWatches:B,watchEngine:_,orchestrations:L,orchestrationRuns:J,orchestrationEngine:S,pushSubscriptions:G,pushNotifier:ue,onAttach:N.attach,dashboardRefresh:N.attach,hookPlugins:H,hookMirror:q.mirror,pluginStates:new T(t),toolkit:pe,auth:O}),oe=we.createServer(te);let re=null;fs({port:C,bindHost:E,handler:te}).then(e=>{re=e});const ne=()=>{f?.stopWatching(),w.stop(),x.stop(),Q.stop(),Z.stop(),U.stop(),D.killAll(),clearInterval(se),V.stop(),N.stop(),q.stop(),oe.close(),re?.server.close(),process.exit(0)};process.on("SIGTERM",ne),process.on("SIGINT",ne),oe.listen(u.port,E,()=>{Ts({...u,pid:process.pid,host:E,tlsPort:C}),Bs()})}
@@ -1,2 +1,2 @@
1
- import{existsSync as n,mkdirSync as a,readFileSync as o,rmSync as i,writeFileSync as c}from"node:fs";import m from"node:path";import{getDaemonStatePath as r}from"../db/paths.js";export function readDaemonState(){const t=r();if(!n(t))return null;try{return JSON.parse(o(t,"utf-8"))}catch{return null}}export function writeDaemonState(t){const e=r();a(m.dirname(e),{recursive:!0}),c(e,JSON.stringify(t,null,2)+`
2
- `,"utf-8")}export function clearDaemonState(){const t=r();n(t)&&i(t)}
1
+ import{existsSync as n,mkdirSync as o,readFileSync as i,rmSync as a,writeFileSync as c}from"node:fs";import m from"node:path";import{getDaemonStatePath as r}from"../db/paths.js";export function readDaemonState(){const t=r();if(!n(t))return null;try{return JSON.parse(i(t,"utf-8"))}catch{return null}}export function writeDaemonState(t){const e=r();o(m.dirname(e),{recursive:!0}),c(e,JSON.stringify(t,null,2)+`
2
+ `,"utf-8")}export function clearDaemonState(){const t=r();n(t)&&a(t)}
@@ -1 +1 @@
1
- import{existsSync as i}from"node:fs";import{fileURLToPath as e}from"node:url";import o from"node:path";export function resolveStaticDir(){const t=o.dirname(e(import.meta.url)),r=o.resolve(t,"../../web/dist");return i(r)?r:void 0}
1
+ import{existsSync as o}from"node:fs";import{fileURLToPath as i}from"node:url";import t from"node:path";export function resolveStaticDir(){const e=t.dirname(i(import.meta.url)),r=t.resolve(e,"../../web/dist");return o(r)?r:void 0}
@@ -1 +1 @@
1
- export class TerminalTopologyRefresher{snapshot;bus;options;timer;running=!1;last=null;lastFingerprint=null;startedAt=0;constructor(t,i,s={}){this.snapshot=t,this.bus=i,this.options=s}get lastSnapshot(){return this.last}start(){this.timer||(this.startedAt=Date.now(),this.timer=setInterval(()=>{this.tick()},this.options.intervalMs??3e4))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}async refreshNow(){await this.run(!0,!0)}onSubscriberJoin(){this.last!==null&&(this.lastFingerprint=JSON.stringify(this.last),this.bus.emit({key:"terminalTopology",payload:this.last})),this.tick()}async tick(t=!1){await this.run(t,!1)}async run(t,i){if(this.running)return;const s=this.options.shouldRun;if(!(!t&&s&&!s())&&!(!i&&Date.now()-this.startedAt<(this.options.graceMs??0))){this.running=!0;try{const r=await this.snapshot(),a={...this.last?.terminals};for(const[h,o]of Object.entries(r.terminals))o!==void 0&&(a[h]=o);const n={counts:r.counts,terminals:a};this.last=n;const e=JSON.stringify(n);if(e===this.lastFingerprint)return;this.lastFingerprint=e,this.bus.emit({key:"terminalTopology",payload:n})}catch{}finally{this.running=!1}}}}
1
+ export class TerminalTopologyRefresher{snapshot;bus;options;timer;running=!1;last=null;lastFingerprint=null;startedAt=0;constructor(t,i,s={}){this.snapshot=t,this.bus=i,this.options=s}get lastSnapshot(){return this.last}start(){this.timer||(this.startedAt=Date.now(),this.timer=setInterval(()=>{this.tick()},this.options.intervalMs??3e4))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}async refreshNow(){await this.run(!0,!0)}onSubscriberJoin(){this.last!==null&&(this.lastFingerprint=JSON.stringify(this.last),this.bus.emit({key:"terminalTopology",payload:this.last})),this.tick()}async tick(t=!1){await this.run(t,!1)}async run(t,i){if(this.running)return;const s=this.options.shouldRun;if(!(!t&&s&&!s())&&!(!i&&Date.now()-this.startedAt<(this.options.graceMs??0))){this.running=!0;try{const r=await this.snapshot(),e={...this.last?.terminals};for(const[l,o]of Object.entries(r.terminals))o!==void 0&&(e[l]=o);const n={counts:r.counts,terminals:e};this.last=n;const a=JSON.stringify(n);if(a===this.lastFingerprint)return;this.lastFingerprint=a,this.bus.emit({key:"terminalTopology",payload:n})}catch{}finally{this.running=!1}}}}
@@ -1 +1 @@
1
- import v from"node:https";import m from"node:os";import u from"node:path";import{existsSync as f,mkdirSync as w,readFileSync as l,writeFileSync as h}from"node:fs";import{X509Certificate as S,createPrivateKey as k}from"node:crypto";import{generate as $}from"selfsigned";import{getCertsDir as D}from"../db/paths.js";export function daemonCertsDir(){return D()}export function lanIps(){const e=new Set;for(const t of Object.values(m.networkInterfaces()))for(const r of t??[])r.family==="IPv4"&&!r.internal&&e.add(r.address);return[...e].sort()}export function accessUrls(e,t){const r=[{url:`http://localhost:${e}`,protocol:"http",scope:"local"}];t>0&&r.push({url:`https://localhost:${t}`,protocol:"https",scope:"local"});for(const o of lanIps())r.push({url:`http://${o}:${e}`,protocol:"http",scope:"lan"}),t>0&&r.push({url:`https://${o}:${t}`,protocol:"https",scope:"lan"});return r}function x(e){const t=e.subjectAltName??"",r=new Set;for(const o of t.split(",")){const n=o.trim().match(/^IP Address:(.+)$/);n&&r.add(n[1])}return r}export async function ensureDaemonCert(e=daemonCertsDir(),t={}){const r=t.ips??["127.0.0.1",...lanIps()],o=t.hostname??m.hostname(),n=t.now??new Date,s=u.join(e,"host.key"),a=u.join(e,"host.crt");if(f(s)&&f(a))try{const i=l(s,"utf-8"),p=new S(l(a,"utf-8")),y=r.every(d=>x(p).has(d));if(p.checkPrivateKey(k(i))&&Date.parse(p.validTo)>n.getTime()+7*864e5&&y)return{key:i,cert:l(a,"utf-8")}}catch{}const c=await $([{name:"commonName",value:"weave-daemon"}],{keySize:2048,notAfterDate:new Date(n.getTime()+825*864e5),extensions:[{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:2,value:o},...r.map(i=>({type:7,ip:i}))]}]});return w(e,{recursive:!0}),h(s,c.private,{mode:384}),h(a,c.cert),{key:c.private,cert:c.cert}}export async function startTlsServer(e){if(e.port<=0)return null;try{const{key:t,cert:r}=await ensureDaemonCert(e.certDir),o=v.createServer({key:t,cert:r},e.handler);return await new Promise((n,s)=>{o.once("error",s),o.listen(e.port,e.bindHost,()=>{o.off("error",s),n()})}),{server:o,port:e.port}}catch(t){return console.warn(`[weave] https listener disabled (port ${e.port}): ${t instanceof Error?t.message:String(t)}`),null}}
1
+ import w from"node:https";import m from"node:os";import f from"node:path";import{existsSync as u,mkdirSync as d,readFileSync as l,writeFileSync as h}from"node:fs";import{X509Certificate as S,createPrivateKey as k}from"node:crypto";import{generate as $}from"selfsigned";import{getCertsDir as x}from"../db/paths.js";export function daemonCertsDir(){return x()}export function lanIps(){const t=new Set;for(const e of Object.values(m.networkInterfaces()))for(const r of e??[])r.family==="IPv4"&&!r.internal&&t.add(r.address);return[...t].sort()}export function accessUrls(t,e){const r=[{url:`http://localhost:${t}`,protocol:"http",scope:"local"}];e>0&&r.push({url:`https://localhost:${e}`,protocol:"https",scope:"local"});for(const o of lanIps())r.push({url:`http://${o}:${t}`,protocol:"http",scope:"lan"}),e>0&&r.push({url:`https://${o}:${e}`,protocol:"https",scope:"lan"});return r}function D(t){const e=t.subjectAltName??"",r=new Set;for(const o of e.split(",")){const n=o.trim().match(/^IP Address:(.+)$/);n&&r.add(n[1])}return r}export async function ensureDaemonCert(t=daemonCertsDir(),e={}){const r=e.ips??["127.0.0.1",...lanIps()],o=e.hostname??m.hostname(),n=e.now??new Date,s=f.join(t,"host.key"),c=f.join(t,"host.crt");if(u(s)&&u(c))try{const i=l(s,"utf-8"),p=new S(l(c,"utf-8")),y=r.every(v=>D(p).has(v));if(p.checkPrivateKey(k(i))&&Date.parse(p.validTo)>n.getTime()+7*864e5&&y)return{key:i,cert:l(c,"utf-8")}}catch{}const a=await $([{name:"commonName",value:"weave-daemon"}],{keySize:2048,notAfterDate:new Date(n.getTime()+825*864e5),extensions:[{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:2,value:o},...r.map(i=>({type:7,ip:i}))]}]});return d(t,{recursive:!0}),h(s,a.private,{mode:384}),h(c,a.cert),{key:a.private,cert:a.cert}}export async function startTlsServer(t){if(t.port<=0)return null;try{const{key:e,cert:r}=await ensureDaemonCert(t.certDir),o=w.createServer({key:e,cert:r},t.handler);return await new Promise((n,s)=>{o.once("error",s),o.listen(t.port,t.bindHost,()=>{o.off("error",s),n()})}),{server:o,port:t.port}}catch(e){return console.warn(`[weave] https listener disabled (port ${t.port}): ${e instanceof Error?e.message:String(e)}`),null}}