@tai42/studio-sdk 25.0.1 → 26.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 (262) hide show
  1. package/README.md +143 -26
  2. package/dist/components/action-menu.d.ts +30 -0
  3. package/dist/components/action-menu.d.ts.map +1 -0
  4. package/dist/components/action-menu.js +101 -0
  5. package/dist/components/action-menu.js.map +1 -0
  6. package/dist/components/agent-picker.d.ts +22 -0
  7. package/dist/components/agent-picker.d.ts.map +1 -0
  8. package/dist/components/agent-picker.js +17 -0
  9. package/dist/components/agent-picker.js.map +1 -0
  10. package/dist/components/channel-picker.d.ts +27 -0
  11. package/dist/components/channel-picker.d.ts.map +1 -0
  12. package/dist/components/channel-picker.js +26 -0
  13. package/dist/components/channel-picker.js.map +1 -0
  14. package/dist/components/components.css +226 -8
  15. package/dist/components/confirm-dialog.d.ts +3 -1
  16. package/dist/components/confirm-dialog.d.ts.map +1 -1
  17. package/dist/components/confirm-dialog.js +2 -2
  18. package/dist/components/confirm-dialog.js.map +1 -1
  19. package/dist/components/execution-key-picker.d.ts +26 -10
  20. package/dist/components/execution-key-picker.d.ts.map +1 -1
  21. package/dist/components/execution-key-picker.js +134 -15
  22. package/dist/components/execution-key-picker.js.map +1 -1
  23. package/dist/components/extension-combo-builder.d.ts +7 -7
  24. package/dist/components/extension-combo-builder.d.ts.map +1 -1
  25. package/dist/components/extension-combo-builder.js +42 -16
  26. package/dist/components/extension-combo-builder.js.map +1 -1
  27. package/dist/components/extension-combo-parts.d.ts +13 -11
  28. package/dist/components/extension-combo-parts.d.ts.map +1 -1
  29. package/dist/components/extension-combo-parts.js +10 -19
  30. package/dist/components/extension-combo-parts.js.map +1 -1
  31. package/dist/components/extension-config-editor.d.ts +33 -0
  32. package/dist/components/extension-config-editor.d.ts.map +1 -0
  33. package/dist/components/extension-config-editor.js +190 -0
  34. package/dist/components/extension-config-editor.js.map +1 -0
  35. package/dist/components/extension-grouping.d.ts +4 -41
  36. package/dist/components/extension-grouping.d.ts.map +1 -1
  37. package/dist/components/extension-grouping.js +1 -48
  38. package/dist/components/extension-grouping.js.map +1 -1
  39. package/dist/components/extension-picker.d.ts +4 -3
  40. package/dist/components/extension-picker.d.ts.map +1 -1
  41. package/dist/components/extension-picker.js +6 -6
  42. package/dist/components/extension-picker.js.map +1 -1
  43. package/dist/components/fleet-report.d.ts +8 -3
  44. package/dist/components/fleet-report.d.ts.map +1 -1
  45. package/dist/components/fleet-report.js +12 -2
  46. package/dist/components/fleet-report.js.map +1 -1
  47. package/dist/components/holder-kinds.d.ts +18 -0
  48. package/dist/components/holder-kinds.d.ts.map +1 -0
  49. package/dist/components/holder-kinds.js +41 -0
  50. package/dist/components/holder-kinds.js.map +1 -0
  51. package/dist/components/holder-list.d.ts +58 -0
  52. package/dist/components/holder-list.d.ts.map +1 -0
  53. package/dist/components/holder-list.js +77 -0
  54. package/dist/components/holder-list.js.map +1 -0
  55. package/dist/components/icons/index.d.ts +1 -1
  56. package/dist/components/icons/index.d.ts.map +1 -1
  57. package/dist/components/icons/index.js +1 -1
  58. package/dist/components/icons/index.js.map +1 -1
  59. package/dist/components/icons/nav-map.d.ts.map +1 -1
  60. package/dist/components/icons/nav-map.js +1 -3
  61. package/dist/components/icons/nav-map.js.map +1 -1
  62. package/dist/components/icons/nav-marks.d.ts +0 -4
  63. package/dist/components/icons/nav-marks.d.ts.map +1 -1
  64. package/dist/components/icons/nav-marks.js +0 -4
  65. package/dist/components/icons/nav-marks.js.map +1 -1
  66. package/dist/components/named-list-picker.d.ts +39 -0
  67. package/dist/components/named-list-picker.d.ts.map +1 -0
  68. package/dist/components/named-list-picker.js +61 -0
  69. package/dist/components/named-list-picker.js.map +1 -0
  70. package/dist/components/named-list-test-utils.d.ts +23 -0
  71. package/dist/components/named-list-test-utils.d.ts.map +1 -0
  72. package/dist/components/named-list-test-utils.js +33 -0
  73. package/dist/components/named-list-test-utils.js.map +1 -0
  74. package/dist/components/recycle-roll.d.ts +23 -0
  75. package/dist/components/recycle-roll.d.ts.map +1 -0
  76. package/dist/components/recycle-roll.js +47 -0
  77. package/dist/components/recycle-roll.js.map +1 -0
  78. package/dist/components/stepper.d.ts +28 -0
  79. package/dist/components/stepper.d.ts.map +1 -0
  80. package/dist/components/stepper.js +33 -0
  81. package/dist/components/stepper.js.map +1 -0
  82. package/dist/components/subject-section.d.ts +2 -1
  83. package/dist/components/subject-section.d.ts.map +1 -1
  84. package/dist/components/subject-section.js +10 -5
  85. package/dist/components/subject-section.js.map +1 -1
  86. package/dist/components/tokens.css +31 -41
  87. package/dist/components/tokens.d.ts +3 -4
  88. package/dist/components/tokens.d.ts.map +1 -1
  89. package/dist/components/tokens.js +5 -13
  90. package/dist/components/tokens.js.map +1 -1
  91. package/dist/components/tool-picker-parts.d.ts +5 -1
  92. package/dist/components/tool-picker-parts.d.ts.map +1 -1
  93. package/dist/components/tool-picker-parts.js +8 -6
  94. package/dist/components/tool-picker-parts.js.map +1 -1
  95. package/dist/components/tool-picker.d.ts +77 -2
  96. package/dist/components/tool-picker.d.ts.map +1 -1
  97. package/dist/components/tool-picker.js +87 -29
  98. package/dist/components/tool-picker.js.map +1 -1
  99. package/dist/components/version-history-panel.d.ts +7 -1
  100. package/dist/components/version-history-panel.d.ts.map +1 -1
  101. package/dist/components/version-history-panel.js +2 -2
  102. package/dist/components/version-history-panel.js.map +1 -1
  103. package/dist/components/version-history-rows.d.ts +4 -2
  104. package/dist/components/version-history-rows.d.ts.map +1 -1
  105. package/dist/components/version-history-rows.js +14 -2
  106. package/dist/components/version-history-rows.js.map +1 -1
  107. package/dist/errors.d.ts +5 -0
  108. package/dist/errors.d.ts.map +1 -1
  109. package/dist/errors.js +7 -0
  110. package/dist/errors.js.map +1 -1
  111. package/dist/hooks/useApi.d.ts +524 -197
  112. package/dist/hooks/useApi.d.ts.map +1 -1
  113. package/dist/hooks/useCapabilities.d.ts +43 -10
  114. package/dist/hooks/useCapabilities.d.ts.map +1 -1
  115. package/dist/hooks/useCapabilities.js +39 -10
  116. package/dist/hooks/useCapabilities.js.map +1 -1
  117. package/dist/index.d.ts +25 -12
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +14 -6
  120. package/dist/index.js.map +1 -1
  121. package/dist/marketplace-install/env-var-fields.d.ts +17 -0
  122. package/dist/marketplace-install/env-var-fields.d.ts.map +1 -0
  123. package/dist/marketplace-install/env-var-fields.js +22 -0
  124. package/dist/marketplace-install/env-var-fields.js.map +1 -0
  125. package/dist/marketplace-install/index.d.ts +18 -0
  126. package/dist/marketplace-install/index.d.ts.map +1 -0
  127. package/dist/marketplace-install/index.js +8 -0
  128. package/dist/marketplace-install/index.js.map +1 -0
  129. package/dist/marketplace-install/install-env.d.ts +21 -0
  130. package/dist/marketplace-install/install-env.d.ts.map +1 -0
  131. package/dist/marketplace-install/install-env.js +22 -0
  132. package/dist/marketplace-install/install-env.js.map +1 -0
  133. package/dist/marketplace-install/install-mount.d.ts +42 -0
  134. package/dist/marketplace-install/install-mount.d.ts.map +1 -0
  135. package/dist/marketplace-install/install-mount.js +62 -0
  136. package/dist/marketplace-install/install-mount.js.map +1 -0
  137. package/dist/marketplace-install/install-report.d.ts +14 -0
  138. package/dist/marketplace-install/install-report.d.ts.map +1 -0
  139. package/dist/marketplace-install/install-report.js +19 -0
  140. package/dist/marketplace-install/install-report.js.map +1 -0
  141. package/dist/marketplace-install/install-shell.d.ts +34 -0
  142. package/dist/marketplace-install/install-shell.d.ts.map +1 -0
  143. package/dist/marketplace-install/install-shell.js +32 -0
  144. package/dist/marketplace-install/install-shell.js.map +1 -0
  145. package/dist/marketplace-install/mount-install.d.ts +41 -0
  146. package/dist/marketplace-install/mount-install.d.ts.map +1 -0
  147. package/dist/marketplace-install/mount-install.js +90 -0
  148. package/dist/marketplace-install/mount-install.js.map +1 -0
  149. package/dist/marketplace-install/plugin-detail.d.ts +17 -0
  150. package/dist/marketplace-install/plugin-detail.d.ts.map +1 -0
  151. package/dist/marketplace-install/plugin-detail.js +41 -0
  152. package/dist/marketplace-install/plugin-detail.js.map +1 -0
  153. package/dist/marketplace-install/plugin-install.d.ts +27 -0
  154. package/dist/marketplace-install/plugin-install.d.ts.map +1 -0
  155. package/dist/marketplace-install/plugin-install.js +89 -0
  156. package/dist/marketplace-install/plugin-install.js.map +1 -0
  157. package/dist/marketplace-install/route-items.d.ts +14 -0
  158. package/dist/marketplace-install/route-items.d.ts.map +1 -0
  159. package/dist/marketplace-install/route-items.js +11 -0
  160. package/dist/marketplace-install/route-items.js.map +1 -0
  161. package/dist/marketplace-install/use-debounced-value.d.ts +6 -0
  162. package/dist/marketplace-install/use-debounced-value.d.ts.map +1 -0
  163. package/dist/marketplace-install/use-debounced-value.js +18 -0
  164. package/dist/marketplace-install/use-debounced-value.js.map +1 -0
  165. package/dist/marketplace-install/use-install-action.d.ts +26 -0
  166. package/dist/marketplace-install/use-install-action.d.ts.map +1 -0
  167. package/dist/marketplace-install/use-install-action.js +35 -0
  168. package/dist/marketplace-install/use-install-action.js.map +1 -0
  169. package/dist/marketplace-install/use-install-preview.d.ts +33 -0
  170. package/dist/marketplace-install/use-install-preview.d.ts.map +1 -0
  171. package/dist/marketplace-install/use-install-preview.js +44 -0
  172. package/dist/marketplace-install/use-install-preview.js.map +1 -0
  173. package/dist/marketplace-install/use-mount-install.d.ts +80 -0
  174. package/dist/marketplace-install/use-mount-install.d.ts.map +1 -0
  175. package/dist/marketplace-install/use-mount-install.js +75 -0
  176. package/dist/marketplace-install/use-mount-install.js.map +1 -0
  177. package/dist/navigation/index.d.ts +1 -1
  178. package/dist/navigation/index.d.ts.map +1 -1
  179. package/dist/navigation/index.js.map +1 -1
  180. package/dist/navigation/types.d.ts +23 -7
  181. package/dist/navigation/types.d.ts.map +1 -1
  182. package/dist/plugin/registry.d.ts +0 -8
  183. package/dist/plugin/registry.d.ts.map +1 -1
  184. package/dist/plugin/registry.js +25 -1
  185. package/dist/plugin/registry.js.map +1 -1
  186. package/dist/plugin/types.d.ts +36 -12
  187. package/dist/plugin/types.d.ts.map +1 -1
  188. package/dist/plugin/version.d.ts +6 -4
  189. package/dist/plugin/version.d.ts.map +1 -1
  190. package/dist/plugin/version.js +6 -4
  191. package/dist/plugin/version.js.map +1 -1
  192. package/dist/query-keys.d.ts +45 -4
  193. package/dist/query-keys.d.ts.map +1 -1
  194. package/dist/query-keys.js +52 -4
  195. package/dist/query-keys.js.map +1 -1
  196. package/dist/schema-form/json-schema-meta.d.ts +3 -0
  197. package/dist/schema-form/json-schema-meta.d.ts.map +1 -0
  198. package/dist/schema-form/json-schema-meta.js +3 -0
  199. package/dist/schema-form/json-schema-meta.js.map +1 -0
  200. package/dist/testing.d.ts +2 -0
  201. package/dist/testing.d.ts.map +1 -1
  202. package/dist/testing.js +2 -0
  203. package/dist/testing.js.map +1 -1
  204. package/dist/token-rules.d.ts +26 -0
  205. package/dist/token-rules.d.ts.map +1 -0
  206. package/dist/token-rules.js +64 -0
  207. package/dist/token-rules.js.map +1 -0
  208. package/package.json +2 -2
  209. package/src/components/action-menu.tsx +160 -0
  210. package/src/components/agent-picker.tsx +53 -0
  211. package/src/components/channel-picker.tsx +68 -0
  212. package/src/components/components.css +226 -8
  213. package/src/components/confirm-dialog.tsx +4 -1
  214. package/src/components/execution-key-picker.tsx +252 -36
  215. package/src/components/extension-combo-builder.tsx +61 -29
  216. package/src/components/extension-combo-parts.tsx +28 -38
  217. package/src/components/extension-config-editor.tsx +307 -0
  218. package/src/components/extension-grouping.ts +4 -73
  219. package/src/components/extension-picker.tsx +13 -13
  220. package/src/components/fleet-report.tsx +38 -4
  221. package/src/components/holder-kinds.ts +60 -0
  222. package/src/components/holder-list.tsx +163 -0
  223. package/src/components/icons/index.ts +0 -2
  224. package/src/components/icons/nav-map.ts +0 -4
  225. package/src/components/icons/nav-marks.tsx +0 -15
  226. package/src/components/named-list-picker.tsx +182 -0
  227. package/src/components/named-list-test-utils.tsx +47 -0
  228. package/src/components/recycle-roll.tsx +120 -0
  229. package/src/components/stepper.tsx +111 -0
  230. package/src/components/subject-section.tsx +10 -5
  231. package/src/components/tokens.css +31 -41
  232. package/src/components/tokens.ts +5 -13
  233. package/src/components/tool-picker-parts.tsx +17 -6
  234. package/src/components/tool-picker.tsx +215 -41
  235. package/src/components/version-history-panel.tsx +8 -0
  236. package/src/components/version-history-rows.tsx +14 -2
  237. package/src/errors.ts +10 -0
  238. package/src/hooks/useCapabilities.ts +59 -10
  239. package/src/index.ts +54 -14
  240. package/src/marketplace-install/env-var-fields.tsx +59 -0
  241. package/src/marketplace-install/index.ts +17 -0
  242. package/src/marketplace-install/install-env.ts +39 -0
  243. package/src/marketplace-install/install-mount.ts +96 -0
  244. package/src/marketplace-install/install-report.tsx +54 -0
  245. package/src/marketplace-install/install-shell.tsx +99 -0
  246. package/src/marketplace-install/mount-install.tsx +290 -0
  247. package/src/marketplace-install/plugin-detail.ts +60 -0
  248. package/src/marketplace-install/plugin-install.tsx +221 -0
  249. package/src/marketplace-install/route-items.ts +20 -0
  250. package/src/marketplace-install/use-debounced-value.ts +18 -0
  251. package/src/marketplace-install/use-install-action.ts +60 -0
  252. package/src/marketplace-install/use-install-preview.ts +74 -0
  253. package/src/marketplace-install/use-mount-install.ts +116 -0
  254. package/src/navigation/index.ts +1 -0
  255. package/src/navigation/types.ts +27 -7
  256. package/src/plugin/registry.ts +19 -1
  257. package/src/plugin/types.ts +40 -12
  258. package/src/plugin/version.ts +6 -4
  259. package/src/query-keys.ts +71 -4
  260. package/src/schema-form/json-schema-meta.ts +2 -0
  261. package/src/testing.ts +2 -0
  262. package/src/token-rules.ts +66 -0
