@opvs-ai/cli 0.27.12 → 0.27.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -513,10 +513,6 @@ opvs tools call @opvs-ai/agentboard list_tasks \
513
513
  opvs tools call agentboard list_tasks --args-file ./params.json
514
514
  ```
515
515
 
516
- `opvs tools pin <skill>` is reserved for a CLI-facing pin endpoint that
517
- ships in W2.1; until then it emits a stub error. For agent sessions, the
518
- gateway plugin `skill_pin` tool is the canonical surface.
519
-
520
516
  ### Workspace
521
517
 
522
518
  ```bash
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "stamp_version": 1,
3
3
  "package": "@opvs-ai/cli",
4
- "version": "0.27.12",
5
- "source_digest": "4e768b2578da43456ef4559d04d22b9e28d11c6e0bbfd80bfaae525c90a792d4",
6
- "source_files": 63,
7
- "built_at": "2026-11-07T17:08:15.618Z",
4
+ "version": "0.27.14",
5
+ "source_digest": "781354d996f327159c949e1c3d24a9c5247c9c81c5a90ec57e0b56452374bdd7",
6
+ "source_files": 65,
7
+ "built_at": "2026-11-15T12:45:41.460Z",
8
8
  "node": "v22.23.4"
9
9
  }
@@ -0,0 +1,28 @@
1
+ /** Dynamic `opvs <skill> <method> [--param value]` commands. */
2
+ import { Command } from "commander";
3
+ interface GenericClient {
4
+ get(path: string): Promise<Response>;
5
+ post(path: string, body: unknown): Promise<Response>;
6
+ }
7
+ interface MethodParam {
8
+ type?: string;
9
+ required?: boolean;
10
+ description?: string;
11
+ enum?: unknown[];
12
+ }
13
+ interface GenericDependencies {
14
+ createClient?: (workspace?: string) => GenericClient;
15
+ printResponse?: (response: Response) => Promise<void>;
16
+ }
17
+ export type GenericPreparation = "manual" | "registered" | "error" | "none";
18
+ /** How the root help points at the generic path. */
19
+ export declare const GENERIC_SKILL_HELP = "\nInstalled skills:\n opvs <skill> <method> [--param value]... call a method of an installed skill\n opvs <skill> --help list the skill's methods";
20
+ export declare function nearestNames(value: string, names: string[], limit?: number): string[];
21
+ export declare function coerceParam(name: string, value: unknown, param: MethodParam): unknown;
22
+ /**
23
+ * Register the requested installed skill just before Commander parses argv.
24
+ * Hand-made root commands and `help` are checked first, with no network call:
25
+ * they always win a name collision.
26
+ */
27
+ export declare function prepareGenericSkillCommand(program: Command, argv: string[], dependencies?: GenericDependencies): Promise<GenericPreparation>;
28
+ export {};
@@ -0,0 +1,295 @@
1
+ /** Dynamic `opvs <skill> <method> [--param value]` commands. */
2
+ import { Option } from "commander";
3
+ import { createClient } from "@opvs-ai/core";
4
+ import { printResponse } from "../lib/format.js";
5
+ import { readFileParam } from "../lib/file-param.js";
6
+ /** Commander's own help command, `opvs help [command]`. */
7
+ const HELP = "help";
8
+ /** How the root help points at the generic path. */
9
+ export const GENERIC_SKILL_HELP = `
10
+ Installed skills:
11
+ opvs <skill> <method> [--param value]... call a method of an installed skill
12
+ opvs <skill> --help list the skill's methods`;
13
+ function optionName(token) {
14
+ return token.slice(2).split("=", 1)[0];
15
+ }
16
+ /**
17
+ * The first word, and the workspace read the way Commander's root parser reads
18
+ * it: `-w/--workspace` counts wherever it stands, so `opvs agentboard listBoards
19
+ * -w acme` looks the skill up, and calls it, in acme.
20
+ */
21
+ function argvRoot(argv) {
22
+ let name;
23
+ let index = -1;
24
+ let workspace;
25
+ for (let at = 0; at < argv.length; at++) {
26
+ const token = argv[at];
27
+ if (token === "--")
28
+ break;
29
+ if (token === "-w" || token === "--workspace") {
30
+ workspace = argv[++at];
31
+ }
32
+ else if (token.startsWith("--workspace=")) {
33
+ workspace = token.slice("--workspace=".length);
34
+ }
35
+ else if (name === undefined && !token.startsWith("-")) {
36
+ name = token;
37
+ index = at;
38
+ }
39
+ }
40
+ return { name, index, workspace };
41
+ }
42
+ /** A hand-made command or alias of that name: it always wins, with no network call. */
43
+ function isHandMade(program, word) {
44
+ return program.commands.some((command) => command.name() === word || command.aliases().includes(word));
45
+ }
46
+ /** The commands `opvs help` lists, `help` among them. */
47
+ function commandNames(program) {
48
+ return program.createHelp().visibleCommands(program).map((command) => command.name());
49
+ }
50
+ /** What went wrong, in the route's own words when it gave some. */
51
+ function reason(error) {
52
+ const detail = error?.detail;
53
+ if (typeof detail === "string")
54
+ return detail;
55
+ return error instanceof Error ? error.message : String(error);
56
+ }
57
+ function hasMethod(skill, name) {
58
+ return Object.prototype.hasOwnProperty.call(skill.methods, name);
59
+ }
60
+ function paramsOf(method) {
61
+ if (!Array.isArray(method.params))
62
+ return method.params ?? {};
63
+ return Object.fromEntries(method.params.map(({ name, ...param }) => [name, param]));
64
+ }
65
+ function guidanceLine(method) {
66
+ if (typeof method.guidance === "string")
67
+ return method.guidance.split("\n", 1)[0];
68
+ return method.guidance?.use?.split("\n", 1)[0] ?? method.description ?? "Call this skill method";
69
+ }
70
+ function distance(left, right) {
71
+ const row = Array.from({ length: right.length + 1 }, (_, index) => index);
72
+ for (let i = 1; i <= left.length; i++) {
73
+ let diagonal = row[0];
74
+ row[0] = i;
75
+ for (let j = 1; j <= right.length; j++) {
76
+ const above = row[j];
77
+ row[j] = Math.min(row[j] + 1, row[j - 1] + 1, diagonal + (left[i - 1].toLowerCase() === right[j - 1].toLowerCase() ? 0 : 1));
78
+ diagonal = above;
79
+ }
80
+ }
81
+ return row[right.length];
82
+ }
83
+ export function nearestNames(value, names, limit = 3) {
84
+ return [...names]
85
+ .sort((a, b) => distance(value, a) - distance(value, b) || a.localeCompare(b))
86
+ .slice(0, limit);
87
+ }
88
+ export function coerceParam(name, value, param) {
89
+ if (Array.isArray(value))
90
+ return value.map((item) => coerceParam(name, item, { ...param, type: "string" }));
91
+ const raw = String(value);
92
+ switch (param.type) {
93
+ case "integer": {
94
+ const parsed = Number(raw);
95
+ if (!Number.isInteger(parsed))
96
+ throw new Error(`--${name} must be an integer`);
97
+ return parsed;
98
+ }
99
+ case "number": {
100
+ const parsed = Number(raw);
101
+ if (!Number.isFinite(parsed))
102
+ throw new Error(`--${name} must be a number`);
103
+ return parsed;
104
+ }
105
+ case "boolean":
106
+ if (["true", "1", "yes"].includes(raw.toLowerCase()))
107
+ return true;
108
+ if (["false", "0", "no"].includes(raw.toLowerCase()))
109
+ return false;
110
+ throw new Error(`--${name} must be true or false`);
111
+ case "object":
112
+ try {
113
+ const parsed = JSON.parse(raw);
114
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
115
+ throw new Error();
116
+ return parsed;
117
+ }
118
+ catch {
119
+ throw new Error(`--${name} must be a JSON object`);
120
+ }
121
+ case "array":
122
+ try {
123
+ const parsed = JSON.parse(raw);
124
+ if (!Array.isArray(parsed))
125
+ throw new Error();
126
+ return parsed;
127
+ }
128
+ catch {
129
+ return raw.split(",").map((item) => item.trim());
130
+ }
131
+ case "file":
132
+ return readFileParam(`${name}=${raw}`)[1];
133
+ default:
134
+ return raw;
135
+ }
136
+ }
137
+ async function installedSkills(client) {
138
+ const installedResponse = await client.get("/api/v1/marketplace/installed");
139
+ const installed = (await installedResponse.json());
140
+ const active = (installed.items ?? []).filter((item) => !item.state || item.state === "active");
141
+ const details = await Promise.all(active.map(async (item) => {
142
+ const vendor = encodeURIComponent(item.vendor);
143
+ const name = encodeURIComponent(item.name);
144
+ // The package detail sends `methods_index` only on ?full=1 (SP-60); a reply
145
+ // without it is an error, never a skill with no methods.
146
+ const response = await client.get(`/api/v1/registry/packages/${vendor}/${name}?full=1`);
147
+ const detail = (await response.json());
148
+ if (!detail.methods_index || typeof detail.methods_index !== "object") {
149
+ throw new Error(`registry reply for ${item.vendor}/${item.name} has no methods_index; ask with full=1`);
150
+ }
151
+ return { item, methods: detail.methods_index };
152
+ }));
153
+ const result = new Map();
154
+ for (const { item, methods } of details) {
155
+ for (const [skillName, skillMethods] of Object.entries(methods)) {
156
+ if (result.has(skillName)) {
157
+ throw new Error(`Installed packages expose duplicate skill '${skillName}'`);
158
+ }
159
+ result.set(skillName, { installId: item.id, name: skillName, methods: skillMethods });
160
+ }
161
+ }
162
+ return result;
163
+ }
164
+ async function discover(workspace, dependencies) {
165
+ const client = (dependencies.createClient ?? createClient)(workspace);
166
+ return { client, skills: await installedSkills(client) };
167
+ }
168
+ function acceptedParams(method) {
169
+ return Object.keys(paramsOf(method));
170
+ }
171
+ /** The first `--name` the method does not take; a value after its flag is skipped. */
172
+ function unknownOption(argv, start, method) {
173
+ const accepted = new Set([...acceptedParams(method), "workspace"]);
174
+ for (let at = start; at < argv.length; at++) {
175
+ const token = argv[at];
176
+ if (token === "--")
177
+ break;
178
+ if (!token.startsWith("--"))
179
+ continue;
180
+ const name = optionName(token);
181
+ if (name === HELP)
182
+ continue;
183
+ if (!accepted.has(name))
184
+ return name;
185
+ if (!token.includes("="))
186
+ at++;
187
+ }
188
+ return undefined;
189
+ }
190
+ function optionDescription(name, param) {
191
+ const details = [param.description, param.enum?.length ? `accepted: ${param.enum.join(", ")}` : undefined]
192
+ .filter(Boolean)
193
+ .join("; ");
194
+ return details || `${name} (${param.type ?? "string"})`;
195
+ }
196
+ function registerSkill(program, skill, client, print) {
197
+ const group = program.command(skill.name).description(`Methods provided by installed skill ${skill.name}`);
198
+ // `opvs <skill> help [method]` answers like `opvs tasks help` does.
199
+ group.helpCommand(true);
200
+ group.action(() => group.help());
201
+ for (const [methodName, descriptor] of Object.entries(skill.methods)) {
202
+ const method = group.command(methodName).description(guidanceLine(descriptor));
203
+ const params = paramsOf(descriptor);
204
+ // Commander stores `--dry-run` as `dryRun`; the body key stays the schema's name.
205
+ const keys = new Map();
206
+ for (const [name, param] of Object.entries(params)) {
207
+ const option = new Option(`--${name} <value>`, optionDescription(name, param));
208
+ if (param.required)
209
+ option.makeOptionMandatory();
210
+ method.addOption(option);
211
+ keys.set(name, option.attributeName());
212
+ }
213
+ method.action(async (options) => {
214
+ const body = {};
215
+ try {
216
+ for (const [name, param] of Object.entries(params)) {
217
+ const value = options[keys.get(name)];
218
+ if (value !== undefined)
219
+ body[name] = coerceParam(name, value, param);
220
+ }
221
+ const route = `/api/v1/marketplace/runtime/${encodeURIComponent(skill.installId)}`
222
+ + `/${encodeURIComponent(skill.name)}/${encodeURIComponent(methodName)}`;
223
+ await print(await client.post(route, body));
224
+ }
225
+ catch (error) {
226
+ console.error(reason(error));
227
+ process.exitCode = 1;
228
+ }
229
+ });
230
+ }
231
+ }
232
+ /**
233
+ * Register the requested installed skill just before Commander parses argv.
234
+ * Hand-made root commands and `help` are checked first, with no network call:
235
+ * they always win a name collision.
236
+ */
237
+ export async function prepareGenericSkillCommand(program, argv, dependencies = {}) {
238
+ const root = argvRoot(argv);
239
+ const word = root.name;
240
+ if (!word)
241
+ return "none";
242
+ if (isHandMade(program, word))
243
+ return "manual";
244
+ const print = dependencies.printResponse ?? printResponse;
245
+ if (word === HELP) {
246
+ // Commander answers `opvs help [command]`. Only `opvs help <skill>` needs the
247
+ // skill registered first; when it cannot be found, Commander's answer stands.
248
+ const topic = argvRoot(argv.slice(root.index + 1)).name;
249
+ if (!topic || topic === HELP || isHandMade(program, topic))
250
+ return "manual";
251
+ const found = await discover(root.workspace, dependencies).catch(() => undefined);
252
+ const skill = found?.skills.get(topic);
253
+ if (!found || !skill)
254
+ return "manual";
255
+ registerSkill(program, skill, found.client, print);
256
+ return "registered";
257
+ }
258
+ const found = await discover(root.workspace, dependencies).catch((error) => {
259
+ // Offline, signed out or a failing registry: the word may still be a skill,
260
+ // so say what failed, and name the commands it may be a typo of.
261
+ console.error(`'${word}' is not an opvs command, and the installed skills could not be listed to look for it: ${reason(error)}`);
262
+ console.error(`Nearest commands: ${nearestNames(word, commandNames(program)).join(", ") || "none"}`);
263
+ process.exitCode = 1;
264
+ return undefined;
265
+ });
266
+ if (!found)
267
+ return "error";
268
+ const { client, skills } = found;
269
+ const skill = skills.get(word);
270
+ if (!skill) {
271
+ const nearest = nearestNames(word, [...commandNames(program), ...skills.keys()]);
272
+ console.error(`Unknown command or skill '${word}'. Nearest: ${nearest.join(", ") || "none"}`);
273
+ process.exitCode = 2;
274
+ return "error";
275
+ }
276
+ const method = argvRoot(argv.slice(root.index + 1)).name;
277
+ if (method && !hasMethod(skill, method) && method !== HELP) {
278
+ const nearest = nearestNames(method, Object.keys(skill.methods));
279
+ console.error(`Unknown method '${method}' for ${skill.name}. Nearest methods: ${nearest.join(", ") || "none"}`);
280
+ process.exitCode = 2;
281
+ return "error";
282
+ }
283
+ if (method && hasMethod(skill, method)) {
284
+ const unknown = unknownOption(argv, root.index + 1, skill.methods[method]);
285
+ if (unknown) {
286
+ const accepted = acceptedParams(skill.methods[method]);
287
+ console.error(`Unknown parameter '--${unknown}'. Accepted parameters: ${accepted.map((name) => `--${name}`).join(", ") || "none"}`);
288
+ process.exitCode = 2;
289
+ return "error";
290
+ }
291
+ }
292
+ registerSkill(program, skill, client, print);
293
+ return "registered";
294
+ }
295
+ //# sourceMappingURL=generic-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-skill.js","sourceRoot":"","sources":["../../src/commands/generic-skill.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,25 @@
9
9
  * opvs mail install-hooks claude-code → writes Stop hook to
