@remnic/core 10.0.92 → 10.0.93

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.
Files changed (486) hide show
  1. package/dist/access-admin-ops-surface.js +331 -58
  2. package/dist/access-authorization-probe.js +2 -283
  3. package/dist/access-boundary.d.ts +1 -1
  4. package/dist/access-boundary.d.ts.map +1 -1
  5. package/dist/access-boundary.js +1 -282
  6. package/dist/access-cli.js +286 -302
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-coding-context-resolution.js +3 -3
  9. package/dist/access-extraction-force-flush.js +331 -58
  10. package/dist/access-http-briefing.js +331 -59
  11. package/dist/access-http-query.js +331 -60
  12. package/dist/access-http.js +329 -111
  13. package/dist/access-identity-continuity-surface.js +331 -58
  14. package/dist/access-lcm-surface.js +331 -58
  15. package/dist/access-mcp-frames.d.ts +20 -6
  16. package/dist/access-mcp-frames.d.ts.map +1 -1
  17. package/dist/access-mcp-frames.js +1 -1
  18. package/dist/access-mcp.d.ts +5 -0
  19. package/dist/access-mcp.d.ts.map +1 -1
  20. package/dist/access-mcp.js +329 -86
  21. package/dist/access-namespace-preflight.js +2 -282
  22. package/dist/access-observe-transcript.js +3 -3
  23. package/dist/access-observe-write-category.js +6 -6
  24. package/dist/access-observe-write-surface.js +331 -58
  25. package/dist/access-offline-manifest.js +12 -11
  26. package/dist/access-operations-batch.js +329 -63
  27. package/dist/access-operations.js +329 -72
  28. package/dist/access-recall-concurrency.js +331 -58
  29. package/dist/access-recall-diagnostics.js +5 -4
  30. package/dist/access-recall-response.js +331 -58
  31. package/dist/access-recall-surface.js +331 -58
  32. package/dist/access-schema.js +2 -2
  33. package/dist/access-service.js +334 -61
  34. package/dist/access-surface-catalog.js +6 -283
  35. package/dist/access-surface-catalog.js.map +1 -1
  36. package/dist/active-context-transform.js +1 -1
  37. package/dist/active-memory-bridge.js +3 -2
  38. package/dist/active-recall.js +35 -36
  39. package/dist/active-recall.js.map +1 -1
  40. package/dist/activity/journal-extract.d.ts +13 -1
  41. package/dist/activity/journal-extract.d.ts.map +1 -1
  42. package/dist/{auto-sync-3AZW7MXI.js → auto-sync-BO5YZKM6.js} +13 -15
  43. package/dist/{auto-sync-3AZW7MXI.js.map → auto-sync-BO5YZKM6.js.map} +1 -1
  44. package/dist/briefing.js +19 -19
  45. package/dist/buffer.js +16 -16
  46. package/dist/calibration.js +10 -10
  47. package/dist/{capsule-merge-2IIXFXN5.js → capsule-merge-6IDAYTKG.js} +6 -6
  48. package/dist/causal-consolidation.js +22 -22
  49. package/dist/{chunk-ATPWZ4F7.js → chunk-2LMA22UU.js} +5 -5
  50. package/dist/{chunk-RGUUBAT5.js → chunk-2WCLTWV2.js} +3 -3
  51. package/dist/{chunk-BQZEGOZ4.js → chunk-2YODOG2O.js} +2 -2
  52. package/dist/{chunk-WYG5UNDY.js → chunk-3AUDELZL.js} +2 -2
  53. package/dist/{chunk-N4KAE2NB.js → chunk-3CYOCE6U.js} +3 -3
  54. package/dist/{chunk-MB6ZJDN6.js → chunk-3FBAEPCU.js} +2 -2
  55. package/dist/{chunk-PIITB2YZ.js → chunk-3ZS3NUEI.js} +4 -4
  56. package/dist/{chunk-ANZZLRUX.js → chunk-4IVRQMZW.js} +2 -2
  57. package/dist/{chunk-63E37JCN.js → chunk-4RAJT5L2.js} +4 -4
  58. package/dist/{chunk-45VUHDV2.js → chunk-5CO5G4MN.js} +2 -2
  59. package/dist/{chunk-BRLXOZLM.js → chunk-5YT2IIFX.js} +729 -17
  60. package/dist/chunk-5YT2IIFX.js.map +1 -0
  61. package/dist/{chunk-E4IRW2FG.js → chunk-622V2AZA.js} +233 -40
  62. package/dist/chunk-622V2AZA.js.map +1 -0
  63. package/dist/{chunk-LUJCQQ3L.js → chunk-65HWAQ4F.js} +2 -2
  64. package/dist/{chunk-T67LUYCR.js → chunk-77NTFICT.js} +5 -5
  65. package/dist/chunk-A2WFUMUN.js +86 -0
  66. package/dist/chunk-A2WFUMUN.js.map +1 -0
  67. package/dist/{chunk-UE6RRXMF.js → chunk-A4F7OIC5.js} +2 -2
  68. package/dist/chunk-AHA5VQGP.js +117 -0
  69. package/dist/chunk-AHA5VQGP.js.map +1 -0
  70. package/dist/{chunk-SUSW74WU.js → chunk-ATG2PQ4V.js} +56 -5
  71. package/dist/chunk-ATG2PQ4V.js.map +1 -0
  72. package/dist/{chunk-U6UNF5ZS.js → chunk-B33YWUJV.js} +3 -3
  73. package/dist/{chunk-RRJBDXAQ.js → chunk-B377OKUP.js} +2 -2
  74. package/dist/{chunk-IUKYFTGW.js → chunk-B3DR2JBZ.js} +140 -125
  75. package/dist/chunk-B3DR2JBZ.js.map +1 -0
  76. package/dist/{chunk-ETZLQOUR.js → chunk-BGHCSLE5.js} +2 -2
  77. package/dist/{chunk-YYOMGOHB.js → chunk-BOK6BN5M.js} +2 -2
  78. package/dist/{chunk-OH7QLI6W.js → chunk-BPPUH5JM.js} +5 -5
  79. package/dist/{chunk-4J363OAA.js → chunk-BTI4C4MA.js} +2 -2
  80. package/dist/{chunk-O6ZSWHVR.js → chunk-C2KE5DMD.js} +4 -4
  81. package/dist/{chunk-47F6WWLQ.js → chunk-C73N66PR.js} +2 -2
  82. package/dist/{chunk-E3A7ELSG.js → chunk-CGJYL633.js} +2 -2
  83. package/dist/{chunk-WRT7GJ2D.js → chunk-CIWMTNHW.js} +4 -4
  84. package/dist/{chunk-O55EKIEC.js → chunk-D3ZKHLN2.js} +2 -2
  85. package/dist/{chunk-CD4BCCNP.js → chunk-DJ7WVEWX.js} +2 -2
  86. package/dist/{chunk-PWXPRVLK.js → chunk-EFL24KOI.js} +2 -2
  87. package/dist/{chunk-4CJTQHEG.js → chunk-ESLOLCD4.js} +3 -3
  88. package/dist/{chunk-6F42QONS.js → chunk-ETBVCRVL.js} +4 -4
  89. package/dist/{chunk-VILPVT4S.js → chunk-EZ47HOJ6.js} +4 -4
  90. package/dist/{chunk-EFYN5I7Z.js → chunk-F4QFU5IZ.js} +2 -2
  91. package/dist/{chunk-T6OZW2WR.js → chunk-FA7SLQ5X.js} +7 -1
  92. package/dist/chunk-FA7SLQ5X.js.map +1 -0
  93. package/dist/{chunk-7W3RXOIG.js → chunk-FMKILENU.js} +14 -14
  94. package/dist/{chunk-YLXETSAH.js → chunk-GCZJ7XRI.js} +2 -2
  95. package/dist/{chunk-5HFXGXE5.js → chunk-GQXOBKPL.js} +7 -9
  96. package/dist/{chunk-5HFXGXE5.js.map → chunk-GQXOBKPL.js.map} +1 -1
  97. package/dist/{chunk-UDKWFDV2.js → chunk-HLUHEMN4.js} +27 -3
  98. package/dist/chunk-HLUHEMN4.js.map +1 -0
  99. package/dist/{chunk-QFEDITXM.js → chunk-JNDMIAJ4.js} +2 -2
  100. package/dist/chunk-JTSSSR4L.js +359 -0
  101. package/dist/chunk-JTSSSR4L.js.map +1 -0
  102. package/dist/{chunk-5KBIOI4G.js → chunk-JVBAPAWZ.js} +217 -13
  103. package/dist/chunk-JVBAPAWZ.js.map +1 -0
  104. package/dist/{chunk-E5PPE4VA.js → chunk-K2VRKCPA.js} +2 -2
  105. package/dist/{chunk-MKRYQROF.js → chunk-LGEHAQHK.js} +4 -4
  106. package/dist/{chunk-7HTUYFR3.js → chunk-LLPMMMWG.js} +27 -10
  107. package/dist/chunk-LLPMMMWG.js.map +1 -0
  108. package/dist/{chunk-XYTQJD7F.js → chunk-LMJVP5CM.js} +2 -2
  109. package/dist/{chunk-FQKBJJYB.js → chunk-LPV72KRQ.js} +2 -2
  110. package/dist/{chunk-2LCRG2YV.js → chunk-M2XR6B6V.js} +2 -2
  111. package/dist/{chunk-P4WNBSTW.js → chunk-MH632KPO.js} +2 -2
  112. package/dist/{chunk-EQ4U73UH.js → chunk-MLAMXQAW.js} +14 -2
  113. package/dist/chunk-MLAMXQAW.js.map +1 -0
  114. package/dist/{chunk-ZU5JDLOH.js → chunk-MMRTPH3J.js} +2 -2
  115. package/dist/{chunk-PMJFRDJI.js → chunk-MUX7IL77.js} +2 -2
  116. package/dist/{chunk-HF3BKUVV.js → chunk-NAQ4A5IX.js} +7 -7
  117. package/dist/{chunk-TVIVY7KU.js → chunk-NED7IR7B.js} +4 -4
  118. package/dist/{chunk-6F5MJFXY.js → chunk-NHVAX7MH.js} +2 -2
  119. package/dist/{chunk-TG3R2SID.js → chunk-NMGHGTVR.js} +5 -5
  120. package/dist/{chunk-YCNIGRRF.js → chunk-NS7U4ZYU.js} +13 -117
  121. package/dist/chunk-NS7U4ZYU.js.map +1 -0
  122. package/dist/{chunk-NGHDW6UU.js → chunk-NUQEREIP.js} +2 -2
  123. package/dist/{chunk-5IIQU4JZ.js → chunk-OB72KNMF.js} +4 -4
  124. package/dist/{chunk-JV4S6VDH.js → chunk-OJXJWNFY.js} +2 -2
  125. package/dist/{chunk-QJPJXCS4.js → chunk-P3WRNWWM.js} +157 -4
  126. package/dist/chunk-P3WRNWWM.js.map +1 -0
  127. package/dist/{chunk-E6M225BJ.js → chunk-PC5DRBGD.js} +18 -8
  128. package/dist/chunk-PC5DRBGD.js.map +1 -0
  129. package/dist/{chunk-Z7JIZ42P.js → chunk-PRAUN6PN.js} +3 -3
  130. package/dist/{chunk-RWGRSKN5.js → chunk-PT4DZDJA.js} +2 -2
  131. package/dist/{chunk-7EPY3IQL.js → chunk-PZJQ46DH.js} +2 -2
  132. package/dist/{chunk-MXHMNKWG.js → chunk-QDESY76F.js} +3 -3
  133. package/dist/{chunk-I6QGI65T.js → chunk-QRMG4HK4.js} +3 -3
  134. package/dist/{chunk-ZU3NJNO7.js → chunk-QSF5SJAM.js} +4 -4
  135. package/dist/{chunk-5IYOKDM4.js → chunk-R23JWJD3.js} +5 -5
  136. package/dist/{chunk-RHQLIHMB.js → chunk-R4BBGPI2.js} +218 -218
  137. package/dist/chunk-R4BBGPI2.js.map +1 -0
  138. package/dist/{chunk-7GLJMDEQ.js → chunk-RM2YUFH6.js} +6 -6
  139. package/dist/{chunk-IPT2OY4B.js → chunk-RQFXZYTF.js} +35 -33
  140. package/dist/chunk-RQFXZYTF.js.map +1 -0
  141. package/dist/{chunk-AP6NCP3V.js → chunk-S3S72HRM.js} +8 -6
  142. package/dist/chunk-S3S72HRM.js.map +1 -0
  143. package/dist/{chunk-RIMK327Y.js → chunk-SGQPR5SX.js} +7 -7
  144. package/dist/{chunk-ZGFLIK5H.js → chunk-SPAKBUJY.js} +2 -2
  145. package/dist/{chunk-ER7XANP3.js → chunk-SQ3GEIEL.js} +4 -4
  146. package/dist/{chunk-BLJT6JP2.js → chunk-SVT5IA2H.js} +2 -2
  147. package/dist/{chunk-HVX4LPNY.js → chunk-T4KY6UYF.js} +5 -3
  148. package/dist/{chunk-HVX4LPNY.js.map → chunk-T4KY6UYF.js.map} +1 -1
  149. package/dist/{chunk-GVGAO3WV.js → chunk-TJ4F6H4H.js} +3 -3
  150. package/dist/{chunk-R6HMAIKM.js → chunk-TOSPNM4T.js} +2 -2
  151. package/dist/{chunk-HH5LY6RR.js → chunk-TRQE3RYR.js} +5 -5
  152. package/dist/{chunk-RMXS4I66.js → chunk-TVDJEUV5.js} +2 -2
  153. package/dist/{chunk-PLCYKAWH.js → chunk-TYRWSE4B.js} +2 -2
  154. package/dist/{chunk-B4QYQFGY.js → chunk-UBEKET2V.js} +383 -36
  155. package/dist/chunk-UBEKET2V.js.map +1 -0
  156. package/dist/{chunk-IQWUACVG.js → chunk-UHMHJX5G.js} +3 -3
  157. package/dist/{chunk-YODUDA6R.js → chunk-UN4RVUG2.js} +22 -22
  158. package/dist/{chunk-E6Z4FBX6.js → chunk-V2QSNFCT.js} +2 -2
  159. package/dist/{chunk-NBH6K6G5.js → chunk-V65H7MI6.js} +345 -16
  160. package/dist/chunk-V65H7MI6.js.map +1 -0
  161. package/dist/chunk-W54Z2MOP.js +4500 -0
  162. package/dist/chunk-W54Z2MOP.js.map +1 -0
  163. package/dist/{chunk-E7YZXWIS.js → chunk-WKSQTMU7.js} +2 -2
  164. package/dist/{chunk-RIZ5NUNN.js → chunk-WQ4XKIOX.js} +4 -4
  165. package/dist/{chunk-FSO3G4JJ.js → chunk-WQURALGV.js} +4995 -2747
  166. package/dist/chunk-WQURALGV.js.map +1 -0
  167. package/dist/{chunk-QEYTRFR3.js → chunk-X26YOFGS.js} +2 -2
  168. package/dist/{chunk-ITHZFHST.js → chunk-X2BVB74H.js} +2 -2
  169. package/dist/{chunk-XYKBWTWI.js → chunk-XIYLWEXC.js} +2 -2
  170. package/dist/{chunk-IBJ6U753.js → chunk-XKZBZOKV.js} +4 -4
  171. package/dist/{chunk-65AUYLU3.js → chunk-XPXHQI6N.js} +2 -2
  172. package/dist/{chunk-EXHXJETE.js → chunk-XRDYRWZI.js} +2 -2
  173. package/dist/chunk-XRWWCW4H.js +102 -0
  174. package/dist/chunk-XRWWCW4H.js.map +1 -0
  175. package/dist/chunk-YKJBSMMP.js +67137 -0
  176. package/dist/chunk-YKJBSMMP.js.map +1 -0
  177. package/dist/{chunk-2JSDPUKD.js → chunk-YMFPFXEX.js} +2 -2
  178. package/dist/{chunk-645WOU5I.js → chunk-ZDZJNXL6.js} +4 -4
  179. package/dist/{chunk-6TCXIRP5.js → chunk-ZKE4CO6B.js} +4 -4
  180. package/dist/{chunk-FNXQZGUS.js → chunk-ZSE774RV.js} +2 -2
  181. package/dist/cli.js +302 -184
  182. package/dist/coding/export-okf-codegraph.js +28 -28
  183. package/dist/compounding/engine.js +22 -23
  184. package/dist/config.js +35 -36
  185. package/dist/connectors/codex-materialize-runner.js +19 -19
  186. package/dist/connectors/index.js +20 -20
  187. package/dist/connectors/live/google-drive.d.ts +2 -0
  188. package/dist/connectors/live/google-drive.d.ts.map +1 -1
  189. package/dist/consolidation-provenance-check.js +4 -4
  190. package/dist/consolidation-undo.js +5 -5
  191. package/dist/contradiction/index.js +7 -6
  192. package/dist/{contradiction-scan-P2MHYFVG.js → contradiction-scan-IBPYGQZF.js} +4 -3
  193. package/dist/convergence-refresh.js +21 -21
  194. package/dist/corpus-watermark.js +22 -22
  195. package/dist/deep-recall-http-glue.js +2 -2
  196. package/dist/deep-recall-policy-llm.js +4 -4
  197. package/dist/direct-answer-wiring.js +2 -2
  198. package/dist/embedding-fallback.js +1 -1
  199. package/dist/entity-retrieval.js +20 -20
  200. package/dist/eval-trajectory-store.js +2 -2
  201. package/dist/eval-trajectory.js +2 -2
  202. package/dist/event-order-recall.js +2 -2
  203. package/dist/explicit-capture.d.ts +3 -2
  204. package/dist/explicit-capture.d.ts.map +1 -1
  205. package/dist/explicit-capture.js +530 -6
  206. package/dist/explicit-cue-recall.js +2 -2
  207. package/dist/external-wiki-access.js +2 -283
  208. package/dist/extraction-faithfulness.js +4 -4
  209. package/dist/extraction-judge.js +5 -5
  210. package/dist/extraction-normalization.js +1 -1
  211. package/dist/extraction-quote-grounding.d.ts.map +1 -1
  212. package/dist/extraction-quote-grounding.js +1 -1
  213. package/dist/extraction-source-grounding-rules.js +2 -2
  214. package/dist/extraction-source-grounding.js +3 -3
  215. package/dist/extraction.js +42 -43
  216. package/dist/fallback-llm-codex-subscription.js +2 -2
  217. package/dist/fallback-llm.js +3 -3
  218. package/dist/{first-start-migration-QFI7B5SH.js → first-start-migration-FILJH3RO.js} +6 -5
  219. package/dist/{first-start-migration-QFI7B5SH.js.map → first-start-migration-FILJH3RO.js.map} +1 -1
  220. package/dist/focused-list-recall.js +2 -2
  221. package/dist/harmonic-retrieval.js +19 -19
  222. package/dist/index.js +772 -793
  223. package/dist/lcm/index.js +2 -2
  224. package/dist/live-connectors-runner.js +2 -3
  225. package/dist/local-llm-config.js +2 -2
  226. package/dist/local-llm-helpers.d.ts +4 -0
  227. package/dist/local-llm-helpers.d.ts.map +1 -1
  228. package/dist/local-llm-helpers.js +3 -1
  229. package/dist/local-llm.d.ts +4 -1
  230. package/dist/local-llm.d.ts.map +1 -1
  231. package/dist/local-llm.js +4 -4
  232. package/dist/location/index.js +26 -28
  233. package/dist/maintenance/memory-governance.js +19 -19
  234. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +19 -19
  235. package/dist/maintenance/rebuild-memory-projection-runner.js +21 -21
  236. package/dist/maintenance/rebuild-memory-projection.js +20 -20
  237. package/dist/memory-browse-operations.js +2 -283
  238. package/dist/memory-browse.js +8 -7
  239. package/dist/memory-controller.js +2 -2
  240. package/dist/memory-subject.js +2 -2
  241. package/dist/namespaces/migrate.js +20 -20
  242. package/dist/namespaces/search.js +5 -5
  243. package/dist/namespaces/storage.js +19 -19
  244. package/dist/offline-sync-changeset-generations.js +1 -1
  245. package/dist/offline-sync-embedding-generation.js +1 -1
  246. package/dist/offline-sync-impression-drain.js +6 -6
  247. package/dist/offline-sync-snapshot-stream.js +1 -1
  248. package/dist/offline-sync.js +1 -1
  249. package/dist/operator-doctor-corpus.js +23 -23
  250. package/dist/operator-toolkit.js +57 -60
  251. package/dist/orchestration/backlog-scheduler.js +277 -293
  252. package/dist/orchestration/backlog-scheduler.js.map +1 -1
  253. package/dist/orchestration/buffer-drain-runner.js +277 -293
  254. package/dist/orchestration/extraction-run.d.ts +4 -0
  255. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  256. package/dist/orchestration/fact-dedup-window.d.ts +1 -1
  257. package/dist/orchestration/fact-dedup-window.d.ts.map +1 -1
  258. package/dist/orchestration/maintenance.js +38 -41
  259. package/dist/orchestrator.d.ts +9 -11
  260. package/dist/orchestrator.d.ts.map +1 -1
  261. package/dist/orchestrator.js +289 -306
  262. package/dist/page-versioning.js +3 -3
  263. package/dist/qmd-daemon-session.js +2 -2
  264. package/dist/qmd.js +3 -3
  265. package/dist/recall-explain-renderer.js +1 -1
  266. package/dist/recall-navigation-operations.js +2 -283
  267. package/dist/recall-navigation.js +331 -58
  268. package/dist/recall-planner-llm.js +3 -3
  269. package/dist/recall-state-view-admission.js +6 -6
  270. package/dist/recall-why-service.js +10 -9
  271. package/dist/recall-why.js +4 -3
  272. package/dist/recall-xray-cli.js +2 -2
  273. package/dist/recall-xray-renderer.js +1 -1
  274. package/dist/reconcile/manifest.js +3 -3
  275. package/dist/{resolution-N7H3F2E4.js → resolution-OVVIF7ZY.js} +8 -7
  276. package/dist/response-guidance-recall.js +2 -2
  277. package/dist/resume-bundles.js +39 -40
  278. package/dist/salvage-envelope.js +4 -4
  279. package/dist/search/factory.js +4 -4
  280. package/dist/search/index.js +4 -4
  281. package/dist/semantic-consolidation.js +22 -22
  282. package/dist/semantic-rule-promotion.js +19 -19
  283. package/dist/semantic-rule-verifier.js +19 -19
  284. package/dist/shared-context/manager.js +2 -3
  285. package/dist/source-agent-qualifier.js +31 -32
  286. package/dist/standup/build.js +19 -19
  287. package/dist/storage/content-hash-index.d.ts +10 -0
  288. package/dist/storage/content-hash-index.d.ts.map +1 -1
  289. package/dist/storage.js +18 -18
  290. package/dist/subject-config.js +3 -3
  291. package/dist/summarizer.d.ts +4 -1
  292. package/dist/summarizer.d.ts.map +1 -1
  293. package/dist/summarizer.js +6 -6
  294. package/dist/support-passport/index.js +53 -297
  295. package/dist/targeted-fact-recall.js +2 -2
  296. package/dist/tier-routing.js +3 -2
  297. package/dist/{tier-stats-FQGQSFET.js → tier-stats-FXEUJN73.js} +6 -5
  298. package/dist/{tier-stats-FQGQSFET.js.map → tier-stats-FXEUJN73.js.map} +1 -1
  299. package/dist/transcript.js +2 -2
  300. package/dist/transfer/capsule-import.js +4 -4
  301. package/dist/transfer/export-okf.js +19 -19
  302. package/dist/verified-recall.js +19 -19
  303. package/dist/wearables/memory-gen.d.ts +5 -1
  304. package/dist/wearables/memory-gen.d.ts.map +1 -1
  305. package/dist/wearables/service.d.ts.map +1 -1
  306. package/dist/who-knows-cli.js +20 -20
  307. package/dist/who-knows.js +19 -19
  308. package/dist/write-envelope.js +3 -3
  309. package/package.json +2 -2
  310. package/src/access-boundary.ts +5 -1
  311. package/src/access-category-alias.test.ts +5 -0
  312. package/src/access-mcp-frames.test.ts +60 -5
  313. package/src/access-mcp-frames.ts +72 -18
  314. package/src/access-mcp.test.ts +66 -2
  315. package/src/access-mcp.ts +19 -13
  316. package/src/access-service-coding-write.test.ts +7 -0
  317. package/src/activity/journal-extract-storage.test.ts +31 -0
  318. package/src/activity/journal-extract.test.ts +1 -0
  319. package/src/activity/journal-extract.ts +24 -3
  320. package/src/connectors/live/google-drive.test.ts +39 -0
  321. package/src/connectors/live/google-drive.ts +41 -12
  322. package/src/explicit-capture.test.ts +109 -17
  323. package/src/explicit-capture.ts +90 -37
  324. package/src/extraction-quote-grounding.test.ts +20 -0
  325. package/src/extraction-quote-grounding.ts +21 -11
  326. package/src/fact-dedup-window.test.ts +37 -0
  327. package/src/local-llm-helpers.ts +12 -0
  328. package/src/local-llm-shutdown.test.ts +194 -0
  329. package/src/local-llm.ts +32 -30
  330. package/src/orchestration/extraction-run.ts +12 -3
  331. package/src/orchestration/fact-dedup-window.ts +5 -1
  332. package/src/orchestrator-connector-dedup.test.ts +9 -5
  333. package/src/orchestrator.ts +47 -50
  334. package/src/storage/content-hash-index.ts +27 -2
  335. package/src/storage-fact-hash-publish-failure.test.ts +87 -0
  336. package/src/summarizer-shutdown.test.ts +195 -0
  337. package/src/summarizer.ts +15 -2
  338. package/src/wearables/memory-gen.test.ts +20 -0
  339. package/src/wearables/memory-gen.ts +14 -7
  340. package/src/wearables/service.ts +14 -1
  341. package/src/wearables/storage-io.test.ts +25 -0
  342. package/dist/chunk-2FGLEF7C.js +0 -61
  343. package/dist/chunk-2FGLEF7C.js.map +0 -1
  344. package/dist/chunk-3RLK65ZK.js +0 -203
  345. package/dist/chunk-3RLK65ZK.js.map +0 -1
  346. package/dist/chunk-4WR2OD7K.js +0 -43
  347. package/dist/chunk-4WR2OD7K.js.map +0 -1
  348. package/dist/chunk-5KBIOI4G.js.map +0 -1
  349. package/dist/chunk-5M5M22GW.js +0 -346
  350. package/dist/chunk-5M5M22GW.js.map +0 -1
  351. package/dist/chunk-7HTUYFR3.js.map +0 -1
  352. package/dist/chunk-AP6NCP3V.js.map +0 -1
  353. package/dist/chunk-B4QYQFGY.js.map +0 -1
  354. package/dist/chunk-BJRTMNCB.js +0 -1919
  355. package/dist/chunk-BJRTMNCB.js.map +0 -1
  356. package/dist/chunk-BRLXOZLM.js.map +0 -1
  357. package/dist/chunk-BSACVS6R.js +0 -621
  358. package/dist/chunk-BSACVS6R.js.map +0 -1
  359. package/dist/chunk-DKAA2IHQ.js +0 -3644
  360. package/dist/chunk-DKAA2IHQ.js.map +0 -1
  361. package/dist/chunk-E4IRW2FG.js.map +0 -1
  362. package/dist/chunk-E6M225BJ.js.map +0 -1
  363. package/dist/chunk-EQ4U73UH.js.map +0 -1
  364. package/dist/chunk-ETSJD5IV.js +0 -361
  365. package/dist/chunk-ETSJD5IV.js.map +0 -1
  366. package/dist/chunk-F55YQP7N.js +0 -336
  367. package/dist/chunk-F55YQP7N.js.map +0 -1
  368. package/dist/chunk-FHGWKODN.js +0 -2300
  369. package/dist/chunk-FHGWKODN.js.map +0 -1
  370. package/dist/chunk-FLRP63GU.js +0 -32219
  371. package/dist/chunk-FLRP63GU.js.map +0 -1
  372. package/dist/chunk-FSO3G4JJ.js.map +0 -1
  373. package/dist/chunk-ID6JGIMD.js +0 -25
  374. package/dist/chunk-ID6JGIMD.js.map +0 -1
  375. package/dist/chunk-IGLJNHOX.js +0 -62
  376. package/dist/chunk-IGLJNHOX.js.map +0 -1
  377. package/dist/chunk-IPT2OY4B.js.map +0 -1
  378. package/dist/chunk-IUKYFTGW.js.map +0 -1
  379. package/dist/chunk-NBH6K6G5.js.map +0 -1
  380. package/dist/chunk-NTRUKAAE.js +0 -223
  381. package/dist/chunk-NTRUKAAE.js.map +0 -1
  382. package/dist/chunk-OGXXGHW6.js +0 -223
  383. package/dist/chunk-OGXXGHW6.js.map +0 -1
  384. package/dist/chunk-PPCLZ4JU.js +0 -28
  385. package/dist/chunk-PPCLZ4JU.js.map +0 -1
  386. package/dist/chunk-QJPJXCS4.js.map +0 -1
  387. package/dist/chunk-R2LBF4HH.js +0 -729
  388. package/dist/chunk-R2LBF4HH.js.map +0 -1
  389. package/dist/chunk-RHQLIHMB.js.map +0 -1
  390. package/dist/chunk-RRTVGD3J.js +0 -792
  391. package/dist/chunk-RRTVGD3J.js.map +0 -1
  392. package/dist/chunk-SUSW74WU.js.map +0 -1
  393. package/dist/chunk-T6OZW2WR.js.map +0 -1
  394. package/dist/chunk-UDKWFDV2.js.map +0 -1
  395. package/dist/chunk-V7IZKJI3.js +0 -22
  396. package/dist/chunk-V7IZKJI3.js.map +0 -1
  397. package/dist/chunk-X562NQFA.js +0 -10144
  398. package/dist/chunk-X562NQFA.js.map +0 -1
  399. package/dist/chunk-XDSCJOH7.js +0 -3991
  400. package/dist/chunk-XDSCJOH7.js.map +0 -1
  401. package/dist/chunk-YCNIGRRF.js.map +0 -1
  402. package/dist/chunk-ZTTCDQ4I.js +0 -18796
  403. package/dist/chunk-ZTTCDQ4I.js.map +0 -1
  404. /package/dist/{capsule-merge-2IIXFXN5.js.map → capsule-merge-6IDAYTKG.js.map} +0 -0
  405. /package/dist/{chunk-ATPWZ4F7.js.map → chunk-2LMA22UU.js.map} +0 -0
  406. /package/dist/{chunk-RGUUBAT5.js.map → chunk-2WCLTWV2.js.map} +0 -0
  407. /package/dist/{chunk-BQZEGOZ4.js.map → chunk-2YODOG2O.js.map} +0 -0
  408. /package/dist/{chunk-WYG5UNDY.js.map → chunk-3AUDELZL.js.map} +0 -0
  409. /package/dist/{chunk-N4KAE2NB.js.map → chunk-3CYOCE6U.js.map} +0 -0
  410. /package/dist/{chunk-MB6ZJDN6.js.map → chunk-3FBAEPCU.js.map} +0 -0
  411. /package/dist/{chunk-PIITB2YZ.js.map → chunk-3ZS3NUEI.js.map} +0 -0
  412. /package/dist/{chunk-ANZZLRUX.js.map → chunk-4IVRQMZW.js.map} +0 -0
  413. /package/dist/{chunk-63E37JCN.js.map → chunk-4RAJT5L2.js.map} +0 -0
  414. /package/dist/{chunk-45VUHDV2.js.map → chunk-5CO5G4MN.js.map} +0 -0
  415. /package/dist/{chunk-LUJCQQ3L.js.map → chunk-65HWAQ4F.js.map} +0 -0
  416. /package/dist/{chunk-T67LUYCR.js.map → chunk-77NTFICT.js.map} +0 -0
  417. /package/dist/{chunk-UE6RRXMF.js.map → chunk-A4F7OIC5.js.map} +0 -0
  418. /package/dist/{chunk-U6UNF5ZS.js.map → chunk-B33YWUJV.js.map} +0 -0
  419. /package/dist/{chunk-RRJBDXAQ.js.map → chunk-B377OKUP.js.map} +0 -0
  420. /package/dist/{chunk-ETZLQOUR.js.map → chunk-BGHCSLE5.js.map} +0 -0
  421. /package/dist/{chunk-YYOMGOHB.js.map → chunk-BOK6BN5M.js.map} +0 -0
  422. /package/dist/{chunk-OH7QLI6W.js.map → chunk-BPPUH5JM.js.map} +0 -0
  423. /package/dist/{chunk-4J363OAA.js.map → chunk-BTI4C4MA.js.map} +0 -0
  424. /package/dist/{chunk-O6ZSWHVR.js.map → chunk-C2KE5DMD.js.map} +0 -0
  425. /package/dist/{chunk-47F6WWLQ.js.map → chunk-C73N66PR.js.map} +0 -0
  426. /package/dist/{chunk-E3A7ELSG.js.map → chunk-CGJYL633.js.map} +0 -0
  427. /package/dist/{chunk-WRT7GJ2D.js.map → chunk-CIWMTNHW.js.map} +0 -0
  428. /package/dist/{chunk-O55EKIEC.js.map → chunk-D3ZKHLN2.js.map} +0 -0
  429. /package/dist/{chunk-CD4BCCNP.js.map → chunk-DJ7WVEWX.js.map} +0 -0
  430. /package/dist/{chunk-PWXPRVLK.js.map → chunk-EFL24KOI.js.map} +0 -0
  431. /package/dist/{chunk-4CJTQHEG.js.map → chunk-ESLOLCD4.js.map} +0 -0
  432. /package/dist/{chunk-6F42QONS.js.map → chunk-ETBVCRVL.js.map} +0 -0
  433. /package/dist/{chunk-VILPVT4S.js.map → chunk-EZ47HOJ6.js.map} +0 -0
  434. /package/dist/{chunk-EFYN5I7Z.js.map → chunk-F4QFU5IZ.js.map} +0 -0
  435. /package/dist/{chunk-7W3RXOIG.js.map → chunk-FMKILENU.js.map} +0 -0
  436. /package/dist/{chunk-YLXETSAH.js.map → chunk-GCZJ7XRI.js.map} +0 -0
  437. /package/dist/{chunk-QFEDITXM.js.map → chunk-JNDMIAJ4.js.map} +0 -0
  438. /package/dist/{chunk-E5PPE4VA.js.map → chunk-K2VRKCPA.js.map} +0 -0
  439. /package/dist/{chunk-MKRYQROF.js.map → chunk-LGEHAQHK.js.map} +0 -0
  440. /package/dist/{chunk-XYTQJD7F.js.map → chunk-LMJVP5CM.js.map} +0 -0
  441. /package/dist/{chunk-FQKBJJYB.js.map → chunk-LPV72KRQ.js.map} +0 -0
  442. /package/dist/{chunk-2LCRG2YV.js.map → chunk-M2XR6B6V.js.map} +0 -0
  443. /package/dist/{chunk-P4WNBSTW.js.map → chunk-MH632KPO.js.map} +0 -0
  444. /package/dist/{chunk-ZU5JDLOH.js.map → chunk-MMRTPH3J.js.map} +0 -0
  445. /package/dist/{chunk-PMJFRDJI.js.map → chunk-MUX7IL77.js.map} +0 -0
  446. /package/dist/{chunk-HF3BKUVV.js.map → chunk-NAQ4A5IX.js.map} +0 -0
  447. /package/dist/{chunk-TVIVY7KU.js.map → chunk-NED7IR7B.js.map} +0 -0
  448. /package/dist/{chunk-6F5MJFXY.js.map → chunk-NHVAX7MH.js.map} +0 -0
  449. /package/dist/{chunk-TG3R2SID.js.map → chunk-NMGHGTVR.js.map} +0 -0
  450. /package/dist/{chunk-NGHDW6UU.js.map → chunk-NUQEREIP.js.map} +0 -0
  451. /package/dist/{chunk-5IIQU4JZ.js.map → chunk-OB72KNMF.js.map} +0 -0
  452. /package/dist/{chunk-JV4S6VDH.js.map → chunk-OJXJWNFY.js.map} +0 -0
  453. /package/dist/{chunk-Z7JIZ42P.js.map → chunk-PRAUN6PN.js.map} +0 -0
  454. /package/dist/{chunk-RWGRSKN5.js.map → chunk-PT4DZDJA.js.map} +0 -0
  455. /package/dist/{chunk-7EPY3IQL.js.map → chunk-PZJQ46DH.js.map} +0 -0
  456. /package/dist/{chunk-MXHMNKWG.js.map → chunk-QDESY76F.js.map} +0 -0
  457. /package/dist/{chunk-I6QGI65T.js.map → chunk-QRMG4HK4.js.map} +0 -0
  458. /package/dist/{chunk-ZU3NJNO7.js.map → chunk-QSF5SJAM.js.map} +0 -0
  459. /package/dist/{chunk-5IYOKDM4.js.map → chunk-R23JWJD3.js.map} +0 -0
  460. /package/dist/{chunk-7GLJMDEQ.js.map → chunk-RM2YUFH6.js.map} +0 -0
  461. /package/dist/{chunk-RIMK327Y.js.map → chunk-SGQPR5SX.js.map} +0 -0
  462. /package/dist/{chunk-ZGFLIK5H.js.map → chunk-SPAKBUJY.js.map} +0 -0
  463. /package/dist/{chunk-ER7XANP3.js.map → chunk-SQ3GEIEL.js.map} +0 -0
  464. /package/dist/{chunk-BLJT6JP2.js.map → chunk-SVT5IA2H.js.map} +0 -0
  465. /package/dist/{chunk-GVGAO3WV.js.map → chunk-TJ4F6H4H.js.map} +0 -0
  466. /package/dist/{chunk-R6HMAIKM.js.map → chunk-TOSPNM4T.js.map} +0 -0
  467. /package/dist/{chunk-HH5LY6RR.js.map → chunk-TRQE3RYR.js.map} +0 -0
  468. /package/dist/{chunk-RMXS4I66.js.map → chunk-TVDJEUV5.js.map} +0 -0
  469. /package/dist/{chunk-PLCYKAWH.js.map → chunk-TYRWSE4B.js.map} +0 -0
  470. /package/dist/{chunk-IQWUACVG.js.map → chunk-UHMHJX5G.js.map} +0 -0
  471. /package/dist/{chunk-YODUDA6R.js.map → chunk-UN4RVUG2.js.map} +0 -0
  472. /package/dist/{chunk-E6Z4FBX6.js.map → chunk-V2QSNFCT.js.map} +0 -0
  473. /package/dist/{chunk-E7YZXWIS.js.map → chunk-WKSQTMU7.js.map} +0 -0
  474. /package/dist/{chunk-RIZ5NUNN.js.map → chunk-WQ4XKIOX.js.map} +0 -0
  475. /package/dist/{chunk-QEYTRFR3.js.map → chunk-X26YOFGS.js.map} +0 -0
  476. /package/dist/{chunk-ITHZFHST.js.map → chunk-X2BVB74H.js.map} +0 -0
  477. /package/dist/{chunk-XYKBWTWI.js.map → chunk-XIYLWEXC.js.map} +0 -0
  478. /package/dist/{chunk-IBJ6U753.js.map → chunk-XKZBZOKV.js.map} +0 -0
  479. /package/dist/{chunk-65AUYLU3.js.map → chunk-XPXHQI6N.js.map} +0 -0
  480. /package/dist/{chunk-EXHXJETE.js.map → chunk-XRDYRWZI.js.map} +0 -0
  481. /package/dist/{chunk-2JSDPUKD.js.map → chunk-YMFPFXEX.js.map} +0 -0
  482. /package/dist/{chunk-645WOU5I.js.map → chunk-ZDZJNXL6.js.map} +0 -0
  483. /package/dist/{chunk-6TCXIRP5.js.map → chunk-ZKE4CO6B.js.map} +0 -0
  484. /package/dist/{chunk-FNXQZGUS.js.map → chunk-ZSE774RV.js.map} +0 -0
  485. /package/dist/{contradiction-scan-P2MHYFVG.js.map → contradiction-scan-IBPYGQZF.js.map} +0 -0
  486. /package/dist/{resolution-N7H3F2E4.js.map → resolution-OVVIF7ZY.js.map} +0 -0
@@ -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":"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","names":[]}