@stamn/cli 0.1.0-alpha.4 → 0.1.0-alpha.6

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/dist/bin.js CHANGED
@@ -7,9 +7,13 @@ import {
7
7
  handleConfig,
8
8
  handleLogin,
9
9
  handleLogout,
10
+ handleServiceCreate,
11
+ handleServiceDelete,
12
+ handleServiceList,
13
+ handleServiceUpdate,
10
14
  handleStatus,
11
15
  handleUninstall
12
- } from "./chunk-GNL7D4HS.js";
16
+ } from "./chunk-Z2IAJQOV.js";
13
17
 
14
18
  // src/bin.ts
15
19
  import { Command } from "commander";
@@ -25,6 +29,15 @@ agent.command("select").description("Set active agent").argument("<nameOrId>", "
25
29
  agent.command("config").description("View or update agent configuration").option("--name <name>", "Agent display name").option("--personality", "Open editor to set agent personality").action(
26
30
  (opts) => handleConfig(opts, adapter)
27
31
  );
32
+ var service = program.command("service").description("Service storefront management");
33
+ service.command("list").description("List services for the active agent").action(() => handleServiceList({}, adapter));
34
+ service.command("create").description("Create a new service listing").requiredOption("--tag <tag>", "Service tag (lowercase, underscores)").requiredOption("--name <name>", "Display name").requiredOption("--description <desc>", "Service description").requiredOption("--price <price>", "Price in USDC (e.g. 5.00)").action(
35
+ (opts) => handleServiceCreate(opts, adapter)
36
+ );
37
+ service.command("update").description("Update a service listing").argument("<serviceId>", "Service ID").option("--name <name>", "New display name").option("--description <desc>", "New description").option("--price <price>", "New price in USDC").option("--active <bool>", "Set active status (true/false)").action(
38
+ (serviceId, opts) => handleServiceUpdate({ serviceId, ...opts }, adapter)
39
+ );
40
+ service.command("delete").description("Delete a service listing").argument("<serviceId>", "Service ID").action((serviceId) => handleServiceDelete({ serviceId }, adapter));
28
41
  program.command("status").description("Show connection status and server health").action(() => handleStatus(adapter));
29
42
  program.command("uninstall").description("Remove CLI").action(() => handleUninstall(adapter));
30
43
  program.parse();
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport {\n handleLogin,\n handleAgentRegister,\n handleAgentList,\n handleAgentSelect,\n handleLogout,\n handleConfig,\n handleStatus,\n handleUninstall,\n} from \"@/commands\";\nimport { createDefaultAdapter } from \"@/config\";\n\nconst adapter = createDefaultAdapter();\n\nconst program = new Command();\n\nprogram.name(\"stamn\").description(\"Stamn CLI\").version(\"0.1.0-alpha.0\");\n\nprogram\n .command(\"login\")\n .description(\"Authenticate with Stamn\")\n .action(() => handleLogin({}, adapter));\n\nprogram\n .command(\"logout\")\n .description(\"Clear auth session\")\n .action(() => handleLogout({}, adapter));\n\nconst agent = program.command(\"agent\").description(\"Agent management\");\n\nagent\n .command(\"register\")\n .description(\"Register a new agent or reconnect to an existing one\")\n .option(\"--name <name>\", \"Agent name\")\n .action((opts: { name?: string }) => handleAgentRegister(opts, adapter));\n\nagent\n .command(\"list\")\n .description(\"List agents under your account\")\n .action(() => handleAgentList({}, adapter));\n\nagent\n .command(\"select\")\n .description(\"Set active agent\")\n .argument(\"<nameOrId>\", \"Agent name or ID\")\n .action((nameOrId: string) => handleAgentSelect({ nameOrId }, adapter));\n\nagent\n .command(\"config\")\n .description(\"View or update agent configuration\")\n .option(\"--name <name>\", \"Agent display name\")\n .option(\"--personality\", \"Open editor to set agent personality\")\n .action((opts: { name?: string; personality?: boolean }) =>\n handleConfig(opts, adapter),\n );\n\nprogram\n .command(\"status\")\n .description(\"Show connection status and server health\")\n .action(() => handleStatus(adapter));\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove CLI\")\n .action(() => handleUninstall(adapter));\n\nprogram.parse();\n"],"mappings":";;;;;;;;;;;;;;AACA,SAAS,eAAe;AAaxB,IAAM,UAAU,qBAAqB;AAErC,IAAM,UAAU,IAAI,QAAQ;AAE5B,QAAQ,KAAK,OAAO,EAAE,YAAY,WAAW,EAAE,QAAQ,eAAe;AAEtE,QACG,QAAQ,OAAO,EACf,YAAY,yBAAyB,EACrC,OAAO,MAAM,YAAY,CAAC,GAAG,OAAO,CAAC;AAExC,QACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,MAAM,aAAa,CAAC,GAAG,OAAO,CAAC;AAEzC,IAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,kBAAkB;AAErE,MACG,QAAQ,UAAU,EAClB,YAAY,sDAAsD,EAClE,OAAO,iBAAiB,YAAY,EACpC,OAAO,CAAC,SAA4B,oBAAoB,MAAM,OAAO,CAAC;AAEzE,MACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,MAAM,gBAAgB,CAAC,GAAG,OAAO,CAAC;AAE5C,MACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,SAAS,cAAc,kBAAkB,EACzC,OAAO,CAAC,aAAqB,kBAAkB,EAAE,SAAS,GAAG,OAAO,CAAC;AAExE,MACG,QAAQ,QAAQ,EAChB,YAAY,oCAAoC,EAChD,OAAO,iBAAiB,oBAAoB,EAC5C,OAAO,iBAAiB,sCAAsC,EAC9D;AAAA,EAAO,CAAC,SACP,aAAa,MAAM,OAAO;AAC5B;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,OAAO,MAAM,aAAa,OAAO,CAAC;AAErC,QACG,QAAQ,WAAW,EACnB,YAAY,YAAY,EACxB,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAExC,QAAQ,MAAM;","names":[]}
1
+ {"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport {\n handleLogin,\n handleAgentRegister,\n handleAgentList,\n handleAgentSelect,\n handleLogout,\n handleConfig,\n handleStatus,\n handleUninstall,\n handleServiceList,\n handleServiceCreate,\n handleServiceUpdate,\n handleServiceDelete,\n} from \"@/commands\";\nimport { createDefaultAdapter } from \"@/config\";\n\nconst adapter = createDefaultAdapter();\n\nconst program = new Command();\n\nprogram.name(\"stamn\").description(\"Stamn CLI\").version(\"0.1.0-alpha.0\");\n\nprogram\n .command(\"login\")\n .description(\"Authenticate with Stamn\")\n .action(() => handleLogin({}, adapter));\n\nprogram\n .command(\"logout\")\n .description(\"Clear auth session\")\n .action(() => handleLogout({}, adapter));\n\nconst agent = program.command(\"agent\").description(\"Agent management\");\n\nagent\n .command(\"register\")\n .description(\"Register a new agent or reconnect to an existing one\")\n .option(\"--name <name>\", \"Agent name\")\n .action((opts: { name?: string }) => handleAgentRegister(opts, adapter));\n\nagent\n .command(\"list\")\n .description(\"List agents under your account\")\n .action(() => handleAgentList({}, adapter));\n\nagent\n .command(\"select\")\n .description(\"Set active agent\")\n .argument(\"<nameOrId>\", \"Agent name or ID\")\n .action((nameOrId: string) => handleAgentSelect({ nameOrId }, adapter));\n\nagent\n .command(\"config\")\n .description(\"View or update agent configuration\")\n .option(\"--name <name>\", \"Agent display name\")\n .option(\"--personality\", \"Open editor to set agent personality\")\n .action((opts: { name?: string; personality?: boolean }) =>\n handleConfig(opts, adapter),\n );\n\nconst service = program.command(\"service\").description(\"Service storefront management\");\n\nservice\n .command(\"list\")\n .description(\"List services for the active agent\")\n .action(() => handleServiceList({}, adapter));\n\nservice\n .command(\"create\")\n .description(\"Create a new service listing\")\n .requiredOption(\"--tag <tag>\", \"Service tag (lowercase, underscores)\")\n .requiredOption(\"--name <name>\", \"Display name\")\n .requiredOption(\"--description <desc>\", \"Service description\")\n .requiredOption(\"--price <price>\", \"Price in USDC (e.g. 5.00)\")\n .action((opts: { tag: string; name: string; description: string; price: string }) =>\n handleServiceCreate(opts, adapter),\n );\n\nservice\n .command(\"update\")\n .description(\"Update a service listing\")\n .argument(\"<serviceId>\", \"Service ID\")\n .option(\"--name <name>\", \"New display name\")\n .option(\"--description <desc>\", \"New description\")\n .option(\"--price <price>\", \"New price in USDC\")\n .option(\"--active <bool>\", \"Set active status (true/false)\")\n .action(\n (serviceId: string, opts: { name?: string; description?: string; price?: string; active?: string }) =>\n handleServiceUpdate({ serviceId, ...opts }, adapter),\n );\n\nservice\n .command(\"delete\")\n .description(\"Delete a service listing\")\n .argument(\"<serviceId>\", \"Service ID\")\n .action((serviceId: string) => handleServiceDelete({ serviceId }, adapter));\n\nprogram\n .command(\"status\")\n .description(\"Show connection status and server health\")\n .action(() => handleStatus(adapter));\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove CLI\")\n .action(() => handleUninstall(adapter));\n\nprogram.parse();\n"],"mappings":";;;;;;;;;;;;;;;;;;AACA,SAAS,eAAe;AAiBxB,IAAM,UAAU,qBAAqB;AAErC,IAAM,UAAU,IAAI,QAAQ;AAE5B,QAAQ,KAAK,OAAO,EAAE,YAAY,WAAW,EAAE,QAAQ,eAAe;AAEtE,QACG,QAAQ,OAAO,EACf,YAAY,yBAAyB,EACrC,OAAO,MAAM,YAAY,CAAC,GAAG,OAAO,CAAC;AAExC,QACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,MAAM,aAAa,CAAC,GAAG,OAAO,CAAC;AAEzC,IAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,kBAAkB;AAErE,MACG,QAAQ,UAAU,EAClB,YAAY,sDAAsD,EAClE,OAAO,iBAAiB,YAAY,EACpC,OAAO,CAAC,SAA4B,oBAAoB,MAAM,OAAO,CAAC;AAEzE,MACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,MAAM,gBAAgB,CAAC,GAAG,OAAO,CAAC;AAE5C,MACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,SAAS,cAAc,kBAAkB,EACzC,OAAO,CAAC,aAAqB,kBAAkB,EAAE,SAAS,GAAG,OAAO,CAAC;AAExE,MACG,QAAQ,QAAQ,EAChB,YAAY,oCAAoC,EAChD,OAAO,iBAAiB,oBAAoB,EAC5C,OAAO,iBAAiB,sCAAsC,EAC9D;AAAA,EAAO,CAAC,SACP,aAAa,MAAM,OAAO;AAC5B;AAEF,IAAM,UAAU,QAAQ,QAAQ,SAAS,EAAE,YAAY,+BAA+B;AAEtF,QACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,MAAM,kBAAkB,CAAC,GAAG,OAAO,CAAC;AAE9C,QACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,eAAe,eAAe,sCAAsC,EACpE,eAAe,iBAAiB,cAAc,EAC9C,eAAe,wBAAwB,qBAAqB,EAC5D,eAAe,mBAAmB,2BAA2B,EAC7D;AAAA,EAAO,CAAC,SACP,oBAAoB,MAAM,OAAO;AACnC;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,SAAS,eAAe,YAAY,EACpC,OAAO,iBAAiB,kBAAkB,EAC1C,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,mBAAmB,mBAAmB,EAC7C,OAAO,mBAAmB,gCAAgC,EAC1D;AAAA,EACC,CAAC,WAAmB,SAClB,oBAAoB,EAAE,WAAW,GAAG,KAAK,GAAG,OAAO;AACvD;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,SAAS,eAAe,YAAY,EACpC,OAAO,CAAC,cAAsB,oBAAoB,EAAE,UAAU,GAAG,OAAO,CAAC;AAE5E,QACG,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,OAAO,MAAM,aAAa,OAAO,CAAC;AAErC,QACG,QAAQ,WAAW,EACnB,YAAY,YAAY,EACxB,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAExC,QAAQ,MAAM;","names":[]}
@@ -13,7 +13,7 @@ async function handleLogin(_opts, adapter) {
13
13
  s2.stop("Session valid.");
14
14
  log.info("Already logged in.");
15
15
  outro("Run `stamn agent register` to create an agent, or `stamn agent list` to see existing ones.");
16
- return;
16
+ process.exit(0);
17
17
  } catch {
18
18
  s2.stop("Session expired.");
19
19
  log.warn("Existing session is invalid. Re-authenticating...");
@@ -38,6 +38,7 @@ ${label("Code:")} ${flow.userCode}`,
38
38
  log.success("Logged in successfully.");
39
39
  log.info(`Config written to ${adapter.getConfigPath()}`);
40
40
  outro("Now run `stamn agent register` to create or reconnect an agent.");
41
+ process.exit(0);
41
42
  } catch (err) {
42
43
  s.stop("Failed.");
43
44
  cancel(`Login failed: ${err.message}`);
@@ -81,7 +82,7 @@ async function handleAgentRegister(opts, adapter) {
81
82
  adapter.writeConfig({ agentId: match.id, agentName: match.name });
82
83
  log2.success(`Agent "${match.name}" (${match.id}) already exists. Selected as active.`);
83
84
  outro2("Done!");
84
- return;
85
+ process.exit(0);
85
86
  }
86
87
  s.start("Registering agent...");
87
88
  const participant = await client.participants.create({ name });
@@ -89,6 +90,7 @@ async function handleAgentRegister(opts, adapter) {
89
90
  adapter.writeConfig({ agentId: participant.id, agentName: participant.name });
90
91
  log2.success(`Agent "${participant.name}" (${participant.id})`);
91
92
  outro2("Done!");
93
+ process.exit(0);
92
94
  } catch (err) {
93
95
  s.stop("Failed.");
94
96
  cancel2(`Registration failed: ${err.message}`);
@@ -114,12 +116,13 @@ async function handleAgentList(_opts, adapter) {
114
116
  s.stop(`${agents.length} agent${agents.length === 1 ? "" : "s"} found.`);
115
117
  if (agents.length === 0) {
116
118
  log3.info("No agents found. Run `stamn agent register` to create one.");
117
- return;
119
+ process.exit(0);
118
120
  }
119
121
  for (const agent of agents) {
120
122
  const active = agent.id === config.agentId ? " (active)" : "";
121
123
  log3.info(` ${agent.name} \u2014 ${agent.id}${active}`);
122
124
  }
125
+ process.exit(0);
123
126
  } catch (err) {
124
127
  s.stop("Failed.");
125
128
  cancel3(`Failed to list agents: ${err.message}`);
@@ -152,6 +155,7 @@ async function handleAgentSelect(opts, adapter) {
152
155
  adapter.writeConfig({ agentId: match.id, agentName: match.name });
153
156
  log4.success(`Active agent set to "${match.name}" (${match.id})`);
154
157
  outro3("Done!");
158
+ process.exit(0);
155
159
  } catch (err) {
156
160
  s.stop("Failed.");
157
161
  cancel4(`Failed to select agent: ${err.message}`);
@@ -167,7 +171,7 @@ async function handleLogout(_opts, adapter) {
167
171
  if (!config?.apiKey) {
168
172
  log5.info("Not logged in.");
169
173
  outro4("Nothing to do.");
170
- return;
174
+ process.exit(0);
171
175
  }
172
176
  const shouldContinue = await confirm({
173
177
  message: "This will clear your auth session. Your agents will not be deleted. Continue?"
@@ -179,6 +183,7 @@ async function handleLogout(_opts, adapter) {
179
183
  adapter.writeConfig({ apiKey: "", agentId: "", agentName: "" });
180
184
  log5.success("Logged out.");
181
185
  outro4("Run `stamn login` to authenticate again.");
186
+ process.exit(0);
182
187
  }
183
188
 
184
189
  // src/commands/config.ts
@@ -256,6 +261,7 @@ async function handleStatus(adapter) {
256
261
  log7.info(`${label("Server:")} ${health.ok ? "healthy" : "unhealthy"}`);
257
262
  }
258
263
  outro5("");
264
+ process.exit(0);
259
265
  }
260
266
 
261
267
  // src/commands/uninstall.ts
@@ -273,12 +279,128 @@ async function handleUninstall(adapter) {
273
279
  adapter.uninstall?.();
274
280
  log8.success("Removed Stamn config");
275
281
  outro6("Stamn config removed.");
282
+ process.exit(0);
276
283
  } catch (err) {
277
284
  cancel6(`Failed to remove config: ${err.message}`);
278
285
  process.exit(1);
279
286
  }
280
287
  }
281
288
 
289
+ // src/commands/service.ts
290
+ import { intro as intro8, spinner as spinner5, log as log9, cancel as cancel7 } from "@clack/prompts";
291
+ import { StamnClient as StamnClient6 } from "@stamn/sdk";
292
+ function requireAuth(adapter) {
293
+ const config = adapter.readConfig();
294
+ if (!config?.apiKey) {
295
+ cancel7("Not logged in. Run `stamn login` first.");
296
+ process.exit(1);
297
+ }
298
+ if (!config.agentId) {
299
+ cancel7("No active agent. Run `stamn agent select` first.");
300
+ process.exit(1);
301
+ }
302
+ return { client: new StamnClient6({ apiKey: config.apiKey }), agentId: config.agentId };
303
+ }
304
+ async function handleServiceList(_opts, adapter) {
305
+ intro8("Services");
306
+ const { client, agentId } = requireAuth(adapter);
307
+ const s = spinner5();
308
+ try {
309
+ s.start("Fetching services...");
310
+ const services = await client.services.list(agentId);
311
+ s.stop(`${services.length} service${services.length === 1 ? "" : "s"} found.`);
312
+ if (services.length === 0) {
313
+ log9.info("No services yet. Run `stamn service create` to add one.");
314
+ process.exit(0);
315
+ }
316
+ for (const svc of services) {
317
+ const status = svc.isActive ? "\u25CF" : "\u25CB";
318
+ const price = `$${(svc.priceCents / 100).toFixed(2)}`;
319
+ log9.info(` ${status} ${svc.name} (${svc.serviceTag}) \u2014 ${price}`);
320
+ }
321
+ process.exit(0);
322
+ } catch (err) {
323
+ s.stop("Failed.");
324
+ cancel7(`Failed to list services: ${err.message}`);
325
+ process.exit(1);
326
+ }
327
+ }
328
+ async function handleServiceCreate(opts, adapter) {
329
+ intro8("Create Service");
330
+ const { client, agentId } = requireAuth(adapter);
331
+ const s = spinner5();
332
+ const priceCents = Math.round(parseFloat(opts.price) * 100);
333
+ if (isNaN(priceCents) || priceCents < 0) {
334
+ cancel7("Invalid price. Use a dollar amount like 5.00");
335
+ process.exit(1);
336
+ }
337
+ try {
338
+ s.start("Creating service...");
339
+ const svc = await client.services.create(agentId, {
340
+ serviceTag: opts.tag,
341
+ name: opts.name,
342
+ description: opts.description,
343
+ priceCents
344
+ });
345
+ s.stop("Service created.");
346
+ log9.success(`${svc.name} (${svc.serviceTag}) \u2014 $${(svc.priceCents / 100).toFixed(2)}`);
347
+ process.exit(0);
348
+ } catch (err) {
349
+ s.stop("Failed.");
350
+ cancel7(`Failed to create service: ${err.message}`);
351
+ process.exit(1);
352
+ }
353
+ }
354
+ async function handleServiceUpdate(opts, adapter) {
355
+ intro8("Update Service");
356
+ const { client, agentId } = requireAuth(adapter);
357
+ const s = spinner5();
358
+ const updates = {};
359
+ if (opts.name) updates.name = opts.name;
360
+ if (opts.description) updates.description = opts.description;
361
+ if (opts.price) {
362
+ const priceCents = Math.round(parseFloat(opts.price) * 100);
363
+ if (isNaN(priceCents) || priceCents < 0) {
364
+ cancel7("Invalid price.");
365
+ process.exit(1);
366
+ }
367
+ updates.priceCents = priceCents;
368
+ }
369
+ if (opts.active !== void 0) {
370
+ updates.isActive = opts.active === "true";
371
+ }
372
+ if (Object.keys(updates).length === 0) {
373
+ cancel7("No updates provided. Use --name, --description, --price, or --active.");
374
+ process.exit(1);
375
+ }
376
+ try {
377
+ s.start("Updating service...");
378
+ const svc = await client.services.update(agentId, opts.serviceId, updates);
379
+ s.stop("Service updated.");
380
+ log9.success(`${svc.name} \u2014 $${(svc.priceCents / 100).toFixed(2)} (${svc.isActive ? "active" : "inactive"})`);
381
+ process.exit(0);
382
+ } catch (err) {
383
+ s.stop("Failed.");
384
+ cancel7(`Failed to update service: ${err.message}`);
385
+ process.exit(1);
386
+ }
387
+ }
388
+ async function handleServiceDelete(opts, adapter) {
389
+ intro8("Delete Service");
390
+ const { client, agentId } = requireAuth(adapter);
391
+ const s = spinner5();
392
+ try {
393
+ s.start("Deleting service...");
394
+ await client.services.delete(agentId, opts.serviceId);
395
+ s.stop("Service deleted.");
396
+ process.exit(0);
397
+ } catch (err) {
398
+ s.stop("Failed.");
399
+ cancel7(`Failed to delete service: ${err.message}`);
400
+ process.exit(1);
401
+ }
402
+ }
403
+
282
404
  // src/config.ts
283
405
  import { existsSync, mkdirSync as mkdirSync2, readFileSync as readFileSync2, rmSync, writeFileSync as writeFileSync2 } from "fs";
284
406
  import { dirname, join as join2 } from "path";
@@ -332,8 +454,12 @@ export {
332
454
  handleConfig,
333
455
  handleStatus,
334
456
  handleUninstall,
457
+ handleServiceList,
458
+ handleServiceCreate,
459
+ handleServiceUpdate,
460
+ handleServiceDelete,
335
461
  readJsonFile,
336
462
  writeJsonFile,
337
463
  createDefaultAdapter
338
464
  };
339
- //# sourceMappingURL=chunk-GNL7D4HS.js.map
465
+ //# sourceMappingURL=chunk-Z2IAJQOV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/login.ts","../src/commands/agent-register.ts","../src/commands/agent-list.ts","../src/commands/agent-select.ts","../src/commands/logout.ts","../src/commands/config.ts","../src/commands/status.ts","../src/commands/uninstall.ts","../src/commands/service.ts","../src/config.ts"],"sourcesContent":["import { intro, outro, spinner, log, note, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleLogin(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Login');\n\n const existing = adapter.readConfig();\n\n if (existing?.apiKey) {\n const s = spinner();\n s.start('Checking existing session...');\n try {\n const client = new StamnClient({ apiKey: existing.apiKey });\n await client.participants.list();\n s.stop('Session valid.');\n log.info('Already logged in.');\n outro('Run `stamn agent register` to create an agent, or `stamn agent list` to see existing ones.');\n process.exit(0);\n } catch {\n s.stop('Session expired.');\n log.warn('Existing session is invalid. Re-authenticating...');\n }\n }\n\n const client = new StamnClient();\n const s = spinner();\n\n try {\n s.start(\"Initiating device flow...\");\n const flow = await client.auth.initiateDeviceFlow();\n s.stop(\"Device flow initiated.\");\n\n const label = (str: string) => str.padEnd(7);\n note(\n `${label(\"Open:\")} ${flow.verificationUri}\\n${label(\"Code:\")} ${flow.userCode}`,\n \"Authorize in your browser\",\n );\n\n s.start(\"Waiting for approval...\");\n const apiKey = await client.auth.pollForApproval(flow.deviceCode);\n s.stop(\"Approved!\");\n\n adapter.writeConfig({ apiKey });\n\n log.success('Logged in successfully.');\n log.info(`Config written to ${adapter.getConfigPath()}`);\n\n outro('Now run `stamn agent register` to create or reconnect an agent.');\n process.exit(0);\n } catch (err) {\n s.stop(\"Failed.\");\n cancel(`Login failed: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, outro, spinner, log, cancel, text } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleAgentRegister(opts: { name?: string }, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Agent Register');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n\n let name = opts.name;\n if (!name) {\n const input = await text({\n message: 'What should we call this agent?',\n placeholder: 'my-agent',\n validate: (value) => {\n if (!value?.trim()) return 'Name is required.';\n },\n });\n if (typeof input === 'symbol') {\n cancel('Cancelled.');\n return;\n }\n name = input;\n }\n\n const client = new StamnClient({ apiKey: config.apiKey });\n const s = spinner();\n\n try {\n s.start('Checking existing agents...');\n const agents = await client.participants.list();\n const match = agents.find((a) => a.name === name);\n\n if (match) {\n s.stop('Agent found.');\n adapter.writeConfig({ agentId: match.id, agentName: match.name });\n log.success(`Agent \"${match.name}\" (${match.id}) already exists. Selected as active.`);\n outro('Done!');\n process.exit(0);\n }\n\n s.start('Registering agent...');\n const participant = await client.participants.create({ name });\n s.stop('Agent registered.');\n\n adapter.writeConfig({ agentId: participant.id, agentName: participant.name });\n\n log.success(`Agent \"${participant.name}\" (${participant.id})`);\n outro('Done!');\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Registration failed: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, spinner, log, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleAgentList(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Agents');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n\n const client = new StamnClient({ apiKey: config.apiKey });\n const s = spinner();\n\n try {\n s.start('Fetching agents...');\n const agents = await client.participants.list();\n s.stop(`${agents.length} agent${agents.length === 1 ? '' : 's'} found.`);\n\n if (agents.length === 0) {\n log.info('No agents found. Run `stamn agent register` to create one.');\n process.exit(0);\n }\n\n for (const agent of agents) {\n const active = agent.id === config.agentId ? ' (active)' : '';\n log.info(` ${agent.name} — ${agent.id}${active}`);\n }\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to list agents: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, outro, spinner, log, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleAgentSelect(opts: { nameOrId: string }, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Agent Select');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n\n const client = new StamnClient({ apiKey: config.apiKey });\n const s = spinner();\n\n try {\n s.start('Fetching agents...');\n const agents = await client.participants.list();\n s.stop(`${agents.length} agent${agents.length === 1 ? '' : 's'} found.`);\n\n const match = agents.find((a) => a.id === opts.nameOrId || a.name === opts.nameOrId);\n\n if (!match) {\n cancel(`Agent \"${opts.nameOrId}\" not found. Run \\`stamn agent list\\` to see available agents.`);\n process.exit(1);\n return;\n }\n\n adapter.writeConfig({ agentId: match.id, agentName: match.name });\n log.success(`Active agent set to \"${match.name}\" (${match.id})`);\n outro('Done!');\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to select agent: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, outro, log, cancel, confirm } from '@clack/prompts';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleLogout(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Logout');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n log.info('Not logged in.');\n outro('Nothing to do.');\n process.exit(0);\n }\n\n const shouldContinue = await confirm({\n message: 'This will clear your auth session. Your agents will not be deleted. Continue?',\n });\n\n if (!shouldContinue || typeof shouldContinue === 'symbol') {\n cancel('Cancelled.');\n return;\n }\n\n adapter.writeConfig({ apiKey: '', agentId: '', agentName: '' } as any);\n log.success('Logged out.');\n outro('Run `stamn login` to authenticate again.');\n process.exit(0);\n}\n","import { execSync } from \"child_process\";\nimport { mkdirSync, readFileSync, writeFileSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { log } from \"@clack/prompts\";\nimport type { ConfigAdapter } from \"@/types\";\n\nfunction openEditor(initial: string): string | null {\n const editor = process.env.EDITOR || process.env.VISUAL || \"vi\";\n const tmpFile = join(tmpdir(), `stamn-personality-${Date.now()}.md`);\n\n mkdirSync(tmpdir(), { recursive: true });\n writeFileSync(tmpFile, initial, \"utf-8\");\n\n try {\n execSync(`${editor} \"${tmpFile}\"`, { stdio: \"inherit\" });\n const result = readFileSync(tmpFile, \"utf-8\").trim();\n return result || null;\n } catch {\n return null;\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {}\n }\n}\n\nexport function handleConfig(\n opts: { name?: string; personality?: boolean },\n adapter: ConfigAdapter,\n): void {\n if (!opts.name && !opts.personality) {\n const config = adapter.readConfig();\n if (!config) {\n log.warn(\"No config found. Run `stamn login` first.\");\n return;\n }\n log.info(`Name: ${config.agentName ?? \"(not set)\"}`);\n log.info(`Personality: ${config.personality ? \"configured\" : \"(not set)\"}`);\n return;\n }\n\n if (opts.name) {\n adapter.writeConfig({ agentName: opts.name });\n log.success(`Name set: \"${opts.name}\"`);\n }\n\n if (opts.personality) {\n const existing = adapter.readConfig()?.personality ?? \"\";\n const text = openEditor(existing);\n if (!text) {\n log.warn(\"Editor closed without saving. Personality unchanged.\");\n return;\n }\n adapter.writeConfig({ personality: text });\n log.success(\"Personality updated.\");\n }\n}\n","import { intro, outro, log } from \"@clack/prompts\";\nimport { StamnClient } from \"@stamn/sdk\";\nimport type { StamnConfig, ConfigAdapter } from \"@/types\";\n\nexport async function handleStatus(adapter: ConfigAdapter): Promise<void> {\n const config = adapter.readConfig();\n const status = adapter.readStatusFile();\n const label = (str: string) => str.padEnd(14);\n\n intro(\"Stamn Status\");\n\n log.info(`${label(\"Agent ID:\")} ${config?.agentId || \"(not configured)\"}`);\n log.info(\n `${label(\"Agent Name:\")} ${config?.agentName || \"(not configured)\"}`,\n );\n log.info(`${label(\"Connected:\")} ${status?.connected ? \"yes\" : \"no\"}`);\n\n if (status?.connected && status.connectedAt) {\n log.info(\n `${label(\"Since:\")} ${new Date(status.connectedAt).toLocaleString()}`,\n );\n }\n\n if (config?.apiKey) {\n const client = new StamnClient({ apiKey: config.apiKey });\n const health = await client.health.check();\n log.info(`${label(\"Server:\")} ${health.ok ? \"healthy\" : \"unhealthy\"}`);\n }\n\n outro(\"\");\n process.exit(0);\n}\n","import { intro, outro, confirm, log, cancel } from \"@clack/prompts\";\nimport type { ConfigAdapter } from \"@/types\";\n\nexport async function handleUninstall(adapter: ConfigAdapter): Promise<void> {\n intro(\"Stamn Uninstall\");\n\n const shouldContinue = await confirm({\n message: \"This will remove all Stamn config and data. Continue?\",\n });\n\n if (!shouldContinue || typeof shouldContinue === \"symbol\") {\n cancel(\"Uninstall cancelled.\");\n return;\n }\n\n try {\n adapter.uninstall?.();\n log.success(\"Removed Stamn config\");\n outro(\"Stamn config removed.\");\n process.exit(0);\n } catch (err) {\n cancel(`Failed to remove config: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, spinner, log, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nfunction requireAuth(adapter: ConfigAdapter) {\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n if (!config.agentId) {\n cancel('No active agent. Run `stamn agent select` first.');\n process.exit(1);\n }\n return { client: new StamnClient({ apiKey: config.apiKey }), agentId: config.agentId };\n}\n\nexport async function handleServiceList(\n _opts: Record<string, never>,\n adapter: ConfigAdapter,\n): Promise<void> {\n intro('Services');\n const { client, agentId } = requireAuth(adapter);\n const s = spinner();\n\n try {\n s.start('Fetching services...');\n const services = await client.services.list(agentId);\n s.stop(`${services.length} service${services.length === 1 ? '' : 's'} found.`);\n\n if (services.length === 0) {\n log.info('No services yet. Run `stamn service create` to add one.');\n process.exit(0);\n }\n\n for (const svc of services) {\n const status = svc.isActive ? '●' : '○';\n const price = `$${(svc.priceCents / 100).toFixed(2)}`;\n log.info(` ${status} ${svc.name} (${svc.serviceTag}) — ${price}`);\n }\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to list services: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n\nexport async function handleServiceCreate(\n opts: { tag: string; name: string; description: string; price: string },\n adapter: ConfigAdapter,\n): Promise<void> {\n intro('Create Service');\n const { client, agentId } = requireAuth(adapter);\n const s = spinner();\n\n const priceCents = Math.round(parseFloat(opts.price) * 100);\n if (isNaN(priceCents) || priceCents < 0) {\n cancel('Invalid price. Use a dollar amount like 5.00');\n process.exit(1);\n }\n\n try {\n s.start('Creating service...');\n const svc = await client.services.create(agentId, {\n serviceTag: opts.tag,\n name: opts.name,\n description: opts.description,\n priceCents,\n });\n s.stop('Service created.');\n log.success(`${svc.name} (${svc.serviceTag}) — $${(svc.priceCents / 100).toFixed(2)}`);\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to create service: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n\nexport async function handleServiceUpdate(\n opts: { serviceId: string; name?: string; description?: string; price?: string; active?: string },\n adapter: ConfigAdapter,\n): Promise<void> {\n intro('Update Service');\n const { client, agentId } = requireAuth(adapter);\n const s = spinner();\n\n const updates: Record<string, unknown> = {};\n if (opts.name) updates.name = opts.name;\n if (opts.description) updates.description = opts.description;\n if (opts.price) {\n const priceCents = Math.round(parseFloat(opts.price) * 100);\n if (isNaN(priceCents) || priceCents < 0) {\n cancel('Invalid price.');\n process.exit(1);\n }\n updates.priceCents = priceCents;\n }\n if (opts.active !== undefined) {\n updates.isActive = opts.active === 'true';\n }\n\n if (Object.keys(updates).length === 0) {\n cancel('No updates provided. Use --name, --description, --price, or --active.');\n process.exit(1);\n }\n\n try {\n s.start('Updating service...');\n const svc = await client.services.update(agentId, opts.serviceId, updates);\n s.stop('Service updated.');\n log.success(`${svc.name} — $${(svc.priceCents / 100).toFixed(2)} (${svc.isActive ? 'active' : 'inactive'})`);\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to update service: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n\nexport async function handleServiceDelete(\n opts: { serviceId: string },\n adapter: ConfigAdapter,\n): Promise<void> {\n intro('Delete Service');\n const { client, agentId } = requireAuth(adapter);\n const s = spinner();\n\n try {\n s.start('Deleting service...');\n await client.services.delete(agentId, opts.serviceId);\n s.stop('Service deleted.');\n process.exit(0);\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to delete service: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\nimport type { StamnConfig, StamnStatusFile, ConfigAdapter } from \"@/types\";\n\nexport function readJsonFile<T>(filePath: string): T | null {\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nexport function writeJsonFile(filePath: string, data: unknown): void {\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function getConfigPath(): string {\n return join(homedir(), \".stamn\", \"config.json\");\n}\n\nexport function readConfig(): StamnConfig | null {\n return readJsonFile<StamnConfig>(getConfigPath());\n}\n\nexport function writeConfig(updates: Partial<StamnConfig>): void {\n const existing = readConfig() ?? {};\n writeJsonFile(getConfigPath(), { ...existing, ...updates });\n}\n\nexport function readStatusFile(): StamnStatusFile | null {\n return readJsonFile<StamnStatusFile>(join(homedir(), \".stamn\", \"status.json\"));\n}\n\nexport function createDefaultAdapter(): ConfigAdapter {\n return {\n readConfig,\n writeConfig,\n readStatusFile,\n getConfigPath,\n uninstall() {\n const configDir = dirname(getConfigPath());\n if (existsSync(configDir)) {\n rmSync(configDir, { recursive: true, force: true });\n }\n },\n };\n}\n"],"mappings":"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","names":["s","client","intro","outro","spinner","log","cancel","StamnClient","intro","spinner","log","cancel","StamnClient","intro","outro","spinner","log","cancel","StamnClient","intro","outro","log","cancel","log","text","intro","outro","log","StamnClient","intro","outro","confirm","log","cancel","intro","spinner","log","cancel","StamnClient","mkdirSync","readFileSync","writeFileSync","join"]}
package/dist/index.d.ts CHANGED
@@ -52,8 +52,26 @@ declare function handleStatus(adapter: ConfigAdapter): Promise<void>;
52
52
 
53
53
  declare function handleUninstall(adapter: ConfigAdapter): Promise<void>;
54
54
 
55
+ declare function handleServiceList(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void>;
56
+ declare function handleServiceCreate(opts: {
57
+ tag: string;
58
+ name: string;
59
+ description: string;
60
+ price: string;
61
+ }, adapter: ConfigAdapter): Promise<void>;
62
+ declare function handleServiceUpdate(opts: {
63
+ serviceId: string;
64
+ name?: string;
65
+ description?: string;
66
+ price?: string;
67
+ active?: string;
68
+ }, adapter: ConfigAdapter): Promise<void>;
69
+ declare function handleServiceDelete(opts: {
70
+ serviceId: string;
71
+ }, adapter: ConfigAdapter): Promise<void>;
72
+
55
73
  declare function readJsonFile<T>(filePath: string): T | null;
56
74
  declare function writeJsonFile(filePath: string, data: unknown): void;
57
75
  declare function createDefaultAdapter(): ConfigAdapter;
58
76
 
59
- export { type ConfigAdapter, type ServiceConfig, type StamnConfig, type StamnStatusFile, createDefaultAdapter, handleAgentList, handleAgentRegister, handleAgentSelect, handleConfig, handleLogin, handleLogout, handleStatus, handleUninstall, readJsonFile, writeJsonFile };
77
+ export { type ConfigAdapter, type ServiceConfig, type StamnConfig, type StamnStatusFile, createDefaultAdapter, handleAgentList, handleAgentRegister, handleAgentSelect, handleConfig, handleLogin, handleLogout, handleServiceCreate, handleServiceDelete, handleServiceList, handleServiceUpdate, handleStatus, handleUninstall, readJsonFile, writeJsonFile };
package/dist/index.js CHANGED
@@ -6,11 +6,15 @@ import {
6
6
  handleConfig,
7
7
  handleLogin,
8
8
  handleLogout,
9
+ handleServiceCreate,
10
+ handleServiceDelete,
11
+ handleServiceList,
12
+ handleServiceUpdate,
9
13
  handleStatus,
10
14
  handleUninstall,
11
15
  readJsonFile,
12
16
  writeJsonFile
13
- } from "./chunk-GNL7D4HS.js";
17
+ } from "./chunk-Z2IAJQOV.js";
14
18
  export {
15
19
  createDefaultAdapter,
16
20
  handleAgentList,
@@ -19,6 +23,10 @@ export {
19
23
  handleConfig,
20
24
  handleLogin,
21
25
  handleLogout,
26
+ handleServiceCreate,
27
+ handleServiceDelete,
28
+ handleServiceList,
29
+ handleServiceUpdate,
22
30
  handleStatus,
23
31
  handleUninstall,
24
32
  readJsonFile,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stamn/cli",
3
- "version": "0.1.0-alpha.4",
3
+ "version": "0.1.0-alpha.6",
4
4
  "description": "Stamn CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@clack/prompts": "^1.0.1",
56
- "@stamn/sdk": "0.1.0-alpha.1",
56
+ "@stamn/sdk": "0.1.0-alpha.2",
57
57
  "commander": "^14.0.3"
58
58
  }
59
59
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/login.ts","../src/commands/agent-register.ts","../src/commands/agent-list.ts","../src/commands/agent-select.ts","../src/commands/logout.ts","../src/commands/config.ts","../src/commands/status.ts","../src/commands/uninstall.ts","../src/config.ts"],"sourcesContent":["import { intro, outro, spinner, log, note, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleLogin(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Login');\n\n const existing = adapter.readConfig();\n\n if (existing?.apiKey) {\n const s = spinner();\n s.start('Checking existing session...');\n try {\n const client = new StamnClient({ apiKey: existing.apiKey });\n await client.participants.list();\n s.stop('Session valid.');\n log.info('Already logged in.');\n outro('Run `stamn agent register` to create an agent, or `stamn agent list` to see existing ones.');\n return;\n } catch {\n s.stop('Session expired.');\n log.warn('Existing session is invalid. Re-authenticating...');\n }\n }\n\n const client = new StamnClient();\n const s = spinner();\n\n try {\n s.start(\"Initiating device flow...\");\n const flow = await client.auth.initiateDeviceFlow();\n s.stop(\"Device flow initiated.\");\n\n const label = (str: string) => str.padEnd(7);\n note(\n `${label(\"Open:\")} ${flow.verificationUri}\\n${label(\"Code:\")} ${flow.userCode}`,\n \"Authorize in your browser\",\n );\n\n s.start(\"Waiting for approval...\");\n const apiKey = await client.auth.pollForApproval(flow.deviceCode);\n s.stop(\"Approved!\");\n\n adapter.writeConfig({ apiKey });\n\n log.success('Logged in successfully.');\n log.info(`Config written to ${adapter.getConfigPath()}`);\n\n outro('Now run `stamn agent register` to create or reconnect an agent.');\n } catch (err) {\n s.stop(\"Failed.\");\n cancel(`Login failed: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, outro, spinner, log, cancel, text } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleAgentRegister(opts: { name?: string }, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Agent Register');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n\n let name = opts.name;\n if (!name) {\n const input = await text({\n message: 'What should we call this agent?',\n placeholder: 'my-agent',\n validate: (value) => {\n if (!value?.trim()) return 'Name is required.';\n },\n });\n if (typeof input === 'symbol') {\n cancel('Cancelled.');\n return;\n }\n name = input;\n }\n\n const client = new StamnClient({ apiKey: config.apiKey });\n const s = spinner();\n\n try {\n s.start('Checking existing agents...');\n const agents = await client.participants.list();\n const match = agents.find((a) => a.name === name);\n\n if (match) {\n s.stop('Agent found.');\n adapter.writeConfig({ agentId: match.id, agentName: match.name });\n log.success(`Agent \"${match.name}\" (${match.id}) already exists. Selected as active.`);\n outro('Done!');\n return;\n }\n\n s.start('Registering agent...');\n const participant = await client.participants.create({ name });\n s.stop('Agent registered.');\n\n adapter.writeConfig({ agentId: participant.id, agentName: participant.name });\n\n log.success(`Agent \"${participant.name}\" (${participant.id})`);\n outro('Done!');\n } catch (err) {\n s.stop('Failed.');\n cancel(`Registration failed: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, spinner, log, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleAgentList(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Agents');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n\n const client = new StamnClient({ apiKey: config.apiKey });\n const s = spinner();\n\n try {\n s.start('Fetching agents...');\n const agents = await client.participants.list();\n s.stop(`${agents.length} agent${agents.length === 1 ? '' : 's'} found.`);\n\n if (agents.length === 0) {\n log.info('No agents found. Run `stamn agent register` to create one.');\n return;\n }\n\n for (const agent of agents) {\n const active = agent.id === config.agentId ? ' (active)' : '';\n log.info(` ${agent.name} — ${agent.id}${active}`);\n }\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to list agents: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, outro, spinner, log, cancel } from '@clack/prompts';\nimport { StamnClient } from '@stamn/sdk';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleAgentSelect(opts: { nameOrId: string }, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Agent Select');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n cancel('Not logged in. Run `stamn login` first.');\n process.exit(1);\n }\n\n const client = new StamnClient({ apiKey: config.apiKey });\n const s = spinner();\n\n try {\n s.start('Fetching agents...');\n const agents = await client.participants.list();\n s.stop(`${agents.length} agent${agents.length === 1 ? '' : 's'} found.`);\n\n const match = agents.find((a) => a.id === opts.nameOrId || a.name === opts.nameOrId);\n\n if (!match) {\n cancel(`Agent \"${opts.nameOrId}\" not found. Run \\`stamn agent list\\` to see available agents.`);\n process.exit(1);\n return;\n }\n\n adapter.writeConfig({ agentId: match.id, agentName: match.name });\n log.success(`Active agent set to \"${match.name}\" (${match.id})`);\n outro('Done!');\n } catch (err) {\n s.stop('Failed.');\n cancel(`Failed to select agent: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { intro, outro, log, cancel, confirm } from '@clack/prompts';\nimport type { ConfigAdapter } from '@/types';\n\nexport async function handleLogout(_opts: Record<string, never>, adapter: ConfigAdapter): Promise<void> {\n intro('Stamn Logout');\n\n const config = adapter.readConfig();\n if (!config?.apiKey) {\n log.info('Not logged in.');\n outro('Nothing to do.');\n return;\n }\n\n const shouldContinue = await confirm({\n message: 'This will clear your auth session. Your agents will not be deleted. Continue?',\n });\n\n if (!shouldContinue || typeof shouldContinue === 'symbol') {\n cancel('Cancelled.');\n return;\n }\n\n adapter.writeConfig({ apiKey: '', agentId: '', agentName: '' } as any);\n log.success('Logged out.');\n outro('Run `stamn login` to authenticate again.');\n}\n","import { execSync } from \"child_process\";\nimport { mkdirSync, readFileSync, writeFileSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { log } from \"@clack/prompts\";\nimport type { ConfigAdapter } from \"@/types\";\n\nfunction openEditor(initial: string): string | null {\n const editor = process.env.EDITOR || process.env.VISUAL || \"vi\";\n const tmpFile = join(tmpdir(), `stamn-personality-${Date.now()}.md`);\n\n mkdirSync(tmpdir(), { recursive: true });\n writeFileSync(tmpFile, initial, \"utf-8\");\n\n try {\n execSync(`${editor} \"${tmpFile}\"`, { stdio: \"inherit\" });\n const result = readFileSync(tmpFile, \"utf-8\").trim();\n return result || null;\n } catch {\n return null;\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {}\n }\n}\n\nexport function handleConfig(\n opts: { name?: string; personality?: boolean },\n adapter: ConfigAdapter,\n): void {\n if (!opts.name && !opts.personality) {\n const config = adapter.readConfig();\n if (!config) {\n log.warn(\"No config found. Run `stamn login` first.\");\n return;\n }\n log.info(`Name: ${config.agentName ?? \"(not set)\"}`);\n log.info(`Personality: ${config.personality ? \"configured\" : \"(not set)\"}`);\n return;\n }\n\n if (opts.name) {\n adapter.writeConfig({ agentName: opts.name });\n log.success(`Name set: \"${opts.name}\"`);\n }\n\n if (opts.personality) {\n const existing = adapter.readConfig()?.personality ?? \"\";\n const text = openEditor(existing);\n if (!text) {\n log.warn(\"Editor closed without saving. Personality unchanged.\");\n return;\n }\n adapter.writeConfig({ personality: text });\n log.success(\"Personality updated.\");\n }\n}\n","import { intro, outro, log } from \"@clack/prompts\";\nimport { StamnClient } from \"@stamn/sdk\";\nimport type { StamnConfig, ConfigAdapter } from \"@/types\";\n\nexport async function handleStatus(adapter: ConfigAdapter): Promise<void> {\n const config = adapter.readConfig();\n const status = adapter.readStatusFile();\n const label = (str: string) => str.padEnd(14);\n\n intro(\"Stamn Status\");\n\n log.info(`${label(\"Agent ID:\")} ${config?.agentId || \"(not configured)\"}`);\n log.info(\n `${label(\"Agent Name:\")} ${config?.agentName || \"(not configured)\"}`,\n );\n log.info(`${label(\"Connected:\")} ${status?.connected ? \"yes\" : \"no\"}`);\n\n if (status?.connected && status.connectedAt) {\n log.info(\n `${label(\"Since:\")} ${new Date(status.connectedAt).toLocaleString()}`,\n );\n }\n\n if (config?.apiKey) {\n const client = new StamnClient({ apiKey: config.apiKey });\n const health = await client.health.check();\n log.info(`${label(\"Server:\")} ${health.ok ? \"healthy\" : \"unhealthy\"}`);\n }\n\n outro(\"\");\n}\n","import { intro, outro, confirm, log, cancel } from \"@clack/prompts\";\nimport type { ConfigAdapter } from \"@/types\";\n\nexport async function handleUninstall(adapter: ConfigAdapter): Promise<void> {\n intro(\"Stamn Uninstall\");\n\n const shouldContinue = await confirm({\n message: \"This will remove all Stamn config and data. Continue?\",\n });\n\n if (!shouldContinue || typeof shouldContinue === \"symbol\") {\n cancel(\"Uninstall cancelled.\");\n return;\n }\n\n try {\n adapter.uninstall?.();\n log.success(\"Removed Stamn config\");\n outro(\"Stamn config removed.\");\n } catch (err) {\n cancel(`Failed to remove config: ${(err as Error).message}`);\n process.exit(1);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\nimport type { StamnConfig, StamnStatusFile, ConfigAdapter } from \"@/types\";\n\nexport function readJsonFile<T>(filePath: string): T | null {\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nexport function writeJsonFile(filePath: string, data: unknown): void {\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function getConfigPath(): string {\n return join(homedir(), \".stamn\", \"config.json\");\n}\n\nexport function readConfig(): StamnConfig | null {\n return readJsonFile<StamnConfig>(getConfigPath());\n}\n\nexport function writeConfig(updates: Partial<StamnConfig>): void {\n const existing = readConfig() ?? {};\n writeJsonFile(getConfigPath(), { ...existing, ...updates });\n}\n\nexport function readStatusFile(): StamnStatusFile | null {\n return readJsonFile<StamnStatusFile>(join(homedir(), \".stamn\", \"status.json\"));\n}\n\nexport function createDefaultAdapter(): ConfigAdapter {\n return {\n readConfig,\n writeConfig,\n readStatusFile,\n getConfigPath,\n uninstall() {\n const configDir = dirname(getConfigPath());\n if (existsSync(configDir)) {\n rmSync(configDir, { recursive: true, force: true });\n }\n },\n };\n}\n"],"mappings":"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","names":["s","client","intro","outro","spinner","log","cancel","StamnClient","intro","spinner","log","cancel","StamnClient","intro","outro","spinner","log","cancel","StamnClient","intro","outro","log","cancel","log","text","intro","outro","log","StamnClient","intro","outro","confirm","log","cancel","mkdirSync","readFileSync","writeFileSync","join"]}