@doist/twist-cli 2.24.1 → 2.26.0
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/CHANGELOG.md +12 -0
- package/dist/commands/channel.d.ts.map +1 -1
- package/dist/commands/channel.js +142 -20
- package/dist/commands/channel.js.map +1 -1
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +325 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/update/action.d.ts +0 -1
- package/dist/commands/update/action.d.ts.map +1 -1
- package/dist/commands/update/action.js +5 -39
- package/dist/commands/update/action.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +1 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +6 -2
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth.d.ts +10 -0
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +45 -0
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +42 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +1 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/permissions.d.ts.map +1 -1
- package/dist/lib/permissions.js +1 -0
- package/dist/lib/permissions.js.map +1 -1
- package/dist/lib/skills/content.d.ts +1 -1
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +15 -1
- package/dist/lib/skills/content.js.map +1 -1
- package/dist/lib/update.d.ts +17 -0
- package/dist/lib/update.d.ts.map +1 -0
- package/dist/lib/update.js +49 -0
- package/dist/lib/update.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [2.26.0](https://github.com/Doist/twist-cli/compare/v2.25.0...v2.26.0) (2026-04-07)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
- add tw doctor command ([#150](https://github.com/Doist/twist-cli/issues/150)) ([0993103](https://github.com/Doist/twist-cli/commit/09931034c8aea01799e14ccbf5500169b48563dc))
|
|
6
|
+
|
|
7
|
+
## [2.25.0](https://github.com/Doist/twist-cli/compare/v2.24.1...v2.25.0) (2026-04-07)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- add channel discovery and archive filters ([#151](https://github.com/Doist/twist-cli/issues/151)) ([3d89761](https://github.com/Doist/twist-cli/commit/3d897616104351b24d8c193025436638794d53ef))
|
|
12
|
+
|
|
1
13
|
## [2.24.1](https://github.com/Doist/twist-cli/compare/v2.24.0...v2.24.1) (2026-04-07)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8MnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwC7D"}
|
package/dist/commands/channel.js
CHANGED
|
@@ -3,57 +3,179 @@ import { CliError } from '../lib/errors.js';
|
|
|
3
3
|
import { includePrivateChannels } from '../lib/global-args.js';
|
|
4
4
|
import { colors, formatJson, formatNdjson } from '../lib/output.js';
|
|
5
5
|
import { resolveWorkspaceRef } from '../lib/refs.js';
|
|
6
|
-
|
|
6
|
+
const CHANNEL_SCOPES = ['joined', 'public', 'discoverable'];
|
|
7
|
+
const CHANNEL_STATES = ['active', 'all', 'archived'];
|
|
8
|
+
function parseChannelScope(scope) {
|
|
9
|
+
const resolved = scope ?? 'joined';
|
|
10
|
+
if (CHANNEL_SCOPES.includes(resolved)) {
|
|
11
|
+
return resolved;
|
|
12
|
+
}
|
|
13
|
+
throw new CliError('INVALID_SCOPE', `Invalid channel scope: ${resolved}. Use one of: ${CHANNEL_SCOPES.join(', ')}.`);
|
|
14
|
+
}
|
|
15
|
+
function parseChannelState(state) {
|
|
16
|
+
const resolved = state ?? 'active';
|
|
17
|
+
if (CHANNEL_STATES.includes(resolved)) {
|
|
18
|
+
return resolved;
|
|
19
|
+
}
|
|
20
|
+
throw new CliError('INVALID_STATE', `Invalid channel state: ${resolved}. Use one of: ${CHANNEL_STATES.join(', ')}.`);
|
|
21
|
+
}
|
|
22
|
+
function summarizeChannel(channel) {
|
|
23
|
+
return {
|
|
24
|
+
id: channel.id,
|
|
25
|
+
name: channel.name,
|
|
26
|
+
workspaceId: channel.workspaceId,
|
|
27
|
+
archived: channel.archived,
|
|
28
|
+
...(channel.joined !== undefined ? { joined: channel.joined } : {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function formatListedChannelsJson(channels, _scope, full = false) {
|
|
32
|
+
if (full) {
|
|
33
|
+
return formatJson(channels, 'channel', true);
|
|
34
|
+
}
|
|
35
|
+
return JSON.stringify(channels.map(summarizeChannel), null, 2);
|
|
36
|
+
}
|
|
37
|
+
function formatListedChannelsNdjson(channels, _scope, full = false) {
|
|
38
|
+
if (full) {
|
|
39
|
+
return formatNdjson(channels, 'channel', true);
|
|
40
|
+
}
|
|
41
|
+
return channels.map((channel) => JSON.stringify(summarizeChannel(channel))).join('\n');
|
|
42
|
+
}
|
|
43
|
+
function matchesChannelState(channel, state) {
|
|
44
|
+
switch (state) {
|
|
45
|
+
case 'active':
|
|
46
|
+
return !channel.archived;
|
|
47
|
+
case 'all':
|
|
48
|
+
return true;
|
|
49
|
+
case 'archived':
|
|
50
|
+
return channel.archived;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function getStateLabel(state) {
|
|
54
|
+
switch (state) {
|
|
55
|
+
case 'active':
|
|
56
|
+
return 'active ';
|
|
57
|
+
case 'all':
|
|
58
|
+
return '';
|
|
59
|
+
case 'archived':
|
|
60
|
+
return 'archived ';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function getEmptyStateMessage(scope, state) {
|
|
64
|
+
const stateLabel = getStateLabel(state);
|
|
65
|
+
switch (scope) {
|
|
66
|
+
case 'joined':
|
|
67
|
+
return `No ${stateLabel}channels found.`;
|
|
68
|
+
case 'public':
|
|
69
|
+
return `No ${stateLabel}public channels found.`;
|
|
70
|
+
case 'discoverable':
|
|
71
|
+
return `No ${stateLabel}discoverable channels found.`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function getWorkspaceId(workspaceRef, options) {
|
|
7
75
|
if (workspaceRef && options.workspace) {
|
|
8
76
|
throw new CliError('CONFLICTING_OPTIONS', 'Cannot specify workspace both as argument and --workspace flag');
|
|
9
77
|
}
|
|
10
|
-
let workspaceId;
|
|
11
78
|
const ref = workspaceRef || options.workspace;
|
|
12
79
|
if (ref) {
|
|
13
80
|
const workspace = await resolveWorkspaceRef(ref);
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
workspaceId = await getCurrentWorkspaceId();
|
|
81
|
+
return workspace.id;
|
|
18
82
|
}
|
|
83
|
+
return getCurrentWorkspaceId();
|
|
84
|
+
}
|
|
85
|
+
function formatChannelLine(channel, scope) {
|
|
86
|
+
const id = colors.timestamp(`id:${channel.id}`);
|
|
87
|
+
const name = colors.channel(channel.name);
|
|
88
|
+
const archived = channel.archived ? colors.timestamp(' (archived)') : '';
|
|
89
|
+
const visibility = channel.public ? '' : colors.timestamp(' [private]');
|
|
90
|
+
const membership = scope === 'public' && channel.joined !== undefined
|
|
91
|
+
? channel.joined
|
|
92
|
+
? colors.timestamp(' [joined]')
|
|
93
|
+
: colors.timestamp(' [not joined]')
|
|
94
|
+
: '';
|
|
95
|
+
return `${id} ${name}${visibility}${membership}${archived}`;
|
|
96
|
+
}
|
|
97
|
+
async function listChannels(workspaceRef, options) {
|
|
98
|
+
const scope = parseChannelScope(options.scope);
|
|
99
|
+
const state = parseChannelState(options.state);
|
|
100
|
+
const workspaceId = await getWorkspaceId(workspaceRef, options);
|
|
19
101
|
const client = await getTwistClient();
|
|
20
|
-
let channels
|
|
21
|
-
if (
|
|
22
|
-
|
|
102
|
+
let channels;
|
|
103
|
+
if (scope === 'joined') {
|
|
104
|
+
switch (state) {
|
|
105
|
+
case 'active':
|
|
106
|
+
channels = await client.channels.getChannels({ workspaceId, archived: false });
|
|
107
|
+
break;
|
|
108
|
+
case 'all':
|
|
109
|
+
channels = await client.channels.getChannels({ workspaceId });
|
|
110
|
+
break;
|
|
111
|
+
case 'archived':
|
|
112
|
+
channels = await client.channels.getChannels({ workspaceId, archived: true });
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (!includePrivateChannels()) {
|
|
116
|
+
channels = channels.filter((channel) => channel.public);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const [joinedChannels, publicChannels] = await Promise.all([
|
|
121
|
+
client.channels.getChannels({ workspaceId }),
|
|
122
|
+
client.workspaces.getPublicChannels(workspaceId),
|
|
123
|
+
]);
|
|
124
|
+
const joinedIds = new Set(joinedChannels.map((channel) => channel.id));
|
|
125
|
+
channels = publicChannels
|
|
126
|
+
.filter((channel) => matchesChannelState(channel, state))
|
|
127
|
+
.filter((channel) => scope === 'public' || !joinedIds.has(channel.id))
|
|
128
|
+
.map((channel) => ({
|
|
129
|
+
...channel,
|
|
130
|
+
joined: joinedIds.has(channel.id),
|
|
131
|
+
}));
|
|
23
132
|
}
|
|
24
133
|
if (options.json) {
|
|
25
|
-
console.log(
|
|
134
|
+
console.log(formatListedChannelsJson(channels, scope, options.full));
|
|
26
135
|
return;
|
|
27
136
|
}
|
|
28
137
|
if (options.ndjson) {
|
|
29
|
-
console.log(
|
|
138
|
+
console.log(formatListedChannelsNdjson(channels, scope, options.full));
|
|
30
139
|
return;
|
|
31
140
|
}
|
|
32
141
|
if (channels.length === 0) {
|
|
33
|
-
console.log(
|
|
142
|
+
console.log(getEmptyStateMessage(scope, state));
|
|
34
143
|
return;
|
|
35
144
|
}
|
|
36
|
-
for (const
|
|
37
|
-
|
|
38
|
-
const name = colors.channel(ch.name);
|
|
39
|
-
const archived = ch.archived ? colors.timestamp(' (archived)') : '';
|
|
40
|
-
const visibility = ch.public ? '' : colors.timestamp(' [private]');
|
|
41
|
-
console.log(`${id} ${name}${visibility}${archived}`);
|
|
145
|
+
for (const channel of channels) {
|
|
146
|
+
console.log(formatChannelLine(channel, scope));
|
|
42
147
|
}
|
|
43
148
|
}
|
|
44
149
|
export function registerChannelCommand(program) {
|
|
45
150
|
program
|
|
46
151
|
.command('channels [workspace-ref]')
|
|
47
|
-
.description('List channels in a workspace')
|
|
152
|
+
.description('List joined channels or discoverable public channels in a workspace')
|
|
48
153
|
.option('--workspace <ref>', 'Workspace ID or name')
|
|
154
|
+
.option('--scope <scope>', 'Channel set to list: joined, public, or discoverable (default: joined)')
|
|
155
|
+
.option('--state <state>', 'Channel state to list: active, all, or archived (default: active)')
|
|
49
156
|
.option('--json', 'Output as JSON')
|
|
50
157
|
.option('--ndjson', 'Output as newline-delimited JSON')
|
|
51
158
|
.option('--full', 'Include all fields in JSON output')
|
|
52
159
|
.addHelpText('after', `
|
|
53
160
|
Examples:
|
|
54
161
|
tw channels
|
|
162
|
+
tw channels --state all
|
|
163
|
+
tw channels --scope discoverable
|
|
164
|
+
tw channels --scope public --state archived
|
|
165
|
+
tw channels --scope public --state all --json
|
|
55
166
|
tw channels --json
|
|
56
|
-
tw channels "My Workspace" --json
|
|
167
|
+
tw channels "My Workspace" --scope discoverable --json
|
|
168
|
+
|
|
169
|
+
Notes:
|
|
170
|
+
Defaults to active channels that you have joined.
|
|
171
|
+
joined Channels you have joined (private channels require --include-private-channels)
|
|
172
|
+
public Public channels visible in the workspace, whether joined or not
|
|
173
|
+
discoverable Public channels visible in the workspace that you have not joined
|
|
174
|
+
active Non-archived channels only
|
|
175
|
+
all Both active and archived channels
|
|
176
|
+
archived Archived channels only
|
|
177
|
+
|
|
178
|
+
Twist does not expose unjoined private channels, so public/discoverable scopes never include them.`)
|
|
57
179
|
.action(listChannels);
|
|
58
180
|
}
|
|
59
181
|
//# sourceMappingURL=channel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/commands/channel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAU,CAAA;AACpE,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAU,CAAA;AAO7D,SAAS,iBAAiB,CAAC,KAAyB;IAChD,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAA;IAClC,IAAK,cAAoC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAwB,CAAA;IACnC,CAAC;IAED,MAAM,IAAI,QAAQ,CACd,eAAe,EACf,0BAA0B,QAAQ,iBAAiB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAClF,CAAA;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB;IAChD,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAA;IAClC,IAAK,cAAoC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAwB,CAAA;IACnC,CAAC;IAED,MAAM,IAAI,QAAQ,CACd,eAAe,EACf,0BAA0B,QAAQ,iBAAiB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAClF,CAAA;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAsB;IAC5C,OAAO;QACH,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAA;AACL,CAAC;AAED,SAAS,wBAAwB,CAC7B,QAAyB,EACzB,MAAoB,EACpB,IAAI,GAAG,KAAK;IAEZ,IAAI,IAAI,EAAE,CAAC;QACP,OAAO,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,0BAA0B,CAC/B,QAAyB,EACzB,MAAoB,EACpB,IAAI,GAAG,KAAK;IAEZ,IAAI,IAAI,EAAE,CAAC;QACP,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC1F,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB,EAAE,KAAmB;IAC9D,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,QAAQ;YACT,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAA;QAC5B,KAAK,KAAK;YACN,OAAO,IAAI,CAAA;QACf,KAAK,UAAU;YACX,OAAO,OAAO,CAAC,QAAQ,CAAA;IAC/B,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAmB;IACtC,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,QAAQ;YACT,OAAO,SAAS,CAAA;QACpB,KAAK,KAAK;YACN,OAAO,EAAE,CAAA;QACb,KAAK,UAAU;YACX,OAAO,WAAW,CAAA;IAC1B,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAmB,EAAE,KAAmB;IAClE,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACvC,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,QAAQ;YACT,OAAO,MAAM,UAAU,iBAAiB,CAAA;QAC5C,KAAK,QAAQ;YACT,OAAO,MAAM,UAAU,wBAAwB,CAAA;QACnD,KAAK,cAAc;YACf,OAAO,MAAM,UAAU,8BAA8B,CAAA;IAC7D,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CACzB,YAAgC,EAChC,OAAwB;IAExB,IAAI,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,QAAQ,CACd,qBAAqB,EACrB,gEAAgE,CACnE,CAAA;IACL,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,IAAI,OAAO,CAAC,SAAS,CAAA;IAE7C,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAA;QAChD,OAAO,SAAS,CAAC,EAAE,CAAA;IACvB,CAAC;IAED,OAAO,qBAAqB,EAAE,CAAA;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsB,EAAE,KAAmB;IAClE,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IACvE,MAAM,UAAU,GACZ,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAC9C,CAAC,CAAC,OAAO,CAAC,MAAM;YACZ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;QACvC,CAAC,CAAC,EAAE,CAAA;IAEZ,OAAO,GAAG,EAAE,KAAK,IAAI,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAA;AAChE,CAAC;AAED,KAAK,UAAU,YAAY,CACvB,YAAgC,EAChC,OAAwB;IAExB,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,IAAI,QAAyB,CAAA;IAE7B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrB,QAAQ,KAAK,EAAE,CAAC;YACZ,KAAK,QAAQ;gBACT,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;gBAC9E,MAAK;YACT,KAAK,KAAK;gBACN,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAA;gBAC7D,MAAK;YACT,KAAK,UAAU;gBACX,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC7E,MAAK;QACb,CAAC;QAED,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YAC5B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC3D,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC;SACnD,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAEtE,QAAQ,GAAG,cAAc;aACpB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;aACxD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aACrE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACf,GAAG,OAAO;YACV,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC,CAAA;IACX,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACpE,OAAM;IACV,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACtE,OAAM;IACV,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;QAC/C,OAAM;IACV,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAClD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACnD,OAAO;SACF,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CACH,iBAAiB,EACjB,wEAAwE,CAC3E;SACA,MAAM,CACH,iBAAiB,EACjB,mEAAmE,CACtE;SACA,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,kCAAkC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACrD,WAAW,CACR,OAAO,EACP;;;;;;;;;;;;;;;;;;;qGAmByF,CAC5F;SACA,MAAM,CAAC,YAAY,CAAC,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
interface DoctorOptions {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
offline?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function doctorAction(options: DoctorOptions): Promise<void>;
|
|
7
|
+
export declare function registerDoctorCommand(program: Command): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBxC,UAAU,aAAa;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAgWD,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBxE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO5D"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
4
|
+
import { createWrappedTwistClient } from '../lib/api.js';
|
|
5
|
+
import { NoTokenError, TOKEN_ENV_VAR, probeApiToken } from '../lib/auth.js';
|
|
6
|
+
import { getConfigPath, validateConfigForDoctor } from '../lib/config.js';
|
|
7
|
+
import { formatJson } from '../lib/output.js';
|
|
8
|
+
import { compareVersions, fetchLatestVersion, getConfiguredUpdateChannel, isNewer, parseVersion, } from '../lib/update.js';
|
|
9
|
+
function summarize(checks) {
|
|
10
|
+
return checks.reduce((summary, check) => {
|
|
11
|
+
if (check.status === 'pass')
|
|
12
|
+
summary.passed += 1;
|
|
13
|
+
if (check.status === 'warn')
|
|
14
|
+
summary.warned += 1;
|
|
15
|
+
if (check.status === 'fail')
|
|
16
|
+
summary.failed += 1;
|
|
17
|
+
if (check.status === 'skip')
|
|
18
|
+
summary.skipped += 1;
|
|
19
|
+
return summary;
|
|
20
|
+
}, { passed: 0, warned: 0, failed: 0, skipped: 0 });
|
|
21
|
+
}
|
|
22
|
+
function buildSummaryLine(summary) {
|
|
23
|
+
const parts = [`${summary.passed} passed`];
|
|
24
|
+
if (summary.warned > 0)
|
|
25
|
+
parts.push(`${summary.warned} warning${summary.warned === 1 ? '' : 's'}`);
|
|
26
|
+
if (summary.failed > 0)
|
|
27
|
+
parts.push(`${summary.failed} failed`);
|
|
28
|
+
if (summary.skipped > 0)
|
|
29
|
+
parts.push(`${summary.skipped} skipped`);
|
|
30
|
+
return parts.join(', ');
|
|
31
|
+
}
|
|
32
|
+
function formatStatus(status) {
|
|
33
|
+
switch (status) {
|
|
34
|
+
case 'pass':
|
|
35
|
+
return chalk.green('PASS');
|
|
36
|
+
case 'warn':
|
|
37
|
+
return chalk.yellow('WARN');
|
|
38
|
+
case 'fail':
|
|
39
|
+
return chalk.red('FAIL');
|
|
40
|
+
case 'skip':
|
|
41
|
+
return chalk.gray('SKIP');
|
|
42
|
+
default:
|
|
43
|
+
return status;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function nextCaretUpperBound(version) {
|
|
47
|
+
const parsed = parseVersion(version);
|
|
48
|
+
if (parsed.major > 0) {
|
|
49
|
+
return `${parsed.major + 1}.0.0`;
|
|
50
|
+
}
|
|
51
|
+
if (parsed.minor > 0) {
|
|
52
|
+
return `0.${parsed.minor + 1}.0`;
|
|
53
|
+
}
|
|
54
|
+
return `0.0.${parsed.patch + 1}`;
|
|
55
|
+
}
|
|
56
|
+
function satisfiesComparator(currentVersion, comparator) {
|
|
57
|
+
const trimmed = comparator.trim();
|
|
58
|
+
if (!trimmed)
|
|
59
|
+
return true;
|
|
60
|
+
if (trimmed.startsWith('>=')) {
|
|
61
|
+
return compareVersions(currentVersion, trimmed.slice(2).trim()) >= 0;
|
|
62
|
+
}
|
|
63
|
+
if (trimmed.startsWith('^')) {
|
|
64
|
+
const baseVersion = trimmed.slice(1).trim();
|
|
65
|
+
return (compareVersions(currentVersion, baseVersion) >= 0 &&
|
|
66
|
+
compareVersions(currentVersion, nextCaretUpperBound(baseVersion)) < 0);
|
|
67
|
+
}
|
|
68
|
+
if (/^v?\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?$/.test(trimmed)) {
|
|
69
|
+
return compareVersions(currentVersion, trimmed) === 0;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function satisfiesVersionRange(currentVersion, range) {
|
|
74
|
+
const clauses = range
|
|
75
|
+
.split('||')
|
|
76
|
+
.map((clause) => clause.trim())
|
|
77
|
+
.filter(Boolean);
|
|
78
|
+
let sawUnsupportedSyntax = false;
|
|
79
|
+
for (const clause of clauses) {
|
|
80
|
+
let clauseMatches = true;
|
|
81
|
+
for (const comparator of clause.split(/\s+/).filter(Boolean)) {
|
|
82
|
+
const result = satisfiesComparator(currentVersion, comparator);
|
|
83
|
+
if (result === null) {
|
|
84
|
+
sawUnsupportedSyntax = true;
|
|
85
|
+
clauseMatches = false;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (!result) {
|
|
89
|
+
clauseMatches = false;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (clauseMatches) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return sawUnsupportedSyntax ? null : false;
|
|
98
|
+
}
|
|
99
|
+
function isNoTokenError(error) {
|
|
100
|
+
return (error instanceof NoTokenError ||
|
|
101
|
+
(error instanceof Error && error.message.includes('No API token found')));
|
|
102
|
+
}
|
|
103
|
+
function describeAuthSource(source) {
|
|
104
|
+
switch (source) {
|
|
105
|
+
case 'env':
|
|
106
|
+
return 'environment variable';
|
|
107
|
+
case 'config-file':
|
|
108
|
+
return 'plaintext config fallback';
|
|
109
|
+
case 'secure-store':
|
|
110
|
+
return 'secure-store';
|
|
111
|
+
default:
|
|
112
|
+
return source;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function checkNodeVersion() {
|
|
116
|
+
const requiredVersion = pkg.engines?.node;
|
|
117
|
+
if (typeof requiredVersion !== 'string' || !requiredVersion.trim()) {
|
|
118
|
+
return {
|
|
119
|
+
name: 'node',
|
|
120
|
+
status: 'warn',
|
|
121
|
+
message: 'Could not verify Node.js version because package.json has no engines.node range',
|
|
122
|
+
details: { currentVersion: process.version },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const currentVersion = process.version;
|
|
126
|
+
const isSupported = satisfiesVersionRange(currentVersion, requiredVersion);
|
|
127
|
+
if (isSupported === true) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
if (isSupported === null) {
|
|
131
|
+
return {
|
|
132
|
+
name: 'node',
|
|
133
|
+
status: 'warn',
|
|
134
|
+
message: `Could not verify Node.js version against unsupported engine range "${requiredVersion}"`,
|
|
135
|
+
details: { currentVersion, requiredVersion },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
name: 'node',
|
|
140
|
+
status: 'fail',
|
|
141
|
+
message: `Node.js ${currentVersion} does not satisfy ${requiredVersion}`,
|
|
142
|
+
details: { currentVersion, requiredVersion },
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async function checkConfigFile() {
|
|
146
|
+
const configPath = getConfigPath();
|
|
147
|
+
try {
|
|
148
|
+
const content = await readFile(configPath, 'utf-8');
|
|
149
|
+
const parsed = JSON.parse(content);
|
|
150
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
151
|
+
return {
|
|
152
|
+
name: 'config',
|
|
153
|
+
status: 'fail',
|
|
154
|
+
message: `Config file must contain a JSON object (${configPath})`,
|
|
155
|
+
details: { path: configPath },
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const issues = validateConfigForDoctor(parsed);
|
|
159
|
+
return {
|
|
160
|
+
name: 'config',
|
|
161
|
+
status: issues.length > 0 ? 'warn' : 'pass',
|
|
162
|
+
message: issues.length > 0
|
|
163
|
+
? `Config file is readable but ${issues.join('; ')} (${configPath})`
|
|
164
|
+
: `Config file is readable (${configPath})`,
|
|
165
|
+
details: { path: configPath, exists: true, issues },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
173
|
+
return {
|
|
174
|
+
name: 'config',
|
|
175
|
+
status: 'fail',
|
|
176
|
+
message: `Could not read config file ${configPath}: ${message}`,
|
|
177
|
+
details: { path: configPath },
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function checkAuthentication(offline) {
|
|
182
|
+
let token;
|
|
183
|
+
let metadata;
|
|
184
|
+
try {
|
|
185
|
+
const probe = await probeApiToken();
|
|
186
|
+
token = probe.token;
|
|
187
|
+
metadata = probe.metadata;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (isNoTokenError(error)) {
|
|
191
|
+
return {
|
|
192
|
+
name: 'auth',
|
|
193
|
+
status: 'warn',
|
|
194
|
+
message: `No Twist credentials found. Set ${TOKEN_ENV_VAR} or run \`tw auth login\``,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
198
|
+
return {
|
|
199
|
+
name: 'auth',
|
|
200
|
+
status: 'fail',
|
|
201
|
+
message: `Could not load saved credentials: ${message}`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const details = {
|
|
205
|
+
source: metadata.source,
|
|
206
|
+
authMode: metadata.authMode,
|
|
207
|
+
};
|
|
208
|
+
if (metadata.authScope)
|
|
209
|
+
details.authScope = metadata.authScope;
|
|
210
|
+
if (offline) {
|
|
211
|
+
return {
|
|
212
|
+
name: 'auth',
|
|
213
|
+
status: metadata.source === 'config-file' ? 'warn' : 'skip',
|
|
214
|
+
message: metadata.source === 'config-file'
|
|
215
|
+
? 'Token found in plaintext config fallback; skipped API validation (--offline)'
|
|
216
|
+
: `Auth validation skipped (--offline); credentials found via ${describeAuthSource(metadata.source)}`,
|
|
217
|
+
details,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const api = createWrappedTwistClient(token);
|
|
222
|
+
const user = await api.users.getSessionUser();
|
|
223
|
+
details.email = user.email;
|
|
224
|
+
details.name = user.name;
|
|
225
|
+
return {
|
|
226
|
+
name: 'auth',
|
|
227
|
+
status: metadata.source === 'config-file' ? 'warn' : 'pass',
|
|
228
|
+
message: metadata.source === 'config-file'
|
|
229
|
+
? `Authenticated as ${user.email}, but token is stored in plaintext config fallback`
|
|
230
|
+
: `Authenticated as ${user.email} via ${describeAuthSource(metadata.source)}`,
|
|
231
|
+
details,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
236
|
+
return {
|
|
237
|
+
name: 'auth',
|
|
238
|
+
status: 'fail',
|
|
239
|
+
message: `Stored credentials failed validation: ${message}`,
|
|
240
|
+
details,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async function checkForUpdates(offline) {
|
|
245
|
+
const currentVersion = pkg.version;
|
|
246
|
+
const channel = await getConfiguredUpdateChannel();
|
|
247
|
+
if (offline) {
|
|
248
|
+
return {
|
|
249
|
+
name: 'update',
|
|
250
|
+
status: 'skip',
|
|
251
|
+
message: `Skipped npm registry check (--offline); current version is v${currentVersion}`,
|
|
252
|
+
details: { currentVersion, channel },
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
const latestVersion = await fetchLatestVersion(channel);
|
|
257
|
+
if (isNewer(currentVersion, latestVersion)) {
|
|
258
|
+
return {
|
|
259
|
+
name: 'update',
|
|
260
|
+
status: 'warn',
|
|
261
|
+
message: `Update available on ${channel}: v${currentVersion} -> v${latestVersion}`,
|
|
262
|
+
details: { currentVersion, latestVersion, channel },
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
if (currentVersion === latestVersion) {
|
|
266
|
+
return {
|
|
267
|
+
name: 'update',
|
|
268
|
+
status: 'pass',
|
|
269
|
+
message: `CLI is up to date on ${channel} (v${currentVersion})`,
|
|
270
|
+
details: { currentVersion, latestVersion, channel },
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
name: 'update',
|
|
275
|
+
status: 'pass',
|
|
276
|
+
message: `CLI version v${currentVersion} is ahead of ${channel} tag v${latestVersion}`,
|
|
277
|
+
details: { currentVersion, latestVersion, channel },
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
282
|
+
return {
|
|
283
|
+
name: 'update',
|
|
284
|
+
status: 'warn',
|
|
285
|
+
message: `Could not check npm registry for updates: ${message}`,
|
|
286
|
+
details: { currentVersion, channel },
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async function runDoctorChecks(options) {
|
|
291
|
+
const checks = await Promise.all([
|
|
292
|
+
checkNodeVersion(),
|
|
293
|
+
checkConfigFile(),
|
|
294
|
+
checkAuthentication(Boolean(options.offline)),
|
|
295
|
+
checkForUpdates(Boolean(options.offline)),
|
|
296
|
+
]);
|
|
297
|
+
return checks.filter((check) => check !== null);
|
|
298
|
+
}
|
|
299
|
+
export async function doctorAction(options) {
|
|
300
|
+
const checks = await runDoctorChecks(options);
|
|
301
|
+
const summary = summarize(checks);
|
|
302
|
+
const ok = summary.failed === 0;
|
|
303
|
+
if (options.json) {
|
|
304
|
+
console.log(formatJson({ ok, summary, checks }));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
for (const check of checks) {
|
|
308
|
+
console.log(`${formatStatus(check.status)} ${check.message}`);
|
|
309
|
+
}
|
|
310
|
+
const label = ok ? chalk.green('Doctor summary:') : chalk.red('Doctor summary:');
|
|
311
|
+
console.log(`${label} ${buildSummaryLine(summary)}`);
|
|
312
|
+
}
|
|
313
|
+
if (!ok) {
|
|
314
|
+
process.exitCode = 1;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
export function registerDoctorCommand(program) {
|
|
318
|
+
program
|
|
319
|
+
.command('doctor')
|
|
320
|
+
.description('Diagnose common CLI setup and environment issues')
|
|
321
|
+
.option('--json', 'Output diagnostic results as JSON')
|
|
322
|
+
.option('--offline', 'Skip network checks against Twist and npm')
|
|
323
|
+
.action(doctorAction);
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/update/action.ts"],"names":[],"mappings":"AAaA,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAejG;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGxE"}
|