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
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// @bun
|
|
3
|
-
|
|
4
|
-
// scripts/migrations/v16-to-v17.ts
|
|
5
|
-
import { Database } from "bun:sqlite";
|
|
6
|
-
import fs from "fs";
|
|
7
|
-
import path from "path";
|
|
8
|
-
function parseArgs(argv) {
|
|
9
|
-
const args = {};
|
|
10
|
-
for (let i = 0;i < argv.length; i += 1) {
|
|
11
|
-
const token = argv[i];
|
|
12
|
-
if (token === "--backup") {
|
|
13
|
-
args.backup = argv[++i];
|
|
14
|
-
} else if (token === "--target") {
|
|
15
|
-
args.target = argv[++i];
|
|
16
|
-
} else if (token === "--help" || token === "-h") {
|
|
17
|
-
printHelpAndExit(0);
|
|
18
|
-
} else if (token?.startsWith("--")) {
|
|
19
|
-
console.error(`unknown flag: ${token}`);
|
|
20
|
-
printHelpAndExit(2);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
if (!args.backup || !args.target) {
|
|
24
|
-
console.error("--backup and --target are both required");
|
|
25
|
-
printHelpAndExit(2);
|
|
26
|
-
}
|
|
27
|
-
return args;
|
|
28
|
-
}
|
|
29
|
-
function printHelpAndExit(code) {
|
|
30
|
-
console.error([
|
|
31
|
-
"Usage: bun scripts/migrations/v16-to-v17.ts --backup <path> --target <path>",
|
|
32
|
-
"",
|
|
33
|
-
" --backup Path to a backup directory (or backup index.db) written by",
|
|
34
|
-
" AKM before the v16\u2192v17 upgrade.",
|
|
35
|
-
" --target Path to the current, live index.db. Rows are inserted in",
|
|
36
|
-
" place; back this file up yourself if you want a safety net.",
|
|
37
|
-
"",
|
|
38
|
-
"Exit codes: 0 success, 2 usage error, 1 runtime failure."
|
|
39
|
-
].join(`
|
|
40
|
-
`));
|
|
41
|
-
process.exit(code);
|
|
42
|
-
}
|
|
43
|
-
function resolveDbPath(input, label) {
|
|
44
|
-
if (!fs.existsSync(input)) {
|
|
45
|
-
throw new Error(`${label} path does not exist: ${input}`);
|
|
46
|
-
}
|
|
47
|
-
const stat = fs.statSync(input);
|
|
48
|
-
if (stat.isFile())
|
|
49
|
-
return input;
|
|
50
|
-
if (stat.isDirectory()) {
|
|
51
|
-
const candidate = path.join(input, "index.db");
|
|
52
|
-
if (!fs.existsSync(candidate)) {
|
|
53
|
-
throw new Error(`${label} directory does not contain index.db: ${input}`);
|
|
54
|
-
}
|
|
55
|
-
return candidate;
|
|
56
|
-
}
|
|
57
|
-
throw new Error(`${label} path is neither a file nor a directory: ${input}`);
|
|
58
|
-
}
|
|
59
|
-
function reconcileUsageEvents(backup, target) {
|
|
60
|
-
const summary = { rowsInspected: 0, rowsInserted: 0, rowsSkipped: 0 };
|
|
61
|
-
const hasTable = backup.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='usage_events'").get();
|
|
62
|
-
if (!hasTable) {
|
|
63
|
-
console.error("[v16-to-v17] backup has no usage_events table; nothing to reconcile");
|
|
64
|
-
return summary;
|
|
65
|
-
}
|
|
66
|
-
const targetCols = target.prepare("PRAGMA table_info(usage_events)").all().map((c) => c.name);
|
|
67
|
-
const backupCols = backup.prepare("PRAGMA table_info(usage_events)").all().map((c) => c.name);
|
|
68
|
-
const sharedCols = backupCols.filter((c) => targetCols.includes(c) && c !== "id");
|
|
69
|
-
if (sharedCols.length === 0) {
|
|
70
|
-
console.error("[v16-to-v17] backup and target usage_events share no columns; refusing to insert");
|
|
71
|
-
return summary;
|
|
72
|
-
}
|
|
73
|
-
const selectAll = backup.prepare(`SELECT ${sharedCols.join(", ")} FROM usage_events`);
|
|
74
|
-
const probe = target.prepare(`SELECT 1 FROM usage_events
|
|
75
|
-
WHERE created_at = ?
|
|
76
|
-
AND event_type = ?
|
|
77
|
-
AND COALESCE(entry_ref, '') = COALESCE(?, '')
|
|
78
|
-
AND COALESCE(query, '') = COALESCE(?, '')
|
|
79
|
-
LIMIT 1`);
|
|
80
|
-
const insert = target.prepare(`INSERT INTO usage_events (${sharedCols.join(", ")}) VALUES (${sharedCols.map(() => "?").join(", ")})`);
|
|
81
|
-
const insertTx = target.transaction((rows2) => {
|
|
82
|
-
for (const row of rows2) {
|
|
83
|
-
summary.rowsInspected += 1;
|
|
84
|
-
const created = row.created_at ?? null;
|
|
85
|
-
const type = row.event_type ?? null;
|
|
86
|
-
const ref = row.entry_ref ?? null;
|
|
87
|
-
const query = row.query ?? null;
|
|
88
|
-
if (!created || !type) {
|
|
89
|
-
summary.rowsSkipped += 1;
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
const exists = probe.get(created, type, ref, query);
|
|
93
|
-
if (exists) {
|
|
94
|
-
summary.rowsSkipped += 1;
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
insert.run(...sharedCols.map((c) => row[c] ?? null));
|
|
98
|
-
summary.rowsInserted += 1;
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
const rows = selectAll.all();
|
|
102
|
-
insertTx(rows);
|
|
103
|
-
return summary;
|
|
104
|
-
}
|
|
105
|
-
function main() {
|
|
106
|
-
const argv = process.argv.slice(2);
|
|
107
|
-
const args = parseArgs(argv);
|
|
108
|
-
const backupPath = resolveDbPath(args.backup, "--backup");
|
|
109
|
-
const targetPath = resolveDbPath(args.target, "--target");
|
|
110
|
-
if (path.resolve(backupPath) === path.resolve(targetPath)) {
|
|
111
|
-
console.error("--backup and --target resolve to the same file; refusing to operate on a single DB");
|
|
112
|
-
process.exit(2);
|
|
113
|
-
}
|
|
114
|
-
const start = Date.now();
|
|
115
|
-
const backup = new Database(backupPath, { readonly: true });
|
|
116
|
-
const target = new Database(targetPath);
|
|
117
|
-
try {
|
|
118
|
-
target.exec("PRAGMA foreign_keys = ON");
|
|
119
|
-
target.exec("PRAGMA busy_timeout = 5000");
|
|
120
|
-
const usageSummary = reconcileUsageEvents(backup, target);
|
|
121
|
-
const out = {
|
|
122
|
-
from: "v16",
|
|
123
|
-
to: "v17",
|
|
124
|
-
tablesReconciled: ["usage_events"],
|
|
125
|
-
rowsInspected: usageSummary.rowsInspected,
|
|
126
|
-
rowsInserted: usageSummary.rowsInserted,
|
|
127
|
-
rowsSkipped: usageSummary.rowsSkipped,
|
|
128
|
-
durationMs: Date.now() - start
|
|
129
|
-
};
|
|
130
|
-
console.log(JSON.stringify(out, null, 2));
|
|
131
|
-
} finally {
|
|
132
|
-
backup.close();
|
|
133
|
-
target.close();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
main();
|
|
138
|
-
} catch (err) {
|
|
139
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
140
|
-
process.exit(1);
|
|
141
|
-
}
|
|
@@ -1,106 +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 { getDefaultLlmConfig } from "../core/config/config.js";
|
|
5
|
-
import { warn } from "../core/warn.js";
|
|
6
|
-
import { v1ProfilePlatform } from "../integrations/harnesses/index.js";
|
|
7
|
-
/** Read the currently-configured LLM connection from a loaded config. */
|
|
8
|
-
export function getCurrentLlm(config) {
|
|
9
|
-
return getDefaultLlmConfig(config);
|
|
10
|
-
}
|
|
11
|
-
/** Read a synthesised legacy-shape agent block from the new-shape AkmConfig. */
|
|
12
|
-
export function getCurrentAgentBlock(config) {
|
|
13
|
-
if (!config.profiles?.agent && !config.defaults?.agent)
|
|
14
|
-
return undefined;
|
|
15
|
-
const block = {};
|
|
16
|
-
if (config.defaults?.agent)
|
|
17
|
-
block.default = config.defaults.agent;
|
|
18
|
-
if (config.profiles?.agent) {
|
|
19
|
-
const profiles = {};
|
|
20
|
-
for (const [name, raw] of Object.entries(config.profiles.agent)) {
|
|
21
|
-
profiles[name] = {
|
|
22
|
-
...(raw.platform === "opencode-sdk" ? { sdkMode: true } : {}),
|
|
23
|
-
...(raw.model ? { model: raw.model } : {}),
|
|
24
|
-
...(raw.bin ? { bin: raw.bin } : {}),
|
|
25
|
-
...(raw.args ? { args: raw.args } : {}),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
block.profiles = profiles;
|
|
29
|
-
}
|
|
30
|
-
return block;
|
|
31
|
-
}
|
|
32
|
-
/** Apply an LLM connection patch onto the new-shape config. */
|
|
33
|
-
export function applyLegacyLlm(config, llm) {
|
|
34
|
-
if (!llm) {
|
|
35
|
-
// Clear the default LLM profile.
|
|
36
|
-
const name = config.defaults?.llm ?? "default";
|
|
37
|
-
const remaining = { ...(config.profiles?.llm ?? {}) };
|
|
38
|
-
delete remaining[name];
|
|
39
|
-
return {
|
|
40
|
-
profiles: { ...(config.profiles ?? {}), llm: remaining },
|
|
41
|
-
defaults: { ...(config.defaults ?? {}), llm: undefined },
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
const name = config.defaults?.llm ?? "default";
|
|
45
|
-
return {
|
|
46
|
-
profiles: {
|
|
47
|
-
...(config.profiles ?? {}),
|
|
48
|
-
llm: { ...(config.profiles?.llm ?? {}), [name]: llm },
|
|
49
|
-
},
|
|
50
|
-
defaults: { ...(config.defaults ?? {}), llm: name },
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/** Apply a legacy-shape agent block onto the new-shape config. */
|
|
54
|
-
export function applyLegacyAgent(config, agent) {
|
|
55
|
-
if (!agent) {
|
|
56
|
-
return {
|
|
57
|
-
profiles: { ...(config.profiles ?? {}), agent: undefined },
|
|
58
|
-
defaults: { ...(config.defaults ?? {}), agent: undefined },
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
const v2Profiles = { ...(config.profiles?.agent ?? {}) };
|
|
62
|
-
for (const [name, profile] of Object.entries(agent.profiles ?? {})) {
|
|
63
|
-
// #566: resolve the platform via the harness registry instead of the old
|
|
64
|
-
// `name.includes("claude") ? "claude" : "opencode"` heuristic, which
|
|
65
|
-
// silently mapped Cursor/Copilot/any new harness to "opencode". An explicit
|
|
66
|
-
// sdkMode flag still wins; otherwise we ask the registry. A name the
|
|
67
|
-
// registry does not recognize is surfaced (warn) rather than silently
|
|
68
|
-
// misclassified, then kept as a best-effort "opencode" profile so the user
|
|
69
|
-
// does not lose a profile they explicitly configured.
|
|
70
|
-
let platform;
|
|
71
|
-
if (profile.sdkMode) {
|
|
72
|
-
platform = "opencode-sdk";
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
const resolved = v1ProfilePlatform(name);
|
|
76
|
-
if (resolved) {
|
|
77
|
-
platform = resolved;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
warn(`[akm setup] Agent profile "${name}" did not match any known harness; ` +
|
|
81
|
-
`defaulting its platform to "opencode". Set its platform explicitly in config if this is wrong.`);
|
|
82
|
-
platform = "opencode";
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
v2Profiles[name] = {
|
|
86
|
-
platform,
|
|
87
|
-
...(profile.bin ? { bin: profile.bin } : {}),
|
|
88
|
-
...(profile.args ? { args: profile.args } : {}),
|
|
89
|
-
...(profile.model ? { model: profile.model } : {}),
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
return {
|
|
93
|
-
profiles: { ...(config.profiles ?? {}), agent: v2Profiles },
|
|
94
|
-
defaults: { ...(config.defaults ?? {}), agent: agent.default },
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
/** Deep-ish clone of an LLM connection config (capabilities + extraParams). */
|
|
98
|
-
export function cloneLlmConfig(llm) {
|
|
99
|
-
if (!llm)
|
|
100
|
-
return undefined;
|
|
101
|
-
return {
|
|
102
|
-
...llm,
|
|
103
|
-
...(llm.capabilities ? { capabilities: { ...llm.capabilities } } : {}),
|
|
104
|
-
...(llm.extraParams ? { extraParams: { ...llm.extraParams } } : {}),
|
|
105
|
-
};
|
|
106
|
-
}
|
|
@@ -1,38 +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
|
-
/**
|
|
5
|
-
* Bulk-fetch the judged-state cache for a set of entry keys in one query.
|
|
6
|
-
* Returns a Map keyed by entry_key so the consolidate pool-selection loop can
|
|
7
|
-
* do O(1) "has this memory been judged at this content hash?" lookups.
|
|
8
|
-
* Empty input → empty map (no query issued).
|
|
9
|
-
*/
|
|
10
|
-
export function getConsolidationJudgedMap(db, entryKeys) {
|
|
11
|
-
const out = new Map();
|
|
12
|
-
if (entryKeys.length === 0)
|
|
13
|
-
return out;
|
|
14
|
-
// SQLite has a ~999 param ceiling; chunk if a caller ever exceeds that.
|
|
15
|
-
const CHUNK = 500;
|
|
16
|
-
for (let i = 0; i < entryKeys.length; i += CHUNK) {
|
|
17
|
-
const chunk = entryKeys.slice(i, i + CHUNK);
|
|
18
|
-
const placeholders = chunk.map(() => "?").join(",");
|
|
19
|
-
const rows = db
|
|
20
|
-
.prepare(`SELECT * FROM consolidation_judged WHERE entry_key IN (${placeholders})`)
|
|
21
|
-
.all(...chunk);
|
|
22
|
-
for (const row of rows)
|
|
23
|
-
out.set(row.entry_key, row);
|
|
24
|
-
}
|
|
25
|
-
return out;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Record (or update) the judged state for one memory. INSERT-OR-REPLACE so the
|
|
29
|
-
* row always reflects the most recent judge of that entry_key. Called once per
|
|
30
|
-
* memory the consolidate LLM saw in a successfully-judged chunk.
|
|
31
|
-
*/
|
|
32
|
-
export function upsertConsolidationJudged(db, input) {
|
|
33
|
-
db.prepare(`
|
|
34
|
-
INSERT OR REPLACE INTO consolidation_judged
|
|
35
|
-
(entry_key, content_hash, judged_at, outcome)
|
|
36
|
-
VALUES (?, ?, ?, ?)
|
|
37
|
-
`).run(input.entryKey, input.contentHash, input.judgedAt, input.outcome);
|
|
38
|
-
}
|
|
@@ -1,213 +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
|
-
/**
|
|
5
|
-
* Record an induction of a recombine hypothesis and return the new consecutive
|
|
6
|
-
* count. INSERT … ON CONFLICT increments the streak, but the `last_run` guard
|
|
7
|
-
* makes a repeated call within the SAME run idempotent (no double-increment if
|
|
8
|
-
* the same ref appears twice in one run). On insert the streak starts at 1.
|
|
9
|
-
*/
|
|
10
|
-
export function recordRecombineInduction(db, input) {
|
|
11
|
-
const row = db
|
|
12
|
-
.prepare(`
|
|
13
|
-
INSERT INTO recombine_hypotheses
|
|
14
|
-
(hypothesis_ref, signature, member_key, consecutive_count, first_seen_at, last_seen_at, last_run)
|
|
15
|
-
VALUES (?, ?, ?, 1, ?, ?, ?)
|
|
16
|
-
ON CONFLICT(hypothesis_ref) DO UPDATE SET
|
|
17
|
-
consecutive_count = consecutive_count + (CASE WHEN last_run IS excluded.last_run THEN 0 ELSE 1 END),
|
|
18
|
-
last_seen_at = excluded.last_seen_at,
|
|
19
|
-
last_run = excluded.last_run,
|
|
20
|
-
signature = excluded.signature,
|
|
21
|
-
member_key = excluded.member_key
|
|
22
|
-
RETURNING consecutive_count
|
|
23
|
-
`)
|
|
24
|
-
.get(input.hypothesisRef, input.signature, input.memberKey, input.seenAt, input.seenAt, input.run);
|
|
25
|
-
return row?.consecutive_count ?? 0;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* #633 — find an existing pending (non-promoted) hypothesis row whose cluster
|
|
29
|
-
* is the SAME generalization as a newly-induced one, matched by SIGNATURE plus
|
|
30
|
-
* a Jaccard membership-overlap test, rather than an exact member-set hash.
|
|
31
|
-
*
|
|
32
|
-
* In a growing stash any added/removed memory changes the exact member set, so
|
|
33
|
-
* the ref hash (and member_key) shift every run → a fresh row at count=1 → the
|
|
34
|
-
* streak never reaches `confirmThreshold` and nothing ever promotes. Matching
|
|
35
|
-
* on overlap lets a drifting-but-stable cluster keep accumulating under one row.
|
|
36
|
-
*
|
|
37
|
-
* Returns the matched row with the HIGHEST overlap (ties broken by most-recent
|
|
38
|
-
* `last_seen_at`), or `undefined` when none clears `minOverlap`. Already-promoted
|
|
39
|
-
* rows are ignored so a confirmed lesson is not reopened by a later induction.
|
|
40
|
-
*
|
|
41
|
-
* @param memberKey the candidate cluster's membership fingerprint
|
|
42
|
-
* (sorted member entryKeys joined by `|`).
|
|
43
|
-
* @param minOverlap Jaccard threshold in [0,1]; a candidate matches when
|
|
44
|
-
* |A∩B| / |A∪B| >= minOverlap.
|
|
45
|
-
*/
|
|
46
|
-
export function findMatchingRecombineHypothesis(db, input) {
|
|
47
|
-
const candidateMembers = new Set(input.memberKey.split("|").filter((m) => m.length > 0));
|
|
48
|
-
if (candidateMembers.size === 0)
|
|
49
|
-
return undefined;
|
|
50
|
-
const rows = db
|
|
51
|
-
.prepare("SELECT * FROM recombine_hypotheses WHERE signature = ? AND promoted_at IS NULL ORDER BY last_seen_at DESC")
|
|
52
|
-
.all(input.signature);
|
|
53
|
-
let best;
|
|
54
|
-
let bestOverlap = -1;
|
|
55
|
-
for (const row of rows) {
|
|
56
|
-
const rowMembers = row.member_key.split("|").filter((m) => m.length > 0);
|
|
57
|
-
if (rowMembers.length === 0)
|
|
58
|
-
continue;
|
|
59
|
-
let intersection = 0;
|
|
60
|
-
for (const m of rowMembers) {
|
|
61
|
-
if (candidateMembers.has(m))
|
|
62
|
-
intersection += 1;
|
|
63
|
-
}
|
|
64
|
-
const union = candidateMembers.size + rowMembers.length - intersection;
|
|
65
|
-
const overlap = union === 0 ? 0 : intersection / union;
|
|
66
|
-
// rows are ordered last_seen_at DESC, so a strict `>` keeps the most-recent
|
|
67
|
-
// row on ties.
|
|
68
|
-
if (overlap >= input.minOverlap && overlap > bestOverlap) {
|
|
69
|
-
best = row;
|
|
70
|
-
bestOverlap = overlap;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return best;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Fetch a single recombine hypothesis row, or `undefined` when the ref has
|
|
77
|
-
* never been induced. Normalizes bun:sqlite null → undefined like
|
|
78
|
-
* {@link getExtractedSession}.
|
|
79
|
-
*/
|
|
80
|
-
export function getRecombineHypothesis(db, hypothesisRef) {
|
|
81
|
-
const row = db
|
|
82
|
-
.prepare("SELECT * FROM recombine_hypotheses WHERE hypothesis_ref = ?")
|
|
83
|
-
.get(hypothesisRef);
|
|
84
|
-
return row ?? undefined;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Mark a hypothesis promoted: stamp `promoted_at` and reset the consecutive
|
|
88
|
-
* count to 0, so it must re-accumulate a full confirmation streak before it can
|
|
89
|
-
* promote again. The `promoted_at` non-null state is the double-promotion guard.
|
|
90
|
-
*/
|
|
91
|
-
export function markRecombineHypothesisPromoted(db, hypothesisRef, promotedAt) {
|
|
92
|
-
db.prepare("UPDATE recombine_hypotheses SET promoted_at = ?, consecutive_count = 0 WHERE hypothesis_ref = ?").run(promotedAt, hypothesisRef);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* #658 — does any current-run cluster match this hypothesis row under the SAME
|
|
96
|
-
* signature + Jaccard-overlap rule used for re-induction? A match means the
|
|
97
|
-
* cluster genuinely re-formed this run (it was merely cap-displaced out of the
|
|
98
|
-
* processed top-`maxClustersPerRun` slice), so its streak must NOT be reset.
|
|
99
|
-
*/
|
|
100
|
-
function hypothesisMatchesAnyPresentCluster(row, presentClusters, minOverlap) {
|
|
101
|
-
const rowMembers = row.member_key.split("|").filter((m) => m.length > 0);
|
|
102
|
-
if (rowMembers.length === 0)
|
|
103
|
-
return false;
|
|
104
|
-
const rowSet = new Set(rowMembers);
|
|
105
|
-
for (const cluster of presentClusters) {
|
|
106
|
-
if (cluster.signature !== row.signature)
|
|
107
|
-
continue;
|
|
108
|
-
const clusterMembers = cluster.memberKey.split("|").filter((m) => m.length > 0);
|
|
109
|
-
if (clusterMembers.length === 0)
|
|
110
|
-
continue;
|
|
111
|
-
let intersection = 0;
|
|
112
|
-
for (const m of clusterMembers) {
|
|
113
|
-
if (rowSet.has(m))
|
|
114
|
-
intersection += 1;
|
|
115
|
-
}
|
|
116
|
-
const union = rowSet.size + clusterMembers.length - intersection;
|
|
117
|
-
const overlap = union === 0 ? 0 : intersection / union;
|
|
118
|
-
if (overlap >= minOverlap)
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Decay-to-zero every NON-promoted hypothesis NOT re-induced in the current run.
|
|
125
|
-
*
|
|
126
|
-
* A generalization that stops being supported by the corpus has lost its
|
|
127
|
-
* confirmation streak, so we hard-reset `consecutive_count` to 0 (the
|
|
128
|
-
* alternative — `count - 1` floored at 0 — tolerates a single noisy run but
|
|
129
|
-
* blurs the "consecutive" semantics; hard-reset is the conservative choice).
|
|
130
|
-
*
|
|
131
|
-
* Only rows whose `hypothesis_ref` is NOT in `seenRefs` AND whose `last_run` is
|
|
132
|
-
* NOT the current run are decayed. Already-promoted rows are left alone.
|
|
133
|
-
*
|
|
134
|
-
* #658 — CAP-AWARE decay. The recombine pass only re-inducts (and thus marks
|
|
135
|
-
* `seen`) the top-`maxClustersPerRun` clusters, but a cluster genuinely
|
|
136
|
-
* re-forms every run even when it is displaced below that cap. Resetting such a
|
|
137
|
-
* row treats a SCHEDULING miss as a SUBSTANCE miss and traps the hypothesis
|
|
138
|
-
* below `confirmThreshold` forever. When `opts.presentClusters` is supplied, a
|
|
139
|
-
* row is SPARED from decay if it Jaccard-matches any present cluster (same
|
|
140
|
-
* signature, overlap >= `opts.minOverlap`) — i.e. its cluster re-formed this run
|
|
141
|
-
* but was cap-displaced. This does NOT advance the streak (only re-induction in
|
|
142
|
-
* the processed slice does that, via {@link recordRecombineInduction}), so the
|
|
143
|
-
* recurrence bar for promotion is unchanged; it only stops the cap from
|
|
144
|
-
* manufacturing artificial misses. Omitting `presentClusters` preserves the
|
|
145
|
-
* pre-#658 hard-reset-after-one-miss behaviour exactly.
|
|
146
|
-
*
|
|
147
|
-
* Returns the number of rows reset.
|
|
148
|
-
*/
|
|
149
|
-
export function decayUnseenRecombineHypotheses(db, currentRun, seenRefs, opts) {
|
|
150
|
-
// #658 — when cap-aware sparing is requested, fold the cap-displaced rows into
|
|
151
|
-
// the "seen" exclusion set: the underlying reset SQL already protects every
|
|
152
|
-
// ref it is given, so sparing == treating a spared row exactly like a seen
|
|
153
|
-
// row for this sweep (its count is left untouched, never advanced).
|
|
154
|
-
let effectiveSeen = seenRefs;
|
|
155
|
-
if (opts && opts.presentClusters.length > 0) {
|
|
156
|
-
const candidates = db
|
|
157
|
-
.prepare("SELECT hypothesis_ref, signature, member_key FROM recombine_hypotheses WHERE promoted_at IS NULL AND (last_run IS NULL OR last_run != ?) AND consecutive_count != 0")
|
|
158
|
-
.all(currentRun);
|
|
159
|
-
const seenSet = new Set(seenRefs);
|
|
160
|
-
for (const row of candidates) {
|
|
161
|
-
if (seenSet.has(row.hypothesis_ref))
|
|
162
|
-
continue;
|
|
163
|
-
if (hypothesisMatchesAnyPresentCluster(row, opts.presentClusters, opts.minOverlap)) {
|
|
164
|
-
seenSet.add(row.hypothesis_ref);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
effectiveSeen = [...seenSet];
|
|
168
|
-
}
|
|
169
|
-
return decayUnseenRecombineHypothesesInner(db, currentRun, effectiveSeen);
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* The raw reset sweep shared by the cap-aware wrapper above. Resets every
|
|
173
|
-
* non-promoted row from a prior run whose ref is NOT in `seenRefs`. Kept private
|
|
174
|
-
* so the param-ceiling chunking logic lives in one place.
|
|
175
|
-
*/
|
|
176
|
-
function decayUnseenRecombineHypothesesInner(db, currentRun, seenRefs) {
|
|
177
|
-
// Reset every eligible row, then exclude the seen refs in chunks to respect
|
|
178
|
-
// the ~999 SQLite param ceiling. With no seen refs we reset all non-promoted
|
|
179
|
-
// rows from prior runs in a single statement.
|
|
180
|
-
if (seenRefs.length === 0) {
|
|
181
|
-
const res = db
|
|
182
|
-
.prepare("UPDATE recombine_hypotheses SET consecutive_count = 0 WHERE promoted_at IS NULL AND (last_run IS NULL OR last_run != ?) AND consecutive_count != 0")
|
|
183
|
-
.run(currentRun);
|
|
184
|
-
return Number(res.changes);
|
|
185
|
-
}
|
|
186
|
-
// A single NOT IN keeps the exclusion atomic (a chunked NOT IN would let a ref
|
|
187
|
-
// excluded by one chunk still be reset by another chunk's statement). The
|
|
188
|
-
// recombine pass caps RE-INDUCED clusters at `maxClustersPerRun` (a handful) —
|
|
189
|
-
// but with #658 cap-aware sparing the caller folds every cap-displaced
|
|
190
|
-
// (present-but-unprocessed) hypothesis into `effectiveSeen` too, so on a large
|
|
191
|
-
// stash `seenRefs` here can carry MANY spared refs, not just the handful that
|
|
192
|
-
// were processed. We cap defensively at ~900 (under SQLite's ~999 param
|
|
193
|
-
// ceiling): if `effectiveSeen` somehow exceeds it we fall back to resetting all
|
|
194
|
-
// eligible rows — which re-introduces the cap-displacement trap for THAT run
|
|
195
|
-
// (spared rows get decayed because the NOT IN protection is dropped). That is a
|
|
196
|
-
// rare, bounded degradation; a stash with >900 simultaneously-spared
|
|
197
|
-
// hypotheses is far beyond current scale.
|
|
198
|
-
if (seenRefs.length > 900) {
|
|
199
|
-
const res = db
|
|
200
|
-
.prepare("UPDATE recombine_hypotheses SET consecutive_count = 0 WHERE promoted_at IS NULL AND (last_run IS NULL OR last_run != ?) AND consecutive_count != 0")
|
|
201
|
-
.run(currentRun);
|
|
202
|
-
return Number(res.changes);
|
|
203
|
-
}
|
|
204
|
-
const placeholders = seenRefs.map(() => "?").join(",");
|
|
205
|
-
const res = db
|
|
206
|
-
.prepare(`UPDATE recombine_hypotheses SET consecutive_count = 0
|
|
207
|
-
WHERE promoted_at IS NULL
|
|
208
|
-
AND (last_run IS NULL OR last_run != ?)
|
|
209
|
-
AND consecutive_count != 0
|
|
210
|
-
AND hypothesis_ref NOT IN (${placeholders})`)
|
|
211
|
-
.run(currentRun, ...seenRefs);
|
|
212
|
-
return Number(res.changes);
|
|
213
|
-
}
|
|
@@ -1,15 +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 indexTemplate from "../assets/wiki/index-template.md" with { type: "text" };
|
|
5
|
-
import logTemplate from "../assets/wiki/log-template.md" with { type: "text" };
|
|
6
|
-
import schemaTemplate from "../assets/wiki/schema-template.md" with { type: "text" };
|
|
7
|
-
export function buildSchemaMd(wikiName) {
|
|
8
|
-
return schemaTemplate.replaceAll("{{WIKI_NAME}}", wikiName);
|
|
9
|
-
}
|
|
10
|
-
export function buildIndexMd(wikiName) {
|
|
11
|
-
return indexTemplate.replaceAll("{{WIKI_NAME}}", wikiName);
|
|
12
|
-
}
|
|
13
|
-
export function buildLogMd(wikiName) {
|
|
14
|
-
return logTemplate.replaceAll("{{WIKI_NAME}}", wikiName);
|
|
15
|
-
}
|