akm-cli 0.9.0-rc.8 → 0.9.0
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 +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -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 +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -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 +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- 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 +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- 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 +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- 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/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -8,20 +8,20 @@
|
|
|
8
8
|
*
|
|
9
9
|
* A workflow's run params are interpolated into every unit prompt
|
|
10
10
|
* (`buildUnitPrompt` → `{{PARAMS_JSON}}` + `${{ params.* }}` references) and,
|
|
11
|
-
* critically, are part of the unit's **input hash**. The
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
11
|
+
* critically, are part of the unit's **input hash**. The prompt an executor runs
|
|
12
|
+
* must be byte-identical to the one the hash was taken over — redacting a param
|
|
13
|
+
* would change the prompt, break the input-hash contract, and make a resumed or
|
|
14
|
+
* replayed run diverge from the original. So params CANNOT be redacted and are
|
|
15
|
+
* declared **non-secret**: secrets belong in **env bindings** (`env:` refs),
|
|
16
|
+
* which are carried by NAME ONLY through the plan and the hash preimage and are
|
|
17
|
+
* resolved from the process environment at dispatch.
|
|
18
18
|
*
|
|
19
19
|
* This module is the loud, best-effort guardrail on top of that contract: it
|
|
20
20
|
* scans params for values that LOOK like credentials (secret-suggesting key
|
|
21
21
|
* names, long high-entropy strings, known token prefixes) and returns WARNING
|
|
22
22
|
* strings. It is purely advisory — it NEVER blocks a run and NEVER mutates
|
|
23
|
-
* params — and is surfaced
|
|
24
|
-
*
|
|
23
|
+
* params — and is surfaced when a run starts. False positives and false
|
|
24
|
+
* negatives are expected; it is a nudge, not a scanner.
|
|
25
25
|
*/
|
|
26
26
|
/**
|
|
27
27
|
* Substrings that, when present in a param KEY (case-insensitive), suggest the
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* Engine-driven workflow execution — `akm workflow run`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* of the same runs.
|
|
5
|
+
* Engine-driven workflow execution — the `akm workflow run`
|
|
6
|
+
* start/resume/execute path, and the single execution surface for a run: akm
|
|
7
|
+
* walks the frozen plan and dispatches every unit itself.
|
|
9
8
|
*
|
|
10
9
|
* Invariant (plan §*Never bypass the gate spine*): every step advances
|
|
11
10
|
* through `completeWorkflowStep`, never by writing step rows directly, so the
|
|
@@ -37,17 +36,17 @@
|
|
|
37
36
|
* row (`plan_json`, persisted by `startWorkflowRun` under migration 006) with
|
|
38
37
|
* a `plan_hash` integrity check — the workflow asset file is NEVER re-read
|
|
39
38
|
* 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.
|
|
39
|
+
* Durable-row resume: re-invoking a partially-executed run re-dispatches only
|
|
40
|
+
* work that never completed.
|
|
43
41
|
*
|
|
44
42
|
* Run lease (redesign addendum, R2): exactly one engine invocation drives a
|
|
45
43
|
* run at a time. The lease (random holder id + 90s expiry on the run row) is
|
|
46
44
|
* acquired before any dispatch, renewed between steps, and released in a
|
|
47
|
-
* `finally
|
|
45
|
+
* `finally` unless a failed run retains it as forensic state; a second
|
|
46
|
+
* `workflow run` on a live-leased run refuses up front,
|
|
48
47
|
* and an expired lease is claimable (crash recovery). While the lease is
|
|
49
|
-
* live,
|
|
50
|
-
*
|
|
48
|
+
* live, any competing spine advance is refused — the engine owns the run while
|
|
49
|
+
* driving (enforced inside `completeWorkflowStep`).
|
|
51
50
|
*
|
|
52
51
|
* Process-lifecycle contract (owner finding 4 — no leaked handles): the SDK
|
|
53
52
|
* dispatch path caches `opencode serve` CHILD PROCESSES in a per-env registry
|
|
@@ -69,17 +68,51 @@ import { assertRunParamsSatisfyPlan } from "../ir/params.js";
|
|
|
69
68
|
import { computePlanHash } from "../ir/plan-hash.js";
|
|
70
69
|
import { decodeWorkflowPlanV3 } from "../ir/schema.js";
|
|
71
70
|
import { requireExecutableWorkflowPlan } from "../runtime/plan-classifier.js";
|
|
72
|
-
import { completeWorkflowStep, getNextWorkflowStep } from "../runtime/runs.js";
|
|
71
|
+
import { completeWorkflowStep, getNextWorkflowStep, resumeWorkflowRun } from "../runtime/runs.js";
|
|
73
72
|
import { GATE_EVALUATION_PHASE } from "../runtime/unit-phases.js";
|
|
74
73
|
import { frozenSummaryJudge } from "./frozen-judge.js";
|
|
75
|
-
import { executeStepPlan } from "./native-executor.js";
|
|
74
|
+
import { defaultUnitDispatcher, executeStepPlan, } from "./native-executor.js";
|
|
76
75
|
// Shared step semantics — route evaluation + cascaded-skip bookkeeping,
|
|
77
76
|
// gate-evaluation journaling, and the whole step-completion path
|
|
78
|
-
// (`finalizeExecutedStep`) live in step-work.ts
|
|
79
|
-
//
|
|
77
|
+
// (`finalizeExecutedStep`) live in step-work.ts as ONE implementation, so the
|
|
78
|
+
// fresh-execution and resume paths cannot drift from each other.
|
|
80
79
|
import { activeGateLoop, cascadeSkippedRouter, finalizeExecutedStep, recoverGateFeedback, seedJournaledRouteDecisions, } from "./step-work.js";
|
|
81
80
|
export async function runWorkflowSteps(options) {
|
|
82
|
-
|
|
81
|
+
let target = options.target;
|
|
82
|
+
let params = options.params;
|
|
83
|
+
let parameterFlags = options.parameterFlags;
|
|
84
|
+
let remainingRetries = options.maxRetries ?? 0;
|
|
85
|
+
let remainingSteps = options.maxSteps;
|
|
86
|
+
const executed = [];
|
|
87
|
+
for (;;) {
|
|
88
|
+
const result = await runWorkflowAttempt({
|
|
89
|
+
...options,
|
|
90
|
+
target,
|
|
91
|
+
...(params !== undefined ? { params } : { params: undefined }),
|
|
92
|
+
...(parameterFlags !== undefined ? { parameterFlags } : { parameterFlags: undefined }),
|
|
93
|
+
...(remainingSteps !== undefined ? { maxSteps: remainingSteps } : { maxSteps: undefined }),
|
|
94
|
+
});
|
|
95
|
+
executed.push(...result.executed);
|
|
96
|
+
const aggregate = { ...result, executed };
|
|
97
|
+
if (result.run.status !== "failed" || result.aborted || result.gateRejection || remainingRetries <= 0) {
|
|
98
|
+
return aggregate;
|
|
99
|
+
}
|
|
100
|
+
if (remainingSteps !== undefined) {
|
|
101
|
+
remainingSteps -= result.executed.length;
|
|
102
|
+
if (remainingSteps <= 0)
|
|
103
|
+
return aggregate;
|
|
104
|
+
}
|
|
105
|
+
await resumeWorkflowRun(result.run.id);
|
|
106
|
+
target = result.run.id;
|
|
107
|
+
params = undefined;
|
|
108
|
+
parameterFlags = undefined;
|
|
109
|
+
remainingRetries -= 1;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function runWorkflowAttempt(options) {
|
|
113
|
+
const next = await getNextWorkflowStep(options.target, options.params, {
|
|
114
|
+
parameterFlags: options.parameterFlags,
|
|
115
|
+
});
|
|
83
116
|
// Version/canonical/hash validation precedes every executable mutation,
|
|
84
117
|
// including lease acquisition. Historical rows remain inspectable/abandonable.
|
|
85
118
|
if (!next.done && !options.loadPlan) {
|
|
@@ -125,7 +158,11 @@ export async function runWorkflowSteps(options) {
|
|
|
125
158
|
: undefined;
|
|
126
159
|
heartbeat?.start();
|
|
127
160
|
try {
|
|
128
|
-
|
|
161
|
+
const result = await driveRun(options, next, leaseHolder, heartbeat);
|
|
162
|
+
// Creation-time notices reach the caller only here: the run row has no
|
|
163
|
+
// warnings column, and a later invocation of the same run must stay silent
|
|
164
|
+
// about a decision it did not make. `driveRun` never sets `warnings`.
|
|
165
|
+
return next.startWarnings?.length ? { ...result, warnings: next.startWarnings } : result;
|
|
129
166
|
}
|
|
130
167
|
finally {
|
|
131
168
|
heartbeat?.stop();
|
|
@@ -294,30 +331,34 @@ class LeaseHeartbeat {
|
|
|
294
331
|
this.detachUpstream?.();
|
|
295
332
|
}
|
|
296
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* A terminal run is a pure no-op: do not load or integrity-check its frozen
|
|
336
|
+
* plan, because post-completion plan corruption cannot change finished work.
|
|
337
|
+
*/
|
|
338
|
+
async function completedRunResult(runId) {
|
|
339
|
+
const doneState = await getNextWorkflowStep(runId);
|
|
340
|
+
return {
|
|
341
|
+
run: doneState.run,
|
|
342
|
+
executed: [],
|
|
343
|
+
...(doneState.run.status === "completed" ? { done: true } : {}),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function workflowSummaryJudge(options, plan, stepPlan, signal) {
|
|
347
|
+
if (options.summaryJudge !== undefined)
|
|
348
|
+
return options.summaryJudge;
|
|
349
|
+
return frozenSummaryJudge(plan, stepPlan.gate.judge, signal, options.dispatcher ?? defaultUnitDispatcher);
|
|
350
|
+
}
|
|
297
351
|
/** The engine loop proper — runs under the lease held by `runWorkflowSteps`. */
|
|
298
352
|
async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
299
353
|
let next = initial;
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
// path must ALSO refuse to read the journal or load/integrity-check the
|
|
303
|
-
// frozen plan: a run that finished cleanly, then had its `plan_json` corrupted
|
|
304
|
-
// or tampered afterwards, must still report `done` here rather than throwing a
|
|
305
|
-
// frozen-plan integrity error (loadFrozenPlan would). Nothing will dispatch
|
|
306
|
-
// and the engine_lease_* columns stay exactly as they were, so return the
|
|
307
|
-
// fresh run state immediately.
|
|
308
|
-
if (initial.done) {
|
|
309
|
-
const doneState = await getNextWorkflowStep(initial.run.id);
|
|
310
|
-
return {
|
|
311
|
-
run: doneState.run,
|
|
312
|
-
executed: [],
|
|
313
|
-
...(doneState.run.status === "completed" ? { done: true } : {}),
|
|
314
|
-
};
|
|
315
|
-
}
|
|
354
|
+
if (initial.done)
|
|
355
|
+
return completedRunResult(initial.run.id);
|
|
316
356
|
// The effective dispatch signal: the heartbeat's controller (a lost lease or
|
|
317
357
|
// a caller abort aborts it) while leased, else the raw caller signal.
|
|
318
358
|
const dispatchSignal = heartbeat?.signal ?? options.signal;
|
|
319
359
|
const executed = [];
|
|
320
360
|
let gateRejection;
|
|
361
|
+
let aborted = false;
|
|
321
362
|
const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY;
|
|
322
363
|
// Seed the lifetime unit cap AND the budget ceilings from the journal so
|
|
323
364
|
// both are truly per-RUN: a resumed or re-invoked run must not restart the
|
|
@@ -349,17 +390,16 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
349
390
|
let tokensUsed = journaledDispatches.reduce((sum, row) => sum + (row.tokens ?? 0), 0);
|
|
350
391
|
// The decoded/hash-verified row plan is the sole execution authority. The
|
|
351
392
|
// loader seam may assert an expected plan in tests, but can never replace it.
|
|
352
|
-
const plan = await loadFrozenPlan(next.run.id
|
|
393
|
+
const plan = await loadFrozenPlan(next.run.id);
|
|
353
394
|
if (options.loadPlan) {
|
|
354
395
|
const expected = decodeWorkflowPlanV3(await options.loadPlan(next.run.workflowRef));
|
|
355
396
|
if (computePlanHash(expected) !== computePlanHash(plan))
|
|
356
397
|
throw new UsageError(`Injected workflow plan for run ${next.run.id} differs from its frozen plan.`);
|
|
357
398
|
}
|
|
358
399
|
// Reviewer #12: the journaled params row must still satisfy the frozen param
|
|
359
|
-
// schemas before the engine resolves any unit prompt from it
|
|
360
|
-
//
|
|
361
|
-
//
|
|
362
|
-
// cross-surface parity (start already validated the params it stored).
|
|
400
|
+
// schemas before the engine resolves any unit prompt from it, so
|
|
401
|
+
// schema-violating params — post-start corruption — fail loudly BEFORE any
|
|
402
|
+
// unit is dispatched (start already validated the params it stored).
|
|
363
403
|
assertRunParamsSatisfyPlan(next.run.id, plan, next.run.params ?? {});
|
|
364
404
|
// Route bookkeeping: targets a completed router did NOT select are skipped
|
|
365
405
|
// when the spine reaches them; a target ANY router selected is protected
|
|
@@ -373,7 +413,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
373
413
|
// the unselected targets with empty in-memory state and execute the wrong
|
|
374
414
|
// branch. Decisions stay pure functions of (frozen plan, params, journaled
|
|
375
415
|
// results) — the addendum determinism bar. A done run skips the seeding:
|
|
376
|
-
// nothing will dispatch, so an unrecoverable
|
|
416
|
+
// nothing will dispatch, so an unrecoverable prior decision must not
|
|
377
417
|
// block the no-op status return below.
|
|
378
418
|
if (!next.done) {
|
|
379
419
|
seedJournaledRouteDecisions(plan, next, routeSelected, routeUnselected);
|
|
@@ -383,8 +423,10 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
383
423
|
// another engine owns the spine now. A caller abort (options.signal) is a
|
|
384
424
|
// graceful break, distinct from a lost lease.
|
|
385
425
|
heartbeat?.assertAlive();
|
|
386
|
-
if (options.signal?.aborted)
|
|
426
|
+
if (options.signal?.aborted) {
|
|
427
|
+
aborted = true;
|
|
387
428
|
break;
|
|
429
|
+
}
|
|
388
430
|
// Renew the run lease between steps (a fresh 90s window per iteration).
|
|
389
431
|
// Losing it (expired mid-step + claimed by another engine) throws — the
|
|
390
432
|
// new owner drives the spine now.
|
|
@@ -392,8 +434,8 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
392
434
|
const step = next.step;
|
|
393
435
|
const stepPlan = plan.steps.find((s) => s.stepId === step.id);
|
|
394
436
|
if (!stepPlan) {
|
|
395
|
-
throw new UsageError(`Step "${step.id}" of run ${next.run.id} is not present in
|
|
396
|
-
|
|
437
|
+
throw new UsageError(`Step "${step.id}" of run ${next.run.id} is not present in its frozen workflow plan (${next.run.workflowRef}). ` +
|
|
438
|
+
"The run journal is inconsistent; abandon this run and start a new one.");
|
|
397
439
|
}
|
|
398
440
|
// A branch target no completed router selected → auto-skip, no dispatch.
|
|
399
441
|
const skipInfo = routeUnselected.get(step.id);
|
|
@@ -414,7 +456,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
414
456
|
next = await getNextWorkflowStep(next.run.id);
|
|
415
457
|
continue;
|
|
416
458
|
}
|
|
417
|
-
// `dependsOn` edges (
|
|
459
|
+
// `dependsOn` edges (no frontend emits them today,
|
|
418
460
|
// but a frozen plan may carry them) are a declared ordering contract:
|
|
419
461
|
// every dependency must already be resolved before this step dispatches.
|
|
420
462
|
// Execution is sequential (spine order), so a violation means the plan
|
|
@@ -437,13 +479,13 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
437
479
|
// final rejection — this invocation is done.
|
|
438
480
|
const maxLoops = Math.max(1, stepPlan.gate.maxLoops ?? 1);
|
|
439
481
|
// Crash-resume gate state (Codex P1): SEED the starting gate loop from the
|
|
440
|
-
// journal
|
|
441
|
-
//
|
|
482
|
+
// journal through the SAME shared helpers the first pass used — no fork.
|
|
483
|
+
// A run interrupted after a rejected gate was journaled
|
|
442
484
|
// (`<step>.gate:l<n>`, complete:false) must resume at loop n+1 with the
|
|
443
485
|
// stored corrective feedback threaded into the unit prompts; without this
|
|
444
486
|
// the engine restarts at loop 1, reuses the rejected loop-1 rows, overwrites
|
|
445
487
|
// `<step>.gate:l1`, and re-judges the stale artifact — breaking journaled
|
|
446
|
-
// replay and
|
|
488
|
+
// replay and making the resumed run diverge from the interrupted one. The rows
|
|
447
489
|
// are re-read here (NOT the once-at-start `journaledUnits` budget seed) so a
|
|
448
490
|
// step reached later within THIS same invocation still starts fresh at loop 1.
|
|
449
491
|
const stepJournal = await withWorkflowRunsRepo((repo) => repo.getUnitsForRun(next.run.id));
|
|
@@ -484,6 +526,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
484
526
|
}
|
|
485
527
|
: await executeStepPlan(stepPlan, {
|
|
486
528
|
runId: next.run.id,
|
|
529
|
+
leaseHolder,
|
|
487
530
|
workflowRef: next.run.workflowRef,
|
|
488
531
|
params: next.run.params ?? {},
|
|
489
532
|
evidence,
|
|
@@ -508,6 +551,11 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
508
551
|
unitsDispatched = result.unitsDispatched;
|
|
509
552
|
if (result.tokensUsed !== undefined)
|
|
510
553
|
tokensUsed = result.tokensUsed;
|
|
554
|
+
if (options.signal?.aborted) {
|
|
555
|
+
aborted = true;
|
|
556
|
+
stopEngine = true;
|
|
557
|
+
break;
|
|
558
|
+
}
|
|
511
559
|
executed.push({
|
|
512
560
|
stepId: step.id,
|
|
513
561
|
ok: result.ok,
|
|
@@ -517,29 +565,42 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
517
565
|
});
|
|
518
566
|
// Route evaluation + artifact-judged completion gate + gate-row
|
|
519
567
|
// journaling + the bounded-loop rejection contract are the SHARED
|
|
520
|
-
// completion path (`finalizeExecutedStep`):
|
|
521
|
-
//
|
|
522
|
-
// the
|
|
523
|
-
//
|
|
524
|
-
//
|
|
525
|
-
// stops this invocation).
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
568
|
+
// completion path (`finalizeExecutedStep`): every step advances through
|
|
569
|
+
// that one sequence, whether its units were just dispatched or rehydrated
|
|
570
|
+
// from the journal on resume, so the same frozen plan always promotes the
|
|
571
|
+
// same artifact and advances (or rejects) the spine identically. The
|
|
572
|
+
// engine owns only the loop control the result maps onto (retry
|
|
573
|
+
// re-executes; advanced moves on; failure/exhaustion stops this invocation).
|
|
574
|
+
let finalize;
|
|
575
|
+
try {
|
|
576
|
+
finalize = await finalizeExecutedStep({
|
|
577
|
+
runId: next.run.id,
|
|
578
|
+
workflowRef: next.run.workflowRef,
|
|
579
|
+
stepId: step.id,
|
|
580
|
+
stepPlan,
|
|
581
|
+
completionCriteria: stepPlan.gate.criteria,
|
|
582
|
+
gateLoop,
|
|
583
|
+
loopsRemaining: gateLoop < maxLoops,
|
|
584
|
+
result,
|
|
585
|
+
priorEvidence: evidence,
|
|
586
|
+
params: next.run.params ?? {},
|
|
587
|
+
routeSelected,
|
|
588
|
+
routeUnselected,
|
|
589
|
+
summaryJudge: workflowSummaryJudge(options, plan, stepPlan, dispatchSignal),
|
|
590
|
+
signal: options.signal,
|
|
591
|
+
leaseHolder,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
catch (error) {
|
|
595
|
+
heartbeat?.assertAlive();
|
|
596
|
+
if (options.signal?.aborted) {
|
|
597
|
+
aborted = true;
|
|
598
|
+
stopEngine = true;
|
|
599
|
+
break;
|
|
600
|
+
}
|
|
601
|
+
throw error;
|
|
602
|
+
}
|
|
603
|
+
heartbeat?.assertAlive();
|
|
543
604
|
if (finalize.kind === "retry") {
|
|
544
605
|
// Re-execute the subgraph with the judge/validation feedback threaded
|
|
545
606
|
// into unit prompts — the changed prompt changes each unit's input
|
|
@@ -564,14 +625,6 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
564
625
|
stopEngine = true;
|
|
565
626
|
break;
|
|
566
627
|
}
|
|
567
|
-
if (finalize.kind === "blocked") {
|
|
568
|
-
// Reviewer #18: a required gate with no judge available — the step is
|
|
569
|
-
// BLOCKED (not failed) for a human. The units succeeded, so overwrite the
|
|
570
|
-
// report's ok/summary to reflect the block, then stop this invocation.
|
|
571
|
-
executed[executed.length - 1] = { ...executed[executed.length - 1], ok: false, summary: finalize.summary };
|
|
572
|
-
stopEngine = true;
|
|
573
|
-
break;
|
|
574
|
-
}
|
|
575
628
|
// gate-exhausted: rejected with no loop budget left — stop with feedback.
|
|
576
629
|
gateRejection = finalize.gateRejection;
|
|
577
630
|
stopEngine = true;
|
|
@@ -587,6 +640,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
587
640
|
executed,
|
|
588
641
|
...(finalState.run.status === "completed" ? { done: true } : {}),
|
|
589
642
|
...(gateRejection ? { gateRejection } : {}),
|
|
643
|
+
...(aborted ? { aborted: true } : {}),
|
|
590
644
|
};
|
|
591
645
|
}
|
|
592
646
|
/**
|
|
@@ -596,10 +650,10 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
|
|
|
596
650
|
* canonical JSON). A mismatch means the journaled plan was tampered with
|
|
597
651
|
* or corrupted — fail loudly, never silently recompile. The workflow
|
|
598
652
|
* asset file is NEVER touched on this path.
|
|
599
|
-
*
|
|
600
|
-
*
|
|
653
|
+
* Missing and non-current plans fail validation and are never rebuilt from a
|
|
654
|
+
* mutable source asset.
|
|
601
655
|
*/
|
|
602
|
-
async function loadFrozenPlan(runId
|
|
656
|
+
async function loadFrozenPlan(runId) {
|
|
603
657
|
const row = await withWorkflowRunsRepo((repo) => {
|
|
604
658
|
const run = repo.getRunById(runId);
|
|
605
659
|
return run;
|