@elisym/cli 0.20.0 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +314 -53
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/llm/providers/http.ts","../src/llm/providers/anthropic.ts","../src/llm/providers/openai-compatible.ts","../src/llm/providers/deepseek.ts","../src/llm/providers/google.ts","../src/llm/providers/openai.ts","../src/llm/providers/xai.ts","../src/llm/registry.ts","../src/llm/index.ts","../src/commands/init.ts","../src/index.ts","../src/commands/profile.ts","../src/diagnostics.ts","../src/helpers.ts","../src/ledger.ts","../src/commands/start.ts","../src/llm/resolve.ts","../src/llm/cache.ts","../src/llm/keys.ts","../src/logging.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/non-llm-skills.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":["resolve","bodyLooksLikeBilling","fetchModels","verifyKey","verifyKeyDeep","DEFAULT_MAX_TOKENS","DEFAULT_MODEL","FALLBACK_MODELS","BILLING_BODY_MARKERS","descriptor","yaml","isAddress","writeSecrets","readFileSync","skillList","calculateProtocolFee","SdkStaticFileSkill","SdkStaticScriptSkill","SdkDynamicScriptSkill","NATIVE_SOL","SdkScriptSkill","createSolanaRpc","address","formatAssetAmount","USDC_SOLANA_DEVNET","join","RELAYS","jobRequestKind","toDTag","listAgents","cmdInit","loadAgent","isEncrypted","formatSol","dirname","ElisymIdentity","nip19"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared HTTP helpers for provider clients: timeout-aware fetch and a\n * retry wrapper that handles 429/5xx with exponential backoff and\n * `Retry-After`. Provider descriptors compose these so each new\n * provider does not re-derive timeout/abort plumbing.\n */\n\n// `ReadableStream` is a runtime global in Bun/Node but is not declared by this\n// package's TS lib; import the typed constructor from node:stream/web.\nimport { ReadableStream } from 'node:stream/web';\n\n// Per-HTTP-request timeout for LLM calls. This is a backstop against a hung\n// socket, not the job's execution ceiling - the per-job AbortSignal (driven by\n// the skill/agent execution budget) is wired into every fetch and is the real\n// limit. Default is generous so one large single-shot generation is not cut\n// off; operators with heavier skills raise it via `ELISYM_LLM_TIMEOUT_MS`. Kept\n// modest enough that `max_tool_rounds x LLM_TIMEOUT_MS` stays a sane implicit\n// ceiling when a skill runs with no execution budget (unlimited).\nconst DEFAULT_LLM_TIMEOUT_MS = 600_000; // 10 minutes\n\nfunction resolveLlmTimeoutMs(): number {\n const raw = process.env.ELISYM_LLM_TIMEOUT_MS;\n if (raw === undefined) {\n return DEFAULT_LLM_TIMEOUT_MS;\n }\n const parsed = Number(raw);\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LLM_TIMEOUT_MS;\n}\n\nconst LLM_TIMEOUT_MS = resolveLlmTimeoutMs();\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = (): void => {\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\nexport async 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 = (): void => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n let toreDown = false;\n const teardown = (): void => {\n if (toreDown) {\n return;\n }\n toreDown = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: controller.signal });\n } catch (error) {\n // Headers phase failed or was aborted - nothing more to cover.\n teardown();\n throw error;\n }\n\n // FIX #31: the timeout/abort wiring (`timer` + parent `signal`) must stay\n // armed across the body read, not be torn down the moment `fetch()` resolves\n // the headers. Callers consume the body right after this returns\n // (`response.json()` / `.text()`), which still streams over the same socket;\n // tearing the wiring down in a `finally` here left that phase unbounded.\n //\n // The returned `Response`'s body methods are read-only, so instead of\n // patching them we tap the underlying body stream and rebuild the `Response`\n // over a stream we control. Teardown runs when the body is fully read\n // (reader reports `done`), when the read errors, or when the consumer\n // cancels the body (`response.body?.cancel()`) - covering every body-phase\n // exit. `controller.signal` still backs the original stream, so a stall\n // mid-body trips `timer`, which aborts the read and rejects the pull. The\n // new `Response` preserves status / statusText / headers and all\n // body-consuming methods, so there are no call-site changes. A 204/no-body\n // response has nothing to wait on, so teardown is immediate.\n const body = response.body;\n // No readable stream to bound (204/no-body, or a non-stream body e.g. in tests):\n // nothing to keep the wiring armed for, so tear down and return as-is.\n if (!body || typeof body.getReader !== 'function') {\n teardown();\n return response;\n }\n\n const reader = body.getReader();\n const tappedStream = new ReadableStream<Uint8Array>({\n async pull(streamController) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n teardown();\n streamController.close();\n return;\n }\n streamController.enqueue(value);\n } catch (error) {\n teardown();\n streamController.error(error);\n }\n },\n cancel(reason) {\n teardown();\n return reader.cancel(reason);\n },\n });\n\n return new Response(tappedStream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n let response: Response;\n try {\n response = await fetchWithTimeout(url, init, signal);\n } catch (error) {\n const name = error instanceof Error ? error.name : '';\n if (attempt >= MAX_RETRIES || name === 'AbortError') {\n throw error;\n }\n await sleepWithSignal(Math.min(1000 * 2 ** attempt, 8000), signal);\n continue;\n }\n if (response.ok || attempt >= MAX_RETRIES || !RETRYABLE_STATUSES.has(response.status)) {\n return response;\n }\n const retryAfter = response.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 response.body?.cancel().catch(() => undefined);\n await sleepWithSignal(delay, signal);\n }\n}\n","/**\n * Anthropic provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. Imports from the registry\n * are type-only to keep the dependency edge one-way.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'claude-haiku-4-5-20251001';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['claude-sonnet-4-6', 'claude-haiku-4-5-20251001', 'claude-opus-4-6'];\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n}\n\ninterface AnthropicResponse {\n content?: AnthropicContentBlock[];\n usage?: AnthropicUsage;\n}\n\ninterface AnthropicClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport class AnthropicClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: AnthropicClientConfig) {}\n\n private logTokens(usage: AnthropicUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.input_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = 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 if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const textBlock = data.content?.find((block) => block.type === 'text');\n return textBlock?.text ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const anthropicTools = tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n }));\n\n const response = 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 if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const content = data.content ?? [];\n\n const toolUses = content.filter((block) => block.type === 'tool_use');\n if (toolUses.length > 0) {\n const calls: ToolCall[] = toolUses.map((block) => ({\n id: block.id ?? '',\n name: block.name ?? '',\n arguments: block.input ?? {},\n }));\n return {\n type: 'tool_use',\n calls,\n assistantMessage: { role: 'assistant', content },\n };\n }\n const textBlock = content.find((block) => block.type === 'text');\n return { type: 'text', text: textBlock?.text ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return [\n {\n role: 'user',\n content: results.map((result) => ({\n type: 'tool_result',\n tool_use_id: result.callId,\n content: result.content,\n })),\n },\n ];\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1000',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? []).map((entry) => entry.id).sort();\n return models.length > 0 ? models : FALLBACK_MODELS;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes the messages endpoint with\n * max_tokens=1. Costs a fraction of a cent per probe but distinguishes\n * billing-exhausted accounts from valid ones - `/v1/models` returns 200\n * even when the org has $0 balance.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 1,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const ANTHROPIC_PROVIDER: LlmProviderDescriptor = {\n id: 'anthropic',\n displayName: 'Anthropic (Claude)',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new AnthropicClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n};\n","/**\n * Shared OpenAI-compatible client + descriptor factory.\n *\n * Powers providers that speak the OpenAI Chat Completions wire format\n * (xAI, Google's Gemini compat endpoint, DeepSeek). The native OpenAI\n * descriptor lives in `./openai.ts` and stays separate because it\n * carries OpenAI-specific reasoning-model quirks (`max_completion_tokens`,\n * `developer` role) the others don't need.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { CreateLlmClientConfig, LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_BILLING_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAICompatibleClientConfig {\n apiKey: string;\n baseUrl: string;\n model: string;\n maxTokens: number;\n /** Provider name used in error messages (e.g. \"xAI\", \"Google\", \"DeepSeek\"). */\n providerLabel: string;\n logUsage?: boolean;\n}\n\nexport class OpenAICompatibleClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAICompatibleClientConfig) {}\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/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 max_tokens: this.config.maxTokens,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/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 max_tokens: this.config.maxTokens,\n messages: [{ role: 'system', content: systemPrompt }, ...messages],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nexport interface OpenAICompatibleProviderConfig {\n id: string;\n displayName: string;\n envVar: string;\n /** Base URL up to but not including `/chat/completions` or `/models`, no trailing slash. */\n baseUrl: string;\n defaultModel: string;\n fallbackModels: string[];\n /**\n * Optional transform applied to each `data[].id` returned by `/models`.\n * Returning `null` drops the entry. Use to strip prefixes (Gemini's\n * compat endpoint returns `models/<id>`) or filter non-chat models.\n */\n mapModelId?: (id: string) => string | null;\n /** Extra billing-detection markers concatenated with the shared defaults. */\n extraBillingMarkers?: string[];\n}\n\nexport function createOpenAICompatibleProvider(\n config: OpenAICompatibleProviderConfig,\n): LlmProviderDescriptor {\n const billingMarkers = [...DEFAULT_BILLING_MARKERS, ...(config.extraBillingMarkers ?? [])];\n\n function bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return billingMarkers.some((marker) => lower.includes(marker));\n }\n\n async function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (!response.ok) {\n return config.fallbackModels;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const transformed: string[] = [];\n for (const entry of data.data ?? []) {\n const mapped = config.mapModelId ? config.mapModelId(entry.id) : entry.id;\n if (mapped) {\n transformed.push(mapped);\n }\n }\n transformed.sort();\n return transformed.length > 0 ? transformed : config.fallbackModels;\n } catch {\n return config.fallbackModels;\n }\n }\n\n async function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n async function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n ): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n // Some xAI / DeepSeek model variants are reasoning models that\n // burn output tokens on internal chain-of-thought before any\n // visible reply; with `max_tokens: 1` the API returns HTTP 400\n // and we falsely flip the (provider, model) pair to unhealthy\n // on a valid key. 256 leaves room for the minimum reasoning\n // budget on every current variant; for non-reasoning models\n // the probe still stops at the first natural token, so the\n // extra ceiling does not change the per-probe cost in\n // practice.\n max_tokens: 256,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if ((response.status === 400 || response.status === 429) && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n function createClient(clientConfig: CreateLlmClientConfig): LlmClient {\n return new OpenAICompatibleClient({\n apiKey: clientConfig.apiKey,\n baseUrl: config.baseUrl,\n model: clientConfig.model ?? config.defaultModel,\n maxTokens: clientConfig.maxTokens ?? DEFAULT_MAX_TOKENS,\n providerLabel: config.displayName,\n logUsage: clientConfig.logUsage,\n });\n }\n\n return {\n id: config.id,\n displayName: config.displayName,\n envVar: config.envVar,\n defaultModel: config.defaultModel,\n fallbackModels: config.fallbackModels,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient,\n };\n}\n","/**\n * DeepSeek provider descriptor.\n *\n * DeepSeek's API is OpenAI-compatible at `https://api.deepseek.com/v1`,\n * so this is a thin wrapper around `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'deepseek-chat';\nconst FALLBACK_MODELS = ['deepseek-chat', 'deepseek-reasoner'];\n\nexport const DEEPSEEK_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'deepseek',\n displayName: 'DeepSeek',\n envVar: 'DEEPSEEK_API_KEY',\n baseUrl: 'https://api.deepseek.com/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Google (Gemini) provider descriptor.\n *\n * Uses Google's OpenAI-compatible endpoint at\n * `https://generativelanguage.googleapis.com/v1beta/openai`. The\n * `/models` route returns ids prefixed with `models/`; the model id\n * mapper strips that prefix and drops non-Gemini entries (embeddings,\n * legacy PaLM, etc.) so the picker only shows usable chat models.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'gemini-2.5-flash';\nconst FALLBACK_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.0-flash'];\nconst MODELS_PREFIX = 'models/';\n\nfunction mapGeminiModelId(id: string): string | null {\n const stripped = id.startsWith(MODELS_PREFIX) ? id.slice(MODELS_PREFIX.length) : id;\n return stripped.startsWith('gemini') ? stripped : null;\n}\n\nexport const GOOGLE_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'google',\n displayName: 'Google (Gemini)',\n envVar: 'GEMINI_API_KEY',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n mapModelId: mapGeminiModelId,\n});\n","/**\n * OpenAI provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. The client also handles\n * the reasoning-model quirk (o1/o3/o4 + gpt-5 family use\n * `max_completion_tokens` and `developer` role instead of `max_tokens`\n * and `system`).\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'gpt-4o-mini';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['gpt-4o', 'gpt-4o-mini', 'o3-mini'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport function isOpenAIReasoningModel(model: string): boolean {\n return /^o\\d/.test(model) || /^gpt-5(\\b|[-.])/.test(model);\n}\n\nexport class OpenAIClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAIClientConfig) {}\n\n private isReasoningModel(): boolean {\n return isOpenAIReasoningModel(this.config.model);\n }\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const reasoning = this.isReasoningModel();\n const response = 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 ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const reasoning = this.isReasoningModel();\n const response = 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 ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n ...messages,\n ],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? [])\n .map((entry) => entry.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;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes chat completions with\n * max_tokens=1. Distinguishes billing-exhausted accounts from valid ones,\n * including OpenAI's specific 429 + `insufficient_quota` body shape.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const reasoning = isOpenAIReasoningModel(model);\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n // GPT-5 reasoning models count internal chain-of-thought tokens\n // against `max_completion_tokens`. With a budget of 1 the model\n // exhausts it on reasoning before producing any visible content\n // and the API responds HTTP 400 (\"max_tokens reached\") - which\n // would falsely flip the (provider, model) pair to unhealthy on\n // an otherwise valid key. 256 covers a \".\" prompt's reasoning\n // budget on every current GPT-5 variant we tested with margin;\n // non-reasoning models still take max_tokens: 1 since they emit\n // visible content directly. Probe cost stays sub-cent per\n // startup probe (reasoning tokens are billed at output rates).\n ...(reasoning ? { max_completion_tokens: 256 } : { max_tokens: 1 }),\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 429 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const OPENAI_PROVIDER: LlmProviderDescriptor = {\n id: 'openai',\n displayName: 'OpenAI (GPT)',\n envVar: 'OPENAI_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new OpenAIClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n isReasoningModel: isOpenAIReasoningModel,\n};\n","/**\n * xAI (Grok) provider descriptor.\n *\n * xAI exposes an OpenAI-compatible Chat Completions endpoint at\n * `https://api.x.ai/v1`, so this is a thin wrapper around\n * `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'grok-3-mini';\nconst FALLBACK_MODELS = ['grok-4', 'grok-3', 'grok-3-mini'];\n\nexport const XAI_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'xai',\n displayName: 'xAI (Grok)',\n envVar: 'XAI_API_KEY',\n baseUrl: 'https://api.x.ai/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Pluggable LLM provider registry.\n *\n * Each provider (Anthropic, OpenAI, future Grok/Gemini/...) lives as a\n * `LlmProviderDescriptor` in its own file under `./providers/`. The CLI\n * looks up env-var name, default model, model list, key verification,\n * and client construction through this registry, so adding a provider\n * is one descriptor file plus one registration call below.\n *\n * Builtins are imported statically and registered at module init. The\n * descriptor files reach back to this module only via `import type`, so\n * there is no runtime cycle - registry evaluation completes before any\n * descriptor's runtime body runs.\n */\n\nimport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { ANTHROPIC_PROVIDER } from './providers/anthropic';\nimport { DEEPSEEK_PROVIDER } from './providers/deepseek';\nimport { GOOGLE_PROVIDER } from './providers/google';\nimport { OPENAI_PROVIDER } from './providers/openai';\nimport { XAI_PROVIDER } from './providers/xai';\n\nexport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\n\n/**\n * Config passed to a descriptor's `createClient`. Mirrors the SDK's\n * `LlmClientConfig` minus `provider` (already implied by the descriptor)\n * plus an optional `logUsage` flag the client uses to print token\n * counts to stdout. CLI-internal type so SDK clients (none any more)\n * stay log-free.\n */\nexport interface CreateLlmClientConfig {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n /** Print `[LLM] <model> tokens: in=N out=M (total: in=… out=…)` after each call. */\n logUsage?: boolean;\n}\n\n/**\n * Token usage extracted from a provider's raw response. Reserved for\n * future telemetry hooks; concrete clients log their own usage today.\n */\nexport interface LlmUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport interface LlmProviderDescriptor {\n /** Stable identifier used in elisym.yaml `llm.provider` and SKILL.md `provider:`. */\n id: string;\n /** Human-readable label for interactive prompts. */\n displayName: string;\n /** Operator-facing env var that supplies the API key when no per-agent secret is set. */\n envVar: string;\n /** Default model when neither agent nor skill picks one. */\n defaultModel: string;\n /** Hard-coded fallback list when `fetchModels` cannot reach the provider. */\n fallbackModels: string[];\n /** Pull the live model list from the provider. Returns `fallbackModels` on failure. */\n fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]>;\n /**\n * Lightweight authenticated probe before the agent publishes capabilities.\n * Hits a metadata endpoint (e.g. `/v1/models`) so it does not consume\n * billing credits. Used for UI commands and as a cheap liveness check.\n */\n verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /**\n * Authoritative deep probe that consumes a single token from the\n * provider's billing account. Distinguishes invalid keys, billing/quota\n * exhaustion, and transient unavailability. Used at agent startup,\n * runtime preflight, and the LLM health heartbeat.\n *\n * Caller passes the model the skill will actually use - billing checks\n * are scoped to that model since some orgs gate access per model.\n */\n verifyKeyDeep(apiKey: string, model: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /** Build a fresh `LlmClient` for the given config (apiKey + model + maxTokens + logUsage). */\n createClient(config: CreateLlmClientConfig): LlmClient;\n /** True when the model uses provider-specific reasoning quirks (e.g. OpenAI o1/o3/gpt-5 family). */\n isReasoningModel?(model: string): boolean;\n}\n\nconst REGISTRY = new Map<string, LlmProviderDescriptor>();\n\n/**\n * Register or replace a provider descriptor. Calling twice with the same\n * `id` overwrites the prior entry - useful for tests.\n */\nexport function registerLlmProvider(descriptor: LlmProviderDescriptor): void {\n REGISTRY.set(descriptor.id, descriptor);\n}\n\n/** Look up a provider by id. Returns undefined when not registered. */\nexport function getLlmProvider(id: string): LlmProviderDescriptor | undefined {\n return REGISTRY.get(id);\n}\n\n/** Snapshot of all registered descriptors. Order: registration order. */\nexport function listLlmProviders(): LlmProviderDescriptor[] {\n return Array.from(REGISTRY.values());\n}\n\n/** Snapshot of all registered ids. */\nexport function getRegisteredProviderIds(): string[] {\n return Array.from(REGISTRY.keys());\n}\n\n// Builtin registration. Order here is the registration order seen by\n// `listLlmProviders` and the order interactive prompts will offer.\nregisterLlmProvider(ANTHROPIC_PROVIDER);\nregisterLlmProvider(OPENAI_PROVIDER);\nregisterLlmProvider(XAI_PROVIDER);\nregisterLlmProvider(GOOGLE_PROVIDER);\nregisterLlmProvider(DEEPSEEK_PROVIDER);\n","/**\n * CLI-level LLM facade.\n *\n * The provider registry, descriptors, and concrete client classes\n * (Anthropic, OpenAI) live under `./providers/` + `./registry.ts`.\n * Concrete clients implement `logUsage` themselves (printing token\n * counts to stdout after each API response) - keeping log code in the\n * client lets it read the raw provider response without an extra\n * round-trip. SDK clients no longer exist; CLI is the only consumer.\n *\n * This module exposes:\n * - `createLlmClient(config)`: registry-driven factory\n * - `verifyLlmApiKey(provider, key)`: registry-driven probe\n * - `LlmConfig`, `LlmProvider`, `LlmKeyVerification` shapes\n * - registry surface (`getLlmProvider`, `listLlmProviders`,\n * `getRegisteredProviderIds`, `registerLlmProvider`)\n */\n\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { getLlmProvider, getRegisteredProviderIds, type LlmKeyVerification } from './registry';\n\nexport type { LlmKeyVerification, LlmProviderDescriptor, LlmUsage } from './registry';\nexport {\n getLlmProvider,\n getRegisteredProviderIds,\n listLlmProviders,\n registerLlmProvider,\n} from './registry';\n\nexport type LlmProvider = string;\n\nexport interface LlmConfig {\n provider: LlmProvider;\n apiKey: string;\n model: string;\n maxTokens: number;\n /** Print `[LLM] <model> tokens: in=N out=M ...` after each call. Default: false. */\n logUsage?: boolean;\n}\n\n/**\n * Build an `LlmClient` for the given config. Throws when the provider\n * id is not registered (typically a typo in elisym.yaml or SKILL.md\n * `provider:` override).\n */\nexport function createLlmClient(config: LlmConfig): LlmClient {\n const descriptor = getLlmProvider(config.provider);\n if (!descriptor) {\n const known = getRegisteredProviderIds().join(', ') || '<none>';\n throw new Error(`Unknown LLM provider \"${config.provider}\". Registered: ${known}.`);\n }\n if (!config.apiKey) {\n throw new Error(`${descriptor.envVar} is required for skill runtime`);\n }\n return descriptor.createClient({\n apiKey: config.apiKey,\n model: config.model,\n maxTokens: config.maxTokens,\n logUsage: config.logUsage,\n });\n}\n\n/**\n * Verify that an LLM API key is accepted by the provider before the agent\n * publishes capabilities. Delegates to the descriptor's `verifyKey`.\n *\n * Cheap probe (Anthropic/OpenAI `/v1/models`) - validates the key is\n * accepted but does NOT detect billing exhaustion. Use this for UI\n * commands like `profile` or `init` where biller status is irrelevant;\n * use `verifyLlmApiKeyDeep` for authoritative checks (startup, runtime\n * preflight, heartbeat).\n */\nexport async function verifyLlmApiKey(\n provider: LlmProvider,\n apiKey: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKey(apiKey, signal);\n}\n\n/**\n * Authoritative probe that consumes a single billing token to verify the\n * key is both valid AND has credits available for the requested model.\n * Costs ~$0.00001 on Haiku 4.5; negligible at startup and 5-min\n * heartbeat cadences.\n */\nexport async function verifyLlmApiKeyDeep(\n provider: LlmProvider,\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKeyDeep(apiKey, model, signal);\n}\n","/**\n * Init command - create a new agent.\n *\n * Usage:\n * elisym init [name] Interactive wizard; creates in ~/.elisym/<name>/.\n * elisym init [name] --config <path> Non-interactive; loads YAML template.\n * elisym init [name] --defaults Non-interactive; uses the same defaults the\n * wizard would have suggested (description =\n * \"An elisym AI agent\", default relays, no\n * payments, no LLM, no encryption). Combine with\n * --local / --passphrase to override pieces.\n * elisym init [name] --local Create in project <project>/.elisym/<name>/.\n * elisym init [name] --passphrase <p> Skip passphrase prompt (\"\" = no encryption).\n * elisym init [name] --yes Skip overwrite/shadow confirm prompts.\n */\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { validateAgentName, RELAYS } from '@elisym/sdk';\nimport {\n ElisymYamlSchema,\n createAgentDir,\n resolveInHome,\n resolveInProject,\n writeExampleSkillTemplate,\n writeSecrets,\n writeYamlInitial,\n type AgentSource,\n type ElisymYaml,\n} from '@elisym/sdk/agent-store';\nimport { isAddress } from '@solana/kit';\nimport { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools';\nimport YAML from 'yaml';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport interface InitOptions {\n config?: string;\n defaults?: boolean;\n local?: boolean;\n passphrase?: string;\n yes?: boolean;\n}\n\nfunction buildDefaultYaml(): ElisymYaml {\n return ElisymYamlSchema.parse({\n description: 'An elisym AI agent',\n relays: [...RELAYS],\n payments: [],\n security: {},\n });\n}\n\n/**\n * Delegate to the descriptor's `fetchModels`. Returns `[]` if the\n * provider id is not registered (defensive - in practice the caller\n * only passes ids it pulled from the same registry). Falls back to the\n * descriptor's `fallbackModels` when the live `fetchModels` call throws.\n */\nexport async function fetchModels(provider: string, apiKey: string): Promise<string[]> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n console.warn(` ! Unknown provider \"${provider}\". No models available.`);\n return [];\n }\n try {\n return await descriptor.fetchModels(apiKey);\n } catch (e: any) {\n console.warn(` ! Could not fetch models: ${e.message}. Using defaults.`);\n return descriptor.fallbackModels;\n }\n}\n\nfunction pickTarget(options: InitOptions): AgentSource {\n return options.local ? 'project' : 'home';\n}\n\nexport async function cmdInit(nameArg?: string, options: InitOptions = {}): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n console.log('\\n elisym agent setup\\n');\n\n if (options.config && options.defaults) {\n throw new Error('--config and --defaults are mutually exclusive; pick one.');\n }\n\n // --defaults means \"no prompts\" - imply --yes for shadow/overwrite confirms.\n const skipConfirms = options.yes || options.defaults;\n\n // Step 1: YAML template (optional) - from --config file or --defaults skeleton.\n let template: ElisymYaml | undefined;\n if (options.config) {\n const configPath = resolve(cwd, options.config);\n const raw = readFileSync(configPath, 'utf-8');\n template = ElisymYamlSchema.parse(YAML.parse(raw) ?? {});\n console.log(` Loaded template from ${configPath}\\n`);\n } else if (options.defaults) {\n template = buildDefaultYaml();\n console.log(' Using default skeleton (no LLM, no payments). Edit later via `profile`.\\n');\n }\n\n // Step 2: Agent name (arg > prompt).\n const agentName = await resolveAgentName(nameArg, inquirer);\n\n // Step 3: Shadow / overwrite checks. With --yes, overwrite fails closed\n // (never silently clobber secrets) while shadow / sibling-location prompts\n // take their recommended default.\n const target = pickTarget(options);\n const sameLocation =\n target === 'home' ? resolveInHome(agentName) : resolveInProject(agentName, cwd);\n if (sameLocation) {\n if (skipConfirms) {\n throw new Error(\n `Agent \"${agentName}\" already exists at ${sameLocation}. Refusing to overwrite secrets under --yes/--defaults. Remove the directory first or choose a different name.`,\n );\n }\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: `Agent \"${agentName}\" already exists at ${sameLocation}. Overwrite secrets?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n } else if (target === 'project' && resolveInHome(agentName)) {\n if (!skipConfirms) {\n const { shadow } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shadow',\n message: `A global agent \"${agentName}\" exists in ~/.elisym/${agentName}/. Create a project-local shadow?`,\n default: true,\n },\n ]);\n if (!shadow) {\n console.log('Aborted.');\n return;\n }\n }\n } else if (target === 'home' && resolveInProject(agentName, cwd)) {\n if (!skipConfirms) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message: `A project-local agent \"${agentName}\" exists. Create a global agent with the same name?`,\n default: true,\n },\n ]);\n if (!proceed) {\n console.log('Aborted.');\n return;\n }\n }\n }\n\n // Step 4: Build YAML. If a template was loaded, reuse it; otherwise prompt\n // interactively. promptYaml also returns the API key it collected so we\n // don't re-prompt in Step 5.\n let yaml: ElisymYaml;\n let promptedApiKey: string | undefined;\n if (template) {\n yaml = template;\n } else {\n const result = await promptYaml(inquirer);\n yaml = result.yaml;\n promptedApiKey = result.apiKey;\n }\n\n // Step 5: LLM API key for the default provider (from env, then reuse\n // prompt-collected key, else prompt). Provider labels and env var\n // names come from the descriptor.\n let defaultProviderKey: string | undefined;\n const defaultProviderId = yaml.llm?.provider;\n if (yaml.llm && defaultProviderId) {\n const descriptor = getLlmProvider(defaultProviderId);\n const envKey = descriptor ? process.env[descriptor.envVar] : undefined;\n if (envKey && descriptor) {\n defaultProviderKey = envKey;\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else if (promptedApiKey) {\n defaultProviderKey = promptedApiKey;\n } else {\n const label = descriptor?.displayName ?? defaultProviderId;\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${label} API key:`,\n mask: '*',\n },\n ]);\n defaultProviderKey = apiKey || undefined;\n }\n }\n\n // Step 5b: Optional API keys for OTHER registered providers - used by\n // skills that declare a `provider:` override in their SKILL.md. Skipped\n // when running from a YAML template (non-interactive); operators can\n // supply per-provider keys via env vars or by editing `.secrets.json`.\n const otherProviderKeys = new Map<string, string>();\n if (yaml.llm && !template && defaultProviderId) {\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== defaultProviderId,\n );\n for (const descriptor of otherDescriptors) {\n const otherEnvKey = process.env[descriptor.envVar];\n const { configureOther } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'configureOther',\n message: `Configure ${descriptor.displayName} API key too (for skills that override the default provider)?`,\n default: Boolean(otherEnvKey),\n },\n ]);\n if (!configureOther) {\n continue;\n }\n if (otherEnvKey) {\n otherProviderKeys.set(descriptor.id, otherEnvKey);\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else {\n const { promptedOther } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedOther',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n if (promptedOther) {\n otherProviderKeys.set(descriptor.id, promptedOther);\n }\n }\n }\n }\n\n // Step 6: Passphrase for encrypting secrets. Flag wins over env var wins\n // over interactive prompt. Empty string (\"\") is an explicit opt-out from\n // encryption, distinct from \"flag not provided\". --defaults implies no\n // encryption when neither flag nor env is set.\n let passphrase = '';\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n if (options.passphrase !== undefined) {\n passphrase = options.passphrase;\n } else if (envPassphrase !== undefined) {\n passphrase = envPassphrase;\n } else if (options.defaults) {\n passphrase = '';\n } else {\n const answer = 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 passphrase = answer.passphrase ?? '';\n if (passphrase) {\n const { confirmPassphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'confirmPassphrase',\n message: 'Confirm passphrase:',\n mask: '*',\n validate: (value: string) => value === passphrase || 'Passphrases do not match',\n },\n ]);\n void confirmPassphrase;\n }\n }\n\n // Step 7: Generate Nostr identity.\n const nostrSecretBytes = generateSecretKey();\n const nostrPubkey = getPublicKey(nostrSecretBytes);\n const nostrSecretHex = Buffer.from(nostrSecretBytes).toString('hex');\n\n // Step 8: Create agent directory + write files. Each provider's key\n // lands in `secrets.llm_api_keys[<provider-id>]`; the start-time\n // resolver reads them directly (or falls back to the matching env\n // var via the descriptor).\n const created = await createAgentDir({ target, name: agentName, cwd });\n const collectedKeys = new Map<string, string>(otherProviderKeys);\n if (yaml.llm && defaultProviderKey) {\n collectedKeys.set(yaml.llm.provider, defaultProviderKey);\n }\n const llmApiKeys = Object.fromEntries(collectedKeys);\n await writeYamlInitial(created.dir, yaml);\n await writeExampleSkillTemplate(created.dir);\n await writeSecrets(\n created.dir,\n {\n nostr_secret_key: nostrSecretHex,\n llm_api_keys: Object.keys(llmApiKeys).length > 0 ? llmApiKeys : undefined,\n },\n passphrase || undefined,\n );\n\n const npub = nip19.npubEncode(nostrPubkey);\n console.log(`\\n Agent \"${agentName}\" created (${target}).`);\n console.log(` Location: ${created.dir}`);\n console.log(` Nostr: ${npub}`);\n if (yaml.payments[0]?.address) {\n console.log(` Solana: ${yaml.payments[0].address}`);\n }\n if (passphrase) {\n console.log(' Secrets encrypted with your passphrase.');\n }\n console.log();\n}\n\nasync function resolveAgentName(\n nameArg: string | undefined,\n inquirer: { prompt: any },\n): Promise<string> {\n if (nameArg) {\n validateAgentName(nameArg);\n return nameArg;\n }\n const { inputName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputName',\n message: 'Agent name:',\n validate: (value: string) => {\n try {\n validateAgentName(value);\n return true;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n ]);\n validateAgentName(inputName);\n return inputName;\n}\n\nasync function promptYaml(inquirer: {\n prompt: any;\n}): Promise<{ yaml: ElisymYaml; apiKey?: string }> {\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 const { displayName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'displayName',\n message: 'Display name (optional, for UI):',\n default: '',\n },\n ]);\n\n const { picture } = await inquirer.prompt([\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar file (relative to agent dir, e.g. ./avatar.png) or URL:',\n default: '',\n },\n ]);\n\n const { banner } = await inquirer.prompt([\n {\n type: 'input',\n name: 'banner',\n message: 'Banner file (relative to agent dir, e.g. ./header.png) or URL:',\n default: '',\n },\n ]);\n\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: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n if (solanaAddress) {\n console.log(\n ' The wallet receives every asset on Solana (SOL directly, USDC and other\\n' +\n ' SPL tokens via their ATA). Each skill declares its own price and token\\n' +\n ' in SKILL.md. Fund with SOL via `solana airdrop` or USDC via https://faucet.circle.com.',\n );\n }\n\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n {\n name: 'None (non-LLM agent - static-file / static-script / dynamic-script only)',\n value: 'none',\n },\n ...listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n })),\n ],\n },\n ]);\n\n const baseYaml = {\n display_name: displayName || undefined,\n description,\n picture: picture || undefined,\n banner: banner || undefined,\n relays: [...RELAYS],\n payments: solanaAddress ? [{ chain: 'solana', network: 'devnet', address: solanaAddress }] : [],\n security: {},\n };\n\n if (llmProvider === 'none') {\n const yaml: ElisymYaml = ElisymYamlSchema.parse(baseYaml);\n return { yaml };\n }\n\n const descriptor = getLlmProvider(llmProvider);\n if (!descriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n const envKey = process.env[descriptor.envVar];\n let apiKey: string | undefined = envKey;\n if (!apiKey) {\n const { promptedKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedKey',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n apiKey = promptedKey || undefined;\n }\n\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 const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: 4096,\n },\n ]);\n\n const yaml: ElisymYaml = ElisymYamlSchema.parse({\n ...baseYaml,\n llm: { provider: llmProvider, model, max_tokens: maxTokens },\n });\n // envKey is returned only when the user explicitly typed it (not when\n // pulled from process.env) - the env-var path is handled in cmdInit Step 5.\n return { yaml, apiKey: envKey ? undefined : apiKey };\n}\n","import { ElisymIdentity } from '@elisym/sdk';\nimport { listAgents, loadAgent } from '@elisym/sdk/agent-store';\n/**\n * elisym CLI - agent runner for the elisym network.\n *\n * Commands:\n * elisym init [name] [--config <path>] [--defaults] [--local] Create a new agent\n * elisym start [name] Start agent in provider mode\n * elisym list List all agents\n * elisym profile [name] Edit agent profile\n * elisym wallet [name] Show wallet balance\n */\nprocess.removeAllListeners('warning');\nimport { Command } from 'commander';\nimport { nip19 } from 'nostr-tools';\nimport { cmdInit, type InitOptions } from './commands/init.js';\nimport { cmdProfile } from './commands/profile.js';\nimport { cmdStart } from './commands/start.js';\nimport { cmdWallet } from './commands/wallet.js';\nimport { PACKAGE_VERSION } from './version.js';\n\n/**\n * Wrap an action handler so any thrown Error surfaces as a single clean line\n * with exit 1 instead of an unhandled-rejection stack trace.\n */\nfunction safe<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T): Promise<void> => {\n try {\n await fn(...args);\n } catch (e) {\n console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n };\n}\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\n .command('init [name]')\n .description('Create a new agent')\n .option('-c, --config <path>', 'Load fields from an elisym.yaml template (non-interactive)')\n .option(\n '--defaults',\n 'Skip every prompt and use the same defaults the wizard would have suggested (description, default relays, no payments, no LLM, no encryption). Mutually exclusive with --config.',\n )\n .option('--local', 'Create in project <project>/.elisym/<name>/ (default: ~/.elisym/<name>/)')\n .option(\n '--passphrase <value>',\n 'Passphrase to encrypt secrets at rest. Empty string (\"\") skips encryption. Also reads ELISYM_PASSPHRASE env var. When neither is provided, prompts interactively.',\n )\n .option(\n '--yes',\n 'Skip confirmation prompts (shadow/sibling-location). Fails closed on an existing agent at the same location - never overwrites secrets silently.',\n )\n .action(\n safe(async (name: string | undefined, options: InitOptions) => {\n await cmdInit(name, options);\n }),\n );\n\n// Profile\nprogram\n .command('profile [name]')\n .description('Edit agent profile, wallet, and LLM settings')\n .action(safe(cmdProfile));\n\n// Start\nprogram\n .command('start [name]')\n .description('Start agent in provider mode')\n .option(\n '-v, --verbose',\n 'Enable debug logging (relay lifecycle, publish acks, subscription EOSE). Also togglable via ELISYM_DEBUG=1 or LOG_LEVEL=debug.',\n )\n .action(\n safe(async (name: string | undefined, options: { verbose?: boolean }) => {\n await cmdStart(name, options);\n }),\n );\n\n// List\nprogram\n .command('list')\n .description('List all agents (project-local and home-global)')\n .action(\n safe(async () => {\n const cwd = process.cwd();\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents found. Run `npx @elisym/cli init` to create one.');\n return;\n }\n console.log('\\nAgents:');\n for (const agent of agents) {\n try {\n const loaded = await loadAgent(agent.name, cwd);\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const npub = nip19.npubEncode(identity.publicKey);\n const solAddr = loaded.yaml.payments[0]?.address\n ? ` | Solana: ${loaded.yaml.payments[0].address}`\n : '';\n const shadow = agent.shadowsGlobal ? ' [shadows global]' : '';\n console.log(` ${agent.name} (${agent.source})${shadow} | ${npub}${solAddr}`);\n } catch (e: any) {\n const hint = /encrypted secrets/i.test(e?.message ?? '') ? ' (encrypted)' : '';\n console.log(` ${agent.name} (${agent.source})${hint}`);\n }\n }\n console.log();\n }),\n );\n\n// Wallet\nprogram.command('wallet [name]').description('Show wallet balance').action(safe(cmdWallet));\n\nprogram.parse();\n","import {\n listAgents,\n loadAgent,\n writeSecrets,\n writeYaml,\n type ElisymYaml,\n type LlmEntry,\n type Secrets,\n} from '@elisym/sdk/agent-store';\n/**\n * Profile command - edit agent profile, wallet, and LLM settings.\n * Writes back to elisym.yaml (public) and .secrets.json (private).\n */\nimport { isAddress } from '@solana/kit';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport async function cmdProfile(name: string | undefined): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.error('No agents found. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n console.log(`\\n Editing agent \"${name}\" (${loaded.source})\\n`);\n\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 {\n name: `Profile (description: ${truncate(loaded.yaml.description ?? '')})`,\n value: 'profile',\n },\n {\n name: `Wallet (${loaded.yaml.payments[0]?.address ?? 'not configured'})`,\n value: 'wallet',\n },\n {\n name: `LLM (${loaded.yaml.llm?.provider ?? 'not configured'} / ${loaded.yaml.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: 'displayName',\n message: 'Display name (for UI):',\n default: loaded.yaml.display_name ?? '',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: loaded.yaml.description ?? '',\n },\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar (relative path or URL, empty to clear):',\n default: loaded.yaml.picture ?? '',\n },\n {\n type: 'input',\n name: 'banner',\n message: 'Banner (relative path or URL, empty to clear):',\n default: loaded.yaml.banner ?? '',\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n display_name: answers.displayName || undefined,\n description: answers.description ?? '',\n picture: answers.picture || undefined,\n banner: answers.banner || undefined,\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Profile updated.\\n');\n }\n\n if (section === 'wallet') {\n const current = loaded.yaml.payments[0];\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Solana address (empty to clear):',\n default: current?.address ?? '',\n validate: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n payments: answers.address\n ? [{ chain: 'solana', network: 'devnet', address: answers.address }]\n : [],\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Wallet updated.\\n');\n }\n\n if (section === 'llm') {\n const providerChoices = listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n }));\n if (providerChoices.length === 0) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const firstChoice = providerChoices[0];\n if (!firstChoice) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'Default LLM provider (used by skills without a `provider:` override):',\n choices: providerChoices,\n default: loaded.yaml.llm?.provider ?? firstChoice.value,\n },\n ]);\n const defaultDescriptor = getLlmProvider(llmProvider);\n if (!defaultDescriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n\n const defaultKeyStatus = describeKeyStatus(loaded.secrets, llmProvider);\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${defaultDescriptor.displayName} API key [${defaultKeyStatus}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n\n const probeKey = apiKey || pickPlainKey(loaded.secrets, llmProvider);\n\n console.log(' Fetching available models...');\n const { fetchModels } = await import('./init.js');\n const models = await fetchModels(llmProvider, probeKey);\n\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n default: loaded.yaml.llm?.model,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: loaded.yaml.llm?.max_tokens ?? 4096,\n },\n ]);\n\n // Optional keys for OTHER registered providers (used by skills\n // that override the default provider in their SKILL.md).\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== llmProvider,\n );\n const otherKeys = new Map<string, string>();\n for (const descriptor of otherDescriptors) {\n const status = describeKeyStatus(loaded.secrets, descriptor.id);\n const { otherApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'otherApiKey',\n message: `${descriptor.displayName} API key for skill overrides [${status}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n if (otherApiKey) {\n otherKeys.set(descriptor.id, otherApiKey);\n }\n }\n\n const nextLlm: LlmEntry = { provider: llmProvider, model, max_tokens: maxTokens };\n const nextYaml: ElisymYaml = { ...loaded.yaml, llm: nextLlm };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n\n if (apiKey || otherKeys.size > 0) {\n const nextLlmApiKeys: Record<string, string> = {\n ...(loaded.secrets.llm_api_keys ?? {}),\n };\n if (apiKey) {\n nextLlmApiKeys[llmProvider] = apiKey;\n }\n for (const [providerId, key] of otherKeys) {\n nextLlmApiKeys[providerId] = key;\n }\n const nextSecrets: Secrets = {\n ...loaded.secrets,\n llm_api_keys: nextLlmApiKeys,\n };\n await writeSecrets(loaded.dir, nextSecrets, passphrase);\n loaded.secrets = nextSecrets;\n }\n console.log(' LLM updated.\\n');\n }\n }\n\n console.log(` Agent \"${name}\" saved.\\n`);\n}\n\nfunction truncate(value: string, max = 40): string {\n if (value.length <= max) {\n return value;\n }\n return value.slice(0, max - 1) + '…';\n}\n\n/** Status hint shown next to the API-key prompt so the user knows what's stored. */\nfunction describeKeyStatus(secrets: Secrets, providerId: string): string {\n return secrets.llm_api_keys?.[providerId] ? 'set' : 'not set';\n}\n\n/** Pick the stored key for model probing. `loaded.secrets` is post-decrypt, so values are plaintext. */\nfunction pickPlainKey(secrets: Secrets, providerId: string): string {\n const value = secrets.llm_api_keys?.[providerId];\n return typeof value === 'string' ? value : '';\n}\n","/**\n * Opt-in relay diagnostics. Resolves each relay hostname via DNS and\n * opens a TCP probe to the relay port. Activated by `ELISYM_NET_DIAG=1`\n * so operators can separately diagnose \"WSS fails but everything else\n * looks fine\" scenarios common on WSL, Docker, or corporate firewalls.\n *\n * Never called on a hot path - one-shot at startup.\n */\nimport { lookup } from 'node:dns/promises';\nimport { Socket } from 'node:net';\nimport type { Logger } from 'pino';\n\nconst TCP_PROBE_TIMEOUT_MS = 3_000;\n\nexport interface RelayProbeResult {\n url: string;\n host: string;\n port: number;\n ips: string[];\n tcpOpenMs?: number;\n error?: string;\n}\n\nfunction parseRelayUrl(url: string): { host: string; port: number } | null {\n try {\n const parsed = new URL(url);\n const isSecure = parsed.protocol === 'wss:' || parsed.protocol === 'https:';\n const defaultPort = isSecure ? 443 : 80;\n const port = parsed.port.length > 0 ? parseInt(parsed.port, 10) : defaultPort;\n if (!Number.isFinite(port)) {\n return null;\n }\n return { host: parsed.hostname, port };\n } catch {\n return null;\n }\n}\n\nasync function tcpProbe(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<{ openMs: number } | { error: string }> {\n return new Promise((resolve) => {\n const started = Date.now();\n const socket = new Socket();\n let settled = false;\n\n const finish = (result: { openMs: number } | { error: string }): void => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n resolve(result);\n };\n\n const timer = setTimeout(() => finish({ error: 'timeout' }), timeoutMs);\n\n socket.once('connect', () => {\n clearTimeout(timer);\n finish({ openMs: Date.now() - started });\n });\n socket.once('error', (err) => {\n clearTimeout(timer);\n finish({ error: err.message });\n });\n\n socket.connect(port, host);\n });\n}\n\nexport async function probeRelays(\n relays: string[],\n logger: Logger,\n timeoutMs: number = TCP_PROBE_TIMEOUT_MS,\n): Promise<RelayProbeResult[]> {\n const results: RelayProbeResult[] = [];\n for (const url of relays) {\n const parsed = parseRelayUrl(url);\n if (!parsed) {\n logger.debug({ event: 'net_diag_parse_failed', url }, 'unparseable relay URL');\n results.push({ url, host: '', port: 0, ips: [], error: 'invalid URL' });\n continue;\n }\n const { host, port } = parsed;\n let ips: string[] = [];\n try {\n const resolved = await lookup(host, { all: true });\n ips = resolved.map((entry) => entry.address);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(\n { event: 'net_diag_dns_failed', url, host, error: message },\n 'DNS lookup failed',\n );\n results.push({ url, host, port, ips: [], error: `dns: ${message}` });\n continue;\n }\n\n const probe = await tcpProbe(host, port, timeoutMs);\n if ('openMs' in probe) {\n logger.debug(\n { event: 'net_diag_tcp_open', url, host, port, ips, tcpOpenMs: probe.openMs },\n 'TCP open',\n );\n results.push({ url, host, port, ips, tcpOpenMs: probe.openMs });\n } else {\n logger.debug(\n { event: 'net_diag_tcp_failed', url, host, port, ips, error: probe.error },\n 'TCP probe failed',\n );\n results.push({ url, host, port, ips, error: `tcp: ${probe.error}` });\n }\n }\n return results;\n}\n","/**\n * Shared CLI helpers - RPC URLs, SOL formatting, price validation.\n */\nimport { USDC_SOLANA_DEVNET, calculateProtocolFee } from '@elisym/sdk';\nimport { type Rpc, type SolanaRpcApi, address } from '@solana/kit';\n\n// --- Constants ---\n\nexport const RENT_EXEMPT_MINIMUM = 890_880; // lamports\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 * If a watchdog tick fires after a wall-clock gap larger than the smaller of\n * its two intervals multiplied by this factor, the gap is treated as host\n * suspension (macOS sleep, hibernation, container pause) rather than normal\n * scheduling jitter. Both `setInterval` callbacks freeze during OS sleep and\n * fire late on resume; the tick that detects the gap forces an immediate pool\n * reset instead of running the regular probe/self-ping (which would race\n * against still-half-dead WebSocket state).\n */\nexport const WATCHDOG_SLEEP_DETECT_MULTIPLIER = 2;\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// --- USDC balance ---\n\n/**\n * Sum the agent's USDC token-account balances (raw subunits) on the connected\n * Solana RPC. Returns 0n on any error or when the asset has no mint configured;\n * callers display \"0 USDC\" rather than failing the whole banner.\n */\nexport async function fetchUsdcBalance(\n rpc: Rpc<SolanaRpcApi>,\n owner: ReturnType<typeof address>,\n): Promise<bigint> {\n const mint = USDC_SOLANA_DEVNET.mint;\n if (!mint) {\n return 0n;\n }\n try {\n const response = await rpc\n .getTokenAccountsByOwner(\n owner,\n { mint: address(mint) },\n { encoding: 'jsonParsed', commitment: 'confirmed' },\n )\n .send();\n let total = 0n;\n for (const entry of response.value) {\n const parsed = entry.account.data as\n | { parsed?: { info?: { tokenAmount?: { amount?: string } } } }\n | undefined;\n const raw = parsed?.parsed?.info?.tokenAmount?.amount;\n if (typeof raw === 'string') {\n total += BigInt(raw);\n }\n }\n return total;\n } catch {\n return 0n;\n }\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, chmodSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\n// Ledger files hold customer-confidential job content (inputs, results). Lock\n// the directory and files down to owner-only, matching the rest of the agent\n// store, so other local users cannot read them.\nconst LEDGER_DIR_MODE = 0o700;\nconst LEDGER_FILE_MODE = 0o600;\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 /**\n * @param ledgerPath absolute path to the ledger file\n * (typically `<agentDir>/.jobs.json`). Caller is responsible for\n * resolving the agent directory via `@elisym/sdk/agent-store`.\n */\n constructor(ledgerPath: string) {\n this.path = ledgerPath;\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 const backupPath = this.path + '.corrupt.' + Date.now();\n renameSync(this.path, backupPath);\n // The backup inherits the original (possibly world-readable) perms,\n // so tighten it to owner-only - it still holds job content.\n chmodSync(backupPath, LEDGER_FILE_MODE);\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, mode: LEDGER_DIR_MODE });\n const obj = Object.fromEntries(this.entries);\n const tmp = this.path + '.tmp';\n writeFileSync(tmp, JSON.stringify(obj, null, 2), { mode: LEDGER_FILE_MODE });\n renameSync(tmp, this.path);\n // writeFileSync's `mode` is masked by the process umask, so an explicit\n // chmod after the rename guarantees owner-only perms regardless of umask.\n chmodSync(this.path, LEDGER_FILE_MODE);\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 this.pruneOldEntries(maxAgeSecs * 1000);\n }\n\n /**\n * Drop terminal entries (`delivered` / `failed`) whose `created_at`\n * predates `now - retentionMs`. Stuck non-terminal entries are never\n * pruned - recovery keeps retrying them until the retry budget runs\n * out, then they become terminal and are eligible on the next sweep.\n *\n * Returns the number of entries deleted, for observability.\n */\n pruneOldEntries(retentionMs: number): number {\n const cutoff = Math.floor(Date.now() / 1000) - Math.floor(retentionMs / 1000);\n let deleted = 0;\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 deleted += 1;\n }\n }\n if (deleted > 0) {\n this.flush();\n }\n return deleted;\n }\n}\n","/**\n * Start command - run agent in provider mode.\n * Loads all skills from agentDir/skills/, publishes per-capability cards,\n * processes jobs with per-capability pricing, caches uploaded media URLs.\n */\nimport { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, join, relative, resolve, sep } from 'node:path';\nimport {\n ElisymClient,\n ElisymIdentity,\n MediaService,\n USDC_SOLANA_DEVNET,\n formatAssetAmount,\n formatSol,\n RELAYS,\n DEFAULTS,\n DEFAULT_KIND_OFFSET,\n KIND_LONG_FORM_ARTICLE,\n POLICY_D_TAG_PREFIX,\n POLICY_T_TAG,\n jobRequestKind,\n toDTag,\n type CapabilityCard,\n} from '@elisym/sdk';\nimport {\n agentPaths,\n listAgents,\n loadAgent,\n loadPoliciesFromDir,\n lookupCachedUrl,\n newCacheEntry,\n readMediaCache,\n writeMediaCache,\n type LoadedAgent,\n type MediaCache,\n} from '@elisym/sdk/agent-store';\nimport { LlmHealthMonitor, startLlmRecovery, type HeartbeatHandle } from '@elisym/sdk/llm-health';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { probeRelays } from '../diagnostics.js';\nimport {\n fetchUsdcBalance,\n getRpcUrl,\n MAX_CONCURRENT_JOBS,\n RECOVERY_MAX_RETRIES,\n RECOVERY_INTERVAL_SECS,\n} from '../helpers.js';\nimport { JobLedger } from '../ledger.js';\nimport {\n createLlmClient,\n getLlmProvider,\n listLlmProviders,\n verifyLlmApiKeyDeep,\n type LlmConfig,\n type LlmProvider,\n} from '../llm';\nimport { cacheKeyFor, resolveTripleForOverride } from '../llm/cache.js';\nimport { resolveProviderApiKey } from '../llm/keys.js';\nimport { resolveSkillLlm, type ResolvedSkillLlm } from '../llm/resolve.js';\nimport { createLogger } from '../logging.js';\nimport { AgentRuntime, type RuntimeConfig } from '../runtime.js';\nimport { SkillRegistry, type SkillContext, type SkillLlmOverride } from '../skill';\nimport type { LlmClient } from '../skill/index.js';\nimport { loadSkillsFromDir } from '../skill/loader.js';\nimport { NostrTransport } from '../transport/nostr.js';\nimport { startWatchdog } from '../watchdog.js';\n\nexport interface StartOptions {\n verbose?: boolean;\n}\n\nexport async function cmdStart(\n nameArg: string | undefined,\n options: StartOptions = {},\n): Promise<void> {\n const cwd = process.cwd();\n\n // -- Step 1: Resolve agent name --\n const agentName = await resolveStartAgentName(nameArg, cwd);\n if (!agentName) {\n return;\n }\n\n // -- Step 2: Load agent (with optional passphrase for encrypted keys) --\n const loaded = await loadAgentWithPrompt(agentName, cwd);\n\n // -- Step 2b: Set up structured logger early so publish / config\n // debug events fire before connectivity is established.\n const verbose =\n options.verbose === true ||\n process.env.ELISYM_DEBUG === '1' ||\n process.env.LOG_LEVEL === 'debug';\n const { logger, logWithIndent } = createLogger({\n verbose,\n tty: Boolean(process.stdout.isTTY),\n });\n\n // -- Step 3: Banner --\n console.log(`\\n Starting agent ${agentName} (${loaded.source})...\\n`);\n if (loaded.shadowsGlobal) {\n console.log(\n ` ! Using project-local ${agentName} (shadows global agent in ~/.elisym/${agentName}/)\\n`,\n );\n }\n if (verbose) {\n console.log(' [debug] Verbose logging enabled. Structured diagnostics -> stderr.');\n }\n\n // -- Step 4: Resolve Solana address and show balance --\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n const solanaAddress = solPayment?.address;\n const walletNetwork = solPayment?.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 }, usdcBalance] = await Promise.all([\n rpc.getBalance(walletAddress).send(),\n fetchUsdcBalance(rpc, walletAddress),\n ]);\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 // FIX #10: a custom SOLANA_RPC_URL routinely carries an API key in its\n // userinfo / query / path - redact before printing to the banner.\n console.log(` RPC ${stripRpcSecrets(process.env.SOLANA_RPC_URL)} (custom)`);\n }\n console.log(` SOL ${formatSol(balance)} (${balance} lamports)`);\n console.log(` USDC ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}`);\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: Load and register all skills --\n // Skills load before the LLM check so a fully-non-LLM agent can start\n // without an API key. The LLM block below runs only when at least one\n // skill has `mode === 'llm'`.\n //\n // `scriptEnv` propagates decrypted per-provider keys (e.g. ANTHROPIC_API_KEY)\n // into `dynamic-script` / `static-script` subprocesses, so script skills get\n // the same secret access LLM-mode skills already have. Existing process.env\n // values win when no per-agent secret is set, matching the priority used by\n // resolveProviderApiKey for LLM-mode skills.\n const scriptEnv: NodeJS.ProcessEnv = { ...process.env };\n const llmKeys = loaded.secrets.llm_api_keys ?? {};\n for (const descriptor of listLlmProviders()) {\n const secretValue = llmKeys[descriptor.id];\n if (typeof secretValue === 'string' && secretValue.length > 0) {\n scriptEnv[descriptor.envVar] = secretValue;\n }\n }\n const paths = agentPaths(loaded.dir);\n const skillsDir = paths.skills;\n const allSkills = loadSkillsFromDir(skillsDir, { scriptEnv });\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: ${skillsDir}/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 =\n skill.priceSubunits > 0\n ? formatAssetAmount(skill.asset, BigInt(skill.priceSubunits))\n : '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.priceSubunits > 0);\n if (hasPaid && !solanaAddress) {\n console.error(\n ' ! Paid skills require a Solana address. Run `npx @elisym/cli profile` to configure.\\n',\n );\n process.exit(1);\n }\n\n // -- Step 6: LLM check (only when at least one skill needs it) --\n // Per-skill LLM resolution. Each `mode: 'llm'` skill resolves to a concrete\n // (provider, model, maxTokens) triple. Agent-level `llm` in elisym.yaml is\n // the fallback for skills that don't override; if every LLM skill overrides,\n // agent-level `llm` may be omitted entirely.\n //\n // Script-mode skills can also declare `provider` + `model` in SKILL.md to\n // register a health-monitor probe for the API key the script uses under\n // the hood. Those skills do NOT need an LlmClient (the script makes its\n // own HTTP calls), but they DO need: an API key resolved + verified at\n // startup, and a (provider, model) pair registered with the health\n // monitor so reactive markUnhealthy + lazy recovery works.\n const llmSkills = allSkills.filter((skill) => skill.mode === 'llm');\n const scriptDepSkills = allSkills.filter(\n (skill) => skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model,\n );\n // Pairs to register with the health monitor (any mode + declared provider+model).\n // Keyed by `provider::model`; deduplicated across skills so we don't probe\n // the same key twice when several skills share the same LLM dependency.\n const monitorPairs = new Map<string, { provider: LlmProvider; model: string }>();\n // Triples to build LlmClient instances for (mode=llm only).\n const triplesByKey = new Map<string, ResolvedSkillLlm>();\n const dependentSkillsByProvider = new Map<LlmProvider, string[]>();\n let agentDefaultCacheKey: string | undefined;\n const llmClientCache = new Map<string, LlmClient>();\n const healthMonitor = new LlmHealthMonitor();\n\n if (llmSkills.length > 0 || scriptDepSkills.length > 0) {\n const resolutionErrors: string[] = [];\n\n for (const skill of llmSkills) {\n const skillMdPath = join(skillsDir, skill.name, 'SKILL.md');\n const result = resolveSkillLlm(\n { skillName: skill.name, skillMdPath, llmOverride: skill.llmOverride },\n loaded.yaml.llm,\n );\n if ('error' in result) {\n resolutionErrors.push(result.error);\n continue;\n }\n const cacheKey = cacheKeyFor(result);\n triplesByKey.set(cacheKey, result);\n monitorPairs.set(`${result.provider}::${result.model}`, {\n provider: result.provider,\n model: result.model,\n });\n skill.resolvedTriple = {\n provider: result.provider,\n model: result.model,\n maxTokens: result.maxTokens,\n };\n const list = dependentSkillsByProvider.get(result.provider) ?? [];\n list.push(skill.name);\n dependentSkillsByProvider.set(result.provider, list);\n }\n\n // Script-mode skills: register their declared (provider, model) for\n // health monitoring. No LlmClient is built - the script does its own\n // HTTP. The all-or-nothing parse invariant guarantees both `provider`\n // and `model` are set when we reach this branch (validateLlmOverride).\n for (const skill of scriptDepSkills) {\n const provider = skill.llmOverride?.provider as LlmProvider;\n const model = skill.llmOverride?.model as string;\n monitorPairs.set(`${provider}::${model}`, { provider, model });\n const list = dependentSkillsByProvider.get(provider) ?? [];\n if (!list.includes(skill.name)) {\n list.push(skill.name);\n }\n dependentSkillsByProvider.set(provider, list);\n }\n\n if (resolutionErrors.length > 0) {\n for (const message of resolutionErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n if (loaded.yaml.llm) {\n const agentDefaultTriple: ResolvedSkillLlm = {\n provider: loaded.yaml.llm.provider as LlmProvider,\n model: loaded.yaml.llm.model,\n maxTokens: loaded.yaml.llm.max_tokens,\n };\n const agentKey = cacheKeyFor(agentDefaultTriple);\n if (triplesByKey.has(agentKey)) {\n agentDefaultCacheKey = agentKey;\n }\n }\n\n // Resolve + verify each provider's API key once.\n const keyByProvider = new Map<LlmProvider, string>();\n const keyErrors: string[] = [];\n for (const [provider, dependents] of dependentSkillsByProvider) {\n const keyResult = resolveProviderApiKey({\n provider,\n secrets: loaded.secrets,\n dependentSkills: dependents,\n });\n if ('error' in keyResult) {\n keyErrors.push(keyResult.error);\n continue;\n }\n keyByProvider.set(provider, keyResult.apiKey);\n }\n if (keyErrors.length > 0) {\n for (const message of keyErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n // Deep-verify each unique (provider, model) pair the agent will use.\n // Deep verification consumes one billing token per probe (~$0.00001\n // on Haiku) but distinguishes valid keys from billing-exhausted ones,\n // which `/v1/models` cannot. Iterates `monitorPairs` so script-mode\n // skills that declared `provider`+`model` are probed too.\n for (const [, pair] of monitorPairs) {\n const apiKey = keyByProvider.get(pair.provider);\n if (!apiKey) {\n continue;\n }\n const envVar =\n getLlmProvider(pair.provider)?.envVar ?? `${pair.provider.toUpperCase()}_API_KEY`;\n process.stdout.write(` Verifying ${pair.provider} ${pair.model}... `);\n const verification = await verifyLlmApiKeyDeep(pair.provider, apiKey, pair.model);\n const descriptor = getLlmProvider(pair.provider);\n const verifyFn = async (signal?: AbortSignal) =>\n descriptor\n ? descriptor.verifyKeyDeep(apiKey, pair.model, signal)\n : { ok: false as const, reason: 'unavailable' as const, error: 'no descriptor' };\n healthMonitor.register({\n provider: pair.provider,\n model: pair.model,\n verifyFn,\n });\n healthMonitor.seed(pair.provider, pair.model, verification);\n if (verification.ok) {\n console.log('ok');\n } else if (verification.reason === 'invalid') {\n console.log('INVALID');\n console.error(` ! ${pair.provider} rejected the API key (HTTP ${verification.status}).`);\n console.error(\n ` Update it via \\`npx @elisym/cli profile ${agentName}\\` or set ${envVar} to a valid key.\\n`,\n );\n process.exit(1);\n } else if (verification.reason === 'billing') {\n console.log('BILLING');\n const detail = verification.body ? ` ${verification.body.slice(0, 200)}` : '';\n console.error(\n ` ! ${pair.provider} reports a billing/quota issue for ${pair.model}.${detail}`,\n );\n console.error(\n ` Top up the account at the provider console, or set ${envVar} to a key on a funded org.\\n`,\n );\n process.exit(1);\n } else {\n console.log('unavailable');\n console.warn(\n ` ! Could not verify ${pair.provider} ${pair.model} (${verification.error}). Continuing - jobs will fail if the key is invalid.\\n`,\n );\n }\n }\n\n // Eager client construction. One LlmClient per unique triple.\n for (const [cacheKey, triple] of triplesByKey) {\n const apiKey = keyByProvider.get(triple.provider);\n if (!apiKey) {\n // Should never happen - keyByProvider is built from the same provider\n // set as the triples. Defensive guard for type narrowing.\n console.error(` ! Internal error: no API key for provider \"${triple.provider}\".\\n`);\n process.exit(1);\n }\n const config: LlmConfig = {\n provider: triple.provider,\n apiKey,\n model: triple.model,\n maxTokens: triple.maxTokens,\n logUsage: true,\n };\n llmClientCache.set(cacheKey, createLlmClient(config));\n }\n } else {\n console.log(' No LLM-dependent skills loaded; skipping LLM key check.\\n');\n }\n\n const agentDefaultClient =\n agentDefaultCacheKey !== undefined ? llmClientCache.get(agentDefaultCacheKey) : undefined;\n\n const getLlm = (override?: SkillLlmOverride): LlmClient | undefined => {\n const triple = resolveTripleForOverride(override, loaded.yaml.llm);\n if (!triple) {\n return undefined;\n }\n return llmClientCache.get(cacheKeyFor(triple));\n };\n\n const skillCtx: SkillContext = {\n llm: agentDefaultClient,\n getLlm,\n agentName,\n agentDescription: loaded.yaml.description ?? '',\n };\n\n // -- Step 8: Connect to relays --\n console.log(' Connecting to relays and publishing capabilities...');\n\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const relays = loaded.yaml.relays.length > 0 ? loaded.yaml.relays : [...RELAYS];\n const client = new ElisymClient({ relays });\n\n // Opt-in DNS + TCP connectivity probe for WSL / Windows / corporate\n // firewall troubleshooting. Runs once before publish so the operator\n // sees the result in the startup banner.\n if (process.env.ELISYM_NET_DIAG === '1') {\n console.log(' [net-diag] Probing relay DNS + TCP connectivity...');\n const results = await probeRelays(relays, logger);\n for (const result of results) {\n const ipSummary = result.ips.length > 0 ? result.ips.join(',') : '-';\n if (result.tcpOpenMs !== undefined) {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} TCP open in ${result.tcpOpenMs}ms`);\n } else {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} FAILED: ${result.error ?? '?'}`);\n }\n }\n }\n\n // -- Step 9: Resolve media URLs via cache (no SKILL.md mutation) --\n const media = new MediaService();\n const mediaCache = await readMediaCache(loaded.dir);\n let mediaCacheDirty = false;\n\n const pictureUrl = await resolveMediaField(\n loaded.yaml.picture,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n const bannerUrl = await resolveMediaField(\n loaded.yaml.banner,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n\n for (const skill of allSkills) {\n if (skill.image || !skill.imageFile || !skill.dir) {\n continue;\n }\n const skillRoot = skill.dir;\n const folderName = basename(skillRoot);\n const cacheKey = `./skills/${folderName}/${skill.imageFile}`;\n const absPath = join(skillRoot, skill.imageFile);\n const url = await uploadOrReuse(\n cacheKey,\n absPath,\n mediaCache,\n media,\n identity,\n () => (mediaCacheDirty = true),\n );\n if (url) {\n skill.image = url;\n }\n }\n\n if (mediaCacheDirty) {\n await writeMediaCache(loaded.dir, mediaCache);\n }\n\n // -- Step 10: Publish kind:0 profile --\n let profilePublished = false;\n try {\n await client.discovery.publishProfile(\n identity,\n loaded.yaml.display_name ?? agentName,\n loaded.yaml.description ?? '',\n pictureUrl,\n bannerUrl,\n );\n profilePublished = true;\n logger.debug({ event: 'publish_ack', kind: 0 }, 'profile published');\n } catch (e: any) {\n console.warn(` ! Failed to publish profile: ${e.message}`);\n logger.warn({ event: 'publish_failed', kind: 0, error: e.message }, 'profile publish failed');\n }\n\n // -- Step 10.5: Publish agent policies (NIP-23 long-form articles, kind 30023) --\n // `localPolicyDTags` is built from disk before the publish loop so a transient\n // publish failure does not cause Step 10.6 to tombstone the prior good version\n // still on the relay. Mirrors the kind:31990 cleanup in Step 12 which builds\n // `skillDTags` upfront from `allSkills` - delete-on-disk = retract-from-relay,\n // not \"delete-on-failed-publish\".\n const policies = existsSync(paths.policies) ? loadPoliciesFromDir(paths.policies) : [];\n const localPolicyDTags = new Set(\n policies.map((policy) => `${POLICY_D_TAG_PREFIX}${policy.type}`),\n );\n for (const policy of policies) {\n try {\n const { naddr } = await client.policies.publishPolicy(identity, policy);\n console.log(` * Policy: ${policy.type}@${policy.version} -> ${naddr}`);\n logger.debug(\n { event: 'publish_ack', kind: KIND_LONG_FORM_ARTICLE, policy: policy.type, naddr },\n 'policy published',\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish policy \"${policy.type}\": ${e.message}`);\n logger.warn(\n {\n event: 'publish_failed',\n kind: KIND_LONG_FORM_ARTICLE,\n policy: policy.type,\n error: e.message,\n },\n 'policy publish failed',\n );\n }\n }\n\n // -- Step 10.6: Tombstone orphan policies (file removed from disk) --\n try {\n const existingPolicies = await client.pool.querySync({\n kinds: [KIND_LONG_FORM_ARTICLE],\n authors: [identity.publicKey],\n '#t': [POLICY_T_TAG],\n });\n for (const event of existingPolicies) {\n const dTag = event.tags.find((tag) => tag[0] === 'd')?.[1];\n if (!dTag || localPolicyDTags.has(dTag)) {\n continue;\n }\n // Skip already-tombstoned events (empty content) so we don't re-publish identical retractions every start.\n if (!event.content) {\n continue;\n }\n const type = event.tags.find((tag) => tag[0] === 'policy_type')?.[1];\n if (!type) {\n continue;\n }\n try {\n await client.policies.deletePolicy(identity, type);\n console.log(` Removed stale policy: ${type}`);\n } catch {\n // non-fatal, will retry next start\n }\n }\n } catch {\n // non-fatal: stale policies stay on relay, agent still starts\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 const isStatic = skill.mode === 'static-file' || skill.mode === 'static-script';\n return {\n name: skill.name,\n description: skill.description,\n capabilities: skill.capabilities,\n image: skill.image,\n ...(isStatic ? { static: true } : {}),\n payment: solanaAddress\n ? {\n chain: 'solana',\n network: walletNetwork,\n address: solanaAddress,\n job_price: skill.priceSubunits,\n token: skill.asset.token,\n ...(skill.asset.mint ? { mint: skill.asset.mint } : {}),\n decimals: skill.asset.decimals,\n symbol: skill.asset.symbol,\n }\n : undefined,\n };\n }\n\n let cardsPublished = 0;\n for (const skill of allSkills) {\n try {\n await client.discovery.publishCapability(identity, buildCard(skill), kinds);\n cardsPublished += 1;\n logger.debug(\n { event: 'publish_ack', kind: 31990, skill: skill.name },\n 'capability card published',\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish \"${skill.name}\": ${e.message}`);\n logger.warn(\n { event: 'publish_failed', kind: 31990, skill: skill.name, error: e.message },\n 'capability publish failed',\n );\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 // Compare by d-tag, not card.name. toDTag() is lossy (e.g. \"WHOIS Lookup\"\n // and \"whois-lookup\" collapse to the same d-tag), so name-based comparison\n // can flag a card whose d-tag actually matches an active skill - the\n // resulting deletion event then replaces the freshly-published card on the\n // relay (kind:31990 is replaceable by author+kind+d-tag).\n const skillDTags = new Set(allSkills.map((s) => toDTag(s.name)));\n for (const ev of existingEvents) {\n const dTag = ev.tags.find((t: string[]) => t[0] === 'd')?.[1];\n if (!dTag || skillDTags.has(dTag)) {\n continue;\n }\n try {\n const card = JSON.parse(ev.content);\n if (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 if (verbose) {\n console.log(\n ` [debug] Published: profile=${profilePublished ? 'ok' : 'FAILED'} + ${cardsPublished}/${allSkills.length} capability cards (kind:31990)`,\n );\n console.log(` [debug] Relays: ${relays.length} configured (${relays.join(', ')})`);\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: Build transport + ledger + runtime --\n const transport = new NostrTransport(client, identity, [DEFAULT_KIND_OFFSET]);\n const ledger = new JobLedger(paths.jobs);\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 // Agent-level default execution budget; per-skill `max_execution_secs`\n // overrides it. Undefined => unlimited (operator-owned, no protocol default).\n executionTimeoutSecs: loaded.yaml.execution_timeout_secs,\n };\n\n // Custom SOLANA_RPC_URL values (Helius, Alchemy, QuickNode) routinely\n // embed API keys in the query string. Strip query + auth before logging\n // so `--verbose` never publishes a third-party RPC credential.\n const rpcUrlForLog = stripRpcSecrets(process.env.SOLANA_RPC_URL ?? getRpcUrl(walletNetwork));\n logger.debug(\n {\n event: 'config_resolved',\n agent: agentName,\n source: loaded.source,\n network: walletNetwork,\n relays,\n solanaAddress,\n rpcUrl: rpcUrlForLog,\n },\n 'config resolved',\n );\n\n // Tee: banner-style indent line on stdout (existing UX) + structured\n // stderr pino entry with shared redact paths (defence against future\n // slips where a diagnostic string might embed user input).\n const diagLog = (msg: string): void => {\n logWithIndent(msg);\n logger.info({ event: 'runtime_diag' }, msg);\n };\n\n const watchdog = startWatchdog({\n client,\n identity,\n transport,\n onPing,\n log: diagLog,\n logger,\n });\n\n let llmHeartbeat: HeartbeatHandle | undefined;\n if (monitorPairs.size > 0) {\n llmHeartbeat = startLlmRecovery({\n monitor: healthMonitor,\n log: diagLog,\n });\n diagLog('LLM health monitor armed (lazy recovery, 5min interval).');\n }\n\n const runtime = new AgentRuntime(\n transport,\n registry,\n skillCtx,\n runtimeConfig,\n ledger,\n {\n onJobReceived: (job) => {\n const cap = job.tags.find((t) => t !== 'elisym') ?? 'unknown';\n // Never log job.input here - capability tag is the only descriptor needed.\n process.stdout.write(` [job] ${job.jobId.slice(0, 16)} | cap=${cap}\\n`);\n logger.info({ event: 'job_received', jobId: job.jobId, capability: cap });\n },\n onJobCompleted: (jobId) => {\n process.stdout.write(` [job] ${jobId.slice(0, 16)} | delivered\\n`);\n logger.info({ event: 'job_delivered', jobId });\n },\n onJobError: (jobId, error) => {\n process.stderr.write(` [job] ${jobId.slice(0, 16)} | error: ${error}\\n`);\n logger.error({ event: 'job_error', jobId, error });\n },\n onLog: diagLog,\n onStop: () => {\n watchdog.stop();\n llmHeartbeat?.stop();\n },\n },\n healthMonitor,\n );\n\n // -- Step 15: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n\n/**\n * Public Solana RPC hosts whose URL path carries no secret. For these the\n * path is safe to keep; every other host is treated as a third-party RPC\n * (Helius/Alchemy/QuickNode) whose path may embed an API key.\n */\nconst PUBLIC_SOLANA_RPC_HOSTS = new Set([\n 'api.devnet.solana.com',\n 'api.mainnet-beta.solana.com',\n 'api.testnet.solana.com',\n]);\n\n/**\n * Return a log-safe representation of an RPC URL. Strips any userinfo and\n * query string so credentials embedded by third-party RPC providers\n * (Helius/Alchemy/QuickNode style `?api-key=...`) never land in verbose\n * stderr output or the startup banner.\n *\n * FIX #11: Alchemy/QuickNode embed the API key in the URL *path* (e.g.\n * `https://solana-mainnet.g.alchemy.com/v2/<APIKEY>`), so stripping only the\n * userinfo + query still leaks the key. For any host that is not a public\n * `api.*.solana.com` endpoint we therefore redact the path too, returning just\n * `protocol//host/***`. Public Solana hosts keep their (secret-free) path.\n */\nexport function stripRpcSecrets(raw: string): string {\n try {\n const parsed = new URL(raw);\n parsed.username = '';\n parsed.password = '';\n if (!PUBLIC_SOLANA_RPC_HOSTS.has(parsed.hostname)) {\n // Third-party RPC: the path may carry an API key - drop it entirely.\n return `${parsed.protocol}//${parsed.host}/***`;\n }\n const marker = parsed.search.length > 0 ? '?***' : '';\n parsed.search = '';\n return `${parsed.toString()}${marker}`;\n } catch {\n return '[unparseable RPC URL]';\n }\n}\n\n/** Resolve a YAML media field (picture/banner) - URL returned as-is, local path uploaded via cache. */\nasync function resolveMediaField(\n value: string | undefined,\n agentDir: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: (updated: boolean) => void,\n): Promise<string | undefined> {\n if (!value) {\n return undefined;\n }\n if (isRemoteUrl(value)) {\n return value;\n }\n const absPath = resolveInsideAgentDir(value, agentDir);\n if (!absPath) {\n console.warn(` ! Skipping media field \"${value}\": path must stay inside the agent directory.`);\n return undefined;\n }\n return uploadOrReuse(value, absPath, cache, media, identity, () => onCacheUpdate(true));\n}\n\n/**\n * Resolve a YAML-supplied path against `agentDir` and reject anything that\n * escapes the agent directory (`..` segments, absolute paths outside it).\n * Returns null on rejection so callers can warn and skip the field.\n */\nfunction resolveInsideAgentDir(value: string, agentDir: string): string | null {\n const agentRoot = resolve(agentDir);\n const candidate = resolve(agentRoot, value);\n const rel = relative(agentRoot, candidate);\n if (rel === '' || rel.startsWith('..') || rel.includes(`..${sep}`)) {\n return null;\n }\n return candidate;\n}\n\n/** Look up `cacheKey` in cache; if hit returns URL, else uploads and updates cache. */\nasync function uploadOrReuse(\n cacheKey: string,\n absPath: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: () => void,\n): Promise<string | undefined> {\n try {\n const cached = await lookupCachedUrl(cache, cacheKey, absPath);\n if (cached) {\n return cached;\n }\n console.log(` Uploading ${basename(absPath)}...`);\n const data = readFileSync(absPath);\n const sha256 = createHash('sha256').update(data).digest('hex');\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(absPath));\n cache[cacheKey] = newCacheEntry(url, sha256);\n onCacheUpdate();\n console.log(` Uploaded: ${url}`);\n return url;\n } catch (e: any) {\n console.warn(` ! Failed to upload ${basename(absPath)}: ${e.message}`);\n return undefined;\n }\n}\n\nfunction isRemoteUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value);\n}\n\nconst MAX_PASSPHRASE_ATTEMPTS = 3;\n\n/**\n * Resolve the agent to start. Returns undefined when the user picked\n * \"+ Create new agent\" and the init wizard ran - the caller should exit.\n */\nasync function resolveStartAgentName(\n nameArg: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (nameArg) {\n return nameArg;\n }\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents configured. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const choices = [\n ...agents.map((agent) => ({\n name: `${agent.name} (${agent.source}${agent.shadowsGlobal ? ' - shadows global' : ''})`,\n value: agent.name,\n })),\n { name: '+ Create new agent', value: '__new__' },\n ];\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 return undefined;\n }\n return selected;\n}\n\nasync function loadAgentWithPrompt(name: string, cwd: string): Promise<LoadedAgent> {\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n try {\n return await loadAgent(name, cwd, envPassphrase);\n } catch (e: any) {\n const isEncrypted = /encrypted secrets/i.test(e?.message ?? '');\n const isWrongPassphrase = /Decryption failed/i.test(e?.message ?? '');\n if (!isEncrypted && !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 await loadAgent(name, cwd, 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 * Resolve the effective LLM config for a single skill.\n *\n * Combines the skill-level `llmOverride` with the agent-level default. The\n * (provider, model) pair is all-or-nothing at the override level (enforced\n * at parse time in the SDK skill loader); `maxTokens` chains independently.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { Skill, SkillLlmOverride } from '@elisym/sdk/skills';\nimport type { LlmProvider } from './index';\n\nexport const DEFAULT_MAX_TOKENS = 4096;\n\nexport interface ResolvedSkillLlm {\n provider: LlmProvider;\n model: string;\n maxTokens: number;\n}\n\nexport interface ResolveSkillLlmInput {\n skillName: string;\n /** Filesystem path to the SKILL.md so error messages point at the exact file. */\n skillMdPath: string;\n llmOverride?: SkillLlmOverride;\n}\n\nexport type ResolveSkillLlmResult = ResolvedSkillLlm | { error: string };\n\n/**\n * Resolve a skill to a concrete (provider, model, maxTokens). Returns an\n * `error` shape when the skill is `mode: 'llm'` but neither side declared\n * provider/model.\n */\nexport function resolveSkillLlm(\n input: ResolveSkillLlmInput,\n agentDefault: LlmEntry | undefined,\n): ResolveSkillLlmResult {\n const override = input.llmOverride;\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n\n if (!provider || !model) {\n return {\n error:\n `Skill \"${input.skillName}\" at ${input.skillMdPath}: LLM model is required - ` +\n `declare \"provider\" + \"model\" in the SKILL.md frontmatter or set agent-level llm ` +\n `via 'npx @elisym/cli profile <agent>'.`,\n };\n }\n\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n\n return { provider, model, maxTokens };\n}\n\n/** Lift the override fields from a `Skill` into the input shape used here. */\nexport function skillResolveInput(skill: Skill, skillMdPath: string): ResolveSkillLlmInput {\n return {\n skillName: skill.name,\n skillMdPath,\n llmOverride: skill.llmOverride,\n };\n}\n","/**\n * Per-skill LLM client caching.\n *\n * Different LLM skills may share or differ on (provider, model, maxTokens).\n * We deduplicate clients by a stable JSON-encoded triple so verifying API\n * keys and instantiating clients happens once per unique config.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { SkillLlmOverride } from '@elisym/sdk/skills';\nimport { DEFAULT_MAX_TOKENS, type ResolvedSkillLlm } from './resolve';\nimport type { LlmProvider } from './index';\n\n/**\n * Stable cache key for an LLM client config. JSON-encoded so any provider /\n * model string is safely escaped (avoids ad-hoc separator collisions).\n */\nexport function cacheKeyFor(triple: ResolvedSkillLlm): string {\n return JSON.stringify({\n provider: triple.provider,\n model: triple.model,\n maxTokens: triple.maxTokens,\n });\n}\n\n/**\n * Resolve an `llmOverride` to a concrete (provider, model, maxTokens) using\n * the agent-level default for any field the override leaves unset. Returns\n * `undefined` when no agent-level default exists and the override is partial\n * (no provider/model) - the caller treats that as \"no client available\".\n */\nexport function resolveTripleForOverride(\n override: SkillLlmOverride | undefined,\n agentDefault: LlmEntry | undefined,\n): ResolvedSkillLlm | undefined {\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n if (!provider || !model) {\n return undefined;\n }\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n return { provider, model, maxTokens };\n}\n","/**\n * Resolve the API key for a given provider, walking the priority chain:\n *\n * 1. `secrets.llm_api_keys[<provider>]` (per-provider entry, preferred).\n * 2. `process.env.<descriptor.envVar>` (operator convenience).\n */\n\nimport type { Secrets } from '@elisym/sdk/agent-store';\nimport { getLlmProvider } from './registry';\nimport type { LlmProvider } from './index';\n\nexport interface ResolvedProviderKey {\n apiKey: string;\n origin: 'secrets-per-provider' | 'env';\n}\n\nexport type ResolveProviderKeyResult = ResolvedProviderKey | { error: string };\n\nexport interface ResolveProviderKeyInput {\n provider: LlmProvider;\n secrets: Secrets;\n /** Names of skills that resolved to this provider. Surfaced in error messages. */\n dependentSkills: string[];\n}\n\nexport function resolveProviderApiKey(input: ResolveProviderKeyInput): ResolveProviderKeyResult {\n const { provider, secrets, dependentSkills } = input;\n\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error: `Provider \"${provider}\" is not registered (required by skill(s): ${skillList}).`,\n };\n }\n\n const perProviderValue = secrets.llm_api_keys?.[provider];\n if (typeof perProviderValue === 'string' && perProviderValue.length > 0) {\n return { apiKey: perProviderValue, origin: 'secrets-per-provider' };\n }\n\n const envValue = process.env[descriptor.envVar];\n if (envValue) {\n return { apiKey: envValue, origin: 'env' };\n }\n\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error:\n `Provider \"${provider}\" needs an API key (required by skill(s): ${skillList}). ` +\n `Set secrets.llm_api_keys.${provider} via 'npx @elisym/cli profile <agent>' or export ${descriptor.envVar}.`,\n };\n}\n","/**\n * Structured logger for the CLI. Stdout stays reserved for the\n * human-readable banner (rendered via `logWithIndent`). Diagnostic\n * output - incoming events, relay lifecycle, publish acks, watchdog\n * decisions - goes to stderr as JSON by default, or pretty-printed\n * when the process is attached to a TTY and pino-pretty is available.\n *\n * Redaction uses the SDK's DEFAULT_REDACT_PATHS so secret keys and\n * user input cannot leak through structured logs even in verbose mode.\n */\nimport { DEFAULT_REDACT_PATHS, makeCensor } from '@elisym/sdk';\nimport pino, { type Logger } from 'pino';\n\nexport interface CreateLoggerOptions {\n /** When true, set level to 'debug' and emit the debug firehose. */\n verbose?: boolean;\n /** When true, pretty-print to stderr; otherwise raw JSON to stderr. */\n tty?: boolean;\n /** Override the log level directly (takes precedence over verbose). */\n level?: string;\n /** Escape hatch for tests: redirect structured output to an explicit stream. */\n destination?: pino.DestinationStream;\n}\n\nexport interface CliLogger {\n logger: Logger;\n /** Pretty 2-space-indented write to stdout, used by the startup banner. */\n logWithIndent(line: string): void;\n /** Banner-only write to stdout. Semantically identical to logWithIndent. */\n bannerLog(line: string): void;\n}\n\nfunction resolveLevel(options: CreateLoggerOptions): string {\n if (options.level) {\n return options.level;\n }\n if (options.verbose) {\n return 'debug';\n }\n const envLevel = process.env.LOG_LEVEL;\n if (envLevel) {\n return envLevel;\n }\n return 'info';\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): CliLogger {\n const level = resolveLevel(options);\n const baseOptions: pino.LoggerOptions = {\n name: 'elisym-cli',\n level,\n redact: {\n paths: DEFAULT_REDACT_PATHS,\n censor: makeCensor(),\n },\n };\n\n let logger: Logger;\n if (options.destination) {\n logger = pino(baseOptions, options.destination);\n } else if (options.tty === true) {\n logger = pino({\n ...baseOptions,\n transport: {\n target: 'pino-pretty',\n options: { destination: 2, colorize: true, translateTime: 'HH:MM:ss' },\n },\n });\n } else {\n // Raw JSON to stderr (fd 2) so stdout stays clean for the banner.\n logger = pino(baseOptions, pino.destination(2));\n }\n\n function logWithIndent(line: string): void {\n process.stdout.write(` ${line}\\n`);\n }\n\n return {\n logger,\n logWithIndent,\n bannerLog: logWithIndent,\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 NATIVE_SOL,\n SolanaPaymentStrategy,\n calculateProtocolFee,\n createSlidingWindowLimiter,\n formatAssetAmount,\n getProtocolConfig,\n getProtocolProgramId,\n LIMITS,\n} from '@elisym/sdk';\nimport type { Asset, ProtocolConfigInput, SlidingWindowLimiter } from '@elisym/sdk';\nimport {\n createFreeLlmLimiterSet,\n FREE_LLM_GLOBAL_KEY,\n freeLlmCustomerKey,\n LlmHealthError,\n ScriptBillingExhaustedError,\n ScriptExecutionError,\n type FreeLlmLimiterSet,\n type LlmHealthMonitor,\n} from '@elisym/sdk/llm-health';\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 LEDGER_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days, mirrors plugin\n/**\n * Hard cutoff for `paid` jobs that the recovery loop is waiting to\n * re-execute against an unhealthy LLM pair. After this age the customer\n * is given up on, the entry is marked `failed`, and a final error\n * feedback is fired. Without this, an operator who walks away from a\n * billing-exhausted agent leaves the ledger and recovery loop spinning\n * on a job nobody will ever deliver.\n */\nconst MAX_PAID_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n// How long the Nostr-feedback signature path waits for a `payment-completed`\n// before giving up. Solana confirmation + wallet signing is single-digit\n// seconds in the happy path, so 60s is generous; past that the customer is\n// almost certainly not coming back and the slot should be released.\nconst SIG_PATH_TIMEOUT_MS = 60 * 1000;\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 * Agent-level default execution budget (seconds) applied to skills that do\n * not set their own `max_execution_secs`. `0` or `undefined` => unlimited\n * (the protocol imposes no default; the operator owns this). A per-skill\n * `executionTimeoutSecs` takes precedence over this.\n */\n executionTimeoutSecs?: 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, 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?.priceSubunits ?? 0;\n}\n\n/** Resolve the payment asset the matched skill is denominated in. Defaults to SOL. */\nfunction resolveJobAsset(tags: string[], skills: SkillRegistry): Asset {\n const skill = skills.route(tags);\n return skill?.asset ?? NATIVE_SOL;\n}\n\n/**\n * Markers that indicate an LLM provider's HTTP response body is about\n * billing / quota exhaustion rather than something benign. Mirrors the\n * marker sets in `cli/src/llm/providers/{anthropic,openai,openai-compatible}.ts`\n * (kept as a permissive superset so any provider's billing language is\n * detected when classifying mid-job errors). Refactoring to a single\n * shared module is out of scope here - just keep this list in sync.\n */\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient', 'insufficient_quota'];\n\n/**\n * Markers that indicate a script-skill failure (non-zero exit, non-42)\n * actually carried a billing / invalid-key signal in its stderr/stdout.\n * Reserved for the case where the script author did not honor the\n * `SCRIPT_EXIT_BILLING_EXHAUSTED = 42` contract - common with shell\n * proxies that exit 1 on every error path and dump the provider's body\n * verbatim (\"Anthropic count_tokens error: invalid x-api-key\" etc).\n *\n * Detecting these in the runtime means an operator's misbehaving script\n * still flips the health pair to unhealthy, so the next customer is\n * refused at the preflight gate (before payment) instead of paying for\n * a job that will fail identically.\n *\n * Superset of `BILLING_BODY_MARKERS`: adds auth-language markers\n * (`x-api-key`, `invalid api key`, `unauthorized`, ...) that are\n * specific to the auth/invalid bucket rather than the billing bucket.\n */\nconst SCRIPT_BILLING_INVALID_MARKERS = [\n 'credit balance',\n 'billing',\n 'insufficient',\n 'insufficient_quota',\n 'x-api-key',\n 'invalid api key',\n 'invalid_api_key',\n 'authentication_error',\n 'unauthorized',\n 'unauthenticated',\n];\n\nfunction scriptMessageLooksLikeBillingOrInvalid(message: string): boolean {\n const lower = message.toLowerCase();\n return SCRIPT_BILLING_INVALID_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Customer-facing message for both the preflight gate (cached\n * billing/invalid signal) and the post-execute path (skill.execute\n * surfaced billing/invalid mid-job). Kept identical between the two so\n * the customer sees a stable string regardless of which side of the\n * health-monitor flip their request landed on. Consumed by the SDK\n * subscription as the `onError` argument.\n */\nconst AGENT_UNAVAILABLE_MESSAGE = 'Agent temporarily unavailable';\n\n/**\n * Re-thrown by the post-execute catch when the underlying skill failure\n * was a billing / invalid signal that just flipped the health pair to\n * unhealthy. Lets `processJob`'s sanitizer surface a stable\n * customer-facing message instead of the generic \"Internal processing\n * error\" mask that otherwise hides every \"API error: ...\" string.\n */\nclass AgentUnavailableError extends Error {\n constructor() {\n super(AGENT_UNAVAILABLE_MESSAGE);\n this.name = 'AgentUnavailableError';\n }\n}\n\n/**\n * Thrown by the execute wrapper when a job exceeds its resolved execution\n * budget (`max_execution_secs` on the skill / `execution_timeout_secs` on the\n * agent). Kept distinct from `AgentUnavailableError` so a budget abort is NOT\n * misclassified as a health flip: the job is marked `failed` (not kept `paid`\n * for recovery), and the message - free of the `API` substring - is forwarded\n * verbatim past `processJob`'s leaky-error masker.\n */\nclass ExecutionBudgetExceededError extends Error {\n constructor(budgetMs: number) {\n super(`Execution exceeded budget (${Math.round(budgetMs / 1000)}s)`);\n this.name = 'ExecutionBudgetExceededError';\n }\n}\n\n// Allowlist of safe, informative messages the runtime itself produces and may\n// forward verbatim to a remote customer. Everything not matched here (raw script\n// stderr, provider internals, unexpected errors) collapses to a fixed generic\n// string; full detail is kept in the operator log only.\nconst CUSTOMER_SAFE_MESSAGE_PREFIXES = ['Input too long', 'No skill matched', 'Payment timeout'];\n\n/**\n * Resolve the error message that is safe to send to a remote customer. Inverts\n * the old leaky denylist (forward-unless-contains-\"API\") into an allowlist so\n * raw subprocess output or provider error bodies can never leak.\n */\nfunction customerSafeMessage(error: unknown): string {\n if (error instanceof AgentUnavailableError || error instanceof ExecutionBudgetExceededError) {\n return error.message;\n }\n if (error instanceof ScriptExecutionError) {\n // Generic summary only - `error.detail` (raw stderr/stdout) stays operator-side.\n return error.message;\n }\n if (error instanceof ScriptBillingExhaustedError) {\n return AGENT_UNAVAILABLE_MESSAGE;\n }\n if (\n error instanceof Error &&\n CUSTOMER_SAFE_MESSAGE_PREFIXES.some((prefix) => error.message.startsWith(prefix))\n ) {\n return error.message;\n }\n return 'Internal processing error';\n}\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Resolve the (provider, model) pair the matched skill depends on for\n * health-monitor gating, or `null` if the skill is not LLM-dependent.\n *\n * For `mode: 'llm'` the pair comes from `resolvedTriple` (computed at\n * startup with agent default + override). For script modes the pair\n * comes from `llmOverride.provider`+`.model` declared in SKILL.md, which\n * is the operator's signal that the script reaches an LLM API under\n * the hood. Either source produces the same (provider, model) string\n * pair the health monitor was registered with in `start.ts`.\n */\nfunction resolveHealthPair(\n skill: import('./skill').Skill | null,\n): { provider: string; model: string } | null {\n if (!skill) {\n return null;\n }\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n return {\n provider: skill.resolvedTriple.provider,\n model: skill.resolvedTriple.model,\n };\n }\n if (skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model) {\n return {\n provider: skill.llmOverride.provider,\n model: skill.llmOverride.model,\n };\n }\n return null;\n}\n\nconst RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; // 10 minutes\n// Free-skill caps: tight, because there is no economic deterrent against\n// loop/Sybil spam. With window == paymentTimeoutSecs (both 10 min by\n// default) these double as per-customer queue-depth caps for unpaid claims.\nconst FREE_MAX_JOBS_PER_CUSTOMER = 20;\nconst FREE_GLOBAL_MAX_JOBS_PER_WINDOW = 200;\n// Paid-skill caps: 10x looser. Payment is the economic deterrent against\n// loop abuse, but the sliding-window cap is still needed to bound the\n// \"claim paid skill but never pay\" queue-spam vector. 200 per customer\n// supports legitimate batch workloads (e.g. translating a 200-paragraph\n// document) without rejecting; 2000 global leaves room for ~10 concurrent\n// batch customers before saturation kicks in.\nconst PAID_MAX_JOBS_PER_CUSTOMER = 200;\nconst PAID_GLOBAL_MAX_JOBS_PER_WINDOW = 2000;\nconst MAX_TRACKED_CUSTOMERS = 1000;\nconst GLOBAL_LIMITER_KEY = '__global__';\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 for free skills. */\n private freeCustomerLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: FREE_MAX_JOBS_PER_CUSTOMER,\n maxKeys: MAX_TRACKED_CUSTOMERS,\n });\n /** Global sliding-window rate limiter for free skills (Sybil protection). */\n private freeGlobalLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: FREE_GLOBAL_MAX_JOBS_PER_WINDOW,\n maxKeys: 1,\n });\n /**\n * Per-customer sliding-window limiter for paid skills (10x looser than free).\n * Payment is the primary economic deterrent; this cap exists to bound the\n * \"claim paid skill but never pay\" queue-spam vector.\n */\n private paidCustomerLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: PAID_MAX_JOBS_PER_CUSTOMER,\n maxKeys: MAX_TRACKED_CUSTOMERS,\n });\n /** Global sliding-window limiter for paid skills (Sybil protection, 10x free). */\n private paidGlobalLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: PAID_GLOBAL_MAX_JOBS_PER_WINDOW,\n maxKeys: 1,\n });\n /**\n * Two-tier limiter applied only to free LLM skills (mode='llm', price=0).\n * Existing per-customer + global limiters above remain in effect for all\n * jobs; this set adds tighter caps to prevent unpaid spam from draining\n * the operator's API key.\n */\n private freeLlmLimiters: FreeLlmLimiterSet = createFreeLlmLimiterSet();\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 private healthMonitor?: LlmHealthMonitor,\n ) {\n this.limit = pLimit(config.maxConcurrentJobs);\n this.maxQueueSize = config.maxQueueSize ?? config.maxConcurrentJobs * 10;\n }\n\n /**\n * Inspect an error thrown by `skill.execute()` and, when it carries a\n * billing/invalid signal from the LLM provider, flip the matching\n * (provider, model) pair to unhealthy via the health monitor. The next\n * job hitting the same pair is then refused at the preflight gate\n * before payment, so customers don't keep paying for jobs that will\n * fail. Recovery happens through the lazy recovery loop.\n *\n * Two error shapes are recognized:\n *\n * - `ScriptBillingExhaustedError` - thrown by SDK script skills when\n * the spawned process exits with `SCRIPT_EXIT_BILLING_EXHAUSTED`.\n * Pair comes from `skill.llmOverride` (operator-declared).\n *\n * - LLM provider HTTP error from `mode: 'llm'` - bare `Error` whose\n * message starts with \"<Provider> API error: <status> <body>\" (the\n * format every CLI provider currently uses). We classify on status:\n * 402 / 401 / 403 -> mark unhealthy. Body markers (`credit\n * balance`, `billing`, `insufficient`) catch the 400-on-billing case\n * Anthropic returns and the 429+`insufficient_quota` case OpenAI\n * and the openai-compatible providers (xAI/Google/DeepSeek) return.\n * Pair comes from `skill.resolvedTriple`.\n *\n * Anything else is a transient/skill error and does NOT touch health\n * state - the recovery loop should not be poisoned by skill bugs.\n */\n /**\n * Build a \"and N other model(s) for the same provider\" suffix for\n * cascade-narrating log lines. The SDK monitor cascades `invalid` /\n * `billing` flips across every sibling pair sharing the same provider\n * (shared API key); this helper just narrates that to the operator log\n * so they can see why unrelated skills are now refusing jobs.\n */\n private cascadeSuffix(provider: string, triggeringModel: string): string {\n if (!this.healthMonitor) {\n return '';\n }\n let siblings = 0;\n for (const entry of this.healthMonitor.snapshot()) {\n if (entry.provider !== provider) {\n continue;\n }\n if (entry.model === triggeringModel) {\n continue;\n }\n siblings += 1;\n }\n if (siblings === 0) {\n return '';\n }\n return ` (cascading to ${siblings} other model(s) for ${provider} sharing the same API key)`;\n }\n\n private markHealthFromExecuteError(\n skill: import('./skill').Skill,\n err: unknown,\n log: (msg: string) => void,\n jobId: string,\n ): boolean {\n if (!this.healthMonitor) {\n return false;\n }\n const tag = `[${jobId.slice(0, 8)}]`;\n\n if (err instanceof ScriptBillingExhaustedError) {\n const provider = skill.llmOverride?.provider;\n const model = skill.llmOverride?.model;\n if (!provider || !model) {\n // Script signaled billing exhaustion but the operator didn't\n // declare which (provider, model) the script depends on - we\n // can't mark anything unhealthy. Surface a hint in the operator\n // log so they know to add provider/model to SKILL.md.\n log(\n `${tag} Script returned exit ${err.exitCode} (billing-exhausted) but skill \"${skill.name}\" did not declare provider/model in SKILL.md - cannot gate future jobs.`,\n );\n return false;\n }\n log(\n `${tag} Script signaled billing-exhausted (exit ${err.exitCode}). Marking ${provider}/${model} unhealthy${this.cascadeSuffix(provider, model)}; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, 'billing', err.message);\n return true;\n }\n\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n const message = err instanceof Error ? err.message : String(err);\n const match = /API error:\\s*(\\d{3})\\b\\s*(.*)/i.exec(message);\n if (!match) {\n return false;\n }\n const status = Number(match[1]);\n const body = (match[2] ?? '').slice(0, 200);\n const isBillingStatus = status === 402;\n const isAuthStatus = status === 401 || status === 403;\n const isBilling400 = status === 400 && bodyLooksLikeBilling(body);\n const isBilling429 = status === 429 && bodyLooksLikeBilling(body);\n if (!isBillingStatus && !isAuthStatus && !isBilling400 && !isBilling429) {\n return false;\n }\n const reason: 'billing' | 'invalid' = isAuthStatus ? 'invalid' : 'billing';\n const provider = skill.resolvedTriple.provider;\n const model = skill.resolvedTriple.model;\n log(\n `${tag} LLM provider returned HTTP ${status} (${reason}). Marking ${provider}/${model} unhealthy${this.cascadeSuffix(provider, model)}; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, reason, body);\n return true;\n }\n\n // Script-mode failure handling. Policy: fail-fast circuit breaker -\n // ANY non-zero exit on a script-mode skill with a declared\n // (provider, model) flips that pair unhealthy immediately. The next\n // customer is refused at the preflight gate before payment, so a\n // single failed buyer protects everyone behind them until the lazy\n // recovery probe (verifyKeyDeep) confirms the pair is back up.\n //\n // Two flavors, distinguished by whether the failure is shared-key or\n // skill-local:\n //\n // 1. Stderr matches billing/invalid markers (\"credit balance\",\n // \"x-api-key\", \"unauthorized\", ...) - the upstream API key is\n // the root cause, so every model under the same provider is\n // affected. Cascade across siblings.\n //\n // 2. Generic non-zero exit with no recognizable marker - most\n // likely a per-skill bug (missing env var, malformed response,\n // broken script). Other models for the same provider are\n // probably fine. Mark only this pair (`cascade: false`) so a\n // bug in Sonnet's proxy.sh does not take down Haiku as\n // collateral damage.\n //\n // Reason is `invalid` for generic exits because it requires operator\n // action to resolve and cached-failure semantics in `probeIfNeeded`\n // keep the gate closed until the lazy recovery loop's verifyKeyDeep\n // probe succeeds. Recovery is API-key-scoped, not script-scoped: if\n // the script bug persists, the next buyer triggers another flip,\n // making the gate self-healing for transient skill bugs but\n // self-flapping for chronic ones (acceptable - operator log makes\n // this visible).\n if (skill.mode !== 'llm') {\n // Use the raw stderr/stdout (`detail`) for billing/invalid marker scanning\n // and the operator log - the generic `.message` no longer carries it.\n let message: string;\n if (err instanceof ScriptExecutionError) {\n message = err.detail;\n } else if (err instanceof Error) {\n message = err.message;\n } else {\n message = String(err);\n }\n const provider = skill.llmOverride?.provider;\n const model = skill.llmOverride?.model;\n if (!provider || !model) {\n log(\n `${tag} Script \"${skill.name}\" failed (\"${message.slice(0, 120)}\") but did not declare provider/model in SKILL.md - cannot gate future jobs.`,\n );\n return false;\n }\n const lower = message.toLowerCase();\n const looksBillingOrInvalid = scriptMessageLooksLikeBillingOrInvalid(message);\n const reason: 'billing' | 'invalid' =\n looksBillingOrInvalid &&\n (lower.includes('credit balance') ||\n lower.includes('billing') ||\n lower.includes('insufficient'))\n ? 'billing'\n : 'invalid';\n const cascade = looksBillingOrInvalid;\n const cascadeNote = cascade ? this.cascadeSuffix(provider, model) : ' (no cascade)';\n const signalNote = looksBillingOrInvalid\n ? `${reason} signal in stderr`\n : `generic exit (no billing/invalid markers, classified as ${reason}, skill-local)`;\n log(\n `${tag} Script failure (${signalNote}). Marking ${provider}/${model} unhealthy${cascadeNote}; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, reason, message.slice(0, 200), {\n cascade,\n });\n return true;\n }\n\n return false;\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 // Prune terminal ledger entries past the 30-day retention window.\n this.ledger.pruneOldEntries(LEDGER_RETENTION_MS);\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.pruneOldEntries(LEDGER_RETENTION_MS);\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 // Route the skill once; reused below for executeJob and to decide\n // which rate-limit tier applies. Free skills (price=0) use the\n // tight default tier; paid skills use the 10x-looser tier because\n // payment is the primary economic deterrent against loop abuse.\n // A missing skill match defaults to the free tier (safe fallback:\n // an attacker cannot bypass tight limits by crafting unmatched tags).\n const matched = this.skills.route(job.tags);\n const isPaid = matched ? matched.priceSubunits > 0 : false;\n const customerLimiter = isPaid ? this.paidCustomerLimiter : this.freeCustomerLimiter;\n const globalLimiter = isPaid ? this.paidGlobalLimiter : this.freeGlobalLimiter;\n\n // Per-customer check first so a rate-limited customer does not\n // bump the global counter - otherwise a single abusive customer\n // could starve every other caller up to the global cap.\n if (!customerLimiter.peek(job.customerId).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n\n // Global rate limiting (Sybil protection).\n if (!globalLimiter.peek(GLOBAL_LIMITER_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server busy, try again later' })\n .catch(() => {});\n return;\n }\n\n // Free-LLM extra protection: only applies when the matched skill\n // is mode='llm' and price=0. We `peek` first across all tiers and\n // only `check` when every tier passes, so a denial in tier N\n // never consumes a slot in tiers < N.\n const isFreeLlm = matched?.mode === 'llm' && matched.priceSubunits === 0;\n let perCustomerLimiter: SlidingWindowLimiter | undefined;\n let perSkillKey: string | undefined;\n if (isFreeLlm && matched) {\n if (!this.freeLlmLimiters.globalLimiter.peek(FREE_LLM_GLOBAL_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n perCustomerLimiter = this.freeLlmLimiters.getPerCustomerLimiter(\n matched.name,\n matched.rateLimit,\n );\n perSkillKey = freeLlmCustomerKey(job.customerId, matched.name);\n if (!perCustomerLimiter.peek(perSkillKey).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n }\n\n // All checks passed - record the hit against every active limiter.\n customerLimiter.check(job.customerId);\n globalLimiter.check(GLOBAL_LIMITER_KEY);\n if (isFreeLlm && perCustomerLimiter && perSkillKey) {\n this.freeLlmLimiters.globalLimiter.check(FREE_LLM_GLOBAL_KEY);\n perCustomerLimiter.check(perSkillKey);\n }\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. SIGINT and SIGTERM share an idempotent\n // handler so we don't log \"Shutting down...\" twice when both arrive\n // (shells sometimes deliver SIGINT+SIGTERM to the whole process group).\n await new Promise<void>((resolve) => {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n\n let shuttingDown = false;\n const onSignal = (): void => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n log('Shutting down...');\n this.stop();\n setTimeout(() => process.exit(0), 3000).unref();\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n });\n }\n\n /** Drop expired hits from every sliding-window limiter. */\n private cleanupRateLimits(): void {\n this.freeCustomerLimiter.prune();\n this.freeGlobalLimiter.prune();\n this.paidCustomerLimiter.prune();\n this.paidGlobalLimiter.prune();\n this.freeLlmLimiters.globalLimiter.prune();\n this.freeLlmLimiters.prunePerCustomer();\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 /**\n * Resolve a job's execution budget in milliseconds. Per-skill\n * `executionTimeoutSecs` wins over the agent-level `config.executionTimeoutSecs`;\n * `0` (explicit unlimited) and `undefined` both collapse to `0` => no timer.\n */\n private resolveExecutionBudgetMs(skill: import('./skill').Skill): number {\n const secs = skill.executionTimeoutSecs ?? this.config.executionTimeoutSecs ?? 0;\n return secs > 0 ? secs * 1000 : 0;\n }\n\n /**\n * Wrapper with error handling. The execution budget (if any) is enforced\n * around `skill.execute` inside `executeJob`, not here - payment collection\n * and result delivery run on their own bounds. `jobAbort` is retained so\n * `stop()` can still abort an in-flight job.\n */\n private async processJob(job: IncomingJob): Promise<void> {\n const jobAbort = new AbortController();\n this.jobAbortControllers.add(jobAbort);\n try {\n await this.executeJob(job, jobAbort.signal);\n } catch (e: any) {\n const log = this.callbacks.onLog ?? console.log;\n log(`[${job.jobId.slice(0, 8)}] Error: ${e.message}`);\n\n // Status transitions on failure:\n // - `executed`: never markFailed - delivery recovery will retry.\n // - `paid` + `AgentUnavailableError`: keep as `paid` so the recovery\n // loop re-executes once the LLM pair flips back to healthy. The\n // customer paid, so abandoning the job to `failed` would lose\n // their funds with no path back. The recovery loop's gate-aware\n // check (assertReady) and 24h hard cutoff bound the wait.\n // - everything else: markFailed as before.\n const currentStatus = this.ledger.getStatus(job.jobId);\n const keepPaidForRecovery = e instanceof AgentUnavailableError && currentStatus === 'paid';\n if (currentStatus !== 'executed' && !keepPaidForRecovery) {\n this.ledger.markFailed(job.jobId);\n }\n if (keepPaidForRecovery) {\n log(\n `[${job.jobId.slice(0, 8)}] Keeping status=paid; recovery will re-execute when LLM pair recovers (24h cutoff).`,\n );\n }\n // Operator log keeps the full detail (including raw script stderr from a\n // ScriptExecutionError); the customer only ever receives an allowlisted,\n // generic message via `customerSafeMessage`.\n const operatorMessage =\n e instanceof ScriptExecutionError\n ? `${e.message}: ${e.detail}`\n : (e.message ?? 'Unknown error');\n this.callbacks.onJobError?.(job.jobId, operatorMessage);\n\n // W8: only forward known-safe messages to the customer; everything else is\n // masked to a fixed generic string so subprocess/provider internals never leak.\n const safeMessage = customerSafeMessage(e);\n await this.transport\n .sendFeedback(job, { type: 'error', message: safeMessage })\n .catch(() => {});\n } finally {\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 // ── Preflight: gate LLM-dependent jobs against the health monitor\n // before sending payment-required. If the operator's API key has gone\n // invalid/billing-exhausted since startup, refuse the job before the\n // customer pays and before we record anything in the ledger.\n //\n // Two paths feed the gate:\n // - mode === 'llm' uses `resolvedTriple` (provider + model + maxTokens)\n // resolved at startup from agent default + skill override.\n // - script modes use `llmOverride.provider`+`.model` declared in\n // SKILL.md to signal \"this script depends on this API key\"; the\n // runtime registers the same (provider, model) pair with the\n // health monitor in start.ts, so assertReady works identically.\n //\n // Customer-facing message stays generic to avoid leaking billing\n // status; operator log carries the real reason via the throw.\n const matched = this.skills.route(job.tags);\n const healthPair = resolveHealthPair(matched);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n log(`[${job.jobId.slice(0, 8)}] LLM health gate refused job: ${detail}`);\n await this.transport\n .sendFeedback(job, {\n type: 'error',\n message: AGENT_UNAVAILABLE_MESSAGE,\n })\n .catch(() => {});\n return;\n }\n }\n\n // ── Step 1: Resolve per-capability price and collect payment ──\n const jobPrice = resolveJobPrice(job.tags, this.skills);\n const jobAsset = resolveJobAsset(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, jobAsset, 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(\n `[${job.jobId.slice(0, 8)}] Payment confirmed: ${formatAssetAmount(\n jobAsset,\n BigInt(netAmount),\n )}`,\n );\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 // Wrapped so a billing/invalid signal surfaced *during* execution\n // (script exit 42 or LLM 402/401) flips the matching health pair to\n // unhealthy. The next job hitting the same pair will be refused at\n // the preflight gate before payment, instead of sailing through and\n // failing again. Recovery happens via the lazy recovery loop, which\n // re-probes only while the pair is unhealthy.\n // Execution budget (if any) is scoped to `skill.execute` only - payment\n // collection above and delivery below run on their own bounds. The budget\n // timer aborts a dedicated `execAbort` chained to the incoming `signal`\n // (so `stop()` still propagates), and sets `budgetExceeded` so the catch\n // can tell a budget abort apart from a real skill failure - the latter\n // would otherwise flip the health pair via `markHealthFromExecuteError`.\n let output;\n const budgetMs = this.resolveExecutionBudgetMs(skill);\n let budgetExceeded = false;\n const execAbort = new AbortController();\n const onOuterAbort = (): void => execAbort.abort();\n if (signal) {\n if (signal.aborted) {\n execAbort.abort();\n } else {\n signal.addEventListener('abort', onOuterAbort);\n }\n }\n let budgetTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const execPromise = skill.execute(\n {\n data: job.input,\n inputType: job.inputType,\n tags: job.tags,\n jobId: job.jobId,\n },\n { ...this.skillCtx, signal: execAbort.signal },\n );\n // If the budget race rejects first, the skill may settle later; a no-op\n // handler keeps that late settlement from surfacing as an unhandled\n // rejection.\n execPromise.catch(() => {});\n if (budgetMs > 0) {\n // Race the skill against its budget so a skill that ignores the abort\n // signal (or is stuck on a non-abortable await) cannot run past the\n // budget and hold the job slot. `abort()` still asks it to stop\n // (SIGKILL for scripts, next-round check for LLM skills); the race only\n // bounds how long we wait.\n output = await Promise.race([\n execPromise,\n new Promise<never>((_resolve, reject) => {\n budgetTimer = setTimeout(() => {\n budgetExceeded = true;\n execAbort.abort();\n reject(new ExecutionBudgetExceededError(budgetMs));\n }, budgetMs);\n }),\n ]);\n } else {\n output = await execPromise;\n }\n } catch (err) {\n // A budget abort is a clean operator/author limit, not a provider fault:\n // mark it distinctly so it never trips the health monitor.\n if (budgetExceeded) {\n log(`[${job.jobId.slice(0, 8)}] Execution exceeded budget (${budgetMs / 1000}s)`);\n throw new ExecutionBudgetExceededError(budgetMs);\n }\n const flippedToUnhealthy = this.markHealthFromExecuteError(skill, err, log, job.jobId);\n // When the skill failure was the trigger that flipped the health\n // pair to unhealthy, surface a stable \"agent unavailable\" message\n // to the customer rather than the sanitized \"Internal processing\n // error\" string the leaky-API masker would otherwise produce.\n // Recovery happens through the lazy recovery loop.\n if (flippedToUnhealthy) {\n throw new AgentUnavailableError();\n }\n throw err;\n } finally {\n if (budgetTimer) {\n clearTimeout(budgetTimer);\n }\n if (signal) {\n signal.removeEventListener('abort', onOuterAbort);\n }\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 jobAsset: Asset,\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, asset: jobAsset },\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice, protocolConfig.feeBps);\n const netAmount = jobPrice - fee;\n\n log(\n `[${job.jobId.slice(0, 8)}] Payment required: ${formatAssetAmount(jobAsset, BigInt(jobPrice))} ` +\n `(fee: ${formatAssetAmount(jobAsset, BigInt(fee))})`,\n );\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. Two paths run in parallel, both self-bounded:\n // (a) Signature path - subscribe to the customer's payment-completed\n // Nostr feedback, take the tx signature it carries, and verify it\n // directly via `getTransaction(sig, 'confirmed')`. Fast (~1-3s) and\n // cheap on RPC quota. Self-times out after SIG_PATH_TIMEOUT_MS so an\n // abandoned customer does not hold a `p-limit` slot indefinitely.\n // (b) Reference path - SDK's getSignaturesForAddress(reference) loop.\n // Slower and more brittle on the public devnet RPC, but works as a\n // fallback when Nostr feedback is dropped. Self-times out via SDK\n // retry budget (~30s).\n // First `verified: true` wins; if both fail we resolve immediately with\n // the last failure. The outer `deadlineMs` backstop only triggers if both\n // paths somehow hang past their own timeouts.\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const verifyAbort = new AbortController();\n const onOuterAbort = () => verifyAbort.abort();\n if (signal) {\n if (signal.aborted) {\n verifyAbort.abort();\n } else {\n signal.addEventListener('abort', onOuterAbort, { once: true });\n }\n }\n const deadlineMs = this.config.paymentTimeoutSecs * 1000;\n const sigPathTimeoutMs = Math.min(deadlineMs, SIG_PATH_TIMEOUT_MS);\n\n let result: { verified: boolean };\n try {\n result = await new Promise<{ verified: boolean }>((resolve, reject) => {\n let settled = false;\n let pending = 2;\n let lastResult: { verified: boolean } = { verified: false };\n\n const win = (verified: { verified: boolean }) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n resolve(verified);\n };\n\n const lose = (verified: { verified: boolean }, reason: string) => {\n if (settled) {\n return;\n }\n lastResult = verified;\n pending -= 1;\n log(`[${job.jobId.slice(0, 8)}] verify ${reason}`);\n if (pending === 0) {\n settled = true;\n clearTimeout(deadline);\n resolve(lastResult);\n }\n };\n\n // Path (a) - signature path\n this.transport\n .waitForPaymentSignature(job.jobId, job.customerId, verifyAbort.signal, sigPathTimeoutMs)\n .then(async (sig) => {\n if (settled) {\n return;\n }\n if (!sig) {\n lose({ verified: false }, 'sig path: no payment-completed feedback');\n return;\n }\n log(`[${job.jobId.slice(0, 8)}] verify sig path: got ${sig.slice(0, 8)}...`);\n try {\n const verified = await payment.verifyPayment(rpc, request, protocolConfig, {\n txSignature: sig,\n });\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n lose(verified, `sig path: not verified (${reason})`);\n }\n } catch (err) {\n lose(\n { verified: false },\n `sig path error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })\n .catch((err) =>\n lose(\n { verified: false },\n `sig path error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n\n // Path (b) - reference path\n payment\n .verifyPayment(rpc, request, protocolConfig)\n .then((verified) => {\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n lose(verified, `ref path: not verified (${reason})`);\n }\n })\n .catch((err) =>\n lose(\n { verified: false },\n `ref path error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n\n // Hard deadline backstop - guarantees we never hang past paymentTimeoutSecs\n const deadline = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n log(`[${job.jobId.slice(0, 8)}] verify deadline (${deadlineMs}ms) hit`);\n resolve(lastResult);\n }, deadlineMs);\n\n // Outer abort propagation\n if (signal?.aborted) {\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n return;\n }\n signal?.addEventListener(\n 'abort',\n () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n },\n { once: true },\n );\n });\n } finally {\n verifyAbort.abort();\n if (signal) {\n signal.removeEventListener('abort', onOuterAbort);\n }\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 // If any pending `paid` job is parked on an unhealthy LLM pair,\n // fire a probe so the recovery loop's gate (assertReady in\n // recoverSingleJob) sees fresh state on the next tick. The lazy\n // health-recovery loop probes every 5 minutes by itself; we add\n // this trigger so paid jobs don't sit idle for that long once the\n // operator fixes their API key. Fire-and-forget: we don't want to\n // block the per-tick recovery iteration on a network probe.\n if (this.healthMonitor) {\n const snap = this.healthMonitor.snapshot();\n // `unhealthyKeys` is a per-pair set, not deduplicated by provider:\n // we use it only to decide whether to KICK refreshUnhealthy, not\n // to issue probes ourselves. The provider-dedup of probes lives\n // inside `refreshUnhealthy`. Don't re-collapse here - that would\n // mask cases where one provider's pair is `unavailable` while\n // another is `invalid`, which need different probe paths.\n const unhealthyKeys = new Set(\n snap\n .filter(\n (entry) =>\n entry.status === 'invalid' ||\n entry.status === 'billing' ||\n entry.status === 'unavailable',\n )\n .map((entry) => `${entry.provider}::${entry.model}`),\n );\n if (unhealthyKeys.size > 0) {\n const hasPaidOnUnhealthy = pending.some((entry) => {\n if (entry.status !== 'paid') {\n return false;\n }\n const skill = this.skills.route(entry.tags);\n const pair = resolveHealthPair(skill);\n return pair !== null && unhealthyKeys.has(`${pair.provider}::${pair.model}`);\n });\n if (hasPaidOnUnhealthy) {\n void this.healthMonitor.refreshUnhealthy().catch(() => {\n /* probe surfaces its own errors via the snapshot */\n });\n }\n }\n }\n\n for (const entry of pending) {\n const ageMs = (Math.floor(Date.now() / 1000) - entry.created_at) * 1000;\n const expired = ageMs > MAX_PAID_AGE_MS;\n const exhaustedRetries = entry.retry_count >= this.config.recoveryMaxRetries;\n if (expired || exhaustedRetries) {\n this.ledger.markFailed(entry.job_id);\n const reason = expired\n ? 'Job permanently failed: agent did not recover within 24 hours'\n : 'Job permanently failed after maximum retries';\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: reason },\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\n try {\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 - no LLM call, no gate check.\n this.ledger.incrementRetry(entry.job_id);\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 // Gate the retry against the LLM health monitor: if the pair is\n // still unhealthy, skip THIS tick without burning a retry. The\n // outer loop will re-schedule us; a successful probe (lazy\n // recovery loop or explicit refreshUnhealthy) flips the pair\n // back to healthy and the next tick proceeds. Without this\n // check, every recovery tick during a billing outage would\n // re-spawn the script, fail with exit 42, and consume one of\n // the bounded retry slots even though the underlying problem\n // (operator's API key) hasn't been touched yet.\n const healthPair = resolveHealthPair(skill);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n if (err instanceof LlmHealthError) {\n log(\n `[${entry.job_id.slice(0, 8)}] Recovery: pair ${healthPair.provider}/${healthPair.model} still unhealthy (${err.reason}); waiting for recovery probe.`,\n );\n return;\n }\n throw err;\n }\n }\n\n this.ledger.incrementRetry(entry.job_id);\n\n // Re-verify payment if reference was stored but confirmation lost to crash\n if (skill.priceSubunits > 0 && !entry.net_amount) {\n if (entry.payment_request) {\n const verified = await this.reVerifyPayment(\n entry,\n skill.priceSubunits,\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 // Same per-skill execution budget as the primary path, enforced as a\n // race so a non-cooperative skill can't stall recovery past its budget.\n // On budget the race rejects with ExecutionBudgetExceededError, which\n // recoverPendingJobs logs; the entry stays paid/executed and retries on\n // the next sweep (each attempt now bounded by the budget).\n const recoveryBudgetMs = this.resolveExecutionBudgetMs(skill);\n let budgetTimer: ReturnType<typeof setTimeout> | undefined;\n let output;\n try {\n const execPromise = 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 execPromise.catch(() => {});\n if (recoveryBudgetMs > 0) {\n output = await Promise.race([\n execPromise,\n new Promise<never>((_resolve, reject) => {\n budgetTimer = setTimeout(() => {\n recoveryAbort.abort();\n reject(new ExecutionBudgetExceededError(recoveryBudgetMs));\n }, recoveryBudgetMs);\n }),\n ]);\n } else {\n output = await execPromise;\n }\n } finally {\n if (budgetTimer) {\n clearTimeout(budgetTimer);\n }\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 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 priceSubunits: 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(priceSubunits, protocolConfig.feeBps);\n const netAmount = priceSubunits - 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} subunits)`);\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\nimport { toDTag, type Asset } from '@elisym/sdk';\nimport type { SkillRateLimit } from '@elisym/sdk/llm-health';\nimport type { SkillLlmOverride, SkillMode } from '@elisym/sdk/skills';\n\nexport type { SkillLlmOverride, SkillMode, SkillRateLimit };\n\n/**\n * Resolved (provider, model, maxTokens) triple for an LLM-mode skill.\n * Computed once at startup in `start.ts` after `resolveSkillLlm`, then\n * attached to the skill instance so the runtime preflight can read it\n * without re-running resolution from `loaded.yaml`.\n */\nexport interface ResolvedSkillTriple {\n provider: string;\n model: string;\n maxTokens: number;\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 /** Agent-default LLM client. Undefined when every LLM skill overrides. */\n llm?: LlmClient;\n /**\n * Resolve the LLM client for a skill. The runtime caches clients by\n * resolved (provider, model, maxTokens) triple. Pass the skill's\n * `llmOverride` (or undefined for the agent default).\n */\n getLlm?: (override?: SkillLlmOverride) => LlmClient | undefined;\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 /**\n * Price in subunits of `asset` (0 = free). For SOL: lamports (1e-9 SOL).\n * For USDC: 1e-6 USDC. Converted from SKILL.md's human-readable `price`.\n *\n * Number (not bigint) for ergonomics - realistic agent prices fit well\n * below `Number.MAX_SAFE_INTEGER` subunits.\n */\n priceSubunits: number;\n /** Asset the price is denominated in (NATIVE_SOL or USDC_SOLANA_DEVNET, etc.). */\n asset: Asset;\n /** Execution mode (`'llm'` for the historical LLM-orchestrated path). */\n mode: SkillMode;\n /**\n * Per-skill LLM override / dependency.\n *\n * For `mode: 'llm'`: overrides the agent default (provider/model/maxTokens)\n * for runtime LLM execution. The runtime constructs the LLM client from this.\n *\n * For script modes: declares which LLM API key the script depends on so\n * the runtime can health-monitor it (startup probe + reactive markUnhealthy\n * on `SCRIPT_EXIT_BILLING_EXHAUSTED` + lazy recovery). Only `provider` and\n * `model` are meaningful here; `maxTokens` is rejected at parse time.\n */\n llmOverride?: SkillLlmOverride;\n /** Hero image URL. */\n image?: string;\n /** Local file path for hero image (uploaded on first start). */\n imageFile?: string;\n /** On-disk skill directory (e.g. `<agent>/skills/whois-lookup`). */\n dir?: string;\n /**\n * Resolved (provider, model, maxTokens) for `mode: 'llm'` skills. Set\n * once at startup. Undefined for script modes - they use `llmOverride`\n * directly when declared. Read by the runtime to gate against the\n * `LlmHealthMonitor` before sending `payment-required`.\n */\n resolvedTriple?: ResolvedSkillTriple;\n /**\n * Optional per-skill rate limit declared in SKILL.md frontmatter\n * (snake_case `rate_limit` -> camelCase). Applies to any mode but the\n * runtime treats free LLM skills as the primary use case.\n */\n rateLimit?: SkillRateLimit;\n /**\n * Per-skill execution budget in seconds, from SKILL.md `max_execution_secs`\n * (any mode). `0` => explicitly unlimited. `undefined` => the runtime falls\n * through to the agent-level `executionTimeoutSecs`, then to unlimited.\n */\n executionTimeoutSecs?: number;\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 // Match by skill name in canonical d-tag form. Outgoing capability cards\n // publish `['d', toDTag(card.name)]`, so incoming job tags arrive\n // d-tag-shaped (lowercase, ASCII letters + digits + hyphens). Comparing\n // raw `skill.name` only works when the name is already kebab-case;\n // normalize through `toDTag` so human-readable names route too.\n for (const tag of tags) {\n const byName = this.skills.find((skill) => toDTag(skill.name) === tag);\n if (byName) {\n return byName;\n }\n }\n // Then declared capability tags (secondary matching).\n for (const tag of tags) {\n const byCap = this.skills.find((skill) => skill.capabilities.includes(tag));\n if (byCap) {\n return byCap;\n }\n }\n // Default fallback only for genuinely untargeted jobs (no specific tag\n // beyond the 'elisym' protocol marker). A job that *does* carry a\n // specific capability tag must not silently degrade to a free default -\n // that was a payment-bypass vector.\n const hasSpecificTag = tags.some((tag) => tag && tag !== 'elisym');\n if (hasSpecificTag) {\n return null;\n }\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 * CLI wrappers around the non-LLM SDK skill classes. They mirror the\n * pattern in `script-skill.ts` so the CLI's `Skill` interface\n * (`priceSubunits: number`, `mode`, `dir`) stays uniform across all\n * execution modes while delegating actual work to the shared SDK runners.\n */\nimport type { Asset } from '@elisym/sdk';\nimport {\n DynamicScriptSkill as SdkDynamicScriptSkill,\n StaticFileSkill as SdkStaticFileSkill,\n StaticScriptSkill as SdkStaticScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\ninterface BaseParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n image?: string;\n imageFile?: string;\n /** On-disk skill directory. */\n dir: string;\n /**\n * For script modes: declared LLM dependency (provider+model). When set,\n * the runtime registers the pair with the health monitor and gates jobs\n * against it.\n */\n llmOverride?: SkillLlmOverride;\n}\n\nexport interface CliStaticFileSkillParams extends BaseParams {\n outputFilePath: string;\n}\n\nexport class StaticFileSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-file';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticFileSkill;\n\n constructor(params: CliStaticFileSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticFileSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n outputFilePath: params.outputFilePath,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport interface CliScriptSkillParams extends BaseParams {\n scriptPath: string;\n scriptArgs: string[];\n scriptTimeoutMs?: number;\n /** Full env for the script. CLI builds this from `process.env` + decrypted secrets. */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport class StaticScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport class DynamicScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'dynamic-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkDynamicScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkDynamicScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI ScriptSkill - thin wrapper over `@elisym/sdk/skills` ScriptSkill.\n *\n * Preserves the CLI's historical positional constructor and Skill\n * interface shape (priceSubunits as number, mutable image/imageFile\n * fields) while delegating all execution logic to the shared SDK\n * runner - so tool-use, spawn, max_tool_rounds, and timeout behaviour\n * stay identical to the plugin / SDK path.\n */\nimport { NATIVE_SOL, type Asset } from '@elisym/sdk';\nimport {\n ScriptSkill as SdkScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n type SkillToolDef,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\n/**\n * CLI ScriptSkill constructor with a back-compat positional signature.\n *\n * The `asset` parameter is accepted in two positions:\n * - 5th (new code: `new ScriptSkill(name, desc, caps, price, asset, image, imageFile, dir,\n * prompt, tools, rounds)`) - preferred for USDC/multi-asset.\n * - As part of a trailing `{ asset }` init; else falls through to NATIVE_SOL\n * when the 5th positional slot is `undefined` / is actually an `image` string.\n *\n * This preserves older `new ScriptSkill(name, desc, caps, price, image, ...)` call sites\n * (internal tests) so we do not have to touch them to land USDC support.\n */\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'llm';\n readonly llmOverride?: SkillLlmOverride;\n image?: string;\n imageFile?: string;\n dir: string;\n private inner: SdkScriptSkill;\n\n constructor(\n name: string,\n description: string,\n capabilities: string[],\n priceSubunits: number,\n assetOrImage: Asset | string | undefined,\n imageOrImageFile: string | undefined,\n imageFileOrDir: string | undefined,\n dirOrPrompt: string,\n promptOrTools: string | SkillToolDef[],\n toolsOrRounds: SkillToolDef[] | number,\n rounds?: number,\n llmOverride?: SkillLlmOverride,\n ) {\n // Detect the new-style (asset passed as 5th arg) vs legacy-style (asset\n // omitted, image at 5th arg). An Asset has the shape { chain, token, decimals, symbol }.\n let asset: Asset;\n let image: string | undefined;\n let imageFile: string | undefined;\n let skillDir: string;\n let systemPrompt: string;\n let tools: SkillToolDef[];\n let maxToolRounds: number;\n\n if (assetOrImage !== undefined && typeof assetOrImage === 'object' && 'token' in assetOrImage) {\n // new-style: assetOrImage is Asset\n asset = assetOrImage;\n image = imageOrImageFile;\n imageFile = imageFileOrDir;\n skillDir = dirOrPrompt;\n systemPrompt = promptOrTools as string;\n tools = toolsOrRounds as SkillToolDef[];\n maxToolRounds = rounds as number;\n } else {\n // legacy-style: 5th arg is `image` (string or undefined), asset=NATIVE_SOL.\n asset = NATIVE_SOL;\n image = assetOrImage as string | undefined;\n imageFile = imageOrImageFile;\n skillDir = imageFileOrDir as string;\n systemPrompt = dirOrPrompt;\n tools = promptOrTools as SkillToolDef[];\n maxToolRounds = toolsOrRounds as number;\n }\n\n this.name = name;\n this.description = description;\n this.capabilities = capabilities;\n this.priceSubunits = priceSubunits;\n this.asset = asset;\n this.llmOverride = llmOverride;\n this.image = image;\n this.imageFile = imageFile;\n this.dir = skillDir;\n this.inner = new SdkScriptSkill({\n name,\n description,\n capabilities,\n priceSubunits: BigInt(Math.round(priceSubunits)),\n asset,\n skillDir,\n systemPrompt,\n tools,\n maxToolRounds,\n llmOverride,\n image,\n imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI skill loader. Delegates SKILL.md parsing + validation to\n * `@elisym/sdk/skills` (one source of truth across plugin + CLI) and\n * constructs CLI's wrapper instances. CLI keeps its own Skill interface\n * (`priceSubunits: number` + `asset` + `mode`) so existing runtime.ts\n * call sites stay byte-for-byte compatible while supporting USDC and\n * non-LLM execution modes.\n */\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n DEFAULT_SCRIPT_TIMEOUT_MS,\n parseSkillMd,\n resolveInsidePath,\n validateSkillFrontmatter,\n type ParsedSkill,\n} from '@elisym/sdk/skills';\nimport { DynamicScriptSkill, StaticFileSkill, StaticScriptSkill } from './non-llm-skills.js';\nimport { ScriptSkill } from './script-skill.js';\nimport type { Skill } from './index.js';\n\nfunction buildCliSkill(\n parsed: ParsedSkill,\n entryPath: string,\n scriptEnv: NodeJS.ProcessEnv | undefined,\n): Skill {\n let skill: Skill;\n switch (parsed.mode) {\n case 'llm':\n skill = new ScriptSkill(\n parsed.name,\n parsed.description,\n parsed.capabilities,\n Number(parsed.priceSubunits),\n parsed.asset,\n parsed.image,\n parsed.imageFile,\n entryPath,\n parsed.systemPrompt,\n parsed.tools,\n parsed.maxToolRounds,\n parsed.llmOverride,\n );\n break;\n case 'static-file': {\n if (parsed.outputFile === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - outputFile missing for mode 'static-file'`,\n );\n }\n const outputFilePath = resolveInsidePath(entryPath, parsed.outputFile);\n if (!outputFilePath) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": \"output_file\" must stay inside the skill directory`,\n );\n }\n skill = new StaticFileSkill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n outputFilePath,\n image: parsed.image,\n imageFile: parsed.imageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n case 'static-script':\n case 'dynamic-script': {\n if (parsed.script === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - script missing for mode '${parsed.mode}'`,\n );\n }\n const scriptPath = resolveInsidePath(entryPath, parsed.script);\n if (!scriptPath) {\n throw new Error(`SKILL.md \"${parsed.name}\": \"script\" must stay inside the skill directory`);\n }\n const Ctor = parsed.mode === 'static-script' ? StaticScriptSkill : DynamicScriptSkill;\n skill = new Ctor({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n scriptPath,\n scriptArgs: parsed.scriptArgs,\n scriptTimeoutMs: parsed.scriptTimeoutMs ?? DEFAULT_SCRIPT_TIMEOUT_MS,\n scriptEnv,\n image: parsed.image,\n imageFile: parsed.imageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n }\n if (parsed.rateLimit) {\n skill.rateLimit = parsed.rateLimit;\n }\n if (parsed.executionTimeoutSecs !== undefined) {\n skill.executionTimeoutSecs = parsed.executionTimeoutSecs;\n }\n return skill;\n}\n\nexport interface LoadSkillsOptions {\n /**\n * Env propagated into script-mode skills (`static-script`, `dynamic-script`).\n * Typically `{ ...process.env, <PROVIDER_KEY>: <decrypted-secret>, ... }`\n * built from the agent's encrypted secrets, so scripts get the same\n * provider keys that LLM-mode skills already enjoy.\n */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport function loadSkillsFromDir(skillsDir: string, options: LoadSkillsOptions = {}): 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 const parsed = validateSkillFrontmatter(frontmatter, systemPrompt, {\n allowFreeSkills: true,\n });\n skills.push(buildCliSkill(parsed, entryPath, options.scriptEnv));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.warn(` ! Skipping skill \"${entry}\": ${message}`);\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, KIND_JOB_FEEDBACK, jobRequestKind } from '@elisym/sdk';\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport { verifyEvent, type Event, type Filter } 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 /**\n * Wait for the customer's `payment-completed` feedback for a specific job\n * and return the on-chain Solana tx signature it carries.\n *\n * The customer publishes this event right after `confirmTransaction(... 'confirmed')`\n * succeeds (see packages/app/app/hooks/useBuyCapability.ts), so receiving it\n * lets the provider verify the payment with a single targeted\n * `getTransaction(sig, commitment: 'confirmed')` call instead of the\n * heavyweight `getSignaturesForAddress(reference)` index lookup. This is\n * dramatically more reliable on the public devnet RPC, which throttles and\n * lags the address index.\n *\n * Resolves with `null` if `signal` aborts or `timeoutMs` elapses before a\n * valid signature arrives. The timeout exists so a customer that disappears\n * after job submission does not hold a `p-limit` slot for the full payment\n * expiry window - without it this path waits forever on the relay.\n */\n waitForPaymentSignature(\n jobId: string,\n customerPubkey: string,\n signal: AbortSignal,\n timeoutMs?: number,\n ): Promise<string | null> {\n return new Promise((resolve) => {\n let settled = false;\n const filter: Filter = {\n kinds: [KIND_JOB_FEEDBACK],\n '#e': [jobId],\n authors: [customerPubkey],\n '#t': ['elisym'],\n since: Math.floor(Date.now() / 1000) - 5,\n };\n\n const finish = (sig: string | null) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer) {\n clearTimeout(timer);\n }\n signal.removeEventListener('abort', onAbort);\n sub.close();\n resolve(sig);\n };\n\n const sub = this.client.pool.subscribe(filter, (event: Event) => {\n if (settled) {\n return;\n }\n if (!verifyEvent(event)) {\n return;\n }\n const status = event.tags.find((t) => t[0] === 'status')?.[1];\n if (status !== 'payment-completed') {\n return;\n }\n const txTag = event.tags.find((t) => t[0] === 'tx');\n const sig = txTag?.[1];\n const chain = txTag?.[2];\n if (typeof sig !== 'string' || sig.length === 0) {\n return;\n }\n // Chain tag is optional for backwards compatibility, but if present it\n // must be 'solana' - we cannot verify a signature on another chain.\n if (chain !== undefined && chain !== 'solana') {\n return;\n }\n finish(sig);\n });\n\n const onAbort = () => finish(null);\n const timer =\n timeoutMs !== undefined && timeoutMs > 0 ? setTimeout(() => finish(null), timeoutMs) : null;\n\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\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 * Three independent triggers force a pool reset:\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 * - `sleep-detect`: if the wall-clock gap between two consecutive ticks exceeds\n * `min(probeInterval, selfPingInterval) * SLEEP_DETECT_MULTIPLIER`, the host\n * was almost certainly suspended (macOS sleep, hibernation, container pause).\n * On suspend the WebSocket connections die from the relay side, but the next\n * probe may still pass via a freshly opened query - meanwhile the long-lived\n * ping subscription stays dead. Forcing a reset on the first post-suspend\n * tick avoids that window.\n */\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport type { Logger } from 'pino';\nimport {\n WATCHDOG_PROBE_INTERVAL_MS,\n WATCHDOG_PROBE_TIMEOUT_MS,\n WATCHDOG_SELF_PING_INTERVAL_MS,\n WATCHDOG_SELF_PING_TIMEOUT_MS,\n WATCHDOG_SLEEP_DETECT_MULTIPLIER,\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 /** Optional structured logger for pool-reset and probe events. */\n logger?: Logger;\n probeIntervalMs?: number;\n probeTimeoutMs?: number;\n selfPingIntervalMs?: number;\n selfPingTimeoutMs?: number;\n /**\n * Optional `Date.now`-style provider. Tests inject a controlled clock to\n * simulate macOS sleep without firing intermediate `setInterval` callbacks\n * (see watchdog.test.ts). Production should leave this unset.\n */\n now?: () => 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 logger,\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 now = Date.now,\n } = deps;\n\n let pingSub: SubCloser = client.ping.subscribeToPings(identity, onPing);\n let stopped = false;\n // Separate flags: a slow probe must not suppress the self-ping that follows,\n // since they exercise different layers (short query vs. live subscription).\n let probeBusy = false;\n let selfPingBusy = false;\n let lastTickAt = now();\n\n const sleepDetectThresholdMs =\n Math.min(probeIntervalMs, selfPingIntervalMs) * WATCHDOG_SLEEP_DETECT_MULTIPLIER;\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 /**\n * Returns `true` if a wall-clock gap larger than the configured threshold\n * was observed since the last tick - in which case it has already forced a\n * pool reset and the caller should skip its normal health check. Each tick\n * (probe and self-ping) updates the shared `lastTickAt`, so consecutive\n * normal ticks see a gap close to one interval.\n */\n const detectAndHandleSleep = (): boolean => {\n const tickedAt = now();\n const delta = tickedAt - lastTickAt;\n lastTickAt = tickedAt;\n if (delta <= sleepDetectThresholdMs) {\n return false;\n }\n log(\n `[watchdog] tick gap ${delta}ms exceeds ${sleepDetectThresholdMs}ms threshold, ` +\n `forcing pool reset (host suspend / sleep detected)`,\n );\n logger?.info({ event: 'pool_reset', reason: 'sleep_detected', gapMs: delta }, 'pool reset');\n resetPoolAndResubscribe();\n return true;\n };\n\n const probeTimer = setInterval(async () => {\n if (stopped) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (probeBusy) {\n return;\n }\n probeBusy = 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 logger?.info({ event: 'pool_reset', reason: 'probe_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] probe/reset error: ${errorMessage}`);\n logger?.warn({ event: 'probe_error', error: errorMessage }, 'watchdog probe/reset error');\n } finally {\n probeBusy = 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) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (selfPingBusy) {\n return;\n }\n selfPingBusy = 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 logger?.info({ event: 'pool_reset', reason: 'self_ping_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] self-ping/reset error: ${errorMessage}`);\n logger?.warn(\n { event: 'self_ping_error', error: errorMessage },\n 'watchdog self-ping/reset error',\n );\n } finally {\n selfPingBusy = 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 SOL and USDC balance.\n */\nimport { USDC_SOLANA_DEVNET, formatAssetAmount, formatSol } from '@elisym/sdk';\nimport { loadAgent, listAgents } from '@elisym/sdk/agent-store';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { fetchUsdcBalance, getRpcUrl } from '../helpers.js';\n\nexport async function cmdWallet(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\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.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n if (!solPayment?.address) {\n console.error('Solana address not configured for this agent.');\n process.exit(1);\n }\n\n const rpcUrl = getRpcUrl(solPayment.network);\n const rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solPayment.address);\n const { value: balance } = await rpc.getBalance(walletAddress).send();\n const usdcBalance = await fetchUsdcBalance(rpc, walletAddress);\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${solPayment.network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` SOL balance: ${formatSol(Number(balance))} (${balance} lamports)`);\n console.log(` USDC balance: ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}\\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/llm/providers/http.ts","../src/llm/providers/anthropic.ts","../src/llm/providers/openai-compatible.ts","../src/llm/providers/deepseek.ts","../src/llm/providers/google.ts","../src/llm/providers/openai.ts","../src/llm/providers/xai.ts","../src/llm/registry.ts","../src/llm/index.ts","../src/commands/init.ts","../src/index.ts","../src/commands/profile.ts","../src/diagnostics.ts","../src/helpers.ts","../src/ledger.ts","../src/commands/start.ts","../src/llm/resolve.ts","../src/llm/cache.ts","../src/llm/keys.ts","../src/logging.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/non-llm-skills.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":["resolve","bodyLooksLikeBilling","fetchModels","verifyKey","verifyKeyDeep","DEFAULT_MAX_TOKENS","DEFAULT_MODEL","FALLBACK_MODELS","BILLING_BODY_MARKERS","descriptor","yaml","isAddress","writeSecrets","readFileSync","skillList","calculateProtocolFee","SdkStaticFileSkill","SdkStaticScriptSkill","SdkDynamicScriptSkill","NATIVE_SOL","SdkScriptSkill","join","decodeJobPayload","createSolanaRpc","address","formatAssetAmount","USDC_SOLANA_DEVNET","RELAYS","basename","jobRequestKind","toDTag","dirname","listAgents","cmdInit","loadAgent","isEncrypted","formatSol","ElisymIdentity","nip19"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared HTTP helpers for provider clients: timeout-aware fetch and a\n * retry wrapper that handles 429/5xx with exponential backoff and\n * `Retry-After`. Provider descriptors compose these so each new\n * provider does not re-derive timeout/abort plumbing.\n */\n\n// `ReadableStream` is a runtime global in Bun/Node but is not declared by this\n// package's TS lib; import the typed constructor from node:stream/web.\nimport { ReadableStream } from 'node:stream/web';\n\n// Per-HTTP-request timeout for LLM calls. This is a backstop against a hung\n// socket, not the job's execution ceiling - the per-job AbortSignal (driven by\n// the skill/agent execution budget) is wired into every fetch and is the real\n// limit. Default is generous so one large single-shot generation is not cut\n// off; operators with heavier skills raise it via `ELISYM_LLM_TIMEOUT_MS`. Kept\n// modest enough that `max_tool_rounds x LLM_TIMEOUT_MS` stays a sane implicit\n// ceiling when a skill runs with no execution budget (unlimited).\nconst DEFAULT_LLM_TIMEOUT_MS = 600_000; // 10 minutes\n\nfunction resolveLlmTimeoutMs(): number {\n const raw = process.env.ELISYM_LLM_TIMEOUT_MS;\n if (raw === undefined) {\n return DEFAULT_LLM_TIMEOUT_MS;\n }\n const parsed = Number(raw);\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LLM_TIMEOUT_MS;\n}\n\nconst LLM_TIMEOUT_MS = resolveLlmTimeoutMs();\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n return err;\n}\n\nfunction sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = (): void => {\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\nexport async 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 = (): void => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n let toreDown = false;\n const teardown = (): void => {\n if (toreDown) {\n return;\n }\n toreDown = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: controller.signal });\n } catch (error) {\n // Headers phase failed or was aborted - nothing more to cover.\n teardown();\n throw error;\n }\n\n // FIX #31: the timeout/abort wiring (`timer` + parent `signal`) must stay\n // armed across the body read, not be torn down the moment `fetch()` resolves\n // the headers. Callers consume the body right after this returns\n // (`response.json()` / `.text()`), which still streams over the same socket;\n // tearing the wiring down in a `finally` here left that phase unbounded.\n //\n // The returned `Response`'s body methods are read-only, so instead of\n // patching them we tap the underlying body stream and rebuild the `Response`\n // over a stream we control. Teardown runs when the body is fully read\n // (reader reports `done`), when the read errors, or when the consumer\n // cancels the body (`response.body?.cancel()`) - covering every body-phase\n // exit. `controller.signal` still backs the original stream, so a stall\n // mid-body trips `timer`, which aborts the read and rejects the pull. The\n // new `Response` preserves status / statusText / headers and all\n // body-consuming methods, so there are no call-site changes. A 204/no-body\n // response has nothing to wait on, so teardown is immediate.\n const body = response.body;\n // No readable stream to bound (204/no-body, or a non-stream body e.g. in tests):\n // nothing to keep the wiring armed for, so tear down and return as-is.\n if (!body || typeof body.getReader !== 'function') {\n teardown();\n return response;\n }\n\n const reader = body.getReader();\n const tappedStream = new ReadableStream<Uint8Array>({\n async pull(streamController) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n teardown();\n streamController.close();\n return;\n }\n streamController.enqueue(value);\n } catch (error) {\n teardown();\n streamController.error(error);\n }\n },\n cancel(reason) {\n teardown();\n return reader.cancel(reason);\n },\n });\n\n return new Response(tappedStream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n let response: Response;\n try {\n response = await fetchWithTimeout(url, init, signal);\n } catch (error) {\n const name = error instanceof Error ? error.name : '';\n if (attempt >= MAX_RETRIES || name === 'AbortError') {\n throw error;\n }\n await sleepWithSignal(Math.min(1000 * 2 ** attempt, 8000), signal);\n continue;\n }\n if (response.ok || attempt >= MAX_RETRIES || !RETRYABLE_STATUSES.has(response.status)) {\n return response;\n }\n const retryAfter = response.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 response.body?.cancel().catch(() => undefined);\n await sleepWithSignal(delay, signal);\n }\n}\n","/**\n * Anthropic provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. Imports from the registry\n * are type-only to keep the dependency edge one-way.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'claude-haiku-4-5-20251001';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['claude-sonnet-4-6', 'claude-haiku-4-5-20251001', 'claude-opus-4-6'];\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n}\n\ninterface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n}\n\ninterface AnthropicResponse {\n content?: AnthropicContentBlock[];\n usage?: AnthropicUsage;\n}\n\ninterface AnthropicClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport class AnthropicClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: AnthropicClientConfig) {}\n\n private logTokens(usage: AnthropicUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.input_tokens ?? 0;\n const outputTokens = usage.output_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = 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 if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const textBlock = data.content?.find((block) => block.type === 'text');\n return textBlock?.text ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const anthropicTools = tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n }));\n\n const response = 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 if (!response.ok) {\n throw new Error(`Anthropic API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as AnthropicResponse;\n this.logTokens(data.usage);\n const content = data.content ?? [];\n\n const toolUses = content.filter((block) => block.type === 'tool_use');\n if (toolUses.length > 0) {\n const calls: ToolCall[] = toolUses.map((block) => ({\n id: block.id ?? '',\n name: block.name ?? '',\n arguments: block.input ?? {},\n }));\n return {\n type: 'tool_use',\n calls,\n assistantMessage: { role: 'assistant', content },\n };\n }\n const textBlock = content.find((block) => block.type === 'text');\n return { type: 'text', text: textBlock?.text ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return [\n {\n role: 'user',\n content: results.map((result) => ({\n type: 'tool_result',\n tool_use_id: result.callId,\n content: result.content,\n })),\n },\n ];\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1000',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? []).map((entry) => entry.id).sort();\n return models.length > 0 ? models : FALLBACK_MODELS;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/models?limit=1',\n {\n method: 'GET',\n headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes the messages endpoint with\n * max_tokens=1. Costs a fraction of a cent per probe but distinguishes\n * billing-exhausted accounts from valid ones - `/v1/models` returns 200\n * even when the org has $0 balance.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.anthropic.com/v1/messages',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 1,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const ANTHROPIC_PROVIDER: LlmProviderDescriptor = {\n id: 'anthropic',\n displayName: 'Anthropic (Claude)',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new AnthropicClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n};\n","/**\n * Shared OpenAI-compatible client + descriptor factory.\n *\n * Powers providers that speak the OpenAI Chat Completions wire format\n * (xAI, Google's Gemini compat endpoint, DeepSeek). The native OpenAI\n * descriptor lives in `./openai.ts` and stays separate because it\n * carries OpenAI-specific reasoning-model quirks (`max_completion_tokens`,\n * `developer` role) the others don't need.\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { CreateLlmClientConfig, LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_BILLING_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAICompatibleClientConfig {\n apiKey: string;\n baseUrl: string;\n model: string;\n maxTokens: number;\n /** Provider name used in error messages (e.g. \"xAI\", \"Google\", \"DeepSeek\"). */\n providerLabel: string;\n logUsage?: boolean;\n}\n\nexport class OpenAICompatibleClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAICompatibleClientConfig) {}\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/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 max_tokens: this.config.maxTokens,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const response = await fetchWithRetry(\n `${this.config.baseUrl}/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 max_tokens: this.config.maxTokens,\n messages: [{ role: 'system', content: systemPrompt }, ...messages],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(\n `${this.config.providerLabel} API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nexport interface OpenAICompatibleProviderConfig {\n id: string;\n displayName: string;\n envVar: string;\n /** Base URL up to but not including `/chat/completions` or `/models`, no trailing slash. */\n baseUrl: string;\n defaultModel: string;\n fallbackModels: string[];\n /**\n * Optional transform applied to each `data[].id` returned by `/models`.\n * Returning `null` drops the entry. Use to strip prefixes (Gemini's\n * compat endpoint returns `models/<id>`) or filter non-chat models.\n */\n mapModelId?: (id: string) => string | null;\n /** Extra billing-detection markers concatenated with the shared defaults. */\n extraBillingMarkers?: string[];\n}\n\nexport function createOpenAICompatibleProvider(\n config: OpenAICompatibleProviderConfig,\n): LlmProviderDescriptor {\n const billingMarkers = [...DEFAULT_BILLING_MARKERS, ...(config.extraBillingMarkers ?? [])];\n\n function bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return billingMarkers.some((marker) => lower.includes(marker));\n }\n\n async function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (!response.ok) {\n return config.fallbackModels;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const transformed: string[] = [];\n for (const entry of data.data ?? []) {\n const mapped = config.mapModelId ? config.mapModelId(entry.id) : entry.id;\n if (mapped) {\n transformed.push(mapped);\n }\n }\n transformed.sort();\n return transformed.length > 0 ? transformed : config.fallbackModels;\n } catch {\n return config.fallbackModels;\n }\n }\n\n async function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/models`,\n { method: 'GET', headers: { Authorization: `Bearer ${apiKey}` } },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n async function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n ): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n `${config.baseUrl}/chat/completions`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n // Some xAI / DeepSeek model variants are reasoning models that\n // burn output tokens on internal chain-of-thought before any\n // visible reply; with `max_tokens: 1` the API returns HTTP 400\n // and we falsely flip the (provider, model) pair to unhealthy\n // on a valid key. 256 leaves room for the minimum reasoning\n // budget on every current variant; for non-reasoning models\n // the probe still stops at the first natural token, so the\n // extra ceiling does not change the per-probe cost in\n // practice.\n max_tokens: 256,\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if ((response.status === 400 || response.status === 429) && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n }\n\n function createClient(clientConfig: CreateLlmClientConfig): LlmClient {\n return new OpenAICompatibleClient({\n apiKey: clientConfig.apiKey,\n baseUrl: config.baseUrl,\n model: clientConfig.model ?? config.defaultModel,\n maxTokens: clientConfig.maxTokens ?? DEFAULT_MAX_TOKENS,\n providerLabel: config.displayName,\n logUsage: clientConfig.logUsage,\n });\n }\n\n return {\n id: config.id,\n displayName: config.displayName,\n envVar: config.envVar,\n defaultModel: config.defaultModel,\n fallbackModels: config.fallbackModels,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient,\n };\n}\n","/**\n * DeepSeek provider descriptor.\n *\n * DeepSeek's API is OpenAI-compatible at `https://api.deepseek.com/v1`,\n * so this is a thin wrapper around `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'deepseek-chat';\nconst FALLBACK_MODELS = ['deepseek-chat', 'deepseek-reasoner'];\n\nexport const DEEPSEEK_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'deepseek',\n displayName: 'DeepSeek',\n envVar: 'DEEPSEEK_API_KEY',\n baseUrl: 'https://api.deepseek.com/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Google (Gemini) provider descriptor.\n *\n * Uses Google's OpenAI-compatible endpoint at\n * `https://generativelanguage.googleapis.com/v1beta/openai`. The\n * `/models` route returns ids prefixed with `models/`; the model id\n * mapper strips that prefix and drops non-Gemini entries (embeddings,\n * legacy PaLM, etc.) so the picker only shows usable chat models.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'gemini-2.5-flash';\nconst FALLBACK_MODELS = ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.0-flash'];\nconst MODELS_PREFIX = 'models/';\n\nfunction mapGeminiModelId(id: string): string | null {\n const stripped = id.startsWith(MODELS_PREFIX) ? id.slice(MODELS_PREFIX.length) : id;\n return stripped.startsWith('gemini') ? stripped : null;\n}\n\nexport const GOOGLE_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'google',\n displayName: 'Google (Gemini)',\n envVar: 'GEMINI_API_KEY',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n mapModelId: mapGeminiModelId,\n});\n","/**\n * OpenAI provider descriptor + client.\n *\n * Exports a pure `LlmProviderDescriptor`; `../registry.ts` imports it\n * statically and registers it at module init. The client also handles\n * the reasoning-model quirk (o1/o3/o4 + gpt-5 family use\n * `max_completion_tokens` and `developer` role instead of `max_tokens`\n * and `system`).\n */\n\nimport type {\n CompletionResult,\n LlmClient,\n ToolCall,\n ToolDef,\n ToolResult,\n} from '@elisym/sdk/skills';\nimport type { LlmKeyVerification, LlmProviderDescriptor } from '../registry';\nimport { fetchWithRetry, fetchWithTimeout } from './http';\n\nconst DEFAULT_MODEL = 'gpt-4o-mini';\nconst DEFAULT_MAX_TOKENS = 4096;\nconst FALLBACK_MODELS = ['gpt-4o', 'gpt-4o-mini', 'o3-mini'];\n\ninterface OpenAIToolCall {\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface OpenAIMessage {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n}\n\ninterface OpenAIUsage {\n prompt_tokens?: number;\n completion_tokens?: number;\n}\n\ninterface OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n usage?: OpenAIUsage;\n}\n\ninterface OpenAIClientConfig {\n apiKey: string;\n model: string;\n maxTokens: number;\n logUsage?: boolean;\n}\n\nexport function isOpenAIReasoningModel(model: string): boolean {\n return /^o\\d/.test(model) || /^gpt-5(\\b|[-.])/.test(model);\n}\n\nexport class OpenAIClient implements LlmClient {\n private totalIn = 0;\n private totalOut = 0;\n\n constructor(private readonly config: OpenAIClientConfig) {}\n\n private isReasoningModel(): boolean {\n return isOpenAIReasoningModel(this.config.model);\n }\n\n private logTokens(usage: OpenAIUsage | undefined): void {\n if (!this.config.logUsage || !usage) {\n return;\n }\n const inputTokens = usage.prompt_tokens ?? 0;\n const outputTokens = usage.completion_tokens ?? 0;\n this.totalIn += inputTokens;\n this.totalOut += outputTokens;\n console.log(\n ` [LLM] ${this.config.model} tokens: in=${inputTokens} out=${outputTokens} (total: in=${this.totalIn} out=${this.totalOut})`,\n );\n }\n\n async complete(systemPrompt: string, userInput: string, signal?: AbortSignal): Promise<string> {\n const reasoning = this.isReasoningModel();\n const response = 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 ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n { role: 'user', content: userInput },\n ],\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n return data.choices?.[0]?.message?.content ?? '';\n }\n\n async completeWithTools(\n systemPrompt: string,\n messages: unknown[],\n tools: ToolDef[],\n signal?: AbortSignal,\n ): Promise<CompletionResult> {\n const openaiTools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n tool.parameters.map((param) => [\n param.name,\n { type: 'string', description: param.description },\n ]),\n ),\n required: tool.parameters.filter((param) => param.required).map((param) => param.name),\n },\n },\n }));\n\n const reasoning = this.isReasoningModel();\n const response = 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 ...(reasoning\n ? { max_completion_tokens: this.config.maxTokens }\n : { max_tokens: this.config.maxTokens }),\n messages: [\n { role: reasoning ? 'developer' : 'system', content: systemPrompt },\n ...messages,\n ],\n tools: openaiTools,\n }),\n },\n signal,\n );\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.status} ${await response.text()}`);\n }\n const data = (await response.json()) as OpenAIResponse;\n this.logTokens(data.usage);\n const message = data.choices?.[0]?.message;\n const toolCalls = message?.tool_calls ?? [];\n\n if (toolCalls.length > 0) {\n const calls: ToolCall[] = toolCalls.map((call) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.function?.arguments ?? '{}') as Record<string, unknown>;\n } catch {\n args = {};\n }\n return { id: call.id ?? '', name: call.function?.name ?? '', arguments: args };\n });\n return { type: 'tool_use', calls, assistantMessage: message };\n }\n return { type: 'text', text: message?.content ?? '' };\n }\n\n formatToolResultMessages(results: ToolResult[]): unknown[] {\n return results.map((result) => ({\n role: 'tool',\n tool_call_id: result.callId,\n content: result.content,\n }));\n }\n}\n\nasync function fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (!response.ok) {\n return FALLBACK_MODELS;\n }\n const data = (await response.json()) as { data?: { id: string }[] };\n const models = (data.data ?? [])\n .map((entry) => entry.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;\n } catch {\n return FALLBACK_MODELS;\n }\n}\n\nasync function verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification> {\n try {\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/models',\n {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient_quota', 'insufficient'];\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Deep verification: actually invokes chat completions with\n * max_tokens=1. Distinguishes billing-exhausted accounts from valid ones,\n * including OpenAI's specific 429 + `insufficient_quota` body shape.\n *\n * Use this at startup, runtime preflight, and heartbeat. Use the cheap\n * `verifyKey` only for UI commands where billing isn't relevant.\n */\nasync function verifyKeyDeep(\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n try {\n const reasoning = isOpenAIReasoningModel(model);\n const response = await fetchWithTimeout(\n 'https://api.openai.com/v1/chat/completions',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n // GPT-5 reasoning models count internal chain-of-thought tokens\n // against `max_completion_tokens`. With a budget of 1 the model\n // exhausts it on reasoning before producing any visible content\n // and the API responds HTTP 400 (\"max_tokens reached\") - which\n // would falsely flip the (provider, model) pair to unhealthy on\n // an otherwise valid key. 256 covers a \".\" prompt's reasoning\n // budget on every current GPT-5 variant we tested with margin;\n // non-reasoning models still take max_tokens: 1 since they emit\n // visible content directly. Probe cost stays sub-cent per\n // startup probe (reasoning tokens are billed at output rates).\n ...(reasoning ? { max_completion_tokens: 256 } : { max_tokens: 1 }),\n messages: [{ role: 'user', content: '.' }],\n }),\n },\n signal,\n );\n if (response.ok) {\n await response.body?.cancel().catch(() => undefined);\n return { ok: true };\n }\n const body = (await response.text().catch(() => '')).slice(0, 500);\n if (response.status === 401 || response.status === 403) {\n return { ok: false, reason: 'invalid', status: response.status, body };\n }\n if (response.status === 402) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 429 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n if (response.status === 400 && bodyLooksLikeBilling(body)) {\n return { ok: false, reason: 'billing', status: response.status, body };\n }\n return {\n ok: false,\n reason: 'unavailable',\n error: `HTTP ${response.status}: ${body.slice(0, 200)}`,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: 'unavailable', error: message };\n }\n}\n\nexport const OPENAI_PROVIDER: LlmProviderDescriptor = {\n id: 'openai',\n displayName: 'OpenAI (GPT)',\n envVar: 'OPENAI_API_KEY',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n fetchModels,\n verifyKey,\n verifyKeyDeep,\n createClient: (config) =>\n new OpenAIClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n logUsage: config.logUsage,\n }),\n isReasoningModel: isOpenAIReasoningModel,\n};\n","/**\n * xAI (Grok) provider descriptor.\n *\n * xAI exposes an OpenAI-compatible Chat Completions endpoint at\n * `https://api.x.ai/v1`, so this is a thin wrapper around\n * `createOpenAICompatibleProvider`.\n */\n\nimport type { LlmProviderDescriptor } from '../registry';\nimport { createOpenAICompatibleProvider } from './openai-compatible';\n\nconst DEFAULT_MODEL = 'grok-3-mini';\nconst FALLBACK_MODELS = ['grok-4', 'grok-3', 'grok-3-mini'];\n\nexport const XAI_PROVIDER: LlmProviderDescriptor = createOpenAICompatibleProvider({\n id: 'xai',\n displayName: 'xAI (Grok)',\n envVar: 'XAI_API_KEY',\n baseUrl: 'https://api.x.ai/v1',\n defaultModel: DEFAULT_MODEL,\n fallbackModels: FALLBACK_MODELS,\n});\n","/**\n * Pluggable LLM provider registry.\n *\n * Each provider (Anthropic, OpenAI, future Grok/Gemini/...) lives as a\n * `LlmProviderDescriptor` in its own file under `./providers/`. The CLI\n * looks up env-var name, default model, model list, key verification,\n * and client construction through this registry, so adding a provider\n * is one descriptor file plus one registration call below.\n *\n * Builtins are imported statically and registered at module init. The\n * descriptor files reach back to this module only via `import type`, so\n * there is no runtime cycle - registry evaluation completes before any\n * descriptor's runtime body runs.\n */\n\nimport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { ANTHROPIC_PROVIDER } from './providers/anthropic';\nimport { DEEPSEEK_PROVIDER } from './providers/deepseek';\nimport { GOOGLE_PROVIDER } from './providers/google';\nimport { OPENAI_PROVIDER } from './providers/openai';\nimport { XAI_PROVIDER } from './providers/xai';\n\nexport type { LlmKeyVerification } from '@elisym/sdk/llm-health';\n\n/**\n * Config passed to a descriptor's `createClient`. Mirrors the SDK's\n * `LlmClientConfig` minus `provider` (already implied by the descriptor)\n * plus an optional `logUsage` flag the client uses to print token\n * counts to stdout. CLI-internal type so SDK clients (none any more)\n * stay log-free.\n */\nexport interface CreateLlmClientConfig {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n /** Print `[LLM] <model> tokens: in=N out=M (total: in=… out=…)` after each call. */\n logUsage?: boolean;\n}\n\n/**\n * Token usage extracted from a provider's raw response. Reserved for\n * future telemetry hooks; concrete clients log their own usage today.\n */\nexport interface LlmUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport interface LlmProviderDescriptor {\n /** Stable identifier used in elisym.yaml `llm.provider` and SKILL.md `provider:`. */\n id: string;\n /** Human-readable label for interactive prompts. */\n displayName: string;\n /** Operator-facing env var that supplies the API key when no per-agent secret is set. */\n envVar: string;\n /** Default model when neither agent nor skill picks one. */\n defaultModel: string;\n /** Hard-coded fallback list when `fetchModels` cannot reach the provider. */\n fallbackModels: string[];\n /** Pull the live model list from the provider. Returns `fallbackModels` on failure. */\n fetchModels(apiKey: string, signal?: AbortSignal): Promise<string[]>;\n /**\n * Lightweight authenticated probe before the agent publishes capabilities.\n * Hits a metadata endpoint (e.g. `/v1/models`) so it does not consume\n * billing credits. Used for UI commands and as a cheap liveness check.\n */\n verifyKey(apiKey: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /**\n * Authoritative deep probe that consumes a single token from the\n * provider's billing account. Distinguishes invalid keys, billing/quota\n * exhaustion, and transient unavailability. Used at agent startup,\n * runtime preflight, and the LLM health heartbeat.\n *\n * Caller passes the model the skill will actually use - billing checks\n * are scoped to that model since some orgs gate access per model.\n */\n verifyKeyDeep(apiKey: string, model: string, signal?: AbortSignal): Promise<LlmKeyVerification>;\n /** Build a fresh `LlmClient` for the given config (apiKey + model + maxTokens + logUsage). */\n createClient(config: CreateLlmClientConfig): LlmClient;\n /** True when the model uses provider-specific reasoning quirks (e.g. OpenAI o1/o3/gpt-5 family). */\n isReasoningModel?(model: string): boolean;\n}\n\nconst REGISTRY = new Map<string, LlmProviderDescriptor>();\n\n/**\n * Register or replace a provider descriptor. Calling twice with the same\n * `id` overwrites the prior entry - useful for tests.\n */\nexport function registerLlmProvider(descriptor: LlmProviderDescriptor): void {\n REGISTRY.set(descriptor.id, descriptor);\n}\n\n/** Look up a provider by id. Returns undefined when not registered. */\nexport function getLlmProvider(id: string): LlmProviderDescriptor | undefined {\n return REGISTRY.get(id);\n}\n\n/** Snapshot of all registered descriptors. Order: registration order. */\nexport function listLlmProviders(): LlmProviderDescriptor[] {\n return Array.from(REGISTRY.values());\n}\n\n/** Snapshot of all registered ids. */\nexport function getRegisteredProviderIds(): string[] {\n return Array.from(REGISTRY.keys());\n}\n\n// Builtin registration. Order here is the registration order seen by\n// `listLlmProviders` and the order interactive prompts will offer.\nregisterLlmProvider(ANTHROPIC_PROVIDER);\nregisterLlmProvider(OPENAI_PROVIDER);\nregisterLlmProvider(XAI_PROVIDER);\nregisterLlmProvider(GOOGLE_PROVIDER);\nregisterLlmProvider(DEEPSEEK_PROVIDER);\n","/**\n * CLI-level LLM facade.\n *\n * The provider registry, descriptors, and concrete client classes\n * (Anthropic, OpenAI) live under `./providers/` + `./registry.ts`.\n * Concrete clients implement `logUsage` themselves (printing token\n * counts to stdout after each API response) - keeping log code in the\n * client lets it read the raw provider response without an extra\n * round-trip. SDK clients no longer exist; CLI is the only consumer.\n *\n * This module exposes:\n * - `createLlmClient(config)`: registry-driven factory\n * - `verifyLlmApiKey(provider, key)`: registry-driven probe\n * - `LlmConfig`, `LlmProvider`, `LlmKeyVerification` shapes\n * - registry surface (`getLlmProvider`, `listLlmProviders`,\n * `getRegisteredProviderIds`, `registerLlmProvider`)\n */\n\nimport type { LlmClient } from '@elisym/sdk/skills';\nimport { getLlmProvider, getRegisteredProviderIds, type LlmKeyVerification } from './registry';\n\nexport type { LlmKeyVerification, LlmProviderDescriptor, LlmUsage } from './registry';\nexport {\n getLlmProvider,\n getRegisteredProviderIds,\n listLlmProviders,\n registerLlmProvider,\n} from './registry';\n\nexport type LlmProvider = string;\n\nexport interface LlmConfig {\n provider: LlmProvider;\n apiKey: string;\n model: string;\n maxTokens: number;\n /** Print `[LLM] <model> tokens: in=N out=M ...` after each call. Default: false. */\n logUsage?: boolean;\n}\n\n/**\n * Build an `LlmClient` for the given config. Throws when the provider\n * id is not registered (typically a typo in elisym.yaml or SKILL.md\n * `provider:` override).\n */\nexport function createLlmClient(config: LlmConfig): LlmClient {\n const descriptor = getLlmProvider(config.provider);\n if (!descriptor) {\n const known = getRegisteredProviderIds().join(', ') || '<none>';\n throw new Error(`Unknown LLM provider \"${config.provider}\". Registered: ${known}.`);\n }\n if (!config.apiKey) {\n throw new Error(`${descriptor.envVar} is required for skill runtime`);\n }\n return descriptor.createClient({\n apiKey: config.apiKey,\n model: config.model,\n maxTokens: config.maxTokens,\n logUsage: config.logUsage,\n });\n}\n\n/**\n * Verify that an LLM API key is accepted by the provider before the agent\n * publishes capabilities. Delegates to the descriptor's `verifyKey`.\n *\n * Cheap probe (Anthropic/OpenAI `/v1/models`) - validates the key is\n * accepted but does NOT detect billing exhaustion. Use this for UI\n * commands like `profile` or `init` where biller status is irrelevant;\n * use `verifyLlmApiKeyDeep` for authoritative checks (startup, runtime\n * preflight, heartbeat).\n */\nexport async function verifyLlmApiKey(\n provider: LlmProvider,\n apiKey: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKey(apiKey, signal);\n}\n\n/**\n * Authoritative probe that consumes a single billing token to verify the\n * key is both valid AND has credits available for the requested model.\n * Costs ~$0.00001 on Haiku 4.5; negligible at startup and 5-min\n * heartbeat cadences.\n */\nexport async function verifyLlmApiKeyDeep(\n provider: LlmProvider,\n apiKey: string,\n model: string,\n signal?: AbortSignal,\n): Promise<LlmKeyVerification> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n return {\n ok: false,\n reason: 'unavailable',\n error: `Unknown LLM provider \"${provider}\"`,\n };\n }\n return descriptor.verifyKeyDeep(apiKey, model, signal);\n}\n","/**\n * Init command - create a new agent.\n *\n * Usage:\n * elisym init [name] Interactive wizard; creates in ~/.elisym/<name>/.\n * elisym init [name] --config <path> Non-interactive; loads YAML template.\n * elisym init [name] --defaults Non-interactive; uses the same defaults the\n * wizard would have suggested (description =\n * \"An elisym AI agent\", default relays, no\n * payments, no LLM, no encryption). Combine with\n * --local / --passphrase to override pieces.\n * elisym init [name] --local Create in project <project>/.elisym/<name>/.\n * elisym init [name] --passphrase <p> Skip passphrase prompt (\"\" = no encryption).\n * elisym init [name] --yes Skip overwrite/shadow confirm prompts.\n */\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { validateAgentName, RELAYS } from '@elisym/sdk';\nimport {\n ElisymYamlSchema,\n createAgentDir,\n resolveInHome,\n resolveInProject,\n writeExampleSkillTemplate,\n writeSecrets,\n writeYamlInitial,\n type AgentSource,\n type ElisymYaml,\n} from '@elisym/sdk/agent-store';\nimport { isAddress } from '@solana/kit';\nimport { generateSecretKey, getPublicKey, nip19 } from 'nostr-tools';\nimport YAML from 'yaml';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport interface InitOptions {\n config?: string;\n defaults?: boolean;\n local?: boolean;\n passphrase?: string;\n yes?: boolean;\n}\n\nfunction buildDefaultYaml(): ElisymYaml {\n return ElisymYamlSchema.parse({\n description: 'An elisym AI agent',\n relays: [...RELAYS],\n payments: [],\n security: {},\n });\n}\n\n/**\n * Delegate to the descriptor's `fetchModels`. Returns `[]` if the\n * provider id is not registered (defensive - in practice the caller\n * only passes ids it pulled from the same registry). Falls back to the\n * descriptor's `fallbackModels` when the live `fetchModels` call throws.\n */\nexport async function fetchModels(provider: string, apiKey: string): Promise<string[]> {\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n console.warn(` ! Unknown provider \"${provider}\". No models available.`);\n return [];\n }\n try {\n return await descriptor.fetchModels(apiKey);\n } catch (e: any) {\n console.warn(` ! Could not fetch models: ${e.message}. Using defaults.`);\n return descriptor.fallbackModels;\n }\n}\n\nfunction pickTarget(options: InitOptions): AgentSource {\n return options.local ? 'project' : 'home';\n}\n\nexport async function cmdInit(nameArg?: string, options: InitOptions = {}): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n console.log('\\n elisym agent setup\\n');\n\n if (options.config && options.defaults) {\n throw new Error('--config and --defaults are mutually exclusive; pick one.');\n }\n\n // --defaults means \"no prompts\" - imply --yes for shadow/overwrite confirms.\n const skipConfirms = options.yes || options.defaults;\n\n // Step 1: YAML template (optional) - from --config file or --defaults skeleton.\n let template: ElisymYaml | undefined;\n if (options.config) {\n const configPath = resolve(cwd, options.config);\n const raw = readFileSync(configPath, 'utf-8');\n template = ElisymYamlSchema.parse(YAML.parse(raw) ?? {});\n console.log(` Loaded template from ${configPath}\\n`);\n } else if (options.defaults) {\n template = buildDefaultYaml();\n console.log(' Using default skeleton (no LLM, no payments). Edit later via `profile`.\\n');\n }\n\n // Step 2: Agent name (arg > prompt).\n const agentName = await resolveAgentName(nameArg, inquirer);\n\n // Step 3: Shadow / overwrite checks. With --yes, overwrite fails closed\n // (never silently clobber secrets) while shadow / sibling-location prompts\n // take their recommended default.\n const target = pickTarget(options);\n const sameLocation =\n target === 'home' ? resolveInHome(agentName) : resolveInProject(agentName, cwd);\n if (sameLocation) {\n if (skipConfirms) {\n throw new Error(\n `Agent \"${agentName}\" already exists at ${sameLocation}. Refusing to overwrite secrets under --yes/--defaults. Remove the directory first or choose a different name.`,\n );\n }\n const { overwrite } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'overwrite',\n message: `Agent \"${agentName}\" already exists at ${sameLocation}. Overwrite secrets?`,\n default: false,\n },\n ]);\n if (!overwrite) {\n console.log('Aborted.');\n return;\n }\n } else if (target === 'project' && resolveInHome(agentName)) {\n if (!skipConfirms) {\n const { shadow } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shadow',\n message: `A global agent \"${agentName}\" exists in ~/.elisym/${agentName}/. Create a project-local shadow?`,\n default: true,\n },\n ]);\n if (!shadow) {\n console.log('Aborted.');\n return;\n }\n }\n } else if (target === 'home' && resolveInProject(agentName, cwd)) {\n if (!skipConfirms) {\n const { proceed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'proceed',\n message: `A project-local agent \"${agentName}\" exists. Create a global agent with the same name?`,\n default: true,\n },\n ]);\n if (!proceed) {\n console.log('Aborted.');\n return;\n }\n }\n }\n\n // Step 4: Build YAML. If a template was loaded, reuse it; otherwise prompt\n // interactively. promptYaml also returns the API key it collected so we\n // don't re-prompt in Step 5.\n let yaml: ElisymYaml;\n let promptedApiKey: string | undefined;\n if (template) {\n yaml = template;\n } else {\n const result = await promptYaml(inquirer);\n yaml = result.yaml;\n promptedApiKey = result.apiKey;\n }\n\n // Step 5: LLM API key for the default provider (from env, then reuse\n // prompt-collected key, else prompt). Provider labels and env var\n // names come from the descriptor.\n let defaultProviderKey: string | undefined;\n const defaultProviderId = yaml.llm?.provider;\n if (yaml.llm && defaultProviderId) {\n const descriptor = getLlmProvider(defaultProviderId);\n const envKey = descriptor ? process.env[descriptor.envVar] : undefined;\n if (envKey && descriptor) {\n defaultProviderKey = envKey;\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else if (promptedApiKey) {\n defaultProviderKey = promptedApiKey;\n } else {\n const label = descriptor?.displayName ?? defaultProviderId;\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${label} API key:`,\n mask: '*',\n },\n ]);\n defaultProviderKey = apiKey || undefined;\n }\n }\n\n // Step 5b: Optional API keys for OTHER registered providers - used by\n // skills that declare a `provider:` override in their SKILL.md. Skipped\n // when running from a YAML template (non-interactive); operators can\n // supply per-provider keys via env vars or by editing `.secrets.json`.\n const otherProviderKeys = new Map<string, string>();\n if (yaml.llm && !template && defaultProviderId) {\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== defaultProviderId,\n );\n for (const descriptor of otherDescriptors) {\n const otherEnvKey = process.env[descriptor.envVar];\n const { configureOther } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'configureOther',\n message: `Configure ${descriptor.displayName} API key too (for skills that override the default provider)?`,\n default: Boolean(otherEnvKey),\n },\n ]);\n if (!configureOther) {\n continue;\n }\n if (otherEnvKey) {\n otherProviderKeys.set(descriptor.id, otherEnvKey);\n console.log(` Using ${descriptor.envVar} from environment.`);\n } else {\n const { promptedOther } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedOther',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n if (promptedOther) {\n otherProviderKeys.set(descriptor.id, promptedOther);\n }\n }\n }\n }\n\n // Step 6: Passphrase for encrypting secrets. Flag wins over env var wins\n // over interactive prompt. Empty string (\"\") is an explicit opt-out from\n // encryption, distinct from \"flag not provided\". --defaults implies no\n // encryption when neither flag nor env is set.\n let passphrase = '';\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n if (options.passphrase !== undefined) {\n passphrase = options.passphrase;\n } else if (envPassphrase !== undefined) {\n passphrase = envPassphrase;\n } else if (options.defaults) {\n passphrase = '';\n } else {\n const answer = 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 passphrase = answer.passphrase ?? '';\n if (passphrase) {\n const { confirmPassphrase } = await inquirer.prompt([\n {\n type: 'password',\n name: 'confirmPassphrase',\n message: 'Confirm passphrase:',\n mask: '*',\n validate: (value: string) => value === passphrase || 'Passphrases do not match',\n },\n ]);\n void confirmPassphrase;\n }\n }\n\n // Step 7: Generate Nostr identity.\n const nostrSecretBytes = generateSecretKey();\n const nostrPubkey = getPublicKey(nostrSecretBytes);\n const nostrSecretHex = Buffer.from(nostrSecretBytes).toString('hex');\n\n // Step 8: Create agent directory + write files. Each provider's key\n // lands in `secrets.llm_api_keys[<provider-id>]`; the start-time\n // resolver reads them directly (or falls back to the matching env\n // var via the descriptor).\n const created = await createAgentDir({ target, name: agentName, cwd });\n const collectedKeys = new Map<string, string>(otherProviderKeys);\n if (yaml.llm && defaultProviderKey) {\n collectedKeys.set(yaml.llm.provider, defaultProviderKey);\n }\n const llmApiKeys = Object.fromEntries(collectedKeys);\n await writeYamlInitial(created.dir, yaml);\n await writeExampleSkillTemplate(created.dir);\n await writeSecrets(\n created.dir,\n {\n nostr_secret_key: nostrSecretHex,\n llm_api_keys: Object.keys(llmApiKeys).length > 0 ? llmApiKeys : undefined,\n },\n passphrase || undefined,\n );\n\n const npub = nip19.npubEncode(nostrPubkey);\n console.log(`\\n Agent \"${agentName}\" created (${target}).`);\n console.log(` Location: ${created.dir}`);\n console.log(` Nostr: ${npub}`);\n if (yaml.payments[0]?.address) {\n console.log(` Solana: ${yaml.payments[0].address}`);\n }\n if (passphrase) {\n console.log(' Secrets encrypted with your passphrase.');\n }\n console.log();\n}\n\nasync function resolveAgentName(\n nameArg: string | undefined,\n inquirer: { prompt: any },\n): Promise<string> {\n if (nameArg) {\n validateAgentName(nameArg);\n return nameArg;\n }\n const { inputName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'inputName',\n message: 'Agent name:',\n validate: (value: string) => {\n try {\n validateAgentName(value);\n return true;\n } catch (e: any) {\n return e.message;\n }\n },\n },\n ]);\n validateAgentName(inputName);\n return inputName;\n}\n\nasync function promptYaml(inquirer: {\n prompt: any;\n}): Promise<{ yaml: ElisymYaml; apiKey?: string }> {\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 const { displayName } = await inquirer.prompt([\n {\n type: 'input',\n name: 'displayName',\n message: 'Display name (optional, for UI):',\n default: '',\n },\n ]);\n\n const { picture } = await inquirer.prompt([\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar file (relative to agent dir, e.g. ./avatar.png) or URL:',\n default: '',\n },\n ]);\n\n const { banner } = await inquirer.prompt([\n {\n type: 'input',\n name: 'banner',\n message: 'Banner file (relative to agent dir, e.g. ./header.png) or URL:',\n default: '',\n },\n ]);\n\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: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n if (solanaAddress) {\n console.log(\n ' The wallet receives every asset on Solana (SOL directly, USDC and other\\n' +\n ' SPL tokens via their ATA). Each skill declares its own price and token\\n' +\n ' in SKILL.md. Fund with SOL via `solana airdrop` or USDC via https://faucet.circle.com.',\n );\n }\n\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'LLM provider:',\n choices: [\n {\n name: 'None (non-LLM agent - static-file / static-script / dynamic-script only)',\n value: 'none',\n },\n ...listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n })),\n ],\n },\n ]);\n\n const baseYaml = {\n display_name: displayName || undefined,\n description,\n picture: picture || undefined,\n banner: banner || undefined,\n relays: [...RELAYS],\n payments: solanaAddress ? [{ chain: 'solana', network: 'devnet', address: solanaAddress }] : [],\n security: {},\n };\n\n if (llmProvider === 'none') {\n const yaml: ElisymYaml = ElisymYamlSchema.parse(baseYaml);\n return { yaml };\n }\n\n const descriptor = getLlmProvider(llmProvider);\n if (!descriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n const envKey = process.env[descriptor.envVar];\n let apiKey: string | undefined = envKey;\n if (!apiKey) {\n const { promptedKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'promptedKey',\n message: `${descriptor.displayName} API key:`,\n mask: '*',\n },\n ]);\n apiKey = promptedKey || undefined;\n }\n\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 const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: 4096,\n },\n ]);\n\n const yaml: ElisymYaml = ElisymYamlSchema.parse({\n ...baseYaml,\n llm: { provider: llmProvider, model, max_tokens: maxTokens },\n });\n // envKey is returned only when the user explicitly typed it (not when\n // pulled from process.env) - the env-var path is handled in cmdInit Step 5.\n return { yaml, apiKey: envKey ? undefined : apiKey };\n}\n","import { ElisymIdentity } from '@elisym/sdk';\nimport { listAgents, loadAgent } from '@elisym/sdk/agent-store';\n/**\n * elisym CLI - agent runner for the elisym network.\n *\n * Commands:\n * elisym init [name] [--config <path>] [--defaults] [--local] Create a new agent\n * elisym start [name] Start agent in provider mode\n * elisym list List all agents\n * elisym profile [name] Edit agent profile\n * elisym wallet [name] Show wallet balance\n */\nprocess.removeAllListeners('warning');\nimport { Command } from 'commander';\nimport { nip19 } from 'nostr-tools';\nimport { cmdInit, type InitOptions } from './commands/init.js';\nimport { cmdProfile } from './commands/profile.js';\nimport { cmdStart } from './commands/start.js';\nimport { cmdWallet } from './commands/wallet.js';\nimport { PACKAGE_VERSION } from './version.js';\n\n/**\n * Wrap an action handler so any thrown Error surfaces as a single clean line\n * with exit 1 instead of an unhandled-rejection stack trace.\n */\nfunction safe<T extends unknown[]>(fn: (...args: T) => Promise<void>) {\n return async (...args: T): Promise<void> => {\n try {\n await fn(...args);\n } catch (e) {\n console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);\n process.exit(1);\n }\n };\n}\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\n .command('init [name]')\n .description('Create a new agent')\n .option('-c, --config <path>', 'Load fields from an elisym.yaml template (non-interactive)')\n .option(\n '--defaults',\n 'Skip every prompt and use the same defaults the wizard would have suggested (description, default relays, no payments, no LLM, no encryption). Mutually exclusive with --config.',\n )\n .option('--local', 'Create in project <project>/.elisym/<name>/ (default: ~/.elisym/<name>/)')\n .option(\n '--passphrase <value>',\n 'Passphrase to encrypt secrets at rest. Empty string (\"\") skips encryption. Also reads ELISYM_PASSPHRASE env var. When neither is provided, prompts interactively.',\n )\n .option(\n '--yes',\n 'Skip confirmation prompts (shadow/sibling-location). Fails closed on an existing agent at the same location - never overwrites secrets silently.',\n )\n .action(\n safe(async (name: string | undefined, options: InitOptions) => {\n await cmdInit(name, options);\n }),\n );\n\n// Profile\nprogram\n .command('profile [name]')\n .description('Edit agent profile, wallet, and LLM settings')\n .action(safe(cmdProfile));\n\n// Start\nprogram\n .command('start [name]')\n .description('Start agent in provider mode')\n .option(\n '-v, --verbose',\n 'Enable debug logging (relay lifecycle, publish acks, subscription EOSE). Also togglable via ELISYM_DEBUG=1 or LOG_LEVEL=debug.',\n )\n .action(\n safe(async (name: string | undefined, options: { verbose?: boolean }) => {\n await cmdStart(name, options);\n }),\n );\n\n// List\nprogram\n .command('list')\n .description('List all agents (project-local and home-global)')\n .action(\n safe(async () => {\n const cwd = process.cwd();\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents found. Run `npx @elisym/cli init` to create one.');\n return;\n }\n console.log('\\nAgents:');\n for (const agent of agents) {\n try {\n const loaded = await loadAgent(agent.name, cwd);\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const npub = nip19.npubEncode(identity.publicKey);\n const solAddr = loaded.yaml.payments[0]?.address\n ? ` | Solana: ${loaded.yaml.payments[0].address}`\n : '';\n const shadow = agent.shadowsGlobal ? ' [shadows global]' : '';\n console.log(` ${agent.name} (${agent.source})${shadow} | ${npub}${solAddr}`);\n } catch (e: any) {\n const hint = /encrypted secrets/i.test(e?.message ?? '') ? ' (encrypted)' : '';\n console.log(` ${agent.name} (${agent.source})${hint}`);\n }\n }\n console.log();\n }),\n );\n\n// Wallet\nprogram.command('wallet [name]').description('Show wallet balance').action(safe(cmdWallet));\n\nprogram.parse();\n","import {\n listAgents,\n loadAgent,\n writeSecrets,\n writeYaml,\n type ElisymYaml,\n type LlmEntry,\n type Secrets,\n} from '@elisym/sdk/agent-store';\n/**\n * Profile command - edit agent profile, wallet, and LLM settings.\n * Writes back to elisym.yaml (public) and .secrets.json (private).\n */\nimport { isAddress } from '@solana/kit';\nimport { getLlmProvider, listLlmProviders } from '../llm';\n\nexport async function cmdProfile(name: string | undefined): Promise<void> {\n const { default: inquirer } = await import('inquirer');\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.error('No agents found. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Select agent:',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n console.log(`\\n Editing agent \"${name}\" (${loaded.source})\\n`);\n\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 {\n name: `Profile (description: ${truncate(loaded.yaml.description ?? '')})`,\n value: 'profile',\n },\n {\n name: `Wallet (${loaded.yaml.payments[0]?.address ?? 'not configured'})`,\n value: 'wallet',\n },\n {\n name: `LLM (${loaded.yaml.llm?.provider ?? 'not configured'} / ${loaded.yaml.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: 'displayName',\n message: 'Display name (for UI):',\n default: loaded.yaml.display_name ?? '',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Description:',\n default: loaded.yaml.description ?? '',\n },\n {\n type: 'input',\n name: 'picture',\n message: 'Avatar (relative path or URL, empty to clear):',\n default: loaded.yaml.picture ?? '',\n },\n {\n type: 'input',\n name: 'banner',\n message: 'Banner (relative path or URL, empty to clear):',\n default: loaded.yaml.banner ?? '',\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n display_name: answers.displayName || undefined,\n description: answers.description ?? '',\n picture: answers.picture || undefined,\n banner: answers.banner || undefined,\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Profile updated.\\n');\n }\n\n if (section === 'wallet') {\n const current = loaded.yaml.payments[0];\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'address',\n message: 'Solana address (empty to clear):',\n default: current?.address ?? '',\n validate: (value: string) => {\n if (!value) {\n return true;\n }\n return isAddress(value) || 'Invalid Solana address';\n },\n },\n ]);\n\n const nextYaml: ElisymYaml = {\n ...loaded.yaml,\n payments: answers.address\n ? [{ chain: 'solana', network: 'devnet', address: answers.address }]\n : [],\n };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n console.log(' Wallet updated.\\n');\n }\n\n if (section === 'llm') {\n const providerChoices = listLlmProviders().map((descriptor) => ({\n name: descriptor.displayName,\n value: descriptor.id,\n }));\n if (providerChoices.length === 0) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const firstChoice = providerChoices[0];\n if (!firstChoice) {\n console.error(' ! No LLM providers registered.');\n continue;\n }\n const { llmProvider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'llmProvider',\n message: 'Default LLM provider (used by skills without a `provider:` override):',\n choices: providerChoices,\n default: loaded.yaml.llm?.provider ?? firstChoice.value,\n },\n ]);\n const defaultDescriptor = getLlmProvider(llmProvider);\n if (!defaultDescriptor) {\n throw new Error(`Internal: provider \"${llmProvider}\" not registered.`);\n }\n\n const defaultKeyStatus = describeKeyStatus(loaded.secrets, llmProvider);\n const { apiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'apiKey',\n message: `${defaultDescriptor.displayName} API key [${defaultKeyStatus}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n\n const probeKey = apiKey || pickPlainKey(loaded.secrets, llmProvider);\n\n console.log(' Fetching available models...');\n const { fetchModels } = await import('./init.js');\n const models = await fetchModels(llmProvider, probeKey);\n\n const { model } = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Model:',\n choices: models,\n default: loaded.yaml.llm?.model,\n },\n ]);\n\n const { maxTokens } = await inquirer.prompt([\n {\n type: 'number',\n name: 'maxTokens',\n message: 'Max tokens:',\n default: loaded.yaml.llm?.max_tokens ?? 4096,\n },\n ]);\n\n // Optional keys for OTHER registered providers (used by skills\n // that override the default provider in their SKILL.md).\n const otherDescriptors = listLlmProviders().filter(\n (descriptor) => descriptor.id !== llmProvider,\n );\n const otherKeys = new Map<string, string>();\n for (const descriptor of otherDescriptors) {\n const status = describeKeyStatus(loaded.secrets, descriptor.id);\n const { otherApiKey } = await inquirer.prompt([\n {\n type: 'password',\n name: 'otherApiKey',\n message: `${descriptor.displayName} API key for skill overrides [${status}] (leave empty to keep current):`,\n mask: '*',\n },\n ]);\n if (otherApiKey) {\n otherKeys.set(descriptor.id, otherApiKey);\n }\n }\n\n const nextLlm: LlmEntry = { provider: llmProvider, model, max_tokens: maxTokens };\n const nextYaml: ElisymYaml = { ...loaded.yaml, llm: nextLlm };\n await writeYaml(loaded.dir, nextYaml);\n loaded.yaml = nextYaml;\n\n if (apiKey || otherKeys.size > 0) {\n const nextLlmApiKeys: Record<string, string> = {\n ...(loaded.secrets.llm_api_keys ?? {}),\n };\n if (apiKey) {\n nextLlmApiKeys[llmProvider] = apiKey;\n }\n for (const [providerId, key] of otherKeys) {\n nextLlmApiKeys[providerId] = key;\n }\n const nextSecrets: Secrets = {\n ...loaded.secrets,\n llm_api_keys: nextLlmApiKeys,\n };\n await writeSecrets(loaded.dir, nextSecrets, passphrase);\n loaded.secrets = nextSecrets;\n }\n console.log(' LLM updated.\\n');\n }\n }\n\n console.log(` Agent \"${name}\" saved.\\n`);\n}\n\nfunction truncate(value: string, max = 40): string {\n if (value.length <= max) {\n return value;\n }\n return value.slice(0, max - 1) + '…';\n}\n\n/** Status hint shown next to the API-key prompt so the user knows what's stored. */\nfunction describeKeyStatus(secrets: Secrets, providerId: string): string {\n return secrets.llm_api_keys?.[providerId] ? 'set' : 'not set';\n}\n\n/** Pick the stored key for model probing. `loaded.secrets` is post-decrypt, so values are plaintext. */\nfunction pickPlainKey(secrets: Secrets, providerId: string): string {\n const value = secrets.llm_api_keys?.[providerId];\n return typeof value === 'string' ? value : '';\n}\n","/**\n * Opt-in relay diagnostics. Resolves each relay hostname via DNS and\n * opens a TCP probe to the relay port. Activated by `ELISYM_NET_DIAG=1`\n * so operators can separately diagnose \"WSS fails but everything else\n * looks fine\" scenarios common on WSL, Docker, or corporate firewalls.\n *\n * Never called on a hot path - one-shot at startup.\n */\nimport { lookup } from 'node:dns/promises';\nimport { Socket } from 'node:net';\nimport type { Logger } from 'pino';\n\nconst TCP_PROBE_TIMEOUT_MS = 3_000;\n\nexport interface RelayProbeResult {\n url: string;\n host: string;\n port: number;\n ips: string[];\n tcpOpenMs?: number;\n error?: string;\n}\n\nfunction parseRelayUrl(url: string): { host: string; port: number } | null {\n try {\n const parsed = new URL(url);\n const isSecure = parsed.protocol === 'wss:' || parsed.protocol === 'https:';\n const defaultPort = isSecure ? 443 : 80;\n const port = parsed.port.length > 0 ? parseInt(parsed.port, 10) : defaultPort;\n if (!Number.isFinite(port)) {\n return null;\n }\n return { host: parsed.hostname, port };\n } catch {\n return null;\n }\n}\n\nasync function tcpProbe(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<{ openMs: number } | { error: string }> {\n return new Promise((resolve) => {\n const started = Date.now();\n const socket = new Socket();\n let settled = false;\n\n const finish = (result: { openMs: number } | { error: string }): void => {\n if (settled) {\n return;\n }\n settled = true;\n socket.destroy();\n resolve(result);\n };\n\n const timer = setTimeout(() => finish({ error: 'timeout' }), timeoutMs);\n\n socket.once('connect', () => {\n clearTimeout(timer);\n finish({ openMs: Date.now() - started });\n });\n socket.once('error', (err) => {\n clearTimeout(timer);\n finish({ error: err.message });\n });\n\n socket.connect(port, host);\n });\n}\n\nexport async function probeRelays(\n relays: string[],\n logger: Logger,\n timeoutMs: number = TCP_PROBE_TIMEOUT_MS,\n): Promise<RelayProbeResult[]> {\n const results: RelayProbeResult[] = [];\n for (const url of relays) {\n const parsed = parseRelayUrl(url);\n if (!parsed) {\n logger.debug({ event: 'net_diag_parse_failed', url }, 'unparseable relay URL');\n results.push({ url, host: '', port: 0, ips: [], error: 'invalid URL' });\n continue;\n }\n const { host, port } = parsed;\n let ips: string[] = [];\n try {\n const resolved = await lookup(host, { all: true });\n ips = resolved.map((entry) => entry.address);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(\n { event: 'net_diag_dns_failed', url, host, error: message },\n 'DNS lookup failed',\n );\n results.push({ url, host, port, ips: [], error: `dns: ${message}` });\n continue;\n }\n\n const probe = await tcpProbe(host, port, timeoutMs);\n if ('openMs' in probe) {\n logger.debug(\n { event: 'net_diag_tcp_open', url, host, port, ips, tcpOpenMs: probe.openMs },\n 'TCP open',\n );\n results.push({ url, host, port, ips, tcpOpenMs: probe.openMs });\n } else {\n logger.debug(\n { event: 'net_diag_tcp_failed', url, host, port, ips, error: probe.error },\n 'TCP probe failed',\n );\n results.push({ url, host, port, ips, error: `tcp: ${probe.error}` });\n }\n }\n return results;\n}\n","/**\n * Shared CLI helpers - RPC URLs, SOL formatting, price validation.\n */\nimport { USDC_SOLANA_DEVNET, calculateProtocolFee } from '@elisym/sdk';\nimport { type Rpc, type SolanaRpcApi, address } from '@solana/kit';\n\n// --- Constants ---\n\nexport const RENT_EXEMPT_MINIMUM = 890_880; // lamports\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 * If a watchdog tick fires after a wall-clock gap larger than the smaller of\n * its two intervals multiplied by this factor, the gap is treated as host\n * suspension (macOS sleep, hibernation, container pause) rather than normal\n * scheduling jitter. Both `setInterval` callbacks freeze during OS sleep and\n * fire late on resume; the tick that detects the gap forces an immediate pool\n * reset instead of running the regular probe/self-ping (which would race\n * against still-half-dead WebSocket state).\n */\nexport const WATCHDOG_SLEEP_DETECT_MULTIPLIER = 2;\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// --- USDC balance ---\n\n/**\n * Sum the agent's USDC token-account balances (raw subunits) on the connected\n * Solana RPC. Returns 0n on any error or when the asset has no mint configured;\n * callers display \"0 USDC\" rather than failing the whole banner.\n */\nexport async function fetchUsdcBalance(\n rpc: Rpc<SolanaRpcApi>,\n owner: ReturnType<typeof address>,\n): Promise<bigint> {\n const mint = USDC_SOLANA_DEVNET.mint;\n if (!mint) {\n return 0n;\n }\n try {\n const response = await rpc\n .getTokenAccountsByOwner(\n owner,\n { mint: address(mint) },\n { encoding: 'jsonParsed', commitment: 'confirmed' },\n )\n .send();\n let total = 0n;\n for (const entry of response.value) {\n const parsed = entry.account.data as\n | { parsed?: { info?: { tokenAmount?: { amount?: string } } } }\n | undefined;\n const raw = parsed?.parsed?.info?.tokenAmount?.amount;\n if (typeof raw === 'string') {\n total += BigInt(raw);\n }\n }\n return total;\n } catch {\n return 0n;\n }\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, chmodSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\n// Ledger files hold customer-confidential job content (inputs, results). Lock\n// the directory and files down to owner-only, matching the rest of the agent\n// store, so other local users cannot read them.\nconst LEDGER_DIR_MODE = 0o700;\nconst LEDGER_FILE_MODE = 0o600;\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 /**\n * JSON-serialized `FileAttachment` for a file result. Persisted so crash\n * recovery can rebuild the descriptor and re-share the blob for a fresh ticket.\n * Unlike `result`, this is NOT nulled by `markDelivered`/`markFailed` - the\n * provider keeps seeding the result blob through the retention window, and\n * recovery needs the descriptor to re-deliver. (A file INPUT's descriptor is\n * recovered from the persisted decrypted `raw_event_json`, not stored here.)\n */\n result_attachment?: 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 /**\n * @param ledgerPath absolute path to the ledger file\n * (typically `<agentDir>/.jobs.json`). Caller is responsible for\n * resolving the agent directory via `@elisym/sdk/agent-store`.\n */\n constructor(ledgerPath: string) {\n this.path = ledgerPath;\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 const backupPath = this.path + '.corrupt.' + Date.now();\n renameSync(this.path, backupPath);\n // The backup inherits the original (possibly world-readable) perms,\n // so tighten it to owner-only - it still holds job content.\n chmodSync(backupPath, LEDGER_FILE_MODE);\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, mode: LEDGER_DIR_MODE });\n const obj = Object.fromEntries(this.entries);\n const tmp = this.path + '.tmp';\n writeFileSync(tmp, JSON.stringify(obj, null, 2), { mode: LEDGER_FILE_MODE });\n renameSync(tmp, this.path);\n // writeFileSync's `mode` is masked by the process umask, so an explicit\n // chmod after the rename guarantees owner-only perms regardless of umask.\n chmodSync(this.path, LEDGER_FILE_MODE);\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 /**\n * Record the JSON-serialized file-result descriptor. Survives later\n * `markDelivered`/`markFailed` (which only null `result`).\n */\n recordAttachment(jobId: string, fields: { resultAttachment?: string }): void {\n const entry = this.entries.get(jobId);\n if (!entry) {\n return;\n }\n if (fields.resultAttachment !== undefined) {\n entry.result_attachment = fields.resultAttachment;\n }\n this.flush();\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 this.pruneOldEntries(maxAgeSecs * 1000);\n }\n\n /**\n * Drop terminal entries (`delivered` / `failed`) whose `created_at`\n * predates `now - retentionMs`. Stuck non-terminal entries are never\n * pruned - recovery keeps retrying them until the retry budget runs\n * out, then they become terminal and are eligible on the next sweep.\n *\n * Returns the number of entries deleted, for observability.\n */\n pruneOldEntries(retentionMs: number): number {\n const cutoff = Math.floor(Date.now() / 1000) - Math.floor(retentionMs / 1000);\n let deleted = 0;\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 deleted += 1;\n }\n }\n if (deleted > 0) {\n this.flush();\n }\n return deleted;\n }\n}\n","/**\n * Start command - run agent in provider mode.\n * Loads all skills from agentDir/skills/, publishes per-capability cards,\n * processes jobs with per-capability pricing, caches uploaded media URLs.\n */\nimport { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, dirname, join, relative, resolve, sep } from 'node:path';\nimport {\n ElisymClient,\n ElisymIdentity,\n MediaService,\n USDC_SOLANA_DEVNET,\n formatAssetAmount,\n formatSol,\n RELAYS,\n DEFAULTS,\n DEFAULT_KIND_OFFSET,\n KIND_LONG_FORM_ARTICLE,\n POLICY_D_TAG_PREFIX,\n POLICY_T_TAG,\n jobRequestKind,\n toDTag,\n type CapabilityCard,\n} from '@elisym/sdk';\nimport {\n agentPaths,\n ensureGitignoreHasIrohEntry,\n listAgents,\n loadAgent,\n loadPoliciesFromDir,\n lookupCachedUrl,\n newCacheEntry,\n readMediaCache,\n writeMediaCache,\n type LoadedAgent,\n type MediaCache,\n} from '@elisym/sdk/agent-store';\nimport { LlmHealthMonitor, startLlmRecovery, type HeartbeatHandle } from '@elisym/sdk/llm-health';\nimport { createIrohTransport } from '@elisym/sdk/node';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { probeRelays } from '../diagnostics.js';\nimport {\n fetchUsdcBalance,\n getRpcUrl,\n MAX_CONCURRENT_JOBS,\n RECOVERY_MAX_RETRIES,\n RECOVERY_INTERVAL_SECS,\n} from '../helpers.js';\nimport { JobLedger } from '../ledger.js';\nimport {\n createLlmClient,\n getLlmProvider,\n listLlmProviders,\n verifyLlmApiKeyDeep,\n type LlmConfig,\n type LlmProvider,\n} from '../llm';\nimport { cacheKeyFor, resolveTripleForOverride } from '../llm/cache.js';\nimport { resolveProviderApiKey } from '../llm/keys.js';\nimport { resolveSkillLlm, type ResolvedSkillLlm } from '../llm/resolve.js';\nimport { createLogger, sanitizeForTerminal } from '../logging.js';\nimport { AgentRuntime, type RuntimeConfig } from '../runtime.js';\nimport { SkillRegistry, type SkillContext, type SkillLlmOverride } from '../skill';\nimport type { LlmClient } from '../skill/index.js';\nimport { loadSkillsFromDir } from '../skill/loader.js';\nimport { NostrTransport } from '../transport/nostr.js';\nimport { startWatchdog } from '../watchdog.js';\n\nexport interface StartOptions {\n verbose?: boolean;\n}\n\nexport async function cmdStart(\n nameArg: string | undefined,\n options: StartOptions = {},\n): Promise<void> {\n const cwd = process.cwd();\n\n // -- Step 1: Resolve agent name --\n const agentName = await resolveStartAgentName(nameArg, cwd);\n if (!agentName) {\n return;\n }\n\n // -- Step 2: Load agent (with optional passphrase for encrypted keys) --\n const loaded = await loadAgentWithPrompt(agentName, cwd);\n\n // -- Step 2b: Set up structured logger early so publish / config\n // debug events fire before connectivity is established.\n const verbose =\n options.verbose === true ||\n process.env.ELISYM_DEBUG === '1' ||\n process.env.LOG_LEVEL === 'debug';\n const { logger, logWithIndent } = createLogger({\n verbose,\n tty: Boolean(process.stdout.isTTY),\n });\n\n // -- Step 3: Banner --\n console.log(`\\n Starting agent ${agentName} (${loaded.source})...\\n`);\n if (loaded.shadowsGlobal) {\n console.log(\n ` ! Using project-local ${agentName} (shadows global agent in ~/.elisym/${agentName}/)\\n`,\n );\n }\n if (verbose) {\n console.log(' [debug] Verbose logging enabled. Structured diagnostics -> stderr.');\n }\n\n // -- Step 4: Resolve Solana address and show balance --\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n const solanaAddress = solPayment?.address;\n const walletNetwork = solPayment?.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 }, usdcBalance] = await Promise.all([\n rpc.getBalance(walletAddress).send(),\n fetchUsdcBalance(rpc, walletAddress),\n ]);\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 // FIX #10: a custom SOLANA_RPC_URL routinely carries an API key in its\n // userinfo / query / path - redact before printing to the banner.\n console.log(` RPC ${stripRpcSecrets(process.env.SOLANA_RPC_URL)} (custom)`);\n }\n console.log(` SOL ${formatSol(balance)} (${balance} lamports)`);\n console.log(` USDC ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}`);\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: Load and register all skills --\n // Skills load before the LLM check so a fully-non-LLM agent can start\n // without an API key. The LLM block below runs only when at least one\n // skill has `mode === 'llm'`.\n //\n // `scriptEnv` propagates decrypted per-provider keys (e.g. ANTHROPIC_API_KEY)\n // into `dynamic-script` / `static-script` subprocesses, so script skills get\n // the same secret access LLM-mode skills already have. Existing process.env\n // values win when no per-agent secret is set, matching the priority used by\n // resolveProviderApiKey for LLM-mode skills.\n const scriptEnv: NodeJS.ProcessEnv = { ...process.env };\n const llmKeys = loaded.secrets.llm_api_keys ?? {};\n for (const descriptor of listLlmProviders()) {\n const secretValue = llmKeys[descriptor.id];\n if (typeof secretValue === 'string' && secretValue.length > 0) {\n scriptEnv[descriptor.envVar] = secretValue;\n }\n }\n const paths = agentPaths(loaded.dir);\n const skillsDir = paths.skills;\n const allSkills = loadSkillsFromDir(skillsDir, { scriptEnv });\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: ${skillsDir}/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 =\n skill.priceSubunits > 0\n ? formatAssetAmount(skill.asset, BigInt(skill.priceSubunits))\n : '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.priceSubunits > 0);\n if (hasPaid && !solanaAddress) {\n console.error(\n ' ! Paid skills require a Solana address. Run `npx @elisym/cli profile` to configure.\\n',\n );\n process.exit(1);\n }\n\n // -- Step 6: LLM check (only when at least one skill needs it) --\n // Per-skill LLM resolution. Each `mode: 'llm'` skill resolves to a concrete\n // (provider, model, maxTokens) triple. Agent-level `llm` in elisym.yaml is\n // the fallback for skills that don't override; if every LLM skill overrides,\n // agent-level `llm` may be omitted entirely.\n //\n // Script-mode skills can also declare `provider` + `model` in SKILL.md to\n // register a health-monitor probe for the API key the script uses under\n // the hood. Those skills do NOT need an LlmClient (the script makes its\n // own HTTP calls), but they DO need: an API key resolved + verified at\n // startup, and a (provider, model) pair registered with the health\n // monitor so reactive markUnhealthy + lazy recovery works.\n const llmSkills = allSkills.filter((skill) => skill.mode === 'llm');\n const scriptDepSkills = allSkills.filter(\n (skill) => skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model,\n );\n // Pairs to register with the health monitor (any mode + declared provider+model).\n // Keyed by `provider::model`; deduplicated across skills so we don't probe\n // the same key twice when several skills share the same LLM dependency.\n const monitorPairs = new Map<string, { provider: LlmProvider; model: string }>();\n // Triples to build LlmClient instances for (mode=llm only).\n const triplesByKey = new Map<string, ResolvedSkillLlm>();\n const dependentSkillsByProvider = new Map<LlmProvider, string[]>();\n let agentDefaultCacheKey: string | undefined;\n const llmClientCache = new Map<string, LlmClient>();\n const healthMonitor = new LlmHealthMonitor();\n\n if (llmSkills.length > 0 || scriptDepSkills.length > 0) {\n const resolutionErrors: string[] = [];\n\n for (const skill of llmSkills) {\n const skillMdPath = join(skillsDir, skill.name, 'SKILL.md');\n const result = resolveSkillLlm(\n { skillName: skill.name, skillMdPath, llmOverride: skill.llmOverride },\n loaded.yaml.llm,\n );\n if ('error' in result) {\n resolutionErrors.push(result.error);\n continue;\n }\n const cacheKey = cacheKeyFor(result);\n triplesByKey.set(cacheKey, result);\n monitorPairs.set(`${result.provider}::${result.model}`, {\n provider: result.provider,\n model: result.model,\n });\n skill.resolvedTriple = {\n provider: result.provider,\n model: result.model,\n maxTokens: result.maxTokens,\n };\n const list = dependentSkillsByProvider.get(result.provider) ?? [];\n list.push(skill.name);\n dependentSkillsByProvider.set(result.provider, list);\n }\n\n // Script-mode skills: register their declared (provider, model) for\n // health monitoring. No LlmClient is built - the script does its own\n // HTTP. The all-or-nothing parse invariant guarantees both `provider`\n // and `model` are set when we reach this branch (validateLlmOverride).\n for (const skill of scriptDepSkills) {\n const provider = skill.llmOverride?.provider as LlmProvider;\n const model = skill.llmOverride?.model as string;\n monitorPairs.set(`${provider}::${model}`, { provider, model });\n const list = dependentSkillsByProvider.get(provider) ?? [];\n if (!list.includes(skill.name)) {\n list.push(skill.name);\n }\n dependentSkillsByProvider.set(provider, list);\n }\n\n if (resolutionErrors.length > 0) {\n for (const message of resolutionErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n if (loaded.yaml.llm) {\n const agentDefaultTriple: ResolvedSkillLlm = {\n provider: loaded.yaml.llm.provider as LlmProvider,\n model: loaded.yaml.llm.model,\n maxTokens: loaded.yaml.llm.max_tokens,\n };\n const agentKey = cacheKeyFor(agentDefaultTriple);\n if (triplesByKey.has(agentKey)) {\n agentDefaultCacheKey = agentKey;\n }\n }\n\n // Resolve + verify each provider's API key once.\n const keyByProvider = new Map<LlmProvider, string>();\n const keyErrors: string[] = [];\n for (const [provider, dependents] of dependentSkillsByProvider) {\n const keyResult = resolveProviderApiKey({\n provider,\n secrets: loaded.secrets,\n dependentSkills: dependents,\n });\n if ('error' in keyResult) {\n keyErrors.push(keyResult.error);\n continue;\n }\n keyByProvider.set(provider, keyResult.apiKey);\n }\n if (keyErrors.length > 0) {\n for (const message of keyErrors) {\n console.error(` ! ${message}`);\n }\n console.error('');\n process.exit(1);\n }\n\n // Deep-verify each unique (provider, model) pair the agent will use.\n // Deep verification consumes one billing token per probe (~$0.00001\n // on Haiku) but distinguishes valid keys from billing-exhausted ones,\n // which `/v1/models` cannot. Iterates `monitorPairs` so script-mode\n // skills that declared `provider`+`model` are probed too.\n for (const [, pair] of monitorPairs) {\n const apiKey = keyByProvider.get(pair.provider);\n if (!apiKey) {\n continue;\n }\n const envVar =\n getLlmProvider(pair.provider)?.envVar ?? `${pair.provider.toUpperCase()}_API_KEY`;\n process.stdout.write(` Verifying ${pair.provider} ${pair.model}... `);\n const verification = await verifyLlmApiKeyDeep(pair.provider, apiKey, pair.model);\n const descriptor = getLlmProvider(pair.provider);\n const verifyFn = async (signal?: AbortSignal) =>\n descriptor\n ? descriptor.verifyKeyDeep(apiKey, pair.model, signal)\n : { ok: false as const, reason: 'unavailable' as const, error: 'no descriptor' };\n healthMonitor.register({\n provider: pair.provider,\n model: pair.model,\n verifyFn,\n });\n healthMonitor.seed(pair.provider, pair.model, verification);\n if (verification.ok) {\n console.log('ok');\n } else if (verification.reason === 'invalid') {\n console.log('INVALID');\n console.error(` ! ${pair.provider} rejected the API key (HTTP ${verification.status}).`);\n console.error(\n ` Update it via \\`npx @elisym/cli profile ${agentName}\\` or set ${envVar} to a valid key.\\n`,\n );\n process.exit(1);\n } else if (verification.reason === 'billing') {\n console.log('BILLING');\n const detail = verification.body ? ` ${verification.body.slice(0, 200)}` : '';\n console.error(\n ` ! ${pair.provider} reports a billing/quota issue for ${pair.model}.${detail}`,\n );\n console.error(\n ` Top up the account at the provider console, or set ${envVar} to a key on a funded org.\\n`,\n );\n process.exit(1);\n } else {\n console.log('unavailable');\n console.warn(\n ` ! Could not verify ${pair.provider} ${pair.model} (${verification.error}). Continuing - jobs will fail if the key is invalid.\\n`,\n );\n }\n }\n\n // Eager client construction. One LlmClient per unique triple.\n for (const [cacheKey, triple] of triplesByKey) {\n const apiKey = keyByProvider.get(triple.provider);\n if (!apiKey) {\n // Should never happen - keyByProvider is built from the same provider\n // set as the triples. Defensive guard for type narrowing.\n console.error(` ! Internal error: no API key for provider \"${triple.provider}\".\\n`);\n process.exit(1);\n }\n const config: LlmConfig = {\n provider: triple.provider,\n apiKey,\n model: triple.model,\n maxTokens: triple.maxTokens,\n logUsage: true,\n };\n llmClientCache.set(cacheKey, createLlmClient(config));\n }\n } else {\n console.log(' No LLM-dependent skills loaded; skipping LLM key check.\\n');\n }\n\n const agentDefaultClient =\n agentDefaultCacheKey !== undefined ? llmClientCache.get(agentDefaultCacheKey) : undefined;\n\n const getLlm = (override?: SkillLlmOverride): LlmClient | undefined => {\n const triple = resolveTripleForOverride(override, loaded.yaml.llm);\n if (!triple) {\n return undefined;\n }\n return llmClientCache.get(cacheKeyFor(triple));\n };\n\n const skillCtx: SkillContext = {\n llm: agentDefaultClient,\n getLlm,\n agentName,\n agentDescription: loaded.yaml.description ?? '',\n };\n\n // -- Step 8: Connect to relays --\n console.log(' Connecting to relays and publishing capabilities...');\n\n const identity = ElisymIdentity.fromHex(loaded.secrets.nostr_secret_key);\n const relays = loaded.yaml.relays.length > 0 ? loaded.yaml.relays : [...RELAYS];\n const client = new ElisymClient({ relays });\n\n // Opt-in DNS + TCP connectivity probe for WSL / Windows / corporate\n // firewall troubleshooting. Runs once before publish so the operator\n // sees the result in the startup banner.\n if (process.env.ELISYM_NET_DIAG === '1') {\n console.log(' [net-diag] Probing relay DNS + TCP connectivity...');\n const results = await probeRelays(relays, logger);\n for (const result of results) {\n const ipSummary = result.ips.length > 0 ? result.ips.join(',') : '-';\n if (result.tcpOpenMs !== undefined) {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} TCP open in ${result.tcpOpenMs}ms`);\n } else {\n console.log(` [net-diag] ${result.url} -> ${ipSummary} FAILED: ${result.error ?? '?'}`);\n }\n }\n }\n\n // -- Step 9: Resolve media URLs via cache (no SKILL.md mutation) --\n const media = new MediaService();\n const mediaCache = await readMediaCache(loaded.dir);\n let mediaCacheDirty = false;\n\n const pictureUrl = await resolveMediaField(\n loaded.yaml.picture,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n const bannerUrl = await resolveMediaField(\n loaded.yaml.banner,\n loaded.dir,\n mediaCache,\n media,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n\n for (const skill of allSkills) {\n if (skill.image || !skill.imageFile || !skill.dir) {\n continue;\n }\n const skillRoot = skill.dir;\n const folderName = basename(skillRoot);\n const cacheKey = `./skills/${folderName}/${skill.imageFile}`;\n const absPath = join(skillRoot, skill.imageFile);\n const url = await uploadOrReuse(\n cacheKey,\n absPath,\n mediaCache,\n media,\n identity,\n () => (mediaCacheDirty = true),\n );\n if (url) {\n skill.image = url;\n }\n }\n\n if (mediaCacheDirty) {\n await writeMediaCache(loaded.dir, mediaCache);\n }\n\n // -- Step 10: Publish kind:0 profile --\n let profilePublished = false;\n try {\n await client.discovery.publishProfile(\n identity,\n loaded.yaml.display_name ?? agentName,\n loaded.yaml.description ?? '',\n pictureUrl,\n bannerUrl,\n );\n profilePublished = true;\n logger.debug({ event: 'publish_ack', kind: 0 }, 'profile published');\n } catch (e: any) {\n console.warn(` ! Failed to publish profile: ${e.message}`);\n logger.warn({ event: 'publish_failed', kind: 0, error: e.message }, 'profile publish failed');\n }\n\n // -- Step 10.5: Publish agent policies (NIP-23 long-form articles, kind 30023) --\n // `localPolicyDTags` is built from disk before the publish loop so a transient\n // publish failure does not cause Step 10.6 to tombstone the prior good version\n // still on the relay. Mirrors the kind:31990 cleanup in Step 12 which builds\n // `skillDTags` upfront from `allSkills` - delete-on-disk = retract-from-relay,\n // not \"delete-on-failed-publish\".\n const policies = existsSync(paths.policies) ? loadPoliciesFromDir(paths.policies) : [];\n const localPolicyDTags = new Set(\n policies.map((policy) => `${POLICY_D_TAG_PREFIX}${policy.type}`),\n );\n for (const policy of policies) {\n try {\n const { naddr } = await client.policies.publishPolicy(identity, policy);\n console.log(` * Policy: ${policy.type}@${policy.version} -> ${naddr}`);\n logger.debug(\n { event: 'publish_ack', kind: KIND_LONG_FORM_ARTICLE, policy: policy.type, naddr },\n 'policy published',\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish policy \"${policy.type}\": ${e.message}`);\n logger.warn(\n {\n event: 'publish_failed',\n kind: KIND_LONG_FORM_ARTICLE,\n policy: policy.type,\n error: e.message,\n },\n 'policy publish failed',\n );\n }\n }\n\n // -- Step 10.6: Tombstone orphan policies (file removed from disk) --\n try {\n const existingPolicies = await client.pool.querySync({\n kinds: [KIND_LONG_FORM_ARTICLE],\n authors: [identity.publicKey],\n '#t': [POLICY_T_TAG],\n });\n for (const event of existingPolicies) {\n const dTag = event.tags.find((tag) => tag[0] === 'd')?.[1];\n if (!dTag || localPolicyDTags.has(dTag)) {\n continue;\n }\n // Skip already-tombstoned events (empty content) so we don't re-publish identical retractions every start.\n if (!event.content) {\n continue;\n }\n const type = event.tags.find((tag) => tag[0] === 'policy_type')?.[1];\n if (!type) {\n continue;\n }\n try {\n await client.policies.deletePolicy(identity, type);\n console.log(` Removed stale policy: ${type}`);\n } catch {\n // non-fatal, will retry next start\n }\n }\n } catch {\n // non-fatal: stale policies stay on relay, agent still starts\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 const isStatic = skill.mode === 'static-file' || skill.mode === 'static-script';\n return {\n name: skill.name,\n description: skill.description,\n capabilities: skill.capabilities,\n image: skill.image,\n ...(isStatic ? { static: true } : {}),\n // File-exchange hints (dynamic-script only). `inputMime` lets clients that\n // cannot send files (the web app) gate the Buy button before payment.\n ...(skill.inputMime ? { inputMime: skill.inputMime } : {}),\n ...(skill.outputMime ? { outputMime: skill.outputMime } : {}),\n payment: solanaAddress\n ? {\n chain: 'solana',\n network: walletNetwork,\n address: solanaAddress,\n job_price: skill.priceSubunits,\n token: skill.asset.token,\n ...(skill.asset.mint ? { mint: skill.asset.mint } : {}),\n decimals: skill.asset.decimals,\n symbol: skill.asset.symbol,\n }\n : undefined,\n };\n }\n\n let cardsPublished = 0;\n for (const skill of allSkills) {\n try {\n await client.discovery.publishCapability(identity, buildCard(skill), kinds);\n cardsPublished += 1;\n logger.debug(\n { event: 'publish_ack', kind: 31990, skill: skill.name },\n 'capability card published',\n );\n } catch (e: any) {\n console.warn(` ! Failed to publish \"${skill.name}\": ${e.message}`);\n logger.warn(\n { event: 'publish_failed', kind: 31990, skill: skill.name, error: e.message },\n 'capability publish failed',\n );\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 // Compare by d-tag, not card.name. toDTag() is lossy (e.g. \"WHOIS Lookup\"\n // and \"whois-lookup\" collapse to the same d-tag), so name-based comparison\n // can flag a card whose d-tag actually matches an active skill - the\n // resulting deletion event then replaces the freshly-published card on the\n // relay (kind:31990 is replaceable by author+kind+d-tag).\n const skillDTags = new Set(allSkills.map((s) => toDTag(s.name)));\n for (const ev of existingEvents) {\n const dTag = ev.tags.find((t: string[]) => t[0] === 'd')?.[1];\n if (!dTag || skillDTags.has(dTag)) {\n continue;\n }\n try {\n const card = JSON.parse(ev.content);\n if (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 if (verbose) {\n console.log(\n ` [debug] Published: profile=${profilePublished ? 'ok' : 'FAILED'} + ${cardsPublished}/${allSkills.length} capability cards (kind:31990)`,\n );\n console.log(` [debug] Relays: ${relays.length} configured (${relays.join(', ')})`);\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: Build transport + ledger + runtime --\n const transport = new NostrTransport(client, identity, [DEFAULT_KIND_OFFSET]);\n const ledger = new JobLedger(paths.jobs);\n // iroh blob transport for file results, bound to a persistent fs-store at\n // <agent-dir>/.iroh/ (the node is created lazily on the first transfer).\n const irohTransport = createIrohTransport({ storePath: join(loaded.dir, '.iroh') });\n // Migration: ensure a project-local .gitignore created before `.iroh/` became a\n // default ignore entry still excludes the (cleartext) blob store.\n await ensureGitignoreHasIrohEntry(dirname(loaded.dir));\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 // Agent-level default execution budget; per-skill `max_execution_secs`\n // overrides it. Undefined => unlimited (operator-owned, no protocol default).\n executionTimeoutSecs: loaded.yaml.execution_timeout_secs,\n };\n\n // Custom SOLANA_RPC_URL values (Helius, Alchemy, QuickNode) routinely\n // embed API keys in the query string. Strip query + auth before logging\n // so `--verbose` never publishes a third-party RPC credential.\n const rpcUrlForLog = stripRpcSecrets(process.env.SOLANA_RPC_URL ?? getRpcUrl(walletNetwork));\n logger.debug(\n {\n event: 'config_resolved',\n agent: agentName,\n source: loaded.source,\n network: walletNetwork,\n relays,\n solanaAddress,\n rpcUrl: rpcUrlForLog,\n },\n 'config resolved',\n );\n\n // Tee: banner-style indent line on stdout (existing UX) + structured\n // stderr pino entry with shared redact paths (defence against future\n // slips where a diagnostic string might embed user input).\n const diagLog = (msg: string): void => {\n logWithIndent(msg);\n logger.info({ event: 'runtime_diag' }, msg);\n };\n\n const watchdog = startWatchdog({\n client,\n identity,\n transport,\n onPing,\n log: diagLog,\n logger,\n });\n\n let llmHeartbeat: HeartbeatHandle | undefined;\n if (monitorPairs.size > 0) {\n llmHeartbeat = startLlmRecovery({\n monitor: healthMonitor,\n log: diagLog,\n });\n diagLog('LLM health monitor armed (lazy recovery, 5min interval).');\n }\n\n const runtime = new AgentRuntime(\n transport,\n registry,\n skillCtx,\n runtimeConfig,\n ledger,\n {\n onJobReceived: (job) => {\n // The capability tag is an attacker-controlled Nostr tag value; strip terminal\n // control chars before it reaches stdout. Never log job.input here - the\n // capability tag is the only descriptor needed.\n const cap = sanitizeForTerminal(job.tags.find((t) => t !== 'elisym') ?? 'unknown');\n process.stdout.write(` [job] ${job.jobId.slice(0, 16)} | cap=${cap}\\n`);\n logger.info({ event: 'job_received', jobId: job.jobId, capability: cap });\n },\n onJobCompleted: (jobId) => {\n process.stdout.write(` [job] ${jobId.slice(0, 16)} | delivered\\n`);\n logger.info({ event: 'job_delivered', jobId });\n },\n onJobError: (jobId, error) => {\n const safeError = sanitizeForTerminal(error);\n process.stderr.write(` [job] ${jobId.slice(0, 16)} | error: ${safeError}\\n`);\n logger.error({ event: 'job_error', jobId, error: safeError });\n },\n onLog: diagLog,\n onStop: () => {\n watchdog.stop();\n llmHeartbeat?.stop();\n },\n },\n healthMonitor,\n irohTransport,\n );\n\n // -- Step 15: Run --\n console.log(' * Running. Press Ctrl+C to stop.\\n');\n await runtime.run();\n}\n\n/**\n * Public Solana RPC hosts whose URL path carries no secret. For these the\n * path is safe to keep; every other host is treated as a third-party RPC\n * (Helius/Alchemy/QuickNode) whose path may embed an API key.\n */\nconst PUBLIC_SOLANA_RPC_HOSTS = new Set([\n 'api.devnet.solana.com',\n 'api.mainnet-beta.solana.com',\n 'api.testnet.solana.com',\n]);\n\n/**\n * Return a log-safe representation of an RPC URL. Strips any userinfo and\n * query string so credentials embedded by third-party RPC providers\n * (Helius/Alchemy/QuickNode style `?api-key=...`) never land in verbose\n * stderr output or the startup banner.\n *\n * FIX #11: Alchemy/QuickNode embed the API key in the URL *path* (e.g.\n * `https://solana-mainnet.g.alchemy.com/v2/<APIKEY>`), so stripping only the\n * userinfo + query still leaks the key. For any host that is not a public\n * `api.*.solana.com` endpoint we therefore redact the path too, returning just\n * `protocol//host/***`. Public Solana hosts keep their (secret-free) path.\n */\nexport function stripRpcSecrets(raw: string): string {\n try {\n const parsed = new URL(raw);\n parsed.username = '';\n parsed.password = '';\n if (!PUBLIC_SOLANA_RPC_HOSTS.has(parsed.hostname)) {\n // Third-party RPC: the path may carry an API key - drop it entirely.\n return `${parsed.protocol}//${parsed.host}/***`;\n }\n const marker = parsed.search.length > 0 ? '?***' : '';\n parsed.search = '';\n return `${parsed.toString()}${marker}`;\n } catch {\n return '[unparseable RPC URL]';\n }\n}\n\n/** Resolve a YAML media field (picture/banner) - URL returned as-is, local path uploaded via cache. */\nasync function resolveMediaField(\n value: string | undefined,\n agentDir: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: (updated: boolean) => void,\n): Promise<string | undefined> {\n if (!value) {\n return undefined;\n }\n if (isRemoteUrl(value)) {\n return value;\n }\n const absPath = resolveInsideAgentDir(value, agentDir);\n if (!absPath) {\n console.warn(` ! Skipping media field \"${value}\": path must stay inside the agent directory.`);\n return undefined;\n }\n return uploadOrReuse(value, absPath, cache, media, identity, () => onCacheUpdate(true));\n}\n\n/**\n * Resolve a YAML-supplied path against `agentDir` and reject anything that\n * escapes the agent directory (`..` segments, absolute paths outside it).\n * Returns null on rejection so callers can warn and skip the field.\n */\nfunction resolveInsideAgentDir(value: string, agentDir: string): string | null {\n const agentRoot = resolve(agentDir);\n const candidate = resolve(agentRoot, value);\n const rel = relative(agentRoot, candidate);\n if (rel === '' || rel.startsWith('..') || rel.includes(`..${sep}`)) {\n return null;\n }\n return candidate;\n}\n\n/** Look up `cacheKey` in cache; if hit returns URL, else uploads and updates cache. */\nasync function uploadOrReuse(\n cacheKey: string,\n absPath: string,\n cache: MediaCache,\n media: MediaService,\n identity: ElisymIdentity,\n onCacheUpdate: () => void,\n): Promise<string | undefined> {\n try {\n const cached = await lookupCachedUrl(cache, cacheKey, absPath);\n if (cached) {\n return cached;\n }\n console.log(` Uploading ${basename(absPath)}...`);\n const data = readFileSync(absPath);\n const sha256 = createHash('sha256').update(data).digest('hex');\n const blob = new Blob([data]);\n const url = await media.upload(identity, blob, basename(absPath));\n cache[cacheKey] = newCacheEntry(url, sha256);\n onCacheUpdate();\n console.log(` Uploaded: ${url}`);\n return url;\n } catch (e: any) {\n console.warn(` ! Failed to upload ${basename(absPath)}: ${e.message}`);\n return undefined;\n }\n}\n\nfunction isRemoteUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value);\n}\n\nconst MAX_PASSPHRASE_ATTEMPTS = 3;\n\n/**\n * Resolve the agent to start. Returns undefined when the user picked\n * \"+ Create new agent\" and the init wizard ran - the caller should exit.\n */\nasync function resolveStartAgentName(\n nameArg: string | undefined,\n cwd: string,\n): Promise<string | undefined> {\n if (nameArg) {\n return nameArg;\n }\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n console.log('No agents configured. Run `npx @elisym/cli init` first.');\n process.exit(1);\n }\n const { default: inquirer } = await import('inquirer');\n const choices = [\n ...agents.map((agent) => ({\n name: `${agent.name} (${agent.source}${agent.shadowsGlobal ? ' - shadows global' : ''})`,\n value: agent.name,\n })),\n { name: '+ Create new agent', value: '__new__' },\n ];\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 return undefined;\n }\n return selected;\n}\n\nasync function loadAgentWithPrompt(name: string, cwd: string): Promise<LoadedAgent> {\n const envPassphrase = process.env.ELISYM_PASSPHRASE;\n try {\n return await loadAgent(name, cwd, envPassphrase);\n } catch (e: any) {\n const isEncrypted = /encrypted secrets/i.test(e?.message ?? '');\n const isWrongPassphrase = /Decryption failed/i.test(e?.message ?? '');\n if (!isEncrypted && !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 await loadAgent(name, cwd, 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 * Resolve the effective LLM config for a single skill.\n *\n * Combines the skill-level `llmOverride` with the agent-level default. The\n * (provider, model) pair is all-or-nothing at the override level (enforced\n * at parse time in the SDK skill loader); `maxTokens` chains independently.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { Skill, SkillLlmOverride } from '@elisym/sdk/skills';\nimport type { LlmProvider } from './index';\n\nexport const DEFAULT_MAX_TOKENS = 4096;\n\nexport interface ResolvedSkillLlm {\n provider: LlmProvider;\n model: string;\n maxTokens: number;\n}\n\nexport interface ResolveSkillLlmInput {\n skillName: string;\n /** Filesystem path to the SKILL.md so error messages point at the exact file. */\n skillMdPath: string;\n llmOverride?: SkillLlmOverride;\n}\n\nexport type ResolveSkillLlmResult = ResolvedSkillLlm | { error: string };\n\n/**\n * Resolve a skill to a concrete (provider, model, maxTokens). Returns an\n * `error` shape when the skill is `mode: 'llm'` but neither side declared\n * provider/model.\n */\nexport function resolveSkillLlm(\n input: ResolveSkillLlmInput,\n agentDefault: LlmEntry | undefined,\n): ResolveSkillLlmResult {\n const override = input.llmOverride;\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n\n if (!provider || !model) {\n return {\n error:\n `Skill \"${input.skillName}\" at ${input.skillMdPath}: LLM model is required - ` +\n `declare \"provider\" + \"model\" in the SKILL.md frontmatter or set agent-level llm ` +\n `via 'npx @elisym/cli profile <agent>'.`,\n };\n }\n\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n\n return { provider, model, maxTokens };\n}\n\n/** Lift the override fields from a `Skill` into the input shape used here. */\nexport function skillResolveInput(skill: Skill, skillMdPath: string): ResolveSkillLlmInput {\n return {\n skillName: skill.name,\n skillMdPath,\n llmOverride: skill.llmOverride,\n };\n}\n","/**\n * Per-skill LLM client caching.\n *\n * Different LLM skills may share or differ on (provider, model, maxTokens).\n * We deduplicate clients by a stable JSON-encoded triple so verifying API\n * keys and instantiating clients happens once per unique config.\n */\n\nimport type { LlmEntry } from '@elisym/sdk/agent-store';\nimport type { SkillLlmOverride } from '@elisym/sdk/skills';\nimport { DEFAULT_MAX_TOKENS, type ResolvedSkillLlm } from './resolve';\nimport type { LlmProvider } from './index';\n\n/**\n * Stable cache key for an LLM client config. JSON-encoded so any provider /\n * model string is safely escaped (avoids ad-hoc separator collisions).\n */\nexport function cacheKeyFor(triple: ResolvedSkillLlm): string {\n return JSON.stringify({\n provider: triple.provider,\n model: triple.model,\n maxTokens: triple.maxTokens,\n });\n}\n\n/**\n * Resolve an `llmOverride` to a concrete (provider, model, maxTokens) using\n * the agent-level default for any field the override leaves unset. Returns\n * `undefined` when no agent-level default exists and the override is partial\n * (no provider/model) - the caller treats that as \"no client available\".\n */\nexport function resolveTripleForOverride(\n override: SkillLlmOverride | undefined,\n agentDefault: LlmEntry | undefined,\n): ResolvedSkillLlm | undefined {\n const overridePairSet = override?.provider !== undefined && override.model !== undefined;\n let provider: LlmProvider | undefined;\n let model: string | undefined;\n if (overridePairSet) {\n provider = override.provider;\n model = override.model;\n } else if (agentDefault) {\n provider = agentDefault.provider;\n model = agentDefault.model;\n }\n if (!provider || !model) {\n return undefined;\n }\n const maxTokens = override?.maxTokens ?? agentDefault?.max_tokens ?? DEFAULT_MAX_TOKENS;\n return { provider, model, maxTokens };\n}\n","/**\n * Resolve the API key for a given provider, walking the priority chain:\n *\n * 1. `secrets.llm_api_keys[<provider>]` (per-provider entry, preferred).\n * 2. `process.env.<descriptor.envVar>` (operator convenience).\n */\n\nimport type { Secrets } from '@elisym/sdk/agent-store';\nimport { getLlmProvider } from './registry';\nimport type { LlmProvider } from './index';\n\nexport interface ResolvedProviderKey {\n apiKey: string;\n origin: 'secrets-per-provider' | 'env';\n}\n\nexport type ResolveProviderKeyResult = ResolvedProviderKey | { error: string };\n\nexport interface ResolveProviderKeyInput {\n provider: LlmProvider;\n secrets: Secrets;\n /** Names of skills that resolved to this provider. Surfaced in error messages. */\n dependentSkills: string[];\n}\n\nexport function resolveProviderApiKey(input: ResolveProviderKeyInput): ResolveProviderKeyResult {\n const { provider, secrets, dependentSkills } = input;\n\n const descriptor = getLlmProvider(provider);\n if (!descriptor) {\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error: `Provider \"${provider}\" is not registered (required by skill(s): ${skillList}).`,\n };\n }\n\n const perProviderValue = secrets.llm_api_keys?.[provider];\n if (typeof perProviderValue === 'string' && perProviderValue.length > 0) {\n return { apiKey: perProviderValue, origin: 'secrets-per-provider' };\n }\n\n const envValue = process.env[descriptor.envVar];\n if (envValue) {\n return { apiKey: envValue, origin: 'env' };\n }\n\n const skillList = dependentSkills.length > 0 ? dependentSkills.join(', ') : '<none>';\n return {\n error:\n `Provider \"${provider}\" needs an API key (required by skill(s): ${skillList}). ` +\n `Set secrets.llm_api_keys.${provider} via 'npx @elisym/cli profile <agent>' or export ${descriptor.envVar}.`,\n };\n}\n","/**\n * Structured logger for the CLI. Stdout stays reserved for the\n * human-readable banner (rendered via `logWithIndent`). Diagnostic\n * output - incoming events, relay lifecycle, publish acks, watchdog\n * decisions - goes to stderr as JSON by default, or pretty-printed\n * when the process is attached to a TTY and pino-pretty is available.\n *\n * Redaction uses the SDK's DEFAULT_REDACT_PATHS so secret keys and\n * user input cannot leak through structured logs even in verbose mode.\n */\nimport { DEFAULT_REDACT_PATHS, makeCensor } from '@elisym/sdk';\nimport pino, { type Logger } from 'pino';\n\nexport interface CreateLoggerOptions {\n /** When true, set level to 'debug' and emit the debug firehose. */\n verbose?: boolean;\n /** When true, pretty-print to stderr; otherwise raw JSON to stderr. */\n tty?: boolean;\n /** Override the log level directly (takes precedence over verbose). */\n level?: string;\n /** Escape hatch for tests: redirect structured output to an explicit stream. */\n destination?: pino.DestinationStream;\n}\n\nexport interface CliLogger {\n logger: Logger;\n /** Pretty 2-space-indented write to stdout, used by the startup banner. */\n logWithIndent(line: string): void;\n /** Banner-only write to stdout. Semantically identical to logWithIndent. */\n bannerLog(line: string): void;\n}\n\n/**\n * Strip terminal control characters before writing remote-derived content to the\n * operator's terminal. Nostr tag values and provider error strings are attacker-\n * controlled; raw ANSI escapes (`\\x1b`), carriage returns, and other C0/C1 controls\n * could spoof output, hide text, or overwrite earlier lines. Keeps tab and newline.\n */\nexport function sanitizeForTerminal(value: string): string {\n // eslint-disable-next-line no-control-regex\n return value.replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f]/g, '');\n}\n\nfunction resolveLevel(options: CreateLoggerOptions): string {\n if (options.level) {\n return options.level;\n }\n if (options.verbose) {\n return 'debug';\n }\n const envLevel = process.env.LOG_LEVEL;\n if (envLevel) {\n return envLevel;\n }\n return 'info';\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): CliLogger {\n const level = resolveLevel(options);\n const baseOptions: pino.LoggerOptions = {\n name: 'elisym-cli',\n level,\n redact: {\n paths: DEFAULT_REDACT_PATHS,\n censor: makeCensor(),\n },\n };\n\n let logger: Logger;\n if (options.destination) {\n logger = pino(baseOptions, options.destination);\n } else if (options.tty === true) {\n logger = pino({\n ...baseOptions,\n transport: {\n target: 'pino-pretty',\n options: { destination: 2, colorize: true, translateTime: 'HH:MM:ss' },\n },\n });\n } else {\n // Raw JSON to stderr (fd 2) so stdout stays clean for the banner.\n logger = pino(baseOptions, pino.destination(2));\n }\n\n function logWithIndent(line: string): void {\n process.stdout.write(` ${sanitizeForTerminal(line)}\\n`);\n }\n\n return {\n logger,\n logWithIndent,\n bannerLog: logWithIndent,\n };\n}\n","import { mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { basename, join } from 'node:path';\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 NATIVE_SOL,\n SolanaPaymentStrategy,\n calculateProtocolFee,\n createSlidingWindowLimiter,\n decodeJobPayload,\n formatAssetAmount,\n getProtocolConfig,\n getProtocolProgramId,\n LIMITS,\n utf8ByteLength,\n} from '@elisym/sdk';\nimport type { Asset, FileAttachment, ProtocolConfigInput, SlidingWindowLimiter } from '@elisym/sdk';\nimport {\n createFreeLlmLimiterSet,\n FREE_LLM_GLOBAL_KEY,\n freeLlmCustomerKey,\n LlmHealthError,\n ScriptBillingExhaustedError,\n ScriptExecutionError,\n type FreeLlmLimiterSet,\n type LlmHealthMonitor,\n} from '@elisym/sdk/llm-health';\nimport type { IrohBlobTransport } from '@elisym/sdk/node';\nimport { createSolanaRpc } from '@solana/kit';\nimport pLimit from 'p-limit';\nimport { getRpcUrl } from './helpers.js';\nimport { JobLedger } from './ledger.js';\nimport type { SkillRegistry, SkillContext, SkillOutput } 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 LEDGER_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days, mirrors plugin\n/**\n * Hard cutoff for `paid` jobs that the recovery loop is waiting to\n * re-execute against an unhealthy LLM pair. After this age the customer\n * is given up on, the entry is marked `failed`, and a final error\n * feedback is fired. Without this, an operator who walks away from a\n * billing-exhausted agent leaves the ledger and recovery loop spinning\n * on a job nobody will ever deliver.\n */\nconst MAX_PAID_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n// How long the Nostr-feedback signature path waits for a `payment-completed`\n// before giving up. Solana confirmation + wallet signing is single-digit\n// seconds in the happy path, so 60s is generous; past that the customer is\n// almost certainly not coming back and the slot should be released.\nconst SIG_PATH_TIMEOUT_MS = 60 * 1000;\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 * Agent-level default execution budget (seconds) applied to skills that do\n * not set their own `max_execution_secs`. `0` or `undefined` => unlimited\n * (the protocol imposes no default; the operator owns this). A per-skill\n * `executionTimeoutSecs` takes precedence over this.\n */\n executionTimeoutSecs?: 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, 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?.priceSubunits ?? 0;\n}\n\n/** Resolve the payment asset the matched skill is denominated in. Defaults to SOL. */\nfunction resolveJobAsset(tags: string[], skills: SkillRegistry): Asset {\n const skill = skills.route(tags);\n return skill?.asset ?? NATIVE_SOL;\n}\n\n/**\n * Markers that indicate an LLM provider's HTTP response body is about\n * billing / quota exhaustion rather than something benign. Mirrors the\n * marker sets in `cli/src/llm/providers/{anthropic,openai,openai-compatible}.ts`\n * (kept as a permissive superset so any provider's billing language is\n * detected when classifying mid-job errors). Refactoring to a single\n * shared module is out of scope here - just keep this list in sync.\n */\nconst BILLING_BODY_MARKERS = ['credit balance', 'billing', 'insufficient', 'insufficient_quota'];\n\n/**\n * Markers that indicate a script-skill failure (non-zero exit, non-42)\n * actually carried a billing / invalid-key signal in its stderr/stdout.\n * Reserved for the case where the script author did not honor the\n * `SCRIPT_EXIT_BILLING_EXHAUSTED = 42` contract - common with shell\n * proxies that exit 1 on every error path and dump the provider's body\n * verbatim (\"Anthropic count_tokens error: invalid x-api-key\" etc).\n *\n * Detecting these in the runtime means an operator's misbehaving script\n * still flips the health pair to unhealthy, so the next customer is\n * refused at the preflight gate (before payment) instead of paying for\n * a job that will fail identically.\n *\n * Superset of `BILLING_BODY_MARKERS`: adds auth-language markers\n * (`x-api-key`, `invalid api key`, `unauthorized`, ...) that are\n * specific to the auth/invalid bucket rather than the billing bucket.\n */\nconst SCRIPT_BILLING_INVALID_MARKERS = [\n 'credit balance',\n 'billing',\n 'insufficient',\n 'insufficient_quota',\n 'x-api-key',\n 'invalid api key',\n 'invalid_api_key',\n 'authentication_error',\n 'unauthorized',\n 'unauthenticated',\n];\n\nfunction scriptMessageLooksLikeBillingOrInvalid(message: string): boolean {\n const lower = message.toLowerCase();\n return SCRIPT_BILLING_INVALID_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Customer-facing message for both the preflight gate (cached\n * billing/invalid signal) and the post-execute path (skill.execute\n * surfaced billing/invalid mid-job). Kept identical between the two so\n * the customer sees a stable string regardless of which side of the\n * health-monitor flip their request landed on. Consumed by the SDK\n * subscription as the `onError` argument.\n */\nconst AGENT_UNAVAILABLE_MESSAGE = 'Agent temporarily unavailable';\n\n/**\n * Re-thrown by the post-execute catch when the underlying skill failure\n * was a billing / invalid signal that just flipped the health pair to\n * unhealthy. Lets `processJob`'s sanitizer surface a stable\n * customer-facing message instead of the generic \"Internal processing\n * error\" mask that otherwise hides every \"API error: ...\" string.\n */\nclass AgentUnavailableError extends Error {\n constructor() {\n super(AGENT_UNAVAILABLE_MESSAGE);\n this.name = 'AgentUnavailableError';\n }\n}\n\n/**\n * Thrown by the execute wrapper when a job exceeds its resolved execution\n * budget (`max_execution_secs` on the skill / `execution_timeout_secs` on the\n * agent). Kept distinct from `AgentUnavailableError` so a budget abort is NOT\n * misclassified as a health flip: the job is marked `failed` (not kept `paid`\n * for recovery), and the message - free of the `API` substring - is forwarded\n * verbatim past `processJob`'s leaky-error masker.\n */\nclass ExecutionBudgetExceededError extends Error {\n constructor(budgetMs: number) {\n super(`Execution exceeded budget (${Math.round(budgetMs / 1000)}s)`);\n this.name = 'ExecutionBudgetExceededError';\n }\n}\n\n// Allowlist of safe, informative messages the runtime itself produces and may\n// forward verbatim to a remote customer. Everything not matched here (raw script\n// stderr, provider internals, unexpected errors) collapses to a fixed generic\n// string; full detail is kept in the operator log only.\nconst CUSTOMER_SAFE_MESSAGE_PREFIXES = ['Input too long', 'No skill matched', 'Payment timeout'];\n\n/**\n * Resolve the error message that is safe to send to a remote customer. Inverts\n * the old leaky denylist (forward-unless-contains-\"API\") into an allowlist so\n * raw subprocess output or provider error bodies can never leak.\n */\nfunction customerSafeMessage(error: unknown): string {\n if (error instanceof AgentUnavailableError || error instanceof ExecutionBudgetExceededError) {\n return error.message;\n }\n if (error instanceof ScriptExecutionError) {\n // Generic summary only - `error.detail` (raw stderr/stdout) stays operator-side.\n return error.message;\n }\n if (error instanceof ScriptBillingExhaustedError) {\n return AGENT_UNAVAILABLE_MESSAGE;\n }\n if (\n error instanceof Error &&\n CUSTOMER_SAFE_MESSAGE_PREFIXES.some((prefix) => error.message.startsWith(prefix))\n ) {\n return error.message;\n }\n return 'Internal processing error';\n}\n\nfunction bodyLooksLikeBilling(body: string): boolean {\n const lower = body.toLowerCase();\n return BILLING_BODY_MARKERS.some((marker) => lower.includes(marker));\n}\n\n/**\n * Resolve the (provider, model) pair the matched skill depends on for\n * health-monitor gating, or `null` if the skill is not LLM-dependent.\n *\n * For `mode: 'llm'` the pair comes from `resolvedTriple` (computed at\n * startup with agent default + override). For script modes the pair\n * comes from `llmOverride.provider`+`.model` declared in SKILL.md, which\n * is the operator's signal that the script reaches an LLM API under\n * the hood. Either source produces the same (provider, model) string\n * pair the health monitor was registered with in `start.ts`.\n */\nfunction resolveHealthPair(\n skill: import('./skill').Skill | null,\n): { provider: string; model: string } | null {\n if (!skill) {\n return null;\n }\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n return {\n provider: skill.resolvedTriple.provider,\n model: skill.resolvedTriple.model,\n };\n }\n if (skill.mode !== 'llm' && skill.llmOverride?.provider && skill.llmOverride?.model) {\n return {\n provider: skill.llmOverride.provider,\n model: skill.llmOverride.model,\n };\n }\n return null;\n}\n\nconst RATE_LIMIT_WINDOW_MS = 10 * 60 * 1000; // 10 minutes\n// Free-skill caps: tight, because there is no economic deterrent against\n// loop/Sybil spam. With window == paymentTimeoutSecs (both 10 min by\n// default) these double as per-customer queue-depth caps for unpaid claims.\nconst FREE_MAX_JOBS_PER_CUSTOMER = 20;\nconst FREE_GLOBAL_MAX_JOBS_PER_WINDOW = 200;\n// Paid-skill caps: 10x looser. Payment is the economic deterrent against\n// loop abuse, but the sliding-window cap is still needed to bound the\n// \"claim paid skill but never pay\" queue-spam vector. 200 per customer\n// supports legitimate batch workloads (e.g. translating a 200-paragraph\n// document) without rejecting; 2000 global leaves room for ~10 concurrent\n// batch customers before saturation kicks in.\nconst PAID_MAX_JOBS_PER_CUSTOMER = 200;\nconst PAID_GLOBAL_MAX_JOBS_PER_WINDOW = 2000;\nconst MAX_TRACKED_CUSTOMERS = 1000;\nconst GLOBAL_LIMITER_KEY = '__global__';\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 for free skills. */\n private freeCustomerLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: FREE_MAX_JOBS_PER_CUSTOMER,\n maxKeys: MAX_TRACKED_CUSTOMERS,\n });\n /** Global sliding-window rate limiter for free skills (Sybil protection). */\n private freeGlobalLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: FREE_GLOBAL_MAX_JOBS_PER_WINDOW,\n maxKeys: 1,\n });\n /**\n * Per-customer sliding-window limiter for paid skills (10x looser than free).\n * Payment is the primary economic deterrent; this cap exists to bound the\n * \"claim paid skill but never pay\" queue-spam vector.\n */\n private paidCustomerLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: PAID_MAX_JOBS_PER_CUSTOMER,\n maxKeys: MAX_TRACKED_CUSTOMERS,\n });\n /** Global sliding-window limiter for paid skills (Sybil protection, 10x free). */\n private paidGlobalLimiter: SlidingWindowLimiter = createSlidingWindowLimiter({\n windowMs: RATE_LIMIT_WINDOW_MS,\n maxPerWindow: PAID_GLOBAL_MAX_JOBS_PER_WINDOW,\n maxKeys: 1,\n });\n /**\n * Two-tier limiter applied only to free LLM skills (mode='llm', price=0).\n * Existing per-customer + global limiters above remain in effect for all\n * jobs; this set adds tighter caps to prevent unpaid spam from draining\n * the operator's API key.\n */\n private freeLlmLimiters: FreeLlmLimiterSet = createFreeLlmLimiterSet();\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 private healthMonitor?: LlmHealthMonitor,\n private irohTransport?: IrohBlobTransport,\n ) {\n this.limit = pLimit(config.maxConcurrentJobs);\n this.maxQueueSize = config.maxQueueSize ?? config.maxConcurrentJobs * 10;\n }\n\n /**\n * Inspect an error thrown by `skill.execute()` and, when it carries a\n * billing/invalid signal from the LLM provider, flip the matching\n * (provider, model) pair to unhealthy via the health monitor. The next\n * job hitting the same pair is then refused at the preflight gate\n * before payment, so customers don't keep paying for jobs that will\n * fail. Recovery happens through the lazy recovery loop.\n *\n * Two error shapes are recognized:\n *\n * - `ScriptBillingExhaustedError` - thrown by SDK script skills when\n * the spawned process exits with `SCRIPT_EXIT_BILLING_EXHAUSTED`.\n * Pair comes from `skill.llmOverride` (operator-declared).\n *\n * - LLM provider HTTP error from `mode: 'llm'` - bare `Error` whose\n * message starts with \"<Provider> API error: <status> <body>\" (the\n * format every CLI provider currently uses). We classify on status:\n * 402 / 401 / 403 -> mark unhealthy. Body markers (`credit\n * balance`, `billing`, `insufficient`) catch the 400-on-billing case\n * Anthropic returns and the 429+`insufficient_quota` case OpenAI\n * and the openai-compatible providers (xAI/Google/DeepSeek) return.\n * Pair comes from `skill.resolvedTriple`.\n *\n * Anything else is a transient/skill error and does NOT touch health\n * state - the recovery loop should not be poisoned by skill bugs.\n */\n /**\n * Build a \"and N other model(s) for the same provider\" suffix for\n * cascade-narrating log lines. The SDK monitor cascades `invalid` /\n * `billing` flips across every sibling pair sharing the same provider\n * (shared API key); this helper just narrates that to the operator log\n * so they can see why unrelated skills are now refusing jobs.\n */\n private cascadeSuffix(provider: string, triggeringModel: string): string {\n if (!this.healthMonitor) {\n return '';\n }\n let siblings = 0;\n for (const entry of this.healthMonitor.snapshot()) {\n if (entry.provider !== provider) {\n continue;\n }\n if (entry.model === triggeringModel) {\n continue;\n }\n siblings += 1;\n }\n if (siblings === 0) {\n return '';\n }\n return ` (cascading to ${siblings} other model(s) for ${provider} sharing the same API key)`;\n }\n\n private markHealthFromExecuteError(\n skill: import('./skill').Skill,\n err: unknown,\n log: (msg: string) => void,\n jobId: string,\n ): boolean {\n if (!this.healthMonitor) {\n return false;\n }\n const tag = `[${jobId.slice(0, 8)}]`;\n\n if (err instanceof ScriptBillingExhaustedError) {\n const provider = skill.llmOverride?.provider;\n const model = skill.llmOverride?.model;\n if (!provider || !model) {\n // Script signaled billing exhaustion but the operator didn't\n // declare which (provider, model) the script depends on - we\n // can't mark anything unhealthy. Surface a hint in the operator\n // log so they know to add provider/model to SKILL.md.\n log(\n `${tag} Script returned exit ${err.exitCode} (billing-exhausted) but skill \"${skill.name}\" did not declare provider/model in SKILL.md - cannot gate future jobs.`,\n );\n return false;\n }\n log(\n `${tag} Script signaled billing-exhausted (exit ${err.exitCode}). Marking ${provider}/${model} unhealthy${this.cascadeSuffix(provider, model)}; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, 'billing', err.message);\n return true;\n }\n\n if (skill.mode === 'llm' && skill.resolvedTriple) {\n const message = err instanceof Error ? err.message : String(err);\n const match = /API error:\\s*(\\d{3})\\b\\s*(.*)/i.exec(message);\n if (!match) {\n return false;\n }\n const status = Number(match[1]);\n const body = (match[2] ?? '').slice(0, 200);\n const isBillingStatus = status === 402;\n const isAuthStatus = status === 401 || status === 403;\n const isBilling400 = status === 400 && bodyLooksLikeBilling(body);\n const isBilling429 = status === 429 && bodyLooksLikeBilling(body);\n if (!isBillingStatus && !isAuthStatus && !isBilling400 && !isBilling429) {\n return false;\n }\n const reason: 'billing' | 'invalid' = isAuthStatus ? 'invalid' : 'billing';\n const provider = skill.resolvedTriple.provider;\n const model = skill.resolvedTriple.model;\n log(\n `${tag} LLM provider returned HTTP ${status} (${reason}). Marking ${provider}/${model} unhealthy${this.cascadeSuffix(provider, model)}; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, reason, body);\n return true;\n }\n\n // Script-mode failure handling. Policy: fail-fast circuit breaker -\n // ANY non-zero exit on a script-mode skill with a declared\n // (provider, model) flips that pair unhealthy immediately. The next\n // customer is refused at the preflight gate before payment, so a\n // single failed buyer protects everyone behind them until the lazy\n // recovery probe (verifyKeyDeep) confirms the pair is back up.\n //\n // Two flavors, distinguished by whether the failure is shared-key or\n // skill-local:\n //\n // 1. Stderr matches billing/invalid markers (\"credit balance\",\n // \"x-api-key\", \"unauthorized\", ...) - the upstream API key is\n // the root cause, so every model under the same provider is\n // affected. Cascade across siblings.\n //\n // 2. Generic non-zero exit with no recognizable marker - most\n // likely a per-skill bug (missing env var, malformed response,\n // broken script). Other models for the same provider are\n // probably fine. Mark only this pair (`cascade: false`) so a\n // bug in Sonnet's proxy.sh does not take down Haiku as\n // collateral damage.\n //\n // Reason is `invalid` for generic exits because it requires operator\n // action to resolve and cached-failure semantics in `probeIfNeeded`\n // keep the gate closed until the lazy recovery loop's verifyKeyDeep\n // probe succeeds. Recovery is API-key-scoped, not script-scoped: if\n // the script bug persists, the next buyer triggers another flip,\n // making the gate self-healing for transient skill bugs but\n // self-flapping for chronic ones (acceptable - operator log makes\n // this visible).\n if (skill.mode !== 'llm') {\n // Use the raw stderr/stdout (`detail`) for billing/invalid marker scanning\n // and the operator log - the generic `.message` no longer carries it.\n let message: string;\n if (err instanceof ScriptExecutionError) {\n message = err.detail;\n } else if (err instanceof Error) {\n message = err.message;\n } else {\n message = String(err);\n }\n const provider = skill.llmOverride?.provider;\n const model = skill.llmOverride?.model;\n if (!provider || !model) {\n log(\n `${tag} Script \"${skill.name}\" failed (\"${message.slice(0, 120)}\") but did not declare provider/model in SKILL.md - cannot gate future jobs.`,\n );\n return false;\n }\n const lower = message.toLowerCase();\n const looksBillingOrInvalid = scriptMessageLooksLikeBillingOrInvalid(message);\n const reason: 'billing' | 'invalid' =\n looksBillingOrInvalid &&\n (lower.includes('credit balance') ||\n lower.includes('billing') ||\n lower.includes('insufficient'))\n ? 'billing'\n : 'invalid';\n const cascade = looksBillingOrInvalid;\n const cascadeNote = cascade ? this.cascadeSuffix(provider, model) : ' (no cascade)';\n const signalNote = looksBillingOrInvalid\n ? `${reason} signal in stderr`\n : `generic exit (no billing/invalid markers, classified as ${reason}, skill-local)`;\n log(\n `${tag} Script failure (${signalNote}). Marking ${provider}/${model} unhealthy${cascadeNote}; future jobs against this pair will be refused until recovery probe succeeds.`,\n );\n this.healthMonitor.markUnhealthyFromJob(provider, model, reason, message.slice(0, 200), {\n cascade,\n });\n return true;\n }\n\n return false;\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 // Prune terminal ledger entries past the 30-day retention window.\n this.ledger.pruneOldEntries(LEDGER_RETENTION_MS);\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.pruneOldEntries(LEDGER_RETENTION_MS);\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 // Route the skill once; reused below for executeJob and to decide\n // which rate-limit tier applies. Free skills (price=0) use the\n // tight default tier; paid skills use the 10x-looser tier because\n // payment is the primary economic deterrent against loop abuse.\n // A missing skill match defaults to the free tier (safe fallback:\n // an attacker cannot bypass tight limits by crafting unmatched tags).\n const matched = this.skills.route(job.tags);\n const isPaid = matched ? matched.priceSubunits > 0 : false;\n const customerLimiter = isPaid ? this.paidCustomerLimiter : this.freeCustomerLimiter;\n const globalLimiter = isPaid ? this.paidGlobalLimiter : this.freeGlobalLimiter;\n\n // Per-customer check first so a rate-limited customer does not\n // bump the global counter - otherwise a single abusive customer\n // could starve every other caller up to the global cap.\n if (!customerLimiter.peek(job.customerId).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n\n // Global rate limiting (Sybil protection).\n if (!globalLimiter.peek(GLOBAL_LIMITER_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Server busy, try again later' })\n .catch(() => {});\n return;\n }\n\n // Free-LLM extra protection: applies to any FREE skill that reaches an LLM -\n // every mode='llm' skill, plus script-mode skills that declare a provider+model\n // via llmOverride (resolveHealthPair returns the pair for those). Gating only on\n // mode==='llm' let a free script skill calling an LLM drain the operator's key\n // uncapped. We `peek` first across all tiers and only `check` when every tier\n // passes, so a denial in tier N never consumes a slot in tiers < N.\n const isFreeLlm =\n matched?.priceSubunits === 0 &&\n (matched.mode === 'llm' || resolveHealthPair(matched) !== null);\n let perCustomerLimiter: SlidingWindowLimiter | undefined;\n let perSkillKey: string | undefined;\n if (isFreeLlm && matched) {\n if (!this.freeLlmLimiters.globalLimiter.peek(FREE_LLM_GLOBAL_KEY).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n perCustomerLimiter = this.freeLlmLimiters.getPerCustomerLimiter(\n matched.name,\n matched.rateLimit,\n );\n perSkillKey = freeLlmCustomerKey(job.customerId, matched.name);\n if (!perCustomerLimiter.peek(perSkillKey).allowed) {\n this.transport\n .sendFeedback(job, { type: 'error', message: 'Rate limited, try again later' })\n .catch(() => {});\n return;\n }\n }\n\n // All checks passed - record the hit against every active limiter.\n customerLimiter.check(job.customerId);\n globalLimiter.check(GLOBAL_LIMITER_KEY);\n if (isFreeLlm && perCustomerLimiter && perSkillKey) {\n this.freeLlmLimiters.globalLimiter.check(FREE_LLM_GLOBAL_KEY);\n perCustomerLimiter.check(perSkillKey);\n }\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. SIGINT and SIGTERM share an idempotent\n // handler so we don't log \"Shutting down...\" twice when both arrive\n // (shells sometimes deliver SIGINT+SIGTERM to the whole process group).\n await new Promise<void>((resolve) => {\n this.abortController.signal.addEventListener('abort', () => resolve(), { once: true });\n\n let shuttingDown = false;\n const onSignal = (): void => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n log('Shutting down...');\n this.stop();\n // `stop()` is synchronous (aborts in-flight jobs); the iroh node shutdown\n // is async and must release the fs-store lock before exit, so await it\n // here and exit once done. The unref'd 3s timer is the hard-kill fallback.\n const shutdownNode = this.irohTransport?.shutdown() ?? Promise.resolve();\n void shutdownNode.then(\n () => process.exit(0),\n () => process.exit(0),\n );\n setTimeout(() => process.exit(0), 3000).unref();\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n });\n }\n\n /** Drop expired hits from every sliding-window limiter. */\n private cleanupRateLimits(): void {\n this.freeCustomerLimiter.prune();\n this.freeGlobalLimiter.prune();\n this.paidCustomerLimiter.prune();\n this.paidGlobalLimiter.prune();\n this.freeLlmLimiters.globalLimiter.prune();\n this.freeLlmLimiters.prunePerCustomer();\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 /**\n * Resolve a job's execution budget in milliseconds. Per-skill\n * `executionTimeoutSecs` wins over the agent-level `config.executionTimeoutSecs`;\n * `0` (explicit unlimited) and `undefined` both collapse to `0` => no timer.\n */\n private resolveExecutionBudgetMs(skill: import('./skill').Skill): number {\n const secs = skill.executionTimeoutSecs ?? this.config.executionTimeoutSecs ?? 0;\n return secs > 0 ? secs * 1000 : 0;\n }\n\n /**\n * Wrapper with error handling. The execution budget (if any) is enforced\n * around `skill.execute` inside `executeJob`, not here - payment collection\n * and result delivery run on their own bounds. `jobAbort` is retained so\n * `stop()` can still abort an in-flight job.\n */\n private async processJob(job: IncomingJob): Promise<void> {\n const jobAbort = new AbortController();\n this.jobAbortControllers.add(jobAbort);\n try {\n await this.executeJob(job, jobAbort.signal);\n } catch (e: any) {\n const log = this.callbacks.onLog ?? console.log;\n log(`[${job.jobId.slice(0, 8)}] Error: ${e.message}`);\n\n // Status transitions on failure:\n // - `executed`: never markFailed - delivery recovery will retry.\n // - `paid` + `AgentUnavailableError`: keep as `paid` so the recovery\n // loop re-executes once the LLM pair flips back to healthy. The\n // customer paid, so abandoning the job to `failed` would lose\n // their funds with no path back. The recovery loop's gate-aware\n // check (assertReady) and 24h hard cutoff bound the wait.\n // - everything else: markFailed as before.\n const currentStatus = this.ledger.getStatus(job.jobId);\n const keepPaidForRecovery = e instanceof AgentUnavailableError && currentStatus === 'paid';\n if (currentStatus !== 'executed' && !keepPaidForRecovery) {\n this.ledger.markFailed(job.jobId);\n }\n if (keepPaidForRecovery) {\n log(\n `[${job.jobId.slice(0, 8)}] Keeping status=paid; recovery will re-execute when LLM pair recovers (24h cutoff).`,\n );\n }\n // Operator log keeps the full detail (including raw script stderr from a\n // ScriptExecutionError); the customer only ever receives an allowlisted,\n // generic message via `customerSafeMessage`.\n const operatorMessage =\n e instanceof ScriptExecutionError\n ? `${e.message}: ${e.detail}`\n : (e.message ?? 'Unknown error');\n this.callbacks.onJobError?.(job.jobId, operatorMessage);\n\n // W8: only forward known-safe messages to the customer; everything else is\n // masked to a fixed generic string so subprocess/provider internals never leak.\n const safeMessage = customerSafeMessage(e);\n await this.transport\n .sendFeedback(job, { type: 'error', message: safeMessage })\n .catch(() => {});\n } finally {\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. Byte-based, as defense in depth\n // (the SDK already caps at submit). A spilled job's inline text is '' (the real\n // text rides the attachment), so this only ever fires on a malformed/forged event.\n const inputBytes = utf8ByteLength(job.input);\n if (inputBytes > LIMITS.MAX_INPUT_LENGTH) {\n throw new Error(`Input too long: ${inputBytes} bytes (max ${LIMITS.MAX_INPUT_LENGTH})`);\n }\n\n // ── Preflight: gate LLM-dependent jobs against the health monitor\n // before sending payment-required. If the operator's API key has gone\n // invalid/billing-exhausted since startup, refuse the job before the\n // customer pays and before we record anything in the ledger.\n //\n // Two paths feed the gate:\n // - mode === 'llm' uses `resolvedTriple` (provider + model + maxTokens)\n // resolved at startup from agent default + skill override.\n // - script modes use `llmOverride.provider`+`.model` declared in\n // SKILL.md to signal \"this script depends on this API key\"; the\n // runtime registers the same (provider, model) pair with the\n // health monitor in start.ts, so assertReady works identically.\n //\n // Customer-facing message stays generic to avoid leaking billing\n // status; operator log carries the real reason via the throw.\n const matched = this.skills.route(job.tags);\n const healthPair = resolveHealthPair(matched);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n log(`[${job.jobId.slice(0, 8)}] LLM health gate refused job: ${detail}`);\n await this.transport\n .sendFeedback(job, {\n type: 'error',\n message: AGENT_UNAVAILABLE_MESSAGE,\n })\n .catch(() => {});\n return;\n }\n }\n\n // File inputs require a PAID skill in Phase 1: a free skill would let an\n // attacker make the provider fetch arbitrary blobs with no payment gate.\n // Rejected here, before `recordPaid`, so the job never enters the ledger\n // and the recovery path cannot re-fetch it.\n if (job.attachment !== undefined && resolveJobPrice(job.tags, this.skills) === 0) {\n log(`[${job.jobId.slice(0, 8)}] Rejecting file input on a free skill`);\n await this.transport\n .sendFeedback(job, { type: 'error', message: 'File inputs require a paid skill.' })\n .catch(() => {});\n return;\n }\n\n // ── Step 1: Resolve per-capability price and collect payment ──\n const jobPrice = resolveJobPrice(job.tags, this.skills);\n const jobAsset = resolveJobAsset(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, jobAsset, 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(\n `[${job.jobId.slice(0, 8)}] Payment confirmed: ${formatAssetAmount(\n jobAsset,\n BigInt(netAmount),\n )}`,\n );\n this.callbacks.onPaymentReceived?.(job.jobId, netAmount);\n }\n\n // Fetch a file input (if any) AFTER payment is confirmed - never before, so an\n // unpaid request can't make the provider download attacker-hosted data.\n const inputFile = await this.resolveInputFile(job.attachment);\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 // Wrapped so a billing/invalid signal surfaced *during* execution\n // (script exit 42 or LLM 402/401) flips the matching health pair to\n // unhealthy. The next job hitting the same pair will be refused at\n // the preflight gate before payment, instead of sailing through and\n // failing again. Recovery happens via the lazy recovery loop, which\n // re-probes only while the pair is unhealthy.\n // Execution budget (if any) is scoped to `skill.execute` only - payment\n // collection above and delivery below run on their own bounds. The budget\n // timer aborts a dedicated `execAbort` chained to the incoming `signal`\n // (so `stop()` still propagates), and sets `budgetExceeded` so the catch\n // can tell a budget abort apart from a real skill failure - the latter\n // would otherwise flip the health pair via `markHealthFromExecuteError`.\n let output;\n const budgetMs = this.resolveExecutionBudgetMs(skill);\n let budgetExceeded = false;\n const execAbort = new AbortController();\n const onOuterAbort = (): void => execAbort.abort();\n if (signal) {\n if (signal.aborted) {\n execAbort.abort();\n } else {\n signal.addEventListener('abort', onOuterAbort);\n }\n }\n let budgetTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const execPromise = skill.execute(\n {\n data: inputFile?.inlineText ?? job.input,\n inputType: job.inputType,\n tags: job.tags,\n jobId: job.jobId,\n filePath: inputFile?.filePath,\n },\n { ...this.skillCtx, signal: execAbort.signal },\n );\n // If the budget race rejects first, the skill may settle later; a no-op\n // handler keeps that late settlement from surfacing as an unhandled\n // rejection.\n execPromise.catch(() => {});\n if (budgetMs > 0) {\n // Race the skill against its budget so a skill that ignores the abort\n // signal (or is stuck on a non-abortable await) cannot run past the\n // budget and hold the job slot. `abort()` still asks it to stop\n // (SIGKILL for scripts, next-round check for LLM skills); the race only\n // bounds how long we wait.\n output = await Promise.race([\n execPromise,\n new Promise<never>((_resolve, reject) => {\n budgetTimer = setTimeout(() => {\n budgetExceeded = true;\n execAbort.abort();\n reject(new ExecutionBudgetExceededError(budgetMs));\n }, budgetMs);\n }),\n ]);\n } else {\n output = await execPromise;\n }\n } catch (err) {\n // A budget abort is a clean operator/author limit, not a provider fault:\n // mark it distinctly so it never trips the health monitor.\n if (budgetExceeded) {\n log(`[${job.jobId.slice(0, 8)}] Execution exceeded budget (${budgetMs / 1000}s)`);\n throw new ExecutionBudgetExceededError(budgetMs);\n }\n const flippedToUnhealthy = this.markHealthFromExecuteError(skill, err, log, job.jobId);\n // When the skill failure was the trigger that flipped the health\n // pair to unhealthy, surface a stable \"agent unavailable\" message\n // to the customer rather than the sanitized \"Internal processing\n // error\" string the leaky-API masker would otherwise produce.\n // Recovery happens through the lazy recovery loop.\n if (flippedToUnhealthy) {\n throw new AgentUnavailableError();\n }\n throw err;\n } finally {\n if (budgetTimer) {\n clearTimeout(budgetTimer);\n }\n if (signal) {\n signal.removeEventListener('abort', onOuterAbort);\n }\n // Remove the fetched input file (and its temp dir) once execution is done.\n if (inputFile) {\n await inputFile.cleanup().catch(() => {});\n }\n }\n\n // ── Step 5: Seed any spilled payload (file or large text), THEN cache ──\n // buildResultAttachment runs before markExecuted: a seed failure leaves the\n // job `paid` so recovery re-executes. `deliveredContent` is empty whenever the\n // payload was spilled to iroh, so the result event carries only the ticket.\n const { attachment, deliveredContent } = await this.buildResultAttachment(job.jobId, output);\n\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, deliveredContent);\n\n log(`[${job.jobId.slice(0, 8)}] Skill completed, delivering result`);\n\n // ── Step 6: Deliver result ──\n const eventId = await this.transport.deliverResult(\n job,\n deliveredContent,\n netAmount,\n attachment,\n );\n this.ledger.markDelivered(job.jobId);\n\n log(`[${job.jobId.slice(0, 8)}] Delivered: ${eventId.slice(0, 16)}...`);\n // onJobCompleted is local-only (TUI/dashboard), never encrypted or delivered,\n // so it keeps the full `output.data` for operator visibility.\n this.callbacks.onJobCompleted?.(job.jobId, output.data);\n }\n\n /**\n * Decide how a skill's result travels: inline text, a seeded file, or seeded\n * large text. Returns the attachment descriptor (if any) PLUS the content to\n * deliver on the wire - which is the EMPTY string whenever the payload was\n * spilled to iroh (file or large text), so the encrypted result event carries\n * only the ticket and never re-trips the NIP-44 byte cap. The single\n * `deliveredContent` value must drive `markExecuted`, `deliverResult`, and the\n * recovery re-delivery alike (so a crash-recovered spill re-delivers empty too).\n * Persists the descriptor so recovery can re-share + re-deliver.\n *\n * Must run BEFORE `markExecuted` so a seed failure leaves the job `paid` and\n * recovery re-executes (rather than re-delivering a dead ticket). Runs after the\n * `skill.execute` budget window, so a slow seed never trips `max_execution_secs`.\n */\n private async buildResultAttachment(\n jobId: string,\n output: SkillOutput,\n ): Promise<{ attachment: FileAttachment | undefined; deliveredContent: string }> {\n if (output.filePath !== undefined) {\n // seedPath copies the bytes into the persistent iroh store, so the producer's\n // temp file is no longer needed once seeding has been attempted (recovery\n // re-shares from the store, never the temp file). Release it whether seeding\n // succeeds or throws - including the no-transport case below - so a failure\n // (job stays `paid`, recovery re-executes into a fresh temp file) does not\n // leave the temp dir behind on every retry.\n try {\n if (!this.irohTransport) {\n throw new Error('Skill produced a file result but iroh transport is unavailable.');\n }\n const seeded = await this.irohTransport.seedPath(output.filePath);\n const attachment: FileAttachment = {\n name: basename(output.filePath),\n size: seeded.size,\n mime: output.outputMime ?? 'application/octet-stream',\n transports: [{ kind: 'iroh', ticket: seeded.ticket }],\n };\n this.ledger.recordAttachment(jobId, { resultAttachment: JSON.stringify(attachment) });\n // A file result's `output.data` is a small note, delivered inline alongside\n // the ticket - unchanged from the original file-transfer behavior.\n return { attachment, deliveredContent: output.data };\n } finally {\n await output.cleanup?.().catch(() => {});\n }\n }\n\n // Large text result: spill it to iroh and deliver EMPTY content + a text/plain\n // attachment, so the customer fetches it via fetch_job_file (same as a file).\n if (utf8ByteLength(output.data) > LIMITS.MAX_ENCRYPTED_INLINE_BYTES) {\n if (!this.irohTransport) {\n throw new Error('Result is too large to deliver inline and iroh transport is unavailable.');\n }\n const seeded = await this.irohTransport.seedBytes(Buffer.from(output.data, 'utf8'));\n const attachment: FileAttachment = {\n name: 'result.txt',\n size: seeded.size,\n mime: 'text/plain',\n transports: [{ kind: 'iroh', ticket: seeded.ticket }],\n };\n this.ledger.recordAttachment(jobId, { resultAttachment: JSON.stringify(attachment) });\n return { attachment, deliveredContent: '' };\n }\n\n return { attachment: undefined, deliveredContent: output.data };\n }\n\n /**\n * Rebuild a file-result attachment for crash-recovery re-delivery: re-share the\n * blob from the persistent store to mint a fresh ticket (the original ticket's\n * direct addresses go stale across a restart). Returns undefined for a text\n * result; throws if the blob is gone (caller marks the job failed).\n */\n private async reShareResultAttachment(\n resultAttachmentJson: string | undefined,\n ): Promise<FileAttachment | undefined> {\n if (resultAttachmentJson === undefined) {\n return undefined;\n }\n if (!this.irohTransport) {\n throw new Error('Cannot recover a file result: iroh transport is unavailable.');\n }\n const stored = JSON.parse(resultAttachmentJson) as FileAttachment;\n const irohTransport = stored.transports.find((transport) => transport.kind === 'iroh');\n if (!irohTransport) {\n throw new Error('Stored result attachment has no iroh transport.');\n }\n const freshTicket = await this.irohTransport.reShare(irohTransport.ticket);\n return { ...stored, transports: [{ kind: 'iroh', ticket: freshTicket }] };\n }\n\n /**\n * Resolve a job's file/large-text input (when it carries an attachment) via iroh.\n * Only called post-payment - free + attachment is rejected in the `executeJob`\n * preflight. Two outcomes, both with a `cleanup` callback:\n * - `text/*` within `MAX_REINLINE_TEXT_BYTES`: fetched into memory and returned\n * as `inlineText`, transparently re-inlined into `SkillInput.data` so skills\n * are unchanged (cleanup is a no-op - nothing on disk).\n * - binary, or text over the ceiling: streamed to a fixed `input` name inside a\n * unique `mkdtemp` dir (the untrusted attachment `name` never touches the path),\n * returned as `filePath`.\n * `fetchToBytes`/`fetchToPath` enforce the real cap on the BLAKE3-verified size, so\n * an incorrect declared `size` cannot exceed the in-memory ceiling.\n */\n private async resolveInputFile(\n attachment: FileAttachment | undefined,\n ): Promise<{ inlineText?: string; filePath?: string; cleanup: () => Promise<void> } | undefined> {\n if (attachment === undefined) {\n return undefined;\n }\n if (!this.irohTransport) {\n throw new Error('Job carries a file input but iroh transport is unavailable.');\n }\n const irohTransport = attachment.transports.find((transport) => transport.kind === 'iroh');\n if (!irohTransport) {\n throw new Error('File input has no iroh transport.');\n }\n\n if (attachment.mime.startsWith('text/') && attachment.size <= LIMITS.MAX_REINLINE_TEXT_BYTES) {\n const bytes = await this.irohTransport.fetchToBytes(irohTransport.ticket, {\n maxBytes: LIMITS.MAX_REINLINE_TEXT_BYTES,\n });\n return {\n inlineText: Buffer.from(bytes).toString('utf8'),\n cleanup: async () => {},\n };\n }\n\n const dir = await mkdtemp(join(tmpdir(), 'elisym-job-'));\n const filePath = join(dir, 'input');\n try {\n await this.irohTransport.fetchToPath(irohTransport.ticket, filePath);\n } catch (error) {\n await rm(dir, { recursive: true, force: true }).catch(() => {});\n throw error;\n }\n return {\n filePath,\n cleanup: async () => {\n await rm(dir, { recursive: true, force: true });\n },\n };\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 jobAsset: Asset,\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, asset: jobAsset },\n );\n const requestJson = JSON.stringify(request);\n\n const fee = calculateProtocolFee(jobPrice, protocolConfig.feeBps);\n const netAmount = jobPrice - fee;\n\n log(\n `[${job.jobId.slice(0, 8)}] Payment required: ${formatAssetAmount(jobAsset, BigInt(jobPrice))} ` +\n `(fee: ${formatAssetAmount(jobAsset, BigInt(fee))})`,\n );\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. Two paths run in parallel, both self-bounded:\n // (a) Signature path - subscribe to the customer's payment-completed\n // Nostr feedback, take the tx signature it carries, and verify it\n // directly via `getTransaction(sig, 'confirmed')`. Fast (~1-3s) and\n // cheap on RPC quota. Self-times out after SIG_PATH_TIMEOUT_MS so an\n // abandoned customer does not hold a `p-limit` slot indefinitely.\n // (b) Reference path - SDK's getSignaturesForAddress(reference) loop.\n // Slower and more brittle on the public devnet RPC, but works as a\n // fallback when Nostr feedback is dropped. Self-times out via SDK\n // retry budget (~30s).\n // First `verified: true` wins; if both fail we resolve immediately with\n // the last failure. The outer `deadlineMs` backstop only triggers if both\n // paths somehow hang past their own timeouts.\n const rpc = createSolanaRpc(getRpcUrl(this.config.network));\n const verifyAbort = new AbortController();\n const onOuterAbort = () => verifyAbort.abort();\n if (signal) {\n if (signal.aborted) {\n verifyAbort.abort();\n } else {\n signal.addEventListener('abort', onOuterAbort, { once: true });\n }\n }\n const deadlineMs = this.config.paymentTimeoutSecs * 1000;\n const sigPathTimeoutMs = Math.min(deadlineMs, SIG_PATH_TIMEOUT_MS);\n\n // Per-path failure outcomes, captured for the timeout-classification below. Declared\n // at method scope (not inside the executor) because the WARNING site reads them after\n // the Promise resolves. `sigOutcome.gotSignature` distinguishes \"customer asserted a\n // payment we could not confirm\" (loud) from \"customer never paid\" (calm).\n let sigOutcome: { gotSignature: boolean; error?: string } | undefined;\n let refOutcome: { error?: string } | undefined;\n let result: { verified: boolean };\n try {\n result = await new Promise<{ verified: boolean }>((resolve, reject) => {\n let settled = false;\n let pending = 2;\n let lastResult: { verified: boolean } = { verified: false };\n\n const win = (verified: { verified: boolean }) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n resolve(verified);\n };\n\n const lose = (verified: { verified: boolean }, reason: string) => {\n if (settled) {\n return;\n }\n lastResult = verified;\n pending -= 1;\n log(`[${job.jobId.slice(0, 8)}] verify ${reason}`);\n if (pending === 0) {\n settled = true;\n clearTimeout(deadline);\n resolve(lastResult);\n }\n };\n\n // Path (a) - signature path\n this.transport\n .waitForPaymentSignature(job.jobId, job.customerId, verifyAbort.signal, sigPathTimeoutMs)\n .then(async (sig) => {\n if (settled) {\n return;\n }\n if (!sig) {\n sigOutcome = { gotSignature: false };\n lose({ verified: false }, 'sig path: no payment-completed feedback');\n return;\n }\n log(`[${job.jobId.slice(0, 8)}] verify sig path: got ${sig.slice(0, 8)}...`);\n try {\n const verified = await payment.verifyPayment(rpc, request, protocolConfig, {\n txSignature: sig,\n });\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n sigOutcome = { gotSignature: true, error: reason };\n lose(verified, `sig path: not verified (${reason})`);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sigOutcome = { gotSignature: true, error: message };\n lose({ verified: false }, `sig path error: ${message}`);\n }\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n sigOutcome = { gotSignature: false, error: message };\n lose({ verified: false }, `sig path error: ${message}`);\n });\n\n // Path (b) - reference path\n payment\n .verifyPayment(rpc, request, protocolConfig)\n .then((verified) => {\n if (verified.verified) {\n win(verified);\n } else {\n const reason = (verified as { error?: string }).error ?? 'unknown';\n refOutcome = { error: reason };\n lose(verified, `ref path: not verified (${reason})`);\n }\n })\n .catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n refOutcome = { error: message };\n lose({ verified: false }, `ref path error: ${message}`);\n });\n\n // Hard deadline backstop - guarantees we never hang past paymentTimeoutSecs\n const deadline = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n log(`[${job.jobId.slice(0, 8)}] verify deadline (${deadlineMs}ms) hit`);\n resolve(lastResult);\n }, deadlineMs);\n\n // Outer abort propagation\n if (signal?.aborted) {\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n return;\n }\n signal?.addEventListener(\n 'abort',\n () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n const err = new Error('The operation was aborted');\n err.name = 'AbortError';\n reject(err);\n },\n { once: true },\n );\n });\n } finally {\n verifyAbort.abort();\n if (signal) {\n signal.removeEventListener('abort', onOuterAbort);\n }\n }\n\n if (result.verified) {\n return { netAmount, paymentRequest: requestJson };\n }\n\n // Timeout. Distinguish \"customer simply never paid\" (calm) from genuine uncertainty\n // (loud \"check manually\"). Calm only when the reference scan ran clean and conclusively\n // found nothing AND the customer never asserted a payment signature over Nostr. Only the\n // exact \"No matching transaction found for reference key\" literal is definitive-no-pay;\n // RPC/inconclusive errors and any asserted-but-unverifiable signature fall through to loud.\n const refDefinitiveNoPay =\n refOutcome?.error === 'No matching transaction found for reference key';\n const sigGotSignature = sigOutcome?.gotSignature === true;\n const customerAbandoned = !sigGotSignature && refDefinitiveNoPay;\n\n if (customerAbandoned) {\n log(\n `[${job.jobId.slice(0, 8)}] Payment not received; on-chain scan found no ` +\n `matching transaction - job abandoned by customer.`,\n );\n } else {\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 }\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 // If any pending `paid` job is parked on an unhealthy LLM pair,\n // fire a probe so the recovery loop's gate (assertReady in\n // recoverSingleJob) sees fresh state on the next tick. The lazy\n // health-recovery loop probes every 5 minutes by itself; we add\n // this trigger so paid jobs don't sit idle for that long once the\n // operator fixes their API key. Fire-and-forget: we don't want to\n // block the per-tick recovery iteration on a network probe.\n if (this.healthMonitor) {\n const snap = this.healthMonitor.snapshot();\n // `unhealthyKeys` is a per-pair set, not deduplicated by provider:\n // we use it only to decide whether to KICK refreshUnhealthy, not\n // to issue probes ourselves. The provider-dedup of probes lives\n // inside `refreshUnhealthy`. Don't re-collapse here - that would\n // mask cases where one provider's pair is `unavailable` while\n // another is `invalid`, which need different probe paths.\n const unhealthyKeys = new Set(\n snap\n .filter(\n (entry) =>\n entry.status === 'invalid' ||\n entry.status === 'billing' ||\n entry.status === 'unavailable',\n )\n .map((entry) => `${entry.provider}::${entry.model}`),\n );\n if (unhealthyKeys.size > 0) {\n const hasPaidOnUnhealthy = pending.some((entry) => {\n if (entry.status !== 'paid') {\n return false;\n }\n const skill = this.skills.route(entry.tags);\n const pair = resolveHealthPair(skill);\n return pair !== null && unhealthyKeys.has(`${pair.provider}::${pair.model}`);\n });\n if (hasPaidOnUnhealthy) {\n void this.healthMonitor.refreshUnhealthy().catch(() => {\n /* probe surfaces its own errors via the snapshot */\n });\n }\n }\n }\n\n for (const entry of pending) {\n const ageMs = (Math.floor(Date.now() / 1000) - entry.created_at) * 1000;\n const expired = ageMs > MAX_PAID_AGE_MS;\n const exhaustedRetries = entry.retry_count >= this.config.recoveryMaxRetries;\n if (expired || exhaustedRetries) {\n this.ledger.markFailed(entry.job_id);\n const reason = expired\n ? 'Job permanently failed: agent did not recover within 24 hours'\n : 'Job permanently failed after maximum retries';\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: reason },\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\n try {\n if (entry.raw_event_json === undefined) {\n return;\n }\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 - no LLM call, no gate check. For a file result, re-share\n // the blob from the persistent store for a fresh ticket (the stored ticket's\n // addresses go stale across a restart); if the blob is gone, fail cleanly\n // rather than deliver a dead ticket.\n this.ledger.incrementRetry(entry.job_id);\n let attachment;\n try {\n attachment = await this.reShareResultAttachment(entry.result_attachment);\n } catch {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: result blob unavailable, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n await this.transport.deliverResult(fakeJob, entry.result, entry.net_amount, attachment);\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 // Gate the retry against the LLM health monitor: if the pair is\n // still unhealthy, skip THIS tick without burning a retry. The\n // outer loop will re-schedule us; a successful probe (lazy\n // recovery loop or explicit refreshUnhealthy) flips the pair\n // back to healthy and the next tick proceeds. Without this\n // check, every recovery tick during a billing outage would\n // re-spawn the script, fail with exit 42, and consume one of\n // the bounded retry slots even though the underlying problem\n // (operator's API key) hasn't been touched yet.\n const healthPair = resolveHealthPair(skill);\n if (this.healthMonitor && healthPair) {\n try {\n await this.healthMonitor.assertReady(healthPair.provider, healthPair.model);\n } catch (err) {\n if (err instanceof LlmHealthError) {\n log(\n `[${entry.job_id.slice(0, 8)}] Recovery: pair ${healthPair.provider}/${healthPair.model} still unhealthy (${err.reason}); waiting for recovery probe.`,\n );\n return;\n }\n throw err;\n }\n }\n\n this.ledger.incrementRetry(entry.job_id);\n\n // Re-verify payment if reference was stored but confirmation lost to crash\n if (skill.priceSubunits > 0 && !entry.net_amount) {\n if (entry.payment_request) {\n const verified = await this.reVerifyPayment(\n entry,\n skill.priceSubunits,\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 // Re-fetch the file input (if any) for the recovery re-execution, decoding\n // the descriptor from the persisted (decrypted) raw event. Without this the\n // recovery skill.execute would run without its file.\n let recoveryInputFile;\n try {\n recoveryInputFile = await this.resolveInputFile(\n decodeJobPayload(rawEvent.content).attachment,\n );\n } catch {\n log(`[${entry.job_id.slice(0, 8)}] Recovery: input file unavailable, marking failed`);\n this.ledger.markFailed(entry.job_id);\n return;\n }\n\n // Same per-skill execution budget as the primary path, enforced as a\n // race so a non-cooperative skill can't stall recovery past its budget.\n // On budget the race rejects with ExecutionBudgetExceededError, which\n // recoverPendingJobs logs; the entry stays paid/executed and retries on\n // the next sweep (each attempt now bounded by the budget).\n const recoveryBudgetMs = this.resolveExecutionBudgetMs(skill);\n let budgetTimer: ReturnType<typeof setTimeout> | undefined;\n let output;\n try {\n const execPromise = skill.execute(\n {\n data: recoveryInputFile?.inlineText ?? entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n jobId: entry.job_id,\n filePath: recoveryInputFile?.filePath,\n },\n { ...this.skillCtx, signal: recoveryAbort.signal },\n );\n execPromise.catch(() => {});\n if (recoveryBudgetMs > 0) {\n output = await Promise.race([\n execPromise,\n new Promise<never>((_resolve, reject) => {\n budgetTimer = setTimeout(() => {\n recoveryAbort.abort();\n reject(new ExecutionBudgetExceededError(recoveryBudgetMs));\n }, recoveryBudgetMs);\n }),\n ]);\n } else {\n output = await execPromise;\n }\n } finally {\n if (budgetTimer) {\n clearTimeout(budgetTimer);\n }\n if (recoveryInputFile) {\n await recoveryInputFile.cleanup().catch(() => {});\n }\n }\n\n // Symmetric with the primary path: seed any spilled payload (file or large\n // text) BEFORE markExecuted, and deliver `deliveredContent` (empty when\n // spilled) so a re-executed result never re-trips the NIP-44 byte cap.\n const { attachment: resultAttachment, deliveredContent } = await this.buildResultAttachment(\n entry.job_id,\n output,\n );\n this.ledger.markExecuted(entry.job_id, deliveredContent);\n await this.transport.deliverResult(\n fakeJob,\n deliveredContent,\n entry.net_amount,\n resultAttachment,\n );\n this.ledger.markDelivered(entry.job_id);\n log(`[${entry.job_id.slice(0, 8)}] Recovery: re-executed and delivered`);\n }\n } finally {\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 priceSubunits: 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(priceSubunits, protocolConfig.feeBps);\n const netAmount = priceSubunits - 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} subunits)`);\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\nimport { toDTag, type Asset } from '@elisym/sdk';\nimport type { SkillRateLimit } from '@elisym/sdk/llm-health';\nimport type { SkillLlmOverride, SkillMode } from '@elisym/sdk/skills';\n\nexport type { SkillLlmOverride, SkillMode, SkillRateLimit };\n\n/**\n * Resolved (provider, model, maxTokens) triple for an LLM-mode skill.\n * Computed once at startup in `start.ts` after `resolveSkillLlm`, then\n * attached to the skill instance so the runtime preflight can read it\n * without re-running resolution from `loaded.yaml`.\n */\nexport interface ResolvedSkillTriple {\n provider: string;\n model: string;\n maxTokens: number;\n}\n\nexport interface SkillInput {\n data: string;\n inputType: string;\n tags: string[];\n jobId: string;\n /**\n * Local path to a file input fetched out-of-band (P2P via iroh), when the job\n * carried a file attachment. The runtime fetches it after payment and removes\n * it after execution; the skill reads from disk rather than from `data`.\n */\n filePath?: string;\n}\n\nexport interface SkillOutput {\n data: string;\n outputMime?: string;\n /**\n * Local path to a file result. When set, the runtime seeds the file via iroh\n * and the customer fetches it out-of-band; `data` carries any text note (or '').\n * `outputMime` is reused as the attachment's mime.\n */\n filePath?: string;\n /**\n * Releases the resources backing `filePath` (e.g. a temp dir). The runtime\n * calls it once it has seeded the file - or failed to - since seeding happens\n * after `execute()` returns and the producer cannot release the file itself.\n * Mirrors the input-side cleanup callback in the runtime's `resolveInputFile`.\n */\n cleanup?: () => Promise<void>;\n}\n\nexport interface SkillContext {\n /** Agent-default LLM client. Undefined when every LLM skill overrides. */\n llm?: LlmClient;\n /**\n * Resolve the LLM client for a skill. The runtime caches clients by\n * resolved (provider, model, maxTokens) triple. Pass the skill's\n * `llmOverride` (or undefined for the agent default).\n */\n getLlm?: (override?: SkillLlmOverride) => LlmClient | undefined;\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 /**\n * Price in subunits of `asset` (0 = free). For SOL: lamports (1e-9 SOL).\n * For USDC: 1e-6 USDC. Converted from SKILL.md's human-readable `price`.\n *\n * Number (not bigint) for ergonomics - realistic agent prices fit well\n * below `Number.MAX_SAFE_INTEGER` subunits.\n */\n priceSubunits: number;\n /** Asset the price is denominated in (NATIVE_SOL or USDC_SOLANA_DEVNET, etc.). */\n asset: Asset;\n /** Execution mode (`'llm'` for the historical LLM-orchestrated path). */\n mode: SkillMode;\n /**\n * Per-skill LLM override / dependency.\n *\n * For `mode: 'llm'`: overrides the agent default (provider/model/maxTokens)\n * for runtime LLM execution. The runtime constructs the LLM client from this.\n *\n * For script modes: declares which LLM API key the script depends on so\n * the runtime can health-monitor it (startup probe + reactive markUnhealthy\n * on `SCRIPT_EXIT_BILLING_EXHAUSTED` + lazy recovery). Only `provider` and\n * `model` are meaningful here; `maxTokens` is rejected at parse time.\n */\n llmOverride?: SkillLlmOverride;\n /** Hero image URL. */\n image?: string;\n /** Local file path for hero image (uploaded on first start). */\n imageFile?: string;\n /** On-disk skill directory (e.g. `<agent>/skills/whois-lookup`). */\n dir?: string;\n /**\n * Resolved (provider, model, maxTokens) for `mode: 'llm'` skills. Set\n * once at startup. Undefined for script modes - they use `llmOverride`\n * directly when declared. Read by the runtime to gate against the\n * `LlmHealthMonitor` before sending `payment-required`.\n */\n resolvedTriple?: ResolvedSkillTriple;\n /**\n * Optional per-skill rate limit declared in SKILL.md frontmatter\n * (snake_case `rate_limit` -> camelCase). Applies to any mode but the\n * runtime treats free LLM skills as the primary use case.\n */\n rateLimit?: SkillRateLimit;\n /**\n * Per-skill execution budget in seconds, from SKILL.md `max_execution_secs`\n * (any mode). `0` => explicitly unlimited. `undefined` => the runtime falls\n * through to the agent-level `executionTimeoutSecs`, then to unlimited.\n */\n executionTimeoutSecs?: number;\n /**\n * MIME the skill expects as a file input (`input_mime`, dynamic-script only).\n * Discovery hint published in the capability card; not enforced at runtime.\n * Presence signals the capability needs a file input (clients gate on it).\n */\n inputMime?: string;\n /** MIME of a file result (`output_mime`, dynamic-script only). */\n outputMime?: 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 // Match by skill name in canonical d-tag form. Outgoing capability cards\n // publish `['d', toDTag(card.name)]`, so incoming job tags arrive\n // d-tag-shaped (lowercase, ASCII letters + digits + hyphens). Comparing\n // raw `skill.name` only works when the name is already kebab-case;\n // normalize through `toDTag` so human-readable names route too.\n for (const tag of tags) {\n const byName = this.skills.find((skill) => toDTag(skill.name) === tag);\n if (byName) {\n return byName;\n }\n }\n // Then declared capability tags (secondary matching).\n for (const tag of tags) {\n const byCap = this.skills.find((skill) => skill.capabilities.includes(tag));\n if (byCap) {\n return byCap;\n }\n }\n // Default fallback only for genuinely untargeted jobs (no specific tag\n // beyond the 'elisym' protocol marker). A job that *does* carry a\n // specific capability tag must not silently degrade to a free default -\n // that was a payment-bypass vector.\n const hasSpecificTag = tags.some((tag) => tag && tag !== 'elisym');\n if (hasSpecificTag) {\n return null;\n }\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 * CLI wrappers around the non-LLM SDK skill classes. They mirror the\n * pattern in `script-skill.ts` so the CLI's `Skill` interface\n * (`priceSubunits: number`, `mode`, `dir`) stays uniform across all\n * execution modes while delegating actual work to the shared SDK runners.\n */\nimport type { Asset } from '@elisym/sdk';\nimport {\n DynamicScriptSkill as SdkDynamicScriptSkill,\n StaticFileSkill as SdkStaticFileSkill,\n StaticScriptSkill as SdkStaticScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\ninterface BaseParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n image?: string;\n imageFile?: string;\n /** On-disk skill directory. */\n dir: string;\n /**\n * For script modes: declared LLM dependency (provider+model). When set,\n * the runtime registers the pair with the health monitor and gates jobs\n * against it.\n */\n llmOverride?: SkillLlmOverride;\n}\n\nexport interface CliStaticFileSkillParams extends BaseParams {\n outputFilePath: string;\n}\n\nexport class StaticFileSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-file';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticFileSkill;\n\n constructor(params: CliStaticFileSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticFileSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n outputFilePath: params.outputFilePath,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport interface CliScriptSkillParams extends BaseParams {\n scriptPath: string;\n scriptArgs: string[];\n scriptTimeoutMs?: number;\n /** Full env for the script. CLI builds this from `process.env` + decrypted secrets. */\n scriptEnv?: NodeJS.ProcessEnv;\n /** MIME for a file result (dynamic-script only); forwarded to the SDK runner. */\n outputMime?: string;\n /**\n * MIME the skill expects as a file input (dynamic-script only). Discovery hint\n * surfaced in the published capability card; not used by the runner.\n */\n inputMime?: string;\n}\n\nexport class StaticScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'static-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n private inner: SdkStaticScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inner = new SdkStaticScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n\nexport class DynamicScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'dynamic-script';\n image?: string;\n imageFile?: string;\n dir: string;\n llmOverride?: SkillLlmOverride;\n // Discovery hints surfaced in the published capability card (buildCard).\n // `outputMime` is also forwarded to the inner SDK runner (it labels the file\n // result); `inputMime` is publish-time metadata only.\n inputMime?: string;\n outputMime?: string;\n private inner: SdkDynamicScriptSkill;\n\n constructor(params: CliScriptSkillParams) {\n this.name = params.name;\n this.description = params.description;\n this.capabilities = params.capabilities;\n this.priceSubunits = params.priceSubunits;\n this.asset = params.asset;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n this.llmOverride = params.llmOverride;\n this.inputMime = params.inputMime;\n this.outputMime = params.outputMime;\n this.inner = new SdkDynamicScriptSkill({\n name: params.name,\n description: params.description,\n capabilities: params.capabilities,\n priceSubunits: BigInt(Math.round(params.priceSubunits)),\n asset: params.asset,\n scriptPath: params.scriptPath,\n scriptArgs: params.scriptArgs,\n scriptTimeoutMs: params.scriptTimeoutMs,\n scriptEnv: params.scriptEnv,\n image: params.image,\n imageFile: params.imageFile,\n outputMime: params.outputMime,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI ScriptSkill - thin wrapper over `@elisym/sdk/skills` ScriptSkill.\n *\n * Preserves the CLI's historical positional constructor and Skill\n * interface shape (priceSubunits as number, mutable image/imageFile\n * fields) while delegating all execution logic to the shared SDK\n * runner - so tool-use, spawn, max_tool_rounds, and timeout behaviour\n * stay identical to the plugin / SDK path.\n */\nimport { NATIVE_SOL, type Asset } from '@elisym/sdk';\nimport {\n ScriptSkill as SdkScriptSkill,\n type SkillLlmOverride,\n type SkillMode,\n type SkillToolDef,\n} from '@elisym/sdk/skills';\nimport type { Skill, SkillContext, SkillInput, SkillOutput } from './index.js';\n\n/**\n * CLI ScriptSkill constructor with a back-compat positional signature.\n *\n * The `asset` parameter is accepted in two positions:\n * - 5th (new code: `new ScriptSkill(name, desc, caps, price, asset, image, imageFile, dir,\n * prompt, tools, rounds)`) - preferred for USDC/multi-asset.\n * - As part of a trailing `{ asset }` init; else falls through to NATIVE_SOL\n * when the 5th positional slot is `undefined` / is actually an `image` string.\n *\n * This preserves older `new ScriptSkill(name, desc, caps, price, image, ...)` call sites\n * (internal tests) so we do not have to touch them to land USDC support.\n */\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'llm';\n readonly llmOverride?: SkillLlmOverride;\n image?: string;\n imageFile?: string;\n dir: string;\n private inner: SdkScriptSkill;\n\n constructor(\n name: string,\n description: string,\n capabilities: string[],\n priceSubunits: number,\n assetOrImage: Asset | string | undefined,\n imageOrImageFile: string | undefined,\n imageFileOrDir: string | undefined,\n dirOrPrompt: string,\n promptOrTools: string | SkillToolDef[],\n toolsOrRounds: SkillToolDef[] | number,\n rounds?: number,\n llmOverride?: SkillLlmOverride,\n ) {\n // Detect the new-style (asset passed as 5th arg) vs legacy-style (asset\n // omitted, image at 5th arg). An Asset has the shape { chain, token, decimals, symbol }.\n let asset: Asset;\n let image: string | undefined;\n let imageFile: string | undefined;\n let skillDir: string;\n let systemPrompt: string;\n let tools: SkillToolDef[];\n let maxToolRounds: number;\n\n if (assetOrImage !== undefined && typeof assetOrImage === 'object' && 'token' in assetOrImage) {\n // new-style: assetOrImage is Asset\n asset = assetOrImage;\n image = imageOrImageFile;\n imageFile = imageFileOrDir;\n skillDir = dirOrPrompt;\n systemPrompt = promptOrTools as string;\n tools = toolsOrRounds as SkillToolDef[];\n maxToolRounds = rounds as number;\n } else {\n // legacy-style: 5th arg is `image` (string or undefined), asset=NATIVE_SOL.\n asset = NATIVE_SOL;\n image = assetOrImage as string | undefined;\n imageFile = imageOrImageFile;\n skillDir = imageFileOrDir as string;\n systemPrompt = dirOrPrompt;\n tools = promptOrTools as SkillToolDef[];\n maxToolRounds = toolsOrRounds as number;\n }\n\n this.name = name;\n this.description = description;\n this.capabilities = capabilities;\n this.priceSubunits = priceSubunits;\n this.asset = asset;\n this.llmOverride = llmOverride;\n this.image = image;\n this.imageFile = imageFile;\n this.dir = skillDir;\n this.inner = new SdkScriptSkill({\n name,\n description,\n capabilities,\n priceSubunits: BigInt(Math.round(priceSubunits)),\n asset,\n skillDir,\n systemPrompt,\n tools,\n maxToolRounds,\n llmOverride,\n image,\n imageFile,\n });\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n return this.inner.execute(input, ctx);\n }\n}\n","/**\n * CLI skill loader. Delegates SKILL.md parsing + validation to\n * `@elisym/sdk/skills` (one source of truth across plugin + CLI) and\n * constructs CLI's wrapper instances. CLI keeps its own Skill interface\n * (`priceSubunits: number` + `asset` + `mode`) so existing runtime.ts\n * call sites stay byte-for-byte compatible while supporting USDC and\n * non-LLM execution modes.\n */\nimport { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n DEFAULT_SCRIPT_TIMEOUT_MS,\n parseSkillMd,\n resolveInsidePath,\n validateSkillFrontmatter,\n type ParsedSkill,\n} from '@elisym/sdk/skills';\nimport { DynamicScriptSkill, StaticFileSkill, StaticScriptSkill } from './non-llm-skills.js';\nimport { ScriptSkill } from './script-skill.js';\nimport type { Skill } from './index.js';\n\nfunction buildCliSkill(\n parsed: ParsedSkill,\n entryPath: string,\n scriptEnv: NodeJS.ProcessEnv | undefined,\n): Skill {\n // Confine image_file to the skill directory, mirroring the SDK loader's guard. A\n // third-party SKILL.md is untrusted; without this a traversing image_file (e.g.\n // ../../.secrets.json) would be read and uploaded to a public media host on\n // `start`. Drop a traversing value rather than fail the whole skill - the image\n // is cosmetic, the way output_file/script (load-bearing) hard-fail instead.\n let safeImageFile = parsed.imageFile;\n if (safeImageFile !== undefined && resolveInsidePath(entryPath, safeImageFile) === null) {\n console.warn(\n `SKILL.md \"${parsed.name}\": ignoring \"image_file\" that resolves outside the skill directory: ${safeImageFile}`,\n );\n safeImageFile = undefined;\n }\n\n let skill: Skill;\n switch (parsed.mode) {\n case 'llm':\n skill = new ScriptSkill(\n parsed.name,\n parsed.description,\n parsed.capabilities,\n Number(parsed.priceSubunits),\n parsed.asset,\n parsed.image,\n safeImageFile,\n entryPath,\n parsed.systemPrompt,\n parsed.tools,\n parsed.maxToolRounds,\n parsed.llmOverride,\n );\n break;\n case 'static-file': {\n if (parsed.outputFile === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - outputFile missing for mode 'static-file'`,\n );\n }\n const outputFilePath = resolveInsidePath(entryPath, parsed.outputFile);\n if (!outputFilePath) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": \"output_file\" must stay inside the skill directory`,\n );\n }\n skill = new StaticFileSkill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n outputFilePath,\n image: parsed.image,\n imageFile: safeImageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n });\n break;\n }\n case 'static-script':\n case 'dynamic-script': {\n if (parsed.script === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - script missing for mode '${parsed.mode}'`,\n );\n }\n const scriptPath = resolveInsidePath(entryPath, parsed.script);\n if (!scriptPath) {\n throw new Error(`SKILL.md \"${parsed.name}\": \"script\" must stay inside the skill directory`);\n }\n const scriptParams = {\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n scriptPath,\n scriptArgs: parsed.scriptArgs,\n scriptTimeoutMs: parsed.scriptTimeoutMs ?? DEFAULT_SCRIPT_TIMEOUT_MS,\n scriptEnv,\n image: parsed.image,\n imageFile: safeImageFile,\n dir: entryPath,\n llmOverride: parsed.llmOverride,\n };\n // Only dynamic-script can exchange files, so the MIME hints are threaded\n // only there (the static-script wrapper has no such params).\n skill =\n parsed.mode === 'dynamic-script'\n ? new DynamicScriptSkill({\n ...scriptParams,\n outputMime: parsed.outputMime,\n inputMime: parsed.inputMime,\n })\n : new StaticScriptSkill(scriptParams);\n break;\n }\n }\n if (parsed.rateLimit) {\n skill.rateLimit = parsed.rateLimit;\n }\n if (parsed.executionTimeoutSecs !== undefined) {\n skill.executionTimeoutSecs = parsed.executionTimeoutSecs;\n }\n return skill;\n}\n\nexport interface LoadSkillsOptions {\n /**\n * Env propagated into script-mode skills (`static-script`, `dynamic-script`).\n * Typically `{ ...process.env, <PROVIDER_KEY>: <decrypted-secret>, ... }`\n * built from the agent's encrypted secrets, so scripts get the same\n * provider keys that LLM-mode skills already enjoy.\n */\n scriptEnv?: NodeJS.ProcessEnv;\n}\n\nexport function loadSkillsFromDir(skillsDir: string, options: LoadSkillsOptions = {}): 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 const parsed = validateSkillFrontmatter(frontmatter, systemPrompt, {\n allowFreeSkills: true,\n });\n skills.push(buildCliSkill(parsed, entryPath, options.scriptEnv));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.warn(` ! Skipping skill \"${entry}\": ${message}`);\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, KIND_JOB_FEEDBACK, decodeJobPayload, jobRequestKind } from '@elisym/sdk';\nimport type { ElisymClient, ElisymIdentity, FileAttachment, SubCloser } from '@elisym/sdk';\nimport { verifyEvent, type Event, type Filter } 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 /** File attachment descriptor, decoded from the job-payload envelope (if any). */\n attachment?: FileAttachment;\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\n/** Parse a customer-supplied `bid` tag, returning undefined on a non-numeric value. */\nfunction parseBidTag(value: string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\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 `t` tags. A Nostr tag may legally be a single-element array\n // (`['t']`) and still pass verifyEvent, so drop entries with no value\n // rather than asserting one is present (which would inject `undefined`\n // into the declared `string[]`).\n const tags = event.tags\n .filter((tag) => tag[0] === 't')\n .map((tag) => tag[1])\n .filter((value): value is string => typeof value === 'string');\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 rawInput = encrypted ? event.content : (iTag?.[1] ?? event.content);\n\n // Decode the job-payload envelope: a file job carries `{ text, attachment }`,\n // a plain-text job decodes to its text unchanged. A malformed/unknown-version\n // envelope is skipped (the provider can't process it).\n let input: string;\n let attachment: FileAttachment | undefined;\n try {\n const decoded = decodeJobPayload(rawInput);\n input = decoded.text ?? '';\n attachment = decoded.attachment;\n } catch {\n return;\n }\n\n onJob({\n jobId: event.id,\n input,\n inputType,\n tags,\n customerId: event.pubkey,\n bid: parseBidTag(bidTag?.[1]),\n encrypted,\n rawEvent: event,\n attachment,\n });\n },\n );\n }\n\n /**\n * Wait for the customer's `payment-completed` feedback for a specific job\n * and return the on-chain Solana tx signature it carries.\n *\n * The customer publishes this event right after `confirmTransaction(... 'confirmed')`\n * succeeds (see packages/app/app/hooks/useBuyCapability.ts), so receiving it\n * lets the provider verify the payment with a single targeted\n * `getTransaction(sig, commitment: 'confirmed')` call instead of the\n * heavyweight `getSignaturesForAddress(reference)` index lookup. This is\n * dramatically more reliable on the public devnet RPC, which throttles and\n * lags the address index.\n *\n * Resolves with `null` if `signal` aborts or `timeoutMs` elapses before a\n * valid signature arrives. The timeout exists so a customer that disappears\n * after job submission does not hold a `p-limit` slot for the full payment\n * expiry window - without it this path waits forever on the relay.\n */\n waitForPaymentSignature(\n jobId: string,\n customerPubkey: string,\n signal: AbortSignal,\n timeoutMs?: number,\n ): Promise<string | null> {\n return new Promise((resolve) => {\n let settled = false;\n const filter: Filter = {\n kinds: [KIND_JOB_FEEDBACK],\n '#e': [jobId],\n authors: [customerPubkey],\n '#t': ['elisym'],\n since: Math.floor(Date.now() / 1000) - 5,\n };\n\n const finish = (sig: string | null) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer) {\n clearTimeout(timer);\n }\n signal.removeEventListener('abort', onAbort);\n sub.close();\n resolve(sig);\n };\n\n const sub = this.client.pool.subscribe(filter, (event: Event) => {\n if (settled) {\n return;\n }\n if (!verifyEvent(event)) {\n return;\n }\n // Relays are untrusted and may return events from any author despite the\n // `authors` filter; verifyEvent only proves the event is self-signed, not\n // that it came from the expected customer. Match the author-equality check\n // used everywhere else (e.g. marketplace handleResult) so a spoofed\n // payment-completed cannot feed an attacker-chosen tx signature into the\n // fast verification path.\n if (event.pubkey !== customerPubkey) {\n return;\n }\n const status = event.tags.find((t) => t[0] === 'status')?.[1];\n if (status !== 'payment-completed') {\n return;\n }\n const txTag = event.tags.find((t) => t[0] === 'tx');\n const sig = txTag?.[1];\n const chain = txTag?.[2];\n if (typeof sig !== 'string' || sig.length === 0) {\n return;\n }\n // Chain tag is optional for backwards compatibility, but if present it\n // must be 'solana' - we cannot verify a signature on another chain.\n if (chain !== undefined && chain !== 'solana') {\n return;\n }\n finish(sig);\n });\n\n const onAbort = () => finish(null);\n const timer =\n timeoutMs !== undefined && timeoutMs > 0 ? setTimeout(() => finish(null), timeoutMs) : null;\n\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\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 attachment?: FileAttachment,\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 undefined,\n attachment,\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 * Three independent triggers force a pool reset:\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 * - `sleep-detect`: if the wall-clock gap between two consecutive ticks exceeds\n * `min(probeInterval, selfPingInterval) * SLEEP_DETECT_MULTIPLIER`, the host\n * was almost certainly suspended (macOS sleep, hibernation, container pause).\n * On suspend the WebSocket connections die from the relay side, but the next\n * probe may still pass via a freshly opened query - meanwhile the long-lived\n * ping subscription stays dead. Forcing a reset on the first post-suspend\n * tick avoids that window.\n */\nimport type { ElisymClient, ElisymIdentity, SubCloser } from '@elisym/sdk';\nimport type { Logger } from 'pino';\nimport {\n WATCHDOG_PROBE_INTERVAL_MS,\n WATCHDOG_PROBE_TIMEOUT_MS,\n WATCHDOG_SELF_PING_INTERVAL_MS,\n WATCHDOG_SELF_PING_TIMEOUT_MS,\n WATCHDOG_SLEEP_DETECT_MULTIPLIER,\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 /** Optional structured logger for pool-reset and probe events. */\n logger?: Logger;\n probeIntervalMs?: number;\n probeTimeoutMs?: number;\n selfPingIntervalMs?: number;\n selfPingTimeoutMs?: number;\n /**\n * Optional `Date.now`-style provider. Tests inject a controlled clock to\n * simulate macOS sleep without firing intermediate `setInterval` callbacks\n * (see watchdog.test.ts). Production should leave this unset.\n */\n now?: () => 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 logger,\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 now = Date.now,\n } = deps;\n\n let pingSub: SubCloser = client.ping.subscribeToPings(identity, onPing);\n let stopped = false;\n // Separate flags: a slow probe must not suppress the self-ping that follows,\n // since they exercise different layers (short query vs. live subscription).\n let probeBusy = false;\n let selfPingBusy = false;\n let lastTickAt = now();\n\n const sleepDetectThresholdMs =\n Math.min(probeIntervalMs, selfPingIntervalMs) * WATCHDOG_SLEEP_DETECT_MULTIPLIER;\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 /**\n * Returns `true` if a wall-clock gap larger than the configured threshold\n * was observed since the last tick - in which case it has already forced a\n * pool reset and the caller should skip its normal health check. Each tick\n * (probe and self-ping) updates the shared `lastTickAt`, so consecutive\n * normal ticks see a gap close to one interval.\n */\n const detectAndHandleSleep = (): boolean => {\n const tickedAt = now();\n const delta = tickedAt - lastTickAt;\n lastTickAt = tickedAt;\n if (delta <= sleepDetectThresholdMs) {\n return false;\n }\n log(\n `[watchdog] tick gap ${delta}ms exceeds ${sleepDetectThresholdMs}ms threshold, ` +\n `forcing pool reset (host suspend / sleep detected)`,\n );\n logger?.info({ event: 'pool_reset', reason: 'sleep_detected', gapMs: delta }, 'pool reset');\n resetPoolAndResubscribe();\n return true;\n };\n\n const probeTimer = setInterval(async () => {\n if (stopped) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (probeBusy) {\n return;\n }\n probeBusy = 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 logger?.info({ event: 'pool_reset', reason: 'probe_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] probe/reset error: ${errorMessage}`);\n logger?.warn({ event: 'probe_error', error: errorMessage }, 'watchdog probe/reset error');\n } finally {\n probeBusy = 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) {\n return;\n }\n if (detectAndHandleSleep()) {\n return;\n }\n if (selfPingBusy) {\n return;\n }\n selfPingBusy = 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 logger?.info({ event: 'pool_reset', reason: 'self_ping_failed' }, 'pool reset');\n resetPoolAndResubscribe();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`[watchdog] self-ping/reset error: ${errorMessage}`);\n logger?.warn(\n { event: 'self_ping_error', error: errorMessage },\n 'watchdog self-ping/reset error',\n );\n } finally {\n selfPingBusy = 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 SOL and USDC balance.\n */\nimport { USDC_SOLANA_DEVNET, formatAssetAmount, formatSol } from '@elisym/sdk';\nimport { loadAgent, listAgents } from '@elisym/sdk/agent-store';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport { fetchUsdcBalance, getRpcUrl } from '../helpers.js';\n\nexport async function cmdWallet(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n\n if (!name) {\n const agents = await listAgents(cwd);\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.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n name = selected;\n }\n\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(name!, cwd, passphrase);\n\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n if (!solPayment?.address) {\n console.error('Solana address not configured for this agent.');\n process.exit(1);\n }\n\n const rpcUrl = getRpcUrl(solPayment.network);\n const rpc = createSolanaRpc(rpcUrl);\n const walletAddress = address(solPayment.address);\n const { value: balance } = await rpc.getBalance(walletAddress).send();\n const usdcBalance = await fetchUsdcBalance(rpc, walletAddress);\n\n console.log(`\\n Agent: ${name}`);\n console.log(` Network: ${solPayment.network}`);\n console.log(` Address: ${solPayment.address}`);\n console.log(` SOL balance: ${formatSol(Number(balance))} (${balance} lamports)`);\n console.log(` USDC balance: ${formatAssetAmount(USDC_SOLANA_DEVNET, usdcBalance)}\\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"]}
|