@seawork/server 1.0.22-rc.3 → 2.0.2-rc.6

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 (349) hide show
  1. package/dist/scripts/supervisor-entrypoint.js +48 -8
  2. package/dist/scripts/supervisor-entrypoint.js.map +1 -1
  3. package/dist/scripts/supervisor-native-classifier.js +77 -5
  4. package/dist/scripts/supervisor-native-classifier.js.map +1 -1
  5. package/dist/scripts/supervisor-stdio-tail.js +27 -0
  6. package/dist/scripts/supervisor-stdio-tail.js.map +1 -0
  7. package/dist/scripts/supervisor.js +12 -0
  8. package/dist/scripts/supervisor.js.map +1 -1
  9. package/dist/server/client/daemon-client.d.ts +142 -2
  10. package/dist/server/client/daemon-client.d.ts.map +1 -1
  11. package/dist/server/client/daemon-client.js +384 -3
  12. package/dist/server/client/daemon-client.js.map +1 -1
  13. package/dist/server/server/agent/agent-manager.d.ts +55 -3
  14. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  15. package/dist/server/server/agent/agent-manager.js +324 -45
  16. package/dist/server/server/agent/agent-manager.js.map +1 -1
  17. package/dist/server/server/agent/agent-metadata-generator.d.ts +1 -0
  18. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
  19. package/dist/server/server/agent/agent-metadata-generator.js +8 -0
  20. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
  21. package/dist/server/server/agent/agent-projections.js +7 -2
  22. package/dist/server/server/agent/agent-projections.js.map +1 -1
  23. package/dist/server/server/agent/agent-response-loop.d.ts +3 -1
  24. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
  25. package/dist/server/server/agent/agent-response-loop.js +33 -6
  26. package/dist/server/server/agent/agent-response-loop.js.map +1 -1
  27. package/dist/server/server/agent/agent-sdk-types.d.ts +43 -1
  28. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  29. package/dist/server/server/agent/claude-memory.d.ts +4 -0
  30. package/dist/server/server/agent/claude-memory.d.ts.map +1 -0
  31. package/dist/server/server/agent/claude-memory.js +97 -0
  32. package/dist/server/server/agent/claude-memory.js.map +1 -0
  33. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  34. package/dist/server/server/agent/mcp-server.js +247 -0
  35. package/dist/server/server/agent/mcp-server.js.map +1 -1
  36. package/dist/server/server/agent/mcp-shared.d.ts +2 -0
  37. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
  38. package/dist/server/server/agent/provider-launch-config.d.ts +6 -139
  39. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  40. package/dist/server/server/agent/provider-launch-config.js +65 -33
  41. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  42. package/dist/server/server/agent/provider-manifest.d.ts +1 -0
  43. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  44. package/dist/server/server/agent/provider-manifest.js +36 -0
  45. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  46. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  47. package/dist/server/server/agent/provider-registry.js +4 -0
  48. package/dist/server/server/agent/provider-registry.js.map +1 -1
  49. package/dist/server/server/agent/provider-snapshot-manager.d.ts +3 -1
  50. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  51. package/dist/server/server/agent/provider-snapshot-manager.js +13 -0
  52. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  53. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  54. package/dist/server/server/agent/providers/claude-agent.js +141 -27
  55. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  56. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
  57. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +14 -1
  58. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
  59. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +132 -4
  60. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  61. package/dist/server/server/agent/providers/codex-app-server-agent.js +2233 -163
  62. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  63. package/dist/server/server/agent/providers/codex-binary-resolver.d.ts +9 -0
  64. package/dist/server/server/agent/providers/codex-binary-resolver.d.ts.map +1 -1
  65. package/dist/server/server/agent/providers/codex-binary-resolver.js +35 -14
  66. package/dist/server/server/agent/providers/codex-binary-resolver.js.map +1 -1
  67. package/dist/server/server/agent/providers/codex-health-probe.js +1 -1
  68. package/dist/server/server/agent/providers/codex-health-probe.js.map +1 -1
  69. package/dist/server/server/agent/providers/deepseek/constants.d.ts +4 -0
  70. package/dist/server/server/agent/providers/deepseek/constants.d.ts.map +1 -0
  71. package/dist/server/server/agent/providers/deepseek/constants.js +11 -0
  72. package/dist/server/server/agent/providers/deepseek/constants.js.map +1 -0
  73. package/dist/server/server/agent/providers/deepseek/event-mapper.d.ts +21 -0
  74. package/dist/server/server/agent/providers/deepseek/event-mapper.d.ts.map +1 -0
  75. package/dist/server/server/agent/providers/deepseek/event-mapper.js +286 -0
  76. package/dist/server/server/agent/providers/deepseek/event-mapper.js.map +1 -0
  77. package/dist/server/server/agent/providers/deepseek/serve-client.d.ts +94 -0
  78. package/dist/server/server/agent/providers/deepseek/serve-client.d.ts.map +1 -0
  79. package/dist/server/server/agent/providers/deepseek/serve-client.js +142 -0
  80. package/dist/server/server/agent/providers/deepseek/serve-client.js.map +1 -0
  81. package/dist/server/server/agent/providers/deepseek/serve-process.d.ts +18 -0
  82. package/dist/server/server/agent/providers/deepseek/serve-process.d.ts.map +1 -0
  83. package/dist/server/server/agent/providers/deepseek/serve-process.js +93 -0
  84. package/dist/server/server/agent/providers/deepseek/serve-process.js.map +1 -0
  85. package/dist/server/server/agent/providers/deepseek-agent.d.ts +94 -0
  86. package/dist/server/server/agent/providers/deepseek-agent.d.ts.map +1 -0
  87. package/dist/server/server/agent/providers/deepseek-agent.js +811 -0
  88. package/dist/server/server/agent/providers/deepseek-agent.js.map +1 -0
  89. package/dist/server/server/agent/providers/gateway-telemetry.d.ts +9 -0
  90. package/dist/server/server/agent/providers/gateway-telemetry.d.ts.map +1 -0
  91. package/dist/server/server/agent/providers/gateway-telemetry.js +36 -0
  92. package/dist/server/server/agent/providers/gateway-telemetry.js.map +1 -0
  93. package/dist/server/server/agent/providers/seaagent/constants.d.ts +3 -0
  94. package/dist/server/server/agent/providers/seaagent/constants.d.ts.map +1 -0
  95. package/dist/server/server/agent/providers/seaagent/constants.js +3 -0
  96. package/dist/server/server/agent/providers/seaagent/constants.js.map +1 -0
  97. package/dist/server/server/agent/providers/seaagent/event-mapper.d.ts +3 -0
  98. package/dist/server/server/agent/providers/seaagent/event-mapper.d.ts.map +1 -0
  99. package/dist/server/server/agent/providers/seaagent/event-mapper.js +69 -0
  100. package/dist/server/server/agent/providers/seaagent/event-mapper.js.map +1 -0
  101. package/dist/server/server/agent/providers/seaagent/rpc-client.d.ts +23 -0
  102. package/dist/server/server/agent/providers/seaagent/rpc-client.d.ts.map +1 -0
  103. package/dist/server/server/agent/providers/seaagent/rpc-client.js +139 -0
  104. package/dist/server/server/agent/providers/seaagent/rpc-client.js.map +1 -0
  105. package/dist/server/server/agent/providers/seaagent/tool-call-mapper.d.ts +3 -0
  106. package/dist/server/server/agent/providers/seaagent/tool-call-mapper.d.ts.map +1 -0
  107. package/dist/server/server/agent/providers/seaagent/tool-call-mapper.js +38 -0
  108. package/dist/server/server/agent/providers/seaagent/tool-call-mapper.js.map +1 -0
  109. package/dist/server/server/agent/providers/seaagent-agent.d.ts +81 -0
  110. package/dist/server/server/agent/providers/seaagent-agent.d.ts.map +1 -0
  111. package/dist/server/server/agent/providers/seaagent-agent.js +502 -0
  112. package/dist/server/server/agent/providers/seaagent-agent.js.map +1 -0
  113. package/dist/server/server/agent/providers/seaagent-binary-resolver.d.ts +18 -0
  114. package/dist/server/server/agent/providers/seaagent-binary-resolver.d.ts.map +1 -0
  115. package/dist/server/server/agent/providers/seaagent-binary-resolver.js +46 -0
  116. package/dist/server/server/agent/providers/seaagent-binary-resolver.js.map +1 -0
  117. package/dist/server/server/agent/providers/seaagent-health-probe.d.ts +11 -0
  118. package/dist/server/server/agent/providers/seaagent-health-probe.d.ts.map +1 -0
  119. package/dist/server/server/agent/providers/seaagent-health-probe.js +49 -0
  120. package/dist/server/server/agent/providers/seaagent-health-probe.js.map +1 -0
  121. package/dist/server/server/agent/providers/seawork-models.d.ts +8 -0
  122. package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -1
  123. package/dist/server/server/agent/providers/seawork-models.js +118 -74
  124. package/dist/server/server/agent/providers/seawork-models.js.map +1 -1
  125. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +2 -2
  126. package/dist/server/server/agent/timeline-projection.d.ts +5 -1
  127. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  128. package/dist/server/server/agent/timeline-projection.js +20 -4
  129. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  130. package/dist/server/server/agent-attention-policy.d.ts +1 -0
  131. package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
  132. package/dist/server/server/agent-attention-policy.js +6 -0
  133. package/dist/server/server/agent-attention-policy.js.map +1 -1
  134. package/dist/server/server/allowed-hosts.d.ts +13 -0
  135. package/dist/server/server/allowed-hosts.d.ts.map +1 -1
  136. package/dist/server/server/allowed-hosts.js +33 -0
  137. package/dist/server/server/allowed-hosts.js.map +1 -1
  138. package/dist/server/server/bootstrap.d.ts +2 -0
  139. package/dist/server/server/bootstrap.d.ts.map +1 -1
  140. package/dist/server/server/bootstrap.js +200 -14
  141. package/dist/server/server/bootstrap.js.map +1 -1
  142. package/dist/server/server/browser-extension-token.d.ts +23 -0
  143. package/dist/server/server/browser-extension-token.d.ts.map +1 -0
  144. package/dist/server/server/browser-extension-token.js +114 -0
  145. package/dist/server/server/browser-extension-token.js.map +1 -0
  146. package/dist/server/server/bug-report-handler.d.ts +7 -1
  147. package/dist/server/server/bug-report-handler.d.ts.map +1 -1
  148. package/dist/server/server/bug-report-handler.js +73 -5
  149. package/dist/server/server/bug-report-handler.js.map +1 -1
  150. package/dist/server/server/bug-report-redact.d.ts +25 -1
  151. package/dist/server/server/bug-report-redact.d.ts.map +1 -1
  152. package/dist/server/server/bug-report-redact.js +42 -5
  153. package/dist/server/server/bug-report-redact.js.map +1 -1
  154. package/dist/server/server/config.d.ts +1 -0
  155. package/dist/server/server/config.d.ts.map +1 -1
  156. package/dist/server/server/config.js +51 -1
  157. package/dist/server/server/config.js.map +1 -1
  158. package/dist/server/server/crash-report.d.ts.map +1 -1
  159. package/dist/server/server/crash-report.js +18 -0
  160. package/dist/server/server/crash-report.js.map +1 -1
  161. package/dist/server/server/daemon-config-store.d.ts.map +1 -1
  162. package/dist/server/server/daemon-config-store.js +94 -3
  163. package/dist/server/server/daemon-config-store.js.map +1 -1
  164. package/dist/server/server/disk-full.d.ts +4 -0
  165. package/dist/server/server/disk-full.d.ts.map +1 -0
  166. package/dist/server/server/disk-full.js +46 -0
  167. package/dist/server/server/disk-full.js.map +1 -0
  168. package/dist/server/server/exports.d.ts +3 -2
  169. package/dist/server/server/exports.d.ts.map +1 -1
  170. package/dist/server/server/exports.js +2 -1
  171. package/dist/server/server/exports.js.map +1 -1
  172. package/dist/server/server/git-forge/github-client.d.ts +18 -0
  173. package/dist/server/server/git-forge/github-client.d.ts.map +1 -1
  174. package/dist/server/server/git-forge/github-client.js +88 -0
  175. package/dist/server/server/git-forge/github-client.js.map +1 -1
  176. package/dist/server/server/git-forge/parse-remote.d.ts +2 -0
  177. package/dist/server/server/git-forge/parse-remote.d.ts.map +1 -1
  178. package/dist/server/server/git-forge/parse-remote.js +71 -6
  179. package/dist/server/server/git-forge/parse-remote.js.map +1 -1
  180. package/dist/server/server/git-forge/service.d.ts +87 -0
  181. package/dist/server/server/git-forge/service.d.ts.map +1 -1
  182. package/dist/server/server/git-forge/service.js +198 -4
  183. package/dist/server/server/git-forge/service.js.map +1 -1
  184. package/dist/server/server/index.js +72 -0
  185. package/dist/server/server/index.js.map +1 -1
  186. package/dist/server/server/integrations/wecom-openclaw/bridge.d.ts +88 -0
  187. package/dist/server/server/integrations/wecom-openclaw/bridge.d.ts.map +1 -0
  188. package/dist/server/server/integrations/wecom-openclaw/bridge.js +1229 -0
  189. package/dist/server/server/integrations/wecom-openclaw/bridge.js.map +1 -0
  190. package/dist/server/server/integrations/wecom-openclaw/qr.d.ts +38 -0
  191. package/dist/server/server/integrations/wecom-openclaw/qr.d.ts.map +1 -0
  192. package/dist/server/server/integrations/wecom-openclaw/qr.js +101 -0
  193. package/dist/server/server/integrations/wecom-openclaw/qr.js.map +1 -0
  194. package/dist/server/server/integrations/wecom-openclaw/workspace.d.ts +5 -0
  195. package/dist/server/server/integrations/wecom-openclaw/workspace.d.ts.map +1 -0
  196. package/dist/server/server/integrations/wecom-openclaw/workspace.js +40 -0
  197. package/dist/server/server/integrations/wecom-openclaw/workspace.js.map +1 -0
  198. package/dist/server/server/latency-proxy.d.ts.map +1 -1
  199. package/dist/server/server/latency-proxy.js +45 -5
  200. package/dist/server/server/latency-proxy.js.map +1 -1
  201. package/dist/server/server/library/codex-skill-discovery.d.ts +9 -0
  202. package/dist/server/server/library/codex-skill-discovery.d.ts.map +1 -0
  203. package/dist/server/server/library/codex-skill-discovery.js +49 -0
  204. package/dist/server/server/library/codex-skill-discovery.js.map +1 -0
  205. package/dist/server/server/library/hub-install.d.ts +79 -0
  206. package/dist/server/server/library/hub-install.d.ts.map +1 -0
  207. package/dist/server/server/library/hub-install.js +263 -0
  208. package/dist/server/server/library/hub-install.js.map +1 -0
  209. package/dist/server/server/library/hub-test-run.d.ts +81 -0
  210. package/dist/server/server/library/hub-test-run.d.ts.map +1 -0
  211. package/dist/server/server/library/hub-test-run.js +237 -0
  212. package/dist/server/server/library/hub-test-run.js.map +1 -0
  213. package/dist/server/server/library/library-import.d.ts +27 -0
  214. package/dist/server/server/library/library-import.d.ts.map +1 -0
  215. package/dist/server/server/library/library-import.js +227 -0
  216. package/dist/server/server/library/library-import.js.map +1 -0
  217. package/dist/server/server/library/library-injection.d.ts +16 -0
  218. package/dist/server/server/library/library-injection.d.ts.map +1 -0
  219. package/dist/server/server/library/library-injection.js +49 -0
  220. package/dist/server/server/library/library-injection.js.map +1 -0
  221. package/dist/server/server/library/library-rpc.d.ts +73 -0
  222. package/dist/server/server/library/library-rpc.d.ts.map +1 -0
  223. package/dist/server/server/library/library-rpc.js +239 -0
  224. package/dist/server/server/library/library-rpc.js.map +1 -0
  225. package/dist/server/server/library/library-store.d.ts +35 -0
  226. package/dist/server/server/library/library-store.d.ts.map +1 -0
  227. package/dist/server/server/library/library-store.js +169 -0
  228. package/dist/server/server/library/library-store.js.map +1 -0
  229. package/dist/server/server/library/library-sync.d.ts +46 -0
  230. package/dist/server/server/library/library-sync.d.ts.map +1 -0
  231. package/dist/server/server/library/library-sync.js +235 -0
  232. package/dist/server/server/library/library-sync.js.map +1 -0
  233. package/dist/server/server/library/library-types.d.ts +756 -0
  234. package/dist/server/server/library/library-types.d.ts.map +1 -0
  235. package/dist/server/server/library/library-types.js +99 -0
  236. package/dist/server/server/library/library-types.js.map +1 -0
  237. package/dist/server/server/library/worktree-dev.d.ts +14 -0
  238. package/dist/server/server/library/worktree-dev.d.ts.map +1 -0
  239. package/dist/server/server/library/worktree-dev.js +24 -0
  240. package/dist/server/server/library/worktree-dev.js.map +1 -0
  241. package/dist/server/server/log-stream-error.d.ts +2 -0
  242. package/dist/server/server/log-stream-error.d.ts.map +1 -0
  243. package/dist/server/server/log-stream-error.js +33 -0
  244. package/dist/server/server/log-stream-error.js.map +1 -0
  245. package/dist/server/server/logger.d.ts +1 -0
  246. package/dist/server/server/logger.d.ts.map +1 -1
  247. package/dist/server/server/logger.js +32 -0
  248. package/dist/server/server/logger.js.map +1 -1
  249. package/dist/server/server/loop/rpc-schemas.d.ts +96 -96
  250. package/dist/server/server/loop-service.d.ts +18 -18
  251. package/dist/server/server/messages.d.ts +4 -1
  252. package/dist/server/server/messages.d.ts.map +1 -1
  253. package/dist/server/server/messages.js +40 -2
  254. package/dist/server/server/messages.js.map +1 -1
  255. package/dist/server/server/node-pty-error.d.ts +2 -0
  256. package/dist/server/server/node-pty-error.d.ts.map +1 -0
  257. package/dist/server/server/node-pty-error.js +19 -0
  258. package/dist/server/server/node-pty-error.js.map +1 -0
  259. package/dist/server/server/persisted-config.d.ts +219 -135
  260. package/dist/server/server/persisted-config.d.ts.map +1 -1
  261. package/dist/server/server/persisted-config.js +35 -1
  262. package/dist/server/server/persisted-config.js.map +1 -1
  263. package/dist/server/server/port-in-use.d.ts +4 -0
  264. package/dist/server/server/port-in-use.d.ts.map +1 -0
  265. package/dist/server/server/port-in-use.js +35 -0
  266. package/dist/server/server/port-in-use.js.map +1 -0
  267. package/dist/server/server/provider-runtime-settings-mask.d.ts +7 -0
  268. package/dist/server/server/provider-runtime-settings-mask.d.ts.map +1 -0
  269. package/dist/server/server/provider-runtime-settings-mask.js +65 -0
  270. package/dist/server/server/provider-runtime-settings-mask.js.map +1 -0
  271. package/dist/server/server/sac/auth.d.ts +12 -0
  272. package/dist/server/server/sac/auth.d.ts.map +1 -1
  273. package/dist/server/server/sac/auth.js +19 -1
  274. package/dist/server/server/sac/auth.js.map +1 -1
  275. package/dist/server/server/sac/index.d.ts +2 -2
  276. package/dist/server/server/sac/index.d.ts.map +1 -1
  277. package/dist/server/server/sac/index.js +2 -2
  278. package/dist/server/server/sac/index.js.map +1 -1
  279. package/dist/server/server/sac/poll.d.ts +2 -0
  280. package/dist/server/server/sac/poll.d.ts.map +1 -1
  281. package/dist/server/server/sac/poll.js +7 -2
  282. package/dist/server/server/sac/poll.js.map +1 -1
  283. package/dist/server/server/schedule/cron.d.ts.map +1 -1
  284. package/dist/server/server/schedule/cron.js +6 -6
  285. package/dist/server/server/schedule/cron.js.map +1 -1
  286. package/dist/server/server/schedule/rpc-schemas.d.ts +895 -0
  287. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -1
  288. package/dist/server/server/schedule/rpc-schemas.js +34 -0
  289. package/dist/server/server/schedule/rpc-schemas.js.map +1 -1
  290. package/dist/server/server/schedule/service.d.ts +5 -1
  291. package/dist/server/server/schedule/service.d.ts.map +1 -1
  292. package/dist/server/server/schedule/service.js +97 -14
  293. package/dist/server/server/schedule/service.js.map +1 -1
  294. package/dist/server/server/schedule/types.d.ts +19 -0
  295. package/dist/server/server/schedule/types.d.ts.map +1 -1
  296. package/dist/server/server/schedule/types.js +1 -0
  297. package/dist/server/server/schedule/types.js.map +1 -1
  298. package/dist/server/server/session.d.ts +83 -2
  299. package/dist/server/server/session.d.ts.map +1 -1
  300. package/dist/server/server/session.js +895 -82
  301. package/dist/server/server/session.js.map +1 -1
  302. package/dist/server/server/speech/native-runtime-guard.d.ts +1 -0
  303. package/dist/server/server/speech/native-runtime-guard.d.ts.map +1 -1
  304. package/dist/server/server/speech/native-runtime-guard.js +10 -4
  305. package/dist/server/server/speech/native-runtime-guard.js.map +1 -1
  306. package/dist/server/server/websocket-server.d.ts +6 -1
  307. package/dist/server/server/websocket-server.d.ts.map +1 -1
  308. package/dist/server/server/websocket-server.js +79 -7
  309. package/dist/server/server/websocket-server.js.map +1 -1
  310. package/dist/server/server/workspace-git-service.d.ts +2 -1
  311. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  312. package/dist/server/server/workspace-git-service.js +7 -3
  313. package/dist/server/server/workspace-git-service.js.map +1 -1
  314. package/dist/server/server/workspace-registry-model.d.ts +1 -0
  315. package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
  316. package/dist/server/server/workspace-registry-model.js +18 -0
  317. package/dist/server/server/workspace-registry-model.js.map +1 -1
  318. package/dist/server/server/worktree-session.d.ts +3 -3
  319. package/dist/server/server/worktree-session.d.ts.map +1 -1
  320. package/dist/server/server/worktree-session.js +1 -3
  321. package/dist/server/server/worktree-session.js.map +1 -1
  322. package/dist/server/shared/messages.d.ts +59658 -21927
  323. package/dist/server/shared/messages.d.ts.map +1 -1
  324. package/dist/server/shared/messages.js +531 -3
  325. package/dist/server/shared/messages.js.map +1 -1
  326. package/dist/server/shared/provider-runtime-settings.d.ts +87 -0
  327. package/dist/server/shared/provider-runtime-settings.d.ts.map +1 -0
  328. package/dist/server/shared/provider-runtime-settings.js +33 -0
  329. package/dist/server/shared/provider-runtime-settings.js.map +1 -0
  330. package/dist/server/terminal/terminal.d.ts +9 -0
  331. package/dist/server/terminal/terminal.d.ts.map +1 -1
  332. package/dist/server/terminal/terminal.js +100 -3
  333. package/dist/server/terminal/terminal.js.map +1 -1
  334. package/dist/server/utils/checkout-git.d.ts +23 -1
  335. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  336. package/dist/server/utils/checkout-git.js +182 -21
  337. package/dist/server/utils/checkout-git.js.map +1 -1
  338. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  339. package/dist/server/utils/directory-suggestions.js +57 -9
  340. package/dist/server/utils/directory-suggestions.js.map +1 -1
  341. package/dist/src/server/bug-report-redact.js +42 -5
  342. package/dist/src/server/bug-report-redact.js.map +1 -1
  343. package/dist/src/server/crash-report.js +18 -0
  344. package/dist/src/server/crash-report.js.map +1 -1
  345. package/dist/src/server/speech/native-runtime-guard.js +177 -0
  346. package/dist/src/server/speech/native-runtime-guard.js.map +1 -0
  347. package/dist/src/server/speech/speech-types.js +8 -0
  348. package/dist/src/server/speech/speech-types.js.map +1 -0
  349. package/package.json +16 -4