@@ -167,6 +167,8 @@
167
167
  /* Radix hard-codes `tabIndex: 0` on every `TabsContent`, so a tab panel is a
168
168
  tab stop whether or not it holds one — it needs the ring like any other. */
169
169
  .tai-tabpanel:focus-visible,
170
+ .tai-stepper-button:focus-visible,
171
+ .tai-action-menu-item:focus-visible,
170
172
  .tai-dialog:focus-visible {
171
173
  outline: 2px solid var(--tai-color-focus-ring);
172
174
  outline-offset: 2px;
@@ -279,14 +281,14 @@
279
281
  }
280
282
 
281
283
  .tai-btn-danger {
282
- background: var(--tai-color-danger);
283
- border-color: var(--tai-color-danger);
284
- color: var(--tai-color-danger-text);
284
+ background: var(--tai-color-destructive);
285
+ border-color: var(--tai-color-destructive);
286
+ color: var(--tai-color-on-destructive);
285
287
  }
286
288
 
287
289
  .tai-btn-danger:hover:not(:disabled):not([aria-disabled='true']) {
288
- background: var(--tai-color-danger-hover);
289
- border-color: var(--tai-color-danger-hover);
290
+ background: var(--tai-color-destructive-hover);
291
+ border-color: var(--tai-color-destructive-hover);
290
292
  }
