netra-artifacts 0.1.0-alpha.0

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 (479) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +239 -0
  4. package/dist/artifacts/artifactEnvelope.d.ts +46 -0
  5. package/dist/artifacts/artifactEnvelope.d.ts.map +1 -0
  6. package/dist/artifacts/artifactEnvelope.js +217 -0
  7. package/dist/artifacts/artifactEnvelope.js.map +1 -0
  8. package/dist/artifacts/artifactStatus.d.ts +9 -0
  9. package/dist/artifacts/artifactStatus.d.ts.map +1 -0
  10. package/dist/artifacts/artifactStatus.js +10 -0
  11. package/dist/artifacts/artifactStatus.js.map +1 -0
  12. package/dist/artifacts/artifactStore.d.ts +15 -0
  13. package/dist/artifacts/artifactStore.d.ts.map +1 -0
  14. package/dist/artifacts/artifactStore.js +35 -0
  15. package/dist/artifacts/artifactStore.js.map +1 -0
  16. package/dist/artifacts/htmlArtifact.d.ts +10 -0
  17. package/dist/artifacts/htmlArtifact.d.ts.map +1 -0
  18. package/dist/artifacts/htmlArtifact.js +20 -0
  19. package/dist/artifacts/htmlArtifact.js.map +1 -0
  20. package/dist/artifacts/index.d.ts +5 -0
  21. package/dist/artifacts/index.d.ts.map +1 -0
  22. package/dist/artifacts/index.js +5 -0
  23. package/dist/artifacts/index.js.map +1 -0
  24. package/dist/circuit-breaker/circuitBreaker.d.ts +35 -0
  25. package/dist/circuit-breaker/circuitBreaker.d.ts.map +1 -0
  26. package/dist/circuit-breaker/circuitBreaker.js +59 -0
  27. package/dist/circuit-breaker/circuitBreaker.js.map +1 -0
  28. package/dist/circuit-breaker/index.d.ts +3 -0
  29. package/dist/circuit-breaker/index.d.ts.map +1 -0
  30. package/dist/circuit-breaker/index.js +3 -0
  31. package/dist/circuit-breaker/index.js.map +1 -0
  32. package/dist/circuit-breaker/memoryCircuitStore.d.ts +24 -0
  33. package/dist/circuit-breaker/memoryCircuitStore.d.ts.map +1 -0
  34. package/dist/circuit-breaker/memoryCircuitStore.js +12 -0
  35. package/dist/circuit-breaker/memoryCircuitStore.js.map +1 -0
  36. package/dist/classifier/classifierPrompt.d.ts +7 -0
  37. package/dist/classifier/classifierPrompt.d.ts.map +1 -0
  38. package/dist/classifier/classifierPrompt.js +43 -0
  39. package/dist/classifier/classifierPrompt.js.map +1 -0
  40. package/dist/classifier/classifyMode.d.ts +21 -0
  41. package/dist/classifier/classifyMode.d.ts.map +1 -0
  42. package/dist/classifier/classifyMode.js +50 -0
  43. package/dist/classifier/classifyMode.js.map +1 -0
  44. package/dist/classifier/index.d.ts +4 -0
  45. package/dist/classifier/index.d.ts.map +1 -0
  46. package/dist/classifier/index.js +4 -0
  47. package/dist/classifier/index.js.map +1 -0
  48. package/dist/classifier/rules.d.ts +13 -0
  49. package/dist/classifier/rules.d.ts.map +1 -0
  50. package/dist/classifier/rules.js +118 -0
  51. package/dist/classifier/rules.js.map +1 -0
  52. package/dist/client/ArtifactChat.d.ts +15 -0
  53. package/dist/client/ArtifactChat.d.ts.map +1 -0
  54. package/dist/client/ArtifactChat.js +62 -0
  55. package/dist/client/ArtifactChat.js.map +1 -0
  56. package/dist/client/ArtifactMessage.d.ts +24 -0
  57. package/dist/client/ArtifactMessage.d.ts.map +1 -0
  58. package/dist/client/ArtifactMessage.js +29 -0
  59. package/dist/client/ArtifactMessage.js.map +1 -0
  60. package/dist/client/MarkdownMessage.d.ts +12 -0
  61. package/dist/client/MarkdownMessage.d.ts.map +1 -0
  62. package/dist/client/MarkdownMessage.js +141 -0
  63. package/dist/client/MarkdownMessage.js.map +1 -0
  64. package/dist/client/index.d.ts +8 -0
  65. package/dist/client/index.d.ts.map +1 -0
  66. package/dist/client/index.js +8 -0
  67. package/dist/client/index.js.map +1 -0
  68. package/dist/client/useArtifactStream.d.ts +9 -0
  69. package/dist/client/useArtifactStream.d.ts.map +1 -0
  70. package/dist/client/useArtifactStream.js +210 -0
  71. package/dist/client/useArtifactStream.js.map +1 -0
  72. package/dist/client.d.ts +2 -0
  73. package/dist/client.d.ts.map +1 -0
  74. package/dist/client.js +4 -0
  75. package/dist/client.js.map +1 -0
  76. package/dist/constants/defaults.d.ts +17 -0
  77. package/dist/constants/defaults.d.ts.map +1 -0
  78. package/dist/constants/defaults.js +38 -0
  79. package/dist/constants/defaults.js.map +1 -0
  80. package/dist/constants/events.d.ts +16 -0
  81. package/dist/constants/events.d.ts.map +1 -0
  82. package/dist/constants/events.js +16 -0
  83. package/dist/constants/events.js.map +1 -0
  84. package/dist/constants/index.d.ts +4 -0
  85. package/dist/constants/index.d.ts.map +1 -0
  86. package/dist/constants/index.js +4 -0
  87. package/dist/constants/index.js.map +1 -0
  88. package/dist/constants/sandbox.d.ts +19 -0
  89. package/dist/constants/sandbox.d.ts.map +1 -0
  90. package/dist/constants/sandbox.js +24 -0
  91. package/dist/constants/sandbox.js.map +1 -0
  92. package/dist/core/createArtifactResponse.d.ts +5 -0
  93. package/dist/core/createArtifactResponse.d.ts.map +1 -0
  94. package/dist/core/createArtifactResponse.js +16 -0
  95. package/dist/core/createArtifactResponse.js.map +1 -0
  96. package/dist/core/createArtifactStream.d.ts +9 -0
  97. package/dist/core/createArtifactStream.d.ts.map +1 -0
  98. package/dist/core/createArtifactStream.js +34 -0
  99. package/dist/core/createArtifactStream.js.map +1 -0
  100. package/dist/core/createIds.d.ts +3 -0
  101. package/dist/core/createIds.d.ts.map +1 -0
  102. package/dist/core/createIds.js +13 -0
  103. package/dist/core/createIds.js.map +1 -0
  104. package/dist/core/index.d.ts +6 -0
  105. package/dist/core/index.d.ts.map +1 -0
  106. package/dist/core/index.js +6 -0
  107. package/dist/core/index.js.map +1 -0
  108. package/dist/core/lifecycle.d.ts +35 -0
  109. package/dist/core/lifecycle.d.ts.map +1 -0
  110. package/dist/core/lifecycle.js +81 -0
  111. package/dist/core/lifecycle.js.map +1 -0
  112. package/dist/core/parseArtifactEnvelope.d.ts +2 -0
  113. package/dist/core/parseArtifactEnvelope.d.ts.map +1 -0
  114. package/dist/core/parseArtifactEnvelope.js +3 -0
  115. package/dist/core/parseArtifactEnvelope.js.map +1 -0
  116. package/dist/errors/ArtifactParseError.d.ts +10 -0
  117. package/dist/errors/ArtifactParseError.d.ts.map +1 -0
  118. package/dist/errors/ArtifactParseError.js +10 -0
  119. package/dist/errors/ArtifactParseError.js.map +1 -0
  120. package/dist/errors/ClassificationError.d.ts +13 -0
  121. package/dist/errors/ClassificationError.d.ts.map +1 -0
  122. package/dist/errors/ClassificationError.js +13 -0
  123. package/dist/errors/ClassificationError.js.map +1 -0
  124. package/dist/errors/StreamError.d.ts +11 -0
  125. package/dist/errors/StreamError.d.ts.map +1 -0
  126. package/dist/errors/StreamError.js +11 -0
  127. package/dist/errors/StreamError.js.map +1 -0
  128. package/dist/errors/index.d.ts +4 -0
  129. package/dist/errors/index.d.ts.map +1 -0
  130. package/dist/errors/index.js +4 -0
  131. package/dist/errors/index.js.map +1 -0
  132. package/dist/iframe/HtmlArtifactCard.d.ts +9 -0
  133. package/dist/iframe/HtmlArtifactCard.d.ts.map +1 -0
  134. package/dist/iframe/HtmlArtifactCard.js +117 -0
  135. package/dist/iframe/HtmlArtifactCard.js.map +1 -0
  136. package/dist/iframe/HtmlArtifactCodeView.d.ts +7 -0
  137. package/dist/iframe/HtmlArtifactCodeView.d.ts.map +1 -0
  138. package/dist/iframe/HtmlArtifactCodeView.js +20 -0
  139. package/dist/iframe/HtmlArtifactCodeView.js.map +1 -0
  140. package/dist/iframe/HtmlArtifactModal.d.ts +16 -0
  141. package/dist/iframe/HtmlArtifactModal.d.ts.map +1 -0
  142. package/dist/iframe/HtmlArtifactModal.js +99 -0
  143. package/dist/iframe/HtmlArtifactModal.js.map +1 -0
  144. package/dist/iframe/HtmlArtifactPreview.d.ts +15 -0
  145. package/dist/iframe/HtmlArtifactPreview.d.ts.map +1 -0
  146. package/dist/iframe/HtmlArtifactPreview.js +214 -0
  147. package/dist/iframe/HtmlArtifactPreview.js.map +1 -0
  148. package/dist/iframe/HtmlArtifactToolbar.d.ts +20 -0
  149. package/dist/iframe/HtmlArtifactToolbar.d.ts.map +1 -0
  150. package/dist/iframe/HtmlArtifactToolbar.js +14 -0
  151. package/dist/iframe/HtmlArtifactToolbar.js.map +1 -0
  152. package/dist/iframe/iframeSizing.d.ts +22 -0
  153. package/dist/iframe/iframeSizing.d.ts.map +1 -0
  154. package/dist/iframe/iframeSizing.js +74 -0
  155. package/dist/iframe/iframeSizing.js.map +1 -0
  156. package/dist/iframe/iframeSrcDoc.d.ts +34 -0
  157. package/dist/iframe/iframeSrcDoc.d.ts.map +1 -0
  158. package/dist/iframe/iframeSrcDoc.js +236 -0
  159. package/dist/iframe/iframeSrcDoc.js.map +1 -0
  160. package/dist/iframe/index.d.ts +15 -0
  161. package/dist/iframe/index.d.ts.map +1 -0
  162. package/dist/iframe/index.js +9 -0
  163. package/dist/iframe/index.js.map +1 -0
  164. package/dist/iframe/styles.d.ts +10 -0
  165. package/dist/iframe/styles.d.ts.map +1 -0
  166. package/dist/iframe/styles.js +181 -0
  167. package/dist/iframe/styles.js.map +1 -0
  168. package/dist/index.d.ts +18 -0
  169. package/dist/index.d.ts.map +1 -0
  170. package/dist/index.js +22 -0
  171. package/dist/index.js.map +1 -0
  172. package/dist/prompts/htmlArtifactPrompt.d.ts +15 -0
  173. package/dist/prompts/htmlArtifactPrompt.d.ts.map +1 -0
  174. package/dist/prompts/htmlArtifactPrompt.js +248 -0
  175. package/dist/prompts/htmlArtifactPrompt.js.map +1 -0
  176. package/dist/prompts/index.d.ts +4 -0
  177. package/dist/prompts/index.d.ts.map +1 -0
  178. package/dist/prompts/index.js +4 -0
  179. package/dist/prompts/index.js.map +1 -0
  180. package/dist/prompts/markdownPrompt.d.ts +3 -0
  181. package/dist/prompts/markdownPrompt.d.ts.map +1 -0
  182. package/dist/prompts/markdownPrompt.js +10 -0
  183. package/dist/prompts/markdownPrompt.js.map +1 -0
  184. package/dist/prompts/systemPrompt.d.ts +3 -0
  185. package/dist/prompts/systemPrompt.d.ts.map +1 -0
  186. package/dist/prompts/systemPrompt.js +3 -0
  187. package/dist/prompts/systemPrompt.js.map +1 -0
  188. package/dist/sanitizer/dangerousPatterns.d.ts +41 -0
  189. package/dist/sanitizer/dangerousPatterns.d.ts.map +1 -0
  190. package/dist/sanitizer/dangerousPatterns.js +41 -0
  191. package/dist/sanitizer/dangerousPatterns.js.map +1 -0
  192. package/dist/sanitizer/index.d.ts +4 -0
  193. package/dist/sanitizer/index.d.ts.map +1 -0
  194. package/dist/sanitizer/index.js +4 -0
  195. package/dist/sanitizer/index.js.map +1 -0
  196. package/dist/sanitizer/sanitizeConfig.d.ts +4 -0
  197. package/dist/sanitizer/sanitizeConfig.d.ts.map +1 -0
  198. package/dist/sanitizer/sanitizeConfig.js +10 -0
  199. package/dist/sanitizer/sanitizeConfig.js.map +1 -0
  200. package/dist/sanitizer/sanitizeHtml.d.ts +20 -0
  201. package/dist/sanitizer/sanitizeHtml.d.ts.map +1 -0
  202. package/dist/sanitizer/sanitizeHtml.js +81 -0
  203. package/dist/sanitizer/sanitizeHtml.js.map +1 -0
  204. package/dist/server/config.d.ts +6 -0
  205. package/dist/server/config.d.ts.map +1 -0
  206. package/dist/server/config.js +68 -0
  207. package/dist/server/config.js.map +1 -0
  208. package/dist/server/createArtifactStreamResponse.d.ts +9 -0
  209. package/dist/server/createArtifactStreamResponse.d.ts.map +1 -0
  210. package/dist/server/createArtifactStreamResponse.js +104 -0
  211. package/dist/server/createArtifactStreamResponse.js.map +1 -0
  212. package/dist/server/createHtmlArtifactStream.d.ts +30 -0
  213. package/dist/server/createHtmlArtifactStream.d.ts.map +1 -0
  214. package/dist/server/createHtmlArtifactStream.js +115 -0
  215. package/dist/server/createHtmlArtifactStream.js.map +1 -0
  216. package/dist/server/createMarkdownStream.d.ts +13 -0
  217. package/dist/server/createMarkdownStream.d.ts.map +1 -0
  218. package/dist/server/createMarkdownStream.js +27 -0
  219. package/dist/server/createMarkdownStream.js.map +1 -0
  220. package/dist/server/createSseResponse.d.ts +7 -0
  221. package/dist/server/createSseResponse.d.ts.map +1 -0
  222. package/dist/server/createSseResponse.js +11 -0
  223. package/dist/server/createSseResponse.js.map +1 -0
  224. package/dist/server/index.d.ts +12 -0
  225. package/dist/server/index.d.ts.map +1 -0
  226. package/dist/server/index.js +12 -0
  227. package/dist/server/index.js.map +1 -0
  228. package/dist/server.d.ts +2 -0
  229. package/dist/server.d.ts.map +1 -0
  230. package/dist/server.js +3 -0
  231. package/dist/server.js.map +1 -0
  232. package/dist/stream/assembleDocument.d.ts +42 -0
  233. package/dist/stream/assembleDocument.d.ts.map +1 -0
  234. package/dist/stream/assembleDocument.js +104 -0
  235. package/dist/stream/assembleDocument.js.map +1 -0
  236. package/dist/stream/buffering.d.ts +37 -0
  237. package/dist/stream/buffering.d.ts.map +1 -0
  238. package/dist/stream/buffering.js +97 -0
  239. package/dist/stream/buffering.js.map +1 -0
  240. package/dist/stream/debounce.d.ts +12 -0
  241. package/dist/stream/debounce.d.ts.map +1 -0
  242. package/dist/stream/debounce.js +36 -0
  243. package/dist/stream/debounce.js.map +1 -0
  244. package/dist/stream/decoder.d.ts +17 -0
  245. package/dist/stream/decoder.d.ts.map +1 -0
  246. package/dist/stream/decoder.js +71 -0
  247. package/dist/stream/decoder.js.map +1 -0
  248. package/dist/stream/encoder.d.ts +12 -0
  249. package/dist/stream/encoder.d.ts.map +1 -0
  250. package/dist/stream/encoder.js +19 -0
  251. package/dist/stream/encoder.js.map +1 -0
  252. package/dist/stream/events.d.ts +20 -0
  253. package/dist/stream/events.d.ts.map +1 -0
  254. package/dist/stream/events.js +65 -0
  255. package/dist/stream/events.js.map +1 -0
  256. package/dist/stream/index.d.ts +9 -0
  257. package/dist/stream/index.d.ts.map +1 -0
  258. package/dist/stream/index.js +9 -0
  259. package/dist/stream/index.js.map +1 -0
  260. package/dist/stream/predictiveHtmlParser.d.ts +52 -0
  261. package/dist/stream/predictiveHtmlParser.d.ts.map +1 -0
  262. package/dist/stream/predictiveHtmlParser.js +252 -0
  263. package/dist/stream/predictiveHtmlParser.js.map +1 -0
  264. package/dist/stream/sse.d.ts +7 -0
  265. package/dist/stream/sse.d.ts.map +1 -0
  266. package/dist/stream/sse.js +33 -0
  267. package/dist/stream/sse.js.map +1 -0
  268. package/dist/types/artifact.d.ts +88 -0
  269. package/dist/types/artifact.d.ts.map +1 -0
  270. package/dist/types/artifact.js +2 -0
  271. package/dist/types/artifact.js.map +1 -0
  272. package/dist/types/client.d.ts +98 -0
  273. package/dist/types/client.d.ts.map +1 -0
  274. package/dist/types/client.js +2 -0
  275. package/dist/types/client.js.map +1 -0
  276. package/dist/types/config.d.ts +23 -0
  277. package/dist/types/config.d.ts.map +1 -0
  278. package/dist/types/config.js +2 -0
  279. package/dist/types/config.js.map +1 -0
  280. package/dist/types/errors.d.ts +9 -0
  281. package/dist/types/errors.d.ts.map +1 -0
  282. package/dist/types/errors.js +2 -0
  283. package/dist/types/errors.js.map +1 -0
  284. package/dist/types/index.d.ts +7 -0
  285. package/dist/types/index.d.ts.map +1 -0
  286. package/dist/types/index.js +2 -0
  287. package/dist/types/index.js.map +1 -0
  288. package/dist/types/server.d.ts +111 -0
  289. package/dist/types/server.d.ts.map +1 -0
  290. package/dist/types/server.js +2 -0
  291. package/dist/types/server.js.map +1 -0
  292. package/dist/types/stream.d.ts +60 -0
  293. package/dist/types/stream.d.ts.map +1 -0
  294. package/dist/types/stream.js +7 -0
  295. package/dist/types/stream.js.map +1 -0
  296. package/dist/utils/index.d.ts +6 -0
  297. package/dist/utils/index.d.ts.map +1 -0
  298. package/dist/utils/index.js +6 -0
  299. package/dist/utils/index.js.map +1 -0
  300. package/dist/utils/invariant.d.ts +6 -0
  301. package/dist/utils/invariant.d.ts.map +1 -0
  302. package/dist/utils/invariant.js +10 -0
  303. package/dist/utils/invariant.js.map +1 -0
  304. package/dist/utils/isBrowser.d.ts +3 -0
  305. package/dist/utils/isBrowser.d.ts.map +1 -0
  306. package/dist/utils/isBrowser.js +3 -0
  307. package/dist/utils/isBrowser.js.map +1 -0
  308. package/dist/utils/mergeConfig.d.ts +6 -0
  309. package/dist/utils/mergeConfig.d.ts.map +1 -0
  310. package/dist/utils/mergeConfig.js +17 -0
  311. package/dist/utils/mergeConfig.js.map +1 -0
  312. package/dist/utils/noop.d.ts +3 -0
  313. package/dist/utils/noop.d.ts.map +1 -0
  314. package/dist/utils/noop.js +3 -0
  315. package/dist/utils/noop.js.map +1 -0
  316. package/dist/utils/safeJsonParse.d.ts +7 -0
  317. package/dist/utils/safeJsonParse.d.ts.map +1 -0
  318. package/dist/utils/safeJsonParse.js +62 -0
  319. package/dist/utils/safeJsonParse.js.map +1 -0
  320. package/dist-cjs/artifacts/artifactEnvelope.js +224 -0
  321. package/dist-cjs/artifacts/artifactEnvelope.js.map +1 -0
  322. package/dist-cjs/artifacts/artifactStatus.js +14 -0
  323. package/dist-cjs/artifacts/artifactStatus.js.map +1 -0
  324. package/dist-cjs/artifacts/artifactStore.js +39 -0
  325. package/dist-cjs/artifacts/artifactStore.js.map +1 -0
  326. package/dist-cjs/artifacts/htmlArtifact.js +24 -0
  327. package/dist-cjs/artifacts/htmlArtifact.js.map +1 -0
  328. package/dist-cjs/artifacts/index.js +21 -0
  329. package/dist-cjs/artifacts/index.js.map +1 -0
  330. package/dist-cjs/circuit-breaker/circuitBreaker.js +63 -0
  331. package/dist-cjs/circuit-breaker/circuitBreaker.js.map +1 -0
  332. package/dist-cjs/circuit-breaker/index.js +19 -0
  333. package/dist-cjs/circuit-breaker/index.js.map +1 -0
  334. package/dist-cjs/circuit-breaker/memoryCircuitStore.js +16 -0
  335. package/dist-cjs/circuit-breaker/memoryCircuitStore.js.map +1 -0
  336. package/dist-cjs/classifier/classifierPrompt.js +47 -0
  337. package/dist-cjs/classifier/classifierPrompt.js.map +1 -0
  338. package/dist-cjs/classifier/classifyMode.js +53 -0
  339. package/dist-cjs/classifier/classifyMode.js.map +1 -0
  340. package/dist-cjs/classifier/index.js +20 -0
  341. package/dist-cjs/classifier/index.js.map +1 -0
  342. package/dist-cjs/classifier/rules.js +121 -0
  343. package/dist-cjs/classifier/rules.js.map +1 -0
  344. package/dist-cjs/client/ArtifactChat.js +98 -0
  345. package/dist-cjs/client/ArtifactChat.js.map +1 -0
  346. package/dist-cjs/client/ArtifactMessage.js +32 -0
  347. package/dist-cjs/client/ArtifactMessage.js.map +1 -0
  348. package/dist-cjs/client/MarkdownMessage.js +177 -0
  349. package/dist-cjs/client/MarkdownMessage.js.map +1 -0
  350. package/dist-cjs/client/index.js +20 -0
  351. package/dist-cjs/client/index.js.map +1 -0
  352. package/dist-cjs/client/useArtifactStream.js +246 -0
  353. package/dist-cjs/client/useArtifactStream.js.map +1 -0
  354. package/dist-cjs/client.js +20 -0
  355. package/dist-cjs/client.js.map +1 -0
  356. package/dist-cjs/constants/defaults.js +41 -0
  357. package/dist-cjs/constants/defaults.js.map +1 -0
  358. package/dist-cjs/constants/events.js +19 -0
  359. package/dist-cjs/constants/events.js.map +1 -0
  360. package/dist-cjs/constants/index.js +20 -0
  361. package/dist-cjs/constants/index.js.map +1 -0
  362. package/dist-cjs/constants/sandbox.js +27 -0
  363. package/dist-cjs/constants/sandbox.js.map +1 -0
  364. package/dist-cjs/core/createArtifactResponse.js +20 -0
  365. package/dist-cjs/core/createArtifactResponse.js.map +1 -0
  366. package/dist-cjs/core/createArtifactStream.js +37 -0
  367. package/dist-cjs/core/createArtifactStream.js.map +1 -0
  368. package/dist-cjs/core/createIds.js +17 -0
  369. package/dist-cjs/core/createIds.js.map +1 -0
  370. package/dist-cjs/core/index.js +22 -0
  371. package/dist-cjs/core/index.js.map +1 -0
  372. package/dist-cjs/core/lifecycle.js +86 -0
  373. package/dist-cjs/core/lifecycle.js.map +1 -0
  374. package/dist-cjs/core/parseArtifactEnvelope.js +8 -0
  375. package/dist-cjs/core/parseArtifactEnvelope.js.map +1 -0
  376. package/dist-cjs/errors/ArtifactParseError.js +14 -0
  377. package/dist-cjs/errors/ArtifactParseError.js.map +1 -0
  378. package/dist-cjs/errors/ClassificationError.js +17 -0
  379. package/dist-cjs/errors/ClassificationError.js.map +1 -0
  380. package/dist-cjs/errors/StreamError.js +15 -0
  381. package/dist-cjs/errors/StreamError.js.map +1 -0
  382. package/dist-cjs/errors/index.js +20 -0
  383. package/dist-cjs/errors/index.js.map +1 -0
  384. package/dist-cjs/iframe/HtmlArtifactCard.js +153 -0
  385. package/dist-cjs/iframe/HtmlArtifactCard.js.map +1 -0
  386. package/dist-cjs/iframe/HtmlArtifactCodeView.js +23 -0
  387. package/dist-cjs/iframe/HtmlArtifactCodeView.js.map +1 -0
  388. package/dist-cjs/iframe/HtmlArtifactModal.js +135 -0
  389. package/dist-cjs/iframe/HtmlArtifactModal.js.map +1 -0
  390. package/dist-cjs/iframe/HtmlArtifactPreview.js +250 -0
  391. package/dist-cjs/iframe/HtmlArtifactPreview.js.map +1 -0
  392. package/dist-cjs/iframe/HtmlArtifactToolbar.js +17 -0
  393. package/dist-cjs/iframe/HtmlArtifactToolbar.js.map +1 -0
  394. package/dist-cjs/iframe/iframeSizing.js +77 -0
  395. package/dist-cjs/iframe/iframeSizing.js.map +1 -0
  396. package/dist-cjs/iframe/iframeSrcDoc.js +241 -0
  397. package/dist-cjs/iframe/iframeSrcDoc.js.map +1 -0
  398. package/dist-cjs/iframe/index.js +22 -0
  399. package/dist-cjs/iframe/index.js.map +1 -0
  400. package/dist-cjs/iframe/styles.js +218 -0
  401. package/dist-cjs/iframe/styles.js.map +1 -0
  402. package/dist-cjs/index.js +52 -0
  403. package/dist-cjs/index.js.map +1 -0
  404. package/dist-cjs/package.json +3 -0
  405. package/dist-cjs/prompts/htmlArtifactPrompt.js +252 -0
  406. package/dist-cjs/prompts/htmlArtifactPrompt.js.map +1 -0
  407. package/dist-cjs/prompts/index.js +20 -0
  408. package/dist-cjs/prompts/index.js.map +1 -0
  409. package/dist-cjs/prompts/markdownPrompt.js +13 -0
  410. package/dist-cjs/prompts/markdownPrompt.js.map +1 -0
  411. package/dist-cjs/prompts/systemPrompt.js +6 -0
  412. package/dist-cjs/prompts/systemPrompt.js.map +1 -0
  413. package/dist-cjs/sanitizer/dangerousPatterns.js +44 -0
  414. package/dist-cjs/sanitizer/dangerousPatterns.js.map +1 -0
  415. package/dist-cjs/sanitizer/index.js +43 -0
  416. package/dist-cjs/sanitizer/index.js.map +1 -0
  417. package/dist-cjs/sanitizer/sanitizeConfig.js +13 -0
  418. package/dist-cjs/sanitizer/sanitizeConfig.js.map +1 -0
  419. package/dist-cjs/sanitizer/sanitizeHtml.js +86 -0
  420. package/dist-cjs/sanitizer/sanitizeHtml.js.map +1 -0
  421. package/dist-cjs/server/config.js +72 -0
  422. package/dist-cjs/server/config.js.map +1 -0
  423. package/dist-cjs/server/createArtifactStreamResponse.js +107 -0
  424. package/dist-cjs/server/createArtifactStreamResponse.js.map +1 -0
  425. package/dist-cjs/server/createHtmlArtifactStream.js +119 -0
  426. package/dist-cjs/server/createHtmlArtifactStream.js.map +1 -0
  427. package/dist-cjs/server/createMarkdownStream.js +31 -0
  428. package/dist-cjs/server/createMarkdownStream.js.map +1 -0
  429. package/dist-cjs/server/createSseResponse.js +14 -0
  430. package/dist-cjs/server/createSseResponse.js.map +1 -0
  431. package/dist-cjs/server/index.js +34 -0
  432. package/dist-cjs/server/index.js.map +1 -0
  433. package/dist-cjs/server.js +19 -0
  434. package/dist-cjs/server.js.map +1 -0
  435. package/dist-cjs/stream/assembleDocument.js +109 -0
  436. package/dist-cjs/stream/assembleDocument.js.map +1 -0
  437. package/dist-cjs/stream/buffering.js +102 -0
  438. package/dist-cjs/stream/buffering.js.map +1 -0
  439. package/dist-cjs/stream/debounce.js +39 -0
  440. package/dist-cjs/stream/debounce.js.map +1 -0
  441. package/dist-cjs/stream/decoder.js +75 -0
  442. package/dist-cjs/stream/decoder.js.map +1 -0
  443. package/dist-cjs/stream/encoder.js +24 -0
  444. package/dist-cjs/stream/encoder.js.map +1 -0
  445. package/dist-cjs/stream/events.js +69 -0
  446. package/dist-cjs/stream/events.js.map +1 -0
  447. package/dist-cjs/stream/index.js +25 -0
  448. package/dist-cjs/stream/index.js.map +1 -0
  449. package/dist-cjs/stream/predictiveHtmlParser.js +256 -0
  450. package/dist-cjs/stream/predictiveHtmlParser.js.map +1 -0
  451. package/dist-cjs/stream/sse.js +36 -0
  452. package/dist-cjs/stream/sse.js.map +1 -0
  453. package/dist-cjs/types/artifact.js +3 -0
  454. package/dist-cjs/types/artifact.js.map +1 -0
  455. package/dist-cjs/types/client.js +3 -0
  456. package/dist-cjs/types/client.js.map +1 -0
  457. package/dist-cjs/types/config.js +3 -0
  458. package/dist-cjs/types/config.js.map +1 -0
  459. package/dist-cjs/types/errors.js +3 -0
  460. package/dist-cjs/types/errors.js.map +1 -0
  461. package/dist-cjs/types/index.js +3 -0
  462. package/dist-cjs/types/index.js.map +1 -0
  463. package/dist-cjs/types/server.js +3 -0
  464. package/dist-cjs/types/server.js.map +1 -0
  465. package/dist-cjs/types/stream.js +8 -0
  466. package/dist-cjs/types/stream.js.map +1 -0
  467. package/dist-cjs/utils/index.js +22 -0
  468. package/dist-cjs/utils/index.js.map +1 -0
  469. package/dist-cjs/utils/invariant.js +13 -0
  470. package/dist-cjs/utils/invariant.js.map +1 -0
  471. package/dist-cjs/utils/isBrowser.js +6 -0
  472. package/dist-cjs/utils/isBrowser.js.map +1 -0
  473. package/dist-cjs/utils/mergeConfig.js +20 -0
  474. package/dist-cjs/utils/mergeConfig.js.map +1 -0
  475. package/dist-cjs/utils/noop.js +7 -0
  476. package/dist-cjs/utils/noop.js.map +1 -0
  477. package/dist-cjs/utils/safeJsonParse.js +65 -0
  478. package/dist-cjs/utils/safeJsonParse.js.map +1 -0
  479. package/package.json +115 -0
