agency-lang 0.6.4 → 0.7.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 (843) hide show
  1. package/dist/lib/agents/agency-agent/agent.agency +595 -43
  2. package/dist/lib/agents/agency-agent/agent.js +5134 -2060
  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 +2 -0
  7. package/dist/lib/agents/agency-agent/lib/config.js +47 -15
  8. package/dist/lib/agents/agency-agent/lib/defaultPolicy.agency +28 -1
  9. package/dist/lib/agents/agency-agent/lib/defaultPolicy.js +64 -16
  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 +38 -21
  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 +88 -48
  30. package/dist/lib/agents/agency-agent/subagents/explorer.agency +4 -2
  31. package/dist/lib/agents/agency-agent/subagents/explorer.js +57 -43
  32. package/dist/lib/agents/agency-agent/subagents/oracle.agency +4 -2
  33. package/dist/lib/agents/agency-agent/subagents/oracle.js +57 -43
  34. package/dist/lib/agents/agency-agent/subagents/research.agency +9 -10
  35. package/dist/lib/agents/agency-agent/subagents/research.js +55 -39
  36. package/dist/lib/agents/agency-agent/subagents/review.js +41 -24
  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/cli/editor-integration.md +1 -1
  77. package/dist/lib/agents/docs/cli/cli/local.md +92 -0
  78. package/dist/lib/agents/docs/cli/cli/models.md +63 -0
  79. package/dist/lib/agents/docs/cli/cli/optimize.md +33 -1
  80. package/dist/lib/agents/docs/cli/cli/run.md +0 -29
  81. package/dist/lib/agents/docs/cli/editor-integration.md +1 -1
  82. package/dist/lib/agents/docs/cli/local.md +92 -0
  83. package/dist/lib/agents/docs/cli/models.md +63 -0
  84. package/dist/lib/agents/docs/cli/optimize.md +33 -1
  85. package/dist/lib/agents/docs/cli/run.md +0 -29
  86. package/dist/lib/agents/docs/guide/agency-config-file.md +205 -3
  87. package/dist/lib/agents/docs/guide/agency-packages.md +54 -0
  88. package/dist/lib/agents/docs/guide/agency-stdlib.md +14 -0
  89. package/dist/lib/agents/docs/guide/agency-vs-typescript.md +33 -0
  90. package/dist/lib/agents/docs/guide/attachments.md +56 -0
  91. package/dist/lib/agents/docs/guide/basic-syntax.md +204 -72
  92. package/dist/lib/agents/docs/guide/blocks.md +64 -34
  93. package/dist/lib/agents/docs/guide/build-integration.md +99 -0
  94. package/dist/lib/agents/docs/{appendix/appendix → guide}/builtins.md +27 -4
  95. package/dist/lib/agents/docs/{appendix/appendix → guide}/callbacks.md +55 -33
  96. package/dist/lib/agents/docs/guide/checkpointing.md +56 -27
  97. package/dist/lib/agents/docs/guide/cli-args.md +1 -1
  98. package/dist/lib/agents/docs/guide/common-functions.md +36 -0
  99. package/dist/lib/agents/docs/guide/compiling-and-running.md +62 -0
  100. package/dist/lib/agents/docs/guide/concurrency.md +49 -92
  101. package/dist/lib/agents/docs/guide/cross-thread-context.md +5 -7
  102. package/dist/lib/agents/docs/guide/custom-providers.md +195 -0
  103. package/dist/lib/agents/docs/guide/debugging.md +67 -0
  104. package/dist/lib/agents/docs/guide/developer-tools.md +90 -0
  105. package/dist/lib/agents/docs/guide/effects-and-raises.md +73 -92
  106. package/dist/lib/agents/docs/guide/effects.md +100 -0
  107. package/dist/lib/agents/docs/guide/error-handling.md +56 -44
  108. package/dist/lib/agents/docs/guide/exercise-1.md +32 -0
  109. package/dist/lib/agents/docs/guide/functions.md +71 -10
  110. package/dist/lib/agents/docs/guide/getting-started.md +5 -12
  111. package/dist/lib/agents/docs/guide/global-var-initialization.md +70 -0
  112. package/dist/lib/agents/docs/guide/global-vs-static.md +29 -34
  113. package/dist/lib/agents/docs/guide/guards.md +57 -108
  114. package/dist/lib/agents/docs/guide/guide/agency-config-file.md +205 -3
  115. package/dist/lib/agents/docs/guide/guide/agency-packages.md +54 -0
  116. package/dist/lib/agents/docs/guide/guide/agency-stdlib.md +14 -0
  117. package/dist/lib/agents/docs/guide/guide/agency-vs-typescript.md +33 -0
  118. package/dist/lib/agents/docs/guide/guide/attachments.md +56 -0
  119. package/dist/lib/agents/docs/guide/guide/basic-syntax.md +204 -72
  120. package/dist/lib/agents/docs/guide/guide/blocks.md +64 -34
  121. package/dist/lib/agents/docs/guide/guide/build-integration.md +99 -0
  122. package/dist/lib/agents/docs/{appendix → guide/guide}/builtins.md +27 -4
  123. package/dist/lib/agents/docs/{appendix → guide/guide}/callbacks.md +55 -33
  124. package/dist/lib/agents/docs/guide/guide/checkpointing.md +56 -27
  125. package/dist/lib/agents/docs/guide/guide/cli-args.md +1 -1
  126. package/dist/lib/agents/docs/guide/guide/common-functions.md +36 -0
  127. package/dist/lib/agents/docs/guide/guide/compiling-and-running.md +62 -0
  128. package/dist/lib/agents/docs/guide/guide/concurrency.md +49 -92
  129. package/dist/lib/agents/docs/guide/guide/cross-thread-context.md +5 -7
  130. package/dist/lib/agents/docs/guide/guide/custom-providers.md +195 -0
  131. package/dist/lib/agents/docs/guide/guide/debugging.md +67 -0
  132. package/dist/lib/agents/docs/guide/guide/developer-tools.md +90 -0
  133. package/dist/lib/agents/docs/guide/guide/effects-and-raises.md +73 -92
  134. package/dist/lib/agents/docs/guide/guide/effects.md +100 -0
  135. package/dist/lib/agents/docs/guide/guide/error-handling.md +56 -44
  136. package/dist/lib/agents/docs/guide/guide/exercise-1.md +32 -0
  137. package/dist/lib/agents/docs/guide/guide/functions.md +71 -10
  138. package/dist/lib/agents/docs/guide/guide/getting-started.md +5 -12
  139. package/dist/lib/agents/docs/guide/guide/global-var-initialization.md +70 -0
  140. package/dist/lib/agents/docs/guide/guide/global-vs-static.md +29 -34
  141. package/dist/lib/agents/docs/guide/guide/guards.md +57 -108
  142. package/dist/lib/agents/docs/guide/guide/handlers.md +109 -205
  143. package/dist/lib/agents/docs/guide/guide/image-generation.md +113 -0
  144. package/dist/lib/agents/docs/guide/guide/imports-and-packages.md +35 -95
  145. package/dist/lib/agents/docs/guide/guide/interrupts-from-typescript.md +84 -0
  146. package/dist/lib/agents/docs/guide/guide/interrupts-part-2.md +54 -0
  147. package/dist/lib/agents/docs/guide/guide/interrupts.md +98 -58
  148. package/dist/lib/agents/docs/guide/guide/llm-part-2.md +111 -0
  149. package/dist/lib/agents/docs/guide/guide/llm.md +53 -124
  150. package/dist/lib/agents/docs/guide/guide/memory.md +262 -249
  151. package/dist/lib/agents/docs/guide/guide/message-threads.md +111 -0
  152. package/dist/lib/agents/docs/guide/guide/nodes.md +32 -17
  153. package/dist/lib/agents/docs/guide/guide/observability.md +11 -4
  154. package/dist/lib/agents/docs/guide/guide/partial-application.md +40 -132
  155. package/dist/lib/agents/docs/guide/guide/pattern-matching.md +216 -43
  156. package/dist/lib/agents/docs/guide/guide/policies.md +11 -4
  157. package/dist/lib/agents/docs/guide/guide/schemas.md +22 -9
  158. package/dist/lib/agents/docs/guide/guide/state-isolation.md +139 -0
  159. package/dist/lib/agents/docs/guide/guide/streaming.md +28 -0
  160. package/dist/lib/agents/docs/guide/guide/tags.md +72 -0
  161. package/dist/lib/agents/docs/guide/guide/testing.md +167 -7
  162. package/dist/lib/agents/docs/guide/guide/troubleshooting.md +2 -53
  163. package/dist/lib/agents/docs/{appendix/appendix → guide/guide}/ts-helpers.md +48 -0
  164. package/dist/lib/agents/docs/guide/guide/ts-interop.md +16 -129
  165. package/dist/lib/agents/docs/guide/guide/type-validation.md +30 -172
  166. package/dist/lib/agents/docs/guide/guide/types.md +69 -84
  167. package/dist/lib/agents/docs/guide/guide/unused.md +178 -0
  168. package/dist/lib/agents/docs/guide/guide/unused2.md +258 -0
  169. package/dist/lib/agents/docs/guide/guide/value-parameterized-types.md +186 -0
  170. package/dist/lib/agents/docs/guide/guide/vscode-extension.md +33 -0
  171. package/dist/lib/agents/docs/guide/guide/why-agency.md +323 -0
  172. package/dist/lib/agents/docs/guide/handlers.md +109 -205
  173. package/dist/lib/agents/docs/guide/image-generation.md +113 -0
  174. package/dist/lib/agents/docs/guide/imports-and-packages.md +35 -95
  175. package/dist/lib/agents/docs/guide/interrupts-from-typescript.md +84 -0
  176. package/dist/lib/agents/docs/guide/interrupts-part-2.md +54 -0
  177. package/dist/lib/agents/docs/guide/interrupts.md +98 -58
  178. package/dist/lib/agents/docs/guide/llm-part-2.md +111 -0
  179. package/dist/lib/agents/docs/guide/llm.md +53 -124
  180. package/dist/lib/agents/docs/guide/memory.md +262 -249
  181. package/dist/lib/agents/docs/guide/message-threads.md +111 -0
  182. package/dist/lib/agents/docs/guide/nodes.md +32 -17
  183. package/dist/lib/agents/docs/guide/observability.md +11 -4
  184. package/dist/lib/agents/docs/guide/partial-application.md +40 -132
  185. package/dist/lib/agents/docs/guide/pattern-matching.md +216 -43
  186. package/dist/lib/agents/docs/guide/policies.md +11 -4
  187. package/dist/lib/agents/docs/guide/schemas.md +22 -9
  188. package/dist/lib/agents/docs/guide/state-isolation.md +139 -0
  189. package/dist/lib/agents/docs/guide/streaming.md +28 -0
  190. package/dist/lib/agents/docs/guide/tags.md +72 -0
  191. package/dist/lib/agents/docs/guide/testing.md +167 -7
  192. package/dist/lib/agents/docs/guide/troubleshooting.md +2 -53
  193. package/dist/lib/agents/docs/{appendix → guide}/ts-helpers.md +48 -0
  194. package/dist/lib/agents/docs/guide/ts-interop.md +16 -129
  195. package/dist/lib/agents/docs/guide/type-validation.md +30 -172
  196. package/dist/lib/agents/docs/guide/types.md +69 -84
  197. package/dist/lib/agents/docs/guide/unused.md +178 -0
  198. package/dist/lib/agents/docs/guide/unused2.md +258 -0
  199. package/dist/lib/agents/docs/guide/value-parameterized-types.md +186 -0
  200. package/dist/lib/agents/docs/guide/vscode-extension.md +33 -0
  201. package/dist/lib/agents/docs/guide/why-agency.md +323 -0
  202. package/dist/lib/agents/eval/goalJudge.js +35 -14
  203. package/dist/lib/agents/eval/judge.js +35 -14
  204. package/dist/lib/agents/eval/judgePairwise.agency +2 -2
  205. package/dist/lib/agents/eval/judgePairwise.js +35 -14
  206. package/dist/lib/agents/optimize/gepaReflect.js +35 -14
  207. package/dist/lib/agents/optimize/mutatePrompt.agency +2 -0
  208. package/dist/lib/agents/optimize/mutatePrompt.js +38 -15
  209. package/dist/lib/agents/policy/agent.agency +2 -2
  210. package/dist/lib/agents/policy/agent.js +94 -58
  211. package/dist/lib/agents/review/agent.js +41 -19
  212. package/dist/lib/backends/agencyGenerator.d.ts +14 -2
  213. package/dist/lib/backends/agencyGenerator.js +158 -53
  214. package/dist/lib/backends/agencyGenerator.matchBlock.test.js +106 -0
  215. package/dist/lib/backends/agencyGenerator.test.js +148 -0
  216. package/dist/lib/backends/effectDeclarationFormat.test.d.ts +1 -0
  217. package/dist/lib/backends/effectDeclarationFormat.test.js +32 -0
  218. package/dist/lib/backends/llmAttachmentCodegen.test.d.ts +1 -0
  219. package/dist/lib/backends/llmAttachmentCodegen.test.js +24 -0
  220. package/dist/lib/backends/llmNamedArgsCodegen.test.d.ts +1 -0
  221. package/dist/lib/backends/llmNamedArgsCodegen.test.js +40 -0
  222. package/dist/lib/backends/providerModules.codegen.test.d.ts +1 -0
  223. package/dist/lib/backends/{anthropicApiKey.codegen.test.js → providerModules.codegen.test.js} +12 -15
  224. package/dist/lib/backends/smoltalkDefaults.codegen.test.d.ts +1 -0
  225. package/dist/lib/backends/smoltalkDefaults.codegen.test.js +65 -0
  226. package/dist/lib/backends/typescriptBuilder.d.ts +82 -0
  227. package/dist/lib/backends/typescriptBuilder.integration.test.js +94 -4
  228. package/dist/lib/backends/typescriptBuilder.js +499 -158
  229. package/dist/lib/backends/typescriptGenerator/typeToString.js +8 -2
  230. package/dist/lib/backends/typescriptGenerator/typeToZodSchema.js +25 -28
  231. package/dist/lib/backends/typescriptGenerator/typeToZodSchema.test.js +73 -0
  232. package/dist/lib/cli/commands.d.ts +28 -0
  233. package/dist/lib/cli/commands.js +53 -4
  234. package/dist/lib/cli/doc.js +19 -0
  235. package/dist/lib/cli/doc.test.js +27 -1
  236. package/dist/lib/cli/eval/run.d.ts +18 -1
  237. package/dist/lib/cli/eval/run.js +55 -24
  238. package/dist/lib/cli/eval/run.workdir.test.d.ts +1 -0
  239. package/dist/lib/cli/eval/run.workdir.test.js +111 -0
  240. package/dist/lib/cli/fetchMockResolve.d.ts +6 -0
  241. package/dist/lib/cli/fetchMockResolve.js +51 -0
  242. package/dist/lib/cli/fetchMockResolve.test.d.ts +1 -0
  243. package/dist/lib/cli/fetchMockResolve.test.js +36 -0
  244. package/dist/lib/cli/hostedModels.d.ts +10 -0
  245. package/dist/lib/cli/hostedModels.js +61 -0
  246. package/dist/lib/cli/hostedModels.test.d.ts +1 -0
  247. package/dist/lib/cli/hostedModels.test.js +105 -0
  248. package/dist/lib/cli/local.d.ts +19 -0
  249. package/dist/lib/cli/local.js +109 -0
  250. package/dist/lib/cli/local.test.d.ts +1 -0
  251. package/dist/lib/cli/local.test.js +50 -0
  252. package/dist/lib/cli/pack.test.js +18 -0
  253. package/dist/lib/cli/precompile.d.ts +22 -0
  254. package/dist/lib/cli/precompile.js +125 -0
  255. package/dist/lib/cli/precompile.test.d.ts +1 -0
  256. package/dist/lib/cli/precompile.test.js +172 -0
  257. package/dist/lib/cli/test.js +55 -5
  258. package/dist/lib/cli/util.d.ts +8 -2
  259. package/dist/lib/cli/util.js +23 -6
  260. package/dist/lib/compiler/compile.js +5 -1
  261. package/dist/lib/compiler/compile.test.js +54 -1
  262. package/dist/lib/compiler/compileClosure.js +8 -9
  263. package/dist/lib/compiler/typecheck.js +10 -3
  264. package/dist/lib/config.d.ts +114 -6
  265. package/dist/lib/config.js +39 -3
  266. package/dist/lib/config.modelAliases.test.d.ts +1 -0
  267. package/dist/lib/config.modelAliases.test.js +11 -0
  268. package/dist/lib/config.providerModules.test.d.ts +1 -0
  269. package/dist/lib/config.providerModules.test.js +16 -0
  270. package/dist/lib/config.test.js +12 -0
  271. package/dist/lib/constants.d.ts +12 -0
  272. package/dist/lib/constants.js +12 -0
  273. package/dist/lib/effectDeclCollection.test.d.ts +1 -0
  274. package/dist/lib/effectDeclCollection.test.js +56 -0
  275. package/dist/lib/eval/runArtifacts.js +4 -10
  276. package/dist/lib/eval/runArtifacts.test.js +10 -22
  277. package/dist/lib/eval/runEvalInput.d.ts +11 -3
  278. package/dist/lib/eval/runEvalInput.js +16 -1
  279. package/dist/lib/eval/runTypes.d.ts +0 -4
  280. package/dist/lib/eval/runWorkdir.d.ts +25 -0
  281. package/dist/lib/eval/runWorkdir.js +46 -0
  282. package/dist/lib/eval/runWorkdir.test.d.ts +1 -0
  283. package/dist/lib/eval/runWorkdir.test.js +42 -0
  284. package/dist/lib/importPaths.d.ts +31 -1
  285. package/dist/lib/importPaths.js +88 -32
  286. package/dist/lib/importPaths.test.js +47 -4
  287. package/dist/lib/ir/builders.d.ts +6 -1
  288. package/dist/lib/ir/builders.js +3 -0
  289. package/dist/lib/ir/prettyPrint.js +31 -6
  290. package/dist/lib/ir/prettyPrint.test.js +70 -7
  291. package/dist/lib/ir/tsIR.d.ts +12 -2
  292. package/dist/lib/logsViewer/render.js +2 -0
  293. package/dist/lib/logsViewer/summary.js +13 -0
  294. package/dist/lib/logsViewer/summary.test.js +6 -0
  295. package/dist/lib/logsViewer/tree.js +38 -0
  296. package/dist/lib/logsViewer/tree.test.js +19 -0
  297. package/dist/lib/lowering/loweringError.d.ts +10 -0
  298. package/dist/lib/lowering/loweringError.js +13 -0
  299. package/dist/lib/lowering/patternLowering.ifExpr.test.d.ts +1 -0
  300. package/dist/lib/lowering/patternLowering.ifExpr.test.js +59 -0
  301. package/dist/lib/lowering/patternLowering.js +504 -30
  302. package/dist/lib/lowering/patternLowering.matchExpr.test.d.ts +1 -0
  303. package/dist/lib/lowering/patternLowering.matchExpr.test.js +572 -0
  304. package/dist/lib/lowering/patternLowering.test.js +102 -10
  305. package/dist/lib/lsp/codeAction.js +3 -3
  306. package/dist/lib/lsp/codeAction.test.js +13 -10
  307. package/dist/lib/lsp/completion.js +2 -2
  308. package/dist/lib/lsp/diagnostics.js +11 -4
  309. package/dist/lib/lsp/diagnostics.test.js +30 -0
  310. package/dist/lib/matchVal.d.ts +18 -0
  311. package/dist/lib/matchVal.js +26 -0
  312. package/dist/lib/optimize/artifacts.js +8 -35
  313. package/dist/lib/optimize/artifacts.test.js +12 -5
  314. package/dist/lib/optimize/baseOptimizer.d.ts +15 -9
  315. package/dist/lib/optimize/baseOptimizer.js +33 -27
  316. package/dist/lib/optimize/baseOptimizer.test.js +25 -15
  317. package/dist/lib/optimize/baseOptimizer.workdir.test.js +29 -24
  318. package/dist/lib/optimize/constraint.d.ts +45 -0
  319. package/dist/lib/optimize/constraint.js +78 -0
  320. package/dist/lib/optimize/constraint.test.d.ts +1 -0
  321. package/dist/lib/optimize/constraint.test.js +133 -0
  322. package/dist/lib/optimize/grading/scorecard.d.ts +6 -0
  323. package/dist/lib/optimize/grading/scorecard.js +8 -0
  324. package/dist/lib/optimize/mutator.js +2 -0
  325. package/dist/lib/optimize/mutator.test.js +37 -0
  326. package/dist/lib/optimize/optimizers/example.d.ts +4 -1
  327. package/dist/lib/optimize/optimizers/example.js +11 -12
  328. package/dist/lib/optimize/optimizers/example.test.js +2 -2
  329. package/dist/lib/optimize/optimizers/gepa.d.ts +1 -1
  330. package/dist/lib/optimize/optimizers/gepa.js +11 -10
  331. package/dist/lib/optimize/optimizers/gepa.test.js +5 -5
  332. package/dist/lib/optimize/optimizers/greedyReflective.d.ts +1 -1
  333. package/dist/lib/optimize/optimizers/greedyReflective.js +8 -7
  334. package/dist/lib/optimize/optimizers/greedyReflective.test.js +100 -2
  335. package/dist/lib/optimize/reporter.test.js +2 -0
  336. package/dist/lib/optimize/sourceMutator.d.ts +8 -4
  337. package/dist/lib/optimize/sourceMutator.js +63 -13
  338. package/dist/lib/optimize/sourceMutator.test.js +117 -0
  339. package/dist/lib/optimize/targets.d.ts +21 -3
  340. package/dist/lib/optimize/targets.js +119 -10
  341. package/dist/lib/optimize/targets.test.js +79 -5
  342. package/dist/lib/optimize/types.d.ts +8 -1
  343. package/dist/lib/optimize/workspace.d.ts +8 -30
  344. package/dist/lib/optimize/workspace.js +5 -78
  345. package/dist/lib/optimize/workspace.test.js +10 -70
  346. package/dist/lib/parseCache.d.ts +10 -0
  347. package/dist/lib/parseCache.js +58 -0
  348. package/dist/lib/parseCache.test.d.ts +1 -0
  349. package/dist/lib/parseCache.test.js +113 -0
  350. package/dist/lib/parser.js +27 -2
  351. package/dist/lib/parsers/dataStructures.test.js +86 -0
  352. package/dist/lib/parsers/debugMessagesLeak.test.d.ts +1 -0
  353. package/dist/lib/parsers/debugMessagesLeak.test.js +31 -0
  354. package/dist/lib/parsers/effectDeclaration.test.d.ts +1 -0
  355. package/dist/lib/parsers/effectDeclaration.test.js +107 -0
  356. package/dist/lib/parsers/function.test.js +39 -2
  357. package/dist/lib/parsers/ifExpression.test.d.ts +1 -0
  358. package/dist/lib/parsers/ifExpression.test.js +45 -0
  359. package/dist/lib/parsers/importStatement.test.js +49 -0
  360. package/dist/lib/parsers/literals.test.js +52 -0
  361. package/dist/lib/parsers/matchBlock.test.js +298 -59
  362. package/dist/lib/parsers/parsers.d.ts +21 -2
  363. package/dist/lib/parsers/parsers.js +232 -100
  364. package/dist/lib/parsers/pattern.test.js +10 -10
  365. package/dist/lib/parsers/typeHints.test.js +70 -0
  366. package/dist/lib/preprocessors/importResolver.d.ts +3 -1
  367. package/dist/lib/preprocessors/importResolver.js +37 -7
  368. package/dist/lib/preprocessors/importResolver.test.js +82 -0
  369. package/dist/lib/preprocessors/injectSchemaArgs.js +1 -2
  370. package/dist/lib/preprocessors/liftCallbacks.js +1 -1
  371. package/dist/lib/preprocessors/parallelDesugar.js +3 -2
  372. package/dist/lib/preprocessors/parallelDesugar.test.js +3 -2
  373. package/dist/lib/preprocessors/prunePreludeShadows.d.ts +22 -0
  374. package/dist/lib/preprocessors/prunePreludeShadows.js +55 -0
  375. package/dist/lib/preprocessors/prunePreludeShadows.test.d.ts +1 -0
  376. package/dist/lib/preprocessors/prunePreludeShadows.test.js +112 -0
  377. package/dist/lib/preprocessors/typescriptPreprocessor.core.test.js +25 -0
  378. package/dist/lib/preprocessors/typescriptPreprocessor.js +7 -5
  379. package/dist/lib/runtime/__tests__/testHelpers.js +0 -1
  380. package/dist/lib/runtime/agency.d.ts +3 -1
  381. package/dist/lib/runtime/agency.js +6 -7
  382. package/dist/lib/runtime/agencyFunction.js +13 -4
  383. package/dist/lib/runtime/agencyFunction.test.js +52 -0
  384. package/dist/lib/runtime/agencyInterrupt.test.js +91 -6
  385. package/dist/lib/runtime/agencyLlm.d.ts +14 -3
  386. package/dist/lib/runtime/agencyLlm.js +10 -0
  387. package/dist/lib/runtime/agencyLlm.test.js +17 -0
  388. package/dist/lib/runtime/callDepth.d.ts +36 -0
  389. package/dist/lib/runtime/callDepth.js +76 -0
  390. package/dist/lib/runtime/callDepth.test.d.ts +1 -0
  391. package/dist/lib/runtime/callDepth.test.js +67 -0
  392. package/dist/lib/runtime/callbackForwarding.d.ts +47 -0
  393. package/dist/lib/runtime/callbackForwarding.js +76 -0
  394. package/dist/lib/runtime/callbackForwarding.test.d.ts +1 -0
  395. package/dist/lib/runtime/callbackForwarding.test.js +72 -0
  396. package/dist/lib/runtime/configOverrides.d.ts +17 -5
  397. package/dist/lib/runtime/configOverrides.js +28 -6
  398. package/dist/lib/runtime/configOverrides.test.js +33 -0
  399. package/dist/lib/runtime/cost.d.ts +10 -0
  400. package/dist/lib/runtime/cost.js +17 -0
  401. package/dist/lib/runtime/costTelemetry.d.ts +24 -0
  402. package/dist/lib/runtime/costTelemetry.js +39 -0
  403. package/dist/lib/runtime/costTelemetry.test.d.ts +1 -0
  404. package/dist/lib/runtime/costTelemetry.test.js +92 -0
  405. package/dist/lib/runtime/deterministicClient.d.ts +9 -2
  406. package/dist/lib/runtime/deterministicClient.js +21 -1
  407. package/dist/lib/runtime/deterministicClient.test.js +29 -0
  408. package/dist/lib/runtime/eq.d.ts +12 -0
  409. package/dist/lib/runtime/eq.js +14 -0
  410. package/dist/lib/runtime/eq.test.d.ts +1 -0
  411. package/dist/lib/runtime/eq.test.js +32 -0
  412. package/dist/lib/runtime/errors.d.ts +20 -0
  413. package/dist/lib/runtime/errors.js +23 -0
  414. package/dist/lib/runtime/errors.test.js +18 -0
  415. package/dist/lib/runtime/fetchMock.d.ts +12 -0
  416. package/dist/lib/runtime/fetchMock.js +167 -0
  417. package/dist/lib/runtime/fetchMock.test.d.ts +1 -0
  418. package/dist/lib/runtime/fetchMock.test.js +145 -0
  419. package/dist/lib/runtime/hooks.d.ts +21 -3
  420. package/dist/lib/runtime/hooks.js +19 -0
  421. package/dist/lib/runtime/hooks.test.js +39 -2
  422. package/dist/lib/runtime/image-client.test.d.ts +1 -0
  423. package/dist/lib/runtime/image-client.test.js +22 -0
  424. package/dist/lib/runtime/index.d.ts +4 -1
  425. package/dist/lib/runtime/index.js +3 -1
  426. package/dist/lib/runtime/interrupts.d.ts +50 -0
  427. package/dist/lib/runtime/interrupts.js +206 -126
  428. package/dist/lib/runtime/interrupts.test.js +110 -1
  429. package/dist/lib/runtime/ipc.configOverrides.test.js +35 -17
  430. package/dist/lib/runtime/ipc.d.ts +238 -21
  431. package/dist/lib/runtime/ipc.js +622 -95
  432. package/dist/lib/runtime/ipc.test.js +453 -2
  433. package/dist/lib/runtime/llmClient.d.ts +71 -3
  434. package/dist/lib/runtime/llmClient.hostedTools.test.d.ts +1 -0
  435. package/dist/lib/runtime/llmClient.hostedTools.test.js +45 -0
  436. package/dist/lib/runtime/llmClient.js +71 -11
  437. package/dist/lib/runtime/llmClient.test.d.ts +1 -0
  438. package/dist/lib/runtime/llmClient.test.js +80 -0
  439. package/dist/lib/runtime/llmRetry.d.ts +65 -0
  440. package/dist/lib/runtime/llmRetry.js +158 -0
  441. package/dist/lib/runtime/llmRetry.test.d.ts +1 -0
  442. package/dist/lib/runtime/llmRetry.test.js +94 -0
  443. package/dist/lib/runtime/memory/manager.d.ts +25 -0
  444. package/dist/lib/runtime/memory/manager.js +115 -14
  445. package/dist/lib/runtime/memory/manager.test.js +60 -21
  446. package/dist/lib/runtime/memory/types.d.ts +7 -0
  447. package/dist/lib/runtime/node.js +10 -1
  448. package/dist/lib/runtime/prompt.attachments.test.d.ts +1 -0
  449. package/dist/lib/runtime/prompt.attachments.test.js +41 -0
  450. package/dist/lib/runtime/prompt.d.ts +65 -2
  451. package/dist/lib/runtime/prompt.js +276 -31
  452. package/dist/lib/runtime/prompt.test.js +170 -1
  453. package/dist/lib/runtime/promptRunner.d.ts +1 -1
  454. package/dist/lib/runtime/promptRunner.js +1 -1
  455. package/dist/lib/runtime/providerModules.d.ts +27 -0
  456. package/dist/lib/runtime/providerModules.js +87 -0
  457. package/dist/lib/runtime/providerModules.test.d.ts +1 -0
  458. package/dist/lib/runtime/providerModules.test.js +90 -0
  459. package/dist/lib/runtime/redactForStatelog.d.ts +20 -0
  460. package/dist/lib/runtime/redactForStatelog.js +32 -0
  461. package/dist/lib/runtime/redactForStatelog.test.d.ts +1 -0
  462. package/dist/lib/runtime/redactForStatelog.test.js +84 -0
  463. package/dist/lib/runtime/replyAttachments.d.ts +46 -0
  464. package/dist/lib/runtime/replyAttachments.js +143 -0
  465. package/dist/lib/runtime/replyAttachments.test.d.ts +1 -0
  466. package/dist/lib/runtime/replyAttachments.test.js +205 -0
  467. package/dist/lib/runtime/result.js +8 -0
  468. package/dist/lib/runtime/revivers/index.js +2 -0
  469. package/dist/lib/runtime/revivers/taggedReviver.d.ts +8 -0
  470. package/dist/lib/runtime/revivers/taggedReviver.js +30 -0
  471. package/dist/lib/runtime/revivers/taggedReviver.test.d.ts +1 -0
  472. package/dist/lib/runtime/revivers/taggedReviver.test.js +42 -0
  473. package/dist/lib/runtime/runBatch.js +33 -16
  474. package/dist/lib/runtime/runBatch.test.js +62 -0
  475. package/dist/lib/runtime/runner.d.ts +26 -4
  476. package/dist/lib/runtime/runner.js +125 -49
  477. package/dist/lib/runtime/runner.test.js +217 -1
  478. package/dist/lib/runtime/simpleOpenAIClient.js +1 -1
  479. package/dist/lib/runtime/state/context.d.ts +22 -12
  480. package/dist/lib/runtime/state/context.js +43 -14
  481. package/dist/lib/runtime/state/context.providerModules.test.d.ts +1 -0
  482. package/dist/lib/runtime/state/context.providerModules.test.js +38 -0
  483. package/dist/lib/runtime/state/globalStore.d.ts +42 -0
  484. package/dist/lib/runtime/state/globalStore.js +187 -2
  485. package/dist/lib/runtime/state/globalStore.tags.test.d.ts +1 -0
  486. package/dist/lib/runtime/state/globalStore.tags.test.js +211 -0
  487. package/dist/lib/runtime/state/stateStack.d.ts +34 -0
  488. package/dist/lib/runtime/state/stateStack.js +46 -0
  489. package/dist/lib/runtime/state/tagSymbol.d.ts +6 -0
  490. package/dist/lib/runtime/state/tagSymbol.js +49 -0
  491. package/dist/lib/runtime/state/tagSymbol.test.d.ts +1 -0
  492. package/dist/lib/runtime/state/tagSymbol.test.js +60 -0
  493. package/dist/lib/runtime/streaming.d.ts +7 -2
  494. package/dist/lib/runtime/streaming.js +31 -8
  495. package/dist/lib/runtime/subprocess-bootstrap.js +90 -35
  496. package/dist/lib/runtime/subprocessRunInfo.d.ts +46 -0
  497. package/dist/lib/runtime/subprocessRunInfo.js +53 -0
  498. package/dist/lib/runtime/subprocessRunInfo.test.d.ts +1 -0
  499. package/dist/lib/runtime/subprocessRunInfo.test.js +32 -0
  500. package/dist/lib/runtime/topsortCycleErrors.test.js +69 -0
  501. package/dist/lib/runtime/utils.d.ts +16 -2
  502. package/dist/lib/runtime/utils.js +13 -4
  503. package/dist/lib/runtime/utils.test.js +27 -0
  504. package/dist/lib/statelogClient.d.ts +40 -1
  505. package/dist/lib/statelogClient.js +98 -1
  506. package/dist/lib/statelogClient.redaction.test.d.ts +1 -0
  507. package/dist/lib/statelogClient.redaction.test.js +131 -0
  508. package/dist/lib/statelogClient.test.js +13 -0
  509. package/dist/lib/stdlib/abortable.d.ts +6 -0
  510. package/dist/lib/stdlib/abortable.js +26 -1
  511. package/dist/lib/stdlib/agency.d.ts +7 -2
  512. package/dist/lib/stdlib/agency.js +17 -13
  513. package/dist/lib/stdlib/agencyEval.js +7 -1
  514. package/dist/lib/stdlib/args.d.ts +4 -1
  515. package/dist/lib/stdlib/args.js +68 -0
  516. package/dist/lib/stdlib/builtins.d.ts +2 -1
  517. package/dist/lib/stdlib/builtins.js +22 -13
  518. package/dist/lib/stdlib/cli.d.ts +65 -0
  519. package/dist/lib/stdlib/cli.js +217 -39
  520. package/dist/lib/stdlib/git.d.ts +29 -0
  521. package/dist/lib/stdlib/git.js +80 -0
  522. package/dist/lib/stdlib/gitCore.d.ts +132 -0
  523. package/dist/lib/stdlib/gitCore.js +231 -0
  524. package/dist/lib/stdlib/gitParse.d.ts +17 -0
  525. package/dist/lib/stdlib/gitParse.js +259 -0
  526. package/dist/lib/stdlib/http.d.ts +5 -4
  527. package/dist/lib/stdlib/http.js +42 -1
  528. package/dist/lib/stdlib/image.d.ts +7 -0
  529. package/dist/lib/stdlib/image.js +80 -0
  530. package/dist/lib/stdlib/layout/ansi.js +35 -3
  531. package/dist/lib/stdlib/layout/axis.js +14 -5
  532. package/dist/lib/stdlib/layout/barchart.js +5 -5
  533. package/dist/lib/stdlib/layout/block.js +2 -2
  534. package/dist/lib/stdlib/layout/border.js +2 -2
  535. package/dist/lib/stdlib/layout/box.js +12 -4
  536. package/dist/lib/stdlib/layout/nodes.d.ts +0 -1
  537. package/dist/lib/stdlib/layout/nodes.js +40 -17
  538. package/dist/lib/stdlib/layout/render.js +7 -3
  539. package/dist/lib/stdlib/layout/sizing.d.ts +1 -0
  540. package/dist/lib/stdlib/layout/sizing.js +1 -1
  541. package/dist/lib/stdlib/layout/table.js +11 -11
  542. package/dist/lib/stdlib/layout.js +1 -1
  543. package/dist/lib/stdlib/llm.d.ts +54 -1
  544. package/dist/lib/stdlib/llm.js +104 -0
  545. package/dist/lib/stdlib/localModels.d.ts +209 -0
  546. package/dist/lib/stdlib/localModels.js +904 -0
  547. package/dist/lib/stdlib/mediaPathScan.d.ts +31 -0
  548. package/dist/lib/stdlib/mediaPathScan.js +79 -0
  549. package/dist/lib/stdlib/providers/llama-cpp.mjs +79 -0
  550. package/dist/lib/stdlib/providers/llamaModelConfig.d.ts +7 -0
  551. package/dist/lib/stdlib/providers/llamaModelConfig.js +7 -0
  552. package/dist/lib/stdlib/search.d.ts +7 -0
  553. package/dist/lib/stdlib/search.js +40 -0
  554. package/dist/lib/stdlib/shell.d.ts +1 -1
  555. package/dist/lib/stdlib/shell.js +4 -2
  556. package/dist/lib/stdlib/tag.d.ts +17 -0
  557. package/dist/lib/stdlib/tag.js +49 -0
  558. package/dist/lib/stdlib/thread.d.ts +38 -3
  559. package/dist/lib/stdlib/thread.js +71 -2
  560. package/dist/lib/stdlib/threads.d.ts +12 -0
  561. package/dist/lib/stdlib/threads.js +48 -17
  562. package/dist/lib/stdlib/version.d.ts +1 -1
  563. package/dist/lib/stdlib/version.js +1 -1
  564. package/dist/lib/symbolTable.d.ts +10 -1
  565. package/dist/lib/symbolTable.js +27 -7
  566. package/dist/lib/templates/backends/agency/template.d.ts +1 -1
  567. package/dist/lib/templates/backends/agency/template.js +1 -1
  568. package/dist/lib/templates/backends/typescriptGenerator/imports.d.ts +1 -1
  569. package/dist/lib/templates/backends/typescriptGenerator/imports.js +14 -2
  570. package/dist/lib/templates/backends/typescriptGenerator/runnerIfElse.d.ts +2 -1
  571. package/dist/lib/templates/backends/typescriptGenerator/runnerIfElse.js +1 -1
  572. package/dist/lib/typeChecker/assignability.d.ts +8 -0
  573. package/dist/lib/typeChecker/assignability.js +26 -4
  574. package/dist/lib/typeChecker/assignability.test.js +59 -1
  575. package/dist/lib/typeChecker/attachments.test.d.ts +1 -0
  576. package/dist/lib/typeChecker/attachments.test.js +45 -0
  577. package/dist/lib/typeChecker/builtinNamedArgs.test.js +30 -0
  578. package/dist/lib/typeChecker/builtins.js +134 -40
  579. package/dist/lib/typeChecker/checker.d.ts +25 -0
  580. package/dist/lib/typeChecker/checker.js +41 -4
  581. package/dist/lib/typeChecker/definiteReturns.d.ts +16 -0
  582. package/dist/lib/typeChecker/definiteReturns.js +52 -0
  583. package/dist/lib/typeChecker/definiteReturns.test.d.ts +1 -0
  584. package/dist/lib/typeChecker/definiteReturns.test.js +203 -0
  585. package/dist/lib/typeChecker/effectPayloadCheck.d.ts +17 -0
  586. package/dist/lib/typeChecker/effectPayloadCheck.js +181 -0
  587. package/dist/lib/typeChecker/effectPayloadCheck.test.d.ts +1 -0
  588. package/dist/lib/typeChecker/effectPayloadCheck.test.js +192 -0
  589. package/dist/lib/typeChecker/flow.d.ts +131 -0
  590. package/dist/lib/typeChecker/flow.js +248 -0
  591. package/dist/lib/typeChecker/flow.test.d.ts +1 -0
  592. package/dist/lib/typeChecker/flow.test.js +467 -0
  593. package/dist/lib/typeChecker/flowAssignments.test.d.ts +1 -0
  594. package/dist/lib/typeChecker/flowAssignments.test.js +84 -0
  595. package/dist/lib/typeChecker/flowBuilder.d.ts +32 -0
  596. package/dist/lib/typeChecker/flowBuilder.js +337 -0
  597. package/dist/lib/typeChecker/flowBuilder.test.d.ts +1 -0
  598. package/dist/lib/typeChecker/flowBuilder.test.js +215 -0
  599. package/dist/lib/typeChecker/flowNarrowing.test.d.ts +1 -0
  600. package/dist/lib/typeChecker/flowNarrowing.test.js +96 -0
  601. package/dist/lib/typeChecker/handlerBodyInterrupts.test.js +1 -1
  602. package/dist/lib/typeChecker/handlerParamTyping.d.ts +31 -0
  603. package/dist/lib/typeChecker/handlerParamTyping.js +108 -0
  604. package/dist/lib/typeChecker/handlerParamTyping.test.d.ts +1 -0
  605. package/dist/lib/typeChecker/handlerParamTyping.test.js +379 -0
  606. package/dist/lib/typeChecker/ifExpression.test.d.ts +1 -0
  607. package/dist/lib/typeChecker/ifExpression.test.js +49 -0
  608. package/dist/lib/typeChecker/index.js +43 -3
  609. package/dist/lib/typeChecker/inference.d.ts +6 -0
  610. package/dist/lib/typeChecker/inference.js +1 -1
  611. package/dist/lib/typeChecker/interruptAnalysis.d.ts +9 -0
  612. package/dist/lib/typeChecker/interruptAnalysis.js +21 -13
  613. package/dist/lib/typeChecker/literalType.d.ts +9 -0
  614. package/dist/lib/typeChecker/literalType.js +18 -0
  615. package/dist/lib/typeChecker/matchArmNarrowing.test.d.ts +1 -0
  616. package/dist/lib/typeChecker/matchArmNarrowing.test.js +172 -0
  617. package/dist/lib/typeChecker/matchExhaustiveness.d.ts +9 -0
  618. package/dist/lib/typeChecker/matchExhaustiveness.js +238 -0
  619. package/dist/lib/typeChecker/matchExhaustiveness.test.d.ts +1 -0
  620. package/dist/lib/typeChecker/matchExhaustiveness.test.js +404 -0
  621. package/dist/lib/typeChecker/matchExprTypes.d.ts +37 -0
  622. package/dist/lib/typeChecker/matchExprTypes.js +143 -0
  623. package/dist/lib/typeChecker/matchExpression.test.d.ts +1 -0
  624. package/dist/lib/typeChecker/matchExpression.test.js +240 -0
  625. package/dist/lib/typeChecker/memberPathNarrowing.test.d.ts +1 -0
  626. package/dist/lib/typeChecker/memberPathNarrowing.test.js +419 -0
  627. package/dist/lib/typeChecker/narrowing.d.ts +113 -0
  628. package/dist/lib/typeChecker/narrowing.js +396 -0
  629. package/dist/lib/typeChecker/narrowing.test.d.ts +1 -0
  630. package/dist/lib/typeChecker/narrowing.test.js +930 -0
  631. package/dist/lib/typeChecker/neverType.test.d.ts +1 -0
  632. package/dist/lib/typeChecker/neverType.test.js +19 -0
  633. package/dist/lib/typeChecker/nullNarrowing.test.d.ts +1 -0
  634. package/dist/lib/typeChecker/nullNarrowing.test.js +246 -0
  635. package/dist/lib/typeChecker/nullish.test.d.ts +1 -0
  636. package/dist/lib/typeChecker/nullish.test.js +16 -0
  637. package/dist/lib/typeChecker/pathSegments.d.ts +56 -0
  638. package/dist/lib/typeChecker/pathSegments.js +73 -0
  639. package/dist/lib/typeChecker/primitiveMembers.d.ts +2 -2
  640. package/dist/lib/typeChecker/primitiveMembers.js +5 -5
  641. package/dist/lib/typeChecker/primitives.d.ts +2 -1
  642. package/dist/lib/typeChecker/primitives.js +2 -1
  643. package/dist/lib/typeChecker/recordLike.d.ts +18 -0
  644. package/dist/lib/typeChecker/recordLike.js +27 -0
  645. package/dist/lib/typeChecker/resolveCall.js +4 -0
  646. package/dist/lib/typeChecker/resultUnion.d.ts +8 -0
  647. package/dist/lib/typeChecker/resultUnion.js +43 -0
  648. package/dist/lib/typeChecker/scope.d.ts +9 -1
  649. package/dist/lib/typeChecker/scope.js +25 -4
  650. package/dist/lib/typeChecker/scope.test.js +15 -0
  651. package/dist/lib/typeChecker/scopeVisibility.test.d.ts +1 -0
  652. package/dist/lib/typeChecker/scopeVisibility.test.js +138 -0
  653. package/dist/lib/typeChecker/scopes.d.ts +7 -0
  654. package/dist/lib/typeChecker/scopes.js +164 -113
  655. package/dist/lib/typeChecker/strictMemberAccess.test.d.ts +1 -0
  656. package/dist/lib/typeChecker/strictMemberAccess.test.js +221 -0
  657. package/dist/lib/typeChecker/synthesizer.js +257 -47
  658. package/dist/lib/typeChecker/typeCases.d.ts +28 -0
  659. package/dist/lib/typeChecker/typeCases.js +122 -0
  660. package/dist/lib/typeChecker/typeCases.test.d.ts +1 -0
  661. package/dist/lib/typeChecker/typeCases.test.js +150 -0
  662. package/dist/lib/typeChecker/types.d.ts +26 -0
  663. package/dist/lib/typeChecker/utils.d.ts +19 -0
  664. package/dist/lib/typeChecker/utils.js +50 -10
  665. package/dist/lib/typeChecker.test.js +351 -34
  666. package/dist/lib/types/dataStructures.d.ts +18 -1
  667. package/dist/lib/types/effectDeclaration.d.ts +11 -0
  668. package/dist/lib/types/effectDeclaration.js +1 -0
  669. package/dist/lib/types/function.d.ts +1 -1
  670. package/dist/lib/types/function.js +2 -0
  671. package/dist/lib/types/function.test.d.ts +1 -0
  672. package/dist/lib/types/function.test.js +11 -0
  673. package/dist/lib/types/ifElse.d.ts +4 -0
  674. package/dist/lib/types/importStatement.d.ts +4 -0
  675. package/dist/lib/types/matchBlock.d.ts +15 -3
  676. package/dist/lib/types/matchYield.d.ts +16 -0
  677. package/dist/lib/types/matchYield.js +1 -0
  678. package/dist/lib/types.d.ts +54 -3
  679. package/dist/lib/types.js +37 -0
  680. package/dist/lib/utils/mapBodies.js +1 -1
  681. package/dist/lib/utils/node.d.ts +30 -0
  682. package/dist/lib/utils/node.js +160 -3
  683. package/dist/lib/utils/projectTree.d.ts +13 -0
  684. package/dist/lib/utils/projectTree.js +42 -0
  685. package/dist/lib/utils/projectTree.test.d.ts +1 -0
  686. package/dist/lib/utils/projectTree.test.js +49 -0
  687. package/dist/lib/utils/termcolors.d.ts +1 -1
  688. package/dist/lib/utils/termcolors.js +1 -1
  689. package/dist/scripts/agency.js +27 -0
  690. package/dist/scripts/genModelHashes.d.ts +10 -0
  691. package/dist/scripts/genModelHashes.js +88 -0
  692. package/package.json +4 -2
  693. package/stdlib/agency/eval.agency +31 -59
  694. package/stdlib/agency/eval.js +56 -84
  695. package/stdlib/agency/local.agency +189 -0
  696. package/stdlib/agency/local.js +1685 -0
  697. package/stdlib/agency.agency +169 -98
  698. package/stdlib/agency.js +278 -286
  699. package/stdlib/agent.agency +69 -71
  700. package/stdlib/agent.js +352 -51
  701. package/stdlib/args.agency +30 -53
  702. package/stdlib/args.js +44 -20
  703. package/stdlib/array.agency +21 -221
  704. package/stdlib/array.js +116 -416
  705. package/stdlib/{keyring.agency → auth/keyring.agency} +17 -17
  706. package/stdlib/auth/keyring.js +810 -0
  707. package/stdlib/{oauth.agency → auth/oauth.agency} +24 -27
  708. package/stdlib/auth/oauth.js +873 -0
  709. package/stdlib/browser.js +13 -3
  710. package/stdlib/calendar.agency +29 -88
  711. package/stdlib/calendar.js +40 -25
  712. package/stdlib/capabilities.agency +7 -3
  713. package/stdlib/capabilities.js +41 -18
  714. package/stdlib/chart.js +21 -10
  715. package/stdlib/cli.js +139 -6
  716. package/stdlib/clipboard.agency +19 -2
  717. package/stdlib/clipboard.js +40 -19
  718. package/stdlib/concurrency.agency +34 -22
  719. package/stdlib/concurrency.js +45 -38
  720. package/stdlib/data/finance/dbnomics.agency +115 -0
  721. package/stdlib/data/finance/dbnomics.js +934 -0
  722. package/stdlib/data/finance/edgar.agency +172 -0
  723. package/stdlib/data/finance/edgar.js +1598 -0
  724. package/stdlib/data/finance/fred.agency +215 -0
  725. package/stdlib/data/finance/fred.js +2028 -0
  726. package/stdlib/data/finance/gdelt.agency +98 -0
  727. package/stdlib/data/finance/gdelt.js +873 -0
  728. package/stdlib/data/people/littlesis.agency +322 -0
  729. package/stdlib/data/people/littlesis.js +3221 -0
  730. package/stdlib/data/tech/hackernews.agency +344 -0
  731. package/stdlib/data/tech/hackernews.js +3814 -0
  732. package/stdlib/data/tech/yc.agency +253 -0
  733. package/stdlib/data/tech/yc.js +2913 -0
  734. package/stdlib/date.agency +34 -81
  735. package/stdlib/date.js +53 -39
  736. package/stdlib/email.js +13 -3
  737. package/stdlib/fs.agency +44 -16
  738. package/stdlib/fs.js +50 -37
  739. package/stdlib/git.agency +327 -0
  740. package/stdlib/git.js +3724 -0
  741. package/stdlib/http.agency +39 -14
  742. package/stdlib/http.js +39 -27
  743. package/stdlib/image.agency +44 -0
  744. package/stdlib/image.js +404 -0
  745. package/stdlib/imessage.js +13 -3
  746. package/stdlib/index.agency +318 -116
  747. package/stdlib/index.js +1762 -517
  748. package/stdlib/keyring.js +13 -3
  749. package/stdlib/layout.js +23 -12
  750. package/stdlib/llm.agency +115 -16
  751. package/stdlib/llm.js +726 -36
  752. package/stdlib/markdown.agency +38 -55
  753. package/stdlib/markdown.js +58 -66
  754. package/stdlib/math.agency +16 -0
  755. package/stdlib/math.js +175 -20
  756. package/stdlib/memory.agency +82 -90
  757. package/stdlib/memory.js +67 -114
  758. package/stdlib/{email.agency → messaging/email.agency} +11 -15
  759. package/stdlib/messaging/email.js +1112 -0
  760. package/stdlib/{imessage.agency → messaging/imessage.agency} +7 -8
  761. package/stdlib/messaging/imessage.js +387 -0
  762. package/stdlib/{sms.agency → messaging/sms.agency} +8 -8
  763. package/stdlib/messaging/sms.js +429 -0
  764. package/stdlib/oauth.js +13 -3
  765. package/stdlib/object.agency +52 -5
  766. package/stdlib/object.js +409 -26
  767. package/stdlib/path.agency +29 -4
  768. package/stdlib/path.js +54 -30
  769. package/stdlib/policy.agency +115 -198
  770. package/stdlib/policy.js +212 -154
  771. package/stdlib/schemas.js +13 -3
  772. package/stdlib/search.js +225 -6
  773. package/stdlib/shell.agency +51 -27
  774. package/stdlib/shell.js +75 -53
  775. package/stdlib/skills.agency +41 -20
  776. package/stdlib/skills.js +81 -43
  777. package/stdlib/sms.js +13 -3
  778. package/stdlib/speech.agency +42 -24
  779. package/stdlib/speech.js +46 -42
  780. package/stdlib/statelog.agency +64 -46
  781. package/stdlib/statelog.js +165 -66
  782. package/stdlib/strategy.agency +27 -0
  783. package/stdlib/strategy.js +158 -20
  784. package/stdlib/syntax.agency +34 -27
  785. package/stdlib/syntax.js +46 -46
  786. package/stdlib/system.agency +62 -23
  787. package/stdlib/system.js +210 -49
  788. package/stdlib/table.js +19 -8
  789. package/stdlib/tag.agency +62 -0
  790. package/stdlib/tag.js +966 -0
  791. package/stdlib/thread.agency +282 -67
  792. package/stdlib/thread.js +1522 -263
  793. package/stdlib/threads.js +18 -7
  794. package/stdlib/types.js +13 -3
  795. package/stdlib/{chart.agency → ui/chart.agency} +41 -48
  796. package/stdlib/ui/chart.js +993 -0
  797. package/stdlib/ui/cli.agency +119 -0
  798. package/stdlib/ui/cli.js +1096 -0
  799. package/stdlib/{layout.agency → ui/layout.agency} +110 -178
  800. package/stdlib/ui/layout.js +3740 -0
  801. package/stdlib/{table.agency → ui/table.agency} +49 -50
  802. package/stdlib/ui/table.js +1434 -0
  803. package/stdlib/ui.agency +194 -316
  804. package/stdlib/ui.js +442 -364
  805. package/stdlib/validation.agency +197 -0
  806. package/stdlib/validation.js +1707 -0
  807. package/stdlib/validators.js +13 -3
  808. package/stdlib/weather.agency +27 -4
  809. package/stdlib/weather.js +39 -21
  810. package/stdlib/web/browser.agency +52 -0
  811. package/stdlib/web/browser.js +431 -0
  812. package/stdlib/web/search.agency +101 -0
  813. package/stdlib/web/search.js +638 -0
  814. package/stdlib/wikipedia.agency +28 -3
  815. package/stdlib/wikipedia.js +46 -21
  816. package/dist/lib/agents/docs/appendix/agency-stdlib.md +0 -25
  817. package/dist/lib/agents/docs/appendix/agency-vs-typescript.md +0 -14
  818. package/dist/lib/agents/docs/appendix/appendix/agency-stdlib.md +0 -25
  819. package/dist/lib/agents/docs/appendix/appendix/agency-vs-typescript.md +0 -14
  820. package/dist/lib/agents/docs/appendix/appendix/vscode-extension.md +0 -11
  821. package/dist/lib/agents/docs/appendix/vscode-extension.md +0 -11
  822. package/dist/lib/agents/docs/guide/agents-101.md +0 -212
  823. package/dist/lib/agents/docs/guide/execution-model.md +0 -130
  824. package/dist/lib/agents/docs/guide/guide/agents-101.md +0 -212
  825. package/dist/lib/agents/docs/guide/guide/execution-model.md +0 -130
  826. package/dist/lib/agents/docs/guide/guide/message-history-and-threads.md +0 -88
  827. package/dist/lib/agents/docs/guide/guide/odds-and-ends.md +0 -41
  828. package/dist/lib/agents/docs/guide/guide/structured-interrupts.md +0 -49
  829. package/dist/lib/agents/docs/guide/message-history-and-threads.md +0 -88
  830. package/dist/lib/agents/docs/guide/odds-and-ends.md +0 -41
  831. package/dist/lib/agents/docs/guide/structured-interrupts.md +0 -49
  832. package/stdlib/browser.agency +0 -47
  833. package/stdlib/cli.agency +0 -132
  834. package/stdlib/schemas.agency +0 -37
  835. package/stdlib/search.agency +0 -57
  836. package/stdlib/threads.agency +0 -198
  837. package/stdlib/types.agency +0 -58
  838. package/stdlib/validators.agency +0 -150
  839. /package/dist/lib/agents/docs/{appendix → guide}/advanced-types.md +0 -0
  840. /package/dist/lib/agents/docs/{appendix/appendix → guide/guide}/advanced-types.md +0 -0
  841. /package/dist/lib/agents/docs/{appendix/appendix → guide/guide}/schema-parameter-injection.md +0 -0
  842. /package/dist/lib/agents/docs/{appendix → guide}/schema-parameter-injection.md +0 -0
  843. /package/dist/lib/backends/{anthropicApiKey.codegen.test.d.ts → agencyGenerator.matchBlock.test.d.ts} +0 -0
