akm-cli 0.9.0-rc.1 → 0.9.0-rc.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1190 -52
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +13 -9
- package/dist/commands/env/env-cli.js +76 -159
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +75 -228
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -855
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -73
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -58
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +8 -3
- package/dist/integrations/agent/profiles.js +6 -99
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +78 -13
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +48 -279
- package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
- package/dist/integrations/harnesses/aider/index.js +2 -12
- package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
- package/dist/integrations/harnesses/amazonq/index.js +3 -17
- package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +1 -14
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
- package/dist/integrations/harnesses/codex/index.js +2 -13
- package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
- package/dist/integrations/harnesses/copilot/index.js +1 -13
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
- package/dist/integrations/harnesses/gemini/index.js +1 -13
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +31 -33
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +1 -18
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
- package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
- package/dist/integrations/harnesses/openhands/index.js +2 -12
- package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
- package/dist/integrations/harnesses/pi/index.js +3 -16
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +38 -34
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +24 -40
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +15 -281
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +8 -40
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1375
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +1 -2
- package/dist/output/text.js +10 -19
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +68 -35
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/workflows/authoring/authoring.js +96 -148
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -20
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +25 -59
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +157 -94
- package/dist/workflows/exec/report.js +365 -200
- package/dist/workflows/exec/run-workflow.js +46 -40
- package/dist/workflows/exec/scheduler.js +12 -41
- package/dist/workflows/exec/step-work.js +239 -205
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/ir/compile.js +141 -283
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/plan-hash.js +40 -5
- package/dist/workflows/ir/schema.js +537 -1
- package/dist/workflows/parser.js +878 -306
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +99 -121
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +200 -113
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +4 -26
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/{dist/schemas → schemas}/akm-workflow.json +127 -82
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -316
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1414
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/schemas/akm-config.json +0 -14225
- package/dist/scripts/migrate-storage.js +0 -13169
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/db.js +0 -350
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -760
- package/dist/workflows/program/project.js +0 -105
- package/docs/data-and-telemetry.md +0 -227
- package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
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
|
+
* `RunContext` — the shared, run-scoped carrier for the three improve verbs
|
|
6
|
+
* (revise = reflect, learn = extract/distill/inference, consolidate = the
|
|
7
|
+
* memory-tier ops; D17). WI-7.5–7.8 decompose the improve god-functions into
|
|
8
|
+
* named passes that thread a `RunContext` instead of long positional argument
|
|
9
|
+
* lists.
|
|
10
|
+
*
|
|
11
|
+
* ## The D6 read-once seam
|
|
12
|
+
*
|
|
13
|
+
* `readAsset` is a memoizing file-read seam whose memo is **NEVER run-wide**
|
|
14
|
+
* (D6 / top-risk #7: a run-wide memo would serve prep-time bytes after a mid-run
|
|
15
|
+
* write). The guarantee is structural here, not merely conventional:
|
|
16
|
+
*
|
|
17
|
+
* - The **base** context returned by {@link createRunContext} has NO active
|
|
18
|
+
* memo. `readAsset` on it always reads through to disk, so it can never go
|
|
19
|
+
* stale — the safe default.
|
|
20
|
+
* - {@link RunContext.withFreshAssetMemo} mints a sibling context that shares
|
|
21
|
+
* every run-scoped carrier but owns a FRESH, empty memo. Memoization is
|
|
22
|
+
* therefore opt-in per scope:
|
|
23
|
+
* * prep's stage-body passes share ONE memo, forked only AFTER the
|
|
24
|
+
* mutating pre-loop passes have written their ops to disk, then
|
|
25
|
+
* discarded at stage end;
|
|
26
|
+
* * reflect and distill each fork their own memo per verb invocation, so
|
|
27
|
+
* their reads still happen at invoke time (not prep time).
|
|
28
|
+
* - Within a memo scope, {@link RunContext.writeAsset} writes through to disk
|
|
29
|
+
* AND refreshes the memo, and {@link RunContext.noteAssetWrite} drops a memo
|
|
30
|
+
* entry for a path written out-of-band, so a subsequent `readAsset` of the
|
|
31
|
+
* same path returns POST-write bytes (e.g. the distill in-loop salience
|
|
32
|
+
* stamp at `distill.ts:816`).
|
|
33
|
+
*
|
|
34
|
+
* The contract is pinned by `tests/commands/improve/run-context.test.ts`.
|
|
35
|
+
*
|
|
36
|
+
* This module deliberately mints only the carrier + seam. Adoption at the verb
|
|
37
|
+
* call sites lands in WI-7.5 (reflect/distill), WI-7.6 (preparation), and
|
|
38
|
+
* WI-7.7 (akmImprove/extract). It does NOT change `EventsContext` shape and does
|
|
39
|
+
* NOT thread a db handle into `ProposalsContext` (D14).
|
|
40
|
+
*/
|
|
41
|
+
import fs from "node:fs";
|
|
42
|
+
import path from "node:path";
|
|
43
|
+
import { resolveStashDir } from "../../core/common.js";
|
|
44
|
+
import { chatCompletion } from "../../llm/client.js";
|
|
45
|
+
/**
|
|
46
|
+
* Build a `RunContext` over the given carriers with the supplied memo (or `null`
|
|
47
|
+
* for the non-memoizing base context). Kept private so the only way to obtain a
|
|
48
|
+
* memoizing context is {@link RunContext.withFreshAssetMemo}.
|
|
49
|
+
*/
|
|
50
|
+
function buildRunContext(carriers, memo) {
|
|
51
|
+
const memoKey = (filePath) => path.resolve(filePath);
|
|
52
|
+
return {
|
|
53
|
+
stashDir: carriers.stashDir,
|
|
54
|
+
config: carriers.config,
|
|
55
|
+
eventsCtx: carriers.eventsCtx,
|
|
56
|
+
proposalsCtx: carriers.proposalsCtx,
|
|
57
|
+
chat: carriers.chat,
|
|
58
|
+
getLlmConfig: carriers.getLlmConfig,
|
|
59
|
+
sourceRun: carriers.sourceRun,
|
|
60
|
+
dryRun: carriers.dryRun,
|
|
61
|
+
signal: carriers.signal,
|
|
62
|
+
now: carriers.now,
|
|
63
|
+
readAsset(filePath) {
|
|
64
|
+
if (!memo)
|
|
65
|
+
return carriers.readFile(filePath);
|
|
66
|
+
const key = memoKey(filePath);
|
|
67
|
+
const cached = memo.get(key);
|
|
68
|
+
if (cached !== undefined)
|
|
69
|
+
return cached;
|
|
70
|
+
const bytes = carriers.readFile(filePath);
|
|
71
|
+
memo.set(key, bytes);
|
|
72
|
+
return bytes;
|
|
73
|
+
},
|
|
74
|
+
writeAsset(filePath, content) {
|
|
75
|
+
carriers.writeFile(filePath, content);
|
|
76
|
+
memo?.set(memoKey(filePath), content);
|
|
77
|
+
},
|
|
78
|
+
noteAssetWrite(filePath) {
|
|
79
|
+
memo?.delete(memoKey(filePath));
|
|
80
|
+
},
|
|
81
|
+
withFreshAssetMemo() {
|
|
82
|
+
return buildRunContext(carriers, new Map());
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create the base `RunContext` for an improve run. Its `readAsset` is
|
|
88
|
+
* non-memoizing (always fresh); call {@link RunContext.withFreshAssetMemo} to
|
|
89
|
+
* enter a memoized pass/invocation scope.
|
|
90
|
+
*/
|
|
91
|
+
export function createRunContext(init) {
|
|
92
|
+
const carriers = {
|
|
93
|
+
stashDir: init.stashDir,
|
|
94
|
+
config: init.config,
|
|
95
|
+
eventsCtx: init.eventsCtx,
|
|
96
|
+
proposalsCtx: init.proposalsCtx,
|
|
97
|
+
chat: init.chat ?? chatCompletion,
|
|
98
|
+
getLlmConfig: init.getLlmConfig,
|
|
99
|
+
sourceRun: init.sourceRun,
|
|
100
|
+
dryRun: init.dryRun,
|
|
101
|
+
signal: init.signal,
|
|
102
|
+
now: init.now ?? Date.now,
|
|
103
|
+
readFile: init.io?.readFile ?? ((filePath) => fs.readFileSync(filePath, "utf8")),
|
|
104
|
+
writeFile: init.io?.writeFile ?? ((filePath, content) => fs.writeFileSync(filePath, content, "utf8")),
|
|
105
|
+
};
|
|
106
|
+
return buildRunContext(carriers, null);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve the run's stash directory at the improve builder boundary: the
|
|
110
|
+
* explicit `options.stashDir` when the caller passed one, else the ambient
|
|
111
|
+
* resolveStashDir() fallback. WI-9.10d: this is the SINGLE resolveStashDir
|
|
112
|
+
* call site on the improve path — the verb entries call THIS instead of
|
|
113
|
+
* resolveStashDir directly, so the ambient read lives only in the builder
|
|
114
|
+
* module. (The CLI-wide resolveStashDir sweep for non-improve commands is a
|
|
115
|
+
* deferred follow-on — see the chunk-9 ledger WI-9.10d entry.)
|
|
116
|
+
*/
|
|
117
|
+
export function resolveRunStashDir(explicitStashDir) {
|
|
118
|
+
return explicitStashDir ?? resolveStashDir();
|
|
119
|
+
}
|
|
@@ -45,8 +45,10 @@
|
|
|
45
45
|
*
|
|
46
46
|
* @module salience
|
|
47
47
|
*/
|
|
48
|
-
import
|
|
49
|
-
import {
|
|
48
|
+
import path from "node:path";
|
|
49
|
+
import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
|
|
50
|
+
import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
|
|
51
|
+
import { getUtilityScoresByIds } from "../../storage/repositories/index-utility-repository.js";
|
|
50
52
|
import { WARM_START_CAP } from "./outcome-loop.js";
|
|
51
53
|
// ── One day in ms ─────────────────────────────────────────────────────────────
|
|
52
54
|
const DAY_MS = 86_400_000;
|
|
@@ -207,7 +209,7 @@ export function computeSalience(inputs) {
|
|
|
207
209
|
// When `outcomeWeightEnabled` is true/absent (DEFAULT ON since the G2
|
|
208
210
|
// saturation cap landed): use WS-2 weights (w_e=0.25, w_o=0.15, w_r=0.60)
|
|
209
211
|
// so the prediction-error outcome signal actually shapes rankScore — this
|
|
210
|
-
// is the R1 loop-closure
|
|
212
|
+
// is the R1 loop-closure.
|
|
211
213
|
//
|
|
212
214
|
// When `outcomeWeightEnabled` is explicitly false (operator opt-out via
|
|
213
215
|
// `improve.salience.outcomeWeightEnabled: false`): fall back to the WS-1
|
|
@@ -233,132 +235,21 @@ export function computeSalience(inputs) {
|
|
|
233
235
|
const rankScore = Math.min(1, Math.max(0, rawRankScore));
|
|
234
236
|
return { encoding, outcome, retrieval, rankScore, encodingSource };
|
|
235
237
|
}
|
|
238
|
+
// ── state.db persistence ─────────────────────────────────────────────────────
|
|
239
|
+
//
|
|
240
|
+
// The three sub-scores live in state.db::asset_salience. Raw SQL now lives in
|
|
241
|
+
// storage/repositories/salience-repository.ts (#672 part 2) — extracted
|
|
242
|
+
// verbatim, only relocated behind the repository boundary. Re-exported here so
|
|
243
|
+
// existing importers of this module resolve unchanged. Migrations live in
|
|
244
|
+
// state-db.ts (migration 009).
|
|
245
|
+
export { getAllRankScores, getAssetSalience, getConsecutiveNoOps, recordNoOp, resetConsecutiveNoOps, upsertAssetSalience, } from "../../storage/repositories/salience-repository.js";
|
|
236
246
|
/**
|
|
237
247
|
* Does this row carry a genuine content-derived `encoding_salience` (#644)?
|
|
238
248
|
*
|
|
239
|
-
*
|
|
240
|
-
* (`encoding_source === null`, written before migration 015) we apply a
|
|
241
|
-
* conservative heuristic: treat the stored value as content-derived only when it
|
|
242
|
-
* does NOT equal the pure type-weight stub for the asset's type — because before
|
|
243
|
-
* the #644 fix every run overwrote real scores with the stub, a value that still
|
|
244
|
-
* differs from the stub must have been content-written and never re-clobbered.
|
|
245
|
-
* When the type cannot be determined (no `type` given) a null-provenance row is
|
|
246
|
-
* treated as a stub (the safe default).
|
|
247
|
-
*/
|
|
248
|
-
export function isContentEncodingRow(row, type) {
|
|
249
|
-
if (row.encoding_source === "content")
|
|
250
|
-
return true;
|
|
251
|
-
if (row.encoding_source === "type-stub")
|
|
252
|
-
return false;
|
|
253
|
-
// Legacy NULL provenance: differ-from-stub heuristic.
|
|
254
|
-
if (!type)
|
|
255
|
-
return false;
|
|
256
|
-
const stub = DEFAULT_TYPE_ENCODING_WEIGHTS[type] ?? DEFAULT_ENCODING_SALIENCE;
|
|
257
|
-
return Math.abs(row.encoding_salience - stub) > 1e-9;
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Upsert salience scores for one asset into state.db.
|
|
261
|
-
*
|
|
262
|
-
* Idempotent: safe to call every run; updates the outcome / retrieval / rank
|
|
263
|
-
* columns on conflict.
|
|
264
|
-
*
|
|
265
|
-
* #644 — encoding provenance guard: the `encoding_salience` + `encoding_source`
|
|
266
|
-
* columns are NOT lowered from a real content-derived score to a type-weight
|
|
267
|
-
* stub. When the stored row is `encoding_source = 'content'` and the incoming
|
|
268
|
-
* vector is a `type-stub` fallback, the stored encoding score and its provenance
|
|
269
|
-
* are preserved (only the other sub-scores and `rank_score` advance). A `content`
|
|
270
|
-
* write always wins; a `type-stub` write only seeds a row that has no content
|
|
271
|
-
* score yet. This stops the improve loop's type-weight fallback re-asserting the
|
|
272
|
-
* stub over a distill-written score on every run.
|
|
273
|
-
*
|
|
274
|
-
* NOTE: when the guard preserves the stored encoding score, the incoming
|
|
275
|
-
* `vector.rankScore` (computed from the stub encoding) is still written. Callers
|
|
276
|
-
* that want the rank_score to reflect the preserved content score should pass the
|
|
277
|
-
* stored content score back in as `inputs.encodingSalience` to `computeSalience`
|
|
278
|
-
* — which the improve loop does. The guard here is the defensive backstop.
|
|
249
|
+
* Unknown provenance is not treated as content-derived.
|
|
279
250
|
*/
|
|
280
|
-
export function
|
|
281
|
-
|
|
282
|
-
db.prepare(`INSERT INTO asset_salience
|
|
283
|
-
(asset_ref, encoding_salience, outcome_salience, retrieval_salience, rank_score, consecutive_no_ops, updated_at, encoding_source)
|
|
284
|
-
VALUES (?, ?, ?, ?, ?, 0, ?, ?)
|
|
285
|
-
ON CONFLICT(asset_ref) DO UPDATE SET
|
|
286
|
-
-- #644: never lower a real content-derived score to a type-weight stub.
|
|
287
|
-
-- Keep the stored encoding score + provenance when the stored row is
|
|
288
|
-
-- 'content' and the incoming write is a 'type-stub' fallback.
|
|
289
|
-
encoding_salience = CASE
|
|
290
|
-
WHEN asset_salience.encoding_source = 'content' AND excluded.encoding_source = 'type-stub'
|
|
291
|
-
THEN asset_salience.encoding_salience
|
|
292
|
-
ELSE excluded.encoding_salience
|
|
293
|
-
END,
|
|
294
|
-
encoding_source = CASE
|
|
295
|
-
WHEN asset_salience.encoding_source = 'content' AND excluded.encoding_source = 'type-stub'
|
|
296
|
-
THEN asset_salience.encoding_source
|
|
297
|
-
ELSE excluded.encoding_source
|
|
298
|
-
END,
|
|
299
|
-
outcome_salience = excluded.outcome_salience,
|
|
300
|
-
retrieval_salience = excluded.retrieval_salience,
|
|
301
|
-
rank_score = excluded.rank_score,
|
|
302
|
-
updated_at = excluded.updated_at`).run(ref, vector.encoding, vector.outcome, vector.retrieval, vector.rankScore, ts, vector.encodingSource ?? "type-stub");
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Load the salience row for one asset, or undefined if not yet computed.
|
|
306
|
-
*/
|
|
307
|
-
export function getAssetSalience(db, ref) {
|
|
308
|
-
const row = db
|
|
309
|
-
.prepare(`SELECT asset_ref, encoding_salience, outcome_salience, retrieval_salience,
|
|
310
|
-
rank_score, consecutive_no_ops, updated_at, encoding_source
|
|
311
|
-
FROM asset_salience WHERE asset_ref = ?`)
|
|
312
|
-
.get(ref);
|
|
313
|
-
// Bun SQLite returns null (not undefined) when no row found.
|
|
314
|
-
return row == null ? undefined : row;
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Load ALL rank scores from the asset_salience table (full-stash query).
|
|
318
|
-
*
|
|
319
|
-
* Used by the forgetting-safety report (plan §WS-1 step 7) to compute stash-wide
|
|
320
|
-
* rank positions rather than pool-relative positions. Returns an empty Map when the
|
|
321
|
-
* table is empty (first WS-1 run = no pre-existing rows).
|
|
322
|
-
*
|
|
323
|
-
* Order is unspecified; callers must sort before assigning 1-indexed positions.
|
|
324
|
-
*/
|
|
325
|
-
export function getAllRankScores(db) {
|
|
326
|
-
const rows = db.prepare("SELECT asset_ref, rank_score FROM asset_salience").all();
|
|
327
|
-
const result = new Map();
|
|
328
|
-
for (const row of rows) {
|
|
329
|
-
result.set(row.asset_ref, row.rank_score);
|
|
330
|
-
}
|
|
331
|
-
return result;
|
|
332
|
-
}
|
|
333
|
-
// ── Plasticity helpers ────────────────────────────────────────────────────────
|
|
334
|
-
/**
|
|
335
|
-
* Increment `consecutive_no_ops` for an asset. Called after a no-op reflect/distill.
|
|
336
|
-
* Has NO effect on `rank_score` — the plasticity counter only dampens consolidation
|
|
337
|
-
* selection, not retrieval ranking. See plan §WS-1 step 8.
|
|
338
|
-
*
|
|
339
|
-
* Invariant: recordNoOp must never originate rank_score semantics. If the asset has
|
|
340
|
-
* no salience row yet (persistence's best-effort try/catch may have swallowed an
|
|
341
|
-
* error), we do nothing — a no-op counter is meaningless without a rank_score row,
|
|
342
|
-
* and a synthetic INSERT would fabricate a rank_score=0 entry that could produce
|
|
343
|
-
* false catastrophic-forgetting signals in buildRankChangeReport.
|
|
344
|
-
*/
|
|
345
|
-
export function recordNoOp(db, ref) {
|
|
346
|
-
db.prepare(`UPDATE asset_salience SET consecutive_no_ops = consecutive_no_ops + 1, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
|
|
347
|
-
// If changes === 0 the asset has no salience row yet — leave the table unchanged.
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Reset `consecutive_no_ops` to 0 when an asset produces an accepted change.
|
|
351
|
-
* Call after a successful proposal acceptance or detected mutation.
|
|
352
|
-
*/
|
|
353
|
-
export function resetConsecutiveNoOps(db, ref) {
|
|
354
|
-
db.prepare(`UPDATE asset_salience SET consecutive_no_ops = 0, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Return the `consecutive_no_ops` count for one asset. 0 when unknown.
|
|
358
|
-
*/
|
|
359
|
-
export function getConsecutiveNoOps(db, ref) {
|
|
360
|
-
const row = db.prepare(`SELECT consecutive_no_ops FROM asset_salience WHERE asset_ref = ?`).get(ref);
|
|
361
|
-
return row?.consecutive_no_ops ?? 0;
|
|
251
|
+
export function isContentEncodingRow(row) {
|
|
252
|
+
return row.encoding_source === "content";
|
|
362
253
|
}
|
|
363
254
|
// ── Consolidation-selection dampener constants ────────────────────────────────
|
|
364
255
|
//
|
|
@@ -424,15 +315,21 @@ export function buildRankChangeReport(oldRanks, newRanks, oldTopN = 200, forgett
|
|
|
424
315
|
* @param indexDb - An open read-capable index database connection.
|
|
425
316
|
* @param refs - The set of asset refs to look up.
|
|
426
317
|
*/
|
|
427
|
-
export function getLastUseMsByRef(indexDb, refs) {
|
|
318
|
+
export function getLastUseMsByRef(indexDb, refs, stashDir) {
|
|
428
319
|
const result = new Map();
|
|
429
320
|
if (refs.length === 0)
|
|
430
321
|
return result;
|
|
431
322
|
const refSet = new Set(refs);
|
|
432
323
|
const allEntries = getAllEntries(indexDb);
|
|
324
|
+
const selectedRoot = stashDir ? path.resolve(stashDir) : undefined;
|
|
433
325
|
const idToRef = new Map();
|
|
434
326
|
for (const indexed of allEntries) {
|
|
435
|
-
|
|
327
|
+
if (selectedRoot && path.resolve(indexed.stashDir) !== selectedRoot)
|
|
328
|
+
continue;
|
|
329
|
+
// In-memory correlation key, NOT a durable write: it must match the caller's
|
|
330
|
+
// `refs` (the `ImproveEligibleRef.ref`, now the SHORT conceptId — Chunk-8
|
|
331
|
+
// WI-8.5c flipped the candidate-ref spelling to match the display flip).
|
|
332
|
+
const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
|
|
436
333
|
if (refSet.has(ref))
|
|
437
334
|
idToRef.set(indexed.id, ref);
|
|
438
335
|
}
|
|
@@ -23,8 +23,9 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import fs from "node:fs";
|
|
25
25
|
import path from "node:path";
|
|
26
|
+
import { stashDirFor } from "../../core/asset/asset-placement.js";
|
|
26
27
|
import { assembleAsset } from "../../core/asset/asset-serialize.js";
|
|
27
|
-
import {
|
|
28
|
+
import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
|
|
28
29
|
import { normalizeHarnessId } from "../../integrations/harnesses/index.js";
|
|
29
30
|
/**
|
|
30
31
|
* JSON Schema for the session-summary LLM call. Strict so providers that
|
|
@@ -218,7 +219,7 @@ export function buildSessionAssetContent(data, summary) {
|
|
|
218
219
|
}
|
|
219
220
|
/** Resolve `<stash>/sessions/<harness>/<session-id>.md`. */
|
|
220
221
|
export function resolveSessionAssetPath(stashDir, harness, sessionId) {
|
|
221
|
-
const dir =
|
|
222
|
+
const dir = stashDirFor("session") ?? "sessions";
|
|
222
223
|
return path.join(stashDir, dir, normalizeHarnessId(harness), `${sessionId}.md`);
|
|
223
224
|
}
|
|
224
225
|
/**
|
|
@@ -242,7 +243,10 @@ export async function writeSessionAsset(data, stashDir, generate) {
|
|
|
242
243
|
return {
|
|
243
244
|
written: true,
|
|
244
245
|
filePath,
|
|
245
|
-
|
|
246
|
+
// Canonical 0.9.0 conceptId (`sessions/<harness>/<id>`, D-R3) — the same
|
|
247
|
+
// spelling the xrefs / usage-event readers now expect. Historical
|
|
248
|
+
// `session:<harness>/<id>` rows persist un-migrated and are tolerated.
|
|
249
|
+
ref: conceptIdFromTypeName("session", `${normalizeHarnessId(harness)}/${sessionId}`),
|
|
246
250
|
logPath: data.ref.filePath,
|
|
247
251
|
};
|
|
248
252
|
}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Small pure helpers shared across the improve command family. Extracted to
|
|
6
|
+
* delete byte-identical duplication that previously lived inline in the
|
|
7
|
+
* per-process passes (the whole-corpus synthesis pass removed in 0.9.0 and
|
|
8
|
+
* the procedural-compilation pass removed in 0.9.0). Keep this file free of
|
|
9
|
+
* I/O and of any improve-specific state — these are leaf utilities.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Cap on how many prior rejected proposals for a ref are injected as
|
|
13
|
+
* Reflexion-style verbal-RL context so the LLM avoids regenerating refusals.
|
|
14
|
+
* Shared by both the revise (reflect) and learn (distill) verbs, which
|
|
15
|
+
* previously declared this constant independently.
|
|
16
|
+
*/
|
|
17
|
+
export const MAX_REJECTED_PROPOSALS = 3;
|
|
8
18
|
/** Normalize an unknown thrown value to a human-readable message string. */
|
|
9
19
|
export function errMessage(e) {
|
|
10
20
|
return e instanceof Error ? e.message : String(e);
|
|
@@ -19,33 +29,3 @@ export function refSlug(ref) {
|
|
|
19
29
|
.toLowerCase()
|
|
20
30
|
.slice(0, 60);
|
|
21
31
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Resolve the production LLM seam for an improve process (`recombine` /
|
|
24
|
-
* `procedural`). Returns a function that issues one bounded chatCompletion per
|
|
25
|
-
* call, or `undefined` when no LLM is configured (the pass then makes no
|
|
26
|
-
* calls). Previously copied verbatim in recombine.ts and procedural.ts.
|
|
27
|
-
*
|
|
28
|
-
* When `opts.activeProfile` is supplied, its per-process runner override wins
|
|
29
|
-
* over the `default` profile so `akm improve --profile <name>` selects the
|
|
30
|
-
* profile's model; absent falls back to `default`.
|
|
31
|
-
*/
|
|
32
|
-
export function resolveImproveLlmFn(config, opts) {
|
|
33
|
-
const processConfig = getImproveProcessConfig(config, opts.processKey, opts.activeProfile);
|
|
34
|
-
const runnerSpec = resolveImproveProcessRunnerFromProfile(processConfig, config);
|
|
35
|
-
const llmConfig = runnerSpec && runnerIsLlm(runnerSpec) ? runnerSpec.connection : getDefaultLlmConfig(config);
|
|
36
|
-
if (!llmConfig)
|
|
37
|
-
return undefined;
|
|
38
|
-
return async (prompt) => {
|
|
39
|
-
const messages = [
|
|
40
|
-
{ role: "system", content: opts.systemPrompt },
|
|
41
|
-
{ role: "user", content: prompt },
|
|
42
|
-
];
|
|
43
|
-
try {
|
|
44
|
-
return await chatCompletion(llmConfig, messages, { signal: opts.signal, enableThinking: false });
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
warn(`${opts.tag} LLM call failed: ${String(e)}`);
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
// ── Durable improve-state keys ───────────────────────────────────────────────
|
|
5
|
+
//
|
|
6
|
+
// Every improve ref uses the current grammar (a short conceptId), and the durable
|
|
7
|
+
// state key is the resolved index entry's `item_ref` when the planner supplied
|
|
8
|
+
// one, else the conceptId `ref` itself (`preparation.ts`
|
|
9
|
+
// `salienceWriteKey`/`outcomeWriteKey` = `itemRef ?? ref`).
|
|
10
|
+
/**
|
|
11
|
+
* The durable improve-state key for a ref with no resolved `item_ref` — the
|
|
12
|
+
* conceptId `ref` itself.
|
|
13
|
+
*/
|
|
14
|
+
export function durableImproveRef(ref) {
|
|
15
|
+
return ref;
|
|
16
|
+
}
|
|
17
|
+
/** Return the conceptId portion of a durable improve-state key. */
|
|
18
|
+
export function bareImproveRef(ref) {
|
|
19
|
+
const boundary = ref.indexOf("//");
|
|
20
|
+
return boundary >= 0 ? ref.slice(boundary + 2) : ref;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The single durable improve-state key used by both readers and writers.
|
|
24
|
+
* Indexed entries use item_ref; direct or provenance-free refs use conceptId.
|
|
25
|
+
*/
|
|
26
|
+
export function improveStateReadRefs(ref, itemRef) {
|
|
27
|
+
return [itemRef ?? ref];
|
|
28
|
+
}
|
|
@@ -14,7 +14,23 @@ const MARKER_RE = /\b(error|failed|fix(?:ed)?|root cause|turns out|because|decid
|
|
|
14
14
|
const EDIT_COMMIT_RE = /\b(Edit|Write|MultiEdit|git commit|diff)\b/i;
|
|
15
15
|
// A substantive turn is an assistant or tool turn whose text is non-trivial.
|
|
16
16
|
const SUBSTANTIVE_MIN_CHARS = 40;
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Pure heuristic scorer. Operates only on `data.events`. Each sub-signal is
|
|
19
|
+
* normalized to a small bounded contribution; `score` is their sum and
|
|
20
|
+
* `pass = score >= minScore`.
|
|
21
|
+
*
|
|
22
|
+
* Sub-signals:
|
|
23
|
+
* - markers: presence of decision/outcome/error keywords across event text
|
|
24
|
+
* (capped, narrative-lesson signal).
|
|
25
|
+
* - toolDensity: bounded contribution from tool-use events.
|
|
26
|
+
* - editCommit: bounded contribution from edit/write/commit events.
|
|
27
|
+
* - substantiveRatio: scaled fraction of non-trivial assistant+tool turns,
|
|
28
|
+
* filtering pure short Q&A.
|
|
29
|
+
*
|
|
30
|
+
* toolDensity + editCommit alone can clear DEFAULT_TRIAGE_MIN_SCORE so
|
|
31
|
+
* high-action / no-narrative sessions are KEPT.
|
|
32
|
+
*/
|
|
33
|
+
export function scoreSessionTriage(data, minScore) {
|
|
18
34
|
const events = data.events;
|
|
19
35
|
const total = events.length;
|
|
20
36
|
// (a) markers — count word-bounded marker hits across all event text, capped.
|
|
@@ -57,18 +73,7 @@ export function scoreSessionTriage(data, minScore, options) {
|
|
|
57
73
|
const subscores = { markers, toolDensity, editCommit, substantiveRatio };
|
|
58
74
|
const score = markers + toolDensity + editCommit + substantiveRatio;
|
|
59
75
|
// Base gate: score must clear the floor.
|
|
60
|
-
|
|
61
|
-
// #641 procedural-aware floor (opt-in, DEFAULT OFF).
|
|
62
|
-
// When enabled, a session that clears the score gate must ALSO have at least
|
|
63
|
-
// one narrative marker (markers >= 1) OR meaningful edit/commit signal
|
|
64
|
-
// (editCommit >= 0.5). Pure read-only Q&A sessions that pass only via
|
|
65
|
-
// toolDensity + substantiveRatio are rejected as low-signal.
|
|
66
|
-
if (pass && options?.proceduralAwareFloor === true) {
|
|
67
|
-
const hasProceduralSignal = markers >= 1 || editCommit >= 0.5;
|
|
68
|
-
if (!hasProceduralSignal) {
|
|
69
|
-
pass = false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
76
|
+
const pass = score >= minScore;
|
|
72
77
|
return {
|
|
73
78
|
pass,
|
|
74
79
|
score,
|
|
@@ -78,7 +83,7 @@ export function scoreSessionTriage(data, minScore, options) {
|
|
|
78
83
|
}
|
|
79
84
|
/**
|
|
80
85
|
* Resolve the effective triage config from the extract process config. Mirrors
|
|
81
|
-
* the minContentChars
|
|
86
|
+
* the minContentChars resolution style in akmExtract.
|
|
82
87
|
*
|
|
83
88
|
* Default-off: `enabled` is FALSE unless `triage.enabled === true`. `minScore`
|
|
84
89
|
* defaults to {@link DEFAULT_TRIAGE_MIN_SCORE}.
|
|
@@ -87,7 +92,5 @@ export function resolveTriageConfig(extractProcess) {
|
|
|
87
92
|
const triage = extractProcess?.triage;
|
|
88
93
|
const enabled = triage?.enabled === true;
|
|
89
94
|
const minScore = typeof triage?.minScore === "number" ? triage.minScore : DEFAULT_TRIAGE_MIN_SCORE;
|
|
90
|
-
|
|
91
|
-
const proceduralAwareFloor = triage?.proceduralAwareFloor === true;
|
|
92
|
-
return { enabled, minScore, proceduralAwareFloor };
|
|
95
|
+
return { enabled, minScore };
|
|
93
96
|
}
|