@chances-ai/engine 24.0.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 (389) hide show
  1. package/dist/agents/discover.d.ts +30 -0
  2. package/dist/agents/discover.d.ts.map +1 -0
  3. package/dist/agents/discover.js +183 -0
  4. package/dist/agents/discover.js.map +1 -0
  5. package/dist/agents/index.d.ts +20 -0
  6. package/dist/agents/index.d.ts.map +1 -0
  7. package/dist/agents/index.js +52 -0
  8. package/dist/agents/index.js.map +1 -0
  9. package/dist/agents/parse.d.ts +61 -0
  10. package/dist/agents/parse.d.ts.map +1 -0
  11. package/dist/agents/parse.js +527 -0
  12. package/dist/agents/parse.js.map +1 -0
  13. package/dist/agents/types.d.ts +52 -0
  14. package/dist/agents/types.d.ts.map +1 -0
  15. package/dist/agents/types.js +8 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
  18. package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
  19. package/dist/ai/adapters/ai-sdk-stream.js +125 -0
  20. package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
  21. package/dist/ai/adapters/ai-sdk.d.ts +56 -0
  22. package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
  23. package/dist/ai/adapters/ai-sdk.js +112 -0
  24. package/dist/ai/adapters/ai-sdk.js.map +1 -0
  25. package/dist/ai/adapters/mock.d.ts +13 -0
  26. package/dist/ai/adapters/mock.d.ts.map +1 -0
  27. package/dist/ai/adapters/mock.js +54 -0
  28. package/dist/ai/adapters/mock.js.map +1 -0
  29. package/dist/ai/adapters/openai-compatible.d.ts +23 -0
  30. package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
  31. package/dist/ai/adapters/openai-compatible.js +45 -0
  32. package/dist/ai/adapters/openai-compatible.js.map +1 -0
  33. package/dist/ai/cost.d.ts +3 -0
  34. package/dist/ai/cost.d.ts.map +1 -0
  35. package/dist/ai/cost.js +5 -0
  36. package/dist/ai/cost.js.map +1 -0
  37. package/dist/ai/index.d.ts +12 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +11 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/known-models.d.ts +20 -0
  42. package/dist/ai/known-models.d.ts.map +1 -0
  43. package/dist/ai/known-models.js +129 -0
  44. package/dist/ai/known-models.js.map +1 -0
  45. package/dist/ai/registry.d.ts +12 -0
  46. package/dist/ai/registry.d.ts.map +1 -0
  47. package/dist/ai/registry.js +24 -0
  48. package/dist/ai/registry.js.map +1 -0
  49. package/dist/ai/retry.d.ts +11 -0
  50. package/dist/ai/retry.d.ts.map +1 -0
  51. package/dist/ai/retry.js +14 -0
  52. package/dist/ai/retry.js.map +1 -0
  53. package/dist/ai/router.d.ts +25 -0
  54. package/dist/ai/router.d.ts.map +1 -0
  55. package/dist/ai/router.js +36 -0
  56. package/dist/ai/router.js.map +1 -0
  57. package/dist/ai/setup.d.ts +23 -0
  58. package/dist/ai/setup.d.ts.map +1 -0
  59. package/dist/ai/setup.js +47 -0
  60. package/dist/ai/setup.js.map +1 -0
  61. package/dist/ai/summarizer.d.ts +24 -0
  62. package/dist/ai/summarizer.d.ts.map +1 -0
  63. package/dist/ai/summarizer.js +56 -0
  64. package/dist/ai/summarizer.js.map +1 -0
  65. package/dist/ai/types.d.ts +83 -0
  66. package/dist/ai/types.d.ts.map +1 -0
  67. package/dist/ai/types.js +2 -0
  68. package/dist/ai/types.js.map +1 -0
  69. package/dist/core/compaction/circuit-breaker.d.ts +32 -0
  70. package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
  71. package/dist/core/compaction/circuit-breaker.js +42 -0
  72. package/dist/core/compaction/circuit-breaker.js.map +1 -0
  73. package/dist/core/compaction/compactor.d.ts +75 -0
  74. package/dist/core/compaction/compactor.d.ts.map +1 -0
  75. package/dist/core/compaction/compactor.js +261 -0
  76. package/dist/core/compaction/compactor.js.map +1 -0
  77. package/dist/core/compaction/estimate.d.ts +39 -0
  78. package/dist/core/compaction/estimate.d.ts.map +1 -0
  79. package/dist/core/compaction/estimate.js +74 -0
  80. package/dist/core/compaction/estimate.js.map +1 -0
  81. package/dist/core/compaction/index.d.ts +5 -0
  82. package/dist/core/compaction/index.d.ts.map +1 -0
  83. package/dist/core/compaction/index.js +5 -0
  84. package/dist/core/compaction/index.js.map +1 -0
  85. package/dist/core/compaction/prune.d.ts +43 -0
  86. package/dist/core/compaction/prune.d.ts.map +1 -0
  87. package/dist/core/compaction/prune.js +51 -0
  88. package/dist/core/compaction/prune.js.map +1 -0
  89. package/dist/core/engine.d.ts +268 -0
  90. package/dist/core/engine.d.ts.map +1 -0
  91. package/dist/core/engine.js +767 -0
  92. package/dist/core/engine.js.map +1 -0
  93. package/dist/core/index.d.ts +6 -0
  94. package/dist/core/index.d.ts.map +1 -0
  95. package/dist/core/index.js +6 -0
  96. package/dist/core/index.js.map +1 -0
  97. package/dist/core/task-tool.d.ts +175 -0
  98. package/dist/core/task-tool.d.ts.map +1 -0
  99. package/dist/core/task-tool.js +901 -0
  100. package/dist/core/task-tool.js.map +1 -0
  101. package/dist/core/workspace-query.d.ts +83 -0
  102. package/dist/core/workspace-query.d.ts.map +1 -0
  103. package/dist/core/workspace-query.js +217 -0
  104. package/dist/core/workspace-query.js.map +1 -0
  105. package/dist/core/worktree/active-marker.d.ts +31 -0
  106. package/dist/core/worktree/active-marker.d.ts.map +1 -0
  107. package/dist/core/worktree/active-marker.js +109 -0
  108. package/dist/core/worktree/active-marker.js.map +1 -0
  109. package/dist/core/worktree/create.d.ts +40 -0
  110. package/dist/core/worktree/create.d.ts.map +1 -0
  111. package/dist/core/worktree/create.js +121 -0
  112. package/dist/core/worktree/create.js.map +1 -0
  113. package/dist/core/worktree/errors.d.ts +7 -0
  114. package/dist/core/worktree/errors.d.ts.map +1 -0
  115. package/dist/core/worktree/errors.js +11 -0
  116. package/dist/core/worktree/errors.js.map +1 -0
  117. package/dist/core/worktree/gc.d.ts +39 -0
  118. package/dist/core/worktree/gc.d.ts.map +1 -0
  119. package/dist/core/worktree/gc.js +146 -0
  120. package/dist/core/worktree/gc.js.map +1 -0
  121. package/dist/core/worktree/git.d.ts +53 -0
  122. package/dist/core/worktree/git.d.ts.map +1 -0
  123. package/dist/core/worktree/git.js +166 -0
  124. package/dist/core/worktree/git.js.map +1 -0
  125. package/dist/core/worktree/index.d.ts +8 -0
  126. package/dist/core/worktree/index.d.ts.map +1 -0
  127. package/dist/core/worktree/index.js +8 -0
  128. package/dist/core/worktree/index.js.map +1 -0
  129. package/dist/core/worktree/paths.d.ts +26 -0
  130. package/dist/core/worktree/paths.d.ts.map +1 -0
  131. package/dist/core/worktree/paths.js +57 -0
  132. package/dist/core/worktree/paths.js.map +1 -0
  133. package/dist/core/worktree/slug.d.ts +6 -0
  134. package/dist/core/worktree/slug.d.ts.map +1 -0
  135. package/dist/core/worktree/slug.js +21 -0
  136. package/dist/core/worktree/slug.js.map +1 -0
  137. package/dist/local-vault/file-store.d.ts +64 -0
  138. package/dist/local-vault/file-store.d.ts.map +1 -0
  139. package/dist/local-vault/file-store.js +225 -0
  140. package/dist/local-vault/file-store.js.map +1 -0
  141. package/dist/local-vault/index.d.ts +57 -0
  142. package/dist/local-vault/index.d.ts.map +1 -0
  143. package/dist/local-vault/index.js +68 -0
  144. package/dist/local-vault/index.js.map +1 -0
  145. package/dist/local-vault/keychain.d.ts +58 -0
  146. package/dist/local-vault/keychain.d.ts.map +1 -0
  147. package/dist/local-vault/keychain.js +200 -0
  148. package/dist/local-vault/keychain.js.map +1 -0
  149. package/dist/local-vault/mutex.d.ts +20 -0
  150. package/dist/local-vault/mutex.d.ts.map +1 -0
  151. package/dist/local-vault/mutex.js +44 -0
  152. package/dist/local-vault/mutex.js.map +1 -0
  153. package/dist/local-vault/passphrase.d.ts +30 -0
  154. package/dist/local-vault/passphrase.d.ts.map +1 -0
  155. package/dist/local-vault/passphrase.js +72 -0
  156. package/dist/local-vault/passphrase.js.map +1 -0
  157. package/dist/lsp/config.d.ts +34 -0
  158. package/dist/lsp/config.d.ts.map +1 -0
  159. package/dist/lsp/config.js +68 -0
  160. package/dist/lsp/config.js.map +1 -0
  161. package/dist/lsp/detect.d.ts +7 -0
  162. package/dist/lsp/detect.d.ts.map +1 -0
  163. package/dist/lsp/detect.js +78 -0
  164. package/dist/lsp/detect.js.map +1 -0
  165. package/dist/lsp/errors.d.ts +11 -0
  166. package/dist/lsp/errors.d.ts.map +1 -0
  167. package/dist/lsp/errors.js +11 -0
  168. package/dist/lsp/errors.js.map +1 -0
  169. package/dist/lsp/formatters.d.ts +147 -0
  170. package/dist/lsp/formatters.d.ts.map +1 -0
  171. package/dist/lsp/formatters.js +259 -0
  172. package/dist/lsp/formatters.js.map +1 -0
  173. package/dist/lsp/index.d.ts +31 -0
  174. package/dist/lsp/index.d.ts.map +1 -0
  175. package/dist/lsp/index.js +31 -0
  176. package/dist/lsp/index.js.map +1 -0
  177. package/dist/lsp/instance.d.ts +72 -0
  178. package/dist/lsp/instance.d.ts.map +1 -0
  179. package/dist/lsp/instance.js +489 -0
  180. package/dist/lsp/instance.js.map +1 -0
  181. package/dist/lsp/lazy-load.d.ts +27 -0
  182. package/dist/lsp/lazy-load.d.ts.map +1 -0
  183. package/dist/lsp/lazy-load.js +57 -0
  184. package/dist/lsp/lazy-load.js.map +1 -0
  185. package/dist/lsp/manager.d.ts +59 -0
  186. package/dist/lsp/manager.d.ts.map +1 -0
  187. package/dist/lsp/manager.js +242 -0
  188. package/dist/lsp/manager.js.map +1 -0
  189. package/dist/lsp/ops.d.ts +13 -0
  190. package/dist/lsp/ops.d.ts.map +1 -0
  191. package/dist/lsp/ops.js +225 -0
  192. package/dist/lsp/ops.js.map +1 -0
  193. package/dist/lsp/rpc.d.ts +47 -0
  194. package/dist/lsp/rpc.d.ts.map +1 -0
  195. package/dist/lsp/rpc.js +134 -0
  196. package/dist/lsp/rpc.js.map +1 -0
  197. package/dist/lsp/safe-uri.d.ts +18 -0
  198. package/dist/lsp/safe-uri.d.ts.map +1 -0
  199. package/dist/lsp/safe-uri.js +96 -0
  200. package/dist/lsp/safe-uri.js.map +1 -0
  201. package/dist/lsp/types.d.ts +70 -0
  202. package/dist/lsp/types.d.ts.map +1 -0
  203. package/dist/lsp/types.js +16 -0
  204. package/dist/lsp/types.js.map +1 -0
  205. package/dist/mcp/bridge.d.ts +57 -0
  206. package/dist/mcp/bridge.d.ts.map +1 -0
  207. package/dist/mcp/bridge.js +98 -0
  208. package/dist/mcp/bridge.js.map +1 -0
  209. package/dist/mcp/category.d.ts +22 -0
  210. package/dist/mcp/category.d.ts.map +1 -0
  211. package/dist/mcp/category.js +11 -0
  212. package/dist/mcp/category.js.map +1 -0
  213. package/dist/mcp/client.d.ts +228 -0
  214. package/dist/mcp/client.d.ts.map +1 -0
  215. package/dist/mcp/client.js +352 -0
  216. package/dist/mcp/client.js.map +1 -0
  217. package/dist/mcp/content.d.ts +86 -0
  218. package/dist/mcp/content.d.ts.map +1 -0
  219. package/dist/mcp/content.js +147 -0
  220. package/dist/mcp/content.js.map +1 -0
  221. package/dist/mcp/env.d.ts +19 -0
  222. package/dist/mcp/env.d.ts.map +1 -0
  223. package/dist/mcp/env.js +50 -0
  224. package/dist/mcp/env.js.map +1 -0
  225. package/dist/mcp/host.d.ts +199 -0
  226. package/dist/mcp/host.d.ts.map +1 -0
  227. package/dist/mcp/host.js +530 -0
  228. package/dist/mcp/host.js.map +1 -0
  229. package/dist/mcp/index.d.ts +18 -0
  230. package/dist/mcp/index.d.ts.map +1 -0
  231. package/dist/mcp/index.js +17 -0
  232. package/dist/mcp/index.js.map +1 -0
  233. package/dist/mcp/load-mcp-host.d.ts +32 -0
  234. package/dist/mcp/load-mcp-host.d.ts.map +1 -0
  235. package/dist/mcp/load-mcp-host.js +49 -0
  236. package/dist/mcp/load-mcp-host.js.map +1 -0
  237. package/dist/mcp/oauth/callback-server.d.ts +73 -0
  238. package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
  239. package/dist/mcp/oauth/callback-server.js +280 -0
  240. package/dist/mcp/oauth/callback-server.js.map +1 -0
  241. package/dist/mcp/oauth/config-hash.d.ts +24 -0
  242. package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
  243. package/dist/mcp/oauth/config-hash.js +55 -0
  244. package/dist/mcp/oauth/config-hash.js.map +1 -0
  245. package/dist/mcp/oauth/error-normalize.d.ts +39 -0
  246. package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
  247. package/dist/mcp/oauth/error-normalize.js +91 -0
  248. package/dist/mcp/oauth/error-normalize.js.map +1 -0
  249. package/dist/mcp/oauth/provider.d.ts +190 -0
  250. package/dist/mcp/oauth/provider.d.ts.map +1 -0
  251. package/dist/mcp/oauth/provider.js +305 -0
  252. package/dist/mcp/oauth/provider.js.map +1 -0
  253. package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
  254. package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
  255. package/dist/mcp/oauth/refresh-coalescer.js +77 -0
  256. package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
  257. package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
  258. package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
  259. package/dist/mcp/oauth/sdk-shapes.js +21 -0
  260. package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
  261. package/dist/mcp/parse.d.ts +28 -0
  262. package/dist/mcp/parse.d.ts.map +1 -0
  263. package/dist/mcp/parse.js +209 -0
  264. package/dist/mcp/parse.js.map +1 -0
  265. package/dist/mcp/prompts.d.ts +31 -0
  266. package/dist/mcp/prompts.d.ts.map +1 -0
  267. package/dist/mcp/prompts.js +71 -0
  268. package/dist/mcp/prompts.js.map +1 -0
  269. package/dist/mcp/redact.d.ts +62 -0
  270. package/dist/mcp/redact.d.ts.map +1 -0
  271. package/dist/mcp/redact.js +87 -0
  272. package/dist/mcp/redact.js.map +1 -0
  273. package/dist/mcp/resources.d.ts +70 -0
  274. package/dist/mcp/resources.d.ts.map +1 -0
  275. package/dist/mcp/resources.js +170 -0
  276. package/dist/mcp/resources.js.map +1 -0
  277. package/dist/mcp/types.d.ts +123 -0
  278. package/dist/mcp/types.d.ts.map +1 -0
  279. package/dist/mcp/types.js +2 -0
  280. package/dist/mcp/types.js.map +1 -0
  281. package/dist/memory/frontmatter.d.ts +18 -0
  282. package/dist/memory/frontmatter.d.ts.map +1 -0
  283. package/dist/memory/frontmatter.js +81 -0
  284. package/dist/memory/frontmatter.js.map +1 -0
  285. package/dist/memory/index.d.ts +5 -0
  286. package/dist/memory/index.d.ts.map +1 -0
  287. package/dist/memory/index.js +5 -0
  288. package/dist/memory/index.js.map +1 -0
  289. package/dist/memory/store.d.ts +44 -0
  290. package/dist/memory/store.d.ts.map +1 -0
  291. package/dist/memory/store.js +237 -0
  292. package/dist/memory/store.js.map +1 -0
  293. package/dist/memory/tools.d.ts +11 -0
  294. package/dist/memory/tools.d.ts.map +1 -0
  295. package/dist/memory/tools.js +159 -0
  296. package/dist/memory/tools.js.map +1 -0
  297. package/dist/memory/types.d.ts +32 -0
  298. package/dist/memory/types.d.ts.map +1 -0
  299. package/dist/memory/types.js +20 -0
  300. package/dist/memory/types.js.map +1 -0
  301. package/dist/plugin-api/index.d.ts +167 -0
  302. package/dist/plugin-api/index.d.ts.map +1 -0
  303. package/dist/plugin-api/index.js +151 -0
  304. package/dist/plugin-api/index.js.map +1 -0
  305. package/dist/plugin-logger/index.d.ts +21 -0
  306. package/dist/plugin-logger/index.d.ts.map +1 -0
  307. package/dist/plugin-logger/index.js +59 -0
  308. package/dist/plugin-logger/index.js.map +1 -0
  309. package/dist/session/index.d.ts +125 -0
  310. package/dist/session/index.d.ts.map +1 -0
  311. package/dist/session/index.js +202 -0
  312. package/dist/session/index.js.map +1 -0
  313. package/dist/tools/approval.d.ts +33 -0
  314. package/dist/tools/approval.d.ts.map +1 -0
  315. package/dist/tools/approval.js +53 -0
  316. package/dist/tools/approval.js.map +1 -0
  317. package/dist/tools/builtins/_shared.d.ts +94 -0
  318. package/dist/tools/builtins/_shared.d.ts.map +1 -0
  319. package/dist/tools/builtins/_shared.js +246 -0
  320. package/dist/tools/builtins/_shared.js.map +1 -0
  321. package/dist/tools/builtins/ask-user-question.d.ts +27 -0
  322. package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
  323. package/dist/tools/builtins/ask-user-question.js +191 -0
  324. package/dist/tools/builtins/ask-user-question.js.map +1 -0
  325. package/dist/tools/builtins/bash.d.ts +3 -0
  326. package/dist/tools/builtins/bash.d.ts.map +1 -0
  327. package/dist/tools/builtins/bash.js +158 -0
  328. package/dist/tools/builtins/bash.js.map +1 -0
  329. package/dist/tools/builtins/diff.d.ts +3 -0
  330. package/dist/tools/builtins/diff.d.ts.map +1 -0
  331. package/dist/tools/builtins/diff.js +83 -0
  332. package/dist/tools/builtins/diff.js.map +1 -0
  333. package/dist/tools/builtins/edit.d.ts +3 -0
  334. package/dist/tools/builtins/edit.d.ts.map +1 -0
  335. package/dist/tools/builtins/edit.js +40 -0
  336. package/dist/tools/builtins/edit.js.map +1 -0
  337. package/dist/tools/builtins/glob.d.ts +3 -0
  338. package/dist/tools/builtins/glob.d.ts.map +1 -0
  339. package/dist/tools/builtins/glob.js +37 -0
  340. package/dist/tools/builtins/glob.js.map +1 -0
  341. package/dist/tools/builtins/grep.d.ts +3 -0
  342. package/dist/tools/builtins/grep.d.ts.map +1 -0
  343. package/dist/tools/builtins/grep.js +81 -0
  344. package/dist/tools/builtins/grep.js.map +1 -0
  345. package/dist/tools/builtins/lsp.d.ts +3 -0
  346. package/dist/tools/builtins/lsp.d.ts.map +1 -0
  347. package/dist/tools/builtins/lsp.js +102 -0
  348. package/dist/tools/builtins/lsp.js.map +1 -0
  349. package/dist/tools/builtins/pty.d.ts +64 -0
  350. package/dist/tools/builtins/pty.d.ts.map +1 -0
  351. package/dist/tools/builtins/pty.js +536 -0
  352. package/dist/tools/builtins/pty.js.map +1 -0
  353. package/dist/tools/builtins/read.d.ts +3 -0
  354. package/dist/tools/builtins/read.d.ts.map +1 -0
  355. package/dist/tools/builtins/read.js +18 -0
  356. package/dist/tools/builtins/read.js.map +1 -0
  357. package/dist/tools/builtins/web-fetch.d.ts +4 -0
  358. package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
  359. package/dist/tools/builtins/web-fetch.js +353 -0
  360. package/dist/tools/builtins/web-fetch.js.map +1 -0
  361. package/dist/tools/builtins/write.d.ts +3 -0
  362. package/dist/tools/builtins/write.d.ts.map +1 -0
  363. package/dist/tools/builtins/write.js +48 -0
  364. package/dist/tools/builtins/write.js.map +1 -0
  365. package/dist/tools/builtins.d.ts +9 -0
  366. package/dist/tools/builtins.d.ts.map +1 -0
  367. package/dist/tools/builtins.js +29 -0
  368. package/dist/tools/builtins.js.map +1 -0
  369. package/dist/tools/diff.d.ts +18 -0
  370. package/dist/tools/diff.d.ts.map +1 -0
  371. package/dist/tools/diff.js +57 -0
  372. package/dist/tools/diff.js.map +1 -0
  373. package/dist/tools/index.d.ts +10 -0
  374. package/dist/tools/index.d.ts.map +1 -0
  375. package/dist/tools/index.js +9 -0
  376. package/dist/tools/index.js.map +1 -0
  377. package/dist/tools/permission.d.ts +120 -0
  378. package/dist/tools/permission.d.ts.map +1 -0
  379. package/dist/tools/permission.js +208 -0
  380. package/dist/tools/permission.js.map +1 -0
  381. package/dist/tools/registry.d.ts +12 -0
  382. package/dist/tools/registry.d.ts.map +1 -0
  383. package/dist/tools/registry.js +19 -0
  384. package/dist/tools/registry.js.map +1 -0
  385. package/dist/tools/types.d.ts +244 -0
  386. package/dist/tools/types.d.ts.map +1 -0
  387. package/dist/tools/types.js +15 -0
  388. package/dist/tools/types.js.map +1 -0
  389. package/package.json +109 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/tools/builtins/_shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { JSONValue } from "@chances-ai/runtime";