@@ -1,10 +1,26 @@
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"
9
+ import {
10
+ clearMessages,
11
+ pushMessage,
12
+ repl,
13
+ clearScreen,
14
+ clearHistory,
15
+ } from "std::ui/cli"
4
16
  import { today } from "std::date"
5
- import { setAgentCwd } from "std::index"
6
- import { box, render } from "std::layout"
7
- import { setMemoryId } from "std::memory"
17
+ import { generateImage } from "std::image"
18
+ import { applyAgentCwd, setAgentCwd } from "std::index"
19
+ import { keys } from "std::object"
20
+ import { basename, dirname } from "std::path"
21
+ import { box, render } from "std::ui/layout"
22
+ import { listHostedModels, hostedModelInfo } from "std::llm"
23
+ import { setMemoryId, disableMemory } from "std::memory"
8
24
  import {
9
25
  ScopedRuleFields,
10
26
  cliPolicyHandler,
@@ -15,17 +31,42 @@ import { exists } from "std::shell"
15
31
  import { commandsDir, expandSlash } from "std::skills"
16
32
  import { highlight } from "std::syntax"
17
33
  import { cwd, env, isTTY, readStdin, setTitle } from "std::system"
18
- import { getCost, getModelCosts, systemMessage } from "std::thread"
34
+ import { Attachment, attachToReply, getCost, getModelCosts, image, systemMessage } from "std::thread"
19
35
  import { chooseOption, ChoiceItem } from "std::ui"
20
36
 
21
37
  import { figs, title } from "./images/images.agency"
38
+ import { detectAttachments, modalityFilter } from "./lib/attachments.agency"
22
39
  import { POLICY_PATH, HISTORY_PATH, ALWAYS_FIELDS } from "./lib/config.agency"
23
40
  import {
24
41
  minimalAutoApprovePolicy,
25
42
  recommendedAutoApprovePolicy,
26
43
  } from "./lib/defaultPolicy.agency"
44
+ import { filterHostedModels, ModelFilters } from "./lib/modelFilters.agency"
45
+ import { parseModelFlag, knownProviders, Resolved } from "./lib/models.agency"
46
+ import {
47
+ buildLayers,
48
+ resolveAll,
49
+ diffResolved,
50
+ Ctx,
51
+ SlotChange,
52
+ } from "./lib/resolution.agency"
53
+ import {
54
+ configureSearch,
55
+ setSearchBackend,
56
+ getSearchBackend,
57
+ availableBackendItems,
58
+ } from "./lib/search.agency"
59
+ import { getModelSettings, loadSettings } from "./lib/settings.agency"
27
60
  import { truncate, formatArgs, formatToolResponse } from "./lib/utils.agency"
28
- import { configureModels } from "./shared.agency"
61
+ import {
62
+ configureModels,
63
+ configureLocalModel,
64
+ enableAgentMemory,
65
+ getResolvedSlots,
66
+ applyResolved,
67
+ promoteAll,
68
+ currentProvider,
69
+ } from "./shared.agency"
29
70
  import { codeAgent } from "./subagents/code.agency"
30
71
  import { explorerAgent } from "./subagents/explorer.agency"
31
72
  import { oracleAgent } from "./subagents/oracle.agency"
@@ -126,13 +167,75 @@ callback("onLLMCallEnd") as data {
126
167
  }
127
168
  }
