@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,12 @@
1
+ /*
2
+ * 平台层入口。
3
+ * 平台识别、目录解析与文件落盘;上层不直接读取 process.platform 或拼接系统目录。
4
+ */
5
+ export * from "./clipboard.js";
6
+ export * from "./exec.js";
7
+ export * from "./file.js";
8
+ export * from "./notification.js";
9
+ export * from "./open-external.js";
10
+ export * from "./os.js";
11
+ export * from "./path.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { type PlatformName } from "./os.js";
2
+ export interface NotifyOptions {
3
+ readonly title: string;
4
+ readonly body?: string;
5
+ }
6
+ export interface NotifyCommand {
7
+ readonly command: string;
8
+ readonly args: readonly string[];
9
+ readonly env?: Readonly<Record<string, string>>;
10
+ }
11
+ /** 生成候选命令,按优先级排列。单独导出以便在任意平台测试 */
12
+ export declare function buildNotifyCommands(options: NotifyOptions, targetPlatform?: PlatformName, inWsl?: boolean): NotifyCommand[];
13
+ /** 发送系统通知。全部候选失败时抛出聚合错误 */
14
+ export declare function notify(options: NotifyOptions): Promise<void>;
@@ -0,0 +1,82 @@
1
+ /*
2
+ * 系统通知。
3
+ * Windows 走 PowerShell 的 WinRT toast,脚本内容经 -EncodedCommand 传递;
4
+ * WSL 下优先调用 powershell.exe,其余平台使用各自的通知命令。
5
+ */
6
+ import { describeError, powershellArgs, runCommand } from "./exec.js";
7
+ import { isWsl, platform } from "./os.js";
8
+ const MACOS_SCRIPT = 'display notification (system attribute "WELLSPRING_NOTIFY_BODY") with title (system attribute "WELLSPRING_NOTIFY_TITLE")';
9
+ /** PowerShell 单引号字符串,内部单引号翻倍 */
10
+ function psQuote(value) {
11
+ return `'${value.replace(/'/g, "''")}'`;
12
+ }
13
+ function powershellToast(title, body) {
14
+ const script = [
15
+ "$ErrorActionPreference = 'Stop'",
16
+ "[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null",
17
+ "$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)",
18
+ '$texts = $template.GetElementsByTagName("text")',
19
+ `$texts.Item(0).AppendChild($template.CreateTextNode(${psQuote(title)})) > $null`,
20
+ `$texts.Item(1).AppendChild($template.CreateTextNode(${psQuote(body)})) > $null`,
21
+ "$toast = [Windows.UI.Notifications.ToastNotification]::new($template)",
22
+ '[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("Wellspring").Show($toast)',
23
+ ].join("\n");
24
+ return powershellArgs(script);
25
+ }
26
+ function normalize(options) {
27
+ const title = options.title.trim();
28
+ if (title === "") {
29
+ throw new Error("通知标题为空");
30
+ }
31
+ return { title, body: options.body ?? "" };
32
+ }
33
+ /** 生成候选命令,按优先级排列。单独导出以便在任意平台测试 */
34
+ export function buildNotifyCommands(options, targetPlatform = platform, inWsl = isWsl) {
35
+ const { title, body } = normalize(options);
36
+ if (targetPlatform === "windows") {
37
+ return [{ command: "powershell", args: powershellToast(title, body) }];
38
+ }
39
+ if (targetPlatform === "macos") {
40
+ return [
41
+ {
42
+ command: "osascript",
43
+ args: ["-e", MACOS_SCRIPT],
44
+ env: { WELLSPRING_NOTIFY_TITLE: title, WELLSPRING_NOTIFY_BODY: body },
45
+ },
46
+ ];
47
+ }
48
+ if (targetPlatform === "android") {
49
+ const args = ["--title", title];
50
+ if (body !== "") {
51
+ args.push("--content", body);
52
+ }
53
+ return [{ command: "termux-notification", args }];
54
+ }
55
+ const candidates = [];
56
+ if (inWsl) {
57
+ // WSL 没有桌面通知守护进程,转到 Windows 侧显示
58
+ candidates.push({ command: "powershell.exe", args: powershellToast(title, body) });
59
+ }
60
+ const args = ["-a", "wellspring", "--", title];
61
+ if (body !== "") {
62
+ args.push(body);
63
+ }
64
+ candidates.push({ command: "notify-send", args });
65
+ return candidates;
66
+ }
67
+ /** 发送系统通知。全部候选失败时抛出聚合错误 */
68
+ export async function notify(options) {
69
+ const failures = [];
70
+ for (const candidate of buildNotifyCommands(options)) {
71
+ try {
72
+ const env = candidate.env === undefined ? undefined : { ...process.env, ...candidate.env };
73
+ await runCommand(candidate.command, candidate.args, { env });
74
+ return;
75
+ }
76
+ catch (error) {
77
+ failures.push(`${candidate.command}: ${describeError(error)}`);
78
+ }
79
+ }
80
+ throw new Error(`通知发送失败:${failures.join(";")}`);
81
+ }
82
+ //# sourceMappingURL=notification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/platform/notification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type PlatformName } from "./os.js";
2
+ /** 候选启动命令 */
3
+ export interface OpenCommand {
4
+ readonly command: string;
5
+ readonly args: readonly string[];
6
+ }
7
+ /** 生成候选命令,按优先级排列。单独导出以便在任意平台测试各系统的构造结果 */
8
+ export declare function buildOpenCommands(rawTarget: string, targetPlatform?: PlatformName, inWsl?: boolean, inTermux?: boolean): OpenCommand[];
9
+ /** 依次尝试候选命令,全部失败时抛出聚合错误 */
10
+ export declare function openExternal(rawTarget: string): Promise<void>;
@@ -0,0 +1,105 @@
1
+ /*
2
+ * 用系统默认程序打开 URL 或本地路径。
3
+ * target 可能来自外部输入,须校验:以 "-" 开头会被 open / cmd start 视为参数,协议限定白名单。
4
+ */
5
+ import { spawn } from "node:child_process";
6
+ import { isAbsolute } from "node:path";
7
+ import { describeError } from "./exec.js";
8
+ import { isTermux, isWsl, platform } from "./os.js";
9
+ /** 允许的协议 */
10
+ const ALLOWED_PROTOCOLS = new Set(["http:", "https:", "file:"]);
11
+ /** 绝对路径原样返回;其余须为白名单协议 URL。不合法时抛出异常 */
12
+ function normalizeTarget(input) {
13
+ const target = input.trim();
14
+ if (target === "") {
15
+ throw new Error("打开目标为空值");
16
+ }
17
+ // 控制字符(含换行)会破坏命令行语义
18
+ if (/[\u0000-\u001f\u007f]/.test(target)) {
19
+ throw new Error("打开目标包含控制字符");
20
+ }
21
+ if (target.startsWith("-")) {
22
+ throw new Error(`打开目标不能以 "-" 开头:${target}`);
23
+ }
24
+ // 本地路径;Windows 的 "C:\\..." 亦归此类
25
+ if (isAbsolute(target)) {
26
+ return { target, isUrl: false };
27
+ }
28
+ let parsed;
29
+ try {
30
+ parsed = new URL(target);
31
+ }
32
+ catch {
33
+ throw new Error(`目标既非绝对路径也非合法 URL:${target}`);
34
+ }
35
+ if (!ALLOWED_PROTOCOLS.has(parsed.protocol)) {
36
+ throw new Error(`不允许的协议:${parsed.protocol}`);
37
+ }
38
+ return { target: parsed.href, isUrl: true };
39
+ }
40
+ /** 生成候选命令,按优先级排列。单独导出以便在任意平台测试各系统的构造结果 */
41
+ export function buildOpenCommands(rawTarget, targetPlatform = platform, inWsl = isWsl, inTermux = isTermux) {
42
+ const { target, isUrl } = normalizeTarget(rawTarget);
43
+ if (targetPlatform === "windows") {
44
+ // 第二个参数为 start 的窗口标题占位;缺失时带引号的路径会被当作标题
45
+ return [{ command: "cmd", args: ["/c", "start", "", target] }];
46
+ }
47
+ if (targetPlatform === "macos") {
48
+ return [{ command: "open", args: [target] }];
49
+ }
50
+ if (targetPlatform === "android") {
51
+ const candidates = [];
52
+ if (inTermux) {
53
+ candidates.push({ command: "termux-open", args: [target] });
54
+ }
55
+ candidates.push({ command: "xdg-open", args: [target] });
56
+ // am 只能打开 URI,本地路径没有对应的 content:// 地址
57
+ if (isUrl) {
58
+ candidates.push({
59
+ command: "am",
60
+ args: ["start", "-a", "android.intent.action.VIEW", "-d", target],
61
+ });
62
+ }
63
+ return candidates;
64
+ }
65
+ const candidates = [];
66
+ if (inWsl) {
67
+ // WSL 下 xdg-open 常无效,优先 wslview(wslu),其次 explorer.exe
68
+ candidates.push({ command: "wslview", args: [target] });
69
+ candidates.push({ command: "explorer.exe", args: [target] });
70
+ }
71
+ candidates.push({ command: "xdg-open", args: [target] });
72
+ candidates.push({ command: "gio", args: ["open", target] });
73
+ return candidates;
74
+ }
75
+ function spawnDetached(command, args) {
76
+ return new Promise((resolve, reject) => {
77
+ const child = spawn(command, [...args], {
78
+ detached: true,
79
+ stdio: "ignore",
80
+ windowsHide: true,
81
+ });
82
+ child.once("error", reject);
83
+ child.once("spawn", () => {
84
+ // 不等待退出:浏览器与文件管理器均为长驻进程
85
+ child.unref();
86
+ resolve();
87
+ });
88
+ });
89
+ }
90
+ /** 依次尝试候选命令,全部失败时抛出聚合错误 */
91
+ export async function openExternal(rawTarget) {
92
+ const { target } = normalizeTarget(rawTarget);
93
+ const failures = [];
94
+ for (const candidate of buildOpenCommands(target)) {
95
+ try {
96
+ await spawnDetached(candidate.command, candidate.args);
97
+ return;
98
+ }
99
+ catch (error) {
100
+ failures.push(`${candidate.command}: ${describeError(error)}`);
101
+ }
102
+ }
103
+ throw new Error(`无法打开 ${target}:已尝试 ${failures.join(";")}`);
104
+ }
105
+ //# sourceMappingURL=open-external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-external.js","sourceRoot":"","sources":["../../src/platform/open-external.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /** 业务侧平台名,不使用 Node 的 win32 / darwin / linux 原始值 */
2
+ export type PlatformName = "windows" | "macos" | "linux" | "android";
3
+ /** 平台归一化。参数可注入,供测试覆盖各平台 */
4
+ export declare function detectPlatform(nodePlatform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): PlatformName;
5
+ export declare const platform: PlatformName;
6
+ export declare const isWindows: boolean;
7
+ export declare const isMacOS: boolean;
8
+ export declare const isLinux: boolean;
9
+ export declare const isAndroid: boolean;
10
+ /** POSIX 权限与路径语义可用的平台,含 Android */
11
+ export declare const isPosix: boolean;
12
+ export declare const isWsl: boolean;
13
+ /** Android 上的 Termux 用户态 */
14
+ export declare const isTermux: boolean;
15
+ /** 读取环境变量,空串按未设置处理。Windows 下变量名大小写不敏感 */
16
+ export declare function readEnv(name: string, env?: NodeJS.ProcessEnv): string | undefined;
17
+ /** HOME 优先,其次 USERPROFILE 与系统用户目录;Android 沙箱可能三者皆无 */
18
+ export declare function homeDir(env?: NodeJS.ProcessEnv): string;
19
+ /** Windows 可执行文件带 .exe 后缀 */
20
+ export declare function executableName(name: string): string;
@@ -0,0 +1,86 @@
1
+ /*
2
+ * 平台识别。
3
+ * 本模块是唯一读取 process.platform 的位置。
4
+ */
5
+ import { homedir } from "node:os";
6
+ /** Termux 等 Android 用户态 Node 报告 linux,用 Android 环境变量识别 */
7
+ function isAndroidEnv(env) {
8
+ const has = (name) => {
9
+ const value = env[name];
10
+ return value !== undefined && value.trim() !== "";
11
+ };
12
+ return has("ANDROID_ROOT") || has("ANDROID_DATA") || has("TERMUX_VERSION");
13
+ }
14
+ /** 平台归一化。参数可注入,供测试覆盖各平台 */
15
+ export function detectPlatform(nodePlatform = process.platform, env = process.env) {
16
+ switch (nodePlatform) {
17
+ case "win32":
18
+ return "windows";
19
+ case "darwin":
20
+ return "macos";
21
+ case "android":
22
+ return "android";
23
+ default:
24
+ return isAndroidEnv(env) ? "android" : "linux";
25
+ }
26
+ }
27
+ export const platform = detectPlatform();
28
+ export const isWindows = platform === "windows";
29
+ export const isMacOS = platform === "macos";
30
+ export const isLinux = platform === "linux";
31
+ export const isAndroid = platform === "android";
32
+ /** POSIX 权限与路径语义可用的平台,含 Android */
33
+ export const isPosix = platform !== "windows";
34
+ function detectWsl() {
35
+ if (platform !== "linux") {
36
+ return false;
37
+ }
38
+ // WSL 会注入 WSL_DISTRO_NAME / WSL_INTEROP,该环境下调用外部程序的行为与原生 Linux 不同
39
+ return process.env["WSL_DISTRO_NAME"] !== undefined || process.env["WSL_INTEROP"] !== undefined;
40
+ }
41
+ export const isWsl = detectWsl();
42
+ /** Android 上的 Termux 用户态 */
43
+ export const isTermux = isAndroid &&
44
+ (readEnv("TERMUX_VERSION") !== undefined ||
45
+ (readEnv("PREFIX")?.includes("com.termux") ?? false));
46
+ /** 读取环境变量,空串按未设置处理。Windows 下变量名大小写不敏感 */
47
+ export function readEnv(name, env = process.env) {
48
+ const direct = env[name];
49
+ if (direct !== undefined) {
50
+ const value = direct.trim();
51
+ return value === "" ? undefined : value;
52
+ }
53
+ if (!isWindows) {
54
+ return undefined;
55
+ }
56
+ // Windows 环境变量名不区分大小写
57
+ const lower = name.toLowerCase();
58
+ const key = Object.keys(env).find((item) => item.toLowerCase() === lower);
59
+ const value = key === undefined ? undefined : env[key]?.trim();
60
+ return value === undefined || value === "" ? undefined : value;
61
+ }
62
+ /** HOME 优先,其次 USERPROFILE 与系统用户目录;Android 沙箱可能三者皆无 */
63
+ export function homeDir(env = process.env) {
64
+ const fromEnv = readEnv("HOME", env) ?? readEnv("USERPROFILE", env);
65
+ if (fromEnv !== undefined) {
66
+ return fromEnv;
67
+ }
68
+ try {
69
+ const home = homedir();
70
+ if (home !== "") {
71
+ return home;
72
+ }
73
+ }
74
+ catch {
75
+ // 无 passwd 条目时回落
76
+ }
77
+ return process.cwd();
78
+ }
79
+ /** Windows 可执行文件带 .exe 后缀 */
80
+ export function executableName(name) {
81
+ if (!isWindows || name.toLowerCase().endsWith(".exe")) {
82
+ return name;
83
+ }
84
+ return `${name}.exe`;
85
+ }
86
+ //# sourceMappingURL=os.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os.js","sourceRoot":"","sources":["../../src/platform/os.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type PlatformName } from "./os.js";
2
+ /** 各平台统一使用的目录名 */
3
+ export declare const APP_DIR_NAME = "wellspring";
4
+ /** 四个根目录 */
5
+ export interface PathRoots {
6
+ readonly configDir: string;
7
+ readonly dataDir: string;
8
+ readonly cacheDir: string;
9
+ readonly logDir: string;
10
+ }
11
+ /** 显式覆盖,通常来自 CLI 参数。相对路径按当前工作目录解析 */
12
+ export interface PathOverrides {
13
+ readonly configDir?: string;
14
+ readonly dataDir?: string;
15
+ readonly cacheDir?: string;
16
+ readonly logDir?: string;
17
+ }
18
+ /** 取值来源,用于诊断 */
19
+ export type PathSource = "override" | "env" | "portable-home" | "os-default";
20
+ export interface ResolvedPaths extends PathRoots {
21
+ readonly sources: Readonly<Record<keyof PathRoots, PathSource>>;
22
+ }
23
+ /** 平台默认根目录。参数可注入,供测试覆盖各平台 */
24
+ export declare function defaultRoots(platformName: PlatformName, env: NodeJS.ProcessEnv, home: string): PathRoots;
25
+ /** 解析并缓存。重复调用会按最新参数与环境变量重新解析 */
26
+ export declare function initPaths(overrides?: PathOverrides, env?: NodeJS.ProcessEnv): ResolvedPaths;
27
+ /** 取缓存结果,未解析时先解析一次 */
28
+ export declare function getPaths(): ResolvedPaths;
29
+ /** 清空缓存,供测试使用。下次 getPaths 重新读取环境变量 */
30
+ export declare function resetPaths(): void;
31
+ /** 打印四个根目录及其来源,用于诊断 */
32
+ export declare function describePaths(roots?: ResolvedPaths): string;
@@ -0,0 +1,154 @@
1
+ /*
2
+ * 目录解析。
3
+ * 根目录:config(配置与凭据)、data(持久数据)、cache(可再生成)、log(日志)。
4
+ * 优先级:initPaths 显式覆盖 > WELLSPRING_*_DIR > WELLSPRING_HOME 便携模式 > 平台默认。
5
+ * 仅解析路径,不创建目录;创建见 file.ts 的 ensureDirs。
6
+ */
7
+ import { isAbsolute, join, normalize } from "node:path";
8
+ import { homeDir, platform, readEnv } from "./os.js";
9
+ /** 各平台统一使用的目录名 */
10
+ export const APP_DIR_NAME = "wellspring";
11
+ const ROOT_KEYS = ["configDir", "dataDir", "cacheDir", "logDir"];
12
+ const ENV_NAMES = {
13
+ configDir: "WELLSPRING_CONFIG_DIR",
14
+ dataDir: "WELLSPRING_DATA_DIR",
15
+ cacheDir: "WELLSPRING_CACHE_DIR",
16
+ logDir: "WELLSPRING_LOG_DIR",
17
+ };
18
+ const ROOT_LABELS = {
19
+ configDir: "config",
20
+ dataDir: "data",
21
+ cacheDir: "cache",
22
+ logDir: "log",
23
+ };
24
+ /** 是否 Termux 用户态:目录沿用 XDG,HOME 可用 */
25
+ function isTermuxEnv(env) {
26
+ return (readEnv("TERMUX_VERSION", env) !== undefined ||
27
+ (readEnv("PREFIX", env)?.includes("com.termux") ?? false));
28
+ }
29
+ function xdgRoots(env, home) {
30
+ return {
31
+ configDir: join(readEnv("XDG_CONFIG_HOME", env) ?? join(home, ".config"), APP_DIR_NAME),
32
+ dataDir: join(readEnv("XDG_DATA_HOME", env) ?? join(home, ".local", "share"), APP_DIR_NAME),
33
+ cacheDir: join(readEnv("XDG_CACHE_HOME", env) ?? join(home, ".cache"), APP_DIR_NAME),
34
+ logDir: join(readEnv("XDG_STATE_HOME", env) ?? join(home, ".local", "state"), APP_DIR_NAME, "logs"),
35
+ };
36
+ }
37
+ /*
38
+ * Android 应用沙箱:HOME 通常指向应用私有 files 目录。
39
+ * 未设置 HOME 时依赖 WELLSPRING_HOME;两者皆无则使用系统用户目录。
40
+ */
41
+ function androidAppRoots(env, home) {
42
+ const base = readEnv("HOME", env) ?? home;
43
+ return {
44
+ configDir: join(base, "config"),
45
+ dataDir: join(base, "data"),
46
+ cacheDir: join(base, "cache"),
47
+ logDir: join(base, "logs"),
48
+ };
49
+ }
50
+ /** 平台默认根目录。参数可注入,供测试覆盖各平台 */
51
+ export function defaultRoots(platformName, env, home) {
52
+ switch (platformName) {
53
+ case "windows": {
54
+ const roaming = readEnv("APPDATA", env) ?? join(home, "AppData", "Roaming");
55
+ const local = readEnv("LOCALAPPDATA", env) ?? join(home, "AppData", "Local");
56
+ return {
57
+ configDir: join(roaming, APP_DIR_NAME),
58
+ dataDir: join(local, APP_DIR_NAME),
59
+ // Windows 无独立缓存目录约定,缓存与日志置于 data 下
60
+ cacheDir: join(local, APP_DIR_NAME, "cache"),
61
+ logDir: join(local, APP_DIR_NAME, "logs"),
62
+ };
63
+ }
64
+ case "macos": {
65
+ // macOS 惯例:配置与数据同放 Application Support,缓存与日志各自独立
66
+ const support = join(home, "Library", "Application Support", APP_DIR_NAME);
67
+ return {
68
+ configDir: support,
69
+ dataDir: support,
70
+ cacheDir: join(home, "Library", "Caches", APP_DIR_NAME),
71
+ logDir: join(home, "Library", "Logs", APP_DIR_NAME),
72
+ };
73
+ }
74
+ case "android":
75
+ return isTermuxEnv(env) ? xdgRoots(env, home) : androidAppRoots(env, home);
76
+ default:
77
+ return xdgRoots(env, home);
78
+ }
79
+ }
80
+ /** 便携模式:所有数据落在同一个根下 */
81
+ function portableRoots(home) {
82
+ return {
83
+ configDir: join(home, "config"),
84
+ dataDir: join(home, "data"),
85
+ cacheDir: join(home, "cache"),
86
+ logDir: join(home, "logs"),
87
+ };
88
+ }
89
+ function expandTilde(input, env) {
90
+ if (input === "~") {
91
+ return homeDir(env);
92
+ }
93
+ if (input.startsWith("~/") || input.startsWith("~\\")) {
94
+ return join(homeDir(env), input.slice(2));
95
+ }
96
+ return input;
97
+ }
98
+ function toAbsolute(input, env) {
99
+ const expanded = expandTilde(input, env);
100
+ return normalize(isAbsolute(expanded) ? expanded : join(process.cwd(), expanded));
101
+ }
102
+ let cached = null;
103
+ /** 解析并缓存。重复调用会按最新参数与环境变量重新解析 */
104
+ export function initPaths(overrides = {}, env = process.env) {
105
+ const home = homeDir(env);
106
+ const portableHome = readEnv("WELLSPRING_HOME", env);
107
+ const defaults = portableHome === undefined
108
+ ? defaultRoots(platform, env, home)
109
+ : portableRoots(toAbsolute(portableHome, env));
110
+ const baseSource = portableHome === undefined ? "os-default" : "portable-home";
111
+ const roots = {
112
+ configDir: "",
113
+ dataDir: "",
114
+ cacheDir: "",
115
+ logDir: "",
116
+ };
117
+ const sources = {
118
+ configDir: baseSource,
119
+ dataDir: baseSource,
120
+ cacheDir: baseSource,
121
+ logDir: baseSource,
122
+ };
123
+ for (const key of ROOT_KEYS) {
124
+ const override = overrides[key];
125
+ if (override !== undefined && override.trim() !== "") {
126
+ roots[key] = toAbsolute(override, env);
127
+ sources[key] = "override";
128
+ continue;
129
+ }
130
+ const fromEnv = readEnv(ENV_NAMES[key], env);
131
+ if (fromEnv !== undefined) {
132
+ roots[key] = toAbsolute(fromEnv, env);
133
+ sources[key] = "env";
134
+ continue;
135
+ }
136
+ roots[key] = defaults[key];
137
+ }
138
+ const resolved = { ...roots, sources };
139
+ cached = resolved;
140
+ return resolved;
141
+ }
142
+ /** 取缓存结果,未解析时先解析一次 */
143
+ export function getPaths() {
144
+ return cached ?? initPaths();
145
+ }
146
+ /** 清空缓存,供测试使用。下次 getPaths 重新读取环境变量 */
147
+ export function resetPaths() {
148
+ cached = null;
149
+ }
150
+ /** 打印四个根目录及其来源,用于诊断 */
151
+ export function describePaths(roots = getPaths()) {
152
+ return ROOT_KEYS.map((key) => `${ROOT_LABELS[key].padEnd(7)} ${roots[key]} (${roots.sources[key]})`).join("\n");
153
+ }
154
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/platform/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function ensureAccessGuard(): void;
@@ -0,0 +1,40 @@
1
+ /*
2
+ * 插件访问守卫:插件加载/执行期间禁止直接 import 文件、进程等模块,
3
+ * 统一走宿主 API(api.fs / ctx.fs、api.logger 等)。
4
+ * 这是软隔离,无法阻止 plugin 通过 process.getBuiltinModule 等宿主逃逸。
5
+ */
6
+ import { registerHooks } from "node:module";
7
+ import { getHookOwner } from "../api/host/hooks.js";
8
+ const BLOCKED = new Set([
9
+ "fs",
10
+ "node:fs",
11
+ "fs/promises",
12
+ "node:fs/promises",
13
+ "child_process",
14
+ "node:child_process",
15
+ "worker_threads",
16
+ "node:worker_threads",
17
+ "vm",
18
+ "node:vm",
19
+ "module",
20
+ "node:module",
21
+ "inspector",
22
+ "node:inspector",
23
+ ]);
24
+ let installed = false;
25
+ export function ensureAccessGuard() {
26
+ if (installed) {
27
+ return;
28
+ }
29
+ installed = true;
30
+ registerHooks({
31
+ resolve(specifier, context, nextResolve) {
32
+ const owner = getHookOwner();
33
+ if (owner !== null && BLOCKED.has(specifier)) {
34
+ throw new Error(`插件 ${owner} 禁止直接访问 ${specifier},请使用 api.fs / ctx.fs 等宿主 API`);
35
+ }
36
+ return nextResolve(specifier, context);
37
+ },
38
+ });
39
+ }
40
+ //# sourceMappingURL=access-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-guard.js","sourceRoot":"","sources":["../../src/plugin/access-guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;IACpB,IAAI;IACJ,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,IAAI;IACJ,SAAS;IACT,QAAQ;IACR,aAAa;IACb,WAAW;IACX,gBAAgB;CACnB,CAAC,CAAA;AAEF,IAAI,SAAS,GAAG,KAAK,CAAA;AAErB,MAAM,UAAU,iBAAiB;IAC7B,IAAI,SAAS,EAAE,CAAC;QACZ,OAAM;IACV,CAAC;IACD,SAAS,GAAG,IAAI,CAAA;IAChB,aAAa,CAAC;QACV,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW;YACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CACX,MAAM,KAAK,WAAW,SAAS,8BAA8B,CAChE,CAAA;YACL,CAAC;YACD,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC1C,CAAC;KACJ,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { HostAgentApi, HostAgentChatInput, HostAgentChatResult, HostWorkspaceFilesResult } from "../api/host/agent.js";
2
+ import type { AppSetting } from "../config/types.js";
3
+ import type { Logger } from "pino";
4
+ import type { ResolvedPaths } from "../platform/path.js";
5
+ import type { AgentToolRegistry } from "./agent-tools.js";
6
+ import type { PluginRegistry } from "./registry.js";
7
+ export interface HostAgentServiceOptions {
8
+ readonly settings: AppSetting;
9
+ readonly paths: ResolvedPaths;
10
+ readonly logger: Logger;
11
+ readonly registry: PluginRegistry;
12
+ readonly agentTools: AgentToolRegistry;
13
+ readonly cwd?: string;
14
+ }
15
+ export interface HostAgentService extends HostAgentApi {
16
+ chat(input: HostAgentChatInput): Promise<HostAgentChatResult>;
17
+ }
18
+ /**
19
+ * 在工作区里按文件名 / 路径搜索(广度优先,浅层条目优先进入扫描预算)。
20
+ * - query 为空或以 `/` 结尾且路径存在:只列该目录一层
21
+ * - 单关键字(`app`):文件名优先,其次路径段 / 路径包含 / 子序列
22
+ * - 带斜杠(`assets/app`):按路径段链式匹配,不要求前缀目录真实存在
23
+ */
24
+ export declare function searchWorkspaceFiles(rootPath: string, query: string): Promise<HostWorkspaceFilesResult>;
25
+ export declare function createHostAgentService(options: HostAgentServiceOptions): HostAgentService;