291
293
 
292
294
  /* A square button whose only content is a 16 px icon; its accessible name
@@ -331,6 +333,34 @@
331
333
  color: var(--tai-color-accent-hover);
332
334
  }
333
335
 
336
+ /* -- Holder list ----------------------------------------------------------
337
+ The things that still use a name, each a link to where it lives. A long
338
+ list scrolls inside its own bordered region, which takes focus so the
339
+ keyboard can scroll it. */
340
+ .tai-holder-list {
341
+ padding: var(--tai-space-2) var(--tai-space-3);
342
+ max-height: 16rem;
343
+ overflow-y: auto;
344
+ color: var(--tai-color-text);
345
+ border: 1px solid var(--tai-color-border);
346
+ border-radius: var(--tai-radius-sm);
347
+ }
348
+
349
+ .tai-holder-list > ul {
350
+ margin: 0;
351
+ padding: 0;
352
+ list-style: none;
353
+ }
354
+
355
+ .tai-holder-list > ul > li + li {
356
+ margin-top: var(--tai-space-1);
357
+ }
358
+
359
+ .tai-holder-lead {
360
+ margin: 0 0 var(--tai-space-2);
361
+ color: var(--tai-color-err-text);
362
+ }
363
+
334
364
  /* -- Icons ----------------------------------------------------------------
335
365
  Rendered at 16 px in currentColor at full opacity; a 24-unit viewBox and a
336
366
  1.6 stroke keep the whole set optically consistent. */
