@xyit/wellspring 0.0.0-stage → 1.1.0

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 (464) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +853 -2
  3. package/dist/agent/pending-asks.d.ts +20 -0
  4. package/dist/agent/pending-asks.js +70 -0
  5. package/dist/agent/pending-asks.js.map +1 -0
  6. package/dist/agent/task-registry.d.ts +14 -0
  7. package/dist/agent/task-registry.js +80 -0
  8. package/dist/agent/task-registry.js.map +1 -0
  9. package/dist/agent/tool-context.d.ts +30 -0
  10. package/dist/agent/tool-context.js +10 -0
  11. package/dist/agent/tool-context.js.map +1 -0
  12. package/dist/agent/usage.d.ts +40 -0
  13. package/dist/agent/usage.js +122 -0
  14. package/dist/agent/usage.js.map +1 -0
  15. package/dist/api/host/agent.d.ts +165 -0
  16. package/dist/api/host/agent.js +5 -0
  17. package/dist/api/host/agent.js.map +1 -0
  18. package/dist/api/host/events.d.ts +2 -0
  19. package/dist/api/host/events.js +6 -0
  20. package/dist/api/host/events.js.map +1 -0
  21. package/dist/api/host/exec.d.ts +36 -0
  22. package/dist/api/host/exec.js +10 -0
  23. package/dist/api/host/exec.js.map +1 -0
  24. package/dist/api/host/fs.d.ts +24 -0
  25. package/dist/api/host/fs.js +7 -0
  26. package/dist/api/host/fs.js.map +1 -0
  27. package/dist/api/host/hooks.d.ts +210 -0
  28. package/dist/api/host/hooks.js +401 -0
  29. package/dist/api/host/hooks.js.map +1 -0
  30. package/dist/api/host/host.d.ts +36 -0
  31. package/dist/api/host/host.js +53 -0
  32. package/dist/api/host/host.js.map +1 -0
  33. package/dist/api/host/http.d.ts +58 -0
  34. package/dist/api/host/http.js +6 -0
  35. package/dist/api/host/http.js.map +1 -0
  36. package/dist/api/host/index.d.ts +15 -0
  37. package/dist/api/host/index.js +20 -0
  38. package/dist/api/host/index.js.map +1 -0
  39. package/dist/api/host/models.d.ts +65 -0
  40. package/dist/api/host/models.js +8 -0
  41. package/dist/api/host/models.js.map +1 -0
  42. package/dist/api/host/network.d.ts +22 -0
  43. package/dist/api/host/network.js +7 -0
  44. package/dist/api/host/network.js.map +1 -0
  45. package/dist/api/host/plugin.d.ts +138 -0
  46. package/dist/api/host/plugin.js +6 -0
  47. package/dist/api/host/plugin.js.map +1 -0
  48. package/dist/api/host/plugins.d.ts +49 -0
  49. package/dist/api/host/plugins.js +6 -0
  50. package/dist/api/host/plugins.js.map +1 -0
  51. package/dist/api/host/pty.d.ts +55 -0
  52. package/dist/api/host/pty.js +21 -0
  53. package/dist/api/host/pty.js.map +1 -0
  54. package/dist/api/host/session.d.ts +5 -0
  55. package/dist/api/host/session.js +52 -0
  56. package/dist/api/host/session.js.map +1 -0
  57. package/dist/api/host/version.d.ts +2 -0
  58. package/dist/api/host/version.js +3 -0
  59. package/dist/api/host/version.js.map +1 -0
  60. package/dist/api/host/workspace.d.ts +38 -0
  61. package/dist/api/host/workspace.js +9 -0
  62. package/dist/api/host/workspace.js.map +1 -0
  63. package/dist/api/plugin/http-client.d.ts +42 -0
  64. package/dist/api/plugin/http-client.js +364 -0
  65. package/dist/api/plugin/http-client.js.map +1 -0
  66. package/dist/api/plugin/http-protocol.d.ts +152 -0
  67. package/dist/api/plugin/http-protocol.js +49 -0
  68. package/dist/api/plugin/http-protocol.js.map +1 -0
  69. package/dist/api/result/result.d.ts +16 -0
  70. package/dist/api/result/result.js +43 -0
  71. package/dist/api/result/result.js.map +1 -0
  72. package/dist/commands/agent-turn.d.ts +63 -0
  73. package/dist/commands/agent-turn.js +687 -0
  74. package/dist/commands/agent-turn.js.map +1 -0
  75. package/dist/commands/ask-prompt.d.ts +6 -0
  76. package/dist/commands/ask-prompt.js +49 -0
  77. package/dist/commands/ask-prompt.js.map +1 -0
  78. package/dist/commands/config.d.ts +2 -0
  79. package/dist/commands/config.js +283 -0
  80. package/dist/commands/config.js.map +1 -0
  81. package/dist/commands/conversation.d.ts +51 -0
  82. package/dist/commands/conversation.js +630 -0
  83. package/dist/commands/conversation.js.map +1 -0
  84. package/dist/commands/doctor.d.ts +2 -0
  85. package/dist/commands/doctor.js +77 -0
  86. package/dist/commands/doctor.js.map +1 -0
  87. package/dist/commands/exec-approval.d.ts +3 -0
  88. package/dist/commands/exec-approval.js +80 -0
  89. package/dist/commands/exec-approval.js.map +1 -0
  90. package/dist/commands/help.d.ts +2 -0
  91. package/dist/commands/help.js +35 -0
  92. package/dist/commands/help.js.map +1 -0
  93. package/dist/commands/key.d.ts +2 -0
  94. package/dist/commands/key.js +226 -0
  95. package/dist/commands/key.js.map +1 -0
  96. package/dist/commands/plugin.d.ts +2 -0
  97. package/dist/commands/plugin.js +190 -0
  98. package/dist/commands/plugin.js.map +1 -0
  99. package/dist/commands/session.d.ts +2 -0
  100. package/dist/commands/session.js +167 -0
  101. package/dist/commands/session.js.map +1 -0
  102. package/dist/commands/shared.d.ts +35 -0
  103. package/dist/commands/shared.js +66 -0
  104. package/dist/commands/shared.js.map +1 -0
  105. package/dist/commands/start.d.ts +2 -0
  106. package/dist/commands/start.js +75 -0
  107. package/dist/commands/start.js.map +1 -0
  108. package/dist/commands/stop.d.ts +2 -0
  109. package/dist/commands/stop.js +24 -0
  110. package/dist/commands/stop.js.map +1 -0
  111. package/dist/commands/version.d.ts +2 -0
  112. package/dist/commands/version.js +33 -0
  113. package/dist/commands/version.js.map +1 -0
  114. package/dist/config/codes.d.ts +13 -0
  115. package/dist/config/codes.js +15 -0
  116. package/dist/config/codes.js.map +1 -0
  117. package/dist/config/credentials.d.ts +67 -0
  118. package/dist/config/credentials.js +214 -0
  119. package/dist/config/credentials.js.map +1 -0
  120. package/dist/config/defaults.d.ts +5 -0
  121. package/dist/config/defaults.js +31 -0
  122. package/dist/config/defaults.js.map +1 -0
  123. package/dist/config/index.d.ts +5 -0
  124. package/dist/config/index.js +10 -0
  125. package/dist/config/index.js.map +1 -0
  126. package/dist/config/loader.d.ts +10 -0
  127. package/dist/config/loader.js +68 -0
  128. package/dist/config/loader.js.map +1 -0
  129. package/dist/config/providers.d.ts +30 -0
  130. package/dist/config/providers.js +97 -0
  131. package/dist/config/providers.js.map +1 -0
  132. package/dist/config/types.d.ts +75 -0
  133. package/dist/config/types.js +4 -0
  134. package/dist/config/types.js.map +1 -0
  135. package/dist/config/validate.d.ts +4 -0
  136. package/dist/config/validate.js +391 -0
  137. package/dist/config/validate.js.map +1 -0
  138. package/dist/display/markdown.d.ts +7 -0
  139. package/dist/display/markdown.js +116 -0
  140. package/dist/display/markdown.js.map +1 -0
  141. package/dist/display/tool-label.d.ts +6 -0
  142. package/dist/display/tool-label.js +81 -0
  143. package/dist/display/tool-label.js.map +1 -0
  144. package/dist/event/event.d.ts +27 -0
  145. package/dist/event/event.js +152 -0
  146. package/dist/event/event.js.map +1 -0
  147. package/dist/index.d.ts +2 -0
  148. package/dist/index.js +308 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/input/codes.d.ts +15 -0
  151. package/dist/input/codes.js +20 -0
  152. package/dist/input/codes.js.map +1 -0
  153. package/dist/input/commands.d.ts +10 -0
  154. package/dist/input/commands.js +65 -0
  155. package/dist/input/commands.js.map +1 -0
  156. package/dist/input/help.d.ts +8 -0
  157. package/dist/input/help.js +51 -0
  158. package/dist/input/help.js.map +1 -0
  159. package/dist/input/index.d.ts +6 -0
  160. package/dist/input/index.js +10 -0
  161. package/dist/input/index.js.map +1 -0
  162. package/dist/input/parse-options.d.ts +11 -0
  163. package/dist/input/parse-options.js +51 -0
  164. package/dist/input/parse-options.js.map +1 -0
  165. package/dist/input/parse.d.ts +3 -0
  166. package/dist/input/parse.js +119 -0
  167. package/dist/input/parse.js.map +1 -0
  168. package/dist/input/types.d.ts +17 -0
  169. package/dist/input/types.js +2 -0
  170. package/dist/input/types.js.map +1 -0
  171. package/dist/logger/elog4js.d.ts +65 -0
  172. package/dist/logger/elog4js.js +305 -0
  173. package/dist/logger/elog4js.js.map +1 -0
  174. package/dist/logger/logger.d.ts +37 -0
  175. package/dist/logger/logger.js +196 -0
  176. package/dist/logger/logger.js.map +1 -0
  177. package/dist/network/index.d.ts +2 -0
  178. package/dist/network/index.js +6 -0
  179. package/dist/network/index.js.map +1 -0
  180. package/dist/network/openai.d.ts +117 -0
  181. package/dist/network/openai.js +443 -0
  182. package/dist/network/openai.js.map +1 -0
  183. package/dist/network/proxy.d.ts +9 -0
  184. package/dist/network/proxy.js +72 -0
  185. package/dist/network/proxy.js.map +1 -0
  186. package/dist/network/web.d.ts +34 -0
  187. package/dist/network/web.js +152 -0
  188. package/dist/network/web.js.map +1 -0
  189. package/dist/platform/clipboard.d.ts +15 -0
  190. package/dist/platform/clipboard.js +82 -0
  191. package/dist/platform/clipboard.js.map +1 -0
  192. package/dist/platform/exec.d.ts +28 -0
  193. package/dist/platform/exec.js +95 -0
  194. package/dist/platform/exec.js.map +1 -0
  195. package/dist/platform/file.d.ts +38 -0
  196. package/dist/platform/file.js +197 -0
  197. package/dist/platform/file.js.map +1 -0
  198. package/dist/platform/index.d.ts +7 -0
  199. package/dist/platform/index.js +12 -0
  200. package/dist/platform/index.js.map +1 -0
  201. package/dist/platform/notification.d.ts +14 -0
  202. package/dist/platform/notification.js +82 -0
  203. package/dist/platform/notification.js.map +1 -0
  204. package/dist/platform/open-external.d.ts +10 -0
  205. package/dist/platform/open-external.js +105 -0
  206. package/dist/platform/open-external.js.map +1 -0
  207. package/dist/platform/os.d.ts +20 -0
  208. package/dist/platform/os.js +86 -0
  209. package/dist/platform/os.js.map +1 -0
  210. package/dist/platform/path.d.ts +32 -0
  211. package/dist/platform/path.js +154 -0
  212. package/dist/platform/path.js.map +1 -0
  213. package/dist/plugin/access-guard.d.ts +1 -0
  214. package/dist/plugin/access-guard.js +40 -0
  215. package/dist/plugin/access-guard.js.map +1 -0
  216. package/dist/plugin/agent-service.d.ts +25 -0
  217. package/dist/plugin/agent-service.js +809 -0
  218. package/dist/plugin/agent-service.js.map +1 -0
  219. package/dist/plugin/agent-tools.d.ts +12 -0
  220. package/dist/plugin/agent-tools.js +31 -0
  221. package/dist/plugin/agent-tools.js.map +1 -0
  222. package/dist/plugin/capabilities.d.ts +26 -0
  223. package/dist/plugin/capabilities.js +192 -0
  224. package/dist/plugin/capabilities.js.map +1 -0
  225. package/dist/plugin/console-guard.d.ts +2 -0
  226. package/dist/plugin/console-guard.js +52 -0
  227. package/dist/plugin/console-guard.js.map +1 -0
  228. package/dist/plugin/data-access.d.ts +15 -0
  229. package/dist/plugin/data-access.js +57 -0
  230. package/dist/plugin/data-access.js.map +1 -0
  231. package/dist/plugin/fs.d.ts +3 -0
  232. package/dist/plugin/fs.js +93 -0
  233. package/dist/plugin/fs.js.map +1 -0
  234. package/dist/plugin/host-alias.d.ts +2 -0
  235. package/dist/plugin/host-alias.js +57 -0
  236. package/dist/plugin/host-alias.js.map +1 -0
  237. package/dist/plugin/index.d.ts +7 -0
  238. package/dist/plugin/index.js +11 -0
  239. package/dist/plugin/index.js.map +1 -0
  240. package/dist/plugin/install.d.ts +17 -0
  241. package/dist/plugin/install.js +163 -0
  242. package/dist/plugin/install.js.map +1 -0
  243. package/dist/plugin/loader.d.ts +45 -0
  244. package/dist/plugin/loader.js +739 -0
  245. package/dist/plugin/loader.js.map +1 -0
  246. package/dist/plugin/manage.d.ts +31 -0
  247. package/dist/plugin/manage.js +271 -0
  248. package/dist/plugin/manage.js.map +1 -0
  249. package/dist/plugin/models-service.d.ts +15 -0
  250. package/dist/plugin/models-service.js +317 -0
  251. package/dist/plugin/models-service.js.map +1 -0
  252. package/dist/plugin/network-service.d.ts +10 -0
  253. package/dist/plugin/network-service.js +87 -0
  254. package/dist/plugin/network-service.js.map +1 -0
  255. package/dist/plugin/package-manager.d.ts +46 -0
  256. package/dist/plugin/package-manager.js +148 -0
  257. package/dist/plugin/package-manager.js.map +1 -0
  258. package/dist/plugin/paths.d.ts +6 -0
  259. package/dist/plugin/paths.js +15 -0
  260. package/dist/plugin/paths.js.map +1 -0
  261. package/dist/plugin/registry.d.ts +17 -0
  262. package/dist/plugin/registry.js +82 -0
  263. package/dist/plugin/registry.js.map +1 -0
  264. package/dist/plugin/runtime.d.ts +9 -0
  265. package/dist/plugin/runtime.js +43 -0
  266. package/dist/plugin/runtime.js.map +1 -0
  267. package/dist/plugin/scaffold.d.ts +13 -0
  268. package/dist/plugin/scaffold.js +132 -0
  269. package/dist/plugin/scaffold.js.map +1 -0
  270. package/dist/plugin/state.d.ts +6 -0
  271. package/dist/plugin/state.js +38 -0
  272. package/dist/plugin/state.js.map +1 -0
  273. package/dist/plugin/zip.d.ts +7 -0
  274. package/dist/plugin/zip.js +138 -0
  275. package/dist/plugin/zip.js.map +1 -0
  276. package/dist/sandbox/audit.d.ts +12 -0
  277. package/dist/sandbox/audit.js +20 -0
  278. package/dist/sandbox/audit.js.map +1 -0
  279. package/dist/sandbox/backends/bwrap.d.ts +28 -0
  280. package/dist/sandbox/backends/bwrap.js +197 -0
  281. package/dist/sandbox/backends/bwrap.js.map +1 -0
  282. package/dist/sandbox/backends/direct.d.ts +7 -0
  283. package/dist/sandbox/backends/direct.js +32 -0
  284. package/dist/sandbox/backends/direct.js.map +1 -0
  285. package/dist/sandbox/bridge-state.d.ts +13 -0
  286. package/dist/sandbox/bridge-state.js +12 -0
  287. package/dist/sandbox/bridge-state.js.map +1 -0
  288. package/dist/sandbox/index.d.ts +5 -0
  289. package/dist/sandbox/index.js +6 -0
  290. package/dist/sandbox/index.js.map +1 -0
  291. package/dist/sandbox/manager.d.ts +8 -0
  292. package/dist/sandbox/manager.js +325 -0
  293. package/dist/sandbox/manager.js.map +1 -0
  294. package/dist/sandbox/memory-limit.d.ts +44 -0
  295. package/dist/sandbox/memory-limit.js +193 -0
  296. package/dist/sandbox/memory-limit.js.map +1 -0
  297. package/dist/sandbox/plugin-client.d.ts +80 -0
  298. package/dist/sandbox/plugin-client.js +1601 -0
  299. package/dist/sandbox/plugin-client.js.map +1 -0
  300. package/dist/sandbox/plugin-host.d.ts +1 -0
  301. package/dist/sandbox/plugin-host.js +1001 -0
  302. package/dist/sandbox/plugin-host.js.map +1 -0
  303. package/dist/sandbox/protocol.d.ts +43 -0
  304. package/dist/sandbox/protocol.js +96 -0
  305. package/dist/sandbox/protocol.js.map +1 -0
  306. package/dist/sandbox/rpc-timeouts.d.ts +28 -0
  307. package/dist/sandbox/rpc-timeouts.js +15 -0
  308. package/dist/sandbox/rpc-timeouts.js.map +1 -0
  309. package/dist/sandbox/supervisor.d.ts +31 -0
  310. package/dist/sandbox/supervisor.js +114 -0
  311. package/dist/sandbox/supervisor.js.map +1 -0
  312. package/dist/sandbox/types.d.ts +124 -0
  313. package/dist/sandbox/types.js +17 -0
  314. package/dist/sandbox/types.js.map +1 -0
  315. package/dist/service/control.d.ts +32 -0
  316. package/dist/service/control.js +117 -0
  317. package/dist/service/control.js.map +1 -0
  318. package/dist/session/compress.d.ts +3 -0
  319. package/dist/session/compress.js +42 -0
  320. package/dist/session/compress.js.map +1 -0
  321. package/dist/session/index.d.ts +4 -0
  322. package/dist/session/index.js +8 -0
  323. package/dist/session/index.js.map +1 -0
  324. package/dist/session/registry.d.ts +4 -0
  325. package/dist/session/registry.js +12 -0
  326. package/dist/session/registry.js.map +1 -0
  327. package/dist/session/replay.d.ts +10 -0
  328. package/dist/session/replay.js +109 -0
  329. package/dist/session/replay.js.map +1 -0
  330. package/dist/session/session.d.ts +40 -0
  331. package/dist/session/session.js +108 -0
  332. package/dist/session/session.js.map +1 -0
  333. package/dist/session/store.d.ts +58 -0
  334. package/dist/session/store.js +382 -0
  335. package/dist/session/store.js.map +1 -0
  336. package/dist/session/types.d.ts +56 -0
  337. package/dist/session/types.js +3 -0
  338. package/dist/session/types.js.map +1 -0
  339. package/dist/workspace/index.d.ts +7 -0
  340. package/dist/workspace/index.js +17 -0
  341. package/dist/workspace/index.js.map +1 -0
  342. package/dist/workspace/registry.d.ts +25 -0
  343. package/dist/workspace/registry.js +293 -0
  344. package/dist/workspace/registry.js.map +1 -0
  345. package/package.json +73 -5
  346. package/scripts/build-node-pty.mjs +55 -0
  347. package/scripts/rewrite-dts.mjs +36 -0
  348. package/scripts/run-tests.mjs +41 -0
  349. package/scripts/verify-sandbox.ts +98 -0
  350. package/src/agent/pending-asks.ts +88 -0
  351. package/src/agent/task-registry.ts +108 -0
  352. package/src/agent/tool-context.ts +47 -0
  353. package/src/agent/usage.ts +170 -0
  354. package/src/api/host/agent.ts +162 -0
  355. package/src/api/host/events.ts +7 -0
  356. package/src/api/host/exec.ts +47 -0
  357. package/src/api/host/fs.ts +33 -0
  358. package/src/api/host/hooks.ts +635 -0
  359. package/src/api/host/host.ts +99 -0
  360. package/src/api/host/http.ts +79 -0
  361. package/src/api/host/index.ts +20 -0
  362. package/src/api/host/models.ts +81 -0
  363. package/src/api/host/network.ts +32 -0
  364. package/src/api/host/plugin.ts +158 -0
  365. package/src/api/host/plugins.ts +59 -0
  366. package/src/api/host/pty.ts +73 -0
  367. package/src/api/host/session.ts +61 -0
  368. package/src/api/host/version.ts +2 -0
  369. package/src/api/host/workspace.ts +51 -0
  370. package/src/api/plugin/http-client.ts +492 -0
  371. package/src/api/plugin/http-protocol.ts +231 -0
  372. package/src/api/result/result.ts +52 -0
  373. package/src/commands/agent-turn.ts +817 -0
  374. package/src/commands/ask-prompt.ts +52 -0
  375. package/src/commands/config.ts +306 -0
  376. package/src/commands/conversation.ts +777 -0
  377. package/src/commands/doctor.ts +92 -0
  378. package/src/commands/exec-approval.ts +91 -0
  379. package/src/commands/help.ts +41 -0
  380. package/src/commands/key.ts +281 -0
  381. package/src/commands/plugin.ts +222 -0
  382. package/src/commands/session.ts +179 -0
  383. package/src/commands/shared.ts +103 -0
  384. package/src/commands/start.ts +88 -0
  385. package/src/commands/stop.ts +24 -0
  386. package/src/commands/version.ts +40 -0
  387. package/src/config/codes.ts +17 -0
  388. package/src/config/credentials.ts +302 -0
  389. package/src/config/defaults.ts +32 -0
  390. package/src/config/index.ts +10 -0
  391. package/src/config/loader.ts +80 -0
  392. package/src/config/providers.ts +133 -0
  393. package/src/config/types.ts +88 -0
  394. package/src/config/validate.ts +458 -0
  395. package/src/display/markdown.ts +137 -0
  396. package/src/display/tool-label.ts +87 -0
  397. package/src/event/event.ts +171 -0
  398. package/src/index.ts +344 -0
  399. package/src/input/codes.ts +21 -0
  400. package/src/input/commands.ts +76 -0
  401. package/src/input/help.ts +60 -0
  402. package/src/input/index.ts +10 -0
  403. package/src/input/parse-options.ts +66 -0
  404. package/src/input/parse.ts +138 -0
  405. package/src/input/types.ts +19 -0
  406. package/src/logger/elog4js.ts +366 -0
  407. package/src/logger/logger.ts +251 -0
  408. package/src/network/index.ts +6 -0
  409. package/src/network/openai.ts +571 -0
  410. package/src/network/proxy.ts +80 -0
  411. package/src/network/web.ts +206 -0
  412. package/src/platform/clipboard.ts +107 -0
  413. package/src/platform/exec.ts +128 -0
  414. package/src/platform/file.ts +235 -0
  415. package/src/platform/index.ts +12 -0
  416. package/src/platform/notification.ts +108 -0
  417. package/src/platform/open-external.ts +132 -0
  418. package/src/platform/os.ts +101 -0
  419. package/src/platform/path.ts +214 -0
  420. package/src/plugin/access-guard.ts +46 -0
  421. package/src/plugin/agent-service.ts +969 -0
  422. package/src/plugin/agent-tools.ts +43 -0
  423. package/src/plugin/capabilities.ts +240 -0
  424. package/src/plugin/console-guard.ts +66 -0
  425. package/src/plugin/data-access.ts +70 -0
  426. package/src/plugin/fs.ts +109 -0
  427. package/src/plugin/host-alias.ts +61 -0
  428. package/src/plugin/index.ts +11 -0
  429. package/src/plugin/install.ts +213 -0
  430. package/src/plugin/loader.ts +952 -0
  431. package/src/plugin/manage.ts +338 -0
  432. package/src/plugin/models-service.ts +383 -0
  433. package/src/plugin/network-service.ts +102 -0
  434. package/src/plugin/package-manager.ts +214 -0
  435. package/src/plugin/paths.ts +19 -0
  436. package/src/plugin/registry.ts +103 -0
  437. package/src/plugin/runtime.ts +57 -0
  438. package/src/plugin/scaffold.ts +158 -0
  439. package/src/plugin/state.ts +52 -0
  440. package/src/plugin/zip.ts +156 -0
  441. package/src/sandbox/audit.ts +38 -0
  442. package/src/sandbox/backends/bwrap.ts +251 -0
  443. package/src/sandbox/backends/direct.ts +43 -0
  444. package/src/sandbox/bridge-state.ts +29 -0
  445. package/src/sandbox/index.ts +5 -0
  446. package/src/sandbox/manager.ts +406 -0
  447. package/src/sandbox/memory-limit.ts +245 -0
  448. package/src/sandbox/plugin-client.ts +1881 -0
  449. package/src/sandbox/plugin-host.ts +1282 -0
  450. package/src/sandbox/protocol.ts +142 -0
  451. package/src/sandbox/pty-bridge.py +154 -0
  452. package/src/sandbox/rpc-timeouts.ts +43 -0
  453. package/src/sandbox/supervisor.ts +172 -0
  454. package/src/sandbox/types.ts +149 -0
  455. package/src/service/control.ts +155 -0
  456. package/src/session/compress.ts +47 -0
  457. package/src/session/index.ts +8 -0
  458. package/src/session/registry.ts +17 -0
  459. package/src/session/replay.ts +132 -0
  460. package/src/session/session.ts +134 -0
  461. package/src/session/store.ts +468 -0
  462. package/src/session/types.ts +61 -0
  463. package/src/workspace/index.ts +21 -0
  464. package/src/workspace/registry.ts +356 -0
