@kweaver-ai/kweaver-sdk 0.5.0 → 0.5.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 (66) hide show
  1. package/README.md +6 -1
  2. package/README.zh.md +5 -0
  3. package/dist/api/agent-chat.d.ts +1 -1
  4. package/dist/api/agent-chat.js +4 -4
  5. package/dist/api/agent-list.d.ts +35 -0
  6. package/dist/api/agent-list.js +86 -12
  7. package/dist/api/bkn-backend.d.ts +60 -0
  8. package/dist/api/bkn-backend.js +103 -10
  9. package/dist/api/conversations.d.ts +6 -3
  10. package/dist/api/conversations.js +26 -27
  11. package/dist/api/dataflow.js +1 -10
  12. package/dist/api/datasources.js +1 -10
  13. package/dist/api/dataviews.js +1 -10
  14. package/dist/api/headers.d.ts +9 -0
  15. package/dist/api/headers.js +25 -0
  16. package/dist/api/knowledge-networks.d.ts +41 -0
  17. package/dist/api/knowledge-networks.js +69 -22
  18. package/dist/api/ontology-query.d.ts +14 -1
  19. package/dist/api/ontology-query.js +63 -49
  20. package/dist/api/semantic-search.js +2 -12
  21. package/dist/api/skills.d.ts +141 -0
  22. package/dist/api/skills.js +216 -0
  23. package/dist/api/vega.d.ts +63 -0
  24. package/dist/api/vega.js +131 -10
  25. package/dist/auth/oauth.d.ts +5 -1
  26. package/dist/auth/oauth.js +293 -94
  27. package/dist/cli.js +29 -4
  28. package/dist/client.d.ts +3 -0
  29. package/dist/client.js +4 -0
  30. package/dist/commands/agent.d.ts +33 -1
  31. package/dist/commands/agent.js +721 -49
  32. package/dist/commands/auth.js +211 -21
  33. package/dist/commands/bkn-ops.d.ts +77 -0
  34. package/dist/commands/bkn-ops.js +1056 -0
  35. package/dist/commands/bkn-query.d.ts +14 -0
  36. package/dist/commands/bkn-query.js +370 -0
  37. package/dist/commands/bkn-schema.d.ts +135 -0
  38. package/dist/commands/bkn-schema.js +1461 -0
  39. package/dist/commands/bkn-utils.d.ts +36 -0
  40. package/dist/commands/bkn-utils.js +102 -0
  41. package/dist/commands/bkn.d.ts +7 -113
  42. package/dist/commands/bkn.js +175 -2429
  43. package/dist/commands/dataview.d.ts +7 -0
  44. package/dist/commands/dataview.js +38 -2
  45. package/dist/commands/ds.d.ts +1 -0
  46. package/dist/commands/ds.js +8 -1
  47. package/dist/commands/import-csv.d.ts +2 -0
  48. package/dist/commands/import-csv.js +3 -2
  49. package/dist/commands/skill.d.ts +26 -0
  50. package/dist/commands/skill.js +524 -0
  51. package/dist/commands/vega.js +371 -14
  52. package/dist/config/jwt.d.ts +6 -0
  53. package/dist/config/jwt.js +21 -0
  54. package/dist/config/store.d.ts +37 -5
  55. package/dist/config/store.js +363 -30
  56. package/dist/index.d.ts +6 -1
  57. package/dist/index.js +5 -1
  58. package/dist/resources/bkn.d.ts +4 -0
  59. package/dist/resources/bkn.js +4 -0
  60. package/dist/resources/conversations.d.ts +5 -2
  61. package/dist/resources/conversations.js +17 -3
  62. package/dist/resources/skills.d.ts +47 -0
  63. package/dist/resources/skills.js +47 -0
  64. package/dist/resources/vega.d.ts +11 -0
  65. package/dist/resources/vega.js +37 -1
  66. package/package.json +1 -1
