@granular-software/sdk 0.1.0 → 0.2.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/adapters/anthropic.d.mts +1 -1
- package/dist/adapters/anthropic.d.ts +1 -1
- package/dist/adapters/langchain.d.mts +1 -1
- package/dist/adapters/langchain.d.ts +1 -1
- package/dist/adapters/mastra.d.mts +1 -1
- package/dist/adapters/mastra.d.ts +1 -1
- package/dist/adapters/openai.d.mts +1 -1
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/cli/index.js +8325 -0
- package/dist/index.d.mts +149 -4
- package/dist/index.d.ts +149 -4
- package/dist/index.js +441 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +441 -31
- package/dist/index.mjs.map +1 -1
- package/dist/{types-D46q5WTh.d.mts → types-DiMEb3SE.d.mts} +41 -1
- package/dist/{types-D46q5WTh.d.ts → types-DiMEb3SE.d.ts} +41 -1
- package/package.json +18 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ws-client.ts","../src/session.ts","../src/client.ts"],"names":["Automerge","WebSocket","docs"],"mappings":"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","file":"index.js","sourcesContent":["import WebSocket from 'ws';\nimport * as Automerge from '@automerge/automerge';\nimport type {\n WSClientOptions,\n RPCRequest,\n RPCResponse,\n SyncMessage,\n RPCRequestFromServer\n} from './types';\n\nexport class WSClient {\n private ws: WebSocket | null = null;\n private url: string;\n private sessionId: string;\n private token: string;\n private messageQueue: Array<{ resolve: (value: unknown) => void; reject: (error: Error) => void; id: string }> = [];\n private syncHandlers: Array<(message: SyncMessage) => void> = [];\n private rpcHandlers: Map<string, (params: unknown) => Promise<unknown>> = new Map();\n private eventHandlers: Map<string, Array<(params: unknown) => void>> = new Map();\n private nextRpcId = 1;\n public doc: Automerge.Doc<Record<string, unknown>> = Automerge.init();\n private syncState: Automerge.SyncState = Automerge.initSyncState();\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private isExplicitlyDisconnected = false;\n\n constructor(options: WSClientOptions) {\n this.url = options.url;\n this.sessionId = options.sessionId;\n this.token = options.token;\n }\n\n /**\n * Connect to the WebSocket server\n * @returns {Promise<void>} Resolves when connection is open\n */\n async connect(): Promise<void> {\n this.isExplicitlyDisconnected = false;\n return new Promise((resolve, reject) => {\n try {\n // Construct URL with query parameters\n const wsUrl = new URL(this.url);\n wsUrl.searchParams.set('sessionId', this.sessionId);\n wsUrl.searchParams.set('token', this.token);\n\n this.ws = new WebSocket(wsUrl.toString());\n\n this.ws.on('open', () => {\n this.emit('open', {});\n resolve();\n });\n\n this.ws.on('message', (data: WebSocket.Data) => {\n try {\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n });\n\n this.ws.on('error', (error: Error) => {\n this.emit('error', error);\n if (this.ws?.readyState !== WebSocket.OPEN) {\n reject(error);\n }\n });\n\n this.ws.on('close', () => {\n this.emit('close', {});\n this.handleDisconnect();\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private handleDisconnect() {\n this.ws = null;\n if (!this.isExplicitlyDisconnected) {\n // Simple exponential backoff could go here, but for now fixed reconnect\n this.reconnectTimer = setTimeout(() => {\n console.log('[Granular] Attempting reconnect...');\n this.connect().catch(e => console.error('[Granular] Reconnect failed:', e));\n }, 3000);\n }\n }\n\n private handleMessage(message: unknown): void {\n if (typeof message !== 'object' || message === null) return;\n\n // Debug: Log all incoming messages\n console.log('[Granular DEBUG] Received message:', JSON.stringify(message).slice(0, 500));\n\n // 1. Handle Sync Messages (Automerge)\n if ('type' in message && message.type === 'sync') {\n const syncMessage = message as SyncMessage;\n\n try {\n let bytes: Uint8Array;\n const payload = syncMessage.message || syncMessage.data;\n\n if (typeof payload === 'string') {\n const binaryString = atob(payload);\n const len = binaryString.length;\n bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n } else if (Array.isArray(payload)) {\n bytes = new Uint8Array(payload);\n } else if (payload instanceof Uint8Array) {\n bytes = payload;\n } else {\n return;\n }\n\n const [newDoc, newSyncState] = Automerge.receiveSyncMessage(\n this.doc,\n this.syncState,\n bytes\n );\n this.doc = newDoc;\n this.syncState = newSyncState;\n\n // Notify sync listeners with the new doc\n this.emit('sync', this.doc);\n } catch (e) {\n // console.warn('[Granular] Failed to apply sync message', e);\n }\n return;\n }\n\n // 2. Handle RPC Responses (Results/Errors from calls we made)\n if ('type' in message && (message.type === 'rpc_result' || message.type === 'rpc_error')) {\n const response = message as RPCResponse;\n const pending = this.messageQueue.find((q) => q.id === response.id);\n if (pending) {\n if (response.type === 'rpc_error') {\n pending.reject(\n new Error(`RPC error: ${response.error?.message || 'Unknown error'}`)\n );\n } else {\n pending.resolve(response.result);\n }\n this.messageQueue = this.messageQueue.filter((q) => q.id !== response.id);\n }\n return;\n }\n\n // 3. Handle Incoming RPC Requests (Server calls us, e.g. tool.invoke)\n if ('type' in message && message.type === 'rpc' && 'method' in message && 'id' in message) {\n const request = message as RPCRequestFromServer;\n this.handleIncomingRpc(request).catch((error) => {\n console.error('[Granular] Error handling incoming RPC:', error);\n });\n return;\n }\n\n // 4. Handle Generic Events\n if ('type' in message && typeof message.type === 'string') {\n this.emit(message.type, message);\n }\n }\n\n /**\n * Make an RPC call to the server\n * @param {string} method - RPC method name\n * @param {unknown} params - Request parameters\n * @returns {Promise<unknown>} Response result\n * @throws {Error} If connection is closed or timeout occurs\n */\n async call(method: string, params: unknown): Promise<unknown> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket not connected');\n }\n\n const id = `rpc-${this.nextRpcId++}`;\n const request: RPCRequest = {\n type: 'rpc',\n method,\n params,\n id,\n };\n\n return new Promise((resolve, reject) => {\n this.messageQueue.push({ resolve, reject, id });\n\n this.ws!.send(JSON.stringify(request));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n const pending = this.messageQueue.find((q) => q.id === id);\n if (pending) {\n this.messageQueue = this.messageQueue.filter((q) => q.id !== id);\n reject(new Error(`RPC timeout: ${method}`));\n }\n }, 30000);\n });\n }\n\n private async handleIncomingRpc(request: RPCRequestFromServer): Promise<void> {\n const handler = this.rpcHandlers.get(request.method);\n\n if (!handler) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32601,\n message: `Method not found: ${request.method}`,\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n return;\n }\n\n try {\n const result = await handler(request.params);\n\n // Special case: tool.invoke handlers usually respond via tool.result RPC method manually\n // to support streaming or async flows where the response isn't immediate return value.\n // But if they DO return a value, we can treat it as the result.\n // For now, mirroring existing behavior: tool.invoke handlers are responsible for\n // calling tool.result if they want to.\n\n // If NOT tool.invoke, send standard RPC response\n if (request.method !== 'tool.invoke') {\n const successResponse = {\n type: 'rpc_result',\n id: request.id,\n result,\n };\n this.ws?.send(JSON.stringify(successResponse));\n }\n } catch (error) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n }\n }\n\n /**\n * Subscribe to client events\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n */\n on(event: string, handler: (params: unknown) => void): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n this.eventHandlers.get(event)!.push(handler);\n }\n\n /**\n * Register an RPC handler for incoming server requests\n * @param {string} method - RPC method name\n * @param {Function} handler - Handler function\n */\n registerRpcHandler(method: string, handler: (params: unknown) => Promise<unknown>): void {\n this.rpcHandlers.set(method, handler);\n }\n\n /**\n * Unsubscribe from client events\n * @param {string} event - Event name\n * @param {Function} handler - Handler to remove\n */\n off(event: string, handler: (params: unknown) => void): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n this.eventHandlers.set(\n event,\n handlers.filter((h) => h !== handler)\n );\n }\n }\n\n /**\n * Emit an event locally\n * @param {string} event - Event name\n * @param params - Event data\n */\n emit(event: string, params: unknown): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => handler(params));\n }\n }\n\n /**\n * Disconnect the WebSocket and clear state\n */\n disconnect(): void {\n this.isExplicitlyDisconnected = true;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.messageQueue.forEach(q => q.reject(new Error('Client explicitly disconnected')));\n this.messageQueue = [];\n this.rpcHandlers.clear();\n this.emit('disconnect', {});\n }\n}\n","import { WSClient } from './ws-client';\nimport type {\n Job,\n JobStatus,\n Prompt,\n ToolWithHandler,\n ToolSchema,\n PublishToolsResult,\n ToolHandler,\n InstanceToolHandler,\n ToolInvokeParams,\n DomainState,\n JobSubmitResult\n} from './types';\nimport type { Doc } from '@automerge/automerge';\n\n// Re-export types that were previously defined here\nexport { ToolWithHandler, ToolSchema, PublishToolsResult, ToolHandler, InstanceToolHandler, DomainState, JobSubmitResult };\n\nexport class Session {\n protected client: WSClient;\n private clientId: string;\n private jobsMap: Map<string, JobImplementation> = new Map();\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n private toolHandlers: Map<string, ToolHandler | InstanceToolHandler> = new Map();\n /** Tracks which tools are instance methods (className set, not static) */\n private instanceTools: Set<string> = new Set();\n private currentDomainRevision: string | null = null;\n\n constructor(client: WSClient, clientId?: string) {\n this.client = client;\n this.clientId = clientId || `client_${Date.now()}`;\n this.setupEventHandlers();\n this.setupToolInvokeHandler();\n }\n\n // --- Public API ---\n\n get document(): Doc<Record<string, unknown>> {\n return this.client.doc;\n }\n\n get domainRevision(): string | null {\n return this.currentDomainRevision;\n }\n\n /**\n * Make a raw RPC call to the session's Durable Object.\n *\n * Use this when you need to call an RPC method that doesn't have a\n * dedicated wrapper method on the Session/Environment class.\n *\n * @param method - RPC method name (e.g. 'domain.fetchPackagePart')\n * @param params - Request parameters\n * @returns The raw RPC response\n *\n * @example\n * ```typescript\n * const result = await env.rpc('domain.fetchPackagePart', {\n * moduleSpecifier: '@sandbox/domain',\n * part: 'types',\n * });\n * ```\n */\n async rpc<T = unknown>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.client.call(method, params) as Promise<T>;\n }\n\n /**\n * Send client hello to establish the session\n */\n async hello(): Promise<{ ok: boolean; environmentId?: string; docId?: string }> {\n const result = await this.client.call('client.hello', {\n clientId: this.clientId,\n protocolVersion: '2.0',\n });\n return result as { ok: boolean; environmentId?: string; docId?: string };\n }\n\n /**\n * Publish tools to the sandbox and register handlers for reverse-RPC.\n *\n * Tools can be:\n * - **Instance methods**: set `className` (handler receives `(objectId, params)`)\n * - **Static methods**: set `className` + `static: true` (handler receives `(params)`)\n * - **Global tools**: omit `className` (handler receives `(params)`)\n *\n * Both `inputSchema` and `outputSchema` accept JSON Schema objects. The\n * `outputSchema` drives the return type in the auto-generated TypeScript\n * class declarations that sandbox code imports from `./sandbox-tools`.\n *\n * This method:\n * 1. Extracts tool schemas (including `outputSchema`) from the provided tools\n * 2. Publishes them via `client.publishRawToolCatalog` RPC\n * 3. Registers handlers locally for `tool.invoke` RPC calls\n * 4. Returns the `domainRevision` needed for job submission\n *\n * @param tools - Array of tools with handlers\n * @param revision - Optional revision string (default: \"1.0.0\")\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishTools([\n * {\n * name: 'get_bio',\n * description: 'Get biography of an author',\n * className: 'author',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * outputSchema: { type: 'object', properties: { bio: { type: 'string' } }, required: ['bio'] },\n * handler: async (id, params) => ({ bio: `Bio of ${id}` }),\n * },\n * ]);\n * ```\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n // 1. Extract schemas (strip handlers)\n const schemas: ToolSchema[] = tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n stability: tool.stability || 'stable',\n provenance: tool.provenance || { source: 'mcp' },\n tags: tool.tags,\n className: tool.className,\n static: tool.static,\n }));\n\n // 2. Publish to server\n const result = await this.client.call('client.publishRawToolCatalog', {\n clientId: this.clientId,\n revision,\n tools: schemas,\n }) as { accepted?: boolean; domainRevision?: string; rejected?: Array<{ name: string; reason: string }> };\n\n if (!result.accepted || !result.domainRevision) {\n throw new Error(`Failed to publish tools: ${JSON.stringify(result.rejected)}`);\n }\n\n // 3. Register handlers for reverse-RPC\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n // Track instance methods: className set and not explicitly static\n if (tool.className && !tool.static) {\n this.instanceTools.add(tool.name);\n } else {\n this.instanceTools.delete(tool.name);\n }\n }\n\n // 4. Store domain revision\n this.currentDomainRevision = result.domainRevision;\n\n return {\n accepted: result.accepted,\n domainRevision: result.domainRevision,\n rejected: result.rejected,\n };\n }\n\n /**\n * Submit a job to execute code in the sandbox.\n *\n * The code can import typed classes from `./sandbox-tools`:\n * ```typescript\n * import { Author, Book, global_search } from './sandbox-tools';\n *\n * const tolkien = await Author.find({ id: 'tolkien' });\n * const bio = await tolkien.get_bio({ detailed: true });\n * const books = await tolkien.get_books();\n * ```\n *\n * Tool calls (instance methods, static methods, global functions) trigger\n * `tool.invoke` RPC back to this client, where the registered handlers\n * execute locally and return the result to the sandbox.\n */\n async submitJob(code: string, domainRevision?: string): Promise<Job> {\n const revision = domainRevision || this.currentDomainRevision;\n if (!revision) {\n throw new Error('No domain revision available. Call publishTools() first.');\n }\n\n const result = await this.client.call('job.submit', {\n domainRevision: revision,\n code,\n }) as { jobId?: string };\n\n if (!result.jobId) {\n throw new Error('Failed to submit job: no jobId returned');\n }\n\n const job = new JobImplementation(result.jobId, this.client);\n this.jobsMap.set(result.jobId, job);\n return job;\n }\n\n /**\n * Register a handler for a specific tool.\n * @param isInstance - If true, handler will receive (id, params) for instance method dispatch.\n */\n registerToolHandler(name: string, handler: ToolHandler | InstanceToolHandler, isInstance = false): void {\n this.toolHandlers.set(name, handler);\n if (isInstance) {\n this.instanceTools.add(name);\n } else {\n this.instanceTools.delete(name);\n }\n }\n\n /**\n * Respond to a prompt request from the sandbox\n */\n async answerPrompt(promptId: string, answer: unknown): Promise<void> {\n await this.client.call('prompt.answer', { promptId, value: answer });\n }\n\n /**\n * Get the current domain state and available tools\n */\n async getDomain(): Promise<DomainState> {\n return this.client.call('domain.getSummary', {}) as Promise<DomainState>;\n }\n\n /**\n * Get auto-generated TypeScript class declarations for the current domain.\n *\n * Returns typed declarations including:\n * - Classes with readonly properties (from manifest)\n * - `static find(query: { id: string })` for each class\n * - Instance methods with typed input/output (from `publishTools` with `className`)\n * - Static methods (from `publishTools` with `className` + `static: true`)\n * - Relationship accessors (`get_books()`, `get_author()`, etc.)\n * - Global tool functions (from `publishTools` without `className`)\n *\n * Pass this documentation to LLMs so they can write correct typed code\n * that imports from `./sandbox-tools`.\n *\n * Falls back to generating markdown docs from the domain summary if\n * the synthesis server is unavailable.\n */\n async getDomainDocumentation(): Promise<string> {\n try {\n const typesResult = await this.client.call('domain.fetchPackagePart', {\n moduleSpecifier: '@sandbox/domain',\n part: 'types',\n }) as { content?: string; signedUrl?: string };\n\n if (typesResult.content) {\n return typesResult.content;\n }\n } catch {\n // Fall back to generating docs from summary\n }\n\n // Generate fallback documentation from domain summary\n const summary = await this.getDomain();\n return this.generateFallbackDocs(summary);\n }\n\n /**\n * Generate markdown documentation from the domain summary.\n * Class-aware: groups tools by class with property/relationship info.\n */\n private generateFallbackDocs(summary: DomainState): string {\n const classes = (summary as any).classes as Record<string, any> | undefined;\n const globalTools = (summary as any).globalTools as any[] | undefined;\n const tools = summary.tools || [];\n\n // If we have class data, produce class-aware docs\n if (classes && Object.keys(classes).length > 0) {\n let docs = '# Domain Documentation\\n\\n';\n docs += 'Import classes and tools from `./sandbox-tools`:\\n\\n';\n\n const classNames = Object.keys(classes).map(\n (c) => c.charAt(0).toUpperCase() + c.slice(1),\n );\n const globalNames = (globalTools || []).map((t: any) => t.name);\n const allImports = [...classNames, ...globalNames].join(', ');\n docs += `\\`\\`\\`typescript\\nimport { ${allImports} } from \"./sandbox-tools\";\\n\\`\\`\\`\\n\\n`;\n\n for (const [className, cls] of Object.entries(classes)) {\n const TsName = className.charAt(0).toUpperCase() + className.slice(1);\n docs += `## ${TsName}\\n\\n`;\n if (cls.description) docs += `${cls.description}\\n\\n`;\n\n if (cls.properties?.length > 0) {\n docs += '**Properties:**\\n';\n for (const p of cls.properties) {\n docs += `- \\`${p.name}\\`${p.description ? ': ' + p.description : ''}\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.relationships?.length > 0) {\n docs += '**Relationships:**\\n';\n for (const r of cls.relationships) {\n const fModel = r.foreignModel?.charAt(0).toUpperCase() + r.foreignModel?.slice(1);\n docs += `- \\`${r.localSubmodel}\\` → ${fModel} (${r.kind})\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.methods?.length > 0) {\n docs += '**Methods:**\\n';\n for (const m of cls.methods) {\n docs += `- \\`${TsName}.${m.name}(input)\\``;\n if (m.description) docs += `: ${m.description}`;\n docs += '\\n';\n if (m.inputSchema?.properties) {\n docs += ' ```json\\n ' + JSON.stringify(m.inputSchema, null, 2).replace(/\\n/g, '\\n ') + '\\n ```\\n';\n }\n }\n docs += '\\n';\n }\n }\n\n if (globalTools && globalTools.length > 0) {\n docs += '## Global Tools\\n\\n';\n for (const tool of globalTools) {\n docs += `### ${tool.name}\\n\\n`;\n if (tool.description) docs += `${tool.description}\\n\\n`;\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n }\n\n return docs;\n }\n\n // Legacy flat fallback\n if (!tools || tools.length === 0) {\n return 'No tools available in this domain.';\n }\n\n let docs = '# Available Tools\\n\\n';\n docs += 'Import tools from `./sandbox-tools` and call them with await:\\n\\n';\n docs += '```typescript\\nimport { tools } from \"./sandbox-tools\";\\n\\n';\n docs += '// Example:\\n';\n docs += `const result = await tools.${tools[0]?.name || 'example'}(input);\\n`;\n docs += '```\\n\\n';\n\n for (const tool of tools) {\n docs += `## ${tool.name}\\n\\n`;\n if (tool.description) {\n docs += `${tool.description}\\n\\n`;\n }\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n if (tool.outputSchema) {\n docs += '**Output Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.outputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n\n return docs;\n }\n\n /**\n * Close the session and disconnect from the sandbox\n */\n async disconnect(): Promise<void> {\n this.client.disconnect();\n }\n\n // --- Event Handling ---\n\n /**\n * Subscribe to session events\n */\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n /**\n * Unsubscribe from session events\n */\n off(event: string, handler: (data: unknown) => void): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n this.eventListeners.set(event, handlers.filter(h => h !== handler));\n }\n }\n\n // --- Internal ---\n\n private setupToolInvokeHandler(): void {\n this.client.registerRpcHandler('tool.invoke', async (params: unknown) => {\n const { callId, toolName, input } = params as ToolInvokeParams;\n\n this.emit('tool:invoke', { callId, toolName, input });\n\n const handler = this.toolHandlers.get(toolName);\n if (!handler) {\n // Send error result back\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_NOT_FOUND', message: `Tool handler not found: ${toolName}` },\n });\n return;\n }\n\n try {\n let result: unknown;\n // Instance methods receive _objectId from the sandbox runtime\n if (this.instanceTools.has(toolName) && input && typeof input === 'object' && '_objectId' in input) {\n const { _objectId, ...restParams } = input as { _objectId: string; [key: string]: any };\n result = await (handler as InstanceToolHandler)(_objectId, restParams);\n } else {\n result = await (handler as ToolHandler)(input);\n }\n this.emit('tool:result', { callId, result });\n\n // Send result back to sandbox\n await this.client.call('tool.result', {\n callId,\n result,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.emit('tool:result', { callId, error: errorMessage });\n\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_EXECUTION_FAILED', message: errorMessage },\n });\n }\n });\n }\n\n private setupEventHandlers(): void {\n // Pipe client events to session events\n this.client.on('sync', (doc: unknown) => this.emit('sync', doc));\n this.client.on('prompt', (prompt: unknown) => this.emit('prompt', prompt));\n this.client.on('disconnect', () => this.emit('disconnect', {}));\n\n // Job status updates\n this.client.on('job.status', (data: unknown) => {\n this.emit('job:status', data);\n });\n\n // Exec events\n this.client.on('exec.completed', (data: unknown) => {\n this.emit('exec:completed', data);\n });\n this.client.on('exec.progress', (data: unknown) => {\n this.emit('exec:progress', data);\n });\n }\n\n private emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n}\n\n// --- Job Implementation ---\n\nclass JobImplementation implements Job {\n public id: string;\n public client: WSClient;\n public status: JobStatus = 'queued';\n\n private _resultPromise: Promise<unknown>;\n private _resolveResult!: (value: unknown) => void;\n private _rejectResult!: (reason: unknown) => void;\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n\n constructor(id: string, client: WSClient) {\n this.id = id;\n this.client = client;\n\n this._resultPromise = new Promise((resolve, reject) => {\n this._resolveResult = resolve;\n this._rejectResult = reject;\n });\n\n // Listen to exec events\n this.client.on('exec.completed', (data: unknown) => {\n const execData = data as { execId?: string; jobId?: string; result?: unknown; error?: unknown };\n if (execData.execId === id || execData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n if (execData.error) {\n this._rejectResult(execData.error);\n } else {\n this._resolveResult(execData.result);\n }\n }\n });\n\n this.client.on('exec.progress', (data: unknown) => {\n const progressData = data as { execId?: string; jobId?: string; stdout?: string; stderr?: string };\n if (progressData.execId === id || progressData.jobId === id) {\n if (progressData.stdout) {\n this.emit('stdout', progressData.stdout);\n }\n if (progressData.stderr) {\n this.emit('stderr', progressData.stderr);\n }\n }\n });\n\n // Also listen to specific job events if available\n this.client.on(`job.${id}.status`, (status: unknown) => {\n this.status = status as JobStatus;\n this.emit('status', status);\n });\n\n this.client.on(`job.${id}.stdout`, (line: unknown) => {\n this.emit('stdout', line);\n });\n\n this.client.on(`job.${id}.stderr`, (line: unknown) => {\n this.emit('stderr', line);\n });\n\n this.client.on(`job.${id}.result`, (result: unknown) => {\n this.status = 'succeeded';\n this._resolveResult(result);\n });\n\n this.client.on(`job.${id}.error`, (error: unknown) => {\n this.status = 'failed';\n this._rejectResult(error);\n });\n\n // Listen for job.completed and job.failed events (generic events from backend)\n this.client.on('job.completed', (data: unknown) => {\n const jobData = data as { jobId?: string; result?: unknown };\n if (jobData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n this._resolveResult(jobData.result);\n }\n });\n\n this.client.on('job.failed', (data: unknown) => {\n const jobData = data as { jobId?: string; error?: unknown };\n if (jobData.jobId === id) {\n this.status = 'failed';\n this.emit('status', this.status);\n this._rejectResult(jobData.error || new Error('Job failed'));\n }\n });\n }\n\n get result(): Promise<unknown> {\n return this._resultPromise;\n }\n\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n private emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n}\n","import { WSClient } from './ws-client';\nimport { Session, ToolWithHandler, PublishToolsResult } from './session';\nimport type {\n GranularOptions,\n ConnectOptions,\n RecordUserOptions,\n User,\n Subject,\n Sandbox,\n SandboxListResponse,\n CreateSandboxData,\n PermissionProfile,\n PermissionProfileListResponse,\n CreatePermissionProfileData,\n EnvironmentData,\n EnvironmentListResponse,\n CreateEnvironmentData,\n Assignment,\n AssignmentListResponse,\n DeleteResponse,\n GraphQLResult,\n RelationshipInfo,\n ModelRef,\n DefineRelationshipOptions,\n ManifestContent,\n ManifestOperation,\n ManifestPropertySpec,\n ManifestImport,\n RecordObjectOptions,\n RecordObjectResult,\n} from './types';\n\n// ── Built-in modules ──\n\n/**\n * Standard modules: base types available via `imports: [{ alias: \"@std\", name: \"standard_modules\" }]`\n */\nconst STANDARD_MODULES_OPERATIONS: ManifestOperation[] = [\n { create: 'entity', has: { id: { value: 'auto-generated' }, createdAt: { value: undefined } } },\n { create: 'class', extends: 'entity', has: {} },\n { create: 'user', extends: 'entity', has: { email: { value: undefined }, firstName: { value: undefined }, lastName: { value: undefined } } },\n { create: 'company', extends: 'entity', has: { name: { value: undefined }, website: { value: undefined } } },\n { create: 'string', has: { value: { value: undefined } } },\n { create: 'number', has: { value: { value: 0 } } },\n { create: 'boolean', has: { value: { value: false } } },\n { create: 'tool_parameter', has: { name: { value: undefined }, type: { value: 'string' }, description: { value: undefined }, required: { value: false } } },\n];\n\n/**\n * Registry of built-in modules that can be imported in manifests\n */\nconst BUILTIN_MODULES: Record<string, ManifestOperation[]> = {\n 'standard_modules': STANDARD_MODULES_OPERATIONS,\n};\n\n/**\n * Environment represents a connected session to a sandbox for a specific user.\n *\n * After connecting, you can:\n * 1. Define your domain ontology via `applyManifest()` (classes, properties, relationships)\n * 2. Record object instances via `recordObject()` (with fields and relationship attachments)\n * 3. Publish tools via `publishTools()` (instance methods, static methods, global tools — with typed I/O)\n * 4. Submit jobs via `submitJob()` that import auto-generated typed classes from `./sandbox-tools`\n * 5. Execute GraphQL queries via `graphql()` (authenticated automatically)\n *\n * Tool calls from the sandbox automatically invoke your handlers via reverse-RPC.\n *\n * Object IDs are unique per class. Internally, the graph path is `{className}_{id}`\n * (e.g., `author_tolkien`). Use `Environment.toGraphPath()` and\n * `Environment.extractIdFromGraphPath()` for conversions.\n */\nexport class Environment extends Session {\n private envData: EnvironmentData;\n private _apiKey: string;\n private _apiEndpoint: string;\n\n constructor(client: WSClient, envData: EnvironmentData, clientId: string, apiKey: string, apiEndpoint: string) {\n super(client, clientId);\n this.envData = envData;\n this._apiKey = apiKey;\n this._apiEndpoint = apiEndpoint;\n }\n\n /** The environment ID */\n get environmentId(): string {\n return this.envData.environmentId;\n }\n\n /** The sandbox ID */\n get sandboxId(): string {\n return this.envData.sandboxId;\n }\n\n /** The subject ID */\n get subjectId(): string {\n return this.envData.subjectId;\n }\n\n /** The permission profile ID */\n get permissionProfileId(): string {\n return this.envData.permissionProfileId;\n }\n\n /** The GraphQL API endpoint URL */\n get apiEndpoint(): string {\n return this._apiEndpoint;\n }\n\n // ==================== ID ↔ GRAPH PATH MAPPING ====================\n\n /**\n * Convert a class name + real-world ID into a unique graph path.\n *\n * Two objects of *different* classes may share the same real-world ID,\n * so the graph path must incorporate the class to guarantee uniqueness.\n *\n * Format: `{className}_{id}` — deterministic, human-readable.\n *\n * **Convention**: class names should be simple identifiers without\n * underscores (e.g. `author`, `book`). This ensures the prefix is\n * unambiguously parseable by `extractIdFromGraphPath`.\n */\n static toGraphPath(className: string, id: string): string {\n return `${className}_${id}`;\n }\n\n /**\n * Extract the real-world ID from a graph path, given the class name.\n *\n * Strips the `{className}_` prefix. Returns the raw path if the\n * expected prefix is not found.\n */\n static extractIdFromGraphPath(graphPath: string, className: string): string {\n const prefix = `${className}_`;\n return graphPath.startsWith(prefix) ? graphPath.substring(prefix.length) : graphPath;\n }\n\n /**\n * Execute a GraphQL query against the environment's graph.\n * \n * The query uses the Granular graph query language (based on Cypher/GraphQL).\n * Authentication is handled automatically using the SDK's API key.\n * \n * @param query - The GraphQL query string\n * @param variables - Optional variables for the query\n * @returns The query result data\n * \n * @example\n * ```typescript\n * // Read the workspace\n * const result = await env.graphql(\n * `query { model(path: \"workspace\") { path label submodels { path label } } }`\n * );\n * console.log(result.data);\n * \n * // Create a model\n * const created = await env.graphql(\n * `mutation { at(path: \"workspace\") { create_submodel(subpath: \"my_node\", label: \"My Node\", prototype: \"Model\") { model { path label } } } }`\n * );\n * ```\n */\n async graphql<T = any>(query: string, variables?: Record<string, any>): Promise<GraphQLResult<T>> {\n const response = await fetch(this._apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify({\n environmentId: this.environmentId,\n query,\n variables,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GraphQL API Error (${response.status}): ${errorText}`);\n }\n\n return response.json() as Promise<GraphQLResult<T>>;\n }\n\n // ==================== RELATIONSHIP METHODS ====================\n\n /**\n * Define a relationship between two model types.\n * \n * Creates both submodels (if they don't exist) and links them with\n * a RelationshipDef node that encodes cardinality.\n * \n * @example\n * ```typescript\n * // Author has many Books, Book has one Author\n * const rel = await env.defineRelationship({\n * model: 'author',\n * localSubmodel: 'books',\n * localIsMany: true,\n * foreignModel: 'book',\n * foreignSubmodel: 'author',\n * foreignIsMany: false,\n * });\n * console.log(rel.relationship_kind); // \"one_to_many\"\n * ```\n */\n async defineRelationship(options: DefineRelationshipOptions): Promise<RelationshipInfo> {\n const result = await this.graphql<{\n at: {\n define_relationship: RelationshipInfo;\n };\n }>(\n `mutation DefineRelationship(\n $localSubmodel: String!,\n $foreignModel: String!,\n $foreignSubmodel: String!,\n $localIsMany: Boolean!,\n $foreignIsMany: Boolean!,\n $name: String\n ) {\n at(path: \"${options.model}\") {\n define_relationship(\n local_submodel: $localSubmodel\n foreign_model: $foreignModel\n foreign_submodel: $foreignSubmodel\n local_is_many: $localIsMany\n foreign_is_many: $foreignIsMany\n name: $name\n ) {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n {\n localSubmodel: options.localSubmodel,\n foreignModel: options.foreignModel,\n foreignSubmodel: options.foreignSubmodel,\n localIsMany: options.localIsMany,\n foreignIsMany: options.foreignIsMany,\n name: options.name,\n }\n );\n\n if (result.errors?.length) {\n throw new Error(`defineRelationship failed: ${result.errors[0].message}`);\n }\n\n return result.data!.at.define_relationship;\n }\n\n /**\n * Get all relationships for a model type.\n * \n * @param modelPath - The model type path (e.g., \"author\")\n * @returns Array of relationships from this model's perspective\n * \n * @example\n * ```typescript\n * const rels = await env.getRelationships('author');\n * for (const rel of rels) {\n * console.log(`${rel.local_submodel.path} -> ${rel.foreign_model.path} (${rel.relationship_kind})`);\n * }\n * ```\n */\n async getRelationships(modelPath: string): Promise<RelationshipInfo[]> {\n const result = await this.graphql<{\n model: {\n relationships: RelationshipInfo[];\n };\n }>(\n `query GetRelationships($path: String) {\n model(path: $path) {\n relationships {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n { path: modelPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`getRelationships failed: ${result.errors[0].message}`);\n }\n\n return result.data?.model?.relationships || [];\n }\n\n /**\n * Attach a target model to a relationship submodel.\n * \n * Handles cardinality automatically:\n * - \"One\" side: sets/replaces the reference\n * - \"Many\" side: adds the target to the collection\n * \n * If the target model doesn't exist, it's created as an instance of the foreign type.\n * Bidirectional sync is automatic.\n * \n * @param modelPath - The model instance path (e.g., \"tolkien\")\n * @param submodelPath - The relationship submodel (e.g., \"books\")\n * @param targetPath - The target model to attach (e.g., \"lord_of_the_rings\")\n * \n * @example\n * ```typescript\n * // Attach a book to an author (many side)\n * await env.attach('tolkien', 'books', 'lord_of_the_rings');\n * // This also automatically sets lord_of_the_rings:author -> tolkien\n * ```\n */\n async attach(modelPath: string, submodelPath: string, targetPath: string): Promise<void> {\n const result = await this.graphql(\n `mutation Attach($target: String!) {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n attach(target: $target) {\n model { path }\n }\n }\n }\n }`,\n { target: targetPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`attach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * Detach a target model from a relationship submodel.\n * \n * Handles bidirectional cleanup automatically.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @param targetPath - The target to detach (optional for \"one\" side; omit on \"many\" side to detach all)\n * \n * @example\n * ```typescript\n * // Detach a specific book\n * await env.detach('tolkien', 'books', 'lord_of_the_rings');\n * \n * // Detach all books\n * await env.detach('tolkien', 'books');\n * ```\n */\n async detach(modelPath: string, submodelPath: string, targetPath?: string): Promise<void> {\n const targetArg = targetPath ? `target: \"${targetPath}\"` : '';\n const result = await this.graphql(\n `mutation Detach {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n detach(${targetArg}) {\n model { path }\n }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`detach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * List all related models through a relationship submodel.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @returns Array of related model references\n * \n * @example\n * ```typescript\n * const books = await env.listRelated('tolkien', 'books');\n * console.log(books); // [{ path: \"lord_of_the_rings\", label: \"Lord of the Rings\" }, ...]\n * ```\n */\n async listRelated(modelPath: string, submodelPath: string): Promise<ModelRef[]> {\n const result = await this.graphql<{\n at: {\n at: {\n list_related: ModelRef[];\n };\n };\n }>(\n `mutation ListRelated {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n list_related { path label }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`listRelated failed: ${result.errors[0].message}`);\n }\n\n return result.data?.at?.at?.list_related || [];\n }\n\n /**\n * Apply a manifest to the current environment's graph.\n * \n * Translates each manifest operation into GraphQL mutations and executes them\n * in order. This is the core mechanism for creating classes, fields, and\n * relationships from a declarative manifest.\n * \n * @param manifest - The manifest content to apply\n * @returns Summary of applied operations\n * \n * @example\n * ```typescript\n * await environment.applyManifest({\n * schemaVersion: 2,\n * name: 'my-app',\n * volumes: [{\n * name: 'schema',\n * scope: 'sandbox',\n * operations: [\n * { create: 'author', extends: 'class', has: { name: { type: 'string' } } },\n * { create: 'book', extends: 'class', has: { title: { type: 'string' } } },\n * { defineRelationship: {\n * left: 'author', right: 'book',\n * leftSubmodel: 'books', rightSubmodel: 'author',\n * leftIsMany: true, rightIsMany: false,\n * }},\n * ],\n * }],\n * });\n * ```\n */\n async applyManifest(manifest: ManifestContent): Promise<{ applied: number; errors: string[] }> {\n const errors: string[] = [];\n let applied = 0;\n\n for (const volume of manifest.volumes) {\n // Build alias map from imports\n const aliasMap: Record<string, string> = {};\n\n // Resolve and apply imports first\n if (volume.imports) {\n for (const imp of volume.imports) {\n aliasMap[imp.alias] = imp.name;\n\n const builtinOps = BUILTIN_MODULES[imp.name];\n if (builtinOps) {\n for (const op of builtinOps) {\n try {\n await this._applyOperation(op, {});\n applied++;\n } catch (err: any) {\n // Ignore \"already exists\" errors from re-applying imports\n if (!err.message?.includes('already exists')) {\n errors.push(`Import ${imp.name} operation failed: ${err.message}`);\n }\n }\n }\n } else {\n errors.push(`Unknown module: \"${imp.name}\" (only built-in modules are supported)`);\n }\n }\n }\n\n // Apply volume operations with alias resolution\n for (const op of volume.operations) {\n try {\n await this._applyOperation(op, aliasMap);\n applied++;\n } catch (err: any) {\n errors.push(`Operation failed: ${err.message}`);\n }\n }\n }\n\n return { applied, errors };\n }\n\n /**\n * Resolve an alias reference like \"@std/class\" → \"class\"\n * Strips the alias prefix, returning the bare model path.\n */\n private _resolveAlias(ref: string, aliasMap: Record<string, string>): string {\n if (!ref.startsWith('@')) return ref;\n const slashIdx = ref.indexOf('/');\n if (slashIdx === -1) return ref;\n const alias = ref.substring(0, slashIdx);\n const symbolName = ref.substring(slashIdx + 1);\n if (aliasMap[alias]) {\n return symbolName; // The import was applied, so the symbol exists at its bare name\n }\n return ref; // Unknown alias, return as-is\n }\n\n /**\n * Apply a single manifest operation via GraphQL\n */\n private async _applyOperation(op: ManifestOperation, aliasMap: Record<string, string>): Promise<void> {\n // 1. Relationship definition (standalone operation)\n if (op.defineRelationship) {\n const rel = op.defineRelationship;\n await this.defineRelationship({\n model: this._resolveAlias(rel.left, aliasMap),\n localSubmodel: rel.leftSubmodel,\n localIsMany: rel.leftIsMany,\n foreignModel: this._resolveAlias(rel.right, aliasMap),\n foreignSubmodel: rel.rightSubmodel,\n foreignIsMany: rel.rightIsMany,\n name: rel.name,\n });\n return;\n }\n\n // 2. Create a new model (optionally extending another)\n if (op.create) {\n const label = op.create.charAt(0).toUpperCase() + op.create.slice(1);\n const extendsRef = op.extends ? this._resolveAlias(op.extends, aliasMap) : undefined;\n const instanceOfRef = op.instanceOf ? this._resolveAlias(op.instanceOf, aliasMap) : undefined;\n\n if (extendsRef) {\n // Create model that extends a parent class\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n await this.graphql(\n `mutation { at(path: \"${op.create}\") { add_superclass(superclass: \"${extendsRef}\") { model { path } } } }`\n );\n } else if (instanceOfRef) {\n // Create an instance of a type\n await this.graphql(\n `mutation { at(path: \"${instanceOfRef}\") { instantiate(path: \"${op.create}\", label: \"${label}\") { model { path } } } }`\n );\n } else {\n // Create a standalone model\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n }\n\n // Apply fields (has) if present\n if (op.has) {\n await this._applyFields(op.create, op.has);\n }\n return;\n }\n\n // 3. Modify an existing model\n if (op.on) {\n const target = this._resolveAlias(op.on, aliasMap);\n if (op.has) {\n await this._applyFields(target, op.has);\n }\n return;\n }\n }\n\n /**\n * Apply field definitions (has) to a model via GraphQL\n */\n private async _applyFields(modelPath: string, fields: Record<string, ManifestPropertySpec>): Promise<void> {\n for (const [fieldName, spec] of Object.entries(fields)) {\n const fieldLabel = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n\n // Create the submodel (field) on the model\n const createResult = await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldLabel}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set type prototype if provided (e.g. 'string', 'number', 'boolean')\n if (spec.type) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n add_prototype(prototype: \"${spec.type}\") { done }\n }\n }\n }`\n );\n }\n\n // Set description if provided\n if (spec.description) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_description(description: \"${spec.description}\") { done }\n }\n }\n }`\n );\n }\n\n // Set value if provided\n if (spec.value !== undefined && spec.value !== null) {\n if (typeof spec.value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${spec.value}\") { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n }\n }\n\n // Set reference if provided\n if (spec.ref) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_reference(reference: \"${spec.ref}\") { done }\n }\n }\n }`\n );\n }\n\n // Recurse into nested has\n if (spec.has) {\n await this._applyFields(`${modelPath}:${fieldName}`, spec.has);\n }\n }\n }\n\n // ==================== RECORD OBJECT ====================\n\n /**\n * Create or update an instance of a class in the graph.\n *\n * Uses `instantiate` under the hood, which has find-or-create semantics:\n * if an instance with the given `id` already exists for the class it is\n * returned; otherwise a new instance is created. Fields are then set\n * (overwriting previous values) and relationships are attached.\n *\n * The graph path is derived as `{className}_{id}` to ensure uniqueness\n * across classes (two objects of different classes may share the same\n * real-world ID). Relationship targets are also resolved automatically\n * using the foreign class from the relationship definition.\n *\n * @param options - The object specification\n * @returns The graph path, real-world ID, and creation status\n *\n * @example\n * ```typescript\n * // Create an author with fields\n * const result = await env.recordObject({\n * className: 'author',\n * id: 'tolkien',\n * label: 'J.R.R. Tolkien',\n * fields: { name: 'J.R.R. Tolkien', birth_year: 1892 },\n * relationships: { books: ['lotr', 'silmarillion'] },\n * });\n * // result.path → 'author_tolkien' (internal graph path)\n * // result.id → 'tolkien' (real-world ID)\n * // result.created → true\n * ```\n */\n async recordObject(options: RecordObjectOptions): Promise<RecordObjectResult> {\n const { className, id, label, fields, relationships } = options;\n\n // Derive a unique graph path: className__id\n const graphPath = Environment.toGraphPath(className, id);\n\n // 1. Check if instance already exists\n const existsResult = await this.graphql<{ model: { path: string } | null }>(\n `query { model(path: \"${graphPath}\") { path } }`\n );\n const alreadyExists = !!existsResult.data?.model;\n\n // 2. Instantiate (find-or-create) under the class using the graph path\n const instResult = await this.graphql(\n `mutation {\n at(path: \"${className}\") {\n instantiate(path: \"${graphPath}\"${label ? `, label: \"${label}\"` : ''}) {\n model { path }\n }\n }\n }`\n );\n if (instResult.errors?.length) {\n throw new Error(`recordObject instantiate failed: ${instResult.errors[0].message}`);\n }\n\n const instancePath = instResult.data?.at?.instantiate?.model?.path ?? graphPath;\n\n // 3. Store the real-world ID as a string field (_realId) for later look-up\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"_realId\", label: \"_realId\") {\n model { path }\n }\n }\n }`\n );\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"_realId\") {\n set_string_value(value: \"${id.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n\n // 4. Set scalar field values\n if (fields) {\n for (const [fieldName, value] of Object.entries(fields)) {\n if (value === null) continue;\n\n // Ensure the submodel exists on the instance\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldName}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set the value based on its JS type\n if (typeof value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${value.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n } else if (typeof value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${value}) { done }\n }\n }\n }`\n );\n } else if (typeof value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${value}) { done }\n }\n }\n }`\n );\n }\n }\n }\n\n // 5. Attach relationships — resolve target IDs to graph paths\n if (relationships) {\n // Query the class's relationship definitions once to find foreign class names\n const rels = await this.getRelationships(className);\n const relMap: Record<string, string> = {};\n for (const rel of rels) {\n // Map submodel name → foreign model class name\n // local_submodel.path may be \"className:submodelName\", extract the leaf\n const submodelLeaf = rel.local_submodel.path.includes(':')\n ? rel.local_submodel.path.split(':').pop()!\n : rel.local_submodel.path;\n relMap[submodelLeaf] = rel.foreign_model.path;\n }\n\n for (const [submodelName, targets] of Object.entries(relationships)) {\n const foreignClass = relMap[submodelName];\n const targetList = Array.isArray(targets) ? targets : [targets];\n for (const target of targetList) {\n // Resolve target real-world ID to graph path using the foreign class\n const targetGraphPath = foreignClass\n ? Environment.toGraphPath(foreignClass, target)\n : target; // Fallback to raw ID if relationship not found\n await this.attach(instancePath, submodelName, targetGraphPath);\n }\n }\n }\n\n return { path: instancePath, id, created: !alreadyExists };\n }\n\n // ==================== PUBLISH TOOLS ====================\n\n /**\n * Convenience method: publish tools and get back wrapped result.\n * This is the main entry point for setting up tools.\n * \n * @example\n * ```typescript\n * const tools = [\n * {\n * name: 'get_weather',\n * description: 'Get weather for a city',\n * inputSchema: { type: 'object', properties: { city: { type: 'string' } } },\n * handler: async ({ city }) => ({ temp: 22 }),\n * },\n * ];\n * \n * const { domainRevision } = await environment.publishTools(tools);\n * \n * // Now submit jobs that use those tools\n * const job = await environment.submitJob(`\n * import { Author } from './sandbox-tools';\n * const weather = await Author.get_weather({ city: 'Paris' });\n * return weather;\n * `);\n * \n * const result = await job.result;\n * ```\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n return super.publishTools(tools, revision);\n }\n}\n\nexport class Granular {\n private apiKey: string;\n private apiUrl: string;\n private httpUrl: string;\n\n /**\n * Create a new Granular client\n * @param options - Client configuration\n */\n constructor(options: GranularOptions) {\n this.apiKey = options.apiKey;\n this.apiUrl = options.apiUrl || 'wss://api.granular.dev/v2/ws';\n // Convert WebSocket URL to HTTP URL for REST API\n this.httpUrl = this.apiUrl.replace('wss://', 'https://').replace('/ws', '');\n }\n\n /**\n * Records/upserts a user and prepares them for sandbox connections\n * \n * @param options - User options\n * @returns The user object to pass to connect()\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * name: 'John Doe',\n * permissions: ['agent'],\n * });\n * ```\n */\n async recordUser(options: RecordUserOptions): Promise<User> {\n // Create or get subject via control plane\n const subject = await this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: options.userId,\n name: options.name,\n email: options.email,\n }),\n });\n\n return {\n subjectId: subject.subjectId,\n identityId: options.userId,\n name: options.name,\n email: options.email,\n permissions: options.permissions || [],\n };\n }\n\n /**\n * Connect to a sandbox and establish a real-time environment session.\n * \n * After connecting, use `environment.publishTools()` to register tools,\n * then `environment.submitJob()` to execute code that uses those tools.\n * \n * @param options - Connection options\n * @returns An active environment session\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * permissions: ['agent'],\n * });\n * \n * const environment = await granular.connect({\n * sandbox: 'my-sandbox',\n * user,\n * });\n * \n * // Publish tools\n * await environment.publishTools([\n * { name: 'greet', description: 'Say hello', inputSchema: {}, handler: async () => 'Hello!' },\n * ]);\n * \n * // Submit job\n * const job = await environment.submitJob(`\n * import { tools } from './sandbox-tools';\n * return await tools.greet({});\n * `);\n * \n * console.log(await job.result); // 'Hello!'\n * ```\n */\n async connect(options: ConnectOptions): Promise<Environment> {\n const clientId = `client_${Date.now()}`;\n\n // 1. Find or create the sandbox\n const sandbox = await this.findOrCreateSandbox(options.sandbox);\n\n // 2. Ensure permission profiles and assignments exist for each permission\n for (const profileName of options.user.permissions) {\n const profileId = await this.ensurePermissionProfile(sandbox.sandboxId, profileName);\n await this.ensureAssignment(options.user.subjectId, sandbox.sandboxId, profileId);\n }\n\n // 3. Create the environment\n const envData = await this.environments.create(sandbox.sandboxId, {\n subjectId: options.user.subjectId,\n permissionProfileId: null,\n });\n\n // 4. Connect WebSocket using environment ID\n // The API gateway auto-initializes the Durable Object on first connection when using API key auth\n const client = new WSClient({\n url: this.apiUrl,\n sessionId: envData.environmentId,\n token: this.apiKey,\n });\n\n await client.connect();\n\n // 5. Create environment wrapper and send hello\n // The GraphQL API endpoint goes through the API gateway for authentication\n const graphqlEndpoint = `${this.httpUrl}/orchestrator/graphql`;\n const environment = new Environment(client, envData, clientId, this.apiKey, graphqlEndpoint);\n await environment.hello();\n\n return environment;\n }\n\n /**\n * Find a sandbox by name or create it if it doesn't exist\n */\n private async findOrCreateSandbox(nameOrId: string): Promise<Sandbox> {\n try {\n // Try to get by ID first\n const sandbox = await this.sandboxes.get(nameOrId);\n return sandbox;\n } catch {\n // If not found by ID, try to find by name or create\n const sandboxes = await this.sandboxes.list();\n const existing = sandboxes.items.find(s => s.name === nameOrId);\n if (existing) {\n return existing;\n }\n\n // Create new sandbox\n const created = await this.sandboxes.create({ name: nameOrId });\n return created;\n }\n }\n\n /**\n * Ensure a permission profile exists for a sandbox, creating it if needed.\n * If profileName matches an existing profile name, returns its ID.\n * Otherwise, creates a new profile with default allow-all rules.\n */\n private async ensurePermissionProfile(\n sandboxId: string,\n profileName: string\n ): Promise<string> {\n try {\n // Check if profile already exists by name\n const profiles = await this.permissionProfiles.list(sandboxId);\n const existing = profiles.find((p) => p.name === profileName);\n if (existing) {\n return existing.permissionProfileId;\n }\n } catch {\n // Ignore lookup errors, try to create\n }\n\n // Create new profile with default rules (allow all tools)\n const created = await this.permissionProfiles.create(sandboxId, {\n name: profileName,\n rules: {\n tools: { allow: ['*'] },\n resources: { allow: ['*'] },\n },\n });\n return created.permissionProfileId;\n }\n\n /**\n * Ensure an assignment exists for a subject in a sandbox with a permission profile\n */\n private async ensureAssignment(\n subjectId: string,\n sandboxId: string,\n permissionProfileId: string\n ): Promise<void> {\n try {\n const assignments = await this.request<AssignmentListResponse>(\n `/control/subjects/${subjectId}/assignments`\n );\n // Check for ANY assignment in this sandbox\n const existing = assignments.items.find(\n (a) => a.sandboxId === sandboxId\n );\n\n if (existing) {\n // If assignment exists with same profile, we are done\n if (existing.permissionProfileId === permissionProfileId) {\n return;\n }\n\n // If assignment exists but with different profile, delete it first\n // This avoids UNIQUE constraint violation when creating the new one\n await this.request<DeleteResponse>(`/control/assignments/${existing.assignmentId}`, {\n method: 'DELETE'\n });\n }\n } catch {\n // Ignore lookup errors\n }\n\n await this.request<Assignment>(`/control/subjects/${subjectId}/assignments`, {\n method: 'POST',\n body: JSON.stringify({\n sandboxId,\n subjectId,\n permissionProfileId,\n }),\n });\n }\n\n /**\n * Sandbox management API\n */\n get sandboxes() {\n return {\n list: async (): Promise<SandboxListResponse> => {\n return this.request<SandboxListResponse>('/control/sandboxes');\n },\n get: async (id: string): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`);\n },\n create: async (data: CreateSandboxData): Promise<Sandbox> => {\n return this.request<Sandbox>('/control/sandboxes', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n update: async (id: string, data: Partial<CreateSandboxData>): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n },\n delete: async (id: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/sandboxes/${id}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Permission Profile management for sandboxes\n */\n get permissionProfiles() {\n return {\n list: async (sandboxId: string): Promise<PermissionProfile[]> => {\n const result = await this.request<PermissionProfileListResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles`\n );\n return result.items;\n },\n get: async (sandboxId: string, profileId: string): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`\n );\n },\n create: async (\n sandboxId: string,\n data: CreatePermissionProfileData\n ): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n },\n delete: async (sandboxId: string, profileId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`,\n {\n method: 'DELETE',\n }\n );\n },\n };\n }\n\n /**\n * Environment management\n */\n get environments() {\n return {\n list: async (sandboxId: string): Promise<EnvironmentData[]> => {\n const result = await this.request<EnvironmentListResponse>(\n `/control/sandboxes/${sandboxId}/environments`\n );\n return result.items;\n },\n get: async (environmentId: string): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/environments/${environmentId}`);\n },\n create: async (\n sandboxId: string,\n data: CreateEnvironmentData\n ): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/sandboxes/${sandboxId}/environments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n delete: async (environmentId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/environments/${environmentId}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Subject management\n */\n get subjects() {\n return {\n get: async (subjectId: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${subjectId}`);\n },\n listAssignments: async (subjectId: string): Promise<AssignmentListResponse> => {\n return this.request<AssignmentListResponse>(`/control/subjects/${subjectId}/assignments`);\n },\n };\n }\n\n /**\n * @deprecated Use recordUser() instead\n */\n get users() {\n return {\n create: async (data: { id: string; name?: string; email?: string }): Promise<Subject> => {\n return this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: data.id,\n name: data.name,\n email: data.email,\n }),\n });\n },\n get: async (id: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${id}`);\n },\n };\n }\n\n /**\n * Make an authenticated API request\n */\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.httpUrl}${path}`;\n console.log(`[SDK] Requesting: ${url}`);\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Granular API Error (${response.status}): ${errorText}`);\n }\n\n if (response.status === 204) {\n return { deleted: true } as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ws-client.ts","../src/session.ts","../src/client.ts"],"names":["Automerge","docs"],"mappings":"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","file":"index.js","sourcesContent":["import * as Automerge from '@automerge/automerge';\nimport type {\n WSClientOptions,\n RPCRequest,\n RPCResponse,\n SyncMessage,\n RPCRequestFromServer\n} from './types';\n\n// Use global WebSocket if available (Browser, Bun, Deno)\nlet GlobalWebSocket: any = undefined;\nif (typeof globalThis !== 'undefined' && (globalThis as any).WebSocket) {\n GlobalWebSocket = (globalThis as any).WebSocket;\n}\n\n// WebSocket.OPEN is always 1\nconst READY_STATE_OPEN = 1;\n\nexport class WSClient {\n private ws: WebSocket | null = null;\n private url: string;\n private sessionId: string;\n private token: string;\n private messageQueue: Array<{ resolve: (value: unknown) => void; reject: (error: Error) => void; id: string }> = [];\n private syncHandlers: Array<(message: SyncMessage) => void> = [];\n private rpcHandlers: Map<string, (params: unknown) => Promise<unknown>> = new Map();\n private eventHandlers: Map<string, Array<(params: unknown) => void>> = new Map();\n private nextRpcId = 1;\n public doc: Automerge.Doc<Record<string, unknown>> = Automerge.init();\n private syncState: Automerge.SyncState = Automerge.initSyncState();\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private isExplicitlyDisconnected = false;\n\n private options: WSClientOptions;\n\n constructor(options: WSClientOptions) {\n this.options = options;\n this.url = options.url;\n this.sessionId = options.sessionId;\n this.token = options.token;\n }\n\n /**\n * Connect to the WebSocket server\n * @returns {Promise<void>} Resolves when connection is open\n */\n async connect(): Promise<void> {\n this.isExplicitlyDisconnected = false;\n\n // Determine WebSocket implementation\n const WebSocketClass = this.options.WebSocketCtor || GlobalWebSocket;\n\n if (!WebSocketClass) {\n throw new Error('No WebSocket implementation found. If using Node.js, please install \"ws\" and pass the constructor to the SDK options: { WebSocketCtor: WebSocket }.');\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Construct URL with query parameters\n const wsUrl = new URL(this.url);\n wsUrl.searchParams.set('sessionId', this.sessionId);\n wsUrl.searchParams.set('token', this.token);\n\n // @ts-ignore - Dynamic class usage\n this.ws = new WebSocketClass(wsUrl.toString()) as WebSocket;\n\n if (!this.ws) throw new Error('Failed to create WebSocket');\n\n // Standardize event handlers\n const socket = this.ws as any;\n if (typeof socket.on === 'function') {\n // Node 'ws' style\n socket.on('open', () => {\n this.emit('open', {});\n resolve();\n });\n socket.on('message', (data: any) => {\n try {\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n });\n socket.on('error', (error: any) => {\n this.emit('error', error);\n if (socket.readyState !== READY_STATE_OPEN) {\n reject(error);\n }\n });\n socket.on('close', () => {\n this.emit('close', {});\n this.handleDisconnect();\n });\n } else {\n // Browser WebSocket style\n this.ws!.onopen = () => {\n this.emit('open', {});\n resolve();\n };\n\n this.ws!.onmessage = (event: MessageEvent) => {\n try {\n const data = event.data;\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n };\n\n this.ws!.onerror = (event: Event) => {\n const error = new Error('WebSocket error');\n (error as any).event = event;\n this.emit('error', error);\n if (this.ws?.readyState !== READY_STATE_OPEN) {\n reject(error);\n }\n };\n\n this.ws!.onclose = () => {\n this.emit('close', {});\n this.handleDisconnect();\n };\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private handleDisconnect() {\n this.ws = null;\n if (!this.isExplicitlyDisconnected) {\n // Simple exponential backoff could go here, but for now fixed reconnect\n this.reconnectTimer = setTimeout(() => {\n console.log('[Granular] Attempting reconnect...');\n this.connect().catch(e => console.error('[Granular] Reconnect failed:', e));\n }, 3000);\n }\n }\n\n private handleMessage(message: unknown): void {\n if (typeof message !== 'object' || message === null) return;\n\n // Debug: Log all incoming messages\n console.log('[Granular DEBUG] Received message:', JSON.stringify(message).slice(0, 500));\n\n // 1. Handle Sync Messages (Automerge)\n if ('type' in message && message.type === 'sync') {\n const syncMessage = message as SyncMessage;\n let bytes: Uint8Array;\n\n try {\n const payload = syncMessage.message || syncMessage.data;\n\n if (typeof payload === 'string') {\n const binaryString = atob(payload);\n const len = binaryString.length;\n bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n } else if (Array.isArray(payload)) {\n bytes = new Uint8Array(payload);\n } else if (payload instanceof Uint8Array) {\n bytes = payload;\n } else {\n return;\n }\n\n console.log('[Granular DEBUG] Applying sync bytes:', bytes.length);\n\n const [newDoc, newSyncState] = Automerge.receiveSyncMessage(\n this.doc,\n this.syncState,\n bytes\n );\n this.doc = newDoc;\n this.syncState = newSyncState;\n\n // DEBUG: Inspect doc after sync\n const docAny = this.doc as any;\n if (docAny.catalog) {\n console.log('[Granular DEBUG] Doc catalog sync applied. Keys in catalog:', Object.keys(docAny.catalog || {}));\n console.log('[Granular DEBUG] RawToolCatalogs:', Object.keys(docAny.catalog.rawToolCatalogs || {}));\n } else {\n console.log('[Granular DEBUG] Doc synced but no catalog yet. Keys in doc:', Object.keys(docAny));\n }\n\n // Notify sync listeners with the new doc\n this.emit('sync', this.doc);\n } catch (e) {\n // Determine if this is a sync protocol error (e.g. wrong format) -> try applyChanges\n // The server broadcasts raw changes using getLastLocalChange, which receiveSyncMessage rejects.\n try {\n console.log('[Granular DEBUG] receiveSyncMessage failed, trying applyChanges...');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [newDoc] = Automerge.applyChanges(this.doc, [bytes!]);\n this.doc = newDoc;\n this.emit('sync', this.doc);\n console.log('[Granular DEBUG] applyChanges succeeded. Doc:', JSON.stringify(Automerge.toJS(this.doc)));\n } catch (applyError) {\n console.warn('[Granular] Failed to apply sync message (both sync & applyChanges)', e, applyError);\n }\n }\n return;\n }\n\n // 1. Handling Automerge Snapshots (Full State)\n if ('type' in message && message.type === 'snapshot') {\n const snapshotMessage = message as { type: string; data: number[] };\n try {\n const bytes = new Uint8Array(snapshotMessage.data);\n console.log('[Granular DEBUG] Loading snapshot bytes:', bytes.length);\n this.doc = Automerge.load(bytes);\n this.emit('sync', this.doc);\n console.log('[Granular DEBUG] Snapshot loaded. Doc:', JSON.stringify(Automerge.toJS(this.doc)));\n } catch (e) {\n console.warn('[Granular] Failed to load snapshot message', e);\n }\n return;\n }\n\n // 1.5 Handle Automerge Changes (Raw)\n if ('type' in message && message.type === 'change') {\n const changeMessage = message as { type: string; data: number[] };\n try {\n const bytes = new Uint8Array(changeMessage.data);\n // console.log('[Granular DEBUG] Applying change bytes:', bytes.length);\n const [newDoc] = Automerge.applyChanges(this.doc, [bytes]);\n this.doc = newDoc;\n this.emit('sync', this.doc);\n // console.log('[Granular DEBUG] Valid change applied. Doc keys:', Object.keys(Automerge.toJS(this.doc)));\n } catch (e) {\n console.warn('[Granular] Failed to apply change message', e);\n }\n return;\n }\n\n // 2. Handle RPC Responses (Results/Errors from calls we made)\n if ('type' in message && (message.type === 'rpc_result' || message.type === 'rpc_error')) {\n const response = message as RPCResponse;\n const pending = this.messageQueue.find((q) => q.id === response.id);\n if (pending) {\n if (response.type === 'rpc_error') {\n pending.reject(\n new Error(`RPC error: ${response.error?.message || 'Unknown error'}`)\n );\n } else {\n pending.resolve(response.result);\n }\n this.messageQueue = this.messageQueue.filter((q) => q.id !== response.id);\n }\n return;\n }\n\n // 3. Handle Incoming RPC Requests (Server calls us, e.g. tool.invoke)\n if ('type' in message && message.type === 'rpc' && 'method' in message && 'id' in message) {\n const request = message as RPCRequestFromServer;\n this.handleIncomingRpc(request).catch((error) => {\n console.error('[Granular] Error handling incoming RPC:', error);\n });\n return;\n }\n\n // 4. Handle Generic Events\n if ('type' in message && typeof message.type === 'string') {\n this.emit(message.type, message);\n }\n }\n\n /**\n * Make an RPC call to the server\n * @param {string} method - RPC method name\n * @param {unknown} params - Request parameters\n * @returns {Promise<unknown>} Response result\n * @throws {Error} If connection is closed or timeout occurs\n */\n async call(method: string, params: unknown): Promise<unknown> {\n if (!this.ws || this.ws.readyState !== READY_STATE_OPEN) {\n throw new Error('WebSocket not connected');\n }\n\n const id = `rpc-${this.nextRpcId++}`;\n const request: RPCRequest = {\n type: 'rpc',\n method,\n params,\n id,\n };\n\n return new Promise((resolve, reject) => {\n this.messageQueue.push({ resolve, reject, id });\n\n this.ws!.send(JSON.stringify(request));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n const pending = this.messageQueue.find((q) => q.id === id);\n if (pending) {\n this.messageQueue = this.messageQueue.filter((q) => q.id !== id);\n reject(new Error(`RPC timeout: ${method}`));\n }\n }, 30000);\n });\n }\n\n private async handleIncomingRpc(request: RPCRequestFromServer): Promise<void> {\n const handler = this.rpcHandlers.get(request.method);\n\n if (!handler) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32601,\n message: `Method not found: ${request.method}`,\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n return;\n }\n\n try {\n const result = await handler(request.params);\n\n // Special case: tool.invoke handlers usually respond via tool.result RPC method manually\n // to support streaming or async flows where the response isn't immediate return value.\n // But if they DO return a value, we can treat it as the result.\n // For now, mirroring existing behavior: tool.invoke handlers are responsible for\n // calling tool.result if they want to.\n\n // If NOT tool.invoke, send standard RPC response\n if (request.method !== 'tool.invoke') {\n const successResponse = {\n type: 'rpc_result',\n id: request.id,\n result,\n };\n this.ws?.send(JSON.stringify(successResponse));\n }\n } catch (error) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n }\n }\n\n /**\n * Subscribe to client events\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n */\n on(event: string, handler: (params: unknown) => void): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n this.eventHandlers.get(event)!.push(handler);\n }\n\n /**\n * Register an RPC handler for incoming server requests\n * @param {string} method - RPC method name\n * @param {Function} handler - Handler function\n */\n registerRpcHandler(method: string, handler: (params: unknown) => Promise<unknown>): void {\n this.rpcHandlers.set(method, handler);\n }\n\n /**\n * Unsubscribe from client events\n * @param {string} event - Event name\n * @param {Function} handler - Handler to remove\n */\n off(event: string, handler: (params: unknown) => void): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n this.eventHandlers.set(\n event,\n handlers.filter((h) => h !== handler)\n );\n }\n }\n\n /**\n * Emit an event locally\n * @param {string} event - Event name\n * @param params - Event data\n */\n emit(event: string, params: unknown): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => handler(params));\n }\n }\n\n /**\n * Disconnect the WebSocket and clear state\n */\n disconnect(): void {\n this.isExplicitlyDisconnected = true;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.messageQueue.forEach(q => q.reject(new Error('Client explicitly disconnected')));\n this.messageQueue = [];\n this.rpcHandlers.clear();\n this.emit('disconnect', {});\n }\n}\n","import { WSClient } from './ws-client';\nimport type {\n Job,\n JobStatus,\n Prompt,\n ToolWithHandler,\n ToolSchema,\n PublishToolsResult,\n ToolHandler,\n InstanceToolHandler,\n ToolInvokeParams,\n DomainState,\n JobSubmitResult,\n ToolInfo,\n ToolsChangedEvent\n} from './types';\nimport type { Doc } from '@automerge/automerge/slim';\n\n// Re-export types that were previously defined here\nexport { ToolWithHandler, ToolSchema, PublishToolsResult, ToolHandler, InstanceToolHandler, DomainState, JobSubmitResult };\n\nexport class Session {\n protected client: WSClient;\n private clientId: string;\n private jobsMap: Map<string, JobImplementation> = new Map();\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n private toolHandlers: Map<string, ToolHandler | InstanceToolHandler> = new Map();\n /** Tracks which tools are instance methods (className set, not static) */\n private instanceTools: Set<string> = new Set();\n private currentDomainRevision: string | null = null;\n /** Local effect registry: name → full ToolWithHandler */\n private effects: Map<string, ToolWithHandler> = new Map();\n /** Last known tools for diffing */\n private lastKnownTools: Map<string, ToolInfo> = new Map();\n\n constructor(client: WSClient, clientId?: string) {\n this.client = client;\n this.clientId = clientId || `client_${Date.now()}`;\n this.setupEventHandlers();\n this.setupToolInvokeHandler();\n }\n\n // --- Public API ---\n\n get document(): Doc<Record<string, unknown>> {\n return this.client.doc;\n }\n\n get domainRevision(): string | null {\n return this.currentDomainRevision;\n }\n\n /**\n * Make a raw RPC call to the session's Durable Object.\n *\n * Use this when you need to call an RPC method that doesn't have a\n * dedicated wrapper method on the Session/Environment class.\n *\n * @param method - RPC method name (e.g. 'domain.fetchPackagePart')\n * @param params - Request parameters\n * @returns The raw RPC response\n *\n * @example\n * ```typescript\n * const result = await env.rpc('domain.fetchPackagePart', {\n * moduleSpecifier: '@sandbox/domain',\n * part: 'types',\n * });\n * ```\n */\n async rpc<T = unknown>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.client.call(method, params) as Promise<T>;\n }\n\n /**\n * Send client hello to establish the session\n */\n async hello(): Promise<{ ok: boolean; environmentId?: string; docId?: string }> {\n const result = await this.client.call('client.hello', {\n clientId: this.clientId,\n protocolVersion: '2.0',\n });\n return result as { ok: boolean; environmentId?: string; docId?: string };\n }\n\n /**\n * Publish tools to the sandbox and register handlers for reverse-RPC.\n *\n * Tools can be:\n * - **Instance methods**: set `className` (handler receives `(objectId, params)`)\n * - **Static methods**: set `className` + `static: true` (handler receives `(params)`)\n * - **Global tools**: omit `className` (handler receives `(params)`)\n *\n * Both `inputSchema` and `outputSchema` accept JSON Schema objects. The\n * `outputSchema` drives the return type in the auto-generated TypeScript\n * class declarations that sandbox code imports from `./sandbox-tools`.\n *\n * This method:\n * 1. Extracts tool schemas (including `outputSchema`) from the provided tools\n * 2. Publishes them via `client.publishRawToolCatalog` RPC\n * 3. Registers handlers locally for `tool.invoke` RPC calls\n * 4. Returns the `domainRevision` needed for job submission\n *\n * @param tools - Array of tools with handlers\n * @param revision - Optional revision string (default: \"1.0.0\")\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishTools([\n * {\n * name: 'get_bio',\n * description: 'Get biography of an author',\n * className: 'author',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * outputSchema: { type: 'object', properties: { bio: { type: 'string' } }, required: ['bio'] },\n * handler: async (id, params) => ({ bio: `Bio of ${id}` }),\n * },\n * ]);\n * ```\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n // 1. Extract schemas (strip handlers)\n const schemas: ToolSchema[] = tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n stability: tool.stability || 'stable',\n provenance: tool.provenance || { source: 'mcp' },\n tags: tool.tags,\n className: tool.className,\n static: tool.static,\n }));\n\n // 2. Publish to server\n const result = await this.client.call('client.publishRawToolCatalog', {\n clientId: this.clientId,\n revision,\n tools: schemas,\n }) as { accepted?: boolean; domainRevision?: string; rejected?: Array<{ name: string; reason: string }> };\n\n if (!result.accepted || !result.domainRevision) {\n throw new Error(`Failed to publish tools: ${JSON.stringify(result.rejected)}`);\n }\n\n // 3. Register handlers for reverse-RPC\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n // Track instance methods: className set and not explicitly static\n if (tool.className && !tool.static) {\n this.instanceTools.add(tool.name);\n } else {\n this.instanceTools.delete(tool.name);\n }\n }\n\n // 4. Store domain revision\n this.currentDomainRevision = result.domainRevision;\n\n return {\n accepted: result.accepted,\n domainRevision: result.domainRevision,\n rejected: result.rejected,\n };\n }\n\n /**\n * Publish a single effect (tool) to the sandbox.\n *\n * Adds the effect to the local registry and re-publishes the\n * full tool catalog to the server. If an effect with the same\n * name already exists, it is replaced.\n *\n * @param effect - The effect (tool) to publish\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishEffect({\n * name: 'get_bio',\n * description: 'Get biography of an author',\n * className: 'author',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * handler: async (id, params) => ({ bio: `Bio of ${id}` }),\n * });\n * ```\n */\n async publishEffect(effect: ToolWithHandler): Promise<PublishToolsResult> {\n this.effects.set(effect.name, effect);\n return this._syncEffects();\n }\n\n /**\n * Publish multiple effects (tools) at once.\n *\n * Adds all effects to the local registry and re-publishes the\n * full tool catalog in a single RPC call.\n *\n * @param effects - Array of effects to publish\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishEffects([\n * { name: 'get_bio', description: '...', inputSchema: {}, handler: async (id) => ({}) },\n * { name: 'search', description: '...', inputSchema: {}, handler: async (params) => ({}) },\n * ]);\n * ```\n */\n async publishEffects(effects: ToolWithHandler[]): Promise<PublishToolsResult> {\n for (const effect of effects) {\n this.effects.set(effect.name, effect);\n }\n return this._syncEffects();\n }\n\n /**\n * Remove an effect by name and re-publish the remaining catalog.\n *\n * @param name - The name of the effect to remove\n * @returns PublishToolsResult with domainRevision\n */\n async unpublishEffect(name: string): Promise<PublishToolsResult> {\n this.effects.delete(name);\n // Also remove the local handler\n this.toolHandlers.delete(name);\n this.instanceTools.delete(name);\n return this._syncEffects();\n }\n\n /**\n * Remove all effects and publish an empty catalog.\n *\n * @returns PublishToolsResult with domainRevision\n */\n async unpublishAllEffects(): Promise<PublishToolsResult> {\n this.effects.clear();\n this.toolHandlers.clear();\n this.instanceTools.clear();\n return this._syncEffects();\n }\n\n /**\n * Internal: re-publish the full effect catalog to the server.\n * Called after any mutation to the effects Map.\n */\n private async _syncEffects(): Promise<PublishToolsResult> {\n const allEffects = Array.from(this.effects.values());\n return this.publishTools(allEffects);\n }\n\n /**\n * Submit a job to execute code in the sandbox.\n *\n * The code can import typed classes from `./sandbox-tools`:\n * ```typescript\n * import { Author, Book, global_search } from './sandbox-tools';\n *\n * const tolkien = await Author.find({ id: 'tolkien' });\n * const bio = await tolkien.get_bio({ detailed: true });\n * const books = await tolkien.get_books();\n * ```\n *\n * Tool calls (instance methods, static methods, global functions) trigger\n * `tool.invoke` RPC back to this client, where the registered handlers\n * execute locally and return the result to the sandbox.\n */\n async submitJob(code: string, domainRevision?: string): Promise<Job> {\n const revision = domainRevision\n || this.currentDomainRevision\n || (this.client.doc as any)?.domain?.active\n || undefined;\n if (!revision) {\n throw new Error('No domain revision available. Call publishTools() or ensure schema is activated.');\n }\n\n const result = await this.client.call('job.submit', {\n domainRevision: revision,\n code,\n }) as { jobId?: string };\n\n if (!result.jobId) {\n throw new Error('Failed to submit job: no jobId returned');\n }\n\n const job = new JobImplementation(result.jobId, this.client);\n this.jobsMap.set(result.jobId, job);\n return job;\n }\n\n /**\n * Register a handler for a specific tool.\n * @param isInstance - If true, handler will receive (id, params) for instance method dispatch.\n */\n registerToolHandler(name: string, handler: ToolHandler | InstanceToolHandler, isInstance = false): void {\n this.toolHandlers.set(name, handler);\n if (isInstance) {\n this.instanceTools.add(name);\n } else {\n this.instanceTools.delete(name);\n }\n }\n\n /**\n * Respond to a prompt request from the sandbox\n */\n async answerPrompt(promptId: string, answer: unknown): Promise<void> {\n await this.client.call('prompt.answer', { promptId, value: answer });\n }\n\n /**\n * Get the current list of available tools.\n * Consolidates tools from all connected clients.\n */\n getTools(): ToolInfo[] {\n const doc: any = this.client.doc;\n const toolMap = new Map<string, ToolInfo>();\n\n // 1. Seed from domain packages (always present after domain activation)\n const domainPkg = doc.domain?.packages?.domain;\n if (domainPkg?.tools && Array.isArray(domainPkg.tools)) {\n for (const tool of domainPkg.tools) {\n if (!tool?.name) continue;\n toolMap.set(tool.name, {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n className: tool.className || undefined,\n static: tool.static || false,\n ready: false,\n publishedAt: undefined,\n });\n }\n }\n\n // 2. Overlay with live catalogs (has handler readiness info)\n const catalogs = doc.catalog?.rawToolCatalogs || {};\n for (const [clientId, catalog] of Object.entries(catalogs)) {\n const cat = catalog as any;\n if (!cat.tools) continue;\n\n for (const tool of cat.tools) {\n if (!tool?.name) continue;\n const existing = toolMap.get(tool.name);\n // Skip if we already have a newer catalog entry\n if (existing?.publishedAt && cat.publishedAt && existing.publishedAt > cat.publishedAt) continue;\n\n const isLocal = clientId === this.clientId;\n const ready = isLocal\n ? (this.effects.has(tool.name) || this.toolHandlers.has(tool.name) || this.instanceTools.has(tool.name))\n : true;\n\n toolMap.set(tool.name, {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n className: tool.className || existing?.className,\n static: tool.static || existing?.static || false,\n clientId,\n ready,\n publishedAt: cat.publishedAt,\n });\n }\n }\n\n return Array.from(toolMap.values());\n }\n\n /**\n * Subscribe to tool changes (added, removed, updated).\n * @param callback - Function called with change events\n * @returns Unsubscribe function\n */\n onToolsChanged(callback: (event: ToolsChangedEvent) => void): () => void {\n const handler = (data: unknown) => callback(data as ToolsChangedEvent);\n if (!this.eventListeners.has('tools:changed')) {\n this.eventListeners.set('tools:changed', []);\n }\n this.eventListeners.get('tools:changed')!.push(handler);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.eventListeners.get('tools:changed');\n if (listeners) {\n this.eventListeners.set('tools:changed', listeners.filter(h => h !== handler));\n }\n };\n }\n\n /**\n * Get the current domain state and available tools\n */\n async getDomain(): Promise<DomainState> {\n return this.client.call('domain.getSummary', {}) as Promise<DomainState>;\n }\n\n /**\n * Get auto-generated TypeScript class declarations for the current domain.\n *\n * Returns typed declarations including:\n * - Classes with readonly properties (from manifest)\n * - `static find(query: { id: string })` for each class\n * - Instance methods with typed input/output (from `publishTools` with `className`)\n * - Static methods (from `publishTools` with `className` + `static: true`)\n * - Relationship accessors (`get_books()`, `get_author()`, etc.)\n * - Global tool functions (from `publishTools` without `className`)\n *\n * Pass this documentation to LLMs so they can write correct typed code\n * that imports from `./sandbox-tools`.\n *\n * Falls back to generating markdown docs from the domain summary if\n * the synthesis server is unavailable.\n */\n async getDomainDocumentation(): Promise<string> {\n try {\n const typesResult = await this.client.call('domain.fetchPackagePart', {\n moduleSpecifier: '@sandbox/domain',\n part: 'types',\n }) as { content?: string; signedUrl?: string };\n\n if (typesResult.content) {\n return typesResult.content;\n }\n } catch {\n // Fall back to generating docs from summary\n }\n\n // Generate fallback documentation from domain summary\n const summary = await this.getDomain();\n return this.generateFallbackDocs(summary);\n }\n\n /**\n * Generate markdown documentation from the domain summary.\n * Class-aware: groups tools by class with property/relationship info.\n */\n private generateFallbackDocs(summary: DomainState): string {\n const classes = (summary as any).classes as Record<string, any> | undefined;\n const globalTools = (summary as any).globalTools as any[] | undefined;\n const tools = summary.tools || [];\n\n // If we have class data, produce class-aware docs\n if (classes && Object.keys(classes).length > 0) {\n let docs = '# Domain Documentation\\n\\n';\n docs += 'Import classes and tools from `./sandbox-tools`:\\n\\n';\n\n const classNames = Object.keys(classes).map(\n (c) => c.charAt(0).toUpperCase() + c.slice(1),\n );\n const globalNames = (globalTools || []).map((t: any) => t.name);\n const allImports = [...classNames, ...globalNames].join(', ');\n docs += `\\`\\`\\`typescript\\nimport { ${allImports} } from \"./sandbox-tools\";\\n\\`\\`\\`\\n\\n`;\n\n for (const [className, cls] of Object.entries(classes)) {\n const TsName = className.charAt(0).toUpperCase() + className.slice(1);\n docs += `## ${TsName}\\n\\n`;\n if (cls.description) docs += `${cls.description}\\n\\n`;\n\n if (cls.properties?.length > 0) {\n docs += '**Properties:**\\n';\n for (const p of cls.properties) {\n docs += `- \\`${p.name}\\`${p.description ? ': ' + p.description : ''}\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.relationships?.length > 0) {\n docs += '**Relationships:**\\n';\n for (const r of cls.relationships) {\n const fModel = r.foreignModel?.charAt(0).toUpperCase() + r.foreignModel?.slice(1);\n docs += `- \\`${r.localSubmodel}\\` → ${fModel} (${r.kind})\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.methods?.length > 0) {\n docs += '**Methods:**\\n';\n for (const m of cls.methods) {\n docs += `- \\`${TsName}.${m.name}(input)\\``;\n if (m.description) docs += `: ${m.description}`;\n docs += '\\n';\n if (m.inputSchema?.properties) {\n docs += ' ```json\\n ' + JSON.stringify(m.inputSchema, null, 2).replace(/\\n/g, '\\n ') + '\\n ```\\n';\n }\n }\n docs += '\\n';\n }\n }\n\n if (globalTools && globalTools.length > 0) {\n docs += '## Global Tools\\n\\n';\n for (const tool of globalTools) {\n docs += `### ${tool.name}\\n\\n`;\n if (tool.description) docs += `${tool.description}\\n\\n`;\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n }\n\n return docs;\n }\n\n // Legacy flat fallback\n if (!tools || tools.length === 0) {\n return 'No tools available in this domain.';\n }\n\n let docs = '# Available Tools\\n\\n';\n docs += 'Import tools from `./sandbox-tools` and call them with await:\\n\\n';\n docs += '```typescript\\nimport { tools } from \"./sandbox-tools\";\\n\\n';\n docs += '// Example:\\n';\n docs += `const result = await tools.${tools[0]?.name || 'example'}(input);\\n`;\n docs += '```\\n\\n';\n\n for (const tool of tools) {\n docs += `## ${tool.name}\\n\\n`;\n if (tool.description) {\n docs += `${tool.description}\\n\\n`;\n }\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n if (tool.outputSchema) {\n docs += '**Output Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.outputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n\n return docs;\n }\n\n /**\n * Close the session and disconnect from the sandbox\n */\n async disconnect(): Promise<void> {\n this.client.disconnect();\n }\n\n // --- Event Handling ---\n\n /**\n * Subscribe to session events\n */\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n /**\n * Unsubscribe from session events\n */\n off(event: string, handler: (data: unknown) => void): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n this.eventListeners.set(event, handlers.filter(h => h !== handler));\n }\n }\n\n // --- Internal ---\n\n private setupToolInvokeHandler(): void {\n this.client.registerRpcHandler('tool.invoke', async (params: unknown) => {\n const { callId, toolName, input } = params as ToolInvokeParams;\n\n this.emit('tool:invoke', { callId, toolName, input });\n\n const handler = this.toolHandlers.get(toolName);\n if (!handler) {\n // Send error result back\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_NOT_FOUND', message: `Tool handler not found: ${toolName}` },\n });\n return;\n }\n\n try {\n let result: unknown;\n // Instance methods receive _objectId from the sandbox runtime\n if (this.instanceTools.has(toolName) && input && typeof input === 'object' && '_objectId' in input) {\n const { _objectId, ...restParams } = input as { _objectId: string;[key: string]: any };\n result = await (handler as InstanceToolHandler)(_objectId, restParams);\n } else {\n result = await (handler as ToolHandler)(input);\n }\n this.emit('tool:result', { callId, result });\n\n // Send result back to sandbox\n await this.client.call('tool.result', {\n callId,\n result,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.emit('tool:result', { callId, error: errorMessage });\n\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_EXECUTION_FAILED', message: errorMessage },\n });\n }\n });\n }\n\n private setupEventHandlers(): void {\n // Pipe client events to session events\n this.client.on('sync', (doc: unknown) => {\n this.emit('sync', doc);\n this.checkForToolChanges();\n });\n this.client.on('prompt', (prompt: unknown) => this.emit('prompt', prompt));\n this.client.on('disconnect', () => this.emit('disconnect', {}));\n\n // Job status updates\n this.client.on('job.status', (data: unknown) => {\n this.emit('job:status', data);\n });\n\n // Exec events\n this.client.on('exec.completed', (data: unknown) => {\n this.emit('exec:completed', data);\n });\n this.client.on('exec.progress', (data: unknown) => {\n this.emit('exec:progress', data);\n });\n }\n\n private emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n\n /**\n * Check for changes in the tool catalog and emit 'tools:changed' if needed\n */\n private checkForToolChanges() {\n const currentTools = this.getTools();\n const currentMap = new Map(currentTools.map(t => [t.name, t]));\n\n const added: string[] = [];\n const removed: string[] = [];\n\n // Check for added or updated tools\n for (const [name, tool] of currentMap) {\n if (!this.lastKnownTools.has(name)) {\n added.push(name);\n }\n }\n\n // Check for removed tools\n for (const name of this.lastKnownTools.keys()) {\n if (!currentMap.has(name)) {\n removed.push(name);\n }\n }\n\n if (added.length > 0 || removed.length > 0) {\n this.lastKnownTools = currentMap;\n this.emit('tools:changed', {\n tools: currentTools,\n added,\n removed\n });\n }\n }\n}\n\n// --- Job Implementation ---\n\nclass JobImplementation implements Job {\n public id: string;\n public client: WSClient;\n public status: JobStatus = 'queued';\n\n private _resultPromise: Promise<unknown>;\n private _resolveResult!: (value: unknown) => void;\n private _rejectResult!: (reason: unknown) => void;\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n\n constructor(id: string, client: WSClient) {\n this.id = id;\n this.client = client;\n\n this._resultPromise = new Promise((resolve, reject) => {\n this._resolveResult = resolve;\n this._rejectResult = reject;\n });\n\n // Listen to exec events\n this.client.on('exec.completed', (data: unknown) => {\n const execData = data as { execId?: string; jobId?: string; result?: unknown; error?: unknown };\n if (execData.execId === id || execData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n if (execData.error) {\n this._rejectResult(execData.error);\n } else {\n this._resolveResult(execData.result);\n }\n }\n });\n\n this.client.on('exec.progress', (data: unknown) => {\n const progressData = data as { execId?: string; jobId?: string; stdout?: string; stderr?: string };\n if (progressData.execId === id || progressData.jobId === id) {\n if (progressData.stdout) {\n this.emit('stdout', progressData.stdout);\n }\n if (progressData.stderr) {\n this.emit('stderr', progressData.stderr);\n }\n }\n });\n\n // Also listen to specific job events if available\n this.client.on(`job.${id}.status`, (status: unknown) => {\n this.status = status as JobStatus;\n this.emit('status', status);\n });\n\n this.client.on(`job.${id}.stdout`, (line: unknown) => {\n this.emit('stdout', line);\n });\n\n this.client.on(`job.${id}.stderr`, (line: unknown) => {\n this.emit('stderr', line);\n });\n\n this.client.on(`job.${id}.result`, (result: unknown) => {\n this.status = 'succeeded';\n this._resolveResult(result);\n });\n\n this.client.on(`job.${id}.error`, (error: unknown) => {\n this.status = 'failed';\n this._rejectResult(error);\n });\n\n // Listen for job.completed and job.failed events (generic events from backend)\n this.client.on('job.completed', (data: unknown) => {\n const jobData = data as { jobId?: string; result?: unknown };\n if (jobData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n this._resolveResult(jobData.result);\n }\n });\n\n this.client.on('job.failed', (data: unknown) => {\n const jobData = data as { jobId?: string; error?: unknown };\n if (jobData.jobId === id) {\n this.status = 'failed';\n this.emit('status', this.status);\n this._rejectResult(jobData.error || new Error('Job failed'));\n }\n });\n\n // Live tool call tracking (broadcast by backend to all clients)\n this.client.on('tool.call.start', (data: unknown) => {\n const d = data as { jobId?: string; callId?: string; toolName?: string; input?: unknown; timestamp?: number };\n if (d.jobId === id) {\n this.emit('toolCallStart', { callId: d.callId, toolName: d.toolName, input: d.input, timestamp: d.timestamp });\n }\n });\n\n this.client.on('tool.call.end', (data: unknown) => {\n const d = data as { jobId?: string; callId?: string; toolName?: string; result?: unknown; error?: string; durationMs?: number; timestamp?: number };\n if (d.jobId === id) {\n this.emit('toolCallEnd', { callId: d.callId, toolName: d.toolName, result: d.result, error: d.error, durationMs: d.durationMs, timestamp: d.timestamp });\n }\n });\n }\n\n get result(): Promise<unknown> {\n return this._resultPromise;\n }\n\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n private emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n}\n","import { WSClient } from './ws-client';\nimport { Session, ToolWithHandler, PublishToolsResult } from './session';\nimport type {\n GranularOptions,\n ConnectOptions,\n RecordUserOptions,\n User,\n Subject,\n Sandbox,\n SandboxListResponse,\n CreateSandboxData,\n PermissionProfile,\n PermissionProfileListResponse,\n CreatePermissionProfileData,\n EnvironmentData,\n EnvironmentListResponse,\n CreateEnvironmentData,\n Assignment,\n AssignmentListResponse,\n DeleteResponse,\n GraphQLResult,\n RelationshipInfo,\n ModelRef,\n DefineRelationshipOptions,\n ManifestContent,\n ManifestOperation,\n ManifestPropertySpec,\n ManifestImport,\n RecordObjectOptions,\n RecordObjectResult,\n ToolInfo,\n ToolsChangedEvent,\n} from './types';\n\n// ── Built-in modules ──\n\n/**\n * Standard modules: base types available via `imports: [{ alias: \"@std\", name: \"standard_modules\" }]`\n */\nconst STANDARD_MODULES_OPERATIONS: ManifestOperation[] = [\n { create: 'entity', has: { id: { value: 'auto-generated' }, createdAt: { value: undefined } } },\n { create: 'class', extends: 'entity', has: {} },\n { create: 'user', extends: 'entity', has: { email: { value: undefined }, firstName: { value: undefined }, lastName: { value: undefined } } },\n { create: 'company', extends: 'entity', has: { name: { value: undefined }, website: { value: undefined } } },\n { create: 'string', has: { value: { value: undefined } } },\n { create: 'number', has: { value: { value: 0 } } },\n { create: 'boolean', has: { value: { value: false } } },\n { create: 'tool_parameter', has: { name: { value: undefined }, type: { value: 'string' }, description: { value: undefined }, required: { value: false } } },\n];\n\n/**\n * Registry of built-in modules that can be imported in manifests\n */\nconst BUILTIN_MODULES: Record<string, ManifestOperation[]> = {\n 'standard_modules': STANDARD_MODULES_OPERATIONS,\n};\n\n/**\n * Environment represents a connected session to a sandbox for a specific user.\n *\n * After connecting, you can:\n * 1. Define your domain ontology via `applyManifest()` (classes, properties, relationships)\n * 2. Record object instances via `recordObject()` (with fields and relationship attachments)\n * 3. Publish tools via `publishTools()` (instance methods, static methods, global tools — with typed I/O)\n * 4. Submit jobs via `submitJob()` that import auto-generated typed classes from `./sandbox-tools`\n * 5. Execute GraphQL queries via `graphql()` (authenticated automatically)\n * 6. List available tools via `getTools()` and listen for updates via `onToolsChanged()`\n *\n * Tool calls from the sandbox automatically invoke your handlers via reverse-RPC.\n *\n * Object IDs are unique per class. Internally, the graph path is `{className}_{id}`\n * (e.g., `author_tolkien`). Use `Environment.toGraphPath()` and\n * `Environment.extractIdFromGraphPath()` for conversions.\n */\nexport class Environment extends Session {\n private envData: EnvironmentData;\n private _apiKey: string;\n private _apiEndpoint: string;\n\n constructor(client: WSClient, envData: EnvironmentData, clientId: string, apiKey: string, apiEndpoint: string) {\n super(client, clientId);\n this.envData = envData;\n this._apiKey = apiKey;\n this._apiEndpoint = apiEndpoint;\n }\n\n /** The environment ID */\n get environmentId(): string {\n return this.envData.environmentId;\n }\n\n /** The sandbox ID */\n get sandboxId(): string {\n return this.envData.sandboxId;\n }\n\n /** The subject ID */\n get subjectId(): string {\n return this.envData.subjectId;\n }\n\n /** The permission profile ID */\n get permissionProfileId(): string {\n return this.envData.permissionProfileId;\n }\n\n /** The GraphQL API endpoint URL */\n get apiEndpoint(): string {\n return this._apiEndpoint;\n }\n\n // ==================== ID ↔ GRAPH PATH MAPPING ====================\n\n /**\n * Convert a class name + real-world ID into a unique graph path.\n *\n * Two objects of *different* classes may share the same real-world ID,\n * so the graph path must incorporate the class to guarantee uniqueness.\n *\n * Format: `{className}_{id}` — deterministic, human-readable.\n *\n * **Convention**: class names should be simple identifiers without\n * underscores (e.g. `author`, `book`). This ensures the prefix is\n * unambiguously parseable by `extractIdFromGraphPath`.\n */\n static toGraphPath(className: string, id: string): string {\n return `${className}_${id}`;\n }\n\n /**\n * Extract the real-world ID from a graph path, given the class name.\n *\n * Strips the `{className}_` prefix. Returns the raw path if the\n * expected prefix is not found.\n */\n static extractIdFromGraphPath(graphPath: string, className: string): string {\n const prefix = `${className}_`;\n return graphPath.startsWith(prefix) ? graphPath.substring(prefix.length) : graphPath;\n }\n\n /**\n * Execute a GraphQL query against the environment's graph.\n * \n * The query uses the Granular graph query language (based on Cypher/GraphQL).\n * Authentication is handled automatically using the SDK's API key.\n * \n * @param query - The GraphQL query string\n * @param variables - Optional variables for the query\n * @returns The query result data\n * \n * @example\n * ```typescript\n * // Read the workspace\n * const result = await env.graphql(\n * `query { model(path: \"workspace\") { path label submodels { path label } } }`\n * );\n * console.log(result.data);\n * \n * // Create a model\n * const created = await env.graphql(\n * `mutation { at(path: \"workspace\") { create_submodel(subpath: \"my_node\", label: \"My Node\", prototype: \"Model\") { model { path label } } } }`\n * );\n * ```\n */\n async graphql<T = any>(query: string, variables?: Record<string, any>): Promise<GraphQLResult<T>> {\n const response = await fetch(this._apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify({\n environmentId: this.environmentId,\n query,\n variables,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GraphQL API Error (${response.status}): ${errorText}`);\n }\n\n return response.json() as Promise<GraphQLResult<T>>;\n }\n\n // ==================== RELATIONSHIP METHODS ====================\n\n /**\n * Define a relationship between two model types.\n * \n * Creates both submodels (if they don't exist) and links them with\n * a RelationshipDef node that encodes cardinality.\n * \n * @example\n * ```typescript\n * // Author has many Books, Book has one Author\n * const rel = await env.defineRelationship({\n * model: 'author',\n * localSubmodel: 'books',\n * localIsMany: true,\n * foreignModel: 'book',\n * foreignSubmodel: 'author',\n * foreignIsMany: false,\n * });\n * console.log(rel.relationship_kind); // \"one_to_many\"\n * ```\n */\n async defineRelationship(options: DefineRelationshipOptions): Promise<RelationshipInfo> {\n const result = await this.graphql<{\n at: {\n define_relationship: RelationshipInfo;\n };\n }>(\n `mutation DefineRelationship(\n $localSubmodel: String!,\n $foreignModel: String!,\n $foreignSubmodel: String!,\n $localIsMany: Boolean!,\n $foreignIsMany: Boolean!,\n $name: String\n ) {\n at(path: \"${options.model}\") {\n define_relationship(\n local_submodel: $localSubmodel\n foreign_model: $foreignModel\n foreign_submodel: $foreignSubmodel\n local_is_many: $localIsMany\n foreign_is_many: $foreignIsMany\n name: $name\n ) {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n {\n localSubmodel: options.localSubmodel,\n foreignModel: options.foreignModel,\n foreignSubmodel: options.foreignSubmodel,\n localIsMany: options.localIsMany,\n foreignIsMany: options.foreignIsMany,\n name: options.name,\n }\n );\n\n if (result.errors?.length) {\n throw new Error(`defineRelationship failed: ${result.errors[0].message}`);\n }\n\n return result.data!.at.define_relationship;\n }\n\n /**\n * Get all relationships for a model type.\n * \n * @param modelPath - The model type path (e.g., \"author\")\n * @returns Array of relationships from this model's perspective\n * \n * @example\n * ```typescript\n * const rels = await env.getRelationships('author');\n * for (const rel of rels) {\n * console.log(`${rel.local_submodel.path} -> ${rel.foreign_model.path} (${rel.relationship_kind})`);\n * }\n * ```\n */\n async getRelationships(modelPath: string): Promise<RelationshipInfo[]> {\n const result = await this.graphql<{\n model: {\n relationships: RelationshipInfo[];\n };\n }>(\n `query GetRelationships($path: String) {\n model(path: $path) {\n relationships {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n { path: modelPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`getRelationships failed: ${result.errors[0].message}`);\n }\n\n return result.data?.model?.relationships || [];\n }\n\n /**\n * Attach a target model to a relationship submodel.\n * \n * Handles cardinality automatically:\n * - \"One\" side: sets/replaces the reference\n * - \"Many\" side: adds the target to the collection\n * \n * If the target model doesn't exist, it's created as an instance of the foreign type.\n * Bidirectional sync is automatic.\n * \n * @param modelPath - The model instance path (e.g., \"tolkien\")\n * @param submodelPath - The relationship submodel (e.g., \"books\")\n * @param targetPath - The target model to attach (e.g., \"lord_of_the_rings\")\n * \n * @example\n * ```typescript\n * // Attach a book to an author (many side)\n * await env.attach('tolkien', 'books', 'lord_of_the_rings');\n * // This also automatically sets lord_of_the_rings:author -> tolkien\n * ```\n */\n async attach(modelPath: string, submodelPath: string, targetPath: string): Promise<void> {\n const result = await this.graphql(\n `mutation Attach($target: String!) {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n attach(target: $target) {\n model { path }\n }\n }\n }\n }`,\n { target: targetPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`attach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * Detach a target model from a relationship submodel.\n * \n * Handles bidirectional cleanup automatically.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @param targetPath - The target to detach (optional for \"one\" side; omit on \"many\" side to detach all)\n * \n * @example\n * ```typescript\n * // Detach a specific book\n * await env.detach('tolkien', 'books', 'lord_of_the_rings');\n * \n * // Detach all books\n * await env.detach('tolkien', 'books');\n * ```\n */\n async detach(modelPath: string, submodelPath: string, targetPath?: string): Promise<void> {\n const targetArg = targetPath ? `target: \"${targetPath}\"` : '';\n const result = await this.graphql(\n `mutation Detach {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n detach(${targetArg}) {\n model { path }\n }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`detach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * List all related models through a relationship submodel.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @returns Array of related model references\n * \n * @example\n * ```typescript\n * const books = await env.listRelated('tolkien', 'books');\n * console.log(books); // [{ path: \"lord_of_the_rings\", label: \"Lord of the Rings\" }, ...]\n * ```\n */\n async listRelated(modelPath: string, submodelPath: string): Promise<ModelRef[]> {\n const result = await this.graphql<{\n at: {\n at: {\n list_related: ModelRef[];\n };\n };\n }>(\n `mutation ListRelated {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n list_related { path label }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`listRelated failed: ${result.errors[0].message}`);\n }\n\n return result.data?.at?.at?.list_related || [];\n }\n\n /**\n * Apply a manifest to the current environment's graph.\n * \n * Translates each manifest operation into GraphQL mutations and executes them\n * in order. This is the core mechanism for creating classes, fields, and\n * relationships from a declarative manifest.\n * \n * @param manifest - The manifest content to apply\n * @returns Summary of applied operations\n * \n * @example\n * ```typescript\n * await environment.applyManifest({\n * schemaVersion: 2,\n * name: 'my-app',\n * volumes: [{\n * name: 'schema',\n * scope: 'sandbox',\n * operations: [\n * { create: 'author', extends: 'class', has: { name: { type: 'string' } } },\n * { create: 'book', extends: 'class', has: { title: { type: 'string' } } },\n * { defineRelationship: {\n * left: 'author', right: 'book',\n * leftSubmodel: 'books', rightSubmodel: 'author',\n * leftIsMany: true, rightIsMany: false,\n * }},\n * ],\n * }],\n * });\n * ```\n */\n async applyManifest(manifest: ManifestContent): Promise<{ applied: number; errors: string[] }> {\n const errors: string[] = [];\n let applied = 0;\n\n for (const volume of manifest.volumes) {\n // Build alias map from imports\n const aliasMap: Record<string, string> = {};\n\n // Resolve and apply imports first\n if (volume.imports) {\n for (const imp of volume.imports) {\n aliasMap[imp.alias] = imp.name;\n\n const builtinOps = BUILTIN_MODULES[imp.name];\n if (builtinOps) {\n for (const op of builtinOps) {\n try {\n await this._applyOperation(op, {});\n applied++;\n } catch (err: any) {\n // Ignore \"already exists\" errors from re-applying imports\n if (!err.message?.includes('already exists')) {\n errors.push(`Import ${imp.name} operation failed: ${err.message}`);\n }\n }\n }\n } else {\n errors.push(`Unknown module: \"${imp.name}\" (only built-in modules are supported)`);\n }\n }\n }\n\n // Apply volume operations with alias resolution\n for (const op of volume.operations) {\n try {\n await this._applyOperation(op, aliasMap);\n applied++;\n } catch (err: any) {\n errors.push(`Operation failed: ${err.message}`);\n }\n }\n }\n\n return { applied, errors };\n }\n\n /**\n * Resolve an alias reference like \"@std/class\" → \"class\"\n * Strips the alias prefix, returning the bare model path.\n */\n private _resolveAlias(ref: string, aliasMap: Record<string, string>): string {\n if (!ref.startsWith('@')) return ref;\n const slashIdx = ref.indexOf('/');\n if (slashIdx === -1) return ref;\n const alias = ref.substring(0, slashIdx);\n const symbolName = ref.substring(slashIdx + 1);\n if (aliasMap[alias]) {\n return symbolName; // The import was applied, so the symbol exists at its bare name\n }\n return ref; // Unknown alias, return as-is\n }\n\n /**\n * Apply a single manifest operation via GraphQL\n */\n private async _applyOperation(op: ManifestOperation, aliasMap: Record<string, string>): Promise<void> {\n // 1. Relationship definition (standalone operation)\n if (op.defineRelationship) {\n const rel = op.defineRelationship;\n await this.defineRelationship({\n model: this._resolveAlias(rel.left, aliasMap),\n localSubmodel: rel.leftSubmodel,\n localIsMany: rel.leftIsMany,\n foreignModel: this._resolveAlias(rel.right, aliasMap),\n foreignSubmodel: rel.rightSubmodel,\n foreignIsMany: rel.rightIsMany,\n name: rel.name,\n });\n return;\n }\n\n // 2. Create a new model (optionally extending another)\n if (op.create) {\n const label = op.create.charAt(0).toUpperCase() + op.create.slice(1);\n const extendsRef = op.extends ? this._resolveAlias(op.extends, aliasMap) : undefined;\n const instanceOfRef = op.instanceOf ? this._resolveAlias(op.instanceOf, aliasMap) : undefined;\n\n if (extendsRef) {\n // Create model that extends a parent class\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n await this.graphql(\n `mutation { at(path: \"${op.create}\") { add_superclass(superclass: \"${extendsRef}\") { model { path } } } }`\n );\n } else if (instanceOfRef) {\n // Create an instance of a type\n await this.graphql(\n `mutation { at(path: \"${instanceOfRef}\") { instantiate(path: \"${op.create}\", label: \"${label}\") { model { path } } } }`\n );\n } else {\n // Create a standalone model\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n }\n\n // Apply fields (has) if present\n if (op.has) {\n await this._applyFields(op.create, op.has);\n }\n return;\n }\n\n // 3. Modify an existing model\n if (op.on) {\n const target = this._resolveAlias(op.on, aliasMap);\n if (op.has) {\n await this._applyFields(target, op.has);\n }\n return;\n }\n }\n\n /**\n * Apply field definitions (has) to a model via GraphQL\n */\n private async _applyFields(modelPath: string, fields: Record<string, ManifestPropertySpec>): Promise<void> {\n for (const [fieldName, spec] of Object.entries(fields)) {\n const fieldLabel = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n\n // Create the submodel (field) on the model\n const createResult = await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldLabel}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set type prototype if provided (e.g. 'string', 'number', 'boolean')\n if (spec.type) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n add_prototype(prototype: \"${spec.type}\") { done }\n }\n }\n }`\n );\n }\n\n // Set description if provided\n if (spec.description) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_description(description: \"${spec.description}\") { done }\n }\n }\n }`\n );\n }\n\n // Set value if provided\n if (spec.value !== undefined && spec.value !== null) {\n if (typeof spec.value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${spec.value}\") { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n }\n }\n\n // Set reference if provided\n if (spec.ref) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_reference(reference: \"${spec.ref}\") { done }\n }\n }\n }`\n );\n }\n\n // Recurse into nested has\n if (spec.has) {\n await this._applyFields(`${modelPath}:${fieldName}`, spec.has);\n }\n }\n }\n\n // ==================== RECORD OBJECT ====================\n\n /**\n * Create or update an instance of a class in the graph.\n *\n * Uses `instantiate` under the hood, which has find-or-create semantics:\n * if an instance with the given `id` already exists for the class it is\n * returned; otherwise a new instance is created. Fields are then set\n * (overwriting previous values) and relationships are attached.\n *\n * The graph path is derived as `{className}_{id}` to ensure uniqueness\n * across classes (two objects of different classes may share the same\n * real-world ID). Relationship targets are also resolved automatically\n * using the foreign class from the relationship definition.\n *\n * @param options - The object specification\n * @returns The graph path, real-world ID, and creation status\n *\n * @example\n * ```typescript\n * // Create an author with fields\n * const result = await env.recordObject({\n * className: 'author',\n * id: 'tolkien',\n * label: 'J.R.R. Tolkien',\n * fields: { name: 'J.R.R. Tolkien', birth_year: 1892 },\n * relationships: { books: ['lotr', 'silmarillion'] },\n * });\n * // result.path → 'author_tolkien' (internal graph path)\n * // result.id → 'tolkien' (real-world ID)\n * // result.created → true\n * ```\n */\n async recordObject(options: RecordObjectOptions): Promise<RecordObjectResult> {\n const { className, id, label, fields, relationships } = options;\n\n // Derive a unique graph path: className__id\n const graphPath = Environment.toGraphPath(className, id);\n\n // 1. Check if instance already exists\n const existsResult = await this.graphql<{ model: { path: string } | null }>(\n `query { model(path: \"${graphPath}\") { path } }`\n );\n const alreadyExists = !!existsResult.data?.model;\n\n // 2. Instantiate (find-or-create) under the class using the graph path\n const instResult = await this.graphql(\n `mutation {\n at(path: \"${className}\") {\n instantiate(path: \"${graphPath}\"${label ? `, label: \"${label}\"` : ''}) {\n model { path }\n }\n }\n }`\n );\n if (instResult.errors?.length) {\n throw new Error(`recordObject instantiate failed: ${instResult.errors[0].message}`);\n }\n\n const instancePath = instResult.data?.at?.instantiate?.model?.path ?? graphPath;\n\n // 3. Store the real-world ID as a string field (_realId) for later look-up\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"_realId\", label: \"_realId\") {\n model { path }\n }\n }\n }`\n );\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"_realId\") {\n set_string_value(value: \"${id.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n\n // 4. Set scalar field values\n if (fields) {\n for (const [fieldName, value] of Object.entries(fields)) {\n if (value === null) continue;\n\n // Ensure the submodel exists on the instance\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldName}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set the value based on its JS type\n if (typeof value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${value.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n } else if (typeof value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${value}) { done }\n }\n }\n }`\n );\n } else if (typeof value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${value}) { done }\n }\n }\n }`\n );\n }\n }\n }\n\n // 5. Attach relationships — resolve target IDs to graph paths\n if (relationships) {\n // Query the class's relationship definitions once to find foreign class names\n const rels = await this.getRelationships(className);\n const relMap: Record<string, string> = {};\n for (const rel of rels) {\n // Map submodel name → foreign model class name\n // local_submodel.path may be \"className:submodelName\", extract the leaf\n const submodelLeaf = rel.local_submodel.path.includes(':')\n ? rel.local_submodel.path.split(':').pop()!\n : rel.local_submodel.path;\n relMap[submodelLeaf] = rel.foreign_model.path;\n }\n\n for (const [submodelName, targets] of Object.entries(relationships)) {\n const foreignClass = relMap[submodelName];\n const targetList = Array.isArray(targets) ? targets : [targets];\n for (const target of targetList) {\n // Resolve target real-world ID to graph path using the foreign class\n const targetGraphPath = foreignClass\n ? Environment.toGraphPath(foreignClass, target)\n : target; // Fallback to raw ID if relationship not found\n await this.attach(instancePath, submodelName, targetGraphPath);\n }\n }\n }\n\n return { path: instancePath, id, created: !alreadyExists };\n }\n\n // ==================== PUBLISH TOOLS ====================\n\n /**\n * Convenience method: publish tools and get back wrapped result.\n * This is the main entry point for setting up tools.\n * \n * @example\n * ```typescript\n * const tools = [\n * {\n * name: 'get_weather',\n * description: 'Get weather for a city',\n * inputSchema: { type: 'object', properties: { city: { type: 'string' } } },\n * handler: async ({ city }) => ({ temp: 22 }),\n * },\n * ];\n * \n * const { domainRevision } = await environment.publishTools(tools);\n * \n * // Now submit jobs that use those tools\n * const job = await environment.submitJob(`\n * import { Author } from './sandbox-tools';\n * const weather = await Author.get_weather({ city: 'Paris' });\n * return weather;\n * `);\n * \n * const result = await job.result;\n * ```\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n return super.publishTools(tools, revision);\n }\n\n /**\n * Publish a single effect (tool) incrementally.\n *\n * Adds the effect to the local registry and re-publishes the\n * full tool catalog to the server. If an effect with the same\n * name already exists, it is replaced.\n *\n * @example\n * ```typescript\n * await env.publishEffect({\n * name: 'get_bio',\n * description: 'Get biography',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * handler: async (params) => ({ bio: 'Hello' }),\n * });\n * ```\n */\n async publishEffect(effect: ToolWithHandler): Promise<PublishToolsResult> {\n return super.publishEffect(effect);\n }\n\n /**\n * Publish multiple effects (tools) at once.\n *\n * Adds all effects to the local registry and re-publishes the\n * full tool catalog in a single RPC call.\n */\n async publishEffects(effects: ToolWithHandler[]): Promise<PublishToolsResult> {\n return super.publishEffects(effects);\n }\n\n /**\n * Remove an effect by name and re-publish the remaining catalog.\n */\n async unpublishEffect(name: string): Promise<PublishToolsResult> {\n return super.unpublishEffect(name);\n }\n\n /**\n * Remove all effects and publish an empty catalog.\n */\n async unpublishAllEffects(): Promise<PublishToolsResult> {\n return super.unpublishAllEffects();\n }\n}\n\nexport class Granular {\n private apiKey: string;\n private apiUrl: string;\n private httpUrl: string;\n private WebSocketCtor?: any;\n\n /** Sandbox-level effect registry: sandboxId → (toolName → ToolWithHandler) */\n private sandboxEffects: Map<string, Map<string, ToolWithHandler>> = new Map();\n /** Active environments tracker: sandboxId → Environment[] */\n private activeEnvironments: Map<string, Environment[]> = new Map();\n\n /**\n * Create a new Granular client\n * @param options - Client configuration\n */\n constructor(options: GranularOptions) {\n this.apiKey = options.apiKey;\n this.apiUrl = options.apiUrl || 'wss://api.granular.dev/v2/ws';\n this.WebSocketCtor = options.WebSocketCtor;\n // Convert WebSocket URL to HTTP URL for REST API\n this.httpUrl = this.apiUrl.replace('wss://', 'https://').replace('/ws', '');\n }\n\n /**\n * Records/upserts a user and prepares them for sandbox connections\n * \n * @param options - User options\n * @returns The user object to pass to connect()\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * name: 'John Doe',\n * permissions: ['agent'],\n * });\n * ```\n */\n async recordUser(options: RecordUserOptions): Promise<User> {\n // Create or get subject via control plane\n const subject = await this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: options.userId,\n name: options.name,\n email: options.email,\n }),\n });\n\n return {\n subjectId: subject.subjectId,\n identityId: options.userId,\n name: options.name,\n email: options.email,\n permissions: options.permissions || [],\n };\n }\n\n /**\n * Connect to a sandbox and establish a real-time environment session.\n * \n * After connecting, use `environment.publishTools()` to register tools,\n * then `environment.submitJob()` to execute code that uses those tools.\n * \n * @param options - Connection options\n * @returns An active environment session\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * permissions: ['agent'],\n * });\n * \n * const environment = await granular.connect({\n * sandbox: 'my-sandbox',\n * user,\n * });\n * \n * // Publish tools\n * await environment.publishTools([\n * { name: 'greet', description: 'Say hello', inputSchema: {}, handler: async () => 'Hello!' },\n * ]);\n * \n * // Submit job\n * const job = await environment.submitJob(`\n * import { tools } from './sandbox-tools';\n * return await tools.greet({});\n * `);\n * \n * console.log(await job.result); // 'Hello!'\n * ```\n */\n async connect(options: ConnectOptions): Promise<Environment> {\n const clientId = options.clientId || `client_${Date.now()}`;\n\n // 1. Find or create the sandbox\n const sandbox = await this.findOrCreateSandbox(options.sandbox);\n\n // 2. Ensure permission profiles and assignments exist for each permission\n for (const profileName of options.user.permissions) {\n const profileId = await this.ensurePermissionProfile(sandbox.sandboxId, profileName);\n await this.ensureAssignment(options.user.subjectId, sandbox.sandboxId, profileId);\n }\n\n // 3. Create the environment\n const envData = await this.environments.create(sandbox.sandboxId, {\n subjectId: options.user.subjectId,\n permissionProfileId: null,\n });\n\n // 4. Connect WebSocket using environment ID\n // The API gateway auto-initializes the Durable Object on first connection when using API key auth\n const client = new WSClient({\n url: this.apiUrl,\n sessionId: envData.environmentId,\n token: this.apiKey,\n WebSocketCtor: this.WebSocketCtor,\n });\n\n await client.connect();\n\n // 5. Create environment wrapper and send hello\n // The GraphQL API endpoint goes through the API gateway for authentication\n const graphqlEndpoint = `${this.httpUrl}/orchestrator/graphql`;\n const environment = new Environment(client, envData, clientId, this.apiKey, graphqlEndpoint);\n\n // Track active environment for sandbox-level effects\n if (!this.activeEnvironments.has(sandbox.sandboxId)) {\n this.activeEnvironments.set(sandbox.sandboxId, []);\n }\n this.activeEnvironments.get(sandbox.sandboxId)!.push(environment);\n\n // Remove from active list on disconnect\n environment.on('disconnect', () => {\n const list = this.activeEnvironments.get(sandbox.sandboxId);\n if (list) {\n this.activeEnvironments.set(sandbox.sandboxId, list.filter(e => e !== environment));\n }\n });\n\n await environment.hello();\n\n // Auto-publish any registered sandbox-level effects\n const effects = this.sandboxEffects.get(sandbox.sandboxId);\n if (effects && effects.size > 0) {\n const effectsList = Array.from(effects.values());\n console.log(`[Granular] Auto-publishing ${effectsList.length} effects for sandbox ${sandbox.sandboxId}`);\n await environment.publishEffects(effectsList);\n }\n\n return environment;\n }\n\n // ── Sandbox-Level Effects ──\n\n /**\n * Register an effect (tool) for a specific sandbox.\n * \n * The effect will be automatically published to:\n * 1. Any currently active environments for this sandbox\n * 2. Any new environments created/connected for this sandbox\n * \n * @param sandboxNameOrId - The name or ID of the sandbox\n * @param effect - The tool definition and handler\n */\n async registerEffect(sandboxNameOrId: string, effect: ToolWithHandler): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n if (!this.sandboxEffects.has(sandboxId)) {\n this.sandboxEffects.set(sandboxId, new Map());\n }\n this.sandboxEffects.get(sandboxId)!.set(effect.name, effect);\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.publishEffect(effect);\n }\n }\n\n /**\n * Register multiple effects (tools) for a specific sandbox.\n * \n * batch version of `registerEffect`.\n */\n async registerEffects(sandboxNameOrId: string, effects: ToolWithHandler[]): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n if (!this.sandboxEffects.has(sandboxId)) {\n this.sandboxEffects.set(sandboxId, new Map());\n }\n const map = this.sandboxEffects.get(sandboxId)!;\n for (const effect of effects) {\n map.set(effect.name, effect);\n }\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.publishEffects(effects);\n }\n }\n\n /**\n * Unregister an effect from a sandbox.\n * \n * Removes it from the local registry and unpublishes it from\n * all active environments.\n */\n async unregisterEffect(sandboxNameOrId: string, name: string): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n const map = this.sandboxEffects.get(sandboxId);\n if (map) {\n map.delete(name);\n }\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.unpublishEffect(name);\n }\n }\n\n /**\n * Unregister all effects for a sandbox.\n */\n async unregisterAllEffects(sandboxNameOrId: string): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n this.sandboxEffects.delete(sandboxId);\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.unpublishAllEffects();\n }\n }\n\n /**\n * Find a sandbox by name or create it if it doesn't exist\n */\n private async findOrCreateSandbox(nameOrId: string): Promise<Sandbox> {\n try {\n // Try to get by ID first\n const sandbox = await this.sandboxes.get(nameOrId);\n return sandbox;\n } catch {\n // If not found by ID, try to find by name or create\n const sandboxes = await this.sandboxes.list();\n const existing = sandboxes.items.find(s => s.name === nameOrId);\n if (existing) {\n return existing;\n }\n\n // Create new sandbox\n const created = await this.sandboxes.create({ name: nameOrId });\n return created;\n }\n }\n\n /**\n * Ensure a permission profile exists for a sandbox, creating it if needed.\n * If profileName matches an existing profile name, returns its ID.\n * Otherwise, creates a new profile with default allow-all rules.\n */\n private async ensurePermissionProfile(\n sandboxId: string,\n profileName: string\n ): Promise<string> {\n try {\n // Check if profile already exists by name\n const profiles = await this.permissionProfiles.list(sandboxId);\n const existing = profiles.find((p) => p.name === profileName);\n if (existing) {\n return existing.permissionProfileId;\n }\n } catch {\n // Ignore lookup errors, try to create\n }\n\n // Create new profile with default rules (allow all tools)\n const created = await this.permissionProfiles.create(sandboxId, {\n name: profileName,\n rules: {\n tools: { allow: ['*'] },\n resources: { allow: ['*'] },\n },\n });\n return created.permissionProfileId;\n }\n\n /**\n * Ensure an assignment exists for a subject in a sandbox with a permission profile\n */\n private async ensureAssignment(\n subjectId: string,\n sandboxId: string,\n permissionProfileId: string\n ): Promise<void> {\n try {\n const assignments = await this.request<AssignmentListResponse>(\n `/control/subjects/${subjectId}/assignments`\n );\n // Check for ANY assignment in this sandbox\n const existing = assignments.items.find(\n (a) => a.sandboxId === sandboxId\n );\n\n if (existing) {\n // If assignment exists with same profile, we are done\n if (existing.permissionProfileId === permissionProfileId) {\n return;\n }\n\n // If assignment exists but with different profile, delete it first\n // This avoids UNIQUE constraint violation when creating the new one\n await this.request<DeleteResponse>(`/control/assignments/${existing.assignmentId}`, {\n method: 'DELETE'\n });\n }\n } catch {\n // Ignore lookup errors\n }\n\n await this.request<Assignment>(`/control/subjects/${subjectId}/assignments`, {\n method: 'POST',\n body: JSON.stringify({\n sandboxId,\n subjectId,\n permissionProfileId,\n }),\n });\n }\n\n /**\n * Sandbox management API\n */\n get sandboxes() {\n return {\n list: async (): Promise<SandboxListResponse> => {\n return this.request<SandboxListResponse>('/control/sandboxes');\n },\n get: async (id: string): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`);\n },\n create: async (data: CreateSandboxData): Promise<Sandbox> => {\n return this.request<Sandbox>('/control/sandboxes', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n update: async (id: string, data: Partial<CreateSandboxData>): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n },\n delete: async (id: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/sandboxes/${id}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Permission Profile management for sandboxes\n */\n get permissionProfiles() {\n return {\n list: async (sandboxId: string): Promise<PermissionProfile[]> => {\n const result = await this.request<PermissionProfileListResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles`\n );\n return result.items;\n },\n get: async (sandboxId: string, profileId: string): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`\n );\n },\n create: async (\n sandboxId: string,\n data: CreatePermissionProfileData\n ): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n },\n delete: async (sandboxId: string, profileId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`,\n {\n method: 'DELETE',\n }\n );\n },\n };\n }\n\n /**\n * Environment management\n */\n get environments() {\n return {\n list: async (sandboxId: string): Promise<EnvironmentData[]> => {\n const result = await this.request<EnvironmentListResponse>(\n `/control/sandboxes/${sandboxId}/environments`\n );\n return result.items;\n },\n get: async (environmentId: string): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/environments/${environmentId}`);\n },\n create: async (\n sandboxId: string,\n data: CreateEnvironmentData\n ): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/sandboxes/${sandboxId}/environments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n delete: async (environmentId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/environments/${environmentId}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Subject management\n */\n get subjects() {\n return {\n get: async (subjectId: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${subjectId}`);\n },\n listAssignments: async (subjectId: string): Promise<AssignmentListResponse> => {\n return this.request<AssignmentListResponse>(`/control/subjects/${subjectId}/assignments`);\n },\n };\n }\n\n /**\n * @deprecated Use recordUser() instead\n */\n get users() {\n return {\n create: async (data: { id: string; name?: string; email?: string }): Promise<Subject> => {\n return this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: data.id,\n name: data.name,\n email: data.email,\n }),\n });\n },\n get: async (id: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${id}`);\n },\n };\n }\n\n /**\n * Make an authenticated API request\n */\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.httpUrl}${path}`;\n console.log(`[SDK] Requesting: ${url}`);\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Granular API Error (${response.status}): ${errorText}`);\n }\n\n if (response.status === 204) {\n return { deleted: true } as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n"]}
|