@remnic/core 1.1.11 → 1.1.12

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 (298) hide show
  1. package/README.md +3 -3
  2. package/dist/access-cli.js +67 -59
  3. package/dist/access-cli.js.map +1 -1
  4. package/dist/access-http.d.ts +7 -4
  5. package/dist/access-http.js +30 -26
  6. package/dist/access-mcp.d.ts +9 -4
  7. package/dist/access-mcp.js +29 -25
  8. package/dist/access-schema.d.ts +188 -8
  9. package/dist/access-schema.js +12 -3
  10. package/dist/{access-service-BkXt3di1.d.ts → access-service-DDjzFALq.d.ts} +60 -11
  11. package/dist/access-service.d.ts +7 -4
  12. package/dist/access-service.js +26 -23
  13. package/dist/action-confidence.d.ts +83 -0
  14. package/dist/action-confidence.js +22 -0
  15. package/dist/active-memory-bridge.d.ts +1 -1
  16. package/dist/active-recall.d.ts +1 -1
  17. package/dist/behavior-learner.d.ts +1 -1
  18. package/dist/behavior-signals.d.ts +1 -1
  19. package/dist/bootstrap.d.ts +4 -2
  20. package/dist/briefing.d.ts +1 -1
  21. package/dist/briefing.js +5 -5
  22. package/dist/buffer-surprise-report.d.ts +1 -1
  23. package/dist/buffer.d.ts +1 -1
  24. package/dist/calibration.d.ts +1 -1
  25. package/dist/calibration.js +4 -4
  26. package/dist/{capsule-export-LLEVB2RG.js → capsule-export-7QNCBZOQ.js} +3 -3
  27. package/dist/{capsule-import-UW45R2MZ.js → capsule-import-EPBHD2EN.js} +3 -3
  28. package/dist/causal-behavior.d.ts +1 -1
  29. package/dist/causal-consolidation.d.ts +1 -1
  30. package/dist/causal-consolidation.js +11 -11
  31. package/dist/{chunk-VQXK37XA.js → chunk-23ZZK64Y.js} +1 -1
  32. package/dist/chunk-23ZZK64Y.js.map +1 -0
  33. package/dist/{chunk-HJYHRE4S.js → chunk-242S3I2A.js} +2 -2
  34. package/dist/{chunk-MCC6KDQF.js → chunk-3B6KIRBH.js} +131 -13
  35. package/dist/chunk-3B6KIRBH.js.map +1 -0
  36. package/dist/chunk-4RA3C3EV.js +60 -0
  37. package/dist/chunk-4RA3C3EV.js.map +1 -0
  38. package/dist/{chunk-EYNQTST2.js → chunk-4YM32CRU.js} +4 -4
  39. package/dist/{chunk-6AUUAZEX.js → chunk-5NXIJZFX.js} +38 -8
  40. package/dist/chunk-5NXIJZFX.js.map +1 -0
  41. package/dist/chunk-6NKAQ74D.js +2237 -0
  42. package/dist/chunk-6NKAQ74D.js.map +1 -0
  43. package/dist/{chunk-PHNGXFQ6.js → chunk-7V22HTMD.js} +3 -3
  44. package/dist/{chunk-363MWCD3.js → chunk-7ZM3BFKK.js} +84 -62
  45. package/dist/chunk-7ZM3BFKK.js.map +1 -0
  46. package/dist/chunk-AC5LO7IU.js +308 -0
  47. package/dist/chunk-AC5LO7IU.js.map +1 -0
  48. package/dist/chunk-AH2JUU6X.js +336 -0
  49. package/dist/chunk-AH2JUU6X.js.map +1 -0
  50. package/dist/{chunk-VX2IUQFE.js → chunk-AQJNPMOA.js} +41 -11
  51. package/dist/chunk-AQJNPMOA.js.map +1 -0
  52. package/dist/{chunk-P73JTV34.js → chunk-BBE34QBJ.js} +4 -4
  53. package/dist/{chunk-KUHRUM6B.js → chunk-BZSQEPRW.js} +452 -139
  54. package/dist/chunk-BZSQEPRW.js.map +1 -0
  55. package/dist/chunk-C5BCH4ZS.js +317 -0
  56. package/dist/chunk-C5BCH4ZS.js.map +1 -0
  57. package/dist/{chunk-C5HUWVH2.js → chunk-CPKTBRS2.js} +6 -6
  58. package/dist/{chunk-IBX3VFOM.js → chunk-D4GAOFF6.js} +118 -2
  59. package/dist/chunk-D4GAOFF6.js.map +1 -0
  60. package/dist/chunk-DB5A3NHS.js +906 -0
  61. package/dist/chunk-DB5A3NHS.js.map +1 -0
  62. package/dist/{chunk-I6BQZSML.js → chunk-DZZPC36E.js} +10 -10
  63. package/dist/{chunk-O4XJUPSF.js → chunk-E2UCDP5S.js} +39 -2
  64. package/dist/chunk-E2UCDP5S.js.map +1 -0
  65. package/dist/{chunk-SRBJUAMP.js → chunk-FMEBPEAO.js} +11 -67
  66. package/dist/chunk-FMEBPEAO.js.map +1 -0
  67. package/dist/{chunk-4DXC6HQQ.js → chunk-FQDPCE3I.js} +5 -5
  68. package/dist/{chunk-NN3LPQ5D.js → chunk-HELQZFZO.js} +155 -16
  69. package/dist/chunk-HELQZFZO.js.map +1 -0
  70. package/dist/{chunk-57QNCUEZ.js → chunk-HL5LRPNA.js} +2 -2
  71. package/dist/{chunk-VTU2B4VF.js → chunk-HQZVVSVB.js} +2 -1
  72. package/dist/chunk-HQZVVSVB.js.map +1 -0
  73. package/dist/{chunk-6Z6UH6TK.js → chunk-HY3L4WKC.js} +69 -3
  74. package/dist/chunk-HY3L4WKC.js.map +1 -0
  75. package/dist/{chunk-QIGOEM65.js → chunk-IB3BFHGN.js} +5 -5
  76. package/dist/{chunk-RXTFCYQF.js → chunk-JESOB2HO.js} +6 -6
  77. package/dist/{chunk-2YMTO4ZJ.js → chunk-JKDVIE52.js} +9 -2
  78. package/dist/chunk-JKDVIE52.js.map +1 -0
  79. package/dist/{chunk-WGK4VHGP.js → chunk-MNU6ZBWT.js} +302 -140
  80. package/dist/chunk-MNU6ZBWT.js.map +1 -0
  81. package/dist/chunk-OAZ5MFUB.js +4124 -0
  82. package/dist/chunk-OAZ5MFUB.js.map +1 -0
  83. package/dist/{chunk-ZTSE2ZJ6.js → chunk-OIGNEXKZ.js} +50 -3
  84. package/dist/chunk-OIGNEXKZ.js.map +1 -0
  85. package/dist/chunk-OZKZ2TRP.js +3729 -0
  86. package/dist/chunk-OZKZ2TRP.js.map +1 -0
  87. package/dist/{chunk-GGD5W7TB.js → chunk-PD6O7AXF.js} +7 -2
  88. package/dist/chunk-PD6O7AXF.js.map +1 -0
  89. package/dist/{chunk-S3IP6R6K.js → chunk-PH4C2U43.js} +23 -3
  90. package/dist/chunk-PH4C2U43.js.map +1 -0
  91. package/dist/chunk-PYPOFEMK.js +294 -0
  92. package/dist/chunk-PYPOFEMK.js.map +1 -0
  93. package/dist/{chunk-EQINRHYR.js → chunk-QDZ2RLEC.js} +243 -7
  94. package/dist/chunk-QDZ2RLEC.js.map +1 -0
  95. package/dist/{chunk-KWBPHZUU.js → chunk-RK6F44Y6.js} +3 -2
  96. package/dist/chunk-RK6F44Y6.js.map +1 -0
  97. package/dist/{chunk-36CTNQY7.js → chunk-RVPLBATS.js} +42 -10
  98. package/dist/chunk-RVPLBATS.js.map +1 -0
  99. package/dist/chunk-SOAU2OE2.js +125 -0
  100. package/dist/chunk-SOAU2OE2.js.map +1 -0
  101. package/dist/{chunk-A4ACKWIW.js → chunk-U5JMRGKX.js} +55 -4
  102. package/dist/chunk-U5JMRGKX.js.map +1 -0
  103. package/dist/{chunk-LIO5X3CM.js → chunk-UVMUAWVT.js} +2 -2
  104. package/dist/chunk-VWT3F4IV.js +2161 -0
  105. package/dist/chunk-VWT3F4IV.js.map +1 -0
  106. package/dist/{chunk-PB5KW5PL.js → chunk-WEJG4TB5.js} +6 -6
  107. package/dist/{chunk-KBYWQWSB.js → chunk-X7HPGUVG.js} +2 -2
  108. package/dist/{chunk-Y5KDIOKF.js → chunk-XAMBKFQS.js} +383 -9
  109. package/dist/chunk-XAMBKFQS.js.map +1 -0
  110. package/dist/{chunk-ZL4S7ARC.js → chunk-Y3VMVTYX.js} +3 -3
  111. package/dist/{chunk-Z5S5HNGY.js → chunk-ZG7PTKBK.js} +21 -5
  112. package/dist/chunk-ZG7PTKBK.js.map +1 -0
  113. package/dist/{chunk-6XA7UN4Z.js → chunk-ZNQN6ZTA.js} +2 -2
  114. package/dist/{chunk-WTFWLUSX.js → chunk-ZVTKDVVM.js} +2 -2
  115. package/dist/{cli-Cvy2SNhF.d.ts → cli-BR8KpIU0.d.ts} +2 -2
  116. package/dist/cli.d.ts +7 -4
  117. package/dist/cli.js +44 -40
  118. package/dist/codex-cli-fallback.d.ts +1 -0
  119. package/dist/codex-cli-fallback.js +1 -1
  120. package/dist/compression-optimizer.d.ts +1 -1
  121. package/dist/config.d.ts +1 -1
  122. package/dist/config.js +1 -1
  123. package/dist/consolidation-provenance-check.d.ts +1 -1
  124. package/dist/consolidation-undo.d.ts +1 -1
  125. package/dist/{contradiction-scan-3Z6YW7YA.js → contradiction-scan-QTXAMBUA.js} +3 -2
  126. package/dist/contradiction-scan-QTXAMBUA.js.map +1 -0
  127. package/dist/day-summary.d.ts +1 -1
  128. package/dist/delinearize.d.ts +1 -1
  129. package/dist/direct-answer-wiring.d.ts +1 -1
  130. package/dist/direct-answer-wiring.js +1 -1
  131. package/dist/direct-answer.d.ts +1 -1
  132. package/dist/embedding-fallback.d.ts +1 -1
  133. package/dist/{engine-FOC3IJLA.js → engine-35M5BKQ7.js} +7 -7
  134. package/dist/entity-retrieval.d.ts +1 -1
  135. package/dist/entity-retrieval.js +5 -5
  136. package/dist/entity-schema.d.ts +1 -1
  137. package/dist/event-order-recall.d.ts +17 -0
  138. package/dist/event-order-recall.js +11 -0
  139. package/dist/event-order-recall.js.map +1 -0
  140. package/dist/evidence-pack.d.ts +3 -1
  141. package/dist/evidence-pack.js +5 -3
  142. package/dist/explicit-capture.d.ts +4 -2
  143. package/dist/explicit-cue-recall.d.ts +4 -1
  144. package/dist/explicit-cue-recall.js +4 -2
  145. package/dist/extraction-judge-telemetry.d.ts +1 -1
  146. package/dist/extraction-judge-training.d.ts +1 -1
  147. package/dist/extraction-judge.d.ts +1 -1
  148. package/dist/extraction.d.ts +1 -1
  149. package/dist/extraction.js +8 -7
  150. package/dist/fallback-llm.d.ts +2 -1
  151. package/dist/fallback-llm.js +4 -4
  152. package/dist/focused-list-recall.d.ts +17 -0
  153. package/dist/focused-list-recall.js +11 -0
  154. package/dist/focused-list-recall.js.map +1 -0
  155. package/dist/identity-continuity.d.ts +1 -1
  156. package/dist/importance.d.ts +1 -1
  157. package/dist/{index-1qIcnbG1.d.ts → index-DJ9QWMw-.d.ts} +3 -2
  158. package/dist/index.d.ts +49 -12
  159. package/dist/index.js +284 -114
  160. package/dist/index.js.map +1 -1
  161. package/dist/intent.d.ts +1 -1
  162. package/dist/intent.js +1 -1
  163. package/dist/lifecycle.d.ts +1 -1
  164. package/dist/live-connectors-runner.d.ts +1 -1
  165. package/dist/local-llm.d.ts +8 -4
  166. package/dist/local-llm.js +1 -1
  167. package/dist/mcp-memory-inspector-app.d.ts +106 -0
  168. package/dist/mcp-memory-inspector-app.js +20 -0
  169. package/dist/mcp-memory-inspector-app.js.map +1 -0
  170. package/dist/memory-action-policy.d.ts +1 -1
  171. package/dist/memory-cache.d.ts +1 -1
  172. package/dist/{memory-governance-F3QOJGEY.js → memory-governance-IMPQZXFC.js} +7 -7
  173. package/dist/memory-governance-IMPQZXFC.js.map +1 -0
  174. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  175. package/dist/memory-projection-store.d.ts +1 -1
  176. package/dist/memory-provenance.d.ts +57 -0
  177. package/dist/memory-provenance.js +13 -0
  178. package/dist/memory-provenance.js.map +1 -0
  179. package/dist/memory-worth-outcomes.d.ts +1 -1
  180. package/dist/models-json.d.ts +1 -1
  181. package/dist/native-knowledge.d.ts +1 -1
  182. package/dist/objective-state-writers.d.ts +1 -1
  183. package/dist/objective-state-writers.js +2 -2
  184. package/dist/operator-toolkit.d.ts +1 -1
  185. package/dist/operator-toolkit.js +11 -11
  186. package/dist/{orchestrator-AOQMo7QI.d.ts → orchestrator-DDMPqU6R.d.ts} +9 -1
  187. package/dist/orchestrator.d.ts +4 -2
  188. package/dist/orchestrator.js +53 -46
  189. package/dist/patterns-cli.d.ts +1 -1
  190. package/dist/policy-runtime.d.ts +1 -1
  191. package/dist/qmd-recall-cache.d.ts +1 -1
  192. package/dist/qmd.d.ts +1 -1
  193. package/dist/recall-disclosure-escalation.d.ts +1 -1
  194. package/dist/recall-explain-renderer.d.ts +3 -1
  195. package/dist/recall-explain-renderer.js +5 -3
  196. package/dist/recall-state.d.ts +1 -1
  197. package/dist/recall-tag-filter.d.ts +3 -1
  198. package/dist/recall-xray-cli.d.ts +3 -1
  199. package/dist/recall-xray-cli.js +6 -4
  200. package/dist/recall-xray-renderer.d.ts +3 -1
  201. package/dist/recall-xray-renderer.js +5 -3
  202. package/dist/recall-xray.d.ts +8 -1
  203. package/dist/recall-xray.js +4 -2
  204. package/dist/resolve-auth-token.d.ts +1 -1
  205. package/dist/resolve-provider-secret.js +1 -1
  206. package/dist/response-guidance-recall.d.ts +18 -0
  207. package/dist/response-guidance-recall.js +11 -0
  208. package/dist/response-guidance-recall.js.map +1 -0
  209. package/dist/resume-bundles.js +3 -3
  210. package/dist/retrieval-agents.d.ts +1 -1
  211. package/dist/retrieval-tiers.d.ts +1 -1
  212. package/dist/schemas.d.ts +22 -22
  213. package/dist/semantic-consolidation.d.ts +1 -1
  214. package/dist/semantic-consolidation.js +6 -6
  215. package/dist/semantic-rule-promotion.js +5 -5
  216. package/dist/semantic-rule-verifier.d.ts +1 -1
  217. package/dist/semantic-rule-verifier.js +6 -6
  218. package/dist/session-observer-bands.d.ts +1 -1
  219. package/dist/session-observer-state.d.ts +1 -1
  220. package/dist/signal.d.ts +1 -1
  221. package/dist/storage.d.ts +3 -1
  222. package/dist/storage.js +4 -4
  223. package/dist/summarizer.d.ts +1 -1
  224. package/dist/summarizer.js +6 -6
  225. package/dist/summary-snapshot.d.ts +1 -1
  226. package/dist/targeted-fact-recall.d.ts +17 -0
  227. package/dist/targeted-fact-recall.js +11 -0
  228. package/dist/targeted-fact-recall.js.map +1 -0
  229. package/dist/telemetry-transcript.d.ts +7 -0
  230. package/dist/telemetry-transcript.js +16 -0
  231. package/dist/telemetry-transcript.js.map +1 -0
  232. package/dist/temporal-supersession.d.ts +1 -1
  233. package/dist/temporal-supersession.js +2 -1
  234. package/dist/temporal-validity.d.ts +1 -1
  235. package/dist/threading.d.ts +1 -1
  236. package/dist/tier-migration.d.ts +1 -1
  237. package/dist/tier-routing.d.ts +1 -1
  238. package/dist/tokens.js +1 -1
  239. package/dist/topics.d.ts +1 -1
  240. package/dist/transcript.d.ts +1 -1
  241. package/dist/trust-zones.d.ts +3 -2
  242. package/dist/trust-zones.js +1 -1
  243. package/dist/types.d.ts +60 -2
  244. package/dist/types.js +1 -1
  245. package/dist/user-model.d.ts +37 -0
  246. package/dist/user-model.js +28 -0
  247. package/dist/user-model.js.map +1 -0
  248. package/dist/utility-runtime.d.ts +1 -1
  249. package/dist/verified-recall.js +6 -6
  250. package/package.json +1 -1
  251. package/dist/chunk-2YMTO4ZJ.js.map +0 -1
  252. package/dist/chunk-363MWCD3.js.map +0 -1
  253. package/dist/chunk-36CTNQY7.js.map +0 -1
  254. package/dist/chunk-6AUUAZEX.js.map +0 -1
  255. package/dist/chunk-6Z6UH6TK.js.map +0 -1
  256. package/dist/chunk-74WWN7ZW.js +0 -82
  257. package/dist/chunk-74WWN7ZW.js.map +0 -1
  258. package/dist/chunk-A4ACKWIW.js.map +0 -1
  259. package/dist/chunk-EQINRHYR.js.map +0 -1
  260. package/dist/chunk-GGD5W7TB.js.map +0 -1
  261. package/dist/chunk-IBX3VFOM.js.map +0 -1
  262. package/dist/chunk-KUHRUM6B.js.map +0 -1
  263. package/dist/chunk-KWBPHZUU.js.map +0 -1
  264. package/dist/chunk-MCC6KDQF.js.map +0 -1
  265. package/dist/chunk-NN3LPQ5D.js.map +0 -1
  266. package/dist/chunk-O4XJUPSF.js.map +0 -1
  267. package/dist/chunk-S2JJBLJG.js +0 -2101
  268. package/dist/chunk-S2JJBLJG.js.map +0 -1
  269. package/dist/chunk-S3IP6R6K.js.map +0 -1
  270. package/dist/chunk-SRBJUAMP.js.map +0 -1
  271. package/dist/chunk-VQXK37XA.js.map +0 -1
  272. package/dist/chunk-VTU2B4VF.js.map +0 -1
  273. package/dist/chunk-VX2IUQFE.js.map +0 -1
  274. package/dist/chunk-WGK4VHGP.js.map +0 -1
  275. package/dist/chunk-Y5KDIOKF.js.map +0 -1
  276. package/dist/chunk-Z5S5HNGY.js.map +0 -1
  277. package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
  278. package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
  279. /package/dist/{capsule-export-LLEVB2RG.js.map → action-confidence.js.map} +0 -0
  280. /package/dist/{capsule-import-UW45R2MZ.js.map → capsule-export-7QNCBZOQ.js.map} +0 -0
  281. /package/dist/{engine-FOC3IJLA.js.map → capsule-import-EPBHD2EN.js.map} +0 -0
  282. /package/dist/{chunk-HJYHRE4S.js.map → chunk-242S3I2A.js.map} +0 -0
  283. /package/dist/{chunk-EYNQTST2.js.map → chunk-4YM32CRU.js.map} +0 -0
  284. /package/dist/{chunk-PHNGXFQ6.js.map → chunk-7V22HTMD.js.map} +0 -0
  285. /package/dist/{chunk-P73JTV34.js.map → chunk-BBE34QBJ.js.map} +0 -0
  286. /package/dist/{chunk-C5HUWVH2.js.map → chunk-CPKTBRS2.js.map} +0 -0
  287. /package/dist/{chunk-I6BQZSML.js.map → chunk-DZZPC36E.js.map} +0 -0
  288. /package/dist/{chunk-4DXC6HQQ.js.map → chunk-FQDPCE3I.js.map} +0 -0
  289. /package/dist/{chunk-57QNCUEZ.js.map → chunk-HL5LRPNA.js.map} +0 -0
  290. /package/dist/{chunk-QIGOEM65.js.map → chunk-IB3BFHGN.js.map} +0 -0
  291. /package/dist/{chunk-RXTFCYQF.js.map → chunk-JESOB2HO.js.map} +0 -0
  292. /package/dist/{chunk-LIO5X3CM.js.map → chunk-UVMUAWVT.js.map} +0 -0
  293. /package/dist/{chunk-PB5KW5PL.js.map → chunk-WEJG4TB5.js.map} +0 -0
  294. /package/dist/{chunk-KBYWQWSB.js.map → chunk-X7HPGUVG.js.map} +0 -0
  295. /package/dist/{chunk-ZL4S7ARC.js.map → chunk-Y3VMVTYX.js.map} +0 -0
  296. /package/dist/{chunk-6XA7UN4Z.js.map → chunk-ZNQN6ZTA.js.map} +0 -0
  297. /package/dist/{chunk-WTFWLUSX.js.map → chunk-ZVTKDVVM.js.map} +0 -0
  298. /package/dist/{memory-governance-F3QOJGEY.js.map → engine-35M5BKQ7.js.map} +0 -0
