@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,20 @@
1
+ /** 等待用户回答的上限;超时后工具返回“没有回答”并继续 */
2
+ export declare const ASK_TIMEOUT_MS: number;
3
+ export declare function createAskId(): string;
4
+ /**
5
+ * 登记一个等待回答的问题。answerAsk 先把 answer 交给这个 Promise;
6
+ * 超时兑现 null(用户没回答)。
7
+ */
8
+ export declare function waitForAsk(input: {
9
+ readonly askId: string;
10
+ readonly sessionId: string;
11
+ readonly timeoutMs?: number;
12
+ }): Promise<string | null>;
13
+ /** 用户回答;命中等待中的问题时返回 true */
14
+ export declare function answerAsk(askId: string, answer: string): boolean;
15
+ /** 取消一次等待(工具循环收尾、异常退出时调用) */
16
+ export declare function cancelAsk(askId: string): void;
17
+ /** 会话结束时清掉遗留的等待 */
18
+ export declare function cancelSessionAsks(sessionId: string): void;
19
+ /** 当前等待回答的数量(测试与诊断用) */
20
+ export declare function pendingAskCount(): number;
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Agent 提问:ask 工具把问题交给界面,等待用户回答后把答案还回工具循环。
3
+ * 和提权审批一样是“一轮对话中途停下来等人”的机制,只是不需要权限判断。
4
+ */
5
+ import { randomUUID } from "node:crypto";
6
+ /** 等待用户回答的上限;超时后工具返回“没有回答”并继续 */
7
+ export const ASK_TIMEOUT_MS = 5 * 60_000;
8
+ const pending = new Map();
9
+ export function createAskId() {
10
+ return `ask_${randomUUID()}`;
11
+ }
12
+ /**
13
+ * 登记一个等待回答的问题。answerAsk 先把 answer 交给这个 Promise;
14
+ * 超时兑现 null(用户没回答)。
15
+ */
16
+ export function waitForAsk(input) {
17
+ return new Promise((resolvePromise) => {
18
+ let settled = false;
19
+ let timer = null;
20
+ const finish = (answer) => {
21
+ if (settled) {
22
+ return;
23
+ }
24
+ settled = true;
25
+ if (timer !== null) {
26
+ clearTimeout(timer);
27
+ }
28
+ pending.delete(input.askId);
29
+ resolvePromise(answer);
30
+ };
31
+ timer = setTimeout(() => {
32
+ finish(null);
33
+ }, input.timeoutMs ?? ASK_TIMEOUT_MS);
34
+ pending.set(input.askId, {
35
+ sessionId: input.sessionId,
36
+ resolve: finish,
37
+ timer,
38
+ });
39
+ });
40
+ }
41
+ /** 用户回答;命中等待中的问题时返回 true */
42
+ export function answerAsk(askId, answer) {
43
+ const entry = pending.get(askId);
44
+ if (entry === undefined) {
45
+ return false;
46
+ }
47
+ entry.resolve(answer);
48
+ return true;
49
+ }
50
+ /** 取消一次等待(工具循环收尾、异常退出时调用) */
51
+ export function cancelAsk(askId) {
52
+ const entry = pending.get(askId);
53
+ if (entry === undefined) {
54
+ return;
55
+ }
56
+ entry.resolve(null);
57
+ }
58
+ /** 会话结束时清掉遗留的等待 */
59
+ export function cancelSessionAsks(sessionId) {
60
+ for (const [askId, entry] of [...pending]) {
61
+ if (entry.sessionId === sessionId) {
62
+ cancelAsk(askId);
63
+ }
64
+ }
65
+ }
66
+ /** 当前等待回答的数量(测试与诊断用) */
67
+ export function pendingAskCount() {
68
+ return pending.size;
69
+ }
70
+ //# sourceMappingURL=pending-asks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-asks.js","sourceRoot":"","sources":["../../src/agent/pending-asks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,iCAAiC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAA;AAQxC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;AAE7C,MAAM,UAAU,WAAW;IACvB,OAAO,OAAO,UAAU,EAAE,EAAE,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAI1B;IACG,OAAO,IAAI,OAAO,CAAgB,CAAC,cAAc,EAAE,EAAE;QACjD,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,KAAK,GAA0B,IAAI,CAAA;QACvC,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAQ,EAAE;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACV,OAAM;YACV,CAAC;YACD,OAAO,GAAG,IAAI,CAAA;YACd,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,CAAC,CAAA;YACvB,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC3B,cAAc,CAAC,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAA;QACD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACpB,MAAM,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC,EAAE,KAAK,CAAC,SAAS,IAAI,cAAc,CAAC,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;YACrB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,MAAM;YACf,KAAK;SACR,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAc;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACrB,OAAO,IAAI,CAAA;AACf,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,OAAM;IACV,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IAC/C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,SAAS,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACL,CAAC;AACL,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,eAAe;IAC3B,OAAO,OAAO,CAAC,IAAI,CAAA;AACvB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { AgentCodeResult, AgentCodeTaskHandle, StopMode } from "../sandbox/types.js";
2
+ export interface AgentTaskInfo {
3
+ readonly taskId: string;
4
+ readonly sandboxId: string;
5
+ readonly status: "running" | "completed" | "failed" | "cancelled";
6
+ readonly startedAt: number;
7
+ readonly stdout: string;
8
+ readonly stderr: string;
9
+ readonly result: AgentCodeResult | null;
10
+ readonly error: string | null;
11
+ }
12
+ export declare function registerBackgroundTask(handle: AgentCodeTaskHandle): AgentTaskInfo;
13
+ export declare function queryTask(taskId?: string): AgentTaskInfo | null;
14
+ export declare function stopTask(taskId: string | undefined, mode: StopMode): boolean;
@@ -0,0 +1,80 @@
1
+ // 后台 execute_code 任务注册表
2
+ const tasks = new Map();
3
+ const order = [];
4
+ export function registerBackgroundTask(handle) {
5
+ const taskId = handle.sandboxId;
6
+ const record = {
7
+ taskId,
8
+ handle,
9
+ startedAt: Date.now(),
10
+ status: "running",
11
+ cancelled: false,
12
+ result: null,
13
+ error: null,
14
+ };
15
+ tasks.set(taskId, record);
16
+ order.push(taskId);
17
+ while (order.length > 50) {
18
+ const oldest = order.shift();
19
+ if (oldest !== undefined) {
20
+ tasks.delete(oldest);
21
+ }
22
+ }
23
+ void handle
24
+ .wait()
25
+ .then((result) => {
26
+ record.status = record.cancelled ? "cancelled" : "completed";
27
+ record.result = result;
28
+ })
29
+ .catch((error) => {
30
+ record.status = "failed";
31
+ record.error = error instanceof Error ? error.message : String(error);
32
+ });
33
+ return infoOf(record);
34
+ }
35
+ function infoOf(record) {
36
+ return {
37
+ taskId: record.taskId,
38
+ sandboxId: record.handle.sandboxId,
39
+ status: record.status === "completed" &&
40
+ (record.result?.signal === "SIGINT" || record.result?.signal === "SIGKILL")
41
+ ? "cancelled"
42
+ : record.status,
43
+ startedAt: record.startedAt,
44
+ stdout: record.result?.stdout ?? record.handle.stdout,
45
+ stderr: record.result?.stderr ?? record.handle.stderr,
46
+ result: record.result,
47
+ error: record.error,
48
+ };
49
+ }
50
+ export function queryTask(taskId) {
51
+ if (taskId !== undefined && taskId !== "") {
52
+ const record = tasks.get(taskId);
53
+ return record === undefined ? null : infoOf(record);
54
+ }
55
+ for (let index = order.length - 1; index >= 0; index -= 1) {
56
+ const id = order[index];
57
+ if (id !== undefined) {
58
+ const record = tasks.get(id);
59
+ if (record !== undefined && record.status === "running") {
60
+ return infoOf(record);
61
+ }
62
+ }
63
+ }
64
+ const latest = order[order.length - 1];
65
+ return latest === undefined ? null : infoOf(tasks.get(latest));
66
+ }
67
+ export function stopTask(taskId, mode) {
68
+ const info = queryTask(taskId);
69
+ if (info === null) {
70
+ return false;
71
+ }
72
+ const record = tasks.get(info.taskId);
73
+ if (record === undefined || record.status !== "running") {
74
+ return false;
75
+ }
76
+ record.cancelled = true;
77
+ record.handle.stop(mode);
78
+ return true;
79
+ }
80
+ //# sourceMappingURL=task-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-registry.js","sourceRoot":"","sources":["../../src/agent/task-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SandboxAccess } from "../config/types.js";
2
+ import type { Elog } from "../logger/elog4js.js";
3
+ export interface AgentToolRequest {
4
+ readonly command: string;
5
+ readonly argv: readonly string[];
6
+ readonly cwd: string;
7
+ readonly currentPermission?: SandboxAccess;
8
+ readonly requestedPermission?: SandboxAccess;
9
+ readonly justification?: string;
10
+ /** 请求联网:和提权是两件事,审阅时也要看到 */
11
+ readonly network?: boolean;
12
+ /** 请求后台执行 */
13
+ readonly background?: boolean;
14
+ /** 要喂给进程的标准输入(可能很大,界面截断显示) */
15
+ readonly stdin?: string;
16
+ /** 请求的超时毫秒 */
17
+ readonly timeoutMs?: number;
18
+ }
19
+ export interface AgentToolContext {
20
+ readonly sessionId: string;
21
+ readonly turn: number;
22
+ readonly step: number;
23
+ readonly workspaceDir: string;
24
+ readonly permission: SandboxAccess;
25
+ readonly allowExec: boolean;
26
+ readonly approveExec?: (request: AgentToolRequest) => Promise<boolean>;
27
+ readonly elog: Elog;
28
+ }
29
+ export declare function withAgentToolContext<T>(context: AgentToolContext, task: () => Promise<T>): Promise<T>;
30
+ export declare function getAgentToolContext(): AgentToolContext | null;
@@ -0,0 +1,10 @@
1
+ // 插件工具调用上下文:宿主能力在调用期间读取当前 Agent 权限
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ const storage = new AsyncLocalStorage();
4
+ export async function withAgentToolContext(context, task) {
5
+ return await storage.run(context, task);
6
+ }
7
+ export function getAgentToolContext() {
8
+ return storage.getStore() ?? null;
9
+ }
10
+ //# sourceMappingURL=tool-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-context.js","sourceRoot":"","sources":["../../src/agent/tool-context.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAiCpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAoB,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,OAAyB,EACzB,IAAsB;IAEtB,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,mBAAmB;IAC/B,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAA;AACrC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /** 一次模型调用报告的用量;供应商没返回的项为 null */
2
+ export interface ProviderUsage {
3
+ readonly inputTokens: number | null;
4
+ readonly outputTokens: number | null;
5
+ readonly cacheReadTokens: number | null;
6
+ readonly cacheWriteTokens: number | null;
7
+ readonly reasoningTokens: number | null;
8
+ }
9
+ /** 界面几处共用的按需字段:空值不写进会话,旧数据格式保持不变 */
10
+ export interface TokenUsage {
11
+ readonly inputTokens: number | null;
12
+ readonly outputTokens: number | null;
13
+ readonly cacheReadTokens?: number | null;
14
+ readonly cacheWriteTokens?: number | null;
15
+ readonly reasoningTokens?: number | null;
16
+ /** 这一轮最后一次请求的 prompt tokens,即收尾时占用的上下文 */
17
+ readonly contextTokens?: number | null;
18
+ }
19
+ /** 把供应商的 usage 原样对象归一化成计数;一条可用字段都没有时返回 null */
20
+ export declare function parseProviderUsage(value: unknown): ProviderUsage | null;
21
+ /**
22
+ * 缓存命中率(0-100 整数)
23
+ *
24
+ * 分母是 prompt tokens 总数;`cacheRead` 是其中的子集。
25
+ * 供应商没报告缓存或没有任何输入时返回 null。
26
+ */
27
+ export declare function cacheHitPercent(cacheReadTokens: number | null | undefined, promptTokens: number | null | undefined): number | null;
28
+ /** 未缓存输入:prompt tokens 减去缓存读取/写入,最小为 0 */
29
+ export declare function uncachedInputTokens(inputTokens: number | null | undefined, cacheReadTokens: number | null | undefined, cacheWriteTokens?: number | null): number | null;
30
+ /** 去掉空的可选字段:会话 JSON 里只留供应商真的报告过的项 */
31
+ export declare function compactUsage(usage: TokenUsage): TokenUsage;
32
+ /** 一次模型回复的结构化用量;inputTokens 默认就是这次请求占用的上下文 */
33
+ export interface UsageSource {
34
+ readonly inputTokens: number | null;
35
+ readonly outputTokens: number | null;
36
+ readonly cacheReadTokens?: number | null;
37
+ readonly cacheWriteTokens?: number | null;
38
+ readonly reasoningTokens?: number | null;
39
+ }
40
+ export declare function usageOf(source: UsageSource, contextTokens?: number | null): TokenUsage;
@@ -0,0 +1,122 @@
1
+ /*
2
+ * Token 用量:模型报告的输出、缓存命中与上下文占用。
3
+ *
4
+ * `inputTokens` 统一成 prompt tokens 总数,缓存命中的部分也计算在内;
5
+ * `cacheReadTokens` / `cacheWriteTokens` 是其中的缓存读取与写入。
6
+ * 不同供应商口径由 parseProviderUsage 抹平:
7
+ * - DeepSeek / OpenAI:prompt_tokens(或 Responses 的 input_tokens)本身含缓存命中,
8
+ * 命中数在 prompt_cache_hit_tokens 或 prompt_tokens_details.cached_tokens;
9
+ * - 部分网关沿用 Anthropic 的 cache_read_input_tokens / cache_creation_input_tokens,
10
+ * 这时 input_tokens 只是未缓存部分,parse 会加上两段缓存凑成总数。
11
+ */
12
+ function countOf(value) {
13
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
14
+ return null;
15
+ }
16
+ return Math.floor(value);
17
+ }
18
+ function recordOf(value) {
19
+ return value !== null && typeof value === "object" ? value : null;
20
+ }
21
+ /** 把供应商的 usage 原样对象归一化成计数;一条可用字段都没有时返回 null */
22
+ export function parseProviderUsage(value) {
23
+ const record = recordOf(value);
24
+ if (record === null) {
25
+ return null;
26
+ }
27
+ const promptDetails = recordOf(record["prompt_tokens_details"]);
28
+ const inputDetails = recordOf(record["input_tokens_details"]);
29
+ const completionDetails = recordOf(record["completion_tokens_details"]);
30
+ const outputDetails = recordOf(record["output_tokens_details"]);
31
+ let input = countOf(record["prompt_tokens"]) ?? countOf(record["input_tokens"]);
32
+ const output = countOf(record["completion_tokens"]) ?? countOf(record["output_tokens"]);
33
+ const cacheRead = countOf(record["prompt_cache_hit_tokens"]) ??
34
+ countOf(promptDetails?.["cached_tokens"]) ??
35
+ countOf(inputDetails?.["cached_tokens"]) ??
36
+ countOf(record["cache_read_input_tokens"]);
37
+ const cacheWrite = countOf(record["cache_creation_input_tokens"]) ??
38
+ countOf(promptDetails?.["cache_creation_tokens"]) ??
39
+ countOf(inputDetails?.["cache_creation_tokens"]);
40
+ /*
41
+ * Anthropic 口径的 input_tokens 不含缓存读取/写入,补成 prompt 总数;
42
+ * 有 prompt_tokens 或 *_tokens_details 的 OpenAI 口径不能再加,否则重复计数。
43
+ */
44
+ const anthropicStyle = record["prompt_tokens"] === undefined &&
45
+ promptDetails === null &&
46
+ inputDetails === null &&
47
+ (cacheRead !== null || cacheWrite !== null) &&
48
+ (record["cache_read_input_tokens"] !== undefined ||
49
+ record["cache_creation_input_tokens"] !== undefined);
50
+ if (anthropicStyle && input !== null) {
51
+ input += (cacheRead ?? 0) + (cacheWrite ?? 0);
52
+ }
53
+ const reasoning = countOf(completionDetails?.["reasoning_tokens"]) ??
54
+ countOf(outputDetails?.["reasoning_tokens"]);
55
+ if (input === null && output === null && cacheRead === null && cacheWrite === null) {
56
+ return null;
57
+ }
58
+ return {
59
+ inputTokens: input,
60
+ outputTokens: output,
61
+ cacheReadTokens: cacheRead,
62
+ cacheWriteTokens: cacheWrite,
63
+ reasoningTokens: reasoning,
64
+ };
65
+ }
66
+ /**
67
+ * 缓存命中率(0-100 整数)
68
+ *
69
+ * 分母是 prompt tokens 总数;`cacheRead` 是其中的子集。
70
+ * 供应商没报告缓存或没有任何输入时返回 null。
71
+ */
72
+ export function cacheHitPercent(cacheReadTokens, promptTokens) {
73
+ if (typeof cacheReadTokens !== "number" || typeof promptTokens !== "number") {
74
+ return null;
75
+ }
76
+ if (!Number.isFinite(cacheReadTokens) || !Number.isFinite(promptTokens) || promptTokens <= 0) {
77
+ return null;
78
+ }
79
+ const percent = Math.round((cacheReadTokens / promptTokens) * 100);
80
+ return Math.min(100, Math.max(0, percent));
81
+ }
82
+ /** 未缓存输入:prompt tokens 减去缓存读取/写入,最小为 0 */
83
+ export function uncachedInputTokens(inputTokens, cacheReadTokens, cacheWriteTokens) {
84
+ if (typeof inputTokens !== "number" || !Number.isFinite(inputTokens) || inputTokens < 0) {
85
+ return null;
86
+ }
87
+ const cacheRead = typeof cacheReadTokens === "number" && Number.isFinite(cacheReadTokens)
88
+ ? cacheReadTokens
89
+ : 0;
90
+ const cacheWrite = typeof cacheWriteTokens === "number" && Number.isFinite(cacheWriteTokens)
91
+ ? cacheWriteTokens
92
+ : 0;
93
+ return Math.max(0, Math.floor(inputTokens - cacheRead - cacheWrite));
94
+ }
95
+ /** 去掉空的可选字段:会话 JSON 里只留供应商真的报告过的项 */
96
+ export function compactUsage(usage) {
97
+ return {
98
+ inputTokens: usage.inputTokens,
99
+ outputTokens: usage.outputTokens,
100
+ ...(typeof usage.cacheReadTokens === "number"
101
+ ? { cacheReadTokens: usage.cacheReadTokens }
102
+ : {}),
103
+ ...(typeof usage.cacheWriteTokens === "number"
104
+ ? { cacheWriteTokens: usage.cacheWriteTokens }
105
+ : {}),
106
+ ...(typeof usage.reasoningTokens === "number"
107
+ ? { reasoningTokens: usage.reasoningTokens }
108
+ : {}),
109
+ ...(typeof usage.contextTokens === "number" ? { contextTokens: usage.contextTokens } : {}),
110
+ };
111
+ }
112
+ export function usageOf(source, contextTokens) {
113
+ return compactUsage({
114
+ inputTokens: source.inputTokens,
115
+ outputTokens: source.outputTokens,
116
+ cacheReadTokens: source.cacheReadTokens ?? null,
117
+ cacheWriteTokens: source.cacheWriteTokens ?? null,
118
+ reasoningTokens: source.reasoningTokens ?? null,
119
+ contextTokens: contextTokens === undefined ? source.inputTokens : contextTokens,
120
+ });
121
+ }
122
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/agent/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import type { TokenUsage } from "../../agent/usage.js";
2
+ /** Agent 运行时的 sandbox 权限;与 CLI 的 --permission 取值一致 */
3
+ export type HostAgentPermission = "read-only" | "workspace-write" | "danger-full-access";
4
+ export interface HostAgentChatInput {
5
+ /** 用户消息 */
6
+ readonly message: string;
7
+ /** 已有会话 id;不传则创建新会话 */
8
+ readonly sessionId?: string;
9
+ /** 覆盖本次使用的模型 */
10
+ readonly model?: string;
11
+ /** 覆盖本次使用的供应商 id(内置为 openai) */
12
+ readonly provider?: string;
13
+ /** 覆盖本次推理强度:off / low / high / max */
14
+ readonly reasoning?: string;
15
+ /** 覆盖本次 system prompt */
16
+ readonly system?: string;
17
+ /** 会话所在工作目录;不传使用宿主当前目录 */
18
+ readonly cwd?: string;
19
+ /** 用户在输入框里用 @ 引用的工作区相对路径 */
20
+ readonly references?: readonly string[];
21
+ /** 覆盖本轮的 sandbox 权限;不传则使用宿主配置的 sandbox.access */
22
+ readonly permission?: HostAgentPermission;
23
+ }
24
+ export interface HostAgentChatResult {
25
+ readonly sessionId: string;
26
+ /** 会话内第几轮 */
27
+ readonly turn: number;
28
+ /** 本轮执行的步数 */
29
+ readonly steps: number;
30
+ readonly reply: string;
31
+ readonly model: string;
32
+ /** 本轮 token 用量:含缓存命中/写入、推理与收尾时的上下文占用 */
33
+ readonly usage: TokenUsage | null;
34
+ }
35
+ export interface HostWorkspaceFileEntry {
36
+ /** 相对工作区根的路径,使用 / 分隔 */
37
+ readonly path: string;
38
+ readonly name: string;
39
+ readonly type: "file" | "directory";
40
+ }
41
+ export interface HostWorkspaceFilesResult {
42
+ readonly ok: boolean;
43
+ readonly root: string;
44
+ readonly entries: readonly HostWorkspaceFileEntry[];
45
+ readonly truncated: boolean;
46
+ readonly error?: string;
47
+ }
48
+ /** 工作目录校验结果:root 为规范化后的绝对路径 */
49
+ export interface HostWorkspaceCheck {
50
+ readonly ok: boolean;
51
+ readonly root: string;
52
+ readonly name: string;
53
+ /** ok=false 时的原因 */
54
+ readonly error?: string;
55
+ }
56
+ export interface HostAgentApprovalRequest {
57
+ readonly approvalId: string;
58
+ readonly command: string;
59
+ readonly argv: readonly string[];
60
+ readonly cwd: string;
61
+ readonly currentPermission?: string;
62
+ readonly requestedPermission?: string;
63
+ readonly justification?: string;
64
+ /** 请求联网 */
65
+ readonly network?: boolean;
66
+ /** 请求后台执行 */
67
+ readonly background?: boolean;
68
+ /** 标准输入;界面按长度截断显示 */
69
+ readonly stdin?: string;
70
+ /** 请求的超时毫秒 */
71
+ readonly timeoutMs?: number;
72
+ }
73
+ /** Agent 用 ask 工具向用户提问;界面回答后 Agent 继续 */
74
+ export interface HostAgentAskRequest {
75
+ readonly askId: string;
76
+ readonly question: string;
77
+ /** 候选答案;用户可以选,也可以自由输入 */
78
+ readonly options?: readonly string[];
79
+ }
80
+ /** 一次工具调用的生命周期事件;界面用来显示“正在调用什么工具” */
81
+ export interface HostAgentToolEvent {
82
+ readonly id: string;
83
+ readonly name: string;
84
+ readonly phase: "start" | "end";
85
+ /** start 时为模型的原始参数 JSON */
86
+ readonly arguments?: string;
87
+ /** end 时是否执行成功 */
88
+ readonly ok?: boolean;
89
+ /** end 时的工具输出(过长时截断) */
90
+ readonly result?: string;
91
+ /** result 是否被截断 */
92
+ readonly truncated?: boolean;
93
+ }
94
+ export type HostAgentStreamEvent =
95
+ /** 会话已创建/打开:客户端可先保存 sessionId,刷新后仍能续上同一会话 */
96
+ {
97
+ readonly type: "session";
98
+ readonly sessionId: string;
99
+ readonly turn?: number;
100
+ } | {
101
+ readonly type: "delta";
102
+ readonly text: string;
103
+ }
104
+ /** 模型思考内容增量(reasoning_content) */
105
+ | {
106
+ readonly type: "reasoning";
107
+ readonly text: string;
108
+ }
109
+ /** 工具调用开始/结束 */
110
+ | ({
111
+ readonly type: "tool";
112
+ } & HostAgentToolEvent)
113
+ /** Agent 提问,等待用户回答 */
114
+ | {
115
+ readonly type: "ask";
116
+ readonly request: HostAgentAskRequest;
117
+ }
118
+ /** 开始执行第 step 步;用于界面显示进度 */
119
+ | {
120
+ readonly type: "step";
121
+ readonly turn: number;
122
+ readonly step: number;
123
+ }
124
+ /** 工具请求提升权限,等待用户批准 */
125
+ | {
126
+ readonly type: "approval";
127
+ readonly request: HostAgentApprovalRequest;
128
+ };
129
+ export interface HostAgentApi {
130
+ chat(input: HostAgentChatInput): Promise<HostAgentChatResult>;
131
+ /** 流式执行;delta 通过回调推送,Promise 在完成时返回最终结果 */
132
+ stream(input: HostAgentChatInput, onEvent: (event: HostAgentStreamEvent) => void): Promise<HostAgentChatResult>;
133
+ /** 校验工作目录:必须是已存在的目录;返回规范化路径与目录名 */
134
+ validateWorkspace(path: string): Promise<HostWorkspaceCheck>;
135
+ /** 打开宿主系统的原生文件夹选择对话框,返回选中的目录 */
136
+ pickDirectory(): Promise<HostWorkspaceCheck>;
137
+ /**
138
+ * 在工作区里搜索文件与目录
139
+ *
140
+ * 空 query 列根目录一层;query 以 / 结尾且目录存在时列该目录一层
141
+ * 单关键字按文件名优先排序,其次路径段、路径包含、子序列
142
+ * 多段查询(a/b/c)按路径段链式匹配,前缀目录不必存在
143
+ * 跳过依赖/构建目录与符号链接;受扫描条目、深度与时间上限约束
144
+ */
145
+ searchWorkspaceFiles(root: string, query: string): Promise<HostWorkspaceFilesResult>;
146
+ /**
147
+ * 向正在运行的会话插话
148
+ *
149
+ * 消息进入该会话的待注入队列,在 Agent 下一次模型调用前作为用户消息插入同一轮
150
+ * 会话不在运行中(尚未开始或已结束)返回 false,调用方按下一轮处理
151
+ */
152
+ interject(sessionId: string, message: string): Promise<boolean>;
153
+ /**
154
+ * 停止正在运行的一轮
155
+ *
156
+ * 已发出的模型调用不会被切断:循环在当前步结束后收尾,
157
+ * 后续步骤、工具执行都不再发起。等待中的提问与提权请求按“跳过 / 拒绝”了结。
158
+ * 会话不在运行中返回 false
159
+ */
160
+ stop(sessionId: string): Promise<boolean>;
161
+ /** 回复提权请求;返回是否命中待处理的请求 */
162
+ respondApproval(approvalId: string, approved: boolean): Promise<boolean>;
163
+ /** 回答 Agent 的提问;返回是否命中待处理的提问 */
164
+ respondAsk(askId: string, answer: string): Promise<boolean>;
165
+ }
@@ -0,0 +1,5 @@
1
+ /*
2
+ * 宿主 Agent 能力:让 sandbox 插件与 Agent 会话交互。
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/api/host/agent.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,2 @@
1
+ export { EventEntity, EventBus, eventBus } from "../../event/event.js";
2
+ export type { EventListener } from "../../event/event.js";
@@ -0,0 +1,6 @@
1
+ /*
2
+ * 宿主事件总线。
3
+ * 插件可以通过 `import { event } from "wellspring/api/host/index.ts"` 订阅/发布事件。
4
+ */
5
+ export { EventEntity, EventBus, eventBus } from "../../event/event.js";
6
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/api/host/events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,36 @@
1
+ export interface HostExecRunOptions {
2
+ /** 交给 shell 解释的命令行 */
3
+ readonly command: string;
4
+ /** 工作目录,必须落在允许的执行根内 */
5
+ readonly cwd: string;
6
+ /** 追加的环境变量 */
7
+ readonly env?: Record<string, string>;
8
+ /** 超时毫秒,到点终止整个进程组 */
9
+ readonly timeoutMs?: number;
10
+ }
11
+ export interface HostExecSession {
12
+ readonly sessionId: string;
13
+ readonly pid: number | null;
14
+ readonly cwd: string;
15
+ }
16
+ export interface HostExecChunk {
17
+ /** 自上次 poll 之后新增的输出 */
18
+ readonly chunk: string;
19
+ /** 进程是否已结束 */
20
+ readonly done: boolean;
21
+ /** 退出码;被信号终止时为 null */
22
+ readonly exitCode: number | null;
23
+ /** 因超时被终止 */
24
+ readonly timedOut: boolean;
25
+ /** 输出被上限截断 */
26
+ readonly truncated: boolean;
27
+ }
28
+ export interface HostExecApi {
29
+ run(options: HostExecRunOptions): Promise<HostExecSession>;
30
+ poll(sessionId: string): Promise<HostExecChunk>;
31
+ stop(sessionId: string): Promise<void>;
32
+ }
33
+ /** 单条会话的输出上限,超出即截断并终止 */
34
+ export declare const HOST_EXEC_MAX_OUTPUT_BYTES: number;
35
+ /** 未显式指定时的超时上限 */
36
+ export declare const HOST_EXEC_DEFAULT_TIMEOUT_MS = 120000;
@@ -0,0 +1,10 @@
1
+ /*
2
+ * 宿主进程执行 API。
3
+ * 插件被 access-guard 禁止直接 import node:child_process,需要跑命令时走这里。
4
+ * 执行与输出缓冲都在宿主侧,插件用 poll 拉增量,不为终端单独引入流式 RPC。
5
+ */
6
+ /** 单条会话的输出上限,超出即截断并终止 */
7
+ export const HOST_EXEC_MAX_OUTPUT_BYTES = 2 * 1024 * 1024;
8
+ /** 未显式指定时的超时上限 */
9
+ export const HOST_EXEC_DEFAULT_TIMEOUT_MS = 120_000;
10
+ //# sourceMappingURL=exec.js.map