akm-cli 0.10.261012-beta → 0.10.261014-beta
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/CHANGELOG.md +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
|
@@ -2,58 +2,41 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* Run a built execution: the one place credentials are read.
|
|
6
|
-
* goes to `chatCompletion`,
|
|
7
|
-
* turns the request into argv),
|
|
8
|
-
*
|
|
9
|
-
* from
|
|
5
|
+
* Run a built execution: the one place credentials are read. Model work on a
|
|
6
|
+
* connection goes to `chatCompletion`, a harness to `runAgent` (the harness
|
|
7
|
+
* builder turns the request into argv), and agent work on a connection to
|
|
8
|
+
* akm's own runtime (`agentRuntime`). The key of the connection a run used is
|
|
9
|
+
* redacted from its result.
|
|
10
10
|
*/
|
|
11
11
|
import fs from "node:fs";
|
|
12
12
|
import os from "node:os";
|
|
13
13
|
import path from "node:path";
|
|
14
|
-
import {
|
|
14
|
+
import { resolveApiKey } from "../../core/config/credentials.js";
|
|
15
15
|
import { UsageError } from "../../core/errors.js";
|
|
16
|
-
import {
|
|
17
|
-
import { MODEL_WORK_POLICY_ID } from "../../execution/source.js";
|
|
16
|
+
import { collectInferredSecretValues, collectSensitiveValues, redactSensitiveText } from "../../core/redaction.js";
|
|
18
17
|
import { chatCompletion, LlmCallError } from "../../llm/client.js";
|
|
19
18
|
import { emitLlmUsage } from "../../llm/usage-telemetry.js";
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import { materializeLlmRunnerConnection, materializeSdkFallbackConnection } from "./runner.js";
|
|
19
|
+
import { modelFromArgs } from "../harnesses/harness.js";
|
|
20
|
+
import { harnessProfile, runtimeProfile } from "./profiles.js";
|
|
21
|
+
import { mergeLayerInference, resolveTarget } from "./resolution.js";
|
|
22
|
+
import { agentRuntime } from "./runtime.js";
|
|
25
23
|
import { runAgent } from "./spawn.js";
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
else {
|
|
43
|
-
if (runner.kind === "sdk") {
|
|
44
|
-
values.push(runner.fallbackConnection?.apiKey, lookupCredentialFromEnv(runner.fallbackCredential, envSource), runner.fallbackApiKeyFile ? lookupApiKeyFileValue(runner.fallbackApiKeyFile) : undefined, runner.fallbackApiKeySecretRef ? lookupApiKeySecretRefValue(runner.fallbackApiKeySecretRef) : undefined);
|
|
45
|
-
}
|
|
46
|
-
values.push(...Object.values(runner.profile.env ?? {}));
|
|
47
|
-
for (const name of runner.profile.envPassthrough) {
|
|
48
|
-
if (!isEnvPassthroughValueSafeToExpose(name, envSource[name]))
|
|
49
|
-
values.push(envSource[name]);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
for (const [name, value] of Object.entries(opts.env ?? {})) {
|
|
53
|
-
if (!isEnvPassthroughValueSafeToExpose(name, value))
|
|
54
|
-
values.push(value);
|
|
55
|
-
}
|
|
56
|
-
return collectSensitiveValues(values);
|
|
24
|
+
/**
|
|
25
|
+
* The value a dispatch must never echo back: the key of the connection it runs on.
|
|
26
|
+
* A harness is the user's own program and holds no key of akm's, so there is none.
|
|
27
|
+
* A request's own `env` is configuration; a caller's secret values are redacted
|
|
28
|
+
* through its own sensitive set.
|
|
29
|
+
*/
|
|
30
|
+
export function collectDispatchSensitiveValues(runner, envSource = process.env) {
|
|
31
|
+
// The child inherits akm's environment, so a reply that echoes a credential-named variable's value is scrubbed
|
|
32
|
+
// of it, as the connection's own key is.
|
|
33
|
+
const inherited = collectInferredSecretValues(envSource);
|
|
34
|
+
if (runner.kind !== "connection")
|
|
35
|
+
return collectSensitiveValues(inherited);
|
|
36
|
+
return collectSensitiveValues([
|
|
37
|
+
resolveApiKey(runner.apiKey, { connection: runner.name }, runner.endpoint, envSource, true, runner.storedKey !== false),
|
|
38
|
+
...inherited,
|
|
39
|
+
]);
|
|
57
40
|
}
|
|
58
41
|
function redactResult(result, sensitiveValues) {
|
|
59
42
|
return {
|
|
@@ -61,7 +44,6 @@ function redactResult(result, sensitiveValues) {
|
|
|
61
44
|
stdout: redactSensitiveText(result.stdout, sensitiveValues),
|
|
62
45
|
stderr: redactSensitiveText(result.stderr, sensitiveValues),
|
|
63
46
|
...(result.error !== undefined ? { error: redactSensitiveText(result.error, sensitiveValues) } : {}),
|
|
64
|
-
...(result.parsed !== undefined ? { parsed: redactSensitiveValue(result.parsed, sensitiveValues) } : {}),
|
|
65
47
|
};
|
|
66
48
|
}
|
|
67
49
|
function llmFailureReason(error) {
|
|
@@ -88,16 +70,14 @@ const USAGE_ERROR_CODES = {
|
|
|
88
70
|
llm_rate_limit: "rate_limited",
|
|
89
71
|
};
|
|
90
72
|
/**
|
|
91
|
-
* The model an agent or
|
|
92
|
-
*
|
|
93
|
-
* none. An SDK server never sees `args`, so an SDK engine with no model named
|
|
94
|
-
* has none to report: opencode picks it.
|
|
73
|
+
* The model an agent or runtime dispatch ran: the request's, else the one a
|
|
74
|
+
* harness's own `args` select, which its command carries when the request names none.
|
|
95
75
|
*/
|
|
96
76
|
function dispatchedModel({ request, runner }) {
|
|
97
|
-
return request.model?.
|
|
77
|
+
return request.model?.model ?? (runner.kind === "harness" ? modelFromArgs(runner.args) : undefined);
|
|
98
78
|
}
|
|
99
79
|
/**
|
|
100
|
-
* One usage record for an agent or
|
|
80
|
+
* One usage record for an agent or runtime dispatch, through the same sink and
|
|
101
81
|
* ambient `withLlmStage` attribution as the LLM transport's per-HTTP-attempt
|
|
102
82
|
* records: the model it ran, and tokens when the runner reported them.
|
|
103
83
|
*/
|
|
@@ -117,159 +97,154 @@ function recordDispatchUsage(execution, result) {
|
|
|
117
97
|
...(result.ok ? {} : { errorCode: (result.reason && USAGE_ERROR_CODES[result.reason]) ?? "unknown_error" }),
|
|
118
98
|
});
|
|
119
99
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
100
|
+
/**
|
|
101
|
+
* The chat connection a connection runner stands for: its key read now, and the
|
|
102
|
+
* portable settings of the runner's choosing layers and of this call's request
|
|
103
|
+
* (the request's nearer), which the client translates. The one place a
|
|
104
|
+
* connection's key is read for a call.
|
|
105
|
+
*/
|
|
106
|
+
export function materializeConnection(runner, inference, envSource = process.env) {
|
|
107
|
+
const apiKey = resolveApiKey(runner.apiKey, { connection: runner.name }, runner.endpoint, envSource, false, runner.storedKey !== false);
|
|
108
|
+
const settings = mergeLayerInference([
|
|
109
|
+
{ inference: runner.inference },
|
|
110
|
+
{ inference: inference },
|
|
111
|
+
]);
|
|
112
|
+
return {
|
|
113
|
+
endpoint: runner.endpoint,
|
|
114
|
+
model: runner.model,
|
|
115
|
+
request: runner.request,
|
|
116
|
+
...(settings ? { inference: settings } : {}),
|
|
117
|
+
timeoutMs: runner.timeoutMs,
|
|
118
|
+
...(runner.contextLength !== undefined ? { contextLength: runner.contextLength } : {}),
|
|
119
|
+
...(apiKey ? { apiKey } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** `llm` is given for a direct chat; without it a connection runs akm's internal runtime. */
|
|
123
|
+
async function dispatchRunner({ runner, profile, inference, confined }, opts, seams, llm) {
|
|
124
|
+
const secrets = collectDispatchSensitiveValues(runner);
|
|
123
125
|
let result;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
break;
|
|
137
|
-
case "sdk": {
|
|
138
|
-
const fallbackConnection = materializeSdkFallbackConnection(runner, envSource);
|
|
139
|
-
if (fallbackConnection?.apiKey)
|
|
140
|
-
secrets.push(fallbackConnection.apiKey);
|
|
141
|
-
result = await (seams.runSdk ?? runOpencodeSdk)(runner.profile, prompt, opts, fallbackConnection);
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
default:
|
|
145
|
-
return assertNever(runner);
|
|
126
|
+
if (runner.kind === "harness") {
|
|
127
|
+
const harnessRunProfile = profile ?? harnessProfile(runner);
|
|
128
|
+
const spawn = (spawnOpts) => (seams.runAgent ?? runAgent)(harnessRunProfile, spawnOpts);
|
|
129
|
+
result = await (confined ? inScratchDirectory(opts, spawn) : spawn(opts));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const connection = materializeConnection(runner, inference);
|
|
133
|
+
if (connection.apiKey)
|
|
134
|
+
secrets.push(connection.apiKey);
|
|
135
|
+
result = llm
|
|
136
|
+
? await llm(connection, opts)
|
|
137
|
+
: await (seams.runSdk ?? agentRuntime.run)(profile ?? runtimeProfile(runner), opts, connection);
|
|
146
138
|
}
|
|
147
139
|
return redactResult(result, collectSensitiveValues(secrets));
|
|
148
140
|
}
|
|
149
141
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* stash.
|
|
153
|
-
|
|
154
|
-
function createModelWorkDirectory() {
|
|
155
|
-
return fs.mkdtempSync(path.join(os.tmpdir(), "akm-model-work-"));
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Run a built execution. Credentials are read here, once per call, and never
|
|
159
|
-
* returned. Model work on an agent or SDK engine runs in a scratch working
|
|
160
|
-
* directory that akm creates for the dispatch and removes after it, and must
|
|
161
|
-
* end with an answer: an agent that stops with none (opencode at its step
|
|
162
|
-
* limit, for one) has failed with `parse_error`.
|
|
142
|
+
* Run `work` in a scratch working directory that akm creates for it and removes
|
|
143
|
+
* after, so the edit that model work on a CLI harness cannot be denied never
|
|
144
|
+
* reaches the stash. This function owns the directory's lifecycle: nothing else,
|
|
145
|
+
* the test tooling included, removes an `akm-model-work-*` directory.
|
|
163
146
|
*/
|
|
164
|
-
|
|
165
|
-
const scratch =
|
|
166
|
-
? createModelWorkDirectory()
|
|
167
|
-
: undefined;
|
|
147
|
+
async function inScratchDirectory(opts, work) {
|
|
148
|
+
const scratch = fs.mkdtempSync(path.join(os.tmpdir(), "akm-model-work-"));
|
|
168
149
|
try {
|
|
169
|
-
return await
|
|
150
|
+
return await work({ ...opts, cwd: scratch });
|
|
170
151
|
}
|
|
171
152
|
finally {
|
|
172
|
-
|
|
173
|
-
fs.rmSync(scratch, { recursive: true, force: true });
|
|
153
|
+
fs.rmSync(scratch, { recursive: true, force: true });
|
|
174
154
|
}
|
|
175
155
|
}
|
|
176
|
-
/**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
return extractor ? extractor(result) : { text: result.stdout };
|
|
156
|
+
/** Whether this execution is model work that runs an agent (not a direct chat). */
|
|
157
|
+
function isConfinedAgentWork(execution) {
|
|
158
|
+
return execution.request.modelWork && execution.messages === undefined;
|
|
180
159
|
}
|
|
181
|
-
/** A model-work reply
|
|
160
|
+
/** A model-work reply must end with an answer: an agent that stops with none (opencode at its step limit, for one) has failed. */
|
|
182
161
|
function modelWorkAnswer(runner, result) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
stdout: extracted.text,
|
|
187
|
-
...(extracted.sessionId ? { sessionId: extracted.sessionId } : {}),
|
|
188
|
-
};
|
|
189
|
-
if (extracted.text.trim() !== "")
|
|
190
|
-
return answer;
|
|
191
|
-
return { ...answer, ok: false, reason: "parse_error", error: `Engine "${runner.engine}" returned no answer.` };
|
|
162
|
+
if (result.stdout.trim() !== "")
|
|
163
|
+
return result;
|
|
164
|
+
return { ...result, ok: false, reason: "parse_error", error: `"${runner.name}" returned no answer.` };
|
|
192
165
|
}
|
|
193
|
-
/**
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Run a built execution. Credentials are read here, once per call, and never
|
|
168
|
+
* returned. Model work on a harness runs confined: in a scratch working
|
|
169
|
+
* directory, and it must end with an answer: an agent that stops with none
|
|
170
|
+
* (opencode at its step limit, for one) has failed with `parse_error`.
|
|
171
|
+
*/
|
|
172
|
+
export async function runExecution(execution, options = {}) {
|
|
173
|
+
const confined = isConfinedAgentWork(execution);
|
|
174
|
+
const opts = { ...execution.options };
|
|
175
|
+
if (options.signal)
|
|
176
|
+
opts.signal = options.signal;
|
|
177
|
+
// Model work is akm's own traffic: its reads and its agents' commands are the improve pipeline's, never the
|
|
178
|
+
// user's demand. A caller's source (a task, say) wins, as does one the unit's own `env:` binds.
|
|
179
|
+
const eventSource = options.eventSource ??
|
|
180
|
+
(execution.request.modelWork && execution.options.env?.AKM_EVENT_SOURCE === undefined ? "improve" : undefined);
|
|
181
|
+
if (eventSource !== undefined) {
|
|
182
|
+
opts.env = { ...execution.options.env, AKM_EVENT_SOURCE: eventSource };
|
|
203
183
|
}
|
|
204
184
|
const chat = options.chat ?? chatCompletion;
|
|
205
|
-
const llm =
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
185
|
+
const llm = execution.messages === undefined
|
|
186
|
+
? undefined
|
|
187
|
+
: async (connection, callOpts) => {
|
|
188
|
+
const started = Date.now();
|
|
189
|
+
try {
|
|
190
|
+
const stdout = await chat(connection, [...(execution.messages ?? [])], {
|
|
191
|
+
...execution.chatOptions,
|
|
192
|
+
...(Object.hasOwn(callOpts, "timeoutMs") ? { timeoutMs: callOpts.timeoutMs } : {}),
|
|
193
|
+
...(callOpts.signal ? { signal: callOpts.signal } : {}),
|
|
194
|
+
...(options.onRetryAttempt ? { onRetryAttempt: options.onRetryAttempt } : {}),
|
|
195
|
+
});
|
|
196
|
+
return { ok: true, exitCode: 0, stdout, stderr: "", durationMs: Date.now() - started };
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
// Returned rather than thrown so the redaction below covers provider bodies.
|
|
200
|
+
return {
|
|
201
|
+
ok: false,
|
|
202
|
+
exitCode: null,
|
|
203
|
+
stdout: "",
|
|
204
|
+
stderr: "",
|
|
205
|
+
durationMs: Date.now() - started,
|
|
206
|
+
error: error instanceof Error ? error.message : String(error),
|
|
207
|
+
reason: llmFailureReason(error),
|
|
208
|
+
...(error instanceof LlmCallError ? { llmErrorCode: error.code } : {}),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
let result = await dispatchRunner({
|
|
213
|
+
runner: execution.runner,
|
|
214
|
+
...(execution.profile ? { profile: execution.profile } : {}),
|
|
215
|
+
inference: execution.request.inference,
|
|
216
|
+
confined,
|
|
217
|
+
}, opts, options, llm);
|
|
218
|
+
if (confined && result.ok)
|
|
232
219
|
result = modelWorkAnswer(execution.runner, result);
|
|
233
220
|
// The LLM transport records each HTTP attempt itself.
|
|
234
|
-
if (
|
|
221
|
+
if (llm === undefined)
|
|
235
222
|
recordDispatchUsage(execution, result);
|
|
236
223
|
return result;
|
|
237
224
|
}
|
|
238
|
-
/**
|
|
225
|
+
/**
|
|
226
|
+
* `akm agent` with no prompt: start the harness for a person to use, with the terminal
|
|
227
|
+
* inherited and nothing to run (no `-p`, no empty turn). A connection has nothing
|
|
228
|
+
* interactive to start, so it is refused rather than billed for an empty turn.
|
|
229
|
+
*/
|
|
239
230
|
export async function executeInteractiveAgentInvocation(input, seams = {}) {
|
|
240
|
-
const runner =
|
|
241
|
-
|
|
242
|
-
|
|
231
|
+
const runner = resolveTarget({
|
|
232
|
+
config: input.config,
|
|
233
|
+
layers: [
|
|
234
|
+
...(input.connection === undefined ? [] : [{ connection: input.connection }]),
|
|
235
|
+
...(input.harness === undefined ? [] : [{ harness: input.harness }]),
|
|
236
|
+
...(input.engine === undefined ? [] : [{ engine: input.engine }]),
|
|
237
|
+
...(input.model === undefined ? [] : [{ model: input.model }]),
|
|
238
|
+
],
|
|
239
|
+
});
|
|
240
|
+
if (runner.kind === "connection") {
|
|
241
|
+
throw new UsageError(`"${runner.name}" is a connection, which has nothing to start interactively: pass --prompt, or name a harness.`, "MISSING_REQUIRED_ARGUMENT", "Pass --prompt to run a task on the connection, or name a harness with --harness to start it interactively.");
|
|
243
242
|
}
|
|
244
243
|
const opts = {
|
|
245
|
-
stdio:
|
|
246
|
-
|
|
247
|
-
...(input.
|
|
248
|
-
|
|
249
|
-
: runner.timeoutMs !== undefined
|
|
250
|
-
? { timeoutMs: runner.timeoutMs }
|
|
251
|
-
: {}),
|
|
252
|
-
...(input.cwd ? { cwd: input.cwd } : runner.profile.workspace ? { cwd: runner.profile.workspace } : {}),
|
|
244
|
+
stdio: "interactive",
|
|
245
|
+
timeoutMs: input.timeoutMs ?? runner.timeoutMs,
|
|
246
|
+
...(input.cwd ? { cwd: input.cwd } : runner.workspace ? { cwd: runner.workspace } : {}),
|
|
247
|
+
dispatch: { ...(runner.model ? { model: runner.model } : {}), ...(runner.agent ? { agent: runner.agent } : {}) },
|
|
253
248
|
};
|
|
254
|
-
return { engine:
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Close the `opencode serve` children the SDK runner keeps for reuse. Its own
|
|
258
|
-
* teardown hangs off `process.once("exit")`, which never fires while a child
|
|
259
|
-
* holds the event loop open, so the CLI and workflow engine call this in
|
|
260
|
-
* `finally` blocks. A no-op when no SDK server was started.
|
|
261
|
-
*/
|
|
262
|
-
export async function disposeDispatchResources() {
|
|
263
|
-
await disposeOpencodeSdkServers();
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Fail fast, before an operation makes any durable change, when `runner`'s
|
|
267
|
-
* required credential is missing. Reads it and keeps nothing: every dispatch
|
|
268
|
-
* reads it again.
|
|
269
|
-
*/
|
|
270
|
-
export function assertRunnerCredentials(runner, envSource) {
|
|
271
|
-
if (runner.kind === "llm")
|
|
272
|
-
materializeLlmRunnerConnection(runner, envSource);
|
|
273
|
-
if (runner.kind === "sdk")
|
|
274
|
-
materializeSdkFallbackConnection(runner, envSource);
|
|
249
|
+
return { engine: runner.name, result: await dispatchRunner({ runner }, opts, seams) };
|
|
275
250
|
}
|
|
@@ -1,78 +1,28 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import {
|
|
5
|
-
/** The symbolic LLM use behind one llm runner; nothing is read here. */
|
|
6
|
-
export function llmUseFromRunner(runner) {
|
|
7
|
-
return {
|
|
8
|
-
engine: runner.engine,
|
|
9
|
-
connection: runner.connection,
|
|
10
|
-
...(runner.credential ? { credential: runner.credential } : {}),
|
|
11
|
-
...(runner.apiKeyFile ? { apiKeyFile: runner.apiKeyFile } : {}),
|
|
12
|
-
...(runner.apiKeySecretRef ? { apiKeySecretRef: runner.apiKeySecretRef } : {}),
|
|
13
|
-
timeoutMs: runner.timeoutMs ?? null,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
/** The symbolic LLM use behind an sdk runner's provider fallback, when it has one. */
|
|
17
|
-
export function sdkFallbackUseFromRunner(runner) {
|
|
18
|
-
if (!runner.fallbackConnection)
|
|
19
|
-
return undefined;
|
|
20
|
-
return {
|
|
21
|
-
engine: runner.engine,
|
|
22
|
-
connection: runner.fallbackConnection,
|
|
23
|
-
...(runner.fallbackCredential ? { credential: runner.fallbackCredential } : {}),
|
|
24
|
-
...(runner.fallbackApiKeyFile ? { apiKeyFile: runner.fallbackApiKeyFile } : {}),
|
|
25
|
-
...(runner.fallbackApiKeySecretRef ? { apiKeySecretRef: runner.fallbackApiKeySecretRef } : {}),
|
|
26
|
-
timeoutMs: runner.fallbackTimeoutMs !== undefined ? runner.fallbackTimeoutMs : (runner.fallbackConnection.timeoutMs ?? null),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/** Read the current credential and inject it: the dispatch boundary for one llm runner. */
|
|
30
|
-
export function materializeLlmRunnerConnection(runner, envSource = process.env) {
|
|
31
|
-
return materializeLlmConnection(llmUseFromRunner(runner), envSource);
|
|
32
|
-
}
|
|
33
|
-
/** The same for an sdk runner's provider fallback, when it has one. */
|
|
34
|
-
export function materializeSdkFallbackConnection(runner, envSource = process.env) {
|
|
35
|
-
const use = sdkFallbackUseFromRunner(runner);
|
|
36
|
-
return use ? materializeLlmConnection(use, envSource) : undefined;
|
|
37
|
-
}
|
|
38
|
-
function isRecord(value) {
|
|
39
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
40
|
-
}
|
|
4
|
+
import { isRecord } from "../../core/common.js";
|
|
41
5
|
/**
|
|
42
|
-
* Read a journaled runner back.
|
|
43
|
-
*
|
|
6
|
+
* Read a journaled runner back. A current runner is kept as stored. An earlier
|
|
7
|
+
* release's `llm`, `agent` and `sdk` runners are not read: they fall through to
|
|
8
|
+
* the last case and the plan that holds one cannot be decoded, so its run starts
|
|
9
|
+
* afresh.
|
|
44
10
|
*/
|
|
45
11
|
export function decodeFrozenRunnerSpec(value) {
|
|
46
|
-
if (!isRecord(value)
|
|
47
|
-
throw new TypeError("a frozen runner must be an object
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
12
|
+
if (!isRecord(value))
|
|
13
|
+
throw new TypeError("a frozen runner must be an object");
|
|
14
|
+
switch (value.kind) {
|
|
15
|
+
case "connection":
|
|
16
|
+
if (typeof value.name !== "string" || typeof value.endpoint !== "string" || typeof value.model !== "string") {
|
|
17
|
+
throw new TypeError("a frozen connection runner must carry name, endpoint and model");
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
case "harness":
|
|
21
|
+
if (typeof value.name !== "string" || typeof value.platform !== "string" || typeof value.bin !== "string") {
|
|
22
|
+
throw new TypeError("a frozen harness runner must carry name, platform and bin");
|
|
23
|
+
}
|
|
24
|
+
return { args: [], ...value };
|
|
25
|
+
default:
|
|
26
|
+
throw new TypeError("a frozen runner's kind must be connection or harness");
|
|
54
27
|
}
|
|
55
|
-
if (value.kind !== "agent" && value.kind !== "sdk") {
|
|
56
|
-
throw new TypeError("a frozen runner's kind must be llm, agent, or sdk");
|
|
57
|
-
}
|
|
58
|
-
const profile = value.profile;
|
|
59
|
-
if (!isRecord(profile) || typeof profile.name !== "string" || typeof profile.bin !== "string") {
|
|
60
|
-
throw new TypeError("a frozen agent runner must carry profile.name and profile.bin");
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
...value,
|
|
64
|
-
profile: { args: [], envPassthrough: [], stdio: "captured", parseOutput: "text", ...profile },
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
export function runnerIsLlm(runner) {
|
|
68
|
-
return runner.kind === "llm";
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* The LLM connection behind a runner, whatever its kind: an llm runner's own,
|
|
72
|
-
* an sdk runner's provider fallback, none for an agent CLI.
|
|
73
|
-
*/
|
|
74
|
-
export function runnerLlmConnection(runner) {
|
|
75
|
-
if (runner.kind === "llm")
|
|
76
|
-
return runner.connection;
|
|
77
|
-
return runner.kind === "sdk" ? runner.fallbackConnection : undefined;
|
|
78
28
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* The one place akm's agent runtime is chosen. Lowering and dispatch use
|
|
6
|
+
* {@link agentRuntime} and import nothing of the implementation; replacing the
|
|
7
|
+
* runtime is a change to this line and the folder it names.
|
|
8
|
+
*/
|
|
9
|
+
import { opencodeRuntime } from "../harnesses/opencode/runtime/index.js";
|
|
10
|
+
export const agentRuntime = opencodeRuntime;
|