@orion-agents/orion-code 0.1.2 → 0.1.4-2

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 (552) hide show
  1. package/README.md +98 -4
  2. package/README.zh-CN.md +116 -5
  3. package/dist/agents/coder.d.ts.map +1 -1
  4. package/dist/agents/coder.js.map +1 -1
  5. package/dist/agents/fork.d.ts +12 -4
  6. package/dist/agents/fork.d.ts.map +1 -1
  7. package/dist/agents/fork.js +28 -32
  8. package/dist/agents/fork.js.map +1 -1
  9. package/dist/agents/leader.d.ts.map +1 -1
  10. package/dist/agents/leader.js.map +1 -1
  11. package/dist/agents/worker-pool.d.ts.map +1 -1
  12. package/dist/agents/worker-pool.js +38 -29
  13. package/dist/agents/worker-pool.js.map +1 -1
  14. package/dist/cli.d.ts +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +0 -1
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/context-commands.d.ts +4 -0
  19. package/dist/commands/context-commands.d.ts.map +1 -0
  20. package/dist/commands/context-commands.js +52 -0
  21. package/dist/commands/context-commands.js.map +1 -0
  22. package/dist/commands/context-tool-command-handlers.d.ts +13 -0
  23. package/dist/commands/context-tool-command-handlers.d.ts.map +1 -0
  24. package/dist/commands/context-tool-command-handlers.js +573 -0
  25. package/dist/commands/context-tool-command-handlers.js.map +1 -0
  26. package/dist/commands/core-command-handlers.d.ts +12 -0
  27. package/dist/commands/core-command-handlers.d.ts.map +1 -0
  28. package/dist/commands/core-command-handlers.js +798 -0
  29. package/dist/commands/core-command-handlers.js.map +1 -0
  30. package/dist/commands/diagnostic-command-handlers.d.ts +14 -0
  31. package/dist/commands/diagnostic-command-handlers.d.ts.map +1 -0
  32. package/dist/commands/diagnostic-command-handlers.js +1043 -0
  33. package/dist/commands/diagnostic-command-handlers.js.map +1 -0
  34. package/dist/commands/diagnostic-commands.d.ts +4 -0
  35. package/dist/commands/diagnostic-commands.d.ts.map +1 -0
  36. package/dist/commands/diagnostic-commands.js +132 -0
  37. package/dist/commands/diagnostic-commands.js.map +1 -0
  38. package/dist/commands/index.d.ts +7 -8
  39. package/dist/commands/index.d.ts.map +1 -1
  40. package/dist/commands/index.js +34 -3448
  41. package/dist/commands/index.js.map +1 -1
  42. package/dist/commands/legacy-commands.d.ts +4 -0
  43. package/dist/commands/legacy-commands.d.ts.map +1 -0
  44. package/dist/commands/legacy-commands.js +44 -0
  45. package/dist/commands/legacy-commands.js.map +1 -0
  46. package/dist/commands/model-command-handlers.d.ts +13 -0
  47. package/dist/commands/model-command-handlers.d.ts.map +1 -0
  48. package/dist/commands/model-command-handlers.js +314 -0
  49. package/dist/commands/model-command-handlers.js.map +1 -0
  50. package/dist/commands/model-commands.d.ts +4 -0
  51. package/dist/commands/model-commands.d.ts.map +1 -0
  52. package/dist/commands/model-commands.js +52 -0
  53. package/dist/commands/model-commands.js.map +1 -0
  54. package/dist/commands/session-command-handlers.d.ts +9 -0
  55. package/dist/commands/session-command-handlers.d.ts.map +1 -0
  56. package/dist/commands/session-command-handlers.js +566 -0
  57. package/dist/commands/session-command-handlers.js.map +1 -0
  58. package/dist/commands/session-commands.d.ts +4 -0
  59. package/dist/commands/session-commands.d.ts.map +1 -0
  60. package/dist/commands/session-commands.js +78 -0
  61. package/dist/commands/session-commands.js.map +1 -0
  62. package/dist/commands/system-commands.d.ts +4 -0
  63. package/dist/commands/system-commands.d.ts.map +1 -0
  64. package/dist/commands/system-commands.js +92 -0
  65. package/dist/commands/system-commands.js.map +1 -0
  66. package/dist/commands/target-command.d.ts.map +1 -1
  67. package/dist/commands/target-command.js +29 -2
  68. package/dist/commands/target-command.js.map +1 -1
  69. package/dist/commands/tool-commands.d.ts +4 -0
  70. package/dist/commands/tool-commands.d.ts.map +1 -0
  71. package/dist/commands/tool-commands.js +49 -0
  72. package/dist/commands/tool-commands.js.map +1 -0
  73. package/dist/commands/types.d.ts +7 -5
  74. package/dist/commands/types.d.ts.map +1 -1
  75. package/dist/commands/types.js.map +1 -1
  76. package/dist/commands/workflow-command-handlers.d.ts +7 -0
  77. package/dist/commands/workflow-command-handlers.d.ts.map +1 -0
  78. package/dist/commands/workflow-command-handlers.js +35 -0
  79. package/dist/commands/workflow-command-handlers.js.map +1 -0
  80. package/dist/commands/workflow-commands.d.ts +4 -0
  81. package/dist/commands/workflow-commands.d.ts.map +1 -0
  82. package/dist/commands/workflow-commands.js +92 -0
  83. package/dist/commands/workflow-commands.js.map +1 -0
  84. package/dist/core/checkpoint.d.ts +12 -4
  85. package/dist/core/checkpoint.d.ts.map +1 -1
  86. package/dist/core/checkpoint.js +114 -28
  87. package/dist/core/checkpoint.js.map +1 -1
  88. package/dist/core/cost-tracker.d.ts +5 -1
  89. package/dist/core/cost-tracker.d.ts.map +1 -1
  90. package/dist/core/cost-tracker.js +12 -2
  91. package/dist/core/cost-tracker.js.map +1 -1
  92. package/dist/core/warn-dedup.d.ts +3 -0
  93. package/dist/core/warn-dedup.d.ts.map +1 -1
  94. package/dist/core/warn-dedup.js +6 -6
  95. package/dist/core/warn-dedup.js.map +1 -1
  96. package/dist/framework/index.d.ts +1 -1
  97. package/dist/framework/index.d.ts.map +1 -1
  98. package/dist/framework/index.js.map +1 -1
  99. package/dist/framework/prompt.d.ts +2 -2
  100. package/dist/framework/query.d.ts +5 -2
  101. package/dist/framework/query.d.ts.map +1 -1
  102. package/dist/framework/query.js +58 -10
  103. package/dist/framework/query.js.map +1 -1
  104. package/dist/framework/store.d.ts +4 -4
  105. package/dist/framework/tool-scheduler.d.ts +67 -4
  106. package/dist/framework/tool-scheduler.d.ts.map +1 -1
  107. package/dist/framework/tool-scheduler.js +271 -50
  108. package/dist/framework/tool-scheduler.js.map +1 -1
  109. package/dist/framework/tool.d.ts +36 -2
  110. package/dist/framework/tool.d.ts.map +1 -1
  111. package/dist/framework/tool.js +29 -1
  112. package/dist/framework/tool.js.map +1 -1
  113. package/dist/harness/assembler.d.ts.map +1 -1
  114. package/dist/harness/assembler.js +4 -2
  115. package/dist/harness/assembler.js.map +1 -1
  116. package/dist/harness/evidence.d.ts.map +1 -1
  117. package/dist/harness/evidence.js +3 -2
  118. package/dist/harness/evidence.js.map +1 -1
  119. package/dist/harness/safety.d.ts +11 -1
  120. package/dist/harness/safety.d.ts.map +1 -1
  121. package/dist/harness/safety.js +112 -16
  122. package/dist/harness/safety.js.map +1 -1
  123. package/dist/index.d.ts +1 -4
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js.map +1 -1
  126. package/dist/init.d.ts +4 -8
  127. package/dist/init.d.ts.map +1 -1
  128. package/dist/init.js +4 -4
  129. package/dist/init.js.map +1 -1
  130. package/dist/ink-ui/App.d.ts +2 -2
  131. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  132. package/dist/ink-ui/components/Markdown.js.map +1 -1
  133. package/dist/ink-ui/components/PixelHorseBanner.d.ts +2 -2
  134. package/dist/ink-ui/components/StatusLine.d.ts +2 -2
  135. package/dist/ink-ui/launch.d.ts +2 -2
  136. package/dist/ink-ui/screens/ReplScreen.d.ts +3 -2
  137. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  138. package/dist/ink-ui/screens/ReplScreen.js +65 -0
  139. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  140. package/dist/memory/embeddings.d.ts.map +1 -1
  141. package/dist/memory/embeddings.js +3 -2
  142. package/dist/memory/embeddings.js.map +1 -1
  143. package/dist/memory/relevant-finder.d.ts +2 -1
  144. package/dist/memory/relevant-finder.d.ts.map +1 -1
  145. package/dist/memory/relevant-finder.js +17 -8
  146. package/dist/memory/relevant-finder.js.map +1 -1
  147. package/dist/memory/semantic-config.d.ts +9 -0
  148. package/dist/memory/semantic-config.d.ts.map +1 -0
  149. package/dist/memory/semantic-config.js +16 -0
  150. package/dist/memory/semantic-config.js.map +1 -0
  151. package/dist/memory/semantic-search.d.ts +1 -6
  152. package/dist/memory/semantic-search.d.ts.map +1 -1
  153. package/dist/memory/semantic-search.js +5 -16
  154. package/dist/memory/semantic-search.js.map +1 -1
  155. package/dist/memory/storage.d.ts +23 -0
  156. package/dist/memory/storage.d.ts.map +1 -1
  157. package/dist/memory/storage.js +109 -8
  158. package/dist/memory/storage.js.map +1 -1
  159. package/dist/memory/vector-store.d.ts +12 -0
  160. package/dist/memory/vector-store.d.ts.map +1 -1
  161. package/dist/memory/vector-store.js +139 -18
  162. package/dist/memory/vector-store.js.map +1 -1
  163. package/dist/migration/command.d.ts.map +1 -1
  164. package/dist/migration/command.js +0 -1
  165. package/dist/migration/command.js.map +1 -1
  166. package/dist/migration/migrate.d.ts.map +1 -1
  167. package/dist/migration/migrate.js +43 -109
  168. package/dist/migration/migrate.js.map +1 -1
  169. package/dist/migration/types.d.ts +0 -1
  170. package/dist/migration/types.d.ts.map +1 -1
  171. package/dist/print-ui/launch.d.ts +11 -3
  172. package/dist/print-ui/launch.d.ts.map +1 -1
  173. package/dist/print-ui/launch.js +25 -0
  174. package/dist/print-ui/launch.js.map +1 -1
  175. package/dist/product/environment.d.ts +3 -5
  176. package/dist/product/environment.d.ts.map +1 -1
  177. package/dist/product/environment.js +4 -32
  178. package/dist/product/environment.js.map +1 -1
  179. package/dist/product/index.d.ts +1 -1
  180. package/dist/product/index.d.ts.map +1 -1
  181. package/dist/product/index.js +1 -3
  182. package/dist/product/index.js.map +1 -1
  183. package/dist/product/paths.d.ts.map +1 -1
  184. package/dist/product/paths.js +12 -0
  185. package/dist/product/paths.js.map +1 -1
  186. package/dist/runtime/agent-runtime-controller.d.ts +3 -2
  187. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  188. package/dist/runtime/agent-runtime-controller.js +24 -3
  189. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  190. package/dist/runtime/agent-runtime-protocol.d.ts +16 -1
  191. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  192. package/dist/runtime/agent-runtime-protocol.js +12 -0
  193. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  194. package/dist/runtime/chat-checkpoint.d.ts +17 -0
  195. package/dist/runtime/chat-checkpoint.d.ts.map +1 -0
  196. package/dist/runtime/chat-checkpoint.js +108 -0
  197. package/dist/runtime/chat-checkpoint.js.map +1 -0
  198. package/dist/runtime/chat-controller.d.ts +16 -46
  199. package/dist/runtime/chat-controller.d.ts.map +1 -1
  200. package/dist/runtime/chat-controller.js +212 -1051
  201. package/dist/runtime/chat-controller.js.map +1 -1
  202. package/dist/runtime/chat-presentation.d.ts +60 -0
  203. package/dist/runtime/chat-presentation.d.ts.map +1 -0
  204. package/dist/runtime/chat-presentation.js +537 -0
  205. package/dist/runtime/chat-presentation.js.map +1 -0
  206. package/dist/runtime/chat-trace.d.ts +52 -0
  207. package/dist/runtime/chat-trace.d.ts.map +1 -0
  208. package/dist/runtime/chat-trace.js +234 -0
  209. package/dist/runtime/chat-trace.js.map +1 -0
  210. package/dist/runtime/chat-workspace.d.ts +22 -0
  211. package/dist/runtime/chat-workspace.d.ts.map +1 -0
  212. package/dist/runtime/chat-workspace.js +154 -0
  213. package/dist/runtime/chat-workspace.js.map +1 -0
  214. package/dist/runtime/goals/accounting.js +1 -1
  215. package/dist/runtime/goals/accounting.js.map +1 -1
  216. package/dist/runtime/goals/completion-audit.d.ts.map +1 -1
  217. package/dist/runtime/goals/completion-audit.js +5 -4
  218. package/dist/runtime/goals/completion-audit.js.map +1 -1
  219. package/dist/runtime/goals/coordinator.d.ts +3 -0
  220. package/dist/runtime/goals/coordinator.d.ts.map +1 -1
  221. package/dist/runtime/goals/coordinator.js +30 -2
  222. package/dist/runtime/goals/coordinator.js.map +1 -1
  223. package/dist/runtime/goals/prompt.d.ts +1 -1
  224. package/dist/runtime/goals/prompt.d.ts.map +1 -1
  225. package/dist/runtime/goals/prompt.js +3 -2
  226. package/dist/runtime/goals/prompt.js.map +1 -1
  227. package/dist/runtime/goals/tools.d.ts +21 -8
  228. package/dist/runtime/goals/tools.d.ts.map +1 -1
  229. package/dist/runtime/goals/tools.js +152 -21
  230. package/dist/runtime/goals/tools.js.map +1 -1
  231. package/dist/runtime/goals/types.d.ts +6 -0
  232. package/dist/runtime/goals/types.d.ts.map +1 -1
  233. package/dist/runtime/goals/types.js.map +1 -1
  234. package/dist/runtime/loop-budget.d.ts +2 -2
  235. package/dist/runtime/model-coordinator.d.ts.map +1 -1
  236. package/dist/runtime/model-coordinator.js.map +1 -1
  237. package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -1
  238. package/dist/runtime/subagents/child-executor-guard.js +4 -0
  239. package/dist/runtime/subagents/child-executor-guard.js.map +1 -1
  240. package/dist/runtime/subagents/index.d.ts +10 -3
  241. package/dist/runtime/subagents/index.d.ts.map +1 -1
  242. package/dist/runtime/subagents/index.js +25 -1
  243. package/dist/runtime/subagents/index.js.map +1 -1
  244. package/dist/runtime/subagents/policy.d.ts +1 -1
  245. package/dist/runtime/subagents/policy.d.ts.map +1 -1
  246. package/dist/runtime/subagents/policy.js.map +1 -1
  247. package/dist/runtime/subagents/presets.d.ts +2 -2
  248. package/dist/runtime/subagents/provider-gate.d.ts.map +1 -1
  249. package/dist/runtime/subagents/provider-gate.js +0 -1
  250. package/dist/runtime/subagents/provider-gate.js.map +1 -1
  251. package/dist/runtime/subagents/research-artifact.d.ts +101 -0
  252. package/dist/runtime/subagents/research-artifact.d.ts.map +1 -0
  253. package/dist/runtime/subagents/research-artifact.js +210 -0
  254. package/dist/runtime/subagents/research-artifact.js.map +1 -0
  255. package/dist/runtime/subagents/research-citation.d.ts +66 -0
  256. package/dist/runtime/subagents/research-citation.d.ts.map +1 -0
  257. package/dist/runtime/subagents/research-citation.js +185 -0
  258. package/dist/runtime/subagents/research-citation.js.map +1 -0
  259. package/dist/runtime/subagents/research-contract.d.ts +83 -0
  260. package/dist/runtime/subagents/research-contract.d.ts.map +1 -0
  261. package/dist/runtime/subagents/research-contract.js +337 -0
  262. package/dist/runtime/subagents/research-contract.js.map +1 -0
  263. package/dist/runtime/subagents/research-quality.d.ts +47 -0
  264. package/dist/runtime/subagents/research-quality.d.ts.map +1 -0
  265. package/dist/runtime/subagents/research-quality.js +125 -0
  266. package/dist/runtime/subagents/research-quality.js.map +1 -0
  267. package/dist/runtime/subagents/research-renderer.d.ts +95 -0
  268. package/dist/runtime/subagents/research-renderer.d.ts.map +1 -0
  269. package/dist/runtime/subagents/research-renderer.js +186 -0
  270. package/dist/runtime/subagents/research-renderer.js.map +1 -0
  271. package/dist/runtime/subagents/research-types.d.ts +105 -0
  272. package/dist/runtime/subagents/research-types.d.ts.map +1 -0
  273. package/dist/runtime/subagents/research-types.js +16 -0
  274. package/dist/runtime/subagents/research-types.js.map +1 -0
  275. package/dist/runtime/subagents/result-parser.d.ts +1 -5
  276. package/dist/runtime/subagents/result-parser.d.ts.map +1 -1
  277. package/dist/runtime/subagents/result-parser.js +5 -72
  278. package/dist/runtime/subagents/result-parser.js.map +1 -1
  279. package/dist/runtime/subagents/runtime-integration.d.ts +13 -7
  280. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  281. package/dist/runtime/subagents/runtime-integration.js +112 -2
  282. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  283. package/dist/runtime/subagents/supervisor.d.ts +15 -1
  284. package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
  285. package/dist/runtime/subagents/supervisor.js +58 -3
  286. package/dist/runtime/subagents/supervisor.js.map +1 -1
  287. package/dist/runtime/subagents/tool.d.ts +2 -2
  288. package/dist/runtime/subagents/tool.d.ts.map +1 -1
  289. package/dist/runtime/subagents/tool.js +129 -9
  290. package/dist/runtime/subagents/tool.js.map +1 -1
  291. package/dist/runtime/subagents/types.d.ts +20 -0
  292. package/dist/runtime/subagents/types.d.ts.map +1 -1
  293. package/dist/runtime/subagents/types.js.map +1 -1
  294. package/dist/runtime/subagents/web-research-adapter.d.ts +85 -0
  295. package/dist/runtime/subagents/web-research-adapter.d.ts.map +1 -0
  296. package/dist/runtime/subagents/web-research-adapter.js +328 -0
  297. package/dist/runtime/subagents/web-research-adapter.js.map +1 -0
  298. package/dist/runtime/turn-controller.d.ts.map +1 -1
  299. package/dist/runtime/turn-controller.js +3 -1
  300. package/dist/runtime/turn-controller.js.map +1 -1
  301. package/dist/runtime/ui-events.d.ts +25 -8
  302. package/dist/runtime/ui-events.d.ts.map +1 -1
  303. package/dist/runtime/ui-events.js.map +1 -1
  304. package/dist/runtime/ui-view-model.d.ts +40 -0
  305. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  306. package/dist/runtime/ui-view-model.js +126 -0
  307. package/dist/runtime/ui-view-model.js.map +1 -1
  308. package/dist/services/agent-runner.d.ts +5 -2
  309. package/dist/services/agent-runner.d.ts.map +1 -1
  310. package/dist/services/agent-runner.js +18 -18
  311. package/dist/services/agent-runner.js.map +1 -1
  312. package/dist/services/atomic-write.d.ts +9 -1
  313. package/dist/services/atomic-write.d.ts.map +1 -1
  314. package/dist/services/atomic-write.js +55 -2
  315. package/dist/services/atomic-write.js.map +1 -1
  316. package/dist/services/auth/auth.d.ts +11 -7
  317. package/dist/services/auth/auth.d.ts.map +1 -1
  318. package/dist/services/auth/auth.js +133 -34
  319. package/dist/services/auth/auth.js.map +1 -1
  320. package/dist/services/auth/aws.d.ts +2 -0
  321. package/dist/services/auth/aws.d.ts.map +1 -1
  322. package/dist/services/auth/aws.js +126 -12
  323. package/dist/services/auth/aws.js.map +1 -1
  324. package/dist/services/auth/index.d.ts +1 -1
  325. package/dist/services/auth/index.d.ts.map +1 -1
  326. package/dist/services/auth/index.js +2 -1
  327. package/dist/services/auth/index.js.map +1 -1
  328. package/dist/services/auto-fix/autoFixConfig.d.ts +0 -3
  329. package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -1
  330. package/dist/services/auto-fix/autoFixConfig.js +25 -8
  331. package/dist/services/auto-fix/autoFixConfig.js.map +1 -1
  332. package/dist/services/auto-fix/autoFixHook.d.ts +7 -0
  333. package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
  334. package/dist/services/auto-fix/autoFixHook.js +10 -1
  335. package/dist/services/auto-fix/autoFixHook.js.map +1 -1
  336. package/dist/services/compact/auto-compact.d.ts +2 -0
  337. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  338. package/dist/services/compact/auto-compact.js +15 -1
  339. package/dist/services/compact/auto-compact.js.map +1 -1
  340. package/dist/services/compact/compact.d.ts.map +1 -1
  341. package/dist/services/compact/compact.js +9 -11
  342. package/dist/services/compact/compact.js.map +1 -1
  343. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  344. package/dist/services/compact/summary-generator.js +28 -4
  345. package/dist/services/compact/summary-generator.js.map +1 -1
  346. package/dist/services/compact/tool-call-groups.d.ts +19 -0
  347. package/dist/services/compact/tool-call-groups.d.ts.map +1 -0
  348. package/dist/services/compact/tool-call-groups.js +105 -0
  349. package/dist/services/compact/tool-call-groups.js.map +1 -0
  350. package/dist/services/concurrent-sessions.d.ts +4 -0
  351. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  352. package/dist/services/concurrent-sessions.js +76 -21
  353. package/dist/services/concurrent-sessions.js.map +1 -1
  354. package/dist/services/config-dir.d.ts.map +1 -1
  355. package/dist/services/config-dir.js +19 -5
  356. package/dist/services/config-dir.js.map +1 -1
  357. package/dist/services/config.d.ts +6 -4
  358. package/dist/services/config.d.ts.map +1 -1
  359. package/dist/services/config.js +16 -72
  360. package/dist/services/config.js.map +1 -1
  361. package/dist/services/doctor.d.ts +2 -2
  362. package/dist/services/doctor.js.map +1 -1
  363. package/dist/services/file-glob.d.ts.map +1 -1
  364. package/dist/services/file-glob.js +22 -2
  365. package/dist/services/file-glob.js.map +1 -1
  366. package/dist/services/file-lock.d.ts +7 -0
  367. package/dist/services/file-lock.d.ts.map +1 -0
  368. package/dist/services/file-lock.js +139 -0
  369. package/dist/services/file-lock.js.map +1 -0
  370. package/dist/services/global-config.d.ts +33 -0
  371. package/dist/services/global-config.d.ts.map +1 -1
  372. package/dist/services/global-config.js +67 -4
  373. package/dist/services/global-config.js.map +1 -1
  374. package/dist/services/goal-storage.d.ts.map +1 -1
  375. package/dist/services/goal-storage.js +52 -19
  376. package/dist/services/goal-storage.js.map +1 -1
  377. package/dist/services/llm.d.ts +12 -0
  378. package/dist/services/llm.d.ts.map +1 -1
  379. package/dist/services/llm.js +166 -69
  380. package/dist/services/llm.js.map +1 -1
  381. package/dist/services/mcp/transports.d.ts +0 -1
  382. package/dist/services/mcp/transports.d.ts.map +1 -1
  383. package/dist/services/mcp/transports.js +12 -13
  384. package/dist/services/mcp/transports.js.map +1 -1
  385. package/dist/services/model-catalog.d.ts +2 -0
  386. package/dist/services/model-catalog.d.ts.map +1 -1
  387. package/dist/services/model-catalog.js +25 -15
  388. package/dist/services/model-catalog.js.map +1 -1
  389. package/dist/services/model-context.d.ts +8 -0
  390. package/dist/services/model-context.d.ts.map +1 -1
  391. package/dist/services/model-context.js +147 -7
  392. package/dist/services/model-context.js.map +1 -1
  393. package/dist/services/model-registry.d.ts.map +1 -1
  394. package/dist/services/model-registry.js +32 -0
  395. package/dist/services/model-registry.js.map +1 -1
  396. package/dist/services/provider-resilience/coordinator.d.ts +9 -4
  397. package/dist/services/provider-resilience/coordinator.d.ts.map +1 -1
  398. package/dist/services/provider-resilience/coordinator.js +88 -21
  399. package/dist/services/provider-resilience/coordinator.js.map +1 -1
  400. package/dist/services/provider-resilience/error-classifier.d.ts +1 -0
  401. package/dist/services/provider-resilience/error-classifier.d.ts.map +1 -1
  402. package/dist/services/provider-resilience/error-classifier.js +50 -29
  403. package/dist/services/provider-resilience/error-classifier.js.map +1 -1
  404. package/dist/services/provider-resilience/index.d.ts +3 -3
  405. package/dist/services/provider-resilience/index.d.ts.map +1 -1
  406. package/dist/services/provider-resilience/index.js +3 -1
  407. package/dist/services/provider-resilience/index.js.map +1 -1
  408. package/dist/services/provider-resilience/request-gate.d.ts +6 -0
  409. package/dist/services/provider-resilience/request-gate.d.ts.map +1 -1
  410. package/dist/services/provider-resilience/request-gate.js +24 -9
  411. package/dist/services/provider-resilience/request-gate.js.map +1 -1
  412. package/dist/services/provider-resilience/stream-recovery.d.ts +1 -1
  413. package/dist/services/provider-resilience/stream-recovery.d.ts.map +1 -1
  414. package/dist/services/provider-resilience/stream-recovery.js +1 -1
  415. package/dist/services/provider-resilience/stream-recovery.js.map +1 -1
  416. package/dist/services/provider-resilience/types.d.ts +9 -0
  417. package/dist/services/provider-resilience/types.d.ts.map +1 -1
  418. package/dist/services/provider-resilience/types.js.map +1 -1
  419. package/dist/services/redaction.d.ts.map +1 -1
  420. package/dist/services/redaction.js +29 -1
  421. package/dist/services/redaction.js.map +1 -1
  422. package/dist/services/session-index.d.ts.map +1 -1
  423. package/dist/services/session-index.js +75 -44
  424. package/dist/services/session-index.js.map +1 -1
  425. package/dist/services/session-memory/sessionMemory.d.ts.map +1 -1
  426. package/dist/services/session-memory/sessionMemory.js +6 -3
  427. package/dist/services/session-memory/sessionMemory.js.map +1 -1
  428. package/dist/services/session-storage.d.ts +8 -0
  429. package/dist/services/session-storage.d.ts.map +1 -1
  430. package/dist/services/session-storage.js +105 -27
  431. package/dist/services/session-storage.js.map +1 -1
  432. package/dist/services/storage-maintenance.d.ts.map +1 -1
  433. package/dist/services/storage-maintenance.js +62 -9
  434. package/dist/services/storage-maintenance.js.map +1 -1
  435. package/dist/services/task-manager.d.ts +9 -4
  436. package/dist/services/task-manager.d.ts.map +1 -1
  437. package/dist/services/task-manager.js +18 -4
  438. package/dist/services/task-manager.js.map +1 -1
  439. package/dist/services/tool-allowlist.d.ts +100 -0
  440. package/dist/services/tool-allowlist.d.ts.map +1 -0
  441. package/dist/services/tool-allowlist.js +250 -0
  442. package/dist/services/tool-allowlist.js.map +1 -0
  443. package/dist/services/usage-state.d.ts +1 -0
  444. package/dist/services/usage-state.d.ts.map +1 -1
  445. package/dist/services/usage-state.js +81 -45
  446. package/dist/services/usage-state.js.map +1 -1
  447. package/dist/services/verification-profile.d.ts.map +1 -1
  448. package/dist/services/verification-profile.js +23 -3
  449. package/dist/services/verification-profile.js.map +1 -1
  450. package/dist/services/web-search-adapters.d.ts.map +1 -1
  451. package/dist/services/web-search-adapters.js +48 -18
  452. package/dist/services/web-search-adapters.js.map +1 -1
  453. package/dist/services/web-search-mcp.d.ts.map +1 -1
  454. package/dist/services/web-search-mcp.js +27 -11
  455. package/dist/services/web-search-mcp.js.map +1 -1
  456. package/dist/services/workspace-diff.d.ts +14 -0
  457. package/dist/services/workspace-diff.d.ts.map +1 -1
  458. package/dist/services/workspace-diff.js +60 -11
  459. package/dist/services/workspace-diff.js.map +1 -1
  460. package/dist/services/yaml-config.d.ts.map +1 -1
  461. package/dist/services/yaml-config.js +2 -1
  462. package/dist/services/yaml-config.js.map +1 -1
  463. package/dist/skills/loader.d.ts.map +1 -1
  464. package/dist/skills/loader.js +26 -11
  465. package/dist/skills/loader.js.map +1 -1
  466. package/dist/skills/runtime.d.ts +3 -3
  467. package/dist/skills/runtime.d.ts.map +1 -1
  468. package/dist/skills/runtime.js +37 -4
  469. package/dist/skills/runtime.js.map +1 -1
  470. package/dist/skills/types.d.ts +1 -1
  471. package/dist/skills/types.d.ts.map +1 -1
  472. package/dist/terminal-ui/launch.d.ts +36 -8
  473. package/dist/terminal-ui/launch.d.ts.map +1 -1
  474. package/dist/terminal-ui/launch.js +171 -1
  475. package/dist/terminal-ui/launch.js.map +1 -1
  476. package/dist/terminal-ui/raw-editor.js.map +1 -1
  477. package/dist/tools/bash_security.d.ts +58 -18
  478. package/dist/tools/bash_security.d.ts.map +1 -1
  479. package/dist/tools/bash_security.js +587 -80
  480. package/dist/tools/bash_security.js.map +1 -1
  481. package/dist/tools/git.d.ts +8 -4
  482. package/dist/tools/git.d.ts.map +1 -1
  483. package/dist/tools/git.js +518 -18
  484. package/dist/tools/git.js.map +1 -1
  485. package/dist/tools/index.d.ts +14 -4
  486. package/dist/tools/index.d.ts.map +1 -1
  487. package/dist/tools/index.js +292 -49
  488. package/dist/tools/index.js.map +1 -1
  489. package/dist/tools/lsp.d.ts +74 -6
  490. package/dist/tools/lsp.d.ts.map +1 -1
  491. package/dist/tools/lsp.js +24 -5
  492. package/dist/tools/lsp.js.map +1 -1
  493. package/dist/tools/mcp.d.ts +19 -6
  494. package/dist/tools/mcp.d.ts.map +1 -1
  495. package/dist/tools/mcp.js +143 -26
  496. package/dist/tools/mcp.js.map +1 -1
  497. package/dist/tools/plan.d.ts +4 -4
  498. package/dist/tools/sandbox.d.ts +141 -0
  499. package/dist/tools/sandbox.d.ts.map +1 -0
  500. package/dist/tools/sandbox.js +500 -0
  501. package/dist/tools/sandbox.js.map +1 -0
  502. package/dist/tools/todo.d.ts +3 -3
  503. package/dist/tools/web.d.ts +15 -4
  504. package/dist/tools/web.d.ts.map +1 -1
  505. package/dist/tools/web.js +346 -61
  506. package/dist/tools/web.js.map +1 -1
  507. package/dist/tui-core/frame.js.map +1 -1
  508. package/dist/tui-ui/launch.d.ts +3 -3
  509. package/dist/tui-ui/launch.d.ts.map +1 -1
  510. package/dist/tui-ui/launch.js +46 -8
  511. package/dist/tui-ui/launch.js.map +1 -1
  512. package/dist/tui-ui/layout.d.ts.map +1 -1
  513. package/dist/tui-ui/layout.js +64 -0
  514. package/dist/tui-ui/layout.js.map +1 -1
  515. package/dist/tui-ui/runner.d.ts +6 -0
  516. package/dist/tui-ui/runner.d.ts.map +1 -1
  517. package/dist/tui-ui/runner.js +82 -1
  518. package/dist/tui-ui/runner.js.map +1 -1
  519. package/dist/tui-ui/state.d.ts +28 -2
  520. package/dist/tui-ui/state.d.ts.map +1 -1
  521. package/dist/tui-ui/state.js +48 -7
  522. package/dist/tui-ui/state.js.map +1 -1
  523. package/dist/tui-ui/terminal-image.d.ts +3 -13
  524. package/dist/tui-ui/terminal-image.d.ts.map +1 -1
  525. package/dist/tui-ui/terminal-image.js +5 -160
  526. package/dist/tui-ui/terminal-image.js.map +1 -1
  527. package/dist/ui/markdown.js.map +1 -1
  528. package/dist/utils/debug-log.d.ts +52 -0
  529. package/dist/utils/debug-log.d.ts.map +1 -0
  530. package/dist/utils/debug-log.js +94 -0
  531. package/dist/utils/debug-log.js.map +1 -0
  532. package/dist/utils/errors.d.ts +25 -0
  533. package/dist/utils/errors.d.ts.map +1 -0
  534. package/dist/utils/errors.js +47 -0
  535. package/dist/utils/errors.js.map +1 -0
  536. package/dist/utils/json.d.ts +6 -0
  537. package/dist/utils/json.d.ts.map +1 -0
  538. package/dist/utils/json.js +66 -0
  539. package/dist/utils/json.js.map +1 -0
  540. package/dist/utils/mask.d.ts +35 -0
  541. package/dist/utils/mask.d.ts.map +1 -0
  542. package/dist/utils/mask.js +52 -0
  543. package/dist/utils/mask.js.map +1 -0
  544. package/dist/utils/observability.d.ts +22 -0
  545. package/dist/utils/observability.d.ts.map +1 -0
  546. package/dist/utils/observability.js +80 -0
  547. package/dist/utils/observability.js.map +1 -0
  548. package/dist/utils/token-estimate.d.ts +8 -0
  549. package/dist/utils/token-estimate.d.ts.map +1 -1
  550. package/dist/utils/token-estimate.js +30 -17
  551. package/dist/utils/token-estimate.js.map +1 -1
  552. package/package.json +9 -7
