@elisym/cli 0.2.0 → 0.2.1

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
@@ -21,27 +21,72 @@ npx @elisym/cli start # Start provider mode
21
21
 
22
22
  ### Docker
23
23
 
24
+ The wallet, job ledger, and recovery state live in `~/.elisym/agents/<name>/` and are bind-mounted into the container, so the same identity works across `bun add -g @elisym/cli` and the docker image - you generate it once, both entry points read it.
25
+
26
+ **1. Bootstrap an agent** (one-time, interactive wizard):
27
+
24
28
  ```bash
25
- docker run --rm \
26
- -e ELISYM_NOSTR_SECRET="nsec1..." \
27
- -e ANTHROPIC_API_KEY="sk-ant-..." \
28
- -v ./skills:/app/skills \
29
+ docker run --rm -it \
30
+ -v "$HOME/.elisym:/root/.elisym" \
31
+ ghcr.io/elisymlabs/cli init
32
+ ```
33
+
34
+ The wizard walks you through agent name, Solana network, wallet funding, and LLM provider, and writes everything to `~/.elisym/agents/<chosen-name>/` on the host.
35
+
36
+ **2. Start provider mode** with your skills directory mounted:
37
+
38
+ ```bash
39
+ docker run --rm -it \
40
+ -v "$HOME/.elisym:/root/.elisym" \
41
+ -v "$PWD/skills:/app/skills" \
29
42
  ghcr.io/elisymlabs/cli start
30
43
  ```
31
44
 
45
+ Omit `<agent-name>` to pick interactively from agents in `~/.elisym/agents/`. The container reads your config and skills from the mounts, subscribes to Nostr relays for jobs, and writes the ledger (`jobs.json`) back to `~/.elisym/agents/<agent-name>/`. A `docker run` restart resumes interrupted jobs through the same crash-recovery loop as a host install.
46
+
47
+ ### Skill runtime dependencies
48
+
49
+ The base image ships Node and the elisym runtime only — no Python, no `ffmpeg`, no other interpreters. If your skills shell out to `python3`, `bash`, `yt-dlp`, etc., extend the image:
50
+
51
+ ```dockerfile
52
+ FROM ghcr.io/elisymlabs/cli:latest
53
+ USER root
54
+ RUN apt-get update && apt-get install -y --no-install-recommends \
55
+ python3 python3-pip ffmpeg \
56
+ && rm -rf /var/lib/apt/lists/* \
57
+ && pip3 install --no-cache-dir --break-system-packages \
58
+ yt-dlp requests
59
+ ```
60
+
61
+ Build once (`docker build -t my-elisym-agent .`) and use `my-elisym-agent` in the `docker run` commands above.
62
+
63
+ ### Encrypted configs
64
+
65
+ If you set a passphrase during `init`, the Nostr key, Solana key, **and the LLM `api_key`** are all encrypted at rest. Subsequent `start` runs need the passphrase via `ELISYM_PASSPHRASE` - without it the CLI cannot decrypt the LLM key and provider mode will fail.
66
+
67
+ ```bash
68
+ read -rs ELISYM_PASSPHRASE && export ELISYM_PASSPHRASE
69
+ docker run --rm -it \
70
+ -v "$HOME/.elisym:/root/.elisym" \
71
+ -v "$PWD/skills:/app/skills" \
72
+ -e ELISYM_PASSPHRASE \
73
+ ghcr.io/elisymlabs/cli start
74
+ ```
75
+
76
+ `read -rs` prompts for the passphrase without echoing it, and `-e ELISYM_PASSPHRASE` (no `=value`) inherits it from the shell - so the value never appears in `~/.bash_history` or in the `docker` command line (`ps auxe`). Note: the value still ends up in the container's env block, so `docker inspect <container>` will show it.
77
+
78
+ > Env vars are visible to other processes via `/proc/<pid>/environ` on Linux. For production mainnet use, prefer an OS keyring or credential helper.
79
+
32
80
  ## Commands
33
81
 
34
- | Command | Description |
35
- | ------------------------------------ | -------------------------------------------- |
36
- | `elisym init` | Interactive wizard - create agent identity |
37
- | `elisym start [name]` | Start agent in provider mode |
38
- | `elisym list` | List all agents |
39
- | `elisym status <name>` | Show agent status |
40
- | `elisym profile [name]` | Edit agent profile, wallet, and LLM settings |
41
- | `elisym wallet [name]` | Show Solana wallet balance |
42
- | `elisym send <name> <addr> <amount>` | Send SOL |
43
- | `elisym config <name>` | Show config (secrets redacted) |
44
- | `elisym delete <name>` | Delete an agent |
82
+ | Command | Description |
83
+ | ----------------------- | -------------------------------------------- |
84
+ | `elisym init` | Interactive wizard - create agent identity |
85
+ | `elisym start [name]` | Start agent in provider mode |
86
+ | `elisym list` | List all agents |
87
+ | `elisym profile [name]` | Edit agent profile, wallet, and LLM settings |
88
+ | `elisym wallet [name]` | Show Solana wallet balance |
89
+ | `elisym delete <name>` | Delete an agent |
45
90
 
46
91
  The agent loads skills from `./skills/` in the current working directory. Each skill is a subdirectory with a `SKILL.md` file:
47
92
 
package/dist/index.js CHANGED
@@ -2041,9 +2041,6 @@ async function cmdWallet(name) {
2041
2041
  console.log(` Balance: ${formatSol(balance)} (${balance} lamports)
2042
2042
  `);
2043
2043
  }
2044
- async function cmdSend(_name, _address, _amount) {
2045
- console.error("Direct sending not yet implemented. Use the MCP server for payments.");
2046
- }
2047
2044
 
2048
2045
  // src/index.ts
2049
2046
  init_config();
@@ -2088,30 +2085,7 @@ program.command("list").description("List all agents").action(() => {
2088
2085
  }
2089
2086
  console.log();
2090
2087
  });
2091
- program.command("status <name>").description("Show agent status").action((name) => {
2092
- try {
2093
- const config = loadConfig(name);
2094
- console.log(`
2095
- Agent: ${name}`);
2096
- console.log(` Description: ${config.identity.description || "(none)"}`);
2097
- console.log(
2098
- ` Capabilities: ${(config.capabilities ?? []).map((c) => c.name).join(", ") || "(none)"}`
2099
- );
2100
- console.log(` Relays: ${config.relays.join(", ")}`);
2101
- if (config.payments?.length) {
2102
- console.log(` Network: ${config.payments[0].network}`);
2103
- console.log(` Address: ${config.payments[0].address}`);
2104
- }
2105
- if (config.llm) {
2106
- console.log(` LLM: ${config.llm.provider} / ${config.llm.model}`);
2107
- }
2108
- console.log();
2109
- } catch (e) {
2110
- console.error(`Error: ${e.message}`);
2111
- }
2112
- });
2113
2088
  program.command("wallet [name]").description("Show wallet balance").action(cmdWallet);
