@aexol/opencode-wizard 0.1.9 → 0.1.12
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/server.d.ts +5 -0
- package/dist/server.js +96 -3
- package/dist/server.js.map +1 -1
- package/dist/tui.d.ts +8 -20
- package/dist/tui.js +437 -152
- package/dist/tui.js.map +1 -1
- package/package.json +1 -1
package/dist/tui.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { memo as _$memo } from "@opentui/solid";
|
|
1
2
|
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
2
3
|
import { effect as _$effect } from "@opentui/solid";
|
|
3
4
|
import { createTextNode as _$createTextNode } from "@opentui/solid";
|
|
@@ -7,32 +8,64 @@ import { setProp as _$setProp } from "@opentui/solid";
|
|
|
7
8
|
import { createElement as _$createElement } from "@opentui/solid";
|
|
8
9
|
/** @jsxImportSource @opentui/solid */
|
|
9
10
|
|
|
10
|
-
import { createMemo, createSignal } from 'solid-js';
|
|
11
|
-
import { PLUGIN_ID,
|
|
11
|
+
import { createEffect, createMemo, createSignal } from 'solid-js';
|
|
12
|
+
import { PLUGIN_ID, resolvePluginStatusSnapshotWithAuthBootstrap } from './server.js';
|
|
12
13
|
const STATUS_TIMEOUT_MS = 5_000;
|
|
13
14
|
const STATUS_REFRESH_INTERVAL_MS = 5_000;
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
const MAX_STATUS_MESSAGE_LENGTH = 80;
|
|
16
|
+
const MAX_SKILL_DESCRIPTION_LENGTH = 96;
|
|
17
|
+
const MAX_SKILL_NAME_LENGTH = 48;
|
|
18
|
+
const MAX_SKILL_META_LENGTH = 72;
|
|
19
|
+
const MAX_SKILL_TAGS = 4;
|
|
20
|
+
const SKILLS_PAGE_SIZE = 5;
|
|
21
|
+
const compactStatusMessage = message => {
|
|
22
|
+
if (message.length <= MAX_STATUS_MESSAGE_LENGTH) return message;
|
|
23
|
+
return `${message.slice(0, MAX_STATUS_MESSAGE_LENGTH - 1)}…`;
|
|
24
|
+
};
|
|
25
|
+
const compactSkillDescription = message => {
|
|
26
|
+
if (message.length <= MAX_SKILL_DESCRIPTION_LENGTH) return message;
|
|
27
|
+
return `${message.slice(0, MAX_SKILL_DESCRIPTION_LENGTH - 1)}…`;
|
|
28
|
+
};
|
|
29
|
+
const compactSkillName = name => {
|
|
30
|
+
if (name.length <= MAX_SKILL_NAME_LENGTH) return name;
|
|
31
|
+
return `${name.slice(0, MAX_SKILL_NAME_LENGTH - 1)}…`;
|
|
32
|
+
};
|
|
33
|
+
const compactSkillMeta = meta => {
|
|
34
|
+
if (meta.length <= MAX_SKILL_META_LENGTH) return meta;
|
|
35
|
+
return `${meta.slice(0, MAX_SKILL_META_LENGTH - 1)}…`;
|
|
20
36
|
};
|
|
21
37
|
const formatSkillsCatalogUnavailableMessage = snapshot => {
|
|
22
38
|
if (!snapshot.catalog && snapshot.status === 'missing_auth') {
|
|
23
|
-
|
|
39
|
+
if (snapshot.message) return compactStatusMessage(snapshot.message);
|
|
40
|
+
return 'locked (browser auth pending)';
|
|
24
41
|
}
|
|
25
|
-
if (!snapshot.catalog
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const formatSkillOptionDescription = skill => {
|
|
29
|
-
const description = skill.artifactDescription || skill.skillSlug;
|
|
30
|
-
return `${skill.contextKind.toUpperCase()} · ${getSkillPolicy(skill)} · v${skill.version || 'unknown'} · ${skill.skillName || skill.skillSlug} · ${formatSkillTags(skill)} · ${description}`;
|
|
42
|
+
if (!snapshot.catalog && snapshot.message) return compactStatusMessage(snapshot.message);
|
|
43
|
+
if (!snapshot.catalog) return `unavailable (${snapshot.status})`;
|
|
44
|
+
return 'unavailable';
|
|
31
45
|
};
|
|
32
46
|
const formatAuthStatus = snapshot => {
|
|
33
47
|
if (snapshot.authState.status !== 'authenticated') return snapshot.authState.status;
|
|
34
48
|
if (!snapshot.authState.email) return 'authenticated';
|
|
35
|
-
return
|
|
49
|
+
return snapshot.authState.email;
|
|
50
|
+
};
|
|
51
|
+
const formatBackendOriginLabel = backendOrigin => {
|
|
52
|
+
try {
|
|
53
|
+
const {
|
|
54
|
+
hostname
|
|
55
|
+
} = new URL(backendOrigin);
|
|
56
|
+
if (hostname === 'localhost' || hostname === '127.0.0.1') return 'localhost';
|
|
57
|
+
return 'opencode-wizard';
|
|
58
|
+
} catch {
|
|
59
|
+
if (backendOrigin.includes('localhost') || backendOrigin.includes('127.0.0.1')) return 'localhost';
|
|
60
|
+
return 'opencode-wizard';
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const requestRender = api => {
|
|
64
|
+
try {
|
|
65
|
+
api.renderer?.requestRender?.();
|
|
66
|
+
} catch {
|
|
67
|
+
// Ignore render request failures; state is still updated.
|
|
68
|
+
}
|
|
36
69
|
};
|
|
37
70
|
const Row = props => (() => {
|
|
38
71
|
var _el$ = _$createElement("box"),
|
|
@@ -66,123 +99,86 @@ const Row = props => (() => {
|
|
|
66
99
|
})();
|
|
67
100
|
const Panel = props => (() => {
|
|
68
101
|
var _el$5 = _$createElement("box"),
|
|
69
|
-
_el$6 = _$createElement("
|
|
70
|
-
_el$7 = _$createElement("
|
|
102
|
+
_el$6 = _$createElement("box"),
|
|
103
|
+
_el$7 = _$createElement("box"),
|
|
104
|
+
_el$8 = _$createElement("text"),
|
|
105
|
+
_el$9 = _$createElement("b"),
|
|
106
|
+
_el$0 = _$createElement("box"),
|
|
107
|
+
_el$1 = _$createElement("text");
|
|
71
108
|
_$insertNode(_el$5, _el$6);
|
|
72
109
|
_$setProp(_el$5, "width", "100%");
|
|
73
110
|
_$setProp(_el$5, "flexDirection", "column");
|
|
74
111
|
_$setProp(_el$5, "paddingRight", 1);
|
|
75
112
|
_$insertNode(_el$6, _el$7);
|
|
76
|
-
_$
|
|
113
|
+
_$insertNode(_el$6, _el$0);
|
|
114
|
+
_$setProp(_el$6, "width", "100%");
|
|
115
|
+
_$setProp(_el$6, "flexDirection", "row");
|
|
116
|
+
_$setProp(_el$6, "justifyContent", "space-between");
|
|
77
117
|
_$setProp(_el$6, "overflow", "hidden");
|
|
78
|
-
_$
|
|
118
|
+
_$insertNode(_el$7, _el$8);
|
|
119
|
+
_$setProp(_el$7, "flexShrink", 0);
|
|
120
|
+
_$insertNode(_el$8, _el$9);
|
|
121
|
+
_$setProp(_el$8, "wrapMode", "none");
|
|
122
|
+
_$setProp(_el$8, "overflow", "hidden");
|
|
123
|
+
_$insert(_el$9, () => props.title);
|
|
124
|
+
_$insertNode(_el$0, _el$1);
|
|
125
|
+
_$setProp(_el$0, "flexShrink", 0);
|
|
126
|
+
_$insertNode(_el$1, _$createTextNode(`open`));
|
|
127
|
+
_$setProp(_el$1, "wrapMode", "none");
|
|
79
128
|
_$insert(_el$5, () => props.children, null);
|
|
80
129
|
_$effect(_p$ => {
|
|
81
|
-
var _v$3 = props.
|
|
82
|
-
_v$4 = props.theme.text
|
|
130
|
+
var _v$3 = props.onOpen,
|
|
131
|
+
_v$4 = props.theme.text,
|
|
132
|
+
_v$5 = props.theme.textMuted;
|
|
83
133
|
_v$3 !== _p$.e && (_p$.e = _$setProp(_el$5, "onMouseUp", _v$3, _p$.e));
|
|
84
|
-
_v$4 !== _p$.t && (_p$.t = _$setProp(_el$
|
|
134
|
+
_v$4 !== _p$.t && (_p$.t = _$setProp(_el$8, "fg", _v$4, _p$.t));
|
|
135
|
+
_v$5 !== _p$.a && (_p$.a = _$setProp(_el$1, "fg", _v$5, _p$.a));
|
|
85
136
|
return _p$;
|
|
86
137
|
}, {
|
|
87
138
|
e: undefined,
|
|
88
|
-
t: undefined
|
|
139
|
+
t: undefined,
|
|
140
|
+
a: undefined
|
|
89
141
|
});
|
|
90
142
|
return _el$5;
|
|
91
143
|
})();
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
onClose: () => {
|
|
103
|
-
api.ui.dialog.clear();
|
|
104
|
-
},
|
|
105
|
-
get children() {
|
|
106
|
-
return _$createComponent(api.ui.DialogSelect, {
|
|
107
|
-
title: "Wizard skills catalog",
|
|
108
|
-
placeholder: "Filter loaded skills",
|
|
109
|
-
options: options,
|
|
110
|
-
onSelect: option => {
|
|
111
|
-
const selectedSkill = status.snapshot.catalog?.skills.find(skill => skill.skillSlug === option.value);
|
|
112
|
-
if (!selectedSkill) return;
|
|
113
|
-
api.ui.dialog.clear();
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}));
|
|
118
|
-
return;
|
|
144
|
+
const StatusContent = props => {
|
|
145
|
+
if (props.status.kind === 'loading') {
|
|
146
|
+
return (() => {
|
|
147
|
+
var _el$11 = _$createElement("text");
|
|
148
|
+
_$insertNode(_el$11, _$createTextNode(`loading…`));
|
|
149
|
+
_$setProp(_el$11, "wrapMode", "none");
|
|
150
|
+
_$setProp(_el$11, "overflow", "hidden");
|
|
151
|
+
_$effect(_$p => _$setProp(_el$11, "fg", props.theme.textMuted, _$p));
|
|
152
|
+
return _el$11;
|
|
153
|
+
})();
|
|
119
154
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
155
|
+
if (props.status.kind === 'error') {
|
|
156
|
+
return (() => {
|
|
157
|
+
var _el$13 = _$createElement("text"),
|
|
158
|
+
_el$14 = _$createTextNode(`unavailable: `);
|
|
159
|
+
_$insertNode(_el$13, _el$14);
|
|
160
|
+
_$setProp(_el$13, "wrapMode", "none");
|
|
161
|
+
_$setProp(_el$13, "overflow", "hidden");
|
|
162
|
+
_$insert(_el$13, () => compactStatusMessage(props.status.message), null);
|
|
163
|
+
_$effect(_$p => _$setProp(_el$13, "fg", props.theme.warning, _$p));
|
|
164
|
+
return _el$13;
|
|
165
|
+
})();
|
|
166
|
+
}
|
|
167
|
+
return _$createComponent(ReadyRows, {
|
|
168
|
+
get snapshot() {
|
|
169
|
+
return props.status.snapshot;
|
|
125
170
|
},
|
|
126
|
-
get
|
|
127
|
-
|
|
128
|
-
_el$9 = _$createElement("text"),
|
|
129
|
-
_el$0 = _$createElement("b"),
|
|
130
|
-
_el$10 = _$createElement("text");
|
|
131
|
-
_$insertNode(_el$8, _el$9);
|
|
132
|
-
_$insertNode(_el$8, _el$10);
|
|
133
|
-
_$setProp(_el$8, "width", "100%");
|
|
134
|
-
_$setProp(_el$8, "flexDirection", "column");
|
|
135
|
-
_$setProp(_el$8, "paddingLeft", 1);
|
|
136
|
-
_$setProp(_el$8, "paddingRight", 1);
|
|
137
|
-
_$insertNode(_el$9, _el$0);
|
|
138
|
-
_$setProp(_el$9, "wrapMode", "none");
|
|
139
|
-
_$insertNode(_el$0, _$createTextNode(`Wizard skills catalog`));
|
|
140
|
-
_$setProp(_el$10, "marginTop", 1);
|
|
141
|
-
_$insert(_el$10, message);
|
|
142
|
-
_$effect(_p$ => {
|
|
143
|
-
var _v$5 = theme.text,
|
|
144
|
-
_v$6 = theme.warning;
|
|
145
|
-
_v$5 !== _p$.e && (_p$.e = _$setProp(_el$9, "fg", _v$5, _p$.e));
|
|
146
|
-
_v$6 !== _p$.t && (_p$.t = _$setProp(_el$10, "fg", _v$6, _p$.t));
|
|
147
|
-
return _p$;
|
|
148
|
-
}, {
|
|
149
|
-
e: undefined,
|
|
150
|
-
t: undefined
|
|
151
|
-
});
|
|
152
|
-
return _el$8;
|
|
171
|
+
get theme() {
|
|
172
|
+
return props.theme;
|
|
153
173
|
}
|
|
154
|
-
})
|
|
174
|
+
});
|
|
155
175
|
};
|
|
156
176
|
const SkillsRows = props => {
|
|
157
177
|
const theme = createMemo(() => props.api.theme.current);
|
|
158
178
|
const statusContent = () => {
|
|
159
179
|
const currentStatus = props.status();
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
var _el$11 = _$createElement("text");
|
|
163
|
-
_$insertNode(_el$11, _$createTextNode(`loading wizard skills catalog…`));
|
|
164
|
-
_$setProp(_el$11, "wrapMode", "none");
|
|
165
|
-
_$setProp(_el$11, "overflow", "hidden");
|
|
166
|
-
_$effect(_$p => _$setProp(_el$11, "fg", theme().textMuted, _$p));
|
|
167
|
-
return _el$11;
|
|
168
|
-
})();
|
|
169
|
-
}
|
|
170
|
-
if (currentStatus.kind === 'error') {
|
|
171
|
-
return (() => {
|
|
172
|
-
var _el$13 = _$createElement("text"),
|
|
173
|
-
_el$14 = _$createTextNode(`skills catalog unavailable: `);
|
|
174
|
-
_$insertNode(_el$13, _el$14);
|
|
175
|
-
_$setProp(_el$13, "wrapMode", "none");
|
|
176
|
-
_$setProp(_el$13, "overflow", "hidden");
|
|
177
|
-
_$insert(_el$13, () => currentStatus.message, null);
|
|
178
|
-
_$effect(_$p => _$setProp(_el$13, "fg", theme().warning, _$p));
|
|
179
|
-
return _el$13;
|
|
180
|
-
})();
|
|
181
|
-
}
|
|
182
|
-
return _$createComponent(ReadyRows, {
|
|
183
|
-
get snapshot() {
|
|
184
|
-
return currentStatus.snapshot;
|
|
185
|
-
},
|
|
180
|
+
return _$createComponent(StatusContent, {
|
|
181
|
+
status: currentStatus,
|
|
186
182
|
get theme() {
|
|
187
183
|
return theme();
|
|
188
184
|
}
|
|
@@ -207,22 +203,222 @@ const CatalogBullet = props => (() => {
|
|
|
207
203
|
_$effect(_$p => _$setProp(_el$16, "fg", props.theme.text, _$p));
|
|
208
204
|
return _el$16;
|
|
209
205
|
})();
|
|
206
|
+
const getSkillDisplayName = skill => skill.artifactName || skill.skillName || skill.skillSlug;
|
|
207
|
+
const getSkillDescription = skill => {
|
|
208
|
+
if (skill.whenToUse) return skill.whenToUse;
|
|
209
|
+
if (skill.artifactDescription) return skill.artifactDescription;
|
|
210
|
+
return null;
|
|
211
|
+
};
|
|
212
|
+
const getSkillTags = skill => {
|
|
213
|
+
const tagLabels = skill.tags.map(tag => tag.label || tag.slug).filter(Boolean).slice(0, MAX_SKILL_TAGS);
|
|
214
|
+
if (tagLabels.length === 0) return 'no tags';
|
|
215
|
+
return tagLabels.join(', ');
|
|
216
|
+
};
|
|
217
|
+
const getSkillMeta = skill => `${skill.policyLabel} · ${skill.contextKind} · ${getSkillTags(skill)}`;
|
|
218
|
+
const SkillCatalogRow = props => {
|
|
219
|
+
const description = getSkillDescription(props.skill);
|
|
220
|
+
return (() => {
|
|
221
|
+
var _el$18 = _$createElement("box"),
|
|
222
|
+
_el$19 = _$createElement("text"),
|
|
223
|
+
_el$20 = _$createElement("b"),
|
|
224
|
+
_el$21 = _$createElement("text");
|
|
225
|
+
_$insertNode(_el$18, _el$19);
|
|
226
|
+
_$insertNode(_el$18, _el$21);
|
|
227
|
+
_$setProp(_el$18, "width", "100%");
|
|
228
|
+
_$setProp(_el$18, "flexDirection", "column");
|
|
229
|
+
_$setProp(_el$18, "overflow", "hidden");
|
|
230
|
+
_$setProp(_el$18, "marginBottom", 1);
|
|
231
|
+
_$insertNode(_el$19, _el$20);
|
|
232
|
+
_$setProp(_el$19, "wrapMode", "none");
|
|
233
|
+
_$setProp(_el$19, "overflow", "hidden");
|
|
234
|
+
_$insert(_el$20, () => compactSkillName(getSkillDisplayName(props.skill)));
|
|
235
|
+
_$setProp(_el$21, "wrapMode", "none");
|
|
236
|
+
_$setProp(_el$21, "overflow", "hidden");
|
|
237
|
+
_$insert(_el$21, () => compactSkillMeta(getSkillMeta(props.skill)));
|
|
238
|
+
_$insert(_el$18, description ? (() => {
|
|
239
|
+
var _el$22 = _$createElement("text");
|
|
240
|
+
_$setProp(_el$22, "wrapMode", "none");
|
|
241
|
+
_$setProp(_el$22, "overflow", "hidden");
|
|
242
|
+
_$insert(_el$22, () => compactSkillDescription(description));
|
|
243
|
+
_$effect(_$p => _$setProp(_el$22, "fg", props.theme.text, _$p));
|
|
244
|
+
return _el$22;
|
|
245
|
+
})() : null, null);
|
|
246
|
+
_$effect(_p$ => {
|
|
247
|
+
var _v$6 = props.theme.text,
|
|
248
|
+
_v$7 = props.theme.textMuted;
|
|
249
|
+
_v$6 !== _p$.e && (_p$.e = _$setProp(_el$19, "fg", _v$6, _p$.e));
|
|
250
|
+
_v$7 !== _p$.t && (_p$.t = _$setProp(_el$21, "fg", _v$7, _p$.t));
|
|
251
|
+
return _p$;
|
|
252
|
+
}, {
|
|
253
|
+
e: undefined,
|
|
254
|
+
t: undefined
|
|
255
|
+
});
|
|
256
|
+
return _el$18;
|
|
257
|
+
})();
|
|
258
|
+
};
|
|
259
|
+
const WizardSkillsDialogContent = props => {
|
|
260
|
+
const [page, setPage] = createSignal(0);
|
|
261
|
+
const content = () => {
|
|
262
|
+
const currentStatus = props.status();
|
|
263
|
+
if (currentStatus.kind === 'loading') {
|
|
264
|
+
return (() => {
|
|
265
|
+
var _el$23 = _$createElement("text");
|
|
266
|
+
_$insertNode(_el$23, _$createTextNode(`Refreshing published skills…`));
|
|
267
|
+
_$setProp(_el$23, "wrapMode", "none");
|
|
268
|
+
_$setProp(_el$23, "overflow", "hidden");
|
|
269
|
+
_$effect(_$p => _$setProp(_el$23, "fg", props.theme.textMuted, _$p));
|
|
270
|
+
return _el$23;
|
|
271
|
+
})();
|
|
272
|
+
}
|
|
273
|
+
if (currentStatus.kind === 'error') {
|
|
274
|
+
return (() => {
|
|
275
|
+
var _el$25 = _$createElement("text"),
|
|
276
|
+
_el$26 = _$createTextNode(`unavailable: `);
|
|
277
|
+
_$insertNode(_el$25, _el$26);
|
|
278
|
+
_$setProp(_el$25, "wrapMode", "none");
|
|
279
|
+
_$setProp(_el$25, "overflow", "hidden");
|
|
280
|
+
_$insert(_el$25, () => compactStatusMessage(currentStatus.message), null);
|
|
281
|
+
_$effect(_$p => _$setProp(_el$25, "fg", props.theme.warning, _$p));
|
|
282
|
+
return _el$25;
|
|
283
|
+
})();
|
|
284
|
+
}
|
|
285
|
+
if (!currentStatus.snapshot.catalog) {
|
|
286
|
+
return (() => {
|
|
287
|
+
var _el$27 = _$createElement("text"),
|
|
288
|
+
_el$28 = _$createTextNode(`catalog `);
|
|
289
|
+
_$insertNode(_el$27, _el$28);
|
|
290
|
+
_$setProp(_el$27, "wrapMode", "none");
|
|
291
|
+
_$setProp(_el$27, "overflow", "hidden");
|
|
292
|
+
_$insert(_el$27, () => formatSkillsCatalogUnavailableMessage(currentStatus.snapshot), null);
|
|
293
|
+
_$effect(_$p => _$setProp(_el$27, "fg", props.theme.textMuted, _$p));
|
|
294
|
+
return _el$27;
|
|
295
|
+
})();
|
|
296
|
+
}
|
|
297
|
+
const {
|
|
298
|
+
catalog
|
|
299
|
+
} = currentStatus.snapshot;
|
|
300
|
+
const totalPages = Math.max(1, Math.ceil(catalog.skills.length / SKILLS_PAGE_SIZE));
|
|
301
|
+
const currentPage = Math.min(page(), totalPages - 1);
|
|
302
|
+
const startIndex = currentPage * SKILLS_PAGE_SIZE;
|
|
303
|
+
const endIndex = Math.min(startIndex + SKILLS_PAGE_SIZE, catalog.skills.length);
|
|
304
|
+
const visibleSkills = catalog.skills.slice(startIndex, endIndex);
|
|
305
|
+
const canGoBack = currentPage > 0;
|
|
306
|
+
const canGoForward = currentPage < totalPages - 1;
|
|
307
|
+
const goBack = () => {
|
|
308
|
+
if (!canGoBack) return;
|
|
309
|
+
setPage(currentPage - 1);
|
|
310
|
+
};
|
|
311
|
+
const goForward = () => {
|
|
312
|
+
if (!canGoForward) return;
|
|
313
|
+
setPage(currentPage + 1);
|
|
314
|
+
};
|
|
315
|
+
return (() => {
|
|
316
|
+
var _el$29 = _$createElement("box"),
|
|
317
|
+
_el$30 = _$createElement("box"),
|
|
318
|
+
_el$31 = _$createElement("text"),
|
|
319
|
+
_el$32 = _$createElement("b"),
|
|
320
|
+
_el$33 = _$createTextNode(` skills`),
|
|
321
|
+
_el$34 = _$createTextNode(` · `),
|
|
322
|
+
_el$35 = _$createTextNode(` global · `),
|
|
323
|
+
_el$36 = _$createTextNode(` workspace`),
|
|
324
|
+
_el$37 = _$createElement("text"),
|
|
325
|
+
_el$38 = _$createTextNode(`page `),
|
|
326
|
+
_el$39 = _$createTextNode(`/`),
|
|
327
|
+
_el$40 = _$createElement("box"),
|
|
328
|
+
_el$41 = _$createElement("box"),
|
|
329
|
+
_el$42 = _$createElement("box"),
|
|
330
|
+
_el$43 = _$createElement("text"),
|
|
331
|
+
_el$45 = _$createElement("text"),
|
|
332
|
+
_el$46 = _$createTextNode(` shown`),
|
|
333
|
+
_el$47 = _$createElement("box"),
|
|
334
|
+
_el$48 = _$createElement("text");
|
|
335
|
+
_$insertNode(_el$29, _el$30);
|
|
336
|
+
_$insertNode(_el$29, _el$40);
|
|
337
|
+
_$insertNode(_el$29, _el$41);
|
|
338
|
+
_$setProp(_el$29, "width", "100%");
|
|
339
|
+
_$setProp(_el$29, "flexDirection", "column");
|
|
340
|
+
_$setProp(_el$29, "overflow", "hidden");
|
|
341
|
+
_$insertNode(_el$30, _el$31);
|
|
342
|
+
_$insertNode(_el$30, _el$37);
|
|
343
|
+
_$setProp(_el$30, "width", "100%");
|
|
344
|
+
_$setProp(_el$30, "flexDirection", "row");
|
|
345
|
+
_$setProp(_el$30, "justifyContent", "space-between");
|
|
346
|
+
_$setProp(_el$30, "overflow", "hidden");
|
|
347
|
+
_$insertNode(_el$31, _el$32);
|
|
348
|
+
_$insertNode(_el$31, _el$34);
|
|
349
|
+
_$insertNode(_el$31, _el$35);
|
|
350
|
+
_$insertNode(_el$31, _el$36);
|
|
351
|
+
_$setProp(_el$31, "wrapMode", "none");
|
|
352
|
+
_$setProp(_el$31, "overflow", "hidden");
|
|
353
|
+
_$insertNode(_el$32, _el$33);
|
|
354
|
+
_$insert(_el$32, () => catalog.publishedSkillCount, _el$33);
|
|
355
|
+
_$insert(_el$31, () => catalog.assignmentCounts.global, _el$35);
|
|
356
|
+
_$insert(_el$31, () => catalog.assignmentCounts.project, _el$36);
|
|
357
|
+
_$insertNode(_el$37, _el$38);
|
|
358
|
+
_$insertNode(_el$37, _el$39);
|
|
359
|
+
_$setProp(_el$37, "wrapMode", "none");
|
|
360
|
+
_$insert(_el$37, currentPage + 1, _el$39);
|
|
361
|
+
_$insert(_el$37, totalPages, null);
|
|
362
|
+
_$setProp(_el$40, "width", "100%");
|
|
363
|
+
_$setProp(_el$40, "flexDirection", "column");
|
|
364
|
+
_$setProp(_el$40, "marginTop", 1);
|
|
365
|
+
_$setProp(_el$40, "overflow", "hidden");
|
|
366
|
+
_$insert(_el$40, () => visibleSkills.map(skill => _$createComponent(SkillCatalogRow, {
|
|
367
|
+
skill: skill,
|
|
368
|
+
get theme() {
|
|
369
|
+
return props.theme;
|
|
370
|
+
}
|
|
371
|
+
})));
|
|
372
|
+
_$insertNode(_el$41, _el$42);
|
|
373
|
+
_$insertNode(_el$41, _el$45);
|
|
374
|
+
_$insertNode(_el$41, _el$47);
|
|
375
|
+
_$setProp(_el$41, "width", "100%");
|
|
376
|
+
_$setProp(_el$41, "flexDirection", "row");
|
|
377
|
+
_$setProp(_el$41, "justifyContent", "space-between");
|
|
378
|
+
_$setProp(_el$41, "overflow", "hidden");
|
|
379
|
+
_$insertNode(_el$42, _el$43);
|
|
380
|
+
_$setProp(_el$42, "onMouseUp", goBack);
|
|
381
|
+
_$setProp(_el$42, "flexShrink", 0);
|
|
382
|
+
_$insertNode(_el$43, _$createTextNode(`← Prev`));
|
|
383
|
+
_$setProp(_el$43, "wrapMode", "none");
|
|
384
|
+
_$insertNode(_el$45, _el$46);
|
|
385
|
+
_$setProp(_el$45, "wrapMode", "none");
|
|
386
|
+
_$setProp(_el$45, "overflow", "hidden");
|
|
387
|
+
_$insert(_el$45, () => visibleSkills.length, _el$46);
|
|
388
|
+
_$insertNode(_el$47, _el$48);
|
|
389
|
+
_$setProp(_el$47, "onMouseUp", goForward);
|
|
390
|
+
_$setProp(_el$47, "flexShrink", 0);
|
|
391
|
+
_$insertNode(_el$48, _$createTextNode(`Next →`));
|
|
392
|
+
_$setProp(_el$48, "wrapMode", "none");
|
|
393
|
+
_$effect(_p$ => {
|
|
394
|
+
var _v$8 = props.theme.text,
|
|
395
|
+
_v$9 = props.theme.textMuted,
|
|
396
|
+
_v$0 = canGoBack ? props.theme.text : props.theme.textMuted,
|
|
397
|
+
_v$1 = props.theme.textMuted,
|
|
398
|
+
_v$10 = canGoForward ? props.theme.text : props.theme.textMuted;
|
|
399
|
+
_v$8 !== _p$.e && (_p$.e = _$setProp(_el$31, "fg", _v$8, _p$.e));
|
|
400
|
+
_v$9 !== _p$.t && (_p$.t = _$setProp(_el$37, "fg", _v$9, _p$.t));
|
|
401
|
+
_v$0 !== _p$.a && (_p$.a = _$setProp(_el$43, "fg", _v$0, _p$.a));
|
|
402
|
+
_v$1 !== _p$.o && (_p$.o = _$setProp(_el$45, "fg", _v$1, _p$.o));
|
|
403
|
+
_v$10 !== _p$.i && (_p$.i = _$setProp(_el$48, "fg", _v$10, _p$.i));
|
|
404
|
+
return _p$;
|
|
405
|
+
}, {
|
|
406
|
+
e: undefined,
|
|
407
|
+
t: undefined,
|
|
408
|
+
a: undefined,
|
|
409
|
+
o: undefined,
|
|
410
|
+
i: undefined
|
|
411
|
+
});
|
|
412
|
+
return _el$29;
|
|
413
|
+
})();
|
|
414
|
+
};
|
|
415
|
+
return _$memo(content);
|
|
416
|
+
};
|
|
210
417
|
const ReadyRows = props => {
|
|
211
418
|
const statusRows = [_$createComponent(Row, {
|
|
212
|
-
label: "
|
|
419
|
+
label: "url",
|
|
213
420
|
get value() {
|
|
214
|
-
return props.snapshot.backendOrigin;
|
|
215
|
-
},
|
|
216
|
-
get labelColor() {
|
|
217
|
-
return props.theme.textMuted;
|
|
218
|
-
},
|
|
219
|
-
get valueColor() {
|
|
220
|
-
return props.theme.text;
|
|
221
|
-
}
|
|
222
|
-
}), _$createComponent(Row, {
|
|
223
|
-
label: "graphql",
|
|
224
|
-
get value() {
|
|
225
|
-
return props.snapshot.graphqlUrl;
|
|
421
|
+
return formatBackendOriginLabel(props.snapshot.backendOrigin);
|
|
226
422
|
},
|
|
227
423
|
get labelColor() {
|
|
228
424
|
return props.theme.textMuted;
|
|
@@ -244,12 +440,12 @@ const ReadyRows = props => {
|
|
|
244
440
|
})];
|
|
245
441
|
if (!props.snapshot.catalog) {
|
|
246
442
|
return (() => {
|
|
247
|
-
var _el$
|
|
248
|
-
_$setProp(_el$
|
|
249
|
-
_$setProp(_el$
|
|
250
|
-
_$setProp(_el$
|
|
251
|
-
_$insert(_el$
|
|
252
|
-
_$insert(_el$
|
|
443
|
+
var _el$50 = _$createElement("box");
|
|
444
|
+
_$setProp(_el$50, "width", "100%");
|
|
445
|
+
_$setProp(_el$50, "flexDirection", "column");
|
|
446
|
+
_$setProp(_el$50, "overflow", "hidden");
|
|
447
|
+
_$insert(_el$50, statusRows, null);
|
|
448
|
+
_$insert(_el$50, _$createComponent(Row, {
|
|
253
449
|
label: "catalog",
|
|
254
450
|
get value() {
|
|
255
451
|
return formatSkillsCatalogUnavailableMessage(props.snapshot);
|
|
@@ -261,22 +457,22 @@ const ReadyRows = props => {
|
|
|
261
457
|
return props.theme.text;
|
|
262
458
|
}
|
|
263
459
|
}), null);
|
|
264
|
-
return _el$
|
|
460
|
+
return _el$50;
|
|
265
461
|
})();
|
|
266
462
|
}
|
|
267
463
|
const counts = props.snapshot.catalog.assignmentCounts;
|
|
268
464
|
return (() => {
|
|
269
|
-
var _el$
|
|
270
|
-
_el$
|
|
271
|
-
_$insertNode(_el$
|
|
272
|
-
_$setProp(_el$
|
|
273
|
-
_$setProp(_el$
|
|
274
|
-
_$setProp(_el$
|
|
275
|
-
_$insert(_el$
|
|
276
|
-
_$insertNode(_el$
|
|
277
|
-
_$setProp(_el$
|
|
278
|
-
_$setProp(_el$
|
|
279
|
-
_$insert(_el$
|
|
465
|
+
var _el$51 = _$createElement("box"),
|
|
466
|
+
_el$52 = _$createElement("text");
|
|
467
|
+
_$insertNode(_el$51, _el$52);
|
|
468
|
+
_$setProp(_el$51, "width", "100%");
|
|
469
|
+
_$setProp(_el$51, "flexDirection", "column");
|
|
470
|
+
_$setProp(_el$51, "overflow", "hidden");
|
|
471
|
+
_$insert(_el$51, statusRows, _el$52);
|
|
472
|
+
_$insertNode(_el$52, _$createTextNode(`catalog:`));
|
|
473
|
+
_$setProp(_el$52, "wrapMode", "none");
|
|
474
|
+
_$setProp(_el$52, "overflow", "hidden");
|
|
475
|
+
_$insert(_el$51, _$createComponent(CatalogBullet, {
|
|
280
476
|
get value() {
|
|
281
477
|
return `${props.snapshot.catalog.publishedSkillCount} loaded`;
|
|
282
478
|
},
|
|
@@ -284,7 +480,7 @@ const ReadyRows = props => {
|
|
|
284
480
|
return props.theme;
|
|
285
481
|
}
|
|
286
482
|
}), null);
|
|
287
|
-
_$insert(_el$
|
|
483
|
+
_$insert(_el$51, _$createComponent(CatalogBullet, {
|
|
288
484
|
get value() {
|
|
289
485
|
return `${counts.global} global`;
|
|
290
486
|
},
|
|
@@ -292,7 +488,7 @@ const ReadyRows = props => {
|
|
|
292
488
|
return props.theme;
|
|
293
489
|
}
|
|
294
490
|
}), null);
|
|
295
|
-
_$insert(_el$
|
|
491
|
+
_$insert(_el$51, _$createComponent(CatalogBullet, {
|
|
296
492
|
get value() {
|
|
297
493
|
return `${counts.project} workspace`;
|
|
298
494
|
},
|
|
@@ -300,11 +496,91 @@ const ReadyRows = props => {
|
|
|
300
496
|
return props.theme;
|
|
301
497
|
}
|
|
302
498
|
}), null);
|
|
303
|
-
_$effect(_$p => _$setProp(_el$
|
|
304
|
-
return _el$
|
|
499
|
+
_$effect(_$p => _$setProp(_el$52, "fg", props.theme.textMuted, _$p));
|
|
500
|
+
return _el$51;
|
|
305
501
|
})();
|
|
306
502
|
};
|
|
307
|
-
const
|
|
503
|
+
const WizardSkillsDialog = props => {
|
|
504
|
+
const theme = createMemo(() => props.api.theme.current);
|
|
505
|
+
createEffect(() => {
|
|
506
|
+
props.api.ui?.dialog?.setSize?.('xlarge');
|
|
507
|
+
});
|
|
508
|
+
return (() => {
|
|
509
|
+
var _el$54 = _$createElement("box"),
|
|
510
|
+
_el$55 = _$createElement("box"),
|
|
511
|
+
_el$56 = _$createElement("text"),
|
|
512
|
+
_el$57 = _$createElement("b"),
|
|
513
|
+
_el$59 = _$createElement("box"),
|
|
514
|
+
_el$60 = _$createElement("text"),
|
|
515
|
+
_el$62 = _$createElement("box");
|
|
516
|
+
_$insertNode(_el$54, _el$55);
|
|
517
|
+
_$insertNode(_el$54, _el$62);
|
|
518
|
+
_$setProp(_el$54, "width", "100%");
|
|
519
|
+
_$setProp(_el$54, "flexDirection", "column");
|
|
520
|
+
_$setProp(_el$54, "paddingLeft", 1);
|
|
521
|
+
_$setProp(_el$54, "paddingRight", 1);
|
|
522
|
+
_$setProp(_el$54, "paddingBottom", 1);
|
|
523
|
+
_$insertNode(_el$55, _el$56);
|
|
524
|
+
_$insertNode(_el$55, _el$59);
|
|
525
|
+
_$setProp(_el$55, "width", "100%");
|
|
526
|
+
_$setProp(_el$55, "flexDirection", "row");
|
|
527
|
+
_$setProp(_el$55, "justifyContent", "space-between");
|
|
528
|
+
_$setProp(_el$55, "overflow", "hidden");
|
|
529
|
+
_$insertNode(_el$56, _el$57);
|
|
530
|
+
_$setProp(_el$56, "wrapMode", "none");
|
|
531
|
+
_$setProp(_el$56, "overflow", "hidden");
|
|
532
|
+
_$insertNode(_el$57, _$createTextNode(`Wizard Skills`));
|
|
533
|
+
_$insertNode(_el$59, _el$60);
|
|
534
|
+
_$setProp(_el$59, "flexShrink", 0);
|
|
535
|
+
_$insertNode(_el$60, _$createTextNode(`Close`));
|
|
536
|
+
_$setProp(_el$60, "wrapMode", "none");
|
|
537
|
+
_$setProp(_el$62, "width", "100%");
|
|
538
|
+
_$setProp(_el$62, "flexDirection", "column");
|
|
539
|
+
_$setProp(_el$62, "marginTop", 1);
|
|
540
|
+
_$setProp(_el$62, "overflow", "hidden");
|
|
541
|
+
_$insert(_el$62, _$createComponent(WizardSkillsDialogContent, {
|
|
542
|
+
get status() {
|
|
543
|
+
return props.status;
|
|
544
|
+
},
|
|
545
|
+
get theme() {
|
|
546
|
+
return theme();
|
|
547
|
+
}
|
|
548
|
+
}));
|
|
549
|
+
_$effect(_p$ => {
|
|
550
|
+
var _v$11 = theme().text,
|
|
551
|
+
_v$12 = props.onClose,
|
|
552
|
+
_v$13 = theme().textMuted;
|
|
553
|
+
_v$11 !== _p$.e && (_p$.e = _$setProp(_el$56, "fg", _v$11, _p$.e));
|
|
554
|
+
_v$12 !== _p$.t && (_p$.t = _$setProp(_el$59, "onMouseUp", _v$12, _p$.t));
|
|
555
|
+
_v$13 !== _p$.a && (_p$.a = _$setProp(_el$60, "fg", _v$13, _p$.a));
|
|
556
|
+
return _p$;
|
|
557
|
+
}, {
|
|
558
|
+
e: undefined,
|
|
559
|
+
t: undefined,
|
|
560
|
+
a: undefined
|
|
561
|
+
});
|
|
562
|
+
return _el$54;
|
|
563
|
+
})();
|
|
564
|
+
};
|
|
565
|
+
const openWizardSkillsDialog = (api, status, refreshStatus) => {
|
|
566
|
+
const dialog = api.ui?.dialog;
|
|
567
|
+
if (!dialog?.replace) return;
|
|
568
|
+
refreshStatus({
|
|
569
|
+
showLoading: true
|
|
570
|
+
});
|
|
571
|
+
dialog.replace(() => _$createComponent(WizardSkillsDialog, {
|
|
572
|
+
api: api,
|
|
573
|
+
status: status,
|
|
574
|
+
onClose: () => {
|
|
575
|
+
dialog.clear?.();
|
|
576
|
+
requestRender(api);
|
|
577
|
+
}
|
|
578
|
+
}), () => {
|
|
579
|
+
requestRender(api);
|
|
580
|
+
});
|
|
581
|
+
requestRender(api);
|
|
582
|
+
};
|
|
583
|
+
const createWizardStatusSlot = (api, status, refreshStatus) => ({
|
|
308
584
|
order: 240,
|
|
309
585
|
slots: {
|
|
310
586
|
home_bottom: () => _$createComponent(Panel, {
|
|
@@ -312,7 +588,7 @@ const createWizardStatusSlot = (api, status) => ({
|
|
|
312
588
|
get theme() {
|
|
313
589
|
return api.theme.current;
|
|
314
590
|
},
|
|
315
|
-
|
|
591
|
+
onOpen: () => openWizardSkillsDialog(api, status, refreshStatus),
|
|
316
592
|
get children() {
|
|
317
593
|
return _$createComponent(SkillsRows, {
|
|
318
594
|
api: api,
|
|
@@ -325,7 +601,7 @@ const createWizardStatusSlot = (api, status) => ({
|
|
|
325
601
|
get theme() {
|
|
326
602
|
return api.theme.current;
|
|
327
603
|
},
|
|
328
|
-
|
|
604
|
+
onOpen: () => openWizardSkillsDialog(api, status, refreshStatus),
|
|
329
605
|
get children() {
|
|
330
606
|
return _$createComponent(SkillsRows, {
|
|
331
607
|
api: api,
|
|
@@ -337,7 +613,7 @@ const createWizardStatusSlot = (api, status) => ({
|
|
|
337
613
|
});
|
|
338
614
|
const loadStatus = async api => {
|
|
339
615
|
try {
|
|
340
|
-
const snapshot = await
|
|
616
|
+
const snapshot = await resolvePluginStatusSnapshotWithAuthBootstrap({
|
|
341
617
|
worktree: api.state.path.worktree,
|
|
342
618
|
directory: api.state.path.directory,
|
|
343
619
|
signal: AbortSignal.timeout(STATUS_TIMEOUT_MS)
|
|
@@ -357,10 +633,19 @@ const tui = async api => {
|
|
|
357
633
|
const [status, setStatus] = createSignal({
|
|
358
634
|
kind: 'loading'
|
|
359
635
|
});
|
|
360
|
-
const refreshStatus =
|
|
361
|
-
|
|
636
|
+
const refreshStatus = options => {
|
|
637
|
+
if (options?.showLoading) {
|
|
638
|
+
setStatus({
|
|
639
|
+
kind: 'loading'
|
|
640
|
+
});
|
|
641
|
+
requestRender(api);
|
|
642
|
+
}
|
|
643
|
+
void loadStatus(api).then(nextStatus => {
|
|
644
|
+
setStatus(nextStatus);
|
|
645
|
+
requestRender(api);
|
|
646
|
+
});
|
|
362
647
|
};
|
|
363
|
-
api.slots.register(createWizardStatusSlot(api, status));
|
|
648
|
+
api.slots.register(createWizardStatusSlot(api, status, refreshStatus));
|
|
364
649
|
refreshStatus();
|
|
365
650
|
setInterval(refreshStatus, STATUS_REFRESH_INTERVAL_MS);
|
|
366
651
|
};
|