@remnic/core 9.7.8 → 9.7.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.d.ts +6 -6
- package/dist/access-admin-ops-surface.js +32 -30
- package/dist/access-audit.js +2 -2
- package/dist/access-boundary.d.ts +6 -6
- package/dist/access-boundary.js +33 -31
- package/dist/access-cli.js +92 -90
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +6 -6
- package/dist/access-http.js +40 -38
- package/dist/access-identity-continuity-surface.d.ts +5 -5
- package/dist/access-identity-continuity-surface.js +32 -30
- package/dist/access-lcm-surface.d.ts +6 -6
- package/dist/access-lcm-surface.js +32 -30
- package/dist/access-mcp.d.ts +6 -6
- package/dist/access-mcp.js +37 -35
- package/dist/access-observe-write-surface.d.ts +6 -6
- package/dist/access-observe-write-surface.js +32 -30
- package/dist/access-operations-batch.js +35 -33
- package/dist/access-operations.d.ts +9 -9
- package/dist/access-operations.js +36 -34
- package/dist/access-recall-surface.d.ts +6 -6
- package/dist/access-recall-surface.js +32 -30
- package/dist/access-schema.d.ts +64 -64
- package/dist/{access-service-CxDZXTKt.d.ts → access-service-DSuzikHQ.d.ts} +4 -4
- package/dist/access-service.d.ts +6 -6
- package/dist/access-service.js +32 -30
- package/dist/access-surface-catalog.d.ts +6 -6
- 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 +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/{auto-sync-676N6N6Y.js → auto-sync-AAMTVZMK.js} +5 -5
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +5 -5
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +15 -13
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer.d.ts +2 -2
- package/dist/bulk-import/index.d.ts +3 -3
- package/dist/calibration.d.ts +1 -1
- package/dist/calibration.js +2 -2
- package/dist/capabilities.d.ts +1 -1
- package/dist/{capsule-merge-GK5E647P.js → capsule-merge-Z2HUO6IK.js} +10 -2
- package/dist/capsule-merge-Z2HUO6IK.js.map +1 -0
- package/dist/{catalog-DzU9HowE.d.ts → catalog-BNwjACa5.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 -14
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-HHAA35A3.js → chunk-2VN4JAX7.js} +548 -161
- package/dist/chunk-2VN4JAX7.js.map +1 -0
- package/dist/{chunk-CNWC274T.js → chunk-3OQ4IZJN.js} +28 -28
- package/dist/{chunk-JO5AT6QT.js → chunk-3ZVFLMFQ.js} +1 -1
- package/dist/chunk-3ZVFLMFQ.js.map +1 -0
- package/dist/{chunk-7XH7VJN4.js → chunk-5S7Z5SHA.js} +2 -2
- package/dist/{chunk-WKE4VXSZ.js → chunk-673NPXE3.js} +2 -2
- package/dist/{chunk-Q6JPMCPO.js → chunk-7CKS4AXY.js} +63 -58
- package/dist/chunk-7CKS4AXY.js.map +1 -0
- package/dist/{chunk-UHGHTOR5.js → chunk-7EX4YOKH.js} +7 -7
- package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
- package/dist/{chunk-EJCVMPIM.js → chunk-7LMEY5KZ.js} +15 -1
- package/dist/chunk-7LMEY5KZ.js.map +1 -0
- package/dist/{chunk-3F4N4WDH.js → chunk-AHLPZ2SF.js} +2 -2
- package/dist/{chunk-6C35R7P4.js → chunk-DJCKXI4M.js} +2 -2
- package/dist/{chunk-AD2KK5MT.js → chunk-DLWYAN6A.js} +9 -3
- package/dist/chunk-DLWYAN6A.js.map +1 -0
- package/dist/{chunk-TVRPRFUB.js → chunk-EQF5763Z.js} +9 -7
- package/dist/chunk-EQF5763Z.js.map +1 -0
- package/dist/{chunk-FYKIEOG6.js → chunk-FNJX2O6G.js} +3 -3
- package/dist/{chunk-DQPPRXFO.js → chunk-HQ7QZJM5.js} +2 -2
- package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
- package/dist/{chunk-KIPLG7S7.js → chunk-JKLJ6A7W.js} +2 -2
- package/dist/{chunk-O3BZ6PFY.js → chunk-JZM5QUTE.js} +2 -2
- package/dist/{chunk-KTOH7EJE.js → chunk-KXLRMM35.js} +312 -48
- package/dist/chunk-KXLRMM35.js.map +1 -0
- package/dist/{chunk-ZUFJ7ZTR.js → chunk-L4H6MQ7I.js} +6 -2
- package/dist/chunk-L4H6MQ7I.js.map +1 -0
- package/dist/{chunk-SYNYI4ZM.js → chunk-L5HJQC36.js} +2 -2
- package/dist/{chunk-VXMWDXIJ.js → chunk-LC7OODWZ.js} +2 -2
- package/dist/{chunk-ZW6OKHVX.js → chunk-LQKITFGB.js} +2 -2
- package/dist/{chunk-TZJVTH3F.js → chunk-MXRMNKSY.js} +14 -14
- package/dist/{chunk-GL3SMLMZ.js → chunk-N3LWQJ6Y.js} +150 -119
- package/dist/chunk-N3LWQJ6Y.js.map +1 -0
- package/dist/{chunk-M5QKGHCR.js → chunk-OC35KQIN.js} +6 -2
- package/dist/chunk-OC35KQIN.js.map +1 -0
- package/dist/chunk-OKUEZOGW.js +27 -0
- package/dist/chunk-OKUEZOGW.js.map +1 -0
- package/dist/{chunk-PKGWJFNR.js → chunk-OVMS3DCB.js} +2 -2
- package/dist/chunk-PDJTHRAW.js +36 -0
- package/dist/chunk-PDJTHRAW.js.map +1 -0
- package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
- package/dist/{chunk-NMMKRVUF.js → chunk-QVALQE4P.js} +6 -6
- package/dist/{chunk-FXGC5UUH.js → chunk-RT7IP3D3.js} +2 -2
- package/dist/{chunk-AH3M6F4X.js → chunk-SBFDL2EQ.js} +2 -2
- package/dist/{chunk-UYZUJ4EB.js → chunk-SECMZACR.js} +2 -2
- package/dist/{chunk-HXDKC3BI.js → chunk-TGBJ2OMK.js} +2 -2
- package/dist/{chunk-DE6ENYLG.js → chunk-TXLGHDHS.js} +2 -2
- package/dist/{chunk-74MJH7I3.js → chunk-U4KHQTJ6.js} +12 -3
- package/dist/chunk-U4KHQTJ6.js.map +1 -0
- package/dist/{chunk-CRFTLUWT.js → chunk-UTDA43TB.js} +2 -2
- package/dist/{chunk-GKCCHHZK.js → chunk-UXKMMNJD.js} +4 -4
- package/dist/{chunk-57INMZ6F.js → chunk-UZRIKUFS.js} +2 -2
- package/dist/{chunk-2FSHROYK.js → chunk-V53GJUSL.js} +8 -8
- package/dist/{chunk-LKT755LP.js → chunk-VA4WSW54.js} +2 -2
- package/dist/{chunk-ZHKD4EZM.js → chunk-VCEH5UYS.js} +3 -3
- package/dist/{chunk-CHVU4RE5.js → chunk-VDLMAJXS.js} +3 -3
- package/dist/{chunk-XFTPUXCE.js → chunk-VRAD2FGO.js} +10 -10
- package/dist/{chunk-VF4XKTX3.js → chunk-VZ5OJE4X.js} +10 -2
- package/dist/chunk-VZ5OJE4X.js.map +1 -0
- package/dist/{chunk-UVIQHSS7.js → chunk-WUDBMLC6.js} +9 -3
- package/dist/chunk-WUDBMLC6.js.map +1 -0
- package/dist/{chunk-AWJ2FHCF.js → chunk-X47LWMKA.js} +49 -21
- package/dist/chunk-X47LWMKA.js.map +1 -0
- package/dist/{chunk-VMGMY2AI.js → chunk-XF4KOVDK.js} +8 -8
- package/dist/{chunk-VMGMY2AI.js.map → chunk-XF4KOVDK.js.map} +1 -1
- package/dist/{chunk-T7VNN3ZM.js → chunk-XVLEGMJI.js} +2 -2
- package/dist/{chunk-R2SJDIPO.js → chunk-YLTG6BO4.js} +9 -7
- package/dist/chunk-YLTG6BO4.js.map +1 -0
- package/dist/{chunk-QDCJNRKK.js → chunk-YXOAQAH2.js} +3 -3
- package/dist/{cli-BqyGVyOe.d.ts → cli-DACyuK8-.d.ts} +5 -5
- package/dist/cli.d.ts +8 -8
- package/dist/cli.js +66 -64
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +15 -13
- 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 +1 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +15 -13
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +15 -13
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-provenance-check.js +6 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/consolidation-undo.js +8 -1
- package/dist/consolidation-undo.js.map +1 -1
- package/dist/contradiction/index.d.ts +2 -2
- 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/day-summary.d.ts +1 -1
- package/dist/delinearize.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-retrieval.d.ts +2 -2
- package/dist/entity-retrieval.js +15 -13
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +5 -5
- package/dist/extraction-faithfulness.d.ts +1 -1
- package/dist/extraction-faithfulness.js +3 -3
- 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-judge.js +3 -3
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +3 -3
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/fallback-llm.js +2 -2
- package/dist/{forget-KHF7A44H.js → forget-CQCLB5LB.js} +2 -2
- 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-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/identity-continuity.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +19 -0
- package/dist/in-flight-reads.js +16 -0
- package/dist/in-flight-reads.js.map +1 -0
- package/dist/index.d.ts +13 -13
- package/dist/index.js +116 -114
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/index.js +13 -13
- 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/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +15 -13
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +15 -13
- package/dist/maintenance/rebuild-memory-projection.js +16 -14
- package/dist/mcp-memory-inspector-app.d.ts +6 -6
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +24 -13
- package/dist/memory-cache.js +3 -1
- package/dist/memory-corpus-version.d.ts +19 -0
- package/dist/memory-corpus-version.js +13 -0
- package/dist/memory-corpus-version.js.map +1 -0
- 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-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 +22 -20
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/search.js +7 -7
- package/dist/namespaces/storage.d.ts +3 -3
- package/dist/namespaces/storage.js +15 -13
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +2 -2
- package/dist/operator-toolkit.js +27 -25
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +2 -2
- package/dist/orchestration/maintenance.js +17 -15
- package/dist/{orchestrator-37Cx7yyw.d.ts → orchestrator-D83AvrPf.d.ts} +4 -4
- package/dist/orchestrator.d.ts +5 -5
- package/dist/orchestrator.js +92 -90
- package/dist/page-versioning.js +5 -1
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-C6onljHc.d.ts → pipeline-BSqGpYl1.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/provenance.d.ts +1 -1
- package/dist/{qmd-J08G7MEm.d.ts → qmd-CutnpRVe.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 +2 -2
- 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-planner-llm.d.ts +1 -1
- package/dist/recall-planner-llm.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/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/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +2 -2
- package/dist/retrieval-agents.d.ts +2 -2
- package/dist/retrieval-agents.js +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/schemas.d.ts +52 -52
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/factory.js +6 -6
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.js +12 -12
- 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-BFtoVosl.d.ts → semantic-consolidation-btIVRC4l.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +16 -14
- package/dist/semantic-rule-promotion.js +15 -13
- package/dist/semantic-rule-verifier.d.ts +5 -1
- package/dist/semantic-rule-verifier.js +15 -13
- 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/{storage-CXjwBr69.d.ts → storage-BVv_Mqa0.d.ts} +133 -3
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +14 -12
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +3 -3
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-index-compat.d.ts +1 -0
- package/dist/temporal-index-compat.js +16 -0
- package/dist/temporal-index-compat.js.map +1 -0
- package/dist/temporal-index.d.ts +58 -7
- package/dist/temporal-index.js +23 -3
- 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-import.js +6 -2
- package/dist/transfer/import-sqlite.js +2 -2
- package/dist/transfer/types.d.ts +66 -66
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-DpxqC8dI.d.ts → types-Cmkz7csa.d.ts} +27 -0
- 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.d.ts +4 -0
- package/dist/verified-recall.js +15 -13
- package/package.json +12 -2
- package/src/binary-lifecycle/pipeline.ts +22 -0
- package/src/cli.ts +8 -0
- package/src/compounding/engine.ts +9 -1
- package/src/config.ts +14 -0
- package/src/consolidation-undo.ts +8 -0
- package/src/curation/index.ts +9 -0
- package/src/in-flight-reads.ts +63 -0
- package/src/maintenance/memory-governance.ts +6 -0
- package/src/memory-cache-hot.test.ts +131 -0
- package/src/memory-cache.ts +146 -22
- package/src/memory-corpus-version.ts +45 -0
- package/src/namespaces/storage.ts +20 -1
- package/src/operator-toolkit.ts +7 -1
- package/src/orchestration/consolidation-run.ts +5 -5
- package/src/orchestration/contradiction-linking-coordinator.ts +2 -2
- package/src/orchestration/lifecycle-policy-coordinator.ts +2 -2
- package/src/orchestration/persistence-index.ts +6 -6
- package/src/orchestration/recall-internal.ts +6 -3
- package/src/orchestration/recall-search-pipeline.ts +36 -21
- package/src/orchestration/semantic-consolidation-coordinator.ts +2 -2
- package/src/orchestrator.ts +25 -5
- package/src/page-versioning.ts +14 -1
- package/src/provenance-frontmatter.test.ts +6 -0
- package/src/review/index.ts +16 -8
- package/src/semantic-rule-promotion.ts +9 -1
- package/src/semantic-rule-verifier.ts +19 -6
- package/src/spaces/index.ts +10 -0
- package/src/storage/memory-read-store.ts +9 -2
- package/src/storage-contract/cache-coherence.test.ts +242 -0
- package/src/storage-contract/namespace-routing.test.ts +26 -1
- package/src/storage.ts +513 -31
- package/src/temporal-index-compat.ts +311 -0
- package/src/temporal-index.test.ts +273 -22
- package/src/temporal-index.ts +427 -178
- package/src/transfer/capsule-cache-coherence.test.ts +107 -0
- package/src/transfer/capsule-import.ts +8 -0
- package/src/transfer/capsule-merge.ts +7 -0
- package/src/types.ts +27 -0
- package/src/verified-recall.ts +20 -6
- package/dist/capsule-merge-GK5E647P.js.map +0 -1
- package/dist/chunk-74MJH7I3.js.map +0 -1
- package/dist/chunk-AD2KK5MT.js.map +0 -1
- package/dist/chunk-AWJ2FHCF.js.map +0 -1
- package/dist/chunk-EJCVMPIM.js.map +0 -1
- package/dist/chunk-GL3SMLMZ.js.map +0 -1
- package/dist/chunk-HHAA35A3.js.map +0 -1
- package/dist/chunk-JO5AT6QT.js.map +0 -1
- package/dist/chunk-KTOH7EJE.js.map +0 -1
- package/dist/chunk-M5QKGHCR.js.map +0 -1
- package/dist/chunk-Q6JPMCPO.js.map +0 -1
- package/dist/chunk-R2SJDIPO.js.map +0 -1
- package/dist/chunk-TVRPRFUB.js.map +0 -1
- package/dist/chunk-UVIQHSS7.js.map +0 -1
- package/dist/chunk-VF4XKTX3.js.map +0 -1
- package/dist/chunk-ZUFJ7ZTR.js.map +0 -1
- /package/dist/{auto-sync-676N6N6Y.js.map → auto-sync-AAMTVZMK.js.map} +0 -0
- /package/dist/{chunk-CNWC274T.js.map → chunk-3OQ4IZJN.js.map} +0 -0
- /package/dist/{chunk-7XH7VJN4.js.map → chunk-5S7Z5SHA.js.map} +0 -0
- /package/dist/{chunk-WKE4VXSZ.js.map → chunk-673NPXE3.js.map} +0 -0
- /package/dist/{chunk-UHGHTOR5.js.map → chunk-7EX4YOKH.js.map} +0 -0
- /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
- /package/dist/{chunk-3F4N4WDH.js.map → chunk-AHLPZ2SF.js.map} +0 -0
- /package/dist/{chunk-6C35R7P4.js.map → chunk-DJCKXI4M.js.map} +0 -0
- /package/dist/{chunk-FYKIEOG6.js.map → chunk-FNJX2O6G.js.map} +0 -0
- /package/dist/{chunk-DQPPRXFO.js.map → chunk-HQ7QZJM5.js.map} +0 -0
- /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
- /package/dist/{chunk-KIPLG7S7.js.map → chunk-JKLJ6A7W.js.map} +0 -0
- /package/dist/{chunk-O3BZ6PFY.js.map → chunk-JZM5QUTE.js.map} +0 -0
- /package/dist/{chunk-SYNYI4ZM.js.map → chunk-L5HJQC36.js.map} +0 -0
- /package/dist/{chunk-VXMWDXIJ.js.map → chunk-LC7OODWZ.js.map} +0 -0
- /package/dist/{chunk-ZW6OKHVX.js.map → chunk-LQKITFGB.js.map} +0 -0
- /package/dist/{chunk-TZJVTH3F.js.map → chunk-MXRMNKSY.js.map} +0 -0
- /package/dist/{chunk-PKGWJFNR.js.map → chunk-OVMS3DCB.js.map} +0 -0
- /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
- /package/dist/{chunk-NMMKRVUF.js.map → chunk-QVALQE4P.js.map} +0 -0
- /package/dist/{chunk-FXGC5UUH.js.map → chunk-RT7IP3D3.js.map} +0 -0
- /package/dist/{chunk-AH3M6F4X.js.map → chunk-SBFDL2EQ.js.map} +0 -0
- /package/dist/{chunk-UYZUJ4EB.js.map → chunk-SECMZACR.js.map} +0 -0
- /package/dist/{chunk-HXDKC3BI.js.map → chunk-TGBJ2OMK.js.map} +0 -0
- /package/dist/{chunk-DE6ENYLG.js.map → chunk-TXLGHDHS.js.map} +0 -0
- /package/dist/{chunk-CRFTLUWT.js.map → chunk-UTDA43TB.js.map} +0 -0
- /package/dist/{chunk-GKCCHHZK.js.map → chunk-UXKMMNJD.js.map} +0 -0
- /package/dist/{chunk-57INMZ6F.js.map → chunk-UZRIKUFS.js.map} +0 -0
- /package/dist/{chunk-2FSHROYK.js.map → chunk-V53GJUSL.js.map} +0 -0
- /package/dist/{chunk-LKT755LP.js.map → chunk-VA4WSW54.js.map} +0 -0
- /package/dist/{chunk-ZHKD4EZM.js.map → chunk-VCEH5UYS.js.map} +0 -0
- /package/dist/{chunk-CHVU4RE5.js.map → chunk-VDLMAJXS.js.map} +0 -0
- /package/dist/{chunk-XFTPUXCE.js.map → chunk-VRAD2FGO.js.map} +0 -0
- /package/dist/{chunk-T7VNN3ZM.js.map → chunk-XVLEGMJI.js.map} +0 -0
- /package/dist/{chunk-QDCJNRKK.js.map → chunk-YXOAQAH2.js.map} +0 -0
- /package/dist/{forget-KHF7A44H.js.map → forget-CQCLB5LB.js.map} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
|
+
import * as fs from "node:fs";
|
|
3
4
|
import { mkdir, mkdtemp, readFile, rm, symlink, utimes, writeFile } from "node:fs/promises";
|
|
4
5
|
import { tmpdir } from "node:os";
|
|
5
6
|
import { join } from "node:path";
|
|
@@ -7,23 +8,91 @@ import test from "node:test";
|
|
|
7
8
|
import { setTimeout as delay } from "node:timers/promises";
|
|
8
9
|
|
|
9
10
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
clearIndexes,
|
|
12
|
+
deindexMemory as deindexMemorySync,
|
|
13
|
+
deindexMemoryAsync as deindexMemory,
|
|
14
|
+
indexMemoriesBatch,
|
|
15
|
+
indexMemory as indexMemorySync,
|
|
16
|
+
indexMemoryAsync as indexMemory,
|
|
17
|
+
indexesExist as indexesExistSync,
|
|
18
|
+
indexesExistAsync as indexesExist,
|
|
13
19
|
queryByDateRangeAsync,
|
|
14
20
|
queryByTagsAsync,
|
|
15
21
|
queryTemporalTimelineAsync,
|
|
16
22
|
resolvePromptTagPrefilterAsync,
|
|
23
|
+
setIndexReadObserverForTest,
|
|
17
24
|
} from "./temporal-index.js";
|
|
18
25
|
|
|
26
|
+
test("legacy temporal-index exports preserve synchronous return timing and booleans", async () => {
|
|
27
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-sync-compat-"));
|
|
28
|
+
const firstPath = "/tmp/remnic-temporal-sync-first.md";
|
|
29
|
+
const secondPath = "/tmp/remnic-temporal-sync-second.md";
|
|
30
|
+
|
|
31
|
+
const initiallyExists = indexesExistSync(memoryDir);
|
|
32
|
+
assert.equal(typeof initiallyExists, "boolean");
|
|
33
|
+
assert.equal(initiallyExists, false);
|
|
34
|
+
|
|
35
|
+
assert.equal(
|
|
36
|
+
indexMemorySync(memoryDir, firstPath, "2026-03-09T12:00:00.000Z", ["sync"]),
|
|
37
|
+
undefined,
|
|
38
|
+
);
|
|
39
|
+
const afterIndex = JSON.parse(
|
|
40
|
+
fs.readFileSync(join(memoryDir, "state", "index_time.json"), "utf8"),
|
|
41
|
+
);
|
|
42
|
+
assert.deepEqual(afterIndex.dates["2026-03-09"], [firstPath]);
|
|
43
|
+
assert.equal(indexesExistSync(memoryDir), true);
|
|
44
|
+
|
|
45
|
+
indexMemoriesBatch(memoryDir, [
|
|
46
|
+
{
|
|
47
|
+
path: secondPath,
|
|
48
|
+
createdAt: "2026-03-10T12:00:00.000Z",
|
|
49
|
+
tags: ["sync"],
|
|
50
|
+
},
|
|
51
|
+
]);
|
|
52
|
+
const afterBatch = JSON.parse(
|
|
53
|
+
fs.readFileSync(join(memoryDir, "state", "index_time.json"), "utf8"),
|
|
54
|
+
);
|
|
55
|
+
assert.deepEqual(afterBatch.dates["2026-03-10"], [secondPath]);
|
|
56
|
+
|
|
57
|
+
deindexMemorySync(memoryDir, firstPath, "2026-03-09T12:00:00.000Z", ["sync"]);
|
|
58
|
+
const afterDeindex = JSON.parse(
|
|
59
|
+
fs.readFileSync(join(memoryDir, "state", "index_time.json"), "utf8"),
|
|
60
|
+
);
|
|
61
|
+
assert.equal(afterDeindex.dates["2026-03-09"], undefined);
|
|
62
|
+
|
|
63
|
+
clearIndexes(memoryDir);
|
|
64
|
+
const afterClear = JSON.parse(
|
|
65
|
+
fs.readFileSync(join(memoryDir, "state", "index_time.json"), "utf8"),
|
|
66
|
+
);
|
|
67
|
+
assert.deepEqual(afterClear, { version: 2, dates: {}, events: {} });
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("explicit async mutation exports return promises and complete when awaited", async () => {
|
|
71
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-async-surface-"));
|
|
72
|
+
const memoryPath = "/tmp/remnic-temporal-async.md";
|
|
73
|
+
const pending = indexMemory(
|
|
74
|
+
memoryDir,
|
|
75
|
+
memoryPath,
|
|
76
|
+
"2026-03-09T12:00:00.000Z",
|
|
77
|
+
["async"],
|
|
78
|
+
);
|
|
79
|
+
assert.ok(pending instanceof Promise);
|
|
80
|
+
await pending;
|
|
81
|
+
assert.deepEqual(
|
|
82
|
+
await queryByTagsAsync(memoryDir, ["async"]),
|
|
83
|
+
new Set([memoryPath]),
|
|
84
|
+
);
|
|
85
|
+
assert.equal(await indexesExist(memoryDir), true);
|
|
86
|
+
});
|
|
87
|
+
|
|
19
88
|
async function runIndexWorker(moduleUrl: string, memoryDir: string, workerId: number, count: number): Promise<void> {
|
|
20
89
|
const workerSource = `
|
|
21
|
-
const { indexMemory } = await import(process.argv[1]);
|
|
90
|
+
const { indexMemoryAsync: indexMemory } = await import(process.argv[1]);
|
|
22
91
|
const memoryDir = process.argv[2];
|
|
23
92
|
const workerId = Number(process.argv[3]);
|
|
24
93
|
const count = Number(process.argv[4]);
|
|
25
94
|
for (let i = 0; i < count; i += 1) {
|
|
26
|
-
indexMemory(
|
|
95
|
+
await indexMemory(
|
|
27
96
|
memoryDir,
|
|
28
97
|
\`/tmp/remnic-temporal-worker-\${workerId}-memory-\${i}.md\`,
|
|
29
98
|
"2026-03-09T12:00:00.000Z",
|
|
@@ -87,6 +156,176 @@ test("temporal index concurrent writers retain every date and tag path", async (
|
|
|
87
156
|
assert.equal(tagIndex.tags["concurrency/shared"].paths.length, expectedPaths.size);
|
|
88
157
|
});
|
|
89
158
|
|
|
159
|
+
test("temporal index in-process promise concurrency retains every path", async () => {
|
|
160
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-in-process-"));
|
|
161
|
+
const expectedPaths = Array.from(
|
|
162
|
+
{ length: 40 },
|
|
163
|
+
(_, index) => `/tmp/remnic-temporal-in-process-${index}.md`,
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
await Promise.all(
|
|
167
|
+
expectedPaths.map((memoryPath) =>
|
|
168
|
+
indexMemory(
|
|
169
|
+
memoryDir,
|
|
170
|
+
memoryPath,
|
|
171
|
+
"2026-03-12T12:00:00.000Z",
|
|
172
|
+
["concurrency/in-process"],
|
|
173
|
+
),
|
|
174
|
+
),
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
assert.deepEqual(
|
|
178
|
+
await queryByDateRangeAsync(memoryDir, "2026-03-12", "2026-03-13"),
|
|
179
|
+
new Set(expectedPaths),
|
|
180
|
+
);
|
|
181
|
+
assert.deepEqual(
|
|
182
|
+
await queryByTagsAsync(memoryDir, ["concurrency/in-process"]),
|
|
183
|
+
new Set(expectedPaths),
|
|
184
|
+
);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("parsed cache detects a cross-process atomic replacement", async () => {
|
|
188
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-cache-replace-"));
|
|
189
|
+
const moduleUrl = new URL("./temporal-index.ts", import.meta.url).href;
|
|
190
|
+
const initialPath = "/tmp/remnic-temporal-cache-initial.md";
|
|
191
|
+
await indexMemory(
|
|
192
|
+
memoryDir,
|
|
193
|
+
initialPath,
|
|
194
|
+
"2026-03-09T12:00:00.000Z",
|
|
195
|
+
["concurrency/shared"],
|
|
196
|
+
);
|
|
197
|
+
assert.deepEqual(
|
|
198
|
+
await queryByTagsAsync(memoryDir, ["concurrency/shared"]),
|
|
199
|
+
new Set([initialPath]),
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
await runIndexWorker(moduleUrl, memoryDir, 777, 1);
|
|
203
|
+
|
|
204
|
+
assert.deepEqual(
|
|
205
|
+
await queryByTagsAsync(memoryDir, ["concurrency/shared"]),
|
|
206
|
+
new Set([initialPath, "/tmp/remnic-temporal-worker-777-memory-0.md"]),
|
|
207
|
+
);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test("unchanged index identity skips file reads while retaining the stat freshness check", async () => {
|
|
211
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-cache-hit-"));
|
|
212
|
+
const statePath = join(memoryDir, "state");
|
|
213
|
+
const tagPath = join(statePath, "index_tags.json");
|
|
214
|
+
await mkdir(statePath, { recursive: true });
|
|
215
|
+
await writeFile(
|
|
216
|
+
tagPath,
|
|
217
|
+
JSON.stringify({ version: 2, tags: { alpha: ["/tmp/alpha.md"] }, aliases: {} }),
|
|
218
|
+
"utf8",
|
|
219
|
+
);
|
|
220
|
+
let reads = 0;
|
|
221
|
+
setIndexReadObserverForTest(() => {
|
|
222
|
+
reads += 1;
|
|
223
|
+
});
|
|
224
|
+
try {
|
|
225
|
+
assert.deepEqual(await queryByTagsAsync(memoryDir, ["alpha"]), new Set(["/tmp/alpha.md"]));
|
|
226
|
+
assert.deepEqual(await queryByTagsAsync(memoryDir, ["alpha"]), new Set(["/tmp/alpha.md"]));
|
|
227
|
+
assert.equal(reads, 1);
|
|
228
|
+
|
|
229
|
+
await writeFile(
|
|
230
|
+
tagPath,
|
|
231
|
+
JSON.stringify({ version: 2, tags: { beta: ["/tmp/beta.md"] }, aliases: {} }),
|
|
232
|
+
"utf8",
|
|
233
|
+
);
|
|
234
|
+
assert.deepEqual(await queryByTagsAsync(memoryDir, ["beta"]), new Set(["/tmp/beta.md"]));
|
|
235
|
+
assert.equal(reads, 2);
|
|
236
|
+
} finally {
|
|
237
|
+
setIndexReadObserverForTest();
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("failed atomic commit never publishes a mutated temporal cache", async () => {
|
|
242
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-failed-commit-"));
|
|
243
|
+
const originalPath = "/tmp/remnic-temporal-committed.md";
|
|
244
|
+
const rejectedPath = "/tmp/remnic-temporal-rejected.md";
|
|
245
|
+
await indexMemory(memoryDir, originalPath, "2026-03-09T12:00:00.000Z", ["committed"]);
|
|
246
|
+
|
|
247
|
+
const originalRename = fs.promises.rename;
|
|
248
|
+
fs.promises.rename = (async (oldPath, newPath) => {
|
|
249
|
+
if (String(newPath).endsWith("index_time.json")) {
|
|
250
|
+
const error = new Error("injected temporal rename failure") as NodeJS.ErrnoException;
|
|
251
|
+
error.code = "EIO";
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
254
|
+
return originalRename(oldPath, newPath);
|
|
255
|
+
}) as typeof originalRename;
|
|
256
|
+
try {
|
|
257
|
+
await indexMemory(memoryDir, rejectedPath, "2026-03-10T12:00:00.000Z", ["rejected"]);
|
|
258
|
+
} finally {
|
|
259
|
+
fs.promises.rename = originalRename;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
assert.deepEqual(
|
|
263
|
+
await queryByDateRangeAsync(memoryDir, "2026-03-09", "2026-03-11"),
|
|
264
|
+
new Set([originalPath]),
|
|
265
|
+
);
|
|
266
|
+
// The tag half is NOT committed when the temporal write fails (issue #1911,
|
|
267
|
+
// Cursor Medium): committing tags while temporal stays unchanged leaves a
|
|
268
|
+
// durable mismatch. Both halves stay at their prior state, so "rejected" has
|
|
269
|
+
// no tag membership until a later successful (both-halves) index.
|
|
270
|
+
assert.deepEqual(
|
|
271
|
+
await queryByTagsAsync(memoryDir, ["rejected"]),
|
|
272
|
+
new Set<string>(),
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
await indexMemory(memoryDir, rejectedPath, "2026-03-10T12:00:00.000Z", ["rejected"]);
|
|
276
|
+
assert.deepEqual(
|
|
277
|
+
await queryByDateRangeAsync(memoryDir, "2026-03-09", "2026-03-11"),
|
|
278
|
+
new Set([originalPath, rejectedPath]),
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
test("date queries preserve missing, invalid, and valid-empty distinctions", async () => {
|
|
283
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-load-states-"));
|
|
284
|
+
const statePath = join(memoryDir, "state");
|
|
285
|
+
const temporalPath = join(statePath, "index_time.json");
|
|
286
|
+
await mkdir(statePath, { recursive: true });
|
|
287
|
+
|
|
288
|
+
assert.equal(await queryByDateRangeAsync(memoryDir, "2026-03-09", "2026-03-10"), null);
|
|
289
|
+
|
|
290
|
+
await writeFile(temporalPath, "{ invalid json", "utf8");
|
|
291
|
+
assert.deepEqual(
|
|
292
|
+
await queryByDateRangeAsync(memoryDir, "2026-03-09", "2026-03-10"),
|
|
293
|
+
new Set(),
|
|
294
|
+
);
|
|
295
|
+
assert.equal(await queryTemporalTimelineAsync(memoryDir), null);
|
|
296
|
+
|
|
297
|
+
await writeFile(
|
|
298
|
+
temporalPath,
|
|
299
|
+
JSON.stringify({ version: 2, dates: {}, events: {} }),
|
|
300
|
+
"utf8",
|
|
301
|
+
);
|
|
302
|
+
await writeFile(
|
|
303
|
+
join(statePath, "index_tags.json"),
|
|
304
|
+
JSON.stringify({ version: 2, tags: {}, aliases: {} }),
|
|
305
|
+
"utf8",
|
|
306
|
+
);
|
|
307
|
+
assert.deepEqual(
|
|
308
|
+
await queryByDateRangeAsync(memoryDir, "2026-03-09", "2026-03-10"),
|
|
309
|
+
new Set(),
|
|
310
|
+
);
|
|
311
|
+
assert.equal(await indexesExist(memoryDir), true);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
test("index writers persist compact machine-only JSON", async () => {
|
|
315
|
+
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-compact-"));
|
|
316
|
+
await indexMemory(
|
|
317
|
+
memoryDir,
|
|
318
|
+
"/tmp/remnic-temporal-compact.md",
|
|
319
|
+
"2026-03-09T12:00:00.000Z",
|
|
320
|
+
["compact"],
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
for (const filename of ["index_time.json", "index_tags.json"]) {
|
|
324
|
+
const raw = await readFile(join(memoryDir, "state", filename), "utf8");
|
|
325
|
+
assert.equal(raw, JSON.stringify(JSON.parse(raw)));
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
|
|
90
329
|
test("temporal index writers wait for old locks owned by live processes", async () => {
|
|
91
330
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-live-lock-"));
|
|
92
331
|
const stateDir = join(memoryDir, "state");
|
|
@@ -98,8 +337,8 @@ test("temporal index writers wait for old locks owned by live processes", async
|
|
|
98
337
|
await utimes(lockDir, oldLockTime, oldLockTime);
|
|
99
338
|
|
|
100
339
|
const workerSource = `
|
|
101
|
-
const { indexMemory } = await import(process.argv[1]);
|
|
102
|
-
indexMemory(
|
|
340
|
+
const { indexMemoryAsync: indexMemory } = await import(process.argv[1]);
|
|
341
|
+
await indexMemory(
|
|
103
342
|
process.argv[2],
|
|
104
343
|
"/tmp/remnic-temporal-live-lock-memory.md",
|
|
105
344
|
"2026-03-10T12:00:00.000Z",
|
|
@@ -195,16 +434,20 @@ test("temporal index writers fail open on symlink lock blockers", async () => {
|
|
|
195
434
|
const dateMatches = await queryByDateRangeAsync(memoryDir, "2026-03-09", "2026-03-10");
|
|
196
435
|
const tagMatches = await queryByTagsAsync(memoryDir, ["concurrency/shared"]);
|
|
197
436
|
assert.equal(dateMatches, null);
|
|
198
|
-
|
|
437
|
+
// Both halves fail open together (issue #1911, Cursor Medium): the symlinked
|
|
438
|
+
// temporal lock blocks the temporal write, so the tag half is also skipped
|
|
439
|
+
// (no durable mismatch). The tag index is never created → query returns null.
|
|
440
|
+
assert.equal(tagMatches, null);
|
|
199
441
|
});
|
|
200
442
|
|
|
201
443
|
test("tag queries distinguish missing index from valid no-match results", async () => {
|
|
202
444
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-tag-miss-"));
|
|
203
445
|
|
|
446
|
+
assert.equal(await queryByTagsAsync(memoryDir, []), null);
|
|
204
447
|
const unavailableMatches = await queryByTagsAsync(memoryDir, ["beta"]);
|
|
205
448
|
assert.equal(unavailableMatches, null);
|
|
206
449
|
|
|
207
|
-
indexMemory(memoryDir, "/tmp/remnic-temporal-alpha-memory.md", "2026-03-11T12:00:00.000Z", ["alpha"]);
|
|
450
|
+
await indexMemory(memoryDir, "/tmp/remnic-temporal-alpha-memory.md", "2026-03-11T12:00:00.000Z", ["alpha"]);
|
|
208
451
|
|
|
209
452
|
const matchingPaths = await queryByTagsAsync(memoryDir, ["alpha"]);
|
|
210
453
|
assert.deepEqual(matchingPaths, new Set(["/tmp/remnic-temporal-alpha-memory.md"]));
|
|
@@ -226,8 +469,8 @@ test("indexMemory replaces stale date and tag memberships for an existing path",
|
|
|
226
469
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-index-update-"));
|
|
227
470
|
const memoryPath = "/tmp/remnic-temporal-updated-memory.md";
|
|
228
471
|
|
|
229
|
-
indexMemory(memoryDir, memoryPath, "2026-01-01T00:00:00.000Z", ["alpha"]);
|
|
230
|
-
indexMemory(memoryDir, memoryPath, "2026-02-01T00:00:00.000Z", ["beta"]);
|
|
472
|
+
await indexMemory(memoryDir, memoryPath, "2026-01-01T00:00:00.000Z", ["alpha"]);
|
|
473
|
+
await indexMemory(memoryDir, memoryPath, "2026-02-01T00:00:00.000Z", ["beta"]);
|
|
231
474
|
|
|
232
475
|
const januaryMatches = await queryByDateRangeAsync(memoryDir, "2026-01-01", "2026-01-02");
|
|
233
476
|
const februaryMatches = await queryByDateRangeAsync(memoryDir, "2026-02-01", "2026-02-02");
|
|
@@ -242,12 +485,12 @@ test("indexMemory replaces stale date and tag memberships for an existing path",
|
|
|
242
485
|
|
|
243
486
|
test("temporal timeline orders event time across sessions, not ingest order", async () => {
|
|
244
487
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-timeline-order-"));
|
|
245
|
-
indexMemory(memoryDir, "/tmp/rome.md", "2026-07-02T00:00:00.000Z", [], {
|
|
488
|
+
await indexMemory(memoryDir, "/tmp/rome.md", "2026-07-02T00:00:00.000Z", [], {
|
|
246
489
|
validAt: "2026-05-10T00:00:00.000Z",
|
|
247
490
|
observedAt: "2026-07-02T00:00:00.000Z",
|
|
248
491
|
sessionKey: "session-b",
|
|
249
492
|
});
|
|
250
|
-
indexMemory(memoryDir, "/tmp/paris.md", "2026-07-03T00:00:00.000Z", [], {
|
|
493
|
+
await indexMemory(memoryDir, "/tmp/paris.md", "2026-07-03T00:00:00.000Z", [], {
|
|
251
494
|
validAt: "2026-03-04T00:00:00.000Z",
|
|
252
495
|
observedAt: "2026-07-03T00:00:00.000Z",
|
|
253
496
|
sessionKey: "session-a",
|
|
@@ -266,9 +509,9 @@ test("temporal timeline orders event time across sessions, not ingest order", as
|
|
|
266
509
|
test("temporal timeline uses stable observation/path ordering for event-time ties", async () => {
|
|
267
510
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-timeline-tie-"));
|
|
268
511
|
const eventAt = "2026-03-04T00:00:00.000Z";
|
|
269
|
-
indexMemory(memoryDir, "/tmp/z.md", eventAt, [], { validAt: eventAt, observedAt: "2026-07-03T00:00:00.000Z" });
|
|
270
|
-
indexMemory(memoryDir, "/tmp/a.md", eventAt, [], { validAt: eventAt, observedAt: "2026-07-02T00:00:00.000Z" });
|
|
271
|
-
indexMemory(memoryDir, "/tmp/b.md", eventAt, [], { validAt: eventAt, observedAt: "2026-07-02T00:00:00.000Z" });
|
|
512
|
+
await indexMemory(memoryDir, "/tmp/z.md", eventAt, [], { validAt: eventAt, observedAt: "2026-07-03T00:00:00.000Z" });
|
|
513
|
+
await indexMemory(memoryDir, "/tmp/a.md", eventAt, [], { validAt: eventAt, observedAt: "2026-07-02T00:00:00.000Z" });
|
|
514
|
+
await indexMemory(memoryDir, "/tmp/b.md", eventAt, [], { validAt: eventAt, observedAt: "2026-07-02T00:00:00.000Z" });
|
|
272
515
|
|
|
273
516
|
const first = await queryTemporalTimelineAsync(memoryDir);
|
|
274
517
|
const second = await queryTemporalTimelineAsync(memoryDir);
|
|
@@ -290,7 +533,11 @@ test("old or malformed temporal index shape is unavailable and requests rebuild"
|
|
|
290
533
|
"utf8",
|
|
291
534
|
);
|
|
292
535
|
|
|
293
|
-
assert.
|
|
536
|
+
assert.deepEqual(
|
|
537
|
+
await queryByDateRangeAsync(memoryDir, "2026-01-01", "2026-01-02"),
|
|
538
|
+
new Set(),
|
|
539
|
+
);
|
|
540
|
+
assert.equal(await indexesExist(memoryDir), false);
|
|
294
541
|
assert.equal(await queryTemporalTimelineAsync(memoryDir), null);
|
|
295
542
|
|
|
296
543
|
await writeFile(
|
|
@@ -298,7 +545,11 @@ test("old or malformed temporal index shape is unavailable and requests rebuild"
|
|
|
298
545
|
JSON.stringify({ version: 1, dates: {} }),
|
|
299
546
|
"utf8",
|
|
300
547
|
);
|
|
301
|
-
assert.
|
|
548
|
+
assert.deepEqual(
|
|
549
|
+
await queryByDateRangeAsync(memoryDir, "2026-01-01", "2026-01-02"),
|
|
550
|
+
new Set(),
|
|
551
|
+
);
|
|
552
|
+
assert.equal(await indexesExist(memoryDir), false);
|
|
302
553
|
assert.equal(await queryTemporalTimelineAsync(memoryDir), null);
|
|
303
554
|
});
|
|
304
555
|
|
|
@@ -306,8 +557,8 @@ test("deindex removes timeline rows so stale events cannot be recalled", async (
|
|
|
306
557
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-timeline-delete-"));
|
|
307
558
|
const memoryPath = "/tmp/deleted.md";
|
|
308
559
|
const createdAt = "2026-03-04T00:00:00.000Z";
|
|
309
|
-
indexMemory(memoryDir, memoryPath, createdAt, ["trip"], { sessionKey: "session-a" });
|
|
310
|
-
deindexMemory(memoryDir, memoryPath, createdAt, ["trip"]);
|
|
560
|
+
await indexMemory(memoryDir, memoryPath, createdAt, ["trip"], { sessionKey: "session-a" });
|
|
561
|
+
await deindexMemory(memoryDir, memoryPath, createdAt, ["trip"]);
|
|
311
562
|
assert.deepEqual(await queryTemporalTimelineAsync(memoryDir), []);
|
|
312
563
|
});
|
|
313
564
|
|
|
@@ -315,7 +566,7 @@ test("large temporal indexes return a bounded relevant oversample before memory
|
|
|
315
566
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-timeline-bounded-"));
|
|
316
567
|
for (let i = 0; i < 600; i += 1) {
|
|
317
568
|
const day = String((i % 28) + 1).padStart(2, "0");
|
|
318
|
-
indexMemory(
|
|
569
|
+
await indexMemory(
|
|
319
570
|
memoryDir,
|
|
320
571
|
`/tmp/event-${String(i).padStart(4, "0")}.md`,
|
|
321
572
|
`2026-03-${day}T00:00:00.000Z`,
|
|
@@ -348,7 +599,7 @@ test("temporal timeline generic edge selection honors small and zero limits", as
|
|
|
348
599
|
const memoryDir = await mkdtemp(join(tmpdir(), "remnic-temporal-timeline-small-limit-"));
|
|
349
600
|
for (let day = 1; day <= 4; day += 1) {
|
|
350
601
|
const timestamp = `2026-04-0${day}T00:00:00.000Z`;
|
|
351
|
-
indexMemory(memoryDir, `/tmp/edge-${day}.md`, timestamp, [], {
|
|
602
|
+
await indexMemory(memoryDir, `/tmp/edge-${day}.md`, timestamp, [], {
|
|
352
603
|
validAt: timestamp,
|
|
353
604
|
searchText: `unrelated event ${day}`,
|
|
354
605
|
});
|