@remnic/core 9.69.46 → 9.69.47
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 +15 -14
- package/dist/access-admin-ops-surface.js +42 -41
- package/dist/access-authorization-probe.d.ts +15 -14
- package/dist/access-authorization-probe.js +43 -42
- package/dist/access-boundary.d.ts +15 -14
- package/dist/access-boundary.js +42 -41
- package/dist/access-cli.js +119 -114
- 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 +15 -14
- package/dist/access-extraction-force-flush.js +42 -41
- package/dist/access-health-types.d.ts +1 -1
- package/dist/access-http-briefing.d.ts +15 -14
- package/dist/access-http-briefing.js +43 -42
- package/dist/access-http-lcm-compaction.d.ts +15 -14
- package/dist/access-http-lifecycle-flush.d.ts +15 -14
- package/dist/access-http-offline-stream.d.ts +15 -14
- package/dist/access-http-query.d.ts +2 -2
- package/dist/access-http-query.js +44 -43
- package/dist/access-http.d.ts +16 -15
- package/dist/access-http.js +67 -63
- package/dist/access-identity-continuity-surface.d.ts +11 -11
- package/dist/access-identity-continuity-surface.js +42 -41
- package/dist/access-lcm-surface.d.ts +15 -14
- package/dist/access-lcm-surface.js +42 -41
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp-shared-context-tools.d.ts +15 -14
- package/dist/access-mcp.d.ts +15 -14
- package/dist/access-mcp.js +55 -52
- package/dist/access-memory-search-fanout.d.ts +2 -2
- package/dist/{access-namespace-preflight-DDnsN22V.d.ts → access-namespace-preflight-CetF9ziA.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +3 -3
- package/dist/access-namespace-preflight.js +42 -41
- package/dist/access-observe-transcript.d.ts +11 -11
- package/dist/access-observe-write-category.d.ts +3 -3
- package/dist/access-observe-write-category.js +4 -4
- package/dist/access-observe-write-surface.d.ts +15 -14
- package/dist/access-observe-write-surface.js +42 -41
- package/dist/access-offline-manifest.d.ts +11 -11
- package/dist/access-offline-manifest.js +2 -2
- package/dist/access-operations-batch.js +44 -43
- package/dist/access-operations.d.ts +16 -15
- package/dist/access-operations.js +51 -49
- package/dist/access-recall-concurrency.d.ts +15 -14
- package/dist/access-recall-concurrency.js +42 -41
- package/dist/access-recall-response.d.ts +15 -14
- package/dist/access-recall-response.js +42 -41
- package/dist/access-recall-surface.d.ts +15 -14
- package/dist/access-recall-surface.js +42 -41
- package/dist/access-schema.d.ts +1 -1
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-DGynYlbE.d.ts → access-service-BXYrJ3pO.d.ts} +13 -10
- package/dist/access-service-helpers.d.ts +15 -14
- package/dist/access-service.d.ts +15 -14
- package/dist/access-service.js +42 -41
- package/dist/access-surface-catalog.d.ts +15 -14
- package/dist/access-surface-catalog.js +50 -43
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +4 -4
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +3 -2
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +1 -1
- 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/background-generation.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +11 -11
- package/dist/briefing-window.d.ts +2 -2
- package/dist/briefing.d.ts +2 -2
- package/dist/briefing.js +13 -13
- 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 +5 -5
- 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-Dl2hYqpS.d.ts → catalog-Bns9zpl3.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 +14 -14
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/{chunk-D5DTZBTV.js → chunk-2JFSQWFH.js} +6 -6
- package/dist/chunk-2JFSQWFH.js.map +1 -0
- package/dist/{chunk-5EHPB6RL.js → chunk-2QX65IEC.js} +2 -2
- package/dist/{chunk-F5V7KRQS.js → chunk-2WMXZYMS.js} +2 -2
- package/dist/{chunk-ORQ7AZMU.js → chunk-3RKVSECD.js} +8 -8
- package/dist/{chunk-UGGOQKO6.js → chunk-44BILQ7U.js} +93 -51
- package/dist/chunk-44BILQ7U.js.map +1 -0
- package/dist/{chunk-3NYM6JA4.js → chunk-4LPIVP77.js} +2 -2
- package/dist/{chunk-PW4HTWXL.js → chunk-55XWRL6F.js} +2 -2
- package/dist/{chunk-GGY7WKMB.js → chunk-5KBI2MOC.js} +1 -1
- package/dist/{chunk-IXMWTNNY.js → chunk-6A6HSXWV.js} +2 -2
- package/dist/{chunk-4HTQ76O4.js → chunk-7SJCSDQ3.js} +2 -2
- package/dist/{chunk-U4ESGVZ2.js → chunk-7YUX52XZ.js} +3 -3
- package/dist/{chunk-HXDXR2FH.js → chunk-AS4YKT75.js} +40 -30
- package/dist/chunk-AS4YKT75.js.map +1 -0
- package/dist/{chunk-EUP4AXIW.js → chunk-B6VDWDFN.js} +2 -2
- package/dist/{chunk-AN2O4KZY.js → chunk-BMENHAJL.js} +2 -2
- package/dist/{chunk-5ZXGH2ZL.js → chunk-BXOPUJ3W.js} +2 -2
- package/dist/{chunk-TE6B2UU6.js → chunk-CD7VTZIG.js} +2 -2
- package/dist/{chunk-EC5SVM6H.js → chunk-DE4ZGH2N.js} +2 -2
- package/dist/{chunk-YFVIA5A6.js → chunk-DRLZB3CN.js} +2 -2
- package/dist/{chunk-SRRZZHA5.js → chunk-EGOWY342.js} +2 -2
- package/dist/chunk-EIB4FJVR.js +46 -0
- package/dist/chunk-EIB4FJVR.js.map +1 -0
- package/dist/{chunk-W44T2KHG.js → chunk-EWBDJQ5Y.js} +3 -3
- package/dist/{chunk-JMBTNVMW.js → chunk-FGRJJBFO.js} +2 -2
- package/dist/{chunk-F3TURDFG.js → chunk-FPB5LQWW.js} +4 -1
- package/dist/{chunk-F3TURDFG.js.map → chunk-FPB5LQWW.js.map} +1 -1
- package/dist/{chunk-7BNB7KHB.js → chunk-G2SJRFGP.js} +7 -7
- package/dist/{chunk-WGZHSQDV.js → chunk-G2XZFGYN.js} +4 -4
- package/dist/{chunk-CFIHVWYZ.js → chunk-GGROFIYX.js} +2 -2
- package/dist/chunk-GXJSLNYO.js +74 -0
- package/dist/chunk-GXJSLNYO.js.map +1 -0
- package/dist/{chunk-XLZZLUWL.js → chunk-HG74GEVY.js} +2 -2
- package/dist/chunk-HMDYSGY6.js +54 -0
- package/dist/chunk-HMDYSGY6.js.map +1 -0
- package/dist/{chunk-WUUGE7QC.js → chunk-HS75MCQF.js} +4 -4
- package/dist/{chunk-DO6R3LIE.js → chunk-I6IJDTRP.js} +2 -2
- package/dist/{chunk-TZ44E732.js → chunk-IO7K7GES.js} +2 -2
- package/dist/{chunk-AYP2FZFA.js → chunk-JUOJGZPV.js} +2 -2
- package/dist/{chunk-P7S7BVBJ.js → chunk-JXLEQIJ7.js} +2 -2
- package/dist/{chunk-4XTSKGLX.js → chunk-JYXLW22X.js} +3 -3
- package/dist/{chunk-IPLYGWQF.js → chunk-KQAFEZQX.js} +5 -5
- package/dist/chunk-LI4APB6M.js +218 -0
- package/dist/chunk-LI4APB6M.js.map +1 -0
- package/dist/{chunk-VGRVJ6Z6.js → chunk-LIAM7U2J.js} +2 -2
- package/dist/{chunk-S3SND7SO.js → chunk-LIDJWAQV.js} +2 -2
- package/dist/{chunk-T5NI5K46.js → chunk-LYMJ36UI.js} +2 -2
- package/dist/{chunk-KF57IQFX.js → chunk-MMQVWKFY.js} +19 -15
- package/dist/chunk-MMQVWKFY.js.map +1 -0
- package/dist/{chunk-QUFJ3NJE.js → chunk-MNG536IS.js} +20 -20
- package/dist/{chunk-SW42MMAH.js → chunk-MQT3WP3F.js} +2 -2
- package/dist/{chunk-UEJY6ZTQ.js → chunk-NE45P3OF.js} +2 -2
- package/dist/{chunk-N46SNYMC.js → chunk-NMA7RQPR.js} +2 -2
- package/dist/{chunk-47C6DF43.js → chunk-OS4JVTHR.js} +3 -3
- package/dist/{chunk-W6YDAIVB.js → chunk-OSTXIFZW.js} +13 -2
- package/dist/chunk-OSTXIFZW.js.map +1 -0
- package/dist/chunk-P3YNEMYY.js +212 -0
- package/dist/chunk-P3YNEMYY.js.map +1 -0
- package/dist/{chunk-JOP7W24J.js → chunk-PA67GXYJ.js} +8 -8
- package/dist/{chunk-FSH6KRKO.js → chunk-PPJLJD2D.js} +2 -2
- package/dist/{chunk-AG6PANBG.js → chunk-PXJ6HE2W.js} +11 -11
- package/dist/{chunk-DDBLZJRV.js → chunk-QB4VXCFN.js} +2 -2
- package/dist/{chunk-L63M2PE4.js → chunk-QGAKUOKU.js} +2 -2
- package/dist/{chunk-AYZHHMTK.js → chunk-QKFYJVDG.js} +2 -2
- package/dist/{chunk-YUQPUK6H.js → chunk-QLCMOHRE.js} +2 -2
- package/dist/{chunk-Q4AUIFUA.js → chunk-QMWKENNK.js} +4 -4
- package/dist/{chunk-GYYLZOSO.js → chunk-R4JTUTU6.js} +13 -6
- package/dist/chunk-R4JTUTU6.js.map +1 -0
- package/dist/{chunk-66QOUYNS.js → chunk-ROBGBT3D.js} +173 -56
- package/dist/chunk-ROBGBT3D.js.map +1 -0
- package/dist/{chunk-TNQR7N52.js → chunk-S3YM4SZQ.js} +2 -1
- package/dist/chunk-S3YM4SZQ.js.map +1 -0
- package/dist/{chunk-RW4QNB4J.js → chunk-S45INSV3.js} +3 -1
- package/dist/{chunk-RW4QNB4J.js.map → chunk-S45INSV3.js.map} +1 -1
- package/dist/{chunk-FMEP2RB5.js → chunk-SJ7ZNUXB.js} +2 -2
- package/dist/{chunk-EEHQY7ER.js → chunk-SK6HEQTW.js} +2 -2
- package/dist/{chunk-PGAB2V53.js → chunk-SMBWBEE7.js} +2 -2
- package/dist/{chunk-62NYUFNH.js → chunk-SS33RR4F.js} +8 -8
- package/dist/{chunk-4ECS33D4.js → chunk-T3T5HTZZ.js} +2 -2
- package/dist/{chunk-KG2OOAFF.js → chunk-TQSCR5DU.js} +6 -6
- package/dist/{chunk-OV7GJ4KW.js → chunk-V2XNMIAM.js} +2 -2
- package/dist/{chunk-AS2NOPDM.js → chunk-V7IONNTJ.js} +2 -2
- package/dist/{chunk-HYWPUYLO.js → chunk-VV5GCNKG.js} +2 -2
- package/dist/{chunk-Y3XHIWVP.js → chunk-WL3PGPGU.js} +2 -2
- package/dist/{chunk-3UQIS2GC.js → chunk-WNMVUWI7.js} +2 -2
- package/dist/{chunk-66YUOI53.js → chunk-WQW6KPVC.js} +1 -1
- package/dist/chunk-WQW6KPVC.js.map +1 -0
- package/dist/{chunk-2AV75BJW.js → chunk-WVI43D54.js} +24 -1
- package/dist/chunk-WVI43D54.js.map +1 -0
- package/dist/{chunk-WOBMSMUK.js → chunk-WYU66IVZ.js} +3 -3
- package/dist/{chunk-A7GQBJP5.js → chunk-X2NFFBTO.js} +4 -4
- package/dist/{chunk-CWMMKFO7.js → chunk-XEHLYA5Z.js} +3 -3
- package/dist/{chunk-JIWZVOQM.js → chunk-XKHRNAK7.js} +2 -2
- package/dist/{chunk-VW5TGNJN.js → chunk-XXLH6KFO.js} +2 -2
- package/dist/{chunk-J5OXWG66.js → chunk-XZUHXKM3.js} +2 -2
- package/dist/{chunk-K4KE5MYE.js → chunk-Y5VT7BIT.js} +2 -2
- package/dist/{chunk-UOREPQ3C.js → chunk-YOSLKZLZ.js} +2 -2
- package/dist/{chunk-S7KDHFF2.js → chunk-YXWMZAAN.js} +2 -2
- package/dist/{chunk-EAZ3YZKN.js → chunk-ZEIJQ4I3.js} +2 -2
- package/dist/{cli-Cik3H7q1.d.ts → cli-B8YyIrPR.d.ts} +5 -5
- package/dist/cli.d.ts +17 -16
- package/dist/cli.js +89 -84
- package/dist/coding/export-okf-codegraph.d.ts +1 -1
- package/dist/coding/export-okf-codegraph.js +12 -12
- package/dist/coding/pre-action-gate.d.ts +1 -1
- package/dist/compounding/engine.d.ts +2 -2
- package/dist/compounding/engine.js +13 -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 +3 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +13 -13
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +13 -13
- package/dist/consolidation-provenance-check.d.ts +2 -2
- package/dist/consolidation-undo.d.ts +2 -2
- package/dist/contradiction/index.d.ts +4 -4
- package/dist/converge-config.d.ts +1 -1
- package/dist/convergence-refresh.d.ts +2 -2
- package/dist/convergence-refresh.js +15 -15
- 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 +15 -15
- package/dist/cross-lingual-recall.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/deep-recall-http-glue.d.ts +15 -14
- package/dist/deep-recall-http-glue.js +4 -4
- package/dist/deep-recall-mcp-tools.d.ts +15 -14
- package/dist/deep-recall-policy-llm.d.ts +2 -2
- package/dist/deep-recall-seeds.d.ts +1 -1
- package/dist/deep-recall.js +2 -2
- package/dist/delinearize.d.ts +1 -1
- package/dist/dependency-propagation-config.d.ts +1 -1
- package/dist/{dependency-propagation-delivery-BXaUoVUf.d.ts → dependency-propagation-delivery-B-LvcDaq.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 +13 -13
- package/dist/entity-schema.d.ts +1 -1
- package/dist/episodic-context.d.ts +1 -1
- package/dist/eval-trajectory-contracts.d.ts +1 -1
- package/dist/eval-trajectory-store.d.ts +1 -1
- package/dist/eval-trajectory.d.ts +1 -1
- package/dist/explicit-capture.d.ts +11 -11
- package/dist/external-wiki-access.d.ts +15 -14
- package/dist/external-wiki-access.js +43 -42
- 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 +15 -14
- package/dist/extraction-error-classification.d.ts +1 -1
- package/dist/extraction-evidence-class.d.ts +142 -0
- package/dist/extraction-evidence-class.js +113 -0
- package/dist/extraction-evidence-class.js.map +1 -0
- package/dist/extraction-faithfulness.d.ts +2 -2
- package/dist/extraction-judge-telemetry.d.ts +2 -2
- package/dist/extraction-judge-training.d.ts +2 -2
- package/dist/extraction-judge.d.ts +2 -2
- package/dist/extraction-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-source-grounding.js +2 -2
- package/dist/extraction-span-config.d.ts +1 -1
- package/dist/extraction-span-materialize.d.ts +1 -1
- package/dist/extraction-span-wire.d.ts +1 -1
- package/dist/extraction.d.ts +2 -2
- package/dist/extraction.js +21 -21
- package/dist/fallback-llm-codex-subscription.d.ts +1 -1
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/{generic-recall-paths-BkVVEoeO.d.ts → generic-recall-paths-Bfc7zigS.d.ts} +1 -1
- package/dist/graph-append-error.d.ts +1 -1
- package/dist/graph-dashboard-diff.d.ts +1 -1
- package/dist/graph-dashboard-key.d.ts +1 -1
- package/dist/graph-dashboard-parser.d.ts +1 -1
- package/dist/graph-edge-reinforcement.d.ts +1 -1
- package/dist/graph-jsonl.d.ts +1 -1
- package/dist/graph-path-reconstruction.d.ts +1 -1
- package/dist/graph-path-scoring.d.ts +1 -1
- package/dist/graph-snapshot.d.ts +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/importers/index.d.ts +1 -1
- package/dist/importers/test-utils.d.ts +1 -1
- package/dist/in-flight-reads.d.ts +1 -1
- package/dist/{index-Zb6SUV4R.d.ts → index-C7IA1DxB.d.ts} +3 -3
- package/dist/index.d.ts +121 -30
- package/dist/index.js +179 -133
- 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-DdrhmecM.d.ts → local-llm-DH4tWtck.d.ts} +1 -1
- package/dist/local-llm-helpers.d.ts +2 -2
- package/dist/local-llm.d.ts +2 -2
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +1 -1
- package/dist/location/index.d.ts +5 -5
- package/dist/location/index.js +15 -15
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +13 -13
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +13 -13
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
- package/dist/maintenance/rebuild-memory-projection.js +14 -14
- package/dist/{maintenance-Du_VRvVg.d.ts → maintenance-n6yeTQhR.d.ts} +4 -4
- package/dist/mcp-memory-inspector-app.d.ts +15 -14
- package/dist/mcp-read-only-tools.js +1 -1
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-browse-http-glue.d.ts +170 -0
- package/dist/memory-browse-http-glue.js +9 -0
- package/dist/memory-browse-http-glue.js.map +1 -0
- package/dist/memory-browse-mcp-tools.d.ts +160 -0
- package/dist/memory-browse-mcp-tools.js +8 -0
- package/dist/memory-browse-mcp-tools.js.map +1 -0
- package/dist/memory-browse-operations.d.ts +2 -0
- package/dist/memory-browse-operations.js +246 -0
- package/dist/memory-browse-operations.js.map +1 -0
- package/dist/memory-browse.d.ts +113 -0
- package/dist/memory-browse.js +49 -0
- package/dist/memory-browse.js.map +1 -0
- 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 +15 -14
- package/dist/memory-subject.d.ts +15 -14
- package/dist/memory-worth-outcomes.d.ts +2 -2
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +3 -3
- package/dist/namespaces/migrate.js +14 -14
- 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 +13 -13
- 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 +16 -16
- package/dist/operator-doctor-replica.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +3 -3
- package/dist/operator-toolkit.js +23 -22
- package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
- package/dist/orchestration/maintenance.d.ts +4 -4
- package/dist/orchestration/maintenance.js +23 -23
- package/dist/{orchestrator-D9U3Zgjp.d.ts → orchestrator-Cirjo3ZB.d.ts} +10 -10
- package/dist/orchestrator.d.ts +11 -11
- package/dist/orchestrator.js +121 -116
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/{pipeline-4lqKJZ_0.d.ts → pipeline-DK79FrgH.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/proactive-contention.d.ts +2 -2
- package/dist/provenance.d.ts +77 -2
- package/dist/provenance.js +7 -3
- package/dist/{public-http-AabioFLh.d.ts → public-http-VB85y0ZH.d.ts} +1 -1
- package/dist/{qmd-DnoWaXKb.d.ts → qmd-BT0ErlRS.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-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +1 -1
- package/dist/recall-navigate-access.d.ts +1 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +1 -1
- package/dist/recall-navigate-disclosure.js +2 -2
- package/dist/recall-navigate.d.ts +1 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-navigation-http-glue.d.ts +15 -14
- package/dist/recall-navigation-mcp-tools.d.ts +15 -14
- package/dist/recall-navigation-operations.js +43 -42
- package/dist/recall-navigation-renderer.d.ts +1 -1
- package/dist/recall-navigation.d.ts +1 -1
- package/dist/recall-navigation.js +42 -41
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state-view-admission.d.ts +2 -2
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-state-view-anchors.d.ts +1 -1
- package/dist/recall-state.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 +4 -1
- package/dist/reconcile/manifest.js +1 -1
- package/dist/reconcile/plan.d.ts +1 -1
- package/dist/replay/normalizers/chatgpt.d.ts +1 -1
- package/dist/replay/normalizers/claude.d.ts +1 -1
- package/dist/replay/normalizers/openclaw.d.ts +1 -1
- package/dist/replay/normalizers/shared.d.ts +1 -1
- package/dist/replay/runner.d.ts +1 -1
- package/dist/replay/types.d.ts +1 -1
- package/dist/replica-divergence.d.ts +1 -1
- package/dist/replica-peers-config.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +4 -3
- 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/{scope-profiles-crazXegZ.d.ts → scope-profiles-BgPQx9iE.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-B09JI9WM.d.ts → semantic-consolidation-BrAWKVcm.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +14 -14
- package/dist/semantic-rule-promotion.js +13 -13
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +13 -13
- package/dist/{service-ByjbCuj7.d.ts → service-CqHOTg87.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 +17 -17
- package/dist/standing-memory-block.d.ts +77 -0
- package/dist/standing-memory-block.js +40 -0
- package/dist/standing-memory-block.js.map +1 -0
- package/dist/standup/build.js +13 -13
- package/dist/{storage-CbdF077z.d.ts → storage-mD2YQ8_2.d.ts} +1 -1
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +12 -12
- package/dist/subject-config.d.ts +1 -1
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +3 -3
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/support-passport/index.d.ts +18 -17
- package/dist/support-passport/index.js +45 -44
- package/dist/{tagging-CF7DNV7_.d.ts → tagging-CiAVA-ID.d.ts} +2 -2
- package/dist/temporal-supersession.d.ts +2 -2
- package/dist/temporal-timeline-recall.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +2 -2
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/transfer/autodetect.js +1 -1
- package/dist/transfer/backup.js +1 -1
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/export-okf.d.ts +1 -1
- package/dist/transfer/export-okf.js +13 -13
- package/dist/trust-score-stage.d.ts +1 -1
- package/dist/trust-score.d.ts +1 -1
- package/dist/{types-nmhnJpxx.d.ts → types-DgDaoY61.d.ts} +6 -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.js +13 -13
- package/dist/who-knows-cli.d.ts +15 -14
- package/dist/who-knows-cli.js +14 -14
- package/dist/who-knows.d.ts +15 -14
- package/dist/who-knows.js +13 -13
- package/dist/write-envelope.d.ts +1 -1
- package/package.json +2 -2
- package/src/access-boundary.ts +3 -0
- package/src/access-http.ts +2 -2
- package/src/access-mcp-output-schemas.ts +25 -0
- package/src/access-mcp.ts +3 -3
- package/src/access-operations.ts +2 -0
- package/src/access-service.ts +6 -1
- package/src/access-surface-catalog.test.ts +20 -0
- package/src/access-surface-catalog.ts +6 -0
- package/src/activity/timeline/index.ts +1 -0
- package/src/activity/timeline/journal-recap.test.ts +17 -0
- package/src/activity/timeline/journal-recap.ts +19 -6
- package/src/activity/timeline/recap-export-range.test.ts +289 -0
- package/src/activity/timeline/recap-export-range.ts +169 -0
- package/src/activity/timeline/recap-export.test.ts +73 -1
- package/src/activity/timeline/recap-export.ts +57 -4
- package/src/cli/memory-browse-commands.ts +77 -0
- package/src/cli.ts +2 -2
- package/src/config.ts +11 -0
- package/src/extraction-evidence-class.test.ts +355 -0
- package/src/extraction-evidence-class.ts +241 -0
- package/src/index.ts +1 -0
- package/src/mcp-read-only-tools.ts +3 -0
- package/src/memory-browse-http-glue.ts +93 -0
- package/src/memory-browse-mcp-tools.ts +57 -0
- package/src/memory-browse-operations.ts +88 -0
- package/src/memory-browse-surface.test.ts +500 -0
- package/src/memory-browse.ts +316 -0
- package/src/provenance.ts +3 -3
- package/src/reconcile/manifest.test.ts +27 -0
- package/src/reconcile/manifest.ts +7 -0
- package/src/standing-memory-block.test.ts +262 -0
- package/src/standing-memory-block.ts +331 -0
- package/src/types.ts +6 -0
- package/dist/chunk-2AV75BJW.js.map +0 -1
- package/dist/chunk-66QOUYNS.js.map +0 -1
- package/dist/chunk-66YUOI53.js.map +0 -1
- package/dist/chunk-D5DTZBTV.js.map +0 -1
- package/dist/chunk-GYYLZOSO.js.map +0 -1
- package/dist/chunk-HXDXR2FH.js.map +0 -1
- package/dist/chunk-KF57IQFX.js.map +0 -1
- package/dist/chunk-TNQR7N52.js.map +0 -1
- package/dist/chunk-UGGOQKO6.js.map +0 -1
- package/dist/chunk-W6YDAIVB.js.map +0 -1
- /package/dist/{chunk-5EHPB6RL.js.map → chunk-2QX65IEC.js.map} +0 -0
- /package/dist/{chunk-F5V7KRQS.js.map → chunk-2WMXZYMS.js.map} +0 -0
- /package/dist/{chunk-ORQ7AZMU.js.map → chunk-3RKVSECD.js.map} +0 -0
- /package/dist/{chunk-3NYM6JA4.js.map → chunk-4LPIVP77.js.map} +0 -0
- /package/dist/{chunk-PW4HTWXL.js.map → chunk-55XWRL6F.js.map} +0 -0
- /package/dist/{chunk-GGY7WKMB.js.map → chunk-5KBI2MOC.js.map} +0 -0
- /package/dist/{chunk-IXMWTNNY.js.map → chunk-6A6HSXWV.js.map} +0 -0
- /package/dist/{chunk-4HTQ76O4.js.map → chunk-7SJCSDQ3.js.map} +0 -0
- /package/dist/{chunk-U4ESGVZ2.js.map → chunk-7YUX52XZ.js.map} +0 -0
- /package/dist/{chunk-EUP4AXIW.js.map → chunk-B6VDWDFN.js.map} +0 -0
- /package/dist/{chunk-AN2O4KZY.js.map → chunk-BMENHAJL.js.map} +0 -0
- /package/dist/{chunk-5ZXGH2ZL.js.map → chunk-BXOPUJ3W.js.map} +0 -0
- /package/dist/{chunk-TE6B2UU6.js.map → chunk-CD7VTZIG.js.map} +0 -0
- /package/dist/{chunk-EC5SVM6H.js.map → chunk-DE4ZGH2N.js.map} +0 -0
- /package/dist/{chunk-YFVIA5A6.js.map → chunk-DRLZB3CN.js.map} +0 -0
- /package/dist/{chunk-SRRZZHA5.js.map → chunk-EGOWY342.js.map} +0 -0
- /package/dist/{chunk-W44T2KHG.js.map → chunk-EWBDJQ5Y.js.map} +0 -0
- /package/dist/{chunk-JMBTNVMW.js.map → chunk-FGRJJBFO.js.map} +0 -0
- /package/dist/{chunk-7BNB7KHB.js.map → chunk-G2SJRFGP.js.map} +0 -0
- /package/dist/{chunk-WGZHSQDV.js.map → chunk-G2XZFGYN.js.map} +0 -0
- /package/dist/{chunk-CFIHVWYZ.js.map → chunk-GGROFIYX.js.map} +0 -0
- /package/dist/{chunk-XLZZLUWL.js.map → chunk-HG74GEVY.js.map} +0 -0
- /package/dist/{chunk-WUUGE7QC.js.map → chunk-HS75MCQF.js.map} +0 -0
- /package/dist/{chunk-DO6R3LIE.js.map → chunk-I6IJDTRP.js.map} +0 -0
- /package/dist/{chunk-TZ44E732.js.map → chunk-IO7K7GES.js.map} +0 -0
- /package/dist/{chunk-AYP2FZFA.js.map → chunk-JUOJGZPV.js.map} +0 -0
- /package/dist/{chunk-P7S7BVBJ.js.map → chunk-JXLEQIJ7.js.map} +0 -0
- /package/dist/{chunk-4XTSKGLX.js.map → chunk-JYXLW22X.js.map} +0 -0
- /package/dist/{chunk-IPLYGWQF.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-VGRVJ6Z6.js.map → chunk-LIAM7U2J.js.map} +0 -0
- /package/dist/{chunk-S3SND7SO.js.map → chunk-LIDJWAQV.js.map} +0 -0
- /package/dist/{chunk-T5NI5K46.js.map → chunk-LYMJ36UI.js.map} +0 -0
- /package/dist/{chunk-QUFJ3NJE.js.map → chunk-MNG536IS.js.map} +0 -0
- /package/dist/{chunk-SW42MMAH.js.map → chunk-MQT3WP3F.js.map} +0 -0
- /package/dist/{chunk-UEJY6ZTQ.js.map → chunk-NE45P3OF.js.map} +0 -0
- /package/dist/{chunk-N46SNYMC.js.map → chunk-NMA7RQPR.js.map} +0 -0
- /package/dist/{chunk-47C6DF43.js.map → chunk-OS4JVTHR.js.map} +0 -0
- /package/dist/{chunk-JOP7W24J.js.map → chunk-PA67GXYJ.js.map} +0 -0
- /package/dist/{chunk-FSH6KRKO.js.map → chunk-PPJLJD2D.js.map} +0 -0
- /package/dist/{chunk-AG6PANBG.js.map → chunk-PXJ6HE2W.js.map} +0 -0
- /package/dist/{chunk-DDBLZJRV.js.map → chunk-QB4VXCFN.js.map} +0 -0
- /package/dist/{chunk-L63M2PE4.js.map → chunk-QGAKUOKU.js.map} +0 -0
- /package/dist/{chunk-AYZHHMTK.js.map → chunk-QKFYJVDG.js.map} +0 -0
- /package/dist/{chunk-YUQPUK6H.js.map → chunk-QLCMOHRE.js.map} +0 -0
- /package/dist/{chunk-Q4AUIFUA.js.map → chunk-QMWKENNK.js.map} +0 -0
- /package/dist/{chunk-FMEP2RB5.js.map → chunk-SJ7ZNUXB.js.map} +0 -0
- /package/dist/{chunk-EEHQY7ER.js.map → chunk-SK6HEQTW.js.map} +0 -0
- /package/dist/{chunk-PGAB2V53.js.map → chunk-SMBWBEE7.js.map} +0 -0
- /package/dist/{chunk-62NYUFNH.js.map → chunk-SS33RR4F.js.map} +0 -0
- /package/dist/{chunk-4ECS33D4.js.map → chunk-T3T5HTZZ.js.map} +0 -0
- /package/dist/{chunk-KG2OOAFF.js.map → chunk-TQSCR5DU.js.map} +0 -0
- /package/dist/{chunk-OV7GJ4KW.js.map → chunk-V2XNMIAM.js.map} +0 -0
- /package/dist/{chunk-AS2NOPDM.js.map → chunk-V7IONNTJ.js.map} +0 -0
- /package/dist/{chunk-HYWPUYLO.js.map → chunk-VV5GCNKG.js.map} +0 -0
- /package/dist/{chunk-Y3XHIWVP.js.map → chunk-WL3PGPGU.js.map} +0 -0
- /package/dist/{chunk-3UQIS2GC.js.map → chunk-WNMVUWI7.js.map} +0 -0
- /package/dist/{chunk-WOBMSMUK.js.map → chunk-WYU66IVZ.js.map} +0 -0
- /package/dist/{chunk-A7GQBJP5.js.map → chunk-X2NFFBTO.js.map} +0 -0
- /package/dist/{chunk-CWMMKFO7.js.map → chunk-XEHLYA5Z.js.map} +0 -0
- /package/dist/{chunk-JIWZVOQM.js.map → chunk-XKHRNAK7.js.map} +0 -0
- /package/dist/{chunk-VW5TGNJN.js.map → chunk-XXLH6KFO.js.map} +0 -0
- /package/dist/{chunk-J5OXWG66.js.map → chunk-XZUHXKM3.js.map} +0 -0
- /package/dist/{chunk-K4KE5MYE.js.map → chunk-Y5VT7BIT.js.map} +0 -0
- /package/dist/{chunk-UOREPQ3C.js.map → chunk-YOSLKZLZ.js.map} +0 -0
- /package/dist/{chunk-S7KDHFF2.js.map → chunk-YXWMZAAN.js.map} +0 -0
- /package/dist/{chunk-EAZ3YZKN.js.map → chunk-ZEIJQ4I3.js.map} +0 -0
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Pure: cards + date + timezone in, stable JSON out. No LLM, no I/O, no
|
|
5
5
|
* persistence. Same cards always serialize to the same bytes, regardless of
|
|
6
6
|
* input array order: cards are sorted by id before serialization.
|
|
7
|
+
*
|
|
8
|
+
* Privacy boundary (issue #2053 policy): a card `title` is captured
|
|
9
|
+
* observation content (the source window title). It is excluded unless the
|
|
10
|
+
* export explicitly permits observations — the same default as
|
|
11
|
+
* `activity.exportIncludeObservations`. Evidence references (store row ids,
|
|
12
|
+
* identity hashes) are always kept: they point at content without copying it.
|
|
7
13
|
*/
|
|
8
14
|
import type { TimelineCard } from "./types.js";
|
|
9
15
|
|
|
@@ -11,15 +17,58 @@ export interface DeterministicRecapOptions {
|
|
|
11
17
|
date: string;
|
|
12
18
|
timezone: string;
|
|
13
19
|
cards: readonly TimelineCard[];
|
|
20
|
+
/**
|
|
21
|
+
* Include observation-derived card content (`title`). Default false,
|
|
22
|
+
* matching the `activity.exportIncludeObservations` policy default.
|
|
23
|
+
*/
|
|
24
|
+
includeObservations?: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Card projected for export: `title` present only when the policy permits. */
|
|
28
|
+
export interface RecapExportCard extends Omit<TimelineCard, "title"> {
|
|
29
|
+
title?: string;
|
|
14
30
|
}
|
|
15
31
|
|
|
16
32
|
export interface DeterministicRecap {
|
|
17
33
|
date: string;
|
|
18
34
|
timezone: string;
|
|
19
|
-
cards:
|
|
35
|
+
cards: RecapExportCard[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Project one card for export with a fixed key order. Observation-derived
|
|
40
|
+
* `title` is dropped unless `includeObservations`; user-authored provenance
|
|
41
|
+
* (manual edits, pause reasons inside `summary`) stays, and evidence
|
|
42
|
+
* references always stay.
|
|
43
|
+
*/
|
|
44
|
+
export function projectCardForRecapExport(
|
|
45
|
+
card: TimelineCard,
|
|
46
|
+
includeObservations: boolean,
|
|
47
|
+
): RecapExportCard {
|
|
48
|
+
const projected: RecapExportCard = {
|
|
49
|
+
id: card.id,
|
|
50
|
+
kind: card.kind,
|
|
51
|
+
summary: card.summary,
|
|
52
|
+
categoryId: card.categoryId,
|
|
53
|
+
confidence: card.confidence,
|
|
54
|
+
startUtc: card.startUtc,
|
|
55
|
+
endUtc: card.endUtc,
|
|
56
|
+
dayKey: card.dayKey,
|
|
57
|
+
timezone: card.timezone,
|
|
58
|
+
machine: card.machine,
|
|
59
|
+
evidenceIds: card.evidenceIds,
|
|
60
|
+
evidenceRange: card.evidenceRange,
|
|
61
|
+
};
|
|
62
|
+
if (card.manualEdit !== undefined) {
|
|
63
|
+
projected.manualEdit = card.manualEdit;
|
|
64
|
+
}
|
|
65
|
+
if (includeObservations) {
|
|
66
|
+
projected.title = card.title;
|
|
67
|
+
}
|
|
68
|
+
return projected;
|
|
20
69
|
}
|
|
21
70
|
|
|
22
|
-
function compareCardIds(a:
|
|
71
|
+
function compareCardIds(a: RecapExportCard, b: RecapExportCard): number {
|
|
23
72
|
if (a.id < b.id) return -1;
|
|
24
73
|
if (a.id > b.id) return 1;
|
|
25
74
|
return 0;
|
|
@@ -28,14 +77,18 @@ function compareCardIds(a: TimelineCard, b: TimelineCard): number {
|
|
|
28
77
|
/**
|
|
29
78
|
* Build the byte-stable JSON recap document for one local day.
|
|
30
79
|
* Callers may `JSON.stringify` the returned object; construction order
|
|
31
|
-
* (date, timezone, cards) is fixed, so
|
|
80
|
+
* (date, timezone, cards, and the per-card key order) is fixed, so
|
|
81
|
+
* serialization is deterministic.
|
|
32
82
|
*/
|
|
33
83
|
export function exportDeterministicRecap(
|
|
34
84
|
options: DeterministicRecapOptions,
|
|
35
85
|
): DeterministicRecap {
|
|
86
|
+
const includeObservations = options.includeObservations === true;
|
|
36
87
|
return {
|
|
37
88
|
date: options.date,
|
|
38
89
|
timezone: options.timezone,
|
|
39
|
-
cards:
|
|
90
|
+
cards: options.cards
|
|
91
|
+
.map((card) => projectCardForRecapExport(card, includeObservations))
|
|
92
|
+
.sort(compareCardIds),
|
|
40
93
|
};
|
|
41
94
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-store browse command group (issue #2978) — extracted from cli.ts
|
|
3
|
+
* so the surface file stays at its structural ceiling (same seam as
|
|
4
|
+
* cli/recall-navigation-commands.ts). `remnic browse ls|tree|find` runs
|
|
5
|
+
* through EngramAccessService.memoryStoreBrowse — the same single
|
|
6
|
+
* implementation MCP and HTTP call, sharing one renderer.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Orchestrator } from "../orchestrator.js";
|
|
10
|
+
import type { CliCommand } from "../cli.js";
|
|
11
|
+
import { EngramAccessService } from "../access-service.js";
|
|
12
|
+
import type { BrowseVerb } from "../memory-browse.js";
|
|
13
|
+
|
|
14
|
+
export function registerMemoryBrowseCommands(cmd: CliCommand, orchestrator: Orchestrator): void {
|
|
15
|
+
const run = async (args: unknown[], verb: BrowseVerb) => {
|
|
16
|
+
const options = (args[args.length - 1] ?? {}) as Record<string, unknown>;
|
|
17
|
+
// `browse find <pattern>` takes the pattern as a positional arg; the
|
|
18
|
+
// options object sits at the END of commander's action args.
|
|
19
|
+
const pattern = typeof args[0] === "string" && args[0].length > 0
|
|
20
|
+
? args[0]
|
|
21
|
+
: typeof options.pattern === "string"
|
|
22
|
+
? options.pattern
|
|
23
|
+
: "";
|
|
24
|
+
if (verb === "find" && pattern.trim().length === 0) {
|
|
25
|
+
console.error("usage: browse <ls|tree|find> [path] [--pattern <glob>] [--depth <n>] [--namespace <ns>] [--json]");
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const depth = verb === "tree" && options.depth !== undefined ? Number(options.depth) : undefined;
|
|
30
|
+
if (depth !== undefined && (!Number.isFinite(depth) || !Number.isInteger(depth) || depth < 1 || depth > 4)) {
|
|
31
|
+
console.error("--depth must be an integer between 1 and 4");
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const service = new EngramAccessService(orchestrator);
|
|
36
|
+
try {
|
|
37
|
+
const result = await service.memoryStoreBrowse({
|
|
38
|
+
verb,
|
|
39
|
+
...(typeof args[0] === "string" && args[0].length > 0 ? { path: args[0] } : {}),
|
|
40
|
+
...(depth !== undefined ? { depth } : {}),
|
|
41
|
+
...(verb === "find" ? { pattern } : {}),
|
|
42
|
+
...(typeof options.namespace === "string" && options.namespace.length > 0 ? { namespace: options.namespace } : {}),
|
|
43
|
+
});
|
|
44
|
+
if (options.json === true) {
|
|
45
|
+
console.log(JSON.stringify(result, null, 2));
|
|
46
|
+
} else {
|
|
47
|
+
console.log(result.rendered);
|
|
48
|
+
}
|
|
49
|
+
if (!result.ok) process.exitCode = 1;
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
cmd
|
|
57
|
+
.command("browse ls [path]")
|
|
58
|
+
.description("List children of a store path in your namespace (issue #2978)")
|
|
59
|
+
.option("--namespace <ns>", "Namespace to scope the browse to")
|
|
60
|
+
.option("--json", "JSON output (entries + counts + truncated flag)")
|
|
61
|
+
.action(async (...args: unknown[]) => run(args, "ls"));
|
|
62
|
+
|
|
63
|
+
cmd
|
|
64
|
+
.command("browse tree [path]")
|
|
65
|
+
.description("Depth-limited store tree under one path (issue #2978)")
|
|
66
|
+
.option("--depth <n>", "Expansion depth, 1-4 (default 1)")
|
|
67
|
+
.option("--namespace <ns>", "Namespace to scope the browse to")
|
|
68
|
+
.option("--json", "JSON output (entries + counts + truncated flag)")
|
|
69
|
+
.action(async (...args: unknown[]) => run(args, "tree"));
|
|
70
|
+
|
|
71
|
+
cmd
|
|
72
|
+
.command("browse find <pattern>")
|
|
73
|
+
.description("Deterministic name/path glob or substring lookup (issue #2978)")
|
|
74
|
+
.option("--namespace <ns>", "Namespace to scope the browse to")
|
|
75
|
+
.option("--json", "JSON output (entries + counts + truncated flag)")
|
|
76
|
+
.action(async (...args: unknown[]) => run(args, "find"));
|
|
77
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { bumpMemoryCorpusVersionForDir } from "./memory-corpus-version.js";
|
|
|
14
14
|
import { utcDayRange } from "./transcript.js";
|
|
15
15
|
import { padEndDisplay, truncateGraphemeSafe } from "./whitespace.js";
|
|
16
16
|
import { runWearablesCliCommand } from "./wearables/cli.js";
|
|
17
|
-
import { registerMeetingsCommands } from "./cli/meetings-commands.js"; import { registerDeepRecallCommands } from "./cli/deep-recall-commands.js"; import { registerRecallNavigationCommands } from "./cli/recall-navigation-commands.js";
|
|
17
|
+
import { registerMeetingsCommands } from "./cli/meetings-commands.js"; import { registerDeepRecallCommands } from "./cli/deep-recall-commands.js"; import { registerRecallNavigationCommands } from "./cli/recall-navigation-commands.js"; import { registerMemoryBrowseCommands } from "./cli/memory-browse-commands.js";
|
|
18
18
|
import { registerExportOkfCommand, registerOkfCommands } from "./cli/okf-commands.js";
|
|
19
19
|
import { registerSkillsCommands } from "./cli/skills-commands.js";
|
|
20
20
|
import { registerResearchStatusCommands } from "./cli/research-status-commands.js";
|
|
@@ -6230,7 +6230,7 @@ export function registerCli(
|
|
|
6230
6230
|
|
|
6231
6231
|
registerResearchStatusCommands(cmd, orchestrator);
|
|
6232
6232
|
|
|
6233
|
-
registerCreationLedgerCommands(cmd, orchestrator); registerMeetingsCommands(cmd, orchestrator); registerOkfCommands(cmd, orchestrator); registerDeepRecallCommands(cmd, orchestrator); registerTimelineCommands(cmd, orchestrator); registerRecallNavigationCommands(cmd, orchestrator);
|
|
6233
|
+
registerCreationLedgerCommands(cmd, orchestrator); registerMeetingsCommands(cmd, orchestrator); registerOkfCommands(cmd, orchestrator); registerDeepRecallCommands(cmd, orchestrator); registerTimelineCommands(cmd, orchestrator); registerRecallNavigationCommands(cmd, orchestrator); registerMemoryBrowseCommands(cmd, orchestrator);
|
|
6234
6234
|
|
|
6235
6235
|
cmd
|
|
6236
6236
|
.command("trust-zone-promote")
|
package/src/config.ts
CHANGED
|
@@ -41,6 +41,11 @@ import { expandTildePath } from "./utils/path.js";
|
|
|
41
41
|
import { coerceBool, coerceBooleanLike, coerceInstallExtension, coerceNumber } from "./connectors/coerce.js";
|
|
42
42
|
import { parseSubjectRuntimeConfig } from "./subject-config.js";
|
|
43
43
|
import { parseRecallStateViews } from "./recall-state-view.js";
|
|
44
|
+
import {
|
|
45
|
+
parseRecallStandingBlock,
|
|
46
|
+
parseStandingBlockFreshDays,
|
|
47
|
+
parseStandingBlockMaxChars,
|
|
48
|
+
} from "./standing-memory-block.js";
|
|
44
49
|
import { parseRecallConcurrencyConfig } from "./recall-concurrency-config.js";
|
|
45
50
|
import { parseExtractionFields } from "./extraction-span-config.js";
|
|
46
51
|
import { parseReplicaPeersConfig } from "./replica-peers-config.js";
|
|
@@ -1952,6 +1957,12 @@ export function parseConfig(
|
|
|
1952
1957
|
// Recall state views (issue #1952). Default false; exact false/0/"false"
|
|
1953
1958
|
// disable (parseRecallStateViews → coerceBooleanLike).
|
|
1954
1959
|
recallStateViews: parseRecallStateViews(cfg.recallStateViews),
|
|
1960
|
+
// Prefix-cache-stable standing memory block (issue #2971). Default
|
|
1961
|
+
// false, and nothing on the recall path reads these keys until the
|
|
1962
|
+
// server wiring slice lands — pre-wiring behavior is byte-identical.
|
|
1963
|
+
recallStandingBlock: parseRecallStandingBlock(cfg.recallStandingBlock),
|
|
1964
|
+
standingBlockFreshDays: parseStandingBlockFreshDays(cfg.standingBlockFreshDays),
|
|
1965
|
+
standingBlockMaxChars: parseStandingBlockMaxChars(cfg.standingBlockMaxChars),
|
|
1955
1966
|
// Disclosure auto-escalation (issue #677 PR 4/4). Default `manual`
|
|
1956
1967
|
// so pre-#677 callers see unchanged behavior. Reject anything
|
|
1957
1968
|
// outside the allow-list rather than silently defaulting (CLAUDE.md
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import {
|
|
4
|
+
EVIDENCE_CLASSES,
|
|
5
|
+
applyEvidenceClassRules,
|
|
6
|
+
classifyEvidenceClasses,
|
|
7
|
+
deriveFactEvidenceClass,
|
|
8
|
+
deriveTurnEvidenceClass,
|
|
9
|
+
echoQuoteKey,
|
|
10
|
+
evidenceTurnInput,
|
|
11
|
+
type EvidenceClass,
|
|
12
|
+
type EvidenceClassTurnInput,
|
|
13
|
+
} from "./extraction-evidence-class.js";
|
|
14
|
+
|
|
15
|
+
function turn(overrides: Partial<EvidenceClassTurnInput> & Pick<EvidenceClassTurnInput, "content">): EvidenceClassTurnInput {
|
|
16
|
+
return { role: "assistant", ...overrides };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Deterministic turn-class derivation — table-driven across all classes
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
const DERIVATION_TABLE: ReadonlyArray<{
|
|
24
|
+
label: string;
|
|
25
|
+
input: Partial<EvidenceClassTurnInput>;
|
|
26
|
+
expected: EvidenceClass;
|
|
27
|
+
}> = [
|
|
28
|
+
{ label: "user role", input: { role: "user" }, expected: "user" },
|
|
29
|
+
{ label: "user role despite stray tool flags", input: { role: "user", toolResult: true, toolCall: true }, expected: "user" },
|
|
30
|
+
{ label: "assistant with tool result", input: { role: "assistant", toolResult: true }, expected: "tool" },
|
|
31
|
+
{ label: "assistant with tool result outranks tool call", input: { role: "assistant", toolResult: true, toolCall: true }, expected: "tool" },
|
|
32
|
+
{ label: "assistant with tool call only", input: { role: "assistant", toolCall: true }, expected: "action" },
|
|
33
|
+
{ label: "assistant prose", input: { role: "assistant" }, expected: "agent" },
|
|
34
|
+
{ label: "explicit false flags", input: { role: "assistant", toolResult: false, toolCall: false }, expected: "agent" },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
test("deriveTurnEvidenceClass: table-driven classes", () => {
|
|
38
|
+
for (const row of DERIVATION_TABLE) {
|
|
39
|
+
const input = turn({ content: "x", ...row.input });
|
|
40
|
+
assert.equal(
|
|
41
|
+
deriveTurnEvidenceClass(input),
|
|
42
|
+
row.expected,
|
|
43
|
+
`${row.label}: expected ${row.expected}`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("deriveTurnEvidenceClass: same input always yields the same class (determinism regression)", () => {
|
|
49
|
+
for (const row of DERIVATION_TABLE) {
|
|
50
|
+
const input = turn({ content: "x", ...row.input });
|
|
51
|
+
const first = deriveTurnEvidenceClass(input);
|
|
52
|
+
for (let i = 0; i < 50; i++) {
|
|
53
|
+
assert.equal(deriveTurnEvidenceClass(input), first, `${row.label}: call ${i} diverged`);
|
|
54
|
+
}
|
|
55
|
+
// A structurally identical clone must not change the class either.
|
|
56
|
+
const clone = turn({ content: "x", ...row.input });
|
|
57
|
+
assert.equal(deriveTurnEvidenceClass(clone), first, `${row.label}: clone diverged`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("deriveTurnEvidenceClass: unrelated fields never change the class", () => {
|
|
62
|
+
const base = turn({ content: "deploy finished", role: "user" });
|
|
63
|
+
const first = deriveTurnEvidenceClass(base);
|
|
64
|
+
const noisy: EvidenceClassTurnInput = {
|
|
65
|
+
...base,
|
|
66
|
+
content: "completely different content of a different length",
|
|
67
|
+
};
|
|
68
|
+
assert.equal(deriveTurnEvidenceClass(noisy), first);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Buffer-turn adapter — tool part flags map mechanically
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
|
|
75
|
+
test("evidenceTurnInput: tool_result part flags the turn as machine output", () => {
|
|
76
|
+
const input = evidenceTurnInput({
|
|
77
|
+
role: "assistant",
|
|
78
|
+
content: "exit 0, 3 files changed",
|
|
79
|
+
parts: [{ kind: "tool_result" }, { kind: "text" }],
|
|
80
|
+
});
|
|
81
|
+
assert.equal(input.toolResult, true);
|
|
82
|
+
assert.equal(input.toolCall, undefined);
|
|
83
|
+
assert.equal(deriveTurnEvidenceClass(input), "tool");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("evidenceTurnInput: tool_call part flags an invocation", () => {
|
|
87
|
+
const input = evidenceTurnInput({
|
|
88
|
+
role: "assistant",
|
|
89
|
+
content: "running the test suite",
|
|
90
|
+
parts: [{ kind: "tool_call" }],
|
|
91
|
+
});
|
|
92
|
+
assert.equal(input.toolCall, true);
|
|
93
|
+
assert.equal(deriveTurnEvidenceClass(input), "action");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("evidenceTurnInput: plain parts derive agent prose", () => {
|
|
97
|
+
const input = evidenceTurnInput({
|
|
98
|
+
role: "assistant",
|
|
99
|
+
content: "I think this looks fine",
|
|
100
|
+
parts: [{ kind: "text" }],
|
|
101
|
+
});
|
|
102
|
+
assert.equal(deriveTurnEvidenceClass(input), "agent");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("evidenceTurnInput: user role passes through", () => {
|
|
106
|
+
const input = evidenceTurnInput({ role: "user", content: "ship it Friday" });
|
|
107
|
+
assert.deepEqual(input, { role: "user", content: "ship it Friday" });
|
|
108
|
+
assert.equal(deriveTurnEvidenceClass(input), "user");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Fact-level span classification — reuses the provenance matcher
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
|
|
115
|
+
const USER_TURN = turn({ role: "user", content: "we renewed the license for 40 seats" });
|
|
116
|
+
const TOOL_TURN = turn({ role: "assistant", toolResult: true, content: "invoice total: 40 seats, $12,800 per year" });
|
|
117
|
+
const AGENT_TURN = turn({ role: "assistant", content: "the team seems happy with the current vendor" });
|
|
118
|
+
|
|
119
|
+
test("classifyEvidenceClasses: quote located in a user turn classifies user", () => {
|
|
120
|
+
const classes = classifyEvidenceClasses({
|
|
121
|
+
quote: "renewed the license",
|
|
122
|
+
turns: [USER_TURN, TOOL_TURN, AGENT_TURN],
|
|
123
|
+
});
|
|
124
|
+
assert.deepEqual(classes, ["user"]);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("classifyEvidenceClasses: quote in tool output classifies tool", () => {
|
|
128
|
+
const classes = classifyEvidenceClasses({
|
|
129
|
+
quote: "$12,800 per year",
|
|
130
|
+
turns: [USER_TURN, TOOL_TURN, AGENT_TURN],
|
|
131
|
+
});
|
|
132
|
+
assert.deepEqual(classes, ["tool"]);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("classifyEvidenceClasses: quote echoed in user and agent turns returns canonical order", () => {
|
|
136
|
+
const shared = turn({ role: "user", content: "the cache TTL is 300 seconds" });
|
|
137
|
+
const echo = turn({ role: "assistant", content: "as noted, the cache TTL is 300 seconds" });
|
|
138
|
+
const classes = classifyEvidenceClasses({ quote: "the cache TTL is 300 seconds", turns: [echo, shared] });
|
|
139
|
+
assert.deepEqual(classes, ["user", "agent"], "input order must not leak into output order");
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("classifyEvidenceClasses: leading prompt role label is stripped before matching", () => {
|
|
143
|
+
const classes = classifyEvidenceClasses({
|
|
144
|
+
quote: "[user] we renewed the license",
|
|
145
|
+
turns: [USER_TURN],
|
|
146
|
+
});
|
|
147
|
+
assert.deepEqual(classes, ["user"]);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
test("classifyEvidenceClasses: whitespace and case differences still locate (shared matcher)", () => {
|
|
151
|
+
const classes = classifyEvidenceClasses({
|
|
152
|
+
quote: "Invoice Total: 40 SEATS",
|
|
153
|
+
turns: [TOOL_TURN],
|
|
154
|
+
});
|
|
155
|
+
assert.deepEqual(classes, ["tool"]);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("classifyEvidenceClasses: no quote and unlocatable quote both yield no classes", () => {
|
|
159
|
+
assert.deepEqual(classifyEvidenceClasses({ quote: "", turns: [USER_TURN] }), []);
|
|
160
|
+
assert.deepEqual(classifyEvidenceClasses({ quote: undefined, turns: [USER_TURN] }), []);
|
|
161
|
+
assert.deepEqual(classifyEvidenceClasses({ quote: "never said this", turns: [USER_TURN] }), []);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test("classifyEvidenceClasses: determinism regression over repeated and reordered calls", () => {
|
|
165
|
+
const input = { quote: "the cache TTL is 300 seconds", turns: [USER_TURN, TOOL_TURN, AGENT_TURN] };
|
|
166
|
+
const first = classifyEvidenceClasses(input);
|
|
167
|
+
for (let i = 0; i < 50; i++) {
|
|
168
|
+
assert.deepEqual(classifyEvidenceClasses(input), first, `call ${i} diverged`);
|
|
169
|
+
}
|
|
170
|
+
const reordered = { quote: input.quote, turns: [...input.turns].reverse() };
|
|
171
|
+
assert.deepEqual(classifyEvidenceClasses(reordered), first, "turn order must not change the class set");
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// Fact-level single class — strongest present license wins
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
|
|
178
|
+
test("deriveFactEvidenceClass: strongest class present wins in fixed order", () => {
|
|
179
|
+
assert.equal(deriveFactEvidenceClass(["user", "agent"]), "user");
|
|
180
|
+
assert.equal(deriveFactEvidenceClass(["tool", "agent"]), "tool");
|
|
181
|
+
assert.equal(deriveFactEvidenceClass(["action", "agent"]), "action");
|
|
182
|
+
assert.equal(deriveFactEvidenceClass(["agent"]), "agent");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("deriveFactEvidenceClass: no located span means agent-asserted", () => {
|
|
186
|
+
assert.equal(deriveFactEvidenceClass([]), "agent");
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("deriveFactEvidenceClass: every class round-trips through the canonical order", () => {
|
|
190
|
+
const all = EVIDENCE_CLASSES.slice();
|
|
191
|
+
for (const cls of all) {
|
|
192
|
+
assert.equal(deriveFactEvidenceClass([cls, "agent"]), cls);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// Deterministic post-extraction rules — each case a smuggling attempt
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
|
|
200
|
+
test("rule: agent-asserted user decision never passes (assertion loop)", () => {
|
|
201
|
+
// The agent asserts the human decided something; the only surviving span is
|
|
202
|
+
// agent prose. This is the self-reinforcing loop the rules must break.
|
|
203
|
+
const findings = applyEvidenceClassRules({
|
|
204
|
+
content: "The user decided to migrate the database to Postgres",
|
|
205
|
+
category: "decision",
|
|
206
|
+
evidenceClasses: ["agent"],
|
|
207
|
+
});
|
|
208
|
+
assert.equal(findings.length, 1);
|
|
209
|
+
assert.equal(findings[0]!.rule, "user_attribution_without_user_span");
|
|
210
|
+
assert.equal(findings[0]!.action, "refuse");
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("rule: user decision backed by a user span passes the attribution gate", () => {
|
|
214
|
+
const findings = applyEvidenceClassRules({
|
|
215
|
+
content: "The user decided to migrate the database to Postgres",
|
|
216
|
+
category: "decision",
|
|
217
|
+
evidenceClasses: ["user"],
|
|
218
|
+
});
|
|
219
|
+
assert.deepEqual(findings, []);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test("rule: agent-own decision honestly attributed is not refused", () => {
|
|
223
|
+
const findings = applyEvidenceClassRules({
|
|
224
|
+
content: "The agent chose the conservative retry policy",
|
|
225
|
+
category: "decision",
|
|
226
|
+
subject: "agent",
|
|
227
|
+
evidenceClasses: ["agent"],
|
|
228
|
+
});
|
|
229
|
+
assert.deepEqual(findings, []);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("rule: preference and commitment are decision-like too", () => {
|
|
233
|
+
for (const category of ["preference", "commitment"]) {
|
|
234
|
+
const findings = applyEvidenceClassRules({ content: "wants weekly digests", category, evidenceClasses: ["agent"] });
|
|
235
|
+
assert.equal(findings[0]?.rule, "user_attribution_without_user_span", category);
|
|
236
|
+
}
|
|
237
|
+
const factCategory = applyEvidenceClassRules({ content: "wants weekly digests", category: "fact", evidenceClasses: ["agent"] });
|
|
238
|
+
assert.deepEqual(factCategory, [], "plain facts are not user attributions");
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("rule: number without tool or action evidence is demoted", () => {
|
|
242
|
+
const findings = applyEvidenceClassRules({
|
|
243
|
+
content: "The cluster holds 5000 documents",
|
|
244
|
+
category: "fact",
|
|
245
|
+
evidenceClasses: ["agent"],
|
|
246
|
+
});
|
|
247
|
+
assert.equal(findings.length, 1);
|
|
248
|
+
assert.equal(findings[0]!.rule, "numeric_without_tool_evidence");
|
|
249
|
+
assert.equal(findings[0]!.action, "demote");
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test("rule: number with tool evidence passes", () => {
|
|
253
|
+
assert.deepEqual(
|
|
254
|
+
applyEvidenceClassRules({ content: "The cluster holds 5000 documents", category: "fact", evidenceClasses: ["tool"] }),
|
|
255
|
+
[],
|
|
256
|
+
);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test("rule: number with action evidence passes", () => {
|
|
260
|
+
assert.deepEqual(
|
|
261
|
+
applyEvidenceClassRules({ content: "The cluster holds 5000 documents", category: "fact", evidenceClasses: ["action"] }),
|
|
262
|
+
[],
|
|
263
|
+
);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
test("rule: number in a user-spanned fact still demotes — the human is not a licit number source", () => {
|
|
267
|
+
const findings = applyEvidenceClassRules({
|
|
268
|
+
content: "We bought 40 seats",
|
|
269
|
+
category: "fact",
|
|
270
|
+
evidenceClasses: ["user"],
|
|
271
|
+
});
|
|
272
|
+
assert.equal(findings[0]?.rule, "numeric_without_tool_evidence");
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test("rule: no evidence classes at all demotes numeric content", () => {
|
|
276
|
+
const findings = applyEvidenceClassRules({ content: "cost is 5000", category: "fact", evidenceClasses: [] });
|
|
277
|
+
assert.equal(findings[0]?.rule, "numeric_without_tool_evidence");
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test("rule: echo of existing store content is refused", () => {
|
|
281
|
+
const existing = new Set([echoQuoteKey("the cache TTL is 300 seconds")]);
|
|
282
|
+
const findings = applyEvidenceClassRules({
|
|
283
|
+
content: "The cache TTL is 300 seconds",
|
|
284
|
+
category: "fact",
|
|
285
|
+
evidenceClasses: ["tool"],
|
|
286
|
+
quoteKeys: [echoQuoteKey("the cache TTL is 300 seconds")],
|
|
287
|
+
existingQuoteKeys: existing,
|
|
288
|
+
});
|
|
289
|
+
assert.equal(findings.length, 1);
|
|
290
|
+
assert.equal(findings[0]!.rule, "echo_of_existing_content");
|
|
291
|
+
assert.equal(findings[0]!.action, "refuse");
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test("rule: one fresh quote survives echo suppression", () => {
|
|
295
|
+
const existing = new Set([echoQuoteKey("old quote")]);
|
|
296
|
+
const findings = applyEvidenceClassRules({
|
|
297
|
+
content: "something new",
|
|
298
|
+
category: "fact",
|
|
299
|
+
evidenceClasses: ["tool"],
|
|
300
|
+
quoteKeys: [echoQuoteKey("old quote"), echoQuoteKey("a brand new observation")],
|
|
301
|
+
existingQuoteKeys: existing,
|
|
302
|
+
});
|
|
303
|
+
assert.deepEqual(findings, []);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
test("rule: no quote keys or no index means echo rule stays silent", () => {
|
|
307
|
+
assert.deepEqual(
|
|
308
|
+
applyEvidenceClassRules({ content: "x", category: "fact", evidenceClasses: ["tool"] }),
|
|
309
|
+
[],
|
|
310
|
+
);
|
|
311
|
+
assert.deepEqual(
|
|
312
|
+
applyEvidenceClassRules({
|
|
313
|
+
content: "x", category: "fact", evidenceClasses: ["tool"], quoteKeys: [echoQuoteKey("q")],
|
|
314
|
+
}),
|
|
315
|
+
[],
|
|
316
|
+
);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
test("rule: combined smuggling — agent-asserted decision carrying a number", () => {
|
|
320
|
+
const findings = applyEvidenceClassRules({
|
|
321
|
+
content: "The user approved a budget of 9000 for the migration",
|
|
322
|
+
category: "decision",
|
|
323
|
+
evidenceClasses: ["agent"],
|
|
324
|
+
});
|
|
325
|
+
assert.deepEqual(
|
|
326
|
+
findings.map((f) => f.rule),
|
|
327
|
+
["numeric_without_tool_evidence", "user_attribution_without_user_span"],
|
|
328
|
+
);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
test("rule: same input always yields the same findings (determinism regression)", () => {
|
|
332
|
+
const input = {
|
|
333
|
+
content: "The user approved a budget of 9000 for the migration",
|
|
334
|
+
category: "decision" as const,
|
|
335
|
+
evidenceClasses: ["agent"] as const,
|
|
336
|
+
quoteKeys: [echoQuoteKey("q1")] as const,
|
|
337
|
+
existingQuoteKeys: new Set([echoQuoteKey("q1")]),
|
|
338
|
+
};
|
|
339
|
+
const first = applyEvidenceClassRules(input);
|
|
340
|
+
for (let i = 0; i < 50; i++) {
|
|
341
|
+
assert.deepEqual(applyEvidenceClassRules(input), first, `call ${i} diverged`);
|
|
342
|
+
}
|
|
343
|
+
// Findings order is canonical (rule id order), not input-order dependent.
|
|
344
|
+
assert.deepEqual(first.map((f) => f.rule), [
|
|
345
|
+
"numeric_without_tool_evidence",
|
|
346
|
+
"user_attribution_without_user_span",
|
|
347
|
+
"echo_of_existing_content",
|
|
348
|
+
]);
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
test("echoQuoteKey is case- and whitespace-insensitive and stable", () => {
|
|
352
|
+
assert.equal(echoQuoteKey("The Cache TTL"), echoQuoteKey("the cache ttl"));
|
|
353
|
+
assert.equal(echoQuoteKey("x"), echoQuoteKey("x"));
|
|
354
|
+
assert.equal(echoQuoteKey(" spaced out "), "spaced out");
|
|
355
|
+
});
|