opencode-rehydar 0.14.1 → 0.14.3

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 (430) hide show
  1. package/dist/browser.d.ts +54 -0
  2. package/dist/browser.d.ts.map +1 -0
  3. package/dist/browser.js +74 -0
  4. package/dist/browser.js.map +1 -0
  5. package/dist/core/anonymizer.d.ts +309 -0
  6. package/dist/core/anonymizer.d.ts.map +1 -0
  7. package/dist/core/anonymizer.js +555 -0
  8. package/dist/core/anonymizer.js.map +1 -0
  9. package/dist/core/index.d.ts +6 -0
  10. package/dist/core/index.d.ts.map +1 -0
  11. package/dist/core/index.js +6 -0
  12. package/dist/core/index.js.map +1 -0
  13. package/dist/crypto/index.d.ts +6 -0
  14. package/dist/crypto/index.d.ts.map +1 -0
  15. package/dist/crypto/index.js +6 -0
  16. package/dist/crypto/index.js.map +1 -0
  17. package/dist/crypto/pii-map-crypto.d.ts +114 -0
  18. package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
  19. package/dist/crypto/pii-map-crypto.js +228 -0
  20. package/dist/crypto/pii-map-crypto.js.map +1 -0
  21. package/dist/index.d.ts +53 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +72 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/ner/bio-decoder.d.ts +64 -0
  26. package/dist/ner/bio-decoder.d.ts.map +1 -0
  27. package/dist/ner/bio-decoder.js +218 -0
  28. package/dist/ner/bio-decoder.js.map +1 -0
  29. package/dist/ner/index.d.ts +12 -0
  30. package/dist/ner/index.d.ts.map +1 -0
  31. package/dist/ner/index.js +12 -0
  32. package/dist/ner/index.js.map +1 -0
  33. package/dist/ner/inference-server-client.d.ts +81 -0
  34. package/dist/ner/inference-server-client.d.ts.map +1 -0
  35. package/dist/ner/inference-server-client.js +120 -0
  36. package/dist/ner/inference-server-client.js.map +1 -0
  37. package/dist/ner/inference-server-ner-model.d.ts +43 -0
  38. package/dist/ner/inference-server-ner-model.d.ts.map +1 -0
  39. package/dist/ner/inference-server-ner-model.js +119 -0
  40. package/dist/ner/inference-server-ner-model.js.map +1 -0
  41. package/dist/ner/model-manager.d.ts +111 -0
  42. package/dist/ner/model-manager.d.ts.map +1 -0
  43. package/dist/ner/model-manager.js +334 -0
  44. package/dist/ner/model-manager.js.map +1 -0
  45. package/dist/ner/ner-model.d.ts +172 -0
  46. package/dist/ner/ner-model.d.ts.map +1 -0
  47. package/dist/ner/ner-model.js +514 -0
  48. package/dist/ner/ner-model.js.map +1 -0
  49. package/dist/ner/onnx-runtime.browser.d.ts +46 -0
  50. package/dist/ner/onnx-runtime.browser.d.ts.map +1 -0
  51. package/dist/ner/onnx-runtime.browser.js +90 -0
  52. package/dist/ner/onnx-runtime.browser.js.map +1 -0
  53. package/dist/ner/onnx-runtime.d.ts +72 -0
  54. package/dist/ner/onnx-runtime.d.ts.map +1 -0
  55. package/dist/ner/onnx-runtime.js +132 -0
  56. package/dist/ner/onnx-runtime.js.map +1 -0
  57. package/dist/ner/token-window.d.ts +19 -0
  58. package/dist/ner/token-window.d.ts.map +1 -0
  59. package/dist/ner/token-window.js +101 -0
  60. package/dist/ner/token-window.js.map +1 -0
  61. package/dist/ner/tokenizer.d.ts +142 -0
  62. package/dist/ner/tokenizer.d.ts.map +1 -0
  63. package/dist/ner/tokenizer.js +362 -0
  64. package/dist/ner/tokenizer.js.map +1 -0
  65. package/dist/opencode-plugin/git-identity.d.ts +3 -0
  66. package/dist/opencode-plugin/git-identity.d.ts.map +1 -0
  67. package/dist/opencode-plugin/git-identity.js +37 -0
  68. package/dist/opencode-plugin/git-identity.js.map +1 -0
  69. package/dist/opencode-plugin/github-username.d.ts +3 -0
  70. package/dist/opencode-plugin/github-username.d.ts.map +1 -0
  71. package/dist/opencode-plugin/github-username.js +41 -0
  72. package/dist/opencode-plugin/github-username.js.map +1 -0
  73. package/dist/opencode-plugin/identity-recognizer.d.ts +5 -0
  74. package/dist/opencode-plugin/identity-recognizer.d.ts.map +1 -0
  75. package/dist/opencode-plugin/identity-recognizer.js +21 -0
  76. package/dist/opencode-plugin/identity-recognizer.js.map +1 -0
  77. package/dist/opencode-plugin/index.d.ts +7 -0
  78. package/dist/opencode-plugin/index.d.ts.map +1 -0
  79. package/dist/opencode-plugin/index.js +6 -0
  80. package/dist/opencode-plugin/index.js.map +1 -0
  81. package/dist/opencode-plugin/plugin.d.ts +39 -0
  82. package/dist/opencode-plugin/plugin.d.ts.map +1 -0
  83. package/dist/opencode-plugin/plugin.js +294 -0
  84. package/dist/opencode-plugin/plugin.js.map +1 -0
  85. package/dist/opencode-plugin/types.d.ts +33 -0
  86. package/dist/opencode-plugin/types.d.ts.map +1 -0
  87. package/dist/opencode-plugin/types.js +5 -0
  88. package/dist/opencode-plugin/types.js.map +1 -0
  89. package/dist/opencode-plugin/v2/anon-state.d.ts +12 -0
  90. package/dist/opencode-plugin/v2/anon-state.d.ts.map +1 -0
  91. package/dist/opencode-plugin/v2/anon-state.js +14 -0
  92. package/dist/opencode-plugin/v2/anon-state.js.map +1 -0
  93. package/dist/opencode-plugin/v2/deep-rehydrate.d.ts +13 -0
  94. package/dist/opencode-plugin/v2/deep-rehydrate.d.ts.map +1 -0
  95. package/dist/opencode-plugin/v2/deep-rehydrate.js +33 -0
  96. package/dist/opencode-plugin/v2/deep-rehydrate.js.map +1 -0
  97. package/dist/opencode-plugin/v2/index.d.ts +17 -0
  98. package/dist/opencode-plugin/v2/index.d.ts.map +1 -0
  99. package/dist/opencode-plugin/v2/index.js +17 -0
  100. package/dist/opencode-plugin/v2/index.js.map +1 -0
  101. package/dist/opencode-plugin/v2/logger.d.ts +24 -0
  102. package/dist/opencode-plugin/v2/logger.d.ts.map +1 -0
  103. package/dist/opencode-plugin/v2/logger.js +73 -0
  104. package/dist/opencode-plugin/v2/logger.js.map +1 -0
  105. package/dist/opencode-plugin/v2/options.d.ts +63 -0
  106. package/dist/opencode-plugin/v2/options.d.ts.map +1 -0
  107. package/dist/opencode-plugin/v2/options.js +183 -0
  108. package/dist/opencode-plugin/v2/options.js.map +1 -0
  109. package/dist/opencode-plugin/v2/register-hooks.d.ts +43 -0
  110. package/dist/opencode-plugin/v2/register-hooks.d.ts.map +1 -0
  111. package/dist/opencode-plugin/v2/register-hooks.js +160 -0
  112. package/dist/opencode-plugin/v2/register-hooks.js.map +1 -0
  113. package/dist/opencode-plugin/v2/rehydrate-tail.d.ts +101 -0
  114. package/dist/opencode-plugin/v2/rehydrate-tail.d.ts.map +1 -0
  115. package/dist/opencode-plugin/v2/rehydrate-tail.js +147 -0
  116. package/dist/opencode-plugin/v2/rehydrate-tail.js.map +1 -0
  117. package/dist/opencode-plugin/v2/response-rehydrate.d.ts +78 -0
  118. package/dist/opencode-plugin/v2/response-rehydrate.d.ts.map +1 -0
  119. package/dist/opencode-plugin/v2/response-rehydrate.js +210 -0
  120. package/dist/opencode-plugin/v2/response-rehydrate.js.map +1 -0
  121. package/dist/opencode-plugin/v2/scrub-messages.d.ts +39 -0
  122. package/dist/opencode-plugin/v2/scrub-messages.d.ts.map +1 -0
  123. package/dist/opencode-plugin/v2/scrub-messages.js +260 -0
  124. package/dist/opencode-plugin/v2/scrub-messages.js.map +1 -0
  125. package/dist/opencode-plugin/v2/sessions.d.ts +17 -0
  126. package/dist/opencode-plugin/v2/sessions.d.ts.map +1 -0
  127. package/dist/opencode-plugin/v2/sessions.js +23 -0
  128. package/dist/opencode-plugin/v2/sessions.js.map +1 -0
  129. package/dist/opencode-plugin/v2/sse.d.ts +101 -0
  130. package/dist/opencode-plugin/v2/sse.d.ts.map +1 -0
  131. package/dist/opencode-plugin/v2/sse.js +235 -0
  132. package/dist/opencode-plugin/v2/sse.js.map +1 -0
  133. package/dist/opencode-plugin/v2/types.d.ts +188 -0
  134. package/dist/opencode-plugin/v2/types.d.ts.map +1 -0
  135. package/dist/opencode-plugin/v2/types.js +10 -0
  136. package/dist/opencode-plugin/v2/types.js.map +1 -0
  137. package/dist/opencode-plugin/vcs-command.d.ts +3 -0
  138. package/dist/opencode-plugin/vcs-command.d.ts.map +1 -0
  139. package/dist/opencode-plugin/vcs-command.js +34 -0
  140. package/dist/opencode-plugin/vcs-command.js.map +1 -0
  141. package/dist/pipeline/index.d.ts +12 -0
  142. package/dist/pipeline/index.d.ts.map +1 -0
  143. package/dist/pipeline/index.js +12 -0
  144. package/dist/pipeline/index.js.map +1 -0
  145. package/dist/pipeline/prenormalize.d.ts +48 -0
  146. package/dist/pipeline/prenormalize.d.ts.map +1 -0
  147. package/dist/pipeline/prenormalize.js +94 -0
  148. package/dist/pipeline/prenormalize.js.map +1 -0
  149. package/dist/pipeline/resolver.d.ts +56 -0
  150. package/dist/pipeline/resolver.d.ts.map +1 -0
  151. package/dist/pipeline/resolver.js +239 -0
  152. package/dist/pipeline/resolver.js.map +1 -0
  153. package/dist/pipeline/semantic-data-loader.d.ts +171 -0
  154. package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
  155. package/dist/pipeline/semantic-data-loader.js +677 -0
  156. package/dist/pipeline/semantic-data-loader.js.map +1 -0
  157. package/dist/pipeline/semantic-enricher.d.ts +112 -0
  158. package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
  159. package/dist/pipeline/semantic-enricher.js +322 -0
  160. package/dist/pipeline/semantic-enricher.js.map +1 -0
  161. package/dist/pipeline/tagger.d.ts +121 -0
  162. package/dist/pipeline/tagger.d.ts.map +1 -0
  163. package/dist/pipeline/tagger.js +545 -0
  164. package/dist/pipeline/tagger.js.map +1 -0
  165. package/dist/pipeline/title-extractor.d.ts +79 -0
  166. package/dist/pipeline/title-extractor.d.ts.map +1 -0
  167. package/dist/pipeline/title-extractor.js +801 -0
  168. package/dist/pipeline/title-extractor.js.map +1 -0
  169. package/dist/pipeline/validator.d.ts +65 -0
  170. package/dist/pipeline/validator.d.ts.map +1 -0
  171. package/dist/pipeline/validator.js +292 -0
  172. package/dist/pipeline/validator.js.map +1 -0
  173. package/dist/proxy/index.d.ts +13 -0
  174. package/dist/proxy/index.d.ts.map +1 -0
  175. package/dist/proxy/index.js +12 -0
  176. package/dist/proxy/index.js.map +1 -0
  177. package/dist/proxy/providers/anthropic.d.ts +28 -0
  178. package/dist/proxy/providers/anthropic.d.ts.map +1 -0
  179. package/dist/proxy/providers/anthropic.js +265 -0
  180. package/dist/proxy/providers/anthropic.js.map +1 -0
  181. package/dist/proxy/providers/index.d.ts +19 -0
  182. package/dist/proxy/providers/index.d.ts.map +1 -0
  183. package/dist/proxy/providers/index.js +41 -0
  184. package/dist/proxy/providers/index.js.map +1 -0
  185. package/dist/proxy/providers/openai.d.ts +27 -0
  186. package/dist/proxy/providers/openai.d.ts.map +1 -0
  187. package/dist/proxy/providers/openai.js +203 -0
  188. package/dist/proxy/providers/openai.js.map +1 -0
  189. package/dist/proxy/providers/streaming-tool-loop.d.ts +12 -0
  190. package/dist/proxy/providers/streaming-tool-loop.d.ts.map +1 -0
  191. package/dist/proxy/providers/streaming-tool-loop.js +223 -0
  192. package/dist/proxy/providers/streaming-tool-loop.js.map +1 -0
  193. package/dist/proxy/providers/types.d.ts +109 -0
  194. package/dist/proxy/providers/types.d.ts.map +1 -0
  195. package/dist/proxy/providers/types.js +2 -0
  196. package/dist/proxy/providers/types.js.map +1 -0
  197. package/dist/proxy/proxy-server.d.ts +61 -0
  198. package/dist/proxy/proxy-server.d.ts.map +1 -0
  199. package/dist/proxy/proxy-server.js +146 -0
  200. package/dist/proxy/proxy-server.js.map +1 -0
  201. package/dist/proxy/rehydra-fetch.d.ts +35 -0
  202. package/dist/proxy/rehydra-fetch.d.ts.map +1 -0
  203. package/dist/proxy/rehydra-fetch.js +631 -0
  204. package/dist/proxy/rehydra-fetch.js.map +1 -0
  205. package/dist/proxy/rehydra-proxy.d.ts +40 -0
  206. package/dist/proxy/rehydra-proxy.d.ts.map +1 -0
  207. package/dist/proxy/rehydra-proxy.js +150 -0
  208. package/dist/proxy/rehydra-proxy.js.map +1 -0
  209. package/dist/proxy/sse-parser.d.ts +59 -0
  210. package/dist/proxy/sse-parser.d.ts.map +1 -0
  211. package/dist/proxy/sse-parser.js +112 -0
  212. package/dist/proxy/sse-parser.js.map +1 -0
  213. package/dist/proxy/system-instruction.d.ts +19 -0
  214. package/dist/proxy/system-instruction.d.ts.map +1 -0
  215. package/dist/proxy/system-instruction.js +33 -0
  216. package/dist/proxy/system-instruction.js.map +1 -0
  217. package/dist/proxy/tool-loop-stream.d.ts +7 -0
  218. package/dist/proxy/tool-loop-stream.d.ts.map +1 -0
  219. package/dist/proxy/tool-loop-stream.js +65 -0
  220. package/dist/proxy/tool-loop-stream.js.map +1 -0
  221. package/dist/proxy/types.d.ts +138 -0
  222. package/dist/proxy/types.d.ts.map +1 -0
  223. package/dist/proxy/types.js +5 -0
  224. package/dist/proxy/types.js.map +1 -0
  225. package/dist/proxy/wrap-client.d.ts +47 -0
  226. package/dist/proxy/wrap-client.d.ts.map +1 -0
  227. package/dist/proxy/wrap-client.js +70 -0
  228. package/dist/proxy/wrap-client.js.map +1 -0
  229. package/dist/recognizers/address.d.ts +2 -0
  230. package/dist/recognizers/address.d.ts.map +1 -0
  231. package/dist/recognizers/address.js +23 -0
  232. package/dist/recognizers/address.js.map +1 -0
  233. package/dist/recognizers/base.d.ts +78 -0
  234. package/dist/recognizers/base.d.ts.map +1 -0
  235. package/dist/recognizers/base.js +100 -0
  236. package/dist/recognizers/base.js.map +1 -0
  237. package/dist/recognizers/bic-swift.d.ts +10 -0
  238. package/dist/recognizers/bic-swift.d.ts.map +1 -0
  239. package/dist/recognizers/bic-swift.js +107 -0
  240. package/dist/recognizers/bic-swift.js.map +1 -0
  241. package/dist/recognizers/credit-card.d.ts +32 -0
  242. package/dist/recognizers/credit-card.d.ts.map +1 -0
  243. package/dist/recognizers/credit-card.js +160 -0
  244. package/dist/recognizers/credit-card.js.map +1 -0
  245. package/dist/recognizers/custom-id.d.ts +28 -0
  246. package/dist/recognizers/custom-id.d.ts.map +1 -0
  247. package/dist/recognizers/custom-id.js +116 -0
  248. package/dist/recognizers/custom-id.js.map +1 -0
  249. package/dist/recognizers/date.d.ts +10 -0
  250. package/dist/recognizers/date.d.ts.map +1 -0
  251. package/dist/recognizers/date.js +228 -0
  252. package/dist/recognizers/date.js.map +1 -0
  253. package/dist/recognizers/email.d.ts +10 -0
  254. package/dist/recognizers/email.d.ts.map +1 -0
  255. package/dist/recognizers/email.js +75 -0
  256. package/dist/recognizers/email.js.map +1 -0
  257. package/dist/recognizers/iban.d.ts +14 -0
  258. package/dist/recognizers/iban.d.ts.map +1 -0
  259. package/dist/recognizers/iban.js +67 -0
  260. package/dist/recognizers/iban.js.map +1 -0
  261. package/dist/recognizers/index.d.ts +25 -0
  262. package/dist/recognizers/index.d.ts.map +1 -0
  263. package/dist/recognizers/index.js +53 -0
  264. package/dist/recognizers/index.js.map +1 -0
  265. package/dist/recognizers/ip-address.d.ts +14 -0
  266. package/dist/recognizers/ip-address.d.ts.map +1 -0
  267. package/dist/recognizers/ip-address.js +183 -0
  268. package/dist/recognizers/ip-address.js.map +1 -0
  269. package/dist/recognizers/phone.d.ts +10 -0
  270. package/dist/recognizers/phone.d.ts.map +1 -0
  271. package/dist/recognizers/phone.js +145 -0
  272. package/dist/recognizers/phone.js.map +1 -0
  273. package/dist/recognizers/postal-code.d.ts +16 -0
  274. package/dist/recognizers/postal-code.d.ts.map +1 -0
  275. package/dist/recognizers/postal-code.js +42 -0
  276. package/dist/recognizers/postal-code.js.map +1 -0
  277. package/dist/recognizers/registry.d.ts +59 -0
  278. package/dist/recognizers/registry.d.ts.map +1 -0
  279. package/dist/recognizers/registry.js +113 -0
  280. package/dist/recognizers/registry.js.map +1 -0
  281. package/dist/recognizers/secrets/api-key.d.ts +6 -0
  282. package/dist/recognizers/secrets/api-key.d.ts.map +1 -0
  283. package/dist/recognizers/secrets/api-key.js +40 -0
  284. package/dist/recognizers/secrets/api-key.js.map +1 -0
  285. package/dist/recognizers/secrets/aws-credentials.d.ts +7 -0
  286. package/dist/recognizers/secrets/aws-credentials.d.ts.map +1 -0
  287. package/dist/recognizers/secrets/aws-credentials.js +68 -0
  288. package/dist/recognizers/secrets/aws-credentials.js.map +1 -0
  289. package/dist/recognizers/secrets/config-secret.d.ts +8 -0
  290. package/dist/recognizers/secrets/config-secret.d.ts.map +1 -0
  291. package/dist/recognizers/secrets/config-secret.js +59 -0
  292. package/dist/recognizers/secrets/config-secret.js.map +1 -0
  293. package/dist/recognizers/secrets/connection-string.d.ts +6 -0
  294. package/dist/recognizers/secrets/connection-string.d.ts.map +1 -0
  295. package/dist/recognizers/secrets/connection-string.js +40 -0
  296. package/dist/recognizers/secrets/connection-string.js.map +1 -0
  297. package/dist/recognizers/secrets/env-var.d.ts +8 -0
  298. package/dist/recognizers/secrets/env-var.d.ts.map +1 -0
  299. package/dist/recognizers/secrets/env-var.js +54 -0
  300. package/dist/recognizers/secrets/env-var.js.map +1 -0
  301. package/dist/recognizers/secrets/index.d.ts +22 -0
  302. package/dist/recognizers/secrets/index.d.ts.map +1 -0
  303. package/dist/recognizers/secrets/index.js +41 -0
  304. package/dist/recognizers/secrets/index.js.map +1 -0
  305. package/dist/recognizers/secrets/jwt.d.ts +6 -0
  306. package/dist/recognizers/secrets/jwt.d.ts.map +1 -0
  307. package/dist/recognizers/secrets/jwt.js +47 -0
  308. package/dist/recognizers/secrets/jwt.js.map +1 -0
  309. package/dist/recognizers/secrets/key-patterns.d.ts +10 -0
  310. package/dist/recognizers/secrets/key-patterns.d.ts.map +1 -0
  311. package/dist/recognizers/secrets/key-patterns.js +15 -0
  312. package/dist/recognizers/secrets/key-patterns.js.map +1 -0
  313. package/dist/recognizers/secrets/literal-value.d.ts +10 -0
  314. package/dist/recognizers/secrets/literal-value.d.ts.map +1 -0
  315. package/dist/recognizers/secrets/literal-value.js +48 -0
  316. package/dist/recognizers/secrets/literal-value.js.map +1 -0
  317. package/dist/recognizers/secrets/private-key.d.ts +6 -0
  318. package/dist/recognizers/secrets/private-key.d.ts.map +1 -0
  319. package/dist/recognizers/secrets/private-key.js +16 -0
  320. package/dist/recognizers/secrets/private-key.js.map +1 -0
  321. package/dist/recognizers/url.d.ts +14 -0
  322. package/dist/recognizers/url.d.ts.map +1 -0
  323. package/dist/recognizers/url.js +121 -0
  324. package/dist/recognizers/url.js.map +1 -0
  325. package/dist/storage/browser.d.ts +13 -0
  326. package/dist/storage/browser.d.ts.map +1 -0
  327. package/dist/storage/browser.js +13 -0
  328. package/dist/storage/browser.js.map +1 -0
  329. package/dist/storage/in-memory.d.ts +60 -0
  330. package/dist/storage/in-memory.d.ts.map +1 -0
  331. package/dist/storage/in-memory.js +108 -0
  332. package/dist/storage/in-memory.js.map +1 -0
  333. package/dist/storage/index.d.ts +11 -0
  334. package/dist/storage/index.d.ts.map +1 -0
  335. package/dist/storage/index.js +11 -0
  336. package/dist/storage/index.js.map +1 -0
  337. package/dist/storage/indexeddb.d.ts +69 -0
  338. package/dist/storage/indexeddb.d.ts.map +1 -0
  339. package/dist/storage/indexeddb.js +274 -0
  340. package/dist/storage/indexeddb.js.map +1 -0
  341. package/dist/storage/session-base.d.ts +34 -0
  342. package/dist/storage/session-base.d.ts.map +1 -0
  343. package/dist/storage/session-base.js +122 -0
  344. package/dist/storage/session-base.js.map +1 -0
  345. package/dist/storage/session.d.ts +19 -0
  346. package/dist/storage/session.d.ts.map +1 -0
  347. package/dist/storage/session.js +31 -0
  348. package/dist/storage/session.js.map +1 -0
  349. package/dist/storage/sqlite.d.ts +80 -0
  350. package/dist/storage/sqlite.d.ts.map +1 -0
  351. package/dist/storage/sqlite.js +255 -0
  352. package/dist/storage/sqlite.js.map +1 -0
  353. package/dist/storage/types.d.ts +208 -0
  354. package/dist/storage/types.d.ts.map +1 -0
  355. package/dist/storage/types.js +6 -0
  356. package/dist/storage/types.js.map +1 -0
  357. package/dist/streaming/anonymizer-stream.d.ts +63 -0
  358. package/dist/streaming/anonymizer-stream.d.ts.map +1 -0
  359. package/dist/streaming/anonymizer-stream.js +184 -0
  360. package/dist/streaming/anonymizer-stream.js.map +1 -0
  361. package/dist/streaming/index.d.ts +9 -0
  362. package/dist/streaming/index.d.ts.map +1 -0
  363. package/dist/streaming/index.js +8 -0
  364. package/dist/streaming/index.js.map +1 -0
  365. package/dist/streaming/sentence-buffer.d.ts +78 -0
  366. package/dist/streaming/sentence-buffer.d.ts.map +1 -0
  367. package/dist/streaming/sentence-buffer.js +239 -0
  368. package/dist/streaming/sentence-buffer.js.map +1 -0
  369. package/dist/streaming/stream-factory.d.ts +38 -0
  370. package/dist/streaming/stream-factory.d.ts.map +1 -0
  371. package/dist/streaming/stream-factory.js +69 -0
  372. package/dist/streaming/stream-factory.js.map +1 -0
  373. package/dist/streaming/types.d.ts +121 -0
  374. package/dist/streaming/types.d.ts.map +1 -0
  375. package/dist/streaming/types.js +5 -0
  376. package/dist/streaming/types.js.map +1 -0
  377. package/dist/types/index.d.ts +269 -0
  378. package/dist/types/index.d.ts.map +1 -0
  379. package/dist/types/index.js +95 -0
  380. package/dist/types/index.js.map +1 -0
  381. package/dist/types/pii-types.d.ts +64 -0
  382. package/dist/types/pii-types.d.ts.map +1 -0
  383. package/dist/types/pii-types.js +153 -0
  384. package/dist/types/pii-types.js.map +1 -0
  385. package/dist/utils/iban-checksum.d.ts +23 -0
  386. package/dist/utils/iban-checksum.d.ts.map +1 -0
  387. package/dist/utils/iban-checksum.js +106 -0
  388. package/dist/utils/iban-checksum.js.map +1 -0
  389. package/dist/utils/index.d.ts +11 -0
  390. package/dist/utils/index.d.ts.map +1 -0
  391. package/dist/utils/index.js +11 -0
  392. package/dist/utils/index.js.map +1 -0
  393. package/dist/utils/json-walk.d.ts +21 -0
  394. package/dist/utils/json-walk.d.ts.map +1 -0
  395. package/dist/utils/json-walk.js +44 -0
  396. package/dist/utils/json-walk.js.map +1 -0
  397. package/dist/utils/luhn.d.ts +17 -0
  398. package/dist/utils/luhn.d.ts.map +1 -0
  399. package/dist/utils/luhn.js +55 -0
  400. package/dist/utils/luhn.js.map +1 -0
  401. package/dist/utils/offsets.d.ts +86 -0
  402. package/dist/utils/offsets.d.ts.map +1 -0
  403. package/dist/utils/offsets.js +124 -0
  404. package/dist/utils/offsets.js.map +1 -0
  405. package/dist/utils/path.d.ts +34 -0
  406. package/dist/utils/path.d.ts.map +1 -0
  407. package/dist/utils/path.js +96 -0
  408. package/dist/utils/path.js.map +1 -0
  409. package/dist/utils/regex.d.ts +11 -0
  410. package/dist/utils/regex.d.ts.map +1 -0
  411. package/dist/utils/regex.js +14 -0
  412. package/dist/utils/regex.js.map +1 -0
  413. package/dist/utils/storage-browser.d.ts +51 -0
  414. package/dist/utils/storage-browser.d.ts.map +1 -0
  415. package/dist/utils/storage-browser.js +381 -0
  416. package/dist/utils/storage-browser.js.map +1 -0
  417. package/dist/utils/storage-node.d.ts +51 -0
  418. package/dist/utils/storage-node.d.ts.map +1 -0
  419. package/dist/utils/storage-node.js +153 -0
  420. package/dist/utils/storage-node.js.map +1 -0
  421. package/dist/utils/storage.browser.d.ts +75 -0
  422. package/dist/utils/storage.browser.d.ts.map +1 -0
  423. package/dist/utils/storage.browser.js +69 -0
  424. package/dist/utils/storage.browser.js.map +1 -0
  425. package/dist/utils/storage.d.ts +73 -0
  426. package/dist/utils/storage.d.ts.map +1 -0
  427. package/dist/utils/storage.js +69 -0
  428. package/dist/utils/storage.js.map +1 -0
  429. package/index.js +14 -13
  430. package/package.json +19 -5
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Rehydra Proxy Middleware
3
+ * Generic (Request → Response) proxy that anonymizes LLM requests
4
+ * and rehydrates responses. Uses standard Web APIs — no framework dependency.
5
+ */
6
+ import type { RehydraProxyConfig } from "./types.js";
7
+ /**
8
+ * Creates a proxy middleware function that forwards requests to an upstream
9
+ * LLM API, anonymizing requests and rehydrating responses.
10
+ *
11
+ * Returns a standard `(Request) => Promise<Response>` function that works
12
+ * with any framework supporting Web Request/Response APIs.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Hono
17
+ * import { Hono } from 'hono';
18
+ * const app = new Hono();
19
+ * const proxy = createRehydraProxy({
20
+ * upstream: 'https://api.openai.com',
21
+ * keyProvider: new ConfigKeyProvider(process.env.PII_KEY!),
22
+ * piiStorageProvider: new SQLitePIIStorageProvider('proxy.db'),
23
+ * });
24
+ * app.post('/v1/*', (c) => proxy(c.req.raw));
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Bun.serve
30
+ * const proxy = createRehydraProxy({ upstream: 'https://api.openai.com', ... });
31
+ * Bun.serve({
32
+ * fetch(req) {
33
+ * if (new URL(req.url).pathname.startsWith('/v1/')) return proxy(req);
34
+ * return new Response('Not Found', { status: 404 });
35
+ * },
36
+ * });
37
+ * ```
38
+ */
39
+ export declare function createRehydraProxy(config: RehydraProxyConfig): (request: Request) => Promise<Response>;
40
+ //# sourceMappingURL=rehydra-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rehydra-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/rehydra-proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAYrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,GACzB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA0FzC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Rehydra Proxy Middleware
3
+ * Generic (Request → Response) proxy that anonymizes LLM requests
4
+ * and rehydrates responses. Uses standard Web APIs — no framework dependency.
5
+ */
6
+ import { createRehydraFetch } from "./rehydra-fetch.js";
7
+ const DEFAULT_FORWARD_HEADERS = [
8
+ "authorization",
9
+ "content-type",
10
+ "x-api-key",
11
+ "anthropic-version",
12
+ "anthropic-beta",
13
+ "openai-organization",
14
+ "openai-project",
15
+ ];
16
+ /**
17
+ * Creates a proxy middleware function that forwards requests to an upstream
18
+ * LLM API, anonymizing requests and rehydrating responses.
19
+ *
20
+ * Returns a standard `(Request) => Promise<Response>` function that works
21
+ * with any framework supporting Web Request/Response APIs.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Hono
26
+ * import { Hono } from 'hono';
27
+ * const app = new Hono();
28
+ * const proxy = createRehydraProxy({
29
+ * upstream: 'https://api.openai.com',
30
+ * keyProvider: new ConfigKeyProvider(process.env.PII_KEY!),
31
+ * piiStorageProvider: new SQLitePIIStorageProvider('proxy.db'),
32
+ * });
33
+ * app.post('/v1/*', (c) => proxy(c.req.raw));
34
+ * ```
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // Bun.serve
39
+ * const proxy = createRehydraProxy({ upstream: 'https://api.openai.com', ... });
40
+ * Bun.serve({
41
+ * fetch(req) {
42
+ * if (new URL(req.url).pathname.startsWith('/v1/')) return proxy(req);
43
+ * return new Response('Not Found', { status: 404 });
44
+ * },
45
+ * });
46
+ * ```
47
+ */
48
+ export function createRehydraProxy(config) {
49
+ const forwardHeaders = config.forwardHeaders ?? DEFAULT_FORWARD_HEADERS;
50
+ const upstream = config.upstream.replace(/\/$/, ""); // Remove trailing slash
51
+ // Base path of the upstream, used only for overlap detection. Invalid upstream URL will throw at fetch time
52
+ const upstreamPathname = tryGetPathname(upstream);
53
+ const upstreamPathSegments = upstreamPathname.split("/").filter(Boolean);
54
+ // Create the underlying Rehydra fetch wrapper
55
+ const rehydraFetch = createRehydraFetch(config);
56
+ // Skip the per-request overlap check when there is no listener or upstream path segments
57
+ const shouldCheckPathOverlap = config.onPathOverlapWarning !== undefined && upstreamPathSegments.length > 0;
58
+ return async (request) => {
59
+ // Build upstream URL
60
+ const requestUrl = new URL(request.url);
61
+ let pathname = requestUrl.pathname;
62
+ // Strip prefix if configured
63
+ if (config.stripPrefix !== undefined && config.stripPrefix !== "" && pathname.startsWith(config.stripPrefix)) {
64
+ pathname = pathname.slice(config.stripPrefix.length);
65
+ if (!pathname.startsWith("/")) {
66
+ pathname = "/" + pathname;
67
+ }
68
+ }
69
+ const upstreamUrl = upstream + pathname + requestUrl.search;
70
+ // Detect overlapping path and warn
71
+ if (shouldCheckPathOverlap) {
72
+ const requestPathSegments = pathname.split("/").filter(Boolean);
73
+ const overlappingSegments = findPathSegmentOverlap(upstreamPathSegments, requestPathSegments);
74
+ if (overlappingSegments.length > 0) {
75
+ try {
76
+ const result = config.onPathOverlapWarning?.({
77
+ upstreamBaseUrl: upstream,
78
+ overlappingSegments,
79
+ });
80
+ void Promise.resolve(result).catch(() => {
81
+ // Async callback failures must not interrupt proxying.
82
+ });
83
+ }
84
+ catch {
85
+ // Synchronous callback failures must not interrupt proxying.
86
+ }
87
+ }
88
+ }
89
+ // Filter headers to forward
90
+ const headers = new Headers();
91
+ for (const name of forwardHeaders) {
92
+ const value = request.headers.get(name);
93
+ if (value !== null) {
94
+ headers.set(name, value);
95
+ }
96
+ }
97
+ // Inject proxy-configured API key, replacing any client auth headers.
98
+ // This is needed when the client uses OAuth (e.g. Claude Code with Max)
99
+ // but the upstream only accepts API key auth.
100
+ if (config.apiKey !== undefined) {
101
+ headers.delete("authorization");
102
+ if (upstreamUrl.includes("anthropic")) {
103
+ headers.set("x-api-key", config.apiKey);
104
+ }
105
+ else {
106
+ headers.set("authorization", `Bearer ${config.apiKey}`);
107
+ }
108
+ }
109
+ else if (headers.has("x-api-key") && headers.has("authorization")) {
110
+ // When client sends both, prefer API key over OAuth token
111
+ headers.delete("authorization");
112
+ }
113
+ // Disable upstream compression — the proxy reads and modifies the response
114
+ // body, so we need it uncompressed. Without this, Node's fetch may
115
+ // auto-decompress but leave content-encoding headers, causing ZlibError
116
+ // on clients that try to decompress the already-decompressed body.
117
+ headers.set("accept-encoding", "identity");
118
+ // Forward via rehydraFetch (which handles anonymization/rehydration)
119
+ return rehydraFetch(upstreamUrl, {
120
+ method: request.method,
121
+ headers,
122
+ body: request.body,
123
+ // @ts-expect-error - duplex is needed for streaming request bodies
124
+ duplex: "half",
125
+ });
126
+ };
127
+ }
128
+ // Returns the URL's pathname, or an empty string if invalid
129
+ function tryGetPathname(url) {
130
+ try {
131
+ return new URL(url).pathname;
132
+ }
133
+ catch {
134
+ return "";
135
+ }
136
+ }
137
+ // Finds the overlapping path segments between the upstream and request paths.
138
+ function findPathSegmentOverlap(upstreamSegments, requestSegments) {
139
+ const maxOverlapLength = Math.min(upstreamSegments.length, requestSegments.length);
140
+ for (let length = maxOverlapLength; length > 0; length--) {
141
+ const upstreamSuffix = upstreamSegments.slice(-length);
142
+ const requestPrefix = requestSegments.slice(0, length);
143
+ const matches = upstreamSuffix.every((segment, index) => segment === requestPrefix[index]);
144
+ if (matches) {
145
+ return upstreamSuffix;
146
+ }
147
+ }
148
+ return [];
149
+ }
150
+ //# sourceMappingURL=rehydra-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rehydra-proxy.js","sourceRoot":"","sources":["../../src/proxy/rehydra-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Server-Sent Events (SSE) Parser
3
+ * Parses SSE protocol streams, handling chunk boundaries correctly.
4
+ */
5
+ /**
6
+ * A parsed SSE event
7
+ */
8
+ export interface SSEEvent {
9
+ /** Event type (defaults to "message") */
10
+ event: string;
11
+ /** Event data (concatenated from all data: lines) */
12
+ data: string;
13
+ }
14
+ /**
15
+ * Parses a Server-Sent Events stream chunk by chunk.
16
+ *
17
+ * SSE protocol format:
18
+ * ```
19
+ * event: message_start
20
+ * data: {"type": "content"}
21
+ *
22
+ * data: {"text": "Hello"}
23
+ *
24
+ * data: [DONE]
25
+ *
26
+ * ```
27
+ *
28
+ * Each event is one or more field lines terminated by a blank line.
29
+ */
30
+ export declare class SSEParser {
31
+ private buffer;
32
+ /**
33
+ * Feed a chunk of text from the SSE stream.
34
+ * Returns zero or more fully parsed events.
35
+ */
36
+ parse(chunk: string): SSEEvent[];
37
+ /**
38
+ * Flush remaining buffer content (call on stream end).
39
+ * Returns any remaining events.
40
+ */
41
+ flush(): SSEEvent[];
42
+ /**
43
+ * Reset the parser state.
44
+ */
45
+ reset(): void;
46
+ /**
47
+ * Parse a single raw SSE event block into an SSEEvent.
48
+ */
49
+ private parseEvent;
50
+ }
51
+ /**
52
+ * Check if a string is the SSE stream termination sentinel.
53
+ */
54
+ export declare function isSSEDone(data: string): boolean;
55
+ /**
56
+ * Serialize an SSE event back to wire format.
57
+ */
58
+ export declare function serializeSSEEvent(event: SSEEvent): string;
59
+ //# sourceMappingURL=sse-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-parser.d.ts","sourceRoot":"","sources":["../../src/proxy/sse-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAM;IAEpB;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE;IAoBhC;;;OAGG;IACH,KAAK,IAAI,QAAQ,EAAE;IAUnB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,UAAU;CAuBnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAWzD"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Server-Sent Events (SSE) Parser
3
+ * Parses SSE protocol streams, handling chunk boundaries correctly.
4
+ */
5
+ /**
6
+ * Parses a Server-Sent Events stream chunk by chunk.
7
+ *
8
+ * SSE protocol format:
9
+ * ```
10
+ * event: message_start
11
+ * data: {"type": "content"}
12
+ *
13
+ * data: {"text": "Hello"}
14
+ *
15
+ * data: [DONE]
16
+ *
17
+ * ```
18
+ *
19
+ * Each event is one or more field lines terminated by a blank line.
20
+ */
21
+ export class SSEParser {
22
+ buffer = "";
23
+ /**
24
+ * Feed a chunk of text from the SSE stream.
25
+ * Returns zero or more fully parsed events.
26
+ */
27
+ parse(chunk) {
28
+ this.buffer += chunk;
29
+ const events = [];
30
+ // Split on double newline (event boundary)
31
+ // Handle both \n\n and \r\n\r\n
32
+ const parts = this.buffer.split(/\n\n|\r\n\r\n/);
33
+ // Last part may be incomplete — keep it in the buffer
34
+ this.buffer = parts.pop() ?? "";
35
+ for (const part of parts) {
36
+ if (part.trim() === "")
37
+ continue;
38
+ const event = this.parseEvent(part);
39
+ if (event)
40
+ events.push(event);
41
+ }
42
+ return events;
43
+ }
44
+ /**
45
+ * Flush remaining buffer content (call on stream end).
46
+ * Returns any remaining events.
47
+ */
48
+ flush() {
49
+ if (this.buffer.trim() === "") {
50
+ this.buffer = "";
51
+ return [];
52
+ }
53
+ const event = this.parseEvent(this.buffer);
54
+ this.buffer = "";
55
+ return event ? [event] : [];
56
+ }
57
+ /**
58
+ * Reset the parser state.
59
+ */
60
+ reset() {
61
+ this.buffer = "";
62
+ }
63
+ /**
64
+ * Parse a single raw SSE event block into an SSEEvent.
65
+ */
66
+ parseEvent(raw) {
67
+ let data = "";
68
+ let eventType = "message";
69
+ for (const line of raw.split(/\n|\r\n/)) {
70
+ if (line.startsWith("data: ")) {
71
+ // Concatenate multiple data: lines with newlines
72
+ data += (data ? "\n" : "") + line.slice(6);
73
+ }
74
+ else if (line === "data:") {
75
+ // Empty data line
76
+ data += (data ? "\n" : "");
77
+ }
78
+ else if (line.startsWith("event: ")) {
79
+ eventType = line.slice(7).trim();
80
+ }
81
+ else if (line.startsWith("event:")) {
82
+ eventType = line.slice(6).trim();
83
+ }
84
+ // Ignore 'id:', 'retry:', and comments (lines starting with ':')
85
+ }
86
+ if (data === "" && !raw.includes("data:"))
87
+ return null;
88
+ return { event: eventType, data };
89
+ }
90
+ }
91
+ /**
92
+ * Check if a string is the SSE stream termination sentinel.
93
+ */
94
+ export function isSSEDone(data) {
95
+ return data.trim() === "[DONE]";
96
+ }
97
+ /**
98
+ * Serialize an SSE event back to wire format.
99
+ */
100
+ export function serializeSSEEvent(event) {
101
+ let result = "";
102
+ if (event.event !== "message") {
103
+ result += `event: ${event.event}\n`;
104
+ }
105
+ // Split data on newlines for multi-line data fields
106
+ for (const line of event.data.split("\n")) {
107
+ result += `data: ${line}\n`;
108
+ }
109
+ result += "\n";
110
+ return result;
111
+ }
112
+ //# sourceMappingURL=sse-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-parser.js","sourceRoot":"","sources":["../../src/proxy/sse-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Default system instruction for PII placeholder handling.
3
+ *
4
+ * Injected into the system prompt when anonymization produces PII replacements,
5
+ * telling the model to treat PII placeholders as opaque pass-through values.
6
+ *
7
+ * Shared between the proxy layer and the OpenCode plugin.
8
+ */
9
+ import type { TagFormat } from "../types/index.js";
10
+ /**
11
+ * Builds a system instruction string using the configured tag format.
12
+ */
13
+ export declare function buildPIISystemInstruction(tagFormat?: TagFormat): string;
14
+ /**
15
+ * Default system instruction using XML-style tag format.
16
+ * Kept for backwards compatibility.
17
+ */
18
+ export declare const DEFAULT_PII_SYSTEM_INSTRUCTION: string;
19
+ //# sourceMappingURL=system-instruction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-instruction.d.ts","sourceRoot":"","sources":["../../src/proxy/system-instruction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,SAA8B,GACxC,MAAM,CAeR;AAED;;;GAGG;AACH,eAAO,MAAM,8BAA8B,QAA8B,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Default system instruction for PII placeholder handling.
3
+ *
4
+ * Injected into the system prompt when anonymization produces PII replacements,
5
+ * telling the model to treat PII placeholders as opaque pass-through values.
6
+ *
7
+ * Shared between the proxy layer and the OpenCode plugin.
8
+ */
9
+ import { DEFAULT_TAG_FORMAT } from "../types/index.js";
10
+ /**
11
+ * Builds a system instruction string using the configured tag format.
12
+ */
13
+ export function buildPIISystemInstruction(tagFormat = DEFAULT_TAG_FORMAT) {
14
+ const keyword = tagFormat.keyword ?? "PII";
15
+ const exampleTag = `${tagFormat.open}${keyword} type="..." id="..."${tagFormat.close}`;
16
+ const emailTag = `${tagFormat.open}${keyword} type="EMAIL" id="1"${tagFormat.close}`;
17
+ return [
18
+ `Some values in this conversation have been replaced with PII placeholders like ${exampleTag}.`,
19
+ "These are real values that have been masked for privacy during transit.",
20
+ "They will be automatically rehydrated (replaced with the original values) before any command is executed locally.",
21
+ "IMPORTANT: Treat these placeholders exactly like real values.",
22
+ "Do NOT try to resolve, decode, remove, or work around them.",
23
+ "Use them as-is in commands, code, and tool calls.",
24
+ `For example, if a user message contains ${emailTag}, pass that exact placeholder as the email argument in any tool call.`,
25
+ "The rehydration layer handles the rest.",
26
+ ].join(" ");
27
+ }
28
+ /**
29
+ * Default system instruction using XML-style tag format.
30
+ * Kept for backwards compatibility.
31
+ */
32
+ export const DEFAULT_PII_SYSTEM_INSTRUCTION = buildPIISystemInstruction();
33
+ //# sourceMappingURL=system-instruction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-instruction.js","sourceRoot":"","sources":["../../src/proxy/system-instruction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAAuB,kBAAkB;IAEzC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,SAAS,CAAC,IAAI,GAAG,OAAO,uBAAuB,SAAS,CAAC,KAAK,EAAE,CAAC;IACvF,MAAM,QAAQ,GAAG,GAAG,SAAS,CAAC,IAAI,GAAG,OAAO,uBAAuB,SAAS,CAAC,KAAK,EAAE,CAAC;IAErF,OAAO;QACL,kFAAkF,UAAU,GAAG;QAC/F,yEAAyE;QACzE,mHAAmH;QACnH,+DAA+D;QAC/D,6DAA6D;QAC7D,mDAAmD;QACnD,2CAA2C,QAAQ,uEAAuE;QAC1H,yCAAyC;KAC1C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { StreamingToolLoopAdapter } from './providers/streaming-tool-loop.js';
2
+ /** Buffer one response with a byte limit and cancellation, including incomplete SSE events. */
3
+ export declare function readToolResponse(response: Response, limit: number, signal: AbortSignal): Promise<string>;
4
+ export declare function accumulateToolStream(text: string, adapter: StreamingToolLoopAdapter): unknown;
5
+ /** Generate frames on demand so downstream consumption controls backpressure. */
6
+ export declare function toolResultStream(body: unknown, response: Response, adapter: StreamingToolLoopAdapter): Response;
7
+ //# sourceMappingURL=tool-loop-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loop-stream.d.ts","sourceRoot":"","sources":["../../src/proxy/tool-loop-stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAEnF,+FAA+F;AAC/F,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B9G;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAQ7F;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,GAAG,QAAQ,CAe/G"}
@@ -0,0 +1,65 @@
1
+ import { SSEParser, isSSEDone, serializeSSEEvent } from './sse-parser.js';
2
+ /** Buffer one response with a byte limit and cancellation, including incomplete SSE events. */
3
+ export async function readToolResponse(response, limit, signal) {
4
+ signal.throwIfAborted();
5
+ if (response.body === null)
6
+ return '';
7
+ const reader = response.body.getReader();
8
+ const decoder = new TextDecoder();
9
+ let bytes = 0;
10
+ let text = '';
11
+ const cancel = () => { void reader.cancel().catch(() => { }); };
12
+ signal.addEventListener('abort', cancel, { once: true });
13
+ try {
14
+ for (;;) {
15
+ signal.throwIfAborted();
16
+ const { value, done } = await reader.read();
17
+ signal.throwIfAborted();
18
+ if (done)
19
+ break;
20
+ bytes += value.byteLength;
21
+ if (bytes > limit)
22
+ throw new Error('Tool response exceeds maxToolResponseBytes');
23
+ text += decoder.decode(value, { stream: true });
24
+ }
25
+ return text + decoder.decode();
26
+ }
27
+ catch (error) {
28
+ cancel();
29
+ throw error;
30
+ }
31
+ finally {
32
+ signal.removeEventListener('abort', cancel);
33
+ reader.releaseLock();
34
+ }
35
+ }
36
+ export function accumulateToolStream(text, adapter) {
37
+ const parser = new SSEParser();
38
+ const accumulator = adapter.createAccumulator();
39
+ for (const event of [...parser.parse(text), ...parser.flush()]) {
40
+ if (isSSEDone(event.data))
41
+ continue;
42
+ accumulator.push(JSON.parse(event.data));
43
+ }
44
+ return accumulator.finish();
45
+ }
46
+ /** Generate frames on demand so downstream consumption controls backpressure. */
47
+ export function toolResultStream(body, response, adapter) {
48
+ const frames = adapter.encode(body)[Symbol.iterator]();
49
+ const encoder = new TextEncoder();
50
+ const headers = new Headers(response.headers);
51
+ headers.delete('content-length');
52
+ headers.delete('content-encoding');
53
+ headers.set('content-type', 'text/event-stream');
54
+ return new Response(new ReadableStream({
55
+ pull(controller) {
56
+ const next = frames.next();
57
+ if (next.done === true)
58
+ controller.close();
59
+ else
60
+ controller.enqueue(encoder.encode(serializeSSEEvent(next.value)));
61
+ },
62
+ cancel() { frames.return?.(); },
63
+ }), { status: response.status, statusText: response.statusText, headers });
64
+ }
65
+ //# sourceMappingURL=tool-loop-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-loop-stream.js","sourceRoot":"","sources":["../../src/proxy/tool-loop-stream.ts"],"names":[],"mappings":"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"}