akm-cli 0.10.261012-beta → 0.10.261014-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
|
@@ -2,42 +2,24 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* GitHub Copilot CLI
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - agent command builder → ./agent-builder.ts (copilotBuilder)
|
|
9
|
-
* - result extractor → ./result-extractor.ts (copilotResultExtractor)
|
|
10
|
-
*
|
|
11
|
-
* It also defines {@link CopilotHarness}, the {@link AkmHarness} descriptor
|
|
12
|
-
* that `HARNESS_REGISTRY` registers. This is the LOCAL Copilot CLI
|
|
13
|
-
* (`copilot -p …`); the cloud "Copilot coding agent" is a separate, future
|
|
14
|
-
* descriptor.
|
|
5
|
+
* GitHub Copilot CLI (`copilot`), the local headless CLI and not the cloud coding
|
|
6
|
+
* agent. `-p` runs one prompt; `--allow-all-tools` is what lets it run without
|
|
7
|
+
* asking for approval at each tool.
|
|
15
8
|
*/
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
import { copilotBuilder } from "./agent-builder.js";
|
|
19
|
-
import { copilotResultExtractor } from "./result-extractor.js";
|
|
20
|
-
export { COPILOT_PLATFORM, copilotBuilder } from "./agent-builder.js";
|
|
21
|
-
export { copilotResultExtractor } from "./result-extractor.js";
|
|
22
|
-
/**
|
|
23
|
-
* GitHub Copilot CLI (local headless CLI, not the cloud coding agent).
|
|
24
|
-
*
|
|
25
|
-
* Canonical id is `'copilot'`; no alias or distinct runtime identity.
|
|
26
|
-
*/
|
|
27
|
-
export class CopilotHarness extends BaseHarness {
|
|
9
|
+
import { withoutModelFlag, } from "../harness.js";
|
|
10
|
+
export class CopilotHarness {
|
|
28
11
|
id = "copilot";
|
|
29
12
|
displayName = "GitHub Copilot CLI";
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
});
|
|
13
|
+
profile = { bin: "copilot", args: [] };
|
|
14
|
+
systemPrompt = false;
|
|
15
|
+
nativeAgent = false;
|
|
16
|
+
confinable = false;
|
|
17
|
+
build({ bin, args }, req) {
|
|
18
|
+
const argv = [bin, ...(req.model ? withoutModelFlag(args) : args)];
|
|
19
|
+
if (req.model)
|
|
20
|
+
argv.push("--model", req.model);
|
|
21
|
+
if (req.prompt !== undefined)
|
|
22
|
+
argv.push("--allow-all-tools", "-p", req.prompt);
|
|
23
|
+
return { argv };
|
|
24
|
+
}
|
|
43
25
|
}
|
|
@@ -2,42 +2,26 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* Gemini CLI
|
|
6
|
-
*
|
|
7
|
-
* Per-harness barrel gathering the Gemini CLI integration surfaces:
|
|
8
|
-
* - agent command builder → ./agent-builder.ts (geminiBuilder)
|
|
9
|
-
* - result extractor → ./result-extractor.ts (geminiResultExtractor)
|
|
10
|
-
*
|
|
11
|
-
* It also defines {@link GeminiHarness}, the {@link AkmHarness} descriptor
|
|
12
|
-
* that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
|
|
13
|
-
* reader or config importer yet.
|
|
5
|
+
* Gemini CLI (`gemini`). `-p` runs one prompt headless. Autonomy flags
|
|
6
|
+
* (`--yolo`, `--approval-mode`) belong in the config's `args`, where the user opts in.
|
|
14
7
|
*/
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
import { geminiBuilder } from "./agent-builder.js";
|
|
18
|
-
import { geminiResultExtractor } from "./result-extractor.js";
|
|
19
|
-
export { GEMINI_PLATFORM, geminiBuilder } from "./agent-builder.js";
|
|
20
|
-
export { geminiResultExtractor } from "./result-extractor.js";
|
|
21
|
-
/**
|
|
22
|
-
* Gemini CLI.
|
|
23
|
-
*
|
|
24
|
-
* Canonical id is `'gemini'`; no alias or distinct runtime identity.
|
|
25
|
-
*/
|
|
26
|
-
export class GeminiHarness extends BaseHarness {
|
|
8
|
+
import { withoutModelFlag, } from "../harness.js";
|
|
9
|
+
export class GeminiHarness {
|
|
27
10
|
id = "gemini";
|
|
28
11
|
displayName = "Gemini CLI";
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
|
|
33
|
-
// The matrix's identity marker: Gemini CLI stamps GEMINI_CLI=1 only on
|
|
34
|
-
// processes it spawns, so it genuinely means "running under gemini" (it is
|
|
35
|
-
// not a user-profile config var) — but its VALUE ("1") is a bare flag, not
|
|
36
|
-
// a session id, so it is registered as `presenceEnv` (harness inference
|
|
37
|
-
// only), never `identityEnv` (whose values persist as agent_session_id).
|
|
12
|
+
profile = { bin: "gemini", args: [] };
|
|
13
|
+
// GEMINI_CLI=1 is stamped only on processes Gemini CLI spawns, so it means "running under
|
|
14
|
+
// gemini"; its value is a bare flag, not a session id.
|
|
38
15
|
presenceEnv = ["GEMINI_CLI"];
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
})
|
|
16
|
+
systemPrompt = false;
|
|
17
|
+
nativeAgent = false;
|
|
18
|
+
confinable = false;
|
|
19
|
+
build({ bin, args }, req) {
|
|
20
|
+
const argv = [bin, ...(req.model ? withoutModelFlag(args) : args)];
|
|
21
|
+
if (req.model)
|
|
22
|
+
argv.push("--model", req.model);
|
|
23
|
+
if (req.prompt !== undefined)
|
|
24
|
+
argv.push("-p", req.prompt);
|
|
25
|
+
return { argv };
|
|
26
|
+
}
|
|
43
27
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* The model the config's own `args` select, as `--model X` or `--model=X` (the
|
|
6
|
+
* last one wins).
|
|
7
|
+
*/
|
|
8
|
+
export function modelFromArgs(args) {
|
|
9
|
+
let model;
|
|
10
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
11
|
+
const arg = args[index];
|
|
12
|
+
if (arg === "--model")
|
|
13
|
+
model = args[index + 1];
|
|
14
|
+
else if (arg?.startsWith("--model="))
|
|
15
|
+
model = arg.slice("--model=".length);
|
|
16
|
+
}
|
|
17
|
+
return model;
|
|
18
|
+
}
|
|
19
|
+
/** `args` without any `--model X` or `--model=X`, for a builder that adds the request's model itself, so it is passed once. */
|
|
20
|
+
export function withoutModelFlag(args) {
|
|
21
|
+
const kept = [];
|
|
22
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
23
|
+
const arg = args[index];
|
|
24
|
+
if (arg === undefined)
|
|
25
|
+
continue;
|
|
26
|
+
if (arg === "--model")
|
|
27
|
+
index += 1;
|
|
28
|
+
else if (!arg.startsWith("--model="))
|
|
29
|
+
kept.push(arg);
|
|
30
|
+
}
|
|
31
|
+
return kept;
|
|
32
|
+
}
|
|
33
|
+
/** `args` less a leading `subcommand` the builder writes itself, so an authored one is not doubled. */
|
|
34
|
+
export function withoutLeading(args, subcommand) {
|
|
35
|
+
return args[0] === subcommand ? args.slice(1) : [...args];
|
|
36
|
+
}
|
|
@@ -11,8 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Adding a harness: create `./<id>/index.ts`, add its class here. Removing:
|
|
13
13
|
* delete both. This module must stay free of runtime `core/config` imports
|
|
14
|
-
* (config derives `VALID_HARNESS_IDS` from here)
|
|
15
|
-
* (e.g. `opencode-sdk/sdk-runner.ts`) is imported by its caller, not here.
|
|
14
|
+
* (config derives `VALID_HARNESS_IDS` from here).
|
|
16
15
|
*/
|
|
17
16
|
import { AiderHarness } from "./aider/index.js";
|
|
18
17
|
import { AmazonqHarness } from "./amazonq/index.js";
|
|
@@ -21,28 +20,21 @@ import { CodexHarness } from "./codex/index.js";
|
|
|
21
20
|
import { CopilotHarness } from "./copilot/index.js";
|
|
22
21
|
import { GeminiHarness } from "./gemini/index.js";
|
|
23
22
|
import { OpencodeHarness } from "./opencode/index.js";
|
|
24
|
-
import { OpencodeSdkHarness } from "./opencode-sdk/index.js";
|
|
25
23
|
import { OpenhandsHarness } from "./openhands/index.js";
|
|
26
24
|
import { PiHarness } from "./pi/index.js";
|
|
27
|
-
import { isSessionLogHarness } from "./types.js";
|
|
28
|
-
export { isSessionLogHarness } from "./types.js";
|
|
29
25
|
/**
|
|
30
|
-
* The
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* which lets `VALID_HARNESS_IDS` stay a literal tuple — `HarnessId`,
|
|
34
|
-
* `z.enum(...)`, and the `platform` union all need the literal types.
|
|
26
|
+
* The registered harnesses, with each entry keeping its literal `id` so that
|
|
27
|
+
* `VALID_HARNESS_IDS` can stay a literal tuple (`HarnessId`, `z.enum(...)` and
|
|
28
|
+
* the `platform` union all need the literal types).
|
|
35
29
|
*/
|
|
36
30
|
// Order is significant: VALID_HARNESS_IDS derives from this array and feeds the
|
|
37
|
-
// committed JSON-schema enum order. The original [opencode, claude
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
export const HARNESS_REGISTRY = Object.freeze([
|
|
31
|
+
// committed JSON-schema enum order. The original [opencode, claude] prefix is
|
|
32
|
+
// preserved so the pre-unification portion of the generated schema enum does not
|
|
33
|
+
// reorder; the seven P2 harness adapters are appended after it, which extends the
|
|
34
|
+
// enum additively (schemas/akm-config.json is regenerated in lockstep).
|
|
35
|
+
const REGISTERED = [
|
|
43
36
|
new OpencodeHarness(),
|
|
44
37
|
new ClaudeHarness(),
|
|
45
|
-
new OpencodeSdkHarness(),
|
|
46
38
|
new CodexHarness(),
|
|
47
39
|
new CopilotHarness(),
|
|
48
40
|
new PiHarness(),
|
|
@@ -50,49 +42,26 @@ export const HARNESS_REGISTRY = Object.freeze([
|
|
|
50
42
|
new AiderHarness(),
|
|
51
43
|
new AmazonqHarness(),
|
|
52
44
|
new OpenhandsHarness(),
|
|
53
|
-
]
|
|
45
|
+
];
|
|
46
|
+
/** The single registration point. */
|
|
47
|
+
export const HARNESS_REGISTRY = Object.freeze([...REGISTERED]);
|
|
54
48
|
/** Lookup by the one supported harness id. */
|
|
55
49
|
export const HARNESS_BY_ID = new Map(HARNESS_REGISTRY.map((h) => [h.id, h]));
|
|
56
50
|
/**
|
|
57
51
|
* Canonical, ordered list of valid harness / platform ids. The Zod
|
|
58
|
-
* `AgentPlatformSchema` enum, the
|
|
52
|
+
* `AgentPlatformSchema` enum, the harness platform union, and
|
|
59
53
|
* setup's `DetectedHarness` union all derive from this so they cannot drift.
|
|
60
54
|
*/
|
|
61
|
-
export const VALID_HARNESS_IDS = Object.freeze(
|
|
62
|
-
/**
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter(isSessionLogHarness);
|
|
69
|
-
/** Harnesses that can be dispatched as an agent CLI / SDK. */
|
|
70
|
-
export const AGENT_DISPATCH_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.agentDispatch);
|
|
71
|
-
const idsWith = (flag) => new Set(HARNESS_REGISTRY.filter(flag).map((h) => h.id));
|
|
72
|
-
/** Harness ids whose `capabilities.agentDispatch` is `true`. */
|
|
73
|
-
export const HARNESS_AGENT_DISPATCH_IDS = idsWith((h) => h.capabilities.agentDispatch);
|
|
74
|
-
/** Harness ids that confine the model-work tool policy, so unattended model work may run on them. */
|
|
75
|
-
export const HARNESS_MODEL_WORK_IDS = idsWith((h) => h.capabilities.modelWork);
|
|
76
|
-
/** Harness ids that can run a named native agent, so an engine may name a default `agent`. */
|
|
77
|
-
export const HARNESS_NATIVE_AGENT_IDS = idsWith((h) => h.capabilities.nativeAgent);
|
|
55
|
+
export const VALID_HARNESS_IDS = Object.freeze(REGISTERED.map((h) => h.id));
|
|
56
|
+
/** The platforms a `harnesses` entry may name: every harness in the registry. */
|
|
57
|
+
export const HARNESS_CONFIG_PLATFORMS = VALID_HARNESS_IDS;
|
|
58
|
+
/** Harnesses that expose readable native session logs. */
|
|
59
|
+
export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter((h) => h.sessionLogProvider !== undefined);
|
|
60
|
+
/** Harness ids that can run a named native agent, so a harness may name a default `agent`. */
|
|
61
|
+
export const HARNESS_NATIVE_AGENT_IDS = new Set(HARNESS_REGISTRY.filter((h) => h.nativeAgent).map((h) => h.id));
|
|
78
62
|
/**
|
|
79
63
|
* Resolve an exact harness id to its descriptor, or `undefined` if unknown.
|
|
80
64
|
*/
|
|
81
65
|
export function getHarness(id) {
|
|
82
66
|
return HARNESS_BY_ID.get(id);
|
|
83
67
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Default agent-profile name for a detected harness id (#566).
|
|
86
|
-
*
|
|
87
|
-
* Used by `akm setup`'s headless/recommended-config path so a newly added
|
|
88
|
-
* dispatch-capable harness gets a usable default profile name (its canonical
|
|
89
|
-
* id) instead of falling through a hardcoded if-chain with no default. Returns
|
|
90
|
-
* `undefined` for `"none"` or any id that is unknown / not agent-dispatch
|
|
91
|
-
* capable.
|
|
92
|
-
*/
|
|
93
|
-
export function defaultProfileName(detected) {
|
|
94
|
-
const h = HARNESS_BY_ID.get(detected);
|
|
95
|
-
if (!h?.capabilities.agentDispatch)
|
|
96
|
-
return undefined;
|
|
97
|
-
return h.id;
|
|
98
|
-
}
|
|
@@ -2,120 +2,152 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* OpenCode
|
|
5
|
+
* OpenCode command builder: the `opencode run` CLI of the opencode harness
|
|
6
|
+
* (#1244), for both majors, treated like the Claude and Codex CLIs. The user's
|
|
7
|
+
* OpenCode owns its config, logins and sessions; akm hands it a prompt and reads
|
|
8
|
+
* the reply from stdout.
|
|
6
9
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `agent/builders.ts`, which imports this builder back into `BUILTIN_BUILDERS`.
|
|
10
|
+
* The prompt goes on stdin: `opencode run` alters an argv message (quotes change,
|
|
11
|
+
* inner quotes are escaped) and a prompt that starts with `-` could be taken for
|
|
12
|
+
* a flag; stdin is read verbatim. akm closes it after the write, which the CLI
|
|
13
|
+
* needs: with stdin open it waits for more input.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
* one
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Agent work adds nothing: `opencode run`, the authored args as written, `--model` when akm
|
|
16
|
+
* names one, `--agent` when the asset names one, and the prompt on stdin. The run is the
|
|
17
|
+
* user's own, on their OpenCode as they have it set up.
|
|
18
|
+
*
|
|
19
|
+
* Model work is akm's own process. It sets `OPENCODE_DISABLE_FREE_MODELS` (OpenCode 2.1.2 and
|
|
20
|
+
* later, where the variable first appears): with no usable provider, OpenCode 2 would
|
|
21
|
+
* otherwise send akm's data to its hosted free model. The variable deletes every zero-cost
|
|
22
|
+
* model of the `opencode` and `opencode-go` providers, so it has no place on agent work,
|
|
23
|
+
* where it would override a model the user chose. On OpenCode 2 model work also gets
|
|
24
|
+
* `--standalone`, which keeps the run to one process that ends with it (the default attaches
|
|
25
|
+
* to a background service that outlives the CLI, is shared across users on one port, ignores
|
|
26
|
+
* inline config and replays killed sessions at every start), and `--title`, which names the
|
|
27
|
+
* session and spares the second model request that would otherwise generate a title.
|
|
28
|
+
*
|
|
29
|
+
* A binary whose version cannot be read runs model work as OpenCode 1, with one warning that says so.
|
|
30
|
+
*
|
|
31
|
+
* Model work drops the config's `args`, keeping the model they name, as the
|
|
32
|
+
* Claude and Codex shells do. On OpenCode 2 it runs as {@link MODEL_WORK_AGENT},
|
|
33
|
+
* an agent defined inline for the run whose tools are limited to reading and
|
|
34
|
+
* searching, added to the user's own inline config; OpenCode 1 cannot be
|
|
35
|
+
* restricted and runs it unrestricted, with a one-line warning.
|
|
17
36
|
*/
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
|
|
37
|
+
import { asRecord, parseJsonc } from "../../../core/common.js";
|
|
38
|
+
import { warnOnce } from "../../../core/warn.js";
|
|
39
|
+
import { modelFromArgs, withoutLeading, withoutModelFlag, } from "../harness.js";
|
|
40
|
+
import { detectOpencodeMajor, isOpencode2 } from "./version.js";
|
|
41
|
+
/** The agent OpenCode 2 runs akm's model work as, limited to reading and searching; the name also marks those sessions in the user's history (`./session-log-v2.ts`). */
|
|
42
|
+
export const MODEL_WORK_AGENT = "akm-model-work";
|
|
23
43
|
/**
|
|
24
|
-
* OpenCode 2's
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* `
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* a non-interactive run rejects a permission request, on both majors.
|
|
44
|
+
* The agent's definition, in OpenCode 2's native shape, passed inline so it merges over the user's config and is
|
|
45
|
+
* never written anywhere. Its permission rules are default-deny with the reading tools allowed after it (the last
|
|
46
|
+
* matching rule wins; measured on OpenCode 2.1.2): `*` denied removes every tool, one a plugin registers that akm has
|
|
47
|
+
* never heard of included, and the allows give back `read`, `glob` and `grep` and, when the akm plugin is installed,
|
|
48
|
+
* `akm_search`, `akm_show` and `akm_curate`. Nothing else is allowed. This limits the tools; a plugin's own `setup`
|
|
49
|
+
* and hooks still run.
|
|
31
50
|
*/
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
51
|
+
const MODEL_WORK_AGENT_DEFINITION = {
|
|
52
|
+
mode: "primary",
|
|
53
|
+
permissions: [
|
|
54
|
+
{ action: "*", resource: "*", effect: "deny" },
|
|
55
|
+
...["read", "glob", "grep", "akm_search", "akm_show", "akm_curate"].map((action) => ({
|
|
56
|
+
action,
|
|
57
|
+
resource: "*",
|
|
58
|
+
effect: "allow",
|
|
59
|
+
})),
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
const CONFIG_CONTENT_ENV = "OPENCODE_CONFIG_CONTENT";
|
|
39
63
|
/**
|
|
40
|
-
* The
|
|
41
|
-
* `
|
|
42
|
-
*
|
|
64
|
+
* The inline config model work runs with: the user's own `OPENCODE_CONFIG_CONTENT` as it is, with akm's agent set on
|
|
65
|
+
* `agents.akm-model-work`, the one key akm's definition wins. OpenCode 2 reads that native `agents` map over the
|
|
66
|
+
* legacy `agent` one, so a same-named entry the user keeps in `agent` is left out rather than left to conflict. The
|
|
67
|
+
* child's value is built from the parent's, so a provider, model or key the user keeps only there stays. It is read as
|
|
68
|
+
* OpenCode reads it, as JSONC (comments and trailing commas), and written back as JSON; content that reads only once
|
|
69
|
+
* its `{env:NAME}` references are replaced (one written outside a string) is read the way OpenCode replaces them
|
|
70
|
+
* ({@link withEnvReferences}). Content that is not valid JSONC holding an object either way is left out, with one
|
|
71
|
+
* warning.
|
|
43
72
|
*/
|
|
44
|
-
function
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
73
|
+
function modelWorkConfig() {
|
|
74
|
+
const content = process.env[CONFIG_CONTENT_ENV]?.trim();
|
|
75
|
+
const user = content ? userConfig(content) : undefined;
|
|
76
|
+
if (content && !user) {
|
|
77
|
+
warnOnce("opencode-config-content", `${CONFIG_CONTENT_ENV} is not valid JSONC holding an object, so OpenCode model work runs without it.`);
|
|
78
|
+
}
|
|
79
|
+
const config = {
|
|
80
|
+
...user,
|
|
81
|
+
agents: { ...asRecord(user?.agents), [MODEL_WORK_AGENT]: MODEL_WORK_AGENT_DEFINITION },
|
|
82
|
+
};
|
|
83
|
+
const legacy = asRecord(user?.agent);
|
|
84
|
+
if (legacy && Object.hasOwn(legacy, MODEL_WORK_AGENT)) {
|
|
85
|
+
const { [MODEL_WORK_AGENT]: _replaced, ...others } = legacy;
|
|
86
|
+
config.agent = others;
|
|
58
87
|
}
|
|
59
|
-
|
|
60
|
-
|
|
88
|
+
return JSON.stringify(config);
|
|
89
|
+
}
|
|
90
|
+
function userConfig(content) {
|
|
91
|
+
return jsoncObject(content) ?? jsoncObject(withEnvReferences(content));
|
|
92
|
+
}
|
|
93
|
+
function jsoncObject(content) {
|
|
94
|
+
try {
|
|
95
|
+
return asRecord(parseJsonc(content));
|
|
61
96
|
}
|
|
62
|
-
|
|
63
|
-
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
64
99
|
}
|
|
65
|
-
return args;
|
|
66
100
|
}
|
|
67
101
|
/**
|
|
68
|
-
* OpenCode
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* exits 1 on `--system-prompt`), so the shared lowerer composes a persona
|
|
73
|
-
* into the prompt.
|
|
74
|
-
*
|
|
75
|
-
* Tool policy is omitted: opencode manages tool access through its own agent
|
|
76
|
-
* config files, not via CLI flags. The one exception is the model-work tool
|
|
77
|
-
* policy: the builder injects its confined agent through
|
|
78
|
-
* `OPENCODE_CONFIG_CONTENT` and selects it with `--agent`. That command is
|
|
79
|
-
* akm's own: the engine's `args` are left out, because one such as `--attach`
|
|
80
|
-
* or `--dir` would move the run out of the injected config or the scratch
|
|
81
|
-
* working directory. Only the model they name is kept.
|
|
82
|
-
*
|
|
83
|
-
* Model work's agent carries the request's inference options
|
|
84
|
-
* (`./model-config.ts`). Any other dispatch injects nothing and carries none, so
|
|
85
|
-
* the model's own opencode config applies: set inference there.
|
|
102
|
+
* `{env:NAME}` replaced as OpenCode replaces it in this variable before it parses it (`ConfigVariable.substitute`):
|
|
103
|
+
* by the variable's value, or nothing when it is unset or empty, as written where the result reads as JSONC, else
|
|
104
|
+
* escaped as the inside of a JSON string. A `{file:path}` is left for the OpenCode akm runs, which replaces it against
|
|
105
|
+
* its own directory, as it would in-process.
|
|
86
106
|
*/
|
|
107
|
+
function withEnvReferences(content) {
|
|
108
|
+
const replaced = (escaped) => content.replace(/\{env:([^}]+)\}/g, (_, name) => {
|
|
109
|
+
const value = process.env[name] || "";
|
|
110
|
+
return escaped ? JSON.stringify(value).slice(1, -1) : value;
|
|
111
|
+
});
|
|
112
|
+
const raw = replaced(false);
|
|
113
|
+
try {
|
|
114
|
+
parseJsonc(raw);
|
|
115
|
+
return raw;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return replaced(true);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const NO_FREE_MODELS = { OPENCODE_DISABLE_FREE_MODELS: "1" };
|
|
87
122
|
export const opencodeBuilder = {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
...standalone(major, []),
|
|
106
|
-
"--agent",
|
|
107
|
-
MODEL_WORK_OPENCODE_AGENT,
|
|
108
|
-
...(model ? ["--model", model] : []),
|
|
109
|
-
"--",
|
|
110
|
-
req.prompt,
|
|
111
|
-
],
|
|
112
|
-
env: {
|
|
113
|
-
...modelWorkPluginEnv(),
|
|
114
|
-
OPENCODE_CONFIG_CONTENT: JSON.stringify(modelWorkOpencodeConfig(agentOptions)),
|
|
115
|
-
},
|
|
116
|
-
};
|
|
123
|
+
build({ bin, args }, req) {
|
|
124
|
+
const agent = req.agent ? ["--agent", req.agent] : [];
|
|
125
|
+
const model = req.model ? ["--model", req.model] : [];
|
|
126
|
+
if (req.prompt === undefined) {
|
|
127
|
+
// An interactive launch is the TUI, which `run` (headless) is not.
|
|
128
|
+
const authored = withoutLeading(args, "run");
|
|
129
|
+
return { argv: [bin, ...(req.model ? withoutModelFlag(authored) : authored), ...agent, ...model] };
|
|
130
|
+
}
|
|
131
|
+
if (!req.modelWork) {
|
|
132
|
+
return { argv: [bin, ...(req.model ? withoutModelFlag(args) : args), ...agent, ...model], stdin: req.prompt };
|
|
133
|
+
}
|
|
134
|
+
const oc2 = isOpencode2(bin);
|
|
135
|
+
if (!oc2 && detectOpencodeMajor(bin).reportedMajor === undefined) {
|
|
136
|
+
warnOnce(`opencode-version-unreadable:${bin}`, `Could not read the version of ${bin}, so akm runs its model work as OpenCode 1: no --standalone (an OpenCode 2 would attach to its shared background service) and unrestricted. Check \`${bin} --version\`.`);
|
|
137
|
+
}
|
|
138
|
+
if (!oc2) {
|
|
139
|
+
warnOnce("opencode-1-model-work", "OpenCode 1 cannot restrict its tools, so model work on it runs unrestricted, in a scratch directory. OpenCode 2 limits its tools to reading and searching.");
|
|
117
140
|
}
|
|
118
|
-
const
|
|
119
|
-
return {
|
|
141
|
+
const named = req.model ?? modelFromArgs(args);
|
|
142
|
+
return {
|
|
143
|
+
argv: [
|
|
144
|
+
bin,
|
|
145
|
+
"run",
|
|
146
|
+
...(oc2 ? ["--standalone", "--title", "akm", "--agent", MODEL_WORK_AGENT] : []),
|
|
147
|
+
...(named ? ["--model", named] : []),
|
|
148
|
+
],
|
|
149
|
+
env: { ...NO_FREE_MODELS, ...(oc2 ? { [CONFIG_CONTENT_ENV]: modelWorkConfig() } : {}) },
|
|
150
|
+
stdin: req.prompt,
|
|
151
|
+
};
|
|
120
152
|
},
|
|
121
153
|
};
|
|
@@ -1,55 +1,33 @@
|
|
|
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
|
-
/**
|
|
5
|
-
* OpenCode harness (#564).
|
|
6
|
-
*
|
|
7
|
-
* Per-harness barrel that gathers the OpenCode integration surfaces previously
|
|
8
|
-
* scattered across the codebase:
|
|
9
|
-
* - session-log reader → ./session-log.ts (OpenCodeProvider)
|
|
10
|
-
* - agent command builder → ./agent-builder.ts (opencodeBuilder)
|
|
11
|
-
* - config importer → ./config-import.ts (openCodeImporter)
|
|
12
|
-
*
|
|
13
|
-
* It also defines {@link OpencodeHarness}, the {@link AkmHarness} descriptor
|
|
14
|
-
* that `HARNESS_REGISTRY` registers.
|
|
15
|
-
*
|
|
16
|
-
* id normalization: OpenCode's canonical id (`'opencode'`) is also its runtime
|
|
17
|
-
* identity and session-log provider name — there is no historical split (unlike
|
|
18
|
-
* Claude Code's 'claude' vs 'claude'), so no alias bridge is needed.
|
|
19
|
-
*/
|
|
20
|
-
import { OPENCODE_ENV_PASSTHROUGH } from "../../../core/spawn-env.js";
|
|
21
|
-
import { caps } from "../shared.js";
|
|
22
|
-
import { BaseHarness } from "../types.js";
|
|
23
4
|
import { opencodeBuilder } from "./agent-builder.js";
|
|
24
|
-
import { openCodeImporter } from "./config-import.js";
|
|
25
5
|
import { OpenCodeProvider } from "./session-log.js";
|
|
6
|
+
import { isOpencode2, OPENCODE_BIN } from "./version.js";
|
|
26
7
|
export { opencodeBuilder } from "./agent-builder.js";
|
|
27
|
-
export { openCodeImporter } from "./config-import.js";
|
|
28
8
|
export { OpenCodeProvider } from "./session-log.js";
|
|
29
9
|
/**
|
|
30
10
|
* OpenCode.
|
|
31
11
|
*
|
|
32
12
|
* Canonical id is `'opencode'`; it has no distinct runtime identity or alias.
|
|
33
13
|
*/
|
|
34
|
-
export class OpencodeHarness
|
|
14
|
+
export class OpencodeHarness {
|
|
35
15
|
id = "opencode";
|
|
36
16
|
displayName = "OpenCode";
|
|
37
17
|
// Home-relative config dir scanned by `akm setup` (#567). OpenCode has a
|
|
38
18
|
// session-log provider, so offering it as a stash source is functional.
|
|
39
19
|
setupDetectionDir = ".config/opencode";
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
profile = { bin: "opencode", args: ["run"], envPassthrough: OPENCODE_ENV_PASSTHROUGH };
|
|
20
|
+
build = opencodeBuilder.build;
|
|
21
|
+
profile = { bin: OPENCODE_BIN, args: ["run"] };
|
|
43
22
|
// ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
|
|
44
23
|
// Session-id env marker for run attribution.
|
|
45
24
|
identityEnv = ["OPENCODE_SESSION_ID"];
|
|
46
25
|
sessionLogProvider = () => new OpenCodeProvider();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
26
|
+
systemPrompt = false;
|
|
27
|
+
nativeAgent = true;
|
|
28
|
+
// Model work has its tools limited to reading and searching on OpenCode 2 only: its CLI takes an agent defined
|
|
29
|
+
// inline for the run (./agent-builder.ts), OpenCode 1's cannot be restricted and runs it unrestricted, with a warning.
|
|
30
|
+
// Lowering asks for the limited run either way; setup asks whether the installed OpenCode can give it.
|
|
31
|
+
confinable = true;
|
|
32
|
+
confinableInstalled = (bin) => isOpencode2(bin);
|
|
55
33
|
}
|