@weavecode/weave 0.1.6 → 0.1.8

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 (435) hide show
  1. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +1 -1
  2. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
  3. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/context.js +1 -1
  4. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +3 -5
  5. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono-base.js +4 -10
  6. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono.js +0 -1
  7. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +1 -1
  8. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +1 -1
  9. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/csrf/index.js +2 -2
  10. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +2 -2
  11. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +2 -2
  12. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/mount/index.js +4 -4
  13. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +13 -11
  14. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +4 -4
  15. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +39 -51
  16. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +15 -5
  17. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/jwt/jwt.js +2 -1
  18. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/mount.js +35 -0
  19. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +10 -0
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/validator/validator.js +1 -1
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/context.js +1 -1
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +3 -5
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono-base.js +4 -10
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono.js +0 -1
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/basic-auth/index.js +1 -1
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +1 -1
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/csrf/index.js +2 -2
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwk/jwk.js +2 -2
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwt/jwt.js +2 -2
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/language/language.js +1 -1
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/mount/index.js +4 -4
  32. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/node.js +13 -11
  33. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +5 -5
  34. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/router.js +40 -52
  35. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/trie.js +15 -5
  36. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/mount/index.d.ts +1 -0
  37. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -3
  38. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +1 -1
  39. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/mount.d.ts +4 -0
  40. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/url.d.ts +1 -0
  41. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/jwt/jwt.js +2 -1
  42. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/mount.js +34 -0
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +10 -1
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/validator/validator.js +1 -1
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +3 -1
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/deflate.js +2 -1
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +2 -1
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
  50. package/node_modules/@weavecode/cli/dist/cli.js +3 -3
  51. package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
  52. package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
  53. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  54. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
  55. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  56. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  57. package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
  58. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  59. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  60. package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
  61. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +1 -1
  62. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +1 -0
  63. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +2 -2
  64. package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
  65. package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
  66. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
  67. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  68. package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
  69. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  70. package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
  71. package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
  72. package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
  73. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  74. package/node_modules/@weavecode/cli/dist/init/provision.js +1 -1
  75. package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
  76. package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
  77. package/node_modules/@weavecode/cli/dist/parser.js +1 -1
  78. package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
  79. package/node_modules/@weavecode/cli/package.json +5 -5
  80. package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
  81. package/node_modules/@weavecode/core/dist/harness.d.ts +89 -0
  82. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  83. package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
  84. package/node_modules/@weavecode/core/dist/index.js +1 -1
  85. package/node_modules/@weavecode/core/dist/platform.js +1 -1
  86. package/node_modules/@weavecode/core/dist/types.js +1 -1
  87. package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
  88. package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
  89. package/node_modules/@weavecode/core/package.json +1 -1
  90. package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
  91. package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
  92. package/node_modules/@weavecode/harness/dist/claude/commands.d.ts +2 -0
  93. package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -2
  94. package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
  95. package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
  96. package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
  97. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  98. package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
  99. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  100. package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -1
  101. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
  102. package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
  103. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
  104. package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -1
  105. package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
  106. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
  107. package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
  108. package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
  109. package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
  110. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
  111. package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
  112. package/node_modules/@weavecode/harness/dist/claude/rewind.js +1 -1
  113. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
  114. package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
  115. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +14 -14
  116. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
  117. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
  118. package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.js +2 -2
  119. package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -7
  120. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  121. package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
  122. package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
  123. package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
  124. package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
  125. package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
  126. package/node_modules/@weavecode/harness/dist/codex/images.js +1 -1
  127. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  128. package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -1
  129. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
  130. package/node_modules/@weavecode/harness/dist/codex/messaging.js +2 -2
  131. package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -1
  132. package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
  133. package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
  134. package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -1
  135. package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -2
  136. package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
  137. package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -4
  138. package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -4
  139. package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
  140. package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
  141. package/node_modules/@weavecode/harness/dist/driver.d.ts +13 -0
  142. package/node_modules/@weavecode/harness/dist/driver.js +1 -1
  143. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
  144. package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
  145. package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
  146. package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
  147. package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
  148. package/node_modules/@weavecode/harness/package.json +2 -2
  149. package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
  150. package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
  151. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  152. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  153. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  154. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
  155. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  156. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
  157. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  158. package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
  159. package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
  160. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  161. package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
  162. package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
  163. package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
  164. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  165. package/node_modules/@weavecode/server/dist/daemon/entry.js +2 -2
  166. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  167. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  168. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  169. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  170. package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -1
  171. package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
  172. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -2
  173. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -1
  174. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +1 -1
  175. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -2
  176. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -1
  177. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -1
  178. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -1
  179. package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -1
  180. package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
  181. package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
  182. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
  183. package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
  184. package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -1
  185. package/node_modules/@weavecode/server/dist/daemon/pet-seed.d.ts +6 -0
  186. package/node_modules/@weavecode/server/dist/daemon/pet-seed.js +1 -0
  187. package/node_modules/@weavecode/server/dist/daemon/pet-window.d.ts +17 -0
  188. package/node_modules/@weavecode/server/dist/daemon/pet-window.js +2 -0
  189. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  190. package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +1 -1
  191. package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
  192. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  193. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  194. package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
  195. package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
  196. package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
  197. package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
  198. package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
  199. package/node_modules/@weavecode/server/dist/daemon/routes/pets.d.ts +3 -0
  200. package/node_modules/@weavecode/server/dist/daemon/routes/pets.js +1 -0
  201. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -1
  202. package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
  203. package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -1
  204. package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
  205. package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
  206. package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
  207. package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
  208. package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +2 -1
  209. package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
  210. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +2 -0
  211. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
  212. package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +17 -0
  213. package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
  214. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  215. package/node_modules/@weavecode/server/dist/daemon/settings.d.ts +21 -0
  216. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  217. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  218. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
  219. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  220. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  221. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  222. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
  223. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  224. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  225. package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
  226. package/node_modules/@weavecode/server/dist/db/db.d.ts +4 -1
  227. package/node_modules/@weavecode/server/dist/db/db.js +2 -2
  228. package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
  229. package/node_modules/@weavecode/server/dist/db/paths.d.ts +4 -0
  230. package/node_modules/@weavecode/server/dist/db/paths.js +1 -1
  231. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  232. package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
  233. package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
  234. package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
  235. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
  236. package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
  237. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
  238. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
  239. package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
  240. package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
  241. package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
  242. package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
  243. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  244. package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
  245. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  246. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  247. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
  248. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  249. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  250. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +5 -5
  251. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  252. package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
  253. package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
  254. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  255. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  256. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  257. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  258. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  259. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  260. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  261. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  262. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  263. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  264. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
  265. package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
  266. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  267. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  268. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  269. package/node_modules/@weavecode/server/dist/index.d.ts +1 -1
  270. package/node_modules/@weavecode/server/dist/index.js +1 -1
  271. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  272. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  273. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  274. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  275. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  276. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
  277. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  278. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
  279. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  280. package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
  281. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  282. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  283. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  284. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  285. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  286. package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
  287. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  288. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  289. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  290. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  291. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  292. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  293. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  294. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  295. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  296. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  297. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  298. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  299. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
  300. package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +6 -0
  301. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +8 -5
  302. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  303. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  304. package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
  305. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  306. package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
  307. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  308. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  309. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  310. package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
  311. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  312. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
  313. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
  314. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  315. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  316. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  317. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  318. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  319. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  320. package/node_modules/@weavecode/server/package.json +4 -4
  321. package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-t5OQjhuS.js +1 -0
  322. package/node_modules/@weavecode/server/web/dist/assets/{arc-DH8-rYAa.js → arc-De-uH_Q9.js} +1 -1
  323. package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-ImPclD43.js +36 -0
  324. package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-pT5eO-cB.js → blockDiagram-RJAE7QA3-B5xEQs6X.js} +2 -2
  325. package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DHDBDMb1.js → c4Diagram-XDPPPE54-DP8MjIgJ.js} +2 -2
  326. package/node_modules/@weavecode/server/web/dist/assets/channel-C0RGiobt.js +1 -0
  327. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-CT951PH5.js → chunk-2E7WHVMD-C3UFIDyj.js} +1 -1
  328. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-E5AD7_ZY.js → chunk-2Q5K7J3B-Bgw-3YfG.js} +1 -1
  329. package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DWz9qkcy.js → chunk-4EMNKR2T-Dy_Wq9qn.js} +1 -1
  330. package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D32C0DXX.js +1 -0
  331. package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-ci6YzbO5.js → chunk-5VM5RSS4-Dpmi-9Gi.js} +1 -1
  332. package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CY4mr2f4.js → chunk-JWPE2WC7-CEYXaZDX.js} +1 -1
  333. package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CON8zyg8.js → chunk-VQ5W62QI-A616Pgzo.js} +1 -1
  334. package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-CnxFMLWV.js +1 -0
  335. package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-BhjCTig8.js +2 -0
  336. package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-GiWZ9xtF.js → classDiagram-v2-4MYWR3UA-rzlq5tPv.js} +2 -2
  337. package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-CxWQXzj8.js +1 -0
  338. package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-9B__MaRM.js → cynefin-EF2NZ3EQ-AFHjx2wU.js} +1 -1
  339. package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-Bp_Oaf9U.js +62 -0
  340. package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-7oUPIU35.js +4 -0
  341. package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-D_rS_rSY.js +24 -0
  342. package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-Duc_cKMb.js +24 -0
  343. package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-CckywF4W.js → diagram-ODIL2UCW-DA0XFVXm.js} +2 -2
  344. package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-Dpjlc7Wh.js → diagram-PFBEJUXE-D1U0Xhtt.js} +2 -2
  345. package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-CbDFY871.js +41 -0
  346. package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-DgRJ3zL1.js → diagram-TYUNFSNR-jPg9AxQv.js} +2 -2
  347. package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-ZHfGTB0N.js +1 -0
  348. package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-Ch6Gs9G9.js → elk-QONTBCTQ-C-ESJrUi.js} +3 -3
  349. package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-COxT-Pxb.js → erDiagram-KYQIGQAA-DGK7TeHj.js} +2 -2
  350. package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-CJVWnTBa.js → flowDiagram-IUGLLWBU-CVV4rL8v.js} +1 -1
  351. package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-CuAwNvbm.js +292 -0
  352. package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-D_15Wtf-.js +106 -0
  353. package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-ClqhbrCa.js +2 -0
  354. package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-BNjEDIZy.js → ishikawaDiagram-HPEHV2GE-CUJ891JX.js} +2 -2
  355. package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-Cao6h91a.js → journeyDiagram-BOSHW7O7-B4skiMu-.js} +2 -2
  356. package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CXIx2CHQ.js → kanban-definition-FNSA4HC5-UNGJR_y_.js} +2 -2
  357. package/node_modules/@weavecode/server/web/dist/assets/linear-BEB-UwbR.js +1 -0
  358. package/node_modules/@weavecode/server/web/dist/assets/main-B_0jS_Gz.js +1096 -0
  359. package/node_modules/@weavecode/server/web/dist/assets/main-Czzlavi4.css +11 -0
  360. package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D39fi_iR.js → mermaid.core-knGXJfjz.js} +4 -4
  361. package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-DHqpz_AK.js → mindmap-definition-6OY57UG3-CEldbr3a.js} +2 -2
  362. package/node_modules/@weavecode/server/web/dist/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
  363. package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-cNCkGLx3.js +1 -0
  364. package/node_modules/@weavecode/server/web/dist/assets/pet-DJCpIDM5.js +1 -0
  365. package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-CfMEFiQD.js +39 -0
  366. package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-zSM6o7mB.js → quadrantDiagram-D57K4MC3-knmi2rwP.js} +4 -4
  367. package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-BJ7AzhEo.js +1 -0
  368. package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-CbCLBjHf.js → requirementDiagram-EQYSW5RA-Dte2LGQM.js} +2 -2
  369. package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BucVk6EP.js → sankeyDiagram-SY24JHO5-3noLaWgd.js} +2 -2
  370. package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-Dg8CYEnT.js → sequenceDiagram-BLEHNHQU-CclOWTTc.js} +2 -2
  371. package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-B82sbLhA.js +1 -0
  372. package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-BvK2l3is.js → stateDiagram-v2-A6IESKWZ-BXfVDwSN.js} +2 -2
  373. package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-D4lKZaeV.js +1 -0
  374. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DbdFh_d6.js +8 -0
  375. package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-CadU4Qq4.js → timeline-definition-JXYKGLGB-D6H6zP5b.js} +2 -2
  376. package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-BYuZwTDZ.js → usecaseDiagram-WPOLBNNX-D2J2bKo_.js} +2 -2
  377. package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-C7zgxe07.js → vennDiagram-Q3Y3IDCW-pdRbIkpB.js} +2 -2
  378. package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-DA4Otf4s.js → wardleyDiagram-IVAIDKWA-Cyd2QPMf.js} +2 -2
  379. package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-Bs5YGwMU.js → xychartDiagram-4URNHDU4-Bd4BkwVM.js} +2 -2
  380. package/node_modules/@weavecode/server/web/dist/icons/apple-touch-icon.png +0 -0
  381. package/node_modules/@weavecode/server/web/dist/icons/icon-192.png +0 -0
  382. package/node_modules/@weavecode/server/web/dist/icons/icon-512.png +0 -0
  383. package/node_modules/@weavecode/server/web/dist/icons/icon-maskable-512.png +0 -0
  384. package/node_modules/@weavecode/server/web/dist/index.html +12 -2
  385. package/node_modules/@weavecode/server/web/dist/manifest.webmanifest +16 -0
  386. package/node_modules/@weavecode/server/web/dist/pet.html +60 -0
  387. package/node_modules/@weavecode/templates/dist/index.d.ts +2 -0
  388. package/node_modules/@weavecode/templates/dist/index.js +1 -1
  389. package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/pet.json +7 -0
  390. package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/spritesheet.png +0 -0
  391. package/node_modules/@weavecode/templates/dist/resources/weave-market/.claude-plugin/marketplace.json +6 -0
  392. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/.claude-plugin/plugin.json +8 -0
  393. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/SKILL.md +121 -0
  394. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/scripts/assemble-pet.mjs +308 -0
  395. package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/weave.json +4 -0
  396. package/node_modules/@weavecode/templates/package.json +2 -2
  397. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/README.md +3 -8
  398. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/package.json +1 -1
  399. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.d.ts +4 -2
  400. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.js +10 -1
  401. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.mjs +10 -1
  402. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.js +10 -1
  403. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/README.md +3 -8
  404. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/package.json +1 -1
  405. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.d.ts +4 -2
  406. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.js +10 -1
  407. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.mjs +10 -1
  408. package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.js +10 -1
  409. package/package.json +11 -7
  410. package/scripts/preinstall.mjs +70 -0
  411. package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-CbIFQh0R.js +0 -1
  412. package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-qnv6S0sc.js +0 -36
  413. package/node_modules/@weavecode/server/web/dist/assets/channel-BHPeeuzN.js +0 -1
  414. package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D-SgWD8w.js +0 -1
  415. package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-DXXXZ4pW.js +0 -1
  416. package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-CukvPvkM.js +0 -2
  417. package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-D7aJ-akq.js +0 -1
  418. package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-B2ujZh2k.js +0 -62
  419. package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-nHaB6IWf.js +0 -4
  420. package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-xKfjDvgr.js +0 -24
  421. package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-BHT2-5mY.js +0 -24
  422. package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-M6WznOaW.js +0 -41
  423. package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-BzzVN__a.js +0 -1
  424. package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-BkRpWPUl.js +0 -292
  425. package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-Ba8BJcvZ.js +0 -106
  426. package/node_modules/@weavecode/server/web/dist/assets/index-CtifxEiF.css +0 -11
  427. package/node_modules/@weavecode/server/web/dist/assets/index-FwH9INgS.js +0 -1090
  428. package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-HTQ5FUNK.js +0 -2
  429. package/node_modules/@weavecode/server/web/dist/assets/linear-65WmlvQb.js +0 -1
  430. package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-Cpy1nsER.js +0 -1
  431. package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-B1IyNqzr.js +0 -39
  432. package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-oM4XJIwA.js +0 -1
  433. package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-C51zb7Oc.js +0 -1
  434. package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-Ds7QOfXW.js +0 -1
  435. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-ByBF02UJ.js +0 -8
