@ikarmic/forge-core 4.4.0 → 5.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 (573) hide show
  1. package/LICENSE +44 -21
  2. package/README.md +2 -2
  3. package/dist/agent/agent.d.ts +0 -1
  4. package/dist/agent/agent.js +84 -32
  5. package/dist/agent/architect.d.ts +3 -1
  6. package/dist/agent/architect.js +1 -1
  7. package/dist/agent/cache-hints.d.ts +0 -1
  8. package/dist/agent/cache-hints.js +0 -1
  9. package/dist/agent/cost-router.d.ts +0 -1
  10. package/dist/agent/cost-router.js +2 -1
  11. package/dist/agent/enhance-prompt.d.ts +7 -0
  12. package/dist/agent/enhance-prompt.js +30 -0
  13. package/dist/agent/index.d.ts +0 -1
  14. package/dist/agent/index.js +0 -1
  15. package/dist/agent/loop-guard.d.ts +21 -0
  16. package/dist/agent/loop-guard.js +41 -0
  17. package/dist/agent/prompts.d.ts +0 -1
  18. package/dist/agent/prompts.js +0 -1
  19. package/dist/agent/think-tags.d.ts +0 -1
  20. package/dist/agent/think-tags.js +0 -1
  21. package/dist/agent/verify.d.ts +0 -1
  22. package/dist/agent/verify.js +0 -1
  23. package/dist/ai-comments/index.d.ts +0 -1
  24. package/dist/ai-comments/index.js +0 -1
  25. package/dist/attachments.d.ts +46 -0
  26. package/dist/attachments.js +178 -0
  27. package/dist/browser/cdp.d.ts +0 -1
  28. package/dist/browser/cdp.js +0 -1
  29. package/dist/browser/chrome.d.ts +0 -1
  30. package/dist/browser/chrome.js +0 -1
  31. package/dist/browser/session.d.ts +0 -1
  32. package/dist/browser/session.js +0 -1
  33. package/dist/checkpoints/index.d.ts +0 -1
  34. package/dist/checkpoints/index.js +0 -1
  35. package/dist/checkpoints/store.d.ts +0 -1
  36. package/dist/checkpoints/store.js +0 -1
  37. package/dist/checkpoints/types.d.ts +0 -1
  38. package/dist/checkpoints/types.js +0 -1
  39. package/dist/code-index/builder.d.ts +0 -1
  40. package/dist/code-index/builder.js +4 -1
  41. package/dist/code-index/index-store.d.ts +0 -1
  42. package/dist/code-index/index-store.js +0 -1
  43. package/dist/code-index/parser.d.ts +0 -1
  44. package/dist/code-index/parser.js +0 -1
  45. package/dist/code-index/types.d.ts +0 -1
  46. package/dist/code-index/types.js +0 -1
  47. package/dist/commands/custom-commands.d.ts +24 -0
  48. package/dist/commands/custom-commands.js +98 -0
  49. package/dist/config-file.d.ts +4 -1
  50. package/dist/config-file.js +0 -1
  51. package/dist/config.d.ts +0 -1
  52. package/dist/config.js +0 -1
  53. package/dist/context/compaction.d.ts +0 -1
  54. package/dist/context/compaction.js +17 -3
  55. package/dist/context/mask.d.ts +0 -1
  56. package/dist/context/mask.js +1 -2
  57. package/dist/credentials/index.d.ts +0 -1
  58. package/dist/credentials/index.js +0 -1
  59. package/dist/credentials/types.d.ts +0 -1
  60. package/dist/credentials/types.js +0 -1
  61. package/dist/diff/index.d.ts +0 -1
  62. package/dist/diff/index.js +0 -1
  63. package/dist/diff/unified-diff.d.ts +0 -1
  64. package/dist/diff/unified-diff.js +42 -16
  65. package/dist/git/auto-commit.d.ts +1 -2
  66. package/dist/git/auto-commit.js +17 -5
  67. package/dist/git/index.d.ts +0 -1
  68. package/dist/git/index.js +0 -1
  69. package/dist/github/github-tools.d.ts +83 -0
  70. package/dist/github/github-tools.js +175 -0
  71. package/dist/hooks/agent-runner.d.ts +0 -1
  72. package/dist/hooks/agent-runner.js +0 -1
  73. package/dist/hooks/bus.d.ts +0 -1
  74. package/dist/hooks/bus.js +0 -1
  75. package/dist/hooks/config.d.ts +0 -1
  76. package/dist/hooks/config.js +0 -1
  77. package/dist/hooks/events.d.ts +0 -1
  78. package/dist/hooks/events.js +0 -1
  79. package/dist/hooks/index.d.ts +0 -1
  80. package/dist/hooks/index.js +0 -1
  81. package/dist/hooks/loader.d.ts +0 -1
  82. package/dist/hooks/loader.js +0 -1
  83. package/dist/hooks/runner.d.ts +0 -1
  84. package/dist/hooks/runner.js +0 -1
  85. package/dist/hooks/watch-coalescer.d.ts +0 -1
  86. package/dist/hooks/watch-coalescer.js +0 -1
  87. package/dist/hooks/watch-ignore.d.ts +0 -1
  88. package/dist/hooks/watch-ignore.js +0 -1
  89. package/dist/hooks/watcher.d.ts +0 -1
  90. package/dist/hooks/watcher.js +0 -1
  91. package/dist/index.d.ts +21 -9
  92. package/dist/index.js +16 -5
  93. package/dist/lazy-model.d.ts +0 -1
  94. package/dist/lazy-model.js +0 -1
  95. package/dist/lint/auto-lint.d.ts +0 -1
  96. package/dist/lint/auto-lint.js +0 -1
  97. package/dist/lint/index.d.ts +0 -1
  98. package/dist/lint/index.js +0 -1
  99. package/dist/lsp/client.d.ts +0 -1
  100. package/dist/lsp/client.js +0 -1
  101. package/dist/lsp/diagnostics.d.ts +0 -1
  102. package/dist/lsp/diagnostics.js +0 -1
  103. package/dist/lsp/index.d.ts +0 -1
  104. package/dist/lsp/index.js +0 -1
  105. package/dist/mcp/catalog.d.ts +0 -1
  106. package/dist/mcp/catalog.js +0 -1
  107. package/dist/mcp/index.d.ts +0 -1
  108. package/dist/mcp/index.js +0 -1
  109. package/dist/mcp/json-schema-to-zod.d.ts +0 -1
  110. package/dist/mcp/json-schema-to-zod.js +0 -1
  111. package/dist/mcp/manager.d.ts +0 -1
  112. package/dist/mcp/manager.js +0 -1
  113. package/dist/mcp/marketplace-types.d.ts +0 -1
  114. package/dist/mcp/marketplace-types.js +0 -1
  115. package/dist/mcp/marketplace.d.ts +0 -1
  116. package/dist/mcp/marketplace.js +0 -1
  117. package/dist/mcp/mcp-client.d.ts +0 -1
  118. package/dist/mcp/mcp-client.js +0 -1
  119. package/dist/mcp/mcp-config.d.ts +0 -1
  120. package/dist/mcp/mcp-config.js +0 -1
  121. package/dist/mcp/registry.d.ts +0 -1
  122. package/dist/mcp/registry.js +0 -1
  123. package/dist/memory/memory-store.d.ts +57 -11
  124. package/dist/memory/memory-store.js +236 -70
  125. package/dist/memory/rank.d.ts +20 -0
  126. package/dist/memory/rank.js +64 -0
  127. package/dist/memory/stale.d.ts +18 -0
  128. package/dist/memory/stale.js +45 -0
  129. package/dist/model-alias.d.ts +0 -1
  130. package/dist/model-alias.js +0 -1
  131. package/dist/model-catalog.d.ts +0 -1
  132. package/dist/model-catalog.js +0 -1
  133. package/dist/model-list.d.ts +0 -1
  134. package/dist/model-list.js +0 -1
  135. package/dist/orchestrator/board-tools.d.ts +0 -1
  136. package/dist/orchestrator/board-tools.js +0 -1
  137. package/dist/orchestrator/board.d.ts +0 -1
  138. package/dist/orchestrator/board.js +0 -1
  139. package/dist/orchestrator/index.d.ts +0 -1
  140. package/dist/orchestrator/index.js +0 -1
  141. package/dist/orchestrator/orchestrator.d.ts +0 -1
  142. package/dist/orchestrator/orchestrator.js +0 -1
  143. package/dist/orchestrator/router.d.ts +0 -1
  144. package/dist/orchestrator/router.js +0 -1
  145. package/dist/orchestrator/specialists-registry.d.ts +0 -1
  146. package/dist/orchestrator/specialists-registry.js +0 -1
  147. package/dist/orchestrator/specialists.d.ts +0 -1
  148. package/dist/orchestrator/specialists.js +5 -6
  149. package/dist/orchestrator/types.d.ts +0 -1
  150. package/dist/orchestrator/types.js +0 -1
  151. package/dist/plugins/index.d.ts +0 -1
  152. package/dist/plugins/index.js +0 -1
  153. package/dist/plugins/install.d.ts +0 -1
  154. package/dist/plugins/install.js +0 -1
  155. package/dist/plugins/loader.d.ts +0 -1
  156. package/dist/plugins/loader.js +0 -1
  157. package/dist/policy/audit.d.ts +0 -1
  158. package/dist/policy/audit.js +0 -1
  159. package/dist/policy/policy.d.ts +0 -1
  160. package/dist/policy/policy.js +0 -1
  161. package/dist/policy/proxy.d.ts +0 -1
  162. package/dist/policy/proxy.js +0 -1
  163. package/dist/pricing.d.ts +0 -1
  164. package/dist/pricing.js +0 -1
  165. package/dist/providers.d.ts +0 -1
  166. package/dist/providers.js +0 -1
  167. package/dist/repomap/index.d.ts +0 -1
  168. package/dist/repomap/index.js +0 -1
  169. package/dist/repomap/repo-map.d.ts +0 -1
  170. package/dist/repomap/repo-map.js +0 -1
  171. package/dist/semantic/chunker.d.ts +0 -1
  172. package/dist/semantic/chunker.js +0 -1
  173. package/dist/semantic/embedder.d.ts +0 -1
  174. package/dist/semantic/embedder.js +0 -1
  175. package/dist/semantic/semantic-index.d.ts +0 -1
  176. package/dist/semantic/semantic-index.js +4 -1
  177. package/dist/semantic/vector-store.d.ts +0 -1
  178. package/dist/semantic/vector-store.js +0 -1
  179. package/dist/sessions/index.d.ts +2 -1
  180. package/dist/sessions/index.js +2 -1
  181. package/dist/sessions/prune.d.ts +23 -0
  182. package/dist/sessions/prune.js +35 -0
  183. package/dist/sessions/search.d.ts +22 -0
  184. package/dist/sessions/search.js +66 -0
  185. package/dist/sessions/session-export.d.ts +0 -1
  186. package/dist/sessions/session-export.js +0 -1
  187. package/dist/sessions/session-store.d.ts +0 -1
  188. package/dist/sessions/session-store.js +0 -1
  189. package/dist/sessions/watch.d.ts +0 -1
  190. package/dist/sessions/watch.js +0 -1
  191. package/dist/settings-export.d.ts +0 -1
  192. package/dist/settings-export.js +0 -1
  193. package/dist/skills/activator.d.ts +0 -1
  194. package/dist/skills/activator.js +0 -1
  195. package/dist/skills/index.d.ts +0 -1
  196. package/dist/skills/index.js +0 -1
  197. package/dist/skills/loader.d.ts +0 -1
  198. package/dist/skills/loader.js +0 -1
  199. package/dist/skills/marketplace-types.d.ts +0 -1
  200. package/dist/skills/marketplace-types.js +0 -1
  201. package/dist/skills/marketplace.d.ts +0 -1
  202. package/dist/skills/marketplace.js +0 -1
  203. package/dist/skills/parser.d.ts +0 -1
  204. package/dist/skills/parser.js +0 -1
  205. package/dist/skills/types.d.ts +0 -1
  206. package/dist/skills/types.js +0 -1
  207. package/dist/specs/generate.d.ts +0 -1
  208. package/dist/specs/generate.js +0 -1
  209. package/dist/specs/index.d.ts +2 -1
  210. package/dist/specs/index.js +1 -1
  211. package/dist/specs/store.d.ts +7 -1
  212. package/dist/specs/store.js +33 -1
  213. package/dist/specs/sync.d.ts +29 -0
  214. package/dist/specs/sync.js +155 -0
  215. package/dist/specs/tasks-parser.d.ts +0 -1
  216. package/dist/specs/tasks-parser.js +0 -1
  217. package/dist/specs/types.d.ts +2 -1
  218. package/dist/specs/types.js +0 -1
  219. package/dist/steering/glob.d.ts +0 -1
  220. package/dist/steering/glob.js +0 -1
  221. package/dist/steering/index.d.ts +0 -1
  222. package/dist/steering/index.js +0 -1
  223. package/dist/steering/loader.d.ts +0 -1
  224. package/dist/steering/loader.js +0 -1
  225. package/dist/steering/project-instructions.d.ts +0 -1
  226. package/dist/steering/project-instructions.js +0 -1
  227. package/dist/steering/select.d.ts +0 -1
  228. package/dist/steering/select.js +0 -1
  229. package/dist/steering/types.d.ts +0 -1
  230. package/dist/steering/types.js +0 -1
  231. package/dist/structured/index.d.ts +0 -1
  232. package/dist/structured/index.js +0 -1
  233. package/dist/structured/retry.d.ts +0 -1
  234. package/dist/structured/retry.js +0 -1
  235. package/dist/structured/schema.d.ts +0 -1
  236. package/dist/structured/schema.js +0 -1
  237. package/dist/tools/browser-tools.d.ts +0 -1
  238. package/dist/tools/browser-tools.js +0 -1
  239. package/dist/tools/codebase-search.d.ts +0 -1
  240. package/dist/tools/codebase-search.js +0 -1
  241. package/dist/tools/command-allow.d.ts +0 -1
  242. package/dist/tools/command-allow.js +0 -1
  243. package/dist/tools/edit-file.d.ts +0 -1
  244. package/dist/tools/edit-file.js +0 -1
  245. package/dist/tools/fetch-url.d.ts +0 -1
  246. package/dist/tools/fetch-url.js +0 -1
  247. package/dist/tools/find-references.d.ts +0 -1
  248. package/dist/tools/find-references.js +0 -1
  249. package/dist/tools/find-symbol.d.ts +0 -1
  250. package/dist/tools/find-symbol.js +0 -1
  251. package/dist/tools/ignore-rules.d.ts +15 -0
  252. package/dist/tools/ignore-rules.js +84 -0
  253. package/dist/tools/index.d.ts +3 -3
  254. package/dist/tools/index.js +5 -3
  255. package/dist/tools/list-files.d.ts +3 -1
  256. package/dist/tools/list-files.js +8 -1
  257. package/dist/tools/list-symbols.d.ts +0 -1
  258. package/dist/tools/list-symbols.js +0 -1
  259. package/dist/tools/memory.d.ts +34 -2
  260. package/dist/tools/memory.js +118 -26
  261. package/dist/tools/notebook.d.ts +69 -0
  262. package/dist/tools/notebook.js +163 -0
  263. package/dist/tools/policy.d.ts +0 -1
  264. package/dist/tools/policy.js +0 -1
  265. package/dist/tools/read-file.d.ts +8 -2
  266. package/dist/tools/read-file.js +19 -2
  267. package/dist/tools/read-image.d.ts +0 -1
  268. package/dist/tools/read-image.js +0 -1
  269. package/dist/tools/read-only.d.ts +0 -1
  270. package/dist/tools/read-only.js +0 -1
  271. package/dist/tools/redact.d.ts +0 -1
  272. package/dist/tools/redact.js +0 -1
  273. package/dist/tools/result-cache.d.ts +0 -1
  274. package/dist/tools/result-cache.js +0 -1
  275. package/dist/tools/run-command.d.ts +0 -1
  276. package/dist/tools/run-command.js +0 -1
  277. package/dist/tools/sandbox-loader.d.ts +0 -1
  278. package/dist/tools/sandbox-loader.js +0 -1
  279. package/dist/tools/search-files.d.ts +5 -3
  280. package/dist/tools/search-files.js +8 -1
  281. package/dist/tools/shared.d.ts +0 -1
  282. package/dist/tools/shared.js +0 -1
  283. package/dist/tools/sub-agent.d.ts +0 -1
  284. package/dist/tools/sub-agent.js +0 -1
  285. package/dist/tools/web-search.d.ts +55 -0
  286. package/dist/tools/web-search.js +131 -0
  287. package/dist/tools/write-file.d.ts +0 -1
  288. package/dist/tools/write-file.js +0 -1
  289. package/dist/types.d.ts +43 -2
  290. package/dist/types.js +0 -1
  291. package/dist/verify/detect.d.ts +0 -1
  292. package/dist/verify/detect.js +0 -1
  293. package/dist/verify/index.d.ts +0 -1
  294. package/dist/verify/index.js +0 -1
  295. package/dist/worktree/branch-ops.d.ts +0 -1
  296. package/dist/worktree/branch-ops.js +0 -1
  297. package/dist/worktree/index.d.ts +0 -1
  298. package/dist/worktree/index.js +0 -1
  299. package/dist/worktree/worktree.d.ts +0 -1
  300. package/dist/worktree/worktree.js +0 -1
  301. package/package.json +4 -2
  302. package/dist/agent/agent.d.ts.map +0 -1
  303. package/dist/agent/agent.js.map +0 -1
  304. package/dist/agent/architect.d.ts.map +0 -1
  305. package/dist/agent/architect.js.map +0 -1
  306. package/dist/agent/cache-hints.d.ts.map +0 -1
  307. package/dist/agent/cache-hints.js.map +0 -1
  308. package/dist/agent/cost-router.d.ts.map +0 -1
  309. package/dist/agent/cost-router.js.map +0 -1
  310. package/dist/agent/index.d.ts.map +0 -1
  311. package/dist/agent/index.js.map +0 -1
  312. package/dist/agent/prompts.d.ts.map +0 -1
  313. package/dist/agent/prompts.js.map +0 -1
  314. package/dist/agent/think-tags.d.ts.map +0 -1
  315. package/dist/agent/think-tags.js.map +0 -1
  316. package/dist/agent/verify.d.ts.map +0 -1
  317. package/dist/agent/verify.js.map +0 -1
  318. package/dist/ai-comments/index.d.ts.map +0 -1
  319. package/dist/ai-comments/index.js.map +0 -1
  320. package/dist/browser/cdp.d.ts.map +0 -1
  321. package/dist/browser/cdp.js.map +0 -1
  322. package/dist/browser/chrome.d.ts.map +0 -1
  323. package/dist/browser/chrome.js.map +0 -1
  324. package/dist/browser/session.d.ts.map +0 -1
  325. package/dist/browser/session.js.map +0 -1
  326. package/dist/checkpoints/index.d.ts.map +0 -1
  327. package/dist/checkpoints/index.js.map +0 -1
  328. package/dist/checkpoints/store.d.ts.map +0 -1
  329. package/dist/checkpoints/store.js.map +0 -1
  330. package/dist/checkpoints/types.d.ts.map +0 -1
  331. package/dist/checkpoints/types.js.map +0 -1
  332. package/dist/code-index/builder.d.ts.map +0 -1
  333. package/dist/code-index/builder.js.map +0 -1
  334. package/dist/code-index/index-store.d.ts.map +0 -1
  335. package/dist/code-index/index-store.js.map +0 -1
  336. package/dist/code-index/parser.d.ts.map +0 -1
  337. package/dist/code-index/parser.js.map +0 -1
  338. package/dist/code-index/types.d.ts.map +0 -1
  339. package/dist/code-index/types.js.map +0 -1
  340. package/dist/config-file.d.ts.map +0 -1
  341. package/dist/config-file.js.map +0 -1
  342. package/dist/config.d.ts.map +0 -1
  343. package/dist/config.js.map +0 -1
  344. package/dist/context/compaction.d.ts.map +0 -1
  345. package/dist/context/compaction.js.map +0 -1
  346. package/dist/context/mask.d.ts.map +0 -1
  347. package/dist/context/mask.js.map +0 -1
  348. package/dist/credentials/index.d.ts.map +0 -1
  349. package/dist/credentials/index.js.map +0 -1
  350. package/dist/credentials/types.d.ts.map +0 -1
  351. package/dist/credentials/types.js.map +0 -1
  352. package/dist/diff/index.d.ts.map +0 -1
  353. package/dist/diff/index.js.map +0 -1
  354. package/dist/diff/unified-diff.d.ts.map +0 -1
  355. package/dist/diff/unified-diff.js.map +0 -1
  356. package/dist/git/auto-commit.d.ts.map +0 -1
  357. package/dist/git/auto-commit.js.map +0 -1
  358. package/dist/git/index.d.ts.map +0 -1
  359. package/dist/git/index.js.map +0 -1
  360. package/dist/hooks/agent-runner.d.ts.map +0 -1
  361. package/dist/hooks/agent-runner.js.map +0 -1
  362. package/dist/hooks/bus.d.ts.map +0 -1
  363. package/dist/hooks/bus.js.map +0 -1
  364. package/dist/hooks/config.d.ts.map +0 -1
  365. package/dist/hooks/config.js.map +0 -1
  366. package/dist/hooks/events.d.ts.map +0 -1
  367. package/dist/hooks/events.js.map +0 -1
  368. package/dist/hooks/index.d.ts.map +0 -1
  369. package/dist/hooks/index.js.map +0 -1
  370. package/dist/hooks/loader.d.ts.map +0 -1
  371. package/dist/hooks/loader.js.map +0 -1
  372. package/dist/hooks/runner.d.ts.map +0 -1
  373. package/dist/hooks/runner.js.map +0 -1
  374. package/dist/hooks/watch-coalescer.d.ts.map +0 -1
  375. package/dist/hooks/watch-coalescer.js.map +0 -1
  376. package/dist/hooks/watch-ignore.d.ts.map +0 -1
  377. package/dist/hooks/watch-ignore.js.map +0 -1
  378. package/dist/hooks/watcher.d.ts.map +0 -1
  379. package/dist/hooks/watcher.js.map +0 -1
  380. package/dist/index.d.ts.map +0 -1
  381. package/dist/index.js.map +0 -1
  382. package/dist/lazy-model.d.ts.map +0 -1
  383. package/dist/lazy-model.js.map +0 -1
  384. package/dist/lint/auto-lint.d.ts.map +0 -1
  385. package/dist/lint/auto-lint.js.map +0 -1
  386. package/dist/lint/index.d.ts.map +0 -1
  387. package/dist/lint/index.js.map +0 -1
  388. package/dist/lsp/client.d.ts.map +0 -1
  389. package/dist/lsp/client.js.map +0 -1
  390. package/dist/lsp/diagnostics.d.ts.map +0 -1
  391. package/dist/lsp/diagnostics.js.map +0 -1
  392. package/dist/lsp/index.d.ts.map +0 -1
  393. package/dist/lsp/index.js.map +0 -1
  394. package/dist/mcp/catalog.d.ts.map +0 -1
  395. package/dist/mcp/catalog.js.map +0 -1
  396. package/dist/mcp/index.d.ts.map +0 -1
  397. package/dist/mcp/index.js.map +0 -1
  398. package/dist/mcp/json-schema-to-zod.d.ts.map +0 -1
  399. package/dist/mcp/json-schema-to-zod.js.map +0 -1
  400. package/dist/mcp/manager.d.ts.map +0 -1
  401. package/dist/mcp/manager.js.map +0 -1
  402. package/dist/mcp/marketplace-types.d.ts.map +0 -1
  403. package/dist/mcp/marketplace-types.js.map +0 -1
  404. package/dist/mcp/marketplace.d.ts.map +0 -1
  405. package/dist/mcp/marketplace.js.map +0 -1
  406. package/dist/mcp/mcp-client.d.ts.map +0 -1
  407. package/dist/mcp/mcp-client.js.map +0 -1
  408. package/dist/mcp/mcp-config.d.ts.map +0 -1
  409. package/dist/mcp/mcp-config.js.map +0 -1
  410. package/dist/mcp/registry.d.ts.map +0 -1
  411. package/dist/mcp/registry.js.map +0 -1
  412. package/dist/memory/memory-store.d.ts.map +0 -1
  413. package/dist/memory/memory-store.js.map +0 -1
  414. package/dist/model-alias.d.ts.map +0 -1
  415. package/dist/model-alias.js.map +0 -1
  416. package/dist/model-catalog.d.ts.map +0 -1
  417. package/dist/model-catalog.js.map +0 -1
  418. package/dist/model-list.d.ts.map +0 -1
  419. package/dist/model-list.js.map +0 -1
  420. package/dist/orchestrator/board-tools.d.ts.map +0 -1
  421. package/dist/orchestrator/board-tools.js.map +0 -1
  422. package/dist/orchestrator/board.d.ts.map +0 -1
  423. package/dist/orchestrator/board.js.map +0 -1
  424. package/dist/orchestrator/index.d.ts.map +0 -1
  425. package/dist/orchestrator/index.js.map +0 -1
  426. package/dist/orchestrator/orchestrator.d.ts.map +0 -1
  427. package/dist/orchestrator/orchestrator.js.map +0 -1
  428. package/dist/orchestrator/router.d.ts.map +0 -1
  429. package/dist/orchestrator/router.js.map +0 -1
  430. package/dist/orchestrator/specialists-registry.d.ts.map +0 -1
  431. package/dist/orchestrator/specialists-registry.js.map +0 -1
  432. package/dist/orchestrator/specialists.d.ts.map +0 -1
  433. package/dist/orchestrator/specialists.js.map +0 -1
  434. package/dist/orchestrator/types.d.ts.map +0 -1
  435. package/dist/orchestrator/types.js.map +0 -1
  436. package/dist/plugins/index.d.ts.map +0 -1
  437. package/dist/plugins/index.js.map +0 -1
  438. package/dist/plugins/install.d.ts.map +0 -1
  439. package/dist/plugins/install.js.map +0 -1
  440. package/dist/plugins/loader.d.ts.map +0 -1
  441. package/dist/plugins/loader.js.map +0 -1
  442. package/dist/policy/audit.d.ts.map +0 -1
  443. package/dist/policy/audit.js.map +0 -1
  444. package/dist/policy/policy.d.ts.map +0 -1
  445. package/dist/policy/policy.js.map +0 -1
  446. package/dist/policy/proxy.d.ts.map +0 -1
  447. package/dist/policy/proxy.js.map +0 -1
  448. package/dist/pricing.d.ts.map +0 -1
  449. package/dist/pricing.js.map +0 -1
  450. package/dist/providers.d.ts.map +0 -1
  451. package/dist/providers.js.map +0 -1
  452. package/dist/repomap/index.d.ts.map +0 -1
  453. package/dist/repomap/index.js.map +0 -1
  454. package/dist/repomap/repo-map.d.ts.map +0 -1
  455. package/dist/repomap/repo-map.js.map +0 -1
  456. package/dist/semantic/chunker.d.ts.map +0 -1
  457. package/dist/semantic/chunker.js.map +0 -1
  458. package/dist/semantic/embedder.d.ts.map +0 -1
  459. package/dist/semantic/embedder.js.map +0 -1
  460. package/dist/semantic/semantic-index.d.ts.map +0 -1
  461. package/dist/semantic/semantic-index.js.map +0 -1
  462. package/dist/semantic/vector-store.d.ts.map +0 -1
  463. package/dist/semantic/vector-store.js.map +0 -1
  464. package/dist/sessions/index.d.ts.map +0 -1
  465. package/dist/sessions/index.js.map +0 -1
  466. package/dist/sessions/session-export.d.ts.map +0 -1
  467. package/dist/sessions/session-export.js.map +0 -1
  468. package/dist/sessions/session-store.d.ts.map +0 -1
  469. package/dist/sessions/session-store.js.map +0 -1
  470. package/dist/sessions/watch.d.ts.map +0 -1
  471. package/dist/sessions/watch.js.map +0 -1
  472. package/dist/settings-export.d.ts.map +0 -1
  473. package/dist/settings-export.js.map +0 -1
  474. package/dist/skills/activator.d.ts.map +0 -1
  475. package/dist/skills/activator.js.map +0 -1
  476. package/dist/skills/index.d.ts.map +0 -1
  477. package/dist/skills/index.js.map +0 -1
  478. package/dist/skills/loader.d.ts.map +0 -1
  479. package/dist/skills/loader.js.map +0 -1
  480. package/dist/skills/marketplace-types.d.ts.map +0 -1
  481. package/dist/skills/marketplace-types.js.map +0 -1
  482. package/dist/skills/marketplace.d.ts.map +0 -1
  483. package/dist/skills/marketplace.js.map +0 -1
  484. package/dist/skills/parser.d.ts.map +0 -1
  485. package/dist/skills/parser.js.map +0 -1
  486. package/dist/skills/types.d.ts.map +0 -1
  487. package/dist/skills/types.js.map +0 -1
  488. package/dist/specs/generate.d.ts.map +0 -1
  489. package/dist/specs/generate.js.map +0 -1
  490. package/dist/specs/index.d.ts.map +0 -1
  491. package/dist/specs/index.js.map +0 -1
  492. package/dist/specs/store.d.ts.map +0 -1
  493. package/dist/specs/store.js.map +0 -1
  494. package/dist/specs/tasks-parser.d.ts.map +0 -1
  495. package/dist/specs/tasks-parser.js.map +0 -1
  496. package/dist/specs/types.d.ts.map +0 -1
  497. package/dist/specs/types.js.map +0 -1
  498. package/dist/steering/glob.d.ts.map +0 -1
  499. package/dist/steering/glob.js.map +0 -1
  500. package/dist/steering/index.d.ts.map +0 -1
  501. package/dist/steering/index.js.map +0 -1
  502. package/dist/steering/loader.d.ts.map +0 -1
  503. package/dist/steering/loader.js.map +0 -1
  504. package/dist/steering/project-instructions.d.ts.map +0 -1
  505. package/dist/steering/project-instructions.js.map +0 -1
  506. package/dist/steering/select.d.ts.map +0 -1
  507. package/dist/steering/select.js.map +0 -1
  508. package/dist/steering/types.d.ts.map +0 -1
  509. package/dist/steering/types.js.map +0 -1
  510. package/dist/structured/index.d.ts.map +0 -1
  511. package/dist/structured/index.js.map +0 -1
  512. package/dist/structured/retry.d.ts.map +0 -1
  513. package/dist/structured/retry.js.map +0 -1
  514. package/dist/structured/schema.d.ts.map +0 -1
  515. package/dist/structured/schema.js.map +0 -1
  516. package/dist/tools/browser-tools.d.ts.map +0 -1
  517. package/dist/tools/browser-tools.js.map +0 -1
  518. package/dist/tools/codebase-search.d.ts.map +0 -1
  519. package/dist/tools/codebase-search.js.map +0 -1
  520. package/dist/tools/command-allow.d.ts.map +0 -1
  521. package/dist/tools/command-allow.js.map +0 -1
  522. package/dist/tools/edit-file.d.ts.map +0 -1
  523. package/dist/tools/edit-file.js.map +0 -1
  524. package/dist/tools/fetch-url.d.ts.map +0 -1
  525. package/dist/tools/fetch-url.js.map +0 -1
  526. package/dist/tools/find-references.d.ts.map +0 -1
  527. package/dist/tools/find-references.js.map +0 -1
  528. package/dist/tools/find-symbol.d.ts.map +0 -1
  529. package/dist/tools/find-symbol.js.map +0 -1
  530. package/dist/tools/index.d.ts.map +0 -1
  531. package/dist/tools/index.js.map +0 -1
  532. package/dist/tools/list-files.d.ts.map +0 -1
  533. package/dist/tools/list-files.js.map +0 -1
  534. package/dist/tools/list-symbols.d.ts.map +0 -1
  535. package/dist/tools/list-symbols.js.map +0 -1
  536. package/dist/tools/memory.d.ts.map +0 -1
  537. package/dist/tools/memory.js.map +0 -1
  538. package/dist/tools/policy.d.ts.map +0 -1
  539. package/dist/tools/policy.js.map +0 -1
  540. package/dist/tools/read-file.d.ts.map +0 -1
  541. package/dist/tools/read-file.js.map +0 -1
  542. package/dist/tools/read-image.d.ts.map +0 -1
  543. package/dist/tools/read-image.js.map +0 -1
  544. package/dist/tools/read-only.d.ts.map +0 -1
  545. package/dist/tools/read-only.js.map +0 -1
  546. package/dist/tools/redact.d.ts.map +0 -1
  547. package/dist/tools/redact.js.map +0 -1
  548. package/dist/tools/result-cache.d.ts.map +0 -1
  549. package/dist/tools/result-cache.js.map +0 -1
  550. package/dist/tools/run-command.d.ts.map +0 -1
  551. package/dist/tools/run-command.js.map +0 -1
  552. package/dist/tools/sandbox-loader.d.ts.map +0 -1
  553. package/dist/tools/sandbox-loader.js.map +0 -1
  554. package/dist/tools/search-files.d.ts.map +0 -1
  555. package/dist/tools/search-files.js.map +0 -1
  556. package/dist/tools/shared.d.ts.map +0 -1
  557. package/dist/tools/shared.js.map +0 -1
  558. package/dist/tools/sub-agent.d.ts.map +0 -1
  559. package/dist/tools/sub-agent.js.map +0 -1
  560. package/dist/tools/write-file.d.ts.map +0 -1
  561. package/dist/tools/write-file.js.map +0 -1
  562. package/dist/types.d.ts.map +0 -1
  563. package/dist/types.js.map +0 -1
  564. package/dist/verify/detect.d.ts.map +0 -1
  565. package/dist/verify/detect.js.map +0 -1
  566. package/dist/verify/index.d.ts.map +0 -1
  567. package/dist/verify/index.js.map +0 -1
  568. package/dist/worktree/branch-ops.d.ts.map +0 -1
  569. package/dist/worktree/branch-ops.js.map +0 -1
  570. package/dist/worktree/index.d.ts.map +0 -1
  571. package/dist/worktree/index.js.map +0 -1
  572. package/dist/worktree/worktree.d.ts.map +0 -1
  573. package/dist/worktree/worktree.js.map +0 -1
