@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
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { InstallReport } from './install-report';
|
|
2
|
+
export { MountInstallDialog, MountInstallForm } from './mount-install';
|
|
3
|
+
export { deliveryOf } from './plugin-detail';
|
|
4
|
+
export { INSTALL_NO_GRANT, PluginInstallDialog, PluginInstallPanel } from './plugin-install';
|
|
5
|
+
export { routeItemsOf } from './route-items';
|
|
6
|
+
export { useDebouncedValue } from './use-debounced-value';
|
|
7
|
+
export { useInstallAction } from './use-install-action';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplace-install/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The secret bands for the install env form: which collected vars are marked
|
|
2
|
+
* secret, and which are LOCKED secret (the server masks them regardless). */
|
|
3
|
+
/** One required-env entry as the install preview reports it. */
|
|
4
|
+
export interface PreviewEnvRequirement {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly secret: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface InstallEnvBands {
|
|
9
|
+
/** Per var, whether its value is treated as a secret (preview, detail, or override). */
|
|
10
|
+
readonly secretMap: Record<string, boolean>;
|
|
11
|
+
/** Per var, whether the secret mark is LOCKED on (preview or detail says secret). */
|
|
12
|
+
readonly lockedSecret: Record<string, boolean>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fold the preview's authority, the detail-derived fallback, and the operator's
|
|
16
|
+
* per-var override into the two bands the env fields render from. A var the preview
|
|
17
|
+
* or the detail marks secret is LOCKED on (an off toggle would lie, since the server
|
|
18
|
+
* masks it regardless); the override only turns a free var on.
|
|
19
|
+
*/
|
|
20
|
+
export declare function installEnvBands(missingVars: readonly string[], previewRequired: readonly PreviewEnvRequirement[], detailSecret: Record<string, boolean>, override: Record<string, boolean>): InstallEnvBands;
|
|
21
|
+
//# sourceMappingURL=install-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-env.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/install-env.ts"],"names":[],"mappings":"AAAA;6EAC6E;AAE7E,gEAAgE;AAChE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,qFAAqF;IACrF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,eAAe,EAAE,SAAS,qBAAqB,EAAE,EACjD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,eAAe,CAWjB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** The secret bands for the install env form: which collected vars are marked
|
|
2
|
+
* secret, and which are LOCKED secret (the server masks them regardless). */
|
|
3
|
+
/**
|
|
4
|
+
* Fold the preview's authority, the detail-derived fallback, and the operator's
|
|
5
|
+
* per-var override into the two bands the env fields render from. A var the preview
|
|
6
|
+
* or the detail marks secret is LOCKED on (an off toggle would lie, since the server
|
|
7
|
+
* masks it regardless); the override only turns a free var on.
|
|
8
|
+
*/
|
|
9
|
+
export function installEnvBands(missingVars, previewRequired, detailSecret, override) {
|
|
10
|
+
const previewSecret = {};
|
|
11
|
+
for (const req of previewRequired)
|
|
12
|
+
previewSecret[req.name] = req.secret;
|
|
13
|
+
const secretMap = {};
|
|
14
|
+
const lockedSecret = {};
|
|
15
|
+
for (const name of missingVars) {
|
|
16
|
+
const locked = previewSecret[name] === true || detailSecret[name] === true;
|
|
17
|
+
lockedSecret[name] = locked;
|
|
18
|
+
secretMap[name] = locked || override[name] === true;
|
|
19
|
+
}
|
|
20
|
+
return { secretMap, lockedSecret };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=install-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-env.js","sourceRoot":"","sources":["../../src/marketplace-install/install-env.ts"],"names":[],"mappings":"AAAA;6EAC6E;AAe7E;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,WAA8B,EAC9B,eAAiD,EACjD,YAAqC,EACrC,QAAiC;IAEjC,MAAM,aAAa,GAA4B,EAAE,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,eAAe;QAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IACxE,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,YAAY,GAA4B,EAAE,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;QAC3E,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure model for the route-mounting install flow: the env value/secret split, the
|
|
3
|
+
* per-var secret band derivation, and the install/update body assembly.
|
|
4
|
+
*/
|
|
5
|
+
import type { MarketplaceInstallPreview } from '@tai42/api-client';
|
|
6
|
+
/** The install/update body fields the mount form contributes. */
|
|
7
|
+
export interface InstallExtras {
|
|
8
|
+
route_mounts: Record<string, string>;
|
|
9
|
+
accept_public_routes: boolean;
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
secret_keys?: string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The env value + secret-key split from the collected inputs: a blank field is
|
|
15
|
+
* omitted (the deployment may already provide it); a filled field is marked secret
|
|
16
|
+
* only when its toggle is ON.
|
|
17
|
+
*
|
|
18
|
+
* The toggle state is SEEDED from the server's per-var `required_env[].secret`, so
|
|
19
|
+
* secret-ness comes from that authority, not a blanket default: a `secret: true`
|
|
20
|
+
* var (an OAuth client secret) is masked, a `secret: false` var (a client id) is
|
|
21
|
+
* not unless the operator turns it on. Keying off `=== true` honors an off toggle
|
|
22
|
+
* and never force-masks — an un-seeded var stays out of the secret band.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectEnv(requiredVars: readonly string[], values: Record<string, string>, secret: Record<string, boolean>): {
|
|
25
|
+
env: Record<string, string>;
|
|
26
|
+
secretKeys: string[];
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* The effective per-var secret band for the vars to collect: the SERVER's per-var
|
|
30
|
+
* `required_env[].secret` from the preview (the authority), OR the caller-supplied
|
|
31
|
+
* `requiredEnvSecret`, OR an operator override.
|
|
32
|
+
*/
|
|
33
|
+
export declare function deriveEnvSecretMap(envToCollect: readonly string[], preview: MarketplaceInstallPreview | undefined, requiredEnvSecret: Record<string, boolean> | undefined, envSecretOverride: Record<string, boolean>): Record<string, boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Assemble the install/update body. INSTALL sends every base (declared default is
|
|
36
|
+
* correct). UPDATE sends ONLY the items whose base changed from its current stored
|
|
37
|
+
* base — omitted items are preserved by the server's stored-mount precedence, so a
|
|
38
|
+
* plugin installed at a non-default base is never reset to default on an edit-free
|
|
39
|
+
* update. Collected env is attached only when at least one value was filled.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildInstallExtras(verb: 'Install' | 'Update', bases: Record<string, string>, seededBases: Record<string, string>, accepted: boolean, envToCollect: readonly string[], envValues: Record<string, string>, envSecretMap: Record<string, boolean>): InstallExtras;
|
|
42
|
+
//# sourceMappingURL=install-mount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-mount.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/install-mount.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,OAAO,EAAE,yBAAyB,GAAG,SAAS,EAC9C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACtD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,GAAG,QAAQ,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,aAAa,CAgBf"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The env value + secret-key split from the collected inputs: a blank field is
|
|
3
|
+
* omitted (the deployment may already provide it); a filled field is marked secret
|
|
4
|
+
* only when its toggle is ON.
|
|
5
|
+
*
|
|
6
|
+
* The toggle state is SEEDED from the server's per-var `required_env[].secret`, so
|
|
7
|
+
* secret-ness comes from that authority, not a blanket default: a `secret: true`
|
|
8
|
+
* var (an OAuth client secret) is masked, a `secret: false` var (a client id) is
|
|
9
|
+
* not unless the operator turns it on. Keying off `=== true` honors an off toggle
|
|
10
|
+
* and never force-masks — an un-seeded var stays out of the secret band.
|
|
11
|
+
*/
|
|
12
|
+
export function collectEnv(requiredVars, values, secret) {
|
|
13
|
+
const env = {};
|
|
14
|
+
const secretKeys = [];
|
|
15
|
+
for (const name of requiredVars) {
|
|
16
|
+
const value = values[name] ?? '';
|
|
17
|
+
if (value === '')
|
|
18
|
+
continue;
|
|
19
|
+
env[name] = value;
|
|
20
|
+
if (secret[name] === true)
|
|
21
|
+
secretKeys.push(name);
|
|
22
|
+
}
|
|
23
|
+
return { env, secretKeys };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The effective per-var secret band for the vars to collect: the SERVER's per-var
|
|
27
|
+
* `required_env[].secret` from the preview (the authority), OR the caller-supplied
|
|
28
|
+
* `requiredEnvSecret`, OR an operator override.
|
|
29
|
+
*/
|
|
30
|
+
export function deriveEnvSecretMap(envToCollect, preview, requiredEnvSecret, envSecretOverride) {
|
|
31
|
+
const previewEnvSecret = {};
|
|
32
|
+
for (const req of preview?.required_env ?? [])
|
|
33
|
+
previewEnvSecret[req.name] = req.secret;
|
|
34
|
+
return Object.fromEntries(envToCollect.map((name) => [
|
|
35
|
+
name,
|
|
36
|
+
previewEnvSecret[name] === true ||
|
|
37
|
+
requiredEnvSecret?.[name] === true ||
|
|
38
|
+
envSecretOverride[name] === true,
|
|
39
|
+
]));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Assemble the install/update body. INSTALL sends every base (declared default is
|
|
43
|
+
* correct). UPDATE sends ONLY the items whose base changed from its current stored
|
|
44
|
+
* base — omitted items are preserved by the server's stored-mount precedence, so a
|
|
45
|
+
* plugin installed at a non-default base is never reset to default on an edit-free
|
|
46
|
+
* update. Collected env is attached only when at least one value was filled.
|
|
47
|
+
*/
|
|
48
|
+
export function buildInstallExtras(verb, bases, seededBases, accepted, envToCollect, envValues, envSecretMap) {
|
|
49
|
+
const route_mounts = verb === 'Update'
|
|
50
|
+
? Object.fromEntries(Object.entries(bases).filter(([name, base]) => base !== seededBases[name]))
|
|
51
|
+
: bases;
|
|
52
|
+
const extras = { route_mounts, accept_public_routes: accepted };
|
|
53
|
+
if (envToCollect.length > 0) {
|
|
54
|
+
const { env, secretKeys } = collectEnv(envToCollect, envValues, envSecretMap);
|
|
55
|
+
if (Object.keys(env).length > 0) {
|
|
56
|
+
extras.env = env;
|
|
57
|
+
extras.secret_keys = secretKeys;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return extras;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=install-mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-mount.js","sourceRoot":"","sources":["../../src/marketplace-install/install-mount.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CACxB,YAA+B,EAC/B,MAA8B,EAC9B,MAA+B;IAE/B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAClB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAA+B,EAC/B,OAA8C,EAC9C,iBAAsD,EACtD,iBAA0C;IAE1C,MAAM,gBAAgB,GAA4B,EAAE,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,YAAY,IAAI,EAAE;QAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IACvF,OAAO,MAAM,CAAC,WAAW,CACvB,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,IAAI;QACJ,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI;YAC7B,iBAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI;YAClC,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI;KACnC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA0B,EAC1B,KAA6B,EAC7B,WAAmC,EACnC,QAAiB,EACjB,YAA+B,EAC/B,SAAiC,EACjC,YAAqC;IAErC,MAAM,YAAY,GAChB,IAAI,KAAK,QAAQ;QACf,CAAC,CAAC,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAC3E;QACH,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,MAAM,GAAkB,EAAE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC;IAC/E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;YACjB,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fleet side of an install, update or uninstall: the reload fan-out report and,
|
|
3
|
+
* when the reload recycled workers, the roll. The host folds the receipt's
|
|
4
|
+
* `reload.fanout` / `awaiting_respawn` / `span_release_error` into `summary` with
|
|
5
|
+
* `summarizeFleetFanout` and passes `reload.recycle` as `recycle`.
|
|
6
|
+
*/
|
|
7
|
+
import type { FleetReportSummary, RecycleRoll } from '@tai42/api-client';
|
|
8
|
+
import { type ReactNode } from 'react';
|
|
9
|
+
export interface InstallReportProps {
|
|
10
|
+
readonly summary: FleetReportSummary | null;
|
|
11
|
+
readonly recycle: RecycleRoll | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function InstallReport({ summary, recycle }: InstallReportProps): ReactNode;
|
|
14
|
+
//# sourceMappingURL=install-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-report.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/install-report.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAsB,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAKlE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC;AAcD,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB,GAAG,SAAS,CAwBjF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId } from 'react';
|
|
3
|
+
import { FleetReport } from '../components/fleet-report';
|
|
4
|
+
import { RecycleRollSection } from '../components/recycle-roll';
|
|
5
|
+
const sectionTitleStyle = {
|
|
6
|
+
margin: '0 0 var(--tai-space-2)',
|
|
7
|
+
fontSize: 'var(--tai-text-md)',
|
|
8
|
+
color: 'var(--tai-color-text)',
|
|
9
|
+
};
|
|
10
|
+
const sectionIntroStyle = {
|
|
11
|
+
margin: '0 0 var(--tai-space-3)',
|
|
12
|
+
color: 'var(--tai-color-text-muted)',
|
|
13
|
+
fontSize: 'var(--tai-text-sm)',
|
|
14
|
+
};
|
|
15
|
+
export function InstallReport({ summary, recycle }) {
|
|
16
|
+
const headingId = useId();
|
|
17
|
+
return (_jsxs("div", { className: "tai-stack tai-stack-3", children: [_jsx(FleetReport, { summary: summary }), recycle !== null ? (_jsxs("section", { "aria-labelledby": headingId, children: [_jsx("h4", { id: headingId, style: sectionTitleStyle, children: "Worker recycle" }), _jsx("p", { style: sectionIntroStyle, children: "Some changed settings take effect only in a fresh worker process, so the fleet recycled its workers one at a time." }), _jsx(RecycleRollSection, { recycle: recycle.recycle, fresh: recycle.fresh, stopped: recycle.recycle_stopped, writerNote: "this worker recycles itself after replying" })] })) : null] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=install-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-report.js","sourceRoot":"","sources":["../../src/marketplace-install/install-report.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAsC,KAAK,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAOhE,MAAM,iBAAiB,GAAkB;IACvC,MAAM,EAAE,wBAAwB;IAChC,QAAQ,EAAE,oBAAoB;IAC9B,KAAK,EAAE,uBAAuB;CAC/B,CAAC;AAEF,MAAM,iBAAiB,GAAkB;IACvC,MAAM,EAAE,wBAAwB;IAChC,KAAK,EAAE,6BAA6B;IACpC,QAAQ,EAAE,oBAAoB;CAC/B,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAsB;IACpE,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1B,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,aACpC,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,GAAI,EAChC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAClB,sCAA0B,SAAS,aACjC,aAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,+BAEtC,EACL,YAAG,KAAK,EAAE,iBAAiB,mIAGvB,EACJ,KAAC,kBAAkB,IACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,OAAO,EAAE,OAAO,CAAC,eAAe,EAChC,UAAU,EAAC,4CAA4C,GACvD,IACM,CACX,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two frames an install form renders in: a dialog (the confirm shell) or a panel
|
|
3
|
+
* in place (its own `<form>` with Cancel and the submit button), so a step can embed
|
|
4
|
+
* the form without a dialog inside a dialog. The failure of the last call renders
|
|
5
|
+
* inside the frame and the frame stays open.
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from 'react';
|
|
8
|
+
export type InstallLayout = 'panel' | 'dialog';
|
|
9
|
+
/**
|
|
10
|
+
* The muted note for a store-off refusal (an OFF feature is a state, not an error),
|
|
11
|
+
* or `undefined` for any other value.
|
|
12
|
+
*/
|
|
13
|
+
export declare function storeOffNote(error: unknown): ReactNode;
|
|
14
|
+
/** A failed call's surface: the store-off note, else the server message as an alert. */
|
|
15
|
+
export declare function InstallFailure({ error }: {
|
|
16
|
+
readonly error: unknown;
|
|
17
|
+
}): ReactNode;
|
|
18
|
+
export interface InstallShellProps {
|
|
19
|
+
readonly layout: InstallLayout;
|
|
20
|
+
readonly title: string;
|
|
21
|
+
readonly submitLabel: string;
|
|
22
|
+
readonly pendingLabel: string;
|
|
23
|
+
readonly isPending: boolean;
|
|
24
|
+
/** The loud failure; `null` while there is none. */
|
|
25
|
+
readonly error: unknown;
|
|
26
|
+
/** A muted note that takes the failure slot and blocks the submit. */
|
|
27
|
+
readonly disabledNote?: ReactNode;
|
|
28
|
+
readonly submitDisabled?: boolean;
|
|
29
|
+
readonly onSubmit: () => void;
|
|
30
|
+
readonly onDismiss: () => void;
|
|
31
|
+
readonly children: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
export declare function InstallShell({ layout, title, submitLabel, pendingLabel, isPending, error, disabledNote, submitDisabled, onSubmit, onDismiss, children, }: InstallShellProps): ReactNode;
|
|
34
|
+
//# sourceMappingURL=install-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-shell.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/install-shell.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAOvD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAGtD;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAEhF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,KAAK,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAsB,EACtB,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,iBAAiB,GAAG,SAAS,CAyC/B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ConfirmDialog } from '../components/confirm-dialog';
|
|
3
|
+
import { Button, ErrorState, Spinner } from '../components/primitives';
|
|
4
|
+
import { errorMessage } from '../errors';
|
|
5
|
+
import { FeatureDisabled, featureDisabledMessage, isFeatureDisabled } from '../feature-disabled';
|
|
6
|
+
/**
|
|
7
|
+
* The muted note for a store-off refusal (an OFF feature is a state, not an error),
|
|
8
|
+
* or `undefined` for any other value.
|
|
9
|
+
*/
|
|
10
|
+
export function storeOffNote(error) {
|
|
11
|
+
if (!isFeatureDisabled(error))
|
|
12
|
+
return undefined;
|
|
13
|
+
return _jsx(FeatureDisabled, { feature: "Marketplace installs", message: featureDisabledMessage(error) });
|
|
14
|
+
}
|
|
15
|
+
/** A failed call's surface: the store-off note, else the server message as an alert. */
|
|
16
|
+
export function InstallFailure({ error }) {
|
|
17
|
+
return storeOffNote(error) ?? _jsx(ErrorState, { message: errorMessage(error) });
|
|
18
|
+
}
|
|
19
|
+
export function InstallShell({ layout, title, submitLabel, pendingLabel, isPending, error, disabledNote, submitDisabled = false, onSubmit, onDismiss, children, }) {
|
|
20
|
+
const errorText = error === null || error === undefined ? null : errorMessage(error);
|
|
21
|
+
if (layout === 'dialog') {
|
|
22
|
+
return (_jsx(ConfirmDialog, { title: title, confirmLabel: submitLabel, pendingLabel: pendingLabel, confirmVariant: "primary", isPending: isPending, error: errorText, disabledNote: disabledNote, confirmDisabled: submitDisabled, onConfirm: onSubmit, onClose: onDismiss, children: children }));
|
|
23
|
+
}
|
|
24
|
+
const blocked = isPending || submitDisabled || (disabledNote !== undefined && disabledNote !== null);
|
|
25
|
+
const handleSubmit = (event) => {
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
if (!blocked)
|
|
28
|
+
onSubmit();
|
|
29
|
+
};
|
|
30
|
+
return (_jsxs("form", { "aria-label": title, className: "tai-stack tai-stack-3", onSubmit: handleSubmit, children: [children, disabledNote ?? (errorText !== null ? _jsx(ErrorState, { message: errorText }) : null), _jsxs("div", { className: "tai-dialog-actions", children: [_jsx(Button, { type: "button", onClick: onDismiss, children: "Cancel" }), _jsxs(Button, { type: "submit", variant: "primary", disabled: blocked, children: [isPending ? _jsx(Spinner, { label: pendingLabel }) : null, submitLabel] })] })] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=install-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-shell.js","sourceRoot":"","sources":["../../src/marketplace-install/install-shell.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIjG;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,KAAC,eAAe,IAAC,OAAO,EAAC,sBAAsB,EAAC,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAI,CAAC;AACpG,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAA+B;IACnE,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,KAAC,UAAU,IAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,GAAI,CAAC;AAC7E,CAAC;AAkBD,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,KAAK,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,GAAG,KAAK,EACtB,QAAQ,EACR,SAAS,EACT,QAAQ,GACU;IAClB,MAAM,SAAS,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACrF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,CACL,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAC,SAAS,EACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,cAAc,EAC/B,SAAS,EAAE,QAAQ,EACnB,OAAO,EAAE,SAAS,YAEjB,QAAQ,GACK,CACjB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GACX,SAAS,IAAI,cAAc,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,CAAC,KAAsC,EAAQ,EAAE;QACpE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO;YAAE,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC;IACF,OAAO,CACL,8BAAkB,KAAK,EAAE,SAAS,EAAC,uBAAuB,EAAC,QAAQ,EAAE,YAAY,aAC9E,QAAQ,EACR,YAAY,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,OAAO,EAAE,SAAS,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EACjF,eAAK,SAAS,EAAC,oBAAoB,aACjC,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,SAAS,uBAE/B,EACT,MAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,OAAO,aACtD,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,YAAY,GAAI,CAAC,CAAC,CAAC,IAAI,EACnD,WAAW,IACL,IACL,IACD,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The route-mounting install / update form: a base prefix per route-carrying item, a
|
|
3
|
+
* live preview of the resulting absolute paths, loud collision blocking, explicit
|
|
4
|
+
* acceptance of the routes served without authentication, and — on install — the
|
|
5
|
+
* preview's missing env collected in the same form. `MountInstallForm` renders it in
|
|
6
|
+
* place; `MountInstallDialog` renders it in a dialog.
|
|
7
|
+
*/
|
|
8
|
+
import type { MarketplaceInstallResult } from '@tai42/api-client';
|
|
9
|
+
import { type ReactNode } from 'react';
|
|
10
|
+
import type { RouteItem } from './route-items';
|
|
11
|
+
export interface MountInstallDialogProps {
|
|
12
|
+
readonly refValue: string;
|
|
13
|
+
readonly version: string | null;
|
|
14
|
+
readonly verb: 'Install' | 'Update';
|
|
15
|
+
readonly routeItems: readonly RouteItem[];
|
|
16
|
+
/**
|
|
17
|
+
* On UPDATE, the installed row's stored `{item_name: base}` — the CURRENT mount each
|
|
18
|
+
* base input seeds from (declared default only for an item with no stored mount).
|
|
19
|
+
* Absent on INSTALL, where every input seeds from the declared default.
|
|
20
|
+
*/
|
|
21
|
+
readonly storedMounts?: Record<string, string>;
|
|
22
|
+
/** The server's per-var secret-ness: a toggle for a `true` var is locked on. */
|
|
23
|
+
readonly requiredEnvSecret?: Record<string, boolean>;
|
|
24
|
+
/** Per-var "which item needs it" hint. */
|
|
25
|
+
readonly envHints?: Record<string, string>;
|
|
26
|
+
/** After a 2xx install or update. */
|
|
27
|
+
readonly onDone: (result: MarketplaceInstallResult) => void;
|
|
28
|
+
/** After a failed call, already rendered in place. */
|
|
29
|
+
readonly onFailed?: (error: unknown) => void;
|
|
30
|
+
/** The user closed or cancelled without a completed call. */
|
|
31
|
+
readonly onDismiss: () => void;
|
|
32
|
+
}
|
|
33
|
+
/** The mount form in place, with its own Cancel and submit buttons. */
|
|
34
|
+
export declare function MountInstallForm(props: MountInstallDialogProps): ReactNode;
|
|
35
|
+
/**
|
|
36
|
+
* The mount form in a dialog. It previews the resolved routes on open and on every
|
|
37
|
+
* (debounced) base edit, blocks submit on a collision or an unaccepted public route,
|
|
38
|
+
* and closes only after a 2xx; a failure renders in the dialog and it stays open.
|
|
39
|
+
*/
|
|
40
|
+
export declare function MountInstallDialog(props: MountInstallDialogProps): ReactNode;
|
|
41
|
+
//# sourceMappingURL=mount-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-install.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/mount-install.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAA6B,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAW/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,gFAAgF;IAChF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAC5D,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AAqKD,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,SAAS,CAiC1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,SAAS,CAuC5E"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { Badge } from '../components/badge';
|
|
4
|
+
import { Checkbox } from '../components/checkbox';
|
|
5
|
+
import { Field } from '../components/field';
|
|
6
|
+
import { FormDialog } from '../components/form-dialog';
|
|
7
|
+
import { XCircleIcon } from '../components/icons';
|
|
8
|
+
import { TextInput } from '../components/inputs';
|
|
9
|
+
import { ErrorState, Skeleton } from '../components/primitives';
|
|
10
|
+
import { EnvVarFields } from './env-var-fields';
|
|
11
|
+
import { InstallShell, storeOffNote } from './install-shell';
|
|
12
|
+
import { useInstallAction } from './use-install-action';
|
|
13
|
+
import { useMountInstall } from './use-mount-install';
|
|
14
|
+
/** The resolved routes for one item, from the live preview. */
|
|
15
|
+
function ItemRoutes({ item, preview, }) {
|
|
16
|
+
if (preview === undefined)
|
|
17
|
+
return _jsx(Skeleton, { height: 48 });
|
|
18
|
+
const resolved = preview.items.find((row) => row.item === item.name);
|
|
19
|
+
if (resolved === undefined)
|
|
20
|
+
return null;
|
|
21
|
+
return (_jsx("ul", { style: { margin: 0, paddingLeft: 'var(--tai-space-4)' }, children: resolved.routes.map((route) => (_jsxs("li", { children: [_jsx("code", { className: "tai-mono", children: route.full_path }), ' ', _jsx("span", { className: "tai-muted", children: route.methods.join(', ') }), ' ', route.public ? _jsx(Badge, { variant: "warning", children: "public" }) : null] }, `${route.path}/${route.methods.join(',')}`))) }));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The loud collision block: each clashing route, its owner, and the remap remedy.
|
|
25
|
+
* `role="alert"` on the error ground, with its own headline — a collision is a
|
|
26
|
+
* refusal the operator resolves, not a malfunction, so it never wears the generic
|
|
27
|
+
* "something went wrong".
|
|
28
|
+
*/
|
|
29
|
+
function CollisionBlock({ collisions, }) {
|
|
30
|
+
return (_jsxs("div", { role: "alert", className: "tai-error-state tai-stack tai-stack-2", children: [_jsxs("strong", { className: "tai-error-state-title", children: [_jsx(XCircleIcon, {}), "Route collision"] }), _jsx("p", { style: { margin: 0 }, children: "These routes already have an owner. Remap the base above until they no longer clash." }), _jsx("ul", { style: { margin: 0, paddingLeft: 'var(--tai-space-4)' }, children: collisions.map((collision) => (_jsxs("li", { children: [_jsx("code", { className: "tai-mono", children: collision.full_path }), ' ', _jsx("span", { className: "tai-muted", children: collision.methods.join(', ') }), " \u2014 owned by", ' ', _jsx("strong", { children: collision.conflict_owner })] }, `${collision.item}/${collision.full_path}/${collision.methods.join(',')}`))) })] }));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The public-route acceptance block: it names every route that will answer WITHOUT
|
|
34
|
+
* authentication and gates submit on an explicit checkbox.
|
|
35
|
+
*/
|
|
36
|
+
function PublicAcceptance({ rows, accepted, onAccept, }) {
|
|
37
|
+
return (_jsxs("div", { role: "alert", className: "tai-warn-state tai-stack tai-stack-2", children: [_jsx("strong", { className: "tai-status-warn", children: "Public routes" }), _jsx("p", { style: { margin: 0 }, children: "These routes are served WITHOUT API-key authentication \u2014 anyone who can reach the server can call them." }), _jsx("ul", { style: { margin: 0, paddingLeft: 'var(--tai-space-4)' }, children: rows.map((row) => (_jsxs("li", { children: [_jsx("code", { className: "tai-mono", children: row.full_path }), ' ', _jsx("span", { className: "tai-muted", children: row.methods.join(', ') })] }, `${row.item}/${row.full_path}/${row.methods.join(',')}`))) }), _jsx(Checkbox, { checked: accepted, onCheckedChange: onAccept, label: "I accept these routes are served without authentication" })] }));
|
|
38
|
+
}
|
|
39
|
+
/** The form body both frames render: the bases, the preview, and the env to collect. */
|
|
40
|
+
function MountInstallFields({ model, refValue, version, verb, routeItems, requiredEnvSecret, envHints, }) {
|
|
41
|
+
return (_jsxs("div", { className: "tai-stack tai-stack-3", children: [_jsxs("p", { style: { margin: 0 }, children: [verb, " ", refValue, version !== null ? ` v${version}` : '', "? Its routes mount under the bases below. Remap a base to move where a route answers."] }), routeItems.map((item) => (_jsxs("div", { className: "tai-stack tai-stack-2", children: [_jsx(Field, { label: `${item.name} base`, children: _jsx(TextInput, { value: model.bases[item.name] ?? '', onChange: (event) => {
|
|
42
|
+
const next = event.currentTarget.value;
|
|
43
|
+
model.setBases((prev) => ({ ...prev, [item.name]: next }));
|
|
44
|
+
} }) }), _jsx(ItemRoutes, { item: item, preview: model.preview })] }, item.name))), model.previewIsError ? (_jsx(ErrorState, { message: "The install preview failed. Fix the error and edit a base to retry." })) : null, model.collisions.length > 0 ? _jsx(CollisionBlock, { collisions: model.collisions }) : null, model.requiresAccept ? (_jsx(PublicAcceptance, { rows: model.publicRows, accepted: model.accepted, onAccept: model.setAccepted })) : null, model.envToCollect.length > 0 ? (_jsx(EnvVarFields, { requiredVars: model.envToCollect, values: model.envValues, secret: model.envSecretMap, requiredSecret: requiredEnvSecret, hints: envHints, onChangeValue: (name, value) => {
|
|
45
|
+
model.setEnvValues((prev) => ({ ...prev, [name]: value }));
|
|
46
|
+
}, onToggleSecret: (name, checked) => {
|
|
47
|
+
model.setEnvSecretOverride((prev) => ({ ...prev, [name]: checked }));
|
|
48
|
+
} })) : null] }));
|
|
49
|
+
}
|
|
50
|
+
/** The mount form in place, with its own Cancel and submit buttons. */
|
|
51
|
+
export function MountInstallForm(props) {
|
|
52
|
+
const { refValue, version, verb, routeItems, requiredEnvSecret, envHints } = props;
|
|
53
|
+
const model = useMountInstall(props);
|
|
54
|
+
const action = useInstallAction(refValue, verb);
|
|
55
|
+
const failure = action.state.status === 'failed' ? action.state.error : null;
|
|
56
|
+
return (_jsx(InstallShell, { layout: "panel", title: `${verb} plugin`, submitLabel: verb, pendingLabel: verb === 'Install' ? 'Installing' : 'Updating', isPending: action.state.status === 'pending', error: storeOffNote(failure) === undefined ? failure : null, disabledNote: storeOffNote(failure), submitDisabled: model.blocked, onSubmit: () => {
|
|
57
|
+
action.run(model.extras()).then(props.onDone, (error) => {
|
|
58
|
+
props.onFailed?.(error);
|
|
59
|
+
});
|
|
60
|
+
}, onDismiss: props.onDismiss, children: _jsx(MountInstallFields, { model: model, refValue: refValue, version: version, verb: verb, routeItems: routeItems, requiredEnvSecret: requiredEnvSecret, envHints: envHints }) }));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The mount form in a dialog. It previews the resolved routes on open and on every
|
|
64
|
+
* (debounced) base edit, blocks submit on a collision or an unaccepted public route,
|
|
65
|
+
* and closes only after a 2xx; a failure renders in the dialog and it stays open.
|
|
66
|
+
*/
|
|
67
|
+
export function MountInstallDialog(props) {
|
|
68
|
+
const { refValue, version, verb, routeItems, requiredEnvSecret, envHints } = props;
|
|
69
|
+
const model = useMountInstall(props);
|
|
70
|
+
const action = useInstallAction(refValue, verb);
|
|
71
|
+
// The dialog's own close after a 2xx is not a dismissal.
|
|
72
|
+
const doneRef = useRef(false);
|
|
73
|
+
const submit = async () => {
|
|
74
|
+
let result;
|
|
75
|
+
try {
|
|
76
|
+
result = await action.run(model.extras());
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
props.onFailed?.(error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
doneRef.current = true;
|
|
83
|
+
props.onDone(result);
|
|
84
|
+
};
|
|
85
|
+
return (_jsx(FormDialog, { title: `${verb} plugin`, submitLabel: verb, pendingLabel: verb === 'Install' ? 'Installing' : 'Updating', submitDisabled: model.blocked, onSubmit: submit, onClose: () => {
|
|
86
|
+
if (!doneRef.current)
|
|
87
|
+
props.onDismiss();
|
|
88
|
+
}, children: _jsx(MountInstallFields, { model: model, refValue: refValue, version: version, verb: verb, routeItems: routeItems, requiredEnvSecret: requiredEnvSecret, envHints: envHints }) }));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=mount-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-install.js","sourceRoot":"","sources":["../../src/marketplace-install/mount-install.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAkB,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAA0B,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAyB9E,+DAA+D;AAC/D,SAAS,UAAU,CAAC,EAClB,IAAI,EACJ,OAAO,GAIR;IACC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAC,QAAQ,IAAC,MAAM,EAAE,EAAE,GAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,CACL,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,YACxD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC9B,yBACE,eAAM,SAAS,EAAC,UAAU,YAAE,KAAK,CAAC,SAAS,GAAQ,EAAC,GAAG,EACvD,eAAM,SAAS,EAAC,WAAW,YAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,EAAC,GAAG,EAChE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,uBAAe,CAAC,CAAC,CAAC,IAAI,KAHvD,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAI9C,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,EACtB,UAAU,GAGX;IACC,OAAO,CACL,eAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,uCAAuC,aACjE,kBAAQ,SAAS,EAAC,uBAAuB,aACvC,KAAC,WAAW,KAAG,uBAER,EACT,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,qGAEnB,EACJ,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,YACxD,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAC7B,yBACE,eAAM,SAAS,EAAC,UAAU,YAAE,SAAS,CAAC,SAAS,GAAQ,EAAC,GAAG,EAC3D,eAAM,SAAS,EAAC,WAAW,YAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,sBAAY,GAAG,EAChF,2BAAS,SAAS,CAAC,cAAc,GAAU,KAHpC,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAI7E,CACN,CAAC,GACC,IACD,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,EACxB,IAAI,EACJ,QAAQ,EACR,QAAQ,GAKT;IACC,OAAO,CACL,eAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,sCAAsC,aAChE,iBAAQ,SAAS,EAAC,iBAAiB,8BAAuB,EAC1D,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,6HAGnB,EACJ,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,YACxD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,yBACE,eAAM,SAAS,EAAC,UAAU,YAAE,GAAG,CAAC,SAAS,GAAQ,EAAC,GAAG,EACrD,eAAM,SAAS,EAAC,WAAW,YAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,KAFpD,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAG3D,CACN,CAAC,GACC,EACL,KAAC,QAAQ,IACP,OAAO,EAAE,QAAQ,EACjB,eAAe,EAAE,QAAQ,EACzB,KAAK,EAAC,yDAAyD,GAC/D,IACE,CACP,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,UAAU,EACV,iBAAiB,EACjB,QAAQ,GAST;IACC,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,aACpC,aAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,aACpB,IAAI,OAAG,QAAQ,EACf,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,6FAErC,EACH,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACxB,eAAqB,SAAS,EAAC,uBAAuB,aACpD,KAAC,KAAK,IAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,OAAO,YAC/B,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gCAClB,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;gCACvC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;4BAC7D,CAAC,GACD,GACI,EACR,KAAC,UAAU,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAI,KAV1C,IAAI,CAAC,IAAI,CAWb,CACP,CAAC,EACD,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CACtB,KAAC,UAAU,IAAC,OAAO,EAAC,qEAAqE,GAAG,CAC7F,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAC,cAAc,IAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAI,CAAC,CAAC,CAAC,IAAI,EACrF,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CACtB,KAAC,gBAAgB,IACf,IAAI,EAAE,KAAK,CAAC,UAAU,EACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,WAAW,GAC3B,CACH,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC/B,KAAC,YAAY,IACX,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,MAAM,EAAE,KAAK,CAAC,SAAS,EACvB,MAAM,EAAE,KAAK,CAAC,YAAY,EAC1B,cAAc,EAAE,iBAAiB,EACjC,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBAC7B,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC,EACD,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;oBAChC,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACvE,CAAC,GACD,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,KAA8B;IAC7D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACnF,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,OAAO,CACL,KAAC,YAAY,IACX,MAAM,EAAC,OAAO,EACd,KAAK,EAAE,GAAG,IAAI,SAAS,EACvB,WAAW,EAAE,IAAI,EACjB,YAAY,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAC5D,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAC5C,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAC3D,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EACnC,cAAc,EAAE,KAAK,CAAC,OAAO,EAC7B,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAc,EAAE,EAAE;gBAC/D,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,EACD,SAAS,EAAE,KAAK,CAAC,SAAS,YAE1B,KAAC,kBAAkB,IACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,QAAQ,GAClB,GACW,CAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACnF,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,yDAAyD;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,IAAI,MAAgC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAE,GAAG,IAAI,SAAS,EACvB,WAAW,EAAE,IAAI,EACjB,YAAY,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAC5D,cAAc,EAAE,KAAK,CAAC,OAAO,EAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QAC1C,CAAC,YAED,KAAC,kBAAkB,IACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,QAAQ,GAClB,GACS,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Pure readings of a marketplace plugin's detail that the install forms seed from. */
|
|
2
|
+
import type { MarketplaceDelivery, MarketplacePluginDetail } from '@tai42/api-client';
|
|
3
|
+
/**
|
|
4
|
+
* How the listing's latest version is delivered, derived exactly the way the server
|
|
5
|
+
* derives it — from whether the spec names a package. The registry's plugin-detail
|
|
6
|
+
* body carries no `delivery` field (that is server-computed and rides the installed
|
|
7
|
+
* rows and the install preview), so the detail is read off the listing's `package`:
|
|
8
|
+
* `null` (a descriptor listing that names none) ⇒ `descriptor`, else `package`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function deliveryOf(detail: MarketplacePluginDetail): MarketplaceDelivery;
|
|
11
|
+
export interface RequiredEnvHints {
|
|
12
|
+
readonly requiredEnvSecret: Record<string, boolean>;
|
|
13
|
+
readonly requiredEnvHints: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
/** The detail's declared env folded into the secret band and per-var hint the forms seed from. */
|
|
16
|
+
export declare function requiredEnvFromDetail(detail: MarketplacePluginDetail): RequiredEnvHints;
|
|
17
|
+
//# sourceMappingURL=plugin-detail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-detail.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/plugin-detail.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEtF;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,uBAAuB,GAAG,mBAAmB,CAE/E;AAiCD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAED,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,GAAG,gBAAgB,CAQvF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the listing's latest version is delivered, derived exactly the way the server
|
|
3
|
+
* derives it — from whether the spec names a package. The registry's plugin-detail
|
|
4
|
+
* body carries no `delivery` field (that is server-computed and rides the installed
|
|
5
|
+
* rows and the install preview), so the detail is read off the listing's `package`:
|
|
6
|
+
* `null` (a descriptor listing that names none) ⇒ `descriptor`, else `package`.
|
|
7
|
+
*/
|
|
8
|
+
export function deliveryOf(detail) {
|
|
9
|
+
return detail.package === null ? 'descriptor' : 'package';
|
|
10
|
+
}
|
|
11
|
+
function requiredEnvIndex(detail) {
|
|
12
|
+
const index = new Map();
|
|
13
|
+
for (const item of detail.latest?.items ?? []) {
|
|
14
|
+
// The registry omits per-item required_env (undefined); only a fixture/preview
|
|
15
|
+
// that declares it drives these pre-dialog hints.
|
|
16
|
+
for (const req of item.required_env ?? []) {
|
|
17
|
+
const entry = index.get(req.name);
|
|
18
|
+
if (entry === undefined) {
|
|
19
|
+
index.set(req.name, { secret: req.secret, items: [item.name] });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
index.set(req.name, {
|
|
23
|
+
secret: entry.secret || req.secret,
|
|
24
|
+
items: [...entry.items, item.name],
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return index;
|
|
30
|
+
}
|
|
31
|
+
/** The detail's declared env folded into the secret band and per-var hint the forms seed from. */
|
|
32
|
+
export function requiredEnvFromDetail(detail) {
|
|
33
|
+
const requiredEnvSecret = {};
|
|
34
|
+
const requiredEnvHints = {};
|
|
35
|
+
for (const [envName, entry] of requiredEnvIndex(detail)) {
|
|
36
|
+
requiredEnvSecret[envName] = entry.secret;
|
|
37
|
+
requiredEnvHints[envName] = entry.items.join(', ');
|
|
38
|
+
}
|
|
39
|
+
return { requiredEnvSecret, requiredEnvHints };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=plugin-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-detail.js","sourceRoot":"","sources":["../../src/marketplace-install/plugin-detail.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,MAA+B;IACxD,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAaD,SAAS,gBAAgB,CAAC,MAA+B;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9C,+EAA+E;QAC/E,kDAAkD;QAClD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;oBAClB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;oBAClC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,kGAAkG;AAClG,MAAM,UAAU,qBAAqB,CAAC,MAA+B;IACnE,MAAM,iBAAiB,GAA4B,EAAE,CAAC;IACtD,MAAM,gBAAgB,GAA2B,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,iBAAiB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1C,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The install of one marketplace plugin, in place (`PluginInstallPanel`) or in a
|
|
3
|
+
* dialog (`PluginInstallDialog`). A plugin with route-carrying items installs through
|
|
4
|
+
* the mount form, which also collects the preview's missing env; any other plugin
|
|
5
|
+
* previews once and either collects the env the preview names or shows a plain
|
|
6
|
+
* confirm.
|
|
7
|
+
*/
|
|
8
|
+
import type { MarketplaceInstallResult, MarketplacePluginDetail } from '@tai42/api-client';
|
|
9
|
+
import { type ReactNode } from 'react';
|
|
10
|
+
export interface PluginInstallProps {
|
|
11
|
+
readonly refValue: string;
|
|
12
|
+
readonly version: string | null;
|
|
13
|
+
readonly detail: MarketplacePluginDetail;
|
|
14
|
+
/** After a 2xx install; the host invalidates its own caches and renders the report. */
|
|
15
|
+
readonly onInstalled: (result: MarketplaceInstallResult) => void;
|
|
16
|
+
/** After a failed install, already rendered in place; the host may record a store-off refusal. */
|
|
17
|
+
readonly onFailed?: (error: unknown) => void;
|
|
18
|
+
/** The user closed or cancelled without installing. */
|
|
19
|
+
readonly onDismiss: () => void;
|
|
20
|
+
}
|
|
21
|
+
/** The install in place, with its own Install button. */
|
|
22
|
+
export declare function PluginInstallPanel(props: PluginInstallProps): ReactNode;
|
|
23
|
+
/** The install in a dialog titled "Install plugin". */
|
|
24
|
+
export declare function PluginInstallDialog(props: PluginInstallProps): ReactNode;
|
|
25
|
+
/** The line that stands in for an Install control this session's grant does not admit. */
|
|
26
|
+
export declare const INSTALL_NO_GRANT = "This session cannot install from the marketplace. Installing needs administrator access to POST /api/marketplace/install; ask an administrator to install it.";
|
|
27
|
+
//# sourceMappingURL=plugin-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-install.d.ts","sourceRoot":"","sources":["../../src/marketplace-install/plugin-install.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAEV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAa1D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACjE,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AA6KD,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,CAEvE;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,CAExE;AAED,0FAA0F;AAC1F,eAAO,MAAM,gBAAgB,kKACoI,CAAC"}
|