akm-cli 0.10.261012-beta → 0.10.261014-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
|
@@ -2,34 +2,22 @@
|
|
|
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
|
-
* Task source v4 — the second, additive task source grammar
|
|
6
|
-
*
|
|
7
|
-
* §3). Never call this grammar bare "v4" in prose — the workflow plan IR is
|
|
8
|
-
* separately versioned (D1).
|
|
5
|
+
* Task source v4 — the second, additive task source grammar. Never call this
|
|
6
|
+
* grammar bare "v4" in prose — the workflow plan IR is separately versioned.
|
|
9
7
|
*
|
|
10
8
|
* `version: 4` introduces typed `inputs:`, a single bounded `output:` schema
|
|
11
9
|
* (legal only on command targets, the one kind whose runtime consumes it —
|
|
12
10
|
* see `targetConsumesOutputSchema` below),
|
|
13
|
-
* OPTIONAL scheduling (absent `schedule:` is valid and manual-only
|
|
11
|
+
* OPTIONAL scheduling (absent `schedule:` is valid and manual-only),
|
|
14
12
|
* and top-level execution controls (the `akm:` options bag and the `on:`
|
|
15
|
-
* trigger block are both GONE — every `akm:` member that
|
|
16
|
-
*
|
|
13
|
+
* trigger block are both GONE — every `akm:` member that is not re-homed
|
|
14
|
+
* survives as a top-level key instead). There is no
|
|
17
15
|
* github-action `uses:` variant.
|
|
18
16
|
*
|
|
19
|
-
*
|
|
20
|
-
* front end and the path-generic field helpers move body-intact out of that
|
|
21
|
-
* file into `./bounded-document.ts`, and `source-v3.ts` now imports (and,
|
|
22
|
-
* for the names that were already part of its public surface, re-exports)
|
|
23
|
-
* them instead of declaring its own copies — see `./bounded-document.ts`'s
|
|
24
|
-
* own header and spec §6 F-2 for the extraction itself. `parseTimeout` and
|
|
25
|
-
* `parseTools` moved that way; `nullableSelector` did not (a recorded
|
|
26
|
-
* deviation from a literal reading of D2-N4's own extraction list — see the
|
|
27
|
-
* P2a Review log) and stays declared directly in `source-v3.ts`.
|
|
28
|
-
*
|
|
29
|
-
* This file implements its OWN top-level-rooted versions of the three v3
|
|
17
|
+
* This file implements its OWN top-level-rooted versions of the two v3
|
|
30
18
|
* helpers that hardcode the `["akm", …]` field path —
|
|
31
|
-
* `parseTimeoutTopLevel`/`nullableSelectorTopLevel
|
|
32
|
-
*
|
|
19
|
+
* `parseTimeoutTopLevel`/`nullableSelectorTopLevel` below, siblings of v3's
|
|
20
|
+
* `parseTimeout`/`nullableSelector` —
|
|
33
21
|
* because task source v4 needs the same accept/reject semantics at a
|
|
34
22
|
* different, un-prefixed field path, not the same field path.
|
|
35
23
|
*/
|
|
@@ -37,15 +25,16 @@ import { parseBuiltinCommandAction } from "../../commands/command/builtin-action
|
|
|
37
25
|
import { UsageError } from "../../core/errors.js";
|
|
38
26
|
import { checkJsonSchemaDefinition, JSON_SCHEMA_SUBSET_SUPPORTED_KEYWORDS, validateJsonSchemaSubset, } from "../../core/json-schema.js";
|
|
39
27
|
import { DURATION_UNITS, parseDuration } from "../../core/time.js";
|
|
40
|
-
import { warn } from "../../core/warn.js";
|
|
28
|
+
import { warn, warnOnce } from "../../core/warn.js";
|
|
41
29
|
import { applyInputDefaults, INPUT_NAME_PATTERN, validateInputs, } from "../../execution/input-contract.js";
|
|
42
30
|
import { EXECUTION_MAX_TIMEOUT_MS } from "../../execution/limits.js";
|
|
31
|
+
import { warnRetiredEngineKey } from "../../execution/source.js";
|
|
43
32
|
import { classifyTargetRef } from "../../execution/target-ref.js";
|
|
44
33
|
import { detectSecretShapedParams } from "../../workflows/exec/param-secrets.js";
|
|
45
34
|
import { WORKFLOW_ENV_VAR_NAME_PATTERN, WORKFLOW_MAX_SCHEMA_BYTES } from "../../workflows/resource-limits.js";
|
|
46
35
|
import { TASK_V3_HOST_SHELLS, TASK_V3_MAX_SCHEDULES } from "../source-v3.js";
|
|
47
36
|
import { TASK_RUN_RESERVED_FLAG_NAMES } from "../task-run-reserved-flags.js";
|
|
48
|
-
import { asRecord, checkKeys, cloneBoundedJson, noGithubExpression, own, parseEnvironment, parseStringArray, presentJsonValue, readBoundedTaskSourceYaml, sourceError, stringField, TASK_V3_MAX_REDACT_NAMES, utf8Bytes,
|
|
37
|
+
import { asRecord, checkKeys, cloneBoundedJson, noGithubExpression, own, parseEnvironment, parseStringArray, presentJsonValue, readBoundedTaskSourceYaml, sourceError, stringField, TASK_V3_MAX_REDACT_NAMES, utf8Bytes, } from "./bounded-document.js";
|
|
49
38
|
// ── Closed constants (D1, D2-N3, D2-N7) ─────────────────────────────────────
|
|
50
39
|
export const TASK_SOURCE_V4_VERSION = 4;
|
|
51
40
|
/** The exact, closed top-level key set (D2-N7) — `akm` and `on` are deliberately absent. */
|
|
@@ -65,6 +54,8 @@ export const TASK_SOURCE_V4_TOP_LEVEL_KEYS = [
|
|
|
65
54
|
"working-directory",
|
|
66
55
|
"schedule",
|
|
67
56
|
"agent",
|
|
57
|
+
"connection",
|
|
58
|
+
"harness",
|
|
68
59
|
"engine",
|
|
69
60
|
"model",
|
|
70
61
|
"inference",
|
|
@@ -95,26 +86,23 @@ function ctxFrom(options) {
|
|
|
95
86
|
return {
|
|
96
87
|
filePath: options.filePath,
|
|
97
88
|
sourceLabel: SOURCE_LABEL,
|
|
98
|
-
...(options.workspaceRoot ? { workspaceRoot: options.workspaceRoot } : {}),
|
|
99
89
|
...(options.lineAt ? { lineAt: options.lineAt } : {}),
|
|
100
90
|
};
|
|
101
91
|
}
|
|
102
|
-
// ── classifyTaskSourceV4Uses
|
|
92
|
+
// ── classifyTaskSourceV4Uses ────────────────────────────────────────────────
|
|
103
93
|
/**
|
|
104
94
|
* A value SHAPED like `owner/repo[/path]@revision` — used only to produce a
|
|
105
|
-
* good "the github-action target was removed" message
|
|
95
|
+
* good "the github-action target was removed" message, never to
|
|
106
96
|
* accept. Deliberately a shape test, not a full github-locator grammar:
|
|
107
|
-
* native target classification recognizes no github-action variant at all
|
|
108
|
-
*
|
|
109
|
-
* `source-v3.ts`) — only the shape needs to be recognized here, so the
|
|
97
|
+
* native target classification recognizes no github-action variant at all —
|
|
98
|
+
* only the shape needs to be recognized here, so the
|
|
110
99
|
* rejection can name the target the user typed rather than guess.
|
|
111
100
|
*
|
|
112
|
-
* Runs ONLY on {@link classifyTargetRef}'s failure path
|
|
101
|
+
* Runs ONLY on {@link classifyTargetRef}'s failure path:
|
|
113
102
|
* `@` is a legal character in a canonical asset ref, so a value the canonical
|
|
114
103
|
* classifier accepts (`commands/review@v2`) is a valid target even though it
|
|
115
104
|
* also matches this shape — the shape test upgrades the generic invalid-ref
|
|
116
|
-
* message, and never vetoes a ref classification accepts
|
|
117
|
-
* only to produce a good message, never to accept").
|
|
105
|
+
* message, and never vetoes a ref classification accepts.
|
|
118
106
|
*/
|
|
119
107
|
function looksLikeGithubActionLocator(value) {
|
|
120
108
|
const at = value.lastIndexOf("@");
|
|
@@ -129,18 +117,18 @@ function looksLikeGithubActionLocator(value) {
|
|
|
129
117
|
return true;
|
|
130
118
|
}
|
|
131
119
|
/**
|
|
132
|
-
* Classify one exact `uses:` string for task source v4
|
|
120
|
+
* Classify one exact `uses:` string for task source v4. Delegates
|
|
133
121
|
* to {@link classifyTargetRef} (`src/execution/target-ref.ts`) — the repo's
|
|
134
122
|
* one canonical-ref classifier — rather than re-deriving ref grammar; layers
|
|
135
|
-
* the `akm/command` builtin special case, the task-ref rejection
|
|
123
|
+
* the `akm/command` builtin special case, the task-ref rejection, and
|
|
136
124
|
* — on the classification-failure path only — the github-locator-shape
|
|
137
|
-
* rejection
|
|
125
|
+
* rejection on top.
|
|
138
126
|
*/
|
|
139
127
|
/**
|
|
140
128
|
* The remedy sentence every `uses:` rejection below ends with. ONE constant so
|
|
141
129
|
* the advice can never drift from what {@link TaskSourceV4UsesTarget} actually
|
|
142
130
|
* admits — `commands/`, `scripts/`, `workflows/`, and the `akm/command`
|
|
143
|
-
* builtin. Notably NOT `tasks/`: a task ref is rejected
|
|
131
|
+
* builtin. Notably NOT `tasks/`: a task ref is rejected below.
|
|
144
132
|
*/
|
|
145
133
|
const TASK_SOURCE_V4_USES_REMEDY = "Use a canonical commands/, scripts/, or workflows/ ref, or akm/command, instead.";
|
|
146
134
|
export function classifyTaskSourceV4Uses(value) {
|
|
@@ -210,18 +198,6 @@ function parseTimeoutTopLevel(value, ctx) {
|
|
|
210
198
|
}
|
|
211
199
|
return value;
|
|
212
200
|
}
|
|
213
|
-
function parseToolsTopLevel(value, ctx) {
|
|
214
|
-
if (value === null || typeof value === "string")
|
|
215
|
-
return value;
|
|
216
|
-
if (Array.isArray(value)) {
|
|
217
|
-
if (value.some((entry) => typeof entry !== "string"))
|
|
218
|
-
sourceError(ctx, ["tools"], "array values must be strings.");
|
|
219
|
-
return value;
|
|
220
|
-
}
|
|
221
|
-
if (typeof value === "object")
|
|
222
|
-
return value;
|
|
223
|
-
sourceError(ctx, ["tools"], "must be a string, string array, mapping, or null.");
|
|
224
|
-
}
|
|
225
201
|
function parseTarget(input, ctx) {
|
|
226
202
|
const hasUses = own(input, "uses");
|
|
227
203
|
if (hasUses) {
|
|
@@ -272,7 +248,6 @@ function parseTarget(input, ctx) {
|
|
|
272
248
|
workingDirectory = stringField(input["working-directory"], ctx, ["working-directory"], {
|
|
273
249
|
nonempty: true,
|
|
274
250
|
});
|
|
275
|
-
validateWorkingDirectory(workingDirectory, ctx);
|
|
276
251
|
}
|
|
277
252
|
return Object.freeze({
|
|
278
253
|
kind: "run",
|
|
@@ -283,16 +258,20 @@ function parseTarget(input, ctx) {
|
|
|
283
258
|
}
|
|
284
259
|
function parseExecutionControls(input, ctx) {
|
|
285
260
|
const out = {};
|
|
286
|
-
for (const key of ["agent", "engine", "model"]) {
|
|
261
|
+
for (const key of ["agent", "connection", "harness", "engine", "model"]) {
|
|
287
262
|
if (own(input, key))
|
|
288
263
|
out[key] = nullableSelectorTopLevel(input[key], ctx, key);
|
|
264
|
+
if (key === "engine" && own(input, key))
|
|
265
|
+
warnRetiredEngineKey();
|
|
289
266
|
}
|
|
290
267
|
if (own(input, "inference")) {
|
|
291
268
|
const inference = presentJsonValue(input.inference, ctx, ["inference"]);
|
|
292
269
|
out.inference = inference === null ? null : asRecord(inference, ctx, ["inference"]);
|
|
293
270
|
}
|
|
294
|
-
|
|
295
|
-
|
|
271
|
+
// Retired: assets no longer restrict an agent's tools.
|
|
272
|
+
if (own(input, "tools")) {
|
|
273
|
+
warnOnce(`task-source-v4-tools:${ctx.filePath}`, `${ctx.filePath}: \`tools\` is retired and ignored.`);
|
|
274
|
+
}
|
|
296
275
|
if (own(input, "timeout"))
|
|
297
276
|
out.timeout = parseTimeoutTopLevel(input.timeout, ctx);
|
|
298
277
|
if (own(input, "redact")) {
|
|
@@ -378,8 +357,7 @@ function parseInputDeclarations(value, ctx) {
|
|
|
378
357
|
if (!INPUT_NAME_PATTERN.test(name)) {
|
|
379
358
|
sourceError(ctx, ["inputs", name], "must match the input name pattern (a letter/underscore, then letters, digits, or underscores).");
|
|
380
359
|
}
|
|
381
|
-
//
|
|
382
|
-
// round 2, scheduler-binding.ts:238): a declared input name that
|
|
360
|
+
// A declared input name that
|
|
383
361
|
// collides with a flag `akm task run` already binds to itself (--bundle,
|
|
384
362
|
// --scheduled, …) can never be supplied through that CLI — parseTaskInputFlags
|
|
385
363
|
// (../../commands/tasks/tasks-cli.ts) always treats the name as its OWN
|
|
@@ -415,7 +393,7 @@ function parseOutputSchema(value, ctx) {
|
|
|
415
393
|
* output schema anywhere (run-native-task.ts decides status from the exit
|
|
416
394
|
* code alone; the workflow arm freezes a child plan without one), so an
|
|
417
395
|
* authored `output:` there would be a silently unenforced contract — the
|
|
418
|
-
* fifth state the fail-closed rule forbids (
|
|
396
|
+
* fifth state the fail-closed rule forbids (same
|
|
419
397
|
* grammar pattern as `with:` being legal only with `uses: akm/command`).
|
|
420
398
|
*/
|
|
421
399
|
function targetConsumesOutputSchema(target) {
|
|
@@ -423,7 +401,7 @@ function targetConsumesOutputSchema(target) {
|
|
|
423
401
|
}
|
|
424
402
|
// ── schedule: -> TaskSourceV4ScheduleBinding[] (D2-N5, D2-N6, B-06..B-10, B-38) ──
|
|
425
403
|
/**
|
|
426
|
-
* Every schedule binding must be independently runnable
|
|
404
|
+
* Every schedule binding must be independently runnable.
|
|
427
405
|
*
|
|
428
406
|
* A scheduled firing supplies NO input flags — `compileTaskSchedulerBindings`
|
|
429
407
|
* (../scheduler-binding.ts) appends only the entry's own
|
|
@@ -431,8 +409,8 @@ function targetConsumesOutputSchema(target) {
|
|
|
431
409
|
* tail — so that literal PLUS the declared defaults is the complete value set
|
|
432
410
|
* `akm task run --scheduled` will see, and it is checked there by the very
|
|
433
411
|
* same `applyInputDefaults` + `validateInputs` pair (../run/load-task.ts).
|
|
434
|
-
* A `required: true` declaration may not also carry a `default`
|
|
435
|
-
* `parseInputDeclaration` above), so an entry that names no value for one can
|
|
412
|
+
* A `required: true` declaration may not also carry a `default`
|
|
413
|
+
* (`parseInputDeclaration` above), so an entry that names no value for one can
|
|
436
414
|
* never satisfy the contract, at any hour, ever.
|
|
437
415
|
*
|
|
438
416
|
* The source document alone knows both halves of that contradiction, so it is
|
|
@@ -442,11 +420,11 @@ function targetConsumesOutputSchema(target) {
|
|
|
442
420
|
* the DEFAULTED view — that gate is what makes such a schedule unreachable
|
|
443
421
|
* rather than merely ill-advised, and it still guards a task source reaching
|
|
444
422
|
* sync through any other path — but an author should not have to run `akm
|
|
445
|
-
* task sync` to learn that a document contradicts itself
|
|
446
|
-
*
|
|
423
|
+
* task sync` to learn that a document contradicts itself, so it is rejected at
|
|
424
|
+
* parse time. Manual `akm task
|
|
447
425
|
* run` is deliberately unaffected: a manual run takes the value from the
|
|
448
426
|
* input's own `--<name>` flag, so a required, default-less input plus NO
|
|
449
|
-
* `schedule:` stays valid and manual-only
|
|
427
|
+
* `schedule:` stays valid and manual-only.
|
|
450
428
|
*
|
|
451
429
|
* Runs for every entry, AFTER the raw `schedule[i].inputs` check below, so an
|
|
452
430
|
* entry that authors an `inputs:` mapping keeps that check's exact
|
|
@@ -475,12 +453,12 @@ function parseScheduleEntry(entryRaw, index, contract, ctx) {
|
|
|
475
453
|
...entryPath,
|
|
476
454
|
"inputs",
|
|
477
455
|
]);
|
|
478
|
-
// Fail-closed exact-name check
|
|
479
|
-
// `validateInputs`'s synthetic `{type:"object", properties}` schema
|
|
480
|
-
//
|
|
456
|
+
// Fail-closed exact-name check:
|
|
457
|
+
// `validateInputs`'s synthetic `{type:"object", properties}` schema
|
|
458
|
+
// deliberately carries no `additionalProperties:false` — that is the
|
|
481
459
|
// right default for a general-purpose contract validator with other
|
|
482
460
|
// callers (materializeInputFlags already does its own exact-name check
|
|
483
|
-
// before ever calling validateInputs
|
|
461
|
+
// before ever calling validateInputs) — so relying on
|
|
484
462
|
// validateInputs alone here would silently accept a typo'd or wholly
|
|
485
463
|
// undeclared schedule[i].inputs key forever, exactly the fifth state the
|
|
486
464
|
// fail-closed rule forbids. checkKeys mirrors materializeInputFlags' own
|
|
@@ -491,9 +469,8 @@ function parseScheduleEntry(entryRaw, index, contract, ctx) {
|
|
|
491
469
|
// sourceError call rooted at entryPath, not [...entryPath, "inputs"]: the
|
|
492
470
|
// per-error detail already carries "inputs.<name>" (validateInputs), so
|
|
493
471
|
// adding a SECOND ".inputs" segment to the field path here would render
|
|
494
|
-
// two path roots in one message (
|
|
495
|
-
//
|
|
496
|
-
// review-log item 4a).
|
|
472
|
+
// two path roots in one message (the bare "$" default would otherwise
|
|
473
|
+
// leak through).
|
|
497
474
|
const errors = validateInputs(contract, inputsValue, { pathRoot: "inputs" });
|
|
498
475
|
if (errors.length > 0)
|
|
499
476
|
sourceError(ctx, entryPath, errors.join("; "));
|
|
@@ -528,8 +505,8 @@ function parseSchedule(input, contract, ctx) {
|
|
|
528
505
|
// ── Top-level key rejection (akm:/on: removal, B-11/B-12; D2-N7) ───────────
|
|
529
506
|
function checkTopLevelKeys(input, ctx) {
|
|
530
507
|
if (own(input, "akm")) {
|
|
531
|
-
sourceError(ctx, ["akm"], "is removed in task source v4; its members are top-level keys now (schedule, timeout,
|
|
532
|
-
"maxSteps, maxRetries, description, when_to_use, tags, agent, inference,
|
|
508
|
+
sourceError(ctx, ["akm"], "is removed in task source v4; its members are top-level keys now (schedule, timeout, connection, harness, model, redact, " +
|
|
509
|
+
"maxSteps, maxRetries, description, when_to_use, tags, agent, inference, and output for outputSchema) " +
|
|
533
510
|
"— see docs/reference/tasks.md.");
|
|
534
511
|
}
|
|
535
512
|
if (own(input, "on")) {
|
|
@@ -537,8 +514,8 @@ function checkTopLevelKeys(input, ctx) {
|
|
|
537
514
|
}
|
|
538
515
|
checkKeys(input, TASK_SOURCE_V4_TOP_LEVEL_KEYS, ctx, []);
|
|
539
516
|
}
|
|
540
|
-
// ── parseTaskSourceV4Document
|
|
541
|
-
/** Parse an already-decoded JSON/YAML value as a task source v4 document
|
|
517
|
+
// ── parseTaskSourceV4Document ───────────────────────────────────────────────
|
|
518
|
+
/** Parse an already-decoded JSON/YAML value as a task source v4 document. */
|
|
542
519
|
export function parseTaskSourceV4Document(value, options) {
|
|
543
520
|
const ctx = ctxFrom(options);
|
|
544
521
|
const cloned = cloneBoundedJson(value, ctx, [], { nodes: 0 });
|
|
@@ -596,7 +573,6 @@ export function parseTaskSourceV4(input) {
|
|
|
596
573
|
const { root, lineAt } = readBoundedTaskSourceYaml(input, { sourceLabel: SOURCE_LABEL });
|
|
597
574
|
return parseTaskSourceV4Document(root, {
|
|
598
575
|
filePath: input.filePath,
|
|
599
|
-
...(input.workspaceRoot ? { workspaceRoot: input.workspaceRoot } : {}),
|
|
600
576
|
lineAt,
|
|
601
577
|
});
|
|
602
578
|
}
|
package/dist/tasks/source-v3.js
CHANGED
|
@@ -2,11 +2,8 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import { TASK_V3_MAX_SCHEDULES } from "./source/bounded-document.js";
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// `src` consumer still imports (task-source-v4.ts) — every other
|
|
8
|
-
// bounded-document re-export this file used to carry was dropped in P4
|
|
9
|
-
// §3.2.3.
|
|
5
|
+
// Re-exported at its existing name so no importer changes: the one name a
|
|
6
|
+
// surviving `src` consumer still imports (task-source-v4.ts).
|
|
10
7
|
export { TASK_V3_MAX_SCHEDULES };
|
|
11
8
|
export const TASK_EXTENSION = ".yml";
|
|
12
9
|
export const TASK_NEAR_MISS_EXTENSION = ".yaml";
|
|
@@ -7,8 +7,7 @@
|
|
|
7
7
|
* declared `inputs:` name that collides with one, without creating an import
|
|
8
8
|
* cycle back through the CLI layer.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* round 2): `schedulerInputFlagTail` (`../tasks/scheduler-binding.ts`) and
|
|
10
|
+
* `schedulerInputFlagTail` (`../tasks/scheduler-binding.ts`) and
|
|
12
11
|
* `akm task run <id> --<name> <value>` both let an authored/declared input
|
|
13
12
|
* NAME collide with a flag `akm task run` already binds to itself
|
|
14
13
|
* (`--bundle`, `--scheduled`, …). `parseTaskInputFlags`
|
|
@@ -49,15 +49,10 @@ export function assertWorkflowMarkdownName(name) {
|
|
|
49
49
|
throw new UsageError(`akm workflow create is markdown-only: it emits Markdown and cannot create "${name}". ` +
|
|
50
50
|
`Use a plain name (no ".yaml"/".yml" suffix).`);
|
|
51
51
|
}
|
|
52
|
-
//
|
|
53
|
-
// docs/plans/specs/p4-deletions-closeout.md §4.1 row B-49): this return's
|
|
54
|
-
// third member was `stashDir` through 0.9.1 and leaked verbatim into the
|
|
52
|
+
// This return's third member (`bundleDir`) leaks verbatim into the
|
|
55
53
|
// `akm workflow create` JSON envelope (Stable per STABILITY.md) via
|
|
56
54
|
// `output("workflow-create", { ok: true, ...result })`
|
|
57
|
-
// (src/commands/workflow-cli.ts)
|
|
58
|
-
// value-preserving field rename `RunTaskOptions.stashDir` got in P1b (see
|
|
59
|
-
// src/tasks/run/task-result.ts's header, F-3) — so the shipped envelope now
|
|
60
|
-
// matches current bundle vocabulary. BREAKING vs 0.9.1's envelope shape.
|
|
55
|
+
// (src/commands/workflow-cli.ts), so renaming it changes the shipped envelope.
|
|
61
56
|
export function createWorkflowAsset(input) {
|
|
62
57
|
assertWorkflowMarkdownName(input.name);
|
|
63
58
|
const config = loadConfig();
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import path from "node:path";
|
|
12
12
|
import { parseWorkflow } from "./parser.js";
|
|
13
13
|
import { formatReference, parseReference } from "./program/expressions.js";
|
|
14
|
-
import { canonicalizeWorkflowWorkingDirectory, WorkflowSourceSemanticError } from "./source-semantics.js";
|
|
15
14
|
/** Compile by authoritative source extension. */
|
|
16
15
|
export function compileWorkflowSource(source, options) {
|
|
17
16
|
const extension = path.extname(options.path).toLowerCase();
|
|
@@ -29,20 +28,7 @@ export function compileWorkflowSource(source, options) {
|
|
|
29
28
|
],
|
|
30
29
|
};
|
|
31
30
|
}
|
|
32
|
-
const parsed = parseWorkflow(source, {
|
|
33
|
-
path: options.path,
|
|
34
|
-
title,
|
|
35
|
-
validateExecCwd: (value) => {
|
|
36
|
-
try {
|
|
37
|
-
return { ok: true, value: canonicalizeWorkflowWorkingDirectory(value, options.workspaceRoot) };
|
|
38
|
-
}
|
|
39
|
-
catch (cause) {
|
|
40
|
-
if (cause instanceof WorkflowSourceSemanticError)
|
|
41
|
-
return { ok: false, code: cause.code, message: cause.message };
|
|
42
|
-
return { ok: false, code: "working-directory-unverifiable", message: "cwd cannot be physically verified." };
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
});
|
|
31
|
+
const parsed = parseWorkflow(source, { path: options.path, title });
|
|
46
32
|
if (parsed.ok)
|
|
47
33
|
return parsed;
|
|
48
34
|
return {
|
|
@@ -19,7 +19,7 @@ export function workflowMaxConcurrency(configured, cpuCount = os.cpus()?.length
|
|
|
19
19
|
// ── Fan-out defaults ─────────────────────────────────────────────────────────
|
|
20
20
|
//
|
|
21
21
|
// A `map` step's real width is the minimum of its own `map.concurrency`, the
|
|
22
|
-
// run's frozen `execution.maxConcurrency`, the
|
|
22
|
+
// run's frozen `execution.maxConcurrency`, the connection's frozen
|
|
23
23
|
// concurrency, and the host CPU cap. The defaults are modest: map units call
|
|
24
24
|
// rate-limited providers and RAM-hungry agents.
|
|
25
25
|
/**
|
|
@@ -29,12 +29,12 @@ export function workflowMaxConcurrency(configured, cpuCount = os.cpus()?.length
|
|
|
29
29
|
* (`workflow.defaultMapConcurrency`; `1` restores serial fan-out).
|
|
30
30
|
*/
|
|
31
31
|
export const DEFAULT_MAP_CONCURRENCY = 4;
|
|
32
|
-
/** Default concurrency for
|
|
32
|
+
/** Default concurrency for a connection on a loopback endpoint: a local model server runs one inference. */
|
|
33
33
|
export const DEFAULT_LOCAL_LLM_ENGINE_CONCURRENCY = 1;
|
|
34
|
-
/** Default concurrency for a remote
|
|
34
|
+
/** Default concurrency for a connection on a remote endpoint: equal to {@link DEFAULT_MAP_CONCURRENCY}, so it never re-serializes a map. */
|
|
35
35
|
export const DEFAULT_REMOTE_LLM_ENGINE_CONCURRENCY = 4;
|
|
36
36
|
export { isLoopbackEndpoint, isLoopbackHost } from "../core/loopback.js";
|
|
37
|
-
/** Concurrency to freeze for
|
|
37
|
+
/** Concurrency to freeze for a connection: its own `concurrency` (clamped), else by endpoint. */
|
|
38
38
|
export function defaultLlmEngineConcurrency(endpoint, configured) {
|
|
39
39
|
if (typeof configured === "number" && Number.isFinite(configured))
|
|
40
40
|
return clampMaxConcurrency(configured);
|
|
@@ -104,8 +104,6 @@ async function publishChildRun(input, invocationKey) {
|
|
|
104
104
|
run: {
|
|
105
105
|
id: childRunId,
|
|
106
106
|
workflowRef: target.ref,
|
|
107
|
-
scopeKey: parentRow.scope_key,
|
|
108
|
-
workflowEntryId: null,
|
|
109
107
|
workflowTitle: target.frozenPlan.title,
|
|
110
108
|
paramsJson: JSON.stringify(childParams),
|
|
111
109
|
currentStepId: target.frozenPlan.steps[0]?.stepId ?? null,
|
|
@@ -149,8 +147,7 @@ async function driveChildRun(input, childRow) {
|
|
|
149
147
|
...(ctx.dispatcher ? { dispatcher: ctx.dispatcher } : {}),
|
|
150
148
|
...(ctx.maxConcurrency !== undefined ? { maxConcurrency: ctx.maxConcurrency } : {}),
|
|
151
149
|
...(ctx.eventSource !== undefined ? { eventSource: ctx.eventSource } : {}),
|
|
152
|
-
|
|
153
|
-
disposeDispatchResources: () => { },
|
|
150
|
+
...(ctx.bundleRootOverride !== undefined ? { bundleRootOverride: ctx.bundleRootOverride } : {}),
|
|
154
151
|
};
|
|
155
152
|
try {
|
|
156
153
|
// The re-read stays inside this try: an escaped throw would skip the
|
|
@@ -2,105 +2,54 @@
|
|
|
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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* What a frozen-workflow unit's outcome is scrubbed of before it reaches
|
|
6
|
+
* durable state: the secrets its environment bindings substituted, on top of
|
|
7
|
+
* what the dispatch itself already redacted (the runner's connection key), and
|
|
8
|
+
* the credential-named variables of the environment every unit's process inherits.
|
|
8
9
|
*/
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
10
|
+
import { collectInferredSecretValues, collectSensitiveValues, redactSensitiveValue } from "../../core/redaction.js";
|
|
11
|
+
import { collectDispatchSensitiveValues } from "../../integrations/agent/runner-dispatch.js";
|
|
11
12
|
/**
|
|
12
13
|
* Every exact value that must never reach the journal from one dispatch: the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* secrets substituted into the unit's env bindings (`dispatch.sensitiveValues`;
|
|
15
|
+
* the rest of an env asset is configuration and reaches the journal as is), the
|
|
16
|
+
* runner's connection key, and the credential-named variables of akm's
|
|
17
|
+
* environment, which a shell command inherits as a runner does. Read at call
|
|
18
|
+
* time, so collect no earlier than the dispatch being scrubbed.
|
|
16
19
|
*/
|
|
17
|
-
export function collectWorkflowDispatchSensitiveValues(dispatch
|
|
18
|
-
const values = new Set(
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const value = process.env[name]?.trim();
|
|
25
|
-
if (value)
|
|
26
|
-
values.add(value);
|
|
27
|
-
}
|
|
28
|
-
// #905: file-backed credential — best-effort read, never throws, so a
|
|
29
|
-
// broken apiKeyFile is reported by the real dispatch, not this collector.
|
|
30
|
-
if (runner.apiKeyFile) {
|
|
31
|
-
const value = lookupApiKeyFileValue(runner.apiKeyFile);
|
|
32
|
-
if (value)
|
|
33
|
-
values.add(value);
|
|
34
|
-
}
|
|
35
|
-
// #953: secret-store-backed credential — same best-effort rationale.
|
|
36
|
-
if (runner.apiKeySecretRef) {
|
|
37
|
-
const value = lookupApiKeySecretRefValue(runner.apiKeySecretRef);
|
|
38
|
-
if (value)
|
|
39
|
-
values.add(value);
|
|
40
|
-
}
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
for (const name of runner.profile.envPassthrough ?? []) {
|
|
44
|
-
const value = process.env[name];
|
|
45
|
-
if (!isEnvPassthroughValueSafeToExpose(name, value) && value)
|
|
46
|
-
values.add(value);
|
|
47
|
-
}
|
|
48
|
-
if (runner.kind === "sdk") {
|
|
49
|
-
for (const name of runner.fallbackCredential?.names ?? []) {
|
|
50
|
-
const value = process.env[name]?.trim();
|
|
51
|
-
if (value)
|
|
52
|
-
values.add(value);
|
|
53
|
-
}
|
|
54
|
-
if (runner.fallbackApiKeyFile) {
|
|
55
|
-
const value = lookupApiKeyFileValue(runner.fallbackApiKeyFile);
|
|
56
|
-
if (value)
|
|
57
|
-
values.add(value);
|
|
58
|
-
}
|
|
59
|
-
if (runner.fallbackApiKeySecretRef) {
|
|
60
|
-
const value = lookupApiKeySecretRefValue(runner.fallbackApiKeySecretRef);
|
|
61
|
-
if (value)
|
|
62
|
-
values.add(value);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
addCredential(dispatch.runner);
|
|
20
|
+
export function collectWorkflowDispatchSensitiveValues(dispatch) {
|
|
21
|
+
const values = new Set(dispatch.sensitiveValues ?? []);
|
|
22
|
+
const dispatchValues = dispatch.runner
|
|
23
|
+
? collectDispatchSensitiveValues(dispatch.runner)
|
|
24
|
+
: collectInferredSecretValues(process.env);
|
|
25
|
+
for (const value of dispatchValues)
|
|
26
|
+
values.add(value);
|
|
67
27
|
return collectSensitiveValues(values);
|
|
68
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Turn a number leaf that is exactly a sensitive value into its text, so the string scrub redacts it (a
|
|
31
|
+
* numeric secret echoed as a JSON number). Only the unit's parsed `result` takes this path: a number
|
|
32
|
+
* elsewhere in an outcome (`tokens`) stays a number.
|
|
33
|
+
*/
|
|
34
|
+
function stringifySensitiveNumbers(value, sensitiveValues) {
|
|
35
|
+
if (typeof value === "number")
|
|
36
|
+
return sensitiveValues.includes(String(value)) ? String(value) : value;
|
|
37
|
+
if (Array.isArray(value))
|
|
38
|
+
return value.map((entry) => stringifySensitiveNumbers(entry, sensitiveValues));
|
|
39
|
+
if (value && typeof value === "object") {
|
|
40
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, stringifySensitiveNumbers(child, sensitiveValues)]));
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
69
44
|
/**
|
|
70
45
|
* Scrub a dispatch outcome before anything about it is journaled. A
|
|
71
46
|
* `failureReason` the scrub altered carried a secret, so it is downgraded.
|
|
72
47
|
*/
|
|
73
48
|
export function redactUnitOutcome(outcome, sensitiveValues) {
|
|
74
|
-
const
|
|
49
|
+
const prepared = "result" in outcome ? { ...outcome, result: stringifySensitiveNumbers(outcome.result, sensitiveValues) } : outcome;
|
|
50
|
+
const redacted = redactSensitiveValue(prepared, sensitiveValues);
|
|
75
51
|
if (outcome.failureReason !== undefined && redacted.failureReason !== outcome.failureReason) {
|
|
76
52
|
redacted.failureReason = "reported_failure";
|
|
77
53
|
}
|
|
78
54
|
return redacted;
|
|
79
55
|
}
|
|
80
|
-
/** Scrub a value thrown out of a dispatch; re-wrapped only when the scrub changed its message. */
|
|
81
|
-
function redactDispatchError(err, sensitiveValues) {
|
|
82
|
-
if (sensitiveValues.length === 0 || !(err instanceof Error))
|
|
83
|
-
return err;
|
|
84
|
-
const redacted = redactSensitiveText(err.message, sensitiveValues);
|
|
85
|
-
if (redacted === err.message)
|
|
86
|
-
return err;
|
|
87
|
-
const replacement = new Error(redacted);
|
|
88
|
-
replacement.name = err.name;
|
|
89
|
-
return replacement;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Wrap a dispatcher so both its outcome and its thrown error are scrubbed with
|
|
93
|
-
* the request's `sensitiveValues` (the gate judge; the unit path scrubs at its
|
|
94
|
-
* own journal boundary after the structured-output parse).
|
|
95
|
-
*/
|
|
96
|
-
export function withDispatchRedaction(inner) {
|
|
97
|
-
return async (request, feedback) => {
|
|
98
|
-
const sensitiveValues = request.sensitiveValues ?? [];
|
|
99
|
-
try {
|
|
100
|
-
return redactUnitOutcome(await inner(request, feedback), sensitiveValues);
|
|
101
|
-
}
|
|
102
|
-
catch (err) {
|
|
103
|
-
throw redactDispatchError(err, sensitiveValues);
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
}
|