@@ -362,7 +392,9 @@
362
392
  .tai-nav-link > svg,
363
393
  .tai-segment > svg,
364
394
  .tai-select-trigger > svg,
365
- .tai-status > svg {
395
+ .tai-status > svg,
396
+ .tai-stepper-button > svg,
397
+ .tai-action-menu-item > svg {
366
398
  flex: none;
367
399
  }
368
400
 
@@ -1236,12 +1268,14 @@
1236
1268
  .tai-table .tai-choice,
1237
1269
  .tai-table .tai-nav-item,
1238
1270
  .tai-table .tai-nav-link,
1239
- .tai-table .tai-select-trigger {
1271
+ .tai-table .tai-select-trigger,
1272
+ .tai-table .tai-stepper-button,
1273
+ .tai-table .tai-action-menu-item {
1240
1274
  min-width: auto;
1241
1275
  overflow-wrap: normal;
1242
1276
  }
1243
1277
 
1244
- /* `.tai-segment` takes the wrap half ONLY. The eight above carry
1278
+ /* `.tai-segment` takes the wrap half ONLY. The ten above carry
1245
1279
  `min-width: 0`, so `auto` is what hands them an intrinsic minimum back;
1246
1280
  this one carries a 28 px / 44 px POINTER TARGET (WCAG 2.5.8), and `auto` on
1247
1281
  a flex item is the CONTENT-based minimum — for the icon-only option this
@@ -1838,6 +1872,10 @@
1838
1872
  gap: var(--tai-space-4);
1839
1873
  }
1840
1874
 
1875
+ .tai-stack-1 {
1876
+ gap: var(--tai-space-1);
1877
+ }
1878
+
1841
1879
  .tai-stack-2 {
1842
1880
  gap: var(--tai-space-2);
1843
1881
  }
@@ -2275,6 +2313,176 @@
2275
2313
  }
2276
2314
  }
2277
2315
 
2316
+ /* -- Stepper: a flow's step progress. A 24 px marker per step, a 2 px connector
2317
+ between steps (the ok fill after a done step), the label beside it. -- */
2318
+ .tai-stepper {
2319
+ display: flex;
2320
+ flex-wrap: wrap;
2321
+ align-items: center;
2322
+ gap: var(--tai-space-2);
2323
+ margin: 0;
2324
+ padding: 0;
2325
+ list-style: none;
2326
+ }
2327
+
2328
+ .tai-stepper-step {
2329
+ display: flex;
2330
+ align-items: center;
2331
+ gap: var(--tai-space-2);
2332
+ }
2333
+
2334
+ .tai-stepper-step + .tai-stepper-step::before {
2335
+ content: '';
2336
+ display: block;
2337
+ width: var(--tai-space-6);
2338
+ height: 2px;
2339
+ background: var(--tai-color-border);
2340
+ transition: background-color var(--tai-motion-fast);
2341
+ }
2342
+
2343
+ .tai-stepper-step-done + .tai-stepper-step::before {
2344
+ background: var(--tai-color-ok-fill);
2345
+ }
2346
+
2347
+ .tai-stepper-button {
2348
+ display: inline-flex;
2349
+ align-items: center;
2350
+ gap: var(--tai-space-2);
2351
+ min-width: 0;
2352
+ padding: 0;
2353
+ border: 0;
2354
+ background: none;
2355
+ font: inherit;
2356
+ color: inherit;
2357
+ overflow-wrap: anywhere;
2358
+ }
2359
+
2360
+ button.tai-stepper-button {
2361
+ cursor: pointer;
2362
+ border-radius: var(--tai-radius-sm);
2363
+ }
2364
+
2365
+ .tai-stepper-marker {
2366
+ display: inline-flex;
2367
+ align-items: center;
2368
+ justify-content: center;
2369
+ flex-shrink: 0;
2370
+ width: 24px;
2371
+ height: 24px;
2372
+ border-radius: 50%;
2373
+ font-size: var(--tai-text-sm);
2374
+ font-weight: 600;
2375
+ transition:
2376
+ background-color var(--tai-motion-fast),
2377
+ box-shadow var(--tai-motion-fast),
2378
+ color var(--tai-motion-fast);
2379
+ }
2380
+
2381
+ .tai-stepper-marker > svg {
2382
+ width: 14px;
2383
+ height: 14px;
2384
+ }
2385
+
2386
+ .tai-stepper-marker-done {
2387
+ background: var(--tai-color-ok-fill);
2388
+ color: var(--tai-color-on-fill);
2389
+ }
2390
+
2391
+ .tai-stepper-marker-current {
2392
+ box-shadow: inset 0 0 0 2px var(--tai-color-heading);
2393
+ color: var(--tai-color-heading);
2394
+ }
2395
+
2396
+ .tai-stepper-marker-upcoming {
2397
+ box-shadow: inset 0 0 0 1px var(--tai-color-border-strong);
2398
+ color: var(--tai-color-text-muted);
2399
+ }
2400
+
2401
+ .tai-stepper-marker-error {
2402
+ background: var(--tai-color-err-fill);
2403
+ color: var(--tai-color-on-fill);
2404
+ }
2405
+
2406
+ .tai-stepper-step-current .tai-stepper-label {
2407
+ font-weight: 600;
2408
+ }
2409
+
2410
+ .tai-stepper-step-upcoming .tai-stepper-label {
2411
+ color: var(--tai-color-text-muted);
2412
+ }
2413
+
2414
+ /* The "Step 2 of 3: " prefix is the narrow layout's; the wide row shows every step. */
2415
+ .tai-stepper-position {
2416
+ display: none;
2417
+ }
2418
+
2419
+ /* -- ActionMenu: an overflow menu stacked in flow under its trigger. -- */
2420
+ .tai-action-menu {
2421
+ position: relative;
2422
+ display: inline-block;
2423
+ }
2424
+
2425
+ .tai-action-menu-list {
2426
+ position: absolute;
2427
+ inset-inline-end: 0;
2428
+ top: calc(100% + var(--tai-space-1));
2429
+ z-index: var(--tai-z-dropdown);
2430
+ display: flex;
2431
+ flex-direction: column;
2432
+ min-width: 10rem;
2433
+ padding: var(--tai-space-1);
2434
+ border: 1px solid var(--tai-color-border);
2435
+ border-radius: var(--tai-radius-md);
2436
+ background: var(--tai-color-surface-raised);
2437
+ box-shadow: var(--tai-shadow-lift);
2438
+ }
2439
+
2440
+ .tai-action-menu-item {
2441
+ display: flex;
2442
+ align-items: center;
2443
+ min-width: 0;
2444
+ padding: var(--tai-space-2) var(--tai-space-3);
2445
+ border: 0;
2446
+ border-radius: var(--tai-radius-sm);
2447
+ background: none;
2448
+ font: inherit;
2449
+ font-size: var(--tai-text-md);
2450
+ color: var(--tai-color-text);
2451
+ text-align: start;
2452
+ overflow-wrap: anywhere;
2453
+ cursor: pointer;
2454
+ }
2455
+
2456
+ .tai-action-menu-item:hover,
2457
+ .tai-action-menu-item:focus-visible {
2458
+ background: var(--tai-color-surface);
2459
+ }
2460
+
2461
+ .tai-action-menu-item-danger {
2462
+ color: var(--tai-color-err-text);
2463
+ }
2464
+
2465
+ /* <640: the stepper collapses to its current step, "Step 2 of 3: Pick tools";
2466
+ the other steps stay in the list for assistive technology. */
2467
+ @media (max-width: 639px) {
2468
+ .tai-stepper-step:not(.tai-stepper-step-current) {
2469
+ position: absolute;
2470
+ width: 1px;
2471
+ height: 1px;
2472
+ overflow: hidden;
2473
+ clip-path: inset(50%);
2474
+ white-space: nowrap;
2475
+ }
2476
+
2477
+ .tai-stepper-step + .tai-stepper-step::before {
2478
+ display: none;
2479
+ }
2480
+
2481
+ .tai-stepper-position {
2482
+ display: inline;
2483
+ }
2484
+ }
2485
+
2278
2486
  /* <640 phone: the rail gives way to a sticky 56 px top bar; the shell, the card
2279
2487
  grid and the page header each fall to a single column, and the page tightens
2280
2488
  its padding and its gap. */
@@ -2343,6 +2551,11 @@
2343
2551
  min-height: var(--tai-control-height-coarse);
2344
2552
  }
2345
2553
 
2554
+ .tai-stepper-button,
2555
+ .tai-action-menu-item {
2556
+ min-height: var(--tai-control-height-coarse);
2557
+ }
2558
+
2346
2559
  .tai-icon-btn {
2347
2560
  width: var(--tai-control-height-coarse);
2348
2561
  height: var(--tai-control-height-coarse);
@@ -2417,6 +2630,11 @@
2417
2630
  transition: none;
2418
2631
  }
2419
2632
 
2633
+ .tai-stepper-marker,
2634
+ .tai-stepper-step + .tai-stepper-step::before {
2635
+ transition: none;
2636
+ }
2637
+
2420
2638
  .tai-btn:hover:not(:disabled):not([aria-disabled='true']),
2421
2639
  .tai-card-interactive:hover,
2422
2640
  .tai-card-interactive:focus-within {
@@ -42,6 +42,8 @@ export interface ConfirmDialogProps {
42
42
  * the confirm button — the action can only refuse, so there is nothing to retry.
43
43
  */
44
44
  readonly disabledNote?: ReactNode;
45
+ /** Hold the confirm button disabled while the caller knows the action cannot pass. */
46
+ readonly confirmDisabled?: boolean;
45
47
  readonly confirmVariant?: 'primary' | 'danger';
46
48
  /** The cancel button's label; defaults to `Cancel`. Set it when the negative
47
49
  * choice reads better as a specific verb (e.g. `Keep existing`). */
@@ -49,5 +51,5 @@ export interface ConfirmDialogProps {
49
51
  /** The prompt body — what the operator is confirming. */
50
52
  readonly children: ReactNode;
51
53
  }
52
- export declare function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, disabledNote, confirmVariant, cancelLabel, children, }: ConfirmDialogProps): ReactNode;
54
+ export declare function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, disabledNote, confirmDisabled, confirmVariant, cancelLabel, children, }: ConfirmDialogProps): ReactNode;
53
55
  //# sourceMappingURL=confirm-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/C;wEACoE;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAyB,EACzB,WAAsB,EACtB,QAAQ,GACT,EAAE,kBAAkB,GAAG,SAAS,CA2BhC"}
