@weavecode/weave 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/.editorconfig +1 -1
  2. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/CHANGELOG.md +45 -22
  3. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/README.md +26 -1
  4. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/dist/qs.js +27 -27
  5. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/eslint.config.mjs +61 -50
  6. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/formats.js +7 -2
  7. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/parse.js +13 -6
  8. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/stringify.js +5 -3
  9. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/utils.js +15 -7
  10. package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/package.json +6 -6
  11. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/dist/common.js +2 -2
  12. package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/package.json +2 -2
  13. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/README.md +2 -3
  14. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +8 -3
  15. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/index.js +1 -1
  16. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/route/index.js +3 -1
  17. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/jsx/base.js +1 -1
  18. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +8 -0
  19. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/serve-static/index.js +3 -1
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/trie-router/node.js +2 -2
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +11 -6
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +8 -3
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/index.js +1 -1
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/route/index.js +3 -1
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/jsx/base.js +1 -1
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +8 -0
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/serve-static/index.js +3 -1
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/trie-router/node.js +2 -2
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +1 -1
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +1 -1
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +1 -1
  32. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +1 -1
  33. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +1 -1
  34. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +1 -1
  35. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +1 -1
  36. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +1 -1
  37. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +1 -1
  38. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +1 -1
  39. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/helper/testing/index.d.ts +2 -1
  40. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/hono-base.d.ts +21 -9
  41. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/index.d.ts +1 -1
  42. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/components.d.ts +2 -2
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/context.d.ts +2 -2
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/dom/components.d.ts +2 -2
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/dom/css.d.ts +2 -2
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/jsx/streaming.d.ts +4 -3
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +2 -1
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +3 -3
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +3 -3
  50. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/ipaddr.d.ts +1 -1
  51. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +11 -6
  52. package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
  53. package/node_modules/@weavecode/cli/dist/cli.js +4 -4
  54. package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
  55. package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
  56. package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
  57. package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
  58. package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
  59. package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
  60. package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
  61. package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
  62. package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
  63. package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +2 -1
  64. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +14 -0
  65. package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +4 -3
  66. package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
  67. package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
  68. package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
  69. package/node_modules/@weavecode/cli/dist/init/executor.d.ts +5 -4
  70. package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
  71. package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
  72. package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
  73. package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
  74. package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
  75. package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
  76. package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
  77. package/node_modules/@weavecode/cli/dist/init/provision.d.ts +25 -0
  78. package/node_modules/@weavecode/cli/dist/init/provision.js +1 -0
  79. package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
  80. package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
  81. package/node_modules/@weavecode/cli/dist/parser.js +1 -1
  82. package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
  83. package/node_modules/@weavecode/cli/dist/statusline/mock-input.js +1 -1
  84. package/node_modules/@weavecode/cli/dist/statusline/preview.js +2 -2
  85. package/node_modules/@weavecode/cli/package.json +5 -5
  86. package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
  87. package/node_modules/@weavecode/core/dist/harness.d.ts +13 -1
  88. package/node_modules/@weavecode/core/dist/harness.js +1 -1
  89. package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
  90. package/node_modules/@weavecode/core/dist/index.js +1 -1
  91. package/node_modules/@weavecode/core/dist/platform.js +1 -1
  92. package/node_modules/@weavecode/core/dist/types.js +1 -1
  93. package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
  94. package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
  95. package/node_modules/@weavecode/core/package.json +1 -1
  96. package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
  97. package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
  98. package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -3
  99. package/node_modules/@weavecode/harness/dist/claude/config.d.ts +9 -0
  100. package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
  101. package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
  102. package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
  103. package/node_modules/@weavecode/harness/dist/claude/event-source.d.ts +2 -0
  104. package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
  105. package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
  106. package/node_modules/@weavecode/harness/dist/claude/index.d.ts +4 -2
  107. package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
  108. package/node_modules/@weavecode/harness/dist/claude/liveness.d.ts +64 -0
  109. package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -0
  110. package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
  111. package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
  112. package/node_modules/@weavecode/harness/dist/claude/model-aliases.d.ts +4 -0
  113. package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
  114. package/node_modules/@weavecode/harness/dist/claude/narration.d.ts +13 -0
  115. package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -0
  116. package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
  117. package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
  118. package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
  119. package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
  120. package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
  121. package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
  122. package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
  123. package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
  124. package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
  125. package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +14 -14
  126. package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
  127. package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
  128. package/node_modules/@weavecode/harness/dist/claude/transcript.d.ts +13 -0
  129. package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -6
  130. package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
  131. package/node_modules/@weavecode/harness/dist/codex/capture.d.ts +1 -2
  132. package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
  133. package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
  134. package/node_modules/@weavecode/harness/dist/codex/config.d.ts +10 -0
  135. package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
  136. package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
  137. package/node_modules/@weavecode/harness/dist/codex/event-source.d.ts +1 -1
  138. package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
  139. package/node_modules/@weavecode/harness/dist/codex/images.d.ts +2 -0
  140. package/node_modules/@weavecode/harness/dist/codex/images.js +1 -0
  141. package/node_modules/@weavecode/harness/dist/codex/index.d.ts +13 -2
  142. package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
  143. package/node_modules/@weavecode/harness/dist/codex/liveness.d.ts +38 -0
  144. package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -0
  145. package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
  146. package/node_modules/@weavecode/harness/dist/codex/messaging.d.ts +7 -3
  147. package/node_modules/@weavecode/harness/dist/codex/messaging.js +3 -3
  148. package/node_modules/@weavecode/harness/dist/codex/narration.d.ts +10 -0
  149. package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -0
  150. package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
  151. package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
  152. package/node_modules/@weavecode/harness/dist/codex/provision.d.ts +12 -0
  153. package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -0
  154. package/node_modules/@weavecode/harness/dist/codex/questions.d.ts +9 -0
  155. package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -0
  156. package/node_modules/@weavecode/harness/dist/codex/resume.js +1 -1
  157. package/node_modules/@weavecode/harness/dist/codex/rollout.d.ts +8 -5
  158. package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
  159. package/node_modules/@weavecode/harness/dist/codex/side-question.d.ts +12 -0
  160. package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -0
  161. package/node_modules/@weavecode/harness/dist/codex/titles.d.ts +8 -0
  162. package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -0
  163. package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
  164. package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
  165. package/node_modules/@weavecode/harness/dist/driver.d.ts +162 -8
  166. package/node_modules/@weavecode/harness/dist/driver.js +1 -1
  167. package/node_modules/@weavecode/harness/dist/index.d.ts +1 -0
  168. package/node_modules/@weavecode/harness/dist/index.js +1 -1
  169. package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
  170. package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
  171. package/node_modules/@weavecode/harness/dist/install.d.ts +9 -0
  172. package/node_modules/@weavecode/harness/dist/install.js +1 -0
  173. package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
  174. package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
  175. package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
  176. package/node_modules/@weavecode/harness/dist/zcode/assets.js +1 -1
  177. package/node_modules/@weavecode/harness/dist/zcode/capture.js +3 -3
  178. package/node_modules/@weavecode/harness/dist/zcode/mcp.js +2 -2
  179. package/node_modules/@weavecode/harness/package.json +2 -2
  180. package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
  181. package/node_modules/@weavecode/server/dist/config/profiles.d.ts +10 -1
  182. package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
  183. package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
  184. package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
  185. package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
  186. package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
  187. package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
  188. package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
  189. package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
  190. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.d.ts +4 -55
  191. package/node_modules/@weavecode/server/dist/daemon/claude-liveness.js +1 -1
  192. package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
  193. package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
  194. package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
  195. package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
  196. package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
  197. package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
  198. package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
  199. package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
  200. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.d.ts +2 -0
  201. package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
  202. package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
  203. package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
  204. package/node_modules/@weavecode/server/dist/daemon/liveness.d.ts +7 -0
  205. package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -0
  206. package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
  207. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.d.ts +28 -0
  208. package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -0
  209. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.d.ts +16 -0
  210. package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -0
  211. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.d.ts +20 -0
  212. package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +12 -0
  213. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.d.ts +23 -0
  214. package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -0
  215. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.d.ts +19 -0
  216. package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -0
  217. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.d.ts +87 -0
  218. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -0
  219. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.d.ts +45 -0
  220. package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -0
  221. package/node_modules/@weavecode/server/dist/daemon/opener/backend.d.ts +115 -0
  222. package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -0
  223. package/node_modules/@weavecode/server/dist/daemon/opener/launch.js +1 -1
  224. package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
  225. package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
  226. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.d.ts +8 -5
  227. package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
  228. package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
  229. package/node_modules/@weavecode/server/dist/daemon/opener.d.ts +23 -120
  230. package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -13
  231. package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
  232. package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +17 -2
  233. package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -1
  234. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.d.ts +2 -0
  235. package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
  236. package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
  237. package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
  238. package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
  239. package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
  240. package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
  241. package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
  242. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.d.ts +6 -0
  243. package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -0
  244. package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
  245. package/node_modules/@weavecode/server/dist/daemon/routes/search.d.ts +38 -0
  246. package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -0
  247. package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
  248. package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
  249. package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
  250. package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
  251. package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
  252. package/node_modules/@weavecode/server/dist/daemon/server.d.ts +8 -2
  253. package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
  254. package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +10 -1
  255. package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
  256. package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
  257. package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
  258. package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
  259. package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
  260. package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
  261. package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
  262. package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
  263. package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
  264. package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
  265. package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
  266. package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
  267. package/node_modules/@weavecode/server/dist/db/db.js +5 -2
  268. package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
  269. package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
  270. package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +10 -0
  271. package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
  272. package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
  273. package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
  274. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.d.ts +20 -0
  275. package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
  276. package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
  277. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.d.ts +7 -1
  278. package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
  279. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.d.ts +4 -4
  280. package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
  281. package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
  282. package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
  283. package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
  284. package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
  285. package/node_modules/@weavecode/server/dist/hooks/dispatcher.d.ts +5 -0
  286. package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
  287. package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
  288. package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
  289. package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
  290. package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
  291. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.d.ts +15 -0
  292. package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
  293. package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
  294. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.d.ts +64 -6
  295. package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +3 -2
  296. package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
  297. package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
  298. package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
  299. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.d.ts +5 -0
  300. package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
  301. package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
  302. package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
  303. package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
  304. package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
  305. package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
  306. package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
  307. package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
  308. package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
  309. package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
  310. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.d.ts +2 -0
  311. package/node_modules/@weavecode/server/dist/hooks/session-sweeper.js +1 -1
  312. package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
  313. package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
  314. package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
  315. package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
  316. package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
  317. package/node_modules/@weavecode/server/dist/index.d.ts +1 -0
  318. package/node_modules/@weavecode/server/dist/index.js +1 -1
  319. package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
  320. package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
  321. package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
  322. package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
  323. package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
  324. package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
  325. package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
  326. package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
  327. package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
  328. package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
  329. package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
  330. package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
  331. package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
  332. package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
  333. package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
  334. package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
  335. package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
  336. package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
  337. package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
  338. package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
  339. package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
  340. package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
  341. package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
  342. package/node_modules/@weavecode/server/dist/market/import.js +2 -2
  343. package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
  344. package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
  345. package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
  346. package/node_modules/@weavecode/server/dist/registry.js +2 -2
  347. package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
  348. package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +19 -1
  349. package/node_modules/@weavecode/server/dist/repositories/hook-events.js +9 -3
  350. package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
  351. package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
  352. package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
  353. package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
  354. package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
  355. package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
  356. package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
  357. package/node_modules/@weavecode/server/dist/repositories/sessions.d.ts +12 -2
  358. package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
  359. package/node_modules/@weavecode/server/dist/repositories/side-questions.d.ts +7 -0
  360. package/node_modules/@weavecode/server/dist/repositories/side-questions.js +8 -5
  361. package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
  362. package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
  363. package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
  364. package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
  365. package/node_modules/@weavecode/server/dist/surfaces.d.ts +8 -1
  366. package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
  367. package/node_modules/@weavecode/server/dist/version.d.ts +1 -11
  368. package/node_modules/@weavecode/server/dist/version.js +1 -1
  369. package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
  370. package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
  371. package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
  372. package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
  373. package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
  374. package/node_modules/@weavecode/server/package.json +4 -4
  375. package/node_modules/@weavecode/server/web/dist/assets/{abnfDiagram-WEYOIA3C-etRkSvQM.js → abnfDiagram-WEYOIA3C-DA-K085F.js} +1 -1
  376. package/node_modules/@weavecode/server/web/dist/assets/{arc-FxRZALAZ.js → arc-BI1jnmdZ.js} +1 -1
  377. package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-5OxZ-ffz.js → architectureDiagram-ZHVYKT53-DbdBgric.js} +1 -1
  378. package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-C-CgMF0O.js → blockDiagram-RJAE7QA3-BPRBmzb-.js} +1 -1
  379. package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-B6TqN1Pw.js → c4Diagram-XDPPPE54-C4D5sRs1.js} +1 -1
  380. package/node_modules/@weavecode/server/web/dist/assets/channel-DcCJrvon.js +1 -0
  381. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-Bdzr5RRj.js → chunk-2E7WHVMD-9ZSKiNU3.js} +1 -1
  382. package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-gBZASjAC.js → chunk-2Q5K7J3B-i0AOjw_8.js} +1 -1
  383. package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DSlUhKMw.js → chunk-4EMNKR2T-DTpLfX1H.js} +1 -1
  384. package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-BDQ6zpGR.js → chunk-55XCU76K-COQYRD4q.js} +1 -1
  385. package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-DPnewKbl.js → chunk-5VM5RSS4-VsftEbvo.js} +1 -1
  386. package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-DagmT8Cc.js → chunk-JWPE2WC7-DonektJN.js} +1 -1
  387. package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-Da_2PxfM.js → chunk-VQ5W62QI-CaKUwuul.js} +1 -1
  388. package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-Cdaysois.js → chunk-XXDRQBXY-DXH3D_MT.js} +1 -1
  389. package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-CvgYfbjU.js → chunk-ZCHMQSOR-COwyAuGn.js} +2 -2
  390. package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-ahplYD2h.js → classDiagram-v2-4MYWR3UA-DEvMZ6mX.js} +1 -1
  391. package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-DFyUfgKj.js → cose-bilkent-JH36ORCC-6JBJHfH6.js} +1 -1
  392. package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-mr2qRwod.js → cynefin-EF2NZ3EQ-C4GM4sjT.js} +1 -1
  393. package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-BC26VqNp.js → cynefinDiagram-WF24UDRP-Cqgi0MBP.js} +1 -1
  394. package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-DoKn_P1x.js → dagre-NK4GIZVX-CljrnkCY.js} +1 -1
  395. package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-C9WfEmt3.js → diagram-CBK3MWTC-C3PyOj5J.js} +1 -1
  396. package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-D4Ibieda.js → diagram-I5XIIV2D-I5brQlaZ.js} +1 -1
  397. package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-wsLbYLi0.js → diagram-ODIL2UCW-BX9uFNbU.js} +1 -1
  398. package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-DBioMmDk.js → diagram-PFBEJUXE-y7D-VmqJ.js} +1 -1
  399. package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-Cl5gKsWm.js → diagram-RJA3I4VV-DLUL8W42.js} +1 -1
  400. package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-BSXOaZic.js → diagram-TYUNFSNR-DLCC3ILi.js} +1 -1
  401. package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-CJIGOag6.js → ebnfDiagram-V4P3TTPT-D7vALia7.js} +1 -1
  402. package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-D6nd2OVX.js → elk-QONTBCTQ-Ct2_hatz.js} +1 -1
  403. package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-gmXjWsuF.js → erDiagram-KYQIGQAA-DxLai58T.js} +1 -1
  404. package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-DWAiZ43K.js → flowDiagram-IUGLLWBU-AWn2IHrF.js} +1 -1
  405. package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-De4v6Wtt.js → ganttDiagram-R7GPNTJY-DmRHd4Wz.js} +1 -1
  406. package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-CouLBWOB.js → gitGraphDiagram-PDYL7XHY-Ccj-t3zg.js} +1 -1
  407. package/node_modules/@weavecode/server/web/dist/assets/index-BSxzia7U.js +1031 -0
  408. package/node_modules/@weavecode/server/web/dist/assets/index-CEpJpR7P.css +11 -0
  409. package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-CeMCdduD.js → infoDiagram-MVDRKAX5-BHquFlQa.js} +1 -1
  410. package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-DK6hETwg.js → ishikawaDiagram-HPEHV2GE-CVogEbdm.js} +1 -1
  411. package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-BcgwTlST.js → journeyDiagram-BOSHW7O7-DC9XG9oh.js} +1 -1
  412. package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CTVMJNz2.js → kanban-definition-FNSA4HC5-C_eu7DC_.js} +1 -1
  413. package/node_modules/@weavecode/server/web/dist/assets/{linear-CqQf5eWO.js → linear-keTbWHJ-.js} +1 -1
  414. package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-B6KZaljU.js → mermaid.core-4sbg0MnY.js} +4 -4
  415. package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-cpKvrQTI.js → mindmap-definition-6OY57UG3-kMQS0S2l.js} +1 -1
  416. package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-Bv2bNqMZ.js → pegDiagram-ECIUJNBX-DcUFoEwP.js} +1 -1
  417. package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-CXOnA429.js → pieDiagram-GNMPY74T-BQJ7WDCx.js} +1 -1
  418. package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-BFDUpWZb.js → quadrantDiagram-D57K4MC3-C7Oi1-sq.js} +1 -1
  419. package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-BHoDSO0D.js → railroadDiagram-Y72NRBL7-CEF2QbOF.js} +1 -1
  420. package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-B8JGji7q.js → requirementDiagram-EQYSW5RA-CTjjFS7X.js} +1 -1
  421. package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BbE2-6ZM.js → sankeyDiagram-SY24JHO5-j0S5kubS.js} +1 -1
  422. package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-DwK4X2MT.js → sequenceDiagram-BLEHNHQU-B76EsZp4.js} +1 -1
  423. package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-CY10zRMe.js → sizeCapture-INFHLROL-r0DZuqAy.js} +1 -1
  424. package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-32t4Zx8b.js → stateDiagram-v2-A6IESKWZ-B4DR9LHz.js} +1 -1
  425. package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-CZlYQ8_g.js → swimlanes-B3ENRKFQ-Dbcl85ro.js} +1 -1
  426. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-CZ_6SSBd.js +8 -0
  427. package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-8VsB-Jwg.js → timeline-definition-JXYKGLGB-BlBXXRNf.js} +1 -1
  428. package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-CKOTONay.js → usecaseDiagram-WPOLBNNX-Ck1M0dpc.js} +1 -1
  429. package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-BzrNjxtm.js → vennDiagram-Q3Y3IDCW-N8B-ohWk.js} +1 -1
  430. package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-CrSd-v8I.js → wardleyDiagram-IVAIDKWA-DX-AMXq_.js} +1 -1
  431. package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-t9cV9_9b.js → xychartDiagram-4URNHDU4-4fgL48Yl.js} +1 -1
  432. package/node_modules/@weavecode/server/web/dist/index.html +5 -4
  433. package/node_modules/@weavecode/templates/package.json +2 -2
  434. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/node_modules/@peculiar/asn1-x509-attr/package.json +3 -3
  435. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-cms/package.json +4 -4
  436. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-csr/package.json +3 -3
  437. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-ecc/package.json +3 -3
  438. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-pfx/package.json +5 -5
  439. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-pkcs8/package.json +3 -3
  440. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/node_modules/@peculiar/asn1-x509-attr/package.json +3 -3
  441. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-pkcs9/package.json +7 -7
  442. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-rsa/package.json +3 -3
  443. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-schema/package.json +1 -1
  444. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/build/cjs/time.js +1 -1
  445. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/build/es2015/time.js +1 -1
  446. package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/@peculiar/asn1-x509/package.json +2 -2
  447. package/package.json +6 -6
  448. package/node_modules/@weavecode/server/web/dist/assets/channel-Dv4QUMOJ.js +0 -1
  449. package/node_modules/@weavecode/server/web/dist/assets/index-BXhLerZ4.js +0 -1008
  450. package/node_modules/@weavecode/server/web/dist/assets/index-BYRxC-Zz.css +0 -11
  451. package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-BlIxQLON.js +0 -8