@@ -0,0 +1,524 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { basename, dirname, resolve } from "node:path";
3
+ import { ensureValidToken, formatHttpError, with401RefreshRetry } from "../auth/oauth.js";
4
+ import { resolveBusinessDomain } from "../config/store.js";
5
+ import { deleteSkill, downloadSkill, fetchSkillContent, fetchSkillFile, getSkill, getSkillContentIndex, installSkillArchive, listSkillMarket, listSkills, readSkillFile, registerSkillContent, registerSkillZip, updateSkillStatus, } from "../api/skills.js";
6
+ function printSkillHelp(subcommand) {
7
+ if (subcommand === "list") {
8
+ console.log(`kweaver skill list [--name kw] [--source src] [--status status] [--create-user user]
9
+ [--page N] [--page-size N|--limit N] [--all] [-bd value] [--pretty|--compact]`);
10
+ return;
11
+ }
12
+ if (subcommand === "market") {
13
+ console.log(`kweaver skill market [--name kw] [--source src] [--page N] [--page-size N|--limit N]
14
+ [--all] [-bd value] [--pretty|--compact]`);
15
+ return;
16
+ }
17
+ if (subcommand === "get") {
18
+ console.log("kweaver skill get <skill-id> [-bd value] [--pretty|--compact]");
19
+ return;
20
+ }
21
+ if (subcommand === "register") {
22
+ console.log(`kweaver skill register (--content-file <path> | --zip-file <path>)
23
+ [--source src] [--extend-info json] [-bd value] [--pretty|--compact]`);
24
+ return;
25
+ }
26
+ if (subcommand === "status") {
27
+ console.log("kweaver skill status <skill-id> <unpublish|published|offline> [-bd value] [--pretty|--compact]");
28
+ return;
29
+ }
30
+ if (subcommand === "delete") {
31
+ console.log("kweaver skill delete <skill-id> [-y|--yes] [-bd value] [--pretty|--compact]");
32
+ return;
33
+ }
34
+ if (subcommand === "content") {
35
+ console.log("kweaver skill content <skill-id> [--raw] [--output file] [-bd value] [--pretty|--compact]");
36
+ return;
37
+ }
38
+ if (subcommand === "read-file") {
39
+ console.log("kweaver skill read-file <skill-id> <rel-path> [--raw] [--output file] [-bd value] [--pretty|--compact]");
40
+ return;
41
+ }
42
+ if (subcommand === "download") {
43
+ console.log("kweaver skill download <skill-id> [--output file] [-bd value] [--pretty|--compact]");
44
+ return;
45
+ }
46
+ if (subcommand === "install") {
47
+ console.log("kweaver skill install <skill-id> [directory] [--force] [-bd value] [--pretty|--compact]");
48
+ return;
49
+ }
50
+ console.log(`kweaver skill
51
+
52
+ Subcommands:
53
+ list [--name kw] [--status status] [--page N] [--page-size N] [-bd value]
54
+ market [--name kw] [--source src] [--page N] [--page-size N] [-bd value]
55
+ get <skill-id> [-bd value]
56
+ register --content-file <path> | --zip-file <path> [--source src] [--extend-info json]
57
+ status <skill-id> <unpublish|published|offline> [-bd value]
58
+ delete <skill-id> [-y] [-bd value]
59
+ content <skill-id> [--raw] [--output file] [-bd value]
60
+ read-file <skill-id> <rel-path> [--raw] [--output file] [-bd value]
61
+ download <skill-id> [--output file] [-bd value]
62
+ install <skill-id> [directory] [--force] [-bd value]
63
+
64
+ Examples:
65
+ kweaver skill list --name kweaver
66
+ kweaver skill register --zip-file ./demo-skill.zip --source upload_zip
67
+ kweaver skill content skill-123 --raw
68
+ kweaver skill read-file skill-123 references/guide.md --output ./guide.md
69
+ kweaver skill install skill-123 ./skills/demo-skill --force`);
70
+ }
71
+ function format(value, pretty) {
72
+ return JSON.stringify(value, null, pretty ? 2 : 0);
73
+ }
74
+ function parseJsonFlag(value, flag) {
75
+ if (!value)
76
+ return undefined;
77
+ try {
78
+ const parsed = JSON.parse(value);
79
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
80
+ throw new Error(`${flag} must be a JSON object`);
81
+ }
82
+ return parsed;
83
+ }
84
+ catch (error) {
85
+ throw new Error(error instanceof Error && error.message.includes("must be a JSON object")
86
+ ? error.message
87
+ : `Invalid JSON for ${flag}: ${error instanceof Error ? error.message : String(error)}`);
88
+ }
89
+ }
90
+ function ensureDirectoryForFile(path) {
91
+ const dir = dirname(path);
92
+ mkdirSync(dir, { recursive: true });
93
+ }
94
+ function parseBaseArgs(args, start = 0) {
95
+ let businessDomain = "";
96
+ let pretty = true;
97
+ const normalized = args.slice(0, start);
98
+ for (let i = start; i < args.length; i += 1) {
99
+ const arg = args[i];
100
+ if (arg === "-bd" || arg === "--biz-domain") {
101
+ businessDomain = args[i + 1] ?? "";
102
+ if (!businessDomain || businessDomain.startsWith("-")) {
103
+ throw new Error("Missing value for biz-domain flag");
104
+ }
105
+ i += 1;
106
+ continue;
107
+ }
108
+ if (arg === "--pretty")
109
+ continue;
110
+ if (arg === "--compact") {
111
+ pretty = false;
112
+ continue;
113
+ }
114
+ normalized.push(arg);
115
+ }
116
+ return {
117
+ opts: { businessDomain: businessDomain || resolveBusinessDomain(), pretty },
118
+ args: normalized,
119
+ };
120
+ }
121
+ export function parseSkillListArgs(args) {
122
+ let page = 1;
123
+ let pageSize = 30;
124
+ let all = false;
125
+ let name;
126
+ let source;
127
+ let status;
128
+ let createUser;
129
+ let sortBy;
130
+ let sortOrder;
131
+ const base = parseBaseArgs(args);
132
+ for (let i = 0; i < base.args.length; i += 1) {
133
+ const arg = base.args[i];
134
+ if (arg === "--help" || arg === "-h")
135
+ throw new Error("help");
136
+ if (arg === "--page") {
137
+ page = parseInt(base.args[i + 1] ?? "1", 10) || 1;
138
+ i += 1;
139
+ continue;
140
+ }
141
+ if (arg === "--page-size" || arg === "--limit") {
142
+ pageSize = parseInt(base.args[i + 1] ?? "30", 10) || 30;
143
+ i += 1;
144
+ continue;
145
+ }
146
+ if (arg === "--all") {
147
+ all = true;
148
+ continue;
149
+ }
150
+ if (arg === "--name") {
151
+ name = base.args[i + 1];
152
+ i += 1;
153
+ continue;
154
+ }
155
+ if (arg === "--source") {
156
+ source = base.args[i + 1];
157
+ i += 1;
158
+ continue;
159
+ }
160
+ if (arg === "--status") {
161
+ const value = base.args[i + 1];
162
+ if (value !== "unpublish" && value !== "published" && value !== "offline") {
163
+ throw new Error("Invalid --status. Expected unpublish|published|offline");
164
+ }
165
+ status = value;
166
+ i += 1;
167
+ continue;
168
+ }
169
+ if (arg === "--create-user") {
170
+ createUser = base.args[i + 1];
171
+ i += 1;
172
+ continue;
173
+ }
174
+ if (arg === "--sort-by") {
175
+ const value = base.args[i + 1];
176
+ if (value !== "create_time" && value !== "update_time" && value !== "name") {
177
+ throw new Error("Invalid --sort-by. Expected create_time|update_time|name");
178
+ }
179
+ sortBy = value;
180
+ i += 1;
181
+ continue;
182
+ }
183
+ if (arg === "--sort-order") {
184
+ const value = (base.args[i + 1] ?? "").toLowerCase();
185
+ if (value !== "asc" && value !== "desc") {
186
+ throw new Error("Invalid --sort-order. Expected asc|desc");
187
+ }
188
+ sortOrder = value;
189
+ i += 1;
190
+ continue;
191
+ }
192
+ throw new Error(`Unsupported skill list argument: ${arg}`);
193
+ }
194
+ return { ...base.opts, page, pageSize, all, name, source, status, createUser, sortBy, sortOrder };
195
+ }
196
+ export function parseSkillRegisterArgs(args) {
197
+ let contentFile;
198
+ let zipFile;
199
+ let source;
200
+ let extendInfo;
201
+ const base = parseBaseArgs(args);
202
+ for (let i = 0; i < base.args.length; i += 1) {
203
+ const arg = base.args[i];
204
+ if (arg === "--help" || arg === "-h")
205
+ throw new Error("help");
206
+ if (arg === "--content-file") {
207
+ contentFile = base.args[i + 1];
208
+ i += 1;
209
+ continue;
210
+ }
211
+ if (arg === "--zip-file") {
212
+ zipFile = base.args[i + 1];
213
+ i += 1;
214
+ continue;
215
+ }
216
+ if (arg === "--source") {
217
+ source = base.args[i + 1];
218
+ i += 1;
219
+ continue;
220
+ }
221
+ if (arg === "--extend-info") {
222
+ extendInfo = parseJsonFlag(base.args[i + 1], "--extend-info");
223
+ i += 1;
224
+ continue;
225
+ }
226
+ throw new Error(`Unsupported skill register argument: ${arg}`);
227
+ }
228
+ if ((contentFile ? 1 : 0) + (zipFile ? 1 : 0) !== 1) {
229
+ throw new Error("Use exactly one of --content-file or --zip-file");
230
+ }
231
+ return { ...base.opts, contentFile, zipFile, source, extendInfo };
232
+ }
233
+ function parseSkillContentArgs(args) {
234
+ const skillId = args[0];
235
+ if (!skillId || skillId.startsWith("-")) {
236
+ throw new Error("Missing skill-id");
237
+ }
238
+ let fetchRaw = false;
239
+ let output;
240
+ const base = parseBaseArgs(args, 1);
241
+ for (let i = 1; i < base.args.length; i += 1) {
242
+ const arg = base.args[i];
243
+ if (arg === "--help" || arg === "-h")
244
+ throw new Error("help");
245
+ if (arg === "--raw") {
246
+ fetchRaw = true;
247
+ continue;
248
+ }
249
+ if (arg === "--output" || arg === "-o") {
250
+ output = base.args[i + 1];
251
+ i += 1;
252
+ continue;
253
+ }
254
+ throw new Error(`Unsupported skill content argument: ${arg}`);
255
+ }
256
+ return { ...base.opts, skillId, fetchRaw, output };
257
+ }
258
+ function parseSkillGetArgs(args) {
259
+ const skillId = args[0];
260
+ if (!skillId || skillId.startsWith("-")) {
261
+ throw new Error("Missing skill-id");
262
+ }
263
+ const base = parseBaseArgs(args, 1);
264
+ if (base.args.length !== 1) {
265
+ throw new Error(`Unsupported skill get argument: ${base.args[1]}`);
266
+ }
267
+ return { ...base.opts, skillId };
268
+ }
269
+ function parseSkillReadFileArgs(args) {
270
+ const skillId = args[0];
271
+ const relPath = args[1];
272
+ if (!skillId || skillId.startsWith("-"))
273
+ throw new Error("Missing skill-id");
274
+ if (!relPath || relPath.startsWith("-"))
275
+ throw new Error("Missing rel-path");
276
+ const parsed = parseSkillContentArgs([skillId, ...args.slice(2)]);
277
+ return { ...parsed, relPath };
278
+ }
279
+ function parseSkillDownloadArgs(args) {
280
+ const skillId = args[0];
281
+ if (!skillId || skillId.startsWith("-"))
282
+ throw new Error("Missing skill-id");
283
+ let output;
284
+ const base = parseBaseArgs(args, 1);
285
+ for (let i = 1; i < base.args.length; i += 1) {
286
+ const arg = base.args[i];
287
+ if (arg === "--help" || arg === "-h")
288
+ throw new Error("help");
289
+ if (arg === "--output" || arg === "-o") {
290
+ output = base.args[i + 1];
291
+ i += 1;
292
+ continue;
293
+ }
294
+ throw new Error(`Unsupported skill download argument: ${arg}`);
295
+ }
296
+ return { ...base.opts, skillId, output };
297
+ }
298
+ function parseSkillInstallArgs(args) {
299
+ const skillId = args[0];
300
+ const directory = args[1] && !args[1].startsWith("-") ? args[1] : skillId;
301
+ if (!skillId || skillId.startsWith("-"))
302
+ throw new Error("Missing skill-id");
303
+ let force = false;
304
+ const start = directory === skillId ? 1 : 2;
305
+ const base = parseBaseArgs(args, start);
306
+ for (let i = start; i < base.args.length; i += 1) {
307
+ const arg = base.args[i];
308
+ if (arg === "--help" || arg === "-h")
309
+ throw new Error("help");
310
+ if (arg === "--force") {
311
+ force = true;
312
+ continue;
313
+ }
314
+ throw new Error(`Unsupported skill install argument: ${arg}`);
315
+ }
316
+ return { ...base.opts, skillId, directory, force };
317
+ }
318
+ function parseStatusArgs(args) {
319
+ const skillId = args[0];
320
+ const status = args[1];
321
+ if (!skillId || skillId.startsWith("-"))
322
+ throw new Error("Missing skill-id");
323
+ if (status !== "unpublish" && status !== "published" && status !== "offline") {
324
+ throw new Error("Missing or invalid status. Use unpublish|published|offline");
325
+ }
326
+ const base = parseBaseArgs(args, 2);
327
+ if (base.args.length !== 2) {
328
+ throw new Error(`Unsupported skill status argument: ${base.args[2]}`);
329
+ }
330
+ return { ...base.opts, skillId, status };
331
+ }
332
+ async function confirmDelete(skillId) {
333
+ process.stdout.write(`Delete skill ${skillId}? [y/N] `);
334
+ return new Promise((resolveConfirm) => {
335
+ process.stdin.once("data", (chunk) => {
336
+ const answer = chunk.toString().trim().toLowerCase();
337
+ resolveConfirm(answer === "y" || answer === "yes");
338
+ });
339
+ });
340
+ }
341
+ export async function runSkillCommand(args) {
342
+ const [subcommand, ...rest] = args;
343
+ if (!subcommand || subcommand === "--help" || subcommand === "-h") {
344
+ printSkillHelp();
345
+ return 0;
346
+ }
347
+ if (rest.includes("--help") || rest.includes("-h")) {
348
+ printSkillHelp(subcommand);
349
+ return 0;
350
+ }
351
+ try {
352
+ return await with401RefreshRetry(async () => {
353
+ const token = await ensureValidToken();
354
+ if (subcommand === "list") {
355
+ const opts = parseSkillListArgs(rest);
356
+ const result = await listSkills({
357
+ ...token,
358
+ businessDomain: opts.businessDomain,
359
+ page: opts.page,
360
+ pageSize: opts.pageSize,
361
+ all: opts.all,
362
+ name: opts.name,
363
+ source: opts.source,
364
+ status: opts.status,
365
+ createUser: opts.createUser,
366
+ sortBy: opts.sortBy,
367
+ sortOrder: opts.sortOrder,
368
+ });
369
+ console.log(format(result, opts.pretty));
370
+ return 0;
371
+ }
372
+ if (subcommand === "market") {
373
+ const opts = parseSkillListArgs(rest);
374
+ const result = await listSkillMarket({
375
+ ...token,
376
+ businessDomain: opts.businessDomain,
377
+ page: opts.page,
378
+ pageSize: opts.pageSize,
379
+ all: opts.all,
380
+ name: opts.name,
381
+ source: opts.source,
382
+ sortBy: opts.sortBy,
383
+ sortOrder: opts.sortOrder,
384
+ });
385
+ console.log(format(result, opts.pretty));
386
+ return 0;
387
+ }
388
+ if (subcommand === "get") {
389
+ const opts = parseSkillGetArgs(rest);
390
+ const result = await getSkill({ ...token, businessDomain: opts.businessDomain, skillId: opts.skillId });
391
+ console.log(format(result, opts.pretty));
392
+ return 0;
393
+ }
394
+ if (subcommand === "register") {
395
+ const opts = parseSkillRegisterArgs(rest);
396
+ if (opts.contentFile) {
397
+ const content = readFileSync(resolve(opts.contentFile), "utf8");
398
+ const result = await registerSkillContent({
399
+ ...token,
400
+ businessDomain: opts.businessDomain,
401
+ content,
402
+ source: opts.source,
403
+ extendInfo: opts.extendInfo,
404
+ });
405
+ console.log(format(result, opts.pretty));
406
+ return 0;
407
+ }
408
+ if (opts.zipFile) {
409
+ const bytes = new Uint8Array(readFileSync(resolve(opts.zipFile)));
410
+ const result = await registerSkillZip({
411
+ ...token,
412
+ businessDomain: opts.businessDomain,
413
+ source: opts.source,
414
+ extendInfo: opts.extendInfo,
415
+ filename: basename(resolve(opts.zipFile)),
416
+ bytes,
417
+ });
418
+ console.log(format(result, opts.pretty));
419
+ return 0;
420
+ }
421
+ }
422
+ if (subcommand === "status") {
423
+ const opts = parseStatusArgs(rest);
424
+ const result = await updateSkillStatus({ ...token, ...opts });
425
+ console.log(format(result, opts.pretty));
426
+ return 0;
427
+ }
428
+ if (subcommand === "delete") {
429
+ const skillId = rest[0];
430
+ if (!skillId || skillId.startsWith("-"))
431
+ throw new Error("Missing skill-id");
432
+ const yes = rest.includes("-y") || rest.includes("--yes");
433
+ const filtered = [skillId, ...rest.slice(1).filter((arg) => arg !== "-y" && arg !== "--yes")];
434
+ const opts = parseSkillGetArgs(filtered);
435
+ if (!yes) {
436
+ const confirmed = await confirmDelete(skillId);
437
+ if (!confirmed) {
438
+ console.error("Delete aborted.");
439
+ return 1;
440
+ }
441
+ }
442
+ const result = await deleteSkill({ ...token, businessDomain: opts.businessDomain, skillId });
443
+ console.log(format(result, opts.pretty));
444
+ return 0;
445
+ }
446
+ if (subcommand === "content") {
447
+ const opts = parseSkillContentArgs(rest);
448
+ if (opts.fetchRaw || opts.output) {
449
+ const content = await fetchSkillContent({
450
+ ...token,
451
+ businessDomain: opts.businessDomain,
452
+ skillId: opts.skillId,
453
+ });
454
+ if (opts.output) {
455
+ ensureDirectoryForFile(resolve(opts.output));
456
+ writeFileSync(resolve(opts.output), content, "utf8");
457
+ console.log(`Saved ${opts.skillId} content to ${resolve(opts.output)}`);
458
+ }
459
+ else {
460
+ process.stdout.write(content);
461
+ if (!content.endsWith("\n"))
462
+ process.stdout.write("\n");
463
+ }
464
+ return 0;
465
+ }
466
+ const result = await getSkillContentIndex({
467
+ ...token,
468
+ businessDomain: opts.businessDomain,
469
+ skillId: opts.skillId,
470
+ });
471
+ console.log(format(result, opts.pretty));
472
+ return 0;
473
+ }
474
+ if (subcommand === "read-file") {
475
+ const opts = parseSkillReadFileArgs(rest);
476
+ if (opts.fetchRaw || opts.output) {
477
+ const bytes = await fetchSkillFile({ ...token, skillId: opts.skillId, relPath: opts.relPath, businessDomain: opts.businessDomain });
478
+ if (opts.output) {
479
+ ensureDirectoryForFile(resolve(opts.output));
480
+ writeFileSync(resolve(opts.output), bytes);
481
+ console.log(`Saved ${opts.relPath} to ${resolve(opts.output)}`);
482
+ }
483
+ else {
484
+ process.stdout.write(Buffer.from(bytes));
485
+ }
486
+ return 0;
487
+ }
488
+ const result = await readSkillFile({ ...token, skillId: opts.skillId, relPath: opts.relPath, businessDomain: opts.businessDomain });
489
+ console.log(format(result, opts.pretty));
490
+ return 0;
491
+ }
492
+ if (subcommand === "download") {
493
+ const opts = parseSkillDownloadArgs(rest);
494
+ const result = await downloadSkill({
495
+ ...token,
496
+ businessDomain: opts.businessDomain,
497
+ skillId: opts.skillId,
498
+ });
499
+ const output = resolve(opts.output ?? result.fileName);
500
+ ensureDirectoryForFile(output);
501
+ writeFileSync(output, result.bytes);
502
+ console.log(`Saved ${opts.skillId} archive to ${output}`);
503
+ return 0;
504
+ }
505
+ if (subcommand === "install") {
506
+ const opts = parseSkillInstallArgs(rest);
507
+ const archive = await downloadSkill({
508
+ ...token,
509
+ businessDomain: opts.businessDomain,
510
+ skillId: opts.skillId,
511
+ });
512
+ const result = installSkillArchive({ bytes: archive.bytes, directory: opts.directory, force: opts.force });
513
+ console.log(`Installed ${opts.skillId} to ${result.directory}`);
514
+ return 0;
515
+ }
516
+ console.error(`Unknown skill subcommand: ${subcommand}`);
517
+ return 1;
518
+ });
519
+ }
520
+ catch (error) {
521
+ console.error(formatHttpError(error));
522
+ return 1;
523
+ }
524
+ }