opencode-rehydar 0.14.2 → 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 +6 -4
  430. package/package.json +19 -5
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Shared tail buffering for streamed PII-tag rehydration.
3
+ *
4
+ * Model output arrives in fragments: a single `<PII .../>` tag can be split
5
+ * across SSE events, WebSocket byte chunks, or JSON delta frames. Rehydrating
6
+ * a fragment in isolation would emit an unterminated tag (or worse, drop the
7
+ * real value), so incomplete fragments are held back and prepended to the next
8
+ * fragment of the same stream.
9
+ *
10
+ * Two buffers are maintained per session:
11
+ * - a byte/text tail for raw text payloads (SSE `data:` bodies, non-JSON WS
12
+ * frames),
13
+ * - a JSON pointer tail so each string field of a JSON delta frame continues
14
+ * from the fragment left by the previous frame.
15
+ */
16
+ /** Longest PII tag fragment we hold back while awaiting its closing delimiter. */
17
+ export const MAX_TAG_TAIL_LENGTH = 256;
18
+ /** Default tag prefix, matching `DEFAULT_TAG_FORMAT`. */
19
+ export const DEFAULT_TAG_PREFIX = "<PII";
20
+ /** Default tag close delimiter. */
21
+ export const DEFAULT_TAG_CLOSE = "/>";
22
+ /** Default in-memory tail store. */
23
+ export class InMemoryRehydrateTailStore {
24
+ textTails = new Map();
25
+ jsonTails = new Map();
26
+ get(sessionID) {
27
+ return this.textTails.get(sessionID) ?? "";
28
+ }
29
+ set(sessionID, tail) {
30
+ if (tail.length === 0) {
31
+ this.textTails.delete(sessionID);
32
+ return;
33
+ }
34
+ this.textTails.set(sessionID, tail);
35
+ }
36
+ getJsonTail(sessionID, pointer) {
37
+ return this.jsonTails.get(sessionID)?.get(pointer) ?? "";
38
+ }
39
+ setJsonTail(sessionID, pointer, tail) {
40
+ const pointers = this.jsonTails.get(sessionID);
41
+ if (tail.length === 0) {
42
+ if (pointers === undefined)
43
+ return;
44
+ pointers.delete(pointer);
45
+ if (pointers.size === 0)
46
+ this.jsonTails.delete(sessionID);
47
+ return;
48
+ }
49
+ if (pointers === undefined) {
50
+ this.jsonTails.set(sessionID, new Map([[pointer, tail]]));
51
+ return;
52
+ }
53
+ pointers.set(pointer, tail);
54
+ }
55
+ delete(sessionID) {
56
+ this.textTails.delete(sessionID);
57
+ this.jsonTails.delete(sessionID);
58
+ }
59
+ clear() {
60
+ this.textTails.clear();
61
+ this.jsonTails.clear();
62
+ }
63
+ }
64
+ /**
65
+ * Finds the start of a trailing, unterminated PII tag fragment.
66
+ *
67
+ * Returns `-1` when the text has no incomplete tag, so a caller can safely
68
+ * emit it. When a fragment is found, the caller must hold it back (prepending
69
+ * it to the next fragment) instead of emitting a truncated tag.
70
+ */
71
+ export function incompleteTagStart(text, tagPrefix, tagClose) {
72
+ const start = text.lastIndexOf(tagPrefix);
73
+ if (start >= 0 && text.indexOf(tagClose, start) === -1) {
74
+ return start;
75
+ }
76
+ // A tag can also be split before its full prefix has arrived (e.g. the frame
77
+ // ends with `<PI`). Hold back the longest trailing prefix fragment.
78
+ const maxPrefix = Math.min(text.length, tagPrefix.length - 1);
79
+ for (let length = maxPrefix; length >= 1; length--) {
80
+ const suffix = text.slice(text.length - length);
81
+ if (suffix === tagPrefix.slice(0, length)) {
82
+ return text.length - length;
83
+ }
84
+ }
85
+ return -1;
86
+ }
87
+ /**
88
+ * Splits a restored string at its trailing unterminated tag fragment.
89
+ *
90
+ * When the fragment is longer than {@link MAX_TAG_TAIL_LENGTH} the whole string
91
+ * is emitted: holding an unbounded fragment risks stalling the stream, so the
92
+ * cap forces a flush.
93
+ */
94
+ export function splitTrailingTag(text, tagPrefix, tagClose) {
95
+ const start = incompleteTagStart(text, tagPrefix, tagClose);
96
+ if (start < 0) {
97
+ return { emitted: text, tail: "" };
98
+ }
99
+ const fragment = text.slice(start);
100
+ if (fragment.length > MAX_TAG_TAIL_LENGTH) {
101
+ return { emitted: text, tail: "" };
102
+ }
103
+ return { emitted: text.slice(0, start), tail: fragment };
104
+ }
105
+ /**
106
+ * Walks a JSON value, restoring every string leaf.
107
+ *
108
+ * Each leaf is prefixed with the fragment previously held for its JSON pointer
109
+ * (so a tag split across delta frames is reassembled), then any trailing
110
+ * unterminated fragment is held back for the next frame. `changed` reports
111
+ * whether any leaf differs from the original, letting callers keep the frame
112
+ * byte-for-byte when nothing needed rewriting.
113
+ */
114
+ export async function walkJsonWithTail(value, rehydrate, ctx, pointer = "") {
115
+ if (typeof value === "string") {
116
+ const key = ctx.pointerPrefix + pointer;
117
+ const held = ctx.store.getJsonTail(ctx.sessionID, key);
118
+ const restored = await rehydrate(held + value);
119
+ const { emitted, tail } = splitTrailingTag(restored, ctx.tagPrefix, ctx.tagClose);
120
+ ctx.store.setJsonTail(ctx.sessionID, key, tail);
121
+ return { value: emitted, changed: emitted !== value };
122
+ }
123
+ if (Array.isArray(value)) {
124
+ const items = value;
125
+ const output = [];
126
+ let changed = false;
127
+ for (let index = 0; index < items.length; index++) {
128
+ const result = await walkJsonWithTail(items[index], rehydrate, ctx, `${pointer}/${index}`);
129
+ output.push(result.value);
130
+ changed = changed || result.changed;
131
+ }
132
+ return { value: output, changed };
133
+ }
134
+ if (value !== null && typeof value === "object") {
135
+ const source = value;
136
+ const output = {};
137
+ let changed = false;
138
+ for (const key of Object.keys(source)) {
139
+ const result = await walkJsonWithTail(source[key], rehydrate, ctx, `${pointer}/${key}`);
140
+ output[key] = result.value;
141
+ changed = changed || result.changed;
142
+ }
143
+ return { value: output, changed };
144
+ }
145
+ return { value, changed: false };
146
+ }
147
+ //# sourceMappingURL=rehydrate-tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rehydrate-tail.js","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/rehydrate-tail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Response rehydration for the V2 `http.response` / `experimental.ws.receive`
3
+ * hooks.
4
+ *
5
+ * The model only ever sees PII tags; its output must be rewritten back to the
6
+ * real values before the user sees it. Referencing `deps.rehydrate` keeps the
7
+ * PII map lookup in the caller (the session store) so this module stays free of
8
+ * storage concerns.
9
+ *
10
+ * Rewriting strategy by surface:
11
+ * - JSON `http.response`: parse, walk string leaves, re-serialise.
12
+ * - SSE `http.response`: streamed through a {@link SseStreamRewriter}; only
13
+ * complete frames are rewritten so a tag split across chunks, across SSE
14
+ * events, or split inside a streamed delta field is never emitted truncated.
15
+ * - WebSocket frames: only `primary` frames are rehydrated. JSON frames are
16
+ * parsed and walked, carrying a tag split across the delta field of two frames
17
+ * on the matching JSON pointer; non-JSON frames fall back to text replacement
18
+ * with a per-session tail buffer that holds an incomplete trailing PII tag
19
+ * until the next frame completes it.
20
+ *
21
+ * Every failure is logged and the original payload is passed through — a failed
22
+ * rehydration must never corrupt the response or break OpenCode.
23
+ */
24
+ import type { RehydrateTailStore } from "./rehydrate-tail.js";
25
+ import type { HttpResponseKind, V2Logger } from "./types.js";
26
+ export { InMemoryRehydrateTailStore } from "./rehydrate-tail.js";
27
+ export type { RehydrateTailStore } from "./rehydrate-tail.js";
28
+ export interface ResponseRehydrateDeps {
29
+ /** Restores PII tags in a single string. */
30
+ rehydrate: (input: string) => Promise<string>;
31
+ log: V2Logger;
32
+ sessionID: string;
33
+ kind: HttpResponseKind;
34
+ /** Tag prefix used to detect an incomplete trailing tag (`<PII`). */
35
+ tagPrefix?: string;
36
+ /** Tag close delimiter used to detect a complete tag (`/>`). */
37
+ tagClose?: string;
38
+ /** Per-session WebSocket tail buffer; defaults to a shared instance. */
39
+ tailStore?: RehydrateTailStore;
40
+ }
41
+ /** Dependencies accepted by the WebSocket frame rehydrator. */
42
+ export interface WsFrameRehydrateDeps {
43
+ rehydrate: (input: string) => Promise<string>;
44
+ log: V2Logger;
45
+ sessionID?: string;
46
+ tagPrefix?: string;
47
+ tagClose?: string;
48
+ tailStore?: RehydrateTailStore;
49
+ }
50
+ /**
51
+ * Rehydrates an HTTP response produced for a session request.
52
+ *
53
+ * Only `primary` responses are processed: `title` / `compaction` / `generate`
54
+ * responses are not user-facing, so restoring real values there would only leak
55
+ * PII. Unsupported content types are left untouched.
56
+ */
57
+ export declare function rehydrateHttpResponse(event: {
58
+ response: Response;
59
+ }, deps: ResponseRehydrateDeps): Promise<void>;
60
+ /**
61
+ * Restores a WebSocket frame in place.
62
+ *
63
+ * Only `primary` frames are rehydrated: `title` / `compaction` / `generate`
64
+ * frames are not user-facing, so restoring real values there would only leak
65
+ * PII. Any fragment held from an earlier frame is dropped on a non-primary
66
+ * frame so it cannot surface later.
67
+ *
68
+ * Complete JSON frames are parsed and walked so escaped characters are handled
69
+ * correctly; a tag split across the delta field of consecutive JSON frames is
70
+ * carried on the matching JSON pointer. Other frames use raw replacement,
71
+ * holding an incomplete trailing tag in a per-session text buffer until a later
72
+ * frame completes it.
73
+ */
74
+ export declare function rehydrateWsFrame(event: {
75
+ frame: string;
76
+ kind?: HttpResponseKind;
77
+ }, deps: WsFrameRehydrateDeps): Promise<void>;
78
+ //# sourceMappingURL=response-rehydrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-rehydrate.d.ts","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/response-rehydrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQ9D,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAmGD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,EAC7B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,gBAAgB,CAAA;CAAE,EACjD,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Df"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Response rehydration for the V2 `http.response` / `experimental.ws.receive`
3
+ * hooks.
4
+ *
5
+ * The model only ever sees PII tags; its output must be rewritten back to the
6
+ * real values before the user sees it. Referencing `deps.rehydrate` keeps the
7
+ * PII map lookup in the caller (the session store) so this module stays free of
8
+ * storage concerns.
9
+ *
10
+ * Rewriting strategy by surface:
11
+ * - JSON `http.response`: parse, walk string leaves, re-serialise.
12
+ * - SSE `http.response`: streamed through a {@link SseStreamRewriter}; only
13
+ * complete frames are rewritten so a tag split across chunks, across SSE
14
+ * events, or split inside a streamed delta field is never emitted truncated.
15
+ * - WebSocket frames: only `primary` frames are rehydrated. JSON frames are
16
+ * parsed and walked, carrying a tag split across the delta field of two frames
17
+ * on the matching JSON pointer; non-JSON frames fall back to text replacement
18
+ * with a per-session tail buffer that holds an incomplete trailing PII tag
19
+ * until the next frame completes it.
20
+ *
21
+ * Every failure is logged and the original payload is passed through — a failed
22
+ * rehydration must never corrupt the response or break OpenCode.
23
+ */
24
+ import { walkJson } from "../../utils/json-walk.js";
25
+ import { SseStreamRewriter } from "./sse.js";
26
+ import { DEFAULT_TAG_CLOSE, DEFAULT_TAG_PREFIX, InMemoryRehydrateTailStore, splitTrailingTag, walkJsonWithTail, } from "./rehydrate-tail.js";
27
+ // Re-exported so existing consumers keep importing the tail store from here.
28
+ export { InMemoryRehydrateTailStore } from "./rehydrate-tail.js";
29
+ /**
30
+ * Fallback store used when a caller does not inject one. Tests should inject a
31
+ * fresh store to keep sessions isolated.
32
+ */
33
+ const sharedTailStore = new InMemoryRehydrateTailStore();
34
+ /** Normalizes an unknown thrown value into a loggable message. */
35
+ function errorMessage(error) {
36
+ return error instanceof Error ? error.message : String(error);
37
+ }
38
+ /**
39
+ * Builds a replacement response with the same status and headers.
40
+ *
41
+ * `content-length` is dropped because the rehydrated body differs in length and
42
+ * a stale value would truncate or over-read it.
43
+ */
44
+ function withBody(original, body) {
45
+ const headers = new Headers(original.headers);
46
+ headers.delete("content-length");
47
+ return new Response(body, {
48
+ status: original.status,
49
+ statusText: original.statusText,
50
+ headers,
51
+ });
52
+ }
53
+ /**
54
+ * Rehydrates a JSON response body on `event.response`.
55
+ *
56
+ * JSON is the safest surface to rewrite: `JSON.parse` / `JSON.stringify` keeps
57
+ * the payload valid while every string leaf is passed through `rehydrate`.
58
+ */
59
+ async function rehydrateJsonResponse(event, deps) {
60
+ const rawBody = await event.response.clone().text();
61
+ const parsed = JSON.parse(rawBody);
62
+ const restored = await walkJson(parsed, deps.rehydrate);
63
+ event.response = withBody(event.response, JSON.stringify(restored));
64
+ }
65
+ /**
66
+ * Rehydrates a streamed SSE response body by piping it through a
67
+ * {@link SseStreamRewriter}. The body is never fully buffered, so OpenCode keeps
68
+ * receiving incremental frames.
69
+ */
70
+ async function rehydrateSseResponse(event, deps) {
71
+ const rewriter = new SseStreamRewriter(deps.rehydrate, (message) => {
72
+ deps.log.error("rehydra SSE frame rewrite failed", {
73
+ sessionID: deps.sessionID,
74
+ error: message,
75
+ });
76
+ }, {
77
+ sessionID: deps.sessionID,
78
+ tagPrefix: deps.tagPrefix,
79
+ tagClose: deps.tagClose,
80
+ });
81
+ const encoder = new TextEncoder();
82
+ const source = event.response.body;
83
+ const { readable, writable } = new TransformStream({
84
+ async transform(chunk, controller) {
85
+ const text = await rewriter.push(chunk);
86
+ if (text.length > 0) {
87
+ controller.enqueue(encoder.encode(text));
88
+ }
89
+ },
90
+ async flush(controller) {
91
+ const text = await rewriter.flush();
92
+ if (text.length > 0) {
93
+ controller.enqueue(encoder.encode(text));
94
+ }
95
+ },
96
+ });
97
+ const headers = new Headers(event.response.headers);
98
+ headers.delete("content-length");
99
+ event.response = new Response(readable, {
100
+ status: event.response.status,
101
+ statusText: event.response.statusText,
102
+ headers,
103
+ });
104
+ if (source === null) {
105
+ await writable.close();
106
+ return;
107
+ }
108
+ source.pipeTo(writable).catch((error) => {
109
+ deps.log.error("rehydra SSE stream failed", {
110
+ sessionID: deps.sessionID,
111
+ error: errorMessage(error),
112
+ });
113
+ });
114
+ }
115
+ /**
116
+ * Rehydrates an HTTP response produced for a session request.
117
+ *
118
+ * Only `primary` responses are processed: `title` / `compaction` / `generate`
119
+ * responses are not user-facing, so restoring real values there would only leak
120
+ * PII. Unsupported content types are left untouched.
121
+ */
122
+ export async function rehydrateHttpResponse(event, deps) {
123
+ if (deps.kind !== "primary") {
124
+ return;
125
+ }
126
+ try {
127
+ const contentType = event.response.headers.get("content-type") ?? "";
128
+ if (contentType.includes("application/json")) {
129
+ await rehydrateJsonResponse(event, deps);
130
+ return;
131
+ }
132
+ if (contentType.includes("text/event-stream")) {
133
+ await rehydrateSseResponse(event, deps);
134
+ }
135
+ }
136
+ catch (error) {
137
+ deps.log.error("rehydra http.response hook failed", {
138
+ sessionID: deps.sessionID,
139
+ kind: deps.kind,
140
+ error: errorMessage(error),
141
+ });
142
+ }
143
+ }
144
+ /**
145
+ * Restores a WebSocket frame in place.
146
+ *
147
+ * Only `primary` frames are rehydrated: `title` / `compaction` / `generate`
148
+ * frames are not user-facing, so restoring real values there would only leak
149
+ * PII. Any fragment held from an earlier frame is dropped on a non-primary
150
+ * frame so it cannot surface later.
151
+ *
152
+ * Complete JSON frames are parsed and walked so escaped characters are handled
153
+ * correctly; a tag split across the delta field of consecutive JSON frames is
154
+ * carried on the matching JSON pointer. Other frames use raw replacement,
155
+ * holding an incomplete trailing tag in a per-session text buffer until a later
156
+ * frame completes it.
157
+ */
158
+ export async function rehydrateWsFrame(event, deps) {
159
+ const store = deps.tailStore ?? sharedTailStore;
160
+ const sessionID = deps.sessionID ?? "";
161
+ const tagPrefix = deps.tagPrefix ?? DEFAULT_TAG_PREFIX;
162
+ const tagClose = deps.tagClose ?? DEFAULT_TAG_CLOSE;
163
+ if (event.kind !== "primary") {
164
+ // Fail closed: never restore PII in a non-primary response, and drop any
165
+ // fragment left behind by an earlier frame.
166
+ store.delete(sessionID);
167
+ return;
168
+ }
169
+ const combined = store.get(sessionID) + event.frame;
170
+ const originalFrame = event.frame;
171
+ try {
172
+ let parsed;
173
+ let isJson = true;
174
+ try {
175
+ parsed = JSON.parse(combined);
176
+ }
177
+ catch {
178
+ isJson = false;
179
+ }
180
+ if (isJson) {
181
+ const result = await walkJsonWithTail(parsed, deps.rehydrate, {
182
+ store,
183
+ sessionID,
184
+ pointerPrefix: "ws:",
185
+ tagPrefix,
186
+ tagClose,
187
+ });
188
+ // Preserve the frame byte-for-byte when nothing was rehydrated; otherwise
189
+ // re-serialize so escaped characters are handled correctly. `combined`
190
+ // includes any fragment held back from a previous frame.
191
+ event.frame = result.changed ? JSON.stringify(result.value) : combined;
192
+ // Clear the byte-level text tail; JSON-pointer tails were updated above.
193
+ store.set(sessionID, "");
194
+ return;
195
+ }
196
+ const restored = await deps.rehydrate(combined);
197
+ const { emitted, tail } = splitTrailingTag(restored, tagPrefix, tagClose);
198
+ event.frame = emitted;
199
+ store.set(sessionID, tail);
200
+ }
201
+ catch (error) {
202
+ store.delete(sessionID);
203
+ event.frame = originalFrame;
204
+ deps.log.error("rehydra experimental.ws.receive hook failed", {
205
+ sessionID,
206
+ error: errorMessage(error),
207
+ });
208
+ }
209
+ }
210
+ //# sourceMappingURL=response-rehydrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-rehydrate.js","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/response-rehydrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Message scrubbing for OpenCode Plugin V2 session hooks.
3
+ *
4
+ * Walks the messages attached to a model request and anonymizes every string
5
+ * that can carry secrets: user/assistant/reasoning text, tool arguments,
6
+ * completed tool output, and V1-style part state.
7
+ *
8
+ * The scrub runs on a deep copy; only after it completes successfully are the
9
+ * results written back into the caller's original objects (preserving the
10
+ * references Plugin V2 relies on). If any step throws, the originals are left
11
+ * untouched and the error propagates so the caller can block the request
12
+ * instead of leaking raw PII (fail-closed).
13
+ */
14
+ import { PIIType } from "../../types/index.js";
15
+ import type { AnonymizationPolicy } from "../../types/index.js";
16
+ import type { AnonymizationState } from "./anon-state.js";
17
+ import type { Message, ScrubContext, SessionResolver } from "./types.js";
18
+ export interface ScrubMessagesOptions {
19
+ /** Locale hint passed to `anonymize()`; defaults to the plugin option. */
20
+ locale?: string;
21
+ /** Base policy (URL/IP disabled by default). */
22
+ policy?: Partial<AnonymizationPolicy>;
23
+ /** Whether the VCS identity recognizers are enabled. */
24
+ vcsIdentities: boolean;
25
+ /** Builds the extended policy that enables identity types for a VCS output. */
26
+ identityPolicy: (types: PIIType[]) => Partial<AnonymizationPolicy>;
27
+ }
28
+ export interface ScrubResult {
29
+ /** Entities anonymized during this call. */
30
+ scrubbed: number;
31
+ byType: Record<string, number>;
32
+ }
33
+ /**
34
+ * Anonymizes the messages of a session request in place.
35
+ *
36
+ * @returns the number of entities removed and a per-type breakdown for logging.
37
+ */
38
+ export declare function scrubMessages(eventMessages: Message[], ctx: ScrubContext, resolveSession: SessionResolver, state: AnonymizationState, options: ScrubMessagesOptions): Promise<ScrubResult>;
39
+ //# sourceMappingURL=scrub-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrub-messages.d.ts","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/scrub-messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EACV,OAAO,EAGP,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAgHD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,OAAO,EAAE,EACxB,GAAG,EAAE,YAAY,EACjB,cAAc,EAAE,eAAe,EAC/B,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA+KtB"}