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
|
@@ -7,21 +7,26 @@ import { DEFAULT_SCHEDULED_TASK_TIMEOUT_MS } from "./run-workflow-task.js";
|
|
|
7
7
|
import { appendHistory } from "./task-history.js";
|
|
8
8
|
import { persistRunLog, scrubTaskOutput, streamLines } from "./task-log.js";
|
|
9
9
|
export async function runPreparedCommandTask(input) {
|
|
10
|
-
const { task, logPath, startedAt, now,
|
|
10
|
+
const { task, logPath, startedAt, now, provenance } = input;
|
|
11
11
|
const dispatchOptions = {
|
|
12
12
|
...(input.runAgentImpl ? { runAgent: input.runAgentImpl } : {}),
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// F-1 (R-07 fix, spec §5.2 point 3): threads the resolved event source
|
|
16
|
-
// into the dispatched engine's child env and the recorded usage events.
|
|
13
|
+
// Threads the resolved event source into the dispatched harness's child env
|
|
14
|
+
// and the recorded usage events.
|
|
17
15
|
eventSource: provenance.eventSource,
|
|
18
16
|
};
|
|
19
|
-
// Unset anywhere (task `timeout:`, command asset,
|
|
20
|
-
// default; an explicit value or `null` (opt-out)
|
|
21
|
-
const { request,
|
|
22
|
-
const unset =
|
|
17
|
+
// Unset anywhere (task `timeout:`, command asset, connection or harness) → the
|
|
18
|
+
// unattended default; an explicit value or `null` (opt-out) was set by one of them.
|
|
19
|
+
const { runner, request, provenance: provenances } = task.invocation;
|
|
20
|
+
const unset = provenances["runtime.timeoutMs"]?.via === "default";
|
|
23
21
|
const invocation = unset
|
|
24
|
-
? {
|
|
22
|
+
? {
|
|
23
|
+
...task.invocation,
|
|
24
|
+
request: {
|
|
25
|
+
...request,
|
|
26
|
+
runtime: { ...request.runtime, timeoutMs: DEFAULT_SCHEDULED_TASK_TIMEOUT_MS },
|
|
27
|
+
},
|
|
28
|
+
runner: { ...runner, timeoutMs: DEFAULT_SCHEDULED_TASK_TIMEOUT_MS },
|
|
29
|
+
}
|
|
25
30
|
: task.invocation;
|
|
26
31
|
const result = await dispatchPreparedCommandInvocation(invocation, dispatchOptions);
|
|
27
32
|
const engineName = result.engine;
|
|
@@ -6,21 +6,15 @@
|
|
|
6
6
|
* shell-command builders (`shellCommand`, `resolveLeadingBareAkmCommand`,
|
|
7
7
|
* `quoteShellArgument`).
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* The child env's `AKM_EVENT_SOURCE` stamp reads `provenance.eventSource`
|
|
10
|
+
* (`"task"` under the default provenance context, run/provenance.ts).
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* `provenance.eventSource` instead of the hardcoded literal `"task"` — with
|
|
14
|
-
* the default provenance context (run/provenance.ts) this is byte-equivalent
|
|
15
|
-
* to before (P-06 stays green unchanged).
|
|
16
|
-
*
|
|
17
|
-
* F-2 (D8, spec §5.3): the result's `target` is now `{kind:"shell", cmd}` or
|
|
18
|
-
* `{kind:"script", cmd}` — formerly one shared `{kind:"command", cmd}`.
|
|
12
|
+
* The result's `target` is `{kind:"shell", cmd}` or `{kind:"script", cmd}`.
|
|
19
13
|
*/
|
|
20
14
|
import path from "node:path";
|
|
21
15
|
import { assertNever } from "../../core/assert.js";
|
|
16
|
+
import { childProcessEnv } from "../../core/paths.js";
|
|
22
17
|
import { runManagedSubprocess, streamCaptureFailure } from "../../core/subprocess.js";
|
|
23
|
-
import { assertFrozenDirectoryContained } from "../../execution/directory-identity.js";
|
|
24
18
|
import { cleanupFrozenScript, frozenScriptCommand, materializeFrozenScript } from "../frozen-script.js";
|
|
25
19
|
import { resolveAkmInvocation } from "../resolve-akm-bin.js";
|
|
26
20
|
import { finishAttempt } from "./attempt-lifecycle.js";
|
|
@@ -152,7 +146,7 @@ export async function runNativeTask(input) {
|
|
|
152
146
|
// above) — a timeout or SIGTERM to the direct child would reap the whole
|
|
153
147
|
// group, but nothing tied THIS process's own termination to that same
|
|
154
148
|
// ladder, so a signal to the runner left its child running as an orphan.
|
|
155
|
-
// Aborting `runManagedSubprocess` here runs its normal SIGTERM→SIGKILL
|
|
149
|
+
// Aborting `runManagedSubprocess` here runs its normal SIGINT→SIGTERM→SIGKILL
|
|
156
150
|
// kill ladder against the child's process group.
|
|
157
151
|
const abortController = new AbortController();
|
|
158
152
|
const forwardTerminationSignal = (signal) => {
|
|
@@ -163,20 +157,13 @@ export async function runNativeTask(input) {
|
|
|
163
157
|
process.once("SIGTERM", onSigterm);
|
|
164
158
|
process.once("SIGINT", onSigint);
|
|
165
159
|
try {
|
|
166
|
-
// Re-resolve the authored root/cwd immediately before spawn so a
|
|
167
|
-
// symlink, ancestor, bundle-root, or directory/file swap cannot redirect
|
|
168
|
-
// execution outside that physical workspace. This is a live containment
|
|
169
|
-
// check, not an identity comparison — it does not care whether the
|
|
170
|
-
// underlying device/inode changed (e.g. a remount), only whether the
|
|
171
|
-
// resolved cwd still lives inside its root.
|
|
172
|
-
assertFrozenDirectoryContained(task.cwdIdentity);
|
|
173
160
|
if (task.kind === "script") {
|
|
174
161
|
materialized = materializeFrozenScript(task);
|
|
175
162
|
cmd = frozenScriptCommand(task, materialized.file);
|
|
176
163
|
}
|
|
177
164
|
// Managed spawn (src/core/subprocess.ts): process-GROUP kill so a timeout
|
|
178
|
-
// reaps the whole command tree (no orphans), and a SIGTERM→SIGKILL
|
|
179
|
-
// so a child that ignores
|
|
165
|
+
// reaps the whole command tree (no orphans), and a SIGINT→SIGTERM→SIGKILL
|
|
166
|
+
// ladder so a child that ignores both can't wedge the run forever. `signal`
|
|
180
167
|
// ties that same ladder to a termination signal received by this
|
|
181
168
|
// process itself (#956), not only to the timeout.
|
|
182
169
|
const result = await runManagedSubprocess(cmd, {
|
|
@@ -187,7 +174,7 @@ export async function runNativeTask(input) {
|
|
|
187
174
|
// A more specific stamp already in the environment (e.g. improve's
|
|
188
175
|
// AKM_EVENT_SOURCE=improve on its child spawns) still wins in children.
|
|
189
176
|
env: {
|
|
190
|
-
...
|
|
177
|
+
...childProcessEnv(),
|
|
191
178
|
...task.environment,
|
|
192
179
|
AKM_EVENT_SOURCE: process.env.AKM_EVENT_SOURCE ?? provenance.eventSource,
|
|
193
180
|
},
|
|
@@ -6,22 +6,21 @@
|
|
|
6
6
|
* scheduled moment.
|
|
7
7
|
*
|
|
8
8
|
* The durable boundary is intentional: id/bundle resolution, source read,
|
|
9
|
-
* strict task source parsing, target resolution, command
|
|
10
|
-
*
|
|
9
|
+
* strict task source parsing, target resolution, command lowering, workflow
|
|
10
|
+
* projectability, and frozen script-byte
|
|
11
11
|
* capture (load-task.ts) all finish before an attempt is reserved or a log is
|
|
12
12
|
* created (attempt-lifecycle.ts). Once prepared, the runner dispatches the
|
|
13
13
|
* immutable command, workflow, shell, or script projection to its own arm
|
|
14
14
|
* module (run-command-task.ts, run-workflow-task.ts, run-native-task.ts) and
|
|
15
15
|
* records that actual attempt. Task source v4 has no document-level disabled
|
|
16
|
-
* state to skip at fire time
|
|
16
|
+
* state to skip at fire time — a schedule binding that should not
|
|
17
17
|
* fire is never installed with the OS scheduler in the first place
|
|
18
18
|
* (scheduler-sync.ts), so every invocation that reaches `runTask` dispatches.
|
|
19
19
|
*
|
|
20
20
|
* Orchestration only.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* into every dispatch arm.
|
|
22
|
+
* Resolves `options.provenance` against the default context (run/provenance.ts)
|
|
23
|
+
* ONCE per call, and threads the result into every dispatch arm.
|
|
25
24
|
*/
|
|
26
25
|
import { runWorkflowSteps } from "../../workflows/exec/run-workflow.js";
|
|
27
26
|
import { recordTaskAttemptFailure, reserveTaskAttempt } from "./attempt-lifecycle.js";
|
|
@@ -67,8 +66,6 @@ export async function runTask(id, options) {
|
|
|
67
66
|
historyReserved: attempt.historyReserved,
|
|
68
67
|
provenance,
|
|
69
68
|
runAgentImpl: options.runAgentImpl,
|
|
70
|
-
agentOptions: options.agentOptions,
|
|
71
|
-
chatCompletionImpl: options.chatCompletionImpl,
|
|
72
69
|
});
|
|
73
70
|
}
|
|
74
71
|
options.beforeNativeDispatch?.(task);
|
|
@@ -7,18 +7,12 @@
|
|
|
7
7
|
* (`DEFAULT_WORKFLOW_TASK_TIMEOUT_MS`, `DEFAULT_SCHEDULED_TASK_TIMEOUT_MS`)
|
|
8
8
|
* every arm reads.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* into `runWorkflowStepsImpl` via a new optional `eventSource` option,
|
|
17
|
-
* `process.env.AKM_EVENT_SOURCE ?? provenance.eventSource` (ambient still
|
|
18
|
-
* wins, matching the native arm's own precedence — D5 clause d). Threading
|
|
19
|
-
* that option to an exec-unit child's env is owned by
|
|
20
|
-
* src/workflows/exec/run-workflow.ts / step-work.ts / exec-unit.ts, not this
|
|
21
|
-
* file.
|
|
10
|
+
* `process.env` is never written by this arm. The resolved event source is
|
|
11
|
+
* passed into `runWorkflowStepsImpl` via the optional `eventSource` option,
|
|
12
|
+
* `process.env.AKM_EVENT_SOURCE ?? provenance.eventSource` (ambient wins,
|
|
13
|
+
* matching the native arm's own precedence). Threading that option to an
|
|
14
|
+
* exec-unit child's env is owned by src/workflows/exec/run-workflow.ts /
|
|
15
|
+
* step-work.ts / exec-unit.ts, not this file.
|
|
22
16
|
*/
|
|
23
17
|
import { armAbortDeadline } from "../../core/abort-deadline.js";
|
|
24
18
|
import { assertNever } from "../../core/assert.js";
|
|
@@ -71,7 +65,7 @@ export async function runWorkflowTask(input) {
|
|
|
71
65
|
// aborted by a timer. The engine reads `options.signal` at every step
|
|
72
66
|
// boundary and breaks GRACEFULLY — in-flight units are cancelled, the journal
|
|
73
67
|
// and the run lease are retained, and the run is left `active`, i.e.
|
|
74
|
-
//
|
|
68
|
+
// continuable with `akm workflow run <run-id>`.
|
|
75
69
|
const controller = new AbortController();
|
|
76
70
|
const deadline = armAbortDeadline(controller, {
|
|
77
71
|
timeoutMs,
|
|
@@ -85,13 +79,12 @@ export async function runWorkflowTask(input) {
|
|
|
85
79
|
// The prompt path logs the engine-fallback announcement; a workflow-backed
|
|
86
80
|
// task must leave the same trace rather than silently using a chosen engine.
|
|
87
81
|
let runWarnings = [];
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
// specific ambient stamp already present still wins, matching the native arm.
|
|
82
|
+
// Thread the resolved event source through explicitly instead of stamping
|
|
83
|
+
// process.env — this arm executes IN-PROCESS, so the explicit eventSource option
|
|
84
|
+
// (threaded to src/workflows/exec/run-workflow.ts -> step-work.ts -> exec-unit.ts's
|
|
85
|
+
// childEnv) is how child akm invocations made by workflow steps inherit it,
|
|
86
|
+
// without ever mutating process.env. A more specific ambient stamp already
|
|
87
|
+
// present still wins, matching the native arm.
|
|
95
88
|
const eventSource = process.env.AKM_EVENT_SOURCE ?? provenance.eventSource;
|
|
96
89
|
try {
|
|
97
90
|
const execution = await runWorkflowStepsImpl({
|
|
@@ -130,7 +123,7 @@ export async function runWorkflowTask(input) {
|
|
|
130
123
|
const timeoutError = timedOutAfterMs === undefined
|
|
131
124
|
? undefined
|
|
132
125
|
: new Error(`Workflow run timed out after ${timedOutAfterMs}ms and was aborted at a step boundary` +
|
|
133
|
-
(detail?.id ? ` —
|
|
126
|
+
(detail?.id ? ` — continue it with \`akm workflow run ${detail.id}\`.` : "."));
|
|
134
127
|
// One failure value for the three sinks below (status, log line, history
|
|
135
128
|
// detail): a thrown error outranks a gate rejection, which outranks the
|
|
136
129
|
// deadline. Re-laddering per sink is how a log line ends up naming a
|
|
@@ -5,24 +5,16 @@
|
|
|
5
5
|
* The task_history read/write boundary: `appendHistory` (write) and
|
|
6
6
|
* `readTaskHistory` / `taskHistoryRowToResult` (read).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* it is exported here because every dispatch arm (run-native-task.ts,
|
|
11
|
-
* run-workflow-task.ts, run-command-task.ts), attempt-lifecycle.ts, and
|
|
12
|
-
* run-task.ts's disabled-task path all call it (spec §5.1's module split
|
|
13
|
-
* moves what was one file's internal call graph across several files).
|
|
8
|
+
* `appendHistory` is exported because every dispatch arm (run-native-task.ts,
|
|
9
|
+
* run-workflow-task.ts, run-command-task.ts) and attempt-lifecycle.ts call it.
|
|
14
10
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* instead of a read-side shim run forever. Every row this function sees now
|
|
23
|
-
* carries the current vocabulary's `target_kind` strings; the P0-pinned null
|
|
24
|
-
* fallbacks still apply (workflow `ref` falls back to `""`, the command
|
|
25
|
-
* arm's `engine` falls back to `null`).
|
|
11
|
+
* The READ side carries no legacy-vocabulary mapping: `task_history` is
|
|
12
|
+
* DB-owned data, so the remap to the current vocabulary is a one-time schema
|
|
13
|
+
* migration (`025-task-history-vocabulary-backfill` in
|
|
14
|
+
* src/core/state/migrations.ts) rather than a read-side shim run forever.
|
|
15
|
+
* Every row this function sees carries the current vocabulary's `target_kind`
|
|
16
|
+
* strings; the null fallbacks still apply (workflow `ref` falls back to `""`,
|
|
17
|
+
* the command arm's `engine` falls back to `null`).
|
|
26
18
|
*
|
|
27
19
|
* A DAG leaf with respect to the rest of src/tasks/run/**: this module
|
|
28
20
|
* imports TaskRunResult/TaskRunStatus's TYPE from ./task-result but no VALUE
|
|
@@ -6,14 +6,10 @@
|
|
|
6
6
|
* structured logs.db rows, and the shared redaction pass both sinks go
|
|
7
7
|
* through before either is written.
|
|
8
8
|
*
|
|
9
|
-
* Moved body-intact from src/tasks/runner.ts (spec
|
|
10
|
-
* docs/plans/specs/p1b-model-extraction.md §5.1, runner.ts:779-968).
|
|
11
|
-
*
|
|
12
9
|
* A DAG leaf with respect to the rest of src/tasks/run/**: nothing here
|
|
13
10
|
* imports ./task-result, ./task-history, or ./attempt-lifecycle, so every
|
|
14
11
|
* other run/** module can depend on this one without risking an import
|
|
15
|
-
* cycle
|
|
16
|
-
* imports as real edges too).
|
|
12
|
+
* cycle.
|
|
17
13
|
*/
|
|
18
14
|
import fs from "node:fs";
|
|
19
15
|
import path from "node:path";
|
|
@@ -52,11 +52,7 @@ export const SCHEDULED_TASK_CONTEXT_KEYS = [
|
|
|
52
52
|
* held their locks in a `locks/` directory no interactive command could see.
|
|
53
53
|
*/
|
|
54
54
|
const EXPLICIT_CONTEXT_KEYS = ["AKM_CONFIG_DIR", "AKM_DATA_DIR", "AKM_CACHE_DIR", "AKM_STATE_DIR"];
|
|
55
|
-
/**
|
|
56
|
-
* The AKM directory context of the current process. Child environments that
|
|
57
|
-
* are built from an allowlist must forward this closed set explicitly so
|
|
58
|
-
* nested AKM commands stay in the same installation.
|
|
59
|
-
*/
|
|
55
|
+
/** The AKM directory context of the current process, so nested AKM commands stay in the same installation. */
|
|
60
56
|
export function scheduledTaskContextEnv(env = process.env) {
|
|
61
57
|
const out = {};
|
|
62
58
|
for (const key of SCHEDULED_TASK_CONTEXT_KEYS) {
|
|
@@ -207,11 +203,10 @@ function parsePublicSchedulerInvocation(invocation) {
|
|
|
207
203
|
}
|
|
208
204
|
if (invocation[index] !== "--scheduled")
|
|
209
205
|
return undefined;
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
// (B-03).
|
|
206
|
+
// Zero or more `--<name> <value>` schedule-supplied input flags may follow
|
|
207
|
+
// `--scheduled` — the same trailing tail `compileTaskSchedulerBindings`
|
|
208
|
+
// compiles from `schedule[i].inputs`. Absent/empty is the earlier,
|
|
209
|
+
// byte-identical shape.
|
|
215
210
|
if (!isValidSchedulerInputFlagTail(invocation.slice(index + 1)))
|
|
216
211
|
return undefined;
|
|
217
212
|
return { invocation: [...invocation], ...(target !== undefined ? { target } : {}) };
|
|
@@ -233,23 +228,23 @@ function parsePublicSchedulerInvocation(invocation) {
|
|
|
233
228
|
}
|
|
234
229
|
}
|
|
235
230
|
/**
|
|
236
|
-
* Validate an OPTIONAL trailing schedule-input flag tail
|
|
237
|
-
*
|
|
231
|
+
* Validate an OPTIONAL trailing schedule-input flag tail: empty is valid
|
|
232
|
+
* (the earlier shape). Otherwise the tail is a sequence of
|
|
238
233
|
* entries, each EITHER:
|
|
239
234
|
*
|
|
240
|
-
* - a single inline `--<name>=<value>` token (
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
235
|
+
* - a single inline `--<name>=<value>` token (the ONLY encoding a
|
|
236
|
+
* dash-leading value's exact text can round-trip through, since `<value>`
|
|
237
|
+
* here is everything after the first `=`, whatever its leading character);
|
|
238
|
+
* or
|
|
244
239
|
* - a `(--<name>, <value>)` pair, where `<value>` is a single non-flag
|
|
245
|
-
* token (does not start with `-`) — the
|
|
240
|
+
* token (does not start with `-`) — the earlier shape.
|
|
246
241
|
*
|
|
247
242
|
* In both forms `<name>` matches {@link INPUT_NAME_PATTERN} and no name
|
|
248
243
|
* repeats. A bare flag, a repeated name, a flag-shaped value in the pair
|
|
249
244
|
* form, or a malformed token are all refused. This validates SHAPE only;
|
|
250
245
|
* the real materialization against the task's declared contract happens
|
|
251
246
|
* through the same `parseTaskInputFlags` + `materializeInputFlags` path
|
|
252
|
-
* `akm task run --<name>` already uses
|
|
247
|
+
* `akm task run --<name>` already uses — `parseTaskInputFlags`
|
|
253
248
|
* accepts both forms natively (its inline-`=` branch never inspects the
|
|
254
249
|
* value's leading character).
|
|
255
250
|
*/
|
|
@@ -49,7 +49,6 @@ async function compileTaskSources(input, desired, failures) {
|
|
|
49
49
|
const parsed = parseTaskSource({
|
|
50
50
|
yaml: fs.readFileSync(file, "utf8"),
|
|
51
51
|
filePath: file,
|
|
52
|
-
workspaceRoot: input.sourceRoot,
|
|
53
52
|
});
|
|
54
53
|
// A task with no `schedule:` is run by hand or by a workflow step; it
|
|
55
54
|
// contributes no binding and is not sync's to validate.
|
|
@@ -3,48 +3,29 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
5
|
* The bounded-document front end and field helpers both task source grammars
|
|
6
|
-
* share
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* `
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* D2-N4 helpers; src/tasks/source-v3.ts imports them and contains no copy of
|
|
17
|
-
* any of them" — `tests/tasks/bounded-document.test.ts`'s last describe
|
|
18
|
-
* block pins this with an AST scan of `source-v3.ts`, not just a runtime
|
|
19
|
-
* behavior check (a copy-instead-of-move implementation would pass every
|
|
20
|
-
* OTHER test in that file and in `tests/tasks/source-v3.test.ts`, because
|
|
21
|
-
* both files would still call functions they have in scope either way).
|
|
6
|
+
* share. Every helper below — including the `TASK_V3_MAX_*` resource bounds and
|
|
7
|
+
* `assertBoundedTaskYamlDocument` — is owned here. `source-v3.ts` imports every
|
|
8
|
+
* one of them (and re-exports `assertBoundedTaskYamlDocument` and the
|
|
9
|
+
* `TASK_V3_MAX_*` constants at their existing names, since those were already
|
|
10
|
+
* part of its public surface) and declares no copy of any of them.
|
|
11
|
+
* `tests/tasks/bounded-document.test.ts`'s last describe block pins this with
|
|
12
|
+
* an AST scan of `source-v3.ts`, not just a runtime behavior check (a copy
|
|
13
|
+
* would pass every other test in that file and in
|
|
14
|
+
* `tests/tasks/source-v3.test.ts`, because both files would still call
|
|
15
|
+
* functions they have in scope either way).
|
|
22
16
|
*
|
|
23
17
|
* This module deliberately imports NOTHING from `../source-v3` (not even a
|
|
24
|
-
* type)
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* (`TaskV3AkmOptions["tools"]`, `TaskV3Environment`) the return type is
|
|
30
|
-
* inlined structurally instead — invisible at runtime, and TypeScript's
|
|
31
|
-
* structural typing makes the inlined shape and the named alias
|
|
32
|
-
* interchangeable at every call site.
|
|
18
|
+
* type): `source-v3.ts` imports from this file, so a reverse edge here would
|
|
19
|
+
* close an import cycle. Where a helper's signature referenced a v3-only type
|
|
20
|
+
* (`TaskV3Environment`) the return type is inlined structurally instead —
|
|
21
|
+
* invisible at runtime, and TypeScript's structural typing makes the inlined
|
|
22
|
+
* shape and the named alias interchangeable at every call site.
|
|
33
23
|
*
|
|
34
|
-
* `parseTimeout`
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* their own siblings in `src/tasks/source/task-source-v4.ts`
|
|
39
|
-
* (`parseTimeoutTopLevel`/`parseToolsTopLevel`) with the same accept/reject
|
|
40
|
-
* semantics at a different, un-prefixed field path — v3 imports the two
|
|
41
|
-
* below rather than declaring them itself, purely because D2-N4 homes every
|
|
42
|
-
* one of these named helpers here. `nullableSelector` is the same kind of
|
|
43
|
-
* `["akm", …]`-hardcoding helper but is NOT in D2-N4's named list and stays
|
|
44
|
-
* declared directly in `source-v3.ts`.
|
|
24
|
+
* `parseTimeout` hardcodes the `["akm", …]` field path. Task source v4's
|
|
25
|
+
* top-level `timeout:` field has its own sibling in
|
|
26
|
+
* `src/tasks/source/task-source-v4.ts` (`parseTimeoutTopLevel`) with the same
|
|
27
|
+
* accept/reject semantics at a different, un-prefixed field path.
|
|
45
28
|
*/
|
|
46
|
-
import fs from "node:fs";
|
|
47
|
-
import path from "node:path";
|
|
48
29
|
import { types as utilTypes } from "node:util";
|
|
49
30
|
import { isAlias, isMap, isScalar, isSeq, LineCounter, parseDocument } from "yaml";
|
|
50
31
|
import { wellFormedUnicode } from "../../core/common.js";
|
|
@@ -238,63 +219,6 @@ export function parseTimeout(value, ctx) {
|
|
|
238
219
|
}
|
|
239
220
|
return value;
|
|
240
221
|
}
|
|
241
|
-
/**
|
|
242
|
-
* `akm.tools` — v3-only (hardcodes the `["akm", "tools"]` field path, see
|
|
243
|
-
* this module's header). Body-intact from `source-v3.ts`; the return type is
|
|
244
|
-
* inlined (was `TaskV3AkmOptions["tools"]`) so this module imports nothing
|
|
245
|
-
* from `../source-v3` (see header — the import-cycle ratchet is absolute).
|
|
246
|
-
*/
|
|
247
|
-
export function parseTools(value, ctx) {
|
|
248
|
-
if (value === null || typeof value === "string")
|
|
249
|
-
return value;
|
|
250
|
-
if (Array.isArray(value)) {
|
|
251
|
-
if (value.some((entry) => typeof entry !== "string"))
|
|
252
|
-
sourceError(ctx, ["akm", "tools"], "array values must be strings.");
|
|
253
|
-
return value;
|
|
254
|
-
}
|
|
255
|
-
if (typeof value === "object")
|
|
256
|
-
return value;
|
|
257
|
-
sourceError(ctx, ["akm", "tools"], "must be a string, string array, mapping, or null.");
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* `working-directory:` is already a top-level field in both grammars —
|
|
261
|
-
* reused body-intact, field path unchanged (`source-v3.ts:677-714`).
|
|
262
|
-
*/
|
|
263
|
-
export function validateWorkingDirectory(value, ctx) {
|
|
264
|
-
if (value.trim().length === 0 ||
|
|
265
|
-
value.includes("\0") ||
|
|
266
|
-
path.posix.isAbsolute(value.replaceAll("\\", "/")) ||
|
|
267
|
-
/^[A-Za-z]:[\\/]/.test(value) ||
|
|
268
|
-
value.startsWith("\\\\")) {
|
|
269
|
-
sourceError(ctx, ["working-directory"], "must be a non-empty relative path contained by the workspace root.");
|
|
270
|
-
}
|
|
271
|
-
const segments = value.replaceAll("\\", "/").split("/");
|
|
272
|
-
if (segments.some((segment) => segment === ".." || segment.length === 0)) {
|
|
273
|
-
sourceError(ctx, ["working-directory"], "must not contain empty or escaping path segments.");
|
|
274
|
-
}
|
|
275
|
-
if (!ctx.workspaceRoot) {
|
|
276
|
-
sourceError(ctx, ["working-directory"], "requires a workspace root so physical containment can be verified.");
|
|
277
|
-
}
|
|
278
|
-
let realRoot;
|
|
279
|
-
let realCandidate;
|
|
280
|
-
try {
|
|
281
|
-
realRoot = fs.realpathSync(ctx.workspaceRoot);
|
|
282
|
-
const candidate = path.resolve(realRoot, value);
|
|
283
|
-
const stat = fs.statSync(candidate);
|
|
284
|
-
if (!stat.isDirectory())
|
|
285
|
-
sourceError(ctx, ["working-directory"], "must resolve to a directory.");
|
|
286
|
-
realCandidate = fs.realpathSync(candidate);
|
|
287
|
-
}
|
|
288
|
-
catch (cause) {
|
|
289
|
-
if (cause instanceof UsageError)
|
|
290
|
-
throw cause;
|
|
291
|
-
sourceError(ctx, ["working-directory"], `cannot be physically verified: ${cause instanceof Error ? cause.message : String(cause)}.`);
|
|
292
|
-
}
|
|
293
|
-
const relative = path.relative(realRoot, realCandidate);
|
|
294
|
-
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
295
|
-
sourceError(ctx, ["working-directory"], "resolves outside the workspace root and is not physically contained.");
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
222
|
export function yamlProblem(message) {
|
|
299
223
|
return message.split("\n")[0]?.trim() || "invalid YAML";
|
|
300
224
|
}
|
|
@@ -373,32 +297,22 @@ export function assertBoundedTaskYamlDocument(document, options) {
|
|
|
373
297
|
}
|
|
374
298
|
/**
|
|
375
299
|
* Parse hostile YAML without aliases/tags/merges, then hand back the bounded
|
|
376
|
-
* `{root, lineAt}` pair both grammars that read a task document consume
|
|
377
|
-
*
|
|
378
|
-
* (`source-v3.ts:894-952`), generalized only by `sourceLabel`.
|
|
300
|
+
* `{root, lineAt}` pair both grammars that read a task document consume,
|
|
301
|
+
* generalized by `sourceLabel`.
|
|
379
302
|
*
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
* source
|
|
383
|
-
*
|
|
384
|
-
*
|
|
385
|
-
*
|
|
386
|
-
* (`task-source-v4.ts:790`) passes `sourceLabel: "task source v4"`; the
|
|
387
|
-
* version router (`parse-task-source.ts:61`) calls this directly with
|
|
388
|
-
* `sourceLabel: "task source"` — not "task v3 source" — because its front
|
|
389
|
-
* end runs before `root.version` is even read, so it cannot yet know which
|
|
390
|
-
* schema version the document will turn out to be.
|
|
303
|
+
* The two live `src` callers: `parseTaskSourceV4`'s standalone YAML-string entry
|
|
304
|
+
* (`task-source-v4.ts`) passes `sourceLabel: "task source v4"`; the version
|
|
305
|
+
* router (`parse-task-source.ts`) calls this directly with
|
|
306
|
+
* `sourceLabel: "task source"` because its front end runs before
|
|
307
|
+
* `root.version` is even read, so it cannot yet know which schema version the
|
|
308
|
+
* document will turn out to be.
|
|
391
309
|
*/
|
|
392
310
|
export function readBoundedTaskSourceYaml(input, options) {
|
|
393
311
|
const sourceLabel = options.sourceLabel;
|
|
394
|
-
//
|
|
395
|
-
//
|
|
396
|
-
//
|
|
397
|
-
//
|
|
398
|
-
// stayed generic). §5.2's target table closes that gap: every pre-version
|
|
399
|
-
// failure in this bounded YAML front end (not a string, too large, YAML
|
|
400
|
-
// parse/expansion) is a task-source defect, not a flag-parsing one, so each
|
|
401
|
-
// now carries `TASK_SOURCE_INVALID` explicitly.
|
|
312
|
+
// Every pre-version failure in this bounded YAML front end (not a string, too
|
|
313
|
+
// large, YAML parse/expansion) is a task-source defect, not a flag-parsing
|
|
314
|
+
// one, so each throw carries `TASK_SOURCE_INVALID` explicitly instead of the
|
|
315
|
+
// constructor's `INVALID_FLAG_VALUE` default.
|
|
402
316
|
if (typeof input.yaml !== "string") {
|
|
403
317
|
throw new UsageError(`Invalid ${sourceLabel} at ${input.filePath}: source must be a string.`, "TASK_SOURCE_INVALID");
|
|
404
318
|
}
|
|
@@ -75,7 +75,6 @@ export function parseTaskSource(input) {
|
|
|
75
75
|
}
|
|
76
76
|
const documentOptions = {
|
|
77
77
|
filePath: input.filePath,
|
|
78
|
-
...(input.workspaceRoot ? { workspaceRoot: input.workspaceRoot } : {}),
|
|
79
78
|
lineAt,
|
|
80
79
|
};
|
|
81
80
|
return Object.freeze({ version: 4, v4: parseTaskSourceV4Document(root, documentOptions) });
|
|
@@ -21,14 +21,16 @@ function projectAkm(document) {
|
|
|
21
21
|
const execution = document.execution;
|
|
22
22
|
if (execution.agent !== undefined)
|
|
23
23
|
out.agent = execution.agent;
|
|
24
|
+
if (execution.connection !== undefined)
|
|
25
|
+
out.connection = execution.connection;
|
|
26
|
+
if (execution.harness !== undefined)
|
|
27
|
+
out.harness = execution.harness;
|
|
24
28
|
if (execution.engine !== undefined)
|
|
25
29
|
out.engine = execution.engine;
|
|
26
30
|
if (execution.model !== undefined)
|
|
27
31
|
out.model = execution.model;
|
|
28
32
|
if (execution.inference !== undefined)
|
|
29
33
|
out.inference = execution.inference;
|
|
30
|
-
if (execution.tools !== undefined)
|
|
31
|
-
out.tools = execution.tools;
|
|
32
34
|
if (execution.timeout !== undefined)
|
|
33
35
|
out.timeout = execution.timeout;
|
|
34
36
|
if (execution.redact !== undefined)
|
|
@@ -41,7 +43,7 @@ function projectAkm(document) {
|
|
|
41
43
|
out.outputSchema = document.output;
|
|
42
44
|
return Object.keys(out).length > 0 ? Object.freeze(out) : undefined;
|
|
43
45
|
}
|
|
44
|
-
/** Project one parsed task source v4 document into the prepare seam's existing input shape
|
|
46
|
+
/** Project one parsed task source v4 document into the prepare seam's existing input shape. */
|
|
45
47
|
export function projectTaskSourceV4(document) {
|
|
46
48
|
const akm = projectAkm(document);
|
|
47
49
|
const schedules = Object.freeze(document.schedule.map((entry) => Object.freeze({ cron: entry.cron, source: entry.source, ordinal: entry.ordinal })));
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
5
|
* `TASK_INPUT_DIAGNOSTICS` — the task-side message/code vocabulary for
|
|
6
|
-
* `materializeInputFlags
|
|
7
|
-
* D3-N3, §4.2, §5.1).
|
|
6
|
+
* `materializeInputFlags`.
|
|
8
7
|
*
|
|
9
8
|
* `materializeInputFlags` (`src/execution/input-contract.ts`) contains no
|
|
10
9
|
* literal user-facing string of its own — every message/code it raises comes
|
|
@@ -13,8 +12,8 @@
|
|
|
13
12
|
* is that same seam's task-side sibling, consumed by `akm task run`'s Stage 2
|
|
14
13
|
* (`src/tasks/run/load-task.ts`). Mirrors `WORKFLOW_PARAMETER_DIAGNOSTICS`'s
|
|
15
14
|
* shape exactly (`unknownFlag`'s declared-name enumeration in the SEPARATE
|
|
16
|
-
* `hint`, not the message
|
|
17
|
-
* the codes
|
|
15
|
+
* `hint`, not the message) with task-flavored nouns and
|
|
16
|
+
* the codes `UNKNOWN_FLAG` for an undeclared name,
|
|
18
17
|
* `INPUT_BINDING_INVALID` for every value/contract failure.
|
|
19
18
|
*/
|
|
20
19
|
import { UsageError } from "../../core/errors.js";
|