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 @@
1
+ {"version":3,"file":"HtmlArtifactModal.js","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.HtmlArtifactPreview = HtmlArtifactPreview;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const React = __importStar(require("react"));
40
+ const styles_js_1 = require("./styles.js");
41
+ const assembleDocument_js_1 = require("../stream/assembleDocument.js");
42
+ const defaults_js_1 = require("../constants/defaults.js");
43
+ const mergeConfig_js_1 = require("../utils/mergeConfig.js");
44
+ const iframeSrcDoc_js_1 = require("./iframeSrcDoc.js");
45
+ const iframeSizing_js_1 = require("./iframeSizing.js");
46
+ function HtmlArtifactPreview(props) {
47
+ (0, styles_js_1.useArtifactStyles)();
48
+ const { html, streaming = false, errored = false, title, options, theme, bare = false } = props;
49
+ const opts = React.useMemo(() => (0, mergeConfig_js_1.mergeConfig)(defaults_js_1.DEFAULT_PREVIEW_OPTIONS, options), [options]);
50
+ const { ref: iframeRef, height, onLoad, measure } = (0, iframeSizing_js_1.useIframeAutoSize)({
51
+ enabled: opts.autoResize,
52
+ minHeight: opts.minHeight,
53
+ maxHeight: opts.maxHeight,
54
+ });
55
+ const [srcDoc, setSrcDoc] = React.useState("");
56
+ // Tracks the last document we rendered and whether the iframe has loaded once.
57
+ // Lets us update the *live* document in place while streaming instead of
58
+ // reassigning `srcDoc` (which fully reloads the frame and flashes blank).
59
+ const lastDocRef = React.useRef("");
60
+ const loadedRef = React.useRef(false);
61
+ // One persistent parser for the whole stream: each frame feeds only the new
62
+ // tail (O(n) total) instead of re-parsing the full accumulated HTML (O(n²)).
63
+ const projectorRef = React.useRef(null);
64
+ // Latest inputs, read by the throttled flush without re-subscribing it.
65
+ const stateRef = React.useRef({ html, streaming, opts });
66
+ React.useLayoutEffect(() => {
67
+ stateRef.current = { html, streaming, opts };
68
+ }, [html, streaming, opts]);
69
+ // Throttle bookkeeping: coalesce bursts of tokens into frame-aligned paints.
70
+ const schedRef = React.useRef({ raf: null, timer: null, last: 0 });
71
+ const handleLoad = React.useCallback(() => {
72
+ loadedRef.current = true;
73
+ onLoad();
74
+ }, [onLoad]);
75
+ // Commit a built document to the frame: patch the live DOM in place once the
76
+ // frame has loaded (no reload, no flash), else seed it via `srcDoc`.
77
+ const paint = React.useCallback((doc) => {
78
+ if (doc === lastDocRef.current)
79
+ return;
80
+ lastDocRef.current = doc;
81
+ const iframe = iframeRef.current;
82
+ if (loadedRef.current && iframe?.contentDocument) {
83
+ try {
84
+ patchIframeDocument(iframe.contentDocument, doc);
85
+ measure();
86
+ return;
87
+ }
88
+ catch {
89
+ // Fall back to a full reload if in-place patching isn't possible.
90
+ }
91
+ }
92
+ setSrcDoc(doc);
93
+ }, [iframeRef, measure]);
94
+ // Build + paint from the newest inputs. Cheap parse work runs every call so
95
+ // the projector stays in sync; the expensive sanitize+DOM write is gated by
96
+ // the scheduler. Skipped frames are safe — the projector catches up the tail.
97
+ const flush = React.useCallback(() => {
98
+ schedRef.current.last = now();
99
+ const { html, streaming, opts } = stateRef.current;
100
+ if (!html)
101
+ return;
102
+ let finalHtml = html;
103
+ if (streaming) {
104
+ const projector = projectorRef.current ?? (projectorRef.current = new assembleDocument_js_1.StreamingHtmlProjector());
105
+ const assembled = projector.update(html);
106
+ if (!assembled.renderable)
107
+ return;
108
+ finalHtml = assembled.html;
109
+ }
110
+ const doc = (0, iframeSrcDoc_js_1.buildSrcDoc)(finalHtml, {
111
+ sanitize: opts.sanitize,
112
+ seamless: true,
113
+ camouflage: bare,
114
+ theme,
115
+ sanitizeOptions: opts,
116
+ });
117
+ paint(doc);
118
+ }, [paint, theme, bare]);
119
+ // Schedule a flush, throttled to at most once per `debounceMs` and aligned to
120
+ // an animation frame so rapid SSE deltas don't trigger a render storm.
121
+ const schedule = React.useCallback(() => {
122
+ const sched = schedRef.current;
123
+ if (sched.raf != null || sched.timer != null)
124
+ return; // already pending
125
+ const interval = stateRef.current.opts.debounceMs ?? 0;
126
+ const wait = Math.max(0, interval - (now() - sched.last));
127
+ const fire = () => {
128
+ sched.timer = null;
129
+ if (typeof requestAnimationFrame !== "undefined") {
130
+ sched.raf = requestAnimationFrame(() => {
131
+ sched.raf = null;
132
+ flush();
133
+ });
134
+ }
135
+ else {
136
+ flush();
137
+ }
138
+ };
139
+ if (wait <= 0)
140
+ fire();
141
+ else
142
+ sched.timer = setTimeout(fire, wait);
143
+ }, [flush]);
144
+ React.useEffect(() => {
145
+ if (!html) {
146
+ lastDocRef.current = "";
147
+ loadedRef.current = false;
148
+ projectorRef.current?.reset();
149
+ cancelScheduled(schedRef.current);
150
+ return;
151
+ }
152
+ if (!streaming) {
153
+ // Authoritative final document: paint immediately, skip the throttle.
154
+ cancelScheduled(schedRef.current);
155
+ flush();
156
+ return;
157
+ }
158
+ schedule();
159
+ }, [html, streaming, opts, flush, schedule]);
160
+ // Cancel any pending paint on unmount.
161
+ React.useEffect(() => () => cancelScheduled(schedRef.current), []);
162
+ const sandbox = React.useMemo(() => (0, iframeSrcDoc_js_1.resolveSandbox)(opts), [opts]);
163
+ // In bare/seamless mode the host surface shows through: no background, no
164
+ // skeleton box, no progress bar — just the transparent artifact inline.
165
+ const showSkeleton = !html && !errored && !bare;
166
+ const minHeight = bare ? 0 : opts.minHeight;
167
+ const iframeSrcDoc = html ? srcDoc : "";
168
+ return ((0, jsx_runtime_1.jsxs)("div", { style: {
169
+ position: "relative",
170
+ width: "100%",
171
+ background: bare ? "transparent" : "var(--aha-bg)",
172
+ minHeight,
173
+ maxHeight: opts.autoResize ? undefined : opts.maxHeight,
174
+ overflow: opts.autoResize ? "hidden" : "auto",
175
+ transition: "height 0.15s ease-out",
176
+ height: opts.autoResize ? height : undefined,
177
+ }, children: [streaming && !bare && (0, jsx_runtime_1.jsx)("div", { className: "aha-progress", "aria-hidden": true }), (0, jsx_runtime_1.jsx)("iframe", { ref: iframeRef, srcDoc: iframeSrcDoc, title: title || "Artifact preview", sandbox: sandbox, onLoad: handleLoad, allowTransparency: true, scrolling: opts.autoResize ? "no" : "auto", style: {
178
+ display: "block",
179
+ width: "100%",
180
+ height: opts.autoResize ? height : "100%",
181
+ minHeight,
182
+ border: "none",
183
+ background: "transparent",
184
+ // In camouflage, stop the browser compositing a light/dark canvas
185
+ // behind the transparent document, so the host surface shows through.
186
+ colorScheme: bare ? "normal" : undefined,
187
+ pointerEvents: streaming && !iframeSrcDoc ? "none" : "auto",
188
+ opacity: showSkeleton ? 0 : 1,
189
+ transition: "opacity 0.2s ease",
190
+ } }), showSkeleton && ((0, jsx_runtime_1.jsxs)("div", { className: "aha-skel", style: { minHeight: opts.minHeight }, children: [(0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" })] })), errored && ((0, jsx_runtime_1.jsx)("div", { className: "aha-overlay", style: {
191
+ position: html ? "absolute" : "relative",
192
+ inset: html ? 0 : undefined,
193
+ minHeight: html ? undefined : opts.minHeight,
194
+ }, children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { style: { fontWeight: 600, color: "var(--aha-fg)", marginBottom: 4 }, children: "Preview unavailable" }), html ? "Showing the last valid snapshot." : "The artifact could not be rendered."] }) }))] }));
195
+ }
196
+ /** Monotonic-ish clock; falls back to Date.now where performance is absent. */
197
+ function now() {
198
+ return typeof performance !== "undefined" ? performance.now() : Date.now();
199
+ }
200
+ /** Cancel any pending rAF/timeout held in the scheduler record. */
201
+ function cancelScheduled(sched) {
202
+ if (sched.raf != null && typeof cancelAnimationFrame !== "undefined") {
203
+ cancelAnimationFrame(sched.raf);
204
+ }
205
+ if (sched.timer != null)
206
+ clearTimeout(sched.timer);
207
+ sched.raf = null;
208
+ sched.timer = null;
209
+ }
210
+ /**
211
+ * Apply an already-built, sanitized full document into a live same-origin iframe
212
+ * without reloading it. We replace the `<head>` styles and `<body>` contents in
213
+ * place; the `<body>` node itself persists, so the auto-size ResizeObserver keeps
214
+ * firing and the frame never flashes blank. Parsing happens in the parent via
215
+ * `DOMParser`, which never executes scripts.
216
+ */
217
+ function patchIframeDocument(target, fullDoc) {
218
+ if (typeof DOMParser === "undefined" || !target.body) {
219
+ throw new Error("in-place patch unavailable");
220
+ }
221
+ const parsed = new DOMParser().parseFromString(fullDoc, "text/html");
222
+ if (!parsed.body)
223
+ throw new Error("no body in parsed document");
224
+ if (target.head && parsed.head && target.head.innerHTML !== parsed.head.innerHTML) {
225
+ target.head.innerHTML = parsed.head.innerHTML;
226
+ }
227
+ // Mirror root/body attributes. Camouflage puts transparent background and CSS
228
+ // variables on <html style="...">, so missing this makes the live preview
229
+ // diverge from PDF/static renders.
230
+ mirrorAttributes(target.documentElement, parsed.documentElement);
231
+ mirrorAttributes(target.body, parsed.body);
232
+ if (target.body.innerHTML !== parsed.body.innerHTML) {
233
+ target.body.innerHTML = parsed.body.innerHTML;
234
+ }
235
+ }
236
+ function mirrorAttributes(target, source) {
237
+ const sourceNames = new Set();
238
+ for (const attr of Array.from(source.attributes)) {
239
+ sourceNames.add(attr.name);
240
+ if (target.getAttribute(attr.name) !== attr.value) {
241
+ target.setAttribute(attr.name, attr.value);
242
+ }
243
+ }
244
+ for (const attr of Array.from(target.attributes)) {
245
+ if (!sourceNames.has(attr.name)) {
246
+ target.removeAttribute(attr.name);
247
+ }
248
+ }
249
+ }
250
+ //# sourceMappingURL=HtmlArtifactPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlArtifactPreview.js","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactPreview.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HtmlArtifactToolbar = HtmlArtifactToolbar;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const Icon = {
7
+ copy: ((0, jsx_runtime_1.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: [(0, jsx_runtime_1.jsx)("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2.5" }), (0, jsx_runtime_1.jsx)("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] })),
8
+ check: ((0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)("polyline", { points: "20 6 9 17 4 12" }) })),
9
+ download: ((0, jsx_runtime_1.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: [(0, jsx_runtime_1.jsx)("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), (0, jsx_runtime_1.jsx)("polyline", { points: "7 10 12 15 17 10" }), (0, jsx_runtime_1.jsx)("line", { x1: "12", y1: "15", x2: "12", y2: "3" })] })),
10
+ expand: ((0, jsx_runtime_1.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: [(0, jsx_runtime_1.jsx)("polyline", { points: "15 3 21 3 21 9" }), (0, jsx_runtime_1.jsx)("polyline", { points: "9 21 3 21 3 15" }), (0, jsx_runtime_1.jsx)("line", { x1: "21", y1: "3", x2: "14", y2: "10" }), (0, jsx_runtime_1.jsx)("line", { x1: "3", y1: "21", x2: "10", y2: "14" })] })),
11
+ pdf: ((0, jsx_runtime_1.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: [(0, jsx_runtime_1.jsx)("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), (0, jsx_runtime_1.jsx)("polyline", { points: "14 2 14 8 20 8" }), (0, jsx_runtime_1.jsx)("path", { d: "M9 15h1.2a1.3 1.3 0 0 0 0-2.6H9V18" }), (0, jsx_runtime_1.jsx)("path", { d: "M15.5 12.4H14V18" }), (0, jsx_runtime_1.jsx)("path", { d: "M14 15.4h1.3" })] })),
12
+ };
13
+ function HtmlArtifactToolbar(props) {
14
+ const { title, tab, onTabChange, allowCopy = true, allowDownload = true, allowPdf = true, allowFullscreen = true, copied = false, onCopy, onDownload, onDownloadPdf, onFullscreen, streaming = false, showDots = true, } = props;
15
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "aha-toolbar", children: [showDots && ((0, jsx_runtime_1.jsxs)("span", { className: "aha-dots", "aria-hidden": true, children: [(0, jsx_runtime_1.jsx)("span", { className: "aha-dot", style: { background: "#ff5f57" } }), (0, jsx_runtime_1.jsx)("span", { className: "aha-dot", style: { background: "#febc2e" } }), (0, jsx_runtime_1.jsx)("span", { className: "aha-dot", style: { background: "#28c840" } })] })), streaming && (0, jsx_runtime_1.jsx)("span", { className: "aha-stream-dot", "aria-label": "streaming" }), (0, jsx_runtime_1.jsx)("span", { className: "aha-title", title: title, children: title }), (0, jsx_runtime_1.jsx)("div", { style: { flex: 1 } }), (0, jsx_runtime_1.jsxs)("div", { className: "aha-seg", role: "tablist", "aria-label": "Artifact view", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", role: "tab", "aria-selected": tab === "preview", "data-active": tab === "preview", onClick: () => onTabChange("preview"), children: "Preview" }), (0, jsx_runtime_1.jsx)("button", { type: "button", role: "tab", "aria-selected": tab === "code", "data-active": tab === "code", onClick: () => onTabChange("code"), children: "Code" })] }), allowCopy && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onCopy, title: "Copy HTML", "aria-label": "Copy HTML", children: copied ? Icon.check : Icon.copy })), allowDownload && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onDownload, title: "Download HTML", "aria-label": "Download HTML", children: Icon.download })), allowPdf && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onDownloadPdf, title: "Download PDF", "aria-label": "Download PDF", children: Icon.pdf })), allowFullscreen && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onFullscreen, title: "Fullscreen", "aria-label": "Open fullscreen", children: Icon.expand }))] }));
16
+ }
17
+ //# sourceMappingURL=HtmlArtifactToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlArtifactToolbar.js","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactToolbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useIframeAutoSize = useIframeAutoSize;
4
+ const react_1 = require("react");
5
+ /**
6
+ * Auto-size an iframe to its full content height so the artifact never shows an
7
+ * inner scrollbar — the page provides the single scroll. This requires reading
8
+ * the framed document, which works when the sandbox includes `allow-same-origin`
9
+ * (the default here). No scripts run inside the frame, so this stays safe.
10
+ *
11
+ * Measurement is resilient: it re-measures on load, on every content reflow
12
+ * (ResizeObserver), and after web fonts finish loading (which changes height).
13
+ * If the document is cross-origin/opaque it falls back to `minHeight`.
14
+ */
15
+ function useIframeAutoSize(options = {}) {
16
+ const { enabled = true, minHeight = 420, maxHeight = 900 } = options;
17
+ const ref = (0, react_1.useRef)(null);
18
+ const observerRef = (0, react_1.useRef)(null);
19
+ const [height, setHeight] = (0, react_1.useState)(minHeight);
20
+ const measure = (0, react_1.useCallback)(() => {
21
+ if (!enabled)
22
+ return;
23
+ const iframe = ref.current;
24
+ if (!iframe)
25
+ return;
26
+ try {
27
+ const doc = iframe.contentDocument;
28
+ const body = doc?.body;
29
+ const root = doc?.documentElement;
30
+ if (!body || !root)
31
+ return; // opaque origin — keep min height
32
+ const measured = Math.max(body.scrollHeight, body.offsetHeight, root.scrollHeight, Math.ceil(root.getBoundingClientRect().height));
33
+ if (!measured)
34
+ return;
35
+ const clamped = Math.min(Math.max(measured, minHeight), maxHeight);
36
+ setHeight((prev) => (Math.abs(prev - clamped) > 1 ? clamped : prev));
37
+ }
38
+ catch {
39
+ // Cross-origin / sandboxed without same-origin — leave at min height.
40
+ }
41
+ }, [enabled, minHeight, maxHeight]);
42
+ const onLoad = (0, react_1.useCallback)(() => {
43
+ const iframe = ref.current;
44
+ measure();
45
+ // Track reflow inside the frame (content streaming in, font swaps, etc.).
46
+ try {
47
+ const doc = iframe?.contentDocument;
48
+ const root = doc?.documentElement;
49
+ observerRef.current?.disconnect();
50
+ if (root && typeof ResizeObserver !== "undefined") {
51
+ const ro = new ResizeObserver(() => measure());
52
+ ro.observe(root);
53
+ if (doc?.body)
54
+ ro.observe(doc.body);
55
+ observerRef.current = ro;
56
+ }
57
+ // Re-measure once web fonts have loaded (height usually grows).
58
+ const fonts = doc?.fonts;
59
+ fonts?.ready?.then(() => measure()).catch(() => { });
60
+ }
61
+ catch {
62
+ /* opaque origin */
63
+ }
64
+ // A couple of delayed passes catch late layout (images, slow fonts).
65
+ const t1 = setTimeout(measure, 60);
66
+ const t2 = setTimeout(measure, 240);
67
+ return () => {
68
+ clearTimeout(t1);
69
+ clearTimeout(t2);
70
+ };
71
+ }, [measure]);
72
+ (0, react_1.useEffect)(() => {
73
+ return () => observerRef.current?.disconnect();
74
+ }, []);
75
+ return { ref, height, onLoad, measure };
76
+ }
77
+ //# sourceMappingURL=iframeSizing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframeSizing.js","sourceRoot":"","sources":["../../src/iframe/iframeSizing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.themeToCss = themeToCss;
4
+ exports.buildSrcDoc = buildSrcDoc;
5
+ exports.resolveSandbox = resolveSandbox;
6
+ const sanitizeHtml_js_1 = require("../sanitizer/sanitizeHtml.js");
7
+ const artifactEnvelope_js_1 = require("../artifacts/artifactEnvelope.js");
8
+ const sandbox_js_1 = require("../constants/sandbox.js");
9
+ /**
10
+ * Minimal reset injected for the framed (pure artifact) path: margin/box-sizing
11
+ * only. It must NOT force a background — a standalone artifact owns its own
12
+ * background (often set inline on <html>/<body>), and an !important transparent
13
+ * rule here would override it and reveal the card surface (a white sheet in
14
+ * light mode). Camouflage transparency is handled separately by
15
+ * {@link inlineCamouflageHtml}.
16
+ */
17
+ const SEAMLESS_BASE = `<style>html,body{margin:0;padding:0;}*{box-sizing:border-box;}</style>`;
18
+ const LIGHT_COLOR = /(?:#fff(?:fff)?\b|#f[0-9a-f]{2}f[0-9a-f]{2}f[0-9a-f]{2}\b|#(?:f8fafc|f9fafb|f8f9fa|f5f5f5|f4f4f5|f3f4f6|f1f5f9|fafafa|fcfcfd|fdfdfd)\b|white\b|rgba?\(\s*(?:23[0-9]|24[0-9]|25[0-5])\s*,\s*(?:23[0-9]|24[0-9]|25[0-5])\s*,\s*(?:23[0-9]|24[0-9]|25[0-5])(?:\s*,\s*(?:0?\.[5-9]\d*|1(?:\.0+)?))?\s*\)|hsla?\(\s*(?:0|[12]?\d{1,2}|3[0-5]\d|360)\s*,\s*(?:0|[1-9]\d?|100)%\s*,\s*(?:8[8-9]|9\d|100)%[^)]*\))/i;
19
+ const LIGHT_GRADIENT = /(?:linear|radial|conic)-gradient\([^;}]*(?:#fff(?:fff)?\b|white\b|rgba?\(\s*255\s*,\s*255\s*,\s*255)[^;}]*\)/i;
20
+ /**
21
+ * Render a host {@link ArtifactTheme} into a `<style>` block exposing its values
22
+ * as CSS custom properties inside the iframe, plus sensible base color/font so
23
+ * artifacts inherit the host look. Background is intentionally left transparent
24
+ * (the host surface shows through — essential for seamless mode).
25
+ */
26
+ function themeToCss(theme) {
27
+ const vars = [];
28
+ const push = (name, value) => {
29
+ if (value)
30
+ vars.push(`${name}:${value}`);
31
+ };
32
+ push("--background", theme.background);
33
+ push("--foreground", theme.foreground);
34
+ push("--primary", theme.primary);
35
+ push("--accent", theme.accent);
36
+ push("--muted", theme.muted);
37
+ push("--border", theme.border);
38
+ push("--surface", theme.surface);
39
+ push("--radius", theme.radius);
40
+ push("--font", theme.fontFamily);
41
+ const root = vars.length ? `:root{${vars.join(";")}}` : "";
42
+ const base = [];
43
+ if (theme.foreground)
44
+ base.push("color:var(--foreground)");
45
+ if (theme.fontFamily)
46
+ base.push("font-family:var(--font)");
47
+ const baseRule = base.length ? `html,body{${base.join(";")}}` : "";
48
+ if (!root && !baseRule)
49
+ return "";
50
+ return `<style>${root}${baseRule}</style>`;
51
+ }
52
+ /** True if the string already looks like a full HTML document. */
53
+ function isFullDocument(html) {
54
+ return /<html[\s>]/i.test(html) || /<!DOCTYPE/i.test(html);
55
+ }
56
+ function injectIntoHead(doc, injection) {
57
+ if (/<\/head\s*>/i.test(doc)) {
58
+ return doc.replace(/<\/head\s*>/i, `${injection}</head>`);
59
+ }
60
+ if (/<head[^>]*>/i.test(doc)) {
61
+ return doc.replace(/<head([^>]*)>/i, `<head$1>${injection}`);
62
+ }
63
+ if (/<html[^>]*>/i.test(doc)) {
64
+ return doc.replace(/<html([^>]*)>/i, `<html$1><head>${injection}</head>`);
65
+ }
66
+ return injection + doc;
67
+ }
68
+ function themeToInlineVars(theme) {
69
+ if (!theme)
70
+ return "";
71
+ const vars = [];
72
+ const push = (name, value) => {
73
+ if (value)
74
+ vars.push(`${name}:${value}`);
75
+ };
76
+ push("--background", theme.background);
77
+ push("--foreground", theme.foreground);
78
+ push("--primary", theme.primary);
79
+ push("--accent", theme.accent);
80
+ push("--muted", theme.muted);
81
+ push("--border", theme.border);
82
+ push("--surface", theme.surface);
83
+ push("--radius", theme.radius);
84
+ push("--font", theme.fontFamily);
85
+ return vars.join(";");
86
+ }
87
+ function normalizeCamouflageHtml(html) {
88
+ return html
89
+ .replace(/<style\b([^>]*)>([\s\S]*?)<\/style>/gi, (_tag, attrs, css) => {
90
+ return `<style${attrs}>${normalizeCamouflageCss(css)}</style>`;
91
+ })
92
+ .replace(/\sstyle\s*=\s*(["'])([\s\S]*?)\1/gi, (_attr, quote, css) => {
93
+ const normalized = normalizeInlineCamouflageStyle(css);
94
+ return normalized ? ` style=${quote}${normalized}${quote}` : "";
95
+ });
96
+ }
97
+ const CAMOUFLAGE_TAGS = /<(html|body|main|section|article|aside|header|footer|nav|form|div)\b([^>]*)>/gi;
98
+ function appendInlineStyle(attrs, style) {
99
+ if (!style)
100
+ return attrs;
101
+ const styleAttr = attrs.match(/\sstyle\s*=\s*(["'])([\s\S]*?)\1/i);
102
+ if (!styleAttr)
103
+ return `${attrs} style="${style}"`;
104
+ const quote = styleAttr[1] ?? `"`;
105
+ const existing = styleAttr[2]?.trim();
106
+ const merged = existing ? `${existing};${style}` : style;
107
+ return attrs.replace(/\sstyle\s*=\s*(["'])([\s\S]*?)\1/i, ` style=${quote}${merged}${quote}`);
108
+ }
109
+ function inlineCamouflageHtml(html, theme) {
110
+ const themeVars = themeToInlineVars(theme);
111
+ const rootStyle = [
112
+ themeVars,
113
+ "margin:0!important",
114
+ "padding:0!important",
115
+ "background:transparent!important",
116
+ "background-color:transparent!important",
117
+ "background-image:none!important",
118
+ "color-scheme:normal!important",
119
+ "box-sizing:border-box",
120
+ "color:var(--foreground,#f4f4f8)!important",
121
+ theme?.fontFamily ? "font-family:var(--font)!important" : "",
122
+ ]
123
+ .filter(Boolean)
124
+ .join(";");
125
+ const bodyStyle = [
126
+ "margin:0!important",
127
+ "padding:0!important",
128
+ "background:transparent!important",
129
+ "background-color:transparent!important",
130
+ "background-image:none!important",
131
+ "box-sizing:border-box",
132
+ "color:var(--foreground,#f4f4f8)!important",
133
+ theme?.fontFamily ? "font-family:var(--font)!important" : "",
134
+ ]
135
+ .filter(Boolean)
136
+ .join(";");
137
+ const blockStyle = [
138
+ "background-color:transparent!important",
139
+ "background-image:none!important",
140
+ "box-sizing:border-box",
141
+ "color:var(--foreground,#f4f4f8)!important",
142
+ "border-color:var(--border,rgba(255,255,255,0.12))!important",
143
+ ].join(";");
144
+ return html.replace(CAMOUFLAGE_TAGS, (tag, name, attrs) => {
145
+ const lowerName = name.toLowerCase();
146
+ if (lowerName === "html")
147
+ return `<${name}${appendInlineStyle(attrs, rootStyle)}>`;
148
+ if (lowerName === "body")
149
+ return `<${name}${appendInlineStyle(attrs, bodyStyle)}>`;
150
+ return `<${name}${appendInlineStyle(attrs, blockStyle)}>`;
151
+ });
152
+ }
153
+ function normalizeInlineCamouflageStyle(style) {
154
+ return style
155
+ .split(";")
156
+ .map((declaration) => normalizeCamouflageDeclaration(declaration))
157
+ .filter(Boolean)
158
+ .join(";");
159
+ }
160
+ function normalizeCamouflageCss(css) {
161
+ return css
162
+ .replace(/([^{}]+)\{([^{}]*)\}/g, (rule, selector, body) => {
163
+ const normalizedBody = body
164
+ .split(";")
165
+ .map((declaration) => normalizeCamouflageDeclaration(declaration, /\b(html|body)\b/i.test(selector)))
166
+ .filter(Boolean)
167
+ .join(";");
168
+ return normalizedBody ? `${selector}{${normalizedBody}}` : rule;
169
+ });
170
+ }
171
+ function normalizeCamouflageDeclaration(declaration, forceTransparent = false) {
172
+ const trimmed = declaration.trim();
173
+ if (!trimmed)
174
+ return "";
175
+ const match = trimmed.match(/^(-?[\w-]+)\s*:\s*([\s\S]+)$/);
176
+ if (!match)
177
+ return trimmed;
178
+ const property = match[1]?.toLowerCase() ?? "";
179
+ const value = match[2] ?? "";
180
+ const important = /!important/i.test(value) ? " !important" : "";
181
+ const cleanValue = value.replace(/!important/gi, "").trim();
182
+ if (property === "background-image" && (forceTransparent || LIGHT_GRADIENT.test(cleanValue) || LIGHT_COLOR.test(cleanValue))) {
183
+ return `${property}:none${important}`;
184
+ }
185
+ if (property.startsWith("--") && LIGHT_COLOR.test(cleanValue)) {
186
+ return `${property}:transparent`;
187
+ }
188
+ if (property === "background" || property === "background-color") {
189
+ if (forceTransparent)
190
+ return `${property}:transparent${important}`;
191
+ if (LIGHT_COLOR.test(cleanValue) || LIGHT_GRADIENT.test(cleanValue)) {
192
+ return `${property}:transparent${important}`;
193
+ }
194
+ }
195
+ if (property === "color" && LIGHT_COLOR.test(cleanValue)) {
196
+ return `${property}:var(--foreground,#f4f4f8)${important}`;
197
+ }
198
+ return trimmed;
199
+ }
200
+ /**
201
+ * Produce the final `srcDoc` string for the preview iframe: sanitized (by
202
+ * default), wrapped into a complete document if needed, with seamless base
203
+ * styles and `<base target="_blank">` so any links open in a new tab.
204
+ */
205
+ function buildSrcDoc(rawHtml, options = {}) {
206
+ const { sanitize = true, seamless = true, camouflage = false, theme, sanitizeOptions } = options;
207
+ let html = (0, artifactEnvelope_js_1.cleanArtifactHtml)(rawHtml ?? "");
208
+ if (sanitize) {
209
+ html = (0, sanitizeHtml_js_1.sanitizeHtml)(html, { ...sanitizeOptions, allowScripts: false }).html;
210
+ }
211
+ if (camouflage) {
212
+ html = normalizeCamouflageHtml(html);
213
+ }
214
+ const themeStyles = theme && !camouflage ? themeToCss(theme) : "";
215
+ const injection = `<base target="_blank" />${seamless && !camouflage ? SEAMLESS_BASE : ""}${themeStyles}`;
216
+ let doc;
217
+ if (isFullDocument(html)) {
218
+ doc = injectIntoHead(html, injection);
219
+ }
220
+ else {
221
+ doc = `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" />${injection}</head><body>${html}</body></html>`;
222
+ }
223
+ return camouflage ? inlineCamouflageHtml(doc, theme) : doc;
224
+ }
225
+ /**
226
+ * Resolve the sandbox attribute. An explicit `sandbox` wins; otherwise we build
227
+ * a minimal token set from the flags. Forbidden tokens (notably `allow-scripts`)
228
+ * are stripped no matter what.
229
+ */
230
+ function resolveSandbox(options) {
231
+ const explicit = options.sandbox;
232
+ if (explicit !== undefined) {
233
+ return explicit
234
+ .split(/\s+/)
235
+ .filter(Boolean)
236
+ .filter((t) => !sandbox_js_1.FORBIDDEN_SANDBOX_TOKENS.includes(t))
237
+ .join(" ");
238
+ }
239
+ return options.allowForms === false ? "" : sandbox_js_1.DEFAULT_SANDBOX;
240
+ }
241
+ //# sourceMappingURL=iframeSrcDoc.js.map