agency-lang 0.5.0 → 0.6.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 (532) hide show
  1. package/dist/lib/agents/agency-agent/agent.agency +283 -108
  2. package/dist/lib/agents/agency-agent/agent.js +1666 -403
  3. package/dist/lib/agents/agency-agent/images/images.js +1 -0
  4. package/dist/lib/agents/agency-agent/lib/config.agency +3 -3
  5. package/dist/lib/agents/agency-agent/lib/config.js +1 -0
  6. package/dist/lib/agents/agency-agent/lib/defaultPolicy.agency +33 -1
  7. package/dist/lib/agents/agency-agent/lib/defaultPolicy.js +163 -3
  8. package/dist/lib/agents/agency-agent/lib/utils.js +18 -0
  9. package/dist/lib/agents/agency-agent/prompts/codeSample.js +17 -0
  10. package/dist/lib/agents/agency-agent/shared.agency +101 -2
  11. package/dist/lib/agents/agency-agent/shared.js +540 -2
  12. package/dist/lib/agents/agency-agent/subagents/code.agency +77 -49
  13. package/dist/lib/agents/agency-agent/subagents/code.js +141 -93
  14. package/dist/lib/agents/agency-agent/subagents/explorer.agency +11 -13
  15. package/dist/lib/agents/agency-agent/subagents/explorer.js +48 -20
  16. package/dist/lib/agents/agency-agent/subagents/oracle.agency +11 -12
  17. package/dist/lib/agents/agency-agent/subagents/oracle.js +48 -18
  18. package/dist/lib/agents/agency-agent/subagents/research.agency +9 -3
  19. package/dist/lib/agents/agency-agent/subagents/research.js +17 -2
  20. package/dist/lib/agents/agency-agent/subagents/review.agency +6 -6
  21. package/dist/lib/agents/agency-agent/subagents/review.js +27 -60
  22. package/dist/lib/agents/agency-agent/tests/agentTurn.agency +15 -0
  23. package/dist/lib/agents/agency-agent/{subagents/oneShot.js → tests/agentTurn.js} +77 -75
  24. package/dist/lib/agents/agency-agent/tests/agentTurn.test.json +12 -0
  25. package/dist/lib/agents/agency-agent/tests/execPolicy.agency +46 -0
  26. package/dist/lib/agents/agency-agent/tests/execPolicy.js +795 -0
  27. package/dist/lib/agents/agency-agent/tests/execPolicy.test.json +34 -0
  28. package/dist/lib/agents/agency-agent/tests/toolWiring.agency +60 -0
  29. package/dist/lib/agents/agency-agent/tests/toolWiring.js +726 -0
  30. package/dist/lib/agents/agency-agent/tests/toolWiring.test.json +32 -0
  31. package/dist/lib/agents/agency-agent/toolWiring.js +696 -0
  32. package/dist/lib/agents/docs/cli/cli/eval-judge.md +7 -7
  33. package/dist/lib/agents/docs/cli/cli/eval.md +26 -91
  34. package/dist/lib/agents/docs/cli/cli/optimize.md +181 -0
  35. package/dist/lib/agents/docs/cli/eval-judge.md +7 -7
  36. package/dist/lib/agents/docs/cli/eval.md +26 -91
  37. package/dist/lib/agents/docs/cli/optimize.md +181 -0
  38. package/dist/lib/agents/docs/guide/effects-and-raises.md +156 -0
  39. package/dist/lib/agents/docs/guide/guide/effects-and-raises.md +156 -0
  40. package/dist/lib/agents/docs/guide/guide/handlers.md +2 -2
  41. package/dist/lib/agents/docs/guide/guide/partial-application.md +26 -0
  42. package/dist/lib/agents/docs/guide/guide/policies.md +3 -3
  43. package/dist/lib/agents/docs/guide/guide/serving.md +1 -1
  44. package/dist/lib/agents/docs/guide/guide/structured-interrupts.md +8 -8
  45. package/dist/lib/agents/docs/guide/guide/troubleshooting.md +56 -1
  46. package/dist/lib/agents/docs/guide/guide/ts-interop.md +1 -1
  47. package/dist/lib/agents/docs/guide/handlers.md +2 -2
  48. package/dist/lib/agents/docs/guide/partial-application.md +26 -0
  49. package/dist/lib/agents/docs/guide/policies.md +3 -3
  50. package/dist/lib/agents/docs/guide/serving.md +1 -1
  51. package/dist/lib/agents/docs/guide/structured-interrupts.md +8 -8
  52. package/dist/lib/agents/docs/guide/troubleshooting.md +56 -1
  53. package/dist/lib/agents/docs/guide/ts-interop.md +1 -1
  54. package/dist/lib/agents/eval/goalJudge.agency +24 -0
  55. package/dist/lib/agents/eval/goalJudge.js +311 -0
  56. package/dist/lib/agents/{judge.js → eval/judge.js} +11 -6
  57. package/dist/lib/agents/eval/judgePairwise.js +313 -0
  58. package/dist/lib/agents/gepaReflect.js +316 -0
  59. package/dist/lib/agents/mutatePrompt.js +9 -9
  60. package/dist/lib/agents/optimize/gepaReflect.agency +58 -0
  61. package/dist/lib/agents/optimize/gepaReflect.js +325 -0
  62. package/dist/lib/agents/{mutatePrompt.agency → optimize/mutatePrompt.agency} +7 -1
  63. package/dist/lib/agents/optimize/mutatePrompt.js +313 -0
  64. package/dist/lib/agents/policy/agent.agency +14 -14
  65. package/dist/lib/agents/policy/agent.js +67 -34
  66. package/dist/lib/agents/review/agent.js +8 -0
  67. package/dist/lib/analysis/interrupts.d.ts +3 -3
  68. package/dist/lib/analysis/interrupts.js +1 -1
  69. package/dist/lib/analysis/interrupts.test.js +6 -6
  70. package/dist/lib/backends/agencyGenerator.d.ts +2 -0
  71. package/dist/lib/backends/agencyGenerator.js +32 -5
  72. package/dist/lib/backends/anthropicApiKey.codegen.test.js +34 -0
  73. package/dist/lib/backends/maxToolResultChars.codegen.test.js +32 -0
  74. package/dist/lib/backends/raisesFormat.test.d.ts +1 -0
  75. package/dist/lib/backends/raisesFormat.test.js +59 -0
  76. package/dist/lib/backends/typescriptBuilder/assignmentEmitter.d.ts +5 -2
  77. package/dist/lib/backends/typescriptBuilder/assignmentEmitter.js +10 -7
  78. package/dist/lib/backends/typescriptBuilder/scopeManager.d.ts +11 -0
  79. package/dist/lib/backends/typescriptBuilder/scopeManager.js +20 -0
  80. package/dist/lib/backends/typescriptBuilder/scopeManager.test.d.ts +1 -0
  81. package/dist/lib/backends/typescriptBuilder/scopeManager.test.js +29 -0
  82. package/dist/lib/backends/typescriptBuilder.js +47 -21
  83. package/dist/lib/backends/typescriptGenerator/typeToString.d.ts +0 -3
  84. package/dist/lib/backends/typescriptGenerator/typeToString.js +19 -0
  85. package/dist/lib/cli/commands.js +30 -2
  86. package/dist/lib/cli/doc.js +11 -11
  87. package/dist/lib/cli/doc.test.js +9 -9
  88. package/dist/lib/cli/doctor.d.ts +5 -0
  89. package/dist/lib/cli/doctor.js +43 -0
  90. package/dist/lib/cli/eval/optimize.d.ts +14 -10
  91. package/dist/lib/cli/eval/optimize.js +137 -68
  92. package/dist/lib/cli/eval/optimize.test.js +132 -129
  93. package/dist/lib/cli/eval/run.d.ts +22 -15
  94. package/dist/lib/cli/eval/run.js +38 -26
  95. package/dist/lib/cli/eval/run.test.js +22 -22
  96. package/dist/lib/cli/evalJudge.d.ts +1 -1
  97. package/dist/lib/cli/evalJudge.js +24 -24
  98. package/dist/lib/cli/evalJudge.test.js +17 -17
  99. package/dist/lib/cli/interrupts.js +2 -2
  100. package/dist/lib/cli/interrupts.test.js +9 -9
  101. package/dist/lib/cli/policy.js +11 -11
  102. package/dist/lib/cli/runAgencyAgent.js +5 -1
  103. package/dist/lib/cli/runAgencyAgent.test.js +6 -3
  104. package/dist/lib/cli/serve.js +8 -8
  105. package/dist/lib/cli/util.d.ts +45 -1
  106. package/dist/lib/cli/util.js +31 -20
  107. package/dist/lib/cli/util.test.d.ts +1 -0
  108. package/dist/lib/cli/util.test.js +19 -0
  109. package/dist/lib/compilationUnit.d.ts +4 -4
  110. package/dist/lib/compilationUnit.js +13 -11
  111. package/dist/lib/compiler/compileClosure.d.ts +1 -1
  112. package/dist/lib/compiler/compileClosure.js +12 -5
  113. package/dist/lib/config.d.ts +30 -0
  114. package/dist/lib/config.js +11 -0
  115. package/dist/lib/eval/extract.d.ts +9 -0
  116. package/dist/lib/eval/extract.js +24 -7
  117. package/dist/lib/eval/extract.test.js +68 -28
  118. package/dist/lib/eval/ids.d.ts +1 -1
  119. package/dist/lib/eval/ids.js +2 -2
  120. package/dist/lib/eval/judge/pairwise.d.ts +3 -3
  121. package/dist/lib/eval/judge/pairwise.js +8 -8
  122. package/dist/lib/eval/judge/pairwise.test.js +6 -6
  123. package/dist/lib/eval/judge/suite.d.ts +8 -8
  124. package/dist/lib/eval/judge/suite.js +42 -41
  125. package/dist/lib/eval/judge/suite.test.js +37 -37
  126. package/dist/lib/eval/judge/types.d.ts +6 -5
  127. package/dist/lib/eval/loadInputs.d.ts +11 -0
  128. package/dist/lib/eval/loadInputs.js +97 -0
  129. package/dist/lib/eval/loadInputs.test.d.ts +1 -0
  130. package/dist/lib/eval/loadInputs.test.js +79 -0
  131. package/dist/lib/eval/readRun.d.ts +5 -5
  132. package/dist/lib/eval/readRun.js +12 -12
  133. package/dist/lib/eval/readRun.test.js +37 -37
  134. package/dist/lib/eval/runArtifacts.d.ts +18 -18
  135. package/dist/lib/eval/runArtifacts.js +40 -39
  136. package/dist/lib/eval/runArtifacts.test.js +29 -29
  137. package/dist/lib/eval/{runEvalTask.d.ts → runEvalInput.d.ts} +13 -13
  138. package/dist/lib/eval/{runEvalTask.js → runEvalInput.js} +15 -14
  139. package/dist/lib/eval/runTypes.d.ts +22 -8
  140. package/dist/lib/eval/statelogParser.d.ts +1 -1
  141. package/dist/lib/eval/statelogParser.js +2 -2
  142. package/dist/lib/eval/statelogParser.test.js +2 -2
  143. package/dist/lib/eval/types.d.ts +5 -5
  144. package/dist/lib/importPaths.d.ts +5 -0
  145. package/dist/lib/importPaths.js +7 -0
  146. package/dist/lib/ir/builders.d.ts +1 -1
  147. package/dist/lib/ir/builders.js +2 -2
  148. package/dist/lib/ir/prettyPrint.js +9 -0
  149. package/dist/lib/ir/prettyPrint.test.js +11 -0
  150. package/dist/lib/ir/tsIR.d.ts +5 -0
  151. package/dist/lib/logsViewer/summary.js +12 -10
  152. package/dist/lib/lsp/builtinHover.js +2 -2
  153. package/dist/lib/lsp/diagnostics.js +2 -2
  154. package/dist/lib/lsp/semantics.d.ts +3 -3
  155. package/dist/lib/lsp/semantics.js +20 -20
  156. package/dist/lib/optimize/artifacts.d.ts +1 -1
  157. package/dist/lib/optimize/artifacts.js +1 -1
  158. package/dist/lib/optimize/artifacts.test.js +3 -3
  159. package/dist/lib/optimize/baseOptimizer.d.ts +109 -0
  160. package/dist/lib/optimize/baseOptimizer.js +217 -0
  161. package/dist/lib/optimize/baseOptimizer.test.d.ts +1 -0
  162. package/dist/lib/optimize/baseOptimizer.test.js +180 -0
  163. package/dist/lib/optimize/candidatePool.d.ts +17 -0
  164. package/dist/lib/optimize/candidatePool.js +20 -0
  165. package/dist/lib/optimize/candidatePool.test.d.ts +1 -0
  166. package/dist/lib/optimize/candidatePool.test.js +25 -0
  167. package/dist/lib/optimize/evalCache.d.ts +11 -0
  168. package/dist/lib/optimize/evalCache.js +16 -0
  169. package/dist/lib/optimize/evalCache.test.d.ts +1 -0
  170. package/dist/lib/optimize/evalCache.test.js +28 -0
  171. package/dist/lib/optimize/gepaReflect.d.ts +9 -0
  172. package/dist/lib/optimize/gepaReflect.js +9 -0
  173. package/dist/lib/optimize/gepaReflect.test.d.ts +1 -0
  174. package/dist/lib/optimize/gepaReflect.test.js +20 -0
  175. package/dist/lib/optimize/goalJudgeFile.d.ts +12 -0
  176. package/dist/lib/optimize/goalJudgeFile.js +17 -0
  177. package/dist/lib/optimize/goalJudgeFile.test.d.ts +1 -0
  178. package/dist/lib/optimize/goalJudgeFile.test.js +18 -0
  179. package/dist/lib/optimize/gradeBreakdown.d.ts +22 -0
  180. package/dist/lib/optimize/gradeBreakdown.js +20 -0
  181. package/dist/lib/optimize/gradeBreakdown.test.d.ts +1 -0
  182. package/dist/lib/optimize/gradeBreakdown.test.js +31 -0
  183. package/dist/lib/optimize/grading/agencyRunner.d.ts +31 -0
  184. package/dist/lib/optimize/grading/agencyRunner.js +46 -0
  185. package/dist/lib/optimize/grading/agencyRunner.test.d.ts +1 -0
  186. package/dist/lib/optimize/grading/agencyRunner.test.js +19 -0
  187. package/dist/lib/optimize/grading/aggregate.d.ts +10 -0
  188. package/dist/lib/optimize/grading/aggregate.js +23 -0
  189. package/dist/lib/optimize/grading/aggregate.test.d.ts +1 -0
  190. package/dist/lib/optimize/grading/aggregate.test.js +33 -0
  191. package/dist/lib/optimize/grading/baseGrader.d.ts +26 -0
  192. package/dist/lib/optimize/grading/baseGrader.js +52 -0
  193. package/dist/lib/optimize/grading/baseGrader.test.d.ts +1 -0
  194. package/dist/lib/optimize/grading/baseGrader.test.js +63 -0
  195. package/dist/lib/optimize/grading/functionGrader.d.ts +32 -0
  196. package/dist/lib/optimize/grading/functionGrader.js +63 -0
  197. package/dist/lib/optimize/grading/functionGrader.test.d.ts +1 -0
  198. package/dist/lib/optimize/grading/functionGrader.test.js +49 -0
  199. package/dist/lib/optimize/grading/getPath.d.ts +8 -0
  200. package/dist/lib/optimize/grading/getPath.js +26 -0
  201. package/dist/lib/optimize/grading/getPath.test.d.ts +1 -0
  202. package/dist/lib/optimize/grading/getPath.test.js +29 -0
  203. package/dist/lib/optimize/grading/grade.d.ts +7 -0
  204. package/dist/lib/optimize/grading/grade.js +10 -0
  205. package/dist/lib/optimize/grading/grade.test.d.ts +1 -0
  206. package/dist/lib/optimize/grading/grade.test.js +15 -0
  207. package/dist/lib/optimize/grading/graders/builtinGraders.d.ts +34 -0
  208. package/dist/lib/optimize/grading/graders/builtinGraders.js +104 -0
  209. package/dist/lib/optimize/grading/graders/builtinGraders.test.d.ts +1 -0
  210. package/dist/lib/optimize/grading/graders/builtinGraders.test.js +77 -0
  211. package/dist/lib/optimize/grading/graders/humanGrader.d.ts +36 -0
  212. package/dist/lib/optimize/grading/graders/humanGrader.js +75 -0
  213. package/dist/lib/optimize/grading/graders/humanGrader.test.d.ts +1 -0
  214. package/dist/lib/optimize/grading/graders/humanGrader.test.js +70 -0
  215. package/dist/lib/optimize/grading/graders/llmJudge.d.ts +17 -0
  216. package/dist/lib/optimize/grading/graders/llmJudge.js +36 -0
  217. package/dist/lib/optimize/grading/graders/llmJudge.test.d.ts +1 -0
  218. package/dist/lib/optimize/grading/graders/llmJudge.test.js +47 -0
  219. package/dist/lib/optimize/grading/scorecard.d.ts +29 -0
  220. package/dist/lib/optimize/grading/scorecard.js +37 -0
  221. package/dist/lib/optimize/grading/scorecard.test.d.ts +1 -0
  222. package/dist/lib/optimize/grading/scorecard.test.js +105 -0
  223. package/dist/lib/optimize/grading/types.d.ts +51 -0
  224. package/dist/lib/optimize/grading/types.js +1 -0
  225. package/dist/lib/optimize/gradingModule.d.ts +10 -0
  226. package/dist/lib/optimize/gradingModule.js +47 -0
  227. package/dist/lib/optimize/gradingModule.test.d.ts +1 -0
  228. package/dist/lib/optimize/gradingModule.test.js +40 -0
  229. package/dist/lib/optimize/inputs.d.ts +2 -0
  230. package/dist/lib/optimize/inputs.js +9 -0
  231. package/dist/lib/optimize/inputs.test.d.ts +1 -0
  232. package/dist/lib/optimize/inputs.test.js +17 -0
  233. package/dist/lib/optimize/loop.d.ts +2 -2
  234. package/dist/lib/optimize/loop.js +38 -35
  235. package/dist/lib/optimize/loop.test.js +11 -11
  236. package/dist/lib/optimize/mutator.d.ts +28 -4
  237. package/dist/lib/optimize/mutator.js +19 -13
  238. package/dist/lib/optimize/mutator.test.js +25 -12
  239. package/dist/lib/optimize/optimizer.d.ts +30 -0
  240. package/dist/lib/optimize/optimizer.js +1 -0
  241. package/dist/lib/optimize/optimizerModule.d.ts +9 -0
  242. package/dist/lib/optimize/optimizerModule.js +47 -0
  243. package/dist/lib/optimize/optimizerModule.test.d.ts +1 -0
  244. package/dist/lib/optimize/optimizerModule.test.js +30 -0
  245. package/dist/lib/optimize/optimizers/example.d.ts +48 -0
  246. package/dist/lib/optimize/optimizers/example.js +82 -0
  247. package/dist/lib/optimize/optimizers/example.test.d.ts +1 -0
  248. package/dist/lib/optimize/optimizers/example.test.js +67 -0
  249. package/dist/lib/optimize/optimizers/gepa.d.ts +37 -0
  250. package/dist/lib/optimize/optimizers/gepa.js +139 -0
  251. package/dist/lib/optimize/optimizers/gepa.test.d.ts +1 -0
  252. package/dist/lib/optimize/optimizers/gepa.test.js +131 -0
  253. package/dist/lib/optimize/optimizers/greedyReflective.d.ts +35 -0
  254. package/dist/lib/optimize/optimizers/greedyReflective.js +132 -0
  255. package/dist/lib/optimize/optimizers/greedyReflective.test.d.ts +1 -0
  256. package/dist/lib/optimize/optimizers/greedyReflective.test.js +134 -0
  257. package/dist/lib/optimize/pareto.d.ts +13 -0
  258. package/dist/lib/optimize/pareto.js +17 -0
  259. package/dist/lib/optimize/pareto.test.d.ts +1 -0
  260. package/dist/lib/optimize/pareto.test.js +28 -0
  261. package/dist/lib/optimize/public.d.ts +24 -0
  262. package/dist/lib/optimize/public.js +18 -0
  263. package/dist/lib/optimize/public.test.d.ts +1 -0
  264. package/dist/lib/optimize/public.test.js +22 -0
  265. package/dist/lib/optimize/reflectionFeedback.d.ts +9 -0
  266. package/dist/lib/optimize/reflectionFeedback.js +71 -0
  267. package/dist/lib/optimize/reflectionFeedback.test.d.ts +1 -0
  268. package/dist/lib/optimize/reflectionFeedback.test.js +58 -0
  269. package/dist/lib/optimize/registry.d.ts +5 -0
  270. package/dist/lib/optimize/registry.js +24 -0
  271. package/dist/lib/optimize/registry.test.d.ts +1 -0
  272. package/dist/lib/optimize/registry.test.js +38 -0
  273. package/dist/lib/optimize/report.d.ts +14 -0
  274. package/dist/lib/optimize/report.js +58 -0
  275. package/dist/lib/optimize/report.test.d.ts +1 -0
  276. package/dist/lib/optimize/report.test.js +32 -0
  277. package/dist/lib/optimize/reporter.d.ts +56 -6
  278. package/dist/lib/optimize/reporter.js +75 -3
  279. package/dist/lib/optimize/reporter.test.js +70 -11
  280. package/dist/lib/optimize/rng.d.ts +8 -0
  281. package/dist/lib/optimize/rng.js +34 -0
  282. package/dist/lib/optimize/rng.test.d.ts +1 -0
  283. package/dist/lib/optimize/rng.test.js +25 -0
  284. package/dist/lib/optimize/sourceMutator.d.ts +2 -0
  285. package/dist/lib/optimize/sourceMutator.js +16 -2
  286. package/dist/lib/optimize/sourceMutator.test.js +16 -2
  287. package/dist/lib/optimize/targets.d.ts +2 -0
  288. package/dist/lib/optimize/targets.js +4 -0
  289. package/dist/lib/optimize/types.d.ts +13 -3
  290. package/dist/lib/optimize/validationSplit.d.ts +8 -0
  291. package/dist/lib/optimize/validationSplit.js +14 -0
  292. package/dist/lib/optimize/validationSplit.test.d.ts +1 -0
  293. package/dist/lib/optimize/validationSplit.test.js +25 -0
  294. package/dist/lib/optimize/workspace.d.ts +42 -0
  295. package/dist/lib/optimize/workspace.js +100 -0
  296. package/dist/lib/optimize/workspace.test.d.ts +1 -0
  297. package/dist/lib/optimize/workspace.test.js +103 -0
  298. package/dist/lib/parser.js +2 -2
  299. package/dist/lib/parsers/effectSet.test.d.ts +1 -0
  300. package/dist/lib/parsers/effectSet.test.js +96 -0
  301. package/dist/lib/parsers/handleBlock.test.js +20 -1
  302. package/dist/lib/parsers/interruptStatement.test.js +29 -8
  303. package/dist/lib/parsers/parsers.d.ts +4 -0
  304. package/dist/lib/parsers/parsers.js +154 -14
  305. package/dist/lib/parsers/raiseStatement.test.d.ts +1 -0
  306. package/dist/lib/parsers/raiseStatement.test.js +64 -0
  307. package/dist/lib/parsers/raisesClause.test.d.ts +1 -0
  308. package/dist/lib/parsers/raisesClause.test.js +87 -0
  309. package/dist/lib/preprocessors/resolveReExports.js +39 -2
  310. package/dist/lib/preprocessors/resolveReExports.test.js +117 -0
  311. package/dist/lib/preprocessors/typescriptPreprocessor.d.ts +16 -0
  312. package/dist/lib/preprocessors/typescriptPreprocessor.js +127 -52
  313. package/dist/lib/runtime/agencyFunction.d.ts +14 -0
  314. package/dist/lib/runtime/agencyFunction.js +28 -0
  315. package/dist/lib/runtime/agencyFunction.test.js +49 -0
  316. package/dist/lib/runtime/agencyInterrupt.d.ts +3 -3
  317. package/dist/lib/runtime/agencyInterrupt.js +2 -2
  318. package/dist/lib/runtime/agencyInterrupt.test.js +18 -18
  319. package/dist/lib/runtime/call.js +13 -0
  320. package/dist/lib/runtime/configOverrides.d.ts +1 -0
  321. package/dist/lib/runtime/deterministicClient.d.ts +1 -1
  322. package/dist/lib/runtime/deterministicClient.test.js +9 -9
  323. package/dist/lib/runtime/errors.d.ts +3 -3
  324. package/dist/lib/runtime/errors.js +12 -5
  325. package/dist/lib/runtime/interrupts.d.ts +3 -3
  326. package/dist/lib/runtime/interrupts.js +12 -12
  327. package/dist/lib/runtime/interrupts.test.js +3 -3
  328. package/dist/lib/runtime/ipc.configOverrides.test.js +4 -4
  329. package/dist/lib/runtime/ipc.d.ts +2 -2
  330. package/dist/lib/runtime/ipc.js +3 -3
  331. package/dist/lib/runtime/isDebugger.test.js +3 -3
  332. package/dist/lib/runtime/node.js +3 -0
  333. package/dist/lib/runtime/policy.d.ts +1 -1
  334. package/dist/lib/runtime/policy.js +1 -1
  335. package/dist/lib/runtime/policy.test.js +22 -22
  336. package/dist/lib/runtime/prompt.d.ts +31 -0
  337. package/dist/lib/runtime/prompt.js +183 -15
  338. package/dist/lib/runtime/prompt.test.d.ts +1 -0
  339. package/dist/lib/runtime/prompt.test.js +79 -0
  340. package/dist/lib/runtime/runBatch.js +17 -0
  341. package/dist/lib/runtime/runBatch.test.js +1 -1
  342. package/dist/lib/runtime/state/context.d.ts +15 -0
  343. package/dist/lib/runtime/state/context.js +60 -18
  344. package/dist/lib/runtime/state/globalStore.js +3 -0
  345. package/dist/lib/runtime/state/stateStack.d.ts +13 -0
  346. package/dist/lib/runtime/state/stateStack.js +30 -0
  347. package/dist/lib/runtime/types.d.ts +1 -1
  348. package/dist/lib/runtime/utils.d.ts +1 -0
  349. package/dist/lib/runtime/utils.js +6 -1
  350. package/dist/lib/serve/discovery.d.ts +2 -2
  351. package/dist/lib/serve/discovery.js +7 -7
  352. package/dist/lib/serve/discovery.test.js +9 -9
  353. package/dist/lib/serve/http/adapter.js +2 -2
  354. package/dist/lib/serve/http/adapter.test.js +8 -8
  355. package/dist/lib/serve/mcp/adapter.js +16 -16
  356. package/dist/lib/serve/mcp/adapter.test.js +15 -15
  357. package/dist/lib/serve/mcp/httpTransport.test.js +1 -1
  358. package/dist/lib/serve/mcp/interruptLoop.test.js +2 -2
  359. package/dist/lib/serve/types.d.ts +3 -3
  360. package/dist/lib/statelogClient.d.ts +19 -5
  361. package/dist/lib/statelogClient.js +32 -10
  362. package/dist/lib/statelogClient.test.js +48 -0
  363. package/dist/lib/stdlib/agencyEval.d.ts +18 -18
  364. package/dist/lib/stdlib/agencyEval.js +29 -29
  365. package/dist/lib/stdlib/cli.d.ts +46 -0
  366. package/dist/lib/stdlib/cli.js +275 -19
  367. package/dist/lib/stdlib/fs.d.ts +5 -8
  368. package/dist/lib/stdlib/fs.js +28 -18
  369. package/dist/lib/stdlib/layout/axis.d.ts +3 -0
  370. package/dist/lib/stdlib/layout/axis.js +25 -2
  371. package/dist/lib/stdlib/layout/barchart.d.ts +33 -0
  372. package/dist/lib/stdlib/layout/barchart.js +217 -0
  373. package/dist/lib/stdlib/layout/box.d.ts +2 -0
  374. package/dist/lib/stdlib/layout/box.js +12 -1
  375. package/dist/lib/stdlib/layout/nodes.d.ts +7 -1
  376. package/dist/lib/stdlib/layout/nodes.js +33 -2
  377. package/dist/lib/stdlib/layout/render.d.ts +4 -5
  378. package/dist/lib/stdlib/layout/render.js +60 -124
  379. package/dist/lib/stdlib/layout/sizing.d.ts +15 -0
  380. package/dist/lib/stdlib/layout/sizing.js +38 -0
  381. package/dist/lib/stdlib/layout/table.d.ts +2 -0
  382. package/dist/lib/stdlib/layout/table.js +7 -0
  383. package/dist/lib/stdlib/layout.d.ts +12 -1
  384. package/dist/lib/stdlib/layout.js +11 -7
  385. package/dist/lib/stdlib/llm.d.ts +29 -0
  386. package/dist/lib/stdlib/llm.js +29 -0
  387. package/dist/lib/stdlib/memory.d.ts +1 -0
  388. package/dist/lib/stdlib/memory.js +5 -0
  389. package/dist/lib/stdlib/shell.d.ts +1 -1
  390. package/dist/lib/stdlib/shell.js +38 -5
  391. package/dist/lib/stdlib/statelog.d.ts +2 -2
  392. package/dist/lib/stdlib/statelog.js +5 -5
  393. package/dist/lib/stdlib/syntax-themes.d.ts +17 -0
  394. package/dist/lib/stdlib/syntax-themes.js +423 -0
  395. package/dist/lib/stdlib/syntax.d.ts +13 -1
  396. package/dist/lib/stdlib/syntax.js +81 -69
  397. package/dist/lib/stdlib/ui.d.ts +1 -1
  398. package/dist/lib/stdlib/ui.js +27 -2
  399. package/dist/lib/symbolTable.d.ts +8 -5
  400. package/dist/lib/symbolTable.js +12 -8
  401. package/dist/lib/symbolTable.test.js +6 -6
  402. package/dist/lib/templates/backends/typescriptGenerator/blockSetup.d.ts +2 -1
  403. package/dist/lib/templates/backends/typescriptGenerator/blockSetup.js +1 -0
  404. package/dist/lib/templates/backends/typescriptGenerator/forkBlockSetup.d.ts +2 -1
  405. package/dist/lib/templates/backends/typescriptGenerator/forkBlockSetup.js +1 -0
  406. package/dist/lib/templates/backends/typescriptGenerator/functionCatchFailure.d.ts +1 -1
  407. package/dist/lib/templates/backends/typescriptGenerator/functionCatchFailure.js +9 -0
  408. package/dist/lib/templates/backends/typescriptGenerator/imports.d.ts +1 -1
  409. package/dist/lib/templates/backends/typescriptGenerator/imports.js +1 -0
  410. package/dist/lib/templates/backends/typescriptGenerator/interruptAssignment.d.ts +2 -2
  411. package/dist/lib/templates/backends/typescriptGenerator/interruptAssignment.js +1 -1
  412. package/dist/lib/templates/backends/typescriptGenerator/interruptReturn.d.ts +2 -2
  413. package/dist/lib/templates/backends/typescriptGenerator/interruptReturn.js +1 -1
  414. package/dist/lib/templates/cli/optimizeReport.d.ts +9 -0
  415. package/dist/lib/templates/cli/optimizeReport.js +18 -0
  416. package/dist/lib/templates/cli/standaloneHttp.d.ts +2 -2
  417. package/dist/lib/templates/cli/standaloneHttp.js +2 -2
  418. package/dist/lib/templates/cli/standaloneMcp.d.ts +2 -2
  419. package/dist/lib/templates/cli/standaloneMcp.js +2 -2
  420. package/dist/lib/templates/cli/standaloneMcpHttp.d.ts +2 -2
  421. package/dist/lib/templates/cli/standaloneMcpHttp.js +2 -2
  422. package/dist/lib/typeChecker/agencyFunctionMethods.test.d.ts +1 -0
  423. package/dist/lib/typeChecker/agencyFunctionMethods.test.js +91 -0
  424. package/dist/lib/typeChecker/builtins.d.ts +17 -0
  425. package/dist/lib/typeChecker/builtins.js +36 -0
  426. package/dist/lib/typeChecker/effectSetImport.test.d.ts +1 -0
  427. package/dist/lib/typeChecker/effectSetImport.test.js +46 -0
  428. package/dist/lib/typeChecker/effectSets.d.ts +26 -0
  429. package/dist/lib/typeChecker/effectSets.js +64 -0
  430. package/dist/lib/typeChecker/effectSets.test.d.ts +1 -0
  431. package/dist/lib/typeChecker/effectSets.test.js +48 -0
  432. package/dist/lib/typeChecker/index.d.ts +1 -1
  433. package/dist/lib/typeChecker/index.js +12 -8
  434. package/dist/lib/typeChecker/interruptAnalysis.d.ts +6 -6
  435. package/dist/lib/typeChecker/interruptAnalysis.js +20 -20
  436. package/dist/lib/typeChecker/interruptAnalysis.test.js +16 -16
  437. package/dist/lib/typeChecker/interruptCallGraph.test.js +2 -2
  438. package/dist/lib/typeChecker/raisesDiagnostic.d.ts +18 -0
  439. package/dist/lib/typeChecker/raisesDiagnostic.js +58 -0
  440. package/dist/lib/typeChecker/raisesDiagnostic.test.d.ts +1 -0
  441. package/dist/lib/typeChecker/raisesDiagnostic.test.js +91 -0
  442. package/dist/lib/typeChecker/synthesizer.js +8 -29
  443. package/dist/lib/typeChecker/testUtils.d.ts +13 -0
  444. package/dist/lib/typeChecker/testUtils.js +37 -0
  445. package/dist/lib/typeChecker/types.d.ts +3 -3
  446. package/dist/lib/types/function.d.ts +6 -0
  447. package/dist/lib/types/graphNode.d.ts +3 -0
  448. package/dist/lib/types/handleBlock.d.ts +1 -0
  449. package/dist/lib/types/interruptStatement.d.ts +4 -1
  450. package/dist/lib/types/literals.d.ts +3 -0
  451. package/dist/lib/types/typeHints.d.ts +13 -0
  452. package/dist/lib/types.d.ts +3 -0
  453. package/dist/lib/utils/diff.d.ts +37 -5
  454. package/dist/lib/utils/diff.js +288 -24
  455. package/dist/lib/utils/diff.test.js +157 -19
  456. package/dist/lib/utils/node.js +9 -1
  457. package/dist/lib/utils/termcolors.d.ts +13 -0
  458. package/dist/lib/utils/termcolors.js +22 -0
  459. package/dist/scripts/agency.js +54 -33
  460. package/dist/scripts/agency.test.js +2 -2
  461. package/package.json +9 -2
  462. package/stdlib/agency/eval.agency +57 -56
  463. package/stdlib/agency/eval.js +88 -70
  464. package/stdlib/agency.js +50 -0
  465. package/stdlib/agent.js +29 -0
  466. package/stdlib/args.js +5 -0
  467. package/stdlib/array.js +41 -0
  468. package/stdlib/browser.js +5 -0
  469. package/stdlib/calendar.js +20 -0
  470. package/stdlib/chart.agency +157 -0
  471. package/stdlib/chart.js +982 -0
  472. package/stdlib/cli.agency +6 -0
  473. package/stdlib/cli.js +30 -4
  474. package/stdlib/clipboard.js +8 -0
  475. package/stdlib/concurrency.js +5 -0
  476. package/stdlib/date.js +47 -0
  477. package/stdlib/email.js +11 -0
  478. package/stdlib/fs.agency +35 -107
  479. package/stdlib/fs.js +253 -449
  480. package/stdlib/http.js +11 -0
  481. package/stdlib/imessage.js +5 -0
  482. package/stdlib/index.agency +64 -2
  483. package/stdlib/index.js +562 -28
  484. package/stdlib/keyring.js +14 -0
  485. package/stdlib/layout.agency +2 -228
  486. package/stdlib/layout.js +57 -1226
  487. package/stdlib/llm.agency +91 -0
  488. package/stdlib/llm.js +787 -0
  489. package/stdlib/markdown.js +14 -0
  490. package/stdlib/math.js +14 -0
  491. package/stdlib/memory.agency +19 -2
  492. package/stdlib/memory.js +151 -4
  493. package/stdlib/oauth.js +14 -0
  494. package/stdlib/object.js +17 -0
  495. package/stdlib/path.js +23 -0
  496. package/stdlib/policy.agency +180 -73
  497. package/stdlib/policy.js +649 -77
  498. package/stdlib/schemas.js +1 -0
  499. package/stdlib/search.js +5 -0
  500. package/stdlib/shell.agency +44 -2
  501. package/stdlib/shell.js +330 -61
  502. package/stdlib/skills.agency +50 -6
  503. package/stdlib/skills.js +223 -28
  504. package/stdlib/sms.js +5 -0
  505. package/stdlib/speech.js +11 -0
  506. package/stdlib/statelog.agency +15 -15
  507. package/stdlib/statelog.js +57 -37
  508. package/stdlib/strategy.js +19 -0
  509. package/stdlib/syntax.agency +175 -2
  510. package/stdlib/syntax.js +666 -8
  511. package/stdlib/system.js +35 -0
  512. package/stdlib/table.agency +202 -0
  513. package/stdlib/table.js +1427 -0
  514. package/stdlib/thread.js +20 -0
  515. package/stdlib/threads.js +17 -0
  516. package/stdlib/types.js +1 -0
  517. package/stdlib/ui.agency +20 -1
  518. package/stdlib/ui.js +243 -18
  519. package/stdlib/validators.js +35 -0
  520. package/stdlib/weather.js +11 -0
  521. package/stdlib/wikipedia.js +11 -0
  522. package/dist/lib/agents/agency-agent/subagents/oneShot.agency +0 -49
  523. package/dist/lib/eval/loadTasks.d.ts +0 -6
  524. package/dist/lib/eval/loadTasks.js +0 -81
  525. package/dist/lib/eval/loadTasks.test.js +0 -60
  526. package/dist/lib/optimize/tasks.d.ts +0 -2
  527. package/dist/lib/optimize/tasks.js +0 -9
  528. package/dist/lib/optimize/tasks.test.js +0 -17
  529. /package/dist/lib/agents/{judge.agency → eval/judge.agency} +0 -0
  530. /package/dist/lib/agents/{judgePairwise.agency → eval/judgePairwise.agency} +0 -0
  531. /package/dist/lib/{eval/loadTasks.test.d.ts → backends/anthropicApiKey.codegen.test.d.ts} +0 -0
  532. /package/dist/lib/{optimize/tasks.test.d.ts → backends/maxToolResultChars.codegen.test.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { getVersion } from "std::agency"
2
- import { route } from "std::agent"
3
2
  import { parseArgs } from "std::args"
4
3
  import { clearMessages, pushMessage, repl, clearScreen } from "std::cli"
5
4
  import { today } from "std::date"
5
+ import { setAgentCwd } from "std::index"
6
6
  import { box, render } from "std::layout"
7
7
  import { setMemoryId } from "std::memory"
8
8
  import {
@@ -25,15 +25,11 @@ import {
25
25
  recommendedAutoApprovePolicy,
26
26
  } from "./lib/defaultPolicy.agency"
27
27
  import { truncate, formatArgs, formatToolResponse } from "./lib/utils.agency"
28
- import { codeSysPrompt, codeTools, codeAgent } from "./subagents/code.agency"
28
+ import { configureModels } from "./shared.agency"
29
+ import { codeAgent } from "./subagents/code.agency"
29
30
  import { explorerAgent } from "./subagents/explorer.agency"
30
- import { oneShotAgent } from "./subagents/oneShot.agency"
31
31
  import { oracleAgent } from "./subagents/oracle.agency"
32
- import {
33
- researchSysPrompt,
34
- researchTools,
35
- researchAgent,
36
- } from "./subagents/research.agency"
32
+ import { researchAgent } from "./subagents/research.agency"
37
33
  import { reviewAgent } from "./subagents/review.agency"
38
34
 
39
35
 
@@ -65,8 +61,8 @@ import { reviewAgent } from "./subagents/review.agency"
65
61
  *
66
62
  * This file's responsibilities collapse to:
67
63
  * 1. Per-turn callback (`_runTurn`) wiring the user message into
68
- * route() and printing the reply into the scroll output.
69
- * 2. Per-kind ALWAYS_FIELDS map for the policy handler's
64
+ * `mainAgent` and printing the reply into the scroll output.
65
+ * 2. Per-effect ALWAYS_FIELDS map for the policy handler's
70
66
  * "approve-always-here" option.
71
67
  * 3. Wire the two specialists into one `RouterConfig`.
72
68
  *
@@ -91,17 +87,28 @@ let VERBOSE: boolean = false
91
87
  // scroll-output writes when stdout is destined for a Unix pipe.
92
88
  let _isInteractive: boolean = true
93
89
 
90
+ // Live tool-call tracing. Always shown in the interactive REPL; in
91
+ // one-shot mode it's suppressed so piped output is just the reply,
92
+ // unless the user opts in with `--verbose` / `--debug` (AGENT_DEBUG).
93
+ def _showTraces(): boolean {
94
+ return _isInteractive || VERBOSE || AGENT_DEBUG
95
+ }
96
+
94
97
  callback("onToolCallStart") as data {
95
- pushMessage(color.yellow("⏺ ${data.toolName}(${formatArgs(data.args)})"))
98
+ if (_showTraces()) {
99
+ pushMessage(color.yellow("⏺ ${data.toolName}(${formatArgs(data.args)})"))
100
+ }
96
101
  }
97
102
 
98
103
  callback("onToolCallEnd") as data {
99
- if (data.result is success(_result)) {
100
- pushMessage(color.dim.green("${formatToolResponse(_result)}"))
101
- } else if (data.result is failure(_error)) {
102
- pushMessage(color.red(" ⎿ Error: ${_error}"))
103
- } else {
104
- pushMessage(color.dim("${formatToolResponse(data.result)}"))
104
+ if (_showTraces()) {
105
+ if (data.result is success(_result)) {
106
+ pushMessage(color.dim.green("${formatToolResponse(_result)}"))
107
+ } else if (data.result is failure(_error)) {
108
+ pushMessage(color.red(" ⎿ Error: ${_error}"))
109
+ } else {
110
+ pushMessage(color.dim("${formatToolResponse(data.result)}"))
111
+ }
105
112
  }
106
113
  }
107
114
 
@@ -178,6 +185,7 @@ def builtinPalette(): Record<string, string> {
178
185
  "/exit": "Exit the agent",
179
186
  "/clear": "Clear the conversation transcript",
180
187
  "/cost": "Show cumulative LLM cost and tokens",
188
+ "/paste": "Multi-line paste mode (Ctrl+D submits, Ctrl+C cancels)",
181
189
  "/help": "Show available slash commands"
182
190
  }
183
191
  }
@@ -220,7 +228,7 @@ def _runTurn(msg: string): boolean {
220
228
  return true
221
229
  }
222
230
  if (trimmed == "/help") {
223
- pushMessage("Commands: /exit, /clear, /cost, /help")
231
+ pushMessage("Commands: /exit, /clear, /cost, /paste, /help")
224
232
  return true
225
233
  }
226
234
  if (trimmed == "/cost") {
@@ -228,10 +236,9 @@ def _runTurn(msg: string): boolean {
228
236
  pushMessage("Tokens: ${getTokens()}")
229
237
  return true
230
238
  }
231
- // Expand `/foo args` to the rendered command body. Unknown `/foo`
232
- // inputs fall through unchanged matches Claude Code.
233
- const prompt = expandSlash(msg, projectCommands)
234
- const reply = mainAgent(prompt)
239
+ // Hand the message to the agent. `agentReply` does the slash-command
240
+ // expansion and the actual agent work; the REPL just renders the reply.
241
+ const reply = agentReply(msg)
235
242
  if (reply != "" && reply != null && reply != undefined) {
236
243
  pushMessage(highlight("${reply}\n", language: "markdown"))
237
244
  } else {
@@ -241,6 +248,12 @@ def _runTurn(msg: string): boolean {
241
248
  }
242
249
 
243
250
  let first = true
251
+
252
+ // Valid `--agent` targets. Empty / "main" routes through the coordinator;
253
+ // the rest route the starting prompt's first turn directly to that
254
+ // subagent. Used to validate the flag and to dispatch in `agentReplyVia`.
255
+ static const START_AGENTS = ["main", "code", "research", "oracle", "explorer", "review"]
256
+
244
257
  static const mainAgentSystemPrompt = """
245
258
  You are the top-level coordinator of an Agency-language assistant. You
246
259
  receive every user message and decide how to respond.
@@ -386,6 +399,15 @@ parse → SymbolTable.build → preprocess → TypeScriptBuilder → printTs
386
399
  Keep diagrams small. Skip them where prose or code is clearer —
387
400
  diagrams earn their space by showing **relationships** or **flow**.
388
401
 
402
+ ## Be proactive
403
+
404
+ When the user asks you to look at, debug, or change a file or some code,
405
+ **delegate to `codeAgent` to do it** — don't ask the user to paste a file
406
+ or describe code a subagent could read. The code agent has `read`, `glob`,
407
+ and `ls` and resolves relative paths against the user's working directory
408
+ automatically, so a bare filename like `foo.agency` is enough. Only ask
409
+ the user for information you genuinely cannot obtain through a subagent.
410
+
389
411
  ## Answer before action
390
412
 
391
413
  When the user asks a question, asks for an opinion, or asks how to
@@ -408,7 +430,10 @@ def mainAgent(prompt: string): string {
408
430
  thread(label: "main", summarize: true, session: "main") {
409
431
  setMemoryId("main")
410
432
  if (first) {
411
- systemMessage(mainAgentSystemPrompt)
433
+ // `_context` carries the per-run grounding (date, cwd, AGENTS.md),
434
+ // set by `setupSession`. Appending it to the system prompt is what
435
+ // actually gets that context to the LLM.
436
+ systemMessage(mainAgentSystemPrompt + _context)
412
437
  first = false
413
438
  }
414
439
  const result = llm(prompt, {
@@ -419,28 +444,39 @@ def mainAgent(prompt: string): string {
419
444
  return result
420
445
  }
421
446
 
422
- def routeAgent(prompt: string): string {
423
- const reply = route(
424
- {
425
- start: "code",
426
- agents: {
427
- code: {
428
- type: "agent",
429
- name: "code",
430
- agent: codeAgent
431
- },
432
- research: {
433
- type: "agent",
434
- name: "research",
435
- agent: researchAgent
436
- }
437
- },
438
- maxHops: 3,
439
- context: _context
440
- },
441
- prompt,
442
- )
443
- return reply
447
+ // Dispatch one turn. `target` empty (or "main") runs the coordinator
448
+ // `mainAgent`, which routes as usual; any subagent name routes the turn
449
+ // directly to that subagent. All subagents share `(userMsg, allowHandoff)`
450
+ // and the seed turn never hands off (allowHandoff: false). Used by both
451
+ // the one-shot path and the interactive seed turn.
452
+ export def agentReplyVia(target: string, userMsg: string): string {
453
+ const expanded = expandSlash(userMsg, projectCommands)
454
+ if (target == "code") {
455
+ return codeAgent(expanded, false)
456
+ }
457
+ if (target == "research") {
458
+ return researchAgent(expanded, false)
459
+ }
460
+ if (target == "oracle") {
461
+ return oracleAgent(expanded, false)
462
+ }
463
+ if (target == "explorer") {
464
+ return explorerAgent(expanded, false)
465
+ }
466
+ if (target == "review") {
467
+ return reviewAgent(expanded, false)
468
+ }
469
+ return mainAgent(expanded)
470
+ }
471
+
472
+ // The agent's core turn, decoupled from the terminal: expand any project
473
+ // slash command, then run the prompt through `mainAgent` and return the
474
+ // reply. The REPL (`main` / `_runTurn`) owns input, output, and built-in
475
+ // commands; everything the *agent* does for a user message lives here, so
476
+ // it can be driven and tested without a terminal or user input. See
477
+ // `tests/agentTurn.agency`.
478
+ export def agentReply(userMsg: string): string {
479
+ return agentReplyVia("", userMsg)
444
480
  }
445
481
 
446
482
  def roundedCost(): string {
@@ -461,9 +497,15 @@ def sample(arr: any[]): any {
461
497
 
462
498
  def printHeader() {
463
499
  const fig = sample(figs)
464
- const data = box(title: "Agency", padding: 1, borderColor: "cyan", titleColor: "cyan") as b {
500
+ const data = box(
501
+ title: "Agency",
502
+ padding: 1,
503
+ borderColor: "cyan",
504
+ titleColor: "cyan",
505
+ width: "full",
506
+ ) as b {
465
507
  b.row(gap: 1) as r {
466
- r.column() as left {
508
+ r.column(width: "66%") as left {
467
509
  left.text("Welcome to the Agency Agent!", bold: true)
468
510
  left.text("Ask me to write code, look up docs, or just chat.")
469
511
  left.text("All costs are estimates. Actual costs may be higher.", dim: true)
@@ -472,8 +514,8 @@ def printHeader() {
472
514
  left.text("/help for commands · /exit to quit", dim: true)
473
515
  }
474
516
  r.vline()
475
- r.column() as right {
476
- right.raw(fig)
517
+ r.column(width: "30%", align: "center") as right {
518
+ right.raw(fig, align: "center")
477
519
  }
478
520
  }
479
521
  }
@@ -501,6 +543,103 @@ def givePolicyChoice() {
501
543
  }
502
544
  }
503
545
 
546
+ // Shared session setup for both interactive and one-shot modes. Builds
547
+ // the per-run grounding context, loads (or initializes) the policy, and
548
+ // returns the installed CLI policy handler. `interactive` gates the
549
+ // first-run policy-choice prompt: one-shot has no user to answer it, so
550
+ // it falls back to the recommended default (reads/web auto-approved;
551
+ // writes still require approval, which a non-interactive run can't
552
+ // grant — those tasks block, which is the safe behavior).
553
+ def setupSession(interactive: boolean): any {
554
+ // Point every path-taking tool at the user's working directory so the
555
+ // agent's relative file/shell commands resolve against where the user
556
+ // launched it. The user (via the agent) can change this later with
557
+ // setAgentCwd.
558
+ setAgentCwd(cwd())
559
+
560
+ // Grounding: the LLM shouldn't have to ask where it is or what day it
561
+ // is. Project context: inline an AGENTS.md from the workspace root if
562
+ // present so the LLM follows the project's conventions.
563
+ const projectContext = loadAgentsMd(cwd()) with approve
564
+ _context = "\n\nCurrent date: ${today()}\nCurrent working directory: ${cwd()}${projectContext}"
565
+
566
+ const policy = parsePolicyFile(POLICY_PATH)
567
+ if (policy is failure(f)) {
568
+ if (f.status == "doesnt-exist") {
569
+ if (interactive) {
570
+ print(color.yellow("No existing policy found at ${POLICY_PATH}."))
571
+ setPolicy(POLICY_PATH, givePolicyChoice())
572
+ } else {
573
+ setPolicy(POLICY_PATH, recommendedAutoApprovePolicy)
574
+ }
575
+ } else {
576
+ print(color.red("Failed to load policy: ${JSON.stringify(f.error)}"))
577
+ process.exit(1)
578
+ }
579
+ } else {
580
+ setPolicy(POLICY_PATH, policy.value)
581
+ }
582
+ // Bind the handler to a local var so `with handler` parses (the
583
+ // `with` clause only accepts an identifier, not a call expression).
584
+ return cliPolicyHandler(file: POLICY_PATH, fields: ALWAYS_FIELDS)
585
+ }
586
+
587
+ // One-shot entry: run a single turn through the same `mainAgent` the
588
+ // REPL uses, with the same session setup and policy handler, and return
589
+ // the reply. Used for `agency agent -p "..."`, a positional query, or
590
+ // piped stdin. Slash commands are expanded so `-p /foo bar` works like
591
+ // typing it in the REPL; the loop-only built-ins (`/exit` etc.) are
592
+ // meaningless here and aren't checked.
593
+ def oneShotAgent(target: string, prompt: string): string {
594
+ _isInteractive = false
595
+ const handler = setupSession(false)
596
+ let reply: string = ""
597
+ handle {
598
+ reply = agentReplyVia(target, prompt)
599
+ } with (data) {
600
+ return handler(data)
601
+ }
602
+ return reply
603
+ }
604
+
605
+ // Render one seeded turn into the REPL scroll area: echo the auto-run
606
+ // prompt so the user sees what was asked, then push the agent's reply.
607
+ // Mirrors the reply-rendering half of `_runTurn`.
608
+ def _runSeedTurn(target: string, msg: string) {
609
+ pushMessage(color.dim("> ${msg}"))
610
+ const reply = agentReplyVia(target, msg)
611
+ if (reply != "" && reply != null && reply != undefined) {
612
+ pushMessage(highlight("${reply}\n", language: "markdown"))
613
+ } else {
614
+ pushMessage(color.red("No reply generated."))
615
+ }
616
+ }
617
+
618
+ // Start the interactive REPL. When `seedPrompt` is non-empty it is run as
619
+ // the first turn (routed via `seedTarget`) *inside* the handle block so
620
+ // its interrupts reach the policy `handler`; the user is then left at the
621
+ // prompt. `seedPrompt == ""` is the plain REPL with no seed. Subsequent
622
+ // turns always go through `_runTurn` (the coordinator) regardless of
623
+ // `seedTarget` — the target only kicks off the first turn.
624
+ def startInteractive(handler: any, seedTarget: string, seedPrompt: string) {
625
+ handle {
626
+ if (seedPrompt != "") {
627
+ _runSeedTurn(seedTarget, seedPrompt)
628
+ }
629
+ repl(
630
+ status: _buildStatus,
631
+ onSubmit: _runTurn,
632
+ prompt: "> ",
633
+ historyFile: HISTORY_PATH,
634
+ historyMax: 1000,
635
+ paletteCommands: mergedPalette(),
636
+ )
637
+ } with (data) {
638
+ return handler(data)
639
+ }
640
+ print(color.cyan("\nGoodbye!"))
641
+ }
642
+
504
643
  node main() {
505
644
  // Parse CLI flags first — `parseArgs` exits on --help / --version /
506
645
  // usage errors, before any handlers or the TUI are installed.
@@ -522,6 +661,31 @@ node main() {
522
661
  verbose: {
523
662
  type: "boolean",
524
663
  description: "Echo tool-call starts to stdout in non-interactive mode"
664
+ },
665
+ model: {
666
+ type: "string",
667
+ description: "Model for all LLM calls (overrides provider auto-detection)"
668
+ },
669
+ fastmodel: {
670
+ type: "string",
671
+ description: "Model for ordinary work (default: per detected provider)"
672
+ },
673
+ slowmodel: {
674
+ type: "string",
675
+ description: "Model for deep reasoning, e.g. the oracle/explorer subagents"
676
+ },
677
+ provider: {
678
+ type: "string",
679
+ description: "Force the LLM provider (use when a model name doesn't imply one)"
680
+ },
681
+ interactive: {
682
+ type: "boolean",
683
+ short: "i",
684
+ description: "Run the given prompt as the first turn of an interactive session, then hand over the REPL (instead of one-shot)"
685
+ },
686
+ agent: {
687
+ type: "string",
688
+ description: "Route the starting prompt to a named subagent: code, research, oracle, explorer, review (default: coordinator)"
525
689
  }
526
690
  }
527
691
  },
@@ -534,74 +698,85 @@ node main() {
534
698
  VERBOSE = true
535
699
  }
536
700
 
537
- setTitle("Agency Agent")
538
- clearScreen()
701
+ // Resolve which models to use. Explicit flags win; otherwise detect a
702
+ // provider from API-key env vars and use that provider's defaults. The
703
+ // fast model becomes the run-wide default via `setModel`; the slow
704
+ // model is read by the deep-reasoning subagents (oracle, explorer).
705
+ // Resolve + apply the fast/slow models. Absent string flags read as
706
+ // `undefined`, and agency's `== null` does not match `undefined`, so
707
+ // normalize via `??` (which does treat `undefined` as nullish) to "".
708
+ configureModels(
709
+ args.flags.model ?? "",
710
+ args.flags.fastmodel ?? "",
711
+ args.flags.slowmodel ?? "",
712
+ args.flags.provider ?? "",
713
+ )
714
+
539
715
  // Positional args (everything after flags) are joined with spaces to
540
- // form the one-shot prompt. `--` ends flag parsing if a positional
716
+ // form the starting prompt. `--` ends flag parsing if a positional
541
717
  // would otherwise look like a flag.
542
718
  const positionalQuery = args.positionals.join(" ")
543
719
  const hasQuery = positionalQuery != ""
720
+ const startAgent = args.flags.agent ?? ""
721
+ const wantInteractive = args.flags.interactive
722
+
723
+ // Validate the target subagent name up front (empty = coordinator).
724
+ if (startAgent != "" && !START_AGENTS.includes(startAgent)) {
725
+ print(
726
+ color.red(
727
+ "Unknown --agent value: ${startAgent}. Valid: ${START_AGENTS.join(", ")}",
728
+ ),
729
+ )
730
+ process.exit(1)
731
+ }
544
732
 
545
- // Non-interactive (piped) invocation: read the whole prompt from
546
- // stdin, run one turn of `route()`, write the reply to stdout, and
547
- // exit. No banner, no REPL, no slash commands. This lets the agent
548
- // behave like a normal Unix filter: `echo "..." | pnpm run agency agent`.
549
- //
550
- // Also entered when `--print` / `-p` is passed, or when a positional
551
- // query is given. In those cases stdin isn't read — the prompt comes
552
- // from the positional.
553
- const forceOneShot = args.flags.print || hasQuery
554
- if (forceOneShot || !isTTY()) {
555
- const result = oneShotAgent()
556
- print(result)
733
+ // Seeded interactive: run the given prompt as the first turn, then hand
734
+ // the REPL to the user. Requires a seed prompt and a TTY (the REPL reads
735
+ // stdin). `--print` wins if both are passed its whole job is to print
736
+ // and exit with no REPL. Without a TTY (or with `--print`) we fall
737
+ // through to one-shot below; `--interactive` with no prompt falls through
738
+ // to the plain REPL.
739
+ if (wantInteractive && hasQuery && isTTY() && !args.flags.print) {
740
+ setTitle("Agency Agent")
741
+ clearScreen()
742
+ printHeader()
743
+ const seededHandler = setupSession(true)
744
+ startInteractive(seededHandler, startAgent, positionalQuery)
557
745
  process.exit(0)
558
746
  }
559
747
 
560
- printHeader()
561
-
562
- // Grounding: the LLM should not have to ask the user where it is
563
- // or what day it is. Both are appended once per run so they ride
564
- // with the first system message in each specialist's thread.
565
- //
566
- // Project context: if the user keeps an AGENTS.md at the workspace
567
- // root (Anthropic / Pi / Aider all read it), inline it so the LLM
568
- // automatically follows the project's conventions.
569
- const projectContext = loadAgentsMd(cwd()) with approve
570
- _context = "\n\nCurrent date: ${today()}\nCurrent working directory: ${cwd()}${projectContext}"
571
-
572
- const policy = parsePolicyFile(POLICY_PATH)
573
- if (policy is failure(f)) {
574
- const { status, error } = f
575
- print(f, status, error)
576
- if (status == "doesnt-exist") {
577
- print(color.yellow("No existing policy found at ${POLICY_PATH}."))
578
- const choice = givePolicyChoice()
579
- setPolicy(POLICY_PATH, choice)
580
- } else {
581
- print(color.red("Failed to load policy: ${JSON.stringify(error)}"))
582
- process.exit(1)
748
+ // One-shot invocation: run one turn through the same agent the REPL uses
749
+ // and write the reply to stdout. No banner, no REPL. Entered when
750
+ // `--print` / `-p` is passed, a positional query is given, or stdin is
751
+ // piped (no TTY) so the agent behaves like a Unix filter:
752
+ // `echo "..." | agency agent`. `--interactive` is NOT a one-shot trigger
753
+ // on its own: with a TTY and no prompt it falls through to the plain
754
+ // REPL; without a TTY the `!isTTY()` check below routes it here to
755
+ // degrade gracefully. The prompt comes from the positional when present,
756
+ // otherwise from stdin. (Title/clearScreen are skipped so piped output
757
+ // stays free of escape codes.)
758
+ const forceOneShot = args.flags.print || hasQuery
759
+ if (forceOneShot || !isTTY()) {
760
+ let prompt = positionalQuery
761
+ if (!hasQuery) {
762
+ const fromStdin = readStdin()
763
+ if (fromStdin == null || fromStdin == "") {
764
+ process.exit(0)
765
+ }
766
+ prompt = fromStdin
583
767
  }
584
- } else {
585
- setPolicy(POLICY_PATH, policy.value)
768
+ print(oneShotAgent(startAgent, prompt))
769
+ process.exit(0)
586
770
  }
587
- // Bind the handler to a local var so `with handler` parses (the
588
- // `with` clause only accepts an identifier, not a call expression).
589
- const handler = cliPolicyHandler(file: POLICY_PATH, fields: ALWAYS_FIELDS)
590
771
 
591
- // The `repl()` widget owns the runloop; every Enter dispatches into
592
- // `_runTurn` which calls `route()`. Interrupts raised inside
593
- // route() propagate to the policy handler installed by the enclosing
594
- // `handle` block via the AsyncLocalStorage handler stack.
595
- handle {
596
- repl(
597
- status: _buildStatus,
598
- onSubmit: _runTurn,
599
- prompt: "> ",
600
- historyFile: HISTORY_PATH,
601
- historyMax: 1000,
602
- paletteCommands: mergedPalette(),
603
- )
604
- } with handler
605
-
606
- print(color.cyan("\nGoodbye!"))
772
+ // Plain interactive REPL (no seed). `startInteractive` owns the runloop;
773
+ // every Enter dispatches into `_runTurn` which calls `mainAgent`.
774
+ // Interrupts raised during a turn propagate to the policy handler
775
+ // installed by the enclosing `handle` block via the AsyncLocalStorage
776
+ // handler stack.
777
+ setTitle("Agency Agent")
778
+ clearScreen()
779
+ printHeader()
780
+ const handler = setupSession(true)
781
+ startInteractive(handler, "", "")
607
782
  }