1
+ {"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;IAClC,sFAAsF;IACtF,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/C;wEACoE;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,eAAuB,EACvB,cAAyB,EACzB,WAAsB,EACtB,QAAQ,GACT,EAAE,kBAAkB,GAAG,SAAS,CA2BhC"}
@@ -2,10 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { errorMessage } from '../errors';
3
3
  import { Dialog } from './dialog';
4
4
  import { Button, ErrorState, Spinner } from './primitives';
5
- export function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, disabledNote, confirmVariant = 'danger', cancelLabel = 'Cancel', children, }) {
5
+ export function ConfirmDialog({ title, confirmLabel, pendingLabel, onConfirm, onClose, isPending, error, disabledNote, confirmDisabled = false, confirmVariant = 'danger', cancelLabel = 'Cancel', children, }) {
6
6
  return (_jsxs(Dialog, { title: title, open: true, onOpenChange: (next) => {
7
7
  if (!next)
8
8
  onClose();
9
- }, children: [children, disabledNote ?? (error != null ? _jsx(ErrorState, { message: errorMessage(error) }) : null), _jsxs("div", { className: "tai-dialog-actions", children: [_jsx(Button, { type: "button", onClick: onClose, children: cancelLabel }), _jsxs(Button, { type: "button", variant: confirmVariant, disabled: isPending || disabledNote != null, onClick: onConfirm, children: [isPending ? _jsx(Spinner, { label: pendingLabel }) : null, confirmLabel] })] })] }));
9
+ }, children: [children, disabledNote ?? (error != null ? _jsx(ErrorState, { message: errorMessage(error) }) : null), _jsxs("div", { className: "tai-dialog-actions", children: [_jsx(Button, { type: "button", onClick: onClose, children: cancelLabel }), _jsxs(Button, { type: "button", variant: confirmVariant, disabled: isPending || disabledNote != null || confirmDisabled, onClick: onConfirm, children: [isPending ? _jsx(Spinner, { label: pendingLabel }) : null, confirmLabel] })] })] }));
10
10
  }