128
169
 
170
+ // Map a transient LLM retry reason (an `LLMRetryReason` from the runtime
171
+ // retry layer) to a short, human-facing label. `connectionLost` is the
172
+ // lost-internet / closed-the-laptop case; the rest cover provider hiccups
173
+ // and our own per-call timeout.
174
+ export def retryReasonLabel(reason: string): string {
175
+ if (reason == "connectionLost") {
176
+ return "Connection lost"
177
+ }
178
+ if (reason == "timeout") {
179
+ return "Request timed out"
180
+ }
181
+ if (reason == "streamInterrupted") {
182
+ return "Connection interrupted"
183
+ }
184
+ if (reason == "rateLimit") {
185
+ return "Rate limited"
186
+ }
187
+ if (reason == "overloaded") {
188
+ return "Model overloaded"
189
+ }
190
+ if (reason == "serverError") {
191
+ return "Server error"
192
+ }
193
+ return reason
194
+ }
195
+
196
+ // A transient LLM failure (lost connection, timeout, server hiccup) the
197
+ // runtime is about to retry. Surface a dim, one-line heads-up so the user
198
+ // understands the pause instead of staring at a frozen prompt — this is the
199
+ // "lost internet / closed the laptop" experience the abort taxonomy made
200
+ // distinguishable. Gated like the other traces so piped one-shot output
201
+ // stays clean. `attempt` is the 1-based retry number; `maxRetries` is the
202
+ // configured retry budget.
203
+ callback("onLLMRetry") as data {
204
+ if (_showTraces()) {
205
+ pushMessage(
206
+ color.dim(
207
+ "⟳ ${retryReasonLabel(data.reason)} — retrying (${data.attempt}/${data.maxRetries})…",
208
+ ),
209
+ )
210
+ }
211
+ }
212
+
213
+ // Turn a terminal (retries-exhausted) LLM failure into a short, actionable
214
+ // message. The runtime's exhausted-retry error text embeds the reason in
215
+ // parens, e.g. "LLM call failed after 3 attempts (connectionLost): ...". We
216
+ // recognize the transport reasons that mean "the network or model dropped"
217
+ // and give concrete advice; anything else echoes the raw error so nothing
218
+ // is hidden.
219
+ export def formatTurnFailure(errText: string): string {
220
+ if (errText.includes("(connectionLost)") || errText.includes("(streamInterrupted)")) {
221
+ return "⚠ Lost the connection to the model and couldn't recover after retrying.\nCheck your internet connection and try again."
222
+ }
223
+ if (errText.includes("(timeout)")) {
224
+ return "⚠ The model took too long to respond — the request timed out after retrying.\nTry again, perhaps with a smaller request."
225
+ }
226
+ if (errText.includes("(rateLimit)") || errText.includes("(overloaded)") || errText.includes("(serverError)")) {
227
+ return "⚠ The model provider is busy and the request failed after retrying.\nWait a moment and try again."
228
+ }
229
+ return "⚠ The request failed: ${errText}"
230
+ }
231
+
129
232
  type ToolCallData = {
130
233
  name: string;
131
234
  arguments: any
132
235
  }
