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
|
@@ -1,149 +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
|
-
export function isValidOp(op) {
|
|
5
|
-
if (typeof op !== "object" || op === null)
|
|
6
|
-
return false;
|
|
7
|
-
const o = op;
|
|
8
|
-
if (o.op === "merge") {
|
|
9
|
-
return typeof o.primary === "string" && Array.isArray(o.secondaries);
|
|
10
|
-
}
|
|
11
|
-
if (o.op === "delete") {
|
|
12
|
-
return typeof o.ref === "string";
|
|
13
|
-
}
|
|
14
|
-
if (o.op === "promote") {
|
|
15
|
-
return typeof o.ref === "string" && typeof o.knowledgeRef === "string";
|
|
16
|
-
}
|
|
17
|
-
if (o.op === "contradict") {
|
|
18
|
-
return typeof o.ref === "string" && typeof o.contradictedByRef === "string";
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
export function mergePlans(chunks, knownRefs) {
|
|
23
|
-
const mergeOps = new Map();
|
|
24
|
-
const deleteOps = new Map();
|
|
25
|
-
const promoteOps = new Map();
|
|
26
|
-
// C-3 / #382: contradict ops keyed by `ref|contradictedByRef` to deduplicate.
|
|
27
|
-
const contradictOps = new Map();
|
|
28
|
-
const warnings = [];
|
|
29
|
-
for (const chunk of chunks) {
|
|
30
|
-
for (const op of chunk) {
|
|
31
|
-
if (op.op === "merge") {
|
|
32
|
-
// Drop ops whose primary the LLM hallucinated (not in the loaded memory
|
|
33
|
-
// pool). Without this guard, a hallucinated primary flows all the way to
|
|
34
|
-
// Phase B where !memoryByRef.has(primary) fires and charges every real
|
|
35
|
-
// secondary with merge_primary_missing — masking LLM hallucinations as
|
|
36
|
-
// filter regressions in health metrics.
|
|
37
|
-
if (knownRefs && !knownRefs.has(op.primary)) {
|
|
38
|
-
warnings.push(`mergePlans: primary ${op.primary} not in loaded memory pool (LLM hallucination) — dropping op before execution.`);
|
|
39
|
-
// Use a dedicated skip reason so dashboards can distinguish
|
|
40
|
-
// hallucinated primaries from stale-DB regressions.
|
|
41
|
-
// Secondaries are real refs; they are NOT charged here — they remain
|
|
42
|
-
// available for other ops to claim.
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
// Filter hallucinated secondaries while preserving real ones.
|
|
46
|
-
let mergeOp = op;
|
|
47
|
-
if (knownRefs) {
|
|
48
|
-
const filteredSecondaries = op.secondaries.filter((sec) => {
|
|
49
|
-
if (!knownRefs.has(sec)) {
|
|
50
|
-
warnings.push(`mergePlans: secondary ${sec} not in loaded memory pool (LLM hallucination) — dropping from op.`);
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
return true;
|
|
54
|
-
});
|
|
55
|
-
if (filteredSecondaries.length !== op.secondaries.length) {
|
|
56
|
-
mergeOp = { ...op, secondaries: filteredSecondaries };
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (mergeOp.secondaries.length > 1) {
|
|
60
|
-
warnings.push(`Merge: ${mergeOp.primary} proposed multiple secondaries; retaining one secondary for review.`);
|
|
61
|
-
mergeOp = { ...mergeOp, secondaries: mergeOp.secondaries.slice(0, 1) };
|
|
62
|
-
}
|
|
63
|
-
// merge wins over delete
|
|
64
|
-
if (deleteOps.has(mergeOp.primary)) {
|
|
65
|
-
deleteOps.delete(mergeOp.primary);
|
|
66
|
-
}
|
|
67
|
-
for (const sec of mergeOp.secondaries) {
|
|
68
|
-
if (deleteOps.has(sec))
|
|
69
|
-
deleteOps.delete(sec);
|
|
70
|
-
}
|
|
71
|
-
mergeOps.set(mergeOp.primary, mergeOp);
|
|
72
|
-
}
|
|
73
|
-
else if (op.op === "delete") {
|
|
74
|
-
// merge and promote both win over delete. A promote is non-destructive
|
|
75
|
-
// (creates a proposal) but the source memory is counted in `promoted`;
|
|
76
|
-
// if a delete also fires, the ref lands in both `promoted` and
|
|
77
|
-
// `skipReasons`, breaking the invariant by +1.
|
|
78
|
-
if (!mergeOps.has(op.ref) && !promoteOps.has(op.ref)) {
|
|
79
|
-
deleteOps.set(op.ref, op);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else if (op.op === "promote") {
|
|
83
|
-
// C-2 / #381: when both a promote and a merge target the same ref,
|
|
84
|
-
// queue the promote FIRST rather than discarding it. The promote op
|
|
85
|
-
// routes through createProposal (the human-gated proposal queue), so
|
|
86
|
-
// it is non-destructive. The merge follows after the proposal is
|
|
87
|
-
// created. This preserves the human reviewer's ability to inspect the
|
|
88
|
-
// promotion before the source memory is merged/deleted.
|
|
89
|
-
// AGM K*8 — retain the maximally informative consistent subset.
|
|
90
|
-
promoteOps.set(op.ref, op);
|
|
91
|
-
}
|
|
92
|
-
else if (op.op === "contradict") {
|
|
93
|
-
// Deduplicate by ref+contradictedByRef pair.
|
|
94
|
-
const key = `${op.ref}|${op.contradictedByRef}`;
|
|
95
|
-
if (!contradictOps.has(key)) {
|
|
96
|
-
contradictOps.set(key, op);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Second pass: enforce merge-wins-over-delete and deduplicate secondaries.
|
|
102
|
-
//
|
|
103
|
-
// 1. Delete/secondary ordering bug: the per-chunk loop removes delete ops
|
|
104
|
-
// for secondaries that were already in deleteOps, but misses the case
|
|
105
|
-
// where the delete chunk came first. A full sweep here fixes both orders.
|
|
106
|
-
//
|
|
107
|
-
// 2. Cross-merge secondary dedup: if ref A is a secondary in two merge ops,
|
|
108
|
-
// only the first (insertion-order) retains it. Without this, a successful
|
|
109
|
-
// merge credits A to mergedSecondaries and a later merge's emitMerge-
|
|
110
|
-
// FailureSkips also charges A to skipReasons — double-counting A while
|
|
111
|
-
// processed has it only once.
|
|
112
|
-
//
|
|
113
|
-
// 3. Primary-as-secondary dedup: if ref A is a primary in one merge op and
|
|
114
|
-
// a secondary in another, remove A from the secondary list. Both merges
|
|
115
|
-
// would otherwise claim A (merged++ for A, then mergedSecondaries++ for A)
|
|
116
|
-
// breaking the invariant the same way.
|
|
117
|
-
// Also remove delete ops for any ref claimed by a promote op (handles the
|
|
118
|
-
// case where the delete chunk appeared before the promote chunk).
|
|
119
|
-
for (const ref of promoteOps.keys()) {
|
|
120
|
-
deleteOps.delete(ref);
|
|
121
|
-
}
|
|
122
|
-
const claimedSecondaries = new Set();
|
|
123
|
-
for (const mergeOp of mergeOps.values()) {
|
|
124
|
-
deleteOps.delete(mergeOp.primary);
|
|
125
|
-
mergeOp.secondaries = mergeOp.secondaries.filter((sec) => {
|
|
126
|
-
if (mergeOps.has(sec)) {
|
|
127
|
-
warnings.push(`Merge: secondary ${sec} is also a merge primary — removing from secondary list to avoid double-count.`);
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
if (claimedSecondaries.has(sec)) {
|
|
131
|
-
warnings.push(`Merge: secondary ${sec} appears in multiple merge ops — retaining in first op only.`);
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
claimedSecondaries.add(sec);
|
|
135
|
-
deleteOps.delete(sec);
|
|
136
|
-
return true;
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
// C-2 / #381: promote ops are ordered BEFORE merge ops so that the
|
|
140
|
-
// human-gated proposal queue entry is created before any destructive merge.
|
|
141
|
-
// Phase B processes ops in array order, so promote executes first.
|
|
142
|
-
const ops = [
|
|
143
|
-
...promoteOps.values(),
|
|
144
|
-
...mergeOps.values(),
|
|
145
|
-
...deleteOps.values(),
|
|
146
|
-
...contradictOps.values(),
|
|
147
|
-
];
|
|
148
|
-
return { ops, warnings };
|
|
149
|
-
}
|
|
@@ -1,291 +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
|
-
* Memory→knowledge promotion branch for `akm distill`.
|
|
6
|
-
*
|
|
7
|
-
* This is an entire second command that used to be inlined inside `akmDistill`:
|
|
8
|
-
* when a `memory:*` ref is reinforced enough (per the deterministic stability
|
|
9
|
-
* heuristic in `distill-promotion-policy`), distill graduates it into a
|
|
10
|
-
* `knowledge:*` proposal instead of a lesson. The branch owns its own LLM
|
|
11
|
-
* contradiction-merge (mem0 ADD/UPDATE/NOOP), quality gate, proposal creation,
|
|
12
|
-
* and `distill_invoked` event emit.
|
|
13
|
-
*
|
|
14
|
-
* {@link promoteMemoryToKnowledge} returns the finished {@link AkmDistillResult}
|
|
15
|
-
* when the branch fired, or `null` when the ref is not a promotion candidate —
|
|
16
|
-
* in which case the caller falls through to the ordinary lesson/knowledge LLM
|
|
17
|
-
* path. Logic is byte-identical to the pre-extraction inline code.
|
|
18
|
-
*/
|
|
19
|
-
import fs from "node:fs";
|
|
20
|
-
import { parseFrontmatter } from "../../../core/asset/frontmatter.js";
|
|
21
|
-
import { ConfigError } from "../../../core/errors.js";
|
|
22
|
-
import { appendEvent } from "../../../core/events.js";
|
|
23
|
-
import { parseEmbeddedJsonResponse } from "../../../core/parse.js";
|
|
24
|
-
import { callStructured } from "../../../llm/structured-call.js";
|
|
25
|
-
import { isProposalSkipped } from "../../proposal/repository.js";
|
|
26
|
-
import { assessMemoryKnowledgePromotionCandidate } from "../distill-promotion-policy.js";
|
|
27
|
-
import { emitProposal } from "../proposal-envelope.js";
|
|
28
|
-
import { durableImproveRef } from "../source-identity.js";
|
|
29
|
-
import { persistOutputEncodingSalience, runLessonQualityJudge, writeQualityRejection } from "./quality-gate.js";
|
|
30
|
-
/** Read-only classification of the deterministic promotion path and destination conflict. */
|
|
31
|
-
export async function planMemoryKnowledgePromotion(ctx) {
|
|
32
|
-
const durableInputRef = ctx.durableInputRef ?? ctx.inputRef;
|
|
33
|
-
const promotion = ctx.targetKind === "lesson"
|
|
34
|
-
? null
|
|
35
|
-
: assessMemoryKnowledgePromotionCandidate({
|
|
36
|
-
inputRef: durableInputRef,
|
|
37
|
-
assetContent: ctx.assetContent,
|
|
38
|
-
feedbackEvents: ctx.filteredEvents.map((event) => ({
|
|
39
|
-
...(event.metadata !== undefined ? { metadata: event.metadata } : {}),
|
|
40
|
-
})),
|
|
41
|
-
});
|
|
42
|
-
if (!(promotion?.promote && promotion.content && (ctx.targetKind === "knowledge" || ctx.targetKind === "auto"))) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
const existingKnowledgePath = await ctx.lookup(durableImproveRef(promotion.knowledgeRef));
|
|
46
|
-
let existingKnowledgeContent = null;
|
|
47
|
-
if (existingKnowledgePath && fs.existsSync(existingKnowledgePath)) {
|
|
48
|
-
try {
|
|
49
|
-
existingKnowledgeContent = fs.readFileSync(existingKnowledgePath, "utf8");
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
existingKnowledgeContent = null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return { promotion: promotion, existingKnowledgeContent };
|
|
56
|
-
}
|
|
57
|
-
/** Whether a classified promotion will actually call merge generation and/or the judge. */
|
|
58
|
-
export function memoryKnowledgePromotionRequiresDispatch(ctx, plan) {
|
|
59
|
-
const hasRunner = Boolean(ctx.llmRunner);
|
|
60
|
-
return ((Boolean(plan.existingKnowledgeContent) && hasRunner) ||
|
|
61
|
-
(ctx.strategy?.processes?.distill?.qualityGate?.enabled ?? true));
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Resolve the knowledge content to propose when a memory promotes to knowledge,
|
|
65
|
-
* reconciling it with any existing knowledge file at the destination (D-1 / #369).
|
|
66
|
-
*
|
|
67
|
-
* When the destination already exists and an LLM is configured, follows the
|
|
68
|
-
* mem0 ADD/UPDATE/NOOP pattern (arXiv:2504.19413 §3.2): ADD/UPDATE swap in the
|
|
69
|
-
* merged content, NOOP short-circuits with a terminal "skipped" result. Without
|
|
70
|
-
* an LLM the existing content is appended as reviewer-reference context so the
|
|
71
|
-
* merge can be done by hand. Logic is byte-identical to the prior inline block.
|
|
72
|
-
*/
|
|
73
|
-
async function resolveKnowledgePromotionContent(ctx, plan) {
|
|
74
|
-
const durableInputRef = ctx.durableInputRef ?? ctx.inputRef;
|
|
75
|
-
const baseContent = plan.promotion.content;
|
|
76
|
-
const knowledgeRef = plan.promotion.knowledgeRef;
|
|
77
|
-
let resolvedPromotionContent = baseContent;
|
|
78
|
-
const existingKnowledgeContent = plan.existingKnowledgeContent;
|
|
79
|
-
const runner = ctx.llmRunner;
|
|
80
|
-
if (existingKnowledgeContent && runner) {
|
|
81
|
-
// Existing content found: call LLM for contradiction-resolution merge.
|
|
82
|
-
const mergePrompt = [
|
|
83
|
-
"You are merging two versions of a knowledge document.",
|
|
84
|
-
"Existing content is already committed; new content comes from a memory distillation run.",
|
|
85
|
-
"Choose one of: ADD (combine both), UPDATE (replace existing with new), NOOP (keep existing unchanged).",
|
|
86
|
-
'Return ONLY valid JSON: {"action": "ADD"|"UPDATE"|"NOOP", "content": "<merged markdown if ADD/UPDATE, empty string if NOOP>"}',
|
|
87
|
-
"",
|
|
88
|
-
"## Existing knowledge content",
|
|
89
|
-
"```",
|
|
90
|
-
existingKnowledgeContent.slice(0, 3000),
|
|
91
|
-
"```",
|
|
92
|
-
"",
|
|
93
|
-
"## New content from distillation",
|
|
94
|
-
"```",
|
|
95
|
-
baseContent.slice(0, 3000),
|
|
96
|
-
"```",
|
|
97
|
-
].join("\n");
|
|
98
|
-
try {
|
|
99
|
-
const mergeResponse = await callStructured({
|
|
100
|
-
feature: "distill",
|
|
101
|
-
runner,
|
|
102
|
-
...(ctx.lease ? { lease: ctx.lease } : {}),
|
|
103
|
-
messages: [
|
|
104
|
-
{ role: "system", content: "Return only valid JSON. No prose." },
|
|
105
|
-
{ role: "user", content: mergePrompt },
|
|
106
|
-
],
|
|
107
|
-
request: {
|
|
108
|
-
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
109
|
-
...(ctx.chat ? { chat: ctx.chat } : {}),
|
|
110
|
-
},
|
|
111
|
-
parse: (raw) => raw ?? "",
|
|
112
|
-
onError: () => "",
|
|
113
|
-
fallback: "",
|
|
114
|
-
...(ctx.onNotices ? { onNotices: ctx.onNotices } : {}),
|
|
115
|
-
});
|
|
116
|
-
const mergeResult = parseEmbeddedJsonResponse(mergeResponse);
|
|
117
|
-
if (mergeResult?.action === "NOOP") {
|
|
118
|
-
// Existing content is authoritative — no update needed.
|
|
119
|
-
appendEvent({
|
|
120
|
-
eventType: "distill_invoked",
|
|
121
|
-
// Use item_ref when resolved, otherwise the input conceptId.
|
|
122
|
-
ref: ctx.itemRef ?? durableInputRef,
|
|
123
|
-
metadata: {
|
|
124
|
-
outcome: "skipped",
|
|
125
|
-
proposalRef: knowledgeRef,
|
|
126
|
-
message: "D-1: LLM resolved destination conflict as NOOP — existing content kept",
|
|
127
|
-
...ctx.eligMeta,
|
|
128
|
-
},
|
|
129
|
-
}, ctx.eventsCtx);
|
|
130
|
-
return {
|
|
131
|
-
earlyResult: {
|
|
132
|
-
schemaVersion: 1,
|
|
133
|
-
ok: true,
|
|
134
|
-
outcome: "skipped",
|
|
135
|
-
inputRef: ctx.inputRef,
|
|
136
|
-
proposalRef: knowledgeRef,
|
|
137
|
-
skipReason: "conflict_noop",
|
|
138
|
-
message: "Existing knowledge content unchanged (contradiction resolution: NOOP)",
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
if (mergeResult?.action && (mergeResult.action === "ADD" || mergeResult.action === "UPDATE")) {
|
|
143
|
-
if (mergeResult.content?.trim()) {
|
|
144
|
-
resolvedPromotionContent = mergeResult.content;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
catch (error) {
|
|
149
|
-
if (error instanceof ConfigError)
|
|
150
|
-
throw error;
|
|
151
|
-
// LLM merge failed — fall through with the original promotion content.
|
|
152
|
-
// The reviewer will see both versions in the proposal diff.
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
else if (existingKnowledgeContent) {
|
|
156
|
-
// No LLM configured: include existing content as context in the proposal
|
|
157
|
-
// so the reviewer can do the contradiction resolution manually.
|
|
158
|
-
resolvedPromotionContent = [
|
|
159
|
-
baseContent,
|
|
160
|
-
"",
|
|
161
|
-
"---",
|
|
162
|
-
"<!-- D-1 / #369: Existing knowledge content is shown below for reviewer reference. -->",
|
|
163
|
-
"<!-- Review: decide whether to ADD (merge), UPDATE (replace), or NOOP (keep existing). -->",
|
|
164
|
-
"",
|
|
165
|
-
"## Existing content (for reviewer reference)",
|
|
166
|
-
"",
|
|
167
|
-
existingKnowledgeContent,
|
|
168
|
-
].join("\n");
|
|
169
|
-
}
|
|
170
|
-
return { resolvedContent: resolvedPromotionContent };
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Run the memory→knowledge promotion branch. Returns the finished distill
|
|
174
|
-
* result when promotion fired (all paths terminal), or `null` when the ref is
|
|
175
|
-
* not a promotion candidate and the caller should continue to the ordinary
|
|
176
|
-
* lesson/knowledge distillation path.
|
|
177
|
-
*/
|
|
178
|
-
export async function promoteMemoryToKnowledge(ctx, planned) {
|
|
179
|
-
const { inputRef, assetContent, config, chat, stash, fetchSimilarLessonsFn, existingRefVocabulary, outcomeWeightEnabled, eligMeta, exclusionSetSize, filteredFeedbackCount, feedbackFullyFiltered, } = ctx;
|
|
180
|
-
const durableInputRef = ctx.durableInputRef ?? inputRef;
|
|
181
|
-
const promotionPlan = planned === undefined ? await planMemoryKnowledgePromotion(ctx) : planned;
|
|
182
|
-
if (!promotionPlan)
|
|
183
|
-
return null;
|
|
184
|
-
const promotion = promotionPlan.promotion;
|
|
185
|
-
// D-1 / #369: When the destination knowledge file already exists, route
|
|
186
|
-
// through the LLM for contradiction resolution instead of silently
|
|
187
|
-
// overwriting. Follows mem0 ADD/UPDATE/DELETE/NOOP pattern (arXiv:2504.19413 §3.2)
|
|
188
|
-
// and A-MEM dynamic linking (arXiv:2502.12110).
|
|
189
|
-
const merged = await resolveKnowledgePromotionContent(ctx, promotionPlan);
|
|
190
|
-
if ("earlyResult" in merged)
|
|
191
|
-
return merged.earlyResult;
|
|
192
|
-
const resolvedPromotionContent = merged.resolvedContent;
|
|
193
|
-
// Apply quality gate to fast-path knowledge promotion (Risk 4 fix).
|
|
194
|
-
// D-5 / #388: Three-band system — review_needed band queues to proposal
|
|
195
|
-
// queue with review_needed outcome rather than auto-rejecting.
|
|
196
|
-
let knowledgeJudgeConfidence;
|
|
197
|
-
if (ctx.strategy?.processes?.distill?.qualityGate?.enabled ?? true) {
|
|
198
|
-
// D-4 / #390: retrieve top-3 similar lessons for dedup check in judge.
|
|
199
|
-
const similarLessons = await fetchSimilarLessonsFn(resolvedPromotionContent.slice(0, 500), 3);
|
|
200
|
-
const judgeResult = await runLessonQualityJudge(config, resolvedPromotionContent, assetContent ?? "", chat, {
|
|
201
|
-
...(similarLessons.length > 0 ? { similarLessons } : {}),
|
|
202
|
-
...(ctx.llmRunner ? { llmRunner: ctx.llmRunner } : {}),
|
|
203
|
-
...(ctx.lease ? { lease: ctx.lease } : {}),
|
|
204
|
-
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
205
|
-
...(ctx.onNotices ? { onNotices: ctx.onNotices } : {}),
|
|
206
|
-
});
|
|
207
|
-
if (!judgeResult.pass) {
|
|
208
|
-
if (judgeResult.reviewNeeded) {
|
|
209
|
-
// Uncertainty band (2.5–3.5): queue as review_needed instead of rejecting.
|
|
210
|
-
return writeQualityRejection(stash, inputRef, promotion.knowledgeRef, resolvedPromotionContent, judgeResult.score, judgeResult.reason, { reviewNeeded: true }, ctx.eligibilitySource, ctx.eventsCtx);
|
|
211
|
-
}
|
|
212
|
-
return writeQualityRejection(stash, inputRef, promotion.knowledgeRef, resolvedPromotionContent, judgeResult.score, judgeResult.reason, {}, ctx.eligibilitySource, ctx.eventsCtx);
|
|
213
|
-
}
|
|
214
|
-
// Normalize 1-5 judge score to [0, 1]. Only a real passing verdict reaches
|
|
215
|
-
// here (07 P0-2: the judge now fails CLOSED on no-LLM / timeout / parse
|
|
216
|
-
// failure, so those return pass:false and early-return above). The score>0
|
|
217
|
-
// guard defensively leaves confidence undefined for any non-positive score.
|
|
218
|
-
if (judgeResult.score > 0)
|
|
219
|
-
knowledgeJudgeConfidence = judgeResult.score / 5;
|
|
220
|
-
}
|
|
221
|
-
const knowledgeParsed = parseFrontmatter(resolvedPromotionContent);
|
|
222
|
-
const proposalResult = emitProposal({ stashDir: stash, proposalsCtx: ctx.proposalsCtx }, {
|
|
223
|
-
ref: promotion.knowledgeRef,
|
|
224
|
-
source: "distill",
|
|
225
|
-
// §23.6 fingerprint model-id term (WI-6.4).
|
|
226
|
-
...(ctx.llmRunner?.connection.model ? { modelId: ctx.llmRunner.connection.model } : {}),
|
|
227
|
-
...(ctx.sourceRun !== undefined ? { sourceRun: ctx.sourceRun } : {}),
|
|
228
|
-
payload: {
|
|
229
|
-
content: resolvedPromotionContent,
|
|
230
|
-
...(Object.keys(knowledgeParsed.data).length > 0 ? { frontmatter: knowledgeParsed.data } : {}),
|
|
231
|
-
},
|
|
232
|
-
...(knowledgeJudgeConfidence !== undefined ? { confidence: knowledgeJudgeConfidence } : {}),
|
|
233
|
-
// Attribution tagging: persist the eligibility lane on the proposal.
|
|
234
|
-
...(ctx.eligibilitySource ? { eligibilitySource: ctx.eligibilitySource } : {}),
|
|
235
|
-
});
|
|
236
|
-
if (isProposalSkipped(proposalResult)) {
|
|
237
|
-
appendEvent({
|
|
238
|
-
eventType: "distill_invoked",
|
|
239
|
-
// Use item_ref when resolved, otherwise the input conceptId.
|
|
240
|
-
ref: ctx.itemRef ?? durableInputRef,
|
|
241
|
-
metadata: {
|
|
242
|
-
outcome: "skipped",
|
|
243
|
-
proposalRef: promotion.knowledgeRef,
|
|
244
|
-
message: proposalResult.message,
|
|
245
|
-
skipReason: proposalResult.reason,
|
|
246
|
-
...eligMeta,
|
|
247
|
-
},
|
|
248
|
-
}, ctx.eventsCtx);
|
|
249
|
-
return {
|
|
250
|
-
schemaVersion: 1,
|
|
251
|
-
ok: true,
|
|
252
|
-
outcome: "skipped",
|
|
253
|
-
inputRef,
|
|
254
|
-
proposalRef: promotion.knowledgeRef,
|
|
255
|
-
skipReason: proposalResult.reason,
|
|
256
|
-
message: proposalResult.message,
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
const proposal = proposalResult;
|
|
260
|
-
// G4: content-score the distilled OUTPUT so it carries a real encoding
|
|
261
|
-
// salience (encoding_source='content') from creation.
|
|
262
|
-
persistOutputEncodingSalience(durableImproveRef(promotion.knowledgeRef), resolvedPromotionContent, existingRefVocabulary, outcomeWeightEnabled);
|
|
263
|
-
appendEvent({
|
|
264
|
-
eventType: "distill_invoked",
|
|
265
|
-
// Use item_ref when resolved, otherwise the input conceptId.
|
|
266
|
-
ref: ctx.itemRef ?? durableInputRef,
|
|
267
|
-
metadata: {
|
|
268
|
-
outcome: "queued",
|
|
269
|
-
proposalRef: promotion.knowledgeRef,
|
|
270
|
-
proposalKind: "knowledge",
|
|
271
|
-
proposalId: proposal.id,
|
|
272
|
-
// R3: judge verdicts are longitudinally queryable, not just a one-shot
|
|
273
|
-
// proposal.confidence write (normalized 1–5 score / 5).
|
|
274
|
-
...(knowledgeJudgeConfidence !== undefined ? { judgeConfidence: knowledgeJudgeConfidence } : {}),
|
|
275
|
-
...(ctx.sourceRun !== undefined ? { sourceRun: ctx.sourceRun } : {}),
|
|
276
|
-
...(exclusionSetSize > 0 ? { filteredFeedbackCount } : {}),
|
|
277
|
-
...eligMeta,
|
|
278
|
-
},
|
|
279
|
-
}, ctx.eventsCtx);
|
|
280
|
-
return {
|
|
281
|
-
schemaVersion: 1,
|
|
282
|
-
ok: true,
|
|
283
|
-
outcome: "queued",
|
|
284
|
-
inputRef,
|
|
285
|
-
proposalRef: promotion.knowledgeRef,
|
|
286
|
-
proposalKind: "knowledge",
|
|
287
|
-
proposalId: proposal.id,
|
|
288
|
-
proposal,
|
|
289
|
-
...(exclusionSetSize > 0 ? { filteredFeedbackCount, feedbackFullyFiltered } : {}),
|
|
290
|
-
};
|
|
291
|
-
}
|