@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,66 @@
1
+ /*
2
+ * 命令级参数解析。
3
+ * 统一走 node:util parseArgs,未知参数严格报错并映射为 usage.* 错误码。
4
+ */
5
+
6
+ import { parseArgs, type ParseArgsOptionsConfig } from "node:util"
7
+
8
+ import { Result } from "../api/result/result.ts"
9
+ import { USAGE_CODES, usageCode } from "./codes.ts"
10
+
11
+ export type CommandValues = Readonly<Record<string, string | boolean | undefined>>
12
+
13
+ export interface ParsedCommandLine {
14
+ readonly values: CommandValues
15
+ readonly positionals: readonly string[]
16
+ }
17
+
18
+ function optionName(message: string): string | undefined {
19
+ const match = /(--?[A-Za-z][\w-]*)/.exec(message)
20
+ return match?.[1]
21
+ }
22
+
23
+ function mapParseError(error: unknown): string {
24
+ const candidate = error as { code?: string; message?: string }
25
+ const message = candidate.message ?? ""
26
+ switch (candidate.code) {
27
+ case "ERR_PARSE_ARGS_UNKNOWN_OPTION":
28
+ return usageCode(USAGE_CODES.unknownOption, optionName(message))
29
+ case "ERR_PARSE_ARGS_MISSING_OPTION_ARG":
30
+ return usageCode(USAGE_CODES.missingValue, optionName(message))
31
+ case "ERR_PARSE_ARGS_INVALID_OPTION_VALUE":
32
+ return usageCode(USAGE_CODES.invalidValue, optionName(message))
33
+ default:
34
+ return usageCode(USAGE_CODES.invalidValue)
35
+ }
36
+ }
37
+
38
+ export function parseCommandArgs(
39
+ argv: readonly string[],
40
+ options: ParseArgsOptionsConfig,
41
+ ): Result<ParsedCommandLine> {
42
+ try {
43
+ const parsed = parseArgs({
44
+ args: [...argv],
45
+ options,
46
+ strict: true,
47
+ allowPositionals: true,
48
+ })
49
+ return Result.successWithData<ParsedCommandLine>({
50
+ values: parsed.values as CommandValues,
51
+ positionals: parsed.positionals,
52
+ })
53
+ } catch (error) {
54
+ return Result.error<ParsedCommandLine>(mapParseError(error))
55
+ }
56
+ }
57
+
58
+ /** 把 unknown 值转成字符串参数 */
59
+ export function stringValue(values: CommandValues, name: string): string | undefined {
60
+ const value = values[name]
61
+ return typeof value === "string" ? value : undefined
62
+ }
63
+
64
+ export function booleanValue(values: CommandValues, name: string): boolean {
65
+ return values[name] === true
66
+ }
@@ -0,0 +1,138 @@
1
+ /*
2
+ * 全局参数解析。
3
+ * 遇到第一个位置参数(命令名)即停止解析,其余原样交给命令或插件。
4
+ */
5
+
6
+ import { parseArgs } from "node:util"
7
+
8
+ import type { LevelWithSilent } from "pino"
9
+
10
+ import { Result } from "../api/result/result.ts"
11
+ import { USAGE_CODES, usageCode } from "./codes.ts"
12
+ import type { GlobalOptions, ParsedGlobal } from "./types.ts"
13
+
14
+ const LEVELS: ReadonlySet<string> = new Set<LevelWithSilent>([
15
+ "fatal",
16
+ "error",
17
+ "warn",
18
+ "info",
19
+ "debug",
20
+ "trace",
21
+ "silent",
22
+ ])
23
+
24
+ function optionName(message: string): string | undefined {
25
+ const match = /(--?[A-Za-z][\w-]*)/.exec(message)
26
+ return match?.[1]
27
+ }
28
+
29
+ function mapParseError(error: unknown): string {
30
+ const candidate = error as { code?: string; message?: string }
31
+ const message = candidate.message ?? ""
32
+ switch (candidate.code) {
33
+ case "ERR_PARSE_ARGS_UNKNOWN_OPTION":
34
+ return usageCode(USAGE_CODES.unknownOption, optionName(message))
35
+ case "ERR_PARSE_ARGS_MISSING_OPTION_ARG":
36
+ return usageCode(USAGE_CODES.missingValue, optionName(message))
37
+ case "ERR_PARSE_ARGS_INVALID_OPTION_VALUE":
38
+ return usageCode(USAGE_CODES.invalidValue, optionName(message))
39
+ default:
40
+ return usageCode(USAGE_CODES.invalidValue)
41
+ }
42
+ }
43
+
44
+ function text(value: string | boolean | (string | boolean)[] | undefined): string | undefined {
45
+ return typeof value === "string" ? value : undefined
46
+ }
47
+
48
+ const VALUE_OPTIONS: ReadonlySet<string> = new Set([
49
+ "-c",
50
+ "--config",
51
+ "--home",
52
+ "-l",
53
+ "--log-level",
54
+ ])
55
+
56
+ /** 手工切出全局参数前缀:遇到第一个位置参数(命令名)即停止,后续 token 全部原样保留 */
57
+ function splitGlobalPrefix(argv: readonly string[]): {
58
+ globalArgs: string[]
59
+ command: string | null
60
+ commandArgv: string[]
61
+ } {
62
+ const globalArgs: string[] = []
63
+ let index = 0
64
+
65
+ while (index < argv.length) {
66
+ const token = argv[index]
67
+ if (token === undefined) {
68
+ break
69
+ }
70
+ if (token === "--") {
71
+ index += 1
72
+ break
73
+ }
74
+ if (!token.startsWith("-") || token === "-") {
75
+ break
76
+ }
77
+
78
+ globalArgs.push(token)
79
+ const equals = token.indexOf("=")
80
+ const name = equals === -1 ? token : token.slice(0, equals)
81
+ if (VALUE_OPTIONS.has(name) && equals === -1) {
82
+ const value = argv[index + 1]
83
+ if (value !== undefined) {
84
+ globalArgs.push(value)
85
+ index += 2
86
+ continue
87
+ }
88
+ }
89
+ index += 1
90
+ }
91
+
92
+ const command = argv[index] ?? null
93
+ return {
94
+ globalArgs,
95
+ command,
96
+ commandArgv: index < argv.length ? [...argv.slice(index + 1)] : [],
97
+ }
98
+ }
99
+
100
+ export function parseGlobal(argv: readonly string[]): Result<ParsedGlobal> {
101
+ const { globalArgs, command, commandArgv } = splitGlobalPrefix(argv)
102
+ let values: Record<string, string | boolean | (string | boolean)[] | undefined>
103
+ try {
104
+ const parsed = parseArgs({
105
+ args: globalArgs,
106
+ options: {
107
+ config: { type: "string", short: "c" },
108
+ home: { type: "string" },
109
+ "log-level": { type: "string", short: "l" },
110
+ json: { type: "boolean" },
111
+ quiet: { type: "boolean", short: "q" },
112
+ help: { type: "boolean", short: "h" },
113
+ version: { type: "boolean", short: "v" },
114
+ },
115
+ strict: true,
116
+ allowPositionals: false,
117
+ })
118
+ values = parsed.values as typeof values
119
+ } catch (error) {
120
+ return Result.error<ParsedGlobal>(mapParseError(error))
121
+ }
122
+
123
+ const rawLevel = text(values["log-level"])
124
+ if (rawLevel !== undefined && !LEVELS.has(rawLevel)) {
125
+ return Result.error<ParsedGlobal>(usageCode(USAGE_CODES.invalidValue, "--log-level"))
126
+ }
127
+
128
+ const options: GlobalOptions = {
129
+ config: text(values["config"]),
130
+ home: text(values["home"]),
131
+ logLevel: rawLevel as LevelWithSilent | undefined,
132
+ json: values["json"] === true,
133
+ quiet: values["quiet"] === true,
134
+ help: values["help"] === true,
135
+ version: values["version"] === true,
136
+ }
137
+ return Result.successWithData<ParsedGlobal>({ options, command, commandArgv })
138
+ }
@@ -0,0 +1,19 @@
1
+ import type { LevelWithSilent } from "pino"
2
+
3
+ export interface GlobalOptions {
4
+ readonly config?: string
5
+ readonly home?: string
6
+ readonly logLevel?: LevelWithSilent
7
+ readonly json: boolean
8
+ readonly quiet: boolean
9
+ readonly help: boolean
10
+ readonly version: boolean
11
+ }
12
+
13
+ export interface ParsedGlobal {
14
+ readonly options: GlobalOptions
15
+ /** 命令名;没有子命令时为 null */
16
+ readonly command: string | null
17
+ /** 命令名之后的原始参数,原样交给命令或插件 */
18
+ readonly commandArgv: readonly string[]
19
+ }
@@ -0,0 +1,366 @@
1
+ /*
2
+ * 终端 UI 输出器(elog4js)。
3
+ * human 模式专用:级别标签、颜色、流式输出;Pino 只负责结构化日志与文件。
4
+ * --json 模式下所有方法静默,stdout 只留给 Result envelope。
5
+ */
6
+
7
+ export type ElogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal"
8
+
9
+ export interface ElogStream {
10
+ write(text: string): unknown
11
+ }
12
+
13
+ export interface ElogOptions {
14
+ readonly stdout?: ElogStream
15
+ readonly stderr?: ElogStream
16
+ /** 未指定时按 TTY 与 NO_COLOR 自动判断 */
17
+ readonly color?: boolean
18
+ readonly json?: boolean
19
+ }
20
+
21
+ const TAGS: Readonly<Record<ElogLevel, string>> = {
22
+ trace: "[TRACE]",
23
+ debug: "[DEBUG]",
24
+ info: "[INFO ]",
25
+ warn: "[WARN ]",
26
+ error: "[ERROR]",
27
+ fatal: "[FATAL]",
28
+ }
29
+
30
+ const COLORS: Readonly<Record<ElogLevel, string>> = {
31
+ trace: "\x1b[90m",
32
+ debug: "\x1b[36m",
33
+ info: "\x1b[32m",
34
+ warn: "\x1b[33m",
35
+ error: "\x1b[31m",
36
+ fatal: "\x1b[35m",
37
+ }
38
+
39
+ const RESET = "\x1b[0m"
40
+
41
+ // 字符显示宽度
42
+ function charWidth(codePoint: number): number {
43
+ if (codePoint === 0x200b) {
44
+ return 0
45
+ }
46
+ return codePoint >= 0x1100 &&
47
+ (codePoint <= 0x115f ||
48
+ codePoint === 0x2329 ||
49
+ codePoint === 0x232a ||
50
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf) ||
51
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
52
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
53
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
54
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
55
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
56
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
57
+ (codePoint >= 0x1f300 && codePoint <= 0x1f64f) ||
58
+ (codePoint >= 0x1f900 && codePoint <= 0x1f9ff))
59
+ ? 2
60
+ : 1
61
+ }
62
+
63
+ function displayWidth(text: string): number {
64
+ let width = 0
65
+ for (const char of text) {
66
+ width += charWidth(char.codePointAt(0) ?? 0)
67
+ }
68
+ return width
69
+ }
70
+
71
+ function wrapLine(text: string, width: number): string[] {
72
+ if (displayWidth(text) <= width) {
73
+ return [text]
74
+ }
75
+ const chunks: string[] = []
76
+ let rest = text
77
+ while (displayWidth(rest) > width) {
78
+ let taken = 0
79
+ let current = 0
80
+ let lastSpace = -1
81
+ for (const char of rest) {
82
+ const next = charWidth(char.codePointAt(0) ?? 0)
83
+ if (current + next > width) {
84
+ break
85
+ }
86
+ current += next
87
+ taken += char.length
88
+ if (char === " ") {
89
+ lastSpace = taken
90
+ }
91
+ }
92
+ const cut = lastSpace > 0 ? lastSpace : taken
93
+ chunks.push(rest.slice(0, cut))
94
+ rest = rest.slice(cut)
95
+ }
96
+ chunks.push(rest)
97
+ return chunks
98
+ }
99
+
100
+ function detectColor(stream: ElogStream | undefined): boolean {
101
+ const force = process.env["FORCE_COLOR"]
102
+ if (force === "0") {
103
+ return false
104
+ }
105
+ if (force !== undefined && force !== "") {
106
+ return true
107
+ }
108
+ if (process.env["NO_COLOR"] !== undefined) {
109
+ return false
110
+ }
111
+ if (process.env["TERM"] === "dumb") {
112
+ return false
113
+ }
114
+ return (stream as { isTTY?: boolean } | undefined)?.isTTY === true
115
+ }
116
+
117
+ export class Elog {
118
+ #stdout: ElogStream
119
+ #stderr: ElogStream
120
+ #colorStdout: boolean
121
+ #colorStderr: boolean
122
+ #json: boolean
123
+ #sessionName = ""
124
+ #streaming = false
125
+
126
+ constructor(options: ElogOptions = {}) {
127
+ this.#stdout = options.stdout ?? process.stdout
128
+ this.#stderr = options.stderr ?? process.stderr
129
+ this.#colorStdout = options.color ?? detectColor(this.#stdout)
130
+ this.#colorStderr = options.color ?? detectColor(this.#stderr)
131
+ this.#json = options.json ?? false
132
+ }
133
+
134
+ setJson(json: boolean): void {
135
+ this.#json = json
136
+ }
137
+
138
+ isJson(): boolean {
139
+ return this.#json
140
+ }
141
+
142
+ setSessionName(name: string): void {
143
+ this.#sessionName = name
144
+ }
145
+
146
+ getSessionName(): string {
147
+ return this.#sessionName
148
+ }
149
+
150
+ setColor(color: boolean): void {
151
+ this.#colorStdout = color
152
+ this.#colorStderr = color
153
+ }
154
+
155
+ /** 普通信息,stdout */
156
+ info(text: string): void {
157
+ this.#line("info", text, this.#stdout)
158
+ }
159
+
160
+ /** 成功信息,stdout */
161
+ success(text: string): void {
162
+ this.#line("info", text, this.#stdout, "[ OK ]")
163
+ }
164
+
165
+ debug(text: string): void {
166
+ this.#line("debug", text, this.#stderr)
167
+ }
168
+
169
+ warn(text: string): void {
170
+ this.#line("warn", text, this.#stderr)
171
+ }
172
+
173
+ error(text: string): void {
174
+ this.#line("error", text, this.#stderr)
175
+ }
176
+
177
+ /** Agent 输出前缀 */
178
+ agentStart(): void {
179
+ if (this.#json) {
180
+ return
181
+ }
182
+ const color = this.#colorStdout
183
+ const prefix = color ? `\x1b[36m[Agent]\x1b[0m` : "[Agent]"
184
+ this.#stdout.write(`\n${prefix}\n`)
185
+ }
186
+
187
+ /** Agent 输出行 */
188
+ agent(text: string): void {
189
+ if (this.#json) {
190
+ return
191
+ }
192
+ this.agentStart()
193
+ this.#stdout.write(`${text}\n`)
194
+ }
195
+
196
+ /** 步骤分隔行 */
197
+ step(step: number, total?: number): void {
198
+ if (this.#json) {
199
+ return
200
+ }
201
+ const color = this.#colorStdout
202
+ const text = total === undefined ? `── step ${step} ──` : `── step ${step}/${total} ──`
203
+ this.#stdout.write(`\n${color ? `\x1b[36m${text}\x1b[0m` : text}\n`)
204
+ }
205
+
206
+ /** 代码块 */
207
+ #codeBlock(label: string, code: string): void {
208
+ const columns = process.stdout.columns ?? 80
209
+ const width = Math.max(40, columns - 2)
210
+ const inner = width - 4
211
+ const color = this.#colorStdout
212
+ const border = (text: string): string => (color ? `\x1b[90m${text}\x1b[0m` : text)
213
+ const header = `┌ [${label}]`
214
+ this.#stdout.write(
215
+ `${border(`${header}${"─".repeat(Math.max(1, width - header.length - 1))}┐`)}\n`,
216
+ )
217
+ for (const source of code.split("\n")) {
218
+ const text = source.replace(/\t/g, " ")
219
+ for (let index = 0; index < Math.max(1, text.length); index += inner) {
220
+ const chunk = text.slice(index, index + inner)
221
+ this.#stdout.write(`${border("│")} ${chunk.padEnd(inner)} ${border("│")}\n`)
222
+ }
223
+ }
224
+ this.#stdout.write(`${border(`└${"─".repeat(width - 2)}┘`)}\n`)
225
+ }
226
+
227
+ /** 操作请求块 */
228
+ action(
229
+ title: string,
230
+ rows: readonly {
231
+ readonly label: string
232
+ readonly value: string
233
+ readonly code?: boolean
234
+ }[],
235
+ ): void {
236
+ if (this.#json) {
237
+ return
238
+ }
239
+ const color = this.#colorStdout
240
+ const label = color ? `\x1b[33m${title}\x1b[0m` : title
241
+ this.#stdout.write(`\n${label}\n`)
242
+ for (const row of rows) {
243
+ if (row.code === true) {
244
+ this.#stdout.write(` ${row.label}\n`)
245
+ this.#codeBlock("bash", row.value)
246
+ continue
247
+ }
248
+ this.#stdout.write(` ${row.label} ${row.value}\n`)
249
+ }
250
+ }
251
+
252
+ /** 工具调用行:换行后单独一行显示中文动作名与参数摘要 */
253
+ toolCall(label: string, summary = ""): void {
254
+ if (this.#json) {
255
+ return
256
+ }
257
+ const color = this.#colorStdout
258
+ const name = color ? `\x1b[36m${label}\x1b[0m` : label
259
+ const line = summary === "" ? name : `${name} ${summary}`
260
+ this.#stdout.write(`\n${line}\n`)
261
+ }
262
+
263
+ /** 工具结果/错误行:缩进在工具调用下面 */
264
+ toolResult(text: string): void {
265
+ if (this.#json || text === "") {
266
+ return
267
+ }
268
+ const color = this.#colorStdout
269
+ const line = ` ${text}`
270
+ this.#stdout.write(`${color ? `\x1b[90m${line}\x1b[0m` : line}\n`)
271
+ }
272
+
273
+ /** 操作结果行 */
274
+ actionStatus(name: string, status: string): void {
275
+ if (this.#json) {
276
+ return
277
+ }
278
+ const color = this.#colorStdout
279
+ const label = color ? `\x1b[90m[操作]\x1b[0m` : "[操作]"
280
+ this.#stdout.write(`${label} ${name} ${status}\n`)
281
+ }
282
+
283
+ /** 只带级别标签,不再拼插件名 */
284
+ tag(level: ElogLevel, text: string): void {
285
+ const stream = level === "error" || level === "warn" ? this.#stderr : this.#stdout
286
+ this.#line(level, text, stream)
287
+ }
288
+
289
+ /** 插件输出:`[LEVEL] [plugin] message` */
290
+ plugin(level: ElogLevel, pluginName: string, message: string): void {
291
+ const stream = level === "error" || level === "warn" ? this.#stderr : this.#stdout
292
+ this.#line(level, `[${pluginName}] ${message}`, stream)
293
+ }
294
+
295
+ /** 流式写正文,不加换行与标签 */
296
+ stream(text: string): void {
297
+ if (this.#json || text === "") {
298
+ return
299
+ }
300
+ this.#streaming = true
301
+ this.#stdout.write(text)
302
+ }
303
+
304
+ /** 结束当前流式行 */
305
+ line(): void {
306
+ if (this.#json || !this.#streaming) {
307
+ return
308
+ }
309
+ this.#streaming = false
310
+ this.#stdout.write("\n")
311
+ }
312
+
313
+ /** 提示行,stderr,无级别标签 */
314
+ notice(text: string): void {
315
+ if (this.#json) {
316
+ return
317
+ }
318
+ this.#stderr.write(`${text}\n`)
319
+ }
320
+
321
+ /** 纯文本行,stdout */
322
+ print(text = ""): void {
323
+ if (this.#json) {
324
+ return
325
+ }
326
+ this.#stdout.write(`${text}\n`)
327
+ }
328
+
329
+ /** 清屏,仅 TTY 有效 */
330
+ clear(): void {
331
+ if (this.#json || process.stdout.isTTY !== true) {
332
+ return
333
+ }
334
+ process.stdout.write("\x1b[2J\x1b[H")
335
+ }
336
+
337
+ #line(level: ElogLevel, text: string, stream: ElogStream, tag = TAGS[level]): void {
338
+ if (this.#json) {
339
+ return
340
+ }
341
+ const color = stream === this.#stdout ? this.#colorStdout : this.#colorStderr
342
+ const coloredTag = color ? `${COLORS[level]}${tag}${RESET}` : tag
343
+ stream.write(`${coloredTag} ${text}\n`)
344
+ }
345
+ }
346
+
347
+ let singleton: Elog | null = null
348
+
349
+ /** 初始化全局 elog4js;重复调用会替换实例 */
350
+ export function initElog(options: ElogOptions = {}): Elog {
351
+ singleton = new Elog(options)
352
+ return singleton
353
+ }
354
+
355
+ /** 取全局 elog4js,未初始化时按默认参数创建 */
356
+ export function getElog(): Elog {
357
+ if (singleton === null) {
358
+ singleton = new Elog()
359
+ }
360
+ return singleton
361
+ }
362
+
363
+ /** 重置全局实例,供测试使用 */
364
+ export function resetElog(): void {
365
+ singleton = null
366
+ }