dominus-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/config.ts","../src/transport/protocol.ts","../src/transport/ws-server.ts","../src/memory/store.ts","../src/tools/studio/read-script.ts","../src/tools/studio/edit-script.ts","../src/tools/studio/run-code.ts","../src/tools/studio/get-explorer.ts","../src/tools/studio/get-properties.ts","../src/tools/studio/set-properties.ts","../src/tools/studio/insert-instance.ts","../src/tools/studio/delete-instance.ts","../src/tools/studio/get-output.ts","../src/tools/studio/get-selection.ts","../src/tools/studio/search-scripts.ts","../src/tools/studio/run-tests.ts","../src/tools/studio/get-class-info.ts","../src/tools/studio/create-ui.ts","../src/tools/studio/execute-run-test.ts","../src/tools/studio/execute-play-test.ts","../src/tools/studio/create-part.ts","../src/tools/studio/clone-instance.ts","../src/tools/studio/group-instances.ts","../src/tools/studio/build-multiple.ts","../src/tools/memory/recall.ts","../src/tools/memory/remember.ts","../src/tools/cloud/upload-asset.ts","../src/mcp/server.ts","../src/ui/components/Welcome.tsx","../src/ui/components/Setup.tsx","../src/ui/components/StatusBar.tsx","../src/ui/components/OutputPane.tsx","../src/ui/components/ChatPane.tsx","../src/utils/clipboard.ts","../src/ui/components/InputBar.tsx","../src/ui/components/Explorer.tsx","../src/ui/components/ToolCallView.tsx","../src/ui/components/Layout.tsx","../src/ui/hooks/useStudio.ts","../src/app.tsx","../src/index.tsx","../src/transport/ws-client.ts","../src/ai/provider.ts","../src/agent/system-prompt.ts","../src/agent/context-builder.ts","../src/ai/models.ts","../src/agent/loop.ts","../src/tools/registry.ts"],"names":["fs","path","os","result","tool","React","jsxs","Box","jsx","Text","Fragment","formatTime","useState","useInput","TextInput","useRef","useEffect","useCallback","EventEmitter","WebSocket","nanoid","recallFacts","storeFact","getScriptIndex","execSync","startMcpServer"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ConfigAccess } from '../tools/types.js';\n\nconst DOMINUS_DIR = path.join(os.homedir(), '.dominus');\nconst CONFIG_PATH = path.join(DOMINUS_DIR, 'config.json');\nconst DB_PATH = path.join(DOMINUS_DIR, 'dominus.db');\nconst RULES_PATH = path.join(DOMINUS_DIR, 'rules.json');\n\nexport type AIProviderType =\n | 'openai'\n | 'anthropic'\n | 'gemini'\n | 'xai'\n | 'openrouter'\n | 'custom';\n\nexport interface ProviderConfig {\n name: string;\n baseUrl: string;\n envVar: string;\n defaultModel: string;\n}\n\nexport const PROVIDERS: Record<AIProviderType, ProviderConfig> = {\n openai: {\n name: 'OpenAI',\n baseUrl: 'https://api.openai.com/v1',\n envVar: 'OPENAI_API_KEY',\n defaultModel: 'gpt-5.3-codex',\n },\n anthropic: {\n name: 'Anthropic',\n baseUrl: 'https://api.anthropic.com/v1/',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: 'claude-sonnet-4-6',\n },\n gemini: {\n name: 'Google Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n envVar: 'GEMINI_API_KEY',\n defaultModel: 'gemini-3.1-pro',\n },\n xai: {\n name: 'xAI (Grok)',\n baseUrl: 'https://api.x.ai/v1',\n envVar: 'XAI_API_KEY',\n defaultModel: 'grok-4.2',\n },\n openrouter: {\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n envVar: 'OPENROUTER_API_KEY',\n defaultModel: 'anthropic/claude-sonnet-4-6',\n },\n custom: {\n name: 'Custom',\n baseUrl: '',\n envVar: '',\n defaultModel: '',\n },\n};\n\nexport interface DominusConfig {\n provider: AIProviderType;\n apiKey?: string;\n apiBaseUrl: string;\n model: string;\n port: number;\n maxToolIterations: number;\n maxVerifyRetries: number;\n tokenBudget: number;\n autoIndex: boolean;\n autoLearn: boolean;\n userName: string;\n openCloudApiKey?: string;\n}\n\nconst DEFAULTS: DominusConfig = {\n provider: 'openai',\n apiBaseUrl: '',\n model: '',\n port: 18088,\n maxToolIterations: 25,\n maxVerifyRetries: 3,\n tokenBudget: 128000,\n autoIndex: true,\n autoLearn: true,\n userName: 'Developer',\n};\n\n/**\n * Auto-detect provider from environment variables.\n * Returns the first provider whose env var is set, or null.\n */\nexport function detectProviderFromEnv(): { provider: AIProviderType; apiKey: string } | null {\n const priority: AIProviderType[] = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter'];\n for (const p of priority) {\n const key = process.env[PROVIDERS[p].envVar];\n if (key) return { provider: p, apiKey: key };\n }\n return null;\n}\n\n/**\n * Resolve the effective base URL and model for a provider config.\n */\nexport function resolveProviderSettings(config: DominusConfig): {\n baseUrl: string;\n model: string;\n} {\n const providerInfo = PROVIDERS[config.provider];\n return {\n baseUrl: config.apiBaseUrl || providerInfo?.baseUrl || PROVIDERS.openrouter.baseUrl,\n model: config.model || providerInfo?.defaultModel || 'gpt-4o',\n };\n}\n\nexport interface DominusRules {\n do: string[];\n dont: string[];\n conventions: string[];\n context: string;\n}\n\nconst DEFAULT_RULES: DominusRules = {\n do: [],\n dont: [],\n conventions: [],\n context: '',\n};\n\nfunction ensureDir(): void {\n if (!fs.existsSync(DOMINUS_DIR)) {\n fs.mkdirSync(DOMINUS_DIR, { recursive: true });\n }\n}\n\nfunction readJson<T>(filePath: string, defaults: T): T {\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return { ...defaults, ...JSON.parse(raw) };\n }\n } catch {\n // Corrupted file; reset to defaults\n }\n return { ...defaults };\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n ensureDir();\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport function loadConfig(): DominusConfig {\n ensureDir();\n return readJson(CONFIG_PATH, DEFAULTS);\n}\n\nexport function saveConfig(config: DominusConfig): void {\n writeJson(CONFIG_PATH, config);\n}\n\nexport function getConfigValue<K extends keyof DominusConfig>(key: K): DominusConfig[K] {\n const config = loadConfig();\n return config[key];\n}\n\nexport function setConfigValue<K extends keyof DominusConfig>(\n key: K,\n value: DominusConfig[K],\n): void {\n const config = loadConfig();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value;\n saveConfig(config);\n}\n\nexport function loadRules(): DominusRules {\n ensureDir();\n return readJson(RULES_PATH, DEFAULT_RULES);\n}\n\nexport function saveRules(rules: DominusRules): void {\n writeJson(RULES_PATH, rules);\n}\n\nexport function getDominusDir(): string {\n ensureDir();\n return DOMINUS_DIR;\n}\n\nexport function getDbPath(): string {\n ensureDir();\n return DB_PATH;\n}\n\nexport function createConfigAccess(): ConfigAccess {\n return {\n get<T>(key: string): T | undefined {\n const config = loadConfig() as unknown as Record<string, unknown>;\n return config[key] as T | undefined;\n },\n set(key: string, value: unknown): void {\n const config = loadConfig() as unknown as Record<string, unknown>;\n config[key] = value;\n saveConfig(config as unknown as DominusConfig);\n },\n getAll(): Record<string, unknown> {\n return loadConfig() as unknown as Record<string, unknown>;\n },\n };\n}\n","import { nanoid } from 'nanoid';\r\n\r\nexport interface WsMessage<T = unknown> {\r\n id: string;\r\n type: string;\r\n payload: T;\r\n ts: number;\r\n}\r\n\r\nexport const StudioMsg = {\r\n CONNECTED: 'studio:connected',\r\n DISCONNECTED: 'studio:disconnected',\r\n EXPLORER: 'studio:explorer',\r\n OUTPUT: 'studio:output',\r\n ERROR: 'studio:error',\r\n SELECTION: 'studio:selection',\r\n SCRIPT_CONTENT: 'studio:script:content',\r\n SCRIPT_CHANGED: 'studio:script:changed',\r\n RESPONSE: 'studio:response',\r\n REFLECTION: 'studio:reflection',\r\n TEST_RESULTS: 'studio:test:results',\r\n} as const;\r\n\r\nexport const CliMsg = {\r\n GET_EXPLORER: 'cli:get:explorer',\r\n GET_SCRIPT: 'cli:get:script',\r\n SET_SCRIPT: 'cli:set:script',\r\n RUN_CODE: 'cli:run',\r\n GET_PROPERTIES: 'cli:get:properties',\r\n SET_PROPERTIES: 'cli:set:properties',\r\n INSERT_INSTANCE: 'cli:insert',\r\n DELETE_INSTANCE: 'cli:delete',\r\n GET_SELECTION: 'cli:get:selection',\r\n SELECT: 'cli:select',\r\n SEARCH_SCRIPTS: 'cli:search:scripts',\r\n GET_OUTPUT: 'cli:get:output',\r\n RUN_TESTS: 'cli:run:tests',\r\n EXECUTE_RUN_TEST: 'cli:test:run',\r\n EXECUTE_PLAY_TEST: 'cli:test:play',\r\n END_TEST: 'cli:test:end',\r\n BUILD_UI: 'cli:build:ui',\r\n GET_REFLECTION: 'cli:get:reflection',\r\n UPLOAD_ASSET: 'cli:upload:asset',\r\n} as const;\r\n\r\nexport type StudioMsgType = (typeof StudioMsg)[keyof typeof StudioMsg];\r\nexport type CliMsgType = (typeof CliMsg)[keyof typeof CliMsg];\r\n\r\nexport interface ExplorerNode {\r\n name: string;\r\n className: string;\r\n path: string;\r\n children?: ExplorerNode[];\r\n}\r\n\r\nexport interface StudioConnectedPayload {\r\n studioVersion: string;\r\n placeId?: number;\r\n placeName?: string;\r\n engineVersion?: string;\r\n}\r\n\r\nexport interface ScriptContentPayload {\r\n path: string;\r\n className: 'Script' | 'LocalScript' | 'ModuleScript';\r\n source: string;\r\n lineCount: number;\r\n}\r\n\r\nexport interface ScriptChangedPayload {\r\n path: string;\r\n source: string;\r\n}\r\n\r\nexport interface OutputPayload {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\nexport interface SelectionPayload {\r\n paths: string[];\r\n classNames: string[];\r\n}\r\n\r\nexport interface PropertyEntry {\r\n name: string;\r\n value: string;\r\n type: string;\r\n category?: string;\r\n}\r\n\r\nexport interface TestResultPayload {\r\n name: string;\r\n passed: boolean;\r\n duration: number;\r\n error?: string;\r\n}\r\n\r\nexport interface StudioTestPayload {\r\n args?: unknown;\r\n}\r\n\r\nexport interface StudioTestResultPayload {\r\n success: boolean;\r\n result?: unknown;\r\n error?: string;\r\n duration?: number;\r\n}\r\n\r\nexport interface ReflectionPayload {\r\n className: string;\r\n properties: { name: string; type: string; category: string }[];\r\n methods: { name: string; parameters: string[] }[];\r\n events: { name: string; parameters: string[] }[];\r\n}\r\n\r\nexport interface RunCodePayload {\r\n code: string;\r\n}\r\n\r\nexport interface RunCodeResponsePayload {\r\n output: string;\r\n error?: string;\r\n duration: number;\r\n}\r\n\r\nexport interface SearchScriptsPayload {\r\n query: string;\r\n maxResults?: number;\r\n}\r\n\r\nexport interface SearchResultPayload {\r\n results: {\r\n path: string;\r\n className: string;\r\n matches: { line: number; text: string }[];\r\n }[];\r\n}\r\n\r\nexport interface InsertInstancePayload {\r\n className: string;\r\n parentPath: string;\r\n name: string;\r\n properties?: Record<string, unknown>;\r\n}\r\n\r\nexport interface SetPropertiesPayload {\r\n path: string;\r\n properties: Record<string, unknown>;\r\n}\r\n\r\nexport function createMessage<T>(type: string, payload: T): WsMessage<T> {\r\n return { id: nanoid(), type, payload, ts: Date.now() };\r\n}\r\n\r\nexport function createRequest<T>(type: string, payload: T): WsMessage<T> {\r\n return createMessage(type, payload);\r\n}\r\n\r\nexport function parseMessage(raw: string): WsMessage {\r\n try {\r\n return JSON.parse(raw) as WsMessage;\r\n } catch {\r\n throw new Error(`Failed to parse WebSocket message: ${raw.slice(0, 100)}`);\r\n }\r\n}\r\n\r\nexport function serializeMessage(msg: WsMessage): string {\r\n return JSON.stringify(msg);\r\n}\r\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { EventEmitter } from 'node:events';\nimport {\n parseMessage,\n serializeMessage,\n createMessage,\n StudioMsg,\n type WsMessage,\n type StudioConnectedPayload,\n} from './protocol.js';\n\nexport interface StudioConnection {\n ws: WebSocket;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface StudioBridge extends EventEmitter {\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>>;\n sendNotification(type: string, payload: unknown): void;\n isConnected(): boolean;\n getConnectionInfo(): StudioConnection | null;\n getPort(): number;\n stop(): Promise<void>;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n private studioClient: StudioConnection | null = null;\n private controllers = new Set<WebSocket>();\n private pendingRequests = new Map<\n string,\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private relayRequests = new Map<string, WebSocket>();\n private port: number;\n\n constructor(port = 18088) {\n super();\n this.port = port;\n }\n\n start(maxRetries = 0): Promise<void> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number, attempt: number) => {\n const wss = new WebSocketServer({ port });\n\n wss.on('listening', () => {\n this.wss = wss;\n this.port = port;\n this.wss.on('connection', (ws) => this.handleConnection(ws));\n this.emit('server:started', { port });\n resolve();\n });\n\n wss.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE' && attempt < maxRetries) {\n wss.close();\n tryPort(port + 1, attempt + 1);\n } else {\n this.emit('server:error', err);\n reject(err);\n }\n });\n };\n\n tryPort(this.port, 0);\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n let identified = false;\n\n ws.on('message', (raw) => {\n try {\n const msg = parseMessage(raw.toString());\n\n if (!identified) {\n if (msg.type === StudioMsg.CONNECTED) {\n identified = true;\n this.setStudioClient(ws, msg);\n return;\n }\n if (msg.type === 'controller:connect') {\n identified = true;\n this.addController(ws);\n ws.send(serializeMessage(createMessage('controller:welcome', {\n studioConnected: this.isConnected(),\n port: this.port,\n })));\n return;\n }\n }\n\n if (this.controllers.has(ws)) {\n this.handleControllerMessage(ws, msg);\n } else {\n this.handleStudioMessage(msg);\n }\n } catch (err) {\n this.emit('server:error', err);\n }\n });\n\n ws.on('close', () => {\n if (this.controllers.has(ws)) {\n this.controllers.delete(ws);\n for (const [id, controllerWs] of this.relayRequests) {\n if (controllerWs === ws) this.relayRequests.delete(id);\n }\n } else if (this.studioClient?.ws === ws) {\n this.studioClient = null;\n this.emit('studio:disconnected');\n this.broadcastToControllers('studio:disconnected', {});\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Studio disconnected'));\n this.pendingRequests.delete(id);\n }\n }\n });\n\n ws.on('error', (err) => {\n this.emit('server:error', err);\n });\n }\n\n private setStudioClient(ws: WebSocket, msg: WsMessage): void {\n if (this.studioClient) {\n this.studioClient.ws.close();\n }\n\n const payload = msg.payload as StudioConnectedPayload;\n this.studioClient = {\n ws,\n connectedAt: Date.now(),\n studioVersion: payload.studioVersion,\n placeId: payload.placeId,\n placeName: payload.placeName,\n };\n\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n }\n\n private addController(ws: WebSocket): void {\n this.controllers.add(ws);\n this.emit('controller:connected');\n }\n\n private broadcastToControllers(type: string, payload: unknown): void {\n const msg = serializeMessage(createMessage(type, payload));\n for (const ws of this.controllers) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n }\n }\n }\n\n private handleControllerMessage(controllerWs: WebSocket, msg: WsMessage): void {\n if (!this.studioClient || this.studioClient.ws.readyState !== WebSocket.OPEN) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { error: 'Studio not connected' },\n ts: Date.now(),\n }));\n return;\n }\n\n this.relayRequests.set(msg.id, controllerWs);\n this.studioClient.ws.send(serializeMessage(msg));\n }\n\n private handleStudioMessage(msg: WsMessage): void {\n if (msg.type === StudioMsg.CONNECTED) {\n const payload = msg.payload as StudioConnectedPayload;\n if (this.studioClient) {\n this.studioClient.studioVersion = payload.studioVersion;\n this.studioClient.placeId = payload.placeId;\n this.studioClient.placeName = payload.placeName;\n }\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n // Check if this is a relayed request from a controller\n const controllerWs = this.relayRequests.get(msg.id);\n if (controllerWs && controllerWs.readyState === WebSocket.OPEN) {\n controllerWs.send(serializeMessage(msg));\n this.relayRequests.delete(msg.id);\n return;\n }\n\n // Otherwise handle locally (MCP or direct)\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n pending.resolve(msg);\n this.pendingRequests.delete(msg.id);\n }\n return;\n }\n\n // Forward events to controllers and local listeners\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n this.broadcastToControllers(msg.type, msg.payload);\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n if (!this.studioClient || this.studioClient.ws.readyState !== WebSocket.OPEN) {\n reject(new Error('No Studio connection'));\n return;\n }\n\n const msg = createMessage(type, payload);\n\n const timer = setTimeout(() => {\n this.pendingRequests.delete(msg.id);\n reject(new Error(`Request timed out: ${type}`));\n }, timeoutMs);\n\n this.pendingRequests.set(msg.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n });\n\n this.studioClient.ws.send(serializeMessage(msg));\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n if (!this.studioClient || this.studioClient.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const msg = createMessage(type, payload);\n this.studioClient.ws.send(serializeMessage(msg));\n }\n\n isConnected(): boolean {\n return this.studioClient !== null && this.studioClient.ws.readyState === WebSocket.OPEN;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.studioClient;\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n if (this.studioClient) {\n this.studioClient.ws.close();\n this.studioClient = null;\n }\n for (const ws of this.controllers) {\n ws.close();\n }\n this.controllers.clear();\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Server shutting down'));\n }\n this.pendingRequests.clear();\n this.relayRequests.clear();\n\n if (this.wss) {\n this.wss.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n}\n","import fs from 'node:fs';\r\nimport initSqlJs from 'sql.js';\r\nimport type { Database, QueryExecResult } from 'sql.js';\r\nimport { getDbPath } from '../config/config.js';\r\nimport type { Fact, FactCategory, SessionSummary, ChatMessage, ScriptEntry } from './types.js';\r\n\r\nlet db: Database | null = null;\r\nlet dbPath: string;\r\n\r\nconst SCHEMA = `\r\nCREATE TABLE IF NOT EXISTS facts (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n category TEXT NOT NULL,\r\n source TEXT,\r\n relevance REAL DEFAULT 1.0,\r\n created_at INTEGER NOT NULL,\r\n accessed_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS summaries (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n session_id TEXT NOT NULL,\r\n summary TEXT NOT NULL,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS messages (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n session_id TEXT NOT NULL,\r\n role TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n tool_name TEXT,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS script_index (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n path TEXT NOT NULL,\r\n class_name TEXT NOT NULL,\r\n summary TEXT,\r\n line_count INTEGER,\r\n last_hash TEXT,\r\n updated_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE INDEX IF NOT EXISTS idx_facts_project ON facts(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_facts_category ON facts(project_id, category);\r\nCREATE INDEX IF NOT EXISTS idx_scripts_project ON script_index(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\r\nCREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id);\r\n`;\r\n\r\nfunction persist(): void {\r\n if (!db) return;\r\n const data = db.export();\r\n fs.writeFileSync(dbPath, Buffer.from(data));\r\n}\r\n\r\nexport async function initMemoryStore(): Promise<void> {\r\n if (db) return;\r\n dbPath = getDbPath();\r\n const SQL = await initSqlJs();\r\n\r\n if (fs.existsSync(dbPath)) {\r\n const buffer = fs.readFileSync(dbPath);\r\n db = new SQL.Database(buffer);\r\n } else {\r\n db = new SQL.Database();\r\n }\r\n\r\n db.run(SCHEMA);\r\n persist();\r\n}\r\n\r\nexport function getDb(): Database {\r\n if (!db) throw new Error('Memory store not initialized. Call initMemoryStore() first.');\r\n return db;\r\n}\r\n\r\nexport function closeMemoryStore(): void {\r\n if (db) {\r\n persist();\r\n db.close();\r\n db = null;\r\n }\r\n}\r\n\r\n// --- Facts ---\r\n\r\nexport function storeFact(fact: Omit<Fact, 'id'>): number {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO facts (project_id, content, category, source, relevance, created_at, accessed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n fact.projectId,\r\n fact.content,\r\n fact.category,\r\n fact.source ?? null,\r\n fact.relevance,\r\n fact.createdAt,\r\n fact.accessedAt,\r\n ],\r\n );\r\n persist();\r\n const stmt = d.prepare('SELECT last_insert_rowid()');\r\n stmt.step();\r\n const row = stmt.get();\r\n stmt.free();\r\n return (row?.[0] as number) ?? 0;\r\n}\r\n\r\nexport function recallFacts(projectId: string, query: string, limit = 10): Fact[] {\r\n const d = getDb();\r\n const keywords = query\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter((w) => w.length > 2);\r\n\r\n if (keywords.length === 0) {\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n return rowsToFacts(result);\r\n }\r\n\r\n const likeClauses = keywords.map(() => `LOWER(content) LIKE ?`).join(' OR ');\r\n const likeParams = keywords.map((k) => `%${k}%`);\r\n\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? AND (${likeClauses})\r\n ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, ...likeParams, limit],\r\n );\r\n\r\n const facts = rowsToFacts(result);\r\n\r\n // Update accessed_at for recalled facts\r\n for (const fact of facts) {\r\n if (fact.id) {\r\n d.run(`UPDATE facts SET accessed_at = ? WHERE id = ?`, [Date.now(), fact.id]);\r\n }\r\n }\r\n if (facts.length > 0) persist();\r\n\r\n return facts;\r\n}\r\n\r\nexport function getAllFacts(projectId: string): Fact[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC`,\r\n [projectId],\r\n );\r\n return rowsToFacts(result);\r\n}\r\n\r\nfunction rowsToFacts(result: QueryExecResult[]): Fact[] {\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n content: row[2] as string,\r\n category: row[3] as FactCategory,\r\n source: row[4] as string | undefined,\r\n relevance: row[5] as number,\r\n createdAt: row[6] as number,\r\n accessedAt: row[7] as number,\r\n }));\r\n}\r\n\r\n// --- Messages ---\r\n\r\nexport function storeMessage(msg: Omit<ChatMessage, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO messages (session_id, role, content, tool_name, created_at)\r\n VALUES (?, ?, ?, ?, ?)`,\r\n [msg.sessionId, msg.role, msg.content, msg.toolName ?? null, msg.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getSessionMessages(sessionId: string, limit = 100): ChatMessage[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ?`,\r\n [sessionId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n sessionId: row[1] as string,\r\n role: row[2] as ChatMessage['role'],\r\n content: row[3] as string,\r\n toolName: (row[4] as string) || undefined,\r\n createdAt: row[5] as number,\r\n }));\r\n}\r\n\r\n// --- Summaries ---\r\n\r\nexport function storeSummary(summary: Omit<SessionSummary, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO summaries (project_id, session_id, summary, created_at)\r\n VALUES (?, ?, ?, ?)`,\r\n [summary.projectId, summary.sessionId, summary.summary, summary.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getProjectSummaries(projectId: string, limit = 20): SessionSummary[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM summaries WHERE project_id = ? ORDER BY created_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n sessionId: row[2] as string,\r\n summary: row[3] as string,\r\n createdAt: row[4] as number,\r\n }));\r\n}\r\n\r\n// --- Script Index ---\r\n\r\nexport function upsertScript(entry: Omit<ScriptEntry, 'id'>): void {\r\n const d = getDb();\r\n const existing = d.exec(\r\n `SELECT id FROM script_index WHERE project_id = ? AND path = ?`,\r\n [entry.projectId, entry.path],\r\n );\r\n\r\n if (existing[0]?.values.length) {\r\n d.run(\r\n `UPDATE script_index SET class_name = ?, summary = ?, line_count = ?, last_hash = ?, updated_at = ?\r\n WHERE project_id = ? AND path = ?`,\r\n [\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n entry.projectId,\r\n entry.path,\r\n ],\r\n );\r\n } else {\r\n d.run(\r\n `INSERT INTO script_index (project_id, path, class_name, summary, line_count, last_hash, updated_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n entry.projectId,\r\n entry.path,\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n ],\r\n );\r\n }\r\n persist();\r\n}\r\n\r\nexport function getScriptIndex(\r\n projectId: string,\r\n): { path: string; summary?: string; className: string }[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT path, summary, class_name FROM script_index WHERE project_id = ? ORDER BY path`,\r\n [projectId],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n path: row[0] as string,\r\n summary: (row[1] as string) || undefined,\r\n className: row[2] as string,\r\n }));\r\n}\r\n\r\nexport function getScriptEntry(projectId: string, scriptPath: string): ScriptEntry | null {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM script_index WHERE project_id = ? AND path = ?`,\r\n [projectId, scriptPath],\r\n );\r\n if (!result[0]?.values.length) return null;\r\n const row = result[0].values[0];\r\n return {\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n path: row[2] as string,\r\n className: row[3] as string,\r\n summary: (row[4] as string) || undefined,\r\n lineCount: (row[5] as number) || undefined,\r\n lastHash: (row[6] as string) || undefined,\r\n updatedAt: row[7] as number,\r\n };\r\n}\r\n\r\n// --- Decay ---\r\n\r\nexport function decayRelevance(projectId: string, factor = 0.95): void {\r\n const d = getDb();\r\n d.run(`UPDATE facts SET relevance = relevance * ? WHERE project_id = ?`, [factor, projectId]);\r\n persist();\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ScriptContentPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'read_script',\r\n description:\r\n 'Read the source code of a script in Roblox Studio. Provide the full instance path (e.g., \"ServerScriptService.GameManager\").',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script (e.g., \"ServerScriptService.GameManager\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n\r\n if (!response.payload) {\r\n return { success: false, error: `Script not found: ${path}` };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n path: response.payload.path,\r\n className: response.payload.className,\r\n source: response.payload.source,\r\n lineCount: response.payload.lineCount,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'edit_script',\r\n description:\r\n 'Replace the entire source code of a script in Roblox Studio. Provide the full path and the new source code.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script',\r\n },\r\n source: {\r\n type: 'string',\r\n description: 'The new complete source code for the script',\r\n },\r\n },\r\n required: ['path', 'source'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const source = params.source as string;\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_SCRIPT, { path, source });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to edit script' };\r\n }\r\n\r\n return { success: true, data: { path, linesWritten: source.split('\\n').length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { RunCodeResponsePayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_code',\r\n description:\r\n 'Execute arbitrary Luau code in Roblox Studio and return the output. The code runs in the Studio plugin context with full API access.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n code: {\r\n type: 'string',\r\n description: 'Luau code to execute in Studio',\r\n },\r\n },\r\n required: ['code'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = params.code as string;\r\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n const payload = response.payload;\r\n\r\n if (payload.error) {\r\n return { success: false, error: payload.error, data: { output: payload.output } };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { output: payload.output, duration: payload.duration },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_explorer',\r\n description:\r\n 'Get the DataModel explorer tree from Roblox Studio. Optionally filter by a root path and max depth.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n rootPath: {\r\n type: 'string',\r\n description: 'Root path to start from (e.g., \"ServerScriptService\"). Omit for entire tree.',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth of the tree (default: 3)',\r\n default: 3,\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: params.rootPath ?? null,\r\n maxDepth: params.maxDepth ?? 3,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { PropertyEntry } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_properties',\r\n description: 'Get all properties of an instance in Roblox Studio by its path.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(\r\n CliMsg.GET_PROPERTIES,\r\n { path: params.path },\r\n );\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'set_properties',\r\n description: 'Set properties on an instance in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Key-value pairs of properties to set (e.g., {\"Name\": \"MyPart\", \"BrickColor\": \"Bright red\"})',\r\n },\r\n },\r\n required: ['path', 'properties'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_PROPERTIES, {\r\n path: params.path,\r\n properties: params.properties,\r\n });\r\n\r\n const payload = response.payload as { success: boolean; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to set properties' };\r\n }\r\n\r\n return { success: true, data: { path: params.path, updated: Object.keys(params.properties as object) } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'insert_instance',\r\n description: 'Insert a new instance into the Roblox Studio DataModel.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Class name of the instance to create (e.g., \"Part\", \"Script\", \"ModuleScript\")',\r\n },\r\n parentPath: {\r\n type: 'string',\r\n description: 'Full path of the parent instance (e.g., \"Workspace\", \"ServerScriptService\")',\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Name for the new instance',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Optional properties to set on the new instance',\r\n },\r\n },\r\n required: ['className', 'parentPath', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className: params.className,\r\n parentPath: params.parentPath,\r\n name: params.name,\r\n properties: params.properties ?? {},\r\n });\r\n\r\n const payload = response.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to insert instance' };\r\n }\r\n\r\n return { success: true, data: { path: payload.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'delete_instance',\r\n description: 'Delete an instance from the Roblox Studio DataModel by path.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path to delete (e.g., \"Workspace.OldPart\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.DELETE_INSTANCE, { path: params.path });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to delete instance' };\r\n }\r\n\r\n return { success: true, data: { deleted: params.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { OutputPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_output',\r\n description: 'Get recent output log entries from Roblox Studio (prints, warnings, errors).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n limit: {\r\n type: 'number',\r\n description: 'Maximum number of log entries to return (default: 50)',\r\n default: 50,\r\n },\r\n level: {\r\n type: 'string',\r\n description: 'Filter by log level',\r\n enum: ['info', 'warn', 'error'],\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit: params.limit ?? 50,\r\n level: params.level ?? null,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SelectionPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_selection',\r\n description: 'Get the currently selected instances in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SearchResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'search_scripts',\r\n description:\r\n 'Search across all scripts in Roblox Studio for a text pattern. Returns matching lines with context.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'Text or pattern to search for in script sources',\r\n },\r\n maxResults: {\r\n type: 'number',\r\n description: 'Maximum number of script results (default: 20)',\r\n default: 20,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, {\r\n query: params.query,\r\n maxResults: params.maxResults ?? 20,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { TestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_tests',\r\n description:\r\n 'Run tests in Roblox Studio using StudioTestService. Can run all tests or a specific test by name.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n testName: {\r\n type: 'string',\r\n description: 'Specific test name to run. Omit to run all tests.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: params.testName ?? null,\r\n });\r\n\r\n const results = response.payload.results ?? [];\r\n const passed = results.filter((r) => r.passed).length;\r\n const failed = results.filter((r) => !r.passed).length;\r\n\r\n return {\r\n success: failed === 0,\r\n data: { total: results.length, passed, failed, results },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_class_info',\r\n description:\r\n 'Look up the full schema of a Roblox class using ReflectionService. ' +\r\n 'Returns all properties (with their types), methods (with parameters), and events. ' +\r\n 'ALWAYS call this before creating or modifying GUI/UI elements (Frame, TextLabel, ImageLabel, etc.) ' +\r\n 'to know the correct property names and expected types (e.g., Size is UDim2 for GUI, Vector3 for Parts).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\", \"Camera\"',\r\n },\r\n },\r\n required: ['className'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n className: string;\r\n properties: { name: string; type: string; category?: string; owner?: string }[];\r\n methods: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n events: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n superclass?: string;\r\n creatable?: boolean;\r\n error?: string;\r\n }>(CliMsg.GET_REFLECTION, { className: params.className });\r\n\r\n const payload = response.payload;\r\n if (payload.error) {\r\n return { success: false, error: payload.error };\r\n }\r\n\r\n return { success: true, data: payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_ui',\r\n description:\r\n 'Create an entire UI tree in Roblox Studio in a SINGLE call. ' +\r\n 'Pass a declarative JSON tree with ClassName, Name, properties, and Children. ' +\r\n 'All types are auto-coerced natively in Luau — UDim2, Color3, Font, enums all work. ' +\r\n 'This is 10x faster than run_code for UI because it handles everything in one round-trip ' +\r\n 'with no Luau syntax issues. Replaces any existing instance with the same name.\\n\\n' +\r\n 'Example: create a pastel hello world screen:\\n' +\r\n '{\\n' +\r\n ' \"parent\": \"StarterGui\",\\n' +\r\n ' \"tree\": {\\n' +\r\n ' \"ClassName\": \"ScreenGui\",\\n' +\r\n ' \"Name\": \"HelloWorld\",\\n' +\r\n ' \"ResetOnSpawn\": false,\\n' +\r\n ' \"Children\": [{\\n' +\r\n ' \"ClassName\": \"Frame\",\\n' +\r\n ' \"Name\": \"Background\",\\n' +\r\n ' \"Size\": [1, 0, 1, 0],\\n' +\r\n ' \"BackgroundColor3\": \"#F0E6FF\",\\n' +\r\n ' \"Children\": [\\n' +\r\n ' { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\\n' +\r\n ' { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello World!\",\\n' +\r\n ' \"Size\": [0.5, 0, 0.1, 0], \"Position\": [0.25, 0, 0.45, 0],\\n' +\r\n ' \"BackgroundTransparency\": 1, \"TextColor3\": \"#6C5CE7\",\\n' +\r\n ' \"TextScaled\": true, \"Font\": \"GothamBold\" }\\n' +\r\n ' ]\\n' +\r\n ' }]\\n' +\r\n ' }\\n' +\r\n '}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path: \"StarterGui\", \"PlayerGui\", or any instance path. Default: StarterGui',\r\n },\r\n tree: {\r\n type: 'object',\r\n description:\r\n 'The root UI node. Each node has: ClassName (string), Name (string), ' +\r\n 'any properties as key-value pairs, and Children (array of child nodes). ' +\r\n 'Property values are auto-coerced:\\n' +\r\n ' UDim2: [xScale, xOffset, yScale, yOffset] or {XScale, XOffset, YScale, YOffset}\\n' +\r\n ' Color3: \"#hex\", \"rgb(r,g,b)\", [r,g,b], or BrickColor name\\n' +\r\n ' UDim: [scale, offset] or number\\n' +\r\n ' Vector2: {x, y} or [x, y]\\n' +\r\n ' Font: \"GothamBold\", \"SourceSans\", etc. (Enum.Font names)\\n' +\r\n ' Enums: string name like \"Center\", \"Left\", \"Fit\"\\n' +\r\n ' FontFace: {Family, Weight, Style}',\r\n },\r\n },\r\n required: ['tree'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n path?: string;\r\n instanceCount?: number;\r\n error?: string;\r\n }>(CliMsg.BUILD_UI, {\r\n parent: params.parent ?? 'StarterGui',\r\n tree: params.tree,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'UI build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, instanceCount: payload.instanceCount },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_run_test',\r\n description:\r\n 'Start a Run mode test session in Roblox Studio using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for headless automated tests — no player character, just server scripts running.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_RUN_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Run mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_play_test',\r\n description:\r\n 'Start a solo Play mode test session in Roblox Studio using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for tests that need a player character and full client-server simulation.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_PLAY_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Play mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_part',\r\n description:\r\n 'Create a Part in Roblox Studio with position, size, color, material and more — all in one call. Much faster than insert_instance + set_properties separately.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Name for the part' },\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path (default: \"Workspace\")',\r\n },\r\n shape: {\r\n type: 'string',\r\n enum: ['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge'],\r\n description: 'Part shape (default: Block)',\r\n },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'World position {x, y, z}',\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Size in studs {x, y, z} (default: {4, 1, 2})',\r\n },\r\n color: {\r\n type: 'string',\r\n description: 'Color as hex \"#FF0000\", BrickColor name \"Bright red\", or RGB \"rgb(255,0,0)\"',\r\n },\r\n material: {\r\n type: 'string',\r\n description: 'Material name: Plastic, Wood, Grass, Ice, Metal, Concrete, Sand, Neon, Glass, etc.',\r\n },\r\n transparency: { type: 'number', description: '0 (opaque) to 1 (invisible)' },\r\n anchored: { type: 'boolean', description: 'Whether the part is anchored (default: true)' },\r\n canCollide: { type: 'boolean', description: 'Whether the part has collision' },\r\n },\r\n required: ['name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parent = (params.parent as string) || 'Workspace';\r\n const name = params.name as string;\r\n const pos = params.position as { x?: number; y?: number; z?: number } | undefined;\r\n const size = params.size as { x?: number; y?: number; z?: number } | undefined;\r\n\r\n const properties: Record<string, unknown> = {};\r\n\r\n if (pos) properties.Position = { X: pos.x ?? 0, Y: pos.y ?? 0, Z: pos.z ?? 0 };\r\n if (size) properties.Size = { X: size.x ?? 4, Y: size.y ?? 1, Z: size.z ?? 2 };\r\n if (params.color) {\r\n const c = params.color as string;\r\n if (c.startsWith('#')) {\r\n properties.Color = c;\r\n } else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) {\r\n properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n }\r\n } else {\r\n properties.BrickColor = c;\r\n }\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = (params.shape === 'Wedge') ? 'WedgePart'\r\n : (params.shape === 'CornerWedge') ? 'CornerWedgePart'\r\n : 'Part';\r\n\r\n const res = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: parent,\r\n name,\r\n properties,\r\n });\r\n\r\n const payload = res.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to create part' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, properties: Object.keys(properties) },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'clone_instance',\r\n description:\r\n 'Clone an existing instance in Roblox Studio and optionally reposition/rename it. Great for duplicating parts, models, or entire trees.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: { type: 'string', description: 'Path of instance to clone' },\r\n newName: { type: 'string', description: 'Name for the clone (optional)' },\r\n newParent: { type: 'string', description: 'Parent path for the clone (optional, defaults to same parent)' },\r\n offset: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Position offset from original {x, y, z}',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = buildCloneCode(params);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to clone' };\r\n }\r\n\r\n return { success: true, data: { output: payload.output } };\r\n },\r\n};\r\n\r\nfunction buildCloneCode(params: Record<string, unknown>): string {\r\n const path = params.path as string;\r\n const parts = path.split('.');\r\n let resolve = 'game';\r\n for (const p of parts) {\r\n resolve += `[\"${p}\"]`;\r\n }\r\n\r\n const lines = [\r\n `local orig = ${resolve}`,\r\n `local clone = orig:Clone()`,\r\n ];\r\n\r\n if (params.newName) {\r\n lines.push(`clone.Name = \"${params.newName}\"`);\r\n }\r\n\r\n if (params.newParent) {\r\n const parentParts = (params.newParent as string).split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) {\r\n parentResolve += `[\"${p}\"]`;\r\n }\r\n lines.push(`clone.Parent = ${parentResolve}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n\r\n const offset = params.offset as { x?: number; y?: number; z?: number } | undefined;\r\n if (offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${offset.x ?? 0}, ${offset.y ?? 0}, ${offset.z ?? 0})`);\r\n lines.push(`end`);\r\n }\r\n\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'group_instances',\r\n description:\r\n 'Group multiple instances under a new Model or Folder. Useful for organizing parts into objects (e.g., grouping trunk + leaves into a \"Tree\" model).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n paths: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of instance paths to group together',\r\n },\r\n groupName: { type: 'string', description: 'Name for the new group' },\r\n groupClass: {\r\n type: 'string',\r\n enum: ['Model', 'Folder'],\r\n description: 'Class for the group container (default: Model)',\r\n },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n },\r\n required: ['paths', 'groupName'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const paths = params.paths as string[];\r\n const groupName = params.groupName as string;\r\n const groupClass = (params.groupClass as string) || 'Model';\r\n const parent = (params.parent as string) || 'Workspace';\r\n\r\n const resolves = paths.map((p) => {\r\n const parts = p.split('.');\r\n let r = 'game';\r\n for (const part of parts) r += `[\"${part}\"]`;\r\n return r;\r\n });\r\n\r\n const parentParts = parent.split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) parentResolve += `[\"${p}\"]`;\r\n\r\n const code = [\r\n `local group = Instance.new(\"${groupClass}\")`,\r\n `group.Name = \"${groupName}\"`,\r\n `group.Parent = ${parentResolve}`,\r\n ...resolves.map((r) => `${r}.Parent = group`),\r\n groupClass === 'Model' ? `if group:IsA(\"Model\") then group:MoveTo(group:GetBoundingBox().Position) end` : '',\r\n `print(\"Grouped ${paths.length} instances into: \" .. group:GetFullName())`,\r\n ].filter(Boolean).join('\\n');\r\n\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to group' };\r\n }\r\n\r\n return { success: true, data: { groupPath: `${parent}.${groupName}`, count: paths.length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\ninterface PartSpec {\r\n name: string;\r\n className?: string;\r\n parent?: string;\r\n position?: { x: number; y: number; z: number };\r\n size?: { x: number; y: number; z: number };\r\n color?: string;\r\n material?: string;\r\n transparency?: number;\r\n anchored?: boolean;\r\n shape?: string;\r\n}\r\n\r\nexport const tool: Tool = {\r\n name: 'build_multiple',\r\n description:\r\n 'Create multiple parts/instances in one batch call. Send an array of specs and they all get created in a single Studio round-trip. Ideal for building trees, houses, vehicles, terrain — anything composed of multiple parts.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parts: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Part name' },\r\n className: { type: 'string', description: 'ClassName (default: Part)' },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n color: { type: 'string', description: 'Hex \"#RRGGBB\" or BrickColor name' },\r\n material: { type: 'string' },\r\n transparency: { type: 'number' },\r\n anchored: { type: 'boolean' },\r\n shape: { type: 'string', enum: ['Block', 'Ball', 'Cylinder', 'Wedge'] },\r\n },\r\n required: ['name'],\r\n },\r\n description: 'Array of part specifications',\r\n },\r\n groupName: {\r\n type: 'string',\r\n description: 'Optional: group all parts under a Model with this name',\r\n },\r\n groupParent: {\r\n type: 'string',\r\n description: 'Parent for the group Model (default: Workspace)',\r\n },\r\n },\r\n required: ['parts'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parts = params.parts as PartSpec[];\r\n const groupName = params.groupName as string | undefined;\r\n const groupParent = (params.groupParent as string) || 'Workspace';\r\n\r\n const code = generateBatchCode(parts, groupName, groupParent);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Batch build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n count: parts.length,\r\n group: groupName ?? null,\r\n output: payload.output,\r\n },\r\n };\r\n },\r\n};\r\n\r\nfunction generateBatchCode(parts: PartSpec[], groupName?: string, groupParent?: string): string {\r\n const lines: string[] = [];\r\n\r\n function resolveParent(path: string): string {\r\n const segs = path.split('.');\r\n let r = 'game';\r\n for (const s of segs) r += `[\"${s}\"]`;\r\n return r;\r\n }\r\n\r\n if (groupName) {\r\n const gp = resolveParent(groupParent || 'Workspace');\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = \"${groupName}\"`);\r\n lines.push(`_group.Parent = ${gp}`);\r\n }\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const varName = `_p${i}`;\r\n const cn = p.className || (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n\r\n lines.push(`local ${varName} = Instance.new(\"${cn}\")`);\r\n lines.push(`${varName}.Name = \"${p.name}\"`);\r\n\r\n if (p.position) {\r\n lines.push(`${varName}.Position = Vector3.new(${p.position.x ?? 0}, ${p.position.y ?? 0}, ${p.position.z ?? 0})`);\r\n }\r\n if (p.size) {\r\n lines.push(`${varName}.Size = Vector3.new(${p.size.x ?? 4}, ${p.size.y ?? 1}, ${p.size.z ?? 2})`);\r\n }\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${varName}.Color = Color3.fromHex(\"${p.color}\")`);\r\n } else {\r\n lines.push(`${varName}.BrickColor = BrickColor.new(\"${p.color}\")`);\r\n }\r\n }\r\n if (p.material) {\r\n lines.push(`${varName}.Material = Enum.Material.${p.material}`);\r\n }\r\n if (p.transparency !== undefined) {\r\n lines.push(`${varName}.Transparency = ${p.transparency}`);\r\n }\r\n if (p.anchored !== undefined) {\r\n lines.push(`${varName}.Anchored = ${p.anchored}`);\r\n } else {\r\n lines.push(`${varName}.Anchored = true`);\r\n }\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') {\r\n lines.push(`${varName}.Shape = Enum.PartType.${p.shape}`);\r\n }\r\n\r\n if (groupName) {\r\n lines.push(`${varName}.Parent = _group`);\r\n } else {\r\n const parent = p.parent || 'Workspace';\r\n lines.push(`${varName}.Parent = ${resolveParent(parent)}`);\r\n }\r\n }\r\n\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { recallFacts, getProjectSummaries } from '../../memory/store.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'recall_memory',\r\n description:\r\n 'Search your memory for previously learned facts about the current project. Use this to recall architecture decisions, patterns, known bugs, or user preferences.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'What to search for in memory (e.g., \"player data storage\", \"combat system architecture\")',\r\n },\r\n limit: {\r\n type: 'number',\r\n description: 'Max number of facts to return (default: 10)',\r\n default: 10,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const query = params.query as string;\r\n const limit = (params.limit as number) ?? 10;\r\n const projectId = 'current';\r\n\r\n const facts = recallFacts(projectId, query, limit);\r\n const summaries = getProjectSummaries(projectId, 5);\r\n\r\n return {\r\n success: true,\r\n data: {\r\n facts: facts.map((f) => ({ content: f.content, category: f.category })),\r\n recentSessions: summaries.map((s) => s.summary),\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { storeFact } from '../../memory/store.js';\r\nimport type { FactCategory } from '../../memory/types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'remember',\r\n description:\r\n 'Store a fact about the current project in persistent memory. Use this to remember architecture decisions, patterns, bugs found, or user preferences so you can recall them in future sessions.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n fact: {\r\n type: 'string',\r\n description: 'The fact to remember (e.g., \"PlayerData DataStore uses key format Player_{UserId}\")',\r\n },\r\n category: {\r\n type: 'string',\r\n description: 'Category of the fact',\r\n enum: ['architecture', 'pattern', 'preference', 'bug', 'api', 'general'],\r\n },\r\n },\r\n required: ['fact', 'category'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const fact = params.fact as string;\r\n const category = (params.category as FactCategory) ?? 'general';\r\n const now = Date.now();\r\n\r\n storeFact({\r\n projectId: 'current',\r\n content: fact,\r\n category,\r\n source: 'agent',\r\n relevance: 1.0,\r\n createdAt: now,\r\n accessedAt: now,\r\n });\r\n\r\n return { success: true, data: { stored: fact, category } };\r\n },\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Tool, ToolContext, ToolResult } from '../types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'upload_asset',\r\n description:\r\n 'Upload a local file (image, model, audio) to Roblox via the Open Cloud API. Requires an Open Cloud API key configured in dominus.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n filePath: {\r\n type: 'string',\r\n description: 'Local file path of the asset to upload',\r\n },\r\n assetType: {\r\n type: 'string',\r\n description: 'Type of asset',\r\n enum: ['Image', 'Audio', 'Model'],\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Display name for the asset on Roblox',\r\n },\r\n description: {\r\n type: 'string',\r\n description: 'Description of the asset',\r\n },\r\n },\r\n required: ['filePath', 'assetType', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n const apiKey = ctx.config.get<string>('openCloudApiKey');\r\n if (!apiKey) {\r\n return {\r\n success: false,\r\n error: 'Open Cloud API key not configured. Run: dominus config set openCloudApiKey <key>',\r\n };\r\n }\r\n\r\n const filePath = params.filePath as string;\r\n const assetType = params.assetType as string;\r\n const name = params.name as string;\r\n const description = (params.description as string) ?? '';\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return { success: false, error: `File not found: ${filePath}` };\r\n }\r\n\r\n const fileBuffer = fs.readFileSync(filePath);\r\n const fileName = path.basename(filePath);\r\n\r\n const typeMapping: Record<string, string> = {\r\n Image: 'Decal',\r\n Audio: 'Audio',\r\n Model: 'Model',\r\n };\r\n\r\n try {\r\n const formData = new FormData();\r\n const blob = new Blob([fileBuffer]);\r\n formData.append('fileContent', blob, fileName);\r\n formData.append(\r\n 'request',\r\n JSON.stringify({\r\n assetType: typeMapping[assetType] ?? assetType,\r\n displayName: name,\r\n description,\r\n creationContext: { creator: { userId: 'me' } },\r\n }),\r\n );\r\n\r\n const response = await fetch(\r\n 'https://apis.roblox.com/assets/v1/assets',\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': apiKey,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n return { success: false, error: `Upload failed (${response.status}): ${text}` };\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n success: true,\r\n data: {\r\n assetId: data.assetId ?? data.id,\r\n operationId: data.operationId ?? data.path,\r\n name,\r\n type: assetType,\r\n },\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Upload error: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n};\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { z } from 'zod';\r\nimport { DominusServer } from '../transport/ws-server.js';\r\nimport { CliMsg, type ExplorerNode, type ScriptContentPayload, type RunCodeResponsePayload, type SearchResultPayload, type OutputPayload, type SelectionPayload, type PropertyEntry, type TestResultPayload, type StudioTestResultPayload } from '../transport/protocol.js';\r\nimport { initMemoryStore, recallFacts, storeFact, getScriptIndex } from '../memory/store.js';\r\nimport { loadConfig } from '../config/config.js';\r\n\r\nlet wsServer: DominusServer;\r\n\r\nexport async function startMcpServer(): Promise<void> {\r\n const config = loadConfig();\r\n await initMemoryStore();\r\n\r\n wsServer = new DominusServer(config.port);\r\n await wsServer.start();\r\n\r\n const mcp = new McpServer({\r\n name: 'dominus',\r\n version: '0.1.0',\r\n });\r\n\r\n // --- Studio Tools ---\r\n\r\n mcp.tool(\r\n 'read_script',\r\n 'Read the source code of a script in Roblox Studio',\r\n { path: z.string().describe('Full instance path, e.g. \"ServerScriptService.GameManager\"') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'edit_script',\r\n 'Replace the entire source code of a script in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n source: z.string().describe('New complete source code'),\r\n },\r\n async ({ path, source }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest(CliMsg.SET_SCRIPT, { path, source });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_code',\r\n 'Execute Luau code in Roblox Studio and return output',\r\n { code: z.string().describe('Luau code to execute') },\r\n async ({ code }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_explorer',\r\n 'Get the DataModel explorer tree from Roblox Studio',\r\n {\r\n rootPath: z.string().optional().describe('Root path to start from. Omit for entire tree.'),\r\n maxDepth: z.number().optional().default(3).describe('Maximum tree depth'),\r\n },\r\n async ({ rootPath, maxDepth }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: rootPath ?? null,\r\n maxDepth,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_properties',\r\n 'Get all properties of an instance in Roblox Studio',\r\n { path: z.string().describe('Full instance path') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_properties',\r\n 'Set properties on an instance in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n properties: z.record(z.unknown()).describe('Key-value pairs of properties to set'),\r\n },\r\n async ({ path, properties }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest(CliMsg.SET_PROPERTIES, { path, properties });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'insert_instance',\r\n 'Create a new instance in the Roblox Studio DataModel',\r\n {\r\n className: z.string().describe('Class name (e.g. \"Part\", \"Script\")'),\r\n parentPath: z.string().describe('Parent instance path'),\r\n name: z.string().describe('Name for the new instance'),\r\n properties: z.record(z.unknown()).optional().describe('Optional properties to set'),\r\n },\r\n async ({ className, parentPath, name, properties }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest(CliMsg.INSERT_INSTANCE, {\r\n className, parentPath, name, properties: properties ?? {},\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'delete_instance',\r\n 'Delete an instance from the Roblox Studio DataModel',\r\n { path: z.string().describe('Full instance path to delete') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest(CliMsg.DELETE_INSTANCE, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_selection',\r\n 'Get the currently selected instances in Roblox Studio',\r\n {},\r\n async () => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'search_scripts',\r\n 'Search all scripts in Roblox Studio for a text pattern',\r\n {\r\n query: z.string().describe('Text to search for'),\r\n maxResults: z.number().optional().default(20).describe('Max results'),\r\n },\r\n async ({ query, maxResults }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, { query, maxResults });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_output',\r\n 'Get recent output log from Roblox Studio',\r\n {\r\n limit: z.number().optional().default(50).describe('Max entries'),\r\n level: z.enum(['info', 'warn', 'error']).optional().describe('Filter by level'),\r\n },\r\n async ({ limit, level }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit, level: level ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_class_info',\r\n 'Look up the schema of any Roblox class using ReflectionService. Returns all properties (with types), methods (with parameters), and events. ' +\r\n 'ALWAYS use this before creating or modifying GUI elements to know correct property names and types.',\r\n { className: z.string().describe('Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\"') },\r\n async ({ className }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<unknown>(CliMsg.GET_REFLECTION, { className });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'create_ui',\r\n 'Create an entire UI tree in one call. Pass a declarative JSON tree — ClassName, Name, properties, Children. ' +\r\n 'All types auto-coerced in Luau (UDim2, Color3, Font, enums). 10x faster than run_code. ' +\r\n 'UDim2: [xScale, xOffset, yScale, yOffset]. Color3: \"#hex\" or \"rgb(r,g,b)\". Font: \"GothamBold\". Enums: string names.',\r\n {\r\n parent: z.string().optional().describe('Parent: \"StarterGui\", \"PlayerGui\", or path. Default: StarterGui'),\r\n tree: z.record(z.unknown()).describe(\r\n 'Root UI node: {ClassName, Name, properties..., Children: [{...}, ...]}. ' +\r\n 'UDim2 as [xScale, xOffset, yScale, yOffset], Color3 as \"#hex\", Font as \"GothamBold\"',\r\n ),\r\n },\r\n async ({ parent, tree }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<{ success: boolean; path?: string; instanceCount?: number; error?: string }>(\r\n CliMsg.BUILD_UI, { parent: parent ?? 'StarterGui', tree },\r\n );\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_tests',\r\n 'Run tests by requiring ModuleScripts matching test naming conventions (*.test, *.spec, *Test, *Spec). Lightweight — does not enter Run/Play mode.',\r\n { testName: z.string().optional().describe('Specific test name, or omit to run all') },\r\n async ({ testName }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: testName ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_run_test',\r\n 'Start a Run mode test session using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'This actually enters Run mode in Studio. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for headless automated tests — no player, just server scripts.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_RUN_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_play_test',\r\n 'Start a solo Play mode test session using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'This enters Play mode with a player character. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for tests needing a player character and full client-server simulation.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await wsServer.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_PLAY_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Builder Tools ---\r\n\r\n mcp.tool(\r\n 'create_part',\r\n 'Create a Part with position, size, color, material — all in one call. Faster than insert_instance + set_properties.',\r\n {\r\n name: z.string().describe('Name for the part'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge']).optional().describe('Part shape'),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('World position'),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Size in studs'),\r\n color: z.string().optional().describe('Hex \"#00FF00\", BrickColor name, or \"rgb(0,255,0)\"'),\r\n material: z.string().optional().describe('Plastic, Wood, Grass, Neon, Metal, etc.'),\r\n transparency: z.number().optional().describe('0=opaque, 1=invisible'),\r\n anchored: z.boolean().optional().describe('Anchored (default: true)'),\r\n canCollide: z.boolean().optional().describe('Has collision'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const properties: Record<string, unknown> = {};\r\n if (params.position) properties.Position = { X: params.position.x, Y: params.position.y, Z: params.position.z };\r\n if (params.size) properties.Size = { X: params.size.x, Y: params.size.y, Z: params.size.z };\r\n if (params.color) {\r\n const c = params.color;\r\n if (c.startsWith('#')) properties.Color = c;\r\n else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n } else properties.BrickColor = c;\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = params.shape === 'Wedge' ? 'WedgePart' : params.shape === 'CornerWedge' ? 'CornerWedgePart' : 'Part';\r\n\r\n const res = await wsServer.sendRequest<{ success: boolean; path?: string; error?: string }>(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: params.parent ?? 'Workspace',\r\n name: params.name,\r\n properties,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'clone_instance',\r\n 'Clone an existing instance, optionally rename it, move it, or offset its position',\r\n {\r\n path: z.string().describe('Path of instance to clone'),\r\n newName: z.string().optional().describe('Name for the clone'),\r\n newParent: z.string().optional().describe('Parent path for the clone'),\r\n offset: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Position offset from original'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const parts = params.path.split('.');\r\n let resolve = 'game';\r\n for (const p of parts) resolve += `[\"${p}\"]`;\r\n\r\n const lines = [`local orig = ${resolve}`, `local clone = orig:Clone()`];\r\n if (params.newName) lines.push(`clone.Name = \"${params.newName}\"`);\r\n if (params.newParent) {\r\n const pp = params.newParent.split('.');\r\n let pr = 'game';\r\n for (const p of pp) pr += `[\"${p}\"]`;\r\n lines.push(`clone.Parent = ${pr}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n if (params.offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${params.offset.x}, ${params.offset.y}, ${params.offset.z})`);\r\n lines.push(`end`);\r\n }\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n\r\n const res = await wsServer.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'group_instances',\r\n 'Group multiple instances into a Model or Folder',\r\n {\r\n paths: z.array(z.string()).describe('Array of instance paths to group'),\r\n groupName: z.string().describe('Name for the group'),\r\n groupClass: z.enum(['Model', 'Folder']).optional().describe('Container class (default: Model)'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const gc = params.groupClass ?? 'Model';\r\n const parent = params.parent ?? 'Workspace';\r\n const parentParts = parent.split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) parentResolve += `[\"${p}\"]`;\r\n\r\n const resolves = params.paths.map((path) => {\r\n const parts = path.split('.');\r\n let r = 'game';\r\n for (const part of parts) r += `[\"${part}\"]`;\r\n return r;\r\n });\r\n\r\n const code = [\r\n `local group = Instance.new(\"${gc}\")`,\r\n `group.Name = \"${params.groupName}\"`,\r\n `group.Parent = ${parentResolve}`,\r\n ...resolves.map((r) => `${r}.Parent = group`),\r\n `print(\"Grouped ${params.paths.length} instances into: \" .. group:GetFullName())`,\r\n ].join('\\n');\r\n\r\n const res = await wsServer.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'build_multiple',\r\n 'Create many parts/instances in one batch. Send an array of specs — all created in a single round-trip. Ideal for building trees, houses, vehicles.',\r\n {\r\n parts: z.array(z.object({\r\n name: z.string(),\r\n className: z.string().optional(),\r\n parent: z.string().optional(),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n color: z.string().optional().describe('Hex \"#RRGGBB\" or BrickColor name'),\r\n material: z.string().optional(),\r\n transparency: z.number().optional(),\r\n anchored: z.boolean().optional(),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge']).optional(),\r\n })).describe('Array of part specifications'),\r\n groupName: z.string().optional().describe('Group all parts into a Model with this name'),\r\n groupParent: z.string().optional().describe('Parent for the group (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const parts = params.parts;\r\n const groupName = params.groupName;\r\n const groupParent = params.groupParent ?? 'Workspace';\r\n\r\n function resolveP(path: string): string {\r\n const segs = path.split('.');\r\n let r = 'game';\r\n for (const s of segs) r += `[\"${s}\"]`;\r\n return r;\r\n }\r\n\r\n const lines: string[] = [];\r\n if (groupName) {\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = \"${groupName}\"`);\r\n lines.push(`_group.Parent = ${resolveP(groupParent)}`);\r\n }\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const v = `_p${i}`;\r\n const cn = p.className ?? (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n lines.push(`local ${v} = Instance.new(\"${cn}\")`);\r\n lines.push(`${v}.Name = \"${p.name}\"`);\r\n if (p.position) lines.push(`${v}.Position = Vector3.new(${p.position.x}, ${p.position.y}, ${p.position.z})`);\r\n if (p.size) lines.push(`${v}.Size = Vector3.new(${p.size.x}, ${p.size.y}, ${p.size.z})`);\r\n if (p.color) {\r\n if (p.color.startsWith('#')) lines.push(`${v}.Color = Color3.fromHex(\"${p.color}\")`);\r\n else lines.push(`${v}.BrickColor = BrickColor.new(\"${p.color}\")`);\r\n }\r\n if (p.material) lines.push(`${v}.Material = Enum.Material.${p.material}`);\r\n if (p.transparency !== undefined) lines.push(`${v}.Transparency = ${p.transparency}`);\r\n lines.push(`${v}.Anchored = ${p.anchored ?? true}`);\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') lines.push(`${v}.Shape = Enum.PartType.${p.shape}`);\r\n lines.push(`${v}.Parent = ${groupName ? '_group' : resolveP(p.parent ?? 'Workspace')}`);\r\n }\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n\r\n const res = await wsServer.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Memory Tools ---\r\n\r\n mcp.tool(\r\n 'recall_memory',\r\n 'Search persistent memory for facts about the current Roblox project',\r\n { query: z.string().describe('What to search for') },\r\n async ({ query }) => {\r\n const facts = recallFacts('current', query, 15);\r\n const scripts = getScriptIndex('current');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({ facts: facts.map(f => f.content), scriptIndex: scripts }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'remember',\r\n 'Store a fact about the project in persistent memory for future sessions',\r\n {\r\n fact: z.string().describe('The fact to remember'),\r\n category: z.enum(['architecture', 'pattern', 'preference', 'bug', 'api', 'general']).describe('Category'),\r\n },\r\n async ({ fact, category }) => {\r\n const now = Date.now();\r\n storeFact({ projectId: 'current', content: fact, category, source: 'mcp', relevance: 1.0, createdAt: now, accessedAt: now });\r\n return { content: [{ type: 'text' as const, text: `Remembered: ${fact}` }] };\r\n },\r\n );\r\n\r\n // --- Resources ---\r\n\r\n mcp.resource(\r\n 'studio://status',\r\n 'studio://status',\r\n async () => {\r\n const info = wsServer.getConnectionInfo();\r\n return {\r\n contents: [{\r\n uri: 'studio://status',\r\n text: JSON.stringify({\r\n connected: wsServer.isConnected(),\r\n placeName: info?.placeName,\r\n placeId: info?.placeId,\r\n studioVersion: info?.studioVersion,\r\n port: wsServer.getPort(),\r\n }, null, 2),\r\n mimeType: 'application/json',\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // Start the MCP server on stdio\r\n const transport = new StdioServerTransport();\r\n await mcp.connect(transport);\r\n}\r\n\r\nfunction assertConnected(): void {\r\n if (!wsServer.isConnected()) {\r\n throw new Error(\r\n 'Roblox Studio is not connected. Open Studio and click the Dominus plugin Connect button.',\r\n );\r\n }\r\n}\r\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nconst CROWN_ART = ` ◆ ◆ ◆\n ╔█╗ ╔█╗ ╔█╗\n ║█║ ║█║ ║█║\n ╚█╚═════╝█╚═════╝█╝\n ╚═══════════════╝`;\n\nfunction getGreeting(name: string): string {\n const hour = new Date().getHours();\n if (hour >= 5 && hour < 12) return `Good morning ${name}!`;\n if (hour >= 12 && hour < 17) return `Good afternoon ${name}!`;\n if (hour >= 17 && hour < 21) return `Good evening ${name}!`;\n return `Burning the midnight oil, ${name}!`;\n}\n\ninterface WelcomeProps {\n userName: string;\n version: string;\n model: string;\n provider: string;\n port: number;\n hasApiKey: boolean;\n connected: boolean;\n cwd: string;\n}\n\nexport const Welcome: React.FC<WelcomeProps> = React.memo(({\n userName,\n version,\n model,\n provider,\n port,\n hasApiKey,\n connected,\n cwd,\n}) => {\n const greeting = getGreeting(userName);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"magenta\">\n Dominus v{version}\n </Text>\n <Text dimColor>AI-Powered Roblox Studio Agent</Text>\n </Box>\n\n {/* Main content: two columns */}\n <Box>\n {/* Left column: greeting + mascot */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n <Text bold color=\"cyan\">\n {greeting}\n </Text>\n <Text> </Text>\n\n {CROWN_ART.split('\\n').map((line, i) => (\n <Text key={i} color=\"yellow\">\n {line}\n </Text>\n ))}\n\n <Text> </Text>\n <Text dimColor>\n {provider} · {model || 'no model set'}\n </Text>\n <Text dimColor>{cwd}</Text>\n </Box>\n\n {/* Right column: tips or setup */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n {hasApiKey ? (\n <>\n <Text bold color=\"yellow\">\n Tips for getting started\n </Text>\n <Text>\n Just type a message to chat with the AI agent\n </Text>\n <Text>\n Use <Text color=\"cyan\">/help</Text> to see all commands\n </Text>\n <Text>\n Use <Text color=\"cyan\">/run {'<code>'}</Text> to execute Luau in Studio\n </Text>\n <Text> </Text>\n <Text bold color=\"yellow\">\n Studio connection\n </Text>\n {connected ? (\n <Text color=\"green\">● Connected to Roblox Studio</Text>\n ) : (\n <>\n <Text color=\"red\">○ Waiting for Studio plugin...</Text>\n <Text dimColor>WebSocket server on port {port}</Text>\n <Text dimColor>\n Run <Text color=\"cyan\">dominus install-plugin</Text> if needed\n </Text>\n </>\n )}\n </>\n ) : (\n <>\n <Text bold color=\"yellow\">\n Setup — pick any provider\n </Text>\n <Text> </Text>\n <Text>\n <Text color=\"green\" bold>OpenAI </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Anthropic </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">ANTHROPIC_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Gemini </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">GEMINI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Grok (xAI) </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">XAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>OpenRouter </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENROUTER_API_KEY</Text>\n </Text>\n <Text> </Text>\n <Text dimColor>Or configure manually:</Text>\n <Text>\n <Text color=\"cyan\">dominus config set provider openai</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">dominus config set apiKey sk-...</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { PROVIDERS, type AIProviderType } from '../../config/config.js';\r\n\r\ninterface SetupProps {\r\n onComplete: (provider: AIProviderType, apiKey: string) => void;\r\n}\r\n\r\nconst PROVIDER_OPTIONS: { key: AIProviderType; label: string; hint: string }[] = [\r\n { key: 'openai', label: 'OpenAI', hint: 'GPT-5.3, GPT-5.2, o3-mini' },\r\n { key: 'anthropic', label: 'Anthropic', hint: 'Claude Opus 4-6, Sonnet 4-6' },\r\n { key: 'gemini', label: 'Google Gemini', hint: 'Gemini 3.1 Pro, 2.0 Flash' },\r\n { key: 'xai', label: 'xAI (Grok)', hint: 'Grok 4.2, Grok 3' },\r\n { key: 'openrouter', label: 'OpenRouter', hint: '300+ models, one key' },\r\n];\r\n\r\nexport const Setup: React.FC<SetupProps> = ({ onComplete }) => {\r\n const [step, setStep] = useState<'provider' | 'key'>('provider');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [selectedProvider, setSelectedProvider] = useState<AIProviderType>('openai');\r\n const [apiKey, setApiKey] = useState('');\r\n\r\n useInput((input, key) => {\r\n if (step !== 'provider') return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(PROVIDER_OPTIONS.length - 1, prev + 1));\r\n } else if (key.return) {\r\n setSelectedProvider(PROVIDER_OPTIONS[selectedIdx].key);\r\n setStep('key');\r\n }\r\n });\r\n\r\n const handleKeySubmit = (value: string) => {\r\n const trimmed = value.trim();\r\n if (trimmed) {\r\n onComplete(selectedProvider, trimmed);\r\n }\r\n };\r\n\r\n const providerInfo = PROVIDERS[selectedProvider];\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\r\n <Text bold color=\"magenta\">\r\n ◆ Dominus — First Time Setup\r\n </Text>\r\n <Text> </Text>\r\n\r\n {step === 'provider' && (\r\n <>\r\n <Text bold>Select your AI provider:</Text>\r\n <Text> </Text>\r\n {PROVIDER_OPTIONS.map((opt, i) => (\r\n <Box key={opt.key}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? ' ❯ ' : ' '}\r\n {opt.label}\r\n </Text>\r\n <Text dimColor> {opt.hint}</Text>\r\n </Box>\r\n ))}\r\n <Text> </Text>\r\n <Text dimColor>↑/↓ to select, Enter to confirm</Text>\r\n </>\r\n )}\r\n\r\n {step === 'key' && (\r\n <>\r\n <Text>\r\n Provider: <Text color=\"cyan\" bold>{PROVIDERS[selectedProvider].name}</Text>\r\n </Text>\r\n <Text>\r\n Default model: <Text color=\"green\">{providerInfo.defaultModel}</Text>\r\n </Text>\r\n <Text> </Text>\r\n <Text bold>Enter your API key:</Text>\r\n <Text dimColor>\r\n Get one from your provider's dashboard\r\n </Text>\r\n <Text> </Text>\r\n <Box>\r\n <Text color=\"cyan\">❯ </Text>\r\n <TextInput\r\n value={apiKey}\r\n onChange={setApiKey}\r\n onSubmit={handleKeySubmit}\r\n mask=\"*\"\r\n placeholder=\"sk-...\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\ninterface StatusBarProps {\r\n connected: boolean;\r\n placeName?: string;\r\n model: string;\r\n sessionTokens?: number;\r\n}\r\n\r\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({\r\n connected,\r\n placeName,\r\n model,\r\n sessionTokens,\r\n}) => {\r\n const statusColor = connected ? 'green' : 'red';\r\n const statusText = connected ? `● Connected${placeName ? ` — ${placeName}` : ''}` : '○ Disconnected';\r\n const shortModel = model.split('/').pop() ?? model;\r\n\r\n return (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n width=\"100%\"\r\n >\r\n <Box gap={2}>\r\n <Text bold color=\"magenta\">\r\n DOMINUS\r\n </Text>\r\n <Text color={statusColor}>{statusText}</Text>\r\n </Box>\r\n <Box gap={2}>\r\n {sessionTokens !== undefined && (\r\n <Text dimColor>~{Math.round(sessionTokens / 1000)}k tokens</Text>\r\n )}\r\n <Text color=\"cyan\">{shortModel}</Text>\r\n <Text dimColor>Ctrl+C to quit</Text>\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface OutputEntry {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\ninterface OutputPaneProps {\r\n entries: OutputEntry[];\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n info: 'white',\r\n warn: 'yellow',\r\n error: 'red',\r\n};\r\n\r\nconst LEVEL_ICONS: Record<string, string> = {\r\n info: '│',\r\n warn: '⚠',\r\n error: '✖',\r\n};\r\n\r\nexport const OutputPane: React.FC<OutputPaneProps> = React.memo(({ entries, maxLines = 10 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\r\n <Text bold dimColor>\r\n Output\r\n </Text>\r\n {visible.length === 0 ? (\r\n <Text dimColor italic>\r\n Waiting for Studio output...\r\n </Text>\r\n ) : (\r\n visible.map((entry, i) => (\r\n <Text key={i} color={LEVEL_COLORS[entry.level] ?? 'white'}>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>{' '}\r\n <Text>{LEVEL_ICONS[entry.level] ?? '│'}</Text> {entry.message}\r\n </Text>\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface ChatEntry {\r\n role: 'user' | 'assistant' | 'tool' | 'error' | 'system';\r\n content: string;\r\n toolName?: string;\r\n timestamp: number;\r\n}\r\n\r\ninterface ChatPaneProps {\r\n entries: ChatEntry[];\r\n streaming?: string;\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nexport const ChatPane: React.FC<ChatPaneProps> = React.memo(({ entries, streaming, maxLines = 20 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\r\n {visible.map((entry, i) => (\r\n <Box key={i} flexDirection=\"column\" marginBottom={entry.role === 'user' ? 1 : 0}>\r\n {entry.role === 'user' && (\r\n <Box>\r\n <Text color=\"cyan\" bold>\r\n You{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'assistant' && (\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'tool' && (\r\n <Text color=\"yellow\">\r\n ⚡ {entry.toolName ?? 'tool'}: {entry.content}\r\n </Text>\r\n )}\r\n {entry.role === 'system' && (\r\n <Text color=\"yellow\" bold>Dominus </Text>\r\n )}\r\n {entry.role === 'error' && (\r\n <Text color=\"red\">✖ Error: {entry.content}</Text>\r\n )}\r\n {(entry.role === 'user' || entry.role === 'assistant' || entry.role === 'system') && (\r\n <Text wrap=\"wrap\">{entry.content}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n\r\n {streaming && (\r\n <Box flexDirection=\"column\">\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>(typing...)</Text>\r\n </Box>\r\n <Text wrap=\"wrap\">{streaming}</Text>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import { execSync } from 'node:child_process';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { readFileSync, unlinkSync, existsSync } from 'node:fs';\r\nimport { randomBytes } from 'node:crypto';\r\n\r\nexport interface ClipboardImage {\r\n base64: string;\r\n mimeType: 'image/png';\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst PS_SCRIPT = `\r\nAdd-Type -AssemblyName System.Windows.Forms\r\n$img = [System.Windows.Forms.Clipboard]::GetImage()\r\nif ($img -eq $null) { exit 1 }\r\n$path = $args[0]\r\n$img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)\r\n$img.Dispose()\r\nWrite-Host \"$($img.Width)x$($img.Height)\"\r\n`;\r\n\r\nexport function getClipboardImage(): ClipboardImage | null {\r\n if (process.platform !== 'win32') {\r\n return getClipboardImageUnix();\r\n }\r\n\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n execSync(\r\n `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $img = [System.Windows.Forms.Clipboard]::GetImage(); if ($img -eq $null) { exit 1 }; $img.Save('${tmpPath.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png); $img.Dispose()\"`,\r\n { stdio: 'pipe', timeout: 5000 },\r\n );\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n\r\nfunction getClipboardImageUnix(): ClipboardImage | null {\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n if (process.platform === 'darwin') {\r\n execSync(`osascript -e 'set png to (the clipboard as «class PNGf»)' -e 'set f to open for access POSIX file \"${tmpPath}\" with write permission' -e 'write png to f' -e 'close access f'`, { stdio: 'pipe', timeout: 5000 });\r\n } else {\r\n execSync(`xclip -selection clipboard -t image/png -o > \"${tmpPath}\"`, { stdio: 'pipe', timeout: 5000 });\r\n }\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n","import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { getClipboardImage } from '../../utils/clipboard.js';\r\n\r\ninterface CommandSuggestion {\r\n command: string;\r\n description: string;\r\n}\r\n\r\nconst COMMANDS: CommandSuggestion[] = [\r\n { command: '/help', description: 'Show help and available commands' },\r\n { command: '/model', description: 'Switch the AI model' },\r\n { command: '/models', description: 'List all available models from your provider' },\r\n { command: '/status', description: 'Show connection and config status' },\r\n { command: '/clear', description: 'Clear chat history' },\r\n { command: '/paste', description: 'Paste image from clipboard (or Alt+V)' },\r\n];\r\n\r\nexport interface ImageAttachment {\r\n base64: string;\r\n mimeType: 'image/png';\r\n}\r\n\r\ninterface InputBarProps {\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n isProcessing: boolean;\r\n placeholder?: string;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nconst SuggestionBox: React.FC<{ suggestions: CommandSuggestion[]; selectedIdx: number }> = React.memo(\r\n ({ suggestions, selectedIdx }) => (\r\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\r\n {suggestions.map((s, i) => (\r\n <Box key={s.command}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? '❯ ' : ' '}\r\n </Text>\r\n <Text color={i === selectedIdx ? 'cyan' : 'white'} bold={i === selectedIdx}>\r\n {s.command.padEnd(16)}\r\n </Text>\r\n <Text dimColor>{s.description}</Text>\r\n </Box>\r\n ))}\r\n <Text dimColor> ↑↓ navigate · Tab complete · Enter select</Text>\r\n </Box>\r\n ),\r\n);\r\n\r\nexport const InputBar: React.FC<InputBarProps> = React.memo(({\r\n onSubmit,\r\n onImagePaste,\r\n isProcessing,\r\n placeholder = 'Ask Dominus anything, or /help for commands...',\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n const [value, setValue] = useState('');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [pasteStatus, setPasteStatus] = useState<'none' | 'checking' | 'no_image'>('none');\r\n const valueRef = useRef(value);\r\n valueRef.current = value;\r\n\r\n const suggestions = useMemo(() => {\r\n if (!value.startsWith('/') || value.includes(' ')) return [];\r\n const query = value.toLowerCase();\r\n return COMMANDS.filter((c) => c.command.startsWith(query));\r\n }, [value]);\r\n\r\n const showSuggestions = suggestions.length > 0 && value.length > 0;\r\n\r\n const tryPasteImage = useCallback(() => {\r\n if (!onImagePaste) return false;\r\n setPasteStatus('checking');\r\n try {\r\n const img = getClipboardImage();\r\n if (img) {\r\n onImagePaste(img);\r\n setPasteStatus('none');\r\n return true;\r\n }\r\n } catch { /* ignore */ }\r\n setPasteStatus('no_image');\r\n setTimeout(() => setPasteStatus('none'), 2000);\r\n return false;\r\n }, [onImagePaste]);\r\n\r\n // Listen for raw stdin to catch Alt+V and Ctrl+V\r\n useEffect(() => {\r\n const handler = (data: Buffer) => {\r\n if (isProcessing) return;\r\n const str = data.toString();\r\n // Alt+V: ESC + v (0x1B 0x76)\r\n if (str === '\\x1bv' || str === '\\x1bV') {\r\n tryPasteImage();\r\n return;\r\n }\r\n // Ctrl+V: 0x16 (works if terminal doesn't intercept it)\r\n if (str === '\\x16') {\r\n tryPasteImage();\r\n return;\r\n }\r\n };\r\n process.stdin.on('data', handler);\r\n return () => { process.stdin.off('data', handler); };\r\n }, [isProcessing, tryPasteImage]);\r\n\r\n useInput((_input, key) => {\r\n if (isProcessing) return;\r\n\r\n if (!showSuggestions) return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(suggestions.length - 1, prev + 1));\r\n } else if (key.tab) {\r\n const selected = suggestions[selectedIdx];\r\n if (selected) {\r\n setValue(selected.command + ' ');\r\n setSelectedIdx(0);\r\n }\r\n }\r\n });\r\n\r\n const handleChange = useCallback((v: string) => {\r\n setValue(v);\r\n setSelectedIdx(0);\r\n }, []);\r\n\r\n const handleSubmit = useCallback((text: string) => {\r\n if (isProcessing) return;\r\n\r\n // /paste command\r\n if (text.trim().toLowerCase() === '/paste') {\r\n tryPasteImage();\r\n setValue('');\r\n return;\r\n }\r\n\r\n const currentValue = valueRef.current;\r\n const currentSuggestions = COMMANDS.filter(\r\n (c) => currentValue.startsWith('/') && !currentValue.includes(' ') && c.command.startsWith(currentValue.toLowerCase()),\r\n );\r\n const hasSuggestions = currentSuggestions.length > 0 && currentValue.length > 0;\r\n\r\n if (hasSuggestions) {\r\n const cmd = currentSuggestions[0]?.command;\r\n if (cmd && currentValue !== cmd && !currentValue.includes(' ')) {\r\n const noArgCmds = ['/clear', '/help', '/status', '/models', '/paste'];\r\n setValue(cmd + (noArgCmds.includes(cmd) ? '' : ' '));\r\n setSelectedIdx(0);\r\n return;\r\n }\r\n }\r\n\r\n if (text.trim()) {\r\n onSubmit(text.trim());\r\n setValue('');\r\n setSelectedIdx(0);\r\n }\r\n }, [isProcessing, onSubmit, tryPasteImage]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {showSuggestions && (\r\n <SuggestionBox suggestions={suggestions} selectedIdx={selectedIdx} />\r\n )}\r\n\r\n {imageAttached && (\r\n <Box paddingX={1} gap={1}>\r\n <Text color=\"green\" bold>[image 1]</Text>\r\n <Text dimColor>pasted — send a message to use it</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'checking' && (\r\n <Box paddingX={1}>\r\n <Text color=\"yellow\">Checking clipboard...</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'no_image' && (\r\n <Box paddingX={1}>\r\n <Text color=\"red\">No image found in clipboard. Copy an image first (screenshot, snipping tool, etc.)</Text>\r\n </Box>\r\n )}\r\n\r\n <Box borderStyle=\"single\" borderColor={isProcessing ? 'yellow' : imageAttached ? 'green' : 'cyan'} paddingX={1}>\r\n <Text color={isProcessing ? 'yellow' : 'cyan'} bold>\r\n {isProcessing ? '⟳ ' : imageAttached ? '📎 ' : '❯ '}\r\n </Text>\r\n {isProcessing ? (\r\n <Text dimColor>Processing...</Text>\r\n ) : (\r\n <TextInput\r\n value={value}\r\n onChange={handleChange}\r\n onSubmit={handleSubmit}\r\n placeholder={imageAttached ? 'Describe what you want (image attached)...' : placeholder}\r\n />\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nconst CLASS_ICONS: Record<string, string> = {\r\n Workspace: '🌍',\r\n ServerScriptService: '⚙️',\r\n ReplicatedStorage: '📦',\r\n ReplicatedFirst: '🚀',\r\n StarterGui: '🖥️',\r\n StarterPack: '🎒',\r\n StarterPlayer: '🧑',\r\n Players: '👥',\r\n Lighting: '💡',\r\n SoundService: '🔊',\r\n Script: '📜',\r\n LocalScript: '📱',\r\n ModuleScript: '📘',\r\n Part: '🧱',\r\n Model: '📐',\r\n Folder: '📁',\r\n RemoteEvent: '📡',\r\n RemoteFunction: '📡',\r\n BindableEvent: '🔗',\r\n};\r\n\r\nfunction getIcon(className: string): string {\r\n return CLASS_ICONS[className] ?? '◇';\r\n}\r\n\r\ninterface ExplorerPaneProps {\r\n tree: ExplorerNode[];\r\n selectedPath?: string;\r\n maxDepth?: number;\r\n}\r\n\r\nconst TreeNode: React.FC<{\r\n node: ExplorerNode;\r\n depth: number;\r\n maxDepth: number;\r\n selectedPath?: string;\r\n}> = ({ node, depth, maxDepth, selectedPath }) => {\r\n const indent = ' '.repeat(depth);\r\n const isSelected = node.path === selectedPath;\r\n const hasChildren = node.children && node.children.length > 0;\r\n const icon = getIcon(node.className);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text dimColor>{indent}</Text>\r\n <Text>{hasChildren ? '▾ ' : ' '}</Text>\r\n <Text>{icon} </Text>\r\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\r\n {node.name}\r\n </Text>\r\n <Text dimColor> ({node.className})</Text>\r\n </Text>\r\n {hasChildren &&\r\n depth < maxDepth &&\r\n node.children!.map((child, i) => (\r\n <TreeNode\r\n key={`${child.path}-${i}`}\r\n node={child}\r\n depth={depth + 1}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))}\r\n </Box>\r\n );\r\n};\r\n\r\nexport const ExplorerPane: React.FC<ExplorerPaneProps> = React.memo(({\r\n tree,\r\n selectedPath,\r\n maxDepth = 4,\r\n}) => {\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n width={36}\r\n minWidth={30}\r\n >\r\n <Text bold dimColor>\r\n Explorer\r\n </Text>\r\n {tree.length === 0 ? (\r\n <Text dimColor italic>\r\n Connect Studio plugin...\r\n </Text>\r\n ) : (\r\n tree.map((node, i) => (\r\n <TreeNode\r\n key={`${node.path}-${i}`}\r\n node={node}\r\n depth={0}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport Spinner from 'ink-spinner';\r\nimport type { ToolResult } from '../../tools/types.js';\r\n\r\nexport interface ToolCallEntry {\r\n name: string;\r\n args: Record<string, unknown>;\r\n result?: ToolResult;\r\n status: 'running' | 'done' | 'error';\r\n}\r\n\r\ninterface ToolCallViewProps {\r\n calls: ToolCallEntry[];\r\n}\r\n\r\nfunction summarizeArgs(args: Record<string, unknown>): string {\r\n const parts: string[] = [];\r\n for (const [key, value] of Object.entries(args)) {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n parts.push(`${key}=${str.length > 40 ? str.slice(0, 40) + '...' : str}`);\r\n }\r\n return parts.join(', ');\r\n}\r\n\r\nexport const ToolCallView: React.FC<ToolCallViewProps> = React.memo(({ calls }) => {\r\n if (calls.length === 0) return null;\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n {calls.map((call, i) => (\r\n <Box key={i} gap={1}>\r\n {call.status === 'running' && (\r\n <Text color=\"yellow\">\r\n <Spinner type=\"dots\" />\r\n </Text>\r\n )}\r\n {call.status === 'done' && <Text color=\"green\">✔</Text>}\r\n {call.status === 'error' && <Text color=\"red\">✖</Text>}\r\n <Text color=\"yellow\" bold>\r\n {call.name}\r\n </Text>\r\n <Text dimColor>({summarizeArgs(call.args)})</Text>\r\n {call.result && !call.result.success && (\r\n <Text color=\"red\"> — {call.result.error}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box } from 'ink';\r\nimport { StatusBar } from './StatusBar.js';\r\nimport { OutputPane, type OutputEntry } from './OutputPane.js';\r\nimport { ChatPane, type ChatEntry } from './ChatPane.js';\r\nimport { InputBar, type ImageAttachment } from './InputBar.js';\r\nimport { ExplorerPane } from './Explorer.js';\r\nimport { ToolCallView, type ToolCallEntry } from './ToolCallView.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\ninterface LayoutProps {\r\n connected: boolean;\r\n placeName?: string;\r\n model: string;\r\n chatEntries: ChatEntry[];\r\n outputEntries: OutputEntry[];\r\n explorerTree: ExplorerNode[];\r\n toolCalls: ToolCallEntry[];\r\n streaming?: string;\r\n isProcessing: boolean;\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nexport const Layout: React.FC<LayoutProps> = React.memo(({\r\n connected,\r\n placeName,\r\n model,\r\n chatEntries,\r\n outputEntries,\r\n explorerTree,\r\n toolCalls,\r\n streaming,\r\n isProcessing,\r\n onSubmit,\r\n onImagePaste,\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n return (\r\n <Box flexDirection=\"column\" width=\"100%\">\r\n <StatusBar connected={connected} placeName={placeName} model={model} />\r\n\r\n <Box flexGrow={1}>\r\n <ExplorerPane tree={explorerTree} />\r\n\r\n <Box flexDirection=\"column\" flexGrow={1}>\r\n <ChatPane entries={chatEntries} streaming={streaming} />\r\n {toolCalls.length > 0 && <ToolCallView calls={toolCalls} />}\r\n </Box>\r\n </Box>\r\n\r\n <OutputPane entries={outputEntries} maxLines={6} />\r\n <InputBar\r\n onSubmit={onSubmit}\r\n onImagePaste={onImagePaste}\r\n isProcessing={isProcessing}\r\n imageAttached={imageAttached}\r\n onClearImage={onClearImage}\r\n />\r\n </Box>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport type { ExplorerNode, OutputPayload, StudioConnectedPayload } from '../../transport/protocol.js';\nimport { StudioMsg } from '../../transport/protocol.js';\nimport type { OutputEntry } from '../components/OutputPane.js';\n\ninterface StudioState {\n connected: boolean;\n placeName?: string;\n placeId?: number;\n explorerTree: ExplorerNode[];\n outputLog: OutputEntry[];\n}\n\nexport function useStudio(server: StudioBridge) {\n const connInfo = server.getConnectionInfo();\n const [state, setState] = useState<StudioState>({\n connected: server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n explorerTree: [],\n outputLog: [],\n });\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n // Sync initial state in case connection happened before mount\n if (server.isConnected() && !stateRef.current.connected) {\n const info = server.getConnectionInfo();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName,\n placeId: info?.placeId,\n }));\n }\n\n const onConnected = (payload: StudioConnectedPayload) => {\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: payload.placeName ?? prev.placeName,\n placeId: payload.placeId ?? prev.placeId,\n }));\n };\n\n const onDisconnected = () => {\n setState((prev) => ({\n ...prev,\n connected: false,\n placeName: undefined,\n placeId: undefined,\n }));\n };\n\n const onExplorer = (payload: { tree: ExplorerNode[] }) => {\n setState((prev) => ({ ...prev, explorerTree: payload.tree ?? [] }));\n };\n\n const onOutput = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: payload.level,\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n const onError = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: 'error',\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n server.on('studio:connected', onConnected);\n server.on('studio:disconnected', onDisconnected);\n server.on(StudioMsg.EXPLORER, onExplorer);\n server.on(StudioMsg.OUTPUT, onOutput);\n server.on(StudioMsg.ERROR, onError);\n\n return () => {\n server.off('studio:connected', onConnected);\n server.off('studio:disconnected', onDisconnected);\n server.off(StudioMsg.EXPLORER, onExplorer);\n server.off(StudioMsg.OUTPUT, onOutput);\n server.off(StudioMsg.ERROR, onError);\n };\n }, [server]);\n\n const clearOutput = useCallback(() => {\n setState((prev) => ({ ...prev, outputLog: [] }));\n }, []);\n\n return { ...state, clearOutput };\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Box } from 'ink';\nimport { Welcome } from './ui/components/Welcome.js';\nimport { Setup } from './ui/components/Setup.js';\nimport { Layout } from './ui/components/Layout.js';\nimport { InputBar, type ImageAttachment } from './ui/components/InputBar.js';\nimport { useStudio } from './ui/hooks/useStudio.js';\nimport type { StudioBridge } from './transport/ws-server.js';\nimport type { AgentLoop } from './agent/loop.js';\nimport type { ChatEntry } from './ui/components/ChatPane.js';\nimport type { ToolCallEntry } from './ui/components/ToolCallView.js';\nimport { loadConfig, setConfigValue, PROVIDERS, resolveProviderSettings, type AIProviderType } from './config/config.js';\n\ninterface AppProps {\n server: StudioBridge;\n agent: AgentLoop | null;\n version: string;\n}\n\nexport const App: React.FC<AppProps> = ({ server, agent: initialAgent, version }) => {\n const [showWelcome, setShowWelcome] = useState(true);\n const [chatEntries, setChatEntries] = useState<ChatEntry[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCallEntry[]>([]);\n const [streaming, setStreaming] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [agent, setAgent] = useState(initialAgent);\n\n const studio = useStudio(server);\n const config = loadConfig();\n const hasApiKey = !!config.apiKey;\n const [needsSetup, setNeedsSetup] = useState(!hasApiKey);\n const [pendingImage, setPendingImage] = useState<ImageAttachment | null>(null);\n const pendingImageRef = useRef<ImageAttachment | null>(null);\n\n const handleImagePaste = useCallback((image: ImageAttachment) => {\n setPendingImage(image);\n pendingImageRef.current = image;\n }, []);\n\n const handleClearImage = useCallback(() => {\n setPendingImage(null);\n pendingImageRef.current = null;\n }, []);\n\n const handleSetupComplete = useCallback((provider: AIProviderType, apiKey: string) => {\n setConfigValue('provider', provider);\n setConfigValue('apiKey', apiKey);\n const providerInfo = PROVIDERS[provider];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n setNeedsSetup(false);\n }, []);\n\n const addSystemMessage = useCallback((content: string) => {\n setChatEntries((prev) => [\n ...prev,\n { role: 'system' as const, content, timestamp: Date.now() },\n ]);\n }, []);\n\n const handleCommand = useCallback(\n (text: string): boolean => {\n const input = text.startsWith('/') ? text.slice(1) : text;\n const [cmd, ...args] = input.split(' ');\n const arg = args.join(' ');\n const lowerCmd = cmd.toLowerCase();\n\n const currentModel = agent?.getModel() ?? resolveProviderSettings(config).model;\n const providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n const keyStatus = config.apiKey\n ? `${config.apiKey.slice(0, 6)}...${config.apiKey.slice(-4)}`\n : 'NOT SET';\n\n switch (lowerCmd) {\n case 'help':\n case 'h':\n case '?':\n addSystemMessage([\n '── Your Config ─────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n '',\n '── Commands ────────────────────────────────',\n ' /help Show this help',\n ' /model <name> Switch AI model',\n ' /models List available models',\n ' /status Connection status',\n ' /clear Clear chat history',\n '',\n '── Setup (run in your terminal) ────────────',\n ' dominus config set provider <name>',\n ' Providers: openai, anthropic, gemini, xai, openrouter',\n ' dominus config set apiKey <key>',\n ' dominus config list',\n ' dominus install-plugin',\n ' dominus mcp-install',\n '',\n 'Or just type a message to chat with Dominus!',\n ].join('\\n'));\n return true;\n\n case 'clear':\n agent?.clearHistory();\n setChatEntries([]);\n setToolCalls([]);\n return true;\n\n case 'model':\n if (arg && agent) {\n agent.setModel(arg);\n addSystemMessage(`Model switched to: ${arg}`);\n } else {\n addSystemMessage('Usage: /model <model-name>');\n }\n return true;\n\n case 'models': {\n if (!agent) {\n addSystemMessage('No API key configured — cannot fetch models.');\n return true;\n }\n addSystemMessage(`Fetching models from ${providerName}...`);\n agent.listModels().then((models) => {\n if (models.length === 0) {\n addSystemMessage('Could not fetch models. Check your API key.');\n return;\n }\n const lines = models.slice(0, 40).map((m) => ` ${m.id}`);\n addSystemMessage([\n `── ${providerName} Models (${models.length} total) ──`,\n ...lines,\n models.length > 40 ? ` ... and ${models.length - 40} more` : '',\n '',\n ` Current: ${currentModel}`,\n ' Switch with: /model <name>',\n ].join('\\n'));\n });\n return true;\n }\n\n case 'status':\n addSystemMessage([\n '── Status ──────────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Port: ${server.getPort()}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n ].join('\\n'));\n return true;\n\n default:\n return false;\n }\n },\n [agent, studio, server, config, addSystemMessage],\n );\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (isProcessing) return;\n\n // Check for commands first (with or without /)\n // /paste is handled directly by InputBar, skip it here\n if (text.trim().toLowerCase() === '/paste' || text.trim().toLowerCase() === 'paste') return;\n\n const isCommand = text.startsWith('/') || ['help', 'h', '?', 'clear', 'model', 'models', 'status'].includes(text.split(' ')[0].toLowerCase());\n if (isCommand) {\n setShowWelcome(false);\n handleCommand(text);\n return;\n }\n\n // Dismiss welcome for regular messages\n setShowWelcome(false);\n\n if (!agent) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: text, timestamp: Date.now() },\n {\n role: 'error',\n content: 'No API key configured. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY — or run: dominus config set apiKey <key>',\n timestamp: Date.now(),\n },\n ]);\n return;\n }\n\n // Grab and clear any pending image\n const image = pendingImageRef.current;\n setPendingImage(null);\n pendingImageRef.current = null;\n\n setIsProcessing(true);\n setToolCalls([]);\n\n const displayText = image ? `${text}\\n[image 1]` : text;\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: displayText, timestamp: Date.now() },\n ]);\n\n let fullText = '';\n\n try {\n for await (const event of agent.run(text, image ? { base64: image.base64, mimeType: image.mimeType } : undefined)) {\n switch (event.type) {\n case 'text':\n fullText += event.content;\n setStreaming(fullText);\n break;\n\n case 'tool_call':\n setToolCalls((prev) => [\n ...prev,\n { name: event.tool, args: event.args, status: 'running' },\n ]);\n break;\n\n case 'tool_result':\n setToolCalls((prev) =>\n prev.map((tc) =>\n tc.name === event.tool && tc.status === 'running'\n ? { ...tc, status: event.result.success ? 'done' : 'error', result: event.result }\n : tc,\n ),\n );\n break;\n\n case 'error':\n setChatEntries((prev) => [\n ...prev,\n { role: 'error', content: event.message, timestamp: Date.now() },\n ]);\n break;\n }\n }\n\n if (fullText) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'assistant', content: fullText, timestamp: Date.now() },\n ]);\n }\n } catch (err) {\n setChatEntries((prev) => [\n ...prev,\n {\n role: 'error',\n content: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setIsProcessing(false);\n setStreaming('');\n setToolCalls([]);\n }\n },\n [agent, isProcessing, handleCommand],\n );\n\n if (needsSetup) {\n return <Setup onComplete={handleSetupComplete} />;\n }\n\n if (showWelcome) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Welcome\n userName={config.userName}\n version={version}\n model={resolveProviderSettings(config).model}\n provider={PROVIDERS[config.provider]?.name ?? config.provider}\n port={server.getPort()}\n hasApiKey={hasApiKey}\n connected={studio.connected}\n cwd={process.cwd()}\n />\n <InputBar\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n isProcessing={false}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n placeholder={\n hasApiKey\n ? 'Type a message to begin, or Ctrl+V to paste an image...'\n : 'Set up your API key to get started, or type /help...'\n }\n />\n </Box>\n );\n }\n\n return (\n <Layout\n connected={studio.connected}\n placeName={studio.placeName}\n model={agent?.getModel() ?? resolveProviderSettings(config).model}\n chatEntries={chatEntries}\n outputEntries={studio.outputLog}\n explorerTree={studio.explorerTree}\n toolCalls={toolCalls}\n streaming={streaming || undefined}\n isProcessing={isProcessing}\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n />\n );\n};\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { App } from './app.js';\nimport { DominusServer, type StudioBridge } from './transport/ws-server.js';\nimport { DominusClient, isPortInUse } from './transport/ws-client.js';\nimport { AgentLoop } from './agent/loop.js';\nimport { ToolRegistry, createDefaultRegistry } from './tools/registry.js';\nimport { initMemoryStore, closeMemoryStore } from './memory/store.js';\nimport {\n loadConfig,\n setConfigValue,\n getConfigValue,\n loadRules,\n saveRules,\n getDominusDir,\n detectProviderFromEnv,\n PROVIDERS,\n type DominusConfig,\n type AIProviderType,\n} from './config/config.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nconst VERSION = '0.1.0';\n\nconst program = new Command();\n\nprogram\n .name('dominus')\n .description('AI-powered autonomous agent for Roblox Studio development')\n .version(VERSION);\n\n// Main start command (default)\nprogram\n .command('start', { isDefault: true })\n .description('Launch the Dominus TUI agent')\n .option('-p, --port <port>', 'WebSocket server port', '18088')\n .action(async (opts) => {\n const config = loadConfig();\n const port = parseInt(opts.port) || config.port;\n\n // Auto-detect API key from environment variables\n if (!config.apiKey) {\n const detected = detectProviderFromEnv();\n if (detected) {\n setConfigValue('provider', detected.provider);\n setConfigValue('apiKey', detected.apiKey);\n }\n }\n\n // Auto-detect user name\n if (config.userName === 'Developer') {\n const envUser = process.env.USER || process.env.USERNAME || 'Developer';\n const firstName = envUser.split(' ')[0];\n if (firstName && firstName !== 'Developer') {\n setConfigValue('userName', firstName);\n }\n }\n\n await launchApp(port);\n });\n\n// Config commands\nconst configCmd = program.command('config').description('Manage Dominus configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n const numericKeys = ['port', 'maxToolIterations', 'maxVerifyRetries', 'tokenBudget'];\n const booleanKeys = ['autoIndex', 'autoLearn'];\n const validProviders = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter', 'custom'];\n\n let parsed: unknown = value;\n if (numericKeys.includes(key)) {\n parsed = parseInt(value);\n } else if (booleanKeys.includes(key)) {\n parsed = value === 'true';\n } else if (key === 'provider') {\n if (!validProviders.includes(value)) {\n console.log(` ✖ Invalid provider: ${value}`);\n console.log(` Valid providers: ${validProviders.join(', ')}`);\n return;\n }\n // When changing provider, also update model and base URL defaults\n const providerInfo = PROVIDERS[value as AIProviderType];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n }\n\n setConfigValue(key as keyof DominusConfig, parsed as DominusConfig[keyof DominusConfig]);\n console.log(` ✔ Set ${key} = ${value}`);\n if (key === 'provider') {\n const p = PROVIDERS[value as AIProviderType];\n console.log(` → Base URL: ${p.baseUrl}`);\n console.log(` → Default model: ${p.defaultModel}`);\n }\n console.log(` Config stored at: ${getDominusDir()}/config.json`);\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value')\n .action((key: string) => {\n const value = getConfigValue(key as keyof DominusConfig);\n if (key.toLowerCase().includes('key') && typeof value === 'string') {\n console.log(` ${key} = ${value.slice(0, 8)}...${value.slice(-4)}`);\n } else {\n console.log(` ${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all config values')\n .action(() => {\n const config = loadConfig();\n console.log('');\n console.log(' Dominus Configuration:');\n console.log(' ─────────────────────');\n for (const [key, value] of Object.entries(config)) {\n const display =\n key.toLowerCase().includes('key') && typeof value === 'string' && value.length > 12\n ? `${value.slice(0, 8)}...${value.slice(-4)}`\n : JSON.stringify(value);\n console.log(` ${key}: ${display}`);\n }\n console.log('');\n console.log(` Config file: ${getDominusDir()}/config.json`);\n console.log('');\n });\n\n// Rules commands\nconst rulesCmd = program.command('rules').description('Manage agent rules (do/don\\'t)');\n\nrulesCmd\n .command('add-do <rule>')\n .description('Add a rule for things Dominus should do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.do.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DO rule: ${rule}`);\n });\n\nrulesCmd\n .command('add-dont <rule>')\n .description('Add a rule for things Dominus should NOT do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.dont.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DON'T rule: ${rule}`);\n });\n\nrulesCmd\n .command('list')\n .description('List all rules')\n .action(() => {\n const rules = loadRules();\n console.log('');\n console.log(' Dominus Rules:');\n if (rules.do.length) {\n console.log(' DO:');\n rules.do.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.dont.length) {\n console.log(\" DON'T:\");\n rules.dont.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.conventions.length) {\n console.log(' CONVENTIONS:');\n rules.conventions.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (!rules.do.length && !rules.dont.length && !rules.conventions.length) {\n console.log(' No rules configured yet.');\n console.log(' Use: dominus rules add-do \"Always use strict typing\"');\n console.log(' Use: dominus rules add-dont \"Never use deprecated APIs\"');\n }\n console.log('');\n });\n\n// Plugin install command\nprogram\n .command('install-plugin')\n .description('Build & install the Dominus plugin into Roblox Studio')\n .action(async () => {\n const { execSync } = await import('node:child_process');\n\n const packageRoot = path.resolve(import.meta.dirname ?? __dirname, '..');\n const pluginDir = path.join(packageRoot, 'plugin');\n const pluginProject = path.join(pluginDir, 'default.project.json');\n const studioPlugins = path.join(\n os.homedir(),\n 'AppData',\n 'Local',\n 'Roblox',\n 'Plugins',\n );\n const destFile = path.join(studioPlugins, 'Dominus.rbxm');\n\n if (!fs.existsSync(pluginProject)) {\n console.log(' ✖ Plugin source not found.');\n console.log(` Expected at: ${pluginDir}`);\n return;\n }\n\n if (!fs.existsSync(studioPlugins)) {\n fs.mkdirSync(studioPlugins, { recursive: true });\n }\n\n // Try building with Rojo\n let rojoAvailable = false;\n try {\n execSync('rojo --version', { stdio: 'pipe' });\n rojoAvailable = true;\n } catch {\n // Rojo not installed\n }\n\n if (rojoAvailable) {\n try {\n console.log(' Building plugin with Rojo...');\n execSync(`rojo build \"${pluginDir}\" -o \"${destFile}\"`, { stdio: 'pipe' });\n console.log(` ✔ Plugin built and installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n } catch (err) {\n console.log(` ✖ Rojo build failed: ${err instanceof Error ? err.message : err}`);\n }\n } else {\n // Fallback: build a simple .rbxmx (XML model) that Studio can load\n console.log(' Rojo not found — building plugin manually...');\n buildPluginXml(pluginDir, destFile.replace('.rbxm', '.rbxmx'));\n }\n });\n\n// MCP server command\nprogram\n .command('mcp')\n .description('Start the Dominus MCP server (for Cursor, Claude Desktop, etc.)')\n .option('-p, --port <port>', 'WebSocket server port for Studio connection', '18088')\n .action(async () => {\n const { startMcpServer } = await import('./mcp/server.js');\n await startMcpServer();\n });\n\n// MCP install — auto-write config into supported editors\ninterface McpTarget {\n name: string;\n configPath: string;\n keyPath: string[];\n}\n\nfunction getMcpTargets(): McpTarget[] {\n const home = os.homedir();\n const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');\n const localAppData = process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local');\n const cwd = process.cwd();\n\n return [\n {\n name: 'Cursor (project)',\n configPath: path.join(cwd, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Cursor (global)',\n configPath: path.join(home, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Desktop',\n configPath: path.join(appData, 'Claude', 'claude_desktop_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Code',\n configPath: path.join(home, '.claude.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (project)',\n configPath: path.join(cwd, '.windsurf', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (global)',\n configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'VS Code (project)',\n configPath: path.join(cwd, '.vscode', 'mcp.json'),\n keyPath: ['servers'],\n },\n {\n name: 'VS Code (global)',\n configPath: path.join(localAppData, 'Code', 'User', 'settings.json'),\n keyPath: ['mcp', 'servers'],\n },\n ];\n}\n\nconst dominusEntry = {\n command: 'dominus',\n args: ['mcp'],\n type: 'stdio',\n};\n\nfunction injectMcpConfig(target: McpTarget): { status: 'installed' | 'already' | 'created' } {\n let config: Record<string, unknown> = {};\n if (fs.existsSync(target.configPath)) {\n try {\n config = JSON.parse(fs.readFileSync(target.configPath, 'utf-8'));\n } catch {\n config = {};\n }\n }\n\n // Navigate to the nested key, creating objects along the way\n let obj = config as Record<string, unknown>;\n for (const key of target.keyPath) {\n if (!obj[key] || typeof obj[key] !== 'object') {\n obj[key] = {};\n }\n obj = obj[key] as Record<string, unknown>;\n }\n\n if (obj['dominus']) {\n return { status: 'already' };\n }\n\n obj['dominus'] = { ...dominusEntry };\n\n const dir = path.dirname(target.configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n return { status: fs.existsSync(target.configPath) ? 'installed' : 'created' };\n}\n\nprogram\n .command('mcp-install')\n .description('Auto-install Dominus MCP into Cursor, VS Code, Claude Desktop, Windsurf, etc.')\n .option('-a, --all', 'Install to all detected editors')\n .action(async (opts) => {\n const targets = getMcpTargets();\n\n console.log('');\n console.log(' Dominus MCP Auto-Installer');\n console.log(' ═════════════════════════');\n console.log('');\n\n if (opts.all) {\n for (const target of targets) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n }\n console.log('');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n return;\n }\n\n // Interactive: show which editors are detected\n const detected: { target: McpTarget; exists: boolean }[] = targets.map((t) => ({\n target: t,\n exists: fs.existsSync(path.dirname(t.configPath)),\n }));\n\n const toInstall = detected.filter((d) => d.exists);\n\n if (toInstall.length === 0) {\n console.log(' No supported editors detected.');\n console.log(' Run with --all to install configs anyway,');\n console.log(' or manually add to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n return;\n }\n\n console.log(' Detected editors:');\n console.log('');\n\n for (const { target } of toInstall) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n console.log(` ${target.configPath}`);\n }\n\n const skipped = detected.filter((d) => !d.exists);\n if (skipped.length > 0) {\n console.log('');\n console.log(' Skipped (not detected):');\n for (const { target } of skipped) {\n console.log(` ○ ${target.name}`);\n }\n }\n\n console.log('');\n console.log(' Provides 14 Roblox Studio tools to your AI editor.');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n });\n\n// MCP setup helper (print-only)\nprogram\n .command('mcp-setup')\n .description('Print MCP configuration for manual setup')\n .action(() => {\n console.log('');\n console.log(' Dominus MCP — Manual Setup');\n console.log(' ═════════════════════════');\n console.log('');\n console.log(' Tip: Run `dominus mcp-install` to auto-install instead!');\n console.log('');\n console.log(' Add this to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n console.log(' Config file locations:');\n console.log('');\n console.log(' Cursor (project) .cursor/mcp.json');\n console.log(' Cursor (global) ~/.cursor/mcp.json');\n console.log(' Claude Desktop %APPDATA%/Claude/claude_desktop_config.json');\n console.log(' Claude Code ~/.claude.json');\n console.log(' Windsurf (project) .windsurf/mcp.json');\n console.log(' Windsurf (global) ~/.codeium/windsurf/mcp_config.json');\n console.log(' VS Code (project) .vscode/mcp.json');\n console.log(' VS Code (global) %LOCALAPPDATA%/Code/User/settings.json');\n console.log('');\n console.log(' 14 tools: read_script, edit_script, run_code, get_explorer,');\n console.log(' get_properties, set_properties, insert_instance, delete_instance,');\n console.log(' get_selection, search_scripts, get_output, run_tests,');\n console.log(' recall_memory, remember');\n console.log('');\n });\n\nfunction buildPluginXml(pluginDir: string, destFile: string): void {\n const srcDir = path.join(pluginDir, 'src');\n if (!fs.existsSync(srcDir)) {\n console.log(` ✖ Plugin source directory not found: ${srcDir}`);\n return;\n }\n\n const files = fs.readdirSync(srcDir).filter((f) => f.endsWith('.lua'));\n const mainFile = files.find((f) => f === 'init.server.lua');\n const moduleFiles = files.filter((f) => f !== 'init.server.lua');\n\n if (!mainFile) {\n console.log(' ✖ init.server.lua not found in plugin source');\n return;\n }\n\n const escapeXml = (s: string) =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n const mainSource = fs.readFileSync(path.join(srcDir, mainFile), 'utf-8');\n\n let moduleItems = '';\n for (const mf of moduleFiles) {\n const modName = mf.replace('.lua', '');\n const modSource = fs.readFileSync(path.join(srcDir, mf), 'utf-8');\n moduleItems += `\n <Item class=\"ModuleScript\" referent=\"${modName}\">\n <Properties>\n <string name=\"Name\">${modName}</string>\n <ProtectedString name=\"Source\"><![CDATA[${modSource}]]></ProtectedString>\n </Properties>\n </Item>`;\n }\n\n const rbxmx = `<roblox version=\"4\">\n <Item class=\"Script\" referent=\"Dominus\">\n <Properties>\n <string name=\"Name\">Dominus</string>\n <ProtectedString name=\"Source\"><![CDATA[${mainSource}]]></ProtectedString>\n <token name=\"RunContext\">1</token>\n </Properties>${moduleItems}\n </Item>\n</roblox>`;\n\n fs.writeFileSync(destFile, rbxmx, 'utf-8');\n console.log(` ✔ Plugin installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n}\n\nasync function launchApp(port: number): Promise<void> {\n await initMemoryStore();\n\n let server: StudioBridge;\n\n const portTaken = await isPortInUse(port);\n if (portTaken) {\n // Another Dominus instance (MCP) already owns the port — connect as relay\n const client = new DominusClient(port);\n await client.connect();\n server = client;\n } else {\n const srv = new DominusServer(port);\n await srv.start();\n server = srv;\n }\n\n const config = loadConfig();\n let agent: AgentLoop | null = null;\n\n if (config.apiKey) {\n const tools = createDefaultRegistry();\n await new Promise((r) => setTimeout(r, 100));\n agent = new AgentLoop(server, tools);\n }\n\n const { waitUntilExit } = render(\n <App server={server} agent={agent} version={VERSION} />,\n );\n\n const cleanup = async () => {\n closeMemoryStore();\n await server.stop();\n };\n\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n\n await waitUntilExit();\n await cleanup();\n}\n\nprogram.parse();\n","import { WebSocket } from 'ws';\r\nimport { EventEmitter } from 'node:events';\r\nimport {\r\n parseMessage,\r\n serializeMessage,\r\n createMessage,\r\n StudioMsg,\r\n type WsMessage,\r\n type StudioConnectedPayload,\r\n} from './protocol.js';\r\nimport type { StudioBridge, StudioConnection } from './ws-server.js';\r\n\r\n/**\r\n * Connects as a relay client to an existing DominusServer.\r\n * Has the same interface as DominusServer so the TUI/Agent\r\n * can use either transparently.\r\n */\r\nexport class DominusClient extends EventEmitter implements StudioBridge {\r\n private ws: WebSocket | null = null;\r\n private port: number;\r\n private studioConnected = false;\r\n private connectionInfo: Omit<StudioConnection, 'ws'> | null = null;\r\n private pendingRequests = new Map<\r\n string,\r\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\r\n >();\r\n\r\n constructor(port = 18088) {\r\n super();\r\n this.port = port;\r\n }\r\n\r\n connect(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const url = `ws://localhost:${this.port}`;\r\n const ws = new WebSocket(url);\r\n\r\n ws.on('open', () => {\r\n this.ws = ws;\r\n ws.send(serializeMessage(createMessage('controller:connect', {})));\r\n this.emit('server:started', { port: this.port, relay: true });\r\n resolve();\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = parseMessage(raw.toString());\r\n this.handleMessage(msg);\r\n } catch (err) {\r\n this.emit('server:error', err);\r\n }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.ws = null;\r\n this.studioConnected = false;\r\n this.emit('studio:disconnected');\r\n for (const [id, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Relay connection lost'));\r\n this.pendingRequests.delete(id);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n if (!this.ws) reject(err);\r\n this.emit('server:error', err);\r\n });\r\n });\r\n }\r\n\r\n private handleMessage(msg: WsMessage): void {\r\n if (msg.type === 'controller:welcome') {\r\n const p = msg.payload as { studioConnected: boolean };\r\n this.studioConnected = p.studioConnected;\r\n if (this.studioConnected) {\r\n this.emit('studio:connected', {});\r\n }\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:connected') {\r\n this.studioConnected = true;\r\n const payload = msg.payload as StudioConnectedPayload;\r\n this.connectionInfo = {\r\n connectedAt: Date.now(),\r\n studioVersion: payload.studioVersion,\r\n placeId: payload.placeId,\r\n placeName: payload.placeName,\r\n };\r\n this.emit('studio:connected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:disconnected') {\r\n this.studioConnected = false;\r\n this.connectionInfo = null;\r\n this.emit('studio:disconnected');\r\n return;\r\n }\r\n\r\n if (msg.type === StudioMsg.RESPONSE) {\r\n const pending = this.pendingRequests.get(msg.id);\r\n if (pending) {\r\n clearTimeout(pending.timer);\r\n pending.resolve(msg);\r\n this.pendingRequests.delete(msg.id);\r\n }\r\n return;\r\n }\r\n\r\n this.emit(msg.type, msg.payload);\r\n this.emit('message', msg);\r\n }\r\n\r\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n reject(new Error('Not connected to Dominus server'));\r\n return;\r\n }\r\n if (!this.studioConnected) {\r\n reject(new Error('Studio not connected'));\r\n return;\r\n }\r\n\r\n const msg = createMessage(type, payload);\r\n\r\n const timer = setTimeout(() => {\r\n this.pendingRequests.delete(msg.id);\r\n reject(new Error(`Request timed out: ${type}`));\r\n }, timeoutMs);\r\n\r\n this.pendingRequests.set(msg.id, {\r\n resolve: resolve as (msg: WsMessage) => void,\r\n reject,\r\n timer,\r\n });\r\n\r\n this.ws.send(serializeMessage(msg));\r\n });\r\n }\r\n\r\n sendNotification(type: string, payload: unknown): void {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\r\n const msg = createMessage(type, payload);\r\n this.ws.send(serializeMessage(msg));\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.studioConnected;\r\n }\r\n\r\n getConnectionInfo(): StudioConnection | null {\r\n if (!this.connectionInfo) return null;\r\n return { ...this.connectionInfo, ws: this.ws! } as StudioConnection;\r\n }\r\n\r\n getPort(): number {\r\n return this.port;\r\n }\r\n\r\n stop(): Promise<void> {\r\n return new Promise((resolve) => {\r\n for (const [, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Client shutting down'));\r\n }\r\n this.pendingRequests.clear();\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Check if a Dominus server is already running on the given port.\r\n */\r\nexport async function isPortInUse(port: number): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ws = new WebSocket(`ws://localhost:${port}`);\r\n const timer = setTimeout(() => {\r\n ws.close();\r\n resolve(false);\r\n }, 1000);\r\n\r\n ws.on('open', () => {\r\n clearTimeout(timer);\r\n ws.close();\r\n resolve(true);\r\n });\r\n\r\n ws.on('error', () => {\r\n clearTimeout(timer);\r\n resolve(false);\r\n });\r\n });\r\n}\r\n","import OpenAI from 'openai';\nimport { type DominusConfig, resolveProviderSettings, PROVIDERS } from '../config/config.js';\nimport type { Tool, ToolCall } from '../tools/types.js';\n\nexport interface AIResponse {\n content: string | null;\n toolCalls: ToolCall[];\n finishReason: string;\n usage?: { promptTokens: number; completionTokens: number; totalTokens: number };\n}\n\nexport interface StreamChunk {\n type: 'text' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'done';\n content?: string;\n toolCall?: Partial<ToolCall>;\n}\n\nexport class AIProvider {\n private client: OpenAI;\n private model: string;\n private providerName: string;\n\n constructor(config: DominusConfig) {\n if (!config.apiKey) {\n throw new Error('API key not configured. Run: dominus config set apiKey <your-key>');\n }\n\n const { baseUrl, model } = resolveProviderSettings(config);\n this.providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: baseUrl,\n });\n this.model = model;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n getModel(): string {\n return this.model;\n }\n\n getProviderName(): string {\n return this.providerName;\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n try {\n const list = await this.client.models.list();\n const models: { id: string; owned_by?: string }[] = [];\n for await (const m of list) {\n models.push({ id: m.id, owned_by: m.owned_by });\n }\n models.sort((a, b) => a.id.localeCompare(b.id));\n return models;\n } catch {\n return [];\n }\n }\n\n async chat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): Promise<AIResponse> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n });\n\n const choice = response.choices[0];\n if (!choice) throw new Error('No response from AI');\n\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n content: choice.message.content,\n toolCalls,\n finishReason: choice.finish_reason ?? 'stop',\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n async *streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): AsyncGenerator<StreamChunk> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n stream: true,\n });\n\n const toolCallBuffers = new Map<number, { id: string; name: string; args: string }>();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: 'text', content: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (!toolCallBuffers.has(tc.index)) {\n toolCallBuffers.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n args: '',\n });\n if (tc.function?.name) {\n yield {\n type: 'tool_call_start',\n toolCall: { id: tc.id, name: tc.function.name },\n };\n }\n }\n\n const buffer = toolCallBuffers.get(tc.index)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) {\n buffer.args += tc.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: tc.function.arguments,\n toolCall: { id: buffer.id, name: buffer.name },\n };\n }\n }\n }\n\n if (chunk.choices[0]?.finish_reason === 'tool_calls') {\n for (const [, buffer] of toolCallBuffers) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(buffer.args);\n } catch {\n /* empty args */\n }\n yield {\n type: 'tool_call_end',\n toolCall: { id: buffer.id, name: buffer.name, arguments: args },\n };\n }\n toolCallBuffers.clear();\n }\n }\n\n yield { type: 'done' };\n }\n}\n\nfunction toolToOpenAI(tool: Tool): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as unknown as Record<string, unknown>,\n },\n };\n}\n","import type { DominusRules } from '../config/config.js';\r\nimport type { Fact } from '../memory/types.js';\r\n\r\nexport function buildSystemPrompt(opts: {\r\n userName: string;\r\n connected: boolean;\r\n placeName?: string;\r\n placeId?: number;\r\n scriptIndex?: { path: string; summary?: string; className: string }[];\r\n facts?: Fact[];\r\n rules?: DominusRules;\r\n}): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(`You are Dominus, an expert AI agent for Roblox Studio development.\r\nYou assist ${opts.userName} with building, debugging, and refactoring Roblox experiences.\r\n\r\nYou are deeply knowledgeable about:\r\n- Luau (Roblox's programming language): syntax, idioms, metatables, type annotations, coroutines\r\n- Roblox Engine API: all services (Players, Workspace, DataStoreService, ReplicatedStorage, etc.)\r\n- Roblox architecture patterns: client-server model, remotes, replication, DataStores\r\n- Common frameworks: Knit, ProfileService, Rodux, Roact, Fusion\r\n- Studio workflows: plugins, packages, team collaboration, testing\r\n- Performance: memory management, heartbeat optimization, streaming, LOD\r\n\r\nYou have direct access to Roblox Studio through tools. You can read/edit scripts, run code, browse the explorer tree, manage instances, and run tests -- all in real-time via WebSocket.\r\n\r\nWhen the user asks you to do something, you should:\r\n1. Use your tools to gather context (read scripts, check explorer, recall memory)\r\n2. Plan your approach for complex tasks\r\n3. Execute changes using your tools (edit scripts, run code, insert instances)\r\n4. Verify your changes worked (read back, check output for errors)\r\n5. Remember important facts for future sessions`);\r\n\r\n // Connection status\r\n if (opts.connected) {\r\n parts.push(`\\n## Current Session\r\n- Studio: CONNECTED${opts.placeName ? ` (${opts.placeName})` : ''}${opts.placeId ? ` [PlaceID: ${opts.placeId}]` : ''}\r\n- You can use all Studio tools.`);\r\n } else {\r\n parts.push(`\\n## Current Session\r\n- Studio: NOT CONNECTED\r\n- You cannot use Studio tools until the plugin connects.\r\n- You can still use memory tools and answer Roblox questions.`);\r\n }\r\n\r\n // Project index\r\n if (opts.scriptIndex?.length) {\r\n parts.push('\\n## Project Scripts');\r\n const lines = opts.scriptIndex.map(\r\n (s) => `- ${s.path} (${s.className})${s.summary ? `: ${s.summary}` : ''}`,\r\n );\r\n if (lines.length > 40) {\r\n parts.push(lines.slice(0, 40).join('\\n'));\r\n parts.push(`... and ${lines.length - 40} more scripts`);\r\n } else {\r\n parts.push(lines.join('\\n'));\r\n }\r\n }\r\n\r\n // Recalled facts\r\n if (opts.facts?.length) {\r\n parts.push('\\n## Remembered Context');\r\n for (const fact of opts.facts.slice(0, 20)) {\r\n parts.push(`- [${fact.category}] ${fact.content}`);\r\n }\r\n }\r\n\r\n // User rules\r\n if (opts.rules) {\r\n if (opts.rules.do.length > 0) {\r\n parts.push('\\n## Rules: DO');\r\n for (const rule of opts.rules.do) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.dont.length > 0) {\r\n parts.push('\\n## Rules: DO NOT');\r\n for (const rule of opts.rules.dont) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.conventions.length > 0) {\r\n parts.push('\\n## Coding Conventions');\r\n for (const conv of opts.rules.conventions) {\r\n parts.push(`- ${conv}`);\r\n }\r\n }\r\n if (opts.rules.context) {\r\n parts.push(`\\n## Project Context\\n${opts.rules.context}`);\r\n }\r\n }\r\n\r\n parts.push(`\\n## Tool Usage Guidelines\r\n- Always verify your work: after editing a script, read it back to confirm.\r\n- After running code, check the output for errors.\r\n- Use remember to store important facts you discover about the project.\r\n- Use recall_memory before complex tasks to check if you already know relevant context.\r\n- When searching scripts, be specific with your query terms.\r\n- For multi-step changes, explain your plan before executing.\r\n\r\n## Building & Construction\r\nWhen the user asks you to build or create objects (parts, trees, houses, terrain, etc.):\r\n\r\n**PREFER these builder tools over raw run_code:**\r\n- \\`create_part\\` — create a single part with position, size, color, material, shape in one call\r\n- \\`build_multiple\\` — create many parts in a single batch round-trip (FASTEST for complex builds)\r\n- \\`clone_instance\\` — duplicate an existing object, optionally offset/rename it\r\n- \\`group_instances\\` — organize parts into a Model or Folder\r\n- \\`set_properties\\` — adjust properties on existing instances (supports Vector3, Color3, enums, hex colors)\r\n\r\n**Why use builder tools instead of run_code?**\r\n- Tool calls are structured — the AI sends typed parameters, no string interpolation bugs\r\n- Properties are auto-coerced (hex → Color3, tables → Vector3, strings → Enum values)\r\n- \\`build_multiple\\` sends one batch of Luau to Studio, creating many parts in a single round-trip\r\n- Easier for the agent to plan, verify, and iterate\r\n\r\n**Building strategy:**\r\n1. For a single part: use \\`create_part\\`\r\n2. For multi-part objects (trees, buildings, vehicles): use \\`build_multiple\\` with \\`groupName\\`\r\n3. For repeating/duplicating: use \\`clone_instance\\` with offset\r\n4. For organizing: use \\`group_instances\\`\r\n5. Only fall back to \\`run_code\\` for complex logic (loops, raycasts, terrain generation algorithms)\r\n\r\n## GUI / UI Elements — CRITICAL\r\n**ALWAYS use \\`create_ui\\` for building UI.** It creates the entire UI tree in ONE call — no run_code, no get_class_info needed.\r\nDo NOT use run_code for UI creation. Do NOT call get_class_info before create_ui — it already handles all types natively.\r\n\r\n\\`create_ui\\` takes a declarative JSON tree and builds everything in a single Studio round-trip:\r\n\\`\\`\\`json\r\n{\r\n \"parent\": \"StarterGui\",\r\n \"tree\": {\r\n \"ClassName\": \"ScreenGui\", \"Name\": \"MyUI\", \"ResetOnSpawn\": false,\r\n \"Children\": [\r\n { \"ClassName\": \"Frame\", \"Size\": [1, 0, 1, 0], \"BackgroundColor3\": \"#F0E6FF\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\r\n { \"ClassName\": \"TextLabel\", \"Text\": \"Hello!\", \"Size\": [0.5, 0, 0.1, 0],\r\n \"Position\": [0.25, 0, 0.45, 0], \"BackgroundTransparency\": 1,\r\n \"TextColor3\": \"#6C5CE7\", \"TextScaled\": true, \"Font\": \"GothamBold\" }\r\n ]\r\n }\r\n ]\r\n }\r\n}\r\n\\`\\`\\`\r\n\r\nGUI classes use DIFFERENT property types than 3D parts:\r\n\r\n**Key type differences:**\r\n- GUI Size/Position = \\`UDim2\\` (NOT Vector3). Format: \\`{XScale: 0.5, XOffset: 0, YScale: 0.5, YOffset: 0}\\` or \\`[xScale, xOffset, yScale, yOffset]\\`\r\n- GUI AnchorPoint = \\`Vector2\\` = \\`{x: 0.5, y: 0.5}\\`\r\n- BackgroundColor3 = \\`Color3\\` = \\`\"#FF0000\"\\` or \\`{R: 1, G: 0, B: 0}\\` or \\`\"rgb(255,0,0)\"\\`\r\n- Font = \\`Font\\` = \\`{Family: \"rbxasset://fonts/families/SourceSansPro.json\", Weight: \"Bold\"}\\`\r\n- BorderSizePixel = \\`number\\`\r\n- TextSize = \\`number\\`\r\n- Enum properties (e.g., TextXAlignment) = string name like \\`\"Center\"\\`, \\`\"Left\"\\`\r\n\r\n**Property coercion handles automatically:**\r\n- UDim2: tables, arrays, \"0.5, 0, 0.3, 0\" strings\r\n- UDim: {Scale, Offset} or number\r\n- Vector3, Vector2, Color3, BrickColor, CFrame, Rect, NumberRange\r\n- NumberSequence, ColorSequence (for gradients)\r\n- All enum properties from string names\r\n- Color3 from hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name strings\r\n\r\n## ReflectionService\r\nThe \\`get_class_info\\` tool queries Roblox's ReflectionService to return the complete API surface for any class:\r\n- All properties with their exact ValueType\r\n- All methods with parameter names and types\r\n- All events with parameter types\r\n- Superclass, creatability, serialization info\r\n\r\nUse it whenever you're unsure about property names or types. It's fast and cached.`);\r\n\r\n return parts.join('\\n');\r\n}\r\n","import type OpenAI from 'openai';\nimport { buildSystemPrompt } from './system-prompt.js';\nimport { recallFacts, getScriptIndex, getProjectSummaries } from '../memory/store.js';\nimport { loadConfig, loadRules } from '../config/config.js';\nimport { getContextWindow } from '../ai/models.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport type { ChatMessage } from '../memory/types.js';\n\nconst CHARS_PER_TOKEN = 4; // rough estimate\n\ninterface ContextBuildResult {\n messages: OpenAI.ChatCompletionMessageParam[];\n tokenEstimate: number;\n}\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function buildContext(opts: {\n userMessage: string;\n conversationHistory: OpenAI.ChatCompletionMessageParam[];\n server: StudioBridge;\n projectId: string;\n sessionId: string;\n}): ContextBuildResult {\n const config = loadConfig();\n const rules = loadRules();\n const contextWindow = getContextWindow(config.model);\n\n // Token budget allocation\n const systemBudget = Math.floor(contextWindow * 0.15);\n const memoryBudget = Math.floor(contextWindow * 0.15);\n const conversationBudget = Math.floor(contextWindow * 0.45);\n // 25% reserved for response + tool calls\n\n // Build system prompt\n const connInfo = opts.server.getConnectionInfo();\n const facts = recallFacts(opts.projectId, opts.userMessage, 15);\n const scriptIndex = getScriptIndex(opts.projectId);\n const summaries = getProjectSummaries(opts.projectId, 5);\n\n let systemPrompt = buildSystemPrompt({\n userName: config.userName,\n connected: opts.server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n scriptIndex,\n facts,\n rules,\n });\n\n // Trim system prompt if over budget\n if (estimateTokens(systemPrompt) > systemBudget) {\n systemPrompt = systemPrompt.slice(0, systemBudget * CHARS_PER_TOKEN);\n }\n\n // Build conversation messages, trimming old ones if over budget\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ];\n\n // Add session summaries as context\n if (summaries.length > 0) {\n const summaryText = summaries\n .map((s) => s.summary)\n .join('\\n');\n if (estimateTokens(summaryText) <= memoryBudget) {\n messages.push({\n role: 'system',\n content: `Previous session summaries:\\n${summaryText}`,\n });\n }\n }\n\n // Add conversation history, newest first, respecting budget\n let historyTokens = 0;\n const historyMessages: OpenAI.ChatCompletionMessageParam[] = [];\n\n // Always include the current user message\n const currentMsg: OpenAI.ChatCompletionMessageParam = {\n role: 'user',\n content: opts.userMessage,\n };\n\n // Add historical messages from newest to oldest\n for (let i = opts.conversationHistory.length - 1; i >= 0; i--) {\n const msg = opts.conversationHistory[i];\n const content =\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n const tokens = estimateTokens(content);\n\n if (historyTokens + tokens > conversationBudget) break;\n historyTokens += tokens;\n historyMessages.unshift(msg);\n }\n\n messages.push(...historyMessages, currentMsg);\n\n const totalTokens = estimateTokens(\n messages.map((m) => (typeof m.content === 'string' ? m.content : '')).join(''),\n );\n\n return { messages, tokenEstimate: totalTokens };\n}\n\nexport function chatMessageToOpenAI(\n msg: ChatMessage,\n): OpenAI.ChatCompletionMessageParam | null {\n switch (msg.role) {\n case 'user':\n return { role: 'user', content: msg.content };\n case 'assistant':\n return { role: 'assistant', content: msg.content };\n case 'system':\n return { role: 'system', content: msg.content };\n case 'tool_result':\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.toolName ?? 'unknown',\n };\n default:\n return null;\n }\n}\n","import type { AIProviderType } from '../config/config.js';\n\nexport interface ModelInfo {\n id: string;\n name: string;\n contextWindow: number;\n supportsTools: boolean;\n provider: AIProviderType;\n}\n\nexport const POPULAR_MODELS: ModelInfo[] = [\n // --- OpenAI ---\n { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-4o', name: 'GPT-4o', contextWindow: 128000, supportsTools: true, provider: 'openai' },\n { id: 'o3-mini', name: 'o3-mini', contextWindow: 200000, supportsTools: true, provider: 'openai' },\n\n // --- Anthropic ---\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n\n // --- Google Gemini ---\n { id: 'gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'gemini' },\n { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', contextWindow: 1048576, supportsTools: true, provider: 'gemini' },\n\n // --- xAI / Grok ---\n { id: 'grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'xai' },\n { id: 'grok-3', name: 'Grok 3', contextWindow: 131072, supportsTools: true, provider: 'xai' },\n\n // --- OpenRouter (routes to any model) ---\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'google/gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'openrouter' },\n { id: 'x-ai/grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'deepseek/deepseek-v3.2', name: 'DeepSeek V3.2', contextWindow: 1000000, supportsTools: true, provider: 'openrouter' },\n];\n\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return POPULAR_MODELS.find((m) => m.id === modelId);\n}\n\nexport function getModelsForProvider(provider: AIProviderType): ModelInfo[] {\n return POPULAR_MODELS.filter((m) => m.provider === provider);\n}\n\nexport function getContextWindow(modelId: string): number {\n return getModelInfo(modelId)?.contextWindow ?? 128000;\n}\n","import type OpenAI from 'openai';\nimport { nanoid } from 'nanoid';\nimport { AIProvider } from '../ai/provider.js';\nimport { buildContext } from './context-builder.js';\nimport { loadConfig } from '../config/config.js';\nimport { createConfigAccess } from '../config/config.js';\nimport { storeMessage } from '../memory/store.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport type { AgentEvent, ToolContext, ToolCall, ToolResult } from '../tools/types.js';\nimport type { WsMessage } from '../transport/protocol.js';\n\nexport class AgentLoop {\n private ai: AIProvider;\n private server: StudioBridge;\n private tools: ToolRegistry;\n private conversationHistory: OpenAI.ChatCompletionMessageParam[] = [];\n private projectId = 'current';\n private sessionId: string;\n private maxIterations: number;\n private maxRetries: number;\n\n constructor(server: StudioBridge, tools: ToolRegistry) {\n const config = loadConfig();\n this.ai = new AIProvider(config);\n this.server = server;\n this.tools = tools;\n this.sessionId = nanoid();\n this.maxIterations = config.maxToolIterations;\n this.maxRetries = config.maxVerifyRetries;\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setModel(model: string): void {\n this.ai.setModel(model);\n }\n\n getModel(): string {\n return this.ai.getModel();\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n return this.ai.listModels();\n }\n\n setProjectId(projectId: string): void {\n this.projectId = projectId;\n }\n\n async *run(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n storeMessage({\n sessionId: this.sessionId,\n role: 'user',\n content: userMessage + (imageAttachment ? ' [image attached]' : ''),\n createdAt: Date.now(),\n });\n\n const { messages } = buildContext({\n userMessage,\n conversationHistory: this.conversationHistory,\n server: this.server,\n projectId: this.projectId,\n sessionId: this.sessionId,\n });\n\n // If image attached, convert the last user message to multipart content\n if (imageAttachment) {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === 'user') {\n (lastMsg as any).content = [\n { type: 'text', text: typeof lastMsg.content === 'string' ? lastMsg.content : userMessage },\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageAttachment.mimeType};base64,${imageAttachment.base64}`,\n detail: 'high',\n },\n },\n ];\n }\n }\n\n const toolCtx = this.createToolContext();\n const allTools = this.tools.getAll();\n let currentMessages = [...messages];\n let iteration = 0;\n\n while (iteration < this.maxIterations) {\n iteration++;\n\n try {\n const response = await this.ai.chat(currentMessages, allTools);\n\n // Handle text response\n if (response.content) {\n yield { type: 'text', content: response.content };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'assistant',\n content: response.content,\n createdAt: Date.now(),\n });\n\n this.conversationHistory.push({ role: 'assistant', content: response.content });\n }\n\n // No tool calls -- we're done\n if (response.toolCalls.length === 0) {\n break;\n }\n\n // Execute tool calls\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of response.toolCalls) {\n yield { type: 'tool_call', tool: call.name, args: call.arguments };\n\n const result = await this.tools.execute(call, toolCtx);\n toolResults.push({ call, result });\n\n yield { type: 'tool_result', tool: call.name, result };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_call',\n content: JSON.stringify({ name: call.name, args: call.arguments }),\n toolName: call.name,\n createdAt: Date.now(),\n });\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_result',\n content: JSON.stringify(result),\n toolName: call.name,\n createdAt: Date.now(),\n });\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n tool_calls: response.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n })),\n };\n currentMessages.push(assistantMsg);\n\n // Add tool results to messages\n for (const { call, result } of toolResults) {\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n\n this.conversationHistory.push(assistantMsg);\n for (const { call, result } of toolResults) {\n this.conversationHistory.push({\n role: 'tool' as const,\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n yield { type: 'error', message };\n break;\n }\n }\n\n yield { type: 'done' };\n }\n\n async *streamRun(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n for await (const event of this.run(userMessage, imageAttachment)) {\n yield event;\n }\n }\n\n private createToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>> => {\n return this.server.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => this.server.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const { recallFacts } = require('../memory/store.js');\n const facts = recallFacts(projectId || this.projectId, query, limit);\n return facts.map((f: { content: string }) => f.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const { storeFact } = require('../memory/store.js');\n const now = Date.now();\n for (const f of facts) {\n storeFact({\n projectId: projectId || this.projectId,\n content: f.content,\n category: f.category as any,\n source: 'agent',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => {\n const { getScriptIndex } = require('../memory/store.js');\n return getScriptIndex(projectId || this.projectId);\n },\n },\n config: createConfigAccess(),\n };\n }\n\n clearHistory(): void {\n this.conversationHistory = [];\n this.sessionId = nanoid();\n }\n}\n","import type { Tool, ToolCall, ToolResult, ToolContext } from './types.js';\r\n\r\nexport class ToolRegistry {\r\n private tools = new Map<string, Tool>();\r\n\r\n register(tool: Tool): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new Error(`Tool already registered: ${tool.name}`);\r\n }\r\n this.tools.set(tool.name, tool);\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n getAll(): Tool[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n getSchemas(): Tool[] {\r\n return this.getAll();\r\n }\r\n\r\n async execute(call: ToolCall, ctx: ToolContext): Promise<ToolResult> {\r\n const tool = this.tools.get(call.name);\r\n if (!tool) {\r\n return { success: false, error: `Unknown tool: ${call.name}` };\r\n }\r\n\r\n try {\r\n return await tool.execute(call.arguments, ctx);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { success: false, error: message };\r\n }\r\n }\r\n\r\n listNames(): string[] {\r\n return Array.from(this.tools.keys());\r\n }\r\n}\r\n\r\nexport function createDefaultRegistry(): ToolRegistry {\r\n const registry = new ToolRegistry();\r\n\r\n // Dynamic imports to avoid circular deps\r\n const toolModules = [\r\n import('./studio/read-script.js'),\r\n import('./studio/edit-script.js'),\r\n import('./studio/run-code.js'),\r\n import('./studio/get-explorer.js'),\r\n import('./studio/get-properties.js'),\r\n import('./studio/set-properties.js'),\r\n import('./studio/insert-instance.js'),\r\n import('./studio/delete-instance.js'),\r\n import('./studio/get-output.js'),\r\n import('./studio/get-selection.js'),\r\n import('./studio/search-scripts.js'),\r\n import('./studio/run-tests.js'),\r\n import('./studio/get-class-info.js'),\r\n import('./studio/create-ui.js'),\r\n import('./studio/execute-run-test.js'),\r\n import('./studio/execute-play-test.js'),\r\n import('./studio/create-part.js'),\r\n import('./studio/clone-instance.js'),\r\n import('./studio/group-instances.js'),\r\n import('./studio/build-multiple.js'),\r\n import('./memory/recall.js'),\r\n import('./memory/remember.js'),\r\n import('./cloud/upload-asset.js'),\r\n ];\r\n\r\n // Register all tools asynchronously, return immediately\r\n // Tools will be available by the time the agent loop starts\r\n void Promise.all(\r\n toolModules.map(async (mod) => {\r\n const m = await mod;\r\n if (m.tool) registry.register(m.tool);\r\n }),\r\n );\r\n\r\n return registry;\r\n}\r\n"]}