@remnic/core 9.69.51 → 9.69.53
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/dist/access-admin-ops-surface.d.ts +14 -14
- package/dist/access-admin-ops-surface.js +46 -46
- package/dist/access-authorization-probe.d.ts +14 -14
- package/dist/access-authorization-probe.js +47 -47
- package/dist/access-boundary.d.ts +14 -14
- package/dist/access-boundary.js +46 -46
- package/dist/access-cli.js +92 -92
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +14 -14
- package/dist/access-extraction-force-flush.js +46 -46
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-briefing.d.ts +14 -14
- package/dist/access-http-briefing.js +47 -47
- package/dist/access-http-lcm-compaction.d.ts +14 -14
- package/dist/access-http-lifecycle-flush.d.ts +14 -14
- package/dist/access-http-offline-stream.d.ts +14 -14
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +48 -48
- package/dist/access-http.d.ts +15 -15
- package/dist/access-http.js +62 -62
- package/dist/access-identity-continuity-surface.d.ts +11 -11
- package/dist/access-identity-continuity-surface.js +46 -46
- package/dist/access-lcm-surface.d.ts +14 -14
- package/dist/access-lcm-surface.js +46 -46
- package/dist/access-mcp-shared-context-tools.d.ts +14 -14
- package/dist/access-mcp.d.ts +14 -14
- package/dist/access-mcp.js +55 -55
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-C1q3XuAc.d.ts → access-namespace-preflight-U9RAdxqZ.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +46 -46
- package/dist/access-observe-transcript.d.ts +11 -11
- package/dist/access-observe-write-category.d.ts +3 -3
- package/dist/access-observe-write-category.js +2 -2
- package/dist/access-observe-write-surface.d.ts +14 -14
- package/dist/access-observe-write-surface.js +46 -46
- package/dist/access-offline-manifest.d.ts +11 -11
- package/dist/access-offline-manifest.js +5 -5
- package/dist/access-operations-batch.js +47 -47
- package/dist/access-operations.d.ts +14 -14
- package/dist/access-operations.js +54 -54
- package/dist/access-recall-concurrency.d.ts +14 -14
- package/dist/access-recall-concurrency.js +46 -46
- package/dist/access-recall-response.d.ts +14 -14
- package/dist/access-recall-response.js +46 -46
- package/dist/access-recall-surface.d.ts +14 -14
- package/dist/access-recall-surface.js +46 -46
- package/dist/access-schema.d.ts +114 -114
- package/dist/{access-service-BZaC-RZw.d.ts → access-service-H-qEdnSs.d.ts} +73 -73
- package/dist/access-service-helpers.d.ts +14 -14
- package/dist/access-service.d.ts +14 -14
- package/dist/access-service.js +46 -46
- package/dist/access-surface-catalog.d.ts +14 -14
- package/dist/access-surface-catalog.js +48 -48
- package/dist/access-wearables-meetings-surface.d.ts +4 -4
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +72 -1
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +1 -1
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.d.ts +1 -1
- package/dist/{auto-sync-DG5KEOF5.js → auto-sync-CWSZDLLW.js} +6 -6
- package/dist/background-generation.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +11 -11
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +9 -9
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer-turn-helpers.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/buffer.js +4 -4
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/capabilities.d.ts +1 -1
- package/dist/{catalog-DK2eHhax.d.ts → catalog-BuMyYPUn.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +16 -16
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-2ERLN25A.js → chunk-2HJKAVAS.js} +5 -5
- package/dist/{chunk-CKBA2MWS.js → chunk-2QZJ4P27.js} +2 -2
- package/dist/{chunk-ETNC6TT6.js → chunk-43IQRLEF.js} +2 -2
- package/dist/{chunk-PQWICTRO.js → chunk-4UVJ6EIT.js} +1 -1
- package/dist/chunk-4UVJ6EIT.js.map +1 -0
- package/dist/{chunk-DQSVGTKB.js → chunk-6UEM5EOB.js} +2 -2
- package/dist/{chunk-JGPG5UHM.js → chunk-7QVYVSEH.js} +2 -2
- package/dist/{chunk-HEKWNWNL.js → chunk-7RKAE6Y4.js} +3 -3
- package/dist/{chunk-UP3226JC.js → chunk-A4TQFNRX.js} +5 -5
- package/dist/{chunk-T73ZC7C5.js → chunk-AH44WTLJ.js} +2 -2
- package/dist/{chunk-SZ75IB2T.js → chunk-AQWGCHIV.js} +6 -6
- package/dist/{chunk-Q6OC4UUT.js → chunk-ARRKSBQU.js} +5 -5
- package/dist/{chunk-6Z4OLQUO.js → chunk-AYHNTYVG.js} +2 -2
- package/dist/{chunk-XHDQQ2TT.js → chunk-BCXZ4BDS.js} +2 -2
- package/dist/{chunk-VLR4S5GF.js → chunk-CO7KBRPF.js} +3 -3
- package/dist/{chunk-JHUODJRW.js → chunk-D2N3PMAE.js} +2 -2
- package/dist/{chunk-7SJCSDQ3.js → chunk-D7VT2LED.js} +2 -2
- package/dist/{chunk-X25NTN3W.js → chunk-DI52XAKG.js} +2 -2
- package/dist/{chunk-EUP4AXIW.js → chunk-DZP2XMZC.js} +2 -2
- package/dist/{chunk-BULK6DGB.js → chunk-EQNZC3BH.js} +2 -2
- package/dist/{chunk-OIK3YL2P.js → chunk-EVQ33D3N.js} +4 -4
- package/dist/{chunk-MNF6PTNL.js → chunk-EYK3UHAP.js} +2 -2
- package/dist/{chunk-VSN2DMQK.js → chunk-G2DF5MI7.js} +4 -4
- package/dist/{chunk-JIWZVOQM.js → chunk-G7S37WD4.js} +2 -2
- package/dist/{chunk-2G2CVN2T.js → chunk-HUQMVI3A.js} +147 -58
- package/dist/chunk-HUQMVI3A.js.map +1 -0
- package/dist/{chunk-6HCJWCA4.js → chunk-IEOBAOA6.js} +6 -6
- package/dist/{chunk-UDAUULK2.js → chunk-IGEZE6QB.js} +5 -5
- package/dist/{chunk-SGHGCFVV.js → chunk-JE334SIA.js} +10 -10
- package/dist/{chunk-XFXVIXDI.js → chunk-JE4H2QBO.js} +2 -2
- package/dist/{chunk-33SX6K3N.js → chunk-JMZQS6OS.js} +2 -2
- package/dist/{chunk-BMAYH7F4.js → chunk-K7FXR75S.js} +514 -381
- package/dist/chunk-K7FXR75S.js.map +1 -0
- package/dist/{chunk-3RABJOGD.js → chunk-KH2D26LQ.js} +5 -5
- package/dist/{chunk-AH3OIMS7.js → chunk-KQQEZTH6.js} +2 -2
- package/dist/{chunk-QRSC37NC.js → chunk-M7HFDWOS.js} +3 -3
- package/dist/{chunk-2EICZYIG.js → chunk-MTJUIIM4.js} +2 -2
- package/dist/{chunk-ST7FDKZT.js → chunk-MWVYHNSU.js} +2 -2
- package/dist/{chunk-NXSNFPYI.js → chunk-MXTCV3B5.js} +2 -2
- package/dist/{chunk-O4JFBEUL.js → chunk-O7OVWKT4.js} +2 -2
- package/dist/{chunk-RIP2AOZW.js → chunk-QWQB7TOB.js} +19 -19
- package/dist/{chunk-PYTSGD5M.js → chunk-RSMNPYBM.js} +2 -2
- package/dist/{chunk-MYDA2GA2.js → chunk-RUUJXAGT.js} +2 -2
- package/dist/{chunk-YJJMJH6J.js → chunk-SEQ6DWXD.js} +11 -11
- package/dist/{chunk-SCM4VYJW.js → chunk-SLGD36MM.js} +3 -3
- package/dist/{chunk-KAPYPTPS.js → chunk-SOOWBRMH.js} +13 -13
- package/dist/{chunk-JG4AP36X.js → chunk-SPFNGHHP.js} +2 -2
- package/dist/{chunk-7TTOX6NW.js → chunk-SPWNCGSM.js} +2 -2
- package/dist/{chunk-3QZRSEAM.js → chunk-SZ7IVZGD.js} +2 -2
- package/dist/{chunk-IGDEKECC.js → chunk-TQT4AOPO.js} +4 -4
- package/dist/{chunk-NVW5ISEJ.js → chunk-TS66MUUJ.js} +50 -50
- package/dist/{chunk-6ZMIASYT.js → chunk-U2SK45U3.js} +2 -2
- package/dist/{chunk-72AV2H3R.js → chunk-U3NBO4IX.js} +39 -3
- package/dist/chunk-U3NBO4IX.js.map +1 -0
- package/dist/{chunk-SMI2G3MA.js → chunk-UCH2RWFX.js} +2 -2
- package/dist/{chunk-A33DLYNY.js → chunk-UDJMJNBK.js} +2 -2
- package/dist/{chunk-DLXBMXIB.js → chunk-UJBIWY5M.js} +5 -5
- package/dist/{chunk-25HSEIEM.js → chunk-ULQVG6G3.js} +2 -2
- package/dist/{chunk-EBJL6HGR.js → chunk-UVZBDIJX.js} +211 -1
- package/dist/chunk-UVZBDIJX.js.map +1 -0
- package/dist/{chunk-XRUOO7OT.js → chunk-VGO57TU7.js} +5 -5
- package/dist/{chunk-LX7KIJQF.js → chunk-VMKAA5SU.js} +2 -2
- package/dist/{chunk-KBHDV7P3.js → chunk-VUV472VH.js} +12 -12
- package/dist/{chunk-LZI6FWZW.js → chunk-WH7RINGG.js} +4 -4
- package/dist/{chunk-FDDCZDBI.js → chunk-WN4HFL4K.js} +4 -4
- package/dist/{chunk-ISA5U5AP.js → chunk-WUJD4CHZ.js} +4 -4
- package/dist/{chunk-UVEBBXB5.js → chunk-X7WAM3IY.js} +2 -2
- package/dist/{chunk-NROI5XMG.js → chunk-XPFJSUOR.js} +5 -5
- package/dist/{chunk-2SZBCM2S.js → chunk-Y4G6LHJW.js} +2 -2
- package/dist/{chunk-JXSOB3SA.js → chunk-Y7LZ5V7N.js} +2 -2
- package/dist/{chunk-YSBYNCCN.js → chunk-YLPCEUXP.js} +3 -3
- package/dist/{chunk-RFIJH2OE.js → chunk-YUHGJBQK.js} +2 -2
- package/dist/{chunk-DX63RFDJ.js → chunk-ZADYEZY4.js} +2 -2
- package/dist/{chunk-TNFDWJRS.js → chunk-ZANEMAEV.js} +2 -2
- package/dist/{cli-BHDMJqJS.d.ts → cli-VGDSn2zY.d.ts} +5 -5
- package/dist/cli.d.ts +16 -16
- package/dist/cli.js +75 -75
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +9 -9
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +8 -8
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +72 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +12 -12
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +16 -16
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +4 -4
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +10 -10
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/corpus-watermark.d.ts +1 -1
- package/dist/corpus-watermark.js +10 -10
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/deep-recall-http-glue.d.ts +14 -14
- package/dist/deep-recall-mcp-tools.d.ts +14 -14
- package/dist/deep-recall-policy-llm.d.ts +2 -2
- package/dist/deep-recall-seeds.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +1 -1
- package/dist/{dependency-propagation-delivery-BMkR4gmY.d.ts → dependency-propagation-delivery-BrhPjAHQ.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/directory-sidecars.d.ts +30 -7
- package/dist/directory-sidecars.js +5 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-origin-fields.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +8 -8
- package/dist/entity-schema.d.ts +1 -1
- package/dist/episodic-context.d.ts +1 -1
- package/dist/eval-trajectory-contracts.d.ts +1 -1
- package/dist/eval-trajectory-store.d.ts +1 -1
- package/dist/eval-trajectory.d.ts +1 -1
- package/dist/explicit-capture.d.ts +11 -11
- package/dist/external-wiki-access.d.ts +14 -14
- package/dist/external-wiki-access.js +47 -47
- package/dist/external-wiki-collection-registration.d.ts +1 -1
- package/dist/external-wiki-collection.d.ts +1 -1
- package/dist/external-wiki-mcp-tools.d.ts +14 -14
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-evidence-class.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +2 -2
- package/dist/extraction-judge-telemetry.d.ts +2 -2
- package/dist/extraction-judge-training.d.ts +2 -2
- package/dist/extraction-judge.d.ts +2 -2
- package/dist/extraction-judge.js +2 -2
- package/dist/extraction-liveness.d.ts +1 -1
- package/dist/extraction-normalization.d.ts +1 -1
- package/dist/extraction-prompt.d.ts +1 -1
- package/dist/extraction-source-grounding-rules.d.ts +1 -1
- package/dist/extraction-source-grounding.d.ts +1 -1
- package/dist/extraction-span-config.d.ts +1 -1
- package/dist/extraction-span-materialize.d.ts +1 -1
- package/dist/extraction-span-wire.d.ts +1 -1
- package/dist/extraction.d.ts +2 -2
- package/dist/extraction.js +18 -18
- package/dist/fallback-llm-codex-subscription.d.ts +1 -1
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{generic-recall-paths-BCRtXU32.d.ts → generic-recall-paths-C0J1Oxb7.d.ts} +1 -1
- package/dist/graph-append-error.d.ts +1 -1
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-jsonl.d.ts +1 -1
- package/dist/graph-path-reconstruction.d.ts +1 -1
- package/dist/graph-path-scoring.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/harmonic-retrieval.js +2 -2
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/importers/test-utils.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/{index-DMNTW4W6.d.ts → index-B735x-tK.d.ts} +3 -3
- package/dist/index.d.ts +702 -702
- package/dist/index.js +165 -165
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/{local-llm-BXYC-mbU.d.ts → local-llm-BkkEK9rn.d.ts} +1 -1
- package/dist/local-llm-helpers.d.ts +2 -2
- package/dist/local-llm.d.ts +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +5 -5
- package/dist/location/index.js +12 -12
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +8 -8
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +9 -9
- package/dist/{maintenance-zJiLsKBY.d.ts → maintenance-CLBIvVxg.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +14 -14
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-browse-http-glue.d.ts +14 -14
- package/dist/memory-browse-mcp-tools.d.ts +14 -14
- package/dist/memory-browse-operations.js +47 -47
- package/dist/memory-browse.d.ts +1 -1
- package/dist/memory-browse.js +5 -5
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-controller.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-snapshot.d.ts +1 -1
- package/dist/memory-subject-cli.d.ts +14 -14
- package/dist/memory-subject.d.ts +14 -14
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +9 -9
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +8 -8
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- package/dist/offline-sync-impression-drain.js +3 -3
- package/dist/operator-doctor-corpus.d.ts +1 -1
- package/dist/operator-doctor-corpus.js +13 -13
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +36 -36
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +19 -19
- package/dist/{orchestrator-BTqT3F6X.d.ts → orchestrator-iexgVLow.d.ts} +13 -11
- package/dist/orchestrator.d.ts +11 -11
- package/dist/orchestrator.js +92 -92
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CgO2Sd4O.d.ts → pipeline-DvtDtyo9.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +2 -2
- package/dist/provenance.d.ts +1 -1
- package/dist/{public-http-Dk1EA9ix.d.ts → public-http-P0cnHzYB.d.ts} +1 -1
- package/dist/{qmd-CwxtVz64.d.ts → qmd-CBYBJ6HW.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +2 -2
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +2 -2
- package/dist/recall-concurrency-config.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-navigate-access.d.ts +1 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +1 -1
- package/dist/recall-navigate-disclosure.js +2 -2
- package/dist/recall-navigate.d.ts +1 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-navigation-http-glue.d.ts +14 -14
- package/dist/recall-navigation-mcp-tools.d.ts +14 -14
- package/dist/recall-navigation-operations.js +47 -47
- package/dist/recall-navigation-renderer.d.ts +1 -1
- package/dist/recall-navigation.d.ts +1 -1
- package/dist/recall-navigation.js +46 -46
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state-view-admission.d.ts +2 -2
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-state-view-anchors.d.ts +1 -1
- package/dist/recall-state-view-anchors.js +2 -2
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-timings.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +1 -1
- package/dist/reconcile/manifest.d.ts +1 -1
- package/dist/reconcile/manifest.js +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +72 -2
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/salvage-envelope.d.ts +1 -1
- package/dist/schemas.d.ts +160 -160
- package/dist/{scope-profiles-Bg1rB-Dp.d.ts → scope-profiles-BN1Dgfha.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-DEzRyeyn.d.ts → semantic-consolidation-D--qe0eE.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +13 -13
- package/dist/semantic-rule-promotion.js +8 -8
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +8 -8
- package/dist/{service-DGEIDOeD.d.ts → service-VealHeqO.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +9 -9
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +17 -17
- package/dist/standup/build.js +9 -9
- package/dist/{storage-DNQWtOSM.d.ts → storage-CMm-3aD3.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +7 -7
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +17 -17
- package/dist/support-passport/index.js +49 -49
- package/dist/{tagging-CPVwgadt.d.ts → tagging-BjsNFKWz.d.ts} +2 -2
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +8 -8
- package/dist/transfer/types.d.ts +78 -78
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-DCB90q3g.d.ts → types-Du6VdoAg.d.ts} +22 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +8 -8
- package/dist/who-knows-cli.d.ts +14 -14
- package/dist/who-knows-cli.js +9 -9
- package/dist/who-knows.d.ts +14 -14
- package/dist/who-knows.js +8 -8
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/config.ts +3 -4
- package/src/directory-sidecars.test.ts +113 -0
- package/src/directory-sidecars.ts +70 -8
- package/src/experience/session-experience-mining.test.ts +186 -0
- package/src/experience/session-experience-mining.ts +90 -0
- package/src/lifecycle/seed-graduation-config-types.ts +22 -0
- package/src/lifecycle/seed-graduation.test.ts +160 -1
- package/src/lifecycle/seed-graduation.ts +7 -9
- package/src/orchestration/lifecycle-policy-coordinator.ts +12 -0
- package/src/orchestration/persistence-index.ts +50 -0
- package/src/orchestration/recall-recognition-index.test.ts +249 -0
- package/src/orchestration/recall-recognition-index.ts +169 -0
- package/src/orchestrator.ts +1 -0
- package/src/procedural/procedure-miner.ts +8 -6
- package/src/testing/subjects/recall-recognition-index.test.ts +97 -0
- package/src/types.ts +4 -6
- package/dist/chunk-2G2CVN2T.js.map +0 -1
- package/dist/chunk-72AV2H3R.js.map +0 -1
- package/dist/chunk-BMAYH7F4.js.map +0 -1
- package/dist/chunk-EBJL6HGR.js.map +0 -1
- package/dist/chunk-PQWICTRO.js.map +0 -1
- /package/dist/{auto-sync-DG5KEOF5.js.map → auto-sync-CWSZDLLW.js.map} +0 -0
- /package/dist/{chunk-2ERLN25A.js.map → chunk-2HJKAVAS.js.map} +0 -0
- /package/dist/{chunk-CKBA2MWS.js.map → chunk-2QZJ4P27.js.map} +0 -0
- /package/dist/{chunk-ETNC6TT6.js.map → chunk-43IQRLEF.js.map} +0 -0
- /package/dist/{chunk-DQSVGTKB.js.map → chunk-6UEM5EOB.js.map} +0 -0
- /package/dist/{chunk-JGPG5UHM.js.map → chunk-7QVYVSEH.js.map} +0 -0
- /package/dist/{chunk-HEKWNWNL.js.map → chunk-7RKAE6Y4.js.map} +0 -0
- /package/dist/{chunk-UP3226JC.js.map → chunk-A4TQFNRX.js.map} +0 -0
- /package/dist/{chunk-T73ZC7C5.js.map → chunk-AH44WTLJ.js.map} +0 -0
- /package/dist/{chunk-SZ75IB2T.js.map → chunk-AQWGCHIV.js.map} +0 -0
- /package/dist/{chunk-Q6OC4UUT.js.map → chunk-ARRKSBQU.js.map} +0 -0
- /package/dist/{chunk-6Z4OLQUO.js.map → chunk-AYHNTYVG.js.map} +0 -0
- /package/dist/{chunk-XHDQQ2TT.js.map → chunk-BCXZ4BDS.js.map} +0 -0
- /package/dist/{chunk-VLR4S5GF.js.map → chunk-CO7KBRPF.js.map} +0 -0
- /package/dist/{chunk-JHUODJRW.js.map → chunk-D2N3PMAE.js.map} +0 -0
- /package/dist/{chunk-7SJCSDQ3.js.map → chunk-D7VT2LED.js.map} +0 -0
- /package/dist/{chunk-X25NTN3W.js.map → chunk-DI52XAKG.js.map} +0 -0
- /package/dist/{chunk-EUP4AXIW.js.map → chunk-DZP2XMZC.js.map} +0 -0
- /package/dist/{chunk-BULK6DGB.js.map → chunk-EQNZC3BH.js.map} +0 -0
- /package/dist/{chunk-OIK3YL2P.js.map → chunk-EVQ33D3N.js.map} +0 -0
- /package/dist/{chunk-MNF6PTNL.js.map → chunk-EYK3UHAP.js.map} +0 -0
- /package/dist/{chunk-VSN2DMQK.js.map → chunk-G2DF5MI7.js.map} +0 -0
- /package/dist/{chunk-JIWZVOQM.js.map → chunk-G7S37WD4.js.map} +0 -0
- /package/dist/{chunk-6HCJWCA4.js.map → chunk-IEOBAOA6.js.map} +0 -0
- /package/dist/{chunk-UDAUULK2.js.map → chunk-IGEZE6QB.js.map} +0 -0
- /package/dist/{chunk-SGHGCFVV.js.map → chunk-JE334SIA.js.map} +0 -0
- /package/dist/{chunk-XFXVIXDI.js.map → chunk-JE4H2QBO.js.map} +0 -0
- /package/dist/{chunk-33SX6K3N.js.map → chunk-JMZQS6OS.js.map} +0 -0
- /package/dist/{chunk-3RABJOGD.js.map → chunk-KH2D26LQ.js.map} +0 -0
- /package/dist/{chunk-AH3OIMS7.js.map → chunk-KQQEZTH6.js.map} +0 -0
- /package/dist/{chunk-QRSC37NC.js.map → chunk-M7HFDWOS.js.map} +0 -0
- /package/dist/{chunk-2EICZYIG.js.map → chunk-MTJUIIM4.js.map} +0 -0
- /package/dist/{chunk-ST7FDKZT.js.map → chunk-MWVYHNSU.js.map} +0 -0
- /package/dist/{chunk-NXSNFPYI.js.map → chunk-MXTCV3B5.js.map} +0 -0
- /package/dist/{chunk-O4JFBEUL.js.map → chunk-O7OVWKT4.js.map} +0 -0
- /package/dist/{chunk-RIP2AOZW.js.map → chunk-QWQB7TOB.js.map} +0 -0
- /package/dist/{chunk-PYTSGD5M.js.map → chunk-RSMNPYBM.js.map} +0 -0
- /package/dist/{chunk-MYDA2GA2.js.map → chunk-RUUJXAGT.js.map} +0 -0
- /package/dist/{chunk-YJJMJH6J.js.map → chunk-SEQ6DWXD.js.map} +0 -0
- /package/dist/{chunk-SCM4VYJW.js.map → chunk-SLGD36MM.js.map} +0 -0
- /package/dist/{chunk-KAPYPTPS.js.map → chunk-SOOWBRMH.js.map} +0 -0
- /package/dist/{chunk-JG4AP36X.js.map → chunk-SPFNGHHP.js.map} +0 -0
- /package/dist/{chunk-7TTOX6NW.js.map → chunk-SPWNCGSM.js.map} +0 -0
- /package/dist/{chunk-3QZRSEAM.js.map → chunk-SZ7IVZGD.js.map} +0 -0
- /package/dist/{chunk-IGDEKECC.js.map → chunk-TQT4AOPO.js.map} +0 -0
- /package/dist/{chunk-NVW5ISEJ.js.map → chunk-TS66MUUJ.js.map} +0 -0
- /package/dist/{chunk-6ZMIASYT.js.map → chunk-U2SK45U3.js.map} +0 -0
- /package/dist/{chunk-SMI2G3MA.js.map → chunk-UCH2RWFX.js.map} +0 -0
- /package/dist/{chunk-A33DLYNY.js.map → chunk-UDJMJNBK.js.map} +0 -0
- /package/dist/{chunk-DLXBMXIB.js.map → chunk-UJBIWY5M.js.map} +0 -0
- /package/dist/{chunk-25HSEIEM.js.map → chunk-ULQVG6G3.js.map} +0 -0
- /package/dist/{chunk-XRUOO7OT.js.map → chunk-VGO57TU7.js.map} +0 -0
- /package/dist/{chunk-LX7KIJQF.js.map → chunk-VMKAA5SU.js.map} +0 -0
- /package/dist/{chunk-KBHDV7P3.js.map → chunk-VUV472VH.js.map} +0 -0
- /package/dist/{chunk-LZI6FWZW.js.map → chunk-WH7RINGG.js.map} +0 -0
- /package/dist/{chunk-FDDCZDBI.js.map → chunk-WN4HFL4K.js.map} +0 -0
- /package/dist/{chunk-ISA5U5AP.js.map → chunk-WUJD4CHZ.js.map} +0 -0
- /package/dist/{chunk-UVEBBXB5.js.map → chunk-X7WAM3IY.js.map} +0 -0
- /package/dist/{chunk-NROI5XMG.js.map → chunk-XPFJSUOR.js.map} +0 -0
- /package/dist/{chunk-2SZBCM2S.js.map → chunk-Y4G6LHJW.js.map} +0 -0
- /package/dist/{chunk-JXSOB3SA.js.map → chunk-Y7LZ5V7N.js.map} +0 -0
- /package/dist/{chunk-YSBYNCCN.js.map → chunk-YLPCEUXP.js.map} +0 -0
- /package/dist/{chunk-RFIJH2OE.js.map → chunk-YUHGJBQK.js.map} +0 -0
- /package/dist/{chunk-DX63RFDJ.js.map → chunk-ZADYEZY4.js.map} +0 -0
- /package/dist/{chunk-TNFDWJRS.js.map → chunk-ZANEMAEV.js.map} +0 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-end experience memories as procedure-mining input (issue #2979 layer 3).
|
|
3
|
+
*
|
|
4
|
+
* Promoted episodes (experience_* attributes, status active) join the miner
|
|
5
|
+
* record set when sessionExperience.enabled is on. Gate off: miner input is
|
|
6
|
+
* byte-identical to the trajectory-only set (no experience records).
|
|
7
|
+
* pending_review stays out.
|
|
8
|
+
*/
|
|
9
|
+
import assert from "node:assert/strict";
|
|
10
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import test from "node:test";
|
|
14
|
+
|
|
15
|
+
import { parseConfig } from "../config.js";
|
|
16
|
+
import type { BufferTurn, PluginConfig } from "../types.js";
|
|
17
|
+
import { StorageManager } from "../storage.js";
|
|
18
|
+
import {
|
|
19
|
+
filterTrajectoriesByLookbackDays,
|
|
20
|
+
readCausalTrajectoryRecords,
|
|
21
|
+
recordCausalTrajectory,
|
|
22
|
+
} from "../causal-trajectory.js";
|
|
23
|
+
import { runProcedureMining } from "../procedural/procedure-miner.js";
|
|
24
|
+
import { runSessionExperienceExtraction } from "./session-experience.js";
|
|
25
|
+
import { collectProcedureMiningRecords } from "./session-experience-mining.js";
|
|
26
|
+
|
|
27
|
+
function turn(role: "user" | "assistant", content: string): BufferTurn {
|
|
28
|
+
return { role, content, timestamp: "2026-01-15T10:00:00.000Z" };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function successSession(): BufferTurn[] {
|
|
32
|
+
return [
|
|
33
|
+
turn("user", "Fix the failing integration test in the payments module. The test times out after 30 seconds."),
|
|
34
|
+
turn("assistant", "I will inspect the payments test file and reproduce the timeout locally first."),
|
|
35
|
+
turn("assistant", "The timeout came from an unawaited database call in the test setup. I added the missing await."),
|
|
36
|
+
turn("assistant", "Verified: the payments integration test passes now and the full suite is green."),
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function miningConfig(memoryDir: string, experienceEnabled: boolean): PluginConfig {
|
|
41
|
+
return parseConfig({
|
|
42
|
+
memoryDir,
|
|
43
|
+
sessionExperience: { enabled: experienceEnabled },
|
|
44
|
+
procedural: {
|
|
45
|
+
enabled: true,
|
|
46
|
+
minOccurrences: 2,
|
|
47
|
+
lookbackDays: 30,
|
|
48
|
+
successFloor: 1,
|
|
49
|
+
autoPromoteEnabled: false,
|
|
50
|
+
autoPromoteOccurrences: 10,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function writePromotedExperience(
|
|
56
|
+
storage: StorageManager,
|
|
57
|
+
config: PluginConfig,
|
|
58
|
+
sessionKey: string,
|
|
59
|
+
): Promise<string> {
|
|
60
|
+
const written = await runSessionExperienceExtraction({
|
|
61
|
+
turns: successSession(),
|
|
62
|
+
sessionKey,
|
|
63
|
+
config,
|
|
64
|
+
storage,
|
|
65
|
+
});
|
|
66
|
+
assert.equal(written.written, true);
|
|
67
|
+
assert.ok(written.memoryId);
|
|
68
|
+
const promoted = await storage.updateMemoryFrontmatter(written.memoryId, { status: "active" });
|
|
69
|
+
assert.equal(promoted, true);
|
|
70
|
+
return written.memoryId;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
test("gate off: miner input is byte-identical to the trajectory-only set", async () => {
|
|
74
|
+
const memoryDir = await mkdtemp(path.join(tmpdir(), "remnic-sx-mine-off-"));
|
|
75
|
+
try {
|
|
76
|
+
const storage = new StorageManager(memoryDir);
|
|
77
|
+
await storage.ensureDirectories();
|
|
78
|
+
const on = miningConfig(memoryDir, true);
|
|
79
|
+
await writePromotedExperience(storage, on, "session-mine-off-a");
|
|
80
|
+
await writePromotedExperience(storage, on, "session-mine-off-b");
|
|
81
|
+
await recordCausalTrajectory({
|
|
82
|
+
memoryDir,
|
|
83
|
+
record: {
|
|
84
|
+
schemaVersion: 1,
|
|
85
|
+
trajectoryId: "traj-off-1",
|
|
86
|
+
recordedAt: new Date().toISOString(),
|
|
87
|
+
sessionKey: "traj-session",
|
|
88
|
+
goal: "Ship the demo gateway to staging",
|
|
89
|
+
actionSummary: "Confirm the requirements and prepare the working plan.",
|
|
90
|
+
observationSummary: "The run produced a reusable sequence of actions.",
|
|
91
|
+
outcomeKind: "success",
|
|
92
|
+
outcomeSummary: "The workflow completed successfully with a reusable result.",
|
|
93
|
+
entityRefs: ["project-demo"],
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const off = miningConfig(memoryDir, false);
|
|
98
|
+
const { trajectories } = await readCausalTrajectoryRecords({ memoryDir });
|
|
99
|
+
const nowMs = Date.now();
|
|
100
|
+
const expected = filterTrajectoriesByLookbackDays(trajectories, off.procedural.lookbackDays, nowMs);
|
|
101
|
+
const actual = await collectProcedureMiningRecords({
|
|
102
|
+
trajectories,
|
|
103
|
+
lookbackDays: off.procedural.lookbackDays,
|
|
104
|
+
storage: {
|
|
105
|
+
async readAllMemories() {
|
|
106
|
+
throw new Error("gate-off miner input must not read memories");
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
experienceEnabled: false,
|
|
110
|
+
nowMs,
|
|
111
|
+
});
|
|
112
|
+
assert.equal(JSON.stringify(actual), JSON.stringify(expected));
|
|
113
|
+
assert.equal(
|
|
114
|
+
actual.some((r) => r.trajectoryId.startsWith("experience:")),
|
|
115
|
+
false,
|
|
116
|
+
);
|
|
117
|
+
} finally {
|
|
118
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("gate on: promoted experience memories feed the miner; pending_review does not", async () => {
|
|
123
|
+
const memoryDir = await mkdtemp(path.join(tmpdir(), "remnic-sx-mine-on-"));
|
|
124
|
+
try {
|
|
125
|
+
const storage = new StorageManager(memoryDir);
|
|
126
|
+
await storage.ensureDirectories();
|
|
127
|
+
const config = miningConfig(memoryDir, true);
|
|
128
|
+
await writePromotedExperience(storage, config, "session-mine-on-a");
|
|
129
|
+
await writePromotedExperience(storage, config, "session-mine-on-b");
|
|
130
|
+
const pending = await runSessionExperienceExtraction({
|
|
131
|
+
turns: successSession(),
|
|
132
|
+
sessionKey: "session-mine-on-pending",
|
|
133
|
+
config,
|
|
134
|
+
storage,
|
|
135
|
+
});
|
|
136
|
+
assert.equal(pending.written, true);
|
|
137
|
+
|
|
138
|
+
const { trajectories } = await readCausalTrajectoryRecords({ memoryDir });
|
|
139
|
+
const records = await collectProcedureMiningRecords({
|
|
140
|
+
trajectories,
|
|
141
|
+
lookbackDays: config.procedural.lookbackDays,
|
|
142
|
+
storage,
|
|
143
|
+
experienceEnabled: true,
|
|
144
|
+
});
|
|
145
|
+
const experienceIds = records.filter((r) => r.trajectoryId.startsWith("experience:")).map((r) => r.trajectoryId);
|
|
146
|
+
assert.equal(experienceIds.length, 2, "only the two promoted episodes enter mining");
|
|
147
|
+
assert.ok(records.every((r) => r.goal.toLowerCase().includes("payments")));
|
|
148
|
+
|
|
149
|
+
const result = await runProcedureMining({ memoryDir, storage, config });
|
|
150
|
+
assert.equal(result.proceduresWritten, 1);
|
|
151
|
+
assert.ok((result.clustersProcessed ?? 0) >= 1);
|
|
152
|
+
const memories = await storage.readAllMemories();
|
|
153
|
+
const mined = memories.find(
|
|
154
|
+
(m) =>
|
|
155
|
+
m.frontmatter.category === "procedure" &&
|
|
156
|
+
typeof m.frontmatter.structuredAttributes?.procedure_cluster_hash === "string" &&
|
|
157
|
+
(m.frontmatter.structuredAttributes.trajectory_ids ?? "").includes("experience:"),
|
|
158
|
+
);
|
|
159
|
+
assert.ok(mined, "mined procedure must cite experience trajectory ids");
|
|
160
|
+
assert.equal(mined.frontmatter.status, "pending_review");
|
|
161
|
+
assert.equal(mined.frontmatter.structuredAttributes?.trajectory_count, "2");
|
|
162
|
+
} finally {
|
|
163
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("gate off: two promoted experiences do not produce a mined procedure", async () => {
|
|
168
|
+
const memoryDir = await mkdtemp(path.join(tmpdir(), "remnic-sx-mine-off-write-"));
|
|
169
|
+
try {
|
|
170
|
+
const storage = new StorageManager(memoryDir);
|
|
171
|
+
await storage.ensureDirectories();
|
|
172
|
+
const enabled = miningConfig(memoryDir, true);
|
|
173
|
+
await writePromotedExperience(storage, enabled, "session-mine-off-write-a");
|
|
174
|
+
await writePromotedExperience(storage, enabled, "session-mine-off-write-b");
|
|
175
|
+
const off = miningConfig(memoryDir, false);
|
|
176
|
+
const result = await runProcedureMining({ memoryDir, storage, config: off });
|
|
177
|
+
assert.equal(result.proceduresWritten, 0);
|
|
178
|
+
const memories = await storage.readAllMemories();
|
|
179
|
+
assert.equal(
|
|
180
|
+
memories.filter((m) => m.frontmatter.structuredAttributes?.procedure_cluster_hash !== undefined).length,
|
|
181
|
+
0,
|
|
182
|
+
);
|
|
183
|
+
} finally {
|
|
184
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
185
|
+
}
|
|
186
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-experience mining helpers (issue #2979 layer 3).
|
|
3
|
+
*
|
|
4
|
+
* Promoted experience memories are `category: procedure` with
|
|
5
|
+
* `experience_*` attributes. When `sessionExperience.enabled` is true they
|
|
6
|
+
* join the procedure-miner record set as pre-structured trajectories.
|
|
7
|
+
* Call `collectProcedureMiningRecords` with `experienceEnabled: false` for
|
|
8
|
+
* the gate-off path — that branch must not read storage and must return
|
|
9
|
+
* the trajectory lookback set unchanged.
|
|
10
|
+
*/
|
|
11
|
+
import {
|
|
12
|
+
filterTrajectoriesByLookbackDays,
|
|
13
|
+
type CausalTrajectoryRecord,
|
|
14
|
+
} from "../causal-trajectory.js";
|
|
15
|
+
import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
|
|
16
|
+
import type { ObjectiveStateOutcome } from "../objective-state.js";
|
|
17
|
+
import type { MemoryFile } from "../types.js";
|
|
18
|
+
import { isSessionExperienceMemory } from "./session-experience-recall.js";
|
|
19
|
+
|
|
20
|
+
export interface ExperienceMiningStorage {
|
|
21
|
+
readAllMemories(): Promise<MemoryFile[]>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface CollectProcedureMiningRecordsOptions {
|
|
25
|
+
trajectories: CausalTrajectoryRecord[];
|
|
26
|
+
lookbackDays: number;
|
|
27
|
+
storage: ExperienceMiningStorage;
|
|
28
|
+
experienceEnabled: boolean;
|
|
29
|
+
nowMs?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function mapExperienceOutcome(raw: string | undefined): ObjectiveStateOutcome {
|
|
33
|
+
if (raw === "success" || raw === "failure" || raw === "partial") return raw;
|
|
34
|
+
return "unknown";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Convert one promoted episode into a mining record, or `null`. */
|
|
38
|
+
export function experienceMemoryToMiningRecord(memory: MemoryFile): CausalTrajectoryRecord | null {
|
|
39
|
+
if (!isSessionExperienceMemory(memory)) return null;
|
|
40
|
+
if (!isActiveMemoryStatus(memory.frontmatter.status)) return null;
|
|
41
|
+
const attrs = memory.frontmatter.structuredAttributes ?? {};
|
|
42
|
+
const situation = (attrs.experience_situation ?? "").trim();
|
|
43
|
+
const hash = attrs.experience_session_hash;
|
|
44
|
+
if (situation.length === 0 || typeof hash !== "string" || hash.length === 0) return null;
|
|
45
|
+
const recordedAt = memory.frontmatter.created;
|
|
46
|
+
if (!recordedAt || !Number.isFinite(Date.parse(recordedAt))) return null;
|
|
47
|
+
const approach = (attrs.experience_approach ?? "").trim();
|
|
48
|
+
const reflection = (attrs.experience_reflection ?? "").trim();
|
|
49
|
+
const record: CausalTrajectoryRecord = {
|
|
50
|
+
schemaVersion: 1,
|
|
51
|
+
trajectoryId: `experience:${hash}`,
|
|
52
|
+
recordedAt,
|
|
53
|
+
sessionKey: hash,
|
|
54
|
+
goal: situation,
|
|
55
|
+
actionSummary: approach,
|
|
56
|
+
observationSummary: reflection,
|
|
57
|
+
outcomeKind: mapExperienceOutcome(attrs.experience_outcome),
|
|
58
|
+
outcomeSummary: reflection,
|
|
59
|
+
};
|
|
60
|
+
if (typeof memory.frontmatter.entityRef === "string" && memory.frontmatter.entityRef.trim().length > 0) {
|
|
61
|
+
record.entityRefs = [memory.frontmatter.entityRef.trim()];
|
|
62
|
+
}
|
|
63
|
+
return record;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function collectExperienceMiningRecords(
|
|
67
|
+
storage: ExperienceMiningStorage,
|
|
68
|
+
): Promise<CausalTrajectoryRecord[]> {
|
|
69
|
+
const memories = await storage.readAllMemories();
|
|
70
|
+
const out: CausalTrajectoryRecord[] = [];
|
|
71
|
+
for (const memory of memories) {
|
|
72
|
+
const record = experienceMemoryToMiningRecord(memory);
|
|
73
|
+
if (record) out.push(record);
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Records the miner will cluster. Gate off returns the lookback-filtered
|
|
80
|
+
* trajectories only and does not call storage.
|
|
81
|
+
*/
|
|
82
|
+
export async function collectProcedureMiningRecords(
|
|
83
|
+
options: CollectProcedureMiningRecordsOptions,
|
|
84
|
+
): Promise<CausalTrajectoryRecord[]> {
|
|
85
|
+
const source =
|
|
86
|
+
options.experienceEnabled === true
|
|
87
|
+
? options.trajectories.concat(await collectExperienceMiningRecords(options.storage))
|
|
88
|
+
: options.trajectories;
|
|
89
|
+
return filterTrajectoriesByLookbackDays(source, options.lookbackDays, options.nowMs);
|
|
90
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leaf type definitions for seed graduation config (issue #2974). Kept
|
|
3
|
+
* import-free so `types.ts` can mix `SeedGraduationSettings` into
|
|
4
|
+
* `PluginConfig` without pulling the graduation implementation (and its
|
|
5
|
+
* storage.js cycle) into the types chunk — that import chain OOM'd the DTS
|
|
6
|
+
* build worker.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface SeedGraduationConfig {
|
|
10
|
+
/** Master gate. Default false: review-mode stays the only promotion path. */
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Independent corroborating memories required before a seed graduates.
|
|
14
|
+
* `Infinity` is not a config value — `enabled: false` is the disabled state.
|
|
15
|
+
*/
|
|
16
|
+
minCorroborations: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Mixed into `PluginConfig` so the nested block lives beside its parser. */
|
|
20
|
+
export interface SeedGraduationSettings {
|
|
21
|
+
seedGraduation: SeedGraduationConfig;
|
|
22
|
+
}
|
|
@@ -4,7 +4,16 @@ import { tmpdir } from "node:os";
|
|
|
4
4
|
import * as path from "node:path";
|
|
5
5
|
import { test } from "node:test";
|
|
6
6
|
|
|
7
|
+
import { parseConfig } from "../config.js";
|
|
8
|
+
import type { EmbeddingFallback } from "../embedding-fallback.js";
|
|
9
|
+
import type { ExtractionEngine } from "../extraction.js";
|
|
10
|
+
import {
|
|
11
|
+
LifecyclePolicyCoordinator,
|
|
12
|
+
type LifecyclePolicyCoordinatorDeps,
|
|
13
|
+
} from "../orchestration/lifecycle-policy-coordinator.js";
|
|
14
|
+
import { RecallHandleHistoryStore } from "../recall-state.js";
|
|
7
15
|
import { StorageManager } from "../storage.js";
|
|
16
|
+
import type { MemoryFile, MemoryFrontmatter } from "../types.js";
|
|
8
17
|
import {
|
|
9
18
|
SEED_GRADUATION_DEFAULTS,
|
|
10
19
|
evaluateSeedGraduation,
|
|
@@ -12,7 +21,6 @@ import {
|
|
|
12
21
|
runSeedGraduationPass,
|
|
13
22
|
type SeedGraduationConfig,
|
|
14
23
|
} from "./seed-graduation.js";
|
|
15
|
-
import type { MemoryFile, MemoryFrontmatter } from "../types.js";
|
|
16
24
|
|
|
17
25
|
const ENABLED: SeedGraduationConfig = { enabled: true, minCorroborations: 1 };
|
|
18
26
|
|
|
@@ -78,6 +86,37 @@ test("seedGraduation rejects invalid values instead of defaulting", () => {
|
|
|
78
86
|
() => parseSeedGraduationConfig({ minCorroborations: 1.5 }),
|
|
79
87
|
/minCorroborations must be an integer in \[1, 50\]/,
|
|
80
88
|
);
|
|
89
|
+
assert.throws(
|
|
90
|
+
() => parseConfig({ memoryDir: "/tmp/remnic-seed-graduation-invalid", seedGraduation: "yes" }),
|
|
91
|
+
/seedGraduation must be an object/,
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("parseConfig wires seedGraduation; conservative pins it off", () => {
|
|
96
|
+
const memoryDir = "/tmp/remnic-seed-graduation-parse";
|
|
97
|
+
const defaults = parseConfig({ memoryDir });
|
|
98
|
+
assert.deepEqual(defaults.seedGraduation, SEED_GRADUATION_DEFAULTS);
|
|
99
|
+
assert.equal(defaults.seedGraduation.enabled, false);
|
|
100
|
+
|
|
101
|
+
const optedIn = parseConfig({
|
|
102
|
+
memoryDir,
|
|
103
|
+
seedGraduation: { enabled: true, minCorroborations: 3 },
|
|
104
|
+
});
|
|
105
|
+
assert.deepEqual(optedIn.seedGraduation, { enabled: true, minCorroborations: 3 });
|
|
106
|
+
|
|
107
|
+
assert.equal(
|
|
108
|
+
parseConfig({ memoryDir, memoryOsPreset: "conservative" }).seedGraduation.enabled,
|
|
109
|
+
false,
|
|
110
|
+
"the conservative preset pins seed graduation off",
|
|
111
|
+
);
|
|
112
|
+
assert.equal(
|
|
113
|
+
parseConfig({
|
|
114
|
+
memoryDir,
|
|
115
|
+
memoryOsPreset: "balanced",
|
|
116
|
+
seedGraduation: { enabled: true },
|
|
117
|
+
}).seedGraduation.enabled,
|
|
118
|
+
true,
|
|
119
|
+
);
|
|
81
120
|
});
|
|
82
121
|
|
|
83
122
|
// ---------------------------------------------------------------------------
|
|
@@ -422,3 +461,123 @@ test("pass: disabled config touches nothing", async () => {
|
|
|
422
461
|
rmSync(dir, { recursive: true, force: true });
|
|
423
462
|
}
|
|
424
463
|
});
|
|
464
|
+
|
|
465
|
+
// ---------------------------------------------------------------------------
|
|
466
|
+
// Wiring — parseConfig + lifecycle policy pass
|
|
467
|
+
// ---------------------------------------------------------------------------
|
|
468
|
+
|
|
469
|
+
function coordinatorDeps(
|
|
470
|
+
storage: StorageManager,
|
|
471
|
+
config: ReturnType<typeof parseConfig>,
|
|
472
|
+
handleHistory?: RecallHandleHistoryStore,
|
|
473
|
+
): LifecyclePolicyCoordinatorDeps {
|
|
474
|
+
return {
|
|
475
|
+
config,
|
|
476
|
+
getStorage: () => storage,
|
|
477
|
+
extraction: {} as unknown as ExtractionEngine,
|
|
478
|
+
embeddingFallback: {} as unknown as EmbeddingFallback,
|
|
479
|
+
getEffectiveLifecycleThresholds: () => ({
|
|
480
|
+
promoteHeatThreshold: 1,
|
|
481
|
+
staleDecayThreshold: 0,
|
|
482
|
+
archiveDecayThreshold: 0,
|
|
483
|
+
}),
|
|
484
|
+
async removeContentHashForMemory(): Promise<void> {},
|
|
485
|
+
async saveContentHashIndexes(): Promise<void> {},
|
|
486
|
+
getHandleHistory: handleHistory ? () => handleHistory : undefined,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
test("lifecycle pass: gate off makes zero promoteWearableMemory calls", async () => {
|
|
491
|
+
const { storage, dir } = makeStorage();
|
|
492
|
+
try {
|
|
493
|
+
await storage.writeMemory("fact", SEED_TEXT, {
|
|
494
|
+
source: "wearable:bee",
|
|
495
|
+
status: "pending_review",
|
|
496
|
+
});
|
|
497
|
+
await storage.writeMemory("fact", RESTATE_TEXT, {
|
|
498
|
+
source: "wearable:limitless",
|
|
499
|
+
});
|
|
500
|
+
const config = parseConfig({ memoryDir: dir });
|
|
501
|
+
assert.equal(config.seedGraduation.enabled, false);
|
|
502
|
+
|
|
503
|
+
let promoteCalls = 0;
|
|
504
|
+
const original = storage.promoteWearableMemory.bind(storage);
|
|
505
|
+
storage.promoteWearableMemory = async (id, attrs, confidence) => {
|
|
506
|
+
promoteCalls += 1;
|
|
507
|
+
return original(id, attrs, confidence);
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
const memories = await storage.readAllMemories();
|
|
511
|
+
await new LifecyclePolicyCoordinator(coordinatorDeps(storage, config)).runLifecyclePolicyPass(
|
|
512
|
+
memories,
|
|
513
|
+
storage,
|
|
514
|
+
);
|
|
515
|
+
assert.equal(promoteCalls, 0, "disabled seed graduation must not call promoteWearableMemory");
|
|
516
|
+
const seed = (await storage.readAllMemories()).find(
|
|
517
|
+
(memory) => memory.frontmatter.source === "wearable:bee",
|
|
518
|
+
);
|
|
519
|
+
assert.equal(seed?.frontmatter.status, "pending_review");
|
|
520
|
+
} finally {
|
|
521
|
+
rmSync(dir, { recursive: true, force: true });
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
test("lifecycle pass: enabled independent corroboration promotes through the policy seam", async () => {
|
|
526
|
+
const { storage, dir } = makeStorage();
|
|
527
|
+
try {
|
|
528
|
+
await storage.writeMemory("fact", SEED_TEXT, {
|
|
529
|
+
source: "wearable:bee",
|
|
530
|
+
status: "pending_review",
|
|
531
|
+
});
|
|
532
|
+
await storage.writeMemory("fact", RESTATE_TEXT, {
|
|
533
|
+
source: "wearable:limitless",
|
|
534
|
+
});
|
|
535
|
+
const config = parseConfig({
|
|
536
|
+
memoryDir: dir,
|
|
537
|
+
seedGraduation: { enabled: true, minCorroborations: 1 },
|
|
538
|
+
});
|
|
539
|
+
const memories = await storage.readAllMemories();
|
|
540
|
+
await new LifecyclePolicyCoordinator(coordinatorDeps(storage, config)).runLifecyclePolicyPass(
|
|
541
|
+
memories,
|
|
542
|
+
storage,
|
|
543
|
+
);
|
|
544
|
+
const seed = (await storage.readAllMemories()).find(
|
|
545
|
+
(memory) => memory.frontmatter.source === "wearable:bee",
|
|
546
|
+
);
|
|
547
|
+
assert.equal(seed?.frontmatter.status, "active");
|
|
548
|
+
assert.equal(seed?.frontmatter.structuredAttributes?.graduatedBy, "independent-corroboration");
|
|
549
|
+
} finally {
|
|
550
|
+
rmSync(dir, { recursive: true, force: true });
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
test("lifecycle pass: recall-handle history suppresses echo corroboration", async () => {
|
|
555
|
+
const { storage, dir } = makeStorage();
|
|
556
|
+
try {
|
|
557
|
+
const seedWrite = await storage.writeMemory("fact", SEED_TEXT, {
|
|
558
|
+
source: "wearable:bee",
|
|
559
|
+
status: "pending_review",
|
|
560
|
+
structuredAttributes: { sessionKey: "session-a" },
|
|
561
|
+
});
|
|
562
|
+
await storage.writeMemory("fact", RESTATE_TEXT, {
|
|
563
|
+
source: "extraction",
|
|
564
|
+
structuredAttributes: { sessionKey: "session-b" },
|
|
565
|
+
});
|
|
566
|
+
const history = new RecallHandleHistoryStore(dir);
|
|
567
|
+
await history.record("session-b", [seedWrite.id]);
|
|
568
|
+
const config = parseConfig({
|
|
569
|
+
memoryDir: dir,
|
|
570
|
+
seedGraduation: { enabled: true, minCorroborations: 1 },
|
|
571
|
+
});
|
|
572
|
+
const memories = await storage.readAllMemories();
|
|
573
|
+
await new LifecyclePolicyCoordinator(
|
|
574
|
+
coordinatorDeps(storage, config, history),
|
|
575
|
+
).runLifecyclePolicyPass(memories, storage);
|
|
576
|
+
const seed = (await storage.readAllMemories()).find(
|
|
577
|
+
(memory) => memory.frontmatter.source === "wearable:bee",
|
|
578
|
+
);
|
|
579
|
+
assert.equal(seed?.frontmatter.status, "pending_review", "quoted-back echo must not graduate");
|
|
580
|
+
} finally {
|
|
581
|
+
rmSync(dir, { recursive: true, force: true });
|
|
582
|
+
}
|
|
583
|
+
});
|
|
@@ -31,20 +31,18 @@ import { stripAttributesSuffix } from "../storage.js";
|
|
|
31
31
|
import { STRUCTURED_ATTRIBUTE_LIMITS } from "../write-envelope.js";
|
|
32
32
|
import { excludeSupportPassportPrivateMemories } from "../support-passport/card-projection.js";
|
|
33
33
|
import type { MemoryFile, MemoryFrontmatter, MemoryStatus } from "../types.js";
|
|
34
|
+
import type { SeedGraduationConfig } from "./seed-graduation-config-types.js";
|
|
34
35
|
|
|
35
36
|
// ---------------------------------------------------------------------------
|
|
36
37
|
// Config
|
|
37
38
|
// ---------------------------------------------------------------------------
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
*/
|
|
46
|
-
minCorroborations: number;
|
|
47
|
-
}
|
|
40
|
+
// Canonical definitions live in seed-graduation-config-types.ts (a leaf) so
|
|
41
|
+
// types.ts can consume them without this module's storage.js import cycle.
|
|
42
|
+
export type {
|
|
43
|
+
SeedGraduationConfig,
|
|
44
|
+
SeedGraduationSettings,
|
|
45
|
+
} from "./seed-graduation-config-types.js";
|
|
48
46
|
|
|
49
47
|
export const SEED_GRADUATION_DEFAULTS: SeedGraduationConfig = {
|
|
50
48
|
enabled: false,
|
|
@@ -49,6 +49,8 @@ import type {
|
|
|
49
49
|
MemorySummary,
|
|
50
50
|
} from "../types.js";
|
|
51
51
|
import { excludeSupportPassportPrivateMemories } from "../support-passport/card-projection.js";
|
|
52
|
+
import { runSeedGraduationPass } from "../lifecycle/seed-graduation.js";
|
|
53
|
+
import type { RecallHandleHistoryStore } from "../recall-state.js";
|
|
52
54
|
|
|
53
55
|
/** Dependencies injected by the orchestrator. All stable references or
|
|
54
56
|
* live accessors. */
|
|
@@ -76,6 +78,8 @@ export interface LifecyclePolicyCoordinatorDeps {
|
|
|
76
78
|
) => Promise<void>;
|
|
77
79
|
/** Persist all dirty content-hash indexes to disk. */
|
|
78
80
|
saveContentHashIndexes: () => Promise<void>;
|
|
81
|
+
/** Recall-handle ring used to suppress quoted-back echo during seed graduation. */
|
|
82
|
+
getHandleHistory?: () => RecallHandleHistoryStore;
|
|
79
83
|
}
|
|
80
84
|
|
|
81
85
|
/**
|
|
@@ -256,6 +260,14 @@ export class LifecyclePolicyCoordinator {
|
|
|
256
260
|
if (wrote) updatedCount += 1;
|
|
257
261
|
}
|
|
258
262
|
|
|
263
|
+
const history = this.deps.getHandleHistory?.();
|
|
264
|
+
await runSeedGraduationPass({
|
|
265
|
+
memories: allMemories,
|
|
266
|
+
storage,
|
|
267
|
+
config: this.config.seedGraduation,
|
|
268
|
+
recalledBySession: history ? (sessionKey) => history.recent(sessionKey) : undefined,
|
|
269
|
+
});
|
|
270
|
+
|
|
259
271
|
// Report how many memories had frontmatter rewritten so callers can record a
|
|
260
272
|
// catalog write touch for lifecycle-only passes (codex NR-tS).
|
|
261
273
|
if (!lifecycleCaps.lifecycleMetrics) return updatedCount;
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - content-hash dedup index add/has/remove/save
|
|
8
8
|
* - temporal-bounds backfill on dedup hits (bitemporal, #1578)
|
|
9
9
|
* - temporal tag index updates and persisted-memory indexing
|
|
10
|
+
* - recognition-index write-path maintenance when recallRecognitionTier is on
|
|
10
11
|
* - graph edge construction for newly persisted memories
|
|
11
12
|
* - semantic dedup candidate lookup
|
|
12
13
|
*
|
|
@@ -22,7 +23,9 @@ import { GraphIndex, type GraphEdge } from "../graph.js";
|
|
|
22
23
|
import { ContentHashIndex, StorageManager } from "../index.js";
|
|
23
24
|
import { log } from "../logger.js";
|
|
24
25
|
import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
|
|
26
|
+
import { loadRecognitionIndex } from "../recall-recognition-tier.js";
|
|
25
27
|
import { stripCitationForTemplate } from "../source-attribution.js";
|
|
28
|
+
import { maintainRecognitionIndexAfterWrite, type RecognitionIndexChange } from "./recall-recognition-index.js";
|
|
26
29
|
import { clearIndexesAsync, indexesExistAsync } from "../temporal-index.js";
|
|
27
30
|
import { indexMemoriesBatchAsync } from "../temporal-index-batch.js";
|
|
28
31
|
import { normalizeSupersessionKey } from "../temporal-supersession.js";
|
|
@@ -447,6 +450,9 @@ export class PersistenceIndexCoordinator {
|
|
|
447
450
|
storage: StorageManager,
|
|
448
451
|
persistedIds: string[],
|
|
449
452
|
): Promise<void> {
|
|
453
|
+
// Recognition-index write-path (issue #2975): independent of temporal
|
|
454
|
+
// capability gates. Off-path is zero index I/O and cannot block persist.
|
|
455
|
+
await this.maintainRecognitionIndex(storage, persistedIds);
|
|
450
456
|
const caps = resolveCapabilities(this.deps.config); // #1566 Cluster C
|
|
451
457
|
// Build temporal/tag indexes whenever either consumer is enabled:
|
|
452
458
|
// - queryAwareIndexingEnabled: uses indexes for query-aware prefiltering in recall
|
|
@@ -625,4 +631,48 @@ export class PersistenceIndexCoordinator {
|
|
|
625
631
|
);
|
|
626
632
|
return enriched;
|
|
627
633
|
}
|
|
634
|
+
/**
|
|
635
|
+
* Upsert persisted memories into the namespace recognition index.
|
|
636
|
+
* `recallRecognitionTier !== true` returns before any index I/O.
|
|
637
|
+
* A missing index is bootstrapped from the active corpus so the first
|
|
638
|
+
* post-enable write cannot publish a partial index that recall would
|
|
639
|
+
* treat as the full working set.
|
|
640
|
+
*/
|
|
641
|
+
private async maintainRecognitionIndex(
|
|
642
|
+
storage: StorageManager,
|
|
643
|
+
persistedIds: string[],
|
|
644
|
+
): Promise<void> {
|
|
645
|
+
try {
|
|
646
|
+
if (this.deps.config.recallRecognitionTier !== true) return;
|
|
647
|
+
const indexMissing = (await loadRecognitionIndex(storage.dir)) === null;
|
|
648
|
+
if (!indexMissing && persistedIds.length === 0) return;
|
|
649
|
+
const changes: RecognitionIndexChange[] = [];
|
|
650
|
+
const pushUpsert = (memory: MemoryFile): void => {
|
|
651
|
+
if (!isActiveMemoryStatus(memory.frontmatter.status)) return;
|
|
652
|
+
const memoryId = memory.frontmatter.id;
|
|
653
|
+
if (typeof memoryId !== "string" || memoryId.trim().length === 0) return;
|
|
654
|
+
changes.push({ action: "upsert", id: memoryId, content: memory.content ?? "" });
|
|
655
|
+
};
|
|
656
|
+
if (indexMissing) {
|
|
657
|
+
const corpus = await storage.readAllMemories().catch(() => []);
|
|
658
|
+
for (const memory of corpus) pushUpsert(memory);
|
|
659
|
+
}
|
|
660
|
+
for (const id of persistedIds) {
|
|
661
|
+
let memory = await storage.getMemoryById(id);
|
|
662
|
+
if (!memory) {
|
|
663
|
+
const cold = await storage.getMemoryByIdIncludingArchived(id).catch(() => null);
|
|
664
|
+
if (cold && isActiveMemoryStatus(cold.frontmatter.status)) memory = cold;
|
|
665
|
+
}
|
|
666
|
+
if (memory) pushUpsert(memory);
|
|
667
|
+
}
|
|
668
|
+
await maintainRecognitionIndexAfterWrite({
|
|
669
|
+
memoryDir: storage.dir,
|
|
670
|
+
enabled: true,
|
|
671
|
+
changes,
|
|
672
|
+
});
|
|
673
|
+
} catch (err) {
|
|
674
|
+
log.debug(`recognition-index update error (non-fatal): ${err}`);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
628
678
|
}
|