@remnic/core 10.0.92 → 10.0.94
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.js +332 -59
- package/dist/access-authorization-probe.js +2 -283
- package/dist/access-boundary.d.ts +1 -1
- package/dist/access-boundary.d.ts.map +1 -1
- package/dist/access-boundary.js +1 -282
- package/dist/access-cli.js +287 -303
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.js +3 -3
- package/dist/access-extraction-force-flush.js +332 -59
- package/dist/access-http-briefing.js +332 -60
- package/dist/access-http-query.js +332 -61
- package/dist/access-http.js +330 -112
- package/dist/access-identity-continuity-surface.js +332 -59
- package/dist/access-lcm-surface.js +332 -59
- package/dist/access-mcp-frames.d.ts +20 -6
- package/dist/access-mcp-frames.d.ts.map +1 -1
- package/dist/access-mcp-frames.js +1 -1
- package/dist/access-mcp.d.ts +5 -0
- package/dist/access-mcp.d.ts.map +1 -1
- package/dist/access-mcp.js +330 -87
- package/dist/access-namespace-preflight.js +2 -282
- package/dist/access-observe-transcript.js +3 -3
- package/dist/access-observe-write-category.js +6 -6
- package/dist/access-observe-write-surface.js +332 -59
- package/dist/access-offline-manifest.js +12 -11
- package/dist/access-operations-batch.js +330 -64
- package/dist/access-operations.js +330 -73
- package/dist/access-recall-concurrency.js +332 -59
- package/dist/access-recall-diagnostics.js +5 -4
- package/dist/access-recall-response.js +332 -59
- package/dist/access-recall-surface.js +332 -59
- package/dist/access-schema.js +2 -2
- package/dist/access-service.js +335 -62
- package/dist/access-surface-catalog.js +6 -283
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-context-transform.js +1 -1
- package/dist/active-memory-bridge.js +3 -2
- package/dist/active-recall.js +36 -37
- package/dist/active-recall.js.map +1 -1
- package/dist/activity/journal-extract.d.ts +13 -1
- package/dist/activity/journal-extract.d.ts.map +1 -1
- package/dist/{auto-sync-3AZW7MXI.js → auto-sync-BO5YZKM6.js} +13 -15
- package/dist/{auto-sync-3AZW7MXI.js.map → auto-sync-BO5YZKM6.js.map} +1 -1
- package/dist/briefing.js +20 -20
- package/dist/buffer.js +16 -16
- package/dist/calibration.js +10 -10
- package/dist/{capsule-merge-2IIXFXN5.js → capsule-merge-6IDAYTKG.js} +6 -6
- package/dist/causal-consolidation.js +23 -23
- package/dist/{chunk-RGUUBAT5.js → chunk-2WCLTWV2.js} +3 -3
- package/dist/{chunk-BQZEGOZ4.js → chunk-2YODOG2O.js} +2 -2
- package/dist/{chunk-WYG5UNDY.js → chunk-3AUDELZL.js} +2 -2
- package/dist/{chunk-MB6ZJDN6.js → chunk-3FBAEPCU.js} +2 -2
- package/dist/{chunk-PIITB2YZ.js → chunk-3ZS3NUEI.js} +4 -4
- package/dist/{chunk-ATPWZ4F7.js → chunk-4EZWSDFL.js} +5 -5
- package/dist/{chunk-ANZZLRUX.js → chunk-4IVRQMZW.js} +2 -2
- package/dist/{chunk-63E37JCN.js → chunk-4RAJT5L2.js} +4 -4
- package/dist/{chunk-45VUHDV2.js → chunk-5CO5G4MN.js} +2 -2
- package/dist/{chunk-LUJCQQ3L.js → chunk-65HWAQ4F.js} +2 -2
- package/dist/{chunk-T67LUYCR.js → chunk-77NTFICT.js} +5 -5
- package/dist/chunk-A2WFUMUN.js +86 -0
- package/dist/chunk-A2WFUMUN.js.map +1 -0
- package/dist/{chunk-UE6RRXMF.js → chunk-A4F7OIC5.js} +2 -2
- package/dist/chunk-AHA5VQGP.js +117 -0
- package/dist/chunk-AHA5VQGP.js.map +1 -0
- package/dist/{chunk-RRJBDXAQ.js → chunk-B377OKUP.js} +2 -2
- package/dist/{chunk-IUKYFTGW.js → chunk-B3DR2JBZ.js} +140 -125
- package/dist/chunk-B3DR2JBZ.js.map +1 -0
- package/dist/{chunk-Z7JIZ42P.js → chunk-BN2EBCLB.js} +3 -3
- package/dist/{chunk-YYOMGOHB.js → chunk-BOK6BN5M.js} +2 -2
- package/dist/{chunk-U6UNF5ZS.js → chunk-BPK32FRM.js} +3 -3
- package/dist/{chunk-OH7QLI6W.js → chunk-BPPUH5JM.js} +5 -5
- package/dist/{chunk-O6ZSWHVR.js → chunk-C2KE5DMD.js} +4 -4
- package/dist/{chunk-47F6WWLQ.js → chunk-C73N66PR.js} +2 -2
- package/dist/{chunk-WRT7GJ2D.js → chunk-CIWMTNHW.js} +4 -4
- package/dist/{chunk-HF3BKUVV.js → chunk-CL4JU3DF.js} +7 -7
- package/dist/{chunk-O55EKIEC.js → chunk-D3ZKHLN2.js} +2 -2
- package/dist/chunk-D5S6RL32.js +67137 -0
- package/dist/chunk-D5S6RL32.js.map +1 -0
- package/dist/{chunk-ETZLQOUR.js → chunk-D5XG2KPS.js} +2 -2
- package/dist/{chunk-CD4BCCNP.js → chunk-DJ7WVEWX.js} +2 -2
- package/dist/{chunk-PWXPRVLK.js → chunk-DNY63QWJ.js} +2 -2
- package/dist/{chunk-4CJTQHEG.js → chunk-ESLOLCD4.js} +3 -3
- package/dist/{chunk-VILPVT4S.js → chunk-EZ47HOJ6.js} +4 -4
- package/dist/{chunk-EFYN5I7Z.js → chunk-F4QFU5IZ.js} +2 -2
- package/dist/{chunk-T6OZW2WR.js → chunk-FA7SLQ5X.js} +7 -1
- package/dist/chunk-FA7SLQ5X.js.map +1 -0
- package/dist/{chunk-BRLXOZLM.js → chunk-FQAQ63QA.js} +729 -17
- package/dist/chunk-FQAQ63QA.js.map +1 -0
- package/dist/{chunk-FSO3G4JJ.js → chunk-FWRXW7CZ.js} +5000 -2748
- package/dist/chunk-FWRXW7CZ.js.map +1 -0
- package/dist/{chunk-XYKBWTWI.js → chunk-FZZMLGWQ.js} +2 -2
- package/dist/{chunk-FNXQZGUS.js → chunk-GBJUTX44.js} +2 -2
- package/dist/{chunk-YLXETSAH.js → chunk-GCZJ7XRI.js} +2 -2
- package/dist/{chunk-UDKWFDV2.js → chunk-HLUHEMN4.js} +27 -3
- package/dist/chunk-HLUHEMN4.js.map +1 -0
- package/dist/{chunk-SUSW74WU.js → chunk-IL3RHBWM.js} +56 -5
- package/dist/chunk-IL3RHBWM.js.map +1 -0
- package/dist/{chunk-JV4S6VDH.js → chunk-ILY5SSOM.js} +2 -2
- package/dist/{chunk-EXHXJETE.js → chunk-IQ55QGY5.js} +2 -2
- package/dist/{chunk-4J363OAA.js → chunk-J7BIFOYP.js} +2 -2
- package/dist/{chunk-QFEDITXM.js → chunk-JNDMIAJ4.js} +2 -2
- package/dist/chunk-JTSSSR4L.js +359 -0
- package/dist/chunk-JTSSSR4L.js.map +1 -0
- package/dist/{chunk-5KBIOI4G.js → chunk-JVBAPAWZ.js} +217 -13
- package/dist/chunk-JVBAPAWZ.js.map +1 -0
- package/dist/{chunk-E5PPE4VA.js → chunk-K2VRKCPA.js} +2 -2
- package/dist/{chunk-MKRYQROF.js → chunk-LGEHAQHK.js} +4 -4
- package/dist/{chunk-7HTUYFR3.js → chunk-LLPMMMWG.js} +27 -10
- package/dist/chunk-LLPMMMWG.js.map +1 -0
- package/dist/{chunk-XYTQJD7F.js → chunk-LMJVP5CM.js} +2 -2
- package/dist/{chunk-E7YZXWIS.js → chunk-LNGELD2M.js} +2 -2
- package/dist/{chunk-FQKBJJYB.js → chunk-LPV72KRQ.js} +2 -2
- package/dist/{chunk-2LCRG2YV.js → chunk-M2XR6B6V.js} +2 -2
- package/dist/{chunk-EQ4U73UH.js → chunk-MLAMXQAW.js} +14 -2
- package/dist/chunk-MLAMXQAW.js.map +1 -0
- package/dist/{chunk-ZU5JDLOH.js → chunk-MMRTPH3J.js} +2 -2
- package/dist/{chunk-TVIVY7KU.js → chunk-NED7IR7B.js} +4 -4
- package/dist/{chunk-6F5MJFXY.js → chunk-NHVAX7MH.js} +2 -2
- package/dist/{chunk-TG3R2SID.js → chunk-NMGHGTVR.js} +5 -5
- package/dist/{chunk-YCNIGRRF.js → chunk-NS7U4ZYU.js} +13 -117
- package/dist/chunk-NS7U4ZYU.js.map +1 -0
- package/dist/{chunk-NGHDW6UU.js → chunk-NUQEREIP.js} +2 -2
- package/dist/{chunk-5IIQU4JZ.js → chunk-OB72KNMF.js} +4 -4
- package/dist/{chunk-RIMK327Y.js → chunk-OUVYYKYU.js} +7 -7
- package/dist/{chunk-QJPJXCS4.js → chunk-P3WRNWWM.js} +157 -4
- package/dist/chunk-P3WRNWWM.js.map +1 -0
- package/dist/{chunk-E6M225BJ.js → chunk-PC5DRBGD.js} +18 -8
- package/dist/chunk-PC5DRBGD.js.map +1 -0
- package/dist/{chunk-RWGRSKN5.js → chunk-PT4DZDJA.js} +2 -2
- package/dist/{chunk-7EPY3IQL.js → chunk-PZJQ46DH.js} +2 -2
- package/dist/{chunk-MXHMNKWG.js → chunk-QDESY76F.js} +3 -3
- package/dist/{chunk-E3A7ELSG.js → chunk-QHARXWTC.js} +2 -2
- package/dist/{chunk-BLJT6JP2.js → chunk-QMFAMOT2.js} +2 -2
- package/dist/{chunk-I6QGI65T.js → chunk-QRMG4HK4.js} +3 -3
- package/dist/{chunk-ZU3NJNO7.js → chunk-QSF5SJAM.js} +4 -4
- package/dist/{chunk-5IYOKDM4.js → chunk-R23JWJD3.js} +5 -5
- package/dist/{chunk-RHQLIHMB.js → chunk-R4BBGPI2.js} +218 -218
- package/dist/chunk-R4BBGPI2.js.map +1 -0
- package/dist/{chunk-NT7F7WJQ.js → chunk-RFUL2ZIQ.js} +291 -93
- package/dist/chunk-RFUL2ZIQ.js.map +1 -0
- package/dist/{chunk-E4IRW2FG.js → chunk-RKABLU5M.js} +233 -40
- package/dist/chunk-RKABLU5M.js.map +1 -0
- package/dist/{chunk-P4WNBSTW.js → chunk-RNG7S3FY.js} +2 -2
- package/dist/{chunk-IPT2OY4B.js → chunk-RQFXZYTF.js} +35 -33
- package/dist/chunk-RQFXZYTF.js.map +1 -0
- package/dist/{chunk-5HFXGXE5.js → chunk-RUTN5MMC.js} +7 -9
- package/dist/{chunk-5HFXGXE5.js.map → chunk-RUTN5MMC.js.map} +1 -1
- package/dist/{chunk-AP6NCP3V.js → chunk-S3S72HRM.js} +8 -6
- package/dist/chunk-S3S72HRM.js.map +1 -0
- package/dist/{chunk-ZGFLIK5H.js → chunk-SPAKBUJY.js} +2 -2
- package/dist/{chunk-ER7XANP3.js → chunk-SQ3GEIEL.js} +4 -4
- package/dist/{chunk-PMJFRDJI.js → chunk-SUTEBYGI.js} +2 -2
- package/dist/{chunk-HVX4LPNY.js → chunk-T4KY6UYF.js} +5 -3
- package/dist/{chunk-HVX4LPNY.js.map → chunk-T4KY6UYF.js.map} +1 -1
- package/dist/{chunk-R6HMAIKM.js → chunk-TOSPNM4T.js} +2 -2
- package/dist/{chunk-RMXS4I66.js → chunk-TVDJEUV5.js} +2 -2
- package/dist/{chunk-PLCYKAWH.js → chunk-TYRWSE4B.js} +2 -2
- package/dist/{chunk-B4QYQFGY.js → chunk-UBEKET2V.js} +383 -36
- package/dist/chunk-UBEKET2V.js.map +1 -0
- package/dist/{chunk-IQWUACVG.js → chunk-UHMHJX5G.js} +3 -3
- package/dist/{chunk-YODUDA6R.js → chunk-UN4RVUG2.js} +22 -22
- package/dist/{chunk-E6Z4FBX6.js → chunk-V2QSNFCT.js} +2 -2
- package/dist/{chunk-NBH6K6G5.js → chunk-V65H7MI6.js} +345 -16
- package/dist/chunk-V65H7MI6.js.map +1 -0
- package/dist/chunk-W54Z2MOP.js +4500 -0
- package/dist/chunk-W54Z2MOP.js.map +1 -0
- package/dist/{chunk-7W3RXOIG.js → chunk-WGGRZYSQ.js} +14 -14
- package/dist/{chunk-RIZ5NUNN.js → chunk-WQ4XKIOX.js} +4 -4
- package/dist/{chunk-QEYTRFR3.js → chunk-X26YOFGS.js} +2 -2
- package/dist/{chunk-ITHZFHST.js → chunk-X2BVB74H.js} +2 -2
- package/dist/{chunk-6F42QONS.js → chunk-X5HGU2EM.js} +4 -4
- package/dist/{chunk-GVGAO3WV.js → chunk-XJ2S5UBF.js} +3 -3
- package/dist/{chunk-IBJ6U753.js → chunk-XKZBZOKV.js} +4 -4
- package/dist/{chunk-65AUYLU3.js → chunk-XPXHQI6N.js} +2 -2
- package/dist/chunk-XRWWCW4H.js +102 -0
- package/dist/chunk-XRWWCW4H.js.map +1 -0
- package/dist/{chunk-HH5LY6RR.js → chunk-YIXJSW5M.js} +5 -5
- package/dist/{chunk-2JSDPUKD.js → chunk-YMFPFXEX.js} +2 -2
- package/dist/{chunk-N4KAE2NB.js → chunk-Z3FTSHT5.js} +3 -3
- package/dist/{chunk-7GLJMDEQ.js → chunk-ZDV5YWID.js} +6 -6
- package/dist/{chunk-645WOU5I.js → chunk-ZDZJNXL6.js} +4 -4
- package/dist/{chunk-6TCXIRP5.js → chunk-ZKE4CO6B.js} +4 -4
- package/dist/cli.js +303 -185
- package/dist/coding/export-okf-codegraph.js +29 -29
- package/dist/compounding/engine.js +23 -24
- package/dist/config.js +36 -37
- package/dist/connectors/codex-materialize-runner.js +20 -20
- package/dist/connectors/index.js +21 -21
- package/dist/connectors/live/google-drive.d.ts +2 -0
- package/dist/connectors/live/google-drive.d.ts.map +1 -1
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.js +5 -5
- package/dist/contradiction/index.js +7 -6
- package/dist/{contradiction-scan-P2MHYFVG.js → contradiction-scan-IBPYGQZF.js} +4 -3
- package/dist/convergence-refresh.js +22 -22
- package/dist/corpus-watermark.js +23 -23
- package/dist/deep-recall-http-glue.js +2 -2
- package/dist/deep-recall-policy-llm.js +4 -4
- package/dist/direct-answer-wiring.js +2 -2
- package/dist/embedding-fallback.js +1 -1
- package/dist/entity-retrieval.js +21 -21
- package/dist/eval-trajectory-store.js +2 -2
- package/dist/eval-trajectory.js +2 -2
- package/dist/event-order-recall.js +2 -2
- package/dist/explicit-capture.d.ts +3 -2
- package/dist/explicit-capture.d.ts.map +1 -1
- package/dist/explicit-capture.js +530 -6
- package/dist/explicit-cue-recall.js +2 -2
- package/dist/external-wiki-access.js +2 -283
- package/dist/extraction-faithfulness.js +4 -4
- package/dist/extraction-judge.js +5 -5
- package/dist/extraction-normalization.js +1 -1
- package/dist/extraction-quote-grounding.d.ts.map +1 -1
- package/dist/extraction-quote-grounding.js +1 -1
- package/dist/extraction-source-grounding-rules.js +2 -2
- package/dist/extraction-source-grounding.js +3 -3
- package/dist/extraction.js +43 -44
- package/dist/fallback-llm-codex-subscription.js +2 -2
- package/dist/fallback-llm.js +3 -3
- package/dist/{first-start-migration-QFI7B5SH.js → first-start-migration-FILJH3RO.js} +6 -5
- package/dist/{first-start-migration-QFI7B5SH.js.map → first-start-migration-FILJH3RO.js.map} +1 -1
- package/dist/focused-list-recall.js +2 -2
- package/dist/harmonic-retrieval.js +20 -20
- package/dist/index.js +773 -794
- package/dist/lcm/index.js +2 -2
- package/dist/live-connectors-runner.js +2 -3
- package/dist/local-llm-config.js +2 -2
- package/dist/local-llm-helpers.d.ts +4 -0
- package/dist/local-llm-helpers.d.ts.map +1 -1
- package/dist/local-llm-helpers.js +3 -1
- package/dist/local-llm.d.ts +4 -1
- package/dist/local-llm.d.ts.map +1 -1
- package/dist/local-llm.js +4 -4
- package/dist/location/index.js +27 -29
- package/dist/maintenance/memory-governance.js +20 -20
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +20 -20
- package/dist/maintenance/rebuild-memory-projection-runner.js +22 -22
- package/dist/maintenance/rebuild-memory-projection.js +21 -21
- package/dist/memory-browse-operations.js +2 -283
- package/dist/memory-browse.js +8 -7
- package/dist/memory-controller.js +2 -2
- package/dist/memory-subject.js +2 -2
- package/dist/namespaces/migrate.js +21 -21
- package/dist/namespaces/search.js +5 -5
- package/dist/namespaces/storage.js +20 -20
- package/dist/offline-sync-changeset-generations.js +1 -1
- package/dist/offline-sync-embedding-generation.js +1 -1
- package/dist/offline-sync-impression-drain.js +6 -6
- package/dist/offline-sync-snapshot-stream.js +1 -1
- package/dist/offline-sync.js +1 -1
- package/dist/operator-doctor-corpus.js +24 -24
- package/dist/operator-toolkit.js +58 -61
- package/dist/orchestration/backlog-scheduler.js +278 -294
- package/dist/orchestration/backlog-scheduler.js.map +1 -1
- package/dist/orchestration/buffer-drain-runner.js +278 -294
- package/dist/orchestration/extraction-run.d.ts +4 -0
- package/dist/orchestration/extraction-run.d.ts.map +1 -1
- package/dist/orchestration/fact-dedup-window.d.ts +1 -1
- package/dist/orchestration/fact-dedup-window.d.ts.map +1 -1
- package/dist/orchestration/maintenance.js +39 -42
- package/dist/orchestrator.d.ts +9 -11
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +290 -307
- package/dist/page-versioning.js +3 -3
- package/dist/qmd-daemon-session.js +2 -2
- package/dist/qmd.js +3 -3
- package/dist/recall-explain-renderer.js +1 -1
- package/dist/recall-navigation-operations.js +2 -283
- package/dist/recall-navigation.js +332 -59
- package/dist/recall-planner-llm.js +3 -3
- package/dist/recall-state-view-admission.js +6 -6
- package/dist/recall-why-service.js +10 -9
- package/dist/recall-why.js +4 -3
- package/dist/recall-xray-cli.js +2 -2
- package/dist/recall-xray-renderer.js +1 -1
- package/dist/reconcile/manifest.js +3 -3
- package/dist/{resolution-N7H3F2E4.js → resolution-OVVIF7ZY.js} +8 -7
- package/dist/response-guidance-recall.js +2 -2
- package/dist/resume-bundles.js +40 -41
- package/dist/salvage-envelope.js +4 -4
- package/dist/search/factory.js +4 -4
- package/dist/search/index.js +4 -4
- package/dist/semantic-consolidation.js +23 -23
- package/dist/semantic-rule-promotion.js +20 -20
- package/dist/semantic-rule-verifier.js +20 -20
- package/dist/shared-context/manager.js +2 -3
- package/dist/source-agent-qualifier.js +32 -33
- package/dist/standup/build.js +20 -20
- package/dist/storage/buffer-drain-claims.d.ts +97 -12
- package/dist/storage/buffer-drain-claims.d.ts.map +1 -1
- package/dist/storage/buffer-drain-claims.js +1 -1
- package/dist/storage/buffer-session-files.d.ts +4 -0
- package/dist/storage/buffer-session-files.d.ts.map +1 -1
- package/dist/storage/buffer-session-files.js +1 -1
- package/dist/storage/content-hash-index.d.ts +10 -0
- package/dist/storage/content-hash-index.d.ts.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +19 -19
- package/dist/subject-config.js +3 -3
- package/dist/summarizer.d.ts +4 -1
- package/dist/summarizer.d.ts.map +1 -1
- package/dist/summarizer.js +6 -6
- package/dist/support-passport/index.js +53 -297
- package/dist/targeted-fact-recall.js +2 -2
- package/dist/tier-routing.js +3 -2
- package/dist/{tier-stats-FQGQSFET.js → tier-stats-FXEUJN73.js} +6 -5
- package/dist/{tier-stats-FQGQSFET.js.map → tier-stats-FXEUJN73.js.map} +1 -1
- package/dist/transcript.js +2 -2
- package/dist/transfer/capsule-import.js +4 -4
- package/dist/transfer/export-okf.js +20 -20
- package/dist/verified-recall.js +20 -20
- package/dist/wearables/memory-gen.d.ts +5 -1
- package/dist/wearables/memory-gen.d.ts.map +1 -1
- package/dist/wearables/service.d.ts.map +1 -1
- package/dist/who-knows-cli.js +21 -21
- package/dist/who-knows.js +20 -20
- package/dist/write-envelope.js +3 -3
- package/package.json +2 -2
- package/src/access-boundary.ts +5 -1
- package/src/access-category-alias.test.ts +5 -0
- package/src/access-mcp-frames.test.ts +60 -5
- package/src/access-mcp-frames.ts +72 -18
- package/src/access-mcp.test.ts +66 -2
- package/src/access-mcp.ts +19 -13
- package/src/access-service-coding-write.test.ts +7 -0
- package/src/activity/journal-extract-storage.test.ts +31 -0
- package/src/activity/journal-extract.test.ts +1 -0
- package/src/activity/journal-extract.ts +24 -3
- package/src/buffer-drain-handover.test.ts +5 -1
- package/src/connectors/live/google-drive.test.ts +39 -0
- package/src/connectors/live/google-drive.ts +41 -12
- package/src/explicit-capture.test.ts +109 -17
- package/src/explicit-capture.ts +90 -37
- package/src/extraction-quote-grounding.test.ts +20 -0
- package/src/extraction-quote-grounding.ts +21 -11
- package/src/fact-dedup-window.test.ts +37 -0
- package/src/local-llm-helpers.ts +12 -0
- package/src/local-llm-shutdown.test.ts +194 -0
- package/src/local-llm.ts +32 -30
- package/src/orchestration/extraction-run.ts +12 -3
- package/src/orchestration/fact-dedup-window.ts +5 -1
- package/src/orchestrator-connector-dedup.test.ts +9 -5
- package/src/orchestrator.ts +47 -50
- package/src/storage/buffer-drain-claims.test.ts +385 -1
- package/src/storage/buffer-drain-claims.ts +380 -97
- package/src/storage/buffer-session-files.ts +4 -0
- package/src/storage/content-hash-index.ts +27 -2
- package/src/storage-fact-hash-publish-failure.test.ts +87 -0
- package/src/storage.ts +5 -1
- package/src/summarizer-shutdown.test.ts +195 -0
- package/src/summarizer.ts +15 -2
- package/src/wearables/memory-gen.test.ts +20 -0
- package/src/wearables/memory-gen.ts +14 -7
- package/src/wearables/service.ts +14 -1
- package/src/wearables/storage-io.test.ts +25 -0
- package/dist/chunk-2FGLEF7C.js +0 -61
- package/dist/chunk-2FGLEF7C.js.map +0 -1
- package/dist/chunk-3RLK65ZK.js +0 -203
- package/dist/chunk-3RLK65ZK.js.map +0 -1
- package/dist/chunk-4WR2OD7K.js +0 -43
- package/dist/chunk-4WR2OD7K.js.map +0 -1
- package/dist/chunk-5KBIOI4G.js.map +0 -1
- package/dist/chunk-5M5M22GW.js +0 -346
- package/dist/chunk-5M5M22GW.js.map +0 -1
- package/dist/chunk-7HTUYFR3.js.map +0 -1
- package/dist/chunk-AP6NCP3V.js.map +0 -1
- package/dist/chunk-B4QYQFGY.js.map +0 -1
- package/dist/chunk-BJRTMNCB.js +0 -1919
- package/dist/chunk-BJRTMNCB.js.map +0 -1
- package/dist/chunk-BRLXOZLM.js.map +0 -1
- package/dist/chunk-BSACVS6R.js +0 -621
- package/dist/chunk-BSACVS6R.js.map +0 -1
- package/dist/chunk-DKAA2IHQ.js +0 -3644
- package/dist/chunk-DKAA2IHQ.js.map +0 -1
- package/dist/chunk-E4IRW2FG.js.map +0 -1
- package/dist/chunk-E6M225BJ.js.map +0 -1
- package/dist/chunk-EQ4U73UH.js.map +0 -1
- package/dist/chunk-ETSJD5IV.js +0 -361
- package/dist/chunk-ETSJD5IV.js.map +0 -1
- package/dist/chunk-F55YQP7N.js +0 -336
- package/dist/chunk-F55YQP7N.js.map +0 -1
- package/dist/chunk-FHGWKODN.js +0 -2300
- package/dist/chunk-FHGWKODN.js.map +0 -1
- package/dist/chunk-FLRP63GU.js +0 -32219
- package/dist/chunk-FLRP63GU.js.map +0 -1
- package/dist/chunk-FSO3G4JJ.js.map +0 -1
- package/dist/chunk-ID6JGIMD.js +0 -25
- package/dist/chunk-ID6JGIMD.js.map +0 -1
- package/dist/chunk-IGLJNHOX.js +0 -62
- package/dist/chunk-IGLJNHOX.js.map +0 -1
- package/dist/chunk-IPT2OY4B.js.map +0 -1
- package/dist/chunk-IUKYFTGW.js.map +0 -1
- package/dist/chunk-NBH6K6G5.js.map +0 -1
- package/dist/chunk-NT7F7WJQ.js.map +0 -1
- package/dist/chunk-NTRUKAAE.js +0 -223
- package/dist/chunk-NTRUKAAE.js.map +0 -1
- package/dist/chunk-OGXXGHW6.js +0 -223
- package/dist/chunk-OGXXGHW6.js.map +0 -1
- package/dist/chunk-PPCLZ4JU.js +0 -28
- package/dist/chunk-PPCLZ4JU.js.map +0 -1
- package/dist/chunk-QJPJXCS4.js.map +0 -1
- package/dist/chunk-R2LBF4HH.js +0 -729
- package/dist/chunk-R2LBF4HH.js.map +0 -1
- package/dist/chunk-RHQLIHMB.js.map +0 -1
- package/dist/chunk-RRTVGD3J.js +0 -792
- package/dist/chunk-RRTVGD3J.js.map +0 -1
- package/dist/chunk-SUSW74WU.js.map +0 -1
- package/dist/chunk-T6OZW2WR.js.map +0 -1
- package/dist/chunk-UDKWFDV2.js.map +0 -1
- package/dist/chunk-V7IZKJI3.js +0 -22
- package/dist/chunk-V7IZKJI3.js.map +0 -1
- package/dist/chunk-X562NQFA.js +0 -10144
- package/dist/chunk-X562NQFA.js.map +0 -1
- package/dist/chunk-XDSCJOH7.js +0 -3991
- package/dist/chunk-XDSCJOH7.js.map +0 -1
- package/dist/chunk-YCNIGRRF.js.map +0 -1
- package/dist/chunk-ZTTCDQ4I.js +0 -18796
- package/dist/chunk-ZTTCDQ4I.js.map +0 -1
- /package/dist/{capsule-merge-2IIXFXN5.js.map → capsule-merge-6IDAYTKG.js.map} +0 -0
- /package/dist/{chunk-RGUUBAT5.js.map → chunk-2WCLTWV2.js.map} +0 -0
- /package/dist/{chunk-BQZEGOZ4.js.map → chunk-2YODOG2O.js.map} +0 -0
- /package/dist/{chunk-WYG5UNDY.js.map → chunk-3AUDELZL.js.map} +0 -0
- /package/dist/{chunk-MB6ZJDN6.js.map → chunk-3FBAEPCU.js.map} +0 -0
- /package/dist/{chunk-PIITB2YZ.js.map → chunk-3ZS3NUEI.js.map} +0 -0
- /package/dist/{chunk-ATPWZ4F7.js.map → chunk-4EZWSDFL.js.map} +0 -0
- /package/dist/{chunk-ANZZLRUX.js.map → chunk-4IVRQMZW.js.map} +0 -0
- /package/dist/{chunk-63E37JCN.js.map → chunk-4RAJT5L2.js.map} +0 -0
- /package/dist/{chunk-45VUHDV2.js.map → chunk-5CO5G4MN.js.map} +0 -0
- /package/dist/{chunk-LUJCQQ3L.js.map → chunk-65HWAQ4F.js.map} +0 -0
- /package/dist/{chunk-T67LUYCR.js.map → chunk-77NTFICT.js.map} +0 -0
- /package/dist/{chunk-UE6RRXMF.js.map → chunk-A4F7OIC5.js.map} +0 -0
- /package/dist/{chunk-RRJBDXAQ.js.map → chunk-B377OKUP.js.map} +0 -0
- /package/dist/{chunk-Z7JIZ42P.js.map → chunk-BN2EBCLB.js.map} +0 -0
- /package/dist/{chunk-YYOMGOHB.js.map → chunk-BOK6BN5M.js.map} +0 -0
- /package/dist/{chunk-U6UNF5ZS.js.map → chunk-BPK32FRM.js.map} +0 -0
- /package/dist/{chunk-OH7QLI6W.js.map → chunk-BPPUH5JM.js.map} +0 -0
- /package/dist/{chunk-O6ZSWHVR.js.map → chunk-C2KE5DMD.js.map} +0 -0
- /package/dist/{chunk-47F6WWLQ.js.map → chunk-C73N66PR.js.map} +0 -0
- /package/dist/{chunk-WRT7GJ2D.js.map → chunk-CIWMTNHW.js.map} +0 -0
- /package/dist/{chunk-HF3BKUVV.js.map → chunk-CL4JU3DF.js.map} +0 -0
- /package/dist/{chunk-O55EKIEC.js.map → chunk-D3ZKHLN2.js.map} +0 -0
- /package/dist/{chunk-ETZLQOUR.js.map → chunk-D5XG2KPS.js.map} +0 -0
- /package/dist/{chunk-CD4BCCNP.js.map → chunk-DJ7WVEWX.js.map} +0 -0
- /package/dist/{chunk-PWXPRVLK.js.map → chunk-DNY63QWJ.js.map} +0 -0
- /package/dist/{chunk-4CJTQHEG.js.map → chunk-ESLOLCD4.js.map} +0 -0
- /package/dist/{chunk-VILPVT4S.js.map → chunk-EZ47HOJ6.js.map} +0 -0
- /package/dist/{chunk-EFYN5I7Z.js.map → chunk-F4QFU5IZ.js.map} +0 -0
- /package/dist/{chunk-XYKBWTWI.js.map → chunk-FZZMLGWQ.js.map} +0 -0
- /package/dist/{chunk-FNXQZGUS.js.map → chunk-GBJUTX44.js.map} +0 -0
- /package/dist/{chunk-YLXETSAH.js.map → chunk-GCZJ7XRI.js.map} +0 -0
- /package/dist/{chunk-JV4S6VDH.js.map → chunk-ILY5SSOM.js.map} +0 -0
- /package/dist/{chunk-EXHXJETE.js.map → chunk-IQ55QGY5.js.map} +0 -0
- /package/dist/{chunk-4J363OAA.js.map → chunk-J7BIFOYP.js.map} +0 -0
- /package/dist/{chunk-QFEDITXM.js.map → chunk-JNDMIAJ4.js.map} +0 -0
- /package/dist/{chunk-E5PPE4VA.js.map → chunk-K2VRKCPA.js.map} +0 -0
- /package/dist/{chunk-MKRYQROF.js.map → chunk-LGEHAQHK.js.map} +0 -0
- /package/dist/{chunk-XYTQJD7F.js.map → chunk-LMJVP5CM.js.map} +0 -0
- /package/dist/{chunk-E7YZXWIS.js.map → chunk-LNGELD2M.js.map} +0 -0
- /package/dist/{chunk-FQKBJJYB.js.map → chunk-LPV72KRQ.js.map} +0 -0
- /package/dist/{chunk-2LCRG2YV.js.map → chunk-M2XR6B6V.js.map} +0 -0
- /package/dist/{chunk-ZU5JDLOH.js.map → chunk-MMRTPH3J.js.map} +0 -0
- /package/dist/{chunk-TVIVY7KU.js.map → chunk-NED7IR7B.js.map} +0 -0
- /package/dist/{chunk-6F5MJFXY.js.map → chunk-NHVAX7MH.js.map} +0 -0
- /package/dist/{chunk-TG3R2SID.js.map → chunk-NMGHGTVR.js.map} +0 -0
- /package/dist/{chunk-NGHDW6UU.js.map → chunk-NUQEREIP.js.map} +0 -0
- /package/dist/{chunk-5IIQU4JZ.js.map → chunk-OB72KNMF.js.map} +0 -0
- /package/dist/{chunk-RIMK327Y.js.map → chunk-OUVYYKYU.js.map} +0 -0
- /package/dist/{chunk-RWGRSKN5.js.map → chunk-PT4DZDJA.js.map} +0 -0
- /package/dist/{chunk-7EPY3IQL.js.map → chunk-PZJQ46DH.js.map} +0 -0
- /package/dist/{chunk-MXHMNKWG.js.map → chunk-QDESY76F.js.map} +0 -0
- /package/dist/{chunk-E3A7ELSG.js.map → chunk-QHARXWTC.js.map} +0 -0
- /package/dist/{chunk-BLJT6JP2.js.map → chunk-QMFAMOT2.js.map} +0 -0
- /package/dist/{chunk-I6QGI65T.js.map → chunk-QRMG4HK4.js.map} +0 -0
- /package/dist/{chunk-ZU3NJNO7.js.map → chunk-QSF5SJAM.js.map} +0 -0
- /package/dist/{chunk-5IYOKDM4.js.map → chunk-R23JWJD3.js.map} +0 -0
- /package/dist/{chunk-P4WNBSTW.js.map → chunk-RNG7S3FY.js.map} +0 -0
- /package/dist/{chunk-ZGFLIK5H.js.map → chunk-SPAKBUJY.js.map} +0 -0
- /package/dist/{chunk-ER7XANP3.js.map → chunk-SQ3GEIEL.js.map} +0 -0
- /package/dist/{chunk-PMJFRDJI.js.map → chunk-SUTEBYGI.js.map} +0 -0
- /package/dist/{chunk-R6HMAIKM.js.map → chunk-TOSPNM4T.js.map} +0 -0
- /package/dist/{chunk-RMXS4I66.js.map → chunk-TVDJEUV5.js.map} +0 -0
- /package/dist/{chunk-PLCYKAWH.js.map → chunk-TYRWSE4B.js.map} +0 -0
- /package/dist/{chunk-IQWUACVG.js.map → chunk-UHMHJX5G.js.map} +0 -0
- /package/dist/{chunk-YODUDA6R.js.map → chunk-UN4RVUG2.js.map} +0 -0
- /package/dist/{chunk-E6Z4FBX6.js.map → chunk-V2QSNFCT.js.map} +0 -0
- /package/dist/{chunk-7W3RXOIG.js.map → chunk-WGGRZYSQ.js.map} +0 -0
- /package/dist/{chunk-RIZ5NUNN.js.map → chunk-WQ4XKIOX.js.map} +0 -0
- /package/dist/{chunk-QEYTRFR3.js.map → chunk-X26YOFGS.js.map} +0 -0
- /package/dist/{chunk-ITHZFHST.js.map → chunk-X2BVB74H.js.map} +0 -0
- /package/dist/{chunk-6F42QONS.js.map → chunk-X5HGU2EM.js.map} +0 -0
- /package/dist/{chunk-GVGAO3WV.js.map → chunk-XJ2S5UBF.js.map} +0 -0
- /package/dist/{chunk-IBJ6U753.js.map → chunk-XKZBZOKV.js.map} +0 -0
- /package/dist/{chunk-65AUYLU3.js.map → chunk-XPXHQI6N.js.map} +0 -0
- /package/dist/{chunk-HH5LY6RR.js.map → chunk-YIXJSW5M.js.map} +0 -0
- /package/dist/{chunk-2JSDPUKD.js.map → chunk-YMFPFXEX.js.map} +0 -0
- /package/dist/{chunk-N4KAE2NB.js.map → chunk-Z3FTSHT5.js.map} +0 -0
- /package/dist/{chunk-7GLJMDEQ.js.map → chunk-ZDV5YWID.js.map} +0 -0
- /package/dist/{chunk-645WOU5I.js.map → chunk-ZDZJNXL6.js.map} +0 -0
- /package/dist/{chunk-6TCXIRP5.js.map → chunk-ZKE4CO6B.js.map} +0 -0
- /package/dist/{contradiction-scan-P2MHYFVG.js.map → contradiction-scan-IBPYGQZF.js.map} +0 -0
- /package/dist/{resolution-N7H3F2E4.js.map → resolution-OVVIF7ZY.js.map} +0 -0
package/dist/chunk-5M5M22GW.js
DELETED
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
|
|
3
|
-
SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES
|
|
4
|
-
} from "./chunk-ZTTCDQ4I.js";
|
|
5
|
-
import {
|
|
6
|
-
SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
|
|
7
|
-
} from "./chunk-YCNIGRRF.js";
|
|
8
|
-
|
|
9
|
-
// src/support-passport/model-bridge.ts
|
|
10
|
-
import { randomUUID } from "crypto";
|
|
11
|
-
import { z } from "zod";
|
|
12
|
-
var SUPPORT_PASSPORT_MODEL_JOB_PATH = "/engram/v1/support-passport/internal/model/jobs/next";
|
|
13
|
-
var SUPPORT_PASSPORT_MODEL_ACK_PATH = "/engram/v1/support-passport/internal/model/jobs/ack";
|
|
14
|
-
var SUPPORT_PASSPORT_MODEL_RESULT_PATH = "/engram/v1/support-passport/internal/model/jobs/result";
|
|
15
|
-
var CONSUMER_HANDOFF_GRACE_MS = 1e3;
|
|
16
|
-
var MAX_JSON_STRING_EXPANSION = 6;
|
|
17
|
-
var MAX_DRAFT_MESSAGE_STRUCTURE = JSON.stringify({
|
|
18
|
-
sourceNotes: Array.from({ length: SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES }, () => ({ memoryId: "", content: "" }))
|
|
19
|
-
}).length;
|
|
20
|
-
var MAX_MODEL_MESSAGE_CHARACTERS = MAX_DRAFT_MESSAGE_STRUCTURE + MAX_JSON_STRING_EXPANSION * (SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS + SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES * SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH);
|
|
21
|
-
var ModelMessageSchema = z.object({
|
|
22
|
-
role: z.enum(["system", "user", "assistant"]),
|
|
23
|
-
content: z.string().max(MAX_MODEL_MESSAGE_CHARACTERS)
|
|
24
|
-
}).strict();
|
|
25
|
-
var ModelJobSchema = z.object({
|
|
26
|
-
id: z.string().uuid(),
|
|
27
|
-
claimId: z.string().uuid().optional(),
|
|
28
|
-
messages: z.array(ModelMessageSchema).min(1).max(8),
|
|
29
|
-
temperature: z.number().finite().min(0).max(2),
|
|
30
|
-
maxTokens: z.number().int().min(1).max(32e3),
|
|
31
|
-
timeoutMs: z.number().int().min(1).max(12e4),
|
|
32
|
-
claimAckTimeoutMs: z.number().int().min(1).max(12e4).optional(),
|
|
33
|
-
executionLeaseTimeoutMs: z.number().int().min(1).max(12e4).optional(),
|
|
34
|
-
operation: z.enum(["support-passport-draft", "support-passport-answer"]),
|
|
35
|
-
jsonSchema: z.object({
|
|
36
|
-
name: z.string().min(1).max(128),
|
|
37
|
-
schema: z.record(z.string(), z.unknown())
|
|
38
|
-
}).strict()
|
|
39
|
-
}).strict();
|
|
40
|
-
function parseSupportPassportModelJob(value) {
|
|
41
|
-
const parsed = ModelJobSchema.safeParse(value);
|
|
42
|
-
return parsed.success ? parsed.data : void 0;
|
|
43
|
-
}
|
|
44
|
-
var ModelResultSchema = z.object({
|
|
45
|
-
id: z.string().uuid(),
|
|
46
|
-
claimId: z.string().uuid().optional(),
|
|
47
|
-
result: z.object({
|
|
48
|
-
content: z.string().max(25e4),
|
|
49
|
-
modelUsed: z.string().min(1).max(512),
|
|
50
|
-
usage: z.object({
|
|
51
|
-
inputTokens: z.number().int().nonnegative().optional(),
|
|
52
|
-
outputTokens: z.number().int().nonnegative().optional(),
|
|
53
|
-
totalTokens: z.number().int().nonnegative().optional()
|
|
54
|
-
}).strict().optional()
|
|
55
|
-
}).strict().nullable()
|
|
56
|
-
}).strict();
|
|
57
|
-
var ModelClaimSchema = z.object({
|
|
58
|
-
id: z.string().uuid(),
|
|
59
|
-
claimId: z.string().uuid()
|
|
60
|
-
}).strict();
|
|
61
|
-
function respondJson(res, status, payload) {
|
|
62
|
-
const body = JSON.stringify(payload);
|
|
63
|
-
res.statusCode = status;
|
|
64
|
-
res.setHeader("cache-control", "no-store");
|
|
65
|
-
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
66
|
-
res.setHeader("content-length", String(Buffer.byteLength(body)));
|
|
67
|
-
res.end(body);
|
|
68
|
-
}
|
|
69
|
-
function respondNoContent(res) {
|
|
70
|
-
res.statusCode = 204;
|
|
71
|
-
res.setHeader("cache-control", "no-store");
|
|
72
|
-
res.end();
|
|
73
|
-
}
|
|
74
|
-
function requestPath(req) {
|
|
75
|
-
try {
|
|
76
|
-
return new URL(req.url ?? "/", "http://placeholder").pathname;
|
|
77
|
-
} catch {
|
|
78
|
-
return void 0;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
async function readJson(req, maxBytes) {
|
|
82
|
-
const chunks = [];
|
|
83
|
-
let bytes = 0;
|
|
84
|
-
for await (const chunk of req) {
|
|
85
|
-
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
86
|
-
bytes += buffer.length;
|
|
87
|
-
if (bytes > maxBytes) throw new Error("request_too_large");
|
|
88
|
-
chunks.push(buffer);
|
|
89
|
-
}
|
|
90
|
-
return JSON.parse(Buffer.concat(chunks, bytes).toString("utf8"));
|
|
91
|
-
}
|
|
92
|
-
var SupportPassportModelBridge = class {
|
|
93
|
-
route;
|
|
94
|
-
requestHandler;
|
|
95
|
-
maxPendingJobs;
|
|
96
|
-
claimAckTimeoutMs;
|
|
97
|
-
executionLeaseTimeoutMs;
|
|
98
|
-
pending = /* @__PURE__ */ new Map();
|
|
99
|
-
available = [];
|
|
100
|
-
waiters = [];
|
|
101
|
-
claimed = /* @__PURE__ */ new Set();
|
|
102
|
-
lastConsumerPollAt = 0;
|
|
103
|
-
closed = false;
|
|
104
|
-
constructor(options = {}) {
|
|
105
|
-
this.maxPendingJobs = options.maxPendingJobs ?? 32;
|
|
106
|
-
this.claimAckTimeoutMs = options.claimAckTimeoutMs ?? 5e3;
|
|
107
|
-
this.executionLeaseTimeoutMs = options.executionLeaseTimeoutMs ?? 15e3;
|
|
108
|
-
if (!Number.isInteger(this.maxPendingJobs) || this.maxPendingJobs < 1) {
|
|
109
|
-
throw new Error("maxPendingJobs must be a positive integer");
|
|
110
|
-
}
|
|
111
|
-
if (!Number.isInteger(this.claimAckTimeoutMs) || this.claimAckTimeoutMs < 1) {
|
|
112
|
-
throw new Error("claimAckTimeoutMs must be a positive integer");
|
|
113
|
-
}
|
|
114
|
-
if (!Number.isInteger(this.executionLeaseTimeoutMs) || this.executionLeaseTimeoutMs < 1 || this.executionLeaseTimeoutMs > 12e4) {
|
|
115
|
-
throw new Error("executionLeaseTimeoutMs must be an integer from 1 through 120000");
|
|
116
|
-
}
|
|
117
|
-
this.route = {
|
|
118
|
-
kind: "gateway",
|
|
119
|
-
invoke: (messages, invokeOptions) => this.invoke(messages, invokeOptions)
|
|
120
|
-
};
|
|
121
|
-
this.requestHandler = (req, res, ctx) => this.handleRequest(req, res, ctx.authorized, ctx.tokenAuthorized);
|
|
122
|
-
}
|
|
123
|
-
close() {
|
|
124
|
-
if (this.closed) return;
|
|
125
|
-
this.closed = true;
|
|
126
|
-
for (const pending of this.pending.values()) pending.resolve(null);
|
|
127
|
-
this.pending.clear();
|
|
128
|
-
this.available.length = 0;
|
|
129
|
-
this.claimed.clear();
|
|
130
|
-
for (const waiter of this.waiters.splice(0)) waiter.resolve(null);
|
|
131
|
-
}
|
|
132
|
-
invoke(messages, options) {
|
|
133
|
-
const consumerAvailable = this.waiters.length > 0 || this.claimed.size > 0 || Date.now() - this.lastConsumerPollAt <= CONSUMER_HANDOFF_GRACE_MS;
|
|
134
|
-
if (!consumerAvailable || this.closed || this.pending.size >= this.maxPendingJobs || options.signal?.aborted) {
|
|
135
|
-
return Promise.resolve(null);
|
|
136
|
-
}
|
|
137
|
-
const parsed = ModelJobSchema.safeParse({
|
|
138
|
-
id: randomUUID(),
|
|
139
|
-
messages,
|
|
140
|
-
temperature: options.temperature,
|
|
141
|
-
maxTokens: options.maxTokens,
|
|
142
|
-
timeoutMs: options.timeoutMs,
|
|
143
|
-
operation: options.operation,
|
|
144
|
-
jsonSchema: options.jsonSchema
|
|
145
|
-
});
|
|
146
|
-
if (!parsed.success) return Promise.resolve(null);
|
|
147
|
-
return new Promise((resolve) => {
|
|
148
|
-
let settled = false;
|
|
149
|
-
const deadlineAt = Date.now() + parsed.data.timeoutMs;
|
|
150
|
-
const timeout = setTimeout(() => settle(null), parsed.data.timeoutMs);
|
|
151
|
-
const settle = (result) => {
|
|
152
|
-
if (settled) return;
|
|
153
|
-
settled = true;
|
|
154
|
-
clearTimeout(timeout);
|
|
155
|
-
const pending = this.pending.get(parsed.data.id);
|
|
156
|
-
if (pending?.claimTimer) clearTimeout(pending.claimTimer);
|
|
157
|
-
this.pending.delete(parsed.data.id);
|
|
158
|
-
this.claimed.delete(parsed.data.id);
|
|
159
|
-
const availableIndex = this.available.indexOf(parsed.data.id);
|
|
160
|
-
if (availableIndex >= 0) this.available.splice(availableIndex, 1);
|
|
161
|
-
options.signal?.removeEventListener("abort", abort);
|
|
162
|
-
resolve(result);
|
|
163
|
-
};
|
|
164
|
-
const abort = () => settle(null);
|
|
165
|
-
const requeue = () => {
|
|
166
|
-
const pending = this.pending.get(parsed.data.id);
|
|
167
|
-
if (!pending || !this.claimed.delete(parsed.data.id)) return;
|
|
168
|
-
if (pending.claimTimer) clearTimeout(pending.claimTimer);
|
|
169
|
-
pending.claimTimer = void 0;
|
|
170
|
-
pending.claimId = void 0;
|
|
171
|
-
const waiter2 = this.waiters.shift();
|
|
172
|
-
if (waiter2) {
|
|
173
|
-
waiter2.resolve(this.claimPending(pending, waiter2.claimLease));
|
|
174
|
-
} else {
|
|
175
|
-
this.available.push(parsed.data.id);
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
this.pending.set(parsed.data.id, {
|
|
179
|
-
job: parsed.data,
|
|
180
|
-
deadlineAt,
|
|
181
|
-
resolve: settle,
|
|
182
|
-
requeue
|
|
183
|
-
});
|
|
184
|
-
options.signal?.addEventListener("abort", abort, { once: true });
|
|
185
|
-
const waiter = this.waiters.shift();
|
|
186
|
-
if (waiter) {
|
|
187
|
-
const pending = this.pending.get(parsed.data.id);
|
|
188
|
-
waiter.resolve(pending ? this.claimPending(pending, waiter.claimLease) : null);
|
|
189
|
-
} else this.available.push(parsed.data.id);
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
claimedJob(job) {
|
|
193
|
-
const pending = this.pending.get(job.id);
|
|
194
|
-
if (!pending) return null;
|
|
195
|
-
const remainingMs = pending.deadlineAt - Date.now();
|
|
196
|
-
if (remainingMs <= 0) {
|
|
197
|
-
pending.resolve(null);
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
return { ...job, timeoutMs: remainingMs };
|
|
201
|
-
}
|
|
202
|
-
claimPending(pending, claimLease) {
|
|
203
|
-
const job = this.claimedJob(pending.job);
|
|
204
|
-
if (!job) return null;
|
|
205
|
-
this.claimed.add(job.id);
|
|
206
|
-
if (!claimLease) return job;
|
|
207
|
-
const claimAckTimeoutMs = Math.min(this.claimAckTimeoutMs, job.timeoutMs);
|
|
208
|
-
const executionLeaseTimeoutMs = Math.min(this.executionLeaseTimeoutMs, job.timeoutMs);
|
|
209
|
-
pending.claimId = randomUUID();
|
|
210
|
-
this.armClaimTimer(pending, claimAckTimeoutMs);
|
|
211
|
-
return { ...job, claimId: pending.claimId, claimAckTimeoutMs, executionLeaseTimeoutMs };
|
|
212
|
-
}
|
|
213
|
-
armClaimTimer(pending, timeoutMs) {
|
|
214
|
-
if (pending.claimTimer) clearTimeout(pending.claimTimer);
|
|
215
|
-
pending.claimTimer = setTimeout(() => pending.requeue(), timeoutMs);
|
|
216
|
-
pending.claimTimer.unref?.();
|
|
217
|
-
}
|
|
218
|
-
takeAvailable(claimLease) {
|
|
219
|
-
for (; ; ) {
|
|
220
|
-
const id = this.available.shift();
|
|
221
|
-
if (!id) return null;
|
|
222
|
-
const pending = this.pending.get(id);
|
|
223
|
-
if (pending) {
|
|
224
|
-
return this.claimPending(pending, claimLease);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
nextJob(timeoutMs, signal, claimLease) {
|
|
229
|
-
const available = this.takeAvailable(claimLease);
|
|
230
|
-
if (available || this.closed || signal.aborted || timeoutMs === 0 || this.waiters.length >= this.maxPendingJobs) {
|
|
231
|
-
return Promise.resolve(available);
|
|
232
|
-
}
|
|
233
|
-
return new Promise((resolve) => {
|
|
234
|
-
let active = true;
|
|
235
|
-
const done = (job) => {
|
|
236
|
-
if (!active) return;
|
|
237
|
-
active = false;
|
|
238
|
-
clearTimeout(timeout);
|
|
239
|
-
signal.removeEventListener("abort", abort);
|
|
240
|
-
resolve(job);
|
|
241
|
-
};
|
|
242
|
-
const waiter = { claimLease, resolve: done };
|
|
243
|
-
const abort = () => {
|
|
244
|
-
const index = this.waiters.indexOf(waiter);
|
|
245
|
-
if (index >= 0) this.waiters.splice(index, 1);
|
|
246
|
-
done(null);
|
|
247
|
-
};
|
|
248
|
-
const timeout = setTimeout(() => {
|
|
249
|
-
const index = this.waiters.indexOf(waiter);
|
|
250
|
-
if (index >= 0) this.waiters.splice(index, 1);
|
|
251
|
-
done(null);
|
|
252
|
-
}, timeoutMs);
|
|
253
|
-
signal.addEventListener("abort", abort, { once: true });
|
|
254
|
-
this.waiters.push(waiter);
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
async handleRequest(req, res, authorized, tokenAuthorized) {
|
|
258
|
-
const pathname = requestPath(req);
|
|
259
|
-
const owned = req.method === "POST" && (pathname === SUPPORT_PASSPORT_MODEL_JOB_PATH || pathname === SUPPORT_PASSPORT_MODEL_ACK_PATH || pathname === SUPPORT_PASSPORT_MODEL_RESULT_PATH);
|
|
260
|
-
if (!owned) return false;
|
|
261
|
-
if (!tokenAuthorized) {
|
|
262
|
-
res.setHeader("www-authenticate", "Bearer");
|
|
263
|
-
respondJson(res, 401, { error: "unauthorized", code: "unauthorized" });
|
|
264
|
-
return true;
|
|
265
|
-
}
|
|
266
|
-
if (!authorized) {
|
|
267
|
-
respondJson(res, 403, { error: "forbidden", code: "forbidden" });
|
|
268
|
-
return true;
|
|
269
|
-
}
|
|
270
|
-
if (pathname === SUPPORT_PASSPORT_MODEL_JOB_PATH) {
|
|
271
|
-
let timeoutMs = 2e4;
|
|
272
|
-
let claimLease = false;
|
|
273
|
-
try {
|
|
274
|
-
const parsed = z.object({
|
|
275
|
-
timeoutMs: z.number().int().min(0).max(25e3),
|
|
276
|
-
claimLease: z.boolean().optional()
|
|
277
|
-
}).strict().parse(await readJson(req, 1024));
|
|
278
|
-
timeoutMs = parsed.timeoutMs;
|
|
279
|
-
claimLease = parsed.claimLease === true;
|
|
280
|
-
} catch {
|
|
281
|
-
respondJson(res, 400, { error: "invalid_request", code: "invalid_request" });
|
|
282
|
-
return true;
|
|
283
|
-
}
|
|
284
|
-
const controller = new AbortController();
|
|
285
|
-
const abort = () => controller.abort();
|
|
286
|
-
req.once("aborted", abort);
|
|
287
|
-
res.once("close", abort);
|
|
288
|
-
const job = await this.nextJob(timeoutMs, controller.signal, claimLease);
|
|
289
|
-
req.off("aborted", abort);
|
|
290
|
-
res.off("close", abort);
|
|
291
|
-
if (res.destroyed) {
|
|
292
|
-
if (job) this.pending.get(job.id)?.requeue();
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
this.lastConsumerPollAt = Date.now();
|
|
296
|
-
if (job) respondJson(res, 200, job);
|
|
297
|
-
else if (this.closed) respondJson(res, 410, { error: "bridge_closed", code: "bridge_closed" });
|
|
298
|
-
else respondNoContent(res);
|
|
299
|
-
return true;
|
|
300
|
-
}
|
|
301
|
-
if (pathname === SUPPORT_PASSPORT_MODEL_ACK_PATH) {
|
|
302
|
-
try {
|
|
303
|
-
const parsed = ModelClaimSchema.parse(await readJson(req, 1024));
|
|
304
|
-
const pending = this.pending.get(parsed.id);
|
|
305
|
-
if (!pending || !this.claimed.has(parsed.id) || pending.claimId !== parsed.claimId) {
|
|
306
|
-
respondJson(res, 404, { error: "job_not_found", code: "job_not_found" });
|
|
307
|
-
return true;
|
|
308
|
-
}
|
|
309
|
-
const remainingMs = pending.deadlineAt - Date.now();
|
|
310
|
-
if (remainingMs <= 0) {
|
|
311
|
-
pending.resolve(null);
|
|
312
|
-
respondJson(res, 404, { error: "job_not_found", code: "job_not_found" });
|
|
313
|
-
return true;
|
|
314
|
-
}
|
|
315
|
-
this.armClaimTimer(pending, Math.min(this.executionLeaseTimeoutMs, remainingMs));
|
|
316
|
-
respondNoContent(res);
|
|
317
|
-
} catch {
|
|
318
|
-
respondJson(res, 400, { error: "invalid_request", code: "invalid_request" });
|
|
319
|
-
}
|
|
320
|
-
return true;
|
|
321
|
-
}
|
|
322
|
-
try {
|
|
323
|
-
const parsed = ModelResultSchema.parse(await readJson(req, 3e5));
|
|
324
|
-
const pending = this.pending.get(parsed.id);
|
|
325
|
-
if (!pending || !this.claimed.has(parsed.id) || pending.claimId !== void 0 && pending.claimId !== parsed.claimId) {
|
|
326
|
-
respondJson(res, 404, { error: "job_not_found", code: "job_not_found" });
|
|
327
|
-
return true;
|
|
328
|
-
}
|
|
329
|
-
this.lastConsumerPollAt = Date.now();
|
|
330
|
-
pending.resolve(parsed.result);
|
|
331
|
-
respondNoContent(res);
|
|
332
|
-
} catch {
|
|
333
|
-
respondJson(res, 400, { error: "invalid_request", code: "invalid_request" });
|
|
334
|
-
}
|
|
335
|
-
return true;
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
export {
|
|
340
|
-
SUPPORT_PASSPORT_MODEL_JOB_PATH,
|
|
341
|
-
SUPPORT_PASSPORT_MODEL_ACK_PATH,
|
|
342
|
-
SUPPORT_PASSPORT_MODEL_RESULT_PATH,
|
|
343
|
-
parseSupportPassportModelJob,
|
|
344
|
-
SupportPassportModelBridge
|
|
345
|
-
};
|
|
346
|
-
//# sourceMappingURL=chunk-5M5M22GW.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/support-passport/model-bridge.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { z } from \"zod\";\n\nimport { SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH } from \"./contracts.js\";\nimport type {\n SupportPassportModelMessage,\n SupportPassportModelRoute,\n SupportPassportModelRouteResult,\n} from \"./model-adapter.js\";\nimport {\n SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,\n SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES,\n} from \"./model-contracts.js\";\nimport type { SupportPassportExternalRequestHandler } from \"./public-http.js\";\n\nexport const SUPPORT_PASSPORT_MODEL_JOB_PATH = \"/engram/v1/support-passport/internal/model/jobs/next\";\nexport const SUPPORT_PASSPORT_MODEL_ACK_PATH = \"/engram/v1/support-passport/internal/model/jobs/ack\";\nexport const SUPPORT_PASSPORT_MODEL_RESULT_PATH = \"/engram/v1/support-passport/internal/model/jobs/result\";\n\nconst CONSUMER_HANDOFF_GRACE_MS = 1_000;\nconst MAX_JSON_STRING_EXPANSION = 6;\nconst MAX_DRAFT_MESSAGE_STRUCTURE = JSON.stringify({\n sourceNotes: Array.from({ length: SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES }, () => ({ memoryId: \"\", content: \"\" })),\n}).length;\nconst MAX_MODEL_MESSAGE_CHARACTERS =\n MAX_DRAFT_MESSAGE_STRUCTURE +\n MAX_JSON_STRING_EXPANSION *\n (SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS +\n SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES * SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH);\n\nconst ModelMessageSchema = z\n .object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.string().max(MAX_MODEL_MESSAGE_CHARACTERS),\n })\n .strict();\n\nconst ModelJobSchema = z\n .object({\n id: z.string().uuid(),\n claimId: z.string().uuid().optional(),\n messages: z.array(ModelMessageSchema).min(1).max(8),\n temperature: z.number().finite().min(0).max(2),\n maxTokens: z.number().int().min(1).max(32_000),\n timeoutMs: z.number().int().min(1).max(120_000),\n claimAckTimeoutMs: z.number().int().min(1).max(120_000).optional(),\n executionLeaseTimeoutMs: z.number().int().min(1).max(120_000).optional(),\n operation: z.enum([\"support-passport-draft\", \"support-passport-answer\"]),\n jsonSchema: z\n .object({\n name: z.string().min(1).max(128),\n schema: z.record(z.string(), z.unknown()),\n })\n .strict(),\n })\n .strict();\n\nexport type SupportPassportModelJob = z.infer<typeof ModelJobSchema>;\n\nexport function parseSupportPassportModelJob(value: unknown): SupportPassportModelJob | undefined {\n const parsed = ModelJobSchema.safeParse(value);\n return parsed.success ? parsed.data : undefined;\n}\n\nconst ModelResultSchema = z\n .object({\n id: z.string().uuid(),\n claimId: z.string().uuid().optional(),\n result: z\n .object({\n content: z.string().max(250_000),\n modelUsed: z.string().min(1).max(512),\n usage: z\n .object({\n inputTokens: z.number().int().nonnegative().optional(),\n outputTokens: z.number().int().nonnegative().optional(),\n totalTokens: z.number().int().nonnegative().optional(),\n })\n .strict()\n .optional(),\n })\n .strict()\n .nullable(),\n })\n .strict();\n\nconst ModelClaimSchema = z\n .object({\n id: z.string().uuid(),\n claimId: z.string().uuid(),\n })\n .strict();\n\ninterface PendingJob {\n job: SupportPassportModelJob;\n deadlineAt: number;\n claimId?: string;\n claimTimer?: ReturnType<typeof setTimeout>;\n resolve: (result: SupportPassportModelRouteResult | null) => void;\n requeue(): void;\n}\n\ninterface PendingWaiter {\n claimLease: boolean;\n resolve(job: SupportPassportModelJob | null): void;\n}\n\nexport interface SupportPassportModelBridgeOptions {\n maxPendingJobs?: number;\n claimAckTimeoutMs?: number;\n executionLeaseTimeoutMs?: number;\n}\n\nfunction respondJson(res: ServerResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n res.statusCode = status;\n res.setHeader(\"cache-control\", \"no-store\");\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n res.end(body);\n}\n\nfunction respondNoContent(res: ServerResponse): void {\n res.statusCode = 204;\n res.setHeader(\"cache-control\", \"no-store\");\n res.end();\n}\n\nfunction requestPath(req: IncomingMessage): string | undefined {\n try {\n return new URL(req.url ?? \"/\", \"http://placeholder\").pathname;\n } catch {\n return undefined;\n }\n}\n\nasync function readJson(req: IncomingMessage, maxBytes: number): Promise<unknown> {\n const chunks: Buffer[] = [];\n let bytes = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n bytes += buffer.length;\n if (bytes > maxBytes) throw new Error(\"request_too_large\");\n chunks.push(buffer);\n }\n return JSON.parse(Buffer.concat(chunks, bytes).toString(\"utf8\"));\n}\n\n/**\n * In-memory transport between a standalone Remnic daemon and its OpenClaw\n * delegate. The transport carries provider-neutral model jobs only.\n */\nexport class SupportPassportModelBridge {\n readonly route: SupportPassportModelRoute;\n readonly requestHandler: SupportPassportExternalRequestHandler;\n\n private readonly maxPendingJobs: number;\n private readonly claimAckTimeoutMs: number;\n private readonly executionLeaseTimeoutMs: number;\n private readonly pending = new Map<string, PendingJob>();\n private readonly available: string[] = [];\n private readonly waiters: PendingWaiter[] = [];\n private readonly claimed = new Set<string>();\n private lastConsumerPollAt = 0;\n private closed = false;\n\n constructor(options: SupportPassportModelBridgeOptions = {}) {\n this.maxPendingJobs = options.maxPendingJobs ?? 32;\n this.claimAckTimeoutMs = options.claimAckTimeoutMs ?? 5_000;\n this.executionLeaseTimeoutMs = options.executionLeaseTimeoutMs ?? 15_000;\n if (!Number.isInteger(this.maxPendingJobs) || this.maxPendingJobs < 1) {\n throw new Error(\"maxPendingJobs must be a positive integer\");\n }\n if (!Number.isInteger(this.claimAckTimeoutMs) || this.claimAckTimeoutMs < 1) {\n throw new Error(\"claimAckTimeoutMs must be a positive integer\");\n }\n if (\n !Number.isInteger(this.executionLeaseTimeoutMs) ||\n this.executionLeaseTimeoutMs < 1 ||\n this.executionLeaseTimeoutMs > 120_000\n ) {\n throw new Error(\"executionLeaseTimeoutMs must be an integer from 1 through 120000\");\n }\n this.route = {\n kind: \"gateway\",\n invoke: (messages, invokeOptions) => this.invoke(messages, invokeOptions),\n };\n this.requestHandler = (req, res, ctx) => this.handleRequest(req, res, ctx.authorized, ctx.tokenAuthorized);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const pending of this.pending.values()) pending.resolve(null);\n this.pending.clear();\n this.available.length = 0;\n this.claimed.clear();\n for (const waiter of this.waiters.splice(0)) waiter.resolve(null);\n }\n\n private invoke(\n messages: SupportPassportModelMessage[],\n options: Parameters<SupportPassportModelRoute[\"invoke\"]>[1]\n ): Promise<SupportPassportModelRouteResult | null> {\n const consumerAvailable =\n this.waiters.length > 0 ||\n this.claimed.size > 0 ||\n Date.now() - this.lastConsumerPollAt <= CONSUMER_HANDOFF_GRACE_MS;\n if (!consumerAvailable || this.closed || this.pending.size >= this.maxPendingJobs || options.signal?.aborted) {\n return Promise.resolve(null);\n }\n const parsed = ModelJobSchema.safeParse({\n id: randomUUID(),\n messages,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n timeoutMs: options.timeoutMs,\n operation: options.operation,\n jsonSchema: options.jsonSchema,\n });\n if (!parsed.success) return Promise.resolve(null);\n return new Promise((resolve) => {\n let settled = false;\n const deadlineAt = Date.now() + parsed.data.timeoutMs;\n const timeout = setTimeout(() => settle(null), parsed.data.timeoutMs);\n const settle = (result: SupportPassportModelRouteResult | null): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n const pending = this.pending.get(parsed.data.id);\n if (pending?.claimTimer) clearTimeout(pending.claimTimer);\n this.pending.delete(parsed.data.id);\n this.claimed.delete(parsed.data.id);\n const availableIndex = this.available.indexOf(parsed.data.id);\n if (availableIndex >= 0) this.available.splice(availableIndex, 1);\n options.signal?.removeEventListener(\"abort\", abort);\n resolve(result);\n };\n const abort = (): void => settle(null);\n const requeue = (): void => {\n const pending = this.pending.get(parsed.data.id);\n if (!pending || !this.claimed.delete(parsed.data.id)) return;\n if (pending.claimTimer) clearTimeout(pending.claimTimer);\n pending.claimTimer = undefined;\n pending.claimId = undefined;\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter.resolve(this.claimPending(pending, waiter.claimLease));\n } else {\n this.available.push(parsed.data.id);\n }\n };\n this.pending.set(parsed.data.id, {\n job: parsed.data,\n deadlineAt,\n resolve: settle,\n requeue,\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n const waiter = this.waiters.shift();\n if (waiter) {\n const pending = this.pending.get(parsed.data.id);\n waiter.resolve(pending ? this.claimPending(pending, waiter.claimLease) : null);\n } else this.available.push(parsed.data.id);\n });\n }\n\n private claimedJob(job: SupportPassportModelJob): SupportPassportModelJob | null {\n const pending = this.pending.get(job.id);\n if (!pending) return null;\n const remainingMs = pending.deadlineAt - Date.now();\n if (remainingMs <= 0) {\n pending.resolve(null);\n return null;\n }\n return { ...job, timeoutMs: remainingMs };\n }\n\n private claimPending(pending: PendingJob, claimLease: boolean): SupportPassportModelJob | null {\n const job = this.claimedJob(pending.job);\n if (!job) return null;\n this.claimed.add(job.id);\n if (!claimLease) return job;\n const claimAckTimeoutMs = Math.min(this.claimAckTimeoutMs, job.timeoutMs);\n const executionLeaseTimeoutMs = Math.min(this.executionLeaseTimeoutMs, job.timeoutMs);\n pending.claimId = randomUUID();\n this.armClaimTimer(pending, claimAckTimeoutMs);\n return { ...job, claimId: pending.claimId, claimAckTimeoutMs, executionLeaseTimeoutMs };\n }\n\n private armClaimTimer(pending: PendingJob, timeoutMs: number): void {\n if (pending.claimTimer) clearTimeout(pending.claimTimer);\n pending.claimTimer = setTimeout(() => pending.requeue(), timeoutMs);\n pending.claimTimer.unref?.();\n }\n\n private takeAvailable(claimLease: boolean): SupportPassportModelJob | null {\n for (;;) {\n const id = this.available.shift();\n if (!id) return null;\n const pending = this.pending.get(id);\n if (pending) {\n return this.claimPending(pending, claimLease);\n }\n }\n }\n\n private nextJob(\n timeoutMs: number,\n signal: AbortSignal,\n claimLease: boolean\n ): Promise<SupportPassportModelJob | null> {\n const available = this.takeAvailable(claimLease);\n if (available || this.closed || signal.aborted || timeoutMs === 0 || this.waiters.length >= this.maxPendingJobs) {\n return Promise.resolve(available);\n }\n return new Promise((resolve) => {\n let active = true;\n const done = (job: SupportPassportModelJob | null): void => {\n if (!active) return;\n active = false;\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abort);\n resolve(job);\n };\n const waiter: PendingWaiter = { claimLease, resolve: done };\n const abort = (): void => {\n const index = this.waiters.indexOf(waiter);\n if (index >= 0) this.waiters.splice(index, 1);\n done(null);\n };\n const timeout = setTimeout(() => {\n const index = this.waiters.indexOf(waiter);\n if (index >= 0) this.waiters.splice(index, 1);\n done(null);\n }, timeoutMs);\n signal.addEventListener(\"abort\", abort, { once: true });\n this.waiters.push(waiter);\n });\n }\n\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n authorized: boolean,\n tokenAuthorized: boolean\n ): Promise<boolean> {\n const pathname = requestPath(req);\n const owned =\n req.method === \"POST\" &&\n (pathname === SUPPORT_PASSPORT_MODEL_JOB_PATH ||\n pathname === SUPPORT_PASSPORT_MODEL_ACK_PATH ||\n pathname === SUPPORT_PASSPORT_MODEL_RESULT_PATH);\n if (!owned) return false;\n if (!tokenAuthorized) {\n res.setHeader(\"www-authenticate\", \"Bearer\");\n respondJson(res, 401, { error: \"unauthorized\", code: \"unauthorized\" });\n return true;\n }\n if (!authorized) {\n respondJson(res, 403, { error: \"forbidden\", code: \"forbidden\" });\n return true;\n }\n if (pathname === SUPPORT_PASSPORT_MODEL_JOB_PATH) {\n let timeoutMs = 20_000;\n let claimLease = false;\n try {\n const parsed = z\n .object({\n timeoutMs: z.number().int().min(0).max(25_000),\n claimLease: z.boolean().optional(),\n })\n .strict()\n .parse(await readJson(req, 1_024));\n timeoutMs = parsed.timeoutMs;\n claimLease = parsed.claimLease === true;\n } catch {\n respondJson(res, 400, { error: \"invalid_request\", code: \"invalid_request\" });\n return true;\n }\n const controller = new AbortController();\n const abort = (): void => controller.abort();\n req.once(\"aborted\", abort);\n res.once(\"close\", abort);\n const job = await this.nextJob(timeoutMs, controller.signal, claimLease);\n req.off(\"aborted\", abort);\n res.off(\"close\", abort);\n if (res.destroyed) {\n if (job) this.pending.get(job.id)?.requeue();\n return true;\n }\n this.lastConsumerPollAt = Date.now();\n if (job) respondJson(res, 200, job);\n else if (this.closed) respondJson(res, 410, { error: \"bridge_closed\", code: \"bridge_closed\" });\n else respondNoContent(res);\n return true;\n }\n if (pathname === SUPPORT_PASSPORT_MODEL_ACK_PATH) {\n try {\n const parsed = ModelClaimSchema.parse(await readJson(req, 1_024));\n const pending = this.pending.get(parsed.id);\n if (!pending || !this.claimed.has(parsed.id) || pending.claimId !== parsed.claimId) {\n respondJson(res, 404, { error: \"job_not_found\", code: \"job_not_found\" });\n return true;\n }\n const remainingMs = pending.deadlineAt - Date.now();\n if (remainingMs <= 0) {\n pending.resolve(null);\n respondJson(res, 404, { error: \"job_not_found\", code: \"job_not_found\" });\n return true;\n }\n this.armClaimTimer(pending, Math.min(this.executionLeaseTimeoutMs, remainingMs));\n respondNoContent(res);\n } catch {\n respondJson(res, 400, { error: \"invalid_request\", code: \"invalid_request\" });\n }\n return true;\n }\n try {\n const parsed = ModelResultSchema.parse(await readJson(req, 300_000));\n const pending = this.pending.get(parsed.id);\n if (\n !pending ||\n !this.claimed.has(parsed.id) ||\n (pending.claimId !== undefined && pending.claimId !== parsed.claimId)\n ) {\n respondJson(res, 404, { error: \"job_not_found\", code: \"job_not_found\" });\n return true;\n }\n this.lastConsumerPollAt = Date.now();\n pending.resolve(parsed.result);\n respondNoContent(res);\n } catch {\n respondJson(res, 400, { error: \"invalid_request\", code: \"invalid_request\" });\n }\n return true;\n }\n}\n"],"mappings":"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","names":["waiter"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/source-agent-qualifier.ts"],"sourcesContent":["/**\n * Source-agent qualifier helpers for extraction (#2183).\n *\n * Pure leaf module: imports only types and sibling leaf/orchestration helpers,\n * never `extraction.ts`, so it introduces no cycle (extraction-run.ts only\n * type-imports extraction.ts).\n */\nimport { resolvePipelineProcessingCapabilities } from \"./capabilities.js\";\nimport { applyExtractionSourceGrounding } from \"./extraction-source-grounding.js\";\nimport type { ExtractionGroundingRoleSources } from \"./extraction-source-grounding.js\";\nimport { isValidConnectorId } from \"./connectors/index.js\";\nimport { CONNECTOR_LABEL_MAX_LENGTH, knownConnectorIds } from \"./connectors/label.js\";\nimport { deriveSourceConnector } from \"./orchestration/extraction-run.js\";\nimport type { BufferTurn, ExtractionResult, PluginConfig } from \"./types.js\";\n\n\nexport function resolveSourceConnector(turns: readonly BufferTurn[]): string | undefined {\n const contributing = turns.filter((turn) => turn.extractionContextOnly !== true);\n const derived = deriveSourceConnector(contributing);\n if (derived === undefined || !isValidConnectorId(derived)) return undefined;\n return /[\\u0000-\\u001F\\u007F]/.test(derived) ? undefined : derived;\n}\n\n// Same bound as the recall renderer (CONNECTOR_LABEL_MAX_LENGTH) but a DIFFERENT\n// policy: recall TRUNCATES past the bound (a truncated display label cannot\n// mislead), while the prompt SUPPRESSES (a truncated id could collide with a\n// different connector). Do not \"fix\" this inconsistency — it is deliberate.\nexport function headerConnector(connector: string | undefined): string | undefined {\n return connector !== undefined && connector.length <= CONNECTOR_LABEL_MAX_LENGTH ? connector : undefined;\n}\n\nexport function renderExtractionConversation(\n boundedTurns: readonly BufferTurn[],\n sourceConnector: string | undefined,\n): { conversation: string; renderedConversation: string } {\n const renderedConversation = boundedTurns\n .map((t) => `[${t.extractionContextOnly === true ? `context ${t.role}` : t.role}] ${t.content}`)\n .join(\"\\n\\n\");\n const conversation = sourceConnector === undefined\n ? renderedConversation\n : `Source agent: ${sourceConnector}\\n\\nTool and command instructions in this conversation apply to the ${sourceConnector} agent unless they are clearly universal.\\n\\n${renderedConversation}`;\n return { conversation, renderedConversation };\n}\n\nexport interface ExtractionGroundingContext {\n groundingSource: string;\n assertionSource: string;\n roleAssertionSources?: ExtractionGroundingRoleSources;\n messageTimestamp: Date | undefined;\n sourceConnector?: string;\n /** Input came from an always-on recorder (issue #2294); the proactive\n * second pass reads it so its prompts carry the same media warning. */\n ambientCapture?: boolean;\n scopeClassificationEnabled?: boolean;\n /** Contents of the turns assertionSource was joined from, so quote anchors cut at real turn boundaries. */\n turns?: readonly string[];\n}\n\nexport function applyGroundingWithConnector(\n config: PluginConfig,\n result: ExtractionResult,\n ctx: ExtractionGroundingContext,\n): ExtractionResult {\n const caps = resolvePipelineProcessingCapabilities(config);\n const options = {\n sourceGrounding: caps.sourceGrounding,\n anchorTemporalExpressions: caps.delinearize,\n spanMode: config.extraction?.spanMode ?? \"off\",\n turns: ctx.turns,\n };\n const known = buildKnownConnectors(ctx.sourceConnector);\n // Scope-forcing is decoupled from strip/restore (runs without a trusted\n // connector) but gated on the capability: flag off = byte-identical pre-#2183.\n const scoped = ctx.scopeClassificationEnabled === false\n ? result\n : forceProjectScopeOnAnyQualifier(result, known);\n if (ctx.sourceConnector === undefined) {\n return applyExtractionSourceGrounding(scoped, ctx.groundingSource, ctx.assertionSource, ctx.roleAssertionSources, ctx.messageTimestamp, options);\n }\n const prepared = prepareTrustedConnectorQualifier(scoped, ctx.sourceConnector, known);\n const grounded = applyExtractionSourceGrounding(prepared.result, ctx.groundingSource, ctx.assertionSource, ctx.roleAssertionSources, ctx.messageTimestamp, options);\n return restoreTrustedConnectorQualifier(grounded);\n}\n\nfunction buildKnownConnectors(trusted: string | undefined): Set<string> {\n const known = new Set<string>();\n for (const id of knownConnectorIds()) known.add(id.toLowerCase());\n if (trusted !== undefined) known.add(trusted.toLowerCase());\n return known;\n}\n\n/**\n * Parse a leading agent qualifier from fact text. ONE parser, ONE boundary\n * rule, ONE case policy (case-insensitive), ONE definition of \"agent\" (the name\n * must be a known connector ID). Returns the matched agent and the remaining\n * text, or undefined. Both scope-forcing and strip/restore consume this single\n * result so they can never disagree (#2183 round-11).\n */\nfunction parseLeadingQualifier(content: string, known: ReadonlySet<string>): { agent: string; rest: string } | undefined {\n const lower = content.toLowerCase();\n for (const lead of [\"in \", \"for \"]) {\n if (!lower.startsWith(lead)) continue;\n const m = lower.slice(lead.length).match(/^([a-z0-9][a-z0-9._-]*)\\s*,/u);\n if (m && known.has(m[1])) {\n const consumed = lead.length + m[0].length;\n return { agent: m[1], rest: content.slice(consumed).replace(/^[\\s,.;:]+/u, \"\") };\n }\n }\n const pm = lower.match(/^([a-z0-9][a-z0-9._-]*)'s(?![\\p{L}\\p{N}])/u);\n if (pm && known.has(pm[1])) {\n return { agent: pm[1], rest: content.slice(pm[0].length).replace(/^[\\s,.;:]+/u, \"\") };\n }\n return undefined;\n}\n\n/**\n * Force \"project\" scope on any fact whose content starts with a recognised\n * agent qualifier (a known connector name). A qualifier is evidence the fact is\n * agent-tied; which connector it names does not matter.\n */\nfunction forceProjectScopeOnAnyQualifier(result: ExtractionResult, known: ReadonlySet<string>): ExtractionResult {\n let any = false;\n const facts = result.facts.map((fact) => {\n if (fact.scope === \"project\") return fact;\n if (parseLeadingQualifier(fact.content, known) === undefined) return fact;\n any = true;\n return { ...fact, scope: \"project\" as const };\n });\n return any ? { ...result, facts } : result;\n}\n\nconst RESTORE_KEY = \"_qo\";\n\n/**\n * Strip the TRUSTED connector's qualifier for the grounding pass. Uses the same\n * parseLeadingQualifier as scope-forcing, but only strips when the matched agent\n * IS the trusted connector. Each stripped fact carries its original content\n * positionally for collision-free restore.\n */\nfunction prepareTrustedConnectorQualifier(\n result: ExtractionResult,\n trustedConnector: string,\n known: ReadonlySet<string>,\n): { result: ExtractionResult } {\n const trusted = trustedConnector.toLowerCase();\n const facts = result.facts.map((fact) => {\n const parsed = parseLeadingQualifier(fact.content, known);\n if (parsed === undefined || parsed.agent !== trusted) return fact;\n return { ...fact, content: parsed.rest, [RESTORE_KEY]: fact.content };\n }) as ExtractionResult[\"facts\"];\n return { result: { ...result, facts } };\n}\n\nfunction restoreTrustedConnectorQualifier(grounded: ExtractionResult): ExtractionResult {\n let touched = false;\n const facts = grounded.facts.map((fact) => {\n const record = fact as unknown as Record<string, unknown>;\n const original = record[RESTORE_KEY];\n if (typeof original !== \"string\") return fact;\n touched = true;\n const rest = { ...record };\n delete rest[RESTORE_KEY];\n return { ...rest, content: original } as ExtractionResult[\"facts\"][number];\n });\n return touched ? { ...grounded, facts } : grounded;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgBO,SAAS,uBAAuB,OAAkD;AACvF,QAAM,eAAe,MAAM,OAAO,CAAC,SAAS,KAAK,0BAA0B,IAAI;AAC/E,QAAM,UAAU,sBAAsB,YAAY;AAClD,MAAI,YAAY,UAAa,CAAC,mBAAmB,OAAO,EAAG,QAAO;AAClE,SAAO,wBAAwB,KAAK,OAAO,IAAI,SAAY;AAC7D;AAMO,SAAS,gBAAgB,WAAmD;AACjF,SAAO,cAAc,UAAa,UAAU,UAAU,6BAA6B,YAAY;AACjG;AAEO,SAAS,6BACd,cACA,iBACwD;AACxD,QAAM,uBAAuB,aAC1B,IAAI,CAAC,MAAM,IAAI,EAAE,0BAA0B,OAAO,WAAW,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAC9F,KAAK,MAAM;AACd,QAAM,eAAe,oBAAoB,SACrC,uBACA,iBAAiB,eAAe;AAAA;AAAA,kEAAuE,eAAe;AAAA;AAAA,EAAgD,oBAAoB;AAC9L,SAAO,EAAE,cAAc,qBAAqB;AAC9C;AAgBO,SAAS,4BACd,QACA,QACA,KACkB;AAClB,QAAM,OAAO,sCAAsC,MAAM;AACzD,QAAM,UAAU;AAAA,IACd,iBAAiB,KAAK;AAAA,IACtB,2BAA2B,KAAK;AAAA,IAChC,UAAU,OAAO,YAAY,YAAY;AAAA,IACzC,OAAO,IAAI;AAAA,EACb;AACA,QAAM,QAAQ,qBAAqB,IAAI,eAAe;AAGtD,QAAM,SAAS,IAAI,+BAA+B,QAC9C,SACA,gCAAgC,QAAQ,KAAK;AACjD,MAAI,IAAI,oBAAoB,QAAW;AACrC,WAAO,+BAA+B,QAAQ,IAAI,iBAAiB,IAAI,iBAAiB,IAAI,sBAAsB,IAAI,kBAAkB,OAAO;AAAA,EACjJ;AACA,QAAM,WAAW,iCAAiC,QAAQ,IAAI,iBAAiB,KAAK;AACpF,QAAM,WAAW,+BAA+B,SAAS,QAAQ,IAAI,iBAAiB,IAAI,iBAAiB,IAAI,sBAAsB,IAAI,kBAAkB,OAAO;AAClK,SAAO,iCAAiC,QAAQ;AAClD;AAEA,SAAS,qBAAqB,SAA0C;AACtE,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,MAAM,kBAAkB,EAAG,OAAM,IAAI,GAAG,YAAY,CAAC;AAChE,MAAI,YAAY,OAAW,OAAM,IAAI,QAAQ,YAAY,CAAC;AAC1D,SAAO;AACT;AASA,SAAS,sBAAsB,SAAiB,OAAyE;AACvH,QAAM,QAAQ,QAAQ,YAAY;AAClC,aAAW,QAAQ,CAAC,OAAO,MAAM,GAAG;AAClC,QAAI,CAAC,MAAM,WAAW,IAAI,EAAG;AAC7B,UAAM,IAAI,MAAM,MAAM,KAAK,MAAM,EAAE,MAAM,8BAA8B;AACvE,QAAI,KAAK,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG;AACxB,YAAM,WAAW,KAAK,SAAS,EAAE,CAAC,EAAE;AACpC,aAAO,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ,EAAE,QAAQ,eAAe,EAAE,EAAE;AAAA,IACjF;AAAA,EACF;AACA,QAAM,KAAK,MAAM,MAAM,4CAA4C;AACnE,MAAI,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG;AAC1B,WAAO,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,QAAQ,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,eAAe,EAAE,EAAE;AAAA,EACtF;AACA,SAAO;AACT;AAOA,SAAS,gCAAgC,QAA0B,OAA8C;AAC/G,MAAI,MAAM;AACV,QAAM,QAAQ,OAAO,MAAM,IAAI,CAAC,SAAS;AACvC,QAAI,KAAK,UAAU,UAAW,QAAO;AACrC,QAAI,sBAAsB,KAAK,SAAS,KAAK,MAAM,OAAW,QAAO;AACrE,UAAM;AACN,WAAO,EAAE,GAAG,MAAM,OAAO,UAAmB;AAAA,EAC9C,CAAC;AACD,SAAO,MAAM,EAAE,GAAG,QAAQ,MAAM,IAAI;AACtC;AAEA,IAAM,cAAc;AAQpB,SAAS,iCACP,QACA,kBACA,OAC8B;AAC9B,QAAM,UAAU,iBAAiB,YAAY;AAC7C,QAAM,QAAQ,OAAO,MAAM,IAAI,CAAC,SAAS;AACvC,UAAM,SAAS,sBAAsB,KAAK,SAAS,KAAK;AACxD,QAAI,WAAW,UAAa,OAAO,UAAU,QAAS,QAAO;AAC7D,WAAO,EAAE,GAAG,MAAM,SAAS,OAAO,MAAM,CAAC,WAAW,GAAG,KAAK,QAAQ;AAAA,EACtE,CAAC;AACD,SAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,MAAM,EAAE;AACxC;AAEA,SAAS,iCAAiC,UAA8C;AACtF,MAAI,UAAU;AACd,QAAM,QAAQ,SAAS,MAAM,IAAI,CAAC,SAAS;AACzC,UAAM,SAAS;AACf,UAAM,WAAW,OAAO,WAAW;AACnC,QAAI,OAAO,aAAa,SAAU,QAAO;AACzC,cAAU;AACV,UAAM,OAAO,EAAE,GAAG,OAAO;AACzB,WAAO,KAAK,WAAW;AACvB,WAAO,EAAE,GAAG,MAAM,SAAS,SAAS;AAAA,EACtC,CAAC;AACD,SAAO,UAAU,EAAE,GAAG,UAAU,MAAM,IAAI;AAC5C;","names":[]}
|