@chucky.cloud/sdk 0.2.5 → 0.3.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.
Files changed (95) hide show
  1. package/README.md +6 -1
  2. package/dist/browser.cjs +1361 -0
  3. package/dist/browser.cjs.map +1 -0
  4. package/dist/browser.d.cts +1 -0
  5. package/dist/browser.d.ts +1 -8
  6. package/dist/browser.js +1278 -11
  7. package/dist/browser.js.map +1 -1
  8. package/dist/index.cjs +1361 -0
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.cts +1973 -0
  11. package/dist/index.d.ts +1953 -48
  12. package/dist/index.js +1278 -72
  13. package/dist/index.js.map +1 -1
  14. package/dist/node.cjs +1361 -0
  15. package/dist/node.cjs.map +1 -0
  16. package/dist/node.d.cts +1 -0
  17. package/dist/node.d.ts +1 -8
  18. package/dist/node.js +1278 -10
  19. package/dist/node.js.map +1 -1
  20. package/package.json +31 -9
  21. package/dist/browser.d.ts.map +0 -1
  22. package/dist/client/ChuckyClient.d.ts +0 -141
  23. package/dist/client/ChuckyClient.d.ts.map +0 -1
  24. package/dist/client/ChuckyClient.js +0 -209
  25. package/dist/client/ChuckyClient.js.map +0 -1
  26. package/dist/client/Session.d.ts +0 -167
  27. package/dist/client/Session.d.ts.map +0 -1
  28. package/dist/client/Session.js +0 -392
  29. package/dist/client/Session.js.map +0 -1
  30. package/dist/client/index.d.ts +0 -10
  31. package/dist/client/index.d.ts.map +0 -1
  32. package/dist/client/index.js +0 -9
  33. package/dist/client/index.js.map +0 -1
  34. package/dist/index.d.ts.map +0 -1
  35. package/dist/node.d.ts.map +0 -1
  36. package/dist/tools/McpServer.d.ts +0 -117
  37. package/dist/tools/McpServer.d.ts.map +0 -1
  38. package/dist/tools/McpServer.js +0 -142
  39. package/dist/tools/McpServer.js.map +0 -1
  40. package/dist/tools/index.d.ts +0 -9
  41. package/dist/tools/index.d.ts.map +0 -1
  42. package/dist/tools/index.js +0 -8
  43. package/dist/tools/index.js.map +0 -1
  44. package/dist/tools/tool.d.ts +0 -146
  45. package/dist/tools/tool.d.ts.map +0 -1
  46. package/dist/tools/tool.js +0 -232
  47. package/dist/tools/tool.js.map +0 -1
  48. package/dist/transport/Transport.d.ts +0 -82
  49. package/dist/transport/Transport.d.ts.map +0 -1
  50. package/dist/transport/Transport.js +0 -47
  51. package/dist/transport/Transport.js.map +0 -1
  52. package/dist/transport/WebSocketTransport.d.ts +0 -78
  53. package/dist/transport/WebSocketTransport.d.ts.map +0 -1
  54. package/dist/transport/WebSocketTransport.js +0 -258
  55. package/dist/transport/WebSocketTransport.js.map +0 -1
  56. package/dist/transport/index.d.ts +0 -10
  57. package/dist/transport/index.d.ts.map +0 -1
  58. package/dist/transport/index.js +0 -8
  59. package/dist/transport/index.js.map +0 -1
  60. package/dist/types/index.d.ts +0 -12
  61. package/dist/types/index.d.ts.map +0 -1
  62. package/dist/types/index.js +0 -8
  63. package/dist/types/index.js.map +0 -1
  64. package/dist/types/messages.d.ts +0 -327
  65. package/dist/types/messages.d.ts.map +0 -1
  66. package/dist/types/messages.js +0 -133
  67. package/dist/types/messages.js.map +0 -1
  68. package/dist/types/options.d.ts +0 -212
  69. package/dist/types/options.d.ts.map +0 -1
  70. package/dist/types/options.js +0 -8
  71. package/dist/types/options.js.map +0 -1
  72. package/dist/types/results.d.ts +0 -186
  73. package/dist/types/results.d.ts.map +0 -1
  74. package/dist/types/results.js +0 -7
  75. package/dist/types/results.js.map +0 -1
  76. package/dist/types/token.d.ts +0 -124
  77. package/dist/types/token.d.ts.map +0 -1
  78. package/dist/types/token.js +0 -7
  79. package/dist/types/token.js.map +0 -1
  80. package/dist/types/tools.d.ts +0 -234
  81. package/dist/types/tools.d.ts.map +0 -1
  82. package/dist/types/tools.js +0 -31
  83. package/dist/types/tools.js.map +0 -1
  84. package/dist/utils/errors.d.ts +0 -80
  85. package/dist/utils/errors.d.ts.map +0 -1
  86. package/dist/utils/errors.js +0 -158
  87. package/dist/utils/errors.js.map +0 -1
  88. package/dist/utils/index.d.ts +0 -8
  89. package/dist/utils/index.d.ts.map +0 -1
  90. package/dist/utils/index.js +0 -8
  91. package/dist/utils/index.js.map +0 -1
  92. package/dist/utils/token.d.ts +0 -104
  93. package/dist/utils/token.d.ts.map +0 -1
  94. package/dist/utils/token.js +0 -209
  95. package/dist/utils/token.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/node.ts","../src/types/messages.ts","../src/transport/Transport.ts","../src/transport/WebSocketTransport.ts","../src/client/Session.ts","../src/client/ChuckyClient.ts","../src/tools/tool.ts","../src/tools/McpServer.ts","../src/utils/token.ts","../src/utils/errors.ts"],"sourcesContent":["/**\n * Node.js Entry Point\n *\n * Optimized exports for Node.js environments.\n * Includes all functionality including token creation.\n */\n\n// Re-export everything from main index\nexport * from './index.js';\n\n// Node.js-specific note: Uses 'ws' package for WebSocket\n// and Node.js crypto module for token signing.\n","/**\n * WebSocket Message Types\n *\n * Matches the official Claude Agent SDK message format.\n * See: https://platform.claude.com/docs/en/agent-sdk/typescript\n */\n\nimport type { ToolCall, ToolResult } from './tools.js';\nimport type { SessionOptions } from './options.js';\n\n// ============================================================================\n// Core Types (matching official SDK)\n// ============================================================================\n\nexport type UUID = string;\n\n/**\n * Anthropic API message content types\n */\nexport type TextContent = {\n type: 'text';\n text: string;\n};\n\nexport type ImageContent = {\n type: 'image';\n source: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n};\n\nexport type ToolUseContent = {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type ToolResultContent = {\n type: 'tool_result';\n tool_use_id: string;\n content: string | Array<TextContent | ImageContent>;\n is_error?: boolean;\n};\n\nexport type ContentBlock = TextContent | ImageContent | ToolUseContent | ToolResultContent;\n\n/**\n * Anthropic API User Message\n */\nexport interface APIUserMessage {\n role: 'user';\n content: string | ContentBlock[];\n}\n\n/**\n * Anthropic API Assistant Message\n */\nexport interface APIAssistantMessage {\n role: 'assistant';\n content: ContentBlock[];\n}\n\n// ============================================================================\n// SDK Message Types (matching official SDK)\n// ============================================================================\n\n/**\n * User message - sent by the client\n */\nexport interface SDKUserMessage {\n type: 'user';\n uuid?: UUID;\n session_id: string;\n message: APIUserMessage;\n parent_tool_use_id: string | null;\n}\n\n/**\n * Assistant message - response from Claude\n */\nexport interface SDKAssistantMessage {\n type: 'assistant';\n uuid: UUID;\n session_id: string;\n message: APIAssistantMessage;\n parent_tool_use_id: string | null;\n}\n\n/**\n * Result message subtypes\n */\nexport type ResultSubtype =\n | 'success'\n | 'error_max_turns'\n | 'error_during_execution'\n | 'error_max_budget_usd'\n | 'error_max_structured_output_retries';\n\n/**\n * Success result message\n */\nexport interface SDKResultMessageSuccess {\n type: 'result';\n subtype: 'success';\n uuid: UUID;\n session_id: string;\n duration_ms: number;\n duration_api_ms: number;\n is_error: boolean;\n num_turns: number;\n result: string;\n total_cost_usd: number;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n };\n structured_output?: unknown;\n}\n\n/**\n * Error result message\n */\nexport interface SDKResultMessageError {\n type: 'result';\n subtype: Exclude<ResultSubtype, 'success'>;\n uuid: UUID;\n session_id: string;\n duration_ms: number;\n duration_api_ms: number;\n is_error: boolean;\n num_turns: number;\n total_cost_usd: number;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n };\n errors: string[];\n}\n\nexport type SDKResultMessage = SDKResultMessageSuccess | SDKResultMessageError;\n\n/**\n * System message subtypes\n */\nexport type SystemSubtype = 'init' | 'compact_boundary';\n\n/**\n * System init message\n */\nexport interface SDKSystemMessageInit {\n type: 'system';\n subtype: 'init';\n uuid: UUID;\n session_id: string;\n cwd: string;\n tools: string[];\n mcp_servers: Array<{\n name: string;\n status: string;\n }>;\n model: string;\n permissionMode: string;\n}\n\n/**\n * System compact boundary message\n */\nexport interface SDKSystemMessageCompact {\n type: 'system';\n subtype: 'compact_boundary';\n uuid: UUID;\n session_id: string;\n compact_metadata: {\n trigger: 'manual' | 'auto';\n pre_tokens: number;\n };\n}\n\nexport type SDKSystemMessage = SDKSystemMessageInit | SDKSystemMessageCompact;\n\n/**\n * Partial assistant message (streaming)\n */\nexport interface SDKPartialAssistantMessage {\n type: 'stream_event';\n event: unknown; // RawMessageStreamEvent from Anthropic SDK\n parent_tool_use_id: string | null;\n uuid: UUID;\n session_id: string;\n}\n\n// ============================================================================\n// Union Types\n// ============================================================================\n\n/**\n * All SDK message types (matching official SDK)\n */\nexport type SDKMessage =\n | SDKUserMessage\n | SDKAssistantMessage\n | SDKResultMessage\n | SDKSystemMessage\n | SDKPartialAssistantMessage;\n\n// ============================================================================\n// WebSocket Envelope Types (for our transport layer)\n// ============================================================================\n\n/**\n * WebSocket envelope types for our transport\n */\nexport type WsEnvelopeType =\n | 'init' // Session initialization\n | 'user' // User message (matches SDK)\n | 'assistant' // Assistant message (matches SDK)\n | 'result' // Result message (matches SDK)\n | 'system' // System message (matches SDK)\n | 'stream_event' // Partial message (matches SDK)\n | 'control' // Control messages (ready, close, etc.)\n | 'error' // Error message\n | 'ping' // Keep-alive ping\n | 'pong' // Keep-alive pong\n | 'tool_call' // Tool call from server\n | 'tool_result'; // Tool result from client\n\n/**\n * Init message payload (session initialization)\n */\nexport interface InitPayload extends Omit<SessionOptions, 'mcpServers'> {\n // tools is passed through as-is (string[] for allowlist or preset)\n mcpServers?: unknown[];\n}\n\n/**\n * Control message actions\n */\nexport type ControlAction =\n | 'ready'\n | 'session_info'\n | 'end_input'\n | 'close';\n\n/**\n * Control message payload\n */\nexport interface ControlPayload {\n action: ControlAction;\n data?: Record<string, unknown>;\n}\n\n/**\n * Error message payload\n */\nexport interface ErrorPayload {\n message: string;\n code?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Ping/Pong payload\n */\nexport interface PingPongPayload {\n timestamp: number;\n}\n\n/**\n * Tool call payload (server -> client)\n */\nexport interface ToolCallPayload extends ToolCall {}\n\n/**\n * Tool result payload (client -> server)\n */\nexport interface ToolResultPayload {\n callId: string;\n result: ToolResult;\n}\n\n// ============================================================================\n// Envelope Interfaces\n// ============================================================================\n\nexport interface InitEnvelope {\n type: 'init';\n payload: InitPayload;\n}\n\nexport interface ControlEnvelope {\n type: 'control';\n payload: ControlPayload;\n}\n\nexport interface ErrorEnvelope {\n type: 'error';\n payload: ErrorPayload;\n}\n\nexport interface PingEnvelope {\n type: 'ping';\n payload: PingPongPayload;\n}\n\nexport interface PongEnvelope {\n type: 'pong';\n payload: PingPongPayload;\n}\n\nexport interface ToolCallEnvelope {\n type: 'tool_call';\n payload: ToolCallPayload;\n}\n\nexport interface ToolResultEnvelope {\n type: 'tool_result';\n payload: ToolResultPayload;\n}\n\n/**\n * Outgoing messages (client -> server)\n */\nexport type OutgoingMessage =\n | InitEnvelope\n | SDKUserMessage\n | ControlEnvelope\n | PingEnvelope\n | ToolResultEnvelope;\n\n/**\n * Incoming messages (server -> client)\n */\nexport type IncomingMessage =\n | SDKAssistantMessage\n | SDKResultMessage\n | SDKSystemMessage\n | SDKPartialAssistantMessage\n | ControlEnvelope\n | ErrorEnvelope\n | PongEnvelope\n | ToolCallEnvelope;\n\n/**\n * All messages\n */\nexport type AnyMessage = OutgoingMessage | IncomingMessage;\n\n// ============================================================================\n// Message Helpers\n// ============================================================================\n\n/**\n * Create an init message\n */\nexport function createInitMessage(payload: InitPayload): InitEnvelope {\n return { type: 'init', payload };\n}\n\n/**\n * Create a user message (official SDK format)\n */\nexport function createUserMessage(\n content: string | ContentBlock[],\n sessionId: string,\n options: {\n uuid?: UUID;\n parentToolUseId?: string | null;\n } = {}\n): SDKUserMessage {\n const messageContent = typeof content === 'string'\n ? content\n : content;\n\n return {\n type: 'user',\n uuid: options.uuid,\n session_id: sessionId,\n message: {\n role: 'user',\n content: messageContent,\n },\n parent_tool_use_id: options.parentToolUseId ?? null,\n };\n}\n\n/**\n * Create a control message\n */\nexport function createControlMessage(\n action: ControlAction,\n data?: Record<string, unknown>\n): ControlEnvelope {\n return { type: 'control', payload: { action, data } };\n}\n\n/**\n * Create a ping message\n */\nexport function createPingMessage(): PingEnvelope {\n return { type: 'ping', payload: { timestamp: Date.now() } };\n}\n\n/**\n * Create a tool result message\n */\nexport function createToolResultMessage(\n callId: string,\n result: ToolResult\n): ToolResultEnvelope {\n return { type: 'tool_result', payload: { callId, result } };\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if message is a user message\n */\nexport function isUserMessage(message: AnyMessage): message is SDKUserMessage {\n return message.type === 'user';\n}\n\n/**\n * Check if message is an assistant message\n */\nexport function isAssistantMessage(message: AnyMessage): message is SDKAssistantMessage {\n return message.type === 'assistant';\n}\n\n/**\n * Check if message is a result message\n */\nexport function isResultMessage(message: AnyMessage): message is SDKResultMessage {\n return message.type === 'result';\n}\n\n/**\n * Check if message is a success result\n */\nexport function isSuccessResult(message: AnyMessage): message is SDKResultMessageSuccess {\n return message.type === 'result' && (message as SDKResultMessage).subtype === 'success';\n}\n\n/**\n * Check if message is an error result\n */\nexport function isErrorResult(message: AnyMessage): message is SDKResultMessageError {\n return message.type === 'result' && (message as SDKResultMessage).subtype !== 'success';\n}\n\n/**\n * Check if message is a system message\n */\nexport function isSystemMessage(message: AnyMessage): message is SDKSystemMessage {\n return message.type === 'system';\n}\n\n/**\n * Check if message is a stream event\n */\nexport function isStreamEvent(message: AnyMessage): message is SDKPartialAssistantMessage {\n return message.type === 'stream_event';\n}\n\n/**\n * Check if message is a tool call\n */\nexport function isToolCallMessage(message: AnyMessage): message is ToolCallEnvelope {\n return message.type === 'tool_call';\n}\n\n/**\n * Check if message is a control message\n */\nexport function isControlMessage(message: AnyMessage): message is ControlEnvelope {\n return message.type === 'control';\n}\n\n/**\n * Check if message is an error message\n */\nexport function isErrorMessage(message: AnyMessage): message is ErrorEnvelope {\n return message.type === 'error';\n}\n\n/**\n * Extract text from result message\n */\nexport function getResultText(message: SDKResultMessage): string | null {\n if (message.subtype === 'success') {\n return message.result;\n }\n return null;\n}\n\n/**\n * Extract text from assistant message content\n */\nexport function getAssistantText(message: SDKAssistantMessage): string {\n return message.message.content\n .filter((block): block is TextContent => block.type === 'text')\n .map(block => block.text)\n .join('');\n}\n","/**\n * Transport Interface\n *\n * Abstract interface for communication between the SDK and Chucky server.\n * Implementations can use WebSocket (browser/Node.js) or other protocols.\n */\n\nimport type { ConnectionStatus, ClientEventHandlers } from '../types/options.js';\nimport type { OutgoingMessage, IncomingMessage } from '../types/messages.js';\n\n/**\n * Transport event types\n */\nexport interface TransportEvents extends ClientEventHandlers {\n /** Called when a message is received */\n onMessage?: (message: IncomingMessage) => void;\n /** Called when the transport is closed */\n onClose?: (code?: number, reason?: string) => void;\n}\n\n/**\n * Transport configuration\n */\nexport interface TransportConfig {\n /** Server URL */\n url: string;\n /** Authentication token */\n token: string;\n /** Connection timeout in milliseconds */\n timeout?: number;\n /** Keep-alive interval in milliseconds */\n keepAliveInterval?: number;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Maximum reconnect attempts */\n maxReconnectAttempts?: number;\n /** Debug mode */\n debug?: boolean;\n}\n\n/**\n * Abstract transport interface\n */\nexport interface Transport {\n /** Current connection status */\n readonly status: ConnectionStatus;\n\n /**\n * Connect to the server\n */\n connect(): Promise<void>;\n\n /**\n * Disconnect from the server\n */\n disconnect(): Promise<void>;\n\n /**\n * Send a message to the server\n */\n send(message: OutgoingMessage): Promise<void>;\n\n /**\n * Set event handlers\n */\n setEventHandlers(handlers: TransportEvents): void;\n\n /**\n * Wait for connection to be ready\n */\n waitForReady(): Promise<void>;\n}\n\n/**\n * Base transport class with common functionality\n */\nexport abstract class BaseTransport implements Transport {\n protected _status: ConnectionStatus = 'disconnected';\n protected handlers: TransportEvents = {};\n protected config: TransportConfig;\n\n constructor(config: TransportConfig) {\n // Filter out undefined values to prevent them from overwriting defaults\n const cleanConfig = Object.fromEntries(\n Object.entries(config).filter(([_, v]) => v !== undefined)\n ) as TransportConfig;\n\n this.config = {\n timeout: 60000, // 60s - container startup can take time\n keepAliveInterval: 300000, // 5 minutes\n autoReconnect: false, // Disabled - server doesn't support reconnect\n maxReconnectAttempts: 0,\n debug: false,\n ...cleanConfig,\n };\n }\n\n get status(): ConnectionStatus {\n return this._status;\n }\n\n protected setStatus(status: ConnectionStatus): void {\n if (this._status !== status) {\n this._status = status;\n this.handlers.onStatusChange?.(status);\n }\n }\n\n protected log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ChuckySDK]', ...args);\n }\n }\n\n protected logError(...args: unknown[]): void {\n console.error('[ChuckySDK]', ...args);\n }\n\n setEventHandlers(handlers: TransportEvents): void {\n this.handlers = { ...this.handlers, ...handlers };\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n abstract send(message: OutgoingMessage): Promise<void>;\n abstract waitForReady(): Promise<void>;\n}\n","/**\n * WebSocket Transport\n *\n * WebSocket-based transport that works in both browser and Node.js.\n * Handles connection management, keep-alive, and reconnection.\n */\n\nimport type { OutgoingMessage, IncomingMessage } from '../types/messages.js';\nimport { createPingMessage, isErrorMessage } from '../types/messages.js';\nimport { BaseTransport, type TransportConfig } from './Transport.js';\n\n/**\n * WebSocket transport configuration\n */\nexport interface WebSocketTransportConfig extends TransportConfig {\n /** Protocol to use (default: determined from URL) */\n protocol?: 'ws' | 'wss';\n}\n\n/**\n * Get WebSocket implementation (browser or Node.js)\n */\nasync function getWebSocket(): Promise<typeof WebSocket> {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n }\n // Node.js: dynamically import ws\n const ws = await import('ws');\n return ws.default as unknown as typeof WebSocket;\n}\n\n/**\n * WebSocket transport implementation\n */\nexport class WebSocketTransport extends BaseTransport {\n private ws: WebSocket | null = null;\n private keepAliveTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private readyPromise: Promise<void> | null = null;\n private readyResolve: (() => void) | null = null;\n private readyReject: ((error: Error) => void) | null = null;\n private messageQueue: OutgoingMessage[] = [];\n\n constructor(config: WebSocketTransportConfig) {\n super(config);\n }\n\n /**\n * Build the WebSocket URL with token\n */\n private buildUrl(): string {\n const url = new URL(this.config.url);\n url.searchParams.set('token', this.config.token);\n return url.toString();\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n if (this._status === 'connected' || this._status === 'connecting') {\n return this.waitForReady();\n }\n\n this.setStatus('connecting');\n this.log('Connecting to', this.config.url);\n\n // Create ready promise\n this.readyPromise = new Promise<void>((resolve, reject) => {\n this.readyResolve = resolve;\n this.readyReject = reject;\n });\n\n try {\n const WS = await getWebSocket();\n const wsUrl = this.buildUrl();\n\n this.ws = new WS(wsUrl);\n\n // Set up connection timeout\n const timeoutId = setTimeout(() => {\n if (this._status === 'connecting') {\n this.ws?.close();\n const error = new Error('Connection timeout');\n this.readyReject?.(error);\n this.handlers.onError?.(error);\n this.setStatus('error');\n }\n }, this.config.timeout);\n\n this.ws.onopen = () => {\n clearTimeout(timeoutId);\n this.log('Connected');\n this.setStatus('connected');\n this.reconnectAttempts = 0;\n this.startKeepAlive();\n this.readyResolve?.();\n this.flushMessageQueue();\n };\n\n this.ws.onclose = (event) => {\n clearTimeout(timeoutId);\n this.log('Disconnected:', event.code, event.reason);\n this.stopKeepAlive();\n\n if (this._status === 'connecting') {\n const error = new Error(`Connection failed: ${event.reason || 'Unknown'}`);\n this.readyReject?.(error);\n }\n\n this.setStatus('disconnected');\n this.handlers.onClose?.(event.code, event.reason);\n\n // Auto-reconnect if enabled\n if (this.config.autoReconnect && this.reconnectAttempts < (this.config.maxReconnectAttempts || 5)) {\n this.scheduleReconnect();\n }\n };\n\n this.ws.onerror = (event) => {\n clearTimeout(timeoutId);\n const error = new Error('WebSocket error');\n this.logError('WebSocket error:', event);\n this.handlers.onError?.(error);\n\n if (this._status === 'connecting') {\n this.readyReject?.(error);\n }\n\n this.setStatus('error');\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n return this.readyPromise;\n } catch (error) {\n this.setStatus('error');\n this.readyReject?.(error as Error);\n throw error;\n }\n }\n\n /**\n * Disconnect from the server\n */\n async disconnect(): Promise<void> {\n this.log('Disconnecting');\n this.stopKeepAlive();\n this.clearReconnectTimer();\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n\n this.setStatus('disconnected');\n }\n\n /**\n * Send a message to the server\n */\n async send(message: OutgoingMessage): Promise<void> {\n // Don't queue or send if we're closing/closed\n if (this._status === 'disconnected' && !this.config.autoReconnect) {\n this.log('Message dropped (disconnected):', message.type);\n return;\n }\n\n if (this._status !== 'connected') {\n // Queue message if not connected\n this.messageQueue.push(message);\n this.log('Message queued (not connected):', message.type);\n\n // Try to connect if disconnected and autoReconnect is enabled\n if (this._status === 'disconnected' && this.config.autoReconnect) {\n await this.connect();\n }\n return;\n }\n\n this.sendImmediate(message);\n }\n\n /**\n * Send a message immediately\n */\n private sendImmediate(message: OutgoingMessage): void {\n if (!this.ws || this.ws.readyState !== 1) {\n this.logError('Cannot send: WebSocket not ready');\n return;\n }\n\n const data = JSON.stringify(message);\n this.handlers.onRawMessage?.('out', message);\n this.ws.send(data);\n this.log('Sent:', message.type);\n }\n\n /**\n * Wait for the connection to be ready\n */\n async waitForReady(): Promise<void> {\n if (this._status === 'connected') {\n return;\n }\n\n if (this.readyPromise) {\n return this.readyPromise;\n }\n\n // Start connection if not already connecting\n return this.connect();\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(data: string | Buffer | ArrayBuffer): void {\n try {\n const text = typeof data === 'string' ? data : new TextDecoder().decode(data as ArrayBuffer);\n const message = JSON.parse(text) as IncomingMessage;\n\n this.handlers.onRawMessage?.('in', message);\n this.log('Received:', message.type);\n\n // Handle pong (keep-alive response)\n if (message.type === 'pong') {\n return;\n }\n\n // Handle errors\n if (isErrorMessage(message)) {\n const error = new Error(message.payload.message);\n this.handlers.onError?.(error);\n }\n\n // Forward to message handler\n this.handlers.onMessage?.(message);\n } catch (error) {\n this.logError('Failed to parse message:', error);\n }\n }\n\n /**\n * Start keep-alive ping\n */\n private startKeepAlive(): void {\n this.stopKeepAlive();\n\n if (this.config.keepAliveInterval && this.config.keepAliveInterval > 0) {\n this.keepAliveTimer = setInterval(() => {\n if (this._status === 'connected' && this.ws?.readyState === 1) {\n this.sendImmediate(createPingMessage());\n }\n }, this.config.keepAliveInterval);\n }\n }\n\n /**\n * Stop keep-alive ping\n */\n private stopKeepAlive(): void {\n if (this.keepAliveTimer) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n }\n }\n\n /**\n * Schedule a reconnection attempt\n */\n private scheduleReconnect(): void {\n this.clearReconnectTimer();\n this.reconnectAttempts++;\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s\n const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts - 1), 16000);\n\n this.log(`Scheduling reconnect in ${delay}ms (attempt ${this.reconnectAttempts})`);\n this.setStatus('reconnecting');\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n this.logError('Reconnect failed:', error);\n });\n }, delay);\n }\n\n /**\n * Clear reconnect timer\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n /**\n * Flush queued messages\n */\n private flushMessageQueue(): void {\n while (this.messageQueue.length > 0) {\n const message = this.messageQueue.shift()!;\n this.sendImmediate(message);\n }\n }\n}\n","/**\n * Session\n *\n * Represents a conversation session with the Chucky sandbox.\n * Matches the official Claude Agent SDK V2 interface.\n *\n * @example\n * ```typescript\n * const session = createSession({ token, model: 'claude-sonnet-4-5-20250929' });\n *\n * await session.send('Hello!');\n * for await (const msg of session.stream()) {\n * if (msg.type === 'assistant') {\n * console.log(getAssistantText(msg));\n * }\n * }\n * ```\n */\n\nimport type { SessionOptions } from '../types/options.js';\nimport type { SessionInfo, SessionState } from '../types/results.js';\nimport type { ToolDefinition, ToolResult, ToolCall } from '../types/tools.js';\nimport type {\n IncomingMessage,\n InitPayload,\n SDKMessage,\n SDKResultMessage,\n SDKAssistantMessage,\n TextContent,\n} from '../types/messages.js';\nimport {\n createInitMessage,\n createUserMessage,\n createControlMessage,\n createToolResultMessage,\n isToolCallMessage,\n isControlMessage,\n isResultMessage,\n isErrorMessage,\n isAssistantMessage,\n isSystemMessage,\n isStreamEvent,\n} from '../types/messages.js';\nimport type { Transport } from '../transport/Transport.js';\n\n/**\n * Session event handlers\n */\nexport interface SessionEventHandlers {\n onSessionInfo?: (info: SessionInfo) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * Internal session configuration\n */\ninterface SessionConfig {\n debug?: boolean;\n}\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Session class - matches official V2 SDK interface\n *\n * Usage:\n * ```typescript\n * const session = createSession({ token, model: 'claude-sonnet-4-5-20250929' });\n *\n * // Multi-turn conversation\n * await session.send('What is 5 + 3?');\n * for await (const msg of session.stream()) {\n * if (msg.type === 'result') console.log(msg.result);\n * }\n *\n * await session.send('Multiply that by 2');\n * for await (const msg of session.stream()) {\n * if (msg.type === 'result') console.log(msg.result);\n * }\n *\n * session.close();\n * ```\n */\nexport class Session {\n private transport: Transport;\n private options: SessionOptions;\n private config: SessionConfig;\n private eventHandlers: SessionEventHandlers = {};\n private toolHandlers: Map<string, ToolDefinition['handler']> = new Map();\n private messageBuffer: IncomingMessage[] = [];\n private _state: SessionState = 'idle';\n private _sessionId: string;\n private messageResolvers: Array<(message: IncomingMessage) => void> = [];\n private connected: boolean = false;\n private connectPromise: Promise<void> | null = null;\n\n constructor(transport: Transport, options: SessionOptions, config: SessionConfig = {}) {\n this.transport = transport;\n this.options = options;\n this.config = config;\n this._sessionId = options.sessionId || generateUUID();\n\n // Extract tool handlers from client-side MCP servers only\n if (options.mcpServers) {\n for (const server of options.mcpServers) {\n // Only extract handlers from servers with tools (not stdio/sse/http)\n if ('tools' in server) {\n for (const tool of server.tools) {\n if (tool.handler) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n }\n }\n }\n }\n\n // Set up transport event handlers\n this.transport.setEventHandlers({\n onMessage: (message) => this.handleMessage(message),\n onError: (error) => this.eventHandlers.onError?.(error),\n onStatusChange: (status) => {\n if (status === 'disconnected' && this._state !== 'completed') {\n this._state = 'error';\n }\n },\n });\n }\n\n /**\n * Get the session ID\n */\n get sessionId(): string {\n return this._sessionId;\n }\n\n /**\n * Set event handlers\n */\n on(handlers: SessionEventHandlers): this {\n this.eventHandlers = { ...this.eventHandlers, ...handlers };\n return this;\n }\n\n /**\n * Connect and initialize the session (called automatically on first send)\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) return;\n\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = this.connect();\n await this.connectPromise;\n }\n\n private async connect(): Promise<void> {\n this._state = 'initializing';\n await this.transport.connect();\n\n // Send init message\n const initPayload = this.buildInitPayload();\n await this.transport.send(createInitMessage(initPayload));\n\n // Wait for ready/session_info\n await this.waitForReady();\n this._state = 'ready';\n this.connected = true;\n }\n\n /**\n * Send a message to the session\n *\n * Matches V2 SDK: send() returns Promise<void>\n * Use stream() to get the response.\n *\n * @example\n * ```typescript\n * await session.send('Hello!');\n * for await (const msg of session.stream()) {\n * // Handle messages\n * }\n * ```\n */\n async send(message: string): Promise<void> {\n await this.ensureConnected();\n\n if (this._state !== 'ready') {\n throw new Error(`Cannot send: session state is ${this._state}`);\n }\n\n this._state = 'processing';\n\n // Send user message in official SDK format\n const userMessage = createUserMessage(message, this._sessionId);\n await this.transport.send(userMessage);\n }\n\n /**\n * Stream the response after sending a message\n *\n * Matches V2 SDK: Returns AsyncGenerator<SDKMessage>\n *\n * @example\n * ```typescript\n * await session.send('Hello!');\n * for await (const msg of session.stream()) {\n * if (msg.type === 'assistant') {\n * const text = msg.message.content\n * .filter(b => b.type === 'text')\n * .map(b => b.text)\n * .join('');\n * console.log(text);\n * }\n * if (msg.type === 'result') {\n * console.log('Done:', msg.result);\n * }\n * }\n * ```\n */\n async *stream(): AsyncGenerator<SDKMessage, void, unknown> {\n while (this._state === 'processing' || this._state === 'waiting_tool') {\n const msg = await this.waitForNextMessage();\n\n // Handle tool calls internally\n if (isToolCallMessage(msg)) {\n this._state = 'waiting_tool';\n await this.handleToolCall(msg.payload);\n this._state = 'processing';\n continue;\n }\n\n // Yield SDK messages to caller\n if (isAssistantMessage(msg) || isResultMessage(msg) || isSystemMessage(msg) || isStreamEvent(msg)) {\n yield msg as SDKMessage;\n }\n\n // Check if complete\n if (isResultMessage(msg)) {\n this._state = 'ready';\n break;\n }\n\n // Handle errors\n if (isErrorMessage(msg)) {\n this._state = 'ready';\n throw new Error(msg.payload.message);\n }\n }\n }\n\n /**\n * Receive messages (alias for stream for V2 compatibility)\n */\n receive(): AsyncGenerator<SDKMessage, void, unknown> {\n return this.stream();\n }\n\n /**\n * Close the session\n */\n close(): void {\n this.transport.send(createControlMessage('close')).catch(() => {});\n this.transport.disconnect().catch(() => {});\n this._state = 'completed';\n }\n\n /**\n * Support for `await using` (TypeScript 5.2+)\n */\n async [Symbol.asyncDispose](): Promise<void> {\n this.close();\n }\n\n /**\n * Build init payload from options\n */\n private buildInitPayload(): InitPayload {\n const { mcpServers, ...rest } = this.options;\n\n // Serialize MCP servers - handle all server types\n const serializedMcpServers = mcpServers?.map((server) => {\n // Client-side tools servers - serialize tools (remove handlers)\n if ('tools' in server) {\n return {\n name: server.name,\n version: server.version,\n tools: server.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n // If tool has a handler, it executes on the client (SDK) side\n executeIn: tool.handler ? 'client' : tool.executeIn,\n })),\n };\n }\n\n // Stdio, SSE, HTTP servers pass through as-is\n return server;\n });\n\n return {\n ...rest,\n // tools is passed through as-is (string[] or preset for allowlisting)\n mcpServers: serializedMcpServers,\n };\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(message: IncomingMessage): void {\n this.log('Received:', message.type);\n\n // Handle control messages\n if (isControlMessage(message)) {\n if (message.payload.action === 'session_info') {\n const info = message.payload.data as unknown as SessionInfo;\n this._sessionId = info.sessionId || this._sessionId;\n this.eventHandlers.onSessionInfo?.(info);\n }\n }\n\n // Handle system init messages (official SDK format)\n if (isSystemMessage(message) && message.subtype === 'init') {\n this._sessionId = message.session_id || this._sessionId;\n this.eventHandlers.onSessionInfo?.({\n sessionId: message.session_id,\n model: message.model,\n tools: message.tools,\n });\n }\n\n // Handle errors\n if (isErrorMessage(message)) {\n const error = new Error(message.payload.message);\n this.eventHandlers.onError?.(error);\n }\n\n // Notify waiting resolvers\n const resolver = this.messageResolvers.shift();\n if (resolver) {\n resolver(message);\n } else {\n this.messageBuffer.push(message);\n }\n }\n\n /**\n * Wait for session to be ready\n */\n private async waitForReady(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Session initialization timeout'));\n }, 30000);\n\n const checkReady = (message: IncomingMessage) => {\n if (isControlMessage(message)) {\n if (message.payload.action === 'ready' || message.payload.action === 'session_info') {\n clearTimeout(timeout);\n resolve();\n return true;\n }\n }\n if (isSystemMessage(message) && message.subtype === 'init') {\n clearTimeout(timeout);\n resolve();\n return true;\n }\n if (isErrorMessage(message)) {\n clearTimeout(timeout);\n reject(new Error(message.payload.message));\n return true;\n }\n return false;\n };\n\n // Check buffered messages first\n for (let i = 0; i < this.messageBuffer.length; i++) {\n if (checkReady(this.messageBuffer[i])) {\n this.messageBuffer.splice(i, 1);\n return;\n }\n }\n\n // Wait for new message\n this.messageResolvers.push((msg) => {\n checkReady(msg);\n });\n });\n }\n\n /**\n * Wait for next message\n */\n private async waitForNextMessage(): Promise<IncomingMessage> {\n if (this.messageBuffer.length > 0) {\n return this.messageBuffer.shift()!;\n }\n\n return new Promise<IncomingMessage>((resolve) => {\n this.messageResolvers.push(resolve);\n });\n }\n\n /**\n * Handle a tool call\n */\n private async handleToolCall(toolCall: ToolCall): Promise<void> {\n const handler = this.toolHandlers.get(toolCall.toolName);\n\n if (!handler) {\n this.log('No local handler for tool:', toolCall.toolName);\n return;\n }\n\n this.log('Executing tool:', toolCall.toolName);\n\n try {\n const result = await handler(toolCall.input);\n await this.transport.send(createToolResultMessage(toolCall.callId, result));\n } catch (error) {\n const errorResult: ToolResult = {\n content: [{ type: 'text', text: (error as Error).message }],\n isError: true,\n };\n await this.transport.send(createToolResultMessage(toolCall.callId, errorResult));\n }\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[Session]', ...args);\n }\n }\n}\n\n/**\n * Extract text from an assistant message\n */\nexport function getAssistantText(msg: SDKMessage): string | null {\n if (msg.type !== 'assistant') return null;\n return (msg as SDKAssistantMessage).message.content\n .filter((block): block is TextContent => block.type === 'text')\n .map(block => block.text)\n .join('');\n}\n\n/**\n * Extract result from a result message\n */\nexport function getResultText(msg: SDKMessage): string | null {\n if (msg.type !== 'result') return null;\n const resultMsg = msg as SDKResultMessage;\n if (resultMsg.subtype === 'success') {\n return resultMsg.result;\n }\n return null;\n}\n","/**\n * Chucky Client\n *\n * Main entry point for the Chucky SDK.\n * Provides methods to create sessions and execute prompts.\n * Matches the official Claude Agent SDK V2 interface.\n */\n\nimport type {\n ClientOptions,\n SessionOptions,\n PromptOptions,\n ClientEventHandlers,\n} from '../types/options.js';\nimport type { SDKResultMessage } from '../types/messages.js';\nimport { WebSocketTransport } from '../transport/WebSocketTransport.js';\nimport { Session, getAssistantText, getResultText } from './Session.js';\n\n/**\n * Default base URL for the Chucky service\n */\nconst DEFAULT_BASE_URL = 'wss://conjure.chucky.cloud/ws';\n\n/**\n * Chucky client for interacting with the sandbox service\n *\n * Matches the official Claude Agent SDK V2 interface.\n *\n * @example\n * ```typescript\n * import { ChuckyClient } from '@chucky.cloud/sdk';\n *\n * const client = new ChuckyClient({\n * token: 'your-jwt-token',\n * });\n *\n * // Create a session (V2 style)\n * const session = client.createSession({\n * model: 'claude-sonnet-4-5-20250929',\n * systemPrompt: 'You are a helpful assistant.',\n * });\n *\n * // Send messages and stream responses\n * await session.send('Hello, world!');\n * for await (const msg of session.stream()) {\n * if (msg.type === 'assistant') {\n * const text = getAssistantText(msg);\n * console.log(text);\n * }\n * if (msg.type === 'result') {\n * console.log('Done:', msg);\n * }\n * }\n *\n * session.close();\n * ```\n */\nexport class ChuckyClient {\n private readonly options: Required<Pick<ClientOptions, 'baseUrl' | 'token' | 'debug'>> &\n Omit<ClientOptions, 'baseUrl' | 'token' | 'debug'>;\n private eventHandlers: ClientEventHandlers = {};\n private activeSessions: Map<string, Session> = new Map();\n\n /**\n * Create a new Chucky client\n */\n constructor(options: ClientOptions) {\n this.options = {\n baseUrl: DEFAULT_BASE_URL,\n debug: false,\n ...options,\n };\n }\n\n /**\n * Set event handlers\n */\n on(handlers: ClientEventHandlers): this {\n this.eventHandlers = { ...this.eventHandlers, ...handlers };\n return this;\n }\n\n /**\n * Create a new session\n *\n * Matches V2 SDK: createSession() returns a Session immediately.\n * Connection happens automatically on first send().\n *\n * @param options - Session configuration options\n * @returns A new session instance\n *\n * @example\n * ```typescript\n * const session = client.createSession({\n * model: 'claude-sonnet-4-5-20250929',\n * systemPrompt: 'You are a helpful coding assistant.',\n * });\n *\n * await session.send('Hello!');\n * for await (const msg of session.stream()) {\n * // Handle messages\n * }\n * ```\n */\n createSession(options: SessionOptions = {}): Session {\n const transport = this.createTransport();\n const session = new Session(transport, options, {\n debug: this.options.debug,\n });\n\n // Track the session\n session.on({\n onSessionInfo: (info) => {\n if (info.sessionId) {\n this.activeSessions.set(info.sessionId, session);\n }\n },\n });\n\n return session;\n }\n\n /**\n * Resume an existing session\n *\n * @param sessionId - The session ID to resume\n * @param options - Additional session options\n * @returns The resumed session\n *\n * @example\n * ```typescript\n * const session = client.resumeSession('session-123');\n * await session.send('Continue our conversation');\n * ```\n */\n resumeSession(sessionId: string, options: Omit<SessionOptions, 'sessionId'> = {}): Session {\n return this.createSession({\n ...options,\n sessionId,\n });\n }\n\n /**\n * Execute a one-shot prompt (stateless)\n *\n * Supports two call signatures:\n * - `prompt('message', { model: '...' })` - positional style\n * - `prompt({ message: '...', model: '...' })` - object style\n *\n * @param messageOrOptions - The message string OR an options object with message\n * @param options - Prompt configuration (only used with positional style)\n * @returns The result message\n *\n * @example\n * ```typescript\n * // Positional style\n * const result = await client.prompt(\n * 'Explain quantum computing in simple terms',\n * { model: 'claude-sonnet-4-5-20250929' }\n * );\n *\n * // Object style\n * const result = await client.prompt({\n * message: 'Explain quantum computing in simple terms',\n * model: 'claude-sonnet-4-5-20250929',\n * });\n *\n * if (result.subtype === 'success') {\n * console.log(result.result);\n * }\n * ```\n */\n async prompt(\n messageOrOptions: string | PromptOptions,\n options: SessionOptions = {}\n ): Promise<SDKResultMessage> {\n // Support both call signatures\n let message: string;\n let sessionOptions: SessionOptions;\n\n if (typeof messageOrOptions === 'object') {\n // Object style: prompt({ message: '...', model: '...' })\n const { message: msg, ...rest } = messageOrOptions;\n message = msg;\n sessionOptions = rest;\n } else {\n // Positional style: prompt('...', { model: '...' })\n message = messageOrOptions;\n sessionOptions = options;\n }\n\n const session = this.createSession(sessionOptions);\n\n try {\n await session.send(message);\n\n let result: SDKResultMessage | null = null;\n for await (const msg of session.stream()) {\n if (msg.type === 'result') {\n result = msg as SDKResultMessage;\n break;\n }\n }\n\n if (!result) {\n throw new Error('No result message received');\n }\n\n return result;\n } finally {\n session.close();\n }\n }\n\n /**\n * Close all active sessions and disconnect\n */\n close(): void {\n for (const session of this.activeSessions.values()) {\n session.close();\n }\n this.activeSessions.clear();\n }\n\n /**\n * Create a new transport instance\n */\n private createTransport(): WebSocketTransport {\n return new WebSocketTransport({\n url: this.options.baseUrl,\n token: this.options.token,\n timeout: this.options.timeout,\n keepAliveInterval: this.options.keepAliveInterval,\n autoReconnect: this.options.autoReconnect,\n maxReconnectAttempts: this.options.maxReconnectAttempts,\n debug: this.options.debug,\n });\n }\n}\n\n/**\n * Create a Chucky client\n *\n * @param options - Client configuration\n * @returns A new ChuckyClient instance\n *\n * @example\n * ```typescript\n * import { createClient } from '@chucky.cloud/sdk';\n *\n * const client = createClient({\n * token: 'your-jwt-token',\n * });\n * ```\n */\nexport function createClient(options: ClientOptions): ChuckyClient {\n return new ChuckyClient(options);\n}\n\n// Re-export helpers for convenience\nexport { getAssistantText, getResultText };\n","/**\n * Tool Helper\n *\n * Helper functions for defining tools with type safety.\n * Supports both JSON Schema and Zod for input validation.\n */\n\nimport type {\n ToolDefinition,\n ToolInputSchema,\n ToolHandler,\n ToolResult,\n ToolExecutionLocation,\n JsonSchemaProperty,\n} from '../types/tools.js';\n\n/**\n * Options for creating a tool\n */\nexport interface CreateToolOptions<TInput = Record<string, unknown>> {\n /** Tool name (must be unique) */\n name: string;\n /** Human-readable description */\n description: string;\n /** Input schema (JSON Schema or Zod schema) */\n inputSchema: ToolInputSchema | ZodLikeSchema;\n /** Where to execute the tool */\n executeIn?: ToolExecutionLocation;\n /** Handler function */\n handler?: ToolHandler<TInput>;\n}\n\n/**\n * Zod-like schema interface for compatibility\n */\ninterface ZodLikeSchema {\n _def?: unknown;\n shape?: unknown;\n safeParse?: (data: unknown) => { success: boolean; data?: unknown; error?: unknown };\n}\n\n/**\n * Check if a schema is a Zod schema\n */\nfunction isZodSchema(schema: unknown): schema is ZodLikeSchema {\n return (\n typeof schema === 'object' &&\n schema !== null &&\n ('_def' in schema || 'shape' in schema)\n );\n}\n\n/**\n * Convert Zod schema to JSON Schema (basic conversion)\n */\nfunction zodToJsonSchema(zodSchema: ZodLikeSchema): ToolInputSchema {\n // This is a simplified conversion - for full support, use zod-to-json-schema\n const def = (zodSchema as { _def?: { typeName?: string; shape?: () => Record<string, unknown> } })._def;\n\n if (!def) {\n return {\n type: 'object',\n properties: {},\n };\n }\n\n const typeName = def.typeName;\n\n if (typeName === 'ZodObject') {\n const shape = def.shape?.() || {};\n const properties: Record<string, JsonSchemaProperty> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const valueDef = (value as { _def?: { typeName?: string; description?: string; checks?: Array<{ kind: string }> } })._def;\n\n if (valueDef) {\n const prop = zodDefToJsonSchema(valueDef);\n if (prop) {\n properties[key] = prop;\n\n // Check if required (not optional)\n if (valueDef.typeName !== 'ZodOptional') {\n required.push(key);\n }\n }\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n };\n }\n\n return {\n type: 'object',\n properties: {},\n };\n}\n\n/**\n * Convert a Zod definition to JSON Schema property\n */\nfunction zodDefToJsonSchema(def: {\n typeName?: string;\n description?: string;\n checks?: Array<{ kind: string; value?: unknown }>;\n innerType?: { _def?: unknown };\n values?: string[];\n}): JsonSchemaProperty | null {\n const typeName = def.typeName;\n\n switch (typeName) {\n case 'ZodString':\n return { type: 'string', description: def.description };\n\n case 'ZodNumber':\n return { type: 'number', description: def.description };\n\n case 'ZodBoolean':\n return { type: 'boolean', description: def.description };\n\n case 'ZodArray':\n const innerDef = def.innerType?._def as { typeName?: string; description?: string } | undefined;\n return {\n type: 'array',\n description: def.description,\n items: innerDef ? zodDefToJsonSchema(innerDef) || { type: 'string' } : { type: 'string' },\n };\n\n case 'ZodEnum':\n return {\n type: 'string',\n description: def.description,\n enum: def.values,\n };\n\n case 'ZodOptional':\n const innerOptDef = def.innerType?._def as { typeName?: string; description?: string } | undefined;\n return innerOptDef ? zodDefToJsonSchema(innerOptDef) : null;\n\n default:\n return { type: 'string' };\n }\n}\n\n/**\n * Create a tool definition\n *\n * @param options - Tool configuration\n * @returns Tool definition ready to use\n *\n * @example\n * ```typescript\n * // With JSON Schema\n * const weatherTool = createTool({\n * name: 'get_weather',\n * description: 'Get current weather for a city',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * city: { type: 'string', description: 'City name' },\n * unit: { type: 'string', enum: ['celsius', 'fahrenheit'] },\n * },\n * required: ['city'],\n * },\n * handler: async ({ city, unit }) => ({\n * content: [{ type: 'text', text: `Weather in ${city}: Sunny, 72°${unit === 'celsius' ? 'C' : 'F'}` }],\n * }),\n * });\n *\n * // With Zod (optional peer dependency)\n * import { z } from 'zod';\n *\n * const calculatorTool = createTool({\n * name: 'calculate',\n * description: 'Perform a calculation',\n * inputSchema: z.object({\n * expression: z.string().describe('Math expression to evaluate'),\n * }),\n * handler: async ({ expression }) => ({\n * content: [{ type: 'text', text: `Result: ${eval(expression)}` }],\n * }),\n * });\n * ```\n */\nexport function createTool<TInput = Record<string, unknown>>(\n options: CreateToolOptions<TInput>\n): ToolDefinition<TInput> {\n let inputSchema: ToolInputSchema;\n\n if (isZodSchema(options.inputSchema)) {\n inputSchema = zodToJsonSchema(options.inputSchema);\n } else {\n inputSchema = options.inputSchema as ToolInputSchema;\n }\n\n return {\n name: options.name,\n description: options.description,\n inputSchema,\n executeIn: options.executeIn ?? 'server',\n handler: options.handler,\n };\n}\n\n/**\n * Shorthand for creating a tool\n *\n * @param name - Tool name\n * @param description - Tool description\n * @param inputSchema - Input schema\n * @param handler - Handler function\n * @returns Tool definition\n *\n * @example\n * ```typescript\n * const greetTool = tool(\n * 'greet',\n * 'Greet a person by name',\n * {\n * type: 'object',\n * properties: { name: { type: 'string' } },\n * required: ['name'],\n * },\n * async ({ name }) => ({\n * content: [{ type: 'text', text: `Hello, ${name}!` }],\n * })\n * );\n * ```\n */\nexport function tool<TInput = Record<string, unknown>>(\n name: string,\n description: string,\n inputSchema: ToolInputSchema | ZodLikeSchema,\n handler?: ToolHandler<TInput>\n): ToolDefinition<TInput> {\n return createTool({ name, description, inputSchema, handler });\n}\n\n/**\n * Create a browser-executed tool\n *\n * @param options - Tool configuration\n * @returns Tool definition that executes in the browser\n *\n * @example\n * ```typescript\n * const alertTool = browserTool({\n * name: 'show_alert',\n * description: 'Show an alert dialog',\n * inputSchema: {\n * type: 'object',\n * properties: { message: { type: 'string' } },\n * required: ['message'],\n * },\n * handler: async ({ message }) => {\n * alert(message);\n * return { content: [{ type: 'text', text: 'Alert shown' }] };\n * },\n * });\n * ```\n */\nexport function browserTool<TInput = Record<string, unknown>>(\n options: Omit<CreateToolOptions<TInput>, 'executeIn'>\n): ToolDefinition<TInput> {\n return createTool({ ...options, executeIn: 'browser' });\n}\n\n/**\n * Create a server-executed tool\n *\n * @param options - Tool configuration (handler is optional for server tools)\n * @returns Tool definition that executes on the server\n */\nexport function serverTool<TInput = Record<string, unknown>>(\n options: Omit<CreateToolOptions<TInput>, 'executeIn' | 'handler'>\n): ToolDefinition<TInput> {\n return createTool({ ...options, executeIn: 'server' });\n}\n\n/**\n * Helper to create text content for tool results\n */\nexport function textResult(text: string): ToolResult {\n return {\n content: [{ type: 'text', text }],\n };\n}\n\n/**\n * Helper to create error result for tools\n */\nexport function errorResult(message: string): ToolResult {\n return {\n content: [{ type: 'text', text: message }],\n isError: true,\n };\n}\n\n/**\n * Helper to create image content for tool results\n */\nexport function imageResult(data: string, mimeType: string): ToolResult {\n return {\n content: [{ type: 'image', data, mimeType }],\n };\n}\n","/**\n * MCP Server Builder\n *\n * Builder pattern for creating MCP server definitions with multiple tools.\n */\n\nimport type { ToolDefinition, McpServerDefinition } from '../types/tools.js';\nimport type { CreateToolOptions } from './tool.js';\nimport { createTool } from './tool.js';\n\n/**\n * MCP Server builder for creating server definitions\n *\n * @example\n * ```typescript\n * const myServer = new McpServerBuilder('my-tools', '1.0.0')\n * .addTool({\n * name: 'greet',\n * description: 'Greet someone',\n * inputSchema: {\n * type: 'object',\n * properties: { name: { type: 'string' } },\n * required: ['name'],\n * },\n * handler: async ({ name }) => ({\n * content: [{ type: 'text', text: `Hello, ${name}!` }],\n * }),\n * })\n * .addTool({\n * name: 'farewell',\n * description: 'Say goodbye',\n * inputSchema: {\n * type: 'object',\n * properties: { name: { type: 'string' } },\n * required: ['name'],\n * },\n * handler: async ({ name }) => ({\n * content: [{ type: 'text', text: `Goodbye, ${name}!` }],\n * }),\n * })\n * .build();\n * ```\n */\nexport class McpServerBuilder {\n private name: string;\n private version: string;\n private tools: ToolDefinition[] = [];\n\n /**\n * Create a new MCP server builder\n *\n * @param name - Server name\n * @param version - Server version (default: '1.0.0')\n */\n constructor(name: string, version: string = '1.0.0') {\n this.name = name;\n this.version = version;\n }\n\n /**\n * Add a tool to the server\n *\n * @param options - Tool configuration\n * @returns This builder for chaining\n */\n addTool<TInput = Record<string, unknown>>(\n options: CreateToolOptions<TInput>\n ): this {\n this.tools.push(createTool(options) as ToolDefinition);\n return this;\n }\n\n /**\n * Add an existing tool definition\n *\n * @param tool - Tool definition\n * @returns This builder for chaining\n */\n add(tool: ToolDefinition): this {\n this.tools.push(tool);\n return this;\n }\n\n /**\n * Add multiple tools at once\n *\n * @param tools - Array of tool definitions\n * @returns This builder for chaining\n */\n addTools(tools: ToolDefinition[]): this {\n this.tools.push(...tools);\n return this;\n }\n\n /**\n * Build the MCP server definition\n *\n * @returns Complete MCP server definition\n */\n build(): McpServerDefinition {\n return {\n name: this.name,\n version: this.version,\n tools: this.tools,\n };\n }\n}\n\n/**\n * Create an MCP server definition\n *\n * @param name - Server name\n * @param tools - Array of tool definitions\n * @param version - Server version\n * @returns MCP server definition\n *\n * @example\n * ```typescript\n * const server = createMcpServer('my-server', [\n * tool('greet', 'Greet someone', { type: 'object', properties: { name: { type: 'string' } } }),\n * tool('farewell', 'Say goodbye', { type: 'object', properties: { name: { type: 'string' } } }),\n * ]);\n * ```\n */\nexport function createMcpServer(\n name: string,\n tools: ToolDefinition[],\n version: string = '1.0.0'\n): McpServerDefinition {\n return {\n name,\n version,\n tools,\n };\n}\n\n/**\n * Create an MCP server using the builder pattern\n *\n * @param name - Server name\n * @param version - Server version\n * @returns MCP server builder\n *\n * @example\n * ```typescript\n * const server = mcpServer('my-tools')\n * .addTool({\n * name: 'hello',\n * description: 'Say hello',\n * inputSchema: { type: 'object', properties: {} },\n * handler: async () => ({ content: [{ type: 'text', text: 'Hello!' }] }),\n * })\n * .build();\n * ```\n */\nexport function mcpServer(name: string, version?: string): McpServerBuilder {\n return new McpServerBuilder(name, version);\n}\n","/**\n * Token Utilities\n *\n * Helpers for creating and decoding JWT tokens for authentication.\n * These are primarily for server-side use (Node.js).\n */\n\nimport type {\n BudgetTokenPayload,\n CreateTokenOptions,\n DecodedToken,\n TokenBudget,\n} from '../types/token.js';\n\n/**\n * Base64URL encode a string\n */\nfunction base64UrlEncode(data: string | Uint8Array): string {\n let base64: string;\n\n if (typeof data === 'string') {\n // Use TextEncoder for string\n const bytes = new TextEncoder().encode(data);\n base64 = btoa(String.fromCharCode(...bytes));\n } else {\n base64 = btoa(String.fromCharCode(...data));\n }\n\n return base64\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Base64URL decode a string\n */\nfunction base64UrlDecode(str: string): string {\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n const padding = '='.repeat((4 - (base64.length % 4)) % 4);\n const bytes = atob(base64 + padding);\n return bytes;\n}\n\n/**\n * Get crypto implementation (browser or Node.js)\n */\nasync function getCrypto(): Promise<{\n subtle: SubtleCrypto;\n getRandomValues: (array: Uint8Array) => Uint8Array;\n}> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n return crypto;\n }\n\n // Node.js: use webcrypto\n const nodeCrypto = await import('crypto');\n return nodeCrypto.webcrypto as unknown as {\n subtle: SubtleCrypto;\n getRandomValues: (array: Uint8Array) => Uint8Array;\n };\n}\n\n/**\n * Create HMAC-SHA256 signature\n */\nasync function createHmacSignature(secret: string, data: string): Promise<string> {\n const { subtle } = await getCrypto();\n\n const keyData = new TextEncoder().encode(secret);\n const key = await subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await subtle.sign('HMAC', key, new TextEncoder().encode(data));\n return base64UrlEncode(new Uint8Array(signature));\n}\n\n/**\n * Verify HMAC-SHA256 signature\n */\nasync function verifyHmacSignature(\n secret: string,\n data: string,\n signature: string\n): Promise<boolean> {\n const expectedSignature = await createHmacSignature(secret, data);\n return signature === expectedSignature;\n}\n\n/**\n * Create a budget token (JWT) for authenticating with Chucky\n *\n * @param options - Token creation options\n * @returns Signed JWT token\n *\n * @example\n * ```typescript\n * // Server-side token creation\n * const token = await createToken({\n * userId: 'user-123',\n * projectId: '550e8400-e29b-41d4-a716-446655440000',\n * secret: 'your-hmac-secret',\n * budget: {\n * ai: 1_000_000, // $1 in microdollars\n * compute: 3600, // 1 hour\n * window: 'day',\n * windowStart: new Date().toISOString(),\n * },\n * });\n * ```\n */\nexport async function createToken(options: CreateTokenOptions): Promise<string> {\n const {\n userId,\n projectId,\n secret,\n expiresIn = 3600,\n budget,\n permissions,\n sdkConfig,\n } = options;\n\n const now = Math.floor(Date.now() / 1000);\n\n const payload: BudgetTokenPayload = {\n sub: userId,\n iss: projectId,\n iat: now,\n exp: now + expiresIn,\n budget,\n ...(permissions && { permissions }),\n ...(sdkConfig && { sdkConfig }),\n };\n\n // Create header\n const header = {\n alg: 'HS256',\n typ: 'JWT',\n };\n\n // Encode header and payload\n const encodedHeader = base64UrlEncode(JSON.stringify(header));\n const encodedPayload = base64UrlEncode(JSON.stringify(payload));\n\n // Create signature\n const signatureInput = `${encodedHeader}.${encodedPayload}`;\n const signature = await createHmacSignature(secret, signatureInput);\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n}\n\n/**\n * Decode a token without verification\n *\n * @param token - JWT token to decode\n * @returns Decoded token parts\n *\n * @example\n * ```typescript\n * const decoded = decodeToken(token);\n * console.log(decoded.payload.sub); // User ID\n * console.log(decoded.payload.budget); // Budget limits\n * ```\n */\nexport function decodeToken(token: string): DecodedToken {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid token format');\n }\n\n const [encodedHeader, encodedPayload, signature] = parts;\n\n const header = JSON.parse(base64UrlDecode(encodedHeader));\n const payload = JSON.parse(base64UrlDecode(encodedPayload)) as BudgetTokenPayload;\n\n return { header, payload, signature };\n}\n\n/**\n * Verify a token signature\n *\n * @param token - JWT token to verify\n * @param secret - HMAC secret for verification\n * @returns True if signature is valid\n *\n * @example\n * ```typescript\n * const isValid = await verifyToken(token, 'your-hmac-secret');\n * if (!isValid) {\n * throw new Error('Invalid token');\n * }\n * ```\n */\nexport async function verifyToken(token: string, secret: string): Promise<boolean> {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return false;\n }\n\n const [encodedHeader, encodedPayload, signature] = parts;\n const signatureInput = `${encodedHeader}.${encodedPayload}`;\n\n return verifyHmacSignature(secret, signatureInput, signature);\n}\n\n/**\n * Check if a token is expired\n *\n * @param token - JWT token to check\n * @returns True if token is expired\n */\nexport function isTokenExpired(token: string): boolean {\n try {\n const decoded = decodeToken(token);\n const now = Math.floor(Date.now() / 1000);\n return decoded.payload.exp < now;\n } catch {\n return true;\n }\n}\n\n/**\n * @deprecated The project ID is now separate from the HMAC key for security reasons.\n * Get your project ID from the Chucky portal (app.chucky.cloud) instead.\n *\n * Previously, the HMAC key embedded the project ID, but this exposed the secret\n * in JWT tokens. Project IDs are now Convex document IDs visible in the portal.\n *\n * @param _hmacKey - Ignored (previously used to extract project ID)\n * @throws Always throws an error directing users to get project ID from portal\n */\nexport function extractProjectId(_hmacKey: string): never {\n throw new Error(\n 'extractProjectId() is deprecated. The project ID is now separate from the HMAC key for security. ' +\n 'Get your project ID from the Chucky portal (app.chucky.cloud) in your project settings.'\n );\n}\n\n/**\n * Create a simple budget configuration\n *\n * @param options - Budget options\n * @returns Budget configuration\n *\n * @example\n * ```typescript\n * const budget = createBudget({\n * aiDollars: 1.00, // $1 AI budget\n * computeHours: 1, // 1 hour compute\n * window: 'day',\n * });\n * ```\n */\nexport function createBudget(options: {\n /** AI budget in dollars */\n aiDollars: number;\n /** Compute budget in hours */\n computeHours: number;\n /** Budget window */\n window: 'hour' | 'day' | 'week' | 'month';\n /** Window start (default: now) */\n windowStart?: Date;\n}): TokenBudget {\n return {\n ai: Math.floor(options.aiDollars * 1_000_000), // Convert to microdollars\n compute: Math.floor(options.computeHours * 3600), // Convert to seconds\n window: options.window,\n windowStart: (options.windowStart || new Date()).toISOString(),\n };\n}\n","/**\n * Error Classes\n *\n * Custom error types for the Chucky SDK.\n */\n\n/**\n * Base error class for Chucky SDK errors\n */\nexport class ChuckyError extends Error {\n /** Error code */\n readonly code: string;\n /** Additional error details */\n readonly details?: Record<string, unknown>;\n\n constructor(message: string, code: string, details?: Record<string, unknown>) {\n super(message);\n this.name = 'ChuckyError';\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where the error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ChuckyError);\n }\n }\n}\n\n/**\n * Connection error\n */\nexport class ConnectionError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'CONNECTION_ERROR', details);\n this.name = 'ConnectionError';\n }\n}\n\n/**\n * Authentication error\n */\nexport class AuthenticationError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'AUTHENTICATION_ERROR', details);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Budget exceeded error\n */\nexport class BudgetExceededError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'BUDGET_EXCEEDED', details);\n this.name = 'BudgetExceededError';\n }\n}\n\n/**\n * Concurrency limit error\n */\nexport class ConcurrencyLimitError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'CONCURRENCY_LIMIT', details);\n this.name = 'ConcurrencyLimitError';\n }\n}\n\n/**\n * Rate limit error\n */\nexport class RateLimitError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'RATE_LIMIT', details);\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Session error\n */\nexport class SessionError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'SESSION_ERROR', details);\n this.name = 'SessionError';\n }\n}\n\n/**\n * Tool execution error\n */\nexport class ToolExecutionError extends ChuckyError {\n /** Tool name */\n readonly toolName: string;\n\n constructor(message: string, toolName: string, details?: Record<string, unknown>) {\n super(message, 'TOOL_EXECUTION_ERROR', { ...details, toolName });\n this.name = 'ToolExecutionError';\n this.toolName = toolName;\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'TIMEOUT', details);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Validation error\n */\nexport class ValidationError extends ChuckyError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Parse error code from error message\n */\nexport function parseErrorCode(message: string): string | null {\n // Common error patterns\n const patterns = [\n { pattern: /budget.*exceed/i, code: 'BUDGET_EXCEEDED' },\n { pattern: /concurrency.*limit/i, code: 'CONCURRENCY_LIMIT' },\n { pattern: /rate.*limit/i, code: 'RATE_LIMIT' },\n { pattern: /auth|unauthorized|forbidden/i, code: 'AUTHENTICATION_ERROR' },\n { pattern: /timeout/i, code: 'TIMEOUT' },\n { pattern: /connect|disconnect|websocket/i, code: 'CONNECTION_ERROR' },\n { pattern: /session/i, code: 'SESSION_ERROR' },\n { pattern: /tool/i, code: 'TOOL_EXECUTION_ERROR' },\n { pattern: /invalid|validation/i, code: 'VALIDATION_ERROR' },\n ];\n\n for (const { pattern, code } of patterns) {\n if (pattern.test(message)) {\n return code;\n }\n }\n\n return null;\n}\n\n/**\n * Create appropriate error from message and optional code\n */\nexport function createError(message: string, code?: string): ChuckyError {\n const errorCode = code || parseErrorCode(message) || 'UNKNOWN_ERROR';\n\n switch (errorCode) {\n case 'CONNECTION_ERROR':\n return new ConnectionError(message);\n case 'AUTHENTICATION_ERROR':\n return new AuthenticationError(message);\n case 'BUDGET_EXCEEDED':\n return new BudgetExceededError(message);\n case 'CONCURRENCY_LIMIT':\n return new ConcurrencyLimitError(message);\n case 'RATE_LIMIT':\n return new RateLimitError(message);\n case 'SESSION_ERROR':\n return new SessionError(message);\n case 'TIMEOUT':\n return new TimeoutError(message);\n case 'VALIDATION_ERROR':\n return new ValidationError(message);\n default:\n return new ChuckyError(message, errorCode);\n }\n}\n"],"mappings":"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","names":["tool","errorResult","tool"]}
