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