@stamn/agent 0.2.0 → 0.3.0
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 +3 -3
- package/dist/commands/config/get.js +17 -5
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/set.js +19 -9
- package/dist/commands/config/set.js.map +1 -1
- package/dist/commands/spend.js +1 -1
- package/dist/commands/spend.js.map +1 -1
- package/dist/commands/start.js +1 -1
- package/dist/commands/start.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,9 +12,9 @@ npm i -g @stamn/agent
|
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
14
|
# Configure
|
|
15
|
-
stamn config set
|
|
16
|
-
stamn config set
|
|
17
|
-
stamn config set
|
|
15
|
+
stamn config set server-url https://your-server.example.com
|
|
16
|
+
stamn config set agent-id <your-agent-uuid>
|
|
17
|
+
stamn config set api-key <your-api-key>
|
|
18
18
|
|
|
19
19
|
# Start daemon
|
|
20
20
|
stamn start
|
|
@@ -7,6 +7,18 @@ import {
|
|
|
7
7
|
// src/commands/config/get.ts
|
|
8
8
|
import { Args, Command } from "@oclif/core";
|
|
9
9
|
var VALID_KEYS = Object.keys(configSchema.shape);
|
|
10
|
+
var KEBAB_TO_CAMEL = {
|
|
11
|
+
"server-url": "serverUrl",
|
|
12
|
+
"api-key": "apiKey",
|
|
13
|
+
"agent-id": "agentId",
|
|
14
|
+
"log-level": "logLevel",
|
|
15
|
+
"heartbeat-interval-ms": "heartbeatIntervalMs",
|
|
16
|
+
"ws-reconnect-base-ms": "wsReconnectBaseMs",
|
|
17
|
+
"ws-reconnect-max-ms": "wsReconnectMaxMs"
|
|
18
|
+
};
|
|
19
|
+
function resolveKey(input) {
|
|
20
|
+
return KEBAB_TO_CAMEL[input] ?? input;
|
|
21
|
+
}
|
|
10
22
|
var ConfigGet = class _ConfigGet extends Command {
|
|
11
23
|
static description = "Get a configuration value";
|
|
12
24
|
static args = {
|
|
@@ -14,13 +26,13 @@ var ConfigGet = class _ConfigGet extends Command {
|
|
|
14
26
|
};
|
|
15
27
|
async run() {
|
|
16
28
|
const { args } = await this.parse(_ConfigGet);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
);
|
|
29
|
+
const key = resolveKey(args.key);
|
|
30
|
+
if (!VALID_KEYS.includes(key)) {
|
|
31
|
+
const display = Object.keys(KEBAB_TO_CAMEL).join(", ");
|
|
32
|
+
this.error(`Invalid key "${args.key}". Valid keys: ${display}`);
|
|
21
33
|
}
|
|
22
34
|
const store = new ConfigStore();
|
|
23
|
-
const value = store.get(
|
|
35
|
+
const value = store.get(key);
|
|
24
36
|
this.log(value != null ? String(value) : "(not set)");
|
|
25
37
|
}
|
|
26
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/config/get.ts"],"sourcesContent":["import { Args, Command } from '@oclif/core';\nimport { ConfigStore } from '../../config/config-store.js';\nimport { configSchema } from '../../config/config-schema.js';\n\nconst VALID_KEYS = Object.keys(configSchema.shape);\n\nexport default class ConfigGet extends Command {\n static override description = 'Get a configuration value';\n\n static override args = {\n key: Args.string({ description: 'Config key', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigGet);\n\n if (!VALID_KEYS.includes(
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/config/get.ts"],"sourcesContent":["import { Args, Command } from '@oclif/core';\nimport { ConfigStore } from '../../config/config-store.js';\nimport { configSchema } from '../../config/config-schema.js';\n\nconst VALID_KEYS = Object.keys(configSchema.shape);\n\nconst KEBAB_TO_CAMEL: Record<string, string> = {\n 'server-url': 'serverUrl',\n 'api-key': 'apiKey',\n 'agent-id': 'agentId',\n 'log-level': 'logLevel',\n 'heartbeat-interval-ms': 'heartbeatIntervalMs',\n 'ws-reconnect-base-ms': 'wsReconnectBaseMs',\n 'ws-reconnect-max-ms': 'wsReconnectMaxMs',\n};\n\nfunction resolveKey(input: string): string {\n return KEBAB_TO_CAMEL[input] ?? input;\n}\n\nexport default class ConfigGet extends Command {\n static override description = 'Get a configuration value';\n\n static override args = {\n key: Args.string({ description: 'Config key', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigGet);\n const key = resolveKey(args.key);\n\n if (!VALID_KEYS.includes(key)) {\n const display = Object.keys(KEBAB_TO_CAMEL).join(', ');\n this.error(`Invalid key \"${args.key}\". Valid keys: ${display}`);\n }\n\n const store = new ConfigStore();\n const value = store.get(key as keyof typeof configSchema.shape);\n this.log(value != null ? String(value) : '(not set)');\n }\n}\n"],"mappings":";;;;;;;AAAA,SAAS,MAAM,eAAe;AAI9B,IAAM,aAAa,OAAO,KAAK,aAAa,KAAK;AAEjD,IAAM,iBAAyC;AAAA,EAC7C,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,uBAAuB;AACzB;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,eAAe,KAAK,KAAK;AAClC;AAEA,IAAqB,YAArB,MAAqB,mBAAkB,QAAQ;AAAA,EAC7C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,KAAK,KAAK,OAAO,EAAE,aAAa,cAAc,UAAU,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,UAAS;AAC3C,UAAM,MAAM,WAAW,KAAK,GAAG;AAE/B,QAAI,CAAC,WAAW,SAAS,GAAG,GAAG;AAC7B,YAAM,UAAU,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI;AACrD,WAAK,MAAM,gBAAgB,KAAK,GAAG,kBAAkB,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,QAAQ,IAAI,YAAY;AAC9B,UAAM,QAAQ,MAAM,IAAI,GAAsC;AAC9D,SAAK,IAAI,SAAS,OAAO,OAAO,KAAK,IAAI,WAAW;AAAA,EACtD;AACF;","names":[]}
|
|
@@ -12,6 +12,18 @@ var NUMERIC_KEYS = /* @__PURE__ */ new Set([
|
|
|
12
12
|
"wsReconnectBaseMs",
|
|
13
13
|
"wsReconnectMaxMs"
|
|
14
14
|
]);
|
|
15
|
+
var KEBAB_TO_CAMEL = {
|
|
16
|
+
"server-url": "serverUrl",
|
|
17
|
+
"api-key": "apiKey",
|
|
18
|
+
"agent-id": "agentId",
|
|
19
|
+
"log-level": "logLevel",
|
|
20
|
+
"heartbeat-interval-ms": "heartbeatIntervalMs",
|
|
21
|
+
"ws-reconnect-base-ms": "wsReconnectBaseMs",
|
|
22
|
+
"ws-reconnect-max-ms": "wsReconnectMaxMs"
|
|
23
|
+
};
|
|
24
|
+
function resolveKey(input) {
|
|
25
|
+
return KEBAB_TO_CAMEL[input] ?? input;
|
|
26
|
+
}
|
|
15
27
|
var ConfigSet = class _ConfigSet extends Command {
|
|
16
28
|
static description = "Set a configuration value";
|
|
17
29
|
static args = {
|
|
@@ -20,17 +32,15 @@ var ConfigSet = class _ConfigSet extends Command {
|
|
|
20
32
|
};
|
|
21
33
|
async run() {
|
|
22
34
|
const { args } = await this.parse(_ConfigSet);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
);
|
|
35
|
+
const key = resolveKey(args.key);
|
|
36
|
+
if (!VALID_KEYS.includes(key)) {
|
|
37
|
+
const display = Object.keys(KEBAB_TO_CAMEL).join(", ");
|
|
38
|
+
this.error(`Invalid key "${args.key}". Valid keys: ${display}`);
|
|
27
39
|
}
|
|
28
40
|
const store = new ConfigStore();
|
|
29
|
-
const parsed = NUMERIC_KEYS.has(
|
|
30
|
-
store.set(
|
|
31
|
-
this.log(
|
|
32
|
-
`Set ${args.key} = ${args.key === "apiKey" ? "****" : args.value}`
|
|
33
|
-
);
|
|
41
|
+
const parsed = NUMERIC_KEYS.has(key) ? Number(args.value) : args.value;
|
|
42
|
+
store.set(key, parsed);
|
|
43
|
+
this.log(`Set ${args.key} = ${key === "apiKey" ? "****" : args.value}`);
|
|
34
44
|
}
|
|
35
45
|
};
|
|
36
46
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/config/set.ts"],"sourcesContent":["import { Args, Command } from '@oclif/core';\nimport { ConfigStore } from '../../config/config-store.js';\nimport { configSchema } from '../../config/config-schema.js';\n\nconst VALID_KEYS = Object.keys(configSchema.shape);\n\nconst NUMERIC_KEYS = new Set([\n 'heartbeatIntervalMs',\n 'wsReconnectBaseMs',\n 'wsReconnectMaxMs',\n]);\n\nexport default class ConfigSet extends Command {\n static override description = 'Set a configuration value';\n\n static override args = {\n key: Args.string({ description: 'Config key', required: true }),\n value: Args.string({ description: 'Config value', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigSet);\n\n if (!VALID_KEYS.includes(
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/config/set.ts"],"sourcesContent":["import { Args, Command } from '@oclif/core';\nimport { ConfigStore } from '../../config/config-store.js';\nimport { configSchema } from '../../config/config-schema.js';\n\nconst VALID_KEYS = Object.keys(configSchema.shape);\n\nconst NUMERIC_KEYS = new Set([\n 'heartbeatIntervalMs',\n 'wsReconnectBaseMs',\n 'wsReconnectMaxMs',\n]);\n\nconst KEBAB_TO_CAMEL: Record<string, string> = {\n 'server-url': 'serverUrl',\n 'api-key': 'apiKey',\n 'agent-id': 'agentId',\n 'log-level': 'logLevel',\n 'heartbeat-interval-ms': 'heartbeatIntervalMs',\n 'ws-reconnect-base-ms': 'wsReconnectBaseMs',\n 'ws-reconnect-max-ms': 'wsReconnectMaxMs',\n};\n\nfunction resolveKey(input: string): string {\n return KEBAB_TO_CAMEL[input] ?? input;\n}\n\nexport default class ConfigSet extends Command {\n static override description = 'Set a configuration value';\n\n static override args = {\n key: Args.string({ description: 'Config key', required: true }),\n value: Args.string({ description: 'Config value', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigSet);\n const key = resolveKey(args.key);\n\n if (!VALID_KEYS.includes(key)) {\n const display = Object.keys(KEBAB_TO_CAMEL).join(', ');\n this.error(`Invalid key \"${args.key}\". Valid keys: ${display}`);\n }\n\n const store = new ConfigStore();\n const parsed = NUMERIC_KEYS.has(key) ? Number(args.value) : args.value;\n\n store.set(key as keyof typeof configSchema.shape, parsed as never);\n this.log(`Set ${args.key} = ${key === 'apiKey' ? '****' : args.value}`);\n }\n}\n"],"mappings":";;;;;;;AAAA,SAAS,MAAM,eAAe;AAI9B,IAAM,aAAa,OAAO,KAAK,aAAa,KAAK;AAEjD,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,iBAAyC;AAAA,EAC7C,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,uBAAuB;AACzB;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,eAAe,KAAK,KAAK;AAClC;AAEA,IAAqB,YAArB,MAAqB,mBAAkB,QAAQ;AAAA,EAC7C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACrB,KAAK,KAAK,OAAO,EAAE,aAAa,cAAc,UAAU,KAAK,CAAC;AAAA,IAC9D,OAAO,KAAK,OAAO,EAAE,aAAa,gBAAgB,UAAU,KAAK,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,UAAS;AAC3C,UAAM,MAAM,WAAW,KAAK,GAAG;AAE/B,QAAI,CAAC,WAAW,SAAS,GAAG,GAAG;AAC7B,YAAM,UAAU,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI;AACrD,WAAK,MAAM,gBAAgB,KAAK,GAAG,kBAAkB,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,QAAQ,IAAI,YAAY;AAC9B,UAAM,SAAS,aAAa,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK;AAEjE,UAAM,IAAI,KAAwC,MAAe;AACjE,SAAK,IAAI,OAAO,KAAK,GAAG,MAAM,QAAQ,WAAW,SAAS,KAAK,KAAK,EAAE;AAAA,EACxE;AACF;","names":[]}
|
package/dist/commands/spend.js
CHANGED
|
@@ -50,7 +50,7 @@ var Spend = class _Spend extends Command {
|
|
|
50
50
|
if (flags["agent-id"]) config.agentId = flags["agent-id"];
|
|
51
51
|
if (flags["api-key"]) config.apiKey = flags["api-key"];
|
|
52
52
|
if (!config.agentId) {
|
|
53
|
-
this.error("agentId is required. Run: stamn config set
|
|
53
|
+
this.error("agentId is required. Run: stamn config set agent-id <uuid>");
|
|
54
54
|
}
|
|
55
55
|
const logger = createLogger({ logLevel: "info" });
|
|
56
56
|
this.log(`Connecting to ${config.serverUrl}...`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/spend.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { ConfigStore } from '../config/config-store.js';\nimport { createLogger } from '../logging/logger.js';\nimport { WSClient } from '../ws/ws-client.js';\nimport { SpendClient } from '../spend/spend-client.js';\nimport type { LedgerCategory, LedgerRail } from '@stamn/types';\n\nexport default class Spend extends Command {\n static override description =\n 'Send a spend request through the connected agent';\n\n static override flags = {\n amount: Flags.integer({\n required: true,\n description: 'Amount in cents',\n }),\n category: Flags.string({\n required: true,\n description: 'Spend category',\n options: ['api', 'compute', 'contractor', 'transfer'],\n }),\n rail: Flags.string({\n required: true,\n description: 'Payment rail',\n options: ['crypto_onchain', 'x402', 'internal'],\n }),\n vendor: Flags.string({ description: 'Vendor name' }),\n description: Flags.string({\n required: true,\n description: 'Spend description',\n }),\n 'recipient-agent': Flags.string({\n description: 'Recipient agent ID (for agent-to-agent)',\n }),\n 'recipient-address': Flags.string({\n description: 'Recipient wallet address (for on-chain)',\n }),\n 'server-url': Flags.string({ env: 'STAMN_SERVER_URL' }),\n 'agent-id': Flags.string({ env: 'STAMN_AGENT_ID' }),\n 'api-key': Flags.string({ env: 'STAMN_API_KEY' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Spend);\n const configStore = new ConfigStore();\n const config = { ...configStore.getAll() };\n\n if (flags['server-url']) config.serverUrl = flags['server-url'];\n if (flags['agent-id']) config.agentId = flags['agent-id'];\n if (flags['api-key']) config.apiKey = flags['api-key'];\n\n if (!config.agentId) {\n this.error('agentId is required. Run: stamn config set
|
|
1
|
+
{"version":3,"sources":["../../src/commands/spend.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { ConfigStore } from '../config/config-store.js';\nimport { createLogger } from '../logging/logger.js';\nimport { WSClient } from '../ws/ws-client.js';\nimport { SpendClient } from '../spend/spend-client.js';\nimport type { LedgerCategory, LedgerRail } from '@stamn/types';\n\nexport default class Spend extends Command {\n static override description =\n 'Send a spend request through the connected agent';\n\n static override flags = {\n amount: Flags.integer({\n required: true,\n description: 'Amount in cents',\n }),\n category: Flags.string({\n required: true,\n description: 'Spend category',\n options: ['api', 'compute', 'contractor', 'transfer'],\n }),\n rail: Flags.string({\n required: true,\n description: 'Payment rail',\n options: ['crypto_onchain', 'x402', 'internal'],\n }),\n vendor: Flags.string({ description: 'Vendor name' }),\n description: Flags.string({\n required: true,\n description: 'Spend description',\n }),\n 'recipient-agent': Flags.string({\n description: 'Recipient agent ID (for agent-to-agent)',\n }),\n 'recipient-address': Flags.string({\n description: 'Recipient wallet address (for on-chain)',\n }),\n 'server-url': Flags.string({ env: 'STAMN_SERVER_URL' }),\n 'agent-id': Flags.string({ env: 'STAMN_AGENT_ID' }),\n 'api-key': Flags.string({ env: 'STAMN_API_KEY' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Spend);\n const configStore = new ConfigStore();\n const config = { ...configStore.getAll() };\n\n if (flags['server-url']) config.serverUrl = flags['server-url'];\n if (flags['agent-id']) config.agentId = flags['agent-id'];\n if (flags['api-key']) config.apiKey = flags['api-key'];\n\n if (!config.agentId) {\n this.error('agentId is required. Run: stamn config set agent-id <uuid>');\n }\n\n const logger = createLogger({ logLevel: 'info' });\n\n this.log(`Connecting to ${config.serverUrl}...`);\n\n const client = new WSClient({\n config,\n logger,\n onCommand: () => {},\n onDisconnect: () => {},\n onConnected: async () => {\n this.log('Authenticated. Sending spend request...\\n');\n\n const spendClient = new SpendClient(client, logger);\n const result = await spendClient.request({\n amountCents: flags.amount,\n category: flags.category as LedgerCategory,\n rail: flags.rail as LedgerRail,\n vendor: flags.vendor,\n description: flags.description,\n recipientAgentId: flags['recipient-agent'],\n recipientAddress: flags['recipient-address'],\n });\n\n if (result.approved) {\n this.log('Spend APPROVED');\n this.log(` Ledger Entry: ${result.ledgerEntryId}`);\n if (result.transactionHash) {\n this.log(` Tx Hash: ${result.transactionHash}`);\n }\n this.log(` Remaining: ${result.remainingBalanceCents} cents`);\n } else {\n this.log('Spend DENIED');\n this.log(` Reason: ${result.reason}`);\n this.log(` Code: ${result.code}`);\n }\n\n client.disconnect();\n process.exit(0);\n },\n });\n\n client.connect();\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/start.js
CHANGED
|
@@ -49,7 +49,7 @@ var Start = class _Start extends Command {
|
|
|
49
49
|
config.logLevel = flags["log-level"];
|
|
50
50
|
if (!config.agentId) {
|
|
51
51
|
this.error(
|
|
52
|
-
"agentId is required. Run: stamn config set
|
|
52
|
+
"agentId is required. Run: stamn config set agent-id <uuid>"
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
55
|
const dm = new DaemonManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/start.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { ConfigStore } from '../config/config-store.js';\nimport type { AgentConfig } from '../config/config-schema.js';\nimport { createLogger } from '../logging/logger.js';\nimport { WSClient } from '../ws/ws-client.js';\nimport { SpendClient } from '../spend/spend-client.js';\nimport { DaemonManager } from '../daemon/daemon-manager.js';\n\nexport default class Start extends Command {\n static override description = 'Start the Stamn agent daemon';\n\n static override flags = {\n daemon: Flags.boolean({\n char: 'd',\n description: 'Run as background daemon',\n default: false,\n }),\n 'server-url': Flags.string({\n description: 'Override server URL',\n env: 'STAMN_SERVER_URL',\n }),\n 'agent-id': Flags.string({\n description: 'Override agent ID',\n env: 'STAMN_AGENT_ID',\n }),\n 'api-key': Flags.string({\n description: 'Override API key',\n env: 'STAMN_API_KEY',\n }),\n 'log-level': Flags.string({\n description: 'Override log level',\n options: ['trace', 'debug', 'info', 'warn', 'error', 'fatal'],\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Start);\n const configStore = new ConfigStore();\n const config = { ...configStore.getAll() };\n\n // Apply flag overrides\n if (flags['server-url']) config.serverUrl = flags['server-url'];\n if (flags['agent-id']) config.agentId = flags['agent-id'];\n if (flags['api-key']) config.apiKey = flags['api-key'];\n if (flags['log-level'])\n config.logLevel = flags['log-level'] as AgentConfig['logLevel'];\n\n // Validate required fields\n if (!config.agentId) {\n this.error(\n 'agentId is required. Run: stamn config set
|
|
1
|
+
{"version":3,"sources":["../../src/commands/start.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport { ConfigStore } from '../config/config-store.js';\nimport type { AgentConfig } from '../config/config-schema.js';\nimport { createLogger } from '../logging/logger.js';\nimport { WSClient } from '../ws/ws-client.js';\nimport { SpendClient } from '../spend/spend-client.js';\nimport { DaemonManager } from '../daemon/daemon-manager.js';\n\nexport default class Start extends Command {\n static override description = 'Start the Stamn agent daemon';\n\n static override flags = {\n daemon: Flags.boolean({\n char: 'd',\n description: 'Run as background daemon',\n default: false,\n }),\n 'server-url': Flags.string({\n description: 'Override server URL',\n env: 'STAMN_SERVER_URL',\n }),\n 'agent-id': Flags.string({\n description: 'Override agent ID',\n env: 'STAMN_AGENT_ID',\n }),\n 'api-key': Flags.string({\n description: 'Override API key',\n env: 'STAMN_API_KEY',\n }),\n 'log-level': Flags.string({\n description: 'Override log level',\n options: ['trace', 'debug', 'info', 'warn', 'error', 'fatal'],\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Start);\n const configStore = new ConfigStore();\n const config = { ...configStore.getAll() };\n\n // Apply flag overrides\n if (flags['server-url']) config.serverUrl = flags['server-url'];\n if (flags['agent-id']) config.agentId = flags['agent-id'];\n if (flags['api-key']) config.apiKey = flags['api-key'];\n if (flags['log-level'])\n config.logLevel = flags['log-level'] as AgentConfig['logLevel'];\n\n // Validate required fields\n if (!config.agentId) {\n this.error(\n 'agentId is required. Run: stamn config set agent-id <uuid>',\n );\n }\n\n // Check for existing daemon\n const dm = new DaemonManager();\n const { running, pid } = dm.isRunning();\n if (running) {\n this.error(`Daemon already running (PID ${pid})`);\n }\n\n // Daemonize if requested\n if (flags.daemon) {\n const { daemonizeProcess } = await import('../daemon/process.js');\n await daemonizeProcess();\n }\n\n // Write PID\n dm.writePid(process.pid);\n\n const logger = createLogger(config);\n logger.info(\n { agentId: config.agentId, serverUrl: config.serverUrl },\n 'Starting Stamn agent',\n );\n\n // Create WebSocket client\n const client = new WSClient({\n config,\n logger,\n onCommand: (command, params) => {\n logger.info({ command, params }, 'Received command');\n if (command === 'shutdown') {\n shutdown();\n }\n },\n onDisconnect: () => {\n logger.warn('Disconnected from server');\n },\n onConnected: () => {\n logger.info('Agent is online and ready — spend capability active');\n },\n });\n\n // Create spend client — available for plugin/task integration\n const spendClient = new SpendClient(client, logger);\n\n // Expose on process for external plugin access\n (globalThis as Record<string, unknown>).__stamnSpendClient = spendClient;\n\n // Graceful shutdown\n const shutdown = () => {\n logger.info('Shutting down...');\n client.disconnect();\n dm.removePid();\n process.exit(0);\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n\n // Connect\n client.connect();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS,aAAa;AAQ/B,IAAqB,QAArB,MAAqB,eAAc,QAAQ;AAAA,EACzC,OAAgB,cAAc;AAAA,EAE9B,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,QAAQ;AAAA,MACpB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,cAAc,MAAM,OAAO;AAAA,MACzB,aAAa;AAAA,MACb,KAAK;AAAA,IACP,CAAC;AAAA,IACD,YAAY,MAAM,OAAO;AAAA,MACvB,aAAa;AAAA,MACb,KAAK;AAAA,IACP,CAAC;AAAA,IACD,WAAW,MAAM,OAAO;AAAA,MACtB,aAAa;AAAA,MACb,KAAK;AAAA,IACP,CAAC;AAAA,IACD,aAAa,MAAM,OAAO;AAAA,MACxB,aAAa;AAAA,MACb,SAAS,CAAC,SAAS,SAAS,QAAQ,QAAQ,SAAS,OAAO;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,MAAK;AACxC,UAAM,cAAc,IAAI,YAAY;AACpC,UAAM,SAAS,EAAE,GAAG,YAAY,OAAO,EAAE;AAGzC,QAAI,MAAM,YAAY,EAAG,QAAO,YAAY,MAAM,YAAY;AAC9D,QAAI,MAAM,UAAU,EAAG,QAAO,UAAU,MAAM,UAAU;AACxD,QAAI,MAAM,SAAS,EAAG,QAAO,SAAS,MAAM,SAAS;AACrD,QAAI,MAAM,WAAW;AACnB,aAAO,WAAW,MAAM,WAAW;AAGrC,QAAI,CAAC,OAAO,SAAS;AACnB,WAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,KAAK,IAAI,cAAc;AAC7B,UAAM,EAAE,SAAS,IAAI,IAAI,GAAG,UAAU;AACtC,QAAI,SAAS;AACX,WAAK,MAAM,+BAA+B,GAAG,GAAG;AAAA,IAClD;AAGA,QAAI,MAAM,QAAQ;AAChB,YAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,wBAAsB;AAChE,YAAM,iBAAiB;AAAA,IACzB;AAGA,OAAG,SAAS,QAAQ,GAAG;AAEvB,UAAM,SAAS,aAAa,MAAM;AAClC,WAAO;AAAA,MACL,EAAE,SAAS,OAAO,SAAS,WAAW,OAAO,UAAU;AAAA,MACvD;AAAA,IACF;AAGA,UAAM,SAAS,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,WAAW,CAAC,SAAS,WAAW;AAC9B,eAAO,KAAK,EAAE,SAAS,OAAO,GAAG,kBAAkB;AACnD,YAAI,YAAY,YAAY;AAC1B,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,cAAc,MAAM;AAClB,eAAO,KAAK,0BAA0B;AAAA,MACxC;AAAA,MACA,aAAa,MAAM;AACjB,eAAO,KAAK,0DAAqD;AAAA,MACnE;AAAA,IACF,CAAC;AAGD,UAAM,cAAc,IAAI,YAAY,QAAQ,MAAM;AAGlD,IAAC,WAAuC,qBAAqB;AAG7D,UAAM,WAAW,MAAM;AACrB,aAAO,KAAK,kBAAkB;AAC9B,aAAO,WAAW;AAClB,SAAG,UAAU;AACb,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,GAAG,WAAW,QAAQ;AAC9B,YAAQ,GAAG,UAAU,QAAQ;AAG7B,WAAO,QAAQ;AAAA,EACjB;AACF;","names":[]}
|