@@ -10,9 +10,43 @@
10
10
  *
11
11
  * 使用 buildTool() 工厂模式。
12
12
  */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
13
46
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.DEFAULT_SANDBOX_OPTIONS = exports.wrapForSandbox = exports.assessCommandSecurity = exports.isPotentiallyDestructive = exports.checkDangerousCommand = exports.isReadOnlyCommand = exports.POTENTIALLY_DESTRUCTIVE_PATTERNS = exports.DANGEROUS_PATTERNS = exports.READ_ONLY_COMMANDS = exports.TOOLS = exports.BATCH_READ_MAX_STEPS = exports.BATCH_READ_ALLOWED_TOOLS = void 0;
47
+ exports.findDestructiveRmTarget = exports.assessCommandSecurity = exports.isPotentiallyDestructive = exports.checkDangerousCommand = exports.isReadOnlyCommand = exports.POTENTIALLY_DESTRUCTIVE_PATTERNS = exports.DANGEROUS_PATTERNS = exports.READ_ONLY_COMMANDS = exports.TOOLS = exports.BATCH_READ_MAX_STEPS = exports.BATCH_READ_ALLOWED_TOOLS = void 0;
15
48
  exports.getRuntimeTools = getRuntimeTools;
49
+ exports.validateRegexPattern = validateRegexPattern;
16
50
  exports.executeTool = executeTool;
