@tai42/studio-sdk 16.0.0 → 16.0.1

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 (317) hide show
  1. package/dist/components/explorer-body.d.ts +49 -0
  2. package/dist/components/explorer-body.d.ts.map +1 -0
  3. package/dist/components/explorer-body.js +67 -0
  4. package/dist/components/explorer-body.js.map +1 -0
  5. package/dist/components/explorer-page-size.d.ts +4 -0
  6. package/dist/components/explorer-page-size.d.ts.map +1 -0
  7. package/dist/components/explorer-page-size.js +36 -0
  8. package/dist/components/explorer-page-size.js.map +1 -0
  9. package/dist/components/explorer-tag-filter.d.ts +17 -0
  10. package/dist/components/explorer-tag-filter.d.ts.map +1 -0
  11. package/dist/components/explorer-tag-filter.js +29 -0
  12. package/dist/components/explorer-tag-filter.js.map +1 -0
  13. package/dist/components/explorer-tags.d.ts +22 -0
  14. package/dist/components/explorer-tags.d.ts.map +1 -0
  15. package/dist/components/explorer-tags.js +51 -0
  16. package/dist/components/explorer-tags.js.map +1 -0
  17. package/dist/components/explorer-view.d.ts +3 -17
  18. package/dist/components/explorer-view.d.ts.map +1 -1
  19. package/dist/components/explorer-view.js +53 -170
  20. package/dist/components/explorer-view.js.map +1 -1
  21. package/dist/components/extension-combo-builder.d.ts +0 -5
  22. package/dist/components/extension-combo-builder.d.ts.map +1 -1
  23. package/dist/components/extension-combo-builder.js +4 -42
  24. package/dist/components/extension-combo-builder.js.map +1 -1
  25. package/dist/components/extension-combo-parts.d.ts +44 -0
  26. package/dist/components/extension-combo-parts.d.ts.map +1 -0
  27. package/dist/components/extension-combo-parts.js +57 -0
  28. package/dist/components/extension-combo-parts.js.map +1 -0
  29. package/dist/components/fleet-report.d.ts.map +1 -1
  30. package/dist/components/fleet-report.js +51 -37
  31. package/dist/components/fleet-report.js.map +1 -1
  32. package/dist/components/icons/chrome-marks.d.ts +50 -0
  33. package/dist/components/icons/chrome-marks.d.ts.map +1 -0
  34. package/dist/components/icons/chrome-marks.js +51 -0
  35. package/dist/components/icons/chrome-marks.js.map +1 -0
  36. package/dist/components/icons/icon-frame.d.ts +29 -0
  37. package/dist/components/icons/icon-frame.d.ts.map +1 -0
  38. package/dist/components/icons/icon-frame.js +19 -0
  39. package/dist/components/icons/icon-frame.js.map +1 -0
  40. package/dist/components/icons/index.d.ts +40 -0
  41. package/dist/components/icons/index.d.ts.map +1 -0
  42. package/dist/components/icons/index.js +6 -0
  43. package/dist/components/icons/index.js.map +1 -0
  44. package/dist/components/icons/nav-map.d.ts +14 -0
  45. package/dist/components/icons/nav-map.d.ts.map +1 -0
  46. package/dist/components/icons/nav-map.js +28 -0
  47. package/dist/components/icons/nav-map.js.map +1 -0
  48. package/dist/components/icons/nav-marks.d.ts +44 -0
  49. package/dist/components/icons/nav-marks.d.ts.map +1 -0
  50. package/dist/components/icons/nav-marks.js +45 -0
  51. package/dist/components/icons/nav-marks.js.map +1 -0
  52. package/dist/components/icons/status-marks.d.ts +21 -0
  53. package/dist/components/icons/status-marks.d.ts.map +1 -0
  54. package/dist/components/icons/status-marks.js +22 -0
  55. package/dist/components/icons/status-marks.js.map +1 -0
  56. package/dist/components/icons/theme-marks.d.ts +9 -0
  57. package/dist/components/icons/theme-marks.d.ts.map +1 -0
  58. package/dist/components/icons/theme-marks.js +10 -0
  59. package/dist/components/icons/theme-marks.js.map +1 -0
  60. package/dist/components/json-diff.d.ts.map +1 -1
  61. package/dist/components/json-diff.js +1 -3
  62. package/dist/components/json-diff.js.map +1 -1
  63. package/dist/components/json-tree-context.d.ts +13 -0
  64. package/dist/components/json-tree-context.d.ts.map +1 -0
  65. package/dist/components/json-tree-context.js +15 -0
  66. package/dist/components/json-tree-context.js.map +1 -0
  67. package/dist/components/json-tree-model.d.ts +56 -0
  68. package/dist/components/json-tree-model.d.ts.map +1 -0
  69. package/dist/components/json-tree-model.js +125 -0
  70. package/dist/components/json-tree-model.js.map +1 -0
  71. package/dist/components/json-tree-nodes.d.ts +30 -0
  72. package/dist/components/json-tree-nodes.d.ts.map +1 -0
  73. package/dist/components/json-tree-nodes.js +118 -0
  74. package/dist/components/json-tree-nodes.js.map +1 -0
  75. package/dist/components/json-tree.d.ts.map +1 -1
  76. package/dist/components/json-tree.js +7 -295
  77. package/dist/components/json-tree.js.map +1 -1
  78. package/dist/components/json-value-format.d.ts +20 -0
  79. package/dist/components/json-value-format.d.ts.map +1 -0
  80. package/dist/components/json-value-format.js +63 -0
  81. package/dist/components/json-value-format.js.map +1 -0
  82. package/dist/components/markdown-blocks.d.ts +38 -0
  83. package/dist/components/markdown-blocks.d.ts.map +1 -0
  84. package/dist/components/markdown-blocks.js +168 -0
  85. package/dist/components/markdown-blocks.js.map +1 -0
  86. package/dist/components/markdown-inline.d.ts +24 -0
  87. package/dist/components/markdown-inline.d.ts.map +1 -0
  88. package/dist/components/markdown-inline.js +257 -0
  89. package/dist/components/markdown-inline.js.map +1 -0
  90. package/dist/components/markdown.d.ts +3 -52
  91. package/dist/components/markdown.d.ts.map +1 -1
  92. package/dist/components/markdown.js +4 -376
  93. package/dist/components/markdown.js.map +1 -1
  94. package/dist/components/observer-registry.d.ts +38 -0
  95. package/dist/components/observer-registry.d.ts.map +1 -0
  96. package/dist/components/observer-registry.js +131 -0
  97. package/dist/components/observer-registry.js.map +1 -0
  98. package/dist/components/overflow-measure.d.ts +38 -0
  99. package/dist/components/overflow-measure.d.ts.map +1 -0
  100. package/dist/components/overflow-measure.js +54 -0
  101. package/dist/components/overflow-measure.js.map +1 -0
  102. package/dist/components/prose-regions.d.ts +81 -0
  103. package/dist/components/prose-regions.d.ts.map +1 -0
  104. package/dist/components/prose-regions.js +128 -0
  105. package/dist/components/prose-regions.js.map +1 -0
  106. package/dist/components/scroll-region.d.ts.map +1 -1
  107. package/dist/components/scroll-region.js +3 -298
  108. package/dist/components/scroll-region.js.map +1 -1
  109. package/dist/components/tab-stop-parse.d.ts +53 -0
  110. package/dist/components/tab-stop-parse.d.ts.map +1 -0
  111. package/dist/components/tab-stop-parse.js +202 -0
  112. package/dist/components/tab-stop-parse.js.map +1 -0
  113. package/dist/components/templated-text-field.d.ts.map +1 -1
  114. package/dist/components/templated-text-field.js +10 -148
  115. package/dist/components/templated-text-field.js.map +1 -1
  116. package/dist/components/templated-text-kwargs-editor.d.ts +24 -0
  117. package/dist/components/templated-text-kwargs-editor.d.ts.map +1 -0
  118. package/dist/components/templated-text-kwargs-editor.js +48 -0
  119. package/dist/components/templated-text-kwargs-editor.js.map +1 -0
  120. package/dist/components/templated-text-kwargs.d.ts +37 -0
  121. package/dist/components/templated-text-kwargs.d.ts.map +1 -0
  122. package/dist/components/templated-text-kwargs.js +66 -0
  123. package/dist/components/templated-text-kwargs.js.map +1 -0
  124. package/dist/components/templated-text-source.d.ts +33 -0
  125. package/dist/components/templated-text-source.d.ts.map +1 -0
  126. package/dist/components/templated-text-source.js +53 -0
  127. package/dist/components/templated-text-source.js.map +1 -0
  128. package/dist/components/tool-picker-parts.d.ts +39 -0
  129. package/dist/components/tool-picker-parts.d.ts.map +1 -0
  130. package/dist/components/tool-picker-parts.js +87 -0
  131. package/dist/components/tool-picker-parts.js.map +1 -0
  132. package/dist/components/tool-picker.d.ts +1 -2
  133. package/dist/components/tool-picker.d.ts.map +1 -1
  134. package/dist/components/tool-picker.js +4 -66
  135. package/dist/components/tool-picker.js.map +1 -1
  136. package/dist/components/version-history-panel.d.ts.map +1 -1
  137. package/dist/components/version-history-panel.js +7 -34
  138. package/dist/components/version-history-panel.js.map +1 -1
  139. package/dist/components/version-history-rows.d.ts +48 -0
  140. package/dist/components/version-history-rows.d.ts.map +1 -0
  141. package/dist/components/version-history-rows.js +51 -0
  142. package/dist/components/version-history-rows.js.map +1 -0
  143. package/dist/guards.d.ts +6 -0
  144. package/dist/guards.d.ts.map +1 -0
  145. package/dist/guards.js +8 -0
  146. package/dist/guards.js.map +1 -0
  147. package/dist/hooks/interactions-connection.d.ts +43 -0
  148. package/dist/hooks/interactions-connection.d.ts.map +1 -0
  149. package/dist/hooks/interactions-connection.js +171 -0
  150. package/dist/hooks/interactions-connection.js.map +1 -0
  151. package/dist/hooks/interactions-stream.d.ts +80 -0
  152. package/dist/hooks/interactions-stream.d.ts.map +1 -0
  153. package/dist/hooks/interactions-stream.js +233 -0
  154. package/dist/hooks/interactions-stream.js.map +1 -0
  155. package/dist/hooks/useApi.d.ts +2192 -2192
  156. package/dist/hooks/useApi.d.ts.map +1 -1
  157. package/dist/hooks/useSse.d.ts +3 -6
  158. package/dist/hooks/useSse.d.ts.map +1 -1
  159. package/dist/hooks/useSse.js +38 -451
  160. package/dist/hooks/useSse.js.map +1 -1
  161. package/dist/navigation/app-link.d.ts +25 -0
  162. package/dist/navigation/app-link.d.ts.map +1 -0
  163. package/dist/navigation/app-link.js +33 -0
  164. package/dist/navigation/app-link.js.map +1 -0
  165. package/dist/navigation/context.d.ts +3 -20
  166. package/dist/navigation/context.d.ts.map +1 -1
  167. package/dist/navigation/context.js +7 -267
  168. package/dist/navigation/context.js.map +1 -1
  169. package/dist/navigation/entry-state.d.ts +23 -0
  170. package/dist/navigation/entry-state.d.ts.map +1 -0
  171. package/dist/navigation/entry-state.js +39 -0
  172. package/dist/navigation/entry-state.js.map +1 -0
  173. package/dist/navigation/guard-registry.d.ts +30 -0
  174. package/dist/navigation/guard-registry.d.ts.map +1 -0
  175. package/dist/navigation/guard-registry.js +46 -0
  176. package/dist/navigation/guard-registry.js.map +1 -0
  177. package/dist/navigation/guarded-navigation.d.ts +24 -0
  178. package/dist/navigation/guarded-navigation.d.ts.map +1 -0
  179. package/dist/navigation/guarded-navigation.js +102 -0
  180. package/dist/navigation/guarded-navigation.js.map +1 -0
  181. package/dist/navigation/index.d.ts +3 -2
  182. package/dist/navigation/index.d.ts.map +1 -1
  183. package/dist/navigation/index.js +2 -1
  184. package/dist/navigation/index.js.map +1 -1
  185. package/dist/navigation/types.d.ts +8 -11
  186. package/dist/navigation/types.d.ts.map +1 -1
  187. package/dist/navigation/use-back-forward-guard.d.ts +5 -0
  188. package/dist/navigation/use-back-forward-guard.d.ts.map +1 -0
  189. package/dist/navigation/use-back-forward-guard.js +82 -0
  190. package/dist/navigation/use-back-forward-guard.js.map +1 -0
  191. package/dist/plugin/registry.d.ts +6 -15
  192. package/dist/plugin/registry.d.ts.map +1 -1
  193. package/dist/plugin/registry.js +83 -75
  194. package/dist/plugin/registry.js.map +1 -1
  195. package/dist/schema-form/SecretRefField.d.ts +2 -3
  196. package/dist/schema-form/SecretRefField.d.ts.map +1 -1
  197. package/dist/schema-form/SecretRefField.js +23 -12
  198. package/dist/schema-form/SecretRefField.js.map +1 -1
  199. package/dist/schema-form/classify.d.ts +1 -122
  200. package/dist/schema-form/classify.d.ts.map +1 -1
  201. package/dist/schema-form/classify.js +174 -237
  202. package/dist/schema-form/classify.js.map +1 -1
  203. package/dist/schema-form/default-value.d.ts.map +1 -1
  204. package/dist/schema-form/default-value.js +42 -19
  205. package/dist/schema-form/default-value.js.map +1 -1
  206. package/dist/schema-form/enum-field.d.ts +1 -1
  207. package/dist/schema-form/enum-field.d.ts.map +1 -1
  208. package/dist/schema-form/field-model.d.ts +121 -0
  209. package/dist/schema-form/field-model.d.ts.map +1 -0
  210. package/dist/schema-form/field-model.js +2 -0
  211. package/dist/schema-form/field-model.js.map +1 -0
  212. package/dist/schema-form/field-node.d.ts.map +1 -1
  213. package/dist/schema-form/field-node.js +25 -14
  214. package/dist/schema-form/field-node.js.map +1 -1
  215. package/dist/schema-form/media-field.d.ts +1 -1
  216. package/dist/schema-form/media-field.d.ts.map +1 -1
  217. package/dist/schema-form/media-field.js +47 -28
  218. package/dist/schema-form/media-field.js.map +1 -1
  219. package/dist/schema-form/string-annotations.d.ts +20 -0
  220. package/dist/schema-form/string-annotations.d.ts.map +1 -0
  221. package/dist/schema-form/string-annotations.js +105 -0
  222. package/dist/schema-form/string-annotations.js.map +1 -0
  223. package/dist/schema-form/string-field.d.ts +1 -1
  224. package/dist/schema-form/string-field.d.ts.map +1 -1
  225. package/dist/schema-form/union-field.d.ts +1 -1
  226. package/dist/schema-form/union-field.d.ts.map +1 -1
  227. package/dist/schema-form/union-field.js.map +1 -1
  228. package/dist/schema-form/union.d.ts +1 -1
  229. package/dist/schema-form/union.d.ts.map +1 -1
  230. package/dist/schema-form/validate.d.ts.map +1 -1
  231. package/dist/schema-form/validate.js +126 -105
  232. package/dist/schema-form/validate.js.map +1 -1
  233. package/dist/state-binding/AdapterMapping.d.ts.map +1 -1
  234. package/dist/state-binding/AdapterMapping.js +0 -0
  235. package/dist/state-binding/AdapterMapping.js.map +1 -1
  236. package/dist/state-binding/StateAttachRow.d.ts.map +1 -1
  237. package/dist/state-binding/StateAttachRow.js +52 -36
  238. package/dist/state-binding/StateAttachRow.js.map +1 -1
  239. package/dist/state-binding/adapter-mapping-row.d.ts +17 -0
  240. package/dist/state-binding/adapter-mapping-row.d.ts.map +1 -0
  241. package/dist/state-binding/adapter-mapping-row.js +87 -0
  242. package/dist/state-binding/adapter-mapping-row.js.map +1 -0
  243. package/dist/structured-output/StructuredOutput.d.ts.map +1 -1
  244. package/dist/structured-output/StructuredOutput.js +1 -3
  245. package/dist/structured-output/StructuredOutput.js.map +1 -1
  246. package/package.json +2 -2
  247. package/src/components/explorer-body.tsx +239 -0
  248. package/src/components/explorer-page-size.ts +39 -0
  249. package/src/components/explorer-tag-filter.tsx +80 -0
  250. package/src/components/explorer-tags.ts +64 -0
  251. package/src/components/explorer-view.tsx +114 -366
  252. package/src/components/extension-combo-builder.tsx +35 -152
  253. package/src/components/extension-combo-parts.tsx +237 -0
  254. package/src/components/fleet-report.tsx +97 -54
  255. package/src/components/icons/chrome-marks.tsx +195 -0
  256. package/src/components/icons/icon-frame.tsx +50 -0
  257. package/src/components/icons/index.ts +84 -0
  258. package/src/components/icons/nav-map.ts +55 -0
  259. package/src/components/icons/nav-marks.tsx +205 -0
  260. package/src/components/icons/status-marks.tsx +46 -0
  261. package/src/components/icons/theme-marks.tsx +33 -0
  262. package/src/components/json-diff.tsx +1 -4
  263. package/src/components/json-tree-context.ts +26 -0
  264. package/src/components/json-tree-model.ts +139 -0
  265. package/src/components/json-tree-nodes.tsx +224 -0
  266. package/src/components/json-tree.tsx +15 -434
  267. package/src/components/json-value-format.ts +64 -0
  268. package/src/components/markdown-blocks.ts +198 -0
  269. package/src/components/markdown-inline.tsx +365 -0
  270. package/src/components/markdown.tsx +5 -471
  271. package/src/components/observer-registry.ts +139 -0
  272. package/src/components/overflow-measure.ts +69 -0
  273. package/src/components/prose-regions.ts +153 -0
  274. package/src/components/scroll-region.tsx +20 -360
  275. package/src/components/tab-stop-parse.ts +217 -0
  276. package/src/components/templated-text-field.tsx +38 -330
  277. package/src/components/templated-text-kwargs-editor.tsx +147 -0
  278. package/src/components/templated-text-kwargs.ts +92 -0
  279. package/src/components/templated-text-source.tsx +226 -0
  280. package/src/components/tool-picker-parts.tsx +184 -0
  281. package/src/components/tool-picker.tsx +22 -114
  282. package/src/components/version-history-panel.tsx +38 -142
  283. package/src/components/version-history-rows.tsx +220 -0
  284. package/src/guards.ts +7 -0
  285. package/src/hooks/interactions-connection.ts +227 -0
  286. package/src/hooks/interactions-stream.ts +274 -0
  287. package/src/hooks/useSse.ts +50 -477
  288. package/src/navigation/app-link.tsx +70 -0
  289. package/src/navigation/context.tsx +11 -330
  290. package/src/navigation/entry-state.ts +42 -0
  291. package/src/navigation/guard-registry.ts +65 -0
  292. package/src/navigation/guarded-navigation.ts +147 -0
  293. package/src/navigation/index.ts +2 -2
  294. package/src/navigation/types.ts +8 -11
  295. package/src/navigation/use-back-forward-guard.ts +90 -0
  296. package/src/plugin/registry.ts +111 -90
  297. package/src/schema-form/SecretRefField.tsx +121 -71
  298. package/src/schema-form/classify.ts +244 -395
  299. package/src/schema-form/default-value.ts +48 -17
  300. package/src/schema-form/enum-field.tsx +1 -1
  301. package/src/schema-form/field-model.ts +133 -0
  302. package/src/schema-form/field-node.tsx +94 -38
  303. package/src/schema-form/media-field.tsx +134 -65
  304. package/src/schema-form/string-annotations.ts +111 -0
  305. package/src/schema-form/string-field.tsx +1 -1
  306. package/src/schema-form/union-field.tsx +2 -1
  307. package/src/schema-form/union.ts +1 -1
  308. package/src/schema-form/validate.ts +184 -103
  309. package/src/state-binding/AdapterMapping.tsx +0 -0
  310. package/src/state-binding/StateAttachRow.tsx +222 -147
  311. package/src/state-binding/adapter-mapping-row.tsx +232 -0
  312. package/src/structured-output/StructuredOutput.tsx +1 -4
  313. package/dist/components/icons.d.ts +0 -160
  314. package/dist/components/icons.d.ts.map +0 -1
  315. package/dist/components/icons.js +0 -160
  316. package/dist/components/icons.js.map +0 -1
  317. package/src/components/icons.tsx +0 -586
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The render-kwargs model behind `TemplatedTextField`: the row shape, the
3
+ * round-trip between stored kwargs and editable rows, and the normalized
4
+ * `TemplatedText` value the field emits. Pure — no React.
5
+ */
6
+ import type { TemplatedText } from '@tai42/api-client';
7
+ /** Whether the value's source is inline authored text or a stored template id. */
8
+ export type Mode = 'inline' | 'stored';
9
+ export interface KwargRow {
10
+ readonly key: string;
11
+ readonly value: string;
12
+ /**
13
+ * The stored value this row was seeded from, kept so an UNTOUCHED row re-emits it
14
+ * BYTE-FOR-BYTE: the row form cannot tell a stored string `"7"` from the number `7`,
15
+ * so re-parsing an untouched row would silently coerce the stored type. `undefined`
16
+ * for a row the author added.
17
+ */
18
+ readonly original?: unknown;
19
+ }
20
+ /** The row's canonical string form, matched against `value` to detect an untouched row. */
21
+ export declare function stringifyRowValue(raw: unknown): string;
22
+ /** Parse a cell as JSON when it can be (numbers/bools/objects), else keep the string. */
23
+ export declare function parseCellValue(raw: string): unknown;
24
+ /** Collapse the kwargs rows into an object, dropping rows with a blank key. */
25
+ export declare function rowsToObject(rows: readonly KwargRow[]): Record<string, unknown>;
26
+ /** Seed rows from a stored kwargs object (stringifying non-string values). */
27
+ export declare function objectToRows(kwargs: Record<string, unknown> | undefined): KwargRow[];
28
+ /** The initial mode: stored when the seed carries an `id`, inline otherwise. */
29
+ export declare function initialMode(value: TemplatedText | null): Mode;
30
+ /**
31
+ * The normalized value for a given source/mode and kwargs. The two sources are
32
+ * mutually exclusive by construction (`content` XOR `id`); an empty source emits
33
+ * `null` unless `required`, in which case an empty source is emitted so the
34
+ * schema guard refuses the save.
35
+ */
36
+ export declare function templatedValueFrom(mode: Mode, inline: string, stored: string, rows: readonly KwargRow[], required: boolean): TemplatedText | null;
37
+ //# sourceMappingURL=templated-text-kwargs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated-text-kwargs.d.ts","sourceRoot":"","sources":["../../src/components/templated-text-kwargs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,kFAAkF;AAClF,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa/E;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,QAAQ,EAAE,CAOpF;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,QAAQ,EAAE,EACzB,QAAQ,EAAE,OAAO,GAChB,aAAa,GAAG,IAAI,CAUtB"}
@@ -0,0 +1,66 @@
1
+ /** The row's canonical string form, matched against `value` to detect an untouched row. */
2
+ export function stringifyRowValue(raw) {
3
+ return typeof raw === 'string' ? raw : JSON.stringify(raw);
4
+ }
5
+ /** Parse a cell as JSON when it can be (numbers/bools/objects), else keep the string. */
6
+ export function parseCellValue(raw) {
7
+ const trimmed = raw.trim();
8
+ if (trimmed.length === 0)
9
+ return '';
10
+ try {
11
+ return JSON.parse(trimmed);
12
+ }
13
+ catch {
14
+ return raw;
15
+ }
16
+ }
17
+ /** Collapse the kwargs rows into an object, dropping rows with a blank key. */
18
+ export function rowsToObject(rows) {
19
+ const out = {};
20
+ for (const row of rows) {
21
+ const key = row.key.trim();
22
+ if (key.length === 0)
23
+ continue;
24
+ // An untouched seeded row re-emits its stored value verbatim (no JSON-type coerce);
25
+ // an edited or added row is parsed from the cell text.
26
+ out[key] =
27
+ row.original !== undefined && stringifyRowValue(row.original) === row.value
28
+ ? row.original
29
+ : parseCellValue(row.value);
30
+ }
31
+ return out;
32
+ }
33
+ /** Seed rows from a stored kwargs object (stringifying non-string values). */
34
+ export function objectToRows(kwargs) {
35
+ if (kwargs === undefined)
36
+ return [];
37
+ return Object.entries(kwargs).map(([key, raw]) => ({
38
+ key,
39
+ value: stringifyRowValue(raw),
40
+ original: raw,
41
+ }));
42
+ }
43
+ /** The initial mode: stored when the seed carries an `id`, inline otherwise. */
44
+ export function initialMode(value) {
45
+ return value?.id !== undefined ? 'stored' : 'inline';
46
+ }
47
+ /**
48
+ * The normalized value for a given source/mode and kwargs. The two sources are
49
+ * mutually exclusive by construction (`content` XOR `id`); an empty source emits
50
+ * `null` unless `required`, in which case an empty source is emitted so the
51
+ * schema guard refuses the save.
52
+ */
53
+ export function templatedValueFrom(mode, inline, stored, rows, required) {
54
+ const kwargs = rowsToObject(rows);
55
+ const kw = Object.keys(kwargs).length > 0 ? { kwargs } : {};
56
+ if (mode === 'stored') {
57
+ const id = stored.trim();
58
+ if (id === '')
59
+ return required ? { id: '', ...kw } : null;
60
+ return { id, ...kw };
61
+ }
62
+ if (inline.trim() === '')
63
+ return required ? { content: '', ...kw } : null;
64
+ return { content: inline, ...kw };
65
+ }
66
+ //# sourceMappingURL=templated-text-kwargs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated-text-kwargs.js","sourceRoot":"","sources":["../../src/components/templated-text-kwargs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The source region of `TemplatedTextField`: the inline/stored toggle and its
3
+ * editors while storage is present, a stand-in while presence is unknown, and the
4
+ * read-only stored reference (never converted, dropped, or blanked) when storage
5
+ * is absent.
6
+ */
7
+ import type { ReactNode } from 'react';
8
+ import type { Mode } from './templated-text-kwargs';
9
+ import type { TemplatedTextInlineProps, TemplatedTextTemplateOption } from './templated-text-field';
10
+ export interface TemplatedTextSourceProps {
11
+ readonly label: string;
12
+ readonly mode: Mode;
13
+ readonly inlineDraft: string;
14
+ readonly storedDraft: string;
15
+ readonly error?: string;
16
+ readonly disabled: boolean;
17
+ readonly placeholder?: string;
18
+ readonly renderInline?: (props: TemplatedTextInlineProps) => ReactNode;
19
+ readonly templates: readonly TemplatedTextTemplateOption[];
20
+ readonly templatesLoading: boolean;
21
+ readonly templatesError?: string;
22
+ readonly onTemplatesRetry?: () => void;
23
+ readonly resolveError?: string;
24
+ readonly storageAbsent: boolean;
25
+ readonly storagePresenceLoading: boolean;
26
+ /** The `id` already authored on the value, shown read-only when storage is absent. */
27
+ readonly authoredStoredId?: string;
28
+ readonly onModeChange: (mode: Mode) => void;
29
+ readonly onInlineChange: (value: string) => void;
30
+ readonly onStoredChange: (stored: string) => void;
31
+ }
32
+ export declare function TemplatedTextSource({ label, mode, inlineDraft, storedDraft, error, disabled, placeholder, renderInline, templates, templatesLoading, templatesError, onTemplatesRetry, resolveError, storageAbsent, storagePresenceLoading, authoredStoredId, onModeChange, onInlineChange, onStoredChange, }: TemplatedTextSourceProps): ReactNode;
33
+ //# sourceMappingURL=templated-text-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated-text-source.d.ts","sourceRoot":"","sources":["../../src/components/templated-text-source.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAsGpG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IACvE,QAAQ,CAAC,SAAS,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,sFAAsF;IACtF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,IAAI,EACJ,WAAW,EACX,WAAW,EACX,KAAK,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,GACf,EAAE,wBAAwB,GAAG,SAAS,CAkEtC"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { ErrorState, Skeleton } from './primitives';
3
+ import { Field } from './field';
4
+ import { RadioGroup } from './radio-group';
5
+ import { Select } from './select';
6
+ import { Textarea } from './inputs';
7
+ /** A labeled read-only reference to a stored template id, plus the note that
8
+ * stored templates are unavailable here — NOT an editable field. */
9
+ function ReadOnlyStoredReference({ id }) {
10
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 'var(--tai-space-1)' }, children: [_jsx("span", { style: { fontSize: 'var(--tai-text-sm)', color: 'var(--tai-color-text-muted)' }, children: "Stored template" }), _jsx("code", { style: { fontFamily: 'var(--tai-font-mono)', wordBreak: 'break-all' }, children: id })] }), _jsx("p", { style: { margin: 0, fontSize: 'var(--tai-text-sm)', color: 'var(--tai-color-text-muted)' }, children: "Stored templates are unavailable \u2014 this deployment has no storage backend." })] }));
11
+ }
12
+ /** The inline/stored toggle, the mode's editor, and the unresolved-id note, for
13
+ * the storage-present configuration. */
14
+ function PresentStorageSource({ label, mode, disabled, inlineEditor, error, storedDraft, templates, templateOptions, templatesLoading, templatesError, onTemplatesRetry, unresolvedId, resolveError, onModeChange, onStoredChange, }) {
15
+ return (_jsxs(_Fragment, { children: [_jsx(RadioGroup, { "aria-label": `${label} source`, variant: "segmented", value: mode, disabled: disabled, options: [
16
+ { value: 'inline', label: 'Inline text' },
17
+ { value: 'stored', label: 'Stored template' },
18
+ ], onValueChange: (next) => {
19
+ onModeChange(next);
20
+ } }), mode === 'inline' ? (inlineEditor) : templatesError !== undefined ? (_jsx(ErrorState, { message: templatesError, onRetry: onTemplatesRetry })) : templatesLoading ? (_jsx(Skeleton, { height: 36 })) : (_jsx(Field, { label: label, hideLabel: true, error: error, children: _jsx(Select, { placeholder: templates.length === 0 ? 'No templates available' : 'Select a template', value: storedDraft, disabled: disabled || templates.length === 0, options: templateOptions, onValueChange: onStoredChange }) })), unresolvedId !== undefined ? (_jsx("p", { role: "alert", style: { margin: 0, color: 'var(--tai-color-err-text)' }, children: resolveError ?? `The stored template "${unresolvedId}" is not available.` })) : null] }));
21
+ }
22
+ export function TemplatedTextSource({ label, mode, inlineDraft, storedDraft, error, disabled, placeholder, renderInline, templates, templatesLoading, templatesError, onTemplatesRetry, resolveError, storageAbsent, storagePresenceLoading, authoredStoredId, onModeChange, onInlineChange, onStoredChange, }) {
23
+ const templateOptions = templates.map((template) => ({
24
+ value: template.id,
25
+ label: template.label ?? template.id,
26
+ }));
27
+ // A stored id the catalog does not offer cannot be picked from the list; it is
28
+ // shown as an unresolved note rather than silently blanked.
29
+ const unresolvedId = mode === 'stored' &&
30
+ storedDraft.trim() !== '' &&
31
+ !templatesLoading &&
32
+ templatesError === undefined &&
33
+ !templates.some((template) => template.id === storedDraft.trim())
34
+ ? storedDraft.trim()
35
+ : undefined;
36
+ // The inline editor, shared by the present-storage inline mode and the
37
+ // absent-storage inline-only rendering: the caller's rich editor when supplied,
38
+ // else a plain textarea.
39
+ const inlineEditor = renderInline !== undefined ? (renderInline({ label, value: inlineDraft, onChange: onInlineChange, error, hideLabel: true })) : (_jsx(Field, { label: label, hideLabel: true, error: error, children: _jsx(Textarea, { value: inlineDraft, placeholder: placeholder, disabled: disabled, onChange: (event) => {
40
+ onInlineChange(event.target.value);
41
+ } }) }));
42
+ // While presence is unknown a placeholder stands in, so the toggle is never
43
+ // shown and then removed. With storage absent the stored source cannot work and
44
+ // is not offered: an inline or empty value edits inline; a value carrying an
45
+ // `id` is shown read-only. With storage present the full toggle and picker render.
46
+ if (storagePresenceLoading)
47
+ return _jsx(Skeleton, { height: 36 });
48
+ if (storageAbsent) {
49
+ return authoredStoredId !== undefined ? (_jsx(ReadOnlyStoredReference, { id: authoredStoredId })) : (inlineEditor);
50
+ }
51
+ return (_jsx(PresentStorageSource, { label: label, mode: mode, disabled: disabled, inlineEditor: inlineEditor, error: error, storedDraft: storedDraft, templates: templates, templateOptions: templateOptions, templatesLoading: templatesLoading, templatesError: templatesError, onTemplatesRetry: onTemplatesRetry, unresolvedId: unresolvedId, resolveError: resolveError, onModeChange: onModeChange, onStoredChange: onStoredChange }));
52
+ }
53
+ //# sourceMappingURL=templated-text-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated-text-source.js","sourceRoot":"","sources":["../../src/components/templated-text-source.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The pieces of `ToolPicker`: the tool `Select` itself (grouped or flat), the tag
3
+ * filter field, and the selected tool's capability badges. The picker owns the
4
+ * state and composes these; the option-label and grouping helpers live here too.
5
+ */
6
+ import type { ReactNode } from 'react';
7
+ /** The shared informational note every badge surface carries: declared, never enforced. */
8
+ export declare const BADGES_NOTE = "Declared capability labels \u2014 informational only. They describe what the tool touches; the server never enforces them.";
9
+ export declare const ALL_TAGS = "__all_tags__";
10
+ interface ToolSelectProps {
11
+ readonly tagsByTool: Readonly<Record<string, readonly string[]>> | undefined;
12
+ readonly filtered: readonly string[];
13
+ readonly value: string | null;
14
+ readonly onChange: (toolName: string) => void;
15
+ readonly placeholder: string;
16
+ readonly ariaLabel: string | undefined;
17
+ readonly disabled: boolean | undefined;
18
+ readonly displayNames: Readonly<Record<string, string>> | undefined;
19
+ readonly agentToolNames: ReadonlySet<string> | undefined;
20
+ }
21
+ /** The tool select: grouped by tag when `tagsByTool` is present, else a flat list.
22
+ * Either branch is a `Select`, which claims the enclosing `Field`'s control id. */
23
+ export declare function ToolSelect({ tagsByTool, filtered, value, onChange, placeholder, ariaLabel, disabled, displayNames, agentToolNames, }: ToolSelectProps): ReactNode;
24
+ /** The tag filter: an "All tags" sentinel plus one option per distinct tag. */
25
+ export declare function TagFilterField({ allTags, tagFilter, onTagFilterChange, disabled, }: {
26
+ readonly allTags: readonly string[];
27
+ readonly tagFilter: string;
28
+ readonly onTagFilterChange: (value: string) => void;
29
+ readonly disabled: boolean | undefined;
30
+ }): ReactNode;
31
+ /** The selected tool's DECLARED capability badges, read-only and informational.
32
+ * Renders nothing unless the selected tool carries badges. */
33
+ export declare function SelectedToolBadges({ value, badgesByTool, idPrefix, }: {
34
+ readonly value: string | null;
35
+ readonly badgesByTool: Readonly<Record<string, readonly string[]>> | undefined;
36
+ readonly idPrefix: string;
37
+ }): ReactNode;
38
+ export {};
39
+ //# sourceMappingURL=tool-picker-parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-picker-parts.d.ts","sourceRoot":"","sources":["../../src/components/tool-picker-parts.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,2FAA2F;AAC3F,eAAO,MAAM,WAAW,+HACiG,CAAC;AAO1H,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AAkDvC,UAAU,eAAe;IACvB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IAC7E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;CAC1D;AAED;oFACoF;AACpF,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,cAAc,GACf,EAAE,eAAe,GAAG,SAAS,CA6B7B;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,GAAG,SAAS,CAcZ;AAED;+DAC+D;AAC/D,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,SAAS,CAmBZ"}
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { toolDisplayLabel } from '../hooks/useToolDisplayNames';
3
+ import { Badge } from './badge';
4
+ import { Field } from './field';
5
+ import { Select } from './select';
6
+ import { Tooltip } from './tooltip';
7
+ /** The shared informational note every badge surface carries: declared, never enforced. */
8
+ export const BADGES_NOTE = 'Declared capability labels — informational only. They describe what the tool touches; the server never enforces them.';
9
+ const NO_DISPLAY_NAMES = {};
10
+ const UNTAGGED = 'Untagged';
11
+ // Radix `Select.Item` forbids an empty-string value, so the "no filter" choice
12
+ // uses a sentinel rather than ''. A tool literally tagged this string would just
13
+ // never be filtered out — harmless for a UI convenience whose authority is the server.
14
+ export const ALL_TAGS = '__all_tags__';
15
+ /** The group a tool sorts into: its alphabetically-first tag, else "Untagged". */
16
+ function groupFor(name, tagsByTool) {
17
+ const tags = [...(tagsByTool[name] ?? [])].sort((a, b) => a.localeCompare(b));
18
+ return tags[0] ?? UNTAGGED;
19
+ }
20
+ /**
21
+ * The option label: `Display Name (raw)` when a distinct non-empty display name maps
22
+ * the name, else the bare name; either way suffixed " (agent)" for an agent run tool.
23
+ */
24
+ function optionLabel(name, displayNames, agentToolNames) {
25
+ const base = toolDisplayLabel(displayNames ?? NO_DISPLAY_NAMES, name);
26
+ return agentToolNames?.has(name) === true ? `${base} (agent)` : base;
27
+ }
28
+ /** Build the grouped option clusters (sorted group labels, "Untagged" last). */
29
+ function buildGroups(names, tagsByTool, displayNames, agentToolNames) {
30
+ const byGroup = new Map();
31
+ for (const name of names) {
32
+ const group = groupFor(name, tagsByTool);
33
+ const bucket = byGroup.get(group) ?? [];
34
+ bucket.push(name);
35
+ byGroup.set(group, bucket);
36
+ }
37
+ return [...byGroup.entries()]
38
+ .sort(([a], [b]) => {
39
+ if (a === UNTAGGED)
40
+ return 1;
41
+ if (b === UNTAGGED)
42
+ return -1;
43
+ return a.localeCompare(b);
44
+ })
45
+ .map(([label, groupNames]) => ({
46
+ label,
47
+ options: groupNames.map((name) => ({
48
+ value: name,
49
+ label: optionLabel(name, displayNames, agentToolNames),
50
+ })),
51
+ }));
52
+ }
53
+ /** The tool select: grouped by tag when `tagsByTool` is present, else a flat list.
54
+ * Either branch is a `Select`, which claims the enclosing `Field`'s control id. */
55
+ export function ToolSelect({ tagsByTool, filtered, value, onChange, placeholder, ariaLabel, disabled, displayNames, agentToolNames, }) {
56
+ if (tagsByTool !== undefined) {
57
+ return (_jsx(Select, { groups: buildGroups(filtered, tagsByTool, displayNames, agentToolNames), value: value ?? '', onValueChange: onChange, placeholder: placeholder, "aria-label": ariaLabel, disabled: disabled }));
58
+ }
59
+ return (_jsx(Select
60
+ // Keep Radix controlled even when the caller's value is null: `''` matches no
61
+ // item (placeholder still shows) and avoids the uncontrolled→controlled warning
62
+ // a subsequent selection would otherwise trigger.
63
+ , {
64
+ // Keep Radix controlled even when the caller's value is null: `''` matches no
65
+ // item (placeholder still shows) and avoids the uncontrolled→controlled warning
66
+ // a subsequent selection would otherwise trigger.
67
+ options: filtered.map((name) => ({
68
+ value: name,
69
+ label: optionLabel(name, displayNames, agentToolNames),
70
+ })), value: value ?? '', onValueChange: onChange, placeholder: placeholder, "aria-label": ariaLabel, disabled: disabled }));
71
+ }
72
+ /** The tag filter: an "All tags" sentinel plus one option per distinct tag. */
73
+ export function TagFilterField({ allTags, tagFilter, onTagFilterChange, disabled, }) {
74
+ return (_jsx(Field, { label: "Filter by tag", children: _jsx(Select, { options: [
75
+ { value: ALL_TAGS, label: 'All tags' },
76
+ ...allTags.map((tag) => ({ value: tag, label: tag })),
77
+ ], value: tagFilter, onValueChange: onTagFilterChange, disabled: disabled }) }));
78
+ }
79
+ /** The selected tool's DECLARED capability badges, read-only and informational.
80
+ * Renders nothing unless the selected tool carries badges. */
81
+ export function SelectedToolBadges({ value, badgesByTool, idPrefix, }) {
82
+ if (value === null || badgesByTool === undefined || (badgesByTool[value]?.length ?? 0) === 0) {
83
+ return null;
84
+ }
85
+ return (_jsx(Tooltip, { content: BADGES_NOTE, children: _jsx("span", { className: "tai-row", "data-testid": `${idPrefix}-badges`, style: { gap: 'var(--tai-space-1)' }, children: (badgesByTool[value] ?? []).map((badge) => (_jsx(Badge, { variant: "neutral", children: badge }, badge))) }) }));
86
+ }
87
+ //# sourceMappingURL=tool-picker-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-picker-parts.js","sourceRoot":"","sources":["../../src/components/tool-picker-parts.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- /** The shared informational note every badge surface carries: declared, never enforced. */
2
- export declare const BADGES_NOTE = "Declared capability labels \u2014 informational only. They describe what the tool touches; the server never enforces them.";
1
+ export { BADGES_NOTE } from './tool-picker-parts';
3
2
  export interface ToolPickerProps {
4
3
  readonly toolNames: readonly string[];
5
4
  readonly value: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-picker.d.ts","sourceRoot":"","sources":["../../src/components/tool-picker.tsx"],"names":[],"mappings":"AAyCA,2FAA2F;AAC3F,eAAO,MAAM,WAAW,+HACiG,CAAC;AAE1H,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,sFAAsF;IACtF,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAClE,wFAAwF;IACxF,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CACrE;AAyDD,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAA8B,EAC9B,QAAwB,EACxB,KAAK,EACL,YAAY,EAAE,SAAS,EACvB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,GACb,EAAE,eAAe,+BA+EjB"}
1
+ {"version":3,"file":"tool-picker.d.ts","sourceRoot":"","sources":["../../src/components/tool-picker.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,sFAAsF;IACtF,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAClE,wFAAwF;IACxF,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CACrE;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAA8B,EAC9B,QAAwB,EACxB,KAAK,EACL,YAAY,EAAE,SAAS,EACvB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,GACb,EAAE,eAAe,+BA+CjB"}
@@ -33,57 +33,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
33
33
  * every one renders as TEXT (React escapes it) — never an HTML sink. Pinned by a test.
34
34
  */
35
35
  import { useState } from 'react';
36
- import { toolDisplayLabel } from '../hooks/useToolDisplayNames';
37
- import { Badge } from './badge';
38
36
  import { Field } from './field';
39
- import { Select } from './select';
40
- import { Tooltip } from './tooltip';
41
- /** The shared informational note every badge surface carries: declared, never enforced. */
42
- export const BADGES_NOTE = 'Declared capability labels — informational only. They describe what the tool touches; the server never enforces them.';
43
- const NO_DISPLAY_NAMES = {};
44
- const UNTAGGED = 'Untagged';
45
- // Radix `Select.Item` forbids an empty-string value, so the "no filter" choice
46
- // uses a sentinel rather than ''. A tool literally tagged this string would just
47
- // never be filtered out — harmless for a UI convenience whose authority is the server.
48
- const ALL_TAGS = '__all_tags__';
49
- /** The group a tool sorts into: its alphabetically-first tag, else "Untagged". */
50
- function groupFor(name, tagsByTool) {
51
- const tags = [...(tagsByTool[name] ?? [])].sort((a, b) => a.localeCompare(b));
52
- return tags[0] ?? UNTAGGED;
53
- }
54
- /**
55
- * The option label: `Display Name (raw)` when a distinct non-empty display name maps
56
- * the name, else the bare name; either way suffixed " (agent)" for an agent run tool.
57
- */
58
- function optionLabel(name, displayNames, agentToolNames) {
59
- const base = toolDisplayLabel(displayNames ?? NO_DISPLAY_NAMES, name);
60
- return agentToolNames?.has(name) === true ? `${base} (agent)` : base;
61
- }
62
- /** Build the grouped option clusters (sorted group labels, "Untagged" last). */
63
- function buildGroups(names, tagsByTool, displayNames, agentToolNames) {
64
- const byGroup = new Map();
65
- for (const name of names) {
66
- const group = groupFor(name, tagsByTool);
67
- const bucket = byGroup.get(group) ?? [];
68
- bucket.push(name);
69
- byGroup.set(group, bucket);
70
- }
71
- return [...byGroup.entries()]
72
- .sort(([a], [b]) => {
73
- if (a === UNTAGGED)
74
- return 1;
75
- if (b === UNTAGGED)
76
- return -1;
77
- return a.localeCompare(b);
78
- })
79
- .map(([label, groupNames]) => ({
80
- label,
81
- options: groupNames.map((name) => ({
82
- value: name,
83
- label: optionLabel(name, displayNames, agentToolNames),
84
- })),
85
- }));
86
- }
37
+ import { ALL_TAGS, SelectedToolBadges, TagFilterField, ToolSelect } from './tool-picker-parts';
38
+ export { BADGES_NOTE } from './tool-picker-parts';
87
39
  export function ToolPicker({ toolNames, value, onChange, disabled, placeholder = 'Select a tool…', idPrefix = 'tool-picker', label, 'aria-label': ariaLabel, excludeNames, tagsByTool, agentToolNames, displayNames, badgesByTool, }) {
88
40
  const [tagFilter, setTagFilter] = useState(ALL_TAGS);
89
41
  const excluded = new Set(excludeNames ?? []);
@@ -95,21 +47,7 @@ export function ToolPicker({ toolNames, value, onChange, disabled, placeholder =
95
47
  const filtered = tagsByTool !== undefined && tagFilter !== ALL_TAGS
96
48
  ? available.filter((name) => (tagsByTool[name] ?? []).includes(tagFilter))
97
49
  : available;
98
- const toolSelect = tagsByTool !== undefined ? (_jsx(Select, { groups: buildGroups(filtered, tagsByTool, displayNames, agentToolNames), value: value ?? '', onValueChange: onChange, placeholder: placeholder, "aria-label": ariaLabel, disabled: disabled })) : (_jsx(Select
99
- // Keep Radix controlled even when the caller's value is null: `''` matches no
100
- // item (placeholder still shows) and avoids the uncontrolled→controlled warning
101
- // a subsequent selection would otherwise trigger.
102
- , {
103
- // Keep Radix controlled even when the caller's value is null: `''` matches no
104
- // item (placeholder still shows) and avoids the uncontrolled→controlled warning
105
- // a subsequent selection would otherwise trigger.
106
- options: filtered.map((name) => ({
107
- value: name,
108
- label: optionLabel(name, displayNames, agentToolNames),
109
- })), value: value ?? '', onValueChange: onChange, placeholder: placeholder, "aria-label": ariaLabel, disabled: disabled }));
110
- return (_jsxs("div", { "data-testid": idPrefix, className: "tai-stack tai-stack-2", children: [tagsByTool !== undefined && allTags.length > 0 ? (_jsx(Field, { label: "Filter by tag", children: _jsx(Select, { options: [
111
- { value: ALL_TAGS, label: 'All tags' },
112
- ...allTags.map((tag) => ({ value: tag, label: tag })),
113
- ], value: tagFilter, onValueChange: setTagFilter, disabled: disabled }) })) : null, label !== undefined ? _jsx(Field, { label: label, children: toolSelect }) : toolSelect, value !== null && badgesByTool !== undefined && (badgesByTool[value]?.length ?? 0) > 0 ? (_jsx(Tooltip, { content: BADGES_NOTE, children: _jsx("span", { className: "tai-row", "data-testid": `${idPrefix}-badges`, style: { gap: 'var(--tai-space-1)' }, children: (badgesByTool[value] ?? []).map((badge) => (_jsx(Badge, { variant: "neutral", children: badge }, badge))) }) })) : null] }));
50
+ const toolSelect = (_jsx(ToolSelect, { tagsByTool: tagsByTool, filtered: filtered, value: value, onChange: onChange, placeholder: placeholder, ariaLabel: ariaLabel, disabled: disabled, displayNames: displayNames, agentToolNames: agentToolNames }));
51
+ return (_jsxs("div", { "data-testid": idPrefix, className: "tai-stack tai-stack-2", children: [tagsByTool !== undefined && allTags.length > 0 ? (_jsx(TagFilterField, { allTags: allTags, tagFilter: tagFilter, onTagFilterChange: setTagFilter, disabled: disabled })) : null, label !== undefined ? _jsx(Field, { label: label, children: toolSelect }) : toolSelect, _jsx(SelectedToolBadges, { value: value, badgesByTool: badgesByTool, idPrefix: idPrefix })] }));
114
52
  }
115
53
  //# sourceMappingURL=tool-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-picker.js","sourceRoot":"","sources":["../../src/components/tool-picker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-picker.js","sourceRoot":"","sources":["../../src/components/tool-picker.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAsClD,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,GAAG,gBAAgB,EAC9B,QAAQ,GAAG,aAAa,EACxB,KAAK,EACL,YAAY,EAAE,SAAS,EACvB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,GACI;IAChB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAS,QAAQ,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,gFAAgF;IAChF,MAAM,OAAO,GACX,UAAU,KAAK,SAAS;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9E,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACnB,CAAC;IAER,MAAM,QAAQ,GACZ,UAAU,KAAK,SAAS,IAAI,SAAS,KAAK,QAAQ;QAChD,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1E,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,UAAU,GAAG,CACjB,KAAC,UAAU,IACT,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,GAC9B,CACH,CAAC;IAEF,OAAO,CACL,8BAAkB,QAAQ,EAAE,SAAS,EAAC,uBAAuB,aAC1D,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAChD,KAAC,cAAc,IACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,YAAY,EAC/B,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,YAAG,UAAU,GAAS,CAAC,CAAC,CAAC,UAAU,EAC7E,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAI,IAChF,CACP,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"version-history-panel.d.ts","sourceRoot":"","sources":["../../src/components/version-history-panel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAapE,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qDAAqD;IACrD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AA6ED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,UAAU,EACV,MAAM,EACN,eAAe,EACf,aAAa,EACb,QAAgB,EAChB,0BAA0B,EAC1B,UAAU,GACX,EAAE,wBAAwB,GAAG,SAAS,CA+OtC"}
1
+ {"version":3,"file":"version-history-panel.d.ts","sourceRoot":"","sources":["../../src/components/version-history-panel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBpE,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qDAAqD;IACrD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AA6ED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,UAAU,EACV,MAAM,EACN,eAAe,EACf,aAAa,EACb,QAAgB,EAChB,0BAA0B,EAC1B,UAAU,GACX,EAAE,wBAAwB,GAAG,SAAS,CAoItC"}
@@ -30,13 +30,11 @@ import { useEffect, useRef, useState } from 'react';
30
30
  import { errorMessage } from '../errors';
31
31
  import { Dialog } from './dialog';
32
32
  import { Field } from './field';
33
- import { CheckCircleIcon, PendingIcon } from './icons';
34
- import { JsonDiff } from './json-diff';
35
- import { JsonTree } from './json-tree';
36
33
  import { Button, Card, ErrorState, Spinner } from './primitives';
37
34
  import { ScrollRegion } from './scroll-region';
38
- import { Table, TBody, TD, TH, THead, TR } from './table';
39
- import { TagChips, TagsInput } from './tags';
35
+ import { Table, TBody, TH, THead, TR } from './table';
36
+ import { TagsInput } from './tags';
37
+ import { CompareDialog, RollbackConfirmDialog, SelectedVersionBody, VersionRow, } from './version-history-rows';
40
38
  /** The initially-selected version: the current one, else the first listed. */
41
39
  function initialSelection(versions) {
42
40
  const current = versions.find((entry) => entry.is_current);
@@ -114,35 +112,10 @@ export function VersionHistoryPanel({ versions, onRollback, onView, rollbackPend
114
112
  const editingEntry = versions.find((entry) => entry.version === editingTags);
115
113
  const fromBody = versions.find((entry) => entry.version === comparePair?.from)?.body;
116
114
  const toBody = versions.find((entry) => entry.version === comparePair?.to)?.body;
117
- return (_jsxs("div", { className: "tai-stack", children: [_jsx(Card, { children: _jsx(ScrollRegion, { label: "Version history", children: _jsxs(Table, { children: [_jsx(THead, { children: _jsxs(TR, { children: [_jsx(TH, { numeric: true, children: "Version" }), _jsx(TH, { children: "Created" }), _jsx(TH, { children: "Status" }), showTags ? _jsx(TH, { children: "Tags" }) : null, _jsx(TH, { children: "Actions" })] }) }), _jsx(TBody, { children: versions.map((entry) => (_jsxs(TR, { "data-testid": `version-row-${String(entry.version)}`, children: [_jsx(TD, { className: "tai-table-id", numeric: true, children: entry.version }), _jsx(TD, { className: "tai-mono", children: entry.created_at }), _jsx(TD, { children: entry.is_current ? (_jsxs("span", { className: "tai-status tai-status-ok", children: [_jsx(CheckCircleIcon, {}), "Current"] })) : (_jsxs("span", { className: "tai-status tai-status-pending", children: [_jsx(PendingIcon, {}), "Historical"] })) }), showTags ? (_jsx(TD, { children: (entry.tags ?? []).length > 0 ? (_jsx(TagChips, { tags: entry.tags ?? [] })) : (_jsx("span", { className: "tai-muted", children: "\u2014" })) })) : null, _jsx(TD, { children: _jsxs("div", { className: "tai-row", children: [_jsx(Button, { "aria-label": `View version ${String(entry.version)}`, onClick: () => {
118
- view(entry.version);
119
- }, children: "View" }), canCompare ? (_jsx(Button
120
- // The name starts with the word the button is SHOWING,
121
- // which is what WCAG 2.5.3 (Label in Name) asks: a constant
122
- // "Compare …" would leave a button reading "Comparing…"
123
- // named "Compare", and a voice-control user naming a control
124
- // they cannot see. The button stays ENABLED while armed —
125
- // unlike an Edit action, a second click on the armed row is
126
- // the disarm, so there is nothing to take away.
127
- , { "aria-label": `${compareFrom === entry.version ? 'Comparing' : 'Compare'} version ${String(entry.version)}`, onClick: () => {
128
- compare(entry.version);
129
- }, children: compareFrom === entry.version ? 'Comparing…' : 'Compare' })) : null, onEditTags !== undefined && !readOnly ? (_jsx(Button, { "aria-label": `Edit tags for version ${String(entry.version)}`, onClick: () => {
130
- setEditingTags(entry.version);
131
- }, children: "Edit tags" })) : null, readOnly ? null : (_jsx(Button, { variant: "secondary", "aria-label": `Roll back to version ${String(entry.version)}`, disabled: entry.is_current, onClick: () => {
132
- setConfirming(entry.version);
133
- }, children: "Roll back" }))] }) })] }, entry.version))) })] }) }) }), compareFrom !== null && comparePair === null ? (_jsxs("p", { role: "status", className: "tai-muted", children: ["Comparing from version ", compareFrom, " \u2014 pick another version, or Compare again to cancel."] })) : null, selectedEntry !== undefined ? (_jsxs("section", { className: "tai-stack tai-stack-2", children: [_jsxs("h3", { className: "tai-section-title", children: ["Version ", selectedEntry.version, " body"] }), _jsx(Card, { children: _jsx(JsonTree, { data: selectedEntry.body, label: `Version ${String(selectedEntry.version)} body` }) })] })) : null, comparePair !== null ? (_jsxs(Dialog, { title: `v${String(comparePair.from)} compared with v${String(comparePair.to)}`, description: "A structural diff of the two version bodies. Arrays compare whole.", open: true, onOpenChange: (next) => {
134
- if (!next)
135
- closeCompare();
136
- }, children: [_jsx(ScrollRegion, { label: "Version diff", children: _jsx(JsonDiff, { before: fromBody, after: toBody }) }), _jsx("div", { className: "tai-dialog-actions", children: _jsx(Button, { onClick: closeCompare, children: "Close" }) })] })) : null, editingEntry !== undefined && onEditTags !== undefined ? (_jsx(EditTagsDialog, { version: editingEntry.version, initialTags: editingEntry.tags ?? [], onSave: onEditTags, onClose: () => {
115
+ return (_jsxs("div", { className: "tai-stack", children: [_jsx(Card, { children: _jsx(ScrollRegion, { label: "Version history", children: _jsxs(Table, { children: [_jsx(THead, { children: _jsxs(TR, { children: [_jsx(TH, { numeric: true, children: "Version" }), _jsx(TH, { children: "Created" }), _jsx(TH, { children: "Status" }), showTags ? _jsx(TH, { children: "Tags" }) : null, _jsx(TH, { children: "Actions" })] }) }), _jsx(TBody, { children: versions.map((entry) => (_jsx(VersionRow, { entry: entry, showTags: showTags, canCompare: canCompare, compareArmed: compareFrom === entry.version, readOnly: readOnly, canEditTags: onEditTags !== undefined, onView: view, onCompare: compare, onEditTags: setEditingTags, onRollback: setConfirming }, entry.version))) })] }) }) }), compareFrom !== null && comparePair === null ? (_jsxs("p", { role: "status", className: "tai-muted", children: ["Comparing from version ", compareFrom, " \u2014 pick another version, or Compare again to cancel."] })) : null, selectedEntry !== undefined ? _jsx(SelectedVersionBody, { entry: selectedEntry }) : null, comparePair !== null ? (_jsx(CompareDialog, { from: comparePair.from, to: comparePair.to, fromBody: fromBody, toBody: toBody, onClose: closeCompare })) : null, editingEntry !== undefined && onEditTags !== undefined ? (_jsx(EditTagsDialog, { version: editingEntry.version, initialTags: editingEntry.tags ?? [], onSave: onEditTags, onClose: () => {
137
116
  setEditingTags(null);
138
- } })) : null, confirming !== null ? (_jsxs(Dialog, { title: "Roll back version", description: `Make version ${String(confirming)} the active version? The version history is preserved.` +
139
- (rollbackConfirmDescription !== undefined ? ` ${rollbackConfirmDescription}` : ''), open: true, onOpenChange: (next) => {
140
- if (!next)
141
- setConfirming(null);
142
- }, children: [rollbackError !== undefined ? _jsx(ErrorState, { message: rollbackError }) : null, _jsxs("div", { className: "tai-dialog-actions", children: [_jsx(Button, { onClick: () => {
143
- setConfirming(null);
144
- }, children: "Cancel" }), _jsxs(Button, { variant: "primary", disabled: rollbackPending, onClick: () => {
145
- onRollback(confirming);
146
- }, children: [rollbackPending ? _jsx(Spinner, { label: "Rolling back" }) : null, "Roll back"] })] })] })) : null] }));
117
+ } })) : null, confirming !== null ? (_jsx(RollbackConfirmDialog, { version: confirming, rollbackPending: rollbackPending, rollbackError: rollbackError, extraDescription: rollbackConfirmDescription, onCancel: () => {
118
+ setConfirming(null);
119
+ }, onConfirm: onRollback })) : null] }));
147
120
  }
148
121
  //# sourceMappingURL=version-history-panel.js.map