@@ -0,0 +1 @@
1
+ export { APIAssistantMessage, APIUserMessage, AgentDefinition, AuthenticationError, BaseOptions, BudgetExceededError, BudgetTokenPayload, BudgetWindow, ChuckyClient, ChuckyError, ClientEventHandlers, ClientOptions, ConcurrencyLimitError, ConnectionError, ConnectionStatus, ContentBlockType, ControlAction, ControlPayload, CostBreakdown, CreateTokenOptions, CreateToolOptions, DecodedToken, ErrorPayload, ImageBlock, IncomingMessage, InitPayload, JsonSchemaProperty, JsonSchemaType, McpServerBuilder, McpServerDefinition, Message, MessageRole, Model, OutgoingMessage, OutputFormat, PartialMessage, PromptOptions, PromptResult, RateLimitError, ResourceContent, ResultSubtype, SDKAssistantMessage, SDKContentBlock, SDKImageContent, SDKMessage, SDKPartialAssistantMessage, SDKResultMessage, SDKResultMessageError, SDKResultMessageSuccess, SDKSystemMessage, SDKSystemMessageCompact, SDKSystemMessageInit, SDKTextContent, SDKUserMessage, Session, SessionError, SessionEventHandlers, SessionInfo, SessionOptions, SessionResult, SessionState, StreamEvent, SystemPrompt, SystemSubtype, TextBlock, ThinkingBlock, TimeoutError, TokenBudget, TokenPermissions, TokenSdkConfig, ToolCall, ToolCallResponse, ToolContent, ToolContentType, ToolDefinition, ToolExecutionError, ToolExecutionLocation, ToolHandler, ToolImageContent, ToolInputSchema, ToolResult, ToolResultBlock, ToolResultContent, ToolTextContent, ToolUseBlock, ToolUseContent, Transport, TransportConfig, TransportEvents, UUID, Usage, ValidationError, WebSocketTransport, WsEnvelopeType, browserTool, createBudget, createClient, createControlMessage, createError, createInitMessage, createMcpServer, createPingMessage, createToken, createTool, createToolResultMessage, createUserMessage, decodeToken, errorResult, extractProjectId, getAssistantText, getResultText, imageResult, isAssistantMessage, isControlMessage, isErrorMessage, isErrorResult, isResultMessage, isStreamEvent, isSuccessResult, isSystemMessage, isTokenExpired, isToolCallMessage, isUserMessage, mcpServer, serverTool, textResult, tool, verifyToken } from './index.cjs';
package/dist/node.d.ts CHANGED
@@ -1,8 +1 @@
1
- /**
2
- * Node.js Entry Point
3
- *
4
- * Optimized exports for Node.js environments.
5
- * Includes all functionality including token creation.
6
- */
7
- export * from './index.js';
8
- //# sourceMappingURL=node.d.ts.map
1
+ export { APIAssistantMessage, APIUserMessage, AgentDefinition, AuthenticationError, BaseOptions, BudgetExceededError, BudgetTokenPayload, BudgetWindow, ChuckyClient, ChuckyError, ClientEventHandlers, ClientOptions, ConcurrencyLimitError, ConnectionError, ConnectionStatus, ContentBlockType, ControlAction, ControlPayload, CostBreakdown, CreateTokenOptions, CreateToolOptions, DecodedToken, ErrorPayload, ImageBlock, IncomingMessage, InitPayload, JsonSchemaProperty, JsonSchemaType, McpServerBuilder, McpServerDefinition, Message, MessageRole, Model, OutgoingMessage, OutputFormat, PartialMessage, PromptOptions, PromptResult, RateLimitError, ResourceContent, ResultSubtype, SDKAssistantMessage, SDKContentBlock, SDKImageContent, SDKMessage, SDKPartialAssistantMessage, SDKResultMessage, SDKResultMessageError, SDKResultMessageSuccess, SDKSystemMessage, SDKSystemMessageCompact, SDKSystemMessageInit, SDKTextContent, SDKUserMessage, Session, SessionError, SessionEventHandlers, SessionInfo, SessionOptions, SessionResult, SessionState, StreamEvent, SystemPrompt, SystemSubtype, TextBlock, ThinkingBlock, TimeoutError, TokenBudget, TokenPermissions, TokenSdkConfig, ToolCall, ToolCallResponse, ToolContent, ToolContentType, ToolDefinition, ToolExecutionError, ToolExecutionLocation, ToolHandler, ToolImageContent, ToolInputSchema, ToolResult, ToolResultBlock, ToolResultContent, ToolTextContent, ToolUseBlock, ToolUseContent, Transport, TransportConfig, TransportEvents, UUID, Usage, ValidationError, WebSocketTransport, WsEnvelopeType, browserTool, createBudget, createClient, createControlMessage, createError, createInitMessage, createMcpServer, createPingMessage, createToken, createTool, createToolResultMessage, createUserMessage, decodeToken, errorResult, extractProjectId, getAssistantText, getResultText, imageResult, isAssistantMessage, isControlMessage, isErrorMessage, isErrorResult, isResultMessage, isStreamEvent, isSuccessResult, isSystemMessage, isTokenExpired, isToolCallMessage, isUserMessage, mcpServer, serverTool, textResult, tool, verifyToken } from './index.js';