17
51
  exports.getToolNames = getToolNames;
18
52
  const child_process_1 = require("child_process");
@@ -20,12 +54,13 @@ const fs_1 = require("fs");
20
54
  const path_1 = require("path");
21
55
  const readline_1 = require("readline");
22
56
  const tool_1 = require("../framework/tool");
57
+ const tool_scheduler_1 = require("../framework/tool-scheduler");
23
58
  const external_assertion_1 = require("../framework/external-assertion");
24
59
  const tool_state_1 = require("../framework/tool-state");
25
60
  const tool_artifacts_1 = require("../core/tool-artifacts");
26
61
  const environment_1 = require("../product/environment");
27
- const memory_1 = require("../memory");
28
- const semantic_search_1 = require("../memory/semantic-search");
62
+ const storage_1 = require("../memory/storage");
63
+ const semantic_config_1 = require("../memory/semantic-config");
29
64
  const session_storage_1 = require("../services/session-storage");
30
65
  const web_1 = require("./web");
31
66
  const mcp_1 = require("./mcp");
@@ -35,6 +70,9 @@ const git_1 = require("./git");
35
70
  const lsp_1 = require("./lsp");
36
71
  const tools_1 = require("../runtime/goals/tools");
37
72
  const bash_security_1 = require("./bash_security");
