@elisym/cli 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +12 -30
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -214,11 +214,7 @@ async function cmdInit() {
|
|
|
214
214
|
type: "list",
|
|
215
215
|
name: "network",
|
|
216
216
|
message: "Solana network:",
|
|
217
|
-
choices: [
|
|
218
|
-
{ name: "devnet", value: "devnet" },
|
|
219
|
-
{ name: "testnet", value: "testnet" },
|
|
220
|
-
{ name: "mainnet", value: "mainnet" }
|
|
221
|
-
],
|
|
217
|
+
choices: [{ name: "devnet", value: "devnet" }],
|
|
222
218
|
default: "devnet"
|
|
223
219
|
}
|
|
224
220
|
]);
|
|
@@ -456,7 +452,7 @@ async function cmdProfile(name) {
|
|
|
456
452
|
type: "list",
|
|
457
453
|
name: "network",
|
|
458
454
|
message: "Network:",
|
|
459
|
-
choices: ["devnet"
|
|
455
|
+
choices: ["devnet"],
|
|
460
456
|
default: currentNetwork
|
|
461
457
|
}
|
|
462
458
|
]);
|
|
@@ -540,19 +536,12 @@ var WATCHDOG_PROBE_INTERVAL_MS = 5 * 60 * 1e3;
|
|
|
540
536
|
var WATCHDOG_PROBE_TIMEOUT_MS = 1e4;
|
|
541
537
|
var WATCHDOG_SELF_PING_INTERVAL_MS = 10 * 60 * 1e3;
|
|
542
538
|
var WATCHDOG_SELF_PING_TIMEOUT_MS = 15e3;
|
|
543
|
-
function getRpcUrl(
|
|
539
|
+
function getRpcUrl(_network) {
|
|
544
540
|
const envUrl = process.env.SOLANA_RPC_URL;
|
|
545
541
|
if (envUrl) {
|
|
546
542
|
return envUrl;
|
|
547
543
|
}
|
|
548
|
-
|
|
549
|
-
case "mainnet":
|
|
550
|
-
return "https://api.mainnet-beta.solana.com";
|
|
551
|
-
case "testnet":
|
|
552
|
-
return "https://api.testnet.solana.com";
|
|
553
|
-
default:
|
|
554
|
-
return "https://api.devnet.solana.com";
|
|
555
|
-
}
|
|
544
|
+
return "https://api.devnet.solana.com";
|
|
556
545
|
}
|
|
557
546
|
var VALID_TRANSITIONS = {
|
|
558
547
|
paid: ["executed", "failed"],
|
|
@@ -1000,8 +989,12 @@ var AgentRuntime = class {
|
|
|
1000
989
|
globalJobs = [];
|
|
1001
990
|
/** Fetch on-chain protocol config (fee, treasury). Always fetches fresh to avoid stale treasury. */
|
|
1002
991
|
async fetchProtocolConfig() {
|
|
1003
|
-
|
|
1004
|
-
|
|
992
|
+
if (this.config.network !== "devnet") {
|
|
993
|
+
throw new Error(
|
|
994
|
+
`Network "${this.config.network}" is not supported. Only "devnet" is available until the on-chain protocol program is deployed on mainnet.`
|
|
995
|
+
);
|
|
996
|
+
}
|
|
997
|
+
const programId = getProtocolProgramId("devnet");
|
|
1005
998
|
const rpc = createSolanaRpc(getRpcUrl(this.config.network));
|
|
1006
999
|
const config = await getProtocolConfig(rpc, programId, { forceRefresh: true });
|
|
1007
1000
|
return { feeBps: config.feeBps, treasury: config.treasury };
|
|
@@ -1921,18 +1914,7 @@ async function cmdStart(name) {
|
|
|
1921
1914
|
}
|
|
1922
1915
|
console.log(` Balance ${formatSol(balance)} (${balance} lamports)`);
|
|
1923
1916
|
if (balance === 0) {
|
|
1924
|
-
|
|
1925
|
-
console.log(
|
|
1926
|
-
" ! Warning: wallet is empty. First incoming payment needs rent-exempt SOL (~0.00089 SOL)."
|
|
1927
|
-
);
|
|
1928
|
-
} else {
|
|
1929
|
-
console.log(" ! Wallet is empty. Get devnet SOL: https://faucet.solana.com");
|
|
1930
|
-
}
|
|
1931
|
-
}
|
|
1932
|
-
if (walletNetwork === "mainnet" && !process.env.SOLANA_RPC_URL) {
|
|
1933
|
-
console.log(
|
|
1934
|
-
" ! Warning: using public Solana RPC for mainnet. Set SOLANA_RPC_URL for reliable operation."
|
|
1935
|
-
);
|
|
1917
|
+
console.log(" ! Wallet is empty. Get devnet SOL: https://faucet.solana.com");
|
|
1936
1918
|
}
|
|
1937
1919
|
console.log();
|
|
1938
1920
|
} catch (e) {
|
|
@@ -2184,7 +2166,7 @@ async function cmdWallet(name) {
|
|
|
2184
2166
|
process.exit(1);
|
|
2185
2167
|
}
|
|
2186
2168
|
const network = solPayment.network ?? "devnet";
|
|
2187
|
-
const rpcUrl = getRpcUrl(
|
|
2169
|
+
const rpcUrl = getRpcUrl();
|
|
2188
2170
|
const rpc = createSolanaRpc(rpcUrl);
|
|
2189
2171
|
const walletAddress = address(solPayment.address);
|
|
2190
2172
|
const { value: balance } = await rpc.getBalance(walletAddress).send();
|
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/watchdog.ts","../src/commands/wallet.ts","../src/version.ts"],"names":["readFileSync","resolveImage","existsSync","basename","ElisymIdentity","MediaService","isAddress","fetchModels","encryptSecret","join","homedir","mkdirSync","writeFileSync","calculateProtocolFee","readdirSync","statSync","isEncrypted","cmdInit","createSolanaRpc","RELAYS","jobRequestKind","address","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 { isAddress } from '@solana/kit';\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 return isAddress(v) || 'Invalid Solana address';\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 { isAddress } from '@solana/kit';\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 return isAddress(v) || 'Invalid Solana address';\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 { address, createSolanaRpc } from '@solana/kit';\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';\nimport { startWatchdog } from '../watchdog.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 config = await loadConfigWithPrompt(name!);\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 rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solanaAddress);\n const { value: balanceLamports } = await rpc.getBalance(walletAddress).send();\n const balance = Number(balanceLamports);\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: Prepare ping responder (watchdog owns the subscription) --\n const onPing = (senderPubkey: string, nonce: string): void => {\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 logWithIndent = (msg: string): void => console.log(` ${msg}`);\n\n const watchdog = startWatchdog({\n client,\n identity,\n transport,\n onPing,\n log: logWithIndent,\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: logWithIndent,\n onStop: () => {\n watchdog.stop();\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n },\n });\n\n // -- Step 16: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n\nconst MAX_PASSPHRASE_ATTEMPTS = 3;\n\nasync function loadConfigWithPrompt(name: string) {\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n try {\n return loadConfig(name, envPassphrase);\n } catch (e: any) {\n const isEncryptedConfigError = /encrypted but no passphrase/i.test(e?.message ?? '');\n const isWrongPassphrase = /Decryption failed/i.test(e?.message ?? '');\n if (!isEncryptedConfigError && !isWrongPassphrase) {\n throw e;\n }\n if (!process.stdin.isTTY) {\n throw e;\n }\n }\n\n const { default: inquirer } = await import('inquirer');\n for (let attempt = 1; attempt <= MAX_PASSPHRASE_ATTEMPTS; attempt += 1) {\n const { passphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to decrypt secrets:',\n mask: '*',\n },\n ]);\n try {\n return loadConfig(name, passphrase);\n } catch (e: any) {\n if (!/Decryption failed/i.test(e?.message ?? '')) {\n throw e;\n }\n const remaining = MAX_PASSPHRASE_ATTEMPTS - attempt;\n if (remaining === 0) {\n console.error(' ! Wrong passphrase. Aborting.');\n process.exit(1);\n }\n console.error(` ! Wrong passphrase. ${remaining} attempt(s) left.`);\n }\n }\n throw new Error('Unreachable');\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;\nexport const WATCHDOG_PROBE_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nexport const WATCHDOG_PROBE_TIMEOUT_MS = 10_000;\nexport const WATCHDOG_SELF_PING_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nexport const WATCHDOG_SELF_PING_TIMEOUT_MS = 15_000;\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(\n lamports: number,\n accountFunded: boolean,\n feeBps: number,\n): string | null {\n if (lamports === 0) {\n return null;\n }\n const fee = calculateProtocolFee(lamports, feeBps);\n const providerNet = lamports - fee;\n if (!accountFunded && providerNet < RENT_EXEMPT_MINIMUM) {\n const pct = (feeBps / 100).toFixed(2);\n return (\n `Price too low. After ${pct}% 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 {\n SolanaPaymentStrategy,\n calculateProtocolFee,\n getProtocolConfig,\n getProtocolProgramId,\n LIMITS,\n} from '@elisym/sdk';\nimport type { ProtocolConfigInput } from '@elisym/sdk';\nimport { createSolanaRpc } from '@solana/kit';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext } from './skill';\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 * Invoked at the start of `stop()`, before the abort signal fires and before\n * the transport is torn down, so callers can tear down external resources\n * (watchdogs, heartbeats, ping subscriptions) that live outside the runtime.\n *\n * Contract:\n * - Runs exactly once per runtime - `stop()` is idempotent; repeated calls\n * do not re-invoke this callback.\n * - Thrown errors are caught and logged via `onLog`; shutdown continues.\n * - At invocation time the transport and abort controller are still live;\n * callers can safely use transport-backed services for final operations.\n */\n onStop?: () => 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 private stopped = false;\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 /** Fetch on-chain protocol config (fee, treasury). Always fetches fresh to avoid stale treasury. */\n private async fetchProtocolConfig(): Promise<ProtocolConfigInput> {\n const cluster = this.config.network === 'mainnet' ? 'mainnet' : 'devnet';\n const programId = getProtocolProgramId(cluster as 'devnet' | 'mainnet');\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const config = await getProtocolConfig(rpc, programId, { forceRefresh: true });\n return { feeBps: config.feeBps, treasury: config.treasury };\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 if (this.stopped) {\n return;\n }\n this.stopped = true;\n try {\n this.callbacks.onStop?.();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n (this.callbacks.onLog ?? console.log)(`onStop error: ${msg}`);\n }\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 const protocolConfig = await this.fetchProtocolConfig();\n\n // Create payment request with protocol fee\n const request = payment.createPaymentRequest(\n this.config.solanaAddress,\n jobPrice,\n protocolConfig,\n { expirySecs: this.config.paymentTimeoutSecs },\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice, protocolConfig.feeBps);\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 const rpc = createSolanaRpc(getRpcUrl(this.config.network));\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([\n payment.verifyPayment(rpc, request, protocolConfig),\n abortPromise,\n ]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(rpc, request, protocolConfig);\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 rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const protocolConfig = await this.fetchProtocolConfig();\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([\n payment.verifyPayment(rpc, request, protocolConfig),\n abortPromise,\n ]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(rpc, request, protocolConfig);\n }\n\n if (result.verified) {\n const fee = calculateProtocolFee(priceLamports, protocolConfig.feeBps);\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 private onJob: ((job: IncomingJob) => void) | null = null;\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 this.onJob = onJob;\n // Reset idle clock: a fresh subscription hasn't been idle, even if we're\n // restarting after a pool reset where the last event is long in the past.\n this.lastEventAt = Date.now();\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 * Re-create the job subscription using the previously registered callback.\n * Call after `NostrPool.reset()` has torn down the underlying subscriptions.\n * `seenIds` is preserved across restarts (dedup survives reconnect);\n * `lastEventAt` is reset by `start()` so `isHealthy()` does not report\n * stale idleness immediately after a successful recovery.\n */\n restart(): void {\n this.stop();\n if (this.onJob) {\n this.start(this.onJob);\n }\n }\n}\n","/**\n * Watchdog - periodically verifies relay connectivity and subscription liveness,\n * rebuilds the Nostr pool and re-subscribes on failure.\n *\n * Works around a nostr-tools bug where a single WS error sets `skipReconnection=true`\n * and silently kills long-lived subscriptions for the rest of the process\n * (see `NostrPool.reset` in @elisym/sdk).\n *\n * Two independent health checks:\n * - `probe`: cheap `querySync` round-trip against relays.\n * - `self-ping`: full subscribeToPings -> sendPong round-trip via the agent's\n * own identity, catches the case where probe passes (fresh query works) but\n * the live subscription is already dead.\n */\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport {\n WATCHDOG_PROBE_INTERVAL_MS,\n WATCHDOG_PROBE_TIMEOUT_MS,\n WATCHDOG_SELF_PING_INTERVAL_MS,\n WATCHDOG_SELF_PING_TIMEOUT_MS,\n} from './helpers.js';\nimport type { NostrTransport } from './transport/nostr.js';\n\nexport interface WatchdogDeps {\n client: ElisymClient;\n identity: ElisymIdentity;\n transport: NostrTransport;\n onPing: (senderPubkey: string, nonce: string) => void;\n log: (message: string) => void;\n probeIntervalMs?: number;\n probeTimeoutMs?: number;\n selfPingIntervalMs?: number;\n selfPingTimeoutMs?: number;\n}\n\nexport interface Watchdog {\n stop(): void;\n}\n\nexport function startWatchdog(deps: WatchdogDeps): Watchdog {\n const {\n client,\n identity,\n transport,\n onPing,\n log,\n probeIntervalMs = WATCHDOG_PROBE_INTERVAL_MS,\n probeTimeoutMs = WATCHDOG_PROBE_TIMEOUT_MS,\n selfPingIntervalMs = WATCHDOG_SELF_PING_INTERVAL_MS,\n selfPingTimeoutMs = WATCHDOG_SELF_PING_TIMEOUT_MS,\n } = deps;\n\n let pingSub: SubCloser = client.ping.subscribeToPings(identity, onPing);\n let stopped = false;\n let busy = false;\n\n // Must stay synchronous. Each timer callback checks `stopped` AFTER awaiting\n // probe/ping and BEFORE calling this function. As long as this function is\n // synchronous, it runs atomically - stop() cannot interleave between tearing\n // down old subscriptions and creating new ones. Any `await` inside would open\n // a window where stop() sets `stopped=true`, then after the await we resurrect\n // subscriptions and leak them for the rest of the process lifetime.\n const resetPoolAndResubscribe = (): void => {\n transport.stop();\n // pool.reset() also closes pingSub as part of its activeSubscriptions\n // teardown, so an explicit pingSub.close() here would be redundant.\n client.pool.reset();\n pingSub = client.ping.subscribeToPings(identity, onPing);\n transport.restart();\n };\n\n const probeTimer = setInterval(async () => {\n if (stopped || busy) {\n return;\n }\n busy = true;\n try {\n const ok = await client.pool.probe(probeTimeoutMs);\n if (stopped || ok) {\n return;\n }\n log('[watchdog] relay probe failed, resetting pool and re-subscribing');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] probe/reset error: ${errorMessage}`);\n } finally {\n busy = false;\n }\n }, probeIntervalMs);\n\n // CRITICAL: PingService caches \"online\" results for PING_CACHE_TTL_MS (30s in SDK).\n // `selfPingIntervalMs` MUST stay greater than that cache TTL, otherwise pingAgent\n // will keep returning cached `online: true` and the watchdog will never detect a\n // dead subscription. If PING_CACHE_TTL_MS grows in the SDK, bump this interval in\n // lockstep (see helpers.ts: WATCHDOG_SELF_PING_INTERVAL_MS).\n const selfPingTimer = setInterval(async () => {\n if (stopped || busy) {\n return;\n }\n busy = true;\n try {\n const result = await client.ping.pingAgent(identity.publicKey, selfPingTimeoutMs);\n if (stopped || result.online) {\n return;\n }\n log('[watchdog] self-ping failed, resetting pool and re-subscribing');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] self-ping/reset error: ${errorMessage}`);\n } finally {\n busy = false;\n }\n }, selfPingIntervalMs);\n\n return {\n stop(): void {\n if (stopped) {\n return;\n }\n stopped = true;\n clearInterval(probeTimer);\n clearInterval(selfPingTimer);\n pingSub.close();\n },\n };\n}\n","/**\n * Wallet command - show balance.\n */\nimport { formatSol } from '@elisym/sdk';\nimport { address, createSolanaRpc } from '@solana/kit';\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 rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solPayment.address);\n const { value: balance } = await rpc.getBalance(walletAddress).send();\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` Balance: ${formatSol(Number(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"]}
|
|
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/watchdog.ts","../src/commands/wallet.ts","../src/version.ts"],"names":["readFileSync","resolveImage","existsSync","basename","ElisymIdentity","MediaService","isAddress","fetchModels","encryptSecret","join","homedir","mkdirSync","writeFileSync","calculateProtocolFee","readdirSync","statSync","isEncrypted","cmdInit","createSolanaRpc","RELAYS","jobRequestKind","address","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 { isAddress } from '@solana/kit';\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 return isAddress(v) || 'Invalid Solana address';\n },\n },\n ]);\n\n // Step 4b: Solana network - only devnet is supported until the elisym-config\n // program ships on mainnet.\n const { network } = await inquirer.prompt([\n {\n type: 'list',\n name: 'network',\n message: 'Solana network:',\n choices: [{ name: 'devnet', value: 'devnet' }],\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 { isAddress } from '@solana/kit';\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 return isAddress(v) || 'Invalid Solana address';\n },\n },\n {\n type: 'list',\n name: 'network',\n message: 'Network:',\n choices: ['devnet'],\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 { address, createSolanaRpc } from '@solana/kit';\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';\nimport { startWatchdog } from '../watchdog.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 config = await loadConfigWithPrompt(name!);\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 rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solanaAddress);\n const { value: balanceLamports } = await rpc.getBalance(walletAddress).send();\n const balance = Number(balanceLamports);\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 console.log(' ! Wallet is empty. Get devnet SOL: https://faucet.solana.com');\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: Prepare ping responder (watchdog owns the subscription) --\n const onPing = (senderPubkey: string, nonce: string): void => {\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 logWithIndent = (msg: string): void => console.log(` ${msg}`);\n\n const watchdog = startWatchdog({\n client,\n identity,\n transport,\n onPing,\n log: logWithIndent,\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: logWithIndent,\n onStop: () => {\n watchdog.stop();\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n }\n },\n });\n\n // -- Step 16: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n\nconst MAX_PASSPHRASE_ATTEMPTS = 3;\n\nasync function loadConfigWithPrompt(name: string) {\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n try {\n return loadConfig(name, envPassphrase);\n } catch (e: any) {\n const isEncryptedConfigError = /encrypted but no passphrase/i.test(e?.message ?? '');\n const isWrongPassphrase = /Decryption failed/i.test(e?.message ?? '');\n if (!isEncryptedConfigError && !isWrongPassphrase) {\n throw e;\n }\n if (!process.stdin.isTTY) {\n throw e;\n }\n }\n\n const { default: inquirer } = await import('inquirer');\n for (let attempt = 1; attempt <= MAX_PASSPHRASE_ATTEMPTS; attempt += 1) {\n const { passphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'passphrase',\n message: 'Passphrase to decrypt secrets:',\n mask: '*',\n },\n ]);\n try {\n return loadConfig(name, passphrase);\n } catch (e: any) {\n if (!/Decryption failed/i.test(e?.message ?? '')) {\n throw e;\n }\n const remaining = MAX_PASSPHRASE_ATTEMPTS - attempt;\n if (remaining === 0) {\n console.error(' ! Wrong passphrase. Aborting.');\n process.exit(1);\n }\n console.error(` ! Wrong passphrase. ${remaining} attempt(s) left.`);\n }\n }\n throw new Error('Unreachable');\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;\nexport const WATCHDOG_PROBE_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nexport const WATCHDOG_PROBE_TIMEOUT_MS = 10_000;\nexport const WATCHDOG_SELF_PING_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nexport const WATCHDOG_SELF_PING_TIMEOUT_MS = 15_000;\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 // Only devnet is supported until the elisym-config program ships on mainnet.\n return 'https://api.devnet.solana.com';\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(\n lamports: number,\n accountFunded: boolean,\n feeBps: number,\n): string | null {\n if (lamports === 0) {\n return null;\n }\n const fee = calculateProtocolFee(lamports, feeBps);\n const providerNet = lamports - fee;\n if (!accountFunded && providerNet < RENT_EXEMPT_MINIMUM) {\n const pct = (feeBps / 100).toFixed(2);\n return (\n `Price too low. After ${pct}% 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 {\n SolanaPaymentStrategy,\n calculateProtocolFee,\n getProtocolConfig,\n getProtocolProgramId,\n LIMITS,\n} from '@elisym/sdk';\nimport type { ProtocolConfigInput } from '@elisym/sdk';\nimport { createSolanaRpc } from '@solana/kit';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext } from './skill';\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 * Invoked at the start of `stop()`, before the abort signal fires and before\n * the transport is torn down, so callers can tear down external resources\n * (watchdogs, heartbeats, ping subscriptions) that live outside the runtime.\n *\n * Contract:\n * - Runs exactly once per runtime - `stop()` is idempotent; repeated calls\n * do not re-invoke this callback.\n * - Thrown errors are caught and logged via `onLog`; shutdown continues.\n * - At invocation time the transport and abort controller are still live;\n * callers can safely use transport-backed services for final operations.\n */\n onStop?: () => 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 private stopped = false;\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 /** Fetch on-chain protocol config (fee, treasury). Always fetches fresh to avoid stale treasury. */\n private async fetchProtocolConfig(): Promise<ProtocolConfigInput> {\n // Only devnet is supported until the elisym-config program ships on mainnet;\n // agent configs pinned to other networks must be re-initialized explicitly.\n if (this.config.network !== 'devnet') {\n throw new Error(\n `Network \"${this.config.network}\" is not supported. Only \"devnet\" is available ` +\n `until the on-chain protocol program is deployed on mainnet.`,\n );\n }\n const programId = getProtocolProgramId('devnet');\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const config = await getProtocolConfig(rpc, programId, { forceRefresh: true });\n return { feeBps: config.feeBps, treasury: config.treasury };\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 if (this.stopped) {\n return;\n }\n this.stopped = true;\n try {\n this.callbacks.onStop?.();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n (this.callbacks.onLog ?? console.log)(`onStop error: ${msg}`);\n }\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 const protocolConfig = await this.fetchProtocolConfig();\n\n // Create payment request with protocol fee\n const request = payment.createPaymentRequest(\n this.config.solanaAddress,\n jobPrice,\n protocolConfig,\n { expirySecs: this.config.paymentTimeoutSecs },\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice, protocolConfig.feeBps);\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 const rpc = createSolanaRpc(getRpcUrl(this.config.network));\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([\n payment.verifyPayment(rpc, request, protocolConfig),\n abortPromise,\n ]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(rpc, request, protocolConfig);\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 rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const protocolConfig = await this.fetchProtocolConfig();\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([\n payment.verifyPayment(rpc, request, protocolConfig),\n abortPromise,\n ]);\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n }\n } else {\n result = await payment.verifyPayment(rpc, request, protocolConfig);\n }\n\n if (result.verified) {\n const fee = calculateProtocolFee(priceLamports, protocolConfig.feeBps);\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 private onJob: ((job: IncomingJob) => void) | null = null;\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 this.onJob = onJob;\n // Reset idle clock: a fresh subscription hasn't been idle, even if we're\n // restarting after a pool reset where the last event is long in the past.\n this.lastEventAt = Date.now();\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 * Re-create the job subscription using the previously registered callback.\n * Call after `NostrPool.reset()` has torn down the underlying subscriptions.\n * `seenIds` is preserved across restarts (dedup survives reconnect);\n * `lastEventAt` is reset by `start()` so `isHealthy()` does not report\n * stale idleness immediately after a successful recovery.\n */\n restart(): void {\n this.stop();\n if (this.onJob) {\n this.start(this.onJob);\n }\n }\n}\n","/**\n * Watchdog - periodically verifies relay connectivity and subscription liveness,\n * rebuilds the Nostr pool and re-subscribes on failure.\n *\n * Works around a nostr-tools bug where a single WS error sets `skipReconnection=true`\n * and silently kills long-lived subscriptions for the rest of the process\n * (see `NostrPool.reset` in @elisym/sdk).\n *\n * Two independent health checks:\n * - `probe`: cheap `querySync` round-trip against relays.\n * - `self-ping`: full subscribeToPings -> sendPong round-trip via the agent's\n * own identity, catches the case where probe passes (fresh query works) but\n * the live subscription is already dead.\n */\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport {\n WATCHDOG_PROBE_INTERVAL_MS,\n WATCHDOG_PROBE_TIMEOUT_MS,\n WATCHDOG_SELF_PING_INTERVAL_MS,\n WATCHDOG_SELF_PING_TIMEOUT_MS,\n} from './helpers.js';\nimport type { NostrTransport } from './transport/nostr.js';\n\nexport interface WatchdogDeps {\n client: ElisymClient;\n identity: ElisymIdentity;\n transport: NostrTransport;\n onPing: (senderPubkey: string, nonce: string) => void;\n log: (message: string) => void;\n probeIntervalMs?: number;\n probeTimeoutMs?: number;\n selfPingIntervalMs?: number;\n selfPingTimeoutMs?: number;\n}\n\nexport interface Watchdog {\n stop(): void;\n}\n\nexport function startWatchdog(deps: WatchdogDeps): Watchdog {\n const {\n client,\n identity,\n transport,\n onPing,\n log,\n probeIntervalMs = WATCHDOG_PROBE_INTERVAL_MS,\n probeTimeoutMs = WATCHDOG_PROBE_TIMEOUT_MS,\n selfPingIntervalMs = WATCHDOG_SELF_PING_INTERVAL_MS,\n selfPingTimeoutMs = WATCHDOG_SELF_PING_TIMEOUT_MS,\n } = deps;\n\n let pingSub: SubCloser = client.ping.subscribeToPings(identity, onPing);\n let stopped = false;\n let busy = false;\n\n // Must stay synchronous. Each timer callback checks `stopped` AFTER awaiting\n // probe/ping and BEFORE calling this function. As long as this function is\n // synchronous, it runs atomically - stop() cannot interleave between tearing\n // down old subscriptions and creating new ones. Any `await` inside would open\n // a window where stop() sets `stopped=true`, then after the await we resurrect\n // subscriptions and leak them for the rest of the process lifetime.\n const resetPoolAndResubscribe = (): void => {\n transport.stop();\n // pool.reset() also closes pingSub as part of its activeSubscriptions\n // teardown, so an explicit pingSub.close() here would be redundant.\n client.pool.reset();\n pingSub = client.ping.subscribeToPings(identity, onPing);\n transport.restart();\n };\n\n const probeTimer = setInterval(async () => {\n if (stopped || busy) {\n return;\n }\n busy = true;\n try {\n const ok = await client.pool.probe(probeTimeoutMs);\n if (stopped || ok) {\n return;\n }\n log('[watchdog] relay probe failed, resetting pool and re-subscribing');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] probe/reset error: ${errorMessage}`);\n } finally {\n busy = false;\n }\n }, probeIntervalMs);\n\n // CRITICAL: PingService caches \"online\" results for PING_CACHE_TTL_MS (30s in SDK).\n // `selfPingIntervalMs` MUST stay greater than that cache TTL, otherwise pingAgent\n // will keep returning cached `online: true` and the watchdog will never detect a\n // dead subscription. If PING_CACHE_TTL_MS grows in the SDK, bump this interval in\n // lockstep (see helpers.ts: WATCHDOG_SELF_PING_INTERVAL_MS).\n const selfPingTimer = setInterval(async () => {\n if (stopped || busy) {\n return;\n }\n busy = true;\n try {\n const result = await client.ping.pingAgent(identity.publicKey, selfPingTimeoutMs);\n if (stopped || result.online) {\n return;\n }\n log('[watchdog] self-ping failed, resetting pool and re-subscribing');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] self-ping/reset error: ${errorMessage}`);\n } finally {\n busy = false;\n }\n }, selfPingIntervalMs);\n\n return {\n stop(): void {\n if (stopped) {\n return;\n }\n stopped = true;\n clearInterval(probeTimer);\n clearInterval(selfPingTimer);\n pingSub.close();\n },\n };\n}\n","/**\n * Wallet command - show balance.\n */\nimport { formatSol } from '@elisym/sdk';\nimport { address, createSolanaRpc } from '@solana/kit';\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 rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solPayment.address);\n const { value: balance } = await rpc.getBalance(walletAddress).send();\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` Balance: ${formatSol(Number(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.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "CLI agent runner for elisym - provider mode, skills, crash recovery",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"prepublishOnly": "bun run build && node scripts/preflight-publish.mjs"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@elisym/sdk": "~0.4.
|
|
47
|
+
"@elisym/sdk": "~0.4.1",
|
|
48
48
|
"@solana/kit": "~6.8.0",
|
|
49
49
|
"bs58": "~6.0.0",
|
|
50
50
|
"chalk": "~5.6.0",
|