@timurproko/a1 0.2.7-dev.1275 → 0.2.7-dev.1276
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/app/session-shell/apps-dialog.d.ts +1 -1
- package/dist/app/session-shell/apps-dialog.js +2 -1
- package/dist/app/session-shell/dialog-coordinator.d.ts +4 -5
- package/dist/app/session-shell/dialog-coordinator.js +41 -12
- package/dist/app/session-shell/input-route.d.ts +23 -0
- package/dist/app/session-shell/input-route.js +59 -0
- package/dist/app/session-shell/session-selectors.d.ts +3 -3
- package/dist/app/session-shell/session-selectors.js +7 -2
- package/dist/app/session-shell/session-shell-root.js +6 -2
- package/dist/app/session-shell/session-shell.js +4 -2
- package/dist/app/session-shell/viewport-pointer.js +5 -1
- package/dist/app/session-shell/workflow-router.d.ts +1 -1
- package/dist/composition/settings-route-host.js +1 -0
- package/dist/contracts/owned-ui/shell-components.d.ts +10 -0
- package/dist/contracts/presentation/component.d.ts +7 -0
- package/dist/contracts/presentation/index.d.ts +2 -0
- package/dist/contracts/presentation/index.js +4 -0
- package/dist/contracts/presentation/progress-palette.generated.d.ts +24 -0
- package/dist/contracts/presentation/progress-palette.generated.js +1 -134
- package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
- package/dist/features/owned-ui/project-trust-dialog.js +5 -5
- package/dist/features/owned-ui/project-trust-prompt.js +2 -2
- package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
- package/dist/features/owned-ui/reference-screen-app.js +4 -1
- package/dist/features/owned-ui/settings-app.js +6 -6
- package/dist/features/owned-ui/settings-model-dialog.js +3 -3
- package/dist/integrations/pi/components/deferred-selector.d.ts +6 -0
- package/dist/integrations/pi/components/deferred-selector.js +40 -0
- package/dist/integrations/pi/components/login-dialog-loader.d.ts +3 -0
- package/dist/integrations/pi/components/login-dialog-loader.js +57 -0
- package/dist/integrations/pi/components/login-links.d.ts +6 -0
- package/dist/integrations/pi/components/login-links.js +31 -0
- package/dist/integrations/pi/components/login-text.d.ts +7 -0
- package/dist/integrations/pi/components/login-text.js +17 -0
- package/dist/integrations/pi/components/modal-frame.d.ts +5 -0
- package/dist/integrations/pi/components/modal-frame.js +30 -2
- package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +11 -8
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +36 -35
- package/dist/integrations/pi/components/shell-session-info-reference.d.ts +1 -1
- package/dist/integrations/pi/components/shell-session-info-reference.js +49 -46
- package/dist/integrations/pi/components/theme.d.ts +2 -0
- package/dist/integrations/pi/components/theme.js +4 -0
- package/dist/integrations/pi/components/upstream/components/auth-url.d.ts +16 -0
- package/dist/integrations/pi/components/upstream/components/auth-url.js +49 -0
- package/dist/integrations/pi/components/upstream/components/extension-selector.d.ts +1 -0
- package/dist/integrations/pi/components/upstream/components/extension-selector.js +21 -10
- package/dist/integrations/pi/components/upstream/components/login-dialog.d.ts +3 -0
- package/dist/integrations/pi/components/upstream/components/login-dialog.js +216 -0
- package/dist/integrations/pi/components/upstream/components/oauth-selector.d.ts +19 -0
- package/dist/integrations/pi/components/upstream/components/oauth-selector.js +123 -0
- package/dist/integrations/pi/components/upstream/components/session-footer.js +10 -7
- package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +2 -0
- package/dist/integrations/pi/components/upstream/components/trust-selector.js +29 -12
- package/dist/integrations/pi/session-presenters/components.d.ts +1 -1
- package/dist/integrations/pi/session-presenters/components.js +8 -8
- package/dist/integrations/pi/session-presenters/presenters.js +2 -2
- package/dist/ui/components/list-block.d.ts +2 -2
- package/dist/ui/components/list-block.js +4 -3
- package/dist/ui/settings/early-accent.d.ts +24 -0
- package/package.json +3 -3
|
@@ -2,138 +2,5 @@
|
|
|
2
2
|
* Generated by scripts/pi/sync-progress-palette.ts from A1's named accent projection
|
|
3
3
|
* over pinned Pi 1.5.1 (MIT), commit dd30101cfc5b0609411dd80b6f93adbc14db14cf. Do not edit directly.
|
|
4
4
|
*/
|
|
5
|
-
export const SHARED_PROGRESS_PALETTE = Object.freeze({
|
|
6
|
-
"blue": {
|
|
7
|
-
"dark": {
|
|
8
|
-
"truecolor": {
|
|
9
|
-
"accent": "\u001b[38;2;130;160;241m",
|
|
10
|
-
"border": "\u001b[38;2;116;102;197m"
|
|
11
|
-
},
|
|
12
|
-
"256color": {
|
|
13
|
-
"accent": "\u001b[38;5;111m",
|
|
14
|
-
"border": "\u001b[38;5;98m"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"light": {
|
|
18
|
-
"truecolor": {
|
|
19
|
-
"accent": "\u001b[38;2;63;96;226m",
|
|
20
|
-
"border": "\u001b[38;2;83;67;154m"
|
|
21
|
-
},
|
|
22
|
-
"256color": {
|
|
23
|
-
"accent": "\u001b[38;5;62m",
|
|
24
|
-
"border": "\u001b[38;5;60m"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
"purple": {
|
|
29
|
-
"dark": {
|
|
30
|
-
"truecolor": {
|
|
31
|
-
"accent": "\u001b[38;2;167;152;215m",
|
|
32
|
-
"border": "\u001b[38;2;105;115;167m"
|
|
33
|
-
},
|
|
34
|
-
"256color": {
|
|
35
|
-
"accent": "\u001b[38;5;140m",
|
|
36
|
-
"border": "\u001b[38;5;61m"
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"light": {
|
|
40
|
-
"truecolor": {
|
|
41
|
-
"accent": "\u001b[38;2;116;89;180m",
|
|
42
|
-
"border": "\u001b[38;2;68;77;130m"
|
|
43
|
-
},
|
|
44
|
-
"256color": {
|
|
45
|
-
"accent": "\u001b[38;5;97m",
|
|
46
|
-
"border": "\u001b[38;5;60m"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
"cyan": {
|
|
51
|
-
"dark": {
|
|
52
|
-
"truecolor": {
|
|
53
|
-
"accent": "\u001b[38;2;93;179;186m",
|
|
54
|
-
"border": "\u001b[38;2;74;128;146m"
|
|
55
|
-
},
|
|
56
|
-
"256color": {
|
|
57
|
-
"accent": "\u001b[38;5;73m",
|
|
58
|
-
"border": "\u001b[38;5;66m"
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
"light": {
|
|
62
|
-
"truecolor": {
|
|
63
|
-
"accent": "\u001b[38;2;40;122;129m",
|
|
64
|
-
"border": "\u001b[38;2;40;89;106m"
|
|
65
|
-
},
|
|
66
|
-
"256color": {
|
|
67
|
-
"accent": "\u001b[38;5;30m",
|
|
68
|
-
"border": "\u001b[38;5;23m"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
"green": {
|
|
73
|
-
"dark": {
|
|
74
|
-
"truecolor": {
|
|
75
|
-
"accent": "\u001b[38;2;104;183;141m",
|
|
76
|
-
"border": "\u001b[38;2;75;132;120m"
|
|
77
|
-
},
|
|
78
|
-
"256color": {
|
|
79
|
-
"accent": "\u001b[38;5;72m",
|
|
80
|
-
"border": "\u001b[38;5;66m"
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
"light": {
|
|
84
|
-
"truecolor": {
|
|
85
|
-
"accent": "\u001b[38;2;51;126;88m",
|
|
86
|
-
"border": "\u001b[38;2;41;93;82m"
|
|
87
|
-
},
|
|
88
|
-
"256color": {
|
|
89
|
-
"accent": "\u001b[38;5;65m",
|
|
90
|
-
"border": "\u001b[38;5;23m"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
"orange": {
|
|
95
|
-
"dark": {
|
|
96
|
-
"truecolor": {
|
|
97
|
-
"accent": "\u001b[38;2;231;135;83m",
|
|
98
|
-
"border": "\u001b[38;2;178;89;79m"
|
|
99
|
-
},
|
|
100
|
-
"256color": {
|
|
101
|
-
"accent": "\u001b[38;5;173m",
|
|
102
|
-
"border": "\u001b[38;5;131m"
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
"light": {
|
|
106
|
-
"truecolor": {
|
|
107
|
-
"accent": "\u001b[38;2;174;80;16m",
|
|
108
|
-
"border": "\u001b[38;2;133;57;49m"
|
|
109
|
-
},
|
|
110
|
-
"256color": {
|
|
111
|
-
"accent": "\u001b[38;5;130m",
|
|
112
|
-
"border": "\u001b[38;5;95m"
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
"pink": {
|
|
117
|
-
"dark": {
|
|
118
|
-
"truecolor": {
|
|
119
|
-
"accent": "\u001b[38;2;223;122;199m",
|
|
120
|
-
"border": "\u001b[38;2;150;91;171m"
|
|
121
|
-
},
|
|
122
|
-
"256color": {
|
|
123
|
-
"accent": "\u001b[38;5;176m",
|
|
124
|
-
"border": "\u001b[38;5;97m"
|
|
125
|
-
}
|
|
126
|
-
},
|
|
127
|
-
"light": {
|
|
128
|
-
"truecolor": {
|
|
129
|
-
"accent": "\u001b[38;2;178;56;153m",
|
|
130
|
-
"border": "\u001b[38;2;114;61;131m"
|
|
131
|
-
},
|
|
132
|
-
"256color": {
|
|
133
|
-
"accent": "\u001b[38;5;132m",
|
|
134
|
-
"border": "\u001b[38;5;60m"
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
});
|
|
5
|
+
export const SHARED_PROGRESS_PALETTE = Object.freeze({ "blue": { "dark": { "truecolor": { "accent": "\u001b[38;2;130;160;241m", "border": "\u001b[38;2;116;102;197m", "selectedBg": "\u001b[48;2;52;57;69m" }, "256color": { "accent": "\u001b[38;5;111m", "border": "\u001b[38;5;98m", "selectedBg": "\u001b[48;5;59m" } }, "light": { "truecolor": { "accent": "\u001b[38;2;63;96;226m", "border": "\u001b[38;2;83;67;154m", "selectedBg": "\u001b[48;2;243;244;246m" }, "256color": { "accent": "\u001b[38;5;62m", "border": "\u001b[38;5;60m", "selectedBg": "\u001b[48;5;255m" } } }, "purple": { "dark": { "truecolor": { "accent": "\u001b[38;2;167;152;215m", "border": "\u001b[38;2;105;115;167m", "selectedBg": "\u001b[48;2;58;56;66m" }, "256color": { "accent": "\u001b[38;5;140m", "border": "\u001b[38;5;61m", "selectedBg": "\u001b[48;5;59m" } }, "light": { "truecolor": { "accent": "\u001b[38;2;116;89;180m", "border": "\u001b[38;2;68;77;130m", "selectedBg": "\u001b[48;2;243;243;245m" }, "256color": { "accent": "\u001b[38;5;97m", "border": "\u001b[38;5;60m", "selectedBg": "\u001b[48;5;255m" } } }, "cyan": { "dark": { "truecolor": { "accent": "\u001b[38;2;93;179;186m", "border": "\u001b[38;2;74;128;146m", "selectedBg": "\u001b[48;2;48;60;61m" }, "256color": { "accent": "\u001b[38;5;73m", "border": "\u001b[38;5;66m", "selectedBg": "\u001b[48;5;59m" } }, "light": { "truecolor": { "accent": "\u001b[38;2;40;122;129m", "border": "\u001b[38;2;40;89;106m", "selectedBg": "\u001b[48;2;241;244;244m" }, "256color": { "accent": "\u001b[38;5;30m", "border": "\u001b[38;5;23m", "selectedBg": "\u001b[48;5;255m" } } }, "green": { "dark": { "truecolor": { "accent": "\u001b[38;2;104;183;141m", "border": "\u001b[38;2;75;132;120m", "selectedBg": "\u001b[48;2;50;60;54m" }, "256color": { "accent": "\u001b[38;5;72m", "border": "\u001b[38;5;66m", "selectedBg": "\u001b[48;5;59m" } }, "light": { "truecolor": { "accent": "\u001b[38;2;51;126;88m", "border": "\u001b[38;2;41;93;82m", "selectedBg": "\u001b[48;2;242;244;243m" }, "256color": { "accent": "\u001b[38;5;65m", "border": "\u001b[38;5;23m", "selectedBg": "\u001b[48;5;255m" } } }, "orange": { "dark": { "truecolor": { "accent": "\u001b[38;2;231;135;83m", "border": "\u001b[38;2;178;89;79m", "selectedBg": "\u001b[48;2;67;54;48m" }, "256color": { "accent": "\u001b[38;5;173m", "border": "\u001b[38;5;131m", "selectedBg": "\u001b[48;5;59m" } }, "light": { "truecolor": { "accent": "\u001b[38;2;174;80;16m", "border": "\u001b[38;2;133;57;49m", "selectedBg": "\u001b[48;2;245;243;242m" }, "256color": { "accent": "\u001b[38;5;130m", "border": "\u001b[38;5;95m", "selectedBg": "\u001b[48;5;255m" } } }, "pink": { "dark": { "truecolor": { "accent": "\u001b[38;2;223;122;199m", "border": "\u001b[38;2;150;91;171m", "selectedBg": "\u001b[48;2;65;53;62m" }, "256color": { "accent": "\u001b[38;5;176m", "border": "\u001b[38;5;97m", "selectedBg": "\u001b[48;5;59m" } }, "light": { "truecolor": { "accent": "\u001b[38;2;178;56;153m", "border": "\u001b[38;2;114;61;131m", "selectedBg": "\u001b[48;2;245;243;245m" }, "256color": { "accent": "\u001b[38;5;132m", "border": "\u001b[38;5;60m", "selectedBg": "\u001b[48;5;255m" } } } });
|
|
139
6
|
export const SHARED_PROGRESS_ACCENT_ANSI = SHARED_PROGRESS_PALETTE.blue.dark.truecolor.accent;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Fixed startup-safe rendering only; project-derived presentation is forbidden before trust resolves. */
|
|
2
|
-
export declare function renderProjectTrustDialog(cwd: string, options: readonly string[], selected: number, terminalWidth: number, terminalRows: number, accent: string, border: string): readonly string[];
|
|
2
|
+
export declare function renderProjectTrustDialog(cwd: string, options: readonly string[], selected: number, terminalWidth: number, terminalRows: number, accent: string, border: string, selectedBg: string): readonly string[];
|
|
@@ -6,12 +6,12 @@ const BOLD = "\u001b[1m";
|
|
|
6
6
|
const RESET_BOLD = "\u001b[22m";
|
|
7
7
|
const EXPLANATION = "This allows to load project settings and resources, install missing project packages, and execute project extensions.";
|
|
8
8
|
/** Fixed startup-safe rendering only; project-derived presentation is forbidden before trust resolves. */
|
|
9
|
-
export function renderProjectTrustDialog(cwd, options, selected, terminalWidth, terminalRows, accent, border) {
|
|
9
|
+
export function renderProjectTrustDialog(cwd, options, selected, terminalWidth, terminalRows, accent, border, selectedBg) {
|
|
10
10
|
const width = Math.max(1, terminalWidth);
|
|
11
11
|
const rule = `${border}${"─".repeat(width)}${RESET_FG}`;
|
|
12
|
-
const title = ` ${BOLD}${accent}Trust
|
|
12
|
+
const title = ` ${BOLD}${accent}Trust Project Folder?${RESET_FG}${RESET_BOLD}`;
|
|
13
13
|
const path = ` ${MUTED}${sanitize(cwd)}${RESET_FG}`;
|
|
14
|
-
const choices = options.map((label, index) => choice(label, selected === index, accent));
|
|
14
|
+
const choices = options.map((label, index) => choice(label, selected === index, accent, selectedBg));
|
|
15
15
|
const closeKey = displayShortcutKeyLabel(DIALOG_CLOSE_SHORTCUT_HINT.key);
|
|
16
16
|
const hint = ` ${DIM}↑↓${MUTED} navigate ${DIM}Enter${MUTED} select ${DIM}${closeKey}${MUTED} ${DIALOG_CLOSE_SHORTCUT_HINT.action}${RESET_FG}`;
|
|
17
17
|
const explanation = wrap(EXPLANATION, Math.max(1, width - 2)).map(line => ` ${line}`);
|
|
@@ -33,8 +33,8 @@ export function renderProjectTrustDialog(cwd, options, selected, terminalWidth,
|
|
|
33
33
|
return choiceWindow(choices, selected, 2);
|
|
34
34
|
return [choices[selected] ?? choices[0] ?? ""];
|
|
35
35
|
}
|
|
36
|
-
function choice(label, selected, accent) {
|
|
37
|
-
return selected ? ` ${accent}→ ${
|
|
36
|
+
function choice(label, selected, accent, selectedBg) {
|
|
37
|
+
return selected ? ` ${selectedBg}${accent}→ ${RESET_FG}${label}\u001b[49m` : ` ${label}`;
|
|
38
38
|
}
|
|
39
39
|
function choiceWindow(choices, selected, capacity) {
|
|
40
40
|
const start = Math.min(Math.max(0, selected - Math.floor(capacity / 2)), Math.max(0, choices.length - capacity));
|
|
@@ -67,7 +67,7 @@ export function createConsoleProjectTrustPrompt(options = {}) {
|
|
|
67
67
|
const render = () => {
|
|
68
68
|
const width = Math.max(renderBareDialog ? 1 : 20, output.columns ?? 80);
|
|
69
69
|
const rows = Math.max(1, output.rows ?? 24);
|
|
70
|
-
const lines = (renderBareDialog?.(cwd, choices.map(choice => choice.label), selected, width, rows, palette.accent, palette.border) ?? [
|
|
70
|
+
const lines = (renderBareDialog?.(cwd, choices.map(choice => choice.label), selected, width, rows, palette.accent, palette.border, palette.selectedBg) ?? [
|
|
71
71
|
`${BOLD}${ACCENT}Trust project folder?${RESET_FG}${RESET_BOLD}`,
|
|
72
72
|
cwd,
|
|
73
73
|
"",
|
|
@@ -205,5 +205,5 @@ function clipAnsiSafe(line, width) {
|
|
|
205
205
|
index += 1;
|
|
206
206
|
visible += 1;
|
|
207
207
|
}
|
|
208
|
-
return `${output}${RESET_FG}${RESET_BOLD}`;
|
|
208
|
+
return `${output}${RESET_FG}${RESET_BOLD}${line.includes("\u001b[48;") ? "\u001b[49m" : ""}`;
|
|
209
209
|
}
|
|
@@ -23,6 +23,8 @@ export interface ReferenceScreenOptions {
|
|
|
23
23
|
readonly id: string;
|
|
24
24
|
readonly title: string;
|
|
25
25
|
readonly document: ReferenceDocumentProvider;
|
|
26
|
+
/** In-place documents put their shortcut row inside the bottom rule like other dock dialogs. */
|
|
27
|
+
readonly presentation?: "screen" | "dialog";
|
|
26
28
|
/** The reader's scroll settings, read on every frame so a live change is honored. */
|
|
27
29
|
readonly scrollSettings: () => OwnedUiViewportSettings;
|
|
28
30
|
/** Enables owned text selection for document routes that explicitly opt in. */
|
|
@@ -47,6 +47,7 @@ const KEYS = {
|
|
|
47
47
|
export class ReferenceScreenApp {
|
|
48
48
|
id;
|
|
49
49
|
#title;
|
|
50
|
+
#dialog;
|
|
50
51
|
#document;
|
|
51
52
|
#scrollSettings;
|
|
52
53
|
#selection;
|
|
@@ -66,6 +67,7 @@ export class ReferenceScreenApp {
|
|
|
66
67
|
constructor(options) {
|
|
67
68
|
this.id = options.id;
|
|
68
69
|
this.#title = options.title;
|
|
70
|
+
this.#dialog = options.presentation === "dialog";
|
|
69
71
|
this.#document = options.document;
|
|
70
72
|
this.#scrollSettings = options.scrollSettings;
|
|
71
73
|
this.#selection = options.selection === undefined ? undefined : new ReferenceDocumentSelection(options.selection);
|
|
@@ -158,7 +160,8 @@ export class ReferenceScreenApp {
|
|
|
158
160
|
// Compatibility: the v2 reference screen frames its document between two border-coloured rules.
|
|
159
161
|
const rule = theme.fg("border", "─".repeat(rect.width));
|
|
160
162
|
// Invariant: dialog chrome shares the title's one-cell inset; document content keeps its own layout.
|
|
161
|
-
const
|
|
163
|
+
const footer = padToWidth(hint, rect.width);
|
|
164
|
+
const frame = this.#dialog ? [rule, ...withRail, footer, rule] : [rule, ...withRail, rule, footer];
|
|
162
165
|
// Invariant: a rectangle too small for the chrome still gets exactly its rows, top first.
|
|
163
166
|
return frame.slice(0, rect.height).concat(Array(Math.max(0, rect.height - frame.length)).fill(""));
|
|
164
167
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DIALOG_CLOSE_SHORTCUT_HINT } from "../../contracts/presentation/index.js";
|
|
1
|
+
import { DIALOG_CLOSE_SHORTCUT_HINT, wrapChoiceIndex } from "../../contracts/presentation/index.js";
|
|
2
2
|
import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, numericValues, RAIL_COLUMNS, renderCenteredDialogOverlay, renderDialogPanel, renderEmptyState, renderGroupHeader, renderListRow, renderNote, renderShortcutHintsWithClose, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, truncateToWidth, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, humanizeLabel, humanizeTitle, indexOfKey, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
|
|
3
3
|
import { SettingsScrollRail } from "./settings-scroll-rail.js";
|
|
4
4
|
import { SettingsEdits, replaceRecord, sameRecord } from "./settings-edits.js";
|
|
@@ -240,7 +240,7 @@ export class SettingsApp {
|
|
|
240
240
|
}
|
|
241
241
|
case "move-up":
|
|
242
242
|
case "move-down":
|
|
243
|
-
this.#select(rows, moveSelection(rows, selected, action === "move-down" ? 1 : -1));
|
|
243
|
+
this.#select(rows, moveSelection(rows, selected, action === "move-down" ? 1 : -1, true));
|
|
244
244
|
return { consumed: true };
|
|
245
245
|
case "page-up":
|
|
246
246
|
case "page-down":
|
|
@@ -472,10 +472,10 @@ export class SettingsApp {
|
|
|
472
472
|
this.#structured = null;
|
|
473
473
|
return { consumed: true };
|
|
474
474
|
case "part-previous":
|
|
475
|
-
open.index =
|
|
475
|
+
open.index = wrapChoiceIndex(open.index, -1, open.flags.length);
|
|
476
476
|
return { consumed: true };
|
|
477
477
|
case "part-next":
|
|
478
|
-
open.index =
|
|
478
|
+
open.index = wrapChoiceIndex(open.index, 1, open.flags.length);
|
|
479
479
|
return { consumed: true };
|
|
480
480
|
case "part-change":
|
|
481
481
|
this.#toggleFlag(open.index);
|
|
@@ -529,7 +529,7 @@ export class SettingsApp {
|
|
|
529
529
|
// Compatibility: the keyboard starts from the value in effect rather than from the top.
|
|
530
530
|
menu.index = menu.index < 0
|
|
531
531
|
? menu.current
|
|
532
|
-
:
|
|
532
|
+
: wrapChoiceIndex(menu.index, key === "down" ? 1 : -1, menu.choices.length);
|
|
533
533
|
}
|
|
534
534
|
else if (key === "enter") {
|
|
535
535
|
const value = menu.choices[menu.index];
|
|
@@ -577,7 +577,7 @@ export class SettingsApp {
|
|
|
577
577
|
this.#jump(rows, target);
|
|
578
578
|
return { consumed: true };
|
|
579
579
|
}
|
|
580
|
-
this.#select(rows, moveSelection(rows, selected, forward ? 1 : -1));
|
|
580
|
+
this.#select(rows, moveSelection(rows, selected, forward ? 1 : -1, true));
|
|
581
581
|
return { consumed: true };
|
|
582
582
|
}
|
|
583
583
|
const before = input.getText();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DIALOG_BACK_SHORTCUT_HINT, DIALOG_CLOSE_SHORTCUT_HINT } from "../../contracts/presentation/index.js";
|
|
1
|
+
import { DIALOG_BACK_SHORTCUT_HINT, DIALOG_CLOSE_SHORTCUT_HINT, wrapChoiceIndex } from "../../contracts/presentation/index.js";
|
|
2
2
|
import { LineInput, ShortcutRegistry, assertNoShortcutConflicts, configureDialogChoiceCapacity, configureDialogTextRows, handleLineInputKey, humanizeLabel, renderSteppedDialogPanel, } from "../../ui/components/index.js";
|
|
3
3
|
import { changeFailure, structuredValue } from "./settings-edits.js";
|
|
4
4
|
import { SETTINGS_APP_ID } from "./settings-route.js";
|
|
@@ -28,7 +28,7 @@ export function modelDialogKey(open, data, key, actions) {
|
|
|
28
28
|
return { consumed: true };
|
|
29
29
|
}
|
|
30
30
|
if (action === "previous" || action === "next") {
|
|
31
|
-
open.index =
|
|
31
|
+
open.index = wrapChoiceIndex(open.index, action === "next" ? 1 : -1, flags.length);
|
|
32
32
|
return { consumed: true };
|
|
33
33
|
}
|
|
34
34
|
if (action === "select") {
|
|
@@ -61,7 +61,7 @@ export function modelDialogKey(open, data, key, actions) {
|
|
|
61
61
|
return { consumed: true };
|
|
62
62
|
}
|
|
63
63
|
if (action === "previous" || action === "next") {
|
|
64
|
-
open.index =
|
|
64
|
+
open.index = wrapChoiceIndex(open.index, action === "next" ? 1 : -1, choices.length);
|
|
65
65
|
return { consumed: true };
|
|
66
66
|
}
|
|
67
67
|
if (action === "select") {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PiShellSkillsSelectorOptions } from "./skills-dialog.js";
|
|
2
|
+
import type { OwnedUiShellComponentPort } from "../../../contracts/owned-ui/index.js";
|
|
3
|
+
/** Defers optional selector code while retaining focus, early input and cancellation. */
|
|
4
|
+
export declare function deferredSelector(load: () => Promise<OwnedUiShellComponentPort>, cancel: () => void): OwnedUiShellComponentPort;
|
|
5
|
+
/** Keeps Skills outside first-prompt loading. */
|
|
6
|
+
export declare function createPiShellSkillsSelector(options: PiShellSkillsSelectorOptions): OwnedUiShellComponentPort;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Defers optional selector code while retaining focus, early input and cancellation. */
|
|
2
|
+
export function deferredSelector(load, cancel) {
|
|
3
|
+
let delegate;
|
|
4
|
+
let closed = false;
|
|
5
|
+
let focused = false;
|
|
6
|
+
let failure;
|
|
7
|
+
const pending = [];
|
|
8
|
+
const ready = load().then(component => {
|
|
9
|
+
if (closed) {
|
|
10
|
+
component.dispose?.();
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
delegate = component;
|
|
14
|
+
delegate.setFocused?.(focused);
|
|
15
|
+
for (const key of pending.splice(0)) {
|
|
16
|
+
if (!closed)
|
|
17
|
+
delegate.handleInput?.(key);
|
|
18
|
+
}
|
|
19
|
+
}).catch(() => { if (!closed)
|
|
20
|
+
failure = "Selector unavailable — Esc close"; });
|
|
21
|
+
return {
|
|
22
|
+
ready,
|
|
23
|
+
render: width => delegate?.render(width) ?? (failure === undefined ? [] : [failure.slice(0, width)]),
|
|
24
|
+
invalidate: () => delegate?.invalidate(),
|
|
25
|
+
handleInput: data => {
|
|
26
|
+
if (delegate !== undefined)
|
|
27
|
+
delegate.handleInput?.(data);
|
|
28
|
+
else if (data === "\u001b" || data === "\u0003")
|
|
29
|
+
cancel();
|
|
30
|
+
else if (pending.length < 32)
|
|
31
|
+
pending.push(data);
|
|
32
|
+
},
|
|
33
|
+
setFocused: value => { focused = value; delegate?.setFocused?.(value); },
|
|
34
|
+
dispose: () => { closed = true; pending.length = 0; delegate?.dispose?.(); },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Keeps Skills outside first-prompt loading. */
|
|
38
|
+
export function createPiShellSkillsSelector(options) {
|
|
39
|
+
return deferredSelector(() => import("./skills-dialog.js").then(module => module.createPiShellSkillsSelector(options)), options.onCancel);
|
|
40
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { OwnedUiShellLoginDialogPort as Login } from "../../../contracts/owned-ui/index.js";
|
|
2
|
+
/** Queues optional login calls. */
|
|
3
|
+
export declare function deferredLoginDialog(...args: Parameters<typeof import("./upstream/components/login-dialog.js").createThemedLoginDialog>): Login;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Queues optional login calls. */
|
|
2
|
+
export function deferredLoginDialog(...args) {
|
|
3
|
+
const [runtime, , complete] = args;
|
|
4
|
+
let dialog, closed = false, focused = false, failed = false;
|
|
5
|
+
const pending = [];
|
|
6
|
+
const rejects = new Set();
|
|
7
|
+
const rejectAll = (message) => { for (const reject of rejects)
|
|
8
|
+
reject(new Error(message)); rejects.clear(); pending.length = 0; };
|
|
9
|
+
const ready = import("./upstream/components/login-dialog.js").then(module => {
|
|
10
|
+
if (closed)
|
|
11
|
+
return;
|
|
12
|
+
dialog = module.createThemedLoginDialog(...args);
|
|
13
|
+
dialog.setFocused?.(focused);
|
|
14
|
+
for (const action of pending.splice(0)) {
|
|
15
|
+
if (!closed)
|
|
16
|
+
action(dialog);
|
|
17
|
+
}
|
|
18
|
+
}).catch(() => { failed = true; rejectAll("Login unavailable"); }).finally(() => { if (!closed)
|
|
19
|
+
runtime.requestRender(); });
|
|
20
|
+
const call = (action) => { if (!closed && !failed) {
|
|
21
|
+
if (dialog)
|
|
22
|
+
action(dialog);
|
|
23
|
+
else
|
|
24
|
+
pending.push(action);
|
|
25
|
+
} };
|
|
26
|
+
const dispose = () => { closed = true; dialog?.dispose?.(); rejectAll("Login cancelled"); };
|
|
27
|
+
const answer = (action) => new Promise((resolve, reject) => {
|
|
28
|
+
if (closed || failed) {
|
|
29
|
+
reject(new Error("Login unavailable"));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
rejects.add(reject);
|
|
33
|
+
call(target => { rejects.delete(reject); void action(target).then(resolve, reject); });
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
ready, dispose,
|
|
37
|
+
render: width => dialog?.render(width) ?? (failed ? ["Login unavailable — Esc close".slice(0, width)] : []),
|
|
38
|
+
invalidate: () => dialog?.invalidate(),
|
|
39
|
+
setFocused: value => { focused = value; dialog?.setFocused?.(value); },
|
|
40
|
+
handleInput: data => {
|
|
41
|
+
if (!dialog && (data === "\u001b" || data === "\u0003")) {
|
|
42
|
+
dispose();
|
|
43
|
+
complete(false, "Login cancelled");
|
|
44
|
+
}
|
|
45
|
+
else
|
|
46
|
+
call(target => target.handleInput?.(data));
|
|
47
|
+
},
|
|
48
|
+
showAuth: (url, instructions) => call(target => target.showAuth(url, instructions)),
|
|
49
|
+
showDeviceCode: info => call(target => target.showDeviceCode(info)),
|
|
50
|
+
showManualInput: message => answer(target => target.showManualInput(message)),
|
|
51
|
+
showPrompt: (message, placeholder) => answer(target => target.showPrompt(message, placeholder)),
|
|
52
|
+
showDetails: lines => call(target => target.showDetails(lines)),
|
|
53
|
+
showInfo: (message, links) => call(target => target.showInfo(message, links)),
|
|
54
|
+
showWaiting: message => call(target => target.showWaiting(message)),
|
|
55
|
+
showProgress: message => call(target => target.showProgress(message)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Login effects accept web URLs only; controls are encoded before any hyperlink or launcher sees them. */
|
|
2
|
+
export declare function loginWebUrl(value: string): string | undefined;
|
|
3
|
+
/** Keeps untrusted non-web instructions printable without granting them a hyperlink target. */
|
|
4
|
+
export declare function loginLink(value: string, label?: string): string;
|
|
5
|
+
/** Best-effort browser request with argv boundaries, no shell, and no dependency on the project cwd. */
|
|
6
|
+
export declare function openLoginBrowser(value: string): void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { hyperlink, replaceControlCharacters } from "@earendil-works/pi-tui";
|
|
3
|
+
/** Login effects accept web URLs only; controls are encoded before any hyperlink or launcher sees them. */
|
|
4
|
+
export function loginWebUrl(value) {
|
|
5
|
+
try {
|
|
6
|
+
const url = new URL(value);
|
|
7
|
+
return ["http:", "https:"].includes(url.protocol) ? url.href : undefined;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Keeps untrusted non-web instructions printable without granting them a hyperlink target. */
|
|
14
|
+
export function loginLink(value, label) {
|
|
15
|
+
const url = loginWebUrl(value);
|
|
16
|
+
const text = replaceControlCharacters(label ?? url ?? value);
|
|
17
|
+
return url === undefined ? text : hyperlink(text, url);
|
|
18
|
+
}
|
|
19
|
+
/** Best-effort browser request with argv boundaries, no shell, and no dependency on the project cwd. */
|
|
20
|
+
export function openLoginBrowser(value) {
|
|
21
|
+
const url = loginWebUrl(value);
|
|
22
|
+
if (url === undefined)
|
|
23
|
+
return;
|
|
24
|
+
const platform = process.platform;
|
|
25
|
+
const executable = platform === "win32" ? "rundll32" : platform === "darwin" ? "open" : "xdg-open";
|
|
26
|
+
const args = platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
|
|
27
|
+
try {
|
|
28
|
+
spawn(executable, args, { stdio: "ignore", detached: true, cwd: "/" }).on("error", () => { }).unref();
|
|
29
|
+
}
|
|
30
|
+
catch { /* Compatibility: a failed browser launch never interrupts provider authentication. */ }
|
|
31
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Component } from "@earendil-works/pi-tui";
|
|
2
|
+
type LoginTextRole = "accent" | "muted" | "warning" | "success" | "error" | "dim" | "text";
|
|
3
|
+
/** Preserves authored line breaks without replaying control payloads. */
|
|
4
|
+
export declare function loginPlainText(value: string): string;
|
|
5
|
+
/** A zero-inset login row that resolves its semantic role against the live theme on every frame. */
|
|
6
|
+
export declare function loginText(text: string | (() => string), role?: LoginTextRole, bold?: boolean): Component;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Text, replaceControlCharacters } from "@earendil-works/pi-tui";
|
|
2
|
+
import { piTheme } from "./theme.js";
|
|
3
|
+
/** Preserves authored line breaks without replaying control payloads. */
|
|
4
|
+
export function loginPlainText(value) {
|
|
5
|
+
return value.split("\n").map(line => replaceControlCharacters(line)).join("\n");
|
|
6
|
+
}
|
|
7
|
+
/** A zero-inset login row that resolves its semantic role against the live theme on every frame. */
|
|
8
|
+
export function loginText(text, role = "muted", bold = false) {
|
|
9
|
+
return {
|
|
10
|
+
render(width) {
|
|
11
|
+
const theme = piTheme();
|
|
12
|
+
const value = typeof text === "string" ? loginPlainText(text) : text();
|
|
13
|
+
return new Text(theme.fg(role, bold ? theme.bold(value) : value), 0, 0).render(width);
|
|
14
|
+
},
|
|
15
|
+
invalidate() { },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { Container, Input, type Component, type Focusable } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { OwnedUiShellComponentPort } from "../../../contracts/owned-ui/index.js";
|
|
2
3
|
export declare const PI_MODAL_CONTENT_PADDING_X = 1;
|
|
4
|
+
/** Applies standard primary/metadata roles without changing a pinned row's text or clipping. */
|
|
5
|
+
export declare function renderPiModalSelectedPrimary(row: string, width: number, labels: readonly string[]): string;
|
|
6
|
+
/** Standardizes internal legacy model/message choices without changing their controller or metadata. */
|
|
7
|
+
export declare function standardInternalChoicePort(port: OwnedUiShellComponentPort, metadata?: boolean): OwnedUiShellComponentPort;
|
|
3
8
|
/** Paints the standard Pi Input prompt as a live-themed dialog-search marker. */
|
|
4
9
|
export declare function renderPiModalSearchInput(input: Input, width: number): string[];
|
|
5
10
|
/** Replaces one explicitly identified direct Input child with the standard search presentation. */
|
|
@@ -1,7 +1,35 @@
|
|
|
1
|
-
import { Container, Input, Spacer, Text, } from "@earendil-works/pi-tui";
|
|
1
|
+
import { Container, Input, Spacer, Text, sliceByColumn, stripTerminalSequences, visibleWidth, } from "@earendil-works/pi-tui";
|
|
2
2
|
import { DIALOG_CONTENT_PADDING_X, dialogFrameGeometry, insetDialogContent } from "../../../contracts/presentation/index.js";
|
|
3
|
-
import { DIALOG_CLOSE_SHORTCUT_HINT, piTheme, renderPiModalShortcutHints } from "./theme.js";
|
|
3
|
+
import { DIALOG_CLOSE_SHORTCUT_HINT, piTheme, renderPiModalShortcutHints, renderPiModalListRow } from "./theme.js";
|
|
4
4
|
export const PI_MODAL_CONTENT_PADDING_X = DIALOG_CONTENT_PADDING_X;
|
|
5
|
+
/** Applies standard primary/metadata roles without changing a pinned row's text or clipping. */
|
|
6
|
+
export function renderPiModalSelectedPrimary(row, width, labels) {
|
|
7
|
+
const plain = stripTerminalSequences(row).trimEnd();
|
|
8
|
+
if (!plain.startsWith(" → "))
|
|
9
|
+
return row;
|
|
10
|
+
const primary = labels.filter(label => plain.slice(3).startsWith(label))
|
|
11
|
+
.sort((left, right) => visibleWidth(right) - visibleWidth(left))[0];
|
|
12
|
+
const length = primary === undefined ? Math.max(0, visibleWidth(plain) - 3) : visibleWidth(primary);
|
|
13
|
+
const label = stripTerminalSequences(sliceByColumn(row, 3, length));
|
|
14
|
+
const suffix = sliceByColumn(row, 3 + length, Math.max(0, visibleWidth(plain) - 3 - length));
|
|
15
|
+
const theme = piTheme();
|
|
16
|
+
return ` ${renderPiModalListRow(`${theme.fg("accent", "→ ")}${theme.fg("text", label)}${theme.fg("muted", stripTerminalSequences(suffix))}`, Math.max(0, width - 1), true)}`;
|
|
17
|
+
}
|
|
18
|
+
/** Standardizes internal legacy model/message choices without changing their controller or metadata. */
|
|
19
|
+
export function standardInternalChoicePort(port, metadata = false) {
|
|
20
|
+
return { ...port, render: width => port.render(width).map(row => {
|
|
21
|
+
const match = /^(\s*)[→›] (.*)$/u.exec(stripTerminalSequences(row).trimEnd());
|
|
22
|
+
if (match === null)
|
|
23
|
+
return row;
|
|
24
|
+
const indent = visibleWidth(match[1]);
|
|
25
|
+
const marker = metadata ? sliceByColumn(row, indent + 2, 2) : "";
|
|
26
|
+
const label = metadata ? match[2].slice(2).split(/ \[| \(/u, 1)[0] : match[2];
|
|
27
|
+
const suffixStart = indent + 2 + (metadata ? 2 : 0) + visibleWidth(label);
|
|
28
|
+
const suffix = metadata ? sliceByColumn(row, suffixStart, Math.max(0, visibleWidth(row) - suffixStart)).trimEnd() : "";
|
|
29
|
+
const theme = piTheme();
|
|
30
|
+
return `${match[1]}${renderPiModalListRow(`${theme.fg("accent", "→ ")}${marker}${theme.fg("text", label)}${suffix}`, Math.max(0, width - indent), true)}`;
|
|
31
|
+
}) };
|
|
32
|
+
}
|
|
5
33
|
/** Paints the standard Pi Input prompt as a live-themed dialog-search marker. */
|
|
6
34
|
export function renderPiModalSearchInput(input, width) {
|
|
7
35
|
return input.render(width).map(row => {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ModelSelectorComponent, type SessionInfo, type SettingsCallbacks, type SettingsConfig } from "../startup-public.js";
|
|
2
2
|
import type { OwnedUiDialog } from "../../../contracts/owned-ui/index.js";
|
|
3
3
|
import type { ModelsDialogCallbacks, ModelsDialogConfig } from "./models-dialog.js";
|
|
4
|
-
import {
|
|
4
|
+
import type { TrustDecision, TrustOption, TrustUpdate } from "./upstream/components/trust-selector.js";
|
|
5
5
|
import { type PiShellComponentPort, type PiShellEditorOptions, type PiShellSelectorOption, type PiShellSelectorOptions } from "./shell-shared-facade.js";
|
|
6
|
-
export { createPiShellSkillsSelector
|
|
7
|
-
export
|
|
6
|
+
export { createPiShellSkillsSelector } from "./deferred-selector.js";
|
|
7
|
+
export type { PiShellSkillsSelectorOptions } from "./skills-dialog.js";
|
|
8
|
+
export declare function createPiShellSelector(options: PiShellSelectorOptions, standard?: boolean): PiShellComponentPort;
|
|
8
9
|
export interface PiShellSettingsSelectorOptions {
|
|
9
10
|
readonly config: SettingsConfig;
|
|
10
11
|
readonly onChange: (callback: keyof SettingsCallbacks, value: unknown) => void;
|
|
@@ -13,6 +14,7 @@ export interface PiShellSettingsSelectorOptions {
|
|
|
13
14
|
export declare function createPiShellSettingsSelector(options: PiShellSettingsSelectorOptions): PiShellComponentPort;
|
|
14
15
|
type PiModelSelectorArguments = ConstructorParameters<typeof ModelSelectorComponent>;
|
|
15
16
|
export interface PiShellModelSelectorOptions {
|
|
17
|
+
readonly standardStyle?: boolean;
|
|
16
18
|
readonly currentModel: unknown;
|
|
17
19
|
readonly modelRuntime: unknown;
|
|
18
20
|
readonly scopedModels: readonly unknown[];
|
|
@@ -58,6 +60,7 @@ export interface PiShellModelsDialogPort extends PiShellComponentPort {
|
|
|
58
60
|
/** The bare-A1 unified Models dialog behind the owned component boundary; the pinned selectors above stay for `a1 pi`. */
|
|
59
61
|
export declare function createPiShellModelsDialog(options: PiShellModelsDialogOptions): PiShellModelsDialogPort;
|
|
60
62
|
export declare function createPiShellTrustSelector(options: {
|
|
63
|
+
readonly standardStyle?: boolean;
|
|
61
64
|
readonly cwd: string;
|
|
62
65
|
readonly savedDecision: TrustDecision | null;
|
|
63
66
|
readonly projectTrusted: boolean;
|
|
@@ -91,7 +94,7 @@ export declare function createPiShellTreeSelector(options: {
|
|
|
91
94
|
readonly initialSelectedId?: string;
|
|
92
95
|
readonly initialFilterMode?: "default" | "no-tools" | "user-only" | "labeled-only" | "all";
|
|
93
96
|
}): Promise<PiShellComponentPort>;
|
|
94
|
-
export declare function createPiShellUserMessageSelector(messages: readonly PiShellSelectorOption[], onSelect: (id: string) => void, onCancel: () => void, initialSelectedId?: string): PiShellComponentPort;
|
|
97
|
+
export declare function createPiShellUserMessageSelector(messages: readonly PiShellSelectorOption[], onSelect: (id: string) => void, onCancel: () => void, initialSelectedId?: string, standard?: boolean): PiShellComponentPort;
|
|
95
98
|
export interface PiShellLoginDialogPort extends PiShellComponentPort {
|
|
96
99
|
showAuth(url: string, instructions?: string): void;
|
|
97
100
|
showDeviceCode(info: {
|
|
@@ -108,7 +111,7 @@ export interface PiShellLoginDialogPort extends PiShellComponentPort {
|
|
|
108
111
|
showWaiting(message: string): void;
|
|
109
112
|
showProgress(message: string): void;
|
|
110
113
|
}
|
|
111
|
-
export declare function createPiShellLoginDialog(runtime: Pick<PiShellEditorOptions, "getColumns" | "getRows" | "requestRender">, providerId: string, onComplete: (success: boolean, message?: string) => void, providerName?: string, title?: string): PiShellLoginDialogPort;
|
|
114
|
+
export declare function createPiShellLoginDialog(runtime: Pick<PiShellEditorOptions, "getColumns" | "getRows" | "requestRender">, providerId: string, onComplete: (success: boolean, message?: string) => void, providerName?: string, title?: string, standard?: boolean): PiShellLoginDialogPort;
|
|
112
115
|
export declare function createPiShellArmin(runtime: Pick<PiShellEditorOptions, "getColumns" | "getRows" | "requestRender">): PiShellComponentPort;
|
|
113
116
|
export declare function createPiShellEarendilAnnouncement(): PiShellComponentPort;
|
|
114
117
|
export declare function createPiShellReloadBox(): PiShellComponentPort;
|
|
@@ -120,11 +123,11 @@ export interface PiShellAuthProviderOption extends PiShellSelectorOption {
|
|
|
120
123
|
readonly source?: string;
|
|
121
124
|
};
|
|
122
125
|
}
|
|
123
|
-
export declare function createPiShellAuthProviderSelector(mode: "login" | "logout", providers: readonly PiShellAuthProviderOption[], onSelect: (id: string) => void, onCancel: () => void, initialSearchInput?: string): PiShellComponentPort;
|
|
124
|
-
export declare function createPiShellExtensionSelector(title: string, options: readonly string[], onSelect: (value: string) => void, onCancel: () => void): PiShellComponentPort;
|
|
126
|
+
export declare function createPiShellAuthProviderSelector(mode: "login" | "logout", providers: readonly PiShellAuthProviderOption[], onSelect: (id: string) => void, onCancel: () => void, initialSearchInput?: string, standardStyle?: boolean): PiShellComponentPort;
|
|
127
|
+
export declare function createPiShellExtensionSelector(title: string, options: readonly string[], onSelect: (value: string) => void, onCancel: () => void, standardSelection?: boolean): PiShellComponentPort;
|
|
125
128
|
export declare function createPiShellThemeSelector(currentTheme: string, onSelect: (theme: string) => void, onCancel: () => void, onPreview: (theme: string) => void): PiShellComponentPort;
|
|
126
129
|
export declare function createPiShellShowImagesSelector(currentValue: boolean, onSelect: (show: boolean) => void, onCancel: () => void): PiShellComponentPort;
|
|
127
130
|
export declare function createPiShellDialog(dialog: OwnedUiDialog, handlers?: {
|
|
128
131
|
readonly onSelect?: (id: string) => void;
|
|
129
132
|
readonly onCancel?: () => void;
|
|
130
|
-
}): PiShellComponentPort;
|
|
133
|
+
}, standard?: boolean): PiShellComponentPort;
|