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
|
@@ -1,276 +0,0 @@
|
|
|
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 { loadConfig } from "../../core/config/config.js";
|
|
5
|
-
import { UsageError } from "../../core/errors.js";
|
|
6
|
-
import { appendEvent } from "../../core/events.js";
|
|
7
|
-
import { withStateDb } from "../../core/state-db.js";
|
|
8
|
-
import { info, warn } from "../../core/warn.js";
|
|
9
|
-
import { getPhaseThreshold } from "../../storage/repositories/improve-runs-repository.js";
|
|
10
|
-
import { archiveProposal, getProposal, promoteProposal, recordGateDecision } from "../proposal/repository.js";
|
|
11
|
-
async function sha256Hex(input) {
|
|
12
|
-
const data = new TextEncoder().encode(input);
|
|
13
|
-
const digest = await crypto.subtle.digest("SHA-256", data);
|
|
14
|
-
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Derive a stable, low-cardinality reason bucket from an auto-accept promotion
|
|
18
|
-
* error. `promoteProposal` throws a `validateProposal` report formatted as
|
|
19
|
-
* `[kind] message` lines; we extract the first finding kind. Non-validation
|
|
20
|
-
* throws collapse to `promote-error`.
|
|
21
|
-
*/
|
|
22
|
-
function classifyPromoteFailure(err) {
|
|
23
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
24
|
-
const finding = /\[([a-z][a-z0-9-]*)\]/i.exec(message);
|
|
25
|
-
if (finding)
|
|
26
|
-
return `validation:${finding[1]}`;
|
|
27
|
-
if (/not pending/i.test(message))
|
|
28
|
-
return "not-pending";
|
|
29
|
-
if (/unknown asset type/i.test(message))
|
|
30
|
-
return "unknown-type";
|
|
31
|
-
return "promote-error";
|
|
32
|
-
}
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Gate implementation
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
/**
|
|
37
|
-
* Attempt to auto-accept each candidate proposal whose confidence meets the
|
|
38
|
-
* effective threshold. Safe to call unconditionally — returns all-empty when
|
|
39
|
-
* the gate is disabled or the run is a dry-run.
|
|
40
|
-
*
|
|
41
|
-
* @param candidates Proposals to evaluate, each with an optional confidence.
|
|
42
|
-
* @param cfg Gate configuration (phase label, thresholds, context).
|
|
43
|
-
* @param promoteFn Injectable override for `promoteProposal` (test seam).
|
|
44
|
-
*/
|
|
45
|
-
export async function runAutoAcceptGate(candidates, cfg, promoteFn = promoteProposal) {
|
|
46
|
-
const result = {
|
|
47
|
-
promoted: [],
|
|
48
|
-
skipped: [],
|
|
49
|
-
failed: [],
|
|
50
|
-
suppressed: [],
|
|
51
|
-
failedByReason: {},
|
|
52
|
-
failedBySource: {},
|
|
53
|
-
};
|
|
54
|
-
// --- Guard: gate is disabled or context is incomplete ---
|
|
55
|
-
if (cfg.dryRun || cfg.globalThreshold === undefined || !cfg.stashDir) {
|
|
56
|
-
result.skipped = candidates.map((c) => c.proposalId);
|
|
57
|
-
return result;
|
|
58
|
-
}
|
|
59
|
-
// WS-4: per-phase threshold from state.db overrides the global threshold.
|
|
60
|
-
// The per-phase value is populated by makeGateConfig when a stateDbPath is
|
|
61
|
-
// available; callers that don't pass it get the global threshold unchanged.
|
|
62
|
-
const resolvedThreshold = cfg.phaseThreshold ?? cfg.globalThreshold;
|
|
63
|
-
const effectiveThreshold = Math.max(resolvedThreshold, cfg.minimumThreshold ?? 0) / 100;
|
|
64
|
-
// WS-4: Exploration budget — promote at most N candidates regardless of
|
|
65
|
-
// confidence to prevent the gate converging to pure exploitation.
|
|
66
|
-
// Exploration candidates are chosen from the LOWEST-confidence eligible set
|
|
67
|
-
// (i.e. those that would be deferred) so the budget truly samples the low-
|
|
68
|
-
// confidence tail and is meaningfully distinct from normal auto-accept.
|
|
69
|
-
// Promoted exploration proposals are logged with eligibilitySource="exploration".
|
|
70
|
-
const explorationBudget = cfg.explorationBudgetCount ?? 0;
|
|
71
|
-
let explorationRemaining = explorationBudget;
|
|
72
|
-
const resolvedConfig = typeof cfg.config === "function" ? cfg.config() : cfg.config;
|
|
73
|
-
const gateLabel = `improve:${cfg.phase}`;
|
|
74
|
-
// #577: stamp the gate's verdict onto each proposal so `akm proposal show`
|
|
75
|
-
// can explain why a proposal is pending (e.g. "deferred: below-threshold,
|
|
76
|
-
// 0.72 < 0.90"). Best-effort — a recording failure must never abort the gate.
|
|
77
|
-
const stamp = (proposalId, decision) => {
|
|
78
|
-
try {
|
|
79
|
-
recordGateDecision(cfg.stashDir, proposalId, decision);
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
warn(`[improve] ${cfg.phase} failed to record gate decision for ${proposalId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
for (const candidate of candidates) {
|
|
86
|
-
const { proposalId, confidence } = candidate;
|
|
87
|
-
let currentProposal;
|
|
88
|
-
try {
|
|
89
|
-
currentProposal = cfg.stashDir ? getProposal(cfg.stashDir, proposalId) : undefined;
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
currentProposal = undefined;
|
|
93
|
-
}
|
|
94
|
-
const currentContentHash = currentProposal ? await sha256Hex(currentProposal.payload.content) : undefined;
|
|
95
|
-
// Determine if this candidate is exploration-eligible: below-threshold
|
|
96
|
-
// (would normally be deferred) but with a valid confidence score and budget
|
|
97
|
-
// remaining. No-confidence candidates are never exploration-promoted.
|
|
98
|
-
const belowThreshold = confidence === undefined || confidence < effectiveThreshold;
|
|
99
|
-
const isExploration = belowThreshold && confidence !== undefined && explorationRemaining > 0;
|
|
100
|
-
if (belowThreshold && !isExploration) {
|
|
101
|
-
stamp(proposalId, {
|
|
102
|
-
outcome: "deferred",
|
|
103
|
-
reason: confidence === undefined ? "no-confidence" : "below-threshold",
|
|
104
|
-
...(confidence !== undefined ? { confidence } : {}),
|
|
105
|
-
thresholds: { autoAccept: effectiveThreshold },
|
|
106
|
-
gate: gateLabel,
|
|
107
|
-
});
|
|
108
|
-
result.skipped.push(proposalId);
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
// Either above-threshold (normal auto-accept) or exploration-budget promoted.
|
|
112
|
-
if (isExploration)
|
|
113
|
-
explorationRemaining -= 1;
|
|
114
|
-
const promoteReason = isExploration ? "exploration-budget" : "above-threshold";
|
|
115
|
-
if (currentProposal?.gateDecision?.outcome === "auto-rejected" &&
|
|
116
|
-
currentProposal.gateDecision.contentHash !== undefined &&
|
|
117
|
-
currentProposal.gateDecision.contentHash === currentContentHash) {
|
|
118
|
-
result.suppressed.push(proposalId);
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
const promotion = await promoteFn(cfg.stashDir, resolvedConfig, proposalId, {}, undefined);
|
|
123
|
-
stamp(promotion.proposal.id, {
|
|
124
|
-
outcome: "auto-accepted",
|
|
125
|
-
reason: promoteReason,
|
|
126
|
-
confidence,
|
|
127
|
-
thresholds: { autoAccept: effectiveThreshold },
|
|
128
|
-
...(currentContentHash !== undefined ? { contentHash: currentContentHash } : {}),
|
|
129
|
-
gate: gateLabel,
|
|
130
|
-
});
|
|
131
|
-
// Resolve the eligibilitySource: exploration-promoted proposals get
|
|
132
|
-
// eligibilitySource="exploration" (WS-4); normal auto-accepts carry
|
|
133
|
-
// whatever the proposal was tagged with at selection time.
|
|
134
|
-
const resolvedEligibilitySource = isExploration
|
|
135
|
-
? "exploration"
|
|
136
|
-
: promotion.proposal.eligibilitySource;
|
|
137
|
-
appendEvent({
|
|
138
|
-
eventType: "promoted",
|
|
139
|
-
ref: promotion.ref,
|
|
140
|
-
metadata: {
|
|
141
|
-
proposalId: promotion.proposal.id,
|
|
142
|
-
source: promotion.proposal.source,
|
|
143
|
-
...(promotion.proposal.sourceRun !== undefined ? { sourceRun: promotion.proposal.sourceRun } : {}),
|
|
144
|
-
assetPath: promotion.assetPath,
|
|
145
|
-
autoAccept: true,
|
|
146
|
-
confidence,
|
|
147
|
-
threshold: effectiveThreshold,
|
|
148
|
-
phase: cfg.phase,
|
|
149
|
-
// Attribution tagging: carry the eligibility lane from the proposal
|
|
150
|
-
// record onto the auto-accept promoted event so the lane survives to
|
|
151
|
-
// accept time even when promotion happens in a later run.
|
|
152
|
-
...(resolvedEligibilitySource !== undefined ? { eligibilitySource: resolvedEligibilitySource } : {}),
|
|
153
|
-
// WS-4: mark exploration promotions so health/telemetry can
|
|
154
|
-
// distinguish them from calibration-signal promotions.
|
|
155
|
-
...(isExploration ? { explorationBudget: true } : {}),
|
|
156
|
-
},
|
|
157
|
-
}, cfg.eventsCtx ?? {});
|
|
158
|
-
if (isExploration) {
|
|
159
|
-
info(`[improve] exploration-accepted ${promotion.ref} (${cfg.phase}; confidence=${confidence.toFixed(2)}; budgetRemaining=${explorationRemaining})`);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
info(`[improve] auto-accepted ${promotion.ref} (${cfg.phase}; confidence=${confidence.toFixed(2)} >= threshold=${effectiveThreshold.toFixed(2)})`);
|
|
163
|
-
}
|
|
164
|
-
result.promoted.push(proposalId);
|
|
165
|
-
}
|
|
166
|
-
catch (err) {
|
|
167
|
-
const reason = classifyPromoteFailure(err);
|
|
168
|
-
warn(`[improve] ${cfg.phase} auto-accept failed for ${proposalId} (${reason}): ${err instanceof Error ? err.message : String(err)}`);
|
|
169
|
-
result.failed.push(proposalId);
|
|
170
|
-
result.failedByReason[reason] = (result.failedByReason[reason] ?? 0) + 1;
|
|
171
|
-
// Record WHY on the proposal so `akm proposal show` explains the rejection
|
|
172
|
-
// and the leak is no longer blind. Best-effort.
|
|
173
|
-
stamp(proposalId, {
|
|
174
|
-
outcome: "auto-rejected",
|
|
175
|
-
reason,
|
|
176
|
-
confidence,
|
|
177
|
-
thresholds: { autoAccept: effectiveThreshold },
|
|
178
|
-
...(currentContentHash !== undefined ? { contentHash: currentContentHash } : {}),
|
|
179
|
-
gate: gateLabel,
|
|
180
|
-
});
|
|
181
|
-
// A validation failure is permanent — the minted content can never satisfy
|
|
182
|
-
// the asset schema, so archive it as rejected instead of leaving it pending
|
|
183
|
-
// to be retried on every future run (the 90-day TTL is otherwise the first
|
|
184
|
-
// thing ever to touch these zombies). Best-effort; ctx=undefined mirrors the
|
|
185
|
-
// promoteFn call above so the archive hits the same stashDir-derived DB.
|
|
186
|
-
//
|
|
187
|
-
// Discriminate on the STRUCTURED error, not the `reason` string: promoteProposal
|
|
188
|
-
// throws UsageError("MISSING_REQUIRED_ARGUMENT") only for the validateProposal
|
|
189
|
-
// failure branch. Message-sniffing (`reason` = "validation:<kind>") would also
|
|
190
|
-
// match a transient git-push rejection ("[rejected] ... non-fast-forward") from
|
|
191
|
-
// a git-backed write target and permanently archive a valid, retryable proposal.
|
|
192
|
-
const isPermanentValidationFailure = err instanceof UsageError && err.code === "MISSING_REQUIRED_ARGUMENT";
|
|
193
|
-
if (isPermanentValidationFailure) {
|
|
194
|
-
try {
|
|
195
|
-
archiveProposal(cfg.stashDir, proposalId, "rejected", `auto-accept ${reason}`, undefined);
|
|
196
|
-
}
|
|
197
|
-
catch (archiveErr) {
|
|
198
|
-
warn(`[improve] ${cfg.phase} failed to archive validation-failed proposal ${proposalId}: ${archiveErr instanceof Error ? archiveErr.message : String(archiveErr)}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
// If exploration budget was consumed but promotion failed, restore the slot
|
|
202
|
-
// so the budget isn't exhausted on errors.
|
|
203
|
-
if (isExploration)
|
|
204
|
-
explorationRemaining += 1;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return result;
|
|
208
|
-
}
|
|
209
|
-
// ---------------------------------------------------------------------------
|
|
210
|
-
// Confidence resolvers
|
|
211
|
-
// ---------------------------------------------------------------------------
|
|
212
|
-
/**
|
|
213
|
-
* Read the confidence value for an extract proposal.
|
|
214
|
-
* Extract stores confidence at `payload.frontmatter.confidence` (set by
|
|
215
|
-
* extract.ts when the LLM response is parsed), not at the top-level field.
|
|
216
|
-
*/
|
|
217
|
-
export function resolveExtractConfidence(proposal) {
|
|
218
|
-
const fm = proposal.payload.frontmatter;
|
|
219
|
-
const fmConf = fm?.confidence;
|
|
220
|
-
if (typeof fmConf === "number")
|
|
221
|
-
return fmConf;
|
|
222
|
-
// Fall back to top-level in case a future extract version normalises the path
|
|
223
|
-
if (typeof proposal.confidence === "number")
|
|
224
|
-
return proposal.confidence;
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
|
-
// ---------------------------------------------------------------------------
|
|
228
|
-
// Config builder helpers
|
|
229
|
-
// ---------------------------------------------------------------------------
|
|
230
|
-
/**
|
|
231
|
-
* Build a gate config for a phase, inheriting global settings from the
|
|
232
|
-
* improve options. Callers supply only the phase-specific overrides.
|
|
233
|
-
*
|
|
234
|
-
* WS-4 additions:
|
|
235
|
-
* - When `shared.stateDbPath` is provided, reads the persisted per-phase
|
|
236
|
-
* threshold from `improve_gate_thresholds` (Migration 012). The phase
|
|
237
|
-
* value overrides `globalThreshold` but is still floored by
|
|
238
|
-
* `minimumThreshold`. Falls back to `globalThreshold` when no row exists.
|
|
239
|
-
* - Computes `explorationBudgetCount` from
|
|
240
|
-
* `config.improve.exploration.budgetFraction × candidateCount` when the
|
|
241
|
-
* exploration budget is enabled. Defaults to 0 (no exploration).
|
|
242
|
-
*/
|
|
243
|
-
export function makeGateConfig(phase, shared, overrides = {}) {
|
|
244
|
-
// WS-4: read per-phase threshold from state.db when available.
|
|
245
|
-
let phaseThreshold;
|
|
246
|
-
if (shared.stateDbPath && shared.globalThreshold !== undefined) {
|
|
247
|
-
try {
|
|
248
|
-
phaseThreshold = withStateDb((db) => getPhaseThreshold(db, phase) ?? undefined, {
|
|
249
|
-
path: shared.stateDbPath,
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
catch {
|
|
253
|
-
// DB unavailable — fall back to globalThreshold silently.
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// WS-4: compute exploration budget count from config fraction × candidateCount.
|
|
257
|
-
let explorationBudgetCount;
|
|
258
|
-
const resolvedConfig = typeof shared.config === "function" ? shared.config() : shared.config;
|
|
259
|
-
const explorationCfg = resolvedConfig.improve?.exploration;
|
|
260
|
-
if (explorationCfg?.enabled && shared.candidateCount !== undefined && shared.candidateCount > 0) {
|
|
261
|
-
const fraction = Math.min(1, Math.max(0, explorationCfg.budgetFraction ?? 0.05));
|
|
262
|
-
explorationBudgetCount = Math.max(0, Math.floor(fraction * shared.candidateCount));
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
phase,
|
|
266
|
-
globalThreshold: shared.globalThreshold,
|
|
267
|
-
...(phaseThreshold !== undefined ? { phaseThreshold } : {}),
|
|
268
|
-
dryRun: shared.dryRun,
|
|
269
|
-
stashDir: shared.stashDir,
|
|
270
|
-
config: shared.config,
|
|
271
|
-
eventsCtx: shared.eventsCtx,
|
|
272
|
-
...(explorationBudgetCount !== undefined && explorationBudgetCount > 0 ? { explorationBudgetCount } : {}),
|
|
273
|
-
...overrides,
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
export { loadConfig };
|
|
@@ -1,168 +0,0 @@
|
|
|
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 profileCatchup from "../../assets/profiles/catchup.json" with { type: "json" };
|
|
5
|
-
import profileConsolidate from "../../assets/profiles/consolidate.json" with { type: "json" };
|
|
6
|
-
import profileDefault from "../../assets/profiles/default.json" with { type: "json" };
|
|
7
|
-
import profileFrequent from "../../assets/profiles/frequent.json" with { type: "json" };
|
|
8
|
-
import profileGraphRefresh from "../../assets/profiles/graph-refresh.json" with { type: "json" };
|
|
9
|
-
import profileMemoryFocus from "../../assets/profiles/memory-focus.json" with { type: "json" };
|
|
10
|
-
import profileProactiveMaintenance from "../../assets/profiles/proactive-maintenance.json" with { type: "json" };
|
|
11
|
-
import profileQuick from "../../assets/profiles/quick.json" with { type: "json" };
|
|
12
|
-
import profileRecombineOnly from "../../assets/profiles/recombine-only.json" with { type: "json" };
|
|
13
|
-
import profileReflectDistill from "../../assets/profiles/reflect-distill.json" with { type: "json" };
|
|
14
|
-
import profileSynthesize from "../../assets/profiles/synthesize.json" with { type: "json" };
|
|
15
|
-
import profileThorough from "../../assets/profiles/thorough.json" with { type: "json" };
|
|
16
|
-
import { parseAssetRef } from "../../core/asset/asset-ref.js";
|
|
17
|
-
import { ConfigError } from "../../core/errors.js";
|
|
18
|
-
/** Profile name used as the final fallback when nothing else resolves. */
|
|
19
|
-
const FALLBACK_PROFILE_NAME = "default";
|
|
20
|
-
// Built-in default allowed types per process
|
|
21
|
-
export const DEFAULT_ALLOWED_TYPES = {
|
|
22
|
-
reflect: ["agent", "command", "knowledge", "lesson", "memory", "skill", "wiki", "workflow"],
|
|
23
|
-
distill: ["memory"],
|
|
24
|
-
consolidate: ["memory"],
|
|
25
|
-
};
|
|
26
|
-
// Built-in profiles are loaded from embedded JSON files in src/assets/profiles/.
|
|
27
|
-
// To add a new profile: create a new .json file there, import it above, and add
|
|
28
|
-
// it to this map. No code change needed beyond those two steps.
|
|
29
|
-
const BUILTIN_PROFILES = {
|
|
30
|
-
default: profileDefault,
|
|
31
|
-
quick: profileQuick,
|
|
32
|
-
thorough: profileThorough,
|
|
33
|
-
"memory-focus": profileMemoryFocus,
|
|
34
|
-
"graph-refresh": profileGraphRefresh,
|
|
35
|
-
frequent: profileFrequent,
|
|
36
|
-
consolidate: profileConsolidate,
|
|
37
|
-
catchup: profileCatchup,
|
|
38
|
-
synthesize: profileSynthesize,
|
|
39
|
-
"reflect-distill": profileReflectDistill,
|
|
40
|
-
"proactive-maintenance": profileProactiveMaintenance,
|
|
41
|
-
"recombine-only": profileRecombineOnly,
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Default enabled-state for known improve processes when neither the user
|
|
45
|
-
* profile nor the built-in default profile specifies an override.
|
|
46
|
-
*
|
|
47
|
-
* These mirror the legacy `LlmFeatureFlags` defaults so callers that bypass
|
|
48
|
-
* the profile system (rare — most run through `resolveImproveProfile`) get
|
|
49
|
-
* the same answer.
|
|
50
|
-
*/
|
|
51
|
-
const IMPROVE_PROCESS_DEFAULTS = {
|
|
52
|
-
reflect: true,
|
|
53
|
-
distill: true,
|
|
54
|
-
consolidate: true,
|
|
55
|
-
memoryInference: true,
|
|
56
|
-
graphExtraction: true,
|
|
57
|
-
validation: false,
|
|
58
|
-
// session-extraction reads native session files from claude-code / opencode
|
|
59
|
-
// and queues durable-insight proposals. Default on — opt out via
|
|
60
|
-
// profiles.improve.default.processes.extract.enabled: false.
|
|
61
|
-
extract: true,
|
|
62
|
-
// proposal-queue triage drains the standing backlog. Opt-in (default off),
|
|
63
|
-
// like `validation` — needs an explicit `enabled: true`.
|
|
64
|
-
triage: false,
|
|
65
|
-
// Layer 2 proactive-maintenance selector. Opt-in (default off) — surfaces
|
|
66
|
-
// stale high-value assets on a schedule. Enable per-profile with an explicit
|
|
67
|
-
// `processes.proactiveMaintenance.enabled: true`.
|
|
68
|
-
proactiveMaintenance: false,
|
|
69
|
-
// #609 recombine / synthesize pass — whole-corpus cross-episodic
|
|
70
|
-
// generalization. Opt-in (default off); enable per-profile with an explicit
|
|
71
|
-
// `processes.recombine.enabled: true`.
|
|
72
|
-
recombine: false,
|
|
73
|
-
// #615 procedural-compilation pass — detects recurring successful ordered
|
|
74
|
-
// action sequences and compiles them into workflow proposals. Opt-in (default
|
|
75
|
-
// off); enable per-profile with an explicit `processes.procedural.enabled: true`.
|
|
76
|
-
procedural: false,
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* Compute the effective enabled-state for a named improve process.
|
|
80
|
-
*
|
|
81
|
-
* Resolution order: explicit `profile.processes.<name>.enabled` (boolean) →
|
|
82
|
-
* the built-in {@link IMPROVE_PROCESS_DEFAULTS} fallback → `false`.
|
|
83
|
-
*/
|
|
84
|
-
export function resolveProcessEnabled(processName, profile) {
|
|
85
|
-
const processes = profile.processes;
|
|
86
|
-
const entry = processes?.[processName];
|
|
87
|
-
if (entry && typeof entry.enabled === "boolean")
|
|
88
|
-
return entry.enabled;
|
|
89
|
-
return IMPROVE_PROCESS_DEFAULTS[processName] ?? false;
|
|
90
|
-
}
|
|
91
|
-
function deepMerge(base, override) {
|
|
92
|
-
if (typeof base !== "object" || base === null)
|
|
93
|
-
return override ?? base;
|
|
94
|
-
const result = { ...base };
|
|
95
|
-
for (const key of Object.keys(override)) {
|
|
96
|
-
const ov = override[key];
|
|
97
|
-
// Treat `null` the same as `undefined` so user overrides never wipe a
|
|
98
|
-
// built-in field with `null`. The on-disk parser already strips nulls,
|
|
99
|
-
// but the programmatic API exposes this path and callers occasionally
|
|
100
|
-
// pass JSON-shaped objects with explicit nulls.
|
|
101
|
-
if (ov !== undefined && ov !== null) {
|
|
102
|
-
const bv = base[key];
|
|
103
|
-
if (typeof bv === "object" && bv !== null && typeof ov === "object" && ov !== null && !Array.isArray(bv)) {
|
|
104
|
-
result[key] = deepMerge(bv, ov);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
result[key] = ov;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return result;
|
|
112
|
-
}
|
|
113
|
-
export function resolveImproveProfile(name, config) {
|
|
114
|
-
const requestedName = name ??
|
|
115
|
-
(typeof config.defaults?.improve === "string" ? config.defaults.improve : undefined) ??
|
|
116
|
-
FALLBACK_PROFILE_NAME;
|
|
117
|
-
const hasBuiltin = requestedName in BUILTIN_PROFILES;
|
|
118
|
-
const hasUserDefined = !!config.profiles?.improve?.[requestedName];
|
|
119
|
-
// An unknown profile name is a HARD error. Silently falling back to the
|
|
120
|
-
// default (proactive-off) profile is the −96% incident class: a cron pinned
|
|
121
|
-
// to `--profile reflect-distill` ran the default for weeks because the name
|
|
122
|
-
// only existed in one host's config and the resolver swallowed the miss.
|
|
123
|
-
if (!hasBuiltin && !hasUserDefined) {
|
|
124
|
-
const valid = [
|
|
125
|
-
...new Set([...Object.keys(BUILTIN_PROFILES), ...Object.keys(config.profiles?.improve ?? {})]),
|
|
126
|
-
].sort();
|
|
127
|
-
throw new ConfigError(`Improve profile "${requestedName}" not found. Valid profiles: ${valid.join(", ")}.`, "UNKNOWN_IMPROVE_PROFILE");
|
|
128
|
-
}
|
|
129
|
-
const builtin = BUILTIN_PROFILES[requestedName] ?? BUILTIN_PROFILES[FALLBACK_PROFILE_NAME];
|
|
130
|
-
const userOverride = config.profiles?.improve?.[requestedName] ?? {};
|
|
131
|
-
return deepMerge(builtin, userOverride);
|
|
132
|
-
}
|
|
133
|
-
export function shouldSkipRef(ref, processName, profile) {
|
|
134
|
-
const cfg = profile.processes?.[processName];
|
|
135
|
-
// Check if the process itself is disabled
|
|
136
|
-
if (cfg?.enabled === false)
|
|
137
|
-
return { skip: true, reason: "process-disabled" };
|
|
138
|
-
const parsed = parseAssetRef(ref);
|
|
139
|
-
const allowed = cfg?.allowedTypes ?? DEFAULT_ALLOWED_TYPES[processName];
|
|
140
|
-
if (!allowed.includes(parsed.type))
|
|
141
|
-
return { skip: true, reason: "type-filter" };
|
|
142
|
-
// Hardcoded: wiki raw directories are never processed by any improve process.
|
|
143
|
-
if (parsed.type === "wiki" && parsed.name.split("/")[1] === "raw") {
|
|
144
|
-
return { skip: true, reason: "raw-wiki" };
|
|
145
|
-
}
|
|
146
|
-
return { skip: false, reason: "" };
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Planner-level pre-filter: return `true` when every per-ref improve pass that
|
|
150
|
-
* participates in the in-loop dispatch (today: `reflect` and `distill`) would
|
|
151
|
-
* refuse this ref under the active profile. Such refs cannot produce any work
|
|
152
|
-
* downstream — they only generate synthetic skip actions and inflate
|
|
153
|
-
* `plannedRefs` by a constant factor per cron run.
|
|
154
|
-
*
|
|
155
|
-
* Companion to `shouldSkipRef`. The 2026-05-27 planner/profile/metrics deep
|
|
156
|
-
* analysis (`/tmp/akm-health-investigations/planner-profile-metrics-deep-analysis.md`)
|
|
157
|
-
* documents the 99.07% synthetic-skip emission rate this pre-filter eliminates.
|
|
158
|
-
*
|
|
159
|
-
* NOTE: passes that operate on their own candidate set (consolidate,
|
|
160
|
-
* memoryInference, graphExtraction) are deliberately excluded — they do not
|
|
161
|
-
* iterate `plannedRefs` per-ref, so a ref being profile-incompatible at the
|
|
162
|
-
* reflect+distill layer says nothing about their work.
|
|
163
|
-
*/
|
|
164
|
-
export function isProfileFilteredForAllPasses(ref, profile) {
|
|
165
|
-
const reflectSkip = shouldSkipRef(ref, "reflect", profile);
|
|
166
|
-
const distillSkip = shouldSkipRef(ref, "distill", profile);
|
|
167
|
-
return reflectSkip.skip && distillSkip.skip;
|
|
168
|
-
}
|