@@ -0,0 +1,104 @@
1
+ import { cleanArtifactHtml } from "../artifacts/artifactEnvelope.js";
2
+ import { PredictiveHtmlParser } from "./predictiveHtmlParser.js";
3
+ export function assembleStreamingHtml(partial) {
4
+ if (typeof partial !== "string") {
5
+ return { html: "", complete: false, renderable: false };
6
+ }
7
+ const source = cleanArtifactHtml(partial);
8
+ if (source.trim() === "") {
9
+ return { html: "", complete: false, renderable: false };
10
+ }
11
+ try {
12
+ const parser = new PredictiveHtmlParser();
13
+ const html = parser.push(source);
14
+ return {
15
+ html,
16
+ complete: parser.complete,
17
+ renderable: parser.isRenderable(),
18
+ };
19
+ }
20
+ catch {
21
+ return { html: partial, complete: false, renderable: true };
22
+ }
23
+ }
24
+ /**
25
+ * Incremental, stateful counterpart to {@link assembleStreamingHtml}. Holds one
26
+ * {@link PredictiveHtmlParser} across the whole stream and feeds it only the
27
+ * newly-arrived tail on each {@link update}, so total parse cost is O(n) over
28
+ * the stream instead of O(n²) (one-shot re-parses everything every frame).
29
+ *
30
+ * Pass the full accumulated raw HTML received so far on every call — the
31
+ * projector slices off whatever it hasn't consumed yet, so skipped/throttled
32
+ * frames are fine: the next call simply catches up on the larger tail. The
33
+ * input is expected to be append-only; if a shorter, non-prefix string arrives
34
+ * (a reset/new artifact) the projector re-syncs from scratch.
35
+ */
36
+ export class StreamingHtmlProjector {
37
+ parser = new PredictiveHtmlParser();
38
+ /** Offset in the raw stream where real content begins (-1 = undecided). */
39
+ start = -1;
40
+ /** Chars of the content region (raw.slice(start)) already pushed. */
41
+ fed = 0;
42
+ lastRaw = "";
43
+ /** Feed the full accumulated raw HTML; returns the current projection. */
44
+ update(raw) {
45
+ if (typeof raw !== "string" || raw === "") {
46
+ return { html: "", complete: false, renderable: false };
47
+ }
48
+ // Re-sync if the stream isn't an append of what we've seen (reset/replace).
49
+ if (!raw.startsWith(this.lastRaw))
50
+ this.reset();
51
+ this.lastRaw = raw;
52
+ if (this.start === -1) {
53
+ const resolved = resolveContentStart(raw);
54
+ if (resolved === -1) {
55
+ // Leading whitespace/fence not yet resolvable — nothing safe to render.
56
+ return { html: "", complete: false, renderable: false };
57
+ }
58
+ this.start = resolved;
59
+ }
60
+ const content = raw.slice(this.start);
61
+ if (content.length > this.fed) {
62
+ const delta = content.slice(this.fed);
63
+ this.fed = content.length;
64
+ try {
65
+ this.parser.push(delta);
66
+ }
67
+ catch {
68
+ // PredictiveHtmlParser fails open internally; guard defensively.
69
+ }
70
+ }
71
+ return {
72
+ html: this.parser.render(),
73
+ complete: this.parser.complete,
74
+ renderable: this.parser.isRenderable(),
75
+ };
76
+ }
77
+ reset() {
78
+ this.parser.reset();
79
+ this.start = -1;
80
+ this.fed = 0;
81
+ this.lastRaw = "";
82
+ }
83
+ }
84
+ /**
85
+ * Where real artifact content starts in the raw stream: past leading
86
+ * whitespace, and past a single opening ```/```html code fence if the model
87
+ * wrapped its output. Returns -1 while the answer can't be determined yet
88
+ * (buffer is all whitespace, or a fence opener whose newline hasn't arrived).
89
+ */
90
+ function resolveContentStart(raw) {
91
+ let i = 0;
92
+ while (i < raw.length && /\s/.test(raw[i]))
93
+ i++;
94
+ if (i >= raw.length)
95
+ return -1; // all whitespace so far — wait
96
+ if (raw.startsWith("```", i)) {
97
+ const nl = raw.indexOf("\n", i);
98
+ if (nl === -1)
99
+ return -1; // fence opener incomplete — wait
100
+ return nl + 1;
101
+ }
102
+ return i;
103
+ }
104
+ //# sourceMappingURL=assembleDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembleDocument.js","sourceRoot":"","sources":["../../src/stream/assembleDocument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Accumulates streamed artifact deltas and tracks the last *renderable*
3
+ * snapshot. Partial HTML mid-stream is frequently broken; the predictive parser
4
+ * repairs the current frontier into a temporary valid projection, while keeping
5
+ * the raw stream as the source of truth for final output and code view.
6
+ */
7
+ export declare class ArtifactBuffer {
8
+ private chunks;
9
+ private joined;
10
+ private dirty;
11
+ private _lastValidSnapshot;
12
+ /** Append a streamed delta. */
13
+ append(delta: string): void;
14
+ /** The full aggregated raw HTML received so far. */
15
+ get raw(): string;
16
+ /** The last snapshot that passed the renderable heuristic. */
17
+ get lastValidSnapshot(): string;
18
+ /**
19
+ * Promote the current buffer to a snapshot if the predictive parser says
20
+ * there is visible body content. Returns the snapshot that should be
21
+ * displayed (new one if renderable, else the last good one). Pass an explicit
22
+ * `html` to commit a known-good final document.
23
+ */
24
+ commit(html?: string): string;
25
+ /** Force-set the final snapshot (used on `artifact_done`). */
26
+ finalize(html: string): string;
27
+ reset(): void;
28
+ }
29
+ /**
30
+ * Heuristic: is this partial HTML safe enough to drop into an iframe without
31
+ * obvious breakage? We require that we are not in the middle of an open tag,
32
+ * not inside an unterminated `<style>` block, and not mid-way through an HTML
33
+ * entity. This is intentionally conservative — false negatives just mean we
34
+ * wait for the next chunk.
35
+ */
36
+ export declare function looksRenderable(html: string): boolean;
37
+ //# sourceMappingURL=buffering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffering.d.ts","sourceRoot":"","sources":["../../src/stream/buffering.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,kBAAkB,CAAM;IAEhC,+BAA+B;IAC/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM3B,oDAAoD;IACpD,IAAI,GAAG,IAAI,MAAM,CAMhB;IAED,8DAA8D;IAC9D,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAc7B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS9B,KAAK,IAAI,IAAI;CAMd;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBrD"}
@@ -0,0 +1,97 @@
1
+ import { cleanArtifactHtml } from "../artifacts/artifactEnvelope.js";
2
+ import { assembleStreamingHtml } from "./assembleDocument.js";
3
+ /**
4
+ * Accumulates streamed artifact deltas and tracks the last *renderable*
5
+ * snapshot. Partial HTML mid-stream is frequently broken; the predictive parser
6
+ * repairs the current frontier into a temporary valid projection, while keeping
7
+ * the raw stream as the source of truth for final output and code view.
8
+ */
9
+ export class ArtifactBuffer {
10
+ chunks = [];
11
+ joined = "";
12
+ dirty = false;
13
+ _lastValidSnapshot = "";
14
+ /** Append a streamed delta. */
15
+ append(delta) {
16
+ if (!delta)
17
+ return;
18
+ this.chunks.push(delta);
19
+ this.dirty = true;
20
+ }
21
+ /** The full aggregated raw HTML received so far. */
22
+ get raw() {
23
+ if (this.dirty) {
24
+ this.joined = this.chunks.join("");
25
+ this.dirty = false;
26
+ }
27
+ return this.joined;
28
+ }
29
+ /** The last snapshot that passed the renderable heuristic. */
30
+ get lastValidSnapshot() {
31
+ return this._lastValidSnapshot;
32
+ }
33
+ /**
34
+ * Promote the current buffer to a snapshot if the predictive parser says
35
+ * there is visible body content. Returns the snapshot that should be
36
+ * displayed (new one if renderable, else the last good one). Pass an explicit
37
+ * `html` to commit a known-good final document.
38
+ */
39
+ commit(html) {
40
+ const candidate = cleanArtifactHtml(html ?? this.raw);
41
+ if (html !== undefined) {
42
+ this._lastValidSnapshot = candidate;
43
+ return this._lastValidSnapshot;
44
+ }
45
+ const assembled = assembleStreamingHtml(candidate);
46
+ if (assembled.renderable) {
47
+ this._lastValidSnapshot = assembled.html;
48
+ }
49
+ return this._lastValidSnapshot;
50
+ }
51
+ /** Force-set the final snapshot (used on `artifact_done`). */
52
+ finalize(html) {
53
+ const finalHtml = cleanArtifactHtml(html);
54
+ this._lastValidSnapshot = finalHtml;
55
+ this.chunks = [finalHtml];
56
+ this.joined = finalHtml;
57
+ this.dirty = false;
58
+ return finalHtml;
59
+ }
60
+ reset() {
61
+ this.chunks = [];
62
+ this.joined = "";
63
+ this.dirty = false;
64
+ this._lastValidSnapshot = "";
65
+ }
66
+ }
67
+ /**
68
+ * Heuristic: is this partial HTML safe enough to drop into an iframe without
69
+ * obvious breakage? We require that we are not in the middle of an open tag,
70
+ * not inside an unterminated `<style>` block, and not mid-way through an HTML
71
+ * entity. This is intentionally conservative — false negatives just mean we
72
+ * wait for the next chunk.
73
+ */
74
+ export function looksRenderable(html) {
75
+ if (!html)
76
+ return false;
77
+ // Don't render while sitting inside an unclosed tag: last '<' after last '>'.
78
+ const lastOpen = html.lastIndexOf("<");
79
+ const lastClose = html.lastIndexOf(">");
80
+ if (lastOpen > lastClose)
81
+ return false;
82
+ // Balanced <style> blocks.
83
+ const styleOpen = countMatches(html, /<style[\s>]/gi);
84
+ const styleClose = countMatches(html, /<\/style>/gi);
85
+ if (styleOpen !== styleClose)
86
+ return false;
87
+ // Not mid-entity (e.g. "&amp" without ";").
88
+ const trailingEntity = /&[a-z0-9#]*$/i.test(html);
89
+ if (trailingEntity)
90
+ return false;
91
+ return true;
92
+ }
93
+ function countMatches(input, pattern) {
94
+ const matches = input.match(pattern);
95
+ return matches ? matches.length : 0;
96
+ }
97
+ //# sourceMappingURL=buffering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffering.js","sourceRoot":"","sources":["../../src/stream/buffering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,GAAa,EAAE,CAAC;IACtB,MAAM,GAAG,EAAE,CAAC;IACZ,KAAK,GAAG,KAAK,CAAC;IACd,kBAAkB,GAAG,EAAE,CAAC;IAEhC,+BAA+B;IAC/B,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,oDAAoD;IACpD,IAAI,GAAG;QACL,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,8DAA8D;IAC9D,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAa;QAClB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACjC,CAAC;QAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,8DAA8D;IAC9D,QAAQ,CAAC,IAAY;QACnB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;IAC/B,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,QAAQ,GAAG,SAAS;QAAE,OAAO,KAAK,CAAC;IAEvC,2BAA2B;IAC3B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACrD,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAE3C,4CAA4C;IAC5C,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,cAAc;QAAE,OAAO,KAAK,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,OAAe;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Trailing-edge debounce. Returns a wrapped function plus `flush` (run now)
3
+ * and `cancel` (drop the pending call). Used to throttle iframe srcDoc updates
4
+ * while artifact deltas stream in.
5
+ */
6
+ export interface Debounced<A extends unknown[]> {
7
+ (...args: A): void;
8
+ flush: () => void;
9
+ cancel: () => void;
10
+ }
11
+ export declare function debounce<A extends unknown[]>(fn: (...args: A) => void, waitMs: number): Debounced<A>;
12
+ //# sourceMappingURL=debounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/stream/debounce.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE;IAC5C,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAC1C,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,EACxB,MAAM,EAAE,MAAM,GACb,SAAS,CAAC,CAAC,CAAC,CAsCd"}
@@ -0,0 +1,36 @@
1
+ export function debounce(fn, waitMs) {
2
+ let timer = null;
3
+ let lastArgs = null;
4
+ const run = () => {
5
+ if (lastArgs) {
6
+ const args = lastArgs;
7
+ lastArgs = null;
8
+ fn(...args);
9
+ }
10
+ };
11
+ const debounced = ((...args) => {
12
+ lastArgs = args;
13
+ if (timer)
14
+ clearTimeout(timer);
15
+ timer = setTimeout(() => {
16
+ timer = null;
17
+ run();
18
+ }, waitMs);
19
+ });
20
+ debounced.flush = () => {
21
+ if (timer) {
22
+ clearTimeout(timer);
23
+ timer = null;
24
+ }
25
+ run();
26
+ };
27
+ debounced.cancel = () => {
28
+ if (timer) {
29
+ clearTimeout(timer);
30
+ timer = null;
31
+ }
32
+ lastArgs = null;
33
+ };
34
+ return debounced;
35
+ }
36
+ //# sourceMappingURL=debounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/stream/debounce.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,QAAQ,CACtB,EAAwB,EACxB,MAAc;IAEd,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,QAAQ,GAAa,IAAI,CAAC;IAE9B,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,QAAQ,CAAC;YACtB,QAAQ,GAAG,IAAI,CAAC;YAChB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,IAAO,EAAE,EAAE;QAChC,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,GAAG,EAAE,CAAC;QACR,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAiB,CAAC;IAEnB,SAAS,CAAC,KAAK,GAAG,GAAG,EAAE;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QACD,GAAG,EAAE,CAAC;IACR,CAAC,CAAC;IAEF,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE;QACtB,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ArtifactStreamEvent } from "../types/stream.js";
2
+ /**
3
+ * Incremental SSE decoder. Feed it raw text chunks; it returns any complete
4
+ * protocol events found so far. Frames are separated by a blank line and the
5
+ * payload lives on `data:` lines (concatenated per the SSE spec).
6
+ */
7
+ export declare class SseDecoder {
8
+ private buffer;
9
+ /** Push a chunk of text and drain any complete events. */
10
+ push(chunk: string): ArtifactStreamEvent[];
11
+ /** Drain any trailing buffered frame at end-of-stream. */
12
+ flush(): ArtifactStreamEvent[];
13
+ private frameSeparatorLen;
14
+ private indexOfFrameEnd;
15
+ private parseFrame;
16
+ }
17
+ //# sourceMappingURL=decoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/stream/decoder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAM;IAEpB,0DAA0D;IAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAgB1C,0DAA0D;IAC1D,KAAK,IAAI,mBAAmB,EAAE;IAQ9B,OAAO,CAAC,iBAAiB,CAAK;IAE9B,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,UAAU;CAsBnB"}
@@ -0,0 +1,71 @@
1
+ import { safeJsonParse } from "../utils/safeJsonParse.js";
2
+ import { isArtifactStreamEvent } from "./events.js";
3
+ /**
4
+ * Incremental SSE decoder. Feed it raw text chunks; it returns any complete
5
+ * protocol events found so far. Frames are separated by a blank line and the
6
+ * payload lives on `data:` lines (concatenated per the SSE spec).
7
+ */
8
+ export class SseDecoder {
9
+ buffer = "";
10
+ /** Push a chunk of text and drain any complete events. */
11
+ push(chunk) {
12
+ this.buffer += chunk;
13
+ const events = [];
14
+ // Normalize CRLF so the split is reliable across platforms.
15
+ let separatorIndex;
16
+ while ((separatorIndex = this.indexOfFrameEnd()) !== -1) {
17
+ const rawFrame = this.buffer.slice(0, separatorIndex);
18
+ this.buffer = this.buffer.slice(separatorIndex + this.frameSeparatorLen);
19
+ const parsed = this.parseFrame(rawFrame);
20
+ if (parsed)
21
+ events.push(parsed);
22
+ }
23
+ return events;
24
+ }
25
+ /** Drain any trailing buffered frame at end-of-stream. */
26
+ flush() {
27
+ const remaining = this.buffer.trim();
28
+ this.buffer = "";
29
+ if (!remaining)
30
+ return [];
31
+ const parsed = this.parseFrame(remaining);
32
+ return parsed ? [parsed] : [];
33
+ }
34
+ frameSeparatorLen = 2;
35
+ indexOfFrameEnd() {
36
+ const lf = this.buffer.indexOf("\n\n");
37
+ const crlf = this.buffer.indexOf("\r\n\r\n");
38
+ if (crlf !== -1 && (lf === -1 || crlf < lf)) {
39
+ this.frameSeparatorLen = 4;
40
+ return crlf;
41
+ }
42
+ if (lf !== -1) {
43
+ this.frameSeparatorLen = 2;
44
+ return lf;
45
+ }
46
+ return -1;
47
+ }
48
+ parseFrame(frame) {
49
+ const dataLines = [];
50
+ for (const rawLine of frame.split(/\r?\n/)) {
51
+ const line = rawLine;
52
+ if (line.startsWith(":"))
53
+ continue; // comment / heartbeat
54
+ if (line.startsWith("data:")) {
55
+ dataLines.push(line.slice(5).replace(/^ /, ""));
56
+ }
57
+ }
58
+ if (dataLines.length === 0)
59
+ return null;
60
+ const payload = dataLines.join("\n");
61
+ const parsed = safeJsonParse(payload, null);
62
+ if (!isArtifactStreamEvent(parsed))
63
+ return null;
64
+ if (parsed.type === "mode" &&
65
+ parsed.mode === "html_artifact") {
66
+ return { type: "mode", mode: "artifact" };
67
+ }
68
+ return parsed;
69
+ }
70
+ }
71
+ //# sourceMappingURL=decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../src/stream/decoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,GAAG,EAAE,CAAC;IAEpB,0DAA0D;IAC1D,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,4DAA4D;QAC5D,IAAI,cAAsB,CAAC;QAC3B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0DAA0D;IAC1D,KAAK;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC;IAEO,iBAAiB,GAAG,CAAC,CAAC;IAEtB,eAAe;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,OAAO,CAAC;YACrB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,sBAAsB;YAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,aAAa,CAAU,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,IACE,MAAM,CAAC,IAAI,KAAK,MAAM;YACrB,MAA6B,CAAC,IAAI,KAAK,eAAe,EACvD,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ArtifactStreamEvent } from "../types/stream.js";
2
+ /**
3
+ * Serialize a protocol event into a single SSE frame. The whole protocol uses
4
+ * one named event (`artifact`) and JSON-encodes the payload on the `data:`
5
+ * line, which keeps multi-line HTML safe (no raw newlines reach the wire).
6
+ */
7
+ export declare function encodeSseEvent(event: ArtifactStreamEvent): string;
8
+ /** Encode an event directly to bytes for a `ReadableStream<Uint8Array>`. */
9
+ export declare function encodeSseEventBytes(event: ArtifactStreamEvent, encoder?: TextEncoder): Uint8Array;
10
+ /** A comment frame used as a keep-alive heartbeat. */
11
+ export declare function encodeSseComment(text?: string): string;
12
+ //# sourceMappingURL=encoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../src/stream/encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAGjE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,WAA+B,GACvC,UAAU,CAEZ;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,IAAI,SAAe,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,19 @@
1
+ import { SSE_EVENT_NAME } from "../constants/events.js";
2
+ /**
3
+ * Serialize a protocol event into a single SSE frame. The whole protocol uses
4
+ * one named event (`artifact`) and JSON-encodes the payload on the `data:`
5
+ * line, which keeps multi-line HTML safe (no raw newlines reach the wire).
6
+ */
7
+ export function encodeSseEvent(event) {
8
+ const data = JSON.stringify(event);
9
+ return `event: ${SSE_EVENT_NAME}\ndata: ${data}\n\n`;
10
+ }
11
+ /** Encode an event directly to bytes for a `ReadableStream<Uint8Array>`. */
12
+ export function encodeSseEventBytes(event, encoder = new TextEncoder()) {
13
+ return encoder.encode(encodeSseEvent(event));
14
+ }
15
+ /** A comment frame used as a keep-alive heartbeat. */
16
+ export function encodeSseComment(text = "keep-alive") {
17
+ return `: ${text}\n\n`;
18
+ }
19
+ //# sourceMappingURL=encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../src/stream/encoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,UAAU,cAAc,WAAW,IAAI,MAAM,CAAC;AACvD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,UAAuB,IAAI,WAAW,EAAE;IAExC,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAC,IAAI,GAAG,YAAY;IAClD,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ArtifactKind, ArtifactMode, ArtifactStreamEvent } from "../types/stream.js";
2
+ /**
3
+ * Typed factory helpers for every protocol event. Using these keeps the
4
+ * server producer honest and gives the client exhaustive types.
5
+ */
6
+ export declare const event: {
7
+ mode: (mode: ArtifactMode) => ArtifactStreamEvent;
8
+ messageStart: (messageId: string) => ArtifactStreamEvent;
9
+ messageDelta: (messageId: string, delta: string) => ArtifactStreamEvent;
10
+ messageDone: (messageId: string, content: string) => ArtifactStreamEvent;
11
+ artifactStart: (artifactId: string, title: string, artifactType?: ArtifactKind) => ArtifactStreamEvent;
12
+ artifactDelta: (artifactId: string, delta: string) => ArtifactStreamEvent;
13
+ artifactSnapshot: (artifactId: string, html: string) => ArtifactStreamEvent;
14
+ artifactDone: (artifactId: string, html: string) => ArtifactStreamEvent;
15
+ error: (message: string, recoverable?: boolean) => ArtifactStreamEvent;
16
+ done: () => ArtifactStreamEvent;
17
+ };
18
+ /** Runtime guard that an unknown value is a protocol event. */
19
+ export declare function isArtifactStreamEvent(value: unknown): value is ArtifactStreamEvent;
20
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/stream/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,eAAO,MAAM,KAAK;iBACH,YAAY,KAAG,mBAAmB;8BAErB,MAAM,KAAG,mBAAmB;8BAK5B,MAAM,SAAS,MAAM,KAAG,mBAAmB;6BAM5C,MAAM,WAAW,MAAM,KAAG,mBAAmB;gCAOxD,MAAM,SACX,MAAM,iBACC,YAAY,KACzB,mBAAmB;gCAOM,MAAM,SAAS,MAAM,KAAG,mBAAmB;mCAMxC,MAAM,QAAQ,MAAM,KAAG,mBAAmB;+BAM9C,MAAM,QAAQ,MAAM,KAAG,mBAAmB;qBAMpD,MAAM,4BAAuB,mBAAmB;gBAMvD,mBAAmB;CAC9B,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAe9B"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Typed factory helpers for every protocol event. Using these keeps the
3
+ * server producer honest and gives the client exhaustive types.
4
+ */
5
+ export const event = {
6
+ mode: (mode) => ({ type: "mode", mode }),
7
+ messageStart: (messageId) => ({
8
+ type: "message_start",
9
+ messageId,
10
+ }),
11
+ messageDelta: (messageId, delta) => ({
12
+ type: "message_delta",
13
+ messageId,
14
+ delta,
15
+ }),
16
+ messageDone: (messageId, content) => ({
17
+ type: "message_done",
18
+ messageId,
19
+ content,
20
+ }),
21
+ artifactStart: (artifactId, title, artifactType = "html") => ({
22
+ type: "artifact_start",
23
+ artifactId,
24
+ title,
25
+ artifactType,
26
+ }),
27
+ artifactDelta: (artifactId, delta) => ({
28
+ type: "artifact_delta",
29
+ artifactId,
30
+ delta,
31
+ }),
32
+ artifactSnapshot: (artifactId, html) => ({
33
+ type: "artifact_snapshot",
34
+ artifactId,
35
+ html,
36
+ }),
37
+ artifactDone: (artifactId, html) => ({
38
+ type: "artifact_done",
39
+ artifactId,
40
+ html,
41
+ }),
42
+ error: (message, recoverable = true) => ({
43
+ type: "error",
44
+ message,
45
+ recoverable,
46
+ }),
47
+ done: () => ({ type: "done" }),
48
+ };
49
+ /** Runtime guard that an unknown value is a protocol event. */
50
+ export function isArtifactStreamEvent(value) {
51
+ if (typeof value !== "object" || value === null)
52
+ return false;
53
+ const type = value.type;
54
+ return (type === "mode" ||
55
+ type === "message_start" ||
56
+ type === "message_delta" ||
57
+ type === "message_done" ||
58
+ type === "artifact_start" ||
59
+ type === "artifact_delta" ||
60
+ type === "artifact_snapshot" ||
61
+ type === "artifact_done" ||
62
+ type === "error" ||
63
+ type === "done");
64
+ }
65
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/stream/events.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,CAAC,IAAkB,EAAuB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE3E,YAAY,EAAE,CAAC,SAAiB,EAAuB,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,eAAe;QACrB,SAAS;KACV,CAAC;IAEF,YAAY,EAAE,CAAC,SAAiB,EAAE,KAAa,EAAuB,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,eAAe;QACrB,SAAS;QACT,KAAK;KACN,CAAC;IAEF,WAAW,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAuB,EAAE,CAAC,CAAC;QACzE,IAAI,EAAE,cAAc;QACpB,SAAS;QACT,OAAO;KACR,CAAC;IAEF,aAAa,EAAE,CACb,UAAkB,EAClB,KAAa,EACb,eAA6B,MAAM,EACd,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,gBAAgB;QACtB,UAAU;QACV,KAAK;QACL,YAAY;KACb,CAAC;IAEF,aAAa,EAAE,CAAC,UAAkB,EAAE,KAAa,EAAuB,EAAE,CAAC,CAAC;QAC1E,IAAI,EAAE,gBAAgB;QACtB,UAAU;QACV,KAAK;KACN,CAAC;IAEF,gBAAgB,EAAE,CAAC,UAAkB,EAAE,IAAY,EAAuB,EAAE,CAAC,CAAC;QAC5E,IAAI,EAAE,mBAAmB;QACzB,UAAU;QACV,IAAI;KACL,CAAC;IAEF,YAAY,EAAE,CAAC,UAAkB,EAAE,IAAY,EAAuB,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,eAAe;QACrB,UAAU;QACV,IAAI;KACL,CAAC;IAEF,KAAK,EAAE,CAAC,OAAe,EAAE,WAAW,GAAG,IAAI,EAAuB,EAAE,CAAC,CAAC;QACpE,IAAI,EAAE,OAAO;QACb,OAAO;QACP,WAAW;KACZ,CAAC;IAEF,IAAI,EAAE,GAAwB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;CACpD,CAAC;AAEF,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CACnC,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,CACL,IAAI,KAAK,MAAM;QACf,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,mBAAmB;QAC5B,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,MAAM,CAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from "./events.js";
2
+ export * from "./encoder.js";
3
+ export * from "./decoder.js";
4
+ export * from "./sse.js";
5
+ export * from "./buffering.js";
6
+ export * from "./debounce.js";
7
+ export * from "./assembleDocument.js";
8
+ export * from "./predictiveHtmlParser.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from "./events.js";
2
+ export * from "./encoder.js";
3
+ export * from "./decoder.js";
4
+ export * from "./sse.js";
5
+ export * from "./buffering.js";
6
+ export * from "./debounce.js";
7
+ export * from "./assembleDocument.js";
8
+ export * from "./predictiveHtmlParser.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Predictive HTML parser for streaming AI output.
3
+ *
4
+ * The core idea: keep the real streamed HTML as the immutable *truth*, but for
5
+ * rendering produce a temporary *projection* that predicts the missing closing
6
+ * tags from the current parser stack. The model can stream
7
+ *
8
+ * <section><div><h2>Hello
9
+ *
10
+ * and the renderer receives a valid document:
11
+ *
12
+ * <section><div><h2>Hello</h2></div></section>
13
+ *
14
+ * When the real `</h2></div></section>` arrives later, the stack matches them
15
+ * and nothing is duplicated — predicted closings are never written back into
16
+ * the committed truth.
17
+ *
18
+ * The parser is incremental: feed it chunks with {@link push}; it carries
19
+ * partial tokens (tags, comments, raw-text close) across chunk boundaries. It
20
+ * handles void elements, self-closing tags, quoted attributes containing
21
+ * `<`/`>`, comments, doctype, raw-text elements (`<style>`/`<script>`/… whose
22
+ * bodies aren't markup), implicit closing (`<li>`, `<td>`, `<p>`, …), and
23
+ * mis-nested close tags (`<div><p>x</div>` → closes `p` before `div`).
24
+ *
25
+ * It is purely structural — it does NOT sanitize or style. Run the output
26
+ * through the sanitizer before rendering (the iframe pipeline does this).
27
+ *
28
+ * Fail-open: malformed input degrades to text rather than throwing.
29
+ */
30
+ export declare class PredictiveHtmlParser {
31
+ private committed;
32
+ private pending;
33
+ private stack;
34
+ private insideRawText;
35
+ private htmlClosed;
36
+ /** Feed a chunk; returns the current renderable projection. */
37
+ push(chunk: string): string;
38
+ /** The current renderable projection: committed + predicted closings. */
39
+ render(): string;
40
+ /** The immutable, never-predicted truth committed so far. */
41
+ get committedHtml(): string;
42
+ /** True once a real `</html>` has balanced the document. */
43
+ get complete(): boolean;
44
+ /** Is there visible body content worth rendering yet? */
45
+ isRenderable(): boolean;
46
+ reset(): void;
47
+ private process;
48
+ private handleOpen;
49
+ private handleClose;
50
+ private autoCloseImplicit;
51
+ }
52
+ //# sourceMappingURL=predictiveHtmlParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predictiveHtmlParser.d.ts","sourceRoot":"","sources":["../../src/stream/predictiveHtmlParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA8BH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAS;IAE3B,+DAA+D;IAC/D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAa3B,yEAAyE;IACzE,MAAM,IAAI,MAAM;IAWhB,6DAA6D;IAC7D,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,4DAA4D;IAC5D,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,yDAAyD;IACzD,YAAY,IAAI,OAAO;IAQvB,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,OAAO;IAkFf,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,iBAAiB;CAc1B"}