@tai42/studio-sdk 0.2.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 (422) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +15 -0
  3. package/README.md +318 -0
  4. package/SECURITY.md +51 -0
  5. package/dist/components/badge.d.ts +13 -0
  6. package/dist/components/badge.d.ts.map +1 -0
  7. package/dist/components/badge.js +14 -0
  8. package/dist/components/badge.js.map +1 -0
  9. package/dist/components/checkbox.d.ts +24 -0
  10. package/dist/components/checkbox.d.ts.map +1 -0
  11. package/dist/components/checkbox.js +31 -0
  12. package/dist/components/checkbox.js.map +1 -0
  13. package/dist/components/code-block.d.ts +7 -0
  14. package/dist/components/code-block.d.ts.map +1 -0
  15. package/dist/components/code-block.js +23 -0
  16. package/dist/components/code-block.js.map +1 -0
  17. package/dist/components/completion-input.d.ts +31 -0
  18. package/dist/components/completion-input.d.ts.map +1 -0
  19. package/dist/components/completion-input.js +61 -0
  20. package/dist/components/completion-input.js.map +1 -0
  21. package/dist/components/components.css +2212 -0
  22. package/dist/components/confirm-dialog.d.ts +40 -0
  23. package/dist/components/confirm-dialog.d.ts.map +1 -0
  24. package/dist/components/confirm-dialog.js +11 -0
  25. package/dist/components/confirm-dialog.js.map +1 -0
  26. package/dist/components/control-styles.d.ts +12 -0
  27. package/dist/components/control-styles.d.ts.map +1 -0
  28. package/dist/components/control-styles.js +14 -0
  29. package/dist/components/control-styles.js.map +1 -0
  30. package/dist/components/copy-field.d.ts +8 -0
  31. package/dist/components/copy-field.d.ts.map +1 -0
  32. package/dist/components/copy-field.js +106 -0
  33. package/dist/components/copy-field.js.map +1 -0
  34. package/dist/components/dialog.d.ts +21 -0
  35. package/dist/components/dialog.d.ts.map +1 -0
  36. package/dist/components/dialog.js +25 -0
  37. package/dist/components/dialog.js.map +1 -0
  38. package/dist/components/drawer.d.ts +22 -0
  39. package/dist/components/drawer.d.ts.map +1 -0
  40. package/dist/components/drawer.js +32 -0
  41. package/dist/components/drawer.js.map +1 -0
  42. package/dist/components/error-boundary.d.ts +33 -0
  43. package/dist/components/error-boundary.d.ts.map +1 -0
  44. package/dist/components/error-boundary.js +36 -0
  45. package/dist/components/error-boundary.js.map +1 -0
  46. package/dist/components/extension-combo-builder.d.ts +70 -0
  47. package/dist/components/extension-combo-builder.d.ts.map +1 -0
  48. package/dist/components/extension-combo-builder.js +154 -0
  49. package/dist/components/extension-combo-builder.js.map +1 -0
  50. package/dist/components/extension-grouping.d.ts +65 -0
  51. package/dist/components/extension-grouping.d.ts.map +1 -0
  52. package/dist/components/extension-grouping.js +78 -0
  53. package/dist/components/extension-grouping.js.map +1 -0
  54. package/dist/components/extension-picker.d.ts +35 -0
  55. package/dist/components/extension-picker.d.ts.map +1 -0
  56. package/dist/components/extension-picker.js +31 -0
  57. package/dist/components/extension-picker.js.map +1 -0
  58. package/dist/components/external-link.d.ts +19 -0
  59. package/dist/components/external-link.d.ts.map +1 -0
  60. package/dist/components/external-link.js +12 -0
  61. package/dist/components/external-link.js.map +1 -0
  62. package/dist/components/field.d.ts +64 -0
  63. package/dist/components/field.d.ts.map +1 -0
  64. package/dist/components/field.js +56 -0
  65. package/dist/components/field.js.map +1 -0
  66. package/dist/components/fleet-report.d.ts +39 -0
  67. package/dist/components/fleet-report.d.ts.map +1 -0
  68. package/dist/components/fleet-report.js +50 -0
  69. package/dist/components/fleet-report.js.map +1 -0
  70. package/dist/components/fonts.css +22 -0
  71. package/dist/components/icons.d.ts +142 -0
  72. package/dist/components/icons.d.ts.map +1 -0
  73. package/dist/components/icons.js +139 -0
  74. package/dist/components/icons.js.map +1 -0
  75. package/dist/components/inputs.d.ts +52 -0
  76. package/dist/components/inputs.d.ts.map +1 -0
  77. package/dist/components/inputs.js +35 -0
  78. package/dist/components/inputs.js.map +1 -0
  79. package/dist/components/json-diff.d.ts +40 -0
  80. package/dist/components/json-diff.d.ts.map +1 -0
  81. package/dist/components/json-diff.js +119 -0
  82. package/dist/components/json-diff.js.map +1 -0
  83. package/dist/components/json-tree.d.ts +8 -0
  84. package/dist/components/json-tree.d.ts.map +1 -0
  85. package/dist/components/json-tree.js +70 -0
  86. package/dist/components/json-tree.js.map +1 -0
  87. package/dist/components/modal-focus.d.ts +15 -0
  88. package/dist/components/modal-focus.d.ts.map +1 -0
  89. package/dist/components/modal-focus.js +136 -0
  90. package/dist/components/modal-focus.js.map +1 -0
  91. package/dist/components/page-header.d.ts +56 -0
  92. package/dist/components/page-header.d.ts.map +1 -0
  93. package/dist/components/page-header.js +24 -0
  94. package/dist/components/page-header.js.map +1 -0
  95. package/dist/components/primitives.d.ts +186 -0
  96. package/dist/components/primitives.d.ts.map +1 -0
  97. package/dist/components/primitives.js +204 -0
  98. package/dist/components/primitives.js.map +1 -0
  99. package/dist/components/progress-bar.d.ts +29 -0
  100. package/dist/components/progress-bar.d.ts.map +1 -0
  101. package/dist/components/progress-bar.js +48 -0
  102. package/dist/components/progress-bar.js.map +1 -0
  103. package/dist/components/radio-group.d.ts +37 -0
  104. package/dist/components/radio-group.d.ts.map +1 -0
  105. package/dist/components/radio-group.js +56 -0
  106. package/dist/components/radio-group.js.map +1 -0
  107. package/dist/components/reveal-input.d.ts +13 -0
  108. package/dist/components/reveal-input.d.ts.map +1 -0
  109. package/dist/components/reveal-input.js +31 -0
  110. package/dist/components/reveal-input.js.map +1 -0
  111. package/dist/components/scroll-region.d.ts +85 -0
  112. package/dist/components/scroll-region.d.ts.map +1 -0
  113. package/dist/components/scroll-region.js +574 -0
  114. package/dist/components/scroll-region.js.map +1 -0
  115. package/dist/components/select.d.ts +53 -0
  116. package/dist/components/select.d.ts.map +1 -0
  117. package/dist/components/select.js +33 -0
  118. package/dist/components/select.js.map +1 -0
  119. package/dist/components/table.d.ts +59 -0
  120. package/dist/components/table.d.ts.map +1 -0
  121. package/dist/components/table.js +20 -0
  122. package/dist/components/table.js.map +1 -0
  123. package/dist/components/tabs.d.ts +15 -0
  124. package/dist/components/tabs.d.ts.map +1 -0
  125. package/dist/components/tabs.js +13 -0
  126. package/dist/components/tabs.js.map +1 -0
  127. package/dist/components/tags.d.ts +46 -0
  128. package/dist/components/tags.d.ts.map +1 -0
  129. package/dist/components/tags.js +68 -0
  130. package/dist/components/tags.js.map +1 -0
  131. package/dist/components/tokens.css +392 -0
  132. package/dist/components/tokens.d.ts +15 -0
  133. package/dist/components/tokens.d.ts.map +1 -0
  134. package/dist/components/tokens.js +101 -0
  135. package/dist/components/tokens.js.map +1 -0
  136. package/dist/components/tool-picker.d.ts +24 -0
  137. package/dist/components/tool-picker.d.ts.map +1 -0
  138. package/dist/components/tool-picker.js +97 -0
  139. package/dist/components/tool-picker.js.map +1 -0
  140. package/dist/components/tooltip.d.ts +17 -0
  141. package/dist/components/tooltip.d.ts.map +1 -0
  142. package/dist/components/tooltip.js +18 -0
  143. package/dist/components/tooltip.js.map +1 -0
  144. package/dist/components/version-history-panel.d.ts +71 -0
  145. package/dist/components/version-history-panel.d.ts.map +1 -0
  146. package/dist/components/version-history-panel.js +148 -0
  147. package/dist/components/version-history-panel.js.map +1 -0
  148. package/dist/download.d.ts +7 -0
  149. package/dist/download.d.ts.map +1 -0
  150. package/dist/download.js +18 -0
  151. package/dist/download.js.map +1 -0
  152. package/dist/element-slot.d.ts +4 -0
  153. package/dist/element-slot.d.ts.map +1 -0
  154. package/dist/element-slot.js +20 -0
  155. package/dist/element-slot.js.map +1 -0
  156. package/dist/elicitation/ElicitationForm.d.ts +34 -0
  157. package/dist/elicitation/ElicitationForm.d.ts.map +1 -0
  158. package/dist/elicitation/ElicitationForm.js +24 -0
  159. package/dist/elicitation/ElicitationForm.js.map +1 -0
  160. package/dist/errors.d.ts +9 -0
  161. package/dist/errors.d.ts.map +1 -0
  162. package/dist/errors.js +15 -0
  163. package/dist/errors.js.map +1 -0
  164. package/dist/extension-combos.d.ts +13 -0
  165. package/dist/extension-combos.d.ts.map +1 -0
  166. package/dist/extension-combos.js +9 -0
  167. package/dist/extension-combos.js.map +1 -0
  168. package/dist/hooks/useApi.d.ts +1222 -0
  169. package/dist/hooks/useApi.d.ts.map +1 -0
  170. package/dist/hooks/useApi.js +22 -0
  171. package/dist/hooks/useApi.js.map +1 -0
  172. package/dist/hooks/useAuth.d.ts +13 -0
  173. package/dist/hooks/useAuth.d.ts.map +1 -0
  174. package/dist/hooks/useAuth.js +53 -0
  175. package/dist/hooks/useAuth.js.map +1 -0
  176. package/dist/hooks/useBreakpoint.d.ts +10 -0
  177. package/dist/hooks/useBreakpoint.d.ts.map +1 -0
  178. package/dist/hooks/useBreakpoint.js +66 -0
  179. package/dist/hooks/useBreakpoint.js.map +1 -0
  180. package/dist/hooks/useCapabilities.d.ts +88 -0
  181. package/dist/hooks/useCapabilities.d.ts.map +1 -0
  182. package/dist/hooks/useCapabilities.js +203 -0
  183. package/dist/hooks/useCapabilities.js.map +1 -0
  184. package/dist/hooks/useSse.d.ts +13 -0
  185. package/dist/hooks/useSse.d.ts.map +1 -0
  186. package/dist/hooks/useSse.js +298 -0
  187. package/dist/hooks/useSse.js.map +1 -0
  188. package/dist/hooks/useTheme.d.ts +20 -0
  189. package/dist/hooks/useTheme.d.ts.map +1 -0
  190. package/dist/hooks/useTheme.js +97 -0
  191. package/dist/hooks/useTheme.js.map +1 -0
  192. package/dist/hooks/useUnauthorized.d.ts +3 -0
  193. package/dist/hooks/useUnauthorized.d.ts.map +1 -0
  194. package/dist/hooks/useUnauthorized.js +18 -0
  195. package/dist/hooks/useUnauthorized.js.map +1 -0
  196. package/dist/host.d.ts +11 -0
  197. package/dist/host.d.ts.map +1 -0
  198. package/dist/host.js +10 -0
  199. package/dist/host.js.map +1 -0
  200. package/dist/index.d.ts +118 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +91 -0
  203. package/dist/index.js.map +1 -0
  204. package/dist/navigation/context.d.ts +25 -0
  205. package/dist/navigation/context.d.ts.map +1 -0
  206. package/dist/navigation/context.js +45 -0
  207. package/dist/navigation/context.js.map +1 -0
  208. package/dist/navigation/index.d.ts +4 -0
  209. package/dist/navigation/index.d.ts.map +1 -0
  210. package/dist/navigation/index.js +2 -0
  211. package/dist/navigation/index.js.map +1 -0
  212. package/dist/navigation/types.d.ts +97 -0
  213. package/dist/navigation/types.d.ts.map +1 -0
  214. package/dist/navigation/types.js +16 -0
  215. package/dist/navigation/types.js.map +1 -0
  216. package/dist/plugin/host-state.d.ts +45 -0
  217. package/dist/plugin/host-state.d.ts.map +1 -0
  218. package/dist/plugin/host-state.js +62 -0
  219. package/dist/plugin/host-state.js.map +1 -0
  220. package/dist/plugin/registry.d.ts +35 -0
  221. package/dist/plugin/registry.d.ts.map +1 -0
  222. package/dist/plugin/registry.js +129 -0
  223. package/dist/plugin/registry.js.map +1 -0
  224. package/dist/plugin/types.d.ts +165 -0
  225. package/dist/plugin/types.d.ts.map +1 -0
  226. package/dist/plugin/types.js +2 -0
  227. package/dist/plugin/types.js.map +1 -0
  228. package/dist/plugin/version.d.ts +34 -0
  229. package/dist/plugin/version.d.ts.map +1 -0
  230. package/dist/plugin/version.js +37 -0
  231. package/dist/plugin/version.js.map +1 -0
  232. package/dist/query-keys.d.ts +31 -0
  233. package/dist/query-keys.d.ts.map +1 -0
  234. package/dist/query-keys.js +31 -0
  235. package/dist/query-keys.js.map +1 -0
  236. package/dist/schema-editor/SchemaEditor.d.ts +43 -0
  237. package/dist/schema-editor/SchemaEditor.d.ts.map +1 -0
  238. package/dist/schema-editor/SchemaEditor.js +106 -0
  239. package/dist/schema-editor/SchemaEditor.js.map +1 -0
  240. package/dist/schema-editor/index.d.ts +10 -0
  241. package/dist/schema-editor/index.d.ts.map +1 -0
  242. package/dist/schema-editor/index.js +8 -0
  243. package/dist/schema-editor/index.js.map +1 -0
  244. package/dist/schema-editor/lint.d.ts +37 -0
  245. package/dist/schema-editor/lint.d.ts.map +1 -0
  246. package/dist/schema-editor/lint.js +49 -0
  247. package/dist/schema-editor/lint.js.map +1 -0
  248. package/dist/schema-form/SchemaForm.d.ts +70 -0
  249. package/dist/schema-form/SchemaForm.d.ts.map +1 -0
  250. package/dist/schema-form/SchemaForm.js +13 -0
  251. package/dist/schema-form/SchemaForm.js.map +1 -0
  252. package/dist/schema-form/array-field.d.ts +20 -0
  253. package/dist/schema-form/array-field.d.ts.map +1 -0
  254. package/dist/schema-form/array-field.js +39 -0
  255. package/dist/schema-form/array-field.js.map +1 -0
  256. package/dist/schema-form/classify.d.ts +87 -0
  257. package/dist/schema-form/classify.d.ts.map +1 -0
  258. package/dist/schema-form/classify.js +199 -0
  259. package/dist/schema-form/classify.js.map +1 -0
  260. package/dist/schema-form/context.d.ts +4 -0
  261. package/dist/schema-form/context.d.ts.map +1 -0
  262. package/dist/schema-form/context.js +14 -0
  263. package/dist/schema-form/context.js.map +1 -0
  264. package/dist/schema-form/default-value.d.ts +8 -0
  265. package/dist/schema-form/default-value.d.ts.map +1 -0
  266. package/dist/schema-form/default-value.js +64 -0
  267. package/dist/schema-form/default-value.js.map +1 -0
  268. package/dist/schema-form/enum-field.d.ts +19 -0
  269. package/dist/schema-form/enum-field.d.ts.map +1 -0
  270. package/dist/schema-form/enum-field.js +26 -0
  271. package/dist/schema-form/enum-field.js.map +1 -0
  272. package/dist/schema-form/field-group.d.ts +9 -0
  273. package/dist/schema-form/field-group.d.ts.map +1 -0
  274. package/dist/schema-form/field-group.js +32 -0
  275. package/dist/schema-form/field-group.js.map +1 -0
  276. package/dist/schema-form/field-node.d.ts +24 -0
  277. package/dist/schema-form/field-node.d.ts.map +1 -0
  278. package/dist/schema-form/field-node.js +51 -0
  279. package/dist/schema-form/field-node.js.map +1 -0
  280. package/dist/schema-form/index.d.ts +13 -0
  281. package/dist/schema-form/index.d.ts.map +1 -0
  282. package/dist/schema-form/index.js +11 -0
  283. package/dist/schema-form/index.js.map +1 -0
  284. package/dist/schema-form/media-field.d.ts +24 -0
  285. package/dist/schema-form/media-field.d.ts.map +1 -0
  286. package/dist/schema-form/media-field.js +169 -0
  287. package/dist/schema-form/media-field.js.map +1 -0
  288. package/dist/schema-form/media.d.ts +40 -0
  289. package/dist/schema-form/media.d.ts.map +1 -0
  290. package/dist/schema-form/media.js +65 -0
  291. package/dist/schema-form/media.js.map +1 -0
  292. package/dist/schema-form/object-fields.d.ts +20 -0
  293. package/dist/schema-form/object-fields.d.ts.map +1 -0
  294. package/dist/schema-form/object-fields.js +24 -0
  295. package/dist/schema-form/object-fields.js.map +1 -0
  296. package/dist/schema-form/resolve.d.ts +41 -0
  297. package/dist/schema-form/resolve.d.ts.map +1 -0
  298. package/dist/schema-form/resolve.js +102 -0
  299. package/dist/schema-form/resolve.js.map +1 -0
  300. package/dist/schema-form/string-field.d.ts +20 -0
  301. package/dist/schema-form/string-field.d.ts.map +1 -0
  302. package/dist/schema-form/string-field.js +68 -0
  303. package/dist/schema-form/string-field.js.map +1 -0
  304. package/dist/schema-form/styles.d.ts +18 -0
  305. package/dist/schema-form/styles.d.ts.map +1 -0
  306. package/dist/schema-form/styles.js +18 -0
  307. package/dist/schema-form/styles.js.map +1 -0
  308. package/dist/schema-form/types.d.ts +67 -0
  309. package/dist/schema-form/types.d.ts.map +1 -0
  310. package/dist/schema-form/types.js +10 -0
  311. package/dist/schema-form/types.js.map +1 -0
  312. package/dist/schema-form/union-field.d.ts +24 -0
  313. package/dist/schema-form/union-field.d.ts.map +1 -0
  314. package/dist/schema-form/union-field.js +55 -0
  315. package/dist/schema-form/union-field.js.map +1 -0
  316. package/dist/schema-form/union.d.ts +4 -0
  317. package/dist/schema-form/union.d.ts.map +1 -0
  318. package/dist/schema-form/union.js +68 -0
  319. package/dist/schema-form/union.js.map +1 -0
  320. package/dist/schema-form/unsupported-notice.d.ts +18 -0
  321. package/dist/schema-form/unsupported-notice.d.ts.map +1 -0
  322. package/dist/schema-form/unsupported-notice.js +8 -0
  323. package/dist/schema-form/unsupported-notice.js.map +1 -0
  324. package/dist/schema-form/validate.d.ts +18 -0
  325. package/dist/schema-form/validate.d.ts.map +1 -0
  326. package/dist/schema-form/validate.js +162 -0
  327. package/dist/schema-form/validate.js.map +1 -0
  328. package/dist/structured-output/StructuredOutput.d.ts +27 -0
  329. package/dist/structured-output/StructuredOutput.d.ts.map +1 -0
  330. package/dist/structured-output/StructuredOutput.js +41 -0
  331. package/dist/structured-output/StructuredOutput.js.map +1 -0
  332. package/dist/testing.d.ts +80 -0
  333. package/dist/testing.d.ts.map +1 -0
  334. package/dist/testing.js +207 -0
  335. package/dist/testing.js.map +1 -0
  336. package/package.json +101 -0
  337. package/src/components/badge.tsx +31 -0
  338. package/src/components/checkbox.tsx +93 -0
  339. package/src/components/code-block.tsx +37 -0
  340. package/src/components/completion-input.tsx +137 -0
  341. package/src/components/components.css +2212 -0
  342. package/src/components/confirm-dialog.tsx +77 -0
  343. package/src/components/control-styles.ts +14 -0
  344. package/src/components/copy-field.tsx +178 -0
  345. package/src/components/dialog.tsx +76 -0
  346. package/src/components/drawer.tsx +83 -0
  347. package/src/components/error-boundary.tsx +56 -0
  348. package/src/components/extension-combo-builder.tsx +305 -0
  349. package/src/components/extension-grouping.ts +116 -0
  350. package/src/components/extension-picker.tsx +97 -0
  351. package/src/components/external-link.tsx +40 -0
  352. package/src/components/field.tsx +169 -0
  353. package/src/components/fleet-report.tsx +136 -0
  354. package/src/components/fonts.css +22 -0
  355. package/src/components/icons.tsx +504 -0
  356. package/src/components/inputs.tsx +125 -0
  357. package/src/components/json-diff.tsx +192 -0
  358. package/src/components/json-tree.tsx +129 -0
  359. package/src/components/modal-focus.ts +150 -0
  360. package/src/components/page-header.tsx +107 -0
  361. package/src/components/primitives.tsx +489 -0
  362. package/src/components/progress-bar.tsx +100 -0
  363. package/src/components/radio-group.tsx +160 -0
  364. package/src/components/reveal-input.tsx +87 -0
  365. package/src/components/scroll-region.tsx +703 -0
  366. package/src/components/select.tsx +149 -0
  367. package/src/components/table.tsx +94 -0
  368. package/src/components/tabs.tsx +51 -0
  369. package/src/components/tags.tsx +137 -0
  370. package/src/components/tokens.css +392 -0
  371. package/src/components/tokens.ts +102 -0
  372. package/src/components/tool-picker.tsx +175 -0
  373. package/src/components/tooltip.tsx +46 -0
  374. package/src/components/version-history-panel.tsx +407 -0
  375. package/src/css.d.ts +2 -0
  376. package/src/download.ts +17 -0
  377. package/src/element-slot.ts +22 -0
  378. package/src/elicitation/ElicitationForm.tsx +87 -0
  379. package/src/errors.ts +12 -0
  380. package/src/extension-combos.ts +18 -0
  381. package/src/hooks/useApi.ts +27 -0
  382. package/src/hooks/useAuth.ts +67 -0
  383. package/src/hooks/useBreakpoint.ts +78 -0
  384. package/src/hooks/useCapabilities.ts +242 -0
  385. package/src/hooks/useSse.ts +314 -0
  386. package/src/hooks/useTheme.ts +133 -0
  387. package/src/hooks/useUnauthorized.ts +20 -0
  388. package/src/host.ts +15 -0
  389. package/src/index.ts +267 -0
  390. package/src/navigation/context.tsx +90 -0
  391. package/src/navigation/index.ts +9 -0
  392. package/src/navigation/types.ts +90 -0
  393. package/src/plugin/host-state.ts +93 -0
  394. package/src/plugin/registry.ts +174 -0
  395. package/src/plugin/types.ts +178 -0
  396. package/src/plugin/version.ts +44 -0
  397. package/src/query-keys.ts +34 -0
  398. package/src/schema-editor/SchemaEditor.tsx +186 -0
  399. package/src/schema-editor/index.ts +9 -0
  400. package/src/schema-editor/lint.ts +70 -0
  401. package/src/schema-form/SchemaForm.tsx +107 -0
  402. package/src/schema-form/array-field.tsx +110 -0
  403. package/src/schema-form/classify.ts +302 -0
  404. package/src/schema-form/context.ts +17 -0
  405. package/src/schema-form/default-value.ts +65 -0
  406. package/src/schema-form/enum-field.tsx +65 -0
  407. package/src/schema-form/field-group.tsx +71 -0
  408. package/src/schema-form/field-node.tsx +161 -0
  409. package/src/schema-form/index.ts +12 -0
  410. package/src/schema-form/media-field.tsx +281 -0
  411. package/src/schema-form/media.ts +69 -0
  412. package/src/schema-form/object-fields.tsx +74 -0
  413. package/src/schema-form/resolve.ts +114 -0
  414. package/src/schema-form/string-field.tsx +161 -0
  415. package/src/schema-form/styles.ts +20 -0
  416. package/src/schema-form/types.ts +71 -0
  417. package/src/schema-form/union-field.tsx +122 -0
  418. package/src/schema-form/union.ts +78 -0
  419. package/src/schema-form/unsupported-notice.tsx +39 -0
  420. package/src/schema-form/validate.ts +183 -0
  421. package/src/structured-output/StructuredOutput.tsx +81 -0
  422. package/src/testing.ts +235 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * `validateAgainstSchema` — a loud, structured pre-submit check. It walks the
