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":"htmlArtifact.d.ts","sourceRoot":"","sources":["../../src/artifacts/htmlArtifact.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEzE,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,GAAG,YAAY,CAYf;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,GAC9D,YAAY,CAEd"}
@@ -0,0 +1,20 @@
1
+ import { ARTIFACT_STATUS } from "./artifactStatus.js";
2
+ /** Create a fresh artifact record in the `streaming` state. */
3
+ export function createHtmlArtifact(params) {
4
+ const now = Date.now();
5
+ return {
6
+ id: params.id,
7
+ title: params.title ?? "Untitled artifact",
8
+ type: "html",
9
+ html: "",
10
+ snapshot: "",
11
+ status: params.status ?? ARTIFACT_STATUS.STREAMING,
12
+ createdAt: now,
13
+ updatedAt: now,
14
+ };
15
+ }
16
+ /** Immutably apply a partial update, refreshing `updatedAt`. */
17
+ export function updateHtmlArtifact(artifact, patch) {
18
+ return { ...artifact, ...patch, updatedAt: Date.now() };
19
+ }
20
+ //# sourceMappingURL=htmlArtifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlArtifact.js","sourceRoot":"","sources":["../../src/artifacts/htmlArtifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAAC,MAIlC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,mBAAmB;QAC1C,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,SAAS;QAClD,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAChC,QAAsB,EACtB,KAA+D;IAE/D,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./artifactEnvelope.js";
2
+ export * from "./artifactStatus.js";
3
+ export * from "./htmlArtifact.js";
4
+ export * from "./artifactStore.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/artifacts/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./artifactEnvelope.js";
2
+ export * from "./artifactStatus.js";
3
+ export * from "./htmlArtifact.js";
4
+ export * from "./artifactStore.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/artifacts/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type CircuitStore } from "./memoryCircuitStore.js";
2
+ export type CircuitStatus = "closed" | "open" | "half-open";
3
+ export interface CircuitBreakerOptions {
4
+ key?: string;
5
+ failureThreshold?: number;
6
+ windowMs?: number;
7
+ cooldownMs?: number;
8
+ store?: CircuitStore;
9
+ now?: () => number;
10
+ }
11
+ /**
12
+ * A deliberately small circuit breaker. After `failureThreshold` failures
13
+ * within `windowMs`, the circuit opens and `allowRequest()` returns false for
14
+ * `cooldownMs`. After cooldown it goes half-open and permits a single trial;
15
+ * a success closes it, a failure re-opens it.
16
+ *
17
+ * The server uses this to fall back to markdown when HTML generation keeps
18
+ * failing, instead of repeatedly hammering a broken path.
19
+ */
20
+ export declare class CircuitBreaker {
21
+ private readonly key;
22
+ private readonly failureThreshold;
23
+ private readonly windowMs;
24
+ private readonly cooldownMs;
25
+ private readonly store;
26
+ private readonly now;
27
+ constructor(options?: CircuitBreakerOptions);
28
+ status(): CircuitStatus;
29
+ /** True if a request may proceed right now. */
30
+ allowRequest(): boolean;
31
+ recordSuccess(): void;
32
+ recordFailure(): void;
33
+ reset(): void;
34
+ }
35
+ //# sourceMappingURL=circuitBreaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuitBreaker.d.ts","sourceRoot":"","sources":["../../src/circuit-breaker/circuitBreaker.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,OAAO,GAAE,qBAA0B;IAU/C,MAAM,IAAI,aAAa;IAOvB,+CAA+C;IAC/C,YAAY,IAAI,OAAO;IAIvB,aAAa,IAAI,IAAI;IAIrB,aAAa,IAAI,IAAI;IAkBrB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,59 @@
1
+ import { CIRCUIT_BREAKER_DEFAULTS } from "../constants/defaults.js";
2
+ import { defaultCircuitStore, } from "./memoryCircuitStore.js";
3
+ /**
4
+ * A deliberately small circuit breaker. After `failureThreshold` failures
5
+ * within `windowMs`, the circuit opens and `allowRequest()` returns false for
6
+ * `cooldownMs`. After cooldown it goes half-open and permits a single trial;
7
+ * a success closes it, a failure re-opens it.
8
+ *
9
+ * The server uses this to fall back to markdown when HTML generation keeps
10
+ * failing, instead of repeatedly hammering a broken path.
11
+ */
12
+ export class CircuitBreaker {
13
+ key;
14
+ failureThreshold;
15
+ windowMs;
16
+ cooldownMs;
17
+ store;
18
+ now;
19
+ constructor(options = {}) {
20
+ this.key = options.key ?? "default";
21
+ this.failureThreshold =
22
+ options.failureThreshold ?? CIRCUIT_BREAKER_DEFAULTS.failureThreshold;
23
+ this.windowMs = options.windowMs ?? CIRCUIT_BREAKER_DEFAULTS.windowMs;
24
+ this.cooldownMs = options.cooldownMs ?? CIRCUIT_BREAKER_DEFAULTS.cooldownMs;
25
+ this.store = options.store ?? defaultCircuitStore;
26
+ this.now = options.now ?? Date.now;
27
+ }
28
+ status() {
29
+ const state = this.store.load(this.key);
30
+ if (state.openedAt === null)
31
+ return "closed";
32
+ if (this.now() - state.openedAt >= this.cooldownMs)
33
+ return "half-open";
34
+ return "open";
35
+ }
36
+ /** True if a request may proceed right now. */
37
+ allowRequest() {
38
+ return this.status() !== "open";
39
+ }
40
+ recordSuccess() {
41
+ this.store.save(this.key, { failures: [], openedAt: null });
42
+ }
43
+ recordFailure() {
44
+ const t = this.now();
45
+ const state = this.store.load(this.key);
46
+ // If we were half-open, a failure immediately re-opens.
47
+ if (state.openedAt !== null && t - state.openedAt >= this.cooldownMs) {
48
+ this.store.save(this.key, { failures: [t], openedAt: t });
49
+ return;
50
+ }
51
+ const failures = [...state.failures, t].filter((ts) => t - ts < this.windowMs);
52
+ const openedAt = failures.length >= this.failureThreshold ? t : state.openedAt;
53
+ this.store.save(this.key, { failures, openedAt });
54
+ }
55
+ reset() {
56
+ this.store.save(this.key, { failures: [], openedAt: null });
57
+ }
58
+ }
59
+ //# sourceMappingURL=circuitBreaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuitBreaker.js","sourceRoot":"","sources":["../../src/circuit-breaker/circuitBreaker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./circuitBreaker.js";
2
+ export * from "./memoryCircuitStore.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/circuit-breaker/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./circuitBreaker.js";
2
+ export * from "./memoryCircuitStore.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/circuit-breaker/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** State shared between the breaker and its backing store. */
2
+ export interface CircuitState {
3
+ /** Timestamps (ms) of recent failures within the rolling window. */
4
+ failures: number[];
5
+ /** When the circuit was opened (ms), or null if closed. */
6
+ openedAt: number | null;
7
+ }
8
+ /**
9
+ * Pluggable storage for circuit state. The default is process-memory, keyed by
10
+ * a string (e.g. per-route). Swap in a Redis-backed implementation for
11
+ * multi-instance deployments.
12
+ */
13
+ export interface CircuitStore {
14
+ load(key: string): CircuitState;
15
+ save(key: string, state: CircuitState): void;
16
+ }
17
+ export declare class MemoryCircuitStore implements CircuitStore {
18
+ private states;
19
+ load(key: string): CircuitState;
20
+ save(key: string, state: CircuitState): void;
21
+ }
22
+ /** Shared default store instance. */
23
+ export declare const defaultCircuitStore: MemoryCircuitStore;
24
+ //# sourceMappingURL=memoryCircuitStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryCircuitStore.d.ts","sourceRoot":"","sources":["../../src/circuit-breaker/memoryCircuitStore.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9C;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,MAAM,CAAmC;IAEjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IAI/B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;CAG7C;AAED,qCAAqC;AACrC,eAAO,MAAM,mBAAmB,oBAA2B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export class MemoryCircuitStore {
2
+ states = new Map();
3
+ load(key) {
4
+ return this.states.get(key) ?? { failures: [], openedAt: null };
5
+ }
6
+ save(key, state) {
7
+ this.states.set(key, state);
8
+ }
9
+ }
10
+ /** Shared default store instance. */
11
+ export const defaultCircuitStore = new MemoryCircuitStore();
12
+ //# sourceMappingURL=memoryCircuitStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryCircuitStore.js","sourceRoot":"","sources":["../../src/circuit-breaker/memoryCircuitStore.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEjD,IAAI,CAAC,GAAW;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,KAAmB;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,qCAAqC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The classifier prompt. The model must return ONLY JSON of the shape
3
+ * `{ "mode": "markdown" | "artifact" | "generative_ui", "reason": "short reason" }`.
4
+ */
5
+ export declare const CLASSIFIER_SYSTEM_PROMPT = "You are a routing classifier for an AI assistant that can answer in three ways:\n\n1. \"markdown\" \u2014 a normal text/markdown chat answer.\n2. \"artifact\" \u2014 a standalone, self-contained, STATIC HTML/CSS document rendered in a framed preview card (no JavaScript).\n3. \"generative_ui\" \u2014 a chromeless, transparent, STATIC HTML/CSS UI rendered inline so it blends with the host app (no JavaScript).\n\nDecide which mode best serves the user's most recent request.\n\nChoose \"markdown\" when text is enough:\n- explanations, Q&A, definitions, summaries\n- debugging help, error analysis, code review\n- writing code, functions, queries, scripts\n- system design, architecture, best practices, advice\n- comparisons that read fine as prose or a small table\n- general writing and conversation\n\nChoose \"artifact\" when a visual, standalone document/page adds real value:\n- standalone forms (sign-up, login, contact, survey)\n- landing pages, hero sections, pricing cards, product pages\n- dashboards, stat grids, report/stat visualizations\n- invoices, receipts, certificates, resumes/CVs\n- email/newsletter templates\n- profile/business cards, onboarding screens\n- comparison cards, timelines, funnels, galleries\n- CSS/SVG charts (bar, line, donut, progress) when the user wants a visual\n\nChoose \"generative_ui\" when the user specifically wants UI that should feel native/inline in the host app:\n- generative UI, inline UI, seamless/camouflaged/native UI\n- widgets, components, interface states, UI kits/systems, component variations\n- app/interface prototypes or explorations intended to sit inside the chat surface\n\nBe conservative: if the request is primarily about understanding, reasoning, or code, prefer \"markdown\". Do not pick an HTML mode just because a topic could be visualized \u2014 only when the user actually wants a rendered UI/document.\n\nReturn ONLY minified JSON, no prose, no code fences:\n{\"mode\":\"markdown\"|\"artifact\"|\"generative_ui\",\"reason\":\"short reason\"}";
6
+ export declare function buildClassifierUserPrompt(query: string): string;
7
+ //# sourceMappingURL=classifierPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifierPrompt.d.ts","sourceRoot":"","sources":["../../src/classifier/classifierPrompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,wBAAwB,2+DAkCkC,CAAC;AAExE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The classifier prompt. The model must return ONLY JSON of the shape
3
+ * `{ "mode": "markdown" | "artifact" | "generative_ui", "reason": "short reason" }`.
4
+ */
5
+ export const CLASSIFIER_SYSTEM_PROMPT = `You are a routing classifier for an AI assistant that can answer in three ways:
6
+
7
+ 1. "markdown" — a normal text/markdown chat answer.
8
+ 2. "artifact" — a standalone, self-contained, STATIC HTML/CSS document rendered in a framed preview card (no JavaScript).
9
+ 3. "generative_ui" — a chromeless, transparent, STATIC HTML/CSS UI rendered inline so it blends with the host app (no JavaScript).
10
+
11
+ Decide which mode best serves the user's most recent request.
12
+
13
+ Choose "markdown" when text is enough:
14
+ - explanations, Q&A, definitions, summaries
15
+ - debugging help, error analysis, code review
16
+ - writing code, functions, queries, scripts
17
+ - system design, architecture, best practices, advice
18
+ - comparisons that read fine as prose or a small table
19
+ - general writing and conversation
20
+
21
+ Choose "artifact" when a visual, standalone document/page adds real value:
22
+ - standalone forms (sign-up, login, contact, survey)
23
+ - landing pages, hero sections, pricing cards, product pages
24
+ - dashboards, stat grids, report/stat visualizations
25
+ - invoices, receipts, certificates, resumes/CVs
26
+ - email/newsletter templates
27
+ - profile/business cards, onboarding screens
28
+ - comparison cards, timelines, funnels, galleries
29
+ - CSS/SVG charts (bar, line, donut, progress) when the user wants a visual
30
+
31
+ Choose "generative_ui" when the user specifically wants UI that should feel native/inline in the host app:
32
+ - generative UI, inline UI, seamless/camouflaged/native UI
33
+ - widgets, components, interface states, UI kits/systems, component variations
34
+ - app/interface prototypes or explorations intended to sit inside the chat surface
35
+
36
+ Be conservative: if the request is primarily about understanding, reasoning, or code, prefer "markdown". Do not pick an HTML mode just because a topic could be visualized — only when the user actually wants a rendered UI/document.
37
+
38
+ Return ONLY minified JSON, no prose, no code fences:
39
+ {"mode":"markdown"|"artifact"|"generative_ui","reason":"short reason"}`;
40
+ export function buildClassifierUserPrompt(query) {
41
+ return `Classify this request:\n\n"""${query}"""\n\nReturn only the JSON object.`;
42
+ }
43
+ //# sourceMappingURL=classifierPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifierPrompt.js","sourceRoot":"","sources":["../../src/classifier/classifierPrompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAkC+B,CAAC;AAExE,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,OAAO,gCAAgC,KAAK,qCAAqC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ArtifactMode } from "../types/stream.js";
2
+ import type { GenerateText } from "../types/server.js";
3
+ export interface ClassificationResult {
4
+ mode: ArtifactMode;
5
+ reason: string;
6
+ /** Whether the decision came from the model or the heuristic fallback. */
7
+ source: "model" | "rules";
8
+ }
9
+ export interface ClassifyModeParams {
10
+ query: string;
11
+ generateText?: GenerateText;
12
+ temperature?: number;
13
+ abortSignal?: AbortSignal;
14
+ }
15
+ /**
16
+ * Classify a request as `markdown`, `artifact`, or `generative_ui`. Tries the
17
+ * model first and fails open to deterministic rules on any error or malformed output.
18
+ * Never throws — routing must always resolve.
19
+ */
20
+ export declare function classifyMode(params: ClassifyModeParams): Promise<ClassificationResult>;
21
+ //# sourceMappingURL=classifyMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifyMode.d.ts","sourceRoot":"","sources":["../../src/classifier/classifyMode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAmC/B"}
@@ -0,0 +1,50 @@
1
+ import { CLASSIFIER_SYSTEM_PROMPT, buildClassifierUserPrompt, } from "./classifierPrompt.js";
2
+ import { classifyByRules } from "./rules.js";
3
+ import { safeJsonParse } from "../utils/safeJsonParse.js";
4
+ /**
5
+ * Classify a request as `markdown`, `artifact`, or `generative_ui`. Tries the
6
+ * model first and fails open to deterministic rules on any error or malformed output.
7
+ * Never throws — routing must always resolve.
8
+ */
9
+ export async function classifyMode(params) {
10
+ const { generateText, query, temperature = 0, abortSignal } = params;
11
+ const fallback = classifyByRules(query);
12
+ if ((fallback.mode === "artifact" || fallback.mode === "generative_ui") &&
13
+ fallback.confidence >= 0.65) {
14
+ return { ...fallback, source: "rules" };
15
+ }
16
+ if (!generateText)
17
+ return { ...fallback, source: "rules" };
18
+ try {
19
+ const text = await generateText({
20
+ temperature,
21
+ system: CLASSIFIER_SYSTEM_PROMPT,
22
+ prompt: buildClassifierUserPrompt(query),
23
+ abortSignal,
24
+ });
25
+ const parsed = safeJsonParse(text, {});
26
+ const parsedMode = normalizeClassificationMode(parsed.mode);
27
+ if (parsedMode) {
28
+ return {
29
+ mode: parsedMode,
30
+ reason: parsed.reason?.slice(0, 200) ?? "model classification",
31
+ source: "model",
32
+ };
33
+ }
34
+ return { ...fallback, source: "rules" };
35
+ }
36
+ catch {
37
+ return { ...fallback, source: "rules" };
38
+ }
39
+ }
40
+ function normalizeClassificationMode(mode) {
41
+ if (mode === "markdown" ||
42
+ mode === "artifact" ||
43
+ mode === "generative_ui") {
44
+ return mode;
45
+ }
46
+ if (mode === "html_artifact")
47
+ return "artifact";
48
+ return null;
49
+ }
50
+ //# sourceMappingURL=classifyMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifyMode.js","sourceRoot":"","sources":["../../src/classifier/classifyMode.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAkB1D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA0B;IAE1B,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACrE,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAExC,IACE,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC;QACnE,QAAQ,CAAC,UAAU,IAAI,IAAI,EAC3B,CAAC;QACD,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC;YAC9B,WAAW;YACX,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE,yBAAyB,CAAC,KAAK,CAAC;YACxC,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,aAAa,CAAqC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,sBAAsB;gBAC9D,MAAM,EAAE,OAAO;aAChB,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAa;IAChD,IACE,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,eAAe,EACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAK,IAAwB,KAAK,eAAe;QAAE,OAAO,UAAU,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./rules.js";
2
+ export * from "./classifierPrompt.js";
3
+ export * from "./classifyMode.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/classifier/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./rules.js";
2
+ export * from "./classifierPrompt.js";
3
+ export * from "./classifyMode.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/classifier/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ArtifactMode } from "../types/stream.js";
2
+ export interface RuleClassification {
3
+ mode: ArtifactMode;
4
+ reason: string;
5
+ /** 0..1 — how confident the heuristic is. */
6
+ confidence: number;
7
+ }
8
+ /**
9
+ * Cheap, deterministic classification used as a pre-check and as a fallback
10
+ * when model-based classification is unavailable or fails.
11
+ */
12
+ export declare function classifyByRules(query: string): RuleClassification;
13
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/classifier/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AA6ED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAwCjE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Phrases that strongly suggest a visual, self-contained HTML/CSS preview adds
3
+ * real value over plain text.
4
+ */
5
+ const VISUAL_SIGNALS = [
6
+ /\blanding\s*page\b/i,
7
+ /\bdashboard\b/i,
8
+ /\binvoice\b/i,
9
+ /\breceipt\b/i,
10
+ /\bresume\b|\bcv\b/i,
11
+ /\bemail\s*template\b/i,
12
+ /\bpricing\s*(card|table|page)\b/i,
13
+ /\bproduct\s*(page|card)\b/i,
14
+ /\bprofile\s*card\b/i,
15
+ /\bbusiness\s*card\b/i,
16
+ /\bonboarding\s*(screen|flow)\b/i,
17
+ /\b(ui|html)\s*(mockup|preview|layout|design)\b/i,
18
+ /\bcomparison\s*(table|view|cards?)\b/i,
19
+ /\bstat(s|istic)?\s*(card|view|grid)\b/i,
20
+ /\bportfolio\b/i,
21
+ /\bnewsletter\b/i,
22
+ /\bgenerative\s*ui\b/i,
23
+ /\b(interface|ui)\s*(kit|system|concept|exploration|variations?|combinations?)\b/i,
24
+ /\b(combinations?|variations?|states?)\b[\s\S]*\b(ui|interface|layout|screen|component)\b/i,
25
+ /\bbeautiful\b[\s\S]*\b(ui|interface|layout|screen|component|dashboard|page)\b/i,
26
+ /\bstatic\s*(app|interface|experience|prototype)\b/i,
27
+ /\bvisual\s*(prototype|concept|system|kit|exploration)\b/i,
28
+ /\bcertificate\b/i,
29
+ /\bmenu\b.*\b(restaurant|cafe|food)\b/i,
30
+ /\btimeline\b/i,
31
+ /\bgallery\b/i,
32
+ /\b(bar|line|pie|donut|doughnut)\s*chart\b/i,
33
+ /\b(report|stats?)\s*(visuali[sz]ation|view)\b/i,
34
+ /\bsign[\s-]?up\s*form\b|\blogin\s*form\b|\bcontact\s*form\b/i,
35
+ /\b(build|create|make|generate|design|render|show me|mock up|wireframe)\b[\s\S]*\b(page|form|card|table|layout|widget|view|screen|template|ui|website|webpage|section|hero|banner)\b/i,
36
+ /\b(build|create|make|generate|design|render|show me|mock up|wireframe)\b[\s\S]*\b(app|interface|component|prototype|artifact|visual)\b/i,
37
+ ];
38
+ /**
39
+ * Requests that should blend into the host chat/application rather than render
40
+ * as a standalone document card.
41
+ */
42
+ const GENERATIVE_UI_SIGNALS = [
43
+ /\bgenerative\s*ui\b/i,
44
+ /\bcamouflage\b/i,
45
+ /\btransparent\b/i,
46
+ /\bshowcase\b/i,
47
+ /\bblend(s|ing)?\s*(in|into|with)?\b[\s\S]*\b(chat|host|ui|app)\b/i,
48
+ /\bsit(s|ting)?\s*(on|in|inside)\b[\s\S]*\b(chat|host|app|page)\b/i,
49
+ /\binline\s*(ui|interface|component|artifact|preview)\b/i,
50
+ /\b(seamless|camouflage|native|chromeless)\s*(ui|interface|component|artifact|preview|gen|generation)?\b/i,
51
+ /\b(component|widget)\b/i,
52
+ /\b(app|interface)\s*(prototype|concept|exploration|variations?|states?)\b/i,
53
+ /\b(ui|interface)\s*(kit|system|concept|exploration|variations?|combinations?)\b/i,
54
+ /\b(combinations?|variations?|states?)\b[\s\S]*\b(ui|interface|screen|component)\b/i,
55
+ /\ball\s+(the\s+)?(combinations?|variations?|components?|states?)\b/i,
56
+ /\bstatic\s*(app|interface|experience|prototype)\b/i,
57
+ /\bvisual\s*(prototype|concept|system|kit|exploration)\b/i,
58
+ ];
59
+ /** Phrases that strongly suggest a text answer is the right output. */
60
+ const TEXTUAL_SIGNALS = [
61
+ /\bexplain\b|\bexplanation\b/i,
62
+ /\bwhy\b|\bhow\s+(do|does|can|should|would|to)\b/i,
63
+ /\bwhat\s+is\b|\bwhat\s+are\b|\bwhat'?s\b/i,
64
+ /\bdebug\b|\bfix\b|\berror\b|\bstack\s*trace\b|\bexception\b/i,
65
+ /\bdifference\s+between\b|\bcompare\b(?!.*\bcards?\b)/i,
66
+ /\barchitecture\b|\bsystem\s*design\b|\bdesign\s*pattern\b/i,
67
+ /\bbest\s*practice\b|\badvice\b|\brecommend\b|\bshould\s+i\b/i,
68
+ /\brefactor\b|\boptimi[sz]e\b|\bperformance\b/i,
69
+ /\bwrite\s+(a\s+)?(function|class|script|query|regex|algorithm|sql|test)\b/i,
70
+ /\bsummari[sz]e\b|\bdefine\b|\bmeaning\s+of\b/i,
71
+ /\bpros\s+and\s+cons\b|\btrade[\s-]?offs?\b/i,
72
+ ];
73
+ /**
74
+ * Cheap, deterministic classification used as a pre-check and as a fallback
75
+ * when model-based classification is unavailable or fails.
76
+ */
77
+ export function classifyByRules(query) {
78
+ const text = (query ?? "").trim();
79
+ if (!text) {
80
+ return { mode: "markdown", reason: "Empty query", confidence: 0.5 };
81
+ }
82
+ let visual = 0;
83
+ let generative = 0;
84
+ let textual = 0;
85
+ for (const re of VISUAL_SIGNALS)
86
+ if (re.test(text))
87
+ visual++;
88
+ for (const re of GENERATIVE_UI_SIGNALS)
89
+ if (re.test(text))
90
+ generative++;
91
+ for (const re of TEXTUAL_SIGNALS)
92
+ if (re.test(text))
93
+ textual++;
94
+ if (visual === 0 && generative === 0 && textual === 0) {
95
+ return {
96
+ mode: "markdown",
97
+ reason: "No strong visual signal; defaulting to text",
98
+ confidence: 0.4,
99
+ };
100
+ }
101
+ if (visual > textual || generative > textual) {
102
+ return {
103
+ mode: generative > 0 ? "generative_ui" : "artifact",
104
+ reason: generative > 0
105
+ ? `Matched ${generative} generative UI signal(s)`
106
+ : `Matched ${visual} visual signal(s)`,
107
+ confidence: Math.min(0.5 + 0.15 * Math.max(visual, generative - textual), 0.95),
108
+ };
109
+ }
110
+ return {
111
+ mode: "markdown",
112
+ reason: textual >= visual
113
+ ? `Matched ${textual} textual signal(s)`
114
+ : "Leaning textual",
115
+ confidence: Math.min(0.5 + 0.15 * (textual - visual), 0.95),
116
+ };
117
+ }
118
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/classifier/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ import type { HtmlArtifactCardProps, UseArtifactStreamOptions } from "../types/client.js";
3
+ export interface ArtifactChatProps extends UseArtifactStreamOptions {
4
+ placeholder?: string;
5
+ emptyState?: React.ReactNode;
6
+ cardProps?: Partial<Omit<HtmlArtifactCardProps, "artifact">>;
7
+ className?: string;
8
+ }
9
+ /**
10
+ * A batteries-included chat surface: message list, streaming status, and a
11
+ * composer. Drop it in with just an `endpoint` to get the full experience, or
12
+ * compose `useArtifactStream` + `ArtifactMessage` yourself for custom layouts.
13
+ */
14
+ export declare function ArtifactChat(props: ArtifactChatProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=ArtifactChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArtifactChat.d.ts","sourceRoot":"","sources":["../../src/client/ArtifactChat.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE1F,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAgGpD"}
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { useArtifactStream } from "./useArtifactStream.js";
5
+ import { ArtifactMessage } from "./ArtifactMessage.js";
6
+ /**
7
+ * A batteries-included chat surface: message list, streaming status, and a
8
+ * composer. Drop it in with just an `endpoint` to get the full experience, or
9
+ * compose `useArtifactStream` + `ArtifactMessage` yourself for custom layouts.
10
+ */
11
+ export function ArtifactChat(props) {
12
+ const { placeholder = "Ask anything, or describe a UI to generate…", emptyState, cardProps, className, ...streamOptions } = props;
13
+ const { messages, artifacts, status, sendMessage, stop } = useArtifactStream(streamOptions);
14
+ const [input, setInput] = React.useState("");
15
+ const scrollRef = React.useRef(null);
16
+ const busy = status === "submitted" || status === "streaming";
17
+ React.useEffect(() => {
18
+ scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: "smooth" });
19
+ }, [messages, artifacts]);
20
+ const submit = (e) => {
21
+ e.preventDefault();
22
+ const text = input;
23
+ setInput("");
24
+ void sendMessage(text);
25
+ };
26
+ return (_jsxs("div", { className: className, style: {
27
+ display: "flex",
28
+ flexDirection: "column",
29
+ height: "100%",
30
+ minHeight: 0,
31
+ fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
32
+ color: "var(--aha-fg, #1f2430)",
33
+ }, children: [_jsxs("div", { ref: scrollRef, style: { flex: 1, minHeight: 0, overflowY: "auto", padding: "8px 4px" }, children: [messages.length === 0 &&
34
+ (emptyState ?? (_jsx("div", { style: { textAlign: "center", color: "#9ca3af", padding: "48px 16px", fontSize: 14 }, children: "Start the conversation \u2014 try \u201Cexplain CSS grid\u201D or \u201Ca pricing page for a SaaS\u201D." }))), messages.map((message) => (_jsx(ArtifactMessage, { message: message, artifacts: artifacts, cardProps: cardProps }, message.id))), status === "submitted" && (_jsx("div", { style: { color: "#9ca3af", fontSize: 13, padding: "6px 2px" }, children: "Thinking\u2026" }))] }), _jsxs("form", { onSubmit: submit, style: {
35
+ display: "flex",
36
+ gap: 8,
37
+ padding: 10,
38
+ borderTop: "1px solid rgba(0,0,0,0.08)",
39
+ }, children: [_jsx("input", { value: input, onChange: (e) => setInput(e.target.value), placeholder: placeholder, "aria-label": "Message", style: {
40
+ flex: 1,
41
+ border: "1px solid rgba(0,0,0,0.14)",
42
+ borderRadius: 12,
43
+ padding: "11px 14px",
44
+ fontSize: 14.5,
45
+ outline: "none",
46
+ background: "#fff",
47
+ } }), busy ? (_jsx("button", { type: "button", onClick: stop, style: btn("#ef4444"), children: "Stop" })) : (_jsx("button", { type: "submit", disabled: !input.trim(), style: btn("#2563eb", !input.trim()), children: "Send" }))] })] }));
48
+ }
49
+ function btn(bg, disabled = false) {
50
+ return {
51
+ border: "none",
52
+ borderRadius: 12,
53
+ padding: "0 18px",
54
+ fontSize: 14.5,
55
+ fontWeight: 600,
56
+ color: "#fff",
57
+ background: bg,
58
+ cursor: disabled ? "not-allowed" : "pointer",
59
+ opacity: disabled ? 0.5 : 1,
60
+ };
61
+ }
62
+ //# sourceMappingURL=ArtifactChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArtifactChat.js","sourceRoot":"","sources":["../../src/client/ArtifactChat.tsx"],"names":[],"mappings":"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"}