@remnic/core 9.66.0 → 9.66.2
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 +11 -11
- package/dist/access-admin-ops-surface.js +31 -31
- package/dist/access-audit.js +2 -2
- package/dist/access-authorization-probe.d.ts +11 -11
- package/dist/access-authorization-probe.js +32 -32
- package/dist/access-boundary.d.ts +11 -11
- package/dist/access-boundary.js +31 -31
- package/dist/access-cli.js +105 -101
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +1 -1
- package/dist/access-extraction-force-flush.d.ts +11 -11
- package/dist/access-extraction-force-flush.js +31 -31
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-lcm-compaction.d.ts +11 -11
- package/dist/access-http-lifecycle-flush.d.ts +11 -11
- package/dist/access-http-offline-stream.d.ts +11 -11
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +33 -33
- package/dist/access-http.d.ts +12 -12
- package/dist/access-http.js +48 -48
- package/dist/access-identity-continuity-surface.d.ts +9 -9
- package/dist/access-identity-continuity-surface.js +31 -31
- package/dist/access-lcm-surface.d.ts +11 -11
- package/dist/access-lcm-surface.js +31 -31
- package/dist/access-mcp.d.ts +11 -11
- package/dist/access-mcp.js +39 -39
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-CLWUoMyW.d.ts → access-namespace-preflight-50VIkPhB.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +31 -31
- package/dist/access-observe-write-surface.d.ts +11 -11
- package/dist/access-observe-write-surface.js +31 -31
- package/dist/access-offline-manifest.d.ts +9 -9
- package/dist/access-operations-batch.js +34 -34
- package/dist/access-operations.d.ts +11 -11
- package/dist/access-operations.js +38 -38
- package/dist/access-recall-concurrency.d.ts +11 -11
- package/dist/access-recall-concurrency.js +31 -31
- package/dist/access-recall-response.d.ts +11 -11
- package/dist/access-recall-response.js +31 -31
- package/dist/access-recall-surface.d.ts +11 -11
- package/dist/access-recall-surface.js +31 -31
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-CEUE1Isj.d.ts → access-service-Dz6I9AZ-.d.ts} +13 -13
- package/dist/access-service-helpers.d.ts +11 -11
- package/dist/access-service.d.ts +11 -11
- package/dist/access-service.js +31 -31
- package/dist/access-surface-catalog.d.ts +11 -11
- package/dist/access-surface-catalog.js +33 -33
- package/dist/access-wearables-meetings-surface.d.ts +3 -3
- 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 +4 -4
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +1 -1
- package/dist/artifact-search.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 +9 -9
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +10 -10
- 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-D1HgugTA.d.ts → catalog-C2jA-gLm.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +13 -13
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-EZSCW4EM.js → chunk-25OLNWYG.js} +2 -2
- package/dist/{chunk-2LBAFHOQ.js → chunk-2QSGJTDG.js} +10 -10
- package/dist/{chunk-7UTDHQZ5.js → chunk-2VZHB5US.js} +2 -2
- package/dist/{chunk-VQNRICAQ.js → chunk-36HJ36FK.js} +3 -3
- package/dist/{chunk-XKNHFDTT.js → chunk-3A2Z4OOS.js} +2 -2
- package/dist/{chunk-KODXCHXJ.js → chunk-46XR5FNZ.js} +39 -3
- package/dist/chunk-46XR5FNZ.js.map +1 -0
- package/dist/{chunk-56IV4J5W.js → chunk-47WWTCJY.js} +1384 -99
- package/dist/chunk-47WWTCJY.js.map +1 -0
- package/dist/{chunk-RDGKVH6T.js → chunk-4NKIGSJM.js} +2 -2
- package/dist/{chunk-EFQCDJZ2.js → chunk-4PG2CKI6.js} +2 -2
- package/dist/{chunk-HJXA6ZM7.js → chunk-6545JDIM.js} +2 -2
- package/dist/{chunk-J3OND5QT.js → chunk-65HXVEVG.js} +2 -2
- package/dist/{chunk-HNPE66LB.js → chunk-6BYJQ3L2.js} +8 -8
- package/dist/{chunk-ZW4VXELZ.js → chunk-6PUF7LUO.js} +2 -2
- package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
- package/dist/{chunk-MN5NOOI7.js → chunk-AI5M4FVQ.js} +2 -2
- package/dist/{chunk-IHGMRDEE.js → chunk-B4B3QDV3.js} +235 -151
- package/dist/chunk-B4B3QDV3.js.map +1 -0
- package/dist/{chunk-YMOPYG3K.js → chunk-BIJAWZYW.js} +6 -6
- package/dist/{chunk-I5VB44ZK.js → chunk-BLHKR4GJ.js} +2 -2
- package/dist/chunk-BLUYQFRH.js +36 -0
- package/dist/chunk-BLUYQFRH.js.map +1 -0
- package/dist/{chunk-CEH2AFXG.js → chunk-C24UZSFW.js} +6 -6
- package/dist/{chunk-MJRGVXPQ.js → chunk-C3ZYZKDJ.js} +2 -2
- package/dist/{chunk-QCRJMU5V.js → chunk-CDLPF3PX.js} +2 -2
- package/dist/{chunk-23CVL7HS.js → chunk-CQ6IWZDI.js} +2 -2
- package/dist/{chunk-KWIGDKM2.js → chunk-D2YNNDML.js} +2 -2
- package/dist/{chunk-FTTJRVB7.js → chunk-D3DUA64S.js} +2 -2
- package/dist/{chunk-7XOG75AU.js → chunk-D6Q5EPOV.js} +2 -2
- package/dist/{chunk-GEJKYA7D.js → chunk-DSEHPUID.js} +6 -6
- package/dist/chunk-E4X2YX2F.js +22 -0
- package/dist/chunk-E4X2YX2F.js.map +1 -0
- package/dist/{chunk-PEBH5DCK.js → chunk-EH7BNIUN.js} +101 -19
- package/dist/chunk-EH7BNIUN.js.map +1 -0
- package/dist/{chunk-OAJMQKQR.js → chunk-EQRD4NMH.js} +2 -2
- package/dist/{chunk-H7VDIF2V.js → chunk-ER2UPUMG.js} +2 -2
- package/dist/{chunk-4FHRZD5T.js → chunk-F2JXJABQ.js} +2 -2
- package/dist/{chunk-FKKGCGYL.js → chunk-F4W5HTED.js} +2 -2
- package/dist/{chunk-DMEHOEC7.js → chunk-FFWONAAW.js} +3 -3
- package/dist/chunk-FYDW33ZB.js +13 -0
- package/dist/chunk-FYDW33ZB.js.map +1 -0
- package/dist/{chunk-TNGH4ZYI.js → chunk-GNWLTCKC.js} +2 -2
- package/dist/{chunk-CFVTRUR3.js → chunk-H6RSANGQ.js} +2 -2
- package/dist/chunk-HVAEXYPL.js +98 -0
- package/dist/chunk-HVAEXYPL.js.map +1 -0
- package/dist/{chunk-CTCGHNWN.js → chunk-J2R275FN.js} +4 -4
- package/dist/{chunk-IVIAHQBR.js → chunk-JJ6ZEFXC.js} +2 -2
- package/dist/{chunk-KXIXO76C.js → chunk-JMXHVJ2V.js} +14 -14
- package/dist/{chunk-7LCGFUMB.js → chunk-KQAFEZQX.js} +4 -4
- package/dist/{chunk-NACLNNFQ.js → chunk-KSZKQTZS.js} +2 -2
- package/dist/{chunk-NPIBN2VL.js → chunk-LK4TOYPU.js} +2 -2
- package/dist/{chunk-K66OY4EI.js → chunk-LSR5LQXN.js} +2 -2
- package/dist/chunk-MAG6M3B6.js +51 -0
- package/dist/chunk-MAG6M3B6.js.map +1 -0
- package/dist/{chunk-6CEGSTBD.js → chunk-NTFXBILO.js} +5 -5
- package/dist/{chunk-2PSX5BJU.js → chunk-NZPFCP5A.js} +2 -2
- package/dist/{chunk-FYWLSFFS.js → chunk-OERZXNSK.js} +2 -2
- package/dist/{chunk-ZJPM7GZ3.js → chunk-OIDICRH7.js} +2 -2
- package/dist/{chunk-LTBKKSCX.js → chunk-OLBZ2WGG.js} +2 -2
- package/dist/{chunk-PD66CVSD.js → chunk-OUKBMQ2O.js} +2 -2
- package/dist/{chunk-GPFZFCRN.js → chunk-PP7R754B.js} +1 -1
- package/dist/{chunk-GX6FTSYH.js → chunk-PRRUK2ZH.js} +2 -2
- package/dist/{chunk-MAH64N55.js → chunk-PW3GKWH3.js} +4 -4
- package/dist/chunk-Q3SHEAXR.js +80 -0
- package/dist/chunk-Q3SHEAXR.js.map +1 -0
- package/dist/{chunk-33MFRY25.js → chunk-R2Q6FTOX.js} +2 -2
- package/dist/{chunk-VCKWULAK.js → chunk-RCPKBW7K.js} +5 -5
- package/dist/{chunk-CN4VKV3S.js → chunk-RH3XLQG4.js} +2 -2
- package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
- package/dist/{chunk-YXFCALVT.js → chunk-U4HZEW2B.js} +8 -8
- package/dist/{chunk-RZ3IZIJG.js → chunk-UHQE37NI.js} +2 -2
- package/dist/{chunk-Z3YEGSR4.js → chunk-UMZUKOJU.js} +4 -4
- package/dist/{chunk-72OIT7KS.js → chunk-UVYL5G7A.js} +3 -3
- package/dist/{chunk-4STAANV7.js → chunk-VKDBDJIX.js} +3 -3
- package/dist/{chunk-WKJFIMVN.js → chunk-VSMSYDIH.js} +2 -2
- package/dist/{chunk-GSKINLAK.js → chunk-W5IYHQA5.js} +3 -3
- package/dist/{chunk-FESUGFIL.js → chunk-WKWY7YF3.js} +2 -2
- package/dist/{chunk-UNUMFURP.js → chunk-X5PIDJ3L.js} +3 -3
- package/dist/{chunk-MINHJ55X.js → chunk-XXW32OL7.js} +1 -1
- package/dist/{chunk-MINHJ55X.js.map → chunk-XXW32OL7.js.map} +1 -1
- package/dist/{chunk-6RUHELWR.js → chunk-Y2YM4C75.js} +2 -2
- package/dist/{chunk-L4X4PJYK.js → chunk-YZ5VC2JJ.js} +2 -2
- package/dist/{chunk-VQ4AMTGZ.js → chunk-ZBIEX4XN.js} +1 -1
- package/dist/{chunk-O57GM3FR.js → chunk-ZMVW2HJJ.js} +2 -2
- package/dist/{chunk-6QDXA26G.js → chunk-ZXROBS53.js} +68 -68
- package/dist/{cli-BEkm2MEf.d.ts → cli-BOuEb4Ia.d.ts} +5 -5
- package/dist/cli.d.ts +13 -13
- package/dist/cli.js +76 -76
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +10 -10
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +10 -10
- 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 +4 -4
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +10 -10
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +10 -10
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +3 -3
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +12 -12
- 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 +12 -12
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/day-summary.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-BCpeo14F.d.ts → dependency-propagation-delivery-D4WMbOwA.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -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 +10 -10
- 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 +9 -9
- package/dist/external-wiki-access.d.ts +11 -11
- package/dist/external-wiki-access.js +32 -32
- 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 +11 -11
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- 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-wire.d.ts +17 -0
- package/dist/extraction-span-wire.js +13 -0
- package/dist/extraction-span-wire.js.map +1 -0
- package/dist/extraction-span.d.ts +17 -0
- package/dist/extraction-span.js +8 -0
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +13 -13
- package/dist/fallback-llm.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-decay-A4SDFMMS.js → graph-edge-decay-FXGELBFA.js} +4 -4
- package/dist/graph-edge-decay-FXGELBFA.js.map +1 -0
- package/dist/graph-edge-reinforcement.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-snapshot.js +3 -3
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +3 -3
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/{index-D_pyMUaP.d.ts → index-DuJnzwHv.d.ts} +2 -2
- package/dist/index.d.ts +341 -26
- package/dist/index.js +195 -114
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +7 -7
- 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.d.ts +1 -1
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +3 -3
- package/dist/location/index.js +12 -12
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +10 -10
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +11 -11
- package/dist/{maintenance-DDUX9d6D.d.ts → maintenance-BBeaeYRR.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +11 -11
- package/dist/memory-action-policy.d.ts +1 -1
- 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 +11 -11
- package/dist/memory-subject.d.ts +11 -11
- 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 +11 -11
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +6 -6
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +10 -10
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/offline-sync-impression-drain.d.ts +1 -1
- 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 +24 -24
- 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-3F4jihCo.d.ts → orchestrator-CaqnwNwM.d.ts} +8 -8
- package/dist/orchestrator.d.ts +9 -9
- package/dist/orchestrator.js +105 -101
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-CB1dj6Uh.d.ts → pipeline-CrxVjlJr.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/{public-http-34-JIAGQ.d.ts → public-http-CmQRjQCD.d.ts} +1 -1
- package/dist/{qmd-edLLZXc5.d.ts → qmd-BZgbJm0g.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/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +1 -1
- package/dist/recall-deep-access.d.ts +30 -0
- package/dist/recall-deep-access.js +50 -0
- package/dist/recall-deep-access.js.map +1 -0
- package/dist/recall-deep-render.d.ts +11 -0
- package/dist/recall-deep-render.js +28 -0
- package/dist/recall-deep-render.js.map +1 -0
- package/dist/recall-deep.d.ts +37 -0
- package/dist/recall-deep.js +14 -0
- package/dist/recall-deep.js.map +1 -0
- 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.d.ts +70 -0
- package/dist/recall-navigate.js +15 -0
- package/dist/recall-navigate.js.map +1 -0
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state-view-render.d.ts +18 -0
- package/dist/recall-state-view-render.js +22 -0
- package/dist/recall-state-view-render.js.map +1 -0
- package/dist/recall-state-view-widen.d.ts +13 -0
- package/dist/recall-state-view-widen.js +11 -0
- package/dist/recall-state-view-widen.js.map +1 -0
- package/dist/recall-state-view-wire.d.ts +13 -0
- package/dist/recall-state-view-wire.js +12 -0
- package/dist/recall-state-view-wire.js.map +1 -0
- package/dist/recall-state-view.d.ts +25 -0
- package/dist/recall-state-view.js +22 -0
- package/dist/recall-state-view.js.map +1 -0
- 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/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 +5 -5
- 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 +42 -42
- package/dist/{scope-profiles-BF2lu81V.d.ts → scope-profiles-DFaojvoP.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +5 -5
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +9 -9
- 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-5OuWXBRt.d.ts → semantic-consolidation-BiX68wZA.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +11 -11
- package/dist/semantic-rule-promotion.js +10 -10
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +10 -10
- package/dist/{service-CrqEhLXD.d.ts → service-D5h2zZ0M.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 +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/source-agent-qualifier.d.ts +1 -1
- package/dist/source-agent-qualifier.js +12 -12
- package/dist/{storage-BQn-xnxm.d.ts → storage-CtsaojWD.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +9 -9
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +14 -14
- package/dist/support-passport/index.js +34 -34
- 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/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +11 -11
- package/dist/transfer/types.d.ts +12 -12
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-BRpcNjHZ.d.ts → types-CIpfYz1I.d.ts} +16 -11
- 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 +10 -10
- package/dist/who-knows-cli.d.ts +11 -11
- package/dist/who-knows-cli.js +11 -11
- package/dist/who-knows.d.ts +11 -11
- package/dist/who-knows.js +10 -10
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/activity/config.test.ts +1 -1
- package/src/activity/config.ts +48 -3
- package/src/activity/index.ts +5 -0
- package/src/activity/journal-vault-read.test.ts +153 -0
- package/src/activity/journal-vault-read.ts +214 -0
- package/src/activity/journal.test.ts +97 -0
- package/src/activity/journal.ts +113 -0
- package/src/activity/privacy.test.ts +53 -0
- package/src/activity/privacy.ts +80 -0
- package/src/activity/timeline/analysis-batch.test.ts +56 -0
- package/src/activity/timeline/analysis-batch.ts +45 -0
- package/src/activity/timeline/analysis.test.ts +413 -0
- package/src/activity/timeline/analysis.ts +362 -0
- package/src/activity/timeline/index.ts +7 -0
- package/src/activity/timeline/journal-recap-persist.test.ts +148 -0
- package/src/activity/timeline/journal-recap-persist.ts +37 -0
- package/src/activity/timeline/journal-recap.test.ts +113 -0
- package/src/activity/timeline/journal-recap.ts +130 -0
- package/src/activity/timeline/query.test.ts +198 -0
- package/src/activity/timeline/query.ts +313 -0
- package/src/activity/timeline/weekly-persist.test.ts +121 -0
- package/src/activity/timeline/weekly-persist.ts +103 -0
- package/src/activity/timeline/weekly.test.ts +215 -0
- package/src/activity/timeline/weekly.ts +234 -0
- package/src/activity/types.ts +14 -0
- package/src/activity/vault-path.test.ts +38 -0
- package/src/activity/vault-path.ts +59 -0
- package/src/activity/vault-publish.test.ts +268 -0
- package/src/activity/vault-publish.ts +180 -0
- package/src/config.test.ts +1 -1
- package/src/config.ts +2 -22
- package/src/dedup/merge-on-write-wire.test.ts +101 -0
- package/src/dedup/merge-on-write-wire.ts +34 -0
- package/src/dedup/merge-on-write.test.ts +91 -0
- package/src/dedup/merge-on-write.ts +75 -0
- package/src/dedup/novelty-gate.test.ts +143 -0
- package/src/dedup/novelty-gate.ts +163 -0
- package/src/extraction-span-wire.test.ts +20 -0
- package/src/extraction-span-wire.ts +17 -0
- package/src/extraction-span.test.ts +59 -0
- package/src/extraction-span.ts +39 -0
- package/src/index.ts +1 -0
- package/src/location/recall-exclusion.test.ts +1 -0
- package/src/orchestration/extraction-persist.ts +22 -23
- package/src/orchestration/generic-recall-paths.ts +11 -0
- package/src/orchestration/recall-entry.ts +8 -3
- package/src/recall-deep-access.test.ts +58 -0
- package/src/recall-deep-access.ts +71 -0
- package/src/recall-deep-render.test.ts +68 -0
- package/src/recall-deep-render.ts +32 -0
- package/src/recall-deep.test.ts +72 -0
- package/src/recall-deep.ts +113 -0
- package/src/recall-navigate.test.ts +84 -0
- package/src/recall-navigate.ts +100 -0
- package/src/recall-state-view-render.test.ts +94 -0
- package/src/recall-state-view-render.ts +24 -0
- package/src/recall-state-view-widen.test.ts +66 -0
- package/src/recall-state-view-widen.ts +49 -0
- package/src/recall-state-view-wire.test.ts +35 -0
- package/src/recall-state-view-wire.ts +18 -0
- package/src/recall-state-view.test.ts +131 -0
- package/src/recall-state-view.ts +138 -0
- package/src/shared-context/governance.test.ts +53 -0
- package/src/shared-context/governance.ts +86 -0
- package/src/shared-context/staleness.test.ts +36 -0
- package/src/shared-context/staleness.ts +38 -0
- package/src/shared-context/trajectories.test.ts +77 -0
- package/src/shared-context/trajectories.ts +49 -0
- package/src/types.ts +3 -10
- package/dist/chunk-56IV4J5W.js.map +0 -1
- package/dist/chunk-IHGMRDEE.js.map +0 -1
- package/dist/chunk-KODXCHXJ.js.map +0 -1
- package/dist/chunk-PEBH5DCK.js.map +0 -1
- /package/dist/{chunk-EZSCW4EM.js.map → chunk-25OLNWYG.js.map} +0 -0
- /package/dist/{chunk-2LBAFHOQ.js.map → chunk-2QSGJTDG.js.map} +0 -0
- /package/dist/{chunk-7UTDHQZ5.js.map → chunk-2VZHB5US.js.map} +0 -0
- /package/dist/{chunk-VQNRICAQ.js.map → chunk-36HJ36FK.js.map} +0 -0
- /package/dist/{chunk-XKNHFDTT.js.map → chunk-3A2Z4OOS.js.map} +0 -0
- /package/dist/{chunk-RDGKVH6T.js.map → chunk-4NKIGSJM.js.map} +0 -0
- /package/dist/{chunk-EFQCDJZ2.js.map → chunk-4PG2CKI6.js.map} +0 -0
- /package/dist/{chunk-HJXA6ZM7.js.map → chunk-6545JDIM.js.map} +0 -0
- /package/dist/{chunk-J3OND5QT.js.map → chunk-65HXVEVG.js.map} +0 -0
- /package/dist/{chunk-HNPE66LB.js.map → chunk-6BYJQ3L2.js.map} +0 -0
- /package/dist/{chunk-ZW4VXELZ.js.map → chunk-6PUF7LUO.js.map} +0 -0
- /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
- /package/dist/{chunk-MN5NOOI7.js.map → chunk-AI5M4FVQ.js.map} +0 -0
- /package/dist/{chunk-YMOPYG3K.js.map → chunk-BIJAWZYW.js.map} +0 -0
- /package/dist/{chunk-I5VB44ZK.js.map → chunk-BLHKR4GJ.js.map} +0 -0
- /package/dist/{chunk-CEH2AFXG.js.map → chunk-C24UZSFW.js.map} +0 -0
- /package/dist/{chunk-MJRGVXPQ.js.map → chunk-C3ZYZKDJ.js.map} +0 -0
- /package/dist/{chunk-QCRJMU5V.js.map → chunk-CDLPF3PX.js.map} +0 -0
- /package/dist/{chunk-23CVL7HS.js.map → chunk-CQ6IWZDI.js.map} +0 -0
- /package/dist/{chunk-KWIGDKM2.js.map → chunk-D2YNNDML.js.map} +0 -0
- /package/dist/{chunk-FTTJRVB7.js.map → chunk-D3DUA64S.js.map} +0 -0
- /package/dist/{chunk-7XOG75AU.js.map → chunk-D6Q5EPOV.js.map} +0 -0
- /package/dist/{chunk-GEJKYA7D.js.map → chunk-DSEHPUID.js.map} +0 -0
- /package/dist/{chunk-OAJMQKQR.js.map → chunk-EQRD4NMH.js.map} +0 -0
- /package/dist/{chunk-H7VDIF2V.js.map → chunk-ER2UPUMG.js.map} +0 -0
- /package/dist/{chunk-4FHRZD5T.js.map → chunk-F2JXJABQ.js.map} +0 -0
- /package/dist/{chunk-FKKGCGYL.js.map → chunk-F4W5HTED.js.map} +0 -0
- /package/dist/{chunk-DMEHOEC7.js.map → chunk-FFWONAAW.js.map} +0 -0
- /package/dist/{chunk-TNGH4ZYI.js.map → chunk-GNWLTCKC.js.map} +0 -0
- /package/dist/{chunk-CFVTRUR3.js.map → chunk-H6RSANGQ.js.map} +0 -0
- /package/dist/{chunk-CTCGHNWN.js.map → chunk-J2R275FN.js.map} +0 -0
- /package/dist/{chunk-IVIAHQBR.js.map → chunk-JJ6ZEFXC.js.map} +0 -0
- /package/dist/{chunk-KXIXO76C.js.map → chunk-JMXHVJ2V.js.map} +0 -0
- /package/dist/{chunk-7LCGFUMB.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-NACLNNFQ.js.map → chunk-KSZKQTZS.js.map} +0 -0
- /package/dist/{chunk-NPIBN2VL.js.map → chunk-LK4TOYPU.js.map} +0 -0
- /package/dist/{chunk-K66OY4EI.js.map → chunk-LSR5LQXN.js.map} +0 -0
- /package/dist/{chunk-6CEGSTBD.js.map → chunk-NTFXBILO.js.map} +0 -0
- /package/dist/{chunk-2PSX5BJU.js.map → chunk-NZPFCP5A.js.map} +0 -0
- /package/dist/{chunk-FYWLSFFS.js.map → chunk-OERZXNSK.js.map} +0 -0
- /package/dist/{chunk-ZJPM7GZ3.js.map → chunk-OIDICRH7.js.map} +0 -0
- /package/dist/{chunk-LTBKKSCX.js.map → chunk-OLBZ2WGG.js.map} +0 -0
- /package/dist/{chunk-PD66CVSD.js.map → chunk-OUKBMQ2O.js.map} +0 -0
- /package/dist/{chunk-GPFZFCRN.js.map → chunk-PP7R754B.js.map} +0 -0
- /package/dist/{chunk-GX6FTSYH.js.map → chunk-PRRUK2ZH.js.map} +0 -0
- /package/dist/{chunk-MAH64N55.js.map → chunk-PW3GKWH3.js.map} +0 -0
- /package/dist/{chunk-33MFRY25.js.map → chunk-R2Q6FTOX.js.map} +0 -0
- /package/dist/{chunk-VCKWULAK.js.map → chunk-RCPKBW7K.js.map} +0 -0
- /package/dist/{chunk-CN4VKV3S.js.map → chunk-RH3XLQG4.js.map} +0 -0
- /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
- /package/dist/{chunk-YXFCALVT.js.map → chunk-U4HZEW2B.js.map} +0 -0
- /package/dist/{chunk-RZ3IZIJG.js.map → chunk-UHQE37NI.js.map} +0 -0
- /package/dist/{chunk-Z3YEGSR4.js.map → chunk-UMZUKOJU.js.map} +0 -0
- /package/dist/{chunk-72OIT7KS.js.map → chunk-UVYL5G7A.js.map} +0 -0
- /package/dist/{chunk-4STAANV7.js.map → chunk-VKDBDJIX.js.map} +0 -0
- /package/dist/{chunk-WKJFIMVN.js.map → chunk-VSMSYDIH.js.map} +0 -0
- /package/dist/{chunk-GSKINLAK.js.map → chunk-W5IYHQA5.js.map} +0 -0
- /package/dist/{chunk-FESUGFIL.js.map → chunk-WKWY7YF3.js.map} +0 -0
- /package/dist/{chunk-UNUMFURP.js.map → chunk-X5PIDJ3L.js.map} +0 -0
- /package/dist/{chunk-6RUHELWR.js.map → chunk-Y2YM4C75.js.map} +0 -0
- /package/dist/{chunk-L4X4PJYK.js.map → chunk-YZ5VC2JJ.js.map} +0 -0
- /package/dist/{chunk-VQ4AMTGZ.js.map → chunk-ZBIEX4XN.js.map} +0 -0
- /package/dist/{chunk-O57GM3FR.js.map → chunk-ZMVW2HJJ.js.map} +0 -0
- /package/dist/{chunk-6QDXA26G.js.map → chunk-ZXROBS53.js.map} +0 -0
- /package/dist/{graph-edge-decay-A4SDFMMS.js.map → extraction-span.js.map} +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall navigation helpers (issue #1956 first slice).
|
|
3
|
+
*
|
|
4
|
+
* Pure expand/traverse over disclosure levels and typed links. No LLM, no IO.
|
|
5
|
+
* Surfaces (MCP/HTTP/CLI) and parseConfig wiring wait for a later PR —
|
|
6
|
+
* config.ts is at its fileSizeGrandfather ceiling.
|
|
7
|
+
*
|
|
8
|
+
* Budget 0 is off (unavailable). Empty means the step ran and found nothing.
|
|
9
|
+
*/
|
|
10
|
+
import {
|
|
11
|
+
RECALL_DISCLOSURE_LEVELS,
|
|
12
|
+
type RecallDisclosure,
|
|
13
|
+
} from "./types.js";
|
|
14
|
+
|
|
15
|
+
export const RECALL_NAV_LINK_TYPES = [
|
|
16
|
+
"supports",
|
|
17
|
+
"contradicts",
|
|
18
|
+
"elaborates",
|
|
19
|
+
"supersedes",
|
|
20
|
+
"causes",
|
|
21
|
+
] as const;
|
|
22
|
+
|
|
23
|
+
export type RecallNavLinkType = (typeof RECALL_NAV_LINK_TYPES)[number];
|
|
24
|
+
|
|
25
|
+
export interface RecallNavBudget {
|
|
26
|
+
budget: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface RecallNavEdge {
|
|
30
|
+
targetId: string;
|
|
31
|
+
linkType: string;
|
|
32
|
+
preview?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface RecallNavNode {
|
|
36
|
+
id: string;
|
|
37
|
+
disclosure: RecallDisclosure;
|
|
38
|
+
payloads?: Partial<Record<RecallDisclosure, string>>;
|
|
39
|
+
links?: readonly RecallNavEdge[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface RecallNavNeighbor {
|
|
43
|
+
id: string;
|
|
44
|
+
linkType: RecallNavLinkType;
|
|
45
|
+
preview?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type RecallNavExpandResult =
|
|
49
|
+
| { status: "ok"; node: { id: string; disclosure: RecallDisclosure; text: string } }
|
|
50
|
+
| { status: "empty" }
|
|
51
|
+
| { status: "unavailable"; reason: "budget_off" };
|
|
52
|
+
|
|
53
|
+
export type RecallNavTraverseResult =
|
|
54
|
+
| { status: "ok"; neighbors: readonly RecallNavNeighbor[] }
|
|
55
|
+
| { status: "empty" }
|
|
56
|
+
| { status: "unavailable"; reason: "budget_off" };
|
|
57
|
+
|
|
58
|
+
export function isRecallNavLinkType(value: unknown): value is RecallNavLinkType {
|
|
59
|
+
return typeof value === "string" && (RECALL_NAV_LINK_TYPES as readonly string[]).includes(value);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function expandRecallNode(
|
|
63
|
+
node: RecallNavNode,
|
|
64
|
+
options: RecallNavBudget,
|
|
65
|
+
): RecallNavExpandResult {
|
|
66
|
+
if (!Number.isFinite(options.budget) || options.budget <= 0) {
|
|
67
|
+
return { status: "unavailable", reason: "budget_off" };
|
|
68
|
+
}
|
|
69
|
+
const current = RECALL_DISCLOSURE_LEVELS.indexOf(node.disclosure);
|
|
70
|
+
const next = current >= 0 ? RECALL_DISCLOSURE_LEVELS[current + 1] : undefined;
|
|
71
|
+
if (next === undefined) return { status: "empty" };
|
|
72
|
+
const text = node.payloads?.[next];
|
|
73
|
+
if (typeof text !== "string") return { status: "empty" };
|
|
74
|
+
return { status: "ok", node: { id: node.id, disclosure: next, text } };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function traverseRecallLink(
|
|
78
|
+
from: RecallNavNode,
|
|
79
|
+
linkType: string,
|
|
80
|
+
options: RecallNavBudget,
|
|
81
|
+
): RecallNavTraverseResult {
|
|
82
|
+
if (!isRecallNavLinkType(linkType)) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
`unknown recall nav linkType: ${JSON.stringify(linkType)}. Valid: ${RECALL_NAV_LINK_TYPES.join(", ")}`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
if (!Number.isFinite(options.budget) || options.budget <= 0) {
|
|
88
|
+
return { status: "unavailable", reason: "budget_off" };
|
|
89
|
+
}
|
|
90
|
+
const neighbors = (from.links ?? [])
|
|
91
|
+
.filter((link) => link.linkType === linkType)
|
|
92
|
+
.map((link) => {
|
|
93
|
+
const neighbor: RecallNavNeighbor = { id: link.targetId, linkType };
|
|
94
|
+
if (link.preview !== undefined) neighbor.preview = link.preview;
|
|
95
|
+
return neighbor;
|
|
96
|
+
})
|
|
97
|
+
.sort((a, b) => a.id.localeCompare(b.id, "en"));
|
|
98
|
+
if (neighbors.length === 0) return { status: "empty" };
|
|
99
|
+
return { status: "ok", neighbors };
|
|
100
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { renderStateViewLine } from "./recall-state-view-render.js";
|
|
5
|
+
|
|
6
|
+
const TEXT = "Was a baker";
|
|
7
|
+
const DATE = "2026-03-01";
|
|
8
|
+
const SUCCESSOR = "new-job";
|
|
9
|
+
|
|
10
|
+
test("historical line gets the superseded prefix", () => {
|
|
11
|
+
const line = renderStateViewLine(
|
|
12
|
+
{
|
|
13
|
+
id: "old-job",
|
|
14
|
+
text: TEXT,
|
|
15
|
+
stateLabel: "historical",
|
|
16
|
+
supersededAt: DATE,
|
|
17
|
+
supersededBy: SUCCESSOR,
|
|
18
|
+
},
|
|
19
|
+
{ enabled: true },
|
|
20
|
+
);
|
|
21
|
+
assert.equal(line, `[superseded ${DATE} by ${SUCCESSOR}] ${TEXT}`);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("transition line gets the superseded prefix", () => {
|
|
25
|
+
const line = renderStateViewLine(
|
|
26
|
+
{
|
|
27
|
+
id: "mid-job",
|
|
28
|
+
text: TEXT,
|
|
29
|
+
stateLabel: "transition",
|
|
30
|
+
supersededAt: DATE,
|
|
31
|
+
supersededBy: SUCCESSOR,
|
|
32
|
+
},
|
|
33
|
+
{ enabled: true },
|
|
34
|
+
);
|
|
35
|
+
assert.equal(line, `[superseded ${DATE} by ${SUCCESSOR}] ${TEXT}`);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("current line is identity text", () => {
|
|
39
|
+
assert.equal(
|
|
40
|
+
renderStateViewLine(
|
|
41
|
+
{
|
|
42
|
+
id: "new-job",
|
|
43
|
+
text: TEXT,
|
|
44
|
+
stateLabel: "current",
|
|
45
|
+
supersededAt: DATE,
|
|
46
|
+
supersededBy: SUCCESSOR,
|
|
47
|
+
},
|
|
48
|
+
{ enabled: true },
|
|
49
|
+
),
|
|
50
|
+
TEXT,
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("missing date is identity text", () => {
|
|
55
|
+
assert.equal(
|
|
56
|
+
renderStateViewLine(
|
|
57
|
+
{
|
|
58
|
+
id: "old-job",
|
|
59
|
+
text: TEXT,
|
|
60
|
+
stateLabel: "historical",
|
|
61
|
+
supersededBy: SUCCESSOR,
|
|
62
|
+
},
|
|
63
|
+
{ enabled: true },
|
|
64
|
+
),
|
|
65
|
+
TEXT,
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("missing successor is identity text", () => {
|
|
70
|
+
assert.equal(
|
|
71
|
+
renderStateViewLine(
|
|
72
|
+
{
|
|
73
|
+
id: "old-job",
|
|
74
|
+
text: TEXT,
|
|
75
|
+
stateLabel: "historical",
|
|
76
|
+
supersededAt: DATE,
|
|
77
|
+
},
|
|
78
|
+
{ enabled: true },
|
|
79
|
+
),
|
|
80
|
+
TEXT,
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("enabled false is identity text", () => {
|
|
85
|
+
const historical = {
|
|
86
|
+
id: "old-job",
|
|
87
|
+
text: TEXT,
|
|
88
|
+
stateLabel: "historical" as const,
|
|
89
|
+
supersededAt: DATE,
|
|
90
|
+
supersededBy: SUCCESSOR,
|
|
91
|
+
};
|
|
92
|
+
assert.equal(renderStateViewLine(historical), TEXT);
|
|
93
|
+
assert.equal(renderStateViewLine(historical, { enabled: false }), TEXT);
|
|
94
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall inject-line renderer for state views (issue #1952).
|
|
3
|
+
*
|
|
4
|
+
* Historical and transition rows get `[superseded <date> by <id>]` when both
|
|
5
|
+
* supersededAt and supersededBy are present. Current rows and a disabled
|
|
6
|
+
* flag are identity.
|
|
7
|
+
*/
|
|
8
|
+
import { formatSupersededPrefix, type StateViewResult } from "./recall-state-view.js";
|
|
9
|
+
|
|
10
|
+
export type StateViewLineResult = StateViewResult & { text?: string };
|
|
11
|
+
|
|
12
|
+
export function renderStateViewLine(
|
|
13
|
+
result: StateViewLineResult,
|
|
14
|
+
options: { enabled?: boolean } = {},
|
|
15
|
+
): string {
|
|
16
|
+
const text = typeof result.text === "string" ? result.text : "";
|
|
17
|
+
if (options.enabled !== true) return text;
|
|
18
|
+
const label = result.stateLabel;
|
|
19
|
+
if (label !== "historical" && label !== "transition") return text;
|
|
20
|
+
const date = result.supersededAt;
|
|
21
|
+
const successor = result.supersededBy;
|
|
22
|
+
if (!date || !successor) return text;
|
|
23
|
+
return `${formatSupersededPrefix(date, successor)} ${text}`;
|
|
24
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { applyRecallStateViews } from "./recall-state-view-wire.js";
|
|
5
|
+
import { widenRecallStateViews } from "./recall-state-view-widen.js";
|
|
6
|
+
import type { StateViewResult } from "./recall-state-view.js";
|
|
7
|
+
|
|
8
|
+
function fact(id: string, extra: Partial<StateViewResult> = {}): StateViewResult {
|
|
9
|
+
return { id, ...extra };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const CURRENT = fact("new-job", { status: "active" });
|
|
13
|
+
const HISTORICAL = fact("old-job", {
|
|
14
|
+
status: "superseded",
|
|
15
|
+
supersededBy: "new-job",
|
|
16
|
+
supersededAt: "2026-03-01",
|
|
17
|
+
});
|
|
18
|
+
const ORPHAN = fact("orphan-job", {
|
|
19
|
+
status: "superseded",
|
|
20
|
+
supersededBy: "missing-job",
|
|
21
|
+
});
|
|
22
|
+
const ON = { recallStateViews: true } as const;
|
|
23
|
+
const CHANGE = "when did the job title change";
|
|
24
|
+
const NON_CHANGE = "what is the current job title";
|
|
25
|
+
|
|
26
|
+
test("change-intent query labels both facts when successor is in the set", () => {
|
|
27
|
+
const labeled = widenRecallStateViews([CURRENT], CHANGE, ON, [HISTORICAL]);
|
|
28
|
+
assert.equal(labeled.length, 2);
|
|
29
|
+
assert.equal(labeled[0]?.id, "new-job");
|
|
30
|
+
assert.equal(labeled[0]?.stateLabel, "current");
|
|
31
|
+
assert.equal(labeled[1]?.id, "old-job");
|
|
32
|
+
assert.equal(labeled[1]?.stateLabel, "historical");
|
|
33
|
+
assert.deepEqual(
|
|
34
|
+
applyRecallStateViews([CURRENT, HISTORICAL], CHANGE, ON).map((row) => [
|
|
35
|
+
row.id,
|
|
36
|
+
row.stateLabel,
|
|
37
|
+
]),
|
|
38
|
+
[
|
|
39
|
+
["new-job", "current"],
|
|
40
|
+
["old-job", "historical"],
|
|
41
|
+
],
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("non-change query is identical (same array reference)", () => {
|
|
46
|
+
const input = [CURRENT, HISTORICAL];
|
|
47
|
+
assert.equal(widenRecallStateViews(input, NON_CHANGE, ON, [ORPHAN]), input);
|
|
48
|
+
assert.equal(applyRecallStateViews(input, NON_CHANGE, ON), input);
|
|
49
|
+
assert.equal(input[0]?.stateLabel, undefined);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("recallStateViews false is identity (same array reference)", () => {
|
|
53
|
+
const input = [CURRENT];
|
|
54
|
+
assert.equal(widenRecallStateViews(input, CHANGE, {}, [HISTORICAL]), input);
|
|
55
|
+
assert.equal(widenRecallStateViews(input, CHANGE, { recallStateViews: false }, [HISTORICAL]), input);
|
|
56
|
+
assert.equal(applyRecallStateViews(input, CHANGE, { recallStateViews: false }), input);
|
|
57
|
+
assert.equal(input[0]?.stateLabel, undefined);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("superseded without successor is dropped", () => {
|
|
61
|
+
assert.deepEqual(widenRecallStateViews([ORPHAN], CHANGE, ON), []);
|
|
62
|
+
assert.deepEqual(widenRecallStateViews([CURRENT], CHANGE, ON, [ORPHAN]), [
|
|
63
|
+
{ ...CURRENT, stateLabel: "current" },
|
|
64
|
+
]);
|
|
65
|
+
assert.deepEqual(applyRecallStateViews([ORPHAN], CHANGE, ON), []);
|
|
66
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall state-view widening (issue #1952).
|
|
3
|
+
*
|
|
4
|
+
* When recallStateViews is on and the query is change-oriented, admit a
|
|
5
|
+
* superseded memory only if its successor is already in the candidate set.
|
|
6
|
+
* Flag off / non-change queries are identity.
|
|
7
|
+
*/
|
|
8
|
+
import {
|
|
9
|
+
annotateStateView,
|
|
10
|
+
isChangeOrientedQuery,
|
|
11
|
+
parseRecallStateViews,
|
|
12
|
+
resultStateViewId,
|
|
13
|
+
shouldWidenSuperseded,
|
|
14
|
+
type StateViewResult,
|
|
15
|
+
} from "./recall-state-view.js";
|
|
16
|
+
|
|
17
|
+
export function widenRecallStateViews<T extends StateViewResult>(
|
|
18
|
+
results: T[],
|
|
19
|
+
query: string,
|
|
20
|
+
config: unknown,
|
|
21
|
+
pool: readonly T[] = [],
|
|
22
|
+
): T[] {
|
|
23
|
+
const raw =
|
|
24
|
+
typeof config === "object" && config !== null && "recallStateViews" in config
|
|
25
|
+
? config.recallStateViews
|
|
26
|
+
: undefined;
|
|
27
|
+
const enabled = parseRecallStateViews(raw);
|
|
28
|
+
if (!enabled || !isChangeOrientedQuery(query)) return results;
|
|
29
|
+
|
|
30
|
+
const candidateIds = new Set<string>();
|
|
31
|
+
for (const result of results) {
|
|
32
|
+
const id = resultStateViewId(result);
|
|
33
|
+
if (id) candidateIds.add(id);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const seen = new Set(candidateIds);
|
|
37
|
+
const extra: T[] = [];
|
|
38
|
+
for (const item of pool) {
|
|
39
|
+
const id = resultStateViewId(item);
|
|
40
|
+
if (!id || seen.has(id)) continue;
|
|
41
|
+
if (!shouldWidenSuperseded(item.supersededBy, candidateIds)) continue;
|
|
42
|
+
extra.push(item);
|
|
43
|
+
seen.add(id);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return annotateStateView(extra.length > 0 ? results.concat(extra) : results, query, [], {
|
|
47
|
+
enabled: true,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { applyRecallStateViews } from "./recall-state-view-wire.js";
|
|
5
|
+
import type { StateViewResult } from "./recall-state-view.js";
|
|
6
|
+
|
|
7
|
+
function fact(id: string, extra: Partial<StateViewResult> = {}): StateViewResult {
|
|
8
|
+
return { id, ...extra };
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const PAIR: StateViewResult[] = [
|
|
12
|
+
fact("new-job", { status: "active" }),
|
|
13
|
+
fact("old-job", { status: "superseded", supersededBy: "new-job", supersededAt: "2026-03-01" }),
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
test("recallStateViews false is identity (same array reference)", () => {
|
|
17
|
+
const input = PAIR.map((row) => ({ ...row }));
|
|
18
|
+
assert.equal(applyRecallStateViews(input, "when did the job title change", {}), input);
|
|
19
|
+
assert.equal(
|
|
20
|
+
applyRecallStateViews(input, "when did the job title change", { recallStateViews: false }),
|
|
21
|
+
input,
|
|
22
|
+
);
|
|
23
|
+
assert.equal(input[0]?.stateLabel, undefined);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("change-intent query labels a synthetic superseded pair when recallStateViews is on", () => {
|
|
27
|
+
const labeled = applyRecallStateViews(PAIR, "when did the job title change", {
|
|
28
|
+
recallStateViews: true,
|
|
29
|
+
});
|
|
30
|
+
assert.equal(labeled.length, 2);
|
|
31
|
+
assert.equal(labeled[0]?.id, "new-job");
|
|
32
|
+
assert.equal(labeled[0]?.stateLabel, "current");
|
|
33
|
+
assert.equal(labeled[1]?.id, "old-job");
|
|
34
|
+
assert.equal(labeled[1]?.stateLabel, "historical");
|
|
35
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall inject seam for state views (issue #1952).
|
|
3
|
+
*
|
|
4
|
+
* Widening lives in recall-state-view-widen.ts. parseConfig cannot grow.
|
|
5
|
+
* Operators set `recallStateViews` on the live PluginConfig extra field.
|
|
6
|
+
* Default false is identity.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { widenRecallStateViews } from "./recall-state-view-widen.js";
|
|
10
|
+
import type { StateViewResult } from "./recall-state-view.js";
|
|
11
|
+
|
|
12
|
+
export function applyRecallStateViews<T extends StateViewResult>(
|
|
13
|
+
results: T[],
|
|
14
|
+
query: string,
|
|
15
|
+
config: unknown,
|
|
16
|
+
): T[] {
|
|
17
|
+
return widenRecallStateViews(results, query, config);
|
|
18
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
annotateStateView,
|
|
6
|
+
formatSupersededPrefix,
|
|
7
|
+
isChangeOrientedQuery,
|
|
8
|
+
parseRecallStateViews,
|
|
9
|
+
shouldWidenSuperseded,
|
|
10
|
+
type StateViewChain,
|
|
11
|
+
type StateViewResult,
|
|
12
|
+
} from "./recall-state-view.js";
|
|
13
|
+
|
|
14
|
+
function fact(id: string, extra: Partial<StateViewResult> = {}): StateViewResult {
|
|
15
|
+
return { id, ...extra };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const PAIR: StateViewChain[] = [{ predecessorId: "old-job", successorId: "new-job", supersededAt: "2026-03-01" }];
|
|
19
|
+
|
|
20
|
+
const PAIR_RESULTS: StateViewResult[] = [
|
|
21
|
+
fact("new-job", { status: "active" }),
|
|
22
|
+
fact("old-job", { status: "superseded", supersededBy: "new-job", supersededAt: "2026-03-01" }),
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
test("change-intent query labels both facts in a superseded pair", () => {
|
|
26
|
+
const labeled = annotateStateView(PAIR_RESULTS, "when did the job title change", PAIR, { enabled: true });
|
|
27
|
+
assert.equal(labeled.length, 2);
|
|
28
|
+
assert.equal(labeled[0]?.id, "new-job");
|
|
29
|
+
assert.equal(labeled[0]?.stateLabel, "current");
|
|
30
|
+
assert.equal(labeled[1]?.id, "old-job");
|
|
31
|
+
assert.equal(labeled[1]?.stateLabel, "historical");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("change-intent conjugations fire the annotator", () => {
|
|
35
|
+
const phrases = [
|
|
36
|
+
"when did we switch",
|
|
37
|
+
"we used to",
|
|
38
|
+
"before the move",
|
|
39
|
+
"after the cutover",
|
|
40
|
+
"they switched vendors",
|
|
41
|
+
"she switches stacks",
|
|
42
|
+
"switching away from it",
|
|
43
|
+
"the title changed",
|
|
44
|
+
"it changes next week",
|
|
45
|
+
"they are changing providers",
|
|
46
|
+
];
|
|
47
|
+
for (const query of phrases) {
|
|
48
|
+
assert.equal(isChangeOrientedQuery(query), true, query);
|
|
49
|
+
const labeled = annotateStateView(PAIR_RESULTS, query, PAIR, { enabled: true });
|
|
50
|
+
assert.equal(labeled[0]?.stateLabel, "current", query);
|
|
51
|
+
assert.equal(labeled[1]?.stateLabel, "historical", query);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("non-change query is identical (same array reference, no labels)", () => {
|
|
56
|
+
const input = PAIR_RESULTS.map((row) => ({ ...row }));
|
|
57
|
+
const out = annotateStateView(input, "what is the current job title", PAIR, { enabled: true });
|
|
58
|
+
assert.equal(out, input);
|
|
59
|
+
assert.equal(out[0]?.stateLabel, undefined);
|
|
60
|
+
assert.equal(out[1]?.stateLabel, undefined);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("recallStateViews false is identity (same array reference)", () => {
|
|
64
|
+
const input = PAIR_RESULTS.map((row) => ({ ...row }));
|
|
65
|
+
assert.equal(annotateStateView(input, "when did the job title change", PAIR), input);
|
|
66
|
+
assert.equal(annotateStateView(input, "when did the job title change", PAIR, { enabled: false }), input);
|
|
67
|
+
assert.equal(input[0]?.stateLabel, undefined);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("superseded never appears without its successor", () => {
|
|
71
|
+
const orphan = [fact("old-job", { status: "superseded", supersededBy: "new-job" })];
|
|
72
|
+
const out = annotateStateView(orphan, "when did this change", PAIR, { enabled: true });
|
|
73
|
+
assert.deepEqual(out, []);
|
|
74
|
+
assert.equal(shouldWidenSuperseded("new-job", new Set(["old-job"])), false);
|
|
75
|
+
assert.equal(shouldWidenSuperseded("new-job", new Set(["old-job", "new-job"])), true);
|
|
76
|
+
assert.equal(shouldWidenSuperseded(undefined, new Set(["new-job"])), false);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("annotateStateView is sort-stable", () => {
|
|
80
|
+
const reversed = [PAIR_RESULTS[1]!, PAIR_RESULTS[0]!];
|
|
81
|
+
const labeled = annotateStateView(reversed, "when did the title change", PAIR, { enabled: true });
|
|
82
|
+
assert.deepEqual(
|
|
83
|
+
labeled.map((row) => row.id),
|
|
84
|
+
["old-job", "new-job"],
|
|
85
|
+
);
|
|
86
|
+
assert.equal(labeled[0]?.stateLabel, "historical");
|
|
87
|
+
assert.equal(labeled[1]?.stateLabel, "current");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("middle hop of a three-node chain is transition", () => {
|
|
91
|
+
const chains: StateViewChain[] = [
|
|
92
|
+
{ predecessorId: "v1", successorId: "v2" },
|
|
93
|
+
{ predecessorId: "v2", successorId: "v3" },
|
|
94
|
+
];
|
|
95
|
+
const results = [
|
|
96
|
+
fact("v1", { status: "superseded", supersededBy: "v2" }),
|
|
97
|
+
fact("v2", { status: "superseded", supersededBy: "v3" }),
|
|
98
|
+
fact("v3", { status: "active" }),
|
|
99
|
+
];
|
|
100
|
+
const labeled = annotateStateView(results, "what changed", chains, { enabled: true });
|
|
101
|
+
assert.deepEqual(
|
|
102
|
+
labeled.map((row) => [row.id, row.stateLabel]),
|
|
103
|
+
[
|
|
104
|
+
["v1", "historical"],
|
|
105
|
+
["v2", "transition"],
|
|
106
|
+
["v3", "current"],
|
|
107
|
+
],
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("formatSupersededPrefix matches the injected-block contract", () => {
|
|
112
|
+
assert.equal(formatSupersededPrefix("2026-03-01", "new-job"), "[superseded 2026-03-01 by new-job]");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("parseRecallStateViews honors 0/false and defaults off", () => {
|
|
116
|
+
assert.equal(parseRecallStateViews(undefined), false);
|
|
117
|
+
assert.equal(parseRecallStateViews(false), false);
|
|
118
|
+
assert.equal(parseRecallStateViews(0), false);
|
|
119
|
+
assert.equal(parseRecallStateViews("false"), false);
|
|
120
|
+
assert.equal(parseRecallStateViews("0"), false);
|
|
121
|
+
assert.equal(parseRecallStateViews(true), true);
|
|
122
|
+
assert.equal(parseRecallStateViews(1), true);
|
|
123
|
+
assert.equal(parseRecallStateViews("true"), true);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("annotateStateView does not mutate input rows", () => {
|
|
127
|
+
const input = PAIR_RESULTS.map((row) => ({ ...row }));
|
|
128
|
+
annotateStateView(input, "when did this change", PAIR, { enabled: true });
|
|
129
|
+
assert.equal(input[0]?.stateLabel, undefined);
|
|
130
|
+
assert.equal(input[1]?.stateLabel, undefined);
|
|
131
|
+
});
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall state views (issue #1952).
|
|
3
|
+
*
|
|
4
|
+
* Config key: `recallStateViews` (default false). When false, annotateStateView
|
|
5
|
+
* is identity: same array reference, no `stateLabel`. config.ts is at its
|
|
6
|
+
* fileSizeGrandfather ceiling, so parseConfig wiring waits for a later PR.
|
|
7
|
+
* Call `parseRecallStateViews` at the recall seam when that lands.
|
|
8
|
+
*
|
|
9
|
+
* Change-intent morphology lives here (do not grow intent.ts). A superseded
|
|
10
|
+
* memory is admitted only when its successor is also in the candidate set.
|
|
11
|
+
*/
|
|
12
|
+
import { coerceBooleanLike } from "./connectors/coerce.js";
|
|
13
|
+
|
|
14
|
+
export type StateLabel = "current" | "historical" | "transition";
|
|
15
|
+
|
|
16
|
+
export interface StateViewChain {
|
|
17
|
+
predecessorId: string;
|
|
18
|
+
successorId: string;
|
|
19
|
+
supersededAt?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface StateViewResult {
|
|
23
|
+
id?: string;
|
|
24
|
+
docid?: string;
|
|
25
|
+
status?: string;
|
|
26
|
+
supersededBy?: string;
|
|
27
|
+
supersededAt?: string;
|
|
28
|
+
stateLabel?: StateLabel;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const DEFAULT_RECALL_STATE_VIEWS = false;
|
|
32
|
+
|
|
33
|
+
const CHANGE_WORDS = ["before", "after", "switch", "switches", "switched", "switching", "change", "changes", "changed", "changing"];
|
|
34
|
+
|
|
35
|
+
export function parseRecallStateViews(raw: unknown): boolean {
|
|
36
|
+
return coerceBooleanLike(raw, "recallStateViews") === true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function isChangeOrientedQuery(query: string): boolean {
|
|
40
|
+
const lower = query.toLowerCase();
|
|
41
|
+
if (lower.includes("when did") || lower.includes("used to")) return true;
|
|
42
|
+
return CHANGE_WORDS.some((word) => {
|
|
43
|
+
const idx = lower.indexOf(word);
|
|
44
|
+
if (idx < 0) return false;
|
|
45
|
+
const before = idx === 0 || !/[a-z0-9]/.test(lower[idx - 1] ?? "");
|
|
46
|
+
const afterIdx = idx + word.length;
|
|
47
|
+
const after = afterIdx >= lower.length || !/[a-z0-9]/.test(lower[afterIdx] ?? "");
|
|
48
|
+
return before && after;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function shouldWidenSuperseded(
|
|
53
|
+
successorId: string | undefined,
|
|
54
|
+
candidateIds: ReadonlySet<string>,
|
|
55
|
+
): boolean {
|
|
56
|
+
return typeof successorId === "string" && successorId.length > 0 && candidateIds.has(successorId);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function formatSupersededPrefix(date: string, successorId: string): string {
|
|
60
|
+
return `[superseded ${date} by ${successorId}]`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function resultStateViewId(result: StateViewResult): string {
|
|
64
|
+
return result.id ?? result.docid ?? "";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function buildSuccessorMap(results: readonly StateViewResult[], chains: readonly StateViewChain[]): Map<string, string> {
|
|
68
|
+
const byPred = new Map<string, string>();
|
|
69
|
+
for (const chain of chains) {
|
|
70
|
+
if (chain.predecessorId && chain.successorId) {
|
|
71
|
+
byPred.set(chain.predecessorId, chain.successorId);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const result of results) {
|
|
75
|
+
const id = resultStateViewId(result);
|
|
76
|
+
if (id && result.supersededBy) byPred.set(id, result.supersededBy);
|
|
77
|
+
}
|
|
78
|
+
return byPred;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function labelFor(
|
|
82
|
+
id: string,
|
|
83
|
+
result: StateViewResult,
|
|
84
|
+
byPred: Map<string, string>,
|
|
85
|
+
admittedIds: ReadonlySet<string>,
|
|
86
|
+
): StateLabel {
|
|
87
|
+
const successorId = result.supersededBy ?? byPred.get(id);
|
|
88
|
+
const isPred = shouldWidenSuperseded(successorId, admittedIds);
|
|
89
|
+
let isSucc = false;
|
|
90
|
+
for (const [predId, succId] of byPred) {
|
|
91
|
+
if (succId === id && admittedIds.has(predId)) {
|
|
92
|
+
isSucc = true;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (isPred && isSucc) return "transition";
|
|
97
|
+
if (isPred) return "historical";
|
|
98
|
+
if (isSucc) return "current";
|
|
99
|
+
return result.status === "superseded" ? "historical" : "current";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function annotateStateView<T extends StateViewResult>(
|
|
103
|
+
results: T[],
|
|
104
|
+
query: string,
|
|
105
|
+
chains: readonly StateViewChain[],
|
|
106
|
+
options: { enabled?: boolean } = {},
|
|
107
|
+
): T[] {
|
|
108
|
+
const enabled = options.enabled === true;
|
|
109
|
+
if (!enabled || !isChangeOrientedQuery(query)) return results;
|
|
110
|
+
|
|
111
|
+
const byPred = buildSuccessorMap(results, chains);
|
|
112
|
+
const candidateIds = new Set<string>();
|
|
113
|
+
for (const result of results) {
|
|
114
|
+
const id = resultStateViewId(result);
|
|
115
|
+
if (id) candidateIds.add(id);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const admitted: T[] = [];
|
|
119
|
+
for (const result of results) {
|
|
120
|
+
const id = resultStateViewId(result);
|
|
121
|
+
const successorId = result.supersededBy ?? byPred.get(id);
|
|
122
|
+
const superseded = result.status === "superseded" || Boolean(result.supersededBy) || byPred.has(id);
|
|
123
|
+
if (!superseded || shouldWidenSuperseded(successorId, candidateIds)) {
|
|
124
|
+
admitted.push(result);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const admittedIds = new Set<string>();
|
|
129
|
+
for (const result of admitted) {
|
|
130
|
+
const id = resultStateViewId(result);
|
|
131
|
+
if (id) admittedIds.add(id);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return admitted.map((result) => {
|
|
135
|
+
const id = resultStateViewId(result);
|
|
136
|
+
return { ...result, stateLabel: labelFor(id, result, byPred, admittedIds) };
|
|
137
|
+
});
|
|
138
|
+
}
|