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
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* decisions, used by the engine on both a fresh run and a resume, so the same
|
|
7
7
|
* frozen plan produces byte-identical unit graphs. Pure except the
|
|
8
8
|
* gate-evaluation journaling; never dispatches and never writes step rows.
|
|
9
|
-
* See docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md.
|
|
10
9
|
*/
|
|
11
10
|
import { createHash } from "node:crypto";
|
|
12
11
|
import unitPreambleTemplate from "../../assets/prompts/workflow-unit-preamble.md" with { type: "text" };
|
|
@@ -119,8 +118,7 @@ export function computeStepWorkList(plan, input) {
|
|
|
119
118
|
const reducer = root.kind === "map" ? root.reducer : "collect";
|
|
120
119
|
const scope = { params: input.params, stepOutputs: input.stepOutputs };
|
|
121
120
|
// Instructions are ALWAYS the step's body prose, byte-exact — never
|
|
122
|
-
// templated, never scanned for reference syntax
|
|
123
|
-
// unification, spec §2.3). Only `map.over` / `inputs[]`
|
|
121
|
+
// templated, never scanned for reference syntax. Only `map.over` / `inputs[]`
|
|
124
122
|
// carry the closed reference grammar.
|
|
125
123
|
// Resolve the step's declared `inputs:` ONCE (shared by every unit in this
|
|
126
124
|
// step — map items differ, declared inputs do not): prior-step artifacts
|
|
@@ -197,9 +195,9 @@ export function computeStepWorkList(plan, input) {
|
|
|
197
195
|
const execInputsJson = frozenExec && resolvedInputs.length > 0
|
|
198
196
|
? (canonicalJson(Object.fromEntries(resolvedInputs.map((entry) => [entry.reference, entry.value]))) ?? "{}")
|
|
199
197
|
: undefined;
|
|
200
|
-
//
|
|
198
|
+
// The resolved effective task-composition inputs,
|
|
201
199
|
// serialized ONCE here (mirrors execParamsJson/execInputsJson above) —
|
|
202
|
-
//
|
|
200
|
+
// the delivery (buildUnitPrompt's "## Task inputs" block,
|
|
203
201
|
// buildExecContextEnv's AKM_TASK_INPUTS) reads both back per unit.
|
|
204
202
|
const taskInputsJson = hasTaskInputs ? (canonicalJson(taskInputsResolution.values) ?? "{}") : undefined;
|
|
205
203
|
const ctx = {
|
|
@@ -244,13 +242,11 @@ function buildStepWorkUnit(ctx, unitId, item, index) {
|
|
|
244
242
|
params: input.params,
|
|
245
243
|
...(isFanOut ? { item, itemIndex: index } : {}),
|
|
246
244
|
...(resolvedInputs.length > 0 ? { inputs: resolvedInputs } : {}),
|
|
247
|
-
//
|
|
245
|
+
// The composed task's resolved
|
|
248
246
|
// `inputBindings`, when non-empty — see StepWorkUnitContext.taskInputs.
|
|
249
247
|
...(taskInputs && Object.keys(taskInputs).length > 0 ? { taskInputs } : {}),
|
|
250
248
|
...(input.gateFeedback ? { gateFeedback: input.gateFeedback } : {}),
|
|
251
|
-
//
|
|
252
|
-
// instruction itself; a direct-LLM unit carries it in its prompt.
|
|
253
|
-
...(template.schema && ctx.runner === "llm" ? { schema: template.schema } : {}),
|
|
249
|
+
// Request lowering appends the schema instruction itself.
|
|
254
250
|
instructions: template.instructions,
|
|
255
251
|
});
|
|
256
252
|
const inputHash = computeUnitInputHash(ctx, item);
|
|
@@ -265,7 +261,7 @@ function buildStepWorkUnit(ctx, unitId, item, index) {
|
|
|
265
261
|
frozenTarget: target,
|
|
266
262
|
environment: template.environment,
|
|
267
263
|
...(frozenExec ? { execContext: buildExecContextEnv({ ctx, unitId, item, index }) } : {}),
|
|
268
|
-
...(target.kind === "command" && target.request.model?.
|
|
264
|
+
...(target.kind === "command" && target.request.model?.model ? { model: target.request.model.model } : {}),
|
|
269
265
|
timeoutMs: ctx.timeoutMs,
|
|
270
266
|
...(template.schema ? { schema: template.schema } : {}),
|
|
271
267
|
...(template.retry ? { retry: template.retry } : {}),
|
|
@@ -311,7 +307,6 @@ function buildExecContextEnv(args) {
|
|
|
311
307
|
* to do (names, never secret values). Informational — resume reuses a
|
|
312
308
|
* completed row by unit id. `gateFeedback`/`taskInputs` are included only when
|
|
313
309
|
* present so the loop-1, binding-free preimage keeps its `hashVersion` 7 shape.
|
|
314
|
-
* See docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md.
|
|
315
310
|
*/
|
|
316
311
|
function computeUnitInputHash(ctx, item) {
|
|
317
312
|
return createHash("sha256")
|
|
@@ -837,8 +832,8 @@ function judgeFailureNotes(runId, stepId, cause) {
|
|
|
837
832
|
return (`Step "${stepId}" could not be verified: ${cause}. ` +
|
|
838
833
|
`This is a verification-judge failure, not a verdict — no gate loop was consumed and the step's ` +
|
|
839
834
|
`journaled units are preserved. Fix the verifier configuration or service, then run ` +
|
|
840
|
-
`\`akm workflow resume ${runId}\` to re-evaluate the gate
|
|
841
|
-
`without re-dispatching units.`);
|
|
835
|
+
`\`akm workflow resume ${runId}\` and \`akm workflow run ${runId}\` to re-evaluate the gate ` +
|
|
836
|
+
`against the existing results without re-dispatching units.`);
|
|
842
837
|
}
|
|
843
838
|
/**
|
|
844
839
|
* Complete a step `blocked` for a verifier-INFRASTRUCTURE failure and return
|
|
@@ -944,7 +939,7 @@ export async function finalizeExecutedStep(input) {
|
|
|
944
939
|
// rejection: block for resume without invoking the gate (no loop consumed).
|
|
945
940
|
if (completionCriteria.some((c) => c.trim().length > 0) && !innerJudge) {
|
|
946
941
|
return blockFinalizedStep(input, "this step declares completion criteria but no verification judge is available " +
|
|
947
|
-
"(the frozen plan resolves no judge —
|
|
942
|
+
"(the frozen plan resolves no judge — configure a connection or harness with `akm setup`, or restore the judge configuration)");
|
|
948
943
|
}
|
|
949
944
|
// Artifact-judging gate: a criteria-bearing executing step is judged on a
|
|
950
945
|
// summary BUILT FROM the promoted artifact; everything else keeps the machine
|
|
@@ -966,7 +961,7 @@ export async function finalizeExecutedStep(input) {
|
|
|
966
961
|
const summaryJudge = innerJudge
|
|
967
962
|
? async (prompt) => {
|
|
968
963
|
if (gateTarget) {
|
|
969
|
-
const engineName = gateTarget.request.
|
|
964
|
+
const engineName = gateTarget.request.target.name;
|
|
970
965
|
if (!engineName)
|
|
971
966
|
throw new Error(`Gate ${stepId} has no frozen engine identity.`);
|
|
972
967
|
gateUnit = {
|
|
@@ -975,7 +970,7 @@ export async function finalizeExecutedStep(input) {
|
|
|
975
970
|
stepId,
|
|
976
971
|
loop: gateLoop,
|
|
977
972
|
engine: engineName,
|
|
978
|
-
model: gateTarget.request.model?.
|
|
973
|
+
model: gateTarget.request.model?.model ?? null,
|
|
979
974
|
runner: gateTarget.runner.kind,
|
|
980
975
|
// The gate prefix rides the unit prefix's version — unit and gate
|
|
981
976
|
// hashVersion are one vocabulary (p3a §0.1; the R-R15 fix moved
|
|
@@ -1059,7 +1054,8 @@ export async function finalizeExecutedStep(input) {
|
|
|
1059
1054
|
}
|
|
1060
1055
|
// Judge infrastructure failure: the fail-closed rejection is synthetic, not a
|
|
1061
1056
|
// verdict. Consume NO gate loop; block the step (and therefore the run) so
|
|
1062
|
-
// `akm workflow resume` retries the gate over the
|
|
1057
|
+
// `akm workflow resume` then `akm workflow run` retries the gate over the
|
|
1058
|
+
// journaled units.
|
|
1063
1059
|
if (rejection && judgeFailed) {
|
|
1064
1060
|
return blockFinalizedStep(input, judgeFailure ?? "the verification judge failed");
|
|
1065
1061
|
}
|
|
@@ -2,24 +2,17 @@
|
|
|
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
|
import { ConfigError } from "../../core/errors.js";
|
|
5
|
-
import { assertFrozenDirectoryContained } from "../../execution/directory-identity.js";
|
|
6
5
|
import { canonicalResolvedExecutionRequest } from "../../execution/resolved-request.js";
|
|
7
6
|
import { buildExecutionFromWire } from "../../integrations/agent/execution.js";
|
|
8
|
-
import { runExecution
|
|
7
|
+
import { runExecution } from "../../integrations/agent/runner-dispatch.js";
|
|
9
8
|
/** Lower a frozen common request through its frozen runner only. */
|
|
10
9
|
export function prepareWorkflowExecution(request, prompt = request.prompt) {
|
|
11
10
|
const target = request.frozenTarget;
|
|
12
|
-
if (target.cwdIdentity)
|
|
13
|
-
assertFrozenDirectoryContained(target.cwdIdentity);
|
|
14
11
|
const wire = JSON.parse(canonicalResolvedExecutionRequest(target.request));
|
|
15
12
|
const command = { ...wire.command, content: prompt };
|
|
16
13
|
const runtime = {
|
|
17
14
|
...wire.runtime,
|
|
18
|
-
...(request.cwd !== undefined
|
|
19
|
-
? { workspace: request.cwd }
|
|
20
|
-
: target.cwdIdentity
|
|
21
|
-
? { workspace: target.cwdIdentity.realCwd }
|
|
22
|
-
: {}),
|
|
15
|
+
...(request.cwd !== undefined ? { workspace: request.cwd } : {}),
|
|
23
16
|
...(request.env !== undefined ? { environment: request.env } : {}),
|
|
24
17
|
};
|
|
25
18
|
wire.command = command;
|
|
@@ -63,13 +56,13 @@ export async function dispatchWorkflowExecution(request, feedback) {
|
|
|
63
56
|
}
|
|
64
57
|
const lowered = prepareWorkflowExecution(request, prompt);
|
|
65
58
|
const notices = lowered.notices.length > 0 ? lowered.notices : undefined;
|
|
66
|
-
if (request.env && Object.keys(request.env).length > 0 && lowered.
|
|
59
|
+
if (request.env && Object.keys(request.env).length > 0 && lowered.profile === undefined) {
|
|
67
60
|
return {
|
|
68
61
|
ok: false,
|
|
69
62
|
text: "",
|
|
70
63
|
failureReason: "env_unsupported",
|
|
71
64
|
error: `unit ${JSON.stringify(request.unitId)} declares env bindings, which require a child process ` +
|
|
72
|
-
`(
|
|
65
|
+
`(a harness or the internal runtime) — a direct model call cannot inject a per-unit child environment.`,
|
|
73
66
|
...(notices ? { notices } : {}),
|
|
74
67
|
};
|
|
75
68
|
}
|
|
@@ -77,11 +70,7 @@ export async function dispatchWorkflowExecution(request, feedback) {
|
|
|
77
70
|
try {
|
|
78
71
|
const eventSource = forwardedDispatchEventSource(request);
|
|
79
72
|
result = await runExecution(lowered, {
|
|
80
|
-
|
|
81
|
-
stdio: "captured",
|
|
82
|
-
parseOutput: "text",
|
|
83
|
-
...(request.signal ? { signal: request.signal } : {}),
|
|
84
|
-
},
|
|
73
|
+
...(request.signal ? { signal: request.signal } : {}),
|
|
85
74
|
...(eventSource !== undefined ? { eventSource } : {}),
|
|
86
75
|
});
|
|
87
76
|
}
|
|
@@ -96,13 +85,10 @@ export async function dispatchWorkflowExecution(request, feedback) {
|
|
|
96
85
|
...(notices ? { notices } : {}),
|
|
97
86
|
};
|
|
98
87
|
}
|
|
99
|
-
const extraction = result.ok ? unwrapHarnessReply(lowered.runner, result) : undefined;
|
|
100
|
-
const text = extraction?.text ?? result.stdout;
|
|
101
|
-
const sessionId = extraction?.sessionId ?? result.sessionId;
|
|
102
88
|
return {
|
|
103
89
|
ok: result.ok,
|
|
104
|
-
text,
|
|
105
|
-
...(sessionId !== undefined ? { sessionId } : {}),
|
|
90
|
+
text: result.stdout,
|
|
91
|
+
...(result.sessionId !== undefined ? { sessionId: result.sessionId } : {}),
|
|
106
92
|
...(result.reason ? { failureReason: result.reason } : {}),
|
|
107
93
|
...(result.error ? { error: result.error } : {}),
|
|
108
94
|
...(result.usage ? { usage: result.usage } : {}),
|
|
@@ -1,140 +1,35 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import fs from "node:fs";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import dotenv from "dotenv";
|
|
7
|
-
import { loadAdapterExecutionSource } from "../../commands/command/execution-source-loader.js";
|
|
8
4
|
import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
9
|
-
import { compareCodePoints, isWithin, toPosix } from "../../core/common.js";
|
|
10
5
|
import { parseEnvRef } from "../../core/env-secret-ref.js";
|
|
11
6
|
import { UsageError } from "../../core/errors.js";
|
|
12
|
-
import {
|
|
7
|
+
import { resolveConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
|
|
13
8
|
import { resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
14
|
-
import { resolveAssetPath } from "../../sources/resolve.js";
|
|
15
|
-
import { SECRET_TOKEN_RE } from "../exec/environment.js";
|
|
16
9
|
/**
|
|
17
|
-
* A step's frozen environment: `pass_env` names, then
|
|
18
|
-
*
|
|
19
|
-
*
|
|
10
|
+
* A step's frozen environment: `pass_env` names, then one bundle-qualified
|
|
11
|
+
* ref per `unit.env` entry. The env file, its keys and the secrets it names
|
|
12
|
+
* are read at dispatch (`exec/environment.ts`), never frozen.
|
|
20
13
|
*/
|
|
21
14
|
export function freezeEnvironment(source, exec, context) {
|
|
22
15
|
const passThrough = (exec?.passEnv ?? []).map((name) => Object.freeze({ kind: "pass-through", name }));
|
|
23
16
|
const seen = new Set();
|
|
24
17
|
const envRefs = [];
|
|
25
18
|
for (const [precedence, ref] of (source.unit?.env ?? []).entries()) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const owned = resolveOwnedAssetSync(ref, "env", context);
|
|
30
|
-
if (seen.has(owned.ref))
|
|
19
|
+
parseEnvRef(ref);
|
|
20
|
+
const qualified = qualifyEnvRef(ref, context);
|
|
21
|
+
if (seen.has(qualified))
|
|
31
22
|
continue;
|
|
32
|
-
seen.add(
|
|
33
|
-
|
|
34
|
-
const secretNames = new Set();
|
|
35
|
-
for (const value of Object.values(parsed)) {
|
|
36
|
-
for (const match of value.matchAll(SECRET_TOKEN_RE))
|
|
37
|
-
if (match[1])
|
|
38
|
-
secretNames.add(match[1]);
|
|
39
|
-
}
|
|
40
|
-
envRefs.push(Object.freeze({
|
|
41
|
-
kind: "env-ref",
|
|
42
|
-
ref: owned.ref,
|
|
43
|
-
owner: Object.freeze({
|
|
44
|
-
bundle: owned.bundle,
|
|
45
|
-
adapter: owned.adapter,
|
|
46
|
-
requestedRoot: owned.root,
|
|
47
|
-
requestedPath: owned.file,
|
|
48
|
-
relativePath: toPosix(path.relative(owned.root, owned.file)),
|
|
49
|
-
}),
|
|
50
|
-
keys: Object.keys(parsed).sort(compareCodePoints),
|
|
51
|
-
secretNames: [...secretNames].sort(compareCodePoints),
|
|
52
|
-
precedence,
|
|
53
|
-
}));
|
|
23
|
+
seen.add(qualified);
|
|
24
|
+
envRefs.push(Object.freeze({ kind: "env-ref", ref: qualified, precedence }));
|
|
54
25
|
}
|
|
55
26
|
return [...passThrough, ...envRefs];
|
|
56
27
|
}
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
const owned = await resolveOwnedAsset(ref, kind === "command" ? "command" : "agent", context);
|
|
60
|
-
return kind === "command"
|
|
61
|
-
? loadAdapterExecutionSource(owned.ref, "command", { config: context.config })
|
|
62
|
-
: loadAdapterExecutionSource(owned.ref, "persona", { config: context.config });
|
|
63
|
-
}
|
|
64
|
-
export async function resolveOwnedAsset(ref, type, context) {
|
|
65
|
-
return resolveOwnedAssetCore(ref, type, context, false);
|
|
66
|
-
}
|
|
67
|
-
export function resolveOwnedAssetSync(ref, type, context) {
|
|
68
|
-
return resolveOwnedAssetCore(ref, type, context, true);
|
|
69
|
-
}
|
|
70
|
-
function resolveOwnedAssetCore(refInput, type, context, sync) {
|
|
28
|
+
/** Qualify an env ref a step names with the bundle that owns it right now, through the one walk. */
|
|
29
|
+
function qualifyEnvRef(refInput, context) {
|
|
71
30
|
const parsed = parseBundleRef(refInput);
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
const name = conceptId.slice(plural.length + 1);
|
|
75
|
-
const direct = parsed.bundle ? configuredOwner(parsed.bundle, context.config) : undefined;
|
|
76
|
-
const candidates = direct ? [direct] : installedOwners(parsed.bundle, context.config);
|
|
77
|
-
const findSync = () => {
|
|
78
|
-
for (const candidate of candidates) {
|
|
79
|
-
const directory = path.join(candidate.root, plural);
|
|
80
|
-
for (const extension of assetExtensions(type)) {
|
|
81
|
-
const file = path.resolve(directory, `${name}${extension}`);
|
|
82
|
-
if (fs.existsSync(file) && fs.statSync(file).isFile()) {
|
|
83
|
-
if (!isWithin(file, candidate.root)) {
|
|
84
|
-
throw new UsageError(`${file} resolves outside its owning root.`, "PATH_ESCAPE_VIOLATION");
|
|
85
|
-
}
|
|
86
|
-
return { ...candidate, ref: makeBundleRef(candidate.bundle, conceptId), file };
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
31
|
+
const match = resolveConceptOwner({ bundle: parsed.bundle, conceptId: parsed.conceptId }, resolveSourceEntries(undefined, context.config), { includeSensitive: true });
|
|
32
|
+
if (!match)
|
|
90
33
|
throw new UsageError(`Workflow source target ${refInput} was not found.`, "INVALID_FLAG_VALUE");
|
|
91
|
-
|
|
92
|
-
if (sync)
|
|
93
|
-
return findSync();
|
|
94
|
-
return (async () => {
|
|
95
|
-
for (const candidate of candidates) {
|
|
96
|
-
try {
|
|
97
|
-
const file = await resolveAssetPath(candidate.root, type, name);
|
|
98
|
-
return { ...candidate, ref: makeBundleRef(candidate.bundle, conceptId), file };
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// Continue in installation priority order.
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return findSync();
|
|
105
|
-
})();
|
|
106
|
-
}
|
|
107
|
-
/** Every installed bundle root (or just `bundle`'s), in installation priority order. */
|
|
108
|
-
function installedOwners(bundle, config) {
|
|
109
|
-
const sources = resolveSourceEntries(undefined, config);
|
|
110
|
-
const installations = deriveInstallations(sources);
|
|
111
|
-
return sources.flatMap((source, index) => {
|
|
112
|
-
const installation = installations[index];
|
|
113
|
-
if (!installation || (bundle && installation.id !== bundle))
|
|
114
|
-
return [];
|
|
115
|
-
return [
|
|
116
|
-
{
|
|
117
|
-
bundle: installation.id,
|
|
118
|
-
root: source.path,
|
|
119
|
-
adapter: source.adapterId ?? installation.components[0]?.adapter ?? "akm",
|
|
120
|
-
},
|
|
121
|
-
];
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
function configuredOwner(bundle, config) {
|
|
125
|
-
const entry = config.bundles?.[bundle];
|
|
126
|
-
if (!entry || typeof entry.path !== "string")
|
|
127
|
-
return undefined;
|
|
128
|
-
const components = entry.components ? Object.values(entry.components) : [];
|
|
129
|
-
const component = components[0];
|
|
130
|
-
return {
|
|
131
|
-
bundle,
|
|
132
|
-
root: path.resolve(entry.path, component?.root ?? "."),
|
|
133
|
-
adapter: component?.adapter ?? "akm",
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
function assetExtensions(type) {
|
|
137
|
-
if (type === "env")
|
|
138
|
-
return ["", ".env"];
|
|
139
|
-
return ["", ".md"];
|
|
34
|
+
return makeBundleRef(match.bundleId, parsed.conceptId);
|
|
140
35
|
}
|
|
@@ -4,15 +4,14 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* Freeze a compiled workflow plan into the plan a run executes. Every step's
|
|
6
6
|
* authored spec resolves through the shared command/task authorities into a
|
|
7
|
-
* frozen `root` (
|
|
7
|
+
* frozen `root` (connection or harness, model, timeout, concurrency, dispatch target and
|
|
8
8
|
* environment descriptors); gates get their judge; the compile-only fields are
|
|
9
9
|
* dropped; the source file's sha256 is recorded. Nothing is published here.
|
|
10
10
|
*/
|
|
11
11
|
import { createHash } from "node:crypto";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { resolveExecution } from "../../integrations/agent/execution.js";
|
|
12
|
+
import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
|
|
13
|
+
import { UsageError } from "../../core/errors.js";
|
|
14
|
+
import { resolveExecution, shippedAlias } from "../../integrations/agent/execution.js";
|
|
16
15
|
import { checkWorkflowPlan } from "../compile.js";
|
|
17
16
|
import { defaultMapConcurrency, workflowMaxConcurrency } from "../concurrency-policy.js";
|
|
18
17
|
import { canonicalJson } from "../ir/plan-hash.js";
|
|
@@ -35,26 +34,16 @@ export async function freezeWorkflow(asset, config, refPath = [asset.ref]) {
|
|
|
35
34
|
refPath,
|
|
36
35
|
freezeChild: (child, childRefPath) => freezeWorkflow(child, config, childRefPath),
|
|
37
36
|
};
|
|
38
|
-
let engineAnnouncement;
|
|
39
37
|
const steps = [];
|
|
40
38
|
for (const step of compiled.steps) {
|
|
41
39
|
const { spec, ...frozenStep } = step;
|
|
42
40
|
const source = { ...(spec ?? { source: { path: asset.path, start: 1, end: 1 } }), id: step.stepId };
|
|
43
41
|
const resolved = await resolveStep(source, context);
|
|
44
|
-
engineAnnouncement ??= resolved.engineAnnouncement;
|
|
45
42
|
const root = frozenRoot(step.stepId, source, resolved, compiled, config);
|
|
46
43
|
let frozenJudge = null;
|
|
47
44
|
if (step.gate.criteria.length > 0) {
|
|
48
45
|
const judge = resolveJudge(source, step.gate.criteria[0] ?? "", context);
|
|
49
|
-
|
|
50
|
-
frozenJudge = judge.target;
|
|
51
|
-
engineAnnouncement ??= judge.engineAnnouncement;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
warn(`Workflow step "${step.stepId}" has completion criteria but no verification engine is available ` +
|
|
55
|
-
"(set workflow.judgeEngine, defaults.engine, or install an opencode-sdk binary). The step will block " +
|
|
56
|
-
"for `akm workflow resume` once it is reached.");
|
|
57
|
-
}
|
|
46
|
+
frozenJudge = judge.target;
|
|
58
47
|
}
|
|
59
48
|
steps.push({ ...frozenStep, root, gate: { ...step.gate, frozenJudge } });
|
|
60
49
|
}
|
|
@@ -68,7 +57,7 @@ export async function freezeWorkflow(asset, config, refPath = [asset.ref]) {
|
|
|
68
57
|
sourceHash: asset.sourceHash,
|
|
69
58
|
steps,
|
|
70
59
|
};
|
|
71
|
-
return { plan, warnings: checked.warnings
|
|
60
|
+
return { plan, warnings: checked.warnings };
|
|
72
61
|
}
|
|
73
62
|
async function resolveStep(source, context) {
|
|
74
63
|
const baseUnit = baseUnitOf(source);
|
|
@@ -80,22 +69,15 @@ async function resolveStep(source, context) {
|
|
|
80
69
|
// A prose step: its body is the `akm/command` literal content (`parser.ts` `stepSpec`).
|
|
81
70
|
return commandDispatch(source, baseUnit, source.with, context);
|
|
82
71
|
}
|
|
83
|
-
/** The gate judge's frozen command target
|
|
72
|
+
/** The gate judge's frozen command target: a model call, so it runs where model work runs. */
|
|
84
73
|
function resolveJudge(source, rubric, context) {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return commandResult(source, { onError: "fail", source: source.source }, prepared, context);
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
if (configuredEngine || !(err instanceof ConfigError && err.message.includes(NO_ENGINE_MESSAGE_SUFFIX)))
|
|
96
|
-
throw err;
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
74
|
+
const prepared = resolveExecution({
|
|
75
|
+
content: rubric.trim() || "Judge workflow completion.",
|
|
76
|
+
config: context.config,
|
|
77
|
+
layers: [shippedAlias(SHIPPED_ALIAS.judge)],
|
|
78
|
+
modelWork: true,
|
|
79
|
+
});
|
|
80
|
+
return commandResult(source, { onError: "fail", source: source.source }, prepared, context);
|
|
99
81
|
}
|
|
100
82
|
function frozenRoot(stepId, source, resolved, plan, config) {
|
|
101
83
|
const unit = resolved.unit;
|
|
@@ -107,7 +89,6 @@ function frozenRoot(stepId, source, resolved, plan, config) {
|
|
|
107
89
|
.update(canonicalJson({
|
|
108
90
|
exec: resolved.target.exec,
|
|
109
91
|
environment: resolved.environment,
|
|
110
|
-
cwdIdentity: resolved.target.cwdIdentity,
|
|
111
92
|
}))
|
|
112
93
|
.digest("hex"),
|
|
113
94
|
}
|
|
@@ -25,17 +25,9 @@ export function freezeExecSpec(source, exec, context) {
|
|
|
25
25
|
timeoutMs: declared === undefined ? DEFAULT_EXEC_TIMEOUT_MS : declared,
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return defaultLlmEngineConcurrency(runner.connection.endpoint, configured?.kind === "llm" ? configured.concurrency : undefined);
|
|
32
|
-
}
|
|
33
|
-
if (runner.kind !== "sdk" || !runner.fallbackConnection)
|
|
34
|
-
return undefined;
|
|
35
|
-
const selected = typeof runner.engine === "string" ? config.engines?.[runner.engine] : undefined;
|
|
36
|
-
const fallbackName = selected?.kind === "agent" ? selected.llmEngine : undefined;
|
|
37
|
-
const fallback = fallbackName ? config.engines?.[fallbackName] : undefined;
|
|
38
|
-
return defaultLlmEngineConcurrency(runner.fallbackConnection.endpoint, fallback?.kind === "llm" ? fallback.concurrency : undefined);
|
|
28
|
+
/** The fan-out a connection supports (its `concurrency`, else the endpoint's default); a harness sets none. */
|
|
29
|
+
export function targetConcurrency(runner) {
|
|
30
|
+
return runner.kind === "connection" ? defaultLlmEngineConcurrency(runner.endpoint, runner.concurrency) : undefined;
|
|
39
31
|
}
|
|
40
32
|
/** The request as it may be persisted: its live runtime environment removed. */
|
|
41
33
|
export function durableRequest(request) {
|
|
@@ -45,14 +37,15 @@ export function durableRequest(request) {
|
|
|
45
37
|
wire.runtime = runtime;
|
|
46
38
|
return decodeResolvedExecutionRequest(wire);
|
|
47
39
|
}
|
|
48
|
-
export function executionUnitValues(unit
|
|
40
|
+
export function executionUnitValues(unit) {
|
|
49
41
|
return Object.freeze({
|
|
42
|
+
...(unit && Object.hasOwn(unit, "connection") ? { connection: unit.connection } : {}),
|
|
43
|
+
...(unit && Object.hasOwn(unit, "harness") ? { harness: unit.harness } : {}),
|
|
50
44
|
...(unit && Object.hasOwn(unit, "engine") ? { engine: unit.engine } : {}),
|
|
51
45
|
...(unit && Object.hasOwn(unit, "model") ? { model: unit.model } : {}),
|
|
52
46
|
...(unit && Object.hasOwn(unit, "llm") ? { inference: unit.llm } : {}),
|
|
53
47
|
...(unit && Object.hasOwn(unit, "timeoutMs") ? { timeout: unit.timeoutMs } : {}),
|
|
54
48
|
...(unit && "output" in unit && Object.hasOwn(unit, "output") ? { outputSchema: unit.output } : {}),
|
|
55
|
-
workspace,
|
|
56
49
|
});
|
|
57
50
|
}
|
|
58
51
|
/** Step ids declared BEFORE `stepId` — the same ordering `map.over` and `inputs:` rely on. */
|
|
@@ -11,7 +11,6 @@ import { UsageError } from "../../../core/errors.js";
|
|
|
11
11
|
import { workflowParamContract } from "../../ir/params.js";
|
|
12
12
|
import { canonicalJson, canonicalPlanJson } from "../../ir/plan-hash.js";
|
|
13
13
|
import { loadWorkflowAsset } from "../../runtime/workflow-asset-loader.js";
|
|
14
|
-
import { resolveOwnedAsset } from "../environment.js";
|
|
15
14
|
import { declaredParamNames, earlierStepIds, } from "../step-values.js";
|
|
16
15
|
import { freezeTaskInputBindings } from "../task-bindings.js";
|
|
17
16
|
/** The child target's own content identity: its ref, embedded plan hash, and bindings. */
|
|
@@ -46,10 +45,9 @@ function assertNoCompositionCycle(stepId, childRef, refPath) {
|
|
|
46
45
|
}
|
|
47
46
|
export async function childWorkflowDispatch(input) {
|
|
48
47
|
const { source, baseUnit, childRefInput, context } = input;
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
const
|
|
52
|
-
const childAsset = await loadWorkflowAsset(owned.ref);
|
|
48
|
+
// The loader resolves the ref through the one walk, so a missing child fails
|
|
49
|
+
// like any other missing workflow.
|
|
50
|
+
const childAsset = await loadWorkflowAsset(childRefInput);
|
|
53
51
|
const childRef = childAsset.ref;
|
|
54
52
|
// The composition cycle check, before any child compilation.
|
|
55
53
|
assertNoCompositionCycle(source.id, childRef, context.refPath);
|
|
@@ -3,34 +3,28 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
5
|
import { prepareCommandInvocation } from "../../../commands/command/command-execution.js";
|
|
6
|
-
import { captureFrozenDirectoryIdentity } from "../../../execution/directory-identity.js";
|
|
7
6
|
import { canonicalResolvedExecutionRequest, } from "../../../execution/resolved-request.js";
|
|
8
|
-
import { fallbackAnnouncement } from "../../../integrations/agent/engine-fallback.js";
|
|
9
7
|
import { buildExecution } from "../../../integrations/agent/execution.js";
|
|
10
|
-
import { freezeEnvironment
|
|
8
|
+
import { freezeEnvironment } from "../environment.js";
|
|
11
9
|
import { durableRequest, executionUnitValues, targetConcurrency, } from "../step-values.js";
|
|
12
10
|
export async function commandDispatch(source, baseUnit, action, context) {
|
|
13
11
|
const prepared = await prepareCommandInvocation({
|
|
14
12
|
action,
|
|
15
13
|
config: context.config,
|
|
16
|
-
...(context.plan.defaults
|
|
17
|
-
? { invocationDefaults: executionUnitValues(context.plan.defaults, context.asset.sourcePath) }
|
|
18
|
-
: {}),
|
|
14
|
+
...(context.plan.defaults ? { invocationDefaults: executionUnitValues(context.plan.defaults) } : {}),
|
|
19
15
|
inlineContentMode: "literal",
|
|
20
|
-
current: executionUnitValues(source.unit
|
|
21
|
-
sourceLoader: (ref, kind) => workflowExecutionSource(ref, kind, context),
|
|
16
|
+
current: executionUnitValues(source.unit),
|
|
22
17
|
});
|
|
23
18
|
return commandResult(source, baseUnit, prepared, context);
|
|
24
19
|
}
|
|
25
20
|
export function commandResult(source, baseUnit, prepared, context, literals = []) {
|
|
26
21
|
const request = durableRequest(prepared.request);
|
|
27
22
|
const lowered = buildExecution(request, prepared.runner);
|
|
28
|
-
const cwdIdentity = captureFrozenDirectoryIdentity(context.asset.sourcePath);
|
|
29
23
|
const runner = lowered.runner;
|
|
30
24
|
const unit = {
|
|
31
25
|
...baseUnit,
|
|
32
|
-
engine: request.
|
|
33
|
-
...(request.model ? { model: request.model.
|
|
26
|
+
engine: request.target.name,
|
|
27
|
+
...(request.model ? { model: request.model.model } : {}),
|
|
34
28
|
...(Object.hasOwn(request.runtime, "timeoutMs") ? { timeoutMs: request.runtime.timeoutMs } : {}),
|
|
35
29
|
...(request.inference ? { llm: request.inference } : {}),
|
|
36
30
|
...(request.outputSchema ? { output: request.outputSchema } : {}),
|
|
@@ -42,15 +36,15 @@ export function commandResult(source, baseUnit, prepared, context, literals = []
|
|
|
42
36
|
contentHash: createHash("sha256").update(request.command.content).digest("hex"),
|
|
43
37
|
request: JSON.parse(canonicalResolvedExecutionRequest(request)),
|
|
44
38
|
runner,
|
|
45
|
-
...(targetConcurrency(runner
|
|
46
|
-
|
|
39
|
+
...(targetConcurrency(runner) ? { concurrency: targetConcurrency(runner) } : {}),
|
|
40
|
+
// Not a location. akm 0.10.0 and earlier decode a command-only plan and run it in the invoking directory,
|
|
41
|
+
// but their dispatch refuses a directory identity it cannot verify, so they stop here instead.
|
|
42
|
+
cwdIdentity: {},
|
|
47
43
|
});
|
|
48
|
-
const engineAnnouncement = fallbackAnnouncement(prepared.fallbackEngineName, request.engine.name);
|
|
49
44
|
return {
|
|
50
45
|
target,
|
|
51
46
|
environment,
|
|
52
47
|
unit,
|
|
53
48
|
instructions: request.command.content,
|
|
54
|
-
...(engineAnnouncement ? { engineAnnouncement } : {}),
|
|
55
49
|
};
|
|
56
50
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import { captureFrozenDirectoryIdentity } from "../../../execution/directory-identity.js";
|
|
5
4
|
import { freezeEnvironment } from "../environment.js";
|
|
6
5
|
import { freezeExecSpec, } from "../step-values.js";
|
|
7
6
|
export function directShell(source, baseUnit, context) {
|
|
@@ -9,13 +8,11 @@ export function directShell(source, baseUnit, context) {
|
|
|
9
8
|
if (!authoredExec)
|
|
10
9
|
throw new Error(`workflow shell step ${source.id} has no argv`);
|
|
11
10
|
const exec = freezeExecSpec(source, authoredExec, context);
|
|
12
|
-
const cwdIdentity = captureFrozenDirectoryIdentity(context.asset.sourcePath, authoredExec.cwd);
|
|
13
11
|
const environment = Object.freeze(freezeEnvironment(source, authoredExec, context));
|
|
14
12
|
const target = Object.freeze({
|
|
15
13
|
kind: "shell",
|
|
16
14
|
contentHash: "",
|
|
17
15
|
exec,
|
|
18
|
-
cwdIdentity,
|
|
19
16
|
});
|
|
20
17
|
return {
|
|
21
18
|
target,
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* {@link freezeTaskInputBindings} classifies an authored `with:` against a
|
|
7
7
|
* child workflow's `params:` contract. A reference's resolved value is
|
|
8
8
|
* validated before each attempt (`exec/step-work.ts`).
|
|
9
|
-
* See docs/architecture/decisions/0008-task-binding-normalization.md.
|
|
10
9
|
*/
|
|
11
10
|
import { isRecord } from "../../core/common.js";
|
|
12
11
|
import { UsageError } from "../../core/errors.js";
|