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
package/dist/workflows/parser.js
CHANGED
|
@@ -35,10 +35,12 @@ import { LineCounter, parseDocument } from "yaml";
|
|
|
35
35
|
import { bundleRefToString, parseBundleRef } from "../core/asset/asset-ref.js";
|
|
36
36
|
import { parseFrontmatterBlock } from "../core/asset/frontmatter.js";
|
|
37
37
|
import { parseMarkdownToc } from "../core/asset/markdown.js";
|
|
38
|
-
import {
|
|
38
|
+
import { isRecord } from "../core/common.js";
|
|
39
39
|
import { formatExtraParamsIssue, validateExtraParams } from "../core/extra-params.js";
|
|
40
40
|
import { checkJsonSchemaDefinition, JSON_SCHEMA_SUBSET_SUPPORTED_KEYWORDS } from "../core/json-schema.js";
|
|
41
|
+
import { warnOnce } from "../core/warn.js";
|
|
41
42
|
import { INPUT_NAME_PATTERN } from "../execution/input-contract.js";
|
|
43
|
+
import { warnRetiredEngineKey } from "../execution/source.js";
|
|
42
44
|
import { classifyTargetRef } from "../execution/target-ref.js";
|
|
43
45
|
import { WORKFLOW_PLAN_VERSION, } from "./plan.js";
|
|
44
46
|
import { parseReference } from "./program/expressions.js";
|
|
@@ -88,13 +90,15 @@ const ENVELOPE_KEYS = [
|
|
|
88
90
|
];
|
|
89
91
|
const WORKFLOW_KEYS = ["params", "defaults", "budget", "steps"];
|
|
90
92
|
const TOP_LEVEL_KEYS = [...ENVELOPE_KEYS, ...WORKFLOW_KEYS];
|
|
91
|
-
const DEFAULTS_KEYS = ["engine", "model", "timeout", "on_error", "llm"];
|
|
93
|
+
const DEFAULTS_KEYS = ["connection", "harness", "engine", "model", "timeout", "on_error", "llm"];
|
|
92
94
|
const BUDGET_KEYS = ["max_tokens", "max_units"];
|
|
93
95
|
const STEP_KEYS = ["id", "unit", "map", "inputs", "output", "gate"];
|
|
94
96
|
const UNIT_KEYS = [
|
|
95
97
|
"exec",
|
|
96
98
|
"workflow",
|
|
97
99
|
"with",
|
|
100
|
+
"connection",
|
|
101
|
+
"harness",
|
|
98
102
|
"engine",
|
|
99
103
|
"model",
|
|
100
104
|
"llm",
|
|
@@ -105,8 +109,8 @@ const UNIT_KEYS = [
|
|
|
105
109
|
"env",
|
|
106
110
|
];
|
|
107
111
|
const EXEC_KEYS = ["command", "cwd", "pass_env"];
|
|
108
|
-
/** Unit keys that name
|
|
109
|
-
const UNIT_ENGINE_KEYS = ["engine", "model", "llm"];
|
|
112
|
+
/** Unit keys that name a model or agent dispatch and therefore cannot appear beside `exec:`. `engine` is the retired spelling of `connection` / `harness`. */
|
|
113
|
+
const UNIT_ENGINE_KEYS = ["connection", "harness", "engine", "model", "llm"];
|
|
110
114
|
const MAP_KEYS = ["over", "concurrency", "reducer", "unit"];
|
|
111
115
|
const RETRY_KEYS = ["max", "on"];
|
|
112
116
|
const GATE_KEYS = ["max_loops"];
|
|
@@ -182,7 +186,6 @@ export function parseWorkflow(markdown, source) {
|
|
|
182
186
|
const ctx = {
|
|
183
187
|
filePath: path,
|
|
184
188
|
errors,
|
|
185
|
-
...(source.validateExecCwd ? { validateExecCwd: source.validateExecCwd } : {}),
|
|
186
189
|
lineAt,
|
|
187
190
|
lineAtOffset: (offset) => Math.max(1, lineCounter.linePos(offset).line + lineOffset),
|
|
188
191
|
nodeAt: (p) => (p.length === 0 ? doc.contents : doc.getIn(p, true)),
|
|
@@ -524,10 +527,14 @@ function parseDefaults(ctx, raw) {
|
|
|
524
527
|
}
|
|
525
528
|
checkUnknownKeys(ctx, raw, path, DEFAULTS_KEYS, `"defaults"`);
|
|
526
529
|
const defaults = {};
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
530
|
+
for (const key of ["connection", "harness", "engine"]) {
|
|
531
|
+
if (raw[key] === undefined)
|
|
532
|
+
continue;
|
|
533
|
+
const name = parseEngineName(ctx, raw[key], [...path, key], `"defaults.${key}"`);
|
|
534
|
+
if (name !== undefined)
|
|
535
|
+
defaults[key] = name;
|
|
536
|
+
if (key === "engine")
|
|
537
|
+
warnRetiredEngineKey();
|
|
531
538
|
}
|
|
532
539
|
if (raw.model !== undefined) {
|
|
533
540
|
if (typeof raw.model === "string" && raw.model.trim() !== "")
|
|
@@ -655,7 +662,7 @@ function parseUnit(ctx, raw, path, stepLabel, allowWorkflow = true) {
|
|
|
655
662
|
const exec = parseExec(ctx, raw.exec, [...path, "exec"], stepLabel);
|
|
656
663
|
if (exec !== undefined)
|
|
657
664
|
unit.exec = exec;
|
|
658
|
-
// An exec unit dispatches no
|
|
665
|
+
// An exec unit dispatches no model call, so every connection or harness selection key is
|
|
659
666
|
// a contradiction rather than a harmless extra. Reported per key so the
|
|
660
667
|
// author sees exactly which line to delete.
|
|
661
668
|
for (const key of UNIT_ENGINE_KEYS) {
|
|
@@ -672,7 +679,7 @@ function parseUnit(ctx, raw, path, stepLabel, allowWorkflow = true) {
|
|
|
672
679
|
if (raw.exec !== undefined) {
|
|
673
680
|
ctx.err([...path, "workflow"], `${stepLabel} "unit" declares both "exec" and "workflow" — a unit runs one or the other.`);
|
|
674
681
|
}
|
|
675
|
-
// A workflow unit starts a child run: it reaches no
|
|
682
|
+
// A workflow unit starts a child run: it reaches no model and the child carries its own environment.
|
|
676
683
|
for (const key of [...UNIT_ENGINE_KEYS, "env"]) {
|
|
677
684
|
if (raw[key] === undefined)
|
|
678
685
|
continue;
|
|
@@ -691,10 +698,14 @@ function parseUnit(ctx, raw, path, stepLabel, allowWorkflow = true) {
|
|
|
691
698
|
unit.with = raw.with;
|
|
692
699
|
}
|
|
693
700
|
}
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
701
|
+
for (const key of ["connection", "harness", "engine"]) {
|
|
702
|
+
if (raw[key] === undefined)
|
|
703
|
+
continue;
|
|
704
|
+
const name = parseEngineName(ctx, raw[key], [...path, key], `${stepLabel} "${key}"`);
|
|
705
|
+
if (name !== undefined)
|
|
706
|
+
unit[key] = name;
|
|
707
|
+
if (key === "engine")
|
|
708
|
+
warnRetiredEngineKey();
|
|
698
709
|
}
|
|
699
710
|
if (raw.model !== undefined) {
|
|
700
711
|
if (typeof raw.model === "string" && raw.model.trim() !== "")
|
|
@@ -780,16 +791,18 @@ function parseExec(ctx, raw, path, stepLabel) {
|
|
|
780
791
|
return exec;
|
|
781
792
|
}
|
|
782
793
|
/**
|
|
783
|
-
* `pass_env:` —
|
|
784
|
-
*
|
|
785
|
-
*
|
|
794
|
+
* `pass_env:` — env var NAMES, recorded in the frozen plan. They select nothing:
|
|
795
|
+
* an exec child inherits akm's environment, so a workflow written before that
|
|
796
|
+
* still parses. NAMES ONLY: a value would be a plaintext secret in the frozen
|
|
797
|
+
* plan, which is exactly what `env:` bindings exist to avoid.
|
|
786
798
|
*/
|
|
787
799
|
function parseExecPassEnv(ctx, raw, path, stepLabel) {
|
|
788
800
|
if (raw === undefined)
|
|
789
801
|
return undefined;
|
|
790
802
|
if (!Array.isArray(raw) || raw.length === 0) {
|
|
791
|
-
ctx.err(path, `${stepLabel} "exec.pass_env" must be a non-empty list of environment variable NAMES
|
|
792
|
-
`
|
|
803
|
+
ctx.err(path, `${stepLabel} "exec.pass_env" must be a non-empty list of environment variable NAMES, e.g. ` +
|
|
804
|
+
`pass_env: [CARGO_HOME]. It has no effect: the command inherits akm's environment. Values never appear ` +
|
|
805
|
+
`here — use "env:" bindings for those.`);
|
|
793
806
|
return undefined;
|
|
794
807
|
}
|
|
795
808
|
const names = [];
|
|
@@ -829,36 +842,18 @@ function parseExecCommand(ctx, raw, path, stepLabel) {
|
|
|
829
842
|
return argv;
|
|
830
843
|
}
|
|
831
844
|
/**
|
|
832
|
-
* The optional
|
|
833
|
-
*
|
|
834
|
-
*
|
|
845
|
+
* The optional `cwd:`: a non-empty string, relative to the workflow's bundle root or absolute, and
|
|
846
|
+
* free to carry `${ref}` tokens. Nothing else is checked here; the unit's working directory is
|
|
847
|
+
* resolved at dispatch.
|
|
835
848
|
*/
|
|
836
849
|
function parseExecCwd(ctx, raw, path, stepLabel) {
|
|
837
850
|
if (raw === undefined)
|
|
838
851
|
return undefined;
|
|
839
852
|
if (typeof raw !== "string" || raw.trim() === "") {
|
|
840
|
-
ctx.err(path, `${stepLabel} "exec.cwd" must be a non-empty
|
|
841
|
-
return undefined;
|
|
842
|
-
}
|
|
843
|
-
const value = raw.trim();
|
|
844
|
-
if (!isContainedRelativePath(value)) {
|
|
845
|
-
ctx.err(path, `${stepLabel} "exec.cwd" (${JSON.stringify(value)}) must be a RELATIVE path inside the unit's working ` +
|
|
846
|
-
`directory — absolute paths, Windows drive letters, "~", and ".." segments are rejected.`);
|
|
853
|
+
ctx.err(path, `${stepLabel} "exec.cwd" must be a non-empty string.`);
|
|
847
854
|
return undefined;
|
|
848
855
|
}
|
|
849
|
-
|
|
850
|
-
const semantic = ctx.validateExecCwd(value);
|
|
851
|
-
if (!semantic.ok) {
|
|
852
|
-
ctx.errors.push({
|
|
853
|
-
code: semantic.code,
|
|
854
|
-
line: ctx.lineAt(path),
|
|
855
|
-
message: semantic.message,
|
|
856
|
-
});
|
|
857
|
-
return undefined;
|
|
858
|
-
}
|
|
859
|
-
return semantic.value;
|
|
860
|
-
}
|
|
861
|
-
return value;
|
|
856
|
+
return raw.trim();
|
|
862
857
|
}
|
|
863
858
|
function parseMap(ctx, raw, path, stepLabel) {
|
|
864
859
|
if (!isRecord(raw)) {
|
|
@@ -943,19 +938,19 @@ function parseGate(ctx, raw, path, stepLabel) {
|
|
|
943
938
|
// Field helpers
|
|
944
939
|
// ---------------------------------------------------------------------------
|
|
945
940
|
/**
|
|
946
|
-
*
|
|
941
|
+
* Connection and harness names must already satisfy the frozen-plan grammar
|
|
947
942
|
* (`WORKFLOW_ENGINE_NAME_PATTERN`, max 63 chars) at parse time — the decoder
|
|
948
943
|
* enforces the same bound on persisted plans, and a name that only fails there
|
|
949
944
|
* surfaces as an unlocated "Invalid frozen workflow plan" at `workflow run`.
|
|
950
945
|
*/
|
|
951
946
|
function parseEngineName(ctx, raw, path, label) {
|
|
952
947
|
if (typeof raw !== "string" || raw.trim() === "") {
|
|
953
|
-
ctx.err(path, `${label} must be a non-empty
|
|
948
|
+
ctx.err(path, `${label} must be a non-empty name.`);
|
|
954
949
|
return undefined;
|
|
955
950
|
}
|
|
956
951
|
const name = raw.trim();
|
|
957
952
|
if (!WORKFLOW_ENGINE_NAME_PATTERN.test(name) || name.length > WORKFLOW_MAX_ENGINE_NAME_LENGTH) {
|
|
958
|
-
ctx.err(path, `${label} has an invalid
|
|
953
|
+
ctx.err(path, `${label} has an invalid name ${JSON.stringify(name)}. Names are lowercase words of letters ` +
|
|
959
954
|
`and digits separated by single dashes, starting with a letter (e.g. "code-review-llm"), at most ` +
|
|
960
955
|
`${WORKFLOW_MAX_ENGINE_NAME_LENGTH} characters.`);
|
|
961
956
|
return undefined;
|
|
@@ -1044,7 +1039,12 @@ function parseEnumField(ctx, raw, path, label, allowed) {
|
|
|
1044
1039
|
ctx.err(path, `${label} must be one of: ${allowed.join(" | ")} (got ${JSON.stringify(raw)}).`);
|
|
1045
1040
|
return undefined;
|
|
1046
1041
|
}
|
|
1047
|
-
/**
|
|
1042
|
+
/** Keys a unit's `llm:` once took and akm no longer reads: warned about once, then ignored. */
|
|
1043
|
+
const RETIRED_LLM_KEYS = {
|
|
1044
|
+
supports_json_schema: "akm retries without a schema when the endpoint rejects one",
|
|
1045
|
+
context_length: "the context window is a connection's setting (contextLength)",
|
|
1046
|
+
};
|
|
1047
|
+
/** Parse only invocation tuning. Where it is sent belongs to a named connection. */
|
|
1048
1048
|
function parseLlmOverrides(ctx, raw, path, label) {
|
|
1049
1049
|
if (raw === undefined)
|
|
1050
1050
|
return undefined;
|
|
@@ -1076,11 +1076,9 @@ function parseLlmOverrides(ctx, raw, path, label) {
|
|
|
1076
1076
|
else
|
|
1077
1077
|
ctx.err([...path, "max_tokens"], `${label}.max_tokens must be a positive integer.`);
|
|
1078
1078
|
}
|
|
1079
|
-
|
|
1080
|
-
if (
|
|
1081
|
-
|
|
1082
|
-
else
|
|
1083
|
-
ctx.err([...path, "supports_json_schema"], `${label}.supports_json_schema must be a boolean.`);
|
|
1079
|
+
for (const [key, why] of Object.entries(RETIRED_LLM_KEYS)) {
|
|
1080
|
+
if (raw[key] !== undefined)
|
|
1081
|
+
warnOnce(`workflow-llm-${key}`, `A workflow's llm.${key} is ignored: ${why}.`);
|
|
1084
1082
|
}
|
|
1085
1083
|
if (raw.extra_params !== undefined) {
|
|
1086
1084
|
if (!isRecord(raw.extra_params)) {
|
|
@@ -1099,13 +1097,6 @@ function parseLlmOverrides(ctx, raw, path, label) {
|
|
|
1099
1097
|
}
|
|
1100
1098
|
}
|
|
1101
1099
|
}
|
|
1102
|
-
if (raw.context_length !== undefined) {
|
|
1103
|
-
if (typeof raw.context_length === "number" && Number.isInteger(raw.context_length) && raw.context_length > 0) {
|
|
1104
|
-
result.contextLength = raw.context_length;
|
|
1105
|
-
}
|
|
1106
|
-
else
|
|
1107
|
-
ctx.err([...path, "context_length"], `${label}.context_length must be a positive integer.`);
|
|
1108
|
-
}
|
|
1109
1100
|
if (raw.enable_thinking !== undefined) {
|
|
1110
1101
|
if (typeof raw.enable_thinking === "boolean")
|
|
1111
1102
|
result.enableThinking = raw.enable_thinking;
|
package/dist/workflows/plan.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
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
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Stored plans record this; 0.9.15 and 0.9.16 wrote 5 and early 0.10 wrote 6,
|
|
6
|
+
* which still decode (the 0.9.15 floor, #1091). 7 stopped freezing locations:
|
|
7
|
+
* the plan names the refs the engine dereferences, never a directory or file.
|
|
8
|
+
* 8 freezes a connection or harness where 7 froze an engine: a plan of 7 or
|
|
9
|
+
* earlier that holds a command target cannot be decoded, and its run starts afresh.
|
|
10
|
+
*/
|
|
11
|
+
export const WORKFLOW_PLAN_VERSION = 8;
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
* declares one.
|
|
10
10
|
*/
|
|
11
11
|
import { displayRef } from "../core/asset/resolve-ref.js";
|
|
12
|
+
import { isInstalledBundle, resolveRefOwner } from "../core/env-secret-ref.js";
|
|
12
13
|
import { UsageError } from "../core/errors.js";
|
|
14
|
+
import { substituteRefTokens } from "../core/ref-token.js";
|
|
13
15
|
import { compileWorkflowSource, workflowStepInstructions } from "./compile.js";
|
|
14
16
|
function shellQuote(value) {
|
|
15
17
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
@@ -25,7 +27,7 @@ function deriveName(ctx) {
|
|
|
25
27
|
return ext > 0 ? ctx.relPath.slice(0, ext) : ctx.relPath;
|
|
26
28
|
}
|
|
27
29
|
function loadPlan(ctx) {
|
|
28
|
-
const result = compileWorkflowSource(ctx.content(), { path: ctx.relPath
|
|
30
|
+
const result = compileWorkflowSource(ctx.content(), { path: ctx.relPath });
|
|
29
31
|
if (result.ok)
|
|
30
32
|
return result.plan;
|
|
31
33
|
const summary = result.errors.map((e) => `${e.path}:${e.line} — ${e.message}`).join("\n");
|
|
@@ -43,16 +45,16 @@ function projectParameters(plan) {
|
|
|
43
45
|
}
|
|
44
46
|
/**
|
|
45
47
|
* Compact, show-facing orchestration summary for one step. Field mapping:
|
|
46
|
-
* `engine
|
|
48
|
+
* `engine` (the connection or harness a unit names), `model` and `timeoutMs` merge the run-level `defaults` exactly like the
|
|
47
49
|
* compiler does (per-unit override wins), `fanOut.over` carries the raw
|
|
48
50
|
* reference string.
|
|
49
51
|
* Returns undefined when the step declares nothing worth summarizing.
|
|
50
52
|
*
|
|
51
53
|
* ## exec units
|
|
52
54
|
*
|
|
53
|
-
* An `exec` unit runs a shell command and names
|
|
54
|
-
* `
|
|
55
|
-
* summary would make `show` state something untrue about what will run, so the
|
|
55
|
+
* An `exec` unit runs a shell command and names no connection or harness — the parser rejects
|
|
56
|
+
* `connection`/`harness`/`model`/`llm` alongside `exec:`. Merging the run's default
|
|
57
|
+
* into its summary would make `show` state something untrue about what will run, so the
|
|
56
58
|
* two fields are suppressed and the argv is projected instead, under `exec`
|
|
57
59
|
* (field presence carries the dispatch kind, exactly like `fanOut`
|
|
58
60
|
* carries the step kind).
|
|
@@ -70,11 +72,16 @@ function projectParameters(plan) {
|
|
|
70
72
|
* It is far smaller than the step `instructions` this same projection
|
|
71
73
|
* already carries whole.
|
|
72
74
|
*/
|
|
73
|
-
function summarizeStepOrchestration(step, defaults) {
|
|
75
|
+
export function summarizeStepOrchestration(step, defaults) {
|
|
74
76
|
const spec = step.spec;
|
|
75
77
|
const unit = spec?.unit;
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
+
// A stored plan carries no authored spec: read the same fields off its frozen dispatch.
|
|
79
|
+
const frozen = spec ? undefined : frozenDispatch(step);
|
|
80
|
+
const exec = spec ? spec.exec : frozen?.exec;
|
|
81
|
+
const env = unit?.env ?? frozen?.env;
|
|
82
|
+
const workflow = spec ? spec.workflow : frozen?.workflow;
|
|
83
|
+
const named = (settings) => settings?.connection ?? settings?.harness ?? settings?.engine;
|
|
84
|
+
const engine = exec ? undefined : (named(unit) ?? named(defaults));
|
|
78
85
|
const model = exec ? undefined : (unit?.model ?? defaults?.model);
|
|
79
86
|
const timeoutMs = unit?.timeoutMs !== undefined ? unit.timeoutMs : defaults?.timeoutMs;
|
|
80
87
|
const summary = {
|
|
@@ -93,10 +100,77 @@ function summarizeStepOrchestration(step, defaults) {
|
|
|
93
100
|
}
|
|
94
101
|
: {}),
|
|
95
102
|
...(unit?.output !== undefined || step.outputSchema !== undefined ? { hasSchema: true } : {}),
|
|
96
|
-
...(
|
|
103
|
+
...(env !== undefined ? { env: [...env] } : {}),
|
|
104
|
+
...(workflow !== undefined ? { workflow } : {}),
|
|
97
105
|
};
|
|
98
106
|
return Object.keys(summary).length > 0 ? summary : undefined;
|
|
99
107
|
}
|
|
108
|
+
/** The exec argv, env refs and child workflow a frozen step dispatches. */
|
|
109
|
+
function frozenDispatch(step) {
|
|
110
|
+
const root = step.root;
|
|
111
|
+
const unit = root?.kind === "map" ? root.template : root;
|
|
112
|
+
if (!unit)
|
|
113
|
+
return {};
|
|
114
|
+
const target = unit.frozenTarget;
|
|
115
|
+
const env = unit.environment.flatMap((binding) => (binding.kind === "env-ref" ? [binding.ref] : []));
|
|
116
|
+
return {
|
|
117
|
+
...(target.kind === "shell"
|
|
118
|
+
? {
|
|
119
|
+
exec: {
|
|
120
|
+
command: [...target.exec.command],
|
|
121
|
+
...(target.exec.cwd !== undefined ? { cwd: target.exec.cwd } : {}),
|
|
122
|
+
...(target.exec.passEnv ? { passEnv: [...target.exec.passEnv] } : {}),
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
: {}),
|
|
126
|
+
...(env.length > 0 ? { env } : {}),
|
|
127
|
+
...(target.kind === "child-workflow" ? { workflow: target.ref } : {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Add the bundle-qualified ref every `${ref}` token in the argv or cwd, every
|
|
132
|
+
* `env:` entry and the child `workflow:` resolves to right now, through the
|
|
133
|
+
* one owner walk (`resolveRefOwner`). A ref no bundle owns lands in
|
|
134
|
+
* `unresolved` instead; callers decide whether that is an error. No secret
|
|
135
|
+
* is read and no path is returned.
|
|
136
|
+
*/
|
|
137
|
+
export function resolveOrchestrationRefs(summary) {
|
|
138
|
+
const refs = [];
|
|
139
|
+
const unresolved = [];
|
|
140
|
+
const note = (ref, where) => {
|
|
141
|
+
let owner;
|
|
142
|
+
try {
|
|
143
|
+
owner = resolveRefOwner(ref);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
owner = undefined;
|
|
147
|
+
}
|
|
148
|
+
if (owner)
|
|
149
|
+
refs.push({ ref, resolved: owner.ref, in: where });
|
|
150
|
+
else
|
|
151
|
+
unresolved.push({ ref, in: where });
|
|
152
|
+
};
|
|
153
|
+
const tokens = (values, where) => {
|
|
154
|
+
const seen = new Set();
|
|
155
|
+
substituteRefTokens(Object.fromEntries(values.map((value, index) => [String(index), value])), (ref) => {
|
|
156
|
+
if (!seen.has(ref)) {
|
|
157
|
+
seen.add(ref);
|
|
158
|
+
note(ref, where);
|
|
159
|
+
}
|
|
160
|
+
return { kind: "path", path: "" };
|
|
161
|
+
}, isInstalledBundle);
|
|
162
|
+
};
|
|
163
|
+
if (summary.exec) {
|
|
164
|
+
tokens(summary.exec.command, "argv");
|
|
165
|
+
if (summary.exec.cwd !== undefined)
|
|
166
|
+
tokens([summary.exec.cwd], "cwd");
|
|
167
|
+
}
|
|
168
|
+
for (const ref of summary.env ?? [])
|
|
169
|
+
note(ref, "env");
|
|
170
|
+
if (summary.workflow !== undefined)
|
|
171
|
+
note(summary.workflow, "workflow");
|
|
172
|
+
return { ...summary, refs, ...(unresolved.length > 0 ? { unresolved } : {}) };
|
|
173
|
+
}
|
|
100
174
|
function projectStepDefinitions(plan) {
|
|
101
175
|
return plan.steps.map((step, sequenceIndex) => {
|
|
102
176
|
const orchestration = summarizeStepOrchestration(step, plan.defaults);
|
|
@@ -35,7 +35,7 @@ export const WORKFLOW_EXEC_OUTPUT_TRUNCATED_MARKER = "__akm_exec_output_truncate
|
|
|
35
35
|
// Per-var: Win32 `SetEnvironmentVariable` caps one variable at 32 767 UTF-16
|
|
36
36
|
// code units; measuring UTF-8 bytes is conservative in the right direction.
|
|
37
37
|
// Total: akm's own share of the `CreateProcess` `lpEnvironment` block, which it
|
|
38
|
-
// shares with the
|
|
38
|
+
// shares with the rest of the environment, the unit's `env:` bindings and the argv.
|
|
39
39
|
const EXEC_CONTEXT_LIMITS_WIN32 = {
|
|
40
40
|
perVarBytes: 32_767,
|
|
41
41
|
totalBytes: 64_000,
|
|
@@ -45,7 +45,7 @@ const EXEC_CONTEXT_LIMITS_WIN32 = {
|
|
|
45
45
|
// margin for the name, `=`, NUL and the kernel's own accounting — the guard must
|
|
46
46
|
// never reject a spawn the platform would have accepted.
|
|
47
47
|
// Total: half of macOS's 256 KiB `ARG_MAX` (the tightest supported total), so
|
|
48
|
-
// the other half remains for the argv, the
|
|
48
|
+
// the other half remains for the argv, the rest of the environment and the `env:` bindings.
|
|
49
49
|
const EXEC_CONTEXT_LIMITS_POSIX = {
|
|
50
50
|
perVarBytes: 96 * 1024,
|
|
51
51
|
totalBytes: 128 * 1024,
|
|
@@ -7,15 +7,21 @@
|
|
|
7
7
|
*
|
|
8
8
|
* {@link decodeWorkflowPlan} accepts every plan shape a release at or above
|
|
9
9
|
* the 0.9.15 floor has stored — irVersion 5 (with its `sourceReadSet` and
|
|
10
|
-
* host-identity fields, which 0.9.15 and 0.9.16 wrote)
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
10
|
+
* host-identity fields, which 0.9.15 and 0.9.16 wrote) and irVersion 6 (with
|
|
11
|
+
* its frozen `cwdIdentity` and env owner paths) as well as the current one —
|
|
12
|
+
* and keeps keys it does not know rather than refusing them. A stored target
|
|
13
|
+
* is kept exactly as stored, location fields included: the unit `input_hash`
|
|
14
|
+
* and the child invocation key derive from the whole target, so dropping them
|
|
15
|
+
* would make an interrupted run publish a second child after an upgrade.
|
|
16
|
+
* Dispatch finds the bundle and the env asset by ref and never reads them. It
|
|
17
|
+
* rejects only a plan it cannot run: no steps, a unit with no frozen target, a
|
|
18
|
+
* request that does not decode — which is every command target an earlier
|
|
19
|
+
* irVersion froze, since each names an engine. `plan_hash` is an informational column. A plan
|
|
20
|
+
* that cannot be decoded comes back from {@link readRunPlan} as a `problem`
|
|
16
21
|
* sentence and the caller decides the remedy (the engine abandons such a run
|
|
17
|
-
* instead of throwing) — except for a plan a NEWER akm froze
|
|
18
|
-
*
|
|
22
|
+
* instead of throwing) — except for a plan a NEWER akm froze (`plan_ir_version`
|
|
23
|
+
* above this release's), which is refused unread as `newer` with a problem that
|
|
24
|
+
* names upgrading akm as the remedy.
|
|
19
25
|
*/
|
|
20
26
|
import { UsageError } from "../../core/errors.js";
|
|
21
27
|
import { warnOnce } from "../../core/warn.js";
|
|
@@ -26,6 +32,14 @@ export function readRunPlan(row) {
|
|
|
26
32
|
if (!row.plan_json)
|
|
27
33
|
return { ok: false, newer: false, problem: `Workflow run ${row.id} has no frozen workflow plan.` };
|
|
28
34
|
const version = row.plan_ir_version ?? null;
|
|
35
|
+
if (version !== null && version > WORKFLOW_PLAN_VERSION) {
|
|
36
|
+
return {
|
|
37
|
+
ok: false,
|
|
38
|
+
newer: true,
|
|
39
|
+
problem: `Workflow run ${row.id} was frozen by a newer akm (plan irVersion ${version}) and this akm ` +
|
|
40
|
+
`(irVersion ${WORKFLOW_PLAN_VERSION}) will not run it. Upgrade akm to continue this run.`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
29
43
|
try {
|
|
30
44
|
const plan = decodeWorkflowPlan(JSON.parse(row.plan_json), {
|
|
31
45
|
...(row.workflow_ref ? { workflowRef: row.workflow_ref } : {}),
|
|
@@ -38,14 +52,6 @@ export function readRunPlan(row) {
|
|
|
38
52
|
}
|
|
39
53
|
catch (cause) {
|
|
40
54
|
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
41
|
-
if (version !== null && version > WORKFLOW_PLAN_VERSION) {
|
|
42
|
-
return {
|
|
43
|
-
ok: false,
|
|
44
|
-
newer: true,
|
|
45
|
-
problem: `Workflow run ${row.id} was frozen by a newer akm (plan irVersion ${version}) and this akm cannot decode it: ` +
|
|
46
|
-
`${detail}. Upgrade akm to continue this run.`,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
55
|
const frozenAs = version === null ? "" : ` (frozen as plan irVersion ${version})`;
|
|
50
56
|
return {
|
|
51
57
|
ok: false,
|
|
@@ -166,7 +172,7 @@ function decodeTarget(value, label) {
|
|
|
166
172
|
kind: "shell",
|
|
167
173
|
contentHash: string(target.contentHash, `${label} contentHash`),
|
|
168
174
|
exec: decodeExec(target.exec, label),
|
|
169
|
-
|
|
175
|
+
...legacyField(target, "cwdIdentity"),
|
|
170
176
|
...optional,
|
|
171
177
|
};
|
|
172
178
|
case "child-workflow":
|
|
@@ -203,12 +209,15 @@ function decodeCommandTarget(target, label) {
|
|
|
203
209
|
request,
|
|
204
210
|
runner,
|
|
205
211
|
...(concurrency !== undefined ? { concurrency } : {}),
|
|
206
|
-
...(target
|
|
207
|
-
? { cwdIdentity: target.cwdIdentity }
|
|
208
|
-
: {}),
|
|
212
|
+
...legacyField(target, "cwdIdentity"),
|
|
209
213
|
...(inputBindings ? { inputBindings } : {}),
|
|
210
214
|
};
|
|
211
215
|
}
|
|
216
|
+
/** A location field a stored target carries, kept as stored (see the module doc). */
|
|
217
|
+
function legacyField(source, key) {
|
|
218
|
+
const value = source[key];
|
|
219
|
+
return value && typeof value === "object" ? { [key]: value } : {};
|
|
220
|
+
}
|
|
212
221
|
function decodeExec(value, label) {
|
|
213
222
|
const exec = record(value, `${label} exec`);
|
|
214
223
|
const command = exec.command;
|
|
@@ -246,14 +255,20 @@ function decodeEnvironmentBinding(value, label) {
|
|
|
246
255
|
return { kind: "pass-through", name: string(binding.name, label) };
|
|
247
256
|
if (binding.kind !== "env-ref")
|
|
248
257
|
fail(`${label} has an unsupported kind`);
|
|
258
|
+
// Plans before irVersion 7 also carry the env file's owner, key names and secret names: kept as stored,
|
|
259
|
+
// never read (dispatch reads the env asset by ref).
|
|
249
260
|
const strings = (items) => Array.isArray(items) ? items.filter((item) => typeof item === "string") : [];
|
|
250
261
|
return {
|
|
251
262
|
kind: "env-ref",
|
|
252
263
|
ref: string(binding.ref, `${label} ref`),
|
|
253
|
-
owner: record(binding.owner, `${label} owner`),
|
|
254
|
-
keys: strings(binding.keys),
|
|
255
|
-
secretNames: strings(binding.secretNames),
|
|
256
264
|
precedence: typeof binding.precedence === "number" ? binding.precedence : 0,
|
|
265
|
+
...(binding.owner && typeof binding.owner === "object"
|
|
266
|
+
? {
|
|
267
|
+
owner: binding.owner,
|
|
268
|
+
keys: strings(binding.keys),
|
|
269
|
+
secretNames: strings(binding.secretNames),
|
|
270
|
+
}
|
|
271
|
+
: {}),
|
|
257
272
|
};
|
|
258
273
|
}
|
|
259
274
|
function positiveInteger(value) {
|