@aexol/opencode-wizard 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/graphql-operations.d.ts +4 -0
- package/dist/graphql-operations.js +225 -0
- package/dist/graphql-operations.js.map +1 -0
- package/dist/plugin-tools.d.ts +64 -0
- package/dist/plugin-tools.js +57 -0
- package/dist/plugin-tools.js.map +1 -0
- package/dist/published-skills-system-note.d.ts +9 -0
- package/dist/published-skills-system-note.js +34 -0
- package/dist/published-skills-system-note.js.map +1 -0
- package/dist/published-skills-transform.d.ts +161 -0
- package/dist/published-skills-transform.js +238 -0
- package/dist/published-skills-transform.js.map +1 -0
- package/dist/server/auth-flow.d.ts +10 -0
- package/dist/server/auth-flow.js +215 -0
- package/dist/server/auth-flow.js.map +1 -0
- package/dist/server/auth-store.d.ts +19 -0
- package/dist/server/auth-store.js +177 -0
- package/dist/server/auth-store.js.map +1 -0
- package/dist/server/client.d.ts +51 -0
- package/dist/server/client.js +244 -0
- package/dist/server/client.js.map +1 -0
- package/dist/server/config.d.ts +2 -0
- package/dist/server/config.js +82 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/constants.d.ts +26 -0
- package/dist/server/constants.js +32 -0
- package/dist/server/constants.js.map +1 -0
- package/dist/server/path-utils.d.ts +2 -0
- package/dist/server/path-utils.js +8 -0
- package/dist/server/path-utils.js.map +1 -0
- package/dist/server/presence.d.ts +14 -0
- package/dist/server/presence.js +68 -0
- package/dist/server/presence.js.map +1 -0
- package/dist/server/runtime.d.ts +32 -0
- package/dist/server/runtime.js +1110 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/status.d.ts +27 -0
- package/dist/server/status.js +224 -0
- package/dist/server/status.js.map +1 -0
- package/dist/server/types.d.ts +321 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/workspace.d.ts +15 -0
- package/dist/server/workspace.js +126 -0
- package/dist/server/workspace.js.map +1 -0
- package/dist/server.d.ts +4 -304
- package/dist/server.js +4 -2489
- package/dist/server.js.map +1 -1
- package/dist/smoke-published-skills.js +11 -9
- package/dist/smoke-published-skills.js.map +1 -1
- package/dist/tui/components/common.d.ts +15 -0
- package/dist/tui/components/common.js +81 -0
- package/dist/tui/components/common.js.map +1 -0
- package/dist/tui/components/preference-action-notice-row.d.ts +5 -0
- package/dist/tui/components/preference-action-notice-row.js +17 -0
- package/dist/tui/components/preference-action-notice-row.js.map +1 -0
- package/dist/tui/components/skill-catalog-row.d.ts +8 -0
- package/dist/tui/components/skill-catalog-row.js +124 -0
- package/dist/tui/components/skill-catalog-row.js.map +1 -0
- package/dist/tui/components/status-content.d.ts +14 -0
- package/dist/tui/components/status-content.js +131 -0
- package/dist/tui/components/status-content.js.map +1 -0
- package/dist/tui/components/wizard-skills-dialog-content.d.ts +9 -0
- package/dist/tui/components/wizard-skills-dialog-content.js +219 -0
- package/dist/tui/components/wizard-skills-dialog-content.js.map +1 -0
- package/dist/tui/components/wizard-skills-dialog.d.ts +7 -0
- package/dist/tui/components/wizard-skills-dialog.js +156 -0
- package/dist/tui/components/wizard-skills-dialog.js.map +1 -0
- package/dist/tui/constants.d.ts +8 -0
- package/dist/tui/constants.js +9 -0
- package/dist/tui/constants.js.map +1 -0
- package/dist/tui/formatting.d.ts +8 -0
- package/dist/tui/formatting.js +45 -0
- package/dist/tui/formatting.js.map +1 -0
- package/dist/tui/plugin.d.ts +2 -0
- package/dist/tui/plugin.js +26 -0
- package/dist/tui/plugin.js.map +1 -0
- package/dist/tui/rendering.d.ts +2 -0
- package/dist/tui/rendering.js +8 -0
- package/dist/tui/rendering.js.map +1 -0
- package/dist/tui/skill-helpers.d.ts +13 -0
- package/dist/tui/skill-helpers.js +49 -0
- package/dist/tui/skill-helpers.js.map +1 -0
- package/dist/tui/slots.d.ts +2 -0
- package/dist/tui/slots.js +56 -0
- package/dist/tui/slots.js.map +1 -0
- package/dist/tui/status.d.ts +2 -0
- package/dist/tui/status.js +21 -0
- package/dist/tui/status.js.map +1 -0
- package/dist/tui/types.d.ts +75 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui.d.ts +1 -44
- package/dist/tui.js +2 -870
- package/dist/tui.js.map +1 -1
- package/package.json +1 -1
package/dist/tui.js
CHANGED
|
@@ -1,873 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { effect as _$effect } from "@opentui/solid";
|
|
4
|
-
import { createTextNode as _$createTextNode } from "@opentui/solid";
|
|
5
|
-
import { insertNode as _$insertNode } from "@opentui/solid";
|
|
6
|
-
import { insert as _$insert } from "@opentui/solid";
|
|
7
|
-
import { setProp as _$setProp } from "@opentui/solid";
|
|
8
|
-
import { createElement as _$createElement } from "@opentui/solid";
|
|
9
|
-
/** @jsxImportSource @opentui/solid */
|
|
10
|
-
|
|
11
|
-
import { createEffect, createMemo, createSignal } from 'solid-js';
|
|
12
|
-
import { PLUGIN_ID, resolvePluginStatusSnapshotWithAuthBootstrap, setPublishedSkillInstalled, setPublishedSkillIgnored } from './server.js';
|
|
13
|
-
const STATUS_TIMEOUT_MS = 5_000;
|
|
14
|
-
const STATUS_REFRESH_INTERVAL_MS = 5_000;
|
|
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)}…`;
|
|
36
|
-
};
|
|
37
|
-
const formatSkillsCatalogUnavailableMessage = snapshot => {
|
|
38
|
-
if (!snapshot.catalog && snapshot.status === 'missing_auth') {
|
|
39
|
-
if (snapshot.message) return compactStatusMessage(snapshot.message);
|
|
40
|
-
return 'locked (browser auth pending)';
|
|
41
|
-
}
|
|
42
|
-
if (!snapshot.catalog && snapshot.message) return compactStatusMessage(snapshot.message);
|
|
43
|
-
if (!snapshot.catalog) return `unavailable (${snapshot.status})`;
|
|
44
|
-
return 'unavailable';
|
|
45
|
-
};
|
|
46
|
-
const formatAuthStatus = snapshot => {
|
|
47
|
-
if (snapshot.authState.status !== 'authenticated') return snapshot.authState.status;
|
|
48
|
-
if (!snapshot.authState.email) return 'authenticated';
|
|
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
|
-
}
|
|
69
|
-
};
|
|
70
|
-
const Row = props => (() => {
|
|
71
|
-
var _el$ = _$createElement("box"),
|
|
72
|
-
_el$2 = _$createElement("text"),
|
|
73
|
-
_el$3 = _$createTextNode(`: `),
|
|
74
|
-
_el$4 = _$createElement("text");
|
|
75
|
-
_$insertNode(_el$, _el$2);
|
|
76
|
-
_$insertNode(_el$, _el$4);
|
|
77
|
-
_$setProp(_el$, "width", "100%");
|
|
78
|
-
_$setProp(_el$, "flexDirection", "row");
|
|
79
|
-
_$setProp(_el$, "overflow", "hidden");
|
|
80
|
-
_$insertNode(_el$2, _el$3);
|
|
81
|
-
_$setProp(_el$2, "flexShrink", 0);
|
|
82
|
-
_$setProp(_el$2, "wrapMode", "none");
|
|
83
|
-
_$insert(_el$2, () => props.label, _el$3);
|
|
84
|
-
_$setProp(_el$4, "flexGrow", 1);
|
|
85
|
-
_$setProp(_el$4, "overflow", "hidden");
|
|
86
|
-
_$setProp(_el$4, "wrapMode", "none");
|
|
87
|
-
_$insert(_el$4, () => props.value);
|
|
88
|
-
_$effect(_p$ => {
|
|
89
|
-
var _v$ = props.labelColor,
|
|
90
|
-
_v$2 = props.valueColor;
|
|
91
|
-
_v$ !== _p$.e && (_p$.e = _$setProp(_el$2, "fg", _v$, _p$.e));
|
|
92
|
-
_v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, "fg", _v$2, _p$.t));
|
|
93
|
-
return _p$;
|
|
94
|
-
}, {
|
|
95
|
-
e: undefined,
|
|
96
|
-
t: undefined
|
|
97
|
-
});
|
|
98
|
-
return _el$;
|
|
99
|
-
})();
|
|
100
|
-
const Panel = props => (() => {
|
|
101
|
-
var _el$5 = _$createElement("box"),
|
|
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");
|
|
108
|
-
_$insertNode(_el$5, _el$6);
|
|
109
|
-
_$setProp(_el$5, "width", "100%");
|
|
110
|
-
_$setProp(_el$5, "flexDirection", "column");
|
|
111
|
-
_$setProp(_el$5, "paddingRight", 1);
|
|
112
|
-
_$insertNode(_el$6, _el$7);
|
|
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");
|
|
117
|
-
_$setProp(_el$6, "overflow", "hidden");
|
|
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");
|
|
128
|
-
_$insert(_el$5, () => props.children, null);
|
|
129
|
-
_$effect(_p$ => {
|
|
130
|
-
var _v$3 = props.onOpen,
|
|
131
|
-
_v$4 = props.theme.text,
|
|
132
|
-
_v$5 = props.theme.textMuted;
|
|
133
|
-
_v$3 !== _p$.e && (_p$.e = _$setProp(_el$5, "onMouseUp", _v$3, _p$.e));
|
|
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));
|
|
136
|
-
return _p$;
|
|
137
|
-
}, {
|
|
138
|
-
e: undefined,
|
|
139
|
-
t: undefined,
|
|
140
|
-
a: undefined
|
|
141
|
-
});
|
|
142
|
-
return _el$5;
|
|
143
|
-
})();
|
|
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
|
-
})();
|
|
154
|
-
}
|
|
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;
|
|
170
|
-
},
|
|
171
|
-
get theme() {
|
|
172
|
-
return props.theme;
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
};
|
|
176
|
-
const SkillsRows = props => {
|
|
177
|
-
const theme = createMemo(() => props.api.theme.current);
|
|
178
|
-
const statusContent = () => {
|
|
179
|
-
const currentStatus = props.status();
|
|
180
|
-
return _$createComponent(StatusContent, {
|
|
181
|
-
status: currentStatus,
|
|
182
|
-
get theme() {
|
|
183
|
-
return theme();
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
};
|
|
187
|
-
return (() => {
|
|
188
|
-
var _el$15 = _$createElement("box");
|
|
189
|
-
_$setProp(_el$15, "width", "100%");
|
|
190
|
-
_$setProp(_el$15, "flexDirection", "column");
|
|
191
|
-
_$setProp(_el$15, "overflow", "hidden");
|
|
192
|
-
_$insert(_el$15, statusContent);
|
|
193
|
-
return _el$15;
|
|
194
|
-
})();
|
|
195
|
-
};
|
|
196
|
-
const getSkillDisplayName = skill => skill.artifactName || skill.skillName || skill.skillSlug;
|
|
197
|
-
const getSkillDescription = skill => {
|
|
198
|
-
if (skill.whenToUse) return skill.whenToUse;
|
|
199
|
-
if (skill.artifactDescription) return skill.artifactDescription;
|
|
200
|
-
return null;
|
|
201
|
-
};
|
|
202
|
-
const getSkillTags = skill => {
|
|
203
|
-
const tagLabels = skill.tags.map(tag => tag.label || tag.slug).filter(Boolean).slice(0, MAX_SKILL_TAGS);
|
|
204
|
-
if (tagLabels.length === 0) return 'no tags';
|
|
205
|
-
return tagLabels.join(', ');
|
|
206
|
-
};
|
|
207
|
-
const isUserScopeAssignment = assignmentSource => assignmentSource === 'USER' || assignmentSource === 'USER_GLOBAL' || assignmentSource === 'USER_WORKSPACE';
|
|
208
|
-
const getSkillScopeLabel = (skill, state) => {
|
|
209
|
-
if (state === 'installable') return 'AVAILABLE';
|
|
210
|
-
if (isUserScopeAssignment(skill.assignmentSource) || state === 'user-scope') return 'USER SCOPE';
|
|
211
|
-
if (state === 'global-scope' || skill.contextKind === 'global') return 'GLOBAL SCOPE';
|
|
212
|
-
return 'PROJECT SCOPE';
|
|
213
|
-
};
|
|
214
|
-
const getSkillPreferenceScope = skill => {
|
|
215
|
-
if (skill.assignmentSource === 'USER_GLOBAL') return 'global';
|
|
216
|
-
if (skill.assignmentSource === 'USER_WORKSPACE') return 'project';
|
|
217
|
-
if (skill.contextKind === 'global') return 'global';
|
|
218
|
-
return 'project';
|
|
219
|
-
};
|
|
220
|
-
const getSkillMeta = (skill, state) => `${getSkillScopeLabel(skill, state)} · ${skill.assignmentLabel} · ${skill.policyLabel} · ${getSkillTags(skill)}`;
|
|
221
|
-
const getRowStateLabel = row => {
|
|
222
|
-
const scopeLabel = getSkillScopeLabel(row.skill, row.state);
|
|
223
|
-
if (row.ignored) return `ignored · ${scopeLabel}`;
|
|
224
|
-
if (row.state === 'installable') return 'not installed';
|
|
225
|
-
return `active · ${scopeLabel}`;
|
|
226
|
-
};
|
|
227
|
-
const getSkillRowState = skill => {
|
|
228
|
-
if (isUserScopeAssignment(skill.assignmentSource)) return 'user-scope';
|
|
229
|
-
if (skill.contextKind === 'global') return 'global-scope';
|
|
230
|
-
return 'project-scope';
|
|
231
|
-
};
|
|
232
|
-
const getInstallableNotInstalledSkills = snapshot => {
|
|
233
|
-
const installableSkills = snapshot.installableCatalog?.skills ?? [];
|
|
234
|
-
if (installableSkills.length === 0) return [];
|
|
235
|
-
const activeSkillSlugs = new Set(snapshot.catalog?.skills.map(skill => skill.skillSlug) ?? []);
|
|
236
|
-
const ignoredSkillSlugs = new Set(snapshot.ignoredPublishedSkills.skills.map(skill => skill.skillSlug));
|
|
237
|
-
return installableSkills.filter(skill => !activeSkillSlugs.has(skill.skillSlug) && !ignoredSkillSlugs.has(skill.skillSlug));
|
|
238
|
-
};
|
|
239
|
-
const getErrorMessage = error => {
|
|
240
|
-
if (error instanceof Error && error.message) return error.message;
|
|
241
|
-
return 'Preference update failed. Check plugin auth/backend status and try again.';
|
|
242
|
-
};
|
|
243
|
-
const SkillCatalogRow = props => {
|
|
244
|
-
const skill = props.row.skill;
|
|
245
|
-
const description = getSkillDescription(skill);
|
|
246
|
-
const canUninstall = skill.assignmentSource === 'USER_GLOBAL' || skill.assignmentSource === 'USER_WORKSPACE';
|
|
247
|
-
return (() => {
|
|
248
|
-
var _el$16 = _$createElement("box"),
|
|
249
|
-
_el$17 = _$createElement("box"),
|
|
250
|
-
_el$18 = _$createElement("text"),
|
|
251
|
-
_el$19 = _$createElement("b"),
|
|
252
|
-
_el$20 = _$createTextNode(` (`),
|
|
253
|
-
_el$22 = _$createTextNode(`)`),
|
|
254
|
-
_el$23 = _$createElement("box"),
|
|
255
|
-
_el$24 = _$createElement("text");
|
|
256
|
-
_$insertNode(_el$16, _el$17);
|
|
257
|
-
_$insertNode(_el$16, _el$24);
|
|
258
|
-
_$setProp(_el$16, "width", "100%");
|
|
259
|
-
_$setProp(_el$16, "flexDirection", "column");
|
|
260
|
-
_$setProp(_el$16, "overflow", "hidden");
|
|
261
|
-
_$setProp(_el$16, "marginBottom", 1);
|
|
262
|
-
_$insertNode(_el$17, _el$18);
|
|
263
|
-
_$insertNode(_el$17, _el$23);
|
|
264
|
-
_$setProp(_el$17, "width", "100%");
|
|
265
|
-
_$setProp(_el$17, "flexDirection", "row");
|
|
266
|
-
_$setProp(_el$17, "justifyContent", "space-between");
|
|
267
|
-
_$setProp(_el$17, "overflow", "hidden");
|
|
268
|
-
_$insertNode(_el$18, _el$19);
|
|
269
|
-
_$insertNode(_el$18, _el$20);
|
|
270
|
-
_$insertNode(_el$18, _el$22);
|
|
271
|
-
_$setProp(_el$18, "wrapMode", "none");
|
|
272
|
-
_$setProp(_el$18, "overflow", "hidden");
|
|
273
|
-
_$insert(_el$19, () => compactSkillName(getSkillDisplayName(skill)));
|
|
274
|
-
_$insert(_el$18, () => getRowStateLabel(props.row), _el$22);
|
|
275
|
-
_$setProp(_el$23, "flexDirection", "row");
|
|
276
|
-
_$setProp(_el$23, "flexShrink", 0);
|
|
277
|
-
_$insert(_el$23, (() => {
|
|
278
|
-
var _c$ = _$memo(() => props.row.state === 'installable');
|
|
279
|
-
return () => _c$() ? [(() => {
|
|
280
|
-
var _el$25 = _$createElement("box"),
|
|
281
|
-
_el$26 = _$createElement("text");
|
|
282
|
-
_$insertNode(_el$25, _el$26);
|
|
283
|
-
_$setProp(_el$25, "onMouseUp", () => props.onInstall(props.row, 'global'));
|
|
284
|
-
_$setProp(_el$25, "flexShrink", 0);
|
|
285
|
-
_$insertNode(_el$26, _$createTextNode(`GLOBAL SCOPE`));
|
|
286
|
-
_$setProp(_el$26, "wrapMode", "none");
|
|
287
|
-
_$effect(_$p => _$setProp(_el$26, "fg", props.theme.textMuted, _$p));
|
|
288
|
-
return _el$25;
|
|
289
|
-
})(), (() => {
|
|
290
|
-
var _el$28 = _$createElement("text");
|
|
291
|
-
_$insertNode(_el$28, _$createTextNode(` / `));
|
|
292
|
-
_$setProp(_el$28, "wrapMode", "none");
|
|
293
|
-
_$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
|
|
294
|
-
return _el$28;
|
|
295
|
-
})(), (() => {
|
|
296
|
-
var _el$30 = _$createElement("box"),
|
|
297
|
-
_el$31 = _$createElement("text");
|
|
298
|
-
_$insertNode(_el$30, _el$31);
|
|
299
|
-
_$setProp(_el$30, "onMouseUp", () => props.onInstall(props.row, 'project'));
|
|
300
|
-
_$setProp(_el$30, "flexShrink", 0);
|
|
301
|
-
_$insertNode(_el$31, _$createTextNode(`PROJECT SCOPE`));
|
|
302
|
-
_$setProp(_el$31, "wrapMode", "none");
|
|
303
|
-
_$effect(_$p => _$setProp(_el$31, "fg", props.theme.textMuted, _$p));
|
|
304
|
-
return _el$30;
|
|
305
|
-
})()] : [(() => {
|
|
306
|
-
var _el$33 = _$createElement("box"),
|
|
307
|
-
_el$34 = _$createElement("text");
|
|
308
|
-
_$insertNode(_el$33, _el$34);
|
|
309
|
-
_$setProp(_el$33, "onMouseUp", () => props.onIgnore(props.row));
|
|
310
|
-
_$setProp(_el$33, "flexShrink", 0);
|
|
311
|
-
_$setProp(_el$34, "wrapMode", "none");
|
|
312
|
-
_$insert(_el$34, () => props.row.ignored ? 'Unignore' : 'Ignore');
|
|
313
|
-
_$effect(_$p => _$setProp(_el$34, "fg", props.theme.textMuted, _$p));
|
|
314
|
-
return _el$33;
|
|
315
|
-
})(), canUninstall ? [(() => {
|
|
316
|
-
var _el$35 = _$createElement("text");
|
|
317
|
-
_$insertNode(_el$35, _$createTextNode(` / `));
|
|
318
|
-
_$setProp(_el$35, "wrapMode", "none");
|
|
319
|
-
_$effect(_$p => _$setProp(_el$35, "fg", props.theme.textMuted, _$p));
|
|
320
|
-
return _el$35;
|
|
321
|
-
})(), (() => {
|
|
322
|
-
var _el$37 = _$createElement("box"),
|
|
323
|
-
_el$38 = _$createElement("text");
|
|
324
|
-
_$insertNode(_el$37, _el$38);
|
|
325
|
-
_$setProp(_el$37, "onMouseUp", () => props.onUninstall(props.row));
|
|
326
|
-
_$setProp(_el$37, "flexShrink", 0);
|
|
327
|
-
_$insertNode(_el$38, _$createTextNode(`Uninstall`));
|
|
328
|
-
_$setProp(_el$38, "wrapMode", "none");
|
|
329
|
-
_$effect(_$p => _$setProp(_el$38, "fg", props.theme.textMuted, _$p));
|
|
330
|
-
return _el$37;
|
|
331
|
-
})()] : null];
|
|
332
|
-
})());
|
|
333
|
-
_$setProp(_el$24, "wrapMode", "none");
|
|
334
|
-
_$setProp(_el$24, "overflow", "hidden");
|
|
335
|
-
_$insert(_el$24, () => compactSkillMeta(getSkillMeta(skill, props.row.state)));
|
|
336
|
-
_$insert(_el$16, description ? (() => {
|
|
337
|
-
var _el$40 = _$createElement("text");
|
|
338
|
-
_$setProp(_el$40, "wrapMode", "none");
|
|
339
|
-
_$setProp(_el$40, "overflow", "hidden");
|
|
340
|
-
_$insert(_el$40, () => compactSkillDescription(description));
|
|
341
|
-
_$effect(_$p => _$setProp(_el$40, "fg", props.theme.text, _$p));
|
|
342
|
-
return _el$40;
|
|
343
|
-
})() : null, null);
|
|
344
|
-
_$effect(_p$ => {
|
|
345
|
-
var _v$6 = props.row.ignored ? props.theme.textMuted : props.theme.text,
|
|
346
|
-
_v$7 = props.theme.textMuted;
|
|
347
|
-
_v$6 !== _p$.e && (_p$.e = _$setProp(_el$18, "fg", _v$6, _p$.e));
|
|
348
|
-
_v$7 !== _p$.t && (_p$.t = _$setProp(_el$24, "fg", _v$7, _p$.t));
|
|
349
|
-
return _p$;
|
|
350
|
-
}, {
|
|
351
|
-
e: undefined,
|
|
352
|
-
t: undefined
|
|
353
|
-
});
|
|
354
|
-
return _el$16;
|
|
355
|
-
})();
|
|
356
|
-
};
|
|
357
|
-
const WizardSkillsDialogContent = props => {
|
|
358
|
-
const [page, setPage] = createSignal(0);
|
|
359
|
-
const content = () => {
|
|
360
|
-
const currentStatus = props.status();
|
|
361
|
-
if (currentStatus.kind === 'loading') {
|
|
362
|
-
return (() => {
|
|
363
|
-
var _el$41 = _$createElement("text");
|
|
364
|
-
_$insertNode(_el$41, _$createTextNode(`Refreshing published skills…`));
|
|
365
|
-
_$setProp(_el$41, "wrapMode", "none");
|
|
366
|
-
_$setProp(_el$41, "overflow", "hidden");
|
|
367
|
-
_$effect(_$p => _$setProp(_el$41, "fg", props.theme.textMuted, _$p));
|
|
368
|
-
return _el$41;
|
|
369
|
-
})();
|
|
370
|
-
}
|
|
371
|
-
if (currentStatus.kind === 'error') {
|
|
372
|
-
return (() => {
|
|
373
|
-
var _el$43 = _$createElement("text"),
|
|
374
|
-
_el$44 = _$createTextNode(`unavailable: `);
|
|
375
|
-
_$insertNode(_el$43, _el$44);
|
|
376
|
-
_$setProp(_el$43, "wrapMode", "none");
|
|
377
|
-
_$setProp(_el$43, "overflow", "hidden");
|
|
378
|
-
_$insert(_el$43, () => compactStatusMessage(currentStatus.message), null);
|
|
379
|
-
_$effect(_$p => _$setProp(_el$43, "fg", props.theme.warning, _$p));
|
|
380
|
-
return _el$43;
|
|
381
|
-
})();
|
|
382
|
-
}
|
|
383
|
-
if (!currentStatus.snapshot.catalog) {
|
|
384
|
-
return (() => {
|
|
385
|
-
var _el$45 = _$createElement("text"),
|
|
386
|
-
_el$46 = _$createTextNode(`catalog `);
|
|
387
|
-
_$insertNode(_el$45, _el$46);
|
|
388
|
-
_$setProp(_el$45, "wrapMode", "none");
|
|
389
|
-
_$setProp(_el$45, "overflow", "hidden");
|
|
390
|
-
_$insert(_el$45, () => formatSkillsCatalogUnavailableMessage(currentStatus.snapshot), null);
|
|
391
|
-
_$effect(_$p => _$setProp(_el$45, "fg", props.theme.textMuted, _$p));
|
|
392
|
-
return _el$45;
|
|
393
|
-
})();
|
|
394
|
-
}
|
|
395
|
-
const {
|
|
396
|
-
catalog
|
|
397
|
-
} = currentStatus.snapshot;
|
|
398
|
-
const installableNotInstalledSkills = getInstallableNotInstalledSkills(currentStatus.snapshot);
|
|
399
|
-
const rows = [...catalog.skills.map(skill => ({
|
|
400
|
-
skill,
|
|
401
|
-
ignored: false,
|
|
402
|
-
state: getSkillRowState(skill)
|
|
403
|
-
})), ...currentStatus.snapshot.ignoredPublishedSkills.skills.map(skill => ({
|
|
404
|
-
skill,
|
|
405
|
-
ignored: true,
|
|
406
|
-
state: getSkillRowState(skill)
|
|
407
|
-
})), ...installableNotInstalledSkills.map(skill => ({
|
|
408
|
-
skill,
|
|
409
|
-
ignored: false,
|
|
410
|
-
state: 'installable'
|
|
411
|
-
}))];
|
|
412
|
-
const totalPages = Math.max(1, Math.ceil(rows.length / SKILLS_PAGE_SIZE));
|
|
413
|
-
const currentPage = Math.min(page(), totalPages - 1);
|
|
414
|
-
const startIndex = currentPage * SKILLS_PAGE_SIZE;
|
|
415
|
-
const endIndex = Math.min(startIndex + SKILLS_PAGE_SIZE, rows.length);
|
|
416
|
-
const visibleRows = rows.slice(startIndex, endIndex);
|
|
417
|
-
const canGoBack = currentPage > 0;
|
|
418
|
-
const canGoForward = currentPage < totalPages - 1;
|
|
419
|
-
const goBack = () => {
|
|
420
|
-
if (!canGoBack) return;
|
|
421
|
-
setPage(currentPage - 1);
|
|
422
|
-
};
|
|
423
|
-
const goForward = () => {
|
|
424
|
-
if (!canGoForward) return;
|
|
425
|
-
setPage(currentPage + 1);
|
|
426
|
-
};
|
|
427
|
-
return (() => {
|
|
428
|
-
var _el$47 = _$createElement("box"),
|
|
429
|
-
_el$48 = _$createElement("box"),
|
|
430
|
-
_el$49 = _$createElement("text"),
|
|
431
|
-
_el$50 = _$createElement("b"),
|
|
432
|
-
_el$51 = _$createTextNode(` skills`),
|
|
433
|
-
_el$52 = _$createTextNode(` · `),
|
|
434
|
-
_el$53 = _$createTextNode(` GLOBAL SCOPE · `),
|
|
435
|
-
_el$54 = _$createTextNode(` PROJECT SCOPE · `),
|
|
436
|
-
_el$55 = _$createTextNode(` USER SCOPE · `),
|
|
437
|
-
_el$56 = _$createTextNode(` ignored · `),
|
|
438
|
-
_el$57 = _$createTextNode(` installable/not installed`),
|
|
439
|
-
_el$58 = _$createElement("text"),
|
|
440
|
-
_el$59 = _$createTextNode(`page `),
|
|
441
|
-
_el$60 = _$createTextNode(`/`),
|
|
442
|
-
_el$61 = _$createElement("box"),
|
|
443
|
-
_el$62 = _$createElement("box"),
|
|
444
|
-
_el$63 = _$createElement("box"),
|
|
445
|
-
_el$64 = _$createElement("text"),
|
|
446
|
-
_el$66 = _$createElement("text"),
|
|
447
|
-
_el$67 = _$createTextNode(` shown`),
|
|
448
|
-
_el$68 = _$createElement("box"),
|
|
449
|
-
_el$69 = _$createElement("text");
|
|
450
|
-
_$insertNode(_el$47, _el$48);
|
|
451
|
-
_$insertNode(_el$47, _el$61);
|
|
452
|
-
_$insertNode(_el$47, _el$62);
|
|
453
|
-
_$setProp(_el$47, "width", "100%");
|
|
454
|
-
_$setProp(_el$47, "flexDirection", "column");
|
|
455
|
-
_$setProp(_el$47, "overflow", "hidden");
|
|
456
|
-
_$insertNode(_el$48, _el$49);
|
|
457
|
-
_$insertNode(_el$48, _el$58);
|
|
458
|
-
_$setProp(_el$48, "width", "100%");
|
|
459
|
-
_$setProp(_el$48, "flexDirection", "row");
|
|
460
|
-
_$setProp(_el$48, "justifyContent", "space-between");
|
|
461
|
-
_$setProp(_el$48, "overflow", "hidden");
|
|
462
|
-
_$insertNode(_el$49, _el$50);
|
|
463
|
-
_$insertNode(_el$49, _el$52);
|
|
464
|
-
_$insertNode(_el$49, _el$53);
|
|
465
|
-
_$insertNode(_el$49, _el$54);
|
|
466
|
-
_$insertNode(_el$49, _el$55);
|
|
467
|
-
_$insertNode(_el$49, _el$56);
|
|
468
|
-
_$insertNode(_el$49, _el$57);
|
|
469
|
-
_$setProp(_el$49, "wrapMode", "none");
|
|
470
|
-
_$setProp(_el$49, "overflow", "hidden");
|
|
471
|
-
_$insertNode(_el$50, _el$51);
|
|
472
|
-
_$insert(_el$50, () => catalog.publishedSkillCount, _el$51);
|
|
473
|
-
_$insert(_el$49, () => catalog.assignmentCounts.global, _el$53);
|
|
474
|
-
_$insert(_el$49, () => catalog.assignmentCounts.project, _el$54);
|
|
475
|
-
_$insert(_el$49, () => catalog.assignmentCounts.user, _el$55);
|
|
476
|
-
_$insert(_el$49, () => currentStatus.snapshot.ignoredPublishedSkills.count, _el$56);
|
|
477
|
-
_$insert(_el$49, () => installableNotInstalledSkills.length, _el$57);
|
|
478
|
-
_$insertNode(_el$58, _el$59);
|
|
479
|
-
_$insertNode(_el$58, _el$60);
|
|
480
|
-
_$setProp(_el$58, "wrapMode", "none");
|
|
481
|
-
_$insert(_el$58, currentPage + 1, _el$60);
|
|
482
|
-
_$insert(_el$58, totalPages, null);
|
|
483
|
-
_$setProp(_el$61, "width", "100%");
|
|
484
|
-
_$setProp(_el$61, "flexDirection", "column");
|
|
485
|
-
_$setProp(_el$61, "marginTop", 1);
|
|
486
|
-
_$setProp(_el$61, "overflow", "hidden");
|
|
487
|
-
_$insert(_el$61, () => visibleRows.map(row => _$createComponent(SkillCatalogRow, {
|
|
488
|
-
row: row,
|
|
489
|
-
get theme() {
|
|
490
|
-
return props.theme;
|
|
491
|
-
},
|
|
492
|
-
get onIgnore() {
|
|
493
|
-
return props.onIgnoreSkill;
|
|
494
|
-
},
|
|
495
|
-
get onInstall() {
|
|
496
|
-
return props.onInstallSkill;
|
|
497
|
-
},
|
|
498
|
-
get onUninstall() {
|
|
499
|
-
return props.onUninstallSkill;
|
|
500
|
-
}
|
|
501
|
-
})));
|
|
502
|
-
_$insertNode(_el$62, _el$63);
|
|
503
|
-
_$insertNode(_el$62, _el$66);
|
|
504
|
-
_$insertNode(_el$62, _el$68);
|
|
505
|
-
_$setProp(_el$62, "width", "100%");
|
|
506
|
-
_$setProp(_el$62, "flexDirection", "row");
|
|
507
|
-
_$setProp(_el$62, "justifyContent", "space-between");
|
|
508
|
-
_$setProp(_el$62, "overflow", "hidden");
|
|
509
|
-
_$insertNode(_el$63, _el$64);
|
|
510
|
-
_$setProp(_el$63, "onMouseUp", goBack);
|
|
511
|
-
_$setProp(_el$63, "flexShrink", 0);
|
|
512
|
-
_$insertNode(_el$64, _$createTextNode(`← Prev`));
|
|
513
|
-
_$setProp(_el$64, "wrapMode", "none");
|
|
514
|
-
_$insertNode(_el$66, _el$67);
|
|
515
|
-
_$setProp(_el$66, "wrapMode", "none");
|
|
516
|
-
_$setProp(_el$66, "overflow", "hidden");
|
|
517
|
-
_$insert(_el$66, () => visibleRows.length, _el$67);
|
|
518
|
-
_$insertNode(_el$68, _el$69);
|
|
519
|
-
_$setProp(_el$68, "onMouseUp", goForward);
|
|
520
|
-
_$setProp(_el$68, "flexShrink", 0);
|
|
521
|
-
_$insertNode(_el$69, _$createTextNode(`Next →`));
|
|
522
|
-
_$setProp(_el$69, "wrapMode", "none");
|
|
523
|
-
_$effect(_p$ => {
|
|
524
|
-
var _v$8 = props.theme.text,
|
|
525
|
-
_v$9 = props.theme.textMuted,
|
|
526
|
-
_v$0 = canGoBack ? props.theme.text : props.theme.textMuted,
|
|
527
|
-
_v$1 = props.theme.textMuted,
|
|
528
|
-
_v$10 = canGoForward ? props.theme.text : props.theme.textMuted;
|
|
529
|
-
_v$8 !== _p$.e && (_p$.e = _$setProp(_el$49, "fg", _v$8, _p$.e));
|
|
530
|
-
_v$9 !== _p$.t && (_p$.t = _$setProp(_el$58, "fg", _v$9, _p$.t));
|
|
531
|
-
_v$0 !== _p$.a && (_p$.a = _$setProp(_el$64, "fg", _v$0, _p$.a));
|
|
532
|
-
_v$1 !== _p$.o && (_p$.o = _$setProp(_el$66, "fg", _v$1, _p$.o));
|
|
533
|
-
_v$10 !== _p$.i && (_p$.i = _$setProp(_el$69, "fg", _v$10, _p$.i));
|
|
534
|
-
return _p$;
|
|
535
|
-
}, {
|
|
536
|
-
e: undefined,
|
|
537
|
-
t: undefined,
|
|
538
|
-
a: undefined,
|
|
539
|
-
o: undefined,
|
|
540
|
-
i: undefined
|
|
541
|
-
});
|
|
542
|
-
return _el$47;
|
|
543
|
-
})();
|
|
544
|
-
};
|
|
545
|
-
return (() => {
|
|
546
|
-
var _el$71 = _$createElement("box");
|
|
547
|
-
_$setProp(_el$71, "width", "100%");
|
|
548
|
-
_$setProp(_el$71, "flexDirection", "column");
|
|
549
|
-
_$setProp(_el$71, "overflow", "hidden");
|
|
550
|
-
_$insert(_el$71, _$createComponent(PreferenceActionNoticeRow, {
|
|
551
|
-
get notice() {
|
|
552
|
-
return props.actionNotice();
|
|
553
|
-
},
|
|
554
|
-
get theme() {
|
|
555
|
-
return props.theme;
|
|
556
|
-
}
|
|
557
|
-
}), null);
|
|
558
|
-
_$insert(_el$71, content, null);
|
|
559
|
-
return _el$71;
|
|
560
|
-
})();
|
|
561
|
-
};
|
|
562
|
-
const PreferenceActionNoticeRow = props => {
|
|
563
|
-
if (props.notice.kind === 'idle') return null;
|
|
564
|
-
return (() => {
|
|
565
|
-
var _el$72 = _$createElement("text");
|
|
566
|
-
_$setProp(_el$72, "wrapMode", "none");
|
|
567
|
-
_$setProp(_el$72, "overflow", "hidden");
|
|
568
|
-
_$insert(_el$72, () => compactStatusMessage(props.notice.message));
|
|
569
|
-
_$effect(_$p => _$setProp(_el$72, "fg", props.notice.kind === 'error' ? props.theme.warning : props.theme.textMuted, _$p));
|
|
570
|
-
return _el$72;
|
|
571
|
-
})();
|
|
572
|
-
};
|
|
573
|
-
const ReadyRows = props => {
|
|
574
|
-
const statusRows = [_$createComponent(Row, {
|
|
575
|
-
label: "url",
|
|
576
|
-
get value() {
|
|
577
|
-
return formatBackendOriginLabel(props.snapshot.backendOrigin);
|
|
578
|
-
},
|
|
579
|
-
get labelColor() {
|
|
580
|
-
return props.theme.textMuted;
|
|
581
|
-
},
|
|
582
|
-
get valueColor() {
|
|
583
|
-
return props.theme.text;
|
|
584
|
-
}
|
|
585
|
-
}), _$createComponent(Row, {
|
|
586
|
-
label: "auth",
|
|
587
|
-
get value() {
|
|
588
|
-
return formatAuthStatus(props.snapshot);
|
|
589
|
-
},
|
|
590
|
-
get labelColor() {
|
|
591
|
-
return props.theme.textMuted;
|
|
592
|
-
},
|
|
593
|
-
get valueColor() {
|
|
594
|
-
return props.theme.text;
|
|
595
|
-
}
|
|
596
|
-
})];
|
|
597
|
-
if (!props.snapshot.catalog) {
|
|
598
|
-
return (() => {
|
|
599
|
-
var _el$73 = _$createElement("box");
|
|
600
|
-
_$setProp(_el$73, "width", "100%");
|
|
601
|
-
_$setProp(_el$73, "flexDirection", "column");
|
|
602
|
-
_$setProp(_el$73, "overflow", "hidden");
|
|
603
|
-
_$insert(_el$73, statusRows, null);
|
|
604
|
-
_$insert(_el$73, _$createComponent(Row, {
|
|
605
|
-
label: "catalog",
|
|
606
|
-
get value() {
|
|
607
|
-
return formatSkillsCatalogUnavailableMessage(props.snapshot);
|
|
608
|
-
},
|
|
609
|
-
get labelColor() {
|
|
610
|
-
return props.theme.textMuted;
|
|
611
|
-
},
|
|
612
|
-
get valueColor() {
|
|
613
|
-
return props.theme.text;
|
|
614
|
-
}
|
|
615
|
-
}), null);
|
|
616
|
-
return _el$73;
|
|
617
|
-
})();
|
|
618
|
-
}
|
|
619
|
-
const installableNotInstalledCount = getInstallableNotInstalledSkills(props.snapshot).length;
|
|
620
|
-
const catalogStatus = `${props.snapshot.catalog.publishedSkillCount} loaded · ${installableNotInstalledCount} installable · ${props.snapshot.ignoredPublishedSkills.count} ignored · open for details`;
|
|
621
|
-
return (() => {
|
|
622
|
-
var _el$74 = _$createElement("box");
|
|
623
|
-
_$setProp(_el$74, "width", "100%");
|
|
624
|
-
_$setProp(_el$74, "flexDirection", "column");
|
|
625
|
-
_$setProp(_el$74, "overflow", "hidden");
|
|
626
|
-
_$insert(_el$74, statusRows, null);
|
|
627
|
-
_$insert(_el$74, _$createComponent(Row, {
|
|
628
|
-
label: "catalog",
|
|
629
|
-
value: catalogStatus,
|
|
630
|
-
get labelColor() {
|
|
631
|
-
return props.theme.textMuted;
|
|
632
|
-
},
|
|
633
|
-
get valueColor() {
|
|
634
|
-
return props.theme.text;
|
|
635
|
-
}
|
|
636
|
-
}), null);
|
|
637
|
-
return _el$74;
|
|
638
|
-
})();
|
|
639
|
-
};
|
|
640
|
-
const WizardSkillsDialog = props => {
|
|
641
|
-
const theme = createMemo(() => props.api.theme.current);
|
|
642
|
-
const [actionNotice, setActionNotice] = createSignal({
|
|
643
|
-
kind: 'idle'
|
|
644
|
-
});
|
|
645
|
-
const refreshAfterPreferenceChange = message => {
|
|
646
|
-
setActionNotice({
|
|
647
|
-
kind: 'success',
|
|
648
|
-
message
|
|
649
|
-
});
|
|
650
|
-
props.refreshStatus({
|
|
651
|
-
showLoading: false
|
|
652
|
-
});
|
|
653
|
-
requestRender(props.api);
|
|
654
|
-
};
|
|
655
|
-
const showPreferenceFailure = error => {
|
|
656
|
-
setActionNotice({
|
|
657
|
-
kind: 'error',
|
|
658
|
-
message: getErrorMessage(error)
|
|
659
|
-
});
|
|
660
|
-
props.refreshStatus({
|
|
661
|
-
showLoading: false
|
|
662
|
-
});
|
|
663
|
-
requestRender(props.api);
|
|
664
|
-
};
|
|
665
|
-
const ignoreSkill = row => {
|
|
666
|
-
const currentStatus = props.status();
|
|
667
|
-
if (currentStatus.kind !== 'ready') return;
|
|
668
|
-
const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
|
|
669
|
-
setActionNotice({
|
|
670
|
-
kind: 'pending',
|
|
671
|
-
message: row.ignored ? 'Removing ignore preference…' : 'Ignoring skill…'
|
|
672
|
-
});
|
|
673
|
-
requestRender(props.api);
|
|
674
|
-
void setPublishedSkillIgnored({
|
|
675
|
-
worktree: props.api.state.path.worktree,
|
|
676
|
-
directory: props.api.state.path.directory,
|
|
677
|
-
scopeKey,
|
|
678
|
-
skillSlug: row.skill.skillSlug,
|
|
679
|
-
ignored: !row.ignored,
|
|
680
|
-
preferenceScope: getSkillPreferenceScope(row.skill)
|
|
681
|
-
}).then(() => refreshAfterPreferenceChange(row.ignored ? 'Skill is no longer ignored.' : 'Skill ignored.')).catch(showPreferenceFailure);
|
|
682
|
-
};
|
|
683
|
-
const installSkill = (row, preferenceScope) => {
|
|
684
|
-
const currentStatus = props.status();
|
|
685
|
-
if (currentStatus.kind !== 'ready') return;
|
|
686
|
-
const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
|
|
687
|
-
setActionNotice({
|
|
688
|
-
kind: 'pending',
|
|
689
|
-
message: `Installing skill for ${preferenceScope.toUpperCase()} SCOPE…`
|
|
690
|
-
});
|
|
691
|
-
requestRender(props.api);
|
|
692
|
-
void setPublishedSkillInstalled({
|
|
693
|
-
worktree: props.api.state.path.worktree,
|
|
694
|
-
directory: props.api.state.path.directory,
|
|
695
|
-
scopeKey,
|
|
696
|
-
skillSlug: row.skill.skillSlug,
|
|
697
|
-
installed: true,
|
|
698
|
-
preferenceScope
|
|
699
|
-
}).then(() => refreshAfterPreferenceChange(`Skill installed for ${preferenceScope.toUpperCase()} SCOPE.`)).catch(showPreferenceFailure);
|
|
700
|
-
};
|
|
701
|
-
const uninstallSkill = row => {
|
|
702
|
-
const currentStatus = props.status();
|
|
703
|
-
if (currentStatus.kind !== 'ready') return;
|
|
704
|
-
const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
|
|
705
|
-
setActionNotice({
|
|
706
|
-
kind: 'pending',
|
|
707
|
-
message: 'Uninstalling skill…'
|
|
708
|
-
});
|
|
709
|
-
requestRender(props.api);
|
|
710
|
-
void setPublishedSkillInstalled({
|
|
711
|
-
worktree: props.api.state.path.worktree,
|
|
712
|
-
directory: props.api.state.path.directory,
|
|
713
|
-
scopeKey,
|
|
714
|
-
skillSlug: row.skill.skillSlug,
|
|
715
|
-
installed: false,
|
|
716
|
-
preferenceScope: getSkillPreferenceScope(row.skill)
|
|
717
|
-
}).then(() => refreshAfterPreferenceChange('Skill uninstalled.')).catch(showPreferenceFailure);
|
|
718
|
-
};
|
|
719
|
-
createEffect(() => {
|
|
720
|
-
props.api.ui?.dialog?.setSize?.('xlarge');
|
|
721
|
-
});
|
|
722
|
-
return (() => {
|
|
723
|
-
var _el$75 = _$createElement("box"),
|
|
724
|
-
_el$76 = _$createElement("box"),
|
|
725
|
-
_el$77 = _$createElement("text"),
|
|
726
|
-
_el$78 = _$createElement("b"),
|
|
727
|
-
_el$80 = _$createElement("box"),
|
|
728
|
-
_el$81 = _$createElement("text"),
|
|
729
|
-
_el$83 = _$createElement("box");
|
|
730
|
-
_$insertNode(_el$75, _el$76);
|
|
731
|
-
_$insertNode(_el$75, _el$83);
|
|
732
|
-
_$setProp(_el$75, "width", "100%");
|
|
733
|
-
_$setProp(_el$75, "flexDirection", "column");
|
|
734
|
-
_$setProp(_el$75, "paddingLeft", 1);
|
|
735
|
-
_$setProp(_el$75, "paddingRight", 1);
|
|
736
|
-
_$setProp(_el$75, "paddingBottom", 1);
|
|
737
|
-
_$insertNode(_el$76, _el$77);
|
|
738
|
-
_$insertNode(_el$76, _el$80);
|
|
739
|
-
_$setProp(_el$76, "width", "100%");
|
|
740
|
-
_$setProp(_el$76, "flexDirection", "row");
|
|
741
|
-
_$setProp(_el$76, "justifyContent", "space-between");
|
|
742
|
-
_$setProp(_el$76, "overflow", "hidden");
|
|
743
|
-
_$insertNode(_el$77, _el$78);
|
|
744
|
-
_$setProp(_el$77, "wrapMode", "none");
|
|
745
|
-
_$setProp(_el$77, "overflow", "hidden");
|
|
746
|
-
_$insertNode(_el$78, _$createTextNode(`Wizard Skills`));
|
|
747
|
-
_$insertNode(_el$80, _el$81);
|
|
748
|
-
_$setProp(_el$80, "flexShrink", 0);
|
|
749
|
-
_$insertNode(_el$81, _$createTextNode(`Close`));
|
|
750
|
-
_$setProp(_el$81, "wrapMode", "none");
|
|
751
|
-
_$setProp(_el$83, "width", "100%");
|
|
752
|
-
_$setProp(_el$83, "flexDirection", "column");
|
|
753
|
-
_$setProp(_el$83, "marginTop", 1);
|
|
754
|
-
_$setProp(_el$83, "overflow", "hidden");
|
|
755
|
-
_$insert(_el$83, _$createComponent(WizardSkillsDialogContent, {
|
|
756
|
-
get status() {
|
|
757
|
-
return props.status;
|
|
758
|
-
},
|
|
759
|
-
actionNotice: actionNotice,
|
|
760
|
-
get theme() {
|
|
761
|
-
return theme();
|
|
762
|
-
},
|
|
763
|
-
onIgnoreSkill: ignoreSkill,
|
|
764
|
-
onInstallSkill: installSkill,
|
|
765
|
-
onUninstallSkill: uninstallSkill
|
|
766
|
-
}));
|
|
767
|
-
_$effect(_p$ => {
|
|
768
|
-
var _v$11 = theme().text,
|
|
769
|
-
_v$12 = props.onClose,
|
|
770
|
-
_v$13 = theme().textMuted;
|
|
771
|
-
_v$11 !== _p$.e && (_p$.e = _$setProp(_el$77, "fg", _v$11, _p$.e));
|
|
772
|
-
_v$12 !== _p$.t && (_p$.t = _$setProp(_el$80, "onMouseUp", _v$12, _p$.t));
|
|
773
|
-
_v$13 !== _p$.a && (_p$.a = _$setProp(_el$81, "fg", _v$13, _p$.a));
|
|
774
|
-
return _p$;
|
|
775
|
-
}, {
|
|
776
|
-
e: undefined,
|
|
777
|
-
t: undefined,
|
|
778
|
-
a: undefined
|
|
779
|
-
});
|
|
780
|
-
return _el$75;
|
|
781
|
-
})();
|
|
782
|
-
};
|
|
783
|
-
const openWizardSkillsDialog = (api, status, refreshStatus) => {
|
|
784
|
-
const dialog = api.ui?.dialog;
|
|
785
|
-
if (!dialog?.replace) return;
|
|
786
|
-
refreshStatus({
|
|
787
|
-
showLoading: true
|
|
788
|
-
});
|
|
789
|
-
dialog.replace(() => _$createComponent(WizardSkillsDialog, {
|
|
790
|
-
api: api,
|
|
791
|
-
status: status,
|
|
792
|
-
refreshStatus: refreshStatus,
|
|
793
|
-
onClose: () => {
|
|
794
|
-
dialog.clear?.();
|
|
795
|
-
requestRender(api);
|
|
796
|
-
}
|
|
797
|
-
}), () => {
|
|
798
|
-
requestRender(api);
|
|
799
|
-
});
|
|
800
|
-
requestRender(api);
|
|
801
|
-
};
|
|
802
|
-
const createWizardStatusSlot = (api, status, refreshStatus) => ({
|
|
803
|
-
order: 240,
|
|
804
|
-
slots: {
|
|
805
|
-
home_bottom: () => _$createComponent(Panel, {
|
|
806
|
-
title: "Wizard Skills",
|
|
807
|
-
get theme() {
|
|
808
|
-
return api.theme.current;
|
|
809
|
-
},
|
|
810
|
-
onOpen: () => openWizardSkillsDialog(api, status, refreshStatus),
|
|
811
|
-
get children() {
|
|
812
|
-
return _$createComponent(SkillsRows, {
|
|
813
|
-
api: api,
|
|
814
|
-
status: status
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
}),
|
|
818
|
-
sidebar_content: (_ctx, _value) => _$createComponent(Panel, {
|
|
819
|
-
title: "Wizard Skills",
|
|
820
|
-
get theme() {
|
|
821
|
-
return api.theme.current;
|
|
822
|
-
},
|
|
823
|
-
onOpen: () => openWizardSkillsDialog(api, status, refreshStatus),
|
|
824
|
-
get children() {
|
|
825
|
-
return _$createComponent(SkillsRows, {
|
|
826
|
-
api: api,
|
|
827
|
-
status: status
|
|
828
|
-
});
|
|
829
|
-
}
|
|
830
|
-
})
|
|
831
|
-
}
|
|
832
|
-
});
|
|
833
|
-
const loadStatus = async api => {
|
|
834
|
-
try {
|
|
835
|
-
const snapshot = await resolvePluginStatusSnapshotWithAuthBootstrap({
|
|
836
|
-
worktree: api.state.path.worktree,
|
|
837
|
-
directory: api.state.path.directory,
|
|
838
|
-
signal: AbortSignal.timeout(STATUS_TIMEOUT_MS)
|
|
839
|
-
});
|
|
840
|
-
return {
|
|
841
|
-
kind: 'ready',
|
|
842
|
-
snapshot
|
|
843
|
-
};
|
|
844
|
-
} catch (error) {
|
|
845
|
-
return {
|
|
846
|
-
kind: 'error',
|
|
847
|
-
message: error instanceof Error ? error.message : 'Unable to load opencode-wizard status.'
|
|
848
|
-
};
|
|
849
|
-
}
|
|
850
|
-
};
|
|
851
|
-
const tui = async api => {
|
|
852
|
-
const [status, setStatus] = createSignal({
|
|
853
|
-
kind: 'loading'
|
|
854
|
-
});
|
|
855
|
-
const refreshStatus = options => {
|
|
856
|
-
if (options?.showLoading) {
|
|
857
|
-
setStatus({
|
|
858
|
-
kind: 'loading'
|
|
859
|
-
});
|
|
860
|
-
requestRender(api);
|
|
861
|
-
}
|
|
862
|
-
void loadStatus(api).then(nextStatus => {
|
|
863
|
-
setStatus(nextStatus);
|
|
864
|
-
requestRender(api);
|
|
865
|
-
});
|
|
866
|
-
};
|
|
867
|
-
api.slots.register(createWizardStatusSlot(api, status, refreshStatus));
|
|
868
|
-
refreshStatus();
|
|
869
|
-
setInterval(refreshStatus, STATUS_REFRESH_INTERVAL_MS);
|
|
870
|
-
};
|
|
1
|
+
import { PLUGIN_ID } from './server.js';
|
|
2
|
+
import { tui } from './tui/plugin.js';
|
|
871
3
|
export default {
|
|
872
4
|
id: PLUGIN_ID,
|
|
873
5
|
tui
|