@tai42/studio-sdk 25.0.1 → 27.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.
- package/README.md +143 -26
- package/dist/components/action-menu.d.ts +30 -0
- package/dist/components/action-menu.d.ts.map +1 -0
- package/dist/components/action-menu.js +101 -0
- package/dist/components/action-menu.js.map +1 -0
- package/dist/components/agent-picker.d.ts +22 -0
- package/dist/components/agent-picker.d.ts.map +1 -0
- package/dist/components/agent-picker.js +17 -0
- package/dist/components/agent-picker.js.map +1 -0
- package/dist/components/channel-picker.d.ts +27 -0
- package/dist/components/channel-picker.d.ts.map +1 -0
- package/dist/components/channel-picker.js +26 -0
- package/dist/components/channel-picker.js.map +1 -0
- package/dist/components/components.css +226 -8
- package/dist/components/confirm-dialog.d.ts +3 -1
- package/dist/components/confirm-dialog.d.ts.map +1 -1
- package/dist/components/confirm-dialog.js +2 -2
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/execution-key-picker.d.ts +26 -10
- package/dist/components/execution-key-picker.d.ts.map +1 -1
- package/dist/components/execution-key-picker.js +134 -15
- package/dist/components/execution-key-picker.js.map +1 -1
- package/dist/components/extension-combo-builder.d.ts +7 -7
- package/dist/components/extension-combo-builder.d.ts.map +1 -1
- package/dist/components/extension-combo-builder.js +42 -16
- package/dist/components/extension-combo-builder.js.map +1 -1
- package/dist/components/extension-combo-parts.d.ts +13 -11
- package/dist/components/extension-combo-parts.d.ts.map +1 -1
- package/dist/components/extension-combo-parts.js +10 -19
- package/dist/components/extension-combo-parts.js.map +1 -1
- package/dist/components/extension-config-editor.d.ts +33 -0
- package/dist/components/extension-config-editor.d.ts.map +1 -0
- package/dist/components/extension-config-editor.js +190 -0
- package/dist/components/extension-config-editor.js.map +1 -0
- package/dist/components/extension-grouping.d.ts +4 -41
- package/dist/components/extension-grouping.d.ts.map +1 -1
- package/dist/components/extension-grouping.js +1 -48
- package/dist/components/extension-grouping.js.map +1 -1
- package/dist/components/extension-picker.d.ts +4 -3
- package/dist/components/extension-picker.d.ts.map +1 -1
- package/dist/components/extension-picker.js +6 -6
- package/dist/components/extension-picker.js.map +1 -1
- package/dist/components/fleet-report.d.ts +8 -3
- package/dist/components/fleet-report.d.ts.map +1 -1
- package/dist/components/fleet-report.js +12 -2
- package/dist/components/fleet-report.js.map +1 -1
- package/dist/components/holder-kinds.d.ts +18 -0
- package/dist/components/holder-kinds.d.ts.map +1 -0
- package/dist/components/holder-kinds.js +41 -0
- package/dist/components/holder-kinds.js.map +1 -0
- package/dist/components/holder-list.d.ts +58 -0
- package/dist/components/holder-list.d.ts.map +1 -0
- package/dist/components/holder-list.js +77 -0
- package/dist/components/holder-list.js.map +1 -0
- package/dist/components/icons/index.d.ts +1 -1
- package/dist/components/icons/index.d.ts.map +1 -1
- package/dist/components/icons/index.js +1 -1
- package/dist/components/icons/index.js.map +1 -1
- package/dist/components/icons/nav-map.d.ts.map +1 -1
- package/dist/components/icons/nav-map.js +1 -3
- package/dist/components/icons/nav-map.js.map +1 -1
- package/dist/components/icons/nav-marks.d.ts +0 -4
- package/dist/components/icons/nav-marks.d.ts.map +1 -1
- package/dist/components/icons/nav-marks.js +0 -4
- package/dist/components/icons/nav-marks.js.map +1 -1
- package/dist/components/named-list-picker.d.ts +39 -0
- package/dist/components/named-list-picker.d.ts.map +1 -0
- package/dist/components/named-list-picker.js +61 -0
- package/dist/components/named-list-picker.js.map +1 -0
- package/dist/components/named-list-test-utils.d.ts +23 -0
- package/dist/components/named-list-test-utils.d.ts.map +1 -0
- package/dist/components/named-list-test-utils.js +33 -0
- package/dist/components/named-list-test-utils.js.map +1 -0
- package/dist/components/recycle-roll.d.ts +23 -0
- package/dist/components/recycle-roll.d.ts.map +1 -0
- package/dist/components/recycle-roll.js +47 -0
- package/dist/components/recycle-roll.js.map +1 -0
- package/dist/components/stepper.d.ts +28 -0
- package/dist/components/stepper.d.ts.map +1 -0
- package/dist/components/stepper.js +33 -0
- package/dist/components/stepper.js.map +1 -0
- package/dist/components/subject-section.d.ts +2 -1
- package/dist/components/subject-section.d.ts.map +1 -1
- package/dist/components/subject-section.js +10 -5
- package/dist/components/subject-section.js.map +1 -1
- package/dist/components/tokens.css +31 -41
- package/dist/components/tokens.d.ts +3 -4
- package/dist/components/tokens.d.ts.map +1 -1
- package/dist/components/tokens.js +5 -13
- package/dist/components/tokens.js.map +1 -1
- package/dist/components/tool-picker-parts.d.ts +5 -1
- package/dist/components/tool-picker-parts.d.ts.map +1 -1
- package/dist/components/tool-picker-parts.js +8 -6
- package/dist/components/tool-picker-parts.js.map +1 -1
- package/dist/components/tool-picker.d.ts +77 -2
- package/dist/components/tool-picker.d.ts.map +1 -1
- package/dist/components/tool-picker.js +87 -29
- package/dist/components/tool-picker.js.map +1 -1
- package/dist/components/version-history-panel.d.ts +7 -1
- package/dist/components/version-history-panel.d.ts.map +1 -1
- package/dist/components/version-history-panel.js +2 -2
- package/dist/components/version-history-panel.js.map +1 -1
- package/dist/components/version-history-rows.d.ts +4 -2
- package/dist/components/version-history-rows.d.ts.map +1 -1
- package/dist/components/version-history-rows.js +14 -2
- package/dist/components/version-history-rows.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -0
- package/dist/errors.js.map +1 -1
- package/dist/hooks/useApi.d.ts +524 -197
- package/dist/hooks/useApi.d.ts.map +1 -1
- package/dist/hooks/useCapabilities.d.ts +43 -10
- package/dist/hooks/useCapabilities.d.ts.map +1 -1
- package/dist/hooks/useCapabilities.js +39 -10
- package/dist/hooks/useCapabilities.js.map +1 -1
- package/dist/index.d.ts +25 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -6
- package/dist/index.js.map +1 -1
- package/dist/marketplace-install/env-var-fields.d.ts +17 -0
- package/dist/marketplace-install/env-var-fields.d.ts.map +1 -0
- package/dist/marketplace-install/env-var-fields.js +22 -0
- package/dist/marketplace-install/env-var-fields.js.map +1 -0
- package/dist/marketplace-install/index.d.ts +18 -0
- package/dist/marketplace-install/index.d.ts.map +1 -0
- package/dist/marketplace-install/index.js +8 -0
- package/dist/marketplace-install/index.js.map +1 -0
- package/dist/marketplace-install/install-env.d.ts +21 -0
- package/dist/marketplace-install/install-env.d.ts.map +1 -0
- package/dist/marketplace-install/install-env.js +22 -0
- package/dist/marketplace-install/install-env.js.map +1 -0
- package/dist/marketplace-install/install-mount.d.ts +42 -0
- package/dist/marketplace-install/install-mount.d.ts.map +1 -0
- package/dist/marketplace-install/install-mount.js +62 -0
- package/dist/marketplace-install/install-mount.js.map +1 -0
- package/dist/marketplace-install/install-report.d.ts +14 -0
- package/dist/marketplace-install/install-report.d.ts.map +1 -0
- package/dist/marketplace-install/install-report.js +19 -0
- package/dist/marketplace-install/install-report.js.map +1 -0
- package/dist/marketplace-install/install-shell.d.ts +34 -0
- package/dist/marketplace-install/install-shell.d.ts.map +1 -0
- package/dist/marketplace-install/install-shell.js +32 -0
- package/dist/marketplace-install/install-shell.js.map +1 -0
- package/dist/marketplace-install/mount-install.d.ts +41 -0
- package/dist/marketplace-install/mount-install.d.ts.map +1 -0
- package/dist/marketplace-install/mount-install.js +90 -0
- package/dist/marketplace-install/mount-install.js.map +1 -0
- package/dist/marketplace-install/plugin-detail.d.ts +17 -0
- package/dist/marketplace-install/plugin-detail.d.ts.map +1 -0
- package/dist/marketplace-install/plugin-detail.js +41 -0
- package/dist/marketplace-install/plugin-detail.js.map +1 -0
- package/dist/marketplace-install/plugin-install.d.ts +27 -0
- package/dist/marketplace-install/plugin-install.d.ts.map +1 -0
- package/dist/marketplace-install/plugin-install.js +89 -0
- package/dist/marketplace-install/plugin-install.js.map +1 -0
- package/dist/marketplace-install/route-items.d.ts +14 -0
- package/dist/marketplace-install/route-items.d.ts.map +1 -0
- package/dist/marketplace-install/route-items.js +11 -0
- package/dist/marketplace-install/route-items.js.map +1 -0
- package/dist/marketplace-install/use-debounced-value.d.ts +6 -0
- package/dist/marketplace-install/use-debounced-value.d.ts.map +1 -0
- package/dist/marketplace-install/use-debounced-value.js +18 -0
- package/dist/marketplace-install/use-debounced-value.js.map +1 -0
- package/dist/marketplace-install/use-install-action.d.ts +26 -0
- package/dist/marketplace-install/use-install-action.d.ts.map +1 -0
- package/dist/marketplace-install/use-install-action.js +35 -0
- package/dist/marketplace-install/use-install-action.js.map +1 -0
- package/dist/marketplace-install/use-install-preview.d.ts +33 -0
- package/dist/marketplace-install/use-install-preview.d.ts.map +1 -0
- package/dist/marketplace-install/use-install-preview.js +44 -0
- package/dist/marketplace-install/use-install-preview.js.map +1 -0
- package/dist/marketplace-install/use-mount-install.d.ts +80 -0
- package/dist/marketplace-install/use-mount-install.d.ts.map +1 -0
- package/dist/marketplace-install/use-mount-install.js +75 -0
- package/dist/marketplace-install/use-mount-install.js.map +1 -0
- package/dist/navigation/index.d.ts +1 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js.map +1 -1
- package/dist/navigation/types.d.ts +23 -7
- package/dist/navigation/types.d.ts.map +1 -1
- package/dist/plugin/registry.d.ts +0 -8
- package/dist/plugin/registry.d.ts.map +1 -1
- package/dist/plugin/registry.js +25 -1
- package/dist/plugin/registry.js.map +1 -1
- package/dist/plugin/types.d.ts +36 -12
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/version.d.ts +6 -4
- package/dist/plugin/version.d.ts.map +1 -1
- package/dist/plugin/version.js +6 -4
- package/dist/plugin/version.js.map +1 -1
- package/dist/query-keys.d.ts +45 -4
- package/dist/query-keys.d.ts.map +1 -1
- package/dist/query-keys.js +52 -4
- package/dist/query-keys.js.map +1 -1
- package/dist/schema-form/json-schema-meta.d.ts +3 -0
- package/dist/schema-form/json-schema-meta.d.ts.map +1 -0
- package/dist/schema-form/json-schema-meta.js +3 -0
- package/dist/schema-form/json-schema-meta.js.map +1 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -1
- package/dist/token-rules.d.ts +26 -0
- package/dist/token-rules.d.ts.map +1 -0
- package/dist/token-rules.js +64 -0
- package/dist/token-rules.js.map +1 -0
- package/package.json +2 -2
- package/src/components/action-menu.tsx +160 -0
- package/src/components/agent-picker.tsx +53 -0
- package/src/components/channel-picker.tsx +68 -0
- package/src/components/components.css +226 -8
- package/src/components/confirm-dialog.tsx +4 -1
- package/src/components/execution-key-picker.tsx +252 -36
- package/src/components/extension-combo-builder.tsx +61 -29
- package/src/components/extension-combo-parts.tsx +28 -38
- package/src/components/extension-config-editor.tsx +307 -0
- package/src/components/extension-grouping.ts +4 -73
- package/src/components/extension-picker.tsx +13 -13
- package/src/components/fleet-report.tsx +38 -4
- package/src/components/holder-kinds.ts +60 -0
- package/src/components/holder-list.tsx +163 -0
- package/src/components/icons/index.ts +0 -2
- package/src/components/icons/nav-map.ts +0 -4
- package/src/components/icons/nav-marks.tsx +0 -15
- package/src/components/named-list-picker.tsx +182 -0
- package/src/components/named-list-test-utils.tsx +47 -0
- package/src/components/recycle-roll.tsx +120 -0
- package/src/components/stepper.tsx +111 -0
- package/src/components/subject-section.tsx +10 -5
- package/src/components/tokens.css +31 -41
- package/src/components/tokens.ts +5 -13
- package/src/components/tool-picker-parts.tsx +17 -6
- package/src/components/tool-picker.tsx +215 -41
- package/src/components/version-history-panel.tsx +8 -0
- package/src/components/version-history-rows.tsx +14 -2
- package/src/errors.ts +10 -0
- package/src/hooks/useCapabilities.ts +59 -10
- package/src/index.ts +54 -14
- package/src/marketplace-install/env-var-fields.tsx +59 -0
- package/src/marketplace-install/index.ts +17 -0
- package/src/marketplace-install/install-env.ts +39 -0
- package/src/marketplace-install/install-mount.ts +96 -0
- package/src/marketplace-install/install-report.tsx +54 -0
- package/src/marketplace-install/install-shell.tsx +99 -0
- package/src/marketplace-install/mount-install.tsx +290 -0
- package/src/marketplace-install/plugin-detail.ts +60 -0
- package/src/marketplace-install/plugin-install.tsx +221 -0
- package/src/marketplace-install/route-items.ts +20 -0
- package/src/marketplace-install/use-debounced-value.ts +18 -0
- package/src/marketplace-install/use-install-action.ts +60 -0
- package/src/marketplace-install/use-install-preview.ts +74 -0
- package/src/marketplace-install/use-mount-install.ts +116 -0
- package/src/navigation/index.ts +1 -0
- package/src/navigation/types.ts +27 -7
- package/src/plugin/registry.ts +19 -1
- package/src/plugin/types.ts +40 -12
- package/src/plugin/version.ts +6 -4
- package/src/query-keys.ts +71 -4
- package/src/schema-form/json-schema-meta.ts +2 -0
- package/src/testing.ts +2 -0
- 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-
|
|
283
|
-
border-color: var(--tai-color-
|
|
284
|
-
color: var(--tai-color-
|
|
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-
|
|
289
|
-
border-color: var(--tai-color-
|
|
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
|
|
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;
|
|
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
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
|
8
|
-
* the
|
|
9
|
-
*
|
|
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
|
|
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
|
|
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 {
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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":";
|
|
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).
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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
|
|
22
|
-
*
|
|
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;
|
|
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"}
|