@tai42/studio-sdk 30.0.0 → 31.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 (252) hide show
  1. package/README.md +98 -10
  2. package/dist/components/agent-picker.d.ts +1 -1
  3. package/dist/components/agent-picker.d.ts.map +1 -1
  4. package/dist/components/agent-picker.js +1 -0
  5. package/dist/components/agent-picker.js.map +1 -1
  6. package/dist/components/channel-picker.d.ts +1 -1
  7. package/dist/components/channel-picker.d.ts.map +1 -1
  8. package/dist/components/channel-picker.js +1 -0
  9. package/dist/components/channel-picker.js.map +1 -1
  10. package/dist/components/combo-draft-editor.d.ts +31 -0
  11. package/dist/components/combo-draft-editor.d.ts.map +1 -0
  12. package/dist/components/combo-draft-editor.js +16 -0
  13. package/dist/components/combo-draft-editor.js.map +1 -0
  14. package/dist/components/committed-combo-list.d.ts +17 -0
  15. package/dist/components/committed-combo-list.d.ts.map +1 -0
  16. package/dist/components/{extension-combo-parts.js → committed-combo-list.js} +2 -22
  17. package/dist/components/committed-combo-list.js.map +1 -0
  18. package/dist/components/components.css +53 -0
  19. package/dist/components/explorer-body.d.ts +1 -0
  20. package/dist/components/explorer-body.d.ts.map +1 -1
  21. package/dist/components/explorer-body.js +6 -4
  22. package/dist/components/explorer-body.js.map +1 -1
  23. package/dist/components/explorer-view.d.ts +16 -7
  24. package/dist/components/explorer-view.d.ts.map +1 -1
  25. package/dist/components/explorer-view.js +27 -13
  26. package/dist/components/explorer-view.js.map +1 -1
  27. package/dist/components/extension-combo-builder.d.ts +4 -4
  28. package/dist/components/extension-combo-builder.js +3 -2
  29. package/dist/components/extension-combo-builder.js.map +1 -1
  30. package/dist/components/extension-config-editor.js.map +1 -1
  31. package/dist/components/field.d.ts +6 -0
  32. package/dist/components/field.d.ts.map +1 -1
  33. package/dist/components/field.js +15 -2
  34. package/dist/components/field.js.map +1 -1
  35. package/dist/components/folder-actions.d.ts +51 -0
  36. package/dist/components/folder-actions.d.ts.map +1 -0
  37. package/dist/components/folder-actions.js +173 -0
  38. package/dist/components/folder-actions.js.map +1 -0
  39. package/dist/components/folder-filing.d.ts +32 -0
  40. package/dist/components/folder-filing.d.ts.map +1 -0
  41. package/dist/components/folder-filing.js +51 -0
  42. package/dist/components/folder-filing.js.map +1 -0
  43. package/dist/components/folder-nav.d.ts +9 -4
  44. package/dist/components/folder-nav.d.ts.map +1 -1
  45. package/dist/components/folder-nav.js +18 -22
  46. package/dist/components/folder-nav.js.map +1 -1
  47. package/dist/components/folder-occupancy.d.ts +27 -0
  48. package/dist/components/folder-occupancy.d.ts.map +1 -0
  49. package/dist/components/folder-occupancy.js +54 -0
  50. package/dist/components/folder-occupancy.js.map +1 -0
  51. package/dist/components/named-list-picker.d.ts +5 -3
  52. package/dist/components/named-list-picker.d.ts.map +1 -1
  53. package/dist/components/named-list-picker.js +7 -7
  54. package/dist/components/named-list-picker.js.map +1 -1
  55. package/dist/components/primitives.d.ts +2 -1
  56. package/dist/components/primitives.d.ts.map +1 -1
  57. package/dist/components/primitives.js +2 -1
  58. package/dist/components/primitives.js.map +1 -1
  59. package/dist/components/searchable-select-model.d.ts +40 -0
  60. package/dist/components/searchable-select-model.d.ts.map +1 -0
  61. package/dist/components/searchable-select-model.js +69 -0
  62. package/dist/components/searchable-select-model.js.map +1 -0
  63. package/dist/components/searchable-select.d.ts +38 -0
  64. package/dist/components/searchable-select.d.ts.map +1 -0
  65. package/dist/components/searchable-select.js +200 -0
  66. package/dist/components/searchable-select.js.map +1 -0
  67. package/dist/components/selected-tool-badges.d.ts +13 -0
  68. package/dist/components/selected-tool-badges.d.ts.map +1 -0
  69. package/dist/components/selected-tool-badges.js +14 -0
  70. package/dist/components/selected-tool-badges.js.map +1 -0
  71. package/dist/components/subject-section.d.ts.map +1 -1
  72. package/dist/components/subject-section.js +2 -2
  73. package/dist/components/subject-section.js.map +1 -1
  74. package/dist/components/table.d.ts +7 -1
  75. package/dist/components/table.d.ts.map +1 -1
  76. package/dist/components/table.js +2 -2
  77. package/dist/components/table.js.map +1 -1
  78. package/dist/components/tag-filter-field.d.ts +11 -0
  79. package/dist/components/tag-filter-field.d.ts.map +1 -0
  80. package/dist/components/tag-filter-field.js +15 -0
  81. package/dist/components/tag-filter-field.js.map +1 -0
  82. package/dist/components/tool-meta-access.d.ts +28 -0
  83. package/dist/components/tool-meta-access.d.ts.map +1 -0
  84. package/dist/components/tool-meta-access.js +65 -0
  85. package/dist/components/tool-meta-access.js.map +1 -0
  86. package/dist/components/tool-name-entry.d.ts +26 -0
  87. package/dist/components/tool-name-entry.d.ts.map +1 -0
  88. package/dist/components/tool-name-entry.js +43 -0
  89. package/dist/components/tool-name-entry.js.map +1 -0
  90. package/dist/components/tool-picker.d.ts +24 -19
  91. package/dist/components/tool-picker.d.ts.map +1 -1
  92. package/dist/components/tool-picker.js +55 -35
  93. package/dist/components/tool-picker.js.map +1 -1
  94. package/dist/components/tool-select.d.ts +26 -0
  95. package/dist/components/tool-select.d.ts.map +1 -0
  96. package/dist/components/tool-select.js +82 -0
  97. package/dist/components/tool-select.js.map +1 -0
  98. package/dist/extension-combos.d.ts +6 -1
  99. package/dist/extension-combos.d.ts.map +1 -1
  100. package/dist/extension-combos.js +8 -0
  101. package/dist/extension-combos.js.map +1 -1
  102. package/dist/hooks/useApi.d.ts +1 -0
  103. package/dist/hooks/useApi.d.ts.map +1 -1
  104. package/dist/hooks/useSystemKinds.d.ts +27 -12
  105. package/dist/hooks/useSystemKinds.d.ts.map +1 -1
  106. package/dist/hooks/useSystemKinds.js +56 -16
  107. package/dist/hooks/useSystemKinds.js.map +1 -1
  108. package/dist/index.d.ts +51 -49
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +34 -26
  111. package/dist/index.js.map +1 -1
  112. package/dist/marketplace-install/use-mount-install.d.ts +6 -6
  113. package/dist/plugin/version.d.ts +1 -1
  114. package/dist/plugin/version.js +1 -1
  115. package/dist/schema-editor/SchemaEditor.d.ts +7 -2
  116. package/dist/schema-editor/SchemaEditor.d.ts.map +1 -1
  117. package/dist/schema-editor/SchemaEditor.js +1 -1
  118. package/dist/schema-editor/SchemaEditor.js.map +1 -1
  119. package/dist/schema-editor/index.d.ts +2 -2
  120. package/dist/schema-editor/index.d.ts.map +1 -1
  121. package/dist/schema-form/array-field.d.ts.map +1 -1
  122. package/dist/schema-form/array-field.js +6 -2
  123. package/dist/schema-form/array-field.js.map +1 -1
  124. package/dist/schema-form/classify.d.ts +4 -1
  125. package/dist/schema-form/classify.d.ts.map +1 -1
  126. package/dist/schema-form/classify.js +36 -15
  127. package/dist/schema-form/classify.js.map +1 -1
  128. package/dist/schema-form/collapsed-object-field.d.ts +20 -0
  129. package/dist/schema-form/collapsed-object-field.d.ts.map +1 -0
  130. package/dist/schema-form/collapsed-object-field.js +14 -0
  131. package/dist/schema-form/collapsed-object-field.js.map +1 -0
  132. package/dist/schema-form/context.d.ts +27 -1
  133. package/dist/schema-form/context.d.ts.map +1 -1
  134. package/dist/schema-form/context.js +14 -0
  135. package/dist/schema-form/context.js.map +1 -1
  136. package/dist/schema-form/default-value.d.ts +21 -6
  137. package/dist/schema-form/default-value.d.ts.map +1 -1
  138. package/dist/schema-form/default-value.js +74 -15
  139. package/dist/schema-form/default-value.js.map +1 -1
  140. package/dist/schema-form/expression-field.d.ts +48 -0
  141. package/dist/schema-form/expression-field.d.ts.map +1 -0
  142. package/dist/schema-form/expression-field.js +88 -0
  143. package/dist/schema-form/expression-field.js.map +1 -0
  144. package/dist/schema-form/field-model.d.ts +23 -4
  145. package/dist/schema-form/field-model.d.ts.map +1 -1
  146. package/dist/schema-form/field-node.d.ts.map +1 -1
  147. package/dist/schema-form/field-node.js +16 -3
  148. package/dist/schema-form/field-node.js.map +1 -1
  149. package/dist/schema-form/index.d.ts +3 -3
  150. package/dist/schema-form/index.d.ts.map +1 -1
  151. package/dist/schema-form/index.js +2 -2
  152. package/dist/schema-form/index.js.map +1 -1
  153. package/dist/schema-form/object-fields.d.ts +6 -3
  154. package/dist/schema-form/object-fields.d.ts.map +1 -1
  155. package/dist/schema-form/object-fields.js +14 -3
  156. package/dist/schema-form/object-fields.js.map +1 -1
  157. package/dist/schema-form/record-field.d.ts.map +1 -1
  158. package/dist/schema-form/record-field.js +6 -2
  159. package/dist/schema-form/record-field.js.map +1 -1
  160. package/dist/schema-form/seeding-action.d.ts +15 -0
  161. package/dist/schema-form/seeding-action.d.ts.map +1 -0
  162. package/dist/schema-form/seeding-action.js +35 -0
  163. package/dist/schema-form/seeding-action.js.map +1 -0
  164. package/dist/schema-form/string-annotations.d.ts +22 -8
  165. package/dist/schema-form/string-annotations.d.ts.map +1 -1
  166. package/dist/schema-form/string-annotations.js +39 -14
  167. package/dist/schema-form/string-annotations.js.map +1 -1
  168. package/dist/schema-form/string-field.js +2 -84
  169. package/dist/schema-form/string-field.js.map +1 -1
  170. package/dist/schema-form/templated-field.d.ts +13 -0
  171. package/dist/schema-form/templated-field.d.ts.map +1 -0
  172. package/dist/schema-form/templated-field.js +43 -0
  173. package/dist/schema-form/templated-field.js.map +1 -0
  174. package/dist/schema-form/union-field.d.ts.map +1 -1
  175. package/dist/schema-form/union-field.js +6 -2
  176. package/dist/schema-form/union-field.js.map +1 -1
  177. package/dist/schema-form/union.d.ts +4 -4
  178. package/dist/schema-form/union.d.ts.map +1 -1
  179. package/dist/schema-form/union.js +8 -1
  180. package/dist/schema-form/union.js.map +1 -1
  181. package/dist/schema-form/validate.d.ts.map +1 -1
  182. package/dist/schema-form/validate.js +28 -0
  183. package/dist/schema-form/validate.js.map +1 -1
  184. package/dist/search-match.d.ts +29 -0
  185. package/dist/search-match.d.ts.map +1 -0
  186. package/dist/search-match.js +38 -0
  187. package/dist/search-match.js.map +1 -0
  188. package/dist/tool-organization.d.ts +15 -0
  189. package/dist/tool-organization.d.ts.map +1 -0
  190. package/dist/tool-organization.js +6 -0
  191. package/dist/tool-organization.js.map +1 -0
  192. package/package.json +3 -2
  193. package/src/components/agent-picker.tsx +2 -1
  194. package/src/components/channel-picker.tsx +2 -1
  195. package/src/components/combo-draft-editor.tsx +96 -0
  196. package/src/components/{extension-combo-parts.tsx → committed-combo-list.tsx} +4 -105
  197. package/src/components/components.css +53 -0
  198. package/src/components/explorer-body.tsx +29 -5
  199. package/src/components/explorer-view.tsx +48 -17
  200. package/src/components/extension-combo-builder.tsx +10 -10
  201. package/src/components/extension-config-editor.tsx +3 -3
  202. package/src/components/field.tsx +18 -2
  203. package/src/components/folder-actions.tsx +341 -0
  204. package/src/components/folder-filing.tsx +109 -0
  205. package/src/components/folder-nav.tsx +26 -10
  206. package/src/components/folder-occupancy.ts +83 -0
  207. package/src/components/named-list-picker.tsx +11 -7
  208. package/src/components/primitives.tsx +2 -1
  209. package/src/components/searchable-select-model.ts +105 -0
  210. package/src/components/searchable-select.tsx +432 -0
  211. package/src/components/selected-tool-badges.tsx +41 -0
  212. package/src/components/subject-section.tsx +3 -2
  213. package/src/components/table.tsx +12 -2
  214. package/src/components/tag-filter-field.tsx +37 -0
  215. package/src/components/tool-meta-access.tsx +101 -0
  216. package/src/components/tool-name-entry.tsx +77 -0
  217. package/src/components/tool-picker.tsx +87 -52
  218. package/src/components/tool-select.tsx +136 -0
  219. package/src/extension-combos.ts +15 -1
  220. package/src/hooks/useSystemKinds.tsx +77 -17
  221. package/src/index.ts +98 -94
  222. package/src/plugin/version.ts +1 -1
  223. package/src/schema-editor/SchemaEditor.tsx +9 -3
  224. package/src/schema-editor/index.ts +2 -2
  225. package/src/schema-form/array-field.tsx +10 -2
  226. package/src/schema-form/classify.ts +41 -15
  227. package/src/schema-form/collapsed-object-field.tsx +56 -0
  228. package/src/schema-form/context.ts +33 -1
  229. package/src/schema-form/default-value.ts +89 -15
  230. package/src/schema-form/expression-field.tsx +162 -0
  231. package/src/schema-form/field-model.ts +27 -4
  232. package/src/schema-form/field-node.tsx +41 -2
  233. package/src/schema-form/index.ts +3 -2
  234. package/src/schema-form/object-fields.tsx +11 -4
  235. package/src/schema-form/record-field.tsx +10 -2
  236. package/src/schema-form/seeding-action.ts +44 -0
  237. package/src/schema-form/string-annotations.ts +40 -14
  238. package/src/schema-form/string-field.tsx +2 -147
  239. package/src/schema-form/templated-field.tsx +124 -0
  240. package/src/schema-form/union-field.tsx +11 -2
  241. package/src/schema-form/union.ts +12 -5
  242. package/src/schema-form/validate.ts +28 -0
  243. package/src/search-match.ts +41 -0
  244. package/src/tool-organization.ts +34 -0
  245. package/dist/components/extension-combo-parts.d.ts +0 -46
  246. package/dist/components/extension-combo-parts.d.ts.map +0 -1
  247. package/dist/components/extension-combo-parts.js.map +0 -1
  248. package/dist/components/tool-picker-parts.d.ts +0 -43
  249. package/dist/components/tool-picker-parts.d.ts.map +0 -1
  250. package/dist/components/tool-picker-parts.js +0 -89
  251. package/dist/components/tool-picker-parts.js.map +0 -1
  252. package/src/components/tool-picker-parts.tsx +0 -195