3
+ * schema against a value and returns a path-keyed `SchemaFormErrors` bag:
4
+ * required-presence, type/format mismatches, enum/const violations, and any
5
+ * `unsupported` construct (surfaced, never hidden). It never throws on a
6
+ * malformed value — a malformed value IS the error it reports.
7
+ */
8
+ import { classifySchema } from './classify';
9
+ import { decodedByteSize, effectiveMaxBytes, overCapMessage } from './media';
10
+ import { scalarLabel } from './resolve';
11
+ import { activeVariantIndex } from './union';
12
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
13
+ const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
14
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
15
+ function isPlainObject(value) {
16
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
17
+ }
18
+ function joinPath(path, key) {
19
+ return path === '' ? key : `${path}.${key}`;
20
+ }
21
+ function formatError(format, value) {
22
+ switch (format) {
23
+ case 'email':
24
+ return EMAIL_RE.test(value) ? undefined : 'must be a valid email address';
25
+ case 'uri':
26
+ case 'uri-reference':
27
+ try {
28
+ new URL(value, 'https://base.invalid');
29
+ return undefined;
30
+ }
31
+ catch {
32
+ return 'must be a valid URI';
33
+ }
34
+ case 'uuid':
35
+ return UUID_RE.test(value) ? undefined : 'must be a valid UUID';
36
+ case 'date':
37
+ return DATE_RE.test(value) && !Number.isNaN(Date.parse(value))
38
+ ? undefined
39
+ : 'must be a valid date (YYYY-MM-DD)';
40
+ case 'date-time':
41
+ return Number.isNaN(Date.parse(value)) ? 'must be a valid date-time' : undefined;
42
+ default:
43
+ return undefined;
44
+ }
45
+ }
46
+ function walk(schema, value, path, root, errors, maxUploadBytes) {
47
+ const classified = classifySchema(schema, root);
48
+ if (value === null) {
49
+ if (!classified.nullable)
50
+ errors[path] = 'must not be null';
51
+ return;
52
+ }
53
+ const { model } = classified;
54
+ switch (model.kind) {
55
+ case 'unsupported':
56
+ errors[path] = `unsupported schema (${model.reason})`;
57
+ return;
58
+ case 'const':
59
+ if (value !== model.value)
60
+ errors[path] = `must equal ${scalarLabel(model.value)}`;
61
+ return;
62
+ case 'enum': {
63
+ const allowed = model.options.some((option) => option.value === value);
64
+ if (!allowed)
65
+ errors[path] = 'must be one of the allowed values';
66
+ return;
67
+ }
68
+ case 'string': {
69
+ if (typeof value !== 'string') {
70
+ errors[path] = 'must be a string';
71
+ return;
72
+ }
73
+ // A media-annotated string carries a byte cap; enforce it on the value's
74
+ // DECODED size so a value that arrived by any route is caught here too. The
75
+ // precedence matches the renderer: field `contentMaxBytes` → host cap →
76
+ // shared default.
77
+ if (model.media !== undefined) {
78
+ const cap = effectiveMaxBytes(model.media.maxBytes, maxUploadBytes);
79
+ const size = decodedByteSize(value);
80
+ if (size > cap) {
81
+ errors[path] = overCapMessage('The value', size, cap);
82
+ return;
83
+ }
84
+ }
85
+ if (value.length > 0 && model.format !== undefined) {
86
+ const message = formatError(model.format, value);
87
+ if (message !== undefined)
88
+ errors[path] = message;
89
+ }
90
+ return;
91
+ }
92
+ case 'number': {
93
+ if (typeof value !== 'number' || Number.isNaN(value)) {
94
+ errors[path] = model.integer ? 'must be an integer' : 'must be a number';
95
+ return;
96
+ }
97
+ if (model.integer && !Number.isInteger(value))
98
+ errors[path] = 'must be an integer';
99
+ return;
100
+ }
101
+ case 'boolean':
102
+ if (typeof value !== 'boolean')
103
+ errors[path] = 'must be true or false';
104
+ return;
105
+ case 'array': {
106
+ if (!Array.isArray(value)) {
107
+ errors[path] = 'must be an array';
108
+ return;
109
+ }
110
+ value.forEach((item, index) => {
111
+ walk(model.items, item, `${path}[${String(index)}]`, root, errors, maxUploadBytes);
112
+ });
113
+ return;
114
+ }
115
+ case 'object': {
116
+ if (!isPlainObject(value)) {
117
+ errors[path] = 'must be an object';
118
+ return;
119
+ }
120
+ const propMap = new Map(model.properties);
121
+ for (const [name, propSchema] of model.properties) {
122
+ const childPath = joinPath(path, name);
123
+ const childValue = value[name];
124
+ if (childValue === undefined) {
125
+ if (model.required.has(name))
126
+ errors[childPath] = `"${name}" is required`;
127
+ continue;
128
+ }
129
+ walk(propSchema, childValue, childPath, root, errors, maxUploadBytes);
130
+ }
131
+ // Required keys naming a property that somehow isn't declared still count.
132
+ for (const name of model.required) {
133
+ if (!propMap.has(name) && value[name] === undefined) {
134
+ errors[joinPath(path, name)] = `"${name}" is required`;
135
+ }
136
+ }
137
+ return;
138
+ }
139
+ case 'union': {
140
+ const index = activeVariantIndex(value, model.variants, model.discriminator, root);
141
+ const variant = index === -1 ? undefined : model.variants[index];
142
+ if (variant === undefined) {
143
+ errors[path] = 'does not match any allowed variant';
144
+ return;
145
+ }
146
+ walk(variant.schema, value, path, root, errors, maxUploadBytes);
147
+ return;
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Validate `value` against `schema`, returning a per-path error bag (empty =
153
+ * valid). The caller runs this before submit and feeds the result back to
154
+ * `SchemaForm` for display. `options.maxUploadBytes` mirrors the renderer's
155
+ * `maxUploadBytes` prop so a media field's byte cap is enforced identically here.
156
+ */
157
+ export function validateAgainstSchema(schema, value, options) {
158
+ const errors = {};
159
+ walk(schema, value, '', schema, errors, options?.maxUploadBytes);
160
+ return errors;
161
+ }
162
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/schema-form/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `StructuredOutput` — the READ-ONLY output side of the schema-driven system:
3
+ * it renders a tool's `structured_content` THROUGH its declared MCP
4
+ * `output_schema` (property titles + declared order), and falls back to a raw
5
+ * `JsonTree` when the tool declares no output schema (or the content does not
6
+ * match an object schema).
7
+ *
8
+ * Reusable by any feature/plugin run surface. SAFETY: every schema-derived and
9
+ * content-derived value renders as React TEXT (through `JsonTree` / plain text
10
+ * nodes), so a payload carrying markup is escaped, never interpreted.
11
+ */
12
+ import type { ReactNode } from 'react';
13
+ import type { JsonSchema } from '../schema-form/types';
14
+ export interface StructuredOutputProps {
15
+ /** The tool's declared MCP output schema, if any. */
16
+ readonly schema?: JsonSchema;
17
+ /** The `structured_content` the tool returned. */
18
+ readonly content: unknown;
19
+ }
20
+ /**
21
+ * Render `content` through `schema`. An object schema drives a labeled,
22
+ * ordered field list (each value shown with a `JsonTree`); anything else — no
23
+ * schema, a non-object schema, or content that is not a matching object —
24
+ * renders the raw content through a single `JsonTree`.
25
+ */
26
+ export declare function StructuredOutput({ schema, content }: StructuredOutputProps): ReactNode;
27
+ //# sourceMappingURL=StructuredOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuredOutput.d.ts","sourceRoot":"","sources":["../../src/structured-output/StructuredOutput.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAoBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,qBAAqB,GAAG,SAAS,CAgCtF"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { JsonTree } from '../components/json-tree';
3
+ import { resolveRef } from '../schema-form/resolve';
4
+ /** The pane's name when the payload has no schema to name it by. */
5
+ const RAW_OUTPUT_LABEL = 'Structured output';
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ }
9
+ function isObjectSchema(schema, root) {
10
+ if (!schema || !root)
11
+ return false;
12
+ const resolved = schema.$ref ? resolveRef(schema, root) : schema;
13
+ const type = resolved.type;
14
+ const isObject = type === 'object' || (Array.isArray(type) && type.includes('object'));
15
+ return isObject && isRecord(resolved.properties);
16
+ }
17
+ /**
18
+ * Render `content` through `schema`. An object schema drives a labeled,
19
+ * ordered field list (each value shown with a `JsonTree`); anything else — no
20
+ * schema, a non-object schema, or content that is not a matching object —
21
+ * renders the raw content through a single `JsonTree`.
22
+ */
23
+ export function StructuredOutput({ schema, content }) {
24
+ if (!isObjectSchema(schema, schema) || !isRecord(content)) {
25
+ return (
26
+ // A deeply nested payload outruns its column; the tree's own pane scrolls
27
+ // it and is a keyboard target only while it actually does.
28
+ _jsx("div", { "data-testid": "structured-output-raw", children: _jsx(JsonTree, { data: content, defaultExpanded: true, label: RAW_OUTPUT_LABEL }) }));
29
+ }
30
+ // `schema` is narrowed to a defined object schema here.
31
+ const resolved = schema.$ref ? resolveRef(schema, schema) : schema;
32
+ // `isObjectSchema` guarantees `properties` is a record; the fallback only
33
+ // satisfies the optional type.
34
+ const properties = resolved.properties ?? {};
35
+ return (_jsx("div", { className: "tai-stack tai-stack-2", "data-testid": "structured-output", children: Object.entries(properties).map(([key, propSchema]) => {
36
+ const field = propSchema.$ref ? resolveRef(propSchema, schema) : propSchema;
37
+ const name = field.title ?? key;
38
+ return (_jsxs("div", { className: "tai-field", children: [_jsx("span", { className: "tai-field-label", children: name }), _jsx(JsonTree, { data: content[key], defaultExpanded: true, label: name })] }, key));
39
+ }) }));
40
+ }
41
+ //# sourceMappingURL=StructuredOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuredOutput.js","sourceRoot":"","sources":["../../src/structured-output/StructuredOutput.tsx"],"names":[],"mappings":";AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUpD,oEAAoE;AACpE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CACrB,MAA8B,EAC9B,IAA4B;IAE5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,OAAO,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAyB;IACzE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO;QACL,0EAA0E;QAC1E,2DAA2D;QAC3D,6BAAiB,uBAAuB,YACtC,KAAC,QAAQ,IAAC,IAAI,EAAE,OAAO,EAAE,eAAe,QAAC,KAAK,EAAE,gBAAgB,GAAI,GAChE,CACP,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,0EAA0E;IAC1E,+BAA+B;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;IAE7C,OAAO,CACL,cAAK,SAAS,EAAC,uBAAuB,iBAAa,mBAAmB,YACnE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;YAChC,OAAO,CACL,eAAe,SAAS,EAAC,WAAW,aAClC,eAAM,SAAS,EAAC,iBAAiB,YAAE,IAAI,GAAQ,EAE/C,KAAC,QAAQ,IAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,eAAe,QAAC,KAAK,EAAE,IAAI,GAAI,KAHrD,GAAG,CAIP,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,80 @@
1
+ /** Test-only registry reset, used to clear module-level state between cases; never shipped to the browser. */
2
+ export { __resetContributions } from './plugin/registry';
3
+ /** Test-only plugin host-state reset, cleared between cases beside the registry reset. */
4
+ export { __resetPluginHostState } from './plugin/host-state';
5
+ /**
6
+ * Fires every live `ResizeObserver` stub's callback for the elements it is
7
+ * observing. Pair it with `setElementOverflow` to drive a component that
8
+ * measures itself (`ScrollRegion` and `useProseScrollRegions` re-read
9
+ * `scrollWidth`/`clientWidth` from their observer callbacks):
10
+ *
11
+ * setElementOverflow(region, true);
12
+ * flushResizeObservers();
13
+ *
14
+ * Only meaningful once `installJsdomStubs` has installed the stub; with a real
15
+ * `ResizeObserver` present (a browser environment) there is nothing to flush.
16
+ */
17
+ export declare function flushResizeObservers(): void;
18
+ /**
19
+ * Delivers a resize for ONE element, to every stub observing it — the narrow
20
+ * form of {@link flushResizeObservers}. Use it to prove which element a
21
+ * component is watching: a measurement driven by a resize of a CHILD only
22
+ * arrives if that child is observed, so the assertion fails the moment a
23
+ * component narrows its observation to its own box.
24
+ *
25
+ * @param target - the element whose resize to deliver.
26
+ */
27
+ export declare function flushResizeObserversFor(target: Element): void;
28
+ /**
29
+ * Makes `element` report itself as horizontally overflowing (or not). jsdom runs
30
+ * no layout, so `scrollWidth` and `clientWidth` are both 0 and every
31
+ * overflow test reads as "fits"; this shadows the prototype getters with own,
32
+ * configurable values so a test can drive either state. Call it again with the
33
+ * opposite flag to flip the element back.
34
+ *
35
+ * @param element - the element whose scroll metrics to fake.
36
+ * @param overflowing - true to report content wider than the box.
37
+ */
38
+ export declare function setElementOverflow(element: HTMLElement, overflowing: boolean): void;
39
+ /**
40
+ * jsdom omits a handful of browser APIs the Studio components reach for while a
41
+ * test drives them. Installing every stub in one place keeps each feature's
42
+ * `test-setup.ts` identical and lets interaction tests exercise the real
43
+ * components instead of mocking them out:
44
+ *
45
+ * - Radix primitives observe element size (`ResizeObserver`), scroll the active
46
+ * item into view, and capture the pointer while opening.
47
+ * - Export/download paths create and revoke object URLs.
48
+ * - File-import flows read the picked file via `Blob.text()`.
49
+ * - Router scroll restoration calls `scrollTo` on navigation.
50
+ *
51
+ * The `ResizeObserver` stub is a WORKING observer, not an inert one: it keeps a
52
+ * registry of the observers still in use, delivers an entry to the callback as
53
+ * each element is observed (as a real observer does for its initial
54
+ * observation), and lets a test re-deliver on demand via
55
+ * `flushResizeObservers`. Components that size themselves — `ScrollRegion` and
56
+ * `useProseScrollRegions` — are therefore exercised for real, with
57
+ * `setElementOverflow` supplying the scroll metrics jsdom cannot compute.
58
+ *
59
+ * Each stub only fills a MISSING API, so installing the whole set everywhere is
60
+ * harmless — the one exception is `window.scrollTo`, which jsdom ships as a "Not
61
+ * implemented" stub that logs loudly on every navigation, so it is replaced
62
+ * unconditionally. Call once from a package's Vitest `setupFiles` entry.
63
+ */
64
+ export declare function installJsdomStubs(): void;
65
+ /**
66
+ * A promise whose settlement the test controls, returned alongside its own
67
+ * `resolve`/`reject`. It pins a component's loading state for assertion: hand the
68
+ * unsettled `promise` to the code under test (e.g. as a mocked api call's return
69
+ * value), assert the in-flight UI while it hangs, then call `resolve`/`reject` to
70
+ * drive the success or failure branch and assert the settled UI. Each call
71
+ * returns a fresh, independent deferred.
72
+ *
73
+ * @typeParam T - the value the promise resolves to.
74
+ */
75
+ export declare function deferred<T>(): {
76
+ promise: Promise<T>;
77
+ resolve: (value: T) => void;
78
+ reject: (reason: unknown) => void;
79
+ };
80
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,0FAA0F;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAiC7D;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAK7D;AAMD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI,CAMnF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CA4FxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,KAAK;IAC7B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC,CAQA"}
@@ -0,0 +1,207 @@
1
+ /** Test-only registry reset, used to clear module-level state between cases; never shipped to the browser. */
2
+ export { __resetContributions } from './plugin/registry';
3
+ /** Test-only plugin host-state reset, cleared between cases beside the registry reset. */
4
+ export { __resetPluginHostState } from './plugin/host-state';
5
+ const liveResizeObservers = new Set();
6
+ /**
7
+ * A full `ResizeObserverEntry` shape for `target`. Radix's `useSize` reads
8
+ * `borderBoxSize[0].inlineSize`, so a `target`-only entry would throw there;
9
+ * jsdom reports zero geometry, which is exactly what a real headless observer
10
+ * would report for an unlaid-out element.
11
+ */
12
+ function resizeObserverEntry(target) {
13
+ const rect = target.getBoundingClientRect();
14
+ const size = { inlineSize: rect.width, blockSize: rect.height };
15
+ return {
16
+ target,
17
+ contentRect: rect,
18
+ borderBoxSize: [size],
19
+ contentBoxSize: [size],
20
+ devicePixelContentBoxSize: [size],
21
+ };
22
+ }
23
+ /**
24
+ * Fires every live `ResizeObserver` stub's callback for the elements it is
25
+ * observing. Pair it with `setElementOverflow` to drive a component that
26
+ * measures itself (`ScrollRegion` and `useProseScrollRegions` re-read
27
+ * `scrollWidth`/`clientWidth` from their observer callbacks):
28
+ *
29
+ * setElementOverflow(region, true);
30
+ * flushResizeObservers();
31
+ *
32
+ * Only meaningful once `installJsdomStubs` has installed the stub; with a real
33
+ * `ResizeObserver` present (a browser environment) there is nothing to flush.
34
+ */
35
+ export function flushResizeObservers() {
36
+ for (const live of [...liveResizeObservers]) {
37
+ if (live.targets.size === 0)
38
+ continue;
39
+ live.callback([...live.targets].map(resizeObserverEntry), live.observer);
40
+ }
41
+ }
42
+ /**
43
+ * Delivers a resize for ONE element, to every stub observing it — the narrow
44
+ * form of {@link flushResizeObservers}. Use it to prove which element a
45
+ * component is watching: a measurement driven by a resize of a CHILD only
46
+ * arrives if that child is observed, so the assertion fails the moment a
47
+ * component narrows its observation to its own box.
48
+ *
49
+ * @param target - the element whose resize to deliver.
50
+ */
51
+ export function flushResizeObserversFor(target) {
52
+ for (const live of [...liveResizeObservers]) {
53
+ if (!live.targets.has(target))
54
+ continue;
55
+ live.callback([resizeObserverEntry(target)], live.observer);
56
+ }
57
+ }
58
+ /** The faked widths: equal reads as "fits", unequal as "scrolls". */
59
+ const FITTING_WIDTH = 100;
60
+ const OVERFLOWING_SCROLL_WIDTH = 400;
61
+ /**
62
+ * Makes `element` report itself as horizontally overflowing (or not). jsdom runs
63
+ * no layout, so `scrollWidth` and `clientWidth` are both 0 and every
64
+ * overflow test reads as "fits"; this shadows the prototype getters with own,
65
+ * configurable values so a test can drive either state. Call it again with the
66
+ * opposite flag to flip the element back.
67
+ *
68
+ * @param element - the element whose scroll metrics to fake.
69
+ * @param overflowing - true to report content wider than the box.
70
+ */
71
+ export function setElementOverflow(element, overflowing) {
72
+ Object.defineProperty(element, 'clientWidth', { configurable: true, value: FITTING_WIDTH });
73
+ Object.defineProperty(element, 'scrollWidth', {
74
+ configurable: true,
75
+ value: overflowing ? OVERFLOWING_SCROLL_WIDTH : FITTING_WIDTH,
76
+ });
77
+ }
78
+ /**
79
+ * jsdom omits a handful of browser APIs the Studio components reach for while a
80
+ * test drives them. Installing every stub in one place keeps each feature's
81
+ * `test-setup.ts` identical and lets interaction tests exercise the real
82
+ * components instead of mocking them out:
83
+ *
84
+ * - Radix primitives observe element size (`ResizeObserver`), scroll the active
85
+ * item into view, and capture the pointer while opening.
86
+ * - Export/download paths create and revoke object URLs.
87
+ * - File-import flows read the picked file via `Blob.text()`.
88
+ * - Router scroll restoration calls `scrollTo` on navigation.
89
+ *
90
+ * The `ResizeObserver` stub is a WORKING observer, not an inert one: it keeps a
91
+ * registry of the observers still in use, delivers an entry to the callback as
92
+ * each element is observed (as a real observer does for its initial
93
+ * observation), and lets a test re-deliver on demand via
94
+ * `flushResizeObservers`. Components that size themselves — `ScrollRegion` and
95
+ * `useProseScrollRegions` — are therefore exercised for real, with
96
+ * `setElementOverflow` supplying the scroll metrics jsdom cannot compute.
97
+ *
98
+ * Each stub only fills a MISSING API, so installing the whole set everywhere is
99
+ * harmless — the one exception is `window.scrollTo`, which jsdom ships as a "Not
100
+ * implemented" stub that logs loudly on every navigation, so it is replaced
101
+ * unconditionally. Call once from a package's Vitest `setupFiles` entry.
102
+ */
103
+ export function installJsdomStubs() {
104
+ if (typeof globalThis.ResizeObserver !== 'function') {
105
+ class ResizeObserverStub {
106
+ #live;
107
+ constructor(callback) {
108
+ this.#live = { callback, targets: new Set(), observer: this };
109
+ liveResizeObservers.add(this.#live);
110
+ }
111
+ observe(target) {
112
+ // `disconnect()` stops observation; it does not destroy the observer, so
113
+ // observing again re-registers it exactly as the real API does.
114
+ liveResizeObservers.add(this.#live);
115
+ this.#live.targets.add(target);
116
+ this.#live.callback([resizeObserverEntry(target)], this);
117
+ }
118
+ unobserve(target) {
119
+ this.#live.targets.delete(target);
120
+ }
121
+ disconnect() {
122
+ this.#live.targets.clear();
123
+ liveResizeObservers.delete(this.#live);
124
+ }
125
+ }
126
+ globalThis.ResizeObserver = ResizeObserverStub;
127
+ }
128
+ if (typeof Element.prototype.scrollIntoView !== 'function') {
129
+ Element.prototype.scrollIntoView = function scrollIntoView() {
130
+ /* jsdom stub */
131
+ };
132
+ }
133
+ if (typeof Element.prototype.hasPointerCapture !== 'function') {
134
+ Element.prototype.hasPointerCapture = function hasPointerCapture() {
135
+ return false;
136
+ };
137
+ }
138
+ if (typeof Element.prototype.setPointerCapture !== 'function') {
139
+ Element.prototype.setPointerCapture = function setPointerCapture() {
140
+ /* jsdom stub */
141
+ };
142
+ }
143
+ if (typeof Element.prototype.releasePointerCapture !== 'function') {
144
+ Element.prototype.releasePointerCapture = function releasePointerCapture() {
145
+ /* jsdom stub */
146
+ };
147
+ }
148
+ // TanStack Router's scroll restoration calls scrollTo on every navigation.
149
+ // jsdom omits `Element.prototype.scrollTo`, so fill it like the others; but it
150
+ // DOES ship `window.scrollTo` as a "Not implemented" stub that logs loudly on
151
+ // every call, so that one is REPLACED unconditionally to silence the noise.
152
+ if (typeof Element.prototype.scrollTo !== 'function') {
153
+ Element.prototype.scrollTo = function scrollTo() {
154
+ /* jsdom stub */
155
+ };
156
+ }
157
+ window.scrollTo = function scrollTo() {
158
+ /* jsdom stub */
159
+ };
160
+ // jsdom does not implement object URLs; export/download paths create and
161
+ // revoke one.
162
+ if (typeof URL.createObjectURL !== 'function') {
163
+ URL.createObjectURL = () => 'blob:stub';
164
+ }
165
+ if (typeof URL.revokeObjectURL !== 'function') {
166
+ URL.revokeObjectURL = () => {
167
+ /* jsdom stub */
168
+ };
169
+ }
170
+ // jsdom's Blob/File omit the `text()` reader browsers ship, so file-import
171
+ // flows that call `file.text()` cannot run. Back it with the FileReader jsdom
172
+ // does provide.
173
+ if (typeof Blob.prototype.text !== 'function') {
174
+ Blob.prototype.text = function readAsText() {
175
+ return new Promise((resolve, reject) => {
176
+ const reader = new FileReader();
177
+ reader.onload = () => {
178
+ resolve(typeof reader.result === 'string' ? reader.result : '');
179
+ };
180
+ reader.onerror = () => {
181
+ reject(reader.error ?? new Error('FileReader failed'));
182
+ };
183
+ reader.readAsText(this);
184
+ });
185
+ };
186
+ }
187
+ }
188
+ /**
189
+ * A promise whose settlement the test controls, returned alongside its own
190
+ * `resolve`/`reject`. It pins a component's loading state for assertion: hand the
191
+ * unsettled `promise` to the code under test (e.g. as a mocked api call's return
192
+ * value), assert the in-flight UI while it hangs, then call `resolve`/`reject` to
193
+ * drive the success or failure branch and assert the settled UI. Each call
194
+ * returns a fresh, independent deferred.
195
+ *
196
+ * @typeParam T - the value the promise resolves to.
197
+ */
198
+ export function deferred() {
199
+ let resolve;
200
+ let reject;
201
+ const promise = new Promise((res, rej) => {
202
+ resolve = res;
203
+ reject = rej;
204
+ });
205
+ return { promise, resolve, reject };
206
+ }
207
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,101 @@
1
+ {
2
+ "name": "@tai42/studio-sdk",
3
+ "version": "0.2.0",
4
+ "description": "The Studio plugin contract, shared UI components, and hooks that every feature builds on.",
5
+ "license": "Apache-2.0",
6
+ "author": "tai42 <oss@tai42.ai>",
7
+ "homepage": "https://tai42.ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/tai42ai/tai-studio",
11
+ "directory": "packages/studio-sdk"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/tai42ai/tai-studio/issues"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "browserslist": [
20
+ "chrome >= 99",
21
+ "edge >= 99",
22
+ "firefox >= 97",
23
+ "safari >= 15.4",
24
+ "ios_saf >= 15.4"
25
+ ],
26
+ "type": "module",
27
+ "sideEffects": [
28
+ "**/*.css",
29
+ "./dist/index.js",
30
+ "./src/index.ts"
31
+ ],
32
+ "main": "./dist/index.js",
33
+ "types": "./dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js"
38
+ },
39
+ "./host": {
40
+ "types": "./dist/host.d.ts",
41
+ "import": "./dist/host.js"
42
+ },
43
+ "./testing": {
44
+ "types": "./dist/testing.d.ts",
45
+ "import": "./dist/testing.js"
46
+ },
47
+ "./tokens.css": "./dist/components/tokens.css",
48
+ "./fonts.css": "./dist/components/fonts.css",
49
+ "./components.css": "./dist/components/components.css",
50
+ "./package.json": "./package.json"
51
+ },
52
+ "files": [
53
+ "LICENSE",
54
+ "NOTICE",
55
+ "SECURITY.md",
56
+ "dist",
57
+ "src",
58
+ "!src/**/*.test.ts",
59
+ "!src/**/*.test.tsx",
60
+ "!src/**/*.spec.ts",
61
+ "!src/**/*.spec.tsx",
62
+ "!src/**/test-*.ts",
63
+ "!src/**/test-*.tsx",
64
+ "!src/**/__snapshots__"
65
+ ],
66
+ "peerDependencies": {
67
+ "react": "^19.0.0",
68
+ "react-dom": "^19.0.0"
69
+ },
70
+ "devDependencies": {
71
+ "@testing-library/jest-dom": "^6.9.1",
72
+ "@testing-library/react": "^16.3.2",
73
+ "@testing-library/user-event": "^14.6.1",
74
+ "@types/react": "^19.2.17",
75
+ "@types/react-dom": "^19.2.3",
76
+ "@vitejs/plugin-react": "^4.7.0",
77
+ "@vitest/coverage-v8": "^3.2.6",
78
+ "jsdom": "^25.0.1",
79
+ "react": "^19.2.7",
80
+ "react-dom": "^19.2.7",
81
+ "vitest": "^3.2.6"
82
+ },
83
+ "dependencies": {
84
+ "@fontsource-variable/geist-mono": "^5.2.7",
85
+ "@fontsource-variable/inter": "^5.2.8",
86
+ "@radix-ui/react-checkbox": "^1.3.6",
87
+ "@radix-ui/react-dialog": "^1.1.18",
88
+ "@radix-ui/react-radio-group": "^1.4.2",
89
+ "@radix-ui/react-select": "^2.3.2",
90
+ "@radix-ui/react-tabs": "^1.1.16",
91
+ "@radix-ui/react-tooltip": "^1.2.11",
92
+ "@tai42/api-client": "0.2.0"
93
+ },
94
+ "scripts": {
95
+ "build": "tsc -b tsconfig.build.json && node scripts/copy-assets.mjs",
96
+ "typecheck": "tsc -b tsconfig.build.json && tsc --noEmit -p tsconfig.json",
97
+ "lint": "eslint src scripts --max-warnings 0",
98
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,css}\" \"scripts/**/*.mjs\"",
99
+ "test": "vitest run"
100
+ }
101
+ }