agency-lang 0.6.5 → 0.7.1

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 (787) hide show
  1. package/dist/lib/agents/agency-agent/agent.agency +704 -57
  2. package/dist/lib/agents/agency-agent/agent.js +5429 -2028
  3. package/dist/lib/agents/agency-agent/images/images.js +36 -15
  4. package/dist/lib/agents/agency-agent/lib/attachments.agency +115 -0
  5. package/dist/lib/agents/agency-agent/lib/attachments.js +791 -0
  6. package/dist/lib/agents/agency-agent/lib/config.agency +7 -0
  7. package/dist/lib/agents/agency-agent/lib/config.js +58 -15
  8. package/dist/lib/agents/agency-agent/lib/defaultPolicy.agency +134 -1
  9. package/dist/lib/agents/agency-agent/lib/defaultPolicy.js +828 -19
  10. package/dist/lib/agents/agency-agent/lib/modelFilters.agency +29 -0
  11. package/dist/lib/agents/agency-agent/lib/modelFilters.js +353 -0
  12. package/dist/lib/agents/agency-agent/lib/models.agency +214 -30
  13. package/dist/lib/agents/agency-agent/lib/models.js +1296 -278
  14. package/dist/lib/agents/agency-agent/lib/resolution.agency +191 -0
  15. package/dist/lib/agents/agency-agent/lib/resolution.js +1538 -0
  16. package/dist/lib/agents/agency-agent/lib/search.agency +471 -0
  17. package/dist/lib/agents/agency-agent/lib/search.js +2647 -0
  18. package/dist/lib/agents/agency-agent/lib/settings.agency +147 -0
  19. package/dist/lib/agents/agency-agent/lib/settings.js +956 -0
  20. package/dist/lib/agents/agency-agent/lib/slots.agency +34 -0
  21. package/dist/lib/agents/agency-agent/lib/slots.js +602 -0
  22. package/dist/lib/agents/agency-agent/lib/utils.js +39 -22
  23. package/dist/lib/agents/agency-agent/prompts/codeSample.agency +8 -4
  24. package/dist/lib/agents/agency-agent/prompts/codeSample.js +77 -45
  25. package/dist/lib/agents/agency-agent/prompts/design.md +13 -7
  26. package/dist/lib/agents/agency-agent/shared.agency +187 -27
  27. package/dist/lib/agents/agency-agent/shared.js +1399 -148
  28. package/dist/lib/agents/agency-agent/subagents/code.agency +46 -15
  29. package/dist/lib/agents/agency-agent/subagents/code.js +89 -49
  30. package/dist/lib/agents/agency-agent/subagents/explorer.agency +4 -2
  31. package/dist/lib/agents/agency-agent/subagents/explorer.js +58 -44
  32. package/dist/lib/agents/agency-agent/subagents/oracle.agency +4 -2
  33. package/dist/lib/agents/agency-agent/subagents/oracle.js +58 -44
  34. package/dist/lib/agents/agency-agent/subagents/research.agency +9 -10
  35. package/dist/lib/agents/agency-agent/subagents/research.js +56 -40
  36. package/dist/lib/agents/agency-agent/subagents/review.js +45 -28
  37. package/dist/lib/agents/agency-agent/subagents/shell.js +446 -0
  38. package/dist/lib/agents/agency-agent/tests/agentTurn.agency +222 -1
  39. package/dist/lib/agents/agency-agent/tests/agentTurn.js +2303 -30
  40. package/dist/lib/agents/agency-agent/tests/agentTurn.test.json +17 -1
  41. package/dist/lib/agents/agency-agent/tests/attachments.agency +187 -0
  42. package/dist/lib/agents/agency-agent/tests/attachments.js +3736 -0
  43. package/dist/lib/agents/agency-agent/tests/attachments.test.json +254 -0
  44. package/dist/lib/agents/agency-agent/tests/attachmentsTurn.agency +65 -0
  45. package/dist/lib/agents/agency-agent/tests/attachmentsTurn.js +1032 -0
  46. package/dist/lib/agents/agency-agent/tests/attachmentsTurn.test.json +110 -0
  47. package/dist/lib/agents/agency-agent/tests/execPolicy.js +47 -25
  48. package/dist/lib/agents/agency-agent/tests/gitPolicy.agency +53 -0
  49. package/dist/lib/agents/agency-agent/tests/gitPolicy.js +694 -0
  50. package/dist/lib/agents/agency-agent/tests/gitPolicy.test.json +7 -0
  51. package/dist/lib/agents/agency-agent/tests/imageTool.agency +51 -0
  52. package/dist/lib/agents/agency-agent/tests/imageTool.js +1111 -0
  53. package/dist/lib/agents/agency-agent/tests/imageTool.test.json +81 -0
  54. package/dist/lib/agents/agency-agent/tests/modelFilters.agency +32 -0
  55. package/dist/lib/agents/agency-agent/tests/modelFilters.js +723 -0
  56. package/dist/lib/agents/agency-agent/tests/modelFilters.test.json +7 -0
  57. package/dist/lib/agents/agency-agent/tests/models.agency +114 -0
  58. package/dist/lib/agents/agency-agent/tests/models.js +2143 -0
  59. package/dist/lib/agents/agency-agent/tests/models.test.json +49 -0
  60. package/dist/lib/agents/agency-agent/tests/resolution.agency +184 -0
  61. package/dist/lib/agents/agency-agent/tests/resolution.js +1498 -0
  62. package/dist/lib/agents/agency-agent/tests/resolution.test.json +13 -0
  63. package/dist/lib/agents/agency-agent/tests/search.agency +101 -0
  64. package/dist/lib/agents/agency-agent/tests/search.js +2095 -0
  65. package/dist/lib/agents/agency-agent/tests/search.test.json +19 -0
  66. package/dist/lib/agents/agency-agent/tests/settings.agency +87 -0
  67. package/dist/lib/agents/agency-agent/tests/settings.js +978 -0
  68. package/dist/lib/agents/agency-agent/tests/settings.test.json +26 -0
  69. package/dist/lib/agents/agency-agent/tests/slots.agency +22 -0
  70. package/dist/lib/agents/agency-agent/tests/slots.js +648 -0
  71. package/dist/lib/agents/agency-agent/tests/slots.test.json +10 -0
  72. package/dist/lib/agents/agency-agent/tests/toolWiring.js +41 -15
  73. package/dist/lib/agents/agency-agent/tests/turnFailure.agency +35 -0
  74. package/dist/lib/agents/agency-agent/tests/turnFailure.js +694 -0
  75. package/dist/lib/agents/agency-agent/tests/turnFailure.test.json +34 -0
  76. package/dist/lib/agents/docs/cli/editor-integration.md +1 -1
  77. package/dist/lib/agents/docs/cli/local.md +92 -0
  78. package/dist/lib/agents/docs/cli/models.md +63 -0
  79. package/dist/lib/agents/docs/cli/optimize.md +33 -1
  80. package/dist/lib/agents/docs/cli/run.md +0 -29
  81. package/dist/lib/agents/docs/guide/agency-config-file.md +205 -3
  82. package/dist/lib/agents/docs/guide/agency-packages.md +54 -0
  83. package/dist/lib/agents/docs/guide/agency-stdlib.md +14 -0
  84. package/dist/lib/agents/docs/guide/agency-vs-typescript.md +33 -0
  85. package/dist/lib/agents/docs/guide/attachments.md +56 -0
  86. package/dist/lib/agents/docs/guide/basic-syntax.md +204 -72
  87. package/dist/lib/agents/docs/guide/blocks.md +64 -34
  88. package/dist/lib/agents/docs/guide/build-integration.md +99 -0
  89. package/dist/lib/agents/docs/{appendix/appendix → guide}/builtins.md +27 -4
  90. package/dist/lib/agents/docs/{appendix/appendix → guide}/callbacks.md +43 -36
  91. package/dist/lib/agents/docs/guide/checkpointing.md +56 -27
  92. package/dist/lib/agents/docs/guide/cli-args.md +1 -1
  93. package/dist/lib/agents/docs/guide/common-functions.md +36 -0
  94. package/dist/lib/agents/docs/guide/compiling-and-running.md +62 -0
  95. package/dist/lib/agents/docs/guide/concurrency.md +49 -92
  96. package/dist/lib/agents/docs/guide/cross-thread-context.md +5 -7
  97. package/dist/lib/agents/docs/guide/custom-providers.md +195 -0
  98. package/dist/lib/agents/docs/guide/debugging.md +67 -0
  99. package/dist/lib/agents/docs/guide/developer-tools.md +90 -0
  100. package/dist/lib/agents/docs/guide/effects-and-raises.md +73 -92
  101. package/dist/lib/agents/docs/guide/effects.md +100 -0
  102. package/dist/lib/agents/docs/guide/error-handling.md +56 -44
  103. package/dist/lib/agents/docs/guide/exercise-1.md +32 -0
  104. package/dist/lib/agents/docs/guide/functions.md +71 -10
  105. package/dist/lib/agents/docs/guide/getting-started.md +5 -12
  106. package/dist/lib/agents/docs/guide/global-var-initialization.md +70 -0
  107. package/dist/lib/agents/docs/guide/global-vs-static.md +29 -34
  108. package/dist/lib/agents/docs/guide/guards.md +57 -108
  109. package/dist/lib/agents/docs/guide/handlers.md +109 -205
  110. package/dist/lib/agents/docs/guide/image-generation.md +113 -0
  111. package/dist/lib/agents/docs/guide/imports-and-packages.md +35 -95
  112. package/dist/lib/agents/docs/guide/interrupts-from-typescript.md +84 -0
  113. package/dist/lib/agents/docs/guide/interrupts-part-2.md +54 -0
  114. package/dist/lib/agents/docs/guide/interrupts.md +98 -58
  115. package/dist/lib/agents/docs/guide/llm-part-2.md +111 -0
  116. package/dist/lib/agents/docs/guide/llm.md +53 -144
  117. package/dist/lib/agents/docs/guide/memory.md +262 -249
  118. package/dist/lib/agents/docs/guide/message-threads.md +111 -0
  119. package/dist/lib/agents/docs/guide/nodes.md +32 -17
  120. package/dist/lib/agents/docs/guide/observability.md +11 -4
  121. package/dist/lib/agents/docs/guide/partial-application.md +40 -132
  122. package/dist/lib/agents/docs/guide/pattern-matching.md +216 -43
  123. package/dist/lib/agents/docs/guide/policies.md +11 -4
  124. package/dist/lib/agents/docs/guide/schemas.md +22 -9
  125. package/dist/lib/agents/docs/guide/state-isolation.md +139 -0
  126. package/dist/lib/agents/docs/guide/streaming.md +28 -0
  127. package/dist/lib/agents/docs/guide/tags.md +72 -0
  128. package/dist/lib/agents/docs/guide/testing.md +167 -7
  129. package/dist/lib/agents/docs/guide/troubleshooting.md +2 -53
  130. package/dist/lib/agents/docs/{appendix/appendix → guide}/ts-helpers.md +48 -0
  131. package/dist/lib/agents/docs/guide/ts-interop.md +16 -129
  132. package/dist/lib/agents/docs/guide/type-validation.md +30 -172
  133. package/dist/lib/agents/docs/guide/types.md +69 -84
  134. package/dist/lib/agents/docs/guide/{guide/ts-interop.md → unused.md} +42 -49
  135. package/dist/lib/agents/docs/guide/unused2.md +258 -0
  136. package/dist/lib/agents/docs/guide/value-parameterized-types.md +186 -0
  137. package/dist/lib/agents/docs/guide/vscode-extension.md +33 -0
  138. package/dist/lib/agents/docs/guide/why-agency.md +323 -0
  139. package/dist/lib/agents/eval/goalJudge.js +35 -14
  140. package/dist/lib/agents/eval/judge.js +35 -14
  141. package/dist/lib/agents/eval/judgePairwise.agency +2 -2
  142. package/dist/lib/agents/eval/judgePairwise.js +35 -14
  143. package/dist/lib/agents/optimize/gepaReflect.js +35 -14
  144. package/dist/lib/agents/optimize/mutatePrompt.agency +2 -0
  145. package/dist/lib/agents/optimize/mutatePrompt.js +38 -15
  146. package/dist/lib/agents/policy/agent.agency +2 -2
  147. package/dist/lib/agents/policy/agent.js +94 -58
  148. package/dist/lib/agents/review/agent.js +44 -22
  149. package/dist/lib/backends/agencyGenerator.d.ts +14 -2
  150. package/dist/lib/backends/agencyGenerator.js +158 -53
  151. package/dist/lib/backends/agencyGenerator.matchBlock.test.js +106 -0
  152. package/dist/lib/backends/agencyGenerator.test.js +148 -0
  153. package/dist/lib/backends/effectDeclarationFormat.test.d.ts +1 -0
  154. package/dist/lib/backends/effectDeclarationFormat.test.js +32 -0
  155. package/dist/lib/backends/llmAttachmentCodegen.test.d.ts +1 -0
  156. package/dist/lib/backends/llmAttachmentCodegen.test.js +24 -0
  157. package/dist/lib/backends/llmNamedArgsCodegen.test.d.ts +1 -0
  158. package/dist/lib/backends/llmNamedArgsCodegen.test.js +40 -0
  159. package/dist/lib/backends/providerModules.codegen.test.d.ts +1 -0
  160. package/dist/lib/backends/{anthropicApiKey.codegen.test.js → providerModules.codegen.test.js} +12 -15
  161. package/dist/lib/backends/smoltalkDefaults.codegen.test.d.ts +1 -0
  162. package/dist/lib/backends/smoltalkDefaults.codegen.test.js +65 -0
  163. package/dist/lib/backends/typescriptBuilder.d.ts +82 -0
  164. package/dist/lib/backends/typescriptBuilder.integration.test.js +94 -4
  165. package/dist/lib/backends/typescriptBuilder.js +499 -158
  166. package/dist/lib/backends/typescriptGenerator/typeToString.js +8 -2
  167. package/dist/lib/backends/typescriptGenerator/typeToZodSchema.js +25 -28
  168. package/dist/lib/backends/typescriptGenerator/typeToZodSchema.test.js +73 -0
  169. package/dist/lib/cli/commands.d.ts +28 -0
  170. package/dist/lib/cli/commands.js +53 -4
  171. package/dist/lib/cli/doc.js +19 -0
  172. package/dist/lib/cli/doc.test.js +27 -1
  173. package/dist/lib/cli/fetchMockResolve.d.ts +6 -0
  174. package/dist/lib/cli/fetchMockResolve.js +51 -0
  175. package/dist/lib/cli/fetchMockResolve.test.d.ts +1 -0
  176. package/dist/lib/cli/fetchMockResolve.test.js +36 -0
  177. package/dist/lib/cli/hostedModels.d.ts +10 -0
  178. package/dist/lib/cli/hostedModels.js +61 -0
  179. package/dist/lib/cli/hostedModels.test.d.ts +1 -0
  180. package/dist/lib/cli/hostedModels.test.js +105 -0
  181. package/dist/lib/cli/local.d.ts +19 -0
  182. package/dist/lib/cli/local.js +109 -0
  183. package/dist/lib/cli/local.test.d.ts +1 -0
  184. package/dist/lib/cli/local.test.js +50 -0
  185. package/dist/lib/cli/pack.test.js +18 -0
  186. package/dist/lib/cli/precompile.d.ts +22 -0
  187. package/dist/lib/cli/precompile.js +125 -0
  188. package/dist/lib/cli/precompile.test.d.ts +1 -0
  189. package/dist/lib/cli/precompile.test.js +172 -0
  190. package/dist/lib/cli/test.js +55 -5
  191. package/dist/lib/cli/util.d.ts +8 -2
  192. package/dist/lib/cli/util.js +23 -6
  193. package/dist/lib/compiler/compile.js +5 -1
  194. package/dist/lib/compiler/compile.test.js +54 -1
  195. package/dist/lib/compiler/compileClosure.js +8 -9
  196. package/dist/lib/compiler/typecheck.js +10 -3
  197. package/dist/lib/config.d.ts +114 -6
  198. package/dist/lib/config.js +39 -3
  199. package/dist/lib/config.modelAliases.test.d.ts +1 -0
  200. package/dist/lib/config.modelAliases.test.js +11 -0
  201. package/dist/lib/config.providerModules.test.d.ts +1 -0
  202. package/dist/lib/config.providerModules.test.js +16 -0
  203. package/dist/lib/config.test.js +12 -0
  204. package/dist/lib/constants.d.ts +12 -0
  205. package/dist/lib/constants.js +12 -0
  206. package/dist/lib/effectDeclCollection.test.d.ts +1 -0
  207. package/dist/lib/effectDeclCollection.test.js +56 -0
  208. package/dist/lib/importPaths.d.ts +31 -1
  209. package/dist/lib/importPaths.js +88 -32
  210. package/dist/lib/importPaths.test.js +47 -4
  211. package/dist/lib/ir/builders.d.ts +6 -1
  212. package/dist/lib/ir/builders.js +3 -0
  213. package/dist/lib/ir/prettyPrint.js +56 -10
  214. package/dist/lib/ir/prettyPrint.test.js +70 -7
  215. package/dist/lib/ir/tsIR.d.ts +12 -2
  216. package/dist/lib/logsViewer/render.js +2 -0
  217. package/dist/lib/logsViewer/summary.js +13 -0
  218. package/dist/lib/logsViewer/summary.test.js +6 -0
  219. package/dist/lib/logsViewer/tree.js +38 -0
  220. package/dist/lib/logsViewer/tree.test.js +19 -0
  221. package/dist/lib/lowering/loweringError.d.ts +10 -0
  222. package/dist/lib/lowering/loweringError.js +13 -0
  223. package/dist/lib/lowering/patternLowering.ifExpr.test.d.ts +1 -0
  224. package/dist/lib/lowering/patternLowering.ifExpr.test.js +59 -0
  225. package/dist/lib/lowering/patternLowering.js +504 -30
  226. package/dist/lib/lowering/patternLowering.matchExpr.test.d.ts +1 -0
  227. package/dist/lib/lowering/patternLowering.matchExpr.test.js +572 -0
  228. package/dist/lib/lowering/patternLowering.test.js +102 -10
  229. package/dist/lib/lsp/codeAction.js +3 -3
  230. package/dist/lib/lsp/codeAction.test.js +13 -10
  231. package/dist/lib/lsp/completion.js +2 -2
  232. package/dist/lib/lsp/diagnostics.js +11 -4
  233. package/dist/lib/lsp/diagnostics.test.js +30 -0
  234. package/dist/lib/matchVal.d.ts +18 -0
  235. package/dist/lib/matchVal.js +26 -0
  236. package/dist/lib/optimize/artifacts.test.js +4 -1
  237. package/dist/lib/optimize/baseOptimizer.js +9 -1
  238. package/dist/lib/optimize/baseOptimizer.test.js +4 -1
  239. package/dist/lib/optimize/baseOptimizer.workdir.test.js +1 -1
  240. package/dist/lib/optimize/constraint.d.ts +45 -0
  241. package/dist/lib/optimize/constraint.js +78 -0
  242. package/dist/lib/optimize/constraint.test.d.ts +1 -0
  243. package/dist/lib/optimize/constraint.test.js +133 -0
  244. package/dist/lib/optimize/grading/scorecard.d.ts +6 -0
  245. package/dist/lib/optimize/grading/scorecard.js +8 -0
  246. package/dist/lib/optimize/mutator.js +2 -0
  247. package/dist/lib/optimize/mutator.test.js +37 -0
  248. package/dist/lib/optimize/optimizers/example.d.ts +4 -1
  249. package/dist/lib/optimize/optimizers/example.js +11 -12
  250. package/dist/lib/optimize/optimizers/example.test.js +2 -1
  251. package/dist/lib/optimize/optimizers/gepa.js +4 -0
  252. package/dist/lib/optimize/optimizers/gepa.test.js +2 -1
  253. package/dist/lib/optimize/optimizers/greedyReflective.js +3 -0
  254. package/dist/lib/optimize/optimizers/greedyReflective.test.js +100 -1
  255. package/dist/lib/optimize/reporter.test.js +2 -0
  256. package/dist/lib/optimize/sourceMutator.d.ts +8 -4
  257. package/dist/lib/optimize/sourceMutator.js +63 -13
  258. package/dist/lib/optimize/sourceMutator.test.js +117 -0
  259. package/dist/lib/optimize/targets.d.ts +16 -3
  260. package/dist/lib/optimize/targets.js +106 -10
  261. package/dist/lib/optimize/targets.test.js +79 -5
  262. package/dist/lib/optimize/types.d.ts +8 -1
  263. package/dist/lib/optimize/workspace.test.js +1 -0
  264. package/dist/lib/parseCache.d.ts +10 -0
  265. package/dist/lib/parseCache.js +58 -0
  266. package/dist/lib/parseCache.test.d.ts +1 -0
  267. package/dist/lib/parseCache.test.js +113 -0
  268. package/dist/lib/parser.js +27 -2
  269. package/dist/lib/parsers/dataStructures.test.js +86 -0
  270. package/dist/lib/parsers/debugMessagesLeak.test.d.ts +1 -0
  271. package/dist/lib/parsers/debugMessagesLeak.test.js +31 -0
  272. package/dist/lib/parsers/effectDeclaration.test.d.ts +1 -0
  273. package/dist/lib/parsers/effectDeclaration.test.js +107 -0
  274. package/dist/lib/parsers/function.test.js +39 -2
  275. package/dist/lib/parsers/ifExpression.test.d.ts +1 -0
  276. package/dist/lib/parsers/ifExpression.test.js +45 -0
  277. package/dist/lib/parsers/importStatement.test.js +49 -0
  278. package/dist/lib/parsers/literals.test.js +52 -0
  279. package/dist/lib/parsers/matchBlock.test.js +298 -59
  280. package/dist/lib/parsers/parsers.d.ts +21 -2
  281. package/dist/lib/parsers/parsers.js +232 -100
  282. package/dist/lib/parsers/pattern.test.js +10 -10
  283. package/dist/lib/parsers/typeHints.test.js +70 -0
  284. package/dist/lib/preprocessors/importResolver.d.ts +3 -1
  285. package/dist/lib/preprocessors/importResolver.js +37 -7
  286. package/dist/lib/preprocessors/importResolver.test.js +82 -0
  287. package/dist/lib/preprocessors/injectSchemaArgs.js +1 -2
  288. package/dist/lib/preprocessors/liftCallbacks.js +1 -1
  289. package/dist/lib/preprocessors/parallelDesugar.js +3 -2
  290. package/dist/lib/preprocessors/parallelDesugar.test.js +3 -2
  291. package/dist/lib/preprocessors/prunePreludeShadows.d.ts +22 -0
  292. package/dist/lib/preprocessors/prunePreludeShadows.js +55 -0
  293. package/dist/lib/preprocessors/prunePreludeShadows.test.d.ts +1 -0
  294. package/dist/lib/preprocessors/prunePreludeShadows.test.js +112 -0
  295. package/dist/lib/preprocessors/typescriptPreprocessor.core.test.js +25 -0
  296. package/dist/lib/preprocessors/typescriptPreprocessor.js +7 -5
  297. package/dist/lib/runtime/__tests__/testHelpers.js +0 -1
  298. package/dist/lib/runtime/agency.d.ts +3 -1
  299. package/dist/lib/runtime/agency.js +6 -7
  300. package/dist/lib/runtime/agencyFunction.js +13 -4
  301. package/dist/lib/runtime/agencyFunction.test.js +52 -0
  302. package/dist/lib/runtime/agencyInterrupt.test.js +91 -6
  303. package/dist/lib/runtime/agencyLlm.d.ts +6 -2
  304. package/dist/lib/runtime/agencyLlm.test.js +17 -0
  305. package/dist/lib/runtime/callDepth.d.ts +36 -0
  306. package/dist/lib/runtime/callDepth.js +76 -0
  307. package/dist/lib/runtime/callDepth.test.d.ts +1 -0
  308. package/dist/lib/runtime/callDepth.test.js +67 -0
  309. package/dist/lib/runtime/callbackForwarding.d.ts +47 -0
  310. package/dist/lib/runtime/callbackForwarding.js +76 -0
  311. package/dist/lib/runtime/callbackForwarding.test.d.ts +1 -0
  312. package/dist/lib/runtime/callbackForwarding.test.js +72 -0
  313. package/dist/lib/runtime/configOverrides.d.ts +17 -5
  314. package/dist/lib/runtime/configOverrides.js +28 -6
  315. package/dist/lib/runtime/configOverrides.test.js +33 -0
  316. package/dist/lib/runtime/cost.d.ts +10 -0
  317. package/dist/lib/runtime/cost.js +17 -0
  318. package/dist/lib/runtime/costTelemetry.d.ts +24 -0
  319. package/dist/lib/runtime/costTelemetry.js +39 -0
  320. package/dist/lib/runtime/costTelemetry.test.d.ts +1 -0
  321. package/dist/lib/runtime/costTelemetry.test.js +92 -0
  322. package/dist/lib/runtime/deterministicClient.d.ts +9 -2
  323. package/dist/lib/runtime/deterministicClient.js +21 -1
  324. package/dist/lib/runtime/deterministicClient.test.js +29 -0
  325. package/dist/lib/runtime/eq.d.ts +12 -0
  326. package/dist/lib/runtime/eq.js +14 -0
  327. package/dist/lib/runtime/eq.test.d.ts +1 -0
  328. package/dist/lib/runtime/eq.test.js +32 -0
  329. package/dist/lib/runtime/errors.d.ts +17 -0
  330. package/dist/lib/runtime/errors.js +23 -0
  331. package/dist/lib/runtime/errors.test.js +10 -0
  332. package/dist/lib/runtime/fetchMock.d.ts +12 -0
  333. package/dist/lib/runtime/fetchMock.js +167 -0
  334. package/dist/lib/runtime/fetchMock.test.d.ts +1 -0
  335. package/dist/lib/runtime/fetchMock.test.js +145 -0
  336. package/dist/lib/runtime/hooks.d.ts +9 -3
  337. package/dist/lib/runtime/hooks.js +19 -0
  338. package/dist/lib/runtime/hooks.test.js +39 -2
  339. package/dist/lib/runtime/image-client.test.d.ts +1 -0
  340. package/dist/lib/runtime/image-client.test.js +22 -0
  341. package/dist/lib/runtime/index.d.ts +4 -1
  342. package/dist/lib/runtime/index.js +3 -1
  343. package/dist/lib/runtime/interrupts.d.ts +50 -0
  344. package/dist/lib/runtime/interrupts.js +206 -126
  345. package/dist/lib/runtime/interrupts.test.js +110 -1
  346. package/dist/lib/runtime/ipc.configOverrides.test.js +35 -17
  347. package/dist/lib/runtime/ipc.d.ts +238 -21
  348. package/dist/lib/runtime/ipc.js +622 -95
  349. package/dist/lib/runtime/ipc.test.js +453 -2
  350. package/dist/lib/runtime/llmClient.d.ts +25 -3
  351. package/dist/lib/runtime/llmClient.hostedTools.test.d.ts +1 -0
  352. package/dist/lib/runtime/llmClient.hostedTools.test.js +45 -0
  353. package/dist/lib/runtime/llmClient.js +28 -12
  354. package/dist/lib/runtime/llmClient.test.js +48 -1
  355. package/dist/lib/runtime/memory/manager.d.ts +25 -0
  356. package/dist/lib/runtime/memory/manager.js +115 -14
  357. package/dist/lib/runtime/memory/manager.test.js +60 -21
  358. package/dist/lib/runtime/memory/types.d.ts +7 -0
  359. package/dist/lib/runtime/node.js +10 -1
  360. package/dist/lib/runtime/prompt.attachments.test.d.ts +1 -0
  361. package/dist/lib/runtime/prompt.attachments.test.js +41 -0
  362. package/dist/lib/runtime/prompt.d.ts +16 -1
  363. package/dist/lib/runtime/prompt.js +120 -25
  364. package/dist/lib/runtime/promptRunner.d.ts +1 -1
  365. package/dist/lib/runtime/promptRunner.js +1 -1
  366. package/dist/lib/runtime/providerModules.d.ts +27 -0
  367. package/dist/lib/runtime/providerModules.js +87 -0
  368. package/dist/lib/runtime/providerModules.test.d.ts +1 -0
  369. package/dist/lib/runtime/providerModules.test.js +90 -0
  370. package/dist/lib/runtime/redactForStatelog.d.ts +20 -0
  371. package/dist/lib/runtime/redactForStatelog.js +32 -0
  372. package/dist/lib/runtime/redactForStatelog.test.d.ts +1 -0
  373. package/dist/lib/runtime/redactForStatelog.test.js +84 -0
  374. package/dist/lib/runtime/replyAttachments.d.ts +46 -0
  375. package/dist/lib/runtime/replyAttachments.js +143 -0
  376. package/dist/lib/runtime/replyAttachments.test.d.ts +1 -0
  377. package/dist/lib/runtime/replyAttachments.test.js +205 -0
  378. package/dist/lib/runtime/result.js +8 -0
  379. package/dist/lib/runtime/revivers/index.js +2 -0
  380. package/dist/lib/runtime/revivers/taggedReviver.d.ts +8 -0
  381. package/dist/lib/runtime/revivers/taggedReviver.js +30 -0
  382. package/dist/lib/runtime/revivers/taggedReviver.test.d.ts +1 -0
  383. package/dist/lib/runtime/revivers/taggedReviver.test.js +42 -0
  384. package/dist/lib/runtime/runBatch.js +33 -16
  385. package/dist/lib/runtime/runBatch.test.js +62 -0
  386. package/dist/lib/runtime/runner.d.ts +27 -5
  387. package/dist/lib/runtime/runner.js +149 -54
  388. package/dist/lib/runtime/runner.test.js +217 -1
  389. package/dist/lib/runtime/simpleOpenAIClient.js +1 -1
  390. package/dist/lib/runtime/state/context.d.ts +22 -12
  391. package/dist/lib/runtime/state/context.js +43 -14
  392. package/dist/lib/runtime/state/context.providerModules.test.d.ts +1 -0
  393. package/dist/lib/runtime/state/context.providerModules.test.js +38 -0
  394. package/dist/lib/runtime/state/globalStore.d.ts +42 -0
  395. package/dist/lib/runtime/state/globalStore.js +187 -2
  396. package/dist/lib/runtime/state/globalStore.tags.test.d.ts +1 -0
  397. package/dist/lib/runtime/state/globalStore.tags.test.js +211 -0
  398. package/dist/lib/runtime/state/stateStack.d.ts +34 -0
  399. package/dist/lib/runtime/state/stateStack.js +46 -0
  400. package/dist/lib/runtime/state/tagSymbol.d.ts +6 -0
  401. package/dist/lib/runtime/state/tagSymbol.js +49 -0
  402. package/dist/lib/runtime/state/tagSymbol.test.d.ts +1 -0
  403. package/dist/lib/runtime/state/tagSymbol.test.js +60 -0
  404. package/dist/lib/runtime/streaming.d.ts +7 -2
  405. package/dist/lib/runtime/streaming.js +31 -8
  406. package/dist/lib/runtime/subprocess-bootstrap.js +90 -35
  407. package/dist/lib/runtime/subprocessRunInfo.d.ts +46 -0
  408. package/dist/lib/runtime/subprocessRunInfo.js +53 -0
  409. package/dist/lib/runtime/subprocessRunInfo.test.d.ts +1 -0
  410. package/dist/lib/runtime/subprocessRunInfo.test.js +32 -0
  411. package/dist/lib/runtime/topsortCycleErrors.test.js +69 -0
  412. package/dist/lib/runtime/utils.d.ts +16 -2
  413. package/dist/lib/runtime/utils.js +13 -4
  414. package/dist/lib/runtime/utils.test.js +27 -0
  415. package/dist/lib/statelogClient.d.ts +40 -1
  416. package/dist/lib/statelogClient.js +98 -1
  417. package/dist/lib/statelogClient.redaction.test.d.ts +1 -0
  418. package/dist/lib/statelogClient.redaction.test.js +131 -0
  419. package/dist/lib/statelogClient.test.js +13 -0
  420. package/dist/lib/stdlib/abortable.d.ts +6 -0
  421. package/dist/lib/stdlib/abortable.js +26 -1
  422. package/dist/lib/stdlib/agency.d.ts +7 -2
  423. package/dist/lib/stdlib/agency.js +17 -13
  424. package/dist/lib/stdlib/agencyEval.js +7 -1
  425. package/dist/lib/stdlib/args.d.ts +4 -1
  426. package/dist/lib/stdlib/args.js +68 -0
  427. package/dist/lib/stdlib/builtins.d.ts +2 -1
  428. package/dist/lib/stdlib/builtins.js +22 -13
  429. package/dist/lib/stdlib/cli.d.ts +65 -0
  430. package/dist/lib/stdlib/cli.js +217 -39
  431. package/dist/lib/stdlib/git.d.ts +29 -0
  432. package/dist/lib/stdlib/git.js +80 -0
  433. package/dist/lib/stdlib/gitCore.d.ts +132 -0
  434. package/dist/lib/stdlib/gitCore.js +231 -0
  435. package/dist/lib/stdlib/gitParse.d.ts +17 -0
  436. package/dist/lib/stdlib/gitParse.js +259 -0
  437. package/dist/lib/stdlib/http.d.ts +5 -4
  438. package/dist/lib/stdlib/http.js +42 -1
  439. package/dist/lib/stdlib/image.d.ts +7 -0
  440. package/dist/lib/stdlib/image.js +80 -0
  441. package/dist/lib/stdlib/layout/ansi.js +35 -3
  442. package/dist/lib/stdlib/layout/axis.js +14 -5
  443. package/dist/lib/stdlib/layout/barchart.js +5 -5
  444. package/dist/lib/stdlib/layout/block.js +2 -2
  445. package/dist/lib/stdlib/layout/border.js +2 -2
  446. package/dist/lib/stdlib/layout/box.js +12 -4
  447. package/dist/lib/stdlib/layout/nodes.d.ts +0 -1
  448. package/dist/lib/stdlib/layout/nodes.js +40 -17
  449. package/dist/lib/stdlib/layout/render.js +7 -3
  450. package/dist/lib/stdlib/layout/sizing.d.ts +1 -0
  451. package/dist/lib/stdlib/layout/sizing.js +1 -1
  452. package/dist/lib/stdlib/layout/table.js +11 -11
  453. package/dist/lib/stdlib/layout.js +1 -1
  454. package/dist/lib/stdlib/llm.d.ts +48 -0
  455. package/dist/lib/stdlib/llm.js +104 -0
  456. package/dist/lib/stdlib/localModels.d.ts +209 -0
  457. package/dist/lib/stdlib/localModels.js +904 -0
  458. package/dist/lib/stdlib/mediaPathScan.d.ts +31 -0
  459. package/dist/lib/stdlib/mediaPathScan.js +79 -0
  460. package/dist/lib/stdlib/providers/llama-cpp.mjs +79 -0
  461. package/dist/lib/stdlib/providers/llamaModelConfig.d.ts +7 -0
  462. package/dist/lib/stdlib/providers/llamaModelConfig.js +7 -0
  463. package/dist/lib/stdlib/search.d.ts +7 -0
  464. package/dist/lib/stdlib/search.js +40 -0
  465. package/dist/lib/stdlib/shell.d.ts +1 -1
  466. package/dist/lib/stdlib/shell.js +4 -2
  467. package/dist/lib/stdlib/tag.d.ts +17 -0
  468. package/dist/lib/stdlib/tag.js +49 -0
  469. package/dist/lib/stdlib/thread.d.ts +38 -3
  470. package/dist/lib/stdlib/thread.js +71 -2
  471. package/dist/lib/stdlib/threads.d.ts +12 -0
  472. package/dist/lib/stdlib/threads.js +48 -17
  473. package/dist/lib/stdlib/version.d.ts +1 -1
  474. package/dist/lib/stdlib/version.js +1 -1
  475. package/dist/lib/symbolTable.d.ts +10 -1
  476. package/dist/lib/symbolTable.js +27 -7
  477. package/dist/lib/templates/backends/agency/template.d.ts +1 -1
  478. package/dist/lib/templates/backends/agency/template.js +1 -1
  479. package/dist/lib/templates/backends/typescriptGenerator/imports.d.ts +1 -1
  480. package/dist/lib/templates/backends/typescriptGenerator/imports.js +14 -2
  481. package/dist/lib/templates/backends/typescriptGenerator/runnerIfElse.d.ts +2 -1
  482. package/dist/lib/templates/backends/typescriptGenerator/runnerIfElse.js +1 -1
  483. package/dist/lib/typeChecker/assignability.d.ts +8 -0
  484. package/dist/lib/typeChecker/assignability.js +26 -4
  485. package/dist/lib/typeChecker/assignability.test.js +59 -1
  486. package/dist/lib/typeChecker/attachments.test.d.ts +1 -0
  487. package/dist/lib/typeChecker/attachments.test.js +45 -0
  488. package/dist/lib/typeChecker/builtinNamedArgs.test.js +30 -0
  489. package/dist/lib/typeChecker/builtins.js +134 -62
  490. package/dist/lib/typeChecker/checker.d.ts +25 -0
  491. package/dist/lib/typeChecker/checker.js +41 -4
  492. package/dist/lib/typeChecker/definiteReturns.d.ts +16 -0
  493. package/dist/lib/typeChecker/definiteReturns.js +52 -0
  494. package/dist/lib/typeChecker/definiteReturns.test.d.ts +1 -0
  495. package/dist/lib/typeChecker/definiteReturns.test.js +203 -0
  496. package/dist/lib/typeChecker/effectPayloadCheck.d.ts +17 -0
  497. package/dist/lib/typeChecker/effectPayloadCheck.js +181 -0
  498. package/dist/lib/typeChecker/effectPayloadCheck.test.d.ts +1 -0
  499. package/dist/lib/typeChecker/effectPayloadCheck.test.js +192 -0
  500. package/dist/lib/typeChecker/flow.d.ts +131 -0
  501. package/dist/lib/typeChecker/flow.js +248 -0
  502. package/dist/lib/typeChecker/flow.test.d.ts +1 -0
  503. package/dist/lib/typeChecker/flow.test.js +467 -0
  504. package/dist/lib/typeChecker/flowAssignments.test.d.ts +1 -0
  505. package/dist/lib/typeChecker/flowAssignments.test.js +84 -0
  506. package/dist/lib/typeChecker/flowBuilder.d.ts +32 -0
  507. package/dist/lib/typeChecker/flowBuilder.js +337 -0
  508. package/dist/lib/typeChecker/flowBuilder.test.d.ts +1 -0
  509. package/dist/lib/typeChecker/flowBuilder.test.js +215 -0
  510. package/dist/lib/typeChecker/flowNarrowing.test.d.ts +1 -0
  511. package/dist/lib/typeChecker/flowNarrowing.test.js +96 -0
  512. package/dist/lib/typeChecker/handlerBodyInterrupts.test.js +1 -1
  513. package/dist/lib/typeChecker/handlerParamTyping.d.ts +31 -0
  514. package/dist/lib/typeChecker/handlerParamTyping.js +108 -0
  515. package/dist/lib/typeChecker/handlerParamTyping.test.d.ts +1 -0
  516. package/dist/lib/typeChecker/handlerParamTyping.test.js +379 -0
  517. package/dist/lib/typeChecker/ifExpression.test.d.ts +1 -0
  518. package/dist/lib/typeChecker/ifExpression.test.js +49 -0
  519. package/dist/lib/typeChecker/index.js +43 -3
  520. package/dist/lib/typeChecker/inference.d.ts +6 -0
  521. package/dist/lib/typeChecker/inference.js +1 -1
  522. package/dist/lib/typeChecker/interruptAnalysis.d.ts +9 -0
  523. package/dist/lib/typeChecker/interruptAnalysis.js +21 -13
  524. package/dist/lib/typeChecker/literalType.d.ts +9 -0
  525. package/dist/lib/typeChecker/literalType.js +18 -0
  526. package/dist/lib/typeChecker/matchArmNarrowing.test.d.ts +1 -0
  527. package/dist/lib/typeChecker/matchArmNarrowing.test.js +172 -0
  528. package/dist/lib/typeChecker/matchExhaustiveness.d.ts +9 -0
  529. package/dist/lib/typeChecker/matchExhaustiveness.js +238 -0
  530. package/dist/lib/typeChecker/matchExhaustiveness.test.d.ts +1 -0
  531. package/dist/lib/typeChecker/matchExhaustiveness.test.js +404 -0
  532. package/dist/lib/typeChecker/matchExprTypes.d.ts +37 -0
  533. package/dist/lib/typeChecker/matchExprTypes.js +143 -0
  534. package/dist/lib/typeChecker/matchExpression.test.d.ts +1 -0
  535. package/dist/lib/typeChecker/matchExpression.test.js +240 -0
  536. package/dist/lib/typeChecker/memberPathNarrowing.test.d.ts +1 -0
  537. package/dist/lib/typeChecker/memberPathNarrowing.test.js +419 -0
  538. package/dist/lib/typeChecker/narrowing.d.ts +113 -0
  539. package/dist/lib/typeChecker/narrowing.js +396 -0
  540. package/dist/lib/typeChecker/narrowing.test.d.ts +1 -0
  541. package/dist/lib/typeChecker/narrowing.test.js +930 -0
  542. package/dist/lib/typeChecker/neverType.test.d.ts +1 -0
  543. package/dist/lib/typeChecker/neverType.test.js +19 -0
  544. package/dist/lib/typeChecker/nullNarrowing.test.d.ts +1 -0
  545. package/dist/lib/typeChecker/nullNarrowing.test.js +246 -0
  546. package/dist/lib/typeChecker/nullish.test.d.ts +1 -0
  547. package/dist/lib/typeChecker/nullish.test.js +16 -0
  548. package/dist/lib/typeChecker/pathSegments.d.ts +56 -0
  549. package/dist/lib/typeChecker/pathSegments.js +73 -0
  550. package/dist/lib/typeChecker/primitiveMembers.d.ts +2 -2
  551. package/dist/lib/typeChecker/primitiveMembers.js +5 -5
  552. package/dist/lib/typeChecker/primitives.d.ts +2 -1
  553. package/dist/lib/typeChecker/primitives.js +2 -1
  554. package/dist/lib/typeChecker/recordLike.d.ts +18 -0
  555. package/dist/lib/typeChecker/recordLike.js +27 -0
  556. package/dist/lib/typeChecker/resolveCall.js +4 -0
  557. package/dist/lib/typeChecker/resultUnion.d.ts +8 -0
  558. package/dist/lib/typeChecker/resultUnion.js +43 -0
  559. package/dist/lib/typeChecker/scope.d.ts +9 -1
  560. package/dist/lib/typeChecker/scope.js +25 -4
  561. package/dist/lib/typeChecker/scope.test.js +15 -0
  562. package/dist/lib/typeChecker/scopeVisibility.test.d.ts +1 -0
  563. package/dist/lib/typeChecker/scopeVisibility.test.js +138 -0
  564. package/dist/lib/typeChecker/scopes.d.ts +7 -0
  565. package/dist/lib/typeChecker/scopes.js +164 -113
  566. package/dist/lib/typeChecker/strictMemberAccess.test.d.ts +1 -0
  567. package/dist/lib/typeChecker/strictMemberAccess.test.js +221 -0
  568. package/dist/lib/typeChecker/synthesizer.js +257 -47
  569. package/dist/lib/typeChecker/typeCases.d.ts +28 -0
  570. package/dist/lib/typeChecker/typeCases.js +122 -0
  571. package/dist/lib/typeChecker/typeCases.test.d.ts +1 -0
  572. package/dist/lib/typeChecker/typeCases.test.js +150 -0
  573. package/dist/lib/typeChecker/types.d.ts +26 -0
  574. package/dist/lib/typeChecker/utils.d.ts +19 -0
  575. package/dist/lib/typeChecker/utils.js +50 -10
  576. package/dist/lib/typeChecker.test.js +351 -34
  577. package/dist/lib/types/dataStructures.d.ts +18 -1
  578. package/dist/lib/types/effectDeclaration.d.ts +11 -0
  579. package/dist/lib/types/effectDeclaration.js +1 -0
  580. package/dist/lib/types/ifElse.d.ts +4 -0
  581. package/dist/lib/types/importStatement.d.ts +4 -0
  582. package/dist/lib/types/matchBlock.d.ts +15 -3
  583. package/dist/lib/types/matchYield.d.ts +16 -0
  584. package/dist/lib/types/matchYield.js +1 -0
  585. package/dist/lib/types.d.ts +54 -3
  586. package/dist/lib/types.js +37 -0
  587. package/dist/lib/utils/mapBodies.js +1 -1
  588. package/dist/lib/utils/node.d.ts +30 -0
  589. package/dist/lib/utils/node.js +160 -3
  590. package/dist/lib/utils/termcolors.d.ts +1 -1
  591. package/dist/lib/utils/termcolors.js +1 -1
  592. package/dist/scripts/agency.js +27 -0
  593. package/dist/scripts/genModelHashes.d.ts +10 -0
  594. package/dist/scripts/genModelHashes.js +88 -0
  595. package/package.json +4 -2
  596. package/stdlib/agency/eval.agency +31 -59
  597. package/stdlib/agency/eval.js +57 -85
  598. package/stdlib/agency/local.agency +189 -0
  599. package/stdlib/agency/local.js +1685 -0
  600. package/stdlib/agency.agency +169 -98
  601. package/stdlib/agency.js +279 -287
  602. package/stdlib/agent.agency +77 -79
  603. package/stdlib/agent.js +354 -53
  604. package/stdlib/args.agency +30 -53
  605. package/stdlib/args.js +44 -20
  606. package/stdlib/array.agency +21 -221
  607. package/stdlib/array.js +116 -416
  608. package/stdlib/{keyring.agency → auth/keyring.agency} +17 -17
  609. package/stdlib/{keyring.js → auth/keyring.js} +69 -52
  610. package/stdlib/{oauth.agency → auth/oauth.agency} +24 -27
  611. package/stdlib/{oauth.js → auth/oauth.js} +75 -54
  612. package/stdlib/calendar.agency +29 -88
  613. package/stdlib/calendar.js +40 -25
  614. package/stdlib/capabilities.agency +7 -3
  615. package/stdlib/capabilities.js +41 -18
  616. package/stdlib/clipboard.agency +19 -2
  617. package/stdlib/clipboard.js +40 -19
  618. package/stdlib/concurrency.agency +34 -22
  619. package/stdlib/concurrency.js +45 -38
  620. package/stdlib/data/finance/dbnomics.agency +115 -0
  621. package/stdlib/data/finance/dbnomics.js +934 -0
  622. package/stdlib/data/finance/edgar.agency +172 -0
  623. package/stdlib/data/finance/edgar.js +1598 -0
  624. package/stdlib/data/finance/fred.agency +215 -0
  625. package/stdlib/data/finance/fred.js +2028 -0
  626. package/stdlib/data/finance/gdelt.agency +98 -0
  627. package/stdlib/data/finance/gdelt.js +873 -0
  628. package/stdlib/data/people/littlesis.agency +322 -0
  629. package/stdlib/data/people/littlesis.js +3221 -0
  630. package/stdlib/data/tech/hackernews.agency +344 -0
  631. package/stdlib/data/tech/hackernews.js +3814 -0
  632. package/stdlib/data/tech/yc.agency +253 -0
  633. package/stdlib/data/tech/yc.js +2913 -0
  634. package/stdlib/date.agency +34 -81
  635. package/stdlib/date.js +53 -39
  636. package/stdlib/fs.agency +44 -16
  637. package/stdlib/fs.js +50 -37
  638. package/stdlib/git.agency +327 -0
  639. package/stdlib/git.js +3724 -0
  640. package/stdlib/http.agency +39 -14
  641. package/stdlib/http.js +39 -27
  642. package/stdlib/image.agency +44 -0
  643. package/stdlib/{search.js → image.js} +125 -131
  644. package/stdlib/index.agency +318 -116
  645. package/stdlib/index.js +1762 -517
  646. package/stdlib/llm.agency +115 -16
  647. package/stdlib/llm.js +727 -37
  648. package/stdlib/markdown.agency +38 -55
  649. package/stdlib/markdown.js +59 -67
  650. package/stdlib/math.agency +16 -0
  651. package/stdlib/math.js +175 -20
  652. package/stdlib/memory.agency +82 -90
  653. package/stdlib/memory.js +69 -116
  654. package/stdlib/{email.agency → messaging/email.agency} +11 -15
  655. package/stdlib/{email.js → messaging/email.js} +61 -43
  656. package/stdlib/{imessage.agency → messaging/imessage.agency} +7 -8
  657. package/stdlib/{imessage.js → messaging/imessage.js} +47 -27
  658. package/stdlib/{sms.agency → messaging/sms.agency} +8 -8
  659. package/stdlib/{sms.js → messaging/sms.js} +47 -27
  660. package/stdlib/object.agency +52 -5
  661. package/stdlib/object.js +414 -31
  662. package/stdlib/path.agency +29 -4
  663. package/stdlib/path.js +54 -30
  664. package/stdlib/policy.agency +136 -205
  665. package/stdlib/policy.js +255 -168
  666. package/stdlib/shell.agency +51 -27
  667. package/stdlib/shell.js +75 -53
  668. package/stdlib/skills.agency +41 -20
  669. package/stdlib/skills.js +82 -44
  670. package/stdlib/speech.agency +42 -24
  671. package/stdlib/speech.js +46 -42
  672. package/stdlib/statelog.agency +64 -46
  673. package/stdlib/statelog.js +165 -66
  674. package/stdlib/strategy.agency +27 -0
  675. package/stdlib/strategy.js +161 -23
  676. package/stdlib/syntax.agency +34 -27
  677. package/stdlib/syntax.js +46 -46
  678. package/stdlib/system.agency +62 -23
  679. package/stdlib/system.js +210 -49
  680. package/stdlib/tag.agency +62 -0
  681. package/stdlib/{threads.js → tag.js} +351 -415
  682. package/stdlib/thread.agency +282 -67
  683. package/stdlib/thread.js +1522 -263
  684. package/stdlib/{chart.agency → ui/chart.agency} +41 -48
  685. package/stdlib/{chart.js → ui/chart.js} +86 -65
  686. package/stdlib/ui/cli.agency +119 -0
  687. package/stdlib/{cli.js → ui/cli.js} +198 -85
  688. package/stdlib/{layout.agency → ui/layout.agency} +110 -178
  689. package/stdlib/{layout.js → ui/layout.js} +242 -148
  690. package/stdlib/{table.agency → ui/table.agency} +49 -50
  691. package/stdlib/{table.js → ui/table.js} +95 -69
  692. package/stdlib/ui.agency +194 -316
  693. package/stdlib/ui.js +445 -367
  694. package/stdlib/validation.agency +197 -0
  695. package/stdlib/{validators.js → validation.js} +199 -88
  696. package/stdlib/weather.agency +27 -4
  697. package/stdlib/weather.js +39 -21
  698. package/stdlib/web/browser.agency +52 -0
  699. package/stdlib/{browser.js → web/browser.js} +53 -33
  700. package/stdlib/web/search.agency +101 -0
  701. package/stdlib/web/search.js +638 -0
  702. package/stdlib/wikipedia.agency +28 -3
  703. package/stdlib/wikipedia.js +46 -21
  704. package/dist/lib/agents/docs/appendix/agency-stdlib.md +0 -25
  705. package/dist/lib/agents/docs/appendix/agency-vs-typescript.md +0 -14
  706. package/dist/lib/agents/docs/appendix/appendix/advanced-types.md +0 -26
  707. package/dist/lib/agents/docs/appendix/appendix/agency-stdlib.md +0 -25
  708. package/dist/lib/agents/docs/appendix/appendix/agency-vs-typescript.md +0 -14
  709. package/dist/lib/agents/docs/appendix/appendix/vscode-extension.md +0 -11
  710. package/dist/lib/agents/docs/appendix/builtins.md +0 -61
  711. package/dist/lib/agents/docs/appendix/callbacks.md +0 -162
  712. package/dist/lib/agents/docs/appendix/schema-parameter-injection.md +0 -101
  713. package/dist/lib/agents/docs/appendix/ts-helpers.md +0 -511
  714. package/dist/lib/agents/docs/appendix/vscode-extension.md +0 -11
  715. package/dist/lib/agents/docs/cli/cli/agent.md +0 -16
  716. package/dist/lib/agents/docs/cli/cli/compile.md +0 -21
  717. package/dist/lib/agents/docs/cli/cli/coverage.md +0 -112
  718. package/dist/lib/agents/docs/cli/cli/debug.md +0 -41
  719. package/dist/lib/agents/docs/cli/cli/doc.md +0 -98
  720. package/dist/lib/agents/docs/cli/cli/editor-integration.md +0 -44
  721. package/dist/lib/agents/docs/cli/cli/eval-judge.md +0 -72
  722. package/dist/lib/agents/docs/cli/cli/eval.md +0 -194
  723. package/dist/lib/agents/docs/cli/cli/format.md +0 -23
  724. package/dist/lib/agents/docs/cli/cli/index.md +0 -7
  725. package/dist/lib/agents/docs/cli/cli/optimize.md +0 -306
  726. package/dist/lib/agents/docs/cli/cli/pack.md +0 -56
  727. package/dist/lib/agents/docs/cli/cli/policy.md +0 -23
  728. package/dist/lib/agents/docs/cli/cli/preprocess-and-ast.md +0 -21
  729. package/dist/lib/agents/docs/cli/cli/review.md +0 -16
  730. package/dist/lib/agents/docs/cli/cli/run.md +0 -108
  731. package/dist/lib/agents/docs/cli/cli/schedule.md +0 -89
  732. package/dist/lib/agents/docs/cli/cli/serve.md +0 -52
  733. package/dist/lib/agents/docs/cli/cli/test.md +0 -44
  734. package/dist/lib/agents/docs/cli/cli/trace-and-bundle.md +0 -75
  735. package/dist/lib/agents/docs/cli/cli/typecheck.md +0 -19
  736. package/dist/lib/agents/docs/guide/agents-101.md +0 -212
  737. package/dist/lib/agents/docs/guide/execution-model.md +0 -130
  738. package/dist/lib/agents/docs/guide/guide/agency-config-file.md +0 -10
  739. package/dist/lib/agents/docs/guide/guide/agents-101.md +0 -212
  740. package/dist/lib/agents/docs/guide/guide/basic-syntax.md +0 -218
  741. package/dist/lib/agents/docs/guide/guide/blocks.md +0 -104
  742. package/dist/lib/agents/docs/guide/guide/checkpointing.md +0 -72
  743. package/dist/lib/agents/docs/guide/guide/cli-args.md +0 -190
  744. package/dist/lib/agents/docs/guide/guide/concurrency.md +0 -151
  745. package/dist/lib/agents/docs/guide/guide/cross-thread-context.md +0 -228
  746. package/dist/lib/agents/docs/guide/guide/effects-and-raises.md +0 -156
  747. package/dist/lib/agents/docs/guide/guide/error-handling.md +0 -149
  748. package/dist/lib/agents/docs/guide/guide/execution-model.md +0 -130
  749. package/dist/lib/agents/docs/guide/guide/functions.md +0 -33
  750. package/dist/lib/agents/docs/guide/guide/getting-started.md +0 -42
  751. package/dist/lib/agents/docs/guide/guide/global-vs-static.md +0 -81
  752. package/dist/lib/agents/docs/guide/guide/guards.md +0 -185
  753. package/dist/lib/agents/docs/guide/guide/handlers.md +0 -292
  754. package/dist/lib/agents/docs/guide/guide/imports-and-packages.md +0 -160
  755. package/dist/lib/agents/docs/guide/guide/interrupts.md +0 -99
  756. package/dist/lib/agents/docs/guide/guide/llm.md +0 -200
  757. package/dist/lib/agents/docs/guide/guide/mcp.md +0 -295
  758. package/dist/lib/agents/docs/guide/guide/memory.md +0 -388
  759. package/dist/lib/agents/docs/guide/guide/message-history-and-threads.md +0 -88
  760. package/dist/lib/agents/docs/guide/guide/nodes.md +0 -35
  761. package/dist/lib/agents/docs/guide/guide/observability.md +0 -92
  762. package/dist/lib/agents/docs/guide/guide/odds-and-ends.md +0 -41
  763. package/dist/lib/agents/docs/guide/guide/partial-application.md +0 -188
  764. package/dist/lib/agents/docs/guide/guide/pattern-matching.md +0 -193
  765. package/dist/lib/agents/docs/guide/guide/policies.md +0 -60
  766. package/dist/lib/agents/docs/guide/guide/schemas.md +0 -86
  767. package/dist/lib/agents/docs/guide/guide/serving.md +0 -165
  768. package/dist/lib/agents/docs/guide/guide/structured-interrupts.md +0 -49
  769. package/dist/lib/agents/docs/guide/guide/testing.md +0 -27
  770. package/dist/lib/agents/docs/guide/guide/troubleshooting.md +0 -137
  771. package/dist/lib/agents/docs/guide/guide/type-validation.md +0 -329
  772. package/dist/lib/agents/docs/guide/guide/types.md +0 -196
  773. package/dist/lib/agents/docs/guide/message-history-and-threads.md +0 -88
  774. package/dist/lib/agents/docs/guide/odds-and-ends.md +0 -41
  775. package/dist/lib/agents/docs/guide/structured-interrupts.md +0 -49
  776. package/stdlib/browser.agency +0 -47
  777. package/stdlib/cli.agency +0 -132
  778. package/stdlib/schemas.agency +0 -37
  779. package/stdlib/schemas.js +0 -213
  780. package/stdlib/search.agency +0 -57
  781. package/stdlib/threads.agency +0 -198
  782. package/stdlib/types.agency +0 -58
  783. package/stdlib/types.js +0 -212
  784. package/stdlib/validators.agency +0 -150
  785. /package/dist/lib/agents/docs/{appendix → guide}/advanced-types.md +0 -0
  786. /package/dist/lib/agents/docs/{appendix/appendix → guide}/schema-parameter-injection.md +0 -0
  787. /package/dist/lib/backends/{anthropicApiKey.codegen.test.d.ts → agencyGenerator.matchBlock.test.d.ts} +0 -0