133
236
 
134
237
  type LLMResponse = {
135
- output: string | null;
238
+ output?: string;
136
239
  toolCalls: ToolCallData[];
137
240
  usage: { inputTokens: number; outputTokens: number; totalTokens: number; cachedInputTokens: number };
138
241
  cost: { inputCost: number; outputCost: number; cachedInputCost: number; totalCost: number; currency: string };
@@ -144,7 +247,7 @@ def renderLLMCallResponse(data: LLMResponse): string {
144
247
  if (data.output != "" && data.output != null && data.output != undefined) {
145
248
  response.push(data.output)
146
249
  }
147
- if (data.toolCalls && data.toolCalls.length > 0) {
250
+ if (data.toolCalls.length > 0) {
148
251
  for (toolCall in data.toolCalls) {
149
252
  response.push(`${toolCall.name}(${formatArgs(toolCall.arguments)})`)
150
253
  }
@@ -184,7 +287,12 @@ def builtinPalette(): Record<string, string> {
184
287
  return {
185
288
  "/exit": "Exit the agent",
186
289
  "/clear": "Clear the conversation transcript",
290
+ "/clear-history": "Clear the input history (recall + saved file)",
187
291
  "/cost": "Show cumulative LLM cost and tokens",
292
+ "/model": "Switch the model (bare to pick, or slot=model)",
293
+ "/models": "List / filter the hosted model catalog",
294
+ "/local": "Switch to a local model",
295
+ "/search": "Choose the web search backend (hosted / Tavily / Brave / off)",
188
296
  "/paste": "Multi-line paste mode (Ctrl+D submits, Ctrl+C cancels)",
189
297
  "/help": "Show available slash commands"
190
298
  }
@@ -208,6 +316,136 @@ def mergedPalette(): Record<string, string> {
208
316
  return out
209
317
  }
210
318
 
319
+ // In-session model selection state. One mutable cell holding the current
320
+ // Session (the pin + per-slot overrides chosen via /model this run). switchModel
321
+ // is pure over this value — it copies, never mutates — so it stays testable.
322
+ export type Session = {
323
+ pin: string;
324
+ slots: Record<string, string>
325
+ }
326
+
327
+ let _session: Session = {
328
+ pin: "",
329
+ slots: {}
330
+ }
331
+
332
+ /** Apply an in-session model selection. Copies `prior` (never mutates), folds in
333
+ the new spec (bare → pin; slot=model → per-slot), resolves, applies, and returns
334
+ the new session + assignment + the slots that changed (so the caller can react,
335
+ e.g. the cross-provider recall notice). Turn-boundary semantics: takes effect on
336
+ the NEXT turn; no in-flight call is mutated. */
337
+ export def switchModel(
338
+ prior: Session,
339
+ spec: string,
340
+ ctx: Ctx,
341
+ before: Record<string, Resolved>,
342
+ ): { session: Session; resolved: Record<string, Resolved>; changes: SlotChange[] } {
343
+ let nextSlots: Record<string, string> = {}
344
+ for (key in Object.keys(prior.slots)) {
345
+ nextSlots[key] = prior.slots[key]
346
+ }
347
+ let next: Session = {
348
+ pin: prior.pin,
349
+ slots: nextSlots
350
+ }
351
+ const parsed = parseModelFlag(spec)
352
+ if (parsed.slot != "" && parsed.slot != "main" && parsed.slot != "reasoning") {
353
+ pushMessage(
354
+ color.red("Unknown model slot '${parsed.slot}'. Valid slots: main, reasoning."),
355
+ )
356
+ return {
357
+ session: prior,
358
+ resolved: before,
359
+ changes: []
360
+ }
361
+ }
362
+ if (parsed.slot == "") {
363
+ next.pin = parsed.model
364
+ } else {
365
+ next.slots[parsed.slot] = parsed.model
366
+ }
367
+
368
+ // A saved provider (settings.model.provider) means a provider is established,
369
+ // so a unified provider/model spec should not be split during resolution.
370
+ const settings = getModelSettings(loadSettings())
371
+ const providerEstablished = settings.provider != null && settings.provider != ""
372
+ const layers = buildLayers(
373
+ next.pin,
374
+ next.slots,
375
+ "",
376
+ {},
377
+ settings,
378
+ knownProviders(),
379
+ providerEstablished,
380
+ )
381
+ const all = resolveAll(layers, ctx)
382
+ if (isFailure(all)) {
383
+ pushMessage(color.red("Could not switch model: ${all.error}"))
384
+ return {
385
+ session: prior,
386
+ resolved: before,
387
+ changes: []
388
+ }
389
+ }
390
+ const resolved = promoteAll(all.value)
391
+ applyResolved(resolved)
392
+ return {
393
+ session: next,
394
+ resolved: resolved,
395
+ changes: diffResolved(before, resolved)
396
+ }
397
+ }
398
+
399
+ /** React to one resolved-slot change. Phase 1: a `main`-slot provider change
400
+ means the embedding space behind memory changed, so pause memory and warn.
401
+ (std::memory has no tier-2-only toggle yet -- full pause; structured recall
402
+ returns when a selective toggle lands.) Returns true if it emitted the notice. */
403
+ export def reactToSlotChange(change: SlotChange): boolean {
404
+ if (change.slot == "main" && change.before.provider != change.after.provider) {
405
+ pushMessage(
406
+ color.dim(
407
+ "Warning: provider changed - memory is paused until restart (recall would be unreliable).",
408
+ ),
409
+ )
410
+ // `with approve`: the agent is deliberately auto-pausing memory on a
411
+ // provider switch, not asking the user — so don't surface an approval prompt.
412
+ disableMemory() with approve
413
+ return true
414
+ }
415
+ return false
416
+ }
417
+
418
+ // ChoiceItem list for the model pickers: the hosted catalog, filtered, each
419
+ // labeled with provider + input price for an informed pick.
420
+ export def modelChoiceItems(filters: ModelFilters): ChoiceItem[] {
421
+ let items: ChoiceItem[] = []
422
+ for (model in filterHostedModels(listHostedModels(), filters)) {
423
+ const label = "${model.name} (${model.provider}, $${model.inputCost}/1M in)"
424
+ items.push({
425
+ key: model.name,
426
+ label: label
427
+ })
428
+ }
429
+ return items
430
+ }
431
+
432
+ // Parse a `/models [provider]` command line into filters. Bare `/models` (or a
433
+ // trailing-space-only arg) yields no filters; `/models <provider>` narrows to
434
+ // one provider. Extracted from the handler so it is unit-testable.
435
+ export def parseModelsFilters(cmd: string): ModelFilters {
436
+ const prefix = "/models "
437
+ if (!cmd.startsWith(prefix)) {
438
+ return {}
439
+ }
440
+ const arg = cmd.substring(prefix.length).trim()
441
+ if (arg == "") {
442
+ return {}
443
+ }
444
+ return {
445
+ provider: arg
446
+ }
447
+ }
448
+
211
449
  // Slash-command + user-message dispatcher invoked by `repl()` for
212
450
  // every Enter keystroke. Return `false` to terminate the loop.
213
451
  def _runTurn(msg: string): boolean {
@@ -227,8 +465,30 @@ def _runTurn(msg: string): boolean {
227
465
  clearMessages()
228
466
  return true
229
467
  }
468
+ if (trimmed == "/clear-history") {
469
+ clearHistory()
470
+ pushMessage("Input history cleared.")
471
+ return true
472
+ }
230
473
  if (trimmed == "/help") {
231
- pushMessage("Commands: /exit, /clear, /cost, /paste, /help")
474
+ pushMessage(
475
+ "Commands: /exit, /clear, /clear-history, /cost, /model, /models, /local, /search, /paste, /help",
476
+ )
477
+ return true
478
+ }
479
+ if (trimmed == "/search") {
480
+ const opts = availableBackendItems()
481
+ const choice = chooseOption(
482
+ "Web search backend",
483
+ "Pick how this agent searches the web. Current: ${getSearchBackend()}",
484
+ opts,
485
+ false,
486
+ true,
487
+ )
488
+ if (choice != "" && choice != null && choice != undefined) {
489
+ setSearchBackend(choice)
490
+ pushMessage("Web search backend set to: ${choice}")
491
+ }
232
492
  return true
233
493
  }
234
494
  if (trimmed == "/cost") {
@@ -252,18 +512,123 @@ def _runTurn(msg: string): boolean {
252
512
  pushMessage("")
253
513
  pushMessage("By model:")
254
514
  for (m in byModel) {
255
- pushMessage(" ${m.model} ↑${m.inputTokens} ↓${m.outputTokens} $${m.cost.toFixed(4)}")
515
+ pushMessage(
516
+ " ${m.model} ↑${m.inputTokens} ↓${m.outputTokens} $${m.cost.toFixed(4)}",
517
+ )
256
518
  }
257
519
  }
258
520
  return true
259
521
  }
522
+ if (trimmed == "/model" || trimmed.startsWith("/model ")) {
523
+ let spec = ""
524
+ if (trimmed != "/model") {
525
+ spec = trimmed.substring(7).trim()
526
+ }
527
+ if (spec == "") {
528
+ pushMessage("Current models:")
529
+ const current = getResolvedSlots()
530
+ for (slot in Object.keys(current)) {
531
+ const resolved = current[slot]
532
+ if (resolved != null) {
533
+ pushMessage(" ${slot}: ${resolved.model} (${resolved.via})")
534
+ }
535
+ }
536
+ const items = modelChoiceItems({})
537
+ const choice = chooseOption(
538
+ "Model",
539
+ "Pick a model, or type one (or slot=model, e.g. reasoning=claude-opus-4-8). Empty to cancel.",
540
+ items,
541
+ allowFreeText: true,
542
+ allowCancel: true,
543
+ )
544
+ if (choice == "" || choice == null) {
545
+ return true
546
+ }
547
+ spec = choice
548
+ }
549
+ const ctx: Ctx = {
550
+ provider: currentProvider(),
551
+ price: "standard"
552
+ }
553
+ const out = switchModel(_session, spec, ctx, getResolvedSlots())
554
+ _session = out.session
555
+ for (change in out.changes) {
556
+ reactToSlotChange(change)
557
+ }
558
+ pushMessage("Model set:")
559
+ for (slot in Object.keys(out.resolved)) {
560
+ const resolved = out.resolved[slot]
561
+ if (resolved != null) {
562
+ pushMessage(color.dim(" ${slot}: ${resolved.model} (${resolved.via})"))
563
+ }
564
+ }
565
+ return true
566
+ }
567
+ if (trimmed == "/models" || trimmed.startsWith("/models ")) {
568
+ const filters = parseModelsFilters(trimmed)
569
+ const models = filterHostedModels(listHostedModels(), filters)
570
+ if (models.length == 0) {
571
+ pushMessage("No models match.")
572
+ return true
573
+ }
574
+ for (model in models) {
575
+ pushMessage(
576
+ " ${model.name} (${model.provider}, $${model.inputCost}/1M in, ${model.contextWindow} ctx)",
577
+ )
578
+ }
579
+ return true
580
+ }
581
+ if (trimmed == "/local") {
582
+ if (!localModelsSupported()) {
583
+ pushMessage(
584
+ color.yellow(
585
+ "Local models need smoltalk-llama-cpp. Install: ! npm i -g smoltalk-llama-cpp",
586
+ ),
587
+ )
588
+ return true
589
+ }
590
+ let items: ChoiceItem[] = []
591
+ for (modelName in listModelNames()) {
592
+ items.push({
593
+ key: modelName.name,
594
+ label: modelName.name
595
+ })
596
+ }
597
+ const choice = chooseOption(
598
+ "Local model",
599
+ "Pick a local model, or type an hf: URI / .gguf path (downloads on first use):",
600
+ items,
601
+ allowFreeText: true,
602
+ allowCancel: true,
603
+ )
604
+ if (choice == "" || choice == null) {
605
+ return true
606
+ }
607
+ const before = getResolvedSlots()
608
+ configureLocalModel(choice)
609
+ configureSearch(true)
610
+ for (change in diffResolved(before, getResolvedSlots())) {
611
+ reactToSlotChange(change)
612
+ }
613
+ pushMessage("Switched to local model: ${choice}")
614
+ return true
615
+ }
616
+
260
617
  // Hand the message to the agent. `agentReply` does the slash-command
261
618
  // 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."))
619
+ // Wrap in `try` so a terminal LLM failure (e.g. the connection dropped and
620
+ // retries were exhausted) renders a friendly heads-up instead of a raw
621
+ // Failure object. Aborts/interrupts are NOT caught here — `try` re-throws
622
+ // them so an Esc-cancel still reaches the policy handler.
623
+ const result = try agentReply(msg)
624
+ if (result is success(reply)) {
625
+ if (reply != "" && reply != null && reply != undefined) {
626
+ pushMessage(highlight("${reply}\n", language: "markdown"))
627
+ } else {
628
+ pushMessage(color.red("No reply generated."))
629
+ }
630
+ } else if (result is failure(f)) {
631
+ pushMessage(color.red(formatTurnFailure("${f.error}")))
267
632
  }
268
633
  return true
269
634
  }
@@ -279,8 +644,8 @@ static const mainAgentSystemPrompt = """
279
644
  You are the top-level coordinator of an Agency-language assistant. You
280
645
  receive every user message and decide how to respond.
281
646
 
282
- You have five subagent tools, each running in its own isolated
283
- context:
647
+ You have five subagent tools (each running in its own isolated
648
+ context) and one direct tool:
284
649
 
285
650
  - `codeAgent(userMsg)` — anything that touches code or the filesystem:
286
651
  reading, writing, editing, typechecking, running shell commands,
@@ -297,6 +662,11 @@ context:
297
662
  - `explorerAgent(userMsg)` — a read-only researcher that produces
298
663
  broad, synthesizing answers about the codebase or bundled docs.
299
664
  Read the **Explorer** section below.
665
+ - `generateImageFile(prompt, path, size, images)` — generate an image
666
+ from a text prompt (or modify existing images by passing their paths
667
+ in `images`) and save it to `path`. Call it directly whenever the
668
+ user asks you to create, draw, edit, or restyle an image — do NOT
669
+ route image generation to `codeAgent`.
300
670
 
301
671
  **Answer directly (no tool call) when** the message is conversational,
302
672
  a clarifying question, or something you can answer from context alone.
@@ -439,22 +809,81 @@ unless the user has clearly asked for an action ("do X", "fix Y",
439
809
  with them — don't sprint to implementation.
440
810
  """
441
811
 
812
+ // Exported for tests: agent-cwd resolution of edit inputs is a spec
813
+ // invariant with no other observable (the deterministic image client
814
+ // ignores its images argument). generateImage accepts path / URL /
815
+ // data-URI strings, so only local paths get agent-cwd resolution —
816
+ // running a URL through applyAgentCwd would mangle it into
817
+ // "<agentCwd>/https:/…".
818
+ export def resolveEditInputs(images: string[]): string[] {
819
+ return map(images) as inputPath {
820
+ if (inputPath.startsWith("http://") || inputPath.startsWith("https://") || inputPath.startsWith("data:")) {
821
+ return inputPath
822
+ }
823
+ return applyAgentCwd(inputPath)
824
+ }
825
+ }
826
+
827
+ // Direct image generation for the coordinator. Saves to disk and
828
+ // returns the path — never base64, which would flood the LLM context.
829
+ // The write rides the std::writeBinary interrupt gate (writes are not
830
+ // auto-approved by policy) and generation cost accrues to the agent's
831
+ // cost tracking like any llm() call.
832
+ export def generateImageFile(
833
+ prompt: string,
834
+ path: string,
835
+ size: string = "",
836
+ images: string[] = [],
837
+ ): string {
838
+ """
839
+ Generate an image from a text prompt and save it to `path`. To MODIFY
840
+ existing images (edit / variation), pass their paths in `images`.
841
+ Returns the saved path on success. Use this when the user asks to
842
+ create, draw, edit, or restyle an image.
843
+
844
+ @param prompt - What to generate, or how to modify the input images.
845
+ @param path - Where to save the resulting image (e.g. "diagram.png").
846
+ @param size - Optional size like "1024x1024".
847
+ @param images - Optional input image paths to edit / vary.
848
+ """
849
+ // LLM-supplied paths resolve against the agent cwd, like every other
850
+ // agent file tool.
851
+ const inputs = resolveEditInputs(images)
852
+ const generated = generateImage(prompt, size: size, images: inputs)
853
+ if (isFailure(generated)) {
854
+ return "Image generation failed: ${generated.error}"
855
+ }
856
+ // writeBinary rejects an absolute filename when dir is set, so split
857
+ // path into (dir, name); useAgentCwd resolves a relative dir against
858
+ // the agent cwd (absolute dirs pass through untouched).
859
+ const written = writeBinary(basename(path), generated.value.base64, dirname(path), useAgentCwd: true)
860
+ if (isFailure(written)) {
861
+ return "Generated the image, but saving to ${path} failed: ${written.error}"
862
+ }
863
+ // Show the model what it made (generate -> view -> refine). The loop
864
+ // inlines the bytes when it builds the injected user message; the
865
+ // path resolves the same way the write did.
866
+ attachToReply(image(applyAgentCwd(path)))
867
+ return "Saved image to ${path}"
868
+ }
869
+
442
870
  static const mainAgentTools = [
443
871
  researchAgent.partial(allowHandoff: false),
444
872
  codeAgent.partial(allowHandoff: false),
445
873
  reviewAgent.partial(allowHandoff: false),
446
874
  oracleAgent.partial(allowHandoff: false),
447
875
  explorerAgent.partial(allowHandoff: false),
876
+ generateImageFile,
448
877
  ]
449
878
 
450
- def mainAgent(prompt: string): string {
879
+ def mainAgent(prompt: string | (string | Attachment)[]): string {
451
880
  thread(label: "main", summarize: true, session: "main") {
452
881
  setMemoryId("main")
453
882
  if (first) {
454
883
  // `_context` carries the per-run grounding (date, cwd, AGENTS.md),
455
884
  // set by `setupSession`. Appending it to the system prompt is what
456
885
  // actually gets that context to the LLM.
457
- systemMessage(mainAgentSystemPrompt + _context)
886
+ systemMessage("${mainAgentSystemPrompt}${_context}")
458
887
  first = false
459
888
  }
460
889
  const result = llm(prompt, {
@@ -487,7 +916,28 @@ export def agentReplyVia(target: string, userMsg: string): string {
487
916
  if (target == "review") {
488
917
  return reviewAgent(expanded, false)
489
918
  }
490
- return mainAgent(expanded)
919
+ // Auto-attach image/PDF files the user referenced (drag-drop or typed
920
+ // path), filtered to what the resolved model accepts. Never silent:
921
+ // every attach and every skip prints a visible line.
922
+ const detected = modalityFilter(detectAttachments(expanded))
923
+ for (skippedFile in detected.skipped) {
924
+ pushMessage(color.yellow("📎 skipped ${skippedFile.label} (${skippedFile.reason})"))
925
+ }
926
+ if (detected.attached.length == 0) {
927
+ // Deliberate special case: a text-only turn stays a bare string. A
928
+ // one-element array is API-equivalent, but the stored thread message
929
+ // shape (string vs parts array) — and with it every serialized
930
+ // session and message fixture — would change for EVERY turn.
931
+ return mainAgent(expanded)
932
+ }
933
+ for (item in detected.attached) {
934
+ pushMessage(color.dim("📎 attached ${item.label}"))
935
+ }
936
+ const attachments = map(detected.attached) as item {
937
+ return item.attachment
938
+ }
939
+ const parts: (string | Attachment)[] = [expanded, ...attachments]
940
+ return mainAgent(parts)
491
941
  }
492
942
 
493
943
  // The agent's core turn, decoupled from the terminal: expand any project
@@ -558,9 +1008,9 @@ def givePolicyChoice() {
558
1008
  ]
559
1009
 
560
1010
  const answer = chooseOption(title, body, items, allowFreeText: true)
561
- match(answer) {
562
- "minimal" => return minimalAutoApprovePolicy
563
- "recommended" => return recommendedAutoApprovePolicy
1011
+ return match(answer) {
1012
+ "minimal" => minimalAutoApprovePolicy
1013
+ "recommended" => recommendedAutoApprovePolicy
564
1014
  }
565
1015
  }
566
1016
 
@@ -616,7 +1066,15 @@ def oneShotAgent(target: string, prompt: string): string {
616
1066
  const handler = setupSession(false)
617
1067
  let reply: string = ""
618
1068
  handle {
619
- reply = agentReplyVia(target, prompt)
1069
+ // `try` converts a terminal LLM failure (retries exhausted on a dropped
1070
+ // connection / timeout) into a friendly message; aborts/interrupts still
1071
+ // propagate to the handler below.
1072
+ const result = try agentReplyVia(target, prompt)
1073
+ if (result is success(r)) {
1074
+ reply = r
1075
+ } else if (result is failure(f)) {
1076
+ reply = formatTurnFailure("${f.error}")
1077
+ }
620
1078
  } with (data) {
621
1079
  return handler(data)
622
1080
  }
@@ -628,11 +1086,15 @@ def oneShotAgent(target: string, prompt: string): string {
628
1086
  // Mirrors the reply-rendering half of `_runTurn`.
629
1087
  def _runSeedTurn(target: string, msg: string) {
630
1088
  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."))
1089
+ const result = try agentReplyVia(target, msg)
1090
+ if (result is success(reply)) {
1091
+ if (reply != "" && reply != null && reply != undefined) {
1092
+ pushMessage(highlight("${reply}\n", language: "markdown"))
1093
+ } else {
1094
+ pushMessage(color.red("No reply generated."))
1095
+ }
1096
+ } else if (result is failure(f)) {
1097
+ pushMessage(color.red(formatTurnFailure("${f.error}")))
636
1098
  }
637
1099
  }
638
1100
 
@@ -697,7 +1159,7 @@ node main() {
697
1159
  },
698
1160
  provider: {
699
1161
  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"
1162
+ 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
1163
  },
702
1164
  interactive: {
703
1165
  type: "boolean",
@@ -707,6 +1169,16 @@ node main() {
707
1169
  agent: {
708
1170
  type: "string",
709
1171
  description: "Route the starting prompt to a named subagent: code, research, oracle, explorer, review (default: coordinator)"
1172
+ },
1173
+ local: {
1174
+ type: "string",
1175
+ optional: true,
1176
+ 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"
1177
+ },
1178
+ "local-model": {
1179
+ type: "string",
1180
+ optional: true,
1181
+ description: "Deprecated alias for --local."
710
1182
  }
711
1183
  }
712
1184
  },
@@ -719,19 +1191,98 @@ node main() {
719
1191
  VERBOSE = true
720
1192
  }
721
1193
 
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
- )
1194
+ // Model setup. `--local` (deprecated alias: `--local-model`) is an optional-
1195
+ // value flag with three states: absent (null); bare empty-string for guided
1196
+ // setup; a value for that local model. `--local` and the hosted flags
1197
+ // (--model / --fastmodel / --slowmodel) are mutually exclusive -- local and
1198
+ // hosted are different in kind (provider llama-cpp, no embedding endpoint).
1199
+ const localVal = args.flags["local"] ?? args.flags["local-model"]
1200
+ const modelArg = args.flags.model ?? ""
1201
+ const hasModelFlags = modelArg != "" || (args.flags.fastmodel ?? "") != "" || (args.flags.slowmodel ?? "") != ""
1202
+ if (localVal != null && hasModelFlags) {
1203
+ print(
1204
+ color.red("Pass either --model (hosted) or --local (local), not both."),
1205
+ )
1206
+ process.exit(1)
1207
+ }
1208
+ if (localVal == "") {
1209
+ // Bare --local: guided setup. Non-interactive can't prompt, so keep the
1210
+ // print-catalog-and-exit behavior there.
1211
+ if (!isTTY()) {
1212
+ printLocalCatalog()
1213
+ process.exit(0)
1214
+ }
1215
+ if (!localModelsSupported()) {
1216
+ print(color.yellow("Local models need the smoltalk-llama-cpp package."))
1217
+ print("Install it, then re-run: ! npm i -g smoltalk-llama-cpp")
1218
+ process.exit(1)
1219
+ }
1220
+ let items: ChoiceItem[] = []
1221
+ for (modelName in listModelNames()) {
1222
+ items.push({
1223
+ key: modelName.name,
1224
+ label: modelName.name
1225
+ })
1226
+ }
1227
+ const choice = chooseOption(
1228
+ "Local model",
1229
+ "Pick a model, or type an hf: URI / .gguf path (downloads on first use):",
1230
+ items,
1231
+ allowFreeText: true,
1232
+ allowCancel: true,
1233
+ )
1234
+ if (choice == "" || choice == null) {
1235
+ process.exit(0)
1236
+ }
1237
+ configureLocalModel(choice)
1238
+ configureSearch(true)
1239
+ // fall through into the session on the chosen local model
1240
+ } else if (localVal != null) {
1241
+ configureLocalModel(localVal)
1242
+ // Intentionally do NOT enable memory for a local model: the llama-cpp
1243
+ // provider has no embedding endpoint, so memory would only emit a
1244
+ // "Tier-2 disabled" notice. std::memory calls no-op while it's off.
1245
+ configureSearch(true)
1246
+ } else {
1247
+ // Hosted path. --model accepts `slot=model` (per-slot) or a bare model
1248
+ // (global pin); explicit --fastmodel/--slowmodel win over a --model slot=.
1249
+ const parsed = parseModelFlag(modelArg)
1250
+ let modelGlobal = ""
1251
+ let fastFlag = ""
1252
+ let slowFlag = ""
1253
+ if (modelArg != "") {
1254
+ if (parsed.slot == "") {
1255
+ modelGlobal = parsed.model
1256
+ } else if (parsed.slot == "main") {
1257
+ fastFlag = parsed.model
1258
+ } else if (parsed.slot == "reasoning") {
1259
+ slowFlag = parsed.model
1260
+ } else {
1261
+ print(
1262
+ color.red(
1263
+ "Unknown model slot '${parsed.slot}' in --model. Valid slots: main, reasoning.",
1264
+ ),
1265
+ )
1266
+ process.exit(1)
1267
+ }
1268
+ }
1269
+ const fm = args.flags.fastmodel ?? ""
1270
+ const sm = args.flags.slowmodel ?? ""
1271
+ if (fm != "") {
1272
+ fastFlag = fm
1273
+ }
1274
+ if (sm != "") {
1275
+ slowFlag = sm
1276
+ }
1277
+ configureModels(modelGlobal, fastFlag, slowFlag, args.flags.provider ?? "")
1278
+ // Persistent knowledge graph — enabled for hosted providers, skipped for
1279
+ // local models. (Some hosted providers, e.g. anthropic, still lack an
1280
+ // embedding endpoint and just disable Tier-2 recall with a one-time
1281
+ // notice; structured recall works regardless.) Must run before any
1282
+ // handler/REPL is installed.
1283
+ enableAgentMemory()
1284
+ configureSearch(false)
1285
+ }
735
1286
 
736
1287
  // Positional args (everything after flags) are joined with spaces to
737
1288
  // form the starting prompt. `--` ends flag parsing if a positional
@@ -801,3 +1352,4 @@ node main() {
801
1352
  const handler = setupSession(true)
802
1353
  startInteractive(handler, "", "")
803
1354
  }
1355
+