akm-cli 0.9.0-rc.1 → 0.9.0-rc.13
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 +1190 -52
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +13 -9
- package/dist/commands/env/env-cli.js +76 -159
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +75 -228
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -855
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -73
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -58
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +8 -3
- package/dist/integrations/agent/profiles.js +6 -99
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +78 -13
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +48 -279
- package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
- package/dist/integrations/harnesses/aider/index.js +2 -12
- package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
- package/dist/integrations/harnesses/amazonq/index.js +3 -17
- package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +1 -14
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
- package/dist/integrations/harnesses/codex/index.js +2 -13
- package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
- package/dist/integrations/harnesses/copilot/index.js +1 -13
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
- package/dist/integrations/harnesses/gemini/index.js +1 -13
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +31 -33
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +1 -18
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
- package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
- package/dist/integrations/harnesses/openhands/index.js +2 -12
- package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
- package/dist/integrations/harnesses/pi/index.js +3 -16
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +38 -34
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +24 -40
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +15 -281
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +8 -40
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1375
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +1 -2
- package/dist/output/text.js +10 -19
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +68 -35
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/workflows/authoring/authoring.js +96 -148
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -20
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +25 -59
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +157 -94
- package/dist/workflows/exec/report.js +365 -200
- package/dist/workflows/exec/run-workflow.js +46 -40
- package/dist/workflows/exec/scheduler.js +12 -41
- package/dist/workflows/exec/step-work.js +239 -205
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/ir/compile.js +141 -283
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/plan-hash.js +40 -5
- package/dist/workflows/ir/schema.js +537 -1
- package/dist/workflows/parser.js +878 -306
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +99 -121
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +200 -113
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +4 -26
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/{dist/schemas → schemas}/akm-workflow.json +127 -82
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -316
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1414
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/schemas/akm-config.json +0 -14225
- package/dist/scripts/migrate-storage.js +0 -13169
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/db.js +0 -350
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -760
- package/dist/workflows/program/project.js +0 -105
- package/docs/data-and-telemetry.md +0 -227
- package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
* row (`plan_json`, persisted by `startWorkflowRun` under migration 006) with
|
|
38
38
|
* a `plan_hash` integrity check — the workflow asset file is NEVER re-read
|
|
39
39
|
* for an in-flight run, so a mid-run asset edit cannot change behavior.
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* partially-executed run re-dispatches only work that never completed.
|
|
40
|
+
* Durable-row resume: re-invoking a partially-executed run re-dispatches only
|
|
41
|
+
* work that never completed.
|
|
43
42
|
*
|
|
44
43
|
* Run lease (redesign addendum, R2): exactly one engine invocation drives a
|
|
45
44
|
* run at a time. The lease (random holder id + 90s expiry on the run row) is
|
|
46
45
|
* acquired before any dispatch, renewed between steps, and released in a
|
|
47
|
-
* `finally
|
|
46
|
+
* `finally` unless a failed run retains it as forensic state; a second
|
|
47
|
+
* `workflow run` on a live-leased run refuses up front,
|
|
48
48
|
* and an expired lease is claimable (crash recovery). While the lease is
|
|
49
49
|
* live, manual `workflow complete` is refused too — the engine owns the
|
|
50
50
|
* spine while driving (enforced inside `completeWorkflowStep`).
|
|
@@ -62,20 +62,34 @@
|
|
|
62
62
|
*/
|
|
63
63
|
import { randomUUID } from "node:crypto";
|
|
64
64
|
import { UsageError } from "../../core/errors.js";
|
|
65
|
-
import {
|
|
65
|
+
import { withMaintenanceStartBarrierAsync } from "../../core/maintenance-barrier.js";
|
|
66
66
|
import { disposeDispatchResources } from "../../integrations/agent/runner-dispatch.js";
|
|
67
67
|
import { withWorkflowRunsRepo } from "../../storage/repositories/workflow-runs-repository.js";
|
|
68
68
|
import { assertRunParamsSatisfyPlan } from "../ir/params.js";
|
|
69
|
+
import { computePlanHash } from "../ir/plan-hash.js";
|
|
70
|
+
import { decodeWorkflowPlanV3 } from "../ir/schema.js";
|
|
71
|
+
import { requireExecutableWorkflowPlan } from "../runtime/plan-classifier.js";
|
|
69
72
|
import { completeWorkflowStep, getNextWorkflowStep } from "../runtime/runs.js";
|
|
70
|
-
import {
|
|
73
|
+
import { GATE_EVALUATION_PHASE } from "../runtime/unit-phases.js";
|
|
74
|
+
import { frozenSummaryJudge } from "./frozen-judge.js";
|
|
71
75
|
import { executeStepPlan } from "./native-executor.js";
|
|
72
76
|
// Shared step semantics — route evaluation + cascaded-skip bookkeeping,
|
|
73
77
|
// gate-evaluation journaling, and the whole step-completion path
|
|
74
78
|
// (`finalizeExecutedStep`) live in step-work.ts so the engine loop and the R3
|
|
75
79
|
// brief/report driver protocol share ONE implementation (no drift).
|
|
76
|
-
import { activeGateLoop, cascadeSkippedRouter, finalizeExecutedStep,
|
|
80
|
+
import { activeGateLoop, cascadeSkippedRouter, finalizeExecutedStep, recoverGateFeedback, seedJournaledRouteDecisions, } from "./step-work.js";
|
|
77
81
|
export async function runWorkflowSteps(options) {
|
|
78
82
|
const next = await getNextWorkflowStep(options.target, options.params);
|
|
83
|
+
// Version/canonical/hash validation precedes every executable mutation,
|
|
84
|
+
// including lease acquisition. Historical rows remain inspectable/abandonable.
|
|
85
|
+
if (!next.done && !options.loadPlan) {
|
|
86
|
+
await withWorkflowRunsRepo((repo) => {
|
|
87
|
+
const row = repo.getRunById(next.run.id);
|
|
88
|
+
if (!row)
|
|
89
|
+
throw new UsageError(`Workflow run ${next.run.id} was not found.`);
|
|
90
|
+
requireExecutableWorkflowPlan(row);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
79
93
|
// Refuse non-active runs BEFORE any dispatch — completeWorkflowStep would
|
|
80
94
|
// reject the completion anyway, but only after the units already ran (and
|
|
81
95
|
// cost money). Mirror its preflight up front.
|
|
@@ -128,7 +142,7 @@ export async function runWorkflowSteps(options) {
|
|
|
128
142
|
// hanging on the leaked handle. Runs even if lease release itself fails;
|
|
129
143
|
// a teardown-time repository error must not skip dispatch cleanup.
|
|
130
144
|
try {
|
|
131
|
-
(options.disposeDispatchResources ?? disposeDispatchResources)();
|
|
145
|
+
await (options.disposeDispatchResources ?? disposeDispatchResources)();
|
|
132
146
|
}
|
|
133
147
|
catch {
|
|
134
148
|
/* disposal is best-effort; never let cleanup mask the run outcome */
|
|
@@ -148,14 +162,14 @@ function leaseExpiry() {
|
|
|
148
162
|
* arbiter — two racing invocations cannot both win.
|
|
149
163
|
*/
|
|
150
164
|
async function acquireRunLease(runId, holder) {
|
|
151
|
-
await withWorkflowRunsRepo((repo) => {
|
|
165
|
+
await withMaintenanceStartBarrierAsync(() => withWorkflowRunsRepo((repo) => {
|
|
152
166
|
if (repo.acquireEngineLease(runId, holder, leaseExpiry(), new Date().toISOString()))
|
|
153
167
|
return;
|
|
154
168
|
const row = repo.getRunById(runId);
|
|
155
169
|
throw new UsageError(`Workflow run ${runId} is already being driven by engine ${row?.engine_lease_holder ?? "(unknown)"} ` +
|
|
156
170
|
`(run lease expires ${row?.engine_lease_until ?? "(unknown)"}). A second \`akm workflow run\` would race it — ` +
|
|
157
171
|
`wait for that invocation to finish or for the lease to expire.`);
|
|
158
|
-
});
|
|
172
|
+
}));
|
|
159
173
|
}
|
|
160
174
|
/**
|
|
161
175
|
* Renew the lease between steps. Losing the lease mid-run (it expired during
|
|
@@ -333,11 +347,14 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
333
347
|
const journaledDispatches = journaledUnits.filter((row) => row.phase !== GATE_EVALUATION_PHASE);
|
|
334
348
|
let unitsDispatched = journaledDispatches.reduce((sum, row) => sum + row.attempts, 0);
|
|
335
349
|
let tokensUsed = journaledDispatches.reduce((sum, row) => sum + (row.tokens ?? 0), 0);
|
|
336
|
-
//
|
|
337
|
-
//
|
|
338
|
-
const plan =
|
|
339
|
-
|
|
340
|
-
|
|
350
|
+
// The decoded/hash-verified row plan is the sole execution authority. The
|
|
351
|
+
// loader seam may assert an expected plan in tests, but can never replace it.
|
|
352
|
+
const plan = await loadFrozenPlan(next.run.id);
|
|
353
|
+
if (options.loadPlan) {
|
|
354
|
+
const expected = decodeWorkflowPlanV3(await options.loadPlan(next.run.workflowRef));
|
|
355
|
+
if (computePlanHash(expected) !== computePlanHash(plan))
|
|
356
|
+
throw new UsageError(`Injected workflow plan for run ${next.run.id} differs from its frozen plan.`);
|
|
357
|
+
}
|
|
341
358
|
// Reviewer #12: the journaled params row must still satisfy the frozen param
|
|
342
359
|
// schemas before the engine resolves any unit prompt from it. Applied on ALL
|
|
343
360
|
// THREE driver surfaces (engine here, brief, report) so schema-violating
|
|
@@ -356,7 +373,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
356
373
|
// the unselected targets with empty in-memory state and execute the wrong
|
|
357
374
|
// branch. Decisions stay pure functions of (frozen plan, params, journaled
|
|
358
375
|
// results) — the addendum determinism bar. A done run skips the seeding:
|
|
359
|
-
// nothing will dispatch, so an unrecoverable
|
|
376
|
+
// nothing will dispatch, so an unrecoverable prior decision must not
|
|
360
377
|
// block the no-op status return below.
|
|
361
378
|
if (!next.done) {
|
|
362
379
|
seedJournaledRouteDecisions(plan, next, routeSelected, routeUnselected);
|
|
@@ -397,7 +414,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
397
414
|
next = await getNextWorkflowStep(next.run.id);
|
|
398
415
|
continue;
|
|
399
416
|
}
|
|
400
|
-
// `dependsOn` edges (
|
|
417
|
+
// `dependsOn` edges (no frontend emits them today,
|
|
401
418
|
// but a frozen plan may carry them) are a declared ordering contract:
|
|
402
419
|
// every dependency must already be resolved before this step dispatches.
|
|
403
420
|
// Execution is sequential (spine order), so a violation means the plan
|
|
@@ -467,6 +484,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
467
484
|
}
|
|
468
485
|
: await executeStepPlan(stepPlan, {
|
|
469
486
|
runId: next.run.id,
|
|
487
|
+
leaseHolder,
|
|
470
488
|
workflowRef: next.run.workflowRef,
|
|
471
489
|
params: next.run.params ?? {},
|
|
472
490
|
evidence,
|
|
@@ -475,13 +493,14 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
475
493
|
// Budget ceilings ride the FROZEN plan (addendum R2): a mid-run
|
|
476
494
|
// asset edit can never loosen or tighten a run's budget.
|
|
477
495
|
...(plan.budget ? { budget: plan.budget } : {}),
|
|
496
|
+
...(plan.execution ? { engines: plan.execution.engines } : {}),
|
|
478
497
|
gateLoop,
|
|
479
498
|
...(gateFeedback ? { gateFeedback } : {}),
|
|
480
499
|
// The heartbeat's signal is the effective dispatch signal: a lost
|
|
481
500
|
// lease (or a caller abort) aborts in-flight units promptly.
|
|
482
501
|
...(dispatchSignal ? { signal: dispatchSignal } : {}),
|
|
483
502
|
...(options.dispatcher ? { dispatcher: options.dispatcher } : {}),
|
|
484
|
-
|
|
503
|
+
maxConcurrency: Math.min(options.maxConcurrency ?? Number.POSITIVE_INFINITY, plan.execution?.maxConcurrency ?? 1),
|
|
485
504
|
});
|
|
486
505
|
// If the heartbeat lost the lease WHILE this step dispatched, another
|
|
487
506
|
// engine now owns the run — stop loudly BEFORE finalizing the step
|
|
@@ -510,7 +529,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
510
529
|
workflowRef: next.run.workflowRef,
|
|
511
530
|
stepId: step.id,
|
|
512
531
|
stepPlan,
|
|
513
|
-
completionCriteria:
|
|
532
|
+
completionCriteria: stepPlan.gate.criteria,
|
|
514
533
|
gateLoop,
|
|
515
534
|
loopsRemaining: gateLoop < maxLoops,
|
|
516
535
|
result,
|
|
@@ -518,8 +537,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
518
537
|
params: next.run.params ?? {},
|
|
519
538
|
routeSelected,
|
|
520
539
|
routeUnselected,
|
|
521
|
-
summaryJudge: options.summaryJudge,
|
|
522
|
-
...(options.requireGates ? { requireGates: true } : {}),
|
|
540
|
+
summaryJudge: options.summaryJudge === undefined ? frozenSummaryJudge(plan, stepPlan.gate.judge) : options.summaryJudge,
|
|
523
541
|
leaseHolder,
|
|
524
542
|
});
|
|
525
543
|
if (finalize.kind === "retry") {
|
|
@@ -546,14 +564,6 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
546
564
|
stopEngine = true;
|
|
547
565
|
break;
|
|
548
566
|
}
|
|
549
|
-
if (finalize.kind === "blocked") {
|
|
550
|
-
// Reviewer #18: a required gate with no judge available — the step is
|
|
551
|
-
// BLOCKED (not failed) for a human. The units succeeded, so overwrite the
|
|
552
|
-
// report's ok/summary to reflect the block, then stop this invocation.
|
|
553
|
-
executed[executed.length - 1] = { ...executed[executed.length - 1], ok: false, summary: finalize.summary };
|
|
554
|
-
stopEngine = true;
|
|
555
|
-
break;
|
|
556
|
-
}
|
|
557
567
|
// gate-exhausted: rejected with no loop budget left — stop with feedback.
|
|
558
568
|
gateRejection = finalize.gateRejection;
|
|
559
569
|
stopEngine = true;
|
|
@@ -578,19 +588,15 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
578
588
|
* canonical JSON). A mismatch means the journaled plan was tampered with
|
|
579
589
|
* or corrupted — fail loudly, never silently recompile. The workflow
|
|
580
590
|
* asset file is NEVER touched on this path.
|
|
581
|
-
*
|
|
582
|
-
*
|
|
583
|
-
* preserving pre-006 behavior for in-flight legacy runs.
|
|
591
|
+
* Missing and non-current plans fail validation and are never rebuilt from a
|
|
592
|
+
* mutable source asset.
|
|
584
593
|
*/
|
|
585
|
-
async function loadFrozenPlan(runId
|
|
594
|
+
async function loadFrozenPlan(runId) {
|
|
586
595
|
const row = await withWorkflowRunsRepo((repo) => {
|
|
587
596
|
const run = repo.getRunById(runId);
|
|
588
|
-
return run
|
|
597
|
+
return run;
|
|
589
598
|
});
|
|
590
|
-
if (row
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
warn(`Workflow run ${runId} predates frozen plans (no plan_json on the run row); ` +
|
|
594
|
-
`compiling the plan from the live asset ${workflowRef}. New runs freeze their plan at start.`);
|
|
595
|
-
return compileWorkflowAssetPlan(await loadWorkflowAsset(workflowRef));
|
|
599
|
+
if (!row)
|
|
600
|
+
throw new UsageError(`Workflow run ${runId} was not found.`);
|
|
601
|
+
return requireExecutableWorkflowPlan(row);
|
|
596
602
|
}
|
|
@@ -6,13 +6,12 @@
|
|
|
6
6
|
*
|
|
7
7
|
* A thin policy layer over `core/concurrent.ts` (`concurrentMap`) — the
|
|
8
8
|
* existing semaphore-bounded pool is generalized, not forked. The scheduler
|
|
9
|
-
* owns the
|
|
9
|
+
* owns the limits the plan requires:
|
|
10
10
|
*
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* `min(16, cores − 2)` (the original Claude-Code-matching formula).
|
|
11
|
+
* - The effective width is the minimum of the map request, the frozen
|
|
12
|
+
* workflow cap, the selected LLM engine's frozen cap (when applicable),
|
|
13
|
+
* and the current host's CPU-derived safety cap. Reapplying host safety at
|
|
14
|
+
* dispatch matters when a frozen run resumes on a smaller machine.
|
|
16
15
|
* - Cooperative cancellation via AbortSignal (workers stop claiming items;
|
|
17
16
|
* the same signal is passed into each dispatch so in-flight units can be
|
|
18
17
|
* preempted too).
|
|
@@ -24,9 +23,10 @@
|
|
|
24
23
|
* units impossible to resume (peer review R1). Only work that really
|
|
25
24
|
* dispatches consumes the cap.
|
|
26
25
|
*/
|
|
27
|
-
import os from "node:os";
|
|
28
26
|
import { concurrentMap } from "../../core/concurrent.js";
|
|
29
|
-
import {
|
|
27
|
+
import { cpuDerivedUnitConcurrency, workflowMaxConcurrency } from "../concurrency-policy.js";
|
|
28
|
+
import { WORKFLOW_MAX_MAP_EXPANSION } from "../resource-limits.js";
|
|
29
|
+
export { clampMaxConcurrency, cpuDerivedUnitConcurrency, WORKFLOW_MAX_CONCURRENCY_CEILING, } from "../concurrency-policy.js";
|
|
30
30
|
/**
|
|
31
31
|
* Hard ceiling on an EXPLICIT `workflow.maxConcurrency`. A user value above
|
|
32
32
|
* this is clamped down (not rejected) so a config shared across machines with
|
|
@@ -34,32 +34,6 @@ import { loadConfig } from "../../core/config/config.js";
|
|
|
34
34
|
* 64 is deliberately far above any sane fan-out width — it exists only to keep
|
|
35
35
|
* a fat-fingered `100000` from spawning a runaway pool.
|
|
36
36
|
*/
|
|
37
|
-
export const WORKFLOW_MAX_CONCURRENCY_CEILING = 64;
|
|
38
|
-
/**
|
|
39
|
-
* CPU-derived engine cap used when `workflow.maxConcurrency` is unset — the
|
|
40
|
-
* original `min(16, cores−2)` formula (matching Claude Code), floored at 1.
|
|
41
|
-
*/
|
|
42
|
-
export function cpuDerivedUnitConcurrency(cpuCount = os.cpus()?.length ?? 4) {
|
|
43
|
-
return Math.min(16, Math.max(1, cpuCount - 2));
|
|
44
|
-
}
|
|
45
|
-
/** Clamp an explicit configured value into `[1, WORKFLOW_MAX_CONCURRENCY_CEILING]`. */
|
|
46
|
-
export function clampMaxConcurrency(value) {
|
|
47
|
-
return Math.min(WORKFLOW_MAX_CONCURRENCY_CEILING, Math.max(1, Math.floor(value)));
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Read `workflow.maxConcurrency` from config, fail-open to `undefined` (use the
|
|
51
|
-
* CPU default) on any load error or a non-numeric value. Kept side-effect-free
|
|
52
|
-
* and defensive: the scheduler must never fail a run because config is unwell.
|
|
53
|
-
*/
|
|
54
|
-
function configuredMaxConcurrency() {
|
|
55
|
-
try {
|
|
56
|
-
const value = loadConfig().workflow?.maxConcurrency;
|
|
57
|
-
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
37
|
/**
|
|
64
38
|
* Engine-wide ceiling on concurrent units. Precedence:
|
|
65
39
|
* 1. An explicit `workflow.maxConcurrency` config value, clamped to
|
|
@@ -72,13 +46,11 @@ function configuredMaxConcurrency() {
|
|
|
72
46
|
* @param configured Explicit config value seam (defaults to reading config);
|
|
73
47
|
* pass `undefined` explicitly to force the CPU path in a test.
|
|
74
48
|
*/
|
|
75
|
-
export function maxUnitConcurrency(cpuCount
|
|
76
|
-
|
|
77
|
-
return clampMaxConcurrency(configured);
|
|
78
|
-
return cpuDerivedUnitConcurrency(cpuCount);
|
|
49
|
+
export function maxUnitConcurrency(cpuCount, configured) {
|
|
50
|
+
return workflowMaxConcurrency(configured, cpuCount);
|
|
79
51
|
}
|
|
80
52
|
/** Lifetime unit cap per run — a runaway-loop backstop, far above real use. */
|
|
81
|
-
export const LIFETIME_UNIT_CAP =
|
|
53
|
+
export const LIFETIME_UNIT_CAP = WORKFLOW_MAX_MAP_EXPANSION;
|
|
82
54
|
export class UnitCapExceededError extends Error {
|
|
83
55
|
constructor(cap) {
|
|
84
56
|
super(`workflow run exceeded the lifetime unit cap (${cap}). Aborting dispatch — check for a runaway fan-out.`);
|
|
@@ -94,7 +66,6 @@ export class UnitCapExceededError extends Error {
|
|
|
94
66
|
* resume stay free.
|
|
95
67
|
*/
|
|
96
68
|
export async function scheduleUnits(items, dispatch, options = {}) {
|
|
97
|
-
const
|
|
98
|
-
const concurrency = Math.max(1, Math.min(options.concurrency ?? 1, cap));
|
|
69
|
+
const concurrency = Math.max(1, Math.min(options.concurrency ?? 1, options.maxConcurrency ?? Number.POSITIVE_INFINITY, options.llmConcurrency ?? Number.POSITIVE_INFINITY, options.hostConcurrency ?? cpuDerivedUnitConcurrency()));
|
|
99
70
|
return concurrentMap(items, dispatch, concurrency, { signal: options.signal });
|
|
100
71
|
}
|