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,4 @@
1
+ export * from "./events.js";
2
+ export * from "./sandbox.js";
3
+ export * from "./defaults.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Iframe sandbox tokens. `allow-scripts` is intentionally absent — generated
3
+ * artifacts are static HTML/CSS and must never execute JavaScript.
4
+ */
5
+ export declare const SANDBOX_TOKENS: {
6
+ readonly FORMS: "allow-forms";
7
+ readonly POPUPS: "allow-popups";
8
+ readonly SAME_ORIGIN: "allow-same-origin";
9
+ };
10
+ /**
11
+ * Default sandbox: forms + same-origin, but NO scripts. `allow-same-origin`
12
+ * lets the parent measure the document so the iframe can auto-fit its content
13
+ * height (no inner scrollbar). It is only dangerous when combined with
14
+ * `allow-scripts` — which is forbidden here — so static artifacts stay safe.
15
+ */
16
+ export declare const DEFAULT_SANDBOX: string;
17
+ /** Tokens that are forbidden regardless of configuration. */
18
+ export declare const FORBIDDEN_SANDBOX_TOKENS: readonly ["allow-scripts", "allow-top-navigation", "allow-top-navigation-by-user-activation", "allow-modals"];
19
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/constants/sandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAA0D,CAAC;AAEvF,6DAA6D;AAC7D,eAAO,MAAM,wBAAwB,+GAK3B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Iframe sandbox tokens. `allow-scripts` is intentionally absent — generated
3
+ * artifacts are static HTML/CSS and must never execute JavaScript.
4
+ */
5
+ export const SANDBOX_TOKENS = {
6
+ FORMS: "allow-forms",
7
+ POPUPS: "allow-popups",
8
+ SAME_ORIGIN: "allow-same-origin",
9
+ };
10
+ /**
11
+ * Default sandbox: forms + same-origin, but NO scripts. `allow-same-origin`
12
+ * lets the parent measure the document so the iframe can auto-fit its content
13
+ * height (no inner scrollbar). It is only dangerous when combined with
14
+ * `allow-scripts` — which is forbidden here — so static artifacts stay safe.
15
+ */
16
+ export const DEFAULT_SANDBOX = `${SANDBOX_TOKENS.FORMS} ${SANDBOX_TOKENS.SAME_ORIGIN}`;
17
+ /** Tokens that are forbidden regardless of configuration. */
18
+ export const FORBIDDEN_SANDBOX_TOKENS = [
19
+ "allow-scripts",
20
+ "allow-top-navigation",
21
+ "allow-top-navigation-by-user-activation",
22
+ "allow-modals",
23
+ ];
24
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/constants/sandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE,mBAAmB;CACxB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,cAAc,CAAC,KAAK,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;AAEvF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,eAAe;IACf,sBAAsB;IACtB,yCAAyC;IACzC,cAAc;CACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** SSE response headers tuned to defeat proxy buffering. */
2
+ export declare const SSE_HEADERS: Record<string, string>;
3
+ /** Wrap an SSE byte stream in a `Response` with the correct headers. */
4
+ export declare function createArtifactResponse(stream: ReadableStream<Uint8Array>, init?: ResponseInit): Response;
5
+ //# sourceMappingURL=createArtifactResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArtifactResponse.d.ts","sourceRoot":"","sources":["../../src/core/createArtifactResponse.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM9C,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,IAAI,CAAC,EAAE,YAAY,GAClB,QAAQ,CAKV"}
@@ -0,0 +1,16 @@
1
+ /** SSE response headers tuned to defeat proxy buffering. */
2
+ export const SSE_HEADERS = {
3
+ "Content-Type": "text/event-stream; charset=utf-8",
4
+ "Cache-Control": "no-cache, no-transform",
5
+ Connection: "keep-alive",
6
+ // Disable nginx buffering so events flush immediately.
7
+ "X-Accel-Buffering": "no",
8
+ };
9
+ /** Wrap an SSE byte stream in a `Response` with the correct headers. */
10
+ export function createArtifactResponse(stream, init) {
11
+ return new Response(stream, {
12
+ status: init?.status ?? 200,
13
+ headers: { ...SSE_HEADERS, ...init?.headers },
14
+ });
15
+ }
16
+ //# sourceMappingURL=createArtifactResponse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArtifactResponse.js","sourceRoot":"","sources":["../../src/core/createArtifactResponse.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,cAAc,EAAE,kCAAkC;IAClD,eAAe,EAAE,wBAAwB;IACzC,UAAU,EAAE,YAAY;IACxB,uDAAuD;IACvD,mBAAmB,EAAE,IAAI;CAC1B,CAAC;AAEF,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CACpC,MAAkC,EAClC,IAAmB;IAEnB,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE;QAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG;QAC3B,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,GAAI,IAAI,EAAE,OAAkC,EAAE;KAC1E,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ArtifactStreamProducer } from "./lifecycle.js";
2
+ /**
3
+ * Turn an event-emitting producer into an SSE byte stream. The producer is
4
+ * responsible for emitting its own `done` event on success; this wrapper
5
+ * guarantees the stream is always closed and that an uncaught producer error
6
+ * becomes a terminal `error` + `done` pair rather than a hung connection.
7
+ */
8
+ export declare function createArtifactStream(producer: ArtifactStreamProducer): ReadableStream<Uint8Array>;
9
+ //# sourceMappingURL=createArtifactStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArtifactStream.d.ts","sourceRoot":"","sources":["../../src/core/createArtifactStream.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAQ,MAAM,gBAAgB,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,sBAAsB,GAC/B,cAAc,CAAC,UAAU,CAAC,CAuB5B"}
@@ -0,0 +1,34 @@
1
+ import { encodeSseEventBytes } from "../stream/encoder.js";
2
+ import { event } from "../stream/events.js";
3
+ /**
4
+ * Turn an event-emitting producer into an SSE byte stream. The producer is
5
+ * responsible for emitting its own `done` event on success; this wrapper
6
+ * guarantees the stream is always closed and that an uncaught producer error
7
+ * becomes a terminal `error` + `done` pair rather than a hung connection.
8
+ */
9
+ export function createArtifactStream(producer) {
10
+ const encoder = new TextEncoder();
11
+ return new ReadableStream({
12
+ async start(controller) {
13
+ let closed = false;
14
+ const emit = (e) => {
15
+ if (closed)
16
+ return;
17
+ controller.enqueue(encodeSseEventBytes(e, encoder));
18
+ };
19
+ try {
20
+ await producer(emit);
21
+ }
22
+ catch (err) {
23
+ const message = err instanceof Error ? err.message : String(err);
24
+ emit(event.error(message, false));
25
+ emit(event.done());
26
+ }
27
+ finally {
28
+ closed = true;
29
+ controller.close();
30
+ }
31
+ },
32
+ });
33
+ }
34
+ //# sourceMappingURL=createArtifactStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArtifactStream.js","sourceRoot":"","sources":["../../src/core/createArtifactStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG5C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,OAAO,IAAI,cAAc,CAAa;QACpC,KAAK,CAAC,KAAK,CAAC,UAAU;YACpB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,MAAM,IAAI,GAAS,CAAC,CAAC,EAAE,EAAE;gBACvB,IAAI,MAAM;oBAAE,OAAO;gBACnB,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrB,CAAC;oBAAS,CAAC;gBACT,MAAM,GAAG,IAAI,CAAC;gBACd,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function createMessageId(): string;
2
+ export declare function createArtifactId(): string;
3
+ //# sourceMappingURL=createIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIds.d.ts","sourceRoot":"","sources":["../../src/core/createIds.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -0,0 +1,13 @@
1
+ function randomId() {
2
+ const g = globalThis;
3
+ if (g.crypto?.randomUUID)
4
+ return g.crypto.randomUUID();
5
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
6
+ }
7
+ export function createMessageId() {
8
+ return `msg_${randomId()}`;
9
+ }
10
+ export function createArtifactId() {
11
+ return `art_${randomId()}`;
12
+ }
13
+ //# sourceMappingURL=createIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIds.js","sourceRoot":"","sources":["../../src/core/createIds.ts"],"names":[],"mappings":"AAAA,SAAS,QAAQ;IACf,MAAM,CAAC,GAAG,UAAwD,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACvD,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,QAAQ,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,QAAQ,EAAE,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./createIds.js";
2
+ export * from "./lifecycle.js";
3
+ export * from "./createArtifactStream.js";
4
+ export * from "./createArtifactResponse.js";
5
+ export * from "./parseArtifactEnvelope.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./createIds.js";
2
+ export * from "./lifecycle.js";
3
+ export * from "./createArtifactStream.js";
4
+ export * from "./createArtifactResponse.js";
5
+ export * from "./parseArtifactEnvelope.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ArtifactStreamEvent } from "../types/stream.js";
2
+ /** A sink for protocol events. Implementations write to an SSE stream. */
3
+ export type Emit = (event: ArtifactStreamEvent) => void;
4
+ /** A function that drives a full response by emitting protocol events. */
5
+ export type ArtifactStreamProducer = (emit: Emit) => Promise<void>;
6
+ /**
7
+ * Helper that manages a single assistant message's lifecycle, accumulating
8
+ * content so `done` can carry the full text without the caller re-tracking it.
9
+ */
10
+ export declare class MessageLifecycle {
11
+ private readonly emit;
12
+ readonly id: string;
13
+ private content;
14
+ private started;
15
+ private finished;
16
+ constructor(emit: Emit, id?: string);
17
+ start(): void;
18
+ delta(text: string): void;
19
+ /** Idempotent — emits `message_done` at most once. */
20
+ done(finalContent?: string): string;
21
+ }
22
+ /** Helper managing one artifact's lifecycle (start → deltas → snapshots → done). */
23
+ export declare class ArtifactLifecycle {
24
+ private readonly emit;
25
+ readonly id: string;
26
+ private started;
27
+ private finished;
28
+ constructor(emit: Emit, id?: string);
29
+ start(title: string): void;
30
+ delta(html: string): void;
31
+ snapshot(html: string): void;
32
+ /** Idempotent — emits `artifact_done` at most once. */
33
+ done(html: string): void;
34
+ }
35
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,0EAA0E;AAC1E,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAExD,0EAA0E;AAC1E,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE;;;GAGG;AACH,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAGN,IAAI,EAAE,IAAI,EAC3B,EAAE,GAAE,MAA0B;IAKhC,KAAK,IAAI,IAAI;IAMb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOzB,sDAAsD;IACtD,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM;CAUpC;AAED,oFAAoF;AACpF,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAGN,IAAI,EAAE,IAAI,EAC3B,EAAE,GAAE,MAA2B;IAKjC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK5B,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAMzB"}
@@ -0,0 +1,81 @@
1
+ import { event } from "../stream/events.js";
2
+ import { createArtifactId, createMessageId } from "./createIds.js";
3
+ /**
4
+ * Helper that manages a single assistant message's lifecycle, accumulating
5
+ * content so `done` can carry the full text without the caller re-tracking it.
6
+ */
7
+ export class MessageLifecycle {
8
+ emit;
9
+ id;
10
+ content = "";
11
+ started = false;
12
+ finished = false;
13
+ constructor(emit, id = createMessageId()) {
14
+ this.emit = emit;
15
+ this.id = id;
16
+ }
17
+ start() {
18
+ if (this.started)
19
+ return;
20
+ this.started = true;
21
+ this.emit(event.messageStart(this.id));
22
+ }
23
+ delta(text) {
24
+ if (!text || this.finished)
25
+ return;
26
+ if (!this.started)
27
+ this.start();
28
+ this.content += text;
29
+ this.emit(event.messageDelta(this.id, text));
30
+ }
31
+ /** Idempotent — emits `message_done` at most once. */
32
+ done(finalContent) {
33
+ if (this.finished)
34
+ return this.content;
35
+ if (!this.started)
36
+ this.start();
37
+ if (finalContent !== undefined && this.content === "") {
38
+ this.content = finalContent;
39
+ }
40
+ this.finished = true;
41
+ this.emit(event.messageDone(this.id, this.content));
42
+ return this.content;
43
+ }
44
+ }
45
+ /** Helper managing one artifact's lifecycle (start → deltas → snapshots → done). */
46
+ export class ArtifactLifecycle {
47
+ emit;
48
+ id;
49
+ started = false;
50
+ finished = false;
51
+ constructor(emit, id = createArtifactId()) {
52
+ this.emit = emit;
53
+ this.id = id;
54
+ }
55
+ start(title) {
56
+ if (this.started)
57
+ return;
58
+ this.started = true;
59
+ this.emit(event.artifactStart(this.id, title, "html"));
60
+ }
61
+ delta(html) {
62
+ if (!html || this.finished)
63
+ return;
64
+ this.emit(event.artifactDelta(this.id, html));
65
+ }
66
+ snapshot(html) {
67
+ if (this.finished)
68
+ return;
69
+ this.emit(event.artifactSnapshot(this.id, html));
70
+ }
71
+ /** Idempotent — emits `artifact_done` at most once. */
72
+ done(html) {
73
+ if (this.finished)
74
+ return;
75
+ if (!this.started)
76
+ this.start("Untitled artifact");
77
+ this.finished = true;
78
+ this.emit(event.artifactDone(this.id, html));
79
+ }
80
+ }
81
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AASnE;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAOR;IANV,EAAE,CAAS;IACZ,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YACmB,IAAU,EAC3B,KAAa,eAAe,EAAE;QADb,SAAI,GAAJ,IAAI,CAAM;QAG3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC,YAAqB;QACxB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED,oFAAoF;AACpF,MAAM,OAAO,iBAAiB;IAMT;IALV,EAAE,CAAS;IACZ,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YACmB,IAAU,EAC3B,KAAa,gBAAgB,EAAE;QADd,SAAI,GAAJ,IAAI,CAAM;QAG3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC,IAAY;QACf,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export { parseArtifactEnvelope, StreamingEnvelopeParser, type EnvelopeStreamEvent, } from "../artifacts/artifactEnvelope.js";
2
+ //# sourceMappingURL=parseArtifactEnvelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseArtifactEnvelope.d.ts","sourceRoot":"","sources":["../../src/core/parseArtifactEnvelope.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,mBAAmB,GACzB,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Re-exported from the artifacts module so it's reachable from the core API too.
2
+ export { parseArtifactEnvelope, StreamingEnvelopeParser, } from "../artifacts/artifactEnvelope.js";
3
+ //# sourceMappingURL=parseArtifactEnvelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseArtifactEnvelope.js","sourceRoot":"","sources":["../../src/core/parseArtifactEnvelope.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAExB,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ArtifactErrorCode } from "../types/errors.js";
2
+ /** Raised when the model envelope cannot be parsed. Always recoverable. */
3
+ export declare class ArtifactParseError extends Error {
4
+ readonly code: ArtifactErrorCode;
5
+ readonly recoverable = true;
6
+ constructor(message: string, options?: {
7
+ cause?: unknown;
8
+ });
9
+ }
10
+ //# sourceMappingURL=ArtifactParseError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArtifactParseError.d.ts","sourceRoot":"","sources":["../../src/errors/ArtifactParseError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,2EAA2E;AAC3E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAA0B;IAC1D,QAAQ,CAAC,WAAW,QAAQ;gBAEhB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D"}
@@ -0,0 +1,10 @@
1
+ /** Raised when the model envelope cannot be parsed. Always recoverable. */
2
+ export class ArtifactParseError extends Error {
3
+ code = "ARTIFACT_PARSE_ERROR";
4
+ recoverable = true;
5
+ constructor(message, options) {
6
+ super(message, options);
7
+ this.name = "ArtifactParseError";
8
+ }
9
+ }
10
+ //# sourceMappingURL=ArtifactParseError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArtifactParseError.js","sourceRoot":"","sources":["../../src/errors/ArtifactParseError.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAsB,sBAAsB,CAAC;IACjD,WAAW,GAAG,IAAI,CAAC;IAE5B,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { ArtifactErrorCode } from "../types/errors.js";
2
+ /**
3
+ * Raised when classification fails. Always recoverable — the server falls back
4
+ * to heuristic rules and ultimately to markdown.
5
+ */
6
+ export declare class ClassificationError extends Error {
7
+ readonly code: ArtifactErrorCode;
8
+ readonly recoverable = true;
9
+ constructor(message: string, options?: {
10
+ cause?: unknown;
11
+ });
12
+ }
13
+ //# sourceMappingURL=ClassificationError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClassificationError.d.ts","sourceRoot":"","sources":["../../src/errors/ClassificationError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAA0B;IAC1D,QAAQ,CAAC,WAAW,QAAQ;gBAEhB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Raised when classification fails. Always recoverable — the server falls back
3
+ * to heuristic rules and ultimately to markdown.
4
+ */
5
+ export class ClassificationError extends Error {
6
+ code = "CLASSIFICATION_ERROR";
7
+ recoverable = true;
8
+ constructor(message, options) {
9
+ super(message, options);
10
+ this.name = "ClassificationError";
11
+ }
12
+ }
13
+ //# sourceMappingURL=ClassificationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClassificationError.js","sourceRoot":"","sources":["../../src/errors/ClassificationError.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,GAAsB,sBAAsB,CAAC;IACjD,WAAW,GAAG,IAAI,CAAC;IAE5B,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { ArtifactErrorCode } from "../types/errors.js";
2
+ /** Raised on transport/streaming failures. May or may not be recoverable. */
3
+ export declare class StreamError extends Error {
4
+ readonly code: ArtifactErrorCode;
5
+ readonly recoverable: boolean;
6
+ constructor(message: string, options?: {
7
+ cause?: unknown;
8
+ recoverable?: boolean;
9
+ });
10
+ }
11
+ //# sourceMappingURL=StreamError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamError.d.ts","sourceRoot":"","sources":["../../src/errors/StreamError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,6EAA6E;AAC7E,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAkB;IAClD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAG5B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;CAMvD"}
@@ -0,0 +1,11 @@
1
+ /** Raised on transport/streaming failures. May or may not be recoverable. */
2
+ export class StreamError extends Error {
3
+ code = "STREAM_ERROR";
4
+ recoverable;
5
+ constructor(message, options) {
6
+ super(message, options);
7
+ this.name = "StreamError";
8
+ this.recoverable = options?.recoverable ?? false;
9
+ }
10
+ }
11
+ //# sourceMappingURL=StreamError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamError.js","sourceRoot":"","sources":["../../src/errors/StreamError.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAsB,cAAc,CAAC;IACzC,WAAW,CAAU;IAE9B,YACE,OAAe,EACf,OAAoD;QAEpD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export * from "./ArtifactParseError.js";
2
+ export * from "./StreamError.js";
3
+ export * from "./ClassificationError.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./ArtifactParseError.js";
2
+ export * from "./StreamError.js";
3
+ export * from "./ClassificationError.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { HtmlArtifactCardProps } from "../types/client.js";
2
+ /**
3
+ * The seamless artifact card: a refined header (window dots, segmented
4
+ * preview/code tabs, pill copy/download/fullscreen actions), a sandboxed iframe
5
+ * preview that streams in layer-by-layer, and a premium ring + layered-shadow
6
+ * frame. No flat white box, no host-CSS dependency.
7
+ */
8
+ export declare function HtmlArtifactCard(props: HtmlArtifactCardProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=HtmlArtifactCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlArtifactCard.d.ts","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactCard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAI5B;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CA4N5D"}
@@ -0,0 +1,117 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { HtmlArtifactToolbar } from "./HtmlArtifactToolbar.js";
5
+ import { HtmlArtifactPreview } from "./HtmlArtifactPreview.js";
6
+ import { HtmlArtifactCodeView } from "./HtmlArtifactCodeView.js";
7
+ import { HtmlArtifactModal } from "./HtmlArtifactModal.js";
8
+ import { buildSrcDoc } from "./iframeSrcDoc.js";
9
+ import { useArtifactStyles } from "./styles.js";
10
+ const RADIUS = { md: 14, xl: 18, "2xl": 22, "3xl": 28 };
11
+ /**
12
+ * The seamless artifact card: a refined header (window dots, segmented
13
+ * preview/code tabs, pill copy/download/fullscreen actions), a sandboxed iframe
14
+ * preview that streams in layer-by-layer, and a premium ring + layered-shadow
15
+ * frame. No flat white box, no host-CSS dependency.
16
+ */
17
+ export function HtmlArtifactCard(props) {
18
+ useArtifactStyles();
19
+ const { artifact, variant = "elevated", radius = "2xl", showToolbar = true, defaultTab = "preview", allowFullscreen = true, allowCopy = true, allowDownload = true, allowPdf = true, presentation = "card", theme, previewOptions, className, } = props;
20
+ const [tab, setTab] = React.useState(defaultTab);
21
+ const [copied, setCopied] = React.useState(false);
22
+ const [fullscreen, setFullscreen] = React.useState(false);
23
+ const streaming = artifact.status === "streaming";
24
+ const errored = artifact.status === "error";
25
+ // While streaming, feed the raw growing HTML to the preview's progressive
26
+ // balancer (it repairs each partial frame into a valid, renderable document).
27
+ // The accumulated raw stream beats the server's coarser snapshots here; we
28
+ // fall back to a snapshot only if no raw deltas have arrived (buffered model).
29
+ const previewHtml = streaming
30
+ ? artifact.html || artifact.snapshot
31
+ : artifact.html || artifact.snapshot;
32
+ const sourceHtml = artifact.html || artifact.snapshot;
33
+ const onCopy = React.useCallback(() => {
34
+ if (typeof navigator === "undefined" || !navigator.clipboard)
35
+ return;
36
+ navigator.clipboard.writeText(sourceHtml).then(() => {
37
+ setCopied(true);
38
+ setTimeout(() => setCopied(false), 1600);
39
+ }, () => { });
40
+ }, [sourceHtml]);
41
+ const onDownload = React.useCallback(() => {
42
+ if (typeof document === "undefined")
43
+ return;
44
+ const blob = new Blob([sourceHtml], { type: "text/html;charset=utf-8" });
45
+ const url = URL.createObjectURL(blob);
46
+ const a = document.createElement("a");
47
+ const safeName = artifact.title.replace(/[^a-z0-9-_]+/gi, "-").toLowerCase() || "artifact";
48
+ a.href = url;
49
+ a.download = `${safeName}.html`;
50
+ document.body.appendChild(a);
51
+ a.click();
52
+ a.remove();
53
+ URL.revokeObjectURL(url);
54
+ }, [sourceHtml, artifact.title]);
55
+ // Export to PDF via the browser's native print pipeline ("Save as PDF").
56
+ // Renders the sanitized artifact into a hidden, same-origin iframe and prints
57
+ // just that frame — no extra dependencies, no scripts in the printed output.
58
+ const onDownloadPdf = React.useCallback(() => {
59
+ if (typeof document === "undefined" || !sourceHtml)
60
+ return;
61
+ const printable = buildSrcDoc(sourceHtml, {
62
+ sanitize: true,
63
+ seamless: false,
64
+ sanitizeOptions: previewOptions,
65
+ });
66
+ const frame = document.createElement("iframe");
67
+ Object.assign(frame.style, {
68
+ position: "fixed",
69
+ right: "0",
70
+ bottom: "0",
71
+ width: "0",
72
+ height: "0",
73
+ border: "0",
74
+ opacity: "0",
75
+ });
76
+ frame.setAttribute("aria-hidden", "true");
77
+ frame.title = `${artifact.title} (PDF)`;
78
+ frame.srcdoc = printable;
79
+ const remove = () => {
80
+ if (document.body.contains(frame))
81
+ frame.remove();
82
+ };
83
+ frame.onload = () => {
84
+ const win = frame.contentWindow;
85
+ if (!win)
86
+ return remove();
87
+ win.addEventListener?.("afterprint", () => setTimeout(remove, 300));
88
+ try {
89
+ win.focus();
90
+ win.print();
91
+ }
92
+ catch {
93
+ remove();
94
+ }
95
+ // Safety net if afterprint never fires (some browsers).
96
+ setTimeout(remove, 60_000);
97
+ };
98
+ document.body.appendChild(frame);
99
+ }, [sourceHtml, artifact.title, previewOptions]);
100
+ // Seamless ("camouflage") presentation: a transparent, chromeless iframe that
101
+ // sits inline like native chat content — no card frame, no window, no border.
102
+ // A faint action row appears only on hover so the clean UI stays clean.
103
+ if (presentation === "seamless") {
104
+ return (_jsxs("div", { className: `aha-scope${className ? ` ${className}` : ""}`, children: [_jsxs("div", { className: "aha-seamless", children: [_jsx(HtmlArtifactPreview, { html: previewHtml, streaming: streaming, errored: errored, title: artifact.title, theme: theme, bare: true, options: { minHeight: 0, ...previewOptions } }), showToolbar && !streaming && (_jsxs("div", { className: "aha-seamless-actions", children: [allowCopy && (_jsx("button", { type: "button", className: "aha-iconbtn", onClick: onCopy, title: "Copy HTML", "aria-label": "Copy HTML", children: copied ? CHECK_ICON : COPY_ICON })), allowPdf && (_jsx("button", { type: "button", className: "aha-iconbtn", onClick: onDownloadPdf, title: "Download PDF", "aria-label": "Download PDF", children: PDF_ICON })), allowFullscreen && (_jsx("button", { type: "button", className: "aha-iconbtn", onClick: () => setFullscreen(true), title: "Fullscreen", "aria-label": "Fullscreen", children: EXPAND_ICON }))] }))] }), allowFullscreen && (_jsx(HtmlArtifactModal, { open: fullscreen, onClose: () => setFullscreen(false), title: artifact.title, children: _jsx(HtmlArtifactPreview, { html: previewHtml, streaming: streaming, errored: errored, title: artifact.title, theme: theme, options: { ...previewOptions, autoResize: false, minHeight: 640, maxHeight: 100000 } }) }))] }));
105
+ }
106
+ return (_jsxs("div", { className: `aha-scope${className ? ` ${className}` : ""}`, children: [_jsxs("div", { className: "aha-card", "data-variant": variant, style: { ["--aha-radius"]: `${RADIUS[radius]}px` }, children: [showToolbar && (_jsx(HtmlArtifactToolbar, { title: artifact.title, tab: tab, onTabChange: setTab, allowCopy: allowCopy, allowDownload: allowDownload, allowPdf: allowPdf, allowFullscreen: allowFullscreen, copied: copied, streaming: streaming, onCopy: onCopy, onDownload: onDownload, onDownloadPdf: onDownloadPdf, onFullscreen: () => setFullscreen(true) })), tab === "preview" ? (_jsx(HtmlArtifactPreview, { html: previewHtml, streaming: streaming, errored: errored, title: artifact.title, theme: theme, options: previewOptions })) : (_jsx(HtmlArtifactCodeView, { html: sourceHtml, maxHeight: previewOptions?.maxHeight ?? 900 }))] }), allowFullscreen && (_jsx(HtmlArtifactModal, { open: fullscreen, onClose: () => setFullscreen(false), title: artifact.title, children: _jsx(HtmlArtifactPreview, { html: previewHtml, streaming: streaming, errored: errored, title: artifact.title, theme: theme, options: {
107
+ ...previewOptions,
108
+ autoResize: false,
109
+ minHeight: 640,
110
+ maxHeight: 100000,
111
+ } }) }))] }));
112
+ }
113
+ const COPY_ICON = (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2.5" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }));
114
+ const CHECK_ICON = (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.6", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }));
115
+ const EXPAND_ICON = (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("polyline", { points: "15 3 21 3 21 9" }), _jsx("polyline", { points: "9 21 3 21 3 15" }), _jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10" }), _jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14" })] }));
116
+ const PDF_ICON = (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), _jsx("polyline", { points: "14 2 14 8 20 8" }), _jsx("path", { d: "M9 15h1.2a1.3 1.3 0 0 0 0-2.6H9V18" }), _jsx("path", { d: "M15.5 12.4H14V18" }), _jsx("path", { d: "M14 15.4h1.3" })] }));
117
+ //# sourceMappingURL=HtmlArtifactCard.js.map