11
11
  //# sourceMappingURL=confirm-dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.js","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAmC3D,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,GAAG,QAAQ,EACzB,WAAW,GAAG,QAAQ,EACtB,QAAQ,GACW;IACnB,OAAO,CACL,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,IAAI,QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;QACvB,CAAC,aAEA,QAAQ,EACR,YAAY,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EACtF,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,YACnC,WAAW,GACL,EACT,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,IAAI,YAAY,IAAI,IAAI,EAC3C,OAAO,EAAE,SAAS,aAEjB,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,YAAY,GAAI,CAAC,CAAC,CAAC,IAAI,EACnD,YAAY,IACN,IACL,IACC,CACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"confirm-dialog.js","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":";AAoBA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAqC3D,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,YAAY,EACZ,eAAe,GAAG,KAAK,EACvB,cAAc,GAAG,QAAQ,EACzB,WAAW,GAAG,QAAQ,EACtB,QAAQ,GACW;IACnB,OAAO,CACL,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,IAAI,QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;QACvB,CAAC,aAEA,QAAQ,EACR,YAAY,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EACtF,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,YACnC,WAAW,GACL,EACT,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,IAAI,YAAY,IAAI,IAAI,IAAI,eAAe,EAC9D,OAAO,EAAE,SAAS,aAEjB,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,YAAY,GAAI,CAAC,CAAC,CAAC,IAAI,EACnD,YAAY,IACN,IACL,IACC,CACV,CAAC;AACJ,CAAC"}
@@ -1,15 +1,19 @@
1
1
  /**
2
- * Picks the api key a fire / recurring run RUNS AS. Shared by every fire-path form
3
- * (hooks, trigger links, schedules). Presentational and prop-driven — the host
4
- * feature owns the api-key list query and hands it in, so this component (and the
5
- * SDK) stay free of a data-fetching library, exactly as {@link ToolPicker} does.
2
+ * Picks the api key a stored record (a route, a hook, a trigger link, a schedule)
3
+ * RUNS AS. Presentational and prop-driven — the host feature owns the api-key list
4
+ * query and hands it in, so this component (and the SDK) stay free of a
5
+ * data-fetching library, exactly as {@link ToolPicker} does.
6
6
  *
7
- * The server decides authorization; this only lists the pickable keys and renders
8
- * the read's loading / empty / error states. The host form renders the server's
9
- * refusal verbatim elsewhere.
7
+ * The `binding` decides what renders: nothing with access control off, a pending
8
+ * control while the session's projection loads, and otherwise the key list plus the
9
+ * session's own identity when it is an api key the list does not hold. A stored key
10
+ * the loaded list does not hold is flagged with what the server will make of it,
11
+ * compared with the session's identity. The server decides authorization; the host
12
+ * form renders its refusal verbatim elsewhere.
10
13
  */
11
14
  import type { TokensPayload } from '@tai42/api-client';
12
- import type { ReactNode } from 'react';
15
+ import { type ReactNode } from 'react';
16
+ import type { ExecutionKeyBinding } from '../hooks/useCapabilities';
13
17
  /**
14
18
  * The subset of the api-key list query this picker reads. A caller's TanStack
15
19
  * `UseQueryResult<TokensPayload>` satisfies it structurally, so the SDK names no
@@ -25,13 +29,25 @@ export interface ExecutionKeyQuery {
25
29
  }
26
30
  /** Resolved, and holding no key at all. */
27
31
  export declare function isExecutionKeyListEmpty(query: ExecutionKeyQuery): boolean;
32
+ /**
33
+ * Whether the form has a key to send: always with access control off, never while the
34
+ * projection is pending, and otherwise once the list read has answered (loaded, or
35
+ * refused with a 403) and the picker holds a value, lists a key, or offers a key
36
+ * session's own identity. Under a checked binding the picker renders its `Select`
37
+ * exactly while the list read is pending or this holds.
38
+ */
39
+ export declare function canHoldExecutionKey(query: ExecutionKeyQuery, binding: ExecutionKeyBinding, value: string): boolean;
28
40
  export interface ExecutionKeyPickerProps {
29
41
  /** The api-key list read the host feature owns and hands in. */
30
42
  readonly query: ExecutionKeyQuery;
43
+ /** How the host form binds its key (`useExecutionKeyBinding()`). */
44
+ readonly binding: ExecutionKeyBinding;
31
45
  readonly value: string;
32
46
  readonly onValueChange: (value: string) => void;
33
- /** The host form's required-field error, shown under the control. */
47
+ /** The host form's required-field error, shown under the control while a `Select` renders. */
34
48
  readonly error?: string | undefined;
49
+ /** The field's description; the default speaks of a fire. */
50
+ readonly description?: string;
35
51
  }
36
- export declare function ExecutionKeyPicker({ query, value, onValueChange, error, }: ExecutionKeyPickerProps): ReactNode;
52
+ export declare function ExecutionKeyPicker({ query, binding, value, onValueChange, error, description, }: ExecutionKeyPickerProps): ReactNode;
37
53
  //# sourceMappingURL=execution-key-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"execution-key-picker.d.ts","sourceRoot":"","sources":["../../src/components/execution-key-picker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,2CAA2C;AAC3C,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAEzE;AA4BD,MAAM,WAAW,uBAAuB;IACtC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,KAAK,EACL,aAAa,EACb,KAAK,GACN,EAAE,uBAAuB,GAAG,SAAS,CAsCrC"}
1
+ {"version":3,"file":"execution-key-picker.d.ts","sourceRoot":"","sources":["../../src/components/execution-key-picker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,0BAA0B,CAAC;AAMjF;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,2CAA2C;AAC3C,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAEzE;AA4BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,MAAM,GACZ,OAAO,CAST;AAqDD,MAAM,WAAW,uBAAuB;IACtC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA+HD,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,OAAO,EACP,KAAK,EACL,aAAa,EACb,KAAK,EACL,WAAiC,GAClC,EAAE,uBAAuB,GAAG,SAAS,CA6CrC"}
@@ -1,5 +1,7 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { errorMessage } from '../errors';
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useId } from 'react';
3
+ import { errorMessage, isForbiddenError } from '../errors';
4
+ import { Badge } from './badge';
3
5
  import { Field } from './field';
4
6
  import { ErrorState } from './primitives';
5
7
  import { Select } from './select';
@@ -32,18 +34,135 @@ function pickableKeys(keys) {
32
34
  return true;
33
35
  });
34
36
  }