@@ -0,0 +1,263 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createWriteStream } from "node:fs";
3
+ import { mkdir, mkdtemp, readFile, realpath, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { Readable } from "node:stream";
8
+ import { extract as tarExtract } from "tar";
9
+ import { parseHubManifest } from "@seawork/hub-schema";
10
+ import { CLAUDE_HUB_SKILL_PREFIX, CODEX_HUB_SKILL_PREFIX, } from "./library-types.js";
11
+ /** Slug used as the library.skills key + on-disk dir suffix for a hub-installed skill. */
12
+ export function hubIdToSlug(hubId) {
13
+ return hubId.replace("/", "-");
14
+ }
15
+ const DOWNLOAD_TIMEOUT_MS = 60000;
16
+ export async function fetchAndExtract(spec, opts = {}) {
17
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
18
+ const workDir = await mkdtemp(join(tmpdir(), "seawork-hub-install-"));
19
+ const tarballPath = join(workDir, "skill.tar.gz");
20
+ const extractDir = join(workDir, "extract");
21
+ const cleanup = async () => {
22
+ await rm(workDir, { recursive: true, force: true });
23
+ };
24
+ // Download
25
+ try {
26
+ const controller = new AbortController();
27
+ const timeout = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
28
+ try {
29
+ const res = await fetchImpl(spec.tarballUrl, { signal: controller.signal });
30
+ if (!res.ok || !res.body) {
31
+ await cleanup();
32
+ return {
33
+ kind: "error",
34
+ code: "download-failed",
35
+ message: `HTTP ${res.status} ${res.statusText} from ${spec.tarballUrl}`,
36
+ };
37
+ }
38
+ // Stream body to disk while computing sha256
39
+ const hash = createHash("sha256");
40
+ const out = createWriteStream(tarballPath);
41
+ const nodeStream = Readable.fromWeb(res.body);
42
+ nodeStream.on("data", (chunk) => hash.update(chunk));
43
+ await pipeline(nodeStream, out);
44
+ const actual = hash.digest("hex");
45
+ if (actual.toLowerCase() !== spec.tarballSha256.toLowerCase()) {
46
+ await cleanup();
47
+ return {
48
+ kind: "error",
49
+ code: "checksum-failed",
50
+ message: `expected sha256=${spec.tarballSha256}, got ${actual}`,
51
+ };
52
+ }
53
+ }
54
+ finally {
55
+ clearTimeout(timeout);
56
+ }
57
+ }
58
+ catch (err) {
59
+ await cleanup();
60
+ return {
61
+ kind: "error",
62
+ code: "download-failed",
63
+ message: err instanceof Error ? err.message : String(err),
64
+ };
65
+ }
66
+ // Extract. Only allow regular files and directories: symlinks/hardlinks in a
67
+ // malicious tarball (e.g. `claude/SKILL.md -> ../../.ssh/id_ed25519`) would let
68
+ // the later readFile() follow the link out of extractDir despite resolveInside's
69
+ // string check, so we drop them at unpack time. `preservePaths: false` (default)
70
+ // already strips absolute paths and `..`; this closes the symlink hole too.
71
+ try {
72
+ await mkdir(extractDir, { recursive: true });
73
+ await tarExtract({
74
+ file: tarballPath,
75
+ cwd: extractDir,
76
+ // @types/tar mistypes the extract filter's entry as fs.Stats; at runtime
77
+ // it's a tar ReadEntry whose `type` is the archive entry kind string.
78
+ filter: (_path, entry) => {
79
+ const type = entry.type;
80
+ return type === "File" || type === "Directory";
81
+ },
82
+ });
83
+ }
84
+ catch (err) {
85
+ await cleanup();
86
+ return {
87
+ kind: "error",
88
+ code: "extract-failed",
89
+ message: err instanceof Error ? err.message : String(err),
90
+ };
91
+ }
92
+ // Tarball roots vary; find the directory containing manifest.json. We look one level
93
+ // deep so both a flat archive and a single-top-dir archive (the conventional layout) work.
94
+ const manifestPath = await findManifestPath(extractDir);
95
+ if (!manifestPath) {
96
+ await cleanup();
97
+ return {
98
+ kind: "error",
99
+ code: "extract-failed",
100
+ message: "manifest.json not found in tarball (expected at root or first subdirectory)",
101
+ };
102
+ }
103
+ let manifest;
104
+ try {
105
+ const raw = JSON.parse(await readFile(manifestPath.full, "utf8"));
106
+ const parsed = parseHubManifest(raw);
107
+ if (parsed.kind !== "ok") {
108
+ await cleanup();
109
+ const detail = parsed.kind === "invalid"
110
+ ? parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")
111
+ : `unsupported schemaVersion ${parsed.found} (this daemon supports ${parsed.supported})`;
112
+ return { kind: "error", code: "extract-failed", message: `manifest.json invalid: ${detail}` };
113
+ }
114
+ manifest = parsed.value;
115
+ }
116
+ catch (err) {
117
+ await cleanup();
118
+ return {
119
+ kind: "error",
120
+ code: "extract-failed",
121
+ message: `failed to read manifest.json: ${err instanceof Error ? err.message : String(err)}`,
122
+ };
123
+ }
124
+ opts.logger?.debug({ hubId: manifest.id, version: manifest.version, root: manifestPath.dir }, "hub install: tarball extracted");
125
+ return { kind: "ok", extractDir: manifestPath.dir, manifest, cleanup };
126
+ }
127
+ /**
128
+ * Full hub install pipeline: download + verify + extract + (conflict check) +
129
+ * persist into the Library registry. The Library's own sync writes to disk.
130
+ */
131
+ export async function installHubSkill(opts) {
132
+ const result = await fetchAndExtract({ tarballUrl: opts.tarballUrl, tarballSha256: opts.tarballSha256 }, { logger: opts.logger, fetchImpl: opts.fetchImpl });
133
+ if (result.kind === "error") {
134
+ return { kind: "error", code: result.code, message: result.message };
135
+ }
136
+ const slug = hubIdToSlug(opts.hubId);
137
+ // Conflict detection: if a non-hub skill with the same slug already exists in
138
+ // the registry, refuse. The user might have created it themselves.
139
+ const library = await opts.store.load();
140
+ const existing = library.skills?.[slug];
141
+ if (existing && existing.source !== "hub") {
142
+ await result.cleanup();
143
+ return { kind: "conflict", slug, conflictingName: slug };
144
+ }
145
+ try {
146
+ const claudeContent = await readSkillFile(result.extractDir, opts.claudeSkillPath);
147
+ const codexContent = await readSkillFile(result.extractDir, opts.codexSkillPath);
148
+ const entry = {
149
+ content: claudeContent,
150
+ contentCodex: codexContent === claudeContent ? undefined : codexContent,
151
+ providers: ["claude", "codex"],
152
+ autoAttach: true,
153
+ source: "hub",
154
+ updatedAt: new Date().toISOString(),
155
+ hub: {
156
+ hubId: opts.hubId,
157
+ version: opts.version,
158
+ tarballSha256: opts.tarballSha256,
159
+ installedAt: new Date().toISOString(),
160
+ },
161
+ };
162
+ await opts.store.upsertSkill(slug, entry);
163
+ await result.cleanup();
164
+ return {
165
+ kind: "installed",
166
+ slug,
167
+ installedPaths: {
168
+ claude: `${opts.claudeHomeDir ?? "~/.claude"}/skills/${CLAUDE_HUB_SKILL_PREFIX}${slug}/SKILL.md`,
169
+ codex: `${opts.codexHomeDir ?? "~/.codex"}/skills/${CODEX_HUB_SKILL_PREFIX}${slug}/SKILL.md`,
170
+ },
171
+ entry,
172
+ };
173
+ }
174
+ catch (err) {
175
+ await result.cleanup();
176
+ return {
177
+ kind: "error",
178
+ code: "write-failed",
179
+ message: err instanceof Error ? err.message : String(err),
180
+ };
181
+ }
182
+ }
183
+ /**
184
+ * Remove a hub-installed skill. Returns "not-installed" if it isn't registered
185
+ * as hub-installed (we never touch user-owned skills).
186
+ */
187
+ export async function uninstallHubSkill(opts) {
188
+ const slug = hubIdToSlug(opts.hubId);
189
+ try {
190
+ const library = await opts.store.load();
191
+ const entry = library.skills?.[slug];
192
+ if (!entry || entry.source !== "hub") {
193
+ return { kind: "not-installed" };
194
+ }
195
+ await opts.store.delete("skill", slug);
196
+ return { kind: "uninstalled", slug };
197
+ }
198
+ catch (err) {
199
+ return { kind: "error", message: err instanceof Error ? err.message : String(err) };
200
+ }
201
+ }
202
+ /**
203
+ * Resolve a manifest-supplied skill path against the extracted tarball dir and
204
+ * assert it stays inside. The daemon re-fetches the tarball and trusts whatever
205
+ * paths the manifest carries, so a malicious/compromised tarball could set
206
+ * `claudeSkillPath: "../../.ssh/id_ed25519"` (or an absolute path) and make the
207
+ * daemon read arbitrary local files into the skill registry. This is the
208
+ * authoritative check — schema validation (hub-schema) is only defense-in-depth.
209
+ */
210
+ function resolveInside(extractDir, relPath) {
211
+ if (isAbsolute(relPath) || /^[a-zA-Z]:/.test(relPath) || relPath.includes("\\")) {
212
+ throw new Error(`skill path must be relative and inside the tarball: ${relPath}`);
213
+ }
214
+ const root = resolve(extractDir);
215
+ const target = resolve(root, relPath);
216
+ const rel = relative(root, target);
217
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
218
+ throw new Error(`skill path escapes the tarball: ${relPath}`);
219
+ }
220
+ return target;
221
+ }
222
+ /**
223
+ * Read a manifest-supplied skill file from the extracted tarball. Two layers:
224
+ * resolveInside() rejects absolute/`..` string paths, then realpath() resolves
225
+ * any symlinks and re-checks the boundary — so even if a symlink slips past the
226
+ * unpack-time filter, a link pointing outside extractDir is rejected before its
227
+ * target is read. realpath also rejects non-existent paths (ENOENT) by throwing.
228
+ */
229
+ async function readSkillFile(extractDir, relPath) {
230
+ const target = resolveInside(extractDir, relPath);
231
+ const root = await realpath(resolve(extractDir));
232
+ const realTarget = await realpath(target);
233
+ const rel = relative(root, realTarget);
234
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
235
+ throw new Error(`skill path escapes the tarball: ${relPath}`);
236
+ }
237
+ return readFile(realTarget, "utf8");
238
+ }
239
+ async function findManifestPath(root) {
240
+ const { readdir, stat } = await import("node:fs/promises");
241
+ const top = join(root, "manifest.json");
242
+ try {
243
+ if ((await stat(top)).isFile())
244
+ return { full: top, dir: root };
245
+ }
246
+ catch {
247
+ // not at root, try one level deeper
248
+ }
249
+ const entries = await readdir(root);
250
+ for (const entry of entries) {
251
+ const subDir = join(root, entry);
252
+ const candidate = join(subDir, "manifest.json");
253
+ try {
254
+ if ((await stat(candidate)).isFile())
255
+ return { full: candidate, dir: subDir };
256
+ }
257
+ catch {
258
+ // skip
259
+ }
260
+ }
261
+ return null;
262
+ }
263
+ //# sourceMappingURL=hub-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-install.js","sourceRoot":"","sources":["../../../../src/server/library/hub-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { Logger } from "pino";
2
+ import type { AgentClient } from "../agent/agent-sdk-types.js";
3
+ import { type HubFetchSpec } from "./hub-install.js";
4
+ /** Temp-dir prefix so a startup sweeper can reclaim leaked sandboxes. */
5
+ export declare const TEST_RUN_PREFIX = "seawork-hub-testrun-";
6
+ export interface TestRunChunk {
7
+ kind: "assistant" | "reasoning" | "tool";
8
+ text?: string;
9
+ toolName?: string;
10
+ toolSummary?: string;
11
+ }
12
+ export interface RunHubTestOpts {
13
+ hubId: string;
14
+ spec: HubFetchSpec;
15
+ prompt: string;
16
+ codexClient: AgentClient;
17
+ /** Override the codex model; defaults to the client's default-listed model. */
18
+ model?: string;
19
+ logger?: Logger;
20
+ onChunk: (chunk: TestRunChunk) => void;
21
+ signal?: AbortSignal;
22
+ timeoutMs?: number;
23
+ fetchImpl?: typeof fetch;
24
+ }
25
+ export type RunHubTestResult = {
26
+ kind: "completed";
27
+ finalText: string;
28
+ } | {
29
+ kind: "canceled";
30
+ } | {
31
+ kind: "error";
32
+ code: "download-failed" | "checksum-failed" | "extract-failed" | "spawn-failed" | "timeout" | "run-failed";
33
+ message: string;
34
+ };
35
+ export declare function runHubTest(opts: RunHubTestOpts): Promise<RunHubTestResult>;
36
+ export interface HubTestRunStartMessage {
37
+ type: "hub_test_run_start_request";
38
+ requestId: string;
39
+ hubId: string;
40
+ tarballUrl: string;
41
+ tarballSha256: string;
42
+ prompt: string;
43
+ }
44
+ export interface HubTestRunChunkMessage {
45
+ type: "hub_test_run_chunk";
46
+ requestId: string;
47
+ kind: "assistant" | "reasoning" | "tool";
48
+ text?: string;
49
+ toolName?: string;
50
+ toolSummary?: string;
51
+ }
52
+ export interface HubTestRunDoneMessage {
53
+ type: "hub_test_run_done_response";
54
+ requestId: string;
55
+ status: "completed" | "canceled" | "error" | "not-implemented";
56
+ finalText?: string;
57
+ code?: "download-failed" | "checksum-failed" | "extract-failed" | "spawn-failed" | "timeout" | "run-failed" | "not-implemented";
58
+ message?: string;
59
+ }
60
+ export interface HubTestRunContext {
61
+ codexClient: AgentClient;
62
+ logger?: Logger;
63
+ emitChunk: (chunk: HubTestRunChunkMessage) => void;
64
+ /** Shared map so a cancel request can abort the matching in-flight run. */
65
+ inFlight: Map<string, AbortController>;
66
+ /** Max concurrent test runs across this session. */
67
+ maxConcurrent?: number;
68
+ }
69
+ export declare function handleHubTestRunStart(msg: HubTestRunStartMessage, ctx: HubTestRunContext): Promise<HubTestRunDoneMessage>;
70
+ /** Abort an in-flight test run. No-op if the requestId is unknown. */
71
+ export declare function handleHubTestRunCancel(requestId: string, inFlight: Map<string, AbortController>): void;
72
+ /**
73
+ * Reclaim test-run sandboxes left behind by a daemon crash mid-run. Normal runs
74
+ * clean up in their own `finally`; this is the backstop. Called once at startup.
75
+ * Only removes dirs older than `maxAgeMs` so it never races a live run.
76
+ */
77
+ export declare function sweepLeakedTestRuns(opts?: {
78
+ maxAgeMs?: number;
79
+ logger?: Logger;
80
+ }): Promise<void>;
81
+ //# sourceMappingURL=hub-test-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-test-run.d.ts","sourceRoot":"","sources":["../../../../src/server/library/hub-test-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,237 @@
1
+ // Hub "test run": load a single hub skill into a throwaway sandbox and run one
2
+ // prompt against it, streaming output back, then delete the sandbox. The skill
3
+ // is dropped into `<tempCwd>/.codex/skills/<name>/` and the agent's cwd is set to
4
+ // `<tempCwd>` — Codex discovers project-relative skills there (verified), so we
5
+ // never touch the user's ~/.codex or their installed skills. Nothing is written
6
+ // to the LibraryStore or the provider session ledger (the session is internal
7
+ // and never registered with AgentManager).
8
+ import { cp, mkdir, mkdtemp, readdir, rm, stat } from "node:fs/promises";
9
+ import { tmpdir } from "node:os";
10
+ import { dirname, join } from "node:path";
11
+ import { fetchAndExtract, hubIdToSlug } from "./hub-install.js";
12
+ /** Temp-dir prefix so a startup sweeper can reclaim leaked sandboxes. */
13
+ export const TEST_RUN_PREFIX = "seawork-hub-testrun-";
14
+ const DEFAULT_TIMEOUT_MS = 120000;
15
+ export async function runHubTest(opts) {
16
+ const { hubId, spec, prompt, codexClient, logger, onChunk, signal } = opts;
17
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
18
+ if (signal?.aborted)
19
+ return { kind: "canceled" };
20
+ // 1. Download + verify + extract the tarball (reuses install path).
21
+ const extracted = await fetchAndExtract(spec, { logger, fetchImpl: opts.fetchImpl });
22
+ if (extracted.kind === "error") {
23
+ return { kind: "error", code: extracted.code, message: extracted.message };
24
+ }
25
+ const { extractDir, manifest, cleanup: cleanupTarball } = extracted;
26
+ // 2. Build a sandbox cwd and drop the codex skill into <cwd>/.codex/skills/<slug>/.
27
+ const sandboxCwd = await mkdtemp(join(tmpdir(), TEST_RUN_PREFIX));
28
+ const skillSrcDir = join(extractDir, dirname(manifest.codexSkillPath)); // e.g. extract/codex
29
+ const slug = hubIdToSlug(hubId);
30
+ const skillDestDir = join(sandboxCwd, ".codex", "skills", slug);
31
+ const cleanupAll = async () => {
32
+ await rm(sandboxCwd, { recursive: true, force: true }).catch(() => { });
33
+ await cleanupTarball().catch(() => { });
34
+ };
35
+ let session;
36
+ let unsubscribe;
37
+ try {
38
+ await mkdir(dirname(skillDestDir), { recursive: true });
39
+ await cp(skillSrcDir, skillDestDir, { recursive: true });
40
+ if (signal?.aborted) {
41
+ await cleanupAll();
42
+ return { kind: "canceled" };
43
+ }
44
+ // 3. Spawn an internal, non-interactive, read-only Codex session in the sandbox.
45
+ // modeId "read-only" gives a read-only sandbox; we override approvalPolicy
46
+ // to "never" so the unattended run never blocks on a permission prompt.
47
+ // The model is resolved from the daemon's configured codex models (the
48
+ // gateway-accepted default) unless the caller passed one explicitly.
49
+ try {
50
+ let model = opts.model;
51
+ if (!model) {
52
+ const models = await codexClient.listModels().catch(() => []);
53
+ model = (models.find((m) => m.isDefault) ?? models[0])?.id;
54
+ }
55
+ session = await codexClient.createSession({
56
+ provider: "codex",
57
+ cwd: sandboxCwd,
58
+ internal: true,
59
+ title: "Hub skill test run",
60
+ modeId: "read-only",
61
+ ...(model ? { model } : {}),
62
+ approvalPolicy: "never", // never block on a permission prompt
63
+ sandboxMode: "read-only", // no writes, no surprises
64
+ networkAccess: false,
65
+ });
66
+ }
67
+ catch (err) {
68
+ await cleanupAll();
69
+ return {
70
+ kind: "error",
71
+ code: "spawn-failed",
72
+ message: err instanceof Error ? err.message : String(err),
73
+ };
74
+ }
75
+ // 4. Stream timeline items back to the caller as they arrive.
76
+ unsubscribe = session.subscribe((event) => {
77
+ if (event.type !== "timeline")
78
+ return;
79
+ const item = event.item;
80
+ if (item.type === "assistant_message")
81
+ onChunk({ kind: "assistant", text: item.text });
82
+ else if (item.type === "reasoning")
83
+ onChunk({ kind: "reasoning", text: item.text });
84
+ else if (item.type === "tool_call")
85
+ onChunk({ kind: "tool", toolName: item.name, toolSummary: summarizeTool(item) });
86
+ else if (item.type === "error")
87
+ onChunk({ kind: "assistant", text: `[error] ${item.message}` });
88
+ });
89
+ // 5. Run the prompt with a timeout + cancellation race.
90
+ const activeSession = session;
91
+ let timer;
92
+ let abortListener;
93
+ const interrupt = () => {
94
+ void activeSession.interrupt().catch(() => { });
95
+ };
96
+ try {
97
+ const result = await Promise.race([
98
+ activeSession
99
+ .run(prompt)
100
+ .then((r) => ({ outcome: "done", finalText: r.finalText })),
101
+ new Promise((resolve) => {
102
+ timer = setTimeout(() => {
103
+ interrupt();
104
+ resolve({ outcome: "timeout" });
105
+ }, timeoutMs);
106
+ }),
107
+ new Promise((resolve) => {
108
+ if (signal) {
109
+ abortListener = () => {
110
+ interrupt();
111
+ resolve({ outcome: "canceled" });
112
+ };
113
+ signal.addEventListener("abort", abortListener, { once: true });
114
+ }
115
+ }),
116
+ ]);
117
+ if (result.outcome === "timeout")
118
+ return { kind: "error", code: "timeout", message: `test run exceeded ${timeoutMs}ms` };
119
+ if (result.outcome === "canceled")
120
+ return { kind: "canceled" };
121
+ return { kind: "completed", finalText: result.finalText };
122
+ }
123
+ catch (err) {
124
+ return {
125
+ kind: "error",
126
+ code: "run-failed",
127
+ message: err instanceof Error ? err.message : String(err),
128
+ };
129
+ }
130
+ finally {
131
+ if (timer)
132
+ clearTimeout(timer);
133
+ if (signal && abortListener)
134
+ signal.removeEventListener("abort", abortListener);
135
+ }
136
+ }
137
+ finally {
138
+ unsubscribe?.();
139
+ if (session)
140
+ await session.close().catch(() => { });
141
+ await cleanupAll();
142
+ }
143
+ }
144
+ const DEFAULT_MAX_CONCURRENT = 2;
145
+ export async function handleHubTestRunStart(msg, ctx) {
146
+ const max = ctx.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;
147
+ if (ctx.inFlight.size >= max) {
148
+ return {
149
+ type: "hub_test_run_done_response",
150
+ requestId: msg.requestId,
151
+ status: "error",
152
+ code: "run-failed",
153
+ message: `too many test runs in flight (max ${max})`,
154
+ };
155
+ }
156
+ const controller = new AbortController();
157
+ ctx.inFlight.set(msg.requestId, controller);
158
+ try {
159
+ const result = await runHubTest({
160
+ hubId: msg.hubId,
161
+ spec: { tarballUrl: msg.tarballUrl, tarballSha256: msg.tarballSha256 },
162
+ prompt: msg.prompt,
163
+ codexClient: ctx.codexClient,
164
+ logger: ctx.logger,
165
+ signal: controller.signal,
166
+ onChunk: (chunk) => ctx.emitChunk({ type: "hub_test_run_chunk", requestId: msg.requestId, ...chunk }),
167
+ });
168
+ if (result.kind === "completed")
169
+ return {
170
+ type: "hub_test_run_done_response",
171
+ requestId: msg.requestId,
172
+ status: "completed",
173
+ finalText: result.finalText,
174
+ };
175
+ if (result.kind === "canceled")
176
+ return { type: "hub_test_run_done_response", requestId: msg.requestId, status: "canceled" };
177
+ return {
178
+ type: "hub_test_run_done_response",
179
+ requestId: msg.requestId,
180
+ status: "error",
181
+ code: result.code,
182
+ message: result.message,
183
+ };
184
+ }
185
+ finally {
186
+ ctx.inFlight.delete(msg.requestId);
187
+ }
188
+ }
189
+ /** Abort an in-flight test run. No-op if the requestId is unknown. */
190
+ export function handleHubTestRunCancel(requestId, inFlight) {
191
+ inFlight.get(requestId)?.abort();
192
+ }
193
+ /**
194
+ * Reclaim test-run sandboxes left behind by a daemon crash mid-run. Normal runs
195
+ * clean up in their own `finally`; this is the backstop. Called once at startup.
196
+ * Only removes dirs older than `maxAgeMs` so it never races a live run.
197
+ */
198
+ export async function sweepLeakedTestRuns(opts = {}) {
199
+ const maxAgeMs = opts.maxAgeMs ?? 60 * 60 * 1000; // 1h
200
+ const now = Date.now();
201
+ let entries;
202
+ try {
203
+ entries = await readdir(tmpdir());
204
+ }
205
+ catch {
206
+ return;
207
+ }
208
+ let removed = 0;
209
+ for (const name of entries) {
210
+ if (!name.startsWith(TEST_RUN_PREFIX))
211
+ continue;
212
+ const full = join(tmpdir(), name);
213
+ try {
214
+ const info = await stat(full);
215
+ if (now - info.mtimeMs < maxAgeMs)
216
+ continue;
217
+ await rm(full, { recursive: true, force: true });
218
+ removed++;
219
+ }
220
+ catch {
221
+ // best-effort; skip anything we can't stat/remove
222
+ }
223
+ }
224
+ if (removed > 0)
225
+ opts.logger?.debug({ removed }, "swept leaked hub test-run sandboxes");
226
+ }
227
+ function summarizeTool(item) {
228
+ const d = item.detail;
229
+ if (!d)
230
+ return item.name;
231
+ if (Array.isArray(d.command))
232
+ return d.command.join(" ").slice(0, 200);
233
+ if (typeof d.path === "string")
234
+ return d.path;
235
+ return d.type ?? item.name;
236
+ }
237
+ //# sourceMappingURL=hub-test-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-test-run.js","sourceRoot":"","sources":["../../../../src/server/library/hub-test-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Logger } from "pino";
2
+ import { type LibraryFile } from "./library-types.js";
3
+ /**
4
+ * Scans ~/.claude.json, ~/.codex/config.toml, ~/.claude/skills/* and Codex
5
+ * skill discovery paths and merges everything into a single library snapshot.
6
+ * Name collisions across providers are union-merged (providers list grows,
7
+ * enabledFor flags both set true).
8
+ *
9
+ * Safe to call repeatedly — caller decides whether to persist via LibraryStore.
10
+ */
11
+ export interface ImportOptions {
12
+ /** Override ~ for tests. */
13
+ homeDir?: string;
14
+ /** cwd used when discovering codex skills (for repo-root walk). */
15
+ cwd?: string;
16
+ logger?: Logger;
17
+ }
18
+ export interface ImportResult {
19
+ library: LibraryFile;
20
+ importedMcp: number;
21
+ importedSkills: number;
22
+ skipped: string[];
23
+ }
24
+ export declare function importExisting(opts?: ImportOptions): Promise<ImportResult>;
25
+ export declare const mergeMcpEntry: (existing: NonNullable<LibraryFile["mcpServers"]>[string] | undefined, incoming: NonNullable<LibraryFile["mcpServers"]>[string]) => NonNullable<LibraryFile["mcpServers"]>[string];
26
+ export declare const mergeSkillEntry: (existing: NonNullable<LibraryFile["skills"]>[string] | undefined, incoming: NonNullable<LibraryFile["skills"]>[string]) => NonNullable<LibraryFile["skills"]>[string];
27
+ //# sourceMappingURL=library-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-import.d.ts","sourceRoot":"","sources":["../../../../src/server/library/library-import.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIrF;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,cAAc,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBpF;AAoKD,eAAO,MAAM,aAAa,GACxB,UAAU,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,EACpE,UAAU,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KACvD,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAiC,CAAC;AAElF,eAAO,MAAM,eAAe,GAC1B,UAAU,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,EAChE,UAAU,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KACnD,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAmC,CAAC"}