@tai42/studio-sdk 16.0.0 → 17.0.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 (486) hide show
  1. package/dist/components/code-block.js +1 -1
  2. package/dist/components/code-block.js.map +1 -1
  3. package/dist/components/confirm-dialog.js +1 -1
  4. package/dist/components/confirm-dialog.js.map +1 -1
  5. package/dist/components/copy-field.js +1 -1
  6. package/dist/components/copy-field.js.map +1 -1
  7. package/dist/components/date-range-picker.d.ts.map +1 -1
  8. package/dist/components/date-range-picker.js.map +1 -1
  9. package/dist/components/dialog.d.ts.map +1 -1
  10. package/dist/components/dialog.js.map +1 -1
  11. package/dist/components/dirty-guard.d.ts.map +1 -1
  12. package/dist/components/dirty-guard.js +1 -1
  13. package/dist/components/dirty-guard.js.map +1 -1
  14. package/dist/components/explorer-body.d.ts +49 -0
  15. package/dist/components/explorer-body.d.ts.map +1 -0
  16. package/dist/components/explorer-body.js +67 -0
  17. package/dist/components/explorer-body.js.map +1 -0
  18. package/dist/components/explorer-page-size.d.ts +4 -0
  19. package/dist/components/explorer-page-size.d.ts.map +1 -0
  20. package/dist/components/explorer-page-size.js +36 -0
  21. package/dist/components/explorer-page-size.js.map +1 -0
  22. package/dist/components/explorer-tag-filter.d.ts +17 -0
  23. package/dist/components/explorer-tag-filter.d.ts.map +1 -0
  24. package/dist/components/explorer-tag-filter.js +29 -0
  25. package/dist/components/explorer-tag-filter.js.map +1 -0
  26. package/dist/components/explorer-tags.d.ts +22 -0
  27. package/dist/components/explorer-tags.d.ts.map +1 -0
  28. package/dist/components/explorer-tags.js +51 -0
  29. package/dist/components/explorer-tags.js.map +1 -0
  30. package/dist/components/explorer-view.d.ts +3 -17
  31. package/dist/components/explorer-view.d.ts.map +1 -1
  32. package/dist/components/explorer-view.js +53 -170
  33. package/dist/components/explorer-view.js.map +1 -1
  34. package/dist/components/extension-combo-builder.d.ts +1 -6
  35. package/dist/components/extension-combo-builder.d.ts.map +1 -1
  36. package/dist/components/extension-combo-builder.js +4 -79
  37. package/dist/components/extension-combo-builder.js.map +1 -1
  38. package/dist/components/extension-combo-parts.d.ts +44 -0
  39. package/dist/components/extension-combo-parts.d.ts.map +1 -0
  40. package/dist/components/extension-combo-parts.js +52 -0
  41. package/dist/components/extension-combo-parts.js.map +1 -0
  42. package/dist/components/field.d.ts +8 -0
  43. package/dist/components/field.d.ts.map +1 -1
  44. package/dist/components/field.js +0 -8
  45. package/dist/components/field.js.map +1 -1
  46. package/dist/components/fleet-report.d.ts +1 -1
  47. package/dist/components/fleet-report.d.ts.map +1 -1
  48. package/dist/components/fleet-report.js +51 -37
  49. package/dist/components/fleet-report.js.map +1 -1
  50. package/dist/components/folder-nav.d.ts.map +1 -1
  51. package/dist/components/folder-nav.js +1 -1
  52. package/dist/components/folder-nav.js.map +1 -1
  53. package/dist/components/form-dialog.d.ts.map +1 -1
  54. package/dist/components/form-dialog.js +1 -1
  55. package/dist/components/form-dialog.js.map +1 -1
  56. package/dist/components/icons/chrome-marks.d.ts +50 -0
  57. package/dist/components/icons/chrome-marks.d.ts.map +1 -0
  58. package/dist/components/icons/chrome-marks.js +51 -0
  59. package/dist/components/icons/chrome-marks.js.map +1 -0
  60. package/dist/components/icons/icon-frame.d.ts +29 -0
  61. package/dist/components/icons/icon-frame.d.ts.map +1 -0
  62. package/dist/components/icons/icon-frame.js +19 -0
  63. package/dist/components/icons/icon-frame.js.map +1 -0
  64. package/dist/components/icons/index.d.ts +40 -0
  65. package/dist/components/icons/index.d.ts.map +1 -0
  66. package/dist/components/icons/index.js +39 -0
  67. package/dist/components/icons/index.js.map +1 -0
  68. package/dist/components/icons/nav-map.d.ts +14 -0
  69. package/dist/components/icons/nav-map.d.ts.map +1 -0
  70. package/dist/components/icons/nav-map.js +28 -0
  71. package/dist/components/icons/nav-map.js.map +1 -0
  72. package/dist/components/icons/nav-marks.d.ts +44 -0
  73. package/dist/components/icons/nav-marks.d.ts.map +1 -0
  74. package/dist/components/icons/nav-marks.js +45 -0
  75. package/dist/components/icons/nav-marks.js.map +1 -0
  76. package/dist/components/icons/status-marks.d.ts +21 -0
  77. package/dist/components/icons/status-marks.d.ts.map +1 -0
  78. package/dist/components/icons/status-marks.js +22 -0
  79. package/dist/components/icons/status-marks.js.map +1 -0
  80. package/dist/components/icons/theme-marks.d.ts +9 -0
  81. package/dist/components/icons/theme-marks.d.ts.map +1 -0
  82. package/dist/components/icons/theme-marks.js +10 -0
  83. package/dist/components/icons/theme-marks.js.map +1 -0
  84. package/dist/components/inputs.js.map +1 -1
  85. package/dist/components/json-diff.d.ts.map +1 -1
  86. package/dist/components/json-diff.js +1 -3
  87. package/dist/components/json-diff.js.map +1 -1
  88. package/dist/components/json-tree-context.d.ts +13 -0
  89. package/dist/components/json-tree-context.d.ts.map +1 -0
  90. package/dist/components/json-tree-context.js +15 -0
  91. package/dist/components/json-tree-context.js.map +1 -0
  92. package/dist/components/json-tree-model.d.ts +56 -0
  93. package/dist/components/json-tree-model.d.ts.map +1 -0
  94. package/dist/components/json-tree-model.js +125 -0
  95. package/dist/components/json-tree-model.js.map +1 -0
  96. package/dist/components/json-tree-nodes.d.ts +35 -0
  97. package/dist/components/json-tree-nodes.d.ts.map +1 -0
  98. package/dist/components/json-tree-nodes.js +113 -0
  99. package/dist/components/json-tree-nodes.js.map +1 -0
  100. package/dist/components/json-tree.d.ts +20 -0
  101. package/dist/components/json-tree.d.ts.map +1 -1
  102. package/dist/components/json-tree.js +7 -315
  103. package/dist/components/json-tree.js.map +1 -1
  104. package/dist/components/json-value-format.d.ts +20 -0
  105. package/dist/components/json-value-format.d.ts.map +1 -0
  106. package/dist/components/json-value-format.js +63 -0
  107. package/dist/components/json-value-format.js.map +1 -0
  108. package/dist/components/markdown-blocks.d.ts +38 -0
  109. package/dist/components/markdown-blocks.d.ts.map +1 -0
  110. package/dist/components/markdown-blocks.js +168 -0
  111. package/dist/components/markdown-blocks.js.map +1 -0
  112. package/dist/components/markdown-inline.d.ts +24 -0
  113. package/dist/components/markdown-inline.d.ts.map +1 -0
  114. package/dist/components/markdown-inline.js +257 -0
  115. package/dist/components/markdown-inline.js.map +1 -0
  116. package/dist/components/markdown.d.ts +3 -52
  117. package/dist/components/markdown.d.ts.map +1 -1
  118. package/dist/components/markdown.js +4 -376
  119. package/dist/components/markdown.js.map +1 -1
  120. package/dist/components/observer-registry.d.ts +38 -0
  121. package/dist/components/observer-registry.d.ts.map +1 -0
  122. package/dist/components/observer-registry.js +131 -0
  123. package/dist/components/observer-registry.js.map +1 -0
  124. package/dist/components/overflow-measure.d.ts +38 -0
  125. package/dist/components/overflow-measure.d.ts.map +1 -0
  126. package/dist/components/overflow-measure.js +54 -0
  127. package/dist/components/overflow-measure.js.map +1 -0
  128. package/dist/components/page-fill.d.ts.map +1 -1
  129. package/dist/components/page-fill.js.map +1 -1
  130. package/dist/components/prose-regions.d.ts +81 -0
  131. package/dist/components/prose-regions.d.ts.map +1 -0
  132. package/dist/components/prose-regions.js +128 -0
  133. package/dist/components/prose-regions.js.map +1 -0
  134. package/dist/components/radio-group.d.ts.map +1 -1
  135. package/dist/components/radio-group.js.map +1 -1
  136. package/dist/components/scroll-region.d.ts +24 -0
  137. package/dist/components/scroll-region.d.ts.map +1 -1
  138. package/dist/components/scroll-region.js +3 -322
  139. package/dist/components/scroll-region.js.map +1 -1
  140. package/dist/components/tab-stop-parse.d.ts +53 -0
  141. package/dist/components/tab-stop-parse.d.ts.map +1 -0
  142. package/dist/components/tab-stop-parse.js +202 -0
  143. package/dist/components/tab-stop-parse.js.map +1 -0
  144. package/dist/components/table.d.ts +1 -1
  145. package/dist/components/table.d.ts.map +1 -1
  146. package/dist/components/tags.d.ts.map +1 -1
  147. package/dist/components/tags.js +1 -1
  148. package/dist/components/tags.js.map +1 -1
  149. package/dist/components/templated-text-field.d.ts +1 -1
  150. package/dist/components/templated-text-field.d.ts.map +1 -1
  151. package/dist/components/templated-text-field.js +10 -174
  152. package/dist/components/templated-text-field.js.map +1 -1
  153. package/dist/components/templated-text-kwargs-editor.d.ts +24 -0
  154. package/dist/components/templated-text-kwargs-editor.d.ts.map +1 -0
  155. package/dist/components/templated-text-kwargs-editor.js +48 -0
  156. package/dist/components/templated-text-kwargs-editor.js.map +1 -0
  157. package/dist/components/templated-text-kwargs.d.ts +37 -0
  158. package/dist/components/templated-text-kwargs.d.ts.map +1 -0
  159. package/dist/components/templated-text-kwargs.js +66 -0
  160. package/dist/components/templated-text-kwargs.js.map +1 -0
  161. package/dist/components/templated-text-source.d.ts +33 -0
  162. package/dist/components/templated-text-source.d.ts.map +1 -0
  163. package/dist/components/templated-text-source.js +53 -0
  164. package/dist/components/templated-text-source.js.map +1 -0
  165. package/dist/components/tool-picker-parts.d.ts +39 -0
  166. package/dist/components/tool-picker-parts.d.ts.map +1 -0
  167. package/dist/components/tool-picker-parts.js +87 -0
  168. package/dist/components/tool-picker-parts.js.map +1 -0
  169. package/dist/components/tool-picker.d.ts +1 -2
  170. package/dist/components/tool-picker.d.ts.map +1 -1
  171. package/dist/components/tool-picker.js +4 -66
  172. package/dist/components/tool-picker.js.map +1 -1
  173. package/dist/components/version-history-panel.d.ts.map +1 -1
  174. package/dist/components/version-history-panel.js +7 -34
  175. package/dist/components/version-history-panel.js.map +1 -1
  176. package/dist/components/version-history-rows.d.ts +48 -0
  177. package/dist/components/version-history-rows.d.ts.map +1 -0
  178. package/dist/components/version-history-rows.js +51 -0
  179. package/dist/components/version-history-rows.js.map +1 -0
  180. package/dist/components/view-toggle.d.ts.map +1 -1
  181. package/dist/components/view-toggle.js.map +1 -1
  182. package/dist/element-slot.d.ts +11 -0
  183. package/dist/element-slot.d.ts.map +1 -1
  184. package/dist/element-slot.js +0 -11
  185. package/dist/element-slot.js.map +1 -1
  186. package/dist/guards.d.ts +6 -0
  187. package/dist/guards.d.ts.map +1 -0
  188. package/dist/guards.js +8 -0
  189. package/dist/guards.js.map +1 -0
  190. package/dist/hooks/interactions-connection.d.ts +43 -0
  191. package/dist/hooks/interactions-connection.d.ts.map +1 -0
  192. package/dist/hooks/interactions-connection.js +171 -0
  193. package/dist/hooks/interactions-connection.js.map +1 -0
  194. package/dist/hooks/interactions-stream.d.ts +80 -0
  195. package/dist/hooks/interactions-stream.d.ts.map +1 -0
  196. package/dist/hooks/interactions-stream.js +233 -0
  197. package/dist/hooks/interactions-stream.js.map +1 -0
  198. package/dist/hooks/useApi.d.ts +2259 -2189
  199. package/dist/hooks/useApi.d.ts.map +1 -1
  200. package/dist/hooks/useApi.js +0 -11
  201. package/dist/hooks/useApi.js.map +1 -1
  202. package/dist/hooks/useAuth.d.ts +6 -0
  203. package/dist/hooks/useAuth.d.ts.map +1 -1
  204. package/dist/hooks/useAuth.js +0 -6
  205. package/dist/hooks/useAuth.js.map +1 -1
  206. package/dist/hooks/useCapabilities.d.ts +18 -2
  207. package/dist/hooks/useCapabilities.d.ts.map +1 -1
  208. package/dist/hooks/useCapabilities.js +1 -17
  209. package/dist/hooks/useCapabilities.js.map +1 -1
  210. package/dist/hooks/useSse.d.ts +34 -6
  211. package/dist/hooks/useSse.d.ts.map +1 -1
  212. package/dist/hooks/useSse.js +27 -471
  213. package/dist/hooks/useSse.js.map +1 -1
  214. package/dist/hooks/useSystemKinds.d.ts +1 -1
  215. package/dist/hooks/useSystemKinds.d.ts.map +1 -1
  216. package/dist/hooks/useSystemKinds.js +0 -18
  217. package/dist/hooks/useSystemKinds.js.map +1 -1
  218. package/dist/hooks/useTheme.d.ts +15 -0
  219. package/dist/hooks/useTheme.d.ts.map +1 -1
  220. package/dist/hooks/useTheme.js +0 -15
  221. package/dist/hooks/useTheme.js.map +1 -1
  222. package/dist/hooks/useToolDisplayNames.d.ts +0 -14
  223. package/dist/hooks/useToolDisplayNames.d.ts.map +1 -1
  224. package/dist/hooks/useToolDisplayNames.js +0 -14
  225. package/dist/hooks/useToolDisplayNames.js.map +1 -1
  226. package/dist/host.d.ts +3 -3
  227. package/dist/host.d.ts.map +1 -1
  228. package/dist/host.js +2 -9
  229. package/dist/host.js.map +1 -1
  230. package/dist/index.d.ts +103 -103
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +49 -62
  233. package/dist/index.js.map +1 -1
  234. package/dist/navigation/app-link.d.ts +25 -0
  235. package/dist/navigation/app-link.d.ts.map +1 -0
  236. package/dist/navigation/app-link.js +33 -0
  237. package/dist/navigation/app-link.js.map +1 -0
  238. package/dist/navigation/context.d.ts +3 -20
  239. package/dist/navigation/context.d.ts.map +1 -1
  240. package/dist/navigation/context.js +7 -267
  241. package/dist/navigation/context.js.map +1 -1
  242. package/dist/navigation/entry-state.d.ts +23 -0
  243. package/dist/navigation/entry-state.d.ts.map +1 -0
  244. package/dist/navigation/entry-state.js +39 -0
  245. package/dist/navigation/entry-state.js.map +1 -0
  246. package/dist/navigation/guard-registry.d.ts +30 -0
  247. package/dist/navigation/guard-registry.d.ts.map +1 -0
  248. package/dist/navigation/guard-registry.js +46 -0
  249. package/dist/navigation/guard-registry.js.map +1 -0
  250. package/dist/navigation/guarded-navigation.d.ts +24 -0
  251. package/dist/navigation/guarded-navigation.d.ts.map +1 -0
  252. package/dist/navigation/guarded-navigation.js +102 -0
  253. package/dist/navigation/guarded-navigation.js.map +1 -0
  254. package/dist/navigation/index.d.ts +5 -4
  255. package/dist/navigation/index.d.ts.map +1 -1
  256. package/dist/navigation/index.js +2 -1
  257. package/dist/navigation/index.js.map +1 -1
  258. package/dist/navigation/types.d.ts +8 -11
  259. package/dist/navigation/types.d.ts.map +1 -1
  260. package/dist/navigation/use-back-forward-guard.d.ts +12 -0
  261. package/dist/navigation/use-back-forward-guard.d.ts.map +1 -0
  262. package/dist/navigation/use-back-forward-guard.js +75 -0
  263. package/dist/navigation/use-back-forward-guard.js.map +1 -0
  264. package/dist/navigation/use-search-commit.d.ts.map +1 -1
  265. package/dist/navigation/use-search-commit.js.map +1 -1
  266. package/dist/plugin/host-state.d.ts.map +1 -1
  267. package/dist/plugin/host-state.js.map +1 -1
  268. package/dist/plugin/registry.d.ts +6 -15
  269. package/dist/plugin/registry.d.ts.map +1 -1
  270. package/dist/plugin/registry.js +83 -75
  271. package/dist/plugin/registry.js.map +1 -1
  272. package/dist/schema-editor/SchemaEditor.d.ts.map +1 -1
  273. package/dist/schema-editor/SchemaEditor.js.map +1 -1
  274. package/dist/schema-editor/index.d.ts +3 -3
  275. package/dist/schema-editor/index.d.ts.map +1 -1
  276. package/dist/schema-editor/index.js +1 -6
  277. package/dist/schema-editor/index.js.map +1 -1
  278. package/dist/schema-form/SecretRefField.d.ts +18 -3
  279. package/dist/schema-form/SecretRefField.d.ts.map +1 -1
  280. package/dist/schema-form/SecretRefField.js +21 -26
  281. package/dist/schema-form/SecretRefField.js.map +1 -1
  282. package/dist/schema-form/classify.d.ts +1 -113
  283. package/dist/schema-form/classify.d.ts.map +1 -1
  284. package/dist/schema-form/classify.js +174 -246
  285. package/dist/schema-form/classify.js.map +1 -1
  286. package/dist/schema-form/context.d.ts +6 -0
  287. package/dist/schema-form/context.d.ts.map +1 -1
  288. package/dist/schema-form/context.js +0 -6
  289. package/dist/schema-form/context.js.map +1 -1
  290. package/dist/schema-form/default-value.d.ts.map +1 -1
  291. package/dist/schema-form/default-value.js +42 -19
  292. package/dist/schema-form/default-value.js.map +1 -1
  293. package/dist/schema-form/enum-field.d.ts +1 -1
  294. package/dist/schema-form/enum-field.d.ts.map +1 -1
  295. package/dist/schema-form/field-group.d.ts +6 -0
  296. package/dist/schema-form/field-group.d.ts.map +1 -1
  297. package/dist/schema-form/field-group.js +0 -6
  298. package/dist/schema-form/field-group.js.map +1 -1
  299. package/dist/schema-form/field-model.d.ts +121 -0
  300. package/dist/schema-form/field-model.d.ts.map +1 -0
  301. package/dist/schema-form/field-model.js +2 -0
  302. package/dist/schema-form/field-model.js.map +1 -0
  303. package/dist/schema-form/field-node.d.ts.map +1 -1
  304. package/dist/schema-form/field-node.js +25 -14
  305. package/dist/schema-form/field-node.js.map +1 -1
  306. package/dist/schema-form/index.d.ts +8 -8
  307. package/dist/schema-form/index.d.ts.map +1 -1
  308. package/dist/schema-form/index.js +3 -34
  309. package/dist/schema-form/index.js.map +1 -1
  310. package/dist/schema-form/json-field.d.ts +19 -0
  311. package/dist/schema-form/json-field.d.ts.map +1 -1
  312. package/dist/schema-form/json-field.js +0 -19
  313. package/dist/schema-form/json-field.js.map +1 -1
  314. package/dist/schema-form/media-field.d.ts +1 -1
  315. package/dist/schema-form/media-field.d.ts.map +1 -1
  316. package/dist/schema-form/media-field.js +49 -30
  317. package/dist/schema-form/media-field.js.map +1 -1
  318. package/dist/schema-form/record-field.d.ts +12 -0
  319. package/dist/schema-form/record-field.d.ts.map +1 -1
  320. package/dist/schema-form/record-field.js +1 -13
  321. package/dist/schema-form/record-field.js.map +1 -1
  322. package/dist/schema-form/string-annotations.d.ts +20 -0
  323. package/dist/schema-form/string-annotations.d.ts.map +1 -0
  324. package/dist/schema-form/string-annotations.js +105 -0
  325. package/dist/schema-form/string-annotations.js.map +1 -0
  326. package/dist/schema-form/string-field.d.ts +1 -1
  327. package/dist/schema-form/string-field.d.ts.map +1 -1
  328. package/dist/schema-form/string-field.js +1 -1
  329. package/dist/schema-form/string-field.js.map +1 -1
  330. package/dist/schema-form/union-field.d.ts +1 -1
  331. package/dist/schema-form/union-field.d.ts.map +1 -1
  332. package/dist/schema-form/union-field.js.map +1 -1
  333. package/dist/schema-form/union.d.ts +8 -1
  334. package/dist/schema-form/union.d.ts.map +1 -1
  335. package/dist/schema-form/union.js +0 -7
  336. package/dist/schema-form/union.js.map +1 -1
  337. package/dist/schema-form/validate.d.ts.map +1 -1
  338. package/dist/schema-form/validate.js +126 -105
  339. package/dist/schema-form/validate.js.map +1 -1
  340. package/dist/state-binding/AdapterMapping.d.ts.map +1 -1
  341. package/dist/state-binding/AdapterMapping.js +0 -0
  342. package/dist/state-binding/AdapterMapping.js.map +1 -1
  343. package/dist/state-binding/BindingJqField.d.ts.map +1 -1
  344. package/dist/state-binding/BindingJqField.js +2 -2
  345. package/dist/state-binding/BindingJqField.js.map +1 -1
  346. package/dist/state-binding/InputInjectionRow.d.ts.map +1 -1
  347. package/dist/state-binding/InputInjectionRow.js +3 -3
  348. package/dist/state-binding/InputInjectionRow.js.map +1 -1
  349. package/dist/state-binding/StateAttachRow.d.ts.map +1 -1
  350. package/dist/state-binding/StateAttachRow.js +57 -41
  351. package/dist/state-binding/StateAttachRow.js.map +1 -1
  352. package/dist/state-binding/StateBindingSection.d.ts.map +1 -1
  353. package/dist/state-binding/StateBindingSection.js.map +1 -1
  354. package/dist/state-binding/SubjectScopeFields.d.ts.map +1 -1
  355. package/dist/state-binding/SubjectScopeFields.js.map +1 -1
  356. package/dist/state-binding/UpdateRow.d.ts.map +1 -1
  357. package/dist/state-binding/UpdateRow.js +2 -2
  358. package/dist/state-binding/UpdateRow.js.map +1 -1
  359. package/dist/state-binding/adapter-mapping-row.d.ts +17 -0
  360. package/dist/state-binding/adapter-mapping-row.d.ts.map +1 -0
  361. package/dist/state-binding/adapter-mapping-row.js +87 -0
  362. package/dist/state-binding/adapter-mapping-row.js.map +1 -0
  363. package/dist/state-binding/index.d.ts +21 -21
  364. package/dist/state-binding/index.d.ts.map +1 -1
  365. package/dist/state-binding/index.js +9 -15
  366. package/dist/state-binding/index.js.map +1 -1
  367. package/dist/state-binding/templated-text-catalog.d.ts.map +1 -1
  368. package/dist/state-binding/templated-text-catalog.js.map +1 -1
  369. package/dist/state-binding/types.d.ts +2 -2
  370. package/dist/state-binding/types.d.ts.map +1 -1
  371. package/dist/structured-output/StructuredOutput.d.ts.map +1 -1
  372. package/dist/structured-output/StructuredOutput.js +1 -3
  373. package/dist/structured-output/StructuredOutput.js.map +1 -1
  374. package/package.json +2 -2
  375. package/src/components/code-block.tsx +1 -1
  376. package/src/components/confirm-dialog.tsx +1 -1
  377. package/src/components/copy-field.tsx +1 -1
  378. package/src/components/date-range-picker.tsx +1 -1
  379. package/src/components/dialog.tsx +1 -1
  380. package/src/components/dirty-guard.tsx +3 -3
  381. package/src/components/explorer-body.tsx +239 -0
  382. package/src/components/explorer-page-size.ts +39 -0
  383. package/src/components/explorer-tag-filter.tsx +80 -0
  384. package/src/components/explorer-tags.ts +64 -0
  385. package/src/components/explorer-view.tsx +115 -367
  386. package/src/components/extension-combo-builder.tsx +35 -153
  387. package/src/components/extension-combo-parts.tsx +236 -0
  388. package/src/components/field.tsx +1 -1
  389. package/src/components/fleet-report.tsx +98 -55
  390. package/src/components/folder-nav.tsx +2 -2
  391. package/src/components/form-dialog.tsx +2 -2
  392. package/src/components/icons/chrome-marks.tsx +195 -0
  393. package/src/components/icons/icon-frame.tsx +50 -0
  394. package/src/components/icons/index.ts +84 -0
  395. package/src/components/icons/nav-map.ts +55 -0
  396. package/src/components/icons/nav-marks.tsx +205 -0
  397. package/src/components/icons/status-marks.tsx +46 -0
  398. package/src/components/icons/theme-marks.tsx +33 -0
  399. package/src/components/inputs.tsx +1 -1
  400. package/src/components/json-diff.tsx +1 -4
  401. package/src/components/json-tree-context.ts +26 -0
  402. package/src/components/json-tree-model.ts +139 -0
  403. package/src/components/json-tree-nodes.tsx +224 -0
  404. package/src/components/json-tree.tsx +15 -434
  405. package/src/components/json-value-format.ts +64 -0
  406. package/src/components/markdown-blocks.ts +198 -0
  407. package/src/components/markdown-inline.tsx +365 -0
  408. package/src/components/markdown.tsx +6 -472
  409. package/src/components/observer-registry.ts +139 -0
  410. package/src/components/overflow-measure.ts +69 -0
  411. package/src/components/page-fill.tsx +1 -1
  412. package/src/components/prose-regions.ts +153 -0
  413. package/src/components/radio-group.tsx +1 -1
  414. package/src/components/scroll-region.tsx +22 -361
  415. package/src/components/tab-stop-parse.ts +217 -0
  416. package/src/components/table.tsx +1 -1
  417. package/src/components/tags.tsx +2 -2
  418. package/src/components/templated-text-field.tsx +39 -332
  419. package/src/components/templated-text-kwargs-editor.tsx +147 -0
  420. package/src/components/templated-text-kwargs.ts +92 -0
  421. package/src/components/templated-text-source.tsx +226 -0
  422. package/src/components/tool-picker-parts.tsx +184 -0
  423. package/src/components/tool-picker.tsx +22 -114
  424. package/src/components/version-history-panel.tsx +39 -143
  425. package/src/components/version-history-rows.tsx +220 -0
  426. package/src/components/view-toggle.tsx +1 -1
  427. package/src/element-slot.ts +1 -1
  428. package/src/guards.ts +7 -0
  429. package/src/hooks/interactions-connection.ts +227 -0
  430. package/src/hooks/interactions-stream.ts +274 -0
  431. package/src/hooks/useApi.ts +1 -1
  432. package/src/hooks/useAuth.ts +1 -1
  433. package/src/hooks/useCapabilities.ts +3 -3
  434. package/src/hooks/useSse.ts +51 -478
  435. package/src/hooks/useSystemKinds.tsx +2 -2
  436. package/src/hooks/useTheme.ts +1 -1
  437. package/src/hooks/useToolDisplayNames.tsx +2 -2
  438. package/src/host.ts +7 -7
  439. package/src/index.ts +292 -292
  440. package/src/navigation/app-link.tsx +70 -0
  441. package/src/navigation/context.tsx +12 -331
  442. package/src/navigation/entry-state.ts +42 -0
  443. package/src/navigation/guard-registry.ts +65 -0
  444. package/src/navigation/guarded-navigation.ts +147 -0
  445. package/src/navigation/index.ts +14 -14
  446. package/src/navigation/types.ts +8 -11
  447. package/src/navigation/use-back-forward-guard.ts +90 -0
  448. package/src/navigation/use-search-commit.ts +1 -1
  449. package/src/plugin/host-state.ts +1 -1
  450. package/src/plugin/registry.ts +111 -90
  451. package/src/schema-editor/SchemaEditor.tsx +1 -1
  452. package/src/schema-editor/index.ts +3 -3
  453. package/src/schema-form/SecretRefField.tsx +122 -72
  454. package/src/schema-form/classify.ts +245 -396
  455. package/src/schema-form/context.ts +1 -1
  456. package/src/schema-form/default-value.ts +48 -17
  457. package/src/schema-form/enum-field.tsx +1 -1
  458. package/src/schema-form/field-group.tsx +1 -1
  459. package/src/schema-form/field-model.ts +133 -0
  460. package/src/schema-form/field-node.tsx +95 -39
  461. package/src/schema-form/index.ts +10 -10
  462. package/src/schema-form/json-field.tsx +1 -1
  463. package/src/schema-form/media-field.tsx +136 -67
  464. package/src/schema-form/record-field.tsx +2 -2
  465. package/src/schema-form/string-annotations.ts +111 -0
  466. package/src/schema-form/string-field.tsx +2 -2
  467. package/src/schema-form/union-field.tsx +3 -2
  468. package/src/schema-form/union.ts +1 -1
  469. package/src/schema-form/validate.ts +185 -104
  470. package/src/state-binding/AdapterMapping.tsx +0 -0
  471. package/src/state-binding/BindingJqField.tsx +3 -3
  472. package/src/state-binding/InputInjectionRow.tsx +4 -4
  473. package/src/state-binding/StateAttachRow.tsx +229 -154
  474. package/src/state-binding/StateBindingSection.tsx +1 -1
  475. package/src/state-binding/SubjectScopeFields.tsx +1 -1
  476. package/src/state-binding/UpdateRow.tsx +3 -3
  477. package/src/state-binding/adapter-mapping-row.tsx +232 -0
  478. package/src/state-binding/index.ts +43 -43
  479. package/src/state-binding/templated-text-catalog.ts +0 -1
  480. package/src/state-binding/types.ts +2 -2
  481. package/src/structured-output/StructuredOutput.tsx +1 -4
  482. package/dist/components/icons.d.ts +0 -160
  483. package/dist/components/icons.d.ts.map +0 -1
  484. package/dist/components/icons.js +0 -160
  485. package/dist/components/icons.js.map +0 -1
  486. package/src/components/icons.tsx +0 -586
