akm-cli 0.9.16 → 0.9.17-alpha.10
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 +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -107,7 +107,7 @@ const GATE_OUTCOMES = {
|
|
|
107
107
|
"auto-rejected": true,
|
|
108
108
|
};
|
|
109
109
|
function validatePresentMetadata(meta) {
|
|
110
|
-
const stringFields = ["sourceRun", "beforeHash", "backupContent"];
|
|
110
|
+
const stringFields = ["sourceRun", "beforeHash", "beforeHashNormalized", "backupContent"];
|
|
111
111
|
for (const field of stringFields) {
|
|
112
112
|
if (Object.hasOwn(meta, field) && typeof meta[field] !== "string")
|
|
113
113
|
invalidPresentField(field);
|
|
@@ -168,6 +168,50 @@ function validatePresentMetadata(meta) {
|
|
|
168
168
|
if (Object.hasOwn(meta, "eligibilitySource") && typeof meta.eligibilitySource !== "string") {
|
|
169
169
|
invalidPresentField("eligibilitySource");
|
|
170
170
|
}
|
|
171
|
+
if (Object.hasOwn(meta, "promotionSource") && typeof meta.promotionSource !== "string") {
|
|
172
|
+
invalidPresentField("promotionSource");
|
|
173
|
+
}
|
|
174
|
+
if (Object.hasOwn(meta, "promotionSourceHash") && typeof meta.promotionSourceHash !== "string") {
|
|
175
|
+
invalidPresentField("promotionSourceHash");
|
|
176
|
+
}
|
|
177
|
+
if (Object.hasOwn(meta, "retirement")) {
|
|
178
|
+
const retirement = meta.retirement;
|
|
179
|
+
if (typeof retirement !== "object" ||
|
|
180
|
+
retirement === null ||
|
|
181
|
+
typeof retirement.retiredRef !== "string" ||
|
|
182
|
+
typeof retirement.successorRef !== "string" ||
|
|
183
|
+
typeof retirement.cosine !== "number" ||
|
|
184
|
+
!Number.isFinite(retirement.cosine) ||
|
|
185
|
+
(retirement.judgeLabel !== "duplicate" &&
|
|
186
|
+
retirement.judgeLabel !== "subsumed" &&
|
|
187
|
+
retirement.judgeLabel !== "supersedes") ||
|
|
188
|
+
typeof retirement.judgeReason !== "string" ||
|
|
189
|
+
typeof retirement.retiredContentHash !== "string" ||
|
|
190
|
+
typeof retirement.successorContentHash !== "string" ||
|
|
191
|
+
(retirement.reason !== "duplicate" && retirement.reason !== "subsumed" && retirement.reason !== "superseded")) {
|
|
192
|
+
invalidPresentField("retirement");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (Object.hasOwn(meta, "retiredArchive")) {
|
|
196
|
+
const archive = meta.retiredArchive;
|
|
197
|
+
if (typeof archive !== "object" ||
|
|
198
|
+
archive === null ||
|
|
199
|
+
!Array.isArray(archive.dirs) ||
|
|
200
|
+
archive.dirs.length === 0 ||
|
|
201
|
+
archive.dirs.some((dir) => typeof dir !== "string" || dir.length === 0)) {
|
|
202
|
+
invalidPresentField("retiredArchive");
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (Object.hasOwn(meta, "retireAcceptIntent")) {
|
|
206
|
+
const intent = meta.retireAcceptIntent;
|
|
207
|
+
if (typeof intent !== "object" ||
|
|
208
|
+
intent === null ||
|
|
209
|
+
typeof intent.assetPath !== "string" ||
|
|
210
|
+
intent.assetPath.length === 0 ||
|
|
211
|
+
typeof intent.backupContent !== "string") {
|
|
212
|
+
invalidPresentField("retireAcceptIntent");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
171
215
|
}
|
|
172
216
|
/**
|
|
173
217
|
* Convert a raw `ProposalRow` to the public `Proposal` shape.
|
|
@@ -224,6 +268,7 @@ export function proposalRowToProposal(row) {
|
|
|
224
268
|
changes,
|
|
225
269
|
...(proposedTarget !== undefined ? { proposedTarget } : {}),
|
|
226
270
|
...(typeof meta.beforeHash === "string" ? { beforeHash: meta.beforeHash } : {}),
|
|
271
|
+
...(typeof meta.beforeHashNormalized === "string" ? { beforeHashNormalized: meta.beforeHashNormalized } : {}),
|
|
227
272
|
...(meta.review !== undefined ? { review: meta.review } : {}),
|
|
228
273
|
...(typeof meta.confidence === "number" ? { confidence: meta.confidence } : {}),
|
|
229
274
|
...(meta.gateDecision !== undefined ? { gateDecision: meta.gateDecision } : {}),
|
|
@@ -232,6 +277,13 @@ export function proposalRowToProposal(row) {
|
|
|
232
277
|
...(typeof meta.eligibilitySource === "string"
|
|
233
278
|
? { eligibilitySource: meta.eligibilitySource }
|
|
234
279
|
: {}),
|
|
280
|
+
...(typeof meta.promotionSource === "string" ? { promotionSource: meta.promotionSource } : {}),
|
|
281
|
+
...(typeof meta.promotionSourceHash === "string" ? { promotionSourceHash: meta.promotionSourceHash } : {}),
|
|
282
|
+
...(meta.retirement !== undefined ? { retirement: meta.retirement } : {}),
|
|
283
|
+
...(meta.retiredArchive !== undefined ? { retiredArchive: meta.retiredArchive } : {}),
|
|
284
|
+
...(meta.retireAcceptIntent !== undefined
|
|
285
|
+
? { retireAcceptIntent: meta.retireAcceptIntent }
|
|
286
|
+
: {}),
|
|
235
287
|
};
|
|
236
288
|
}
|
|
237
289
|
/**
|
|
@@ -274,6 +326,8 @@ export function proposalToRowValues(proposal, stashDir) {
|
|
|
274
326
|
metaObj.proposedTarget = currentProposalTarget(proposal.proposedTarget);
|
|
275
327
|
if (proposal.beforeHash !== undefined)
|
|
276
328
|
metaObj.beforeHash = proposal.beforeHash;
|
|
329
|
+
if (proposal.beforeHashNormalized !== undefined)
|
|
330
|
+
metaObj.beforeHashNormalized = proposal.beforeHashNormalized;
|
|
277
331
|
if (proposal.sourceRun !== undefined)
|
|
278
332
|
metaObj.sourceRun = proposal.sourceRun;
|
|
279
333
|
if (proposal.review !== undefined)
|
|
@@ -288,6 +342,16 @@ export function proposalToRowValues(proposal, stashDir) {
|
|
|
288
342
|
metaObj.acceptedTarget = proposal.acceptedTarget;
|
|
289
343
|
if (proposal.eligibilitySource !== undefined)
|
|
290
344
|
metaObj.eligibilitySource = proposal.eligibilitySource;
|
|
345
|
+
if (proposal.promotionSource !== undefined)
|
|
346
|
+
metaObj.promotionSource = proposal.promotionSource;
|
|
347
|
+
if (proposal.promotionSourceHash !== undefined)
|
|
348
|
+
metaObj.promotionSourceHash = proposal.promotionSourceHash;
|
|
349
|
+
if (proposal.retirement !== undefined)
|
|
350
|
+
metaObj.retirement = proposal.retirement;
|
|
351
|
+
if (proposal.retiredArchive !== undefined)
|
|
352
|
+
metaObj.retiredArchive = proposal.retiredArchive;
|
|
353
|
+
if (proposal.retireAcceptIntent !== undefined)
|
|
354
|
+
metaObj.retireAcceptIntent = proposal.retireAcceptIntent;
|
|
291
355
|
validatePresentMetadata(metaObj);
|
|
292
356
|
return {
|
|
293
357
|
id: proposal.id,
|
|
@@ -382,6 +446,10 @@ export function getStateProposal(db, id, stashDir) {
|
|
|
382
446
|
const row = (stashDir ? db.prepare(sql).get(id, stashDir) : db.prepare(sql).get(id));
|
|
383
447
|
return row ? proposalRowToProposal(row) : undefined;
|
|
384
448
|
}
|
|
449
|
+
/** `(ref, source)` of every proposal, any status, in one stash: no payload is read. */
|
|
450
|
+
export function listProposalRefSources(db, stashDir) {
|
|
451
|
+
return db.prepare("SELECT ref, source FROM proposals WHERE stash_dir = ?").all(stashDir);
|
|
452
|
+
}
|
|
385
453
|
/**
|
|
386
454
|
* Find PENDING proposal ids in one stash whose id starts with `idPrefix`.
|
|
387
455
|
* Backs the UUID-prefix form of `akm proposal show/accept/... <prefix>` —
|
|
@@ -399,3 +467,38 @@ export function listStateProposalIdsByPrefix(db, stashDir, idPrefix) {
|
|
|
399
467
|
.all(stashDir, `${escaped}%`);
|
|
400
468
|
return rows.map((r) => r.id);
|
|
401
469
|
}
|
|
470
|
+
/**
|
|
471
|
+
* Preview counterpart of {@link renameProposalsBundleRef} for `akm bundle
|
|
472
|
+
* rename --dry-run`: the same two `WHERE` predicates, read-only.
|
|
473
|
+
*/
|
|
474
|
+
export function countProposalsForBundleRename(db, oldBundleId) {
|
|
475
|
+
const prefix = `${escapeLikePattern(oldBundleId)}//`;
|
|
476
|
+
const refs = db.prepare(`SELECT COUNT(*) AS n FROM proposals WHERE ref LIKE ? ESCAPE '\\'`).get(`${prefix}%`).n;
|
|
477
|
+
const targets = db
|
|
478
|
+
.prepare(`SELECT COUNT(*) AS n FROM proposals WHERE json_extract(metadata_json, '$.proposedTarget.source') = ?`)
|
|
479
|
+
.get(oldBundleId).n;
|
|
480
|
+
return { refs, targets };
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Rewrite every proposal that names `oldBundleId` from `akm bundle rename`
|
|
484
|
+
* (D6): the fully-qualified `ref` column (`<bundle>//conceptId` — an
|
|
485
|
+
* unqualified legacy `ref` resolves against `defaultBundle` at use time and
|
|
486
|
+
* never names a bundle explicitly, so it is left alone), and
|
|
487
|
+
* `metadata_json.proposedTarget.source`, which names the write-target bundle
|
|
488
|
+
* a still-pending proposal would apply to (`resolveRecordedProposalTarget`,
|
|
489
|
+
* `commands/proposal/repository.ts`). Returns how many rows of each were
|
|
490
|
+
* rewritten.
|
|
491
|
+
*/
|
|
492
|
+
export function renameProposalsBundleRef(db, oldBundleId, newBundleId) {
|
|
493
|
+
const prefix = `${escapeLikePattern(oldBundleId)}//`;
|
|
494
|
+
return db.transaction(() => {
|
|
495
|
+
const refs = Number(db
|
|
496
|
+
.prepare(`UPDATE proposals SET ref = ? || substr(ref, ?) WHERE ref LIKE ? ESCAPE '\\'`)
|
|
497
|
+
.run(newBundleId, oldBundleId.length + 1, `${prefix}%`).changes);
|
|
498
|
+
const targets = Number(db
|
|
499
|
+
.prepare(`UPDATE proposals SET metadata_json = json_set(metadata_json, '$.proposedTarget.source', ?)
|
|
500
|
+
WHERE json_extract(metadata_json, '$.proposedTarget.source') = ?`)
|
|
501
|
+
.run(newBundleId, oldBundleId).changes);
|
|
502
|
+
return { refs, targets };
|
|
503
|
+
})();
|
|
504
|
+
}
|
|
@@ -1,6 +1,10 @@
|
|
|
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
|
+
import { rethrowIfTestIsolationError } from "../../core/errors.js";
|
|
5
|
+
import { formatRegistryError } from "../../core/registry-url.js";
|
|
6
|
+
import { warn } from "../../core/warn.js";
|
|
7
|
+
import { closeDatabase, openIndexDatabase } from "./index-connection.js";
|
|
4
8
|
/**
|
|
5
9
|
* Upsert a registry index cache entry in index.db.
|
|
6
10
|
*
|
|
@@ -44,3 +48,99 @@ export function getRegistryIndexCache(db, registryUrl, maxAgeMs = 3_600_000 /* 1
|
|
|
44
48
|
return undefined;
|
|
45
49
|
return { indexJson: row.index_json, etag: row.etag, lastModified: row.last_modified };
|
|
46
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Open the cache DB (a failed open yields `db = undefined`; the bun-test
|
|
53
|
+
* isolation guard is re-thrown), run `fn`, and close the DB only after `fn`
|
|
54
|
+
* has fully settled — the callbacks are async, and closing earlier would tear
|
|
55
|
+
* the DB down mid-write.
|
|
56
|
+
*/
|
|
57
|
+
export async function withRegistryCacheDb(fn) {
|
|
58
|
+
let db;
|
|
59
|
+
try {
|
|
60
|
+
db = openIndexDatabase();
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
rethrowIfTestIsolationError(err);
|
|
64
|
+
db = undefined;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
return await fn(db);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
if (db) {
|
|
71
|
+
try {
|
|
72
|
+
closeDatabase(db);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
/* ignore */
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns a fresh cache hit when present, otherwise fetches live (writing the
|
|
82
|
+
* result back best-effort), and falls back to a stale cache row when the
|
|
83
|
+
* fetch fails.
|
|
84
|
+
*/
|
|
85
|
+
export async function fetchCachedJson(opts) {
|
|
86
|
+
const { cacheKey, ttlMs, parseCache, fetchFresh } = opts;
|
|
87
|
+
return withRegistryCacheDb(async (db) => {
|
|
88
|
+
let dbCacheResult;
|
|
89
|
+
try {
|
|
90
|
+
if (db) {
|
|
91
|
+
dbCacheResult = getRegistryIndexCache(db, cacheKey, ttlMs);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
// Never mask the bun-test isolation guard as "DB unavailable" — see
|
|
96
|
+
// rethrowIfTestIsolationError in src/core/errors.ts.
|
|
97
|
+
rethrowIfTestIsolationError(err);
|
|
98
|
+
// index.db read failed (pre-migration install or test env) — fall through
|
|
99
|
+
}
|
|
100
|
+
if (dbCacheResult) {
|
|
101
|
+
const cached = parseCache(dbCacheResult.indexJson, { stale: false });
|
|
102
|
+
if (cached !== undefined) {
|
|
103
|
+
return cached;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const { value, cacheJson } = await fetchFresh();
|
|
108
|
+
if (db) {
|
|
109
|
+
try {
|
|
110
|
+
upsertRegistryIndexCache(db, cacheKey, cacheJson);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
/* best-effort */
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
// Fetch failed — use stale DB cache if available.
|
|
120
|
+
if (dbCacheResult) {
|
|
121
|
+
const stale = parseCache(dbCacheResult.indexJson, { stale: true });
|
|
122
|
+
if (stale !== undefined)
|
|
123
|
+
return stale;
|
|
124
|
+
}
|
|
125
|
+
// No in-TTL row — consult the cache PAST its TTL before giving up: a
|
|
126
|
+
// briefly unreachable registry should degrade to the last-known index,
|
|
127
|
+
// loudly, not hard-fail the command.
|
|
128
|
+
try {
|
|
129
|
+
const expiredRow = db ? getRegistryIndexCache(db, cacheKey, Number.POSITIVE_INFINITY) : undefined;
|
|
130
|
+
if (expiredRow) {
|
|
131
|
+
const stale = parseCache(expiredRow.indexJson, { stale: true });
|
|
132
|
+
if (stale !== undefined) {
|
|
133
|
+
warn(`Registry fetch failed (${formatRegistryError(err)}); ` +
|
|
134
|
+
"serving the last cached index, which is past its refresh interval.");
|
|
135
|
+
return stale;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (cacheErr) {
|
|
140
|
+
rethrowIfTestIsolationError(cacheErr);
|
|
141
|
+
// cache read failed — fall through to the original fetch error
|
|
142
|
+
}
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
@@ -58,23 +58,6 @@ export function getAssetSalience(db, ref) {
|
|
|
58
58
|
// Bun SQLite returns null (not undefined) when no row found.
|
|
59
59
|
return row == null ? undefined : row;
|
|
60
60
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Load ALL rank scores from the asset_salience table (full-stash query).
|
|
63
|
-
*
|
|
64
|
-
* Used by the forgetting-safety report (plan §WS-1 step 7) to compute stash-wide
|
|
65
|
-
* rank positions rather than pool-relative positions. Returns an empty Map when the
|
|
66
|
-
* table is empty (first WS-1 run = no pre-existing rows).
|
|
67
|
-
*
|
|
68
|
-
* Order is unspecified; callers must sort before assigning 1-indexed positions.
|
|
69
|
-
*/
|
|
70
|
-
export function getAllRankScores(db) {
|
|
71
|
-
const rows = db.prepare("SELECT asset_ref, rank_score FROM asset_salience").all();
|
|
72
|
-
const result = new Map();
|
|
73
|
-
for (const row of rows) {
|
|
74
|
-
result.set(row.asset_ref, row.rank_score);
|
|
75
|
-
}
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
61
|
// ── Plasticity helpers ────────────────────────────────────────────────────────
|
|
79
62
|
/**
|
|
80
63
|
* Increment `consecutive_no_ops` for an asset. Called after a no-op reflect/distill.
|
|
@@ -84,8 +67,7 @@ export function getAllRankScores(db) {
|
|
|
84
67
|
* Invariant: recordNoOp must never originate rank_score semantics. If the asset has
|
|
85
68
|
* no salience row yet (persistence's best-effort try/catch may have swallowed an
|
|
86
69
|
* error), we do nothing — a no-op counter is meaningless without a rank_score row,
|
|
87
|
-
* and a synthetic INSERT would fabricate a rank_score=0 entry
|
|
88
|
-
* false catastrophic-forgetting signals in buildRankChangeReport.
|
|
70
|
+
* and a synthetic INSERT would fabricate a rank_score=0 entry with nothing behind it.
|
|
89
71
|
*/
|
|
90
72
|
export function recordNoOp(db, ref) {
|
|
91
73
|
db.prepare(`UPDATE asset_salience SET consecutive_no_ops = consecutive_no_ops + 1, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { isRecord } from "../../core/common.js";
|
|
13
13
|
import { warnOnce } from "../../core/warn.js";
|
|
14
|
+
import { escapeLikePattern } from "../like-pattern.js";
|
|
14
15
|
function metadataError(message) {
|
|
15
16
|
throw new Error(`invalid task_history metadata_json: ${message}`);
|
|
16
17
|
}
|
|
@@ -63,9 +64,9 @@ export function decodeTaskHistoryMetadata(input) {
|
|
|
63
64
|
if (typeof parsed.durationMs !== "number")
|
|
64
65
|
metadataError("durationMs must be a number");
|
|
65
66
|
const detail = "detail" in parsed ? parsed.detail : null;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
// A malformed `engine` (wrong type) is dropped like any other unrecognized
|
|
68
|
+
// field rather than rejecting the whole row over a non-essential value.
|
|
69
|
+
const engine = parsed.engine === null || typeof parsed.engine === "string" ? parsed.engine : undefined;
|
|
69
70
|
if (parsed.targetVocab !== undefined && parsed.targetVocab !== 2) {
|
|
70
71
|
warnOnce(`task-history-target-vocab:${String(parsed.targetVocab)}`, `task_history row has targetVocab ${String(parsed.targetVocab)}, newer than this akm's 2 — falling back to ` +
|
|
71
72
|
"the legacy target_kind mapping rather than rejecting the row.");
|
|
@@ -83,7 +84,7 @@ export function decodeTaskHistoryMetadata(input) {
|
|
|
83
84
|
metadataVersion: 2,
|
|
84
85
|
durationMs: parsed.durationMs,
|
|
85
86
|
detail: cleanDetail,
|
|
86
|
-
...(
|
|
87
|
+
...(engine !== undefined ? { engine } : {}),
|
|
87
88
|
...(parsed.targetVocab === 2 ? { targetVocab: 2 } : {}),
|
|
88
89
|
};
|
|
89
90
|
}
|
|
@@ -207,3 +208,24 @@ export function queryCompletedTaskIntervals(db, since, until) {
|
|
|
207
208
|
: "SELECT started_at, completed_at FROM task_history WHERE task_id = 'akm-improve' AND started_at >= ? AND completed_at IS NOT NULL ORDER BY started_at";
|
|
208
209
|
return (until ? db.prepare(sql).all(since, until) : db.prepare(sql).all(since));
|
|
209
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Preview counterpart of {@link renameTaskHistoryTargetRefs} for `akm bundle
|
|
213
|
+
* rename --dry-run`: the same `WHERE` predicate, read-only.
|
|
214
|
+
*/
|
|
215
|
+
export function countTaskHistoryTargetRefs(db, oldBundleId) {
|
|
216
|
+
const prefix = `${escapeLikePattern(oldBundleId)}//`;
|
|
217
|
+
return db.prepare(`SELECT COUNT(*) AS n FROM task_history WHERE target_ref LIKE ? ESCAPE '\\'`).get(`${prefix}%`).n;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Rewrite every `task_history.target_ref` naming `oldBundleId` (a workflow
|
|
221
|
+
* run's fully-qualified `<bundle>//conceptId` target) to `newBundleId`
|
|
222
|
+
* (`akm bundle rename`, D6). A row whose `target_ref` is unset or not
|
|
223
|
+
* bundle-qualified is not matched by the `LIKE` prefix and is left alone.
|
|
224
|
+
* Returns the number of rows rewritten.
|
|
225
|
+
*/
|
|
226
|
+
export function renameTaskHistoryTargetRefs(db, oldBundleId, newBundleId) {
|
|
227
|
+
const prefix = `${escapeLikePattern(oldBundleId)}//`;
|
|
228
|
+
return Number(db
|
|
229
|
+
.prepare(`UPDATE task_history SET target_ref = ? || substr(target_ref, ?) WHERE target_ref LIKE ? ESCAPE '\\'`)
|
|
230
|
+
.run(newBundleId, oldBundleId.length + 1, `${prefix}%`).changes);
|
|
231
|
+
}
|