@remnic/core 9.69.33 → 9.69.34
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 +13 -11
- package/dist/access-admin-ops-surface.js +61 -56
- package/dist/access-authorization-probe.d.ts +13 -11
- package/dist/access-authorization-probe.js +62 -57
- package/dist/access-boundary.d.ts +13 -11
- package/dist/access-boundary.js +61 -56
- package/dist/access-cli.js +129 -125
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -1
- package/dist/access-coding-context-resolution.js +3 -3
- package/dist/access-extraction-force-flush.d.ts +13 -11
- package/dist/access-extraction-force-flush.js +61 -56
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-briefing.d.ts +13 -11
- package/dist/access-http-briefing.js +62 -57
- package/dist/access-http-lcm-compaction.d.ts +13 -11
- package/dist/access-http-lifecycle-flush.d.ts +13 -11
- package/dist/access-http-offline-stream.d.ts +13 -11
- package/dist/access-http-query.d.ts +3 -2
- package/dist/access-http-query.js +63 -58
- package/dist/access-http.d.ts +14 -12
- package/dist/access-http.js +82 -78
- package/dist/access-identity-continuity-surface.d.ts +11 -9
- package/dist/access-identity-continuity-surface.js +61 -56
- package/dist/access-lcm-surface.d.ts +13 -11
- package/dist/access-lcm-surface.js +61 -56
- package/dist/access-mcp.d.ts +13 -11
- package/dist/access-mcp.js +70 -66
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-DMR-jOMS.d.ts → access-namespace-preflight-kXG8MvYx.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +61 -56
- package/dist/access-observe-transcript.d.ts +11 -9
- package/dist/access-observe-transcript.js +3 -3
- package/dist/access-observe-write-surface.d.ts +15 -13
- package/dist/access-observe-write-surface.js +61 -56
- package/dist/access-offline-manifest.d.ts +47 -11
- package/dist/access-offline-manifest.js +18 -16
- package/dist/access-operations-batch.js +64 -60
- package/dist/access-operations.d.ts +14 -12
- package/dist/access-operations.js +69 -65
- package/dist/access-recall-concurrency.d.ts +13 -11
- package/dist/access-recall-concurrency.js +61 -56
- package/dist/access-recall-response.d.ts +13 -11
- package/dist/access-recall-response.js +61 -56
- package/dist/access-recall-surface.d.ts +13 -11
- package/dist/access-recall-surface.js +61 -56
- package/dist/access-schema.d.ts +55 -13
- package/dist/access-schema.js +15 -1
- package/dist/{access-service-CJQoQvRa.d.ts → access-service-WUm2LnXZ.d.ts} +52 -50
- package/dist/access-service-helpers.d.ts +13 -11
- package/dist/access-service.d.ts +13 -11
- package/dist/access-service.js +61 -56
- package/dist/access-surface-catalog.d.ts +13 -11
- package/dist/access-surface-catalog.js +63 -58
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +4 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +12 -10
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/digest.d.ts +2 -1
- package/dist/adapters/index.d.ts +46 -1
- package/dist/adapters/index.js +10 -6
- package/dist/adapters/registry.js +2 -2
- package/dist/ambient-provenance.d.ts +2 -1
- package/dist/artifact-search.d.ts +2 -1
- package/dist/{auto-sync-NSHLUAQI.js → auto-sync-4YFATLFQ.js} +10 -9
- package/dist/{auto-sync-NSHLUAQI.js.map → auto-sync-4YFATLFQ.js.map} +1 -1
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +11 -9
- package/dist/briefing-window.d.ts +3 -2
- package/dist/briefing.d.ts +3 -2
- package/dist/briefing.js +25 -24
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +3 -2
- package/dist/buffer.js +11 -10
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/calibration.js +3 -2
- package/dist/calibration.js.map +1 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-ZCXUPLNJ.js} +2 -2
- package/dist/{catalog-8O9KY9eA.d.ts → catalog-BaCx29iv.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +2 -1
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +26 -25
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +2 -1
- package/dist/{chunk-CDKHKZL5.js → chunk-2524MOWK.js} +2 -2
- package/dist/{chunk-HVAEXYPL.js → chunk-255PC37A.js} +47 -25
- package/dist/chunk-255PC37A.js.map +1 -0
- package/dist/{chunk-7BMXZCOT.js → chunk-2AU4D4HQ.js} +3 -3
- package/dist/{chunk-LTIZHLV7.js → chunk-2JCA2PQT.js} +2 -2
- package/dist/{chunk-XXIHX75O.js → chunk-2UZ5ZH6W.js} +3 -3
- package/dist/{chunk-QOIOACIE.js → chunk-326KUXIR.js} +15 -648
- package/dist/chunk-326KUXIR.js.map +1 -0
- package/dist/{chunk-P3SB5BNT.js → chunk-34QW2LK2.js} +2 -2
- package/dist/{chunk-EONF76DT.js → chunk-36UBSLFN.js} +2 -2
- package/dist/{chunk-DBQWVT2H.js → chunk-3CBI2ZSA.js} +2 -2
- package/dist/{chunk-NZXEK3UF.js → chunk-3Q3N35W7.js} +2 -2
- package/dist/{chunk-YYGZJPOK.js → chunk-42DJ235G.js} +2 -2
- package/dist/{chunk-TCUKRAMK.js → chunk-4JVQRFZD.js} +7 -7
- package/dist/{chunk-22FVR2KE.js → chunk-4MIS4CQW.js} +6 -2
- package/dist/chunk-4MIS4CQW.js.map +1 -0
- package/dist/{chunk-PYLL63BF.js → chunk-4PB2MBY6.js} +9 -9
- package/dist/{chunk-UUQG7HAD.js → chunk-4WCNPQQ5.js} +4 -4
- package/dist/{chunk-UGPUYIET.js → chunk-5A7ZUOBA.js} +220 -399
- package/dist/chunk-5A7ZUOBA.js.map +1 -0
- package/dist/chunk-5HYUUFMQ.js +1280 -0
- package/dist/chunk-5HYUUFMQ.js.map +1 -0
- package/dist/{chunk-H4VH5VIB.js → chunk-5QBDLMGG.js} +2 -2
- package/dist/{chunk-RKBLRTNT.js → chunk-5SDSVX7N.js} +2 -2
- package/dist/{chunk-DGGB65KC.js → chunk-5THU7NFP.js} +3 -3
- package/dist/{chunk-N7RWREIQ.js → chunk-65RENJGB.js} +6 -1
- package/dist/chunk-65RENJGB.js.map +1 -0
- package/dist/{chunk-BPJNF7J2.js → chunk-6CCRSQWT.js} +2 -2
- package/dist/{chunk-XXE5P6HJ.js → chunk-6XYC7NM4.js} +2 -2
- package/dist/{chunk-J7HFPA6O.js → chunk-6YAIN5XJ.js} +2 -2
- package/dist/{chunk-I5DZ3WGR.js → chunk-757NP436.js} +3 -3
- package/dist/{chunk-2C3S7J2S.js → chunk-7CAY3YKP.js} +741 -28
- package/dist/chunk-7CAY3YKP.js.map +1 -0
- package/dist/{chunk-E6TDQRF6.js → chunk-7J2CGXG3.js} +2 -2
- package/dist/{chunk-BUTCAMJM.js → chunk-A2YQL2FF.js} +5 -5
- package/dist/chunk-A5UQ52YQ.js +211 -0
- package/dist/chunk-A5UQ52YQ.js.map +1 -0
- package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
- package/dist/{chunk-R3HKWWUB.js → chunk-A7WOWDZK.js} +2 -2
- package/dist/{chunk-6N3TQFZU.js → chunk-AIKTQVV3.js} +3 -3
- package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
- package/dist/{chunk-W27OW7AB.js → chunk-APFKZVJS.js} +2 -2
- package/dist/{chunk-B325AGLK.js → chunk-AQIRQUCP.js} +2 -2
- package/dist/{chunk-S7T2TY65.js → chunk-AXFR2NQ5.js} +3 -3
- package/dist/{chunk-FCSZ4K2X.js → chunk-BJJWRWER.js} +3 -3
- package/dist/{chunk-JT3EB7ZL.js → chunk-BNGHPYZU.js} +5 -5
- package/dist/chunk-BRZWWUCJ.js +13 -0
- package/dist/{chunk-FYDW33ZB.js.map → chunk-BRZWWUCJ.js.map} +1 -1
- package/dist/{chunk-N57A4KPV.js → chunk-C2BFTYD7.js} +2 -2
- package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
- package/dist/{chunk-Q726HSJO.js → chunk-CRUFVJOX.js} +16 -15
- package/dist/chunk-CRUFVJOX.js.map +1 -0
- package/dist/{chunk-X35W4S3L.js → chunk-D3IZCN5P.js} +4 -4
- package/dist/{chunk-44T3Y7SZ.js → chunk-EJIEQOPB.js} +5 -5
- package/dist/{chunk-ET356KSB.js → chunk-F4TWWUMP.js} +2 -2
- package/dist/{chunk-CLLPJ6QT.js → chunk-FQXJAC3T.js} +2 -2
- package/dist/{chunk-DD5JFCWM.js → chunk-GCBIXUPT.js} +2 -2
- package/dist/{chunk-N2ZNPHA3.js → chunk-IFFLUCCU.js} +2 -2
- package/dist/{chunk-RHQMKJFG.js → chunk-ISYZ5DUI.js} +51 -47
- package/dist/{chunk-RHQMKJFG.js.map → chunk-ISYZ5DUI.js.map} +1 -1
- package/dist/{chunk-PFFZWDPE.js → chunk-JZDH2ZZK.js} +3 -3
- package/dist/{chunk-TX2UTLXC.js → chunk-K6IPSW5B.js} +2 -2
- package/dist/{chunk-4MHYKEOM.js → chunk-KDJHLOZP.js} +10 -10
- package/dist/{chunk-KCB7F4J7.js → chunk-KYGOQV37.js} +2 -2
- package/dist/{chunk-JEIXTYVG.js → chunk-L2QLDZJC.js} +46 -17
- package/dist/chunk-L2QLDZJC.js.map +1 -0
- package/dist/{chunk-A7XEPMQ6.js → chunk-LAVJC57X.js} +3 -3
- package/dist/chunk-LAVJC57X.js.map +1 -0
- package/dist/{chunk-VZWXFXLX.js → chunk-LMCD5W5B.js} +2 -2
- package/dist/{chunk-3QQTXYZ6.js → chunk-LSLCFCCQ.js} +2 -1
- package/dist/chunk-LSLCFCCQ.js.map +1 -0
- package/dist/{chunk-MKD3OMPS.js → chunk-M3MYMWXG.js} +2 -2
- package/dist/{chunk-PL7FYKHT.js → chunk-MMG5K6XJ.js} +2 -2
- package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
- package/dist/{chunk-E6JA6XWY.js → chunk-ND2O2PVN.js} +1013 -1317
- package/dist/chunk-ND2O2PVN.js.map +1 -0
- package/dist/chunk-NPNSKE76.js +220 -0
- package/dist/chunk-NPNSKE76.js.map +1 -0
- package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
- package/dist/{chunk-DB5TGMLZ.js → chunk-OZUXKUPD.js} +6 -4
- package/dist/{chunk-DB5TGMLZ.js.map → chunk-OZUXKUPD.js.map} +1 -1
- package/dist/chunk-PCEYGOSL.js +66 -0
- package/dist/chunk-PCEYGOSL.js.map +1 -0
- package/dist/{chunk-LSYDG6MJ.js → chunk-PEXW2JCK.js} +2 -2
- package/dist/{chunk-EEOUMG3J.js → chunk-PWPIERBM.js} +38 -6
- package/dist/chunk-PWPIERBM.js.map +1 -0
- package/dist/chunk-Q4AUIFUA.js +111 -0
- package/dist/chunk-Q4AUIFUA.js.map +1 -0
- package/dist/{chunk-SO7SV523.js → chunk-Q6LCCIZN.js} +1 -1
- package/dist/chunk-Q6LCCIZN.js.map +1 -0
- package/dist/{chunk-MOZXTRC2.js → chunk-QF4J3KMV.js} +19 -19
- package/dist/{chunk-JGHXXQ2G.js → chunk-QLJ6762U.js} +2 -2
- package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
- package/dist/{chunk-CETXNLEX.js → chunk-RQO3J4MR.js} +2 -2
- package/dist/{chunk-5NANRSCD.js → chunk-RR7G2X7C.js} +5 -5
- package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
- package/dist/{chunk-EQHDH4C2.js → chunk-S76KRJDG.js} +3 -3
- package/dist/{chunk-H272ZPQ3.js → chunk-SHEHQBCG.js} +124 -23
- package/dist/chunk-SHEHQBCG.js.map +1 -0
- package/dist/{chunk-EEC4PCG5.js → chunk-SZDLX763.js} +2 -2
- package/dist/{chunk-MFDTVQJX.js → chunk-SZWEDG3H.js} +12 -6
- package/dist/chunk-SZWEDG3H.js.map +1 -0
- package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
- package/dist/{chunk-JSN44KIB.js → chunk-T2YFZ27G.js} +9 -9
- package/dist/{chunk-227UFSEQ.js → chunk-TFA6HPOA.js} +2 -2
- package/dist/{chunk-BA6WOZOT.js → chunk-TK4FHQRN.js} +4 -4
- package/dist/chunk-TLHNF6GA.js +647 -0
- package/dist/chunk-TLHNF6GA.js.map +1 -0
- package/dist/{chunk-NB5BCFUY.js → chunk-TWYTGIBR.js} +4 -4
- package/dist/{chunk-FDLDOEO6.js → chunk-UBG4GAEP.js} +51 -6
- package/dist/chunk-UBG4GAEP.js.map +1 -0
- package/dist/{chunk-MWFGUESQ.js → chunk-UEZKN6VR.js} +2 -2
- package/dist/{chunk-H5AFCNGA.js → chunk-UJX4I26O.js} +2 -2
- package/dist/{chunk-BLUYQFRH.js → chunk-VELCIWJZ.js} +15 -11
- package/dist/chunk-VELCIWJZ.js.map +1 -0
- package/dist/{chunk-PBGVVDLY.js → chunk-VIZR45AN.js} +2 -2
- package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
- package/dist/{chunk-JTH2SE6B.js → chunk-W5BLTZZJ.js} +8 -8
- package/dist/chunk-W6IJMWTZ.js +72 -0
- package/dist/chunk-W6IJMWTZ.js.map +1 -0
- package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
- package/dist/{chunk-YFLLGRXO.js → chunk-X2QPKLPL.js} +2 -2
- package/dist/{chunk-MN3LK3KN.js → chunk-X424T5JQ.js} +2 -2
- package/dist/{chunk-5BCNEBEN.js → chunk-XPJNT6PI.js} +4 -4
- package/dist/{chunk-2JVJ7UHC.js → chunk-XQU3CPF2.js} +4 -2
- package/dist/chunk-XQU3CPF2.js.map +1 -0
- package/dist/chunk-XW2T4QAW.js +1 -0
- package/dist/{chunk-D223ZDQV.js → chunk-YEDVOYL2.js} +2 -2
- package/dist/{chunk-TLPZ6MKZ.js → chunk-YEN4TREG.js} +541 -5
- package/dist/chunk-YEN4TREG.js.map +1 -0
- package/dist/{chunk-RC5DXXWC.js → chunk-YM7YN37H.js} +2 -2
- package/dist/{chunk-VLXBE57O.js → chunk-YVGXH72Y.js} +2 -2
- package/dist/{chunk-YQAXP5AC.js → chunk-YXLUTALO.js} +5 -5
- package/dist/{chunk-OQDPBRQ6.js → chunk-Z7YDVHDI.js} +2 -2
- package/dist/{chunk-O75CRYGF.js → chunk-ZEFVK7XC.js} +1 -1
- package/dist/chunk-ZEFVK7XC.js.map +1 -0
- package/dist/{chunk-XUE46UYW.js → chunk-ZLN7AROH.js} +6 -6
- package/dist/{chunk-HV7OY4DM.js → chunk-ZMKYCFJ7.js} +640 -199
- package/dist/chunk-ZMKYCFJ7.js.map +1 -0
- package/dist/{chunk-HK32G473.js → chunk-ZWEZXVYH.js} +2 -2
- package/dist/{cli-D57e2Mqt.d.ts → cli-5mTYh1Tn.d.ts} +5 -5
- package/dist/cli-fallback.d.ts +11 -4
- package/dist/cli-fallback.js +5 -1
- package/dist/cli.d.ts +15 -13
- package/dist/cli.js +102 -98
- package/dist/coding/export-okf-codegraph.d.ts +2 -1
- package/dist/coding/export-okf-codegraph.js +31 -29
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/coding/pre-action-gate.d.ts +2 -1
- package/dist/compat/checks.js +2 -2
- package/dist/compat/codex-cli-fallback.d.ts +1 -1
- package/dist/compat/codex-cli-fallback.js +5 -1
- package/dist/compat/codex-cli-fallback.js.map +1 -1
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +26 -25
- package/dist/compounding/preference-consolidator.d.ts +2 -1
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.js +12 -10
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +25 -24
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +27 -26
- package/dist/consolidation-provenance-check.d.ts +3 -2
- package/dist/consolidation-undo.d.ts +3 -2
- package/dist/contradiction/index.d.ts +4 -3
- package/dist/contradiction/index.js +5 -5
- package/dist/{contradiction-scan-NOYMFG66.js → contradiction-scan-GVD4JJ7B.js} +3 -3
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +3 -2
- package/dist/convergence-refresh.js +27 -26
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/backend.js +3 -3
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.js +2 -2
- package/dist/conversation-index/indexer.d.ts +2 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/corpus-watermark.d.ts +2 -1
- package/dist/corpus-watermark.js +28 -27
- package/dist/cross-lingual-recall.d.ts +2 -1
- package/dist/day-summary.d.ts +2 -1
- package/dist/deep-recall-http-glue.d.ts +13 -11
- package/dist/deep-recall-http-glue.js +12 -2
- package/dist/deep-recall-mcp-tools.d.ts +13 -11
- package/dist/deep-recall-policy-llm.d.ts +2 -1
- package/dist/deep-recall-policy-llm.js +4 -3
- package/dist/deep-recall-seeds.d.ts +2 -1
- package/dist/delinearize.d.ts +2 -1
- package/dist/dependency-propagation-config.d.ts +2 -1
- package/dist/{dependency-propagation-delivery-CmniEsUK.d.ts → dependency-propagation-delivery-CDQCxNll.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +2 -1
- package/dist/direct-answer.d.ts +2 -1
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/enrichment/index.d.ts +2 -1
- package/dist/entity-origin-fields.d.ts +2 -1
- package/dist/entity-retrieval.d.ts +3 -2
- package/dist/entity-retrieval.js +25 -24
- package/dist/entity-schema.d.ts +2 -1
- package/dist/episodic-context.d.ts +2 -1
- package/dist/eval-trajectory-contracts.d.ts +2 -1
- package/dist/eval-trajectory-store.d.ts +2 -1
- package/dist/eval-trajectory.d.ts +2 -1
- package/dist/explicit-capture.d.ts +11 -9
- package/dist/explicit-capture.js +6 -6
- package/dist/external-wiki-access.d.ts +13 -11
- package/dist/external-wiki-access.js +62 -57
- package/dist/external-wiki-collection-registration.d.ts +2 -1
- package/dist/external-wiki-collection.d.ts +2 -1
- package/dist/external-wiki-mcp-tools.d.ts +13 -11
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- package/dist/extraction-faithfulness.js +4 -3
- package/dist/extraction-judge-telemetry.d.ts +2 -1
- package/dist/extraction-judge-training.d.ts +2 -1
- package/dist/extraction-judge.d.ts +2 -1
- package/dist/extraction-judge.js +5 -4
- package/dist/extraction-liveness.d.ts +2 -1
- package/dist/extraction-normalization.d.ts +2 -1
- package/dist/extraction-prompt.d.ts +2 -1
- package/dist/extraction-source-grounding-rules.d.ts +2 -1
- package/dist/extraction-source-grounding.d.ts +2 -1
- package/dist/extraction.d.ts +2 -1
- package/dist/extraction.js +36 -34
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/fallback-llm.js +3 -2
- package/dist/{first-start-migration-RC345GPL.js → first-start-migration-L3UFX5CU.js} +3 -3
- package/dist/generic-recall-paths-CqAZyXKX.d.ts +23 -0
- package/dist/graph-append-error.d.ts +2 -1
- package/dist/graph-dashboard-diff.d.ts +2 -1
- package/dist/graph-dashboard-key.d.ts +2 -1
- package/dist/graph-dashboard-parser.d.ts +2 -1
- package/dist/graph-edge-reinforcement.d.ts +2 -1
- package/dist/graph-jsonl.d.ts +2 -1
- package/dist/graph-path-reconstruction.d.ts +2 -1
- package/dist/graph-path-scoring.d.ts +2 -1
- package/dist/graph-snapshot.d.ts +2 -1
- package/dist/graph.d.ts +2 -1
- package/dist/harmonic-retrieval.js +2 -2
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/importers/test-utils.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/{index-BTAsSkPG.d.ts → index-BNluTxBp.d.ts} +2 -2
- package/dist/index.d.ts +302 -245
- package/dist/index.js +307 -205
- package/dist/intent.d.ts +2 -1
- package/dist/lcm/engine.d.ts +2 -1
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.d.ts +2 -1
- package/dist/lcm/index.js +4 -4
- package/dist/lcm/tools.d.ts +2 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/local-llm.d.ts +4 -1
- package/dist/local-llm.js +2 -2
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/location/index.d.ts +4 -3
- package/dist/location/index.js +28 -27
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +25 -24
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -24
- package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +26 -25
- package/dist/{maintenance-DCvQGTzL.d.ts → maintenance-8hmWOMY_.d.ts} +378 -4
- package/dist/mcp-memory-inspector-app.d.ts +13 -11
- package/dist/memory-action-policy.d.ts +2 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-controller.d.ts +2 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
- package/dist/memory-projection-store.d.ts +2 -1
- package/dist/memory-provenance.d.ts +2 -1
- package/dist/memory-snapshot.d.ts +2 -1
- package/dist/memory-subject-cli.d.ts +13 -11
- package/dist/memory-subject.d.ts +13 -11
- package/dist/memory-worth-outcomes.d.ts +3 -2
- package/dist/migrate/from-engram.js +2 -2
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +4 -3
- package/dist/namespaces/migrate.js +26 -25
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.d.ts +4 -3
- package/dist/namespaces/storage.js +25 -24
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/network/tailscale.js +2 -2
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +6 -6
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +29 -28
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +4 -3
- package/dist/operator-toolkit.js +43 -41
- package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
- package/dist/orchestration/maintenance.d.ts +5 -4
- package/dist/orchestration/maintenance.js +43 -38
- package/dist/{orchestrator-CvCsp1tz.d.ts → orchestrator-BUd_3Q86.d.ts} +17 -29
- package/dist/orchestrator.d.ts +11 -9
- package/dist/orchestrator.js +133 -127
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-JAdwKBS7.d.ts → pipeline-Dv1Bv0ma.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -1
- package/dist/proactive-contention.d.ts +2 -1
- package/dist/provenance.d.ts +2 -1
- package/dist/{public-http-h-yWu9rj.d.ts → public-http-L-IymRBN.d.ts} +1 -1
- package/dist/{qmd-Cvw9RWKr.d.ts → qmd-Mj508lHA.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +3 -2
- package/dist/qmd-recall-cache.d.ts +2 -1
- package/dist/qmd.d.ts +3 -2
- package/dist/qmd.js +2 -2
- package/dist/recall-concurrency-config.d.ts +2 -1
- package/dist/recall-disclosure-escalation.d.ts +2 -1
- package/dist/recall-explain-renderer.d.ts +2 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -1
- package/dist/recall-navigate-access.d.ts +2 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +2 -1
- package/dist/recall-navigate-disclosure.js +1 -1
- package/dist/recall-navigate.d.ts +2 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-planner-llm.d.ts +2 -1
- package/dist/recall-planner-llm.js +3 -2
- package/dist/recall-planner-llm.js.map +1 -1
- package/dist/recall-state-view-admission.d.ts +56 -0
- package/dist/recall-state-view-admission.js +39 -0
- package/dist/recall-state-view-inject.js +2 -2
- package/dist/recall-state-view-render.js +2 -2
- package/dist/recall-state-view-widen.d.ts +18 -1
- package/dist/recall-state-view-widen.js +2 -2
- package/dist/recall-state-view-wire.d.ts +1 -1
- package/dist/recall-state-view-wire.js +3 -3
- package/dist/recall-state-view.d.ts +1 -0
- package/dist/recall-state-view.js +1 -1
- package/dist/recall-state.d.ts +2 -1
- package/dist/recall-tag-filter.d.ts +2 -1
- package/dist/recall-timings.d.ts +2 -1
- package/dist/recall-xray-cli.d.ts +2 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +9 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +11 -2
- package/dist/reconcile/cursor.js +6 -4
- package/dist/reconcile/cursor.js.map +1 -1
- package/dist/reconcile/manifest.d.ts +37 -2
- package/dist/reconcile/manifest.js +15 -5
- package/dist/reconcile/plan.d.ts +2 -1
- package/dist/replay/normalizers/chatgpt.d.ts +2 -1
- package/dist/replay/normalizers/claude.d.ts +2 -1
- package/dist/replay/normalizers/openclaw.d.ts +2 -1
- package/dist/replay/normalizers/shared.d.ts +2 -1
- package/dist/replay/runner.d.ts +2 -1
- package/dist/replay/types.d.ts +2 -1
- package/dist/replica-divergence.d.ts +2 -1
- package/dist/replica-peers-config.d.ts +2 -1
- package/dist/{resolution-VKATP2HT.js → resolution-OHJZG45O.js} +6 -6
- package/dist/resolution-OHJZG45O.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +13 -11
- package/dist/retrieval-agents.d.ts +3 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/runtime/child-process.d.ts +1 -1
- package/dist/runtime/child-process.js +1 -1
- package/dist/salvage-envelope.d.ts +2 -1
- package/dist/salvage-envelope.js +2 -2
- package/dist/{scope-profiles-BShpTPeV.d.ts → scope-profiles-B6BGVbxm.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +2 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +7 -7
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +11 -11
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/port.d.ts +2 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/{semantic-consolidation-CusOpe9F.d.ts → semantic-consolidation-J-598F5M.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +26 -25
- package/dist/semantic-rule-promotion.js +25 -24
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +25 -24
- package/dist/{service-BbuVh1eS.d.ts → service-ZQkJ52cz.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -1
- package/dist/session-observer-state.d.ts +2 -1
- package/dist/shared-context/manager.d.ts +2 -1
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +34 -32
- package/dist/standup/build.js +25 -24
- package/dist/{storage-BBLLuVTF.d.ts → storage-CU_hZUgP.d.ts} +67 -6
- package/dist/storage.d.ts +4 -3
- package/dist/storage.js +24 -23
- package/dist/subject-config.d.ts +2 -1
- package/dist/subject-config.js +2 -2
- package/dist/summarizer.d.ts +2 -1
- package/dist/summarizer.js +5 -5
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/support-passport/index.d.ts +49 -15
- package/dist/support-passport/index.js +69 -60
- package/dist/temporal-supersession.d.ts +3 -2
- package/dist/temporal-timeline-recall.d.ts +2 -1
- package/dist/temporal-validity.d.ts +2 -1
- package/dist/threading.d.ts +2 -1
- package/dist/tier-migration.d.ts +3 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/tier-routing.js +2 -2
- package/dist/{tier-stats-KA6OZX2C.js → tier-stats-VK5PCO2L.js} +3 -3
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/capsule-import.js +1 -1
- package/dist/transfer/export-okf.d.ts +2 -1
- package/dist/transfer/export-okf.js +26 -25
- package/dist/transfer/types.d.ts +24 -24
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/{types-igV4-sbB.d.ts → types-BGxTvLBO.d.ts} +58 -13
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +2 -1
- package/dist/verified-recall.js +25 -24
- package/dist/who-knows-cli.d.ts +13 -11
- package/dist/who-knows-cli.js +26 -25
- package/dist/who-knows.d.ts +13 -11
- package/dist/who-knows.js +25 -24
- package/dist/write-envelope.d.ts +4 -2
- package/dist/write-envelope.js +3 -1
- package/package.json +2 -2
- package/src/access-category-alias.test.ts +216 -0
- package/src/access-mcp.test.ts +73 -0
- package/src/access-mcp.ts +6 -6
- package/src/access-observe-write-surface.ts +19 -4
- package/src/access-offline-manifest.ts +297 -16
- package/src/access-recall-surface.ts +5 -5
- package/src/access-schema.ts +76 -7
- package/src/access-service.ts +11 -2
- package/src/activity/config.test.ts +124 -1
- package/src/activity/config.ts +150 -18
- package/src/activity/index.ts +3 -0
- package/src/activity/journal-extract-storage.test.ts +129 -0
- package/src/activity/journal-extract.test.ts +314 -0
- package/src/activity/journal-extract.ts +247 -0
- package/src/activity/journal-heading.test.ts +24 -1
- package/src/activity/journal-heading.ts +36 -0
- package/src/activity/journal-read.test.ts +242 -0
- package/src/activity/journal-read.ts +183 -0
- package/src/activity/journal-source.test.ts +15 -15
- package/src/activity/journal-source.ts +21 -14
- package/src/activity/journal-state.lock-worker.ts +30 -0
- package/src/activity/journal-state.test.ts +144 -0
- package/src/activity/journal-state.ts +107 -0
- package/src/activity/journal-strip.test.ts +106 -52
- package/src/activity/journal-strip.ts +35 -10
- package/src/activity/journal-vault-integration.test.ts +230 -0
- package/src/activity/journal-vault-provenance.test.ts +9 -7
- package/src/activity/journal-vault-provenance.ts +4 -10
- package/src/activity/journal-vault-read.test.ts +3 -2
- package/src/activity/journal-vault-read.ts +9 -139
- package/src/activity/journal.test.ts +74 -23
- package/src/activity/runner.test.ts +116 -1
- package/src/activity/runner.ts +25 -0
- package/src/activity/scheduler.ts +4 -0
- package/src/activity/store.test.ts +18 -0
- package/src/activity/store.ts +14 -0
- package/src/activity/sync-registration.ts +4 -0
- package/src/activity/timeline/analysis-metadata.ts +2 -0
- package/src/activity/timeline/analysis-provider.ts +140 -0
- package/src/activity/timeline/analysis-run.test.ts +419 -0
- package/src/activity/timeline/analysis-run.ts +106 -0
- package/src/activity/timeline/analysis.ts +66 -37
- package/src/activity/timeline/corrections.ts +9 -0
- package/src/activity/timeline/index.ts +3 -0
- package/src/activity/timeline/query.test.ts +71 -0
- package/src/activity/timeline/query.ts +57 -8
- package/src/activity/timeline/regenerate.test.ts +505 -0
- package/src/activity/timeline/regenerate.ts +373 -0
- package/src/activity/types.ts +40 -5
- package/src/adapters/grok-opencode.test.ts +146 -0
- package/src/adapters/grok.ts +53 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/opencode.ts +52 -0
- package/src/adapters/registry.ts +4 -0
- package/src/cli-fallback.ts +13 -4
- package/src/config.test.ts +3 -1
- package/src/config.ts +4 -0
- package/src/dedup/merge.test.ts +732 -25
- package/src/fallback-llm.test.ts +53 -0
- package/src/fallback-llm.ts +12 -0
- package/src/index.ts +2 -0
- package/src/local-llm.ts +3 -1
- package/src/orchestration/dependency-propagation-recovery-replay.ts +1 -1
- package/src/orchestration/extraction-persist-deps.ts +9 -0
- package/src/orchestration/extraction-persist-promotion.test.ts +265 -6
- package/src/orchestration/extraction-persist-promotion.ts +42 -3
- package/src/orchestration/extraction-persist.ts +3 -3
- package/src/orchestration/harmonic-construction-persist.test.ts +115 -4
- package/src/orchestration/harmonic-construction-persist.ts +34 -6
- package/src/orchestration/maintenance.ts +1 -0
- package/src/orchestration/orchestrator-helpers.ts +6 -0
- package/src/orchestration/recall-entry.ts +16 -0
- package/src/orchestration/recall-internal-deps.ts +14 -0
- package/src/orchestration/recall-internal.ts +41 -58
- package/src/orchestration/recall-result-formatter.ts +11 -1
- package/src/orchestration/recall-search-pipeline.ts +121 -11
- package/src/orchestration/recall-state-view-pipeline.test.ts +211 -0
- package/src/orchestration/semantic-merge-commit-effects.ts +76 -17
- package/src/orchestration/semantic-merge-persist.ts +121 -16
- package/src/orchestration/semantic-merge-promotion-payload.ts +133 -54
- package/src/orchestrator.ts +7 -35
- package/src/providers/codex-subscription.test.ts +666 -0
- package/src/providers/codex-subscription.ts +743 -0
- package/src/recall-disclosure.test.ts +20 -0
- package/src/recall-state-view-admission.ts +114 -0
- package/src/recall-state-view-asof.test.ts +176 -0
- package/src/recall-state-view-call.test.ts +175 -0
- package/src/recall-state-view-config.test.ts +16 -0
- package/src/recall-state-view-widen.test.ts +70 -0
- package/src/recall-state-view-widen.ts +28 -7
- package/src/recall-state-view-wire.ts +3 -1
- package/src/recall-state-view-zero-diff.test.ts +20 -11
- package/src/recall-state-view.test.ts +142 -0
- package/src/recall-state-view.ts +72 -24
- package/src/recall-xray-renderer.test.ts +27 -0
- package/src/recall-xray-renderer.ts +4 -0
- package/src/recall-xray.ts +13 -0
- package/src/reconcile/cursor.ts +23 -33
- package/src/reconcile/manifest.ts +96 -11
- package/src/reconcile-identity-cache.test.ts +378 -0
- package/src/runtime/child-process.ts +1 -1
- package/src/storage/cas-revision-host.ts +75 -0
- package/src/storage/cas-revision-store.test.ts +459 -0
- package/src/storage/cas-revision-store.ts +661 -0
- package/src/storage/deletion-revision-store.ts +80 -6
- package/src/storage/tombstone-blocked-capture-index.ts +15 -0
- package/src/storage/tombstone-blocked-capture-mutation.ts +67 -7
- package/src/storage/tombstone-blocked-capture-sync.ts +55 -20
- package/src/storage-contract/failure-semantics.test.ts +1 -1
- package/src/storage-frontmatter-cas.test.ts +698 -1
- package/src/storage-replay.test.ts +166 -3
- package/src/storage.ts +41 -41
- package/src/support-passport/card-projection.ts +82 -33
- package/src/temporal-supersession.test.ts +10 -10
- package/src/types.ts +7 -7
- package/src/write-envelope.ts +1 -1
- package/dist/chunk-22FVR2KE.js.map +0 -1
- package/dist/chunk-2C3S7J2S.js.map +0 -1
- package/dist/chunk-2JVJ7UHC.js.map +0 -1
- package/dist/chunk-2QSZNTDO.js +0 -56
- package/dist/chunk-2QSZNTDO.js.map +0 -1
- package/dist/chunk-3QQTXYZ6.js.map +0 -1
- package/dist/chunk-5VCDKQWQ.js +0 -560
- package/dist/chunk-5VCDKQWQ.js.map +0 -1
- package/dist/chunk-A7XEPMQ6.js.map +0 -1
- package/dist/chunk-BLUYQFRH.js.map +0 -1
- package/dist/chunk-E6JA6XWY.js.map +0 -1
- package/dist/chunk-EEOUMG3J.js.map +0 -1
- package/dist/chunk-FDLDOEO6.js.map +0 -1
- package/dist/chunk-FYDW33ZB.js +0 -13
- package/dist/chunk-H272ZPQ3.js.map +0 -1
- package/dist/chunk-HV7OY4DM.js.map +0 -1
- package/dist/chunk-HVAEXYPL.js.map +0 -1
- package/dist/chunk-JEIXTYVG.js.map +0 -1
- package/dist/chunk-LRICZIGN.js +0 -52
- package/dist/chunk-LRICZIGN.js.map +0 -1
- package/dist/chunk-MFDTVQJX.js.map +0 -1
- package/dist/chunk-N7RWREIQ.js.map +0 -1
- package/dist/chunk-O75CRYGF.js.map +0 -1
- package/dist/chunk-Q726HSJO.js.map +0 -1
- package/dist/chunk-QOIOACIE.js.map +0 -1
- package/dist/chunk-SEDEKFYQ.js +0 -1
- package/dist/chunk-SO7SV523.js.map +0 -1
- package/dist/chunk-TLPZ6MKZ.js.map +0 -1
- package/dist/chunk-UGPUYIET.js.map +0 -1
- package/src/activity/journal-mode.test.ts +0 -32
- package/src/activity/journal-mode.ts +0 -20
- /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
- /package/dist/{chunk-CDKHKZL5.js.map → chunk-2524MOWK.js.map} +0 -0
- /package/dist/{chunk-7BMXZCOT.js.map → chunk-2AU4D4HQ.js.map} +0 -0
- /package/dist/{chunk-LTIZHLV7.js.map → chunk-2JCA2PQT.js.map} +0 -0
- /package/dist/{chunk-XXIHX75O.js.map → chunk-2UZ5ZH6W.js.map} +0 -0
- /package/dist/{chunk-P3SB5BNT.js.map → chunk-34QW2LK2.js.map} +0 -0
- /package/dist/{chunk-EONF76DT.js.map → chunk-36UBSLFN.js.map} +0 -0
- /package/dist/{chunk-DBQWVT2H.js.map → chunk-3CBI2ZSA.js.map} +0 -0
- /package/dist/{chunk-NZXEK3UF.js.map → chunk-3Q3N35W7.js.map} +0 -0
- /package/dist/{chunk-YYGZJPOK.js.map → chunk-42DJ235G.js.map} +0 -0
- /package/dist/{chunk-TCUKRAMK.js.map → chunk-4JVQRFZD.js.map} +0 -0
- /package/dist/{chunk-PYLL63BF.js.map → chunk-4PB2MBY6.js.map} +0 -0
- /package/dist/{chunk-UUQG7HAD.js.map → chunk-4WCNPQQ5.js.map} +0 -0
- /package/dist/{chunk-H4VH5VIB.js.map → chunk-5QBDLMGG.js.map} +0 -0
- /package/dist/{chunk-RKBLRTNT.js.map → chunk-5SDSVX7N.js.map} +0 -0
- /package/dist/{chunk-DGGB65KC.js.map → chunk-5THU7NFP.js.map} +0 -0
- /package/dist/{chunk-BPJNF7J2.js.map → chunk-6CCRSQWT.js.map} +0 -0
- /package/dist/{chunk-XXE5P6HJ.js.map → chunk-6XYC7NM4.js.map} +0 -0
- /package/dist/{chunk-J7HFPA6O.js.map → chunk-6YAIN5XJ.js.map} +0 -0
- /package/dist/{chunk-I5DZ3WGR.js.map → chunk-757NP436.js.map} +0 -0
- /package/dist/{chunk-E6TDQRF6.js.map → chunk-7J2CGXG3.js.map} +0 -0
- /package/dist/{chunk-BUTCAMJM.js.map → chunk-A2YQL2FF.js.map} +0 -0
- /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
- /package/dist/{chunk-R3HKWWUB.js.map → chunk-A7WOWDZK.js.map} +0 -0
- /package/dist/{chunk-6N3TQFZU.js.map → chunk-AIKTQVV3.js.map} +0 -0
- /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
- /package/dist/{chunk-W27OW7AB.js.map → chunk-APFKZVJS.js.map} +0 -0
- /package/dist/{chunk-B325AGLK.js.map → chunk-AQIRQUCP.js.map} +0 -0
- /package/dist/{chunk-S7T2TY65.js.map → chunk-AXFR2NQ5.js.map} +0 -0
- /package/dist/{chunk-FCSZ4K2X.js.map → chunk-BJJWRWER.js.map} +0 -0
- /package/dist/{chunk-JT3EB7ZL.js.map → chunk-BNGHPYZU.js.map} +0 -0
- /package/dist/{chunk-N57A4KPV.js.map → chunk-C2BFTYD7.js.map} +0 -0
- /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
- /package/dist/{chunk-X35W4S3L.js.map → chunk-D3IZCN5P.js.map} +0 -0
- /package/dist/{chunk-44T3Y7SZ.js.map → chunk-EJIEQOPB.js.map} +0 -0
- /package/dist/{chunk-ET356KSB.js.map → chunk-F4TWWUMP.js.map} +0 -0
- /package/dist/{chunk-CLLPJ6QT.js.map → chunk-FQXJAC3T.js.map} +0 -0
- /package/dist/{chunk-DD5JFCWM.js.map → chunk-GCBIXUPT.js.map} +0 -0
- /package/dist/{chunk-N2ZNPHA3.js.map → chunk-IFFLUCCU.js.map} +0 -0
- /package/dist/{chunk-PFFZWDPE.js.map → chunk-JZDH2ZZK.js.map} +0 -0
- /package/dist/{chunk-TX2UTLXC.js.map → chunk-K6IPSW5B.js.map} +0 -0
- /package/dist/{chunk-4MHYKEOM.js.map → chunk-KDJHLOZP.js.map} +0 -0
- /package/dist/{chunk-KCB7F4J7.js.map → chunk-KYGOQV37.js.map} +0 -0
- /package/dist/{chunk-VZWXFXLX.js.map → chunk-LMCD5W5B.js.map} +0 -0
- /package/dist/{chunk-MKD3OMPS.js.map → chunk-M3MYMWXG.js.map} +0 -0
- /package/dist/{chunk-PL7FYKHT.js.map → chunk-MMG5K6XJ.js.map} +0 -0
- /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
- /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
- /package/dist/{chunk-LSYDG6MJ.js.map → chunk-PEXW2JCK.js.map} +0 -0
- /package/dist/{chunk-MOZXTRC2.js.map → chunk-QF4J3KMV.js.map} +0 -0
- /package/dist/{chunk-JGHXXQ2G.js.map → chunk-QLJ6762U.js.map} +0 -0
- /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
- /package/dist/{chunk-CETXNLEX.js.map → chunk-RQO3J4MR.js.map} +0 -0
- /package/dist/{chunk-5NANRSCD.js.map → chunk-RR7G2X7C.js.map} +0 -0
- /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
- /package/dist/{chunk-EQHDH4C2.js.map → chunk-S76KRJDG.js.map} +0 -0
- /package/dist/{chunk-EEC4PCG5.js.map → chunk-SZDLX763.js.map} +0 -0
- /package/dist/{chunk-E2ZHGBAK.js.map → chunk-T2JSUEH6.js.map} +0 -0
- /package/dist/{chunk-JSN44KIB.js.map → chunk-T2YFZ27G.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-TFA6HPOA.js.map} +0 -0
- /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
- /package/dist/{chunk-NB5BCFUY.js.map → chunk-TWYTGIBR.js.map} +0 -0
- /package/dist/{chunk-MWFGUESQ.js.map → chunk-UEZKN6VR.js.map} +0 -0
- /package/dist/{chunk-H5AFCNGA.js.map → chunk-UJX4I26O.js.map} +0 -0
- /package/dist/{chunk-PBGVVDLY.js.map → chunk-VIZR45AN.js.map} +0 -0
- /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
- /package/dist/{chunk-JTH2SE6B.js.map → chunk-W5BLTZZJ.js.map} +0 -0
- /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
- /package/dist/{chunk-YFLLGRXO.js.map → chunk-X2QPKLPL.js.map} +0 -0
- /package/dist/{chunk-MN3LK3KN.js.map → chunk-X424T5JQ.js.map} +0 -0
- /package/dist/{chunk-5BCNEBEN.js.map → chunk-XPJNT6PI.js.map} +0 -0
- /package/dist/{chunk-SEDEKFYQ.js.map → chunk-XW2T4QAW.js.map} +0 -0
- /package/dist/{chunk-D223ZDQV.js.map → chunk-YEDVOYL2.js.map} +0 -0
- /package/dist/{chunk-RC5DXXWC.js.map → chunk-YM7YN37H.js.map} +0 -0
- /package/dist/{chunk-VLXBE57O.js.map → chunk-YVGXH72Y.js.map} +0 -0
- /package/dist/{chunk-YQAXP5AC.js.map → chunk-YXLUTALO.js.map} +0 -0
- /package/dist/{chunk-OQDPBRQ6.js.map → chunk-Z7YDVHDI.js.map} +0 -0
- /package/dist/{chunk-XUE46UYW.js.map → chunk-ZLN7AROH.js.map} +0 -0
- /package/dist/{chunk-HK32G473.js.map → chunk-ZWEZXVYH.js.map} +0 -0
- /package/dist/{contradiction-scan-NOYMFG66.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
- /package/dist/{first-start-migration-RC345GPL.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
- /package/dist/{resolution-VKATP2HT.js.map → recall-state-view-admission.js.map} +0 -0
- /package/dist/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-contract and surface tests for timeline-card analysis (issue #2050).
|
|
3
|
+
*
|
|
4
|
+
* Every acceptance path runs against synthetic observations through the
|
|
5
|
+
* local/remote client seams — no network, no real provider. Prompt and
|
|
6
|
+
* response content are captured by the fakes and asserted locally.
|
|
7
|
+
*/
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import test from "node:test";
|
|
10
|
+
|
|
11
|
+
import { runTimelineCardAnalysis } from "./analysis-run.js";
|
|
12
|
+
import {
|
|
13
|
+
classifyAnalysisProviderError,
|
|
14
|
+
timelineAnalysisCompleteFromClients,
|
|
15
|
+
TimelineAnalysisProviderError,
|
|
16
|
+
} from "./analysis-provider.js";
|
|
17
|
+
import type { TimelineAnalysisLocalLlm, TimelineAnalysisRemoteLlm } from "./analysis-provider.js";
|
|
18
|
+
import type { ActivityTimelineAnalysisConfig } from "../types.js";
|
|
19
|
+
import type { TimelineCard, TimelineObservation } from "./types.js";
|
|
20
|
+
|
|
21
|
+
const DATE = "2026-08-17";
|
|
22
|
+
const TZ = "UTC";
|
|
23
|
+
|
|
24
|
+
function card(
|
|
25
|
+
overrides: Partial<TimelineCard> & Pick<TimelineCard, "id" | "startUtc" | "endUtc">,
|
|
26
|
+
): TimelineCard {
|
|
27
|
+
return {
|
|
28
|
+
kind: "activity",
|
|
29
|
+
title: "main.ts — editor",
|
|
30
|
+
summary: "Code editor on ws-a",
|
|
31
|
+
categoryId: "development",
|
|
32
|
+
confidence: 0.8,
|
|
33
|
+
dayKey: DATE,
|
|
34
|
+
timezone: TZ,
|
|
35
|
+
machine: "ws-a",
|
|
36
|
+
evidenceIds: [1],
|
|
37
|
+
evidenceRange: {
|
|
38
|
+
firstKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1",
|
|
39
|
+
lastKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1",
|
|
40
|
+
},
|
|
41
|
+
...overrides,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function observation(overrides: Partial<TimelineObservation> = {}): TimelineObservation {
|
|
46
|
+
return {
|
|
47
|
+
id: 1,
|
|
48
|
+
machine: "ws-a",
|
|
49
|
+
capturedAtUtc: "2026-08-17T10:00:00.000Z",
|
|
50
|
+
app: "editor",
|
|
51
|
+
windowTitle: "main.ts — editor",
|
|
52
|
+
contentHash: "hash-1",
|
|
53
|
+
...overrides,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function sampleCards(): TimelineCard[] {
|
|
58
|
+
return [card({ id: "card-1", startUtc: "2026-08-17T10:00:00.000Z", endUtc: "2026-08-17T10:15:00.000Z" })];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const ENABLED: ActivityTimelineAnalysisConfig = { enabled: true, provider: "openai", model: "gpt-test" };
|
|
62
|
+
|
|
63
|
+
interface RecordedCall {
|
|
64
|
+
messages: Array<{ role: string; content: string }>;
|
|
65
|
+
options: Record<string, unknown>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function fakeLocal(handler: (call: RecordedCall) => Promise<{ content: string } | null>) {
|
|
69
|
+
const calls: RecordedCall[] = [];
|
|
70
|
+
const localLlm: TimelineAnalysisLocalLlm = {
|
|
71
|
+
chatCompletion: async (messages, options) => {
|
|
72
|
+
const call = { messages, options: options as unknown as Record<string, unknown> };
|
|
73
|
+
calls.push(call);
|
|
74
|
+
return handler(call);
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
return { localLlm, calls };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function fakeRemote(handler: (call: RecordedCall) => Promise<{ content: string } | null>) {
|
|
81
|
+
const calls: RecordedCall[] = [];
|
|
82
|
+
const remoteLlm: TimelineAnalysisRemoteLlm = {
|
|
83
|
+
chatCompletion: async (messages, options) => {
|
|
84
|
+
const call = { messages, options: options as unknown as Record<string, unknown> };
|
|
85
|
+
calls.push(call);
|
|
86
|
+
return handler(call);
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
return { remoteLlm, calls };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
test("disabled config makes zero provider calls and produces zero analysis artifacts", async () => {
|
|
93
|
+
const cards = sampleCards();
|
|
94
|
+
const local = fakeLocal(async () => ({ content: '{"ops":[]}' }));
|
|
95
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
96
|
+
const result = await runTimelineCardAnalysis({
|
|
97
|
+
date: DATE,
|
|
98
|
+
timezone: TZ,
|
|
99
|
+
cards,
|
|
100
|
+
observations: [observation()],
|
|
101
|
+
config: { enabled: false },
|
|
102
|
+
deps: { localLlm: local.localLlm, remoteLlm: remote.remoteLlm },
|
|
103
|
+
});
|
|
104
|
+
assert.equal(result.status, "disabled");
|
|
105
|
+
assert.equal(result.cards, cards);
|
|
106
|
+
assert.equal(local.calls.length + remote.calls.length, 0);
|
|
107
|
+
assert.equal(result.failure, undefined);
|
|
108
|
+
assert.equal(result.metadata, undefined);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("remote provider is pinned to the single configured model with no chain fallback", async () => {
|
|
112
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
113
|
+
const result = await runTimelineCardAnalysis({
|
|
114
|
+
date: DATE,
|
|
115
|
+
timezone: TZ,
|
|
116
|
+
cards: sampleCards(),
|
|
117
|
+
observations: [observation()],
|
|
118
|
+
config: ENABLED,
|
|
119
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
120
|
+
});
|
|
121
|
+
assert.equal(result.status, "ok");
|
|
122
|
+
assert.equal(remote.calls.length, 1);
|
|
123
|
+
assert.deepEqual(remote.calls[0]?.options.modelChain, { primary: "openai/gpt-test" });
|
|
124
|
+
assert.equal(remote.calls[0]?.options.includeDefaultModelFallback, false);
|
|
125
|
+
assert.deepEqual(result.metadata, {
|
|
126
|
+
provider: "openai",
|
|
127
|
+
model: "gpt-test",
|
|
128
|
+
promptVersion: "1",
|
|
129
|
+
observationCount: 1,
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("local provider routes to the local client seam", async () => {
|
|
134
|
+
const local = fakeLocal(async () => ({ content: '{"ops":[]}' }));
|
|
135
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
136
|
+
const result = await runTimelineCardAnalysis({
|
|
137
|
+
date: DATE,
|
|
138
|
+
timezone: TZ,
|
|
139
|
+
cards: sampleCards(),
|
|
140
|
+
observations: [observation()],
|
|
141
|
+
config: { ...ENABLED, provider: "local", model: "qwen3.8-27b" },
|
|
142
|
+
deps: { localLlm: local.localLlm, remoteLlm: remote.remoteLlm },
|
|
143
|
+
});
|
|
144
|
+
assert.equal(result.status, "ok");
|
|
145
|
+
assert.equal(local.calls.length, 1);
|
|
146
|
+
assert.equal(remote.calls.length, 0);
|
|
147
|
+
assert.equal(local.calls[0]?.options.operation, "timeline-analysis");
|
|
148
|
+
assert.equal(local.calls[0]?.options.model, "qwen3.8-27b");
|
|
149
|
+
assert.equal(result.metadata?.provider, "local");
|
|
150
|
+
assert.equal(result.metadata?.model, "qwen3.8-27b");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("prompt carries evidence-only chronology and strict-output instructions with only safe fields", async () => {
|
|
154
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
155
|
+
await runTimelineCardAnalysis({
|
|
156
|
+
date: DATE,
|
|
157
|
+
timezone: TZ,
|
|
158
|
+
cards: sampleCards(),
|
|
159
|
+
observations: [observation({ browserUrl: "https://example.test/repo" })],
|
|
160
|
+
config: ENABLED,
|
|
161
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
162
|
+
});
|
|
163
|
+
const prompt = remote.calls[0]?.messages[0]?.content ?? "";
|
|
164
|
+
for (const phrase of [
|
|
165
|
+
"Use only supplied evidence",
|
|
166
|
+
"Preserve chronology",
|
|
167
|
+
"Do not invent people, places, or tasks",
|
|
168
|
+
"Avoid productivity or emotional claims",
|
|
169
|
+
"Return strict JSON",
|
|
170
|
+
]) {
|
|
171
|
+
assert.ok(prompt.includes(phrase), `prompt must instruct: ${phrase}`);
|
|
172
|
+
}
|
|
173
|
+
// The prompt is "<instructions>\n<payload JSON>"; the payload is line 2.
|
|
174
|
+
const payload = JSON.parse(prompt.slice(prompt.indexOf("\n") + 1));
|
|
175
|
+
assert.deepEqual(Object.keys(payload.observations[0]).sort(), [
|
|
176
|
+
"app",
|
|
177
|
+
"browserUrl",
|
|
178
|
+
"capturedAtUtc",
|
|
179
|
+
"contentHash",
|
|
180
|
+
"id",
|
|
181
|
+
"machine",
|
|
182
|
+
"windowTitle",
|
|
183
|
+
]);
|
|
184
|
+
// No raw capture channels exist on the observation payload: the type carries
|
|
185
|
+
// none, and the wire shape proves nothing extra was smuggled in.
|
|
186
|
+
assert.equal(JSON.stringify(payload).includes("textSource"), false);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("observations outside the day window are never sent", async () => {
|
|
190
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
191
|
+
const result = await runTimelineCardAnalysis({
|
|
192
|
+
date: DATE,
|
|
193
|
+
timezone: TZ,
|
|
194
|
+
cards: sampleCards(),
|
|
195
|
+
observations: [
|
|
196
|
+
observation({ id: 1 }),
|
|
197
|
+
observation({ id: 2, capturedAtUtc: "2026-08-16T23:59:59.999Z", contentHash: "hash-2" }),
|
|
198
|
+
],
|
|
199
|
+
config: ENABLED,
|
|
200
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
201
|
+
});
|
|
202
|
+
const prompt = remote.calls[0]?.messages[0]?.content ?? "";
|
|
203
|
+
const payload = JSON.parse(prompt.slice(prompt.indexOf("\n") + 1));
|
|
204
|
+
assert.equal(payload.observations.length, 1);
|
|
205
|
+
assert.equal(result.metadata?.observationCount, 1);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("an impossible date or timezone throws before any provider contact", async () => {
|
|
209
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
210
|
+
await assert.rejects(
|
|
211
|
+
() =>
|
|
212
|
+
runTimelineCardAnalysis({
|
|
213
|
+
date: "2026-02-30",
|
|
214
|
+
timezone: TZ,
|
|
215
|
+
cards: sampleCards(),
|
|
216
|
+
observations: [observation()],
|
|
217
|
+
config: ENABLED,
|
|
218
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
219
|
+
}),
|
|
220
|
+
RangeError,
|
|
221
|
+
);
|
|
222
|
+
await assert.rejects(
|
|
223
|
+
() =>
|
|
224
|
+
runTimelineCardAnalysis({
|
|
225
|
+
date: DATE,
|
|
226
|
+
timezone: "Not/AZone",
|
|
227
|
+
cards: sampleCards(),
|
|
228
|
+
observations: [observation()],
|
|
229
|
+
config: ENABLED,
|
|
230
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
231
|
+
}),
|
|
232
|
+
RangeError,
|
|
233
|
+
);
|
|
234
|
+
assert.equal(remote.calls.length, 0);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test("missing provider seam returns a typed provider_unavailable failure and unchanged cards", async () => {
|
|
238
|
+
const cards = sampleCards();
|
|
239
|
+
const result = await runTimelineCardAnalysis({
|
|
240
|
+
date: DATE,
|
|
241
|
+
timezone: TZ,
|
|
242
|
+
cards,
|
|
243
|
+
observations: [observation()],
|
|
244
|
+
config: { ...ENABLED, provider: "local" },
|
|
245
|
+
deps: { localLlm: null, remoteLlm: null },
|
|
246
|
+
});
|
|
247
|
+
assert.equal(result.status, "provider_failed");
|
|
248
|
+
assert.equal(result.cards, cards);
|
|
249
|
+
assert.deepEqual(result.failure, { kind: "provider_unavailable", retryable: true, preservesDeterministic: true });
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test("unconfigured remote provider returns null and never falls back to another provider", async () => {
|
|
253
|
+
const remote = fakeRemote(async () => null);
|
|
254
|
+
const cards = sampleCards();
|
|
255
|
+
const result = await runTimelineCardAnalysis({
|
|
256
|
+
date: DATE,
|
|
257
|
+
timezone: TZ,
|
|
258
|
+
cards,
|
|
259
|
+
observations: [observation()],
|
|
260
|
+
config: { ...ENABLED, provider: "no-such-provider" },
|
|
261
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
262
|
+
});
|
|
263
|
+
assert.equal(result.status, "provider_failed");
|
|
264
|
+
assert.equal(result.cards, cards);
|
|
265
|
+
assert.equal(result.failure?.kind, "provider_unavailable");
|
|
266
|
+
assert.equal(remote.calls.length, 1);
|
|
267
|
+
assert.deepEqual(remote.calls[0]?.options.modelChain, { primary: "no-such-provider/gpt-test" });
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
for (const [name, error, kind] of [
|
|
271
|
+
["timeout", Object.assign(new Error("timeline analysis timed out"), { name: "TimeoutError" }), "timeout"],
|
|
272
|
+
["abort", Object.assign(new Error("aborted"), { name: "AbortError" }), "aborted"],
|
|
273
|
+
["rate limit status", Object.assign(new Error("HTTP 429"), { status: 429 }), "rate_limited"],
|
|
274
|
+
["generic provider crash", new Error("socket hang up"), "provider_unavailable"],
|
|
275
|
+
] as const) {
|
|
276
|
+
test(`${name} returns the typed failure kind and leaves cards byte-identical`, async () => {
|
|
277
|
+
const cards = sampleCards();
|
|
278
|
+
const remote = fakeRemote(async () => {
|
|
279
|
+
throw error;
|
|
280
|
+
});
|
|
281
|
+
const result = await runTimelineCardAnalysis({
|
|
282
|
+
date: DATE,
|
|
283
|
+
timezone: TZ,
|
|
284
|
+
cards,
|
|
285
|
+
observations: [observation()],
|
|
286
|
+
config: ENABLED,
|
|
287
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
288
|
+
});
|
|
289
|
+
assert.equal(result.status, "provider_failed");
|
|
290
|
+
assert.equal(result.cards, cards);
|
|
291
|
+
assert.equal(result.failure?.kind, kind);
|
|
292
|
+
assert.equal(result.failure?.preservesDeterministic, true);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
for (const [name, body, kind] of [
|
|
297
|
+
["empty response body", "", "partial_output"],
|
|
298
|
+
["malformed JSON", "the model rambled, no json here", "malformed_json"],
|
|
299
|
+
["json without ops", '{"summary":"no ops key"}', "invalid_schema"],
|
|
300
|
+
["ops with an invalid entry", '{"ops":[{"cardId":"card-1"}]}', "invalid_schema"],
|
|
301
|
+
] as const) {
|
|
302
|
+
test(`${name} is typed ${kind} and leaves cards unchanged`, async () => {
|
|
303
|
+
const cards = sampleCards();
|
|
304
|
+
const remote = fakeRemote(async () => ({ content: body }));
|
|
305
|
+
const result = await runTimelineCardAnalysis({
|
|
306
|
+
date: DATE,
|
|
307
|
+
timezone: TZ,
|
|
308
|
+
cards,
|
|
309
|
+
observations: [observation()],
|
|
310
|
+
config: ENABLED,
|
|
311
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
312
|
+
});
|
|
313
|
+
assert.equal(result.status, "invalid_output");
|
|
314
|
+
assert.equal(result.cards, cards);
|
|
315
|
+
assert.equal(result.failure?.kind, kind);
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
test("a valid op updates only allowed fields and preserves manual edits and evidence", async () => {
|
|
320
|
+
const locked = card({
|
|
321
|
+
id: "locked",
|
|
322
|
+
startUtc: "2026-08-17T11:00:00.000Z",
|
|
323
|
+
endUtc: "2026-08-17T11:15:00.000Z",
|
|
324
|
+
manualEdit: { editedAtUtc: "2026-08-17T12:00:00.000Z", title: "kept" },
|
|
325
|
+
});
|
|
326
|
+
const open = card({ id: "open", startUtc: "2026-08-17T10:00:00.000Z", endUtc: "2026-08-17T10:15:00.000Z" });
|
|
327
|
+
const remote = fakeRemote(
|
|
328
|
+
async () =>
|
|
329
|
+
({
|
|
330
|
+
content: JSON.stringify({
|
|
331
|
+
ops: [
|
|
332
|
+
{
|
|
333
|
+
cardId: "open",
|
|
334
|
+
title: "Refined title",
|
|
335
|
+
summary: "Editor work bound to the supplied window",
|
|
336
|
+
categoryId: "development",
|
|
337
|
+
confidence: 0.9,
|
|
338
|
+
uncertainty: "Title inferred from window title only",
|
|
339
|
+
evidenceRange: { firstKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1", lastKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1" },
|
|
340
|
+
},
|
|
341
|
+
],
|
|
342
|
+
}),
|
|
343
|
+
}) as { content: string },
|
|
344
|
+
);
|
|
345
|
+
const result = await runTimelineCardAnalysis({
|
|
346
|
+
date: DATE,
|
|
347
|
+
timezone: TZ,
|
|
348
|
+
cards: [locked, open],
|
|
349
|
+
observations: [observation()],
|
|
350
|
+
config: ENABLED,
|
|
351
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
352
|
+
});
|
|
353
|
+
assert.equal(result.status, "ok");
|
|
354
|
+
const updated = result.cards.find((entry) => entry.id === "open");
|
|
355
|
+
const untouched = result.cards.find((entry) => entry.id === "locked");
|
|
356
|
+
assert.equal(updated?.title, "Refined title");
|
|
357
|
+
assert.equal(updated?.confidence, 0.9);
|
|
358
|
+
assert.deepEqual(updated?.evidenceRange, open.evidenceRange);
|
|
359
|
+
assert.deepEqual(updated?.evidenceIds, [1]);
|
|
360
|
+
assert.equal(untouched?.title, "main.ts — editor");
|
|
361
|
+
assert.ok(untouched?.manualEdit);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
test("empty input returns invalid_output with zero provider calls", async () => {
|
|
365
|
+
const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
|
|
366
|
+
const cards: TimelineCard[] = [];
|
|
367
|
+
const result = await runTimelineCardAnalysis({
|
|
368
|
+
date: DATE,
|
|
369
|
+
timezone: TZ,
|
|
370
|
+
cards,
|
|
371
|
+
observations: [],
|
|
372
|
+
config: ENABLED,
|
|
373
|
+
deps: { remoteLlm: remote.remoteLlm },
|
|
374
|
+
});
|
|
375
|
+
assert.equal(result.status, "invalid_output");
|
|
376
|
+
assert.equal(result.cards, cards);
|
|
377
|
+
assert.equal(remote.calls.length, 0);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
test("provider error classification is name/status based and total", () => {
|
|
381
|
+
assert.equal(classifyAnalysisProviderError(new TimelineAnalysisProviderError("rate_limited", "x")), "rate_limited");
|
|
382
|
+
assert.equal(
|
|
383
|
+
classifyAnalysisProviderError(Object.assign(new Error("HTTP 429"), { status: 429 })),
|
|
384
|
+
"rate_limited",
|
|
385
|
+
);
|
|
386
|
+
assert.equal(
|
|
387
|
+
classifyAnalysisProviderError(new Error("Rate limit exceeded, retry later")),
|
|
388
|
+
"rate_limited",
|
|
389
|
+
);
|
|
390
|
+
assert.equal(
|
|
391
|
+
classifyAnalysisProviderError(Object.assign(new Error("x"), { name: "AbortError" })),
|
|
392
|
+
"aborted",
|
|
393
|
+
);
|
|
394
|
+
assert.equal(
|
|
395
|
+
classifyAnalysisProviderError(Object.assign(new Error("x"), { name: "TimeoutError" })),
|
|
396
|
+
"timeout",
|
|
397
|
+
);
|
|
398
|
+
assert.equal(classifyAnalysisProviderError(new Error("socket hang up")), "provider_unavailable");
|
|
399
|
+
assert.equal(classifyAnalysisProviderError("not an error"), "provider_unavailable");
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test("adapter pins the call-time provider verbatim with no chain fallback", async () => {
|
|
403
|
+
const seen: string[] = [];
|
|
404
|
+
const remoteLlm: TimelineAnalysisRemoteLlm = {
|
|
405
|
+
chatCompletion: async (_messages, options) => {
|
|
406
|
+
seen.push(options.modelChain?.primary ?? "");
|
|
407
|
+
assert.equal(options.includeDefaultModelFallback, false);
|
|
408
|
+
return { content: '{"ops":[]}' };
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
const complete = timelineAnalysisCompleteFromClients({ localLlm: null, remoteLlm });
|
|
412
|
+
await complete({
|
|
413
|
+
prompt: "p",
|
|
414
|
+
provider: "anthropic",
|
|
415
|
+
model: "claude-4_1",
|
|
416
|
+
signal: new AbortController().signal,
|
|
417
|
+
});
|
|
418
|
+
assert.deepEqual(seen, ["anthropic/claude-4_1"]);
|
|
419
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config-driven surface for evidence-bound timeline-card analysis (issue #2050).
|
|
3
|
+
*
|
|
4
|
+
* Composes the parsed `activity.timeline.analysis` config with the local/remote
|
|
5
|
+
* provider seams and `analyzeTimelineCards`. The AI gate is independent of
|
|
6
|
+
* activity capture, timeline derivation, and memory creation: disabled means
|
|
7
|
+
* zero provider calls and zero analysis artifacts. Every failure leaves the
|
|
8
|
+
* deterministic cards byte-identical and returns a typed status.
|
|
9
|
+
*/
|
|
10
|
+
import { activityDayWindow } from "../digest.js";
|
|
11
|
+
import type { ActivityTimelineAnalysisConfig } from "../types.js";
|
|
12
|
+
import { analyzeTimelineCards, type TimelineAnalysisStatus } from "./analysis.js";
|
|
13
|
+
import type { AnalysisFailure } from "./analysis-failure.js";
|
|
14
|
+
import {
|
|
15
|
+
timelineAnalysisCompleteFromClients,
|
|
16
|
+
type TimelineAnalysisLocalLlm,
|
|
17
|
+
type TimelineAnalysisRemoteLlm,
|
|
18
|
+
} from "./analysis-provider.js";
|
|
19
|
+
import { buildAnalysisRunMetadata, type AnalysisRunMetadata } from "./analysis-metadata.js";
|
|
20
|
+
import type { TimelineCard, TimelineCategory, TimelineCorrection, TimelineObservation } from "./types.js";
|
|
21
|
+
|
|
22
|
+
export interface TimelineAnalysisRunInput {
|
|
23
|
+
/** Local calendar day being analyzed (YYYY-MM-DD). */
|
|
24
|
+
date: string;
|
|
25
|
+
/** IANA timezone the day is bucketed in. */
|
|
26
|
+
timezone: string;
|
|
27
|
+
/** Deterministic cards for the day (the bytes that must survive failure). */
|
|
28
|
+
cards: readonly TimelineCard[];
|
|
29
|
+
/** Day observations — the only evidence the provider may see. */
|
|
30
|
+
observations: readonly TimelineObservation[];
|
|
31
|
+
categories?: readonly TimelineCategory[];
|
|
32
|
+
/** Prior accepted manual corrections, surfaced to the prompt as edits. */
|
|
33
|
+
corrections?: readonly TimelineCorrection[];
|
|
34
|
+
config: ActivityTimelineAnalysisConfig;
|
|
35
|
+
deps: {
|
|
36
|
+
localLlm?: TimelineAnalysisLocalLlm | null;
|
|
37
|
+
remoteLlm?: TimelineAnalysisRemoteLlm | null;
|
|
38
|
+
};
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface TimelineAnalysisRunResult {
|
|
43
|
+
status: TimelineAnalysisStatus;
|
|
44
|
+
/** Same card objects as the input on any non-ok status. */
|
|
45
|
+
cards: TimelineCard[];
|
|
46
|
+
failure?: AnalysisFailure;
|
|
47
|
+
/** Provider/model/prompt-version provenance; identifiers only, never content. */
|
|
48
|
+
metadata?: AnalysisRunMetadata;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Run the optional analysis for one day. Observations are confined to the
|
|
53
|
+
* DST-aware day window before anything is sent, so a mis-scoped caller cannot
|
|
54
|
+
* widen the evidence the provider sees.
|
|
55
|
+
*/
|
|
56
|
+
export async function runTimelineCardAnalysis(
|
|
57
|
+
input: TimelineAnalysisRunInput,
|
|
58
|
+
): Promise<TimelineAnalysisRunResult> {
|
|
59
|
+
// Throws RangeError on an impossible date or invalid timezone before any
|
|
60
|
+
// provider contact — the window bounds the whole run.
|
|
61
|
+
const { startUtc, endUtc } = activityDayWindow(input.date, input.timezone);
|
|
62
|
+
if (!input.config.enabled) {
|
|
63
|
+
return { status: "disabled", cards: input.cards as TimelineCard[] };
|
|
64
|
+
}
|
|
65
|
+
const start = Date.parse(startUtc);
|
|
66
|
+
const end = Date.parse(endUtc);
|
|
67
|
+
const observations = input.observations.filter((observation) => {
|
|
68
|
+
const captured = Date.parse(observation.capturedAtUtc);
|
|
69
|
+
return Number.isFinite(captured) && captured >= start && captured < end;
|
|
70
|
+
});
|
|
71
|
+
const result = await analyzeTimelineCards({
|
|
72
|
+
enabled: true,
|
|
73
|
+
cards: input.cards,
|
|
74
|
+
observations,
|
|
75
|
+
provider: input.config.provider,
|
|
76
|
+
model: input.config.model,
|
|
77
|
+
complete: timelineAnalysisCompleteFromClients({
|
|
78
|
+
localLlm: input.deps.localLlm ?? null,
|
|
79
|
+
remoteLlm: input.deps.remoteLlm ?? null,
|
|
80
|
+
}),
|
|
81
|
+
...(input.config.timeoutMs === undefined ? {} : { timeoutMs: input.config.timeoutMs }),
|
|
82
|
+
date: input.date,
|
|
83
|
+
timezone: input.timezone,
|
|
84
|
+
...(input.categories === undefined ? {} : { categories: input.categories }),
|
|
85
|
+
...(input.config.preferences === undefined ? {} : { preferences: input.config.preferences }),
|
|
86
|
+
...(input.corrections === undefined ? {} : { priorEdits: input.corrections }),
|
|
87
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
88
|
+
});
|
|
89
|
+
if (result.status !== "ok") {
|
|
90
|
+
return {
|
|
91
|
+
status: result.status,
|
|
92
|
+
cards: result.cards,
|
|
93
|
+
...(result.failure === undefined ? {} : { failure: result.failure }),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
status: "ok",
|
|
98
|
+
cards: result.cards,
|
|
99
|
+
metadata: buildAnalysisRunMetadata({
|
|
100
|
+
provider: result.provider ?? "unknown",
|
|
101
|
+
model: result.model ?? "unknown",
|
|
102
|
+
promptVersion: String(result.promptVersion ?? "v0"),
|
|
103
|
+
observationCount: observations.length,
|
|
104
|
+
}),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Optional AI analysis over deterministic timeline cards
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Optional evidence-bound AI analysis over deterministic timeline cards
|
|
3
|
+
* (issue #2050). Provider calls arrive through the injected `complete`
|
|
4
|
+
* function; hosts build it from the local/remote seams in analysis-provider.js
|
|
5
|
+
* and the parsed `activity.timeline.analysis` config. Failures leave the
|
|
6
|
+
* cards unchanged and carry a typed failure kind. Disabled makes zero
|
|
7
|
+
* provider calls.
|
|
6
8
|
*/
|
|
9
|
+
import { classifyAnalysisFailure, type AnalysisFailure, type AnalysisFailureKind } from "./analysis-failure.js";
|
|
10
|
+
import { classifyAnalysisProviderError } from "./analysis-provider.js";
|
|
7
11
|
import { extractJsonCandidates } from "../../json-extract.js";
|
|
8
12
|
import { log } from "../../logger.js";
|
|
9
13
|
import { DEFAULT_TIMELINE_CATEGORIES } from "./categories.js";
|
|
@@ -55,6 +59,8 @@ export interface TimelineAnalysisResult {
|
|
|
55
59
|
provider?: string;
|
|
56
60
|
model?: string;
|
|
57
61
|
promptVersion?: number;
|
|
62
|
+
/** Typed failure detail; present only when status is a failure. */
|
|
63
|
+
failure?: AnalysisFailure;
|
|
58
64
|
}
|
|
59
65
|
|
|
60
66
|
interface AnalysisOp {
|
|
@@ -82,6 +88,7 @@ function fail(
|
|
|
82
88
|
cards: readonly TimelineCard[],
|
|
83
89
|
provider: string,
|
|
84
90
|
model: string,
|
|
91
|
+
kind: AnalysisFailureKind,
|
|
85
92
|
): TimelineAnalysisResult {
|
|
86
93
|
log.info(`timeline analysis status=${status} provider=${provider} model=${model} promptVersion=${TIMELINE_ANALYSIS_PROMPT_VERSION}`);
|
|
87
94
|
return {
|
|
@@ -90,6 +97,7 @@ function fail(
|
|
|
90
97
|
provider,
|
|
91
98
|
model,
|
|
92
99
|
promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,
|
|
100
|
+
failure: classifyAnalysisFailure(kind),
|
|
93
101
|
};
|
|
94
102
|
}
|
|
95
103
|
|
|
@@ -206,32 +214,6 @@ async function callComplete(
|
|
|
206
214
|
}
|
|
207
215
|
}
|
|
208
216
|
|
|
209
|
-
function parseOps(raw: string): AnalysisOp[] | null {
|
|
210
|
-
if (typeof raw !== "string" || raw.trim().length === 0) return null;
|
|
211
|
-
for (const candidate of extractJsonCandidates(raw)) {
|
|
212
|
-
try {
|
|
213
|
-
const parsed: unknown = JSON.parse(candidate);
|
|
214
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || !("ops" in parsed)) continue;
|
|
215
|
-
const ops = parsed.ops;
|
|
216
|
-
if (!Array.isArray(ops)) continue;
|
|
217
|
-
const out: AnalysisOp[] = [];
|
|
218
|
-
let valid = true;
|
|
219
|
-
for (const item of ops) {
|
|
220
|
-
const op = asOp(item);
|
|
221
|
-
if (!op) {
|
|
222
|
-
valid = false;
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
out.push(op);
|
|
226
|
-
}
|
|
227
|
-
if (valid) return out;
|
|
228
|
-
} catch {
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
217
|
function asOp(value: unknown): AnalysisOp | null {
|
|
236
218
|
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
237
219
|
if (!("cardId" in value) || typeof value.cardId !== "string" || value.cardId.length === 0) return null;
|
|
@@ -262,6 +244,45 @@ function asOp(value: unknown): AnalysisOp | null {
|
|
|
262
244
|
};
|
|
263
245
|
}
|
|
264
246
|
|
|
247
|
+
type ParseOpsResult = { ok: true; ops: AnalysisOp[] } | { ok: false; kind: AnalysisFailureKind };
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Parse the provider response. An empty/whitespace body is `partial_output`
|
|
251
|
+
* (nothing came back); a body whose JSON candidates never parse is
|
|
252
|
+
* `malformed_json`; parseable JSON in the wrong shape — missing `ops`, or an
|
|
253
|
+
* op that fails validation — is `invalid_schema`.
|
|
254
|
+
*/
|
|
255
|
+
function parseOps(raw: string): ParseOpsResult {
|
|
256
|
+
if (typeof raw !== "string" || raw.trim().length === 0) return { ok: false, kind: "partial_output" };
|
|
257
|
+
let sawParsableShape = false;
|
|
258
|
+
for (const candidate of extractJsonCandidates(raw)) {
|
|
259
|
+
try {
|
|
260
|
+
const parsed: unknown = JSON.parse(candidate);
|
|
261
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) continue;
|
|
262
|
+
if (!("ops" in parsed) || !Array.isArray(parsed.ops)) {
|
|
263
|
+
sawParsableShape = true;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
const out: AnalysisOp[] = [];
|
|
267
|
+
let valid = true;
|
|
268
|
+
for (const item of parsed.ops) {
|
|
269
|
+
const op = asOp(item);
|
|
270
|
+
if (!op) {
|
|
271
|
+
valid = false;
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
out.push(op);
|
|
275
|
+
}
|
|
276
|
+
if (valid) return { ok: true, ops: out };
|
|
277
|
+
sawParsableShape = true;
|
|
278
|
+
} catch {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (sawParsableShape) return { ok: false, kind: "invalid_schema" };
|
|
283
|
+
return { ok: false, kind: "malformed_json" };
|
|
284
|
+
}
|
|
285
|
+
|
|
265
286
|
function knownEvidenceKeys(cards: readonly TimelineCard[], observations: readonly TimelineObservation[]): Set<string> {
|
|
266
287
|
const keys = new Set<string>();
|
|
267
288
|
for (const observation of observations) keys.add(evidenceKeyOf(observation));
|
|
@@ -320,7 +341,15 @@ export async function analyzeTimelineCards(input: TimelineAnalysisInput): Promis
|
|
|
320
341
|
throw new TimelineAnalysisConfigError("timeoutMs must be a positive integer");
|
|
321
342
|
}
|
|
322
343
|
if (input.cards.length === 0 && input.observations.length === 0) {
|
|
323
|
-
|
|
344
|
+
// Caller-side guard, not a provider failure: nothing to analyze and zero
|
|
345
|
+
// calls must be made, so no typed response failure is attached.
|
|
346
|
+
return {
|
|
347
|
+
status: "invalid_output",
|
|
348
|
+
cards,
|
|
349
|
+
provider,
|
|
350
|
+
model,
|
|
351
|
+
promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,
|
|
352
|
+
};
|
|
324
353
|
}
|
|
325
354
|
|
|
326
355
|
const categories = input.categories ?? DEFAULT_TIMELINE_CATEGORIES;
|
|
@@ -340,16 +369,16 @@ export async function analyzeTimelineCards(input: TimelineAnalysisInput): Promis
|
|
|
340
369
|
priorEdits: input.priorEdits,
|
|
341
370
|
});
|
|
342
371
|
const raw = await callComplete(complete, prompt, provider, model, timeoutMs, input.signal);
|
|
343
|
-
const
|
|
344
|
-
if (!
|
|
345
|
-
for (const op of ops) merged.set(op.cardId, op);
|
|
372
|
+
const parsed = parseOps(raw);
|
|
373
|
+
if (!parsed.ok) return fail("invalid_output", cards, provider, model, parsed.kind);
|
|
374
|
+
for (const op of parsed.ops) merged.set(op.cardId, op);
|
|
346
375
|
}
|
|
347
|
-
} catch {
|
|
348
|
-
return fail("provider_failed", cards, provider, model);
|
|
376
|
+
} catch (error) {
|
|
377
|
+
return fail("provider_failed", cards, provider, model, classifyAnalysisProviderError(error));
|
|
349
378
|
}
|
|
350
379
|
|
|
351
380
|
const applied = applyOps(cards, [...merged.values()], categories, knownEvidenceKeys(cards, ordered));
|
|
352
|
-
if (!applied) return fail("invalid_output", cards, provider, model);
|
|
381
|
+
if (!applied) return fail("invalid_output", cards, provider, model, "invalid_schema");
|
|
353
382
|
|
|
354
383
|
log.info(`timeline analysis status=ok provider=${provider} model=${model} promptVersion=${TIMELINE_ANALYSIS_PROMPT_VERSION}`);
|
|
355
384
|
return {
|