@elisym/sdk 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-store.cjs.map +1 -1
- package/dist/agent-store.js.map +1 -1
- package/dist/index.cjs +247 -83
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -24
- package/dist/index.d.ts +47 -24
- package/dist/index.js +248 -82
- package/dist/index.js.map +1 -1
- package/dist/skills.cjs.map +1 -1
- package/dist/skills.js.map +1 -1
- package/package.json +1 -1
package/dist/skills.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skills/llmClient.ts","../src/skills/scriptSkill.ts","../src/constants.ts","../src/payment/assets.ts","../src/skills/loader.ts"],"names":["spawn","StringDecoder","Decimal","YAML","readdirSync","join","statSync","readFileSync"],"mappings":"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","file":"skills.cjs","sourcesContent":["import type { CompletionResult, LlmClient, ToolCall, ToolDef, ToolResult } from './types';\n\nconst LLM_TIMEOUT_MS = 120_000;\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_ANTHROPIC_MODEL = 'claude-haiku-4-5-20251001';\nconst DEFAULT_OPENAI_MODEL = 'gpt-4o-mini';\n\nexport type LlmProvider = 'anthropic' | 'openai';\n\nexport interface LlmClientConfig {\n provider: LlmProvider;\n apiKey: string;\n model?: string;\n maxTokens?: number;\n}\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\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), LLM_TIMEOUT_MS);\n const onAbort = (): void => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n}\n\nasync 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 // Release the unread body so the fetch connection/stream resources do\n // not linger across the retry sleep.\n await response.body?.cancel().catch(() => undefined);\n await sleepWithSignal(delay, signal);\n }\n}\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n}\n\ninterface AnthropicResponse {\n content?: AnthropicContentBlock[];\n}\n\nclass AnthropicClient implements LlmClient {\n constructor(\n private readonly config: Required<Pick<LlmClientConfig, 'apiKey' | 'model' | 'maxTokens'>>,\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 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 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\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 OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n}\n\nclass OpenAIClient implements LlmClient {\n constructor(\n private readonly config: Required<Pick<LlmClientConfig, 'apiKey' | 'model' | 'maxTokens'>>,\n ) {}\n\n private isReasoningModel(): boolean {\n return /^o\\d/.test(this.config.model);\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 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 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 function createAnthropicClient(config: Omit<LlmClientConfig, 'provider'>): LlmClient {\n if (!config.apiKey) {\n throw new Error('ANTHROPIC_API_KEY is required for skill runtime');\n }\n return new AnthropicClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_ANTHROPIC_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n });\n}\n\nexport function createOpenAIClient(config: Omit<LlmClientConfig, 'provider'>): LlmClient {\n if (!config.apiKey) {\n throw new Error('OPENAI_API_KEY is required for skill runtime');\n }\n return new OpenAIClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_OPENAI_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n });\n}\n\nexport function createLlmClient(config: LlmClientConfig): LlmClient {\n if (config.provider === 'openai') {\n return createOpenAIClient(config);\n }\n return createAnthropicClient(config);\n}\n","import { spawn } from 'node:child_process';\nimport { StringDecoder } from 'node:string_decoder';\nimport type { Asset } from '../payment/assets';\nimport type {\n CompletionResult,\n LlmClient,\n Skill,\n SkillContext,\n SkillInput,\n SkillOutput,\n ToolCall,\n ToolDef,\n ToolResult,\n} from './types';\n\nconst MAX_TOOL_OUTPUT = 1_000_000;\nconst TOOL_TIMEOUT_MS = 60_000;\n\nexport interface SkillToolDef {\n name: string;\n description: string;\n command: string[];\n parameters?: Array<{ name: string; description: string; required?: boolean }>;\n}\n\nexport interface ScriptSkillLogger {\n debug?(obj: Record<string, unknown>, msg?: string): void;\n}\n\nexport interface ScriptSkillParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: bigint;\n asset: Asset;\n skillDir: string;\n systemPrompt: string;\n tools: SkillToolDef[];\n maxToolRounds: number;\n image?: string;\n imageFile?: string;\n logger?: ScriptSkillLogger;\n}\n\n/**\n * LLM-orchestrated skill runner. Tools are external scripts launched\n * via `child_process.spawn` (without `shell: true`, so shell\n * metacharacters in arguments are never interpreted - a security\n * property, not a convenience). Windows users cannot rely on\n * shell-script shebangs; target Linux/macOS for scripts.\n */\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: bigint;\n asset: Asset;\n image?: string;\n imageFile?: string;\n private skillDir: string;\n private systemPrompt: string;\n private tools: SkillToolDef[];\n private maxToolRounds: number;\n private logger: ScriptSkillLogger;\n\n constructor(params: ScriptSkillParams) {\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.skillDir = params.skillDir;\n this.systemPrompt = params.systemPrompt;\n this.tools = params.tools;\n this.maxToolRounds = params.maxToolRounds;\n this.logger = params.logger ?? {};\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n if (!ctx.llm) {\n throw new Error('LLM client not configured for skill runtime');\n }\n\n if (this.tools.length === 0) {\n const result = await ctx.llm.complete(this.systemPrompt, input.data, ctx.signal);\n return { data: result };\n }\n\n const toolDefs: ToolDef[] = this.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: (tool.parameters ?? []).map((param) => ({\n name: param.name,\n description: param.description,\n required: param.required ?? true,\n })),\n }));\n\n const messages: unknown[] = [{ role: 'user', content: input.data }];\n const llm: LlmClient = ctx.llm;\n\n for (let round = 0; round < this.maxToolRounds; round++) {\n if (ctx.signal?.aborted) {\n throw new Error('Job aborted');\n }\n const result: CompletionResult = await llm.completeWithTools(\n this.systemPrompt,\n messages,\n toolDefs,\n ctx.signal,\n );\n\n if (result.type === 'text') {\n return { data: result.text };\n }\n\n messages.push(result.assistantMessage);\n\n const toolResults: ToolResult[] = [];\n for (const call of result.calls) {\n const toolDef = this.tools.find((tool) => tool.name === call.name);\n if (!toolDef) {\n toolResults.push({\n callId: call.id,\n content: `Error: unknown tool \"${call.name}\"`,\n });\n continue;\n }\n const output = await this.runTool(toolDef, call, ctx.signal);\n toolResults.push({ callId: call.id, content: output });\n }\n\n messages.push(...llm.formatToolResultMessages(toolResults));\n }\n\n throw new Error(`Max tool rounds (${this.maxToolRounds}) exceeded`);\n }\n\n private runTool(toolDef: SkillToolDef, call: ToolCall, signal?: AbortSignal): Promise<string> {\n return new Promise((resolve) => {\n const args = [...toolDef.command];\n const cmd = args.shift();\n if (!cmd) {\n resolve(`Error: tool \"${toolDef.name}\" has an empty command`);\n return;\n }\n\n const params = toolDef.parameters ?? [];\n for (let index = 0; index < params.length; index++) {\n const param = params[index];\n if (!param) {\n continue;\n }\n const value = call.arguments[param.name];\n if (value === undefined) {\n continue;\n }\n if (param.required && index === 0) {\n args.push(String(value));\n } else {\n args.push(`--${param.name}`, String(value));\n }\n }\n\n const child = spawn(cmd, args, {\n cwd: this.skillDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: TOOL_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n signal,\n });\n\n let stdout = '';\n let stderr = '';\n const stdoutDecoder = new StringDecoder('utf8');\n const stderrDecoder = new StringDecoder('utf8');\n\n child.stdout?.on('data', (data: Buffer) => {\n if (stdout.length < MAX_TOOL_OUTPUT) {\n stdout += stdoutDecoder.write(data);\n if (stdout.length > MAX_TOOL_OUTPUT) {\n stdout = stdout.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n child.stderr?.on('data', (data: Buffer) => {\n if (stderr.length < MAX_TOOL_OUTPUT) {\n stderr += stderrDecoder.write(data);\n if (stderr.length > MAX_TOOL_OUTPUT) {\n stderr = stderr.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n\n child.on('close', (code) => {\n // Flush any bytes the decoder buffered because a multi-byte UTF-8\n // codepoint straddled the final chunk boundary.\n stdout += stdoutDecoder.end();\n stderr += stderrDecoder.end();\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n this.logger.debug?.(\n { tool: toolDef.name, code, stderrLen: stderr.length },\n 'skill tool exited non-zero',\n );\n resolve(`Error (exit ${code}): ${stderr.trim() || stdout.trim()}`);\n });\n\n child.on('error', (err) => {\n resolve(`Error: ${err.message}`);\n });\n });\n }\n}\n","import type { Address } from '@solana/kit';\n\nexport const RELAYS = [\n 'wss://relay.damus.io',\n 'wss://nos.lol',\n 'wss://relay.nostr.band',\n 'wss://relay.primal.net',\n 'wss://relay.snort.social',\n];\n\nexport const KIND_APP_HANDLER = 31990;\nexport const KIND_JOB_REQUEST_BASE = 5000;\nexport const KIND_JOB_RESULT_BASE = 6000;\nexport const KIND_JOB_FEEDBACK = 7000;\nexport const DEFAULT_KIND_OFFSET = 100;\n\n/** Default job request kind (5000 + 100). */\nexport const KIND_JOB_REQUEST = KIND_JOB_REQUEST_BASE + DEFAULT_KIND_OFFSET;\n/** Default job result kind (6000 + 100). */\nexport const KIND_JOB_RESULT = KIND_JOB_RESULT_BASE + DEFAULT_KIND_OFFSET;\n\n/** Compute a job request kind from an offset (5000 + offset). */\nexport function jobRequestKind(offset: number): number {\n if (!Number.isInteger(offset) || offset < 0 || offset >= 1000) {\n throw new Error(`Invalid kind offset: ${offset}. Must be integer 0-999.`);\n }\n return KIND_JOB_REQUEST_BASE + offset;\n}\n\n/** Compute a job result kind from an offset (6000 + offset). */\nexport function jobResultKind(offset: number): number {\n if (!Number.isInteger(offset) || offset < 0 || offset >= 1000) {\n throw new Error(`Invalid kind offset: ${offset}. Must be integer 0-999.`);\n }\n return KIND_JOB_RESULT_BASE + offset;\n}\n\n/** Ephemeral ping/pong kinds (not stored by relays, forwarded in real-time). */\nexport const KIND_PING = 20200;\nexport const KIND_PONG = 20201;\n\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\n/**\n * @deprecated Fallback only - use `getProtocolConfig(rpc, programId)` for live values.\n *\n * Protocol fee in basis points (300 = 3%). Bundled as a default for offline use\n * and for first-call before the on-chain config has been fetched. The on-chain\n * `elisym-config` program is the source of truth.\n */\nexport const PROTOCOL_FEE_BPS = 300;\n/**\n * @deprecated Fallback only - use `getProtocolConfig(rpc, programId)` for live values.\n *\n * Solana address of the protocol treasury. Bundled fallback; the on-chain\n * `elisym-config` program is the source of truth and may rotate this address.\n */\nexport const PROTOCOL_TREASURY = 'GY7vnWMkKpftU4nQ16C2ATkj1JwrQpHhknkaBUn67VTy' as Address;\n\n/**\n * Solana program ID for the elisym protocol config (devnet deployment).\n *\n * The Anchor program at this address is the source of truth for fee bps,\n * treasury address, and admin rotation state. Read via `getProtocolConfig`.\n */\nexport const PROTOCOL_PROGRAM_ID_DEVNET = 'BrX1CRkSgvcjxBvc2bgc3QqgWjinusofDmeP7ZVxvwrE' as Address;\n\n/**\n * Read-only marker pubkey attached as a non-signer account to every elisym\n * payment transaction. Lets indexers enumerate every elisym tx network-wide\n * via a single `getSignaturesForAddress(ELISYM_PROTOCOL_TAG)` call,\n * independent of fee size or recipient.\n *\n * The account does not need to exist on-chain; including its pubkey as an\n * extra read-only account in the provider transfer instruction is enough for\n * Solana's tx-by-account index to pick it up. The corresponding secret key\n * was generated and discarded - the tag never signs and never holds funds.\n */\nexport const ELISYM_PROTOCOL_TAG = 'ELiZksgwDt41LaeuPDLkUfWgFXhGgVayTMP7L5nTSEL8' as Address;\n\nexport type ProtocolCluster = 'devnet' | 'mainnet' | 'localnet';\n\n/**\n * Resolve the elisym-config program ID for a given Solana cluster.\n * Mainnet is intentionally unsupported until the program ships there.\n */\nexport function getProtocolProgramId(cluster: ProtocolCluster): Address {\n switch (cluster) {\n case 'devnet':\n case 'localnet':\n return PROTOCOL_PROGRAM_ID_DEVNET;\n case 'mainnet':\n throw new Error('Protocol program is not deployed on mainnet yet');\n }\n}\n\n/** Default values for timeouts, retries, and batch sizes. */\nexport const DEFAULTS = {\n SUBSCRIPTION_TIMEOUT_MS: 120_000,\n PING_TIMEOUT_MS: 3_000,\n PING_RETRIES: 2,\n PING_CACHE_TTL_MS: 30_000,\n PAYMENT_EXPIRY_SECS: 600,\n BATCH_SIZE: 250,\n QUERY_TIMEOUT_MS: 15_000,\n EOSE_TIMEOUT_MS: 3_000,\n VERIFY_RETRIES: 10,\n VERIFY_INTERVAL_MS: 3_000,\n VERIFY_BY_REF_RETRIES: 15,\n VERIFY_BY_REF_INTERVAL_MS: 2_000,\n RESULT_RETRY_COUNT: 3,\n RESULT_RETRY_BASE_MS: 1_000,\n QUERY_MAX_CONCURRENCY: 6,\n VERIFY_SIGNATURE_LIMIT: 25,\n} as const;\n\n/** Protocol limits for input validation. */\nexport const LIMITS = {\n MAX_INPUT_LENGTH: 100_000,\n MAX_TIMEOUT_SECS: 600,\n MAX_CAPABILITIES: 20,\n MAX_DESCRIPTION_LENGTH: 500,\n MAX_AGENT_NAME_LENGTH: 64,\n MAX_CAPABILITY_LENGTH: 64,\n} as const;\n","/**\n * Multi-asset / multi-chain payment model.\n *\n * `Asset` describes a currency a customer can spend: native coins (SOL, ETH, BTC)\n * or tokens (SPL, ERC-20). `assetKey` produces a stable string id for Map lookups.\n *\n * Today only `NATIVE_SOL` is in `KNOWN_ASSETS`. SPL (USDC) and other chains are\n * extended by adding entries to `KNOWN_ASSETS` and, where relevant, to the\n * MCP `DEFAULT_SESSION_LIMITS` catalogue.\n */\n\nimport Decimal from 'decimal.js-light';\n\nexport type Chain = 'solana';\n\nexport interface Asset {\n chain: Chain;\n /** Lowercase token id: 'sol', 'usdc', 'btc', 'eth'. */\n token: string;\n /** SPL mint / ERC-20 contract. Undefined for a native coin. */\n mint?: string;\n /** Subunits per whole (9 SOL, 6 USDC, 8 BTC, 18 ETH). */\n decimals: number;\n /** Display symbol: 'SOL', 'USDC'. */\n symbol: string;\n}\n\nexport const NATIVE_SOL: Asset = {\n chain: 'solana',\n token: 'sol',\n decimals: 9,\n symbol: 'SOL',\n};\n\nexport const USDC_SOLANA_DEVNET: Asset = {\n chain: 'solana',\n token: 'usdc',\n mint: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n decimals: 6,\n symbol: 'USDC',\n};\n\nexport const KNOWN_ASSETS: readonly Asset[] = [NATIVE_SOL, USDC_SOLANA_DEVNET];\n\n/** Stable Map key for `Asset`. Same shape regardless of Asset identity. */\nexport function assetKey(a: Pick<Asset, 'chain' | 'token' | 'mint'>): string {\n return a.mint ? `${a.chain}:${a.token}:${a.mint}` : `${a.chain}:${a.token}`;\n}\n\n/** Find a known asset by (chain, token, mint). Returns undefined if unknown. */\nexport function resolveKnownAsset(chain: string, token: string, mint?: string): Asset | undefined {\n const key = mint ? `${chain}:${token}:${mint}` : `${chain}:${token}`;\n return KNOWN_ASSETS.find((asset) => assetKey(asset) === key);\n}\n\n/** Reverse lookup: given an assetKey string, return the known asset or undefined. */\nexport function assetByKey(key: string): Asset | undefined {\n return KNOWN_ASSETS.find((asset) => assetKey(asset) === key);\n}\n\n/**\n * Resolve the asset a payment request targets. Returns `NATIVE_SOL` when the\n * request has no `asset` field (back-compat with payment requests published\n * before multi-asset support). Throws when `asset` is present but refers to an\n * asset that isn't in `KNOWN_ASSETS` - callers that want to tolerate unknown\n * assets should check `resolveKnownAsset` directly instead.\n */\nexport function resolveAssetFromPaymentRequest(request: {\n asset?: { chain: string; token: string; mint?: string };\n}): Asset {\n if (!request.asset) {\n return NATIVE_SOL;\n }\n const found = resolveKnownAsset(request.asset.chain, request.asset.token, request.asset.mint);\n if (!found) {\n const display = request.asset.mint\n ? `${request.asset.chain}:${request.asset.token}:${request.asset.mint}`\n : `${request.asset.chain}:${request.asset.token}`;\n throw new Error(\n `Unknown asset in payment request: ${display}. ` +\n `Known assets: ${KNOWN_ASSETS.map(assetKey).join(', ')}`,\n );\n }\n return found;\n}\n\nconst DECIMAL_RE = /^(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)$/;\n\n/**\n * Parse a human amount string (\"0.5\", \"1\", \"0.000001\") into raw subunits (BigInt).\n * Uses integer math to avoid float precision issues.\n *\n * Throws on: empty, negative, zero, malformed, too many fractional digits, or\n * a value exceeding `Number.MAX_SAFE_INTEGER` (to keep downstream `Number(...)`\n * call-sites safe).\n */\nexport function parseAssetAmount(asset: Asset, human: string): bigint {\n const trimmed = human.trim();\n if (!trimmed) {\n throw new Error(`${asset.symbol} amount is empty`);\n }\n if (trimmed.startsWith('-')) {\n throw new Error(`${asset.symbol} amount cannot be negative`);\n }\n if (!DECIMAL_RE.test(trimmed)) {\n throw new Error(\n `${asset.symbol} amount must be a non-negative decimal (e.g. \"0.5\", \"1\"); got \"${human}\"`,\n );\n }\n\n const dotPos = trimmed.indexOf('.');\n let wholePart: string;\n if (dotPos === -1) {\n wholePart = trimmed;\n } else if (dotPos === 0) {\n wholePart = '0';\n } else {\n wholePart = trimmed.slice(0, dotPos);\n }\n const fracPart = dotPos === -1 ? '' : trimmed.slice(dotPos + 1);\n\n if (fracPart.length > asset.decimals) {\n throw new Error(\n `${asset.symbol} amount has too many decimals (max ${asset.decimals}); got \"${human}\"`,\n );\n }\n\n const unit = 10n ** BigInt(asset.decimals);\n const whole = BigInt(wholePart);\n const frac = fracPart ? BigInt(fracPart.padEnd(asset.decimals, '0')) : 0n;\n const raw = whole * unit + frac;\n\n if (raw === 0n) {\n throw new Error(`${asset.symbol} amount must be positive; got \"${human}\"`);\n }\n if (raw > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\n `${asset.symbol} amount exceeds safe range (max ${Number.MAX_SAFE_INTEGER} subunits)`,\n );\n }\n return raw;\n}\n\n// Cloned config keeps `Decimal.toString()` from switching to exponential notation\n// for small fractional amounts (e.g. 1 lamport = 1e-9 SOL).\nconst FormatDecimal = Decimal.clone({ toExpNeg: -100, toExpPos: 100, precision: 50 });\n\n/**\n * Format raw subunits back to `\"<value> <SYMBOL>\"`. Trailing zeros and a bare\n * trailing dot are stripped, so 0.01 USDC renders as `\"0.01 USDC\"` rather than\n * `\"0.010000 USDC\"`.\n */\nexport function formatAssetAmount(asset: Asset, raw: bigint): string {\n const value = new FormatDecimal(raw.toString()).div(new FormatDecimal(10).pow(asset.decimals));\n return `${value.toString()} ${asset.symbol}`;\n}\n","import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport YAML from 'yaml';\nimport { LAMPORTS_PER_SOL } from '../constants';\nimport {\n type Asset,\n NATIVE_SOL,\n USDC_SOLANA_DEVNET,\n parseAssetAmount,\n resolveKnownAsset,\n} from '../payment/assets';\nimport { ScriptSkill, type SkillToolDef } from './scriptSkill';\nimport type { Skill } from './types';\n\nexport const DEFAULT_MAX_TOOL_ROUNDS = 10;\n\nexport interface SkillFrontmatter {\n name?: unknown;\n description?: unknown;\n capabilities?: unknown;\n price?: unknown;\n /** Lowercase token id ('sol', 'usdc'). Defaults to 'sol' for back-compat. */\n token?: unknown;\n /** SPL mint (base58). Optional - resolved from known assets when omitted. */\n mint?: unknown;\n image?: unknown;\n image_file?: unknown;\n tools?: unknown;\n max_tool_rounds?: unknown;\n}\n\nexport interface ParsedSkill {\n name: string;\n description: string;\n capabilities: string[];\n /** Price in subunits of `asset`. */\n priceSubunits: bigint;\n asset: Asset;\n systemPrompt: string;\n tools: SkillToolDef[];\n maxToolRounds: number;\n image?: string;\n imageFile?: string;\n}\n\nexport interface LoaderLogger {\n debug?(obj: Record<string, unknown>, msg?: string): void;\n warn?(obj: Record<string, unknown>, msg?: string): void;\n}\n\nexport interface LoadSkillsOptions {\n /**\n * When true, SKILL.md may declare `price: 0` or omit `price` entirely\n * and the skill is loaded as free (`priceLamports === 0n`). Default\n * false: paid-only (plugin's historical behaviour).\n */\n allowFreeSkills?: boolean;\n logger?: LoaderLogger;\n}\n\nfunction solToLamports(sol: string | number): bigint {\n const asNumber = typeof sol === 'string' ? Number(sol) : sol;\n if (!Number.isFinite(asNumber) || asNumber < 0) {\n throw new Error(`Invalid SOL amount: ${sol}`);\n }\n return BigInt(Math.round(asNumber * LAMPORTS_PER_SOL));\n}\n\n/**\n * Resolve the asset a SKILL.md declares.\n *\n * - `token` absent or `'sol'` => native SOL (NATIVE_SOL).\n * - `token: 'usdc'` (+ optional `mint`) => resolved via `resolveKnownAsset`;\n * falls back to `USDC_SOLANA_DEVNET` when `mint` is omitted so operators\n * don't need to memorize the devnet mint address.\n * - Any unknown `token` throws.\n */\nfunction resolveSkillAsset(skillName: string, token: unknown, mint: unknown): Asset {\n if (token === undefined || token === null) {\n return NATIVE_SOL;\n }\n if (typeof token !== 'string' || token.length === 0) {\n throw new Error(`SKILL.md \"${skillName}\": \"token\" must be a non-empty string`);\n }\n let mintString: string | undefined;\n if (mint === undefined || mint === null) {\n mintString = undefined;\n } else if (typeof mint === 'string') {\n mintString = mint;\n } else {\n throw new Error(`SKILL.md \"${skillName}\": \"mint\" must be a base58 string`);\n }\n\n const normalized = token.toLowerCase();\n if (normalized === 'sol') {\n return NATIVE_SOL;\n }\n if (normalized === 'usdc' && mintString === undefined) {\n return USDC_SOLANA_DEVNET;\n }\n const resolved = resolveKnownAsset('solana', normalized, mintString);\n if (!resolved) {\n const display = mintString ? `solana:${normalized}:${mintString}` : `solana:${normalized}`;\n throw new Error(\n `SKILL.md \"${skillName}\": unknown asset ${display}. ` +\n `Known assets: sol, usdc (devnet mint 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU).`,\n );\n }\n return resolved;\n}\n\nexport function parseSkillMd(content: string): {\n frontmatter: SkillFrontmatter;\n systemPrompt: string;\n} {\n const lines = content.split('\\n');\n let start = -1;\n let end = -1;\n\n for (let index = 0; index < lines.length; index++) {\n if (lines[index]?.trim() === '---') {\n if (start === -1) {\n start = index;\n } else {\n end = index;\n break;\n }\n }\n }\n\n if (start === -1 || end === -1) {\n throw new Error('SKILL.md must have YAML frontmatter between --- delimiters');\n }\n\n const yamlStr = lines.slice(start + 1, end).join('\\n');\n const frontmatter = YAML.parse(yamlStr) as SkillFrontmatter;\n const systemPrompt = lines\n .slice(end + 1)\n .join('\\n')\n .trim();\n return { frontmatter, systemPrompt };\n}\n\nfunction validateTool(raw: unknown, skillName: string, index: number): SkillToolDef {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error(`skill \"${skillName}\" tool[${index}] must be an object`);\n }\n const tool = raw as Record<string, unknown>;\n if (typeof tool.name !== 'string' || tool.name.length === 0) {\n throw new Error(`skill \"${skillName}\" tool[${index}] missing name`);\n }\n if (typeof tool.description !== 'string' || tool.description.length === 0) {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" missing description`);\n }\n if (!Array.isArray(tool.command) || tool.command.length === 0) {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" missing command[] array`);\n }\n for (const part of tool.command) {\n if (typeof part !== 'string') {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" command[] must be strings`);\n }\n }\n const parameters: SkillToolDef['parameters'] = [];\n if (tool.parameters !== undefined) {\n if (!Array.isArray(tool.parameters)) {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" parameters must be an array`);\n }\n for (let paramIndex = 0; paramIndex < tool.parameters.length; paramIndex++) {\n const param = tool.parameters[paramIndex];\n if (typeof param !== 'object' || param === null) {\n throw new Error(\n `skill \"${skillName}\" tool \"${tool.name}\" parameter[${paramIndex}] must be an object`,\n );\n }\n const record = param as Record<string, unknown>;\n if (typeof record.name !== 'string' || record.name.length === 0) {\n throw new Error(\n `skill \"${skillName}\" tool \"${tool.name}\" parameter[${paramIndex}] missing name`,\n );\n }\n if (typeof record.description !== 'string') {\n throw new Error(\n `skill \"${skillName}\" tool \"${tool.name}\" parameter \"${record.name}\" missing description`,\n );\n }\n parameters.push({\n name: record.name,\n description: record.description,\n required: record.required === undefined ? undefined : Boolean(record.required),\n });\n }\n }\n return {\n name: tool.name,\n description: tool.description,\n command: tool.command as string[],\n parameters,\n };\n}\n\nexport function validateSkillFrontmatter(\n frontmatter: SkillFrontmatter,\n systemPrompt: string,\n options: LoadSkillsOptions = {},\n): ParsedSkill {\n if (typeof frontmatter.name !== 'string' || frontmatter.name.length === 0) {\n throw new Error('SKILL.md: missing or invalid \"name\" field');\n }\n if (typeof frontmatter.description !== 'string' || frontmatter.description.length === 0) {\n throw new Error('SKILL.md: missing or invalid \"description\" field');\n }\n if (!Array.isArray(frontmatter.capabilities) || frontmatter.capabilities.length === 0) {\n throw new Error('SKILL.md: \"capabilities\" must be a non-empty array');\n }\n const capabilities: string[] = [];\n for (const capability of frontmatter.capabilities) {\n if (typeof capability !== 'string' || capability.length === 0) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": capability entries must be non-empty strings`,\n );\n }\n capabilities.push(capability);\n }\n\n const asset = resolveSkillAsset(frontmatter.name, frontmatter.token, frontmatter.mint);\n\n let priceSubunits: bigint;\n if (frontmatter.price === undefined || frontmatter.price === null) {\n if (!options.allowFreeSkills) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": \"price\" is required (${asset.symbol}; e.g. ${\n asset === NATIVE_SOL ? '0.002' : '0.05'\n }). Free skills are not supported on the protocol yet.`,\n );\n }\n priceSubunits = 0n;\n } else {\n const priceRaw = frontmatter.price;\n if (typeof priceRaw !== 'number' && typeof priceRaw !== 'string') {\n throw new Error(`SKILL.md \"${frontmatter.name}\": \"price\" must be a number or numeric string`);\n }\n const priceString = typeof priceRaw === 'number' ? String(priceRaw) : priceRaw;\n if (asset === NATIVE_SOL) {\n // Preserve historical rounding behaviour: number * LAMPORTS_PER_SOL +\n // Math.round. `parseAssetAmount` would reject non-positive inputs before\n // we could check `allowFreeSkills`, so we keep the legacy path for SOL\n // and introduce the strict parser only for new token types.\n priceSubunits = solToLamports(priceRaw);\n } else {\n try {\n priceSubunits = parseAssetAmount(asset, priceString);\n } catch (error) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n if (priceSubunits <= 0n && !options.allowFreeSkills) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": price must be > 0 ${asset.symbol} (got ${priceRaw}); free skills are not yet supported`,\n );\n }\n }\n\n const tools: SkillToolDef[] = [];\n if (frontmatter.tools !== undefined) {\n if (!Array.isArray(frontmatter.tools)) {\n throw new Error(`SKILL.md \"${frontmatter.name}\": \"tools\" must be an array`);\n }\n for (let index = 0; index < frontmatter.tools.length; index++) {\n tools.push(validateTool(frontmatter.tools[index], frontmatter.name, index));\n }\n }\n\n let maxToolRounds = DEFAULT_MAX_TOOL_ROUNDS;\n if (frontmatter.max_tool_rounds !== undefined) {\n if (\n typeof frontmatter.max_tool_rounds !== 'number' ||\n !Number.isInteger(frontmatter.max_tool_rounds) ||\n frontmatter.max_tool_rounds <= 0\n ) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": \"max_tool_rounds\" must be a positive integer`,\n );\n }\n maxToolRounds = frontmatter.max_tool_rounds;\n }\n\n const image = typeof frontmatter.image === 'string' ? frontmatter.image : undefined;\n const imageFile = typeof frontmatter.image_file === 'string' ? frontmatter.image_file : undefined;\n\n return {\n name: frontmatter.name,\n description: frontmatter.description,\n capabilities,\n priceSubunits,\n asset,\n systemPrompt,\n tools,\n maxToolRounds,\n image,\n imageFile,\n };\n}\n\n/**\n * Walk `skillsDir`, load each immediate subdirectory's SKILL.md, and\n * return constructed `ScriptSkill` instances. Malformed directories are\n * skipped with a `warn` log.\n */\nexport function loadSkillsFromDir(skillsDir: string, options: LoadSkillsOptions = {}): Skill[] {\n const logger = options.logger ?? {};\n const skills: Skill[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch (error) {\n logger.debug?.({ err: error, skillsDir }, 'skills directory not readable; no skills loaded');\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, options);\n skills.push(\n new ScriptSkill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: parsed.priceSubunits,\n asset: parsed.asset,\n skillDir: entryPath,\n systemPrompt: parsed.systemPrompt,\n tools: parsed.tools,\n maxToolRounds: parsed.maxToolRounds,\n image: parsed.image,\n imageFile: parsed.imageFile,\n logger,\n }),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn?.({ dir: entry, err: message }, 'skipping malformed skill directory');\n }\n }\n\n return skills;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/skills/llmClient.ts","../src/skills/scriptSkill.ts","../src/constants.ts","../src/payment/assets.ts","../src/skills/loader.ts"],"names":["spawn","StringDecoder","Decimal","YAML","readdirSync","join","statSync","readFileSync"],"mappings":"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","file":"skills.cjs","sourcesContent":["import type { CompletionResult, LlmClient, ToolCall, ToolDef, ToolResult } from './types';\n\nconst LLM_TIMEOUT_MS = 120_000;\nconst MAX_RETRIES = 2;\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\nconst DEFAULT_MAX_TOKENS = 4096;\nconst DEFAULT_ANTHROPIC_MODEL = 'claude-haiku-4-5-20251001';\nconst DEFAULT_OPENAI_MODEL = 'gpt-4o-mini';\n\nexport type LlmProvider = 'anthropic' | 'openai';\n\nexport interface LlmClientConfig {\n provider: LlmProvider;\n apiKey: string;\n model?: string;\n maxTokens?: number;\n}\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\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n signal?: AbortSignal,\n): Promise<Response> {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), LLM_TIMEOUT_MS);\n const onAbort = (): void => controller.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n }\n}\n\nasync 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 // Release the unread body so the fetch connection/stream resources do\n // not linger across the retry sleep.\n await response.body?.cancel().catch(() => undefined);\n await sleepWithSignal(delay, signal);\n }\n}\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n}\n\ninterface AnthropicResponse {\n content?: AnthropicContentBlock[];\n}\n\nclass AnthropicClient implements LlmClient {\n constructor(\n private readonly config: Required<Pick<LlmClientConfig, 'apiKey' | 'model' | 'maxTokens'>>,\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 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 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\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 OpenAIResponse {\n choices?: Array<{ message?: OpenAIMessage }>;\n}\n\nclass OpenAIClient implements LlmClient {\n constructor(\n private readonly config: Required<Pick<LlmClientConfig, 'apiKey' | 'model' | 'maxTokens'>>,\n ) {}\n\n private isReasoningModel(): boolean {\n return /^o\\d/.test(this.config.model);\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 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 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 function createAnthropicClient(config: Omit<LlmClientConfig, 'provider'>): LlmClient {\n if (!config.apiKey) {\n throw new Error('ANTHROPIC_API_KEY is required for skill runtime');\n }\n return new AnthropicClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_ANTHROPIC_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n });\n}\n\nexport function createOpenAIClient(config: Omit<LlmClientConfig, 'provider'>): LlmClient {\n if (!config.apiKey) {\n throw new Error('OPENAI_API_KEY is required for skill runtime');\n }\n return new OpenAIClient({\n apiKey: config.apiKey,\n model: config.model ?? DEFAULT_OPENAI_MODEL,\n maxTokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n });\n}\n\nexport function createLlmClient(config: LlmClientConfig): LlmClient {\n if (config.provider === 'openai') {\n return createOpenAIClient(config);\n }\n return createAnthropicClient(config);\n}\n","import { spawn } from 'node:child_process';\nimport { StringDecoder } from 'node:string_decoder';\nimport type { Asset } from '../payment/assets';\nimport type {\n CompletionResult,\n LlmClient,\n Skill,\n SkillContext,\n SkillInput,\n SkillOutput,\n ToolCall,\n ToolDef,\n ToolResult,\n} from './types';\n\nconst MAX_TOOL_OUTPUT = 1_000_000;\nconst TOOL_TIMEOUT_MS = 60_000;\n\nexport interface SkillToolDef {\n name: string;\n description: string;\n command: string[];\n parameters?: Array<{ name: string; description: string; required?: boolean }>;\n}\n\nexport interface ScriptSkillLogger {\n debug?(obj: Record<string, unknown>, msg?: string): void;\n}\n\nexport interface ScriptSkillParams {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: bigint;\n asset: Asset;\n skillDir: string;\n systemPrompt: string;\n tools: SkillToolDef[];\n maxToolRounds: number;\n image?: string;\n imageFile?: string;\n logger?: ScriptSkillLogger;\n}\n\n/**\n * LLM-orchestrated skill runner. Tools are external scripts launched\n * via `child_process.spawn` (without `shell: true`, so shell\n * metacharacters in arguments are never interpreted - a security\n * property, not a convenience). Windows users cannot rely on\n * shell-script shebangs; target Linux/macOS for scripts.\n */\nexport class ScriptSkill implements Skill {\n name: string;\n description: string;\n capabilities: string[];\n priceSubunits: bigint;\n asset: Asset;\n image?: string;\n imageFile?: string;\n private skillDir: string;\n private systemPrompt: string;\n private tools: SkillToolDef[];\n private maxToolRounds: number;\n private logger: ScriptSkillLogger;\n\n constructor(params: ScriptSkillParams) {\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.skillDir = params.skillDir;\n this.systemPrompt = params.systemPrompt;\n this.tools = params.tools;\n this.maxToolRounds = params.maxToolRounds;\n this.logger = params.logger ?? {};\n }\n\n async execute(input: SkillInput, ctx: SkillContext): Promise<SkillOutput> {\n if (!ctx.llm) {\n throw new Error('LLM client not configured for skill runtime');\n }\n\n if (this.tools.length === 0) {\n const result = await ctx.llm.complete(this.systemPrompt, input.data, ctx.signal);\n return { data: result };\n }\n\n const toolDefs: ToolDef[] = this.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: (tool.parameters ?? []).map((param) => ({\n name: param.name,\n description: param.description,\n required: param.required ?? true,\n })),\n }));\n\n const messages: unknown[] = [{ role: 'user', content: input.data }];\n const llm: LlmClient = ctx.llm;\n\n for (let round = 0; round < this.maxToolRounds; round++) {\n if (ctx.signal?.aborted) {\n throw new Error('Job aborted');\n }\n const result: CompletionResult = await llm.completeWithTools(\n this.systemPrompt,\n messages,\n toolDefs,\n ctx.signal,\n );\n\n if (result.type === 'text') {\n return { data: result.text };\n }\n\n messages.push(result.assistantMessage);\n\n const toolResults: ToolResult[] = [];\n for (const call of result.calls) {\n const toolDef = this.tools.find((tool) => tool.name === call.name);\n if (!toolDef) {\n toolResults.push({\n callId: call.id,\n content: `Error: unknown tool \"${call.name}\"`,\n });\n continue;\n }\n const output = await this.runTool(toolDef, call, ctx.signal);\n toolResults.push({ callId: call.id, content: output });\n }\n\n messages.push(...llm.formatToolResultMessages(toolResults));\n }\n\n throw new Error(`Max tool rounds (${this.maxToolRounds}) exceeded`);\n }\n\n private runTool(toolDef: SkillToolDef, call: ToolCall, signal?: AbortSignal): Promise<string> {\n return new Promise((resolve) => {\n const args = [...toolDef.command];\n const cmd = args.shift();\n if (!cmd) {\n resolve(`Error: tool \"${toolDef.name}\" has an empty command`);\n return;\n }\n\n const params = toolDef.parameters ?? [];\n for (let index = 0; index < params.length; index++) {\n const param = params[index];\n if (!param) {\n continue;\n }\n const value = call.arguments[param.name];\n if (value === undefined) {\n continue;\n }\n if (param.required && index === 0) {\n args.push(String(value));\n } else {\n args.push(`--${param.name}`, String(value));\n }\n }\n\n const child = spawn(cmd, args, {\n cwd: this.skillDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: TOOL_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n signal,\n });\n\n let stdout = '';\n let stderr = '';\n const stdoutDecoder = new StringDecoder('utf8');\n const stderrDecoder = new StringDecoder('utf8');\n\n child.stdout?.on('data', (data: Buffer) => {\n if (stdout.length < MAX_TOOL_OUTPUT) {\n stdout += stdoutDecoder.write(data);\n if (stdout.length > MAX_TOOL_OUTPUT) {\n stdout = stdout.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n child.stderr?.on('data', (data: Buffer) => {\n if (stderr.length < MAX_TOOL_OUTPUT) {\n stderr += stderrDecoder.write(data);\n if (stderr.length > MAX_TOOL_OUTPUT) {\n stderr = stderr.slice(0, MAX_TOOL_OUTPUT);\n }\n }\n });\n\n child.on('close', (code) => {\n // Flush any bytes the decoder buffered because a multi-byte UTF-8\n // codepoint straddled the final chunk boundary.\n stdout += stdoutDecoder.end();\n stderr += stderrDecoder.end();\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n this.logger.debug?.(\n { tool: toolDef.name, code, stderrLen: stderr.length },\n 'skill tool exited non-zero',\n );\n resolve(`Error (exit ${code}): ${stderr.trim() || stdout.trim()}`);\n });\n\n child.on('error', (err) => {\n resolve(`Error: ${err.message}`);\n });\n });\n }\n}\n","import type { Address } from '@solana/kit';\n\nexport const RELAYS = [\n 'wss://relay.damus.io',\n 'wss://nos.lol',\n 'wss://relay.nostr.band',\n 'wss://relay.primal.net',\n 'wss://relay.snort.social',\n];\n\nexport const KIND_APP_HANDLER = 31990;\nexport const KIND_JOB_REQUEST_BASE = 5000;\nexport const KIND_JOB_RESULT_BASE = 6000;\nexport const KIND_JOB_FEEDBACK = 7000;\nexport const DEFAULT_KIND_OFFSET = 100;\n\n/** Default job request kind (5000 + 100). */\nexport const KIND_JOB_REQUEST = KIND_JOB_REQUEST_BASE + DEFAULT_KIND_OFFSET;\n/** Default job result kind (6000 + 100). */\nexport const KIND_JOB_RESULT = KIND_JOB_RESULT_BASE + DEFAULT_KIND_OFFSET;\n\n/** Compute a job request kind from an offset (5000 + offset). */\nexport function jobRequestKind(offset: number): number {\n if (!Number.isInteger(offset) || offset < 0 || offset >= 1000) {\n throw new Error(`Invalid kind offset: ${offset}. Must be integer 0-999.`);\n }\n return KIND_JOB_REQUEST_BASE + offset;\n}\n\n/** Compute a job result kind from an offset (6000 + offset). */\nexport function jobResultKind(offset: number): number {\n if (!Number.isInteger(offset) || offset < 0 || offset >= 1000) {\n throw new Error(`Invalid kind offset: ${offset}. Must be integer 0-999.`);\n }\n return KIND_JOB_RESULT_BASE + offset;\n}\n\n/** Ephemeral ping/pong kinds (not stored by relays, forwarded in real-time). */\nexport const KIND_PING = 20200;\nexport const KIND_PONG = 20201;\n\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\n/**\n * Solana program ID for the elisym protocol config (devnet deployment).\n *\n * The Anchor program at this address is the source of truth for fee bps,\n * treasury address, and admin rotation state. Read via `getProtocolConfig`.\n */\nexport const PROTOCOL_PROGRAM_ID_DEVNET = 'BrX1CRkSgvcjxBvc2bgc3QqgWjinusofDmeP7ZVxvwrE' as Address;\n\n/**\n * Read-only marker pubkey attached as a non-signer account to every elisym\n * payment transaction. Lets indexers enumerate every elisym tx network-wide\n * via a single `getSignaturesForAddress(ELISYM_PROTOCOL_TAG)` call,\n * independent of fee size or recipient.\n *\n * The account does not need to exist on-chain; including its pubkey as an\n * extra read-only account in the provider transfer instruction is enough for\n * Solana's tx-by-account index to pick it up. The corresponding secret key\n * was generated and discarded - the tag never signs and never holds funds.\n */\nexport const ELISYM_PROTOCOL_TAG = 'ELiZksgwDt41LaeuPDLkUfWgFXhGgVayTMP7L5nTSEL8' as Address;\n\nexport type ProtocolCluster = 'devnet' | 'mainnet' | 'localnet';\n\n/**\n * Resolve the elisym-config program ID for a given Solana cluster.\n * Mainnet is intentionally unsupported until the program ships there.\n */\nexport function getProtocolProgramId(cluster: ProtocolCluster): Address {\n switch (cluster) {\n case 'devnet':\n case 'localnet':\n return PROTOCOL_PROGRAM_ID_DEVNET;\n case 'mainnet':\n throw new Error('Protocol program is not deployed on mainnet yet');\n }\n}\n\n/** Default values for timeouts, retries, and batch sizes. */\nexport const DEFAULTS = {\n SUBSCRIPTION_TIMEOUT_MS: 120_000,\n PING_TIMEOUT_MS: 3_000,\n PING_RETRIES: 2,\n PING_CACHE_TTL_MS: 30_000,\n PAYMENT_EXPIRY_SECS: 600,\n BATCH_SIZE: 250,\n QUERY_TIMEOUT_MS: 15_000,\n EOSE_TIMEOUT_MS: 3_000,\n VERIFY_RETRIES: 10,\n VERIFY_INTERVAL_MS: 3_000,\n VERIFY_BY_REF_RETRIES: 15,\n VERIFY_BY_REF_INTERVAL_MS: 2_000,\n RESULT_RETRY_COUNT: 3,\n RESULT_RETRY_BASE_MS: 1_000,\n QUERY_MAX_CONCURRENCY: 6,\n VERIFY_SIGNATURE_LIMIT: 25,\n} as const;\n\n/** Protocol limits for input validation. */\nexport const LIMITS = {\n MAX_INPUT_LENGTH: 100_000,\n MAX_TIMEOUT_SECS: 600,\n MAX_CAPABILITIES: 20,\n MAX_DESCRIPTION_LENGTH: 500,\n MAX_AGENT_NAME_LENGTH: 64,\n MAX_CAPABILITY_LENGTH: 64,\n} as const;\n","/**\n * Multi-asset / multi-chain payment model.\n *\n * `Asset` describes a currency a customer can spend: native coins (SOL, ETH, BTC)\n * or tokens (SPL, ERC-20). `assetKey` produces a stable string id for Map lookups.\n *\n * Today only `NATIVE_SOL` is in `KNOWN_ASSETS`. SPL (USDC) and other chains are\n * extended by adding entries to `KNOWN_ASSETS` and, where relevant, to the\n * MCP `DEFAULT_SESSION_LIMITS` catalogue.\n */\n\nimport Decimal from 'decimal.js-light';\n\nexport type Chain = 'solana';\n\nexport interface Asset {\n chain: Chain;\n /** Lowercase token id: 'sol', 'usdc', 'btc', 'eth'. */\n token: string;\n /** SPL mint / ERC-20 contract. Undefined for a native coin. */\n mint?: string;\n /** Subunits per whole (9 SOL, 6 USDC, 8 BTC, 18 ETH). */\n decimals: number;\n /** Display symbol: 'SOL', 'USDC'. */\n symbol: string;\n}\n\nexport const NATIVE_SOL: Asset = {\n chain: 'solana',\n token: 'sol',\n decimals: 9,\n symbol: 'SOL',\n};\n\nexport const USDC_SOLANA_DEVNET: Asset = {\n chain: 'solana',\n token: 'usdc',\n mint: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n decimals: 6,\n symbol: 'USDC',\n};\n\nexport const KNOWN_ASSETS: readonly Asset[] = [NATIVE_SOL, USDC_SOLANA_DEVNET];\n\n/** Stable Map key for `Asset`. Same shape regardless of Asset identity. */\nexport function assetKey(a: Pick<Asset, 'chain' | 'token' | 'mint'>): string {\n return a.mint ? `${a.chain}:${a.token}:${a.mint}` : `${a.chain}:${a.token}`;\n}\n\n/** Find a known asset by (chain, token, mint). Returns undefined if unknown. */\nexport function resolveKnownAsset(chain: string, token: string, mint?: string): Asset | undefined {\n const key = mint ? `${chain}:${token}:${mint}` : `${chain}:${token}`;\n return KNOWN_ASSETS.find((asset) => assetKey(asset) === key);\n}\n\n/** Reverse lookup: given an assetKey string, return the known asset or undefined. */\nexport function assetByKey(key: string): Asset | undefined {\n return KNOWN_ASSETS.find((asset) => assetKey(asset) === key);\n}\n\n/**\n * Resolve the asset a payment request targets. Returns `NATIVE_SOL` when the\n * request has no `asset` field (back-compat with payment requests published\n * before multi-asset support). Throws when `asset` is present but refers to an\n * asset that isn't in `KNOWN_ASSETS` - callers that want to tolerate unknown\n * assets should check `resolveKnownAsset` directly instead.\n */\nexport function resolveAssetFromPaymentRequest(request: {\n asset?: { chain: string; token: string; mint?: string };\n}): Asset {\n if (!request.asset) {\n return NATIVE_SOL;\n }\n const found = resolveKnownAsset(request.asset.chain, request.asset.token, request.asset.mint);\n if (!found) {\n const display = request.asset.mint\n ? `${request.asset.chain}:${request.asset.token}:${request.asset.mint}`\n : `${request.asset.chain}:${request.asset.token}`;\n throw new Error(\n `Unknown asset in payment request: ${display}. ` +\n `Known assets: ${KNOWN_ASSETS.map(assetKey).join(', ')}`,\n );\n }\n return found;\n}\n\nconst DECIMAL_RE = /^(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)$/;\n\n/**\n * Parse a human amount string (\"0.5\", \"1\", \"0.000001\") into raw subunits (BigInt).\n * Uses integer math to avoid float precision issues.\n *\n * Throws on: empty, negative, zero, malformed, too many fractional digits, or\n * a value exceeding `Number.MAX_SAFE_INTEGER` (to keep downstream `Number(...)`\n * call-sites safe).\n */\nexport function parseAssetAmount(asset: Asset, human: string): bigint {\n const trimmed = human.trim();\n if (!trimmed) {\n throw new Error(`${asset.symbol} amount is empty`);\n }\n if (trimmed.startsWith('-')) {\n throw new Error(`${asset.symbol} amount cannot be negative`);\n }\n if (!DECIMAL_RE.test(trimmed)) {\n throw new Error(\n `${asset.symbol} amount must be a non-negative decimal (e.g. \"0.5\", \"1\"); got \"${human}\"`,\n );\n }\n\n const dotPos = trimmed.indexOf('.');\n let wholePart: string;\n if (dotPos === -1) {\n wholePart = trimmed;\n } else if (dotPos === 0) {\n wholePart = '0';\n } else {\n wholePart = trimmed.slice(0, dotPos);\n }\n const fracPart = dotPos === -1 ? '' : trimmed.slice(dotPos + 1);\n\n if (fracPart.length > asset.decimals) {\n throw new Error(\n `${asset.symbol} amount has too many decimals (max ${asset.decimals}); got \"${human}\"`,\n );\n }\n\n const unit = 10n ** BigInt(asset.decimals);\n const whole = BigInt(wholePart);\n const frac = fracPart ? BigInt(fracPart.padEnd(asset.decimals, '0')) : 0n;\n const raw = whole * unit + frac;\n\n if (raw === 0n) {\n throw new Error(`${asset.symbol} amount must be positive; got \"${human}\"`);\n }\n if (raw > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(\n `${asset.symbol} amount exceeds safe range (max ${Number.MAX_SAFE_INTEGER} subunits)`,\n );\n }\n return raw;\n}\n\n// Cloned config keeps `Decimal.toString()` from switching to exponential notation\n// for small fractional amounts (e.g. 1 lamport = 1e-9 SOL).\nconst FormatDecimal = Decimal.clone({ toExpNeg: -100, toExpPos: 100, precision: 50 });\n\n/**\n * Format raw subunits back to `\"<value> <SYMBOL>\"`. Trailing zeros and a bare\n * trailing dot are stripped, so 0.01 USDC renders as `\"0.01 USDC\"` rather than\n * `\"0.010000 USDC\"`.\n */\nexport function formatAssetAmount(asset: Asset, raw: bigint): string {\n const value = new FormatDecimal(raw.toString()).div(new FormatDecimal(10).pow(asset.decimals));\n return `${value.toString()} ${asset.symbol}`;\n}\n","import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport YAML from 'yaml';\nimport { LAMPORTS_PER_SOL } from '../constants';\nimport {\n type Asset,\n NATIVE_SOL,\n USDC_SOLANA_DEVNET,\n parseAssetAmount,\n resolveKnownAsset,\n} from '../payment/assets';\nimport { ScriptSkill, type SkillToolDef } from './scriptSkill';\nimport type { Skill } from './types';\n\nexport const DEFAULT_MAX_TOOL_ROUNDS = 10;\n\nexport interface SkillFrontmatter {\n name?: unknown;\n description?: unknown;\n capabilities?: unknown;\n price?: unknown;\n /** Lowercase token id ('sol', 'usdc'). Defaults to 'sol' for back-compat. */\n token?: unknown;\n /** SPL mint (base58). Optional - resolved from known assets when omitted. */\n mint?: unknown;\n image?: unknown;\n image_file?: unknown;\n tools?: unknown;\n max_tool_rounds?: unknown;\n}\n\nexport interface ParsedSkill {\n name: string;\n description: string;\n capabilities: string[];\n /** Price in subunits of `asset`. */\n priceSubunits: bigint;\n asset: Asset;\n systemPrompt: string;\n tools: SkillToolDef[];\n maxToolRounds: number;\n image?: string;\n imageFile?: string;\n}\n\nexport interface LoaderLogger {\n debug?(obj: Record<string, unknown>, msg?: string): void;\n warn?(obj: Record<string, unknown>, msg?: string): void;\n}\n\nexport interface LoadSkillsOptions {\n /**\n * When true, SKILL.md may declare `price: 0` or omit `price` entirely\n * and the skill is loaded as free (`priceLamports === 0n`). Default\n * false: paid-only (plugin's historical behaviour).\n */\n allowFreeSkills?: boolean;\n logger?: LoaderLogger;\n}\n\nfunction solToLamports(sol: string | number): bigint {\n const asNumber = typeof sol === 'string' ? Number(sol) : sol;\n if (!Number.isFinite(asNumber) || asNumber < 0) {\n throw new Error(`Invalid SOL amount: ${sol}`);\n }\n return BigInt(Math.round(asNumber * LAMPORTS_PER_SOL));\n}\n\n/**\n * Resolve the asset a SKILL.md declares.\n *\n * - `token` absent or `'sol'` => native SOL (NATIVE_SOL).\n * - `token: 'usdc'` (+ optional `mint`) => resolved via `resolveKnownAsset`;\n * falls back to `USDC_SOLANA_DEVNET` when `mint` is omitted so operators\n * don't need to memorize the devnet mint address.\n * - Any unknown `token` throws.\n */\nfunction resolveSkillAsset(skillName: string, token: unknown, mint: unknown): Asset {\n if (token === undefined || token === null) {\n return NATIVE_SOL;\n }\n if (typeof token !== 'string' || token.length === 0) {\n throw new Error(`SKILL.md \"${skillName}\": \"token\" must be a non-empty string`);\n }\n let mintString: string | undefined;\n if (mint === undefined || mint === null) {\n mintString = undefined;\n } else if (typeof mint === 'string') {\n mintString = mint;\n } else {\n throw new Error(`SKILL.md \"${skillName}\": \"mint\" must be a base58 string`);\n }\n\n const normalized = token.toLowerCase();\n if (normalized === 'sol') {\n return NATIVE_SOL;\n }\n if (normalized === 'usdc' && mintString === undefined) {\n return USDC_SOLANA_DEVNET;\n }\n const resolved = resolveKnownAsset('solana', normalized, mintString);\n if (!resolved) {\n const display = mintString ? `solana:${normalized}:${mintString}` : `solana:${normalized}`;\n throw new Error(\n `SKILL.md \"${skillName}\": unknown asset ${display}. ` +\n `Known assets: sol, usdc (devnet mint 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU).`,\n );\n }\n return resolved;\n}\n\nexport function parseSkillMd(content: string): {\n frontmatter: SkillFrontmatter;\n systemPrompt: string;\n} {\n const lines = content.split('\\n');\n let start = -1;\n let end = -1;\n\n for (let index = 0; index < lines.length; index++) {\n if (lines[index]?.trim() === '---') {\n if (start === -1) {\n start = index;\n } else {\n end = index;\n break;\n }\n }\n }\n\n if (start === -1 || end === -1) {\n throw new Error('SKILL.md must have YAML frontmatter between --- delimiters');\n }\n\n const yamlStr = lines.slice(start + 1, end).join('\\n');\n const frontmatter = YAML.parse(yamlStr) as SkillFrontmatter;\n const systemPrompt = lines\n .slice(end + 1)\n .join('\\n')\n .trim();\n return { frontmatter, systemPrompt };\n}\n\nfunction validateTool(raw: unknown, skillName: string, index: number): SkillToolDef {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error(`skill \"${skillName}\" tool[${index}] must be an object`);\n }\n const tool = raw as Record<string, unknown>;\n if (typeof tool.name !== 'string' || tool.name.length === 0) {\n throw new Error(`skill \"${skillName}\" tool[${index}] missing name`);\n }\n if (typeof tool.description !== 'string' || tool.description.length === 0) {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" missing description`);\n }\n if (!Array.isArray(tool.command) || tool.command.length === 0) {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" missing command[] array`);\n }\n for (const part of tool.command) {\n if (typeof part !== 'string') {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" command[] must be strings`);\n }\n }\n const parameters: SkillToolDef['parameters'] = [];\n if (tool.parameters !== undefined) {\n if (!Array.isArray(tool.parameters)) {\n throw new Error(`skill \"${skillName}\" tool \"${tool.name}\" parameters must be an array`);\n }\n for (let paramIndex = 0; paramIndex < tool.parameters.length; paramIndex++) {\n const param = tool.parameters[paramIndex];\n if (typeof param !== 'object' || param === null) {\n throw new Error(\n `skill \"${skillName}\" tool \"${tool.name}\" parameter[${paramIndex}] must be an object`,\n );\n }\n const record = param as Record<string, unknown>;\n if (typeof record.name !== 'string' || record.name.length === 0) {\n throw new Error(\n `skill \"${skillName}\" tool \"${tool.name}\" parameter[${paramIndex}] missing name`,\n );\n }\n if (typeof record.description !== 'string') {\n throw new Error(\n `skill \"${skillName}\" tool \"${tool.name}\" parameter \"${record.name}\" missing description`,\n );\n }\n parameters.push({\n name: record.name,\n description: record.description,\n required: record.required === undefined ? undefined : Boolean(record.required),\n });\n }\n }\n return {\n name: tool.name,\n description: tool.description,\n command: tool.command as string[],\n parameters,\n };\n}\n\nexport function validateSkillFrontmatter(\n frontmatter: SkillFrontmatter,\n systemPrompt: string,\n options: LoadSkillsOptions = {},\n): ParsedSkill {\n if (typeof frontmatter.name !== 'string' || frontmatter.name.length === 0) {\n throw new Error('SKILL.md: missing or invalid \"name\" field');\n }\n if (typeof frontmatter.description !== 'string' || frontmatter.description.length === 0) {\n throw new Error('SKILL.md: missing or invalid \"description\" field');\n }\n if (!Array.isArray(frontmatter.capabilities) || frontmatter.capabilities.length === 0) {\n throw new Error('SKILL.md: \"capabilities\" must be a non-empty array');\n }\n const capabilities: string[] = [];\n for (const capability of frontmatter.capabilities) {\n if (typeof capability !== 'string' || capability.length === 0) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": capability entries must be non-empty strings`,\n );\n }\n capabilities.push(capability);\n }\n\n const asset = resolveSkillAsset(frontmatter.name, frontmatter.token, frontmatter.mint);\n\n let priceSubunits: bigint;\n if (frontmatter.price === undefined || frontmatter.price === null) {\n if (!options.allowFreeSkills) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": \"price\" is required (${asset.symbol}; e.g. ${\n asset === NATIVE_SOL ? '0.002' : '0.05'\n }). Free skills are not supported on the protocol yet.`,\n );\n }\n priceSubunits = 0n;\n } else {\n const priceRaw = frontmatter.price;\n if (typeof priceRaw !== 'number' && typeof priceRaw !== 'string') {\n throw new Error(`SKILL.md \"${frontmatter.name}\": \"price\" must be a number or numeric string`);\n }\n const priceString = typeof priceRaw === 'number' ? String(priceRaw) : priceRaw;\n if (asset === NATIVE_SOL) {\n // Preserve historical rounding behaviour: number * LAMPORTS_PER_SOL +\n // Math.round. `parseAssetAmount` would reject non-positive inputs before\n // we could check `allowFreeSkills`, so we keep the legacy path for SOL\n // and introduce the strict parser only for new token types.\n priceSubunits = solToLamports(priceRaw);\n } else {\n try {\n priceSubunits = parseAssetAmount(asset, priceString);\n } catch (error) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n if (priceSubunits <= 0n && !options.allowFreeSkills) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": price must be > 0 ${asset.symbol} (got ${priceRaw}); free skills are not yet supported`,\n );\n }\n }\n\n const tools: SkillToolDef[] = [];\n if (frontmatter.tools !== undefined) {\n if (!Array.isArray(frontmatter.tools)) {\n throw new Error(`SKILL.md \"${frontmatter.name}\": \"tools\" must be an array`);\n }\n for (let index = 0; index < frontmatter.tools.length; index++) {\n tools.push(validateTool(frontmatter.tools[index], frontmatter.name, index));\n }\n }\n\n let maxToolRounds = DEFAULT_MAX_TOOL_ROUNDS;\n if (frontmatter.max_tool_rounds !== undefined) {\n if (\n typeof frontmatter.max_tool_rounds !== 'number' ||\n !Number.isInteger(frontmatter.max_tool_rounds) ||\n frontmatter.max_tool_rounds <= 0\n ) {\n throw new Error(\n `SKILL.md \"${frontmatter.name}\": \"max_tool_rounds\" must be a positive integer`,\n );\n }\n maxToolRounds = frontmatter.max_tool_rounds;\n }\n\n const image = typeof frontmatter.image === 'string' ? frontmatter.image : undefined;\n const imageFile = typeof frontmatter.image_file === 'string' ? frontmatter.image_file : undefined;\n\n return {\n name: frontmatter.name,\n description: frontmatter.description,\n capabilities,\n priceSubunits,\n asset,\n systemPrompt,\n tools,\n maxToolRounds,\n image,\n imageFile,\n };\n}\n\n/**\n * Walk `skillsDir`, load each immediate subdirectory's SKILL.md, and\n * return constructed `ScriptSkill` instances. Malformed directories are\n * skipped with a `warn` log.\n */\nexport function loadSkillsFromDir(skillsDir: string, options: LoadSkillsOptions = {}): Skill[] {\n const logger = options.logger ?? {};\n const skills: Skill[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(skillsDir);\n } catch (error) {\n logger.debug?.({ err: error, skillsDir }, 'skills directory not readable; no skills loaded');\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, options);\n skills.push(\n new ScriptSkill({\n name: parsed.name,\n description: parsed.description,\n capabilities: parsed.capabilities,\n priceSubunits: parsed.priceSubunits,\n asset: parsed.asset,\n skillDir: entryPath,\n systemPrompt: parsed.systemPrompt,\n tools: parsed.tools,\n maxToolRounds: parsed.maxToolRounds,\n image: parsed.image,\n imageFile: parsed.imageFile,\n logger,\n }),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn?.({ dir: entry, err: message }, 'skipping malformed skill directory');\n }\n }\n\n return skills;\n}\n"]}
|