@@ -1,271 +1,26 @@
1
- /**
2
- * `useInteractionsStream` — the live interactions inbox, a TAIL-ONLY SSE stream
3
- * (via the api-client's `streamInteractions`: fetch + ReadableStream, never
4
- * EventSource) laid over a PAGED base the caller supplies.
5
- *
6
- * The stream carries only the live tail: events `interaction.add` /
7
- * `interaction.answered` / `interaction.removed` (no backlog, no
8
- * `interaction.backlog_done`). The PENDING SET is not replayed on the stream — it
9
- * is the `seed` the caller passes from the paged `GET /api/interactions` door; this
10
- * hook overlays the live deltas onto it. The hook calls `onResync` on every
11
- * (re)connect ONLY, so the caller refetches that base to catch up anything missed
12
- * while disconnected; a live delta never triggers a refetch — the overlay updates
13
- * the list and the derived `count` in place.
14
- *
15
- * The published list is `merge(seed, live)`: every seeded pending item, plus any
16
- * item added on the tail since connect, minus any removed on the tail, with the
17
- * client `answered` flag set on an item the tail reported answered.
18
- *
19
- * The published `count` is the live PENDING tally, derived from the same overlay
20
- * without a refetch, reconciled by EPOCH so a resync never double-counts. Each
21
- * (re)connect refetches the base under a fresh epoch and, once that refetch LANDS
22
- * fresh, records it as `countEpoch` (a failed refetch does not advance it, so
23
- * prior-epoch deltas keep applying against the consistent prior total rather than
24
- * being discarded against a stale one); every overlay add and every terminal
25
- * (answered or removed) entry is stamped with the epoch current when its frame
26
- * arrived. The count
27
- * is the seed `total` plus live adds not in the seed AND stamped at or after
28
- * `countEpoch`, minus one for every terminal id stamped at or after `countEpoch`
29
- * (deduped per id) — a terminal or an add already folded into the refetched `total`
30
- * carries an older stamp and is not applied again. The single residual: a frame
31
- * arriving while a refetch is in flight may or may not be reflected in that refetch's
32
- * `total`, and is reconciled on the next resync.
33
- *
34
- * ANSWERED-CARD LIFECYCLE: the server emits no removal for an answered card —
35
- * only `interaction.answered`, never `interaction.removed` for it — and the paged
36
- * base never carries answered items. On its answered frame a card is promoted into
37
- * the overlay's adds (a seed-origin card too), so it lingers uniformly whether it
38
- * began as a live add or a seed item, even after a refetch drops it from the base.
39
- * This hook AGES it out itself: an answered card is dropped `ANSWERED_RETENTION_MS`
40
- * after its answered frame (tombstoned so a still-stale seed cannot resurrect it),
41
- * with `ANSWERED_CAP` as a hard newest-N flood backstop. Both are swept lazily on
42
- * frame/reconnect ticks (the stream carries no idle heartbeat frame), never a
43
- * per-item timer.
44
- *
45
- * `add` / `answered` frames are at-least-once; entries are keyed by
46
- * `interaction_id`, a redelivered `add` overwrites in place, and a redelivered
47
- * `answered` keeps the original stamp so the retention window is not extended.
48
- *
49
- * The `Interaction` type is imported type-only (no runtime dep on api-client);
50
- * frames are validated defensively and a malformed frame is surfaced as an error,
51
- * never rendered as a silent blank. `answered` is not a wire field — it is a
52
- * client flag this hook flips on an `interaction.answered` event.
53
- */
54
1
  import { useEffect, useRef, useState } from 'react';
