akm-cli 0.9.0-rc.0 → 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 +1283 -22
- 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/prompts/workflow-unit-preamble.md +26 -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 +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- 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/migration-help.js +7 -4
- 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 +232 -121
- 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 -834
- 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/json-schema.js +142 -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 -34
- 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 -56
- 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 +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- 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 +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- 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 +14 -279
- 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 +11 -39
- 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 -1164
- 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 +3 -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 +240 -19
- 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/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- 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/schemas/akm-workflow.json +373 -0
- 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 -259
- 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 -1413
- 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 -49
- 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/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- 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/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { deepMergeConfig } from "../../core/config/deep-merge.js";
|
|
6
|
+
import { ConfigError, UsageError } from "../../core/errors.js";
|
|
7
|
+
import { DEFAULT_AGENT_TIMEOUT_MS, DEFAULT_LLM_TIMEOUT_MS } from "../../integrations/agent/config.js";
|
|
8
|
+
import { resolveLlmEngineUse, } from "../../integrations/agent/engine-resolution.js";
|
|
9
|
+
import { resolveLlmModel, resolveModel } from "../../integrations/agent/model-aliases.js";
|
|
10
|
+
import { getBuiltinAgentProfile } from "../../integrations/agent/profiles.js";
|
|
11
|
+
import { HARNESS_BY_ID } from "../../integrations/harnesses/index.js";
|
|
12
|
+
import { workflowMaxConcurrency } from "../concurrency-policy.js";
|
|
13
|
+
import { compileWorkflowPlan } from "./compile.js";
|
|
14
|
+
import { decodeWorkflowPlanV3, WORKFLOW_IR_VERSION } from "./schema.js";
|
|
15
|
+
/**
|
|
16
|
+
* The only source-to-runtime boundary. Source compilation remains pure; engine
|
|
17
|
+
* selection and every dispatch-significant setting are resolved here once.
|
|
18
|
+
*/
|
|
19
|
+
export function compileResolveFreezeWorkflow(asset, config) {
|
|
20
|
+
const preliminary = compilePlan(asset);
|
|
21
|
+
const engines = {};
|
|
22
|
+
const maxConcurrency = frozenConcurrency(config);
|
|
23
|
+
const documentDefaults = asset.document.defaults;
|
|
24
|
+
const freezeInvocation = (unit) => {
|
|
25
|
+
const layers = [...(documentDefaults ? [documentDefaults] : []), ...(unit ? [unit] : [])];
|
|
26
|
+
const name = selectedEngine(config, layers);
|
|
27
|
+
if (!name)
|
|
28
|
+
throw new ConfigError("No workflow engine is selected. Set defaults.engine or workflow defaults.engine.", "INVALID_CONFIG_FILE");
|
|
29
|
+
const engine = engineDefinition(config, name);
|
|
30
|
+
addSnapshot(config, name, engines);
|
|
31
|
+
const model = exactModel(config, name, engine, layers);
|
|
32
|
+
const timeoutMs = effectiveTimeout(config, engine, layers);
|
|
33
|
+
const llm = engine.kind === "llm" ? mergedLlmOverrides(layers) : undefined;
|
|
34
|
+
if (engine.kind !== "llm" && llm !== undefined) {
|
|
35
|
+
throw new ConfigError(`Workflow engine "${name}" is an agent engine and cannot receive llm overrides.`, "INVALID_CONFIG_FILE");
|
|
36
|
+
}
|
|
37
|
+
return { engine: name, model, timeoutMs, ...(llm ? { llm } : {}) };
|
|
38
|
+
};
|
|
39
|
+
const freezeUnit = (node, unit) => ({
|
|
40
|
+
kind: "unit",
|
|
41
|
+
id: node.id,
|
|
42
|
+
instructions: node.instructions,
|
|
43
|
+
templating: node.templating ?? "verbatim",
|
|
44
|
+
...(node.inputs && node.inputs.length > 0 ? { inputs: node.inputs } : {}),
|
|
45
|
+
invocation: freezeInvocation(unit),
|
|
46
|
+
...(node.schema ? { schema: node.schema } : {}),
|
|
47
|
+
...(node.retry ? { retry: node.retry } : {}),
|
|
48
|
+
onError: node.onError,
|
|
49
|
+
...(node.env ? { env: node.env } : {}),
|
|
50
|
+
isolation: node.isolation ?? "none",
|
|
51
|
+
...(node.source ? { source: node.source } : {}),
|
|
52
|
+
});
|
|
53
|
+
const steps = preliminary.steps.map((step, index) => {
|
|
54
|
+
const sourceStep = asset.document.steps[index];
|
|
55
|
+
const sourceUnit = sourceStep?.map ? sourceStep.map.unit : sourceStep?.unit;
|
|
56
|
+
const root = step.root
|
|
57
|
+
? step.root.kind === "map"
|
|
58
|
+
? {
|
|
59
|
+
kind: "map",
|
|
60
|
+
id: step.root.id,
|
|
61
|
+
over: step.root.over,
|
|
62
|
+
template: freezeUnit(step.root.template, sourceUnit),
|
|
63
|
+
concurrency: step.root.concurrency ?? 1,
|
|
64
|
+
reducer: step.root.reducer,
|
|
65
|
+
...(step.root.source ? { source: step.root.source } : {}),
|
|
66
|
+
}
|
|
67
|
+
: freezeUnit(step.root, sourceUnit)
|
|
68
|
+
: undefined;
|
|
69
|
+
const criteria = step.gate.criteria;
|
|
70
|
+
const judge = criteria.length === 0 ? null : freezeGateJudge(config, engines);
|
|
71
|
+
const gate = {
|
|
72
|
+
kind: "gate",
|
|
73
|
+
id: `${step.stepId}.gate`,
|
|
74
|
+
stepId: step.stepId,
|
|
75
|
+
criteria,
|
|
76
|
+
maxLoops: step.gate.maxLoops ?? 1,
|
|
77
|
+
judge,
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
stepId: step.stepId,
|
|
81
|
+
title: step.title,
|
|
82
|
+
sequenceIndex: step.sequenceIndex,
|
|
83
|
+
...(root ? { root } : {}),
|
|
84
|
+
...(step.route ? { route: step.route } : {}),
|
|
85
|
+
...(step.outputSchema ? { outputSchema: step.outputSchema } : {}),
|
|
86
|
+
gate,
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
const plan = decodeWorkflowPlanV3({
|
|
90
|
+
irVersion: WORKFLOW_IR_VERSION,
|
|
91
|
+
title: preliminary.title,
|
|
92
|
+
...(preliminary.params ? { params: preliminary.params } : {}),
|
|
93
|
+
...(preliminary.paramSchemas ? { paramSchemas: preliminary.paramSchemas } : {}),
|
|
94
|
+
...(preliminary.budget ? { budget: preliminary.budget } : {}),
|
|
95
|
+
execution: { maxConcurrency, engines },
|
|
96
|
+
steps,
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
warnings: preliminary.warnings,
|
|
100
|
+
plan,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function compilePlan(asset) {
|
|
104
|
+
const compiled = compileWorkflowPlan(asset.document, asset.title);
|
|
105
|
+
if (!compiled.ok)
|
|
106
|
+
throw new UsageError(compiled.errors.map((error) => `${asset.path}:${error.line}: ${error.message}`).join("\n"));
|
|
107
|
+
return { ...compiled.plan, warnings: compiled.warnings };
|
|
108
|
+
}
|
|
109
|
+
function selectedEngine(config, layers) {
|
|
110
|
+
for (let index = layers.length - 1; index >= 0; index--)
|
|
111
|
+
if (layers[index]?.engine !== undefined)
|
|
112
|
+
return layers[index]?.engine;
|
|
113
|
+
return config.defaults?.engine;
|
|
114
|
+
}
|
|
115
|
+
function engineDefinition(config, name) {
|
|
116
|
+
const engine = config.engines?.[name];
|
|
117
|
+
if (!engine)
|
|
118
|
+
throw new ConfigError(`Engine "${name}" is not configured.`, "INVALID_CONFIG_FILE");
|
|
119
|
+
return engine;
|
|
120
|
+
}
|
|
121
|
+
function exactModel(config, name, engine, layers) {
|
|
122
|
+
let selected;
|
|
123
|
+
for (const layer of layers)
|
|
124
|
+
if (layer.model !== undefined)
|
|
125
|
+
selected = layer.model;
|
|
126
|
+
selected ??= engine.model;
|
|
127
|
+
if (!selected) {
|
|
128
|
+
if (engine.kind === "llm")
|
|
129
|
+
throw new ConfigError(`LLM engine "${name}" has no model.`, "INVALID_CONFIG_FILE");
|
|
130
|
+
if (engine.platform === "opencode-sdk") {
|
|
131
|
+
const fallbackName = engine.llmEngine ?? config.defaults?.llmEngine;
|
|
132
|
+
if (fallbackName) {
|
|
133
|
+
const fallback = engineDefinition(config, fallbackName);
|
|
134
|
+
if (fallback.kind !== "llm") {
|
|
135
|
+
throw new ConfigError(`SDK engine "${name}" fallback "${fallbackName}" is not an LLM engine.`, "INVALID_CONFIG_FILE");
|
|
136
|
+
}
|
|
137
|
+
return exactModel(config, fallbackName, fallback, []);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
if (engine.kind === "llm")
|
|
143
|
+
return resolveLlmModel(selected, name, config.modelAliases);
|
|
144
|
+
return resolveModel(selected, engine.platform, engine.modelAliases, config.modelAliases);
|
|
145
|
+
}
|
|
146
|
+
function effectiveTimeout(config, engine, layers) {
|
|
147
|
+
for (let index = layers.length - 1; index >= 0; index--) {
|
|
148
|
+
if (Object.hasOwn(layers[index] ?? {}, "timeoutMs"))
|
|
149
|
+
return layers[index]?.timeoutMs ?? null;
|
|
150
|
+
}
|
|
151
|
+
if (Object.hasOwn(engine, "timeoutMs"))
|
|
152
|
+
return engine.timeoutMs ?? null;
|
|
153
|
+
if (engine.kind === "llm")
|
|
154
|
+
return DEFAULT_LLM_TIMEOUT_MS;
|
|
155
|
+
if (engine.platform === "opencode-sdk") {
|
|
156
|
+
const fallbackName = engine.llmEngine ?? config.defaults?.llmEngine;
|
|
157
|
+
if (fallbackName) {
|
|
158
|
+
const fallback = engineDefinition(config, fallbackName);
|
|
159
|
+
if (fallback.kind === "llm") {
|
|
160
|
+
return Object.hasOwn(fallback, "timeoutMs") ? (fallback.timeoutMs ?? null) : DEFAULT_LLM_TIMEOUT_MS;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return DEFAULT_AGENT_TIMEOUT_MS;
|
|
165
|
+
}
|
|
166
|
+
function mergedLlmOverrides(layers) {
|
|
167
|
+
let merged;
|
|
168
|
+
for (const layer of layers)
|
|
169
|
+
if (layer.llm)
|
|
170
|
+
merged = deepMergeConfig(merged ?? {}, layer.llm);
|
|
171
|
+
return merged;
|
|
172
|
+
}
|
|
173
|
+
function addSnapshot(config, name, target) {
|
|
174
|
+
if (target[name])
|
|
175
|
+
return;
|
|
176
|
+
const engine = engineDefinition(config, name);
|
|
177
|
+
if (engine.kind === "llm") {
|
|
178
|
+
const resolved = resolveLlmEngineUse(config, [{ engine: name }]);
|
|
179
|
+
const snapshot = {
|
|
180
|
+
name,
|
|
181
|
+
kind: "llm",
|
|
182
|
+
endpoint: engine.endpoint,
|
|
183
|
+
model: exactModel(config, name, engine, []),
|
|
184
|
+
concurrency: engine.concurrency ?? 1,
|
|
185
|
+
...(engine.provider ? { provider: engine.provider } : {}),
|
|
186
|
+
...(resolved.credential ? { credential: resolved.credential } : {}),
|
|
187
|
+
...(engine.temperature !== undefined ? { temperature: engine.temperature } : {}),
|
|
188
|
+
...(engine.maxTokens !== undefined ? { maxTokens: engine.maxTokens } : {}),
|
|
189
|
+
...(engine.supportsJsonSchema !== undefined ? { supportsJsonSchema: engine.supportsJsonSchema } : {}),
|
|
190
|
+
...(engine.extraParams ? { extraParams: engine.extraParams } : {}),
|
|
191
|
+
...(engine.contextLength !== undefined ? { contextLength: engine.contextLength } : {}),
|
|
192
|
+
...(engine.enableThinking !== undefined ? { enableThinking: engine.enableThinking } : {}),
|
|
193
|
+
};
|
|
194
|
+
target[name] = snapshot;
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const harness = HARNESS_BY_ID.get(engine.platform);
|
|
198
|
+
if (!harness?.capabilities.agentDispatch)
|
|
199
|
+
throw new ConfigError(`Engine "${name}" cannot dispatch platform ${engine.platform}.`, "INVALID_CONFIG_FILE");
|
|
200
|
+
const sdk = engine.platform === "opencode-sdk";
|
|
201
|
+
const builtin = getBuiltinAgentProfile(engine.platform);
|
|
202
|
+
const fallback = sdk ? (engine.llmEngine ?? config.defaults?.llmEngine ?? null) : null;
|
|
203
|
+
if (fallback)
|
|
204
|
+
addSnapshot(config, fallback, target);
|
|
205
|
+
const snapshot = {
|
|
206
|
+
name,
|
|
207
|
+
kind: "agent",
|
|
208
|
+
runnerKind: sdk ? "sdk" : "agent",
|
|
209
|
+
platform: engine.platform,
|
|
210
|
+
bin: engine.bin ?? builtin?.bin ?? (sdk ? "opencode" : engine.platform),
|
|
211
|
+
args: [...(engine.args ?? builtin?.args ?? [])],
|
|
212
|
+
workspace: engine.workspace ? path.resolve(engine.workspace) : null,
|
|
213
|
+
envPassthrough: [...(builtin?.envPassthrough ?? [])],
|
|
214
|
+
commandBuilder: engine.platform,
|
|
215
|
+
fallbackLlmEngine: fallback,
|
|
216
|
+
};
|
|
217
|
+
target[name] = snapshot;
|
|
218
|
+
}
|
|
219
|
+
function freezeGateJudge(config, engines) {
|
|
220
|
+
const resolved = resolveLlmEngineUse(config, [], { optional: true });
|
|
221
|
+
if (!resolved)
|
|
222
|
+
return null;
|
|
223
|
+
addSnapshot(config, resolved.engine, engines);
|
|
224
|
+
return {
|
|
225
|
+
engine: resolved.engine,
|
|
226
|
+
model: exactModel(config, resolved.engine, engineDefinition(config, resolved.engine), []),
|
|
227
|
+
timeoutMs: resolved.timeoutMs,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function frozenConcurrency(config) {
|
|
231
|
+
const configured = config.workflow?.maxConcurrency;
|
|
232
|
+
return workflowMaxConcurrency(typeof configured === "number" && Number.isFinite(configured) ? configured : undefined);
|
|
233
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* Run-parameter validation against the frozen plan's param schemas (reviewer
|
|
6
|
+
* #12). A program can declare `params.files: { type: array }`; supplying
|
|
7
|
+
* `--params '{"files":"not-an-array"}'` must be rejected at start rather than
|
|
8
|
+
* silently flowing into a unit prompt. The schemas are frozen into the plan
|
|
9
|
+
* ({@link WorkflowPlanGraph.paramSchemas}, program path only) so validation is
|
|
10
|
+
* a pure function of the frozen plan and the supplied params — no live-asset
|
|
11
|
+
* re-read.
|
|
12
|
+
*
|
|
13
|
+
* Uses the same bounded {@link validateJsonSchemaSubset} the engine applies to
|
|
14
|
+
* unit output: undeclared params are permitted (the schema map only constrains
|
|
15
|
+
* the params it names), and a workflow with no declared schemas (every Markdown
|
|
16
|
+
* workflow, and programs without a `params:` block) validates trivially.
|
|
17
|
+
*
|
|
18
|
+
* Pure module: no IO, no engine imports.
|
|
19
|
+
*/
|
|
20
|
+
import { UsageError } from "../../core/errors.js";
|
|
21
|
+
import { validateJsonSchemaSubset } from "../../core/json-schema.js";
|
|
22
|
+
/**
|
|
23
|
+
* Validate a run's supplied params against the plan's frozen param schemas.
|
|
24
|
+
* Returns a flat list of human-readable, path-prefixed error strings (empty =
|
|
25
|
+
* valid). Params the plan does not declare a schema for are not constrained.
|
|
26
|
+
*/
|
|
27
|
+
export function validateWorkflowParams(plan, params) {
|
|
28
|
+
const schemas = plan.paramSchemas;
|
|
29
|
+
if (!schemas || Object.keys(schemas).length === 0)
|
|
30
|
+
return [];
|
|
31
|
+
// Validate the params object as a whole against a synthetic object schema
|
|
32
|
+
// whose `properties` are the declared param schemas. Missing declared params
|
|
33
|
+
// are NOT required (params may be optional / defaulted downstream); only a
|
|
34
|
+
// PRESENT param that violates its declared schema is an error.
|
|
35
|
+
// Re-root the validator's `$` JSON-pointer prefix to `params` for messages
|
|
36
|
+
// that read naturally in a start/CLI error (e.g. `params.files: expected …`).
|
|
37
|
+
return validateJsonSchemaSubset(params, { type: "object", properties: schemas }).map((e) => e.replace(/^\$/, "params"));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Brief/report integrity assert (reviewer #12): the journaled `params_json`
|
|
41
|
+
* row must STILL satisfy the frozen param schemas. `startWorkflowRun` already
|
|
42
|
+
* validated the params it stored, so a violation here means the row was edited
|
|
43
|
+
* after the run started — loud corruption, exactly like the frozen-plan hash
|
|
44
|
+
* mismatch and the tampered-params replay-divergence path. Refuse to describe
|
|
45
|
+
* or drive the run rather than resolve prompts from schema-violating params.
|
|
46
|
+
*/
|
|
47
|
+
export function assertRunParamsSatisfyPlan(runId, plan, params) {
|
|
48
|
+
const errors = validateWorkflowParams(plan, params);
|
|
49
|
+
if (errors.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
throw new UsageError(`Workflow run ${runId} failed the frozen param-schema integrity check: the journaled params row no longer ` +
|
|
52
|
+
`satisfies the workflow's declared parameter schemas (edited after the run started). Refusing to execute it. ` +
|
|
53
|
+
`Start a new run.\n${errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
54
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* Plan hashing for the frozen-plan contract (redesign addendum, R1).
|
|
6
|
+
*
|
|
7
|
+
* `workflow start` persists `plan_json` + `plan_hash` on the run row
|
|
8
|
+
* (migration 006); every later invocation executes that snapshot. The hash is
|
|
9
|
+
* the sha256 (hex) of the plan's CANONICAL JSON — object keys recursively
|
|
10
|
+
* sorted — so two structurally-equal plans hash identically regardless of key
|
|
11
|
+
* insertion order, and the same program always freezes to the same hash.
|
|
12
|
+
*
|
|
13
|
+
* Pure module: no IO beyond node:crypto, no engine imports.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from "node:crypto";
|
|
16
|
+
import { utf8Bytes, WORKFLOW_MAX_JSON_DEPTH, WORKFLOW_MAX_PLAN_BYTES } from "../resource-limits.js";
|
|
17
|
+
import { decodeWorkflowPlanV3 } from "./schema.js";
|
|
18
|
+
/** sha256 hex of the canonical (recursively sorted-keys) JSON of the plan. */
|
|
19
|
+
export function computePlanHash(plan) {
|
|
20
|
+
return createHash("sha256").update(canonicalPlanJson(plan)).digest("hex");
|
|
21
|
+
}
|
|
22
|
+
/** The canonical JSON string the hash is computed over (also what to persist). */
|
|
23
|
+
export function canonicalPlanJson(plan) {
|
|
24
|
+
return canonicalJson(plan);
|
|
25
|
+
}
|
|
26
|
+
/** Canonical JSON used by every v3 plan and input hash. */
|
|
27
|
+
export function canonicalJson(value) {
|
|
28
|
+
return JSON.stringify(sortKeys(value));
|
|
29
|
+
}
|
|
30
|
+
/** Decode, require stored canonical bytes, then verify the stored SHA-256. */
|
|
31
|
+
export function decodeCanonicalPlan(runId, planJson, planHash) {
|
|
32
|
+
if (utf8Bytes(planJson) > WORKFLOW_MAX_PLAN_BYTES)
|
|
33
|
+
throw new Error(`Workflow run ${runId} frozen plan exceeds the 2 MiB resource limit.`);
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = JSON.parse(planJson);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error(`Workflow run ${runId} has corrupt frozen plan JSON.`);
|
|
40
|
+
}
|
|
41
|
+
const plan = decodeWorkflowPlanV3(parsed);
|
|
42
|
+
const canonical = canonicalPlanJson(plan);
|
|
43
|
+
if (planJson !== canonical)
|
|
44
|
+
throw new Error(`Workflow run ${runId} has noncanonical frozen plan JSON.`);
|
|
45
|
+
const actual = computePlanHash(plan);
|
|
46
|
+
if (!planHash || !/^[0-9a-f]{64}$/.test(planHash) || actual !== planHash)
|
|
47
|
+
throw new Error(`Workflow run ${runId} frozen plan integrity check failed.`);
|
|
48
|
+
return plan;
|
|
49
|
+
}
|
|
50
|
+
function sortKeys(value, depth = 0) {
|
|
51
|
+
if (depth > WORKFLOW_MAX_JSON_DEPTH)
|
|
52
|
+
throw new TypeError("JSON value exceeds maximum depth");
|
|
53
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
54
|
+
return value;
|
|
55
|
+
if (typeof value === "number") {
|
|
56
|
+
if (!Number.isFinite(value))
|
|
57
|
+
throw new TypeError("JSON values must be finite");
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
if (Array.isArray(value))
|
|
61
|
+
return value.map((item) => sortKeys(item, depth + 1));
|
|
62
|
+
if (value && typeof value === "object") {
|
|
63
|
+
return Object.fromEntries(Object.entries(value)
|
|
64
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
65
|
+
.map(([k, v]) => [k, sortKeys(v, depth + 1)]));
|
|
66
|
+
}
|
|
67
|
+
throw new TypeError("JSON value contains a non-JSON value");
|
|
68
|
+
}
|