@@ -1,10 +1,18 @@
1
1
  import { getVersion } from "std::agency"
2
+ import {
3
+ printLocalCatalog,
4
+ localModelsSupported,
5
+ listModelNames,
6
+ } from "std::agency/local"
2
7
  import { parseArgs } from "std::args"
3
- import { clearMessages, pushMessage, repl, clearScreen } from "std::cli"
8
+ import { map } from "std::array"
4
9
  import { today } from "std::date"
5
- import { setAgentCwd } from "std::index"
6
- import { box, render } from "std::layout"
7
- import { setMemoryId } from "std::memory"
10
+ import { generateImage } from "std::image"
11
+ import { applyAgentCwd, setAgentCwd } from "std::index"
12
+ import { listHostedModels, hostedModelInfo } from "std::llm"
13
+ import { setMemoryId, disableMemory } from "std::memory"
14
+ import { keys } from "std::object"
15
+ import { basename, dirname } from "std::path"
8
16
  import {
9
17
  ScopedRuleFields,
10
18
  cliPolicyHandler,
@@ -15,17 +23,65 @@ import { exists } from "std::shell"
15
23
  import { commandsDir, expandSlash } from "std::skills"
16
24
  import { highlight } from "std::syntax"
17
25
  import { cwd, env, isTTY, readStdin, setTitle } from "std::system"
18
- import { getCost, getModelCosts, systemMessage } from "std::thread"
26
+ import {
27
+ Attachment,
28
+ attachToReply,
29
+ getCost,
30
+ getModelCosts,
31
+ image,
32
+ systemMessage,
33
+ } from "std::thread"
19
34
  import { chooseOption, ChoiceItem } from "std::ui"
35
+ import {
36
+ clearMessages,
37
+ pushMessage,
38
+ repl,
39
+ clearScreen,
40
+ clearHistory,
41
+ } from "std::ui/cli"
42
+ import { box, render } from "std::ui/layout"
20
43
 
21
44
  import { figs, title } from "./images/images.agency"
22
- import { POLICY_PATH, HISTORY_PATH, ALWAYS_FIELDS } from "./lib/config.agency"
45
+ import { detectAttachments, modalityFilter } from "./lib/attachments.agency"
46
+ import {
47
+ POLICY_PATH,
48
+ SESSION_POLICY_PATH,
49
+ HISTORY_PATH,
50
+ ALWAYS_FIELDS,
51
+ } from "./lib/config.agency"
23
52
  import {
24
53
  minimalAutoApprovePolicy,
25
54
  recommendedAutoApprovePolicy,
55
+ builtinPolicy,
56
+ builtinPolicyNames,
57
+ BUILTIN_POLICIES,
26
58
  } from "./lib/defaultPolicy.agency"
59
+ import { filterHostedModels, ModelFilters } from "./lib/modelFilters.agency"
60
+ import { parseModelFlag, knownProviders, Resolved } from "./lib/models.agency"
61
+ import {
62
+ buildLayers,
63
+ resolveAll,
64
+ diffResolved,
65
+ Ctx,
66
+ SlotChange,
67
+ } from "./lib/resolution.agency"
68
+ import {
69
+ configureSearch,
70
+ setSearchBackend,
71
+ getSearchBackend,
72
+ availableBackendItems,
73
+ } from "./lib/search.agency"
74
+ import { getModelSettings, loadSettings } from "./lib/settings.agency"
27
75
  import { truncate, formatArgs, formatToolResponse } from "./lib/utils.agency"
28
- import { configureModels } from "./shared.agency"
76
+ import {
77
+ configureModels,
78
+ configureLocalModel,
79
+ enableAgentMemory,
80
+ getResolvedSlots,
81
+ applyResolved,
82
+ promoteAll,
83
+ currentProvider,
84
+ } from "./shared.agency"
29
85
  import { codeAgent } from "./subagents/code.agency"
30
86
  import { explorerAgent } from "./subagents/explorer.agency"
31
87
  import { oracleAgent } from "./subagents/oracle.agency"
@@ -87,6 +143,11 @@ let VERBOSE: boolean = false
87
143
  // scroll-output writes when stdout is destined for a Unix pipe.
88
144
  let _isInteractive: boolean = true
89
145
 
146
+ // The `--policy` argument (a built-in name or a policy-file path), or ""
147
+ // when the flag is absent. Set in main() before `setupSession` runs;
148
+ // consumed there to override the saved policy for this run only.
149
+ let _policyArg: string = ""
150
+
90
151
  // Live tool-call tracing. Always shown in the interactive REPL; in
91
152
  // one-shot mode it's suppressed so piped output is just the reply,
92
153
  // unless the user opts in with `--verbose` / `--debug` (AGENT_DEBUG).
@@ -126,13 +187,75 @@ callback("onLLMCallEnd") as data {
126
187
  }
127
188
  }
