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
|
@@ -0,0 +1,332 @@
|
|
|
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
|
+
* Where an execution runs: the one place a connection or harness, and the model on
|
|
6
|
+
* it, are chosen.
|
|
7
|
+
*
|
|
8
|
+
* target the nearest layer that names a connection or harness, which must be
|
|
9
|
+
* configured (a harness by its name, else by its platform): a name that
|
|
10
|
+
* is not is an error, never a reason to use the default. None named
|
|
11
|
+
* means the default by name, chosen by the work: model work prefers the
|
|
12
|
+
* default connection and falls back to the default harness, agent work
|
|
13
|
+
* the reverse and falls back to akm's own runtime over the default
|
|
14
|
+
* connection.
|
|
15
|
+
* model the nearest layer's `model`: an alias is looked up in the connection's
|
|
16
|
+
* (or harness's) `models`, anything else is the exact name; none means
|
|
17
|
+
* the first model configured.
|
|
18
|
+
* timeout the nearest layer's, else the connection's or harness's, else the one
|
|
19
|
+
* default: 600 s for a connection and for model work, none for an agent.
|
|
20
|
+
*
|
|
21
|
+
* Layers run farther to nearer, so the last one that says something wins.
|
|
22
|
+
*/
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
import { closestMatch } from "../../core/closest-match.js";
|
|
25
|
+
import { ambiguousDefaultAdvice, defaultConnection, defaultHarness, inheritedConnectionsOf, retiredEngineTargets, unusableEntryAt, } from "../../core/config/config.js";
|
|
26
|
+
import { apiKeyReference } from "../../core/config/credentials.js";
|
|
27
|
+
import { deepMergeConfig } from "../../core/config/deep-merge.js";
|
|
28
|
+
import { STANDARD_ALIASES } from "../../core/config/model-aliases.js";
|
|
29
|
+
import { ConfigError } from "../../core/errors.js";
|
|
30
|
+
import { mergeRequestFields } from "../../core/llm-inference.js";
|
|
31
|
+
import { DURATION_UNITS, parseDuration } from "../../core/time.js";
|
|
32
|
+
import { warnOnce } from "../../core/warn.js";
|
|
33
|
+
import { EXECUTION_MAX_TIMEOUT_MS } from "../../execution/limits.js";
|
|
34
|
+
import { getHarness, HARNESS_NATIVE_AGENT_IDS } from "../harnesses/index.js";
|
|
35
|
+
import { DEFAULT_AGENT_TIMEOUT_MS, DEFAULT_LLM_TIMEOUT_MS } from "./config.js";
|
|
36
|
+
import { getBuiltinAgentProfile } from "./profiles.js";
|
|
37
|
+
/** The keys of a connection that akm reads; every other key is a request field. */
|
|
38
|
+
const CONNECTION_OWNED_KEYS = new Set([
|
|
39
|
+
"endpoint",
|
|
40
|
+
"apiKey",
|
|
41
|
+
"apiKeyFile",
|
|
42
|
+
"models",
|
|
43
|
+
"contextLength",
|
|
44
|
+
"timeoutMs",
|
|
45
|
+
"concurrency",
|
|
46
|
+
]);
|
|
47
|
+
function present(layer, key) {
|
|
48
|
+
return layer[key] !== undefined;
|
|
49
|
+
}
|
|
50
|
+
/** The value of the nearest layer that sets `key`; a layer setting `null` ends the search with `null`. */
|
|
51
|
+
function nearest(layers, key) {
|
|
52
|
+
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
53
|
+
const layer = layers[index];
|
|
54
|
+
if (layer && present(layer, key))
|
|
55
|
+
return layer[key];
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
/** A timeout as milliseconds (or `null` for none): a whole number, or a duration such as `20m`. */
|
|
60
|
+
export function parseTimeout(value) {
|
|
61
|
+
if (value === null)
|
|
62
|
+
return null;
|
|
63
|
+
const milliseconds = typeof value === "string" ? parseDuration(value, DURATION_UNITS) : value;
|
|
64
|
+
if (typeof milliseconds !== "number" ||
|
|
65
|
+
!Number.isInteger(milliseconds) ||
|
|
66
|
+
milliseconds < 0 ||
|
|
67
|
+
milliseconds > EXECUTION_MAX_TIMEOUT_MS) {
|
|
68
|
+
throw new ConfigError("Execution timeout must be null, a whole number of milliseconds, or a duration such as 20m.", "INVALID_CONFIG_FILE");
|
|
69
|
+
}
|
|
70
|
+
return milliseconds;
|
|
71
|
+
}
|
|
72
|
+
// ── Inference ───────────────────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Reasoning effort has one word in a request: `reasoningEffort`, which is what
|
|
75
|
+
* the LLM request body calls it. `effort` is the same setting as an asset's
|
|
76
|
+
* `effort:` frontmatter spells it, and becomes `reasoningEffort` here, in the one
|
|
77
|
+
* place every layer's inference is merged, so the nearest layer wins whichever
|
|
78
|
+
* word it used. When one inference object has both, `reasoningEffort` wins.
|
|
79
|
+
*/
|
|
80
|
+
export function withReasoningEffort(inference) {
|
|
81
|
+
if (!Object.hasOwn(inference, "effort"))
|
|
82
|
+
return inference;
|
|
83
|
+
const { effort, ...rest } = inference;
|
|
84
|
+
return Object.hasOwn(rest, "reasoningEffort") ? rest : { ...rest, reasoningEffort: effort };
|
|
85
|
+
}
|
|
86
|
+
/** The layers' portable inference merged, nearest wins; a layer that sets `null` clears what is farther. */
|
|
87
|
+
export function mergeLayerInference(layers) {
|
|
88
|
+
let merged;
|
|
89
|
+
for (const layer of layers) {
|
|
90
|
+
if (layer.inference === undefined)
|
|
91
|
+
continue;
|
|
92
|
+
merged =
|
|
93
|
+
layer.inference === null
|
|
94
|
+
? null
|
|
95
|
+
: deepMergeConfig(merged ?? {}, withReasoningEffort(layer.inference));
|
|
96
|
+
}
|
|
97
|
+
return merged;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* What the retired `engine` spelling names. While the config file is still in the `engines` form, the connection
|
|
101
|
+
* or harness that engine became (it may have been renamed); otherwise a connection by that name, else a harness.
|
|
102
|
+
*/
|
|
103
|
+
export function retiredEngineSelection(config, name) {
|
|
104
|
+
const became = retiredEngineTargets()[name];
|
|
105
|
+
if (became)
|
|
106
|
+
return "harness" in became
|
|
107
|
+
? { kind: "harness", name: became.harness }
|
|
108
|
+
: { kind: "connection", name: became.connection };
|
|
109
|
+
return { kind: config.harnesses?.[name] && !config.connections?.[name] ? "harness" : "connection", name };
|
|
110
|
+
}
|
|
111
|
+
/** The name the nearest layer that names anything gives, and the kind it gave it as. */
|
|
112
|
+
function namedByLayers(config, layers, modelWork) {
|
|
113
|
+
const order = modelWork ? ["connection", "harness"] : ["harness", "connection"];
|
|
114
|
+
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
115
|
+
const layer = layers[index];
|
|
116
|
+
if (!layer)
|
|
117
|
+
continue;
|
|
118
|
+
for (const kind of order) {
|
|
119
|
+
const name = layer[kind];
|
|
120
|
+
if (typeof name === "string" && name)
|
|
121
|
+
return { kind, name };
|
|
122
|
+
}
|
|
123
|
+
const engine = layer.engine;
|
|
124
|
+
if (typeof engine === "string" && engine)
|
|
125
|
+
return retiredEngineSelection(config, engine);
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The connection or harness the default-by-name rule picks for this work, if either is configured. Model work
|
|
131
|
+
* skips a harness that is set not to do it (`modelWork: false`); a call that names the harness still runs on it.
|
|
132
|
+
*/
|
|
133
|
+
function defaultTarget(config, modelWork) {
|
|
134
|
+
const connection = defaultConnection(config);
|
|
135
|
+
const found = defaultHarness(config);
|
|
136
|
+
const harness = found && !(modelWork && found.harness.modelWork === false) ? found : undefined;
|
|
137
|
+
const asConnection = connection && { kind: "connection", ...connection };
|
|
138
|
+
const asHarness = harness && { kind: "harness", ...harness };
|
|
139
|
+
return modelWork ? (asConnection ?? asHarness) : (asHarness ?? asConnection);
|
|
140
|
+
}
|
|
141
|
+
/** The names of the configured harnesses that run `platform`: an entry's `platform`, else its key. */
|
|
142
|
+
function harnessesOnPlatform(config, platform) {
|
|
143
|
+
return Object.entries(config.harnesses ?? {})
|
|
144
|
+
.filter(([name, harness]) => (harness.platform ?? name) === platform)
|
|
145
|
+
.map(([name]) => name);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The harness a `harness:` selector names: the one called that, else the one that runs that platform (a shared
|
|
149
|
+
* asset says `claude` whatever setup called the entry). Several on a platform: the one named `default`, else none,
|
|
150
|
+
* never the first.
|
|
151
|
+
*/
|
|
152
|
+
function harnessNamed(config, selector) {
|
|
153
|
+
const harnesses = config.harnesses ?? {};
|
|
154
|
+
const onPlatform = harnessesOnPlatform(config, selector);
|
|
155
|
+
const name = Object.hasOwn(harnesses, selector)
|
|
156
|
+
? selector
|
|
157
|
+
: onPlatform.length === 1
|
|
158
|
+
? onPlatform[0]
|
|
159
|
+
: onPlatform.find((candidate) => candidate === "default");
|
|
160
|
+
const harness = name === undefined ? undefined : harnesses[name];
|
|
161
|
+
return name !== undefined && harness ? { name, harness } : undefined;
|
|
162
|
+
}
|
|
163
|
+
/** The error for a connection or harness that was named and is not configured: what was named, what is configured, and the nearest name. */
|
|
164
|
+
export function selectionNotConfigured(config, kind, name) {
|
|
165
|
+
const label = kind === "connection" ? "Connection" : "Harness";
|
|
166
|
+
const plural = kind === "connection" ? "connections" : "harnesses";
|
|
167
|
+
const configured = Object.keys((kind === "connection" ? config.connections : config.harnesses) ?? {});
|
|
168
|
+
const near = closestMatch(name, configured, Math.max(1, Math.floor(name.length / 3)));
|
|
169
|
+
const unusable = unusableEntryAt(`${kind === "connection" ? "connections" : "harnesses"}.${name}`);
|
|
170
|
+
const sharing = kind === "harness" ? harnessesOnPlatform(config, name) : [];
|
|
171
|
+
return new ConfigError([
|
|
172
|
+
`${label} "${name}" is not configured.`,
|
|
173
|
+
unusable
|
|
174
|
+
? `config.json has a ${kind} by that name that akm ignores, because ${unusable.why}.`
|
|
175
|
+
: sharing.length > 1
|
|
176
|
+
? `${sharing.map((candidate) => `"${candidate}"`).join(", ")} all run the ${name} platform and none is named "default": name one of them.`
|
|
177
|
+
: configured.length > 0
|
|
178
|
+
? `Configured ${plural}: ${configured.join(", ")}.`
|
|
179
|
+
: `No ${plural} are configured.`,
|
|
180
|
+
near ? `Did you mean "${near}"?` : undefined,
|
|
181
|
+
]
|
|
182
|
+
.filter((sentence) => sentence !== undefined)
|
|
183
|
+
.join(" "), "SELECTION_NOT_CONFIGURED");
|
|
184
|
+
}
|
|
185
|
+
function selectTarget(input) {
|
|
186
|
+
const modelWork = input.modelWork === true;
|
|
187
|
+
const named = namedByLayers(input.config, input.layers, modelWork);
|
|
188
|
+
if (named) {
|
|
189
|
+
const connection = named.kind === "connection" ? input.config.connections?.[named.name] : undefined;
|
|
190
|
+
const harness = named.kind === "harness" ? harnessNamed(input.config, named.name) : undefined;
|
|
191
|
+
if (connection)
|
|
192
|
+
return { kind: "connection", name: named.name, connection };
|
|
193
|
+
if (harness)
|
|
194
|
+
return { kind: "harness", ...harness };
|
|
195
|
+
// A target that was asked for by name is never replaced by the default: that could send a private call to a remote
|
|
196
|
+
// service, or a call that must not touch files to an agent that can. Defaults apply only when nothing was named.
|
|
197
|
+
throw selectionNotConfigured(input.config, named.kind, named.name);
|
|
198
|
+
}
|
|
199
|
+
const target = defaultTarget(input.config, modelWork);
|
|
200
|
+
if (target)
|
|
201
|
+
return target;
|
|
202
|
+
const ambiguous = ambiguousDefaultAdvice(input.config);
|
|
203
|
+
const declined = modelWork ? defaultHarness(input.config) : undefined;
|
|
204
|
+
throw new ConfigError((ambiguous ? `${ambiguous}.` : undefined) ??
|
|
205
|
+
(declined?.harness.modelWork === false
|
|
206
|
+
? `No connection is configured, and harness "${declined.name}" is set not to run akm's model calls (modelWork: false), so there is nothing to run model work on. Add a connection with \`akm setup --endpoint URL\`.`
|
|
207
|
+
: modelWork
|
|
208
|
+
? "No connection or harness is configured, so there is nothing to run model work on."
|
|
209
|
+
: "No harness or connection is configured, so there is nothing to run agent work on."), modelWork ? "LLM_NOT_CONFIGURED" : "AGENT_NOT_CONFIGURED");
|
|
210
|
+
}
|
|
211
|
+
// ── Model ───────────────────────────────────────────────────────────────────
|
|
212
|
+
/** Every alias this config knows: the standard ones and any a connection or harness maps. */
|
|
213
|
+
function knownAliases(config) {
|
|
214
|
+
const aliases = new Set(STANDARD_ALIASES);
|
|
215
|
+
for (const entry of [...Object.values(config.connections ?? {}), ...Object.values(config.harnesses ?? {})]) {
|
|
216
|
+
for (const alias of Object.keys(entry.models ?? {}))
|
|
217
|
+
aliases.add(alias);
|
|
218
|
+
}
|
|
219
|
+
return aliases;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The entry a requested model names in `models`: the alias's entry; the exact name
|
|
223
|
+
* when it is not an alias; the first entry otherwise (no request, or an alias this
|
|
224
|
+
* map does not carry).
|
|
225
|
+
*/
|
|
226
|
+
function modelEntry(models, requested, aliases) {
|
|
227
|
+
if (requested !== undefined && Object.hasOwn(models, requested))
|
|
228
|
+
return models[requested];
|
|
229
|
+
if (requested !== undefined && !aliases.has(requested))
|
|
230
|
+
return requested;
|
|
231
|
+
return Object.values(models)[0];
|
|
232
|
+
}
|
|
233
|
+
// ── Runners ─────────────────────────────────────────────────────────────────
|
|
234
|
+
/** The first timeout that is set; `null` is a timeout (none), so it ends the search. */
|
|
235
|
+
function firstTimeout(...timeouts) {
|
|
236
|
+
return timeouts.find((timeout) => timeout !== undefined) ?? null;
|
|
237
|
+
}
|
|
238
|
+
/** What bounds a run when nothing sets a timeout, on a connection or a harness alike: agent work runs until it finishes, a model call stops at the model-call default. */
|
|
239
|
+
function defaultTimeout(modelWork) {
|
|
240
|
+
return modelWork ? DEFAULT_LLM_TIMEOUT_MS : DEFAULT_AGENT_TIMEOUT_MS;
|
|
241
|
+
}
|
|
242
|
+
/** The timeout the nearest layer sets, if any. */
|
|
243
|
+
function layerTimeout(layers) {
|
|
244
|
+
const value = nearest(layers, "timeout");
|
|
245
|
+
return value === undefined ? undefined : parseTimeout(value);
|
|
246
|
+
}
|
|
247
|
+
function connectionRunner(name, connection, requested, aliases, layers, modelWork, inherited) {
|
|
248
|
+
const entry = modelEntry(connection.models ?? {}, requested, aliases);
|
|
249
|
+
if (entry === undefined) {
|
|
250
|
+
throw new ConfigError(`Connection "${name}" lists no models, so no model can be chosen. Name one with \`akm models set fast <model> --connection ${name}\`, or run \`akm setup\`.`, "INVALID_CONFIG_FILE");
|
|
251
|
+
}
|
|
252
|
+
const { model, ...entryFields } = typeof entry === "string" ? { model: entry } : entry;
|
|
253
|
+
const connectionFields = Object.fromEntries(Object.entries(connection).filter(([key]) => !CONNECTION_OWNED_KEYS.has(key)));
|
|
254
|
+
const inference = mergeLayerInference(layers);
|
|
255
|
+
return {
|
|
256
|
+
kind: "connection",
|
|
257
|
+
name,
|
|
258
|
+
endpoint: connection.endpoint,
|
|
259
|
+
model,
|
|
260
|
+
request: mergeRequestFields(connectionFields, entryFields),
|
|
261
|
+
...(inference && Object.keys(inference).length > 0 ? { inference } : {}),
|
|
262
|
+
...(apiKeyReference(connection.apiKey) !== undefined ? { apiKey: connection.apiKey } : {}),
|
|
263
|
+
...(inherited ? { storedKey: false } : {}),
|
|
264
|
+
...(connection.contextLength !== undefined ? { contextLength: connection.contextLength } : {}),
|
|
265
|
+
...(connection.concurrency !== undefined ? { concurrency: connection.concurrency } : {}),
|
|
266
|
+
timeoutMs: firstTimeout(layerTimeout(layers), connection.timeoutMs, defaultTimeout(modelWork)),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/** The model name a harness alias holds. A harness is passed the name only, so an entry's request fields (a connection's) are ignored, with a word. */
|
|
270
|
+
function harnessAliasModel(name, alias, entry) {
|
|
271
|
+
if (typeof entry === "string")
|
|
272
|
+
return entry;
|
|
273
|
+
if (Object.keys(entry).length > 1) {
|
|
274
|
+
warnOnce(`resolution:alias-fields:${name}:${alias}`, `Harness "${name}" is passed only the model name of "${alias}"; the other fields of that entry are ignored.`);
|
|
275
|
+
}
|
|
276
|
+
return entry.model;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The harness model a request names, or `undefined` when the harness is left to pick
|
|
280
|
+
* its own: a layer that sets `model: null` asks for exactly that.
|
|
281
|
+
*/
|
|
282
|
+
function harnessModel(name, platform, harness, requested, aliases) {
|
|
283
|
+
if (requested === null)
|
|
284
|
+
return undefined;
|
|
285
|
+
const own = harness.models ?? {};
|
|
286
|
+
const shipped = getHarness(platform)?.models ?? {};
|
|
287
|
+
const [first] = Object.entries(own);
|
|
288
|
+
if (requested === undefined)
|
|
289
|
+
return first ? harnessAliasModel(name, first[0], first[1]) : undefined;
|
|
290
|
+
const entry = Object.hasOwn(own, requested) ? own[requested] : undefined;
|
|
291
|
+
if (entry !== undefined)
|
|
292
|
+
return harnessAliasModel(name, requested, entry);
|
|
293
|
+
if (Object.hasOwn(shipped, requested))
|
|
294
|
+
return shipped[requested];
|
|
295
|
+
if (!aliases.has(requested))
|
|
296
|
+
return requested;
|
|
297
|
+
// A harness with no map at all picks its own model whatever is asked; only one that maps others is worth a word.
|
|
298
|
+
if (Object.keys(own).length > 0 || Object.keys(shipped).length > 0) {
|
|
299
|
+
warnOnce(`resolution:no-model:${name}:${requested}`, `Harness "${name}" has no model for "${requested}", so it uses its own default. Map one under harnesses.${name}.models.`);
|
|
300
|
+
}
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
function harnessRunner(name, harness, requested, aliases, layers, modelWork) {
|
|
304
|
+
const platform = harness.platform ?? name;
|
|
305
|
+
const builtin = getBuiltinAgentProfile(platform);
|
|
306
|
+
if (harness.agent !== undefined && !HARNESS_NATIVE_AGENT_IDS.has(platform)) {
|
|
307
|
+
warnOnce(`resolution:agent:${name}`, `Harness "${name}" (${platform}) has no native agents; its agent setting is ignored.`);
|
|
308
|
+
}
|
|
309
|
+
const model = harnessModel(name, platform, harness, requested, aliases);
|
|
310
|
+
return {
|
|
311
|
+
kind: "harness",
|
|
312
|
+
name,
|
|
313
|
+
platform,
|
|
314
|
+
bin: harness.bin ?? builtin?.bin ?? platform,
|
|
315
|
+
args: harness.args ?? builtin?.args ?? [],
|
|
316
|
+
...(harness.workspace !== undefined ? { workspace: path.resolve(harness.workspace) } : {}),
|
|
317
|
+
...(harness.agent !== undefined && HARNESS_NATIVE_AGENT_IDS.has(platform) ? { agent: harness.agent } : {}),
|
|
318
|
+
...(model !== undefined ? { model } : {}),
|
|
319
|
+
timeoutMs: firstTimeout(layerTimeout(layers), harness.timeoutMs, defaultTimeout(modelWork)),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/** Where this execution runs and with which model, from the config and the layers that speak for it. */
|
|
323
|
+
export function resolveTarget(input) {
|
|
324
|
+
const target = selectTarget(input);
|
|
325
|
+
const requestedModel = nearest(input.layers, "model");
|
|
326
|
+
const requested = typeof requestedModel === "string" && requestedModel ? requestedModel : undefined;
|
|
327
|
+
const aliases = knownAliases(input.config);
|
|
328
|
+
const modelWork = input.modelWork === true;
|
|
329
|
+
return target.kind === "connection"
|
|
330
|
+
? connectionRunner(target.name, target.connection, requested, aliases, input.layers, modelWork, inheritedConnectionsOf(input.config).has(target.name))
|
|
331
|
+
: harnessRunner(target.name, target.harness, requestedModel === null ? null : requested, aliases, input.layers, modelWork);
|
|
332
|
+
}
|