2
+ import { startInteractionsStream } from './interactions-connection';
3
+ import { emptyOverlay, merge, pendingCount, } from './interactions-stream';
55
4
  import { useApi } from './useApi';
56
5
  import { useOnUnauthorized } from './useUnauthorized';
57
- import { isFeatureDisabled } from '../feature-disabled';
58
- // Reconnect backoff: capped exponential with full jitter. The delay for attempt
59
- // n is a random value in [0, min(CAP, BASE * 2**n)); the attempt counter resets
60
- // only when a connection PROVES HEALTHY — it stayed open at least
61
- // `HEALTHY_CONNECTION_MS` — not merely when it opens, so a server that accepts the
62
- // request then drops the body still backs off instead of tight-looping. A healthy
63
- // tail-reconnect is near-instant while a sustained outage backs off, and the
64
- // jitter spreads many clients apart rather than retrying in lockstep.
65
- const RECONNECT_BASE_MS = 1500;
66
- const RECONNECT_CAP_MS = 30000;
67
- const HEALTHY_CONNECTION_MS = RECONNECT_BASE_MS;
68
- // The server emits no removal for an answered card — only `interaction.answered`,
69
- // never `interaction.removed` for it — and the paged base never carries answered
70
- // items, so answered cards would otherwise pile up unbounded in the always-mounted
71
- // badge/inbox. The client ages them out: drop an answered card
72
- // ANSWERED_RETENTION_MS after its answered frame, keeping at most ANSWERED_CAP as a
73
- // hard flood backstop. Swept lazily on frame/reconnect ticks (the stream carries no
74
- // idle heartbeat frame), never a per-item timer.
75
- const ANSWERED_RETENTION_MS = 10 * 60 * 1000;
76
- const ANSWERED_CAP = 200;
77
- // The wire `answer_format` values. Duplicated from the api-client enum by design:
78
- // the SDK is the leaf and must not import api-client at runtime. The `satisfies`
79
- // pin against `Interaction['answer_format']` fails to compile if a listed value
80
- // leaves the union, so this runtime guard cannot silently drift from the type.
81
- const ANSWER_FORMATS = new Set([
82
- 'text',
83
- 'confirm',
84
- 'select',
85
- 'form',
86
- 'external',
87
- ]);
88
- function isRecord(value) {
89
- return typeof value === 'object' && value !== null && !Array.isArray(value);
90
- }
91
- /** Parse a frame's JSON to a plain object, or null when it is not one. */
92
- function parseJson(data) {
93
- if (!data)
94
- return null;
95
- try {
96
- const obj = JSON.parse(data);
97
- return isRecord(obj) ? obj : null;
98
- }
99
- catch {
100
- return null;
101
- }
102
- }
103
- /**
104
- * Validate an `interaction.add` frame into an `Interaction`, or null when it is
105
- * malformed. This mirrors the api-client `interaction` zod schema exactly — it
106
- * accepts what that schema accepts, no more, no less. The strict-required fields
107
- * — `interaction_id`, `group_id`, `created_at`, `timeout_at` — must be a string
108
- * and `answer_format` a known enum value; any missing or non-string one returns
109
- * null so the caller surfaces it as an error rather than rendering a blank card.
110
- * Two fields are laxer, matching the schema: `question` is
111
- * `z.string().default('')`, whose default substitutes ONLY an absent/undefined
112
- * value, so a missing question normalizes to `''` while a present `null` (or any
113
- * present non-string) is rejected; `format_payload` is nullish, so an absent/null
114
- * value (text/confirm carry none) normalizes to `{}` while a present non-object is
115
- * rejected — never silently coerced to a blank card.
116
- */
117
- function parseAddFrame(data) {
118
- const obj = parseJson(data);
119
- if (obj === null)
120
- return null;
121
- const { interaction_id, group_id, question, answer_format, format_payload, created_at, timeout_at, sensitive, server_verified, channel, recipient, origin, audience, media, } = obj;
122
- if (typeof interaction_id !== 'string')
123
- return null;
124
- if (typeof group_id !== 'string')
125
- return null;
126
- // `question` is z.string().default('') in the schema: the default substitutes
127
- // ONLY an absent/undefined value, so a missing question is valid while a
128
- // present null (or any other present non-string) is malformed.
129
- if (question !== undefined && typeof question !== 'string')
130
- return null;
131
- if (typeof created_at !== 'string')
132
- return null;
133
- if (typeof timeout_at !== 'string')
134
- return null;
135
- if (typeof answer_format !== 'string' || !ANSWER_FORMATS.has(answer_format))
136
- return null;
137
- // `format_payload` is nullish in the schema: absent/null normalizes to {}, but
138
- // a present non-object is malformed and must not be coerced to a blank card.
139
- if (format_payload != null && !isRecord(format_payload))
140
- return null;
141
- // `sensitive` is z.boolean().default(false): an absent value normalizes to
142
- // false, while a present non-boolean is malformed.
143
- if (sensitive !== undefined && typeof sensitive !== 'boolean')
144
- return null;
145
- // `server_verified` is z.boolean().optional(): an absent value stays undefined,
146
- // while a present non-boolean is malformed.
147
- if (server_verified !== undefined && typeof server_verified !== 'boolean')
148
- return null;
149
- // `channel` is z.string().optional(): the delivery-channel name rides the frame
150
- // only for a channel-delivered question; absent stays undefined, a present
151
- // non-string is malformed.
152
- if (channel !== undefined && typeof channel !== 'string')
153
- return null;
154
- // Attribution fields are each z.string().optional(): `recipient` (delivery
155
- // address), `origin` (asking run id), `audience` (addressed user_id) ride the
156
- // frame only when set; absent stays undefined, a present non-string is malformed.
157
- if (recipient !== undefined && typeof recipient !== 'string')
158
- return null;
159
- if (origin !== undefined && typeof origin !== 'string')
160
- return null;
161
- if (audience !== undefined && typeof audience !== 'string')
162
- return null;
163
- // `media` is z.array(z.unknown()).optional(): the display-only media rides the
164
- // frame only when the question carries some; absent stays undefined, a present
165
- // non-array is malformed. The ITEMS stay unknown here (loose by design) — each is
166
- // validated per item by the renderer, so one bad item never fails this frame.
167
- if (media !== undefined && !Array.isArray(media))
168
- return null;
169
- return {
170
- interaction_id,
171
- group_id,
172
- question: typeof question === 'string' ? question : '',
173
- answer_format: answer_format,
174
- format_payload: isRecord(format_payload) ? format_payload : {},
175
- created_at,
176
- timeout_at,
177
- sensitive: sensitive ?? false,
178
- ...(typeof server_verified === 'boolean' ? { server_verified } : {}),
179
- ...(typeof channel === 'string' ? { channel } : {}),
180
- ...(typeof recipient === 'string' ? { recipient } : {}),
181
- ...(typeof origin === 'string' ? { origin } : {}),
182
- ...(typeof audience === 'string' ? { audience } : {}),
183
- ...(Array.isArray(media) ? { media } : {}),
184
- };
185
- }
186
- /** The interaction id from an `answered` / `removed` frame, or null. */
187
- function parseId(data) {
188
- const id = parseJson(data)?.interaction_id;
189
- return typeof id === 'string' ? id : null;
190
- }
191
- function emptyOverlay() {
192
- return {
193
- adds: new Map(),
194
- addEpoch: new Map(),
195
- answeredAt: new Map(),
196
- removed: new Set(),
197
- goneEpoch: new Map(),
198
- };
199
- }
200
- /** Fold the paged base and the live overlay into the published, ordered list. */
201
- function merge(seed, live) {
202
- const out = new Map();
203
- for (const item of seed) {
204
- if (live.removed.has(item.interaction_id))
205
- continue;
206
- out.set(item.interaction_id, { ...item, answered: live.answeredAt.has(item.interaction_id) });
207
- }
208
- for (const [id, item] of live.adds) {
209
- if (live.removed.has(id))
210
- continue;
211
- out.set(id, { ...item, answered: live.answeredAt.has(id) });
212
- }
213
- return Array.from(out.values());
214
- }
215
- /**
216
- * The live pending tally: the door's `total` for the seed, plus live adds whose id
217
- * is absent from the seed AND stamped at or after `countEpoch` (a new question not
218
- * yet folded into `total`), minus one for every terminal id — answered OR removed —
219
- * stamped at or after `countEpoch`, deduped per id so an id counts once however many
220
- * terminal frames it drew. `countEpoch` is the epoch of the last resync whose refetch
221
- * LANDED (a failed refetch never advances it): a delta stamped before it is already
222
- * reflected in the fresh `total`, so it is NOT applied again — this is what stops a
223
- * resync from re-subtracting a terminal it already dropped from `total`, while a
224
- * failed refetch keeps the prior-epoch deltas applying against the prior total. Every
225
- * terminal frame a client receives refers to a
226
- * question inside its own `total` (the stream and the list door apply the same
227
- * audience filter). One residual race remains: a frame arriving while a refetch is in
228
- * flight may already be reflected in that refetch's `total` (the resync GET landing
229
- * after an answer POST), so the raw tally can transiently dip below zero until the
230
- * next resync reconciles — observed live as a "-1 pending questions" badge. A
231
- * pending tally below zero is meaningless, so the published count clamps at 0. The
232
- * clamp covers only the negative symptom: the same race can also leave a transient
233
- * positive under-count (a double-subtracted question hiding a still-pending one),
234
- * which reconciles on the next resync, not here.
235
- */
236
- function pendingCount(seed, total, live, countEpoch) {
237
- const seedIds = new Set(seed.map((item) => item.interaction_id));
238
- let count = total;
239
- for (const id of live.adds.keys()) {
240
- if (!seedIds.has(id) && (live.addEpoch.get(id) ?? 0) >= countEpoch)
241
- count += 1;
242
- }
243
- const gone = new Set([...live.answeredAt.keys(), ...live.removed]);
244
- for (const id of gone) {
245
- if ((live.goneEpoch.get(id) ?? 0) >= countEpoch)
246
- count -= 1;
247
- }
248
- return Math.max(count, 0);
249
- }
250
6
  export function useInteractionsStream(options) {
251
7
  const { seed, total, onResync } = options;
252
8
  const api = useApi();
253
9
  const onUnauthorized = useOnUnauthorized();
254
- const [connectionState, setConnectionState] = useState({ connected: false, error: null, disabled: false });
255
- // The live overlay is a ref (mutated in place by the stream loop); the published
256
- // list is `merge(seed, overlay)` held in state, recomputed on every overlay
257
- // change (the stream loop) and every seed change (a refetch of the paged base).
10
+ const [connectionState, setConnectionState] = useState({
11
+ connected: false,
12
+ error: null,
13
+ disabled: false,
14
+ });
15
+ // The live overlay is a ref (mutated in place by the connection driver); the
16
+ // published list is `merge(seed, overlay)` held in state, recomputed on every
17
+ // overlay change (the driver) and every seed change (a refetch of the paged base).
258
18
  const overlayRef = useRef(emptyOverlay());
259
19
  const [interactions, setInteractions] = useState(() => merge(seed, overlayRef.current));
260
- // Resync epochs. `epochRef` increments on each (re)connect and stamps every frame
261
- // that arrives on that connection; `countEpoch` is set to the connect's epoch only
262
- // once its refetch landed fresh (onResync resolved true) — a failed refetch leaves
263
- // it unchanged so prior-epoch deltas keep applying against the prior total.
264
- // `pendingCount` applies only overlay entries stamped at or after `countEpoch`, so a
265
- // resync never re-subtracts a terminal it already dropped from the fresh `total`.
20
+ // Resync epochs. `epochRef` increments on each (re)connect and stamps every frame;
21
+ // `countEpoch` advances to a connect's epoch only once its refetch landed fresh.
266
22
  // `countEpoch` is STATE, not a ref: advancing it must republish the derived count
267
- // even when the reconnect carries no frame after the refetch. Both reset with the
268
- // overlay on remount.
23
+ // even when the reconnect carries no frame after the refetch.
269
24
  const epochRef = useRef(0);
270
25
  const [countEpoch, setCountEpoch] = useState(0);
271
26
  // The stream effect must not reopen when `seed`/`onResync` change, so they are
@@ -278,219 +33,20 @@ export function useInteractionsStream(options) {
278
33
  useEffect(() => {
279
34
  setInteractions(merge(seed, overlayRef.current));
280
35
  }, [seed]);
281
- useEffect(() => {
282
- const controller = new AbortController();
283
- const aborted = () => controller.signal.aborted;
284
- const overlay = overlayRef.current;
285
- let reconnectAttempt = 0;
286
- // The id of the last frame seen on this mount, sent as Last-Event-ID on each
287
- // reconnect so the server resumes AFTER it and replays any frame that landed
288
- // during the gap — including a card's `answered`, which heals a card that would
289
- // otherwise vanish (absent from both the refetched pending base and the tail).
290
- // Persists across reconnects within one mount; resets with the overlay on remount.
291
- let lastEventId;
292
- // Age answered cards out (the server sends no removal for them): tombstone any
293
- // past the retention window, then — as a flood backstop — the oldest beyond the
294
- // count cap. A tombstone (not a bare delete) so a still-stale seed cannot
295
- // resurrect a card the client has retired.
296
- const sweepAnswered = () => {
297
- const now = Date.now();
298
- const retire = (id) => {
299
- overlay.answeredAt.delete(id);
300
- overlay.adds.delete(id);
301
- overlay.addEpoch.delete(id);
302
- overlay.removed.add(id);
303
- // The id keeps its original `goneEpoch` (stamped on its answered frame) so
304
- // moving answered→removed never re-dates it into a fresher resync.
305
- };
306
- for (const [id, at] of overlay.answeredAt) {
307
- if (now - at >= ANSWERED_RETENTION_MS)
308
- retire(id);
309
- }
310
- if (overlay.answeredAt.size > ANSWERED_CAP) {
311
- const oldest = [...overlay.answeredAt.entries()].sort((a, b) => a[1] - b[1]);
312
- for (const [id] of oldest.slice(0, oldest.length - ANSWERED_CAP))
313
- retire(id);
314
- }
315
- };
316
- const surfaceMalformed = (event) => {
317
- setConnectionState((prev) => ({
318
- ...prev,
319
- error: new Error(`malformed interaction frame: ${event}`),
320
- }));
321
- };
322
- // A successful data frame sweeps, republishes the merged list, and clears any
323
- // transient frame-parse error — one bad frame on a healthy stream must not
324
- // stick. It does NOT refetch: the overlay already updated the list and the
325
- // derived count, and `onResync` fires on (re)connect only.
326
- const commit = () => {
327
- if (aborted())
328
- return;
329
- sweepAnswered();
330
- setConnectionState((prev) => (prev.error === null ? prev : { ...prev, error: null }));
331
- setInteractions(merge(seedRef.current, overlay));
332
- };
333
- const applyFrame = (event, data) => {
334
- if (event === 'interaction.removed') {
335
- const id = parseId(data);
336
- if (id === null) {
337
- surfaceMalformed(event);
338
- return;
339
- }
340
- overlay.adds.delete(id);
341
- overlay.addEpoch.delete(id);
342
- overlay.answeredAt.delete(id);
343
- overlay.removed.add(id);
344
- // Stamp the terminal epoch on the FIRST terminal frame for this id only.
345
- if (!overlay.goneEpoch.has(id))
346
- overlay.goneEpoch.set(id, epochRef.current);
347
- commit();
348
- return;
349
- }
350
- if (event === 'interaction.answered') {
351
- const id = parseId(data);
352
- if (id === null) {
353
- surfaceMalformed(event);
354
- return;
355
- }
356
- // Stamp the answered time on the FIRST answered frame only; a redelivered
357
- // answered keeps the original stamp so the retention window is not extended.
358
- if (!overlay.answeredAt.has(id))
359
- overlay.answeredAt.set(id, Date.now());
360
- // Stamp the terminal epoch on the FIRST terminal frame for this id only, so a
361
- // later terminal never re-dates it into a fresher resync.
362
- if (!overlay.goneEpoch.has(id))
363
- overlay.goneEpoch.set(id, epochRef.current);
364
- // Promote a seed-origin card into the overlay so it lingers uniformly with a
365
- // live-add card: the paged base never carries answered items, so a refetch
366
- // would otherwise drop it before its retention window elapses.
367
- if (!overlay.adds.has(id)) {
368
- const seeded = seedRef.current.find((item) => item.interaction_id === id);
369
- if (seeded !== undefined) {
370
- overlay.adds.set(id, seeded);
371
- overlay.addEpoch.set(id, epochRef.current);
372
- }
373
- }
374
- commit();
375
- return;
376
- }
377
- // interaction.add — the full question. Ids are never reused, so a live add
378
- // simply overwrites any prior copy in place.
379
- const interaction = parseAddFrame(data);
380
- if (interaction === null) {
381
- surfaceMalformed(event);
382
- return;
383
- }
384
- overlay.adds.set(interaction.interaction_id, interaction);
385
- overlay.addEpoch.set(interaction.interaction_id, epochRef.current);
386
- commit();
387
- };
388
- // The abort signal is the single cancellation source of truth: the cleanup
389
- // aborts it, and every loop guard reads it fresh.
390
- const run = async () => {
391
- while (!aborted()) {
392
- const openedAt = Date.now();
393
- try {
394
- const frames = await api.streamInteractions(controller.signal, lastEventId);
395
- if (aborted())
396
- return;
397
- setConnectionState((prev) => ({
398
- ...prev,
399
- connected: true,
400
- error: null,
401
- disabled: false,
402
- }));
403
- // Tail-only: the pending base is not on the stream. Refetch it on every
404
- // (re)connect under a fresh epoch so anything removed or added while
405
- // disconnected is reconciled by the fresh page; record that epoch as
406
- // `countEpoch` only once the refetch LANDED (onResync resolved true), so the
407
- // count applies only deltas not yet folded into the fresh `total`. A failed
408
- // refetch (false) leaves `countEpoch` unchanged, so prior-epoch deltas keep
409
- // applying against the consistent prior total instead of being discarded
410
- // against a stale one. Every frame on this connection is stamped with `epoch`.
411
- const epoch = (epochRef.current += 1);
412
- const landed = await onResyncRef.current();
413
- if (aborted())
414
- return;
415
- if (landed)
416
- setCountEpoch(epoch);
417
- for await (const frame of frames) {
418
- if (aborted())
419
- return;
420
- applyFrame(frame.event, frame.data);
421
- // Advance the resume cursor to every id-bearing frame (even a malformed
422
- // one) so a reconnect never re-requests a frame already delivered.
423
- if (frame.id !== undefined)
424
- lastEventId = frame.id;
425
- }
426
- }
427
- catch (err) {
428
- if (aborted())
429
- return;
430
- const error = err instanceof Error ? err : new Error(String(err));
431
- setConnectionState((prev) => ({ ...prev, connected: false, error }));
432
- if (error.name === 'ApiUnauthorizedError') {
433
- // A 401 means the stored credential is dead — reconnecting would just
434
- // replay the same bad key every delay forever. Treat it as terminal
435
- // and hand off to the app's 401→login handler, the same path every
436
- // other data call takes; do not loop.
437
- onUnauthorized();
438
- return;
439
- }
440
- if (isFeatureDisabled(error)) {
441
- // A terminal 501 `interactions-not-configured`: the deployment runs no
442
- // interactions store, so reconnecting would replay the same refusal on
443
- // every backoff forever (this stream is always-mounted via the shell
444
- // badge). Stop, and flag the OFF state so the badge disappears and the
445
- // page renders the muted "not configured" note instead of a red error.
446
- setConnectionState((prev) => ({ ...prev, connected: false, disabled: true }));
447
- return;
448
- }
449
- }
450
- // A connection that stayed open at least HEALTHY_CONNECTION_MS proved
451
- // healthy — clear the reconnect backoff so the next drop reconnects
452
- // promptly; an immediate accept-then-drop flap does not reset it.
453
- if (Date.now() - openedAt >= HEALTHY_CONNECTION_MS)
454
- reconnectAttempt = 0;
455
- // Stream ended or errored → wait, then reconnect. Guard before the
456
- // setState, like every other setState in run(): a microtask scheduled after
457
- // the `for await` must not write state after the effect cleanup has aborted
458
- // (and unmounted) the hook.
459
- if (aborted())
460
- return;
461
- setConnectionState((prev) => ({ ...prev, connected: false }));
462
- const ceiling = Math.min(RECONNECT_CAP_MS, RECONNECT_BASE_MS * 2 ** reconnectAttempt);
463
- const delay = Math.random() * ceiling;
464
- reconnectAttempt += 1;
465
- await new Promise((resolve) => {
466
- const onAbort = () => {
467
- clearTimeout(timer);
468
- resolve();
469
- };
470
- const timer = setTimeout(() => {
471
- // Normal wake: drop the abort listener so it does not accumulate
472
- // across reconnects ({ once: true } only self-removes on firing).
473
- controller.signal.removeEventListener('abort', onAbort);
474
- resolve();
475
- }, delay);
476
- controller.signal.addEventListener('abort', onAbort, { once: true });
477
- });
478
- }
479
- };
480
- void run();
481
- return () => {
482
- controller.abort();
483
- // A fresh mount starts from an empty overlay at epoch 0: the effect owns the
484
- // connection and its live deltas, so a re-run must not inherit the prior run's
485
- // tail or its epoch stamps.
486
- overlayRef.current = emptyOverlay();
487
- epochRef.current = 0;
488
- setCountEpoch(0);
489
- };
490
- }, [api, onUnauthorized]);
491
- // Derived live, not stored: every overlay mutation republishes `interactions` (a
492
- // setState), and every seed/total change and every `countEpoch` advance is itself a
493
- // render, so this recomputes from the current overlay ref on the same render.
36
+ useEffect(() => startInteractionsStream({
37
+ api,
38
+ overlayRef,
39
+ epochRef,
40
+ seedRef,
41
+ onResyncRef,
42
+ onUnauthorized,
43
+ setConnectionState,
44
+ setInteractions,
45
+ setCountEpoch,
46
+ }), [api, onUnauthorized]);
47
+ // Derived live, not stored: every overlay mutation republishes `interactions`, and
48
+ // every seed/total change and every `countEpoch` advance is itself a render, so
49
+ // this recomputes from the current overlay ref on the same render.
494
50
  const count = pendingCount(seed, total, overlayRef.current, countEpoch);
495
51
  return {
496
52
  interactions,
@@ -1 +1 @@
1
- {"version":3,"file":"useSse.js","sourceRoot":"","sources":["../../src/hooks/useSse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSse.js","sourceRoot":"","sources":["../../src/hooks/useSse.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAwB,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EACL,YAAY,EAEZ,KAAK,EACL,YAAY,GAEb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAkDtD,MAAM,UAAU,qBAAqB,CAAC,OAAkC;IACtE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAkB;QACtE,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,6EAA6E;IAC7E,8EAA8E;IAC9E,mFAAmF;IACnF,MAAM,UAAU,GAAG,MAAM,CAAc,YAAY,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAsB,GAAG,EAAE,CACzE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,CAChC,CAAC;IAEF,mFAAmF;IACnF,iFAAiF;IACjF,kFAAkF;IAClF,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,+EAA+E;IAC/E,8CAA8C;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,gFAAgF;IAChF,SAAS,CAAC,GAAG,EAAE;QACb,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,SAAS,CACP,GAAG,EAAE,CACH,uBAAuB,CAAC;QACtB,GAAG;QACH,UAAU;QACV,QAAQ;QACR,OAAO;QACP,WAAW;QACX,cAAc;QACd,kBAAkB;QAClB,eAAe;QACf,aAAa;KACd,CAAC,EACJ,CAAC,GAAG,EAAE,cAAc,CAAC,CACtB,CAAC;IAEF,mFAAmF;IACnF,gFAAgF;IAChF,mEAAmE;IACnE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAExE,OAAO;QACL,YAAY;QACZ,KAAK;QACL,SAAS,EAAE,eAAe,CAAC,SAAS;QACpC,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,QAAQ,EAAE,eAAe,CAAC,QAAQ;KACnC,CAAC;AACJ,CAAC"}
@@ -16,8 +16,8 @@
16
16
  * as not-off until the table is `ready`, and a failed fetch leaves every kind not-off
17
17
  * so the surface falls back to its reactive 501 handling, never a hard-failed page.
18
18
  */
19
- import { type ReactNode } from 'react';
20
19
  import type { KindStatus } from '@tai42/api-client';
20
+ import { type ReactNode } from 'react';
21
21
  export type SystemKindsState = {
22
22
  readonly status: 'loading';
23
23
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"useSystemKinds.d.ts","sourceRoot":"","sources":["../../src/hooks/useSystemKinds.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAI3D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,oGA4BxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhE"}
1
+ {"version":3,"file":"useSystemKinds.d.ts","sourceRoot":"","sources":["../../src/hooks/useSystemKinds.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAGL,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAI3D;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,oGA4BxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CAEjD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhE"}
@@ -1,21 +1,3 @@
1
- /**
2
- * `useFeatureOff` — the PROACTIVE read of a DB-backed feature's OFF state, off the
3
- * system kind-status table (`GET /api/system/kinds`), fetched once per auth flip and
4
- * held as SDK state.
5
- *
6
- * A deployment leaves a database-backed feature cleanly OFF by configuring no store
7
- * for it; the kind-status table then reports that kind's `state` as `off` (rather
8
- * than `active` / `default`). A write affordance for an OFF feature reads this and
9
- * hides itself BEFORE the user acts, instead of learning OFF only from a write's 501
10
- * refusal — the reactive `isFeatureDisabled` swallow stays as the backstop for a
11
- * stale table.
12
- *
13
- * A PLAIN fetch state machine (`loading` / `ready` / `failed`), NOT TanStack Query:
14
- * the SDK is the shared leaf across the plugin boundary and holds no query context,
15
- * exactly as `useCapabilities` does. It is DELIBERATELY non-blocking — a kind counts
16
- * as not-off until the table is `ready`, and a failed fetch leaves every kind not-off
17
- * so the surface falls back to its reactive 501 handling, never a hard-failed page.
18
- */
19
1
  import { createContext, createElement, useContext, useEffect, useState, } from 'react';
20
2
  import { useApi } from './useApi';
21
3
  import { useAuth } from './useAuth';
@@ -1 +1 @@
1
- {"version":3,"file":"useSystemKinds.js","sourceRoot":"","sources":["../../src/hooks/useSystemKinds.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSystemKinds.js","sourceRoot":"","sources":["../../src/hooks/useSystemKinds.tsx"],"names":[],"mappings":"AAmBA,OAAO,EACL,aAAa,EACb,aAAa,EAEb,UAAU,EACV,SAAS,EACT,QAAQ,GACT,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,kBAAkB,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAA2B;IACvE,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAE5E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,+EAA+E;YAC/E,uEAAuE;YACvE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CACxC,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3B,OAAO,aAAa,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACtF,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -1,3 +1,18 @@
1
+ /**
2
+ * `useTheme` — light/dark theme, token-driven. The active theme stamps
3
+ * `data-theme` on the document root, which the DS token layers key off.
4
+ *
5
+ * A three-state PREFERENCE sits behind the resolved theme: `'light'` and
6
+ * `'dark'` pin it, `'system'` follows `prefers-color-scheme` and tracks OS
7
+ * changes live. The resolved `theme` a consumer reads is always the concrete
8
+ * `'light' | 'dark'` the tokens need — never `'system'`.
9
+ *
10
+ * The preference persists to `localStorage`, but ONLY when the operator sets it
11
+ * explicitly (`setPreference` / `setTheme` / `toggle`). Boot READS the stored
12
+ * value; it never WRITES one, so a session that only ever renders the app leaves
13
+ * storage untouched. A `'system'` preference clears any pinned choice and hands
14
+ * the theme back to the OS.
15
+ */
1
16
  import type { ReactNode } from 'react';
2
17
  export type Theme = 'light' | 'dark';
3
18
  export type ThemePreference = 'light' | 'dark' | 'system';
@@ -1 +1 @@
1
- {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9D,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B;AA4BD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,8FA0DlE;AAED,wBAAgB,QAAQ,IAAI,UAAU,CAIrC"}
1
+ {"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useTheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9D,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B;AA4BD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,8FA0DlE;AAED,wBAAgB,QAAQ,IAAI,UAAU,CAIrC"}