@@ -0,0 +1,38 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { SelectGroup, SelectOption } from './select';
3
+ /** Everything the two option shapes have in common. */
4
+ interface SearchableSelectSharedProps {
5
+ /**
6
+ * The chosen option's value; `''` for none (the placeholder shows). A value no option
7
+ * carries shows as itself on the trigger.
8
+ */
9
+ readonly value: string;
10
+ readonly onValueChange: (value: string) => void;
11
+ readonly placeholder?: string;
12
+ readonly disabled?: boolean;
13
+ /**
14
+ * Accessible name for the trigger, its popup and its listbox when it is not wired to
15
+ * an enclosing `Field`. A `Field` wins where both are given, as on `Select`.
16
+ */
17
+ readonly 'aria-label'?: string;
18
+ /** IDREFs describing the trigger, concatenated ahead of an enclosing `Field`'s own. */
19
+ readonly 'aria-describedby'?: string;
20
+ /** Accessible name of the search box (e.g. "Search tools"). */
21
+ readonly searchLabel: string;
22
+ }
23
+ /** The FLAT shape: one ungrouped run of options. */
24
+ export interface SearchableSelectProps extends SearchableSelectSharedProps {
25
+ readonly options: readonly SelectOption[];
26
+ }
27
+ /** The GROUPED shape: labelled clusters, each carrying its own options. */
28
+ export interface SearchableSelectGroupsProps extends SearchableSelectSharedProps {
29
+ readonly groups: readonly SelectGroup[];
30
+ }
31
+ type SearchableSelectArgs = (SearchableSelectProps & {
32
+ readonly groups?: undefined;
33
+ }) | (SearchableSelectGroupsProps & {
34
+ readonly options?: undefined;
35
+ });
36
+ export declare function SearchableSelect(props: SearchableSelectArgs): ReactNode;
37
+ export {};
38
+ //# sourceMappingURL=searchable-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchable-select.d.ts","sourceRoot":"","sources":["../../src/components/searchable-select.tsx"],"names":[],"mappings":"AA0BA,OAAO,EAIL,KAAK,SAAS,EAQf,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1D,uDAAuD;AACvD,UAAU,2BAA2B;IACnC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,uFAAuF;IACvF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,oDAAoD;AACpD,MAAM,WAAW,qBAAsB,SAAQ,2BAA2B;IACxE,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,2EAA2E;AAC3E,MAAM,WAAW,2BAA4B,SAAQ,2BAA2B;IAC9E,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;CACzC;AAED,KAAK,oBAAoB,GACrB,CAAC,qBAAqB,GAAG;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,GACzD,CAAC,2BAA2B,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAsLrE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAiJvE"}
@@ -0,0 +1,200 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * `SearchableSelect` — a single-choice select whose popup opens with a search box:
4
+ * typing narrows the options to those whose label contains the text (the SDK's one
5
+ * search rule, `matchesSearch`). It takes the same option shapes as `Select` — a flat
6
+ * `options` run or labelled `groups`, never both — and its trigger wears the same
7
+ * class, auto-wires to an enclosing `Field` the same way, and has the same
8
+ * `combobox` role, so the two read as one control with and without search.
9
+ *
10
+ * Keyboard: on the trigger, Enter, ArrowDown or ArrowUp opens the popup as the key goes
11
+ * down (as on `Select`), Space opens it as a button press, and a printable key opens it
12
+ * with that key already typed. In the search box ArrowDown
13
+ * and ArrowUp move the highlight, Enter chooses it, and Escape closes the popup and
14
+ * returns focus to the trigger. The highlight is exposed as the search box's
15
+ * `aria-activedescendant`, so focus never leaves the box while the reader moves.
16
+ *
17
+ * Large lists: the options are indexed once per options change, a keystroke runs one
18
+ * substring test per option against that index, and the list renders from a deferred
19
+ * copy of the query so typing stays responsive. Each row is memoised on its indexed
20
+ * entry, so a keystroke re-renders only the rows whose highlight or selection changed;
21
+ * the rest are kept or removed by React without rendering.
22
+ *
23
+ * The popup is a Radix Popover, so it shares the layer, focus and dismiss stack the
24
+ * design system's dialogs use: it opens above a dialog and closes on Escape or an
25
+ * outside press without closing the dialog under it.
26
+ */
27
+ import * as RadixPopover from '@radix-ui/react-popover';
28
+ import { memo, useCallback, useDeferredValue, useEffect, useId, useMemo, useRef, useState, } from 'react';
29
+ import { SELECT_TRIGGER_CLASS } from './control-styles';
30
+ import { useFieldControl, useFieldLabelId } from './field';
31
+ import { CheckIcon, ChevronDownIcon } from './icons';
32
+ import { indexSections, shownEntry, stepEntry, visibleOptions, } from './searchable-select-model';
33
+ /** One option. Pointer handling is delegated to the listbox, so a row is pure markup. */
34
+ const OptionRow = memo(function OptionRow({ entry, id, highlighted, selected }) {
35
+ const disabled = entry.option.disabled === true;
36
+ return (_jsxs("div", { id: id, role: "option", "aria-selected": selected, "aria-disabled": disabled ? true : undefined, className: "tai-select-item", "data-position": entry.position, "data-highlighted": highlighted ? '' : undefined, "data-disabled": disabled ? '' : undefined, children: [_jsx("span", { children: entry.option.label }), selected ? (_jsx("span", { className: "tai-select-item-indicator", "aria-hidden": "true", children: _jsx(CheckIcon, {}) })) : null] }));
37
+ });
38
+ /** The position of the option row an event happened in, or `undefined` outside one. */
39
+ function positionAt(target) {
40
+ if (!(target instanceof Element))
41
+ return undefined;
42
+ const row = target.closest('[role="option"]');
43
+ if (row === null || row.dataset.disabled !== undefined)
44
+ return undefined;
45
+ const position = Number(row.dataset.position);
46
+ return Number.isInteger(position) ? position : undefined;
47
+ }
48
+ /** A key that types a character (and so starts a search from the closed trigger). */
49
+ function isPrintable(event) {
50
+ return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
51
+ }
52
+ /**
53
+ * The select's interaction state over its indexed `sections`: whether the popup is
54
+ * open, the query and what it leaves visible, the highlight, and the key and pointer
55
+ * handlers that move it and choose.
56
+ *
57
+ * The highlight is held as an option VALUE, so a list that changes while open keeps
58
+ * it on the same option. Choosing and the empty status read the live query; only the
59
+ * rendered rows trail it through `useDeferredValue`, so a fast type-and-Enter picks
60
+ * from what was typed.
61
+ */
62
+ function useSearchSelection(sections, value, onValueChange) {
63
+ const listboxId = useId();
64
+ const optionId = useCallback((position) => `${listboxId}-${String(position)}`, [listboxId]);
65
+ const inputRef = useRef(null);
66
+ const [open, setOpen] = useState(false);
67
+ const [query, setQuery] = useState('');
68
+ const [wanted, setWanted] = useState(undefined);
69
+ // Only a keyboard move scrolls the highlight into view; a pointer already sees it.
70
+ const scrollOnMove = useRef(false);
71
+ const indexed = useMemo(() => sections.flatMap((section) => section.entries), [sections]);
72
+ const selectedEntry = useMemo(() => indexed.find((entry) => entry.option.value === value), [indexed, value]);
73
+ const live = useMemo(() => visibleOptions(sections, query), [sections, query]);
74
+ const deferredQuery = useDeferredValue(query);
75
+ const rendered = useMemo(() => (deferredQuery === query ? live : visibleOptions(sections, deferredQuery)), [sections, deferredQuery, query, live]);
76
+ const highlightedEntry = shownEntry(live.entries, wanted);
77
+ const highlighted = highlightedEntry?.position;
78
+ const scrollToHighlight = useCallback((position) => {
79
+ if (position === undefined)
80
+ return;
81
+ document.getElementById(optionId(position))?.scrollIntoView({ block: 'nearest' });
82
+ }, [optionId]);
83
+ useEffect(() => {
84
+ if (!scrollOnMove.current)
85
+ return;
86
+ scrollOnMove.current = false;
87
+ scrollToHighlight(highlighted);
88
+ }, [highlighted, scrollToHighlight]);
89
+ const onOpenChange = (next) => {
90
+ setOpen(next);
91
+ if (!next)
92
+ setQuery('');
93
+ else
94
+ setWanted(selectedEntry?.option.value);
95
+ };
96
+ /** Runs once the popup's rows are mounted: focus goes to the search box, and the
97
+ * highlight (the chosen option on open) is brought into view. */
98
+ const onOpened = () => {
99
+ inputRef.current?.focus();
100
+ scrollToHighlight(highlighted);
101
+ };
102
+ const choose = (entry) => {
103
+ if (entry === undefined || entry.option.disabled === true)
104
+ return;
105
+ if (entry.option.value !== value)
106
+ onValueChange(entry.option.value);
107
+ onOpenChange(false);
108
+ };
109
+ const move = (to) => {
110
+ scrollOnMove.current = true;
111
+ setWanted(to?.option.value);
112
+ };
113
+ const onSearchKeyDown = (event) => {
114
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
115
+ event.preventDefault();
116
+ move(stepEntry(live.entries, highlightedEntry, event.key === 'ArrowDown' ? 1 : -1));
117
+ }
118
+ else if (event.key === 'Enter') {
119
+ // Enter chooses; it must never submit the form the select sits in.
120
+ event.preventDefault();
121
+ choose(highlightedEntry);
122
+ }
123
+ };
124
+ const onTriggerKeyDown = (event) => {
125
+ if (open)
126
+ return;
127
+ if (event.key === 'Enter' || event.key === 'ArrowDown' || event.key === 'ArrowUp') {
128
+ // Prevented, so a native button press does not follow and toggle it shut again.
129
+ event.preventDefault();
130
+ onOpenChange(true);
131
+ }
132
+ else if (isPrintable(event) && event.key !== ' ') {
133
+ event.preventDefault();
134
+ onOpenChange(true);
135
+ setQuery(event.key);
136
+ }
137
+ };
138
+ const entryAt = (target) => {
139
+ const position = positionAt(target);
140
+ return position === undefined ? undefined : indexed[position];
141
+ };
142
+ const onListClick = (event) => {
143
+ choose(entryAt(event.target));
144
+ };
145
+ const onListPointerMove = (event) => {
146
+ const entry = entryAt(event.target);
147
+ if (entry !== undefined && entry.option.value !== wanted)
148
+ setWanted(entry.option.value);
149
+ };
150
+ return {
151
+ listboxId,
152
+ optionId,
153
+ inputRef,
154
+ open,
155
+ onOpenChange,
156
+ onOpened,
157
+ query,
158
+ setQuery,
159
+ empty: live.entries.length === 0,
160
+ rendered,
161
+ highlighted,
162
+ selectedEntry,
163
+ onSearchKeyDown,
164
+ onTriggerKeyDown,
165
+ onListClick,
166
+ onListPointerMove,
167
+ };
168
+ }
169
+ export function SearchableSelect(props) {
170
+ const { value, onValueChange, placeholder = 'Select…', disabled, 'aria-label': ariaLabel, 'aria-describedby': ownDescribedBy, searchLabel, } = props;
171
+ // Untyped JavaScript is the only caller that reaches this; dropping one list would
172
+ // lose its every entry without a word.
173
+ if ((props.options === undefined) === (props.groups === undefined)) {
174
+ throw new Error('SearchableSelect renders exactly one of `options` or `groups`; it was given both, or neither.');
175
+ }
176
+ const field = useFieldControl();
177
+ const fieldLabelId = useFieldLabelId();
178
+ const sections = useMemo(() => indexSections(props.options, props.groups), [props.options, props.groups]);
179
+ const { listboxId, optionId, inputRef, open, onOpenChange, onOpened, query, setQuery, empty, rendered, highlighted, selectedEntry, onSearchKeyDown, onTriggerKeyDown, onListClick, onListPointerMove, } = useSearchSelection(sections, value, onValueChange);
180
+ // The popup and its listbox carry the control's own name: the Field's label, else
181
+ // the caller's `aria-label`. The search box is named apart by `searchLabel`.
182
+ const popupName = field.id !== undefined && fieldLabelId !== undefined
183
+ ? { 'aria-labelledby': fieldLabelId }
184
+ : { 'aria-label': ariaLabel };
185
+ const describedBy = [ownDescribedBy, field['aria-describedby']].filter((id) => id !== undefined);
186
+ const rows = (entries) => entries.map((entry) => (_jsx(OptionRow, { entry: entry, id: optionId(entry.position), highlighted: entry.position === highlighted, selected: entry === selectedEntry }, entry.position)));
187
+ return (_jsxs(RadixPopover.Root, { open: open, onOpenChange: onOpenChange, children: [_jsxs(RadixPopover.Trigger, { type: "button", role: "combobox", id: field.id, className: SELECT_TRIGGER_CLASS, disabled: disabled, "aria-label": field.id === undefined ? ariaLabel : undefined, "aria-describedby": describedBy.length > 0 ? describedBy.join(' ') : undefined, "aria-invalid": field['aria-invalid'], onKeyDown: onTriggerKeyDown, children: [_jsx("span", { children: selectedEntry?.option.label ?? (value === '' ? placeholder : value) }), _jsx(ChevronDownIcon, {})] }), _jsx(RadixPopover.Portal, { children: _jsxs(RadixPopover.Content, { className: "tai-select-content tai-search-select-content", align: "start", sideOffset: 4, ...popupName, onOpenAutoFocus: (event) => {
188
+ event.preventDefault();
189
+ onOpened();
190
+ }, children: [_jsx("div", { className: "tai-search-select-search", children: _jsx("input", { ref: inputRef, type: "text", role: "combobox", className: "tai-input", "aria-label": searchLabel, "aria-expanded": "true", "aria-controls": listboxId, "aria-autocomplete": "list", "aria-activedescendant": highlighted === undefined ? undefined : optionId(highlighted), autoComplete: "off", spellCheck: false, placeholder: searchLabel, value: query, onChange: (event) => {
191
+ setQuery(event.target.value);
192
+ }, onKeyDown: onSearchKeyDown }) }), _jsx("div", { id: listboxId, role: "listbox", ...popupName, tabIndex: -1, className: "tai-select-viewport tai-search-select-list", onMouseDown: (event) => {
193
+ event.preventDefault();
194
+ }, onClick: onListClick, onPointerMove: onListPointerMove, children: rendered.sections.map((section) => section.label === undefined ? (rows(section.entries)) : (_jsx(SectionGroup, { label: section.label, children: rows(section.entries) }, section.label))) }), empty ? (_jsx("p", { role: "status", className: "tai-status tai-search-select-empty", children: query.trim() === '' ? 'Nothing to choose.' : `Nothing matches “${query.trim()}”.` })) : null] }) })] }));
195
+ }
196
+ function SectionGroup({ label, children, }) {
197
+ const labelId = useId();
198
+ return (_jsxs("div", { role: "group", "aria-labelledby": labelId, children: [_jsx("div", { id: labelId, className: "tai-select-group-label tai-label", children: label }), children] }));
199
+ }
200
+ //# sourceMappingURL=searchable-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchable-select.js","sourceRoot":"","sources":["../../src/components/searchable-select.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** `ToolPicker`'s capability badges for the selected tool, and the note every badge
2
+ * surface carries. */
3
+ import type { ReactNode } from 'react';
4
+ /** The shared informational note every badge surface carries: declared, never enforced. */
5
+ export declare const BADGES_NOTE = "Declared capability labels \u2014 informational only. They describe what the tool touches; the server never enforces them.";
6
+ /** The selected tool's DECLARED capability badges, read-only and informational.
7
+ * Renders nothing unless the selected tool carries badges. */
8
+ export declare function SelectedToolBadges({ value, badgesByTool, idPrefix, }: {
9
+ readonly value: string | null;
10
+ readonly badgesByTool: Readonly<Record<string, readonly string[]>> | undefined;
11
+ readonly idPrefix: string;
12
+ }): ReactNode;
13
+ //# sourceMappingURL=selected-tool-badges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selected-tool-badges.d.ts","sourceRoot":"","sources":["../../src/components/selected-tool-badges.tsx"],"names":[],"mappings":"AAAA;uBACuB;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,2FAA2F;AAC3F,eAAO,MAAM,WAAW,+HACiG,CAAC;AAE1H;+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,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Badge } from './badge';
3
+ import { Tooltip } from './tooltip';
4
+ /** The shared informational note every badge surface carries: declared, never enforced. */
5
+ export const BADGES_NOTE = 'Declared capability labels — informational only. They describe what the tool touches; the server never enforces them.';
6
+ /** The selected tool's DECLARED capability badges, read-only and informational.
7
+ * Renders nothing unless the selected tool carries badges. */
8
+ export function SelectedToolBadges({ value, badgesByTool, idPrefix, }) {
9
+ if (value === null || badgesByTool === undefined || (badgesByTool[value]?.length ?? 0) === 0) {
10
+ return null;
11
+ }
12
+ 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))) }) }));
13
+ }
14
+ //# sourceMappingURL=selected-tool-badges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selected-tool-badges.js","sourceRoot":"","sources":["../../src/components/selected-tool-badges.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,WAAW,GACtB,uHAAuH,CAAC;AAE1H;+DAC+D;AAC/D,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,YAAY,EACZ,QAAQ,GAKT;IACC,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,KAAC,OAAO,IAAC,OAAO,EAAE,WAAW,YAC3B,eACE,SAAS,EAAC,SAAS,iBACN,GAAG,QAAQ,SAAS,EACjC,KAAK,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,YAEnC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC1C,KAAC,KAAK,IAAa,OAAO,EAAC,SAAS,YACjC,KAAK,IADI,KAAK,CAET,CACT,CAAC,GACG,GACC,CACX,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"subject-section.d.ts","sourceRoot":"","sources":["../../src/components/subject-section.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMjD,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yFAAyF;AACzF,eAAO,MAAM,0BAA0B,iDAAiD,CAAC;AAEzF;oFACoF;AACpF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,GAChF,mBAAmB,EAAE,CASvB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqB9E;AAED;iFACiF;AACjF,wBAAgB,gBAAgB;;;;;;;;;;;EAO/B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kDAAkD;IAClD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,qBAAqB,GACtB,EAAE,mBAAmB,GAAG,SAAS,CA4DjC"}
1
+ {"version":3,"file":"subject-section.d.ts","sourceRoot":"","sources":["../../src/components/subject-section.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMjD,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yFAAyF;AACzF,eAAO,MAAM,0BAA0B,iDAAiD,CAAC;AAEzF;oFACoF;AACpF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,GAChF,mBAAmB,EAAE,CASvB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqB9E;AAED;iFACiF;AACjF,wBAAgB,gBAAgB;;;;;;;;;;;EAO/B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,kDAAkD;IAClD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,qBAAqB,GACtB,EAAE,mBAAmB,GAAG,SAAS,CA6DjC"}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { Field } from './field';
4
4
  import { TextInput } from './inputs';
5
- import { Select } from './select';
5
+ import { SearchableSelect } from './searchable-select';
6
6
  /** The message a partially-filled subject is refused with (all three fields or none). */
7
7
  export const SUBJECT_INCOMPLETE_MESSAGE = 'A subject needs a target, a kind, and a key.';
8
8
  /** Map the conversation routes read to the target select's options: one option per
@@ -62,7 +62,7 @@ export function SubjectSection({ open, onToggle, target, onTargetChange, kind, o
62
62
  flexDirection: 'column',
63
63
  gap: 'var(--tai-space-3)',
64
64
  marginTop: 'var(--tai-space-3)',
65
- }, children: [_jsx("p", { style: { margin: 0, color: 'var(--tai-color-text-muted)' }, children: caption }), _jsx(Field, { label: "Target", children: _jsx(Select, { value: target, onValueChange: onTargetChange, "aria-label": "Subject target", placeholder: targetPlaceholder, options: targetOptions }) }), _jsx(Field, { label: "Subject kind", description: "The subject family the state declares (e.g. person).", children: _jsx(TextInput, { value: kind, placeholder: "e.g. person", onChange: (event) => {
65
+ }, children: [_jsx("p", { style: { margin: 0, color: 'var(--tai-color-text-muted)' }, children: caption }), _jsx(Field, { label: "Target", children: _jsx(SearchableSelect, { value: target, onValueChange: onTargetChange, "aria-label": "Subject target", placeholder: targetPlaceholder, options: targetOptions, searchLabel: "Search targets" }) }), _jsx(Field, { label: "Subject kind", description: "The subject family the state declares (e.g. person).", children: _jsx(TextInput, { value: kind, placeholder: "e.g. person", onChange: (event) => {
66
66
  onKindChange(event.target.value);
67
67
  } }) }), _jsx(Field, { label: "Subject key", description: subjectKeyDescription, children: _jsx(TextInput, { value: subjectKey, placeholder: "e.g. a-42", onChange: (event) => {
68
68
  onKeyChange(event.target.value);
@@ -1 +1 @@
1
- {"version":3,"file":"subject-section.js","sourceRoot":"","sources":["../../src/components/subject-section.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subject-section.js","sourceRoot":"","sources":["../../src/components/subject-section.tsx"],"names":[],"mappings":"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"}
@@ -8,6 +8,10 @@
8
8
  * A numeric column opts in with `numeric`, which stamps `data-numeric="true"` —
9
9
  * the hook the stylesheet right-aligns on tabular figures so digits line up.
10
10
  *
11
+ * A selected body row opts in with `selected`, which stamps `data-selected="true"` —
12
+ * the hook the stylesheet draws as the one selected-row look every table shares. It
13
+ * is presentation only: the row's own link carries `aria-current` for assistive tech.
14
+ *
11
15
  * Each wrapper FORWARDS a consumer `ref` to the native element it renders — the
12
16
  * attribute spread carries it, the same way it carries every other native prop —
13
17
  * so a caller that has to measure or scroll a cell is not forced back to a raw
@@ -32,8 +36,10 @@ export interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {
32
36
  readonly children?: ReactNode;
33
37
  /** A consumer ref for the `<tr>` itself. */
34
38
  readonly ref?: Ref<HTMLTableRowElement>;
39
+ /** Draw the row as the selected one. */
40
+ readonly selected?: boolean;
35
41
  }