10
10
  * ~/.claude/settings.json
11
11
  * opvs mail install-hooks codex|antigravity → writes MCP server entry
12
- * to ~/.codex/config.json
12
+ * to ~/.codex/config.toml
13
13
  * or ~/.antigravity/...
14
14
  * opvs mail daemon install/start/stop/status → systemd-user (Linux) or
15
15
  * launchd (macOS) wrapper
16
16
  * around ``mail watch``
17
17
  */
18
18
  import { Command } from "commander";
19
+ /** Codex's config root is overrideable, but its filename is always TOML. */
20
+ export declare function codexConfigPath(home?: string): string;
21
+ /**
22
+ * Does TOML already define the EXACT MCP server name `opvs`?
23
+ *
24
+ * This is intentionally a bounded text check instead of a new TOML parser.
25
+ * Comment-only lines do not count. The name boundary is structural, so
26
+ * `opvs-belt`, `opvsbelt`, and `opvs_2` remain distinct server names.
27
+ */
28
+ export declare function hasCodexMCPServer(content: string): boolean;
29
+ /** Append Codex's OPVS MCP block without rewriting any existing TOML line. */
30
+ export declare function installCodexMCPEntry(target: string): {
31
+ merged: boolean;
32
+ };
19
33
  export declare function registerInstallCommands(mail: Command): void;