2
+ import { type QuestionSpec, type Tool } from "../types.js";
3
+ /**
4
+ * (5.10b) Pure validation of the model's args into typed {@link QuestionSpec}[].
5
+ * Schema-locked (counts + types) with uniqueness refines on question texts and
6
+ * per-question option labels. Returns a typed result so the engine path AND a
7
+ * unit test both assert it without a TTY (the `reduceModelPicker` convention).
8
+ * NB: `packages/tools` intentionally has NO zod dependency — every builtin
9
+ * hand-rolls its arg validation, so the asker does too.
10
+ */
11
+ export declare function parseQuestions(args: JSONValue): {
12
+ ok: true;
13
+ questions: QuestionSpec[];
14
+ } | {
15
+ ok: false;
16
+ error: string;
17
+ };
18
+ /**
19
+ * (5.10b) `ask_user_question` — let the model ask the user a structured,
20
+ * select-don't-type question and wait for the answer. Read-only (`search`): it
21
+ * has no side effect beyond presenting a chooser, so it is the ONE tool allowed
22
+ * on the question permission channel (the engine fail-closes any other tool that
23
+ * emits a `question` request). Headless / `-p` / RPC have no UI → the resolver
24
+ * declines and we return a deterministic message.
25
+ */
26
+ export declare const askUserQuestionTool: Tool;
27
+ //# sourceMappingURL=ask-user-question.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/ask-user-question.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,IAAI,EAGV,MAAM,aAAa,CAAC;AAiBrB;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,GACd;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6DxE;AAkBD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,IA6EjC,CAAC"}
@@ -0,0 +1,191 @@
1
+ import { ASK_USER_QUESTION_TOOL_NAME, } from "../types.js";
2
+ // (5.10b) Schema-locked bounds — mirror claude-code's AskUserQuestion (1–4
3
+ // questions, 2–4 options, short header). The model declares the options; the UI
4
+ // injects the "Other" free-text row itself (the model never declares it).
5
+ const MIN_QUESTIONS = 1;
6
+ const MAX_QUESTIONS = 4;
7
+ const MIN_OPTIONS = 2;
8
+ const MAX_OPTIONS = 4;
9
+ const MAX_HEADER = 16;
10
+ // (codex R2 SHOULD-FIX #2) Upper bound on an option label. The schema asks for
11
+ // 1–5 words; we enforce a length cap (UI safety — a runaway label breaks the tab
12
+ // / list layout) but deliberately NOT word count or a trailing "?" on questions:
13
+ // those are prose guidelines, not correctness constraints (rejecting "Choose an
14
+ // approach:" would be over-strict and would silently drop a valid question).
15
+ const MAX_LABEL = 60;
16
+ /**
17
+ * (5.10b) Pure validation of the model's args into typed {@link QuestionSpec}[].
18
+ * Schema-locked (counts + types) with uniqueness refines on question texts and
19
+ * per-question option labels. Returns a typed result so the engine path AND a
20
+ * unit test both assert it without a TTY (the `reduceModelPicker` convention).
21
+ * NB: `packages/tools` intentionally has NO zod dependency — every builtin
22
+ * hand-rolls its arg validation, so the asker does too.
23
+ */
24
+ export function parseQuestions(args) {
25
+ if (typeof args !== "object" || args === null || Array.isArray(args)) {
26
+ return { ok: false, error: "args must be an object" };
27
+ }
28
+ const raw = args.questions;
29
+ if (!Array.isArray(raw))
30
+ return { ok: false, error: "`questions` must be an array" };
31
+ if (raw.length < MIN_QUESTIONS || raw.length > MAX_QUESTIONS) {
32
+ return { ok: false, error: `\`questions\` must have ${MIN_QUESTIONS}–${MAX_QUESTIONS} items` };
33
+ }
34
+ const questions = [];
35
+ const seenQuestions = new Set();
36
+ for (const q of raw) {
37
+ if (typeof q !== "object" || q === null)
38
+ return { ok: false, error: "each question must be an object" };
39
+ const obj = q;
40
+ const question = obj.question;
41
+ const header = obj.header;
42
+ if (typeof question !== "string" || question.trim() === "") {
43
+ return { ok: false, error: "`question` must be a non-empty string" };
44
+ }
45
+ if (typeof header !== "string" || header.trim() === "" || header.length > MAX_HEADER) {
46
+ return { ok: false, error: `\`header\` must be a non-empty string ≤${MAX_HEADER} chars` };
47
+ }
48
+ if (seenQuestions.has(question))
49
+ return { ok: false, error: `duplicate question: "${question}"` };
50
+ seenQuestions.add(question);
51
+ const options = obj.options;
52
+ if (!Array.isArray(options) || options.length < MIN_OPTIONS || options.length > MAX_OPTIONS) {
53
+ return { ok: false, error: `each question needs ${MIN_OPTIONS}–${MAX_OPTIONS} options` };
54
+ }
55
+ const parsedOptions = [];
56
+ const seenLabels = new Set();
57
+ for (const o of options) {
58
+ if (typeof o !== "object" || o === null)
59
+ return { ok: false, error: "each option must be an object" };
60
+ const oo = o;
61
+ const label = oo.label;
62
+ if (typeof label !== "string" || label.trim() === "") {
63
+ return { ok: false, error: "option `label` must be a non-empty string" };
64
+ }
65
+ if (label.length > MAX_LABEL) {
66
+ return { ok: false, error: `option \`label\` must be ≤${MAX_LABEL} chars (keep choices concise)` };
67
+ }
68
+ if (seenLabels.has(label)) {
69
+ return { ok: false, error: `duplicate option label "${label}" in question "${question}"` };
70
+ }
71
+ seenLabels.add(label);
72
+ const description = typeof oo.description === "string" ? oo.description : undefined;
73
+ const preview = typeof oo.preview === "string" ? oo.preview : undefined;
74
+ parsedOptions.push({
75
+ label,
76
+ ...(description ? { description } : {}),
77
+ ...(preview ? { preview } : {}),
78
+ });
79
+ }
80
+ const multiSelect = typeof obj.multiSelect === "boolean" ? obj.multiSelect : undefined;
81
+ questions.push({
82
+ question,
83
+ header,
84
+ options: parsedOptions,
85
+ ...(multiSelect !== undefined ? { multiSelect } : {}),
86
+ });
87
+ }
88
+ return { ok: true, questions };
89
+ }
90
+ /** (5.10b) Render the user's answers as a single model-facing string. The TOOL
91
+ * owns this wording (the engine never serializes answers) — mirrors claude-code's
92
+ * `mapToolResultToToolResultBlockParam`. */
93
+ function formatAnswers(questions, decision) {
94
+ const lines = questions.map((q) => {
95
+ const picked = decision.answers[q.question];
96
+ const joined = picked && picked.length > 0 ? picked.map((a) => `"${a}"`).join(", ") : "(no answer)";
97
+ return `- "${q.question}" → ${joined}`;
98
+ });
99
+ const notes = questions
100
+ .map((q) => decision.annotations?.[q.question]?.notes)
101
+ .filter((n) => typeof n === "string" && n.trim() !== "");
102
+ const noteBlock = notes.length > 0 ? `\n\nNotes: ${notes.join(" | ")}` : "";
103
+ return `User has answered the question(s):\n${lines.join("\n")}${noteBlock}`;
104
+ }
105
+ /**
106
+ * (5.10b) `ask_user_question` — let the model ask the user a structured,
107
+ * select-don't-type question and wait for the answer. Read-only (`search`): it
108
+ * has no side effect beyond presenting a chooser, so it is the ONE tool allowed
109
+ * on the question permission channel (the engine fail-closes any other tool that
110
+ * emits a `question` request). Headless / `-p` / RPC have no UI → the resolver
111
+ * declines and we return a deterministic message.
112
+ */
113
+ export const askUserQuestionTool = {
114
+ name: ASK_USER_QUESTION_TOOL_NAME,
115
+ description: "Ask the user one or more multiple-choice questions and wait for their answer. " +
116
+ "Use when a decision is genuinely the user's to make and you can't resolve it from " +
117
+ "the request, the code, or sensible defaults — e.g. choosing between approaches, or " +
118
+ "clarifying ambiguous requirements. Each question has 2–4 mutually-exclusive options; " +
119
+ "set multiSelect to allow several. Do NOT add an 'Other' option — the UI adds it. " +
120
+ "Prefer proceeding with a sensible default over asking when the choice is obvious.",
121
+ category: "search",
122
+ parameters: {
123
+ type: "object",
124
+ properties: {
125
+ questions: {
126
+ type: "array",
127
+ minItems: MIN_QUESTIONS,
128
+ maxItems: MAX_QUESTIONS,
129
+ description: "1–4 questions to ask the user.",
130
+ items: {
131
+ type: "object",
132
+ properties: {
133
+ question: { type: "string", description: "The complete question, ending with '?'." },
134
+ header: { type: "string", description: `Short tab/chip label (≤${MAX_HEADER} chars).` },
135
+ multiSelect: { type: "boolean", description: "Allow selecting multiple options (default false)." },
136
+ options: {
137
+ type: "array",
138
+ minItems: MIN_OPTIONS,
139
+ maxItems: MAX_OPTIONS,
140
+ description: "2–4 mutually-exclusive choices. Do not include an 'Other' option.",
141
+ items: {
142
+ type: "object",
143
+ properties: {
144
+ label: { type: "string", description: "Concise choice (1–5 words)." },
145
+ description: { type: "string", description: "What this option means / its trade-offs." },
146
+ preview: { type: "string", description: "Optional Markdown preview shown beside the list." },
147
+ },
148
+ required: ["label"],
149
+ },
150
+ },
151
+ },
152
+ required: ["question", "header", "options"],
153
+ },
154
+ },
155
+ },
156
+ required: ["questions"],
157
+ },
158
+ summarize(args) {
159
+ const parsed = parseQuestions(args);
160
+ return parsed.ok ? `ask: ${parsed.questions[0].header}` : "ask: (invalid args)";
161
+ },
162
+ permission(args) {
163
+ const parsed = parseQuestions(args);
164
+ // Invalid args: return null so the engine bypasses the question channel and
165
+ // runs execute(), which surfaces the validation error to the model (rather
166
+ // than presenting an empty/garbage chooser).
167
+ if (!parsed.ok)
168
+ return null;
169
+ return {
170
+ kind: "question",
171
+ name: ASK_USER_QUESTION_TOOL_NAME,
172
+ category: "search",
173
+ questions: parsed.questions,
174
+ };
175
+ },
176
+ async execute(args, ctx) {
177
+ const parsed = parseQuestions(args);
178
+ if (!parsed.ok) {
179
+ return { ok: false, output: `Invalid ask_user_question args: ${parsed.error}` };
180
+ }
181
+ const decision = ctx.questionDecision;
182
+ // No decision (only reachable via the invalid-args null-bypass, defensive) OR
183
+ // an explicit decline (user cancelled, or a non-interactive resolver) ⇒ a
184
+ // deterministic "declined" result.
185
+ if (!decision || decision.declined) {
186
+ return { ok: true, output: "User declined to answer the question(s)." };
187
+ }
188
+ return { ok: true, output: formatAnswers(parsed.questions, decision) };
189
+ },
190
+ };
191
+ //# sourceMappingURL=ask-user-question.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../../src/tools/builtins/ask-user-question.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "../types.js";
2
+ export declare const bashTool: Tool;
3
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AA4GpD,eAAO,MAAM,QAAQ,EAAE,IAiEtB,CAAC"}
@@ -0,0 +1,158 @@
1
+ import { native } from "@chances-ai/native";
2
+ import { cleanOutput, optNum, persistFullOutput, str } from "./_shared.js";
3
+ /**
4
+ * `bash` runs a shell command in a real PTY when the native addon is
5
+ * loaded — programs see `isatty(stdout) === true`, signals propagate to
6
+ * the process group with a 100 ms grace before SIGKILL. When the addon is
7
+ * missing (binary not staged for the host platform yet) the facade falls
8
+ * back to `child_process.spawn`; the user-visible contract is the same,
9
+ * minus the PTY semantics.
10
+ *
11
+ * Output handling is modelled on claude-code's bash tool: ANSI codes are
12
+ * stripped before the model sees the body (they're tokens of noise for an
13
+ * LLM); when the stripped body would exceed `INLINE_OUTPUT_BYTES`, the
14
+ * full payload is persisted to a per-call file under
15
+ * `.chances/tool-results/` and the inline preview points at it. Per-call
16
+ * `timeout` defaults to 2 min and caps at 10 min (also claude-code
17
+ * defaults — long enough for builds and tests, short enough to fail loud
18
+ * on a hung command).
19
+ */
20
+ /** Default 2 min, max 10 min — claude-code's `BASH_DEFAULT_TIMEOUT_MS` /
21
+ * `BASH_MAX_TIMEOUT_MS` (timeouts.ts:2-39). The model can override per
22
+ * call via the `timeout` arg (in seconds). */
23
+ const DEFAULT_TIMEOUT_MS = 120_000;
24
+ const MAX_TIMEOUT_MS = 600_000;
25
+ /** Inline payload cap. Larger outputs get persisted; matches claude-code's
26
+ * `BASH_MAX_OUTPUT_LENGTH` default of 30 000 chars. */
27
+ const INLINE_OUTPUT_BYTES = 30_000;
28
+ /** ANSI / OSC / DCS stripper + line-ending normaliser moved to
29
+ * `_shared.ts` in 5.1 so the new `pty` registry can apply the same
30
+ * scrubber before bus emit. Original family-of-escape-codes design
31
+ * notes live there. */
32
+ function clampTimeoutMs(timeoutSec) {
33
+ if (timeoutSec === undefined)
34
+ return DEFAULT_TIMEOUT_MS;
35
+ const ms = Math.floor(timeoutSec * 1000);
36
+ if (!Number.isFinite(ms) || ms <= 0)
37
+ return DEFAULT_TIMEOUT_MS;
38
+ return Math.min(ms, MAX_TIMEOUT_MS);
39
+ }
40
+ /** Persistence helper extracted to `_shared.ts` in 5.1. Same 0o700 dir
41
+ * + 0o600 file POSIX permissions, same Windows caveat (Node `mode`
42
+ * only affects the read-only bit there — explicit DACL hardening is a
43
+ * follow-up). */
44
+ /** Format the final tool body. Layout when oversized:
45
+ * `<status prefix line, if any>`
46
+ * `[output truncated: showing first 30 KB of 123 KB; full output saved to <path>]`
47
+ * `<inline preview>`
48
+ *
49
+ * The truncation banner is the first thing after any status prefix so
50
+ * the model can tell at a glance whether it's looking at the full
51
+ * payload or a head.
52
+ *
53
+ * **`runtimeDropped` is the Rust layer's `outputTruncatedBytes`** —
54
+ * bytes dropped at the 64 MiB Rust ceiling BEFORE the JS layer ever
55
+ * sees them. The banner has to surface this honestly: if we said
56
+ * "full output saved to <path>" while the runtime already silently
57
+ * dropped 10 GB, the model would assume the persisted file is the
58
+ * whole story. Round 3 codex SHOULD-FIX. */
59
+ function formatBody(cleaned, workspaceRoot, runtimeDropped, callId) {
60
+ if (cleaned.length <= INLINE_OUTPUT_BYTES && runtimeDropped === 0) {
61
+ return { body: cleaned, persistedPath: null, persistedSize: null };
62
+ }
63
+ const inlineBytes = INLINE_OUTPUT_BYTES;
64
+ const totalBytes = cleaned.length;
65
+ const head = cleaned.length > inlineBytes ? cleaned.slice(0, inlineBytes) : cleaned;
66
+ const headStr = (Math.min(inlineBytes, cleaned.length) / 1024).toFixed(0);
67
+ const totalStr = (totalBytes / 1024).toFixed(0);
68
+ // Caveat for the model if the runtime layer ALREADY dropped bytes —
69
+ // the persisted file isn't actually the full story in that case.
70
+ const runtimeNote = runtimeDropped > 0
71
+ ? `; runtime also dropped ${(runtimeDropped / (1024 * 1024)).toFixed(1)} MiB past the 64 MiB cap (NOT included in the persisted file)`
72
+ : "";
73
+ // If the cleaned body fits inline AND the only signal is runtime
74
+ // drop, we can return the inline body with just a one-line warning
75
+ // (no persistence needed — the cleaned body IS the full visible
76
+ // story, we just want the model to know it's incomplete).
77
+ if (cleaned.length <= inlineBytes) {
78
+ return {
79
+ body: `[runtime dropped ${(runtimeDropped / (1024 * 1024)).toFixed(1)} MiB past the 64 MiB cap]\n${cleaned}`,
80
+ persistedPath: null,
81
+ persistedSize: null,
82
+ };
83
+ }
84
+ const persistedPath = persistFullOutput(workspaceRoot, cleaned, "bash", "output.txt", callId);
85
+ const banner = persistedPath
86
+ ? `[output truncated: showing first ${headStr} KB of ${totalStr} KB; full output saved to ${persistedPath}${runtimeNote}]`
87
+ : `[output truncated: showing first ${headStr} KB of ${totalStr} KB; persistence failed, remainder dropped${runtimeNote}]`;
88
+ return {
89
+ body: `${banner}\n${head}`,
90
+ persistedPath,
91
+ persistedSize: totalBytes,
92
+ };
93
+ }
94
+ export const bashTool = {
95
+ name: "bash",
96
+ description: "Run a shell command via a real PTY (ANSI passthrough at the runtime layer; output is stripped of escape codes before being returned to you to save tokens). Output is capped at 30 KB inline; longer outputs are persisted to .chances/tool-results/<id>/output.txt and the inline preview includes the path. Default timeout 120 s, max 600 s. Cancelled / timed-out runs return ok:false with a status prefix.",
97
+ category: "shell",
98
+ parameters: {
99
+ type: "object",
100
+ properties: {
101
+ command: { type: "string", description: "Shell command to execute" },
102
+ timeout: {
103
+ type: "number",
104
+ description: "Optional per-call timeout in seconds (default 120, max 600).",
105
+ },
106
+ },
107
+ required: ["command"],
108
+ },
109
+ summarize: (args) => `bash: ${str(args, "command")}`,
110
+ async execute(args, ctx) {
111
+ const command = str(args, "command");
112
+ const timeoutMs = clampTimeoutMs(optNum(args, "timeout"));
113
+ const result = await native.ptyRun({
114
+ command,
115
+ cwd: ctx.cwd,
116
+ signal: ctx.signal,
117
+ timeoutMs,
118
+ });
119
+ // A bash command can mutate anything (mv/rm/build/codegen) and we can't
120
+ // tell what, so drop the WHOLE shared fs-scan cache — a path-scoped
121
+ // invalidate would miss files the command created elsewhere ([10.4] /
122
+ // design §8: bash = full-clear).
123
+ native.invalidateFsScanCache();
124
+ const cleaned = cleanOutput(result.output);
125
+ // (4.1 Round-2 SHOULD-FIX #4) Persist oversized output to the
126
+ // PARENT workspace's `.chances/tool-results/...` when we're inside
127
+ // an isolated subagent — the worktree may be removed after the
128
+ // task finishes (clean exit), which would invalidate any path
129
+ // surfaced to the model. Outside isolation, `parentWorkspaceRoot`
130
+ // equals `workspaceRoot`, so this is a no-op.
131
+ const persistRoot = ctx.parentWorkspaceRoot ?? ctx.workspaceRoot;
132
+ const { body } = formatBody(cleaned, persistRoot, result.outputTruncatedBytes, ctx.callId);
133
+ // Status prefix is what the model reads first — must be unambiguous.
134
+ // Order matters: cancel beats timeout beats non-zero exit, because a
135
+ // user-initiated cancel might race with a timeout and the user
136
+ // intent is the more informative attribution.
137
+ if (result.cancelled) {
138
+ return { ok: false, output: prefix("(cancelled)", body) };
139
+ }
140
+ if (result.timedOut) {
141
+ return {
142
+ ok: false,
143
+ output: prefix(`(timed out after ${(timeoutMs / 1000).toFixed(0)}s)`, body),
144
+ };
145
+ }
146
+ if (result.exitCode === 0) {
147
+ return { ok: true, output: body || "(no output)" };
148
+ }
149
+ return {
150
+ ok: false,
151
+ output: prefix(`(exit ${result.exitCode ?? "unknown"})`, body),
152
+ };
153
+ },
154
+ };
155
+ function prefix(status, body) {
156
+ return body.length === 0 ? status : `${status}\n${body}`;
157
+ }
158
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "../types.js";
2
+ export declare const diffTool: Tool;
3
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,QAAQ,EAAE,IA6EtB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { diffStats, linesDiff } from "../diff.js";
3
+ import { PREVIEW_BYTE_CAP, optNum, optStr, safePath, str } from "./_shared.js";
4
+ const DIFF_DEFAULT_MAX_LINES = 60;
5
+ export const diffTool = {
6
+ name: "diff",
7
+ description: "Compare two workspace files, or a workspace file vs inline content, and return a unified-style preview. Use this to see what a proposed change would look like before calling 'write' or 'edit'. Exactly one of 'pathB' or 'content' must be provided.",
8
+ category: "file-read",
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ pathA: { type: "string", description: "Path to the baseline file (workspace-relative or absolute under the workspace root)." },
13
+ pathB: { type: "string", description: "Path to the comparison file. Mutually exclusive with 'content'." },
14
+ content: { type: "string", description: "Inline content to compare against pathA. Mutually exclusive with 'pathB'." },
15
+ maxLines: { type: "number", description: `Cap on diff rows in the preview. Default ${DIFF_DEFAULT_MAX_LINES}.` },
16
+ },
17
+ required: ["pathA"],
18
+ },
19
+ summarize: (args) => {
20
+ const pathA = str(args, "pathA");
21
+ const pathB = optStr(args, "pathB");
22
+ const content = optStr(args, "content");
23
+ if (pathB)
24
+ return `diff ${pathA} vs ${pathB}`;
25
+ if (content !== undefined)
26
+ return `diff ${pathA} vs ⟨${content.length}-byte input⟩`;
27
+ return `diff ${pathA}`;
28
+ },
29
+ async execute(args, ctx) {
30
+ const pathARaw = str(args, "pathA");
31
+ const pathBRaw = optStr(args, "pathB");
32
+ const inlineRaw = optStr(args, "content");
33
+ const maxLines = optNum(args, "maxLines") ?? DIFF_DEFAULT_MAX_LINES;
34
+ if (pathBRaw === undefined && inlineRaw === undefined) {
35
+ return { ok: false, output: "diff requires either 'pathB' or 'content'" };
36
+ }
37
+ if (pathBRaw !== undefined && inlineRaw !== undefined) {
38
+ return { ok: false, output: "diff cannot accept both 'pathB' and 'content'" };
39
+ }
40
+ const pathA = safePath(ctx, pathARaw);
41
+ if (!existsSync(pathA))
42
+ return { ok: false, output: `No such file: ${pathARaw}` };
43
+ const sizeA = statSync(pathA).size;
44
+ let after;
45
+ let afterLabel;
46
+ let afterSize;
47
+ if (pathBRaw !== undefined) {
48
+ const pathB = safePath(ctx, pathBRaw);
49
+ if (!existsSync(pathB))
50
+ return { ok: false, output: `No such file: ${pathBRaw}` };
51
+ afterSize = statSync(pathB).size;
52
+ if (sizeA > PREVIEW_BYTE_CAP || afterSize > PREVIEW_BYTE_CAP) {
53
+ return {
54
+ ok: true,
55
+ output: `${pathARaw} (${sizeA} bytes) vs ${pathBRaw} (${afterSize} bytes) — diff preview skipped (one side over ${PREVIEW_BYTE_CAP} bytes).`,
56
+ };
57
+ }
58
+ after = readFileSync(pathB, "utf8");
59
+ afterLabel = pathBRaw;
60
+ }
61
+ else {
62
+ afterSize = inlineRaw.length;
63
+ if (sizeA > PREVIEW_BYTE_CAP || afterSize > PREVIEW_BYTE_CAP) {
64
+ return {
65
+ ok: true,
66
+ output: `${pathARaw} (${sizeA} bytes) vs ⟨inline⟩ (${afterSize} bytes) — diff preview skipped (one side over ${PREVIEW_BYTE_CAP} bytes).`,
67
+ };
68
+ }
69
+ after = inlineRaw;
70
+ afterLabel = "⟨inline⟩";
71
+ }
72
+ const before = readFileSync(pathA, "utf8");
73
+ if (before === after)
74
+ return { ok: true, output: `${pathARaw} and ${afterLabel} are identical` };
75
+ const { removed, added } = diffStats(before, after);
76
+ const hunk = linesDiff(before, after, maxLines);
77
+ return {
78
+ ok: true,
79
+ output: `--- ${pathARaw}\n+++ ${afterLabel}\n${hunk}\n(${removed} removed, ${added} added)`,
80
+ };
81
+ },
82
+ };
83
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/tools/builtins/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "../types.js";
2
+ export declare const editTool: Tool;
3
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,QAAQ,EAAE,IA8BtB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { native } from "@chances-ai/native";
4
+ import { linesDiff } from "../diff.js";
5
+ import { preview, safePath, str } from "./_shared.js";
6
+ export const editTool = {
7
+ name: "edit",
8
+ description: "Replace an exact, unique substring in a workspace file.",
9
+ category: "file-write",
10
+ parameters: {
11
+ type: "object",
12
+ properties: { path: { type: "string" }, find: { type: "string" }, replace: { type: "string" } },
13
+ required: ["path", "find", "replace"],
14
+ },
15
+ summarize: (args) => {
16
+ const path = str(args, "path");
17
+ const find = str(args, "find");
18
+ const replace = str(args, "replace");
19
+ if (!find.includes("\n") && !replace.includes("\n")) {
20
+ return `edit ${path}: replace ${preview(find)} → ${preview(replace)}`;
21
+ }
22
+ return `edit ${path}\n${linesDiff(find, replace)}`;
23
+ },
24
+ async execute(args, ctx) {
25
+ const path = safePath(ctx, str(args, "path"), { resolveSymlinks: true });
26
+ if (!existsSync(path))
27
+ return { ok: false, output: `No such file: ${str(args, "path")}` };
28
+ const find = str(args, "find");
29
+ const content = readFileSync(path, "utf8");
30
+ const count = content.split(find).length - 1;
31
+ if (count === 0)
32
+ return { ok: false, output: `Substring not found in ${str(args, "path")}` };
33
+ if (count > 1)
34
+ return { ok: false, output: `Substring not unique (${count} matches)` };
35
+ writeFileSync(path, content.replace(find, str(args, "replace")));
36
+ native.invalidateFsScanCache(dirname(path));
37
+ return { ok: true, output: `Edited ${str(args, "path")}` };
38
+ },
39
+ };
40
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/tools/builtins/edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "../types.js";
2
+ export declare const globTool: Tool;
3
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/glob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,QAAQ,EAAE,IAgCtB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { existsSync } from "node:fs";
2
+ import { native } from "@chances-ai/native";
3
+ import { optNum, optStr, safePath, str } from "./_shared.js";
4
+ const GLOB_DEFAULT_LIMIT = 100;
5
+ export const globTool = {
6
+ name: "glob",
7
+ description: "List workspace files matching a glob pattern (e.g. '**/*.ts', 'src/**/*.tsx'). Honors common ignore directories (node_modules, .git, dist, target, .turbo).",
8
+ category: "search",
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ pattern: { type: "string", description: "Glob pattern to match against relative file paths." },
13
+ path: { type: "string", description: "Sub-path within the workspace to search. Defaults to the workspace root." },
14
+ limit: { type: "number", description: `Max paths returned. Default ${GLOB_DEFAULT_LIMIT}.` },
15
+ },
16
+ required: ["pattern"],
17
+ },
18
+ summarize: (args) => {
19
+ const where = optStr(args, "path");
20
+ return `glob ${str(args, "pattern")}${where ? ` in ${where}` : ""}`;
21
+ },
22
+ async execute(args, ctx) {
23
+ const pattern = str(args, "pattern");
24
+ const subPath = optStr(args, "path");
25
+ const limit = optNum(args, "limit") ?? GLOB_DEFAULT_LIMIT;
26
+ const searchRoot = subPath ? safePath(ctx, subPath) : ctx.workspaceRoot;
27
+ if (!existsSync(searchRoot))
28
+ return { ok: false, output: `No such path: ${subPath}` };
29
+ const files = await native.glob(pattern, searchRoot, { maxResults: limit + 1, signal: ctx.signal });
30
+ if (files.length === 0)
31
+ return { ok: true, output: "No files matched" };
32
+ const shown = files.slice(0, limit);
33
+ const more = files.length > limit ? `\n…(more results, raise limit to see them)` : "";
34
+ return { ok: true, output: shown.join("\n") + more };
35
+ },
36
+ };
37
+ //# sourceMappingURL=glob.js.map