@@ -106,4 +106,3 @@ export function redact(text, options) {
106
106
  export function countRedactions(text, options) {
107
107
  return redact(text, options).total;
108
108
  }
109
- //# sourceMappingURL=redact.js.map
@@ -66,4 +66,3 @@ export declare class ToolResultCache {
66
66
  * intentionally don't cache destructive tools by default.
67
67
  */
68
68
  export declare function cachedExecute<TArgs, TResult>(toolName: string, execute: (args: TArgs, ctx: ToolContext) => Promise<TResult>, cache: ToolResultCache, ctx: ToolContext): (args: TArgs, ctx: ToolContext) => Promise<TResult>;
69
- //# sourceMappingURL=result-cache.d.ts.map
@@ -133,4 +133,3 @@ export function cachedExecute(toolName, execute, cache, ctx) {
133
133
  return value;
134
134
  };
135
135
  }
136
- //# sourceMappingURL=result-cache.js.map
@@ -32,4 +32,3 @@ export interface RunCommandResult {
32
32
  }
33
33
  export declare const runCommandTool: ToolDefinition<z.infer<typeof params>, RunCommandResult>;
34
34
  export {};
35
- //# sourceMappingURL=run-command.d.ts.map
@@ -145,4 +145,3 @@ function clampOutput(text) {
145
145
  `\n\n... (${text.length - MAX_OUTPUT_CHARS} characters truncated) ...\n\n` +
146
146
  text.slice(text.length - half));
147
147
  }