35
- export function ExecutionKeyPicker({ query, value, onValueChange, error, }) {
36
- const listEmpty = isExecutionKeyListEmpty(query);
37
- return (_jsx(Field, { label: "Execution key", description: "The api key this fire runs AS. Every tool call it makes is authorized against that key's live grants \u2014 prefer a least-privilege service key over a human's broad one.",
38
- // Suppressed: the empty note / the ErrorState already say it.
39
- error: listEmpty || query.isError ? undefined : error,
40
- // Only the Select branch claims the field's control id; the error and
41
- // empty branches render no labelable element, so `for` would dangle.
42
- group: query.isError || listEmpty, children: query.isError ? (_jsx(ErrorState, { message: errorMessage(query.error), onRetry: () => {
43
- query.refetch();
44
- } })) : listEmpty ? (_jsx("p", { role: "status", style: { margin: 0, color: 'var(--tai-color-text-muted)' }, children: "No api keys available to run as. Mint one on the settings API-keys tab first." })) : (_jsx(Select, { options: pickableKeys(query.data ?? []).map((key) => ({
45
- value: key.user_id,
46
- label: keyLabel(key),
47
- })), value: value, placeholder: query.isPending ? 'Loading keys…' : 'Select an execution key', disabled: query.isPending, onValueChange: onValueChange })) }));
37
+ /**
38
+ * Whether the form has a key to send: always with access control off, never while the
39
+ * projection is pending, and otherwise once the list read has answered (loaded, or
40
+ * refused with a 403) and the picker holds a value, lists a key, or offers a key
41
+ * session's own identity. Under a checked binding the picker renders its `Select`
42
+ * exactly while the list read is pending or this holds.
43
+ */
44
+ export function canHoldExecutionKey(query, binding, value) {
45
+ if (binding.mode === 'unchecked')
46
+ return true;
47
+ if (binding.mode === 'pending')
48
+ return false;
49
+ return ((query.isSuccess || isForbiddenError(query.error)) &&
50
+ (value !== '' ||
51
+ (query.isSuccess && !isExecutionKeyListEmpty(query)) ||
52
+ binding.own.kind === 'key'));
53
+ }
54
+ /** The unlisted line's sentence for a stored key the key list does not hold. */
55
+ function unlistedKeyHint(value, own) {
56
+ if (own.admin) {
57
+ return `${value} is not a listed key. As an admin you may bind another identity; the server checks it on save.`;
58
+ }
59
+ if (own.kind === 'account') {
60
+ return `${value} is not a listed key. The server accepts only an api key you own; any other value is refused on save.`;
61
+ }
62
+ return `${value} is not a listed key. The server accepts an unlisted key only when it is your own identity; any other value is refused on save.`;
63
+ }
64
+ /** The second line: what the comparison of the value with the session's identity shows, or undefined when it shows
65
+ * nothing to say (a key session's own identity). */
66
+ function unlistedKeyNote(value, own) {
67
+ if (value === own.userId) {
68
+ return own.kind === 'account'
69
+ ? {
70
+ badge: 'not an api key',
71
+ text: `${value} is this session's account, not an api key, so the server will refuse it on save.`,
72
+ }
73
+ : undefined;
74
+ }
75
+ return {
76
+ badge: 'not your identity',
77
+ text: own.admin
78
+ ? `${value} is not this session's identity (${own.userId}).`
79
+ : `${value} is not this session's identity (${own.userId}), so the server will refuse it on save.`,
80
+ };
81
+ }
82
+ const DEFAULT_DESCRIPTION = "The api key this fire runs AS. Every tool call it makes is authorized against that key's live grants — prefer a least-privilege service key over a human's broad one.";
83
+ const FORBIDDEN_NOTE = 'This session cannot list api keys. Picking one needs read access to GET /api/auth/tokens-payload; ask an administrator to grant it.';
84
+ const KEY_EMPTY_NOTE = 'No api keys of yours are listed. Mint one on the settings API-keys tab to run as a narrower key.';
85
+ const ACCOUNT_EMPTY_NOTE = 'No api keys of yours are listed. You are signed in as an account, not an api key, so your own identity cannot be picked here. Mint a key on the settings API-keys tab first.';
86
+ const MUTED_LINE = { margin: 0, color: 'var(--tai-color-text-muted)' };
87
+ function MutedLine({ text }) {
88
+ return (_jsx("p", { role: "status", style: MUTED_LINE, children: text }));
89
+ }
90
+ /** The view while the binding is pending: a disabled `Select` and nothing else. */
91
+ const PENDING_VIEW = {
92
+ options: [],
93
+ selectRenders: true,
94
+ note: undefined,
95
+ unlisted: false,
96
+ ownOffered: false,
97
+ };
98
+ /** The `Select`'s options: the stored value no listed option carries (flagged once the list
99
+ * loaded), the session's own identity when offered, then the listed keys. */
100
+ function checkedOptions(stored, unlisted, forbidden, ownOffered, listed) {
101
+ const options = [];
102
+ if (stored !== null && (unlisted || forbidden)) {
103
+ options.push({ value: stored, label: unlisted ? `${stored} (not a listed key)` : stored });
104
+ }
105
+ if (ownOffered !== null) {
106
+ options.push({ value: ownOffered, label: `${ownOffered} — this session's identity` });
107
+ }
108
+ for (const key of listed)
109
+ options.push({ value: key.user_id, label: keyLabel(key) });
110
+ return options;
111
+ }
112
+ /** The muted note: the refused read's, or the empty list's for the session's kind. */
113
+ function checkedNote(query, own) {
114
+ if (isForbiddenError(query.error))
115
+ return FORBIDDEN_NOTE;
116
+ if (!isExecutionKeyListEmpty(query))
117
+ return undefined;
118
+ return own.kind === 'key' ? KEY_EMPTY_NOTE : ACCOUNT_EMPTY_NOTE;
119
+ }
120
+ function checkedView(query, own, value) {
121
+ const forbidden = isForbiddenError(query.error);
122
+ const listed = query.isSuccess ? pickableKeys(query.data ?? []) : [];
123
+ const answered = query.isSuccess || forbidden;
124
+ const ownOffered = own.kind === 'key' && answered && !listed.some((key) => key.user_id === own.userId);
125
+ const stored = value !== '' && !(ownOffered && value === own.userId) ? value : null;
126
+ const unlisted = query.isSuccess && stored !== null && !listed.some((key) => key.user_id === stored);
127
+ const options = checkedOptions(stored, unlisted, forbidden, ownOffered ? own.userId : null, listed);
128
+ const selectRenders = (query.isPending && !query.isError) ||
129
+ canHoldExecutionKey(query, { mode: 'checked', own }, value);
130
+ return { options, selectRenders, note: checkedNote(query, own), unlisted, ownOffered };
131
+ }
132
+ /** The lines under the `Select`: the unlisted hint, the own-identity hint and the comparison note. */
133
+ function KeyHints({ own, view, value, hintId, noteId, }) {
134
+ if (own === undefined)
135
+ return null;
136
+ const keyNote = view.unlisted ? unlistedKeyNote(value, own) : undefined;
137
+ return (_jsxs(_Fragment, { children: [view.unlisted ? (_jsxs("p", { id: hintId, className: "tai-field-hint", style: { margin: 0 }, children: [_jsx(Badge, { variant: "warning", children: "not a listed key" }), " ", unlistedKeyHint(value, own)] })) : null, view.ownOffered && value === own.userId ? (_jsx("p", { id: hintId, className: "tai-field-hint", style: { margin: 0 }, children: `This runs as this session's own identity, ${own.userId}, with its live grants.` })) : null, keyNote !== undefined ? (_jsxs("p", { id: noteId, role: "status", className: "tai-field-hint", style: { margin: 0 }, children: [_jsx(Badge, { variant: "warning", children: keyNote.badge }), " ", keyNote.text] })) : null] }));
138
+ }
139
+ /** The ids the `Select` is described by: the hint while one shows, the note while one shows. */
140
+ function describedByIds(own, view, value, hintId, noteId) {
141
+ if (own === undefined)
142
+ return undefined;
143
+ const hinted = view.unlisted || (view.ownOffered && value === own.userId);
144
+ const noted = view.unlisted && unlistedKeyNote(value, own) !== undefined;
145
+ const ids = [hinted ? hintId : undefined, noted ? noteId : undefined].filter((id) => id !== undefined);
146
+ return ids.length === 0 ? undefined : ids.join(' ');
147
+ }
148
+ export function ExecutionKeyPicker({ query, binding, value, onValueChange, error, description = DEFAULT_DESCRIPTION, }) {
149
+ const hintId = useId();
150
+ const noteId = useId();
151
+ if (binding.mode === 'unchecked')
152
+ return null;
153
+ if (binding.mode === 'checked' && query.isError && !isForbiddenError(query.error)) {
154
+ return (_jsx(Field, { label: "Execution key", description: description, group: true, children: _jsx(ErrorState, { message: errorMessage(query.error), onRetry: () => {
155
+ query.refetch();
156
+ } }) }));
157
+ }
158
+ // A pending binding renders the same tree as a pending list, so the control is not
159
+ // remounted when the binding resolves.
160
+ const own = binding.mode === 'checked' ? binding.own : undefined;
161
+ const view = own === undefined ? PENDING_VIEW : checkedView(query, own, value);
162
+ const loading = own === undefined || query.isPending;
163
+ return (_jsxs(Field, { label: "Execution key", description: description, error: view.selectRenders ? error : undefined,
164
+ // Only the Select claims the field's control id; with nothing to hold no
165
+ // labelable element renders, so `for` would dangle.
166
+ group: !view.selectRenders, children: [view.selectRenders ? (_jsx(Select, { options: view.options, value: value, placeholder: loading ? 'Loading keys…' : 'Select an execution key', disabled: loading, onValueChange: onValueChange, "aria-describedby": describedByIds(own, view, value, hintId, noteId) })) : null, view.note !== undefined ? _jsx(MutedLine, { text: view.note }) : null, _jsx(KeyHints, { own: own, view: view, value: value, hintId: hintId, noteId: noteId })] }));
48
167
  }
49
168
  //# sourceMappingURL=execution-key-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"execution-key-picker.js","sourceRoot":"","sources":["../../src/components/execution-key-picker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-key-picker.js","sourceRoot":"","sources":["../../src/components/execution-key-picker.tsx"],"names":[],"mappings":"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"}
@@ -10,16 +10,16 @@
10
10
  * - the current combos, each an ordered row of name `Badge`s with a per-combo Edit
11
11
  * (pull it back into the draft) and Remove;
12
12
  * - a combo UNDER CONSTRUCTION, authored with the shared `ExtensionPicker` (grouped
13
- * by kind, single-select for the non-stackable `backend` kind). When the draft
14
- * includes the `output_schema` extension, its config is authored inline with a
15
- * `SchemaEditor` (no title required); an "Add combo" / "Update combo" action
16
- * composes the elements — `output_schema` as `{ name, config: { schema } }`, every
17
- * other extension as a bare name — and writes it into the value.
13
+ * by kind, single-select for the non-stackable `backend` kind). An extension whose
14
+ * catalog entry declares a `config_schema` is authored as `{ name, config }` through
15
+ * its settings form; any other name stays a bare element, or the edited combo's own
16
+ * element when it survives the edit. An "Add extension set" / "Update extension
17
+ * set" action composes the elements and writes the combo into the value.
18
18
  *
