@voltade/volty 0.1.13 → 0.1.15

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 (2) hide show
  1. package/dist/volty.js +67 -25
  2. package/package.json +1 -1
package/dist/volty.js CHANGED
@@ -1,21 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // bin/volty.ts
4
- import { existsSync as existsSync3, mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "node:fs";
4
+ import { existsSync as existsSync3, mkdirSync as mkdirSync4, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "node:fs";
5
5
  import { homedir as homedir3 } from "node:os";
6
6
  import { join as join4 } from "node:path";
7
7
 
8
- // ../shared/ops/retired-prefix.ts
9
- function retiredPrefix(retired, argv) {
10
- for (let n = Math.min(argv.length, 4);n >= 1; n--) {
11
- const name = argv.slice(0, n).join(" ");
12
- const replacement = retired[name];
13
- if (replacement !== undefined)
14
- return { name, replacement };
15
- }
16
- return null;
17
- }
18
-
19
8
  // src/api.ts
20
9
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
21
10
  import { tmpdir } from "node:os";
@@ -58,7 +47,7 @@ async function fetchCatalog(ctx, env, useCache = true) {
58
47
  if (useCache && existsSync(path)) {
59
48
  try {
60
49
  const cached = JSON.parse(readFileSync(path, "utf8"));
61
- if (Date.now() - cached.at < CATALOG_TTL_MS && cached.renamed)
50
+ if (Date.now() - cached.at < CATALOG_TTL_MS && cached.renamed && cached.inApp)
62
51
  return cached;
63
52
  } catch {}
64
53
  }
@@ -69,11 +58,12 @@ async function fetchCatalog(ctx, env, useCache = true) {
69
58
  const ops = res.body.catalog;
70
59
  const retired = res.body.retired ?? {};
71
60
  const renamed = res.body.renamed ?? {};
61
+ const inApp = res.body.inApp ?? {};
72
62
  try {
73
63
  mkdirSync(tmpdir(), { recursive: true });
74
- writeFileSync(path, JSON.stringify({ at: Date.now(), ops, retired, renamed }));
64
+ writeFileSync(path, JSON.stringify({ at: Date.now(), ops, retired, renamed, inApp }));
75
65
  } catch {}
76
- return { ops, retired, renamed };
66
+ return { ops, retired, renamed, inApp };
77
67
  }
78
68
  async function fetchOrgs(ctx, env, useCache = true) {
79
69
  const path = join(tmpdir(), `volty-orgs-${env}.json`);
@@ -275,7 +265,7 @@ async function logout(config, env) {
275
265
  }
276
266
 
277
267
  // src/dispatch.ts
278
- import { readFileSync as readFileSync3 } from "node:fs";
268
+ import { readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "node:fs";
279
269
 
280
270
  // ../shared/ops/flag-parse.ts
281
271
  function acceptsNull(prop) {
@@ -375,9 +365,29 @@ function parseFlagTokens(props, rest, UsageError) {
375
365
  return { input, json };
376
366
  }
377
367
 
368
+ // ../shared/ops/retired-prefix.ts
369
+ function retiredPrefix(retired, argv) {
370
+ for (let n = Math.min(argv.length, 4);n >= 1; n--) {
371
+ const name = argv.slice(0, n).join(" ");
372
+ const replacement = retired[name];
373
+ if (replacement !== undefined)
374
+ return { name, replacement };
375
+ }
376
+ return null;
377
+ }
378
+
378
379
  // src/dispatch.ts
379
380
  class CliUsageError extends Error {
380
381
  }
382
+ function missMessage(catalog, argv) {
383
+ const inApp = retiredPrefix(catalog.inApp, argv);
384
+ if (inApp)
385
+ return `\`${inApp.name}\` is not run from here. ${inApp.replacement}`;
386
+ const retired = retiredPrefix(catalog.retired, argv);
387
+ if (retired)
388
+ return `\`${retired.name}\` is retired: ${retired.replacement}`;
389
+ return `unknown operation '${argv.join(" ")}' — run \`volty help\``;
390
+ }
381
391
  function resolveOp(catalog, argv) {
382
392
  const byName = new Map(catalog.ops.map((c) => [c.name, c]));
383
393
  for (let n = Math.min(argv.length, 4);n >= 1; n--) {
@@ -413,6 +423,22 @@ async function runOp(ctx, op, input) {
413
423
  const res = await apiFetch(ctx, pathForOp(op.name), { method: "POST", body: input });
414
424
  return { status: res.status, ok: res.ok, body: res.body };
415
425
  }
426
+ function saveOutFile(body, path) {
427
+ const structured = body.structuredContent;
428
+ if (typeof structured?.fileBase64 !== "string") {
429
+ throw new CliUsageError("--out: this operation returns no file, so there is nothing to write");
430
+ }
431
+ const bytes = Buffer.from(structured.fileBase64, "base64");
432
+ try {
433
+ writeFileSync3(path, bytes);
434
+ } catch (err) {
435
+ throw new CliUsageError(`--out: cannot write ${path} (${err.code ?? "error"})`);
436
+ }
437
+ return {
438
+ body: { ...body, structuredContent: { ...structured, fileBase64: path } },
439
+ line: `Wrote ${path} (${bytes.byteLength} bytes)`
440
+ };
441
+ }
416
442
 
417
443
  // src/format.ts
418
444
  function flagType(prop) {
@@ -540,7 +566,7 @@ function decideProposal(ctx, proposalId, decision, reason) {
540
566
  }
541
567
 
542
568
  // src/update.ts
543
- import { mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
569
+ import { mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "node:fs";
544
570
  import { homedir as homedir2 } from "node:os";
545
571
  import { dirname as dirname2, join as join3 } from "node:path";
546
572
  var CACHE_PATH = join3(homedir2(), ".config", "volty", "update-check.json");
@@ -574,7 +600,7 @@ function readCache() {
574
600
  function writeCache(cache) {
575
601
  try {
576
602
  mkdirSync3(dirname2(CACHE_PATH), { recursive: true });
577
- writeFileSync3(CACHE_PATH, `${JSON.stringify(cache)}
603
+ writeFileSync4(CACHE_PATH, `${JSON.stringify(cache)}
578
604
  `);
579
605
  } catch {}
580
606
  }
@@ -813,7 +839,7 @@ function handleSkill(rest) {
813
839
  fail("bundled SKILL.md not found — reinstall the @voltade/volty package");
814
840
  const destDir = join4(homedir3(), ".claude", "skills", "volty-cli-ops");
815
841
  mkdirSync4(destDir, { recursive: true });
816
- writeFileSync4(join4(destDir, "SKILL.md"), readFileSync5(source, "utf8"));
842
+ writeFileSync5(join4(destDir, "SKILL.md"), readFileSync5(source, "utf8"));
817
843
  process.stdout.write(`Installed the volty-cli-ops skill → ${join4(destDir, "SKILL.md")}
818
844
  `);
819
845
  }
@@ -870,10 +896,7 @@ async function main() {
870
896
  }
871
897
  const resolved = resolveOp(catalog, argv);
872
898
  if (!resolved) {
873
- const retired = retiredPrefix(catalog.retired, argv);
874
- if (retired)
875
- fail(`\`${retired.name}\` is retired: ${retired.replacement}`);
876
- fail(`unknown operation '${argv.join(" ")}' — run \`volty help\``);
899
+ fail(missMessage(catalog, argv));
877
900
  }
878
901
  if (resolved.renamedFrom)
879
902
  process.stderr.write(`${resolved.renamedFrom} is now ${resolved.op.name}
@@ -883,9 +906,12 @@ async function main() {
883
906
  `);
884
907
  return;
885
908
  }
909
+ const out = takeValue(resolved.rest, "--out");
910
+ if (out.rest.length !== resolved.rest.length && !out.value)
911
+ fail("--out needs a path, as in --out=./logo.png");
886
912
  let parsed;
887
913
  try {
888
- parsed = parseFlags(resolved.op, resolved.rest);
914
+ parsed = parseFlags(resolved.op, out.rest);
889
915
  } catch (err) {
890
916
  if (err instanceof CliUsageError)
891
917
  fail(err.message);
@@ -894,7 +920,23 @@ async function main() {
894
920
  const result = await runOp(ctx, resolved.op, parsed.input);
895
921
  if (!result.ok)
896
922
  failResult(resolved.op.name, result.body, result.status, parsed.json);
897
- process.stdout.write(`${renderResult(result.body, parsed.json)}
923
+ if (out.value === undefined) {
924
+ process.stdout.write(`${renderResult(result.body, parsed.json)}
925
+ `);
926
+ return;
927
+ }
928
+ let saved;
929
+ try {
930
+ saved = saveOutFile(result.body, out.value);
931
+ } catch (err) {
932
+ if (err instanceof CliUsageError)
933
+ fail(err.message);
934
+ throw err;
935
+ }
936
+ process.stdout.write(`${renderResult(saved.body, parsed.json)}
937
+ `);
938
+ if (!parsed.json)
939
+ process.stdout.write(`${saved.line}
898
940
  `);
899
941
  }
900
942
  main().catch((err) => fail(err instanceof Error ? err.message : String(err)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltade/volty",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Remote CLI for the Volty platform — run operations, trigger real agent wakes, and inspect LLM I/O over an API key.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",