148
- //# sourceMappingURL=run-command.js.map
@@ -21,4 +21,3 @@ export declare function loadToolSandboxConfig(cwd: string, opts: {
21
21
  * this function, matching its manually-edited, untrusted-by-default role.
22
22
  */
23
23
  export declare function saveToolSandboxConfig(sandbox: SerializedToolSandbox, settingsPath?: string): Promise<void>;
24
- //# sourceMappingURL=sandbox-loader.d.ts.map
@@ -130,4 +130,3 @@ export async function saveToolSandboxConfig(sandbox, settingsPath) {
130
130
  await mkdir(path.dirname(filePath), { recursive: true });
131
131
  await writeFile(filePath, JSON.stringify(merged, null, 2) + '\n', 'utf8');
132
132
  }
133
- //# sourceMappingURL=sandbox-loader.js.map
@@ -6,19 +6,22 @@ declare const params: z.ZodObject<{
6
6
  include: z.ZodOptional<z.ZodString>;
7
7
  /** Maximum matches to return. Default 200. */
8
8
  max_results: z.ZodOptional<z.ZodNumber>;
9
+ include_ignored: z.ZodOptional<z.ZodBoolean>;
9
10
  /** Show a few lines of context around each match. */
10
11
  context_lines: z.ZodOptional<z.ZodNumber>;
11
12
  }, "strip", z.ZodTypeAny, {
12
13
  pattern: string;
13
14
  path?: string | undefined;
14
- include?: string | undefined;
15
15
  max_results?: number | undefined;
16
+ include?: string | undefined;
17
+ include_ignored?: boolean | undefined;
16
18
  context_lines?: number | undefined;
17
19
  }, {
18
20
  pattern: string;
19
21
  path?: string | undefined;
20
- include?: string | undefined;
21
22
  max_results?: number | undefined;
23
+ include?: string | undefined;
24
+ include_ignored?: boolean | undefined;
22
25
  context_lines?: number | undefined;
23
26
  }>;
24
27
  export interface SearchMatch {
@@ -34,4 +37,3 @@ export interface SearchFilesResult {
34
37
  }
35
38
  export declare const searchFilesTool: ToolDefinition<z.infer<typeof params>, SearchFilesResult>;
36
39
  export {};
37
- //# sourceMappingURL=search-files.d.ts.map
@@ -2,6 +2,7 @@ import { readFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { z } from 'zod';
4
4
  import { globToRegex } from './policy.js';
5
+ import { IgnoreRules } from './ignore-rules.js';
5
6
  import { resolveAndCheckPath, truncateByLines, DEFAULT_IGNORED_DIRS } from './shared.js';
6
7
  const params = z.object({
7
8
  pattern: z.string().describe('Regex pattern to search for in file contents.'),
@@ -15,6 +16,10 @@ const params = z.object({
15
16
  .describe('Glob to restrict search to specific files, e.g. "*.ts" or "src/**/*.ts".'),
16
17
  /** Maximum matches to return. Default 200. */
17
18
  max_results: z.number().int().positive().max(5000).optional().describe('Cap on number of matches returned.'),
19
+ include_ignored: z
20
+ .boolean()
21
+ .optional()
22
+ .describe('Also search paths matched by .gitignore / .forgeignore (skipped by default).'),
18
23
  /** Show a few lines of context around each match. */
19
24
  context_lines: z.number().int().nonnegative().max(20).optional().describe('Lines of context around each match.'),
20
25
  });
@@ -31,6 +36,7 @@ export const searchFilesTool = {
31
36
  const matches = [];
32
37
  let truncated = false;
33
38
  let filesScanned = 0;
39
+ const rules = args.include_ignored ? null : IgnoreRules.forRoot(ctx.cwd);
34
40
  async function walk(dir) {
35
41
  if (matches.length >= maxResults) {
36
42
  truncated = true;
@@ -57,6 +63,8 @@ export const searchFilesTool = {
57
63
  if (DEFAULT_IGNORED_DIRS.has(entry.name))
58
64
  continue;
59
65
  const abs = path.join(dir, entry.name);
66
+ if (rules?.isIgnored(abs, entry.isDirectory()))
67
+ continue;
60
68
  if (entry.isDirectory()) {
61
69
  await walk(abs);
62
70
  }
@@ -121,4 +129,3 @@ function safeRegex(source) {
121
129
  throw new Error(`Invalid regex pattern: ${err.message}`);
122
130
  }
123
131
  }
124
- //# sourceMappingURL=search-files.js.map
@@ -34,4 +34,3 @@ export declare const DEFAULT_MAX_CHARS = 200000;
34
34
  * silently drift apart.
35
35
  */
36
36
  export declare const DEFAULT_IGNORED_DIRS: Set<string>;
37
- //# sourceMappingURL=shared.d.ts.map
@@ -61,4 +61,3 @@ export const DEFAULT_MAX_CHARS = 200_000;
61
61
  * silently drift apart.
62
62
  */
63
63
  export const DEFAULT_IGNORED_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '.cache']);
64
- //# sourceMappingURL=shared.js.map
@@ -105,4 +105,3 @@ export interface SubAgentResult {
105
105
  */
106
106
  export declare const subAgentTool: ToolDefinition<z.infer<typeof params>, SubAgentResult>;
107
107
  export {};
108
- //# sourceMappingURL=sub-agent.d.ts.map
@@ -262,4 +262,3 @@ function fallbackModel() {
262
262
  // is always passed through `ctx.parentModel`.
263
263
  return { provider: 'anthropic', model: 'claude-sonnet-4-5' };
264
264
  }
265
- //# sourceMappingURL=sub-agent.js.map
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `web_search` tool: search the web and return titles, URLs and snippets, so the agent
3
+ * can find current docs, error messages or release notes, then read a page with fetch_url.
4
+ *
5
+ * Opt-in (`AgentConfig.webSearch`), because queries leave the machine. Backends:
6
+ * - Brave Search API (`BRAVE_API_KEY`)
7
+ * - Tavily (`TAVILY_API_KEY`)
8
+ * - a SearXNG instance you run (`SEARXNG_URL`, JSON output enabled)
9
+ */
10
+ import { z } from 'zod';
11
+ import type { ToolDefinition } from '../types.js';
12
+ export type WebSearchProvider = 'brave' | 'tavily' | 'searxng';
13
+ export declare const WEB_SEARCH_PROVIDERS: readonly WebSearchProvider[];
14
+ export interface WebSearchConfig {
15
+ provider: WebSearchProvider;
16
+ /** Brave or Tavily key. */
17
+ apiKey?: string;
18
+ /** SearXNG base URL, e.g. `http://localhost:8080`. */
19
+ baseUrl?: string;
20
+ /** Results per search when the model doesn't ask for a number. Default 5. */
21
+ maxResults?: number;
22
+ /** For tests. */
23
+ fetch?: typeof fetch;
24
+ }
25
+ export interface WebSearchResult {
26
+ title: string;
27
+ url: string;
28
+ snippet: string;
29
+ }
30
+ /**
31
+ * The backend the environment configures: `FORGE_WEB_SEARCH` names one explicitly;
32
+ * otherwise the first of Tavily, Brave, SearXNG that has its key or URL set.
33
+ */
34
+ export declare function webSearchFromEnv(env?: NodeJS.ProcessEnv, prefer?: WebSearchProvider): WebSearchConfig | undefined;
35
+ /** What is missing for a provider, or null when it is usable. */
36
+ export declare function webSearchProblem(cfg: WebSearchConfig): string | null;
37
+ /** Run one search. Throws with a readable message on a missing key or an HTTP error. */
38
+ export declare function searchWeb(cfg: WebSearchConfig, query: string, count: number, signal?: AbortSignal): Promise<WebSearchResult[]>;
39
+ declare const params: z.ZodObject<{
40
+ query: z.ZodString;
41
+ max_results: z.ZodOptional<z.ZodNumber>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ query: string;
44
+ max_results?: number | undefined;
45
+ }, {
46
+ query: string;
47
+ max_results?: number | undefined;
48
+ }>;
49
+ export interface WebSearchToolResult {
50
+ provider: WebSearchProvider;
51
+ query: string;
52
+ results: WebSearchResult[];
53
+ }
54
+ export declare function createWebSearchTool(cfg: WebSearchConfig): ToolDefinition<z.infer<typeof params>, WebSearchToolResult>;
55
+ export {};
@@ -0,0 +1,131 @@
1
+ /**
2
+ * `web_search` tool: search the web and return titles, URLs and snippets, so the agent
3
+ * can find current docs, error messages or release notes, then read a page with fetch_url.
4
+ *
5
+ * Opt-in (`AgentConfig.webSearch`), because queries leave the machine. Backends:
6
+ * - Brave Search API (`BRAVE_API_KEY`)
7
+ * - Tavily (`TAVILY_API_KEY`)
8
+ * - a SearXNG instance you run (`SEARXNG_URL`, JSON output enabled)
9
+ */
10
+ import { z } from 'zod';
11
+ export const WEB_SEARCH_PROVIDERS = ['brave', 'tavily', 'searxng'];
12
+ const TIMEOUT_MS = 15_000;
13
+ const SNIPPET_MAX = 400;
14
+ /**
15
+ * The backend the environment configures: `FORGE_WEB_SEARCH` names one explicitly;
16
+ * otherwise the first of Tavily, Brave, SearXNG that has its key or URL set.
17
+ */
18
+ export function webSearchFromEnv(env = process.env, prefer) {
19
+ const keys = {
20
+ tavily: env.TAVILY_API_KEY,
21
+ brave: env.BRAVE_API_KEY ?? env.BRAVE_SEARCH_API_KEY,
22
+ searxng: env.SEARXNG_URL ?? env.FORGE_SEARXNG_URL,
23
+ };
24
+ const named = prefer ?? WEB_SEARCH_PROVIDERS.find((p) => p === env.FORGE_WEB_SEARCH?.trim().toLowerCase());
25
+ const provider = named ?? ['tavily', 'brave', 'searxng'].find((p) => keys[p]);
26
+ if (!provider || !keys[provider])
27
+ return undefined;
28
+ return provider === 'searxng' ? { provider, baseUrl: keys.searxng } : { provider, apiKey: keys[provider] };
29
+ }
30
+ /** What is missing for a provider, or null when it is usable. */
31
+ export function webSearchProblem(cfg) {
32
+ if (cfg.provider === 'searxng') {
33
+ if (!cfg.baseUrl)
34
+ return 'SearXNG needs a URL (SEARXNG_URL)';
35
+ try {
36
+ const u = new URL(cfg.baseUrl);
37
+ if (u.protocol !== 'http:' && u.protocol !== 'https:')
38
+ return 'the SearXNG URL must be http(s)';
39
+ }
40
+ catch {
41
+ return `"${cfg.baseUrl}" is not a URL`;
42
+ }
43
+ return null;
44
+ }
45
+ if (!cfg.apiKey)
46
+ return `${cfg.provider === 'brave' ? 'Brave' : 'Tavily'} needs an API key (${cfg.provider === 'brave' ? 'BRAVE_API_KEY' : 'TAVILY_API_KEY'})`;
47
+ return null;
48
+ }
49
+ function clean(text) {
50
+ if (typeof text !== 'string')
51
+ return '';
52
+ const plain = text
53
+ .replace(/<[^>]*>/g, '')
54
+ .replace(/&quot;/g, '"')
55
+ .replace(/&#39;|&#x27;/g, "'")
56
+ .replace(/&lt;/g, '<')
57
+ .replace(/&gt;/g, '>')
58
+ .replace(/&amp;/g, '&')
59
+ .replace(/\s+/g, ' ')
60
+ .trim();
61
+ return plain.length > SNIPPET_MAX ? `${plain.slice(0, SNIPPET_MAX - 1)}…` : plain;
62
+ }
63
+ function toResults(items, snippetKey) {
64
+ if (!Array.isArray(items))
65
+ return [];
66
+ const out = [];
67
+ for (const it of items) {
68
+ if (!it || typeof it !== 'object')
69
+ continue;
70
+ const r = it;
71
+ if (typeof r.url !== 'string' || !/^https?:\/\//.test(r.url))
72
+ continue;
73
+ out.push({ title: clean(r.title) || r.url, url: r.url, snippet: clean(r[snippetKey]) });
74
+ }
75
+ return out;
76
+ }
77
+ async function getJson(fetchFn, url, init, label) {
78
+ const res = await fetchFn(url, init);
79
+ if (!res.ok) {
80
+ const body = (await res.text().catch(() => '')).slice(0, 200).replace(/\s+/g, ' ');
81
+ throw new Error(`${label} search failed: HTTP ${res.status}${body ? ` (${body})` : ''}`);
82
+ }
83
+ return res.json();
84
+ }
85
+ /** Run one search. Throws with a readable message on a missing key or an HTTP error. */
86
+ export async function searchWeb(cfg, query, count, signal) {
87
+ const problem = webSearchProblem(cfg);
88
+ if (problem)
89
+ throw new Error(`web_search: ${problem}`);
90
+ const fetchFn = cfg.fetch ?? fetch;
91
+ const timeout = AbortSignal.timeout(TIMEOUT_MS);
92
+ const init = { signal: signal ? AbortSignal.any([signal, timeout]) : timeout };
93
+ switch (cfg.provider) {
94
+ case 'brave': {
95
+ const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${count}`;
96
+ const data = (await getJson(fetchFn, url, { ...init, headers: { Accept: 'application/json', 'X-Subscription-Token': cfg.apiKey } }, 'Brave'));
97
+ return toResults(data.web?.results, 'description').slice(0, count);
98
+ }
99
+ case 'tavily': {
100
+ const data = (await getJson(fetchFn, 'https://api.tavily.com/search', {
101
+ ...init,
102
+ method: 'POST',
103
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${cfg.apiKey}` },
104
+ body: JSON.stringify({ query, max_results: count }),
105
+ }, 'Tavily'));
106
+ return toResults(data.results, 'content').slice(0, count);
107
+ }
108
+ case 'searxng': {
109
+ const base = cfg.baseUrl.replace(/\/+$/, '');
110
+ const data = (await getJson(fetchFn, `${base}/search?q=${encodeURIComponent(query)}&format=json`, { ...init, headers: { Accept: 'application/json' } }, 'SearXNG'));
111
+ return toResults(data.results, 'content').slice(0, count);
112
+ }
113
+ }
114
+ }
115
+ const params = z.object({
116
+ query: z.string().min(1).max(400).describe('What to search for, as you would type it into a search engine.'),
117
+ max_results: z.number().int().min(1).max(10).optional().describe('How many results to return (1-10). Default 5.'),
118
+ });
119
+ export function createWebSearchTool(cfg) {
120
+ return {
121
+ name: 'web_search',
122
+ description: 'Search the web. Returns titles, URLs and short snippets; read a promising page with fetch_url. Use it for things that change or that you may not know: current library versions and APIs, error messages, release notes, recent events. The query is sent to an external search service, so never include secrets or private code in it.',
123
+ parameters: params,
124
+ destructive: false,
125
+ execute: async (args, ctx) => {
126
+ const count = args.max_results ?? cfg.maxResults ?? 5;
127
+ const results = await searchWeb(cfg, args.query, count, ctx.abortSignal);
128
+ return { provider: cfg.provider, query: args.query, results };
129
+ },
130
+ };
131
+ }
@@ -17,4 +17,3 @@ export interface WriteFileResult {
17
17
  }
18
18
  export declare const writeFileTool: ToolDefinition<z.infer<typeof params>, WriteFileResult>;
19
19
  export {};
20
- //# sourceMappingURL=write-file.d.ts.map
@@ -27,4 +27,3 @@ export const writeFileTool = {
27
27
  };
28
28
  },
29
29
  };
30
- //# sourceMappingURL=write-file.js.map
package/dist/types.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ModelMessage, LanguageModel } from 'ai';
2
2
  import type { z } from 'zod';
3
+ import type { Attachment } from './attachments.js';
3
4
  import type { SkillRegistry } from './skills/types.js';
4
5
  /**
5
6
  * The summarizer takes a chunk of messages and returns a structured
@@ -43,6 +44,11 @@ export interface ToolDefinition<TArgs = unknown, TResult = unknown> {
43
44
  * approval even in `--auto` mode unless the user passes `--yes-destructive`.
44
45
  */
45
46
  destructive?: boolean;
47
+ /**
48
+ * Optional text shown in the approval prompt so the user sees what the call
49
+ * will change (for example a diff). Failures are swallowed: no preview, still asked.
50
+ */
51
+ previewApproval?: (args: TArgs, ctx: ToolContext) => Promise<string>;
46
52
  }
47
53
  /**
48
54
  * Runtime context passed to every tool invocation. Lets tools respect the
@@ -80,6 +86,8 @@ export interface ToolContext {
80
86
  commandRunner?: CommandRunner;
81
87
  /** The run's abort signal; long-running tools (run_command) stop when it fires. */
82
88
  abortSignal?: AbortSignal;
89
+ /** Longest body `memory_write` accepts, in characters; absent = the default of 1200. */
90
+ memoryMaxBodyChars?: number;
83
91
  /** A command that outlives its timeout must be stopped, not left running (verification checks; a dev server must not be). */
84
92
  interruptOnTimeout?: boolean;
85
93
  }
@@ -303,6 +311,10 @@ export type AgentEvent = {
303
311
  } | {
304
312
  type: 'error';
305
313
  error: string;
314
+ } | {
315
+ type: 'loop_detected';
316
+ tool: string;
317
+ count: number;
306
318
  } | {
307
319
  type: 'plan'; /** The model's emitted plan (final text on a plan-mode run). */
308
320
  plan: string;
@@ -513,6 +525,10 @@ export interface AgentConfig {
513
525
  * conventions.
514
526
  */
515
527
  memoryInjectionBudget?: number;
528
+ /** Longest body `memory_write` accepts, in characters. Default 1200. */
529
+ memoryMaxBodyChars?: number;
530
+ /** Skip the approval prompt for `memory_write` (never for `memory_forget`). Default false. */
531
+ memoryAutoApproveWrites?: boolean;
516
532
  /**
517
533
  * Enable automatic context compaction. When true (default off), the
518
534
  * agent summarizes older turns once `inputTokens / windowSize` exceeds
@@ -575,6 +591,18 @@ export interface AgentConfig {
575
591
  * closed when the run ends.
576
592
  */
577
593
  browser?: true | import('./browser/session.js').BrowserSessionOptions;
594
+ /**
595
+ * Adds `github_pr_read` and `github_pr_create` (always approved first) for the repo's
596
+ * origin remote. `true` takes the token from `GITHUB_TOKEN` / `GH_TOKEN`; without one,
597
+ * no tools are added.
598
+ */
599
+ github?: true | import('./github/github-tools.js').GitHubConfig;
600
+ /**
601
+ * Adds the `web_search` tool. `true` takes the backend from the environment
602
+ * (`FORGE_WEB_SEARCH`, `TAVILY_API_KEY`, `BRAVE_API_KEY`, `SEARXNG_URL`); with none
603
+ * set, no tool is added. Queries go to that external service.
604
+ */
605
+ webSearch?: true | import('./tools/web-search.js').WebSearchConfig;
578
606
  /**
579
607
  * Adds the `codebase_search` tool (semantic search over `.forge/index/embeddings.json`).
580
608
  * Omit `embedder` to pick one from `FORGE_EMBED_PROVIDER` (default: offline hashing).
@@ -618,6 +646,11 @@ export interface AgentConfig {
618
646
  * accrues cost, so the cap never trips.
619
647
  */
620
648
  maxCostUsd?: number;
649
+ /**
650
+ * Stop the run (`reason: 'loop_detected'`) after this many identical tool calls in a row
651
+ * (same tool, same arguments, same result). 0 or unset turns the guard off.
652
+ */
653
+ loopGuardThreshold?: number;
621
654
  /**
622
655
  * Add prompt-cache breakpoints for providers that need them (Anthropic,
623
656
  * Anthropic on Bedrock). Default true. Other providers cache on their own.
@@ -695,6 +728,8 @@ export interface ApprovalRequest {
695
728
  args: unknown;
696
729
  destructive: boolean;
697
730
  description: string;
731
+ /** What the call will change, from the tool's `previewApproval`; absent when the tool has none. */
732
+ preview?: string;
698
733
  }
699
734
  export interface AgentRunOptions {
700
735
  task: string;
@@ -709,10 +744,17 @@ export interface AgentRunOptions {
709
744
  * output). Unlike `task` it is not used to pick skills or rank the repo map.
710
745
  */
711
746
  context?: string;
747
+ /**
748
+ * Files attached to this turn (pasted images, PDFs, any other file). They are sent as
749
+ * native content parts of the user message; see `attachments.ts`.
750
+ */
751
+ attachments?: Attachment[];
712
752
  onEvent?: (event: AgentEvent) => void;
713
753
  abortSignal?: AbortSignal;
714
754
  }
715
- export type AgentRunReason = 'completed' | 'max_iterations' | 'max_duration' | 'budget_exceeded' | 'aborted' | 'error' | 'no_provider_key'
755
+ export type AgentRunReason = 'completed' | 'max_iterations' | 'max_duration' | 'budget_exceeded'
756
+ /** The run repeated one identical tool call `loopGuardThreshold` times in a row. */
757
+ | 'loop_detected' | 'aborted' | 'error' | 'no_provider_key'
716
758
  /** The agent finished a plan-mode run with a plan instead of executing. */
717
759
  | 'plan'
718
760
  /** The agent finished a spec-mode run with requirements/design/tasks text instead of executing. */
@@ -754,4 +796,3 @@ export type AnyLanguageModel = LanguageModel;
754
796
  * (the default).
755
797
  */
756
798
  export type LanguageModelFactory = (config: ModelConfig) => AnyLanguageModel;
757
- //# sourceMappingURL=types.d.ts.map
package/dist/types.js CHANGED
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -26,4 +26,3 @@ export declare function projectScriptsFingerprint(cwd: string): Promise<string>;
26
26
  export declare function autoRunFingerprint(d: DetectedChecks): string[];
27
27
  /** The system-prompt block that tells the agent how this project is checked and built. */
28
28
  export declare function formatProjectCommandsBlock(d: DetectedChecks): string;
29
- //# sourceMappingURL=detect.d.ts.map
@@ -196,4 +196,3 @@ export function formatProjectCommandsBlock(d) {
196
196
  '</project-commands>',
197
197
  ].join('\n');
198
198
  }
199
- //# sourceMappingURL=detect.js.map
@@ -1,3 +1,2 @@
1
1
  export { autoRunCommands, autoRunFingerprint, detectProjectChecks, formatProjectCommandsBlock, projectScriptsFingerprint } from './detect.js';
2
2
  export type { CheckKind, DetectedCheck, DetectedChecks } from './detect.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1 @@
1
1
  export { autoRunCommands, autoRunFingerprint, detectProjectChecks, formatProjectCommandsBlock, projectScriptsFingerprint } from './detect.js';
2
- //# sourceMappingURL=index.js.map
@@ -25,4 +25,3 @@ export type MergeResult = {
25
25
  export declare function mergeBranch(repoRoot: string, branch: string, message?: string): Promise<MergeResult>;
26
26
  /** Delete a local branch (force: used for discarding an unmerged specialist branch). */
27
27
  export declare function deleteBranch(repoRoot: string, branch: string): Promise<void>;
28
- //# sourceMappingURL=branch-ops.d.ts.map
@@ -62,4 +62,3 @@ export async function mergeBranch(repoRoot, branch, message) {
62
62
  export async function deleteBranch(repoRoot, branch) {
63
63
  await git(repoRoot, ['branch', '-D', branch]);
64
64
  }
65
- //# sourceMappingURL=branch-ops.js.map
@@ -15,4 +15,3 @@ export { compareWorktreeContexts, snapshotWorktreeContext, WorktreeManager, Work
15
15
  export type { CreateOptions, RemoveOptions, RemoveResult, WorktreeContextSnapshot, WorktreeInfo, WorktreeMismatchKind, WorktreeMismatchResult, } from './worktree.js';
16
16
  export { branchChangedFiles, branchDiff, commitAllInWorktree, deleteBranch, mergeBranch, } from './branch-ops.js';
17
17
  export type { MergeResult, WorktreeCommit } from './branch-ops.js';
18
- //# sourceMappingURL=index.d.ts.map
@@ -13,4 +13,3 @@
13
13
  */
14
14
  export { compareWorktreeContexts, snapshotWorktreeContext, WorktreeManager, WorktreeError, } from './worktree.js';
15
15
  export { branchChangedFiles, branchDiff, commitAllInWorktree, deleteBranch, mergeBranch, } from './branch-ops.js';
16
- //# sourceMappingURL=index.js.map
@@ -332,4 +332,3 @@ export declare class WorktreeManager {
332
332
  * canonical too. Falls back to `path.resolve` when the path does not exist.
333
333
  */
334
334
  export declare function canonicalPath(p: string): string;
335
- //# sourceMappingURL=worktree.d.ts.map
@@ -659,4 +659,3 @@ async function shortSha(cwd) {
659
659
  return randomBytes(3).toString('hex');
660
660
  }
661
661
  }
662
- //# sourceMappingURL=worktree.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikarmic/forge-core",
3
- "version": "4.4.0",
3
+ "version": "5.0.0",
4
4
  "description": "Agent engine for IKarmic AI Forge. Model loop, tools, MCP, sandbox, memory, compaction, plan mode, skills, hooks.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -13,6 +13,7 @@
13
13
  },
14
14
  "files": [
15
15
  "dist",
16
+ "LICENSE",
16
17
  "README.md"
17
18
  ],
18
19
  "keywords": [
@@ -29,7 +30,7 @@
29
30
  "tool-use",
30
31
  "code-assistant"
31
32
  ],
32
- "license": "MIT",
33
+ "license": "SEE LICENSE IN LICENSE",
33
34
  "repository": {
34
35
  "type": "git",
35
36
  "url": "https://github.com/ikarmicai/ikarmic-forge"
@@ -51,6 +52,7 @@
51
52
  "@modelcontextprotocol/sdk": "^1.32.1",
52
53
  "ai": "^7.0.0",
53
54
  "chokidar": "4.0.3",
55
+ "ignore": "^7.0.13",
54
56
  "tree-sitter-wasms": "^0.1.13",
55
57
  "undici": "^7.30.0",
56
58
  "web-tree-sitter": "0.20.8",
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EACV,WAAW,EAEX,eAAe,EACf,cAAc,EAGd,cAAc,EAEd,WAAW,EACZ,MAAM,aAAa,CAAC;AAOrB,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAWtD;;;GAGG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAElC,MAAM,EAAE,WAAW;IAkC/B,qEAAqE;IACrE,OAAO,KAAK,kBAAkB,GAO7B;IAED;;;OAGG;IACG,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA6rB5D;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA2BtB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;YA0BZ,eAAe;IAsC7B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;CAO/B;AA2FD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,cAAc,EAAE,CAYxG"}