@@ -21,6 +21,7 @@ var ENTITY_PATTERNS = [
21
21
  { re: /\b(doc|readme|docs|changelog)\b/i, entityType: "docs" }
22
22
  ];
23
23
  var TASK_INITIATION_RE = /\b(ship(?:ping|ped)?|deploy(?:ing|ed)?|release|publish|open(?:ing)?\s+(?:a\s+)?(?:pr|pull\s+request)|merge(?:ing)?\s+(?:the\s+)?(?:pr|pull\s+request)|run\s+(?:the\s+)?tests?|start(?:ing)?\s+(?:work|on|the)|kick\s+off|implement(?:ing|ed)?|let's\s+(?:ship|deploy|release|publish|open|run|merge|implement|fix|patch|build|start|do|get|put|wire|hook|land|roll)\b|going\s+to\s+(?:ship|deploy|release|open|run|merge)|need\s+to\s+(?:ship|deploy|run|open|merge|test)|fix(?:ing|ed)?\s+(?:(?:the|a)\s+)?(?:\w+\s+){0,4}(?:bug|build)\b|patch(?:ing|ed)?|build(?:ing)?\s+(?:and\s+)?(?:ship|deploy))\b/i;
24
+ var MEMORY_LOOKUP_RE = /^(?:what|when|where|who|which|why|how|did)\b/i;
24
25
  function normalizeTextInput(input) {
25
26
  return typeof input === "string" ? input : "";
26
27
  }
@@ -31,7 +32,7 @@ function inferIntentFromText(text) {
31
32
  const entityTypes = Array.from(
32
33
  new Set(ENTITY_PATTERNS.filter((p) => p.re.test(safeText)).map((p) => p.entityType))
33
34
  );
34
- const taskInitiation = TASK_INITIATION_RE.test(safeText);
35
+ const taskInitiation = !isMemoryLookupPrompt(safeText) && TASK_INITIATION_RE.test(safeText);
35
36
  return {
36
37
  goal,
37
38
  actionType,
@@ -42,6 +43,10 @@ function inferIntentFromText(text) {
42
43
  function isTaskInitiationIntent(intent) {
43
44
  return intent.taskInitiation === true;
44
45
  }
46
+ function isMemoryLookupPrompt(text) {
47
+ const trimmed = text.trim();
48
+ return MEMORY_LOOKUP_RE.test(trimmed) || /\b(?:previous|earlier|last week|last time|remember|recall|what did we decide)\b/i.test(trimmed);
49
+ }
45
50
  function intentCompatibilityScore(queryIntent, memoryIntent) {
46
51
  const queryHasSignal = queryIntent.goal !== "unknown" || queryIntent.actionType !== "unknown" || queryIntent.entityTypes.length > 0;
47
52
  const memoryHasSignal = memoryIntent.goal !== "unknown" || memoryIntent.actionType !== "unknown" || memoryIntent.entityTypes.length > 0;
@@ -102,4 +107,4 @@ export {
102
107
  planRecallMode,
103
108
  hasBroadGraphIntent
104
109
  };
105
- //# sourceMappingURL=chunk-GGD5W7TB.js.map
110
+ //# sourceMappingURL=chunk-PD6O7AXF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/intent.ts"],"sourcesContent":["import type { MemoryIntent, RecallPlanMode } from \"./types.js\";\n\nconst GOAL_PATTERNS: Array<{ re: RegExp; goal: string }> = [\n { re: /\\b(debug(?:s|ged|ging)?|fix(?:es|ed|ing)?|error(?:s)?|incident(?:s)?|outage(?:s)?|failure(?:s)?)\\b/i, goal: \"stabilize\" },\n { re: /\\b(deploy(?:s|ed|ing)?|release(?:s|d|ing)?|ship(?:s|ped|ping)?|publish(?:es|ed|ing)?)\\b/i, goal: \"release\" },\n { re: /\\b(plan(?:s|ned|ning)?|roadmap(?:s)?|strateg(?:y|ies)|design(?:s|ed|ing)?)\\b/i, goal: \"plan\" },\n { re: /\\b(review(?:s|ed|ing)?|audit(?:s|ed|ing)?|security|hardening)\\b/i, goal: \"review\" },\n { re: /\\b(sales|deal|customer|client|prospect)\\b/i, goal: \"close_deal\" },\n];\n\nconst ACTION_PATTERNS: Array<{ re: RegExp; action: string }> = [\n { re: /\\b(review(?:s|ed|ing)?|audit(?:s|ed|ing)?|inspect(?:s|ed|ing)?|check(?:s|ed|ing)?)\\b/i, action: \"review\" },\n { re: /\\b(plan(?:s|ned|ning)?|design(?:s|ed|ing)?|brainstorm(?:s|ed|ing)?|spec(?:s)?)\\b/i, action: \"plan\" },\n { re: /\\b(implement(?:s|ed|ing)?|build(?:s|ing)?|built|code(?:s|d|ing)?|patch(?:es|ed|ing)?|fix(?:es|ed|ing)?)\\b/i, action: \"execute\" },\n { re: /\\b(summariz(?:e|es|ed|ing)|recap(?:s|ped|ping)?|what happened|timeline)\\b/i, action: \"summarize\" },\n { re: /\\b(decid(?:e|es|ed|ing)|decision(?:s)?|cho(?:ose|oses|osing)|chose|chosen)\\b/i, action: \"decide\" },\n];\n\nconst ENTITY_PATTERNS: Array<{ re: RegExp; entityType: string }> = [\n { re: /\\b(pr|pull request|branch|repo|github|ci|workflow)\\b/i, entityType: \"repo\" },\n { re: /\\b(discord|slack|channel|gateway|agent)\\b/i, entityType: \"ops\" },\n { re: /\\b(customer|client|deal|lead|account)\\b/i, entityType: \"client\" },\n { re: /\\b(model|llm|qmd|embedding|retrieval|memory)\\b/i, entityType: \"ai\" },\n { re: /\\b(doc|readme|docs|changelog)\\b/i, entityType: \"docs\" },\n];\n\n/** User/agent is starting a hands-on task (issue #519 procedure recall gate). */\nconst TASK_INITIATION_RE =\n /\\b(ship(?:ping|ped)?|deploy(?:ing|ed)?|release|publish|open(?:ing)?\\s+(?:a\\s+)?(?:pr|pull\\s+request)|merge(?:ing)?\\s+(?:the\\s+)?(?:pr|pull\\s+request)|run\\s+(?:the\\s+)?tests?|start(?:ing)?\\s+(?:work|on|the)|kick\\s+off|implement(?:ing|ed)?|let's\\s+(?:ship|deploy|release|publish|open|run|merge|implement|fix|patch|build|start|do|get|put|wire|hook|land|roll)\\b|going\\s+to\\s+(?:ship|deploy|release|open|run|merge)|need\\s+to\\s+(?:ship|deploy|run|open|merge|test)|fix(?:ing|ed)?\\s+(?:(?:the|a)\\s+)?(?:\\w+\\s+){0,4}(?:bug|build)\\b|patch(?:ing|ed)?|build(?:ing)?\\s+(?:and\\s+)?(?:ship|deploy))\\b/i;\n\nconst MEMORY_LOOKUP_RE =\n /^(?:what|when|where|who|which|why|how|did)\\b/i;\n\nfunction normalizeTextInput(input: unknown): string {\n return typeof input === \"string\" ? input : \"\";\n}\n\nexport function inferIntentFromText(text: string): MemoryIntent {\n const safeText = normalizeTextInput(text);\n const goal = GOAL_PATTERNS.find((p) => p.re.test(safeText))?.goal ?? \"unknown\";\n const actionType = ACTION_PATTERNS.find((p) => p.re.test(safeText))?.action ?? \"unknown\";\n const entityTypes = Array.from(\n new Set(ENTITY_PATTERNS.filter((p) => p.re.test(safeText)).map((p) => p.entityType)),\n );\n const taskInitiation = !isMemoryLookupPrompt(safeText) && TASK_INITIATION_RE.test(safeText);\n\n return {\n goal,\n actionType,\n entityTypes,\n taskInitiation,\n };\n}\n\nexport function isTaskInitiationIntent(intent: MemoryIntent): boolean {\n return intent.taskInitiation === true;\n}\n\nfunction isMemoryLookupPrompt(text: string): boolean {\n const trimmed = text.trim();\n return MEMORY_LOOKUP_RE.test(trimmed) ||\n /\\b(?:previous|earlier|last week|last time|remember|recall|what did we decide)\\b/i.test(trimmed);\n}\n\nexport function intentCompatibilityScore(queryIntent: MemoryIntent, memoryIntent: MemoryIntent): number {\n const queryHasSignal =\n queryIntent.goal !== \"unknown\" ||\n queryIntent.actionType !== \"unknown\" ||\n queryIntent.entityTypes.length > 0;\n const memoryHasSignal =\n memoryIntent.goal !== \"unknown\" ||\n memoryIntent.actionType !== \"unknown\" ||\n memoryIntent.entityTypes.length > 0;\n if (!queryHasSignal || !memoryHasSignal) return 0;\n\n let score = 0;\n if (\n queryIntent.goal !== \"unknown\" &&\n memoryIntent.goal !== \"unknown\" &&\n queryIntent.goal === memoryIntent.goal\n ) {\n score += 0.5;\n }\n if (\n queryIntent.actionType !== \"unknown\" &&\n memoryIntent.actionType !== \"unknown\" &&\n queryIntent.actionType === memoryIntent.actionType\n ) {\n score += 0.3;\n }\n\n const overlap = queryIntent.entityTypes.filter((et) => memoryIntent.entityTypes.includes(et)).length;\n if (overlap > 0) {\n const denom = Math.max(queryIntent.entityTypes.length, memoryIntent.entityTypes.length, 1);\n score += 0.2 * (overlap / denom);\n }\n\n return Math.max(0, Math.min(1, score));\n}\n\nexport function planRecallMode(prompt: string): RecallPlanMode {\n const p = normalizeTextInput(prompt).trim();\n let ackCandidate = p;\n while (ackCandidate.length > 0) {\n const ch = ackCandidate.charCodeAt(ackCandidate.length - 1);\n const isDigit = ch >= 48 && ch <= 57;\n const isUpper = ch >= 65 && ch <= 90;\n const isLower = ch >= 97 && ch <= 122;\n // Strip any trailing non-alphanumeric noise (punctuation/emojis/symbols).\n if (isDigit || isUpper || isLower) break;\n ackCandidate = ackCandidate.slice(0, -1);\n }\n ackCandidate = ackCandidate.trim();\n if (p.length === 0) return \"no_recall\";\n\n if (/\\b(timeline|sequence|history|what happened|chain of events|root cause)\\b/i.test(p)) {\n return \"graph_mode\";\n }\n\n // Reserve no_recall for low-information acknowledgements; avoid broad regressions.\n if (\n p.length <= 18 &&\n /^(ok|okay|kk|thanks|thx|got it|sounds good|yep|yes|nope|no|done|cool|works)$/i.test(ackCandidate)\n ) {\n return \"no_recall\";\n }\n\n // Full recall for prompts that are explicitly memory-seeking or analytical questions.\n if (\n /\\b(previous|earlier|remember|last time|did we|what did we decide|context|summarize|summary|recap|key points|decision)\\b/i.test(p) ||\n /\\?$/.test(p) ||\n /^(what|why|how|when|where|who|which)\\b/i.test(p.toLowerCase())\n ) {\n return \"full\";\n }\n\n // Minimal for short, non-question operational directives to keep latency/tokens down.\n if (\n p.length <= 100 &&\n /^(check|reload|restart|run|verify|show|status|sync|update|open|close|set|enable|disable|fix|patch)\\b/i.test(p)\n ) {\n return \"minimal\";\n }\n\n return \"full\";\n}\n\nexport function hasBroadGraphIntent(prompt: string): boolean {\n const p = normalizeTextInput(prompt).trim().toLowerCase();\n if (!p) return false;\n return /\\b(what changed|how did we get here|why did this happen|what led to|cause chain|dependency chain|regression chain|failure chain)\\b/i.test(\n p,\n );\n}\n"],"mappings":"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","names":[]}
@@ -14,6 +14,11 @@ var _resolverLoaded = false;
14
14
  var _resolverNextRetryAt = 0;
15
15
  var RESOLVER_RETRY_BACKOFF_MS = 6e4;
16
16
  var resolvedCache = /* @__PURE__ */ new Map();
17
+ var NON_LITERAL_AUTH_MARKERS = /* @__PURE__ */ new Set([
18
+ "secretref-managed",
19
+ "lm-studio"
20
+ ]);
21
+ var ENV_VAR_MARKER_RE = /^[A-Z][A-Z0-9_]*(?:_API_KEY|_ACCESS_TOKEN|_TOKEN|_SECRET|_CREDENTIALS|_CREDENTIALS_JSON)$/;
17
22
  async function getGatewayResolver() {
18
23
  if (_resolverLoaded) {
19
24
  return _resolveApiKeyForProvider;
@@ -127,6 +132,14 @@ function findExecutableOnPath(executableName, access, stat, executableMode) {
127
132
  return void 0;
128
133
  }
129
134
  var __findExecutableOnPathForTest = findExecutableOnPath;
135
+ function isNonLiteralAuthMarker(value) {
136
+ return NON_LITERAL_AUTH_MARKERS.has(value) || value.endsWith("-oauth") || value.endsWith("-local") || value.startsWith("gcp-") || ENV_VAR_MARKER_RE.test(value);
137
+ }
138
+ function resolveFromNamedEnvVar(marker) {
139
+ if (!ENV_VAR_MARKER_RE.test(marker)) return void 0;
140
+ const value = readEnvVar(marker);
141
+ return value && value.trim().length > 0 ? value.trim() : void 0;
142
+ }
130
143
  async function resolveProviderApiKey(providerId, apiKeyValue, gatewayConfig, agentDir) {
131
144
  const resolvedAgentDir = path.resolve(
132
145
  agentDir ?? path.join(os.homedir(), ".openclaw", "agents", "main", "agent")
@@ -137,9 +150,16 @@ async function resolveProviderApiKey(providerId, apiKeyValue, gatewayConfig, age
137
150
  }
138
151
  let resolved;
139
152
  if (typeof apiKeyValue === "string" && apiKeyValue.trim().length > 0) {
140
- if (apiKeyValue === "secretref-managed" || apiKeyValue.endsWith("-oauth") || apiKeyValue.endsWith("-local") || apiKeyValue === "lm-studio" || apiKeyValue.startsWith("gcp-")) {
153
+ const trimmedApiKeyValue = apiKeyValue.trim();
154
+ if (isNonLiteralAuthMarker(trimmedApiKeyValue)) {
155
+ const markerEnvValue = resolveFromNamedEnvVar(trimmedApiKeyValue);
156
+ if (markerEnvValue) {
157
+ resolved = markerEnvValue;
158
+ resolvedCache.set(cacheKey, resolved);
159
+ return resolved;
160
+ }
141
161
  } else {
142
- resolved = apiKeyValue;
162
+ resolved = trimmedApiKeyValue;
143
163
  resolvedCache.set(cacheKey, resolved);
144
164
  return resolved;
145
165
  }
@@ -216,4 +236,4 @@ export {
216
236
  __setGatewayResolverForTest,
217
237
  __setGatewayRuntimeAuthForModelForTest
218
238
  };
219
- //# sourceMappingURL=chunk-S3IP6R6K.js.map
239
+ //# sourceMappingURL=chunk-PH4C2U43.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/resolve-provider-secret.ts"],"sourcesContent":["import { log } from \"./logger.js\";\nimport { readEnvVar } from \"./runtime/env.js\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/**\n * Resolve a provider API key using OpenClaw's own auth resolution system.\n *\n * This module delegates to the gateway's `resolveApiKeyForProvider()` function,\n * which handles all secret reference formats (SecretRef objects, auth profiles,\n * \"secretref-managed\" markers, environment variables, etc.) using the same\n * codepath the gateway uses for its own agent sessions.\n *\n * For plain-text API keys, a fast path returns them directly without\n * involving the gateway auth system.\n *\n * Results are cached per provider for the gateway process lifetime.\n */\n\ntype ResolveApiKeyFn = (params: {\n provider: string;\n cfg?: unknown;\n agentDir?: string;\n}) => Promise<{ apiKey?: string; source?: string; mode?: string } | null>;\n\n/**\n * Resolve request-ready auth for a model, including provider-owned transforms\n * (e.g., OAuth token exchange, base URL override for openai-codex).\n */\nexport type GetRuntimeAuthForModelFn = (params: {\n model: { provider: string; id: string; api?: string; baseUrl?: string };\n cfg?: unknown;\n workspaceDir?: string;\n}) => Promise<{\n apiKey?: string;\n baseUrl?: string;\n source?: string;\n mode?: string;\n profileId?: string;\n} | null>;\n\nlet _resolveApiKeyForProvider: ResolveApiKeyFn | null = null;\nlet _getRuntimeAuthForModel: GetRuntimeAuthForModelFn | null = null;\nlet _resolverLoaded = false;\nlet _resolverNextRetryAt = 0;\nconst RESOLVER_RETRY_BACKOFF_MS = 60_000; // 1 minute between retries after first failure\nconst resolvedCache = new Map<string, string | undefined>();\nconst NON_LITERAL_AUTH_MARKERS = new Set([\n \"secretref-managed\",\n \"lm-studio\",\n]);\nconst ENV_VAR_MARKER_RE =\n /^[A-Z][A-Z0-9_]*(?:_API_KEY|_ACCESS_TOKEN|_TOKEN|_SECRET|_CREDENTIALS|_CREDENTIALS_JSON)$/;\n\n/**\n * Lazily load the gateway's resolveApiKeyForProvider function.\n * Returns null if not available (e.g., running outside the gateway process).\n */\nasync function getGatewayResolver(): Promise<ResolveApiKeyFn | null> {\n if (_resolverLoaded) {\n return _resolveApiKeyForProvider;\n }\n // Backoff: don't re-scan filesystem on every call when module wasn't found.\n // After a failure, wait RESOLVER_RETRY_BACKOFF_MS before trying again.\n if (_resolverNextRetryAt > 0 && Date.now() < _resolverNextRetryAt) {\n return null;\n }\n\n try {\n // The gateway bundles this in a runtime chunk — import it dynamically.\n // This import path is stable across gateway versions since it's a named runtime export.\n const candidates = [\n // Try glob-matching the runtime module name (hash varies per build)\n ...await findRuntimeModules(),\n ];\n\n const { pathToFileURL } = await import(\"node:url\");\n for (const candidate of candidates) {\n try {\n // Convert native path to file:// URL for cross-platform ESM import compatibility\n const importUrl = pathToFileURL(candidate).href;\n const mod = await import(importUrl);\n if (typeof mod.resolveApiKeyForProvider === \"function\") {\n _resolveApiKeyForProvider = mod.resolveApiKeyForProvider;\n if (typeof mod.getRuntimeAuthForModel === \"function\") {\n _getRuntimeAuthForModel = mod.getRuntimeAuthForModel;\n log.debug(\"loaded gateway getRuntimeAuthForModel from runtime module\");\n }\n _resolverLoaded = true;\n log.debug(\"loaded gateway resolveApiKeyForProvider from runtime module\");\n return _resolveApiKeyForProvider;\n }\n } catch {\n // Try next candidate\n }\n }\n } catch {\n // Silent\n }\n\n // Backoff before retrying — avoid repeated fs scanning.\n // Retries after RESOLVER_RETRY_BACKOFF_MS so the resolver can\n // recover if the gateway restarts or the module becomes available.\n _resolverNextRetryAt = Date.now() + RESOLVER_RETRY_BACKOFF_MS;\n log.debug(`gateway resolveApiKeyForProvider not available — will retry after ${RESOLVER_RETRY_BACKOFF_MS / 1000}s`);\n return null;\n}\n\n/**\n * Find the gateway's model-auth runtime module by scanning the dist directory.\n * Uses require.resolve to find the openclaw package regardless of install method.\n */\nasync function findRuntimeModules(): Promise<string[]> {\n return findGatewayRuntimeModules(\"runtime-model-auth.runtime-\");\n}\n\n/**\n * Discover gateway runtime module files matching the given filename prefix.\n *\n * Reused by adjacent SecretRef resolution code (`resolve-auth-token.ts`,\n * issue #757). Walks the same dist-dir candidates as the model-auth path\n * so callers don't reimplement install-method discovery.\n */\nexport async function findGatewayRuntimeModules(filePrefix: string): Promise<string[]> {\n const { accessSync, constants, readdirSync, realpathSync, statSync } = await import(\"node:fs\");\n const { createRequire } = await import(\"node:module\");\n const candidates: string[] = [];\n\n const distDirs: string[] = [];\n const pushDistDirs = (entryPath: string): void => {\n const resolvedEntryDir = path.dirname(entryPath);\n const packageRoot = path.basename(resolvedEntryDir) === \"dist\"\n ? path.resolve(resolvedEntryDir, \"..\")\n : resolvedEntryDir;\n const candidateDistDirs = [\n path.join(packageRoot, \"dist\"),\n path.join(packageRoot, \"..\", \"dist\"),\n ];\n for (const candidate of candidateDistDirs) {\n const resolved = path.resolve(candidate);\n if (!distDirs.includes(resolved)) distDirs.push(resolved);\n }\n };\n\n try {\n const req = createRequire(import.meta.url);\n const openclawMain = req.resolve(\"openclaw\");\n pushDistDirs(openclawMain);\n } catch {\n // openclaw not resolvable from plugin context — try alternate paths\n }\n\n try {\n const mainScript = process.argv[1];\n if (mainScript) {\n const realScript = realpathSync(mainScript);\n if (realScript.includes(\"openclaw\")) {\n pushDistDirs(realScript);\n }\n }\n } catch {\n // Silent\n }\n\n try {\n const openclawBin = findExecutableOnPath(\"openclaw\", accessSync, statSync, constants.X_OK);\n if (openclawBin) {\n pushDistDirs(realpathSync(openclawBin));\n }\n } catch {\n // Silent\n }\n\n for (const dir of distDirs) {\n try {\n const files = readdirSync(dir);\n for (const f of files) {\n if (f.startsWith(filePrefix) && f.endsWith(\".js\")) {\n candidates.push(path.join(dir, f));\n }\n }\n } catch {\n // Directory doesn't exist — skip\n }\n }\n\n return candidates;\n}\n\nfunction findExecutableOnPath(\n executableName: string,\n access: (path: string, mode?: number) => void,\n stat: (path: string) => { isFile(): boolean },\n executableMode: number,\n): string | undefined {\n const pathEnv = readEnvVar(\"PATH\");\n if (!pathEnv) return undefined;\n\n const pathExts = process.platform === \"win32\"\n ? (readEnvVar(\"PATHEXT\") ?? \".EXE;.CMD;.BAT;.COM\")\n .split(\";\")\n .filter((ext) => ext.length > 0)\n : [\"\"];\n const hasExtension = path.extname(executableName).length > 0;\n\n for (const dir of pathEnv.split(path.delimiter)) {\n if (!dir) continue;\n const candidateNames = process.platform === \"win32\" && !hasExtension\n ? pathExts.map((ext) => `${executableName}${ext}`)\n : [executableName];\n\n for (const candidateName of candidateNames) {\n const candidate = path.join(dir, candidateName);\n try {\n access(candidate, executableMode);\n if (!stat(candidate).isFile()) continue;\n return candidate;\n } catch {\n // Try the next PATH entry.\n }\n }\n }\n\n return undefined;\n}\n\nexport const __findExecutableOnPathForTest = findExecutableOnPath;\n\nfunction isNonLiteralAuthMarker(value: string): boolean {\n return (\n NON_LITERAL_AUTH_MARKERS.has(value) ||\n value.endsWith(\"-oauth\") ||\n value.endsWith(\"-local\") ||\n value.startsWith(\"gcp-\") ||\n ENV_VAR_MARKER_RE.test(value)\n );\n}\n\nfunction resolveFromNamedEnvVar(marker: string): string | undefined {\n if (!ENV_VAR_MARKER_RE.test(marker)) return undefined;\n const value = readEnvVar(marker);\n return value && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/**\n * Resolve a provider API key from various OpenClaw formats.\n *\n * Resolution order:\n * 1. Plain-text string → returned immediately\n * 2. Gateway's resolveApiKeyForProvider → handles all secret ref formats\n * 3. Environment variable fallback (PROVIDER_NAME_API_KEY)\n * 4. undefined → provider is skipped in the fallback chain\n */\nexport async function resolveProviderApiKey(\n providerId: string,\n apiKeyValue: unknown,\n gatewayConfig?: unknown,\n agentDir?: string,\n): Promise<string | undefined> {\n const resolvedAgentDir = path.resolve(\n agentDir ?? path.join(os.homedir(), \".openclaw\", \"agents\", \"main\", \"agent\"),\n );\n\n // Check cache first\n const cacheKey = `provider:${providerId}:agentDir:${resolvedAgentDir}`;\n if (resolvedCache.has(cacheKey)) {\n return resolvedCache.get(cacheKey);\n }\n\n let resolved: string | undefined;\n\n // Fast path: plain-text string that looks like an actual API key\n if (typeof apiKeyValue === \"string\" && apiKeyValue.trim().length > 0) {\n const trimmedApiKeyValue = apiKeyValue.trim();\n // Skip known non-API-key markers used by the gateway for auth modes,\n // plus env-var-shaped markers such as OPENAI_API_KEY.\n if (isNonLiteralAuthMarker(trimmedApiKeyValue)) {\n const markerEnvValue = resolveFromNamedEnvVar(trimmedApiKeyValue);\n if (markerEnvValue) {\n resolved = markerEnvValue;\n resolvedCache.set(cacheKey, resolved);\n return resolved;\n }\n // Fall through to gateway resolver / env var fallback\n } else {\n resolved = trimmedApiKeyValue;\n resolvedCache.set(cacheKey, resolved);\n return resolved;\n }\n }\n\n // The API key is either a SecretRef object, \"secretref-managed\", or empty.\n // Try the gateway's own auth resolution system first.\n const resolver = await getGatewayResolver();\n if (resolver) {\n try {\n const auth = await resolver({ provider: providerId, cfg: gatewayConfig, agentDir: resolvedAgentDir });\n if (auth?.apiKey) {\n resolved = auth.apiKey;\n log.debug(`resolved API key for provider \"${providerId}\" via gateway auth (source: ${auth.source ?? \"unknown\"}, mode: ${auth.mode ?? \"unknown\"})`);\n resolvedCache.set(cacheKey, resolved);\n return resolved;\n }\n } catch (err) {\n log.debug(\n `gateway auth resolution failed for provider \"${providerId}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Environment variable fallback\n resolved = resolveFromEnv(providerId);\n if (resolved) {\n log.debug(`resolved API key for provider \"${providerId}\" from environment variable`);\n } else {\n log.debug(`could not resolve API key for provider \"${providerId}\" — skipping`);\n }\n\n // Only cache successful resolutions — failures are retried on next call\n // so providers can recover after transient issues (e.g., 1Password agent restart)\n if (resolved) {\n resolvedCache.set(cacheKey, resolved);\n }\n return resolved;\n}\n\n/**\n * Try to resolve an API key from environment variables.\n */\nfunction resolveFromEnv(providerId: string): string | undefined {\n const normalized = providerId.toUpperCase().replace(/[^A-Z0-9]/g, \"_\");\n const candidates = [\n `${normalized}_API_KEY`,\n `${normalized}_TOKEN`,\n ];\n for (const envVar of candidates) {\n const value = readEnvVar(envVar);\n if (value && value.trim().length > 0) {\n return value.trim();\n }\n }\n return undefined;\n}\n\n/**\n * Get the gateway's getRuntimeAuthForModel function, if available.\n * This resolves request-ready auth including provider-owned transforms\n * (OAuth token exchange, base URL override for codex/copilot/etc.).\n * Must be called after at least one resolveProviderApiKey() call to\n * trigger the lazy module load.\n */\nexport async function getGatewayRuntimeAuthForModel(): Promise<GetRuntimeAuthForModelFn | null> {\n // Ensure the runtime module has been loaded\n await getGatewayResolver();\n return _getRuntimeAuthForModel;\n}\n\n/**\n * Clear the resolution cache (useful for testing or key rotation).\n */\nexport function clearSecretCache(): void {\n resolvedCache.clear();\n _resolveApiKeyForProvider = null;\n _getRuntimeAuthForModel = null;\n _resolverLoaded = false;\n _resolverNextRetryAt = 0;\n}\n\nexport function __setGatewayResolverForTest(resolver: ResolveApiKeyFn | null): void {\n _resolveApiKeyForProvider = resolver;\n _resolverLoaded = resolver !== null;\n _resolverNextRetryAt = 0;\n}\n\nexport function __setGatewayRuntimeAuthForModelForTest(\n resolver: GetRuntimeAuthForModelFn | null,\n): void {\n _getRuntimeAuthForModel = resolver;\n _resolverLoaded = resolver !== null || _resolveApiKeyForProvider !== null;\n _resolverNextRetryAt = 0;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,294 @@
1
+ // src/evidence-pack.ts
2
+ var DEFAULT_MAX_ITEM_CHARS = 1200;
3
+ var QUERY_FOCUS_STOPWORDS = /* @__PURE__ */ new Set([
4
+ "about",
5
+ "after",
6
+ "again",
7
+ "also",
8
+ "and",
9
+ "are",
10
+ "between",
11
+ "can",
12
+ "could",
13
+ "did",
14
+ "does",
15
+ "during",
16
+ "for",
17
+ "from",
18
+ "have",
19
+ "how",
20
+ "into",
21
+ "many",
22
+ "should",
23
+ "that",
24
+ "the",
25
+ "this",
26
+ "till",
27
+ "until",
28
+ "want",
29
+ "was",
30
+ "were",
31
+ "what",
32
+ "when",
33
+ "which",
34
+ "with",
35
+ "would",
36
+ "you"
37
+ ]);
38
+ function buildEvidencePack(items, options) {
39
+ const budget = normalizePositiveInteger(options.maxChars);
40
+ if (budget <= 0 || items.length === 0) {
41
+ return "";
42
+ }
43
+ const maxItemChars = normalizePositiveInteger(
44
+ options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS
45
+ );
46
+ if (maxItemChars <= 0) {
47
+ return "";
48
+ }
49
+ const title = options.title ?? "Evidence";
50
+ const lines = [`## ${title}`];
51
+ const seenIds = /* @__PURE__ */ new Set();
52
+ const seenContent = /* @__PURE__ */ new Set();
53
+ let used = lines[0].length;
54
+ for (const item of items) {
55
+ const content = item.content.trim();
56
+ if (!content) continue;
57
+ const id = item.id ?? evidenceItemFallbackId(item);
58
+ if (id && seenIds.has(id)) continue;
59
+ const contentKey = normalizeEvidenceContent(content);
60
+ if (seenContent.has(contentKey)) continue;
61
+ const label = formatEvidenceLabel(item);
62
+ const clipped = clipEvidenceContent(content, maxItemChars, options.query);
63
+ const block = `${label}: ${clipped}`;
64
+ const separatorLength = lines.length > 0 ? 2 : 0;
65
+ const remaining = budget - used - separatorLength;
66
+ if (remaining <= 0) break;
67
+ const finalBlock = block.length > remaining ? clipText(block, remaining) : block;
68
+ if (!finalBlock.trim()) break;
69
+ lines.push(finalBlock);
70
+ used += separatorLength + finalBlock.length;
71
+ if (id) seenIds.add(id);
72
+ seenContent.add(contentKey);
73
+ }
74
+ return lines.length === 1 ? "" : lines.join("\n\n");
75
+ }
76
+ function insertAfterEvidenceHeading(evidence, title, insert) {
77
+ const heading = `## ${title}`;
78
+ if (!evidence.startsWith(heading)) {
79
+ return evidence;
80
+ }
81
+ return `${heading}${insert}${evidence.slice(heading.length)}`;
82
+ }
83
+ function normalizePositiveInteger(value) {
84
+ if (!Number.isFinite(value) || value <= 0) {
85
+ return 0;
86
+ }
87
+ return Math.floor(value);
88
+ }
89
+ function evidenceItemFallbackId(item) {
90
+ if (item.sessionId && typeof item.turnIndex === "number") {
91
+ return `${item.sessionId}:${item.turnIndex}`;
92
+ }
93
+ return void 0;
94
+ }
95
+ function normalizeEvidenceContent(content) {
96
+ return content.toLowerCase().replace(/\s+/g, " ").trim();
97
+ }
98
+ function formatEvidenceLabel(item) {
99
+ const parts = [];
100
+ if (item.sessionId) parts.push(item.sessionId);
101
+ if (typeof item.turnIndex === "number") parts.push(`turn ${item.turnIndex}`);
102
+ if (item.role) parts.push(item.role);
103
+ if (typeof item.score === "number" && Number.isFinite(item.score)) {
104
+ parts.push(`score ${item.score.toFixed(3)}`);
105
+ }
106
+ return parts.length > 0 ? `[${parts.join(", ")}]` : "[evidence]";
107
+ }
108
+ function clipText(text, maxChars) {
109
+ if (text.length <= maxChars) {
110
+ return text;
111
+ }
112
+ if (maxChars <= 1) {
113
+ return text.slice(0, maxChars);
114
+ }
115
+ if (maxChars <= 3) {
116
+ return text.slice(0, maxChars);
117
+ }
118
+ return `${text.slice(0, maxChars - 3).trimEnd()}...`;
119
+ }
120
+ function clipEvidenceContent(content, maxChars, query) {
121
+ if (content.length <= maxChars) {
122
+ return content;
123
+ }
124
+ const focused = buildQueryFocusedExcerpt(content, maxChars, query);
125
+ return focused ?? clipText(content, maxChars);
126
+ }
127
+ function buildQueryFocusedExcerpt(content, maxChars, query) {
128
+ const cues = collectQueryFocusCues(query ?? "");
129
+ if (cues.length === 0) {
130
+ return void 0;
131
+ }
132
+ const lines = content.replaceAll("\r\n", "\n").replaceAll("\r", "\n").split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
133
+ if (lines.length < 2) {
134
+ return void 0;
135
+ }
136
+ const temporalIntent = hasTemporalFocusIntent(query ?? "");
137
+ const scored = lines.map((line, index) => ({
138
+ index,
139
+ score: scoreEvidenceLine(line, cues, temporalIntent, index)
140
+ })).filter((entry) => entry.score > 0).sort((left, right) => right.score - left.score || left.index - right.index);
141
+ if (scored.length === 0) {
142
+ return void 0;
143
+ }
144
+ let selected = /* @__PURE__ */ new Set();
145
+ for (let index = 0; index < Math.min(3, lines.length); index += 1) {
146
+ if (isEvidenceMetadataLine(lines[index])) {
147
+ selected.add(index);
148
+ }
149
+ }
150
+ for (const entry of scored.slice(0, 8)) {
151
+ const candidate = new Set(selected);
152
+ const radius = lineWindowRadius(lines[entry.index], temporalIntent);
153
+ for (let index = Math.max(0, entry.index - radius); index <= Math.min(lines.length - 1, entry.index + radius); index += 1) {
154
+ candidate.add(index);
155
+ }
156
+ if (renderSelectedEvidenceLines(lines, candidate).length <= maxChars) {
157
+ selected = candidate;
158
+ }
159
+ }
160
+ const excerpt = buildExcerptFromLineSelection(lines, selected, maxChars);
161
+ return excerpt.length > 0 ? excerpt : void 0;
162
+ }
163
+ function collectQueryFocusCues(query) {
164
+ const words = (query.toLowerCase().match(/[a-z][a-z0-9-]{2,}/g) ?? []).map(trimBoundaryHyphens).filter(
165
+ (word) => word.length >= 3 && !/^\d+$/.test(word) && !QUERY_FOCUS_STOPWORDS.has(word)
166
+ );
167
+ const cues = /* @__PURE__ */ new Set();
168
+ for (const word of words) {
169
+ cues.add(word);
170
+ }
171
+ for (let index = 0; index < words.length - 1; index += 1) {
172
+ const left = words[index];
173
+ const right = words[index + 1];
174
+ if (left.length >= 4 && right.length >= 4) {
175
+ cues.add(`${left} ${right}`);
176
+ }
177
+ }
178
+ for (let index = 0; index < words.length - 2; index += 1) {
179
+ const left = words[index];
180
+ const middle = words[index + 1];
181
+ const right = words[index + 2];
182
+ if (left.length >= 4 && middle.length >= 4 && right.length >= 4) {
183
+ cues.add(`${left} ${middle} ${right}`);
184
+ }
185
+ }
186
+ return [...cues].sort((left, right) => right.length - left.length || left.localeCompare(right));
187
+ }
188
+ function trimBoundaryHyphens(value) {
189
+ let start = 0;
190
+ let end = value.length;
191
+ while (start < end && value[start] === "-") {
192
+ start += 1;
193
+ }
194
+ while (end > start && value[end - 1] === "-") {
195
+ end -= 1;
196
+ }
197
+ return start === 0 && end === value.length ? value : value.slice(start, end);
198
+ }
199
+ function hasTemporalFocusIntent(query) {
200
+ return /\b(?:after|before|between|date|deadline|during|finish(?:ing|ed)?|how many|timeline|week|weeks|when)\b/i.test(
201
+ query
202
+ );
203
+ }
204
+ function scoreEvidenceLine(line, cues, temporalIntent, index) {
205
+ const normalized = line.toLowerCase();
206
+ let score = 0;
207
+ for (const cue of cues) {
208
+ if (!normalized.includes(cue)) {
209
+ continue;
210
+ }
211
+ score += cue.includes(" ") ? 8 : 3;
212
+ }
213
+ if (temporalIntent && hasDateLikeEvidence(line)) {
214
+ score += 6;
215
+ }
216
+ if (temporalIntent && /\b(?:deadline|deployment|finish(?:ing|ed)?|milestones?|schedule|timeline)\b/i.test(line)) {
217
+ score += 5;
218
+ }
219
+ if (/^\s{0,3}(?:#{1,6}\s*)?(?:milestones?|schedule|timeline)\b/i.test(line)) {
220
+ score += 3;
221
+ }
222
+ if (isEvidenceMetadataLine(line)) {
223
+ score += Math.max(0, 3 - index);
224
+ }
225
+ return score;
226
+ }
227
+ function hasDateLikeEvidence(line) {
228
+ return /\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\.?\s+\d{1,2}\b/i.test(
229
+ line
230
+ ) || /\b\d{4}-\d{2}-\d{2}\b/.test(line);
231
+ }
232
+ function isEvidenceMetadataLine(line) {
233
+ return /\b(?:chat_id|source_chat_id|session_id|plan_id|task_id|ability)=/.test(
234
+ line
235
+ );
236
+ }
237
+ function lineWindowRadius(line, temporalIntent) {
238
+ if (temporalIntent && hasDateLikeEvidence(line)) {
239
+ return 0;
240
+ }
241
+ if (temporalIntent && /^\s{0,3}(?:#{1,6}\s*)?(?:milestones?|schedule|timeline)\b/i.test(line)) {
242
+ return 2;
243
+ }
244
+ return 1;
245
+ }
246
+ function buildExcerptFromLineSelection(lines, selected, maxChars) {
247
+ const ordered = [...selected].sort((left, right) => left - right);
248
+ const output = [];
249
+ let used = 0;
250
+ let lastIndex = -1;
251
+ const append = (text) => {
252
+ const separator = output.length === 0 ? "" : "\n";
253
+ const remaining = maxChars - used - separator.length;
254
+ if (remaining <= 0) {
255
+ return false;
256
+ }
257
+ const value = text.length > remaining ? clipText(text, remaining) : text;
258
+ if (!value.trim()) {
259
+ return false;
260
+ }
261
+ output.push(value);
262
+ used += separator.length + value.length;
263
+ return text.length <= remaining;
264
+ };
265
+ for (const index of ordered) {
266
+ if (lastIndex >= 0 && index > lastIndex + 1 && !append("...")) {
267
+ break;
268
+ }
269
+ if (!append(lines[index])) {
270
+ break;
271
+ }
272
+ lastIndex = index;
273
+ }
274
+ return output.join("\n");
275
+ }
276
+ function renderSelectedEvidenceLines(lines, selected) {
277
+ const ordered = [...selected].sort((left, right) => left - right);
278
+ const output = [];
279
+ let lastIndex = -1;
280
+ for (const index of ordered) {
281
+ if (lastIndex >= 0 && index > lastIndex + 1) {
282
+ output.push("...");
283
+ }
284
+ output.push(lines[index]);
285
+ lastIndex = index;
286
+ }
287
+ return output.join("\n");
288
+ }
289
+
290
+ export {
291
+ buildEvidencePack,
292
+ insertAfterEvidenceHeading
293
+ };
294
+ //# sourceMappingURL=chunk-PYPOFEMK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/evidence-pack.ts"],"sourcesContent":["export interface EvidencePackItem {\n id?: string;\n sessionId?: string;\n turnIndex?: number;\n role?: string;\n content: string;\n score?: number;\n}\n\nexport interface EvidencePackOptions {\n title?: string;\n maxChars: number;\n maxItemChars?: number;\n query?: string;\n}\n\nconst DEFAULT_MAX_ITEM_CHARS = 1_200;\nconst QUERY_FOCUS_STOPWORDS = new Set([\n \"about\",\n \"after\",\n \"again\",\n \"also\",\n \"and\",\n \"are\",\n \"between\",\n \"can\",\n \"could\",\n \"did\",\n \"does\",\n \"during\",\n \"for\",\n \"from\",\n \"have\",\n \"how\",\n \"into\",\n \"many\",\n \"should\",\n \"that\",\n \"the\",\n \"this\",\n \"till\",\n \"until\",\n \"want\",\n \"was\",\n \"were\",\n \"what\",\n \"when\",\n \"which\",\n \"with\",\n \"would\",\n \"you\",\n]);\n\nexport function buildEvidencePack(\n items: readonly EvidencePackItem[],\n options: EvidencePackOptions,\n): string {\n const budget = normalizePositiveInteger(options.maxChars);\n if (budget <= 0 || items.length === 0) {\n return \"\";\n }\n\n const maxItemChars = normalizePositiveInteger(\n options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS,\n );\n if (maxItemChars <= 0) {\n return \"\";\n }\n\n const title = options.title ?? \"Evidence\";\n const lines: string[] = [`## ${title}`];\n const seenIds = new Set<string>();\n const seenContent = new Set<string>();\n let used = lines[0]!.length;\n\n for (const item of items) {\n const content = item.content.trim();\n if (!content) continue;\n\n const id = item.id ?? evidenceItemFallbackId(item);\n if (id && seenIds.has(id)) continue;\n\n const contentKey = normalizeEvidenceContent(content);\n if (seenContent.has(contentKey)) continue;\n\n const label = formatEvidenceLabel(item);\n const clipped = clipEvidenceContent(content, maxItemChars, options.query);\n const block = `${label}: ${clipped}`;\n const separatorLength = lines.length > 0 ? 2 : 0;\n const remaining = budget - used - separatorLength;\n if (remaining <= 0) break;\n\n const finalBlock =\n block.length > remaining ? clipText(block, remaining) : block;\n if (!finalBlock.trim()) break;\n\n lines.push(finalBlock);\n used += separatorLength + finalBlock.length;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n }\n\n return lines.length === 1 ? \"\" : lines.join(\"\\n\\n\");\n}\n\nexport function insertAfterEvidenceHeading(\n evidence: string,\n title: string,\n insert: string,\n): string {\n const heading = `## ${title}`;\n if (!evidence.startsWith(heading)) {\n return evidence;\n }\n return `${heading}${insert}${evidence.slice(heading.length)}`;\n}\n\nfunction normalizePositiveInteger(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n}\n\nfunction evidenceItemFallbackId(item: EvidencePackItem): string | undefined {\n if (item.sessionId && typeof item.turnIndex === \"number\") {\n return `${item.sessionId}:${item.turnIndex}`;\n }\n return undefined;\n}\n\nfunction normalizeEvidenceContent(content: string): string {\n return content.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatEvidenceLabel(item: EvidencePackItem): string {\n const parts: string[] = [];\n if (item.sessionId) parts.push(item.sessionId);\n if (typeof item.turnIndex === \"number\") parts.push(`turn ${item.turnIndex}`);\n if (item.role) parts.push(item.role);\n if (typeof item.score === \"number\" && Number.isFinite(item.score)) {\n parts.push(`score ${item.score.toFixed(3)}`);\n }\n return parts.length > 0 ? `[${parts.join(\", \")}]` : \"[evidence]\";\n}\n\nfunction clipText(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n if (maxChars <= 1) {\n return text.slice(0, maxChars);\n }\n if (maxChars <= 3) {\n return text.slice(0, maxChars);\n }\n return `${text.slice(0, maxChars - 3).trimEnd()}...`;\n}\n\nfunction clipEvidenceContent(\n content: string,\n maxChars: number,\n query?: string,\n): string {\n if (content.length <= maxChars) {\n return content;\n }\n\n const focused = buildQueryFocusedExcerpt(content, maxChars, query);\n return focused ?? clipText(content, maxChars);\n}\n\nfunction buildQueryFocusedExcerpt(\n content: string,\n maxChars: number,\n query?: string,\n): string | undefined {\n const cues = collectQueryFocusCues(query ?? \"\");\n if (cues.length === 0) {\n return undefined;\n }\n\n const lines = content\n .replaceAll(\"\\r\\n\", \"\\n\")\n .replaceAll(\"\\r\", \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length < 2) {\n return undefined;\n }\n\n const temporalIntent = hasTemporalFocusIntent(query ?? \"\");\n const scored = lines\n .map((line, index) => ({\n index,\n score: scoreEvidenceLine(line, cues, temporalIntent, index),\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score || left.index - right.index);\n\n if (scored.length === 0) {\n return undefined;\n }\n\n let selected = new Set<number>();\n for (let index = 0; index < Math.min(3, lines.length); index += 1) {\n if (isEvidenceMetadataLine(lines[index]!)) {\n selected.add(index);\n }\n }\n\n for (const entry of scored.slice(0, 8)) {\n const candidate = new Set(selected);\n const radius = lineWindowRadius(lines[entry.index]!, temporalIntent);\n for (\n let index = Math.max(0, entry.index - radius);\n index <= Math.min(lines.length - 1, entry.index + radius);\n index += 1\n ) {\n candidate.add(index);\n }\n if (renderSelectedEvidenceLines(lines, candidate).length <= maxChars) {\n selected = candidate;\n }\n }\n\n const excerpt = buildExcerptFromLineSelection(lines, selected, maxChars);\n return excerpt.length > 0 ? excerpt : undefined;\n}\n\nfunction collectQueryFocusCues(query: string): string[] {\n const words = (query.toLowerCase().match(/[a-z][a-z0-9-]{2,}/g) ?? [])\n .map(trimBoundaryHyphens)\n .filter(\n (word) =>\n word.length >= 3 &&\n !/^\\d+$/.test(word) &&\n !QUERY_FOCUS_STOPWORDS.has(word),\n );\n const cues = new Set<string>();\n for (const word of words) {\n cues.add(word);\n }\n for (let index = 0; index < words.length - 1; index += 1) {\n const left = words[index]!;\n const right = words[index + 1]!;\n if (left.length >= 4 && right.length >= 4) {\n cues.add(`${left} ${right}`);\n }\n }\n for (let index = 0; index < words.length - 2; index += 1) {\n const left = words[index]!;\n const middle = words[index + 1]!;\n const right = words[index + 2]!;\n if (left.length >= 4 && middle.length >= 4 && right.length >= 4) {\n cues.add(`${left} ${middle} ${right}`);\n }\n }\n return [...cues].sort((left, right) => right.length - left.length || left.localeCompare(right));\n}\n\nfunction trimBoundaryHyphens(value: string): string {\n let start = 0;\n let end = value.length;\n while (start < end && value[start] === \"-\") {\n start += 1;\n }\n while (end > start && value[end - 1] === \"-\") {\n end -= 1;\n }\n return start === 0 && end === value.length ? value : value.slice(start, end);\n}\n\nfunction hasTemporalFocusIntent(query: string): boolean {\n return /\\b(?:after|before|between|date|deadline|during|finish(?:ing|ed)?|how many|timeline|week|weeks|when)\\b/i.test(\n query,\n );\n}\n\nfunction scoreEvidenceLine(\n line: string,\n cues: readonly string[],\n temporalIntent: boolean,\n index: number,\n): number {\n const normalized = line.toLowerCase();\n let score = 0;\n for (const cue of cues) {\n if (!normalized.includes(cue)) {\n continue;\n }\n score += cue.includes(\" \") ? 8 : 3;\n }\n if (temporalIntent && hasDateLikeEvidence(line)) {\n score += 6;\n }\n if (\n temporalIntent &&\n /\\b(?:deadline|deployment|finish(?:ing|ed)?|milestones?|schedule|timeline)\\b/i.test(line)\n ) {\n score += 5;\n }\n if (/^\\s{0,3}(?:#{1,6}\\s*)?(?:milestones?|schedule|timeline)\\b/i.test(line)) {\n score += 3;\n }\n if (isEvidenceMetadataLine(line)) {\n score += Math.max(0, 3 - index);\n }\n return score;\n}\n\nfunction hasDateLikeEvidence(line: string): boolean {\n return /\\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\.?\\s+\\d{1,2}\\b/i.test(\n line,\n ) || /\\b\\d{4}-\\d{2}-\\d{2}\\b/.test(line);\n}\n\nfunction isEvidenceMetadataLine(line: string): boolean {\n return /\\b(?:chat_id|source_chat_id|session_id|plan_id|task_id|ability)=/.test(\n line,\n );\n}\n\nfunction lineWindowRadius(line: string, temporalIntent: boolean): number {\n if (temporalIntent && hasDateLikeEvidence(line)) {\n return 0;\n }\n if (temporalIntent && /^\\s{0,3}(?:#{1,6}\\s*)?(?:milestones?|schedule|timeline)\\b/i.test(line)) {\n return 2;\n }\n return 1;\n}\n\nfunction buildExcerptFromLineSelection(\n lines: readonly string[],\n selected: ReadonlySet<number>,\n maxChars: number,\n): string {\n const ordered = [...selected].sort((left, right) => left - right);\n const output: string[] = [];\n let used = 0;\n let lastIndex = -1;\n\n const append = (text: string): boolean => {\n const separator = output.length === 0 ? \"\" : \"\\n\";\n const remaining = maxChars - used - separator.length;\n if (remaining <= 0) {\n return false;\n }\n const value = text.length > remaining ? clipText(text, remaining) : text;\n if (!value.trim()) {\n return false;\n }\n output.push(value);\n used += separator.length + value.length;\n return text.length <= remaining;\n };\n\n for (const index of ordered) {\n if (lastIndex >= 0 && index > lastIndex + 1 && !append(\"...\")) {\n break;\n }\n if (!append(lines[index]!)) {\n break;\n }\n lastIndex = index;\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderSelectedEvidenceLines(\n lines: readonly string[],\n selected: ReadonlySet<number>,\n): string {\n const ordered = [...selected].sort((left, right) => left - right);\n const output: string[] = [];\n let lastIndex = -1;\n for (const index of ordered) {\n if (lastIndex >= 0 && index > lastIndex + 1) {\n output.push(\"...\");\n }\n output.push(lines[index]!);\n lastIndex = index;\n }\n return output.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}