@@ -1,4 +1,4 @@
1
- import{mkdirSync as t}from"node:fs";import N from"node:path";import{DatabaseSync as i}from"node:sqlite";import{getDbPath as o}from"./paths.js";import{projectKey as A}from"../repositories/projects.js";const n=`
1
+ import{existsSync as L,mkdirSync as a,readdirSync as _,renameSync as d,unlinkSync as A}from"node:fs";import i from"node:path";import{DatabaseSync as O}from"node:sqlite";import{getDbPath as u}from"./paths.js";import{projectKey as R}from"../repositories/projects.js";const I=`
2
2
  CREATE TABLE IF NOT EXISTS projects (
3
3
  id INTEGER PRIMARY KEY AUTOINCREMENT,
4
4
  path TEXT NOT NULL UNIQUE,
@@ -204,4 +204,4 @@ CREATE TABLE IF NOT EXISTS event_images (
204
204
  upload_id TEXT NOT NULL,
205
205
  PRIMARY KEY (event_id, upload_id)
206
206
  );
207
- `;export function openDatabase(E=o()){E!==":memory:"&&t(N.dirname(E),{recursive:!0});const u=new i(E);return u.exec("PRAGMA busy_timeout = 5000"),u.exec("PRAGMA journal_mode = WAL"),u.exec("PRAGMA foreign_keys = ON"),_(u),u.exec(n),u.exec("DROP TABLE IF EXISTS session_messages"),d(u),r(u),a(u),L(u),D(u),u}function a(E){const u=E.prepare("SELECT id, path FROM projects ORDER BY id").all(),F=new Set(u.map(e=>e.path)),s=E.prepare("UPDATE projects SET path = ? WHERE id = ?");for(const e of u){const T=A(e.path);T===e.path||F.has(T)||(F.delete(e.path),F.add(T),s.run(T,e.id))}}function L(E){const u=new Set(E.prepare("PRAGMA table_info(session_watches)").all().map(F=>String(F.name)));u.size!==0&&(u.has("on_events")||E.exec("ALTER TABLE session_watches ADD COLUMN on_events TEXT"),u.has("remaining")||(E.exec("ALTER TABLE session_watches ADD COLUMN remaining INTEGER"),E.exec("UPDATE session_watches SET remaining = 1")))}function r(E){const u=new Set(E.prepare("PRAGMA table_info(projects)").all().map(F=>String(F.name)));u.size!==0&&(u.has("sort_order")||E.exec("ALTER TABLE projects ADD COLUMN sort_order INTEGER"),u.has("archived_at")||E.exec("ALTER TABLE projects ADD COLUMN archived_at TEXT"))}function D(E){const u=new Set(E.prepare("PRAGMA table_info(uploads)").all().map(F=>String(F.name)));u.size!==0&&(u.has("dir")||E.exec("ALTER TABLE uploads ADD COLUMN dir TEXT"))}function _(E){const u=E.prepare("PRAGMA table_info(orchestrations)").all();u.length===0||u.some(F=>F.name==="enabled")||E.exec("DROP TABLE orchestrations")}function d(E){const u=new Set(E.prepare("PRAGMA table_info(hook_rules)").all().map(F=>String(F.name)));u.size!==0&&(u.has("origin")||E.exec("ALTER TABLE hook_rules ADD COLUMN origin TEXT NOT NULL DEFAULT 'user'"),u.has("plugin_id")||E.exec("ALTER TABLE hook_rules ADD COLUMN plugin_id TEXT"),E.exec("CREATE INDEX IF NOT EXISTS idx_hook_rules_plugin ON hook_rules(plugin_id)"))}
207
+ `,N=1,p=3;function X(T){const e=T instanceof Error?T.message:String(T);return/malformed database schema|database disk image is malformed|file is not a database|SQLITE_CORRUPT/i.test(e)}function l(T){const e=T.prepare("PRAGMA user_version").get();return typeof e?.user_version=="number"?e.user_version:0}function U(T,e){if(e===":memory:")return;const t=l(T);if(t>=N)return;const o=T.prepare("SELECT count(*) AS n FROM sqlite_master").get();if(!o||o.n===0)return;const s=i.join(i.dirname(e),"backups");a(s,{recursive:!0});const E=new Date().toISOString().replace(/[:.]/g,"-"),n=i.join(s,`weave-v${t}-${E}.db`);try{T.exec(`VACUUM INTO '${n.replace(/'/g,"''")}'`),console.log(`[weave] database backup before migration: ${n}`),h(s)}catch(r){console.error(`[weave] database backup failed (continuing): ${r instanceof Error?r.message:r}`)}}function h(T){try{const e=_(T).filter(t=>t.startsWith("weave-v")&&t.endsWith(".db")).sort();for(const t of e.slice(0,Math.max(0,e.length-p)))try{A(i.join(T,t))}catch{}}catch{}}function S(T,e){const t=new Date().toISOString().replace(/[:.]/g,"-"),o=`${T}.corrupt-${t}`;for(const E of["","-wal","-shm"])try{L(T+E)&&d(T+E,o+E)}catch{}const s=e instanceof Error?e.message:String(e);return console.error(`[weave] database is corrupt (${s}); moved to ${o} and starting with a fresh one. Recover the old data with: sqlite3 "${o}" ".recover" | sqlite3 "${T}"`),c(T)}export function openDatabase(T=u()){T!==":memory:"&&a(i.dirname(T),{recursive:!0});try{return c(T)}catch(e){if(!X(e))throw e;return S(T,e)}}function c(T){const e=new O(T);try{e.exec("PRAGMA busy_timeout = 5000"),e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON");const t=e.prepare("PRAGMA quick_check").get();if(t?.quick_check!==void 0&&t.quick_check!=="ok")throw new Error(`malformed database schema (${t.quick_check})`);return U(e,T),g(e),e.exec(I),e.exec("DROP TABLE IF EXISTS session_messages"),k(e),C(e),m(e),f(e),D(e),e.exec(`PRAGMA user_version = ${N}`),e}catch(t){try{e.close()}catch{}throw t}}function m(T){const e=T.prepare("SELECT id, path FROM projects ORDER BY id").all(),t=new Set(e.map(s=>s.path)),o=T.prepare("UPDATE projects SET path = ? WHERE id = ?");for(const s of e){const E=R(s.path);E===s.path||t.has(E)||(t.delete(s.path),t.add(E),o.run(E,s.id))}}function f(T){const e=new Set(T.prepare("PRAGMA table_info(session_watches)").all().map(t=>String(t.name)));e.size!==0&&(e.has("on_events")||T.exec("ALTER TABLE session_watches ADD COLUMN on_events TEXT"),e.has("remaining")||(T.exec("ALTER TABLE session_watches ADD COLUMN remaining INTEGER"),T.exec("UPDATE session_watches SET remaining = 1")))}function C(T){const e=new Set(T.prepare("PRAGMA table_info(projects)").all().map(t=>String(t.name)));e.size!==0&&(e.has("sort_order")||T.exec("ALTER TABLE projects ADD COLUMN sort_order INTEGER"),e.has("archived_at")||T.exec("ALTER TABLE projects ADD COLUMN archived_at TEXT"))}function D(T){const e=new Set(T.prepare("PRAGMA table_info(uploads)").all().map(t=>String(t.name)));e.size!==0&&(e.has("dir")||T.exec("ALTER TABLE uploads ADD COLUMN dir TEXT"))}function g(T){const e=T.prepare("PRAGMA table_info(orchestrations)").all();e.length===0||e.some(t=>t.name==="enabled")||T.exec("DROP TABLE orchestrations")}function k(T){const e=new Set(T.prepare("PRAGMA table_info(hook_rules)").all().map(t=>String(t.name)));e.size!==0&&(e.has("origin")||T.exec("ALTER TABLE hook_rules ADD COLUMN origin TEXT NOT NULL DEFAULT 'user'"),e.has("plugin_id")||T.exec("ALTER TABLE hook_rules ADD COLUMN plugin_id TEXT"),T.exec("CREATE INDEX IF NOT EXISTS idx_hook_rules_plugin ON hook_rules(plugin_id)"))}
@@ -1 +1 @@
1
- import{existsSync as u,lstatSync as g,mkdirSync as p,readFileSync as S,readdirSync as f,renameSync as m,rmSync as b,symlinkSync as w}from"node:fs";import e from"node:path";import{dataRoots as y,getDataDir as l}from"./paths.js";const h={data:["market","uploads","plugins"],local:["auth.json","ai.json","push.json","initial-password","certs","weave-autostart.vbs"],cache:["logs","statusline","hooks","tmp","daemon.json"]},D="weave.db",j=["hooks","statusline"];export function liveDaemonPid(o=l()){const t=y(o);for(const i of[e.join(t.cache,"daemon.json"),e.join(o,"daemon.json")])try{const s=Number(JSON.parse(S(i,"utf-8")).pid);if(s>0&&x(s))return s}catch{}return null}function x(o){try{return process.kill(o,0),!0}catch{return!1}}function L(o){try{return g(o).isSymbolicLink()}catch{return!1}}function k(o,t){p(t,{recursive:!0});for(const i of f(o,{withFileTypes:!0})){const s=e.join(o,i.name),a=e.join(t,i.name);i.isDirectory()?k(s,a):u(a)||m(s,a)}b(o,{recursive:!0,force:!0})}export function ensureDataLayout(o=l()){const t=migrateDataLayout(o);return t.moved.length>0&&console.log(`[weave] data layout: moved ${t.moved.join(", ")}`),t.kept.length>0&&console.log(`[weave] data layout: kept ${t.kept.join(", ")} (target exists)`),t}export function migrateDataLayout(o=l()){const t={moved:[],kept:[],bridged:[],busyPid:null},i=liveDaemonPid(o);if(i!==null)return t.busyPid=i,t;let s;try{s=f(o)}catch{return t}const a=Object.keys(h),d=y(o);for(const n of s){if(L(e.join(o,n)))continue;const c=a.find(v=>h[v].includes(n))??(n.startsWith(D)?"data":null);if(!c)continue;const r=d[c];if(u(e.join(r,n))&&j.includes(n)){try{k(e.join(o,n),e.join(r,n)),t.moved.push(n)}catch{t.kept.push(n)}continue}if(u(e.join(r,n))){t.kept.push(n);continue}try{p(r,{recursive:!0}),m(e.join(o,n),e.join(r,n)),t.moved.push(n)}catch{t.kept.push(n)}}for(const n of j){const c=e.join(o,n),r=e.join(d.cache,n);if(!(!u(r)||u(c)))try{w(r,c,process.platform==="win32"?"junction":"dir"),t.bridged.push(n)}catch{}}return t}
1
+ import{existsSync as u,lstatSync as g,mkdirSync as f,readFileSync as S,readdirSync as p,renameSync as m,rmSync as b,symlinkSync as D}from"node:fs";import o from"node:path";import{dataRoots as y,getDataDir as l}from"./paths.js";const h={data:["market","uploads","plugins"],local:["auth.json","ai.json","push.json","initial-password","certs","weave-autostart.vbs"],cache:["logs","statusline","hooks","tmp","daemon.json"]},w="weave.db",j=["hooks","statusline"];export function liveDaemonPid(n=l()){const t=y(n);for(const i of[o.join(t.cache,"daemon.json"),o.join(n,"daemon.json")])try{const s=Number(JSON.parse(S(i,"utf-8")).pid);if(s>0&&x(s))return s}catch{}return null}function x(n){try{return process.kill(n,0),!0}catch{return!1}}function L(n){try{return g(n).isSymbolicLink()}catch{return!1}}function k(n,t){f(t,{recursive:!0});for(const i of p(n,{withFileTypes:!0})){const s=o.join(n,i.name),r=o.join(t,i.name);i.isDirectory()?k(s,r):u(r)||m(s,r)}b(n,{recursive:!0,force:!0})}export function ensureDataLayout(n=l()){const t=migrateDataLayout(n);return t.moved.length>0&&console.log(`[weave] data layout: moved ${t.moved.join(", ")}`),t.kept.length>0&&console.log(`[weave] data layout: kept ${t.kept.join(", ")} (target exists)`),t}export function migrateDataLayout(n=l()){const t={moved:[],kept:[],bridged:[],busyPid:null},i=liveDaemonPid(n);if(i!==null)return t.busyPid=i,t;let s;try{s=p(n)}catch{return t}const r=Object.keys(h),d=y(n);for(const e of s){if(L(o.join(n,e)))continue;const a=r.find(v=>h[v].includes(e))??(e.startsWith(w)?"data":null);if(!a)continue;const c=d[a];if(u(o.join(c,e))&&j.includes(e)){try{k(o.join(n,e),o.join(c,e)),t.moved.push(e)}catch{t.kept.push(e)}continue}if(u(o.join(c,e))){t.kept.push(e);continue}try{f(c,{recursive:!0}),m(o.join(n,e),o.join(c,e)),t.moved.push(e)}catch{t.kept.push(e)}}for(const e of j){const a=o.join(n,e),c=o.join(d.cache,e);if(!(!u(c)||u(a)))try{D(c,a,process.platform==="win32"?"junction":"dir"),t.bridged.push(e)}catch{}}return t}
@@ -24,6 +24,10 @@ export declare function getDbPath(dir?: string): string;
24
24
  export declare function getPluginsDir(dir?: string): string;
25
25
  /** 会话图片上传的落盘根(内容寻址 `<sha256>.<ext>`;绝对路径由 harness 引用)。 */
26
26
  export declare function getUploadsDir(dir?: string): string;
27
+ /** 桌面宠物资产根(`<id>/pet.json + spritesheet.webp`;skill 生成、随数据迁移)。 */
28
+ export declare function getPetsDir(dir?: string): string;
29
+ /** 渲染块 fragment 的稳定落点(模型产物;与上传同级,随数据迁移、可在设置页清理)。 */
30
+ export declare function getVisualizationsDir(dir?: string): string;
27
31
  /** Absolute path to the daemon auth file (password hash + secrets, 0600). */
28
32
  export declare function getAuthPath(dir?: string): string;
29
33
  /** Absolute path to the one-shot initial-password marker (0600; 首个 CLI 命令领取后即删). */
@@ -1 +1 @@
1
- import o from"node:path";import{detectPlatform as n}from"@weavecode/core";export function getDataDir(){return o.join(n().configDir,"weave")}export function dataRoots(t=getDataDir()){return{data:o.join(t,"data"),local:o.join(t,"local"),cache:o.join(t,"cache")}}export function getDataRoot(t){return dataRoots(t).data}export function getDbPath(t){return o.join(dataRoots(t).data,"weave.db")}export function getPluginsDir(t){return o.join(dataRoots(t).data,"plugins")}export function getUploadsDir(t){return o.join(dataRoots(t).data,"uploads")}export function getAuthPath(t){return o.join(dataRoots(t).local,"auth.json")}export function getInitialPasswordPath(t){return o.join(dataRoots(t).local,"initial-password")}export function getAiKeyPath(t){return o.join(dataRoots(t).local,"ai.json")}export function getDecisionKeyPath(t){return o.join(dataRoots(t).local,"decision.json")}export function getPushKeysPath(t){return o.join(dataRoots(t).local,"push.json")}export function getHarnessConfigDir(t){return o.join(dataRoots(t).local,"harness-config")}export function getCertsDir(t){return o.join(dataRoots(t).local,"certs")}export function getAutoStartScriptPath(t){return o.join(dataRoots(t).local,"weave-autostart.vbs")}export function getDaemonStatePath(t){return o.join(dataRoots(t).cache,"daemon.json")}export function getLogsDir(t){return o.join(dataRoots(t).cache,"logs")}export function getApiLogsDir(t){return o.join(getLogsDir(t),"api")}export function getHooksDir(t){return o.join(dataRoots(t).cache,"hooks")}export function getStatuslineDir(t){return o.join(dataRoots(t).cache,"statusline")}export function getTmpDir(t){return o.join(dataRoots(t).cache,"tmp")}export function getIndexDir(t){return o.join(dataRoots(t).cache,"index")}
1
+ import n from"node:path";import{detectPlatform as o}from"@weavecode/core";export function getDataDir(){return n.join(o().configDir,"weave")}export function dataRoots(t=getDataDir()){return{data:n.join(t,"data"),local:n.join(t,"local"),cache:n.join(t,"cache")}}export function getDataRoot(t){return dataRoots(t).data}export function getDbPath(t){return n.join(dataRoots(t).data,"weave.db")}export function getPluginsDir(t){return n.join(dataRoots(t).data,"plugins")}export function getUploadsDir(t){return n.join(dataRoots(t).data,"uploads")}export function getPetsDir(t){return n.join(dataRoots(t).data,"pets")}export function getVisualizationsDir(t){return n.join(dataRoots(t).data,"visualizations")}export function getAuthPath(t){return n.join(dataRoots(t).local,"auth.json")}export function getInitialPasswordPath(t){return n.join(dataRoots(t).local,"initial-password")}export function getAiKeyPath(t){return n.join(dataRoots(t).local,"ai.json")}export function getDecisionKeyPath(t){return n.join(dataRoots(t).local,"decision.json")}export function getPushKeysPath(t){return n.join(dataRoots(t).local,"push.json")}export function getHarnessConfigDir(t){return n.join(dataRoots(t).local,"harness-config")}export function getCertsDir(t){return n.join(dataRoots(t).local,"certs")}export function getAutoStartScriptPath(t){return n.join(dataRoots(t).local,"weave-autostart.vbs")}export function getDaemonStatePath(t){return n.join(dataRoots(t).cache,"daemon.json")}export function getLogsDir(t){return n.join(dataRoots(t).cache,"logs")}export function getApiLogsDir(t){return n.join(getLogsDir(t),"api")}export function getHooksDir(t){return n.join(dataRoots(t).cache,"hooks")}export function getStatuslineDir(t){return n.join(dataRoots(t).cache,"statusline")}export function getTmpDir(t){return n.join(dataRoots(t).cache,"tmp")}export function getIndexDir(t){return n.join(dataRoots(t).cache,"index")}
@@ -1 +1 @@
1
- const l=" ";export function composeAnswerAtoms(i,p){if(i.every(o=>o.options.length===0))return{ok:!1,error:"Question face has no answerable options"};const u=new Map(p.map(o=>[o.questionKey,o]));for(const o of u.keys())if(!i.some(s=>s.key===o))return{ok:!1,error:`Unknown question: ${o}`};const n=[];for(const o of i){const s=u.get(o.key),t=(s?.options??[]).map(e=>o.options[e]);if(t.some(e=>!e))return{ok:!1,error:`Invalid option index: ${o.key}`};if(o.submit&&t.length!==1)return{ok:!1,error:"Submit choice required to finish the call"};const c=t.filter(e=>!e.input);if(!o.multiSelect&&c.length>1)return{ok:!1,error:`Single-select question got ${c.length} options: ${o.key}`};const f=s?.text?.trim()??"",r=t.find(e=>e.input);if(r&&!f)return{ok:!1,error:`Text required for this option: ${o.key}`};for(const e of t)n.push(...e.keys);if(r)n.push(...r.textFocus??[],f,...r.textTail??["\r"]);else for(const e of t)n.push(...e.commit??[]);if(o.submit||t.some(e=>e.chat))break;!r&&(o.multiSelect||t.length===0)&&n.push(" ")}return{ok:!0,atoms:n}}
1
+ const p=" ";export function composeAnswerAtoms(i,l){if(i.every(e=>e.options.length===0))return{ok:!1,error:"Question face has no answerable options"};const f=new Map(l.map(e=>[e.questionKey,e]));for(const e of f.keys())if(!i.some(s=>s.key===e))return{ok:!1,error:`Unknown question: ${e}`};const n=[];for(const e of i){const s=f.get(e.key),t=(s?.options??[]).map(o=>e.options[o]);if(t.some(o=>!o))return{ok:!1,error:`Invalid option index: ${e.key}`};if(e.submit&&t.length!==1)return{ok:!1,error:"Submit choice required to finish the call"};const c=t.filter(o=>!o.input);if(!e.multiSelect&&c.length>1)return{ok:!1,error:`Single-select question got ${c.length} options: ${e.key}`};const u=s?.text?.trim()??"",r=t.find(o=>o.input);if(r&&!u)return{ok:!1,error:`Text required for this option: ${e.key}`};for(const o of t)n.push(...o.keys);if(r)n.push(...r.textFocus??[],u,...r.textTail??["\r"]);else for(const o of t)n.push(...o.commit??[]);if(e.submit||t.some(o=>o.chat))break;!r&&(e.multiSelect||t.length===0)&&n.push(" ")}return{ok:!0,atoms:n}}
@@ -1 +1 @@
1
- import{EventEmitter as t}from"node:events";export class HookEventBus{emitter=new t;constructor(){this.emitter.setMaxListeners(100)}emit(e){this.emitter.emit("change",e)}subscribe(e){return this.emitter.on("change",e),()=>this.emitter.off("change",e)}}
1
+ import{EventEmitter as e}from"node:events";export class HookEventBus{emitter=new e;constructor(){this.emitter.setMaxListeners(100)}emit(t){this.emitter.emit("change",t)}subscribe(t){return this.emitter.on("change",t),()=>this.emitter.off("change",t)}}
@@ -1 +1 @@
1
- export const RATE_BUCKET_MS=1e4,RATE_RETAIN_MS=864e5;const h=6e4;export class DashboardRateCache{buckets=new Map;seeded=!1;lastPrune=0;events=0;today=0;dayKey="";get isSeeded(){return this.seeded}record(e=Date.now()){const t=Math.floor(e/1e4)*1e4;this.buckets.set(t,(this.buckets.get(t)??0)+1),this.events+=1;const s=new Date(e).toDateString();s!==this.dayKey&&(this.dayKey=s,this.today!==0&&(this.today=0)),this.today+=1,this.prune(e)}get totals(){return{events:this.events,today:this.today}}seedTotals(e,t){this.events=Math.max(this.events,e),this.today=Math.max(this.today,t),this.dayKey=new Date().toDateString()}recentBuckets(e,t=Date.now()){const s=Math.floor(t/1e4)*1e4-(e-1)*1e4;return Array.from({length:e},(o,n)=>{const a=s+n*1e4;return{at:new Date(a).toISOString().slice(0,19),n:this.buckets.get(a)??0}})}seed(e){const t=new Map;for(const{at:s,n:o}of e){const n=Date.parse(`${s}Z`);if(!Number.isFinite(n))continue;const a=Math.floor(n/1e4)*1e4;t.set(a,(t.get(a)??0)+o)}for(const[s,o]of t)this.buckets.set(s,Math.max(this.buckets.get(s)??0,o));this.seeded=!0}bucketsFor(e,t){return Array.from({length:t},(s,o)=>this.buckets.get(e+o*1e4)??0)}prune(e){if(e-this.lastPrune<6e4)return;this.lastPrune=e;const t=e-864e5;for(const s of this.buckets.keys())s<t&&this.buckets.delete(s)}}
1
+ export const RATE_BUCKET_MS=1e4,RATE_RETAIN_MS=864e5;const h=6e4;export class DashboardRateCache{buckets=new Map;seeded=!1;lastPrune=0;events=0;today=0;dayKey="";get isSeeded(){return this.seeded}record(t=Date.now()){const e=Math.floor(t/1e4)*1e4;this.buckets.set(e,(this.buckets.get(e)??0)+1),this.events+=1;const s=new Date(t).toDateString();s!==this.dayKey&&(this.dayKey=s,this.today!==0&&(this.today=0)),this.today+=1,this.prune(t)}get totals(){return{events:this.events,today:this.today}}seedTotals(t,e){this.events=Math.max(this.events,t),this.today=Math.max(this.today,e),this.dayKey=new Date().toDateString()}recentBuckets(t,e=Date.now()){const a=Math.floor(e/1e4)*1e4-(t-1)*1e4;return Array.from({length:t},(o,n)=>{const r=a+n*1e4;return{at:new Date(r).toISOString().slice(0,19),n:this.buckets.get(r)??0}})}seed(t){const e=new Map;for(const{at:s,n:a}of t){const o=Date.parse(`${s}Z`);if(!Number.isFinite(o))continue;const n=Math.floor(o/1e4)*1e4;e.set(n,(e.get(n)??0)+a)}for(const[s,a]of e)this.buckets.set(s,Math.max(this.buckets.get(s)??0,a));this.seeded=!0}bucketsFor(t,e){return Array.from({length:e},(s,a)=>this.buckets.get(t+a*1e4)??0)}prune(t){if(t-this.lastPrune<6e4)return;this.lastPrune=t;const e=t-864e5;for(const s of this.buckets.keys())s<e&&this.buckets.delete(s)}}
@@ -1 +1 @@
1
- const p=.7,y=.3,k=1e4;export function createDecisionConditionJudge(s){const r=(t,e)=>({...t,source:"decision-model",...e!==null?{detail:`P(yes)=${e}`}:{}}),c=t=>t>=.7?r({ok:!0},t):t<=.3?r({ok:!1,reason:"condition answered no"},t):{ok:!1};return{async judge(t){const e=t.upstream;if(!e)return{...await s.fallback.judge(t),source:"fork"};const i=await s.config();if(!i)return{...await s.fallback.judge(t),source:"fork"};let o=null;try{o=await m(i,t.condition,e,s)}catch{o=null}if(o===null)return{...await s.fallback.judge(t),source:"fork"};const n=c(o);return!n.ok&&n.source!=="decision-model"?{...await s.fallback.judge(t),source:"fork"}:n},async judgeBatch(t){if(!t.upstream)return Promise.all(t.items.map(async n=>({...await s.fallback.judge({sessionId:t.sessionId,condition:n.condition,upstream:null}),source:"fork"})));const e=await s.config();if(!e)return Promise.all(t.items.map(async n=>({...await s.fallback.judge({sessionId:t.sessionId,condition:n.condition,upstream:t.upstream}),source:"fork"})));const i={};for(const n of t.items)i[n.key]={type:"noul",instructions:n.condition};let o=null;try{o=await l(e,i,t.upstream,s)}catch{o=null}return o?Promise.all(t.items.map(async n=>{const a=o[n.key];return typeof a!="number"||!Number.isFinite(a)?{...await s.fallback.judge({sessionId:t.sessionId,condition:n.condition,upstream:t.upstream}),source:"fork"}:c(a)})):Promise.all(t.items.map(async n=>({...await this.judge({sessionId:t.sessionId,condition:n.condition,upstream:t.upstream})})))}}}async function m(s,r,c,t){return(await l(s,{proceed:{type:"noul",instructions:r}},c,t))?.proceed??null}async function l(s,r,c,t){const e=new AbortController,i=setTimeout(()=>e.abort(),t.timeoutMs??1e4);try{const o=await(t.fetchImpl??fetch)(`${s.baseUrl.replace(/\/+$/,"")}/v1/systemone`,{method:"POST",headers:{authorization:`Bearer ${s.apiKey}`,"content-type":"application/json"},body:JSON.stringify({model:s.model,state:c,questions:r}),signal:e.signal});if(!o.ok)return null;const n=(await o.json()).answers;if(!n||typeof n!="object")return null;const a={};for(const[d,f]of Object.entries(n)){const u=f?.noul;typeof u=="number"&&Number.isFinite(u)&&(a[d]=u)}return Object.keys(a).length>0?a:null}finally{clearTimeout(i)}}
1
+ const k=.7,w=.3,b=1e4;export function createDecisionConditionJudge(o){const i=(e,n)=>({...e,source:"decision-model",...n!==null?{detail:`P(yes)=${n}`}:{}}),c=e=>e>=.7?i({ok:!0},e):e<=.3?i({ok:!1,reason:"condition answered no"},e):{ok:!1};return{async judge(e){const n=e.upstream;if(!n)return{...await o.fallback.judge(e),source:"fork"};const r=await o.config();if(!r)return{...await o.fallback.judge(e),source:"fork"};let s=null;try{s=await y(r,e.condition,n,o)}catch{s=null}if(s===null)return{...await o.fallback.judge(e),source:"fork"};const t=c(s);return!t.ok&&t.source!=="decision-model"?{...await o.fallback.judge(e),source:"fork"}:t},async judgeBatch(e){if(!e.upstream)return Promise.all(e.items.map(async t=>({...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:null}),source:"fork"})));const n=await o.config();if(!n)return Promise.all(e.items.map(async t=>({...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream}),source:"fork"})));const r={};for(const t of e.items)r[t.key]={type:"noul",instructions:t.condition};let s=null;try{s=await f(n,r,e.upstream,o)}catch{s=null}return s?Promise.all(e.items.map(async t=>{const a=s[t.key];return typeof a!="number"||!Number.isFinite(a)?{...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream}),source:"fork"}:c(a)})):Promise.all(e.items.map(async t=>({...await this.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream})})))}}}async function y(o,i,c,e){return(await f(o,{proceed:{type:"noul",instructions:i}},c,e))?.proceed??null}async function f(o,i,c,e){const n=new AbortController,r=setTimeout(()=>n.abort(),e.timeoutMs??1e4);try{const s=await(e.fetchImpl??fetch)(`${o.baseUrl.replace(/\/+$/,"")}/v1/systemone`,{method:"POST",headers:{authorization:`Bearer ${o.apiKey}`,"content-type":"application/json"},body:JSON.stringify({model:o.model,state:c,questions:i}),signal:n.signal});if(!s.ok)return null;const a=(await s.json()).answers;if(!a||typeof a!="object")return null;const l={};for(const[m,d]of Object.entries(a)){const u=d?.noul;typeof u=="number"&&Number.isFinite(u)&&(l[m]=u)}return Object.keys(l).length>0?l:null}finally{clearTimeout(r)}}
@@ -1 +1 @@
1
- import{isImageMediaType as k}from"../../repositories/uploads.js";const p=a=>new Promise(e=>setTimeout(e,a));export class AckGate{store;times;events;isCommandInput;constructor(e,t,s,o=()=>!1){this.store=e,this.times=t,this.events=s,this.isCommandInput=o}open(e){const t=this.store.awaitingAck.get(e);if(t===void 0)return!0;const s=this.store.memory.get(t);return s&&s.acked!==!0&&s.status!=="failed"&&s.status!=="timeout"?!1:(this.store.awaitingAck.delete(e),!0)}awaiting(e){return!this.open(e)}headOf(e){return this.store.awaitingAck.get(e)}await(e,t){this.store.awaitingAck.set(e,t)}release(e,t){if(t===void 0){this.store.awaitingAck.delete(e);return}this.store.awaitingAck.get(e)===t&&this.store.awaitingAck.delete(e)}isStalled(e){return this.store.stalled.has(e)}stallCause(e){return this.store.stalled.get(e)}clearStall(e,t){const s=this.store.stalled.get(e);s&&(t===void 0||s.messageId===t)&&this.store.stalled.delete(e)}armAckWatch(e){setTimeout(()=>{const t=this.store.memory.get(e.id);!t||t.acked||t.status!=="delivered"||this.stall(e.sessionId,t,"unacked")},this.times.ackStallMs).unref?.()}armCommandAck(e,t){setTimeout(()=>{const s=this.store.memory.get(e);!s||s.acked||s.status!=="delivered"||(this.acknowledge_(s.sessionId,e),t(s.sessionId))},this.times.commandAckGraceMs).unref?.()}noteActivity(e){let t=!1;for(const s of this.store.memory.values())s.sessionId!==e||s.acked||s.status!=="delivered"||s.mode!=="prompt"||!this.isCommandInput(e,s.text)||(this.acknowledge_(e,s.id),t=!0);return t}acknowledge_(e,t){const s=this.store.memory.get(t);!s||s.acked||(this.store.memory.set(t,{...s,acked:!0}),this.release(e,t),this.events.emit({kind:"message.acknowledged",messageId:t,sessionId:e,at:new Date().toISOString()}))}stall(e,t,s){this.store.stalled.set(e,{messageId:t.id,reason:s});const o=this.store.memory.get(t.id),n=o&&o.status==="delivered"&&o.acked!==!0?new Date(Date.now()+this.times.ackStallReleaseMs).toISOString():null;o&&this.store.memory.set(t.id,{...o,stalled:!0,releaseAt:n}),this.events.emit({kind:"message.stalled",messageId:t.id,sessionId:e,reason:s,at:new Date().toISOString()}),setTimeout(()=>this.autoRelease(e,t.id),this.times.ackStallReleaseMs).unref?.()}autoRelease(e,t){if(this.store.stalled.get(e)?.messageId!==t)return;const s=this.store.memory.get(t);if(s&&s.status==="delivered"&&s.acked!==!0){this.dropAndRelease(e,t);return}this.store.stalled.delete(e),this.release(e,t),this.onAutoRelease?.(e)}dropAndRelease(e,t){this.store.memory.delete(t),this.store.stalled.delete(e),this.release(e,t),this.events.emit({kind:"message.dismissed",messageId:t,sessionId:e,at:new Date().toISOString()}),this.onAutoRelease?.(e)}onAutoRelease;hitLast=!1;acknowledge(e,t,s,o){const n=normalizePromptText(t),l=n.replace(/\[Image #\d+\]/gi,"").trim(),m=[];let d=!1;this.hitLast=!1;for(const i of[...this.store.memory.values()].reverse()){if(i.sessionId!==e||i.acked||i.mode!=="prompt")continue;const r=normalizePromptText(i.text),c=dropInlineImagePaths(r,i.attachments),h=!!r&&(r.length>=o.ackMinText?n.includes(r)||stripSpace(n).includes(stripSpace(r)):n.endsWith(r)),g=(i.attachments?.length??0)>0&&(c?stripSpace(l).includes(stripSpace(c))||stripSpace(n).includes(stripSpace(r)):l.length===0);!h&&!g||(d=!0,this.store.memory.set(i.id,{...i,acked:!0,stalled:!1,...s===void 0?{}:{ackedEventId:s}}),this.store.stalled.get(e)?.messageId===i.id&&this.store.stalled.delete(e),this.release(e,i.id),m.push(...i.attachments?.map(u=>u.id)??[]),this.events.emit({kind:"message.acknowledged",messageId:i.id,sessionId:e,...s===void 0?{}:{eventId:s},at:new Date().toISOString()}))}return this.hitLast=d,d?m:[]}sessionExited(e){this.release(e)}static sleep=p}export function normalizePromptText(a){return a.replace(/<\/?cross-session-message[^>]*>/g,"").replace(/\s+/g," ").trim()}export function stripSpace(a){return a.replace(/\s+/g,"")}export function dropInlineImagePaths(a,e){const t=(e??[]).filter(s=>s.path&&k(s.mediaType)).map(s=>s.path.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.length===0?a:a.replace(new RegExp(t.join("|"),"g"),"")}
1
+ import{isImageMediaType as f}from"../../repositories/uploads.js";const p=a=>new Promise(e=>setTimeout(e,a));export class AckGate{store;times;events;isCommandInput;constructor(e,t,s,i=()=>!1){this.store=e,this.times=t,this.events=s,this.isCommandInput=i}open(e){const t=this.store.awaitingAck.get(e);if(t===void 0)return!0;const s=this.store.memory.get(t);return s&&s.acked!==!0&&s.status!=="failed"&&s.status!=="timeout"?!1:(this.store.awaitingAck.delete(e),!0)}awaiting(e){return!this.open(e)}headOf(e){return this.store.awaitingAck.get(e)}await(e,t){this.store.awaitingAck.set(e,t)}release(e,t){if(t===void 0){this.store.awaitingAck.delete(e);return}this.store.awaitingAck.get(e)===t&&this.store.awaitingAck.delete(e)}isStalled(e){return this.store.stalled.has(e)}stallCause(e){return this.store.stalled.get(e)}clearStall(e,t){const s=this.store.stalled.get(e);s&&(t===void 0||s.messageId===t)&&this.store.stalled.delete(e)}armAckWatch(e){setTimeout(()=>{const s=this.store.memory.get(e.id);!s||s.acked||s.status!=="delivered"||this.stall(e.sessionId,s,"unacked")},this.times.ackStallMs).unref?.()}armCommandAck(e,t){setTimeout(()=>{const i=this.store.memory.get(e);!i||i.acked||i.status!=="delivered"||(this.acknowledge_(i.sessionId,e),t(i.sessionId))},this.times.commandAckGraceMs).unref?.()}noteActivity(e){let t=!1;for(const s of this.store.memory.values())s.sessionId!==e||s.acked||s.status!=="delivered"||s.mode!=="prompt"||!this.isCommandInput(e,s.text)||(this.acknowledge_(e,s.id),t=!0);return t}acknowledge_(e,t){const s=this.store.memory.get(t);!s||s.acked||(this.store.memory.set(t,{...s,acked:!0}),this.release(e,t),this.events.emit({kind:"message.acknowledged",messageId:t,sessionId:e,at:new Date().toISOString()}))}stall(e,t,s){this.store.stalled.set(e,{messageId:t.id,reason:s});const i=this.store.memory.get(t.id),n=i&&i.status==="delivered"&&i.acked!==!0?new Date(Date.now()+this.times.ackStallReleaseMs).toISOString():null;i&&this.store.memory.set(t.id,{...i,stalled:!0,releaseAt:n}),this.events.emit({kind:"message.stalled",messageId:t.id,sessionId:e,reason:s,at:new Date().toISOString()}),setTimeout(()=>this.autoRelease(e,t.id),this.times.ackStallReleaseMs).unref?.()}autoRelease(e,t){if(this.store.stalled.get(e)?.messageId!==t)return;const s=this.store.memory.get(t);if(s&&s.status==="delivered"&&s.acked!==!0){this.dropAndRelease(e,t);return}this.store.stalled.delete(e),this.release(e,t),this.onAutoRelease?.(e)}dropAndRelease(e,t){this.store.memory.delete(t),this.store.stalled.delete(e),this.release(e,t),this.events.emit({kind:"message.dismissed",messageId:t,sessionId:e,at:new Date().toISOString()}),this.onAutoRelease?.(e)}onAutoRelease;hitLast=!1;acknowledge(e,t,s,i){const n=normalizePromptText(t),l=n.replace(/\[Image #\d+\]/gi,"").trim(),d=[];let c=!1;this.hitLast=!1;for(const r of[...this.store.memory.values()].reverse()){if(r.sessionId!==e||r.acked||r.mode!=="prompt")continue;const o=normalizePromptText(r.text),u=dropInlineImagePaths(o,r.attachments),h=!!o&&(o.length>=i.ackMinText?n.includes(o)||stripSpace(n).includes(stripSpace(o)):n.endsWith(o)),m=(r.attachments?.length??0)>0&&(u?stripSpace(l).includes(stripSpace(u))||stripSpace(n).includes(stripSpace(o)):l.length===0);!h&&!m||(c=!0,this.store.memory.set(r.id,{...r,acked:!0,stalled:!1,...s===void 0?{}:{ackedEventId:s}}),this.store.stalled.get(e)?.messageId===r.id&&this.store.stalled.delete(e),this.release(e,r.id),d.push(...r.attachments?.map(g=>g.id)??[]),this.events.emit({kind:"message.acknowledged",messageId:r.id,sessionId:e,...s===void 0?{}:{eventId:s},at:new Date().toISOString()}))}return this.hitLast=c,c?d:[]}sessionExited(e){this.release(e)}static sleep=p}export function normalizePromptText(a){return a.replace(/<\/?cross-session-message[^>]*>/g,"").replace(/\s+/g," ").trim()}export function stripSpace(a){return a.replace(/\s+/g,"")}export function dropInlineImagePaths(a,e){const t=(e??[]).filter(s=>s.path&&f(s.mediaType)).map(s=>s.path.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.length===0?a:a.replace(new RegExp(t.join("|"),"g"),"")}
@@ -1 +1 @@
1
- import{spawn as p}from"node:child_process";import{defaultKill as f}from"../headless-runner.js";import{tmpdir as l}from"node:os";import{isImageMediaType as w}from"../../repositories/uploads.js";export function wireTextOf(e,t){const o=e.attachments;return!o||o.length===0?e.text:t(e.sessionId)?.attach?.composePrompt(e.text,o)??e.text}export function hasImages(e){return(e.attachments??[]).some(t=>w(t.mediaType))}export function spawnOnce(e,t,o,i){const u=i??((a,n,r)=>p(a,[...n],r));return new Promise((a,n)=>{const r=u(e,t,{cwd:l(),windowsHide:!0,stdio:["ignore","pipe","pipe"]}),d=[];r.stdout?.on("data",s=>d.push(s)),r.stderr?.on("data",s=>d.push(s));const m=setTimeout(()=>{if(r.pid!==void 0)try{f(r.pid)}catch{}n(new Error(`queue timeout after ${o}ms`))},o);r.on("error",s=>{clearTimeout(m),n(s)}),r.on("exit",s=>{if(clearTimeout(m),s===0){a();return}const c=Buffer.concat(d).toString("utf8").slice(-500);n(new Error(`queue exit ${s}${c?`: ${c}`:""}`))})})}export function settleDelivered(e,t,o){const i={...t,status:"delivered",via:o,settledAt:new Date().toISOString()};return e.setMemory(i),e.awaitAck(t.sessionId,t.id),e.commandModeOf(t.text,t.sessionId)?e.armCommandAck(t.id):e.armAckWatch(i),e.emit({kind:"message.delivered",messageId:t.id,sessionId:t.sessionId,at:new Date().toISOString()}),i}
1
+ import{spawn as f}from"node:child_process";import{defaultKill as p}from"../headless-runner.js";import{tmpdir as l}from"node:os";import{isImageMediaType as w}from"../../repositories/uploads.js";export function wireTextOf(t,e){const i=t.attachments;return!i||i.length===0?t.text:e(t.sessionId)?.attach?.composePrompt(t.text,i)??t.text}export function hasImages(t){return(t.attachments??[]).some(e=>w(e.mediaType))}export function spawnOnce(t,e,i,r){const u=r??((a,n,o)=>f(a,[...n],o));return new Promise((a,n)=>{const o=u(t,e,{cwd:l(),windowsHide:!0,stdio:["ignore","pipe","pipe"]}),d=[];o.stdout?.on("data",s=>d.push(s)),o.stderr?.on("data",s=>d.push(s));const m=setTimeout(()=>{if(o.pid!==void 0)try{p(o.pid)}catch{}n(new Error(`queue timeout after ${i}ms`))},i);o.on("error",s=>{clearTimeout(m),n(s)}),o.on("exit",s=>{if(clearTimeout(m),s===0){a();return}const c=Buffer.concat(d).toString("utf8").slice(-500);n(new Error(`queue exit ${s}${c?`: ${c}`:""}`))})})}export function settleDelivered(t,e,i){const r={...e,status:"delivered",via:i,settledAt:new Date().toISOString()};return t.setMemory(r),t.awaitAck(e.sessionId,e.id),t.commandModeOf(e.text,e.sessionId)?t.armCommandAck(e.id):t.armAckWatch(r),t.emit({kind:"message.delivered",messageId:e.id,sessionId:e.sessionId,at:new Date().toISOString()}),r}
@@ -1 +1 @@
1
- import{HARNESS_SESSION_CONTROL as f,isHarness as c}from"@weavecode/core";import{normalizeDirKey as E}from"../../daemon/opener.js";export const ESC="\x1B",ESC_KITTY="\x1B[27u",CTRL_C_KITTY="\x1B[99;5u",SHIFT_TAB="\x1B[Z",ENTER="\r",CTRL_B="",MODEL_NAME=/^[^\s\x00-\x1f\x7f]{1,128}$/,modelCommand=u=>`/model ${u}`,effortCommand=u=>`/effort ${u}`,ANSWER_ATOM=/^(?:[1-9]|y|n|d|\t|\r|\x1b\[B|\x1b\[Z)$/,ANSWER_TEXT=/^[^\x00-\x1f\x7f]*$/,ANSWER_ATOM_GAP_MS=120,sleep=u=>new Promise(n=>setTimeout(n,u));export async function sessionKeysTarget(u,n,t="\u51FB\u952E"){const e=u.sessions.getBySessionId(n);if(!e)return{ok:!1,status:404,error:"Session not found"};if(e.projectId==null)return{ok:!1,status:400,error:"Session is not bound to a project"};const r=u.projects.getById(e.projectId);if(!r)return{ok:!1,status:404,error:"Project not found"};const i=u.terminalChannel();if(!i)return{ok:!1,status:409,error:`\u7EC8\u7AEF\u901A\u9053\u672A\u88C5\u914D\uFF0C\u65E0\u6CD5\u8FDC\u7A0B${t}`};const s=u.paneEnvConflictOf?.(n)??null;if(s)return{ok:!1,status:409,error:`\u8FD9\u4E2A\u4F1A\u8BDD\u7684\u7EC8\u7AEF\u5B9A\u4F4D\u88AB\u53E6\u4E00\u4E2A\u4F1A\u8BDD\uFF08${s.slice(0,8)}\uFF09\u5360\u7740\uFF08fork \u7EE7\u627F\u4E86\u540C\u4E00\u4E2A pane\uFF09\uFF0C\u4E3A\u907F\u514D\u628A${t}\u6253\u8FDB\u522B\u4EBA\u7684\u7EC8\u7AEF\u5DF2\u62D2\u7EDD`};const l=await u.terminalPaneFor(e,r);return l?{ok:!0,terminal:i,paneId:l.id}:{ok:!1,status:409,error:`\u627E\u4E0D\u5230\u4F1A\u8BDD\u6240\u5728\u7684\u7EC8\u7AEF\u7A97\u53E3\u2014\u2014\u8FD9\u4E2A\u4F1A\u8BDD\u6240\u5728\u7EC8\u7AEF\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7A0B${t}\u901A\u9053`}}export function effortLevelsOf(u,n){const t=u.listBySession(n,1),e=t[t.length-1]?.source;return c(e)?f[e]?.effortLevels??[]:[]}export function sideQuestionSurfaceOf(u,n,t){const e=u.listBySession(n,1),r=e[e.length-1]?.source;return c(r)?t?.(r)??null:null}export async function locateTerminalPane(u,n,t,e){if(!u)return null;const r=n.get(t.sessionId);if(r){const o=await u.locatePane?.(r).catch(()=>null);if(o)return{id:o}}if(!t.title)return null;const i=t.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,""),s=E(e.path,process.platform);let l;try{l=await u.listPanes()}catch{return null}const a=l.filter(o=>o.title!=null&&o.cwd!=null&&s!=null&&o.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,"")===i&&E(o.cwd,process.platform)===s);return a.length===1?a[0]:null}
1
+ import{HARNESS_SESSION_CONTROL as p,isHarness as u}from"@weavecode/core";import{normalizeDirKey as f}from"../../daemon/opener.js";export const ESC="\x1B",ESC_KITTY="\x1B[27u",CTRL_C_KITTY="\x1B[99;5u",SHIFT_TAB="\x1B[Z",ENTER="\r",CTRL_B="",MODEL_NAME=/^[^\s\x00-\x1f\x7f]{1,128}$/,modelCommand=t=>`/model ${t}`,effortCommand=t=>`/effort ${t}`,ANSWER_ATOM=/^(?:[1-9]|y|n|d|\t|\r|\x1b\[B|\x1b\[Z)$/,ANSWER_TEXT=/^[^\x00-\x1f\x7f]*$/,ANSWER_ATOM_GAP_MS=120,sleep=t=>new Promise(r=>setTimeout(r,t));export async function sessionKeysTarget(t,r,e="\u51FB\u952E"){const o=t.sessions.getBySessionId(r);if(!o)return{ok:!1,status:404,error:"Session not found"};if(o.projectId==null)return{ok:!1,status:400,error:"Session is not bound to a project"};const n=t.projects.getById(o.projectId);if(!n)return{ok:!1,status:404,error:"Project not found"};const a=t.terminalChannel();if(!a)return{ok:!1,status:409,error:`\u7EC8\u7AEF\u901A\u9053\u672A\u88C5\u914D\uFF0C\u65E0\u6CD5\u8FDC\u7A0B${e}`};const l=t.paneEnvConflictOf?.(r)??null;if(l)return{ok:!1,status:409,error:`\u8FD9\u4E2A\u4F1A\u8BDD\u7684\u7EC8\u7AEF\u5B9A\u4F4D\u88AB\u53E6\u4E00\u4E2A\u4F1A\u8BDD\uFF08${l.slice(0,8)}\uFF09\u5360\u7740\uFF08fork \u7EE7\u627F\u4E86\u540C\u4E00\u4E2A pane\uFF09\uFF0C\u4E3A\u907F\u514D\u628A${e}\u6253\u8FDB\u522B\u4EBA\u7684\u7EC8\u7AEF\u5DF2\u62D2\u7EDD`};const c=await t.terminalPaneFor(o,n);return c?{ok:!0,terminal:a,paneId:c.id}:{ok:!1,status:409,error:`\u627E\u4E0D\u5230\u4F1A\u8BDD\u6240\u5728\u7684\u7EC8\u7AEF\u7A97\u53E3\u2014\u2014\u8FD9\u4E2A\u4F1A\u8BDD\u6240\u5728\u7EC8\u7AEF\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7A0B${e}\u901A\u9053`}}export function effortLevelsOf(t,r){const e=t.listBySession(r,1),o=e[e.length-1]?.source;return u(o)?p[o]?.effortLevels??[]:[]}export function sideQuestionSurfaceOf(t,r,e){const o=t.listBySession(r,1),n=o[o.length-1]?.source;return u(n)?e?.(n)??null:null}export async function locateTerminalPane(t,r,e,o){if(!t)return null;const n=r.get(e.sessionId);if(n){const s=await t.locatePane?.(n).catch(()=>null);if(s)return{id:s}}if(!e.title)return null;const a=e.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,""),l=f(o.path,process.platform);let c;try{c=await t.listPanes()}catch{return null}const i=c.filter(s=>s.title!=null&&s.cwd!=null&&l!=null&&s.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,"")===a&&f(s.cwd,process.platform)===l);return i.length===1?i[0]:null}
@@ -1 +1 @@
1
- import{pidAliveOf as f}from"../../daemon/claude-liveness.js";import{combinedLivenessOf as m}from"../../daemon/liveness.js";import{appendPromptbox as c,removePromptboxEntries as p}from"../promptbox.js";export const OFFLINE_ERROR="Session is not running";export function appendQueueEntry(n,s,e){c(n,s,[{id:e.id,sessionId:e.sessionId,text:e.text,oneWay:e.oneWay===!0,...e.forceTerminal===!0?{forceTerminal:!0}:{},...e.attachments&&e.attachments.length>0?{attachments:e.attachments}:{}}])}export function sessionJudgedDead(n,s,e=m()){const o=n.livenessRowOf(s);return o?f(o,e)===!1:!1}export function failOffline(n,s,e){const o=new Date().toISOString(),i={...e,status:"failed",reason:"offline",error:OFFLINE_ERROR,settledAt:o};return n.set(e.id,i),s({kind:"message.finished",messageId:e.id,sessionId:e.sessionId,status:"failed",at:o}),i}export function failQueuedOffline(n,s,e,o,i,a){const r=n.sessions.getBySessionId(i),d=r?.projectId==null?null:n.projects.getById(r.projectId);if(!(!d||a.length===0)){for(const t of a)failOffline(e,o,{id:t.id,sessionId:i,text:t.text,...t.attachments&&t.attachments.length>0?{attachments:t.attachments}:{},mode:"prompt",oneWay:t.oneWay===!0,channel:"prompt",status:"pending",at:t.at});p(s,d.token,new Set(a.map(t=>t.id)))}}
1
+ import{pidAliveOf as f}from"../../daemon/claude-liveness.js";import{combinedLivenessOf as c}from"../../daemon/liveness.js";import{appendPromptbox as m,removePromptboxEntries as p}from"../promptbox.js";export const OFFLINE_ERROR="Session is not running";export function appendQueueEntry(n,o,t){m(n,o,[{id:t.id,sessionId:t.sessionId,text:t.text,oneWay:t.oneWay===!0,...t.forceTerminal===!0?{forceTerminal:!0}:{},...t.attachments&&t.attachments.length>0?{attachments:t.attachments}:{}}])}export function sessionJudgedDead(n,o,t=c()){const s=n.livenessRowOf(o);return s?f(s,t)===!1:!1}export function failOffline(n,o,t){const s=new Date().toISOString(),i={...t,status:"failed",reason:"offline",error:OFFLINE_ERROR,settledAt:s};return n.set(t.id,i),o({kind:"message.finished",messageId:t.id,sessionId:t.sessionId,status:"failed",at:s}),i}export function failQueuedOffline(n,o,t,s,i,a){const r=n.sessions.getBySessionId(i),d=r?.projectId==null?null:n.projects.getById(r.projectId);if(!(!d||a.length===0)){for(const e of a)failOffline(t,s,{id:e.id,sessionId:i,text:e.text,...e.attachments&&e.attachments.length>0?{attachments:e.attachments}:{},mode:"prompt",oneWay:e.oneWay===!0,channel:"prompt",status:"pending",at:e.at});p(o,d.token,new Set(a.map(e=>e.id)))}}
@@ -1 +1 @@
1
- import{tmpdir as r}from"node:os";export function runRelay(e,i,n,s,o){try{return e.headless.run({sessionId:`prompt-relay:${i.sessionId}`,cwd:r(),prompt:n.instruction(s,o,{oneWay:i.oneWay===!0}),spec:{supported:!0,bin:n.bin,args:()=>[...n.args],promptStdin:!0},bin:e.bin??process.env.WEAVE_CLAUDE_BIN??n.bin,timeoutMs:e.relayTimeoutMs??0,detached:!1,onSettle:t=>settleRelay(e,i.id,t)})}catch(t){return settleRelay(e,i.id,{status:"failed",output:null,error:t instanceof Error?t.message:String(t)}),!0}}export function settleRelay(e,i,n){const s=e.getMemory(i);if(!s)return;if(n.status==="succeeded"){e.onReleased(s.sessionId);const t={...s,status:"delivered",settledAt:new Date().toISOString()};e.setMemory(t),e.commandModeOf(s.text,s.sessionId)?e.armCommandAck(i,e.onReleased):e.armAckWatch(t),e.emit({kind:"message.delivered",messageId:i,sessionId:s.sessionId,at:new Date().toISOString()});return}if(s.acked===!0){const t=new Date().toISOString();e.setMemory({...s,status:"delivered",settledAt:t}),e.emit({kind:"message.delivered",messageId:i,sessionId:s.sessionId,at:t});return}const o={...s,status:"failed",error:n.error??`prompt relay ${n.status}`,settledAt:new Date().toISOString()};e.setMemory(o),e.stall(s.sessionId,o,"failed"),e.emit({kind:"message.finished",messageId:i,sessionId:s.sessionId,status:"failed",at:new Date().toISOString()})}export{r as tmpdir};
1
+ import{tmpdir as o}from"node:os";export function runRelay(t,r,n,e,i){try{return t.headless.run({sessionId:`prompt-relay:${r.sessionId}`,cwd:o(),prompt:n.instruction(e,i,{oneWay:r.oneWay===!0}),spec:{supported:!0,bin:n.bin,args:()=>[...n.args],promptStdin:!0},bin:t.bin??process.env.WEAVE_CLAUDE_BIN??n.bin,timeoutMs:t.relayTimeoutMs??0,detached:!1,onSettle:s=>settleRelay(t,r.id,s)})}catch(s){return settleRelay(t,r.id,{status:"failed",output:null,error:s instanceof Error?s.message:String(s)}),!0}}export function settleRelay(t,r,n){const e=t.getMemory(r);if(!e)return;if(n.status==="succeeded"){t.onReleased(e.sessionId);const s={...e,status:"delivered",settledAt:new Date().toISOString()};t.setMemory(s),t.commandModeOf(e.text,e.sessionId)?t.armCommandAck(r,t.onReleased):t.armAckWatch(s),t.emit({kind:"message.delivered",messageId:r,sessionId:e.sessionId,at:new Date().toISOString()});return}if(e.acked===!0){const s=new Date().toISOString();t.setMemory({...e,status:"delivered",settledAt:s}),t.emit({kind:"message.delivered",messageId:r,sessionId:e.sessionId,at:s});return}const i={...e,status:"failed",error:n.error??`prompt relay ${n.status}`,settledAt:new Date().toISOString()};t.setMemory(i),t.stall(e.sessionId,i,"failed"),t.emit({kind:"message.finished",messageId:r,sessionId:e.sessionId,status:"failed",at:new Date().toISOString()})}export{o as tmpdir};
@@ -1,3 +1,3 @@
1
- import{appendOutbox as p}from"../mirror.js";export function resolveChannel(e,s,n,o,t){if(n==="prompt")return t.prompt||t.queuedPrompt||s()?"prompt":{reason:t.unsupportedReasons?.prompt??`Harness "${t.harness}" has no native prompt channel and the configured terminal cannot inject text`};if(n==="inject"||n==="headless")return(n==="inject"?t.inject:t.headless)?n:{reason:unsupportedReason(t,n)};const i=e.turnOpenOf(o)?"inject":"headless";return(i==="inject"?t.inject:t.headless)?i:{reason:unsupportedReason(t,i)}}export function unsupportedReason(e,s){return e.unsupportedReasons?.[s]??`Harness "${e.harness}" does not support the ${s} messaging channel`}export function renderEnvelope(e,s,n){return n.renderEnvelope?.(e,s)??`[weave message] from=${s.fromLabel} at=${s.at} mode=${s.mode}
1
+ import{appendOutbox as m}from"../mirror.js";export function resolveChannel(e,t,s,o,n){if(s==="prompt")return n.prompt||n.queuedPrompt||t()?"prompt":{reason:n.unsupportedReasons?.prompt??`Harness "${n.harness}" has no native prompt channel and the configured terminal cannot inject text`};if(s==="inject"||s==="headless")return(s==="inject"?n.inject:n.headless)?s:{reason:unsupportedReason(n,s)};const i=e.turnOpenOf(o)?"inject":"headless";return(i==="inject"?n.inject:n.headless)?i:{reason:unsupportedReason(n,i)}}export function unsupportedReason(e,t){return e.unsupportedReasons?.[t]??`Harness "${e.harness}" does not support the ${t} messaging channel`}export function renderEnvelope(e,t,s){return s.renderEnvelope?.(e,t)??`[weave message] from=${t.fromLabel} at=${t.at} mode=${t.mode}
2
2
 
3
- ${e}`}export function deliverInject(e,s,n,o,t,i){const d=renderEnvelope(i,o,t);p(e.hooksDir,n,[{sessionId:s.sessionId,text:d}]);const r={...s,status:"injected",settledAt:new Date().toISOString()};return e.memory.set(r.id,r),e.bus.emit({kind:"message.delivered",messageId:r.id,sessionId:s.sessionId,at:new Date().toISOString()}),{ok:!0,messageId:r.id,status:"injected",message:r}}export function deliverHeadless(e,s,n,o,t,i){const d=t.headless,r={...s,status:"running"};e.memory.set(r.id,r);const u={settled:!1};try{e.headless.run({sessionId:r.sessionId,cwd:n,prompt:renderEnvelope(i,o,t),spec:d,bin:e.bin??process.env.WEAVE_CLAUDE_BIN??d.bin,timeoutMs:e.timeoutMs,onSettle:a=>m(e,r,u,a)})||m(e,r,u,{status:"failed",output:null,error:"Session already has a running run"})}catch(a){m(e,r,u,{status:"failed",output:null,error:a instanceof Error?a.message:String(a)})}return{ok:!0,messageId:r.id,status:"running",message:e.memory.get(r.id)}}function m(e,s,n,o){if(n.settled)return;n.settled=!0;const t=e.memory.get(s.id);if(t)try{e.memory.set(s.id,{...t,status:o.status,output:o.output,error:o.error,settledAt:new Date().toISOString()}),e.bus.emit({kind:"message.finished",messageId:s.id,sessionId:s.sessionId,status:o.status,at:new Date().toISOString()})}catch{}}
3
+ ${e}`}export function deliverInject(e,t,s,o,n,a){const i=renderEnvelope(a,o,n);m(e.hooksDir,s,[{sessionId:t.sessionId,text:i}]);const r={...t,status:"injected",settledAt:new Date().toISOString()};return e.memory.set(r.id,r),e.bus.emit({kind:"message.delivered",messageId:r.id,sessionId:t.sessionId,at:new Date().toISOString()}),{ok:!0,messageId:r.id,status:"injected",message:r}}export function deliverHeadless(e,t,s,o,n,a){const i=n.headless,r={...t,status:"running"};e.memory.set(r.id,r);const u={settled:!1};try{e.headless.run({sessionId:r.sessionId,cwd:s,prompt:renderEnvelope(a,o,n),spec:i,bin:e.bin??process.env.WEAVE_CLAUDE_BIN??i.bin,timeoutMs:e.timeoutMs,onSettle:l=>p(e,r,u,l)})||p(e,r,u,{status:"failed",output:null,error:"Session already has a running run"})}catch(d){p(e,r,u,{status:"failed",output:null,error:d instanceof Error?d.message:String(d)})}return{ok:!0,messageId:r.id,status:"running",message:e.memory.get(r.id)}}function p(e,t,s,o){if(s.settled)return;s.settled=!0;const n=e.memory.get(t.id);if(n)try{e.memory.set(t.id,{...n,status:o.status,output:o.output,error:o.error,settledAt:new Date().toISOString()}),e.bus.emit({kind:"message.finished",messageId:t.id,sessionId:t.sessionId,status:o.status,at:new Date().toISOString()})}catch{}}
@@ -7,7 +7,9 @@ import type { PipeMessage } from '../message-deliverer.js';
7
7
  * 终态短时驻留(delivered/injected/succeeded 在 settledAt+ttl 内可见,展示
8
8
  * via/acked),failed/timeout/暂停闸成因常驻。历史在会话自己的转录里。
9
9
  * 例外:已执行的斜杠命令(/rewind 类,宿主不回 UPS)也常驻——它们没有认领
10
- * 事件可退场,TTL 一到就消失会让「刚才那条命令呢」无从查起。
10
+ * 事件可退场,TTL 一到就消失会让「刚才那条命令呢」无从查起。**判据是「没有
11
+ * 认领事件」**(`ackedEventId` 空):skill/插件命令的正文也以 `/` 开头,但它的
12
+ * UPS 就是气泡,留着这行等于同一条消息在对话尾巴上多挂一个「已执行」。
11
13
  */
12
14
  export declare function listVisible(deps: {
13
15
  sessions: Pick<SessionRepository, 'getBySessionId'>;
@@ -1 +1 @@
1
- import{combinedLivenessOf as p}from"../../daemon/liveness.js";import{readAllPromptbox as m,readPromptbox as g}from"../promptbox.js";import{sessionJudgedDead as h}from"./queue.js";function I(n,s){return{id:s.id,sessionId:n,text:s.text,...s.attachments&&s.attachments.length>0?{attachments:s.attachments}:{},mode:"prompt",oneWay:s.oneWay===!0,...s.forceTerminal===!0?{forceTerminal:!0}:{},channel:"prompt",status:"pending",at:s.at}}export function listVisible(n,s,o,i,e,u=()=>!1){const f=Date.now(),r=[],a=n.sessions.getBySessionId(i);if(a?.projectId!=null){const t=n.projects.getById(a.projectId);if(t)for(const c of g(s,t.token))c.sessionId===i&&r.push(I(i,c))}for(const t of o.values()){if(t.sessionId!==i)continue;if(t.stalled===!0||t.status==="delivering"||t.status==="running"){r.push(t);continue}if(t.status==="failed"||t.status==="timeout"){r.push(t);continue}const c=t.settledAt?Date.parse(t.settledAt):NaN,l=t.status==="delivered"&&t.acked!==!0,d=t.status==="delivered"&&t.acked===!0&&u(t.text);(l||d||!Number.isNaN(c)&&f-c<e)&&r.push(t)}return r.sort((t,c)=>t.at<c.at?-1:1)}export function listInflightCounts(n,s){const o=new Map,i=e=>{o.set(e,(o.get(e)??0)+1)};for(const e of m(n))i(e.sessionId);for(const e of s.values())(e.status==="delivering"||e.status==="running")&&i(e.sessionId);return o}export async function sessionTerminals(n,s,o,i,e){const u={};if(e&&e.size>0){for(const a of e)u[a]=null;e.clear()}if(!s?.locateScreens||o.size===0)return u;const f={},r=n.livenessOf?.()??p();for(const[a,t]of o){if(h(n.sessions,a,r)){o.delete(a),i(),u[a]=null;continue}f[a]=t}return{...u,...await s.locateScreens(f)}}
1
+ import{combinedLivenessOf as m}from"../../daemon/liveness.js";import{readAllPromptbox as p,readPromptbox as g}from"../promptbox.js";import{sessionJudgedDead as h}from"./queue.js";function x(n,e){return{id:e.id,sessionId:n,text:e.text,...e.attachments&&e.attachments.length>0?{attachments:e.attachments}:{},mode:"prompt",oneWay:e.oneWay===!0,...e.forceTerminal===!0?{forceTerminal:!0}:{},channel:"prompt",status:"pending",at:e.at}}export function listVisible(n,e,o,i,s,a=()=>!1){const f=Date.now(),u=[],c=n.sessions.getBySessionId(i);if(c?.projectId!=null){const t=n.projects.getById(c.projectId);if(t)for(const r of g(e,t.token))r.sessionId===i&&u.push(x(i,r))}for(const t of o.values()){if(t.sessionId!==i)continue;if(t.stalled===!0||t.status==="delivering"||t.status==="running"){u.push(t);continue}if(t.status==="failed"||t.status==="timeout"){u.push(t);continue}const r=t.settledAt?Date.parse(t.settledAt):NaN,l=t.status==="delivered"&&t.acked!==!0,d=t.status==="delivered"&&t.acked===!0&&t.ackedEventId==null&&a(t.text);(l||d||!Number.isNaN(r)&&f-r<s)&&u.push(t)}return u.sort((t,r)=>t.at<r.at?-1:1)}export function listInflightCounts(n,e){const o=new Map,i=s=>{o.set(s,(o.get(s)??0)+1)};for(const s of p(n))i(s.sessionId);for(const s of e.values())(s.status==="delivering"||s.status==="running")&&i(s.sessionId);return o}export async function sessionTerminals(n,e,o,i,s){const a={};if(s&&s.size>0){for(const c of s)a[c]=null;s.clear()}if(!e?.locateScreens||o.size===0)return a;const f={},u=n.livenessOf?.()??m();for(const[c,t]of o){if(h(n.sessions,c,u)){o.delete(c),i(),a[c]=null;continue}f[c]=t}return{...a,...await e.locateScreens(f)}}
@@ -1,11 +1,11 @@
1
- import{INJECTABLE_EVENTS as b,TITLE_EFFECTIVE_EVENTS as S,hookSourceHarness as w}from"@weavecode/core";import{createPluginLogger as P}from"./plugin-loader.js";import{readHooksEnabled as k}from"../daemon/settings.js";import{effective as v,pluginsStateOf as j}from"./plugin-project-state.js";import{postJson as D,runWebhook as T}from"./handlers/webhook.js";import{DISPATCH_MARKER as I,extractFilePath as h,isCrossProjectPath as W,matchesAnyGlob as C,projectLabel as O,renderTemplate as E,templateVars as A}from"./match.js";function $(c){if(!c)return null;const t=c.match(/\{[\s\S]*\}/);if(t)try{const i=JSON.parse(t[0]);if(typeof i.label=="string"&&i.label.trim())return i.label.trim()}catch{}const s=/label\s*[:=]\s*"?([A-Za-z0-9_-]+)/i.exec(c);return s?s[1]:null}const y=6e4,N=10*6e4,x=4,H=4,L=3e3;export class HookDispatcher{deps;runningWebhooks=new Set;lastClassifyAt=new Map;recentPool=new Map;activeWebhooks=0;pendingWebhooks=[];activePlugins=0;pendingPlugins=[];constructor(t){this.deps=t}async onIngest(t){try{if(!k())return{};this.deps.plugins?.notifyEvent?.(t.payload.eventType,t.payload,t.sessionId);const s={};if(t.sessionId){const e=_(t.payload);let n=null;if(e===null&&this.deps.sessionTitleOf)try{n=await this.deps.sessionTitleOf(t.sessionId)}catch{}const r=e??n;r!==null&&this.deps.sessions.applyReportedTitle(t.sessionId,r)&&this.deps.bus.emit({kind:"session.renamed",sessionId:t.sessionId,title:r,at:new Date().toISOString()});const d=this.deps.sessions.getBySessionId(t.sessionId)?.pendingTitle;if(d){s.sessionTitle=d;const p=S[t.source].includes(t.payload.eventType);(t.deliveredTitle===d&&p||e!==null)&&this.deps.sessions.confirmPendingTitle(t.sessionId,d)&&this.deps.bus.emit({kind:"session.renamed",sessionId:t.sessionId,title:d,at:new Date().toISOString()})}}const i=this.match(t);if(i.length===0)return s;const a=[],o=[],l=Date.now(),u=l+L;for(const e of i)if(this.deps.bus.emit({kind:"rule.matched",ruleId:e.id,eventId:t.eventId,sessionId:t.sessionId,at:new Date(l).toISOString()}),e.handler.type!=="log"){if(e.handler.type==="manual"||e.handler.type==="inject"){if(this.dedupe(e,t,l))continue;const n=E(e.handler.template,A({event:t.payload.eventType,tool:t.payload.toolName,filePath:h(t.payload.toolInput),cwd:t.payload.cwd,session:t.sessionId,project:O(t.project.path),rule:e.name}))+`
2
- ${I}`,r=e.handler.type==="inject"?"injected":"pending";this.createDispatch(e,t,{prompt:n,status:r,mode:e.handler.type==="inject"?"auto":"manual"}),e.handler.type==="inject"&&(e.filter.crossProjectOnly?o.push(n):a.push(n));continue}if(e.handler.type==="webhook"){if(this.runningWebhooks.has(e.id))continue;this.runningWebhooks.add(e.id);const n=this.createDispatch(e,t,{prompt:`webhook ${e.handler.url}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:e.id,dispatchId:n.id,sessionId:t.sessionId,at:new Date().toISOString()}),this.runWebhookAsync(e,this.summary(e,t),n.id);continue}if(e.handler.type==="classify"){const n=this.turnText(t);if(!n)continue;const r=e.handler,d=n.toLowerCase();if(r.prefilter&&r.prefilter.length>0&&!r.prefilter.some(m=>d.includes(m.toLowerCase())))continue;const p=`classify:${e.id}`,f=r.cooldownMs??N;if(l-(this.lastClassifyAt.get(p)??0)<f||this.runningWebhooks.has(p))continue;this.lastClassifyAt.set(p,l),this.runningWebhooks.add(p);const g=this.createDispatch(e,t,{prompt:`classify \u2192 ${r.routes.map(m=>m.label).join("/")}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:e.id,dispatchId:g.id,sessionId:t.sessionId,at:new Date().toISOString()}),this.runClassifyAsync(e,t,g.id,n);continue}if(e.handler.type==="plugin"){const n=this.deps.plugins;if(!n)continue;const r=n.getHandler(e.handler.pluginId,e.handler.handlerType);if(!r||this.dedupe(e,t,l))continue;if(!this.injectable(t)){this.runPluginDetached(e,t,n,r);continue}const d=u-Date.now();if(d<=0)continue;const p=await this.runPluginHandler(e,t,n,r,d);if(!p)continue;p.prompt&&this.createDispatch(e,t,{prompt:p.prompt+`
3
- ${I}`,status:"pending",mode:"auto"}),p.additionalContext&&o.push(p.additionalContext)}}return(a.length>0||o.length>0)&&(s.additionalContext=[...a,...o].join(`
1
+ import{INJECTABLE_EVENTS as b,TITLE_EFFECTIVE_EVENTS as S,hookSourceHarness as w}from"@weavecode/core";import{createPluginLogger as P}from"./plugin-loader.js";import{readHooksEnabled as k}from"../daemon/settings.js";import{effective as v,pluginsStateOf as T}from"./plugin-project-state.js";import{postJson as D,runWebhook as j}from"./handlers/webhook.js";import{DISPATCH_MARKER as g,extractFilePath as c,isCrossProjectPath as W,matchesAnyGlob as C,projectLabel as O,renderTemplate as _,templateVars as E}from"./match.js";function N(h){if(!h)return null;const e=h.match(/\{[\s\S]*\}/);if(e)try{const n=JSON.parse(e[0]);if(typeof n.label=="string"&&n.label.trim())return n.label.trim()}catch{}const s=/label\s*[:=]\s*"?([A-Za-z0-9_-]+)/i.exec(h);return s?s[1]:null}const I=6e4,A=10*6e4,$=4,L=4,M=3e3;export class HookDispatcher{deps;runningWebhooks=new Set;lastClassifyAt=new Map;recentPool=new Map;activeWebhooks=0;pendingWebhooks=[];activePlugins=0;pendingPlugins=[];constructor(e){this.deps=e}async onIngest(e){try{if(!k())return{};this.deps.plugins?.notifyEvent?.(e.payload.eventType,e.payload,e.sessionId);const s={};if(e.sessionId){const t=H(e.payload);let i=null;if(t===null&&this.deps.sessionTitleOf)try{i=await this.deps.sessionTitleOf(e.sessionId)}catch{}const r=t??i;r!==null&&this.deps.sessions.applyReportedTitle(e.sessionId,r)&&this.deps.bus.emit({kind:"session.renamed",sessionId:e.sessionId,title:r,at:new Date().toISOString()});const d=this.deps.sessions.getBySessionId(e.sessionId)?.pendingTitle;if(d){s.sessionTitle=d;const p=S[e.source].includes(e.payload.eventType);(e.deliveredTitle===d&&p||t!==null)&&this.deps.sessions.confirmPendingTitle(e.sessionId,d)&&this.deps.bus.emit({kind:"session.renamed",sessionId:e.sessionId,title:d,at:new Date().toISOString()})}}const n=this.match(e);if(n.length===0)return s;const a=[],o=[],l=Date.now(),u=l+M;for(const t of n)if(this.deps.bus.emit({kind:"rule.matched",ruleId:t.id,eventId:e.eventId,sessionId:e.sessionId,at:new Date(l).toISOString()}),t.handler.type!=="log"){if(t.handler.type==="manual"||t.handler.type==="inject"){if(this.dedupe(t,e,l))continue;const i=_(t.handler.template,E({event:e.payload.eventType,tool:e.payload.toolName,filePath:c(e.payload.toolInput),cwd:e.payload.cwd,session:e.sessionId,project:O(e.project.path),rule:t.name}))+`
2
+ ${g}`,r=t.handler.type==="inject"?"injected":"pending";this.createDispatch(t,e,{prompt:i,status:r,mode:t.handler.type==="inject"?"auto":"manual"}),t.handler.type==="inject"&&(t.filter.crossProjectOnly?o.push(i):a.push(i));continue}if(t.handler.type==="webhook"){if(this.runningWebhooks.has(t.id))continue;this.runningWebhooks.add(t.id);const i=this.createDispatch(t,e,{prompt:`webhook ${t.handler.url}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:t.id,dispatchId:i.id,sessionId:e.sessionId,at:new Date().toISOString()}),this.runWebhookAsync(t,this.summary(t,e),i.id);continue}if(t.handler.type==="classify"){const i=this.turnText(e);if(!i)continue;const r=t.handler,d=i.toLowerCase();if(r.prefilter&&r.prefilter.length>0&&!r.prefilter.some(m=>d.includes(m.toLowerCase())))continue;const p=`classify:${t.id}`,f=r.cooldownMs??A;if(l-(this.lastClassifyAt.get(p)??0)<f||this.runningWebhooks.has(p))continue;this.lastClassifyAt.set(p,l),this.runningWebhooks.add(p);const y=this.createDispatch(t,e,{prompt:`classify \u2192 ${r.routes.map(m=>m.label).join("/")}`,status:"running",mode:"auto"});this.deps.bus.emit({kind:"dispatch.started",ruleId:t.id,dispatchId:y.id,sessionId:e.sessionId,at:new Date().toISOString()}),this.runClassifyAsync(t,e,y.id,i);continue}if(t.handler.type==="plugin"){const i=this.deps.plugins;if(!i)continue;const r=i.getHandler(t.handler.pluginId,t.handler.handlerType);if(!r||this.dedupe(t,e,l))continue;if(!this.injectable(e)){this.runPluginDetached(t,e,i,r);continue}const d=u-Date.now();if(d<=0)continue;const p=await this.runPluginHandler(t,e,i,r,d);if(!p)continue;p.prompt&&this.createDispatch(t,e,{prompt:p.prompt+`
3
+ ${g}`,status:"pending",mode:"auto"}),p.additionalContext&&o.push(p.additionalContext)}}return(a.length>0||o.length>0)&&(s.additionalContext=[...a,...o].join(`
4
4
 
5
5
  `)),o.length>0&&(s.deferred=o.join(`
6
6
 
7
- `)),s}catch{return{}}}createDispatch(t,s,i){const a=this.deps.dispatches.insert({ruleId:t.id,eventId:s.eventId,sessionId:s.sessionId,...i});return this.deps.bus.emit({kind:"dispatch.created",ruleId:t.id,dispatchId:a.id,status:i.status,mode:a.mode,sessionId:s.sessionId,at:a.startedAt}),a}dedupe(t,s,i){const a=`${t.id}:${s.sessionId??""}`,o=this.recentPool.get(a);return o!==void 0&&i-o<y?!0:(this.recentPool.set(a,i),this.trimDedupe(i),!1)}match(t){const s=this.deps.pluginStates,i=s?j(t.project.meta).enabled:null;let a=null;return this.deps.registry.candidates(t.payload.eventType,s?{includeDisabled:!0}:void 0).filter(o=>{const l=w(o.source);if(l!==null&&l!=="any"&&l!==t.source||o.projectId!==null&&o.projectId!==t.project.id)return!1;if(o.pluginId!==null){if(!o.enabled&&i?.[o.pluginId]!==!0||s&&!v(t.project,o.pluginId,{states:s}))return!1}else if(!o.enabled)return!1;const u=o.filter;if(u.toolNames?.length&&(!t.payload.toolName||!u.toolNames.includes(t.payload.toolName)))return!1;if(u.pathGlobs?.length){const e=h(t.payload.toolInput);if(!e||!C(e,u.pathGlobs))return!1}if(u.crossProjectOnly){const e=h(t.payload.toolInput)??t.payload.cwd;if(!e||(a??=this.deps.projects.list().map(n=>n.path).filter(n=>n!==t.project.path),!W(e,t.project.path,a)))return!1}return!0})}injectable(t){const s=t.payload.eventType;return s!==null&&b[t.source].includes(s)}async runPluginHandler(t,s,i,a,o){if(t.handler.type!=="plugin")return;const{pluginId:l}=t.handler,u=P(l),e=o===void 0?t.timeoutMs:Math.min(t.timeoutMs,o);let n;try{const r=(async()=>{await this.acquirePluginSlot();try{return await a.execute({event:s.payload,rule:t,config:i.getConfig(l),logger:u})}finally{this.releasePluginSlot()}})(),d=await Promise.race([r,new Promise((p,f)=>{n=setTimeout(()=>f(new Error("plugin handler timeout")),e)})]);return d&&typeof d=="object"?d:void 0}catch{return}finally{n&&clearTimeout(n)}}async runPluginDetached(t,s,i,a){try{const o=await this.runPluginHandler(t,s,i,a);if(!o?.prompt)return;this.createDispatch(t,s,{prompt:o.prompt+`
8
- ${I}`,status:"pending",mode:"auto"})}catch{}}summary(t,s){return{ruleId:t.id,ruleName:t.name,projectId:s.project.id,sessionId:s.sessionId,event:s.payload.eventType,toolName:s.payload.toolName,filePath:h(s.payload.toolInput),cwd:s.payload.cwd,at:new Date().toISOString()}}turnText(t){const s=t.payload.raw?.last_assistant_message;return typeof s=="string"?s.trim():""}async runClassifyAsync(t,s,i,a){const o=t.handler;if(o.type!=="classify")return;const l=`classify:${t.id}`;try{const u=await this.deps.classify?.({sessionId:s.sessionId??"",prompt:`${o.prompt}
7
+ `)),s}catch{return{}}}createDispatch(e,s,n){const a=this.deps.dispatches.insert({ruleId:e.id,eventId:s.eventId,sessionId:s.sessionId,...n});return this.deps.bus.emit({kind:"dispatch.created",ruleId:e.id,dispatchId:a.id,status:n.status,mode:a.mode,sessionId:s.sessionId,at:a.startedAt}),a}dedupe(e,s,n){const a=`${e.id}:${s.sessionId??""}`,o=this.recentPool.get(a);return o!==void 0&&n-o<I?!0:(this.recentPool.set(a,n),this.trimDedupe(n),!1)}match(e){const s=this.deps.pluginStates,n=s?T(e.project.meta).enabled:null;let a=null;return this.deps.registry.candidates(e.payload.eventType,s?{includeDisabled:!0}:void 0).filter(o=>{const l=w(o.source);if(l!==null&&l!=="any"&&l!==e.source||o.projectId!==null&&o.projectId!==e.project.id)return!1;if(o.pluginId!==null){if(!o.enabled&&n?.[o.pluginId]!==!0||s&&!v(e.project,o.pluginId,{states:s}))return!1}else if(!o.enabled)return!1;const u=o.filter;if(u.toolNames?.length&&(!e.payload.toolName||!u.toolNames.includes(e.payload.toolName)))return!1;if(u.pathGlobs?.length){const t=c(e.payload.toolInput);if(!t||!C(t,u.pathGlobs))return!1}if(u.crossProjectOnly){const t=c(e.payload.toolInput)??e.payload.cwd;if(!t||(a??=this.deps.projects.list().map(i=>i.path).filter(i=>i!==e.project.path),!W(t,e.project.path,a)))return!1}return!0})}injectable(e){const s=e.payload.eventType;return s!==null&&b[e.source].includes(s)}async runPluginHandler(e,s,n,a,o){if(e.handler.type!=="plugin")return;const{pluginId:l}=e.handler,u=P(l),t=o===void 0?e.timeoutMs:Math.min(e.timeoutMs,o);let i;try{const r=(async()=>{await this.acquirePluginSlot();try{return await a.execute({event:s.payload,rule:e,config:n.getConfig(l),logger:u})}finally{this.releasePluginSlot()}})(),d=await Promise.race([r,new Promise((p,f)=>{i=setTimeout(()=>f(new Error("plugin handler timeout")),t)})]);return d&&typeof d=="object"?d:void 0}catch{return}finally{i&&clearTimeout(i)}}async runPluginDetached(e,s,n,a){try{const o=await this.runPluginHandler(e,s,n,a);if(!o?.prompt)return;this.createDispatch(e,s,{prompt:o.prompt+`
8
+ ${g}`,status:"pending",mode:"auto"})}catch{}}summary(e,s){return{ruleId:e.id,ruleName:e.name,projectId:s.project.id,sessionId:s.sessionId,event:s.payload.eventType,toolName:s.payload.toolName,filePath:c(s.payload.toolInput),cwd:s.payload.cwd,at:new Date().toISOString()}}turnText(e){const n=e.payload.raw?.last_assistant_message;return typeof n=="string"?n.trim():""}async runClassifyAsync(e,s,n,a){const o=e.handler;if(o.type!=="classify")return;const l=`classify:${e.id}`;try{const u=await this.deps.classify?.({sessionId:s.sessionId??"",prompt:`${o.prompt}
9
9
 
10
10
  \u672C\u8F6E\u6700\u7EC8\u8F93\u51FA\uFF1A
11
- ${a.slice(0,8e3)}`}),e=$(u),n=e?o.routes.find(d=>d.label.toLowerCase()===e.toLowerCase()):void 0;if(!n){this.deps.dispatches.updateStatus(i,{status:"succeeded",output:e?`label=${e} (no route)`:"no label",finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:"succeeded",sessionId:s.sessionId,at:new Date().toISOString()});return}const r=await D(n.url,n.secret,{...this.summary(t,s),label:e,verdict:u?.slice(0,500)},this.deps.fetchImpl);this.deps.dispatches.updateStatus(i,{status:r.status,output:`label=${e} ${r.output??""}`.trim(),error:r.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:r.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(u){this.deps.dispatches.updateStatus(i,{status:"failed",error:String(u),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(l)}}async runWebhookAsync(t,s,i){await this.acquireWebhookSlot();try{const a=await T(t,s,this.deps.fetchImpl);this.deps.dispatches.updateStatus(i,{status:a.status,output:a.output??null,error:a.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:a.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(a){this.deps.dispatches.updateStatus(i,{status:"failed",error:String(a),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:t.id,dispatchId:i,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(t.id),this.releaseWebhookSlot()}}acquireWebhookSlot(){return this.activeWebhooks<x?(this.activeWebhooks++,Promise.resolve()):new Promise(t=>{this.pendingWebhooks.push(()=>{this.activeWebhooks++,t()})})}releaseWebhookSlot(){this.activeWebhooks--;const t=this.pendingWebhooks.shift();t&&t()}acquirePluginSlot(){return this.activePlugins<H?(this.activePlugins++,Promise.resolve()):new Promise(t=>{this.pendingPlugins.push(()=>{this.activePlugins++,t()})})}releasePluginSlot(){this.activePlugins--;const t=this.pendingPlugins.shift();t&&t()}trimDedupe(t){if(!(this.recentPool.size<1e3))for(const[s,i]of this.recentPool)t-i>=y&&this.recentPool.delete(s)}}function _(c){const t=c.raw;if(typeof t!="object"||t===null)return null;const s=t.session_title;return typeof s=="string"&&s.length>0?s:null}
11
+ ${a.slice(0,8e3)}`}),t=N(u),i=t?o.routes.find(d=>d.label.toLowerCase()===t.toLowerCase()):void 0;if(!i){this.deps.dispatches.updateStatus(n,{status:"succeeded",output:t?`label=${t} (no route)`:"no label",finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:"succeeded",sessionId:s.sessionId,at:new Date().toISOString()});return}const r=await D(i.url,i.secret,{...this.summary(e,s),label:t,verdict:u?.slice(0,500)},this.deps.fetchImpl);this.deps.dispatches.updateStatus(n,{status:r.status,output:`label=${t} ${r.output??""}`.trim(),error:r.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:r.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(u){this.deps.dispatches.updateStatus(n,{status:"failed",error:String(u),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(l)}}async runWebhookAsync(e,s,n){await this.acquireWebhookSlot();try{const a=await j(e,s,this.deps.fetchImpl);this.deps.dispatches.updateStatus(n,{status:a.status,output:a.output??null,error:a.error??null,finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:a.status,sessionId:s.sessionId,at:new Date().toISOString()})}catch(a){this.deps.dispatches.updateStatus(n,{status:"failed",error:String(a),finished:!0}),this.deps.bus.emit({kind:"dispatch.finished",ruleId:e.id,dispatchId:n,status:"failed",sessionId:s.sessionId,at:new Date().toISOString()})}finally{this.runningWebhooks.delete(e.id),this.releaseWebhookSlot()}}acquireWebhookSlot(){return this.activeWebhooks<$?(this.activeWebhooks++,Promise.resolve()):new Promise(e=>{this.pendingWebhooks.push(()=>{this.activeWebhooks++,e()})})}releaseWebhookSlot(){this.activeWebhooks--;const e=this.pendingWebhooks.shift();e&&e()}acquirePluginSlot(){return this.activePlugins<L?(this.activePlugins++,Promise.resolve()):new Promise(e=>{this.pendingPlugins.push(()=>{this.activePlugins++,e()})})}releasePluginSlot(){this.activePlugins--;const e=this.pendingPlugins.shift();e&&e()}trimDedupe(e){if(!(this.recentPool.size<1e3))for(const[s,n]of this.recentPool)e-n>=I&&this.recentPool.delete(s)}}function H(h){const e=h.raw;if(typeof e!="object"||e===null)return null;const s=e.session_title;return typeof s=="string"&&s.length>0?s:null}
@@ -1 +1 @@
1
- import{isSyntheticSession as f,registerSyntheticSession as S,syntheticSessionIds as g}from"./synthetic-sessions.js";const y=8e3;export function createEdgeExtract(s){const d=s.concurrency??4;let o=0;return{supports(t){const r=s.harnessOf(t);return r?s.surfaceFor(r).headless?.extractArgs!=null:!1},run({sessionId:t,prompt:r}){if(o>=d)return Promise.resolve(null);const i=s.harnessOf(t),c=s.sessions.getBySessionId(t);if(!i||!c?.projectId)return Promise.resolve(null);const u=s.projects.getById(c.projectId),n=s.surfaceFor(i).headless,l=process.env.WEAVE_CLAUDE_BIN??n?.bin;if(!u||!n?.extractArgs||!l)return Promise.resolve(null);const h=S();return s.onSyntheticChange(),o++,new Promise(m=>{let a=!1;const p=e=>{a||(a=!0,o--,m(e))};s.headless.run({sessionId:h,cwd:u.path,prompt:r,spec:n,bin:l,argsOf:e=>n.extractArgs(t,e),timeoutMs:s.timeoutMs??12e4,onSettle:e=>{p(e.status==="succeeded"&&e.output?.trim()?e.output.trim().slice(0,y):null)}})||p(null)})}}}export{f as isSyntheticSession,g as syntheticSessionIds};
1
+ import{isSyntheticSession as g,registerSyntheticSession as d,syntheticSessionIds as x}from"./synthetic-sessions.js";const y=8e3;export function createEdgeExtract(t){const h=t.concurrency??4;let o=0;return{supports(s){const r=t.harnessOf(s);return r?t.surfaceFor(r).headless?.extractArgs!=null:!1},run({sessionId:s,prompt:r}){if(o>=h)return Promise.resolve(null);const c=t.harnessOf(s),i=t.sessions.getBySessionId(s);if(!c||!i?.projectId)return Promise.resolve(null);const u=t.projects.getById(i.projectId),n=t.surfaceFor(c).headless,a=process.env.WEAVE_CLAUDE_BIN??n?.bin;if(!u||!n?.extractArgs||!a)return Promise.resolve(null);const m=d();return t.onSyntheticChange(),o++,new Promise(S=>{let l=!1;const f=e=>{l||(l=!0,o--,S(e))};t.headless.run({sessionId:m,cwd:u.path,prompt:r,spec:n,bin:a,argsOf:e=>n.extractArgs(s,e),timeoutMs:t.timeoutMs??12e4,onSettle:e=>{f(e.status==="succeeded"&&e.output?.trim()?e.output.trim().slice(0,y):null)}})||f(null)})}}}export{g as isSyntheticSession,x as syntheticSessionIds};
@@ -1 +1 @@
1
- import{createHmac as l}from"node:crypto";const c=5e3,d=4096;export async function postJson(o,s,n,e=fetch){let r;try{r=new URL(o)}catch{return{ok:!1,status:"failed",error:`invalid url: ${o}`}}if(r.protocol!=="http:"&&r.protocol!=="https:")return{ok:!1,status:"failed",error:`unsupported protocol: ${r.protocol}`};const u=JSON.stringify(n),i={"content-type":"application/json","user-agent":"weave-daemon"};s&&(i["x-weave-signature"]=`sha256=${l("sha256",s).update(u).digest("hex")}`);try{const t=await e(r,{method:"POST",headers:i,body:u,signal:AbortSignal.timeout(c)}),a=(await t.text()).slice(0,d);return t.ok?{ok:!0,status:"succeeded",output:a||`HTTP ${t.status}`}:{ok:!1,status:"failed",error:`HTTP ${t.status}`,output:a}}catch(t){const a=t instanceof Error&&(t.name==="TimeoutError"||t.name==="AbortError");return{ok:!1,status:a?"timeout":"failed",error:a?`webhook timed out after ${c}ms`:String(t)}}}export async function runWebhook(o,s,n=fetch){const e=o.handler;return e.type!=="webhook"?{ok:!1,status:"failed",error:`rule ${o.id} is not a webhook handler`}:postJson(e.url,e.secret,s,n)}
1
+ import{createHmac as l}from"node:crypto";const c=5e3,f=4096;export async function postJson(e,s,n,o=fetch){let r;try{r=new URL(e)}catch{return{ok:!1,status:"failed",error:`invalid url: ${e}`}}if(r.protocol!=="http:"&&r.protocol!=="https:")return{ok:!1,status:"failed",error:`unsupported protocol: ${r.protocol}`};const u=JSON.stringify(n),i={"content-type":"application/json","user-agent":"weave-daemon"};s&&(i["x-weave-signature"]=`sha256=${l("sha256",s).update(u).digest("hex")}`);try{const t=await o(r,{method:"POST",headers:i,body:u,signal:AbortSignal.timeout(c)}),a=(await t.text()).slice(0,f);return t.ok?{ok:!0,status:"succeeded",output:a||`HTTP ${t.status}`}:{ok:!1,status:"failed",error:`HTTP ${t.status}`,output:a}}catch(t){const a=t instanceof Error&&(t.name==="TimeoutError"||t.name==="AbortError");return{ok:!1,status:a?"timeout":"failed",error:a?`webhook timed out after ${c}ms`:String(t)}}}export async function runWebhook(e,s,n=fetch){const o=e.handler;return o.type!=="webhook"?{ok:!1,status:"failed",error:`rule ${e.id} is not a webhook handler`}:postJson(o.url,o.secret,s,n)}
@@ -1,2 +1,2 @@
1
- import{spawn as k}from"node:child_process";const L=3e5,y=32*1024,E=2e3;export class HeadlessRunner{spawnImpl;killImpl;active=new Set;livePids=new Map;constructor(t={}){this.spawnImpl=t.spawnImpl??k,this.killImpl=t.killImpl??defaultKill}isBusy(t){return this.active.has(t)}killAll(){let t=0;for(const e of this.livePids.values())try{this.killImpl(e),t++}catch{}return this.livePids.clear(),t}run(t){if(this.active.has(t.sessionId))return!1;this.active.add(t.sessionId);const e={settled:!1};try{this.watch(t,e)}catch(n){this.settle(t,e,{status:"failed",output:null,error:P(n)})}return!0}watch(t,e){const n=t.timeoutMs??L,a=t.spec.promptStdin===!0,f=t.argsOf?t.argsOf(t.sessionId):t.spec.args(t.sessionId,a?"":t.prompt),d=a&&process.platform==="win32"&&!/[\s"\\/]/.test(t.bin),T=(t.detached??!0)&&!d,m={cwd:t.cwd,detached:T,windowsHide:!0,shell:d,stdio:[a?"pipe":"ignore","pipe","pipe"],env:(()=>{const s={...process.env,WEAVE_HOOK_DISPATCH:"1"};return delete s.CLAUDE_CODE_CHILD_SESSION,s})()},i=d?this.spawnImpl([t.bin,...f].join(" "),[],m):this.spawnImpl(t.bin,f,m);if(i.pid!==void 0&&this.livePids.set(t.sessionId,i.pid),a){i.stdin?.on("error",()=>{});try{i.stdin?.write(t.prompt),i.stdin?.end()}catch{}}const I=[],p=[];let w=0,v=0;const g=(s,o,l)=>{if(o>=y)return o;const c=y-o;return s.push(l.length>c?l.subarray(0,c):l),o+Math.min(l.length,c)},h=()=>Buffer.concat([...I,...p]).toString("utf8"),H=()=>{const s=Buffer.concat(p).toString("utf8");return s.length>E?s.slice(-E):s};i.stdout?.on("data",s=>{w=g(I,w,s)}),i.stderr?.on("data",s=>{v=g(p,v,s)});const u=n>0?setTimeout(()=>{if(i.pid!==void 0)try{this.killImpl(i.pid)}catch{}this.settle(t,e,{status:"timeout",output:h(),error:`Timeout after ${n}ms`})},n):null;i.on("error",s=>{u!==null&&clearTimeout(u),this.settle(t,e,{status:"failed",output:h(),error:P(s)})}),i.on("exit",(s,o)=>{u!==null&&clearTimeout(u);const l=h();if(s===0){this.settle(t,e,{status:"succeeded",output:l,error:null});return}const c=s!==null?`exit ${s}`:`exit signal ${o??"unknown"}`,S=H();this.settle(t,e,{status:"failed",output:l,error:S?`${c}
2
- ${S}`:c})})}settle(t,e,n){if(!e.settled){e.settled=!0,this.active.delete(t.sessionId),this.livePids.delete(t.sessionId);try{t.onSettle(n)}catch{}}}}export function defaultKill(r){if(process.platform==="win32"){try{k("taskkill",["/PID",String(r),"/T","/F"],{windowsHide:!0,stdio:"ignore"}).on("error",()=>{})}catch{}return}try{process.kill(-r,"SIGKILL")}catch{try{process.kill(r,"SIGKILL")}catch{}}}function P(r){return r instanceof Error?r.message:String(r)}
1
+ import{spawn as k}from"node:child_process";const A=3e5,T=32*1024,_=2e3;export class HeadlessRunner{spawnImpl;killImpl;active=new Set;livePids=new Map;constructor(t={}){this.spawnImpl=t.spawnImpl??k,this.killImpl=t.killImpl??defaultKill}isBusy(t){return this.active.has(t)}killAll(){let t=0;for(const e of this.livePids.values())try{this.killImpl(e),t++}catch{}return this.livePids.clear(),t}run(t){if(this.active.has(t.sessionId))return!1;this.active.add(t.sessionId);const e={settled:!1};try{this.watch(t,e)}catch(l){this.settle(t,e,{status:"failed",output:null,error:y(l)})}return!0}watch(t,e){const l=t.timeoutMs??A,a=t.spec.promptStdin===!0,m=t.argsOf?t.argsOf(t.sessionId):t.spec.args(t.sessionId,a?"":t.prompt),h=a&&process.platform==="win32"&&!/[\s"\\/]/.test(t.bin),E=(t.detached??!0)&&!h,p={cwd:t.cwd,detached:E,windowsHide:!0,shell:h,stdio:[a?"pipe":"ignore","pipe","pipe"],env:(()=>{const s={...process.env,WEAVE_HOOK_DISPATCH:"1"};return delete s.CLAUDE_CODE_CHILD_SESSION,s})()},r=h?this.spawnImpl([t.bin,...m].join(" "),[],p):this.spawnImpl(t.bin,m,p);if(r.pid!==void 0&&this.livePids.set(t.sessionId,r.pid),a){r.stdin?.on("error",()=>{});try{r.stdin?.write(t.prompt),r.stdin?.end()}catch{}}const I=[],u=[];let w=0,S=0;const g=(s,n,o)=>{if(n>=T)return n;const c=T-n;return s.push(o.length>c?o.subarray(0,c):o),n+Math.min(o.length,c)},f=()=>Buffer.concat([...I,...u]).toString("utf8"),M=()=>{const s=Buffer.concat(u).toString("utf8");return s.length>_?s.slice(-_):s};r.stdout?.on("data",s=>{w=g(I,w,s)}),r.stderr?.on("data",s=>{S=g(u,S,s)});const d=l>0?setTimeout(()=>{if(r.pid!==void 0)try{this.killImpl(r.pid)}catch{}this.settle(t,e,{status:"timeout",output:f(),error:`Timeout after ${l}ms`})},l):null;r.on("error",s=>{d!==null&&clearTimeout(d),this.settle(t,e,{status:"failed",output:f(),error:y(s)})}),r.on("exit",(s,n)=>{d!==null&&clearTimeout(d);const o=f();if(s===0){this.settle(t,e,{status:"succeeded",output:o,error:null});return}const c=s!==null?`exit ${s}`:`exit signal ${n??"unknown"}`,v=M();this.settle(t,e,{status:"failed",output:o,error:v?`${c}
2
+ ${v}`:c})})}settle(t,e,l){if(!e.settled){e.settled=!0,this.active.delete(t.sessionId),this.livePids.delete(t.sessionId);try{t.onSettle(l)}catch{}}}}export function defaultKill(i){if(process.platform==="win32"){try{k("taskkill",["/PID",String(i),"/T","/F"],{windowsHide:!0,stdio:"ignore"}).on("error",()=>{})}catch{}return}try{process.kill(-i,"SIGKILL")}catch{try{process.kill(i,"SIGKILL")}catch{}}}function y(i){return i instanceof Error?i.message:String(i)}
@@ -1,2 +1,2 @@
1
- import k from"node:net";import{chmodSync as m,mkdirSync as y,readFileSync as S,renameSync as b,writeFileSync as d}from"node:fs";import{dirname as x}from"node:path";export function inboxSocketPathOf(s){return s.startsWith("uds:")?s.slice(4):s}export function deliverViaInboxSocket(s,t,e,o={}){const c=o.platform??process.platform,n=o.timeoutMs??3e3,u=inboxSocketPathOf(t.socket);return s.requiresAuthOn(c)&&!t.token?Promise.reject(new Error(`inbox delivery requires a token on platform "${c}"`)):new Promise((a,l)=>{const p=s.frame({token:t.token,text:e});let f=!1;const h=r=>{f||(f=!0,i.destroy(),l(r))},i=k.connect(u);i.setTimeout(n),i.on("timeout",()=>h(new Error(`inbox socket timeout after ${n}ms`))),i.on("error",r=>h(r)),i.on("connect",()=>{i.write(p,r=>{r?h(r):i.end()})}),i.on("close",()=>{f||(f=!0,a())})})}export const INBOX_TARGETS_FILE="inbox-targets.json";function g(s){try{const t=JSON.parse(S(s,"utf8"));if(typeof t!="object"||t===null)return{};const e={};for(const[o,c]of Object.entries(t)){const n=c;typeof n?.socket!="string"||!n.socket||(e[o]={socket:n.socket,token:typeof n.token=="string"&&n.token?n.token:null})}return e}catch{return{}}}export class InboxSocketRegistry{file;bySession;persisted;constructor(t){this.file=t;const e=t?g(t):{};this.bySession=new Map(Object.entries(e)),this.persisted=JSON.stringify(e)}set(t,e){const o=this.bySession.get(t);if(!e?.socket){o&&(this.bySession.delete(t),this.persist());return}o&&o.socket===e.socket&&o.token===e.token||(this.bySession.set(t,e),this.persist())}get(t){return this.bySession.get(t)}forget(t){this.bySession.delete(t)&&this.persist()}persist(){if(!this.file)return;const t=JSON.stringify(Object.fromEntries(this.bySession));if(t!==this.persisted)try{y(x(this.file),{recursive:!0});const e=`${this.file}.tmp`;d(e,`${t}
2
- `,{encoding:"utf8",mode:384}),b(e,this.file),m(this.file,384),this.persisted=t}catch{}}}
1
+ import a from"node:net";import{chmodSync as y,mkdirSync as d,readFileSync as k,renameSync as S,writeFileSync as b}from"node:fs";import{dirname as x}from"node:path";export function inboxSocketPathOf(s){return s.startsWith("uds:")?s.slice(4):s}export function deliverViaInboxSocket(s,t,e,o={}){const c=o.platform??process.platform,n=o.timeoutMs??3e3,l=inboxSocketPathOf(t.socket);return s.requiresAuthOn(c)&&!t.token?Promise.reject(new Error(`inbox delivery requires a token on platform "${c}"`)):new Promise((p,m)=>{const h=s.frame({token:t.token,text:e});let f=!1;const u=i=>{f||(f=!0,r.destroy(),m(i))},r=a.connect(l);r.setTimeout(n),r.on("timeout",()=>u(new Error(`inbox socket timeout after ${n}ms`))),r.on("error",i=>u(i)),r.on("connect",()=>{r.write(h,i=>{i?u(i):r.end()})}),r.on("close",()=>{f||(f=!0,p())})})}export const INBOX_TARGETS_FILE="inbox-targets.json";function O(s){try{const t=JSON.parse(k(s,"utf8"));if(typeof t!="object"||t===null)return{};const e={};for(const[o,c]of Object.entries(t)){const n=c;typeof n?.socket!="string"||!n.socket||(e[o]={socket:n.socket,token:typeof n.token=="string"&&n.token?n.token:null})}return e}catch{return{}}}export class InboxSocketRegistry{file;bySession;persisted;constructor(t){this.file=t;const e=t?O(t):{};this.bySession=new Map(Object.entries(e)),this.persisted=JSON.stringify(e)}set(t,e){const o=this.bySession.get(t);if(!e?.socket){o&&(this.bySession.delete(t),this.persist());return}o&&o.socket===e.socket&&o.token===e.token||(this.bySession.set(t,e),this.persist())}get(t){return this.bySession.get(t)}forget(t){this.bySession.delete(t)&&this.persist()}persist(){if(!this.file)return;const t=JSON.stringify(Object.fromEntries(this.bySession));if(t!==this.persisted)try{d(x(this.file),{recursive:!0});const e=`${this.file}.tmp`;b(e,`${t}
2
+ `,{encoding:"utf8",mode:384}),S(e,this.file),y(this.file,384),this.persisted=t}catch{}}}
@@ -1,4 +1,4 @@
1
- import{existsSync as I,readdirSync as v,readFileSync as j,renameSync as h,unlinkSync as b,writeFileSync as E}from"node:fs";import{join as d}from"node:path";import{isMainThread as T,parentPort as m,Worker as P,workerData as k}from"node:worker_threads";import{createRuntimeRegistry as x,effortLevelOf as M,frameFacts as O,permissionModeOf as D,startedModelOf as W,switchedModelOf as A}from"@weavecode/harness";import{HARNESS_LIFECYCLE as F,isHarness as g}from"@weavecode/core";import{getLogsDir as R}from"../db/paths.js";import{projectHarnessIds as L}from"../daemon/project-harnesses.js";import{openDatabase as _}from"../db/db.js";import{HookEventRepository as C}from"../repositories/hook-events.js";import{ProjectRepository as N}from"../repositories/projects.js";import{SessionRepository as B}from"../repositories/sessions.js";import{appendOutbox as X}from"./mirror.js";import{isSyntheticSession as H,replaceSyntheticSessions as U}from"./synthetic-sessions.js";export const INBOX_TICK_MS=200,INBOX_CLAIM_SUFFIX=".claim.jsonl",INBOX_FAILED_SUFFIX=".failed.jsonl";const $=5;export function drainInboxOnce(t,n=new Map){const e=d(t.hooksDir,"inbox");let i;try{i=v(e)}catch{return[]}const o=[];for(const c of i)c.endsWith(INBOX_FAILED_SUFFIX)||c.endsWith(".tmp")||c.endsWith(INBOX_CLAIM_SUFFIX)||c.endsWith(".jsonl")&&o.push(c);const r=[];for(const c of i)c.endsWith(INBOX_CLAIM_SUFFIX)&&r.push(...w(t,d(e,c),n));for(const c of o){const a=d(e,`${c.slice(0,-6)}${INBOX_CLAIM_SUFFIX}`);if(!I(a)){try{h(d(e,c),a)}catch{continue}r.push(...w(t,a,n))}}return r}function w(t,n,e){let i;try{i=j(n,"utf8").split(`
2
- `)}catch{return[]}const o=new Map;for(const p of i){const u=p.trim();if(!u)continue;const s=z(u);if(!s)continue;const l=o.get(s.token)??{lines:[],inputs:[],delivered:[],terminals:[],messaging:[]};if(l.lines.push(u),l.project||(l.project=t.projects.getByToken(s.token),o.set(s.token,l)),!l.project||l.project.archivedAt)continue;const y=s.report&&typeof s.report=="object"?t.adapters.find(f=>f.source===s.report.source):void 0;if(!(!y||!s.report.eventType))try{const f=y.normalize(s.report,l.project.id);if(H(f.sessionId))continue;l.inputs.push(f),l.delivered.push(s.report.deliveredTitle??null),l.terminals.push(s.terminalEnv),l.messaging.push(s.messaging)}catch{}}const r=[],c=[];for(const p of o.values())if(!(!p.project||p.inputs.length===0))try{const u=S(t,p.project,p.inputs);for(let s=0;s<p.inputs.length;s++)r.push({eventId:u[s],projectId:p.project.id,input:p.inputs[s],deliveredTitle:p.delivered[s]??null,messaging:p.messaging[s]??null,terminalEnv:p.terminals[s]??null})}catch{c.push(...p.lines)}if(c.length===0){e.delete(n);try{b(n)}catch{}return r}const a=(e.get(n)??0)+1;if(e.set(n,a),a>=$){e.delete(n);try{h(n,n.replace(INBOX_CLAIM_SUFFIX,INBOX_FAILED_SUFFIX))}catch{}return r}try{E(n,c.join(`
1
+ import{existsSync as v,readdirSync as I,readFileSync as w,renameSync as g,unlinkSync as S,writeFileSync as T}from"node:fs";import{join as f}from"node:path";import{isMainThread as E,parentPort as h,Worker as x,workerData as k}from"node:worker_threads";import{createRuntimeRegistry as M,effortLevelOf as O,frameFacts as P,permissionModeOf as D,startedModelOf as A,switchedModelOf as L}from"@weavecode/harness";import{HARNESS_LIFECYCLE as W,isHarness as m}from"@weavecode/core";import{getLogsDir as _}from"../db/paths.js";import{projectHarnessIds as C}from"../daemon/project-harnesses.js";import{openDatabase as F}from"../db/db.js";import{HookEventRepository as R}from"../repositories/hook-events.js";import{ProjectRepository as N}from"../repositories/projects.js";import{SessionRepository as B}from"../repositories/sessions.js";import{appendOutbox as X}from"./mirror.js";import{isSyntheticSession as H,replaceSyntheticSessions as U}from"./synthetic-sessions.js";export const INBOX_TICK_MS=200,INBOX_CLAIM_SUFFIX=".claim.jsonl",INBOX_FAILED_SUFFIX=".failed.jsonl";const $=5;export function drainInboxOnce(n,o=new Map){const e=f(n.hooksDir,"inbox");let i;try{i=I(e)}catch{return[]}const s=[];for(const c of i)c.endsWith(INBOX_FAILED_SUFFIX)||c.endsWith(".tmp")||c.endsWith(INBOX_CLAIM_SUFFIX)||c.endsWith(".jsonl")&&s.push(c);const r=[];for(const c of i)c.endsWith(INBOX_CLAIM_SUFFIX)&&r.push(...j(n,f(e,c),o));for(const c of s){const p=f(e,`${c.slice(0,-6)}${INBOX_CLAIM_SUFFIX}`);if(!v(p)){try{g(f(e,c),p)}catch{continue}r.push(...j(n,p,o))}}return r}function j(n,o,e){let i;try{i=w(o,"utf8").split(`
2
+ `)}catch{return[]}const s=new Map;for(const u of i){const a=u.trim();if(!a)continue;const t=z(a);if(!t)continue;const l=s.get(t.token)??{lines:[],inputs:[],delivered:[],terminals:[],messaging:[]};if(l.lines.push(a),l.project||(l.project=n.projects.getByToken(t.token),s.set(t.token,l)),!l.project||l.project.archivedAt)continue;const y=t.report&&typeof t.report=="object"?n.adapters.find(d=>d.source===t.report.source):void 0;if(!(!y||!t.report.eventType))try{const d=y.normalize(t.report,l.project.id);if(H(d.sessionId))continue;l.inputs.push(d),l.delivered.push(t.report.deliveredTitle??null),l.terminals.push(t.terminalEnv),l.messaging.push(t.messaging)}catch{}}const r=[],c=[];for(const u of s.values())if(!(!u.project||u.inputs.length===0))try{const a=b(n,u.project,u.inputs);for(let t=0;t<u.inputs.length;t++)r.push({eventId:a[t],projectId:u.project.id,input:u.inputs[t],deliveredTitle:u.delivered[t]??null,messaging:u.messaging[t]??null,terminalEnv:u.terminals[t]??null})}catch{c.push(...u.lines)}if(c.length===0){e.delete(o);try{S(o)}catch{}return r}const p=(e.get(o)??0)+1;if(e.set(o,p),p>=$){e.delete(o);try{g(o,o.replace(INBOX_CLAIM_SUFFIX,INBOX_FAILED_SUFFIX))}catch{}return r}try{T(o,c.join(`
3
3
  `)+`
4
- `)}catch{}return r}function S(t,n,e){const i=t.hookEvents.insertMany(e),o=new Map;for(const r of e){if(!r.sessionId)continue;const c=o.get(r.sessionId),a=r.createdAt;(!o.has(r.sessionId)||a&&(!c||a>c))&&o.set(r.sessionId,a)}for(const[r,c]of o)t.hookSessions.touch(r,n.id,c);return i}export const LOGS_TICK_MS=1e3;export async function pollLogsOnce(t){if(t.sources.length===0)return[];const n=new Map;for(const i of t.projects.list()){const o=await L(i.path);t.sources.some(r=>o.includes(r.harness))&&n.set(i.path,i)}if(n.size===0)return[];const e=[];for(const i of t.sources){const o=t.adapters.find(a=>a.source===i.harness);if(!o)continue;let r;try{r=await i.poll({stateDir:d(t.logsDir,i.harness),cwdWhitelist:[...n.keys()]})}catch{continue}const c=new Map;for(const a of r){const p=a.report.cwd?n.get(a.report.cwd):void 0;if(p)try{const u=o.normalize(a.report,p.id);u.createdAt=a.at;const s=c.get(p);s?s.push(u):c.set(p,[u])}catch{}}for(const[a,p]of c)try{const u=S(t,a,p);for(let s=0;s<p.length;s++)e.push({eventId:u[s],projectId:a.id,input:p[s]})}catch(u){console.error("[weave] log ingest failed:",u)}}return e}function z(t){try{const n=JSON.parse(t);if(!n||typeof n.token!="string"||!n.token||!n.report||typeof n.report!="object")return null;const e=n.messaging?.socket,i=typeof e=="string"&&e?{socket:e,token:typeof n.messaging?.token=="string"?n.messaging.token:null}:null;return{token:n.token,report:n.report,messaging:i,terminalEnv:K(n.terminal)}}catch{return null}}function K(t){if(typeof t!="object"||t===null)return null;const n={};for(const[e,i]of Object.entries(t))typeof i=="string"&&i&&(n[e]=i);return Object.keys(n).length>0?n:null}export function unparkFailedInbox(t){const n=d(t,"inbox");let e;try{e=v(n)}catch{return 0}let i=0;for(const o of e){if(!o.endsWith(INBOX_FAILED_SUFFIX))continue;const r=d(n,`${o.slice(0,-INBOX_FAILED_SUFFIX.length)}${INBOX_CLAIM_SUFFIX}`);if(!I(r))try{h(d(n,o),r),i++}catch{}}return i}export function handleIngestedRecords(t,n){for(const e of n){const i=t.projects.getById(e.projectId);if(!i)continue;t.dashboardRate?.record();let o=null;try{o=JSON.parse(e.input.payload)}catch{o=null}if(t.bus?.emit({kind:"event.ingested",eventId:e.eventId,projectId:i.id,sessionId:e.input.sessionId??null,eventType:e.input.eventType,...O(o),at:e.input.createdAt??new Date().toISOString()}),e.input.sessionId){t.questionTracker?.onEvent({sessionId:e.input.sessionId,source:e.input.source,payload:o}),t.sideQuestions?.onEvent({sessionId:e.input.sessionId,source:e.input.source,eventType:e.input.eventType,payload:o,eventId:e.eventId}),t.watchEngine?.onEvent({sessionId:e.input.sessionId,eventType:e.input.eventType,source:e.input.source}),t.orchestrationEngine?.onEvent({sessionId:e.input.sessionId,eventType:e.input.eventType,source:e.input.source}),e.messaging&&t.messagePipe?.noteInboxSocket?.(e.input.sessionId,e.messaging),t.sessionProbe?.noteTranscript(e.input.sessionId,o?.transcriptPath??null);const r=A(e.input.eventType,o?.raw);r&&t.sessionProbe?.noteModel?.(e.input.sessionId,r.to);const c=W(e.input.eventType,o?.raw);c&&t.sessionProbe?.sessionStarted?.(e.input.sessionId,c.model);const a=M(o?.raw);a&&t.sessionProbe?.noteEffort?.(e.input.sessionId,a);const p=D(o?.raw);if(p&&t.sessionProbe?.noteMode?.(e.input.sessionId,p),e.terminalEnv||g(e.input.source)){const s=e.input.source;g(s)&&t.paneEnvSource?.(s)==="launch"?t.messagePipe?.claimPendingOrigin?.(e.input.sessionId,s,e.projectId):e.terminalEnv&&t.messagePipe?.notePaneEnv?.(e.input.sessionId,e.terminalEnv)}if(e.input.eventType==="UserPromptSubmit"){const s=t.messagePipe?.onSessionPrompt?.(e.input.sessionId,J(o)??"",e.eventId)??[];s.length>0&&t.uploads?.linkToEvent(e.eventId,s)}else t.messagePipe?.noteActivity?.(e.input.sessionId);const u=g(e.input.source)?F[e.input.source].sessionExit:null;u!==null&&e.input.eventType===u&&(t.messagePipe?.sessionExited?.(e.input.sessionId),t.terminalTopologyKick?.()),t.messagePipe?.hasQueued(e.input.sessionId)&&t.messagePipe.flushSession(e.input.sessionId)}t.dispatcher&&t.dispatcher.onIngest({eventId:e.eventId,project:i,sessionId:e.input.sessionId??null,payload:o??{eventType:e.input.eventType,toolName:null,toolInput:null,toolResponse:null,cwd:null,transcriptPath:null,raw:null},source:e.input.source,deliveredTitle:e.deliveredTitle??null}).then(r=>{r.deferred&&e.input.sessionId&&X(t.hooksDir,i.token,[{sessionId:e.input.sessionId,text:r.deferred}])}).catch(()=>{})}}function J(t){const n=t?.raw;return typeof n?.prompt=="string"&&n.prompt?n.prompt:null}export function startInboxWorker(t){return new P(new URL(import.meta.url),{workerData:{inboxWorker:!0,...t}})}if(!T&&k?.inboxWorker===!0){const t=k,n=_(t.dbPath),e=x(),i=new N(n),o={hooksDir:t.hooksDir,projects:i,hookEvents:new C(n),hookSessions:new B(n),adapters:e.byCapability("events").flatMap(s=>s.events??[])};m?.on("message",s=>{s?.type==="synthetic-sessions"&&Array.isArray(s.ids)&&U(s.ids)});const r=new Map,c=()=>{try{const s=drainInboxOnce(o,r);s.length>0&&m?.postMessage(s)}catch(s){console.error("[weave] inbox drain failed:",s)}};c(),setInterval(c,t.tickMs??INBOX_TICK_MS);const a={projects:i,hookEvents:o.hookEvents,hookSessions:o.hookSessions,adapters:o.adapters,logsDir:R(),sources:e.byCapability("logs").flatMap(s=>s.logs??[])};let p=!1;const u=()=>{p||(p=!0,pollLogsOnce(a).then(s=>{s.length>0&&m?.postMessage(s)}).catch(s=>console.error("[weave] log poll failed:",s)).finally(()=>{p=!1}))};a.sources.length>0&&(u(),setInterval(u,LOGS_TICK_MS))}
4
+ `)}catch{}return r}function b(n,o,e){const i=n.hookEvents.insertMany(e),s=new Map;for(const r of e){if(!r.sessionId)continue;const c=s.get(r.sessionId),p=r.createdAt;(!s.has(r.sessionId)||p&&(!c||p>c))&&s.set(r.sessionId,p)}for(const[r,c]of s)n.hookSessions.touch(r,o.id,c);return i}export const LOGS_TICK_MS=1e3;export async function pollLogsOnce(n){if(n.sources.length===0)return[];const o=new Map;for(const i of n.projects.list()){const s=await C(i.path);n.sources.some(r=>s.includes(r.harness))&&o.set(i.path,i)}if(o.size===0)return[];const e=[];for(const i of n.sources){const s=n.adapters.find(p=>p.source===i.harness);if(!s)continue;let r;try{r=await i.poll({stateDir:f(n.logsDir,i.harness),cwdWhitelist:[...o.keys()]})}catch{continue}const c=new Map;for(const p of r){const u=p.report.cwd?o.get(p.report.cwd):void 0;if(u)try{const a=s.normalize(p.report,u.id);a.createdAt=p.at;const t=c.get(u);t?t.push(a):c.set(u,[a])}catch{}}for(const[p,u]of c)try{const a=b(n,p,u);for(let t=0;t<u.length;t++)e.push({eventId:a[t],projectId:p.id,input:u[t]})}catch(a){console.error("[weave] log ingest failed:",a)}}return e}function z(n){try{const o=JSON.parse(n);if(!o||typeof o.token!="string"||!o.token||!o.report||typeof o.report!="object")return null;const e=o.messaging?.socket,i=typeof e=="string"&&e?{socket:e,token:typeof o.messaging?.token=="string"?o.messaging.token:null}:null;return{token:o.token,report:o.report,messaging:i,terminalEnv:K(o.terminal)}}catch{return null}}function K(n){if(typeof n!="object"||n===null)return null;const o={};for(const[e,i]of Object.entries(n))typeof i=="string"&&i&&(o[e]=i);return Object.keys(o).length>0?o:null}export function unparkFailedInbox(n){const o=f(n,"inbox");let e;try{e=I(o)}catch{return 0}let i=0;for(const s of e){if(!s.endsWith(INBOX_FAILED_SUFFIX))continue;const r=f(o,`${s.slice(0,-INBOX_FAILED_SUFFIX.length)}${INBOX_CLAIM_SUFFIX}`);if(!v(r))try{g(f(o,s),r),i++}catch{}}return i}export function handleIngestedRecords(n,o){for(const e of o){const i=n.projects.getById(e.projectId);if(!i)continue;n.dashboardRate?.record();let s=null;try{s=JSON.parse(e.input.payload)}catch{s=null}if(n.bus?.emit({kind:"event.ingested",eventId:e.eventId,projectId:i.id,sessionId:e.input.sessionId??null,eventType:e.input.eventType,...P(s),at:e.input.createdAt??new Date().toISOString()}),e.input.sessionId){n.questionTracker?.onEvent({sessionId:e.input.sessionId,source:e.input.source,payload:s}),n.sideQuestions?.onEvent({sessionId:e.input.sessionId,source:e.input.source,eventType:e.input.eventType,payload:s,eventId:e.eventId}),n.watchEngine?.onEvent({sessionId:e.input.sessionId,eventType:e.input.eventType,source:e.input.source}),n.orchestrationEngine?.onEvent({sessionId:e.input.sessionId,eventType:e.input.eventType,source:e.input.source}),e.messaging&&n.messagePipe?.noteInboxSocket?.(e.input.sessionId,e.messaging),n.sessionProbe?.noteTranscript(e.input.sessionId,s?.transcriptPath??null);const r=L(e.input.eventType,s?.raw);r&&n.sessionProbe?.noteModel?.(e.input.sessionId,r.to);const c=A(e.input.eventType,s?.raw);c&&n.sessionProbe?.sessionStarted?.(e.input.sessionId,c.model);const p=O(s?.raw);p&&n.sessionProbe?.noteEffort?.(e.input.sessionId,p);const u=D(s?.raw);if(u&&n.sessionProbe?.noteMode?.(e.input.sessionId,u),e.terminalEnv||m(e.input.source)){const t=e.input.source;m(t)&&n.paneEnvSource?.(t)==="launch"?n.messagePipe?.claimPendingOrigin?.(e.input.sessionId,t,e.projectId):e.terminalEnv&&n.messagePipe?.notePaneEnv?.(e.input.sessionId,e.terminalEnv)}if(e.input.eventType==="UserPromptSubmit"){const t=n.messagePipe?.onSessionPrompt?.(e.input.sessionId,J(s)??"",e.eventId)??[];t.length>0&&n.uploads?.linkToEvent(e.eventId,t)}else n.messagePipe?.noteActivity?.(e.input.sessionId);const a=m(e.input.source)?W[e.input.source].sessionExit:null;a!==null&&e.input.eventType===a&&(n.messagePipe?.sessionExited?.(e.input.sessionId),n.terminalTopologyKick?.()),n.messagePipe?.hasQueued(e.input.sessionId)&&n.messagePipe.flushSession(e.input.sessionId)}n.dispatcher&&n.dispatcher.onIngest({eventId:e.eventId,project:i,sessionId:e.input.sessionId??null,payload:s??{eventType:e.input.eventType,toolName:null,toolInput:null,toolResponse:null,cwd:null,transcriptPath:null,raw:null},source:e.input.source,deliveredTitle:e.deliveredTitle??null}).then(r=>{r.deferred&&e.input.sessionId&&X(n.hooksDir,i.token,[{sessionId:e.input.sessionId,text:r.deferred}])}).catch(()=>{})}}function J(n){const o=n?.raw;return typeof o?.prompt=="string"&&o.prompt?o.prompt:null}export function startInboxWorker(n){return new x(new URL(import.meta.url),{workerData:{inboxWorker:!0,...n}})}if(!E&&k?.inboxWorker===!0){const n=k,o=F(n.dbPath),e=M(),i=new N(o),s={hooksDir:n.hooksDir,projects:i,hookEvents:new R(o),hookSessions:new B(o),adapters:e.byCapability("events").flatMap(t=>t.events??[])};h?.on("message",t=>{t?.type==="synthetic-sessions"&&Array.isArray(t.ids)&&U(t.ids)});const r=new Map,c=()=>{try{const t=drainInboxOnce(s,r);t.length>0&&h?.postMessage(t)}catch(t){console.error("[weave] inbox drain failed:",t)}};c(),setInterval(c,n.tickMs??INBOX_TICK_MS);const p={projects:i,hookEvents:s.hookEvents,hookSessions:s.hookSessions,adapters:s.adapters,logsDir:_(),sources:e.byCapability("logs").flatMap(t=>t.logs??[])};let u=!1;const a=()=>{u||(u=!0,pollLogsOnce(p).then(t=>{t.length>0&&h?.postMessage(t)}).catch(t=>console.error("[weave] log poll failed:",t)).finally(()=>{u=!1}))};p.sources.length>0&&(a(),setInterval(a,LOGS_TICK_MS))}
@@ -1 +1 @@
1
- import i from"node:path";export const DISPATCH_MARKER="<!--weave-dispatch-->";const c=t=>process.platform==="win32"?t.toLowerCase():t;export function normalizePosix(t){return t.replace(/\\/g,"/")}function p(t){return/[.+^${}()|[\]\\]/.test(t)?`\\${t}`:t}const s=new Map;export function globToRegex(t){const o=s.get(t);if(o)return o;let n="";for(let r=0;r<t.length;r++){const l=t[r];l==="*"?t[r+1]==="*"?(r++,t[r+1]==="/"?(r++,n+="(?:.*/)?"):n+=".*"):n+="[^/]*":l==="?"?n+="[^/]":n+=p(l)}const e=new RegExp(`^${n}$`,"i");return s.set(t,e),e}export function matchGlob(t,o){return globToRegex(o).test(normalizePosix(t))}export function extractFilePath(t){if(typeof t!="object"||t===null)return null;const o=t;for(const n of["file_path","notebook_path","filePath"]){const e=o[n];if(typeof e=="string"&&e.length>0)return e}return null}function u(t,o){const n=c(normalizePosix(t)),e=c(normalizePosix(o).replace(/\/+$/,""));return n===e||n.startsWith(`${e}/`)}export function isCrossProjectPath(t,o,n){const e=c(normalizePosix(o));return u(t,o)?!1:n.some(r=>c(normalizePosix(r))!==e&&u(t,r))}export function renderTemplate(t,o){return t.replace(/\{(\w+)\}/g,(n,e)=>{const r=o[e];return r==null?n:String(r)})}export function templateVars(t){return{event:t.event,tool:t.tool,file:t.filePath?normalizePosix(t.filePath):null,cwd:t.cwd?normalizePosix(t.cwd):null,session:t.session,project:t.project,rule:t.rule}}export function matchesAnyGlob(t,o){return o.some(n=>matchGlob(t,n))}export function projectLabel(t){return i.basename(normalizePosix(t).replace(/\/+$/,""))||t}
1
+ import f from"node:path";export const DISPATCH_MARKER="<!--weave-dispatch-->";const s=e=>process.platform==="win32"?e.toLowerCase():e;export function normalizePosix(e){return e.replace(/\\/g,"/")}function a(e){return/[.+^${}()|[\]\\]/.test(e)?`\\${e}`:e}const l=new Map;export function globToRegex(e){const r=l.get(e);if(r)return r;let t="";for(let n=0;n<e.length;n++){const c=e[n];c==="*"?e[n+1]==="*"?(n++,e[n+1]==="/"?(n++,t+="(?:.*/)?"):t+=".*"):t+="[^/]*":c==="?"?t+="[^/]":t+=a(c)}const o=new RegExp(`^${t}$`,"i");return l.set(e,o),o}export function matchGlob(e,r){return globToRegex(r).test(normalizePosix(e))}export function extractFilePath(e){if(typeof e!="object"||e===null)return null;const r=e;for(const t of["file_path","notebook_path","filePath"]){const o=r[t];if(typeof o=="string"&&o.length>0)return o}return null}function i(e,r){const t=s(normalizePosix(e)),o=s(normalizePosix(r).replace(/\/+$/,""));return t===o||t.startsWith(`${o}/`)}export function isCrossProjectPath(e,r,t){const o=s(normalizePosix(r));return i(e,r)?!1:t.some(n=>s(normalizePosix(n))!==o&&i(e,n))}export function renderTemplate(e,r){return e.replace(/\{(\w+)\}/g,(t,o)=>{const n=r[o];return n==null?t:String(n)})}export function templateVars(e){return{event:e.event,tool:e.tool,file:e.filePath?normalizePosix(e.filePath):null,cwd:e.cwd?normalizePosix(e.cwd):null,session:e.session,project:e.project,rule:e.rule}}export function matchesAnyGlob(e,r){return r.some(t=>matchGlob(e,t))}export function projectLabel(e){return f.basename(normalizePosix(e).replace(/\/+$/,""))||e}