@elisym/cli 0.22.4 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1451 -7
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/skills-examples/README.md +2 -0
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/mime.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","extname","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 status: response.status,\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 status: response.status,\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 status: response.status,\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 /**\n * Result descriptors for a MULTI-file job (each a serialized FileAttachment).\n * Supersedes `result_attachment`; recovery prefers this and falls back to the\n * single field for jobs recorded before multi-file support.\n */\n result_attachments?: 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(\n jobId: string,\n fields: { resultAttachment?: string; resultAttachments?: string[] },\n ): 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 if (fields.resultAttachments !== undefined) {\n entry.result_attachments = fields.resultAttachments;\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 type BlossomService,\n createBlossomTransport,\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 { mimeFromPath } from '../mime.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 // `@solana/kit` transport errors routinely interpolate the request URL, which\n // can carry a Helius/Alchemy/QuickNode API key - scrub before it hits the banner.\n const message = typeof e?.message === 'string' ? e.message : String(e);\n console.warn(` ! Wallet error: ${redactRpcUrlsInText(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 // ELISYM_PASSPHRASE decrypts `.secrets.json` (Nostr + Solana secret keys) at rest.\n // A skill script - which may be third-party SKILL.md installed under the agent dir -\n // has no legitimate use for it, and leaking it would let the script read the on-disk\n // secrets and defeat the AES-256-GCM + scrypt at-rest encryption entirely. The\n // per-provider LLM keys added below ARE intentional (scripts proxy to LLMs); the\n // passphrase is not. (The LLM-tool subprocess path already strips secrets via\n // scriptSkill's SECRET_ENV_VARS; this closes the same gap on the script path.)\n delete scriptEnv.ELISYM_PASSPHRASE;\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 // `provider::model` keys whose model returned HTTP 404 at deep-verify (the\n // provider retired it). Skills bound to these are not advertised (Step 11) so\n // the gateway keeps serving its other models instead of offering a capability\n // that can never be fulfilled.\n const retiredModels = new Set<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 // A retired model (HTTP 404) is permanent and per-model. Do NOT seed it:\n // its skills are not advertised below, and seeding would only add a\n // misleading \"temporarily unavailable\" gate for any stale-card job.\n const modelRetired =\n !verification.ok && verification.reason === 'unavailable' && verification.status === 404;\n if (!modelRetired) {\n healthMonitor.seed(pair.provider, pair.model, verification);\n }\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 if (verification.status === 404) {\n console.log('retired');\n console.error(\n ` ! ${pair.provider} model \"${pair.model}\" no longer exists (HTTP 404). ` +\n `Update its model: in the SKILL.md / elisym.yaml. Skills using it will not be advertised.\\n`,\n );\n retiredModels.add(`${pair.provider}::${pair.model}`);\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 // Uploads go to the Blossom relay (client.blossom), which falls back to nostr.build on failure.\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 client.blossom,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n const bannerUrl = await resolveMediaField(\n loaded.yaml.banner,\n loaded.dir,\n mediaCache,\n client.blossom,\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 client.blossom,\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\n // Fetch what is already on the relays once, up front. The result drives both\n // the unchanged-skip below (Step 10.5) and the orphan sweep (Step 10.6), so we\n // pay for a single querySync per start instead of re-publishing blind. A network\n // failure returns [] - we then re-publish everything (safe) and skip the sweep.\n async function fetchPublishedPolicies() {\n try {\n return await client.pool.querySync({\n kinds: [KIND_LONG_FORM_ARTICLE],\n authors: [identity.publicKey],\n '#t': [POLICY_T_TAG],\n });\n } catch {\n return [];\n }\n }\n const publishedPolicies = await fetchPublishedPolicies();\n\n // Latest event per d-tag (tombstones included), so the skip compares against\n // the true live version. A tombstone is the live \"deleted\" state - filtering\n // tombstones out here would let an older non-empty version shadow a newer\n // tombstone and wrongly skip re-publishing a re-added policy file.\n const latestPolicyByDTag = new Map<string, (typeof publishedPolicies)[number]>();\n for (const event of publishedPolicies) {\n const dTag = event.tags.find((tag) => tag[0] === 'd')?.[1];\n if (!dTag) {\n continue;\n }\n const prev = latestPolicyByDTag.get(dTag);\n if (!prev || event.created_at > prev.created_at) {\n latestPolicyByDTag.set(dTag, event);\n }\n }\n\n for (const policy of policies) {\n const onRelay = latestPolicyByDTag.get(`${POLICY_D_TAG_PREFIX}${policy.type}`);\n const relayVersion = onRelay?.tags.find((tag) => tag[0] === 'policy_version')?.[1];\n // `onRelay.content` excludes a tombstoned latest (empty content): a deleted\n // policy that is back on disk must be re-published, not skipped.\n if (\n onRelay &&\n onRelay.content &&\n relayVersion === policy.version &&\n onRelay.content === policy.content\n ) {\n console.log(` * Policy: ${policy.type}@${policy.version} (unchanged, skipped)`);\n continue;\n }\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 for (const event of publishedPolicies) {\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\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` flags a file input;\n // `inputText` tells the web whether to also show its text box for that file job.\n ...(skill.inputMime ? { inputMime: skill.inputMime } : {}),\n ...(skill.inputText ? { inputText: skill.inputText } : {}),\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 function retiredModelKeyForSkill(skill: (typeof allSkills)[0]): string | undefined {\n if (skill.resolvedTriple) {\n return `${skill.resolvedTriple.provider}::${skill.resolvedTriple.model}`;\n }\n if (skill.llmOverride?.provider && skill.llmOverride?.model) {\n return `${skill.llmOverride.provider}::${skill.llmOverride.model}`;\n }\n return undefined;\n }\n\n let cardsPublished = 0;\n for (const skill of allSkills) {\n const modelKey = retiredModelKeyForSkill(skill);\n if (modelKey && retiredModels.has(modelKey)) {\n console.warn(` ! Not advertising \"${skill.name}\" - its model was retired (HTTP 404).`);\n logger.warn(\n { event: 'publish_skipped_retired', kind: 31990, skill: skill.name, model: modelKey },\n 'capability not advertised - model retired',\n );\n continue;\n }\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 // Encrypted Blossom transport for job file I/O (peer to iroh). Reuses the client's BlossomService\n // (so it shares the nostr.build fallback) and the provider identity for BUD-11 auth + NIP-44 wrap.\n const blossomTransport = createBlossomTransport({ blossom: client.blossom, identity });\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 identity,\n blossomTransport,\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/**\n * Redact any RPC URL embedded in free-form text (e.g. a thrown error message) by\n * routing every http(s) URL it contains through `stripRpcSecrets`. Used on error\n * messages that may interpolate the request URL (and thus an embedded API key)\n * while preserving the surrounding diagnostic text.\n */\nexport function redactRpcUrlsInText(text: string): string {\n return text.replace(/https?:\\/\\/[^\\s)'\"]+/g, (url) => stripRpcSecrets(url));\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 blossom: Pick<BlossomService, 'upload'>,\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, blossom, 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. */\nexport async function uploadOrReuse(\n cacheKey: string,\n absPath: string,\n cache: MediaCache,\n blossom: Pick<BlossomService, 'upload'>,\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], { type: mimeFromPath(absPath) });\n const descriptor = await blossom.upload(identity, blob);\n cache[cacheKey] = newCacheEntry(descriptor.url, sha256);\n onCacheUpdate();\n console.log(` Uploaded: ${descriptor.url}`);\n return descriptor.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 { extname } from 'node:path';\n\nconst MIME_BY_EXT: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.avif': 'image/avif',\n};\n\n/** Best-effort MIME for a file path's extension; used as the upload Content-Type. */\nexport function mimeFromPath(path: string): string {\n return MIME_BY_EXT[extname(path).toLowerCase()] ?? 'application/octet-stream';\n}\n","import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { basename, extname, 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 readAcceptedTransports,\n utf8ByteLength,\n} from '@elisym/sdk';\nimport type {\n Asset,\n BlossomBlobTransport,\n ElisymIdentity,\n FileAttachment,\n FileTransport,\n ProtocolConfigInput,\n SlidingWindowLimiter,\n TransportKind,\n} 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/**\n * Thrown when seeding the RESULT blob (iroh/blossom) fails or times out AFTER the\n * skill produced output. Kept distinct so the post-execute catch keeps the job\n * `paid` (not `failed`) - the recovery loop then re-delivers it on a freshly-reset\n * iroh node. The message is customer-safe (no internals); the real cause is logged.\n */\nclass SeedFailedError extends Error {\n constructor(cause?: unknown) {\n super('Result is ready - delivery is retrying and will arrive shortly.', { cause });\n this.name = 'SeedFailedError';\n }\n}\n\n/**\n * Thrown when on-chain payment verification times out but the customer was NOT\n * conclusively shown to have abandoned the job (the reference scan did not return\n * the definitive \"no matching transaction\" result, or the customer asserted a\n * signature we could not yet confirm). Kept distinct so `processJob` keeps the job\n * `paid` instead of marking it `failed`: a payment that confirms shortly after the\n * timeout (e.g. a lagging devnet RPC) is then picked up by recovery's reVerifyPayment\n * rather than being silently lost. A conclusively-abandoned job throws a plain Error\n * and is still marked failed.\n */\nclass PaymentTimeoutError extends Error {\n constructor() {\n super('Payment verification timed out; awaiting late confirmation.');\n this.name = 'PaymentTimeoutError';\n }\n}\n\n// A dynamic-script result is written to a temp file literally named `output` (no\n// extension), so the customer would download a bare `output` with no extension.\n// Derive a sensible extension from the declared output MIME; unknown MIME → none.\nconst MIME_EXTENSIONS: Record<string, string> = {\n 'image/png': '.png',\n 'image/jpeg': '.jpg',\n 'image/webp': '.webp',\n 'image/gif': '.gif',\n 'image/svg+xml': '.svg',\n 'application/pdf': '.pdf',\n 'text/plain': '.txt',\n 'text/markdown': '.md',\n 'application/json': '.json',\n 'audio/mpeg': '.mp3',\n 'audio/wav': '.wav',\n 'video/mp4': '.mp4',\n 'video/webm': '.webm',\n 'application/zip': '.zip',\n};\n\nfunction extensionForMime(mime: string | undefined): string {\n return mime ? (MIME_EXTENSIONS[mime] ?? '') : '';\n}\n\n// Seeding is local (hash + store-copy + ticket mint); anything slower than this is\n// worth an operator log line to pin a misbehaving native addon before it times out.\nconst SLOW_SEED_LOG_MS = 5_000;\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 (\n error instanceof AgentUnavailableError ||\n error instanceof ExecutionBudgetExceededError ||\n error instanceof SeedFailedError\n ) {\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 private identity?: ElisymIdentity,\n private blossomTransport?: BlossomBlobTransport,\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 // - `paid` + `SeedFailedError`: same - the skill produced output but the\n // result blob seed failed/timed out; keep `paid` so recovery re-delivers\n // on a freshly-reset iroh node rather than losing the paid job.\n // - `paid` + `PaymentTimeoutError`: payment verification timed out but the\n // customer was not conclusively shown to have abandoned; keep `paid` so\n // recovery re-verifies a late on-chain payment instead of losing it.\n // - everything else: markFailed as before.\n const currentStatus = this.ledger.getStatus(job.jobId);\n const keepPaidForRecovery =\n (e instanceof AgentUnavailableError ||\n e instanceof SeedFailedError ||\n e instanceof PaymentTimeoutError) &&\n currentStatus === 'paid';\n if (currentStatus !== 'executed' && !keepPaidForRecovery) {\n this.ledger.markFailed(job.jobId);\n }\n if (keepPaidForRecovery) {\n log(`[${job.jobId.slice(0, 8)}] Keeping status=paid; recovery will retry (24h cutoff).`);\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, job.customerId, signal);\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 { attachments, deliveredContent } = await this.buildResultAttachment(\n job.jobId,\n output,\n job.customerId,\n readAcceptedTransports(job.rawEvent.tags),\n );\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 attachments.length > 0 ? attachments : undefined,\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 * Seed a result blob through iroh, timing it and converting any failure (incl. the\n * transport's seed timeout, which also resets the wedged node) into a\n * `SeedFailedError` so the post-execute catch keeps the job `paid` for recovery\n * rather than losing the customer's paid job.\n */\n private async seedGuarded(\n jobId: string,\n kind: string,\n run: () => Promise<{ ticket: string; size: number }>,\n ): Promise<{ ticket: string; size: number }> {\n const log = this.callbacks.onLog ?? console.log;\n const started = Date.now();\n try {\n const seeded = await run();\n const elapsed = Date.now() - started;\n if (elapsed > SLOW_SEED_LOG_MS) {\n log(`[${jobId.slice(0, 8)}] iroh seed (${kind}) slow: ${elapsed}ms`);\n }\n return seeded;\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n log(\n `[${jobId.slice(0, 8)}] iroh seed (${kind}) failed after ${Date.now() - started}ms: ${detail}`,\n );\n throw new SeedFailedError(error);\n }\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 customerPubkey: string,\n acceptedTransports: TransportKind[] | undefined,\n ): Promise<{ attachments: FileAttachment[]; deliveredContent: string }> {\n // Seed the (encrypted-Blossom) member only when the customer didn't advertise, or advertised\n // blossom. iroh is always seeded. So advertising ['iroh'] (MCP) skips the Blossom upload.\n const wantBlossom = acceptedTransports === undefined || acceptedTransports.includes('blossom');\n // One OR many file results: a skill that wrote several files to ELISYM_OUTPUT_DIR\n // yields `filePaths`; a single ELISYM_OUTPUT_FILE yields `filePath`. Treat both as a list.\n const filePaths = output.filePaths ?? (output.filePath !== undefined ? [output.filePath] : []);\n if (filePaths.length > 0) {\n // seedPath copies the bytes into the persistent iroh store, so the producer's\n // temp dir is no longer needed once seeding has been attempted (recovery\n // re-shares from the store, never the temp dir). Release it whether seeding\n // succeeds or throws (a SeedFailedError keeps the job `paid` for recovery, which\n // re-executes into a fresh temp dir) so a failure doesn't leave it behind.\n try {\n const attachments: FileAttachment[] = [];\n for (const filePath of filePaths) {\n attachments.push(\n await this.seedFileToAttachment(\n jobId,\n filePath,\n output.outputMime,\n customerPubkey,\n wantBlossom,\n ),\n );\n }\n // A file result's `output.data` is normally a small note delivered inline\n // alongside the tickets. But a skill can emit a LARGE note next to its file(s)\n // (e.g. a long summary + a generated PDF); spill it the same way the large-text\n // branch does so it never overflows the NIP-44 inline cap, which would otherwise\n // throw at encryption time and fail the whole paid job.\n let deliveredContent = output.data;\n if (utf8ByteLength(output.data) > LIMITS.MAX_ENCRYPTED_INLINE_BYTES) {\n attachments.push(\n await this.spillTextAttachment(jobId, output.data, customerPubkey, wantBlossom),\n );\n deliveredContent = '';\n }\n this.ledger.recordAttachment(jobId, {\n resultAttachments: attachments.map((a) => JSON.stringify(a)),\n });\n return { attachments, deliveredContent };\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 const attachment = await this.spillTextAttachment(\n jobId,\n output.data,\n customerPubkey,\n wantBlossom,\n );\n this.ledger.recordAttachment(jobId, { resultAttachments: [JSON.stringify(attachment)] });\n return { attachments: [attachment], deliveredContent: '' };\n }\n\n return { attachments: [], deliveredContent: output.data };\n }\n\n /**\n * Seed a text note too large for inline delivery to iroh (+ encrypted Blossom when\n * wanted) and return it as a `result.txt` FileAttachment. Shared by the large-text\n * result path and the file-result path (a file result may carry an oversized note).\n */\n private async spillTextAttachment(\n jobId: string,\n text: string,\n customerPubkey: string,\n wantBlossom: boolean,\n ): Promise<FileAttachment> {\n if (!this.irohTransport) {\n throw new Error('Result is too large to deliver inline and iroh transport is unavailable.');\n }\n const iroh = this.irohTransport;\n const dataBytes = Buffer.from(text, 'utf8');\n const seeded = await this.seedGuarded(jobId, 'large-text', () => iroh.seedBytes(dataBytes));\n const transports: FileTransport[] = [{ kind: 'iroh', ticket: seeded.ticket }];\n if (wantBlossom) {\n const blossomMember = await this.seedBlossomMember(dataBytes, customerPubkey);\n if (blossomMember !== undefined) {\n transports.unshift(blossomMember);\n }\n }\n return { name: 'result.txt', size: seeded.size, mime: 'text/plain', transports };\n }\n\n /**\n * Seed ONE result file to iroh (+ encrypted Blossom when wanted) and build its\n * FileAttachment. A seed timeout throws SeedFailedError (job stays `paid` for\n * recovery). Shared by the single- and multi-file result paths.\n */\n private async seedFileToAttachment(\n jobId: string,\n filePath: string,\n outputMime: string | undefined,\n customerPubkey: string,\n wantBlossom: boolean,\n ): Promise<FileAttachment> {\n if (!this.irohTransport) {\n throw new Error('Skill produced a file result but iroh transport is unavailable.');\n }\n const iroh = this.irohTransport;\n const seeded = await this.seedGuarded(jobId, 'file', () => iroh.seedPath(filePath));\n // iroh is always present (the robust fallback); blossom is added (preferred, first) when\n // available + within the per-file encrypted-size cap, so web customers can fetch over HTTP.\n const transports: FileTransport[] = [{ kind: 'iroh', ticket: seeded.ticket }];\n if (wantBlossom) {\n const blossomMember = await this.seedBlossomFromPath(filePath, seeded.size, customerPubkey);\n if (blossomMember !== undefined) {\n transports.unshift(blossomMember);\n }\n }\n // The single-file producer's temp file is literally `output` (no extension); give\n // it one from the declared MIME. A producer-chosen name with an extension is kept.\n const producedName = basename(filePath);\n const name = extname(producedName)\n ? producedName\n : `${producedName}${extensionForMime(outputMime)}`;\n return { name, size: seeded.size, mime: outputMime ?? 'application/octet-stream', transports };\n }\n\n /**\n * Encrypt `bytes` to `recipientPubkey` and seed them to Blossom, returning a `blossom` transport\n * member - or `undefined` when blossom isn't configured, the bytes exceed the encrypted cap, or the\n * upload fails. Returning undefined (never throwing) keeps iroh as the guaranteed transport: an\n * optional second path must never fail the job.\n */\n private async seedBlossomMember(\n bytes: Uint8Array,\n recipientPubkey: string,\n ): Promise<Extract<FileTransport, { kind: 'blossom' }> | undefined> {\n if (this.blossomTransport === undefined || this.identity === undefined) {\n return undefined;\n }\n if (bytes.byteLength > LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES) {\n return undefined;\n }\n try {\n return await this.blossomTransport.seedBytes({ bytes, recipientPubkey });\n } catch {\n // Blossom (incl. the nostr.build-fallback refusal) failed - deliver iroh-only this time.\n return undefined;\n }\n }\n\n /** Read a file (only when within the encrypted cap, to bound memory) and seed it to Blossom. */\n private async seedBlossomFromPath(\n filePath: string,\n size: number,\n recipientPubkey: string,\n ): Promise<Extract<FileTransport, { kind: 'blossom' }> | undefined> {\n if (this.blossomTransport === undefined || this.identity === undefined) {\n return undefined;\n }\n if (size > LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES) {\n return undefined;\n }\n try {\n const bytes = await readFile(filePath);\n return await this.seedBlossomMember(bytes, recipientPubkey);\n } catch {\n return undefined;\n }\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(\n (transport): transport is Extract<FileTransport, { kind: 'iroh' }> =>\n transport.kind === 'iroh',\n );\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 // Preserve every non-iroh transport (e.g. blossom: its url/sha256/enc stay valid across a\n // restart - the blob lives on the relay, not a per-session ticket); refresh only the iroh ticket.\n const transports = stored.transports.map((transport) =>\n transport.kind === 'iroh' ? { kind: 'iroh' as const, ticket: freshTicket } : transport,\n );\n return { ...stored, transports };\n }\n\n /**\n * Re-share ALL of a recovered job's result attachments (multi-file aware). Prefers\n * the `result_attachments` array; falls back to the legacy single `result_attachment`.\n * A failure on ANY attachment throws (the caller marks the whole job failed - a\n * partial multi-file delivery is not a valid paid result).\n */\n private async reShareResultAttachments(entry: {\n result_attachments?: string[];\n result_attachment?: string;\n }): Promise<FileAttachment[]> {\n const stored =\n entry.result_attachments ??\n (entry.result_attachment !== undefined ? [entry.result_attachment] : []);\n const out: FileAttachment[] = [];\n for (const serialized of stored) {\n const attachment = await this.reShareResultAttachment(serialized);\n if (attachment !== undefined) {\n out.push(attachment);\n }\n }\n return out;\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 senderPubkey: string,\n signal?: AbortSignal,\n ): Promise<{ inlineText?: string; filePath?: string; cleanup: () => Promise<void> } | undefined> {\n if (attachment === undefined) {\n return undefined;\n }\n // Bound the post-payment input fetch so a slow/non-responsive customer ticket or URL\n // can't hold a p-limit job slot. ONE controller drives the abort: it fires when the job\n // is aborted (stop()/shutdown via `signal`) OR the operator's execution budget elapses.\n // It is threaded into both transports - the blossom HTTP fetch aborts for real; the iroh\n // fetch abandons its JS wait (the napi binding can't cancel a native transfer mid-flight,\n // so the native download self-terminates in the background, like the timeout path).\n const fetchTimeoutMs =\n this.config.executionTimeoutSecs && this.config.executionTimeoutSecs > 0\n ? this.config.executionTimeoutSecs * 1000\n : undefined;\n const fetchAbort = new AbortController();\n const onParentAbort = (): void => fetchAbort.abort();\n if (signal) {\n if (signal.aborted) {\n fetchAbort.abort();\n } else {\n signal.addEventListener('abort', onParentAbort);\n }\n }\n const budgetTimer =\n fetchTimeoutMs !== undefined\n ? setTimeout(() => fetchAbort.abort(), fetchTimeoutMs)\n : undefined;\n\n try {\n const irohMember = attachment.transports.find(\n (t): t is Extract<FileTransport, { kind: 'iroh' }> => t.kind === 'iroh',\n );\n const blossomMember = attachment.transports.find(\n (t): t is Extract<FileTransport, { kind: 'blossom' }> => t.kind === 'blossom',\n );\n\n // Prefer iroh when available: it streams to disk with no in-memory cap. Fall back to the\n // encrypted blossom transport for web-submitted inputs that only carry a blossom member.\n if (irohMember !== undefined && this.irohTransport !== undefined) {\n if (\n attachment.mime.startsWith('text/') &&\n attachment.size <= LIMITS.MAX_REINLINE_TEXT_BYTES\n ) {\n const bytes = await this.irohTransport.fetchToBytes(irohMember.ticket, {\n maxBytes: LIMITS.MAX_REINLINE_TEXT_BYTES,\n timeoutMs: fetchTimeoutMs,\n signal: fetchAbort.signal,\n });\n return this.materializeBytesInput(bytes, attachment.mime);\n }\n const dir = await mkdtemp(join(tmpdir(), 'elisym-job-'));\n const filePath = join(dir, 'input');\n try {\n await this.irohTransport.fetchToPath(irohMember.ticket, filePath, {\n timeoutMs: fetchTimeoutMs,\n signal: fetchAbort.signal,\n });\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 if (\n blossomMember !== undefined &&\n this.blossomTransport !== undefined &&\n this.identity !== undefined\n ) {\n if (attachment.size > LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES) {\n throw new Error('Blossom file input exceeds the encrypted size cap.');\n }\n const bytes = await this.blossomTransport.fetchToBytes({\n transport: blossomMember,\n senderPubkey,\n maxBytes: LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES,\n signal: fetchAbort.signal,\n });\n return this.materializeBytesInput(bytes, attachment.mime);\n }\n\n throw new Error('Job carries a file input but no supported transport is available.');\n } finally {\n if (budgetTimer !== undefined) {\n clearTimeout(budgetTimer);\n }\n if (signal) {\n signal.removeEventListener('abort', onParentAbort);\n }\n }\n }\n\n /**\n * Turn fetched input bytes into a SkillInput: text within the re-inline ceiling becomes an\n * in-memory string; anything else is written to a fixed `input` name inside a unique mkdtemp dir\n * (the untrusted attachment `name` never touches the path). Shared by the iroh-text and blossom\n * paths (both have the bytes in hand); the iroh-binary path streams to disk separately.\n */\n private async materializeBytesInput(\n bytes: Uint8Array,\n mime: string,\n ): Promise<{ inlineText?: string; filePath?: string; cleanup: () => Promise<void> }> {\n if (mime.startsWith('text/') && bytes.byteLength <= LIMITS.MAX_REINLINE_TEXT_BYTES) {\n return { inlineText: Buffer.from(bytes).toString('utf8'), cleanup: async () => {} };\n }\n const dir = await mkdtemp(join(tmpdir(), 'elisym-job-'));\n const filePath = join(dir, 'input');\n try {\n await writeFile(filePath, bytes);\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 // A conclusively-abandoned customer (definitive on-chain \"no transaction\" + no\n // asserted signature) is a real failure - mark it failed as before. Otherwise the\n // payment may still confirm late (e.g. a lagging RPC), so throw a distinct error\n // that keeps the job `paid` for recovery to re-verify - `payment_request` was\n // already persisted above via the early `updatePayment`, so reVerifyPayment can run.\n if (customerAbandoned) {\n throw new Error('Payment timeout');\n }\n throw new PaymentTimeoutError();\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 attachments: FileAttachment[];\n try {\n attachments = await this.reShareResultAttachments(entry);\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(\n fakeJob,\n entry.result,\n entry.net_amount,\n attachments.length > 0 ? attachments : undefined,\n );\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 // Select the payload source exactly as the live handler does\n // (transport/nostr.ts): an encrypted job's decrypted envelope lives in\n // `content`, but an UNENCRYPTED job carries it in the `i` tag. Decoding\n // only from `content` would miss an unencrypted file job's attachment and\n // re-execute it with no input - producing a wrong result the customer paid for.\n const encrypted = rawEvent.tags?.some(\n (tag: string[]) => tag[0] === 'encrypted' && tag[1] === 'nip44',\n );\n const iTag = rawEvent.tags?.find((tag: string[]) => tag[0] === 'i');\n const rawInput = encrypted ? rawEvent.content : (iTag?.[1] ?? rawEvent.content);\n recoveryInputFile = await this.resolveInputFile(\n decodeJobPayload(rawInput).attachment,\n entry.customer_id,\n recoveryAbort.signal,\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 } catch (err) {\n // Mirror the primary executeJob path: a billing/invalid signal raised\n // during recovery must flip the (provider, model) pair to unhealthy.\n // Otherwise a key that expires while jobs are mid-recovery is never\n // detected - the preflight gate keeps admitting NEW jobs and customers\n // keep paying for a skill that will fail, and this loop's assertReady\n // gate keeps passing so retries burn for nothing. A budget abort matches\n // neither billing nor invalid signals, so this is a no-op for it.\n this.markHealthFromExecuteError(skill, err, log, entry.job_id);\n throw err;\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 { attachments: resultAttachments, deliveredContent } =\n await this.buildResultAttachment(\n entry.job_id,\n output,\n entry.customer_id,\n readAcceptedTransports(rawEvent.tags),\n );\n this.ledger.markExecuted(entry.job_id, deliveredContent);\n await this.transport.deliverResult(\n fakeJob,\n deliveredContent,\n entry.net_amount,\n resultAttachments.length > 0 ? resultAttachments : undefined,\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 * Local paths to MULTIPLE file results (a skill that wrote several files to\n * `ELISYM_OUTPUT_DIR`). Each is seeded + delivered as its own attachment;\n * `outputMime` applies to all. The runtime prefers `filePaths` over `filePath`.\n */\n filePaths?: string[];\n /**\n * Releases the resources backing `filePath`/`filePaths` (e.g. a temp dir). The\n * runtime calls it once it has seeded the file(s) - or failed to - since seeding\n * happens after `execute()` returns and the producer cannot release them 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 /**\n * Whether a file-input skill also accepts a text prompt (`input_text`,\n * dynamic-script only). Discovery hint published in the capability card.\n */\n inputText?: 'required' | 'optional' | 'none';\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 /** Whether the file skill also accepts a text prompt (dynamic-script only). */\n inputText?: 'required' | 'optional' | 'none';\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`/`inputText` are publish-time metadata only.\n inputMime?: string;\n inputText?: 'required' | 'optional' | 'none';\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.inputText = params.inputText;\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 inputText: parsed.inputText,\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 attachments?: 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 attachments,\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/mime.ts","../src/x402/errors.ts","../src/runtime.ts","../src/skill/index.ts","../src/skill/non-llm-skills.ts","../src/skill/script-skill.ts","../src/skill/x402-skill.ts","../src/skill/loader.ts","../src/transport/nostr.ts","../src/watchdog.ts","../src/x402/constants.ts","../src/x402/matcher.ts","../src/x402/probe.ts","../src/x402/store.ts","../src/x402/driver.ts","../src/commands/wallet.ts","../src/commands/x402-add.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","extname","calculateProtocolFee","SdkStaticFileSkill","SdkStaticScriptSkill","SdkDynamicScriptSkill","NATIVE_SOL","SdkScriptSkill","join","decodeJobPayload","USDC_SOLANA_DEVNET","readFile","writeFile","rm","createSolanaRpc","formatAssetAmount","address","signerFromSecretKeyBase58","getProtocolConfig","getProtocolProgramId","RELAYS","basename","jobRequestKind","toDTag","dirname","listAgents","cmdInit","loadAgent","isEncrypted","formatSol","existsSync","YAML","readdirSync","statSync","parseSkillMd","writeYaml","LIMITS","validateSkillFrontmatter","mkdir","ensureGitignoreHasX402Entries","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 status: response.status,\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 status: response.status,\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 status: response.status,\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 { cmdX402Add, type X402AddOptions } from './commands/x402-add.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\n// x402 bridge\nconst x402 = program\n .command('x402')\n .description('Bridge x402-paid HTTP services into elisym skills');\nx402\n .command('add <url> [agent]')\n .description('Generate a bridge skill from a live x402 endpoint (probes its 402 challenge)')\n .option('--method <method>', 'HTTP method for the upstream call: GET or POST (default POST)')\n .option(\n '--query-param <name>',\n 'GET only: query parameter carrying the buyer input (omitting it on GET makes a no-input skill)',\n )\n .option(\n '--margin-bps <bps>',\n 'Operator margin over the upstream quote in basis points (default 1000 = 10%)',\n )\n .option('--name <skill-name>', 'Override the generated skill name (also the discovery d-tag)')\n .option(\n '--generate-wallet',\n 'Non-interactive runs only: generate a new Solana wallet key when the agent has none',\n )\n .option('--yes', 'Skip confirmation prompts (requires an explicit agent argument)')\n .action(\n safe(async (url: string, agent: string | undefined, options: X402AddOptions) => {\n await cmdX402Add(url, agent, options);\n }),\n );\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 /**\n * Result descriptors for a MULTI-file job (each a serialized FileAttachment).\n * Supersedes `result_attachment`; recovery prefers this and falls back to the\n * single field for jobs recorded before multi-file support.\n */\n result_attachments?: 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(\n jobId: string,\n fields: { resultAttachment?: string; resultAttachments?: string[] },\n ): 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 if (fields.resultAttachments !== undefined) {\n entry.result_attachments = fields.resultAttachments;\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 type BlossomService,\n createBlossomTransport,\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 getProtocolConfig,\n getProtocolProgramId,\n jobRequestKind,\n signerFromSecretKeyBase58,\n toDTag,\n type CapabilityCard,\n} from '@elisym/sdk';\nimport {\n agentPaths,\n ensureGitignoreHasIrohEntry,\n ensureGitignoreHasX402Entries,\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 { mimeFromPath } from '../mime.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';\nimport { X402Driver } from '../x402/driver.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 // `@solana/kit` transport errors routinely interpolate the request URL, which\n // can carry a Helius/Alchemy/QuickNode API key - scrub before it hits the banner.\n const message = typeof e?.message === 'string' ? e.message : String(e);\n console.warn(` ! Wallet error: ${redactRpcUrlsInText(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 // ELISYM_PASSPHRASE decrypts `.secrets.json` (Nostr + Solana secret keys) at rest.\n // A skill script - which may be third-party SKILL.md installed under the agent dir -\n // has no legitimate use for it, and leaking it would let the script read the on-disk\n // secrets and defeat the AES-256-GCM + scrypt at-rest encryption entirely. The\n // per-provider LLM keys added below ARE intentional (scripts proxy to LLMs); the\n // passphrase is not. (The LLM-tool subprocess path already strips secrets via\n // scriptSkill's SECRET_ENV_VARS; this closes the same gap on the script path.)\n delete scriptEnv.ELISYM_PASSPHRASE;\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 // `provider::model` keys whose model returned HTTP 404 at deep-verify (the\n // provider retired it). Skills bound to these are not advertised (Step 11) so\n // the gateway keeps serving its other models instead of offering a capability\n // that can never be fulfilled.\n const retiredModels = new Set<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 // A retired model (HTTP 404) is permanent and per-model. Do NOT seed it:\n // its skills are not advertised below, and seeding would only add a\n // misleading \"temporarily unavailable\" gate for any stale-card job.\n const modelRetired =\n !verification.ok && verification.reason === 'unavailable' && verification.status === 404;\n if (!modelRetired) {\n healthMonitor.seed(pair.provider, pair.model, verification);\n }\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 if (verification.status === 404) {\n console.log('retired');\n console.error(\n ` ! ${pair.provider} model \"${pair.model}\" no longer exists (HTTP 404). ` +\n `Update its model: in the SKILL.md / elisym.yaml. Skills using it will not be advertised.\\n`,\n );\n retiredModels.add(`${pair.provider}::${pair.model}`);\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 7b: x402 bridge wiring (mode 'x402' skills) --\n // Startup check of the single-wallet invariant: revenue lands at\n // payments[].address, the upstream payer spends from solana_secret_key -\n // the float is self-refilling ONLY when they are the same wallet.\n // `elisym profile` can rewrite payments[] after `x402 add`, so a broken\n // invariant must surface loudly HERE, not one refused job at a time.\n const x402Skills = allSkills.filter((skill) => skill.mode === 'x402');\n let x402InvariantBroken: string | undefined;\n if (x402Skills.length > 0) {\n const solanaSecretKey = loaded.secrets.solana_secret_key;\n if (solanaSecretKey === undefined || solanaSecretKey.length === 0) {\n x402InvariantBroken = 'no solana_secret_key in .secrets.json';\n } else if (!solanaAddress) {\n x402InvariantBroken = 'no payments[] entry in elisym.yaml';\n } else {\n const bridgeSigner = await signerFromSecretKeyBase58(solanaSecretKey);\n if (bridgeSigner.address !== solanaAddress) {\n x402InvariantBroken = `payments[].address (${solanaAddress}) differs from the solana_secret_key address (${bridgeSigner.address})`;\n }\n }\n for (const skill of x402Skills) {\n if (skill.asset.mint !== USDC_SOLANA_DEVNET.mint) {\n console.warn(\n ` ! x402 skill \"${skill.name}\" is priced in ${skill.asset.symbol}, not devnet USDC - every job will be refused at preflight. Re-run \\`npx @elisym/cli x402 add\\`.`,\n );\n }\n }\n if (x402InvariantBroken !== undefined) {\n console.warn(` ! x402 wallet invariant broken: ${x402InvariantBroken}.`);\n console.warn(\n ' ! x402 skills will NOT be advertised and their jobs will be refused before payment.',\n );\n console.warn(' ! Fix: re-run `npx @elisym/cli x402 add` or align elisym.yaml with the key.');\n }\n const x402RpcUrl = getRpcUrl(walletNetwork);\n async function fetchLiveFeeBps(): Promise<number> {\n const config = await getProtocolConfig(\n createSolanaRpc(x402RpcUrl),\n getProtocolProgramId('devnet'),\n { forceRefresh: true },\n );\n return config.feeBps;\n }\n skillCtx.x402Driver = new X402Driver({\n agentDir: loaded.dir,\n paymentsAddress: solanaAddress,\n solanaSecretKeyBase58: loaded.secrets.solana_secret_key,\n rpcUrl: x402RpcUrl,\n getFeeBps: fetchLiveFeeBps,\n log: (message) => console.log(` ${message}`),\n });\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 // Uploads go to the Blossom relay (client.blossom), which falls back to nostr.build on failure.\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 client.blossom,\n identity,\n (updated) => (mediaCacheDirty = mediaCacheDirty || updated),\n );\n const bannerUrl = await resolveMediaField(\n loaded.yaml.banner,\n loaded.dir,\n mediaCache,\n client.blossom,\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 client.blossom,\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\n // Fetch what is already on the relays once, up front. The result drives both\n // the unchanged-skip below (Step 10.5) and the orphan sweep (Step 10.6), so we\n // pay for a single querySync per start instead of re-publishing blind. A network\n // failure returns [] - we then re-publish everything (safe) and skip the sweep.\n async function fetchPublishedPolicies() {\n try {\n return await client.pool.querySync({\n kinds: [KIND_LONG_FORM_ARTICLE],\n authors: [identity.publicKey],\n '#t': [POLICY_T_TAG],\n });\n } catch {\n return [];\n }\n }\n const publishedPolicies = await fetchPublishedPolicies();\n\n // Latest event per d-tag (tombstones included), so the skip compares against\n // the true live version. A tombstone is the live \"deleted\" state - filtering\n // tombstones out here would let an older non-empty version shadow a newer\n // tombstone and wrongly skip re-publishing a re-added policy file.\n const latestPolicyByDTag = new Map<string, (typeof publishedPolicies)[number]>();\n for (const event of publishedPolicies) {\n const dTag = event.tags.find((tag) => tag[0] === 'd')?.[1];\n if (!dTag) {\n continue;\n }\n const prev = latestPolicyByDTag.get(dTag);\n if (!prev || event.created_at > prev.created_at) {\n latestPolicyByDTag.set(dTag, event);\n }\n }\n\n for (const policy of policies) {\n const onRelay = latestPolicyByDTag.get(`${POLICY_D_TAG_PREFIX}${policy.type}`);\n const relayVersion = onRelay?.tags.find((tag) => tag[0] === 'policy_version')?.[1];\n // `onRelay.content` excludes a tombstoned latest (empty content): a deleted\n // policy that is back on disk must be re-published, not skipped.\n if (\n onRelay &&\n onRelay.content &&\n relayVersion === policy.version &&\n onRelay.content === policy.content\n ) {\n console.log(` * Policy: ${policy.type}@${policy.version} (unchanged, skipped)`);\n continue;\n }\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 for (const event of publishedPolicies) {\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\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 // `noInput` covers an x402 GET bridge without a query param: it consumes\n // no buyer input, so the web app must hide its input box (`card.static`)\n // instead of silently dropping whatever the buyer typed.\n const isStatic =\n skill.mode === 'static-file' || skill.mode === 'static-script' || skill.noInput === true;\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` flags a file input;\n // `inputText` tells the web whether to also show its text box for that file job.\n ...(skill.inputMime ? { inputMime: skill.inputMime } : {}),\n ...(skill.inputText ? { inputText: skill.inputText } : {}),\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 function retiredModelKeyForSkill(skill: (typeof allSkills)[0]): string | undefined {\n if (skill.resolvedTriple) {\n return `${skill.resolvedTriple.provider}::${skill.resolvedTriple.model}`;\n }\n if (skill.llmOverride?.provider && skill.llmOverride?.model) {\n return `${skill.llmOverride.provider}::${skill.llmOverride.model}`;\n }\n return undefined;\n }\n\n let cardsPublished = 0;\n for (const skill of allSkills) {\n const modelKey = retiredModelKeyForSkill(skill);\n if (modelKey && retiredModels.has(modelKey)) {\n console.warn(` ! Not advertising \"${skill.name}\" - its model was retired (HTTP 404).`);\n logger.warn(\n { event: 'publish_skipped_retired', kind: 31990, skill: skill.name, model: modelKey },\n 'capability not advertised - model retired',\n );\n continue;\n }\n if (skill.mode === 'x402' && x402InvariantBroken !== undefined) {\n console.warn(` ! Not advertising \"${skill.name}\" - x402 wallet invariant broken.`);\n logger.warn(\n { event: 'publish_skipped_x402_invariant', kind: 31990, skill: skill.name },\n 'capability not advertised - x402 wallet invariant broken',\n );\n continue;\n }\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 if (x402Skills.length > 0) {\n // Same migration for the x402 idempotency cache (customer inputs/results\n // + upstream payment history) - `x402 add` also ensures this, but a\n // hand-written x402 skill must not leave the cache committable.\n await ensureGitignoreHasX402Entries(dirname(loaded.dir));\n }\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 // Encrypted Blossom transport for job file I/O (peer to iroh). Reuses the client's BlossomService\n // (so it shares the nostr.build fallback) and the provider identity for BUD-11 auth + NIP-44 wrap.\n const blossomTransport = createBlossomTransport({ blossom: client.blossom, identity });\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 identity,\n blossomTransport,\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/**\n * Redact any RPC URL embedded in free-form text (e.g. a thrown error message) by\n * routing every http(s) URL it contains through `stripRpcSecrets`. Used on error\n * messages that may interpolate the request URL (and thus an embedded API key)\n * while preserving the surrounding diagnostic text.\n */\nexport function redactRpcUrlsInText(text: string): string {\n return text.replace(/https?:\\/\\/[^\\s)'\"]+/g, (url) => stripRpcSecrets(url));\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 blossom: Pick<BlossomService, 'upload'>,\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, blossom, 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. */\nexport async function uploadOrReuse(\n cacheKey: string,\n absPath: string,\n cache: MediaCache,\n blossom: Pick<BlossomService, 'upload'>,\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], { type: mimeFromPath(absPath) });\n const descriptor = await blossom.upload(identity, blob);\n cache[cacheKey] = newCacheEntry(descriptor.url, sha256);\n onCacheUpdate();\n console.log(` Uploaded: ${descriptor.url}`);\n return descriptor.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 { extname } from 'node:path';\n\nconst MIME_BY_EXT: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.avif': 'image/avif',\n};\n\n/** Best-effort MIME for a file path's extension; used as the upload Content-Type. */\nexport function mimeFromPath(path: string): string {\n return MIME_BY_EXT[extname(path).toLowerCase()] ?? 'application/octet-stream';\n}\n","/**\n * Error taxonomy for the x402 bridge. The runtime keys its keep-paid /\n * mark-failed decision on these classes, so the split IS the money logic:\n *\n * - `X402PreflightError`: raised BEFORE the customer pays (wallet invariant,\n * quote/balance/margin/input checks). The job is refused with an error\n * feedback and never enters the ledger.\n * - `X402TransientError`: upstream hiccup after the customer paid (network\n * error, timeout, 5xx, 429). The driver first retries inline where doing\n * so is money-safe (nothing signed, or a definitively refused payment\n * whose budget slot was refunded); once inline retries are spent, the\n * runtime keeps the job `paid` so the recovery loop retries it\n * (idempotency cache + paid-attempt/signature budgets bound the money).\n * - `X402PermanentError`: no retry will help (upstream 4xx, payment-policy\n * rejection after a reprice, invalid/oversized response, exhausted paid\n * attempt budget). The job fails; the documented operator risk applies.\n */\n\nexport class X402PreflightError extends Error {\n /**\n * Optional customer-facing text. Preflight reasons split in two: input\n * problems the CUSTOMER can act on (too large for a GET upstream) vs\n * operator problems (empty float, negative margin) that must stay generic\n * to avoid leaking billing state.\n */\n readonly customerMessage?: string;\n\n constructor(message: string, customerMessage?: string) {\n super(message);\n this.name = 'X402PreflightError';\n this.customerMessage = customerMessage;\n }\n}\n\nexport class X402TransientError extends Error {\n /**\n * Final upstream HTTP status when the failure was a definitive response\n * (402 refusal, 429, 5xx); absent for network-level failures. The driver\n * keys the refund-and-retry decision on `402` here.\n */\n readonly upstreamStatus?: number;\n\n constructor(message: string, upstreamStatus?: number) {\n super(message);\n this.name = 'X402TransientError';\n this.upstreamStatus = upstreamStatus;\n }\n}\n\nexport class X402PermanentError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'X402PermanentError';\n }\n}\n","import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { basename, extname, 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 readAcceptedTransports,\n utf8ByteLength,\n} from '@elisym/sdk';\nimport type {\n Asset,\n BlossomBlobTransport,\n ElisymIdentity,\n FileAttachment,\n FileTransport,\n ProtocolConfigInput,\n SlidingWindowLimiter,\n TransportKind,\n} 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';\nimport { X402PreflightError, X402TransientError } from './x402/errors.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/**\n * Thrown when seeding the RESULT blob (iroh/blossom) fails or times out AFTER the\n * skill produced output. Kept distinct so the post-execute catch keeps the job\n * `paid` (not `failed`) - the recovery loop then re-delivers it on a freshly-reset\n * iroh node. The message is customer-safe (no internals); the real cause is logged.\n */\nclass SeedFailedError extends Error {\n constructor(cause?: unknown) {\n super('Result is ready - delivery is retrying and will arrive shortly.', { cause });\n this.name = 'SeedFailedError';\n }\n}\n\n/**\n * Thrown when on-chain payment verification times out but the customer was NOT\n * conclusively shown to have abandoned the job (the reference scan did not return\n * the definitive \"no matching transaction\" result, or the customer asserted a\n * signature we could not yet confirm). Kept distinct so `processJob` keeps the job\n * `paid` instead of marking it `failed`: a payment that confirms shortly after the\n * timeout (e.g. a lagging devnet RPC) is then picked up by recovery's reVerifyPayment\n * rather than being silently lost. A conclusively-abandoned job throws a plain Error\n * and is still marked failed.\n */\nclass PaymentTimeoutError extends Error {\n constructor() {\n super('Payment verification timed out; awaiting late confirmation.');\n this.name = 'PaymentTimeoutError';\n }\n}\n\n// A dynamic-script result is written to a temp file literally named `output` (no\n// extension), so the customer would download a bare `output` with no extension.\n// Derive a sensible extension from the declared output MIME; unknown MIME → none.\nconst MIME_EXTENSIONS: Record<string, string> = {\n 'image/png': '.png',\n 'image/jpeg': '.jpg',\n 'image/webp': '.webp',\n 'image/gif': '.gif',\n 'image/svg+xml': '.svg',\n 'application/pdf': '.pdf',\n 'text/plain': '.txt',\n 'text/markdown': '.md',\n 'application/json': '.json',\n 'audio/mpeg': '.mp3',\n 'audio/wav': '.wav',\n 'video/mp4': '.mp4',\n 'video/webm': '.webm',\n 'application/zip': '.zip',\n};\n\nfunction extensionForMime(mime: string | undefined): string {\n return mime ? (MIME_EXTENSIONS[mime] ?? '') : '';\n}\n\n// Seeding is local (hash + store-copy + ticket mint); anything slower than this is\n// worth an operator log line to pin a misbehaving native addon before it times out.\nconst SLOW_SEED_LOG_MS = 5_000;\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 (\n error instanceof AgentUnavailableError ||\n error instanceof ExecutionBudgetExceededError ||\n error instanceof SeedFailedError\n ) {\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 private identity?: ElisymIdentity,\n private blossomTransport?: BlossomBlobTransport,\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 // - `paid` + `SeedFailedError`: same - the skill produced output but the\n // result blob seed failed/timed out; keep `paid` so recovery re-delivers\n // on a freshly-reset iroh node rather than losing the paid job.\n // - `paid` + `PaymentTimeoutError`: payment verification timed out but the\n // customer was not conclusively shown to have abandoned; keep `paid` so\n // recovery re-verifies a late on-chain payment instead of losing it.\n // - `paid` + `X402TransientError`: the x402 upstream hiccuped (network,\n // timeout, 5xx, 429) AFTER the customer paid; keep `paid` so recovery\n // retries. The driver's idempotency cache + paid-attempt budget bound\n // the money, so retries are safe.\n // - `paid` + budget abort on an x402 skill: the bought result may already\n // sit in the idempotency cache; cache-first recovery delivers it\n // without paying the upstream again. Recovery's retry cap + 24h cutoff\n // bound the loop.\n // - everything else: markFailed as before.\n const currentStatus = this.ledger.getStatus(job.jobId);\n const keepPaidForRecovery =\n (e instanceof AgentUnavailableError ||\n e instanceof SeedFailedError ||\n e instanceof PaymentTimeoutError ||\n e instanceof X402TransientError ||\n (e instanceof ExecutionBudgetExceededError &&\n this.skills.route(job.tags)?.mode === 'x402')) &&\n currentStatus === 'paid';\n if (currentStatus !== 'executed' && !keepPaidForRecovery) {\n this.ledger.markFailed(job.jobId);\n }\n if (keepPaidForRecovery) {\n log(`[${job.jobId.slice(0, 8)}] Keeping status=paid; recovery will retry (24h cutoff).`);\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 // ── x402 pre-payment rules ──\n // (a) Attachment rule: spilled >60KB text and real files both arrive as\n // attachments with an EMPTY inline input, invisible to the preflight\n // below. POST bridges accept a text/* attachment up to the skill's input\n // cap (the runtime transparently re-inlines it after payment); anything\n // else - and any attachment on a GET bridge - is refused BEFORE payment.\n // Declared mime/size are envelope fields, readable without fetching the\n // bytes; a lying descriptor is caught again in the executor (filePath\n // guard + actual-size re-check) before any upstream payment.\n if (matched?.mode === 'x402' && job.attachment !== undefined) {\n const method = matched.x402?.method ?? 'POST';\n const maxInputBytes = matched.x402?.maxInputBytes ?? 0;\n const attachmentOk =\n method === 'POST' &&\n job.attachment.mime.startsWith('text/') &&\n job.attachment.size <= maxInputBytes;\n if (!attachmentOk) {\n log(\n `[${job.jobId.slice(0, 8)}] Rejecting attachment on x402 skill (mime=${job.attachment.mime}, size=${job.attachment.size})`,\n );\n await this.transport\n .sendFeedback(job, {\n type: 'error',\n message:\n 'This skill accepts inline text input only (or a text attachment within its size limit).',\n })\n .catch(() => {});\n return;\n }\n }\n\n // (b) Generic pre-payment preflight (x402: wallet invariant, live quote\n // vs ceiling, float balance, live margin, input-size rules). Refuses the\n // job BEFORE recordPaid/payment collection; `input` here is the\n // pre-payment view - inline text only, file inputs are fetched after\n // payment. Customer-facing text stays generic unless the error marks a\n // customer-actionable reason (e.g. input too large).\n if (matched?.preflight) {\n try {\n await matched.preflight(\n { data: job.input, inputType: job.inputType, tags: job.tags, jobId: job.jobId },\n this.skillCtx,\n );\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n log(`[${job.jobId.slice(0, 8)}] Preflight refused job: ${detail}`);\n const customerMessage =\n err instanceof X402PreflightError && err.customerMessage !== undefined\n ? err.customerMessage\n : AGENT_UNAVAILABLE_MESSAGE;\n await this.transport\n .sendFeedback(job, { type: 'error', message: customerMessage })\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, job.customerId, signal);\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 { attachments, deliveredContent } = await this.buildResultAttachment(\n job.jobId,\n output,\n job.customerId,\n readAcceptedTransports(job.rawEvent.tags),\n );\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 attachments.length > 0 ? attachments : undefined,\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 * Seed a result blob through iroh, timing it and converting any failure (incl. the\n * transport's seed timeout, which also resets the wedged node) into a\n * `SeedFailedError` so the post-execute catch keeps the job `paid` for recovery\n * rather than losing the customer's paid job.\n */\n private async seedGuarded(\n jobId: string,\n kind: string,\n run: () => Promise<{ ticket: string; size: number }>,\n ): Promise<{ ticket: string; size: number }> {\n const log = this.callbacks.onLog ?? console.log;\n const started = Date.now();\n try {\n const seeded = await run();\n const elapsed = Date.now() - started;\n if (elapsed > SLOW_SEED_LOG_MS) {\n log(`[${jobId.slice(0, 8)}] iroh seed (${kind}) slow: ${elapsed}ms`);\n }\n return seeded;\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n log(\n `[${jobId.slice(0, 8)}] iroh seed (${kind}) failed after ${Date.now() - started}ms: ${detail}`,\n );\n throw new SeedFailedError(error);\n }\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 customerPubkey: string,\n acceptedTransports: TransportKind[] | undefined,\n ): Promise<{ attachments: FileAttachment[]; deliveredContent: string }> {\n // Seed the (encrypted-Blossom) member only when the customer didn't advertise, or advertised\n // blossom. iroh is always seeded. So advertising ['iroh'] (MCP) skips the Blossom upload.\n const wantBlossom = acceptedTransports === undefined || acceptedTransports.includes('blossom');\n // One OR many file results: a skill that wrote several files to ELISYM_OUTPUT_DIR\n // yields `filePaths`; a single ELISYM_OUTPUT_FILE yields `filePath`. Treat both as a list.\n const filePaths = output.filePaths ?? (output.filePath !== undefined ? [output.filePath] : []);\n if (filePaths.length > 0) {\n // seedPath copies the bytes into the persistent iroh store, so the producer's\n // temp dir is no longer needed once seeding has been attempted (recovery\n // re-shares from the store, never the temp dir). Release it whether seeding\n // succeeds or throws (a SeedFailedError keeps the job `paid` for recovery, which\n // re-executes into a fresh temp dir) so a failure doesn't leave it behind.\n try {\n const attachments: FileAttachment[] = [];\n for (const filePath of filePaths) {\n attachments.push(\n await this.seedFileToAttachment(\n jobId,\n filePath,\n output.outputMime,\n customerPubkey,\n wantBlossom,\n ),\n );\n }\n // A file result's `output.data` is normally a small note delivered inline\n // alongside the tickets. But a skill can emit a LARGE note next to its file(s)\n // (e.g. a long summary + a generated PDF); spill it the same way the large-text\n // branch does so it never overflows the NIP-44 inline cap, which would otherwise\n // throw at encryption time and fail the whole paid job.\n let deliveredContent = output.data;\n if (utf8ByteLength(output.data) > LIMITS.MAX_ENCRYPTED_INLINE_BYTES) {\n attachments.push(\n await this.spillTextAttachment(jobId, output.data, customerPubkey, wantBlossom),\n );\n deliveredContent = '';\n }\n this.ledger.recordAttachment(jobId, {\n resultAttachments: attachments.map((a) => JSON.stringify(a)),\n });\n return { attachments, deliveredContent };\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 const attachment = await this.spillTextAttachment(\n jobId,\n output.data,\n customerPubkey,\n wantBlossom,\n );\n this.ledger.recordAttachment(jobId, { resultAttachments: [JSON.stringify(attachment)] });\n return { attachments: [attachment], deliveredContent: '' };\n }\n\n return { attachments: [], deliveredContent: output.data };\n }\n\n /**\n * Seed a text note too large for inline delivery to iroh (+ encrypted Blossom when\n * wanted) and return it as a `result.txt` FileAttachment. Shared by the large-text\n * result path and the file-result path (a file result may carry an oversized note).\n */\n private async spillTextAttachment(\n jobId: string,\n text: string,\n customerPubkey: string,\n wantBlossom: boolean,\n ): Promise<FileAttachment> {\n if (!this.irohTransport) {\n throw new Error('Result is too large to deliver inline and iroh transport is unavailable.');\n }\n const iroh = this.irohTransport;\n const dataBytes = Buffer.from(text, 'utf8');\n const seeded = await this.seedGuarded(jobId, 'large-text', () => iroh.seedBytes(dataBytes));\n const transports: FileTransport[] = [{ kind: 'iroh', ticket: seeded.ticket }];\n if (wantBlossom) {\n const blossomMember = await this.seedBlossomMember(dataBytes, customerPubkey);\n if (blossomMember !== undefined) {\n transports.unshift(blossomMember);\n }\n }\n return { name: 'result.txt', size: seeded.size, mime: 'text/plain', transports };\n }\n\n /**\n * Seed ONE result file to iroh (+ encrypted Blossom when wanted) and build its\n * FileAttachment. A seed timeout throws SeedFailedError (job stays `paid` for\n * recovery). Shared by the single- and multi-file result paths.\n */\n private async seedFileToAttachment(\n jobId: string,\n filePath: string,\n outputMime: string | undefined,\n customerPubkey: string,\n wantBlossom: boolean,\n ): Promise<FileAttachment> {\n if (!this.irohTransport) {\n throw new Error('Skill produced a file result but iroh transport is unavailable.');\n }\n const iroh = this.irohTransport;\n const seeded = await this.seedGuarded(jobId, 'file', () => iroh.seedPath(filePath));\n // iroh is always present (the robust fallback); blossom is added (preferred, first) when\n // available + within the per-file encrypted-size cap, so web customers can fetch over HTTP.\n const transports: FileTransport[] = [{ kind: 'iroh', ticket: seeded.ticket }];\n if (wantBlossom) {\n const blossomMember = await this.seedBlossomFromPath(filePath, seeded.size, customerPubkey);\n if (blossomMember !== undefined) {\n transports.unshift(blossomMember);\n }\n }\n // The single-file producer's temp file is literally `output` (no extension); give\n // it one from the declared MIME. A producer-chosen name with an extension is kept.\n const producedName = basename(filePath);\n const name = extname(producedName)\n ? producedName\n : `${producedName}${extensionForMime(outputMime)}`;\n return { name, size: seeded.size, mime: outputMime ?? 'application/octet-stream', transports };\n }\n\n /**\n * Encrypt `bytes` to `recipientPubkey` and seed them to Blossom, returning a `blossom` transport\n * member - or `undefined` when blossom isn't configured, the bytes exceed the encrypted cap, or the\n * upload fails. Returning undefined (never throwing) keeps iroh as the guaranteed transport: an\n * optional second path must never fail the job.\n */\n private async seedBlossomMember(\n bytes: Uint8Array,\n recipientPubkey: string,\n ): Promise<Extract<FileTransport, { kind: 'blossom' }> | undefined> {\n if (this.blossomTransport === undefined || this.identity === undefined) {\n return undefined;\n }\n if (bytes.byteLength > LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES) {\n return undefined;\n }\n try {\n return await this.blossomTransport.seedBytes({ bytes, recipientPubkey });\n } catch {\n // Blossom (incl. the nostr.build-fallback refusal) failed - deliver iroh-only this time.\n return undefined;\n }\n }\n\n /** Read a file (only when within the encrypted cap, to bound memory) and seed it to Blossom. */\n private async seedBlossomFromPath(\n filePath: string,\n size: number,\n recipientPubkey: string,\n ): Promise<Extract<FileTransport, { kind: 'blossom' }> | undefined> {\n if (this.blossomTransport === undefined || this.identity === undefined) {\n return undefined;\n }\n if (size > LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES) {\n return undefined;\n }\n try {\n const bytes = await readFile(filePath);\n return await this.seedBlossomMember(bytes, recipientPubkey);\n } catch {\n return undefined;\n }\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(\n (transport): transport is Extract<FileTransport, { kind: 'iroh' }> =>\n transport.kind === 'iroh',\n );\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 // Preserve every non-iroh transport (e.g. blossom: its url/sha256/enc stay valid across a\n // restart - the blob lives on the relay, not a per-session ticket); refresh only the iroh ticket.\n const transports = stored.transports.map((transport) =>\n transport.kind === 'iroh' ? { kind: 'iroh' as const, ticket: freshTicket } : transport,\n );\n return { ...stored, transports };\n }\n\n /**\n * Re-share ALL of a recovered job's result attachments (multi-file aware). Prefers\n * the `result_attachments` array; falls back to the legacy single `result_attachment`.\n * A failure on ANY attachment throws (the caller marks the whole job failed - a\n * partial multi-file delivery is not a valid paid result).\n */\n private async reShareResultAttachments(entry: {\n result_attachments?: string[];\n result_attachment?: string;\n }): Promise<FileAttachment[]> {\n const stored =\n entry.result_attachments ??\n (entry.result_attachment !== undefined ? [entry.result_attachment] : []);\n const out: FileAttachment[] = [];\n for (const serialized of stored) {\n const attachment = await this.reShareResultAttachment(serialized);\n if (attachment !== undefined) {\n out.push(attachment);\n }\n }\n return out;\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 senderPubkey: string,\n signal?: AbortSignal,\n ): Promise<{ inlineText?: string; filePath?: string; cleanup: () => Promise<void> } | undefined> {\n if (attachment === undefined) {\n return undefined;\n }\n // Bound the post-payment input fetch so a slow/non-responsive customer ticket or URL\n // can't hold a p-limit job slot. ONE controller drives the abort: it fires when the job\n // is aborted (stop()/shutdown via `signal`) OR the operator's execution budget elapses.\n // It is threaded into both transports - the blossom HTTP fetch aborts for real; the iroh\n // fetch abandons its JS wait (the napi binding can't cancel a native transfer mid-flight,\n // so the native download self-terminates in the background, like the timeout path).\n const fetchTimeoutMs =\n this.config.executionTimeoutSecs && this.config.executionTimeoutSecs > 0\n ? this.config.executionTimeoutSecs * 1000\n : undefined;\n const fetchAbort = new AbortController();\n const onParentAbort = (): void => fetchAbort.abort();\n if (signal) {\n if (signal.aborted) {\n fetchAbort.abort();\n } else {\n signal.addEventListener('abort', onParentAbort);\n }\n }\n const budgetTimer =\n fetchTimeoutMs !== undefined\n ? setTimeout(() => fetchAbort.abort(), fetchTimeoutMs)\n : undefined;\n\n try {\n const irohMember = attachment.transports.find(\n (t): t is Extract<FileTransport, { kind: 'iroh' }> => t.kind === 'iroh',\n );\n const blossomMember = attachment.transports.find(\n (t): t is Extract<FileTransport, { kind: 'blossom' }> => t.kind === 'blossom',\n );\n\n // Prefer iroh when available: it streams to disk with no in-memory cap. Fall back to the\n // encrypted blossom transport for web-submitted inputs that only carry a blossom member.\n if (irohMember !== undefined && this.irohTransport !== undefined) {\n if (\n attachment.mime.startsWith('text/') &&\n attachment.size <= LIMITS.MAX_REINLINE_TEXT_BYTES\n ) {\n const bytes = await this.irohTransport.fetchToBytes(irohMember.ticket, {\n maxBytes: LIMITS.MAX_REINLINE_TEXT_BYTES,\n timeoutMs: fetchTimeoutMs,\n signal: fetchAbort.signal,\n });\n return this.materializeBytesInput(bytes, attachment.mime);\n }\n const dir = await mkdtemp(join(tmpdir(), 'elisym-job-'));\n const filePath = join(dir, 'input');\n try {\n await this.irohTransport.fetchToPath(irohMember.ticket, filePath, {\n timeoutMs: fetchTimeoutMs,\n signal: fetchAbort.signal,\n });\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 if (\n blossomMember !== undefined &&\n this.blossomTransport !== undefined &&\n this.identity !== undefined\n ) {\n if (attachment.size > LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES) {\n throw new Error('Blossom file input exceeds the encrypted size cap.');\n }\n const bytes = await this.blossomTransport.fetchToBytes({\n transport: blossomMember,\n senderPubkey,\n maxBytes: LIMITS.MAX_BLOSSOM_ENCRYPTED_BYTES,\n signal: fetchAbort.signal,\n });\n return this.materializeBytesInput(bytes, attachment.mime);\n }\n\n throw new Error('Job carries a file input but no supported transport is available.');\n } finally {\n if (budgetTimer !== undefined) {\n clearTimeout(budgetTimer);\n }\n if (signal) {\n signal.removeEventListener('abort', onParentAbort);\n }\n }\n }\n\n /**\n * Turn fetched input bytes into a SkillInput: text within the re-inline ceiling becomes an\n * in-memory string; anything else is written to a fixed `input` name inside a unique mkdtemp dir\n * (the untrusted attachment `name` never touches the path). Shared by the iroh-text and blossom\n * paths (both have the bytes in hand); the iroh-binary path streams to disk separately.\n */\n private async materializeBytesInput(\n bytes: Uint8Array,\n mime: string,\n ): Promise<{ inlineText?: string; filePath?: string; cleanup: () => Promise<void> }> {\n if (mime.startsWith('text/') && bytes.byteLength <= LIMITS.MAX_REINLINE_TEXT_BYTES) {\n return { inlineText: Buffer.from(bytes).toString('utf8'), cleanup: async () => {} };\n }\n const dir = await mkdtemp(join(tmpdir(), 'elisym-job-'));\n const filePath = join(dir, 'input');\n try {\n await writeFile(filePath, bytes);\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 // A conclusively-abandoned customer (definitive on-chain \"no transaction\" + no\n // asserted signature) is a real failure - mark it failed as before. Otherwise the\n // payment may still confirm late (e.g. a lagging RPC), so throw a distinct error\n // that keeps the job `paid` for recovery to re-verify - `payment_request` was\n // already persisted above via the early `updatePayment`, so reVerifyPayment can run.\n if (customerAbandoned) {\n throw new Error('Payment timeout');\n }\n throw new PaymentTimeoutError();\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 attachments: FileAttachment[];\n try {\n attachments = await this.reShareResultAttachments(entry);\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(\n fakeJob,\n entry.result,\n entry.net_amount,\n attachments.length > 0 ? attachments : undefined,\n );\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 // Skill preflight gate, same retry-free semantics as the health gate\n // above: skip THIS tick without burning a retry slot. For x402 this\n // is what lets an empty float WAIT for a top-up (within the 24h\n // cutoff) instead of failing an already-paid job in 5 quick retries.\n // Cache-first ordering lives inside the driver's preflight: a bought\n // result already in the idempotency cache passes trivially and is\n // then delivered by execute() without a live quote or float.\n if (skill.preflight) {\n try {\n await skill.preflight(\n {\n data: entry.input,\n inputType: entry.input_type,\n tags: entry.tags,\n jobId: entry.job_id,\n },\n this.skillCtx,\n );\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n log(\n `[${entry.job_id.slice(0, 8)}] Recovery: preflight refused (${detail}); waiting for next tick.`,\n );\n return;\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 // Select the payload source exactly as the live handler does\n // (transport/nostr.ts): an encrypted job's decrypted envelope lives in\n // `content`, but an UNENCRYPTED job carries it in the `i` tag. Decoding\n // only from `content` would miss an unencrypted file job's attachment and\n // re-execute it with no input - producing a wrong result the customer paid for.\n const encrypted = rawEvent.tags?.some(\n (tag: string[]) => tag[0] === 'encrypted' && tag[1] === 'nip44',\n );\n const iTag = rawEvent.tags?.find((tag: string[]) => tag[0] === 'i');\n const rawInput = encrypted ? rawEvent.content : (iTag?.[1] ?? rawEvent.content);\n recoveryInputFile = await this.resolveInputFile(\n decodeJobPayload(rawInput).attachment,\n entry.customer_id,\n recoveryAbort.signal,\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 } catch (err) {\n // Mirror the primary executeJob path: a billing/invalid signal raised\n // during recovery must flip the (provider, model) pair to unhealthy.\n // Otherwise a key that expires while jobs are mid-recovery is never\n // detected - the preflight gate keeps admitting NEW jobs and customers\n // keep paying for a skill that will fail, and this loop's assertReady\n // gate keeps passing so retries burn for nothing. A budget abort matches\n // neither billing nor invalid signals, so this is a no-op for it.\n this.markHealthFromExecuteError(skill, err, log, entry.job_id);\n throw err;\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 { attachments: resultAttachments, deliveredContent } =\n await this.buildResultAttachment(\n entry.job_id,\n output,\n entry.customer_id,\n readAcceptedTransports(rawEvent.tags),\n );\n this.ledger.markExecuted(entry.job_id, deliveredContent);\n await this.transport.deliverResult(\n fakeJob,\n deliveredContent,\n entry.net_amount,\n resultAttachments.length > 0 ? resultAttachments : undefined,\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, X402SkillParams } from '@elisym/sdk/skills';\n\nexport type { SkillLlmOverride, SkillMode, SkillRateLimit, X402SkillParams };\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 * Local paths to MULTIPLE file results (a skill that wrote several files to\n * `ELISYM_OUTPUT_DIR`). Each is seeded + delivered as its own attachment;\n * `outputMime` applies to all. The runtime prefers `filePaths` over `filePath`.\n */\n filePaths?: string[];\n /**\n * Releases the resources backing `filePath`/`filePaths` (e.g. a temp dir). The\n * runtime calls it once it has seeded the file(s) - or failed to - since seeding\n * happens after `execute()` returns and the producer cannot release them 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 /**\n * x402 protocol driver for `mode: 'x402'` skills. Wired by `start.ts`\n * when at least one x402 skill loads (implementation: `src/x402/driver.ts`).\n * Named `x402Driver` (not `x402`) so the CLI context stays structurally\n * assignable to the SDK's `SkillContext`, whose `x402` slot has a\n * different (SDK-side) driver shape.\n */\n x402Driver?: X402JobDriver;\n agentName: string;\n agentDescription: string;\n signal?: AbortSignal;\n}\n\n/** What the x402 driver needs to know about the skill behind a job. */\nexport interface X402SkillJob {\n skillName: string;\n params: X402SkillParams;\n /** elisym-side price in subunits of `asset` (the customer-facing price). */\n priceSubunits: number;\n asset: Asset;\n}\n\n/**\n * The x402 protocol driver contract. All money-touching logic lives behind\n * it: payment signing with requirement policies, the pre-payment preflight,\n * the idempotency cache and error classification. Kept as an interface here\n * so the skill layer stays import-cycle-free from `src/x402/`.\n */\nexport interface X402JobDriver {\n /**\n * Pre-payment gate: wallet invariant, live 402 quote vs ceiling, float\n * balance, live margin, input-size rules. Throws (`X402PreflightError`)\n * to refuse the job BEFORE the customer pays. A cached completed result\n * short-circuits to success - delivery needs neither float nor upstream.\n */\n preflight(job: X402SkillJob, input: SkillInput): Promise<void>;\n /** Paid upstream call, or the cached result for this jobId. */\n execute(\n job: X402SkillJob,\n input: SkillInput,\n signal?: AbortSignal,\n ): Promise<{ data: string; outputMime?: string; filePath?: string }>;\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 /**\n * Whether a file-input skill also accepts a text prompt (`input_text`,\n * dynamic-script only). Discovery hint published in the capability card.\n */\n inputText?: 'required' | 'optional' | 'none';\n /** Parsed `x402_*` frontmatter (mode 'x402' only). Read by the runtime's pre-payment input rules. */\n x402?: X402SkillParams;\n /**\n * True when the skill consumes no buyer input (x402 GET without a query\n * param). `buildCard` marks the discovery card `static` so clients hide\n * the input box instead of silently dropping what the buyer typed.\n */\n noInput?: boolean;\n /**\n * Optional pre-payment gate. The runtime calls it BEFORE `recordPaid` /\n * payment collection (and in the recovery path BEFORE a retry slot is\n * consumed); throwing refuses/defers the job without touching customer\n * funds. `input.filePath` is never set here - file inputs are fetched\n * only after payment.\n */\n preflight?(input: SkillInput, ctx: SkillContext): Promise<void>;\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 /** Whether the file skill also accepts a text prompt (dynamic-script only). */\n inputText?: 'required' | 'optional' | 'none';\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`/`inputText` are publish-time metadata only.\n inputMime?: string;\n inputText?: 'required' | 'optional' | 'none';\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.inputText = params.inputText;\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 wrapper for `mode: 'x402'` skills. Thin by design: the whole protocol\n * (payment signing, policies, idempotency, error classification) lives in\n * the runtime-injected `SkillContext.x402` driver, mirroring how LLM skills\n * delegate to `ctx.getLlm`.\n */\nimport type { Asset } from '@elisym/sdk';\nimport type {\n Skill,\n SkillContext,\n SkillInput,\n SkillMode,\n SkillOutput,\n X402JobDriver,\n X402SkillJob,\n X402SkillParams,\n} from './index.js';\n\nexport interface X402SkillWrapperParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n x402: X402SkillParams;\n noInput: boolean;\n image?: string;\n imageFile?: string;\n dir?: string;\n}\n\nexport class X402Skill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: number;\n asset: Asset;\n mode: SkillMode = 'x402';\n x402: X402SkillParams;\n noInput: boolean;\n image?: string;\n imageFile?: string;\n dir?: string;\n\n constructor(params: X402SkillWrapperParams) {\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.x402 = params.x402;\n this.noInput = params.noInput;\n this.image = params.image;\n this.imageFile = params.imageFile;\n this.dir = params.dir;\n }\n\n private requireDriver(ctx: SkillContext): X402JobDriver {\n if (ctx.x402Driver === undefined) {\n throw new Error(\n `Skill \"${this.name}\": x402 driver not wired into the skill context (internal error)`,\n );\n }\n return ctx.x402Driver;\n }\n\n private asJob(): X402SkillJob {\n return {\n skillName: this.name,\n params: this.x402,\n priceSubunits: this.priceSubunits,\n asset: this.asset,\n };\n }\n\n async preflight(input: SkillInput, ctx: SkillContext): Promise<void> {\n await this.requireDriver(ctx).preflight(this.asJob(), input);\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n const result = await this.requireDriver(ctx).execute(this.asJob(), input, ctx.signal);\n // No cleanup callback on purpose: a file result is the idempotency\n // cache's copy and the crash-recovery delivery source; the store's TTL\n // sweep owns deletion.\n return { data: result.data, outputMime: result.outputMime, filePath: result.filePath };\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 { X402Skill } from './x402-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 inputText: parsed.inputText,\n })\n : new StaticScriptSkill(scriptParams);\n break;\n }\n case 'x402': {\n if (parsed.x402 === undefined) {\n throw new Error(\n `SKILL.md \"${parsed.name}\": internal error - x402 config missing for mode 'x402'`,\n );\n }\n skill = new X402Skill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: Number(parsed.priceSubunits),\n asset: parsed.asset,\n x402: parsed.x402,\n noInput: parsed.noInput === true,\n image: parsed.image,\n imageFile: safeImageFile,\n dir: entryPath,\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 // The CLI runtime wires an x402 driver into the skill context, so\n // x402 skills are executable here (SDK-only hosts reject them).\n allowX402Skills: 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 attachments?: 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 attachments,\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","/** CAIP-2 id of Solana devnet (genesis-hash form) - the canonical x402 v2 network id. */\nexport const X402_SOLANA_DEVNET_CAIP2 = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\n\n/** x402 v1 alias for Solana devnet (pre-CAIP string networks). */\nexport const X402_SOLANA_DEVNET_V1 = 'solana-devnet';\n\n/**\n * Ceiling on a GET input AFTER percent-encoding (bytes). Query strings above\n * ~8KB are rejected by most servers with 414/400; enforcing well under that\n * BEFORE the customer pays turns a paid-then-failed job into a free refusal.\n */\nexport const X402_GET_INPUT_MAX_ENCODED_BYTES = 2_048;\n\n/** Cap on the buffered upstream response body. The upstream is untrusted. */\nexport const X402_MAX_RESPONSE_BYTES = 10 * 1024 * 1024;\n\n/**\n * Cap on a 402 challenge body during the payment handshake. The `@x402/fetch`\n * wrapper reads the initial 402 body uncapped to parse the requirements; a\n * hostile upstream could send a small 402 on probes but a giant one on the\n * paid call. A real challenge is a tiny JSON document, so 256 KiB is ample.\n */\nexport const X402_MAX_CHALLENGE_BYTES = 256 * 1024;\n\n/** TTL of the unpaid 402 probe cache shared across concurrent jobs. */\nexport const X402_PROBE_TTL_MS = 30_000;\n\n/**\n * Maximum DURABLE paid attempts per job (first + one retry). x402 is\n * pay-then-respond: a transient failure AFTER settlement means the money is\n * gone; this bounds the operator's steady-state worst case at 2x the\n * upstream price. A slot is refunded only when the upstream answers the\n * signed payment with a definitive 402 refusal (an honest upstream did not\n * settle - the money never moved); every other paid outcome (success, 5xx,\n * network error, crash) keeps its slot.\n */\nexport const X402_MAX_PAID_ATTEMPTS = 2;\n\n/**\n * Hard monotonic cap on SIGNED payments per job: every PAYMENT-SIGNATURE\n * request that leaves the process counts, and the count is never refunded.\n * Needed because the 402-refusal refund above trusts the upstream's status\n * code - a malicious upstream can settle the payment AND respond 402 to\n * farm refunds. This cap is the true adversarial money bound per job (each\n * signature is itself capped by `x402_max_upstream`), the price of\n * tolerating expired-blockhash 402s from slow verify->serve->settle\n * upstreams.\n */\nexport const X402_MAX_PAYMENT_SIGNATURES = 2 * X402_MAX_PAID_ATTEMPTS;\n\n/**\n * Inline retry backoff for MONEY-FREE transient failures (no payment left\n * the process in the failed attempt): network errors and 429/5xx on the\n * unpaid request. One entry per retry. Money-unknown transients (network\n * error or 5xx AFTER a payment went out) never retry inline - they stay\n * with the recovery loop.\n */\nexport const X402_FREE_RETRY_DELAYS_MS = [1_000, 3_000];\n\n/**\n * Inline retries after a refunded 402 payment refusal, taken immediately:\n * the dominant honest cause is a transaction blockhash that expired while a\n * slow upstream served before settling, and the fix is signing with a fresh\n * blockhash - waiting would only re-create the expiry.\n */\nexport const X402_REFUNDED_RETRIES = 1;\n\n/** Idempotency-cache retention; must exceed the 24h paid-job recovery cutoff. */\nexport const X402_CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;\n","/**\n * Single source of truth for \"is this upstream payment requirement one we\n * are willing to pay\". Used from BOTH enforcement points - the pre-payment\n * preflight probe and the `PaymentPolicy` applied inside the x402 client at\n * signing time - so the two can never drift apart.\n */\nimport { USDC_SOLANA_DEVNET } from '@elisym/sdk';\nimport type { PaymentPolicy, PaymentRequirements } from '@x402/fetch';\nimport { X402_SOLANA_DEVNET_CAIP2, X402_SOLANA_DEVNET_V1 } from './constants.js';\n\nexport interface RequirementRule {\n /** Ceiling on the upstream quote in USDC subunits (from `x402_max_upstream`). */\n maxUpstreamSubunits: bigint;\n}\n\n/**\n * Amount of a requirement across protocol versions: v2 uses `amount`, v1\n * uses `maxAmountRequired`. Returns null for anything that is not a plain\n * non-negative integer string - fail closed, never sign what we can't parse.\n */\nexport function requirementAmount(requirement: PaymentRequirements): bigint | null {\n const v1Amount = (requirement as { maxAmountRequired?: unknown }).maxAmountRequired;\n const raw = requirement.amount ?? v1Amount;\n if (typeof raw !== 'string' || !/^[0-9]+$/.test(raw)) {\n return null;\n }\n return BigInt(raw);\n}\n\nexport function isAcceptableRequirement(\n requirement: PaymentRequirements,\n rule: RequirementRule,\n): boolean {\n if (requirement.scheme !== 'exact') {\n return false;\n }\n const network = requirement.network as string;\n if (network !== X402_SOLANA_DEVNET_CAIP2 && network !== X402_SOLANA_DEVNET_V1) {\n return false;\n }\n if (USDC_SOLANA_DEVNET.mint === undefined || requirement.asset !== USDC_SOLANA_DEVNET.mint) {\n return false;\n }\n const amount = requirementAmount(requirement);\n if (amount === null) {\n return false;\n }\n return amount <= rule.maxUpstreamSubunits;\n}\n\nexport function selectAcceptableRequirement(\n accepts: PaymentRequirements[],\n rule: RequirementRule,\n): PaymentRequirements | undefined {\n return accepts.find((requirement) => isAcceptableRequirement(requirement, rule));\n}\n\n/**\n * The MAXIMUM amount among acceptable requirements (null if none). The client's\n * policy/selector at signing time may pick any acceptable requirement, not the\n * first one preflight looked at; checking margin and balance against the worst\n * acceptable quote guarantees the gate holds whichever one signing chooses.\n */\nexport function maxAcceptableQuote(\n accepts: PaymentRequirements[],\n rule: RequirementRule,\n): bigint | null {\n let worst: bigint | null = null;\n for (const requirement of accepts) {\n if (!isAcceptableRequirement(requirement, rule)) {\n continue;\n }\n const amount = requirementAmount(requirement);\n if (amount === null) {\n continue;\n }\n if (worst === null || amount > worst) {\n worst = amount;\n }\n }\n return worst;\n}\n\n/**\n * Payment policy enforced at signing time inside the x402 client. Filtering\n * everything out makes the client throw (\"All payment requirements were\n * filtered out...\") BEFORE any `PAYMENT-SIGNATURE` is created - this is what\n * closes the TOCTOU window between the preflight quote and the live call.\n */\nexport function buildRequirementsPolicy(rule: RequirementRule): PaymentPolicy {\n return function filterAcceptableRequirements(_x402Version, paymentRequirements) {\n return paymentRequirements.filter((requirement) => isAcceptableRequirement(requirement, rule));\n };\n}\n","/**\n * Unpaid 402 probe: request the upstream WITHOUT payment and parse the\n * advertised payment requirements. Used by `elisym x402 add` (skill\n * generation) and by the per-job preflight (live quote before the customer\n * pays). Supports both wire formats: the v2 base64 `PAYMENT-REQUIRED`\n * response header and the v1 JSON body.\n */\nimport { decodePaymentRequiredHeader } from '@x402/core/http';\nimport type { PaymentRequirements } from '@x402/fetch';\n\nconst PROBE_TIMEOUT_MS = 10_000;\n\n/**\n * Cap on the buffered v1 402 body. A legitimate v1 challenge is a small JSON\n * document (well under this); the cap stops a hostile or compromised upstream\n * from streaming a multi-gigabyte body into memory on the unpaid probe path\n * (the response-header path is already bounded by undici's header limit).\n */\nconst MAX_PROBE_BODY_BYTES = 256 * 1024;\n\n/** Number of distinct (method, url) probe results kept in the shared cache. */\nconst PROBE_CACHE_MAX_ENTRIES = 256;\n\n/** Read a response body into text, aborting once it exceeds `maxBytes`. */\nasync function readTextCapped(response: Response, maxBytes: number): Promise<string> {\n const reader = response.body?.getReader();\n if (reader === undefined) {\n const buffer = await response.arrayBuffer();\n if (buffer.byteLength > maxBytes) {\n throw new X402ProbeError(`402 body exceeds ${maxBytes} bytes`, 402);\n }\n return new TextDecoder().decode(buffer);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel().catch(() => {});\n throw new X402ProbeError(`402 body exceeds ${maxBytes} bytes`, 402);\n }\n chunks.push(value);\n }\n const combined = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder().decode(combined);\n}\n\nexport interface X402ResourceInfo {\n url?: string;\n description?: string;\n mimeType?: string;\n serviceName?: string;\n tags?: string[];\n}\n\nexport interface X402ProbeResult {\n x402Version: number;\n accepts: PaymentRequirements[];\n resource?: X402ResourceInfo;\n}\n\n/** Raised when the endpoint responds but is not a parseable x402 resource. */\nexport class X402ProbeError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = 'X402ProbeError';\n this.status = status;\n }\n}\n\ninterface V1Requirement {\n scheme?: unknown;\n network?: unknown;\n asset?: unknown;\n payTo?: unknown;\n maxAmountRequired?: unknown;\n maxTimeoutSeconds?: unknown;\n extra?: unknown;\n resource?: unknown;\n description?: unknown;\n mimeType?: unknown;\n}\n\nfunction normalizeV1Requirement(raw: V1Requirement): PaymentRequirements {\n return {\n scheme: typeof raw.scheme === 'string' ? raw.scheme : '',\n network: (typeof raw.network === 'string' ? raw.network : 'unknown:unknown') as never,\n asset: typeof raw.asset === 'string' ? raw.asset : '',\n payTo: typeof raw.payTo === 'string' ? raw.payTo : '',\n amount: typeof raw.maxAmountRequired === 'string' ? raw.maxAmountRequired : '',\n maxTimeoutSeconds: typeof raw.maxTimeoutSeconds === 'number' ? raw.maxTimeoutSeconds : 60,\n extra: (raw.extra ?? {}) as Record<string, unknown>,\n };\n}\n\nfunction parseV1Body(bodyText: string): X402ProbeResult | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(bodyText);\n } catch {\n return null;\n }\n if (typeof parsed !== 'object' || parsed === null) {\n return null;\n }\n const body = parsed as { x402Version?: unknown; accepts?: unknown };\n if (body.x402Version !== 1 || !Array.isArray(body.accepts) || body.accepts.length === 0) {\n return null;\n }\n // Keep only object entries: a hostile upstream can put `null`/scalars in\n // `accepts`, and mapping them straight into `normalizeV1Requirement` (which\n // reads `.scheme` etc.) would throw a TypeError instead of cleanly failing.\n const rawRequirements = body.accepts.filter(\n (item): item is V1Requirement => typeof item === 'object' && item !== null,\n );\n if (rawRequirements.length === 0) {\n return null;\n }\n const accepts = rawRequirements.map(normalizeV1Requirement);\n const first = rawRequirements[0];\n return {\n x402Version: 1,\n accepts,\n resource: {\n url: typeof first.resource === 'string' ? first.resource : undefined,\n description: typeof first.description === 'string' ? first.description : undefined,\n mimeType: typeof first.mimeType === 'string' ? first.mimeType : undefined,\n },\n };\n}\n\n/**\n * Probe the upstream with the declared method and an empty body. Throws\n * `X402ProbeError` when the response is not a parseable 402 (the caller maps\n * it to a preflight refusal or a friendly `add` message); network errors\n * propagate as-is for the caller to classify.\n */\nexport async function probePaymentRequired(\n url: string,\n method: 'GET' | 'POST',\n signal?: AbortSignal,\n): Promise<X402ProbeResult> {\n const probeSignal = signal ?? AbortSignal.timeout(PROBE_TIMEOUT_MS);\n // `redirect: 'error'` (not the default 'follow'): the upstream is untrusted,\n // and auto-following a 3xx would let it redirect the probe to an internal\n // address (SSRF, e.g. cloud metadata) or a different host. A real x402\n // resource answers 402 directly, so a redirect is a hard error here.\n const response = await fetch(url, { method, signal: probeSignal, redirect: 'error' });\n // Drain/ignore bodies we don't parse so undici can reuse the connection.\n if (response.status !== 402) {\n await response.body?.cancel().catch(() => {});\n throw new X402ProbeError(\n `expected HTTP 402 from ${url}, got ${response.status} - not an x402-paid endpoint (or it validates the request before the paywall; try the other method)`,\n response.status,\n );\n }\n\n const headerValue = response.headers.get('PAYMENT-REQUIRED');\n if (headerValue !== null) {\n await response.body?.cancel().catch(() => {});\n try {\n const paymentRequired = decodePaymentRequiredHeader(headerValue);\n return {\n x402Version: paymentRequired.x402Version,\n accepts: paymentRequired.accepts,\n resource: paymentRequired.resource,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new X402ProbeError(`could not decode PAYMENT-REQUIRED header: ${message}`, 402);\n }\n }\n\n const bodyText = await readTextCapped(response, MAX_PROBE_BODY_BYTES).catch((error) => {\n if (error instanceof X402ProbeError) {\n throw error;\n }\n return '';\n });\n const v1 = parseV1Body(bodyText);\n if (v1 !== null) {\n return v1;\n }\n throw new X402ProbeError(\n 'got HTTP 402 but neither a v2 PAYMENT-REQUIRED header nor a v1 JSON body was parseable',\n 402,\n );\n}\n\ninterface ProbeCacheEntry {\n at: number;\n result: X402ProbeResult;\n}\n\nconst PROBE_CACHE = new Map<string, ProbeCacheEntry>();\n\n/**\n * TTL-cached probe shared across concurrent jobs, so an upstream that\n * rate-limits unpaid 402s sees at most one probe per TTL window instead of\n * one per job. The quote may be up to TTL old - the ceiling is enforced\n * again at signing time (payment policies), so the cache is availability\n * smoothing, not a money decision.\n */\nexport async function probePaymentRequiredCached(\n url: string,\n method: 'GET' | 'POST',\n ttlMs: number,\n): Promise<X402ProbeResult> {\n const key = `${method} ${url}`;\n const cached = PROBE_CACHE.get(key);\n const now = Date.now();\n if (cached !== undefined && now - cached.at < ttlMs) {\n return cached.result;\n }\n const result = await probePaymentRequired(url, method);\n // Bound the shared module-level cache: drop the oldest-inserted entry once\n // over the cap (Map preserves insertion order). Re-set moves the key to the\n // end so live URLs are not evicted. Stops unbounded growth if many distinct\n // upstream URLs are probed over a long-lived process.\n PROBE_CACHE.delete(key);\n PROBE_CACHE.set(key, { at: now, result });\n while (PROBE_CACHE.size > PROBE_CACHE_MAX_ENTRIES) {\n const oldest = PROBE_CACHE.keys().next().value;\n if (oldest === undefined) {\n break;\n }\n PROBE_CACHE.delete(oldest);\n }\n return result;\n}\n\n/** Test hook: drop cached probes. */\nexport function clearProbeCache(): void {\n PROBE_CACHE.clear();\n}\n","/**\n * Idempotency store for the x402 bridge. elisym's delivery is\n * at-least-once: a crash between `skill.execute()` and the ledger flush\n * re-executes the job, and for a bridge that means paying the upstream\n * AGAIN. This store makes re-execution safe:\n *\n * - a *paid attempt* is recorded the moment a `PAYMENT-SIGNATURE` request\n * leaves the process (see the instrumented fetch in the driver), capping\n * money spent per job. An attempt whose payment the upstream definitively\n * refuses with a fresh 402 can be refunded (no settle happened on an\n * honest upstream), but the parallel *signatures* counter is monotonic -\n * it caps how many signed payments can EVER leave for one job, because a\n * malicious upstream can settle a payment and still respond 402;\n * - a completed *result* is recorded after the upstream responds, so\n * recovery delivers the bought result instead of buying it twice. Binary\n * results live as files in `.x402-results/<jobId>` written BEFORE the\n * JSON record flush; a record whose file is missing counts as\n * attempt-without-result.\n *\n * All read-modify-write cycles are serialized through one in-process async\n * queue: up to `maxConcurrentJobs` jobs share this single JSON file, and a\n * lost update would widen the double-payment window beyond the documented\n * crash-only case. Files are owned by this store's TTL sweep - result file\n * paths handed out for delivery must NOT be cleaned up by callers.\n */\nimport { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { X402_CACHE_TTL_MS } from './constants.js';\n\nexport const X402_JOBS_FILE = '.x402-jobs.json';\nexport const X402_RESULTS_DIR = '.x402-results';\n\ntype StoredResult = { kind: 'text'; data: string } | { kind: 'file'; mime: string };\n\ninterface X402JobRecord {\n attempts: number;\n /**\n * Monotonic count of signed payments ever sent for this job - never\n * refunded. Absent in records written before the counter existed; treated\n * as equal to `attempts` (those attempts were never refunded).\n */\n signatures?: number;\n result?: StoredResult;\n created_at: number;\n updated_at: number;\n}\n\ntype X402JobsFile = Record<string, X402JobRecord>;\n\nexport interface X402CachedResult {\n data: string;\n outputMime?: string;\n filePath?: string;\n}\n\nexport interface X402ClaimResult {\n granted: boolean;\n attempts: number;\n signatures: number;\n /** Which cap refused the claim; absent when granted. */\n refusedBy?: 'attempts' | 'signatures';\n}\n\n/** Keep result filenames safe regardless of what a jobId turns out to be. */\nfunction sanitizeJobId(jobId: string): string {\n return jobId.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 128);\n}\n\nexport class X402JobStore {\n private readonly jobsPath: string;\n private readonly resultsDir: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(agentDir: string) {\n this.jobsPath = join(agentDir, X402_JOBS_FILE);\n this.resultsDir = join(agentDir, X402_RESULTS_DIR);\n }\n\n /** Serialize read-modify-write cycles; a failed task must not wedge the queue. */\n private runExclusive<T>(task: () => Promise<T>): Promise<T> {\n const scheduled = this.queue.then(task, task);\n this.queue = scheduled.then(\n function ignoreResult() {},\n function ignoreError() {},\n );\n return scheduled;\n }\n\n private async load(): Promise<X402JobsFile> {\n let raw: string;\n try {\n raw = await readFile(this.jobsPath, 'utf-8');\n } catch (error) {\n // A missing file is a legitimate cold start -> empty ledger. Every\n // OTHER error (EACCES, EIO, a hand-edited file) must fail CLOSED: the\n // store gates re-payment, so silently treating a read error as \"no\n // records\" would reset the paid-attempt counter and drop cached\n // results, causing the bridge to pay the upstream again.\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw error;\n }\n const parsed = JSON.parse(raw) as unknown;\n // Must be a plain object: an array is `typeof 'object'` too, but a store\n // that decoded to an array is corrupt, not an empty ledger - fail closed\n // rather than treat it as \"no records\" and reset the paid-attempt budget.\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(`x402 store ${this.jobsPath} is not a JSON object`);\n }\n return parsed as X402JobsFile;\n }\n\n private async save(file: X402JobsFile): Promise<void> {\n const tempPath = `${this.jobsPath}.tmp`;\n await writeFile(tempPath, JSON.stringify(file, null, 2), 'utf-8');\n await rename(tempPath, this.jobsPath);\n }\n\n resultFilePath(jobId: string): string {\n return join(this.resultsDir, sanitizeJobId(jobId));\n }\n\n /**\n * Atomically claim one paid attempt: increment iff still under BOTH caps\n * (durable attempts and the monotonic signature count), and FLUSH before\n * returning. The whole check-and-increment runs inside the serialization\n * queue so concurrent `execute()` flows for the same jobId (dedup failure,\n * crash-recovery racing the original) can never each read a stale count\n * and all pass the budget gate - the money bound holds. The flush ordering\n * errs on \"an attempt happened\", since the caller sends the payment\n * immediately after a grant.\n */\n async claimPaidAttempt(\n jobId: string,\n maxAttempts: number,\n maxSignatures: number,\n ): Promise<X402ClaimResult> {\n return this.runExclusive(async () => {\n const file = await this.load();\n const now = Date.now();\n const record = file[jobId] ?? { attempts: 0, created_at: now, updated_at: now };\n const signatures = record.signatures ?? record.attempts;\n // Persist nothing on refusal; the counts are already at the ceiling.\n if (signatures >= maxSignatures) {\n return { granted: false, attempts: record.attempts, signatures, refusedBy: 'signatures' };\n }\n if (record.attempts >= maxAttempts) {\n return { granted: false, attempts: record.attempts, signatures, refusedBy: 'attempts' };\n }\n record.attempts += 1;\n record.signatures = signatures + 1;\n record.updated_at = now;\n file[jobId] = record;\n await this.save(file);\n return { granted: true, attempts: record.attempts, signatures: record.signatures };\n });\n }\n\n /**\n * Return one durable attempt slot after the upstream DEFINITIVELY refused\n * the signed payment with a fresh 402 (an honest upstream did not settle,\n * so no money moved). The monotonic `signatures` counter is intentionally\n * NOT decremented: it is the adversarial bound against an upstream that\n * settles the payment and lies with a 402 (see `claimPaidAttempt`).\n */\n async refundPaidAttempt(jobId: string): Promise<void> {\n await this.runExclusive(async () => {\n const file = await this.load();\n const record = file[jobId];\n if (record === undefined || record.attempts === 0) {\n return;\n }\n const signatures = record.signatures ?? record.attempts;\n record.attempts -= 1;\n record.signatures = signatures;\n record.updated_at = Date.now();\n await this.save(file);\n });\n }\n\n /** Serialized point-in-time attempt count (test/inspection helper). */\n async paidAttempts(jobId: string): Promise<number> {\n return this.runExclusive(async () => {\n const file = await this.load();\n return file[jobId]?.attempts ?? 0;\n });\n }\n\n /** Serialized point-in-time signed-payment count (test/inspection helper). */\n async paymentSignatures(jobId: string): Promise<number> {\n return this.runExclusive(async () => {\n const file = await this.load();\n const record = file[jobId];\n return record === undefined ? 0 : (record.signatures ?? record.attempts);\n });\n }\n\n async saveTextResult(jobId: string, data: string): Promise<void> {\n await this.runExclusive(async () => {\n const file = await this.load();\n const now = Date.now();\n const record = file[jobId] ?? { attempts: 0, created_at: now, updated_at: now };\n record.result = { kind: 'text', data };\n record.updated_at = now;\n file[jobId] = record;\n await this.save(file);\n });\n }\n\n /** Binary result: bytes hit disk BEFORE the record flush (crash-safe ordering). */\n async saveFileResult(jobId: string, mime: string, bytes: Uint8Array): Promise<string> {\n const filePath = this.resultFilePath(jobId);\n await mkdir(this.resultsDir, { recursive: true });\n await writeFile(filePath, bytes);\n await this.runExclusive(async () => {\n const file = await this.load();\n const now = Date.now();\n const record = file[jobId] ?? { attempts: 0, created_at: now, updated_at: now };\n record.result = { kind: 'file', mime };\n record.updated_at = now;\n file[jobId] = record;\n await this.save(file);\n });\n return filePath;\n }\n\n /**\n * Completed result for this job, or null. A file record whose file went\n * missing degrades to attempt-without-result (the budget still applies).\n */\n async getResult(jobId: string): Promise<X402CachedResult | null> {\n const file = await this.load();\n const result = file[jobId]?.result;\n if (result === undefined) {\n return null;\n }\n if (result.kind === 'text') {\n return { data: result.data };\n }\n const filePath = this.resultFilePath(jobId);\n try {\n const fileStat = await stat(filePath);\n if (!fileStat.isFile()) {\n return null;\n }\n } catch {\n return null;\n }\n return { data: '', outputMime: result.mime, filePath };\n }\n\n /** Drop records (and their result files) older than the cache TTL. */\n async sweepExpired(now = Date.now()): Promise<void> {\n await this.runExclusive(async () => {\n const file = await this.load();\n let changed = false;\n for (const [jobId, record] of Object.entries(file)) {\n if (now - record.updated_at <= X402_CACHE_TTL_MS) {\n continue;\n }\n delete file[jobId];\n changed = true;\n await rm(this.resultFilePath(jobId), { force: true }).catch(() => {});\n }\n if (changed) {\n await this.save(file);\n }\n });\n }\n}\n","/**\n * The x402 protocol driver: everything money-touching for `mode: 'x402'`\n * skills. Payment signing goes through `@x402/fetch` + `@x402/svm` with a\n * requirements policy as the wallet guard (nothing above the skill's ceiling\n * is ever signed, regardless of what the upstream re-quotes); the preflight\n * protects the CUSTOMER by refusing doomed jobs before they pay; the\n * idempotency store bounds the operator's steady-state worst case at\n * `X402_MAX_PAID_ATTEMPTS` upstream prices per job, and the adversarial\n * worst case (an upstream that settles payments while answering 402 to farm\n * attempt refunds) at `X402_MAX_PAYMENT_SIGNATURES` prices.\n *\n * NOTE: no `onPaymentResponse` / scheme hooks are registered here - on\n * purpose. The fetch wrapper has a dormant `result.recovered` branch that\n * re-signs a second payment inside one call when a hook requests it;\n * without hooks it is dead code, with hooks it would silently double the\n * maximum loss per attempt.\n */\nimport {\n USDC_SOLANA_DEVNET,\n calculateProtocolFee,\n formatAssetAmount,\n signerFromSecretKeyBase58,\n} from '@elisym/sdk';\nimport {\n address,\n createSolanaRpc,\n type KeyPairSigner,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport { wrapFetchWithPayment, x402Client } from '@x402/fetch';\nimport { ExactSvmScheme } from '@x402/svm';\nimport { fetchUsdcBalance } from '../helpers.js';\nimport type { SkillInput, X402JobDriver, X402SkillJob } from '../skill/index.js';\nimport {\n X402_FREE_RETRY_DELAYS_MS,\n X402_GET_INPUT_MAX_ENCODED_BYTES,\n X402_MAX_CHALLENGE_BYTES,\n X402_MAX_PAID_ATTEMPTS,\n X402_MAX_PAYMENT_SIGNATURES,\n X402_MAX_RESPONSE_BYTES,\n X402_PROBE_TTL_MS,\n X402_REFUNDED_RETRIES,\n X402_SOLANA_DEVNET_CAIP2,\n X402_SOLANA_DEVNET_V1,\n} from './constants.js';\nimport { X402PermanentError, X402PreflightError, X402TransientError } from './errors.js';\nimport { buildRequirementsPolicy, maxAcceptableQuote, type RequirementRule } from './matcher.js';\nimport { X402ProbeError, probePaymentRequiredCached } from './probe.js';\nimport { X402JobStore } from './store.js';\n\nexport interface X402DriverOptions {\n agentDir: string;\n /** Revenue address from `elisym.yaml` `payments[]`; must equal the signer address. */\n paymentsAddress?: string;\n /** Decrypted at-rest base58 `solana_secret_key`; absent => every job refused at preflight. */\n solanaSecretKeyBase58?: string;\n rpcUrl: string;\n /** Live protocol fee accessor (bps) - fetched fresh, mirrors `collectPayment`. */\n getFeeBps: () => Promise<number>;\n log?: (message: string) => void;\n /** Backoff override for inline money-free retries (tests); defaults to `X402_FREE_RETRY_DELAYS_MS`. */\n freeRetryDelaysMs?: number[];\n}\n\nconst CUSTOMER_INPUT_TOO_LARGE = 'Input too large for this skill.';\n\n/**\n * Whether to send the buyer input as `application/json`. Requires a JSON\n * object or array - NOT a bare scalar. A buyer of a text upstream who happens\n * to send `1234` or `\"hi\"` (valid JSON scalars) would otherwise flip the\n * outgoing Content-Type to JSON and pick a different upstream code path,\n * turning a paid job into a post-payment failure. Structured bodies still\n * forward as JSON so real JSON upstreams keep working.\n */\nfunction jsonContentType(text: string): boolean {\n const trimmed = text.trimStart();\n if (trimmed.length === 0 || (trimmed[0] !== '{' && trimmed[0] !== '[')) {\n return false;\n }\n try {\n JSON.parse(text);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isTextContentType(contentType: string): boolean {\n const mime = contentType.split(';')[0]?.trim().toLowerCase() ?? '';\n return mime.startsWith('text/') || mime === 'application/json' || mime.endsWith('+json');\n}\n\n/** Buffer the body while enforcing the untrusted-upstream size cap. */\nasync function readBodyCapped(response: Response, maxBytes: number): Promise<Uint8Array> {\n const reader = response.body?.getReader();\n if (reader === undefined) {\n const buffer = new Uint8Array(await response.arrayBuffer());\n if (buffer.byteLength > maxBytes) {\n throw new X402PermanentError(`upstream response too large (> ${maxBytes} bytes)`);\n }\n return buffer;\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel().catch(() => {});\n throw new X402PermanentError(`upstream response too large (> ${maxBytes} bytes)`);\n }\n chunks.push(value);\n }\n const combined = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return combined;\n}\n\n/**\n * Re-materialize a 402 challenge response through a bounded reader before the\n * payment wrapper reads it uncapped. The wrapper buffers the initial 402 body\n * to parse the requirements; capping it here stops a hostile upstream from\n * sending a giant 402 on the paid call (probes are already capped) to OOM the\n * agent. Non-402 responses pass through untouched (the success body is capped\n * separately by `readBodyCapped`).\n */\nasync function capChallengeResponse(response: Response): Promise<Response> {\n if (response.status !== 402) {\n return response;\n }\n const bytes = await readBodyCapped(response, X402_MAX_CHALLENGE_BYTES);\n return new Response(bytes, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\n/** Per-attempt flag: flips the moment a payment claim is granted (i.e. just before a signed payment leaves). */\ninterface AttemptState {\n paymentSent: boolean;\n}\n\n/** Sleep between inline retries; resolves `false` early if the signal aborts. */\nfunction abortableDelay(ms: number, signal?: AbortSignal): Promise<boolean> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve(false);\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n resolve(false);\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve(true);\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class X402Driver implements X402JobDriver {\n private readonly store: X402JobStore;\n private readonly rpc: Rpc<SolanaRpcApi>;\n private signerPromise: Promise<KeyPairSigner> | null = null;\n private readonly repriceHintLogged = new Set<string>();\n\n constructor(private readonly options: X402DriverOptions) {\n this.store = new X402JobStore(options.agentDir);\n this.rpc = createSolanaRpc(options.rpcUrl);\n // Fire-and-forget retention sweep; a failed sweep only delays cleanup.\n this.store.sweepExpired().catch(() => {});\n }\n\n private log(message: string): void {\n (this.options.log ?? console.log)(`[x402] ${message}`);\n }\n\n private getSigner(): Promise<KeyPairSigner> {\n const secret = this.options.solanaSecretKeyBase58;\n if (secret === undefined || secret.length === 0) {\n return Promise.reject(\n new X402PreflightError(\n 'bridge wallet missing: .secrets.json has no solana_secret_key (run `npx @elisym/cli x402 add` to set it up)',\n ),\n );\n }\n if (this.signerPromise === null) {\n this.signerPromise = signerFromSecretKeyBase58(secret);\n }\n return this.signerPromise;\n }\n\n /** The single-wallet invariant: revenue lands where the upstream payer spends from. */\n private async assertWalletInvariant(): Promise<KeyPairSigner> {\n const signer = await this.getSigner();\n const paymentsAddress = this.options.paymentsAddress;\n if (paymentsAddress === undefined || paymentsAddress.length === 0) {\n throw new X402PreflightError(\n 'elisym.yaml has no payments[] entry: revenue would not refill the bridge wallet (run `npx @elisym/cli x402 add` to fix)',\n );\n }\n if (signer.address !== paymentsAddress) {\n throw new X402PreflightError(\n `wallet invariant violated: payments[].address (${paymentsAddress}) differs from the solana_secret_key address (${signer.address}); ` +\n 'revenue would accumulate in one wallet while jobs drain the other - align them (re-run `npx @elisym/cli x402 add` or fix elisym.yaml)',\n );\n }\n return signer;\n }\n\n private assertInputRules(job: X402SkillJob, input: SkillInput): void {\n const { params } = job;\n if (params.method === 'GET' && params.queryParam !== undefined) {\n const encodedBytes = Buffer.byteLength(encodeURIComponent(input.data), 'utf8');\n if (encodedBytes > X402_GET_INPUT_MAX_ENCODED_BYTES) {\n throw new X402PreflightError(\n `GET input too large: ${encodedBytes} percent-encoded bytes (max ${X402_GET_INPUT_MAX_ENCODED_BYTES})`,\n CUSTOMER_INPUT_TOO_LARGE,\n );\n }\n }\n const inputBytes = Buffer.byteLength(input.data, 'utf8');\n if (inputBytes > params.maxInputBytes) {\n throw new X402PreflightError(\n `input too large: ${inputBytes} bytes (skill x402_max_input_bytes=${params.maxInputBytes})`,\n CUSTOMER_INPUT_TOO_LARGE,\n );\n }\n }\n\n async preflight(job: X402SkillJob, input: SkillInput): Promise<void> {\n // Cache-first: a bought result needs neither float nor a live quote to\n // deliver - a down or repriced upstream must not bury it.\n const cached = await this.store.getResult(input.jobId);\n if (cached !== null) {\n return;\n }\n\n const signer = await this.assertWalletInvariant();\n\n if (job.asset.mint !== USDC_SOLANA_DEVNET.mint || USDC_SOLANA_DEVNET.mint === undefined) {\n throw new X402PreflightError(\n `x402 skills must be priced in devnet USDC (skill \"${job.skillName}\" is priced in ${job.asset.symbol}); ` +\n 'the margin check compares the elisym price to the upstream USDC quote - re-run `npx @elisym/cli x402 add`',\n );\n }\n\n this.assertInputRules(job, input);\n\n const rule: RequirementRule = { maxUpstreamSubunits: job.params.maxUpstreamSubunits };\n let probe;\n try {\n probe = await probePaymentRequiredCached(\n job.params.url,\n job.params.method,\n X402_PROBE_TTL_MS,\n );\n } catch (error) {\n if (error instanceof X402ProbeError) {\n throw new X402PreflightError(`upstream probe failed: ${error.message}`);\n }\n const message = error instanceof Error ? error.message : String(error);\n throw new X402PreflightError(`upstream unreachable: ${message}`);\n }\n // Margin/balance are checked against the WORST acceptable quote, not the\n // first-matched one: the client's policy admits every requirement <= the\n // ceiling and its selector may sign any of them, so the gate must hold for\n // the most expensive acceptable option (the ceiling still caps hard loss).\n const quote = maxAcceptableQuote(probe.accepts, rule);\n if (quote === null) {\n throw new X402PreflightError(\n 'no acceptable upstream payment requirement: network/asset/scheme mismatch or the live quote exceeds x402_max_upstream ' +\n '(if the upstream repriced, re-run `npx @elisym/cli x402 add` to regenerate the skill)',\n );\n }\n if (quote < job.params.maxUpstreamSubunits && !this.repriceHintLogged.has(job.skillName)) {\n this.repriceHintLogged.add(job.skillName);\n this.log(\n `upstream for \"${job.skillName}\" now quotes ${formatAssetAmount(USDC_SOLANA_DEVNET, quote)} ` +\n `(your price was computed from ${formatAssetAmount(USDC_SOLANA_DEVNET, job.params.maxUpstreamSubunits)}); ` +\n 're-run `npx @elisym/cli x402 add` to reprice',\n );\n }\n\n const balance = await fetchUsdcBalance(this.rpc, address(signer.address));\n if (balance < quote) {\n throw new X402PreflightError(\n `bridge float insufficient: ${formatAssetAmount(USDC_SOLANA_DEVNET, balance)} USDC in ${signer.address}, ` +\n `upstream quotes ${formatAssetAmount(USDC_SOLANA_DEVNET, quote)} - top up the wallet`,\n );\n }\n\n const feeBps = await this.options.getFeeBps();\n const fee = calculateProtocolFee(job.priceSubunits, feeBps);\n const net = BigInt(job.priceSubunits - fee);\n if (net < quote) {\n throw new X402PreflightError(\n `negative margin: net revenue ${formatAssetAmount(USDC_SOLANA_DEVNET, net)} (price minus ${feeBps} bps protocol fee) ` +\n `is below the upstream quote ${formatAssetAmount(USDC_SOLANA_DEVNET, quote)} - re-run \\`npx @elisym/cli x402 add\\` to reprice`,\n );\n }\n }\n\n /**\n * Instrumented fetch injected into the payment wrapper. The wrapper calls\n * it for the initial unpaid request (no headers) and, after signing, for\n * the paid retry (carrying `PAYMENT-SIGNATURE`). ONLY the paid request\n * claims a budget slot, and it does so ATOMICALLY: `claimPaidAttempt`\n * increments-or-refuses inside the store's serialization queue, so no set\n * of concurrent `execute()` flows for one jobId can each pass a stale\n * check and pay past the budget caps. A refusal throws BEFORE\n * `globalThis.fetch` so no payment is sent.\n */\n private buildInstrumentedFetch(\n jobId: string,\n attemptState: AttemptState,\n ): typeof globalThis.fetch {\n const store = this.store;\n return async function instrumentedFetch(info, init) {\n const request = new Request(info, init);\n if (request.headers.has('PAYMENT-SIGNATURE') || request.headers.has('X-PAYMENT')) {\n const claim = await store.claimPaidAttempt(\n jobId,\n X402_MAX_PAID_ATTEMPTS,\n X402_MAX_PAYMENT_SIGNATURES,\n );\n if (!claim.granted) {\n throw new X402PermanentError(\n claim.refusedBy === 'signatures'\n ? `signed payment budget exhausted (${claim.signatures}/${X402_MAX_PAYMENT_SIGNATURES} payments signed for this job) - refusing to sign another`\n : `paid attempt budget exhausted (${claim.attempts}/${X402_MAX_PAID_ATTEMPTS}) - refusing to pay the upstream again`,\n );\n }\n // Set BEFORE the request goes out: if the send itself fails we do not\n // know whether the upstream saw (and can settle) the payment, so the\n // attempt must count as money-unknown, never as money-free.\n attemptState.paymentSent = true;\n }\n // `redirect: 'error'`: the upstream is untrusted. Auto-following a 3xx\n // would send the request - including the signed PAYMENT-SIGNATURE on the\n // paid retry - to an attacker-chosen host (SSRF / payment-header leak).\n // Rebuild the request with the original method/headers/body so the option\n // takes effect (a Request's redirect mode is otherwise fixed at construction).\n const response = await globalThis.fetch(new Request(request, { redirect: 'error' }));\n // Cap the 402 challenge body the wrapper is about to read uncapped.\n return capChallengeResponse(response);\n };\n }\n\n private buildClient(signer: KeyPairSigner, rule: RequirementRule): x402Client {\n const scheme = new ExactSvmScheme(signer, { rpcUrl: this.options.rpcUrl });\n return x402Client\n .fromConfig({\n schemes: [{ network: X402_SOLANA_DEVNET_CAIP2, client: scheme }],\n policies: [buildRequirementsPolicy(rule)],\n })\n .registerV1(X402_SOLANA_DEVNET_V1, scheme);\n }\n\n private classifyWrapperError(error: unknown): Error {\n if (error instanceof Error && error.name === 'AbortError') {\n return error;\n }\n // A budget refusal (or any error we already classified) raised inside the\n // instrumented fetch must pass through unchanged, not be re-wrapped as a\n // generic transient failure.\n if (error instanceof X402PermanentError || error instanceof X402TransientError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n // The wrapper re-throws a policy rejection (\"All payment requirements\n // were filtered out...\") as this generic message - match on it, there is\n // no dedicated error class to check.\n if (message.includes('Failed to create payment payload')) {\n return new X402PermanentError(\n `payment refused by policy (upstream likely repriced above x402_max_upstream): ${message}`,\n );\n }\n return new X402TransientError(`upstream request failed: ${message}`);\n }\n\n private classifyStatus(status: number): Error {\n if (status === 402) {\n return new X402TransientError('upstream still returned 402 after a payment attempt', status);\n }\n if (status === 429 || status >= 500) {\n return new X402TransientError(`upstream returned ${status}`, status);\n }\n return new X402PermanentError(`upstream returned ${status}`);\n }\n\n async execute(\n job: X402SkillJob,\n input: SkillInput,\n signal?: AbortSignal,\n ): Promise<{ data: string; outputMime?: string; filePath?: string }> {\n const cached = await this.store.getResult(input.jobId);\n if (cached !== null) {\n this.log(`job ${input.jobId.slice(0, 8)}: delivering cached upstream result (no re-payment)`);\n return cached;\n }\n\n // The runtime's pre-payment rules refuse binary attachments, but the\n // blossom fallback can still materialize a lying text descriptor\n // (actual bytes > re-inline cap) as a file - refuse BEFORE paying\n // upstream for a request whose body we cannot map.\n if (input.filePath !== undefined) {\n throw new X402PermanentError(\n 'file inputs are not supported by x402 bridge skills (attachment exceeded the text re-inline cap)',\n );\n }\n // Symmetric re-check of the ACTUAL bytes (the preflight saw the declared\n // size only): never pay for a request the upstream will reject as too large.\n const inputBytes = Buffer.byteLength(input.data, 'utf8');\n if (inputBytes > job.params.maxInputBytes) {\n throw new X402PermanentError(\n `input exceeds x402_max_input_bytes after materialization: ${inputBytes} > ${job.params.maxInputBytes}`,\n );\n }\n\n // No up-front budget check: `claimPaidAttempt` in the instrumented fetch\n // is the single authoritative, atomic gate (an exhausted budget throws a\n // permanent error there, before any payment). An already-exhausted job\n // costs at most one wasted UNPAID probe, never a payment.\n\n const requestUrl = new URL(job.params.url);\n const headers: Record<string, string> = {};\n let body: string | undefined;\n if (job.params.method === 'GET') {\n if (job.params.queryParam !== undefined && input.data.length > 0) {\n requestUrl.searchParams.set(job.params.queryParam, input.data);\n }\n } else {\n body = input.data;\n headers['content-type'] = jsonContentType(input.data) ? 'application/json' : 'text/plain';\n }\n\n const signer = await this.assertWalletInvariant();\n const rule: RequirementRule = { maxUpstreamSubunits: job.params.maxUpstreamSubunits };\n const client = this.buildClient(signer, rule);\n const jobTag = input.jobId.slice(0, 8);\n\n // Inline retry loop: a transient failure that provably cost no money is\n // retried here after a short backoff instead of waiting a full recovery\n // cycle; a definitive 402 payment refusal refunds its budget slot (an\n // honest upstream did not settle) and retries once with a freshly signed\n // payment - the honest cause is a blockhash that expired while a slow\n // upstream served before settling. Money-unknown transients (network\n // error or 5xx AFTER a payment left) never retry inline: only the\n // recovery loop, with its delay and cache-first re-execution, owns them.\n let freeRetriesUsed = 0;\n let refundedRetriesUsed = 0;\n while (true) {\n const attemptState: AttemptState = { paymentSent: false };\n try {\n return await this.attemptUpstream(\n job,\n requestUrl,\n headers,\n body,\n input.jobId,\n client,\n attemptState,\n signal,\n );\n } catch (error) {\n if (!(error instanceof X402TransientError)) {\n throw error;\n }\n if (attemptState.paymentSent) {\n if (error.upstreamStatus !== 402) {\n throw error;\n }\n // Refund BEFORE checking the inline budget so recovery also gets\n // the freed slot; the monotonic signature cap keeps a lying\n // upstream bounded either way.\n try {\n await this.store.refundPaidAttempt(input.jobId);\n } catch (refundError) {\n // A refund that cannot flush must not surface raw (the runtime\n // would mark the paid job failed): keep the slot consumed\n // (fail-closed for money) and stay on the keep-paid transient\n // path - without the inline retry, since the store misbehaves.\n const message =\n refundError instanceof Error ? refundError.message : String(refundError);\n this.log(\n `job ${jobTag}: could not refund the refused payment attempt (${message}) - keeping the slot consumed`,\n );\n throw error;\n }\n if (refundedRetriesUsed >= X402_REFUNDED_RETRIES) {\n throw error;\n }\n refundedRetriesUsed += 1;\n this.log(\n `job ${jobTag}: upstream refused the signed payment with a fresh 402 (likely expired blockhash) - attempt slot refunded, retrying with a fresh payment`,\n );\n continue;\n }\n const freeRetryDelays = this.options.freeRetryDelaysMs ?? X402_FREE_RETRY_DELAYS_MS;\n const delayMs = freeRetryDelays[freeRetriesUsed];\n if (delayMs === undefined) {\n throw error;\n }\n freeRetriesUsed += 1;\n this.log(\n `job ${jobTag}: transient failure before any payment (${error.message}) - inline retry ${freeRetriesUsed}/${freeRetryDelays.length} in ${delayMs}ms`,\n );\n const slept = await abortableDelay(delayMs, signal);\n if (!slept) {\n // Aborted mid-backoff (shutdown/execution budget): surface the\n // already-classified keep-paid transient, not an AbortError the\n // runtime would turn into a permanent failure.\n throw error;\n }\n }\n }\n }\n\n /** One full payment-wrapper pass against the upstream; throws classified errors. */\n private async attemptUpstream(\n job: X402SkillJob,\n requestUrl: URL,\n headers: Record<string, string>,\n body: string | undefined,\n jobId: string,\n client: x402Client,\n attemptState: AttemptState,\n signal?: AbortSignal,\n ): Promise<{ data: string; outputMime?: string; filePath?: string }> {\n const fetchWithPayment = wrapFetchWithPayment(\n this.buildInstrumentedFetch(jobId, attemptState),\n client,\n );\n\n let response: Response;\n try {\n response = await fetchWithPayment(requestUrl, {\n method: job.params.method,\n headers,\n body,\n signal,\n });\n } catch (error) {\n throw this.classifyWrapperError(error);\n }\n if (!response.ok) {\n await response.body?.cancel().catch(() => {});\n throw this.classifyStatus(response.status);\n }\n\n let bytes: Uint8Array;\n try {\n bytes = await readBodyCapped(response, X402_MAX_RESPONSE_BYTES);\n } catch (error) {\n // A network hiccup mid-body on a PAID 2xx must not fail the job for\n // good (the runtime marks unclassified errors failed): classify it so\n // recovery re-delivers. Size-cap violations stay permanent.\n throw this.classifyWrapperError(error);\n }\n const contentType = response.headers.get('content-type') ?? 'application/octet-stream';\n if (isTextContentType(contentType)) {\n const data = new TextDecoder().decode(bytes);\n await this.store.saveTextResult(jobId, data);\n return { data };\n }\n const mime = contentType.split(';')[0]?.trim() ?? 'application/octet-stream';\n // The cache file doubles as the delivery source - handed out WITHOUT a\n // cleanup callback (the store's TTL sweep owns deletion; the runtime\n // calls cleanup even on a failed seed, which would destroy the only copy).\n const filePath = await this.store.saveFileResult(jobId, mime, bytes);\n return { data: '', outputMime: mime, filePath };\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 * `elisym x402 add <url> [agent]` - turn any x402-paid HTTP endpoint into an\n * elisym bridge skill. Probes the live 402 challenge, enforces the\n * single-wallet invariant (generate/import + payments[] write-back),\n * computes a margin-aware price, and generates `skills/<slug>/SKILL.md`\n * with `mode: x402`.\n */\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport {\n LIMITS,\n USDC_SOLANA_DEVNET,\n calculateProtocolFee,\n encodeSecretKeyBase58,\n formatAssetAmount,\n getProtocolConfig,\n getProtocolProgramId,\n generateSolanaWallet,\n signerFromSecretKeyBase58,\n toDTag,\n} from '@elisym/sdk';\nimport {\n ensureGitignoreHasX402Entries,\n listAgents,\n loadAgent,\n writeSecrets,\n writeYaml,\n} from '@elisym/sdk/agent-store';\nimport {\n DEFAULT_X402_MAX_INPUT_BYTES,\n parseSkillMd,\n validateSkillFrontmatter,\n} from '@elisym/sdk/skills';\nimport { address, createSolanaRpc } from '@solana/kit';\nimport chalk from 'chalk';\nimport Decimal from 'decimal.js-light';\nimport YAML from 'yaml';\nimport { fetchUsdcBalance, getRpcUrl } from '../helpers.js';\nimport { requirementAmount, selectAcceptableRequirement } from '../x402/matcher.js';\nimport { X402ProbeError, probePaymentRequired, type X402ProbeResult } from '../x402/probe.js';\n\nexport interface X402AddOptions {\n method?: string;\n queryParam?: string;\n marginBps?: string;\n name?: string;\n generateWallet?: boolean;\n yes?: boolean;\n}\n\nconst BPS_DENOMINATOR = 10_000;\nconst DEFAULT_MARGIN_BPS = 1_000;\nconst SOLANA_MAINNET_CAIP2 = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\nconst CIRCLE_FAUCET_URL = 'https://faucet.circle.com';\n\nfunction fail(message: string): never {\n console.error(`\\n ! ${message}\\n`);\n process.exit(1);\n}\n\n/** Strip control chars and the (repo-banned) em dash from upstream-controlled text. */\nexport function sanitizeUpstreamText(raw: string, maxLength: number): string {\n let withoutControls = '';\n for (const char of raw) {\n const code = char.codePointAt(0) ?? 0;\n withoutControls += code < 0x20 || code === 0x7f ? ' ' : char;\n }\n return withoutControls.replace(/—/g, '-').replace(/\\s+/g, ' ').trim().slice(0, maxLength).trim();\n}\n\nexport function slugFromUrl(url: URL): string {\n const pathPart = url.pathname.replace(/\\/+$/, '').split('/').filter(Boolean).pop() ?? '';\n const host = url.hostname.replace(/^www\\./, '').split('.')[0] ?? 'x402';\n return pathPart.length > 0 ? `${host}-${pathPart}` : host;\n}\n\nfunction parseMarginBps(raw: string | undefined): number {\n if (raw === undefined) {\n return DEFAULT_MARGIN_BPS;\n }\n const value = Number(raw);\n if (!Number.isInteger(value) || value < 0 || value > 100_000) {\n fail(`--margin-bps must be a non-negative integer (bps, 100 = 1%); got \"${raw}\"`);\n }\n return value;\n}\n\n/**\n * Import a wallet secret: solana-keygen JSON file (64-byte array) or a\n * base58 string. Throws on anything unparseable (the command maps it to a\n * clean exit); accepting the keygen JSON matters because the provider docs\n * hand exactly that file (`provider-wallet.json`) to every operator.\n */\nexport async function parseImportedSecret(input: string): Promise<string> {\n const trimmed = input.trim();\n if (existsSync(trimmed)) {\n const content = await readFile(trimmed, 'utf-8');\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n throw new Error(`${trimmed} is not a valid solana-keygen JSON file`);\n }\n if (\n !Array.isArray(parsed) ||\n parsed.length !== 64 ||\n parsed.some(\n (byte) => typeof byte !== 'number' || !Number.isInteger(byte) || byte < 0 || byte > 255,\n )\n ) {\n throw new Error(`${trimmed} must contain a JSON array of 64 bytes (solana-keygen format)`);\n }\n return encodeSecretKeyBase58(new Uint8Array(parsed as number[]));\n }\n try {\n await signerFromSecretKeyBase58(trimmed);\n } catch {\n throw new Error('not a readable file and not a valid base58-encoded 64-byte secret key');\n }\n return trimmed;\n}\n\n/**\n * Customer price from the upstream quote: `ceil(quote * (1 + margin) / (1 - fee))`,\n * pure integer bps math. Guarantees net revenue (price minus the ceil'd\n * protocol fee) covers `quote * (1 + margin)`.\n */\nexport function computeBridgePriceSubunits(\n quote: bigint,\n marginBps: number,\n feeBps: number,\n): bigint {\n if (feeBps >= BPS_DENOMINATOR) {\n throw new Error(`feeBps ${feeBps} >= ${BPS_DENOMINATOR} - refusing zero/negative denominator`);\n }\n return BigInt(\n new Decimal(quote.toString())\n .mul(BPS_DENOMINATOR + marginBps)\n .div(BPS_DENOMINATOR - feeBps)\n .toDecimalPlaces(0, Decimal.ROUND_CEIL)\n .toString(),\n );\n}\n\nexport interface SkillMdInput {\n skillName: string;\n description: string;\n capabilities: string[];\n priceDisplay: string;\n url: string;\n method: 'GET' | 'POST';\n queryParam?: string;\n quote: bigint;\n marginPercent: string;\n feePercent: string;\n}\n\n/**\n * Render SKILL.md with the WHOLE frontmatter serialized by the yaml package\n * (never template literals): name/description come from an untrusted\n * upstream, and a newline in a hand-rolled template would be frontmatter\n * injection (e.g. smuggling `price: 0`).\n */\nexport function buildSkillMd(input: SkillMdInput): string {\n const frontmatter: Record<string, unknown> = {\n name: input.skillName,\n description: input.description,\n capabilities: input.capabilities,\n price: input.priceDisplay,\n token: 'usdc',\n mode: 'x402',\n x402_url: input.url,\n x402_method: input.method,\n ...(input.queryParam !== undefined ? { x402_query_param: input.queryParam } : {}),\n x402_max_upstream: Number(input.quote),\n // GET input is dominated by the ~2KB percent-encoded query-string limit,\n // so the byte cap is written for POST bridges only.\n ...(input.method === 'POST' ? { x402_max_input_bytes: DEFAULT_X402_MAX_INPUT_BYTES } : {}),\n };\n const bodyLines = [\n `# ${input.skillName}`,\n '',\n 'Operator notes for this x402 bridge skill (the executor ignores this body):',\n '',\n `- Upstream: ${input.url} (${input.method})`,\n `- Upstream quote at generation time: ${formatAssetAmount(USDC_SOLANA_DEVNET, input.quote)} (= x402_max_upstream, the signing ceiling)`,\n `- Price: ${input.priceDisplay} USDC (margin ${input.marginPercent}%, protocol fee ${input.feePercent}% at generation time)`,\n '- To reprice after an upstream change, re-run:',\n '',\n '```bash',\n `npx @elisym/cli x402 add ${input.url}`,\n '```',\n ];\n return `---\\n${YAML.stringify(frontmatter)}---\\n\\n${bodyLines.join('\\n')}\\n`;\n}\n\ninterface ExistingSkillScan {\n /** Directory of an existing bridge skill for the SAME upstream URL (update flow). */\n sameUrlDir?: string;\n sameUrlName?: string;\n /** Name of an existing skill whose d-tag collides with the candidate name. */\n dTagCollision?: string;\n}\n\n/**\n * Collisions are keyed on `toDTag(frontmatter name)`, NOT the folder name:\n * kind:31990 cards are replaceable by (pubkey, kind, d-tag), so a colliding\n * name would silently replace another skill's live card on the relays and\n * misroute its paid jobs.\n */\nexport function scanExistingSkills(\n skillsDir: string,\n candidateDTag: string,\n url: string,\n): ExistingSkillScan {\n const scan: ExistingSkillScan = {};\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch {\n return scan;\n }\n for (const entry of entries) {\n const skillMdPath = join(skillsDir, entry, 'SKILL.md');\n try {\n if (!statSync(join(skillsDir, entry)).isDirectory()) {\n continue;\n }\n const { frontmatter } = parseSkillMd(readFileSync(skillMdPath, 'utf-8'));\n if (typeof frontmatter.name !== 'string') {\n continue;\n }\n if (typeof frontmatter.x402_url === 'string' && frontmatter.x402_url === url) {\n scan.sameUrlDir = join(skillsDir, entry);\n scan.sameUrlName = frontmatter.name;\n continue;\n }\n // One degenerate neighbor must not kill the whole scan.\n let existingDTag: string;\n try {\n existingDTag = toDTag(frontmatter.name);\n } catch {\n continue;\n }\n if (existingDTag === candidateDTag) {\n scan.dTagCollision = frontmatter.name;\n }\n } catch {\n continue;\n }\n }\n return scan;\n}\n\nfunction describeUnacceptableAccepts(probe: X402ProbeResult): string {\n const networks = [...new Set(probe.accepts.map((requirement) => String(requirement.network)))];\n if (networks.length > 0 && networks.every((network) => network.startsWith('eip155:'))) {\n return `the service accepts only EVM networks (${networks.join(', ')}) - not supported yet`;\n }\n if (networks.some((network) => network === SOLANA_MAINNET_CAIP2 || network === 'solana')) {\n return 'the service settles on Solana mainnet - elisym currently runs on devnet (mainnet is on the roadmap)';\n }\n return `no exact-scheme devnet-USDC requirement found (service accepts: ${networks.join(', ') || 'nothing parseable'})`;\n}\n\nexport async function cmdX402Add(\n url: string,\n agentName: string | undefined,\n options: X402AddOptions,\n): Promise<void> {\n const cwd = process.cwd();\n const { default: inquirer } = await import('inquirer');\n\n // -- URL + method --\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(url);\n } catch {\n fail(`\"${url}\" is not a valid URL`);\n }\n // Mirrors the SDK loader rule: loopback http is fine (local demo/test\n // servers), anything remote must be https - payment headers over plain\n // http leak to the network.\n const isLoopback = ['localhost', '127.0.0.1', '[::1]'].includes(parsedUrl.hostname);\n if (parsedUrl.protocol !== 'https:' && !(parsedUrl.protocol === 'http:' && isLoopback)) {\n fail('the upstream must be an https:// URL (plain http is allowed for localhost only)');\n }\n const methodRaw = (options.method ?? 'POST').toUpperCase();\n if (methodRaw !== 'GET' && methodRaw !== 'POST') {\n fail(`--method must be GET or POST; got \"${options.method}\"`);\n }\n const method = methodRaw as 'GET' | 'POST';\n const marginBps = parseMarginBps(options.marginBps);\n\n // -- Agent --\n if (!agentName) {\n const agents = await listAgents(cwd);\n if (agents.length === 0) {\n fail('no agents found - create one first: npx @elisym/cli init');\n }\n if (options.yes) {\n fail('--yes needs an explicit agent argument: elisym x402 add <url> <agent> --yes');\n }\n const { selected } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selected',\n message: 'Add the bridge skill to which agent?',\n choices: agents.map((agent) => ({\n name: `${agent.name} (${agent.source})`,\n value: agent.name,\n })),\n },\n ]);\n agentName = selected as string;\n }\n const passphrase = process.env.ELISYM_PASSPHRASE;\n const loaded = await loadAgent(agentName, cwd, passphrase);\n\n // -- Probe the live 402 --\n console.log(`\\n Probing ${url} (${method}, unpaid)...`);\n let probe: X402ProbeResult;\n try {\n probe = await probePaymentRequired(url, method);\n } catch (error) {\n if (error instanceof X402ProbeError) {\n fail(error.message);\n }\n const message = error instanceof Error ? error.message : String(error);\n fail(`upstream unreachable: ${message}`);\n }\n const anyCeiling = { maxUpstreamSubunits: BigInt(Number.MAX_SAFE_INTEGER) };\n const requirement = selectAcceptableRequirement(probe.accepts, anyCeiling);\n if (requirement === undefined) {\n fail(describeUnacceptableAccepts(probe));\n }\n const quote = requirementAmount(requirement);\n if (quote === null || quote <= 0n) {\n fail('the upstream quote is not a positive integer amount');\n }\n\n // -- Wallet: single-wallet invariant --\n let solanaSecretKey = loaded.secrets.solana_secret_key;\n if (solanaSecretKey === undefined || solanaSecretKey.length === 0) {\n let choice: 'generate' | 'import';\n if (options.yes || options.generateWallet) {\n if (!options.generateWallet) {\n fail(\n 'this agent has no Solana wallet key. Run interactively to generate/import one, or pass --generate-wallet (a money-holding key is never created silently under --yes).',\n );\n }\n choice = 'generate';\n } else {\n const { walletChoice } = await inquirer.prompt([\n {\n type: 'list',\n name: 'walletChoice',\n message:\n 'The bridge pays the upstream from the agent wallet, but .secrets.json has no solana_secret_key:',\n choices: [\n { name: 'Generate a new wallet', value: 'generate' },\n { name: 'Import an existing one (solana-keygen JSON file or base58)', value: 'import' },\n ],\n },\n ]);\n choice = walletChoice as 'generate' | 'import';\n }\n if (choice === 'generate') {\n const wallet = await generateSolanaWallet();\n solanaSecretKey = wallet.secretKeyBase58;\n } else {\n const { imported } = await inquirer.prompt([\n {\n // Masked: a pasted base58 secret key must not echo to the terminal\n // scrollback (matches every other secret prompt in the CLI). A file\n // path can still be pasted/drag-dropped under the mask.\n type: 'password',\n mask: '*',\n name: 'imported',\n message: 'Path to a solana-keygen JSON file (or paste a base58 secret key):',\n },\n ]);\n try {\n solanaSecretKey = await parseImportedSecret(imported as string);\n } catch (error) {\n fail(error instanceof Error ? error.message : String(error));\n }\n }\n await writeSecrets(\n loaded.dir,\n { ...loaded.secrets, solana_secret_key: solanaSecretKey },\n passphrase,\n );\n console.log(' Wallet key saved to .secrets.json');\n }\n const signer = await signerFromSecretKeyBase58(solanaSecretKey);\n\n const solPayment = loaded.yaml.payments.find((entry) => entry.chain === 'solana');\n if (solPayment !== undefined && solPayment.address !== signer.address) {\n fail(\n `wallet invariant violated: elisym.yaml payments[].address (${solPayment.address}) differs from the solana_secret_key address (${signer.address}).\\n` +\n ' Revenue must land in the wallet the bridge spends from, or the float never refills.\\n' +\n ' Fix: set payments[].address to the key address, or import the matching key.',\n );\n }\n if (solPayment === undefined) {\n // Without a payments[] entry publishCapability throws at start and the\n // bridge silently gets no discovery - never let the invariant pass vacuously.\n console.log(\n ` elisym.yaml has no Solana payments entry; adding address ${signer.address} (devnet).`,\n );\n await writeYaml(loaded.dir, {\n ...loaded.yaml,\n payments: [\n ...loaded.yaml.payments,\n { chain: 'solana', network: 'devnet', address: signer.address },\n ],\n });\n }\n\n // -- Balance + protocol fee --\n const rpc = createSolanaRpc(getRpcUrl('devnet'));\n const balance = await fetchUsdcBalance(rpc, address(signer.address));\n let feeBps: number;\n try {\n const protocolConfig = await getProtocolConfig(rpc, getProtocolProgramId('devnet'), {\n forceRefresh: true,\n });\n feeBps = protocolConfig.feeBps;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n fail(`could not read the on-chain protocol config (fee): ${message}`);\n }\n if (feeBps >= BPS_DENOMINATOR) {\n fail(\n `protocol fee is ${feeBps} bps (>= 100%) - price math would divide by zero or go negative`,\n );\n }\n\n // -- Price: ceil(quote * (1 + margin) / (1 - fee)), integer bps math --\n const priceSubunits = computeBridgePriceSubunits(quote, marginBps, feeBps);\n const priceDisplay = new Decimal(priceSubunits.toString())\n .div(new Decimal(10).pow(USDC_SOLANA_DEVNET.decimals))\n .toString();\n const protocolFee = calculateProtocolFee(Number(priceSubunits), feeBps);\n const netMargin = priceSubunits - BigInt(protocolFee) - quote;\n\n // -- Name / description / capabilities (upstream-controlled - sanitize) --\n const fallbackName = slugFromUrl(parsedUrl);\n const rawName = options.name ?? probe.resource?.serviceName ?? fallbackName;\n const skillName = sanitizeUpstreamText(rawName, LIMITS.MAX_AGENT_NAME_LENGTH);\n if (!/[a-zA-Z0-9]/.test(skillName)) {\n fail(\n `the upstream service name (\"${rawName}\") has no ASCII letters or digits - pass an explicit --name <skill-name>`,\n );\n }\n const candidateDTag = toDTag(skillName);\n const description = sanitizeUpstreamText(\n probe.resource?.description ?? `x402 bridge to ${parsedUrl.hostname}`,\n LIMITS.MAX_DESCRIPTION_LENGTH,\n );\n const capabilities = [candidateDTag];\n\n // -- Collision checks (d-tag first, then folder) --\n const skillsDir = join(loaded.dir, 'skills');\n const scan = scanExistingSkills(skillsDir, candidateDTag, url);\n let targetDir = join(skillsDir, candidateDTag);\n if (scan.sameUrlDir !== undefined) {\n if (!options.yes) {\n const { update } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'update',\n message: `Skill \"${scan.sameUrlName}\" already bridges this URL - regenerate it with the fresh quote?`,\n default: true,\n },\n ]);\n if (!(update as boolean)) {\n fail('aborted');\n }\n }\n targetDir = scan.sameUrlDir;\n } else if (scan.dTagCollision !== undefined) {\n fail(\n `the generated name \"${skillName}\" collides with existing skill \"${scan.dTagCollision}\" ` +\n `(both map to d-tag \"${candidateDTag}\", which would replace its live discovery card) - pass a distinct --name`,\n );\n } else if (existsSync(targetDir)) {\n fail(`skill directory ${targetDir} already exists - pass a distinct --name`);\n }\n\n // -- GET input mapping --\n let queryParam = options.queryParam;\n if (method === 'GET' && queryParam === undefined && !options.yes) {\n const { param } = await inquirer.prompt([\n {\n type: 'input',\n name: 'param',\n message:\n 'GET upstream: which query parameter should carry the buyer input? (empty = the skill takes no input)',\n },\n ]);\n queryParam = (param as string).trim() === '' ? undefined : (param as string).trim();\n }\n if (queryParam !== undefined && parsedUrl.searchParams.has(queryParam)) {\n fail(`--query-param \"${queryParam}\" collides with a parameter already present in the URL`);\n }\n if (method === 'POST' && queryParam !== undefined) {\n fail('--query-param only applies to GET upstreams (POST maps the input to the request body)');\n }\n const noInput = method === 'GET' && queryParam === undefined;\n\n // -- Summary --\n const feePercent = new Decimal(feeBps).div(100).toString();\n const marginPercent = new Decimal(marginBps).div(100).toString();\n console.log('');\n console.log(` ${chalk.bold(skillName)}`);\n console.log(` ${description}`);\n console.log('');\n console.log(\n ` Upstream ${url} (${method}${queryParam !== undefined ? `, input in ?${queryParam}=` : ''}${noInput ? ', no buyer input' : ''})`,\n );\n console.log(` Quote ${formatAssetAmount(USDC_SOLANA_DEVNET, quote)}`);\n console.log(\n ` Your price ${formatAssetAmount(USDC_SOLANA_DEVNET, priceSubunits)} (margin ${marginPercent}% + protocol fee ${feePercent}%)`,\n );\n console.log(` Net margin ${formatAssetAmount(USDC_SOLANA_DEVNET, netMargin)} per job`);\n console.log(\n ` Float ${formatAssetAmount(USDC_SOLANA_DEVNET, balance)} in ${signer.address}`,\n );\n if (balance < quote) {\n console.log(\n chalk.yellow(\n ` ! Float below one upstream quote - fund the wallet with devnet USDC: ${CIRCLE_FAUCET_URL}`,\n ),\n );\n }\n console.log(` Skill dir ${targetDir}`);\n console.log('');\n if (!options.yes) {\n const { confirmed } = await inquirer.prompt([\n { type: 'confirm', name: 'confirmed', message: 'Write the skill?', default: true },\n ]);\n if (!(confirmed as boolean)) {\n fail('aborted');\n }\n }\n\n // -- Generate SKILL.md --\n const content = buildSkillMd({\n skillName,\n description,\n capabilities,\n priceDisplay,\n url,\n method,\n queryParam,\n quote,\n marginPercent,\n feePercent,\n });\n\n // Round-trip through the real loader before touching disk: a generation\n // bug must fail HERE, not at the next `start`.\n const roundTrip = parseSkillMd(content);\n validateSkillFrontmatter(roundTrip.frontmatter, roundTrip.systemPrompt, {\n allowFreeSkills: false,\n allowX402Skills: true,\n });\n\n await mkdir(targetDir, { recursive: true });\n await writeFile(join(targetDir, 'SKILL.md'), content, 'utf-8');\n await ensureGitignoreHasX402Entries(dirname(loaded.dir));\n\n console.log(`\\n Wrote ${join(targetDir, 'SKILL.md')}`);\n if (balance < quote) {\n console.log(` Next: fund the float (devnet USDC): ${CIRCLE_FAUCET_URL}`);\n }\n console.log(` Start the agent: npx @elisym/cli start ${agentName}\\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"]}
|