@@ -9,7 +9,7 @@
9
9
  * opvs mail install-hooks claude-code → writes Stop hook to
10
10
  * ~/.claude/settings.json
11
11
  * opvs mail install-hooks codex|antigravity → writes MCP server entry
12
- * to ~/.codex/config.json
12
+ * to ~/.codex/config.toml
13
13
  * or ~/.antigravity/...
14
14
  * opvs mail daemon install/start/stop/status → systemd-user (Linux) or
15
15
  * launchd (macOS) wrapper
@@ -111,6 +111,58 @@ function installMCPEntry(target, key = "opvs", opts = {}) {
111
111
  writeFileSync(target, JSON.stringify(cfg, null, 2) + "\n");
112
112
  return { merged: true };
113
113
  }
114
+ /** Codex's config root is overrideable, but its filename is always TOML. */
115
+ export function codexConfigPath(home = homedir()) {
116
+ return process.env.CODEX_HOME
117
+ ? join(process.env.CODEX_HOME, "config.toml")
118
+ : join(home, ".codex", "config.toml");
119
+ }
120
+ /**
121
+ * Does TOML already define the EXACT MCP server name `opvs`?
122
+ *
123
+ * This is intentionally a bounded text check instead of a new TOML parser.
124
+ * Comment-only lines do not count. The name boundary is structural, so
125
+ * `opvs-belt`, `opvsbelt`, and `opvs_2` remain distinct server names.
126
+ */
127
+ export function hasCodexMCPServer(content) {
128
+ let section = "";
129
+ for (const raw of content.split(/\r?\n/)) {
130
+ const line = raw.trim();
131
+ if (!line || line.startsWith("#"))
132
+ continue;
133
+ const header = line.match(/^\[\s*([^\]]+)\s*\](?:\s*#.*)?$/);
134
+ if (header) {
135
+ section = header[1].trim();
136
+ if (section === "mcp_servers.opvs" || section === 'mcp_servers."opvs"') {
137
+ return true;
138
+ }
139
+ continue;
140
+ }
141
+ if (/^mcp_servers\.opvs\./.test(line))
142
+ return true;
143
+ if (section === "mcp_servers" &&
144
+ /^(?:opvs|"opvs")\s*=/.test(line)) {
145
+ return true;
146
+ }
147
+ }
148
+ return false;
149
+ }
150
+ /** Append Codex's OPVS MCP block without rewriting any existing TOML line. */
151
+ export function installCodexMCPEntry(target) {
152
+ const existing = existsSync(target) ? readFileSync(target, "utf8") : "";
153
+ if (hasCodexMCPServer(existing))
154
+ return { merged: false };
155
+ const block = '[mcp_servers.opvs]\ncommand = "npx"\nargs = ["-y", "@opvs-ai/mcp"]\n';
156
+ const separator = existing.length === 0
157
+ ? ""
158
+ : existing.endsWith("\n")
159
+ ? "\n"
160
+ : "\n\n";
161
+ if (!existsSync(dirname(target)))
162
+ mkdirSync(dirname(target), { recursive: true });
163
+ writeFileSync(target, existing + separator + block);
164
+ return { merged: true };
165
+ }
114
166
  // ── daemon ──────────────────────────────────────────────────────────────
115
167
  function getOpvsBin() {
116
168
  // Resolve the real ``opvs`` binary path so the unit/plist is portable
@@ -207,8 +259,8 @@ export function registerInstallCommands(mail) {
207
259
  break;
208
260
  }
209
261
  case "codex": {
210
- target = opts.target ?? join(home, ".codex", "config.json");
211
- const { merged } = installMCPEntry(target);
262
+ target = opts.target ?? codexConfigPath(home);
263
+ const { merged } = installCodexMCPEntry(target);
212
264
  result = { client, target, merged };
213
265
  break;
214
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -145,6 +145,44 @@ function printMessage(msg, opts) {
145
145
  // =============================================================
146
146
  export function registerMailCommands(program) {
147
147
  const mail = program.command("mail").description("OPVS Protocol messaging");
148
+ mail
149
+ .command("setup")
150
+ .description("Set up this machine's shared mail store and run its first sync")
151
+ .option("--from <address>", "Set up this configured agent identity")
152
+ .option("-y, --yes", YES_HELP)
153
+ .action(async (opts) => {
154
+ const wsSlug = program.opts().workspace;
155
+ const cfg = getEffectiveConfig(wsSlug);
156
+ const setupOptions = {
157
+ workspaceSlug: cfg.workspace_slug,
158
+ from: opts.from,
159
+ };
160
+ const createSyncClient = (apiKey) => {
161
+ const client = createClient(wsSlug);
162
+ const authHeader = { "X-OPVS-API-Key": apiKey };
163
+ return {
164
+ get: (path, headers) => client.get(path, { ...authHeader, ...(headers ?? {}) }),
165
+ patch: (path, body, headers) => client.patch(path, body, { ...authHeader, ...(headers ?? {}) }),
166
+ };
167
+ };
168
+ const inspection = await mailstore.setupMailStore(setupOptions, {
169
+ createSyncClient,
170
+ });
171
+ if (inspection.status === "refused") {
172
+ console.error(`Error: ${inspection.message}${inspection.fix ? `\nFix: ${inspection.fix}` : ""}`);
173
+ process.exit(1);
174
+ }
175
+ // The plan is printed before the confirmation gate. Off a TTY the
176
+ // shared helper refuses unless --yes was explicit, and no setup write or
177
+ // sync has happened yet.
178
+ printJson(inspection);
179
+ await confirmOrExit(`Set up OPVS mail for ${inspection.address}?`, opts.yes, "Nothing has been written yet");
180
+ const result = await mailstore.setupMailStore({ ...setupOptions, confirm: true }, { createSyncClient });
181
+ printJson(result);
182
+ if (result.status === "refused" || result.status === "sync_failed") {
183
+ process.exit(1);
184
+ }
185
+ });
148
186
  // ── server-facing: send / reply / inbox / read / resolve / claim ───
149
187
  mail
150
188
  .command("send <address> <message>")
@@ -497,6 +535,29 @@ export function registerMailCommands(program) {
497
535
  process.exit(1);
498
536
  }
499
537
  });
538
+ mail
539
+ .command("contacts")
540
+ .description("List agent mail contacts in your own brand")
541
+ .option("--limit <n>", "Max results", "50")
542
+ .option("--offset <n>", "Rows to skip", "0")
543
+ .action(async (opts) => {
544
+ const wsSlug = program.opts().workspace;
545
+ const cfg = getEffectiveConfig(wsSlug);
546
+ try {
547
+ const client = createClient(wsSlug);
548
+ const url = buildUrl("/api/v1/opvs/contacts", { limit: opts.limit, offset: opts.offset }, cfg.format);
549
+ const resolved = resolveAgentIdentity(cfg.workspace_slug);
550
+ const res = resolved
551
+ ? await client.get(url, { "X-OPVS-API-Key": resolved.identity.api_key })
552
+ : await client.get(url);
553
+ await printResponse(res);
554
+ }
555
+ catch (err) {
556
+ const e = err;
557
+ console.error(`Error: ${e.detail || "Failed to list contacts"}`);
558
+ process.exit(1);
559
+ }
560
+ });
500
561
  mail
501
562
  .command("register")
502
563
  .description("Register a new OPVS agent address (auto-saves api_key to ~/.opvs/config.json)")