@@ -0,0 +1,117 @@
1
+ /*
2
+ * 服务进程控制:pid 文件 + 跨进程停止。
3
+ * 只有 wellspring start 会写服务记录;wellspring stop 读取后发送 SIGTERM。
4
+ */
5
+ import { join } from "node:path";
6
+ import { readJsonIfExists, removePath, statIfExists, writeJsonAtomic } from "../platform/file.js";
7
+ import { getPaths } from "../platform/path.js";
8
+ export class ServiceNotRunningError extends Error {
9
+ constructor() {
10
+ super("没有正在运行的 Wellspring 服务");
11
+ this.name = "ServiceNotRunningError";
12
+ }
13
+ }
14
+ export class ServiceAlreadyRunningError extends Error {
15
+ pid;
16
+ constructor(pid) {
17
+ super(`Wellspring 服务已在运行(pid ${pid})`);
18
+ this.name = "ServiceAlreadyRunningError";
19
+ this.pid = pid;
20
+ }
21
+ }
22
+ export class ServiceStopTimeoutError extends Error {
23
+ pid;
24
+ constructor(pid) {
25
+ super(`等待服务退出超时(pid ${pid})`);
26
+ this.name = "ServiceStopTimeoutError";
27
+ this.pid = pid;
28
+ }
29
+ }
30
+ export function serviceRecordFile(paths = getPaths()) {
31
+ return join(paths.dataDir, "service.json");
32
+ }
33
+ export async function readServiceRecord(paths = getPaths()) {
34
+ const value = await readJsonIfExists(serviceRecordFile(paths));
35
+ if (value === null ||
36
+ typeof value.pid !== "number" ||
37
+ !Number.isInteger(value.pid) ||
38
+ value.pid <= 0) {
39
+ return null;
40
+ }
41
+ return {
42
+ version: 1,
43
+ pid: value.pid,
44
+ startedAt: typeof value.startedAt === "string" ? value.startedAt : "",
45
+ cwd: typeof value.cwd === "string" ? value.cwd : "",
46
+ };
47
+ }
48
+ export async function writeServiceRecord(record, paths = getPaths()) {
49
+ await writeJsonAtomic(serviceRecordFile(paths), { version: 1, ...record });
50
+ }
51
+ /** 只清理属于指定 pid 的记录,避免误删后来的服务 */
52
+ export async function clearServiceRecord(pid, paths = getPaths()) {
53
+ const current = await readServiceRecord(paths);
54
+ if (current !== null && current.pid !== pid) {
55
+ return;
56
+ }
57
+ await removePath(serviceRecordFile(paths));
58
+ }
59
+ export function isProcessAlive(pid) {
60
+ try {
61
+ process.kill(pid, 0);
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ if (error instanceof Error && "code" in error && error.code === "ESRCH") {
66
+ return false;
67
+ }
68
+ return true;
69
+ }
70
+ }
71
+ /** 停止当前服务:SIGTERM → 轮询等待退出 → 清理 pid 文件 */
72
+ export async function stopService(paths = getPaths(), options = {}) {
73
+ const record = await readServiceRecord(paths);
74
+ if (record === null) {
75
+ throw new ServiceNotRunningError();
76
+ }
77
+ if (!isProcessAlive(record.pid)) {
78
+ await clearServiceRecord(record.pid, paths);
79
+ throw new ServiceNotRunningError();
80
+ }
81
+ try {
82
+ process.kill(record.pid, "SIGTERM");
83
+ }
84
+ catch (error) {
85
+ if (error instanceof Error && "code" in error && error.code === "ESRCH") {
86
+ await clearServiceRecord(record.pid, paths);
87
+ throw new ServiceNotRunningError();
88
+ }
89
+ throw error;
90
+ }
91
+ const timeoutMs = options.timeoutMs ?? 5_000;
92
+ const pollMs = options.pollMs ?? 100;
93
+ const deadline = Date.now() + timeoutMs;
94
+ while (Date.now() < deadline) {
95
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
96
+ if (!isProcessAlive(record.pid)) {
97
+ await clearServiceRecord(record.pid, paths);
98
+ return record.pid;
99
+ }
100
+ }
101
+ throw new ServiceStopTimeoutError(record.pid);
102
+ }
103
+ /** start 前检查:已有存活服务则报错,残留记录直接清掉 */
104
+ export async function assertServiceStartable(paths = getPaths()) {
105
+ const record = await readServiceRecord(paths);
106
+ if (record === null) {
107
+ return;
108
+ }
109
+ if (isProcessAlive(record.pid)) {
110
+ throw new ServiceAlreadyRunningError(record.pid);
111
+ }
112
+ const shown = await statIfExists(serviceRecordFile(paths));
113
+ if (shown !== null) {
114
+ await clearServiceRecord(record.pid, paths);
115
+ }
116
+ }
117
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/service/control.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAE,QAAQ,EAAsB,MAAM,qBAAqB,CAAA;AASlE,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC7C;QACI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACxC,CAAC;CACJ;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACxC,GAAG,CAAQ;IAEpB,YAAY,GAAW;QACnB,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAClB,CAAC;CACJ;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACrC,GAAG,CAAQ;IAEpB,YAAY,GAAW;QACnB,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;QACrC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAClB,CAAC;CACJ;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAK,GAAkB,QAAQ,EAAE;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,KAAK,GAAkB,QAAQ,EAAE;IAEjC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAyB,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;IACtF,IACI,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5B,KAAK,CAAC,GAAG,IAAI,CAAC,EAChB,CAAC;QACC,OAAO,IAAI,CAAA;IACf,CAAC;IACD,OAAO;QACH,OAAO,EAAE,CAAC;QACV,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;QACrE,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;KACtD,CAAA;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,MAAsC,EACtC,KAAK,GAAkB,QAAQ,EAAE;IAEjC,MAAM,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAC9E,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,GAAW,EACX,KAAK,GAAkB,QAAQ,EAAE;IAEjC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC9C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QAC1C,OAAM;IACV,CAAC;IACD,MAAM,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,IAAI,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACtE,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC;AAOD,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,KAAK,GAAkB,QAAQ,EAAE,EACjC,OAAO,GAAuB,EAAE;IAEhC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC7C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,sBAAsB,EAAE,CAAA;IACtC,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3C,MAAM,IAAI,sBAAsB,EAAE,CAAA;IACtC,CAAC;IAED,IAAI,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACtE,MAAM,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC3C,MAAM,IAAI,sBAAsB,EAAE,CAAA;QACtC,CAAC;QACD,MAAM,KAAK,CAAA;IACf,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAA;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAA;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3D,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC3C,OAAO,MAAM,CAAC,GAAG,CAAA;QACrB,CAAC;IACL,CAAC;IACD,MAAM,IAAI,uBAAuB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACjD,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAK,GAAkB,QAAQ,EAAE;IAC1E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC7C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,OAAM;IACV,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC/C,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SessionEvent } from "./types.js";
2
+ export declare function encodeEvents(events: readonly SessionEvent[]): Buffer;
3
+ export declare function decodeEvents(data: Buffer): SessionEvent[];
@@ -0,0 +1,42 @@
1
+ /*
2
+ * 会话段编解码。
3
+ * 每轮一个 zstd frame:解压后是 JSONL 事件流,一行一个事件。
4
+ */
5
+ import { zstdCompressSync, zstdDecompressSync } from "node:zlib";
6
+ export function encodeEvents(events) {
7
+ const text = `${events.map((event) => JSON.stringify(event)).join("\n")}\n`;
8
+ return zstdCompressSync(Buffer.from(text, "utf8"));
9
+ }
10
+ export function decodeEvents(data) {
11
+ let text;
12
+ try {
13
+ text = zstdDecompressSync(data).toString("utf8");
14
+ }
15
+ catch (error) {
16
+ throw new Error("会话段解压失败", { cause: error });
17
+ }
18
+ const events = [];
19
+ for (const line of text.split("\n")) {
20
+ const trimmed = line.trim();
21
+ if (trimmed === "") {
22
+ continue;
23
+ }
24
+ let parsed;
25
+ try {
26
+ parsed = JSON.parse(trimmed);
27
+ }
28
+ catch (error) {
29
+ throw new Error("会话段包含无法解析的行", { cause: error });
30
+ }
31
+ if (typeof parsed !== "object" ||
32
+ parsed === null ||
33
+ typeof parsed.type !== "string" ||
34
+ typeof parsed.seq !== "number" ||
35
+ typeof parsed.time !== "number") {
36
+ throw new Error("会话事件缺少 type/seq/time");
37
+ }
38
+ events.push(parsed);
39
+ }
40
+ return events;
41
+ }
42
+ //# sourceMappingURL=compress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../src/session/compress.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAIhE,MAAM,UAAU,YAAY,CAAC,MAA+B;IACxD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;IAC3E,OAAO,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACD,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,MAAM,GAAmB,EAAE,CAAA;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACjB,SAAQ;QACZ,CAAC;QACD,IAAI,MAAe,CAAA;QACnB,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,IACI,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,OAAQ,MAA6B,CAAC,IAAI,KAAK,QAAQ;YACvD,OAAQ,MAA4B,CAAC,GAAG,KAAK,QAAQ;YACrD,OAAQ,MAA6B,CAAC,IAAI,KAAK,QAAQ,EACzD,CAAC;YACC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAsB,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,MAAM,CAAA;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./compress.js";
2
+ export * from "./replay.js";
3
+ export * from "./store.js";
4
+ export * from "./types.js";
@@ -0,0 +1,8 @@
1
+ /*
2
+ * 会话层入口。
3
+ */
4
+ export * from "./compress.js";
5
+ export * from "./replay.js";
6
+ export * from "./store.js";
7
+ export * from "./types.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Session } from "./session.js";
2
+ export declare function registerSession(session: Session): void;
3
+ export declare function unregisterSession(id: string): void;
4
+ export declare function getSession(id: string): Session | null;
@@ -0,0 +1,12 @@
1
+ // 活跃会话注册表
2
+ const sessions = new Map();
3
+ export function registerSession(session) {
4
+ sessions.set(session.id, session);
5
+ }
6
+ export function unregisterSession(id) {
7
+ sessions.delete(id);
8
+ }
9
+ export function getSession(id) {
10
+ return sessions.get(id) ?? null;
11
+ }
12
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/session/registry.ts"],"names":[],"mappings":"AAAA,UAAU;AAIV,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;AAE3C,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC5C,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;AACnC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ChatCompletionMessageParam } from "openai/resources/chat/completions";
2
+ import type { ContentPart, SessionEvent, SessionMode, SessionTurn } from "./types.js";
3
+ export declare function contentText(parts: readonly ContentPart[] | undefined): string;
4
+ /** 按 turn/start 分组;没有 turn 边界的事件归到当前组 */
5
+ export declare function groupTurns(events: readonly SessionEvent[]): SessionTurn[];
6
+ export declare function lastTurnNumber(events: readonly SessionEvent[]): number;
7
+ export declare function lastSeq(events: readonly SessionEvent[]): number;
8
+ /** 历史事件 → 模型消息;保留 assistant tool_calls 与 tool 结果 */
9
+ export declare function toChatMessages(events: readonly SessionEvent[]): ChatCompletionMessageParam[];
10
+ export declare function turnModeLabel(mode: SessionMode | null): string;
@@ -0,0 +1,109 @@
1
+ /*
2
+ * 会话回放:把事件流还原成对话轮次与 Chat Completions 消息。
3
+ */
4
+ export function contentText(parts) {
5
+ if (parts === undefined) {
6
+ return "";
7
+ }
8
+ let text = "";
9
+ for (const part of parts) {
10
+ if (part.type === "text") {
11
+ text += part.text;
12
+ }
13
+ }
14
+ return text;
15
+ }
16
+ function messageOf(event) {
17
+ const message = event.data["message"];
18
+ if (typeof message !== "object" || message === null) {
19
+ return null;
20
+ }
21
+ return message;
22
+ }
23
+ /** 按 turn/start 分组;没有 turn 边界的事件归到当前组 */
24
+ export function groupTurns(events) {
25
+ const turns = [];
26
+ let current = null;
27
+ for (const event of events) {
28
+ if (event.type === "turn/start") {
29
+ const turn = typeof event.data["turn"] === "number" ? event.data["turn"] : turns.length + 1;
30
+ const mode = event.data["mode"] === "run" ? "run" : event.data["mode"] === "chat" ? "chat" : null;
31
+ current = { turn, mode, events: [] };
32
+ turns.push(current);
33
+ }
34
+ if (current === null) {
35
+ const turn = typeof event.data["turn"] === "number" ? event.data["turn"] : 1;
36
+ const mode = event.data["mode"] === "run" ? "run" : event.data["mode"] === "chat" ? "chat" : null;
37
+ current = { turn, mode, events: [] };
38
+ turns.push(current);
39
+ }
40
+ current.events.push(event);
41
+ }
42
+ return turns;
43
+ }
44
+ export function lastTurnNumber(events) {
45
+ let max = 0;
46
+ for (const event of events) {
47
+ const turn = event.data["turn"];
48
+ if (typeof turn === "number" && turn > max) {
49
+ max = turn;
50
+ }
51
+ }
52
+ return max;
53
+ }
54
+ export function lastSeq(events) {
55
+ let max = -1;
56
+ for (const event of events) {
57
+ if (event.seq > max) {
58
+ max = event.seq;
59
+ }
60
+ }
61
+ return max;
62
+ }
63
+ /** 历史事件 → 模型消息;保留 assistant tool_calls 与 tool 结果 */
64
+ export function toChatMessages(events) {
65
+ const messages = [];
66
+ for (const event of events) {
67
+ if (event.type === "tool/result") {
68
+ const callId = event.data["callId"];
69
+ const content = event.data["content"];
70
+ if (typeof callId === "string" && typeof content === "string") {
71
+ messages.push({ role: "tool", tool_call_id: callId, content });
72
+ }
73
+ continue;
74
+ }
75
+ const message = messageOf(event);
76
+ if (message === null) {
77
+ continue;
78
+ }
79
+ const text = contentText(message.content);
80
+ if (event.type === "user/message" && message.role === "user") {
81
+ if (text !== "") {
82
+ messages.push({ role: "user", content: text });
83
+ }
84
+ continue;
85
+ }
86
+ if (event.type === "assistant/message" && message.role === "assistant") {
87
+ const toolCalls = message.content.filter((part) => part.type === "tool-call");
88
+ if (toolCalls.length > 0) {
89
+ messages.push({
90
+ role: "assistant",
91
+ content: text === "" ? null : text,
92
+ tool_calls: toolCalls.map((call) => ({
93
+ id: call.id,
94
+ type: "function",
95
+ function: { name: call.name, arguments: call.arguments },
96
+ })),
97
+ });
98
+ }
99
+ else if (text !== "") {
100
+ messages.push({ role: "assistant", content: text });
101
+ }
102
+ }
103
+ }
104
+ return messages;
105
+ }
106
+ export function turnModeLabel(mode) {
107
+ return mode === "run" ? "run" : "chat";
108
+ }
109
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/session/replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SessionStore, SessionData } from "./store.js";
2
+ import type { SessionMessageRecord } from "./types.js";
3
+ import { Workspace } from "../workspace/index.js";
4
+ export interface SessionMessageInput {
5
+ readonly sessionId: string;
6
+ readonly content: string | readonly string[];
7
+ readonly type?: string;
8
+ }
9
+ export declare class SessionMessage {
10
+ readonly sessionId: string;
11
+ readonly content: string[];
12
+ readonly type: string;
13
+ constructor(input: SessionMessageInput);
14
+ }
15
+ export declare class Session {
16
+ #private;
17
+ readonly id: string;
18
+ readonly type: string;
19
+ readonly metadata: Record<string, unknown>;
20
+ readonly workspace: Workspace;
21
+ readonly data: SessionData;
22
+ constructor(data: SessionData, store?: SessionStore | null);
23
+ /** Agent 循环开始后,消息进入队列而不是直接落盘 */
24
+ begin(): void;
25
+ /** 请求停止本轮:循环在下一步之前收尾,不再调用模型 */
26
+ requestStop(): void;
27
+ /** 本轮是否被要求停止 */
28
+ get stopRequested(): boolean;
29
+ end(): void;
30
+ /** 是否有一轮正在跑;插话只在这个窗口内有效 */
31
+ get active(): boolean;
32
+ /** 取走运行期排队的消息 */
33
+ take(): SessionMessage[];
34
+ get events(): import("./types.js").SessionEvent[];
35
+ get turns(): import("./types.js").SessionTurn[];
36
+ /** 发送消息并触发 onMessage */
37
+ message(content: string | readonly string[], type?: string): Promise<SessionMessage>;
38
+ toJSON(): Record<string, unknown>;
39
+ }
40
+ export type { SessionStore, SessionData, SessionMessageRecord };
@@ -0,0 +1,108 @@
1
+ // 会话门面:插件与宿主使用的 Session / SessionMessage
2
+ import { randomUUID } from "node:crypto";
3
+ import { emitOnMessage } from "../api/host/hooks.js";
4
+ import { lastSeq, lastTurnNumber } from "./replay.js";
5
+ import { Workspace } from "../workspace/index.js";
6
+ export class SessionMessage {
7
+ sessionId;
8
+ content;
9
+ type;
10
+ constructor(input) {
11
+ this.sessionId = input.sessionId;
12
+ this.content = typeof input.content === "string" ? [input.content] : [...input.content];
13
+ this.type = input.type ?? "message";
14
+ }
15
+ }
16
+ export class Session {
17
+ id;
18
+ type;
19
+ metadata;
20
+ workspace;
21
+ data;
22
+ #store;
23
+ #queue = [];
24
+ #active = false;
25
+ #stopRequested = false;
26
+ constructor(data, store = null) {
27
+ this.data = data;
28
+ this.#store = store;
29
+ this.id = data.meta.id;
30
+ this.type = data.meta.type;
31
+ this.metadata = data.meta.metadata;
32
+ this.workspace = new Workspace(data.meta.workspace);
33
+ }
34
+ /** Agent 循环开始后,消息进入队列而不是直接落盘 */
35
+ begin() {
36
+ this.#active = true;
37
+ this.#stopRequested = false;
38
+ }
39
+ /** 请求停止本轮:循环在下一步之前收尾,不再调用模型 */
40
+ requestStop() {
41
+ this.#stopRequested = true;
42
+ }
43
+ /** 本轮是否被要求停止 */
44
+ get stopRequested() {
45
+ return this.#stopRequested;
46
+ }
47
+ end() {
48
+ this.#active = false;
49
+ }
50
+ /** 是否有一轮正在跑;插话只在这个窗口内有效 */
51
+ get active() {
52
+ return this.#active;
53
+ }
54
+ /** 取走运行期排队的消息 */
55
+ take() {
56
+ return this.#queue.splice(0);
57
+ }
58
+ get events() {
59
+ return this.data.events;
60
+ }
61
+ get turns() {
62
+ return this.data.turns;
63
+ }
64
+ /** 发送消息并触发 onMessage */
65
+ async message(content, type = "message") {
66
+ const message = new SessionMessage({ sessionId: this.id, content, type });
67
+ await emitOnMessage({
68
+ sessionId: this.id,
69
+ mode: "chat",
70
+ turn: lastTurnNumber(this.data.events) + 1,
71
+ role: "user",
72
+ phase: "before",
73
+ content: message.content.join(""),
74
+ prompt: [],
75
+ });
76
+ if (this.#active || this.#store === null) {
77
+ this.#queue.push(message);
78
+ return message;
79
+ }
80
+ const turn = lastTurnNumber(this.data.events) + 1;
81
+ await this.#store.appendTurn(this.data, [
82
+ {
83
+ type: "user/message",
84
+ seq: lastSeq(this.data.events) + 1,
85
+ time: Date.now(),
86
+ data: {
87
+ turn,
88
+ message: {
89
+ role: "user",
90
+ content: [{ type: "text", text: message.content.join("") }],
91
+ source: { kind: "plugin", type: message.type },
92
+ id: randomUUID(),
93
+ },
94
+ },
95
+ },
96
+ ]);
97
+ return message;
98
+ }
99
+ toJSON() {
100
+ return {
101
+ id: this.id,
102
+ type: this.type,
103
+ metadata: this.metadata,
104
+ workspace: this.workspace.root,
105
+ };
106
+ }
107
+ }
108
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { SessionEvent, SessionHeader, SessionMeta, SessionTurn } from "./types.js";
2
+ export declare class SessionNotFoundError extends Error {
3
+ constructor(id: string);
4
+ }
5
+ export declare class SessionAmbiguousError extends Error {
6
+ constructor(id: string);
7
+ }
8
+ export declare class SessionLockedError extends Error {
9
+ constructor(id: string);
10
+ }
11
+ export interface SessionData {
12
+ readonly meta: SessionMeta;
13
+ readonly header: SessionHeader;
14
+ readonly dir: string;
15
+ events: SessionEvent[];
16
+ turns: SessionTurn[];
17
+ }
18
+ export interface SessionSummary {
19
+ readonly id: string;
20
+ readonly cwd: string;
21
+ readonly dir: string;
22
+ readonly turns: number;
23
+ readonly updatedAt: number;
24
+ readonly last: boolean;
25
+ }
26
+ export interface CreateSessionOptions {
27
+ readonly cwd: string;
28
+ readonly workspace?: string;
29
+ readonly model: string;
30
+ readonly id?: string;
31
+ readonly type?: string;
32
+ readonly metadata?: Record<string, unknown>;
33
+ }
34
+ export interface ListSessionsOptions {
35
+ readonly cwd: string;
36
+ readonly all?: boolean;
37
+ readonly limit?: number;
38
+ }
39
+ export declare function isValidSessionId(id: string): boolean;
40
+ export declare function newSessionId(date?: Date): string;
41
+ /** cwd → 桶目录名:<slug>-<sha256 前 8 位> */
42
+ export declare function sessionBucket(cwd: string): string;
43
+ export declare class SessionStore {
44
+ #private;
45
+ readonly root: string;
46
+ constructor(root?: string);
47
+ bucketDir(cwd: string): string;
48
+ lastId(cwd: string): Promise<string | null>;
49
+ create(options: CreateSessionOptions): Promise<SessionData>;
50
+ /** 打开当前 cwd 桶优先,其次其他桶;不存在抛 SessionNotFoundError */
51
+ open(id: string, cwd?: string): Promise<SessionData>;
52
+ /** 取最近一次会话;没有则创建 */
53
+ openLastOrCreate(cwd: string, model: string): Promise<SessionData>;
54
+ appendTurn(session: SessionData, events: readonly SessionEvent[]): Promise<number>;
55
+ list(options: ListSessionsOptions): Promise<SessionSummary[]>;
56
+ remove(id: string): Promise<void>;
57
+ removeAll(cwd: string): Promise<number>;
58
+ }