2114
- program.command("send <name> <address> <amount>").description("Send SOL from agent wallet").action(cmdSend);
2115
2089
  program.command("delete <name>").description("Delete an agent").action(async (name) => {
2116
2090
  const { default: inquirer } = await import('inquirer');
2117
2091
  const { confirm } = await inquirer.prompt([
@@ -2127,20 +2101,6 @@ program.command("delete <name>").description("Delete an agent").action(async (na
2127
2101
  console.log(`Agent "${name}" deleted.`);
2128
2102
  }
2129
2103
  });
2130
- program.command("config <name>").description("Show agent config (secrets redacted)").action((name) => {
2131
- try {
2132
- const config = loadConfig(name);
2133
- const redacted = {
2134
- ...config,
2135
- identity: { ...config.identity, secret_key: "***REDACTED***" },
2136
- wallet: config.wallet ? { ...config.wallet, secret_key: "***REDACTED***" } : void 0,
2137
- llm: config.llm ? { ...config.llm, api_key: "***REDACTED***" } : void 0
2138
- };
2139
- console.log(JSON.stringify(redacted, null, 2));
2140
- } catch (e) {
2141
- console.error(`Error: ${e.message}`);
2142
- }
2143
- });
2144
2104
  program.parse();
2145
2105
  //# sourceMappingURL=index.js.map
2146
2106
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/commands/init.ts","../src/index.ts","../src/commands/profile.ts","../src/commands/start.ts","../src/helpers.ts","../src/ledger.ts","../src/llm/index.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/script-skill.ts","../src/skill/loader.ts","../src/transport/nostr.ts","../src/commands/wallet.ts","../src/version.ts"],"names":["readFileSync","resolveImage","existsSync","basename","ElisymIdentity","MediaService","PublicKey","fetchModels","encryptSecret","join","homedir","mkdirSync","writeFileSync","calculateProtocolFee","readdirSync","statSync","isEncrypted","cmdInit","Connection","RELAYS","jobRequestKind","formatSol","dirname","nip19","getPublicKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Agent config management - load/save/list/delete from ~/.elisym/agents/<name>/\n * Uses shared config types and serialization from @elisym/sdk.\n */\nimport { readFileSync, writeFileSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { validateAgentName, serializeConfig, type AgentConfig } from '@elisym/sdk';\nimport { parseConfig } from '@elisym/sdk/node';\n\nexport type { AgentConfig } from '@elisym/sdk';\nexport type { Identity, Capability, PaymentAddress, WalletConfig, LlmConfig } from '@elisym/sdk';\nexport { validateAgentName };\n\nconst AGENTS_ROOT = join(homedir(), '.elisym', 'agents');\n\nfunction agentDir(name: string): string {\n return join(AGENTS_ROOT, name);\n}\n\nfunction configPath(name: string): string {\n return join(AGENTS_ROOT, name, 'config.json');\n}\n\nexport function loadConfig(name: string, passphrase?: string): AgentConfig {\n validateAgentName(name);\n const path = configPath(name);\n const raw = readFileSync(path, 'utf-8');\n return parseConfig(raw, passphrase);\n}\n\nexport function saveConfig(config: AgentConfig): void {\n validateAgentName(config.identity.name);\n const dir = agentDir(config.identity.name);\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, 'config.json'), serializeConfig(config), { mode: 0o600 });\n}\n\nexport function listAgents(): string[] {\n try {\n return readdirSync(AGENTS_ROOT).filter((name) => {\n try {\n statSync(join(AGENTS_ROOT, name, 'config.json'));\n return true;\n } catch {\n return false;\n }\n });\n } catch {\n return [];\n }\n}\n\nexport function deleteAgent(name: string): void {\n validateAgentName(name);\n // Overwrite sensitive files with zeros before deletion to prevent forensic recovery\n const dir = agentDir(name);\n for (const file of ['config.json', 'jobs.json']) {\n try {\n const filePath = join(dir, file);\n const size = statSync(filePath).size;\n writeFileSync(filePath, Buffer.alloc(size, 0));\n } catch {\n /* file may not exist */\n }\n }\n // Zero-fill corrupt ledger backups (contain customer IDs, job inputs)\n try {\n for (const entry of readdirSync(dir)) {\n if (entry.startsWith('jobs.json.corrupt.')) {\n try {\n const fp = join(dir, entry);\n writeFileSync(fp, Buffer.alloc(statSync(fp).size, 0));\n } catch {\n /* best effort */\n }\n }\n }\n } catch {\n /* dir may not exist */\n }\n rmSync(dir, { recursive: true, force: true });\n}\n","/**\n * Init command - interactive wizard to create a new agent.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport { ElisymIdentity, MediaService, RELAYS } from '@elisym/sdk';\nimport { encryptSecret } from '@elisym/sdk/node';\nimport { PublicKey } from '@solana/web3.js';\nimport { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools';\nimport { saveConfig, listAgents, validateAgentName, type AgentConfig } from '../config.js';\n\n/** Resolve an image input: if local file exists, upload via MediaService; otherwise treat as URL. */\nasync function resolveImage(\n input: string,\n identity: ElisymIdentity,\n media: MediaService,\n): Promise<string> {\n if (!input) {\n return '';\n }\n if (existsSync(input)) {\n console.log(` Uploading ${basename(input)}...`);\n const data = readFileSync(input);\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(input));\n console.log(` Uploaded: ${url}`);\n return url;\n }\n // Not a file - treat as URL\n return input;\n}\n\nconst FALLBACK_MODELS: Record<string, string[]> = {\n anthropic: ['claude-sonnet-4-6', 'claude-haiku-4-5-20251001', 'claude-opus-4-6'],\n openai: ['gpt-4o', 'gpt-4o-mini', 'o3-mini'],\n};\n\nexport async function fetchModels(provider: string, apiKey: string): Promise<string[]> {\n try {\n if (provider === 'anthropic') {\n const res = await fetch('https://api.anthropic.com/v1/models?limit=1000', {\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n });\n if (!res.ok) {\n throw new Error(`${res.status}`);\n }\n const data = (await res.json()) as { data?: { id: string }[] };\n const models = (data.data ?? []).map((m) => m.id).sort();\n return models.length > 0 ? models : FALLBACK_MODELS.anthropic!;\n }\n if (provider === 'openai') {\n const res = await fetch('https://api.openai.com/v1/models', {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) {\n throw new Error(`${res.status}`);\n }\n const data = (await res.json()) as { data?: { id: string }[] };\n const models = (data.data ?? [])\n .map((m) => m.id)\n .filter(\n (id) =>\n (id.startsWith('gpt-') ||\n id.startsWith('o1') ||\n id.startsWith('o3') ||\n id.startsWith('o4') ||\n id.startsWith('chatgpt-')) &&\n !id.includes('instruct') &&\n !id.includes('realtime') &&\n !id.includes('audio') &&\n !id.includes('tts') &&\n !id.includes('whisper'),\n )\n .sort();\n return models.length > 0 ? models : FALLBACK_MODELS.openai!;\n }\n return ['gpt-4o'];\n } catch (e: any) {\n console.warn(` ! Could not fetch models: ${e.message}. Using defaults.`);\n return FALLBACK_MODELS[provider] ?? ['gpt-4o'];\n }\n}\n\nexport async function cmdInit(): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n\n console.log('\\n elisym agent setup\\n');\n\n // Step 1: Agent name\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Agent name:',\n validate: (v: string) => {\n try {\n validateAgentName(v);\n return true;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n ]);\n\n const existing = listAgents();\n if (existing.includes(name)) {\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: `Agent \"${name}\" already exists. Overwrite?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n }\n\n // Step 2: Description\n const { description } = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: 'An elisym AI agent',\n },\n ]);\n\n // Step 2b: Profile images (local path or URL)\n const { pictureInput } = await inquirer.prompt([\n {\n type: 'input',\n name: 'pictureInput',\n message: 'Avatar image (URL or local path, optional):',\n default: '',\n },\n ]);\n\n const { bannerInput } = await inquirer.prompt([\n {\n type: 'input',\n name: 'bannerInput',\n message: 'Banner image (URL or local path, optional):',\n default: '',\n },\n ]);\n\n // Step 3: Solana address\n const { solanaAddress } = await inquirer.prompt([\n {\n type: 'input',\n name: 'solanaAddress',\n message: 'Solana address for receiving payments (leave empty to skip):',\n default: '',\n validate: (v: string) => {\n if (!v) {\n return true;\n }\n try {\n const pk = new PublicKey(v);\n return pk.toBase58().length > 0;\n } catch {\n return 'Invalid Solana address';\n }\n },\n },\n ]);\n\n // Step 4b: Solana network\n const { network } = await inquirer.prompt([\n {\n type: 'list',\n name: 'network',\n message: 'Solana network:',\n choices: [\n { name: 'devnet', value: 'devnet' },\n { name: 'testnet', value: 'testnet' },\n { name: 'mainnet', value: 'mainnet' },\n ],\n default: 'devnet',\n },\n ]);\n\n // Step 5: LLM provider\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' },\n { name: 'OpenAI (GPT)', value: 'openai' },\n ],\n },\n ]);\n\n // Step 6: API key\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${llmProvider === 'anthropic' ? 'Anthropic' : 'OpenAI'} API key:`,\n mask: '*',\n },\n ]);\n\n // Step 7: Model (fetch from API, fallback to hardcoded)\n console.log(' Fetching available models...');\n const models = await fetchModels(llmProvider, apiKey);\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n },\n ]);\n\n // Step 8: Max tokens\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: 4096,\n },\n ]);\n\n // Step 9: Passphrase for encrypting secrets\n const { passphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to encrypt secrets (leave empty to skip):',\n mask: '*',\n },\n ]);\n\n if (passphrase) {\n const { confirmPassphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'confirmPassphrase',\n message: 'Confirm passphrase:',\n mask: '*',\n validate: (v: string) => (v === passphrase ? true : 'Passphrases do not match'),\n },\n ]);\n void confirmPassphrase;\n }\n\n // Generate Nostr identity\n const nostrSecretKey = generateSecretKey();\n const nostrPubkey = getPublicKey(nostrSecretKey);\n const nostrSecretHex = Buffer.from(nostrSecretKey).toString('hex');\n const identity = ElisymIdentity.fromHex(nostrSecretHex);\n\n // Upload local images if needed\n const media = new MediaService();\n let picture = '';\n let banner = '';\n\n if (pictureInput || bannerInput) {\n console.log();\n if (pictureInput) {\n picture = await resolveImage(pictureInput, identity, media);\n }\n if (bannerInput) {\n banner = await resolveImage(bannerInput, identity, media);\n }\n }\n\n // Helper to optionally encrypt a secret\n const protect = (secret: string): string =>\n passphrase ? encryptSecret(secret, passphrase) : secret;\n\n const config: AgentConfig = {\n identity: {\n secret_key: protect(nostrSecretHex),\n name,\n description,\n picture: picture || undefined,\n banner: banner || undefined,\n },\n relays: [...RELAYS],\n payments: solanaAddress ? [{ chain: 'solana', network, address: solanaAddress }] : undefined,\n llm: {\n provider: llmProvider,\n api_key: protect(apiKey),\n model,\n max_tokens: maxTokens,\n },\n };\n\n saveConfig(config);\n\n const npub = nip19.npubEncode(nostrPubkey);\n console.log(`\\n Agent \"${name}\" created.`);\n console.log(` Nostr: ${npub}`);\n if (solanaAddress) {\n console.log(` Solana: ${solanaAddress}`);\n }\n if (passphrase) {\n console.log(' Secrets encrypted with your passphrase.');\n }\n console.log(` Config: ~/.elisym/agents/${name}/config.json\\n`);\n}\n","/**\n * elisym CLI - agent runner for the elisym network.\n *\n * Commands:\n * elisym init Create a new agent (interactive wizard)\n * elisym start [name] Start agent in provider mode\n * elisym list List all agents\n * elisym status <name> Show agent status\n * elisym wallet [name] Show wallet balance\n * elisym send <name> <address> <amount> Send SOL\n * elisym delete <name> Delete an agent\n * elisym config <name> Show agent config (redacted)\n */\nprocess.removeAllListeners('warning');\nimport { Command } from 'commander';\nimport { nip19, getPublicKey } from 'nostr-tools';\nimport { cmdInit } from './commands/init.js';\nimport { cmdProfile } from './commands/profile.js';\nimport { cmdStart } from './commands/start.js';\nimport { cmdWallet, cmdSend } from './commands/wallet.js';\nimport { loadConfig, listAgents, deleteAgent } from './config.js';\nimport { PACKAGE_VERSION } from './version.js';\n\nconst program = new Command()\n .name('elisym')\n .description('CLI agent runner for the elisym network')\n .version(PACKAGE_VERSION);\n\n// Init\nprogram.command('init').description('Create a new agent (interactive wizard)').action(cmdInit);\n\n// Profile\nprogram\n .command('profile [name]')\n .description('Edit agent profile, wallet, and LLM settings')\n .action(cmdProfile);\n\n// Start\nprogram.command('start [name]').description('Start agent in provider mode').action(cmdStart);\n\n// List\nprogram\n .command('list')\n .description('List all agents')\n .action(() => {\n const agents = listAgents();\n if (agents.length === 0) {\n console.log('No agents found. Run `elisym init` to create one.');\n return;\n }\n console.log('\\nAgents:');\n for (const name of agents) {\n try {\n const config = loadConfig(name);\n const secretKey = config.identity.secret_key;\n let npub = '(encrypted)';\n if (!secretKey.startsWith('encrypted:')) {\n const secretBytes = Buffer.from(secretKey, 'hex');\n npub =\n secretBytes.length === 32\n ? nip19.npubEncode(getPublicKey(secretBytes))\n : '(invalid key)';\n }\n const solAddr = config.payments?.[0]?.address\n ? ` | Solana: ${config.payments[0].address}`\n : '';\n console.log(` ${name} | ${npub}${solAddr}`);\n } catch {\n console.log(` ${name} (error loading config)`);\n }\n }\n console.log();\n });\n\n// Status\nprogram\n .command('status <name>')\n .description('Show agent status')\n .action((name: string) => {\n try {\n const config = loadConfig(name);\n console.log(`\\nAgent: ${name}`);\n console.log(` Description: ${config.identity.description || '(none)'}`);\n console.log(\n ` Capabilities: ${(config.capabilities ?? []).map((c) => c.name).join(', ') || '(none)'}`,\n );\n console.log(` Relays: ${config.relays.join(', ')}`);\n if (config.payments?.length) {\n console.log(` Network: ${config.payments[0].network}`);\n console.log(` Address: ${config.payments[0].address}`);\n }\n if (config.llm) {\n console.log(` LLM: ${config.llm.provider} / ${config.llm.model}`);\n }\n console.log();\n } catch (e: any) {\n console.error(`Error: ${e.message}`);\n }\n });\n\n// Wallet\nprogram.command('wallet [name]').description('Show wallet balance').action(cmdWallet);\n\n// Send\nprogram\n .command('send <name> <address> <amount>')\n .description('Send SOL from agent wallet')\n .action(cmdSend);\n\n// Delete\nprogram\n .command('delete <name>')\n .description('Delete an agent')\n .action(async (name: string) => {\n const { default: inquirer } = await import('inquirer');\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Delete agent \"${name}\"? This cannot be undone.`,\n default: false,\n },\n ]);\n if (confirm) {\n deleteAgent(name);\n console.log(`Agent \"${name}\" deleted.`);\n }\n });\n\n// Config\nprogram\n .command('config <name>')\n .description('Show agent config (secrets redacted)')\n .action((name: string) => {\n try {\n const config = loadConfig(name);\n const redacted = {\n ...config,\n identity: { ...config.identity, secret_key: '***REDACTED***' },\n wallet: config.wallet ? { ...config.wallet, secret_key: '***REDACTED***' } : undefined,\n llm: config.llm ? { ...config.llm, api_key: '***REDACTED***' } : undefined,\n };\n console.log(JSON.stringify(redacted, null, 2));\n } catch (e: any) {\n console.error(`Error: ${e.message}`);\n }\n });\n\nprogram.parse();\n","/**\n * Profile command - edit agent profile, wallet, and LLM settings.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport { ElisymIdentity, MediaService } from '@elisym/sdk';\nimport { encryptSecret, isEncrypted } from '@elisym/sdk/node';\nimport { PublicKey } from '@solana/web3.js';\nimport { loadConfig, saveConfig, listAgents } from '../config.js';\n\nasync function resolveImage(\n input: string,\n identity: ElisymIdentity,\n media: MediaService,\n): Promise<string> {\n if (!input) {\n return '';\n }\n if (existsSync(input)) {\n console.log(` Uploading ${basename(input)}...`);\n const data = readFileSync(input);\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(input));\n console.log(` Uploaded: ${url}`);\n return url;\n }\n return input;\n}\n\nexport async function cmdProfile(name: string | undefined): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n\n // Resolve agent name\n if (!name) {\n const agents = listAgents();\n if (agents.length === 0) {\n console.error('No agents found. Run `elisym init` first.');\n process.exit(1);\n }\n const { selected } = await inquirer.prompt([\n { type: 'list', name: 'selected', message: 'Select agent:', choices: agents },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const config = loadConfig(name!, passphrase);\n const identity = ElisymIdentity.fromHex(config.identity.secret_key);\n\n console.log(`\\n Editing agent \"${name}\"\\n`);\n\n // Menu loop\n let done = false;\n while (!done) {\n const { section } = await inquirer.prompt([\n {\n type: 'list',\n name: 'section',\n message: 'What to edit?',\n choices: [\n { name: `Profile (name: ${config.identity.name})`, value: 'profile' },\n {\n name: `Wallet (${config.payments?.[0]?.address ?? 'not configured'})`,\n value: 'wallet',\n },\n {\n name: `LLM (${config.llm?.provider ?? 'not configured'} / ${config.llm?.model ?? '-'})`,\n value: 'llm',\n },\n { name: 'Done', value: 'done' },\n ],\n },\n ]);\n\n if (section === 'done') {\n done = true;\n continue;\n }\n\n if (section === 'profile') {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: config.identity.description ?? '',\n },\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar (URL or local path):',\n default: config.identity.picture ?? '',\n },\n {\n type: 'input',\n name: 'banner',\n message: 'Banner (URL or local path):',\n default: config.identity.banner ?? '',\n },\n ]);\n\n config.identity.description = answers.description || undefined;\n\n const media = new MediaService();\n if (answers.picture) {\n config.identity.picture = await resolveImage(answers.picture, identity, media);\n } else {\n config.identity.picture = undefined;\n }\n if (answers.banner) {\n config.identity.banner = await resolveImage(answers.banner, identity, media);\n } else {\n config.identity.banner = undefined;\n }\n\n saveConfig(config);\n console.log(' Profile updated.\\n');\n }\n\n if (section === 'wallet') {\n const currentAddress = config.payments?.[0]?.address ?? '';\n const currentNetwork = config.payments?.[0]?.network ?? 'devnet';\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Solana address:',\n default: currentAddress,\n validate: (v: string) => {\n if (!v) {\n return true;\n }\n try {\n const pk = new PublicKey(v);\n return pk.toBase58().length > 0;\n } catch {\n return 'Invalid Solana address';\n }\n },\n },\n {\n type: 'list',\n name: 'network',\n message: 'Network:',\n choices: ['devnet', 'testnet', 'mainnet'],\n default: currentNetwork,\n },\n ]);\n\n if (answers.address) {\n config.payments = [{ chain: 'solana', network: answers.network, address: answers.address }];\n } else {\n config.payments = undefined;\n }\n\n saveConfig(config);\n console.log(' Wallet updated.\\n');\n }\n\n if (section === 'llm') {\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' },\n { name: 'OpenAI (GPT)', value: 'openai' },\n ],\n default: config.llm?.provider ?? 'anthropic',\n },\n ]);\n\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `API key (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n\n const effectiveKey = apiKey || config.llm?.api_key || '';\n\n // Fetch models with the effective key\n let plainKey = effectiveKey;\n if (isEncrypted(plainKey) && passphrase) {\n const { decryptSecret } = await import('@elisym/sdk/node');\n plainKey = decryptSecret(plainKey, passphrase);\n }\n\n console.log(' Fetching available models...');\n const { fetchModels } = await import('./init.js');\n const models = await fetchModels(llmProvider, plainKey);\n\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n default: config.llm?.model,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: config.llm?.max_tokens ?? 4096,\n },\n ]);\n\n const protect = (secret: string): string =>\n passphrase ? encryptSecret(secret, passphrase) : secret;\n\n config.llm = {\n provider: llmProvider,\n api_key: apiKey ? protect(apiKey) : effectiveKey,\n model,\n max_tokens: maxTokens,\n };\n\n saveConfig(config);\n console.log(' LLM updated.\\n');\n }\n }\n\n console.log(` Agent \"${name}\" saved.\\n`);\n}\n","/**\n * Start command - run agent in provider mode.\n * Loads all skills, publishes per-capability cards, processes jobs with per-capability pricing.\n */\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport {\n ElisymClient,\n ElisymIdentity,\n MediaService,\n formatSol,\n RELAYS,\n DEFAULTS,\n DEFAULT_KIND_OFFSET,\n jobRequestKind,\n} from '@elisym/sdk';\nimport type { CapabilityCard } from '@elisym/sdk';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport { loadConfig, listAgents } from '../config.js';\nimport {\n getRpcUrl,\n HEARTBEAT_INTERVAL_MS,\n MAX_CONCURRENT_JOBS,\n RECOVERY_MAX_RETRIES,\n RECOVERY_INTERVAL_SECS,\n} from '../helpers.js';\nimport { JobLedger } from '../ledger.js';\nimport { createLlmClient } from '../llm/index.js';\nimport { AgentRuntime, type RuntimeConfig } from '../runtime.js';\nimport { SkillRegistry } from '../skill/index.js';\nimport type { SkillContext } from '../skill/index.js';\nimport { loadSkillsFromDir } from '../skill/loader.js';\nimport { NostrTransport } from '../transport/nostr.js';\n\nexport async function cmdStart(name: string | undefined): Promise<void> {\n // -- Step 1: Resolve agent name --\n if (!name) {\n const agents = listAgents();\n if (agents.length === 0) {\n console.log('No agents configured. Run `elisym init` first.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const choices = [...agents, { name: '+ Create new agent', value: '__new__' }];\n const { selected } = await inquirer.prompt([\n { type: 'list', name: 'selected', message: 'Select agent to start', choices },\n ]);\n if (selected === '__new__') {\n const { cmdInit } = await import('./init.js');\n await cmdInit();\n\n return;\n }\n name = selected;\n }\n\n // -- Step 2: Load config (with optional passphrase for encrypted keys) --\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const config = loadConfig(name!, passphrase);\n\n // -- Step 3: Banner + starting message --\n console.log(`\\n Starting agent ${name}...\\n`);\n\n // -- Step 4: Resolve Solana address and show balance --\n let solanaAddress: string | undefined;\n if (config.payments?.length) {\n const solPayment = config.payments.find((p) => p.chain === 'solana');\n if (solPayment) {\n solanaAddress = solPayment.address;\n }\n }\n\n const walletNetwork = config.payments?.find((p) => p.chain === 'solana')?.network ?? 'devnet';\n\n if (solanaAddress) {\n try {\n const rpcUrl = getRpcUrl(walletNetwork);\n const connection = new Connection(rpcUrl, { disableRetryOnRateLimit: true });\n const pubkey = new PublicKey(solanaAddress);\n const balance = await connection.getBalance(pubkey);\n\n console.log(' Wallet');\n console.log(` Network ${walletNetwork}`);\n console.log(` Address ${solanaAddress}`);\n if (process.env.SOLANA_RPC_URL) {\n console.log(` RPC ${process.env.SOLANA_RPC_URL} (custom)`);\n }\n console.log(` Balance ${formatSol(balance)} (${balance} lamports)`);\n\n if (balance === 0) {\n if (walletNetwork === 'mainnet') {\n console.log(\n ' ! Warning: wallet is empty. First incoming payment needs rent-exempt SOL (~0.00089 SOL).',\n );\n } else {\n console.log(' ! Wallet is empty. Get devnet SOL: https://faucet.solana.com');\n }\n }\n if (walletNetwork === 'mainnet' && !process.env.SOLANA_RPC_URL) {\n console.log(\n ' ! Warning: using public Solana RPC for mainnet. Set SOLANA_RPC_URL for reliable operation.',\n );\n }\n console.log();\n } catch (e: any) {\n console.warn(` ! Wallet error: ${e.message}\\n`);\n }\n }\n\n // -- Step 5: LLM check --\n if (!config.llm) {\n console.error(' ! No LLM configured. Run `elisym init` to set up LLM.\\n');\n process.exit(1);\n }\n\n // -- Step 6: Load and register all skills --\n const skillsDir = join(process.cwd(), 'skills');\n const allSkills = loadSkillsFromDir(skillsDir);\n\n if (allSkills.length === 0) {\n console.error(` ! No skills found in ${skillsDir}\\n`);\n console.error(' Create a skill directory with a SKILL.md to get started.');\n console.error(' Example: ./skills/my-skill/SKILL.md\\n');\n process.exit(1);\n }\n\n const registry = new SkillRegistry();\n for (const skill of allSkills) {\n registry.register(skill);\n const price = skill.priceLamports > 0 ? formatSol(skill.priceLamports) : 'free';\n console.log(` * Skill: ${skill.name} [${skill.capabilities.join(', ')}] - ${price}`);\n }\n console.log();\n\n // Validate that paid skills have a Solana address configured\n const hasPaid = allSkills.some((s) => s.priceLamports > 0);\n if (hasPaid && !solanaAddress) {\n console.error(' ! Paid skills require a Solana address. Run `elisym init` to configure.\\n');\n process.exit(1);\n }\n\n // -- Step 8: Build LLM client --\n const llm = createLlmClient({\n provider: config.llm!.provider as any,\n apiKey: config.llm!.api_key,\n model: config.llm!.model,\n maxTokens: config.llm!.max_tokens,\n logUsage: true,\n });\n\n const skillCtx: SkillContext = {\n llm,\n agentName: config.identity.name,\n agentDescription: config.identity.description ?? '',\n };\n\n // -- Step 9: Connect to relays --\n console.log(' Connecting to relays and publishing capabilities...');\n\n const identity = ElisymIdentity.fromHex(config.identity.secret_key);\n const relays = config.relays?.length ? config.relays : [...RELAYS];\n const client = new ElisymClient({ relays });\n\n // -- Step 10: Upload skill images (image_file -> image URL in SKILL.md) --\n const media = new MediaService();\n\n for (const skill of allSkills) {\n if (skill.image || !skill.imageFile) {\n continue;\n }\n // Upload local file and write URL back to SKILL.md\n try {\n const filePath = join(skillsDir, skill.name, skill.imageFile);\n console.log(` Uploading ${basename(filePath)}...`);\n const data = readFileSync(filePath);\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(filePath));\n console.log(` Uploaded: ${url}`);\n skill.image = url;\n\n // Write URL back to SKILL.md so it's not re-uploaded next time\n const skillMdPath = join(skillsDir, skill.name, 'SKILL.md');\n const mdContent = readFileSync(skillMdPath, 'utf-8');\n const updated = mdContent.replace(/^(image_file:\\s*.+)$/m, (m) => `${m}\\nimage: ${url}`);\n writeFileSync(skillMdPath, updated);\n } catch (e: any) {\n console.warn(` ! Failed to upload image for \"${skill.name}\": ${e.message}`);\n }\n }\n\n // -- Step 11: Publish kind:0 profile --\n try {\n await client.discovery.publishProfile(\n identity,\n config.identity.name,\n config.identity.description ?? '',\n config.identity.picture,\n config.identity.banner,\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish profile: ${e.message}`);\n }\n\n // -- Step 11: Publish per-skill capability cards (kind:31990) --\n const kinds = [jobRequestKind(DEFAULT_KIND_OFFSET)];\n\n function buildCard(skill: (typeof allSkills)[0]): CapabilityCard {\n return {\n name: skill.name,\n description: skill.description,\n capabilities: skill.capabilities,\n image: skill.image,\n payment: solanaAddress\n ? {\n chain: 'solana',\n network: walletNetwork,\n address: solanaAddress,\n job_price: skill.priceLamports,\n }\n : undefined,\n };\n }\n\n for (const skill of allSkills) {\n try {\n await client.discovery.publishCapability(identity, buildCard(skill), kinds);\n } catch (e: any) {\n console.warn(` ! Failed to publish \"${skill.name}\": ${e.message}`);\n }\n }\n\n // -- Step 12: Clean up stale capabilities from relay --\n try {\n const existingEvents = await client.pool.querySync({\n kinds: [31990],\n authors: [identity.publicKey],\n '#t': ['elisym'],\n });\n const skillNames = new Set(allSkills.map((s) => s.name));\n for (const ev of existingEvents) {\n const dTag = ev.tags.find((t: string[]) => t[0] === 'd')?.[1];\n if (!dTag) {\n continue;\n }\n // Parse card to get original name\n try {\n const card = JSON.parse(ev.content);\n if (card.name && !skillNames.has(card.name)) {\n await client.discovery.deleteCapability(identity, card.name);\n console.log(` Removed stale capability: ${card.name}`);\n }\n } catch {\n // malformed event, skip\n }\n }\n } catch {\n // non-fatal: stale cards will expire naturally\n }\n\n console.log(' Connected.\\n');\n\n // -- Step 13: Start ping responder --\n const pingSub = client.ping.subscribeToPings(identity, (senderPubkey, nonce) => {\n client.ping.sendPong(identity, senderPubkey, nonce).catch(() => {});\n });\n\n // -- Step 14: Start heartbeat (republish first card to update lastSeen) --\n let heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n if (allSkills.length > 0) {\n const heartbeatCard = buildCard(allSkills[0]!);\n heartbeatTimer = setInterval(async () => {\n try {\n await client.discovery.publishCapability(identity, heartbeatCard, kinds);\n } catch {\n /* heartbeat failure is non-fatal */\n }\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n // -- Step 15: Build transport + ledger + runtime --\n const transport = new NostrTransport(client, identity, [DEFAULT_KIND_OFFSET]);\n const ledger = new JobLedger(name!);\n\n const runtimeConfig: RuntimeConfig = {\n paymentTimeoutSecs: DEFAULTS.PAYMENT_EXPIRY_SECS,\n maxConcurrentJobs: MAX_CONCURRENT_JOBS,\n recoveryMaxRetries: RECOVERY_MAX_RETRIES,\n recoveryIntervalSecs: RECOVERY_INTERVAL_SECS,\n network: walletNetwork,\n solanaAddress,\n };\n\n const runtime = new AgentRuntime(transport, registry, skillCtx, runtimeConfig, ledger, {\n onJobReceived: (job) => {\n const cap = job.tags.find((t) => t !== 'elisym') ?? 'unknown';\n console.log(` [job] ${job.jobId.slice(0, 16)} | cap=${cap}`);\n },\n onJobCompleted: (jobId) => {\n console.log(` [job] ${jobId.slice(0, 16)} | delivered`);\n },\n onJobError: (jobId, error) => {\n console.error(` [job] ${jobId.slice(0, 16)} | error: ${error}`);\n },\n onLog: (msg) => console.log(` ${msg}`),\n });\n\n // Cleanup on shutdown\n const originalStop = runtime.stop.bind(runtime);\n runtime.stop = () => {\n pingSub.close();\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n originalStop();\n };\n\n // -- Step 16: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n","/**\n * Shared CLI helpers - RPC URLs, SOL formatting, price validation.\n */\nimport { calculateProtocolFee } from '@elisym/sdk';\n\n// --- Constants ---\n\nexport const RENT_EXEMPT_MINIMUM = 890_880; // lamports\nexport const HEARTBEAT_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nexport const MAX_CONCURRENT_JOBS = 10;\nexport const RECOVERY_MAX_RETRIES = 5;\nexport const RECOVERY_INTERVAL_SECS = 60;\n\n// --- Solana RPC ---\n\nexport function getRpcUrl(network: string): string {\n const envUrl = process.env.SOLANA_RPC_URL;\n if (envUrl) {\n return envUrl;\n }\n switch (network) {\n case 'mainnet':\n return 'https://api.mainnet-beta.solana.com';\n case 'testnet':\n return 'https://api.testnet.solana.com';\n default:\n return 'https://api.devnet.solana.com';\n }\n}\n\n// --- SOL formatting (number only, no \" SOL\" suffix - use SDK's formatSol for display) ---\n\nexport function formatLamports(lamports: number): string {\n const whole = Math.floor(lamports / 1_000_000_000);\n const frac = lamports % 1_000_000_000;\n return `${whole}.${String(frac).padStart(9, '0')}`;\n}\n\n// --- SOL parsing ---\n\nexport function parseSolToLamports(s: string): number | null {\n const trimmed = s.trim();\n if (!trimmed) {\n return null;\n }\n\n const dotPos = trimmed.indexOf('.');\n if (dotPos === -1) {\n const whole = parseInt(trimmed, 10);\n if (isNaN(whole) || whole < 0) {\n return null;\n }\n return whole * 1_000_000_000;\n }\n\n const wholePart = dotPos === 0 ? 0 : parseInt(trimmed.slice(0, dotPos), 10);\n if (isNaN(wholePart)) {\n return null;\n }\n\n const fracStr = trimmed.slice(dotPos + 1);\n if (fracStr.length === 0 || fracStr.length > 9) {\n return null;\n }\n\n const padded = fracStr.padEnd(9, '0');\n const frac = parseInt(padded, 10);\n if (isNaN(frac)) {\n return null;\n }\n\n return wholePart * 1_000_000_000 + frac;\n}\n\n// --- Price validation ---\n\nexport function validateJobPrice(lamports: number, accountFunded: boolean): string | null {\n if (lamports === 0) {\n return null;\n }\n const fee = calculateProtocolFee(lamports);\n const providerNet = lamports - fee;\n if (!accountFunded && providerNet < RENT_EXEMPT_MINIMUM) {\n return (\n `Price too low. After 3% fee, provider receives ${providerNet} lamports, ` +\n `which is below rent-exempt minimum (${RENT_EXEMPT_MINIMUM}). Increase price or fund wallet first.`\n );\n }\n return null;\n}\n","/**\n * Job recovery ledger - persistent JSON storage for crash recovery.\n */\nimport { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, dirname } from 'node:path';\n\nexport type LedgerStatus = 'paid' | 'executed' | 'delivered' | 'failed';\n\nexport interface LedgerEntry {\n job_id: string;\n status: LedgerStatus;\n input: string;\n input_type: string;\n tags: string[];\n customer_id: string;\n bid?: number;\n payment_request?: string;\n net_amount?: number;\n result?: string;\n raw_event_json?: string;\n created_at: number;\n retry_count: number;\n}\n\nconst VALID_TRANSITIONS: Record<LedgerStatus, LedgerStatus[]> = {\n paid: ['executed', 'failed'],\n executed: ['delivered', 'failed'],\n delivered: [],\n failed: [],\n};\n\nexport class JobLedger {\n private entries = new Map<string, LedgerEntry>();\n private path: string;\n\n constructor(agentName: string) {\n this.path = join(homedir(), '.elisym', 'agents', agentName, 'jobs.json');\n this.load();\n }\n\n private load(): void {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const data = JSON.parse(raw) as Record<string, LedgerEntry>;\n for (const [id, entry] of Object.entries(data)) {\n this.entries.set(id, entry);\n }\n } catch (e: any) {\n // W4: Log warning on malformed ledger and backup corrupt file\n if (e?.code !== 'ENOENT') {\n console.warn(` ! Ledger load warning: ${e?.message ?? 'unknown error'}`);\n try {\n renameSync(this.path, this.path + '.corrupt.' + Date.now());\n } catch {\n /* best effort backup */\n }\n }\n }\n }\n\n flush(): void {\n const dir = dirname(this.path);\n mkdirSync(dir, { recursive: true });\n const obj = Object.fromEntries(this.entries);\n const tmp = this.path + '.tmp';\n writeFileSync(tmp, JSON.stringify(obj, null, 2));\n renameSync(tmp, this.path);\n }\n\n recordPaid(entry: Omit<LedgerEntry, 'status' | 'retry_count'>): void {\n if (this.entries.has(entry.job_id)) {\n return;\n }\n this.entries.set(entry.job_id, { ...entry, status: 'paid', retry_count: 0 });\n this.flush();\n }\n\n updatePayment(jobId: string, netAmount?: number, paymentRequest?: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n if (netAmount !== undefined) {\n entry.net_amount = netAmount;\n }\n if (paymentRequest !== undefined) {\n entry.payment_request = paymentRequest;\n }\n this.flush();\n }\n }\n\n /** Attempt a state transition. Returns the entry if valid, undefined otherwise. */\n private transition(jobId: string, to: LedgerStatus): LedgerEntry | undefined {\n const entry = this.entries.get(jobId);\n if (!entry) {\n return undefined;\n }\n if (!VALID_TRANSITIONS[entry.status].includes(to)) {\n return undefined;\n }\n entry.status = to;\n return entry;\n }\n\n markExecuted(jobId: string, result: string): void {\n const entry = this.transition(jobId, 'executed');\n if (entry) {\n entry.result = result;\n this.flush();\n }\n }\n\n markDelivered(jobId: string): void {\n const entry = this.transition(jobId, 'delivered');\n if (entry) {\n entry.result = undefined; // Free memory\n this.flush();\n }\n }\n\n markFailed(jobId: string): void {\n const entry = this.transition(jobId, 'failed');\n if (entry) {\n entry.result = undefined; // Free memory\n try {\n this.flush();\n } catch {\n /* disk full - in-memory state is still correct */\n }\n }\n }\n\n incrementRetry(jobId: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n entry.retry_count++;\n this.flush();\n }\n }\n\n getStatus(jobId: string): LedgerStatus | undefined {\n return this.entries.get(jobId)?.status;\n }\n\n pendingJobs(): LedgerEntry[] {\n return [...this.entries.values()].filter((e) => e.status === 'paid' || e.status === 'executed');\n }\n\n /** Remove old delivered/failed entries (default: 7 days). */\n gc(maxAgeSecs = 7 * 24 * 60 * 60): void {\n const cutoff = Math.floor(Date.now() / 1000) - maxAgeSecs;\n for (const [id, entry] of this.entries) {\n if (\n (entry.status === 'delivered' || entry.status === 'failed') &&\n entry.created_at < cutoff\n ) {\n this.entries.delete(id);\n }\n }\n this.flush();\n }\n}\n","/**\n * LLM client - supports Anthropic and OpenAI with tool-use.\n */\nimport type { LlmClient, ToolDef, CompletionResult, ToolCall, ToolResult } from '../skill/index.js';\n\nexport type LlmProvider = 'anthropic' | 'openai';\n\nexport interface LlmConfig {\n provider: LlmProvider;\n apiKey: string;\n model: string;\n maxTokens: number;\n /** Log token usage to console after each API call. Default: false. */\n logUsage?: boolean;\n}\n\nconst LLM_TIMEOUT_MS = 120_000; // 2 minutes\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\n/** Create an AbortError compatible with Node 18 (no DOMException in types). */\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\n/** Sleep that can be cancelled by an AbortSignal. Cleans up listeners in all paths. */\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n if (!signal) {\n return new Promise((r) => setTimeout(r, ms));\n }\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** Fetch with timeout + abort signal. Node 18 compatible (no AbortSignal.any). */\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), LLM_TIMEOUT_MS);\n const onAbort = () => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n}\n\n/** Fetch with timeout + retry on transient HTTP/network errors. */\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n let res: Response;\n try {\n res = await fetchWithTimeout(url, init, signal);\n } catch (e: any) {\n // Network errors (DNS, ECONNRESET, etc.) - retry unless abort or exhausted\n if (attempt >= MAX_RETRIES || e.name === 'AbortError') {\n throw e;\n }\n await sleepWithSignal(Math.min(1000 * 2 ** attempt, 8000), signal);\n continue;\n }\n if (res.ok || attempt >= MAX_RETRIES || !RETRYABLE_STATUSES.has(res.status)) {\n return res;\n }\n const retryAfter = res.headers.get('retry-after');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000 || 1000 * 2 ** attempt, 30_000)\n : Math.min(1000 * 2 ** attempt, 8000);\n await sleepWithSignal(delay, signal);\n }\n}\n\nexport function createLlmClient(config: LlmConfig): LlmClient {\n if (config.provider === 'anthropic') {\n return new AnthropicClient(config);\n }\n return new OpenAIClient(config);\n}\n\nclass AnthropicClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private config: LlmConfig) {}\n\n private logTokens(usage: any): void {\n if (this.config.logUsage && usage) {\n this.totalIn += usage.input_tokens ?? 0;\n this.totalOut += usage.output_tokens ?? 0;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${usage.input_tokens ?? 0} out=${usage.output_tokens ?? 0} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const res = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages: [{ role: 'user', content: userInput }],\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`Anthropic API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n const textBlock = data.content?.find((b: any) => b.type === 'text');\n return textBlock?.text ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const anthropicTools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: {\n type: 'object',\n properties: Object.fromEntries(\n t.parameters.map((p) => [p.name, { type: 'string', description: p.description }]),\n ),\n required: t.parameters.filter((p) => p.required).map((p) => p.name),\n },\n }));\n\n const res = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages,\n tools: anthropicTools,\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`Anthropic API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n const content = data.content ?? [];\n\n const toolUses = content.filter((b: any) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n const calls: ToolCall[] = toolUses.map((t: any) => ({\n id: t.id,\n name: t.name,\n arguments: t.input ?? {},\n }));\n return {\n type: 'tool_use',\n calls,\n assistantMessage: { role: 'assistant', content },\n };\n }\n\n const textBlock = content.find((b: any) => b.type === 'text');\n return { type: 'text', text: textBlock?.text ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): any[] {\n return [\n {\n role: 'user',\n content: results.map((r) => ({\n type: 'tool_result',\n tool_use_id: r.callId,\n content: r.content,\n })),\n },\n ];\n }\n}\n\nclass OpenAIClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private config: LlmConfig) {}\n\n private logTokens(usage: any): void {\n if (this.config.logUsage && usage) {\n this.totalIn += usage.prompt_tokens ?? 0;\n this.totalOut += usage.completion_tokens ?? 0;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${usage.prompt_tokens ?? 0} out=${usage.completion_tokens ?? 0} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const isReasoning = /^o\\d/.test(this.config.model);\n const res = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(isReasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: isReasoning ? 'developer' : 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`OpenAI API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n t.parameters.map((p) => [p.name, { type: 'string', description: p.description }]),\n ),\n required: t.parameters.filter((p) => p.required).map((p) => p.name),\n },\n },\n }));\n\n const isReasoning = /^o\\d/.test(this.config.model);\n const res = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(isReasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: isReasoning ? 'developer' : 'system', content: systemPrompt },\n ...messages,\n ],\n tools: openaiTools,\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`OpenAI API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n\n if (message?.tool_calls?.length > 0) {\n const calls: ToolCall[] = message.tool_calls.map((tc: any) => {\n let args: Record<string, any>;\n try {\n args = JSON.parse(tc.function.arguments ?? '{}');\n } catch {\n args = {};\n }\n return { id: tc.id, name: tc.function.name, arguments: args };\n });\n return {\n type: 'tool_use',\n calls,\n assistantMessage: message,\n };\n }\n\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): any[] {\n return results.map((r) => ({\n role: 'tool',\n tool_call_id: r.callId,\n content: r.content,\n }));\n }\n}\n","/**\n * AgentRuntime - main job processing loop with concurrency, payment, and recovery.\n * Supports per-capability pricing: each capability can have a different price.\n */\nimport { SolanaPaymentStrategy, calculateProtocolFee, LIMITS } from '@elisym/sdk';\nimport { Connection } from '@solana/web3.js';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext } from './skill/index.js';\nimport type { NostrTransport, IncomingJob } from './transport/nostr.js';\n\nconst payment = new SolanaPaymentStrategy();\nconst LEDGER_GC_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\nconst TOTAL_JOB_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\nexport interface RuntimeConfig {\n paymentTimeoutSecs: number;\n maxConcurrentJobs: number;\n recoveryMaxRetries: number;\n recoveryIntervalSecs: number;\n network: string;\n solanaAddress?: string;\n maxQueueSize?: number;\n}\n\nexport interface RuntimeCallbacks {\n onJobReceived?: (job: IncomingJob) => void;\n onJobCompleted?: (jobId: string, result: string) => void;\n onJobError?: (jobId: string, error: string) => void;\n onPaymentReceived?: (jobId: string, netAmount: number) => void;\n onLog?: (message: string) => void;\n}\n\n/** Resolve the price for a job by matching its tags against registered skills. */\nfunction resolveJobPrice(tags: string[], skills: SkillRegistry): number {\n const skill = skills.route(tags);\n return skill?.priceLamports ?? 0;\n}\n\nconst RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; // 10 minutes\nconst MAX_JOBS_PER_CUSTOMER = 20;\nconst GLOBAL_MAX_JOBS_PER_WINDOW = 200;\n\nexport class AgentRuntime {\n private limit: ReturnType<typeof pLimit>;\n private inFlight = new Set<string>();\n private pending = 0;\n private maxQueueSize: number;\n private abortController = new AbortController();\n private jobAbortControllers = new Set<AbortController>();\n private recoveryInterval: ReturnType<typeof setInterval> | null = null;\n private gcInterval: ReturnType<typeof setInterval> | null = null;\n /** Per-customer sliding window rate limiter: pubkey -> timestamps. */\n private customerJobs = new Map<string, number[]>();\n /** Global sliding window rate limiter (Sybil protection). */\n private globalJobs: number[] = [];\n\n constructor(\n private transport: NostrTransport,\n private skills: SkillRegistry,\n private skillCtx: SkillContext,\n private config: RuntimeConfig,\n private ledger: JobLedger,\n private callbacks: RuntimeCallbacks = {},\n ) {\n this.limit = pLimit(config.maxConcurrentJobs);\n this.maxQueueSize = config.maxQueueSize ?? config.maxConcurrentJobs * 10;\n }\n\n async run(): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // GC old ledger entries\n this.ledger.gc();\n\n // Recover pending jobs from previous sessions\n await this.recoverPendingJobs();\n\n // Start periodic recovery\n this.recoveryInterval = setInterval(\n () => this.recoverPendingJobs().catch((e) => log(`Recovery error: ${e}`)),\n this.config.recoveryIntervalSecs * 1000,\n );\n\n // Periodic ledger GC, rate limit cleanup, and subscription health check\n this.gcInterval = setInterval(() => {\n try {\n this.ledger.gc();\n } catch (e: any) {\n log(`GC error: ${e.message}`);\n }\n this.cleanupRateLimits();\n if (!this.transport.isHealthy()) {\n log('Warning: no events received in 30+ minutes. Check relay connectivity.');\n }\n }, LEDGER_GC_INTERVAL_MS);\n\n // Start listening for jobs\n this.transport.start((job) => {\n if (this.abortController.signal.aborted) {\n return;\n }\n if (this.inFlight.has(job.jobId)) {\n return;\n }\n if (this.ledger.getStatus(job.jobId)) {\n return;\n }\n\n // Drop jobs when queue is full to prevent unbounded memory growth\n if (this.pending >= this.maxQueueSize) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server overloaded, try again later' })\n .catch(() => {});\n return;\n }\n\n // Global rate limiting (Sybil protection)\n if (this.isGlobalRateLimited()) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server busy, try again later' })\n .catch(() => {});\n return;\n }\n\n // Per-customer rate limiting\n if (this.isCustomerRateLimited(job.customerId)) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n\n // Record acceptance only after all checks pass\n this.recordJobAccepted(job.customerId);\n\n this.callbacks.onJobReceived?.(job);\n this.inFlight.add(job.jobId);\n this.pending++;\n\n this.limit(() => this.processJob(job))\n .catch((e: any) => {\n this.callbacks.onJobError?.(job.jobId, e.message);\n })\n .finally(() => {\n this.inFlight.delete(job.jobId);\n this.pending--;\n });\n });\n\n log('Agent runtime started. Listening for jobs...');\n\n // Wait for shutdown signal\n await new Promise<void>((resolve) => {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n\n process.on('SIGINT', () => {\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n });\n process.on('SIGTERM', () => {\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n });\n });\n }\n\n /** Returns true if global job throughput has been exceeded (Sybil protection). Pure check - no side effects. */\n private isGlobalRateLimited(): boolean {\n const now = Date.now();\n this.globalJobs = this.globalJobs.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n return this.globalJobs.length >= GLOBAL_MAX_JOBS_PER_WINDOW;\n }\n\n /** Returns true if customer has exceeded the per-window job limit. Pure check - no side effects. */\n private isCustomerRateLimited(customerId: string): boolean {\n const now = Date.now();\n const timestamps = this.customerJobs.get(customerId) ?? [];\n const recent = timestamps.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n this.customerJobs.set(customerId, recent);\n return recent.length >= MAX_JOBS_PER_CUSTOMER;\n }\n\n /** Record a job acceptance for rate limiting. Called only after all checks pass. */\n private recordJobAccepted(customerId: string): void {\n const now = Date.now();\n this.globalJobs.push(now);\n const timestamps = this.customerJobs.get(customerId) ?? [];\n timestamps.push(now);\n this.customerJobs.set(customerId, timestamps);\n }\n\n /** Clean up expired rate limit entries. */\n private cleanupRateLimits(): void {\n const now = Date.now();\n this.globalJobs = this.globalJobs.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n for (const [key, timestamps] of this.customerJobs) {\n const recent = timestamps.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n if (recent.length === 0) {\n this.customerJobs.delete(key);\n } else {\n this.customerJobs.set(key, recent);\n }\n }\n }\n\n stop(): void {\n this.abortController.abort();\n for (const controller of this.jobAbortControllers) {\n controller.abort();\n }\n if (this.recoveryInterval) {\n clearInterval(this.recoveryInterval);\n this.recoveryInterval = null;\n }\n if (this.gcInterval) {\n clearInterval(this.gcInterval);\n this.gcInterval = null;\n }\n this.transport.stop();\n }\n\n /** Wrapper with total job timeout and error handling. */\n private async processJob(job: IncomingJob): Promise<void> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const jobAbort = new AbortController();\n this.jobAbortControllers.add(jobAbort);\n try {\n await Promise.race([\n this.executeJob(job, jobAbort.signal),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n jobAbort.abort();\n reject(new Error('Job processing timeout'));\n }, TOTAL_JOB_TIMEOUT_MS);\n }),\n ]);\n } catch (e: any) {\n const log = this.callbacks.onLog ?? console.log;\n log(`[${job.jobId.slice(0, 8)}] Error: ${e.message}`);\n\n // Don't mark executed jobs as failed - recovery will re-deliver\n const currentStatus = this.ledger.getStatus(job.jobId);\n if (currentStatus !== 'executed') {\n this.ledger.markFailed(job.jobId);\n }\n this.callbacks.onJobError?.(job.jobId, e.message);\n\n // W8: Sanitize error messages before sending to customer\n const safeMessage = e.message?.includes('API')\n ? 'Internal processing error'\n : (e.message ?? 'Unknown error');\n await this.transport\n .sendFeedback(job, { type: 'error', message: safeMessage })\n .catch(() => {});\n } finally {\n clearTimeout(timeoutId);\n this.jobAbortControllers.delete(jobAbort);\n }\n }\n\n /** Core job processing logic - payment, skill execution, result delivery. */\n private async executeJob(job: IncomingJob, signal?: AbortSignal): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // W2: Validate input length before processing\n if (job.input.length > LIMITS.MAX_INPUT_LENGTH) {\n throw new Error(`Input too long: ${job.input.length} chars (max ${LIMITS.MAX_INPUT_LENGTH})`);\n }\n\n // ── Step 1: Resolve per-capability price and collect payment ──\n const jobPrice = resolveJobPrice(job.tags, this.skills);\n let netAmount: number | undefined;\n let paymentRequest: string | undefined;\n\n // W1: Record in ledger BEFORE payment to prevent crash window data loss\n this.ledger.recordPaid({\n job_id: job.jobId,\n input: job.input,\n input_type: job.inputType,\n tags: job.tags,\n customer_id: job.customerId,\n bid: job.bid,\n net_amount: undefined,\n raw_event_json: JSON.stringify(job.rawEvent),\n created_at: Math.floor(Date.now() / 1000),\n });\n\n if (jobPrice > 0) {\n const result = await this.collectPayment(job, jobPrice, signal);\n netAmount = result.netAmount;\n paymentRequest = result.paymentRequest;\n // Update ledger with payment info\n this.ledger.updatePayment(job.jobId, netAmount, paymentRequest);\n log(`[${job.jobId.slice(0, 8)}] Payment confirmed: ${netAmount} lamports`);\n this.callbacks.onPaymentReceived?.(job.jobId, netAmount);\n }\n\n // ── Step 2: Send Processing feedback ──\n await this.transport.sendFeedback(job, { type: 'processing' }).catch(() => {});\n\n // ── Step 3: Route to skill ──\n const skill = this.skills.route(job.tags);\n if (!skill) {\n throw new Error('No skill matched for tags: ' + job.tags.join(', '));\n }\n\n log(`[${job.jobId.slice(0, 8)}] Executing skill: ${skill.name}`);\n\n // ── Step 4: Execute skill ──\n const output = await skill.execute(\n {\n data: job.input,\n inputType: job.inputType,\n tags: job.tags,\n jobId: job.jobId,\n },\n { ...this.skillCtx, signal },\n );\n\n // ── Step 5: Cache result in ledger ──\n // NOTE: At-least-once delivery. A crash between execute() return and markExecuted()\n // flush leaves the job as 'paid' - recovery will re-execute. Skills must be idempotent\n // or tolerant of re-execution.\n this.ledger.markExecuted(job.jobId, output.data);\n log(`[${job.jobId.slice(0, 8)}] Skill completed, delivering result`);\n\n // ── Step 6: Deliver result ──\n const eventId = await this.transport.deliverResult(job, output.data, netAmount);\n this.ledger.markDelivered(job.jobId);\n\n log(`[${job.jobId.slice(0, 8)}] Delivered: ${eventId.slice(0, 16)}...`);\n this.callbacks.onJobCompleted?.(job.jobId, output.data);\n }\n\n /**\n * Collect payment for a job. Creates payment request, sends PaymentRequired feedback,\n * polls for on-chain confirmation. Aborts if signal fires.\n */\n private async collectPayment(\n job: IncomingJob,\n jobPrice: number,\n signal?: AbortSignal,\n ): Promise<{ netAmount: number; paymentRequest: string }> {\n const log = this.callbacks.onLog ?? console.log;\n\n if (!this.config.solanaAddress) {\n throw new Error('Solana address not configured');\n }\n\n // Create payment request with protocol fee\n const request = payment.createPaymentRequest(\n this.config.solanaAddress,\n jobPrice,\n this.config.paymentTimeoutSecs,\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice);\n const netAmount = jobPrice - fee;\n\n log(`[${job.jobId.slice(0, 8)}] Payment required: ${jobPrice} lamports (fee: ${fee})`);\n\n // Store payment request reference early for crash recovery\n this.ledger.updatePayment(job.jobId, undefined, requestJson);\n\n // Send PaymentRequired feedback to customer\n await this.transport.sendFeedback(job, {\n type: 'payment-required',\n amount: jobPrice,\n paymentRequest: requestJson,\n chain: 'solana',\n });\n\n // Verify payment on-chain (SDK defaults: 15 retries, 2s interval = 30s window)\n // disableRetryOnRateLimit: prevent @solana/web3.js from doing 5 internal retries per attempt\n const connection = new Connection(getRpcUrl(this.config.network), {\n disableRetryOnRateLimit: true,\n });\n\n // Wrap with abort signal since SDK doesn't accept one natively\n let result: { verified: boolean };\n if (signal) {\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n };\n if (signal.aborted) {\n abortHandler();\n return;\n }\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n try {\n result = await Promise.race([payment.verifyPayment(connection, request), abortPromise]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(connection, request);\n }\n\n if (result.verified) {\n return { netAmount, paymentRequest: requestJson };\n }\n\n // Timeout - customer may have paid on-chain but verification failed\n log(\n `[${job.jobId.slice(0, 8)}] WARNING: Payment verification timed out. ` +\n `Customer may have paid on-chain. Check address ${this.config.solanaAddress} manually.`,\n );\n await this.transport\n .sendFeedback(job, { type: 'error', message: 'payment timeout' })\n .catch(() => {});\n throw new Error('Payment timeout');\n }\n\n private async recoverPendingJobs(): Promise<void> {\n const pending = this.ledger.pendingJobs().filter((e) => !this.inFlight.has(e.job_id));\n if (pending.length === 0) {\n return;\n }\n\n const log = this.callbacks.onLog ?? console.log;\n log(`Recovering ${pending.length} pending jobs...`);\n\n for (const entry of pending) {\n if (entry.retry_count >= this.config.recoveryMaxRetries) {\n this.ledger.markFailed(entry.job_id);\n // Notify customer of permanent failure\n if (entry.raw_event_json) {\n try {\n const rawEvent = JSON.parse(entry.raw_event_json);\n await this.transport\n .sendFeedback(\n {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n },\n { type: 'error', message: 'Job permanently failed after maximum retries' },\n )\n .catch(() => {});\n } catch {\n /* best effort */\n }\n }\n continue;\n }\n\n if (!entry.raw_event_json) {\n continue;\n }\n\n // Respect queue limit for recovery jobs too\n if (this.pending >= this.maxQueueSize) {\n break;\n }\n\n // Route through p-limit to respect maxConcurrentJobs\n this.inFlight.add(entry.job_id);\n this.pending++;\n this.limit(async () => {\n try {\n await this.recoverSingleJob(entry, log);\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: failed: ${e.message}`);\n } finally {\n this.inFlight.delete(entry.job_id);\n this.pending--;\n }\n });\n }\n }\n\n private async recoverSingleJob(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n log: (msg: string) => void,\n ): Promise<void> {\n const recoveryAbort = new AbortController();\n this.jobAbortControllers.add(recoveryAbort);\n const timeout = setTimeout(() => recoveryAbort.abort(), TOTAL_JOB_TIMEOUT_MS);\n\n try {\n this.ledger.incrementRetry(entry.job_id);\n const rawEvent = JSON.parse(entry.raw_event_json!);\n const fakeJob: IncomingJob = {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n };\n\n if (entry.status === 'executed' && entry.result !== undefined) {\n // Re-deliver only\n await this.transport.deliverResult(fakeJob, entry.result, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-delivered`);\n } else if (entry.status === 'paid') {\n const skill = this.skills.route(entry.tags);\n if (!skill) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: no skill for tags, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n\n // Re-verify payment if reference was stored but confirmation lost to crash\n if (skill.priceLamports > 0 && !entry.net_amount) {\n if (entry.payment_request) {\n const verified = await this.reVerifyPayment(\n entry,\n skill.priceLamports,\n log,\n recoveryAbort.signal,\n );\n if (!verified) {\n this.ledger.markFailed(entry.job_id);\n return;\n }\n } else {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not confirmed, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n }\n\n const output = await skill.execute(\n {\n data: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n jobId: entry.job_id,\n },\n { ...this.skillCtx, signal: recoveryAbort.signal },\n );\n\n this.ledger.markExecuted(entry.job_id, output.data);\n await this.transport.deliverResult(fakeJob, output.data, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-executed and delivered`);\n }\n } finally {\n clearTimeout(timeout);\n this.jobAbortControllers.delete(recoveryAbort);\n }\n }\n\n /**\n * Re-verify an on-chain payment during crash recovery.\n *\n * Limitation: Solana transaction data expires after ~2-3 days (recent blockhash window).\n * If the agent was down longer, a confirmed payment may not be found on-chain and the\n * job will be marked failed. For mainnet: use monitoring, avoid extended downtime, or\n * configure an archive RPC via SOLANA_RPC_URL.\n */\n private async reVerifyPayment(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n priceLamports: number,\n log: (msg: string) => void,\n signal?: AbortSignal,\n ): Promise<boolean> {\n try {\n const request = JSON.parse(entry.payment_request!);\n const connection = new Connection(getRpcUrl(this.config.network), {\n disableRetryOnRateLimit: true,\n });\n\n let result: { verified: boolean };\n if (signal) {\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n };\n if (signal.aborted) {\n abortHandler();\n return;\n }\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n try {\n result = await Promise.race([payment.verifyPayment(connection, request), abortPromise]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(connection, request);\n }\n\n if (result.verified) {\n const fee = calculateProtocolFee(priceLamports);\n const netAmount = priceLamports - fee;\n this.ledger.updatePayment(entry.job_id, netAmount, entry.payment_request);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verified (${netAmount} lamports)`);\n return true;\n }\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not found on-chain, marking failed`);\n return false;\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verification error: ${e.message}`);\n return false;\n }\n }\n}\n","/**\n * Skill interface and registry.\n */\n\nexport interface SkillInput {\n data: string;\n inputType: string;\n tags: string[];\n jobId: string;\n}\n\nexport interface SkillOutput {\n data: string;\n outputMime?: string;\n}\n\nexport interface SkillContext {\n llm?: LlmClient;\n agentName: string;\n agentDescription: string;\n signal?: AbortSignal;\n}\n\nexport interface LlmClient {\n complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string>;\n completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult>;\n /** Format tool results into provider-specific messages (Anthropic vs OpenAI). */\n formatToolResultMessages(results: ToolResult[]): any[];\n}\n\nexport interface ToolDef {\n name: string;\n description: string;\n parameters: Array<{ name: string; description: string; required: boolean }>;\n}\n\nexport type CompletionResult =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; calls: ToolCall[]; assistantMessage: any };\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, any>;\n}\n\n/** Provider-agnostic tool result passed from ScriptSkill to LlmClient. */\nexport interface ToolResult {\n callId: string;\n content: string;\n}\n\n/**\n * A skill that can be executed by the agent runtime.\n *\n * Skills should be idempotent or tolerant of re-execution: if the agent crashes\n * after execute() returns but before the result is persisted, recovery will\n * re-execute the skill with the same input (at-least-once delivery).\n */\nexport interface Skill {\n name: string;\n description: string;\n capabilities: string[];\n /** Price in lamports (0 = free). Converted from SOL in SKILL.md. */\n priceLamports: number;\n /** Hero image URL. */\n image?: string;\n /** Local file path for hero image (uploaded on first start). */\n imageFile?: string;\n execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput>;\n}\n\nexport class SkillRegistry {\n private skills: Skill[] = [];\n private defaultIndex: number | null = null;\n\n register(skill: Skill): void {\n if (this.defaultIndex === null) {\n this.defaultIndex = this.skills.length;\n }\n this.skills.push(skill);\n }\n\n route(tags: string[]): Skill | null {\n // Try to match by capability tags\n for (const skill of this.skills) {\n for (const tag of tags) {\n if (skill.capabilities.some((cap) => cap === tag)) {\n return skill;\n }\n }\n }\n // Fall back to default\n return this.defaultIndex !== null ? this.skills[this.defaultIndex]! : null;\n }\n\n allCapabilities(): string[] {\n return this.skills.flatMap((s) => s.capabilities);\n }\n\n isEmpty(): boolean {\n return this.skills.length === 0;\n }\n\n all(): Skill[] {\n return this.skills;\n }\n}\n","/**\n * ScriptSkill - LLM orchestrator with tool-use via external scripts.\n */\nimport { spawn } from 'node:child_process';\nimport { StringDecoder } from 'node:string_decoder';\nimport type {\n Skill,\n SkillInput,\n SkillOutput,\n SkillContext,\n ToolDef,\n ToolCall,\n ToolResult,\n} from './index.js';\n\nconst MAX_TOOL_OUTPUT = 1_000_000; // 1MB limit per tool invocation\n\ninterface SkillToolDef {\n name: string;\n description: string;\n command: string[];\n parameters?: Array<{ name: string; description: string; required?: boolean }>;\n}\n\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceLamports: number;\n image?: string;\n imageFile?: string;\n private skillDir: string;\n private systemPrompt: string;\n private tools: SkillToolDef[];\n private maxToolRounds: number;\n\n constructor(\n name: string,\n description: string,\n capabilities: string[],\n priceLamports: number,\n image: string | undefined,\n imageFile: string | undefined,\n skillDir: string,\n systemPrompt: string,\n tools: SkillToolDef[],\n maxToolRounds: number,\n ) {\n this.name = name;\n this.description = description;\n this.capabilities = capabilities;\n this.priceLamports = priceLamports;\n this.image = image;\n this.imageFile = imageFile;\n this.skillDir = skillDir;\n this.systemPrompt = systemPrompt;\n this.tools = tools;\n this.maxToolRounds = maxToolRounds;\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n if (!ctx.llm) {\n throw new Error('LLM client not configured');\n }\n\n // No tools: simple completion\n if (this.tools.length === 0) {\n const result = await ctx.llm.complete(this.systemPrompt, input.data, ctx.signal);\n return { data: result };\n }\n\n // Tool-use loop\n const toolDefs: ToolDef[] = this.tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: (t.parameters ?? []).map((p) => ({\n name: p.name,\n description: p.description,\n required: p.required ?? true,\n })),\n }));\n\n const messages: any[] = [{ role: 'user', content: input.data }];\n\n for (let round = 0; round < this.maxToolRounds; round++) {\n if (ctx.signal?.aborted) {\n throw new Error('Job aborted');\n }\n const result = await ctx.llm.completeWithTools(\n this.systemPrompt,\n messages,\n toolDefs,\n ctx.signal,\n );\n\n if (result.type === 'text') {\n return { data: result.text };\n }\n\n // Process tool calls\n messages.push(result.assistantMessage);\n\n const toolResults: ToolResult[] = [];\n for (const call of result.calls) {\n const toolDef = this.tools.find((t) => t.name === call.name);\n if (!toolDef) {\n toolResults.push({\n callId: call.id,\n content: `Error: unknown tool \"${call.name}\"`,\n });\n continue;\n }\n\n const output = await this.runTool(toolDef, call, ctx.signal);\n toolResults.push({ callId: call.id, content: output });\n }\n\n messages.push(...ctx.llm!.formatToolResultMessages(toolResults));\n }\n\n throw new Error(`Max tool rounds (${this.maxToolRounds}) exceeded`);\n }\n\n private runTool(toolDef: SkillToolDef, call: ToolCall, signal?: AbortSignal): Promise<string> {\n return new Promise((resolve, _reject) => {\n const args = [...toolDef.command];\n const cmd = args.shift()!;\n\n // Add parameters as arguments\n const params = toolDef.parameters ?? [];\n for (const param of params) {\n const value = call.arguments[param.name];\n if (value !== undefined) {\n if (param.required && params.indexOf(param) === 0) {\n // First required param as positional\n args.push(String(value));\n } else {\n args.push(`--${param.name}`, String(value));\n }\n }\n }\n\n const child = spawn(cmd, args, {\n cwd: this.skillDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: 60_000,\n killSignal: 'SIGKILL',\n signal,\n });\n\n let stdout = '';\n let stderr = '';\n const stdoutDecoder = new StringDecoder('utf8');\n const stderrDecoder = new StringDecoder('utf8');\n\n child.stdout.on('data', (data: Buffer) => {\n if (stdout.length < MAX_TOOL_OUTPUT) {\n stdout += stdoutDecoder.write(data);\n if (stdout.length > MAX_TOOL_OUTPUT) {\n stdout = stdout.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n child.stderr.on('data', (data: Buffer) => {\n if (stderr.length < MAX_TOOL_OUTPUT) {\n stderr += stderrDecoder.write(data);\n if (stderr.length > MAX_TOOL_OUTPUT) {\n stderr = stderr.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n resolve(`Error (exit ${code}): ${stderr.trim() || stdout.trim()}`);\n }\n });\n\n child.on('error', (err) => {\n resolve(`Error: ${err.message}`);\n });\n });\n }\n}\n","/**\n * Load skills from SKILL.md files in a directory.\n * Frontmatter uses YAML (Agent Skills standard).\n */\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport YAML from 'yaml';\nimport { ScriptSkill } from './script-skill.js';\nimport type { Skill } from './index.js';\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\n/** Convert SOL (number) to lamports (integer). */\nfunction solToLamports(sol: number): number {\n if (!Number.isFinite(sol) || sol < 0) {\n return 0;\n }\n return Math.round(sol * LAMPORTS_PER_SOL);\n}\n\ninterface SkillToolParam {\n name: string;\n description: string;\n required?: boolean;\n}\n\ninterface SkillToolDef {\n name: string;\n description: string;\n command: string[];\n parameters?: SkillToolParam[];\n}\n\ninterface SkillFrontmatter {\n name: string;\n description: string;\n capabilities: string[];\n /** Price in SOL (e.g. 0.01). Converted to lamports internally. Default: 0 (free). */\n price?: number;\n /** Hero image URL (takes priority over image_file). */\n image?: string;\n /** Local file path for hero image. Uploaded on first start, URL written back to image. */\n image_file?: string;\n tools?: SkillToolDef[];\n max_tool_rounds?: number;\n}\n\n/** Parse a SKILL.md file into frontmatter + system prompt. */\nfunction parseSkillMd(content: string): { frontmatter: SkillFrontmatter; systemPrompt: string } {\n const lines = content.split('\\n');\n let start = -1;\n let end = -1;\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i]!.trim() === '---') {\n if (start === -1) {\n start = i;\n } else {\n end = i;\n break;\n }\n }\n }\n\n if (start === -1 || end === -1) {\n throw new Error('SKILL.md must have YAML frontmatter between --- delimiters');\n }\n\n const yamlStr = lines.slice(start + 1, end).join('\\n');\n const frontmatter = YAML.parse(yamlStr) as SkillFrontmatter;\n\n // W3: Validate required fields\n if (!frontmatter.name || typeof frontmatter.name !== 'string') {\n throw new Error('SKILL.md: missing or invalid \"name\" field');\n }\n if (!frontmatter.description || typeof frontmatter.description !== 'string') {\n throw new Error('SKILL.md: missing or invalid \"description\" field');\n }\n if (!Array.isArray(frontmatter.capabilities) || frontmatter.capabilities.length === 0) {\n throw new Error('SKILL.md: \"capabilities\" must be a non-empty array');\n }\n\n const systemPrompt = lines\n .slice(end + 1)\n .join('\\n')\n .trim();\n\n return { frontmatter, systemPrompt };\n}\n\n/** Load all skills from subdirectories of the given path. */\nexport function loadSkillsFromDir(skillsDir: string): Skill[] {\n const skills: Skill[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch {\n return skills;\n }\n\n for (const entry of entries) {\n const entryPath = join(skillsDir, entry);\n try {\n if (!statSync(entryPath).isDirectory()) {\n continue;\n }\n } catch {\n continue;\n }\n\n const skillMdPath = join(entryPath, 'SKILL.md');\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter, systemPrompt } = parseSkillMd(content);\n\n skills.push(\n new ScriptSkill(\n frontmatter.name,\n frontmatter.description,\n frontmatter.capabilities,\n solToLamports(frontmatter.price ?? 0),\n frontmatter.image,\n frontmatter.image_file,\n entryPath,\n systemPrompt,\n frontmatter.tools ?? [],\n frontmatter.max_tool_rounds ?? 10,\n ),\n );\n } catch (e: any) {\n // W5: Log skill load errors instead of silently skipping\n console.warn(` ! Skipping skill \"${entry}\": ${e?.message ?? 'unknown error'}`);\n }\n }\n\n return skills;\n}\n","/**\n * NostrTransport - listens for targeted jobs on Nostr relays, delivers results.\n * Handles NIP-44 decryption, dedup, and retried delivery.\n */\nimport { BoundedSet, jobRequestKind } from '@elisym/sdk';\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport type { Event } from 'nostr-tools';\n\nexport interface IncomingJob {\n jobId: string;\n input: string;\n inputType: string;\n tags: string[];\n customerId: string;\n bid?: number;\n encrypted: boolean;\n rawEvent: Event;\n}\n\nexport type JobFeedbackStatus =\n | { type: 'payment-required'; amount: number; paymentRequest: string; chain: string }\n | { type: 'processing' }\n | { type: 'error'; message: string };\n\nfunction isEncrypted(event: Event): boolean {\n return event.tags.some((t) => t[0] === 'encrypted' && t[1] === 'nip44');\n}\n\nconst HEALTH_CHECK_IDLE_MS = 30 * 60 * 1000; // 30 minutes\n\nexport class NostrTransport {\n private sub: SubCloser | null = null;\n private seenIds = new BoundedSet<string>(10_000);\n private lastEventAt = Date.now();\n\n constructor(\n private client: ElisymClient,\n private identity: ElisymIdentity,\n private kindOffsets: number[],\n ) {}\n\n /** Start listening for targeted job requests. Decrypts NIP-44 content. */\n start(onJob: (job: IncomingJob) => void): void {\n const kinds = this.kindOffsets.map(jobRequestKind);\n\n this.sub = this.client.marketplace.subscribeToJobRequests(\n this.identity,\n kinds,\n (event: Event) => {\n this.lastEventAt = Date.now();\n\n // Dedup via BoundedSet\n if (this.seenIds.has(event.id)) {\n return;\n }\n this.seenIds.add(event.id);\n\n // Must have elisym tag\n const hasElisym = event.tags.some((t) => t[0] === 't' && t[1] === 'elisym');\n if (!hasElisym) {\n return;\n }\n\n // Extract tags\n const tags = event.tags.filter((t) => t[0] === 't').map((t) => t[1]!);\n const bidTag = event.tags.find((t) => t[0] === 'bid');\n const encrypted = isEncrypted(event);\n\n // SDK already decrypts NIP-44 content in subscribeToJobRequests\n const iTag = event.tags.find((t) => t[0] === 'i');\n let inputType = 'text';\n if (iTag?.[2]) {\n inputType = iTag[2];\n }\n const input = encrypted ? event.content : (iTag?.[1] ?? event.content);\n\n onJob({\n jobId: event.id,\n input,\n inputType,\n tags,\n customerId: event.pubkey,\n bid: bidTag?.[1] ? parseInt(bidTag[1], 10) : undefined,\n encrypted,\n rawEvent: event,\n });\n },\n );\n }\n\n /** Send job feedback to customer. */\n async sendFeedback(job: IncomingJob, status: JobFeedbackStatus): Promise<void> {\n if (status.type === 'payment-required') {\n await this.client.marketplace.submitPaymentRequiredFeedback(\n this.identity,\n job.rawEvent,\n status.amount,\n status.paymentRequest,\n );\n } else if (status.type === 'processing') {\n await this.client.marketplace.submitProcessingFeedback(this.identity, job.rawEvent);\n } else if (status.type === 'error') {\n await this.client.marketplace.submitErrorFeedback(\n this.identity,\n job.rawEvent,\n status.message,\n );\n }\n }\n\n /** Deliver result to customer. Retries with exponential backoff via SDK. */\n async deliverResult(\n job: IncomingJob,\n content: string,\n amount?: number,\n retries = 3,\n ): Promise<string> {\n return this.client.marketplace.submitJobResultWithRetry(\n this.identity,\n job.rawEvent,\n content,\n amount,\n retries,\n );\n }\n\n /** Returns true if an event was received within the given idle window. */\n isHealthy(maxIdleMs = HEALTH_CHECK_IDLE_MS): boolean {\n return Date.now() - this.lastEventAt < maxIdleMs;\n }\n\n stop(): void {\n this.sub?.close();\n this.sub = null;\n }\n}\n","/**\n * Wallet command - show balance and send SOL.\n */\nimport { formatSol } from '@elisym/sdk';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport { loadConfig, listAgents } from '../config.js';\nimport { getRpcUrl } from '../helpers.js';\n\nexport async function cmdWallet(name: string | undefined): Promise<void> {\n if (!name) {\n const agents = listAgents();\n if (agents.length === 0) {\n console.error('No agents found.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents,\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const config = loadConfig(name!, passphrase);\n\n const solPayment = config.payments?.find((p) => p.chain === 'solana');\n if (!solPayment?.address) {\n console.error('Solana address not configured for this agent.');\n process.exit(1);\n }\n\n const network = solPayment.network ?? 'devnet';\n const rpcUrl = getRpcUrl(network);\n const connection = new Connection(rpcUrl);\n const pubkey = new PublicKey(solPayment.address);\n const balance = await connection.getBalance(pubkey);\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` Balance: ${formatSol(balance)} (${balance} lamports)\\n`);\n}\n\nexport async function cmdSend(_name: string, _address: string, _amount: string): Promise<void> {\n console.error('Direct sending not yet implemented. Use the MCP server for payments.');\n}\n","/**\n * single source of truth for the package version. `index.ts` surfaces this string\n * via `commander`'s `--version`, so we read it from `package.json` at module load\n * instead of hardcoding a literal that can drift apart from the published version.\n *\n * Mirrors the same approach used in `@elisym/mcp` (`packages/mcp/src/utils.ts`).\n */\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n try {\n // dist/index.js -> ../package.json (npm always ships package.json at the package root)\n const here = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf-8')) as {\n version: string;\n };\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nexport const PACKAGE_VERSION: string = readPackageVersion();\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/commands/init.ts","../src/index.ts","../src/commands/profile.ts","../src/commands/start.ts","../src/helpers.ts","../src/ledger.ts","../src/llm/index.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/script-skill.ts","../src/skill/loader.ts","../src/transport/nostr.ts","../src/commands/wallet.ts","../src/version.ts"],"names":["readFileSync","resolveImage","existsSync","basename","ElisymIdentity","MediaService","PublicKey","fetchModels","encryptSecret","join","homedir","mkdirSync","writeFileSync","calculateProtocolFee","readdirSync","statSync","isEncrypted","cmdInit","Connection","RELAYS","jobRequestKind","formatSol","dirname","nip19","getPublicKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Agent config management - load/save/list/delete from ~/.elisym/agents/<name>/\n * Uses shared config types and serialization from @elisym/sdk.\n */\nimport { readFileSync, writeFileSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { validateAgentName, serializeConfig, type AgentConfig } from '@elisym/sdk';\nimport { parseConfig } from '@elisym/sdk/node';\n\nexport type { AgentConfig } from '@elisym/sdk';\nexport type { Identity, Capability, PaymentAddress, WalletConfig, LlmConfig } from '@elisym/sdk';\nexport { validateAgentName };\n\nconst AGENTS_ROOT = join(homedir(), '.elisym', 'agents');\n\nfunction agentDir(name: string): string {\n return join(AGENTS_ROOT, name);\n}\n\nfunction configPath(name: string): string {\n return join(AGENTS_ROOT, name, 'config.json');\n}\n\nexport function loadConfig(name: string, passphrase?: string): AgentConfig {\n validateAgentName(name);\n const path = configPath(name);\n const raw = readFileSync(path, 'utf-8');\n return parseConfig(raw, passphrase);\n}\n\nexport function saveConfig(config: AgentConfig): void {\n validateAgentName(config.identity.name);\n const dir = agentDir(config.identity.name);\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, 'config.json'), serializeConfig(config), { mode: 0o600 });\n}\n\nexport function listAgents(): string[] {\n try {\n return readdirSync(AGENTS_ROOT).filter((name) => {\n try {\n statSync(join(AGENTS_ROOT, name, 'config.json'));\n return true;\n } catch {\n return false;\n }\n });\n } catch {\n return [];\n }\n}\n\nexport function deleteAgent(name: string): void {\n validateAgentName(name);\n // Overwrite sensitive files with zeros before deletion to prevent forensic recovery\n const dir = agentDir(name);\n for (const file of ['config.json', 'jobs.json']) {\n try {\n const filePath = join(dir, file);\n const size = statSync(filePath).size;\n writeFileSync(filePath, Buffer.alloc(size, 0));\n } catch {\n /* file may not exist */\n }\n }\n // Zero-fill corrupt ledger backups (contain customer IDs, job inputs)\n try {\n for (const entry of readdirSync(dir)) {\n if (entry.startsWith('jobs.json.corrupt.')) {\n try {\n const fp = join(dir, entry);\n writeFileSync(fp, Buffer.alloc(statSync(fp).size, 0));\n } catch {\n /* best effort */\n }\n }\n }\n } catch {\n /* dir may not exist */\n }\n rmSync(dir, { recursive: true, force: true });\n}\n","/**\n * Init command - interactive wizard to create a new agent.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport { ElisymIdentity, MediaService, RELAYS } from '@elisym/sdk';\nimport { encryptSecret } from '@elisym/sdk/node';\nimport { PublicKey } from '@solana/web3.js';\nimport { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools';\nimport { saveConfig, listAgents, validateAgentName, type AgentConfig } from '../config.js';\n\n/** Resolve an image input: if local file exists, upload via MediaService; otherwise treat as URL. */\nasync function resolveImage(\n input: string,\n identity: ElisymIdentity,\n media: MediaService,\n): Promise<string> {\n if (!input) {\n return '';\n }\n if (existsSync(input)) {\n console.log(` Uploading ${basename(input)}...`);\n const data = readFileSync(input);\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(input));\n console.log(` Uploaded: ${url}`);\n return url;\n }\n // Not a file - treat as URL\n return input;\n}\n\nconst FALLBACK_MODELS: Record<string, string[]> = {\n anthropic: ['claude-sonnet-4-6', 'claude-haiku-4-5-20251001', 'claude-opus-4-6'],\n openai: ['gpt-4o', 'gpt-4o-mini', 'o3-mini'],\n};\n\nexport async function fetchModels(provider: string, apiKey: string): Promise<string[]> {\n try {\n if (provider === 'anthropic') {\n const res = await fetch('https://api.anthropic.com/v1/models?limit=1000', {\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n });\n if (!res.ok) {\n throw new Error(`${res.status}`);\n }\n const data = (await res.json()) as { data?: { id: string }[] };\n const models = (data.data ?? []).map((m) => m.id).sort();\n return models.length > 0 ? models : FALLBACK_MODELS.anthropic!;\n }\n if (provider === 'openai') {\n const res = await fetch('https://api.openai.com/v1/models', {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) {\n throw new Error(`${res.status}`);\n }\n const data = (await res.json()) as { data?: { id: string }[] };\n const models = (data.data ?? [])\n .map((m) => m.id)\n .filter(\n (id) =>\n (id.startsWith('gpt-') ||\n id.startsWith('o1') ||\n id.startsWith('o3') ||\n id.startsWith('o4') ||\n id.startsWith('chatgpt-')) &&\n !id.includes('instruct') &&\n !id.includes('realtime') &&\n !id.includes('audio') &&\n !id.includes('tts') &&\n !id.includes('whisper'),\n )\n .sort();\n return models.length > 0 ? models : FALLBACK_MODELS.openai!;\n }\n return ['gpt-4o'];\n } catch (e: any) {\n console.warn(` ! Could not fetch models: ${e.message}. Using defaults.`);\n return FALLBACK_MODELS[provider] ?? ['gpt-4o'];\n }\n}\n\nexport async function cmdInit(): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n\n console.log('\\n elisym agent setup\\n');\n\n // Step 1: Agent name\n const { name } = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Agent name:',\n validate: (v: string) => {\n try {\n validateAgentName(v);\n return true;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n ]);\n\n const existing = listAgents();\n if (existing.includes(name)) {\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: `Agent \"${name}\" already exists. Overwrite?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n }\n\n // Step 2: Description\n const { description } = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: 'An elisym AI agent',\n },\n ]);\n\n // Step 2b: Profile images (local path or URL)\n const { pictureInput } = await inquirer.prompt([\n {\n type: 'input',\n name: 'pictureInput',\n message: 'Avatar image (URL or local path, optional):',\n default: '',\n },\n ]);\n\n const { bannerInput } = await inquirer.prompt([\n {\n type: 'input',\n name: 'bannerInput',\n message: 'Banner image (URL or local path, optional):',\n default: '',\n },\n ]);\n\n // Step 3: Solana address\n const { solanaAddress } = await inquirer.prompt([\n {\n type: 'input',\n name: 'solanaAddress',\n message: 'Solana address for receiving payments (leave empty to skip):',\n default: '',\n validate: (v: string) => {\n if (!v) {\n return true;\n }\n try {\n const pk = new PublicKey(v);\n return pk.toBase58().length > 0;\n } catch {\n return 'Invalid Solana address';\n }\n },\n },\n ]);\n\n // Step 4b: Solana network\n const { network } = await inquirer.prompt([\n {\n type: 'list',\n name: 'network',\n message: 'Solana network:',\n choices: [\n { name: 'devnet', value: 'devnet' },\n { name: 'testnet', value: 'testnet' },\n { name: 'mainnet', value: 'mainnet' },\n ],\n default: 'devnet',\n },\n ]);\n\n // Step 5: LLM provider\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' },\n { name: 'OpenAI (GPT)', value: 'openai' },\n ],\n },\n ]);\n\n // Step 6: API key\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${llmProvider === 'anthropic' ? 'Anthropic' : 'OpenAI'} API key:`,\n mask: '*',\n },\n ]);\n\n // Step 7: Model (fetch from API, fallback to hardcoded)\n console.log(' Fetching available models...');\n const models = await fetchModels(llmProvider, apiKey);\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n },\n ]);\n\n // Step 8: Max tokens\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: 4096,\n },\n ]);\n\n // Step 9: Passphrase for encrypting secrets\n const { passphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to encrypt secrets (leave empty to skip):',\n mask: '*',\n },\n ]);\n\n if (passphrase) {\n const { confirmPassphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'confirmPassphrase',\n message: 'Confirm passphrase:',\n mask: '*',\n validate: (v: string) => (v === passphrase ? true : 'Passphrases do not match'),\n },\n ]);\n void confirmPassphrase;\n }\n\n // Generate Nostr identity\n const nostrSecretKey = generateSecretKey();\n const nostrPubkey = getPublicKey(nostrSecretKey);\n const nostrSecretHex = Buffer.from(nostrSecretKey).toString('hex');\n const identity = ElisymIdentity.fromHex(nostrSecretHex);\n\n // Upload local images if needed\n const media = new MediaService();\n let picture = '';\n let banner = '';\n\n if (pictureInput || bannerInput) {\n console.log();\n if (pictureInput) {\n picture = await resolveImage(pictureInput, identity, media);\n }\n if (bannerInput) {\n banner = await resolveImage(bannerInput, identity, media);\n }\n }\n\n // Helper to optionally encrypt a secret\n const protect = (secret: string): string =>\n passphrase ? encryptSecret(secret, passphrase) : secret;\n\n const config: AgentConfig = {\n identity: {\n secret_key: protect(nostrSecretHex),\n name,\n description,\n picture: picture || undefined,\n banner: banner || undefined,\n },\n relays: [...RELAYS],\n payments: solanaAddress ? [{ chain: 'solana', network, address: solanaAddress }] : undefined,\n llm: {\n provider: llmProvider,\n api_key: protect(apiKey),\n model,\n max_tokens: maxTokens,\n },\n };\n\n saveConfig(config);\n\n const npub = nip19.npubEncode(nostrPubkey);\n console.log(`\\n Agent \"${name}\" created.`);\n console.log(` Nostr: ${npub}`);\n if (solanaAddress) {\n console.log(` Solana: ${solanaAddress}`);\n }\n if (passphrase) {\n console.log(' Secrets encrypted with your passphrase.');\n }\n console.log(` Config: ~/.elisym/agents/${name}/config.json\\n`);\n}\n","/**\n * elisym CLI - agent runner for the elisym network.\n *\n * Commands:\n * elisym init Create a new agent (interactive wizard)\n * elisym start [name] Start agent in provider mode\n * elisym list List all agents\n * elisym profile [name] Edit agent profile, wallet, and LLM settings\n * elisym wallet [name] Show wallet balance\n * elisym delete <name> Delete an agent\n */\nprocess.removeAllListeners('warning');\nimport { Command } from 'commander';\nimport { nip19, getPublicKey } from 'nostr-tools';\nimport { cmdInit } from './commands/init.js';\nimport { cmdProfile } from './commands/profile.js';\nimport { cmdStart } from './commands/start.js';\nimport { cmdWallet } from './commands/wallet.js';\nimport { loadConfig, listAgents, deleteAgent } from './config.js';\nimport { PACKAGE_VERSION } from './version.js';\n\nconst program = new Command()\n .name('elisym')\n .description('CLI agent runner for the elisym network')\n .version(PACKAGE_VERSION);\n\n// Init\nprogram.command('init').description('Create a new agent (interactive wizard)').action(cmdInit);\n\n// Profile\nprogram\n .command('profile [name]')\n .description('Edit agent profile, wallet, and LLM settings')\n .action(cmdProfile);\n\n// Start\nprogram.command('start [name]').description('Start agent in provider mode').action(cmdStart);\n\n// List\nprogram\n .command('list')\n .description('List all agents')\n .action(() => {\n const agents = listAgents();\n if (agents.length === 0) {\n console.log('No agents found. Run `elisym init` to create one.');\n return;\n }\n console.log('\\nAgents:');\n for (const name of agents) {\n try {\n const config = loadConfig(name);\n const secretKey = config.identity.secret_key;\n let npub = '(encrypted)';\n if (!secretKey.startsWith('encrypted:')) {\n const secretBytes = Buffer.from(secretKey, 'hex');\n npub =\n secretBytes.length === 32\n ? nip19.npubEncode(getPublicKey(secretBytes))\n : '(invalid key)';\n }\n const solAddr = config.payments?.[0]?.address\n ? ` | Solana: ${config.payments[0].address}`\n : '';\n console.log(` ${name} | ${npub}${solAddr}`);\n } catch {\n console.log(` ${name} (error loading config)`);\n }\n }\n console.log();\n });\n\n// Wallet\nprogram.command('wallet [name]').description('Show wallet balance').action(cmdWallet);\n\n// Delete\nprogram\n .command('delete <name>')\n .description('Delete an agent')\n .action(async (name: string) => {\n const { default: inquirer } = await import('inquirer');\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Delete agent \"${name}\"? This cannot be undone.`,\n default: false,\n },\n ]);\n if (confirm) {\n deleteAgent(name);\n console.log(`Agent \"${name}\" deleted.`);\n }\n });\n\nprogram.parse();\n","/**\n * Profile command - edit agent profile, wallet, and LLM settings.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport { ElisymIdentity, MediaService } from '@elisym/sdk';\nimport { encryptSecret, isEncrypted } from '@elisym/sdk/node';\nimport { PublicKey } from '@solana/web3.js';\nimport { loadConfig, saveConfig, listAgents } from '../config.js';\n\nasync function resolveImage(\n input: string,\n identity: ElisymIdentity,\n media: MediaService,\n): Promise<string> {\n if (!input) {\n return '';\n }\n if (existsSync(input)) {\n console.log(` Uploading ${basename(input)}...`);\n const data = readFileSync(input);\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(input));\n console.log(` Uploaded: ${url}`);\n return url;\n }\n return input;\n}\n\nexport async function cmdProfile(name: string | undefined): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n\n // Resolve agent name\n if (!name) {\n const agents = listAgents();\n if (agents.length === 0) {\n console.error('No agents found. Run `elisym init` first.');\n process.exit(1);\n }\n const { selected } = await inquirer.prompt([\n { type: 'list', name: 'selected', message: 'Select agent:', choices: agents },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const config = loadConfig(name!, passphrase);\n const identity = ElisymIdentity.fromHex(config.identity.secret_key);\n\n console.log(`\\n Editing agent \"${name}\"\\n`);\n\n // Menu loop\n let done = false;\n while (!done) {\n const { section } = await inquirer.prompt([\n {\n type: 'list',\n name: 'section',\n message: 'What to edit?',\n choices: [\n { name: `Profile (name: ${config.identity.name})`, value: 'profile' },\n {\n name: `Wallet (${config.payments?.[0]?.address ?? 'not configured'})`,\n value: 'wallet',\n },\n {\n name: `LLM (${config.llm?.provider ?? 'not configured'} / ${config.llm?.model ?? '-'})`,\n value: 'llm',\n },\n { name: 'Done', value: 'done' },\n ],\n },\n ]);\n\n if (section === 'done') {\n done = true;\n continue;\n }\n\n if (section === 'profile') {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: config.identity.description ?? '',\n },\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar (URL or local path):',\n default: config.identity.picture ?? '',\n },\n {\n type: 'input',\n name: 'banner',\n message: 'Banner (URL or local path):',\n default: config.identity.banner ?? '',\n },\n ]);\n\n config.identity.description = answers.description || undefined;\n\n const media = new MediaService();\n if (answers.picture) {\n config.identity.picture = await resolveImage(answers.picture, identity, media);\n } else {\n config.identity.picture = undefined;\n }\n if (answers.banner) {\n config.identity.banner = await resolveImage(answers.banner, identity, media);\n } else {\n config.identity.banner = undefined;\n }\n\n saveConfig(config);\n console.log(' Profile updated.\\n');\n }\n\n if (section === 'wallet') {\n const currentAddress = config.payments?.[0]?.address ?? '';\n const currentNetwork = config.payments?.[0]?.network ?? 'devnet';\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Solana address:',\n default: currentAddress,\n validate: (v: string) => {\n if (!v) {\n return true;\n }\n try {\n const pk = new PublicKey(v);\n return pk.toBase58().length > 0;\n } catch {\n return 'Invalid Solana address';\n }\n },\n },\n {\n type: 'list',\n name: 'network',\n message: 'Network:',\n choices: ['devnet', 'testnet', 'mainnet'],\n default: currentNetwork,\n },\n ]);\n\n if (answers.address) {\n config.payments = [{ chain: 'solana', network: answers.network, address: answers.address }];\n } else {\n config.payments = undefined;\n }\n\n saveConfig(config);\n console.log(' Wallet updated.\\n');\n }\n\n if (section === 'llm') {\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n { name: 'Anthropic (Claude)', value: 'anthropic' },\n { name: 'OpenAI (GPT)', value: 'openai' },\n ],\n default: config.llm?.provider ?? 'anthropic',\n },\n ]);\n\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `API key (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n\n const effectiveKey = apiKey || config.llm?.api_key || '';\n\n // Fetch models with the effective key\n let plainKey = effectiveKey;\n if (isEncrypted(plainKey) && passphrase) {\n const { decryptSecret } = await import('@elisym/sdk/node');\n plainKey = decryptSecret(plainKey, passphrase);\n }\n\n console.log(' Fetching available models...');\n const { fetchModels } = await import('./init.js');\n const models = await fetchModels(llmProvider, plainKey);\n\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n default: config.llm?.model,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: config.llm?.max_tokens ?? 4096,\n },\n ]);\n\n const protect = (secret: string): string =>\n passphrase ? encryptSecret(secret, passphrase) : secret;\n\n config.llm = {\n provider: llmProvider,\n api_key: apiKey ? protect(apiKey) : effectiveKey,\n model,\n max_tokens: maxTokens,\n };\n\n saveConfig(config);\n console.log(' LLM updated.\\n');\n }\n }\n\n console.log(` Agent \"${name}\" saved.\\n`);\n}\n","/**\n * Start command - run agent in provider mode.\n * Loads all skills, publishes per-capability cards, processes jobs with per-capability pricing.\n */\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport {\n ElisymClient,\n ElisymIdentity,\n MediaService,\n formatSol,\n RELAYS,\n DEFAULTS,\n DEFAULT_KIND_OFFSET,\n jobRequestKind,\n type CapabilityCard,\n} from '@elisym/sdk';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport { loadConfig, listAgents } from '../config.js';\nimport {\n getRpcUrl,\n HEARTBEAT_INTERVAL_MS,\n MAX_CONCURRENT_JOBS,\n RECOVERY_MAX_RETRIES,\n RECOVERY_INTERVAL_SECS,\n} from '../helpers.js';\nimport { JobLedger } from '../ledger.js';\nimport { createLlmClient } from '../llm';\nimport { AgentRuntime, type RuntimeConfig } from '../runtime.js';\nimport { SkillRegistry, type SkillContext } from '../skill';\nimport { loadSkillsFromDir } from '../skill/loader.js';\nimport { NostrTransport } from '../transport/nostr.js';\n\nexport async function cmdStart(name: string | undefined): Promise<void> {\n // -- Step 1: Resolve agent name --\n if (!name) {\n const agents = listAgents();\n if (agents.length === 0) {\n console.log('No agents configured. Run `elisym init` first.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const choices = [...agents, { name: '+ Create new agent', value: '__new__' }];\n const { selected } = await inquirer.prompt([\n { type: 'list', name: 'selected', message: 'Select agent to start', choices },\n ]);\n if (selected === '__new__') {\n const { cmdInit } = await import('./init.js');\n await cmdInit();\n\n return;\n }\n name = selected;\n }\n\n // -- Step 2: Load config (with optional passphrase for encrypted keys) --\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const config = loadConfig(name!, passphrase);\n\n // -- Step 3: Banner + starting message --\n console.log(`\\n Starting agent ${name}...\\n`);\n\n // -- Step 4: Resolve Solana address and show balance --\n let solanaAddress: string | undefined;\n if (config.payments?.length) {\n const solPayment = config.payments.find((p) => p.chain === 'solana');\n if (solPayment) {\n solanaAddress = solPayment.address;\n }\n }\n\n const walletNetwork = config.payments?.find((p) => p.chain === 'solana')?.network ?? 'devnet';\n\n if (solanaAddress) {\n try {\n const rpcUrl = getRpcUrl(walletNetwork);\n const connection = new Connection(rpcUrl, { disableRetryOnRateLimit: true });\n const pubkey = new PublicKey(solanaAddress);\n const balance = await connection.getBalance(pubkey);\n\n console.log(' Wallet');\n console.log(` Network ${walletNetwork}`);\n console.log(` Address ${solanaAddress}`);\n if (process.env.SOLANA_RPC_URL) {\n console.log(` RPC ${process.env.SOLANA_RPC_URL} (custom)`);\n }\n console.log(` Balance ${formatSol(balance)} (${balance} lamports)`);\n\n if (balance === 0) {\n if (walletNetwork === 'mainnet') {\n console.log(\n ' ! Warning: wallet is empty. First incoming payment needs rent-exempt SOL (~0.00089 SOL).',\n );\n } else {\n console.log(' ! Wallet is empty. Get devnet SOL: https://faucet.solana.com');\n }\n }\n if (walletNetwork === 'mainnet' && !process.env.SOLANA_RPC_URL) {\n console.log(\n ' ! Warning: using public Solana RPC for mainnet. Set SOLANA_RPC_URL for reliable operation.',\n );\n }\n console.log();\n } catch (e: any) {\n console.warn(` ! Wallet error: ${e.message}\\n`);\n }\n }\n\n // -- Step 5: LLM check --\n if (!config.llm) {\n console.error(' ! No LLM configured. Run `elisym init` to set up LLM.\\n');\n process.exit(1);\n }\n\n // -- Step 6: Load and register all skills --\n const skillsDir = join(process.cwd(), 'skills');\n const allSkills = loadSkillsFromDir(skillsDir);\n\n if (allSkills.length === 0) {\n console.error(` ! No skills found in ${skillsDir}\\n`);\n console.error(' Create a skill directory with a SKILL.md to get started.');\n console.error(' Example: ./skills/my-skill/SKILL.md\\n');\n process.exit(1);\n }\n\n const registry = new SkillRegistry();\n for (const skill of allSkills) {\n registry.register(skill);\n const price = skill.priceLamports > 0 ? formatSol(skill.priceLamports) : 'free';\n console.log(` * Skill: ${skill.name} [${skill.capabilities.join(', ')}] - ${price}`);\n }\n console.log();\n\n // Validate that paid skills have a Solana address configured\n const hasPaid = allSkills.some((s) => s.priceLamports > 0);\n if (hasPaid && !solanaAddress) {\n console.error(' ! Paid skills require a Solana address. Run `elisym init` to configure.\\n');\n process.exit(1);\n }\n\n // -- Step 8: Build LLM client --\n const llm = createLlmClient({\n provider: config.llm!.provider as any,\n apiKey: config.llm!.api_key,\n model: config.llm!.model,\n maxTokens: config.llm!.max_tokens,\n logUsage: true,\n });\n\n const skillCtx: SkillContext = {\n llm,\n agentName: config.identity.name,\n agentDescription: config.identity.description ?? '',\n };\n\n // -- Step 9: Connect to relays --\n console.log(' Connecting to relays and publishing capabilities...');\n\n const identity = ElisymIdentity.fromHex(config.identity.secret_key);\n const relays = config.relays?.length ? config.relays : [...RELAYS];\n const client = new ElisymClient({ relays });\n\n // -- Step 10: Upload skill images (image_file -> image URL in SKILL.md) --\n const media = new MediaService();\n\n for (const skill of allSkills) {\n if (skill.image || !skill.imageFile) {\n continue;\n }\n // Upload local file and write URL back to SKILL.md\n try {\n const filePath = join(skillsDir, skill.name, skill.imageFile);\n console.log(` Uploading ${basename(filePath)}...`);\n const data = readFileSync(filePath);\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(filePath));\n console.log(` Uploaded: ${url}`);\n skill.image = url;\n\n // Write URL back to SKILL.md so it's not re-uploaded next time\n const skillMdPath = join(skillsDir, skill.name, 'SKILL.md');\n const mdContent = readFileSync(skillMdPath, 'utf-8');\n const updated = mdContent.replace(/^(image_file:\\s*.+)$/m, (m) => `${m}\\nimage: ${url}`);\n writeFileSync(skillMdPath, updated);\n } catch (e: any) {\n console.warn(` ! Failed to upload image for \"${skill.name}\": ${e.message}`);\n }\n }\n\n // -- Step 11: Publish kind:0 profile --\n try {\n await client.discovery.publishProfile(\n identity,\n config.identity.name,\n config.identity.description ?? '',\n config.identity.picture,\n config.identity.banner,\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish profile: ${e.message}`);\n }\n\n // -- Step 11: Publish per-skill capability cards (kind:31990) --\n const kinds = [jobRequestKind(DEFAULT_KIND_OFFSET)];\n\n function buildCard(skill: (typeof allSkills)[0]): CapabilityCard {\n return {\n name: skill.name,\n description: skill.description,\n capabilities: skill.capabilities,\n image: skill.image,\n payment: solanaAddress\n ? {\n chain: 'solana',\n network: walletNetwork,\n address: solanaAddress,\n job_price: skill.priceLamports,\n }\n : undefined,\n };\n }\n\n for (const skill of allSkills) {\n try {\n await client.discovery.publishCapability(identity, buildCard(skill), kinds);\n } catch (e: any) {\n console.warn(` ! Failed to publish \"${skill.name}\": ${e.message}`);\n }\n }\n\n // -- Step 12: Clean up stale capabilities from relay --\n try {\n const existingEvents = await client.pool.querySync({\n kinds: [31990],\n authors: [identity.publicKey],\n '#t': ['elisym'],\n });\n const skillNames = new Set(allSkills.map((s) => s.name));\n for (const ev of existingEvents) {\n const dTag = ev.tags.find((t: string[]) => t[0] === 'd')?.[1];\n if (!dTag) {\n continue;\n }\n // Parse card to get original name\n try {\n const card = JSON.parse(ev.content);\n if (card.name && !skillNames.has(card.name)) {\n await client.discovery.deleteCapability(identity, card.name);\n console.log(` Removed stale capability: ${card.name}`);\n }\n } catch {\n // malformed event, skip\n }\n }\n } catch {\n // non-fatal: stale cards will expire naturally\n }\n\n console.log(' Connected.\\n');\n\n // -- Step 13: Start ping responder --\n const pingSub = client.ping.subscribeToPings(identity, (senderPubkey, nonce) => {\n client.ping.sendPong(identity, senderPubkey, nonce).catch(() => {});\n });\n\n // -- Step 14: Start heartbeat (republish first card to update lastSeen) --\n let heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n if (allSkills.length > 0) {\n const heartbeatCard = buildCard(allSkills[0]!);\n heartbeatTimer = setInterval(async () => {\n try {\n await client.discovery.publishCapability(identity, heartbeatCard, kinds);\n } catch {\n /* heartbeat failure is non-fatal */\n }\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n // -- Step 15: Build transport + ledger + runtime --\n const transport = new NostrTransport(client, identity, [DEFAULT_KIND_OFFSET]);\n const ledger = new JobLedger(name!);\n\n const runtimeConfig: RuntimeConfig = {\n paymentTimeoutSecs: DEFAULTS.PAYMENT_EXPIRY_SECS,\n maxConcurrentJobs: MAX_CONCURRENT_JOBS,\n recoveryMaxRetries: RECOVERY_MAX_RETRIES,\n recoveryIntervalSecs: RECOVERY_INTERVAL_SECS,\n network: walletNetwork,\n solanaAddress,\n };\n\n const runtime = new AgentRuntime(transport, registry, skillCtx, runtimeConfig, ledger, {\n onJobReceived: (job) => {\n const cap = job.tags.find((t) => t !== 'elisym') ?? 'unknown';\n console.log(` [job] ${job.jobId.slice(0, 16)} | cap=${cap}`);\n },\n onJobCompleted: (jobId) => {\n console.log(` [job] ${jobId.slice(0, 16)} | delivered`);\n },\n onJobError: (jobId, error) => {\n console.error(` [job] ${jobId.slice(0, 16)} | error: ${error}`);\n },\n onLog: (msg) => console.log(` ${msg}`),\n });\n\n // Cleanup on shutdown\n const originalStop = runtime.stop.bind(runtime);\n runtime.stop = () => {\n pingSub.close();\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n originalStop();\n };\n\n // -- Step 16: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n","/**\n * Shared CLI helpers - RPC URLs, SOL formatting, price validation.\n */\nimport { calculateProtocolFee } from '@elisym/sdk';\n\n// --- Constants ---\n\nexport const RENT_EXEMPT_MINIMUM = 890_880; // lamports\nexport const HEARTBEAT_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nexport const MAX_CONCURRENT_JOBS = 10;\nexport const RECOVERY_MAX_RETRIES = 5;\nexport const RECOVERY_INTERVAL_SECS = 60;\n\n// --- Solana RPC ---\n\nexport function getRpcUrl(network: string): string {\n const envUrl = process.env.SOLANA_RPC_URL;\n if (envUrl) {\n return envUrl;\n }\n switch (network) {\n case 'mainnet':\n return 'https://api.mainnet-beta.solana.com';\n case 'testnet':\n return 'https://api.testnet.solana.com';\n default:\n return 'https://api.devnet.solana.com';\n }\n}\n\n// --- SOL formatting (number only, no \" SOL\" suffix - use SDK's formatSol for display) ---\n\nexport function formatLamports(lamports: number): string {\n const whole = Math.floor(lamports / 1_000_000_000);\n const frac = lamports % 1_000_000_000;\n return `${whole}.${String(frac).padStart(9, '0')}`;\n}\n\n// --- SOL parsing ---\n\nexport function parseSolToLamports(s: string): number | null {\n const trimmed = s.trim();\n if (!trimmed) {\n return null;\n }\n\n const dotPos = trimmed.indexOf('.');\n if (dotPos === -1) {\n const whole = parseInt(trimmed, 10);\n if (isNaN(whole) || whole < 0) {\n return null;\n }\n return whole * 1_000_000_000;\n }\n\n const wholePart = dotPos === 0 ? 0 : parseInt(trimmed.slice(0, dotPos), 10);\n if (isNaN(wholePart)) {\n return null;\n }\n\n const fracStr = trimmed.slice(dotPos + 1);\n if (fracStr.length === 0 || fracStr.length > 9) {\n return null;\n }\n\n const padded = fracStr.padEnd(9, '0');\n const frac = parseInt(padded, 10);\n if (isNaN(frac)) {\n return null;\n }\n\n return wholePart * 1_000_000_000 + frac;\n}\n\n// --- Price validation ---\n\nexport function validateJobPrice(lamports: number, accountFunded: boolean): string | null {\n if (lamports === 0) {\n return null;\n }\n const fee = calculateProtocolFee(lamports);\n const providerNet = lamports - fee;\n if (!accountFunded && providerNet < RENT_EXEMPT_MINIMUM) {\n return (\n `Price too low. After 3% fee, provider receives ${providerNet} lamports, ` +\n `which is below rent-exempt minimum (${RENT_EXEMPT_MINIMUM}). Increase price or fund wallet first.`\n );\n }\n return null;\n}\n","/**\n * Job recovery ledger - persistent JSON storage for crash recovery.\n */\nimport { readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, dirname } from 'node:path';\n\nexport type LedgerStatus = 'paid' | 'executed' | 'delivered' | 'failed';\n\nexport interface LedgerEntry {\n job_id: string;\n status: LedgerStatus;\n input: string;\n input_type: string;\n tags: string[];\n customer_id: string;\n bid?: number;\n payment_request?: string;\n net_amount?: number;\n result?: string;\n raw_event_json?: string;\n created_at: number;\n retry_count: number;\n}\n\nconst VALID_TRANSITIONS: Record<LedgerStatus, LedgerStatus[]> = {\n paid: ['executed', 'failed'],\n executed: ['delivered', 'failed'],\n delivered: [],\n failed: [],\n};\n\nexport class JobLedger {\n private entries = new Map<string, LedgerEntry>();\n private path: string;\n\n constructor(agentName: string) {\n this.path = join(homedir(), '.elisym', 'agents', agentName, 'jobs.json');\n this.load();\n }\n\n private load(): void {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const data = JSON.parse(raw) as Record<string, LedgerEntry>;\n for (const [id, entry] of Object.entries(data)) {\n this.entries.set(id, entry);\n }\n } catch (e: any) {\n // W4: Log warning on malformed ledger and backup corrupt file\n if (e?.code !== 'ENOENT') {\n console.warn(` ! Ledger load warning: ${e?.message ?? 'unknown error'}`);\n try {\n renameSync(this.path, this.path + '.corrupt.' + Date.now());\n } catch {\n /* best effort backup */\n }\n }\n }\n }\n\n flush(): void {\n const dir = dirname(this.path);\n mkdirSync(dir, { recursive: true });\n const obj = Object.fromEntries(this.entries);\n const tmp = this.path + '.tmp';\n writeFileSync(tmp, JSON.stringify(obj, null, 2));\n renameSync(tmp, this.path);\n }\n\n recordPaid(entry: Omit<LedgerEntry, 'status' | 'retry_count'>): void {\n if (this.entries.has(entry.job_id)) {\n return;\n }\n this.entries.set(entry.job_id, { ...entry, status: 'paid', retry_count: 0 });\n this.flush();\n }\n\n updatePayment(jobId: string, netAmount?: number, paymentRequest?: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n if (netAmount !== undefined) {\n entry.net_amount = netAmount;\n }\n if (paymentRequest !== undefined) {\n entry.payment_request = paymentRequest;\n }\n this.flush();\n }\n }\n\n /** Attempt a state transition. Returns the entry if valid, undefined otherwise. */\n private transition(jobId: string, to: LedgerStatus): LedgerEntry | undefined {\n const entry = this.entries.get(jobId);\n if (!entry) {\n return undefined;\n }\n if (!VALID_TRANSITIONS[entry.status].includes(to)) {\n return undefined;\n }\n entry.status = to;\n return entry;\n }\n\n markExecuted(jobId: string, result: string): void {\n const entry = this.transition(jobId, 'executed');\n if (entry) {\n entry.result = result;\n this.flush();\n }\n }\n\n markDelivered(jobId: string): void {\n const entry = this.transition(jobId, 'delivered');\n if (entry) {\n entry.result = undefined; // Free memory\n this.flush();\n }\n }\n\n markFailed(jobId: string): void {\n const entry = this.transition(jobId, 'failed');\n if (entry) {\n entry.result = undefined; // Free memory\n try {\n this.flush();\n } catch {\n /* disk full - in-memory state is still correct */\n }\n }\n }\n\n incrementRetry(jobId: string): void {\n const entry = this.entries.get(jobId);\n if (entry) {\n entry.retry_count++;\n this.flush();\n }\n }\n\n getStatus(jobId: string): LedgerStatus | undefined {\n return this.entries.get(jobId)?.status;\n }\n\n pendingJobs(): LedgerEntry[] {\n return [...this.entries.values()].filter((e) => e.status === 'paid' || e.status === 'executed');\n }\n\n /** Remove old delivered/failed entries (default: 7 days). */\n gc(maxAgeSecs = 7 * 24 * 60 * 60): void {\n const cutoff = Math.floor(Date.now() / 1000) - maxAgeSecs;\n for (const [id, entry] of this.entries) {\n if (\n (entry.status === 'delivered' || entry.status === 'failed') &&\n entry.created_at < cutoff\n ) {\n this.entries.delete(id);\n }\n }\n this.flush();\n }\n}\n","/**\n * LLM client - supports Anthropic and OpenAI with tool-use.\n */\nimport type { LlmClient, ToolDef, CompletionResult, ToolCall, ToolResult } from '../skill/index.js';\n\nexport type LlmProvider = 'anthropic' | 'openai';\n\nexport interface LlmConfig {\n provider: LlmProvider;\n apiKey: string;\n model: string;\n maxTokens: number;\n /** Log token usage to console after each API call. Default: false. */\n logUsage?: boolean;\n}\n\nconst LLM_TIMEOUT_MS = 120_000; // 2 minutes\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\n/** Create an AbortError compatible with Node 18 (no DOMException in types). */\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\n/** Sleep that can be cancelled by an AbortSignal. Cleans up listeners in all paths. */\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n if (!signal) {\n return new Promise((r) => setTimeout(r, ms));\n }\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** Fetch with timeout + abort signal. Node 18 compatible (no AbortSignal.any). */\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), LLM_TIMEOUT_MS);\n const onAbort = () => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n}\n\n/** Fetch with timeout + retry on transient HTTP/network errors. */\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n let res: Response;\n try {\n res = await fetchWithTimeout(url, init, signal);\n } catch (e: any) {\n // Network errors (DNS, ECONNRESET, etc.) - retry unless abort or exhausted\n if (attempt >= MAX_RETRIES || e.name === 'AbortError') {\n throw e;\n }\n await sleepWithSignal(Math.min(1000 * 2 ** attempt, 8000), signal);\n continue;\n }\n if (res.ok || attempt >= MAX_RETRIES || !RETRYABLE_STATUSES.has(res.status)) {\n return res;\n }\n const retryAfter = res.headers.get('retry-after');\n const delay = retryAfter\n ? Math.min(parseInt(retryAfter, 10) * 1000 || 1000 * 2 ** attempt, 30_000)\n : Math.min(1000 * 2 ** attempt, 8000);\n await sleepWithSignal(delay, signal);\n }\n}\n\nexport function createLlmClient(config: LlmConfig): LlmClient {\n if (config.provider === 'anthropic') {\n return new AnthropicClient(config);\n }\n return new OpenAIClient(config);\n}\n\nclass AnthropicClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private config: LlmConfig) {}\n\n private logTokens(usage: any): void {\n if (this.config.logUsage && usage) {\n this.totalIn += usage.input_tokens ?? 0;\n this.totalOut += usage.output_tokens ?? 0;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${usage.input_tokens ?? 0} out=${usage.output_tokens ?? 0} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const res = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages: [{ role: 'user', content: userInput }],\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`Anthropic API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n const textBlock = data.content?.find((b: any) => b.type === 'text');\n return textBlock?.text ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const anthropicTools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: {\n type: 'object',\n properties: Object.fromEntries(\n t.parameters.map((p) => [p.name, { type: 'string', description: p.description }]),\n ),\n required: t.parameters.filter((p) => p.required).map((p) => p.name),\n },\n }));\n\n const res = await fetchWithRetry(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: systemPrompt,\n messages,\n tools: anthropicTools,\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`Anthropic API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n const content = data.content ?? [];\n\n const toolUses = content.filter((b: any) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n const calls: ToolCall[] = toolUses.map((t: any) => ({\n id: t.id,\n name: t.name,\n arguments: t.input ?? {},\n }));\n return {\n type: 'tool_use',\n calls,\n assistantMessage: { role: 'assistant', content },\n };\n }\n\n const textBlock = content.find((b: any) => b.type === 'text');\n return { type: 'text', text: textBlock?.text ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): any[] {\n return [\n {\n role: 'user',\n content: results.map((r) => ({\n type: 'tool_result',\n tool_use_id: r.callId,\n content: r.content,\n })),\n },\n ];\n }\n}\n\nclass OpenAIClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private config: LlmConfig) {}\n\n private logTokens(usage: any): void {\n if (this.config.logUsage && usage) {\n this.totalIn += usage.prompt_tokens ?? 0;\n this.totalOut += usage.completion_tokens ?? 0;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${usage.prompt_tokens ?? 0} out=${usage.completion_tokens ?? 0} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const isReasoning = /^o\\d/.test(this.config.model);\n const res = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(isReasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: isReasoning ? 'developer' : 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`OpenAI API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n t.parameters.map((p) => [p.name, { type: 'string', description: p.description }]),\n ),\n required: t.parameters.filter((p) => p.required).map((p) => p.name),\n },\n },\n }));\n\n const isReasoning = /^o\\d/.test(this.config.model);\n const res = await fetchWithRetry(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model: this.config.model,\n ...(isReasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: isReasoning ? 'developer' : 'system', content: systemPrompt },\n ...messages,\n ],\n tools: openaiTools,\n }),\n },\n signal,\n );\n\n if (!res.ok) {\n throw new Error(`OpenAI API error: ${res.status} ${await res.text()}`);\n }\n\n const data = (await res.json()) as any;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n\n if (message?.tool_calls?.length > 0) {\n const calls: ToolCall[] = message.tool_calls.map((tc: any) => {\n let args: Record<string, any>;\n try {\n args = JSON.parse(tc.function.arguments ?? '{}');\n } catch {\n args = {};\n }\n return { id: tc.id, name: tc.function.name, arguments: args };\n });\n return {\n type: 'tool_use',\n calls,\n assistantMessage: message,\n };\n }\n\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): any[] {\n return results.map((r) => ({\n role: 'tool',\n tool_call_id: r.callId,\n content: r.content,\n }));\n }\n}\n","/**\n * AgentRuntime - main job processing loop with concurrency, payment, and recovery.\n * Supports per-capability pricing: each capability can have a different price.\n */\nimport { SolanaPaymentStrategy, calculateProtocolFee, LIMITS } from '@elisym/sdk';\nimport { Connection } from '@solana/web3.js';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext } from './skill/index.js';\nimport type { NostrTransport, IncomingJob } from './transport/nostr.js';\n\nconst payment = new SolanaPaymentStrategy();\nconst LEDGER_GC_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\nconst TOTAL_JOB_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\nexport interface RuntimeConfig {\n paymentTimeoutSecs: number;\n maxConcurrentJobs: number;\n recoveryMaxRetries: number;\n recoveryIntervalSecs: number;\n network: string;\n solanaAddress?: string;\n maxQueueSize?: number;\n}\n\nexport interface RuntimeCallbacks {\n onJobReceived?: (job: IncomingJob) => void;\n onJobCompleted?: (jobId: string, result: string) => void;\n onJobError?: (jobId: string, error: string) => void;\n onPaymentReceived?: (jobId: string, netAmount: number) => void;\n onLog?: (message: string) => void;\n}\n\n/** Resolve the price for a job by matching its tags against registered skills. */\nfunction resolveJobPrice(tags: string[], skills: SkillRegistry): number {\n const skill = skills.route(tags);\n return skill?.priceLamports ?? 0;\n}\n\nconst RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; // 10 minutes\nconst MAX_JOBS_PER_CUSTOMER = 20;\nconst GLOBAL_MAX_JOBS_PER_WINDOW = 200;\n\nexport class AgentRuntime {\n private limit: ReturnType<typeof pLimit>;\n private inFlight = new Set<string>();\n private pending = 0;\n private maxQueueSize: number;\n private abortController = new AbortController();\n private jobAbortControllers = new Set<AbortController>();\n private recoveryInterval: ReturnType<typeof setInterval> | null = null;\n private gcInterval: ReturnType<typeof setInterval> | null = null;\n /** Per-customer sliding window rate limiter: pubkey -> timestamps. */\n private customerJobs = new Map<string, number[]>();\n /** Global sliding window rate limiter (Sybil protection). */\n private globalJobs: number[] = [];\n\n constructor(\n private transport: NostrTransport,\n private skills: SkillRegistry,\n private skillCtx: SkillContext,\n private config: RuntimeConfig,\n private ledger: JobLedger,\n private callbacks: RuntimeCallbacks = {},\n ) {\n this.limit = pLimit(config.maxConcurrentJobs);\n this.maxQueueSize = config.maxQueueSize ?? config.maxConcurrentJobs * 10;\n }\n\n async run(): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // GC old ledger entries\n this.ledger.gc();\n\n // Recover pending jobs from previous sessions\n await this.recoverPendingJobs();\n\n // Start periodic recovery\n this.recoveryInterval = setInterval(\n () => this.recoverPendingJobs().catch((e) => log(`Recovery error: ${e}`)),\n this.config.recoveryIntervalSecs * 1000,\n );\n\n // Periodic ledger GC, rate limit cleanup, and subscription health check\n this.gcInterval = setInterval(() => {\n try {\n this.ledger.gc();\n } catch (e: any) {\n log(`GC error: ${e.message}`);\n }\n this.cleanupRateLimits();\n if (!this.transport.isHealthy()) {\n log('Warning: no events received in 30+ minutes. Check relay connectivity.');\n }\n }, LEDGER_GC_INTERVAL_MS);\n\n // Start listening for jobs\n this.transport.start((job) => {\n if (this.abortController.signal.aborted) {\n return;\n }\n if (this.inFlight.has(job.jobId)) {\n return;\n }\n if (this.ledger.getStatus(job.jobId)) {\n return;\n }\n\n // Drop jobs when queue is full to prevent unbounded memory growth\n if (this.pending >= this.maxQueueSize) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server overloaded, try again later' })\n .catch(() => {});\n return;\n }\n\n // Global rate limiting (Sybil protection)\n if (this.isGlobalRateLimited()) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server busy, try again later' })\n .catch(() => {});\n return;\n }\n\n // Per-customer rate limiting\n if (this.isCustomerRateLimited(job.customerId)) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n\n // Record acceptance only after all checks pass\n this.recordJobAccepted(job.customerId);\n\n this.callbacks.onJobReceived?.(job);\n this.inFlight.add(job.jobId);\n this.pending++;\n\n this.limit(() => this.processJob(job))\n .catch((e: any) => {\n this.callbacks.onJobError?.(job.jobId, e.message);\n })\n .finally(() => {\n this.inFlight.delete(job.jobId);\n this.pending--;\n });\n });\n\n log('Agent runtime started. Listening for jobs...');\n\n // Wait for shutdown signal\n await new Promise<void>((resolve) => {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n\n process.on('SIGINT', () => {\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n });\n process.on('SIGTERM', () => {\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n });\n });\n }\n\n /** Returns true if global job throughput has been exceeded (Sybil protection). Pure check - no side effects. */\n private isGlobalRateLimited(): boolean {\n const now = Date.now();\n this.globalJobs = this.globalJobs.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n return this.globalJobs.length >= GLOBAL_MAX_JOBS_PER_WINDOW;\n }\n\n /** Returns true if customer has exceeded the per-window job limit. Pure check - no side effects. */\n private isCustomerRateLimited(customerId: string): boolean {\n const now = Date.now();\n const timestamps = this.customerJobs.get(customerId) ?? [];\n const recent = timestamps.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n this.customerJobs.set(customerId, recent);\n return recent.length >= MAX_JOBS_PER_CUSTOMER;\n }\n\n /** Record a job acceptance for rate limiting. Called only after all checks pass. */\n private recordJobAccepted(customerId: string): void {\n const now = Date.now();\n this.globalJobs.push(now);\n const timestamps = this.customerJobs.get(customerId) ?? [];\n timestamps.push(now);\n this.customerJobs.set(customerId, timestamps);\n }\n\n /** Clean up expired rate limit entries. */\n private cleanupRateLimits(): void {\n const now = Date.now();\n this.globalJobs = this.globalJobs.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n for (const [key, timestamps] of this.customerJobs) {\n const recent = timestamps.filter((t) => now - t < RATE_LIMIT_WINDOW_MS);\n if (recent.length === 0) {\n this.customerJobs.delete(key);\n } else {\n this.customerJobs.set(key, recent);\n }\n }\n }\n\n stop(): void {\n this.abortController.abort();\n for (const controller of this.jobAbortControllers) {\n controller.abort();\n }\n if (this.recoveryInterval) {\n clearInterval(this.recoveryInterval);\n this.recoveryInterval = null;\n }\n if (this.gcInterval) {\n clearInterval(this.gcInterval);\n this.gcInterval = null;\n }\n this.transport.stop();\n }\n\n /** Wrapper with total job timeout and error handling. */\n private async processJob(job: IncomingJob): Promise<void> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const jobAbort = new AbortController();\n this.jobAbortControllers.add(jobAbort);\n try {\n await Promise.race([\n this.executeJob(job, jobAbort.signal),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n jobAbort.abort();\n reject(new Error('Job processing timeout'));\n }, TOTAL_JOB_TIMEOUT_MS);\n }),\n ]);\n } catch (e: any) {\n const log = this.callbacks.onLog ?? console.log;\n log(`[${job.jobId.slice(0, 8)}] Error: ${e.message}`);\n\n // Don't mark executed jobs as failed - recovery will re-deliver\n const currentStatus = this.ledger.getStatus(job.jobId);\n if (currentStatus !== 'executed') {\n this.ledger.markFailed(job.jobId);\n }\n this.callbacks.onJobError?.(job.jobId, e.message);\n\n // W8: Sanitize error messages before sending to customer\n const safeMessage = e.message?.includes('API')\n ? 'Internal processing error'\n : (e.message ?? 'Unknown error');\n await this.transport\n .sendFeedback(job, { type: 'error', message: safeMessage })\n .catch(() => {});\n } finally {\n clearTimeout(timeoutId);\n this.jobAbortControllers.delete(jobAbort);\n }\n }\n\n /** Core job processing logic - payment, skill execution, result delivery. */\n private async executeJob(job: IncomingJob, signal?: AbortSignal): Promise<void> {\n const log = this.callbacks.onLog ?? console.log;\n\n // W2: Validate input length before processing\n if (job.input.length > LIMITS.MAX_INPUT_LENGTH) {\n throw new Error(`Input too long: ${job.input.length} chars (max ${LIMITS.MAX_INPUT_LENGTH})`);\n }\n\n // ── Step 1: Resolve per-capability price and collect payment ──\n const jobPrice = resolveJobPrice(job.tags, this.skills);\n let netAmount: number | undefined;\n let paymentRequest: string | undefined;\n\n // W1: Record in ledger BEFORE payment to prevent crash window data loss\n this.ledger.recordPaid({\n job_id: job.jobId,\n input: job.input,\n input_type: job.inputType,\n tags: job.tags,\n customer_id: job.customerId,\n bid: job.bid,\n net_amount: undefined,\n raw_event_json: JSON.stringify(job.rawEvent),\n created_at: Math.floor(Date.now() / 1000),\n });\n\n if (jobPrice > 0) {\n const result = await this.collectPayment(job, jobPrice, signal);\n netAmount = result.netAmount;\n paymentRequest = result.paymentRequest;\n // Update ledger with payment info\n this.ledger.updatePayment(job.jobId, netAmount, paymentRequest);\n log(`[${job.jobId.slice(0, 8)}] Payment confirmed: ${netAmount} lamports`);\n this.callbacks.onPaymentReceived?.(job.jobId, netAmount);\n }\n\n // ── Step 2: Send Processing feedback ──\n await this.transport.sendFeedback(job, { type: 'processing' }).catch(() => {});\n\n // ── Step 3: Route to skill ──\n const skill = this.skills.route(job.tags);\n if (!skill) {\n throw new Error('No skill matched for tags: ' + job.tags.join(', '));\n }\n\n log(`[${job.jobId.slice(0, 8)}] Executing skill: ${skill.name}`);\n\n // ── Step 4: Execute skill ──\n const output = await skill.execute(\n {\n data: job.input,\n inputType: job.inputType,\n tags: job.tags,\n jobId: job.jobId,\n },\n { ...this.skillCtx, signal },\n );\n\n // ── Step 5: Cache result in ledger ──\n // NOTE: At-least-once delivery. A crash between execute() return and markExecuted()\n // flush leaves the job as 'paid' - recovery will re-execute. Skills must be idempotent\n // or tolerant of re-execution.\n this.ledger.markExecuted(job.jobId, output.data);\n log(`[${job.jobId.slice(0, 8)}] Skill completed, delivering result`);\n\n // ── Step 6: Deliver result ──\n const eventId = await this.transport.deliverResult(job, output.data, netAmount);\n this.ledger.markDelivered(job.jobId);\n\n log(`[${job.jobId.slice(0, 8)}] Delivered: ${eventId.slice(0, 16)}...`);\n this.callbacks.onJobCompleted?.(job.jobId, output.data);\n }\n\n /**\n * Collect payment for a job. Creates payment request, sends PaymentRequired feedback,\n * polls for on-chain confirmation. Aborts if signal fires.\n */\n private async collectPayment(\n job: IncomingJob,\n jobPrice: number,\n signal?: AbortSignal,\n ): Promise<{ netAmount: number; paymentRequest: string }> {\n const log = this.callbacks.onLog ?? console.log;\n\n if (!this.config.solanaAddress) {\n throw new Error('Solana address not configured');\n }\n\n // Create payment request with protocol fee\n const request = payment.createPaymentRequest(\n this.config.solanaAddress,\n jobPrice,\n this.config.paymentTimeoutSecs,\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice);\n const netAmount = jobPrice - fee;\n\n log(`[${job.jobId.slice(0, 8)}] Payment required: ${jobPrice} lamports (fee: ${fee})`);\n\n // Store payment request reference early for crash recovery\n this.ledger.updatePayment(job.jobId, undefined, requestJson);\n\n // Send PaymentRequired feedback to customer\n await this.transport.sendFeedback(job, {\n type: 'payment-required',\n amount: jobPrice,\n paymentRequest: requestJson,\n chain: 'solana',\n });\n\n // Verify payment on-chain (SDK defaults: 15 retries, 2s interval = 30s window)\n // disableRetryOnRateLimit: prevent @solana/web3.js from doing 5 internal retries per attempt\n const connection = new Connection(getRpcUrl(this.config.network), {\n disableRetryOnRateLimit: true,\n });\n\n // Wrap with abort signal since SDK doesn't accept one natively\n let result: { verified: boolean };\n if (signal) {\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n };\n if (signal.aborted) {\n abortHandler();\n return;\n }\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n try {\n result = await Promise.race([payment.verifyPayment(connection, request), abortPromise]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(connection, request);\n }\n\n if (result.verified) {\n return { netAmount, paymentRequest: requestJson };\n }\n\n // Timeout - customer may have paid on-chain but verification failed\n log(\n `[${job.jobId.slice(0, 8)}] WARNING: Payment verification timed out. ` +\n `Customer may have paid on-chain. Check address ${this.config.solanaAddress} manually.`,\n );\n await this.transport\n .sendFeedback(job, { type: 'error', message: 'payment timeout' })\n .catch(() => {});\n throw new Error('Payment timeout');\n }\n\n private async recoverPendingJobs(): Promise<void> {\n const pending = this.ledger.pendingJobs().filter((e) => !this.inFlight.has(e.job_id));\n if (pending.length === 0) {\n return;\n }\n\n const log = this.callbacks.onLog ?? console.log;\n log(`Recovering ${pending.length} pending jobs...`);\n\n for (const entry of pending) {\n if (entry.retry_count >= this.config.recoveryMaxRetries) {\n this.ledger.markFailed(entry.job_id);\n // Notify customer of permanent failure\n if (entry.raw_event_json) {\n try {\n const rawEvent = JSON.parse(entry.raw_event_json);\n await this.transport\n .sendFeedback(\n {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n },\n { type: 'error', message: 'Job permanently failed after maximum retries' },\n )\n .catch(() => {});\n } catch {\n /* best effort */\n }\n }\n continue;\n }\n\n if (!entry.raw_event_json) {\n continue;\n }\n\n // Respect queue limit for recovery jobs too\n if (this.pending >= this.maxQueueSize) {\n break;\n }\n\n // Route through p-limit to respect maxConcurrentJobs\n this.inFlight.add(entry.job_id);\n this.pending++;\n this.limit(async () => {\n try {\n await this.recoverSingleJob(entry, log);\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: failed: ${e.message}`);\n } finally {\n this.inFlight.delete(entry.job_id);\n this.pending--;\n }\n });\n }\n }\n\n private async recoverSingleJob(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n log: (msg: string) => void,\n ): Promise<void> {\n const recoveryAbort = new AbortController();\n this.jobAbortControllers.add(recoveryAbort);\n const timeout = setTimeout(() => recoveryAbort.abort(), TOTAL_JOB_TIMEOUT_MS);\n\n try {\n this.ledger.incrementRetry(entry.job_id);\n const rawEvent = JSON.parse(entry.raw_event_json!);\n const fakeJob: IncomingJob = {\n jobId: entry.job_id,\n input: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n customerId: entry.customer_id,\n encrypted: false,\n rawEvent,\n };\n\n if (entry.status === 'executed' && entry.result !== undefined) {\n // Re-deliver only\n await this.transport.deliverResult(fakeJob, entry.result, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-delivered`);\n } else if (entry.status === 'paid') {\n const skill = this.skills.route(entry.tags);\n if (!skill) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: no skill for tags, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n\n // Re-verify payment if reference was stored but confirmation lost to crash\n if (skill.priceLamports > 0 && !entry.net_amount) {\n if (entry.payment_request) {\n const verified = await this.reVerifyPayment(\n entry,\n skill.priceLamports,\n log,\n recoveryAbort.signal,\n );\n if (!verified) {\n this.ledger.markFailed(entry.job_id);\n return;\n }\n } else {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not confirmed, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n }\n\n const output = await skill.execute(\n {\n data: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n jobId: entry.job_id,\n },\n { ...this.skillCtx, signal: recoveryAbort.signal },\n );\n\n this.ledger.markExecuted(entry.job_id, output.data);\n await this.transport.deliverResult(fakeJob, output.data, entry.net_amount);\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-executed and delivered`);\n }\n } finally {\n clearTimeout(timeout);\n this.jobAbortControllers.delete(recoveryAbort);\n }\n }\n\n /**\n * Re-verify an on-chain payment during crash recovery.\n *\n * Limitation: Solana transaction data expires after ~2-3 days (recent blockhash window).\n * If the agent was down longer, a confirmed payment may not be found on-chain and the\n * job will be marked failed. For mainnet: use monitoring, avoid extended downtime, or\n * configure an archive RPC via SOLANA_RPC_URL.\n */\n private async reVerifyPayment(\n entry: ReturnType<JobLedger['pendingJobs']>[number],\n priceLamports: number,\n log: (msg: string) => void,\n signal?: AbortSignal,\n ): Promise<boolean> {\n try {\n const request = JSON.parse(entry.payment_request!);\n const connection = new Connection(getRpcUrl(this.config.network), {\n disableRetryOnRateLimit: true,\n });\n\n let result: { verified: boolean };\n if (signal) {\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n };\n if (signal.aborted) {\n abortHandler();\n return;\n }\n signal.addEventListener('abort', abortHandler, { once: true });\n });\n try {\n result = await Promise.race([payment.verifyPayment(connection, request), abortPromise]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(connection, request);\n }\n\n if (result.verified) {\n const fee = calculateProtocolFee(priceLamports);\n const netAmount = priceLamports - fee;\n this.ledger.updatePayment(entry.job_id, netAmount, entry.payment_request);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verified (${netAmount} lamports)`);\n return true;\n }\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment not found on-chain, marking failed`);\n return false;\n } catch (e: any) {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: payment re-verification error: ${e.message}`);\n return false;\n }\n }\n}\n","/**\n * Skill interface and registry.\n */\n\nexport interface SkillInput {\n data: string;\n inputType: string;\n tags: string[];\n jobId: string;\n}\n\nexport interface SkillOutput {\n data: string;\n outputMime?: string;\n}\n\nexport interface SkillContext {\n llm?: LlmClient;\n agentName: string;\n agentDescription: string;\n signal?: AbortSignal;\n}\n\nexport interface LlmClient {\n complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string>;\n completeWithTools(\n systemPrompt: string,\n messages: any[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult>;\n /** Format tool results into provider-specific messages (Anthropic vs OpenAI). */\n formatToolResultMessages(results: ToolResult[]): any[];\n}\n\nexport interface ToolDef {\n name: string;\n description: string;\n parameters: Array<{ name: string; description: string; required: boolean }>;\n}\n\nexport type CompletionResult =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; calls: ToolCall[]; assistantMessage: any };\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, any>;\n}\n\n/** Provider-agnostic tool result passed from ScriptSkill to LlmClient. */\nexport interface ToolResult {\n callId: string;\n content: string;\n}\n\n/**\n * A skill that can be executed by the agent runtime.\n *\n * Skills should be idempotent or tolerant of re-execution: if the agent crashes\n * after execute() returns but before the result is persisted, recovery will\n * re-execute the skill with the same input (at-least-once delivery).\n */\nexport interface Skill {\n name: string;\n description: string;\n capabilities: string[];\n /** Price in lamports (0 = free). Converted from SOL in SKILL.md. */\n priceLamports: number;\n /** Hero image URL. */\n image?: string;\n /** Local file path for hero image (uploaded on first start). */\n imageFile?: string;\n execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput>;\n}\n\nexport class SkillRegistry {\n private skills: Skill[] = [];\n private defaultIndex: number | null = null;\n\n register(skill: Skill): void {\n if (this.defaultIndex === null) {\n this.defaultIndex = this.skills.length;\n }\n this.skills.push(skill);\n }\n\n route(tags: string[]): Skill | null {\n // Try to match by capability tags\n for (const skill of this.skills) {\n for (const tag of tags) {\n if (skill.capabilities.some((cap) => cap === tag)) {\n return skill;\n }\n }\n }\n // Fall back to default\n return this.defaultIndex !== null ? this.skills[this.defaultIndex]! : null;\n }\n\n allCapabilities(): string[] {\n return this.skills.flatMap((s) => s.capabilities);\n }\n\n isEmpty(): boolean {\n return this.skills.length === 0;\n }\n\n all(): Skill[] {\n return this.skills;\n }\n}\n","/**\n * ScriptSkill - LLM orchestrator with tool-use via external scripts.\n */\nimport { spawn } from 'node:child_process';\nimport { StringDecoder } from 'node:string_decoder';\nimport type {\n Skill,\n SkillInput,\n SkillOutput,\n SkillContext,\n ToolDef,\n ToolCall,\n ToolResult,\n} from './index.js';\n\nconst MAX_TOOL_OUTPUT = 1_000_000; // 1MB limit per tool invocation\n\ninterface SkillToolDef {\n name: string;\n description: string;\n command: string[];\n parameters?: Array<{ name: string; description: string; required?: boolean }>;\n}\n\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceLamports: number;\n image?: string;\n imageFile?: string;\n private skillDir: string;\n private systemPrompt: string;\n private tools: SkillToolDef[];\n private maxToolRounds: number;\n\n constructor(\n name: string,\n description: string,\n capabilities: string[],\n priceLamports: number,\n image: string | undefined,\n imageFile: string | undefined,\n skillDir: string,\n systemPrompt: string,\n tools: SkillToolDef[],\n maxToolRounds: number,\n ) {\n this.name = name;\n this.description = description;\n this.capabilities = capabilities;\n this.priceLamports = priceLamports;\n this.image = image;\n this.imageFile = imageFile;\n this.skillDir = skillDir;\n this.systemPrompt = systemPrompt;\n this.tools = tools;\n this.maxToolRounds = maxToolRounds;\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n if (!ctx.llm) {\n throw new Error('LLM client not configured');\n }\n\n // No tools: simple completion\n if (this.tools.length === 0) {\n const result = await ctx.llm.complete(this.systemPrompt, input.data, ctx.signal);\n return { data: result };\n }\n\n // Tool-use loop\n const toolDefs: ToolDef[] = this.tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: (t.parameters ?? []).map((p) => ({\n name: p.name,\n description: p.description,\n required: p.required ?? true,\n })),\n }));\n\n const messages: any[] = [{ role: 'user', content: input.data }];\n\n for (let round = 0; round < this.maxToolRounds; round++) {\n if (ctx.signal?.aborted) {\n throw new Error('Job aborted');\n }\n const result = await ctx.llm.completeWithTools(\n this.systemPrompt,\n messages,\n toolDefs,\n ctx.signal,\n );\n\n if (result.type === 'text') {\n return { data: result.text };\n }\n\n // Process tool calls\n messages.push(result.assistantMessage);\n\n const toolResults: ToolResult[] = [];\n for (const call of result.calls) {\n const toolDef = this.tools.find((t) => t.name === call.name);\n if (!toolDef) {\n toolResults.push({\n callId: call.id,\n content: `Error: unknown tool \"${call.name}\"`,\n });\n continue;\n }\n\n const output = await this.runTool(toolDef, call, ctx.signal);\n toolResults.push({ callId: call.id, content: output });\n }\n\n messages.push(...ctx.llm!.formatToolResultMessages(toolResults));\n }\n\n throw new Error(`Max tool rounds (${this.maxToolRounds}) exceeded`);\n }\n\n private runTool(toolDef: SkillToolDef, call: ToolCall, signal?: AbortSignal): Promise<string> {\n return new Promise((resolve, _reject) => {\n const args = [...toolDef.command];\n const cmd = args.shift()!;\n\n // Add parameters as arguments\n const params = toolDef.parameters ?? [];\n for (const param of params) {\n const value = call.arguments[param.name];\n if (value !== undefined) {\n if (param.required && params.indexOf(param) === 0) {\n // First required param as positional\n args.push(String(value));\n } else {\n args.push(`--${param.name}`, String(value));\n }\n }\n }\n\n const child = spawn(cmd, args, {\n cwd: this.skillDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: 60_000,\n killSignal: 'SIGKILL',\n signal,\n });\n\n let stdout = '';\n let stderr = '';\n const stdoutDecoder = new StringDecoder('utf8');\n const stderrDecoder = new StringDecoder('utf8');\n\n child.stdout.on('data', (data: Buffer) => {\n if (stdout.length < MAX_TOOL_OUTPUT) {\n stdout += stdoutDecoder.write(data);\n if (stdout.length > MAX_TOOL_OUTPUT) {\n stdout = stdout.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n child.stderr.on('data', (data: Buffer) => {\n if (stderr.length < MAX_TOOL_OUTPUT) {\n stderr += stderrDecoder.write(data);\n if (stderr.length > MAX_TOOL_OUTPUT) {\n stderr = stderr.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n } else {\n resolve(`Error (exit ${code}): ${stderr.trim() || stdout.trim()}`);\n }\n });\n\n child.on('error', (err) => {\n resolve(`Error: ${err.message}`);\n });\n });\n }\n}\n","/**\n * Load skills from SKILL.md files in a directory.\n * Frontmatter uses YAML (Agent Skills standard).\n */\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport YAML from 'yaml';\nimport { ScriptSkill } from './script-skill.js';\nimport type { Skill } from './index.js';\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\n/** Convert SOL (number) to lamports (integer). */\nfunction solToLamports(sol: number): number {\n if (!Number.isFinite(sol) || sol < 0) {\n return 0;\n }\n return Math.round(sol * LAMPORTS_PER_SOL);\n}\n\ninterface SkillToolParam {\n name: string;\n description: string;\n required?: boolean;\n}\n\ninterface SkillToolDef {\n name: string;\n description: string;\n command: string[];\n parameters?: SkillToolParam[];\n}\n\ninterface SkillFrontmatter {\n name: string;\n description: string;\n capabilities: string[];\n /** Price in SOL (e.g. 0.01). Converted to lamports internally. Default: 0 (free). */\n price?: number;\n /** Hero image URL (takes priority over image_file). */\n image?: string;\n /** Local file path for hero image. Uploaded on first start, URL written back to image. */\n image_file?: string;\n tools?: SkillToolDef[];\n max_tool_rounds?: number;\n}\n\n/** Parse a SKILL.md file into frontmatter + system prompt. */\nfunction parseSkillMd(content: string): { frontmatter: SkillFrontmatter; systemPrompt: string } {\n const lines = content.split('\\n');\n let start = -1;\n let end = -1;\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i]!.trim() === '---') {\n if (start === -1) {\n start = i;\n } else {\n end = i;\n break;\n }\n }\n }\n\n if (start === -1 || end === -1) {\n throw new Error('SKILL.md must have YAML frontmatter between --- delimiters');\n }\n\n const yamlStr = lines.slice(start + 1, end).join('\\n');\n const frontmatter = YAML.parse(yamlStr) as SkillFrontmatter;\n\n // W3: Validate required fields\n if (!frontmatter.name || typeof frontmatter.name !== 'string') {\n throw new Error('SKILL.md: missing or invalid \"name\" field');\n }\n if (!frontmatter.description || typeof frontmatter.description !== 'string') {\n throw new Error('SKILL.md: missing or invalid \"description\" field');\n }\n if (!Array.isArray(frontmatter.capabilities) || frontmatter.capabilities.length === 0) {\n throw new Error('SKILL.md: \"capabilities\" must be a non-empty array');\n }\n\n const systemPrompt = lines\n .slice(end + 1)\n .join('\\n')\n .trim();\n\n return { frontmatter, systemPrompt };\n}\n\n/** Load all skills from subdirectories of the given path. */\nexport function loadSkillsFromDir(skillsDir: string): Skill[] {\n const skills: Skill[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch {\n return skills;\n }\n\n for (const entry of entries) {\n const entryPath = join(skillsDir, entry);\n try {\n if (!statSync(entryPath).isDirectory()) {\n continue;\n }\n } catch {\n continue;\n }\n\n const skillMdPath = join(entryPath, 'SKILL.md');\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter, systemPrompt } = parseSkillMd(content);\n\n skills.push(\n new ScriptSkill(\n frontmatter.name,\n frontmatter.description,\n frontmatter.capabilities,\n solToLamports(frontmatter.price ?? 0),\n frontmatter.image,\n frontmatter.image_file,\n entryPath,\n systemPrompt,\n frontmatter.tools ?? [],\n frontmatter.max_tool_rounds ?? 10,\n ),\n );\n } catch (e: any) {\n // W5: Log skill load errors instead of silently skipping\n console.warn(` ! Skipping skill \"${entry}\": ${e?.message ?? 'unknown error'}`);\n }\n }\n\n return skills;\n}\n","/**\n * NostrTransport - listens for targeted jobs on Nostr relays, delivers results.\n * Handles NIP-44 decryption, dedup, and retried delivery.\n */\nimport { BoundedSet, jobRequestKind } from '@elisym/sdk';\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport type { Event } from 'nostr-tools';\n\nexport interface IncomingJob {\n jobId: string;\n input: string;\n inputType: string;\n tags: string[];\n customerId: string;\n bid?: number;\n encrypted: boolean;\n rawEvent: Event;\n}\n\nexport type JobFeedbackStatus =\n | { type: 'payment-required'; amount: number; paymentRequest: string; chain: string }\n | { type: 'processing' }\n | { type: 'error'; message: string };\n\nfunction isEncrypted(event: Event): boolean {\n return event.tags.some((t) => t[0] === 'encrypted' && t[1] === 'nip44');\n}\n\nconst HEALTH_CHECK_IDLE_MS = 30 * 60 * 1000; // 30 minutes\n\nexport class NostrTransport {\n private sub: SubCloser | null = null;\n private seenIds = new BoundedSet<string>(10_000);\n private lastEventAt = Date.now();\n\n constructor(\n private client: ElisymClient,\n private identity: ElisymIdentity,\n private kindOffsets: number[],\n ) {}\n\n /** Start listening for targeted job requests. Decrypts NIP-44 content. */\n start(onJob: (job: IncomingJob) => void): void {\n const kinds = this.kindOffsets.map(jobRequestKind);\n\n this.sub = this.client.marketplace.subscribeToJobRequests(\n this.identity,\n kinds,\n (event: Event) => {\n this.lastEventAt = Date.now();\n\n // Dedup via BoundedSet\n if (this.seenIds.has(event.id)) {\n return;\n }\n this.seenIds.add(event.id);\n\n // Must have elisym tag\n const hasElisym = event.tags.some((t) => t[0] === 't' && t[1] === 'elisym');\n if (!hasElisym) {\n return;\n }\n\n // Extract tags\n const tags = event.tags.filter((t) => t[0] === 't').map((t) => t[1]!);\n const bidTag = event.tags.find((t) => t[0] === 'bid');\n const encrypted = isEncrypted(event);\n\n // SDK already decrypts NIP-44 content in subscribeToJobRequests\n const iTag = event.tags.find((t) => t[0] === 'i');\n let inputType = 'text';\n if (iTag?.[2]) {\n inputType = iTag[2];\n }\n const input = encrypted ? event.content : (iTag?.[1] ?? event.content);\n\n onJob({\n jobId: event.id,\n input,\n inputType,\n tags,\n customerId: event.pubkey,\n bid: bidTag?.[1] ? parseInt(bidTag[1], 10) : undefined,\n encrypted,\n rawEvent: event,\n });\n },\n );\n }\n\n /** Send job feedback to customer. */\n async sendFeedback(job: IncomingJob, status: JobFeedbackStatus): Promise<void> {\n if (status.type === 'payment-required') {\n await this.client.marketplace.submitPaymentRequiredFeedback(\n this.identity,\n job.rawEvent,\n status.amount,\n status.paymentRequest,\n );\n } else if (status.type === 'processing') {\n await this.client.marketplace.submitProcessingFeedback(this.identity, job.rawEvent);\n } else if (status.type === 'error') {\n await this.client.marketplace.submitErrorFeedback(\n this.identity,\n job.rawEvent,\n status.message,\n );\n }\n }\n\n /** Deliver result to customer. Retries with exponential backoff via SDK. */\n async deliverResult(\n job: IncomingJob,\n content: string,\n amount?: number,\n retries = 3,\n ): Promise<string> {\n return this.client.marketplace.submitJobResultWithRetry(\n this.identity,\n job.rawEvent,\n content,\n amount,\n retries,\n );\n }\n\n /** Returns true if an event was received within the given idle window. */\n isHealthy(maxIdleMs = HEALTH_CHECK_IDLE_MS): boolean {\n return Date.now() - this.lastEventAt < maxIdleMs;\n }\n\n stop(): void {\n this.sub?.close();\n this.sub = null;\n }\n}\n","/**\n * Wallet command - show balance.\n */\nimport { formatSol } from '@elisym/sdk';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport { loadConfig, listAgents } from '../config.js';\nimport { getRpcUrl } from '../helpers.js';\n\nexport async function cmdWallet(name: string | undefined): Promise<void> {\n if (!name) {\n const agents = listAgents();\n if (agents.length === 0) {\n console.error('No agents found.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents,\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const config = loadConfig(name!, passphrase);\n\n const solPayment = config.payments?.find((p) => p.chain === 'solana');\n if (!solPayment?.address) {\n console.error('Solana address not configured for this agent.');\n process.exit(1);\n }\n\n const network = solPayment.network ?? 'devnet';\n const rpcUrl = getRpcUrl(network);\n const connection = new Connection(rpcUrl);\n const pubkey = new PublicKey(solPayment.address);\n const balance = await connection.getBalance(pubkey);\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` Balance: ${formatSol(balance)} (${balance} lamports)\\n`);\n}\n","/**\n * single source of truth for the package version. `index.ts` surfaces this string\n * via `commander`'s `--version`, so we read it from `package.json` at module load\n * instead of hardcoding a literal that can drift apart from the published version.\n *\n * Mirrors the same approach used in `@elisym/mcp` (`packages/mcp/src/utils.ts`).\n */\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction readPackageVersion(): string {\n try {\n // dist/index.js -> ../package.json (npm always ships package.json at the package root)\n const here = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf-8')) as {\n version: string;\n };\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nexport const PACKAGE_VERSION: string = readPackageVersion();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elisym/cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "CLI agent runner for elisym - provider mode, skills, crash recovery",
5
5
  "keywords": [
6
6
  "ai-agents",