19
19
  * The builder only blocks the client-trivial invalids: an EMPTY combo (Add is
20
20
  * disabled until the draft has ≥1 member), a DUPLICATE of a combo already in the
21
- * value (by name sequence; flagged inline, Add blocked), an INVALID `output_schema`
22
- * config (the `SchemaEditor` shows the parse/lint error and Add is blocked), and an
21
+ * value (by name sequence; flagged inline, Add blocked), an INVALID or not yet
22
+ * reported settings form of a drafted extension (Add is blocked), and an
23
23
  * UNKNOWN extension name in an existing combo (a name absent from `available`, which
24
24
  * happens when a plugin is removed after a preset was authored) — flagged inline on
25
25
  * that combo row and reported through `onValidityChange` so the caller can block
@@ -1 +1 @@
1
- {"version":3,"file":"extension-combo-builder.d.ts","sourceRoot":"","sources":["../../src/components/extension-combo-builder.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAa5D,MAAM,WAAW,0BAA0B;IACzC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,EAAE,CAAC;IACpD,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,EAAE,EAAE,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAoC,EACpC,gBAAgB,EAChB,cAAqB,GACtB,EAAE,0BAA0B,GAAG,SAAS,CAwGxC"}
1
+ {"version":3,"file":"extension-combo-builder.d.ts","sourceRoot":"","sources":["../../src/components/extension-combo-builder.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAe5D,MAAM,WAAW,0BAA0B;IACzC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,EAAE,CAAC;IACpD,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,EAAE,EAAE,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAoC,EACpC,gBAAgB,EAChB,cAAqB,GACtB,EAAE,0BAA0B,GAAG,SAAS,CAsIxC"}