36
- export declare function TR({ children, ...props }: TableRowProps): import("react").JSX.Element;
42
+ export declare function TR({ children, selected, ...props }: TableRowProps): import("react").JSX.Element;
37
43
  /** Right-align a column of digits on tabular figures. */
38
44
  export interface NumericColumnProps {
39
45
  readonly numeric?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAEhG,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,gBAAgB,CAAC;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CACtC;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BAMlE;AAED,qEAAqE;AACrE,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,uBAAuB,CAAC,CAAC;CAC7C;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,+BAE9D;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,+BAE9D;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;CACzC;AAED,wBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAEvD;AAED,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAQ,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,kBAAkB;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;CAC1C;AAED,wBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAe,EAAE,KAAa,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,+BAMjF;AAED,MAAM,WAAW,OAAQ,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,kBAAkB;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;CAC1C;AAED,wBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAe,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,+BAMlE"}
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAEhG,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,gBAAgB,CAAC;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CACtC;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BAMlE;AAED,qEAAqE;AACrE,MAAM,WAAW,iBAAkB,SAAQ,cAAc,CAAC,uBAAuB,CAAC;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,uBAAuB,CAAC,CAAC;CAC7C;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,+BAE9D;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,+BAE9D;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAgB,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAMzE;AAED,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAQ,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,kBAAkB;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;CAC1C;AAED,wBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAe,EAAE,KAAa,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,+BAMjF;AAED,MAAM,WAAW,OAAQ,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,kBAAkB;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC;CAC1C;AAED,wBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAe,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,+BAMlE"}
@@ -8,8 +8,8 @@ export function THead({ children, ...props }) {
8
8
  export function TBody({ children, ...props }) {
9
9
  return _jsx("tbody", { ...props, children: children });
10
10
  }
11
- export function TR({ children, ...props }) {
12
- return _jsx("tr", { ...props, children: children });
11
+ export function TR({ children, selected = false, ...props }) {
12
+ return (_jsx("tr", { ...props, "data-selected": selected ? 'true' : undefined, children: children }));
13
13
  }
14
14
  export function TH({ children, numeric = false, scope = 'col', ...props }) {
15
15
  return (_jsx("th", { ...props, scope: scope, "data-numeric": numeric ? 'true' : undefined, children: children }));
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":";AAuBA,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAc;IACjE,OAAO,CACL,mBAAW,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,SAAS,EAAE,YAC1F,QAAQ,GACH,CACT,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAqB;IAC7D,OAAO,mBAAW,KAAK,YAAG,QAAQ,GAAS,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAqB;IAC7D,OAAO,mBAAW,KAAK,YAAG,QAAQ,GAAS,CAAC;AAC9C,CAAC;AAQD,MAAM,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAiB;IACtD,OAAO,gBAAQ,KAAK,YAAG,QAAQ,GAAM,CAAC;AACxC,CAAC;AAmBD,MAAM,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,KAAK,EAAW;IAChF,OAAO,CACL,gBAAQ,KAAK,EAAE,KAAK,EAAE,KAAK,kBAAgB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YACpE,QAAQ,GACN,CACN,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,KAAK,EAAW;IACjE,OAAO,CACL,gBAAQ,KAAK,kBAAgB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YACtD,QAAQ,GACN,CACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":";AA2BA,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAc;IACjE,OAAO,CACL,mBAAW,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,SAAS,EAAE,YAC1F,QAAQ,GACH,CACT,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAqB;IAC7D,OAAO,mBAAW,KAAK,YAAG,QAAQ,GAAS,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAqB;IAC7D,OAAO,mBAAW,KAAK,YAAG,QAAQ,GAAS,CAAC;AAC9C,CAAC;AAUD,MAAM,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,KAAK,EAAiB;IACxE,OAAO,CACL,gBAAQ,KAAK,mBAAiB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YACxD,QAAQ,GACN,CACN,CAAC;AACJ,CAAC;AAmBD,MAAM,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,KAAK,EAAW;IAChF,OAAO,CACL,gBAAQ,KAAK,EAAE,KAAK,EAAE,KAAK,kBAAgB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YACpE,QAAQ,GACN,CACN,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,KAAK,EAAW;IACjE,OAAO,CACL,gBAAQ,KAAK,kBAAgB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YACtD,QAAQ,GACN,CACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** `ToolPicker`'s tag filter field and its "no filter" sentinel value. */
2
+ import type { ReactNode } from 'react';
3
+ export declare const ALL_TAGS = "__all_tags__";
4
+ /** The tag filter: an "All tags" sentinel plus one option per distinct tag. */
5
+ export declare function TagFilterField({ allTags, tagFilter, onTagFilterChange, disabled, }: {
6
+ readonly allTags: readonly string[];
7
+ readonly tagFilter: string;
8
+ readonly onTagFilterChange: (value: string) => void;
9
+ readonly disabled: boolean | undefined;
10
+ }): ReactNode;
11
+ //# sourceMappingURL=tag-filter-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-filter-field.d.ts","sourceRoot":"","sources":["../../src/components/tag-filter-field.tsx"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AAEvC,+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"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Field } from './field';
3
+ import { Select } from './select';
4
+ // Radix `Select.Item` forbids an empty-string value, so the "no filter" choice
5
+ // uses a sentinel rather than ''. A tool literally tagged this string would just
6
+ // never be filtered out — harmless for a UI convenience whose authority is the server.
7
+ export const ALL_TAGS = '__all_tags__';
8
+ /** The tag filter: an "All tags" sentinel plus one option per distinct tag. */
9
+ export function TagFilterField({ allTags, tagFilter, onTagFilterChange, disabled, }) {
10
+ return (_jsx(Field, { label: "Filter by tag", children: _jsx(Select, { options: [
11
+ { value: ALL_TAGS, label: 'All tags' },
12
+ ...allTags.map((tag) => ({ value: tag, label: tag })),
13
+ ], value: tagFilter, onValueChange: onTagFilterChange, disabled: disabled }) }));
14
+ }
15
+ //# sourceMappingURL=tag-filter-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-filter-field.js","sourceRoot":"","sources":["../../src/components/tag-filter-field.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,+EAA+E;AAC/E,iFAAiF;AACjF,uFAAuF;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC;AAEvC,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,QAAQ,GAMT;IACC,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAC,eAAe,YAC1B,KAAC,MAAM,IACL,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;gBACtC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;aACtD,EACD,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,iBAAiB,EAChC,QAAQ,EAAE,QAAQ,GAClB,GACI,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type ReactNode } from 'react';
2
+ /** Which overlay writes the caller may be offered. */
3
+ export interface ToolMetaWriteAccess {
4
+ /** Edit a tool's overlay row — its display name, tags, visibility or folder. */
5
+ readonly editTool: boolean;
6
+ readonly createFolder: boolean;
7
+ readonly renameFolder: boolean;
8
+ readonly moveFolder: boolean;
9
+ readonly deleteFolder: boolean;
10
+ }
11
+ /**
12
+ * The overlay writes the caller may be offered: each one's own route reached by the
13
+ * projection (fail closed until the projection is ready) and the tool_meta store not
14
+ * known OFF.
15
+ */
16
+ export declare function useToolMetaWriteAccess(): ToolMetaWriteAccess;
17
+ /**
18
+ * Hand a failed overlay write here: a not-configured refusal (501
19
+ * `tool-meta-not-configured`) is recorded so every screen withdraws its overlay
20
+ * writes; any other failure is left to the caller, which shows it.
21
+ */
22
+ export declare function useReportToolMetaRefusal(): (error: unknown) => void;
23
+ /** A failed overlay write as its dialog shows it: the muted OFF note with the server's
24
+ * message for a not-configured refusal, an error for anything else. */
25
+ export declare function ToolMetaWriteError({ error }: {
26
+ readonly error: unknown;
27
+ }): ReactNode;
28
+ //# sourceMappingURL=tool-meta-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-meta-access.d.ts","sourceRoot":"","sources":["../../src/components/tool-meta-access.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,OAAO,CAAC;AA8BpD,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAMD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,CAc5D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAQnE;AAED;wEACwE;AACxE,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAMpF"}
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from 'react';
3
+ import { errorMessage } from '../errors';
4
+ import { FeatureDisabled, featureDisabledMessage, isFeatureDisabled } from '../feature-disabled';
5
+ import { useCanWrite } from '../hooks/useCapabilities';
6
+ import { useFeatureOff, useReportFeatureOff } from '../hooks/useSystemKinds';
7
+ import { ErrorState } from './primitives';
8
+ /** The kind-status kind of the tool-organization overlay store. */
9
+ const TOOL_META_KIND = 'tool_meta';
10
+ // The overlay write routes. Spelled here because the SDK takes no runtime import of
11
+ // the API client; the `satisfies` pin fails to compile if a route's method or path
12
+ // drifts from the generated route table.
13
+ const TOOL_META_WRITE_ROUTES = {
14
+ editTool: { method: 'PATCH', path: '/api/tool-meta/tools/{tool_name}' },
15
+ createFolder: { method: 'POST', path: '/api/tool-meta/folders' },
16
+ renameFolder: { method: 'POST', path: '/api/tool-meta/folders/{folder_id}/rename' },
17
+ moveFolder: { method: 'POST', path: '/api/tool-meta/folders/{folder_id}/move' },
18
+ deleteFolder: { method: 'DELETE', path: '/api/tool-meta/folders/{folder_id}' },
19
+ };
20
+ function useRouteOpen(route) {
21
+ return useCanWrite(route.path, route.method);
22
+ }
23
+ /**
24
+ * The overlay writes the caller may be offered: each one's own route reached by the
25
+ * projection (fail closed until the projection is ready) and the tool_meta store not
26
+ * known OFF.
27
+ */
28
+ export function useToolMetaWriteAccess() {
29
+ const off = useFeatureOff(TOOL_META_KIND);
30
+ const editTool = useRouteOpen(TOOL_META_WRITE_ROUTES.editTool);
31
+ const createFolder = useRouteOpen(TOOL_META_WRITE_ROUTES.createFolder);
32
+ const renameFolder = useRouteOpen(TOOL_META_WRITE_ROUTES.renameFolder);
33
+ const moveFolder = useRouteOpen(TOOL_META_WRITE_ROUTES.moveFolder);
34
+ const deleteFolder = useRouteOpen(TOOL_META_WRITE_ROUTES.deleteFolder);
35
+ return {
36
+ editTool: editTool && !off,
37
+ createFolder: createFolder && !off,
38
+ renameFolder: renameFolder && !off,
39
+ moveFolder: moveFolder && !off,
40
+ deleteFolder: deleteFolder && !off,
41
+ };
42
+ }
43
+ /**
44
+ * Hand a failed overlay write here: a not-configured refusal (501
45
+ * `tool-meta-not-configured`) is recorded so every screen withdraws its overlay
46
+ * writes; any other failure is left to the caller, which shows it.
47
+ */
48
+ export function useReportToolMetaRefusal() {
49
+ const reportOff = useReportFeatureOff();
50
+ return useCallback((error) => {
51
+ if (isFeatureDisabled(error))
52
+ reportOff(TOOL_META_KIND, featureDisabledMessage(error));
53
+ }, [reportOff]);
54
+ }
55
+ /** A failed overlay write as its dialog shows it: the muted OFF note with the server's
56
+ * message for a not-configured refusal, an error for anything else. */
57
+ export function ToolMetaWriteError({ error }) {
58
+ if (error === null || error === undefined)
59
+ return null;
60
+ if (isFeatureDisabled(error)) {
61
+ return _jsx(FeatureDisabled, { feature: "Tool metadata", message: featureDisabledMessage(error) });
62
+ }
63
+ return _jsx(ErrorState, { message: errorMessage(error) });
64
+ }
65
+ //# sourceMappingURL=tool-meta-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-meta-access.js","sourceRoot":"","sources":["../../src/components/tool-meta-access.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `ToolPicker`'s typed entry: the control it draws when the session may not list tools
3
+ * (the read answered 403). The server checks a named tool on save, so a reader who
4
+ * knows the name can still fill the field; the note under the input says why there is
5
+ * no list.
6
+ *
7
+ * The input holds a draft while the reader types and hands the trimmed name to
8
+ * `onChange` on blur or Enter, so a host that acts on every change (an "add" control
9
+ * that appends each emitted name) receives one whole name, never each keystroke. Enter
10
+ * commits instead of submitting the enclosing form, since the form would otherwise read
11
+ * the value from before the commit. A blank draft emits nothing: the input shows the
12
+ * stored value again.
13
+ */
14
+ import { type ReactNode } from 'react';
15
+ /** The sentence under the typed entry, naming why there is no list and what saving does. */
16
+ export declare const TOOL_LIST_REFUSED_NOTE = "This session cannot list tools, so type the tool's exact name. Saving checks that the deployment serves it.";
17
+ export interface ToolNameEntryProps {
18
+ /** The stored name, or `null` for none. */
19
+ readonly value: string | null;
20
+ readonly onChange: (toolName: string) => void;
21
+ readonly disabled: boolean;
22
+ /** Names the input when no enclosing `Field` labels it; a `Field`'s label wins. */
23
+ readonly ariaLabel: string | undefined;
24
+ }
25
+ export declare function ToolNameEntry({ value, onChange, disabled, ariaLabel, }: ToolNameEntryProps): ReactNode;
26
+ //# sourceMappingURL=tool-name-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-name-entry.d.ts","sourceRoot":"","sources":["../../src/components/tool-name-entry.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAsB,KAAK,SAAS,EAAmB,MAAM,OAAO,CAAC;AAK5E,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,gHAC4E,CAAC;AAIhH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,kBAAkB,GAAG,SAAS,CAsChC"}