@remnic/core 9.65.7 → 9.65.8
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 -13
- package/dist/access-admin-ops-surface.js +42 -42
- package/dist/access-authorization-probe.d.ts +15 -13
- package/dist/access-authorization-probe.js +43 -43
- package/dist/access-boundary.d.ts +15 -13
- package/dist/access-boundary.js +42 -42
- package/dist/access-cli.js +143 -140
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -1
- package/dist/access-extraction-force-flush.d.ts +15 -13
- package/dist/access-extraction-force-flush.js +42 -42
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-lcm-compaction.d.ts +15 -13
- package/dist/access-http-lifecycle-flush.d.ts +15 -13
- package/dist/access-http-offline-stream.d.ts +15 -13
- package/dist/access-http-query.d.ts +3 -2
- package/dist/access-http-query.js +44 -44
- package/dist/access-http.d.ts +16 -14
- package/dist/access-http.js +59 -59
- package/dist/access-identity-continuity-surface.d.ts +13 -11
- package/dist/access-identity-continuity-surface.js +42 -42
- package/dist/access-lcm-surface.d.ts +15 -13
- package/dist/access-lcm-surface.js +42 -42
- package/dist/access-mcp.d.ts +15 -13
- package/dist/access-mcp.js +49 -49
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-8VYKmRX0.d.ts → access-namespace-preflight-CpAOrS-9.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +42 -42
- package/dist/access-observe-write-surface.d.ts +15 -13
- package/dist/access-observe-write-surface.js +42 -42
- package/dist/access-offline-manifest.d.ts +13 -11
- package/dist/access-offline-manifest.js +6 -6
- package/dist/access-operations-batch.js +45 -45
- package/dist/access-operations.d.ts +20 -18
- package/dist/access-operations.js +48 -48
- package/dist/access-recall-concurrency.d.ts +15 -13
- package/dist/access-recall-concurrency.js +42 -42
- package/dist/access-recall-response.d.ts +15 -13
- package/dist/access-recall-response.js +42 -42
- package/dist/access-recall-surface.d.ts +15 -13
- package/dist/access-recall-surface.js +42 -42
- package/dist/access-schema.d.ts +83 -83
- package/dist/{access-service-Crk__Git.d.ts → access-service-Diu61Cfv.d.ts} +71 -71
- package/dist/access-service-helpers.d.ts +15 -13
- package/dist/access-service.d.ts +15 -13
- package/dist/access-service.js +42 -42
- package/dist/access-surface-catalog.d.ts +15 -13
- package/dist/access-surface-catalog.js +44 -44
- package/dist/access-wearables-meetings-surface.d.ts +6 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-context-config.d.ts +27 -0
- package/dist/active-context-config.js +14 -0
- package/dist/active-context-transform.d.ts +267 -0
- package/dist/active-context-transform.js +31 -0
- package/dist/active-context-transform.js.map +1 -0
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +10 -9
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/ambient-provenance.d.ts +2 -1
- package/dist/artifact-search.d.ts +2 -1
- package/dist/{auto-sync-XVMLL2RH.js → auto-sync-2YPITIWN.js} +6 -6
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +13 -11
- package/dist/briefing-window.d.ts +5 -2
- package/dist/briefing.d.ts +5 -2
- package/dist/briefing.js +23 -23
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +5 -2
- package/dist/buffer.js +6 -6
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{catalog-DybwVNW3.d.ts → catalog-9f-vEQLS.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +4 -3
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +24 -24
- package/dist/causal-trajectory-graph.d.ts +2 -1
- package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
- package/dist/{chunk-S3K2CIK5.js → chunk-3A2NJP2U.js} +2 -2
- package/dist/{chunk-OPGL46PX.js → chunk-3PKAS6VL.js} +2 -2
- package/dist/{chunk-GTSVEEP3.js → chunk-3SZD4CYO.js} +3 -3
- package/dist/chunk-43HUVDTD.js +114 -0
- package/dist/chunk-43HUVDTD.js.map +1 -0
- package/dist/{chunk-YKWFK7XA.js → chunk-4F4AQFWL.js} +7 -7
- package/dist/{chunk-RGCF4XNH.js → chunk-4QEYREAV.js} +9 -9
- package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
- package/dist/{chunk-DVYRD4HY.js → chunk-5ACCD4L7.js} +30 -1
- package/dist/chunk-5ACCD4L7.js.map +1 -0
- package/dist/{chunk-3RI5Y7KU.js → chunk-5DHKCO52.js} +2 -2
- package/dist/{chunk-VKCAHCBI.js → chunk-5RWZH6PH.js} +2 -2
- package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
- package/dist/{chunk-A32YEQAM.js → chunk-76DIF5KT.js} +2 -2
- package/dist/{chunk-OPPBTPUU.js → chunk-7KQB4EBS.js} +4 -4
- package/dist/{chunk-I2HTKOOP.js → chunk-7VZFRUQU.js} +3 -3
- package/dist/{chunk-D4QVPP3G.js → chunk-7WOWGRAU.js} +10 -6
- package/dist/chunk-7WOWGRAU.js.map +1 -0
- package/dist/{chunk-JCWY73FK.js → chunk-AHPIFKNG.js} +2 -2
- package/dist/{chunk-IP4ZNT4U.js → chunk-AZMLH5UT.js} +2 -2
- package/dist/chunk-B32WYRXX.js +77 -0
- package/dist/chunk-B32WYRXX.js.map +1 -0
- package/dist/{chunk-JOEJG4SD.js → chunk-BEC4YBNA.js} +4 -4
- package/dist/{chunk-VXVZ2GM3.js → chunk-CAMNRAJF.js} +2 -2
- package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
- package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
- package/dist/{chunk-SVSRPG6M.js → chunk-CPA5NBHN.js} +2 -2
- package/dist/{chunk-7BEPVIH3.js → chunk-CRML27CO.js} +3 -3
- package/dist/{chunk-IY7UXD3J.js → chunk-DA7ITC5Z.js} +2 -2
- package/dist/{chunk-AFR6AIM4.js → chunk-DEACDKE3.js} +3 -3
- package/dist/{chunk-NG3MBQV4.js → chunk-DPCXDG7G.js} +2 -2
- package/dist/{chunk-HZNYJN77.js → chunk-F3NVYTTA.js} +2 -2
- package/dist/{chunk-PDDSFELN.js → chunk-F7XUD3PL.js} +2 -2
- package/dist/{chunk-YWSQD2IB.js → chunk-GTO56JY5.js} +2 -2
- package/dist/{chunk-RAIUTAZZ.js → chunk-H2YSH3DG.js} +2 -2
- package/dist/{chunk-F6QHHRWP.js → chunk-HMZKGHMD.js} +2 -2
- package/dist/{chunk-ZIJDI4CP.js → chunk-HRHO3ZNG.js} +2 -2
- package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
- package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
- package/dist/{chunk-TR7DGXGI.js → chunk-JOZUBF4A.js} +5 -5
- package/dist/{chunk-I7EX6KSH.js → chunk-JYSN42VN.js} +55 -55
- package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
- package/dist/chunk-KOLJJN5G.js.map +1 -0
- package/dist/{chunk-FMQ4MOQO.js → chunk-KZIF6XHX.js} +14 -14
- package/dist/chunk-LB7WCZHY.js +553 -0
- package/dist/chunk-LB7WCZHY.js.map +1 -0
- package/dist/{chunk-RIAM7DND.js → chunk-LDKPDODJ.js} +2 -2
- package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
- package/dist/{chunk-LLQCM2U2.js → chunk-LKYIOCWL.js} +101 -101
- package/dist/{chunk-5S4LQOPE.js → chunk-LOXHYCVS.js} +2 -2
- package/dist/{chunk-ANJXPFRS.js → chunk-LPNCR4QK.js} +8 -8
- package/dist/{chunk-GEPACVWN.js → chunk-MDD2RINF.js} +2 -2
- package/dist/{chunk-H63EDPFJ.js → chunk-MI2OTWV5.js} +15 -2
- package/dist/{chunk-H63EDPFJ.js.map → chunk-MI2OTWV5.js.map} +1 -1
- package/dist/{chunk-LBFFNDFM.js → chunk-MINHJ55X.js} +1 -1
- package/dist/chunk-MINHJ55X.js.map +1 -0
- package/dist/{chunk-6CPUQ5D6.js → chunk-MY2BC6UE.js} +13 -13
- package/dist/{chunk-CFGU52XJ.js → chunk-NPFUNWNX.js} +2 -2
- package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
- package/dist/{chunk-5DH6PG4B.js → chunk-OA2O2GJ4.js} +3 -3
- package/dist/{chunk-JAQXUGLN.js → chunk-ODU2CNNX.js} +2 -2
- package/dist/{chunk-RQE4TITU.js → chunk-OXRRJXPR.js} +32 -32
- package/dist/{chunk-SEA6M7SS.js → chunk-P36Z4JRA.js} +2 -2
- package/dist/{chunk-Z4U3UN56.js → chunk-PU56CXZA.js} +6 -6
- package/dist/{chunk-5VPQSRQO.js → chunk-S5XOSTYM.js} +3 -3
- package/dist/{chunk-SVVIASVX.js → chunk-SEEJOGQX.js} +5 -5
- package/dist/{chunk-7TCGNUVP.js → chunk-SNOIKAHM.js} +2 -2
- package/dist/{chunk-7F27PCSN.js → chunk-T6ILXUAH.js} +2 -2
- package/dist/{chunk-EOHKUWXW.js → chunk-T7XP6IZE.js} +2 -2
- package/dist/{chunk-7WR462EM.js → chunk-TFR3HG4K.js} +3 -3
- package/dist/{chunk-YRVAKONL.js → chunk-TUHBYJXL.js} +1 -1
- package/dist/{chunk-F635GAL7.js → chunk-U7EW2W4W.js} +10 -10
- package/dist/{chunk-VFYRYFLL.js → chunk-UEBDCMOO.js} +2 -2
- package/dist/{chunk-WTOZBZNN.js → chunk-UENKPWCS.js} +4 -4
- package/dist/{chunk-AAXJNINV.js → chunk-UL4MKZHI.js} +2 -2
- package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
- package/dist/{chunk-ACOC27BB.js → chunk-UPFNQJC7.js} +2 -2
- package/dist/{chunk-W4BMEGQA.js → chunk-UTQUEHC7.js} +2 -2
- package/dist/{chunk-I32NKXE2.js → chunk-V4IDF3EZ.js} +2 -2
- package/dist/{chunk-BJTHRFFC.js → chunk-W2BAGGEW.js} +51 -19
- package/dist/chunk-W2BAGGEW.js.map +1 -0
- package/dist/{chunk-ZAOHJDKH.js → chunk-WNXYT4MK.js} +3 -3
- package/dist/{chunk-T42L3S6A.js → chunk-XBGHAAKR.js} +2 -2
- package/dist/{chunk-I4343FIA.js → chunk-XNWXSGHS.js} +4 -4
- package/dist/{chunk-THG4GYIE.js → chunk-YEUXERJ6.js} +5 -5
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-5HERQ5FX.js → chunk-Z3YEGSR4.js} +10 -10
- package/dist/{cli-B322UMvB.d.ts → cli-O3F-ht3i.d.ts} +5 -5
- package/dist/cli.d.ts +17 -15
- package/dist/cli.js +92 -91
- package/dist/coding/pre-action-gate.d.ts +2 -1
- package/dist/compounding/engine.d.ts +5 -2
- package/dist/compounding/engine.js +24 -24
- package/dist/compounding/preference-consolidator.d.ts +4 -3
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config-security.js +2 -2
- package/dist/config.d.ts +2 -1
- package/dist/config.js +10 -9
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +23 -23
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +23 -23
- package/dist/consolidation-provenance-check.d.ts +5 -2
- package/dist/consolidation-provenance-check.js +2 -2
- package/dist/consolidation-undo.d.ts +5 -2
- package/dist/context-summary.d.ts +43 -0
- package/dist/context-summary.js +14 -0
- package/dist/context-summary.js.map +1 -0
- package/dist/contradiction/index.d.ts +6 -3
- package/dist/contradiction/index.js +5 -5
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +5 -2
- package/dist/convergence-refresh.js +26 -26
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- 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 +25 -25
- package/dist/cross-lingual-recall.d.ts +2 -1
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.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-BGcNairQ.d.ts → dependency-propagation-delivery-CL6RWXTA.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 +5 -2
- package/dist/entity-retrieval.js +24 -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/event-order-recall.js +3 -3
- package/dist/explicit-capture.d.ts +13 -11
- package/dist/explicit-capture.js +6 -6
- package/dist/external-wiki-access.d.ts +15 -13
- package/dist/external-wiki-access.js +43 -43
- 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 +15 -13
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- 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-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 +31 -31
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
- 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-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 +1 -1
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/{index-By2QUAMh.d.ts → index-C7Xep6S9.d.ts} +2 -2
- package/dist/index.d.ts +703 -701
- package/dist/index.js +225 -196
- package/dist/intent.d.ts +2 -1
- package/dist/lcm/engine.d.ts +3 -2
- package/dist/lcm/engine.js +5 -4
- package/dist/lcm/index.d.ts +4 -2
- package/dist/lcm/index.js +12 -11
- package/dist/lcm/summarizer.d.ts +4 -6
- package/dist/lcm/summarizer.js +2 -1
- package/dist/lcm/tools.d.ts +4 -3
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/local-llm.d.ts +2 -1
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +24 -24
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
- package/dist/maintenance/rebuild-memory-projection.d.ts +5 -2
- package/dist/maintenance/rebuild-memory-projection.js +25 -25
- package/dist/{maintenance-Dm2McrIx.d.ts → maintenance-CJ-xqFp0.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +15 -13
- package/dist/memory-action-policy.d.ts +18 -2
- package/dist/memory-action-policy.js +3 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-controller.d.ts +2 -1
- package/dist/memory-controller.js +2 -2
- 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 +15 -13
- package/dist/memory-subject.d.ts +15 -13
- package/dist/memory-subject.js +3 -3
- package/dist/memory-worth-outcomes.d.ts +5 -2
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +6 -3
- package/dist/namespaces/migrate.js +24 -24
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.d.ts +6 -3
- package/dist/namespaces/storage.js +23 -23
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +2 -2
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +26 -26
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +6 -3
- package/dist/operator-toolkit.js +38 -37
- package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
- package/dist/orchestration/maintenance.d.ts +7 -4
- package/dist/orchestration/maintenance.js +31 -31
- package/dist/{orchestrator-Co1DyfuP.d.ts → orchestrator-BsntWxLy.d.ts} +8 -8
- package/dist/orchestrator.d.ts +13 -11
- package/dist/orchestrator.js +143 -140
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-DotMnb6y.d.ts → pipeline-CVoysPm2.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-PJRtnSi-.d.ts → public-http-CuOxlTC2.d.ts} +1 -1
- package/dist/{qmd-BP0n11fR.d.ts → qmd-DWMAGA5l.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 +4 -4
- 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-planner-llm.d.ts +2 -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 +2 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +2 -1
- package/dist/reconcile/manifest.d.ts +2 -1
- package/dist/reconcile/manifest.js +3 -3
- 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-4552BNRV.js → resolution-XWBPKYFB.js} +6 -6
- package/dist/resolution-XWBPKYFB.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +11 -10
- 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/salvage-envelope.d.ts +2 -1
- package/dist/salvage-envelope.js +5 -5
- package/dist/schemas.d.ts +124 -124
- package/dist/{scope-profiles-6ChZKTy-.d.ts → scope-profiles-CPWkW_dI.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 +8 -8
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +14 -14
- 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-DziYcW5J.d.ts → semantic-consolidation-CNFVBXFc.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +29 -29
- package/dist/semantic-rule-promotion.js +23 -23
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +23 -23
- package/dist/{service-C7rIBuK_.d.ts → service-Bb-JIdQ0.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 +8 -7
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +27 -27
- package/dist/{storage-B1hEx8Xg.d.ts → storage-CukrlNKk.d.ts} +4 -1
- package/dist/storage.d.ts +5 -2
- package/dist/storage.js +22 -22
- package/dist/subject-config.d.ts +2 -1
- package/dist/subject-config.js +4 -4
- package/dist/summarizer.d.ts +2 -1
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/support-passport/index.d.ts +18 -16
- package/dist/support-passport/index.js +45 -45
- 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 +5 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/types.d.ts +78 -78
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/{types-BHDNxGTT.d.ts → types-djxQlxJ7.d.ts} +2 -1
- 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 +23 -23
- package/dist/who-knows-cli.d.ts +15 -13
- package/dist/who-knows-cli.js +24 -24
- package/dist/who-knows.d.ts +15 -13
- package/dist/who-knows.js +23 -23
- package/dist/write-envelope.d.ts +2 -1
- package/dist/write-envelope.js +4 -4
- package/package.json +22 -2
- package/src/active-context-config.ts +98 -0
- package/src/active-context-transform.test.ts +533 -0
- package/src/active-context-transform.ts +981 -0
- package/src/config.ts +3 -5
- package/src/context-summary.ts +182 -0
- package/src/index.ts +4 -11
- package/src/lcm/summarizer.ts +14 -93
- package/src/memory-action-policy.ts +28 -0
- package/src/storage/context-transform-ledger.ts +39 -0
- package/src/storage/secure-line-reader.ts +50 -1
- package/src/storage.ts +4 -1
- package/src/types.ts +2 -3
- package/dist/chunk-BJTHRFFC.js.map +0 -1
- package/dist/chunk-D4QVPP3G.js.map +0 -1
- package/dist/chunk-DVYRD4HY.js.map +0 -1
- package/dist/chunk-LBFFNDFM.js.map +0 -1
- package/dist/chunk-ZPUIRTIZ.js.map +0 -1
- /package/dist/{resolution-4552BNRV.js.map → active-context-config.js.map} +0 -0
- /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-2YPITIWN.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-S3K2CIK5.js.map → chunk-3A2NJP2U.js.map} +0 -0
- /package/dist/{chunk-OPGL46PX.js.map → chunk-3PKAS6VL.js.map} +0 -0
- /package/dist/{chunk-GTSVEEP3.js.map → chunk-3SZD4CYO.js.map} +0 -0
- /package/dist/{chunk-YKWFK7XA.js.map → chunk-4F4AQFWL.js.map} +0 -0
- /package/dist/{chunk-RGCF4XNH.js.map → chunk-4QEYREAV.js.map} +0 -0
- /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
- /package/dist/{chunk-3RI5Y7KU.js.map → chunk-5DHKCO52.js.map} +0 -0
- /package/dist/{chunk-VKCAHCBI.js.map → chunk-5RWZH6PH.js.map} +0 -0
- /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
- /package/dist/{chunk-A32YEQAM.js.map → chunk-76DIF5KT.js.map} +0 -0
- /package/dist/{chunk-OPPBTPUU.js.map → chunk-7KQB4EBS.js.map} +0 -0
- /package/dist/{chunk-I2HTKOOP.js.map → chunk-7VZFRUQU.js.map} +0 -0
- /package/dist/{chunk-JCWY73FK.js.map → chunk-AHPIFKNG.js.map} +0 -0
- /package/dist/{chunk-IP4ZNT4U.js.map → chunk-AZMLH5UT.js.map} +0 -0
- /package/dist/{chunk-JOEJG4SD.js.map → chunk-BEC4YBNA.js.map} +0 -0
- /package/dist/{chunk-VXVZ2GM3.js.map → chunk-CAMNRAJF.js.map} +0 -0
- /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
- /package/dist/{chunk-YOXVZJFM.js.map → chunk-CFVTRUR3.js.map} +0 -0
- /package/dist/{chunk-SVSRPG6M.js.map → chunk-CPA5NBHN.js.map} +0 -0
- /package/dist/{chunk-7BEPVIH3.js.map → chunk-CRML27CO.js.map} +0 -0
- /package/dist/{chunk-IY7UXD3J.js.map → chunk-DA7ITC5Z.js.map} +0 -0
- /package/dist/{chunk-AFR6AIM4.js.map → chunk-DEACDKE3.js.map} +0 -0
- /package/dist/{chunk-NG3MBQV4.js.map → chunk-DPCXDG7G.js.map} +0 -0
- /package/dist/{chunk-HZNYJN77.js.map → chunk-F3NVYTTA.js.map} +0 -0
- /package/dist/{chunk-PDDSFELN.js.map → chunk-F7XUD3PL.js.map} +0 -0
- /package/dist/{chunk-YWSQD2IB.js.map → chunk-GTO56JY5.js.map} +0 -0
- /package/dist/{chunk-RAIUTAZZ.js.map → chunk-H2YSH3DG.js.map} +0 -0
- /package/dist/{chunk-F6QHHRWP.js.map → chunk-HMZKGHMD.js.map} +0 -0
- /package/dist/{chunk-ZIJDI4CP.js.map → chunk-HRHO3ZNG.js.map} +0 -0
- /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
- /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
- /package/dist/{chunk-TR7DGXGI.js.map → chunk-JOZUBF4A.js.map} +0 -0
- /package/dist/{chunk-I7EX6KSH.js.map → chunk-JYSN42VN.js.map} +0 -0
- /package/dist/{chunk-FMQ4MOQO.js.map → chunk-KZIF6XHX.js.map} +0 -0
- /package/dist/{chunk-RIAM7DND.js.map → chunk-LDKPDODJ.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
- /package/dist/{chunk-LLQCM2U2.js.map → chunk-LKYIOCWL.js.map} +0 -0
- /package/dist/{chunk-5S4LQOPE.js.map → chunk-LOXHYCVS.js.map} +0 -0
- /package/dist/{chunk-ANJXPFRS.js.map → chunk-LPNCR4QK.js.map} +0 -0
- /package/dist/{chunk-GEPACVWN.js.map → chunk-MDD2RINF.js.map} +0 -0
- /package/dist/{chunk-6CPUQ5D6.js.map → chunk-MY2BC6UE.js.map} +0 -0
- /package/dist/{chunk-CFGU52XJ.js.map → chunk-NPFUNWNX.js.map} +0 -0
- /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
- /package/dist/{chunk-5DH6PG4B.js.map → chunk-OA2O2GJ4.js.map} +0 -0
- /package/dist/{chunk-JAQXUGLN.js.map → chunk-ODU2CNNX.js.map} +0 -0
- /package/dist/{chunk-RQE4TITU.js.map → chunk-OXRRJXPR.js.map} +0 -0
- /package/dist/{chunk-SEA6M7SS.js.map → chunk-P36Z4JRA.js.map} +0 -0
- /package/dist/{chunk-Z4U3UN56.js.map → chunk-PU56CXZA.js.map} +0 -0
- /package/dist/{chunk-5VPQSRQO.js.map → chunk-S5XOSTYM.js.map} +0 -0
- /package/dist/{chunk-SVVIASVX.js.map → chunk-SEEJOGQX.js.map} +0 -0
- /package/dist/{chunk-7TCGNUVP.js.map → chunk-SNOIKAHM.js.map} +0 -0
- /package/dist/{chunk-7F27PCSN.js.map → chunk-T6ILXUAH.js.map} +0 -0
- /package/dist/{chunk-EOHKUWXW.js.map → chunk-T7XP6IZE.js.map} +0 -0
- /package/dist/{chunk-7WR462EM.js.map → chunk-TFR3HG4K.js.map} +0 -0
- /package/dist/{chunk-YRVAKONL.js.map → chunk-TUHBYJXL.js.map} +0 -0
- /package/dist/{chunk-F635GAL7.js.map → chunk-U7EW2W4W.js.map} +0 -0
- /package/dist/{chunk-VFYRYFLL.js.map → chunk-UEBDCMOO.js.map} +0 -0
- /package/dist/{chunk-WTOZBZNN.js.map → chunk-UENKPWCS.js.map} +0 -0
- /package/dist/{chunk-AAXJNINV.js.map → chunk-UL4MKZHI.js.map} +0 -0
- /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
- /package/dist/{chunk-ACOC27BB.js.map → chunk-UPFNQJC7.js.map} +0 -0
- /package/dist/{chunk-W4BMEGQA.js.map → chunk-UTQUEHC7.js.map} +0 -0
- /package/dist/{chunk-I32NKXE2.js.map → chunk-V4IDF3EZ.js.map} +0 -0
- /package/dist/{chunk-ZAOHJDKH.js.map → chunk-WNXYT4MK.js.map} +0 -0
- /package/dist/{chunk-T42L3S6A.js.map → chunk-XBGHAAKR.js.map} +0 -0
- /package/dist/{chunk-I4343FIA.js.map → chunk-XNWXSGHS.js.map} +0 -0
- /package/dist/{chunk-THG4GYIE.js.map → chunk-YEUXERJ6.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
- /package/dist/{chunk-5HERQ5FX.js.map → chunk-Z3YEGSR4.js.map} +0 -0
- /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
import {
|
|
2
|
+
evaluateActiveContextTransformPolicy
|
|
3
|
+
} from "./chunk-MI2OTWV5.js";
|
|
4
|
+
import {
|
|
5
|
+
ContextSummaryUnavailableError,
|
|
6
|
+
summarizeContextPure
|
|
7
|
+
} from "./chunk-43HUVDTD.js";
|
|
8
|
+
import {
|
|
9
|
+
DEFAULT_ACTIVE_CONTEXT_CAPS
|
|
10
|
+
} from "./chunk-B32WYRXX.js";
|
|
11
|
+
|
|
12
|
+
// src/active-context-transform.ts
|
|
13
|
+
import { createHash } from "crypto";
|
|
14
|
+
var ACTIVE_CONTEXT_ALGORITHM_VERSION = "active-context-transform/1";
|
|
15
|
+
var ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION = 1;
|
|
16
|
+
var ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION = 1;
|
|
17
|
+
var ACTIVE_CONTEXT_RECEIPT_SCHEMA_VERSION = 1;
|
|
18
|
+
var ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION = 1;
|
|
19
|
+
var PROTECTED_ROLES = { system: true, developer: true };
|
|
20
|
+
function sha256Hex(value) {
|
|
21
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
22
|
+
}
|
|
23
|
+
function canonicalJson(value) {
|
|
24
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
25
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
|
|
26
|
+
const entries = Object.entries(value).filter(([, v]) => v !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);
|
|
27
|
+
return `{${entries.join(",")}}`;
|
|
28
|
+
}
|
|
29
|
+
function hashSnapshot(snapshot) {
|
|
30
|
+
return sha256Hex(
|
|
31
|
+
canonicalJson({
|
|
32
|
+
namespace: snapshot.namespace,
|
|
33
|
+
revision: snapshot.revision,
|
|
34
|
+
sessionKey: snapshot.sessionKey,
|
|
35
|
+
messages: snapshot.messages.map((m) => ({
|
|
36
|
+
contentHash: sha256Hex(m.content),
|
|
37
|
+
id: m.id,
|
|
38
|
+
ordinal: m.ordinal,
|
|
39
|
+
role: m.role
|
|
40
|
+
}))
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
var VALID_PHASES = { plan: true, prepare: true };
|
|
45
|
+
var VALID_ROLES = {
|
|
46
|
+
system: true,
|
|
47
|
+
developer: true,
|
|
48
|
+
user: true,
|
|
49
|
+
assistant: true,
|
|
50
|
+
tool: true
|
|
51
|
+
};
|
|
52
|
+
function rejectedPlan(operation, errorCode, context, policy) {
|
|
53
|
+
const planId = `actx-rejected-${sha256Hex(`${operation}:${errorCode}:${policy.rationale}`).slice(0, 12)}`;
|
|
54
|
+
return {
|
|
55
|
+
schemaVersion: ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION,
|
|
56
|
+
planId,
|
|
57
|
+
planHash: sha256Hex(canonicalJson({ planId, errorCode, operation })),
|
|
58
|
+
operation,
|
|
59
|
+
status: "rejected",
|
|
60
|
+
errorCode,
|
|
61
|
+
precondition: context ? {
|
|
62
|
+
principal: context.scope.principal,
|
|
63
|
+
sessionKey: context.scope.sessionKey,
|
|
64
|
+
namespace: context.scope.namespace,
|
|
65
|
+
adapterId: context.scope.adapterId,
|
|
66
|
+
snapshotRevision: context.snapshotRevision,
|
|
67
|
+
expiresAt: context.expiresAt
|
|
68
|
+
} : {
|
|
69
|
+
principal: "",
|
|
70
|
+
sessionKey: "",
|
|
71
|
+
namespace: "",
|
|
72
|
+
adapterId: "",
|
|
73
|
+
snapshotRevision: "",
|
|
74
|
+
expiresAt: ""
|
|
75
|
+
},
|
|
76
|
+
selectedMessageIds: [],
|
|
77
|
+
retainedMessageIds: [],
|
|
78
|
+
proposedRemovalIds: [],
|
|
79
|
+
preserve: { protectedMessageIds: [], minimumRetainedMessages: 0 },
|
|
80
|
+
inverse: { kind: "restore-source-message-ids", sourceMessageIds: [] },
|
|
81
|
+
retention: {
|
|
82
|
+
planId,
|
|
83
|
+
mode: "adapter-local",
|
|
84
|
+
expiresAt: "",
|
|
85
|
+
maxBytes: 0,
|
|
86
|
+
snapshotContentHash: context?.snapshotContentHash ?? ""
|
|
87
|
+
},
|
|
88
|
+
provenance: {
|
|
89
|
+
algorithmVersion: ACTIVE_CONTEXT_ALGORITHM_VERSION,
|
|
90
|
+
selectorHash: "",
|
|
91
|
+
snapshotContentHash: context?.snapshotContentHash ?? "",
|
|
92
|
+
generatedAt: context?.generatedAt ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
93
|
+
},
|
|
94
|
+
policy
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
var PlanReject = class extends Error {
|
|
98
|
+
constructor(code) {
|
|
99
|
+
super(code);
|
|
100
|
+
this.code = code;
|
|
101
|
+
}
|
|
102
|
+
code;
|
|
103
|
+
};
|
|
104
|
+
function buildContext(request, deps) {
|
|
105
|
+
const caps = deps.caps ?? {
|
|
106
|
+
...DEFAULT_ACTIVE_CONTEXT_CAPS,
|
|
107
|
+
activeContextTransforms: true,
|
|
108
|
+
activeContextLlm: false
|
|
109
|
+
};
|
|
110
|
+
const scope = deps.resolvedScope;
|
|
111
|
+
if (!scope || !scope.sessionKey || !scope.namespace || !scope.principal || !scope.adapterId) {
|
|
112
|
+
throw new PlanReject("scope_mismatch");
|
|
113
|
+
}
|
|
114
|
+
if (request.snapshot.sessionKey !== scope.sessionKey) throw new PlanReject("scope_mismatch");
|
|
115
|
+
if (request.snapshot.namespace !== scope.namespace) throw new PlanReject("scope_mismatch");
|
|
116
|
+
const snapshot = request.snapshot;
|
|
117
|
+
if (snapshot.schemaVersion !== ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION) {
|
|
118
|
+
throw new PlanReject("invalid_request");
|
|
119
|
+
}
|
|
120
|
+
if (!Array.isArray(snapshot.messages) || snapshot.messages.length === 0) {
|
|
121
|
+
throw new PlanReject("invalid_request");
|
|
122
|
+
}
|
|
123
|
+
const byId = /* @__PURE__ */ new Map();
|
|
124
|
+
let totalChars = 0;
|
|
125
|
+
for (const message of snapshot.messages) {
|
|
126
|
+
if (typeof message?.id !== "string" || message.id.length === 0 || typeof message.content !== "string" || VALID_ROLES[message.role] !== true) {
|
|
127
|
+
throw new PlanReject("invalid_request");
|
|
128
|
+
}
|
|
129
|
+
if (byId.has(message.id)) throw new PlanReject("invalid_request");
|
|
130
|
+
byId.set(message.id, message);
|
|
131
|
+
totalChars += message.content.length;
|
|
132
|
+
}
|
|
133
|
+
if (snapshot.messages.length > caps.activeContextMaxMessages) throw new PlanReject("invalid_request");
|
|
134
|
+
if (totalChars > caps.activeContextMaxSnapshotChars) throw new PlanReject("invalid_request");
|
|
135
|
+
const now = (deps.now ?? (() => /* @__PURE__ */ new Date()))();
|
|
136
|
+
const generatedAt = now.toISOString();
|
|
137
|
+
const expiresAt = new Date(now.getTime() + caps.activeContextPlanTtlMinutes * 6e4).toISOString();
|
|
138
|
+
return {
|
|
139
|
+
caps,
|
|
140
|
+
scope,
|
|
141
|
+
snapshotRevision: snapshot.revision,
|
|
142
|
+
byId,
|
|
143
|
+
ordered: [...snapshot.messages].sort((a, b) => a.ordinal - b.ordinal || a.id.localeCompare(b.id)),
|
|
144
|
+
snapshotContentHash: hashSnapshot(snapshot),
|
|
145
|
+
generatedAt,
|
|
146
|
+
expiresAt
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function resolveSelection(request, context) {
|
|
150
|
+
const messageIds = request.selector?.messageIds;
|
|
151
|
+
const span = request.selector?.span;
|
|
152
|
+
const hasIds = Array.isArray(messageIds) && messageIds.length > 0;
|
|
153
|
+
if (hasIds === (span !== void 0)) throw new PlanReject("invalid_request");
|
|
154
|
+
if (hasIds && messageIds) {
|
|
155
|
+
const seen = /* @__PURE__ */ new Set();
|
|
156
|
+
const picked = [];
|
|
157
|
+
for (const id of messageIds) {
|
|
158
|
+
if (seen.has(id)) throw new PlanReject("invalid_request");
|
|
159
|
+
seen.add(id);
|
|
160
|
+
const message = context.byId.get(id);
|
|
161
|
+
if (!message) throw new PlanReject("invalid_request");
|
|
162
|
+
picked.push(message);
|
|
163
|
+
}
|
|
164
|
+
return picked.sort((a, b) => a.ordinal - b.ordinal || a.id.localeCompare(b.id));
|
|
165
|
+
}
|
|
166
|
+
if (!span) throw new PlanReject("invalid_request");
|
|
167
|
+
const { startMessageId, endMessageId } = span;
|
|
168
|
+
const start = context.byId.get(startMessageId);
|
|
169
|
+
const end = context.byId.get(endMessageId);
|
|
170
|
+
if (!start || !end) throw new PlanReject("invalid_request");
|
|
171
|
+
if (start.ordinal > end.ordinal) throw new PlanReject("invalid_request");
|
|
172
|
+
const inSpan = context.ordered.filter(
|
|
173
|
+
(m) => m.ordinal >= start.ordinal && m.ordinal <= end.ordinal
|
|
174
|
+
// closed and full
|
|
175
|
+
);
|
|
176
|
+
if (inSpan.length === 0) throw new PlanReject("invalid_request");
|
|
177
|
+
return inSpan;
|
|
178
|
+
}
|
|
179
|
+
function protectedIdSet(request, context) {
|
|
180
|
+
const protectedIds = /* @__PURE__ */ new Set();
|
|
181
|
+
for (const message of context.ordered) {
|
|
182
|
+
if (PROTECTED_ROLES[message.role] === true || message.protected === true) {
|
|
183
|
+
protectedIds.add(message.id);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
for (const role of request.preserve?.roles ?? []) {
|
|
187
|
+
if (PROTECTED_ROLES[role] === true) continue;
|
|
188
|
+
for (const message of context.ordered) {
|
|
189
|
+
if (message.role === role) protectedIds.add(message.id);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
for (const id of request.preserve?.messageIds ?? []) {
|
|
193
|
+
if (context.byId.has(id)) protectedIds.add(id);
|
|
194
|
+
}
|
|
195
|
+
return protectedIds;
|
|
196
|
+
}
|
|
197
|
+
function planActiveContextTransform(request, deps) {
|
|
198
|
+
const caps = deps.caps ?? { ...DEFAULT_ACTIVE_CONTEXT_CAPS, activeContextTransforms: true, activeContextLlm: false };
|
|
199
|
+
const policy = evaluateActiveContextTransformPolicy({
|
|
200
|
+
actionsEnabled: deps.actionsEnabled ?? caps.activeContextTransforms,
|
|
201
|
+
operation: request.operation
|
|
202
|
+
});
|
|
203
|
+
if (policy.decision === "deny") {
|
|
204
|
+
return rejectedPlan(request.operation, "feature_disabled", null, policy);
|
|
205
|
+
}
|
|
206
|
+
let context = null;
|
|
207
|
+
try {
|
|
208
|
+
if (request.schemaVersion !== ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION) {
|
|
209
|
+
throw new PlanReject("invalid_request");
|
|
210
|
+
}
|
|
211
|
+
if (request.operation !== "SUMMARY" && request.operation !== "FILTER") {
|
|
212
|
+
throw new PlanReject("invalid_request");
|
|
213
|
+
}
|
|
214
|
+
if (VALID_PHASES[request.phase] !== true) throw new PlanReject("invalid_request");
|
|
215
|
+
context = buildContext(request, deps);
|
|
216
|
+
if (request.expectedRevision !== void 0 && request.expectedRevision !== request.snapshot.revision) {
|
|
217
|
+
throw new PlanReject("stale_context");
|
|
218
|
+
}
|
|
219
|
+
const selected = resolveSelection(request, context);
|
|
220
|
+
const protectedIds = protectedIdSet(request, context);
|
|
221
|
+
const removable = selected.filter((m) => !protectedIds.has(m.id));
|
|
222
|
+
if (removable.length === 0) {
|
|
223
|
+
throw new PlanReject("preserve_conflict");
|
|
224
|
+
}
|
|
225
|
+
const minimumRetained = Math.max(
|
|
226
|
+
1,
|
|
227
|
+
request.preserve?.minRetainedMessages ?? caps.activeContextMinRetainedMessages
|
|
228
|
+
);
|
|
229
|
+
const idList = (messages) => messages.map((m) => m.id);
|
|
230
|
+
const allIds = idList(context.ordered);
|
|
231
|
+
const selectorHash = sha256Hex(canonicalJson(request.selector ?? {}));
|
|
232
|
+
if (request.operation === "FILTER") {
|
|
233
|
+
return buildFilterPlan(request, deps, context, {
|
|
234
|
+
selected,
|
|
235
|
+
removable,
|
|
236
|
+
protectedIds,
|
|
237
|
+
minimumRetained,
|
|
238
|
+
allIds,
|
|
239
|
+
selectorHash,
|
|
240
|
+
policy
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return buildSummaryPlan(request, deps, context, {
|
|
244
|
+
selected,
|
|
245
|
+
removable,
|
|
246
|
+
protectedIds,
|
|
247
|
+
minimumRetained,
|
|
248
|
+
allIds,
|
|
249
|
+
selectorHash,
|
|
250
|
+
policy
|
|
251
|
+
});
|
|
252
|
+
} catch (err) {
|
|
253
|
+
if (err instanceof PlanReject) {
|
|
254
|
+
return rejectedPlan(request.operation, err.code, context, policy);
|
|
255
|
+
}
|
|
256
|
+
throw err;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function finalizePlan(operation, context, bundle, proposedRemovalIds, extras) {
|
|
260
|
+
const retainedIds = bundle.allIds.filter((id) => !proposedRemovalIds.includes(id));
|
|
261
|
+
if (retainedIds.length < bundle.minimumRetained) {
|
|
262
|
+
throw new PlanReject("preserve_conflict");
|
|
263
|
+
}
|
|
264
|
+
const sourceMessageIds = bundle.removable.map((m) => m.id);
|
|
265
|
+
const precondition = {
|
|
266
|
+
principal: context.scope.principal,
|
|
267
|
+
sessionKey: context.scope.sessionKey,
|
|
268
|
+
namespace: context.scope.namespace,
|
|
269
|
+
adapterId: context.scope.adapterId,
|
|
270
|
+
snapshotRevision: context.snapshotRevision,
|
|
271
|
+
expiresAt: context.expiresAt
|
|
272
|
+
};
|
|
273
|
+
const provenance = {
|
|
274
|
+
algorithmVersion: ACTIVE_CONTEXT_ALGORITHM_VERSION,
|
|
275
|
+
selectorHash: bundle.selectorHash,
|
|
276
|
+
snapshotContentHash: context.snapshotContentHash,
|
|
277
|
+
...extras.criterionHash ? { criterionHash: extras.criterionHash } : {},
|
|
278
|
+
...extras.sourcePromptHash ? { sourcePromptHash: extras.sourcePromptHash } : {},
|
|
279
|
+
generatedAt: context.generatedAt
|
|
280
|
+
};
|
|
281
|
+
const planId = `actx-${sha256Hex(
|
|
282
|
+
canonicalJson({
|
|
283
|
+
adapterId: precondition.adapterId,
|
|
284
|
+
criterionHash: extras.criterionHash,
|
|
285
|
+
namespace: precondition.namespace,
|
|
286
|
+
operation,
|
|
287
|
+
principal: precondition.principal,
|
|
288
|
+
selectorHash: bundle.selectorHash,
|
|
289
|
+
sessionKey: precondition.sessionKey,
|
|
290
|
+
snapshotContentHash: context.snapshotContentHash
|
|
291
|
+
})
|
|
292
|
+
).slice(0, 16)}`;
|
|
293
|
+
const planBody = {
|
|
294
|
+
operation,
|
|
295
|
+
planId,
|
|
296
|
+
precondition,
|
|
297
|
+
proposedRemovalIds,
|
|
298
|
+
replacementMessageId: extras.replacement?.messageId,
|
|
299
|
+
replacementSourceIds: extras.replacement?.sourceMessageIds,
|
|
300
|
+
retainedIds,
|
|
301
|
+
selectedIds: bundle.selected.map((m) => m.id)
|
|
302
|
+
};
|
|
303
|
+
const planHash = sha256Hex(canonicalJson(planBody));
|
|
304
|
+
return {
|
|
305
|
+
schemaVersion: ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION,
|
|
306
|
+
planId,
|
|
307
|
+
planHash,
|
|
308
|
+
operation,
|
|
309
|
+
status: "ready",
|
|
310
|
+
precondition,
|
|
311
|
+
selectedMessageIds: planBody.selectedIds,
|
|
312
|
+
retainedMessageIds: retainedIds,
|
|
313
|
+
proposedRemovalIds,
|
|
314
|
+
...extras.scoreRows ? { scoreRows: extras.scoreRows } : {},
|
|
315
|
+
...extras.replacement ? { replacement: extras.replacement } : {},
|
|
316
|
+
preserve: {
|
|
317
|
+
protectedMessageIds: [...bundle.protectedIds],
|
|
318
|
+
minimumRetainedMessages: bundle.minimumRetained
|
|
319
|
+
},
|
|
320
|
+
inverse: {
|
|
321
|
+
kind: "restore-source-message-ids",
|
|
322
|
+
sourceMessageIds,
|
|
323
|
+
...extras.replacement ? { removeReplacementMessageId: extras.replacement.messageId } : {},
|
|
324
|
+
expectedAppliedPlanHash: planHash
|
|
325
|
+
},
|
|
326
|
+
retention: {
|
|
327
|
+
planId,
|
|
328
|
+
mode: "adapter-local",
|
|
329
|
+
expiresAt: context.expiresAt,
|
|
330
|
+
maxBytes: context.caps.activeContextRetentionMaxBytes,
|
|
331
|
+
snapshotContentHash: context.snapshotContentHash
|
|
332
|
+
},
|
|
333
|
+
provenance,
|
|
334
|
+
policy: bundle.policy
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
function buildFilterPlan(request, deps, context, bundle) {
|
|
338
|
+
const filter = request.filter;
|
|
339
|
+
if (!filter || typeof filter.keepCriterion !== "string" || filter.keepCriterion.length === 0) {
|
|
340
|
+
throw new PlanReject("invalid_request");
|
|
341
|
+
}
|
|
342
|
+
const threshold = filter.threshold;
|
|
343
|
+
if (typeof threshold !== "number" || !Number.isFinite(threshold) || threshold < 0 || threshold > 1) {
|
|
344
|
+
throw new PlanReject("invalid_request");
|
|
345
|
+
}
|
|
346
|
+
if (!deps.scoreMessage) {
|
|
347
|
+
throw new PlanReject("filter_unavailable");
|
|
348
|
+
}
|
|
349
|
+
const scoreRows = [];
|
|
350
|
+
const removalIds = [];
|
|
351
|
+
for (const message of bundle.removable) {
|
|
352
|
+
const score = deps.scoreMessage(message);
|
|
353
|
+
if (typeof score !== "number" || !Number.isFinite(score) || score < 0 || score > 1) {
|
|
354
|
+
throw new PlanReject("filter_unavailable");
|
|
355
|
+
}
|
|
356
|
+
const decision = score >= threshold ? "keep" : "drop";
|
|
357
|
+
scoreRows.push({ messageId: message.id, score, decision });
|
|
358
|
+
if (decision === "drop") removalIds.push(message.id);
|
|
359
|
+
}
|
|
360
|
+
return finalizePlan("FILTER", context, bundle, removalIds, {
|
|
361
|
+
scoreRows,
|
|
362
|
+
criterionHash: sha256Hex(filter.keepCriterion),
|
|
363
|
+
// hash, never the rule text
|
|
364
|
+
sourcePromptHash: request.sourcePromptHash
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
function buildSummaryPlan(request, deps, context, bundle) {
|
|
368
|
+
const requested = request.summary?.method ?? "deterministic";
|
|
369
|
+
const llmEnabled = context.caps.activeContextLlm;
|
|
370
|
+
let method;
|
|
371
|
+
let fallbackPolicy;
|
|
372
|
+
if (requested === "deterministic") {
|
|
373
|
+
method = "deterministic";
|
|
374
|
+
fallbackPolicy = "none";
|
|
375
|
+
} else if (requested === "llm") {
|
|
376
|
+
if (!llmEnabled) throw new PlanReject("unsupported");
|
|
377
|
+
method = "llm";
|
|
378
|
+
fallbackPolicy = "none";
|
|
379
|
+
} else {
|
|
380
|
+
method = llmEnabled && deps.summarize ? "llm" : "deterministic";
|
|
381
|
+
fallbackPolicy = method === "llm" ? "allowed" : "none";
|
|
382
|
+
}
|
|
383
|
+
const requestedTokens = request.summary?.targetTokens ?? context.caps.activeContextSummaryMaxTokens;
|
|
384
|
+
if (typeof requestedTokens !== "number" || !Number.isFinite(requestedTokens) || requestedTokens <= 0 || requestedTokens > context.caps.activeContextSummaryMaxTokens) {
|
|
385
|
+
throw new PlanReject("invalid_request");
|
|
386
|
+
}
|
|
387
|
+
const targetTokens = Math.floor(requestedTokens);
|
|
388
|
+
const replacementSeed = sha256Hex(
|
|
389
|
+
canonicalJson({
|
|
390
|
+
operation: "SUMMARY",
|
|
391
|
+
selectorHash: bundle.selectorHash,
|
|
392
|
+
snapshotContentHash: context.snapshotContentHash,
|
|
393
|
+
sessionKey: context.scope.sessionKey,
|
|
394
|
+
namespace: context.scope.namespace,
|
|
395
|
+
principal: context.scope.principal,
|
|
396
|
+
adapterId: context.scope.adapterId
|
|
397
|
+
})
|
|
398
|
+
);
|
|
399
|
+
const replacement = {
|
|
400
|
+
messageId: `actxr-${replacementSeed.slice(0, 16)}`,
|
|
401
|
+
sourceMessageIds: bundle.removable.map((m) => m.id),
|
|
402
|
+
method,
|
|
403
|
+
fallbackPolicy,
|
|
404
|
+
targetTokens
|
|
405
|
+
};
|
|
406
|
+
const plan = finalizePlan("SUMMARY", context, bundle, [...replacement.sourceMessageIds], {
|
|
407
|
+
replacement,
|
|
408
|
+
sourcePromptHash: request.sourcePromptHash
|
|
409
|
+
});
|
|
410
|
+
return plan;
|
|
411
|
+
}
|
|
412
|
+
async function prepareActiveContextTransform(plan, deps) {
|
|
413
|
+
if (plan.status !== "ready") {
|
|
414
|
+
return { status: "rejected", plan, errorCode: plan.errorCode ?? "invalid_request" };
|
|
415
|
+
}
|
|
416
|
+
const scope = deps.resolvedScope;
|
|
417
|
+
const p = plan.precondition;
|
|
418
|
+
if (!scope || scope.principal !== p.principal || scope.sessionKey !== p.sessionKey || scope.namespace !== p.namespace || scope.adapterId !== p.adapterId) {
|
|
419
|
+
return { status: "rejected", plan, errorCode: "scope_mismatch" };
|
|
420
|
+
}
|
|
421
|
+
const now = deps.now?.() ?? /* @__PURE__ */ new Date();
|
|
422
|
+
if (now.getTime() >= new Date(plan.retention.expiresAt).getTime()) {
|
|
423
|
+
return { status: "rejected", plan, errorCode: "stale_context" };
|
|
424
|
+
}
|
|
425
|
+
if (deps.snapshot.sessionKey !== p.sessionKey || deps.snapshot.namespace !== p.namespace) {
|
|
426
|
+
return { status: "rejected", plan, errorCode: "scope_mismatch" };
|
|
427
|
+
}
|
|
428
|
+
const fenceHash = hashSnapshot(deps.snapshot);
|
|
429
|
+
if (fenceHash !== plan.provenance.snapshotContentHash) {
|
|
430
|
+
return { status: "rejected", plan, errorCode: "plan_conflict" };
|
|
431
|
+
}
|
|
432
|
+
if (plan.operation === "FILTER") {
|
|
433
|
+
return { status: "ready", plan };
|
|
434
|
+
}
|
|
435
|
+
const replacement = plan.replacement;
|
|
436
|
+
if (!replacement) {
|
|
437
|
+
return { status: "failed", plan, errorCode: "invalid_request" };
|
|
438
|
+
}
|
|
439
|
+
const byId = new Map(deps.snapshot.messages.map((m) => [m.id, m]));
|
|
440
|
+
const sourceText = replacement.sourceMessageIds.map((id) => byId.get(id)).filter((m) => m !== void 0).sort((a, b) => a.ordinal - b.ordinal || a.id.localeCompare(b.id)).map((m) => m.content).join("\n\n");
|
|
441
|
+
const method = replacement.method === "deterministic" ? "deterministic" : replacement.fallbackPolicy === "allowed" ? "auto" : "llm";
|
|
442
|
+
try {
|
|
443
|
+
const result = await summarizeContextPure(sourceText, replacement.targetTokens, method, {
|
|
444
|
+
llm: deps.summarize,
|
|
445
|
+
deterministicMaxTokens: deps.caps?.activeContextSummaryMaxTokens ?? replacement.targetTokens
|
|
446
|
+
});
|
|
447
|
+
if (result.text.trim().length === 0) {
|
|
448
|
+
return { status: "failed", plan, errorCode: "summary_unavailable" };
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
status: "ready",
|
|
452
|
+
plan,
|
|
453
|
+
replacement: {
|
|
454
|
+
messageId: replacement.messageId,
|
|
455
|
+
text: result.text,
|
|
456
|
+
contentHash: sha256Hex(result.text),
|
|
457
|
+
method: result.method,
|
|
458
|
+
...result.modelUsed ? { modelUsed: result.modelUsed } : {},
|
|
459
|
+
fallback: result.fallback,
|
|
460
|
+
sourceMessageIds: replacement.sourceMessageIds
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
} catch (err) {
|
|
464
|
+
if (err instanceof ContextSummaryUnavailableError) {
|
|
465
|
+
return { status: "failed", plan, errorCode: "summary_unavailable" };
|
|
466
|
+
}
|
|
467
|
+
throw err;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
async function recordActiveContextApplyReceipt(plan, receipt, trustedScope, recorder) {
|
|
471
|
+
const p = plan.precondition;
|
|
472
|
+
const scopeMatch = trustedScope.principal === p.principal && trustedScope.sessionKey === p.sessionKey && trustedScope.namespace === p.namespace && trustedScope.adapterId === p.adapterId && receipt.adapterId === trustedScope.adapterId;
|
|
473
|
+
if (!scopeMatch) throw new PlanReject("scope_mismatch");
|
|
474
|
+
if (receipt.planHash !== plan.planHash) throw new PlanReject("plan_conflict");
|
|
475
|
+
if (receipt.hostRevisionBefore === void 0 || receipt.hostRevisionBefore !== p.snapshotRevision) {
|
|
476
|
+
throw new PlanReject("stale_context");
|
|
477
|
+
}
|
|
478
|
+
const shapeOk = receipt.schemaVersion === ACTIVE_CONTEXT_RECEIPT_SCHEMA_VERSION && receipt.planId === plan.planId && (receipt.outcome === "applied" || receipt.outcome === "skipped" || receipt.outcome === "failed") && typeof receipt.appliedAt === "string" && !Number.isNaN(Date.parse(receipt.appliedAt));
|
|
479
|
+
if (!shapeOk) throw new PlanReject("invalid_receipt");
|
|
480
|
+
const event = {
|
|
481
|
+
recordKind: "context_transform",
|
|
482
|
+
schemaVersion: ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION,
|
|
483
|
+
timestamp: receipt.appliedAt,
|
|
484
|
+
actionId: plan.planId,
|
|
485
|
+
action: plan.operation === "SUMMARY" ? "summarize_context" : "filter_context",
|
|
486
|
+
outcome: receipt.outcome,
|
|
487
|
+
status: receipt.outcome === "applied" ? "applied" : receipt.outcome === "failed" ? "rejected" : "validated",
|
|
488
|
+
subsystem: "active-context",
|
|
489
|
+
namespace: p.namespace,
|
|
490
|
+
sourceSessionKey: p.sessionKey,
|
|
491
|
+
planHash: plan.planHash,
|
|
492
|
+
snapshotRevision: p.snapshotRevision,
|
|
493
|
+
adapterId: receipt.adapterId,
|
|
494
|
+
algorithmVersion: plan.provenance.algorithmVersion,
|
|
495
|
+
selectedCount: plan.selectedMessageIds.length,
|
|
496
|
+
retainedCount: plan.retainedMessageIds.length,
|
|
497
|
+
proposedRemovalCount: plan.proposedRemovalIds.length,
|
|
498
|
+
receiptOutcome: receipt.outcome,
|
|
499
|
+
selectorHash: plan.provenance.selectorHash,
|
|
500
|
+
snapshotContentHash: plan.provenance.snapshotContentHash,
|
|
501
|
+
...plan.provenance.criterionHash ? { criterionHash: plan.provenance.criterionHash } : {},
|
|
502
|
+
...plan.provenance.sourcePromptHash ? { sourcePromptHash: plan.provenance.sourcePromptHash } : {},
|
|
503
|
+
policyDecision: plan.policy.decision,
|
|
504
|
+
policyRationale: plan.policy.rationale
|
|
505
|
+
};
|
|
506
|
+
let recorded = false;
|
|
507
|
+
try {
|
|
508
|
+
recorded = await recorder.append(event);
|
|
509
|
+
} catch {
|
|
510
|
+
recorded = false;
|
|
511
|
+
}
|
|
512
|
+
return { recorded, event: { ...event, telemetryRecorded: recorded } };
|
|
513
|
+
}
|
|
514
|
+
function buildContextTransformPlanEvent(plan, outcome) {
|
|
515
|
+
return {
|
|
516
|
+
recordKind: "context_transform",
|
|
517
|
+
schemaVersion: ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION,
|
|
518
|
+
timestamp: plan.provenance.generatedAt,
|
|
519
|
+
actionId: plan.planId,
|
|
520
|
+
action: plan.operation === "SUMMARY" ? "summarize_context" : "filter_context",
|
|
521
|
+
outcome,
|
|
522
|
+
status: plan.status === "ready" ? "validated" : "rejected",
|
|
523
|
+
subsystem: "active-context",
|
|
524
|
+
namespace: plan.precondition.namespace,
|
|
525
|
+
sourceSessionKey: plan.precondition.sessionKey,
|
|
526
|
+
planHash: plan.planHash,
|
|
527
|
+
snapshotRevision: plan.precondition.snapshotRevision,
|
|
528
|
+
algorithmVersion: plan.provenance.algorithmVersion,
|
|
529
|
+
selectedCount: plan.selectedMessageIds.length,
|
|
530
|
+
retainedCount: plan.retainedMessageIds.length,
|
|
531
|
+
proposedRemovalCount: plan.proposedRemovalIds.length,
|
|
532
|
+
selectorHash: plan.provenance.selectorHash,
|
|
533
|
+
snapshotContentHash: plan.provenance.snapshotContentHash,
|
|
534
|
+
...plan.provenance.criterionHash ? { criterionHash: plan.provenance.criterionHash } : {},
|
|
535
|
+
...plan.provenance.sourcePromptHash ? { sourcePromptHash: plan.provenance.sourcePromptHash } : {},
|
|
536
|
+
policyDecision: plan.policy.decision,
|
|
537
|
+
policyRationale: plan.policy.rationale,
|
|
538
|
+
telemetryRecorded: true
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
export {
|
|
543
|
+
ACTIVE_CONTEXT_ALGORITHM_VERSION,
|
|
544
|
+
ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION,
|
|
545
|
+
ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION,
|
|
546
|
+
ACTIVE_CONTEXT_RECEIPT_SCHEMA_VERSION,
|
|
547
|
+
ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION,
|
|
548
|
+
planActiveContextTransform,
|
|
549
|
+
prepareActiveContextTransform,
|
|
550
|
+
recordActiveContextApplyReceipt,
|
|
551
|
+
buildContextTransformPlanEvent
|
|
552
|
+
};
|
|
553
|
+
//# sourceMappingURL=chunk-LB7WCZHY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/active-context-transform.ts"],"sourcesContent":["/**\n * Host-agnostic active-context SUMMARY/FILTER plans (issue #2347).\n *\n * Core receives a short message list, checks the trusted scope first,\n * then IDs and limits, and returns a content-addressed plan. Core never\n * mutates host state or saved memory: the host adapter owns save, apply,\n * and undo; it reports back through {@link ActiveContextApplyReceipt}.\n * Plans and telemetry carry hashes and counts only — never raw message\n * text, keep rules, or summary output.\n *\n * Paper basis: AgeMem (arXiv:2601.01885v3) §3.1/A.1 eq. (14) Summary and\n * eq. (15) Filter. Selection is host-bounded (explicit IDs or one closed\n * span); `all` / last-N spans are never inferred. Filter keeps messages\n * with `score >= threshold` using a caller-supplied fixed score rule — an\n * LLM never picks drop IDs. Event counts back the design; no ship claim.\n */\nimport { createHash } from \"node:crypto\";\nimport { DEFAULT_ACTIVE_CONTEXT_CAPS, type ActiveContextCapabilitySet } from \"./active-context-config.js\";\nimport {\n ContextSummaryUnavailableError,\n summarizeContextPure,\n type SummarizeFn,\n} from \"./context-summary.js\";\nimport { evaluateActiveContextTransformPolicy } from \"./memory-action-policy.js\";\n\nexport const ACTIVE_CONTEXT_ALGORITHM_VERSION = \"active-context-transform/1\";\nexport const ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION = 1;\nexport const ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION = 1;\nexport const ACTIVE_CONTEXT_RECEIPT_SCHEMA_VERSION = 1;\nexport const ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION = 1;\n\nexport type ActiveContextOperation = \"SUMMARY\" | \"FILTER\";\nexport type ActiveContextPhase = \"plan\" | \"prepare\";\nexport type ActiveContextMessageRole = \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n\nexport type ActiveContextErrorCode =\n | \"feature_disabled\"\n | \"scope_mismatch\"\n | \"invalid_request\"\n | \"stale_context\"\n | \"plan_conflict\"\n | \"preserve_conflict\"\n | \"filter_unavailable\"\n | \"summary_unavailable\"\n | \"unsupported\"\n | \"retention_unavailable\"\n | \"retention_expired\"\n | \"invalid_receipt\"\n | \"host_error\";\n\n/** Roles that can never be removed by any operation or selector. */\nconst PROTECTED_ROLES: Record<string, true> = { system: true, developer: true };\n\nexport interface ActiveContextMessage {\n id: string;\n /** Snapshot order; plans sort by it and never reorder sources. */\n ordinal: number;\n role: ActiveContextMessageRole;\n content: string;\n /** Caller-marked protection; equivalent to a preserve-listed ID. */\n protected?: boolean;\n}\n\nexport interface ActiveContextSnapshot {\n schemaVersion: 1;\n sessionKey: string;\n /** Data routing only — never authorization. */\n namespace: string;\n /** Host revision/turn identifier the plan binds as a precondition. */\n revision: string | number;\n messages: ActiveContextMessage[];\n}\n\n/**\n * Trusted scope resolved by the access layer BEFORE any plan work\n * (mirrors `ResolvedIdentity` from adapters/types.ts). Core never treats\n * `snapshot.namespace` as auth.\n */\nexport interface ActiveContextResolvedScope {\n sessionKey: string;\n namespace: string;\n principal: string;\n adapterId: string;\n}\n\n/** Fixed, caller-supplied score rule. Must return a finite score in [0,1]. */\nexport type ActiveContextScoreMessageFn = (message: ActiveContextMessage) => number | undefined;\n\nexport interface ActiveContextTransformDeps {\n resolvedScope: ActiveContextResolvedScope;\n /** Filter score rule — required for FILTER plans. */\n scoreMessage?: ActiveContextScoreMessageFn;\n /** Model seam for SUMMARY; the same pure seam LCM uses. */\n summarize?: SummarizeFn;\n /** Config-projected caps; defaults are conservative (see capabilities.ts). */\n caps?: ActiveContextCapabilitySet;\n /** Gate override; defaults to `caps.activeContextTransforms`. */\n actionsEnabled?: boolean;\n /** Clock seam for deterministic expiry tests. */\n now?: () => Date;\n}\n\nexport interface ActiveContextSpanSelector {\n /** Closed span: inclusive start (by snapshot order). */\n startMessageId: string;\n /** Closed span: inclusive end (by snapshot order). */\n endMessageId: string;\n}\n\nexport interface ActiveContextTransformRequest {\n schemaVersion: 1;\n operation: ActiveContextOperation;\n phase: ActiveContextPhase;\n snapshot: ActiveContextSnapshot;\n /** Exactly one of `messageIds` or `span`. */\n selector: { messageIds?: string[]; span?: ActiveContextSpanSelector };\n preserve?: {\n messageIds?: string[];\n roles?: ActiveContextMessageRole[];\n minRetainedMessages?: number;\n };\n summary?: { method: \"deterministic\" | \"llm\" | \"auto\"; targetTokens?: number };\n filter?: { keepCriterion: string; threshold: number };\n expectedRevision?: string | number;\n requestId?: string;\n sourcePromptHash?: string;\n}\n\nexport interface ActiveContextScoreRow {\n messageId: string;\n score: number;\n decision: \"keep\" | \"drop\";\n}\n\nexport interface ActiveContextPlanReplacement {\n messageId: string;\n /** Filled by prepare — plans never carry raw text. */\n contentHash?: string;\n sourceMessageIds: string[];\n method: \"deterministic\" | \"llm\";\n /** Whether prepare may degrade to deterministic output (auto mode only). */\n fallbackPolicy: \"allowed\" | \"none\";\n targetTokens: number;\n modelUsed?: string;\n fallback?: boolean;\n}\n\nexport interface ActiveContextTransformPlan {\n schemaVersion: 1;\n planId: string;\n planHash: string;\n operation: ActiveContextOperation;\n status: \"ready\" | \"rejected\";\n errorCode?: ActiveContextErrorCode;\n precondition: {\n principal: string;\n sessionKey: string;\n namespace: string;\n adapterId: string;\n snapshotRevision: string | number;\n expiresAt: string;\n };\n /** Selected sources in snapshot order. */\n selectedMessageIds: string[];\n /** Messages that stay after the plan applies. */\n retainedMessageIds: string[];\n /** Removable IDs the plan proposes to drop or fold into a replacement. */\n proposedRemovalIds: string[];\n scoreRows?: ActiveContextScoreRow[];\n replacement?: ActiveContextPlanReplacement;\n preserve: { protectedMessageIds: string[]; minimumRetainedMessages: number };\n inverse: {\n kind: \"restore-source-message-ids\";\n sourceMessageIds: string[];\n removeReplacementMessageId?: string;\n expectedAppliedPlanHash?: string;\n };\n retention: {\n planId: string;\n mode: \"adapter-local\";\n expiresAt: string;\n maxBytes: number;\n snapshotContentHash: string;\n };\n provenance: {\n algorithmVersion: string;\n selectorHash: string;\n snapshotContentHash: string;\n criterionHash?: string;\n sourcePromptHash?: string;\n generatedAt: string;\n };\n policy: { decision: \"allow\" | \"deny\"; rationale: string };\n}\n\nexport interface ActiveContextHostCapability {\n capabilityId: string;\n trustedScope: ActiveContextResolvedScope;\n hostRevision: string | number;\n operations: ActiveContextOperation[];\n expiresAt: string;\n}\n\nexport interface ActiveContextApplyReceipt {\n schemaVersion: 1;\n planId: string;\n planHash: string;\n adapterId: string;\n outcome: \"applied\" | \"skipped\" | \"failed\";\n errorCode?: ActiveContextErrorCode;\n hostRevisionBefore?: string | number;\n hostRevisionAfter?: string | number;\n appliedMessageIds?: string[];\n removedMessageIds?: string[];\n replacementMessageId?: string;\n retentionExpiresAt?: string;\n appliedAt: string;\n}\n\n/** Discriminated ledger record appended to `state/memory-actions.jsonl`. */\nexport interface ContextTransformTelemetryRecord {\n recordKind: \"context_transform\";\n schemaVersion: 1;\n timestamp: string;\n /** Plan ID doubles as the record action ID. */\n actionId: string;\n action: \"summarize_context\" | \"filter_context\";\n outcome: \"applied\" | \"skipped\" | \"failed\";\n status: \"validated\" | \"applied\" | \"rejected\";\n actor?: string;\n subsystem: string;\n namespace: string;\n sourceSessionKey: string;\n planHash: string;\n snapshotRevision: string | number;\n adapterId?: string;\n algorithmVersion?: string;\n selectedCount: number;\n retainedCount: number;\n proposedRemovalCount: number;\n receiptOutcome?: \"applied\" | \"skipped\" | \"failed\";\n selectorHash: string;\n snapshotContentHash: string;\n criterionHash?: string;\n sourcePromptHash?: string;\n replacementContentHash?: string;\n policyDecision?: \"allow\" | \"defer\" | \"deny\";\n policyRationale?: string;\n telemetryRecorded?: boolean;\n}\n\nexport interface ActiveContextPreparedReplacement {\n messageId: string;\n text: string;\n contentHash: string;\n method: \"deterministic\" | \"llm\";\n modelUsed?: string;\n fallback: boolean;\n sourceMessageIds: string[];\n}\n\nexport interface ActiveContextPreparedTransform {\n status: \"ready\" | \"rejected\" | \"failed\";\n plan: ActiveContextTransformPlan;\n replacement?: ActiveContextPreparedReplacement;\n errorCode?: ActiveContextErrorCode;\n}\n\n// ── hashing ────────────────────────────────────────────────────────────────\n\nfunction sha256Hex(value: string): string {\n return createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n}\n\n/** Deterministic JSON: sorted keys, so field order never changes a hash. */\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(\",\")}]`;\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);\n return `{${entries.join(\",\")}}`;\n}\n\nfunction hashSnapshot(snapshot: ActiveContextSnapshot): string {\n return sha256Hex(\n canonicalJson({\n namespace: snapshot.namespace,\n revision: snapshot.revision,\n sessionKey: snapshot.sessionKey,\n messages: snapshot.messages.map((m) => ({\n contentHash: sha256Hex(m.content),\n id: m.id,\n ordinal: m.ordinal,\n role: m.role,\n })),\n }),\n );\n}\n\n// ── shared validation ──────────────────────────────────────────────────────\n\ninterface PlanContext {\n caps: ActiveContextCapabilitySet;\n scope: ActiveContextResolvedScope;\n snapshotRevision: string | number;\n byId: Map<string, ActiveContextMessage>;\n ordered: ActiveContextMessage[];\n snapshotContentHash: string;\n generatedAt: string;\n expiresAt: string;\n}\n\nconst VALID_PHASES: Record<string, true> = { plan: true, prepare: true };\nconst VALID_ROLES: Record<string, true> = {\n system: true,\n developer: true,\n user: true,\n assistant: true,\n tool: true,\n};\n\nfunction rejectedPlan(\n operation: ActiveContextOperation,\n errorCode: ActiveContextErrorCode,\n context: PlanContext | null,\n policy: { decision: \"allow\" | \"deny\"; rationale: string },\n): ActiveContextTransformPlan {\n const planId = `actx-rejected-${sha256Hex(`${operation}:${errorCode}:${policy.rationale}`).slice(0, 12)}`;\n return {\n schemaVersion: ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION,\n planId,\n planHash: sha256Hex(canonicalJson({ planId, errorCode, operation })),\n operation,\n status: \"rejected\",\n errorCode,\n precondition: context\n ? {\n principal: context.scope.principal,\n sessionKey: context.scope.sessionKey,\n namespace: context.scope.namespace,\n adapterId: context.scope.adapterId,\n snapshotRevision: context.snapshotRevision,\n expiresAt: context.expiresAt,\n }\n : {\n principal: \"\",\n sessionKey: \"\",\n namespace: \"\",\n adapterId: \"\",\n snapshotRevision: \"\",\n expiresAt: \"\",\n },\n selectedMessageIds: [],\n retainedMessageIds: [],\n proposedRemovalIds: [],\n preserve: { protectedMessageIds: [], minimumRetainedMessages: 0 },\n inverse: { kind: \"restore-source-message-ids\", sourceMessageIds: [] },\n retention: {\n planId,\n mode: \"adapter-local\",\n expiresAt: \"\",\n maxBytes: 0,\n snapshotContentHash: context?.snapshotContentHash ?? \"\",\n },\n provenance: {\n algorithmVersion: ACTIVE_CONTEXT_ALGORITHM_VERSION,\n selectorHash: \"\",\n snapshotContentHash: context?.snapshotContentHash ?? \"\",\n generatedAt: context?.generatedAt ?? new Date().toISOString(),\n },\n policy,\n };\n}\n\n/** Scope + snapshot validation shared by plan and prepare. Throws PlanReject. */\nclass PlanReject extends Error {\n constructor(readonly code: ActiveContextErrorCode) {\n super(code);\n }\n}\n\nfunction buildContext(\n request: ActiveContextTransformRequest,\n deps: ActiveContextTransformDeps,\n): PlanContext {\n const caps = deps.caps ?? {\n ...DEFAULT_ACTIVE_CONTEXT_CAPS,\n activeContextTransforms: true,\n activeContextLlm: false,\n };\n const scope = deps.resolvedScope;\n if (!scope || !scope.sessionKey || !scope.namespace || !scope.principal || !scope.adapterId) {\n throw new PlanReject(\"scope_mismatch\");\n }\n // Trusted-scope checks run before any ID selection or model work.\n if (request.snapshot.sessionKey !== scope.sessionKey) throw new PlanReject(\"scope_mismatch\");\n if (request.snapshot.namespace !== scope.namespace) throw new PlanReject(\"scope_mismatch\");\n\n const snapshot = request.snapshot;\n if (snapshot.schemaVersion !== ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION) {\n throw new PlanReject(\"invalid_request\");\n }\n if (!Array.isArray(snapshot.messages) || snapshot.messages.length === 0) {\n throw new PlanReject(\"invalid_request\");\n }\n const byId = new Map<string, ActiveContextMessage>();\n let totalChars = 0;\n for (const message of snapshot.messages) {\n if (\n typeof message?.id !== \"string\" ||\n message.id.length === 0 ||\n typeof message.content !== \"string\" ||\n VALID_ROLES[message.role] !== true\n ) {\n throw new PlanReject(\"invalid_request\");\n }\n if (byId.has(message.id)) throw new PlanReject(\"invalid_request\"); // duplicate IDs\n byId.set(message.id, message);\n totalChars += message.content.length;\n }\n if (snapshot.messages.length > caps.activeContextMaxMessages) throw new PlanReject(\"invalid_request\");\n if (totalChars > caps.activeContextMaxSnapshotChars) throw new PlanReject(\"invalid_request\");\n\n const now = (deps.now ?? (() => new Date()))();\n const generatedAt = now.toISOString();\n const expiresAt = new Date(now.getTime() + caps.activeContextPlanTtlMinutes * 60_000).toISOString();\n return {\n caps,\n scope,\n snapshotRevision: snapshot.revision,\n byId,\n ordered: [...snapshot.messages].sort((a, b) => a.ordinal - b.ordinal || a.id.localeCompare(b.id)),\n snapshotContentHash: hashSnapshot(snapshot),\n generatedAt,\n expiresAt,\n };\n}\n\n/** Resolve the selector to ordered source messages. Exactly one form allowed. */\nfunction resolveSelection(\n request: ActiveContextTransformRequest,\n context: PlanContext,\n): ActiveContextMessage[] {\n const messageIds = request.selector?.messageIds;\n const span = request.selector?.span;\n const hasIds = Array.isArray(messageIds) && messageIds.length > 0;\n if (hasIds === (span !== undefined)) throw new PlanReject(\"invalid_request\"); // both or neither\n\n if (hasIds && messageIds) {\n const seen = new Set<string>();\n const picked: ActiveContextMessage[] = [];\n for (const id of messageIds) {\n if (seen.has(id)) throw new PlanReject(\"invalid_request\"); // duplicate IDs\n seen.add(id);\n const message = context.byId.get(id);\n if (!message) throw new PlanReject(\"invalid_request\"); // unknown IDs\n picked.push(message);\n }\n return picked.sort((a, b) => a.ordinal - b.ordinal || a.id.localeCompare(b.id)); // snapshot order\n }\n\n if (!span) throw new PlanReject(\"invalid_request\");\n const { startMessageId, endMessageId } = span;\n const start = context.byId.get(startMessageId);\n const end = context.byId.get(endMessageId);\n if (!start || !end) throw new PlanReject(\"invalid_request\");\n if (start.ordinal > end.ordinal) throw new PlanReject(\"invalid_request\"); // inverted span\n const inSpan = context.ordered.filter(\n (m) => m.ordinal >= start.ordinal && m.ordinal <= end.ordinal, // closed and full\n );\n if (inSpan.length === 0) throw new PlanReject(\"invalid_request\"); // empty span\n return inSpan;\n}\n\nfunction protectedIdSet(\n request: ActiveContextTransformRequest,\n context: PlanContext,\n): Set<string> {\n const protectedIds = new Set<string>();\n for (const message of context.ordered) {\n if (PROTECTED_ROLES[message.role] === true || message.protected === true) {\n protectedIds.add(message.id);\n }\n }\n for (const role of request.preserve?.roles ?? []) {\n if (PROTECTED_ROLES[role] === true) continue;\n for (const message of context.ordered) {\n if (message.role === role) protectedIds.add(message.id);\n }\n }\n for (const id of request.preserve?.messageIds ?? []) {\n if (context.byId.has(id)) protectedIds.add(id);\n }\n return protectedIds;\n}\n\n// ── plan ───────────────────────────────────────────────────────────────────\n\n/**\n * Build one bounded, content-addressed SUMMARY or FILTER plan. Returns a\n * rejected plan (with a stable error code) instead of throwing on bad\n * input — bad input is never hidden behind a no-op. `planHash` binds the\n * scope, revision, and every selected/removal/replacement ID; replay\n * across principal, session, namespace, adapter, or revision therefore\n * fails the adapter's comparisons before retain, apply, or undo.\n */\nexport function planActiveContextTransform(\n request: ActiveContextTransformRequest,\n deps: ActiveContextTransformDeps,\n): ActiveContextTransformPlan {\n const caps =\n deps.caps ?? { ...DEFAULT_ACTIVE_CONTEXT_CAPS, activeContextTransforms: true, activeContextLlm: false };\n const policy = evaluateActiveContextTransformPolicy({\n actionsEnabled: deps.actionsEnabled ?? caps.activeContextTransforms,\n operation: request.operation,\n });\n if (policy.decision === \"deny\") {\n // feature_disabled — evaluated before scope or selection work.\n return rejectedPlan(request.operation, \"feature_disabled\", null, policy);\n }\n let context: PlanContext | null = null;\n try {\n if (request.schemaVersion !== ACTIVE_CONTEXT_SNAPSHOT_SCHEMA_VERSION) {\n throw new PlanReject(\"invalid_request\");\n }\n if (request.operation !== \"SUMMARY\" && request.operation !== \"FILTER\") {\n throw new PlanReject(\"invalid_request\");\n }\n if (VALID_PHASES[request.phase] !== true) throw new PlanReject(\"invalid_request\");\n context = buildContext(request, deps);\n\n if (\n request.expectedRevision !== undefined &&\n request.expectedRevision !== request.snapshot.revision\n ) {\n throw new PlanReject(\"stale_context\");\n }\n\n const selected = resolveSelection(request, context);\n const protectedIds = protectedIdSet(request, context);\n const removable = selected.filter((m) => !protectedIds.has(m.id));\n if (removable.length === 0) {\n throw new PlanReject(\"preserve_conflict\"); // nothing chosen is removable\n }\n\n const minimumRetained = Math.max(\n 1,\n request.preserve?.minRetainedMessages ?? caps.activeContextMinRetainedMessages,\n );\n const idList = (messages: ActiveContextMessage[]) => messages.map((m) => m.id);\n const allIds = idList(context.ordered);\n const selectorHash = sha256Hex(canonicalJson(request.selector ?? {}));\n\n if (request.operation === \"FILTER\") {\n return buildFilterPlan(request, deps, context, {\n selected,\n removable,\n protectedIds,\n minimumRetained,\n allIds,\n selectorHash,\n policy,\n });\n }\n return buildSummaryPlan(request, deps, context, {\n selected,\n removable,\n protectedIds,\n minimumRetained,\n allIds,\n selectorHash,\n policy,\n });\n } catch (err) {\n if (err instanceof PlanReject) {\n return rejectedPlan(request.operation, err.code, context, policy);\n }\n throw err;\n }\n}\n\ninterface SelectionBundle {\n selected: ActiveContextMessage[];\n removable: ActiveContextMessage[];\n protectedIds: Set<string>;\n minimumRetained: number;\n allIds: string[];\n selectorHash: string;\n policy: { decision: \"allow\" | \"deny\"; rationale: string };\n}\n\nfunction finalizePlan(\n operation: ActiveContextOperation,\n context: PlanContext,\n bundle: SelectionBundle,\n proposedRemovalIds: string[],\n extras: {\n scoreRows?: ActiveContextScoreRow[];\n replacement?: ActiveContextPlanReplacement;\n criterionHash?: string;\n sourcePromptHash?: string;\n },\n): ActiveContextTransformPlan {\n const retainedIds = bundle.allIds.filter((id) => !proposedRemovalIds.includes(id));\n if (retainedIds.length < bundle.minimumRetained) {\n throw new PlanReject(\"preserve_conflict\"); // below keep floor / no safe message left\n }\n const sourceMessageIds = bundle.removable.map((m) => m.id);\n const precondition = {\n principal: context.scope.principal,\n sessionKey: context.scope.sessionKey,\n namespace: context.scope.namespace,\n adapterId: context.scope.adapterId,\n snapshotRevision: context.snapshotRevision,\n expiresAt: context.expiresAt,\n };\n const provenance = {\n algorithmVersion: ACTIVE_CONTEXT_ALGORITHM_VERSION,\n selectorHash: bundle.selectorHash,\n snapshotContentHash: context.snapshotContentHash,\n ...(extras.criterionHash ? { criterionHash: extras.criterionHash } : {}),\n ...(extras.sourcePromptHash ? { sourcePromptHash: extras.sourcePromptHash } : {}),\n generatedAt: context.generatedAt,\n };\n const planId = `actx-${sha256Hex(\n canonicalJson({\n adapterId: precondition.adapterId,\n criterionHash: extras.criterionHash,\n namespace: precondition.namespace,\n operation,\n principal: precondition.principal,\n selectorHash: bundle.selectorHash,\n sessionKey: precondition.sessionKey,\n snapshotContentHash: context.snapshotContentHash,\n }),\n ).slice(0, 16)}`;\n const planBody = {\n operation,\n planId,\n precondition,\n proposedRemovalIds,\n replacementMessageId: extras.replacement?.messageId,\n replacementSourceIds: extras.replacement?.sourceMessageIds,\n retainedIds,\n selectedIds: bundle.selected.map((m) => m.id),\n };\n const planHash = sha256Hex(canonicalJson(planBody));\n return {\n schemaVersion: ACTIVE_CONTEXT_PLAN_SCHEMA_VERSION,\n planId,\n planHash,\n operation,\n status: \"ready\",\n precondition,\n selectedMessageIds: planBody.selectedIds,\n retainedMessageIds: retainedIds,\n proposedRemovalIds,\n ...(extras.scoreRows ? { scoreRows: extras.scoreRows } : {}),\n ...(extras.replacement ? { replacement: extras.replacement } : {}),\n preserve: {\n protectedMessageIds: [...bundle.protectedIds],\n minimumRetainedMessages: bundle.minimumRetained,\n },\n inverse: {\n kind: \"restore-source-message-ids\",\n sourceMessageIds,\n ...(extras.replacement ? { removeReplacementMessageId: extras.replacement.messageId } : {}),\n expectedAppliedPlanHash: planHash,\n },\n retention: {\n planId,\n mode: \"adapter-local\",\n expiresAt: context.expiresAt,\n maxBytes: context.caps.activeContextRetentionMaxBytes,\n snapshotContentHash: context.snapshotContentHash,\n },\n provenance,\n policy: bundle.policy,\n };\n}\n\nfunction buildFilterPlan(\n request: ActiveContextTransformRequest,\n deps: ActiveContextTransformDeps,\n context: PlanContext,\n bundle: SelectionBundle,\n): ActiveContextTransformPlan {\n const filter = request.filter;\n if (!filter || typeof filter.keepCriterion !== \"string\" || filter.keepCriterion.length === 0) {\n throw new PlanReject(\"invalid_request\"); // Filter needs keepCriterion\n }\n const threshold = filter.threshold;\n if (typeof threshold !== \"number\" || !Number.isFinite(threshold) || threshold < 0 || threshold > 1) {\n throw new PlanReject(\"invalid_request\"); // fixed limit in [0,1], never defaulted\n }\n if (!deps.scoreMessage) {\n throw new PlanReject(\"filter_unavailable\"); // Filter needs a score function\n }\n\n const scoreRows: ActiveContextScoreRow[] = [];\n const removalIds: string[] = [];\n for (const message of bundle.removable) {\n const score = deps.scoreMessage(message);\n if (typeof score !== \"number\" || !Number.isFinite(score) || score < 0 || score > 1) {\n throw new PlanReject(\"filter_unavailable\"); // missing / NaN / out of range\n }\n const decision = score >= threshold ? \"keep\" : \"drop\"; // fixed keep rule\n scoreRows.push({ messageId: message.id, score, decision });\n if (decision === \"drop\") removalIds.push(message.id);\n }\n\n return finalizePlan(\"FILTER\", context, bundle, removalIds, {\n scoreRows,\n criterionHash: sha256Hex(filter.keepCriterion), // hash, never the rule text\n sourcePromptHash: request.sourcePromptHash,\n });\n}\n\nfunction buildSummaryPlan(\n request: ActiveContextTransformRequest,\n deps: ActiveContextTransformDeps,\n context: PlanContext,\n bundle: SelectionBundle,\n): ActiveContextTransformPlan {\n const requested = request.summary?.method ?? \"deterministic\";\n const llmEnabled = context.caps.activeContextLlm;\n let method: \"deterministic\" | \"llm\";\n let fallbackPolicy: \"allowed\" | \"none\";\n if (requested === \"deterministic\") {\n method = \"deterministic\";\n fallbackPolicy = \"none\";\n } else if (requested === \"llm\") {\n if (!llmEnabled) throw new PlanReject(\"unsupported\"); // explicit llm behind a closed gate\n method = \"llm\";\n fallbackPolicy = \"none\"; // fallback only in auto mode\n } else {\n // auto: prefer the LLM seam when allowed; deterministic otherwise.\n method = llmEnabled && deps.summarize ? \"llm\" : \"deterministic\";\n fallbackPolicy = method === \"llm\" ? \"allowed\" : \"none\";\n }\n\n const requestedTokens = request.summary?.targetTokens ?? context.caps.activeContextSummaryMaxTokens;\n if (\n typeof requestedTokens !== \"number\" ||\n !Number.isFinite(requestedTokens) ||\n requestedTokens <= 0 ||\n requestedTokens > context.caps.activeContextSummaryMaxTokens\n ) {\n throw new PlanReject(\"invalid_request\");\n }\n const targetTokens = Math.floor(requestedTokens);\n\n // planId is derived inside finalizePlan; the replacement ID must be stable\n // relative to it, so derive from the same stable inputs.\n const replacementSeed = sha256Hex(\n canonicalJson({\n operation: \"SUMMARY\",\n selectorHash: bundle.selectorHash,\n snapshotContentHash: context.snapshotContentHash,\n sessionKey: context.scope.sessionKey,\n namespace: context.scope.namespace,\n principal: context.scope.principal,\n adapterId: context.scope.adapterId,\n }),\n );\n const replacement: ActiveContextPlanReplacement = {\n messageId: `actxr-${replacementSeed.slice(0, 16)}`,\n sourceMessageIds: bundle.removable.map((m) => m.id),\n method,\n fallbackPolicy,\n targetTokens,\n };\n\n const plan = finalizePlan(\"SUMMARY\", context, bundle, [...replacement.sourceMessageIds], {\n replacement,\n sourcePromptHash: request.sourcePromptHash,\n });\n return plan;\n}\n\n// ── prepare ────────────────────────────────────────────────────────────────\n\n/**\n * Produce the SUMMARY replacement text for a ready plan through the pure\n * summary seam (context-summary.ts). Never calls `LcmSummarizer`. FILTER\n * plans pass through unchanged after revalidation. The caller must supply\n * the same snapshot the plan was built from; a changed transcript fence\n * rejects with `plan_conflict`.\n */\nexport async function prepareActiveContextTransform(\n plan: ActiveContextTransformPlan,\n deps: ActiveContextTransformDeps & { snapshot: ActiveContextSnapshot },\n): Promise<ActiveContextPreparedTransform> {\n if (plan.status !== \"ready\") {\n return { status: \"rejected\", plan, errorCode: plan.errorCode ?? \"invalid_request\" };\n }\n\n const scope = deps.resolvedScope;\n const p = plan.precondition;\n if (\n !scope ||\n scope.principal !== p.principal ||\n scope.sessionKey !== p.sessionKey ||\n scope.namespace !== p.namespace ||\n scope.adapterId !== p.adapterId\n ) {\n return { status: \"rejected\", plan, errorCode: \"scope_mismatch\" };\n }\n const now = deps.now?.() ?? new Date();\n if (now.getTime() >= new Date(plan.retention.expiresAt).getTime()) {\n return { status: \"rejected\", plan, errorCode: \"stale_context\" }; // expired plan\n }\n if (deps.snapshot.sessionKey !== p.sessionKey || deps.snapshot.namespace !== p.namespace) {\n return { status: \"rejected\", plan, errorCode: \"scope_mismatch\" };\n }\n const fenceHash = hashSnapshot(deps.snapshot);\n if (fenceHash !== plan.provenance.snapshotContentHash) {\n return { status: \"rejected\", plan, errorCode: \"plan_conflict\" }; // changed fence\n }\n\n if (plan.operation === \"FILTER\") {\n return { status: \"ready\", plan };\n }\n\n const replacement = plan.replacement;\n if (!replacement) {\n return { status: \"failed\", plan, errorCode: \"invalid_request\" };\n }\n const byId = new Map(deps.snapshot.messages.map((m) => [m.id, m] as const));\n const sourceText = replacement.sourceMessageIds\n .map((id) => byId.get(id))\n .filter((m): m is ActiveContextMessage => m !== undefined)\n .sort((a, b) => a.ordinal - b.ordinal || a.id.localeCompare(b.id))\n .map((m) => m.content)\n .join(\"\\n\\n\"); // exact order, exact text\n\n const method =\n replacement.method === \"deterministic\"\n ? \"deterministic\"\n : replacement.fallbackPolicy === \"allowed\"\n ? \"auto\"\n : \"llm\";\n try {\n const result = await summarizeContextPure(sourceText, replacement.targetTokens, method, {\n llm: deps.summarize,\n deterministicMaxTokens: deps.caps?.activeContextSummaryMaxTokens ?? replacement.targetTokens,\n });\n if (result.text.trim().length === 0) {\n return { status: \"failed\", plan, errorCode: \"summary_unavailable\" }; // bad model text\n }\n return {\n status: \"ready\",\n plan,\n replacement: {\n messageId: replacement.messageId,\n text: result.text,\n contentHash: sha256Hex(result.text),\n method: result.method,\n ...(result.modelUsed ? { modelUsed: result.modelUsed } : {}),\n fallback: result.fallback,\n sourceMessageIds: replacement.sourceMessageIds,\n },\n };\n } catch (err) {\n if (err instanceof ContextSummaryUnavailableError) {\n return { status: \"failed\", plan, errorCode: \"summary_unavailable\" };\n }\n throw err;\n }\n}\n\n// ── receipts and telemetry ─────────────────────────────────────────────────\n\n/**\n * Validate a host receipt against the plan's bindings and append one\n * context record to the ledger. Order of checks: scope → hash → revision →\n * shape. One-time use is enforced by the adapter's persisted apply/undo\n * markers (retention store); this recorder appends only. A ledger write\n * failure returns `recorded: false` and never fabricates an apply.\n */\nexport async function recordActiveContextApplyReceipt(\n plan: ActiveContextTransformPlan,\n receipt: ActiveContextApplyReceipt,\n trustedScope: ActiveContextResolvedScope,\n recorder: {\n append(record: ContextTransformTelemetryRecord): Promise<boolean>;\n },\n): Promise<{ recorded: boolean; event: ContextTransformTelemetryRecord }> {\n const p = plan.precondition;\n const scopeMatch =\n trustedScope.principal === p.principal &&\n trustedScope.sessionKey === p.sessionKey &&\n trustedScope.namespace === p.namespace &&\n trustedScope.adapterId === p.adapterId &&\n receipt.adapterId === trustedScope.adapterId;\n if (!scopeMatch) throw new PlanReject(\"scope_mismatch\");\n if (receipt.planHash !== plan.planHash) throw new PlanReject(\"plan_conflict\"); // bad hash\n if (receipt.hostRevisionBefore === undefined || receipt.hostRevisionBefore !== p.snapshotRevision) {\n throw new PlanReject(\"stale_context\"); // old plan / bad revision\n }\n const shapeOk =\n receipt.schemaVersion === ACTIVE_CONTEXT_RECEIPT_SCHEMA_VERSION &&\n receipt.planId === plan.planId &&\n (receipt.outcome === \"applied\" || receipt.outcome === \"skipped\" || receipt.outcome === \"failed\") &&\n typeof receipt.appliedAt === \"string\" &&\n !Number.isNaN(Date.parse(receipt.appliedAt));\n if (!shapeOk) throw new PlanReject(\"invalid_receipt\");\n\n const event: ContextTransformTelemetryRecord = {\n recordKind: \"context_transform\",\n schemaVersion: ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION,\n timestamp: receipt.appliedAt,\n actionId: plan.planId,\n action: plan.operation === \"SUMMARY\" ? \"summarize_context\" : \"filter_context\",\n outcome: receipt.outcome,\n status: receipt.outcome === \"applied\" ? \"applied\" : receipt.outcome === \"failed\" ? \"rejected\" : \"validated\",\n subsystem: \"active-context\",\n namespace: p.namespace,\n sourceSessionKey: p.sessionKey,\n planHash: plan.planHash,\n snapshotRevision: p.snapshotRevision,\n adapterId: receipt.adapterId,\n algorithmVersion: plan.provenance.algorithmVersion,\n selectedCount: plan.selectedMessageIds.length,\n retainedCount: plan.retainedMessageIds.length,\n proposedRemovalCount: plan.proposedRemovalIds.length,\n receiptOutcome: receipt.outcome,\n selectorHash: plan.provenance.selectorHash,\n snapshotContentHash: plan.provenance.snapshotContentHash,\n ...(plan.provenance.criterionHash ? { criterionHash: plan.provenance.criterionHash } : {}),\n ...(plan.provenance.sourcePromptHash ? { sourcePromptHash: plan.provenance.sourcePromptHash } : {}),\n policyDecision: plan.policy.decision,\n policyRationale: plan.policy.rationale,\n };\n\n let recorded = false;\n try {\n recorded = await recorder.append(event);\n } catch {\n recorded = false; // ledger errors surface in the result, never as an apply\n }\n return { recorded, event: { ...event, telemetryRecorded: recorded } };\n}\n\n/**\n * Build a plan-stage ledger record (plan produced, rejected, skipped, or\n * failed before host apply). Receipt-backed applies use\n * {@link recordActiveContextApplyReceipt} instead.\n */\nexport function buildContextTransformPlanEvent(\n plan: ActiveContextTransformPlan,\n outcome: \"skipped\" | \"failed\",\n): ContextTransformTelemetryRecord {\n return {\n recordKind: \"context_transform\",\n schemaVersion: ACTIVE_CONTEXT_RECORD_SCHEMA_VERSION,\n timestamp: plan.provenance.generatedAt,\n actionId: plan.planId,\n action: plan.operation === \"SUMMARY\" ? \"summarize_context\" : \"filter_context\",\n outcome,\n status: plan.status === \"ready\" ? \"validated\" : \"rejected\",\n subsystem: \"active-context\",\n namespace: plan.precondition.namespace,\n sourceSessionKey: plan.precondition.sessionKey,\n planHash: plan.planHash,\n snapshotRevision: plan.precondition.snapshotRevision,\n algorithmVersion: plan.provenance.algorithmVersion,\n selectedCount: plan.selectedMessageIds.length,\n retainedCount: plan.retainedMessageIds.length,\n proposedRemovalCount: plan.proposedRemovalIds.length,\n selectorHash: plan.provenance.selectorHash,\n snapshotContentHash: plan.provenance.snapshotContentHash,\n ...(plan.provenance.criterionHash ? { criterionHash: plan.provenance.criterionHash } : {}),\n ...(plan.provenance.sourcePromptHash ? { sourcePromptHash: plan.provenance.sourcePromptHash } : {}),\n policyDecision: plan.policy.decision,\n policyRationale: plan.policy.rationale,\n telemetryRecorded: true,\n };\n}\n"],"mappings":"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","names":[]}
|