73
+ const debug_log_1 = require("../utils/debug-log");
74
+ const errors_1 = require("../utils/errors");
75
+ const sandbox_1 = require("./sandbox");
38
76
  exports.BATCH_READ_ALLOWED_TOOLS = new Set([
39
77
  'git_status',
40
78
  'list_files',
@@ -163,8 +201,8 @@ exports.TOOLS = [
163
201
  return writeFileSync_(path, content, context.cwd);
164
202
  },
165
203
  isDestructive: () => true,
204
+ isFileEdit: () => true,
166
205
  checkPermissions: (_args, _context) => {
167
- // Destructive operation - ask for confirmation in default mode
168
206
  return { behavior: 'ask', reason: 'Write operation may modify existing files' };
169
207
  },
170
208
  userFacingName: args => `Write ${args.path}`,
@@ -250,7 +288,7 @@ exports.TOOLS = [
250
288
  const cmd = args.command || '';
251
289
  return /(rm\s+-rf|mkfs|dd\s)/.test(cmd);
252
290
  },
253
- checkPermissions: (args, _context) => {
291
+ checkPermissions: (args, context) => {
254
292
  const cmd = args.command || '';
255
293
  // Use the bash_security module for comprehensive checks
256
294
  const security = (0, bash_security_1.assessCommandSecurity)(cmd);
@@ -260,14 +298,32 @@ exports.TOOLS = [
260
298
  reason: security.reason || `Command blocked by safety policy: ${cmd.slice(0, 50)}`,
261
299
  };
262
300
  }
301
+ // v0.1.3-2 §1.2: a configured-but-unusable sandbox is a hard deny, decided
302
+ // here so the user sees the reason instead of an opaque execution failure.
303
+ const workdir = context?.cwd ?? process.cwd();
304
+ const sandboxSettings = (0, sandbox_1.resolveSandboxSettings)(workdir);
305
+ let sandboxNote = '';
306
+ if ((sandboxSettings.profile ?? 'none') !== 'none') {
307
+ const plan = (0, sandbox_1.planSandboxedCommand)(cmd, { cwd: workdir, settings: sandboxSettings });
308
+ if (!plan.ok) {
309
+ return {
310
+ behavior: 'deny',
311
+ reason: `sandbox profile "${plan.profile}" is configured but cannot be applied — ${plan.reason}`,
312
+ };
313
+ }
314
+ sandboxNote = ` [${(0, sandbox_1.describeSandboxPlan)(plan)}]`;
315
+ }
263
316
  if (security.level === 'safe' && security.isReadOnly) {
264
317
  return { behavior: 'allow' };
265
318
  }
266
319
  if (security.level === 'caution') {
267
- return { behavior: 'ask', reason: security.reason || 'Command requires confirmation' };
320
+ return {
321
+ behavior: 'ask',
322
+ reason: (security.reason || 'Command requires confirmation') + sandboxNote,
323
+ };
268
324
  }
269
325
  // Default: ask for confirmation
270
- return { behavior: 'ask', reason: 'Command requires confirmation' };
326
+ return { behavior: 'ask', reason: 'Command requires confirmation' + sandboxNote };
271
327
  },
272
328
  isReadOnly: args => {
273
329
  const cmd = args.command || '';
@@ -350,6 +406,7 @@ exports.TOOLS = [
350
406
  return editFile_(path, old_string, new_string, args.replace_all, args.fuzzy_match, args.preview, context.cwd);
351
407
  },
352
408
  isDestructive: () => true,
409
+ isFileEdit: () => true,
353
410
  checkPermissions: (_args, _context) => {
354
411
  return { behavior: 'ask', reason: 'Edit operation modifies file contents' };
355
412
  },
@@ -537,17 +594,18 @@ exports.TOOLS = [
537
594
  createdAt: Date.now(),
538
595
  updatedAt: Date.now(),
539
596
  };
540
- if ((0, semantic_search_1.isSemanticEnabled)()) {
597
+ if ((0, semantic_config_1.isSemanticEnabled)()) {
541
598
  // saveAndIndex internally calls saveMemory + vectorStore.upsert
542
- await (0, semantic_search_1.getSemanticSearchService)().saveAndIndex(entry, projectPath);
599
+ const { getSemanticSearchService } = await Promise.resolve().then(() => __importStar(require('../memory/semantic-search')));
600
+ await getSemanticSearchService().saveAndIndex(entry, projectPath);
543
601
  }
544
602
  else {
545
- (0, memory_1.saveMemory)(entry, projectPath);
603
+ (0, storage_1.saveMemory)(entry, projectPath);
546
604
  }
547
605
  return { success: true, output: `Saved memory: ${name} (${type})` };
548
606
  }
549
607
  catch (err) {
550
- return { success: false, output: '', error: err.message };
608
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
551
609
  }
552
610
  },
553
611
  isReadOnly: () => false,
@@ -584,11 +642,12 @@ exports.TOOLS = [
584
642
  const query = args.query || '';
585
643
  const type = args.type;
586
644
  let memories;
587
- if (query && (0, semantic_search_1.isSemanticEnabled)()) {
645
+ if (query && (0, semantic_config_1.isSemanticEnabled)()) {
588
646
  // Semantic path: ask the vector store, then fall back to keywords if it
589
647
  // returns nothing (e.g. embedding provider unreachable, empty index)
590
648
  try {
591
- const result = await (0, semantic_search_1.getSemanticSearchService)().search({
649
+ const { getSemanticSearchService } = await Promise.resolve().then(() => __importStar(require('../memory/semantic-search')));
650
+ const result = await getSemanticSearchService().search({
592
651
  query,
593
652
  projectPath,
594
653
  type,
@@ -602,25 +661,26 @@ exports.TOOLS = [
602
661
  updatedAt: m.createdAt,
603
662
  }));
604
663
  if (memories.length === 0) {
605
- memories = (0, memory_1.searchMemories)(query, projectPath);
664
+ memories = (0, storage_1.searchMemories)(query, projectPath);
606
665
  if (type)
607
666
  memories = memories.filter(m => m.type === type);
608
667
  }
609
668
  }
610
- catch {
611
- memories = (0, memory_1.searchMemories)(query, projectPath);
669
+ catch (error) {
670
+ (0, debug_log_1.debugError)('tools.memory.semanticSearch', error, query);
671
+ memories = (0, storage_1.searchMemories)(query, projectPath);
612
672
  if (type)
613
673
  memories = memories.filter(m => m.type === type);
614
674
  }
615
675
  }
616
676
  else if (type) {
617
- memories = (0, memory_1.loadAllMemories)(projectPath).filter(m => m.type === type);
677
+ memories = (0, storage_1.loadAllMemories)(projectPath).filter(m => m.type === type);
618
678
  }
619
679
  else if (query) {
620
- memories = (0, memory_1.searchMemories)(query, projectPath);
680
+ memories = (0, storage_1.searchMemories)(query, projectPath);
621
681
  }
622
682
  else {
623
- memories = (0, memory_1.loadAllMemories)(projectPath);
683
+ memories = (0, storage_1.loadAllMemories)(projectPath);
624
684
  }
625
685
  if (memories.length === 0) {
626
686
  return { success: true, output: 'No memories found' };
@@ -635,7 +695,7 @@ exports.TOOLS = [
635
695
  return { success: true, output: lines.join('\n') };
636
696
  }
637
697
  catch (err) {
638
- return { success: false, output: '', error: err.message };
698
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
639
699
  }
640
700
  },
641
701
  isReadOnly: () => true,
@@ -670,24 +730,26 @@ exports.TOOLS = [
670
730
  }
671
731
  try {
672
732
  const projectPath = context?.cwd || process.cwd();
673
- const existing = (0, memory_1.loadMemory)(name, projectPath);
733
+ const existing = (0, storage_1.loadMemory)(name, projectPath);
674
734
  if (!existing) {
675
735
  return { success: false, output: '', error: `Memory not found: ${name}` };
676
736
  }
677
- (0, memory_1.deleteMemory)(name, projectPath);
678
- if ((0, semantic_search_1.isSemanticEnabled)()) {
737
+ (0, storage_1.deleteMemory)(name, projectPath);
738
+ if ((0, semantic_config_1.isSemanticEnabled)()) {
679
739
  try {
680
740
  const { getVectorStore } = require('../memory/vector-store');
681
741
  getVectorStore().delete(name, projectPath);
682
742
  }
683
- catch {
684
- // Vector store cleanup is best-effort
743
+ catch (error) {
744
+ // Vector store cleanup is best-effort, but a failure leaves an
745
+ // orphaned embedding that keeps surfacing a deleted memory.
746
+ (0, debug_log_1.debugError)('tools.memory.vectorDelete', error, name);
685
747
  }
686
748
  }
687
749
  return { success: true, output: `Deleted memory: ${name}` };
688
750
  }
689
751
  catch (err) {
690
- return { success: false, output: '', error: err.message };
752
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
691
753
  }
692
754
  },
693
755
  isReadOnly: () => false,
@@ -782,7 +844,7 @@ exports.TOOLS = [
782
844
  return { success: true, output: lines.join('\n') };
783
845
  }
784
846
  catch (err) {
785
- return { success: false, output: '', error: err.message };
847
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
786
848
  }
787
849
  },
788
850
  isReadOnly: () => true,
@@ -837,7 +899,9 @@ function normalizeToolPath(input) {
837
899
  try {
838
900
  return decodeURIComponent(new URL(value).pathname);
839
901
  }
840
- catch {
902
+ catch (error) {
903
+ // Malformed URL or bad percent-encoding: strip the scheme so the path
904
+ // still reaches the caller's own validation instead of vanishing.
841
905
  return value.replace(/^file:\/\//u, '');
842
906
  }
843
907
  }
@@ -877,7 +941,10 @@ function safeReadFileSync(resolved) {
877
941
  return null;
878
942
  return (0, fs_1.readFileSync)(resolved, 'utf-8');
879
943
  }
880
- catch {
944
+ catch (error) {
945
+ // Permission denied or a binary that is not valid UTF-8; callers treat null
946
+ // as "no content", which otherwise hides a real read failure.
947
+ (0, debug_log_1.debugError)('tools.safeReadFile', error, resolved);
881
948
  return null;
882
949
  }
883
950
  }
@@ -885,6 +952,56 @@ function safeReadFileSync(resolved) {
885
952
  function safePath(input, cwd = process.cwd()) {
886
953
  return (0, path_1.resolve)(cwd, normalizeToolPath(input));
887
954
  }
955
+ /**
956
+ * Return true when `p` resolves (after following symlinks) to a location at or
957
+ * under `rootReal`. Used to enforce that a realpath is still inside the
958
+ * workspace even when directories along the path are themselves symlinks.
959
+ */
960
+ function isUnderRealRoot(p, rootReal) {
961
+ const rel = (0, path_1.relative)(rootReal, p);
962
+ return rel === '' || (!rel.startsWith('..') && !(0, path_1.isAbsolute)(rel));
963
+ }
964
+ /**
965
+ * Contain a tool-resolved path inside the workspace root (cwd).
966
+ *
967
+ * Blocks `../` traversal and absolute paths outside the workspace, which would
968
+ * otherwise let `write_file`/`edit_file` scribble over `~/.bashrc`, SSH config
969
+ * or other projects — especially dangerous under `acceptEdits` auto-approval,
970
+ * where the write runs without a confirmation prompt (issue #65).
971
+ *
972
+ * Containment is lexical first, then re-checked after resolving symlinks
973
+ * (issue #99): a workspace symlink that points outside the workspace must not
974
+ * be followed into an arbitrary write target. We resolve the realpath of the
975
+ * parent directory (which also collapses any intermediate symlinked dirs) and,
976
+ * if the target already exists, the target itself; if either escapes the
977
+ * workspace we refuse. The workspace root is also realpath-resolved so a
978
+ * symlinked cwd does not produce false rejections. Fail-closed on any
979
+ * filesystem error.
980
+ */
981
+ function isWithinWorkspace(resolved, cwd) {
982
+ const root = (0, path_1.resolve)(cwd);
983
+ const rel = (0, path_1.relative)(root, resolved);
984
+ if (!(rel === '' || (!rel.startsWith('..') && !(0, path_1.isAbsolute)(rel))))
985
+ return false;
986
+ try {
987
+ const rootReal = (0, fs_1.realpathSync)(root);
988
+ const realParent = (0, fs_1.realpathSync)((0, path_1.dirname)(resolved));
989
+ if (!isUnderRealRoot(realParent, rootReal))
990
+ return false;
991
+ // Only the existing target needs its own realpath check; a brand-new file
992
+ // inherits the (already-validated) containment of its parent directory.
993
+ if ((0, fs_1.existsSync)(resolved)) {
994
+ const realTarget = (0, fs_1.realpathSync)(resolved);
995
+ if (!isUnderRealRoot(realTarget, rootReal))
996
+ return false;
997
+ }
998
+ }
999
+ catch {
1000
+ // A missing/unknowable realpath means we cannot prove containment — refuse.
1001
+ return false;
1002
+ }
1003
+ return true;
1004
+ }
888
1005
  /**
889
1006
  * Truncate text to at most maxBytes UTF-8 bytes, cutting on a character
890
1007
  * boundary (never inside a multi-byte sequence or surrogate pair). Returns the
@@ -977,13 +1094,21 @@ async function readFileSync_(path, maxLines, offset, cwd) {
977
1094
  return { success: true, output: selected };
978
1095
  }
979
1096
  catch (err) {
980
- return { success: false, output: '', error: String(err.message) };
1097
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
981
1098
  }
982
1099
  }
983
1100
  async function writeFileSync_(path, content, cwd) {
984
1101
  try {
985
1102
  const normalizedPath = normalizeToolPath(path);
986
1103
  const resolved = safePath(path, cwd);
1104
+ const workspaceRoot = cwd ?? process.cwd();
1105
+ if (!isWithinWorkspace(resolved, workspaceRoot)) {
1106
+ return {
1107
+ success: false,
1108
+ output: '',
1109
+ error: `Refusing to write outside the workspace: ${normalizedPath}`,
1110
+ };
1111
+ }
987
1112
  (0, fs_1.writeFileSync)(resolved, content, 'utf-8');
988
1113
  return {
989
1114
  success: true,
@@ -991,7 +1116,7 @@ async function writeFileSync_(path, content, cwd) {
991
1116
  };
992
1117
  }
993
1118
  catch (err) {
994
- return { success: false, output: '', error: String(err.message) };
1119
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
995
1120
  }
996
1121
  }
997
1122
  async function listFiles_(path, maxDepth, cwd) {
@@ -1038,17 +1163,50 @@ async function listFiles_(path, maxDepth, cwd) {
1038
1163
  return { success: true, output };
1039
1164
  }
1040
1165
  // Issue #32 #3.2: execCommand_ 支持 abortSignal
1041
- async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseCwd) {
1166
+ async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseCwd, sandbox) {
1167
+ const workdir = cwd ? safePath(cwd, baseCwd) : (baseCwd ?? process.cwd());
1168
+ // v0.1.3-2 §1.2: plan the (possibly sandboxed) argv before spawning. A
1169
+ // configured sandbox that cannot be honoured must refuse the command rather
1170
+ // than silently degrade into an unsandboxed run.
1171
+ const plan = (0, sandbox_1.planSandboxedCommand)(command, {
1172
+ cwd: workdir,
1173
+ settings: sandbox ?? (0, sandbox_1.resolveSandboxSettings)(baseCwd ?? process.cwd()),
1174
+ });
1175
+ if (!plan.ok) {
1176
+ return {
1177
+ success: false,
1178
+ output: '',
1179
+ error: `Refusing to run: sandbox profile "${plan.profile}" is configured but cannot be applied — ${plan.reason}. ` +
1180
+ 'Set sandbox.profile to "none" to run without isolation.',
1181
+ };
1182
+ }
1042
1183
  return new Promise(resolve => {
1043
- const workdir = cwd ? safePath(cwd, baseCwd) : (baseCwd ?? process.cwd());
1044
1184
  const timeoutMs = timeout ?? 30000;
1045
1185
  const maxBytes = maxOutput ?? 51200; // Default 50KB, Issue #28 fix
1046
- // Use spawn for streaming output with truncation support
1186
+ // The docker backend bind-mounts `workdir` into the container; the host
1187
+ // directory must exist at container-creation time or the mount fails with a
1188
+ // confusing "nonexistent directory" error. Create it deterministically
1189
+ // rather than relying on docker to materialise it.
1190
+ if (plan.backend === 'docker') {
1191
+ try {
1192
+ (0, fs_1.mkdirSync)(workdir, { recursive: true });
1193
+ }
1194
+ catch {
1195
+ // If it cannot be created we let the spawn fail with a clear error.
1196
+ }
1197
+ }
1198
+ // Use spawn for streaming output with truncation support. The user command
1199
+ // is a single argv element, so no intermediate shell re-parses it.
1047
1200
  const useProcessGroup = process.platform !== 'win32';
1048
- const child = (0, child_process_1.spawn)('sh', ['-c', command], {
1201
+ const child = (0, child_process_1.spawn)(plan.file, plan.args, {
1049
1202
  cwd: workdir,
1050
1203
  detached: useProcessGroup,
1051
1204
  });
1205
+ // Issue #53: exec_command runs a complete command as a single argv element
1206
+ // and never pipes input into it. If stdin stays open, stdin-reading commands
1207
+ // (cat, sort, grep, `python3 -`, ...) block waiting for EOF until the timeout.
1208
+ // Close it immediately so the child receives EOF and can proceed.
1209
+ child.stdin?.end();
1052
1210
  let stdoutData = '';
1053
1211
  let stderrData = '';
1054
1212
  let stdoutTruncated = false;
@@ -1058,6 +1216,10 @@ async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseC
1058
1216
  let stderrBytes = 0;
1059
1217
  let interrupted = null;
1060
1218
  // Issue #32 #3.2: AbortSignal 处理
1219
+ // Declared uninitialized on purpose: `finish()` below closes over it before the
1220
+ // `timeoutId = setTimeout(...)` assignment. `const` without an initializer is a
1221
+ // compile error (TS1155), and inlining the assignment would put it in the closure's TDZ.
1222
+ // eslint-disable-next-line prefer-const
1061
1223
  let timeoutId;
1062
1224
  let killTimerId;
1063
1225
  let settled = false;
@@ -1126,13 +1288,19 @@ async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseC
1126
1288
  child.stdout.on('data', (data) => {
1127
1289
  if (!stdoutTruncated) {
1128
1290
  const chunk = data.toString();
1129
- stdoutBytes += chunk.length;
1130
- if (stdoutBytes > maxBytes) {
1291
+ // Issue #30: count UTF-8 bytes, not UTF-16 code units, so CJK/emoji
1292
+ // output is bounded by `maxBytes` (a UTF-16 count could exceed it ~2x).
1293
+ const chunkBytes = Buffer.byteLength(chunk, 'utf8');
1294
+ if (stdoutBytes + chunkBytes > maxBytes) {
1131
1295
  stdoutTruncated = true;
1132
- stdoutData += chunk.slice(0, maxBytes - stdoutData.length);
1296
+ const room = Math.max(0, maxBytes - stdoutBytes);
1297
+ // Byte-accurate truncation that respects multi-byte character boundaries.
1298
+ stdoutData += truncateToBytes(chunk, room).text;
1299
+ stdoutBytes = maxBytes;
1133
1300
  }
1134
1301
  else {
1135
1302
  stdoutData += chunk;
1303
+ stdoutBytes += chunkBytes;
1136
1304
  }
1137
1305
  }
1138
1306
  });
@@ -1140,13 +1308,17 @@ async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseC
1140
1308
  child.stderr.on('data', (data) => {
1141
1309
  if (!stderrTruncated) {
1142
1310
  const chunk = data.toString();
1143
- stderrBytes += chunk.length;
1144
- if (stderrBytes > maxBytes) {
1311
+ // Issue #30: count UTF-8 bytes, not UTF-16 code units.
1312
+ const chunkBytes = Buffer.byteLength(chunk, 'utf8');
1313
+ if (stderrBytes + chunkBytes > maxBytes) {
1145
1314
  stderrTruncated = true;
1146
- stderrData += chunk.slice(0, maxBytes - stderrData.length);
1315
+ const room = Math.max(0, maxBytes - stderrBytes);
1316
+ stderrData += truncateToBytes(chunk, room).text;
1317
+ stderrBytes = maxBytes;
1147
1318
  }
1148
1319
  else {
1149
1320
  stderrData += chunk;
1321
+ stderrBytes += chunkBytes;
1150
1322
  }
1151
1323
  }
1152
1324
  });
@@ -1154,7 +1326,7 @@ async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseC
1154
1326
  if (interrupted === 'aborted') {
1155
1327
  finish({
1156
1328
  success: false,
1157
- output: stdoutData.slice(0, maxBytes),
1329
+ output: truncateToBytes(stdoutData, maxBytes).text,
1158
1330
  error: 'Command aborted by user',
1159
1331
  });
1160
1332
  return;
@@ -1162,7 +1334,7 @@ async function execCommand_(command, cwd, timeout, maxOutput, abortSignal, baseC
1162
1334
  if (interrupted === 'timeout') {
1163
1335
  finish({
1164
1336
  success: false,
1165
- output: stdoutData.slice(0, maxBytes),
1337
+ output: truncateToBytes(stdoutData, maxBytes).text,
1166
1338
  error: `Command timed out after ${timeoutMs}ms`,
1167
1339
  });
1168
1340
  return;
@@ -1312,6 +1484,14 @@ async function editFile_(path, old_string, new_string, replace_all, fuzzy_match,
1312
1484
  try {
1313
1485
  const normalizedPath = normalizeToolPath(path);
1314
1486
  const resolved = safePath(path, cwd);
1487
+ const workspaceRoot = cwd ?? process.cwd();
1488
+ if (!isWithinWorkspace(resolved, workspaceRoot)) {
1489
+ return {
1490
+ success: false,
1491
+ output: '',
1492
+ error: `Refusing to edit outside the workspace: ${normalizedPath}`,
1493
+ };
1494
+ }
1315
1495
  if (!(0, fs_1.existsSync)(resolved)) {
1316
1496
  return { success: false, output: '', error: `File not found: ${normalizedPath}` };
1317
1497
  }
@@ -1441,13 +1621,40 @@ async function editFile_(path, old_string, new_string, replace_all, fuzzy_match,
1441
1621
  };
1442
1622
  }
1443
1623
  catch (err) {
1444
- return { success: false, output: '', error: String(err.message) };
1624
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
1445
1625
  }
1446
1626
  }
1447
1627
  /** Escape special regex characters for literal matching */
1448
1628
  function escapeRegExp(str) {
1449
1629
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
1450
1630
  }
1631
+ /**
1632
+ * Validate a caller-supplied regular expression pattern before compiling it.
1633
+ *
1634
+ * Issue #79: `grep_` compiles user/model-supplied patterns with `new RegExp`
1635
+ * directly. A pathological pattern with a quantified group that itself contains
1636
+ * a quantifier (e.g. `(a+)+`, `(\d+)*`) triggers catastrophic backtracking
1637
+ * (ReDoS) and can hang the process on adversarial input (prompt injection).
1638
+ * Reject empty/oversized patterns and the classic nested-quantifier shapes.
1639
+ */
1640
+ function validateRegexPattern(pattern) {
1641
+ if (!pattern)
1642
+ return 'pattern must not be empty';
1643
+ if (pattern.length > 2000)
1644
+ return 'pattern is too long (max 2000 characters)';
1645
+ // A group containing an internal quantifier, then quantified again: the
1646
+ // canonical exponential-backtracking construction.
1647
+ if (/\([^()]*[*+?][^()]*\)\s*[*+?]/.test(pattern)) {
1648
+ return 'pattern contains a quantified group with an internal quantifier — this risks catastrophic backtracking (ReDoS)';
1649
+ }
1650
+ try {
1651
+ new RegExp(pattern);
1652
+ }
1653
+ catch {
1654
+ return 'pattern is not a valid regular expression';
1655
+ }
1656
+ return null;
1657
+ }
1451
1658
  // ============================================================================
1452
1659
  // Glob/Grep 工具实现
1453
1660
  // ============================================================================
@@ -1538,7 +1745,7 @@ async function glob_(pattern, basePath, cwd) {
1538
1745
  return { success: true, output };
1539
1746
  }
1540
1747
  catch (err) {
1541
- return { success: false, output: '', error: String(err.message) };
1748
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
1542
1749
  }
1543
1750
  }
1544
1751
  /**
@@ -1551,6 +1758,10 @@ async function grep_(pattern, basePath, globPattern, contextLines, cwd) {
1551
1758
  if (!(0, fs_1.existsSync)(base)) {
1552
1759
  return { success: false, output: '', error: `Path not found: ${normalizedBasePath}` };
1553
1760
  }
1761
+ const patternError = validateRegexPattern(pattern);
1762
+ if (patternError) {
1763
+ return { success: false, output: '', error: `Invalid grep pattern: ${patternError}` };
1764
+ }
1554
1765
  const regex = new RegExp(pattern);
1555
1766
  const context = contextLines ?? 0;
1556
1767
  const results = [];
@@ -1672,7 +1883,7 @@ async function grep_(pattern, basePath, globPattern, contextLines, cwd) {
1672
1883
  return { success: true, output: results.slice(0, maxResults).join('\n') + symlinkWarning };
1673
1884
  }
1674
1885
  catch (err) {
1675
- return { success: false, output: '', error: String(err.message) };
1886
+ return { success: false, output: '', error: (0, errors_1.errorMessage)(err) };
1676
1887
  }
1677
1888
  }
1678
1889
  function isRecord(value) {
@@ -1778,6 +1989,35 @@ async function executeBatchRead(args, context) {
1778
1989
  },
1779
1990
  ], error);
1780
1991
  }
1992
+ // The scheduler resolved permissions for `batch_read` itself, not for the
1993
+ // tools it fans out to. Without re-running the gate here, a project
1994
+ // `deny: read_file(*.env)` rule -- and the plan-mode block -- apply to the
1995
+ // flat call but not to the batched one, so the model can read a denied path
1996
+ // simply by wrapping it in `batch_read`.
1997
+ const stepPermission = (0, tool_1.getToolMetadataPresence)(tool).hasPermissionCheck && tool.checkPermissions
1998
+ ? tool.checkPermissions(step.args, context)
1999
+ : undefined;
2000
+ const effective = (0, tool_scheduler_1.resolveEffectivePermission)({
2001
+ toolName: step.tool,
2002
+ tool,
2003
+ args: step.args,
2004
+ permission: stepPermission,
2005
+ permissionMode: context.permissionMode,
2006
+ allowlist: context.toolAllowlist?.(step.tool, step.args),
2007
+ });
2008
+ if (effective.outcome === 'deny' || effective.outcome === 'block') {
2009
+ const error = effective.reason || `Tool ${step.tool} is not permitted (${effective.source ?? 'policy'})`;
2010
+ return buildBatchReadPayload(false, error, [
2011
+ {
2012
+ index: i + 1,
2013
+ tool: step.tool,
2014
+ args: step.args,
2015
+ success: false,
2016
+ error,
2017
+ output: '',
2018
+ },
2019
+ ], error);
2020
+ }
1781
2021
  }
1782
2022
  const stepResults = [];
1783
2023
  for (let i = 0; i < parsed.steps.length; i++) {
@@ -1804,7 +2044,7 @@ async function executeBatchRead(args, context) {
1804
2044
  tool: step.tool,
1805
2045
  args: step.args,
1806
2046
  success: false,
1807
- error: err?.message || String(err),
2047
+ error: (0, errors_1.errorMessage)(err),
1808
2048
  output: '',
1809
2049
  });
1810
2050
  }
@@ -1839,6 +2079,10 @@ async function executeTool(name, args, abortSignal, toolContext) {
1839
2079
  abortSignal, // Issue #32 #3.2: 透传 abortSignal
1840
2080
  sessionId: toolContext?.sessionId,
1841
2081
  turnId: toolContext?.turnId,
2082
+ // Must survive the rebuild: batch_read re-runs the permission gate on its
2083
+ // sub-steps and reads both of these off the context.
2084
+ permissionMode: toolContext?.permissionMode,
2085
+ toolAllowlist: toolContext?.toolAllowlist,
1842
2086
  };
1843
2087
  const result = await tool.execute(args, context);
1844
2088
  // Assertions are generated by the runtime allowlist, never accepted from a
@@ -1895,6 +2139,5 @@ Object.defineProperty(exports, "isReadOnlyCommand", { enumerable: true, get: fun
1895
2139
  Object.defineProperty(exports, "checkDangerousCommand", { enumerable: true, get: function () { return bash_security_2.checkDangerousCommand; } });
1896
2140
  Object.defineProperty(exports, "isPotentiallyDestructive", { enumerable: true, get: function () { return bash_security_2.isPotentiallyDestructive; } });
1897
2141
  Object.defineProperty(exports, "assessCommandSecurity", { enumerable: true, get: function () { return bash_security_2.assessCommandSecurity; } });
1898
- Object.defineProperty(exports, "wrapForSandbox", { enumerable: true, get: function () { return bash_security_2.wrapForSandbox; } });
1899
- Object.defineProperty(exports, "DEFAULT_SANDBOX_OPTIONS", { enumerable: true, get: function () { return bash_security_2.DEFAULT_SANDBOX_OPTIONS; } });
2142
+ Object.defineProperty(exports, "findDestructiveRmTarget", { enumerable: true, get: function () { return bash_security_2.findDestructiveRmTarget; } });
1900
2143
  //# sourceMappingURL=index.js.map