@@ -1 +1 @@
1
- import{existsSync as j}from"node:fs";import{readFile as $,readdir as C}from"node:fs/promises";import d from"node:path";import{pathToFileURL as D}from"node:url";import{watch as P}from"chokidar";import{builtinRulesDir as W}from"../market/builtin.js";import{HARNESS_EVENT_UNION as I,HookRuleSchema as B,PluginRuleEntrySchema as T,WEAVE_PLUGIN_MANIFEST as A,WeavePluginManifestSchema as k}from"@weavecode/core";import{getDataRoot as O,getPluginsDir as M}from"../db/paths.js";import{marketLibraryRoots as N}from"../market/resolve.js";import{validateHandler as x}from"./registry.js";import{builtinToolkitRoot as H,discoverToolkitSources as U,discoverWeavePackDirs as L}from"./toolkit-scan.js";export function createPluginLogger(u){return{debug:e=>console.debug(`[plugin:${u}] ${e}`),info:e=>console.info(`[plugin:${u}] ${e}`),warn:e=>console.warn(`[plugin:${u}] ${e}`),error:e=>console.error(`[plugin:${u}] ${e}`)}}const R="@file:";function _(){return d.resolve(H())}export class WeavePluginLoader{deps;handlers=new Map;configs=new Map;plugins=new Map;subscribers=new Map;roots=new Map;watchStop;constructor(e){this.deps=e}list(){return[...this.plugins.values()]}getHandler(e,s){return this.handlers.get(`${e}:${s}`)}getConfig(e){return this.configs.get(e)??{}}async loadRoot(e,s,n){const i=d.resolve(e);this.roots.set(i,{scope:s,projectId:n});let o;try{o=await C(i)}catch{return[]}const t=this.priorIdsUnder(i),c=[];for(const p of o){const l=d.join(i,p);if(this.roots.has(d.resolve(l))||d.resolve(l)===_())continue;const g=await this.loadOne(l,s,n,p);this.plugins.set(g.id,g),c.push(g)}return this.finalizeScan(t,c)}async loadToolkitRoot(e,s,n){const i=d.resolve(e);this.roots.set(i,{scope:s,projectId:n,deep:!0});const o=await L(i),t=this.priorIdsUnder(i),c=[];for(const p of o){await this.ensureToolkitDefaultDisabled(p);const l=await this.loadOne(p,s,n,d.basename(p));this.plugins.set(l.id,l),c.push(l)}return this.finalizeScan(t,c)}async ensureToolkitDefaultDisabled(e){try{const s=JSON.parse(await $(d.join(e,A),"utf8"));typeof s.id=="string"&&!this.deps.states.get(s.id)&&this.deps.states.setEnabled(s.id,!1)}catch{}}priorIdsUnder(e){const s=[...this.roots.keys()].filter(n=>n!==e&&n.startsWith(e+d.sep));return new Set([...this.plugins.values()].filter(n=>n.dir.startsWith(e+d.sep)?!s.some(i=>n.dir.startsWith(i+d.sep)):!1).map(n=>n.id))}finalizeScan(e,s){const n=new Set(s.map(o=>o.id));let i=!1;for(const o of e)n.has(o)||(this.deps.rules.removeByPlugin(o),this.unloadHandlers(o),this.configs.delete(o),this.plugins.delete(o),i=!0,this.emitReload({pluginId:o,status:"rejected",ruleCount:0,removed:!0}));(i||s.length>0)&&this.deps.registry.load();for(const o of s)this.emitReload({pluginId:o.id,status:o.status,ruleCount:o.ruleCount,at:new Date().toISOString()});return s}watchRoots(e=1e3){if(this.watchStop)return this.watchStop;const s=new Map,n=[...this.roots.entries()].filter(([i])=>j(i)).map(([i,o])=>{const t=o.deep?6:o.projectId!==null?3:2,c=P(i,{ignoreInitial:!0,depth:t});return c.on("all",()=>{const p=s.get(i);p&&clearTimeout(p),s.set(i,setTimeout(()=>{s.delete(i);const l=this.roots.get(i);l&&(l.deep?this.loadToolkitRoot(i,l.scope,l.projectId):this.loadRoot(i,l.scope,l.projectId)).catch(()=>{})},e))}),c.on("error",()=>{}),c});return this.watchStop=()=>{for(const i of s.values())clearTimeout(i);s.clear();for(const i of n)i.close();this.watchStop=void 0},this.watchStop}async reloadAll(){for(const[e,s]of[...this.roots])await(s.deep?this.loadToolkitRoot(e,s.scope,s.projectId):this.loadRoot(e,s.scope,s.projectId)).catch(()=>{})}stopWatching(){this.watchStop?.()}async rescanRoots(e,s){await registerPluginRoots(this,{libraries:s},e),this.stopWatching(),await this.reloadAll(),this.watchRoots()}setPluginEnabled(e,s){const n=this.plugins.get(e);if(!n)return!1;this.deps.states.setEnabled(e,s);for(const o of this.deps.rules.listByPlugin(e))this.deps.rules.setEnabled(o.id,s);this.deps.registry.load();const i=s?n.error?"rejected":"active":"disabled";return this.plugins.set(e,{...n,status:i}),this.deps.bus?.emit({kind:"plugin.toggled",pluginId:e,enabled:s,at:new Date().toISOString()}),!0}unloadHandlers(e){for(const s of[...this.handlers.keys()])s.startsWith(`${e}:`)&&this.handlers.delete(s);this.subscribers.delete(e)}notifyEvent(e,s,n){for(const[i,o]of this.subscribers){if(!o.events.has(e))continue;const t=this.configs.get(i)??{};(async()=>{await o.sub.onEvent({eventType:e,payload:s,sessionId:n,config:t,logger:createPluginLogger(i)})})().catch(()=>{})}}emitReload(e){this.deps.bus?.emit({kind:"plugin.reloaded",at:new Date().toISOString(),...e})}async loadOne(e,s,n,i){const o=(r,a,h=i,y="0.0.0")=>{const w=this.plugins.get(r);return w&&w.dir===e&&(this.deps.rules.removeByPlugin(r),this.unloadHandlers(r),this.configs.delete(r)),{id:r,name:h,version:y,dir:e,scope:s,projectId:n,status:"rejected",error:a,ruleCount:0}};let t;try{const r=JSON.parse(await $(d.join(e,A),"utf8")),a=k.safeParse(r);if(!a.success)return o(i,`manifest \u6821\u9A8C\u5931\u8D25: ${a.error.issues[0]?.message??""}`);t=a.data}catch(r){return o(i,`manifest \u8BFB\u53D6\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}if(s!=="builtin"&&t.id.startsWith("weave-"))return o(t.id,"id \u4EE5 weave- \u5F00\u5934\u4E3A\u5185\u7F6E\u9884\u8BBE\u547D\u540D\u7A7A\u95F4\u4FDD\u7559",t.name,t.version);const c=this.plugins.get(t.id);if(c&&c.status!=="rejected"&&c.dir!==e)return o(t.id,`\u91CD\u590D\u7684\u63D2\u4EF6 id\uFF08\u5DF2\u7531 ${c.dir} \u6CE8\u518C\uFF09`,t.name,t.version);const p=(t.requires?.events??[]).filter(r=>!I.includes(r));if(p.length>0)return o(t.id,`requires.events \u542B\u672A\u77E5\u4E8B\u4EF6: ${p.join(", ")}`,t.name,t.version);const l=[];for(const r of t.rules)try{const a=JSON.parse(await $(this.resolveWithin(e,r),"utf8"));if(!Array.isArray(a))throw new Error(`${r} \u4E0D\u662F\u6570\u7EC4`);l.push(...a)}catch(a){return o(t.id,`\u89C4\u5219\u6587\u4EF6 ${r}: ${a instanceof Error?a.message:String(a)}`,t.name,t.version)}const g=new Map;for(const r of t.handlers)try{const a=this.resolveWithin(e,r.entry),h=(await import(`${D(a).href}?t=${Date.now()}`)).default;if(!h||typeof h.execute!="function")throw new Error(`${r.entry} \u7684 default \u5BFC\u51FA\u7F3A\u5C11 execute \u51FD\u6570`);if(h.type!==r.type)throw new Error(`${r.entry} \u5BFC\u51FA type="${h.type}" \u4E0E manifest \u58F0\u660E "${r.type}" \u4E0D\u7B26`);g.set(`${t.id}:${r.type}`,h)}catch(a){return o(t.id,`handler ${r.type} \u52A0\u8F7D\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`,t.name,t.version)}let F;if(t.subscribe){const r=t.subscribe.events.filter(a=>!I.includes(a));if(r.length>0)return o(t.id,`subscribe.events \u542B\u672A\u77E5\u4E8B\u4EF6: ${r.join(", ")}`,t.name,t.version);try{const a=this.resolveWithin(e,t.subscribe.entry),h=(await import(`${D(a).href}?t=${Date.now()}`)).default;if(!h||typeof h.onEvent!="function")throw new Error(`${t.subscribe.entry} \u7684 default \u5BFC\u51FA\u7F3A\u5C11 onEvent \u51FD\u6570`);F={events:new Set(t.subscribe.events),sub:h}}catch(a){return o(t.id,`subscriber \u52A0\u8F7D\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`,t.name,t.version)}}const S=[];for(let r=0;r<l.length;r++){const a=l[r],h=typeof a=="object"&&a!==null&&"handler"in a?{...a,handler:z(a.handler,t.id)}:a,y=T.safeParse(h);if(!y.success)return o(t.id,`\u89C4\u5219 #${r} \u6821\u9A8C\u5931\u8D25: ${y.error.issues[0]?.message??""}`,t.name,t.version);const w=y.data;let f=w.handler;if(f.type==="plugin"&&!g.has(`${t.id}:${f.handlerType}`))return o(t.id,`\u89C4\u5219 #${r} \u5F15\u7528\u672A\u58F0\u660E\u7684 handler "${f.handlerType}"`,t.name,t.version);if((f.type==="inject"||f.type==="manual")&&f.template.startsWith(R)){const v=f.template.slice(R.length);try{const b=await $(this.resolveWithin(e,v),"utf8");f={...f,template:b}}catch(b){return o(t.id,`\u89C4\u5219 #${r} \u6A21\u677F ${v}: ${b instanceof Error?b.message:String(b)}`,t.name,t.version)}}let E;try{E=B.parse({...w,handler:f,id:`plugin:${t.id}:${r}`,projectId:n,enabled:w.enabled??!0,priority:w.priority??0,origin:s==="builtin"?"builtin":"plugin",pluginId:t.id}),x(E.source,E.handler)}catch(v){return o(t.id,`\u89C4\u5219 #${r}: ${v instanceof Error?v.message:String(v)}`,t.name,t.version)}S.push(E)}const m=this.deps.states.get(t.id);try{for(const r of S)this.deps.rules.upsertPluginRule(r)}catch(r){return this.deps.rules.removeByPlugin(t.id),o(t.id,`\u89C4\u5219\u5165\u5E93\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`,t.name,t.version)}if(m&&!m.enabled)for(const r of this.deps.rules.listByPlugin(t.id))this.deps.rules.setEnabled(r.id,!1);for(const[r,a]of g)this.handlers.set(r,a);return this.configs.set(t.id,{...t.config??{},...m?.config??{}}),F&&!(m&&!m.enabled)&&this.subscribers.set(t.id,F),{id:t.id,name:t.name,version:t.version,dir:e,scope:s,projectId:n,status:m&&!m.enabled?"disabled":"active",ruleCount:S.length}}resolveWithin(e,s){const n=d.resolve(e),i=d.resolve(n,s);if(i!==n&&!i.startsWith(n+d.sep))throw new Error(`\u8DEF\u5F84\u8D8A\u51FA\u63D2\u4EF6\u76EE\u5F55: ${s}`);return i}}function z(u,e){if(typeof u!="object"||u===null)return u;const s=u;return s.type!=="plugin"||s.pluginId!==void 0?u:{...s,pluginId:e}}export async function registerPluginRoots(u,e,s){const n=[],i=U();if(e.libraries)for(const t of N(e.libraries))i.push({root:t,provenance:"market"});const o=new Set;for(const t of i){const c=d.resolve(t.root);o.has(c)||(o.add(c),n.push(...await u.loadToolkitRoot(t.root,t.provenance==="builtin"?"builtin":"user",null)))}n.push(...await u.loadRoot(W(O()),"builtin",null)),n.push(...await u.loadRoot(M(),"user",null));for(const t of s)n.push(...await u.loadRoot(d.join(t.path,".weave","plugins"),"project",t.id));return n}export async function loadAllPlugins(u,e){const s=new WeavePluginLoader(u),n=await registerPluginRoots(s,u,e);return{loader:s,loaded:n}}
1
+ import{existsSync as D}from"node:fs";import{readFile as S,readdir as I}from"node:fs/promises";import d from"node:path";import{pathToFileURL as P}from"node:url";import{watch as A}from"chokidar";import{builtinRulesDir as M}from"../market/builtin.js";import{HARNESS_EVENT_UNION as W,HookRuleSchema as O,PluginRuleEntrySchema as x,WEAVE_PLUGIN_MANIFEST as T,WeavePluginManifestSchema as H}from"@weavecode/core";import{getDataRoot as L,getPluginsDir as N}from"../db/paths.js";import{marketLibraryRoots as C}from"../market/resolve.js";import{validateHandler as U}from"./registry.js";import{builtinToolkitRoot as _,discoverToolkitSources as B,discoverWeavePackDirs as F}from"./toolkit-scan.js";export function createPluginLogger(l){return{debug:e=>console.debug(`[plugin:${l}] ${e}`),info:e=>console.info(`[plugin:${l}] ${e}`),warn:e=>console.warn(`[plugin:${l}] ${e}`),error:e=>console.error(`[plugin:${l}] ${e}`)}}const j="@file:";function q(){return d.resolve(_())}export class WeavePluginLoader{deps;handlers=new Map;configs=new Map;plugins=new Map;subscribers=new Map;roots=new Map;watchStop;constructor(e){this.deps=e}list(){return[...this.plugins.values()]}getHandler(e,s){return this.handlers.get(`${e}:${s}`)}getConfig(e){return this.configs.get(e)??{}}async loadRoot(e,s,o){const n=d.resolve(e);this.roots.set(n,{scope:s,projectId:o});let i;try{i=await I(n)}catch{return[]}const t=this.priorIdsUnder(n),c=[];for(const f of i){const u=d.join(n,f);if(this.roots.has(d.resolve(u))||d.resolve(u)===q())continue;const g=await this.loadOne(u,s,o,f);this.plugins.set(g.id,g),c.push(g)}return this.finalizeScan(t,c)}async loadToolkitRoot(e,s,o){const n=d.resolve(e);this.roots.set(n,{scope:s,projectId:o,deep:!0});const i=await F(n),t=this.priorIdsUnder(n),c=[];for(const f of i){await this.ensureToolkitDefaultDisabled(f);const u=await this.loadOne(f,s,o,d.basename(f));this.plugins.set(u.id,u),c.push(u)}return this.finalizeScan(t,c)}async ensureToolkitDefaultDisabled(e){try{const s=JSON.parse(await S(d.join(e,T),"utf8"));typeof s.id=="string"&&!this.deps.states.get(s.id)&&this.deps.states.setEnabled(s.id,!1)}catch{}}priorIdsUnder(e){const s=[...this.roots.keys()].filter(o=>o!==e&&o.startsWith(e+d.sep));return new Set([...this.plugins.values()].filter(o=>o.dir.startsWith(e+d.sep)?!s.some(n=>o.dir.startsWith(n+d.sep)):!1).map(o=>o.id))}finalizeScan(e,s){const o=new Set(s.map(i=>i.id));let n=!1;for(const i of e)o.has(i)||(this.deps.rules.removeByPlugin(i),this.unloadHandlers(i),this.configs.delete(i),this.plugins.delete(i),n=!0,this.emitReload({pluginId:i,status:"rejected",ruleCount:0,removed:!0}));(n||s.length>0)&&this.deps.registry.load();for(const i of s)this.emitReload({pluginId:i.id,status:i.status,ruleCount:i.ruleCount,at:new Date().toISOString()});return s}watchRoots(e=1e3){if(this.watchStop)return this.watchStop;const s=new Map,o=[...this.roots.entries()].filter(([n])=>D(n)).map(([n,i])=>{const t=i.deep?6:i.projectId!==null?3:2,c=A(n,{ignoreInitial:!0,depth:t});return c.on("all",()=>{const f=s.get(n);f&&clearTimeout(f),s.set(n,setTimeout(()=>{s.delete(n);const u=this.roots.get(n);if(!u)return;(u.deep?this.loadToolkitRoot(n,u.scope,u.projectId):this.loadRoot(n,u.scope,u.projectId)).catch(()=>{})},e))}),c.on("error",()=>{}),c});return this.watchStop=()=>{for(const n of s.values())clearTimeout(n);s.clear();for(const n of o)n.close();this.watchStop=void 0},this.watchStop}async reloadAll(){for(const[e,s]of[...this.roots])await(s.deep?this.loadToolkitRoot(e,s.scope,s.projectId):this.loadRoot(e,s.scope,s.projectId)).catch(()=>{})}stopWatching(){this.watchStop?.()}async rescanRoots(e,s){await registerPluginRoots(this,{libraries:s},e),this.stopWatching(),await this.reloadAll(),this.watchRoots()}setPluginEnabled(e,s){const o=this.plugins.get(e);if(!o)return!1;this.deps.states.setEnabled(e,s);for(const i of this.deps.rules.listByPlugin(e))this.deps.rules.setEnabled(i.id,s);this.deps.registry.load();const n=s?o.error?"rejected":"active":"disabled";return this.plugins.set(e,{...o,status:n}),this.deps.bus?.emit({kind:"plugin.toggled",pluginId:e,enabled:s,at:new Date().toISOString()}),!0}unloadHandlers(e){for(const s of[...this.handlers.keys()])s.startsWith(`${e}:`)&&this.handlers.delete(s);this.subscribers.delete(e)}notifyEvent(e,s,o){for(const[n,i]of this.subscribers){if(!i.events.has(e))continue;const t=this.configs.get(n)??{};(async()=>{await i.sub.onEvent({eventType:e,payload:s,sessionId:o,config:t,logger:createPluginLogger(n)})})().catch(()=>{})}}emitReload(e){this.deps.bus?.emit({kind:"plugin.reloaded",at:new Date().toISOString(),...e})}async loadOne(e,s,o,n){const i=(r,a,v=n,h="0.0.0")=>{const w=this.plugins.get(r);return w&&w.dir===e&&(this.deps.rules.removeByPlugin(r),this.unloadHandlers(r),this.configs.delete(r)),{id:r,name:v,version:h,dir:e,scope:s,projectId:o,status:"rejected",error:a,ruleCount:0}};let t;try{const r=JSON.parse(await S(d.join(e,T),"utf8")),a=H.safeParse(r);if(!a.success)return i(n,`manifest \u6821\u9A8C\u5931\u8D25: ${a.error.issues[0]?.message??""}`);t=a.data}catch(r){return i(n,`manifest \u8BFB\u53D6\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}if(s!=="builtin"&&t.id.startsWith("weave-"))return i(t.id,"id \u4EE5 weave- \u5F00\u5934\u4E3A\u5185\u7F6E\u9884\u8BBE\u547D\u540D\u7A7A\u95F4\u4FDD\u7559",t.name,t.version);const c=this.plugins.get(t.id);if(c&&c.status!=="rejected"&&c.dir!==e)return i(t.id,`\u91CD\u590D\u7684\u63D2\u4EF6 id\uFF08\u5DF2\u7531 ${c.dir} \u6CE8\u518C\uFF09`,t.name,t.version);const u=(t.requires?.events??[]).filter(r=>!W.includes(r));if(u.length>0)return i(t.id,`requires.events \u542B\u672A\u77E5\u4E8B\u4EF6: ${u.join(", ")}`,t.name,t.version);const g=[];for(const r of t.rules)try{const a=JSON.parse(await S(this.resolveWithin(e,r),"utf8"));if(!Array.isArray(a))throw new Error(`${r} \u4E0D\u662F\u6570\u7EC4`);g.push(...a)}catch(a){return i(t.id,`\u89C4\u5219\u6587\u4EF6 ${r}: ${a instanceof Error?a.message:String(a)}`,t.name,t.version)}const E=new Map;for(const r of t.handlers)try{const a=this.resolveWithin(e,r.entry),h=(await import(`${P(a).href}?t=${Date.now()}`)).default;if(!h||typeof h.execute!="function")throw new Error(`${r.entry} \u7684 default \u5BFC\u51FA\u7F3A\u5C11 execute \u51FD\u6570`);if(h.type!==r.type)throw new Error(`${r.entry} \u5BFC\u51FA type="${h.type}" \u4E0E manifest \u58F0\u660E "${r.type}" \u4E0D\u7B26`);E.set(`${t.id}:${r.type}`,h)}catch(a){return i(t.id,`handler ${r.type} \u52A0\u8F7D\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`,t.name,t.version)}let R;if(t.subscribe){const r=t.subscribe.events.filter(a=>!W.includes(a));if(r.length>0)return i(t.id,`subscribe.events \u542B\u672A\u77E5\u4E8B\u4EF6: ${r.join(", ")}`,t.name,t.version);try{const a=this.resolveWithin(e,t.subscribe.entry),h=(await import(`${P(a).href}?t=${Date.now()}`)).default;if(!h||typeof h.onEvent!="function")throw new Error(`${t.subscribe.entry} \u7684 default \u5BFC\u51FA\u7F3A\u5C11 onEvent \u51FD\u6570`);R={events:new Set(t.subscribe.events),sub:h}}catch(a){return i(t.id,`subscriber \u52A0\u8F7D\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`,t.name,t.version)}}const k=[];for(let r=0;r<g.length;r++){const a=g[r],v=typeof a=="object"&&a!==null&&"handler"in a?{...a,handler:z(a.handler,t.id)}:a,h=x.safeParse(v);if(!h.success)return i(t.id,`\u89C4\u5219 #${r} \u6821\u9A8C\u5931\u8D25: ${h.error.issues[0]?.message??""}`,t.name,t.version);const w=h.data;let p=w.handler;if(p.type==="plugin"&&!E.has(`${t.id}:${p.handlerType}`))return i(t.id,`\u89C4\u5219 #${r} \u5F15\u7528\u672A\u58F0\u660E\u7684 handler "${p.handlerType}"`,t.name,t.version);if((p.type==="inject"||p.type==="manual")&&p.template.startsWith(j)){const y=p.template.slice(j.length);try{const b=await S(this.resolveWithin(e,y),"utf8");p={...p,template:b}}catch(b){return i(t.id,`\u89C4\u5219 #${r} \u6A21\u677F ${y}: ${b instanceof Error?b.message:String(b)}`,t.name,t.version)}}let $;try{$=O.parse({...w,handler:p,id:`plugin:${t.id}:${r}`,projectId:o,enabled:w.enabled??!0,priority:w.priority??0,origin:s==="builtin"?"builtin":"plugin",pluginId:t.id}),U($.source,$.handler)}catch(y){return i(t.id,`\u89C4\u5219 #${r}: ${y instanceof Error?y.message:String(y)}`,t.name,t.version)}k.push($)}const m=this.deps.states.get(t.id);try{for(const r of k)this.deps.rules.upsertPluginRule(r)}catch(r){return this.deps.rules.removeByPlugin(t.id),i(t.id,`\u89C4\u5219\u5165\u5E93\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`,t.name,t.version)}if(m&&!m.enabled)for(const r of this.deps.rules.listByPlugin(t.id))this.deps.rules.setEnabled(r.id,!1);for(const[r,a]of E)this.handlers.set(r,a);return this.configs.set(t.id,{...t.config??{},...m?.config??{}}),R&&!(m&&!m.enabled)&&this.subscribers.set(t.id,R),{id:t.id,name:t.name,version:t.version,dir:e,scope:s,projectId:o,status:m&&!m.enabled?"disabled":"active",ruleCount:k.length}}resolveWithin(e,s){const o=d.resolve(e),n=d.resolve(o,s);if(n!==o&&!n.startsWith(o+d.sep))throw new Error(`\u8DEF\u5F84\u8D8A\u51FA\u63D2\u4EF6\u76EE\u5F55: ${s}`);return n}}function z(l,e){if(typeof l!="object"||l===null)return l;const s=l;return s.type!=="plugin"||s.pluginId!==void 0?l:{...s,pluginId:e}}export async function registerPluginRoots(l,e,s){const o=[],n=B();if(e.libraries)for(const t of C(e.libraries))n.push({root:t,provenance:"market"});const i=new Set;for(const t of n){const c=d.resolve(t.root);i.has(c)||(i.add(c),o.push(...await l.loadToolkitRoot(t.root,t.provenance==="builtin"?"builtin":"user",null)))}o.push(...await l.loadRoot(M(L()),"builtin",null)),o.push(...await l.loadRoot(N(),"user",null));for(const t of s)o.push(...await l.loadRoot(d.join(t.path,".weave","plugins"),"project",t.id));return o}export async function loadAllPlugins(l,e){const s=new WeavePluginLoader(l),o=await registerPluginRoots(s,l,e);return{loader:s,loaded:o}}
@@ -1 +1 @@
1
- export function pluginsStateOf(r){const t={syncedAt:null,enabled:{}};if(r==null)return t;try{const n=JSON.parse(r);if(!n||typeof n!="object"||Array.isArray(n))return t;const e=n.plugins;if(!e||typeof e!="object"||Array.isArray(e))return t;const o=e,c=o.enabled,s={};if(c&&typeof c=="object"&&!Array.isArray(c))for(const[l,a]of Object.entries(c))typeof a=="boolean"&&(s[l]=a);return{syncedAt:typeof o.syncedAt=="string"?o.syncedAt:null,enabled:s}}catch{return t}}export function effective(r,t,n){const e=pluginsStateOf(r.meta);return Object.hasOwn(e.enabled,t)?e.enabled[t]:e.syncedAt!==null?!1:n.states.get(t)?.enabled??n.defaultEnabled??!0}export function setProjectEnabled(r,t,n,e){const o=pluginsStateOf(r.meta);e.projects.setMeta(r.id,{plugins:{syncedAt:o.syncedAt,enabled:{...o.enabled,[t]:n}}})}export function syncPlugins(r,t,n){const e={...pluginsStateOf(r.meta).enabled};for(const c of t)Object.hasOwn(e,c)||(e[c]=!1);const o=n.now??new Date().toISOString();return n.projects.setMeta(r.id,{plugins:{syncedAt:o,enabled:e}}),o}
1
+ export function pluginsStateOf(s){const e={syncedAt:null,enabled:{}};if(s==null)return e;try{const t=JSON.parse(s);if(!t||typeof t!="object"||Array.isArray(t))return e;const n=t.plugins;if(!n||typeof n!="object"||Array.isArray(n))return e;const r=n,a=r.enabled,c={};if(a&&typeof a=="object"&&!Array.isArray(a))for(const[l,o]of Object.entries(a))typeof o=="boolean"&&(c[l]=o);return{syncedAt:typeof r.syncedAt=="string"?r.syncedAt:null,enabled:c}}catch{return e}}export function effective(s,e,t){const n=pluginsStateOf(s.meta);return Object.hasOwn(n.enabled,e)?n.enabled[e]:n.syncedAt!==null?!1:t.states.get(e)?.enabled??t.defaultEnabled??!0}export function setProjectEnabled(s,e,t,n){const r=pluginsStateOf(s.meta);n.projects.setMeta(s.id,{plugins:{syncedAt:r.syncedAt,enabled:{...r.enabled,[e]:t}}})}export function syncPlugins(s,e,t){const r={...pluginsStateOf(s.meta).enabled};for(const c of e)Object.hasOwn(r,c)||(r[c]=!1);const a=t.now??new Date().toISOString();return t.projects.setMeta(s.id,{plugins:{syncedAt:a,enabled:r}}),a}
@@ -1 +1 @@
1
- export const PROMPT_FLUSH_INTERVAL_MS=15e3;export function startPromptFlusher(e){const t=setInterval(()=>{e.flushAll()},15e3);return t.unref?.(),()=>clearInterval(t)}
1
+ export const PROMPT_FLUSH_INTERVAL_MS=15e3;export function startPromptFlusher(r){const t=setInterval(()=>{r.flushAll()},15e3);return t.unref?.(),()=>clearInterval(t)}
@@ -1,11 +1,11 @@
1
- import{mkdirSync as g,readFileSync as u,readdirSync as y,renameSync as m,writeFileSync as h}from"node:fs";import{join as f}from"node:path";import{hookShardId as l}from"./mirror.js";export const PROMPTBOX_MAX_LINES=200;export function promptboxPathOf(e,r){return f(e,"promptbox",`${r}.jsonl`)}function d(e){const r=[];for(const s of e.split(`
2
- `))if(s.trim())try{const t=JSON.parse(s);if(typeof t.id=="string"&&typeof t.sessionId=="string"&&typeof t.text=="string"){const n=t.images,c=(Array.isArray(t.attachments)?t.attachments:Array.isArray(n)?n:[]).filter(i=>{const o=i;return typeof o?.id=="string"&&typeof o?.name=="string"&&typeof o?.mediaType=="string"&&typeof o?.path=="string"});r.push({id:t.id,sessionId:t.sessionId,text:t.text,oneWay:t.oneWay===!0,...t.forceTerminal===!0?{forceTerminal:!0}:{},...c.length>0?{attachments:c}:{},at:typeof t.at=="string"?t.at:""})}}catch{}return r}export function appendPromptbox(e,r,s){if(s.length!==0)try{const t=promptboxPathOf(e,l(r));g(f(e,"promptbox"),{recursive:!0});let n=[];try{n=u(t,"utf8").split(`
3
- `).filter(a=>a.trim())}catch{n=[]}const c=new Date().toISOString();for(const a of s)n.push(JSON.stringify({...a,at:c}));const i=n.slice(-PROMPTBOX_MAX_LINES),o=`${t}.tmp`;h(o,i.length?i.join(`
1
+ import{mkdirSync as g,readFileSync as u,readdirSync as h,renameSync as l,writeFileSync as m}from"node:fs";import{join as f}from"node:path";import{hookShardId as y}from"./mirror.js";export const PROMPTBOX_MAX_LINES=200;export function promptboxPathOf(n,e){return f(n,"promptbox",`${e}.jsonl`)}function d(n){const e=[];for(const o of n.split(`
2
+ `))if(o.trim())try{const t=JSON.parse(o);if(typeof t.id=="string"&&typeof t.sessionId=="string"&&typeof t.text=="string"){const r=t.images,c=(Array.isArray(t.attachments)?t.attachments:Array.isArray(r)?r:[]).filter(i=>{const s=i;return typeof s?.id=="string"&&typeof s?.name=="string"&&typeof s?.mediaType=="string"&&typeof s?.path=="string"});e.push({id:t.id,sessionId:t.sessionId,text:t.text,oneWay:t.oneWay===!0,...t.forceTerminal===!0?{forceTerminal:!0}:{},...c.length>0?{attachments:c}:{},at:typeof t.at=="string"?t.at:""})}}catch{}return e}export function appendPromptbox(n,e,o){if(o.length!==0)try{const t=promptboxPathOf(n,y(e));g(f(n,"promptbox"),{recursive:!0});let r=[];try{r=u(t,"utf8").split(`
3
+ `).filter(s=>s.trim())}catch{r=[]}const p=new Date().toISOString();for(const s of o)r.push(JSON.stringify({...s,at:p}));const c=r.slice(-PROMPTBOX_MAX_LINES),i=`${t}.tmp`;m(i,c.length?c.join(`
4
4
  `)+`
5
- `:""),m(o,t)}catch{}}export function readPromptbox(e,r){try{return d(u(promptboxPathOf(e,l(r)),"utf8"))}catch{return[]}}export function removePromptboxEntries(e,r,s){if(s.size!==0)try{const t=promptboxPathOf(e,l(r));let n;try{n=u(t,"utf8").split(`
6
- `).filter(o=>o.trim())}catch{return}const c=n.filter(o=>{try{return!s.has(JSON.parse(o).id??"")}catch{return!1}}),i=`${t}.tmp`;h(i,c.length?c.join(`
5
+ `:""),l(i,t)}catch{}}export function readPromptbox(n,e){try{return d(u(promptboxPathOf(n,y(e)),"utf8"))}catch{return[]}}export function removePromptboxEntries(n,e,o){if(o.size!==0)try{const t=promptboxPathOf(n,y(e));let r;try{r=u(t,"utf8").split(`
6
+ `).filter(i=>i.trim())}catch{return}const p=r.filter(i=>{try{return!o.has(JSON.parse(i).id??"")}catch{return!1}}),c=`${t}.tmp`;m(c,p.length?p.join(`
7
7
  `)+`
8
- `:""),m(i,t)}catch{}}export function readAllPromptbox(e){const r=f(e,"promptbox");let s;try{s=y(r)}catch{return[]}const t=[];for(const n of s)if(n.endsWith(".jsonl"))try{t.push(...d(u(f(r,n),"utf8")))}catch{continue}return t}export function scanQueuedSessionIds(e){return new Set(readAllPromptbox(e).map(r=>r.sessionId))}export function removePromptboxBySession(e,r){const s=f(e,"promptbox");let t;try{t=y(s)}catch{return 0}let n=0;for(const c of t){if(!c.endsWith(".jsonl"))continue;const i=f(s,c);let o;try{o=u(i,"utf8").split(`
9
- `).filter(p=>p.trim())}catch{continue}const a=o.filter(p=>{try{return JSON.parse(p).sessionId!==r}catch{return!1}});if(a.length!==o.length){n+=o.length-a.length;try{const p=`${i}.tmp`;h(p,a.length?a.join(`
8
+ `:""),l(c,t)}catch{}}export function readAllPromptbox(n){const e=f(n,"promptbox");let o;try{o=h(e)}catch{return[]}const t=[];for(const r of o)if(r.endsWith(".jsonl"))try{t.push(...d(u(f(e,r),"utf8")))}catch{continue}return t}export function scanQueuedSessionIds(n){return new Set(readAllPromptbox(n).map(e=>e.sessionId))}export function removePromptboxBySession(n,e){const o=f(n,"promptbox");let t;try{t=h(o)}catch{return 0}let r=0;for(const p of t){if(!p.endsWith(".jsonl"))continue;const c=f(o,p);let i;try{i=u(c,"utf8").split(`
9
+ `).filter(a=>a.trim())}catch{continue}const s=i.filter(a=>{try{return JSON.parse(a).sessionId!==e}catch{return!1}});if(s.length!==i.length){r+=i.length-s.length;try{const a=`${c}.tmp`;m(a,s.length?s.join(`
10
10
  `)+`
11
- `:""),m(p,i)}catch{}}}return n}
11
+ `:""),l(a,c)}catch{}}}return r}
@@ -1,2 +1,2 @@
1
- import{chmodSync as r,existsSync as c,mkdirSync as p,readFileSync as l,renameSync as d,writeFileSync as u}from"node:fs";import y from"node:path";import n from"web-push";import{getPushKeysPath as h}from"../db/paths.js";import{watchReasonPhrase as f}from"./watch-engine.js";export class PushNotifier{deps;vapid;constructor(e){this.deps=e,this.vapid=m(e.keysPath??h()),e.bus.subscribe(i=>this.onBus(i))}publicKey(){return this.vapid.publicKey}onBus(e){const i=this.payloadFor(e);if(!i)return;const s=this.deps.subscriptions.list();s.length!==0&&this.pushAll(s,JSON.stringify(i))}payloadFor(e){return e.kind==="watch.fired"?e.watcherSessionId!==null?null:{title:"weave",body:`Session ${this.labelOf(e.targetSessionId)} ${f(e.reason)}`,tag:`weave-watch-${e.targetSessionId}`,url:"/"}:e.kind==="question.pending"?{title:"weave",body:`Session ${this.labelOf(e.sessionId)} is waiting for your answer`,tag:`weave-question-${e.sessionId}`,url:"/"}:null}labelOf(e){return this.deps.sessions.getBySessionId(e)?.title??e.slice(0,8)}async pushAll(e,i){for(const s of e)try{await(this.deps.send??b)(s,i,this.vapid)}catch(o){const a=o.statusCode;(a===404||a===410)&&this.deps.subscriptions.deleteByEndpoint(s.endpoint)}}}async function b(t,e,i){n.setVapidDetails("mailto:weave@localhost",i.publicKey,i.privateKey),await n.sendNotification({endpoint:t.endpoint,keys:{p256dh:t.p256dh,auth:t.auth}},e,{TTL:3600})}function m(t){if(c(t))try{const s=JSON.parse(l(t,"utf8"));if(typeof s.publicKey=="string"&&s.publicKey&&typeof s.privateKey=="string"&&s.privateKey)return{publicKey:s.publicKey,privateKey:s.privateKey}}catch{}const e=n.generateVAPIDKeys();p(y.dirname(t),{recursive:!0});const i=`${t}.tmp`;u(i,`${JSON.stringify(e,null,2)}
2
- `,{encoding:"utf8",mode:384}),d(i,t);try{r(t,384)}catch{}return e}
1
+ import{chmodSync as a,existsSync as u,mkdirSync as p,readFileSync as c,renameSync as d,writeFileSync as l}from"node:fs";import y from"node:path";import n from"web-push";import{getPushKeysPath as h}from"../db/paths.js";import{watchReasonPhrase as f}from"./watch-engine.js";export class PushNotifier{deps;vapid;constructor(t){this.deps=t,this.vapid=w(t.keysPath??h()),t.bus.subscribe(e=>this.onBus(e))}publicKey(){return this.vapid.publicKey}onBus(t){const e=this.payloadFor(t);if(!e)return;const i=this.deps.subscriptions.list();i.length!==0&&this.pushAll(i,JSON.stringify(e))}payloadFor(t){return t.kind==="watch.fired"?t.watcherSessionId!==null?null:{title:"weave",body:`Session ${this.labelOf(t.targetSessionId)} ${f(t.reason)}`,tag:`weave-watch-${t.targetSessionId}`,url:"/"}:t.kind==="question.pending"?{title:"weave",body:`Session ${this.labelOf(t.sessionId)} is waiting for your answer`,tag:`weave-question-${t.sessionId}`,url:"/"}:null}labelOf(t){return this.deps.sessions.getBySessionId(t)?.title??t.slice(0,8)}async pushAll(t,e){for(const i of t)try{await(this.deps.send??b)(i,e,this.vapid)}catch(o){const r=o.statusCode;(r===404||r===410)&&this.deps.subscriptions.deleteByEndpoint(i.endpoint)}}}async function b(s,t,e){n.setVapidDetails("mailto:weave@localhost",e.publicKey,e.privateKey),await n.sendNotification({endpoint:s.endpoint,keys:{p256dh:s.p256dh,auth:s.auth}},t,{TTL:3600})}function w(s){if(u(s))try{const i=JSON.parse(c(s,"utf8"));if(typeof i.publicKey=="string"&&i.publicKey&&typeof i.privateKey=="string"&&i.privateKey)return{publicKey:i.publicKey,privateKey:i.privateKey}}catch{}const t=n.generateVAPIDKeys();p(y.dirname(s),{recursive:!0});const e=`${s}.tmp`;l(e,`${JSON.stringify(t,null,2)}
2
+ `,{encoding:"utf8",mode:384}),d(e,s);try{a(s,384)}catch{}return t}
@@ -1 +1 @@
1
- import{isHarness as h}from"@weavecode/core";import{permissionModeOf as c}from"@weavecode/harness";import{blockingPromptFor as f}from"../surfaces.js";const g=12;export class QuestionTracker{deps;pending=new Map;lastPreTool=new Map;permissionMode=new Map;seeding=!1;constructor(e){this.deps=e}specOf(e){return h(e)?this.deps.surfaceFor?.(e)??f(e):null}onEvent(e){const s=e.payload;if(!s)return;const n=this.specOf(e.source);if(!n)return;const t=e.sessionId,r=typeof s.toolName=="string"?s.toolName:null,d=c(s.raw);if(d&&this.permissionMode.set(t,d),s.eventType==="PreToolUse"){if(r&&this.lastPreTool.set(t,{toolName:r,toolInput:s.toolInput}),r&&n.blockingTools.includes(r)){const l=this.pending.get(t),i={sessionId:t,harness:this.harnessOf(e.source),kind:"question",questions:n.parseQuestions(r,s.toolInput),at:new Date().toISOString()};this.pending.set(t,i),!this.seeding&&l?.kind!=="question"&&this.deps.onPending?.(i)}return}if(s.eventType==="Notification"){if(n.permissionNotificationType&&y(s.raw)===n.permissionNotificationType){const l=this.permissionMode.get(t);if(l!=null&&n.silentPermissionModes.includes(l))return;const i=this.lastPreTool.get(t);if(this.pending.get(t)?.kind==="question"&&i!=null&&n.blockingTools.includes(i.toolName))return;const a=this.lastPreTool.get(t)??{toolName:null,toolInput:null};this.pending.set(t,{sessionId:t,harness:this.harnessOf(e.source),kind:"permission",questions:[n.permissionQuestion({...a,message:m(s.raw),permissionMode:l??null})],at:new Date().toISOString()})}return}const p=n.eventQuestion(s.eventType,s.raw);if(p){const l=this.pending.get(t),i={sessionId:t,harness:this.harnessOf(e.source),kind:"switch",questions:[p],at:new Date().toISOString()};this.pending.set(t,i),!this.seeding&&l?.kind!=="switch"&&this.deps.onPending?.(i);return}const u=this.pending.get(t);if(u){if(u.kind!=="question"){this.pending.delete(t),this.lastPreTool.delete(t);return}(s.eventType==="PostToolUse"&&r!=null&&n.blockingTools.includes(r)||s.eventType==="UserPromptSubmit"||s.eventType==="Stop")&&(this.pending.delete(t),this.lastPreTool.delete(t))}}seedFromDb(){this.seeding=!0;try{for(const e of this.deps.sessions.list())for(const s of this.deps.hookEvents.listBySession(e.sessionId,g)){let n=null;try{n=JSON.parse(s.payload)}catch{n=null}this.onEvent({sessionId:e.sessionId,source:s.source,payload:n})}}finally{this.seeding=!1}}snapshot(){return[...this.pending.values()].filter(e=>!this.dropIfInterrupted(e)).sort((e,s)=>e.at<s.at?1:-1)}get(e){const s=this.pending.get(e);return s?this.dropIfInterrupted(s)?null:s:null}dropIfInterrupted(e){return this.deps.interruptedAt?.(e.sessionId)==null?!1:(this.pending.delete(e.sessionId),!0)}markAnswered(e){this.pending.delete(e)}forgetSession(e){this.pending.delete(e),this.lastPreTool.delete(e),this.permissionMode.delete(e)}harnessOf(e){return e}}function m(o){if(!o||typeof o!="object")return null;const e=o.message;return typeof e=="string"&&e.trim()?e:null}function y(o){if(!o||typeof o!="object")return null;const e=o.notification_type;return typeof e=="string"&&e?e:null}
1
+ import{isHarness as f}from"@weavecode/core";import{permissionModeOf as c}from"@weavecode/harness";import{blockingPromptFor as h}from"../surfaces.js";const g=12;export class QuestionTracker{deps;pending=new Map;lastPreTool=new Map;permissionMode=new Map;seeding=!1;constructor(e){this.deps=e}specOf(e){return f(e)?this.deps.surfaceFor?.(e)??h(e):null}onEvent(e){const t=e.payload;if(!t)return;const n=this.specOf(e.source);if(!n)return;const s=e.sessionId,i=typeof t.toolName=="string"?t.toolName:null,d=c(t.raw);if(d&&this.permissionMode.set(s,d),t.eventType==="PreToolUse"){if(i&&this.lastPreTool.set(s,{toolName:i,toolInput:t.toolInput}),i&&n.blockingTools.includes(i)){const l=this.pending.get(s),r={sessionId:s,harness:this.harnessOf(e.source),kind:"question",questions:n.parseQuestions(i,t.toolInput),at:new Date().toISOString()};this.pending.set(s,r),!this.seeding&&l?.kind!=="question"&&this.deps.onPending?.(r)}return}if(t.eventType==="Notification"){if(n.permissionNotificationType&&y(t.raw)===n.permissionNotificationType){const l=this.permissionMode.get(s);if(l!=null&&n.silentPermissionModes.includes(l))return;const r=this.lastPreTool.get(s);if(this.pending.get(s)?.kind==="question"&&r!=null&&n.blockingTools.includes(r.toolName))return;const a=this.lastPreTool.get(s)??{toolName:null,toolInput:null};this.pending.set(s,{sessionId:s,harness:this.harnessOf(e.source),kind:"permission",questions:[n.permissionQuestion({...a,message:m(t.raw),permissionMode:l??null})],at:new Date().toISOString()})}return}const p=n.eventQuestion(t.eventType,{raw:t.raw,toolName:i,toolInput:t.toolInput});if(p){const l=this.pending.get(s),r={sessionId:s,harness:this.harnessOf(e.source),kind:"switch",questions:[p],at:new Date().toISOString()};this.pending.set(s,r),!this.seeding&&l?.kind!=="switch"&&this.deps.onPending?.(r);return}const u=this.pending.get(s);if(!u)return;if(u.kind!=="question"){this.pending.delete(s),this.lastPreTool.delete(s);return}(t.eventType==="PostToolUse"&&i!=null&&n.blockingTools.includes(i)||t.eventType==="UserPromptSubmit"||t.eventType==="Stop")&&(this.pending.delete(s),this.lastPreTool.delete(s))}seedFromDb(){this.seeding=!0;try{for(const e of this.deps.sessions.list())for(const t of this.deps.hookEvents.listBySession(e.sessionId,g)){let n=null;try{n=JSON.parse(t.payload)}catch{n=null}this.onEvent({sessionId:e.sessionId,source:t.source,payload:n})}}finally{this.seeding=!1}}snapshot(){return[...this.pending.values()].filter(e=>!this.dropIfInterrupted(e)).sort((e,t)=>e.at<t.at?1:-1)}get(e){const t=this.pending.get(e);return t?this.dropIfInterrupted(t)?null:t:null}dropIfInterrupted(e){return this.deps.interruptedAt?.(e.sessionId)==null?!1:(this.pending.delete(e.sessionId),!0)}markAnswered(e){this.pending.delete(e)}forgetSession(e){this.pending.delete(e),this.lastPreTool.delete(e),this.permissionMode.delete(e)}harnessOf(e){return e}}function m(o){if(!o||typeof o!="object")return null;const e=o.message;return typeof e=="string"&&e.trim()?e:null}function y(o){if(!o||typeof o!="object")return null;const e=o.notification_type;return typeof e=="string"&&e?e:null}
@@ -1 +1 @@
1
- import{INJECTABLE_EVENTS as a,hookSourceHarness as c,normalizeHookRuleSource as s}from"@weavecode/core";export class HookRuleRegistry{repo;byEvent=new Map;all=[];onChange;constructor(e){this.repo=e,this.load()}load(){this.all=this.repo.list().map(e=>({...e,source:s(e.source)})),this.byEvent=new Map;for(const e of this.all){if(e.source.kind!=="hook-event")continue;const t=this.byEvent.get(e.source.event);t?t.push(e):this.byEvent.set(e.source.event,[e])}this.onChange?.()}list(e){return(e===void 0?this.all:this.repo.list(e)).map(t=>({...t,source:s(t.source)}))}get(e){return this.all.find(t=>t.id===e)}candidates(e,t){const n=this.byEvent.get(e)??[];return t?.includeDisabled?[...n]:n.filter(o=>o.enabled)}create(e){const t=s(e.source);validateHandler(t,e.handler);const n=this.repo.create({...e,source:t});return this.load(),n}update(e,t){const n=this.get(e);if(!n)return;const o=t.source?s(t.source):n.source;validateHandler(o,t.handler??n.handler);const i=this.repo.update(e,t.source?{...t,source:o}:t);return i&&this.load(),i}setEnabled(e,t){const n=this.repo.setEnabled(e,t);return n&&this.load(),n}remove(e){const t=this.repo.remove(e);return t&&this.load(),t}}export function validateHandler(r,e){const t=c(r);if(e.type==="inject"){if(t===null||t==="any")throw new Error('inject handler requires source.kind = "hook-event" with a concrete harness (legacy "claude-event" accepted; "any" rejected)');const n=a[t],o=r.kind==="claude-event"||r.kind==="hook-event"?r.event:"";if(!n.includes(o))throw new Error(`inject handler is not supported on event "${o}" (allowed: ${n.join(", ")})`);return}if(e.type==="plugin"&&t===null)throw new Error('plugin handler requires source.kind = "hook-event"')}
1
+ import{INJECTABLE_EVENTS as l,hookSourceHarness as u,normalizeHookRuleSource as s}from"@weavecode/core";export class HookRuleRegistry{repo;byEvent=new Map;all=[];onChange;constructor(e){this.repo=e,this.load()}load(){this.all=this.repo.list().map(e=>({...e,source:s(e.source)})),this.byEvent=new Map;for(const e of this.all){if(e.source.kind!=="hook-event")continue;const t=this.byEvent.get(e.source.event);t?t.push(e):this.byEvent.set(e.source.event,[e])}this.onChange?.()}list(e){return(e===void 0?this.all:this.repo.list(e)).map(n=>({...n,source:s(n.source)}))}get(e){return this.all.find(t=>t.id===e)}candidates(e,t){const n=this.byEvent.get(e)??[];return t?.includeDisabled?[...n]:n.filter(o=>o.enabled)}create(e){const t=s(e.source);validateHandler(t,e.handler);const n=this.repo.create({...e,source:t});return this.load(),n}update(e,t){const n=this.get(e);if(!n)return;const o=t.source?s(t.source):n.source;validateHandler(o,t.handler??n.handler);const i=this.repo.update(e,t.source?{...t,source:o}:t);return i&&this.load(),i}setEnabled(e,t){const n=this.repo.setEnabled(e,t);return n&&this.load(),n}remove(e){const t=this.repo.remove(e);return t&&this.load(),t}}export function validateHandler(r,e){const t=u(r);if(e.type==="inject"){if(t===null||t==="any")throw new Error('inject handler requires source.kind = "hook-event" with a concrete harness (legacy "claude-event" accepted; "any" rejected)');const n=l[t],o=r.kind==="claude-event"||r.kind==="hook-event"?r.event:"";if(!n.includes(o))throw new Error(`inject handler is not supported on event "${o}" (allowed: ${n.join(", ")})`);return}if(e.type==="plugin"&&t===null)throw new Error('plugin handler requires source.kind = "hook-event"')}
@@ -1 +1 @@
1
- import{CLAUDE_RESUME as a}from"@weavecode/harness";import{HeadlessRunner as o}from"./headless-runner.js";export class ResumeRunner{deps;headless;claudeBin;resumeSpec;timeoutMs;constructor(s){this.deps=s,this.headless=s.headless??new o({spawnImpl:s.spawnImpl,killImpl:s.killImpl}),this.resumeSpec=s.resumeSpec??a,this.claudeBin=s.claudeBin??process.env.WEAVE_CLAUDE_BIN??this.resumeSpec.bin,this.timeoutMs=s.timeoutMs}async run(s,e){const t=this.deps.dispatches.getById(s);if(!t)return{ok:!1,status:404,error:"Dispatch not found"};if(t.status!=="pending"&&t.status!=="injected")return{ok:!1,status:409,error:`Dispatch is ${t.status}`};const i=this.deps.sessions.getBySessionId(e);if(!i)return{ok:!1,status:404,error:"Session not found"};if(i.projectId==null)return{ok:!1,status:400,error:"Session has no project"};const u=this.deps.projects.getById(i.projectId);if(!u)return{ok:!1,status:400,error:"Project not found for session"};if(this.headless.isBusy(e))return{ok:!1,status:409,error:"Session already has a running dispatch"};const n={settled:!1};try{this.deps.dispatches.updateStatus(s,{status:"running"}),this.deps.bus?.emit({kind:"dispatch.started",ruleId:t.ruleId,dispatchId:s,sessionId:e,at:new Date().toISOString()}),this.headless.run({sessionId:e,cwd:u.path,prompt:t.prompt,spec:this.resumeSpec,bin:this.claudeBin,timeoutMs:this.timeoutMs,onSettle:r=>this.settle(t,e,n,r)})||this.settle(t,e,n,{status:"failed",output:null,error:"Session already has a running dispatch"})}catch(r){this.settle(t,e,n,{status:"failed",output:null,error:r instanceof Error?r.message:String(r)})}return{ok:!0,dispatchId:s}}settle(s,e,t,i){if(!t.settled){t.settled=!0;try{this.deps.dispatches.updateStatus(s.id,{status:i.status,output:i.output,error:i.error,finished:!0}),this.deps.bus?.emit({kind:"dispatch.finished",ruleId:s.ruleId,dispatchId:s.id,status:i.status,sessionId:e,at:new Date().toISOString()})}catch{}}}}
1
+ import{CLAUDE_RESUME as o}from"@weavecode/harness";import{HeadlessRunner as l}from"./headless-runner.js";export class ResumeRunner{deps;headless;claudeBin;resumeSpec;timeoutMs;constructor(t){this.deps=t,this.headless=t.headless??new l({spawnImpl:t.spawnImpl,killImpl:t.killImpl}),this.resumeSpec=t.resumeSpec??o,this.claudeBin=t.claudeBin??process.env.WEAVE_CLAUDE_BIN??this.resumeSpec.bin,this.timeoutMs=t.timeoutMs}async run(t,e){const s=this.deps.dispatches.getById(t);if(!s)return{ok:!1,status:404,error:"Dispatch not found"};if(s.status!=="pending"&&s.status!=="injected")return{ok:!1,status:409,error:`Dispatch is ${s.status}`};const r=this.deps.sessions.getBySessionId(e);if(!r)return{ok:!1,status:404,error:"Session not found"};if(r.projectId==null)return{ok:!1,status:400,error:"Session has no project"};const a=this.deps.projects.getById(r.projectId);if(!a)return{ok:!1,status:400,error:"Project not found for session"};if(this.headless.isBusy(e))return{ok:!1,status:409,error:"Session already has a running dispatch"};const u={settled:!1};try{this.deps.dispatches.updateStatus(t,{status:"running"}),this.deps.bus?.emit({kind:"dispatch.started",ruleId:s.ruleId,dispatchId:t,sessionId:e,at:new Date().toISOString()}),this.headless.run({sessionId:e,cwd:a.path,prompt:s.prompt,spec:this.resumeSpec,bin:this.claudeBin,timeoutMs:this.timeoutMs,onSettle:n=>this.settle(s,e,u,n)})||this.settle(s,e,u,{status:"failed",output:null,error:"Session already has a running dispatch"})}catch(i){this.settle(s,e,u,{status:"failed",output:null,error:i instanceof Error?i.message:String(i)})}return{ok:!0,dispatchId:t}}settle(t,e,s,r){if(!s.settled){s.settled=!0;try{this.deps.dispatches.updateStatus(t.id,{status:r.status,output:r.output,error:r.error,finished:!0}),this.deps.bus?.emit({kind:"dispatch.finished",ruleId:t.ruleId,dispatchId:t.id,status:r.status,sessionId:e,at:new Date().toISOString()})}catch{}}}}
@@ -1 +1 @@
1
- export function purgeSession(e,s){const n=e.events.deleteBySession(s);e.uploads?.pruneUnreferenced();const o=e.dispatches?.deleteBySession(s)??0,i=e.deliverer?.forgetSession(s)??0;return e.watches?.deleteBySession(s),e.orchestrations?.deleteMentioningSession(s),e.questions?.forgetSession(s),e.sideQuestions?.deleteBySession(s),e.probe?.forget(s),e.sessions.remove(s),{events:n,dispatches:o,messages:i}}
1
+ export function purgeSession(e,t){const n=e.events.deleteBySession(t);e.uploads?.pruneUnreferenced();const o=e.dispatches?.deleteBySession(t)??0,r=e.deliverer?.forgetSession(t)??0;return e.watches?.deleteBySession(t),e.orchestrations?.deleteMentioningSession(t),e.questions?.forgetSession(t),e.sideQuestions?.deleteBySession(t),e.probe?.forget(t),e.sessions.remove(t),{events:n,dispatches:o,messages:r}}
@@ -43,4 +43,6 @@ export declare function startSessionSweeper(deps: SessionPurgeDeps & {
43
43
  uploadSessions?: {
44
44
  sweep(): Promise<number>;
45
45
  };
46
+ /** 存活图来源;缺省合并图(claude 注册表 + codex 锁探针缓存)。 */
47
+ livenessOf?: () => Map<string, boolean>;
46
48
  }): NodeJS.Timeout;
@@ -1 +1 @@
1
- import{purgeSession as r}from"./session-purge.js";import{claudeLivenessById as p,shellDiscardedByClaude as d}from"../daemon/claude-liveness.js";export const SWEEP_INTERVAL_MS=5*6e4;export class SessionSweeper{deps;now;constructor(e,t=Date.now){this.deps=e,this.now=t}sweep(){const e=this.now(),t=this.deps.livenessOf?.();let n=0;for(const s of this.deps.sessions.listWithCounts()){if(t&&d(s,t,e)){r(this.deps,s.sessionId),n++;continue}const i=s.autoDeleteAt==null?null:Date.parse(s.autoDeleteAt);i==null||e<i||(r(this.deps,s.sessionId),n++)}return this.deps.uploads?.pruneUnreferenced(),this.deps.uploadSessions?.sweep(),this.deps.watchEngine?.sweepTerminated(),this.deps.orchestrationEngine?.sweepTerminated(),n}start(){this.sweep();const e=setInterval(()=>this.sweep(),SWEEP_INTERVAL_MS);return e.unref(),e}}export function startSessionSweeper(o){return new SessionSweeper({...o,livenessOf:()=>p()}).start()}
1
+ import{purgeSession as r}from"./session-purge.js";import{shellDiscardedByClaude as p}from"../daemon/claude-liveness.js";import{combinedLivenessOf as d}from"../daemon/liveness.js";export const SWEEP_INTERVAL_MS=5*6e4;export class SessionSweeper{deps;now;constructor(e,t=Date.now){this.deps=e,this.now=t}sweep(){const e=this.now(),t=this.deps.livenessOf?.();let i=0;for(const s of this.deps.sessions.listWithCounts()){if(t&&p(s,t,e)){r(this.deps,s.sessionId),i++;continue}const o=s.autoDeleteAt==null?null:Date.parse(s.autoDeleteAt);o==null||e<o||(r(this.deps,s.sessionId),i++)}return this.deps.uploads?.pruneUnreferenced(),this.deps.uploadSessions?.sweep(),this.deps.watchEngine?.sweepTerminated(),this.deps.orchestrationEngine?.sweepTerminated(),i}start(){this.sweep();const e=setInterval(()=>this.sweep(),SWEEP_INTERVAL_MS);return e.unref(),e}}export function startSessionSweeper(n){return new SessionSweeper({...n,livenessOf:n.livenessOf??d}).start()}
@@ -1 +1 @@
1
- import{isHarness as p}from"@weavecode/core";import{messagingSurfaceFor as I}from"../surfaces.js";export const SIDE_ANSWER_WINDOW_MS=10*6e4,SIDE_SETTLE_WINDOW_MS=3e4;const c=/\p{Script=Han}/u;function l(n){const e=n.toLowerCase().replace(/\s+/g,""),s=new Set;for(let t=0;t<e.length-1;t++)s.add(e.slice(t,t+2));return s}function g(n,e){const s=l(n),t=l(e);if(s.size===0||t.size===0)return 0;let r=0;for(const o of s)t.has(o)&&r++;return 2*r/(s.size+t.size)}export function answerScore(n,e){let s=0;return c.test(n)===c.test(e)&&(s+=2),e.length>=120&&(s+=1),g(n,e)>=.15&&(s+=1),s}const w=new Map;function f(n,e,s){const t=w.get(e.id);t&&clearTimeout(t),setTimeout(()=>{w.delete(e.id);const r=n.repo.getById(e.id);r?.status==="answered"&&r.answerEventId===e.answerEventId&&n.settle?.(r)},Math.max(0,s+SIDE_SETTLE_WINDOW_MS-(n.now?.()??Date.now()))).unref?.()}export function claimSideAnswer(n,e){if(!p(e.source))return null;const s=(n.surfaceFor?.(e.source)??I(e.source)).sideQuestion?.answerOf(e.eventType,e.payload);if(!s)return null;const t=n.now?.()??Date.now(),r=new Date(t-SIDE_ANSWER_WINDOW_MS).toISOString(),o=n.repo.claim(e.sessionId,s,e.eventId,r);if(o)return S(n,o),f(n,o,t),o;const u=new Date(t-SIDE_SETTLE_WINDOW_MS).toISOString(),i=n.repo.list(e.sessionId,{limit:5}).find(d=>d.status==="answered"&&(d.answeredAt??"")>=u);if(!i||i.answer==null||answerScore(i.question,s)<=answerScore(i.question,i.answer))return null;const a=n.repo.supersede(i.id,s,e.eventId,u);return a?(S(n,a),f(n,a,t),a):null}function S(n,e){n.bus?.emit({kind:"sideQuestion.answered",sessionId:e.sessionId,sideQuestionId:e.id,at:e.answeredAt??new Date().toISOString()})}export function readSideQuestions(n,e,s){return n.repo.expirePending(new Date((n.now?.()??Date.now())-SIDE_ANSWER_WINDOW_MS).toISOString()),n.repo.list(e,s)}
1
+ import{isHarness as I}from"@weavecode/core";import{messagingSurfaceFor as g}from"../surfaces.js";export const SIDE_ANSWER_WINDOW_MS=10*6e4,SIDE_SETTLE_WINDOW_MS=3e4;const l=/\p{Script=Han}/u;function d(t){const e=t.toLowerCase().replace(/\s+/g,""),n=new Set;for(let s=0;s<e.length-1;s++)n.add(e.slice(s,s+2));return n}function D(t,e){const n=d(t),s=d(e);if(n.size===0||s.size===0)return 0;let r=0;for(const o of n)s.has(o)&&r++;return 2*r/(n.size+s.size)}export function answerScore(t,e){let n=0;return l.test(t)===l.test(e)&&(n+=2),e.length>=120&&(n+=1),D(t,e)>=.15&&(n+=1),n}const w=new Map;function S(t,e,n){const s=w.get(e.id);s&&clearTimeout(s),setTimeout(()=>{w.delete(e.id);const o=t.repo.getById(e.id);o?.status==="answered"&&o.answerEventId===e.answerEventId&&t.settle?.(o)},Math.max(0,n+SIDE_SETTLE_WINDOW_MS-(t.now?.()??Date.now()))).unref?.()}export function claimSideAnswer(t,e){if(!I(e.source))return null;const s=(t.surfaceFor?.(e.source)??g(e.source)).sideQuestion?.answerOf(e.eventType,e.payload);if(!s)return null;const r=t.now?.()??Date.now(),o=new Date(r-SIDE_ANSWER_WINDOW_MS).toISOString(),a=t.repo.claim(e.sessionId,s,e.eventId,o);if(a)return m(t,a),S(t,a,r),a;const u=new Date(r-SIDE_SETTLE_WINDOW_MS).toISOString(),i=t.repo.list(e.sessionId,{limit:5}).find(f=>f.status==="answered"&&(f.answeredAt??"")>=u);if(!i||i.answer==null||answerScore(i.question,s)<=answerScore(i.question,i.answer))return null;const c=t.repo.supersede(i.id,s,e.eventId,u);return c?(m(t,c),S(t,c,r),c):null}function m(t,e){t.bus?.emit({kind:"sideQuestion.answered",sessionId:e.sessionId,sideQuestionId:e.id,at:e.answeredAt??new Date().toISOString()})}export function readSideQuestions(t,e,n){return t.repo.expirePending(new Date((t.now?.()??Date.now())-SIDE_ANSWER_WINDOW_MS).toISOString()),t.repo.list(e,n)}
@@ -1 +1 @@
1
- import{randomUUID as r}from"node:crypto";const o=30*6e4,e=new Map;export function registerSyntheticSession(t=`sx-${r()}`){return e.set(t,Date.now()+o),t}export function isSyntheticSession(t){if(!t)return!1;const n=e.get(t);return n===void 0?!1:n<Date.now()?(e.delete(t),!1):!0}export function syntheticSessionIds(){return[...e.keys()]}export function replaceSyntheticSessions(t){e.clear();for(const n of t)e.set(n,Date.now()+o)}
1
+ import{randomUUID as o}from"node:crypto";const r=30*6e4,t=new Map;export function registerSyntheticSession(e=`sx-${o()}`){return t.set(e,Date.now()+r),e}export function isSyntheticSession(e){if(!e)return!1;const n=t.get(e);return n===void 0?!1:n<Date.now()?(t.delete(e),!1):!0}export function syntheticSessionIds(){return[...t.keys()]}export function replaceSyntheticSessions(e){t.clear();for(const n of e)t.set(n,Date.now()+r)}
@@ -1 +1 @@
1
- import{readFile as M,readdir as d,stat as y}from"node:fs/promises";import o from"node:path";import{WEAVE_PLUGIN_MANIFEST as w,WeavePluginManifestSchema as I,HARNESS_KEYS as G}from"@weavecode/core";import{builtinPacksDir as J}from"../market/builtin.js";import{getDataRoot as K}from"../db/paths.js";import{hasNonEmptyModules as P}from"../watch/plugin-mods.js";const T=".claude-plugin",D="plugin.json",L="weave.json",A=2,O=10,F=["claude"];export function builtinToolkitRoot(){return o.resolve(J(K()))}async function k(n){try{return(await y(n)).isDirectory()}catch{return!1}}async function m(n){try{const t=JSON.parse(await M(n,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}export async function isToolkitPackDir(n){return await S(n)?!0:await k(o.join(n,"skills"))||await k(o.join(n,"commands"))||await k(o.join(n,"agents"))}async function S(n){if(await m(o.join(n,T,D)))return!0;try{return await y(o.join(n,w)),!0}catch{}return P(await m(o.join(n,"hooks","hooks.json")))}async function V(n){try{return(await d(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).sort()}catch{return[]}}async function b(n){try{return(await d(n,{withFileTypes:!0})).filter(t=>t.isFile()&&t.name.endsWith(".md")).map(t=>t.name.replace(/\.md$/,"")).sort()}catch{return[]}}function C(n){if(!Array.isArray(n)||n.length===0)return F;const t=n.filter(c=>G.includes(c));return t.length>0?t:F}export async function parseToolkitPack(n,t,c){const r=o.basename(n),i=await m(o.join(n,T,D)),e=await m(o.join(n,w)),a=await m(o.join(n,L)),p=await V(o.join(n,"skills")),s=await b(o.join(n,"commands")),E=await b(o.join(n,"agents")),f=await m(o.join(n,"hooks","hooks.json")),j=P(f),v=!!f&&typeof f.hooks=="object"&&f.hooks!==null,u=[];if(p.length>0&&u.push("skill"),s.length>0&&u.push("command"),E.length>0&&u.push("agent"),j?u.push("mod"):v&&u.push("hook"),e&&u.push("rule"),u.length===0)return null;const h=typeof a?.kind=="string"?a.kind:null,N=h&&["skill","hook","mod","rule","surface"].includes(h)?h:j?"mod":v?"hook":e&&!i?"rule":p.length>0?"skill":"surface",l=e?I.safeParse(e):null,W=l?.success?l.data.id:r,R=(typeof i?.name=="string"?i.name:void 0)??(l?.success?l.data.name:void 0)??r,_=(l?.success?l.data.version:void 0)??(typeof i?.version=="string"?i.version:void 0)??"0.0.0",g=(typeof i?.description=="string"?i.description:void 0)??(l?.success?l.data.description:void 0);return{id:W,name:R,version:_,...g?{description:g}:{},scope:c,dir:n,provenance:t.provenance,sourceRoot:t.root,targets:C(a?.targets),kind:N,components:u,ccPack:!!i,weavePack:!!e,skills:p}}function x(n){return n==="node_modules"||n.startsWith(".")}export async function discoverToolkitPacks(n){const t=n.provenance==="market",c=t?O:A,r=async(i,e,a)=>{if(await isToolkitPackDir(i)&&!(e===0&&t&&!await S(i))){const s=await parseToolkitPack(i,n,a);return s?[s]:[]}if(e>=c)return[];let p;try{p=await d(i,{withFileTypes:!0})}catch{return[]}return(await Promise.all(p.filter(s=>s.isDirectory()&&!x(s.name)).map(s=>r(o.join(i,s.name),e+1,e===0?s.name:a)))).flat()};return r(n.root,0,"")}export function discoverToolkitSources(){return[{root:builtinToolkitRoot(),provenance:"builtin"}]}export async function discoverWeavePackDirs(n){const t=[],c=async(r,i)=>{try{await y(o.join(r,w)),t.push(r);return}catch{}if(i>=A)return;let e;try{e=await d(r,{withFileTypes:!0})}catch{return}for(const a of e)!a.isDirectory()||x(a.name)||await c(o.join(r,a.name),i+1)};return await c(n,0),t}
1
+ import{readFile as x,readdir as h,stat as w}from"node:fs/promises";import e from"node:path";import{WEAVE_PLUGIN_MANIFEST as y,WeavePluginManifestSchema as L,HARNESS_KEYS as I}from"@weavecode/core";import{builtinPacksDir as W}from"../market/builtin.js";import{getDataRoot as J}from"../db/paths.js";import{hasNonEmptyModules as E}from"../watch/plugin-mods.js";const S=".claude-plugin",v="plugin.json",K="weave.json",_=2,O=10,D=["claude"];export function builtinToolkitRoot(){return e.resolve(W(J()))}async function d(t){try{return(await w(t)).isDirectory()}catch{return!1}}async function p(t){try{const n=JSON.parse(await x(t,"utf8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}export async function isToolkitPackDir(t){return await N(t)?!0:await d(e.join(t,"skills"))||await d(e.join(t,"commands"))||await d(e.join(t,"agents"))}async function N(t){if(await p(e.join(t,S,v)))return!0;try{return await w(e.join(t,y)),!0}catch{}return E(await p(e.join(t,"hooks","hooks.json")))}async function V(t){try{return(await h(t,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name).sort()}catch{return[]}}async function P(t){try{return(await h(t,{withFileTypes:!0})).filter(o=>o.isFile()&&o.name.endsWith(".md")).map(o=>o.name.replace(/\.md$/,"")).sort()}catch{return[]}}function G(t){if(!Array.isArray(t)||t.length===0)return D;const n=t.filter(o=>I.includes(o));return n.length>0?n:D}export async function parseToolkitPack(t,n,o){const i=e.basename(t),a=await p(e.join(t,S,v)),s=await p(e.join(t,y)),r=await p(e.join(t,K)),m=await V(e.join(t,"skills")),g=await P(e.join(t,"commands")),c=await P(e.join(t,"agents")),f=await p(e.join(t,"hooks","hooks.json")),j=E(f),T=!!f&&typeof f.hooks=="object"&&f.hooks!==null,u=[];if(m.length>0&&u.push("skill"),g.length>0&&u.push("command"),c.length>0&&u.push("agent"),j?u.push("mod"):T&&u.push("hook"),s&&u.push("rule"),u.length===0)return null;const k=typeof r?.kind=="string"?r.kind:null,F=k&&["skill","hook","mod","rule","surface"].includes(k)?k:j?"mod":T?"hook":s&&!a?"rule":m.length>0?"skill":"surface",l=s?L.safeParse(s):null,C=l?.success?l.data.id:i,R=(typeof a?.name=="string"?a.name:void 0)??(l?.success?l.data.name:void 0)??i,b=(l?.success?l.data.version:void 0)??(typeof a?.version=="string"?a.version:void 0)??"0.0.0",A=(typeof a?.description=="string"?a.description:void 0)??(l?.success?l.data.description:void 0);return{id:C,name:R,version:b,...A?{description:A}:{},scope:o,dir:t,provenance:n.provenance,sourceRoot:n.root,targets:G(r?.targets),kind:F,components:u,ccPack:!!a,weavePack:!!s,skills:m}}function M(t){return t==="node_modules"||t.startsWith(".")}export async function discoverToolkitPacks(t){const n=t.provenance==="market",o=n?O:_,i=async(a,s,r)=>{if(await isToolkitPackDir(a)&&!(s===0&&n&&!await N(a))){const f=await parseToolkitPack(a,t,r);return f?[f]:[]}if(s>=o)return[];let m;try{m=await h(a,{withFileTypes:!0})}catch{return[]}return(await Promise.all(m.filter(c=>c.isDirectory()&&!M(c.name)).map(c=>i(e.join(a,c.name),s+1,s===0?c.name:r)))).flat()};return i(t.root,0,"")}export function discoverToolkitSources(){return[{root:builtinToolkitRoot(),provenance:"builtin"}]}export async function discoverWeavePackDirs(t){const n=[],o=async(i,a)=>{try{await w(e.join(i,y)),n.push(i);return}catch{}if(a>=_)return;let s;try{s=await h(i,{withFileTypes:!0})}catch{return}for(const r of s)!r.isDirectory()||M(r.name)||await o(e.join(i,r.name),a+1)};return await o(t,0),n}
@@ -1,5 +1,5 @@
1
- import{cp as D,mkdir as b,readFile as I,readdir as h,rm as w,writeFile as x}from"node:fs/promises";import{spawn as P}from"node:child_process";import{homedir as M}from"node:os";import c from"node:path";import{hashFile as g}from"../install/fingerprint.js";import{fileAssetTargetDir as H}from"../install/file-assets.js";import{assetSurfaceFor as $,pluginSurfaceFor as q}from"../surfaces.js";import{marketLibraryRoots as A}from"../market/resolve.js";import{marketIdOf as m}from"../market/identity.js";import{installPluginPack as N}from"../install/plugin-install.js";import{effective as _,setProjectEnabled as O}from"./plugin-project-state.js";import{builtinToolkitRoot as L,discoverToolkitPacks as V}from"./toolkit-scan.js";export class ToolkitError extends Error{code;constructor(t,e){super(t),this.code=e,this.name="ToolkitError"}}export const MIN_MOD_HOST_VERSION=[2,1,287];const K=1e4;export function isVersionAtLeast(o,t){const e=o.split(".").map(s=>Number.parseInt(s,10));for(let s=0;s<t.length;s++){const a=Number.isFinite(e[s])?e[s]:0;if(a>t[s])return!0;if(a<t[s])return!1}return!0}let y;function W(o){if(!(o.exitCode!==null||o.signalCode!==null)){if(process.platform==="win32"&&o.pid!==void 0){P("taskkill",["/pid",String(o.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"}).unref();return}o.kill("SIGKILL")}}export async function detectClaudeVersion(){if(y&&Date.now()-y.at<6e5)return y.value;const o=await new Promise(t=>{let e="";const s=process.platform==="win32"?P("claude --version",{windowsHide:!0,shell:!0,stdio:["ignore","pipe","pipe"]}):P("claude",["--version"],{windowsHide:!0,stdio:["ignore","pipe","pipe"]}),a=setTimeout(()=>{W(s),t(null)},5e3);s.stdout?.on("data",i=>e+=i.toString()),s.on("error",()=>{clearTimeout(a),t(null)}),s.on("close",()=>{clearTimeout(a);const i=/(\d+\.\d+\.\d+)/.exec(e);t(i?i[1]:null)})});return o!==null&&(y={value:o,at:Date.now()}),o}async function S(o,t,e){let s;try{s=await h(c.join(o,...t.split("/").filter(Boolean)),{withFileTypes:!0})}catch{return}for(const a of s){if(a.name==="node_modules"||a.name===".git")continue;const i=t?`${t}/${a.name}`:a.name;a.isDirectory()?await S(o,i,e):e.push({rel:i,abs:c.join(o,...i.split("/"))})}}const f=o=>o.ccPack||o.kind==="mod";async function R(o,t){const e=[];if(t.skills.length>0)for(const s of t.targets){if(s==="claude"&&f(t))continue;const a=$(s).projectSkillsRoots()[0];for(const i of t.skills){const r=[];await S(c.join(t.dir,"skills",i),"",r);for(const n of r)e.push({src:n.abs,rel:`${a}/${i}/${n.rel}`})}}if(!f(t))for(const s of t.targets)for(const[a,i]of[["commands","command"],["agents","agent"]]){const r=c.join(t.dir,a),n=[];if(await S(r,"",n),n.length===0)continue;const l=J(i,s,o);if(l)for(const u of n){const k=u.rel.split("/").pop();e.push({src:u.abs,rel:j(c.relative(o,c.join(l,k)))})}}return e}function J(o,t,e){try{return H(o,t,"project",e,M())}catch{return null}}function j(o){return o.split(c.sep).join("/")}function C(o,t){return c.join(o,".weave","toolkit",`${t}.json`)}async function v(o){try{const t=JSON.parse(await I(o,"utf8"));return t&&typeof t=="object"&&typeof t.packId=="string"?t:null}catch{return null}}export async function projectFileNamespaces(o){const t=new Map,e=c.join(o,".weave","toolkit");let s;try{s=await h(e)}catch{return t}for(const a of s){if(!a.endsWith(".json"))continue;const i=await v(c.join(e,a)),r=i?m(i.sourceDir):void 0;if(!(!i||!r))for(const n of Object.keys(i.files))t.set(n,r)}return t}export async function projectPackFiles(o){const t=new Map,e=c.join(o,".weave","toolkit");let s;try{s=await h(e)}catch{return t}for(const a of s){if(!a.endsWith(".json"))continue;const i=await v(c.join(e,a));if(i)for(const[r,n]of Object.entries(i.files))typeof n=="string"&&t.set(r,n)}return t}async function T(o){try{return await I(o),!0}catch{return!1}}async function B(o,t){const e=new Set;for(const a of t){let i=c.posix.dirname(a);for(;i&&i!=="."&&i!=="/";)e.add(i),i=c.posix.dirname(i)}const s=[...e].sort((a,i)=>i.split("/").length-a.split("/").length);for(const a of s){const i=c.join(o,...a.split("/"));try{(await h(i)).length===0&&await w(i,{recursive:!0,force:!0})}catch{}}}export function evaluateModHostGate(o){return process.env.WEAVE_SKIP_MOD_VERSION_CHECK==="1"?{ok:!0}:o?isVersionAtLeast(o,MIN_MOD_HOST_VERSION)?{ok:!0}:{ok:!1,message:`\u5BBF\u4E3B Claude Code ${o} \u4F4E\u4E8E 2.1.287\uFF0Cmod \u5DE5\u5177\u5305\u4E0D\u843D\u76D8\uFF08\u8BF7\u5148\u5347\u7EA7 Claude Code\uFF09`}:{ok:!0,warning:"\u65E0\u6CD5\u68C0\u6D4B\u5BBF\u4E3B Claude Code \u7248\u672C\uFF0Cmod \u5DE5\u5177\u5305\u9700\u8981 \u2265 2.1.287 \u624D\u80FD\u88AB\u52A0\u8F7D"}}export class ToolkitService{deps;packsCache;constructor(t){this.deps=t}sources(){const t=[{root:this.deps.builtinRoot??L(),provenance:"builtin"}];if(this.deps.libraries)for(const s of A(this.deps.libraries))t.push({root:s,provenance:"market"});const e=new Set;return t.filter(s=>{const a=c.resolve(s.root);return e.has(a)?!1:(e.add(a),!0)})}async allPacks(){const t=this.sources(),e=t.map(n=>c.resolve(n.root)).join("|"),s=Date.now(),a=this.packsCache;if(a&&a.key===e&&s-a.at<K)return a.packs;const i=Promise.all(t.map(n=>V(n))).then(n=>n.flat()),r={at:s,key:e,packs:i};return this.packsCache=r,i.catch(()=>{this.packsCache===r&&(this.packsCache=void 0)}),i}async list(t){const e=this.requireProject(t),s=await this.allPacks(),a=await Promise.all(s.map(i=>this.packInfo(e,i)));return await this.healMeta(e,a),{packs:a,legacyCopies:await this.scanLegacyCopies(e)}}async enable(t,e,s){const a=this.requireProject(t),i=await this.resolvePack(e,s),r=[];if(i.kind==="mod"&&i.targets.includes("claude")){const d=this.deps.claudeVersion??detectClaudeVersion,p=evaluateModHostGate(await d());if(!p.ok)throw new ToolkitError(p.message??"mod host gate","host-version");p.warning&&r.push(p.warning)}const n=a.path;if(f(i)&&i.targets.includes("claude")){const d=this.pluginSurface();await N(d,i),await d.setProjectEnabled(n,i.name,!0,m(i.dir))}const l=C(n,i.id),u=await this.readRecordHealed(n,i.id),k=u??{packId:i.id,provenance:i.provenance,sourceRoot:i.sourceRoot,sourceDir:i.dir,enabledAt:new Date().toISOString(),files:{}};let E=u===null;const F=await R(n,i);for(const d of F){const p=c.join(n,...d.rel.split("/"));if(k.files[d.rel]!==void 0){await T(p)||(await b(c.dirname(p),{recursive:!0}),await D(d.src,p));continue}await g(p)==="missing"&&(await b(c.dirname(p),{recursive:!0}),await D(d.src,p),k.files[d.rel]=await g(d.src),E=!0)}return F.length>0?E&&(await b(c.dirname(l),{recursive:!0}),await x(l,JSON.stringify(k,null,2)+`
2
- `,"utf8")):u&&await w(l,{force:!0}),i.weavePack&&O(a,i.id,!0,{projects:this.deps.projects}),this.rememberEnabled(a,i.id,!0),{pack:await this.packInfo(this.requireProject(t),i),warnings:r}}async disable(t,e,s){const a=this.requireProject(t),i=await this.resolvePack(e,s);return await this.applyDisabled(a,i),{pack:await this.packInfo(this.requireProject(t),i),warnings:[]}}async applyDisabled(t,e){await this.removePackFiles(t,e,e.sourceRoot),f(e)&&e.targets.includes("claude")&&await this.pluginSurface().setProjectEnabled(t.path,e.name,!1,m(e.dir)),e.weavePack&&O(t,e.id,!1,{projects:this.deps.projects}),this.rememberEnabled(t,e.id,!1)}async uninstall(t,e,s){const a=this.requireProject(t),i=await this.resolvePack(e,s);return await this.applyDisabled(a,i),f(i)&&i.targets.includes("claude")&&await this.pluginSurface().uninstall(i.name,m(i.dir)),{pack:await this.packInfo(this.requireProject(t),i),warnings:[]}}async removePackFiles(t,e,s){const a=C(t.path,e.id),i=await v(a);if(!i||s&&c.resolve(i.sourceRoot)!==c.resolve(s))return;const r=[];for(const[n,l]of Object.entries(i.files)){const u=c.join(t.path,...n.split("/"));await g(u)===l&&(await w(u,{force:!0}),r.push(n))}await w(a,{force:!0}),await B(t.path,r)}requireProject(t){const e=this.deps.projects.getById(t);if(!e)throw new ToolkitError(`Project not found: ${t}`,"not-found");return e}async resolvePack(t,e){this.packsCache=void 0;const s=(await this.allPacks()).filter(i=>i.id===t);if(e){const i=s.find(r=>c.resolve(r.sourceRoot)===c.resolve(e));if(i)return i}const a=s.find(i=>i.provenance==="builtin")??s[0];if(!a)throw new ToolkitError(`Toolkit pack not found: ${t}`,"not-found");return a}async computeEnabled(t,e){const s=[],a=await this.readRecordHealed(t.path,e.id);if((await R(t.path,e)).length>0){let i=!!a;if(a){for(const r of Object.keys(a.files))if(!await T(c.join(t.path,...r.split("/")))){i=!1;break}}s.push(i)}if(f(e)&&e.targets.includes("claude")){const i=this.pluginSurface(),r=m(e.dir);s.push(await i.isInstalled(e.name,r)&&await i.readProjectEnabled(t.path,e.name,r))}return e.weavePack&&s.push(_(t,e.id,{states:this.deps.states,defaultEnabled:!1})),s.length>0?s.every(Boolean):!1}async installedScopes(t){const e=(await this.pluginSurface().readInstalled())[t];return!e||e.length===0?void 0:[...new Set(e.map(s=>s.scope??"user"))]}async packInfo(t,e){const s=await this.computeEnabled(t,e),a=m(e.dir),i=f(e)&&e.targets.includes("claude")?this.pluginSurface().pluginKey(e.name,a):void 0,r=i?await this.installedScopes(i):void 0,n={...e,...a?{namespace:a}:{},enabled:s,installed:await this.computeInstalled(t,e,s),...i?{key:i}:{},...r&&r.length>0?{scopes:r}:{}};if(e.weavePack){const l=this.deps.plugins.list().find(u=>u.id===e.id);l&&(n.weave={status:l.status,ruleCount:l.ruleCount,...l.error?{error:l.error}:{}})}return n}async computeInstalled(t,e,s){return e.weavePack&&!f(e)?!0:f(e)&&e.targets.includes("claude")?this.pluginSurface().isInstalled(e.name,m(e.dir)):s||!!await this.readRecordHealed(t.path,e.id)}enabledIndex(t){const e=this.deps.projects.getMeta(t.id)?.toolkit,s=e&&typeof e=="object"?e.enabled:void 0;return Array.isArray(s)?s.filter(a=>typeof a=="string"):[]}rememberEnabled(t,e,s){const a=new Set(this.enabledIndex(t));s?a.add(e):a.delete(e),this.deps.projects.setMeta(t.id,{toolkit:{enabled:[...a].sort()}})}async healMeta(t,e){const s=[...new Set(e.filter(n=>n.enabled).map(n=>n.id))].sort(),a=[...new Set(this.enabledIndex(t))].sort(),i=new Set(e.map(n=>n.id)),r=[...new Set([...a.filter(n=>!i.has(n)),...s])].sort();r.join(`
3
- `)!==a.join(`
4
- `)&&this.deps.projects.setMeta(t.id,{toolkit:{enabled:r}})}pluginSurface(){return this.deps.pluginSurface??q("claude")}async readRecordHealed(t,e){const s=C(t,e),a=await v(s);if(!a)return null;const i=j(c.relative(t,this.pluginSurface().projectPluginDir(t))),r=Object.keys(a.files).filter(l=>l.startsWith(`${i}/`));if(r.length===0)return a;const n=[];for(const l of r){const u=c.join(t,...l.split("/"));await g(u)===a.files[l]&&(await w(u,{force:!0}),n.push(l)),delete a.files[l]}return await B(t,n),await x(s,JSON.stringify(a,null,2)+`
5
- `,"utf8"),a}async scanLegacyCopies(t){const e=this.pluginSurface().projectPluginDir(t.path);let s;try{s=await h(e,{withFileTypes:!0})}catch{return[]}return s.map(a=>j(c.relative(t.path,c.join(e,a.name)))).sort()}async cleanupLegacyCopies(t){const e=this.requireProject(t),s=this.pluginSurface().projectPluginDir(e.path);let a;try{a=await h(s,{withFileTypes:!0})}catch{return{removed:[]}}const i=[];for(const r of a){const n=c.join(s,r.name);await w(n,{recursive:!0,force:!0}),i.push(j(c.relative(e.path,n)))}try{(await h(s)).length===0&&await w(s,{recursive:!0,force:!0})}catch{}return{removed:i.sort()}}}
1
+ import{cp as I,mkdir as P,readFile as T,readdir as h,rm as w,writeFile as F}from"node:fs/promises";import{spawn as S}from"node:child_process";import{homedir as H}from"node:os";import c from"node:path";import{hashFile as y}from"../install/fingerprint.js";import{fileAssetTargetDir as L}from"../install/file-assets.js";import{assetSurfaceFor as N,pluginSurfaceFor as $}from"../surfaces.js";import{marketLibraryRoots as q}from"../market/resolve.js";import{marketIdOf as m}from"../market/identity.js";import{installPluginPack as A}from"../install/plugin-install.js";import{effective as V,setProjectEnabled as O}from"./plugin-project-state.js";import{builtinToolkitRoot as K,discoverToolkitPacks as B}from"./toolkit-scan.js";export class ToolkitError extends Error{code;constructor(t,e){super(t),this.code=e,this.name="ToolkitError"}}export const MIN_MOD_HOST_VERSION=[2,1,287];const W=1e4;export function isVersionAtLeast(a,t){const e=a.split(".").map(s=>Number.parseInt(s,10));for(let s=0;s<t.length;s++){const n=Number.isFinite(e[s])?e[s]:0;if(n>t[s])return!0;if(n<t[s])return!1}return!0}let b;function J(a){if(!(a.exitCode!==null||a.signalCode!==null)){if(process.platform==="win32"&&a.pid!==void 0){S("taskkill",["/pid",String(a.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"}).unref();return}a.kill("SIGKILL")}}export async function detectClaudeVersion(){if(b&&Date.now()-b.at<6e5)return b.value;const a=await new Promise(t=>{let e="";const s=process.platform==="win32"?S("claude --version",{windowsHide:!0,shell:!0,stdio:["ignore","pipe","pipe"]}):S("claude",["--version"],{windowsHide:!0,stdio:["ignore","pipe","pipe"]}),n=setTimeout(()=>{J(s),t(null)},5e3);s.stdout?.on("data",i=>e+=i.toString()),s.on("error",()=>{clearTimeout(n),t(null)}),s.on("close",()=>{clearTimeout(n);const i=/(\d+\.\d+\.\d+)/.exec(e);t(i?i[1]:null)})});return a!==null&&(b={value:a,at:Date.now()}),a}async function C(a,t,e){let s;try{s=await h(c.join(a,...t.split("/").filter(Boolean)),{withFileTypes:!0})}catch{return}for(const n of s){if(n.name==="node_modules"||n.name===".git")continue;const i=t?`${t}/${n.name}`:n.name;n.isDirectory()?await C(a,i,e):e.push({rel:i,abs:c.join(a,...i.split("/"))})}}const p=a=>a.ccPack||a.kind==="mod";async function R(a,t){const e=[];if(t.skills.length>0)for(const s of t.targets){if(s==="claude"&&p(t))continue;const n=N(s).projectSkillsRoots()[0];for(const i of t.skills){const o=[];await C(c.join(t.dir,"skills",i),"",o);for(const r of o)e.push({src:r.abs,rel:`${n}/${i}/${r.rel}`})}}if(!p(t))for(const s of t.targets)for(const[n,i]of[["commands","command"],["agents","agent"]]){const o=c.join(t.dir,n),r=[];if(await C(o,"",r),r.length===0)continue;const l=G(i,s,a);if(l)for(const u of r){const g=u.rel.split("/").pop();e.push({src:u.abs,rel:v(c.relative(a,c.join(l,g)))})}}return e}function G(a,t,e){try{return L(a,t,"project",e,H())}catch{return null}}function v(a){return a.split(c.sep).join("/")}function x(a,t){return c.join(a,".weave","toolkit",`${t}.json`)}async function k(a){try{const t=JSON.parse(await T(a,"utf8"));return t&&typeof t=="object"&&typeof t.packId=="string"?t:null}catch{return null}}export async function projectFileNamespaces(a){const t=new Map,e=c.join(a,".weave","toolkit");let s;try{s=await h(e)}catch{return t}for(const n of s){if(!n.endsWith(".json"))continue;const i=await k(c.join(e,n)),o=i?m(i.sourceDir):void 0;if(!(!i||!o))for(const r of Object.keys(i.files))t.set(r,o)}return t}export async function projectPackFiles(a){const t=new Map,e=c.join(a,".weave","toolkit");let s;try{s=await h(e)}catch{return t}for(const n of s){if(!n.endsWith(".json"))continue;const i=await k(c.join(e,n));if(i)for(const[o,r]of Object.entries(i.files))typeof r=="string"&&t.set(o,r)}return t}async function M(a){try{return await T(a),!0}catch{return!1}}async function _(a,t){const e=new Set;for(const n of t){let i=c.posix.dirname(n);for(;i&&i!=="."&&i!=="/";)e.add(i),i=c.posix.dirname(i)}const s=[...e].sort((n,i)=>i.split("/").length-n.split("/").length);for(const n of s){const i=c.join(a,...n.split("/"));try{(await h(i)).length===0&&await w(i,{recursive:!0,force:!0})}catch{}}}export function evaluateModHostGate(a){return process.env.WEAVE_SKIP_MOD_VERSION_CHECK==="1"?{ok:!0}:a?isVersionAtLeast(a,MIN_MOD_HOST_VERSION)?{ok:!0}:{ok:!1,message:`\u5BBF\u4E3B Claude Code ${a} \u4F4E\u4E8E 2.1.287\uFF0Cmod \u5DE5\u5177\u5305\u4E0D\u843D\u76D8\uFF08\u8BF7\u5148\u5347\u7EA7 Claude Code\uFF09`}:{ok:!0,warning:"\u65E0\u6CD5\u68C0\u6D4B\u5BBF\u4E3B Claude Code \u7248\u672C\uFF0Cmod \u5DE5\u5177\u5305\u9700\u8981 \u2265 2.1.287 \u624D\u80FD\u88AB\u52A0\u8F7D"}}export class ToolkitService{deps;packsCache;constructor(t){this.deps=t}sources(){const e=[{root:this.deps.builtinRoot??K(),provenance:"builtin"}];if(this.deps.libraries)for(const n of q(this.deps.libraries))e.push({root:n,provenance:"market"});const s=new Set;return e.filter(n=>{const i=c.resolve(n.root);return s.has(i)?!1:(s.add(i),!0)})}async allPacks(){const t=this.sources(),e=t.map(r=>c.resolve(r.root)).join("|"),s=Date.now(),n=this.packsCache;if(n&&n.key===e&&s-n.at<W)return n.packs;const i=Promise.all(t.map(r=>B(r))).then(r=>r.flat()),o={at:s,key:e,packs:i};return this.packsCache=o,i.catch(()=>{this.packsCache===o&&(this.packsCache=void 0)}),i}async list(t){const e=this.requireProject(t),s=await this.allPacks(),n=await Promise.all(s.map(i=>this.packInfo(e,i)));return await this.healMeta(e,n),{packs:n,legacyCopies:await this.scanLegacyCopies(e)}}async enable(t,e,s){const n=this.requireProject(t),i=await this.resolvePack(e,s),o=[];if(i.kind==="mod"&&i.targets.includes("claude")){const d=this.deps.claudeVersion??detectClaudeVersion,f=evaluateModHostGate(await d());if(!f.ok)throw new ToolkitError(f.message??"mod host gate","host-version");f.warning&&o.push(f.warning)}const r=n.path;if(p(i)&&i.targets.includes("claude")){const d=this.pluginSurface();await A(d,i),await d.setProjectEnabled(r,i.name,!0,m(i.dir))}const u=x(r,i.id),g=await this.readRecordHealed(r,i.id),j=g??{packId:i.id,provenance:i.provenance,sourceRoot:i.sourceRoot,sourceDir:i.dir,enabledAt:new Date().toISOString(),files:{}};let E=g===null;const D=await R(r,i);for(const d of D){const f=c.join(r,...d.rel.split("/"));if(j.files[d.rel]!==void 0){await M(f)||(await P(c.dirname(f),{recursive:!0}),await I(d.src,f));continue}await y(f)==="missing"&&(await P(c.dirname(f),{recursive:!0}),await I(d.src,f),j.files[d.rel]=await y(d.src),E=!0)}return D.length>0?E&&(await P(c.dirname(u),{recursive:!0}),await F(u,JSON.stringify(j,null,2)+`
2
+ `,"utf8")):g&&await w(u,{force:!0}),i.weavePack&&O(n,i.id,!0,{projects:this.deps.projects}),this.rememberEnabled(n,i.id,!0),{pack:await this.packInfo(this.requireProject(t),i),warnings:o}}async disable(t,e,s){const n=this.requireProject(t),i=await this.resolvePack(e,s);return await this.applyDisabled(n,i),{pack:await this.packInfo(this.requireProject(t),i),warnings:[]}}async applyDisabled(t,e){await this.removePackFiles(t,e,e.sourceRoot),p(e)&&e.targets.includes("claude")&&await this.pluginSurface().setProjectEnabled(t.path,e.name,!1,m(e.dir)),e.weavePack&&O(t,e.id,!1,{projects:this.deps.projects}),this.rememberEnabled(t,e.id,!1)}async uninstall(t,e,s){const n=this.requireProject(t),i=await this.resolvePack(e,s);return await this.applyDisabled(n,i),p(i)&&i.targets.includes("claude")&&await this.pluginSurface().uninstall(i.name,m(i.dir)),{pack:await this.packInfo(this.requireProject(t),i),warnings:[]}}async removePackFiles(t,e,s){const n=x(t.path,e.id),i=await k(n);if(!i||s&&c.resolve(i.sourceRoot)!==c.resolve(s))return;const o=[];for(const[r,l]of Object.entries(i.files)){const u=c.join(t.path,...r.split("/"));await y(u)===l&&(await w(u,{force:!0}),o.push(r))}await w(n,{force:!0}),await _(t.path,o)}requireProject(t){const e=this.deps.projects.getById(t);if(!e)throw new ToolkitError(`Project not found: ${t}`,"not-found");return e}async resolvePack(t,e){this.packsCache=void 0;const s=(await this.allPacks()).filter(o=>o.id===t);if(e){const o=s.find(r=>c.resolve(r.sourceRoot)===c.resolve(e));if(o)return o}const i=s.find(o=>o.provenance==="builtin")??s[0];if(!i)throw new ToolkitError(`Toolkit pack not found: ${t}`,"not-found");return i}async computeEnabled(t,e){const s=[],n=await this.readRecordHealed(t.path,e.id);if((await R(t.path,e)).length>0){let o=!!n;if(n){for(const r of Object.keys(n.files))if(!await M(c.join(t.path,...r.split("/")))){o=!1;break}}s.push(o)}if(p(e)&&e.targets.includes("claude")){const o=this.pluginSurface(),r=m(e.dir);s.push(await o.isInstalled(e.name,r)&&await o.readProjectEnabled(t.path,e.name,r))}return e.weavePack&&s.push(V(t,e.id,{states:this.deps.states,defaultEnabled:!1})),s.length>0?s.every(Boolean):!1}async installedScopes(t){const e=(await this.pluginSurface().readInstalled())[t];return!e||e.length===0?void 0:[...new Set(e.map(n=>n.scope??"user"))]}async packInfo(t,e){const s=await this.computeEnabled(t,e),n=m(e.dir),i=p(e)&&e.targets.includes("claude")?this.pluginSurface().pluginKey(e.name,n):void 0,o=i?await this.installedScopes(i):void 0,r={...e,...n?{namespace:n}:{},enabled:s,installed:await this.computeInstalled(t,e,s),...i?{key:i}:{},...o&&o.length>0?{scopes:o}:{}};if(e.weavePack){const l=this.deps.plugins.list().find(u=>u.id===e.id);l&&(r.weave={status:l.status,ruleCount:l.ruleCount,...l.error?{error:l.error}:{}})}return r}async computeInstalled(t,e,s){return e.weavePack&&!p(e)?!0:p(e)&&e.targets.includes("claude")?this.pluginSurface().isInstalled(e.name,m(e.dir)):s||!!await this.readRecordHealed(t.path,e.id)}enabledIndex(t){const s=this.deps.projects.getMeta(t.id)?.toolkit,n=s&&typeof s=="object"?s.enabled:void 0;return Array.isArray(n)?n.filter(i=>typeof i=="string"):[]}rememberEnabled(t,e,s){const n=new Set(this.enabledIndex(t));s?n.add(e):n.delete(e),this.deps.projects.setMeta(t.id,{toolkit:{enabled:[...n].sort()}})}async healMeta(t,e){const s=[...new Set(e.filter(r=>r.enabled).map(r=>r.id))].sort(),n=[...new Set(this.enabledIndex(t))].sort(),i=new Set(e.map(r=>r.id)),o=[...new Set([...n.filter(r=>!i.has(r)),...s])].sort();o.join(`
3
+ `)!==n.join(`
4
+ `)&&this.deps.projects.setMeta(t.id,{toolkit:{enabled:o}})}pluginSurface(){return this.deps.pluginSurface??$("claude")}async readRecordHealed(t,e){const s=x(t,e),n=await k(s);if(!n)return null;const i=v(c.relative(t,this.pluginSurface().projectPluginDir(t))),o=Object.keys(n.files).filter(l=>l.startsWith(`${i}/`));if(o.length===0)return n;const r=[];for(const l of o){const u=c.join(t,...l.split("/"));await y(u)===n.files[l]&&(await w(u,{force:!0}),r.push(l)),delete n.files[l]}return await _(t,r),await F(s,JSON.stringify(n,null,2)+`
5
+ `,"utf8"),n}async scanLegacyCopies(t){const e=this.pluginSurface().projectPluginDir(t.path);let s;try{s=await h(e,{withFileTypes:!0})}catch{return[]}return s.map(n=>v(c.relative(t.path,c.join(e,n.name)))).sort()}async cleanupLegacyCopies(t){const e=this.requireProject(t),s=this.pluginSurface().projectPluginDir(e.path);let n;try{n=await h(s,{withFileTypes:!0})}catch{return{removed:[]}}const i=[];for(const o of n){const r=c.join(s,o.name);await w(r,{recursive:!0,force:!0}),i.push(v(c.relative(e.path,r)))}try{(await h(s)).length===0&&await w(s,{recursive:!0,force:!0})}catch{}return{removed:i.sort()}}}
@@ -1 +1 @@
1
- import{HARNESS_LIFECYCLE as r}from"@weavecode/core";import{messagingSurfaceFor as a}from"../surfaces.js";import{claudeLivenessById as c,pidAliveOf as l}from"../daemon/claude-liveness.js";const u=1e3;export class WatchEngine{deps;lastHitAt=new Map;constructor(s){this.deps=s,s.bus.subscribe(e=>this.onBus(e))}onEvent(s){try{const e=(this.deps.surfaceFor?.(s.source)??a(s.source)).idleSignals.includes(s.eventType),i=r[s.source].close.includes(s.eventType);if(!e&&!i)return;for(const t of this.deps.watches.listPendingByTarget(s.sessionId))i&&t.onEvents.includes("turnEnd")?this.fire(t,"turnEnd"):e&&t.onEvents.includes("idle")&&this.fire(t,"idle")}catch{}}onBus(s){if(s.kind==="message.finished"&&!(s.status!=="failed"&&s.status!=="timeout"))try{for(const e of this.deps.watches.listPendingByTarget(s.sessionId))e.onEvents.includes("messageFailed")&&this.fire(e,"messageFailed")}catch{}}created(s){try{if(!s.onEvents.includes("idle")&&!s.onEvents.includes("turnEnd"))return;this.deps.sessions.turnOpenOf(s.targetSessionId)===!1&&this.fire(s,s.onEvents.includes("idle")?"idle":"turnEnd")}catch{}}sweepTerminated(){try{const s=this.deps.livenessOf?.()??c(),e=new Map(this.deps.sessions.listWithCounts().map(t=>[t.sessionId,t]));let i=0;for(const t of this.deps.watches.listPending()){if(t.remaining===null||!t.onEvents.includes("idle")&&!t.onEvents.includes("turnEnd"))continue;const n=e.get(t.targetSessionId);n&&l(n,s)!==!1||this.fire(t,"idle")&&i++}return i}catch{return 0}}fire(s,e){const i=Date.now(),t=this.lastHitAt.get(s.id);if(t!==void 0&&i-t<u)return!1;const n=this.deps.watches.consumeHit(s.id);if(!n)return!1;this.lastHitAt.set(s.id,i),n.firedAt!==null&&this.lastHitAt.delete(s.id);const o=new Date(i).toISOString();return this.deps.bus.emit({kind:"watch.fired",watchId:s.id,targetSessionId:s.targetSessionId,watcherSessionId:s.watcherSessionId,reason:e,at:o}),s.watcherSessionId==null||this.deps.deliverer.send({toSessionId:s.watcherSessionId,text:s.notify??this.defaultNotify(s.targetSessionId,e),fromKind:"session",fromSessionId:s.targetSessionId,mode:"inject"}).catch(()=>{}),!0}defaultNotify(s,e){return`Session ${this.deps.sessions.getBySessionId(s)?.title??s.slice(0,8)} ${watchReasonPhrase(e)} (trigger=watch:${s})`}}export function watchReasonPhrase(d){return d==="messageFailed"?"had a failed message delivery":d==="turnEnd"?"finished its turn":"is now idle"}
1
+ import{HARNESS_LIFECYCLE as o}from"@weavecode/core";import{messagingSurfaceFor as c}from"../surfaces.js";import{pidAliveOf as a}from"../daemon/claude-liveness.js";import{combinedLivenessOf as l}from"../daemon/liveness.js";const f=1e3;export class WatchEngine{deps;lastHitAt=new Map;constructor(e){this.deps=e,e.bus.subscribe(t=>this.onBus(t))}onEvent(e){try{const i=(this.deps.surfaceFor?.(e.source)??c(e.source)).idleSignals.includes(e.eventType),n=o[e.source].close.includes(e.eventType);if(!i&&!n)return;for(const d of this.deps.watches.listPendingByTarget(e.sessionId))n&&d.onEvents.includes("turnEnd")?this.fire(d,"turnEnd"):i&&d.onEvents.includes("idle")&&this.fire(d,"idle")}catch{}}onBus(e){if(e.kind==="message.finished"&&!(e.status!=="failed"&&e.status!=="timeout"))try{for(const t of this.deps.watches.listPendingByTarget(e.sessionId))t.onEvents.includes("messageFailed")&&this.fire(t,"messageFailed")}catch{}}created(e){try{if(!e.onEvents.includes("idle")&&!e.onEvents.includes("turnEnd"))return;this.deps.sessions.turnOpenOf(e.targetSessionId)===!1&&this.fire(e,e.onEvents.includes("idle")?"idle":"turnEnd")}catch{}}sweepTerminated(){try{const e=this.deps.livenessOf?.()??l(),t=new Map(this.deps.sessions.listWithCounts().map(s=>[s.sessionId,s]));let i=0;for(const s of this.deps.watches.listPending()){if(s.remaining===null||!s.onEvents.includes("idle")&&!s.onEvents.includes("turnEnd"))continue;const n=t.get(s.targetSessionId);n&&a(n,e)!==!1||this.fire(s,"idle")&&i++}return i}catch{return 0}}fire(e,t){const i=Date.now(),s=this.lastHitAt.get(e.id);if(s!==void 0&&i-s<f)return!1;const n=this.deps.watches.consumeHit(e.id);if(!n)return!1;this.lastHitAt.set(e.id,i),n.firedAt!==null&&this.lastHitAt.delete(e.id);const d=new Date(i).toISOString();return this.deps.bus.emit({kind:"watch.fired",watchId:e.id,targetSessionId:e.targetSessionId,watcherSessionId:e.watcherSessionId,reason:t,at:d}),e.watcherSessionId==null||this.deps.deliverer.send({toSessionId:e.watcherSessionId,text:e.notify??this.defaultNotify(e.targetSessionId,t),fromKind:"session",fromSessionId:e.targetSessionId,mode:"inject"}).catch(()=>{}),!0}defaultNotify(e,t){return`Session ${this.deps.sessions.getBySessionId(e)?.title??e.slice(0,8)} ${watchReasonPhrase(t)} (trigger=watch:${e})`}}export function watchReasonPhrase(r){return r==="messageFailed"?"had a failed message delivery":r==="turnEnd"?"finished its turn":"is now idle"}
@@ -33,6 +33,7 @@ export { resolveStaticDir } from './daemon/static.js';
33
33
  export { startDaemon } from './daemon/start.js';
34
34
  export { registerProject, unregisterProject } from './registry.js';
35
35
  export type { RegisterResult, UnregisterResult } from './registry.js';
36
+ export { probeBinVersion } from './daemon/project-harnesses.js';
36
37
  export { classifyAsset, normalizeRelPath } from './watch/classifier.js';
37
38
  export { WatchCache } from './watch/cache.js';
38
39
  export { WatchService } from './watch/watch-service.js';
@@ -1 +1 @@
1
- import{existsSync as o}from"node:fs";import{fileURLToPath as r}from"node:url";export{openDatabase}from"./db/db.js";export{getDataDir,getDbPath,getDaemonStatePath,getAuthPath,getInitialPasswordPath}from"./db/paths.js";export{ensureDataLayout,migrateDataLayout}from"./db/layout.js";export{ProjectRepository}from"./repositories/projects.js";export{HookEventRepository}from"./repositories/hook-events.js";export{SessionRepository}from"./repositories/sessions.js";export{LibraryRepository}from"./repositories/libraries.js";export{DEFAULT_PORT,DAEMON_HOST,isPortFree,findFreePort}from"./daemon/port.js";export{readDaemonState,writeDaemonState,clearDaemonState}from"./daemon/state.js";export{generateToken}from"./daemon/auth.js";export{createWeaveServer,weaveRequestHandler,DAEMON_VERSION}from"./daemon/server.js";export{accessUrls,lanIps,ensureDaemonCert,startTlsServer,daemonCertsDir}from"./daemon/tls.js";export{readDaemonSettings,writeDaemonSettings,terminalPresetsFor,resolveLocale,DEFAULT_DAEMON_SETTINGS,SUPPORTED_LOCALES,DEFAULT_LOCALE}from"./daemon/settings.js";export{resolveTerminalLaunch,resolveExplorerLaunch,openInExplorer,openInTerminal,runInTerminal,defaultProjectOpener}from"./daemon/opener.js";export{resolveStaticDir}from"./daemon/static.js";export{startDaemon}from"./daemon/start.js";export{registerProject,unregisterProject}from"./registry.js";export{classifyAsset,normalizeRelPath}from"./watch/classifier.js";export{WatchCache}from"./watch/cache.js";export{WatchService}from"./watch/watch-service.js";export{SyncScheduler}from"./watch/sync-scheduler.js";export{ClaudeCodeAdapter}from"./hooks/adapter.js";export{drainInboxOnce,handleIngestedRecords}from"./hooks/inbox-worker.js";export{MirrorWriter,hooksRoot,hookShardId,appendOutbox}from"./hooks/mirror.js";export{scanLibrarySkills,scanLibraryMcp,scanLibraryFileAssets}from"./install/scanner.js";export{FILE_ASSET_SPECS,FILE_ASSET_CATEGORIES,fileAssetTargetDir,isFileAssetCategory}from"./install/file-assets.js";export{installSkill,uninstallSkill,installFileAsset,uninstallFileAsset,installMcp,uninstallMcp,InstallConflictError,AssetNotFoundError}from"./install/installer.js";export{readMcpServers,readMcpJson}from"./install/installer.js";export{codexConfigFile,readCodexMcpServers,writeCodexMcpServer,removeCodexMcpServer,codexMcpExists,readCodexMcpFromText,upsertCodexMcpInText,removeCodexMcpFromText,upsertCodexPluginEnabledInText,parseDottedKey,sectionHeaderKey,renderTomlHeader,renderTomlKey,renderTomlString,splitTomlSections,upsertTomlSection,removeTomlSection,parseSectionEntries,CodexTomlCorruptError}from"./install/codex-toml.js";export{buildLibraryIndex,findSkillSource,findFileAssetSource}from"./install/library-index.js";export{hashSkillDir,maxMtimeDir,hashMcpConfig,hashFile,FingerprintCache}from"./install/fingerprint.js";export{projectFileNamespaces,projectPackFiles}from"./hooks/toolkit.js";export{detectUpdates,detectSkillUpdates,detectFileAssetUpdates,detectProjectUpdateCounts}from"./install/updates.js";export{detectPluginTemplateUpdates}from"./install/plugin-templates.js";export{readProjectFile,resolveProjectFile,PathEscapeError,FileTooLargeError}from"./install/reader.js";export{readGlobalClaudeJson,readGlobalMcpServers,writeGlobalMcpServer,removeGlobalMcpServer,readGlobalSkills,installGlobalSkill,uninstallGlobalSkill,ClaudeJsonCorruptError,globalPersonalSkillRoots,resolveGlobalSkillDir,listGlobalSkillFiles,readGlobalSkillFile}from"./install/global-config.js";export{readMcpEnableMap,setMcpEnableState}from"./install/settings-mcp.js";export{mcpOverrideOf,resolveMcpEffective,setMcpEnableOverride}from"./install/settings-mcp.js";export{readMcpRows}from"./install/mcp-rows.js";export{readPluginRows}from"./install/plugin-rows.js";export{installPluginPack}from"./install/plugin-install.js";export{readProjectConfig,writeProjectConfig,markSynced,DEFAULT_PROJECT_CONFIG}from"./install/project-config.js";export{applyUpdate,syncAll,refreshStatusline}from"./install/apply-update.js";export{DEFAULT_STATUSLINE_CONFIG,POWERLINE_DEFAULT_GLYPHS,SEGMENT_ORDER,LEGACY_IDENTITY_LINE,LEGACY_METRICS_LINE,NAMED_COLORS,SEGMENT_TOKENS,SEGMENT_DEFAULT_FORMAT,CONTEXT_STYLE_FORMAT,PLAIN_STATUSLINE_CONFIG}from"./statusline/config.js";export{WEAVE_VERSION}from"./version.js";export{generateStatuslineScript,statuslineCacheDir}from"./statusline/generator.js";export{StatuslineCacheSweeper,startStatuslineCacheSweeper}from"./statusline/cache-sweeper.js";export{readStatuslineConfig,writeStatuslineConfig,readGlobalStatuslineConfig,writeGlobalStatuslineConfig,applyStatuslineConfig,ensureSettingsStatusLine,readStatuslineScript}from"./statusline/manager.js";export function resolveDaemonEntry(){const e=r(new URL("./daemon/entry.js",import.meta.url));return o(e)?{path:e,isTs:!1}:{path:r(new URL("./daemon/entry.ts",import.meta.url)),isTs:!0}}export{installPlugin,uninstallPlugin,exportPlugin,searchPlugins,globalPluginRoot,isGitSource}from"./hooks/plugin-installer.js";
1
+ import{existsSync as o}from"node:fs";import{fileURLToPath as r}from"node:url";export{openDatabase}from"./db/db.js";export{getDataDir,getDbPath,getDaemonStatePath,getAuthPath,getInitialPasswordPath}from"./db/paths.js";export{ensureDataLayout,migrateDataLayout}from"./db/layout.js";export{ProjectRepository}from"./repositories/projects.js";export{HookEventRepository}from"./repositories/hook-events.js";export{SessionRepository}from"./repositories/sessions.js";export{LibraryRepository}from"./repositories/libraries.js";export{DEFAULT_PORT,DAEMON_HOST,isPortFree,findFreePort}from"./daemon/port.js";export{readDaemonState,writeDaemonState,clearDaemonState}from"./daemon/state.js";export{generateToken}from"./daemon/auth.js";export{createWeaveServer,weaveRequestHandler,DAEMON_VERSION}from"./daemon/server.js";export{accessUrls,lanIps,ensureDaemonCert,startTlsServer,daemonCertsDir}from"./daemon/tls.js";export{readDaemonSettings,writeDaemonSettings,terminalPresetsFor,resolveLocale,DEFAULT_DAEMON_SETTINGS,SUPPORTED_LOCALES,DEFAULT_LOCALE}from"./daemon/settings.js";export{resolveTerminalLaunch,resolveExplorerLaunch,openInExplorer,openInTerminal,runInTerminal,defaultProjectOpener}from"./daemon/opener.js";export{resolveStaticDir}from"./daemon/static.js";export{startDaemon}from"./daemon/start.js";export{registerProject,unregisterProject}from"./registry.js";export{probeBinVersion}from"./daemon/project-harnesses.js";export{classifyAsset,normalizeRelPath}from"./watch/classifier.js";export{WatchCache}from"./watch/cache.js";export{WatchService}from"./watch/watch-service.js";export{SyncScheduler}from"./watch/sync-scheduler.js";export{ClaudeCodeAdapter}from"./hooks/adapter.js";export{drainInboxOnce,handleIngestedRecords}from"./hooks/inbox-worker.js";export{MirrorWriter,hooksRoot,hookShardId,appendOutbox}from"./hooks/mirror.js";export{scanLibrarySkills,scanLibraryMcp,scanLibraryFileAssets}from"./install/scanner.js";export{FILE_ASSET_SPECS,FILE_ASSET_CATEGORIES,fileAssetTargetDir,isFileAssetCategory}from"./install/file-assets.js";export{installSkill,uninstallSkill,installFileAsset,uninstallFileAsset,installMcp,uninstallMcp,InstallConflictError,AssetNotFoundError}from"./install/installer.js";export{readMcpServers,readMcpJson}from"./install/installer.js";export{codexConfigFile,readCodexMcpServers,writeCodexMcpServer,removeCodexMcpServer,codexMcpExists,readCodexMcpFromText,upsertCodexMcpInText,removeCodexMcpFromText,upsertCodexPluginEnabledInText,parseDottedKey,sectionHeaderKey,renderTomlHeader,renderTomlKey,renderTomlString,splitTomlSections,upsertTomlSection,removeTomlSection,parseSectionEntries,CodexTomlCorruptError}from"./install/codex-toml.js";export{buildLibraryIndex,findSkillSource,findFileAssetSource}from"./install/library-index.js";export{hashSkillDir,maxMtimeDir,hashMcpConfig,hashFile,FingerprintCache}from"./install/fingerprint.js";export{projectFileNamespaces,projectPackFiles}from"./hooks/toolkit.js";export{detectUpdates,detectSkillUpdates,detectFileAssetUpdates,detectProjectUpdateCounts}from"./install/updates.js";export{detectPluginTemplateUpdates}from"./install/plugin-templates.js";export{readProjectFile,resolveProjectFile,PathEscapeError,FileTooLargeError}from"./install/reader.js";export{readGlobalClaudeJson,readGlobalMcpServers,writeGlobalMcpServer,removeGlobalMcpServer,readGlobalSkills,installGlobalSkill,uninstallGlobalSkill,ClaudeJsonCorruptError,globalPersonalSkillRoots,resolveGlobalSkillDir,listGlobalSkillFiles,readGlobalSkillFile}from"./install/global-config.js";export{readMcpEnableMap,setMcpEnableState}from"./install/settings-mcp.js";export{mcpOverrideOf,resolveMcpEffective,setMcpEnableOverride}from"./install/settings-mcp.js";export{readMcpRows}from"./install/mcp-rows.js";export{readPluginRows}from"./install/plugin-rows.js";export{installPluginPack}from"./install/plugin-install.js";export{readProjectConfig,writeProjectConfig,markSynced,DEFAULT_PROJECT_CONFIG}from"./install/project-config.js";export{applyUpdate,syncAll,refreshStatusline}from"./install/apply-update.js";export{DEFAULT_STATUSLINE_CONFIG,POWERLINE_DEFAULT_GLYPHS,SEGMENT_ORDER,LEGACY_IDENTITY_LINE,LEGACY_METRICS_LINE,NAMED_COLORS,SEGMENT_TOKENS,SEGMENT_DEFAULT_FORMAT,CONTEXT_STYLE_FORMAT,PLAIN_STATUSLINE_CONFIG}from"./statusline/config.js";export{WEAVE_VERSION}from"./version.js";export{generateStatuslineScript,statuslineCacheDir}from"./statusline/generator.js";export{StatuslineCacheSweeper,startStatuslineCacheSweeper}from"./statusline/cache-sweeper.js";export{readStatuslineConfig,writeStatuslineConfig,readGlobalStatuslineConfig,writeGlobalStatuslineConfig,applyStatuslineConfig,ensureSettingsStatusLine,readStatuslineScript}from"./statusline/manager.js";export function resolveDaemonEntry(){const e=r(new URL("./daemon/entry.js",import.meta.url));return o(e)?{path:e,isTs:!1}:{path:r(new URL("./daemon/entry.ts",import.meta.url)),isTs:!0}}export{installPlugin,uninstallPlugin,exportPlugin,searchPlugins,globalPluginRoot,isGitSource}from"./hooks/plugin-installer.js";
@@ -1 +1 @@
1
- import{rm as g,cp as y,mkdir as d}from"node:fs/promises";import{homedir as m}from"node:os";import f from"node:path";import{applyStatuslineConfig as w}from"../statusline/manager.js";import{readStatuslineConfig as S}from"../statusline/manager.js";import{buildLibraryIndex as l,findSkillSource as h,findMcpSource as k,findFileAssetSource as b}from"./library-index.js";import{detectUpdates as E}from"./updates.js";import{materializePluginTemplate as F}from"./plugin-templates.js";import{applyInitFile as $}from"./init-files.js";import{FILE_ASSET_SPECS as j,fileAssetTargetDir as x,isFileAssetCategory as A}from"./file-assets.js";import{assetSurfaceFor as u}from"../surfaces.js";export async function applyUpdate(t,a,p,c){const s=p??(c?await l(c):await l([])),o=a.agent??"claude";if(a.category==="skill"){const e=h(s,a.name);if(!e)throw new Error(`No library source for skill "${a.name}"`);const n=a.scope==="user"?u(o).globalSkillsRoots(m())[0]:f.join(t,...u(o).projectSkillsRoots()[0].split("/")),i=f.join(n,a.name);await g(i,{recursive:!0,force:!0}),await y(e.dirPath,i,{recursive:!0});return}if(A(a.category)){const e=b(s,a.category,a.name);if(!e)throw new Error(`No library source for ${a.category} "${a.name}"`);const n=x(a.category,o,a.scope,t,m());await d(n,{recursive:!0});const i=f.join(n,`${a.name}${j[a.category].ext}`);await g(i,{force:!0}),await y(e.filePath,i);return}const r=k(s,a.name);if(!r)throw new Error(`No library source for MCP "${a.name}"`);await u(o).mcpWrite(a.scope,t,m(),a.name,r.config)}export async function syncAll(t,a,p,c){const s=c??await l(a),o=await E(t,a,p,s),r=[];for(const e of o.skills)e.custom||!e.outdated||(await applyUpdate(t,{category:"skill",name:e.name,scope:e.scope,agent:e.agent},s),r.push({category:"skill",name:e.name,scope:e.scope,agent:e.agent}));for(const e of o.mcp)e.custom||!e.outdated||(await applyUpdate(t,{category:"mcp",name:e.name,scope:e.scope,agent:e.agent},s),r.push({category:"mcp",name:e.name,scope:e.scope,agent:e.agent}));for(const e of o.files)e.custom||!e.outdated||(await applyUpdate(t,{category:e.category,name:e.name,scope:e.scope},s),r.push({category:e.category,name:e.name,scope:e.scope}));for(const e of o.pluginTemplates)e.outdated&&(await F(e),r.push({category:e.category,name:e.name,scope:"project"}));for(const e of o.initFiles)await $(e)&&r.push({category:"init",name:e.relPath,scope:"project"});return{updated:r,skipped:0}}export async function refreshStatusline(t){const a=await S(t);await w(t,a)}
1
+ import{rm as u,cp as y,mkdir as d}from"node:fs/promises";import{homedir as f}from"node:os";import l from"node:path";import{applyStatuslineConfig as w}from"../statusline/manager.js";import{readStatuslineConfig as S}from"../statusline/manager.js";import{buildLibraryIndex as g,findSkillSource as k,findMcpSource as h,findFileAssetSource as x}from"./library-index.js";import{detectUpdates as E}from"./updates.js";import{materializePluginTemplate as F}from"./plugin-templates.js";import{applyInitFile as $}from"./init-files.js";import{FILE_ASSET_SPECS as A,fileAssetTargetDir as C,isFileAssetCategory as b}from"./file-assets.js";import{assetSurfaceFor as p}from"../surfaces.js";export async function applyUpdate(t,o,m,i){const c=m??(i?await g(i):await g([])),a=o.agent??"claude";if(o.category==="skill"){const e=k(c,o.name);if(!e)throw new Error(`No library source for skill "${o.name}"`);const n=o.scope==="user"?p(a).globalSkillsRoots(f())[0]:l.join(t,...p(a).projectSkillsRoots()[0].split("/")),s=l.join(n,o.name);await u(s,{recursive:!0,force:!0}),await y(e.dirPath,s,{recursive:!0});return}if(b(o.category)){const e=x(c,o.category,o.name);if(!e)throw new Error(`No library source for ${o.category} "${o.name}"`);const n=C(o.category,a,o.scope,t,f());await d(n,{recursive:!0});const s=l.join(n,`${o.name}${A[o.category].ext}`);await u(s,{force:!0}),await y(e.filePath,s);return}const r=h(c,o.name);if(!r)throw new Error(`No library source for MCP "${o.name}"`);await p(a).mcpWrite(o.scope,t,f(),o.name,r.config)}export async function syncAll(t,o,m,i){const c=i??await g(o),a=await E(t,o,m,c),r=[];for(const e of a.skills)e.custom||!e.outdated||(await applyUpdate(t,{category:"skill",name:e.name,scope:e.scope,agent:e.agent},c),r.push({category:"skill",name:e.name,scope:e.scope,agent:e.agent}));for(const e of a.mcp)e.custom||!e.outdated||(await applyUpdate(t,{category:"mcp",name:e.name,scope:e.scope,agent:e.agent},c),r.push({category:"mcp",name:e.name,scope:e.scope,agent:e.agent}));for(const e of a.files)e.custom||!e.outdated||(await applyUpdate(t,{category:e.category,name:e.name,scope:e.scope},c),r.push({category:e.category,name:e.name,scope:e.scope}));for(const e of a.pluginTemplates)e.outdated&&(await F(e),r.push({category:e.category,name:e.name,scope:"project"}));for(const e of a.initFiles)await $(e)&&r.push({category:"init",name:e.relPath,scope:"project"});return{updated:r,skipped:0}}export async function refreshStatusline(t){const o=await S(t);await w(t,o)}
@@ -1 +1 @@
1
- import p from"node:path";import{homedir as m}from"node:os";import{HARNESS_KEYS as l}from"@weavecode/core";import{FILE_ASSET_SPECS as h,FILE_ASSET_CATEGORIES as S}from"./file-assets.js";import{assetSurfaces as i,configSurfaces as j,statuslineSurfaces as E}from"../surfaces.js";function u(o,n){return p.join("~",p.relative(n,o)).split(p.sep).join("/")}export function installCapabilities(){const o=m(),n={};for(const s of S){const e=h[s].dirs,r=[];for(const t of l){const c=e[t];if(!c)continue;const a=[];c.project&&a.push("project"),c.user&&a.push("user"),a.length>0&&r.push({harness:t,scopes:a})}n[s]={surfaces:r}}n.skill={surfaces:i().map(s=>{const e=[],r={},t=s.projectSkillsRoots()[0];t&&(e.push("project"),r.project=t);const c=s.globalSkillsRoots(o)[0];return c&&(e.push("user"),r.user=u(c,o)),{harness:s.harness,scopes:e,dest:r}})},n.mcp={surfaces:i().map(s=>{const e={},r=s.mcpDest("project",o),t=s.mcpDest("user",o);return r&&(e.project=r),t&&(e.user=u(t,o)),{harness:s.harness,scopes:s.mcpScopes(),dest:e}}).filter(s=>s.scopes.length>0)};const f=E().map(({harness:s,surface:e})=>({harness:s,tui:e.tui,segments:[...e.segments]}));return{categories:n,statusline:f,config:j().map(s=>s.harness)}}
1
+ import p from"node:path";import{homedir as m}from"node:os";import{HARNESS_KEYS as l}from"@weavecode/core";import{FILE_ASSET_SPECS as h,FILE_ASSET_CATEGORIES as S}from"./file-assets.js";import{assetSurfaces as u,configSurfaces as j,statuslineSurfaces as E}from"../surfaces.js";function f(r,c){return p.join("~",p.relative(c,r)).split(p.sep).join("/")}export function installCapabilities(){const r=m(),c={};for(const s of S){const t=h[s].dirs,o=[];for(const e of l){const n=t[e];if(!n)continue;const i=[];n.project&&i.push("project"),n.user&&i.push("user"),i.length>0&&o.push({harness:e,scopes:i})}c[s]={surfaces:o}}c.skill={surfaces:u().map(s=>{const t=[],o={},e=s.projectSkillsRoots()[0];e&&(t.push("project"),o.project=e);const n=s.globalSkillsRoots(r)[0];return n&&(t.push("user"),o.user=f(n,r)),{harness:s.harness,scopes:t,dest:o}})},c.mcp={surfaces:u().map(s=>{const t={},o=s.mcpDest("project",r),e=s.mcpDest("user",r);return o&&(t.project=o),e&&(t.user=f(e,r)),{harness:s.harness,scopes:s.mcpScopes(),dest:t}}).filter(s=>s.scopes.length>0)};const a=E().map(({harness:s,surface:t})=>({harness:s,tui:t.tui,segments:[...t.segments]}));return{categories:c,statusline:a,config:j().map(s=>s.harness)}}
@@ -1 +1 @@
1
- import{homedir as t}from"node:os";import{assetSurfaceFor as n}from"../surfaces.js";import{codexMcpExists as p,readCodexMcpServers as x,removeCodexMcpServer as c,writeCodexMcpServer as d}from"@weavecode/harness";export{CodexTomlCorruptError,parseDottedKey,sectionHeaderKey,renderTomlKey,renderTomlHeader,renderTomlString,splitTomlSections,upsertTomlSection,removeTomlSection,parseSectionEntries,upsertCodexPluginEnabledInText,readCodexMcpFromText,upsertCodexMcpInText,removeCodexMcpFromText}from"@weavecode/harness";export function codexConfigFile(e=t()){return n("codex").userConfigFile(e)}export function readCodexMcpServers(e=codexConfigFile()){return x(e)}export function codexMcpExists(e,r=codexConfigFile()){return p(e,r)}export function writeCodexMcpServer(e,r,o=codexConfigFile()){return d(e,r,o)}export function removeCodexMcpServer(e,r=codexConfigFile()){return c(e,r)}
1
+ import{homedir as t}from"node:os";import{assetSurfaceFor as x}from"../surfaces.js";import{codexMcpExists as c,readCodexMcpServers as d,removeCodexMcpServer as n,writeCodexMcpServer as p}from"@weavecode/harness";export{CodexTomlCorruptError,parseDottedKey,sectionHeaderKey,renderTomlKey,renderTomlHeader,renderTomlString,splitTomlSections,upsertTomlSection,removeTomlSection,parseSectionEntries,upsertCodexPluginEnabledInText,readCodexMcpFromText,upsertCodexMcpInText,removeCodexMcpFromText}from"@weavecode/harness";export function codexConfigFile(e=t()){return x("codex").userConfigFile(e)}export function readCodexMcpServers(e=codexConfigFile()){return d(e)}export function codexMcpExists(e,r=codexConfigFile()){return c(e,r)}export function writeCodexMcpServer(e,r,o=codexConfigFile()){return p(e,r,o)}export function removeCodexMcpServer(e,r=codexConfigFile()){return n(e,r)}
@@ -1 +1 @@
1
- import{assetSurfaceFor as s}from"../surfaces.js";export{FILE_ASSET_SPECS,FILE_ASSET_CATEGORIES,isFileAssetCategory}from"@weavecode/harness";export function fileAssetTargetDir(r,e,t,i,o){return s(e).targetDir(r,t,i,o)}
1
+ import{assetSurfaceFor as i}from"../surfaces.js";export{FILE_ASSET_SPECS,FILE_ASSET_CATEGORIES,isFileAssetCategory}from"@weavecode/harness";export function fileAssetTargetDir(r,e,t,o,S){return i(e).targetDir(r,t,o,S)}
@@ -1 +1 @@
1
- import{readdir as m,readFile as u,stat as l}from"node:fs/promises";import{createHash as h}from"node:crypto";import c from"node:path";const f=new Set([".weave",".git","node_modules"]);export async function hashSkillDir(e,t=f){const r=h("sha256"),a=[];await p(e,e,a,t),a.sort((i,n)=>i.rel.localeCompare(n.rel));for(const i of a){r.update(i.rel),r.update("\0");let n;try{n=await u(i.abs)}catch{continue}r.update(n),r.update("\0")}return r.digest("hex")}async function p(e,t,r,a){let i;try{i=await m(t,{withFileTypes:!0})}catch{return}const n=[];for(const s of i)s.name.startsWith(".")&&a.has(s.name)||(!a.has(s.name)&&s.isDirectory()?n.push(p(e,c.join(t,s.name),r,a)):s.isFile()&&r.push({rel:c.relative(e,t).replace(/\\/g,"/")+"/"+s.name,abs:c.join(t,s.name)}));await Promise.all(n)}export async function maxMtimeDir(e,t=f){let r;try{r=await m(e,{withFileTypes:!0})}catch{return 0}return(await Promise.all(r.map(async a=>{if(a.name.startsWith(".")&&t.has(a.name))return 0;const i=c.join(e,a.name);if(a.isDirectory())return maxMtimeDir(i,t);if(!a.isFile())return 0;try{return(await l(i)).mtimeMs}catch{return 0}}))).reduce((a,i)=>Math.max(a,i),0)}export function hashMcpConfig(e){return h("sha256").update(JSON.stringify(o(e))).digest("hex")}export async function hashFile(e){try{const t=await u(e);return h("sha256").update(t).digest("hex")}catch{return"missing"}}function o(e){if(Array.isArray(e))return e.map(o);if(e&&typeof e=="object"){const t={};for(const r of Object.keys(e).sort())t[r]=o(e[r]);return t}return e}export class FingerprintCache{cache=new Map;fileCache=new Map;async get(t){const r=await maxMtimeDir(t),a=this.cache.get(t);if(a&&a.maxMtime===r)return a.hash;const i=await hashSkillDir(t);return this.cache.set(t,{maxMtime:r,hash:i}),i}async getFile(t){let r;try{r=(await l(t)).mtimeMs}catch{return"missing"}const a=this.fileCache.get(t);if(a&&a.maxMtime===r)return a.hash;const i=await hashFile(t);return this.fileCache.set(t,{maxMtime:r,hash:i}),i}invalidate(t){this.cache.delete(t)}clear(){this.cache.clear(),this.fileCache.clear()}}
1
+ import{readdir as m,readFile as u,stat as l}from"node:fs/promises";import{createHash as h}from"node:crypto";import c from"node:path";const f=new Set([".weave",".git","node_modules"]);export async function hashSkillDir(e,t=f){const a=h("sha256"),r=[];await p(e,e,r,t),r.sort((n,i)=>n.rel.localeCompare(i.rel));for(const n of r){a.update(n.rel),a.update("\0");let i;try{i=await u(n.abs)}catch{continue}a.update(i),a.update("\0")}return a.digest("hex")}async function p(e,t,a,r){let n;try{n=await m(t,{withFileTypes:!0})}catch{return}const i=[];for(const s of n)s.name.startsWith(".")&&r.has(s.name)||(!r.has(s.name)&&s.isDirectory()?i.push(p(e,c.join(t,s.name),a,r)):s.isFile()&&a.push({rel:c.relative(e,t).replace(/\\/g,"/")+"/"+s.name,abs:c.join(t,s.name)}));await Promise.all(i)}export async function maxMtimeDir(e,t=f){let a;try{a=await m(e,{withFileTypes:!0})}catch{return 0}return(await Promise.all(a.map(async n=>{if(n.name.startsWith(".")&&t.has(n.name))return 0;const i=c.join(e,n.name);if(n.isDirectory())return maxMtimeDir(i,t);if(!n.isFile())return 0;try{return(await l(i)).mtimeMs}catch{return 0}}))).reduce((n,i)=>Math.max(n,i),0)}export function hashMcpConfig(e){return h("sha256").update(JSON.stringify(o(e))).digest("hex")}export async function hashFile(e){try{const t=await u(e);return h("sha256").update(t).digest("hex")}catch{return"missing"}}function o(e){if(Array.isArray(e))return e.map(o);if(e&&typeof e=="object"){const t={};for(const a of Object.keys(e).sort())t[a]=o(e[a]);return t}return e}export class FingerprintCache{cache=new Map;fileCache=new Map;async get(t){const a=await maxMtimeDir(t),r=this.cache.get(t);if(r&&r.maxMtime===a)return r.hash;const n=await hashSkillDir(t);return this.cache.set(t,{maxMtime:a,hash:n}),n}async getFile(t){let a;try{a=(await l(t)).mtimeMs}catch{return"missing"}const r=this.fileCache.get(t);if(r&&r.maxMtime===a)return r.hash;const n=await hashFile(t);return this.fileCache.set(t,{maxMtime:a,hash:n}),n}invalidate(t){this.cache.delete(t)}clear(){this.cache.clear(),this.fileCache.clear()}}
@@ -1 +1 @@
1
- import{readFile as E,readdir as w,access as J,stat as S,realpath as G}from"node:fs/promises";import{homedir as f}from"node:os";import s from"node:path";import{AssetNotFoundError as b}from"./installer.js";import{readClaudeJson as K}from"@weavecode/harness";import{FileTooLargeError as O,MAX_BYTES as v}from"./reader.js";import{assetSurfaceFor as m,assetSurfaces as $,pluginStateFor as k,pluginSurfaceFor as R}from"../surfaces.js";import{installForm as D,linkOrCopy as W,removeInstalled as B}from"../market/install-link.js";export{ClaudeJsonCorruptError}from"@weavecode/harness";const z=".claude.json",N=".claude/plugins/installed_plugins.json";function I(){return s.join(f(),z)}function x(){return m("claude").globalSkillsRoots(f())[0]}function L(t=f()){return s.join(t,N)}function _(){return m("claude").userConfigFile(f())}function T(){return m("codex").globalSkillsRoots(f())[0]}function X(){return m("codex").globalSkillsRoots(f())}function P(){const t=m("codex").pluginCacheDir?.(f());if(!t)throw new Error("codex has no plugin cache surface");return t}export function globalPersonalSkillRootsOwned(){return $().flatMap(t=>t.globalSkillsRoots(f()).map(e=>({harness:t.harness,root:e})))}export function globalPersonalSkillRoots(){return globalPersonalSkillRootsOwned().map(t=>t.root)}async function M(t){try{return await J(t),!0}catch{return!1}}async function y(t){try{return(await S(t)).isDirectory()}catch{return!1}}export function readGlobalClaudeJson(){return K(f())}export async function readGlobalMcpServers(){const t=(await readGlobalClaudeJson()).mcpServers;return!t||typeof t!="object"||Array.isArray(t)?{}:t}export async function writeGlobalMcpServer(t,e){await m("claude").mcpWrite("user","",f(),t,e)}export async function removeGlobalMcpServer(t){await m("claude").mcpRemove("user","",f(),t)}export async function readGlobalSkills(){const t=x();try{const e=await w(t,{withFileTypes:!0}),n=[];for(const a of e)!a.isDirectory()&&!a.isSymbolicLink()||await y(s.join(t,a.name))&&n.push(a.name);return n.sort((a,o)=>a.localeCompare(o))}catch{return[]}}export async function installGlobalSkill(t,e,n="claude"){const a=m(n).globalSkillsRoots(f())[0],o=s.join(a,e);if(await M(o))throw new Error(`Global ${n} skill "${e}" already exists`);return await W(t,o),o}export async function uninstallGlobalSkill(t,e="claude"){const n=m(e).globalSkillsRoots(f())[0];await B(s.join(n,t))}async function j(t=f()){const e=L(t);if(!await M(e))return{};try{const n=JSON.parse(await E(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}catch{return{}}}async function A(t){if(!await y(t))return[];let e;try{e=await w(t,{withFileTypes:!0})}catch{return[]}const n=[];for(const a of e){if(a.name.startsWith(".")||!a.isDirectory()&&!a.isSymbolicLink())continue;const o=s.join(t,a.name);if(!await y(o))continue;const r=await D(o);r!=="absent"&&n.push({name:a.name,dir:o,form:r})}return n.sort((a,o)=>a.name.localeCompare(o.name))}export async function installedPluginNamespaces(t=f()){const e=(await j(t)).plugins;if(!e||typeof e!="object"||Array.isArray(e))return[];const n=[];for(const[a,o]of Object.entries(e)){const{market:r}=R("claude").parsePluginKey(a);for(const i of Array.isArray(o)?o:[])i&&typeof i.installPath=="string"&&n.push({dir:i.installPath,namespace:r})}return n}async function Y(){const t=(await j()).plugins;if(!t||typeof t!="object"||Array.isArray(t))return[];const e=[];for(const[n,a]of Object.entries(t)){const o=Array.isArray(a)?a:[];if(o.length===0)continue;const r=[...o].filter(p=>p&&typeof p.installPath=="string").pop();if(!r?.installPath)continue;const i=await A(s.join(r.installPath,"skills")),{name:l,market:u}=R("claude").parsePluginKey(n);e.push({source:"claude-plugin",label:l,namespace:u,skills:i,pluginKey:n})}return e.sort((n,a)=>n.label.localeCompare(a.label))}async function q(){const t=new Map;for(const e of X())for(const n of await A(e))t.has(n.name)||t.set(n.name,n);return{source:"codex-personal",label:"Codex \xB7 \u4E2A\u4EBA",skills:[...t.values()].sort((e,n)=>e.name.localeCompare(n.name))}}async function H(){const t=P();if(!await y(t))return[];const e=[];let n;try{n=await w(t,{withFileTypes:!0})}catch{return[]}for(const a of n){if(!a.isDirectory()&&!a.isSymbolicLink())continue;const o=s.join(t,a.name);let r;try{r=await w(o,{withFileTypes:!0})}catch{continue}for(const i of r){if(!i.isDirectory()&&!i.isSymbolicLink())continue;const l=s.join(o,i.name);let u;try{u=await w(l,{withFileTypes:!0})}catch{continue}const p=u.filter(h=>h.isDirectory()||h.isSymbolicLink());if(p.length===0)continue;const d=p.map(h=>h.name).sort().pop(),c=await A(s.join(l,d,"skills")),g=`${i.name}@${a.name}`;e.push({source:"codex-plugin",label:i.name,namespace:a.name,skills:c,pluginKey:g})}}return e.sort((a,o)=>a.label.localeCompare(o.label))}async function Q(){const t=x(),e=await readGlobalSkills(),n=[];for(const a of e){const o=s.join(t,a),r=await D(o);r!=="absent"&&n.push({name:a,dir:o,form:r})}return{source:"claude-personal",label:"Claude Code \xB7 \u4E2A\u4EBA",skills:n}}export async function readGlobalSkillGroups(){const[t,e,n,a,o,r]=await Promise.all([Q(),Y(),q(),H(),readClaudePluginEnabled(),readCodexPluginEnabled()]),i=(l,u)=>({...l,enabled:l.pluginKey?u[l.pluginKey]??!1:void 0});return[t,...e.map(l=>i(l,o)),n,...a.map(l=>i(l,r))]}export async function resolveGlobalSkillDir(t,e,n){if(t==="claude-personal"){const c=s.join(x(),e);return await y(c)?c:null}if(t==="codex-personal"){const c=s.join(T(),e);return await y(c)?c:null}if(t==="claude-plugin"){if(!n)return null;const c=(await j()).plugins;if(!c||typeof c!="object"||Array.isArray(c))return null;const g=c[n],h=[...Array.isArray(g)?g:[]].filter(C=>C&&typeof C.installPath=="string").pop();if(!h?.installPath)return null;const F=s.join(h.installPath,"skills",e);return await y(F)?F:null}if(!n)return null;const a=n.lastIndexOf("@");if(a<=0)return null;const o=n.slice(0,a),r=n.slice(a+1),i=s.join(P(),r,o);if(!await y(i))return null;let l;try{l=await w(i,{withFileTypes:!0})}catch{return null}const u=l.filter(c=>c.isDirectory()||c.isSymbolicLink());if(u.length===0)return null;const p=u.map(c=>c.name).sort().pop(),d=s.join(i,p,"skills",e);return await y(d)?d:null}function U(t){const e=s.resolve(t),n=f();return $().find(a=>{const o=[...a.globalSkillsRoots(n)],r=a.pluginCacheDir?.(n);return r&&o.push(r),o.some(i=>e===s.resolve(i)||e.startsWith(s.resolve(i)+s.sep))})?.harness??"claude"}export async function listGlobalSkillFiles(t){const e=U(t),n=[],a=async(o,r)=>{let i;try{i=await w(o,{withFileTypes:!0})}catch{return}for(const l of i){if(l.name.startsWith("."))continue;const u=s.join(o,l.name),p=r?`${r}/${l.name}`:l.name;if((l.isDirectory()||l.isSymbolicLink())&&await y(u))await a(u,p);else if(l.isFile()||l.isSymbolicLink())try{const d=await S(u);d.isFile()&&n.push({absPath:u,relPath:p,category:"skill",agent:e,mtimeMs:d.mtimeMs})}catch{}}};return await a(t,""),n.sort((o,r)=>o.relPath.localeCompare(r.relPath))}export async function readGlobalSkillFile(t,e){const n=s.normalize(e).replace(/\\/g,"/");if(s.isAbsolute(e))throw new b(`Absolute paths are not allowed: "${e}"`);if(n.split("/").some(u=>u===".."))throw new b(`Path traversal is not allowed: "${e}"`);const a=s.join(t,n);let o;try{o=await S(a)}catch{throw new b(`File not found: "${e}"`)}if(!o.isFile())throw new b(`Not a file: "${e}"`);if(o.size>v)throw new O(`File exceeds ${v} bytes: "${e}"`);let r=t,i=a;try{[r,i]=await Promise.all([G(t),G(a)])}catch{throw new b(`File not found: "${e}"`)}const l=r.endsWith(s.sep)?r:r+s.sep;if(i!==r&&!i.startsWith(l))throw new b(`Resolved path escapes the skill directory: "${e}"`);return{content:await E(a,"utf-8"),size:o.size}}export async function readClaudePluginEnabled(){return k("claude").readGlobalEnabled()}export async function writeClaudePluginEnabled(t,e){return k("claude").writeGlobalEnabled(t,e)}export async function readCodexPluginEnabled(){return k("codex").readGlobalEnabled()}export async function writeCodexPluginEnabled(t,e){return k("codex").writeGlobalEnabled(t,e)}export{x as globalSkillsPath,I as claudeJsonPath,L as claudePluginsJsonPath,_ as claudeSettingsPath,T as codexSkillsPath,P as codexPluginsCachePath};
1
+ import{readFile as E,readdir as h,access as J,stat as x,realpath as G}from"node:fs/promises";import{homedir as c}from"node:os";import l from"node:path";import{AssetNotFoundError as g}from"./installer.js";import{readClaudeJson as N}from"@weavecode/harness";import{FileTooLargeError as W,MAX_BYTES as v}from"./reader.js";import{assetSurfaceFor as y,assetSurfaces as R,pluginStateFor as k,pluginSurfaceFor as $}from"../surfaces.js";import{installForm as L,linkOrCopy as _,removeInstalled as z}from"../market/install-link.js";export{ClaudeJsonCorruptError}from"@weavecode/harness";const I=".claude.json",U=".claude/plugins/installed_plugins.json";function B(){return l.join(c(),I)}function S(){return y("claude").globalSkillsRoots(c())[0]}function M(t=c()){return l.join(t,U)}function K(){return y("claude").userConfigFile(c())}function O(){return y("codex").globalSkillsRoots(c())[0]}function X(){return y("codex").globalSkillsRoots(c())}function P(){const t=y("codex").pluginCacheDir?.(c());if(!t)throw new Error("codex has no plugin cache surface");return t}export function globalPersonalSkillRootsOwned(){return R().flatMap(t=>t.globalSkillsRoots(c()).map(n=>({harness:t.harness,root:n})))}export function globalPersonalSkillRoots(){return globalPersonalSkillRootsOwned().map(t=>t.root)}async function T(t){try{return await J(t),!0}catch{return!1}}async function m(t){try{return(await x(t)).isDirectory()}catch{return!1}}export function readGlobalClaudeJson(){return N(c())}export async function readGlobalMcpServers(){const t=(await readGlobalClaudeJson()).mcpServers;return!t||typeof t!="object"||Array.isArray(t)?{}:t}export async function writeGlobalMcpServer(t,n){await y("claude").mcpWrite("user","",c(),t,n)}export async function removeGlobalMcpServer(t){await y("claude").mcpRemove("user","",c(),t)}export async function readGlobalSkills(){const t=S();try{const n=await h(t,{withFileTypes:!0}),o=[];for(const e of n)!e.isDirectory()&&!e.isSymbolicLink()||await m(l.join(t,e.name))&&o.push(e.name);return o.sort((e,r)=>e.localeCompare(r))}catch{return[]}}export async function installGlobalSkill(t,n,o="claude"){const e=y(o).globalSkillsRoots(c())[0],r=l.join(e,n);if(await T(r))throw new Error(`Global ${o} skill "${n}" already exists`);return await _(t,r),r}export async function uninstallGlobalSkill(t,n="claude"){const o=y(n).globalSkillsRoots(c())[0];await z(l.join(o,t))}async function C(t=c()){const n=M(t);if(!await T(n))return{};try{const o=JSON.parse(await E(n,"utf-8"));return o&&typeof o=="object"&&!Array.isArray(o)?o:{}}catch{return{}}}async function j(t){if(!await m(t))return[];let n;try{n=await h(t,{withFileTypes:!0})}catch{return[]}const o=[];for(const e of n){if(e.name.startsWith(".")||!e.isDirectory()&&!e.isSymbolicLink())continue;const r=l.join(t,e.name);if(!await m(r))continue;const i=await L(r);i!=="absent"&&o.push({name:e.name,dir:r,form:i})}return o.sort((e,r)=>e.name.localeCompare(r.name))}export async function installedPluginNamespaces(t=c()){const o=(await C(t)).plugins;if(!o||typeof o!="object"||Array.isArray(o))return[];const e=[];for(const[r,i]of Object.entries(o)){const{market:s}=$("claude").parsePluginKey(r);for(const a of Array.isArray(i)?i:[])a&&typeof a.installPath=="string"&&e.push({dir:a.installPath,namespace:s})}return e}async function Y(){const n=(await C()).plugins;if(!n||typeof n!="object"||Array.isArray(n))return[];const o=[];for(const[e,r]of Object.entries(n)){const i=Array.isArray(r)?r:[];if(i.length===0)continue;const s=[...i].filter(d=>d&&typeof d.installPath=="string").pop();if(!s?.installPath)continue;const a=await j(l.join(s.installPath,"skills")),{name:u,market:p}=$("claude").parsePluginKey(e);o.push({source:"claude-plugin",label:u,namespace:p,skills:a,pluginKey:e})}return o.sort((e,r)=>e.label.localeCompare(r.label))}async function q(){const t=new Map;for(const o of X())for(const e of await j(o))t.has(e.name)||t.set(e.name,e);return{source:"codex-personal",label:"Codex \xB7 \u4E2A\u4EBA",skills:[...t.values()].sort((o,e)=>o.name.localeCompare(e.name))}}async function H(){const t=P();if(!await m(t))return[];const n=[];let o;try{o=await h(t,{withFileTypes:!0})}catch{return[]}for(const e of o){if(!e.isDirectory()&&!e.isSymbolicLink())continue;const r=l.join(t,e.name);let i;try{i=await h(r,{withFileTypes:!0})}catch{continue}for(const s of i){if(!s.isDirectory()&&!s.isSymbolicLink())continue;const a=l.join(r,s.name);let u;try{u=await h(a,{withFileTypes:!0})}catch{continue}const p=u.filter(w=>w.isDirectory()||w.isSymbolicLink());if(p.length===0)continue;const d=p.map(w=>w.name).sort().pop(),f=await j(l.join(a,d,"skills")),b=`${s.name}@${e.name}`;n.push({source:"codex-plugin",label:s.name,namespace:e.name,skills:f,pluginKey:b})}}return n.sort((e,r)=>e.label.localeCompare(r.label))}async function Q(){const t=S(),n=await readGlobalSkills(),o=[];for(const e of n){const r=l.join(t,e),i=await L(r);i!=="absent"&&o.push({name:e,dir:r,form:i})}return{source:"claude-personal",label:"Claude Code \xB7 \u4E2A\u4EBA",skills:o}}export async function readGlobalSkillGroups(){const[t,n,o,e,r,i]=await Promise.all([Q(),Y(),q(),H(),readClaudePluginEnabled(),readCodexPluginEnabled()]),s=(a,u)=>({...a,enabled:a.pluginKey?u[a.pluginKey]??!1:void 0});return[t,...n.map(a=>s(a,r)),o,...e.map(a=>s(a,i))]}export async function resolveGlobalSkillDir(t,n,o){if(t==="claude-personal"){const f=l.join(S(),n);return await m(f)?f:null}if(t==="codex-personal"){const f=l.join(O(),n);return await m(f)?f:null}if(t==="claude-plugin"){if(!o)return null;const b=(await C()).plugins;if(!b||typeof b!="object"||Array.isArray(b))return null;const w=b[o],F=[...Array.isArray(w)?w:[]].filter(D=>D&&typeof D.installPath=="string").pop();if(!F?.installPath)return null;const A=l.join(F.installPath,"skills",n);return await m(A)?A:null}if(!o)return null;const e=o.lastIndexOf("@");if(e<=0)return null;const r=o.slice(0,e),i=o.slice(e+1),s=l.join(P(),i,r);if(!await m(s))return null;let a;try{a=await h(s,{withFileTypes:!0})}catch{return null}const u=a.filter(f=>f.isDirectory()||f.isSymbolicLink());if(u.length===0)return null;const p=u.map(f=>f.name).sort().pop(),d=l.join(s,p,"skills",n);return await m(d)?d:null}function V(t){const n=l.resolve(t),o=c();return R().find(r=>{const i=[...r.globalSkillsRoots(o)],s=r.pluginCacheDir?.(o);return s&&i.push(s),i.some(a=>n===l.resolve(a)||n.startsWith(l.resolve(a)+l.sep))})?.harness??"claude"}export async function listGlobalSkillFiles(t){const n=V(t),o=[],e=async(r,i)=>{let s;try{s=await h(r,{withFileTypes:!0})}catch{return}for(const a of s){if(a.name.startsWith("."))continue;const u=l.join(r,a.name),p=i?`${i}/${a.name}`:a.name;if((a.isDirectory()||a.isSymbolicLink())&&await m(u))await e(u,p);else if(a.isFile()||a.isSymbolicLink())try{const d=await x(u);d.isFile()&&o.push({absPath:u,relPath:p,category:"skill",agent:n,mtimeMs:d.mtimeMs})}catch{}}};return await e(t,""),o.sort((r,i)=>r.relPath.localeCompare(i.relPath))}export async function readGlobalSkillFile(t,n){const o=l.normalize(n).replace(/\\/g,"/");if(l.isAbsolute(n))throw new g(`Absolute paths are not allowed: "${n}"`);if(o.split("/").some(p=>p===".."))throw new g(`Path traversal is not allowed: "${n}"`);const e=l.join(t,o);let r;try{r=await x(e)}catch{throw new g(`File not found: "${n}"`)}if(!r.isFile())throw new g(`Not a file: "${n}"`);if(r.size>v)throw new W(`File exceeds ${v} bytes: "${n}"`);let i=t,s=e;try{[i,s]=await Promise.all([G(t),G(e)])}catch{throw new g(`File not found: "${n}"`)}const a=i.endsWith(l.sep)?i:i+l.sep;if(s!==i&&!s.startsWith(a))throw new g(`Resolved path escapes the skill directory: "${n}"`);return{content:await E(e,"utf-8"),size:r.size}}export async function readClaudePluginEnabled(){return k("claude").readGlobalEnabled()}export async function writeClaudePluginEnabled(t,n){return k("claude").writeGlobalEnabled(t,n)}export async function readCodexPluginEnabled(){return k("codex").readGlobalEnabled()}export async function writeCodexPluginEnabled(t,n){return k("codex").writeGlobalEnabled(t,n)}export{S as globalSkillsPath,B as claudeJsonPath,M as claudePluginsJsonPath,K as claudeSettingsPath,O as codexSkillsPath,P as codexPluginsCachePath};
@@ -1 +1 @@
1
- import{lstat as g,readdir as w,stat as f}from"node:fs/promises";import{homedir as P}from"node:os";import l from"node:path";import{classifyAgent as k,classifyAsset as x}from"../watch/classifier.js";import{PluginModsSniffer as S}from"../watch/plugin-mods.js";import{installedPluginNamespaces as $}from"./global-config.js";const j=["commands","agents","workflows","rules","output-styles","hooks","themes","routines","plugins"],A=["CLAUDE.md","settings.json","settings.local.json"],b=["prompts"],v=["config.toml","AGENTS.md"],D=new Set(["skills","node_modules",".git"]),F=new Set(["marketplaces","data",".in_use"]),p=".claude/plugins",L=`${p}/`,E=6,M=10,N=5e3,T=[{prefix:".claude",dirs:j,files:A},{prefix:".codex",dirs:b,files:v}];async function d(e,i,s){try{const o=await g(e),t=o.isSymbolicLink(),a=t?await f(e):o;if(!a.isFile())return null;let r=x(i);return r==="plugin"&&(r=s.refine(r,i,e)),{absPath:e,relPath:i,category:r,agent:k(i),mtimeMs:a.mtimeMs,...t?{isSymlink:!0}:{}}}catch{return null}}async function u(e,i,s,o,t){if(s>o)return[];let a;try{a=await w(e,{withFileTypes:!0})}catch{return[]}return(await Promise.all(a.map(async r=>{const m=l.join(e,r.name),n=`${i}/${r.name}`;if(r.isDirectory())return h(n,r.name)?[]:u(m,n,s+1,o,t);if(r.isSymbolicLink())try{if((await f(m)).isDirectory())return h(n,r.name)?[]:u(m,n,s+1,o,t)}catch{return[]}const c=await d(m,n,t);return c?[c]:[]}))).flat()}function h(e,i){return D.has(i)?!0:e.startsWith(L)&&F.has(i)}export async function listGlobalFileAssets(e=P()){const i=new S({revalidate:!1}),s=(await Promise.all(T.map(async t=>{const a=l.join(e,...t.prefix.split("/")),[r,m]=await Promise.all([Promise.all(t.files.map(n=>d(l.join(a,n),`${t.prefix}/${n}`,i))),Promise.all(t.dirs.map(n=>{const c=`${t.prefix}/${n}`,y=c===p?M:E;return u(l.join(a,n),c,1,y,i)}))]);return[...r.filter(n=>n!==null),...m.flat()]}))).flat(),o=await $(e);return s.sort((t,a)=>t.relPath.localeCompare(a.relPath)),s.slice(0,N).map(t=>{const a=_(t.absPath,o);return a?{...t,namespace:a}:t})}function _(e,i){let s;for(const o of i){const t=l.relative(l.resolve(o.dir),l.resolve(e));t===""||t.startsWith("..")||l.isAbsolute(t)||(!s||o.dir.length>s.dir.length)&&(s=o)}return s?.namespace}
1
+ import{lstat as S,readdir as _,stat as P}from"node:fs/promises";import{homedir as g}from"node:os";import c from"node:path";import{classifyAgent as w,classifyAsset as h}from"../watch/classifier.js";import{PluginModsSniffer as I}from"../watch/plugin-mods.js";import{installedPluginNamespaces as D}from"./global-config.js";const L=["commands","agents","workflows","rules","output-styles","hooks","themes","routines","plugins"],A=["CLAUDE.md","settings.json","settings.local.json"],k=["prompts"],R=["config.toml","AGENTS.md"],T=new Set(["skills","node_modules",".git"]),U=new Set(["marketplaces","data",".in_use"]),y=".claude/plugins",F=`${y}/`,N=6,O=10,$=5e3,j=[{prefix:".claude",dirs:L,files:A},{prefix:".codex",dirs:k,files:R}];async function d(s,n,o){try{const e=await S(s),a=e.isSymbolicLink(),t=a?await P(s):e;if(!t.isFile())return null;let i=h(n);return i==="plugin"&&(i=o.refine(i,n,s)),{absPath:s,relPath:n,category:i,agent:w(n),mtimeMs:t.mtimeMs,...a?{isSymlink:!0}:{}}}catch{return null}}async function f(s,n,o,e,a){if(o>e)return[];let t;try{t=await _(s,{withFileTypes:!0})}catch{return[]}return(await Promise.all(t.map(async l=>{const u=c.join(s,l.name),r=`${n}/${l.name}`;if(l.isDirectory())return E(r,l.name)?[]:f(u,r,o+1,e,a);if(l.isSymbolicLink())try{if((await P(u)).isDirectory())return E(r,l.name)?[]:f(u,r,o+1,e,a)}catch{return[]}const m=await d(u,r,a);return m?[m]:[]}))).flat()}function E(s,n){return T.has(n)?!0:s.startsWith(F)&&U.has(n)}export async function listGlobalFileAssets(s=g()){const n=new I({revalidate:!1}),e=(await Promise.all(j.map(async t=>{const i=c.join(s,...t.prefix.split("/")),[l,u]=await Promise.all([Promise.all(t.files.map(r=>d(c.join(i,r),`${t.prefix}/${r}`,n))),Promise.all(t.dirs.map(r=>{const m=`${t.prefix}/${r}`,p=m===y?O:N;return f(c.join(i,r),m,1,p,n)}))]);return[...l.filter(r=>r!==null),...u.flat()]}))).flat(),a=await D(s);return e.sort((t,i)=>t.relPath.localeCompare(i.relPath)),e.slice(0,$).map(t=>{const i=x(t.absPath,a);return i?{...t,namespace:i}:t})}function x(s,n){let o;for(const e of n){const a=c.relative(c.resolve(e.dir),c.resolve(s));a===""||a.startsWith("..")||c.isAbsolute(a)||(!o||e.dir.length>o.dir.length)&&(o=e)}return o?.namespace}