@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/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, resolvePluginStatusSnapshot } from './server.js';
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 getSkillDisplayName = skill => skill.artifactName || skill.skillName || skill.skillSlug;
15
- const getSkillPolicy = skill => skill.policyLabel || skill.installPolicy;
16
- const formatSkillTags = skill => {
17
- const tagNames = skill.tags.map(tag => tag.label || tag.slug).filter(tag => tag.length > 0);
18
- if (tagNames.length === 0) return 'none';
19
- return tagNames.join(', ');
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
- return 'skills catalog locked until interactive status/fetch authenticates; configured GraphQL URL is shown, but no ping was made because auth is missing';
39
+ if (snapshot.message) return compactStatusMessage(snapshot.message);
40
+ return 'locked (browser auth pending)';
24
41
  }
25
- if (!snapshot.catalog) return `skills catalog unavailable: ${snapshot.message ?? snapshot.status}`;
26
- return 'skills catalog unavailable';
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 `authenticated as ${snapshot.authState.email}`;
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("text"),
70
- _el$7 = _$createElement("b");
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
- _$setProp(_el$6, "wrapMode", "none");
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
- _$insert(_el$7, () => props.title);
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.onPress,
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$6, "fg", _v$4, _p$.t));
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 openSkillsDialog = (api, status) => {
93
- const theme = api.theme.current;
94
- if (status.kind === 'ready' && status.snapshot.catalog) {
95
- const options = status.snapshot.catalog.skills.map(skill => ({
96
- title: getSkillDisplayName(skill),
97
- value: skill.skillSlug,
98
- description: formatSkillOptionDescription(skill)
99
- }));
100
- api.ui.dialog.replace(() => _$createComponent(api.ui.Dialog, {
101
- size: "medium",
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
- const message = status.kind === 'loading' ? 'Skills catalog is loading. Try again after the catalog event completes.' : status.kind === 'error' ? `Skills catalog unavailable: ${status.message}` : status.snapshot.status === 'missing_auth' ? 'Skills catalog is locked until interactive status/fetch authenticates.' : status.snapshot.message ?? 'Skills catalog unavailable.';
121
- api.ui.dialog.replace(() => _$createComponent(api.ui.Dialog, {
122
- size: "medium",
123
- onClose: () => {
124
- api.ui.dialog.clear();
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 children() {
127
- var _el$8 = _$createElement("box"),
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
- if (currentStatus.kind === 'loading') {
161
- return (() => {
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(`&nbsp;· `),
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: "backend",
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$18 = _$createElement("box");
248
- _$setProp(_el$18, "width", "100%");
249
- _$setProp(_el$18, "flexDirection", "column");
250
- _$setProp(_el$18, "overflow", "hidden");
251
- _$insert(_el$18, statusRows, null);
252
- _$insert(_el$18, _$createComponent(Row, {
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$18;
460
+ return _el$50;
265
461
  })();
266
462
  }
267
463
  const counts = props.snapshot.catalog.assignmentCounts;
268
464
  return (() => {
269
- var _el$19 = _$createElement("box"),
270
- _el$20 = _$createElement("text");
271
- _$insertNode(_el$19, _el$20);
272
- _$setProp(_el$19, "width", "100%");
273
- _$setProp(_el$19, "flexDirection", "column");
274
- _$setProp(_el$19, "overflow", "hidden");
275
- _$insert(_el$19, statusRows, _el$20);
276
- _$insertNode(_el$20, _$createTextNode(`catalog:`));
277
- _$setProp(_el$20, "wrapMode", "none");
278
- _$setProp(_el$20, "overflow", "hidden");
279
- _$insert(_el$19, _$createComponent(CatalogBullet, {
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$19, _$createComponent(CatalogBullet, {
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$19, _$createComponent(CatalogBullet, {
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$20, "fg", props.theme.textMuted, _$p));
304
- return _el$19;
499
+ _$effect(_$p => _$setProp(_el$52, "fg", props.theme.textMuted, _$p));
500
+ return _el$51;
305
501
  })();
306
502
  };
307
- const createWizardStatusSlot = (api, status) => ({
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
- onPress: () => openSkillsDialog(api, status()),
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
- onPress: () => openSkillsDialog(api, status()),
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 resolvePluginStatusSnapshot({
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
- void loadStatus(api).then(setStatus);
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
  };