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
|
@@ -1,28 +1,24 @@
|
|
|
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 { deepMergeConfig } from "../../core/config/deep-merge.js";
|
|
5
4
|
import { ConfigError } from "../../core/errors.js";
|
|
6
|
-
import {
|
|
7
|
-
import { EXECUTION_MAX_TIMEOUT_MS } from "../../execution/limits.js";
|
|
5
|
+
import { PORTABLE_INFERENCE_KEYS } from "../../core/llm-inference.js";
|
|
8
6
|
import { createInlineResolvedCommand, createResolvedExecutionRequest, decodeResolvedExecutionRequest, } from "../../execution/resolved-request.js";
|
|
9
|
-
import {
|
|
7
|
+
import { isPortableExecutionAgentSelector } from "../../execution/source.js";
|
|
10
8
|
import { getHarness } from "../harnesses/index.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { engineModelAndInference, loadModelMap, resolveModelMapAlias } from "./model-map.js";
|
|
15
|
-
import { extensionFields, hasToolSelection, untranslated } from "./request-lowering.js";
|
|
9
|
+
import { harnessProfile, runtimeProfile } from "./profiles.js";
|
|
10
|
+
import { lowerRequest, untranslated } from "./request-lowering.js";
|
|
11
|
+
import { mergeLayerInference, parseTimeout, resolveTarget, withReasoningEffort } from "./resolution.js";
|
|
16
12
|
import { decodeFrozenRunnerSpec } from "./runner.js";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
13
|
+
import { agentRuntime } from "./runtime.js";
|
|
14
|
+
/** The farthest layer of a call: the alias its kind of work asks for until something nearer names a model. */
|
|
15
|
+
export function shippedAlias(alias) {
|
|
16
|
+
return { id: "shipped-alias", kind: "installation", values: { model: alias } };
|
|
17
|
+
}
|
|
18
|
+
/** The layer for a call's own flags and arguments: nearer than every other. */
|
|
19
|
+
export function currentLayer(values) {
|
|
20
|
+
return { id: "current-invocation", kind: "current", values };
|
|
21
|
+
}
|
|
26
22
|
function has(values, key) {
|
|
27
23
|
return (values !== null &&
|
|
28
24
|
values !== undefined &&
|
|
@@ -37,273 +33,41 @@ function nearest(layers, key) {
|
|
|
37
33
|
}
|
|
38
34
|
return undefined;
|
|
39
35
|
}
|
|
40
|
-
function explicit(layer
|
|
41
|
-
return { layer: layer.id, kind: layer.kind, via };
|
|
42
|
-
}
|
|
43
|
-
function inferenceOf(source) {
|
|
44
|
-
const out = {};
|
|
45
|
-
for (const key of LLM_INFERENCE_FIELDS)
|
|
46
|
-
if (source[key] !== undefined)
|
|
47
|
-
out[key] = source[key];
|
|
48
|
-
return Object.keys(out).length > 0 ? out : undefined;
|
|
36
|
+
function explicit(layer) {
|
|
37
|
+
return { layer: layer.id, kind: layer.kind, via: layer.kind === "installation" ? "default" : "explicit" };
|
|
49
38
|
}
|
|
50
|
-
/**
|
|
51
|
-
function
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
values.agent = engine.agent;
|
|
64
|
-
if (engine.platform !== "opencode-sdk") {
|
|
65
|
-
return { kind: "agent", platform: engine.platform, modelMapKey: engine.platform, values };
|
|
66
|
-
}
|
|
67
|
-
// An SDK engine runs its own `llmEngine`'s model/inference/timeout unless it sets its own. With no
|
|
68
|
-
// `llmEngine` it has no fallback, and opencode picks the model: `defaults.llmEngine` is not borrowed.
|
|
69
|
-
const fallbackName = engine.llmEngine;
|
|
70
|
-
const fallback = fallbackName && config.engines && Object.hasOwn(config.engines, fallbackName)
|
|
71
|
-
? config.engines[fallbackName]
|
|
72
|
-
: undefined;
|
|
73
|
-
if (fallback?.kind !== "llm" || !fallbackName) {
|
|
74
|
-
return { kind: "sdk", platform: "opencode-sdk", modelMapKey: "opencode-sdk", values };
|
|
75
|
-
}
|
|
76
|
-
const inherited = engineModelAndInference(fallback);
|
|
77
|
-
return {
|
|
78
|
-
kind: "sdk",
|
|
79
|
-
platform: "opencode-sdk",
|
|
80
|
-
modelMapKey: own.model === undefined ? fallbackName : "opencode-sdk",
|
|
81
|
-
values: {
|
|
82
|
-
...(inherited.model !== undefined ? { model: inherited.model } : {}),
|
|
83
|
-
...(inherited.inference !== undefined ? { inference: inherited.inference } : {}),
|
|
84
|
-
...values,
|
|
85
|
-
timeout: Object.hasOwn(engine, "timeoutMs")
|
|
86
|
-
? (engine.timeoutMs ?? null)
|
|
87
|
-
: Object.hasOwn(fallback, "timeoutMs")
|
|
88
|
-
? (fallback.timeoutMs ?? null)
|
|
89
|
-
: DEFAULT_LLM_TIMEOUT_MS,
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
/** The same defaults read back from an already-resolved runner. */
|
|
94
|
-
function runnerDefaults(runner) {
|
|
95
|
-
const timeout = Object.hasOwn(runner, "timeoutMs") ? { timeout: runner.timeoutMs ?? null } : {};
|
|
96
|
-
if (runner.kind === "llm") {
|
|
97
|
-
const inference = inferenceOf(runner.connection);
|
|
98
|
-
return {
|
|
99
|
-
kind: "llm",
|
|
100
|
-
platform: runner.connection.provider ?? runner.engine,
|
|
101
|
-
modelMapKey: runner.engine,
|
|
102
|
-
values: {
|
|
103
|
-
...(runner.connection.model !== undefined ? { model: runner.connection.model } : {}),
|
|
104
|
-
...(inference ? { inference } : {}),
|
|
105
|
-
...timeout,
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const platform = runner.profile.platform ?? runner.profile.name;
|
|
110
|
-
const fallback = runner.kind === "sdk" ? runner.fallbackConnection : undefined;
|
|
111
|
-
const model = runner.profile.model ?? fallback?.model;
|
|
112
|
-
const fallbackInference = fallback ? inferenceOf(fallback) : undefined;
|
|
113
|
-
const inference = fallbackInference !== undefined || runner.profile.inference !== undefined
|
|
114
|
-
? { ...fallbackInference, ...runner.profile.inference }
|
|
115
|
-
: undefined;
|
|
116
|
-
return {
|
|
117
|
-
kind: runner.kind,
|
|
118
|
-
platform,
|
|
119
|
-
modelMapKey: platform,
|
|
120
|
-
values: {
|
|
121
|
-
...(model !== undefined ? { model } : {}),
|
|
122
|
-
...(inference ? { inference } : {}),
|
|
123
|
-
...timeout,
|
|
124
|
-
...(runner.profile.workspace !== undefined ? { workspace: runner.profile.workspace } : {}),
|
|
125
|
-
...(runner.profile.agent !== undefined ? { agent: runner.profile.agent } : {}),
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* The engine, from an ordered list: the nearest layer that names one, then
|
|
131
|
-
* `defaults.engine`, then the implicit opencode-sdk fallback when its binary
|
|
132
|
-
* is present. A named engine that is not configured is an error, never rescued.
|
|
133
|
-
*/
|
|
134
|
-
function selectEngine(config, layers) {
|
|
135
|
-
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
136
|
-
const layer = layers[index];
|
|
137
|
-
const name = layer?.values.engine;
|
|
138
|
-
if (layer && typeof name === "string" && name.length > 0) {
|
|
139
|
-
return { name, engine: configuredEngine(name, config), provenance: explicit(layer), fallback: false };
|
|
39
|
+
/** Record which layer set each inference key, mirroring {@link mergeLayerInference}. */
|
|
40
|
+
function recordInferenceProvenance(layers, provenance) {
|
|
41
|
+
for (const layer of layers) {
|
|
42
|
+
if (!has(layer.values, "inference"))
|
|
43
|
+
continue;
|
|
44
|
+
const source = explicit(layer);
|
|
45
|
+
provenance["/inference"] = source;
|
|
46
|
+
const inference = layer.values.inference ?? null;
|
|
47
|
+
if (inference === null) {
|
|
48
|
+
for (const key of Object.keys(provenance))
|
|
49
|
+
if (key.startsWith("/inference/"))
|
|
50
|
+
delete provenance[key];
|
|
51
|
+
continue;
|
|
140
52
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (installed) {
|
|
144
|
-
return {
|
|
145
|
-
name: installed,
|
|
146
|
-
engine: configuredEngine(installed, config),
|
|
147
|
-
provenance: { layer: "installation-defaults", kind: "installation", via: "explicit" },
|
|
148
|
-
fallback: false,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
const fallback = fallbackEngineConfig(config);
|
|
152
|
-
if (fallback) {
|
|
153
|
-
return {
|
|
154
|
-
name: FALLBACK_ENGINE_NAME,
|
|
155
|
-
engine: fallback,
|
|
156
|
-
provenance: { layer: FALLBACK_ENGINE_NAME, kind: "fallback", via: "fallback" },
|
|
157
|
-
fallback: true,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
throw new ConfigError(`Execution ${NO_ENGINE_MESSAGE_SUFFIX}`, "INVALID_CONFIG_FILE", NO_ENGINE_REMEDY);
|
|
161
|
-
}
|
|
162
|
-
function parseTimeout(value) {
|
|
163
|
-
if (value === null)
|
|
164
|
-
return null;
|
|
165
|
-
const milliseconds = typeof value === "string" ? parseDuration(value, DURATION_UNITS) : value;
|
|
166
|
-
if (typeof milliseconds !== "number" ||
|
|
167
|
-
!Number.isInteger(milliseconds) ||
|
|
168
|
-
milliseconds < 0 ||
|
|
169
|
-
milliseconds > EXECUTION_MAX_TIMEOUT_MS) {
|
|
170
|
-
throw new ConfigError("Execution timeout must be null, a whole number of milliseconds, or a duration such as 20m.", "INVALID_CONFIG_FILE");
|
|
171
|
-
}
|
|
172
|
-
return milliseconds;
|
|
173
|
-
}
|
|
174
|
-
/** Tool names a selection asks for; `undefined` when a structured policy cannot be reduced to names. */
|
|
175
|
-
function requestedToolNames(tools) {
|
|
176
|
-
if (typeof tools === "string") {
|
|
177
|
-
return tools
|
|
178
|
-
.split(",")
|
|
179
|
-
.map((tool) => tool.trim())
|
|
180
|
-
.filter(Boolean);
|
|
181
|
-
}
|
|
182
|
-
if (Array.isArray(tools))
|
|
183
|
-
return tools.map((tool) => tool.trim()).filter(Boolean);
|
|
184
|
-
const policy = tools;
|
|
185
|
-
if (Object.values(policy).some((value) => typeof value !== "boolean"))
|
|
186
|
-
return undefined;
|
|
187
|
-
return Object.keys(policy).filter((tool) => policy[tool] === true);
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Assets may only narrow the host's `execution.allowedTools`; without a config
|
|
191
|
-
* nothing is allowed. The model-work policy is akm's own and always allowed:
|
|
192
|
-
* it confines an engine more tightly than leaving tools unset does.
|
|
193
|
-
*/
|
|
194
|
-
function authorizeTools(tools, config, modelWork) {
|
|
195
|
-
if (modelWork) {
|
|
196
|
-
return {
|
|
197
|
-
status: "allowed",
|
|
198
|
-
reason: "The model-work tool policy is akm's own.",
|
|
199
|
-
policy: { id: MODEL_WORK_POLICY_ID },
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
if (!hasToolSelection(tools))
|
|
203
|
-
return { status: "not-required" };
|
|
204
|
-
if (!config) {
|
|
205
|
-
return {
|
|
206
|
-
status: "denied",
|
|
207
|
-
reason: "Selected tools require an explicit machine/user authorization policy.",
|
|
208
|
-
policy: { id: "unconfigured" },
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
const allowed = new Set(config.execution?.allowedTools ?? []);
|
|
212
|
-
const names = requestedToolNames(tools);
|
|
213
|
-
const permitted = allowed.has("*") || names?.every((tool) => allowed.has(tool)) === true;
|
|
214
|
-
return permitted
|
|
215
|
-
? {
|
|
216
|
-
status: "allowed",
|
|
217
|
-
reason: "Selected tools were authorized by operator policy.",
|
|
218
|
-
policy: { id: "config-execution-allowed-tools" },
|
|
53
|
+
for (const key of Object.keys(withReasoningEffort(inference))) {
|
|
54
|
+
provenance[`/inference/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`] = source;
|
|
219
55
|
}
|
|
220
|
-
: {
|
|
221
|
-
status: "denied",
|
|
222
|
-
reason: "Selected tools are not authorized by operator policy.",
|
|
223
|
-
policy: { id: "config-execution-allowed-tools" },
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
function withInference(connection, inference) {
|
|
227
|
-
const out = { ...connection };
|
|
228
|
-
for (const key of LLM_INFERENCE_FIELDS)
|
|
229
|
-
delete out[key];
|
|
230
|
-
if (inference)
|
|
231
|
-
for (const key of LLM_INFERENCE_FIELDS)
|
|
232
|
-
if (inference[key] !== undefined)
|
|
233
|
-
out[key] = inference[key];
|
|
234
|
-
return out;
|
|
235
|
-
}
|
|
236
|
-
/** Apply a request's model, inference, timeout and workspace to its runner. Idempotent. */
|
|
237
|
-
function applyRequest(base, request) {
|
|
238
|
-
const timeout = Object.hasOwn(request.runtime, "timeoutMs")
|
|
239
|
-
? { timeoutMs: request.runtime.timeoutMs ?? null }
|
|
240
|
-
: Object.hasOwn(base, "timeoutMs")
|
|
241
|
-
? { timeoutMs: base.timeoutMs }
|
|
242
|
-
: {};
|
|
243
|
-
const model = request.model?.resolved;
|
|
244
|
-
if (base.kind === "llm") {
|
|
245
|
-
const { model: _model, ...connection } = base.connection;
|
|
246
|
-
return {
|
|
247
|
-
...base,
|
|
248
|
-
connection: withInference({ ...connection, ...(model !== undefined ? { model } : {}) }, request.inference),
|
|
249
|
-
...timeout,
|
|
250
|
-
};
|
|
251
56
|
}
|
|
252
|
-
const { model: _model, workspace: _workspace, inference: ownInference, ...profile } = base.profile;
|
|
253
|
-
const workspace = request.runtime.workspace;
|
|
254
|
-
const inference = Object.hasOwn(request, "inference") ? request.inference : ownInference;
|
|
255
|
-
const next = {
|
|
256
|
-
...base,
|
|
257
|
-
profile: {
|
|
258
|
-
...profile,
|
|
259
|
-
...(model !== undefined ? { model } : {}),
|
|
260
|
-
...(typeof workspace === "string" ? { workspace } : {}),
|
|
261
|
-
...(inference ? { inference } : {}),
|
|
262
|
-
},
|
|
263
|
-
...timeout,
|
|
264
|
-
};
|
|
265
|
-
if (next.kind === "sdk" && next.fallbackConnection) {
|
|
266
|
-
let fallback = { ...next.fallbackConnection };
|
|
267
|
-
if (request.model === null)
|
|
268
|
-
delete fallback.model;
|
|
269
|
-
if (Object.hasOwn(request, "inference"))
|
|
270
|
-
fallback = withInference(fallback, request.inference);
|
|
271
|
-
next.fallbackConnection = fallback;
|
|
272
|
-
}
|
|
273
|
-
return next;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Reasoning effort has one word in a request: `reasoningEffort`, which is what
|
|
277
|
-
* engines, opencode and the LLM request body call it. `effort` is the same
|
|
278
|
-
* setting as a `models.json` alias or an asset's `effort:` frontmatter spells
|
|
279
|
-
* it, and becomes `reasoningEffort` here, in the one place every layer's
|
|
280
|
-
* inference is merged, so the nearest layer wins whichever word it used. When
|
|
281
|
-
* one inference object has both, `reasoningEffort` wins.
|
|
282
|
-
*/
|
|
283
|
-
function withReasoningEffort(inference) {
|
|
284
|
-
if (!Object.hasOwn(inference, "effort"))
|
|
285
|
-
return inference;
|
|
286
|
-
const { effort, ...rest } = inference;
|
|
287
|
-
return Object.hasOwn(rest, "reasoningEffort") ? rest : { ...rest, reasoningEffort: effort };
|
|
288
57
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
for (const key of Object.keys(next)) {
|
|
299
|
-
provenance[`/inference/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`] = source;
|
|
300
|
-
}
|
|
301
|
-
return deepMergeConfig(current ?? {}, next);
|
|
58
|
+
/** A journaled runner under this call's layers: the nearest layer's timeout and (exact) model replace its own. */
|
|
59
|
+
function applyLayers(runner, layers) {
|
|
60
|
+
const timeout = nearest(layers, "timeout")?.values.timeout;
|
|
61
|
+
const model = nearest(layers, "model")?.values.model;
|
|
62
|
+
return {
|
|
63
|
+
...runner,
|
|
64
|
+
...(timeout !== undefined ? { timeoutMs: parseTimeout(timeout) } : {}),
|
|
65
|
+
...(typeof model === "string" && model ? { model } : {}),
|
|
66
|
+
};
|
|
302
67
|
}
|
|
303
68
|
/**
|
|
304
|
-
* Resolve one execution:
|
|
305
|
-
* caller's layers (nearest wins),
|
|
306
|
-
* apply the result to the engine's runner.
|
|
69
|
+
* Resolve one execution: pick where it runs and the model (`resolveTarget`), merge
|
|
70
|
+
* the caller's other layers (nearest wins), and build the request for that target.
|
|
307
71
|
*/
|
|
308
72
|
export function resolveExecution(input) {
|
|
309
73
|
const command = input.command ??
|
|
@@ -312,88 +76,55 @@ export function resolveExecution(input) {
|
|
|
312
76
|
...(input.argumentInput !== undefined ? { argumentInput: input.argumentInput } : {}),
|
|
313
77
|
content: input.content ?? "",
|
|
314
78
|
});
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
...(input.current ? [{ id: "current-invocation", kind: "current", values: input.current }] : []),
|
|
326
|
-
];
|
|
79
|
+
const layers = input.layers ?? [];
|
|
80
|
+
const modelWork = input.modelWork === true;
|
|
81
|
+
let runner;
|
|
82
|
+
if (input.runner)
|
|
83
|
+
runner = applyLayers(input.runner, layers);
|
|
84
|
+
else if (input.config) {
|
|
85
|
+
runner = resolveTarget({ config: input.config, modelWork, layers: layers.map((layer) => layer.values) });
|
|
86
|
+
}
|
|
87
|
+
else
|
|
88
|
+
throw new TypeError("resolveExecution needs a config or a runner");
|
|
327
89
|
const provenance = {};
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
defaults = runnerDefaults(input.runner);
|
|
335
|
-
base = input.runner;
|
|
336
|
-
provenance.engine = { layer: "installation-defaults", kind: "installation", via: "explicit" };
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
if (!input.config)
|
|
340
|
-
throw new TypeError("resolveExecution needs a config or a runner");
|
|
341
|
-
const selected = selectEngine(input.config, callerLayers);
|
|
342
|
-
name = selected.name;
|
|
343
|
-
fallback = selected.fallback;
|
|
344
|
-
defaults = engineDefaults(name, selected.engine, input.config);
|
|
345
|
-
base = resolveEngine(name, input.config, selected.engine);
|
|
346
|
-
provenance.engine = selected.provenance;
|
|
347
|
-
}
|
|
348
|
-
const layers = [{ id: name, kind: "engine", values: defaults.values }, ...callerLayers];
|
|
90
|
+
const targetLayer = [...layers]
|
|
91
|
+
.reverse()
|
|
92
|
+
.find((layer) => has(layer.values, "connection") || has(layer.values, "harness") || has(layer.values, "engine"));
|
|
93
|
+
provenance.target = targetLayer
|
|
94
|
+
? explicit(targetLayer)
|
|
95
|
+
: { layer: "installation-defaults", kind: "installation", via: "explicit" };
|
|
349
96
|
provenance.command = { layer: command.source?.ref ?? "inline", kind: "command", via: "source" };
|
|
350
97
|
let persona = input.persona;
|
|
351
|
-
// The
|
|
98
|
+
// The harness's own `agent` is only a default for a request that names none: it never replaces a
|
|
352
99
|
// persona, and model work keeps its confined agent.
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
if (agentLayer?.kind === "engine" && !engineAgentApplies)
|
|
356
|
-
agentLayer = undefined;
|
|
357
|
-
const agent = agentLayer?.values.agent;
|
|
100
|
+
let agent;
|
|
101
|
+
const agentLayer = nearest(layers, "agent");
|
|
358
102
|
if (agentLayer) {
|
|
103
|
+
agent = agentLayer.values.agent;
|
|
359
104
|
provenance.agent = explicit(agentLayer);
|
|
360
105
|
// A native selector (or an explicit null) replaces any persona.
|
|
361
106
|
if (typeof agent !== "string" || !isPortableExecutionAgentSelector(agent))
|
|
362
107
|
persona = null;
|
|
363
108
|
}
|
|
109
|
+
else if (runner.kind === "harness" && runner.agent !== undefined && !persona && !modelWork) {
|
|
110
|
+
agent = runner.agent;
|
|
111
|
+
provenance.agent = { layer: runner.name, kind: "installation", via: "explicit" };
|
|
112
|
+
}
|
|
364
113
|
if (persona)
|
|
365
114
|
provenance.persona = { layer: persona.source.ref, kind: "agent", via: "source" };
|
|
366
115
|
const modelLayer = nearest(layers, "model");
|
|
367
|
-
|
|
368
|
-
let aliasInference;
|
|
369
|
-
if (modelLayer) {
|
|
116
|
+
if (modelLayer)
|
|
370
117
|
provenance.model = explicit(modelLayer);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
: { input: value, interpretation: "exact", model: value };
|
|
379
|
-
model = { input: selection.input, interpretation: selection.interpretation, resolved: selection.model };
|
|
380
|
-
if ("inference" in selection && selection.inference !== undefined)
|
|
381
|
-
aliasInference = selection.inference;
|
|
382
|
-
}
|
|
383
|
-
else {
|
|
384
|
-
throw new ConfigError("Resolved model must be null or a non-empty string.", "INVALID_CONFIG_FILE");
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
// An alias's inference applies at the layer that chose the alias, under that layer's own inference.
|
|
388
|
-
let inference;
|
|
389
|
-
for (const layer of layers) {
|
|
390
|
-
if (layer === modelLayer && aliasInference !== undefined) {
|
|
391
|
-
inference = mergeInference(inference, aliasInference, explicit(layer, "model-alias"), provenance);
|
|
392
|
-
}
|
|
393
|
-
if (has(layer.values, "inference")) {
|
|
394
|
-
inference = mergeInference(inference, layer.values.inference ?? null, explicit(layer), provenance);
|
|
395
|
-
}
|
|
118
|
+
const requested = modelLayer?.values.model;
|
|
119
|
+
let model;
|
|
120
|
+
if (runner.model !== undefined) {
|
|
121
|
+
model = {
|
|
122
|
+
model: runner.model,
|
|
123
|
+
...(typeof requested === "string" && requested !== runner.model ? { alias: requested } : {}),
|
|
124
|
+
};
|
|
396
125
|
}
|
|
126
|
+
const inference = mergeLayerInference(layers.map((layer) => layer.values));
|
|
127
|
+
recordInferenceProvenance(layers, provenance);
|
|
397
128
|
const select = (key, field) => {
|
|
398
129
|
const layer = nearest(layers, key);
|
|
399
130
|
if (layer)
|
|
@@ -401,141 +132,112 @@ export function resolveExecution(input) {
|
|
|
401
132
|
return layer;
|
|
402
133
|
};
|
|
403
134
|
const schemaLayer = select("outputSchema", "outputSchema");
|
|
404
|
-
const modelWork = input.modelWork === true;
|
|
405
|
-
const toolsLayer = modelWork ? undefined : select("tools", "tools");
|
|
406
135
|
const timeoutLayer = select("timeout", "runtime.timeoutMs");
|
|
407
136
|
const workspaceLayer = select("workspace", "runtime.workspace");
|
|
408
137
|
const environmentLayer = select("environment", "runtime.environment");
|
|
409
|
-
const
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
138
|
+
const workspace = workspaceLayer
|
|
139
|
+
? (workspaceLayer.values.workspace ?? null)
|
|
140
|
+
: runner.kind === "harness"
|
|
141
|
+
? runner.workspace
|
|
142
|
+
: undefined;
|
|
143
|
+
if (!timeoutLayer) {
|
|
144
|
+
const targets = runner.kind === "connection" ? input.config?.connections : input.config?.harnesses;
|
|
145
|
+
const configured = input.config === undefined || Object.hasOwn(targets?.[runner.name] ?? {}, "timeoutMs");
|
|
146
|
+
provenance["runtime.timeoutMs"] = {
|
|
147
|
+
layer: runner.name,
|
|
148
|
+
kind: "installation",
|
|
149
|
+
via: configured ? "explicit" : "default",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
417
152
|
const request = createResolvedExecutionRequest({
|
|
418
153
|
command,
|
|
419
154
|
...(input.conversation !== undefined ? { conversation: input.conversation } : {}),
|
|
420
|
-
...(
|
|
155
|
+
...(agent !== undefined ? { agent } : {}),
|
|
421
156
|
...(persona !== undefined ? { persona } : {}),
|
|
422
|
-
|
|
423
|
-
|
|
157
|
+
target: {
|
|
158
|
+
name: runner.name,
|
|
159
|
+
kind: runner.kind,
|
|
160
|
+
...(runner.kind === "harness" ? { platform: runner.platform } : {}),
|
|
161
|
+
},
|
|
162
|
+
...(model ? { model } : {}),
|
|
424
163
|
...(inference !== undefined ? { inference } : {}),
|
|
425
164
|
...(schemaLayer ? { outputSchema: schemaLayer.values.outputSchema ?? null } : {}),
|
|
426
|
-
|
|
427
|
-
authorization,
|
|
165
|
+
modelWork,
|
|
428
166
|
runtime: {
|
|
429
|
-
|
|
430
|
-
...(
|
|
167
|
+
timeoutMs: runner.timeoutMs,
|
|
168
|
+
...(workspace !== undefined ? { workspace } : {}),
|
|
431
169
|
...(environmentLayer ? { environment: environmentLayer.values.environment ?? null } : {}),
|
|
432
|
-
...(settingsLayer ? { settings: settingsLayer.values.runtime ?? null } : {}),
|
|
433
170
|
},
|
|
434
|
-
notices: [],
|
|
435
171
|
});
|
|
436
172
|
const sorted = Object.fromEntries(Object.entries(provenance).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
|
|
437
|
-
return {
|
|
438
|
-
request,
|
|
439
|
-
runner: applyRequest(base, request),
|
|
440
|
-
provenance: sorted,
|
|
441
|
-
...(fallback ? { fallbackEngineName: name } : {}),
|
|
442
|
-
};
|
|
173
|
+
return { request, runner, provenance: sorted };
|
|
443
174
|
}
|
|
444
175
|
function nonEmpty(value) {
|
|
445
176
|
return value !== null && value !== undefined && Object.keys(value).length > 0;
|
|
446
177
|
}
|
|
447
|
-
function
|
|
178
|
+
function buildChat(request, runner, options) {
|
|
448
179
|
if (typeof request.agent === "string" && request.persona === null) {
|
|
449
|
-
throw new ConfigError(`
|
|
450
|
-
}
|
|
451
|
-
if (hasToolSelection(request.tools)) {
|
|
452
|
-
throw new ConfigError("The direct LLM transport cannot enforce the resolved tool policy.", "INVALID_CONFIG_FILE");
|
|
180
|
+
throw new ConfigError(`A direct model call cannot consume native agent selector ${JSON.stringify(request.agent)}.`, "INVALID_CONFIG_FILE");
|
|
453
181
|
}
|
|
454
|
-
const notices = [
|
|
182
|
+
const notices = [];
|
|
455
183
|
const skip = (field) => {
|
|
456
|
-
notices.push(untranslated("
|
|
184
|
+
notices.push(untranslated("connection", field));
|
|
457
185
|
};
|
|
458
186
|
for (const key of Object.keys(request.inference ?? {}).sort()) {
|
|
459
|
-
if (!
|
|
187
|
+
if (!PORTABLE_INFERENCE_KEYS.includes(key))
|
|
460
188
|
skip(`inference.${key}`);
|
|
461
189
|
}
|
|
462
190
|
const chatOptions = {};
|
|
463
|
-
// Sent unless the
|
|
464
|
-
if (request.outputSchema)
|
|
465
|
-
|
|
466
|
-
chatOptions.responseSchema = request.outputSchema;
|
|
467
|
-
else
|
|
468
|
-
skip("outputSchema");
|
|
469
|
-
}
|
|
191
|
+
// Sent unless the call opts out; chatCompletion drops it once if the provider rejects it.
|
|
192
|
+
if (request.outputSchema)
|
|
193
|
+
chatOptions.responseSchema = request.outputSchema;
|
|
470
194
|
if (request.runtime.workspace)
|
|
471
195
|
skip("runtime.workspace");
|
|
472
196
|
if (nonEmpty(request.runtime.environment))
|
|
473
197
|
skip("runtime.environment");
|
|
474
|
-
if (nonEmpty(request.runtime.settings))
|
|
475
|
-
skip("runtime.settings");
|
|
476
|
-
for (const field of extensionFields(request))
|
|
477
|
-
skip(field);
|
|
478
198
|
const messages = [
|
|
479
199
|
...(request.persona ? [{ role: "system", content: request.persona.content }] : []),
|
|
480
200
|
...(request.conversation ?? []).map((message) => ({ role: message.role, content: message.content })),
|
|
481
201
|
{ role: "user", content: request.command.content },
|
|
482
202
|
];
|
|
483
|
-
return { request, runner,
|
|
203
|
+
return { request, runner, options, messages, chatOptions, notices };
|
|
484
204
|
}
|
|
485
205
|
/**
|
|
486
|
-
* Build a request for its runner's transport:
|
|
487
|
-
*
|
|
488
|
-
*
|
|
206
|
+
* Build a request for its runner's transport: chat messages for model work on a
|
|
207
|
+
* connection; otherwise the harness's own builder, which for agent work on a
|
|
208
|
+
* connection is akm's internal runtime.
|
|
489
209
|
*/
|
|
490
210
|
export function buildExecution(request, runner) {
|
|
491
|
-
if (request.authorization.status === "denied") {
|
|
492
|
-
throw new ConfigError(request.authorization.reason ?? "Resolved execution is not authorized by operator policy.", "EXECUTION_NOT_AUTHORIZED");
|
|
493
|
-
}
|
|
494
|
-
const applied = applyRequest(runner, request);
|
|
495
211
|
const environment = request.runtime.environment;
|
|
212
|
+
const workspace = request.runtime.workspace;
|
|
496
213
|
const options = {
|
|
497
214
|
stdio: "captured",
|
|
498
|
-
|
|
499
|
-
...(
|
|
500
|
-
...(applied.kind !== "llm" && applied.profile.workspace ? { cwd: applied.profile.workspace } : {}),
|
|
215
|
+
...(request.runtime.timeoutMs !== undefined ? { timeoutMs: request.runtime.timeoutMs } : {}),
|
|
216
|
+
...(typeof workspace === "string" ? { cwd: workspace } : {}),
|
|
501
217
|
...(environment ? { env: { ...environment } } : {}),
|
|
502
218
|
};
|
|
503
|
-
if (
|
|
504
|
-
return
|
|
505
|
-
|
|
506
|
-
const
|
|
507
|
-
const
|
|
508
|
-
if (!
|
|
509
|
-
throw new ConfigError(`Agent platform ${JSON.stringify(platform)} has no registered request builder.`, "INVALID_CONFIG_FILE");
|
|
510
|
-
}
|
|
511
|
-
const built =
|
|
219
|
+
if (runner.kind === "connection" && request.modelWork)
|
|
220
|
+
return buildChat(request, runner, options);
|
|
221
|
+
// Agent work on a connection runs on akm's own runtime, which is no harness and has its own lowering target.
|
|
222
|
+
const profile = runner.kind === "harness" ? harnessProfile(runner) : runtimeProfile(runner);
|
|
223
|
+
const target = runner.kind === "connection" ? agentRuntime.lowering : getHarness(runner.platform);
|
|
224
|
+
if (!target) {
|
|
225
|
+
throw new ConfigError(`Agent platform ${JSON.stringify(profile.platform)} has no registered request builder.`, "INVALID_CONFIG_FILE");
|
|
226
|
+
}
|
|
227
|
+
const built = lowerRequest(target, request);
|
|
512
228
|
return {
|
|
513
229
|
request,
|
|
514
|
-
runner
|
|
515
|
-
prompt: built.prompt,
|
|
230
|
+
runner,
|
|
516
231
|
options: { ...options, dispatch: built.dispatch },
|
|
517
|
-
|
|
232
|
+
profile,
|
|
233
|
+
notices: built.notices,
|
|
518
234
|
};
|
|
519
235
|
}
|
|
520
236
|
/**
|
|
521
237
|
* Resume: build a journaled `{ request, runner }` exactly as frozen. Never
|
|
522
|
-
* reads config
|
|
523
|
-
*
|
|
238
|
+
* reads config or credentials, so a config edit after the freeze cannot change
|
|
239
|
+
* what a resumed unit runs.
|
|
524
240
|
*/
|
|
525
241
|
export function buildExecutionFromWire(wire) {
|
|
526
242
|
return buildExecution(decodeResolvedExecutionRequest(wire.request), decodeFrozenRunnerSpec(wire.runner));
|
|
527
243
|
}
|
|
528
|
-
/** Each configured engine's own model selection and models.json column, for `akm health`. */
|
|
529
|
-
export function executionEngineDefinitionsFromConfig(config) {
|
|
530
|
-
return Object.fromEntries(Object.entries(config.engines ?? {}).map(([name, engine]) => {
|
|
531
|
-
const defaults = engineDefaults(name, engine, config);
|
|
532
|
-
return [
|
|
533
|
-
name,
|
|
534
|
-
{
|
|
535
|
-
selection: { name, kind: defaults.kind, platform: defaults.platform },
|
|
536
|
-
defaults: defaults.values,
|
|
537
|
-
modelMapKey: defaults.modelMapKey,
|
|
538
|
-
},
|
|
539
|
-
];
|
|
540
|
-
}));
|
|
541
|
-
}
|