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
|
@@ -2,7 +2,7 @@
|
|
|
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
|
-
* Native executor — executes
|
|
5
|
+
* Native executor — executes one frozen step subgraph (`IrStepPlan.root`) on
|
|
6
6
|
* the local machine: fan-out through the scheduler, schema-validated
|
|
7
7
|
* structured output through `runStructured` (core/structured.ts), per-unit
|
|
8
8
|
* persistence through the serialized writer queue, and `workflow_unit_*`
|
|
@@ -74,9 +74,7 @@
|
|
|
74
74
|
* never a silent re-dispatch — under a frozen plan the same identity must
|
|
75
75
|
* reproduce the same inputs, so a mismatch means the journal (or params
|
|
76
76
|
* row) was tampered with. Failed/running/missing rows dispatch live.
|
|
77
|
-
* -
|
|
78
|
-
* no back-compat shim: those rows simply never match a content-derived id
|
|
79
|
-
* and are ignored (the step re-runs cleanly on top of them).
|
|
77
|
+
* - Rows with unrelated ids never match a content-derived id and are ignored.
|
|
80
78
|
*
|
|
81
79
|
* Gate loops (addendum, R2 `gate.max_loops`): when the engine re-executes a
|
|
82
80
|
* step subgraph after a gate rejection, it threads the judge's feedback in as
|
|
@@ -129,22 +127,22 @@
|
|
|
129
127
|
* - This module NEVER writes step rows: advancing the gated spine is the
|
|
130
128
|
* engine loop's job (`run-workflow.ts`) via `completeWorkflowStep`.
|
|
131
129
|
*/
|
|
130
|
+
import { deepMergeConfig } from "../../core/config/deep-merge.js";
|
|
132
131
|
import { ConfigError } from "../../core/errors.js";
|
|
133
132
|
import { appendEvent } from "../../core/events.js";
|
|
134
133
|
import { validateJsonSchemaSubset } from "../../core/json-schema.js";
|
|
134
|
+
import { collectSensitiveValues, isEnvPassthroughValueSafeToExpose, redactSensitiveValue } from "../../core/redaction.js";
|
|
135
135
|
import { runStructured } from "../../core/structured.js";
|
|
136
136
|
import { warn } from "../../core/warn.js";
|
|
137
|
+
import { insertEventStrict } from "../../storage/repositories/events-repository.js";
|
|
137
138
|
import { withWorkflowRunsRepo } from "../../storage/repositories/workflow-runs-repository.js";
|
|
138
139
|
import { LIFETIME_UNIT_CAP, scheduleUnits, UnitCapExceededError } from "./scheduler.js";
|
|
139
140
|
// Shared step semantics — the ONE implementation consumed by both the engine
|
|
140
141
|
// (this module + run-workflow.ts) and, from R3, the brief/report driver
|
|
141
142
|
// protocol. This module dispatches; step-work.ts owns the pure decisions.
|
|
142
|
-
import {
|
|
143
|
+
import { computeStepWorkList, reduceEmptyStep, reduceStepOutcomes, stepOutputsFromEvidence, unitOutcomeFromRow, } from "./step-work.js";
|
|
143
144
|
import { enqueueUnitWrite } from "./unit-writer.js";
|
|
144
145
|
import { assertGitWorkTree, cleanupUnitWorktree, createUnitWorktree } from "./worktree.js";
|
|
145
|
-
// Re-exported for existing consumers (run-workflow.ts, tests) that import these
|
|
146
|
-
// from native-executor; they now live in the shared step-work module.
|
|
147
|
-
export { buildArtifactSummary, DEFAULT_UNIT_TIMEOUT_MS, projectStepOutput };
|
|
148
146
|
/**
|
|
149
147
|
* Mutable per-step dispatch budget: the lifetime unit cap PLUS the declared
|
|
150
148
|
* run-level budget ceilings (`budget.max_units` / `budget.max_tokens`,
|
|
@@ -254,6 +252,7 @@ export async function executeStepPlan(plan, ctx) {
|
|
|
254
252
|
runId: ctx.runId,
|
|
255
253
|
params: ctx.params,
|
|
256
254
|
stepOutputs: stepOutputsFromEvidence(ctx.evidence),
|
|
255
|
+
engines: ctx.engines ?? {},
|
|
257
256
|
...(ctx.gateLoop !== undefined ? { gateLoop: ctx.gateLoop } : {}),
|
|
258
257
|
...(ctx.gateFeedback ? { gateFeedback: ctx.gateFeedback } : {}),
|
|
259
258
|
});
|
|
@@ -310,7 +309,8 @@ export async function executeStepPlan(plan, ctx) {
|
|
|
310
309
|
// attempt in dispatchJournaledAttempt.
|
|
311
310
|
let worktreeBase;
|
|
312
311
|
if (willDispatch && template.isolation === "worktree") {
|
|
313
|
-
|
|
312
|
+
const engine = template.invocation ? ctx.engines?.[template.invocation.engine] : undefined;
|
|
313
|
+
if (engine?.kind === "llm") {
|
|
314
314
|
return failedStep(dispatched, `Step "${plan.stepId}" declares isolation: worktree on an llm unit — the llm runner has no ` +
|
|
315
315
|
`working directory to isolate. Use the agent or sdk runner for worktree-isolated units.`);
|
|
316
316
|
}
|
|
@@ -357,6 +357,12 @@ export async function executeStepPlan(plan, ctx) {
|
|
|
357
357
|
...(onExceeded ? { onExceeded } : {}),
|
|
358
358
|
});
|
|
359
359
|
let outcomes;
|
|
360
|
+
const selectedEngine = template.invocation ? ctx.engines?.[template.invocation.engine] : undefined;
|
|
361
|
+
const selectedLlmEngine = selectedEngine?.kind === "llm"
|
|
362
|
+
? selectedEngine
|
|
363
|
+
: selectedEngine?.kind === "agent" && selectedEngine.fallbackLlmEngine
|
|
364
|
+
? ctx.engines?.[selectedEngine.fallbackLlmEngine]
|
|
365
|
+
: undefined;
|
|
360
366
|
try {
|
|
361
367
|
outcomes = await scheduleUnits(workUnits, (workUnit) => runUnit({
|
|
362
368
|
plan,
|
|
@@ -372,6 +378,7 @@ export async function executeStepPlan(plan, ctx) {
|
|
|
372
378
|
concurrency: workList.list.concurrency,
|
|
373
379
|
signal,
|
|
374
380
|
maxConcurrency: ctx.maxConcurrency,
|
|
381
|
+
...(selectedLlmEngine?.kind === "llm" ? { llmConcurrency: selectedLlmEngine.concurrency } : {}),
|
|
375
382
|
});
|
|
376
383
|
}
|
|
377
384
|
finally {
|
|
@@ -427,25 +434,35 @@ async function runUnit(input) {
|
|
|
427
434
|
if (!workUnit.resolved.ok) {
|
|
428
435
|
return { unitId, ok: false, failureReason: "expression_error", error: workUnit.resolved.error };
|
|
429
436
|
}
|
|
437
|
+
if (!workUnit.engine || !workUnit.invocation) {
|
|
438
|
+
return {
|
|
439
|
+
unitId,
|
|
440
|
+
ok: false,
|
|
441
|
+
failureReason: "dispatch_error",
|
|
442
|
+
error: `unit "${unitId}" has no frozen engine snapshot and cannot be dispatched`,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
430
445
|
// The prompt (and therefore the input hash) was built once with the BASE
|
|
431
446
|
// unit id by computeStepWorkList: a retry re-dispatches the SAME input, the
|
|
432
447
|
// `~r<n>` suffix is journal bookkeeping only.
|
|
433
448
|
const { prompt, inputHash } = workUnit.resolved;
|
|
449
|
+
const sensitiveValues = collectWorkflowDispatchSensitiveValues(workUnit, env);
|
|
434
450
|
const request = {
|
|
435
451
|
runId: ctx.runId,
|
|
436
452
|
stepId: plan.stepId,
|
|
437
453
|
unitId,
|
|
438
454
|
nodeId: workUnit.nodeId,
|
|
439
455
|
prompt,
|
|
440
|
-
|
|
441
|
-
...(workUnit.
|
|
442
|
-
|
|
456
|
+
engine: workUnit.engine,
|
|
457
|
+
...(workUnit.fallbackEngine ? { fallbackEngine: workUnit.fallbackEngine } : {}),
|
|
458
|
+
invocation: workUnit.invocation,
|
|
443
459
|
timeoutMs: workUnit.timeoutMs,
|
|
444
460
|
...(workUnit.schema ? { schema: workUnit.schema } : {}),
|
|
445
461
|
...(env ? { env } : {}),
|
|
462
|
+
...(sensitiveValues.length > 0 ? { sensitiveValues } : {}),
|
|
446
463
|
...(input.signal ? { signal: input.signal } : {}),
|
|
447
464
|
};
|
|
448
|
-
// Bounded retry
|
|
465
|
+
// Bounded retry: attempt 0 journals under the base
|
|
449
466
|
// journal id (`<unitId>`, or `<unitId>~l<loop>` in a gate loop — computed by
|
|
450
467
|
// the shared work-list), retry attempt N under `<baseId>~r<N>`. Every attempt
|
|
451
468
|
// keeps its own row. Retries only fire when the failure reason is in
|
|
@@ -560,7 +577,8 @@ async function dispatchJournaledAttempt(input) {
|
|
|
560
577
|
parentUnitId: workUnit.isFanOut ? `${plan.stepId}.map` : null,
|
|
561
578
|
phase: null,
|
|
562
579
|
runner: workUnit.runner,
|
|
563
|
-
|
|
580
|
+
engine: request.engine.name,
|
|
581
|
+
model: request.invocation.model,
|
|
564
582
|
inputHash,
|
|
565
583
|
worktreePath: worktreePath ?? null,
|
|
566
584
|
startedAt: new Date().toISOString(),
|
|
@@ -573,9 +591,15 @@ async function dispatchJournaledAttempt(input) {
|
|
|
573
591
|
ref: ctx.workflowRef,
|
|
574
592
|
metadata: { runId: ctx.runId, stepId: plan.stepId, unitId: attemptId },
|
|
575
593
|
});
|
|
576
|
-
const outcome = await dispatchUnit(request, dispatcher);
|
|
577
|
-
|
|
578
|
-
|
|
594
|
+
const outcome = redactUnitOutcome(await dispatchUnit(request, dispatcher), request.sensitiveValues ?? []);
|
|
595
|
+
const finishedAt = new Date().toISOString();
|
|
596
|
+
await enqueueUnitWrite(() => withWorkflowRunsRepo((repo) => repo.immediateTransaction((db) => {
|
|
597
|
+
const run = repo.getRunById(ctx.runId);
|
|
598
|
+
if (run?.status !== "active")
|
|
599
|
+
return;
|
|
600
|
+
if (ctx.leaseHolder !== undefined && run.engine_lease_holder !== ctx.leaseHolder)
|
|
601
|
+
return;
|
|
602
|
+
repo.finishUnit({
|
|
579
603
|
runId: ctx.runId,
|
|
580
604
|
unitId: attemptId,
|
|
581
605
|
status: outcome.ok ? "completed" : "failed",
|
|
@@ -589,21 +613,22 @@ async function dispatchJournaledAttempt(input) {
|
|
|
589
613
|
// Harness-native session id (P2): journaled so resume can replay the
|
|
590
614
|
// harness's own context cache (e.g. `codex exec resume <id>`).
|
|
591
615
|
sessionId: outcome.sessionId ?? null,
|
|
592
|
-
finishedAt
|
|
593
|
-
})
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
616
|
+
finishedAt,
|
|
617
|
+
});
|
|
618
|
+
insertEventStrict(db, {
|
|
619
|
+
eventType: "workflow_unit_finished",
|
|
620
|
+
ts: finishedAt,
|
|
621
|
+
ref: ctx.workflowRef,
|
|
622
|
+
metadata: {
|
|
623
|
+
runId: ctx.runId,
|
|
624
|
+
stepId: plan.stepId,
|
|
625
|
+
unitId: attemptId,
|
|
626
|
+
status: outcome.ok ? "completed" : "failed",
|
|
627
|
+
...(outcome.failureReason ? { failureReason: outcome.failureReason } : {}),
|
|
628
|
+
...(outcome.tokens !== undefined ? { tokens: outcome.tokens } : {}),
|
|
629
|
+
},
|
|
630
|
+
});
|
|
631
|
+
})));
|
|
607
632
|
// Worktree lifecycle epilogue: a CLEAN worktree (`git status --porcelain`
|
|
608
633
|
// empty) is removed; a DIRTY one is retained and logged — the unit left
|
|
609
634
|
// uncollected work, and its journaled worktree_path says where. Cleanup is
|
|
@@ -729,8 +754,8 @@ async function resolveEnvBindings(refs) {
|
|
|
729
754
|
* agent → `executeRunner` → `runAgent` (per-harness AgentCommandBuilder)
|
|
730
755
|
* sdk → `executeRunner` → `runOpencodeSdk`
|
|
731
756
|
*
|
|
732
|
-
*
|
|
733
|
-
*
|
|
757
|
+
* Every v3 invocation names a frozen engine; no live profile/default fallback
|
|
758
|
+
* is consulted during dispatch.
|
|
734
759
|
*/
|
|
735
760
|
/**
|
|
736
761
|
* Build the platform-agnostic {@link import("../../integrations/agent/builder-shared.js").AgentDispatchRequest}
|
|
@@ -756,15 +781,14 @@ async function resolveEnvBindings(refs) {
|
|
|
756
781
|
export function buildAgentDispatchRequest(request, prompt) {
|
|
757
782
|
return {
|
|
758
783
|
prompt,
|
|
759
|
-
...(request.model ? { model: request.model } : {}),
|
|
784
|
+
...(request.invocation.model ? { model: request.invocation.model } : {}),
|
|
785
|
+
...(request.invocation.model ? { modelIsExact: true } : {}),
|
|
760
786
|
...(request.schema ? { schema: request.schema } : {}),
|
|
761
787
|
};
|
|
762
788
|
}
|
|
763
789
|
export const defaultUnitDispatcher = async (request, feedback) => {
|
|
764
|
-
const { loadConfig } = await import("../../core/config/config.js");
|
|
765
|
-
const config = loadConfig();
|
|
766
790
|
const prompt = feedback ? `${request.prompt}\n\n${feedback}` : request.prompt;
|
|
767
|
-
const resolved =
|
|
791
|
+
const resolved = frozenUnitRunner(request);
|
|
768
792
|
// `env` bindings can only reach a child process. The agent (CLI) runner
|
|
769
793
|
// spawns one per call, and the sdk runner now injects them for real via the
|
|
770
794
|
// env-keyed opencode server registry (sdk-runner.ts module doc, open seam
|
|
@@ -794,15 +818,10 @@ export const defaultUnitDispatcher = async (request, feedback) => {
|
|
|
794
818
|
}
|
|
795
819
|
if (resolved.kind === "llm") {
|
|
796
820
|
const { chatCompletion, LlmCallError } = await import("../../llm/client.js");
|
|
797
|
-
const
|
|
798
|
-
const connection = request.model
|
|
799
|
-
? { ...resolved.connection, model: resolveModel(request.model, "llm", undefined, config.modelAliases) }
|
|
800
|
-
: resolved.connection;
|
|
821
|
+
const connection = resolved.connection;
|
|
801
822
|
try {
|
|
802
823
|
const text = await chatCompletion(connection, [{ role: "user", content: prompt }], {
|
|
803
|
-
|
|
804
|
-
// 32-bit delay (setTimeout's ceiling, ~24.8 days ≈ unbounded here).
|
|
805
|
-
timeoutMs: request.timeoutMs === null ? 2 ** 31 - 1 : request.timeoutMs,
|
|
824
|
+
timeoutMs: request.timeoutMs,
|
|
806
825
|
...(request.signal ? { signal: request.signal } : {}),
|
|
807
826
|
// Native structured output where the connection supports it; the
|
|
808
827
|
// executor's subset validator still runs downstream either way.
|
|
@@ -821,8 +840,16 @@ export const defaultUnitDispatcher = async (request, feedback) => {
|
|
|
821
840
|
}
|
|
822
841
|
}
|
|
823
842
|
const { executeRunner } = await import("../../integrations/agent/runner-dispatch.js");
|
|
824
|
-
const profile = request.
|
|
825
|
-
|
|
843
|
+
const profile = request.invocation.model
|
|
844
|
+
? { ...resolved.profile, model: request.invocation.model, modelIsExact: true }
|
|
845
|
+
: resolved.profile;
|
|
846
|
+
const result = await executeRunner(resolved.kind === "sdk"
|
|
847
|
+
? {
|
|
848
|
+
kind: "sdk",
|
|
849
|
+
profile,
|
|
850
|
+
...(resolved.fallbackConnection ? { fallbackConnection: resolved.fallbackConnection } : {}),
|
|
851
|
+
}
|
|
852
|
+
: { kind: "agent", profile }, prompt, {
|
|
826
853
|
stdio: "captured",
|
|
827
854
|
parseOutput: "text",
|
|
828
855
|
timeoutMs: request.timeoutMs,
|
|
@@ -863,15 +890,44 @@ export const defaultUnitDispatcher = async (request, feedback) => {
|
|
|
863
890
|
...(result.usage ? { usage: result.usage } : {}),
|
|
864
891
|
};
|
|
865
892
|
};
|
|
893
|
+
function collectWorkflowDispatchSensitiveValues(workUnit, env) {
|
|
894
|
+
const values = new Set(Object.values(env ?? {}));
|
|
895
|
+
const addCredential = (engine) => {
|
|
896
|
+
if (!engine)
|
|
897
|
+
return;
|
|
898
|
+
if (engine.kind === "llm") {
|
|
899
|
+
for (const name of engine.credential?.names ?? []) {
|
|
900
|
+
const value = process.env[name]?.trim();
|
|
901
|
+
if (value)
|
|
902
|
+
values.add(value);
|
|
903
|
+
}
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
for (const name of engine.envPassthrough) {
|
|
907
|
+
const value = process.env[name];
|
|
908
|
+
if (!isEnvPassthroughValueSafeToExpose(name, value) && value)
|
|
909
|
+
values.add(value);
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
addCredential(workUnit.engine);
|
|
913
|
+
addCredential(workUnit.fallbackEngine);
|
|
914
|
+
return collectSensitiveValues(values);
|
|
915
|
+
}
|
|
916
|
+
function redactUnitOutcome(outcome, sensitiveValues) {
|
|
917
|
+
const redacted = redactSensitiveValue(outcome, sensitiveValues);
|
|
918
|
+
if (outcome.failureReason !== undefined && redacted.failureReason !== outcome.failureReason) {
|
|
919
|
+
redacted.failureReason = "reported_failure";
|
|
920
|
+
}
|
|
921
|
+
return redacted;
|
|
922
|
+
}
|
|
866
923
|
/**
|
|
867
924
|
* Map a typed {@link import("../../llm/client.js").LlmCallErrorCode} into the
|
|
868
925
|
* persisted `AgentFailureReason` taxonomy (agent/spawn.ts) — the ONLY
|
|
869
926
|
* vocabulary `retry.on` accepts and the journal's `failure_reason` column
|
|
870
927
|
* carries. Exhaustive over the code union (typecheck fails on drift):
|
|
871
928
|
*
|
|
872
|
-
* - `timeout` → `timeout` (wall-clock expiry
|
|
873
|
-
*
|
|
874
|
-
* folds into its timeout code)
|
|
929
|
+
* - `timeout` → `timeout` (wall-clock expiry)
|
|
930
|
+
* - `aborted` → `aborted` (caller/budget cancellation)
|
|
875
931
|
* - `rate_limited` → `llm_rate_limit` (HTTP 429 — the canonical transient)
|
|
876
932
|
* - `parse_error` / `provider_html_error`
|
|
877
933
|
* → `parse_error` (a response arrived but was not the
|
|
@@ -884,6 +940,8 @@ export const defaultUnitDispatcher = async (request, feedback) => {
|
|
|
884
940
|
*/
|
|
885
941
|
export function llmFailureReasonFor(code) {
|
|
886
942
|
switch (code) {
|
|
943
|
+
case "aborted":
|
|
944
|
+
return "aborted";
|
|
887
945
|
case "timeout":
|
|
888
946
|
return "timeout";
|
|
889
947
|
case "rate_limited":
|
|
@@ -897,58 +955,63 @@ export function llmFailureReasonFor(code) {
|
|
|
897
955
|
}
|
|
898
956
|
}
|
|
899
957
|
/**
|
|
900
|
-
* Resolve the harness `resultExtractor`
|
|
901
|
-
*
|
|
902
|
-
* `commandBuilder` wins, else its name (with the `-headless` builtin-variant
|
|
903
|
-
* suffix stripped, same derivation as BUILTIN_BUILDERS). Unknown/custom
|
|
904
|
-
* platforms resolve to no extractor — raw stdout passes through unchanged.
|
|
958
|
+
* Resolve the harness `resultExtractor` from the canonical platform frozen
|
|
959
|
+
* from the named engine. Unknown platforms pass raw stdout through unchanged.
|
|
905
960
|
*/
|
|
906
961
|
async function resolveHarnessExtractor(profile) {
|
|
907
962
|
const { getHarness } = await import("../../integrations/harnesses/index.js");
|
|
908
|
-
const
|
|
909
|
-
const harness = getHarness(platform) ?? getHarness(platform.replace(/-headless$/, ""));
|
|
963
|
+
const harness = getHarness(profile.platform ?? profile.name);
|
|
910
964
|
return harness?.resultExtractor;
|
|
911
965
|
}
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
: await requireDefaultLlm(config, request);
|
|
918
|
-
if (!connection) {
|
|
919
|
-
throw new ConfigError(`Workflow unit "${request.unitId}" wants llm profile "${request.profile}", which is not in profiles.llm.`, "LLM_NOT_CONFIGURED");
|
|
920
|
-
}
|
|
921
|
-
return { kind: "llm", connection };
|
|
922
|
-
}
|
|
923
|
-
const profileName = request.profile ?? config.defaults?.agent;
|
|
924
|
-
if (profileName) {
|
|
925
|
-
const { resolveProfileFromConfig } = await import("../../integrations/agent/config.js");
|
|
926
|
-
const profile = resolveProfileFromConfig(profileName, config);
|
|
927
|
-
if (!profile) {
|
|
928
|
-
throw new ConfigError(`Workflow unit "${request.unitId}" wants agent profile "${profileName}", which cannot be resolved. ` +
|
|
929
|
-
`Define profiles.agent."${profileName}" or set defaults.agent.`, "INVALID_CONFIG_FILE");
|
|
930
|
-
}
|
|
931
|
-
const inferred = profile.sdkMode ? "sdk" : "agent";
|
|
932
|
-
if (requested !== "inherit" && requested !== inferred) {
|
|
933
|
-
throw new ConfigError(`Workflow unit "${request.unitId}" declares runner "${requested}" but profile "${profileName}" is ${profile.sdkMode ? "an opencode-sdk (sdk) profile" : "a CLI (agent) profile"}.`, "INVALID_CONFIG_FILE");
|
|
934
|
-
}
|
|
935
|
-
return { kind: inferred, profile };
|
|
966
|
+
/** Reconstruct the existing RunnerSpec substrate from the frozen allowlist only. */
|
|
967
|
+
function frozenUnitRunner(request) {
|
|
968
|
+
const snapshot = request.engine;
|
|
969
|
+
if (snapshot.kind === "llm") {
|
|
970
|
+
return { kind: "llm", connection: materializeFrozenLlm(snapshot, request.invocation) };
|
|
936
971
|
}
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
972
|
+
const profile = {
|
|
973
|
+
name: snapshot.name,
|
|
974
|
+
platform: snapshot.platform,
|
|
975
|
+
bin: snapshot.bin,
|
|
976
|
+
args: snapshot.args,
|
|
977
|
+
stdio: "captured",
|
|
978
|
+
envPassthrough: snapshot.envPassthrough,
|
|
979
|
+
parseOutput: "text",
|
|
980
|
+
...(snapshot.workspace ? { workspace: snapshot.workspace } : {}),
|
|
981
|
+
...(request.invocation?.model ? { model: request.invocation.model } : {}),
|
|
982
|
+
...(request.invocation?.model ? { modelIsExact: true } : {}),
|
|
983
|
+
};
|
|
984
|
+
if (snapshot.runnerKind === "agent")
|
|
985
|
+
return { kind: "agent", profile };
|
|
986
|
+
// The catalog is supplied transitively by the work-list only for hashing; the
|
|
987
|
+
// SDK runner receives a frozen fallback copied into the request by its caller.
|
|
988
|
+
const fallback = request.fallbackEngine ? materializeFrozenLlm(request.fallbackEngine, undefined) : undefined;
|
|
989
|
+
return { kind: "sdk", profile, ...(fallback ? { fallbackConnection: fallback } : {}) };
|
|
944
990
|
}
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
const
|
|
948
|
-
|
|
949
|
-
|
|
991
|
+
function materializeFrozenLlm(snapshot, invocation) {
|
|
992
|
+
let apiKey;
|
|
993
|
+
for (const name of snapshot.credential?.names ?? []) {
|
|
994
|
+
const candidate = process.env[name]?.trim();
|
|
995
|
+
if (candidate) {
|
|
996
|
+
apiKey = candidate;
|
|
997
|
+
break;
|
|
998
|
+
}
|
|
950
999
|
}
|
|
951
|
-
|
|
1000
|
+
if (snapshot.credential?.required && !apiKey)
|
|
1001
|
+
throw new ConfigError(`Required engine credential ${snapshot.credential.names[0]} is not set.`, "INVALID_CONFIG_FILE");
|
|
1002
|
+
const base = {
|
|
1003
|
+
provider: snapshot.provider,
|
|
1004
|
+
endpoint: snapshot.endpoint,
|
|
1005
|
+
model: invocation?.model ?? snapshot.model,
|
|
1006
|
+
...(snapshot.temperature !== undefined ? { temperature: snapshot.temperature } : {}),
|
|
1007
|
+
...(snapshot.maxTokens !== undefined ? { maxTokens: snapshot.maxTokens } : {}),
|
|
1008
|
+
...(snapshot.supportsJsonSchema !== undefined ? { supportsJsonSchema: snapshot.supportsJsonSchema } : {}),
|
|
1009
|
+
...(snapshot.extraParams ? { extraParams: snapshot.extraParams } : {}),
|
|
1010
|
+
...(snapshot.contextLength !== undefined ? { contextLength: snapshot.contextLength } : {}),
|
|
1011
|
+
...(snapshot.enableThinking !== undefined ? { enableThinking: snapshot.enableThinking } : {}),
|
|
1012
|
+
...(apiKey ? { apiKey } : {}),
|
|
1013
|
+
};
|
|
1014
|
+
return invocation?.llm ? deepMergeConfig(base, invocation.llm) : base;
|
|
952
1015
|
}
|
|
953
1016
|
// ── Small helpers ────────────────────────────────────────────────────────────
|
|
954
1017
|
/**
|