zidane-ui 9.1.6 → 9.1.9
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/dist/adapters/run-host.js +17 -20
- package/dist/adapters/server-files-host.js +3 -1
- package/dist/adapters/server-host.js +18 -11
- package/dist/adapters/server-machines-host.js +3 -1
- package/dist/adapters/server-session-host.js +2 -1
- package/dist/adapters/server-settings-accounts.js +2 -1
- package/dist/adapters/server-settings-host.js +3 -3
- package/dist/adapters/sse-host.js +9 -7
- package/dist/chat/SessionGroupHeader.js +2 -2
- package/dist/chat/SessionHostHeader.js +1 -1
- package/dist/chat/StatusDot.js +24 -20
- package/dist/chat/composer/Composer.d.ts +13 -8
- package/dist/chat/composer/Composer.js +14 -10
- package/dist/chat/composer/ComposerEditor.js +1 -1
- package/dist/chat/composer/HostComposer.d.ts +1 -1
- package/dist/chat/composer/HostComposer.js +7 -10
- package/dist/chat/composer/RunStatusChip.js +13 -1
- package/dist/chat/composer/attachment-ingest.d.ts +4 -1
- package/dist/chat/composer/attachment-ingest.js +27 -10
- package/dist/chat/composer/composer-bus.d.ts +9 -1
- package/dist/chat/composer/composer-bus.js +49 -6
- package/dist/chat/composer/index.d.ts +2 -2
- package/dist/chat/composer/index.js +2 -2
- package/dist/chat/composer/use-draft-target.d.ts +4 -0
- package/dist/chat/composer/use-draft-target.js +15 -4
- package/dist/chat/composer/use-send-prompt.d.ts +5 -1
- package/dist/chat/composer/use-send-prompt.js +2 -12
- package/dist/chat/headless/chip-labels.d.ts +2 -0
- package/dist/chat/headless/chip-labels.js +3 -1
- package/dist/chat/headless/composer/labels-editor.d.ts +2 -0
- package/dist/chat/headless/composer/labels-editor.js +2 -0
- package/dist/chat/headless/file-chip.d.ts +12 -13
- package/dist/chat/headless/file-chip.js +40 -2
- package/dist/chat/headless/fixture-host.js +14 -17
- package/dist/chat/headless/host.d.ts +24 -6
- package/dist/chat/headless/index.d.ts +4 -4
- package/dist/chat/headless/index.js +4 -4
- package/dist/chat/headless/labels.d.ts +16 -0
- package/dist/chat/headless/labels.js +15 -2
- package/dist/chat/headless/send-flow.d.ts +21 -4
- package/dist/chat/headless/send-flow.js +25 -6
- package/dist/chat/headless/session-list.d.ts +11 -0
- package/dist/chat/headless/sidebar/index.js +1 -1
- package/dist/chat/headless/sidebar/labels.d.ts +12 -1
- package/dist/chat/headless/transcript-host.d.ts +8 -1
- package/dist/chat/headless/transcript-labels.d.ts +2 -0
- package/dist/chat/index.d.ts +3 -3
- package/dist/chat/index.js +2 -2
- package/dist/chat/interactions/InboxPanel.js +2 -2
- package/dist/chat/interactions/QuestionField.js +2 -2
- package/dist/chat/rich-composer/RichComposer.d.ts +9 -2
- package/dist/chat/rich-composer/RichComposer.js +28 -7
- package/dist/chat/rich-composer/composer-extensions.d.ts +2 -0
- package/dist/chat/rich-composer/composer-extensions.js +2 -2
- package/dist/chat/rich-composer/composer-keys.js +1 -1
- package/dist/chat/rich-composer/use-composer-bus.js +2 -1
- package/dist/chat/rich-composer/use-composer-editor.d.ts +4 -1
- package/dist/chat/rich-composer/use-composer-editor.js +2 -1
- package/dist/chat/sidebar/SessionSidebar.js +1 -2
- package/dist/chat/sidebar/SidebarSearchRow.js +1 -1
- package/dist/chat/sidebar/useSidebarKeyboardNav.d.ts +0 -2
- package/dist/chat/sidebar/useSidebarKeyboardNav.js +7 -13
- package/dist/chat/testing/contract.d.ts +1 -1
- package/dist/chat/testing/contract.js +8 -7
- package/dist/chat/transcript/BadgeMenu.d.ts +12 -3
- package/dist/chat/transcript/BadgeMenu.js +20 -3
- package/dist/chat/transcript/CodemodeScript.js +147 -44
- package/dist/chat/transcript/EditDiffBlock.js +1 -4
- package/dist/chat/transcript/FileChip.js +60 -14
- package/dist/chat/transcript/LiveOutput.js +7 -3
- package/dist/chat/transcript/badges.js +2 -2
- package/dist/chat/transcript/index.d.ts +2 -2
- package/dist/chat/transcript/markdown-context.d.ts +4 -1
- package/dist/chat/transcript/rolling.d.ts +12 -0
- package/dist/chat/transcript/rolling.js +22 -0
- package/dist/chat/transcript/script-input.d.ts +1 -1
- package/dist/chat/transcript/shell-block.js +70 -60
- package/dist/chat/transcript/tool-row.js +21 -5
- package/dist/code/editor/FileTree.d.ts +3 -1
- package/dist/code/editor/FileTree.js +29 -1
- package/dist/components/Restricted.d.ts +25 -0
- package/dist/components/Restricted.js +32 -0
- package/dist/components/StepFrame.d.ts +1 -1
- package/dist/components/ZidaneMark.d.ts +28 -0
- package/dist/components/ZidaneMark.js +114 -0
- package/dist/components/palette/PalettePanel.d.ts +7 -1
- package/dist/components/palette/PalettePanel.js +37 -11
- package/dist/components/zidane-mark.d.ts +52 -0
- package/dist/components/zidane-mark.js +94 -0
- package/dist/core.css +59 -6
- package/dist/dist/{index-DqCio7Nd.d.ts → index-Bq87OcGy.d.ts} +19 -12
- package/dist/dist/index.d.ts +1 -1
- package/dist/extensions/ExtensionSettingsSection.d.ts +18 -0
- package/dist/extensions/ExtensionSettingsSection.js +227 -0
- package/dist/extensions/headless/host.d.ts +1 -1
- package/dist/extensions/headless/labels.d.ts +41 -1
- package/dist/extensions/headless/labels.js +57 -0
- package/dist/extensions/headless/select.js +1 -2
- package/dist/extensions/index.d.ts +2 -1
- package/dist/extensions/index.js +2 -1
- package/dist/files/FilesTab.js +2 -0
- package/dist/files/TreeColumn.d.ts +5 -1
- package/dist/files/TreeColumn.js +6 -0
- package/dist/files/headless/fixture-host.js +5 -3
- package/dist/files/headless/host.d.ts +24 -6
- package/dist/files/headless/index.d.ts +2 -2
- package/dist/files/headless/labels.d.ts +1 -0
- package/dist/files/headless/labels.js +1 -0
- package/dist/files/testing/contract.js +9 -2
- package/dist/files/useWorkspace.d.ts +14 -2
- package/dist/files/useWorkspace.js +87 -9
- package/dist/git/BranchMenu.js +1 -1
- package/dist/git/MoveSessionDialog.js +1 -1
- package/dist/git/RemoteFolderPicker.js +1 -1
- package/dist/git/WherePicker.js +1 -1
- package/dist/git/headless/index.js +1 -1
- package/dist/git/useEnvironmentChoices.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/keybindings/headless/catalog.js +1 -1
- package/dist/labels.d.ts +1 -0
- package/dist/labels.js +1 -0
- package/dist/machines/DaemonMenu.js +1 -1
- package/dist/machines/HostCapabilities.d.ts +23 -1
- package/dist/machines/HostCapabilities.js +149 -65
- package/dist/machines/HostSyncPanel.js +129 -123
- package/dist/machines/HostsSection.js +5 -1
- package/dist/machines/ServerCard.d.ts +4 -2
- package/dist/machines/ServerCard.js +222 -99
- package/dist/machines/ServerMachinesPanel.js +16 -13
- package/dist/machines/ServerUpdatePanel.js +31 -21
- package/dist/machines/TokensPanel.js +75 -53
- package/dist/machines/headless/fixture-host.d.ts +5 -0
- package/dist/machines/headless/fixture-host.js +13 -4
- package/dist/machines/headless/fixtures.js +1 -1
- package/dist/machines/headless/host.d.ts +22 -2
- package/dist/machines/headless/index.d.ts +2 -2
- package/dist/machines/headless/labels.d.ts +22 -1
- package/dist/machines/headless/labels.js +22 -2
- package/dist/machines/testing/contract.d.ts +3 -1
- package/dist/machines/testing/contract.js +9 -0
- package/dist/motion/size.d.ts +22 -1
- package/dist/motion/size.js +82 -4
- package/dist/onboarding/demos/delivery.d.ts +16 -0
- package/dist/onboarding/demos/delivery.js +132 -0
- package/dist/onboarding/demos/index.d.ts +2 -1
- package/dist/onboarding/demos/index.js +2 -1
- package/dist/onboarding/headless/labels.d.ts +8 -0
- package/dist/onboarding/headless/labels.js +7 -0
- package/dist/onboarding/index.d.ts +2 -1
- package/dist/onboarding/index.js +2 -1
- package/dist/onboarding/steps/ConversationStep.js +46 -4
- package/dist/palette/CommandPalette.js +3 -0
- package/dist/palette/PaletteDialog.js +7 -3
- package/dist/palette/usePaletteController.d.ts +10 -0
- package/dist/palette/usePaletteController.js +25 -3
- package/dist/server/sse-handler.js +6 -1
- package/dist/session/ArtifactsPanel.js +1 -1
- package/dist/session/SideChat.js +1 -2
- package/dist/session/UsagePanel.js +1 -1
- package/dist/session/headless/host.d.ts +3 -1
- package/dist/session/headless/index.js +2 -2
- package/dist/settings/SettingsRestricted.d.ts +25 -0
- package/dist/settings/SettingsRestricted.js +44 -0
- package/dist/settings/SettingsRowsPage.js +31 -37
- package/dist/settings/headless/catalog.js +7 -6
- package/dist/settings/headless/labels.d.ts +4 -2
- package/dist/settings/headless/labels.js +4 -2
- package/dist/settings/headless/layout.js +1 -1
- package/dist/settings/headless/providers.d.ts +2 -0
- package/dist/settings/headless/search.d.ts +1 -1
- package/dist/settings/index.d.ts +2 -2
- package/dist/settings/index.js +2 -2
- package/dist/settings/rows.d.ts +51 -8
- package/dist/settings/rows.js +81 -26
- package/dist/settings/sections/enabled-list/EnabledListSection.js +3 -2
- package/dist/settings/sections/environments/EnvironmentsSection.js +4 -3
- package/dist/settings/sections/extensions/ExtensionConfigRows.d.ts +2 -2
- package/dist/settings/sections/extensions/ExtensionConfigRows.js +22 -25
- package/dist/settings/sections/extensions/ExtensionOptionsSection.js +3 -2
- package/dist/settings/sections/extensions/options-labels.d.ts +2 -2
- package/dist/settings/sections/extensions/options-labels.js +2 -2
- package/dist/settings/sections/host-catalog/HostCatalogSection.d.ts +5 -3
- package/dist/settings/sections/host-catalog/HostCatalogSection.js +7 -4
- package/dist/settings/sections/instructions/InstructionsSection.js +24 -17
- package/dist/settings/sections/logs/LogsSection.d.ts +2 -1
- package/dist/settings/sections/logs/LogsSection.js +64 -56
- package/dist/settings/sections/mcp/McpSection.d.ts +1 -1
- package/dist/settings/sections/mcp/McpSection.js +18 -17
- package/dist/settings/sections/models/ModelRows.d.ts +3 -3
- package/dist/settings/sections/models/ModelRows.js +8 -7
- package/dist/settings/sections/performance/PerformanceSection.js +13 -4
- package/dist/settings/sections/performance/labels.d.ts +0 -1
- package/dist/settings/sections/performance/labels.js +0 -1
- package/dist/settings/sections/providers/CredentialSources.js +18 -8
- package/dist/settings/sections/providers/ProvidersSection.d.ts +2 -2
- package/dist/settings/sections/providers/ProvidersSection.js +20 -17
- package/dist/settings/sections/providers/ServerProvidersSection.d.ts +1 -1
- package/dist/settings/sections/providers/ServerProvidersSection.js +10 -14
- package/dist/settings/sections/shared/catalog.js +3 -2
- package/dist/settings/sections/skills/SkillList.js +3 -2
- package/dist/settings/testing/accounts-demo.js +1 -0
- package/dist/settings/testing/accounts.contract.js +2 -0
- package/dist/styles.css +160 -24
- package/dist/terminal/HostTerminalSurface.js +1 -1
- package/dist/terminal/headless/links.d.ts +19 -1
- package/dist/terminal/headless/links.js +26 -2
- package/dist/theme/css-vars.js +1 -0
- package/dist/theme/derive.d.ts +4 -0
- package/dist/theme/derive.js +2 -0
- package/dist/workspace/PanelContentView.js +1 -1
- package/dist/workspace/PanelHome.d.ts +3 -1
- package/dist/workspace/PanelHome.js +4 -3
- package/dist/workspace/SidePanel.d.ts +3 -1
- package/dist/workspace/SidePanel.js +3 -2
- package/dist/workspace/headless/open-target.d.ts +1 -1
- package/dist/workspace/headless/open-target.js +2 -2
- package/package.json +2 -2
- package/src/styles/chat.css +10 -10
- package/src/styles/motion.css +37 -0
- package/src/styles/primitives.css +11 -3
- package/src/styles/sidebar.css +12 -0
- package/src/styles/tokens.css +6 -0
- package/src/styles/transcript.css +69 -5
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//#region src/components/zidane-mark.ts
|
|
2
|
+
const AMPLITUDE = .45;
|
|
3
|
+
const WAVE = 1.5;
|
|
4
|
+
const TILT = 28 * Math.PI / 180;
|
|
5
|
+
const COS = Math.cos(TILT);
|
|
6
|
+
const SIN = Math.sin(TILT);
|
|
7
|
+
/** The detail for a mark drawn `size` pixels wide: fewer, wider bands when small, so they stay apart. */
|
|
8
|
+
function markDetail(size) {
|
|
9
|
+
if (size <= 12) return {
|
|
10
|
+
spacing: .56,
|
|
11
|
+
duty: .68,
|
|
12
|
+
steps: 32
|
|
13
|
+
};
|
|
14
|
+
if (size <= 24) return {
|
|
15
|
+
spacing: .46,
|
|
16
|
+
duty: .72,
|
|
17
|
+
steps: 48
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
spacing: .36,
|
|
21
|
+
duty: .8,
|
|
22
|
+
steps: 96
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function point(u, v) {
|
|
26
|
+
const rho = Math.hypot(u, v) || 1e-9;
|
|
27
|
+
const r = rho >= 1 ? 1 : Math.sin(rho * Math.PI / 2);
|
|
28
|
+
const x = u / rho * r;
|
|
29
|
+
const y = v / rho * r;
|
|
30
|
+
return `${(x * COS - y * SIN).toFixed(3)} ${(x * SIN + y * COS).toFixed(3)}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The band paths at `phase` (0 to 1, one loop). Always the same number of
|
|
34
|
+
* paths for a detail; a band out of view is an empty path.
|
|
35
|
+
*/
|
|
36
|
+
function markPaths(detail, phase) {
|
|
37
|
+
const { spacing, duty, steps } = detail;
|
|
38
|
+
const k = Math.ceil(1.95 / spacing);
|
|
39
|
+
const p = (phase % 1 + 1) % 1 * spacing;
|
|
40
|
+
const paths = [];
|
|
41
|
+
for (let n = -k; n <= k; n++) {
|
|
42
|
+
const c = p + n * spacing;
|
|
43
|
+
const a = [];
|
|
44
|
+
const b = [];
|
|
45
|
+
let visible = false;
|
|
46
|
+
for (let i = 0; i <= steps; i++) {
|
|
47
|
+
const v = -1 + 2 * i / steps;
|
|
48
|
+
const u = c + AMPLITUDE * Math.sin(WAVE * Math.PI * v);
|
|
49
|
+
const w = u + spacing * duty;
|
|
50
|
+
if (Math.hypot(u, v) < 1 || Math.hypot(w, v) < 1 || u < 0 && w > 0 && Math.abs(v) < 1) visible = true;
|
|
51
|
+
a.push(point(u, v));
|
|
52
|
+
b.push(point(w, v));
|
|
53
|
+
}
|
|
54
|
+
paths.push(visible ? `M${a.join("L")}L${b.reverse().join("L")}Z` : "");
|
|
55
|
+
}
|
|
56
|
+
return paths;
|
|
57
|
+
}
|
|
58
|
+
/** How deep the bell goes: 1 stops the bands at each lull, 0 is a steady flow. Shallow: a surge, never a stall. */
|
|
59
|
+
const BELL = .35;
|
|
60
|
+
/** Bands one swell carries: a slow surge, not a throb per band. */
|
|
61
|
+
const MARK_SWELL = 3;
|
|
62
|
+
/**
|
|
63
|
+
* Where a swell's time (0 to 1) puts the bands, in loops (0 to
|
|
64
|
+
* {@link MARK_SWELL}): they gather speed, peak mid-swell and settle, a
|
|
65
|
+
* raised-cosine bell of speed. Its mean is one loop per loop of time, so
|
|
66
|
+
* `speed` still counts loops per second, and a swell ends on a whole loop.
|
|
67
|
+
*/
|
|
68
|
+
function markEase(t) {
|
|
69
|
+
return 3 * (t - BELL * Math.sin(2 * Math.PI * t) / (2 * Math.PI));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Frames kept per loop. At the fastest pace (streaming, mid-swell) a loop
|
|
73
|
+
* takes about a third of a second, so 96 frames is still more than a display shows:
|
|
74
|
+
* snapping to them is invisible, and every mark of a detail shares them.
|
|
75
|
+
*/
|
|
76
|
+
const MARK_FRAMES = 96;
|
|
77
|
+
const frames = /* @__PURE__ */ new Map();
|
|
78
|
+
/** The frame index (0 to {@link MARK_FRAMES} - 1) a phase snaps to. */
|
|
79
|
+
function markFrameIndex(phase) {
|
|
80
|
+
return Math.round((phase % 1 + 1) % 1 * 96) % 96;
|
|
81
|
+
}
|
|
82
|
+
/** The band paths of frame `index` for a detail, computed once and kept. */
|
|
83
|
+
function markFrame(detail, index) {
|
|
84
|
+
const key = `${detail.spacing}|${detail.duty}|${detail.steps}`;
|
|
85
|
+
let cache = frames.get(key);
|
|
86
|
+
if (!cache) frames.set(key, cache = []);
|
|
87
|
+
return cache[index] ??= markPaths(detail, index / 96);
|
|
88
|
+
}
|
|
89
|
+
/** The still mark (phase 0) for a detail, computed once and kept. */
|
|
90
|
+
function markStill(detail) {
|
|
91
|
+
return markFrame(detail, 0);
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { MARK_FRAMES, MARK_SWELL, markDetail, markEase, markFrame, markFrameIndex, markPaths, markStill };
|
package/dist/core.css
CHANGED
|
@@ -222,6 +222,9 @@
|
|
|
222
222
|
.gap-6{gap:1.5rem;}
|
|
223
223
|
.space-y-3>:not([hidden])~:not([hidden]){--un-space-y-reverse:0;margin-top:calc(0.75rem * calc(1 - var(--un-space-y-reverse)));margin-bottom:calc(0.75rem * var(--un-space-y-reverse));}
|
|
224
224
|
.space-y-5>:not([hidden])~:not([hidden]){--un-space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--un-space-y-reverse)));margin-bottom:calc(1.25rem * var(--un-space-y-reverse));}
|
|
225
|
+
.divide-y>:not([hidden])~:not([hidden]){--un-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--un-divide-y-reverse)));border-bottom-width:calc(1px * var(--un-divide-y-reverse));}
|
|
226
|
+
.border-zg-border,
|
|
227
|
+
.divide-\[var\(--zg-border\)\]>:not([hidden])~:not([hidden]){border-color:var(--zg-border);}
|
|
225
228
|
.overflow-auto{overflow:auto;}
|
|
226
229
|
.overflow-hidden{overflow:hidden;}
|
|
227
230
|
.overflow-x-auto{overflow-x:auto;}
|
|
@@ -240,7 +243,6 @@
|
|
|
240
243
|
.border-r{border-right-width:1px;}
|
|
241
244
|
.border-\[var\(--zg-hairline\)\]{border-color:var(--zg-hairline);}
|
|
242
245
|
.border-transparent{border-color:transparent;}
|
|
243
|
-
.border-zg-border{border-color:var(--zg-border);}
|
|
244
246
|
.\!rounded-full{border-radius:9999px !important;}
|
|
245
247
|
.rounded{border-radius:0.25rem;}
|
|
246
248
|
.rounded-\[1px\]{border-radius:1px;}
|
|
@@ -350,6 +352,8 @@
|
|
|
350
352
|
.text-\[var\(--zg-accent\)\]{color:var(--zg-accent);}
|
|
351
353
|
.text-\[var\(--zg-bg\)\]{color:var(--zg-bg);}
|
|
352
354
|
.text-\[var\(--zg-code-fg\)\]{color:var(--zg-code-fg);}
|
|
355
|
+
.text-\[var\(--zg-danger\)\],
|
|
356
|
+
.text-zg-danger{color:var(--zg-danger);}
|
|
353
357
|
.text-\[var\(--zg-text-muted\)\],
|
|
354
358
|
.text-zg-muted{color:var(--zg-text-muted);}
|
|
355
359
|
.text-\[var\(--zg-text-subtle\)\]{color:var(--zg-text-subtle);}
|
|
@@ -357,7 +361,6 @@
|
|
|
357
361
|
.text-\[var\(--zg-warn\)\],
|
|
358
362
|
.text-zg-warn{color:var(--zg-warn);}
|
|
359
363
|
.text-zg-accent-fill-fg{color:var(--zg-accent-fill-fg);}
|
|
360
|
-
.text-zg-danger{color:var(--zg-danger);}
|
|
361
364
|
.text-zg-info{color:var(--zg-info);}
|
|
362
365
|
.text-zg-success{color:var(--zg-success);}
|
|
363
366
|
.hover\:\!text-zg-danger:hover{color:var(--zg-danger) !important;}
|
|
@@ -378,7 +381,6 @@
|
|
|
378
381
|
.tracking-\[0\.12em\]{letter-spacing:0.12em;}
|
|
379
382
|
.font-mono{font-family:var(--zg-font-mono);}
|
|
380
383
|
.font-sans{font-family:var(--zg-font-ui);}
|
|
381
|
-
.uppercase{text-transform:uppercase;}
|
|
382
384
|
.italic{font-style:italic;}
|
|
383
385
|
.tabular-nums{--un-numeric-spacing:tabular-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction);}
|
|
384
386
|
.underline{text-decoration-line:underline;}
|
|
@@ -474,6 +476,7 @@
|
|
|
474
476
|
--zg-ring: #26a9f1;
|
|
475
477
|
|
|
476
478
|
--zg-text-raw: #e5e8ec;
|
|
479
|
+
--zg-text-strong-raw: #ffffff;
|
|
477
480
|
--zg-text-muted-raw: #9499a0;
|
|
478
481
|
--zg-text-subtle-raw: #5f636a;
|
|
479
482
|
|
|
@@ -740,6 +743,11 @@ html[data-motion='off'] {
|
|
|
740
743
|
color-mix(in oklab, var(--zg-text-raw) var(--zg-contrast-base), var(--zg-bg)),
|
|
741
744
|
var(--zg-contrast-target) var(--zg-contrast-boost)
|
|
742
745
|
);
|
|
746
|
+
--zg-text-strong: color-mix(
|
|
747
|
+
in oklab,
|
|
748
|
+
color-mix(in oklab, var(--zg-text-strong-raw, var(--zg-text-raw)) var(--zg-contrast-base), var(--zg-bg)),
|
|
749
|
+
var(--zg-contrast-target) var(--zg-contrast-boost)
|
|
750
|
+
);
|
|
743
751
|
--zg-text-muted: color-mix(
|
|
744
752
|
in oklab,
|
|
745
753
|
color-mix(in oklab, var(--zg-text-muted-raw) var(--zg-contrast-base), var(--zg-bg)),
|
|
@@ -881,6 +889,16 @@ html[data-motion='off'] {
|
|
|
881
889
|
scale: 0.985;
|
|
882
890
|
}
|
|
883
891
|
|
|
892
|
+
/* Restricted (`Restricted.tsx`): what a connection may read but not change,
|
|
893
|
+
dimmed by tone and opacity together; its tooltip says why. */
|
|
894
|
+
.zg-restricted {
|
|
895
|
+
cursor: not-allowed;
|
|
896
|
+
}
|
|
897
|
+
.zg-restricted > [inert] {
|
|
898
|
+
opacity: 0.55;
|
|
899
|
+
filter: saturate(0.6);
|
|
900
|
+
}
|
|
901
|
+
|
|
884
902
|
/* Tooltip (`Tooltip.tsx`): visibility, the fade + 2px rise and the show
|
|
885
903
|
delay are driven inline by the component (one timing model for inline and
|
|
886
904
|
portalled bubbles). This is the hidden state before it renders. */
|
|
@@ -1111,12 +1129,10 @@ html[data-motion='off'] {
|
|
|
1111
1129
|
background: var(--zg-row-hover);
|
|
1112
1130
|
}
|
|
1113
1131
|
|
|
1114
|
-
/* The
|
|
1132
|
+
/* The section label: sentence case, as written. */
|
|
1115
1133
|
.zg-section-label {
|
|
1116
1134
|
font-size: var(--zg-font-size-badge);
|
|
1117
1135
|
font-weight: 600;
|
|
1118
|
-
letter-spacing: 0.08em;
|
|
1119
|
-
text-transform: uppercase;
|
|
1120
1136
|
/* A real label, read like any text: the muted tone (subtle is for decoration). */
|
|
1121
1137
|
color: var(--zg-text-muted);
|
|
1122
1138
|
}
|
|
@@ -1520,6 +1536,16 @@ html[data-motion='reduced'] .zg-shimmer {
|
|
|
1520
1536
|
white-space: nowrap;
|
|
1521
1537
|
}
|
|
1522
1538
|
|
|
1539
|
+
/* SmoothHeight: eases between two contents' heights while `data-easing`, then lets go. */
|
|
1540
|
+
.zg-smooth-height[data-easing] {
|
|
1541
|
+
overflow: hidden;
|
|
1542
|
+
transition: height var(--zg-motion-settle);
|
|
1543
|
+
}
|
|
1544
|
+
/* The content's own margins stay inside what is measured. */
|
|
1545
|
+
.zg-smooth-height-inner {
|
|
1546
|
+
display: flow-root;
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1523
1549
|
/* HeldWidth: a trailing slot held to its widest content; content sits on
|
|
1524
1550
|
the right edge and is revealed from the left as the slot grows. */
|
|
1525
1551
|
.zg-held-width {
|
|
@@ -1942,6 +1968,33 @@ html[data-motion='reduced'] :is(.animate-spin, .zg-spin-ring, .zg-sendstop-ring)
|
|
|
1942
1968
|
`running`, Timeline `tool-running`). Applied to an absolutely positioned
|
|
1943
1969
|
ring sibling, never to the dot itself. */
|
|
1944
1970
|
|
|
1971
|
+
/* The zidane mark spinning in and out (`ZidaneMark`): a quarter turn the way
|
|
1972
|
+
its bands flow, from `--zg-mark-from` of its size (the dot it grows out
|
|
1973
|
+
of in `StatusDot`). `.zg-mark-in` plays on mount; `.zg-mark-swap` on a
|
|
1974
|
+
`Presence` plays both ways. Turn and scale ride `snap` in and `exit`
|
|
1975
|
+
out, opacity `fade` / `fade-out`. */
|
|
1976
|
+
.zg-mark-in,
|
|
1977
|
+
.zg-presence.zg-mark-swap[data-state='enter'] {
|
|
1978
|
+
animation:
|
|
1979
|
+
zg-mark-in var(--zg-motion-snap) both,
|
|
1980
|
+
zg-fade-in var(--zg-motion-fade) both;
|
|
1981
|
+
}
|
|
1982
|
+
.zg-presence.zg-mark-swap[data-state='exit'] {
|
|
1983
|
+
animation:
|
|
1984
|
+
zg-mark-out var(--zg-motion-exit) both,
|
|
1985
|
+
zg-fade-out var(--zg-motion-fade-out) both;
|
|
1986
|
+
}
|
|
1987
|
+
@keyframes zg-mark-in {
|
|
1988
|
+
from {
|
|
1989
|
+
transform: scale(var(--zg-mark-from, 0.6)) rotate(-90deg);
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1992
|
+
@keyframes zg-mark-out {
|
|
1993
|
+
to {
|
|
1994
|
+
transform: scale(var(--zg-mark-from, 0.6)) rotate(45deg);
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1945
1998
|
@keyframes zg-orbit {
|
|
1946
1999
|
to {
|
|
1947
2000
|
transform: rotate(360deg);
|
|
@@ -6,7 +6,7 @@ import "../node_modules/.bun/@earendil-works_pi-ai@1.3.0_bff1df87cb190f90/node_m
|
|
|
6
6
|
import "../node_modules/.bun/@anthropic-ai_sdk@0.104.2_fff7ddf946fac095/node_modules/@anthropic-ai/sdk/index.js";
|
|
7
7
|
import "../node_modules/.bun/@anthropic-ai_sdk@0.104.2_fff7ddf946fac095/node_modules/@anthropic-ai/sdk/resources2.js";
|
|
8
8
|
import { ReactNode } from "react";
|
|
9
|
-
//#region ../dist/index-
|
|
9
|
+
//#region ../dist/index-Bq87OcGy.d.ts
|
|
10
10
|
//#endregion
|
|
11
11
|
//#region src/thinking-levels.d.ts
|
|
12
12
|
/**
|
|
@@ -112,16 +112,18 @@ interface OutputLine {
|
|
|
112
112
|
}
|
|
113
113
|
//#endregion
|
|
114
114
|
//#region src/chat/script-progress.d.ts
|
|
115
|
-
/** How the latest call of a script line stands. */
|
|
116
|
-
type ScriptCallStatus = 'running' | 'ok' | 'error';
|
|
115
|
+
/** How the latest call of a script line stands: `waiting` is a `sleep(ms)` in progress. */
|
|
116
|
+
type ScriptCallStatus = 'running' | 'waiting' | 'ok' | 'error';
|
|
117
117
|
/** A script line that made calls. */
|
|
118
118
|
interface ScriptLineProgress {
|
|
119
119
|
/** 1-based line in the script as the model wrote it. */
|
|
120
120
|
line: number;
|
|
121
121
|
/** State of the latest call made from this line. */
|
|
122
122
|
status: ScriptCallStatus;
|
|
123
|
-
/** Calls made from this line so far. */
|
|
123
|
+
/** Calls made from this line so far, its `sleep`s included. */
|
|
124
124
|
calls: number;
|
|
125
|
+
/** While it waits (`waiting`): when the wait ends, epoch milliseconds. */
|
|
126
|
+
until?: number;
|
|
125
127
|
}
|
|
126
128
|
/** One line of what a script printed or its shell calls wrote. */
|
|
127
129
|
type ScriptOutputLine = OutputLine;
|
|
@@ -139,6 +141,8 @@ interface ScriptProgress {
|
|
|
139
141
|
output: ScriptOutputLine[];
|
|
140
142
|
/** How the script ended, once it did: its last line shows done when it ended without error. */
|
|
141
143
|
ended?: 'ok' | 'error';
|
|
144
|
+
/** The line of the latest call or wait to start: where the script is (in a loop, which round's lines are behind it). */
|
|
145
|
+
at?: number;
|
|
142
146
|
}
|
|
143
147
|
//#endregion
|
|
144
148
|
//#region src/chat/secrets/protocol.d.ts
|
|
@@ -175,7 +179,7 @@ type QueryBound = number | string;
|
|
|
175
179
|
* session without an environment. `projectName` is computed: the folder name
|
|
176
180
|
* (last path segment) of `projectRoot`, or of `cwd` without one.
|
|
177
181
|
*/
|
|
178
|
-
type SessionFieldName = 'id' | 'title' | 'projectRoot' | 'projectName' | 'cwd' | 'agentId' | 'status' | 'createdAt' | 'updatedAt' | 'runStartedAt' | 'archived' | 'favorite' | 'isMain' | 'spaceId' | 'scheduleId' | 'providerKey' | 'modelId' | 'account' | 'effort' | 'hostId' | 'repoKey' | 'environment.kind' | 'environment.state' | 'environment.branch';
|
|
182
|
+
type SessionFieldName = 'id' | 'title' | 'projectRoot' | 'projectName' | 'cwd' | 'agentId' | 'status' | 'createdAt' | 'updatedAt' | 'runStartedAt' | 'archived' | 'favorite' | 'isMain' | 'spaceId' | 'scheduleId' | 'providerKey' | 'modelId' | 'account' | 'effort' | 'hostId' | 'repoKey' | 'environment.kind' | 'environment.state' | 'environment.branch' | 'wakes';
|
|
179
183
|
/**
|
|
180
184
|
* A facet an extension computes for each session: `facet.<extensionId>.<key>`,
|
|
181
185
|
* optionally followed by `.<property>` steps into an object value (a number
|
|
@@ -331,6 +335,8 @@ type ToolCallDisplay = 'hidden' | 'formatted' | 'full';
|
|
|
331
335
|
type InteractionMode = 'ask' | 'skip' | 'disabled';
|
|
332
336
|
/** Who approves tool calls: `ask` the user, `decide` the decision model (unsure calls still ask), `off` nobody (full access). */
|
|
333
337
|
type ApprovalMode = 'ask' | 'decide' | 'off';
|
|
338
|
+
/** What happens to a message sent while a run works: it goes into the run (`steer`), or waits for the run to end (`queue`). */
|
|
339
|
+
type MessageDelivery = 'steer' | 'queue';
|
|
334
340
|
/** Network policy for sandboxed shell commands — see {@link Settings.sandboxNetwork}. */
|
|
335
341
|
type SandboxNetwork = 'allow' | 'deny';
|
|
336
342
|
/**
|
|
@@ -584,13 +590,14 @@ interface Settings {
|
|
|
584
590
|
*/
|
|
585
591
|
maxParallelSubagents: number;
|
|
586
592
|
/**
|
|
587
|
-
*
|
|
588
|
-
*
|
|
589
|
-
* (`agent.steer()
|
|
590
|
-
*
|
|
591
|
-
*
|
|
593
|
+
* What happens to a message that you send while a run works.
|
|
594
|
+
* `'queue'`: it waits in the queue and is sent when the run ends.
|
|
595
|
+
* `'steer'`: it goes into the run (`agent.steer()`), and the model reads
|
|
596
|
+
* it after the current step. A `/` command always waits in the queue, and
|
|
597
|
+
* so does a message that the run refuses. A client can ask for the other
|
|
598
|
+
* delivery for one message (Alt+Enter). Default: `'queue'`.
|
|
592
599
|
*/
|
|
593
|
-
|
|
600
|
+
messageDelivery: MessageDelivery;
|
|
594
601
|
/**
|
|
595
602
|
* Active theme id — looked up in `BUILTIN_THEMES` to resolve the palette,
|
|
596
603
|
* select styling, syntax highlight tokens, etc. Default: `'default'`.
|
|
@@ -1482,4 +1489,4 @@ interface Settings {
|
|
|
1482
1489
|
activeIcon: string;
|
|
1483
1490
|
}
|
|
1484
1491
|
//#endregion
|
|
1485
|
-
export {
|
|
1492
|
+
export { EditDiffDisplay as $d, SessionQueryNot as Eb, SpaceIcon as Ef, ScriptCallStatus as Hw, ScriptOutputLine as Jw, SecretTtl as KC, SessionSort as Ob, ApprovalMode as Qd, SessionQueryAny as Sb, Space as Tf, DurabilityMode as UD, ScriptLineProgress as Uw, ThinkingLevel as WR, EnvironmentSettings as XE, ScriptProgress as Yw, AnsiStyle as _T, SessionGroupBy as _b, MessageDelivery as af, SessionQuery as bb, OpenInTarget as cf, OutputStream as dT, QueryBound as db, QueryValue as fb, AnsiSpan as gT, EnvironmentConfigValue as hD, SessionFieldPath as hb, Settings as hf, InteractionMode as if, AnsiColor as mT, SessionFieldName as mb, SessionCondition as pb, OutputLine as uT, FacetPath as ub, SessionGroupOrder as vb, ToolCallDisplay as vf, SessionQueryAll as xb, TranscriptDensity as yf };
|
package/dist/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { d as AuthFailureKind, u as AuthFailure } from "./timeout-B5pO5I5a.js";
|
|
2
2
|
import "./types-2HrgolQz.js";
|
|
3
3
|
import "./oauth-callback-page-DMxIgurj.js";
|
|
4
|
-
import { Eb as
|
|
4
|
+
import { Eb as SessionQueryNot, Ob as SessionSort, Sb as SessionQueryAny, WR as ThinkingLevel, _b as SessionGroupBy, bb as SessionQuery, db as QueryBound, fb as QueryValue, hb as SessionFieldPath, mb as SessionFieldName, pb as SessionCondition, ub as FacetPath, vb as SessionGroupOrder, xb as SessionQueryAll } from "./index-Bq87OcGy.js";
|
|
5
5
|
import "./index-f-XWIoYo.js";
|
|
6
6
|
import "./sandbox-B4OW6oNx.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CSSProperties } from "react";
|
|
2
|
+
//#region src/extensions/ExtensionSettingsSection.d.ts
|
|
3
|
+
/** Props for {@link ExtensionSettingsSection}. */
|
|
4
|
+
interface ExtensionSettingsSectionProps {
|
|
5
|
+
/** Extra classes on the root. */
|
|
6
|
+
className?: string;
|
|
7
|
+
/** Inline styles on the root. */
|
|
8
|
+
style?: CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Renders the extensions' locked settings, catalog changes and integrations for the folder in view, over
|
|
12
|
+
* the nearest extensions host (`settings`, `integrations`; one left out shows nothing of its part).
|
|
13
|
+
*
|
|
14
|
+
* @param props - `className` and `style`.
|
|
15
|
+
*/
|
|
16
|
+
declare function ExtensionSettingsSection({ className, style }: ExtensionSettingsSectionProps): import("react").JSX.Element | null;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { ExtensionSettingsSection, ExtensionSettingsSectionProps };
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { useReadable } from "../chat/headless/store.js";
|
|
2
|
+
import { extensionsErrorOf } from "./headless/host.js";
|
|
3
|
+
import { useExtensionsLabels } from "./useExtensionsLabels.js";
|
|
4
|
+
import { useExtensionsHost } from "./ExtensionsProvider.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
//#region src/extensions/ExtensionSettingsSection.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Settings › Extensions, the extension host part. The settings rows
|
|
10
|
+
* themselves show above it, in the options section (the runtime projects them
|
|
11
|
+
* onto the config schema, and writes land in the same `extensionConfig` bag
|
|
12
|
+
* the extension settings port reads); this part adds what that section lacks:
|
|
13
|
+
* the values a declarative config entry locks, the catalog items extensions
|
|
14
|
+
* added, changed or hid, and each integration's connected accounts
|
|
15
|
+
* (Disconnect, Make default) and the ways to add one. The extensions' own
|
|
16
|
+
* settings pages and the `settings.section` slot follow, drawn by the
|
|
17
|
+
* Extensions page (`ExtensionsSection`, `ExtensionSettingsPages`).
|
|
18
|
+
* Everything goes through the nearest extensions host; nothing shows without
|
|
19
|
+
* one, or when it has nothing to show.
|
|
20
|
+
*/
|
|
21
|
+
const EMPTY_SETTINGS = {
|
|
22
|
+
schema: {
|
|
23
|
+
categories: [],
|
|
24
|
+
items: []
|
|
25
|
+
},
|
|
26
|
+
actions: [],
|
|
27
|
+
values: {},
|
|
28
|
+
locked: []
|
|
29
|
+
};
|
|
30
|
+
const NO_INTEGRATIONS = [];
|
|
31
|
+
const noop = {
|
|
32
|
+
get: () => EMPTY_SETTINGS,
|
|
33
|
+
subscribe: () => () => {}
|
|
34
|
+
};
|
|
35
|
+
const noIntegrations = {
|
|
36
|
+
get: () => NO_INTEGRATIONS,
|
|
37
|
+
subscribe: () => () => {}
|
|
38
|
+
};
|
|
39
|
+
/** One integration: its connected accounts, the default first, and the ways to add one. */
|
|
40
|
+
function IntegrationRow({ integration }) {
|
|
41
|
+
const host = useExtensionsHost();
|
|
42
|
+
const l = useExtensionsLabels();
|
|
43
|
+
const [keys, setKeys] = useState({});
|
|
44
|
+
const [busy, setBusy] = useState(false);
|
|
45
|
+
const [error, setError] = useState(null);
|
|
46
|
+
const run = (work) => {
|
|
47
|
+
setBusy(true);
|
|
48
|
+
setError(null);
|
|
49
|
+
Promise.resolve(work()).catch((err) => setError(l.extensionIntegrationError(extensionsErrorOf(err)))).finally(() => setBusy(false));
|
|
50
|
+
};
|
|
51
|
+
const connections = integration.connections ?? (integration.connection ? [integration.connection] : []);
|
|
52
|
+
const connected = connections.length > 0;
|
|
53
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
54
|
+
className: "flex flex-col gap-1.5 py-2",
|
|
55
|
+
"data-integration": integration.id,
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsxs("div", {
|
|
58
|
+
className: "flex items-center gap-2",
|
|
59
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
60
|
+
className: "text-zg-ui font-medium",
|
|
61
|
+
children: integration.name
|
|
62
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
63
|
+
className: "text-zg-label text-[var(--zg-text-muted)]",
|
|
64
|
+
children: !connected ? l.extensionIntegrationNotConnected : connections.length === 1 ? l.extensionIntegrationConnected : l.extensionIntegrationAccountCount(connections.length)
|
|
65
|
+
})]
|
|
66
|
+
}),
|
|
67
|
+
integration.description && /* @__PURE__ */ jsx("p", {
|
|
68
|
+
className: "text-zg-label text-[var(--zg-text-muted)]",
|
|
69
|
+
children: integration.description
|
|
70
|
+
}),
|
|
71
|
+
connected && /* @__PURE__ */ jsx("ul", {
|
|
72
|
+
"aria-label": l.extensionIntegrationAccounts(integration.name),
|
|
73
|
+
className: "flex flex-col gap-1",
|
|
74
|
+
children: connections.map((c) => /* @__PURE__ */ jsxs("li", {
|
|
75
|
+
className: "flex items-center gap-2 text-zg-label",
|
|
76
|
+
"data-connection": c.account,
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ jsx("span", { children: c.label ?? c.account }),
|
|
79
|
+
c.isDefault ? /* @__PURE__ */ jsx("span", {
|
|
80
|
+
className: "zg-meta",
|
|
81
|
+
children: l.extensionIntegrationDefault
|
|
82
|
+
}) : /* @__PURE__ */ jsx("button", {
|
|
83
|
+
type: "button",
|
|
84
|
+
className: "text-zg-label underline",
|
|
85
|
+
disabled: busy,
|
|
86
|
+
"aria-label": l.extensionIntegrationMakeDefaultLabel(c.label ?? c.account),
|
|
87
|
+
onClick: () => run(() => host?.integrations?.setDefault(integration.id, c.account)),
|
|
88
|
+
children: l.extensionIntegrationMakeDefault
|
|
89
|
+
}),
|
|
90
|
+
/* @__PURE__ */ jsx("button", {
|
|
91
|
+
type: "button",
|
|
92
|
+
className: "ml-auto text-zg-label underline",
|
|
93
|
+
disabled: busy,
|
|
94
|
+
"aria-label": l.extensionIntegrationDisconnectLabel(c.label ?? c.account),
|
|
95
|
+
onClick: () => run(() => host?.integrations?.disconnect(integration.id, { account: c.account })),
|
|
96
|
+
children: l.extensionIntegrationDisconnect
|
|
97
|
+
})
|
|
98
|
+
]
|
|
99
|
+
}, c.account))
|
|
100
|
+
}),
|
|
101
|
+
integration.methods.map((method) => method.type === "apiKey" ? /* @__PURE__ */ jsxs("form", {
|
|
102
|
+
className: "flex items-center gap-2",
|
|
103
|
+
onSubmit: (e) => {
|
|
104
|
+
e.preventDefault();
|
|
105
|
+
run(() => host?.integrations?.connect(integration.id, {
|
|
106
|
+
methodId: method.id,
|
|
107
|
+
key: keys[method.id] ?? ""
|
|
108
|
+
}).then(() => setKeys((k) => ({
|
|
109
|
+
...k,
|
|
110
|
+
[method.id]: ""
|
|
111
|
+
}))));
|
|
112
|
+
},
|
|
113
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
114
|
+
type: "password",
|
|
115
|
+
"aria-label": method.label,
|
|
116
|
+
placeholder: method.placeholder ?? method.label,
|
|
117
|
+
value: keys[method.id] ?? "",
|
|
118
|
+
onChange: (e) => setKeys((k) => ({
|
|
119
|
+
...k,
|
|
120
|
+
[method.id]: e.target.value
|
|
121
|
+
})),
|
|
122
|
+
className: "zg-well flex-1 min-w-0 rounded px-2 py-1 text-zg-label"
|
|
123
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
124
|
+
type: "submit",
|
|
125
|
+
disabled: busy || !keys[method.id],
|
|
126
|
+
className: "text-zg-label underline",
|
|
127
|
+
children: connected ? l.extensionIntegrationAddAccount : l.extensionIntegrationConnect
|
|
128
|
+
})]
|
|
129
|
+
}, method.id) : /* @__PURE__ */ jsx("button", {
|
|
130
|
+
type: "button",
|
|
131
|
+
disabled: busy,
|
|
132
|
+
className: "self-start text-zg-label underline",
|
|
133
|
+
onClick: () => run(() => host?.integrations?.connect(integration.id, { methodId: method.id })),
|
|
134
|
+
children: connected ? l.extensionIntegrationAddAccountWith(method.label) : method.label
|
|
135
|
+
}, method.id)),
|
|
136
|
+
error && /* @__PURE__ */ jsx("p", {
|
|
137
|
+
role: "alert",
|
|
138
|
+
className: "text-zg-label text-[var(--zg-danger)]",
|
|
139
|
+
children: error
|
|
140
|
+
})
|
|
141
|
+
]
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Renders the extensions' locked settings, catalog changes and integrations for the folder in view, over
|
|
146
|
+
* the nearest extensions host (`settings`, `integrations`; one left out shows nothing of its part).
|
|
147
|
+
*
|
|
148
|
+
* @param props - `className` and `style`.
|
|
149
|
+
*/
|
|
150
|
+
function ExtensionSettingsSection({ className, style }) {
|
|
151
|
+
const host = useExtensionsHost();
|
|
152
|
+
const l = useExtensionsLabels();
|
|
153
|
+
const wire = useReadable(host?.settings?.wire ?? noop);
|
|
154
|
+
const integrations = useReadable(host?.integrations?.list ?? noIntegrations);
|
|
155
|
+
if (!host) return null;
|
|
156
|
+
const locked = wire.locked;
|
|
157
|
+
const changes = wire.provenance ?? [];
|
|
158
|
+
if (locked.length === 0 && changes.length === 0 && integrations.length === 0) return null;
|
|
159
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
160
|
+
"aria-label": l.extensionSettingsSection,
|
|
161
|
+
className: ["flex flex-col gap-4", className].filter(Boolean).join(" "),
|
|
162
|
+
style,
|
|
163
|
+
children: [
|
|
164
|
+
locked.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
165
|
+
className: "text-zg-label text-[var(--zg-text-muted)]",
|
|
166
|
+
children: l.extensionSettingsLockedHeading
|
|
167
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
168
|
+
className: "text-zg-label",
|
|
169
|
+
children: locked.map((id) => {
|
|
170
|
+
const [extension = "", key = ""] = id.split(":");
|
|
171
|
+
const value = wire.values[extension]?.[key];
|
|
172
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
173
|
+
className: "flex gap-2 py-0.5",
|
|
174
|
+
"data-locked-setting": id,
|
|
175
|
+
children: [
|
|
176
|
+
/* @__PURE__ */ jsx("span", {
|
|
177
|
+
className: "font-mono",
|
|
178
|
+
children: id
|
|
179
|
+
}),
|
|
180
|
+
value !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
181
|
+
className: "text-[var(--zg-text-muted)]",
|
|
182
|
+
children: String(value)
|
|
183
|
+
}),
|
|
184
|
+
/* @__PURE__ */ jsx("span", {
|
|
185
|
+
className: "ml-auto text-[var(--zg-text-muted)]",
|
|
186
|
+
children: l.extensionSettingsLockedTag
|
|
187
|
+
})
|
|
188
|
+
]
|
|
189
|
+
}, id);
|
|
190
|
+
})
|
|
191
|
+
})] }),
|
|
192
|
+
changes.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
193
|
+
className: "text-zg-label text-[var(--zg-text-muted)]",
|
|
194
|
+
children: l.extensionSettingsChangesHeading
|
|
195
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
196
|
+
className: "text-zg-label",
|
|
197
|
+
children: changes.map((p) => /* @__PURE__ */ jsxs("li", {
|
|
198
|
+
className: "flex gap-2 py-0.5",
|
|
199
|
+
"data-catalog-change": `${p.kind}:${p.id}`,
|
|
200
|
+
children: [
|
|
201
|
+
/* @__PURE__ */ jsx("span", {
|
|
202
|
+
className: "text-[var(--zg-text-muted)]",
|
|
203
|
+
children: l.extensionCatalogKind(p.kind)
|
|
204
|
+
}),
|
|
205
|
+
/* @__PURE__ */ jsx("span", {
|
|
206
|
+
className: "font-mono",
|
|
207
|
+
children: p.id
|
|
208
|
+
}),
|
|
209
|
+
/* @__PURE__ */ jsx("span", {
|
|
210
|
+
className: "ml-auto text-[var(--zg-text-muted)]",
|
|
211
|
+
children: l.extensionProvenance(p)
|
|
212
|
+
})
|
|
213
|
+
]
|
|
214
|
+
}, `${p.kind}:${p.id}`))
|
|
215
|
+
})] }),
|
|
216
|
+
integrations.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
217
|
+
className: "text-zg-label text-[var(--zg-text-muted)]",
|
|
218
|
+
children: l.extensionSettingsIntegrationsHeading
|
|
219
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
220
|
+
className: "divide-y divide-[var(--zg-border)]",
|
|
221
|
+
children: integrations.map((integration) => /* @__PURE__ */ jsx(IntegrationRow, { integration }, integration.id))
|
|
222
|
+
})] })
|
|
223
|
+
]
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//#endregion
|
|
227
|
+
export { ExtensionSettingsSection };
|
|
@@ -381,7 +381,7 @@ interface ExtensionLinkRequest {
|
|
|
381
381
|
* The least client token scope that may run something (`chat` ⊂ `approve` ⊂ `admin`): zidane's
|
|
382
382
|
* `AccessScope`, the scope of an action setting.
|
|
383
383
|
*/
|
|
384
|
-
type ExtensionAccessScope = 'chat' | '
|
|
384
|
+
type ExtensionAccessScope = 'chat' | 'admin';
|
|
385
385
|
/** Options of {@link ExtensionsHost.rpc}. */
|
|
386
386
|
interface ExtensionRpcOptions {
|
|
387
387
|
/** The extension whose UI calls: its own contracts count as local (internal methods allowed). */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ExtensionsError } from "./host.js";
|
|
1
|
+
import { ExtensionProvenanceWire, ExtensionsError } from "./host.js";
|
|
2
2
|
//#region src/extensions/headless/labels.d.ts
|
|
3
3
|
/** The default English strings of the extensions components. */
|
|
4
4
|
declare const DEFAULT_EXTENSIONS_LABELS: {
|
|
@@ -30,6 +30,46 @@ declare const DEFAULT_EXTENSIONS_LABELS: {
|
|
|
30
30
|
extensionSettingRunning: string;
|
|
31
31
|
/** A settings page or form with no rows. */
|
|
32
32
|
extensionSettingsNone: string;
|
|
33
|
+
/** Settings › Extensions' extension host part (`ExtensionSettingsSection`), for assistive tech. */
|
|
34
|
+
extensionSettingsSection: string;
|
|
35
|
+
/** Its heading over the values a declarative config entry locks. */
|
|
36
|
+
extensionSettingsLockedHeading: string;
|
|
37
|
+
/** A locked value's tag. */
|
|
38
|
+
extensionSettingsLockedTag: string;
|
|
39
|
+
/** Its heading over the catalog items extensions added, changed or hid. */
|
|
40
|
+
extensionSettingsChangesHeading: string;
|
|
41
|
+
/** Its heading over the integrations. */
|
|
42
|
+
extensionSettingsIntegrationsHeading: string;
|
|
43
|
+
/** A changed catalog item's kind. */
|
|
44
|
+
extensionCatalogKind: (kind: ExtensionProvenanceWire["kind"]) => string;
|
|
45
|
+
/** Who added, changed or hid a catalog item (the TUI's wording). */
|
|
46
|
+
extensionProvenance: (p: ExtensionProvenanceWire) => string;
|
|
47
|
+
/** An integration with no account connected. */
|
|
48
|
+
extensionIntegrationNotConnected: string;
|
|
49
|
+
/** An integration with one account connected. */
|
|
50
|
+
extensionIntegrationConnected: string;
|
|
51
|
+
/** An integration with several accounts connected. */
|
|
52
|
+
extensionIntegrationAccountCount: (count: number) => string;
|
|
53
|
+
/** The list of an integration's accounts. */
|
|
54
|
+
extensionIntegrationAccounts: (integration: string) => string;
|
|
55
|
+
/** The default account's tag. */
|
|
56
|
+
extensionIntegrationDefault: string;
|
|
57
|
+
/** Makes an account the default. */
|
|
58
|
+
extensionIntegrationMakeDefault: string;
|
|
59
|
+
/** Makes an account the default, for assistive tech. */
|
|
60
|
+
extensionIntegrationMakeDefaultLabel: (account: string) => string;
|
|
61
|
+
/** Removes an account. */
|
|
62
|
+
extensionIntegrationDisconnect: string;
|
|
63
|
+
/** Removes an account, for assistive tech. */
|
|
64
|
+
extensionIntegrationDisconnectLabel: (account: string) => string;
|
|
65
|
+
/** Connects the first account (an API key method's submit). */
|
|
66
|
+
extensionIntegrationConnect: string;
|
|
67
|
+
/** Connects another account with an API key. */
|
|
68
|
+
extensionIntegrationAddAccount: string;
|
|
69
|
+
/** Connects another account through a method. */
|
|
70
|
+
extensionIntegrationAddAccountWith: (method: string) => string;
|
|
71
|
+
/** Words a failed integration action. */
|
|
72
|
+
extensionIntegrationError: (error: ExtensionsError) => string;
|
|
33
73
|
/** A screen whose id no extension offers (any more). */
|
|
34
74
|
extensionScreenMissing: string;
|
|
35
75
|
/** Closes a screen. */
|