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
|
@@ -101,6 +101,38 @@ function copyFileOutsideThisProcess(source, destination) {
|
|
|
101
101
|
const reason = result.stderr.trim() || (result.signal ? `killed by ${result.signal}` : `exit status ${result.status}`);
|
|
102
102
|
throw new Error(`cp could not copy ${source}: ${reason}`);
|
|
103
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Copy a stable main/WAL pair of the database at `dbPath` to `snapshotPath`
|
|
106
|
+
* (and `<snapshotPath>-wal`), never attaching SQLite to the source. Retries
|
|
107
|
+
* while a writer is active; throws {@link SqliteReadSnapshotUnavailableError}
|
|
108
|
+
* when the files never settle.
|
|
109
|
+
*/
|
|
110
|
+
export function copySqliteSnapshot(dbPath, snapshotPath) {
|
|
111
|
+
for (let attempt = 0; attempt < SNAPSHOT_MAX_ATTEMPTS; attempt++) {
|
|
112
|
+
if (attempt > 0)
|
|
113
|
+
sleepSync(SNAPSHOT_BACKOFF_MS * attempt);
|
|
114
|
+
try {
|
|
115
|
+
if (pathExists(`${dbPath}-journal`))
|
|
116
|
+
continue;
|
|
117
|
+
const before = databaseFingerprint(dbPath);
|
|
118
|
+
copyFileOutsideThisProcess(dbPath, snapshotPath);
|
|
119
|
+
if (before.wal)
|
|
120
|
+
copyFileOutsideThisProcess(`${dbPath}-wal`, `${snapshotPath}-wal`);
|
|
121
|
+
else
|
|
122
|
+
fs.rmSync(`${snapshotPath}-wal`, { force: true });
|
|
123
|
+
const after = databaseFingerprint(dbPath);
|
|
124
|
+
if (fingerprintsEqual(before, after) && !pathExists(`${dbPath}-journal`))
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (error.code === "ENOENT")
|
|
129
|
+
continue;
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
throw new SqliteReadSnapshotUnavailableError(`SQLite main/WAL files did not settle after ${SNAPSHOT_MAX_ATTEMPTS} attempts with backoff — ` +
|
|
134
|
+
"a writer may be continuously active, or a hot rollback journal never cleared");
|
|
135
|
+
}
|
|
104
136
|
/**
|
|
105
137
|
* Open an isolated copy of an existing SQLite database.
|
|
106
138
|
*
|
|
@@ -118,35 +150,7 @@ export function openSqliteReadSnapshot(dbPath) {
|
|
|
118
150
|
const snapshotPath = path.join(snapshotDir, "snapshot.db");
|
|
119
151
|
let db;
|
|
120
152
|
try {
|
|
121
|
-
|
|
122
|
-
for (let attempt = 0; attempt < SNAPSHOT_MAX_ATTEMPTS; attempt++) {
|
|
123
|
-
if (attempt > 0)
|
|
124
|
-
sleepSync(SNAPSHOT_BACKOFF_MS * attempt);
|
|
125
|
-
try {
|
|
126
|
-
if (pathExists(`${dbPath}-journal`))
|
|
127
|
-
continue;
|
|
128
|
-
const before = databaseFingerprint(dbPath);
|
|
129
|
-
copyFileOutsideThisProcess(dbPath, snapshotPath);
|
|
130
|
-
if (before.wal)
|
|
131
|
-
copyFileOutsideThisProcess(`${dbPath}-wal`, `${snapshotPath}-wal`);
|
|
132
|
-
else
|
|
133
|
-
fs.rmSync(`${snapshotPath}-wal`, { force: true });
|
|
134
|
-
const after = databaseFingerprint(dbPath);
|
|
135
|
-
if (fingerprintsEqual(before, after) && !pathExists(`${dbPath}-journal`)) {
|
|
136
|
-
copied = true;
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
if (error.code === "ENOENT")
|
|
142
|
-
continue;
|
|
143
|
-
throw error;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (!copied) {
|
|
147
|
-
throw new SqliteReadSnapshotUnavailableError(`SQLite main/WAL files did not settle after ${SNAPSHOT_MAX_ATTEMPTS} attempts with backoff — ` +
|
|
148
|
-
"a writer may be continuously active, or a hot rollback journal never cleared");
|
|
149
|
-
}
|
|
153
|
+
copySqliteSnapshot(dbPath, snapshotPath);
|
|
150
154
|
db = openDatabaseFinalizing(snapshotPath, { readonly: true, create: false });
|
|
151
155
|
const closeSnapshot = db.close.bind(db);
|
|
152
156
|
let closed = false;
|
package/dist/tasks/embedded.js
CHANGED
|
@@ -1,110 +1,9 @@
|
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
*
|
|
8
|
-
* # The gap
|
|
9
|
-
*
|
|
10
|
-
* All three task target kinds funnel through `persistRunLog`, which applied
|
|
11
|
-
* only `redactCredentialPatterns` — credential *shapes* (`Bearer …`, `sk-…`,
|
|
12
|
-
* webhook URLs). Prompt- and workflow-target runs additionally redact the exact
|
|
13
|
-
* secret values reachable by the run before their output ever reaches the log.
|
|
14
|
-
* Command-target runs did not: a scheduled command that echoed a configured
|
|
15
|
-
* secret whose value is not credential-shaped persisted it verbatim, into both
|
|
16
|
-
* the `.log` file and `logs.db`, for the whole retention window.
|
|
17
|
-
*
|
|
18
|
-
* # Why the obvious fix is wrong
|
|
19
|
-
*
|
|
20
|
-
* The issue proposed reusing {@link isEnvPassthroughValueSafeToExpose} — the
|
|
21
|
-
* filter the prompt path uses — over the env handed to the child. That filter
|
|
22
|
-
* fails CLOSED for any name outside a 22-entry allowlist, which is right where
|
|
23
|
-
* it currently runs: the prompt path filters `envPassthrough`, a short list the
|
|
24
|
-
* operator explicitly declared. A command task inherits the WHOLE ambient
|
|
25
|
-
* environment, so the same rule classifies essentially everything as secret.
|
|
26
|
-
* Measured on a developer machine: 127 of 132 variables, 25 of them with
|
|
27
|
-
* one-character values (`SHLVL=1`, `OLDPWD=/`, `GIT_TERMINAL_PROMPT=0`).
|
|
28
|
-
* Redaction is substring replacement, so those become live needles:
|
|
29
|
-
*
|
|
30
|
-
* Build finished in 12.4s -> Build finished in [REDACTED]2.[REDACTED]s
|
|
31
|
-
* 3 tests passed, 0 failed -> [REDACTED] tests passed, [REDACTED] failed
|
|
32
|
-
* wrote dist/index.js (48 KB) -> wrote dist[REDACTED]index.js ([REDACTED]8 KB)
|
|
33
|
-
*
|
|
34
|
-
* A fix that destroys every command log is not a fix.
|
|
35
|
-
*
|
|
36
|
-
* # What this does instead
|
|
37
|
-
*
|
|
38
|
-
* Three sources, and the distinction between them is the whole design:
|
|
39
|
-
*
|
|
40
|
-
* 1. **Declared by config** — the config names which variables hold
|
|
41
|
-
* credentials (`engines.<n>.apiKey: ${VAR}`, `embedding.apiKey`, and the
|
|
42
|
-
* implicit `AKM_ENGINE_<NAME>_API_KEY` / `AKM_LLM_API_KEY` /
|
|
43
|
-
* `AKM_EMBED_API_KEY` recipes). akm KNOWS these are secret.
|
|
44
|
-
* 2. **Declared by the task** — the `redact:` list, names only.
|
|
45
|
-
* 3. **Inferred** — a name-shape heuristic over the remaining environment, for
|
|
46
|
-
* the ambient credential akm was never told about.
|
|
47
|
-
*
|
|
48
|
-
* Only (3) is a guess, so only (3) carries {@link MIN_INFERRED_SECRET_LENGTH}.
|
|
49
|
-
* A declared secret is redacted at ANY length, because the operator told us
|
|
50
|
-
* what it is; applying a floor to declared values would silently stop redacting
|
|
51
|
-
* short secrets that are scrubbed today. The floor exists solely to stop a
|
|
52
|
-
* *guess* from mangling a log, and 8 clears every real credential format (AWS
|
|
53
|
-
* key id 20, GitHub PAT 40, `sk-…` 40+) while excluding the flags and counters
|
|
54
|
-
* that a name heuristic occasionally catches.
|
|
55
|
-
*
|
|
56
|
-
* Note what is deliberately NOT collected: the akm secret store on disk. A
|
|
57
|
-
* spawned command sees `process.env`, not akm's stores — a stored secret can
|
|
58
|
-
* only be echoed if it is already in the environment, where the rules above
|
|
59
|
-
* catch it by name. Walking every bundle's `secrets/` on each task firing would
|
|
60
|
-
* cost a recursive readdir plus an unbounded read for values the child cannot
|
|
61
|
-
* reach anyway. `redact:` is the escape hatch for a secret injected under a
|
|
62
|
-
* name none of the rules recognise.
|
|
63
|
-
*/
|
|
64
|
-
import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose } from "../core/redaction.js";
|
|
65
|
-
import { collectEngineCredentialValues } from "../integrations/agent/engine-resolution.js";
|
|
66
|
-
/**
|
|
67
|
-
* Shortest value an INFERRED (name-heuristic) match may contribute as a
|
|
68
|
-
* redaction needle. Declared secrets bypass this entirely.
|
|
69
|
-
*
|
|
70
|
-
* Redaction replaces substrings, so a short needle is not merely useless — it
|
|
71
|
-
* corrupts unrelated output. Below 8 the noise tier is fully intact (`1`, `0`,
|
|
72
|
-
* `/`, `80`, `true`, `xhigh`, `31999`); at 8 a chance collision with ordinary
|
|
73
|
-
* log vocabulary is negligible, and every credential format in real use is far
|
|
74
|
-
* longer. It also matches the conventional minimum password length, so a
|
|
75
|
-
* secret shorter than this is already outside normal policy.
|
|
76
|
-
*/
|
|
77
|
-
export const MIN_INFERRED_SECRET_LENGTH = 8;
|
|
78
|
-
/**
|
|
79
|
-
* Environment names whose VALUE is treated as a credential on shape alone.
|
|
80
|
-
*
|
|
81
|
-
* The keyword must be a whole `_`-delimited word. Anchoring on only one side
|
|
82
|
-
* would drag in ordinary configuration from whichever side is left open:
|
|
83
|
-
* a leading anchor alone matches `KEYBOARD_LAYOUT` and `AUTHOR`, a trailing one
|
|
84
|
-
* matches `MONKEY` and `BYPASS`. Whole-word matching gets `GH_TOKEN`,
|
|
85
|
-
* `NPM_AUTH_TOKEN`, `MY_API_KEY`, `DB_PASS` and `AWS_SECRET_ACCESS_KEY` right.
|
|
86
|
-
*/
|
|
87
|
-
const INFERRED_SECRET_NAME = /(?:^|_)(?:API_?KEY|KEY|TOKEN|SECRET|PASSWORD|PASSWD|PASS|CREDENTIALS?|AUTH)(?:_|$)/i;
|
|
88
|
-
/**
|
|
89
|
-
* Credential variables whose name is a single glued word, which no
|
|
90
|
-
* word-boundary rule can see. Enumerated rather than matched: loosening the
|
|
91
|
-
* pattern enough to catch `PGPASSWORD` also catches `MONKEY`.
|
|
92
|
-
*
|
|
93
|
-
* `PWD` cannot be a keyword above for the same reason it appears here as part
|
|
94
|
-
* of `MYSQL_PWD` — on its own it is the working directory.
|
|
95
|
-
*/
|
|
96
|
-
const KNOWN_SECRET_NAMES = new Set(["PGPASSWORD", "MYSQL_PWD"]);
|
|
97
|
-
/** True when the NAME alone marks this variable as holding a credential. */
|
|
98
|
-
export function isInferredSecretName(name) {
|
|
99
|
-
return KNOWN_SECRET_NAMES.has(name.toUpperCase()) || INFERRED_SECRET_NAME.test(name);
|
|
100
|
-
}
|
|
101
|
-
/** Resolve `${VAR}` / `$VAR` to the variable NAME, or undefined for anything else. */
|
|
102
|
-
function envRefName(spec) {
|
|
103
|
-
if (!spec)
|
|
104
|
-
return undefined;
|
|
105
|
-
const match = /^\$\{?([A-Za-z_][A-Za-z0-9_]*)\}?$/.exec(spec.trim());
|
|
106
|
-
return match?.[1];
|
|
107
|
-
}
|
|
4
|
+
import { collectCredentialValues } from "../core/config/credentials.js";
|
|
5
|
+
import { collectInferredSecretValues, collectSensitiveValues } from "../core/redaction.js";
|
|
6
|
+
export { isInferredSecretName, MIN_INFERRED_SECRET_LENGTH } from "../core/redaction.js";
|
|
108
7
|
/**
|
|
109
8
|
* Every value that must be scrubbed from one task's persisted output.
|
|
110
9
|
*
|
|
@@ -127,28 +26,17 @@ export function collectTaskLogSensitiveValues(input) {
|
|
|
127
26
|
if (trimmed.length > 0)
|
|
128
27
|
values.add(trimmed);
|
|
129
28
|
};
|
|
130
|
-
// (1) Declared by config —
|
|
131
|
-
// path already uses, plus the embedding key it does not cover.
|
|
29
|
+
// (1) Declared by config — every key a connection, the embedder or the reranker can resolve.
|
|
132
30
|
if (config) {
|
|
133
|
-
for (const value of
|
|
31
|
+
for (const value of collectCredentialValues(config, env))
|
|
134
32
|
values.add(value);
|
|
135
|
-
addDeclared(env[envRefName(config.embedding?.apiKey) ?? "AKM_EMBED_API_KEY"]);
|
|
136
33
|
}
|
|
137
34
|
// (2) Declared by the task's `redact:` list — names only, never values.
|
|
138
35
|
for (const name of declaredNames ?? [])
|
|
139
36
|
addDeclared(env[name]);
|
|
140
|
-
// (3) Inferred from the name shape
|
|
141
|
-
|
|
142
|
-
// an allowlisted name from being treated as secret.
|
|
143
|
-
for (const [name, value] of Object.entries(env)) {
|
|
144
|
-
if (value === undefined || value.length < MIN_INFERRED_SECRET_LENGTH)
|
|
145
|
-
continue;
|
|
146
|
-
if (!isInferredSecretName(name))
|
|
147
|
-
continue;
|
|
148
|
-
if (isEnvPassthroughValueSafeToExpose(name, value))
|
|
149
|
-
continue;
|
|
37
|
+
// (3) Inferred from the name shape, the one guessing tier (`collectInferredSecretValues`).
|
|
38
|
+
for (const value of collectInferredSecretValues(env))
|
|
150
39
|
values.add(value);
|
|
151
|
-
}
|
|
152
40
|
// Expands credential-bearing URLs into their embedded components. Can yield
|
|
153
41
|
// needles shorter than the floor (a URL's password), which is correct: the
|
|
154
42
|
// operator's own value implied them.
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
5
5
|
import { COMPOSITION_INVALID_MULTI_JOB_HINT, ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
|
|
6
6
|
import { DURATION_UNITS, parseDuration } from "../../core/time.js";
|
|
7
|
+
import { warn } from "../../core/warn.js";
|
|
7
8
|
import { isPortableExecutionAgentSelector } from "../../execution/source.js";
|
|
8
9
|
import { buildExecution } from "../../integrations/agent/execution.js";
|
|
9
10
|
import { resolveAssetPath } from "../../sources/resolve.js";
|
|
@@ -22,7 +23,7 @@ export function environmentSnapshot(environment) {
|
|
|
22
23
|
continue;
|
|
23
24
|
const value = String(raw);
|
|
24
25
|
if (isInferredSecretName(key) || detectSecretShapedParams({ [key]: value }).length > 0) {
|
|
25
|
-
|
|
26
|
+
warn(`Task env.${key} looks like a credential. Task source is durable and readable; keep the value in a secret or env file and inject it at run time with \`akm secret run\` or \`akm env run\` in the task's \`run:\`. (Heuristic warning; the value is used as written.)`);
|
|
26
27
|
}
|
|
27
28
|
Object.defineProperty(out, key, { value, enumerable: true, configurable: false, writable: false });
|
|
28
29
|
}
|
|
@@ -66,11 +67,12 @@ export function currentExecutionValues(document, context, environment) {
|
|
|
66
67
|
: agent,
|
|
67
68
|
}
|
|
68
69
|
: {}),
|
|
70
|
+
...(own(akm, "connection") ? { connection: akm?.connection } : {}),
|
|
71
|
+
...(own(akm, "harness") ? { harness: akm?.harness } : {}),
|
|
69
72
|
...(own(akm, "engine") ? { engine: akm?.engine } : {}),
|
|
70
73
|
...(own(akm, "model") ? { model: akm?.model } : {}),
|
|
71
74
|
...(own(akm, "inference") ? { inference: akm?.inference } : {}),
|
|
72
75
|
...(own(akm, "outputSchema") ? { outputSchema: akm?.outputSchema } : {}),
|
|
73
|
-
...(own(akm, "tools") ? { tools: akm?.tools } : {}),
|
|
74
76
|
...(own(akm, "timeout") ? { timeout: akm?.timeout } : {}),
|
|
75
77
|
workspace: context.bundleRoot,
|
|
76
78
|
environment,
|
|
@@ -109,8 +111,8 @@ export function defaultTaskShell(platform) {
|
|
|
109
111
|
}
|
|
110
112
|
export function validatePreparedCommand(invocation, context) {
|
|
111
113
|
const { request } = invocation;
|
|
112
|
-
if (!request.
|
|
113
|
-
throw new ConfigError(`Task ${JSON.stringify(context.taskRef)} has no resolved
|
|
114
|
+
if (!request.target.name) {
|
|
115
|
+
throw new ConfigError(`Task ${JSON.stringify(context.taskRef)} has no resolved connection or harness. Run \`akm setup\`, or set akm.connection or akm.harness before running it.`, "INVALID_CONFIG_FILE");
|
|
114
116
|
}
|
|
115
117
|
// Lowering is pure. Running it before the durable-attempt boundary proves
|
|
116
118
|
// the selected target is transport-projectable; dispatch repeats the same
|
|
@@ -120,10 +122,9 @@ export function validatePreparedCommand(invocation, context) {
|
|
|
120
122
|
}
|
|
121
123
|
export function validateWorkflowRuntimeSource(file, workspaceRoot, readFile) {
|
|
122
124
|
const source = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(readFile(file, workspaceRoot));
|
|
123
|
-
const compiled = compileWorkflowSource(source, { path: file
|
|
125
|
+
const compiled = compileWorkflowSource(source, { path: file });
|
|
124
126
|
if (!compiled.ok) {
|
|
125
|
-
//
|
|
126
|
-
// task-wrapped workflow target's own multi-job source is a composition
|
|
127
|
+
// A task-wrapped workflow target's own multi-job source is a composition
|
|
127
128
|
// failure, same as freezing it directly would be; any other compile
|
|
128
129
|
// failure is WORKFLOW_SOURCE_INVALID.
|
|
129
130
|
const detail = compiled.errors.map((error) => `${error.path}:${error.line}: ${error.message}`).join("; ");
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Pure task runtime projection.
|
|
6
6
|
*
|
|
7
7
|
* This is the only bridge from an already-parsed, already-projected task
|
|
8
|
-
* source document (the `PreparableTaskDocument` seam
|
|
8
|
+
* source document (the `PreparableTaskDocument` seam) into executable
|
|
9
9
|
* work. It performs all source/config/asset reads before the task runner
|
|
10
10
|
* reserves a durable attempt and returns immutable snapshots. In particular,
|
|
11
11
|
* script work contains frozen bytes and their digest, never a path that can
|
|
@@ -14,30 +14,29 @@
|
|
|
14
14
|
* `prepareTaskV3Execution`'s three production callers are
|
|
15
15
|
* `src/tasks/run/load-task.ts`, `src/tasks/scheduler-sync.ts`, and
|
|
16
16
|
* `src/workflows/freeze/targets/task.ts`'s `taskDispatch`. The name and the
|
|
17
|
-
* `TaskV3*` type family it takes stay
|
|
18
|
-
*
|
|
19
|
-
* `
|
|
17
|
+
* `TaskV3*` type family it takes stay; only task source v4 ever reaches this
|
|
18
|
+
* function now, always via `src/tasks/source/project-v4.ts`'s
|
|
19
|
+
* `projectTaskSourceV4()`.
|
|
20
20
|
*/
|
|
21
21
|
import fs from "node:fs";
|
|
22
|
+
import path from "node:path";
|
|
22
23
|
import { prepareCommandInvocation } from "../../commands/command/command-execution.js";
|
|
23
24
|
import { UsageError } from "../../core/errors.js";
|
|
24
25
|
import { warn } from "../../core/warn.js";
|
|
25
26
|
import { base, commandEnvironmentSnapshot, currentExecutionValues, defaultTaskShell, environmentSnapshot, qualifyOwnedRef, resolvedOwnedAsset, validatePreparedCommand, validateWorkflowRuntimeSource, } from "./prepare-support.js";
|
|
26
|
-
import {
|
|
27
|
+
import { captureScriptTarget } from "./script-capture.js";
|
|
27
28
|
/** Project one canonical task-v3 source into immutable executable work. */
|
|
28
29
|
export async function prepareTaskV3Execution(document, context) {
|
|
29
30
|
const environment = environmentSnapshot(document.env);
|
|
30
31
|
const commandEnvironment = commandEnvironmentSnapshot(environment, context.schedulerContext);
|
|
31
32
|
const common = base(document, context, environment);
|
|
32
33
|
if (document.target.kind === "run") {
|
|
33
|
-
const cwdIdentity = captureDirectoryIdentity(context.bundleRoot, document.target.workingDirectory);
|
|
34
34
|
return Object.freeze({
|
|
35
35
|
...common,
|
|
36
36
|
kind: "shell",
|
|
37
37
|
command: document.target.run,
|
|
38
38
|
shell: document.target.shell ?? defaultTaskShell(context.platform ?? process.platform),
|
|
39
|
-
cwd:
|
|
40
|
-
cwdIdentity,
|
|
39
|
+
cwd: path.resolve(context.bundleRoot, document.target.workingDirectory ?? "."),
|
|
41
40
|
});
|
|
42
41
|
}
|
|
43
42
|
const target = document.target.uses;
|
|
@@ -98,7 +97,7 @@ export async function prepareTaskV3Execution(document, context) {
|
|
|
98
97
|
throw new UsageError("Script refs do not accept with.", "COMPOSITION_INVALID");
|
|
99
98
|
}
|
|
100
99
|
const resolved = await resolvedOwnedAsset(qualified, "script", context);
|
|
101
|
-
// Shared with prepare-script-target.ts's prepareScriptTarget()
|
|
100
|
+
// Shared with prepare-script-target.ts's prepareScriptTarget():
|
|
102
101
|
// one implementation of the byte/interpreter capture, not two.
|
|
103
102
|
const captured = captureScriptTarget(qualified, resolved.file, resolved.bundleRoot, context.readFile ?? ((targetPath) => fs.readFileSync(targetPath)));
|
|
104
103
|
return Object.freeze({
|
|
@@ -2,18 +2,15 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* The one shared implementation of frozen-script byte/interpreter capture
|
|
6
|
-
*
|
|
7
|
-
* script arm (the moved prepareTaskV3Execution) and
|
|
5
|
+
* The one shared implementation of frozen-script byte/interpreter capture.
|
|
6
|
+
* Both prepare.ts's script arm (prepareTaskV3Execution) and
|
|
8
7
|
* prepare-script-target.ts's typed prepareScriptTarget() call
|
|
9
8
|
* captureScriptTarget() below, so the two never drift into two copies of the
|
|
10
|
-
* same capture logic.
|
|
11
|
-
* moved body-intact out of the pre-P1b src/tasks/runtime-v3.ts.
|
|
9
|
+
* same capture logic.
|
|
12
10
|
*/
|
|
13
11
|
import { createHash } from "node:crypto";
|
|
14
12
|
import path from "node:path";
|
|
15
13
|
import { UsageError } from "../../core/errors.js";
|
|
16
|
-
import { captureFrozenDirectoryIdentity } from "../../execution/directory-identity.js";
|
|
17
14
|
import { isBunStandaloneMain } from "../resolve-akm-bin.js";
|
|
18
15
|
const SCRIPT_INTERPRETERS = Object.freeze({
|
|
19
16
|
".sh": "sh",
|
|
@@ -77,36 +74,23 @@ export function scriptInterpreter(extension, ref, bytes) {
|
|
|
77
74
|
}
|
|
78
75
|
throw new UsageError(`Task v3 script target ${JSON.stringify(ref)} requires Bun for ${extension} execution, but this runtime cannot provide it.`, "TASK_TARGET_UNSUPPORTED");
|
|
79
76
|
}
|
|
80
|
-
export function captureDirectoryIdentity(bundleRoot, workingDirectory) {
|
|
81
|
-
try {
|
|
82
|
-
return captureFrozenDirectoryIdentity(bundleRoot, workingDirectory);
|
|
83
|
-
}
|
|
84
|
-
catch (cause) {
|
|
85
|
-
if (cause instanceof UsageError)
|
|
86
|
-
throw cause;
|
|
87
|
-
throw new UsageError(`Task working directory ${JSON.stringify(workingDirectory ?? ".")} cannot be physically verified: ${cause instanceof Error ? cause.message : String(cause)}`, "TASK_SOURCE_INVALID");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
77
|
/**
|
|
91
|
-
* Read a script's bytes off disk (or the caller's own read seam
|
|
92
|
-
* the interpreter/digest
|
|
93
|
-
* needs. `ref` is used only for interpreter-selection error
|
|
94
|
-
* the script's own qualified ref, never a synthetic task ref.
|
|
95
|
-
*
|
|
96
|
-
* itself, matching prepareTaskV3Execution's historical behavior).
|
|
78
|
+
* Read a script's bytes off disk (or the caller's own read seam, following a
|
|
79
|
+
* symlink to wherever it points) and freeze the interpreter/digest shape every
|
|
80
|
+
* script dispatch needs. `ref` is used only for interpreter-selection error
|
|
81
|
+
* messages — it is the script's own qualified ref, never a synthetic task ref.
|
|
82
|
+
* `bundleRoot` is the script's working directory.
|
|
97
83
|
*/
|
|
98
84
|
export function captureScriptTarget(ref, file, bundleRoot, readFile) {
|
|
99
85
|
const extension = path.extname(file).toLowerCase();
|
|
100
86
|
const raw = readFile(file, bundleRoot);
|
|
101
87
|
const bytes = Uint8Array.from(raw);
|
|
102
|
-
const cwdIdentity = captureDirectoryIdentity(bundleRoot);
|
|
103
88
|
return Object.freeze({
|
|
104
89
|
interpreter: scriptInterpreter(extension, ref, bytes),
|
|
105
90
|
extension,
|
|
106
91
|
bytesBase64: Buffer.from(bytes).toString("base64"),
|
|
107
92
|
byteLength: bytes.byteLength,
|
|
108
93
|
sha256: createHash("sha256").update(bytes).digest("hex"),
|
|
109
|
-
cwd:
|
|
110
|
-
cwdIdentity,
|
|
94
|
+
cwd: path.resolve(bundleRoot),
|
|
111
95
|
});
|
|
112
96
|
}
|
|
@@ -7,36 +7,15 @@
|
|
|
7
7
|
* clamp every arm's result uses), and `recordTaskAttemptFailure` (the
|
|
8
8
|
* catch-all for a dispatch that threw after an attempt was reserved).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* §5.1, §9, runner.ts:970-1069). `reserveTaskAttempt` and `finishAttempt`
|
|
12
|
-
* were module-private at head; both are exported here because run-task.ts and
|
|
10
|
+
* `reserveTaskAttempt` and `finishAttempt` are exported because run-task.ts and
|
|
13
11
|
* every dispatch arm (run-native-task.ts, run-workflow-task.ts,
|
|
14
|
-
* run-command-task.ts)
|
|
12
|
+
* run-command-task.ts) call them.
|
|
15
13
|
*
|
|
16
|
-
*
|
|
17
|
-
* `TASK_SOURCE_INVALID` and `COMPOSITION_INVALID` — see the comment on the
|
|
18
|
-
* set for the verified reachability path. `SAFE_TASK_ATTEMPT_ERROR_CODES` and
|
|
14
|
+
* `SAFE_TASK_ATTEMPT_ERROR_CODES` and
|
|
19
15
|
* `safeTaskAttemptErrorCode` stay unexported: their membership is observed
|
|
20
16
|
* the same way production code observes it, through
|
|
21
17
|
* `recordTaskAttemptFailure`'s one externally-visible effect (the stored
|
|
22
|
-
* `detail.error` code).
|
|
23
|
-
*
|
|
24
|
-
* P4 (docs/plans/specs/p4-deletions-closeout.md §4.1, row B-55): the set
|
|
25
|
-
* additionally gains `TARGET_REF_INVALID`, `WORKFLOW_SOURCE_INVALID`,
|
|
26
|
-
* `INPUT_BINDING_INVALID`, and `TASK_TARGET_UNSUPPORTED` — every code P4's
|
|
27
|
-
* `INVALID_FLAG_VALUE` re-coding sweep (spec §5.2) makes reachable from the
|
|
28
|
-
* same post-reservation dispatch catch. `TARGET_REF_INVALID`
|
|
29
|
-
* (`execution/target-ref.ts`) and `INPUT_BINDING_INVALID`
|
|
30
|
-
* (`workflows/freeze/task-bindings.ts`) already reach it today through the
|
|
31
|
-
* same WORKFLOW arm as `COMPOSITION_INVALID` above — freezing a composed
|
|
32
|
-
* child (a `tasks/<ref>` or `workflows/<ref>` step) during dispatch can
|
|
33
|
-
* classify a malformed `uses:` or an invalid `with:` binding after the
|
|
34
|
-
* attempt is reserved. `WORKFLOW_SOURCE_INVALID` and `TASK_TARGET_UNSUPPORTED`
|
|
35
|
-
* get their first live throw sites in this same phase (the freeze wrapper's
|
|
36
|
-
* P4-N2 mapping, and `prepare/script-capture.ts`'s interpreter rejections,
|
|
37
|
-
* respectively) — added here ahead of / alongside that wiring rather than
|
|
38
|
-
* split across two commits, since an unreachable member of an allowlist Set
|
|
39
|
-
* is inert, not a defect.
|
|
18
|
+
* `detail.error` code). The comment on the set says why each code is reachable.
|
|
40
19
|
*/
|
|
41
20
|
import { AkmError, rethrowIfTestIsolationError } from "../../core/errors.js";
|
|
42
21
|
import { withStateDb } from "../../core/state-db.js";
|
|
@@ -83,19 +62,22 @@ export function finishAttempt(startedAt, observedFinishedAt) {
|
|
|
83
62
|
* usage failures, never an unclassified internal error that might leak
|
|
84
63
|
* implementation detail.
|
|
85
64
|
*
|
|
86
|
-
*
|
|
87
|
-
* `
|
|
88
|
-
* caller of `recordTaskAttemptFailure` inside the runner is the
|
|
65
|
+
* Every code here is reachable from the post-reservation dispatch catch: the
|
|
66
|
+
* only caller of `recordTaskAttemptFailure` inside the runner is the
|
|
89
67
|
* post-reservation catch in run-task.ts; task-source parsing happens BEFORE
|
|
90
68
|
* reservation (load-task.ts), so the direct parse path never reaches it.
|
|
91
|
-
*
|
|
92
|
-
*
|
|
69
|
+
* `TASK_SOURCE_INVALID`, `COMPOSITION_INVALID`, `TARGET_REF_INVALID` and
|
|
70
|
+
* `INPUT_BINDING_INVALID` reach it through the WORKFLOW arm: a workflow task
|
|
71
|
+
* whose plan freezes a `tasks/<ref>` step raises `TASK_SOURCE_INVALID` (via
|
|
93
72
|
* `taskDispatch`'s `parseTaskSource`/`parseTaskSourceV4Document` —
|
|
94
|
-
* `src/workflows/freeze/targets/task.ts
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* (
|
|
98
|
-
*
|
|
73
|
+
* `src/workflows/freeze/targets/task.ts`), and freezing a composed child can
|
|
74
|
+
* classify a malformed `uses:` (`TARGET_REF_INVALID`,
|
|
75
|
+
* `execution/target-ref.ts`), an invalid `with:` binding
|
|
76
|
+
* (`INPUT_BINDING_INVALID`, `workflows/freeze/task-bindings.ts`) or a `with:`
|
|
77
|
+
* rejection (`COMPOSITION_INVALID`) DURING dispatch, after the attempt was
|
|
78
|
+
* already reserved. `WORKFLOW_SOURCE_INVALID` and `TASK_TARGET_UNSUPPORTED`
|
|
79
|
+
* are thrown by the freeze wrapper and by `prepare/script-capture.ts`'s
|
|
80
|
+
* interpreter rejections, respectively. Without them each would be recorded as
|
|
99
81
|
* `"INTERNAL"`.
|
|
100
82
|
*/
|
|
101
83
|
const SAFE_TASK_ATTEMPT_ERROR_CODES = new Set([
|
|
@@ -11,11 +11,16 @@
|
|
|
11
11
|
import fs from "node:fs";
|
|
12
12
|
import { detectAdapterId } from "../../core/adapter/detect-adapter.js";
|
|
13
13
|
import { makeBundleRef } from "../../core/asset/asset-ref.js";
|
|
14
|
+
import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
|
|
15
|
+
import { resolveStashDir } from "../../core/common.js";
|
|
14
16
|
import { loadConfig } from "../../core/config/config.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
+
import { bundleKeyForContentRoot } from "../../core/config/config-sources.js";
|
|
18
|
+
import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
|
|
19
|
+
import { assertBundleNotDisabled } from "../../core/write-source.js";
|
|
17
20
|
import { applyInputDefaults, materializeInputFlags, validateInputs, } from "../../execution/input-contract.js";
|
|
18
|
-
import { resolveAdapterConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
|
|
21
|
+
import { resolveAdapterConceptOwner, resolveConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
|
|
22
|
+
import { resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
23
|
+
import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
|
|
19
24
|
import { resolveAssetPath } from "../../sources/resolve.js";
|
|
20
25
|
import { prepareTaskV3Execution } from "../prepare/prepare.js";
|
|
21
26
|
import { scheduledTaskContextEnv } from "../scheduler-invocation.js";
|
|
@@ -24,16 +29,50 @@ import { projectTaskSourceV4 } from "../source/project-v4.js";
|
|
|
24
29
|
import { TASK_INPUT_DIAGNOSTICS } from "../source/task-input-diagnostics.js";
|
|
25
30
|
import { validateTaskConceptId, validateTaskId } from "../task-id.js";
|
|
26
31
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* observable behavior). The now-deleted `runner.ts:173`'s (P4) bare
|
|
30
|
-
* `"stash"` became this at the P1b runner.ts split.
|
|
32
|
+
* The literal bundle-name fallback, hoisted to a named constant. The value is
|
|
33
|
+
* user-visible data, so it must not change.
|
|
31
34
|
*/
|
|
32
35
|
export const DEFAULT_BUNDLE_NAME = "stash";
|
|
33
36
|
const CONFIG_FREE_TASK_RUNTIME = Object.freeze({
|
|
34
37
|
configVersion: "0.9.0",
|
|
35
38
|
semanticSearchMode: "off",
|
|
36
39
|
});
|
|
40
|
+
/**
|
|
41
|
+
* The active source set a task read walks. A working stash that is a disabled
|
|
42
|
+
* configured bundle makes that set throw; it is simply not in the set, so the
|
|
43
|
+
* other bundles still resolve.
|
|
44
|
+
*/
|
|
45
|
+
export function activeTaskSources(config) {
|
|
46
|
+
try {
|
|
47
|
+
return resolveSourceEntries(undefined, config);
|
|
48
|
+
}
|
|
49
|
+
catch (cause) {
|
|
50
|
+
const working = bundleKeyForContentRoot(config, resolveStashDir());
|
|
51
|
+
const entry = working ? config.bundles?.[working] : undefined;
|
|
52
|
+
if (!(cause instanceof ConfigError) || !working || !entry || entry.enabled !== false)
|
|
53
|
+
throw cause;
|
|
54
|
+
const enabled = { ...config, bundles: { ...config.bundles, [working]: { ...entry, enabled: true } } };
|
|
55
|
+
return resolveSourceEntries(undefined, enabled).filter((source) => source.registryId !== working);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Resolve an asset a task names in another bundle (`uses:`) through the one
|
|
60
|
+
* ref-to-file walk. Reading needs no write target, so a bundle of any kind
|
|
61
|
+
* (git, npm, website) resolves. The file is the authored path, not the symlink
|
|
62
|
+
* target, so the script interpreter follows the name the author gave it.
|
|
63
|
+
*/
|
|
64
|
+
export function resolveBundleAsset(config, { bundle, type, name }) {
|
|
65
|
+
const conceptId = conceptIdFromTypeName(type, name);
|
|
66
|
+
const sources = activeTaskSources(config);
|
|
67
|
+
const match = resolveConceptOwner({ bundle, conceptId }, sources);
|
|
68
|
+
if (match)
|
|
69
|
+
return { file: match.owner.path, bundleRoot: match.source.path };
|
|
70
|
+
if (resolveSourcesForOrigin(bundle, sources).length === 0) {
|
|
71
|
+
assertBundleNotDisabled(config, bundle);
|
|
72
|
+
throw new UsageError(`Bundle ${JSON.stringify(bundle)} is not configured. Run \`akm bundle list\` to see available bundles.`, "INVALID_FLAG_VALUE");
|
|
73
|
+
}
|
|
74
|
+
throw new NotFoundError(`Task asset ${makeBundleRef(bundle, conceptId)} was not found.`, "ASSET_NOT_FOUND");
|
|
75
|
+
}
|
|
37
76
|
/** Resolve, parse, and project one task-v3 asset into a frozen, executable projection. */
|
|
38
77
|
export async function loadPreparedTask(id, options) {
|
|
39
78
|
const bundleDir = options.bundleDir;
|
|
@@ -49,14 +88,13 @@ export async function loadPreparedTask(id, options) {
|
|
|
49
88
|
}
|
|
50
89
|
const filePath = owner.path;
|
|
51
90
|
const yaml = fs.readFileSync(filePath, "utf8");
|
|
52
|
-
const parsed = parseTaskSource({ yaml, filePath
|
|
91
|
+
const parsed = parseTaskSource({ yaml, filePath });
|
|
53
92
|
const source = projectTaskSourceV4(parsed.v4);
|
|
54
93
|
const requiresCommandConfig = source.target.kind === "uses" &&
|
|
55
94
|
(source.target.uses.kind === "builtin-command" || source.target.uses.kind === "command");
|
|
56
95
|
const config = requiresCommandConfig ? loadConfig() : CONFIG_FREE_TASK_RUNTIME;
|
|
57
96
|
const bundleName = options.bundleName ?? config.defaultBundle ?? DEFAULT_BUNDLE_NAME;
|
|
58
|
-
//
|
|
59
|
-
// materialize akm task run's raw input flags (Stage 1,
|
|
97
|
+
// Stage 2: materialize akm task run's raw input flags (Stage 1,
|
|
60
98
|
// src/commands/tasks/tasks-cli.ts) against the task's own declared
|
|
61
99
|
// inputs: contract (empty when the document declares none, so any input
|
|
62
100
|
// flag on such a task fails UNKNOWN_FLAG — there is nothing declared to
|
|
@@ -65,8 +103,8 @@ export async function loadPreparedTask(id, options) {
|
|
|
65
103
|
// required input satisfied only by its own default (never supplied as a
|
|
66
104
|
// flag) needs the SEPARATE validateInputs call below, run after defaults
|
|
67
105
|
// are applied — materializeInputFlags returns {} immediately for zero
|
|
68
|
-
// flags, before ever checking `required` (
|
|
69
|
-
//
|
|
106
|
+
// flags, before ever checking `required` (input-contract.ts's own
|
|
107
|
+
// header).
|
|
70
108
|
const inputContract = parsed.v4.inputs ?? {};
|
|
71
109
|
const materializedInputs = materializeInputFlags(inputContract, options.inputFlags ?? [], TASK_INPUT_DIAGNOSTICS);
|
|
72
110
|
const defaultedInputs = applyInputDefaults(inputContract, materializedInputs);
|
|
@@ -82,13 +120,12 @@ export async function loadPreparedTask(id, options) {
|
|
|
82
120
|
});
|
|
83
121
|
options.captureTaskInvocation(invocation);
|
|
84
122
|
}
|
|
85
|
-
//
|
|
86
|
-
// task source v4 document's own declared `inputs:` deliver into a
|
|
123
|
+
// A task source v4 document's own declared `inputs:` deliver into a
|
|
87
124
|
// `uses: workflows/<ref>` target's child-run params through the EXISTING
|
|
88
125
|
// with-> params path (prepare.ts's workflow branch already reads
|
|
89
126
|
// `document.target.with`) — task source v4 never authors `with:` on a
|
|
90
127
|
// workflow target itself (task-source-v4.ts's own parser accepts `with:`
|
|
91
|
-
// only on `uses: akm/command
|
|
128
|
+
// only on `uses: akm/command`), so this
|
|
92
129
|
// override is purely additive for a workflow-target task.
|
|
93
130
|
const deliverySource = source.target.kind === "uses" && source.target.uses.kind === "workflow"
|
|
94
131
|
? { ...source, target: { ...source.target, with: defaultedInputs } }
|
|
@@ -99,23 +136,13 @@ export async function loadPreparedTask(id, options) {
|
|
|
99
136
|
bundleName,
|
|
100
137
|
bundleRoot: bundleDir,
|
|
101
138
|
config,
|
|
102
|
-
//
|
|
103
|
-
// AKM directory context the scheduled row set before command preparation.
|
|
139
|
+
// Freeze the AKM directory context the scheduled row set before command preparation.
|
|
104
140
|
...(options.scheduled ? { schedulerContext: scheduledTaskContextEnv() } : {}),
|
|
105
141
|
resolveAsset: async ({ bundle, type, name }) => {
|
|
106
142
|
if (bundle === bundleName) {
|
|
107
143
|
return { file: await resolveAssetPath(bundleDir, type, name), bundleRoot: bundleDir };
|
|
108
144
|
}
|
|
109
|
-
|
|
110
|
-
// `bundle` is the qualifier of an asset ref in the task, not a flag.
|
|
111
|
-
const resolvedBundle = resolveWriteTarget(resolutionConfig, bundle, {
|
|
112
|
-
requireWritable: false,
|
|
113
|
-
flag: "The asset ref's bundle",
|
|
114
|
-
});
|
|
115
|
-
return {
|
|
116
|
-
file: await resolveAssetPath(resolvedBundle.source.path, type, name),
|
|
117
|
-
bundleRoot: resolvedBundle.source.path,
|
|
118
|
-
};
|
|
145
|
+
return resolveBundleAsset(requiresCommandConfig ? config : loadConfig(), { bundle, type, name });
|
|
119
146
|
},
|
|
120
147
|
});
|
|
121
148
|
}
|