@wix/web50-cli 0.1.0 → 0.1.2

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.
Files changed (134) hide show
  1. package/bin/web5.js +1 -2
  2. package/dist/cjs/auth/deviceFlow.js +175 -16
  3. package/dist/cjs/auth/deviceFlow.js.map +1 -1
  4. package/dist/cjs/auth/index.js +93 -10
  5. package/dist/cjs/auth/index.js.map +1 -1
  6. package/dist/cjs/auth/secretStore.js.map +1 -1
  7. package/dist/cjs/cli.js +29 -1
  8. package/dist/cjs/cli.js.map +1 -1
  9. package/dist/cjs/commands/bundle.js +103 -0
  10. package/dist/cjs/commands/bundle.js.map +1 -0
  11. package/dist/cjs/commands/conversation.js +50 -0
  12. package/dist/cjs/commands/conversation.js.map +1 -0
  13. package/dist/cjs/commands/conversationWizard.js +528 -0
  14. package/dist/cjs/commands/conversationWizard.js.map +1 -0
  15. package/dist/cjs/commands/deploy.js +237 -0
  16. package/dist/cjs/commands/deploy.js.map +1 -0
  17. package/dist/cjs/commands/ecom.js +239 -0
  18. package/dist/cjs/commands/ecom.js.map +1 -0
  19. package/dist/cjs/commands/embed.js +118 -0
  20. package/dist/cjs/commands/embed.js.map +1 -0
  21. package/dist/cjs/commands/init.js +65 -29
  22. package/dist/cjs/commands/init.js.map +1 -1
  23. package/dist/cjs/commands/instructions.js +456 -0
  24. package/dist/cjs/commands/instructions.js.map +1 -0
  25. package/dist/cjs/commands/login.js +63 -4
  26. package/dist/cjs/commands/login.js.map +1 -1
  27. package/dist/cjs/commands/logout.js +16 -0
  28. package/dist/cjs/commands/logout.js.map +1 -0
  29. package/dist/cjs/commands/serve.js +122 -0
  30. package/dist/cjs/commands/serve.js.map +1 -0
  31. package/dist/cjs/commands/storybook.js +102 -0
  32. package/dist/cjs/commands/storybook.js.map +1 -0
  33. package/dist/cjs/commands/validate.js +617 -17
  34. package/dist/cjs/commands/validate.js.map +1 -1
  35. package/dist/cjs/commands/whoami.js +48 -0
  36. package/dist/cjs/commands/whoami.js.map +1 -0
  37. package/dist/cjs/templates/aiInstructionsSchema.js +5 -1
  38. package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -1
  39. package/dist/cjs/templates/cmsMappingSchema.js +132 -0
  40. package/dist/cjs/templates/cmsMappingSchema.js.map +1 -0
  41. package/dist/cjs/utils/print.js +12 -0
  42. package/dist/cjs/utils/print.js.map +1 -1
  43. package/dist/cjs/utils/project.js +24 -0
  44. package/dist/cjs/utils/project.js.map +1 -1
  45. package/dist/cjs/utils/wixApi.js +57 -0
  46. package/dist/cjs/utils/wixApi.js.map +1 -0
  47. package/dist/esm/auth/deviceFlow.js +182 -17
  48. package/dist/esm/auth/deviceFlow.js.map +1 -1
  49. package/dist/esm/auth/index.js +98 -11
  50. package/dist/esm/auth/index.js.map +1 -1
  51. package/dist/esm/auth/secretStore.js.map +1 -1
  52. package/dist/esm/cli.js +29 -1
  53. package/dist/esm/cli.js.map +1 -1
  54. package/dist/esm/commands/bundle.js +100 -0
  55. package/dist/esm/commands/bundle.js.map +1 -0
  56. package/dist/esm/commands/conversation.js +44 -0
  57. package/dist/esm/commands/conversation.js.map +1 -0
  58. package/dist/esm/commands/conversationWizard.js +529 -0
  59. package/dist/esm/commands/conversationWizard.js.map +1 -0
  60. package/dist/esm/commands/deploy.js +239 -0
  61. package/dist/esm/commands/deploy.js.map +1 -0
  62. package/dist/esm/commands/ecom.js +234 -0
  63. package/dist/esm/commands/ecom.js.map +1 -0
  64. package/dist/esm/commands/embed.js +112 -0
  65. package/dist/esm/commands/embed.js.map +1 -0
  66. package/dist/esm/commands/init.js +66 -30
  67. package/dist/esm/commands/init.js.map +1 -1
  68. package/dist/esm/commands/instructions.js +459 -0
  69. package/dist/esm/commands/instructions.js.map +1 -0
  70. package/dist/esm/commands/login.js +66 -6
  71. package/dist/esm/commands/login.js.map +1 -1
  72. package/dist/esm/commands/logout.js +12 -0
  73. package/dist/esm/commands/logout.js.map +1 -0
  74. package/dist/esm/commands/serve.js +117 -0
  75. package/dist/esm/commands/serve.js.map +1 -0
  76. package/dist/esm/commands/storybook.js +97 -0
  77. package/dist/esm/commands/storybook.js.map +1 -0
  78. package/dist/esm/commands/validate.js +623 -19
  79. package/dist/esm/commands/validate.js.map +1 -1
  80. package/dist/esm/commands/whoami.js +44 -0
  81. package/dist/esm/commands/whoami.js.map +1 -0
  82. package/dist/esm/templates/aiInstructionsSchema.js +5 -1
  83. package/dist/esm/templates/aiInstructionsSchema.js.map +1 -1
  84. package/dist/esm/templates/cmsMappingSchema.js +128 -0
  85. package/dist/esm/templates/cmsMappingSchema.js.map +1 -0
  86. package/dist/esm/utils/print.js +10 -0
  87. package/dist/esm/utils/print.js.map +1 -1
  88. package/dist/esm/utils/project.js +23 -0
  89. package/dist/esm/utils/project.js.map +1 -1
  90. package/dist/esm/utils/wixApi.js +53 -0
  91. package/dist/esm/utils/wixApi.js.map +1 -0
  92. package/dist/types/auth/deviceFlow.d.ts +3 -1
  93. package/dist/types/auth/deviceFlow.d.ts.map +1 -1
  94. package/dist/types/auth/index.d.ts +6 -1
  95. package/dist/types/auth/index.d.ts.map +1 -1
  96. package/dist/types/auth/secretStore.d.ts +2 -0
  97. package/dist/types/auth/secretStore.d.ts.map +1 -1
  98. package/dist/types/commands/bundle.d.ts +10 -0
  99. package/dist/types/commands/bundle.d.ts.map +1 -0
  100. package/dist/types/commands/conversation.d.ts +3 -0
  101. package/dist/types/commands/conversation.d.ts.map +1 -0
  102. package/dist/types/commands/conversationWizard.d.ts +3 -0
  103. package/dist/types/commands/conversationWizard.d.ts.map +1 -0
  104. package/dist/types/commands/deploy.d.ts +3 -0
  105. package/dist/types/commands/deploy.d.ts.map +1 -0
  106. package/dist/types/commands/ecom.d.ts +3 -0
  107. package/dist/types/commands/ecom.d.ts.map +1 -0
  108. package/dist/types/commands/embed.d.ts +3 -0
  109. package/dist/types/commands/embed.d.ts.map +1 -0
  110. package/dist/types/commands/init.d.ts.map +1 -1
  111. package/dist/types/commands/instructions.d.ts +3 -0
  112. package/dist/types/commands/instructions.d.ts.map +1 -0
  113. package/dist/types/commands/login.d.ts.map +1 -1
  114. package/dist/types/commands/logout.d.ts +3 -0
  115. package/dist/types/commands/logout.d.ts.map +1 -0
  116. package/dist/types/commands/serve.d.ts +3 -0
  117. package/dist/types/commands/serve.d.ts.map +1 -0
  118. package/dist/types/commands/storybook.d.ts +3 -0
  119. package/dist/types/commands/storybook.d.ts.map +1 -0
  120. package/dist/types/commands/validate.d.ts +7 -0
  121. package/dist/types/commands/validate.d.ts.map +1 -1
  122. package/dist/types/commands/whoami.d.ts +3 -0
  123. package/dist/types/commands/whoami.d.ts.map +1 -0
  124. package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -1
  125. package/dist/types/templates/cmsMappingSchema.d.ts +2 -0
  126. package/dist/types/templates/cmsMappingSchema.d.ts.map +1 -0
  127. package/dist/types/utils/print.d.ts +3 -0
  128. package/dist/types/utils/print.d.ts.map +1 -1
  129. package/dist/types/utils/project.d.ts +12 -0
  130. package/dist/types/utils/project.d.ts.map +1 -1
  131. package/dist/types/utils/wixApi.d.ts +9 -0
  132. package/dist/types/utils/wixApi.d.ts.map +1 -0
  133. package/package.json +5 -5
  134. package/defaults/package.json +0 -42
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ exports.__esModule = true;
5
+ exports.instructionsCommand = void 0;
6
+ var _commander = require("commander");
7
+ var fs = _interopRequireWildcard(require("fs"));
8
+ var path = _interopRequireWildcard(require("path"));
9
+ var _inquirer = _interopRequireDefault(require("inquirer"));
10
+ var _chalk = _interopRequireDefault(require("chalk"));
11
+ var _ora = _interopRequireDefault(require("ora"));
12
+ var _wixApi = require("../utils/wixApi");
13
+ var _print = require("../utils/print");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ const BASE = '/web5/instructions/cli';
16
+
17
+ // ── Types ─────────────────────────────────────────────────────────────────────
18
+
19
+ // ── Display helpers ───────────────────────────────────────────────────────────
20
+
21
+ const BOX_W = 66;
22
+ function printHeader(title) {
23
+ const pad = ' '.repeat(Math.max(0, BOX_W - title.length - 1));
24
+ console.log(_chalk.default.cyan('╔' + '═'.repeat(BOX_W) + '╗'));
25
+ console.log(`${_chalk.default.cyan('║')} ${_chalk.default.bold(title)}${pad}${_chalk.default.cyan('║')}`);
26
+ console.log(_chalk.default.cyan('╚' + '═'.repeat(BOX_W) + '╝'));
27
+ console.log();
28
+ }
29
+ function printDivider(hints) {
30
+ console.log(_chalk.default.dim('─'.repeat(BOX_W + 2)));
31
+ console.log(_chalk.default.dim(` ${hints}`));
32
+ console.log();
33
+ }
34
+ function truncate(text, max = 48) {
35
+ const clean = (text ?? '').replace(/\n/g, ' ').trim();
36
+ return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
37
+ }
38
+ function printInstructionContent(inst) {
39
+ // Intents
40
+ console.log(_chalk.default.bold(' Intents'));
41
+ console.log(_chalk.default.dim(' ' + '─'.repeat(40)));
42
+ const intents = inst.intents ?? {};
43
+ if (Object.keys(intents).length === 0) {
44
+ console.log(_chalk.default.dim(' (none)'));
45
+ } else {
46
+ for (const [k, v] of Object.entries(intents)) {
47
+ console.log(` ${_chalk.default.cyan(k)}: ${v}`);
48
+ }
49
+ }
50
+ console.log();
51
+
52
+ // Semantics
53
+ console.log(_chalk.default.bold(' Semantics'));
54
+ console.log(_chalk.default.dim(' ' + '─'.repeat(40)));
55
+ const semantics = inst.semantics ?? {};
56
+ if (Object.keys(semantics).length === 0) {
57
+ console.log(_chalk.default.dim(' (none)'));
58
+ } else {
59
+ for (const [k, v] of Object.entries(semantics)) {
60
+ console.log(` ${_chalk.default.cyan(k)}: ${v}`);
61
+ }
62
+ }
63
+ console.log();
64
+
65
+ // Actions
66
+ console.log(_chalk.default.bold(' Actions'));
67
+ console.log(_chalk.default.dim(' ' + '─'.repeat(40)));
68
+ const actions = inst.actions ?? [];
69
+ if (actions.length === 0) {
70
+ console.log(_chalk.default.dim(' (none)'));
71
+ } else {
72
+ for (const action of actions) {
73
+ const desc = action.description ? _chalk.default.dim(` — ${action.description}`) : '';
74
+ console.log(` ${_chalk.default.cyan('• ' + action.name)}${desc}`);
75
+ for (const p of action.params ?? []) {
76
+ const preview = p.values.length > 0 ? _chalk.default.dim(` [${p.values.slice(0, 3).join(', ')}${p.values.length > 3 ? ', …' : ''}]`) : '';
77
+ const optTag = p.optional ? _chalk.default.dim(' (optional)') : '';
78
+ console.log(` ${p.param}${preview}${optTag}`);
79
+ }
80
+ }
81
+ }
82
+ console.log();
83
+
84
+ // Free-text instruction
85
+ console.log(_chalk.default.bold(' Instruction'));
86
+ console.log(_chalk.default.dim(' ' + '─'.repeat(40)));
87
+ console.log(` ${inst.content ?? ''}`);
88
+ console.log();
89
+ }
90
+
91
+ // ── Diff helper ───────────────────────────────────────────────────────────────
92
+
93
+ function diffLines(aStr, bStr) {
94
+ const aLines = aStr.split('\n');
95
+ const bLines = bStr.split('\n');
96
+ const out = [];
97
+ const maxLen = Math.max(aLines.length, bLines.length);
98
+ for (let i = 0; i < maxLen; i++) {
99
+ const aLine = i < aLines.length ? aLines[i] : null;
100
+ const bLine = i < bLines.length ? bLines[i] : null;
101
+ if (aLine === bLine) {
102
+ out.push(` ${aLine ?? ''}`);
103
+ } else {
104
+ if (aLine !== null) {
105
+ out.push(_chalk.default.red(`- ${aLine}`));
106
+ }
107
+ if (bLine !== null) {
108
+ out.push(_chalk.default.green(`+ ${bLine}`));
109
+ }
110
+ }
111
+ }
112
+ return out.join('\n');
113
+ }
114
+ function formatKV(obj) {
115
+ return Object.entries(obj ?? {}).map(([k, v]) => `${k}: ${v}`).join('\n');
116
+ }
117
+ function formatActions(actions) {
118
+ return (actions ?? []).map(a => {
119
+ const params = (a.params ?? []).map(p => ` ${p.param}: [${p.values.join(', ')}]`).join('\n');
120
+ const header = a.description ? `${a.name} — ${a.description}` : a.name;
121
+ return params ? `${header}\n${params}` : header;
122
+ }).join('\n\n');
123
+ }
124
+ function diffInstructions(a, b, v1, v2) {
125
+ const out = [_chalk.default.dim(`--- v${v1}`), _chalk.default.dim(`+++ v${v2}`), ''];
126
+ const sections = [['Intents', formatKV(a.intents), formatKV(b.intents)], ['Semantics', formatKV(a.semantics), formatKV(b.semantics)], ['Actions', formatActions(a.actions), formatActions(b.actions)], ['Instruction', a.content ?? '', b.content ?? '']];
127
+ for (const [label, aStr, bStr] of sections) {
128
+ out.push(_chalk.default.bold(`── ${label} ──`));
129
+ if (aStr === bStr) {
130
+ out.push(_chalk.default.dim(' (no changes)'));
131
+ } else {
132
+ out.push(diffLines(aStr, bStr));
133
+ }
134
+ out.push('');
135
+ }
136
+ return out.join('\n');
137
+ }
138
+
139
+ // ── Wizard ────────────────────────────────────────────────────────────────────
140
+
141
+ async function showInstructionDetail(version, instructions) {
142
+ const inst = instructions.find(i => i.version === version);
143
+ if (!inst) {
144
+ return 'back';
145
+ }
146
+ console.clear();
147
+ const activeLabel = inst.active ? _chalk.default.green(' (active)') : '';
148
+ printHeader(`📋 AI Instructions ❯ Version ${version}${activeLabel}`);
149
+ printInstructionContent(inst);
150
+ const choices = [{
151
+ name: ` ${_chalk.default.dim('← Back')}`,
152
+ value: 'back'
153
+ }, ...(!inst.active ? [{
154
+ name: ` ${_chalk.default.cyan('⚡ Activate this version')}`,
155
+ value: 'activate'
156
+ }] : []), {
157
+ name: ` ${_chalk.default.red('✕ Exit')}`,
158
+ value: 'exit'
159
+ }];
160
+ const {
161
+ action
162
+ } = await _inquirer.default.prompt([{
163
+ type: 'list',
164
+ name: 'action',
165
+ message: _chalk.default.bold('What would you like to do?'),
166
+ choices
167
+ }]);
168
+ if (action === 'activate') {
169
+ const sp = (0, _ora.default)(`Activating version ${version}…`).start();
170
+ try {
171
+ await (0, _wixApi.wixRequest)({
172
+ path: `${BASE}/activate/${version}`,
173
+ method: 'POST'
174
+ });
175
+ sp.stop();
176
+ console.log(_chalk.default.green(`✔ Version ${version} is now active\n`));
177
+ } catch (err_) {
178
+ sp.fail('Activation failed');
179
+ console.error(_chalk.default.red(err_.message));
180
+ }
181
+ return 'refetch';
182
+ }
183
+ return action;
184
+ }
185
+ async function runInstructionsWizard() {
186
+ process.on('SIGINT', () => {
187
+ console.log(_chalk.default.dim('\nBye.\n'));
188
+ process.exit(0);
189
+ });
190
+ const sp = (0, _ora.default)('Fetching instructions…').start();
191
+ let instructions = [];
192
+ try {
193
+ const data = await (0, _wixApi.wixRequest)({
194
+ path: `${BASE}/query`,
195
+ method: 'POST',
196
+ body: {
197
+ query: {}
198
+ }
199
+ });
200
+ sp.stop();
201
+ instructions = data.instructions ?? [];
202
+ } catch (err_) {
203
+ sp.fail('Failed to fetch instructions');
204
+ console.error(_chalk.default.red(err_.message));
205
+ process.exit(1);
206
+ }
207
+ if (instructions.length === 0) {
208
+ console.log(_chalk.default.yellow('No instructions found.'));
209
+ process.exit(0);
210
+ }
211
+ const running = true;
212
+ while (running) {
213
+ console.clear();
214
+ printHeader(`📋 AI Instructions ${_chalk.default.dim(`${instructions.length} versions`)}`);
215
+ printDivider('[↑↓] Navigate [Enter] Select [Ctrl+C] Quit');
216
+ const choices = [...instructions.map(inst => {
217
+ const activeTag = inst.active ? _chalk.default.green(' ✓ active') : _chalk.default.dim(' ');
218
+ const label = ` v${inst.version}${activeTag} ${_chalk.default.white(truncate(inst.content))}`;
219
+ return {
220
+ name: label,
221
+ value: inst.version
222
+ };
223
+ }), new _inquirer.default.Separator('─'.repeat(BOX_W)), {
224
+ name: ` ${_chalk.default.red('✕ Exit')}`,
225
+ value: '__exit__'
226
+ }];
227
+ const {
228
+ version
229
+ } = await _inquirer.default.prompt([{
230
+ type: 'list',
231
+ name: 'version',
232
+ message: _chalk.default.bold('Select a version'),
233
+ choices,
234
+ pageSize: 12
235
+ }]);
236
+ if (version === '__exit__') {
237
+ break;
238
+ }
239
+ const result = await showInstructionDetail(version, instructions);
240
+ if (result === 'exit') {
241
+ break;
242
+ }
243
+ if (result === 'refetch') {
244
+ try {
245
+ const data = await (0, _wixApi.wixRequest)({
246
+ path: `${BASE}/query`,
247
+ method: 'POST',
248
+ body: {
249
+ query: {}
250
+ }
251
+ });
252
+ instructions = data.instructions ?? instructions;
253
+ } catch {
254
+ // keep existing data if re-fetch fails
255
+ }
256
+ }
257
+ }
258
+ console.clear();
259
+ console.log(_chalk.default.dim('Bye.\n'));
260
+ process.exit(0);
261
+ }
262
+
263
+ // ── Subcommands ───────────────────────────────────────────────────────────────
264
+
265
+ const getActiveCmd = new _commander.Command('get-active').description('Get the currently active instruction').action(async () => {
266
+ const sp = (0, _print.spinner)('Fetching active instruction...');
267
+ try {
268
+ const data = await (0, _wixApi.wixRequest)({
269
+ path: `${BASE}/active`
270
+ });
271
+ sp.stop();
272
+ const inst = data.instruction;
273
+ console.log(_chalk.default.bold(`Version ${inst.version}`));
274
+ console.log();
275
+ printInstructionContent(inst);
276
+ } catch (err_) {
277
+ sp.stop();
278
+ (0, _print.error)(err_.message);
279
+ process.exit(1);
280
+ }
281
+ });
282
+ const listCmd = new _commander.Command('list').description('List all instructions').option('--active', 'Show only the currently active instruction').option('--format <format>', 'Output format: table (default) or json', 'table').action(async opts => {
283
+ const sp = (0, _print.spinner)('Fetching instructions...');
284
+ try {
285
+ const data = await (0, _wixApi.wixRequest)({
286
+ path: `${BASE}/query`,
287
+ method: 'POST',
288
+ body: {
289
+ query: {}
290
+ }
291
+ });
292
+ sp.stop();
293
+ let items = data.instructions ?? [];
294
+ if (opts.active) {
295
+ items = items.filter(i => i.active);
296
+ }
297
+ if (opts.format === 'json') {
298
+ const view = items.map(({
299
+ version,
300
+ active,
301
+ intents,
302
+ semantics,
303
+ actions,
304
+ content
305
+ }) => ({
306
+ version,
307
+ active: active ?? false,
308
+ intents,
309
+ semantics,
310
+ actions,
311
+ content
312
+ }));
313
+ console.log(JSON.stringify(view, null, 2));
314
+ } else {
315
+ const header = `${'Version'.padEnd(10)}${'Active'.padEnd(10)}Instruction`;
316
+ console.log(_chalk.default.bold(header));
317
+ console.log('─'.repeat(60));
318
+ for (const i of items) {
319
+ const ver = `v${i.version}`.padEnd(10);
320
+ const active = (i.active ? '✓' : '').padEnd(10);
321
+ const preview = truncate(i.content, 40);
322
+ console.log(`${_chalk.default.cyan(ver)}${_chalk.default.green(active)}${preview}`);
323
+ }
324
+ }
325
+ } catch (err_) {
326
+ sp.stop();
327
+ (0, _print.error)(err_.message);
328
+ process.exit(1);
329
+ }
330
+ });
331
+ const activateCmd = new _commander.Command('set-active').description('Set an instruction as active by version number').argument('<version>', 'Version number to activate').action(async version => {
332
+ const sp = (0, _print.spinner)(`Activating instruction version ${version}...`);
333
+ try {
334
+ await (0, _wixApi.wixRequest)({
335
+ path: `${BASE}/activate/${version}`,
336
+ method: 'POST'
337
+ });
338
+ sp.stop();
339
+ (0, _print.success)(`Activated version ${version}`);
340
+ } catch (err_) {
341
+ sp.stop();
342
+ (0, _print.error)(err_.message);
343
+ process.exit(1);
344
+ }
345
+ });
346
+ const getCmd = new _commander.Command('get').description('Get an instruction by version number').argument('<version>', 'Version number').action(async version => {
347
+ const sp = (0, _print.spinner)(`Fetching instruction version ${version}...`);
348
+ try {
349
+ const data = await (0, _wixApi.wixRequest)({
350
+ path: `${BASE}/by-version/${version}`
351
+ });
352
+ sp.stop();
353
+ const inst = data.instruction;
354
+ console.log(_chalk.default.bold(`Version ${inst.version}`));
355
+ console.log();
356
+ printInstructionContent(inst);
357
+ } catch (err_) {
358
+ sp.stop();
359
+ (0, _print.error)(err_.message);
360
+ process.exit(1);
361
+ }
362
+ });
363
+ const diffCmd = new _commander.Command('diff').description('Show diff between two instruction versions across all sections').argument('<v1>', 'First version number').argument('<v2>', 'Second version number').action(async (v1, v2) => {
364
+ const sp = (0, _print.spinner)(`Fetching versions ${v1} and ${v2}...`);
365
+ try {
366
+ const [d1, d2] = await Promise.all([(0, _wixApi.wixRequest)({
367
+ path: `${BASE}/by-version/${v1}`
368
+ }), (0, _wixApi.wixRequest)({
369
+ path: `${BASE}/by-version/${v2}`
370
+ })]);
371
+ sp.stop();
372
+ console.log(diffInstructions(d1.instruction, d2.instruction, v1, v2));
373
+ } catch (err_) {
374
+ sp.stop();
375
+ (0, _print.error)(err_.message);
376
+ process.exit(1);
377
+ }
378
+ });
379
+ const exportCmd = new _commander.Command('export').description('Export an instruction version to a local file').requiredOption('--version <v>', 'Version number to export').requiredOption('--output <file>', 'Output file path (.json)').action(async opts => {
380
+ const sp = (0, _print.spinner)(`Fetching instruction version ${opts.version}...`);
381
+ try {
382
+ const data = await (0, _wixApi.wixRequest)({
383
+ path: `${BASE}/by-version/${opts.version}`
384
+ });
385
+ sp.stop();
386
+ const inst = data.instruction;
387
+ const outContent = JSON.stringify({
388
+ intents: inst.intents,
389
+ semantics: inst.semantics,
390
+ actions: inst.actions,
391
+ content: inst.content
392
+ }, null, 2);
393
+ const outPath = path.resolve(opts.output);
394
+ fs.writeFileSync(outPath, outContent, 'utf8');
395
+ (0, _print.success)(`Exported version ${opts.version} to ${outPath}`);
396
+ } catch (err_) {
397
+ sp.stop();
398
+ (0, _print.error)(err_.message);
399
+ process.exit(1);
400
+ }
401
+ });
402
+ const rollbackCmd = new _commander.Command('rollback').description('Re-activate the version that was active before the current one').action(async () => {
403
+ const sp = (0, _print.spinner)('Fetching instructions...');
404
+ try {
405
+ const data = await (0, _wixApi.wixRequest)({
406
+ path: `${BASE}/query`,
407
+ method: 'POST',
408
+ body: {
409
+ query: {}
410
+ }
411
+ });
412
+ sp.stop();
413
+ const instructions = data.instructions ?? [];
414
+ const active = instructions.find(i => i.active);
415
+ if (!active) {
416
+ (0, _print.error)('No active instruction found — nothing to roll back from.');
417
+ process.exit(1);
418
+ }
419
+ const previous = instructions.filter(i => !i.active && Number(i.version) < Number(active.version)).sort((a, b) => Number(b.version) - Number(a.version))[0];
420
+ if (!previous) {
421
+ (0, _print.error)(`No previous version found before v${active.version}.`);
422
+ process.exit(1);
423
+ }
424
+ const sp2 = (0, _print.spinner)(`Rolling back to version ${previous.version}...`);
425
+ await (0, _wixApi.wixRequest)({
426
+ path: `${BASE}/activate/${previous.version}`,
427
+ method: 'POST'
428
+ });
429
+ sp2.stop();
430
+ (0, _print.success)(`Rolled back to v${previous.version} (was v${active.version})`);
431
+ } catch (err_) {
432
+ sp.stop();
433
+ (0, _print.error)(err_.message);
434
+ process.exit(1);
435
+ }
436
+ });
437
+
438
+ // ── Command export ────────────────────────────────────────────────────────────
439
+
440
+ const wizardCmd = new _commander.Command('wizard').description('Open the interactive TUI to browse and activate instruction versions').action(async () => {
441
+ try {
442
+ await runInstructionsWizard();
443
+ } catch (err_) {
444
+ const msg = err_.message ?? '';
445
+ if (msg.includes('force closed') || msg.includes('User force')) {
446
+ console.log(_chalk.default.dim('\nBye.'));
447
+ process.exit(0);
448
+ }
449
+ console.error(_chalk.default.red('Unexpected error: ' + msg));
450
+ process.exit(1);
451
+ }
452
+ });
453
+ const instructionsCommand = exports.instructionsCommand = new _commander.Command('instructions').description('Manage AI instructions').action(function () {
454
+ this.outputHelp();
455
+ }).addCommand(wizardCmd).addCommand(getActiveCmd).addCommand(listCmd).addCommand(activateCmd).addCommand(getCmd).addCommand(diffCmd).addCommand(exportCmd).addCommand(rollbackCmd);
456
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_commander","require","fs","_interopRequireWildcard","path","_inquirer","_interopRequireDefault","_chalk","_ora","_wixApi","_print","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","BASE","BOX_W","printHeader","title","pad","repeat","Math","max","length","console","log","chalk","cyan","bold","printDivider","hints","dim","truncate","text","clean","replace","trim","slice","printInstructionContent","inst","intents","keys","k","v","entries","semantics","actions","action","desc","description","name","p","params","preview","values","join","optTag","optional","param","content","diffLines","aStr","bStr","aLines","split","bLines","out","maxLen","aLine","bLine","push","red","green","formatKV","obj","map","formatActions","a","header","diffInstructions","b","v1","v2","sections","label","showInstructionDetail","version","instructions","find","clear","activeLabel","active","choices","value","inquirer","prompt","type","message","sp","ora","start","wixRequest","method","stop","err_","fail","error","runInstructionsWizard","process","on","exit","data","body","query","yellow","running","activeTag","white","Separator","pageSize","result","getActiveCmd","Command","spinner","instruction","listCmd","option","opts","items","filter","format","view","JSON","stringify","padEnd","ver","activateCmd","argument","success","getCmd","diffCmd","d1","d2","Promise","all","exportCmd","requiredOption","outContent","outPath","resolve","output","writeFileSync","rollbackCmd","previous","Number","sort","sp2","wizardCmd","msg","includes","instructionsCommand","exports","outputHelp","addCommand"],"sources":["../../../src/commands/instructions.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { wixRequest } from '../utils/wixApi';\nimport { success, error, spinner } from '../utils/print';\n\nconst BASE = '/web5/instructions/cli';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ninterface ActionParam {\n param: string;\n values: string[];\n optional?: boolean;\n description?: string;\n}\n\ninterface ActionItem {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface Instruction {\n id: string;\n revision: string;\n version: string;\n active?: boolean;\n intents: Record<string, string>;\n semantics: Record<string, string>;\n actions: ActionItem[];\n content: string;\n created_date?: string;\n updated_date?: string;\n}\n\n// ── Display helpers ───────────────────────────────────────────────────────────\n\nconst BOX_W = 66;\n\nfunction printHeader(title: string): void {\n const pad = ' '.repeat(Math.max(0, BOX_W - title.length - 1));\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold(title)}${pad}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n}\n\nfunction printDivider(hints: string): void {\n console.log(chalk.dim('─'.repeat(BOX_W + 2)));\n console.log(chalk.dim(` ${hints}`));\n console.log();\n}\n\nfunction truncate(text: string, max = 48): string {\n const clean = (text ?? '').replace(/\\n/g, ' ').trim();\n return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;\n}\n\nfunction printInstructionContent(inst: Instruction): void {\n // Intents\n console.log(chalk.bold(' Intents'));\n console.log(chalk.dim(' ' + '─'.repeat(40)));\n const intents = inst.intents ?? {};\n if (Object.keys(intents).length === 0) {\n console.log(chalk.dim(' (none)'));\n } else {\n for (const [k, v] of Object.entries(intents)) {\n console.log(` ${chalk.cyan(k)}: ${v}`);\n }\n }\n console.log();\n\n // Semantics\n console.log(chalk.bold(' Semantics'));\n console.log(chalk.dim(' ' + '─'.repeat(40)));\n const semantics = inst.semantics ?? {};\n if (Object.keys(semantics).length === 0) {\n console.log(chalk.dim(' (none)'));\n } else {\n for (const [k, v] of Object.entries(semantics)) {\n console.log(` ${chalk.cyan(k)}: ${v}`);\n }\n }\n console.log();\n\n // Actions\n console.log(chalk.bold(' Actions'));\n console.log(chalk.dim(' ' + '─'.repeat(40)));\n const actions = inst.actions ?? [];\n if (actions.length === 0) {\n console.log(chalk.dim(' (none)'));\n } else {\n for (const action of actions) {\n const desc = action.description\n ? chalk.dim(` — ${action.description}`)\n : '';\n console.log(` ${chalk.cyan('• ' + action.name)}${desc}`);\n for (const p of action.params ?? []) {\n const preview =\n p.values.length > 0\n ? chalk.dim(\n ` [${p.values.slice(0, 3).join(', ')}${\n p.values.length > 3 ? ', …' : ''\n }]`,\n )\n : '';\n const optTag = p.optional ? chalk.dim(' (optional)') : '';\n console.log(` ${p.param}${preview}${optTag}`);\n }\n }\n }\n console.log();\n\n // Free-text instruction\n console.log(chalk.bold(' Instruction'));\n console.log(chalk.dim(' ' + '─'.repeat(40)));\n console.log(` ${inst.content ?? ''}`);\n console.log();\n}\n\n// ── Diff helper ───────────────────────────────────────────────────────────────\n\nfunction diffLines(aStr: string, bStr: string): string {\n const aLines = aStr.split('\\n');\n const bLines = bStr.split('\\n');\n const out: string[] = [];\n const maxLen = Math.max(aLines.length, bLines.length);\n for (let i = 0; i < maxLen; i++) {\n const aLine = i < aLines.length ? aLines[i] : null;\n const bLine = i < bLines.length ? bLines[i] : null;\n if (aLine === bLine) {\n out.push(` ${aLine ?? ''}`);\n } else {\n if (aLine !== null) {\n out.push(chalk.red(`- ${aLine}`));\n }\n if (bLine !== null) {\n out.push(chalk.green(`+ ${bLine}`));\n }\n }\n }\n return out.join('\\n');\n}\n\nfunction formatKV(obj: Record<string, string>): string {\n return Object.entries(obj ?? {})\n .map(([k, v]) => `${k}: ${v}`)\n .join('\\n');\n}\n\nfunction formatActions(actions: ActionItem[]): string {\n return (actions ?? [])\n .map((a) => {\n const params = (a.params ?? [])\n .map((p) => ` ${p.param}: [${p.values.join(', ')}]`)\n .join('\\n');\n const header = a.description ? `${a.name} — ${a.description}` : a.name;\n return params ? `${header}\\n${params}` : header;\n })\n .join('\\n\\n');\n}\n\nfunction diffInstructions(\n a: Instruction,\n b: Instruction,\n v1: string,\n v2: string,\n): string {\n const out: string[] = [chalk.dim(`--- v${v1}`), chalk.dim(`+++ v${v2}`), ''];\n\n const sections: [string, string, string][] = [\n ['Intents', formatKV(a.intents), formatKV(b.intents)],\n ['Semantics', formatKV(a.semantics), formatKV(b.semantics)],\n ['Actions', formatActions(a.actions), formatActions(b.actions)],\n ['Instruction', a.content ?? '', b.content ?? ''],\n ];\n\n for (const [label, aStr, bStr] of sections) {\n out.push(chalk.bold(`── ${label} ──`));\n if (aStr === bStr) {\n out.push(chalk.dim(' (no changes)'));\n } else {\n out.push(diffLines(aStr, bStr));\n }\n out.push('');\n }\n\n return out.join('\\n');\n}\n\n// ── Wizard ────────────────────────────────────────────────────────────────────\n\nasync function showInstructionDetail(\n version: string,\n instructions: Instruction[],\n): Promise<'back' | 'exit' | 'refetch'> {\n const inst = instructions.find((i) => i.version === version);\n if (!inst) {\n return 'back';\n }\n\n console.clear();\n const activeLabel = inst.active ? chalk.green(' (active)') : '';\n printHeader(`📋 AI Instructions ❯ Version ${version}${activeLabel}`);\n\n printInstructionContent(inst);\n\n const choices = [\n { name: ` ${chalk.dim('← Back')}`, value: 'back' },\n ...(!inst.active\n ? [\n {\n name: ` ${chalk.cyan('⚡ Activate this version')}`,\n value: 'activate',\n },\n ]\n : []),\n { name: ` ${chalk.red('✕ Exit')}`, value: 'exit' },\n ];\n\n const { action } = await inquirer.prompt<{ action: string }>([\n {\n type: 'list',\n name: 'action',\n message: chalk.bold('What would you like to do?'),\n choices,\n },\n ]);\n\n if (action === 'activate') {\n const sp = ora(`Activating version ${version}…`).start();\n try {\n await wixRequest({ path: `${BASE}/activate/${version}`, method: 'POST' });\n sp.stop();\n console.log(chalk.green(`✔ Version ${version} is now active\\n`));\n } catch (err_) {\n sp.fail('Activation failed');\n console.error(chalk.red((err_ as Error).message));\n }\n return 'refetch';\n }\n\n return action as 'back' | 'exit';\n}\n\nasync function runInstructionsWizard(): Promise<void> {\n process.on('SIGINT', () => {\n console.log(chalk.dim('\\nBye.\\n'));\n process.exit(0);\n });\n\n const sp = ora('Fetching instructions…').start();\n let instructions: Instruction[] = [];\n try {\n const data = await wixRequest<{ instructions: Instruction[] }>({\n path: `${BASE}/query`,\n method: 'POST',\n body: { query: {} },\n });\n sp.stop();\n instructions = data.instructions ?? [];\n } catch (err_) {\n sp.fail('Failed to fetch instructions');\n console.error(chalk.red((err_ as Error).message));\n process.exit(1);\n }\n\n if (instructions.length === 0) {\n console.log(chalk.yellow('No instructions found.'));\n process.exit(0);\n }\n\n const running = true;\n while (running) {\n console.clear();\n printHeader(\n `📋 AI Instructions ${chalk.dim(`${instructions.length} versions`)}`,\n );\n printDivider('[↑↓] Navigate [Enter] Select [Ctrl+C] Quit');\n\n const choices = [\n ...instructions.map((inst) => {\n const activeTag = inst.active\n ? chalk.green(' ✓ active')\n : chalk.dim(' ');\n const label = ` v${inst.version}${activeTag} ${chalk.white(\n truncate(inst.content),\n )}`;\n return { name: label, value: inst.version };\n }),\n new inquirer.Separator('─'.repeat(BOX_W)),\n { name: ` ${chalk.red('✕ Exit')}`, value: '__exit__' },\n ];\n\n const { version } = await inquirer.prompt<{ version: string }>([\n {\n type: 'list',\n name: 'version',\n message: chalk.bold('Select a version'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (version === '__exit__') {\n break;\n }\n\n const result = await showInstructionDetail(version, instructions);\n if (result === 'exit') {\n break;\n }\n if (result === 'refetch') {\n try {\n const data = await wixRequest<{ instructions: Instruction[] }>({\n path: `${BASE}/query`,\n method: 'POST',\n body: { query: {} },\n });\n instructions = data.instructions ?? instructions;\n } catch {\n // keep existing data if re-fetch fails\n }\n }\n }\n\n console.clear();\n console.log(chalk.dim('Bye.\\n'));\n process.exit(0);\n}\n\n// ── Subcommands ───────────────────────────────────────────────────────────────\n\nconst getActiveCmd = new Command('get-active')\n .description('Get the currently active instruction')\n .action(async () => {\n const sp = spinner('Fetching active instruction...');\n try {\n const data = await wixRequest<{ instruction: Instruction }>({\n path: `${BASE}/active`,\n });\n sp.stop();\n const inst = data.instruction;\n console.log(chalk.bold(`Version ${inst.version}`));\n console.log();\n printInstructionContent(inst);\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\nconst listCmd = new Command('list')\n .description('List all instructions')\n .option('--active', 'Show only the currently active instruction')\n .option(\n '--format <format>',\n 'Output format: table (default) or json',\n 'table',\n )\n .action(async (opts: { active?: boolean; format?: string }) => {\n const sp = spinner('Fetching instructions...');\n try {\n const data = await wixRequest<{ instructions: Instruction[] }>({\n path: `${BASE}/query`,\n method: 'POST',\n body: { query: {} },\n });\n sp.stop();\n\n let items = data.instructions ?? [];\n if (opts.active) {\n items = items.filter((i) => i.active);\n }\n\n if (opts.format === 'json') {\n const view = items.map(\n ({ version, active, intents, semantics, actions, content }) => ({\n version,\n active: active ?? false,\n intents,\n semantics,\n actions,\n content,\n }),\n );\n console.log(JSON.stringify(view, null, 2));\n } else {\n const header = `${'Version'.padEnd(10)}${'Active'.padEnd(\n 10,\n )}Instruction`;\n console.log(chalk.bold(header));\n console.log('─'.repeat(60));\n for (const i of items) {\n const ver = `v${i.version}`.padEnd(10);\n const active = (i.active ? '✓' : '').padEnd(10);\n const preview = truncate(i.content, 40);\n console.log(`${chalk.cyan(ver)}${chalk.green(active)}${preview}`);\n }\n }\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\nconst activateCmd = new Command('set-active')\n .description('Set an instruction as active by version number')\n .argument('<version>', 'Version number to activate')\n .action(async (version: string) => {\n const sp = spinner(`Activating instruction version ${version}...`);\n try {\n await wixRequest<{\n instruction: Instruction;\n previousInstruction?: Instruction;\n }>({\n path: `${BASE}/activate/${version}`,\n method: 'POST',\n });\n sp.stop();\n success(`Activated version ${version}`);\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\nconst getCmd = new Command('get')\n .description('Get an instruction by version number')\n .argument('<version>', 'Version number')\n .action(async (version: string) => {\n const sp = spinner(`Fetching instruction version ${version}...`);\n try {\n const data = await wixRequest<{ instruction: Instruction }>({\n path: `${BASE}/by-version/${version}`,\n });\n sp.stop();\n const inst = data.instruction;\n console.log(chalk.bold(`Version ${inst.version}`));\n console.log();\n printInstructionContent(inst);\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\nconst diffCmd = new Command('diff')\n .description('Show diff between two instruction versions across all sections')\n .argument('<v1>', 'First version number')\n .argument('<v2>', 'Second version number')\n .action(async (v1: string, v2: string) => {\n const sp = spinner(`Fetching versions ${v1} and ${v2}...`);\n try {\n const [d1, d2] = await Promise.all([\n wixRequest<{ instruction: Instruction }>({\n path: `${BASE}/by-version/${v1}`,\n }),\n wixRequest<{ instruction: Instruction }>({\n path: `${BASE}/by-version/${v2}`,\n }),\n ]);\n sp.stop();\n console.log(diffInstructions(d1.instruction, d2.instruction, v1, v2));\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\nconst exportCmd = new Command('export')\n .description('Export an instruction version to a local file')\n .requiredOption('--version <v>', 'Version number to export')\n .requiredOption('--output <file>', 'Output file path (.json)')\n .action(async (opts: { version: string; output: string }) => {\n const sp = spinner(`Fetching instruction version ${opts.version}...`);\n try {\n const data = await wixRequest<{ instruction: Instruction }>({\n path: `${BASE}/by-version/${opts.version}`,\n });\n sp.stop();\n const inst = data.instruction;\n const outContent = JSON.stringify(\n {\n intents: inst.intents,\n semantics: inst.semantics,\n actions: inst.actions,\n content: inst.content,\n },\n null,\n 2,\n );\n const outPath = path.resolve(opts.output);\n fs.writeFileSync(outPath, outContent, 'utf8');\n success(`Exported version ${opts.version} to ${outPath}`);\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\nconst rollbackCmd = new Command('rollback')\n .description('Re-activate the version that was active before the current one')\n .action(async () => {\n const sp = spinner('Fetching instructions...');\n try {\n const data = await wixRequest<{ instructions: Instruction[] }>({\n path: `${BASE}/query`,\n method: 'POST',\n body: { query: {} },\n });\n sp.stop();\n\n const instructions = data.instructions ?? [];\n const active = instructions.find((i) => i.active);\n if (!active) {\n error('No active instruction found — nothing to roll back from.');\n process.exit(1);\n }\n\n const previous = instructions\n .filter((i) => !i.active && Number(i.version) < Number(active!.version))\n .sort((a, b) => Number(b.version) - Number(a.version))[0];\n\n if (!previous) {\n error(`No previous version found before v${active!.version}.`);\n process.exit(1);\n }\n\n const sp2 = spinner(`Rolling back to version ${previous.version}...`);\n await wixRequest({\n path: `${BASE}/activate/${previous.version}`,\n method: 'POST',\n });\n sp2.stop();\n success(`Rolled back to v${previous.version} (was v${active.version})`);\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n });\n\n// ── Command export ────────────────────────────────────────────────────────────\n\nconst wizardCmd = new Command('wizard')\n .description(\n 'Open the interactive TUI to browse and activate instruction versions',\n )\n .action(async () => {\n try {\n await runInstructionsWizard();\n } catch (err_) {\n const msg = (err_ as Error).message ?? '';\n if (msg.includes('force closed') || msg.includes('User force')) {\n console.log(chalk.dim('\\nBye.'));\n process.exit(0);\n }\n console.error(chalk.red('Unexpected error: ' + msg));\n process.exit(1);\n }\n });\n\nexport const instructionsCommand = new Command('instructions')\n .description('Manage AI instructions')\n .action(function (this: Command) {\n this.outputHelp();\n })\n .addCommand(wizardCmd)\n .addCommand(getActiveCmd)\n .addCommand(listCmd)\n .addCommand(activateCmd)\n .addCommand(getCmd)\n .addCommand(diffCmd)\n .addCommand(exportCmd)\n .addCommand(rollbackCmd);\n"],"mappings":";;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,EAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,IAAA,GAAAD,uBAAA,CAAAF,OAAA;AACA,IAAAI,SAAA,GAAAC,sBAAA,CAAAL,OAAA;AACA,IAAAM,MAAA,GAAAD,sBAAA,CAAAL,OAAA;AACA,IAAAO,IAAA,GAAAF,sBAAA,CAAAL,OAAA;AACA,IAAAQ,OAAA,GAAAR,OAAA;AACA,IAAAS,MAAA,GAAAT,OAAA;AAAyD,SAAAE,wBAAAQ,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAV,uBAAA,YAAAA,CAAAQ,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAEzD,MAAMkB,IAAI,GAAG,wBAAwB;;AAErC;;AA4BA;;AAEA,MAAMC,KAAK,GAAG,EAAE;AAEhB,SAASC,WAAWA,CAACC,KAAa,EAAQ;EACxC,MAAMC,GAAG,GAAG,GAAG,CAACC,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEN,KAAK,GAAGE,KAAK,CAACK,MAAM,GAAG,CAAC,CAAC,CAAC;EAC7DC,OAAO,CAACC,GAAG,CAACC,cAAK,CAACC,IAAI,CAAC,GAAG,GAAG,GAAG,CAACP,MAAM,CAACJ,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;EACtDQ,OAAO,CAACC,GAAG,CACT,GAAGC,cAAK,CAACC,IAAI,CAAC,GAAG,CAAC,KAAKD,cAAK,CAACE,IAAI,CAACV,KAAK,CAAC,GAAGC,GAAG,GAAGO,cAAK,CAACC,IAAI,CAAC,GAAG,CAAC,EAClE,CAAC;EACDH,OAAO,CAACC,GAAG,CAACC,cAAK,CAACC,IAAI,CAAC,GAAG,GAAG,GAAG,CAACP,MAAM,CAACJ,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;EACtDQ,OAAO,CAACC,GAAG,CAAC,CAAC;AACf;AAEA,SAASI,YAAYA,CAACC,KAAa,EAAQ;EACzCN,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,GAAG,CAACX,MAAM,CAACJ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;EAC7CQ,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,KAAKD,KAAK,EAAE,CAAC,CAAC;EACpCN,OAAO,CAACC,GAAG,CAAC,CAAC;AACf;AAEA,SAASO,QAAQA,CAACC,IAAY,EAAEX,GAAG,GAAG,EAAE,EAAU;EAChD,MAAMY,KAAK,GAAG,CAACD,IAAI,IAAI,EAAE,EAAEE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAACC,IAAI,CAAC,CAAC;EACrD,OAAOF,KAAK,CAACX,MAAM,GAAGD,GAAG,GAAG,GAAGY,KAAK,CAACG,KAAK,CAAC,CAAC,EAAEf,GAAG,GAAG,CAAC,CAAC,GAAG,GAAGY,KAAK;AACnE;AAEA,SAASI,uBAAuBA,CAACC,IAAiB,EAAQ;EACxD;EACAf,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAAC,WAAW,CAAC,CAAC;EACpCJ,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,IAAI,GAAG,GAAG,CAACX,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7C,MAAMoB,OAAO,GAAGD,IAAI,CAACC,OAAO,IAAI,CAAC,CAAC;EAClC,IAAI5B,MAAM,CAAC6B,IAAI,CAACD,OAAO,CAAC,CAACjB,MAAM,KAAK,CAAC,EAAE;IACrCC,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,UAAU,CAAC,CAAC;EACpC,CAAC,MAAM;IACL,KAAK,MAAM,CAACW,CAAC,EAAEC,CAAC,CAAC,IAAI/B,MAAM,CAACgC,OAAO,CAACJ,OAAO,CAAC,EAAE;MAC5ChB,OAAO,CAACC,GAAG,CAAC,KAAKC,cAAK,CAACC,IAAI,CAACe,CAAC,CAAC,KAAKC,CAAC,EAAE,CAAC;IACzC;EACF;EACAnB,OAAO,CAACC,GAAG,CAAC,CAAC;;EAEb;EACAD,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAAC,aAAa,CAAC,CAAC;EACtCJ,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,IAAI,GAAG,GAAG,CAACX,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7C,MAAMyB,SAAS,GAAGN,IAAI,CAACM,SAAS,IAAI,CAAC,CAAC;EACtC,IAAIjC,MAAM,CAAC6B,IAAI,CAACI,SAAS,CAAC,CAACtB,MAAM,KAAK,CAAC,EAAE;IACvCC,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,UAAU,CAAC,CAAC;EACpC,CAAC,MAAM;IACL,KAAK,MAAM,CAACW,CAAC,EAAEC,CAAC,CAAC,IAAI/B,MAAM,CAACgC,OAAO,CAACC,SAAS,CAAC,EAAE;MAC9CrB,OAAO,CAACC,GAAG,CAAC,KAAKC,cAAK,CAACC,IAAI,CAACe,CAAC,CAAC,KAAKC,CAAC,EAAE,CAAC;IACzC;EACF;EACAnB,OAAO,CAACC,GAAG,CAAC,CAAC;;EAEb;EACAD,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAAC,WAAW,CAAC,CAAC;EACpCJ,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,IAAI,GAAG,GAAG,CAACX,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7C,MAAM0B,OAAO,GAAGP,IAAI,CAACO,OAAO,IAAI,EAAE;EAClC,IAAIA,OAAO,CAACvB,MAAM,KAAK,CAAC,EAAE;IACxBC,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,UAAU,CAAC,CAAC;EACpC,CAAC,MAAM;IACL,KAAK,MAAMgB,MAAM,IAAID,OAAO,EAAE;MAC5B,MAAME,IAAI,GAAGD,MAAM,CAACE,WAAW,GAC3BvB,cAAK,CAACK,GAAG,CAAC,MAAMgB,MAAM,CAACE,WAAW,EAAE,CAAC,GACrC,EAAE;MACNzB,OAAO,CAACC,GAAG,CAAC,KAAKC,cAAK,CAACC,IAAI,CAAC,IAAI,GAAGoB,MAAM,CAACG,IAAI,CAAC,GAAGF,IAAI,EAAE,CAAC;MACzD,KAAK,MAAMG,CAAC,IAAIJ,MAAM,CAACK,MAAM,IAAI,EAAE,EAAE;QACnC,MAAMC,OAAO,GACXF,CAAC,CAACG,MAAM,CAAC/B,MAAM,GAAG,CAAC,GACfG,cAAK,CAACK,GAAG,CACP,KAAKoB,CAAC,CAACG,MAAM,CAACjB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACkB,IAAI,CAAC,IAAI,CAAC,GAClCJ,CAAC,CAACG,MAAM,CAAC/B,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,GAEpC,CAAC,GACD,EAAE;QACR,MAAMiC,MAAM,GAAGL,CAAC,CAACM,QAAQ,GAAG/B,cAAK,CAACK,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE;QACzDP,OAAO,CAACC,GAAG,CAAC,SAAS0B,CAAC,CAACO,KAAK,GAAGL,OAAO,GAAGG,MAAM,EAAE,CAAC;MACpD;IACF;EACF;EACAhC,OAAO,CAACC,GAAG,CAAC,CAAC;;EAEb;EACAD,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAAC,eAAe,CAAC,CAAC;EACxCJ,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,IAAI,GAAG,GAAG,CAACX,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7CI,OAAO,CAACC,GAAG,CAAC,KAAKc,IAAI,CAACoB,OAAO,IAAI,EAAE,EAAE,CAAC;EACtCnC,OAAO,CAACC,GAAG,CAAC,CAAC;AACf;;AAEA;;AAEA,SAASmC,SAASA,CAACC,IAAY,EAAEC,IAAY,EAAU;EACrD,MAAMC,MAAM,GAAGF,IAAI,CAACG,KAAK,CAAC,IAAI,CAAC;EAC/B,MAAMC,MAAM,GAAGH,IAAI,CAACE,KAAK,CAAC,IAAI,CAAC;EAC/B,MAAME,GAAa,GAAG,EAAE;EACxB,MAAMC,MAAM,GAAG9C,IAAI,CAACC,GAAG,CAACyC,MAAM,CAACxC,MAAM,EAAE0C,MAAM,CAAC1C,MAAM,CAAC;EACrD,KAAK,IAAIpB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgE,MAAM,EAAEhE,CAAC,EAAE,EAAE;IAC/B,MAAMiE,KAAK,GAAGjE,CAAC,GAAG4D,MAAM,CAACxC,MAAM,GAAGwC,MAAM,CAAC5D,CAAC,CAAC,GAAG,IAAI;IAClD,MAAMkE,KAAK,GAAGlE,CAAC,GAAG8D,MAAM,CAAC1C,MAAM,GAAG0C,MAAM,CAAC9D,CAAC,CAAC,GAAG,IAAI;IAClD,IAAIiE,KAAK,KAAKC,KAAK,EAAE;MACnBH,GAAG,CAACI,IAAI,CAAC,KAAKF,KAAK,IAAI,EAAE,EAAE,CAAC;IAC9B,CAAC,MAAM;MACL,IAAIA,KAAK,KAAK,IAAI,EAAE;QAClBF,GAAG,CAACI,IAAI,CAAC5C,cAAK,CAAC6C,GAAG,CAAC,KAAKH,KAAK,EAAE,CAAC,CAAC;MACnC;MACA,IAAIC,KAAK,KAAK,IAAI,EAAE;QAClBH,GAAG,CAACI,IAAI,CAAC5C,cAAK,CAAC8C,KAAK,CAAC,KAAKH,KAAK,EAAE,CAAC,CAAC;MACrC;IACF;EACF;EACA,OAAOH,GAAG,CAACX,IAAI,CAAC,IAAI,CAAC;AACvB;AAEA,SAASkB,QAAQA,CAACC,GAA2B,EAAU;EACrD,OAAO9D,MAAM,CAACgC,OAAO,CAAC8B,GAAG,IAAI,CAAC,CAAC,CAAC,CAC7BC,GAAG,CAAC,CAAC,CAACjC,CAAC,EAAEC,CAAC,CAAC,KAAK,GAAGD,CAAC,KAAKC,CAAC,EAAE,CAAC,CAC7BY,IAAI,CAAC,IAAI,CAAC;AACf;AAEA,SAASqB,aAAaA,CAAC9B,OAAqB,EAAU;EACpD,OAAO,CAACA,OAAO,IAAI,EAAE,EAClB6B,GAAG,CAAEE,CAAC,IAAK;IACV,MAAMzB,MAAM,GAAG,CAACyB,CAAC,CAACzB,MAAM,IAAI,EAAE,EAC3BuB,GAAG,CAAExB,CAAC,IAAK,KAAKA,CAAC,CAACO,KAAK,MAAMP,CAAC,CAACG,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CACpDA,IAAI,CAAC,IAAI,CAAC;IACb,MAAMuB,MAAM,GAAGD,CAAC,CAAC5B,WAAW,GAAG,GAAG4B,CAAC,CAAC3B,IAAI,MAAM2B,CAAC,CAAC5B,WAAW,EAAE,GAAG4B,CAAC,CAAC3B,IAAI;IACtE,OAAOE,MAAM,GAAG,GAAG0B,MAAM,KAAK1B,MAAM,EAAE,GAAG0B,MAAM;EACjD,CAAC,CAAC,CACDvB,IAAI,CAAC,MAAM,CAAC;AACjB;AAEA,SAASwB,gBAAgBA,CACvBF,CAAc,EACdG,CAAc,EACdC,EAAU,EACVC,EAAU,EACF;EACR,MAAMhB,GAAa,GAAG,CAACxC,cAAK,CAACK,GAAG,CAAC,QAAQkD,EAAE,EAAE,CAAC,EAAEvD,cAAK,CAACK,GAAG,CAAC,QAAQmD,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;EAE5E,MAAMC,QAAoC,GAAG,CAC3C,CAAC,SAAS,EAAEV,QAAQ,CAACI,CAAC,CAACrC,OAAO,CAAC,EAAEiC,QAAQ,CAACO,CAAC,CAACxC,OAAO,CAAC,CAAC,EACrD,CAAC,WAAW,EAAEiC,QAAQ,CAACI,CAAC,CAAChC,SAAS,CAAC,EAAE4B,QAAQ,CAACO,CAAC,CAACnC,SAAS,CAAC,CAAC,EAC3D,CAAC,SAAS,EAAE+B,aAAa,CAACC,CAAC,CAAC/B,OAAO,CAAC,EAAE8B,aAAa,CAACI,CAAC,CAAClC,OAAO,CAAC,CAAC,EAC/D,CAAC,aAAa,EAAE+B,CAAC,CAAClB,OAAO,IAAI,EAAE,EAAEqB,CAAC,CAACrB,OAAO,IAAI,EAAE,CAAC,CAClD;EAED,KAAK,MAAM,CAACyB,KAAK,EAAEvB,IAAI,EAAEC,IAAI,CAAC,IAAIqB,QAAQ,EAAE;IAC1CjB,GAAG,CAACI,IAAI,CAAC5C,cAAK,CAACE,IAAI,CAAC,MAAMwD,KAAK,KAAK,CAAC,CAAC;IACtC,IAAIvB,IAAI,KAAKC,IAAI,EAAE;MACjBI,GAAG,CAACI,IAAI,CAAC5C,cAAK,CAACK,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC,MAAM;MACLmC,GAAG,CAACI,IAAI,CAACV,SAAS,CAACC,IAAI,EAAEC,IAAI,CAAC,CAAC;IACjC;IACAI,GAAG,CAACI,IAAI,CAAC,EAAE,CAAC;EACd;EAEA,OAAOJ,GAAG,CAACX,IAAI,CAAC,IAAI,CAAC;AACvB;;AAEA;;AAEA,eAAe8B,qBAAqBA,CAClCC,OAAe,EACfC,YAA2B,EACW;EACtC,MAAMhD,IAAI,GAAGgD,YAAY,CAACC,IAAI,CAAErF,CAAC,IAAKA,CAAC,CAACmF,OAAO,KAAKA,OAAO,CAAC;EAC5D,IAAI,CAAC/C,IAAI,EAAE;IACT,OAAO,MAAM;EACf;EAEAf,OAAO,CAACiE,KAAK,CAAC,CAAC;EACf,MAAMC,WAAW,GAAGnD,IAAI,CAACoD,MAAM,GAAGjE,cAAK,CAAC8C,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;EAC/DvD,WAAW,CAAC,kCAAkCqE,OAAO,GAAGI,WAAW,EAAE,CAAC;EAEtEpD,uBAAuB,CAACC,IAAI,CAAC;EAE7B,MAAMqD,OAAO,GAAG,CACd;IAAE1C,IAAI,EAAE,KAAKxB,cAAK,CAACK,GAAG,CAAC,SAAS,CAAC,EAAE;IAAE8D,KAAK,EAAE;EAAO,CAAC,EACpD,IAAI,CAACtD,IAAI,CAACoD,MAAM,GACZ,CACE;IACEzC,IAAI,EAAE,KAAKxB,cAAK,CAACC,IAAI,CAAC,0BAA0B,CAAC,EAAE;IACnDkE,KAAK,EAAE;EACT,CAAC,CACF,GACD,EAAE,CAAC,EACP;IAAE3C,IAAI,EAAE,KAAKxB,cAAK,CAAC6C,GAAG,CAAC,SAAS,CAAC,EAAE;IAAEsB,KAAK,EAAE;EAAO,CAAC,CACrD;EAED,MAAM;IAAE9C;EAAO,CAAC,GAAG,MAAM+C,iBAAQ,CAACC,MAAM,CAAqB,CAC3D;IACEC,IAAI,EAAE,MAAM;IACZ9C,IAAI,EAAE,QAAQ;IACd+C,OAAO,EAAEvE,cAAK,CAACE,IAAI,CAAC,4BAA4B,CAAC;IACjDgE;EACF,CAAC,CACF,CAAC;EAEF,IAAI7C,MAAM,KAAK,UAAU,EAAE;IACzB,MAAMmD,EAAE,GAAG,IAAAC,YAAG,EAAC,sBAAsBb,OAAO,GAAG,CAAC,CAACc,KAAK,CAAC,CAAC;IACxD,IAAI;MACF,MAAM,IAAAC,kBAAU,EAAC;QAAEhH,IAAI,EAAE,GAAG0B,IAAI,aAAauE,OAAO,EAAE;QAAEgB,MAAM,EAAE;MAAO,CAAC,CAAC;MACzEJ,EAAE,CAACK,IAAI,CAAC,CAAC;MACT/E,OAAO,CAACC,GAAG,CAACC,cAAK,CAAC8C,KAAK,CAAC,cAAcc,OAAO,kBAAkB,CAAC,CAAC;IACnE,CAAC,CAAC,OAAOkB,IAAI,EAAE;MACbN,EAAE,CAACO,IAAI,CAAC,mBAAmB,CAAC;MAC5BjF,OAAO,CAACkF,KAAK,CAAChF,cAAK,CAAC6C,GAAG,CAAEiC,IAAI,CAAWP,OAAO,CAAC,CAAC;IACnD;IACA,OAAO,SAAS;EAClB;EAEA,OAAOlD,MAAM;AACf;AAEA,eAAe4D,qBAAqBA,CAAA,EAAkB;EACpDC,OAAO,CAACC,EAAE,CAAC,QAAQ,EAAE,MAAM;IACzBrF,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC6E,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB,CAAC,CAAC;EAEF,MAAMZ,EAAE,GAAG,IAAAC,YAAG,EAAC,wBAAwB,CAAC,CAACC,KAAK,CAAC,CAAC;EAChD,IAAIb,YAA2B,GAAG,EAAE;EACpC,IAAI;IACF,MAAMwB,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAAkC;MAC7DhH,IAAI,EAAE,GAAG0B,IAAI,QAAQ;MACrBuF,MAAM,EAAE,MAAM;MACdU,IAAI,EAAE;QAAEC,KAAK,EAAE,CAAC;MAAE;IACpB,CAAC,CAAC;IACFf,EAAE,CAACK,IAAI,CAAC,CAAC;IACThB,YAAY,GAAGwB,IAAI,CAACxB,YAAY,IAAI,EAAE;EACxC,CAAC,CAAC,OAAOiB,IAAI,EAAE;IACbN,EAAE,CAACO,IAAI,CAAC,8BAA8B,CAAC;IACvCjF,OAAO,CAACkF,KAAK,CAAChF,cAAK,CAAC6C,GAAG,CAAEiC,IAAI,CAAWP,OAAO,CAAC,CAAC;IACjDW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;EAEA,IAAIvB,YAAY,CAAChE,MAAM,KAAK,CAAC,EAAE;IAC7BC,OAAO,CAACC,GAAG,CAACC,cAAK,CAACwF,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnDN,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;EAEA,MAAMK,OAAO,GAAG,IAAI;EACpB,OAAOA,OAAO,EAAE;IACd3F,OAAO,CAACiE,KAAK,CAAC,CAAC;IACfxE,WAAW,CACT,wBAAwBS,cAAK,CAACK,GAAG,CAAC,GAAGwD,YAAY,CAAChE,MAAM,WAAW,CAAC,EACtE,CAAC;IACDM,YAAY,CAAC,gDAAgD,CAAC;IAE9D,MAAM+D,OAAO,GAAG,CACd,GAAGL,YAAY,CAACZ,GAAG,CAAEpC,IAAI,IAAK;MAC5B,MAAM6E,SAAS,GAAG7E,IAAI,CAACoD,MAAM,GACzBjE,cAAK,CAAC8C,KAAK,CAAC,WAAW,CAAC,GACxB9C,cAAK,CAACK,GAAG,CAAC,WAAW,CAAC;MAC1B,MAAMqD,KAAK,GAAG,MAAM7C,IAAI,CAAC+C,OAAO,GAAG8B,SAAS,MAAM1F,cAAK,CAAC2F,KAAK,CAC3DrF,QAAQ,CAACO,IAAI,CAACoB,OAAO,CACvB,CAAC,EAAE;MACH,OAAO;QAAET,IAAI,EAAEkC,KAAK;QAAES,KAAK,EAAEtD,IAAI,CAAC+C;MAAQ,CAAC;IAC7C,CAAC,CAAC,EACF,IAAIQ,iBAAQ,CAACwB,SAAS,CAAC,GAAG,CAAClG,MAAM,CAACJ,KAAK,CAAC,CAAC,EACzC;MAAEkC,IAAI,EAAE,KAAKxB,cAAK,CAAC6C,GAAG,CAAC,SAAS,CAAC,EAAE;MAAEsB,KAAK,EAAE;IAAW,CAAC,CACzD;IAED,MAAM;MAAEP;IAAQ,CAAC,GAAG,MAAMQ,iBAAQ,CAACC,MAAM,CAAsB,CAC7D;MACEC,IAAI,EAAE,MAAM;MACZ9C,IAAI,EAAE,SAAS;MACf+C,OAAO,EAAEvE,cAAK,CAACE,IAAI,CAAC,kBAAkB,CAAC;MACvCgE,OAAO;MACP2B,QAAQ,EAAE;IACZ,CAAC,CACF,CAAC;IAEF,IAAIjC,OAAO,KAAK,UAAU,EAAE;MAC1B;IACF;IAEA,MAAMkC,MAAM,GAAG,MAAMnC,qBAAqB,CAACC,OAAO,EAAEC,YAAY,CAAC;IACjE,IAAIiC,MAAM,KAAK,MAAM,EAAE;MACrB;IACF;IACA,IAAIA,MAAM,KAAK,SAAS,EAAE;MACxB,IAAI;QACF,MAAMT,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAAkC;UAC7DhH,IAAI,EAAE,GAAG0B,IAAI,QAAQ;UACrBuF,MAAM,EAAE,MAAM;UACdU,IAAI,EAAE;YAAEC,KAAK,EAAE,CAAC;UAAE;QACpB,CAAC,CAAC;QACF1B,YAAY,GAAGwB,IAAI,CAACxB,YAAY,IAAIA,YAAY;MAClD,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;EAEA/D,OAAO,CAACiE,KAAK,CAAC,CAAC;EACfjE,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,QAAQ,CAAC,CAAC;EAChC6E,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;AACjB;;AAEA;;AAEA,MAAMW,YAAY,GAAG,IAAIC,kBAAO,CAAC,YAAY,CAAC,CAC3CzE,WAAW,CAAC,sCAAsC,CAAC,CACnDF,MAAM,CAAC,YAAY;EAClB,MAAMmD,EAAE,GAAG,IAAAyB,cAAO,EAAC,gCAAgC,CAAC;EACpD,IAAI;IACF,MAAMZ,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAA+B;MAC1DhH,IAAI,EAAE,GAAG0B,IAAI;IACf,CAAC,CAAC;IACFmF,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,MAAMhE,IAAI,GAAGwE,IAAI,CAACa,WAAW;IAC7BpG,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAAC,WAAWW,IAAI,CAAC+C,OAAO,EAAE,CAAC,CAAC;IAClD9D,OAAO,CAACC,GAAG,CAAC,CAAC;IACba,uBAAuB,CAACC,IAAI,CAAC;EAC/B,CAAC,CAAC,OAAOiE,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEJ,MAAMe,OAAO,GAAG,IAAIH,kBAAO,CAAC,MAAM,CAAC,CAChCzE,WAAW,CAAC,uBAAuB,CAAC,CACpC6E,MAAM,CAAC,UAAU,EAAE,4CAA4C,CAAC,CAChEA,MAAM,CACL,mBAAmB,EACnB,wCAAwC,EACxC,OACF,CAAC,CACA/E,MAAM,CAAC,MAAOgF,IAA2C,IAAK;EAC7D,MAAM7B,EAAE,GAAG,IAAAyB,cAAO,EAAC,0BAA0B,CAAC;EAC9C,IAAI;IACF,MAAMZ,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAAkC;MAC7DhH,IAAI,EAAE,GAAG0B,IAAI,QAAQ;MACrBuF,MAAM,EAAE,MAAM;MACdU,IAAI,EAAE;QAAEC,KAAK,EAAE,CAAC;MAAE;IACpB,CAAC,CAAC;IACFf,EAAE,CAACK,IAAI,CAAC,CAAC;IAET,IAAIyB,KAAK,GAAGjB,IAAI,CAACxB,YAAY,IAAI,EAAE;IACnC,IAAIwC,IAAI,CAACpC,MAAM,EAAE;MACfqC,KAAK,GAAGA,KAAK,CAACC,MAAM,CAAE9H,CAAC,IAAKA,CAAC,CAACwF,MAAM,CAAC;IACvC;IAEA,IAAIoC,IAAI,CAACG,MAAM,KAAK,MAAM,EAAE;MAC1B,MAAMC,IAAI,GAAGH,KAAK,CAACrD,GAAG,CACpB,CAAC;QAAEW,OAAO;QAAEK,MAAM;QAAEnD,OAAO;QAAEK,SAAS;QAAEC,OAAO;QAAEa;MAAQ,CAAC,MAAM;QAC9D2B,OAAO;QACPK,MAAM,EAAEA,MAAM,IAAI,KAAK;QACvBnD,OAAO;QACPK,SAAS;QACTC,OAAO;QACPa;MACF,CAAC,CACH,CAAC;MACDnC,OAAO,CAACC,GAAG,CAAC2G,IAAI,CAACC,SAAS,CAACF,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,MAAM;MACL,MAAMrD,MAAM,GAAG,GAAG,SAAS,CAACwD,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAACA,MAAM,CACtD,EACF,CAAC,aAAa;MACd9G,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAACkD,MAAM,CAAC,CAAC;MAC/BtD,OAAO,CAACC,GAAG,CAAC,GAAG,CAACL,MAAM,CAAC,EAAE,CAAC,CAAC;MAC3B,KAAK,MAAMjB,CAAC,IAAI6H,KAAK,EAAE;QACrB,MAAMO,GAAG,GAAG,IAAIpI,CAAC,CAACmF,OAAO,EAAE,CAACgD,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM3C,MAAM,GAAG,CAACxF,CAAC,CAACwF,MAAM,GAAG,GAAG,GAAG,EAAE,EAAE2C,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAMjF,OAAO,GAAGrB,QAAQ,CAAC7B,CAAC,CAACwD,OAAO,EAAE,EAAE,CAAC;QACvCnC,OAAO,CAACC,GAAG,CAAC,GAAGC,cAAK,CAACC,IAAI,CAAC4G,GAAG,CAAC,GAAG7G,cAAK,CAAC8C,KAAK,CAACmB,MAAM,CAAC,GAAGtC,OAAO,EAAE,CAAC;MACnE;IACF;EACF,CAAC,CAAC,OAAOmD,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEJ,MAAM0B,WAAW,GAAG,IAAId,kBAAO,CAAC,YAAY,CAAC,CAC1CzE,WAAW,CAAC,gDAAgD,CAAC,CAC7DwF,QAAQ,CAAC,WAAW,EAAE,4BAA4B,CAAC,CACnD1F,MAAM,CAAC,MAAOuC,OAAe,IAAK;EACjC,MAAMY,EAAE,GAAG,IAAAyB,cAAO,EAAC,kCAAkCrC,OAAO,KAAK,CAAC;EAClE,IAAI;IACF,MAAM,IAAAe,kBAAU,EAGb;MACDhH,IAAI,EAAE,GAAG0B,IAAI,aAAauE,OAAO,EAAE;MACnCgB,MAAM,EAAE;IACV,CAAC,CAAC;IACFJ,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAmC,cAAO,EAAC,qBAAqBpD,OAAO,EAAE,CAAC;EACzC,CAAC,CAAC,OAAOkB,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEJ,MAAM6B,MAAM,GAAG,IAAIjB,kBAAO,CAAC,KAAK,CAAC,CAC9BzE,WAAW,CAAC,sCAAsC,CAAC,CACnDwF,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CACvC1F,MAAM,CAAC,MAAOuC,OAAe,IAAK;EACjC,MAAMY,EAAE,GAAG,IAAAyB,cAAO,EAAC,gCAAgCrC,OAAO,KAAK,CAAC;EAChE,IAAI;IACF,MAAMyB,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAA+B;MAC1DhH,IAAI,EAAE,GAAG0B,IAAI,eAAeuE,OAAO;IACrC,CAAC,CAAC;IACFY,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,MAAMhE,IAAI,GAAGwE,IAAI,CAACa,WAAW;IAC7BpG,OAAO,CAACC,GAAG,CAACC,cAAK,CAACE,IAAI,CAAC,WAAWW,IAAI,CAAC+C,OAAO,EAAE,CAAC,CAAC;IAClD9D,OAAO,CAACC,GAAG,CAAC,CAAC;IACba,uBAAuB,CAACC,IAAI,CAAC;EAC/B,CAAC,CAAC,OAAOiE,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEJ,MAAM8B,OAAO,GAAG,IAAIlB,kBAAO,CAAC,MAAM,CAAC,CAChCzE,WAAW,CAAC,gEAAgE,CAAC,CAC7EwF,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC,CACxCA,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC,CACzC1F,MAAM,CAAC,OAAOkC,EAAU,EAAEC,EAAU,KAAK;EACxC,MAAMgB,EAAE,GAAG,IAAAyB,cAAO,EAAC,qBAAqB1C,EAAE,QAAQC,EAAE,KAAK,CAAC;EAC1D,IAAI;IACF,MAAM,CAAC2D,EAAE,EAAEC,EAAE,CAAC,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACjC,IAAA3C,kBAAU,EAA+B;MACvChH,IAAI,EAAE,GAAG0B,IAAI,eAAekE,EAAE;IAChC,CAAC,CAAC,EACF,IAAAoB,kBAAU,EAA+B;MACvChH,IAAI,EAAE,GAAG0B,IAAI,eAAemE,EAAE;IAChC,CAAC,CAAC,CACH,CAAC;IACFgB,EAAE,CAACK,IAAI,CAAC,CAAC;IACT/E,OAAO,CAACC,GAAG,CAACsD,gBAAgB,CAAC8D,EAAE,CAACjB,WAAW,EAAEkB,EAAE,CAAClB,WAAW,EAAE3C,EAAE,EAAEC,EAAE,CAAC,CAAC;EACvE,CAAC,CAAC,OAAOsB,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEJ,MAAMmC,SAAS,GAAG,IAAIvB,kBAAO,CAAC,QAAQ,CAAC,CACpCzE,WAAW,CAAC,+CAA+C,CAAC,CAC5DiG,cAAc,CAAC,eAAe,EAAE,0BAA0B,CAAC,CAC3DA,cAAc,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAC7DnG,MAAM,CAAC,MAAOgF,IAAyC,IAAK;EAC3D,MAAM7B,EAAE,GAAG,IAAAyB,cAAO,EAAC,gCAAgCI,IAAI,CAACzC,OAAO,KAAK,CAAC;EACrE,IAAI;IACF,MAAMyB,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAA+B;MAC1DhH,IAAI,EAAE,GAAG0B,IAAI,eAAegH,IAAI,CAACzC,OAAO;IAC1C,CAAC,CAAC;IACFY,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,MAAMhE,IAAI,GAAGwE,IAAI,CAACa,WAAW;IAC7B,MAAMuB,UAAU,GAAGf,IAAI,CAACC,SAAS,CAC/B;MACE7F,OAAO,EAAED,IAAI,CAACC,OAAO;MACrBK,SAAS,EAAEN,IAAI,CAACM,SAAS;MACzBC,OAAO,EAAEP,IAAI,CAACO,OAAO;MACrBa,OAAO,EAAEpB,IAAI,CAACoB;IAChB,CAAC,EACD,IAAI,EACJ,CACF,CAAC;IACD,MAAMyF,OAAO,GAAG/J,IAAI,CAACgK,OAAO,CAACtB,IAAI,CAACuB,MAAM,CAAC;IACzCnK,EAAE,CAACoK,aAAa,CAACH,OAAO,EAAED,UAAU,EAAE,MAAM,CAAC;IAC7C,IAAAT,cAAO,EAAC,oBAAoBX,IAAI,CAACzC,OAAO,OAAO8D,OAAO,EAAE,CAAC;EAC3D,CAAC,CAAC,OAAO5C,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEJ,MAAM0C,WAAW,GAAG,IAAI9B,kBAAO,CAAC,UAAU,CAAC,CACxCzE,WAAW,CAAC,gEAAgE,CAAC,CAC7EF,MAAM,CAAC,YAAY;EAClB,MAAMmD,EAAE,GAAG,IAAAyB,cAAO,EAAC,0BAA0B,CAAC;EAC9C,IAAI;IACF,MAAMZ,IAAI,GAAG,MAAM,IAAAV,kBAAU,EAAkC;MAC7DhH,IAAI,EAAE,GAAG0B,IAAI,QAAQ;MACrBuF,MAAM,EAAE,MAAM;MACdU,IAAI,EAAE;QAAEC,KAAK,EAAE,CAAC;MAAE;IACpB,CAAC,CAAC;IACFf,EAAE,CAACK,IAAI,CAAC,CAAC;IAET,MAAMhB,YAAY,GAAGwB,IAAI,CAACxB,YAAY,IAAI,EAAE;IAC5C,MAAMI,MAAM,GAAGJ,YAAY,CAACC,IAAI,CAAErF,CAAC,IAAKA,CAAC,CAACwF,MAAM,CAAC;IACjD,IAAI,CAACA,MAAM,EAAE;MACX,IAAAe,YAAK,EAAC,0DAA0D,CAAC;MACjEE,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;IACjB;IAEA,MAAM2C,QAAQ,GAAGlE,YAAY,CAC1B0C,MAAM,CAAE9H,CAAC,IAAK,CAACA,CAAC,CAACwF,MAAM,IAAI+D,MAAM,CAACvJ,CAAC,CAACmF,OAAO,CAAC,GAAGoE,MAAM,CAAC/D,MAAM,CAAEL,OAAO,CAAC,CAAC,CACvEqE,IAAI,CAAC,CAAC9E,CAAC,EAAEG,CAAC,KAAK0E,MAAM,CAAC1E,CAAC,CAACM,OAAO,CAAC,GAAGoE,MAAM,CAAC7E,CAAC,CAACS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,IAAI,CAACmE,QAAQ,EAAE;MACb,IAAA/C,YAAK,EAAC,qCAAqCf,MAAM,CAAEL,OAAO,GAAG,CAAC;MAC9DsB,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;IACjB;IAEA,MAAM8C,GAAG,GAAG,IAAAjC,cAAO,EAAC,2BAA2B8B,QAAQ,CAACnE,OAAO,KAAK,CAAC;IACrE,MAAM,IAAAe,kBAAU,EAAC;MACfhH,IAAI,EAAE,GAAG0B,IAAI,aAAa0I,QAAQ,CAACnE,OAAO,EAAE;MAC5CgB,MAAM,EAAE;IACV,CAAC,CAAC;IACFsD,GAAG,CAACrD,IAAI,CAAC,CAAC;IACV,IAAAmC,cAAO,EAAC,mBAAmBe,QAAQ,CAACnE,OAAO,UAAUK,MAAM,CAACL,OAAO,GAAG,CAAC;EACzE,CAAC,CAAC,OAAOkB,IAAI,EAAE;IACbN,EAAE,CAACK,IAAI,CAAC,CAAC;IACT,IAAAG,YAAK,EAAEF,IAAI,CAAWP,OAAO,CAAC;IAC9BW,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;;AAEJ;;AAEA,MAAM+C,SAAS,GAAG,IAAInC,kBAAO,CAAC,QAAQ,CAAC,CACpCzE,WAAW,CACV,sEACF,CAAC,CACAF,MAAM,CAAC,YAAY;EAClB,IAAI;IACF,MAAM4D,qBAAqB,CAAC,CAAC;EAC/B,CAAC,CAAC,OAAOH,IAAI,EAAE;IACb,MAAMsD,GAAG,GAAItD,IAAI,CAAWP,OAAO,IAAI,EAAE;IACzC,IAAI6D,GAAG,CAACC,QAAQ,CAAC,cAAc,CAAC,IAAID,GAAG,CAACC,QAAQ,CAAC,YAAY,CAAC,EAAE;MAC9DvI,OAAO,CAACC,GAAG,CAACC,cAAK,CAACK,GAAG,CAAC,QAAQ,CAAC,CAAC;MAChC6E,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;IACjB;IACAtF,OAAO,CAACkF,KAAK,CAAChF,cAAK,CAAC6C,GAAG,CAAC,oBAAoB,GAAGuF,GAAG,CAAC,CAAC;IACpDlD,OAAO,CAACE,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC;AAEG,MAAMkD,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAG,IAAItC,kBAAO,CAAC,cAAc,CAAC,CAC3DzE,WAAW,CAAC,wBAAwB,CAAC,CACrCF,MAAM,CAAC,YAAyB;EAC/B,IAAI,CAACmH,UAAU,CAAC,CAAC;AACnB,CAAC,CAAC,CACDC,UAAU,CAACN,SAAS,CAAC,CACrBM,UAAU,CAAC1C,YAAY,CAAC,CACxB0C,UAAU,CAACtC,OAAO,CAAC,CACnBsC,UAAU,CAAC3B,WAAW,CAAC,CACvB2B,UAAU,CAACxB,MAAM,CAAC,CAClBwB,UAAU,CAACvB,OAAO,CAAC,CACnBuB,UAAU,CAAClB,SAAS,CAAC,CACrBkB,UAAU,CAACX,WAAW,CAAC","ignoreList":[]}
@@ -4,15 +4,74 @@ exports.__esModule = true;
4
4
  exports.loginCommand = void 0;
5
5
  var _commander = require("commander");
6
6
  var _auth = require("../auth");
7
+ var _secretStore = require("../auth/secretStore");
7
8
  var _print = require("../utils/print");
8
- const loginCommand = exports.loginCommand = new _commander.Command('login').description('Authenticate with the Web5 platform').option('--api-key <key>', 'authenticate using an API key instead of browser flow').action(async opts => {
9
+ // ── login status ──────────────────────────────────────────────────────────────
10
+
11
+ const statusCmd = new _commander.Command('status').description('Show current authentication status').action(async () => {
9
12
  try {
10
- // Env var takes precedence over the flag
11
- const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;
12
- await (0, _auth.login)(apiKey);
13
+ const creds = await (0, _secretStore.readCredentials)();
14
+ if (!creds) {
15
+ if ((0, _print.isJsonMode)()) {
16
+ console.log(JSON.stringify({
17
+ authenticated: false
18
+ }));
19
+ } else {
20
+ (0, _print.info)('Not authenticated. Run `web5 login` to sign in.');
21
+ }
22
+ return;
23
+ }
24
+ const authMethod = creds.api_key ? 'api-key' : 'device-flow';
25
+ const siteId = creds.site_id ?? null;
26
+ const expiresAt = creds.expires_at ? new Date(creds.expires_at).toISOString() : null;
27
+ const expired = creds.expires_at ? creds.expires_at < Date.now() : false;
28
+ if ((0, _print.isJsonMode)()) {
29
+ console.log(JSON.stringify({
30
+ authenticated: true,
31
+ authMethod,
32
+ siteId,
33
+ expiresAt,
34
+ expired
35
+ }));
36
+ return;
37
+ }
38
+ (0, _print.success)('Authenticated');
39
+ (0, _print.info)(`Method: ${authMethod}`);
40
+ if (siteId) {
41
+ (0, _print.info)(`Site ID: ${siteId}`);
42
+ }
43
+ if (expiresAt) {
44
+ (0, _print.info)(`Expires: ${expiresAt}${expired ? ' (expired)' : ''}`);
45
+ }
46
+ } catch (err_) {
47
+ (0, _print.error)(err_ instanceof Error ? err_.message : String(err_));
48
+ process.exit(1);
49
+ }
50
+ });
51
+
52
+ // ── login switch-site ─────────────────────────────────────────────────────────
53
+
54
+ const switchSiteCmd = new _commander.Command('switch-site').description('Switch to a different web5 site (interactive picker)').action(async () => {
55
+ try {
56
+ await (0, _auth.switchSite)();
13
57
  } catch (err_) {
14
58
  (0, _print.error)(err_ instanceof Error ? err_.message : String(err_));
15
59
  process.exit(1);
16
60
  }
17
61
  });
62
+
63
+ // ── login (root) ──────────────────────────────────────────────────────────────
64
+
65
+ const loginCommand = exports.loginCommand = new _commander.Command('login').description('Authenticate with the Web5 platform').option('--api-key <key>', 'Authenticate using an API key instead of browser flow').option('--logs', 'Enable verbose debug logging for the auth flow').option('--site-id <msid>', 'Site ID (msid) to scope the session to (skips interactive prompt)').option('--no-browser', 'Skip opening the browser — print the verification URL instead').action(async opts => {
66
+ try {
67
+ const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;
68
+ await (0, _auth.login)(apiKey, opts.logs ?? false, {
69
+ siteId: opts.siteId,
70
+ noBrowser: !opts.browser
71
+ });
72
+ } catch (err_) {
73
+ (0, _print.error)(err_ instanceof Error ? err_.message : String(err_));
74
+ process.exit(1);
75
+ }
76
+ }).addCommand(statusCmd).addCommand(switchSiteCmd);
18
77
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_commander","require","_auth","_print","loginCommand","exports","Command","description","option","action","opts","apiKey","process","env","WEB5_API_KEY","login","err_","error","Error","message","String","exit"],"sources":["../../../src/commands/login.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { login } from '../auth';\nimport { error } from '../utils/print';\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with the Web5 platform')\n .option(\n '--api-key <key>',\n 'authenticate using an API key instead of browser flow',\n )\n .action(async (opts: { apiKey?: string }) => {\n try {\n // Env var takes precedence over the flag\n const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;\n await login(apiKey);\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":";;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEO,MAAMG,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG,IAAIE,kBAAO,CAAC,OAAO,CAAC,CAC7CC,WAAW,CAAC,qCAAqC,CAAC,CAClDC,MAAM,CACL,iBAAiB,EACjB,uDACF,CAAC,CACAC,MAAM,CAAC,MAAOC,IAAyB,IAAK;EAC3C,IAAI;IACF;IACA,MAAMC,MAAM,GAAGC,OAAO,CAACC,GAAG,CAACC,YAAY,IAAIJ,IAAI,CAACC,MAAM;IACtD,MAAM,IAAAI,WAAK,EAACJ,MAAM,CAAC;EACrB,CAAC,CAAC,OAAOK,IAAI,EAAE;IACb,IAAAC,YAAK,EAACD,IAAI,YAAYE,KAAK,GAAGF,IAAI,CAACG,OAAO,GAAGC,MAAM,CAACJ,IAAI,CAAC,CAAC;IAC1DJ,OAAO,CAACS,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_commander","require","_auth","_secretStore","_print","statusCmd","Command","description","action","creds","readCredentials","isJsonMode","console","log","JSON","stringify","authenticated","info","authMethod","api_key","siteId","site_id","expiresAt","expires_at","Date","toISOString","expired","now","success","err_","error","Error","message","String","process","exit","switchSiteCmd","switchSite","loginCommand","exports","option","opts","apiKey","env","WEB5_API_KEY","login","logs","noBrowser","browser","addCommand"],"sources":["../../../src/commands/login.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { login, switchSite } from '../auth';\nimport { readCredentials } from '../auth/secretStore';\nimport { error, success, info, isJsonMode } from '../utils/print';\n\n// ── login status ──────────────────────────────────────────────────────────────\n\nconst statusCmd = new Command('status')\n .description('Show current authentication status')\n .action(async () => {\n try {\n const creds = await readCredentials();\n if (!creds) {\n if (isJsonMode()) {\n console.log(JSON.stringify({ authenticated: false }));\n } else {\n info('Not authenticated. Run `web5 login` to sign in.');\n }\n return;\n }\n\n const authMethod = creds.api_key ? 'api-key' : 'device-flow';\n const siteId = creds.site_id ?? null;\n const expiresAt = creds.expires_at\n ? new Date(creds.expires_at).toISOString()\n : null;\n const expired = creds.expires_at ? creds.expires_at < Date.now() : false;\n\n if (isJsonMode()) {\n console.log(\n JSON.stringify({\n authenticated: true,\n authMethod,\n siteId,\n expiresAt,\n expired,\n }),\n );\n return;\n }\n\n success('Authenticated');\n info(`Method: ${authMethod}`);\n if (siteId) {\n info(`Site ID: ${siteId}`);\n }\n if (expiresAt) {\n info(`Expires: ${expiresAt}${expired ? ' (expired)' : ''}`);\n }\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n\n// ── login switch-site ─────────────────────────────────────────────────────────\n\nconst switchSiteCmd = new Command('switch-site')\n .description('Switch to a different web5 site (interactive picker)')\n .action(async () => {\n try {\n await switchSite();\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n\n// ── login (root) ──────────────────────────────────────────────────────────────\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with the Web5 platform')\n .option(\n '--api-key <key>',\n 'Authenticate using an API key instead of browser flow',\n )\n .option('--logs', 'Enable verbose debug logging for the auth flow')\n .option(\n '--site-id <msid>',\n 'Site ID (msid) to scope the session to (skips interactive prompt)',\n )\n .option(\n '--no-browser',\n 'Skip opening the browser — print the verification URL instead',\n )\n .action(\n async (opts: {\n apiKey?: string;\n logs?: boolean;\n siteId?: string;\n browser: boolean;\n }) => {\n try {\n const apiKey = process.env.WEB5_API_KEY ?? opts.apiKey;\n await login(apiKey, opts.logs ?? false, {\n siteId: opts.siteId,\n noBrowser: !opts.browser,\n });\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n },\n )\n .addCommand(statusCmd)\n .addCommand(switchSiteCmd);\n"],"mappings":"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","ignoreList":[]}