128
189
 
190
+ // Map a transient LLM retry reason (an `LLMRetryReason` from the runtime
191
+ // retry layer) to a short, human-facing label. `connectionLost` is the
192
+ // lost-internet / closed-the-laptop case; the rest cover provider hiccups
193
+ // and our own per-call timeout.
194
+ export def retryReasonLabel(reason: string): string {
195
+ if (reason == "connectionLost") {
196
+ return "Connection lost"
197
+ }
198
+ if (reason == "timeout") {
199
+ return "Request timed out"
200
+ }
201
+ if (reason == "streamInterrupted") {
202
+ return "Connection interrupted"
203
+ }
204
+ if (reason == "rateLimit") {
205
+ return "Rate limited"
206
+ }
207
+ if (reason == "overloaded") {
208
+ return "Model overloaded"
209
+ }
210
+ if (reason == "serverError") {
211
+ return "Server error"
212
+ }
213
+ return reason
214
+ }
215
+
216
+ // A transient LLM failure (lost connection, timeout, server hiccup) the
217
+ // runtime is about to retry. Surface a dim, one-line heads-up so the user
218
+ // understands the pause instead of staring at a frozen prompt — this is the
219
+ // "lost internet / closed the laptop" experience the abort taxonomy made
220
+ // distinguishable. Gated like the other traces so piped one-shot output
221
+ // stays clean. `attempt` is the 1-based retry number; `maxRetries` is the
222
+ // configured retry budget.
223
+ callback("onLLMRetry") as data {
224
+ if (_showTraces()) {
225
+ pushMessage(
226
+ color.dim(
227
+ "⟳ ${retryReasonLabel(data.reason)} — retrying (${data.attempt}/${data.maxRetries})…",
228
+ ),
229
+ )
230
+ }
231
+ }
232
+
233
+ // Turn a terminal (retries-exhausted) LLM failure into a short, actionable
234
+ // message. The runtime's exhausted-retry error text embeds the reason in
235
+ // parens, e.g. "LLM call failed after 3 attempts (connectionLost): ...". We
236
+ // recognize the transport reasons that mean "the network or model dropped"
237
+ // and give concrete advice; anything else echoes the raw error so nothing
238
+ // is hidden.
239
+ export def formatTurnFailure(errText: string): string {
240
+ if (errText.includes("(connectionLost)") || errText.includes("(streamInterrupted)")) {
241
+ return "⚠ Lost the connection to the model and couldn't recover after retrying.\nCheck your internet connection and try again."
242
+ }
243
+ if (errText.includes("(timeout)")) {
244
+ return "⚠ The model took too long to respond — the request timed out after retrying.\nTry again, perhaps with a smaller request."
245
+ }
246
+ if (errText.includes("(rateLimit)") || errText.includes("(overloaded)") || errText.includes("(serverError)")) {
247
+ return "⚠ The model provider is busy and the request failed after retrying.\nWait a moment and try again."
248
+ }
249
+ return "⚠ The request failed: ${errText}"
250
+ }
251
+
129
252
  type ToolCallData = {
130
253
  name: string;
131
254
  arguments: any
132
255
  }
