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
|
@@ -22,19 +22,22 @@ import { assetPathForName } from "../../core/asset/asset-placement.js";
|
|
|
22
22
|
import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
23
23
|
import { conceptIdFromTypeName, isFullRefInput } from "../../core/asset/resolve-ref.js";
|
|
24
24
|
import { isWithin, resolveStashDir } from "../../core/common.js";
|
|
25
|
-
import { loadConfig, mutateConfig, resetConfigCache } from "../../core/config/config.js";
|
|
26
|
-
import { bundleKeyForContentRoot,
|
|
25
|
+
import { defaultConnection, defaultHarness, loadConfig, mutateConfig, resetConfigCache, } from "../../core/config/config.js";
|
|
26
|
+
import { bundleKeyForContentRoot, resolveConfiguredSources } from "../../core/config/config-sources.js";
|
|
27
27
|
import { IMPROVE_AUTONOMY_CONFIG_KEY, isImproveAutonomyEnabled } from "../../core/config/experimental.js";
|
|
28
28
|
import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
|
|
29
|
-
import {
|
|
29
|
+
import { getTaskLogDir } from "../../core/paths.js";
|
|
30
30
|
import { warn } from "../../core/warn.js";
|
|
31
|
-
import { commitWriteTargetBoundary, isWriteCapableSourceKind, prepareWriteTargetForMutation, resolveWorkingStashTarget, resolveWriteTarget, writeAssetToSource, } from "../../core/write-source.js";
|
|
32
|
-
import {
|
|
31
|
+
import { assertBundleNotDisabled, commitWriteTargetBoundary, isWriteCapableSourceKind, prepareWriteTargetForMutation, resolveWorkingStashTarget, resolveWriteTarget, writeAssetToSource, } from "../../core/write-source.js";
|
|
32
|
+
import { deriveInstallations } from "../../indexer/installations.js";
|
|
33
|
+
import { retiredEngineSelection } from "../../integrations/agent/resolution.js";
|
|
34
|
+
import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
|
|
33
35
|
import { resolveAssetPath } from "../../sources/resolve.js";
|
|
34
36
|
import { enabledRefsFromInstalled, schedulerEnabledRefs, setSchedulerRefEnabled } from "../../tasks/activation-config.js";
|
|
35
37
|
import { backendNameForPlatform, selectBackend } from "../../tasks/backends/index.js";
|
|
36
38
|
import { prepareTaskV3Execution } from "../../tasks/prepare/prepare.js";
|
|
37
39
|
import { isCheckoutInvocation, resolveAkmInvocation } from "../../tasks/resolve-akm-bin.js";
|
|
40
|
+
import { activeTaskSources, resolveBundleAsset } from "../../tasks/run/load-task.js";
|
|
38
41
|
import { createExecutionProvenanceContext } from "../../tasks/run/provenance.js";
|
|
39
42
|
import { runTask } from "../../tasks/run/run-task.js";
|
|
40
43
|
import { readTaskHistory } from "../../tasks/run/task-history.js";
|
|
@@ -63,13 +66,15 @@ export async function akmTasksAdd(input, deps = {}) {
|
|
|
63
66
|
if (!isWithin(assetPath, typeRoot)) {
|
|
64
67
|
throw new UsageError(`Resolved task path escapes the stash: "${id}".`, "PATH_ESCAPE_VIOLATION");
|
|
65
68
|
}
|
|
69
|
+
const engineAs = input.engine === undefined ? undefined : retiredEngineSelection(bundle.config, input.engine);
|
|
66
70
|
const yaml = renderTaskYaml({
|
|
67
71
|
id,
|
|
68
72
|
schedule: input.schedule,
|
|
69
73
|
workflow: input.workflow,
|
|
70
74
|
prompt: input.prompt,
|
|
71
75
|
command: input.command,
|
|
72
|
-
|
|
76
|
+
connection: input.connection ?? (engineAs?.kind === "connection" ? engineAs.name : undefined),
|
|
77
|
+
harness: input.harness ?? (engineAs?.kind === "harness" ? engineAs.name : undefined),
|
|
73
78
|
model: input.model,
|
|
74
79
|
timeoutMs: input.timeoutMs,
|
|
75
80
|
params: input.params,
|
|
@@ -78,7 +83,7 @@ export async function akmTasksAdd(input, deps = {}) {
|
|
|
78
83
|
when_to_use: input.when_to_use,
|
|
79
84
|
tags: input.tags,
|
|
80
85
|
});
|
|
81
|
-
const parsedTask = parseTaskSource({ yaml, filePath: assetPath
|
|
86
|
+
const parsedTask = parseTaskSource({ yaml, filePath: assetPath });
|
|
82
87
|
const task = projectTaskSourceV4(parsedTask.v4);
|
|
83
88
|
const qualifiedRef = makeBundleRef(bundle.bundleName, `tasks/${id}`);
|
|
84
89
|
await prepareTaskV3Execution(task, {
|
|
@@ -152,13 +157,17 @@ function assertTaskAddTargetShape(input) {
|
|
|
152
157
|
if (targetCount !== 1) {
|
|
153
158
|
throw new UsageError("Pass exactly one of --workflow <ref>, --prompt <inline-text>, or --command <shell-command>.", "INVALID_FLAG_VALUE");
|
|
154
159
|
}
|
|
155
|
-
// `--timeout-ms` is the workflow's whole-run bound.
|
|
156
|
-
// prompt-only because workflow
|
|
157
|
-
|
|
158
|
-
|
|
160
|
+
// `--timeout-ms` is the workflow's whole-run bound. Connection, harness and
|
|
161
|
+
// model stay prompt-only because a workflow's connections and harnesses come from the frozen plan.
|
|
162
|
+
const selects = input.connection !== undefined ||
|
|
163
|
+
input.harness !== undefined ||
|
|
164
|
+
input.engine !== undefined ||
|
|
165
|
+
input.model !== undefined;
|
|
166
|
+
if (input.workflow && selects) {
|
|
167
|
+
throw new UsageError("Workflow tasks accept --params and --timeout-ms; connection, harness and model are prompt-task fields.", "INVALID_FLAG_VALUE");
|
|
159
168
|
}
|
|
160
|
-
if (hasCommand &&
|
|
161
|
-
throw new UsageError("Command tasks accept --timeout-ms but not --
|
|
169
|
+
if (hasCommand && selects) {
|
|
170
|
+
throw new UsageError("Command tasks accept --timeout-ms but not --connection, --harness or --model.", "INVALID_FLAG_VALUE");
|
|
162
171
|
}
|
|
163
172
|
if (input.prompt !== undefined)
|
|
164
173
|
assertInlineTaskPrompt(input.prompt);
|
|
@@ -169,24 +178,18 @@ export async function akmTasksRun(id, options = {}) {
|
|
|
169
178
|
const adapterId = bundle.source.adapterId ?? detectAdapterId(bundle.source.path);
|
|
170
179
|
const resolvedId = taskIdForAdapter(parsed.id, adapterId);
|
|
171
180
|
const scheduled = options.scheduled === true;
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
// whether or not --scheduled was passed (§1.6 D5-N1) — scheduled stays a
|
|
181
|
+
// Built ONCE at this invocation boundary. eventSource is "task"
|
|
182
|
+
// whether or not --scheduled was passed — scheduled stays a
|
|
175
183
|
// separate field carrying its own pre-existing meaning (activation policy,
|
|
176
184
|
// scheduler env), never selecting the event source.
|
|
177
185
|
const provenance = createExecutionProvenanceContext(scheduled);
|
|
178
|
-
//
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
// P2a Lane C (spec docs/plans/specs/p2a-task-source-v4.md §5.1): the raw,
|
|
182
|
-
// exact-name input flags `tasks-cli.ts`'s Stage 1 captures ride through
|
|
183
|
-
// unchanged to `runTask` -> `loadPreparedTask`'s Stage 2 materializer,
|
|
186
|
+
// The raw, exact-name input flags `tasks-cli.ts`'s Stage 1 captures ride
|
|
187
|
+
// through unchanged to `runTask` -> `loadPreparedTask`'s Stage 2 materializer,
|
|
184
188
|
// which owns declaring `inputFlags` on `RunTaskOptions` and attaching the
|
|
185
189
|
// materialized literals to the constructed `TaskInvocation`. This is only
|
|
186
|
-
// the pass-through surface
|
|
187
|
-
// same run without flags (§0), and P2a delivers nothing to the target.
|
|
190
|
+
// the pass-through surface.
|
|
188
191
|
//
|
|
189
|
-
// No `as` cast
|
|
192
|
+
// No `as` cast: `RunTaskOptions` (this
|
|
190
193
|
// literal's inferred type is checked directly against it, below) declares
|
|
191
194
|
// every one of these fields, so the compiler — not a suppressed excess-
|
|
192
195
|
// property check — enforces this seam. A future rename or removal on
|
|
@@ -202,11 +205,9 @@ export async function akmTasksRun(id, options = {}) {
|
|
|
202
205
|
// The runner owns the prepare-before-reserve boundary. Invalid source,
|
|
203
206
|
// projectability, and resolver failures therefore create no history row.
|
|
204
207
|
const result = await runTask(resolvedId, runOptions);
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
// shell/script task's process exit 78 still passes through as CLI exit 78
|
|
209
|
-
// (documented behavior, src/assets/hints/cli-hints-short.md:95).
|
|
208
|
+
// "command" means the agent/LLM arm — the native shell/script arm reports
|
|
209
|
+
// "shell" / "script" — so a shell/script task's process exit 78 still passes
|
|
210
|
+
// through as CLI exit 78 (documented behavior, src/assets/hints/cli-hints-short.md).
|
|
210
211
|
const exitCode = result.status === "failed" &&
|
|
211
212
|
(result.target.kind === "shell" || result.target.kind === "script") &&
|
|
212
213
|
result.detail?.exitCode === 78
|
|
@@ -234,7 +235,6 @@ function resolveTaskActivation(ref, target, requireSchedulable) {
|
|
|
234
235
|
const parsedSource = parseTaskSource({
|
|
235
236
|
yaml: fs.readFileSync(sourcePath, "utf8"),
|
|
236
237
|
filePath: sourcePath,
|
|
237
|
-
workspaceRoot: bundle.source.path,
|
|
238
238
|
});
|
|
239
239
|
if (parsedSource.v4.schedule.length === 0) {
|
|
240
240
|
throw new UsageError(`Task ${JSON.stringify(ref)} has no schedule to enable.`, "INVALID_FLAG_VALUE");
|
|
@@ -361,24 +361,26 @@ async function buildSchedulerSyncPlan(deps, bundleTarget, options) {
|
|
|
361
361
|
if (options.dryRun !== true)
|
|
362
362
|
config = loadConfig();
|
|
363
363
|
}
|
|
364
|
-
|
|
364
|
+
// The one active-bundle set search, show and workflows walk, working stash included.
|
|
365
|
+
// A working stash that is a disabled configured bundle is left out: an
|
|
366
|
+
// unscoped sync still removes that bundle's rows (below) and syncs the others,
|
|
367
|
+
// and a scoped sync reports it as disabled only when it is the selected one.
|
|
368
|
+
const sources = activeTaskSources(config);
|
|
369
|
+
const ids = deriveInstallations(sources).map((installation) => installation.id);
|
|
370
|
+
const kinds = sources.map((source) => source.type);
|
|
371
|
+
const configuredSources = resolveConfiguredSources(config);
|
|
365
372
|
if (bundleTarget) {
|
|
366
373
|
// Only filesystem and git bundles can carry scheduler state.
|
|
367
|
-
const
|
|
368
|
-
if (
|
|
369
|
-
throw new UsageError(`Bundle "${bundleTarget}" has kind "${
|
|
374
|
+
const targetType = kinds[ids.indexOf(bundleTarget)];
|
|
375
|
+
if (targetType !== undefined && !isWriteCapableSourceKind(targetType)) {
|
|
376
|
+
throw new UsageError(`Bundle "${bundleTarget}" has kind "${targetType}"; task scheduling is only supported for filesystem and git bundles.`, "INVALID_FLAG_VALUE");
|
|
370
377
|
}
|
|
371
378
|
}
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
const selected = bundleTarget
|
|
378
|
-
? [bundleTarget]
|
|
379
|
-
: schedulable.length > 0 || configuredSources.length > 0
|
|
380
|
-
? schedulable
|
|
381
|
-
: [undefined];
|
|
379
|
+
const schedulable = ids.filter((_, index) => {
|
|
380
|
+
const type = kinds[index];
|
|
381
|
+
return type !== undefined && isWriteCapableSourceKind(type);
|
|
382
|
+
});
|
|
383
|
+
const selected = bundleTarget ? [bundleTarget] : schedulable;
|
|
382
384
|
const enabledRefSet = new Set(enabledRefs);
|
|
383
385
|
const desired = [];
|
|
384
386
|
const failures = [];
|
|
@@ -591,19 +593,18 @@ export async function akmTasksDoctor(deps = {}) {
|
|
|
591
593
|
}
|
|
592
594
|
}
|
|
593
595
|
const bindings = groupInstalledBindings(installed);
|
|
594
|
-
// Report the EFFECTIVE
|
|
595
|
-
|
|
596
|
-
const
|
|
597
|
-
const
|
|
598
|
-
const engines = Object.keys(config.engines ?? {});
|
|
596
|
+
// Report the EFFECTIVE view — the default harness (else connection) agent work runs on, and what is configured.
|
|
597
|
+
const config = loadConfig();
|
|
598
|
+
const defaultEngine = (defaultHarness(config) ?? defaultConnection(config))?.name;
|
|
599
|
+
const engines = [...Object.keys(config.connections ?? {}), ...Object.keys(config.harnesses ?? {})];
|
|
599
600
|
// §6.1: surface the effective triage settings for the default improve
|
|
600
601
|
// strategy. The struct is a fixed shape, so this is a deliberate addition.
|
|
601
|
-
const improveStrategyName =
|
|
602
|
+
const improveStrategyName = config.improve?.strategy ?? "default";
|
|
602
603
|
// D8 — report the EFFECTIVE strategy, not the raw one. Resolving the raw
|
|
603
604
|
// strategy here would report `applyMode: "promote"` for a promote strategy
|
|
604
605
|
// under a review-first config, while the run actually uses "queue" — a doctor
|
|
605
606
|
// command lying about the thing it exists to diagnose.
|
|
606
|
-
const rawStrategy = resolveImproveStrategy(config.
|
|
607
|
+
const rawStrategy = resolveImproveStrategy(config.improve?.strategy, config).config;
|
|
607
608
|
const { config: effectiveStrategy, gated } = applyAutonomyGate(rawStrategy, config);
|
|
608
609
|
const autonomyEnabled = isImproveAutonomyEnabled(config);
|
|
609
610
|
// Memory cleanup has no strategy flag to downgrade, so add that direct lane
|
|
@@ -631,7 +632,6 @@ export async function akmTasksDoctor(deps = {}) {
|
|
|
631
632
|
? { remediation: "akm task sync --rebind" }
|
|
632
633
|
: {}),
|
|
633
634
|
logDir: getTaskLogDir(),
|
|
634
|
-
historyDir: getTaskHistoryDir(),
|
|
635
635
|
engine: { defaultEngine, available: engines },
|
|
636
636
|
scheduleSubset: SCHEDULE_SUPPORTED_SUBSET_HINT,
|
|
637
637
|
warnings,
|
|
@@ -696,17 +696,11 @@ function taskProjectionAssetResolver(config, bundleName, bundleRoot) {
|
|
|
696
696
|
if (bundle === bundleName) {
|
|
697
697
|
return { file: await resolveAssetPath(bundleRoot, type, name), bundleRoot };
|
|
698
698
|
}
|
|
699
|
-
|
|
700
|
-
const target = resolveWriteTarget(config, bundle, { requireWritable: false, flag: "The asset ref's bundle" });
|
|
701
|
-
return {
|
|
702
|
-
file: await resolveAssetPath(target.source.path, type, name),
|
|
703
|
-
bundleRoot: target.source.path,
|
|
704
|
-
};
|
|
699
|
+
return resolveBundleAsset(config, { bundle, type, name });
|
|
705
700
|
};
|
|
706
701
|
}
|
|
707
702
|
/**
|
|
708
|
-
* Exported for `src/commands/tasks/explain.ts`
|
|
709
|
-
* docs/plans/specs/p2b-input-bindings.md §4.5, B-N4): `akm task explain`
|
|
703
|
+
* Exported for `src/commands/tasks/explain.ts`: `akm task explain`
|
|
710
704
|
* resolves its `--bundle` axis identically to every other read-only task
|
|
711
705
|
* verb here (`akm task history`, `akm task run`) — the SAME resolver, not a
|
|
712
706
|
* second one.
|
|
@@ -722,44 +716,27 @@ export function resolveTaskReadBundle(refBundle, flagBundle) {
|
|
|
722
716
|
resolved = resolveWorkingStashTarget(config, { requireWritable: false });
|
|
723
717
|
}
|
|
724
718
|
else {
|
|
725
|
-
|
|
726
|
-
const
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
719
|
+
// Reading needs no write target: any bundle of the active set resolves.
|
|
720
|
+
const sources = activeTaskSources(config);
|
|
721
|
+
const source = resolveSourcesForOrigin(selector, sources)[0];
|
|
722
|
+
if (!source) {
|
|
723
|
+
assertBundleNotDisabled(config, selector);
|
|
724
|
+
throw new UsageError(`${flagBundle !== undefined ? "--bundle" : "The task ref's bundle"} must reference a source name from your config. No source named "${selector}" is configured. Run \`akm bundle list\` to see available sources.`, "INVALID_FLAG_VALUE");
|
|
725
|
+
}
|
|
726
|
+
resolved = {
|
|
727
|
+
source: {
|
|
728
|
+
kind: source.type ?? "filesystem",
|
|
729
|
+
name: selector,
|
|
730
|
+
path: source.path,
|
|
731
|
+
adapterId: source.adapterId ?? detectAdapterId(source.path),
|
|
732
|
+
},
|
|
733
|
+
};
|
|
734
734
|
}
|
|
735
735
|
if (refBundle && resolved.source.name !== refBundle) {
|
|
736
736
|
throw new UsageError(`Task ref bundle ${JSON.stringify(refBundle)} does not match the resolved source.`, "INVALID_FLAG_VALUE");
|
|
737
737
|
}
|
|
738
738
|
return resolved;
|
|
739
739
|
}
|
|
740
|
-
/**
|
|
741
|
-
* New scheduler bindings always carry a canonical `--bundle <owner>` token,
|
|
742
|
-
* including an env-selected working stash. That stash need not be persisted in
|
|
743
|
-
* config (CI, one-shot tools, and fresh installs commonly use only
|
|
744
|
-
* AKM_BUNDLE_DIR), so its scheduled child — every row sets AKM_BUNDLE_DIR to
|
|
745
|
-
* the working stash it was synced from — must accept precisely its derived
|
|
746
|
-
* owner name.
|
|
747
|
-
*
|
|
748
|
-
* This is intentionally narrower than an unknown-bundle fallback: a configured
|
|
749
|
-
* source always wins, and an unconfigured selector is accepted only when it is
|
|
750
|
-
* exactly the current env-selected working stash identity.
|
|
751
|
-
*/
|
|
752
|
-
function resolveImplicitScheduledBundleTarget(config, selector) {
|
|
753
|
-
if (!process.env.AKM_BUNDLE_DIR?.trim())
|
|
754
|
-
return undefined;
|
|
755
|
-
try {
|
|
756
|
-
const working = resolveWorkingStashTarget(config, { requireWritable: false });
|
|
757
|
-
return working.source.name === selector ? working : undefined;
|
|
758
|
-
}
|
|
759
|
-
catch {
|
|
760
|
-
return undefined;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
740
|
/** True when `candidate` resolves to the same directory as the primary stash. */
|
|
764
741
|
function isPrimaryStashPath(candidate) {
|
|
765
742
|
let primary;
|
|
@@ -776,8 +753,7 @@ function errorMessage(cause) {
|
|
|
776
753
|
}
|
|
777
754
|
/**
|
|
778
755
|
* Infer a JSON-Schema-subset `type` keyword from one `--params` value's
|
|
779
|
-
* runtime shape
|
|
780
|
-
* B-20). `null` is not one of the five runtime types the spec enumerates
|
|
756
|
+
* runtime shape. `null` is not one of the five runtime types
|
|
781
757
|
* (string/number/boolean/object/array) but is a value JSON.parse can still
|
|
782
758
|
* produce for a param; `src/core/json-schema.ts`'s subset validator accepts
|
|
783
759
|
* `"null"` as a `type`, so it is handled rather than mis-typed.
|
|
@@ -830,8 +806,10 @@ function renderTaskYaml(input) {
|
|
|
830
806
|
obj.when_to_use = input.when_to_use;
|
|
831
807
|
if (input.tags && input.tags.length > 0)
|
|
832
808
|
obj.tags = input.tags;
|
|
833
|
-
if (input.
|
|
834
|
-
obj.
|
|
809
|
+
if (input.connection !== undefined)
|
|
810
|
+
obj.connection = input.connection;
|
|
811
|
+
if (input.harness !== undefined)
|
|
812
|
+
obj.harness = input.harness;
|
|
835
813
|
if (input.model !== undefined)
|
|
836
814
|
obj.model = input.model;
|
|
837
815
|
if (input.timeoutMs !== undefined)
|
package/dist/commands/ui/api.js
CHANGED
|
@@ -319,16 +319,24 @@ function config() {
|
|
|
319
319
|
value,
|
|
320
320
|
source: configSource(path),
|
|
321
321
|
}));
|
|
322
|
-
const
|
|
322
|
+
const named = (entries) => Object.entries((entries ?? {})).map(([name, entry]) => ({
|
|
323
323
|
name,
|
|
324
|
-
...
|
|
324
|
+
...entry,
|
|
325
325
|
}));
|
|
326
326
|
const env = Object.keys(process.env)
|
|
327
327
|
.filter((name) => name.startsWith("AKM_"))
|
|
328
328
|
.sort()
|
|
329
329
|
.map((name) => ({ name, value: isSecretEnvName(name) ? "[redacted]" : (process.env[name] ?? "") }));
|
|
330
330
|
const configPath = getConfigPath();
|
|
331
|
-
return {
|
|
331
|
+
return {
|
|
332
|
+
path: configPath,
|
|
333
|
+
exists: fs.existsSync(configPath),
|
|
334
|
+
config: effective,
|
|
335
|
+
entries,
|
|
336
|
+
connections: named(effective.connections),
|
|
337
|
+
harnesses: named(effective.harnesses),
|
|
338
|
+
env,
|
|
339
|
+
};
|
|
332
340
|
}
|
|
333
341
|
// ── /api/proposals ───────────────────────────────────────────────────────────
|
|
334
342
|
export function proposalSummary(proposal) {
|
|
@@ -7,41 +7,15 @@
|
|
|
7
7
|
* anything secret-like by key name, because the UI shows config the CLI's
|
|
8
8
|
* `config list` never had to defend against a browser leaking.
|
|
9
9
|
*
|
|
10
|
-
* Symbolic references (`$VAR`, `${VAR}`,
|
|
10
|
+
* Symbolic references (`$VAR`, `${VAR}`, `${secrets/name}`) are kept: they say
|
|
11
11
|
* where a credential comes from without being one.
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
import { isApiKeyReference } from "../../core/config/schema/primitives.js";
|
|
14
|
+
import { REDACTED, redactUrlCredentials } from "../../core/redaction.js";
|
|
14
15
|
/** Key names whose string values are credentials, or sit in a bag of them. */
|
|
15
16
|
const SECRET_KEY = /(api[-_]?key|token|password|passwd|secret|credential|authorization|bearer|private[-_]?key)/i;
|
|
16
17
|
/** A whole subtree of values (`env`, `secrets`) that is data, not settings. */
|
|
17
18
|
const SECRET_BAG_KEY = /^(env|secrets?)$/i;
|
|
18
|
-
const SYMBOLIC_REFERENCE = /^(\$[A-Za-z_][A-Za-z0-9_]*|\$\{[A-Za-z_][A-Za-z0-9_]*\}|secret:\/\/.+)$/;
|
|
19
|
-
/** Query parameters that carry a credential in a URL. */
|
|
20
|
-
const SECRET_QUERY_PARAM = /^(api[-_]?key|key|token|access[-_]?token|auth|password|secret|sig|signature)$/i;
|
|
21
|
-
/** `scheme://user:pass@host/?token=x` with the credentials masked. Anything that is not a URL is returned as is. */
|
|
22
|
-
export function redactUrlCredentials(value) {
|
|
23
|
-
if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(value))
|
|
24
|
-
return value;
|
|
25
|
-
try {
|
|
26
|
-
const url = new URL(value);
|
|
27
|
-
let changed = false;
|
|
28
|
-
if (url.username || url.password) {
|
|
29
|
-
url.username = "";
|
|
30
|
-
url.password = "";
|
|
31
|
-
changed = true;
|
|
32
|
-
}
|
|
33
|
-
for (const key of [...url.searchParams.keys()]) {
|
|
34
|
-
if (SECRET_QUERY_PARAM.test(key)) {
|
|
35
|
-
url.searchParams.set(key, REDACTED);
|
|
36
|
-
changed = true;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return changed ? url.toString() : value;
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return value;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
19
|
/** `text` with the credentials in every URL it contains masked (`llm default: https://host/?token=x`). */
|
|
46
20
|
export function redactUrlsInText(text) {
|
|
47
21
|
return text.includes("://") ? text.replace(/https?:\/\/[^\s"'<>)\]]+/gi, (url) => redactUrlCredentials(url)) : text;
|
|
@@ -65,7 +39,7 @@ export function redactForUi(value, inSecretBag = false) {
|
|
|
65
39
|
if (Array.isArray(value))
|
|
66
40
|
return value.map((child) => redactForUi(child, inSecretBag));
|
|
67
41
|
if (typeof value === "string") {
|
|
68
|
-
if (
|
|
42
|
+
if (isApiKeyReference(value))
|
|
69
43
|
return value;
|
|
70
44
|
return inSecretBag ? REDACTED : redactUrlCredentials(value);
|
|
71
45
|
}
|
|
@@ -73,7 +47,7 @@ export function redactForUi(value, inSecretBag = false) {
|
|
|
73
47
|
return inSecretBag && value !== null ? REDACTED : value;
|
|
74
48
|
const result = {};
|
|
75
49
|
for (const [key, child] of Object.entries(value)) {
|
|
76
|
-
if (typeof child === "string" && SECRET_KEY.test(key) && !
|
|
50
|
+
if (typeof child === "string" && SECRET_KEY.test(key) && !isApiKeyReference(child)) {
|
|
77
51
|
result[key] = REDACTED;
|
|
78
52
|
}
|
|
79
53
|
else {
|
|
@@ -44,7 +44,7 @@ function positional(body, key) {
|
|
|
44
44
|
}
|
|
45
45
|
function preserveUnrelatedConfig(config = loadConfig()) {
|
|
46
46
|
if (!isDeepStrictEqual(sanitizeConfigForWrite(config, { quiet: true }), config)) {
|
|
47
|
-
throw new UsageError("AKM's config sanitizer would remove unrelated credentials.
|
|
47
|
+
throw new UsageError("AKM's config sanitizer would remove unrelated credentials. Remove registry URL credentials using the CLI before changing bundle configuration in the UI.");
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
/** The error kind behind each exit code of the CLI contract (`EXIT_CODES`, `src/cli/shared.ts`). */
|
|
@@ -8,18 +8,22 @@
|
|
|
8
8
|
* (`loadWorkflowAsset`, `freezeWorkflow`) and NOTHING else — never
|
|
9
9
|
* `publishWorkflowRunV4`, `startWorkflowRun`, `appendEvent`, or `akmIndex`.
|
|
10
10
|
*
|
|
11
|
-
* SECRET-FREE, by construction (§4.6's closed print list): a
|
|
12
|
-
*
|
|
11
|
+
* SECRET-FREE, by construction (§4.6's closed print list): a step's
|
|
12
|
+
* `orchestration` is the authored argv, cwd and env names plus the
|
|
13
|
+
* bundle-qualified refs they resolve to (the projection `akm show` prints,
|
|
14
|
+
* never a value or a path); a resolved reference VALUE is never printed (references resolve at pre-attempt, not
|
|
13
15
|
* here); a `literal` **environment** binding's value is never printed (only
|
|
14
|
-
* `environment[].kind`/`.name`, and an `env-ref`'s `.ref
|
|
15
|
-
*
|
|
16
|
+
* `environment[].kind`/`.name`, and an `env-ref`'s `.ref` — all NAMES);
|
|
17
|
+
* `request.command.content`,
|
|
16
18
|
* `request.persona`, `request.conversation`, `request.runtime.environment`,
|
|
17
19
|
* and a script target's `bytesBase64` are never read at all.
|
|
18
20
|
*/
|
|
19
21
|
import { loadConfig } from "../../core/config/config.js";
|
|
22
|
+
import { NotFoundError } from "../../core/errors.js";
|
|
20
23
|
import { buildExecutionFromWire } from "../../integrations/agent/execution.js";
|
|
21
24
|
import { freezeWorkflow } from "../../workflows/freeze/freeze.js";
|
|
22
25
|
import { computePlanHash } from "../../workflows/ir/plan-hash.js";
|
|
26
|
+
import { resolveOrchestrationRefs, summarizeStepOrchestration } from "../../workflows/renderer.js";
|
|
23
27
|
import { loadWorkflowAsset } from "../../workflows/runtime/workflow-asset-loader.js";
|
|
24
28
|
/** The step's dispatch unit — the map template for a fan-out, else the root unit. Undefined for a step not yet frozen. */
|
|
25
29
|
function stepUnit(step) {
|
|
@@ -30,7 +34,7 @@ function stepUnit(step) {
|
|
|
30
34
|
}
|
|
31
35
|
function projectEnvironmentBinding(binding) {
|
|
32
36
|
if (binding.kind === "env-ref") {
|
|
33
|
-
return { kind: binding.kind, ref: binding.ref
|
|
37
|
+
return { kind: binding.kind, ref: binding.ref };
|
|
34
38
|
}
|
|
35
39
|
// literal / pass-through: kind + name only — a literal's VALUE is never printed.
|
|
36
40
|
return { kind: binding.kind, name: binding.name };
|
|
@@ -46,14 +50,23 @@ function childExpansion(target) {
|
|
|
46
50
|
via: "child",
|
|
47
51
|
childRef: target.ref,
|
|
48
52
|
childPlanHash: target.planHash,
|
|
49
|
-
steps: target.frozenPlan.steps.map((step, index) => projectStep(step, index)),
|
|
53
|
+
steps: target.frozenPlan.steps.map((step, index) => projectStep(step, index, stepOrchestration(step, target.frozenPlan))),
|
|
50
54
|
};
|
|
51
55
|
}
|
|
52
56
|
/** The child expansion boundary for one step (§4.6). */
|
|
53
57
|
function stepExpansion(frozenTarget) {
|
|
54
58
|
return frozenTarget?.kind === "child-workflow" ? childExpansion(frozenTarget) : { via: "direct" };
|
|
55
59
|
}
|
|
56
|
-
|
|
60
|
+
/**
|
|
61
|
+
* The step's `show` orchestration projection plus the refs it resolves to.
|
|
62
|
+
* `authored` is the compiled step (it keeps the spelling the author wrote);
|
|
63
|
+
* a child plan's steps have only their frozen form.
|
|
64
|
+
*/
|
|
65
|
+
function stepOrchestration(step, plan) {
|
|
66
|
+
const summary = summarizeStepOrchestration(step, plan.defaults);
|
|
67
|
+
return summary && resolveOrchestrationRefs(summary);
|
|
68
|
+
}
|
|
69
|
+
function projectStep(step, sequenceIndex, orchestration) {
|
|
57
70
|
const unit = stepUnit(step);
|
|
58
71
|
const frozenTarget = unit?.frozenTarget;
|
|
59
72
|
const kind = step.root?.kind === "map" ? "map" : "unit";
|
|
@@ -65,12 +78,13 @@ function projectStep(step, sequenceIndex) {
|
|
|
65
78
|
targetKind: frozenTarget?.kind ?? null,
|
|
66
79
|
...(step.root?.kind === "map" ? { concurrency: step.root.concurrency } : {}),
|
|
67
80
|
inputs: unit?.inputs ?? [],
|
|
81
|
+
...(orchestration ? { orchestration } : {}),
|
|
68
82
|
environment: (unit?.environment ?? []).map(projectEnvironmentBinding),
|
|
69
83
|
...(inputBindings && inputBindings.length > 0 ? { inputBindings: inputBindings.map(projectInputBinding) } : {}),
|
|
70
84
|
gate: {
|
|
71
85
|
criteria: step.gate.criteria,
|
|
72
86
|
maxLoops: step.gate.maxLoops,
|
|
73
|
-
judgeEngine: step.gate.frozenJudge ? step.gate.frozenJudge.request.
|
|
87
|
+
judgeEngine: step.gate.frozenJudge ? step.gate.frozenJudge.request.target.name : null,
|
|
74
88
|
},
|
|
75
89
|
...(step.outputSchema !== undefined ? { outputSchema: step.outputSchema } : {}),
|
|
76
90
|
expansion: stepExpansion(frozenTarget),
|
|
@@ -102,15 +116,40 @@ function collectLoweringNotices(plan, config) {
|
|
|
102
116
|
}
|
|
103
117
|
return notices;
|
|
104
118
|
}
|
|
119
|
+
/** Every ref the steps' orchestration names that no bundle owns, as `ref (where of step "id")`. */
|
|
120
|
+
function unresolvedRefs(steps, orchestrations) {
|
|
121
|
+
return orchestrations.flatMap((orchestration, index) => (orchestration?.unresolved ?? []).map((missing) => `${missing.ref} (${missing.in} of step "${steps[index]?.stepId}")`));
|
|
122
|
+
}
|
|
123
|
+
/** The unresolved refs of every embedded child plan, recursively, each prefixed with the child workflow it is in. */
|
|
124
|
+
function unresolvedInChildren(plan) {
|
|
125
|
+
return plan.steps.flatMap((step) => {
|
|
126
|
+
const target = stepUnit(step)?.frozenTarget;
|
|
127
|
+
if (target?.kind !== "child-workflow")
|
|
128
|
+
return [];
|
|
129
|
+
const child = target.frozenPlan;
|
|
130
|
+
const own = unresolvedRefs(child.steps, child.steps.map((childStep) => stepOrchestration(childStep, child)));
|
|
131
|
+
return [...own.map((entry) => `${entry} in child ${target.ref}`), ...unresolvedInChildren(child)];
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
function failOnUnresolved(ref, unresolved) {
|
|
135
|
+
if (unresolved.length === 0)
|
|
136
|
+
return;
|
|
137
|
+
throw new NotFoundError(`Workflow ${ref} names asset(s) that no bundle owns: ${unresolved.join(", ")}.`, "FILE_NOT_FOUND");
|
|
138
|
+
}
|
|
105
139
|
/**
|
|
106
140
|
* Compile + freeze `ref` and project the frozen plan into the read-only
|
|
107
141
|
* `akm workflow plan` envelope. Never publishes, never writes, never warns.
|
|
108
142
|
*/
|
|
109
143
|
export async function akmWorkflowPlan(ref) {
|
|
110
144
|
const asset = await loadWorkflowAsset(ref);
|
|
145
|
+
// Resolve what the authored steps name before freezing: a `${ref}`, env ref or child workflow no bundle owns fails the plan.
|
|
146
|
+
const orchestrations = asset.plan.steps.map((step) => stepOrchestration(step, asset.plan));
|
|
147
|
+
failOnUnresolved(asset.ref, unresolvedRefs(asset.plan.steps, orchestrations));
|
|
111
148
|
const config = loadConfig();
|
|
112
149
|
const frozen = await freezeWorkflow(asset, config);
|
|
113
150
|
const plan = frozen.plan;
|
|
151
|
+
// A child workflow's steps exist only once frozen; they fail the plan exactly as the top level's do.
|
|
152
|
+
failOnUnresolved(asset.ref, unresolvedInChildren(plan));
|
|
114
153
|
return {
|
|
115
154
|
ok: true,
|
|
116
155
|
ref: asset.ref,
|
|
@@ -123,7 +162,7 @@ export async function akmWorkflowPlan(ref) {
|
|
|
123
162
|
execution: plan.execution,
|
|
124
163
|
...(plan.budget ? { budget: plan.budget } : {}),
|
|
125
164
|
...(plan.params ? { params: plan.params } : {}),
|
|
126
|
-
steps: plan.steps.map((step, index) => projectStep(step, index)),
|
|
165
|
+
steps: plan.steps.map((step, index) => projectStep(step, index, orchestrations[index])),
|
|
127
166
|
notices: collectLoweringNotices(plan, config),
|
|
128
167
|
warnings: frozen.warnings.map((warning) => warning.message),
|
|
129
168
|
};
|