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
|
@@ -17,6 +17,7 @@ import { assembleAsset } from "../../core/asset/asset-serialize.js";
|
|
|
17
17
|
import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
|
|
18
18
|
import { resolveStashDir, timestampForFilename } from "../../core/common.js";
|
|
19
19
|
import { getImproveProcessConfig, loadConfig } from "../../core/config/config.js";
|
|
20
|
+
import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
|
|
20
21
|
import { ConfigError, UsageError } from "../../core/errors.js";
|
|
21
22
|
import { appendEvent } from "../../core/events.js";
|
|
22
23
|
import { createLockPayload, probeLock, reclaimStaleLock, releaseLock, tryAcquireLockSync, } from "../../core/file-lock.js";
|
|
@@ -25,14 +26,14 @@ import { redactErrorBody } from "../../core/redaction.js";
|
|
|
25
26
|
import { resolveStashStandards } from "../../core/standards/resolve-stash-standards.js";
|
|
26
27
|
import { resolveTypeConventions, typeConventionRef } from "../../core/standards/resolve-type-conventions.js";
|
|
27
28
|
import { getStateDbPath, openStateDatabase } from "../../core/state-db.js";
|
|
28
|
-
import { runStructured } from "../../core/structured.js";
|
|
29
29
|
import { repairTruncatedDescription } from "../../core/text-truncation.js";
|
|
30
30
|
import { DURATION_UNITS, parseDuration } from "../../core/time.js";
|
|
31
31
|
import { warn, warnVerbose } from "../../core/warn.js";
|
|
32
|
+
import { noticeSet } from "../../execution/notices.js";
|
|
32
33
|
import { indexWrittenAssets } from "../../indexer/index-written-assets.js";
|
|
33
|
-
import { assertRunnerCredentials } from "../../integrations/agent/runner-dispatch.js";
|
|
34
34
|
import { getAvailableHarnesses } from "../../integrations/session-logs/index.js";
|
|
35
35
|
import { preFilterSession } from "../../integrations/session-logs/pre-filter.js";
|
|
36
|
+
import { isRefused } from "../../llm/structured.js";
|
|
36
37
|
import { getExtractedSessionsMap, getLastExtractRunAt, shouldSkipAlreadyExtractedSession, upsertExtractedSession, } from "../../storage/repositories/extract-sessions-repository.js";
|
|
37
38
|
import { listImproveLedgerRows } from "../../storage/repositories/improve-ledger-repository.js";
|
|
38
39
|
import { getStateProposal } from "../../storage/repositories/proposals-repository.js";
|
|
@@ -43,7 +44,7 @@ import { buildExtractPrompt, EXTRACT_JSON_SCHEMA, parseExtractPayload, } from ".
|
|
|
43
44
|
import { cloneAndFreeze, resolveImproveStrategy, resolveProcessEnabled } from "./improve-strategies.js";
|
|
44
45
|
import { isLedgerBlocked, ledgerKey, readLedgerDb } from "./ledger.js";
|
|
45
46
|
import { buildSessionSummaryPrompt, parseSessionSummary, SESSION_SUMMARY_JSON_SCHEMA, sessionMeetsDurationGate, writeSessionAsset, } from "./session-asset.js";
|
|
46
|
-
import { callStage,
|
|
47
|
+
import { callStage, callStageLoop, mintProposal } from "./stage.js";
|
|
47
48
|
/** Minimum session duration (minutes) for writing a session asset. */
|
|
48
49
|
const DEFAULT_MIN_SESSION_DURATION_MINUTES = 5;
|
|
49
50
|
/** Raw session size (chars) below which the LLM call is skipped; only truly empty sessions are safe to skip. */
|
|
@@ -114,33 +115,31 @@ function acquireExtractSessionLock(lockPath) {
|
|
|
114
115
|
}
|
|
115
116
|
/** Resolve standalone extract selection once, before discovery, auto iteration or watch startup. */
|
|
116
117
|
export function resolveStandaloneExtractPlan(config, selection) {
|
|
117
|
-
if (selection.engine && selection.strategy) {
|
|
118
|
-
throw new UsageError("--engine and --strategy are mutually exclusive. Pick one.", "INVALID_FLAG_VALUE");
|
|
119
|
-
}
|
|
120
118
|
const selected = resolveImproveStrategy(selection.strategy, config);
|
|
121
119
|
const process = cloneAndFreeze(getImproveProcessConfig("extract", selected.config) ?? {});
|
|
122
120
|
const resolved = resolveImproveExecution({
|
|
123
121
|
config,
|
|
124
|
-
profile: selected.config,
|
|
125
|
-
process,
|
|
126
122
|
current: {
|
|
123
|
+
...(selection.connection ? { connection: selection.connection } : {}),
|
|
124
|
+
...(selection.harness ? { harness: selection.harness } : {}),
|
|
127
125
|
...(selection.engine ? { engine: selection.engine } : {}),
|
|
126
|
+
...(selection.model ? { model: selection.model } : {}),
|
|
128
127
|
...(Object.hasOwn(selection, "timeoutMs") ? { timeoutMs: selection.timeoutMs ?? null } : {}),
|
|
129
128
|
},
|
|
130
129
|
processName: "extract",
|
|
130
|
+
alias: SHIPPED_ALIAS.extract,
|
|
131
131
|
});
|
|
132
132
|
if (!resolved) {
|
|
133
|
-
throw new ConfigError("No
|
|
133
|
+
throw new ConfigError("No connection or harness is configured for extract. Run `akm setup`, pass --connection or --harness, or set improve.connection or improve.processes.extract.connection.", "LLM_NOT_CONFIGURED");
|
|
134
134
|
}
|
|
135
135
|
const runner = resolved.runner;
|
|
136
136
|
return Object.freeze({
|
|
137
137
|
strategy: selected.name,
|
|
138
|
-
engine: runner.
|
|
138
|
+
engine: runner.name,
|
|
139
139
|
// An explicit `akm extract` runs regardless of the strategy's improve-stage toggle.
|
|
140
140
|
enabled: true,
|
|
141
141
|
process,
|
|
142
142
|
runner: cloneAndFreeze(runner),
|
|
143
|
-
timeoutMs: Object.hasOwn(runner, "timeoutMs") ? (runner.timeoutMs ?? null) : 600_000,
|
|
144
143
|
embeddingConfig: cloneAndFreeze(config.embedding),
|
|
145
144
|
...(resolved.notices.length > 0 ? { notices: cloneAndFreeze(resolved.notices) } : {}),
|
|
146
145
|
});
|
|
@@ -168,7 +167,7 @@ function emptyExtractResult(args) {
|
|
|
168
167
|
sessions: [],
|
|
169
168
|
warnings: [args.warning],
|
|
170
169
|
durationMs: Date.now() - args.startMs,
|
|
171
|
-
...(args.llmRunner ? { engine: args.llmRunner.
|
|
170
|
+
...(args.llmRunner ? { engine: args.llmRunner.name, engineKind: args.llmRunner.kind } : {}),
|
|
172
171
|
};
|
|
173
172
|
}
|
|
174
173
|
/**
|
|
@@ -274,11 +273,11 @@ function sessionTriagePasses(data, minScore) {
|
|
|
274
273
|
* `--force` overrides it, even for `--session-id`), the raw-size floor and the
|
|
275
274
|
* triage score. Returns a skip, or what the prompt needs.
|
|
276
275
|
*/
|
|
277
|
-
function runPreLlmSessionGates(harness, sessionRef, prior, force, gates) {
|
|
276
|
+
async function runPreLlmSessionGates(harness, sessionRef, prior, force, gates) {
|
|
278
277
|
const { sessionId } = sessionRef;
|
|
279
278
|
let data;
|
|
280
279
|
try {
|
|
281
|
-
data = harness.readSession(sessionRef);
|
|
280
|
+
data = await harness.readSession(sessionRef);
|
|
282
281
|
}
|
|
283
282
|
catch (err) {
|
|
284
283
|
return {
|
|
@@ -333,7 +332,7 @@ function lockedConcurrentResult(harness, summary) {
|
|
|
333
332
|
* Classify candidates read-only, up to `maxSessionsPerRun` model sessions
|
|
334
333
|
* (explicit `--session-id` and `--force` are uncapped); the rest are deferred.
|
|
335
334
|
*/
|
|
336
|
-
function planExtractSessions(args) {
|
|
335
|
+
async function planExtractSessions(args) {
|
|
337
336
|
const { candidates, options, harness, maxSessionsPerRun, locking } = args;
|
|
338
337
|
const lockUnavailable = (summary) => locking &&
|
|
339
338
|
extractSessionLockIsUnavailable(harness.name, summary.sessionId, options.stateDbPath ?? getStateDbPath());
|
|
@@ -351,7 +350,7 @@ function planExtractSessions(args) {
|
|
|
351
350
|
continue;
|
|
352
351
|
}
|
|
353
352
|
const prior = args.seenMap.get(summary.sessionId);
|
|
354
|
-
const gate = runPreLlmSessionGates(harness, summary, prior, options.force === true, args.gates);
|
|
353
|
+
const gate = await runPreLlmSessionGates(harness, summary, prior, options.force === true, args.gates);
|
|
355
354
|
if ("skip" in gate) {
|
|
356
355
|
plans.push({ kind: "skip", summary, result: gate.skip });
|
|
357
356
|
continue;
|
|
@@ -366,58 +365,40 @@ function planExtractSessions(args) {
|
|
|
366
365
|
}
|
|
367
366
|
return { plans, deferredCandidates: [] };
|
|
368
367
|
}
|
|
369
|
-
const EXTRACT_LLM_UNAVAILABLE = Symbol("extract-llm-unavailable");
|
|
370
368
|
/**
|
|
371
369
|
* One session's extraction call, with one corrective retry; configuration
|
|
372
370
|
* errors escape before any state is written.
|
|
373
371
|
*/
|
|
374
372
|
async function extractFromSession(run, prompt) {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
if (result.ok)
|
|
405
|
-
return { kind: "success", payload: result.value, attempts: result.attempts };
|
|
406
|
-
return {
|
|
407
|
-
kind: "malformed",
|
|
408
|
-
raw: result.raw,
|
|
409
|
-
attempts: result.attempts,
|
|
410
|
-
failure: parseExtractPayload(result.raw).parseFailure ?? {
|
|
411
|
-
code: "invalid_payload",
|
|
412
|
-
message: result.errors.join("; "),
|
|
413
|
-
},
|
|
414
|
-
};
|
|
415
|
-
}
|
|
416
|
-
catch (err) {
|
|
417
|
-
if (err === EXTRACT_LLM_UNAVAILABLE)
|
|
418
|
-
return { kind: "unavailable" };
|
|
419
|
-
throw err;
|
|
420
|
-
}
|
|
373
|
+
// This loop parses and repairs the reply itself, so each attempt is one unvalidated dispatch.
|
|
374
|
+
const result = await callStageLoop({
|
|
375
|
+
runner: run.llmRunner,
|
|
376
|
+
prompt,
|
|
377
|
+
request: {
|
|
378
|
+
responseSchema: EXTRACT_JSON_SCHEMA,
|
|
379
|
+
...(run.options.signal ? { signal: run.options.signal } : {}),
|
|
380
|
+
...(run.options.chat ? { chat: run.options.chat } : {}),
|
|
381
|
+
},
|
|
382
|
+
onNotices: run.notices.add,
|
|
383
|
+
}, (raw) => {
|
|
384
|
+
const payload = parseExtractPayload(raw);
|
|
385
|
+
return payload.parseFailure
|
|
386
|
+
? { ok: false, errors: [payload.parseFailure.message] }
|
|
387
|
+
: { ok: true, value: payload };
|
|
388
|
+
}, () => "## Corrective output instruction\n\nYour previous response did not contain a valid extraction payload. Respond with ONLY a JSON object matching the requested schema, with a candidates array and no prose or code fences.");
|
|
389
|
+
if (result.ok)
|
|
390
|
+
return { kind: "success", payload: result.value, attempts: result.attempts };
|
|
391
|
+
if (!isRefused(result))
|
|
392
|
+
return { kind: "unavailable" };
|
|
393
|
+
return {
|
|
394
|
+
kind: "malformed",
|
|
395
|
+
raw: result.raw,
|
|
396
|
+
attempts: result.attempts,
|
|
397
|
+
failure: parseExtractPayload(result.raw).parseFailure ?? {
|
|
398
|
+
code: "invalid_payload",
|
|
399
|
+
message: result.errors.join("; "),
|
|
400
|
+
},
|
|
401
|
+
};
|
|
421
402
|
}
|
|
422
403
|
/**
|
|
423
404
|
* Write the session's searchable asset (`sessions/<harness>/<id>.md`). Fails
|
|
@@ -630,7 +611,7 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
|
|
|
630
611
|
deferred: 0,
|
|
631
612
|
};
|
|
632
613
|
const account = (result) => {
|
|
633
|
-
const stamped = { ...result, engine: run.llmRunner.
|
|
614
|
+
const stamped = { ...result, engine: run.llmRunner.name };
|
|
634
615
|
tally.sessions.push(stamped);
|
|
635
616
|
const preempted = ["read_failed", "too_short", "already_extracted", "locked_concurrent"].includes(result.skipReason ?? "");
|
|
636
617
|
if (gates.triage.enabled && !preempted) {
|
|
@@ -652,10 +633,10 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
|
|
|
652
633
|
};
|
|
653
634
|
const workPlans = [...planned.plans];
|
|
654
635
|
let remaining = planned.deferredCandidates;
|
|
655
|
-
const refillModelSlot = () => {
|
|
636
|
+
const refillModelSlot = async () => {
|
|
656
637
|
if (remaining.length === 0 || options.signal?.aborted)
|
|
657
638
|
return;
|
|
658
|
-
const refill = planExtractSessions({
|
|
639
|
+
const refill = await planExtractSessions({
|
|
659
640
|
candidates: remaining,
|
|
660
641
|
options,
|
|
661
642
|
harness,
|
|
@@ -680,7 +661,7 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
|
|
|
680
661
|
const lock = acquireExtractSessionLock(extractSessionLockPath(harness.name, summary.sessionId, options.stateDbPath ?? getStateDbPath()));
|
|
681
662
|
if (!lock.proceed) {
|
|
682
663
|
account(lockedConcurrentResult(harness.name, summary));
|
|
683
|
-
refillModelSlot();
|
|
664
|
+
await refillModelSlot();
|
|
684
665
|
continue;
|
|
685
666
|
}
|
|
686
667
|
lockOwnership = lock.ownership;
|
|
@@ -689,10 +670,10 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
|
|
|
689
670
|
const prior = stateDb
|
|
690
671
|
? getExtractedSessionsMap(stateDb, harness.name, [summary.sessionId]).get(summary.sessionId)
|
|
691
672
|
: seenMap.get(summary.sessionId);
|
|
692
|
-
const gate = runPreLlmSessionGates(harness, summary, prior, options.force === true, gates);
|
|
673
|
+
const gate = await runPreLlmSessionGates(harness, summary, prior, options.force === true, gates);
|
|
693
674
|
if ("skip" in gate) {
|
|
694
675
|
accountAndRecord(summary, gate.skip);
|
|
695
|
-
refillModelSlot();
|
|
676
|
+
await refillModelSlot();
|
|
696
677
|
continue;
|
|
697
678
|
}
|
|
698
679
|
const result = await processSession(run, summary, gate);
|
|
@@ -775,8 +756,8 @@ function recordSessionOutcome(stateDb, enabled, harness, summary, result, source
|
|
|
775
756
|
warn(`[extract] failed to record session ${summary.sessionId} in state.db: ${err instanceof Error ? err.message : String(err)}`);
|
|
776
757
|
}
|
|
777
758
|
}
|
|
778
|
-
/** The run's runner, budgets, gates and session-indexing settings (throws without
|
|
779
|
-
function resolveExtractRun(options, config, process
|
|
759
|
+
/** The run's runner, budgets, gates and session-indexing settings (throws without a connection or harness). */
|
|
760
|
+
function resolveExtractRun(options, config, process) {
|
|
780
761
|
const notices = noticeSet();
|
|
781
762
|
let llmRunner;
|
|
782
763
|
if (options.resolvedPlan) {
|
|
@@ -787,32 +768,22 @@ function resolveExtractRun(options, config, process, activeProfile) {
|
|
|
787
768
|
llmRunner = options.llmRunner;
|
|
788
769
|
}
|
|
789
770
|
else {
|
|
790
|
-
const resolved = resolveImproveExecution({ config,
|
|
771
|
+
const resolved = resolveImproveExecution({ config, processName: "extract", alias: SHIPPED_ALIAS.extract });
|
|
791
772
|
llmRunner = resolved?.runner;
|
|
792
773
|
if (resolved)
|
|
793
774
|
notices.add(resolved.notices);
|
|
794
775
|
}
|
|
795
776
|
if (!llmRunner) {
|
|
796
|
-
throw new ConfigError("No
|
|
777
|
+
throw new ConfigError("No connection or harness is configured for extract. Run `akm setup`, or set improve.connection or improve.processes.extract.connection.", "LLM_NOT_CONFIGURED");
|
|
797
778
|
}
|
|
798
779
|
const runner = llmRunner;
|
|
799
|
-
const timeoutMs = options.resolvedPlan
|
|
800
|
-
? options.resolvedPlan.timeoutMs
|
|
801
|
-
: Object.hasOwn(options, "timeoutMs")
|
|
802
|
-
? (options.timeoutMs ?? null)
|
|
803
|
-
: Object.hasOwn(runner, "timeoutMs")
|
|
804
|
-
? (runner.timeoutMs ?? null)
|
|
805
|
-
: 600_000;
|
|
806
780
|
const triage = process?.triage;
|
|
807
781
|
// The default summary generator fails open: no summary, no session asset.
|
|
808
782
|
const generate = async (data) => {
|
|
809
783
|
const outcome = await callStage({
|
|
810
|
-
feature: "session_extraction",
|
|
811
784
|
runner,
|
|
812
785
|
prompt: buildSessionSummaryPrompt(data),
|
|
813
|
-
gate: { config },
|
|
814
786
|
request: {
|
|
815
|
-
timeoutMs,
|
|
816
787
|
responseSchema: SESSION_SUMMARY_JSON_SCHEMA,
|
|
817
788
|
...(options.signal ? { signal: options.signal } : {}),
|
|
818
789
|
...(options.chat ? { chat: options.chat } : {}),
|
|
@@ -825,7 +796,6 @@ function resolveExtractRun(options, config, process, activeProfile) {
|
|
|
825
796
|
return {
|
|
826
797
|
llmRunner: runner,
|
|
827
798
|
notices,
|
|
828
|
-
timeoutMs,
|
|
829
799
|
gates: {
|
|
830
800
|
maxTotalChars: typeof process?.maxTotalChars === "number" ? process.maxTotalChars : undefined,
|
|
831
801
|
minContentChars: typeof process?.minContentChars === "number" ? process.minContentChars : DEFAULT_MIN_CONTENT_CHARS,
|
|
@@ -850,10 +820,10 @@ function resolveExtractRun(options, config, process, activeProfile) {
|
|
|
850
820
|
};
|
|
851
821
|
}
|
|
852
822
|
/** The sessions to process: the `--session-id` target (or a not-found envelope) or the discovery window. */
|
|
853
|
-
function discoverExtractCandidates(options, harness, effectiveSince, startMs, dryRun, llmRunner) {
|
|
823
|
+
async function discoverExtractCandidates(options, harness, effectiveSince, startMs, dryRun, llmRunner) {
|
|
854
824
|
const location = options.location ? { location: options.location } : {};
|
|
855
825
|
if (options.sessionId) {
|
|
856
|
-
const target = harness.listSessions(location).find((s) => s.sessionId === options.sessionId);
|
|
826
|
+
const target = (await harness.listSessions(location)).find((s) => s.sessionId === options.sessionId);
|
|
857
827
|
if (target)
|
|
858
828
|
return { candidates: [target] };
|
|
859
829
|
return {
|
|
@@ -874,7 +844,7 @@ function discoverExtractCandidates(options, harness, effectiveSince, startMs, dr
|
|
|
874
844
|
...(options.stateDbPath ? { stateDbPath: options.stateDbPath } : {}),
|
|
875
845
|
...(options.skipTracking ? { skipTracking: options.skipTracking } : {}),
|
|
876
846
|
});
|
|
877
|
-
return { candidates: harness.listSessions({ sinceMs, ...location }) };
|
|
847
|
+
return { candidates: await harness.listSessions({ sinceMs, ...location }) };
|
|
878
848
|
}
|
|
879
849
|
function loadSeenMapReadOnly(options, harness, candidates, warnings) {
|
|
880
850
|
if (options.skipTracking === true || candidates.length === 0)
|
|
@@ -922,7 +892,7 @@ export async function akmExtract(options) {
|
|
|
922
892
|
startMs,
|
|
923
893
|
});
|
|
924
894
|
}
|
|
925
|
-
const resolved = resolveExtractRun(options, config, process
|
|
895
|
+
const resolved = resolveExtractRun(options, config, process);
|
|
926
896
|
const { llmRunner, notices } = resolved;
|
|
927
897
|
const harness = (options.harnesses ?? getAvailableHarnesses()).find((h) => h.name === options.type);
|
|
928
898
|
const unavailable = !harness
|
|
@@ -940,13 +910,13 @@ export async function akmExtract(options) {
|
|
|
940
910
|
llmRunner,
|
|
941
911
|
});
|
|
942
912
|
}
|
|
943
|
-
const discovery = discoverExtractCandidates(options, harness, resolved.effectiveSince, startMs, dryRun, llmRunner);
|
|
913
|
+
const discovery = await discoverExtractCandidates(options, harness, resolved.effectiveSince, startMs, dryRun, llmRunner);
|
|
944
914
|
if ("notFound" in discovery)
|
|
945
915
|
return discovery.notFound;
|
|
946
916
|
const topLevelWarnings = [];
|
|
947
917
|
const tracking = options.skipTracking !== true;
|
|
948
918
|
const seenMap = loadSeenMapReadOnly(options, harness.name, discovery.candidates, topLevelWarnings);
|
|
949
|
-
const planned = planExtractSessions({
|
|
919
|
+
const planned = await planExtractSessions({
|
|
950
920
|
candidates: discovery.candidates,
|
|
951
921
|
options,
|
|
952
922
|
harness,
|
|
@@ -956,9 +926,6 @@ export async function akmExtract(options) {
|
|
|
956
926
|
locking: tracking && !dryRun && !options.stateDb,
|
|
957
927
|
});
|
|
958
928
|
const modelPlanCount = planned.plans.filter((plan) => plan.kind === "model").length;
|
|
959
|
-
// Credentials are materialized once, after every read-only gate and before live state or a lock.
|
|
960
|
-
if (modelPlanCount > 0)
|
|
961
|
-
assertRunnerCredentials(llmRunner);
|
|
962
929
|
let stateDb;
|
|
963
930
|
let tally;
|
|
964
931
|
try {
|
|
@@ -1011,7 +978,7 @@ export async function akmExtract(options) {
|
|
|
1011
978
|
for (const reason of EXTRACT_INFRASTRUCTURE_SKIP_REASONS) {
|
|
1012
979
|
const n = counts[reason];
|
|
1013
980
|
if (n)
|
|
1014
|
-
topLevelWarnings.push(`${n} of ${tally.sessions.length} sessions skipped: ${reason} (engine "${llmRunner.
|
|
981
|
+
topLevelWarnings.push(`${n} of ${tally.sessions.length} sessions skipped: ${reason} (engine "${llmRunner.name}")`);
|
|
1015
982
|
}
|
|
1016
983
|
if (modelPlanCount > 0 && resolved.gates.triage.enabled && tally.triageEvaluated > 0) {
|
|
1017
984
|
appendEvent({
|
|
@@ -1039,7 +1006,7 @@ export async function akmExtract(options) {
|
|
|
1039
1006
|
durationMs: Date.now() - startMs,
|
|
1040
1007
|
...notices.fields(),
|
|
1041
1008
|
...(Object.keys(counts).length > 0 ? { skipReasons: counts } : {}),
|
|
1042
|
-
engine: llmRunner.
|
|
1009
|
+
engine: llmRunner.name,
|
|
1043
1010
|
engineKind: llmRunner.kind,
|
|
1044
1011
|
};
|
|
1045
1012
|
}
|
|
@@ -1049,7 +1016,7 @@ export async function akmExtract(options) {
|
|
|
1049
1016
|
* so a session counts as new when it has no seen row or a row without a
|
|
1050
1017
|
* content hash; the exact hash check happens at extraction.
|
|
1051
1018
|
*/
|
|
1052
|
-
export function countNewExtractCandidates(_config, options = {}) {
|
|
1019
|
+
export async function countNewExtractCandidates(_config, options = {}) {
|
|
1053
1020
|
const effectiveSince = options.since ?? getImproveProcessConfig("extract", options.improveProfile)?.defaultSince;
|
|
1054
1021
|
const explicitSinceMs = effectiveSince ? parseSinceArg(effectiveSince) : undefined;
|
|
1055
1022
|
const harnesses = (options.harnesses ?? getAvailableHarnesses()).filter((h) => h.isAvailable());
|
|
@@ -1064,7 +1031,10 @@ export function countNewExtractCandidates(_config, options = {}) {
|
|
|
1064
1031
|
...(options.stateDbPath ? { stateDbPath: options.stateDbPath } : {}),
|
|
1065
1032
|
...(options.readOnly && !options.stateDb ? { skipTracking: true } : {}),
|
|
1066
1033
|
});
|
|
1067
|
-
const candidates = harness.listSessions({
|
|
1034
|
+
const candidates = await harness.listSessions({
|
|
1035
|
+
sinceMs,
|
|
1036
|
+
...(options.readOnly ? { isolatedSnapshot: true } : {}),
|
|
1037
|
+
});
|
|
1068
1038
|
if (candidates.length === 0)
|
|
1069
1039
|
continue;
|
|
1070
1040
|
// A dry planner without state.db has no seen-session ledger by definition.
|
|
@@ -4,20 +4,17 @@
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
import { findCittyTopLevelCommandIndex, getStringArg, hasSubcommand, parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
7
|
+
import { SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
|
|
7
8
|
import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
|
|
8
9
|
import { isFullRefInput, parseRefInput } from "../../core/asset/resolve-ref.js";
|
|
9
10
|
import { loadConfig } from "../../core/config/config.js";
|
|
11
|
+
import { collectCredentialValues } from "../../core/config/credentials.js";
|
|
10
12
|
import { ConfigError, UsageError } from "../../core/errors.js";
|
|
11
13
|
import { resolveMutationTarget } from "../../core/mutation-target.js";
|
|
12
14
|
import { getRunLogDir } from "../../core/paths.js";
|
|
13
15
|
import { redactSensitiveText } from "../../core/redaction.js";
|
|
14
|
-
import { clearLogFile, setLogFile } from "../../core/warn.js";
|
|
16
|
+
import { clearLogFile, setLogFile, warnOnce } from "../../core/warn.js";
|
|
15
17
|
import { resolveWriteTarget } from "../../core/write-source.js";
|
|
16
|
-
import { DEFAULT_LLM_TIMEOUT_MS } from "../../integrations/agent/config.js";
|
|
17
|
-
import { defaultWhich } from "../../integrations/agent/detect.js";
|
|
18
|
-
import { collectEngineCredentialValues, materializeLlmConnection, } from "../../integrations/agent/engine-resolution.js";
|
|
19
|
-
import { llmUseFromRunner, sdkFallbackUseFromRunner } from "../../integrations/agent/runner.js";
|
|
20
|
-
import { probeLlmReachable } from "../../llm/client.js";
|
|
21
18
|
import { getOutputMode } from "../../output/context.js";
|
|
22
19
|
import { deliverRendered } from "../../output/html-render.js";
|
|
23
20
|
import { readStdin } from "../../runtime.js";
|
|
@@ -25,7 +22,7 @@ import { akmImprove, IMPROVE_TARGET_FLAG, resolveImproveReadSource } from "./imp
|
|
|
25
22
|
import { runImproveReportQuery } from "./improve-report.js";
|
|
26
23
|
import { buildImproveRunId, recordImproveRunResult, recordTerminatedImproveRun, } from "./improve-result-file.js";
|
|
27
24
|
import { runImproveSession } from "./improve-session.js";
|
|
28
|
-
import { resolveImprovePlan, resolveImproveStrategy
|
|
25
|
+
import { resolveImprovePlan, resolveImproveStrategy } from "./improve-strategies.js";
|
|
29
26
|
import { formatUsageReportTable } from "./improve-usage-report.js";
|
|
30
27
|
import { renderReflectPromptPreview } from "./reflect.js";
|
|
31
28
|
import { resolveQualityGateJudge, runReflectQualityJudge } from "./stage.js";
|
|
@@ -34,109 +31,6 @@ let akmImproveForRun = akmImprove;
|
|
|
34
31
|
export function _setAkmImproveForTests(fake) {
|
|
35
32
|
akmImproveForRun = fake ?? akmImprove;
|
|
36
33
|
}
|
|
37
|
-
/**
|
|
38
|
-
* `--require-engines` (#957): fail before any side effect when an enabled
|
|
39
|
-
* process cannot run, naming what each is missing — a scheduled run would
|
|
40
|
-
* rather fail loudly than index and then skip everything.
|
|
41
|
-
*/
|
|
42
|
-
function assertRequiredEnginesAvailable(plan) {
|
|
43
|
-
if (plan.engineUnavailable.length === 0)
|
|
44
|
-
return;
|
|
45
|
-
const lines = plan.engineUnavailable.map((item) => ` - ${item.process} (${item.configKey}): ${item.reason}`);
|
|
46
|
-
throw new ConfigError(`--require-engines: ${plan.engineUnavailable.length} improve process${plan.engineUnavailable.length === 1 ? "" : "es"} cannot run because ${plan.engineUnavailable.length === 1 ? "its" : "their"} engine is unavailable:\n${lines.join("\n")}`, "LLM_NOT_CONFIGURED");
|
|
47
|
-
}
|
|
48
|
-
/** Every engine the plan would dispatch to, triage's judgment engine included. */
|
|
49
|
-
function collectRequiredEngineTargets(plan) {
|
|
50
|
-
const runners = Object.entries(plan.processes)
|
|
51
|
-
.flatMap(([processName, process]) => (process.runner ? [[processName, process.runner]] : []))
|
|
52
|
-
.concat(plan.triageJudgment ? [["triage.judgment", plan.triageJudgment]] : []);
|
|
53
|
-
return runners.map(([processName, runner]) => {
|
|
54
|
-
// The runner's own timeout, else the connection's (sdkFallbackUseFromRunner already does this).
|
|
55
|
-
const use = runner.kind === "llm"
|
|
56
|
-
? {
|
|
57
|
-
...llmUseFromRunner(runner),
|
|
58
|
-
timeoutMs: runner.timeoutMs !== undefined ? runner.timeoutMs : (runner.connection.timeoutMs ?? null),
|
|
59
|
-
}
|
|
60
|
-
: runner.kind === "sdk"
|
|
61
|
-
? sdkFallbackUseFromRunner(runner)
|
|
62
|
-
: undefined;
|
|
63
|
-
return {
|
|
64
|
-
process: processName,
|
|
65
|
-
engine: runner.engine,
|
|
66
|
-
...(runner.kind === "llm" ? {} : { bin: runner.profile.bin }),
|
|
67
|
-
...(use ? probeConnection(use) : {}),
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* The connection the probe sends, built as a dispatch builds it: the runner
|
|
73
|
-
* keeps its credential symbolic, so the key is read and injected here, or the
|
|
74
|
-
* probe would go out without one.
|
|
75
|
-
*/
|
|
76
|
-
function probeConnection(use) {
|
|
77
|
-
try {
|
|
78
|
-
return { connection: materializeLlmConnection(use) };
|
|
79
|
-
}
|
|
80
|
-
catch (err) {
|
|
81
|
-
return { connection: use.connection, error: err instanceof Error ? err.message : String(err) };
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* The bound on `--require-engines`' probe: the connection's own request
|
|
86
|
-
* timeout, at most two minutes. A local server busy with another job queues
|
|
87
|
-
* the probe behind that job, and a fixed 3s bound failed every scheduled
|
|
88
|
-
* improve run on 2026-09-27 against a reachable endpoint; the cap still ends a
|
|
89
|
-
* hung endpoint (#957) long before a run's own multi-minute calls would.
|
|
90
|
-
*/
|
|
91
|
-
export function requiredEngineProbeTimeoutMs(connection) {
|
|
92
|
-
return Math.min(connection.timeoutMs ?? DEFAULT_LLM_TIMEOUT_MS, REQUIRED_ENGINE_PROBE_MAX_MS);
|
|
93
|
-
}
|
|
94
|
-
const REQUIRED_ENGINE_PROBE_MAX_MS = 120_000;
|
|
95
|
-
/**
|
|
96
|
-
* `--require-engines`, live: probe each connection's real completion path
|
|
97
|
-
* (a gateway can list a model whose completion route is dead, #980), once per
|
|
98
|
-
* endpoint + model, within {@link requiredEngineProbeTimeoutMs}, and look each
|
|
99
|
-
* agent harness's binary up on PATH. Returns each target's latency for the run
|
|
100
|
-
* result (R17); an unreachable one fails the run.
|
|
101
|
-
*/
|
|
102
|
-
export async function assertRequiredEnginesReachable(plan, probeReachable = (connection) => probeLlmReachable(connection, requiredEngineProbeTimeoutMs(connection)), which = defaultWhich) {
|
|
103
|
-
const targets = collectRequiredEngineTargets(plan);
|
|
104
|
-
if (targets.length === 0)
|
|
105
|
-
return [];
|
|
106
|
-
const probesByConnection = new Map();
|
|
107
|
-
const probeConnectionOnce = (connection) => {
|
|
108
|
-
const key = `${connection.endpoint.replace(/\/+$/, "")}|${connection.model}`;
|
|
109
|
-
let pending = probesByConnection.get(key);
|
|
110
|
-
if (!pending) {
|
|
111
|
-
const probeStartedAt = Date.now();
|
|
112
|
-
pending = probeReachable(connection).then((reach) => ({ reach, latencyMs: Date.now() - probeStartedAt }));
|
|
113
|
-
probesByConnection.set(key, pending);
|
|
114
|
-
}
|
|
115
|
-
return pending;
|
|
116
|
-
};
|
|
117
|
-
const probed = await Promise.all(targets.map(async (target) => {
|
|
118
|
-
if (target.bin !== undefined && which(target.bin) === undefined) {
|
|
119
|
-
return { ...target, reach: { reachable: false, error: `${target.bin} is not on PATH` }, latencyMs: 0 };
|
|
120
|
-
}
|
|
121
|
-
if (!target.connection)
|
|
122
|
-
return { ...target, reach: { reachable: true }, latencyMs: 0 };
|
|
123
|
-
if (target.error)
|
|
124
|
-
return { ...target, reach: { reachable: false, error: target.error }, latencyMs: 0 };
|
|
125
|
-
return { ...target, ...(await probeConnectionOnce(target.connection)) };
|
|
126
|
-
}));
|
|
127
|
-
const unreachable = probed.filter((item) => !item.reach.reachable);
|
|
128
|
-
if (unreachable.length > 0) {
|
|
129
|
-
const lines = unreachable.map((item) => ` - ${item.process} (engine "${item.engine}", ${item.connection?.endpoint ?? item.bin}): ${item.reach.error ?? "did not respond"}`);
|
|
130
|
-
throw new ConfigError(`--require-engines: ${unreachable.length} improve process${unreachable.length === 1 ? "" : "es"} cannot run because ${unreachable.length === 1 ? "its" : "their"} engine completion path is not reachable:\n${lines.join("\n")}`, "LLM_NOT_CONFIGURED", "Check that each listed endpoint is up and serves its model, and that each listed agent binary is installed. The endpoint probe is one short completion, bounded by the engine's timeoutMs (at most two minutes).");
|
|
131
|
-
}
|
|
132
|
-
return probed.map((item) => ({
|
|
133
|
-
process: item.process,
|
|
134
|
-
engine: item.engine,
|
|
135
|
-
endpoint: item.connection?.endpoint ?? item.bin,
|
|
136
|
-
reachable: item.reach.reachable,
|
|
137
|
-
latencyMs: item.latencyMs,
|
|
138
|
-
}));
|
|
139
|
-
}
|
|
140
34
|
/** `--show-prompt` (#952): print reflect's composed prompt for one ref — no lock, write or dispatch. */
|
|
141
35
|
async function runShowPromptCli(refArg, parsedRef, taskArg, targetArg, resolvedPlan) {
|
|
142
36
|
const readSource = resolveImproveReadSource(resolvedPlan.config, parsedRef, targetArg);
|
|
@@ -145,6 +39,9 @@ async function runShowPromptCli(refArg, parsedRef, taskArg, targetArg, resolvedP
|
|
|
145
39
|
...(taskArg ? { task: taskArg } : {}),
|
|
146
40
|
improveProfile: resolvedPlan.strategy.config,
|
|
147
41
|
config: resolvedPlan.config,
|
|
42
|
+
// A strategy that turns reflect off froze no runner for it; the preview resolves its own.
|
|
43
|
+
...(resolvedPlan.processes.reflect.runner ? { llmRunner: resolvedPlan.processes.reflect.runner } : {}),
|
|
44
|
+
...(resolvedPlan.run ? { run: resolvedPlan.run } : {}),
|
|
148
45
|
stashDir: readSource.source.path,
|
|
149
46
|
});
|
|
150
47
|
const outputMode = getOutputMode();
|
|
@@ -184,7 +81,7 @@ const improveReportCommand = defineJsonCommand({
|
|
|
184
81
|
});
|
|
185
82
|
/**
|
|
186
83
|
* `akm improve judge`: reflect's quality judge on one revision, read as
|
|
187
|
-
* `{"source", "candidate", "feedback"}` JSON from stdin,
|
|
84
|
+
* `{"source", "candidate", "feedback"}` JSON from stdin, on the connection or harness the
|
|
188
85
|
* strategy's reflect quality gate names. It writes nothing.
|
|
189
86
|
*/
|
|
190
87
|
const improveJudgeCommand = defineJsonCommand({
|
|
@@ -209,7 +106,7 @@ const improveJudgeCommand = defineJsonCommand({
|
|
|
209
106
|
const config = loadConfig();
|
|
210
107
|
const judge = resolveQualityGateJudge(config, resolveImproveStrategy(getStringArg(args, "strategy"), config).config, "reflect");
|
|
211
108
|
if (!judge) {
|
|
212
|
-
throw new ConfigError("`akm improve judge` judges with the reflect quality gate's
|
|
109
|
+
throw new ConfigError("`akm improve judge` judges with the reflect quality gate's connection or harness. Set improve.qualityGate.connection.", "INVALID_CONFIG_FILE");
|
|
213
110
|
}
|
|
214
111
|
const notes = typeof feedback === "string" && feedback.trim() !== "" ? [feedback.trim()] : [];
|
|
215
112
|
const verdict = await runReflectQualityJudge(config, candidate, source, notes, undefined, {
|
|
@@ -217,7 +114,7 @@ const improveJudgeCommand = defineJsonCommand({
|
|
|
217
114
|
llmRunner: judge,
|
|
218
115
|
...(typeof ref === "string" && ref ? { ref } : {}),
|
|
219
116
|
});
|
|
220
|
-
output("improve-judge", { engine: judge.
|
|
117
|
+
output("improve-judge", { engine: judge.name, ...verdict });
|
|
221
118
|
},
|
|
222
119
|
});
|
|
223
120
|
/** The subcommands `setup` withheld for this run, restored by `cleanup` (one command runs per process; in-process tests run many). */
|
|
@@ -282,20 +179,18 @@ export const improveCommand = defineCommand({
|
|
|
282
179
|
description: "If another improve run already holds the lock, skip gracefully (exit 0) instead of failing with 'already running' (exit 75). Use for high-frequency scheduled runs so they don't pile up failures while a longer run is in progress.",
|
|
283
180
|
default: false,
|
|
284
181
|
},
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
description: "Abort before any indexing, lock, or log side effect (exit 78) if the active strategy would enable a process whose engine or credential cannot be resolved in this process's environment, OR whose endpoint fails a bounded reachability probe (the same probe akm health runs). Without this flag, improve degrades gracefully instead: it skips the affected processes and reports them in the result's skippedProcesses. Recommended alongside --skip-if-locked for scheduled runs.",
|
|
288
|
-
default: false,
|
|
289
|
-
},
|
|
182
|
+
// Retired: a run already stops at planning (exit 78) when no process has a connection or harness to run on.
|
|
183
|
+
"require-engines": { type: "boolean", hidden: true, description: "Retired: has no effect." },
|
|
290
184
|
"show-prompt": {
|
|
291
185
|
type: "boolean",
|
|
292
|
-
description: "Print the composed reflect prompt for one asset ref and exit — no lock, index write, or
|
|
186
|
+
description: "Print the composed reflect prompt for one asset ref and exit — no lock, index write, or model call (#952). Requires a fully-qualified asset ref as the scope positional (e.g. `akm improve lessons/my-lesson --show-prompt`). JSON/yaml format carries the prompt as a `prompt` field; text format prints it directly.",
|
|
293
187
|
default: false,
|
|
294
188
|
},
|
|
295
189
|
strategy: {
|
|
296
190
|
type: "string",
|
|
297
|
-
description: "Named improve strategy from improve.strategies or built-in strategies (consolidate, default). Controls which sub-processes run and which asset types are processed.",
|
|
191
|
+
description: "Named improve strategy from improve.strategies or built-in strategies (consolidate, default). Controls which sub-processes run and which asset types are processed, never where they run.",
|
|
298
192
|
},
|
|
193
|
+
...SELECTION_ARGS,
|
|
299
194
|
sync: {
|
|
300
195
|
type: "boolean",
|
|
301
196
|
description: "Sync the git-backed primary bundle like `akm sync` (fetch and merge the upstream, commit, push) before the run, and commit (and optionally push) when it finishes. Use --no-sync to disable. Default: on for git-backed bundles (per profile config).",
|
|
@@ -310,6 +205,9 @@ export const improveCommand = defineCommand({
|
|
|
310
205
|
// citty runs this body after a subcommand it dispatched too.
|
|
311
206
|
if (hasSubcommand(args, new Set(Object.keys(IMPROVE_SUBCOMMANDS))))
|
|
312
207
|
return;
|
|
208
|
+
if (args["require-engines"]) {
|
|
209
|
+
warnOnce("retired-flag:--require-engines", "--require-engines is retired and has no effect: akm improve already stops at planning (exit 78) when no process has a connection or harness to run on, and `akm health` checks the connections and harnesses.");
|
|
210
|
+
}
|
|
313
211
|
const jsonToStdout = args["json-to-stdout"];
|
|
314
212
|
const targetArg = getStringArg(args, "bundle");
|
|
315
213
|
const taskArg = getStringArg(args, "task");
|
|
@@ -320,6 +218,8 @@ export const improveCommand = defineCommand({
|
|
|
320
218
|
const requireFeedbackSignal = args["require-feedback-signal"];
|
|
321
219
|
const skipIfLocked = args["skip-if-locked"];
|
|
322
220
|
const strategyArg = getStringArg(args, "strategy");
|
|
221
|
+
// What the run selected is the nearest layer of every call in it, judges included.
|
|
222
|
+
const run = selectionFromArgs(args);
|
|
323
223
|
const effectiveConfig = loadConfig();
|
|
324
224
|
const scopeArg = getStringArg(args, "scope");
|
|
325
225
|
const scopeRef = scopeArg && isFullRefInput(scopeArg) ? parseRefInput(scopeArg) : undefined;
|
|
@@ -330,7 +230,7 @@ export const improveCommand = defineCommand({
|
|
|
330
230
|
: resolveWriteTarget(effectiveConfig, targetArg, { flag: IMPROVE_TARGET_FLAG });
|
|
331
231
|
// Every model-backed process resolves before any side effect; a dry run
|
|
332
232
|
// never dispatches, so it tolerates every process being disabled.
|
|
333
|
-
const resolvedPlan = resolveImprovePlan(strategyArg, effectiveConfig, {
|
|
233
|
+
const resolvedPlan = resolveImprovePlan(strategyArg, effectiveConfig, Object.keys(run).length > 0 ? { run } : {});
|
|
334
234
|
if (args["show-prompt"]) {
|
|
335
235
|
if (!scopeArg || !scopeRef) {
|
|
336
236
|
throw new UsageError("`--show-prompt` requires a fully-qualified asset ref as the scope (e.g. `akm improve lessons/my-lesson --show-prompt`).", "INVALID_FLAG_VALUE");
|
|
@@ -338,13 +238,8 @@ export const improveCommand = defineCommand({
|
|
|
338
238
|
await runShowPromptCli(scopeArg, scopeRef, taskArg, targetArg, resolvedPlan);
|
|
339
239
|
return;
|
|
340
240
|
}
|
|
341
|
-
let engineProbe;
|
|
342
|
-
if (args["require-engines"]) {
|
|
343
|
-
assertRequiredEnginesAvailable(resolvedPlan);
|
|
344
|
-
engineProbe = await assertRequiredEnginesReachable(resolvedPlan);
|
|
345
|
-
}
|
|
346
241
|
const selectedStrategyName = resolvedPlan.strategy.name;
|
|
347
|
-
const sensitiveValues =
|
|
242
|
+
const sensitiveValues = collectCredentialValues(effectiveConfig);
|
|
348
243
|
// Only flags actually passed override the strategy's `sync` block.
|
|
349
244
|
const syncFlag = args.sync;
|
|
350
245
|
const pushFlag = args.push;
|
|
@@ -403,7 +298,6 @@ export const improveCommand = defineCommand({
|
|
|
403
298
|
...(requireFeedbackSignal ? { requireFeedbackSignal } : {}),
|
|
404
299
|
...(skipIfLocked ? { skipIfLocked } : {}),
|
|
405
300
|
...(strategyArg !== undefined ? { strategy: strategyArg } : {}),
|
|
406
|
-
...(engineProbe !== undefined ? { engineProbe } : {}),
|
|
407
301
|
onBudgetHardKill: () => persistTerminated("budget_exhausted"),
|
|
408
302
|
...(Object.keys(syncOverride).length > 0 ? { sync: syncOverride } : {}),
|
|
409
303
|
}),
|