133
256
 
134
257
  type LLMResponse = {
135
- output: string | null;
258
+ output?: string;
136
259
  toolCalls: ToolCallData[];
137
260
  usage: { inputTokens: number; outputTokens: number; totalTokens: number; cachedInputTokens: number };
138
261
  cost: { inputCost: number; outputCost: number; cachedInputCost: number; totalCost: number; currency: string };
@@ -144,7 +267,7 @@ def renderLLMCallResponse(data: LLMResponse): string {
144
267
  if (data.output != "" && data.output != null && data.output != undefined) {
145
268
  response.push(data.output)
146
269
  }
147
- if (data.toolCalls && data.toolCalls.length > 0) {
270
+ if (data.toolCalls.length > 0) {
148
271
  for (toolCall in data.toolCalls) {
149
272
  response.push(`${toolCall.name}(${formatArgs(toolCall.arguments)})`)
150
273
  }
@@ -184,7 +307,12 @@ def builtinPalette(): Record<string, string> {
184
307
  return {
185
308
  "/exit": "Exit the agent",
186
309
  "/clear": "Clear the conversation transcript",
310
+ "/clear-history": "Clear the input history (recall + saved file)",
187
311
  "/cost": "Show cumulative LLM cost and tokens",
312
+ "/model": "Switch the model (bare to pick, or slot=model)",
313
+ "/models": "List / filter the hosted model catalog",
314
+ "/local": "Switch to a local model",
315
+ "/search": "Choose the web search backend (hosted / Tavily / Brave / off)",
188
316
  "/paste": "Multi-line paste mode (Ctrl+D submits, Ctrl+C cancels)",
189
317
  "/help": "Show available slash commands"
190
318
  }
@@ -208,6 +336,136 @@ def mergedPalette(): Record<string, string> {
208
336
  return out
209
337
  }
210
338
 
339
+ // In-session model selection state. One mutable cell holding the current
340
+ // Session (the pin + per-slot overrides chosen via /model this run). switchModel
341
+ // is pure over this value — it copies, never mutates — so it stays testable.
342
+ export type Session = {
343
+ pin: string;
344
+ slots: Record<string, string>
345
+ }
346
+
347
+ let _session: Session = {
348
+ pin: "",
349
+ slots: {}
350
+ }
351
+
352
+ /** Apply an in-session model selection. Copies `prior` (never mutates), folds in
353
+ the new spec (bare → pin; slot=model → per-slot), resolves, applies, and returns
354
+ the new session + assignment + the slots that changed (so the caller can react,
355
+ e.g. the cross-provider recall notice). Turn-boundary semantics: takes effect on
356
+ the NEXT turn; no in-flight call is mutated. */
357
+ export def switchModel(
358
+ prior: Session,
359
+ spec: string,
360
+ ctx: Ctx,
361
+ before: Record<string, Resolved>,
362
+ ): { session: Session; resolved: Record<string, Resolved>; changes: SlotChange[] } {
363
+ let nextSlots: Record<string, string> = {}
364
+ for (key in Object.keys(prior.slots)) {
365
+ nextSlots[key] = prior.slots[key]
366
+ }
367
+ let next: Session = {
368
+ pin: prior.pin,
369
+ slots: nextSlots
370
+ }
371
+ const parsed = parseModelFlag(spec)
372
+ if (parsed.slot != "" && parsed.slot != "main" && parsed.slot != "reasoning") {
373
+ pushMessage(
374
+ color.red("Unknown model slot '${parsed.slot}'. Valid slots: main, reasoning."),
375
+ )
376
+ return {
377
+ session: prior,
378
+ resolved: before,
379
+ changes: []
380
+ }
381
+ }
382
+ if (parsed.slot == "") {
383
+ next.pin = parsed.model
384
+ } else {
385
+ next.slots[parsed.slot] = parsed.model
386
+ }
387
+
388
+ // A saved provider (settings.model.provider) means a provider is established,
389
+ // so a unified provider/model spec should not be split during resolution.
390
+ const settings = getModelSettings(loadSettings())
391
+ const providerEstablished = settings.provider != null && settings.provider != ""
392
+ const layers = buildLayers(
393
+ next.pin,
394
+ next.slots,
395
+ "",
396
+ {},
397
+ settings,
398
+ knownProviders(),
399
+ providerEstablished,
400
+ )
401
+ const all = resolveAll(layers, ctx)
402
+ if (isFailure(all)) {
403
+ pushMessage(color.red("Could not switch model: ${all.error}"))
404
+ return {
405
+ session: prior,
406
+ resolved: before,
407
+ changes: []
408
+ }
409
+ }
410
+ const resolved = promoteAll(all.value)
411
+ applyResolved(resolved)
412
+ return {
413
+ session: next,
414
+ resolved: resolved,
415
+ changes: diffResolved(before, resolved)
416
+ }
417
+ }
418
+
419
+ /** React to one resolved-slot change. Phase 1: a `main`-slot provider change
420
+ means the embedding space behind memory changed, so pause memory and warn.
421
+ (std::memory has no tier-2-only toggle yet -- full pause; structured recall
422
+ returns when a selective toggle lands.) Returns true if it emitted the notice. */
423
+ export def reactToSlotChange(change: SlotChange): boolean {
424
+ if (change.slot == "main" && change.before.provider != change.after.provider) {
425
+ pushMessage(
426
+ color.dim(
427
+ "Warning: provider changed - memory is paused until restart (recall would be unreliable).",
428
+ ),
429
+ )
430
+ // `with approve`: the agent is deliberately auto-pausing memory on a
431
+ // provider switch, not asking the user — so don't surface an approval prompt.
432
+ disableMemory() with approve
433
+ return true
434
+ }
435
+ return false
436
+ }
437
+
438
+ // ChoiceItem list for the model pickers: the hosted catalog, filtered, each
439
+ // labeled with provider + input price for an informed pick.
440
+ export def modelChoiceItems(filters: ModelFilters): ChoiceItem[] {
441
+ let items: ChoiceItem[] = []
442
+ for (model in filterHostedModels(listHostedModels(), filters)) {
443
+ const label = "${model.name} (${model.provider}, $${model.inputCost}/1M in)"
444
+ items.push({
445
+ key: model.name,
446
+ label: label
447
+ })
448
+ }
449
+ return items
450
+ }
451
+
452
+ // Parse a `/models [provider]` command line into filters. Bare `/models` (or a
453
+ // trailing-space-only arg) yields no filters; `/models <provider>` narrows to
454
+ // one provider. Extracted from the handler so it is unit-testable.
455
+ export def parseModelsFilters(cmd: string): ModelFilters {
456
+ const prefix = "/models "
457
+ if (!cmd.startsWith(prefix)) {
458
+ return {}
459
+ }
460
+ const arg = cmd.substring(prefix.length).trim()
461
+ if (arg == "") {
462
+ return {}
463
+ }
464
+ return {
465
+ provider: arg
466
+ }
467
+ }
468
+
211
469
  // Slash-command + user-message dispatcher invoked by `repl()` for
212
470
  // every Enter keystroke. Return `false` to terminate the loop.
213
471
  def _runTurn(msg: string): boolean {
@@ -227,8 +485,30 @@ def _runTurn(msg: string): boolean {
227
485
  clearMessages()
228
486
  return true
229
487
  }
488
+ if (trimmed == "/clear-history") {
489
+ clearHistory()
490
+ pushMessage("Input history cleared.")
491
+ return true
492
+ }
230
493
  if (trimmed == "/help") {
231
- pushMessage("Commands: /exit, /clear, /cost, /paste, /help")
494
+ pushMessage(
495
+ "Commands: /exit, /clear, /clear-history, /cost, /model, /models, /local, /search, /paste, /help",
496
+ )
497
+ return true
498
+ }
499
+ if (trimmed == "/search") {
500
+ const opts = availableBackendItems()
501
+ const choice = chooseOption(
502
+ "Web search backend",
503
+ "Pick how this agent searches the web. Current: ${getSearchBackend()}",
504
+ opts,
505
+ false,
506
+ true,
507
+ )
508
+ if (choice != "" && choice != null && choice != undefined) {
509
+ setSearchBackend(choice)
510
+ pushMessage("Web search backend set to: ${choice}")
511
+ }
232
512
  return true
233
513
  }
234
514
  if (trimmed == "/cost") {
@@ -252,18 +532,123 @@ def _runTurn(msg: string): boolean {
252
532
  pushMessage("")
253
533
  pushMessage("By model:")
254
534
  for (m in byModel) {
255
- pushMessage(" ${m.model} ↑${m.inputTokens} ↓${m.outputTokens} $${m.cost.toFixed(4)}")
535
+ pushMessage(
536
+ " ${m.model} ↑${m.inputTokens} ↓${m.outputTokens} $${m.cost.toFixed(4)}",
537
+ )
256
538
  }
257
539
  }
258
540
  return true
259
541
  }
542
+ if (trimmed == "/model" || trimmed.startsWith("/model ")) {
543
+ let spec = ""
544
+ if (trimmed != "/model") {
545
+ spec = trimmed.substring(7).trim()
546
+ }
547
+ if (spec == "") {
548
+ pushMessage("Current models:")
549
+ const current = getResolvedSlots()
550
+ for (slot in Object.keys(current)) {
551
+ const resolved = current[slot]
552
+ if (resolved != null) {
553
+ pushMessage(" ${slot}: ${resolved.model} (${resolved.via})")
554
+ }
555
+ }
556
+ const items = modelChoiceItems({})
557
+ const choice = chooseOption(
558
+ "Model",
559
+ "Pick a model, or type one (or slot=model, e.g. reasoning=claude-opus-4-8). Empty to cancel.",
560
+ items,
561
+ allowFreeText: true,
562
+ allowCancel: true,
563
+ )
564
+ if (choice == "" || choice == null) {
565
+ return true
566
+ }
567
+ spec = choice
568
+ }
569
+ const ctx: Ctx = {
570
+ provider: currentProvider(),
571
+ price: "standard"
572
+ }
573
+ const out = switchModel(_session, spec, ctx, getResolvedSlots())
574
+ _session = out.session
575
+ for (change in out.changes) {
576
+ reactToSlotChange(change)
577
+ }
578
+ pushMessage("Model set:")
579
+ for (slot in Object.keys(out.resolved)) {
580
+ const resolved = out.resolved[slot]
581
+ if (resolved != null) {
582
+ pushMessage(color.dim(" ${slot}: ${resolved.model} (${resolved.via})"))
583
+ }
584
+ }
585
+ return true
586
+ }
587
+ if (trimmed == "/models" || trimmed.startsWith("/models ")) {
588
+ const filters = parseModelsFilters(trimmed)
589
+ const models = filterHostedModels(listHostedModels(), filters)
590
+ if (models.length == 0) {
591
+ pushMessage("No models match.")
592
+ return true
593
+ }
594
+ for (model in models) {
595
+ pushMessage(
596
+ " ${model.name} (${model.provider}, $${model.inputCost}/1M in, ${model.contextWindow} ctx)",
597
+ )
598
+ }
599
+ return true
600
+ }
601
+ if (trimmed == "/local") {
602
+ if (!localModelsSupported()) {
603
+ pushMessage(
604
+ color.yellow(
605
+ "Local models need smoltalk-llama-cpp. Install: ! npm i -g smoltalk-llama-cpp",
606
+ ),
607
+ )
608
+ return true
609
+ }
610
+ let items: ChoiceItem[] = []
611
+ for (modelName in listModelNames()) {
612
+ items.push({
613
+ key: modelName.name,
614
+ label: modelName.name
615
+ })
616
+ }
617
+ const choice = chooseOption(
618
+ "Local model",
619
+ "Pick a local model, or type an hf: URI / .gguf path (downloads on first use):",
620
+ items,
621
+ allowFreeText: true,
622
+ allowCancel: true,
623
+ )
624
+ if (choice == "" || choice == null) {
625
+ return true
626
+ }
627
+ const before = getResolvedSlots()
628
+ configureLocalModel(choice)
629
+ configureSearch(true)
630
+ for (change in diffResolved(before, getResolvedSlots())) {
631
+ reactToSlotChange(change)
632
+ }
633
+ pushMessage("Switched to local model: ${choice}")
634
+ return true
635
+ }
636
+
260
637
  // Hand the message to the agent. `agentReply` does the slash-command
261
638
  // expansion and the actual agent work; the REPL just renders the reply.
262
- const reply = agentReply(msg)
263
- if (reply != "" && reply != null && reply != undefined) {
264
- pushMessage(highlight("${reply}\n", language: "markdown"))
265
- } else {
266
- pushMessage(color.red("No reply generated."))
639
+ // Wrap in `try` so a terminal LLM failure (e.g. the connection dropped and
640
+ // retries were exhausted) renders a friendly heads-up instead of a raw
641
+ // Failure object. Aborts/interrupts are NOT caught here — `try` re-throws
642
+ // them so an Esc-cancel still reaches the policy handler.
643
+ const result = try agentReply(msg)
644
+ if (result is success(reply)) {
645
+ if (reply != "" && reply != null && reply != undefined) {
646
+ pushMessage(highlight("${reply}\n", language: "markdown"))
647
+ } else {
648
+ pushMessage(color.red("No reply generated."))
649
+ }
650
+ } else if (result is failure(f)) {
651
+ pushMessage(color.red(formatTurnFailure("${f.error}")))
267
652
  }
268
653
  return true
269
654
  }
@@ -279,8 +664,8 @@ static const mainAgentSystemPrompt = """
279
664
  You are the top-level coordinator of an Agency-language assistant. You
280
665
  receive every user message and decide how to respond.
281
666
 
282
- You have five subagent tools, each running in its own isolated
283
- context:
667
+ You have five subagent tools (each running in its own isolated
668
+ context) and one direct tool:
284
669
 
285
670
  - `codeAgent(userMsg)` — anything that touches code or the filesystem:
286
671
  reading, writing, editing, typechecking, running shell commands,
@@ -297,6 +682,11 @@ context:
297
682
  - `explorerAgent(userMsg)` — a read-only researcher that produces
298
683
  broad, synthesizing answers about the codebase or bundled docs.
299
684
  Read the **Explorer** section below.
685
+ - `generateImageFile(prompt, path, size, images)` — generate an image
686
+ from a text prompt (or modify existing images by passing their paths
687
+ in `images`) and save it to `path`. Call it directly whenever the
688
+ user asks you to create, draw, edit, or restyle an image — do NOT
689
+ route image generation to `codeAgent`.
300
690
 
301
691
  **Answer directly (no tool call) when** the message is conversational,
302
692
  a clarifying question, or something you can answer from context alone.
@@ -439,22 +829,86 @@ unless the user has clearly asked for an action ("do X", "fix Y",
439
829
  with them — don't sprint to implementation.
440
830
  """
441
831
 
832
+ // Exported for tests: agent-cwd resolution of edit inputs is a spec
833
+ // invariant with no other observable (the deterministic image client
834
+ // ignores its images argument). generateImage accepts path / URL /
835
+ // data-URI strings, so only local paths get agent-cwd resolution —
836
+ // running a URL through applyAgentCwd would mangle it into
837
+ // "<agentCwd>/https:/…".
838
+ export def resolveEditInputs(images: string[]): string[] {
839
+ return map(images) as inputPath {
840
+ if (inputPath.startsWith("http://") || inputPath.startsWith("https://") || inputPath.startsWith("data:")) {
841
+ return inputPath
842
+ }
843
+ return applyAgentCwd(inputPath)
844
+ }
845
+ }
846
+
847
+ // Direct image generation for the coordinator. Saves to disk and
848
+ // returns the path — never base64, which would flood the LLM context.
849
+ // The write rides the std::writeBinary interrupt gate (writes are not
850
+ // auto-approved by policy) and generation cost accrues to the agent's
851
+ // cost tracking like any llm() call.
852
+ export def generateImageFile(
853
+ prompt: string,
854
+ path: string,
855
+ size: string = "",
856
+ images: string[] = [],
857
+ ): string {
858
+ """
859
+ Generate an image from a text prompt and save it to `path`. To MODIFY
860
+ existing images (edit / variation), pass their paths in `images`.
861
+ Returns the saved path on success. Use this when the user asks to
862
+ create, draw, edit, or restyle an image.
863
+
864
+ @param prompt - What to generate, or how to modify the input images.
865
+ @param path - Where to save the resulting image (e.g. "diagram.png").
866
+ @param size - Optional size like "1024x1024".
867
+ @param images - Optional input image paths to edit / vary.
868
+ """
869
+ // LLM-supplied paths resolve against the agent cwd, like every other
870
+ // agent file tool.
871
+ const inputs = resolveEditInputs(images)
872
+ const generated = generateImage(prompt, size: size, images: inputs)
873
+ if (isFailure(generated)) {
874
+ return "Image generation failed: ${generated.error}"
875
+ }
876
+ // writeBinary rejects an absolute filename when dir is set, so split
877
+ // path into (dir, name); useAgentCwd resolves a relative dir against
878
+ // the agent cwd (absolute dirs pass through untouched).
879
+ const written = writeBinary(
880
+ basename(path),
881
+ generated.value.base64,
882
+ dirname(path),
883
+ useAgentCwd: true,
884
+ )
885
+ if (isFailure(written)) {
886
+ return "Generated the image, but saving to ${path} failed: ${written.error}"
887
+ }
888
+ // Show the model what it made (generate -> view -> refine). The loop
889
+ // inlines the bytes when it builds the injected user message; the
890
+ // path resolves the same way the write did.
891
+ attachToReply(image(applyAgentCwd(path)))
892
+ return "Saved image to ${path}"
893
+ }
894
+
442
895
  static const mainAgentTools = [
443
896
  researchAgent.partial(allowHandoff: false),
444
897
  codeAgent.partial(allowHandoff: false),
445
898
  reviewAgent.partial(allowHandoff: false),
446
899
  oracleAgent.partial(allowHandoff: false),
447
900
  explorerAgent.partial(allowHandoff: false),
901
+ generateImageFile,
448
902
  ]
449
903
 
450
- def mainAgent(prompt: string): string {
904
+ def mainAgent(prompt: string | (string | Attachment)[]): string {
451
905
  thread(label: "main", summarize: true, session: "main") {
452
906
  setMemoryId("main")
453
907
  if (first) {
454
908
  // `_context` carries the per-run grounding (date, cwd, AGENTS.md),
455
909
  // set by `setupSession`. Appending it to the system prompt is what
456
910
  // actually gets that context to the LLM.
457
- systemMessage(mainAgentSystemPrompt + _context)
911
+ systemMessage("${mainAgentSystemPrompt}${_context}")
458
912
  first = false
459
913
  }
460
914
  const result = llm(prompt, {
@@ -487,7 +941,30 @@ export def agentReplyVia(target: string, userMsg: string): string {
487
941
  if (target == "review") {
488
942
  return reviewAgent(expanded, false)
489
943
  }
490
- return mainAgent(expanded)
944
+ // Auto-attach image/PDF files the user referenced (drag-drop or typed
945
+ // path), filtered to what the resolved model accepts. Never silent:
946
+ // every attach and every skip prints a visible line.
947
+ const detected = modalityFilter(detectAttachments(expanded))
948
+ for (skippedFile in detected.skipped) {
949
+ pushMessage(
950
+ color.yellow("📎 skipped ${skippedFile.label} (${skippedFile.reason})"),
951
+ )
952
+ }
953
+ if (detected.attached.length == 0) {
954
+ // Deliberate special case: a text-only turn stays a bare string. A
955
+ // one-element array is API-equivalent, but the stored thread message
956
+ // shape (string vs parts array) — and with it every serialized
957
+ // session and message fixture — would change for EVERY turn.
958
+ return mainAgent(expanded)
959
+ }
960
+ for (item in detected.attached) {
961
+ pushMessage(color.dim("📎 attached ${item.label}"))
962
+ }
963
+ const attachments = map(detected.attached) as item {
964
+ return item.attachment
965
+ }
966
+ const parts: (string | Attachment)[] = [expanded, ...attachments]
967
+ return mainAgent(parts)
491
968
  }
492
969
 
493
970
  // The agent's core turn, decoupled from the terminal: expand any project
@@ -543,6 +1020,21 @@ def printHeader() {
543
1020
  print(render(data, color: true))
544
1021
  }
545
1022
 
1023
+ // Print `--policy` usage and list the built-in policies (name + one-line
1024
+ // description). Shown when `--policy` is passed with no value.
1025
+ def printPolicyHelp() {
1026
+ print(color.bold("Usage: agency agent --policy <name | path>"))
1027
+ print(
1028
+ "Select the approval policy for this run: a built-in name below, or a path to a policy JSON file.",
1029
+ )
1030
+ print("")
1031
+ print(color.bold("Built-in policies:"))
1032
+ for (p in BUILTIN_POLICIES) {
1033
+ print(" ${color.cyan(p.name)}")
1034
+ print(" ${p.description}")
1035
+ }
1036
+ }
1037
+
546
1038
  def givePolicyChoice() {
547
1039
  const title = "Welcome to the agency agent. Please pick a policy to start."
548
1040
  const body = "Don't worry, you can change this later. The policy just controls how the agent asks for your approval when it wants to do something. You can also create your own custom policy file at ${POLICY_PATH} and the agent will use it automatically."
@@ -558,9 +1050,9 @@ def givePolicyChoice() {
558
1050
  ]
559
1051
 
560
1052
  const answer = chooseOption(title, body, items, allowFreeText: true)
561
- match(answer) {
562
- "minimal" => return minimalAutoApprovePolicy
563
- "recommended" => return recommendedAutoApprovePolicy
1053
+ return match(answer) {
1054
+ "minimal" => minimalAutoApprovePolicy
1055
+ "recommended" => recommendedAutoApprovePolicy
564
1056
  }
565
1057
  }
566
1058
 
@@ -584,25 +1076,66 @@ def setupSession(interactive: boolean): any {
584
1076
  const projectContext = loadAgentsMd(cwd()) with approve
585
1077
  _context = "\n\nCurrent date: ${today()}\nCurrent working directory: ${cwd()}${projectContext}"
586
1078
 
587
- const policy = parsePolicyFile(POLICY_PATH)
588
- if (policy is failure(f)) {
589
- if (f.status == "doesnt-exist") {
590
- if (interactive) {
591
- print(color.yellow("No existing policy found at ${POLICY_PATH}."))
592
- setPolicy(POLICY_PATH, givePolicyChoice())
1079
+ // Which file the handler persists against, and an optional in-memory
1080
+ // policy to start from. Normally the user's saved policy loaded from
1081
+ // POLICY_PATH; a `--policy` override redirects this (see below) so the
1082
+ // saved policy is never read or written.
1083
+ let policyFile = POLICY_PATH
1084
+ let sessionPolicy: any = null
1085
+
1086
+ if (_policyArg != "") {
1087
+ // `--policy` override: a built-in name or a path to a policy file.
1088
+ // The cwd-scoped built-ins pin the launch directory, so we resolve
1089
+ // them against `cwd()` (what `setAgentCwd` just stored, and what the
1090
+ // write/git/bash interrupts resolve their default paths back to).
1091
+ const builtin = builtinPolicy(_policyArg, cwd())
1092
+ if (builtin != null) {
1093
+ // Hand the policy to the handler in memory (no disk write): a
1094
+ // one-off, cwd-scoped override must not clobber the saved policy
1095
+ // or leak into a later run from a different directory. Any new
1096
+ // interactive "always" decision persists to the session file.
1097
+ policyFile = SESSION_POLICY_PATH
1098
+ sessionPolicy = builtin
1099
+ } else {
1100
+ // Not a built-in name — treat it as a policy file path and use it
1101
+ // directly (the handler loads/persists it). Validate up front so a
1102
+ // typo fails fast instead of silently starting from empty.
1103
+ const loaded = parsePolicyFile(_policyArg)
1104
+ if (loaded is failure(f)) {
1105
+ print(
1106
+ color.red(
1107
+ "--policy '${_policyArg}' is neither a built-in policy (${builtinPolicyNames().join(", ")}) nor a readable policy file (${f.status}).",
1108
+ ),
1109
+ )
1110
+ process.exit(1)
1111
+ }
1112
+ policyFile = _policyArg
1113
+ }
1114
+ } else {
1115
+ const policy = parsePolicyFile(POLICY_PATH)
1116
+ if (policy is failure(f)) {
1117
+ if (f.status == "doesnt-exist") {
1118
+ if (interactive) {
1119
+ print(color.yellow("No existing policy found at ${POLICY_PATH}."))
1120
+ setPolicy(POLICY_PATH, givePolicyChoice())
1121
+ } else {
1122
+ setPolicy(POLICY_PATH, recommendedAutoApprovePolicy)
1123
+ }
593
1124
  } else {
594
- setPolicy(POLICY_PATH, recommendedAutoApprovePolicy)
1125
+ print(color.red("Failed to load policy: ${JSON.stringify(f.error)}"))
1126
+ process.exit(1)
595
1127
  }
596
1128
  } else {
597
- print(color.red("Failed to load policy: ${JSON.stringify(f.error)}"))
598
- process.exit(1)
1129
+ setPolicy(POLICY_PATH, policy.value)
599
1130
  }
600
- } else {
601
- setPolicy(POLICY_PATH, policy.value)
602
1131
  }
603
1132
  // Bind the handler to a local var so `with handler` parses (the
604
1133
  // `with` clause only accepts an identifier, not a call expression).
605
- return cliPolicyHandler(file: POLICY_PATH, fields: ALWAYS_FIELDS)
1134
+ return cliPolicyHandler(
1135
+ file: policyFile,
1136
+ fields: ALWAYS_FIELDS,
1137
+ policy: sessionPolicy,
1138
+ )
606
1139
  }
607
1140
 
608
1141
  // One-shot entry: run a single turn through the same `mainAgent` the
@@ -616,7 +1149,15 @@ def oneShotAgent(target: string, prompt: string): string {
616
1149
  const handler = setupSession(false)
617
1150
  let reply: string = ""
618
1151
  handle {
619
- reply = agentReplyVia(target, prompt)
1152
+ // `try` converts a terminal LLM failure (retries exhausted on a dropped
1153
+ // connection / timeout) into a friendly message; aborts/interrupts still
1154
+ // propagate to the handler below.
1155
+ const result = try agentReplyVia(target, prompt)
1156
+ if (result is success(r)) {
1157
+ reply = r
1158
+ } else if (result is failure(f)) {
1159
+ reply = formatTurnFailure("${f.error}")
1160
+ }
620
1161
  } with (data) {
621
1162
  return handler(data)
622
1163
  }
@@ -628,11 +1169,15 @@ def oneShotAgent(target: string, prompt: string): string {
628
1169
  // Mirrors the reply-rendering half of `_runTurn`.
629
1170
  def _runSeedTurn(target: string, msg: string) {
630
1171
  pushMessage(color.dim("> ${msg}"))
631
- const reply = agentReplyVia(target, msg)
632
- if (reply != "" && reply != null && reply != undefined) {
633
- pushMessage(highlight("${reply}\n", language: "markdown"))
634
- } else {
635
- pushMessage(color.red("No reply generated."))
1172
+ const result = try agentReplyVia(target, msg)
1173
+ if (result is success(reply)) {
1174
+ if (reply != "" && reply != null && reply != undefined) {
1175
+ pushMessage(highlight("${reply}\n", language: "markdown"))
1176
+ } else {
1177
+ pushMessage(color.red("No reply generated."))
1178
+ }
1179
+ } else if (result is failure(f)) {
1180
+ pushMessage(color.red(formatTurnFailure("${f.error}")))
636
1181
  }
637
1182
  }
638
1183
 
@@ -697,7 +1242,7 @@ node main() {
697
1242
  },
698
1243
  provider: {
699
1244
  type: "string",
700
- description: "Force the LLM provider. Given alone (openai/anthropic/google) it selects that provider's default models and skips env auto-detection; pair it with --model for a custom/local model name"
1245
+ description: "Force the LLM provider. Given alone (openai/anthropic/google/openrouter) it selects that provider's default models and skips env auto-detection; pair it with --model for any other provider (e.g. litellm, openai-compat, or a custom/local model)"
701
1246
  },
702
1247
  interactive: {
703
1248
  type: "boolean",
@@ -707,6 +1252,21 @@ node main() {
707
1252
  agent: {
708
1253
  type: "string",
709
1254
  description: "Route the starting prompt to a named subagent: code, research, oracle, explorer, review (default: coordinator)"
1255
+ },
1256
+ policy: {
1257
+ type: "string",
1258
+ optional: true,
1259
+ description: "Approval policy for this run: a built-in name (minimal, recommended, with-writes, with-bash) or a path to a policy JSON file. with-writes/with-bash auto-approve writes (and, for with-bash, shell) scoped to the current directory and its children. Overrides the saved policy without persisting it. Pass --policy with no value to list the built-in policies."
1260
+ },
1261
+ local: {
1262
+ type: "string",
1263
+ optional: true,
1264
+ description: "Run a local model (downloads if needed): a curated short name, an hf: URI, or a .gguf path. Run without a value for guided setup. Pins all slots to the local model; mutually exclusive with --model/--fastmodel/--slowmodel. Requires: npm i -g smoltalk-llama-cpp"
1265
+ },
1266
+ "local-model": {
1267
+ type: "string",
1268
+ optional: true,
1269
+ description: "Deprecated alias for --local."
710
1270
  }
711
1271
  }
712
1272
  },
@@ -718,20 +1278,107 @@ node main() {
718
1278
  if (args.flags.verbose) {
719
1279
  VERBOSE = true
720
1280
  }
721
-
722
- // Resolve which models to use. Explicit flags win; otherwise detect a
723
- // provider from API-key env vars and use that provider's defaults. The
724
- // fast model becomes the run-wide default via `setModel`; the slow
725
- // model is read by the deep-reasoning subagents (oracle, explorer).
726
- // Resolve + apply the fast/slow models. Absent string flags read as
727
- // `undefined`, and agency's `== null` does not match `undefined`, so
728
- // normalize via `??` (which does treat `undefined` as nullish) to "".
729
- configureModels(
730
- args.flags.model ?? "",
731
- args.flags.fastmodel ?? "",
732
- args.flags.slowmodel ?? "",
733
- args.flags.provider ?? "",
734
- )
1281
+ // `--policy` is an optional-value flag: a bare `--policy` (no name or
1282
+ // path) prints the usage + the built-in policies and exits, rather than
1283
+ // silently doing nothing.
1284
+ if (args.flags.policy == "") {
1285
+ printPolicyHelp()
1286
+ process.exit(0)
1287
+ }
1288
+ _policyArg = args.flags.policy ?? ""
1289
+
1290
+ // Model setup. `--local` (deprecated alias: `--local-model`) is an optional-
1291
+ // value flag with three states: absent (null); bare empty-string for guided
1292
+ // setup; a value for that local model. `--local` and the hosted flags
1293
+ // (--model / --fastmodel / --slowmodel) are mutually exclusive -- local and
1294
+ // hosted are different in kind (provider llama-cpp, no embedding endpoint).
1295
+ const localVal = args.flags["local"] ?? args.flags["local-model"]
1296
+ const modelArg = args.flags.model ?? ""
1297
+ const hasModelFlags = modelArg != "" || (args.flags.fastmodel ?? "") != "" || (args.flags.slowmodel ?? "") != ""
1298
+ if (localVal != null && hasModelFlags) {
1299
+ print(
1300
+ color.red("Pass either --model (hosted) or --local (local), not both."),
1301
+ )
1302
+ process.exit(1)
1303
+ }
1304
+ if (localVal == "") {
1305
+ // Bare --local: guided setup. Non-interactive can't prompt, so keep the
1306
+ // print-catalog-and-exit behavior there.
1307
+ if (!isTTY()) {
1308
+ printLocalCatalog()
1309
+ process.exit(0)
1310
+ }
1311
+ if (!localModelsSupported()) {
1312
+ print(color.yellow("Local models need the smoltalk-llama-cpp package."))
1313
+ print("Install it, then re-run: ! npm i -g smoltalk-llama-cpp")
1314
+ process.exit(1)
1315
+ }
1316
+ let items: ChoiceItem[] = []
1317
+ for (modelName in listModelNames()) {
1318
+ items.push({
1319
+ key: modelName.name,
1320
+ label: modelName.name
1321
+ })
1322
+ }
1323
+ const choice = chooseOption(
1324
+ "Local model",
1325
+ "Pick a model, or type an hf: URI / .gguf path (downloads on first use):",
1326
+ items,
1327
+ allowFreeText: true,
1328
+ allowCancel: true,
1329
+ )
1330
+ if (choice == "" || choice == null) {
1331
+ process.exit(0)
1332
+ }
1333
+ configureLocalModel(choice)
1334
+ configureSearch(true)
1335
+ // fall through into the session on the chosen local model
1336
+ } else if (localVal != null) {
1337
+ configureLocalModel(localVal)
1338
+ // Intentionally do NOT enable memory for a local model: the llama-cpp
1339
+ // provider has no embedding endpoint, so memory would only emit a
1340
+ // "Tier-2 disabled" notice. std::memory calls no-op while it's off.
1341
+ configureSearch(true)
1342
+ } else {
1343
+ // Hosted path. --model accepts `slot=model` (per-slot) or a bare model
1344
+ // (global pin); explicit --fastmodel/--slowmodel win over a --model slot=.
1345
+ const parsed = parseModelFlag(modelArg)
1346
+ let modelGlobal = ""
1347
+ let fastFlag = ""
1348
+ let slowFlag = ""
1349
+ if (modelArg != "") {
1350
+ if (parsed.slot == "") {
1351
+ modelGlobal = parsed.model
1352
+ } else if (parsed.slot == "main") {
1353
+ fastFlag = parsed.model
1354
+ } else if (parsed.slot == "reasoning") {
1355
+ slowFlag = parsed.model
1356
+ } else {
1357
+ print(
1358
+ color.red(
1359
+ "Unknown model slot '${parsed.slot}' in --model. Valid slots: main, reasoning.",
1360
+ ),
1361
+ )
1362
+ process.exit(1)
1363
+ }
1364
+ }
1365
+ const fm = args.flags.fastmodel ?? ""
1366
+ const sm = args.flags.slowmodel ?? ""
1367
+ if (fm != "") {
1368
+ fastFlag = fm
1369
+ }
1370
+ if (sm != "") {
1371
+ slowFlag = sm
1372
+ }
1373
+ configureModels(modelGlobal, fastFlag, slowFlag, args.flags.provider ?? "")
1374
+ // Persistent knowledge graph — enabled for hosted providers, skipped for
1375
+ // local models. (Some hosted providers, e.g. anthropic, still lack an
1376
+ // embedding endpoint and just disable Tier-2 recall with a one-time
1377
+ // notice; structured recall works regardless.) Must run before any
1378
+ // handler/REPL is installed.
1379
+ enableAgentMemory()
1380
+ configureSearch(false)
1381
+ }
735
1382
 
736
1383
  // Positional args (everything after flags) are joined with spaces to
737
1384
  // form the starting prompt. `--` ends flag parsing if a positional