dominus-cli 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport/protocol.ts","../src/config/config.ts","../src/memory/store.ts","../src/docs/roblox-api.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/get-descendants-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/studio/serialize-ui.ts","../src/tools/studio/move-instance.ts","../src/tools/studio/bulk-set-properties.ts","../src/tools/studio/find-replace-scripts.ts","../src/tools/docs/search-roblox-api.ts","../src/tools/docs/get-roblox-api-reference.ts","../src/tools/memory/recall.ts","../src/tools/memory/remember.ts","../src/tools/cloud/upload-asset.ts","../src/tools/studio/undo-redo.ts","../src/transport/ws-server.ts","../src/transport/ws-client.ts","../src/mcp/server.ts","../src/agent/internal-memory.ts","../src/ai/provider.ts","../src/agent/verifier.ts","../src/agent/json-response.ts","../src/agent/multi-agent/conflicts.ts","../src/agent/multi-agent/worker.ts","../src/agent/multi-agent/coordinator.ts","../src/tools/registry.ts","../src/mcp/index.ts"],"names":["fs","path","result","tool","EventEmitter","WebSocket","nanoid"],"mappings":"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","file":"mcp.js","sourcesContent":["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 GET_DESCENDANTS_PROPERTIES: 'cli:get:descendants: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 SERIALIZE_UI: 'cli:serialize:ui',\r\n MOVE_INSTANCE: 'cli:move:instance',\r\n UNDO: 'cli:undo',\r\n REDO: 'cli:redo',\r\n BULK_SET_PROPERTIES: 'cli:bulk:set:properties',\r\n FIND_REPLACE_SCRIPTS: 'cli:find:replace:scripts',\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 {\n studioVersion: string;\n connectionId?: string;\n placeId?: number;\n placeName?: string;\n engineVersion?: string;\n}\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 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 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 fs from 'node:fs';\nimport path from 'node:path';\n\nexport type RobloxApiKind = 'class' | 'datatype' | 'enum' | 'global' | 'library';\n\nexport interface RobloxApiMember {\n name: string;\n memberType: string;\n definedOn?: string;\n type?: string;\n summary?: string;\n description?: string;\n parameters?: { name?: string; type?: string; summary?: string; default?: string }[];\n returns?: { type?: string; summary?: string }[];\n tags?: string[];\n security?: { read?: string; write?: string };\n threadSafety?: string;\n category?: string;\n deprecationMessage?: string;\n value?: number;\n}\n\nexport interface RobloxApiReference {\n name: string;\n kind: RobloxApiKind;\n summary: string;\n description: string;\n inherits: string[];\n tags: string[];\n deprecationMessage: string;\n sourceUrl: string;\n members: Record<string, RobloxApiMember[]>;\n inheritedClasses?: string[];\n inheritedMembers?: Record<string, RobloxApiMember[]>;\n}\n\nexport interface RobloxApiSearchResult {\n name: string;\n kind: RobloxApiKind;\n score: number;\n sourceUrl: string;\n}\n\ninterface DocsOptions {\n docsRoot?: string;\n includeInherited?: boolean;\n}\n\nconst GITHUB_RAW_BASE =\n 'https://raw.githubusercontent.com/Roblox/creator-docs/main/content/en-us/reference/engine';\nconst GITHUB_TREE_URL =\n 'https://api.github.com/repos/Roblox/creator-docs/git/trees/main?recursive=1';\n\nconst KIND_FOLDERS: Record<RobloxApiKind, string> = {\n class: 'classes',\n datatype: 'datatypes',\n enum: 'enums',\n global: 'globals',\n library: 'libraries',\n};\n\nconst MEMBER_SECTIONS = [\n 'properties',\n 'methods',\n 'events',\n 'callbacks',\n 'constructors',\n 'functions',\n 'items',\n 'constants',\n 'math_operations',\n];\n\nlet remoteTreeCache: { path: string; type: string }[] | null = null;\n\nexport async function getRobloxApiReference(\n name: string,\n opts: DocsOptions & { kind?: RobloxApiKind | 'any' } = {},\n): Promise<RobloxApiReference> {\n const normalizedName = normalizeLookupName(name);\n const kinds = opts.kind && opts.kind !== 'any'\n ? [opts.kind]\n : (Object.keys(KIND_FOLDERS) as RobloxApiKind[]);\n\n for (const kind of kinds) {\n const doc = await readReferenceYaml(normalizedName, kind, opts);\n if (!doc) continue;\n\n const reference = parseReferenceYaml(doc.content, {\n kind,\n sourceUrl: doc.sourceUrl,\n });\n markDefinedOn(reference, reference.name);\n\n if (opts.includeInherited && reference.kind === 'class') {\n const inherited = await collectInheritedMembers(reference, opts, new Set([reference.name]));\n reference.inheritedClasses = inherited.classes;\n reference.inheritedMembers = inherited.members;\n }\n\n return reference;\n }\n\n throw new Error(`Roblox API reference not found for \"${name}\"`);\n}\n\nasync function collectInheritedMembers(\n reference: RobloxApiReference,\n opts: DocsOptions,\n visited: Set<string>,\n): Promise<{ classes: string[]; members: Record<string, RobloxApiMember[]> }> {\n const classes: string[] = [];\n const members: Record<string, RobloxApiMember[]> = {};\n\n for (const parent of reference.inherits) {\n if (!parent || visited.has(parent)) continue;\n visited.add(parent);\n\n const doc = await readReferenceYaml(parent, 'class', opts);\n if (!doc) continue;\n\n const parentReference = parseReferenceYaml(doc.content, {\n kind: 'class',\n sourceUrl: doc.sourceUrl,\n });\n markDefinedOn(parentReference, parentReference.name);\n\n classes.push(parentReference.name);\n mergeMembers(members, parentReference.members);\n\n const inherited = await collectInheritedMembers(parentReference, opts, visited);\n classes.push(...inherited.classes);\n mergeMembers(members, inherited.members);\n }\n\n return { classes, members };\n}\n\nfunction markDefinedOn(reference: RobloxApiReference, className: string): void {\n for (const section of Object.values(reference.members)) {\n for (const member of section) {\n member.definedOn = className;\n }\n }\n}\n\nfunction mergeMembers(\n target: Record<string, RobloxApiMember[]>,\n source: Record<string, RobloxApiMember[]>,\n): void {\n for (const [section, members] of Object.entries(source)) {\n target[section] ??= [];\n target[section].push(...members);\n }\n}\n\nexport async function searchRobloxApi(\n query: string,\n opts: DocsOptions & { kind?: RobloxApiKind | 'any'; limit?: number } = {},\n): Promise<RobloxApiSearchResult[]> {\n const limit = Math.max(1, Math.min(opts.limit ?? 10, 50));\n const normalizedQuery = normalizeSearchText(query);\n const kinds = opts.kind && opts.kind !== 'any'\n ? [opts.kind]\n : (Object.keys(KIND_FOLDERS) as RobloxApiKind[]);\n\n const entries = await listReferenceEntries(opts);\n return entries\n .filter((entry) => kinds.includes(entry.kind))\n .map((entry) => ({\n ...entry,\n score: scoreSearchResult(normalizedQuery, entry.name, entry.kind),\n }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))\n .slice(0, limit);\n}\n\nexport function parseReferenceYaml(\n raw: string,\n opts: { kind?: RobloxApiKind; sourceUrl?: string } = {},\n): RobloxApiReference {\n const kind = opts.kind ?? normalizeKind(readTopScalar(raw, 'type')) ?? 'class';\n const members: Record<string, RobloxApiMember[]> = {};\n\n for (const section of MEMBER_SECTIONS) {\n const parsed = parseMemberSection(raw, section);\n if (parsed.length > 0) {\n members[section] = parsed;\n }\n }\n\n return {\n name: readTopScalar(raw, 'name') || 'Unknown',\n kind,\n summary: cleanDocText(readTopScalar(raw, 'summary')),\n description: cleanDocText(readTopScalar(raw, 'description')),\n inherits: readTopList(raw, 'inherits'),\n tags: readTopList(raw, 'tags'),\n deprecationMessage: cleanDocText(readTopScalar(raw, 'deprecation_message')),\n sourceUrl: opts.sourceUrl ?? '',\n members,\n };\n}\n\nfunction normalizeKind(value: string): RobloxApiKind | undefined {\n if (value === 'class' || value === 'datatype' || value === 'enum' || value === 'global' || value === 'library') {\n return value;\n }\n return undefined;\n}\n\nasync function readReferenceYaml(\n name: string,\n kind: RobloxApiKind,\n opts: DocsOptions,\n): Promise<{ content: string; sourceUrl: string } | null> {\n const localRoot = resolveDocsRoot(opts.docsRoot);\n const folder = KIND_FOLDERS[kind];\n const fileName = `${name}.yaml`;\n\n if (localRoot) {\n const localPath = path.join(localRoot, folder, fileName);\n if (fs.existsSync(localPath)) {\n return {\n content: fs.readFileSync(localPath, 'utf-8'),\n sourceUrl: toCreatorDocsUrl(kind, name),\n };\n }\n }\n\n const sourceUrl = `${GITHUB_RAW_BASE}/${folder}/${encodeURIComponent(fileName)}`;\n try {\n return {\n content: await fetchText(sourceUrl),\n sourceUrl: toCreatorDocsUrl(kind, name),\n };\n } catch {\n return null;\n }\n}\n\nasync function listReferenceEntries(opts: DocsOptions): Promise<RobloxApiSearchResult[]> {\n const localRoot = resolveDocsRoot(opts.docsRoot);\n if (localRoot) {\n const entries: RobloxApiSearchResult[] = [];\n for (const [kind, folder] of Object.entries(KIND_FOLDERS) as [RobloxApiKind, string][]) {\n const dir = path.join(localRoot, folder);\n if (!fs.existsSync(dir)) continue;\n\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith('.yaml')) continue;\n const name = path.basename(file, '.yaml');\n entries.push({ name, kind, score: 0, sourceUrl: toCreatorDocsUrl(kind, name) });\n }\n }\n return entries;\n }\n\n const tree = await getRemoteTree();\n const prefix = 'content/en-us/reference/engine/';\n return tree\n .filter((entry) => entry.type === 'blob')\n .map((entry) => entry.path)\n .filter((entryPath) => entryPath.startsWith(prefix) && entryPath.endsWith('.yaml'))\n .flatMap((entryPath) => {\n const rest = entryPath.slice(prefix.length);\n const [folder, file] = rest.split('/');\n const kind = folderToKind(folder);\n if (!kind || !file) return [];\n\n const name = path.basename(file, '.yaml');\n return [{ name, kind, score: 0, sourceUrl: toCreatorDocsUrl(kind, name) }];\n });\n}\n\nasync function getRemoteTree(): Promise<{ path: string; type: string }[]> {\n if (remoteTreeCache) return remoteTreeCache;\n\n const payload = JSON.parse(await fetchText(GITHUB_TREE_URL)) as {\n tree?: { path: string; type: string }[];\n };\n remoteTreeCache = payload.tree ?? [];\n return remoteTreeCache;\n}\n\nfunction folderToKind(folder: string): RobloxApiKind | undefined {\n for (const [kind, value] of Object.entries(KIND_FOLDERS) as [RobloxApiKind, string][]) {\n if (value === folder) return kind;\n }\n return undefined;\n}\n\nfunction resolveDocsRoot(explicitRoot?: string): string | null {\n const candidates = [\n explicitRoot,\n process.env.ROBLOX_CREATOR_DOCS_PATH,\n path.join(process.cwd(), '.tmp', 'creator-docs'),\n ].filter(Boolean) as string[];\n\n for (const candidate of candidates) {\n const normalized = normalizeDocsRoot(candidate);\n if (normalized && fs.existsSync(normalized)) return normalized;\n }\n\n return null;\n}\n\nfunction normalizeDocsRoot(root: string): string | null {\n const engineRoot = path.join(root, 'content', 'en-us', 'reference', 'engine');\n if (fs.existsSync(engineRoot)) return engineRoot;\n\n const directClasses = path.join(root, 'classes');\n if (fs.existsSync(directClasses)) return root;\n\n return null;\n}\n\nfunction normalizeLookupName(name: string): string {\n const trimmed = name.trim();\n const ownerName = trimmed.split(':')[0];\n const lastToken = ownerName.split('.').pop() ?? ownerName;\n return lastToken.replace(/[^A-Za-z0-9_]/g, '');\n}\n\nfunction normalizeSearchText(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_]+/g, '');\n}\n\nfunction scoreSearchResult(query: string, name: string, kind: RobloxApiKind): number {\n if (!query) return 1;\n\n const normalizedName = normalizeSearchText(name);\n if (normalizedName === query) return 100;\n if (normalizedName.startsWith(query)) return 75;\n if (normalizedName.includes(query)) return 50;\n\n const kindScore = kind.includes(query) ? 10 : 0;\n return kindScore;\n}\n\nfunction toCreatorDocsUrl(kind: RobloxApiKind, name: string): string {\n return `https://create.roblox.com/docs/reference/engine/${KIND_FOLDERS[kind]}/${name}`;\n}\n\nasync function fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { 'User-Agent': 'Dominus Roblox API docs lookup' },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);\n }\n return response.text();\n}\n\nfunction readTopScalar(raw: string, key: string): string {\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n return readYamlValue(lines, i, 0, match[1]);\n }\n return '';\n}\n\nfunction readTopList(raw: string, key: string): string[] {\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n\n const inline = match[1].trim();\n if (inline === '[]' || inline === '') {\n if (inline === '[]') return [];\n return readIndentedList(lines, i + 1, 2);\n }\n return [unquote(inline)];\n }\n return [];\n}\n\nfunction parseMemberSection(raw: string, section: string): RobloxApiMember[] {\n const sectionLines = extractTopSection(raw, section);\n if (sectionLines.length === 0) return [];\n\n const items = splitMemberItems(sectionLines);\n return items\n .map((item) => parseMemberItem(item, section))\n .filter((item): item is RobloxApiMember => Boolean(item));\n}\n\nfunction extractTopSection(raw: string, section: string): string[] {\n const lines = raw.split(/\\r?\\n/);\n const start = lines.findIndex((line) => line === `${section}:`);\n if (start === -1) return [];\n\n const result: string[] = [];\n for (let i = start + 1; i < lines.length; i++) {\n if (/^[A-Za-z_][A-Za-z0-9_]*:/.test(lines[i])) break;\n result.push(lines[i]);\n }\n return result;\n}\n\nfunction splitMemberItems(lines: string[]): string[][] {\n const items: string[][] = [];\n let current: string[] = [];\n\n for (const line of lines) {\n if (/^ - /.test(line)) {\n if (current.length > 0) items.push(current);\n current = [line];\n continue;\n }\n if (current.length > 0) current.push(line);\n }\n\n if (current.length > 0) items.push(current);\n return items;\n}\n\nfunction parseMemberItem(lines: string[], section: string): RobloxApiMember | null {\n const name = readMemberScalar(lines, 'name');\n if (!name) return null;\n\n const member: RobloxApiMember = {\n name,\n memberType: section,\n type: readMemberScalar(lines, 'type') || readMemberScalar(lines, 'return_type'),\n summary: cleanDocText(readMemberScalar(lines, 'summary')),\n description: cleanDocText(readMemberScalar(lines, 'description')),\n parameters: readNestedObjects(lines, 'parameters'),\n returns: readNestedObjects(lines, 'returns'),\n tags: readMemberList(lines, 'tags'),\n security: readSecurity(lines),\n threadSafety: readMemberScalar(lines, 'thread_safety'),\n category: readMemberScalar(lines, 'category'),\n deprecationMessage: cleanDocText(readMemberScalar(lines, 'deprecation_message')),\n };\n\n const value = Number(readMemberScalar(lines, 'value'));\n if (Number.isFinite(value)) member.value = value;\n\n return member;\n}\n\nfunction readMemberScalar(lines: string[], key: string): string {\n for (let i = 0; i < lines.length; i++) {\n const firstLinePattern = new RegExp(`^ - ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const fieldPattern = new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const firstLineMatch = lines[i].match(firstLinePattern);\n const fieldMatch = lines[i].match(fieldPattern);\n const match = firstLineMatch ?? fieldMatch;\n if (!match) continue;\n return readYamlValue(lines, i, firstLineMatch ? 2 : 4, match[1]);\n }\n return '';\n}\n\nfunction readMemberList(lines: string[], key: string): string[] {\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n const inline = match[1].trim();\n if (inline === '[]') return [];\n if (inline) return [unquote(inline)];\n return readIndentedList(lines, i + 1, 6);\n }\n return [];\n}\n\nfunction readNestedObjects(lines: string[], key: string): { name?: string; type?: string; summary?: string; default?: string }[] {\n const start = lines.findIndex((line) => line === ` ${key}:`);\n if (start === -1) return [];\n\n const nested: string[] = [];\n for (let i = start + 1; i < lines.length; i++) {\n if (/^ [A-Za-z_][A-Za-z0-9_]*:/.test(lines[i])) break;\n nested.push(lines[i]);\n }\n\n const items: string[][] = [];\n let current: string[] = [];\n for (const line of nested) {\n if (/^ - /.test(line)) {\n if (current.length > 0) items.push(current);\n current = [line];\n continue;\n }\n if (current.length > 0) current.push(line);\n }\n if (current.length > 0) items.push(current);\n\n return items.map((item) => ({\n name: readNestedScalar(item, 'name'),\n type: readNestedScalar(item, 'type'),\n summary: cleanDocText(readNestedScalar(item, 'summary')),\n default: readNestedScalar(item, 'default'),\n }));\n}\n\nfunction readNestedScalar(lines: string[], key: string): string {\n for (let i = 0; i < lines.length; i++) {\n const firstLinePattern = new RegExp(`^ - ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const fieldPattern = new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const firstLineMatch = lines[i].match(firstLinePattern);\n const fieldMatch = lines[i].match(fieldPattern);\n const match = firstLineMatch ?? fieldMatch;\n if (!match) continue;\n return readYamlValue(lines, i, firstLineMatch ? 6 : 8, match[1]);\n }\n return '';\n}\n\nfunction readSecurity(lines: string[]): { read?: string; write?: string } | undefined {\n const start = lines.findIndex((line) => line === ' security:');\n if (start === -1) return undefined;\n\n return {\n read: readIndentedScalar(lines, start + 1, 'read', 6),\n write: readIndentedScalar(lines, start + 1, 'write', 6),\n };\n}\n\nfunction readIndentedScalar(lines: string[], start: number, key: string, indent: number): string {\n const pattern = new RegExp(`^\\\\s{${indent}}${escapeRegExp(key)}:\\\\s*(.*)$`);\n for (let i = start; i < lines.length; i++) {\n if (indentOf(lines[i]) < indent) break;\n const match = lines[i].match(pattern);\n if (match) return unquote(match[1].trim());\n }\n return '';\n}\n\nfunction readYamlValue(lines: string[], index: number, indent: number, rawValue: string): string {\n const value = rawValue.trim();\n if (value === '|-' || value === '|') {\n return readBlock(lines, index + 1, indent + 2);\n }\n if (value === \"''\" || value === '\"\"') return '';\n return unquote(value);\n}\n\nfunction readBlock(lines: string[], start: number, minIndent: number): string {\n const block: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() && indentOf(line) < minIndent) break;\n block.push(line.slice(Math.min(minIndent, line.length)));\n }\n return block.join('\\n').trim();\n}\n\nfunction readIndentedList(lines: string[], start: number, indent: number): string[] {\n const pattern = new RegExp(`^\\\\s{${indent}}-\\\\s*(.*)$`);\n const values: string[] = [];\n for (let i = start; i < lines.length; i++) {\n if (lines[i].trim() && indentOf(lines[i]) < indent) break;\n const match = lines[i].match(pattern);\n if (match) values.push(unquote(match[1].trim()));\n }\n return values;\n}\n\nfunction cleanDocText(value: string): string {\n return value\n .replace(/\\r/g, '')\n .replace(/[ \\t]+\\n/g, '\\n')\n .trim();\n}\n\nfunction indentOf(line: string): number {\n return line.match(/^ */)?.[0].length ?? 0;\n}\n\nfunction unquote(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"'))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\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 a single instance in Roblox Studio. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties. For inspecting UI trees, prefer serialize_ui or get_descendants_properties.',\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 compact: {\r\n type: 'boolean',\r\n description: 'Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.',\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 compact = params.compact !== false;\r\n\r\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(\r\n CliMsg.GET_PROPERTIES,\r\n { path: params.path, compact },\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: 'get_descendants_properties',\r\n description: 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\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\", \"StarterGui.ScreenGui\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'When true (default), strips read-only, nil, deprecated, and default-valued properties to massively reduce response size. Set to false for full property dump.',\r\n },\r\n outputFile: {\r\n type: 'string',\r\n description: 'Optional file path to write the JSON result to, useful for very large trees where context limits apply.',\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 compact = params.compact !== false; // default true\r\n\r\n const response = await ctx.sendToStudio<{ success: boolean; descendants?: unknown }>(\r\n CliMsg.GET_DESCENDANTS_PROPERTIES,\r\n { path: params.path, compact },\r\n 1000 * 60 * 5, // 5 minute timeout since getting ALL descendants can take a very long time\r\n );\r\n\r\n if (params.outputFile && typeof params.outputFile === 'string') {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n const outputPath = path.resolve(process.cwd(), params.outputFile);\r\n await fs.writeFile(outputPath, JSON.stringify(response.payload, null, 2), 'utf-8');\r\n return { success: true, data: `Successfully saved descendants to ${outputPath}` };\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 'Children (array of child nodes), and properties. Properties may be ' +\r\n 'specified either flattened at the top level of the node, OR nested ' +\r\n 'under a \"properties\" / \"Properties\" / \"props\" key — both work. ' +\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} (auto-disambiguated from UDim by property name)\\n' +\r\n ' NumberRange: [min, max] or number\\n' +\r\n ' Rect: [minX, minY, maxX, maxY] or {MinX, MinY, MaxX, MaxY}\\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}\\n' +\r\n ' 2-element arrays are auto-disambiguated: AnchorPoint→Vector2, CornerRadius/Padding→UDim, etc.',\r\n },\r\n animate: {\r\n type: 'boolean',\r\n description: 'If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.',\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 animate: params.animate,\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, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'serialize_ui',\r\n description:\r\n 'Serialize an existing UI tree from Roblox Studio into create_ui-compatible JSON. ' +\r\n 'This is the reverse of create_ui — read any instance and get back a declarative JSON tree ' +\r\n 'you can modify and pass back to create_ui. Perfect for cloning, templating, or refactoring UIs.\\n\\n' +\r\n 'The output includes ClassName, Name, all non-default properties (with values converted to ' +\r\n 'JSON-friendly formats like [r,g,b] for Color3, [xS,xO,yS,yO] for UDim2, etc.), and Children.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth to serialize (default: 50)',\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<{\r\n success: boolean;\r\n tree?: unknown;\r\n error?: string;\r\n }>(CliMsg.SERIALIZE_UI, {\r\n path: params.path,\r\n maxDepth: params.maxDepth ?? 50,\r\n }, 1000 * 60 * 2);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Serialization failed' };\r\n }\r\n\r\n return { success: true, data: payload.tree };\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: 'move_instance',\r\n description:\r\n 'Move (reparent) an instance to a new parent in Roblox Studio. ' +\r\n 'This preserves the instance and all its descendants — much better than delete + recreate. ' +\r\n 'Sets a ChangeHistoryService waypoint so the move can be undone.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full path of the instance to move (e.g. \"Workspace.OldFolder.MyPart\")',\r\n },\r\n newParent: {\r\n type: 'string',\r\n description: 'Full path of the new parent (e.g. \"Workspace.NewFolder\")',\r\n },\r\n },\r\n required: ['path', 'newParent'],\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 newPath?: string;\r\n error?: string;\r\n }>(CliMsg.MOVE_INSTANCE, {\r\n path: params.path,\r\n newParent: params.newParent,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Move failed' };\r\n }\r\n\r\n return { success: true, data: { newPath: payload.newPath } };\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: 'bulk_set_properties',\r\n description:\r\n 'Set properties on multiple instances at once in a single call. ' +\r\n 'Much faster than calling set_properties repeatedly. Supports two modes:\\n' +\r\n '1. Explicit paths: provide an array of {path, properties} objects\\n' +\r\n '2. By class filter: provide a root path, className filter, and properties to apply to all matches\\n\\n' +\r\n 'Filter mode also supports addChildren: insert child instances (e.g. UIStroke, UICorner) on every match. ' +\r\n 'Idempotent — skips if a child of that class already exists.\\n\\n' +\r\n 'Example (explicit): targets=[{\"path\": \"StarterGui.HUD.Title\", \"properties\": {\"TextColor3\": \"#fff\"}}]\\n' +\r\n 'Example (filter): root=\"StarterGui.HUD\", className=\"TextLabel\", properties={\"Font\": \"RobotoBold\"}\\n' +\r\n 'Example (addChildren): root=\"StarterGui.HUD\", className=\"TextLabel\", addChildren=[{\"ClassName\": \"UIStroke\", \"Color\": \"#000000\", \"Thickness\": 1.5}]',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n targets: {\r\n type: 'array',\r\n description: 'Array of {path, properties} objects for explicit mode.',\r\n items: {\r\n type: 'object',\r\n description: 'A target with path and properties to set.',\r\n },\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root instance path to search under (filter mode)',\r\n },\r\n className: {\r\n type: 'string',\r\n description: 'Only apply to instances of this ClassName (filter mode)',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Properties to set on all matched instances (filter mode)',\r\n },\r\n addChildren: {\r\n type: 'array',\r\n description: 'Child instances to insert on every match (filter mode). Each item: {ClassName, Name?, ...props}. Idempotent — skips if child of that class already exists.',\r\n items: {\r\n type: 'object',\r\n description: 'Child instance spec with ClassName and properties',\r\n },\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<{\r\n success: boolean;\r\n modified?: number;\r\n errors?: string[];\r\n error?: string;\r\n }>(CliMsg.BULK_SET_PROPERTIES, {\r\n targets: params.targets,\r\n root: params.root,\r\n className: params.className,\r\n properties: params.properties,\r\n addChildren: params.addChildren,\r\n }, 1000 * 60);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Bulk set failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n modified: payload.modified,\r\n errors: payload.errors?.length ? payload.errors : undefined,\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: 'find_replace_scripts',\r\n description:\r\n 'Find and replace text across all scripts in the game (or under a root path). ' +\r\n 'Supports plain text and Lua pattern matching. Returns a list of modified scripts with match counts.\\n\\n' +\r\n 'Use dryRun=true to preview changes without applying them.\\n' +\r\n 'Example: find=\"workspace\" replace=\"Workspace\" root=\"ServerScriptService\"',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n find: {\r\n type: 'string',\r\n description: 'Text or Lua pattern to search for',\r\n },\r\n replace: {\r\n type: 'string',\r\n description: 'Replacement text (supports Lua pattern captures like %1, %2)',\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root path to limit search scope (optional, searches entire game if omitted)',\r\n },\r\n usePattern: {\r\n type: 'boolean',\r\n description: 'If true, treat find/replace as Lua patterns. Default: false (plain text)',\r\n },\r\n dryRun: {\r\n type: 'boolean',\r\n description: 'If true, report matches but do not modify scripts. Default: false',\r\n },\r\n },\r\n required: ['find', 'replace'],\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 modified?: { path: string; matches: number }[];\r\n totalMatches?: number;\r\n totalFiles?: number;\r\n error?: string;\r\n }>(CliMsg.FIND_REPLACE_SCRIPTS, {\r\n find: params.find,\r\n replace: params.replace,\r\n root: params.root,\r\n usePattern: params.usePattern ?? false,\r\n dryRun: params.dryRun ?? false,\r\n }, 1000 * 60 * 5);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Find/replace failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n totalFiles: payload.totalFiles,\r\n totalMatches: payload.totalMatches,\r\n modified: payload.modified,\r\n dryRun: params.dryRun ?? false,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\nimport { searchRobloxApi } from '../../docs/roblox-api.js';\n\nexport const tool: Tool = {\n name: 'search_roblox_api',\n description:\n 'Search Roblox Creator Docs engine API reference names. Use this when you are unsure of an exact class, enum, datatype, global, or library name.',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Name fragment to search, e.g. \"Text\", \"Run\", \"UDim\", \"FrameStyle\"',\n },\n kind: {\n type: 'string',\n description: 'Optional reference kind filter.',\n enum: ['any', 'class', 'datatype', 'enum', 'global', 'library'],\n default: 'any',\n },\n limit: {\n type: 'number',\n description: 'Maximum results to return (default: 10, max: 50)',\n default: 10,\n },\n },\n required: ['query'],\n },\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n try {\n const results = await searchRobloxApi(String(params.query ?? ''), {\n kind: (params.kind as 'any') ?? 'any',\n limit: (params.limit as number) ?? 10,\n });\n return { success: true, data: { results } };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n","import type { Tool, ToolResult } from '../types.js';\nimport { getRobloxApiReference } from '../../docs/roblox-api.js';\n\nexport const tool: Tool = {\n name: 'get_roblox_api_reference',\n description:\n 'Look up Roblox Creator Docs engine API reference for a class, datatype, enum, global, or library. ' +\n 'Works without Studio connected and includes summaries, descriptions, tags, members, parameters, returns, security, and thread safety.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'API reference name, e.g. \"Frame\", \"RunService\", \"UDim2\", \"FrameStyle\", \"task\"',\n },\n kind: {\n type: 'string',\n description: 'Optional reference kind. Use \"any\" to search all reference kinds.',\n enum: ['any', 'class', 'datatype', 'enum', 'global', 'library'],\n default: 'any',\n },\n includeInherited: {\n type: 'boolean',\n description: 'For classes, include members from inherited base classes (default: true).',\n default: true,\n },\n },\n required: ['name'],\n },\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n try {\n const reference = await getRobloxApiReference(String(params.name ?? ''), {\n kind: (params.kind as 'any') ?? 'any',\n includeInherited: params.includeInherited !== false,\n });\n return { success: true, data: reference };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\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 type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const undoTool: Tool = {\r\n name: 'undo',\r\n description:\r\n 'Undo the last action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Z. Use this to roll back mistakes.',\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<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.UNDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Undo failed' };\r\n }\r\n\r\n return { success: true, data: 'Undo performed' };\r\n },\r\n};\r\n\r\nexport const redoTool: Tool = {\r\n name: 'redo',\r\n description:\r\n 'Redo the last undone action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Y.',\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<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.REDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Redo failed' };\r\n }\r\n\r\n return { success: true, data: 'Redo performed' };\r\n },\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 connectionId: string;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface PlaceInfo {\n placeId: number;\n connectionId: string;\n placeName?: string;\n studioVersion?: string;\n connectedAt: number;\n active: boolean;\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 /** List all connected Studio instances */\n listConnections(): PlaceInfo[];\n /** Get/set which placeId is the active target. 0 = auto (single connection). */\n getActivePlaceId(): number;\n setActivePlaceId(placeId: number): void;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n /** All connected Studio instances, keyed by placeId (0 for unknown) */\n private studioClients = new Map<number, StudioConnection>();\n /** Reverse lookup: ws → placeId */\n private wsToPlaceId = new Map<WebSocket, number>();\n /** Which placeId to target. 0 = auto-select if only one is connected. */\n private activePlaceId = 0;\n private controllers = new Set<WebSocket>();\n private pendingRequests = new Map<\n string,\n {\n resolve: (msg: WsMessage) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n targetWs: WebSocket;\n targetPlaceId: number;\n }\n >();\n private relayRequests = new Map<\n string,\n {\n controllerWs: WebSocket;\n targetWs: WebSocket;\n targetPlaceId: number;\n }\n >();\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 connections: this.listConnections(),\n activePlaceId: this.activePlaceId,\n })));\n return;\n }\n }\n\n if (this.controllers.has(ws)) {\n this.handleControllerMessage(ws, msg);\n } else {\n this.handleStudioMessage(ws, 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, relay] of this.relayRequests) {\n if (relay.controllerWs === ws) this.relayRequests.delete(id);\n }\n } else {\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n this.studioClients.delete(placeId);\n this.wsToPlaceId.delete(ws);\n this.emit('studio:disconnected', { placeId, placeName: conn?.placeName });\n this.broadcastToControllers('studio:disconnected', { placeId, placeName: conn?.placeName });\n // Reject pending requests that were targeting this ws\n for (const [id, pending] of this.pendingRequests) {\n if (pending.targetWs === ws) {\n clearTimeout(pending.timer);\n pending.reject(new Error(`Studio disconnected (place ${placeId})`));\n this.pendingRequests.delete(id);\n }\n }\n for (const [id, relay] of this.relayRequests) {\n if (relay.targetWs === ws) {\n if (relay.controllerWs.readyState === WebSocket.OPEN) {\n relay.controllerWs.send(serializeMessage({\n id,\n type: StudioMsg.RESPONSE,\n payload: { error: `Studio disconnected (place ${placeId})` },\n ts: Date.now(),\n }));\n }\n this.relayRequests.delete(id);\n }\n }\n // If the active place disconnected, reset to auto\n if (this.activePlaceId === placeId) {\n this.activePlaceId = 0;\n this.broadcastTargetState();\n }\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 const payload = msg.payload as StudioConnectedPayload;\n const placeId = payload.placeId ?? 0;\n\n // If same placeId reconnects, close the old one\n const existing = this.studioClients.get(placeId);\n if (existing && existing.ws !== ws) {\n existing.ws.close();\n this.wsToPlaceId.delete(existing.ws);\n }\n\n const conn: StudioConnection = {\n ws,\n connectionId: `${placeId}:${Date.now()}:${Math.random().toString(36).slice(2, 8)}`,\n connectedAt: Date.now(),\n studioVersion: payload.studioVersion,\n placeId,\n placeName: payload.placeName,\n };\n this.studioClients.set(placeId, conn);\n this.wsToPlaceId.set(ws, placeId);\n\n if (this.studioClients.size === 1 && this.activePlaceId === 0) {\n this.activePlaceId = placeId;\n }\n\n this.emit('studio:connected', { ...payload, placeId, connectionId: conn.connectionId });\n this.broadcastToControllers('studio:connected', { ...payload, placeId, connectionId: conn.connectionId });\n this.broadcastTargetState();\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 (msg.type === 'controller:set_active_place') {\n const payload = msg.payload as { placeId?: number };\n try {\n this.setActivePlaceId(Number(payload.placeId ?? 0));\n } catch (err) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { success: false, error: err instanceof Error ? err.message : String(err) },\n ts: Date.now(),\n }));\n return;\n }\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { success: true, activePlaceId: this.activePlaceId, connections: this.listConnections() },\n ts: Date.now(),\n }));\n return;\n }\n\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { error: this.getTargetError() },\n ts: Date.now(),\n }));\n return;\n }\n\n this.relayRequests.set(msg.id, {\n controllerWs,\n targetWs: target.ws,\n targetPlaceId: target.placeId ?? 0,\n });\n target.ws.send(serializeMessage(msg));\n }\n\n private handleStudioMessage(ws: WebSocket, msg: WsMessage): void {\n if (msg.type === StudioMsg.CONNECTED) {\n // Re-handshake — update existing connection info\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n if (conn) {\n conn.studioVersion = payload.studioVersion;\n conn.placeId = payload.placeId;\n conn.placeName = payload.placeName;\n }\n }\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n if (!this.wsToPlaceId.has(ws)) return;\n // Check if this is a relayed request from a controller\n const relay = this.relayRequests.get(msg.id);\n if (relay) {\n if (relay.targetWs !== ws) {\n this.emit('server:error', new Error(`Ignoring relayed response ${msg.id} from non-target Studio`));\n return;\n }\n if (relay.controllerWs.readyState === WebSocket.OPEN) {\n relay.controllerWs.send(serializeMessage(msg));\n }\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 if (pending.targetWs !== ws) {\n this.emit('server:error', new Error(`Ignoring response ${msg.id} from non-target Studio`));\n return;\n }\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 /** Resolve which Studio connection to target */\n private resolveTarget(): StudioConnection | null {\n if (this.studioClients.size === 0) return null;\n\n // Explicit active place\n if (this.activePlaceId !== 0) {\n const conn = this.studioClients.get(this.activePlaceId);\n if (conn && conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Auto: if exactly one connection, use it\n if (this.studioClients.size === 1) {\n const conn = this.studioClients.values().next().value!;\n if (conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Multiple connections, no active set — return null (ambiguous)\n return null;\n }\n\n /** Generate an appropriate error message when no target found */\n private getTargetError(): string {\n if (this.studioClients.size === 0) return 'No Studio connection';\n if (this.activePlaceId !== 0) {\n return `Active place ${this.activePlaceId} is not connected. Use set_active_place or list_connections.`;\n }\n const places = [...this.studioClients.values()].map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`);\n return `Multiple Studio instances connected: ${places.join(', ')}. Use set_active_place to choose one.`;\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n reject(new Error(this.getTargetError()));\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 targetWs: target.ws,\n targetPlaceId: target.placeId ?? 0,\n });\n\n target.ws.send(serializeMessage(msg));\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) return;\n const msg = createMessage(type, payload);\n target.ws.send(serializeMessage(msg));\n }\n\n isConnected(): boolean {\n return this.resolveTarget() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.resolveTarget();\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.studioClients.values()]\n .filter(c => c.ws.readyState === WebSocket.OPEN)\n .map(c => ({\n placeId: c.placeId ?? 0,\n connectionId: c.connectionId,\n placeName: c.placeName,\n studioVersion: c.studioVersion,\n connectedAt: c.connectedAt,\n active: (this.activePlaceId === 0 && this.studioClients.size === 1)\n || c.placeId === this.activePlaceId,\n }));\n }\n\n getActivePlaceId(): number {\n return this.activePlaceId;\n }\n\n setActivePlaceId(placeId: number): void {\n if (placeId !== 0 && !this.studioClients.has(placeId)) {\n throw new Error(`Place ${placeId} is not connected`);\n }\n this.activePlaceId = placeId;\n this.broadcastTargetState();\n }\n\n private broadcastTargetState(): void {\n this.broadcastToControllers('controller:target_state', {\n activePlaceId: this.activePlaceId,\n connections: this.listConnections(),\n });\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n for (const conn of this.studioClients.values()) {\n conn.ws.close();\n }\n this.studioClients.clear();\n this.wsToPlaceId.clear();\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 { 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, PlaceInfo } 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 connections = new Map<number, Omit<StudioConnection, 'ws'>>();\r\n private activePlaceId = 0;\r\n private pendingRequests = new Map<\n string,\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\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') {\n const p = msg.payload as {\r\n studioConnected: boolean;\r\n connections?: PlaceInfo[];\r\n activePlaceId?: number;\r\n };\r\n this.studioConnected = p.studioConnected;\r\n if (p.connections) {\n this.connections.clear();\n for (const c of p.connections) {\n this.connections.set(c.placeId, toConnectionInfo(c));\n }\n }\n if (p.activePlaceId !== undefined) {\r\n this.activePlaceId = p.activePlaceId;\r\n }\r\n if (this.studioConnected) {\r\n this.emit('studio:connected', {});\r\n }\r\n return;\n }\n\n if (msg.type === 'controller:target_state') {\n const payload = msg.payload as { activePlaceId?: number; connections?: PlaceInfo[] };\n this.applyTargetState(payload);\n this.emit('controller:target_state', payload);\n return;\n }\n\r\n if (msg.type === 'studio:connected') {\r\n this.studioConnected = true;\r\n const payload = msg.payload as StudioConnectedPayload & { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\n this.connections.set(placeId, {\n connectedAt: Date.now(),\n connectionId: payload.connectionId ?? `${placeId}`,\n studioVersion: payload.studioVersion,\n placeId,\n placeName: payload.placeName,\n });\r\n this.emit('studio:connected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:disconnected') {\r\n const payload = msg.payload as { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\r\n this.connections.delete(placeId);\r\n if (this.connections.size === 0) {\r\n this.studioConnected = false;\r\n }\r\n if (this.activePlaceId === placeId) {\n this.activePlaceId = 0;\n }\n this.studioConnected = this.resolveTargetInfo() !== null;\n this.emit('studio:disconnected', payload);\n return;\n }\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>> {\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 {\n return this.resolveTargetInfo() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n const target = this.resolveTargetInfo();\n if (!target) return null;\n return { ...target, ws: this.ws! } as StudioConnection;\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.connections.values()].map(c => ({\n placeId: c.placeId ?? 0,\n connectionId: c.connectionId,\n placeName: c.placeName,\n studioVersion: c.studioVersion,\n connectedAt: c.connectedAt,\n active: (this.activePlaceId === 0 && this.connections.size === 1)\n || c.placeId === this.activePlaceId,\n }));\n }\n\r\n getActivePlaceId(): number {\r\n return this.activePlaceId;\r\n }\r\n\r\n setActivePlaceId(placeId: number): void {\n if (placeId !== 0 && !this.connections.has(placeId)) {\n throw new Error(`Place ${placeId} is not connected`);\n }\n this.activePlaceId = placeId;\n if (this.ws?.readyState === WebSocket.OPEN) {\n const msg = createMessage('controller:set_active_place', { placeId });\n this.ws.send(serializeMessage(msg));\n }\n }\n\n private applyTargetState(payload: TargetStatePayload): void {\n if (payload.activePlaceId !== undefined) {\n this.activePlaceId = payload.activePlaceId;\n }\n if (payload.connections) {\n this.connections.clear();\n for (const c of payload.connections) {\n this.connections.set(c.placeId, toConnectionInfo(c));\n }\n }\n this.studioConnected = this.resolveTargetInfo() !== null;\n }\n\n private resolveTargetInfo(): Omit<StudioConnection, 'ws'> | null {\n if (this.connections.size === 0) return null;\n\n if (this.activePlaceId !== 0) {\n return this.connections.get(this.activePlaceId) ?? null;\n }\n\n if (this.connections.size === 1) {\n return this.connections.values().next().value ?? null;\n }\n\n return null;\n }\n\n getPort(): number {\n return this.port;\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}\n\ninterface TargetStatePayload {\n activePlaceId?: number;\n connections?: PlaceInfo[];\n}\n\nfunction toConnectionInfo(c: PlaceInfo): Omit<StudioConnection, 'ws'> {\n return {\n connectedAt: c.connectedAt,\n connectionId: c.connectionId,\n studioVersion: c.studioVersion,\n placeId: c.placeId,\n placeName: c.placeName,\n };\n}\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 { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { z } from 'zod';\r\nimport { DominusServer, type StudioBridge } from '../transport/ws-server.js';\r\nimport { DominusClient, isPortInUse } from '../transport/ws-client.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';\nimport { initMemoryStore, recallFacts, storeFact, getScriptIndex } from '../memory/store.js';\nimport { createConfigAccess, loadConfig } from '../config/config.js';\nimport { INTERNAL_MEMORY } from '../agent/internal-memory.js';\nimport { getRobloxApiReference, searchRobloxApi } from '../docs/roblox-api.js';\nimport { AIProvider } from '../ai/provider.js';\nimport { MultiAgentCoordinator } from '../agent/multi-agent/coordinator.js';\nimport { createDefaultRegistry } from '../tools/registry.js';\nimport type { ToolContext } from '../tools/types.js';\n\r\nlet bridge: StudioBridge;\r\n\r\nexport async function startMcpServer(): Promise<void> {\r\n const config = loadConfig();\r\n await initMemoryStore();\r\n\r\n const portTaken = await isPortInUse(config.port);\r\n if (portTaken) {\r\n const client = new DominusClient(config.port);\r\n await client.connect();\r\n bridge = client;\r\n } else {\r\n const server = new DominusServer(config.port);\r\n await server.start();\r\n bridge = server;\r\n }\r\n\r\n const mcp = new McpServer({\r\n name: 'dominus',\r\n version: '2.0.0',\n }, {\r\n instructions: INTERNAL_MEMORY,\r\n });\r\n\r\n // --- Helpers: safe Lua string generation ---\r\n /** Escape a string for safe embedding in Lua code */\r\n function luaStr(s: string): string {\r\n return `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\r\n }\r\n /** Convert a dot-path like \"Workspace.Folder.Part\" to game[\"Workspace\"][\"Folder\"][\"Part\"] */\r\n function resolvePath(dotPath: string): string {\r\n const parts = dotPath.split('.');\r\n let r = 'game';\r\n for (const p of parts) r += `[${luaStr(p)}]`;\r\n return r;\r\n }\r\n\r\n // --- Code Generation Helpers ---\r\n\r\n /** Round a number to 3 decimal places, drop trailing zeros. Integers stay as-is. */\r\n function cleanNum(n: number): string {\r\n if (Number.isInteger(n)) return String(n);\r\n // Round to 3 decimals, strip trailing zeros\r\n const rounded = Math.round(n * 1000) / 1000;\r\n return String(rounded);\r\n }\r\n\r\n /** Convert a serialized UI tree node into a Roact/React createElement call */\r\n function generateComponentCode(\r\n tree: Record<string, unknown>,\r\n componentName: string,\r\n framework: string,\r\n ): string {\r\n const isReact = framework === 'react';\r\n const lib = isReact ? 'React' : 'Roact';\r\n\r\n const lines: string[] = [];\r\n lines.push(`local ${lib} = require(game.ReplicatedStorage.Packages.${isReact ? 'React' : 'Roact'})`);\r\n if (isReact) {\r\n lines.push(`local e = React.createElement`);\r\n } else {\r\n lines.push(`local e = Roact.createElement`);\r\n }\r\n lines.push('');\r\n\r\n // Collect all ClassName types used so we can note them\r\n lines.push(`local function ${componentName}()`);\r\n lines.push(`\\treturn ${renderNode(tree, 1)}`);\r\n lines.push('end');\r\n lines.push('');\r\n lines.push(`return ${componentName}`);\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n function renderNode(node: Record<string, unknown>, depth: number): string {\r\n const indent = '\\t'.repeat(depth);\r\n const indent2 = '\\t'.repeat(depth + 1);\r\n const className = (node.ClassName as string) || 'Frame';\r\n const children = (node.Children as Record<string, unknown>[]) || [];\r\n const name = node.Name as string | undefined;\r\n\r\n // Build props table\r\n const props: string[] = [];\r\n const skipKeys = new Set(['ClassName', 'Name', 'Children', 'className', 'name', 'children']);\r\n for (const [key, val] of Object.entries(node)) {\r\n if (skipKeys.has(key)) continue;\r\n props.push(`${indent2}${key} = ${luaValue(val, depth + 1)},`);\r\n }\r\n\r\n // Build children table\r\n const childEntries: string[] = [];\r\n for (const child of children) {\r\n const childName = (child.Name as string) || (child.ClassName as string) || 'Child';\r\n childEntries.push(`${indent2}${childName} = ${renderNode(child, depth + 1)},`);\r\n }\r\n\r\n // Combine\r\n const hasProps = props.length > 0;\r\n const hasChildren = childEntries.length > 0;\r\n\r\n if (!hasProps && !hasChildren) {\r\n return `e(\"${className}\", {})`;\r\n }\r\n\r\n const parts: string[] = [];\r\n parts.push(`e(\"${className}\", {`);\r\n if (hasProps) {\r\n parts.push(...props);\r\n }\r\n if (hasChildren) {\r\n parts.push(`${indent2}}, {`);\r\n parts.push(...childEntries);\r\n parts.push(`${indent}})`);\r\n } else {\r\n parts.push(`${indent}})`);\r\n }\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n function luaValue(val: unknown, _depth: number): string {\r\n if (val === null || val === undefined) return 'nil';\r\n if (typeof val === 'boolean') return String(val);\r\n if (typeof val === 'number') return cleanNum(val);\r\n if (typeof val === 'string') {\r\n // Detect special Roblox types from serialize_ui output\r\n if (val.startsWith('#') && val.length === 7) {\r\n return `Color3.fromHex(\"${val}\")`;\r\n }\r\n // Enum-like strings (single word, PascalCase)\r\n if (/^[A-Z][a-zA-Z]+$/.test(val)) {\r\n return `\"${val}\"`; // keep as string, Roact handles enum coercion\r\n }\r\n return `\"${val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n // UDim2: [xS, xO, yS, yO]\r\n if (val.length === 4 && val.every(v => typeof v === 'number')) {\r\n return `UDim2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Vector2 / UDim: [x, y]\r\n if (val.length === 2 && val.every(v => typeof v === 'number')) {\r\n return `Vector2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Color3: [r, g, b]\r\n if (val.length === 3 && val.every(v => typeof v === 'number')) {\r\n const allSmall = val.every(v => (v as number) <= 1);\r\n if (allSmall) return `Color3.new(${val.map(cleanNum).join(', ')})`;\r\n return `Color3.fromRGB(${val.map(v => String(Math.round(v as number))).join(', ')})`;\r\n }\r\n return `{${val.map(v => luaValue(v, _depth)).join(', ')}}`;\r\n }\r\n if (typeof val === 'object') {\r\n const entries = Object.entries(val as Record<string, unknown>);\r\n if (entries.length === 0) return '{}';\r\n return `{\\n${entries.map(([k, v]) => `${'\\t'.repeat(_depth + 1)}${k} = ${luaValue(v, _depth + 1)}`).join(',\\n')}\\n${'\\t'.repeat(_depth)}}`;\r\n }\r\n return String(val);\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 bridge.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 bridge.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 arbitrary Luau code in Roblox Studio. LAST RESORT — only use when no dedicated tool exists. ' +\r\n 'Do NOT use for: reading properties (use get_properties/inspect_selection/serialize_ui), creating instances (use create_part/create_ui/insert_instance/build_multiple), ' +\r\n 'modifying properties (use set_properties/bulk_set_properties), or inspecting the tree (use get_explorer). ' +\r\n 'Valid uses: complex procedural generation, terrain algorithms, raycasting, physics queries, custom logic with no tool equivalent.',\r\n { code: z.string().describe('Luau code to execute') },\r\n async ({ code }) => {\r\n assertConnected();\r\n const res = await bridge.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 bridge.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 a single instance in Roblox Studio. Returns property name, value, type, and category. For inspecting UI trees, prefer serialize_ui (structured tree) or get_descendants_properties (flat list with compact filtering).',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.Part\", \"StarterGui.MyUI.Frame\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.'),\r\n },\r\n async ({ path, compact }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, { path, compact });\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_descendants_properties',\r\n 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n { \r\n path: z.string().describe('Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip noisy/default properties (default true). Set false for full dump.'),\r\n outputFile: z.string().optional().describe('Optional file path to write to prevent limit errors/timeouts'),\r\n },\r\n async ({ path, compact, outputFile }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_DESCENDANTS_PROPERTIES, { path, compact, outputFile }, 1000 * 60 * 5);\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 bridge.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 bridge.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 bridge.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. Returns paths and class names of all selected objects. ' +\r\n 'Use this FIRST when the user says \"my selection\" or \"what I have selected\". ' +\r\n 'Then use get_properties or serialize_ui on the returned paths to inspect details.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n const res = await bridge.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 bridge.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 bridge.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(\n 'get_class_info',\n 'Look up the schema of any Roblox class using ReflectionService. Returns all properties (with types), methods (with parameters), and events. ' +\n 'ALWAYS use this before creating or modifying GUI elements to know correct property names and types.',\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 bridge.sendRequest<unknown>(CliMsg.GET_REFLECTION, { className });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\n );\n\n mcp.tool(\n 'search_roblox_api',\n 'Search Roblox Creator Docs engine API reference names. Use when you are unsure of the exact class, enum, datatype, global, or library name. Works without Studio connected.',\n {\n query: z.string().describe('Name fragment to search, e.g. \"Text\", \"Run\", \"UDim\", \"FrameStyle\"'),\n kind: z.enum(['any', 'class', 'datatype', 'enum', 'global', 'library']).optional().default('any'),\n limit: z.number().optional().default(10).describe('Maximum results to return'),\n },\n async ({ query, kind, limit }) => {\n const results = await searchRobloxApi(query, { kind, limit });\n return { content: [{ type: 'text' as const, text: JSON.stringify({ results }, null, 2) }] };\n },\n );\n\n mcp.tool(\n 'get_roblox_api_reference',\n 'Look up Roblox Creator Docs engine API reference for a class, datatype, enum, global, or library. Includes summaries, descriptions, members, parameters, returns, security, and thread safety. Works without Studio connected.',\n {\n name: z.string().describe('API reference name, e.g. \"Frame\", \"RunService\", \"UDim2\", \"FrameStyle\", \"task\"'),\n kind: z.enum(['any', 'class', 'datatype', 'enum', 'global', 'library']).optional().default('any'),\n includeInherited: z.boolean().optional().default(true).describe('For classes, include members from inherited base classes'),\n },\n async ({ name, kind, includeInherited }) => {\n const reference = await getRobloxApiReference(name, { kind, includeInherited });\n return { content: [{ type: 'text' as const, text: JSON.stringify(reference, null, 2) }] };\n },\n );\n\n mcp.tool(\n 'run_parallel_task',\n 'Split a broad task into coordinated read-only worker agents. Workers inspect and propose scoped changes; the coordinator validates proposals and applies safe serial writes.',\n {\n goal: z.string().describe('The task to coordinate across sub-agents'),\n rootPath: z.string().optional().describe('Optional root instance path to partition work under, e.g. StarterGui.HUD'),\n maxWorkers: z.number().optional().default(3).describe('Number of workers to use, max 5'),\n constraints: z.string().optional().describe('Extra constraints workers and coordinator must follow'),\n taskType: z.string().optional().describe('Optional task type hint such as ui, script, build, refactor, or general'),\n },\n async ({ goal, rootPath, maxWorkers, constraints, taskType }) => {\n const registry = createDefaultRegistry();\n await registry.ready();\n const ai = new AIProvider(loadConfig());\n const coordinator = new MultiAgentCoordinator(ai, registry.getAll());\n const events: unknown[] = [];\n const result = await coordinator.execute(\n { goal, rootPath, maxWorkers, constraints, taskType },\n createMcpToolContext(),\n (event) => events.push(event),\n );\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({ ...result, events }, null, 2),\n }],\n };\n },\n );\n\n mcp.tool(\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 animate: z.boolean().optional().describe('If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.'),\r\n },\r\n async ({ parent, tree, animate }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; instanceCount?: number; error?: string }>(\r\n CliMsg.BUILD_UI, { parent: parent ?? 'StarterGui', tree, animate },\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 bridge.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 bridge.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 bridge.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 bridge.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 lines = [`local orig = ${resolvePath(params.path)}`, `local clone = orig:Clone()`];\r\n if (params.newName) lines.push(`clone.Name = ${luaStr(params.newName)}`);\r\n if (params.newParent) {\r\n lines.push(`clone.Parent = ${resolvePath(params.newParent)}`);\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 bridge.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. All listed instances become children of the new group.',\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\r\n const code = [\r\n `local group = Instance.new(${luaStr(gc)})`,\r\n `group.Name = ${luaStr(params.groupName)}`,\r\n `group.Parent = ${resolvePath(parent)}`,\r\n ...params.paths.map((p) => `${resolvePath(p)}.Parent = group`),\r\n `print(\"Grouped ${params.paths.length} instances into: \" .. group:GetFullName())`,\r\n ].join('\\n');\r\n\r\n const res = await bridge.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. Supports hex colors, rgb() colors, and BrickColor names.',\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\", \"rgb(r,g,b)\", or BrickColor name'),\r\n material: z.string().optional().describe('Enum.Material name: Plastic, Wood, Neon, Glass, etc.'),\r\n transparency: z.number().optional(),\r\n anchored: z.boolean().optional(),\r\n canCollide: 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 const lines: string[] = [];\r\n if (groupName) {\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = ${luaStr(groupName)}`);\r\n lines.push(`_group.Parent = ${resolvePath(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(${luaStr(cn)})`);\r\n lines.push(`${v}.Name = ${luaStr(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('#')) {\r\n lines.push(`${v}.Color = Color3.fromHex(${luaStr(p.color)})`);\r\n } else if (p.color.startsWith('rgb(')) {\r\n const m = p.color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\r\n if (m) lines.push(`${v}.Color = Color3.fromRGB(${m[1]}, ${m[2]}, ${m[3]})`);\r\n } else {\r\n lines.push(`${v}.BrickColor = BrickColor.new(${luaStr(p.color)})`);\r\n }\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.canCollide !== undefined) lines.push(`${v}.CanCollide = ${p.canCollide}`);\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' : resolvePath(p.parent ?? 'Workspace')}`);\r\n }\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n\r\n const res = await bridge.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 // --- UI Serialization ---\r\n\r\n mcp.tool(\r\n 'serialize_ui',\r\n 'Serialize an existing Roblox UI tree into a compact, create_ui-compatible JSON tree. ' +\r\n 'This is the reverse of create_ui — reads any GUI instance and returns a declarative JSON tree ' +\r\n 'with ClassName, Name, non-default properties (Color3 as hex, UDim2 as arrays, etc.), and Children. ' +\r\n 'Perfect for: converting existing UI to Roact/React components, cloning/templating, understanding UI structure, ' +\r\n 'or refactoring. Use this INSTEAD of get_descendants_properties when you need to recreate or convert UI.',\r\n {\r\n path: z.string().describe('Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")'),\r\n maxDepth: z.number().optional().default(50).describe('Maximum tree depth (default 50)'),\r\n },\r\n async ({ path, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: unknown; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success) {\r\n return { content: [{ type: 'text' as const, text: `Error: ${res.payload.error ?? 'Serialization failed'}` }] };\r\n }\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload.tree, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Composite Skill Tools ---\r\n // Higher-level tools that combine multiple operations into a single call.\r\n // These prevent LLMs from falling back to run_code for common workflows.\r\n\r\n mcp.tool(\r\n 'inspect_selection',\r\n 'Inspect the user\\'s current selection in Roblox Studio. Returns the selected instance paths AND their properties (compact) in a single call. ' +\r\n 'Use this FIRST when the user says \"my selection\", \"what I selected\", or \"the selected thing\". ' +\r\n 'Much better than calling get_selection + get_properties separately.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n // Step 1: get selection\r\n const selRes = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n const paths: string[] = selRes.payload?.paths ?? [];\r\n if (paths.length === 0) {\r\n return { content: [{ type: 'text' as const, text: 'No instances selected in Studio.' }] };\r\n }\r\n\r\n // Step 2: get compact properties for each selected instance\r\n const results: Record<string, unknown> = {};\r\n for (const p of paths.slice(0, 10)) { // cap at 10 to avoid huge payloads\r\n try {\r\n const propRes = await bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path: p, compact: true },\r\n );\r\n results[p] = propRes.payload.properties ?? propRes.payload;\r\n } catch {\r\n results[p] = { error: 'Failed to read properties' };\r\n }\r\n }\r\n if (paths.length > 10) {\r\n results['_truncated'] = `${paths.length - 10} more instances not shown`;\r\n }\r\n\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(results, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'inspect_instance',\r\n 'Inspect a single instance: returns its compact properties AND its children tree in one call. ' +\r\n 'Combines get_properties + get_explorer into a single round-trip. ' +\r\n 'Use when you need to understand an instance and its subtree.',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.MyModel\")'),\r\n childDepth: z.number().optional().default(2).describe('How deep to show the children tree (default 2)'),\r\n },\r\n async ({ path, childDepth }) => {\r\n assertConnected();\r\n // Parallel: get properties + get children tree\r\n const [propRes, treeRes] = await Promise.all([\r\n bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path, compact: true },\r\n ),\r\n bridge.sendRequest<{ tree?: ExplorerNode; error?: string }>(\r\n CliMsg.GET_EXPLORER, { rootPath: path, maxDepth: childDepth ?? 2 },\r\n ),\r\n ]);\r\n\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n properties: propRes.payload.properties ?? propRes.payload,\r\n children: treeRes.payload.tree ?? treeRes.payload,\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'convert_ui_to_code',\r\n 'Convert an existing Roblox UI tree into Roact/React-lua component code. ' +\r\n 'Serializes the UI at the given path, then generates a ready-to-use Luau component. ' +\r\n 'Use when the user asks to \"turn this into a component\", \"convert to React\", or \"make a Roact version\".',\r\n {\r\n path: z.string().describe('Path to the UI instance to convert (e.g. \"StarterGui.MyScreenGui.MainFrame\")'),\r\n framework: z.enum(['roact', 'react']).optional().default('react').describe('Target framework: \"roact\" (legacy) or \"react\" (react-lua, default)'),\r\n componentName: z.string().optional().describe('Name for the generated component (defaults to instance Name)'),\r\n },\r\n async ({ path, framework, componentName }) => {\r\n assertConnected();\r\n // Step 1: serialize the UI tree\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: Record<string, unknown>; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth: 50 }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success || !res.payload.tree) {\r\n return { content: [{ type: 'text' as const, text: `Error serializing UI: ${res.payload.error ?? 'Unknown error'}` }] };\r\n }\r\n\r\n const tree = res.payload.tree;\r\n const name = componentName || (tree.Name as string) || 'GeneratedComponent';\r\n const fw = framework || 'react';\r\n\r\n // Step 2: generate code from the serialized tree\r\n const code = generateComponentCode(tree, name, fw);\r\n return { content: [{ type: 'text' as const, text: code }] };\r\n },\r\n );\r\n\r\n // --- Connection Management Tools ---\r\n\r\n mcp.tool(\r\n 'list_connections',\r\n 'List all Roblox Studio instances currently connected to Dominus. Shows placeId, placeName, and connection time for each. Use this when working with multiple Studio windows.',\r\n {},\r\n async () => {\r\n const connections = bridge.listConnections();\r\n const activePlaceId = bridge.getActivePlaceId();\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n activePlaceId: activePlaceId || 'auto',\r\n connections: connections.map(c => ({\r\n ...c,\r\n active: activePlaceId === 0 && connections.length === 1 ? true\r\n : c.placeId === activePlaceId,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_active_place',\r\n 'Set which Roblox Studio instance to target when multiple are connected. Pass placeId=0 to reset to auto mode (works when only one is connected). ' +\r\n 'Call list_connections first to see available placeIds.',\r\n {\r\n placeId: z.number().describe('The placeId to target. Use 0 to reset to auto-select.'),\r\n },\r\n async ({ placeId }) => {\r\n const connections = bridge.listConnections();\r\n if (placeId !== 0 && !connections.some(c => c.placeId === placeId)) {\r\n const available = connections.map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`).join(', ');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Place ${placeId} is not connected. Available: ${available || 'none'}`,\r\n }],\r\n };\r\n }\r\n try {\n bridge.setActivePlaceId(placeId);\n } catch (err) {\n return {\n content: [{\n type: 'text' as const,\n text: err instanceof Error ? err.message : String(err),\n }],\n };\n }\n if (placeId === 0) {\r\n return { content: [{ type: 'text' as const, text: 'Active place reset to auto-select.' }] };\r\n }\r\n const target = connections.find(c => c.placeId === placeId);\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Active place set to ${target?.placeName ?? 'Unknown'} (${placeId})`,\r\n }],\r\n };\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 = bridge.getConnectionInfo();\r\n return {\r\n contents: [{\r\n uri: 'studio://status',\r\n text: JSON.stringify({\r\n connected: bridge.isConnected(),\r\n placeName: info?.placeName,\r\n placeId: info?.placeId,\r\n studioVersion: info?.studioVersion,\r\n port: bridge.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 {\n if (!bridge.isConnected()) {\n const connections = bridge.listConnections();\n const activePlaceId = bridge.getActivePlaceId();\n if (connections.length > 1 && activePlaceId === 0) {\n const available = connections.map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`).join(', ');\n throw new Error(`Multiple Roblox Studio instances are connected: ${available}. Use list_connections and set_active_place before running Studio tools.`);\n }\n if (connections.length > 0 && activePlaceId !== 0) {\n throw new Error(`Active Roblox Studio place ${activePlaceId} is not connected. Use list_connections and set_active_place to choose a connected Studio instance.`);\n }\n throw new Error(\n 'Roblox Studio is not connected. Open Studio and click the Dominus plugin Connect button.',\n );\n }\r\n}\n\nfunction createMcpToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number) => {\n return bridge.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => bridge.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const facts = recallFacts(projectId || 'current', query, limit);\n return facts.map((fact) => fact.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const now = Date.now();\n for (const fact of facts) {\n storeFact({\n projectId: projectId || 'current',\n content: fact.content,\n category: fact.category as any,\n source: 'mcp',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => getScriptIndex(projectId || 'current'),\n },\n config: createConfigAccess(),\n };\n}\n","/**\r\n * INTERNAL_MEMORY — lessons learned and quirks that ship with Dominus.\r\n *\r\n * These are baked into every system prompt so the agent doesn't repeat\r\n * known mistakes. Add entries here when you discover a pattern that caused\r\n * a failure, an unintuitive API, or a workaround that should be remembered.\r\n *\r\n * Keep entries short, specific, and actionable. Prefer bullet points over prose.\r\n */\r\n\r\nexport const INTERNAL_MEMORY = `## Internal Memory — Known Quirks & Lessons\r\n\r\nThese are built-in lessons that ship with Dominus. Follow them exactly.\r\n\r\n### create_ui — property format\r\n- Each node accepts properties in **either** of two shapes:\r\n - **Flattened (preferred)**: props as top-level keys next to \\`ClassName\\`, \\`Name\\`, \\`Children\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\", \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] }\r\n \\`\\`\\`\r\n - **Nested bag**: props grouped under \\`properties\\` / \\`Properties\\` / \\`props\\` / \\`Props\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\",\r\n \"properties\": { \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] } }\r\n \\`\\`\\`\r\n- Do NOT mix a nested \\`properties\\` bag with flattened props of the same name — the bag wins.\r\n- Reserved keys (never treated as instance properties): \\`ClassName\\`, \\`className\\`, \\`Name\\`, \\`name\\`, \\`Children\\`, \\`children\\`, \\`properties\\`, \\`Properties\\`, \\`props\\`, \\`Props\\`.\r\n\r\n### build_multiple — schema is strict\r\n- Top-level keys only: \\`name\\`, \\`className\\`, \\`position\\`, \\`size\\`, \\`color\\`, \\`material\\`, \\`anchored\\`, \\`shape\\`, \\`transparency\\`, \\`parent\\`, \\`canCollide\\`.\r\n- Does NOT accept a nested \\`properties\\` bag. For anything outside those fields use \\`insert_instance\\` + \\`set_properties\\`.\r\n- \\`shape\\` values: \\`Block\\`, \\`Ball\\`, \\`Cylinder\\`, \\`Wedge\\`.\r\n\r\n### Color formats (accepted everywhere)\r\n- Hex: \\`\"#RRGGBB\"\\`\r\n- RGB string: \\`\"rgb(255, 128, 0)\"\\`\r\n- BrickColor name: \\`\"Bright red\"\\`, \\`\"Institutional white\"\\`, \\`\"Really black\"\\`, etc.\r\n- Array: \\`[r, g, b]\\` (0–1 floats) or \\`[255, 128, 0]\\` (auto-detected if any value > 1)\r\n\r\n### UDim2 / UDim / Vector2 / Color3 coercion (create_ui)\r\n- UDim2: \\`[xScale, xOffset, yScale, yOffset]\\` or \\`{XScale, XOffset, YScale, YOffset}\\`.\r\n- UDim: \\`[scale, offset]\\` or a plain number (treated as pixels).\r\n- Vector2 (e.g. \\`AnchorPoint\\`): \\`[x, y]\\` or \\`{x, y}\\`.\r\n- 2-element arrays are auto-disambiguated by property name (\\`AnchorPoint\\` → Vector2, \\`CornerRadius\\` → UDim).\r\n\r\n### Common GUI property names\r\n- GUI uses \\`Size\\`/\\`Position\\` as **UDim2** — never Vector3.\r\n- \\`BackgroundColor3\\`, \\`TextColor3\\`, \\`BorderColor3\\`, \\`ImageColor3\\` → Color3.\r\n- \\`Font\\` accepts a string enum name like \\`\"GothamBold\"\\`, \\`\"SourceSans\"\\`.\r\n- Enum properties take the string name: \\`\"Center\"\\`, \\`\"Left\"\\`, \\`\"Fit\"\\`.\r\n\r\n### Tool selection cheat-sheet\r\n- Single 3D part → \\`create_part\\`\r\n- Many 3D parts (tree, building, vehicle) → \\`build_multiple\\` with \\`groupName\\`\r\n- Full UI tree → \\`create_ui\\` (one call, never loop \\`insert_instance\\` for UI)\r\n- **Convert/export existing UI → \\`serialize_ui\\`** (NOT get_descendants_properties)\r\n- Adjusting an existing instance → \\`set_properties\\` (not \\`run_code\\`)\r\n- **Inspecting user's selection → \\`get_selection\\`, then \\`get_properties\\` or \\`serialize_ui\\`**\r\n- **Reading properties → \\`get_properties\\` (NEVER \\`run_code\\` with dump scripts)**\r\n- **Browsing the tree → \\`get_explorer\\`**\r\n- **Multiple Studios open → \\`list_connections\\` to see all, \\`set_active_place\\` to target one**\r\n- Anything exotic or procedural → \\`run_code\\` as last resort\r\n\r\n### NEVER use run_code for:\r\n- Getting properties of an instance → use \\`get_properties\\` or \\`serialize_ui\\`\r\n- Dumping selection info → use \\`inspect_selection\\` (ONE call does it all)\r\n- Inspecting an instance + its children → use \\`inspect_instance\\`\r\n- Converting UI to Roact/React → use \\`convert_ui_to_code\\`\r\n- Creating instances → use \\`create_part\\`, \\`create_ui\\`, \\`insert_instance\\`, \\`build_multiple\\`\r\n- Modifying properties → use \\`set_properties\\` or \\`bulk_set_properties\\`\r\n- Bulk font/style/scaling changes → use \\`bulk_set_properties\\` with filter mode (root + className + properties)\r\n- Adding UIStroke/UICorner to many instances → use \\`bulk_set_properties\\` with \\`addChildren\\` (idempotent)\r\n- Reading scripts → use \\`read_script\\`\r\n- Browsing the explorer → use \\`get_explorer\\`\r\n\\`run_code\\` is ONLY for procedural logic, terrain generation, raycasts, physics queries, or custom algorithms with no tool equivalent.\r\n\r\n### Composite skill tools (prefer these over chaining)\r\n- \\`inspect_selection\\` — Returns paths + compact properties for all selected instances in ONE call. Use when user says \"my selection\" or \"what I selected\".\r\n- \\`inspect_instance\\` — Returns compact properties + children tree for a single instance in ONE call. Combines get_properties + get_explorer.\r\n- \\`convert_ui_to_code\\` — Serializes a UI tree and generates a Roact/React component. Use when user says \"turn this into a component\" or \"convert to React\".\r\n\r\n### UI Pre-Flight — ASK BEFORE BUILDING\r\nBefore creating any non-trivial UI (more than a single element), **ask the user these questions** to avoid rework:\r\n- **A) Device scaling** — \"Should this UI scale for mobile/tablet, or is it PC-only?\"\r\n - Mobile: use Scale-based sizing, UIAspectRatioConstraint, TextScaled or AutomaticSize, avoid large pixel offsets.\r\n - PC-only: pixel offsets are fine.\r\n- **B) ScreenGui structure** — \"All panels in one ScreenGui, or separate ScreenGuis per panel?\"\r\n - One: simpler, easy to toggle all at once.\r\n - Separate: independent ZIndex, modular show/hide.\r\n- **C) Font & style** — \"Any preferred font, color scheme, or style reference?\"\r\n - Default to Roboto if user has no preference. Use FontFace with Weight=Bold for bold.\r\n - Match screenshots closely (transparency, stroke, spacing).\r\n- Skip these only if the user already specified preferences or the task is trivially small.\r\n\r\n### Verification habits\r\n- After a build, call \\`get_explorer\\` or \\`get_selection\\` to confirm the tree looks right.\r\n- After editing a script, read it back.\r\n- After \\`run_code\\`, check \\`get_output\\` for errors.\r\n\r\n### serialize_ui — the RIGHT tool for UI conversion\r\n- **Use \\`serialize_ui\\` when converting existing UI to Roact/React/Fusion components.** It returns a minimal JSON tree with only non-default properties, already in JSON-friendly formats.\r\n- **Do NOT use \\`get_descendants_properties\\` for UI conversion** — it returns a flat list with ~50+ properties per instance (including read-only, deprecated, nil, and default values), which bloats context and confuses conversion.\r\n- \\`serialize_ui\\` output maps 1:1 to \\`create_ui\\` input — you can round-trip UI through it.\r\n- The tree structure preserves parent-child hierarchy, so Roact/React children mapping is direct.\r\n\r\n### UI → Roact/React conversion cheat-sheet\r\n- \\`serialize_ui\\` path → JSON tree → map each node to \\`Roact.createElement(ClassName, props, childrenDict)\\`\r\n- UDim2 arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n- Color3 hex strings → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n- Vector2 arrays → \\`Vector2.new(x, y)\\`\r\n- UDim arrays → \\`UDim.new(s, o)\\`\r\n- Enum strings like \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\`\r\n- FontFace → \\`Font.new(family, weight, style)\\`\r\n- UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding) are CHILDREN not props\r\n- Use instance Name as dictionary key in children table\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 { ToolCall, ToolResult, ToolContext } from '../tools/types.js';\nimport { CliMsg } from '../transport/protocol.js';\nimport type {\n PropertyEntry,\n RunCodeResponsePayload,\n ScriptContentPayload,\n} from '../transport/protocol.js';\n\nexport interface VerifyCheck {\n type: 'script_edit' | 'code_run' | 'instance_create' | 'property_set';\n path?: string;\n expectedContent?: string;\n expectedProperties?: Record<string, unknown>;\n}\n\r\nexport async function verifyAction(\r\n check: VerifyCheck,\r\n ctx: ToolContext,\r\n): Promise<ToolResult> {\r\n switch (check.type) {\r\n case 'script_edit':\r\n return verifyScriptEdit(check.path!, check.expectedContent, ctx);\r\n case 'code_run':\r\n return verifyCodeRun(ctx);\r\n case 'instance_create':\n return verifyInstanceExists(check.path!, ctx);\n case 'property_set':\n return verifyPropertySet(check.path!, check.expectedProperties ?? {}, ctx);\n default:\n return { success: true };\n }\n}\n\nexport function inferVerifyChecks(call: ToolCall, result: ToolResult): VerifyCheck[] {\n if (!result.success) return [];\n\n switch (call.name) {\n case 'edit_script':\n return [\n {\n type: 'script_edit',\n path: typeof call.arguments.path === 'string' ? call.arguments.path : undefined,\n expectedContent: typeof call.arguments.source === 'string' ? call.arguments.source : undefined,\n },\n ];\n\n case 'run_code':\n case 'execute_run_test':\n case 'execute_play_test':\n return [{ type: 'code_run' }];\n\n case 'create_ui':\n case 'create_part':\n case 'clone_instance':\n case 'insert_instance':\n case 'group_instances': {\n const createdPath = extractPath(result.data) ?? extractStringArg(call.arguments, 'path');\n return createdPath ? [{ type: 'instance_create', path: createdPath }] : [];\n }\n\n case 'set_properties':\n return [\n {\n type: 'property_set',\n path: extractStringArg(call.arguments, 'path'),\n expectedProperties: asRecord(call.arguments.properties),\n },\n ];\n\n case 'bulk_set_properties': {\n const path = extractPath(result.data) ?? extractStringArg(call.arguments, 'path');\n const properties = asRecord(call.arguments.properties);\n return path && properties ? [{ type: 'property_set', path, expectedProperties: properties }] : [];\n }\n\n default:\n return [];\n }\n}\n\r\nasync function verifyScriptEdit(\r\n scriptPath: string,\r\n expectedContent: string | undefined,\r\n ctx: ToolContext,\r\n): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio disconnected during verification' };\r\n }\r\n\r\n try {\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, {\r\n path: scriptPath,\r\n });\r\n\r\n if (!response.payload?.source) {\r\n return { success: false, error: `Could not read back script: ${scriptPath}` };\r\n }\r\n\r\n if (expectedContent && response.payload.source !== expectedContent) {\r\n return {\r\n success: false,\r\n error: 'Script content does not match expected output',\r\n data: {\r\n expected: expectedContent.slice(0, 200),\r\n actual: response.payload.source.slice(0, 200),\r\n },\r\n };\r\n }\r\n\r\n return { success: true, data: { verified: scriptPath } };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Verification failed: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n}\r\n\r\nasync function verifyCodeRun(ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio disconnected during verification' };\r\n }\r\n\r\n try {\r\n const response = await ctx.sendToStudio<{ entries: { level: string; message: string }[] }>(\r\n CliMsg.GET_OUTPUT,\r\n { limit: 5, level: 'error' },\r\n );\r\n\r\n const errors = response.payload?.entries?.filter((e) => e.level === 'error') ?? [];\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: 'Errors detected after code execution',\r\n data: { errors: errors.map((e) => e.message) },\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch {\r\n return { success: true }; // Can't verify, assume OK\r\n }\r\n}\r\n\r\nasync function verifyInstanceExists(instancePath: string, ctx: ToolContext): Promise<ToolResult> {\n if (!ctx.isStudioConnected()) {\n return { success: false, error: 'Studio disconnected during verification' };\n }\n\n try {\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, {\n code: buildInstanceExistsCode(instancePath),\n });\n\n if (response.payload.error) {\n return { success: false, error: `Instance verification failed: ${response.payload.error}` };\n }\n\n const exists = String(response.payload.output ?? '').trim().toLowerCase();\n if (!exists.includes('true')) {\n return { success: false, error: `Instance not found after creation: ${instancePath}` };\n }\n\n return { success: true, data: { exists: instancePath } };\n } catch {\n return { success: true };\n }\n}\n\nasync function verifyPropertySet(\n instancePath: string,\n expectedProperties: Record<string, unknown>,\n ctx: ToolContext,\n): Promise<ToolResult> {\n if (!ctx.isStudioConnected()) {\n return { success: false, error: 'Studio disconnected during verification' };\n }\n\n if (!instancePath || Object.keys(expectedProperties).length === 0) {\n return { success: true, data: { verified: instancePath } };\n }\n\n try {\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, {\n path: instancePath,\n compact: false,\n });\n\n const entries = response.payload?.properties ?? [];\n const byName = new Map(entries.map((entry) => [entry.name, entry.value]));\n const mismatches: string[] = [];\n\n for (const [name, expected] of Object.entries(expectedProperties)) {\n const actual = byName.get(name);\n if (actual == null) {\n mismatches.push(`${name}: missing`);\n continue;\n }\n\n if (!matchesPropertyValue(actual, expected)) {\n mismatches.push(`${name}: expected ${stringifyExpected(expected)}, got ${actual}`);\n }\n }\n\n if (mismatches.length > 0) {\n return {\n success: false,\n error: 'Property verification failed',\n data: { path: instancePath, mismatches },\n };\n }\n\n return {\n success: true,\n data: { verified: instancePath, properties: Object.keys(expectedProperties) },\n };\n } catch (err) {\n return {\n success: false,\n error: `Property verification failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction extractPath(data: unknown): string | undefined {\n if (!data || typeof data !== 'object') return undefined;\n const candidate = (data as Record<string, unknown>).path;\n return typeof candidate === 'string' ? candidate : undefined;\n}\n\nfunction extractStringArg(args: Record<string, unknown>, key: string): string | undefined {\n const value = args[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction buildInstanceExistsCode(instancePath: string): string {\n const parts = instancePath.split('.').filter(Boolean);\n const lines = ['local node = game'];\n\n for (const part of parts) {\n lines.push(`node = node and node:FindFirstChild(${luaString(part)})`);\n }\n\n lines.push('return node ~= nil');\n return lines.join('\\n');\n}\n\nfunction luaString(value: string): string {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction matchesPropertyValue(actual: string, expected: unknown): boolean {\n const normalizedActual = normalizeValue(actual);\n\n if (typeof expected === 'boolean' || typeof expected === 'number') {\n return normalizedActual === normalizeValue(String(expected));\n }\n\n if (typeof expected === 'string') {\n const normalizedExpected = normalizeValue(expected);\n return normalizedActual === normalizedExpected || normalizedActual.includes(normalizedExpected);\n }\n\n if (Array.isArray(expected)) {\n const normalizedExpected = normalizeValue(expected.join(','));\n return normalizedActual.includes(normalizedExpected);\n }\n\n if (expected && typeof expected === 'object') {\n const compactExpected = normalizeValue(JSON.stringify(expected));\n return normalizedActual.includes(compactExpected);\n }\n\n return true;\n}\n\nfunction normalizeValue(value: string): string {\n return value.replace(/[\\s{}\\[\\]\"]/g, '').toLowerCase();\n}\n\nfunction stringifyExpected(value: unknown): string {\n return typeof value === 'string' ? value : JSON.stringify(value);\n}\n","export function parseJsonResponse<T>(content: string | null): T | null {\n if (!content) return null;\n\n const trimmed = content.trim();\n const candidates = [\n trimmed,\n ...extractMarkdownJsonBlocks(trimmed),\n ...extractBalancedJsonBlocks(trimmed),\n ];\n\n for (const candidate of candidates) {\n try {\n return JSON.parse(candidate) as T;\n } catch {\n // Try the next candidate.\n }\n }\n\n return null;\n}\n\nfunction extractMarkdownJsonBlocks(content: string): string[] {\n const matches = content.match(/```(?:json)?\\s*([\\s\\S]*?)```/gi) ?? [];\n return matches\n .map((block) => block.replace(/```(?:json)?/i, '').replace(/```$/, '').trim())\n .filter(Boolean);\n}\n\nfunction extractBalancedJsonBlocks(content: string): string[] {\n const blocks: string[] = [];\n const openers = ['{', '['];\n\n for (let start = 0; start < content.length; start++) {\n if (!openers.includes(content[start])) continue;\n\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let end = start; end < content.length; end++) {\n const ch = content[end];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (ch === '\\\\') {\n escapeNext = true;\n continue;\n }\n\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (ch === '{' || ch === '[') depth++;\n if (ch === '}' || ch === ']') depth--;\n\n if (depth === 0) {\n blocks.push(content.slice(start, end + 1).trim());\n break;\n }\n }\n }\n\n return blocks;\n}\n","import type {\n AcceptedProposal,\n ProposedToolCall,\n RejectedProposal,\n WorkerAssignment,\n WorkerProposal,\n} from './types.js';\n\nexport const READ_ONLY_TOOL_NAMES = new Set([\n 'get_explorer',\n 'get_properties',\n 'get_descendants_properties',\n 'get_selection',\n 'search_scripts',\n 'read_script',\n 'get_output',\n 'get_class_info',\n 'serialize_ui',\n 'recall_memory',\n 'search_roblox_api',\n 'get_roblox_api_reference',\n]);\n\nexport const COORDINATOR_WRITE_TOOL_NAMES = new Set([\n 'create_ui',\n 'set_properties',\n 'bulk_set_properties',\n 'insert_instance',\n 'move_instance',\n]);\n\nexport const FORBIDDEN_WORKER_WRITE_TOOL_NAMES = new Set([\n 'run_code',\n 'edit_script',\n 'delete_instance',\n 'create_part',\n 'build_multiple',\n 'clone_instance',\n 'group_instances',\n 'find_replace_scripts',\n 'undo',\n 'redo',\n]);\n\nexport function normalizeScopePath(pathValue: string): string {\n return pathValue\n .trim()\n .replace(/\\[(?:\"|')([^\"']+)(?:\"|')\\]/g, '.$1')\n .replace(/^game\\./i, '')\n .replace(/\\.+/g, '.')\n .replace(/^\\./, '')\n .replace(/\\.$/, '');\n}\n\nexport function pathsOverlap(a: string, b: string): boolean {\n const left = normalizeScopePath(a).toLowerCase();\n const right = normalizeScopePath(b).toLowerCase();\n if (!left || !right) return false;\n return left === right || left.startsWith(`${right}.`) || right.startsWith(`${left}.`);\n}\n\nexport function isPathWithinScopes(pathValue: string, scopes: string[]): boolean {\n const target = normalizeScopePath(pathValue).toLowerCase();\n if (!target) return scopes.length === 0;\n\n return scopes.some((scope) => {\n const normalizedScope = normalizeScopePath(scope).toLowerCase();\n return target === normalizedScope || target.startsWith(`${normalizedScope}.`);\n });\n}\n\nexport function inferTargetPath(call: ProposedToolCall): string | undefined {\n if (call.targetPath) return call.targetPath;\n\n const args = call.args ?? {};\n for (const key of ['path', 'root', 'rootPath', 'parent', 'parentPath']) {\n const value = args[key];\n if (typeof value === 'string' && value.trim()) return value;\n }\n\n const targets = args.targets;\n if (Array.isArray(targets)) {\n const first = targets.find(\n (target) => target && typeof target === 'object' && typeof target.path === 'string',\n ) as { path?: string } | undefined;\n if (first?.path) return first.path;\n }\n\n return undefined;\n}\n\nexport function validateWorkerProposal(\n assignment: WorkerAssignment,\n proposal: WorkerProposal,\n): string[] {\n const errors: string[] = [];\n\n if (proposal.workerId !== assignment.id) {\n errors.push(`Proposal workerId \"${proposal.workerId}\" does not match assignment \"${assignment.id}\"`);\n }\n\n if (!proposal.summary?.trim()) {\n errors.push('Proposal summary is required');\n }\n\n for (const call of proposal.proposedToolCalls ?? []) {\n if (FORBIDDEN_WORKER_WRITE_TOOL_NAMES.has(call.tool)) {\n errors.push(`Worker proposed forbidden write tool \"${call.tool}\"`);\n continue;\n }\n\n if (!COORDINATOR_WRITE_TOOL_NAMES.has(call.tool)) {\n errors.push(`Worker proposed unsupported coordinator write tool \"${call.tool}\"`);\n continue;\n }\n\n const targetPath = inferTargetPath(call);\n if (!targetPath) {\n errors.push(`Proposed ${call.tool} call is missing a target path`);\n continue;\n }\n\n if (!isPathWithinScopes(targetPath, assignment.ownedScopes)) {\n errors.push(`Proposed ${call.tool} target \"${targetPath}\" is outside owned scopes`);\n }\n }\n\n return errors;\n}\n\nexport function rejectConflictingAcceptedProposals(\n accepted: AcceptedProposal[],\n): { accepted: AcceptedProposal[]; rejected: RejectedProposal[] } {\n const finalAccepted: AcceptedProposal[] = [];\n const rejected: RejectedProposal[] = [];\n const claimed: { workerId: string; path: string }[] = [];\n\n for (const item of accepted) {\n const conflict = findConflict(item.proposal, claimed);\n if (conflict) {\n rejected.push({\n workerId: item.workerId,\n proposal: item.proposal,\n reason: `Conflicts with accepted worker ${conflict.workerId} on ${conflict.path}`,\n });\n continue;\n }\n\n finalAccepted.push(item);\n for (const call of item.proposal.proposedToolCalls) {\n const targetPath = inferTargetPath(call);\n if (targetPath) claimed.push({ workerId: item.workerId, path: targetPath });\n }\n }\n\n return { accepted: finalAccepted, rejected };\n}\n\nfunction findConflict(\n proposal: WorkerProposal,\n claimed: { workerId: string; path: string }[],\n): { workerId: string; path: string } | null {\n for (const call of proposal.proposedToolCalls) {\n const targetPath = inferTargetPath(call);\n if (!targetPath) continue;\n\n for (const existing of claimed) {\n if (pathsOverlap(targetPath, existing.path)) return existing;\n }\n }\n\n return null;\n}\n","import type OpenAI from 'openai';\nimport type { AIProvider } from '../../ai/provider.js';\nimport type { Tool, ToolCall, ToolContext, ToolResult } from '../../tools/types.js';\nimport { parseJsonResponse } from '../json-response.js';\nimport type { WorkerAssignment, WorkerProposal, WorkerRunResult } from './types.js';\n\nexport class WorkerAgent {\n constructor(\n private readonly ai: Pick<AIProvider, 'chat'>,\n private readonly tools: Tool[],\n private readonly toolCtx: ToolContext,\n ) {}\n\n async run(goal: string, assignment: WorkerAssignment): Promise<WorkerRunResult> {\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n {\n role: 'system',\n content: buildWorkerPrompt(goal, assignment),\n },\n ];\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (let iteration = 0; iteration < 4; iteration++) {\n const response = await this.ai.chat(messages, this.tools);\n\n const assistantMessage: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n ...(response.toolCalls.length > 0\n ? {\n tool_calls: response.toolCalls.map((call) => ({\n id: call.id,\n type: 'function' as const,\n function: { name: call.name, arguments: JSON.stringify(call.arguments) },\n })),\n }\n : {}),\n };\n messages.push(assistantMessage);\n\n if (response.toolCalls.length === 0) {\n const proposal = normalizeProposal(\n assignment.id,\n parseJsonResponse<Partial<WorkerProposal>>(response.content),\n );\n if (!proposal) {\n return {\n assignment,\n error: 'Worker did not return a valid WorkerProposal JSON object',\n toolResults,\n };\n }\n return { assignment, proposal, toolResults };\n }\n\n for (const call of response.toolCalls) {\n const tool = this.tools.find((candidate) => candidate.name === call.name);\n const result = tool\n ? await tool.execute(call.arguments, this.toolCtx)\n : { success: false, error: `Read-only worker cannot use tool: ${call.name}` };\n\n toolResults.push({ call, result });\n messages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n }\n\n return {\n assignment,\n error: 'Worker exhausted its iteration budget before returning a proposal',\n toolResults,\n };\n }\n}\n\nfunction buildWorkerPrompt(goal: string, assignment: WorkerAssignment): string {\n return [\n 'You are a Dominus worker agent. You are not the coordinator.',\n 'You may inspect and reason, but you must not mutate Roblox Studio.',\n 'Use only the read tools provided to gather evidence.',\n 'Your final answer must be JSON only with this shape:',\n '{\"workerId\":\"...\",\"summary\":\"...\",\"evidence\":[{\"source\":\"...\",\"summary\":\"...\",\"data\":{}}],\"proposedToolCalls\":[{\"tool\":\"set_properties\",\"args\":{},\"targetPath\":\"...\",\"rationale\":\"...\"}],\"risks\":[\"...\"],\"verificationSuggestions\":[\"...\"]}',\n '',\n `Global goal: ${goal}`,\n `Worker id: ${assignment.id}`,\n `Role: ${assignment.role}`,\n `Objective: ${assignment.objective}`,\n `Owned scopes: ${assignment.ownedScopes.join(', ') || '(none)'}`,\n `Allowed read tools: ${assignment.allowedReadTools.join(', ')}`,\n 'Acceptance criteria:',\n ...assignment.acceptanceCriteria.map((criterion) => `- ${criterion}`),\n '',\n 'Proposal rules:',\n '- Propose only coordinator-owned write tools: create_ui, set_properties, bulk_set_properties, insert_instance, move_instance.',\n '- Every proposed write must include targetPath and stay inside your owned scopes.',\n '- If you need no changes, return proposedToolCalls as an empty array and explain why.',\n ].join('\\n');\n}\n\nfunction normalizeProposal(\n workerId: string,\n parsed: Partial<WorkerProposal> | null,\n): WorkerProposal | null {\n if (!parsed || typeof parsed !== 'object') return null;\n\n return {\n workerId: typeof parsed.workerId === 'string' ? parsed.workerId : workerId,\n summary: typeof parsed.summary === 'string' ? parsed.summary : '',\n evidence: Array.isArray(parsed.evidence)\n ? parsed.evidence.map((item) => ({\n source: String(item?.source ?? 'worker'),\n summary: String(item?.summary ?? ''),\n data: item?.data,\n }))\n : [],\n proposedToolCalls: Array.isArray(parsed.proposedToolCalls)\n ? parsed.proposedToolCalls.map((call) => ({\n tool: String(call?.tool ?? ''),\n args: call?.args && typeof call.args === 'object' ? call.args : {},\n targetPath: typeof call?.targetPath === 'string' ? call.targetPath : undefined,\n rationale: typeof call?.rationale === 'string' ? call.rationale : undefined,\n }))\n : [],\n risks: Array.isArray(parsed.risks) ? parsed.risks.map(String) : [],\n verificationSuggestions: Array.isArray(parsed.verificationSuggestions)\n ? parsed.verificationSuggestions.map(String)\n : [],\n };\n}\n","import { nanoid } from 'nanoid';\nimport type OpenAI from 'openai';\nimport type { AIProvider } from '../../ai/provider.js';\nimport type { AgentEvent, Tool, ToolCall, ToolContext, ToolResult } from '../../tools/types.js';\nimport { inferVerifyChecks, verifyAction } from '../verifier.js';\nimport { parseJsonResponse } from '../json-response.js';\nimport {\n COORDINATOR_WRITE_TOOL_NAMES,\n READ_ONLY_TOOL_NAMES,\n inferTargetPath,\n rejectConflictingAcceptedProposals,\n validateWorkerProposal,\n} from './conflicts.js';\nimport type {\n AcceptedProposal,\n CoordinatorDecision,\n MultiAgentResult,\n ParallelTaskArgs,\n RejectedProposal,\n WorkerAssignment,\n WorkerProposal,\n WorkerRunResult,\n} from './types.js';\nimport { WorkerAgent } from './worker.js';\n\ntype EmitEvent = (event: AgentEvent) => void;\n\nexport class MultiAgentCoordinator {\n constructor(\n private readonly ai: Pick<AIProvider, 'chat'>,\n private readonly allTools: Tool[],\n ) {}\n\n async execute(\n args: ParallelTaskArgs,\n toolCtx: ToolContext,\n emit?: EmitEvent,\n ): Promise<MultiAgentResult> {\n const normalized = normalizeArgs(args);\n const readTools = this.getReadOnlyTools();\n const assignments = await this.createAssignments(normalized, toolCtx, readTools);\n\n emit?.({ type: 'multi_agent_start', goal: normalized.goal, workerCount: assignments.length });\n\n const workerResults = await Promise.allSettled(\n assignments.map(async (assignment) => {\n emit?.({\n type: 'multi_agent_worker_start',\n workerId: assignment.id,\n role: assignment.role,\n scopes: assignment.ownedScopes,\n });\n\n const worker = new WorkerAgent(this.ai, readTools, toolCtx);\n const result = await worker.run(normalized.goal, assignment);\n emit?.({\n type: 'multi_agent_worker_done',\n workerId: assignment.id,\n summary: result.proposal?.summary ?? result.error ?? 'Worker failed',\n proposedToolCallCount: result.proposal?.proposedToolCalls.length ?? 0,\n });\n return result;\n }),\n );\n\n const { accepted, rejected } = this.validateWorkerResults(assignments, workerResults, emit);\n const conflictChecked = rejectConflictingAcceptedProposals(accepted);\n for (const item of conflictChecked.rejected) {\n emit?.({ type: 'multi_agent_proposal', workerId: item.workerId, accepted: false, reason: item.reason });\n }\n\n const finalAccepted = conflictChecked.accepted;\n const finalRejected = [...rejected, ...conflictChecked.rejected];\n const finalToolCalls = await this.synthesizeFinalToolCalls(normalized.goal, finalAccepted);\n const decision: CoordinatorDecision = {\n accepted: finalAccepted,\n rejected: finalRejected,\n finalToolCalls,\n };\n\n emit?.({\n type: 'multi_agent_decision',\n acceptedCount: decision.accepted.length,\n rejectedCount: decision.rejected.length,\n finalToolCallCount: decision.finalToolCalls.length,\n });\n\n emit?.({ type: 'multi_agent_apply_start', toolCallCount: decision.finalToolCalls.length });\n const applied = await this.applyFinalToolCalls(decision.finalToolCalls, toolCtx);\n const verificationFailures = await this.verifyAppliedCalls(applied, toolCtx);\n emit?.({\n type: 'multi_agent_apply_done',\n appliedCount: applied.length,\n verificationFailureCount: verificationFailures.length,\n });\n\n return {\n goal: normalized.goal,\n assignments,\n decision,\n applied,\n verificationFailures,\n };\n }\n\n getReadOnlyTools(): Tool[] {\n return this.allTools.filter((tool) => READ_ONLY_TOOL_NAMES.has(tool.name));\n }\n\n getMetaTool(): Tool {\n return {\n name: 'run_parallel_task',\n description:\n 'Split a broad task into coordinated read-only worker agents. Workers inspect and propose scoped changes; the coordinator validates proposals and applies safe serial writes.',\n parameters: {\n type: 'object',\n properties: {\n goal: {\n type: 'string',\n description: 'The task to coordinate across sub-agents.',\n },\n rootPath: {\n type: 'string',\n description: 'Optional root instance path to partition work under, e.g. StarterGui.HUD.',\n },\n maxWorkers: {\n type: 'number',\n description: 'Number of workers to use. Defaults to 3, max 5.',\n default: 3,\n },\n constraints: {\n type: 'string',\n description: 'Extra constraints the workers and coordinator must follow.',\n },\n taskType: {\n type: 'string',\n description: 'Optional task type hint such as ui, script, build, refactor, or general.',\n },\n },\n required: ['goal'],\n },\n execute: async () => ({\n success: false,\n error: 'run_parallel_task is a meta-tool handled by AgentLoop or MCP, not ToolRegistry.',\n }),\n };\n }\n\n shouldAutoTrigger(userMessage: string): boolean {\n const lower = userMessage.toLowerCase();\n return [\n 'parallel',\n 'sub-agent',\n 'subagent',\n 'agents',\n 'split this',\n 'entire ui',\n 'whole ui',\n 'organize all',\n 'organize entire',\n 'large task',\n ].some((cue) => lower.includes(cue));\n }\n\n private async createAssignments(\n args: Required<Pick<ParallelTaskArgs, 'goal' | 'maxWorkers'>> &\n Omit<ParallelTaskArgs, 'goal' | 'maxWorkers'>,\n toolCtx: ToolContext,\n readTools: Tool[],\n ): Promise<WorkerAssignment[]> {\n const scopes = await this.discoverScopes(args, toolCtx);\n const fallback = buildFallbackAssignments(args, scopes, readTools);\n\n try {\n const response = await this.ai.chat([\n {\n role: 'system',\n content: buildAssignmentPrompt(args, scopes, readTools),\n },\n ]);\n const parsed = parseJsonResponse<{ assignments?: Partial<WorkerAssignment>[] }>(response.content);\n const assignments = normalizeAssignments(parsed?.assignments, args, scopes, readTools);\n return assignments.length > 0 ? assignments : fallback;\n } catch {\n return fallback;\n }\n }\n\n private async discoverScopes(\n args: Required<Pick<ParallelTaskArgs, 'goal' | 'maxWorkers'>> &\n Omit<ParallelTaskArgs, 'goal' | 'maxWorkers'>,\n toolCtx: ToolContext,\n ): Promise<string[]> {\n if (!args.rootPath || !toolCtx.isStudioConnected()) {\n return args.rootPath ? [args.rootPath] : ['Workspace', 'StarterGui', 'ReplicatedStorage'];\n }\n\n const serializeTool = this.allTools.find((tool) => tool.name === 'serialize_ui');\n const looksUi = (args.taskType ?? '').toLowerCase().includes('ui') || args.rootPath.includes('Gui');\n if (serializeTool && looksUi) {\n const result = await serializeTool.execute({ path: args.rootPath, maxDepth: 2 }, toolCtx);\n const childScopes = result.success ? getSerializedChildScopes(args.rootPath, result.data) : [];\n if (childScopes.length > 0) return childScopes.slice(0, args.maxWorkers);\n }\n\n const explorerTool = this.allTools.find((tool) => tool.name === 'get_explorer');\n if (explorerTool) {\n const result = await explorerTool.execute({ rootPath: args.rootPath, maxDepth: 2 }, toolCtx);\n const childScopes = result.success ? getExplorerChildScopes(args.rootPath, result.data) : [];\n if (childScopes.length > 0) return childScopes.slice(0, args.maxWorkers);\n }\n\n return [args.rootPath];\n }\n\n private validateWorkerResults(\n assignments: WorkerAssignment[],\n settledResults: PromiseSettledResult<WorkerRunResult>[],\n emit?: EmitEvent,\n ): { accepted: AcceptedProposal[]; rejected: RejectedProposal[] } {\n const accepted: AcceptedProposal[] = [];\n const rejected: RejectedProposal[] = [];\n\n for (let i = 0; i < settledResults.length; i++) {\n const assignment = assignments[i];\n const result = settledResults[i];\n\n if (result.status === 'rejected') {\n const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);\n rejected.push({ workerId: assignment.id, reason });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: false, reason });\n continue;\n }\n\n if (!result.value.proposal) {\n const reason = result.value.error ?? 'Worker returned no proposal';\n rejected.push({ workerId: assignment.id, reason });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: false, reason });\n continue;\n }\n\n const errors = validateWorkerProposal(assignment, result.value.proposal);\n if (errors.length > 0) {\n const reason = errors.join('; ');\n rejected.push({ workerId: assignment.id, proposal: result.value.proposal, reason });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: false, reason });\n continue;\n }\n\n accepted.push({ workerId: assignment.id, proposal: result.value.proposal });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: true });\n }\n\n return { accepted, rejected };\n }\n\n private async synthesizeFinalToolCalls(\n goal: string,\n accepted: AcceptedProposal[],\n ): Promise<ToolCall[]> {\n const proposed = accepted.flatMap((item) => item.proposal.proposedToolCalls);\n const safeCalls = proposed\n .filter((call) => COORDINATOR_WRITE_TOOL_NAMES.has(call.tool))\n .map((call) => toToolCall(call.tool, call.args));\n\n if (safeCalls.length <= 1) return safeCalls;\n\n try {\n const response = await this.ai.chat([\n {\n role: 'system',\n content: [\n 'You are the Dominus multi-agent coordinator.',\n 'Merge accepted worker proposals into a deterministic serial write plan.',\n 'Return JSON only: {\"toolCalls\":[{\"tool\":\"set_properties\",\"args\":{}}]}',\n 'Only use these tools: create_ui, set_properties, bulk_set_properties, insert_instance, move_instance.',\n 'Do not include run_code, delete_instance, edit_script, undo, or redo.',\n `Goal: ${goal}`,\n 'Accepted proposals:',\n JSON.stringify(accepted, null, 2),\n ].join('\\n'),\n },\n ]);\n const parsed = parseJsonResponse<{ toolCalls?: { tool?: string; args?: Record<string, unknown> }[] }>(\n response.content,\n );\n const merged = (parsed?.toolCalls ?? [])\n .filter((call) => call.tool && COORDINATOR_WRITE_TOOL_NAMES.has(call.tool))\n .map((call) => toToolCall(call.tool!, call.args ?? {}));\n return merged.length > 0 ? merged : safeCalls;\n } catch {\n return safeCalls;\n }\n }\n\n private async applyFinalToolCalls(\n calls: ToolCall[],\n toolCtx: ToolContext,\n ): Promise<{ call: ToolCall; result: ToolResult }[]> {\n const applied: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of calls) {\n const targetPath = inferTargetPath({ tool: call.name, args: call.arguments });\n if (!targetPath) {\n applied.push({ call, result: { success: false, error: `Missing target path for ${call.name}` } });\n continue;\n }\n\n const tool = this.allTools.find((candidate) => candidate.name === call.name);\n if (!tool) {\n applied.push({ call, result: { success: false, error: `Unknown coordinator tool: ${call.name}` } });\n continue;\n }\n\n applied.push({ call, result: await tool.execute(call.arguments, toolCtx) });\n }\n\n return applied;\n }\n\n private async verifyAppliedCalls(\n applied: { call: ToolCall; result: ToolResult }[],\n toolCtx: ToolContext,\n ): Promise<ToolResult[]> {\n const failures: ToolResult[] = [];\n\n for (const { call, result } of applied) {\n for (const check of inferVerifyChecks(call, result)) {\n const verified = await verifyAction(check, toolCtx);\n if (!verified.success) failures.push(verified);\n }\n }\n\n return failures;\n }\n}\n\nfunction normalizeArgs(args: ParallelTaskArgs): Required<Pick<ParallelTaskArgs, 'goal' | 'maxWorkers'>> &\n Omit<ParallelTaskArgs, 'goal' | 'maxWorkers'> {\n return {\n ...args,\n goal: String(args.goal ?? '').trim(),\n maxWorkers: Math.max(1, Math.min(Number(args.maxWorkers ?? 3), 5)),\n };\n}\n\nfunction buildAssignmentPrompt(\n args: ParallelTaskArgs & { goal: string; maxWorkers: number },\n scopes: string[],\n readTools: Tool[],\n): string {\n return [\n 'You are the Dominus multi-agent assignment planner.',\n 'Create non-overlapping worker assignments for a proposal-only parallel task.',\n 'Return JSON only: {\"assignments\":[{\"id\":\"worker-1\",\"role\":\"...\",\"objective\":\"...\",\"ownedScopes\":[\"...\"],\"allowedReadTools\":[\"...\"],\"acceptanceCriteria\":[\"...\"]}]}',\n `Goal: ${args.goal}`,\n `Root path: ${args.rootPath ?? '(none)'}`,\n `Task type: ${args.taskType ?? 'general'}`,\n `Constraints: ${args.constraints ?? '(none)'}`,\n `Max workers: ${args.maxWorkers}`,\n `Candidate scopes: ${scopes.join(', ')}`,\n `Read tools: ${readTools.map((tool) => tool.name).join(', ')}`,\n ].join('\\n');\n}\n\nfunction buildFallbackAssignments(\n args: ParallelTaskArgs & { goal: string; maxWorkers: number },\n scopes: string[],\n readTools: Tool[],\n): WorkerAssignment[] {\n const selectedScopes = scopes.slice(0, args.maxWorkers);\n const allowedReadTools = readTools.map((tool) => tool.name);\n const criteria = [\n 'Gather concrete evidence with read-only tools.',\n 'Propose only scoped coordinator-owned write calls.',\n 'Explain risks and verification suggestions.',\n ];\n\n return selectedScopes.map((scope, index) => ({\n id: `worker-${index + 1}`,\n role: index === 0 ? 'Inspector' : index === selectedScopes.length - 1 ? 'Verifier' : 'Specialist',\n objective: `Inspect ${scope} for: ${args.goal}`,\n ownedScopes: [scope],\n allowedReadTools,\n acceptanceCriteria: args.constraints ? [...criteria, args.constraints] : criteria,\n }));\n}\n\nfunction normalizeAssignments(\n rawAssignments: Partial<WorkerAssignment>[] | undefined,\n args: ParallelTaskArgs & { goal: string; maxWorkers: number },\n scopes: string[],\n readTools: Tool[],\n): WorkerAssignment[] {\n if (!Array.isArray(rawAssignments)) return [];\n\n const allowedReadTools = readTools.map((tool) => tool.name);\n return rawAssignments\n .slice(0, args.maxWorkers)\n .map((assignment, index) => ({\n id: assignment.id?.trim() || `worker-${index + 1}`,\n role: assignment.role?.trim() || 'Specialist',\n objective: assignment.objective?.trim() || `Inspect assigned scope for: ${args.goal}`,\n ownedScopes:\n Array.isArray(assignment.ownedScopes) && assignment.ownedScopes.length > 0\n ? assignment.ownedScopes.map(String)\n : [scopes[index] ?? scopes[0] ?? args.rootPath ?? 'Workspace'],\n allowedReadTools: allowedReadTools.filter((tool) =>\n assignment.allowedReadTools?.length ? assignment.allowedReadTools.includes(tool) : true,\n ),\n acceptanceCriteria:\n Array.isArray(assignment.acceptanceCriteria) && assignment.acceptanceCriteria.length > 0\n ? assignment.acceptanceCriteria.map(String)\n : ['Gather evidence and propose scoped changes only.'],\n }))\n .filter((assignment) => assignment.ownedScopes.length > 0);\n}\n\nfunction getSerializedChildScopes(rootPath: string, data: unknown): string[] {\n const node = data && typeof data === 'object' ? (data as Record<string, unknown>) : null;\n const children = Array.isArray(node?.Children)\n ? node.Children\n : Array.isArray(node?.children)\n ? node.children\n : [];\n\n return children\n .map((child) => (child && typeof child === 'object' ? (child as Record<string, unknown>).Name : undefined))\n .filter((name): name is string => typeof name === 'string' && name.length > 0)\n .map((name) => `${rootPath}.${name}`);\n}\n\nfunction getExplorerChildScopes(rootPath: string, data: unknown): string[] {\n const payload = data && typeof data === 'object' ? (data as Record<string, unknown>) : null;\n const tree = Array.isArray(payload?.tree) ? payload.tree : [];\n const root = tree[0] && typeof tree[0] === 'object' ? (tree[0] as Record<string, unknown>) : null;\n const children = Array.isArray(root?.children) ? root.children : [];\n\n return children\n .map((child) => (child && typeof child === 'object' ? (child as Record<string, unknown>).path : undefined))\n .filter((pathValue): pathValue is string => typeof pathValue === 'string' && pathValue.length > 0)\n .map((pathValue) => pathValue || rootPath);\n}\n\nfunction toToolCall(name: string, args: Record<string, unknown>): ToolCall {\n return {\n id: `multi_${nanoid()}`,\n name,\n arguments: args,\n };\n}\n","import type { Tool, ToolCall, ToolResult, ToolContext } from './types.js';\r\n\r\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n private readyTasks: Promise<unknown>[] = [];\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[] {\n return Array.from(this.tools.keys());\n }\n\n addReadyTask(task: Promise<unknown>): void {\n this.readyTasks.push(task);\n }\n\n async ready(): Promise<void> {\n await Promise.all(this.readyTasks);\n }\n}\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/get-descendants-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('./studio/serialize-ui.js'),\r\n import('./studio/move-instance.js'),\r\n import('./studio/bulk-set-properties.js'),\r\n import('./studio/find-replace-scripts.js'),\n import('./docs/search-roblox-api.js'),\n import('./docs/get-roblox-api-reference.js'),\n import('./memory/recall.js'),\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 registry.addReadyTask(Promise.all(\n toolModules.map(async (mod) => {\n const m = await mod;\n if (m.tool) registry.register(m.tool);\n }),\n ));\n\n // Register undo/redo (dual-export module)\n registry.addReadyTask(import('./studio/undo-redo.js').then((m) => {\n registry.register(m.undoTool);\n registry.register(m.redoTool);\n }));\n\n return registry;\n}\n","import { startMcpServer } from './server.js';\r\n\r\nstartMcpServer().catch((err) => {\r\n console.error('Failed to start Dominus MCP server:', err);\r\n process.exit(1);\r\n});\r\n"]}
1
+ {"version":3,"sources":["../src/config/config.ts","../src/transport/protocol.ts","../src/transport/auth.ts","../src/transport/ws-client.ts","../src/transport/ws-server.ts","../src/mcp/instructions.ts","../src/mcp/resources.ts","../src/mcp/result.ts","../src/mcp/tools/shared.ts","../src/mcp/tools/connections.ts","../src/docs/roblox-api.ts","../src/mcp/tools/docs.ts","../src/mcp/tools/studio.ts","../src/mcp/server.ts","../src/mcp/index.ts"],"names":["path","fs","EventEmitter","WebSocket","z"],"mappings":"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","file":"mcp.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';\nimport { z } from 'zod';\n\nexport const DOMINUS_PROTOCOL_VERSION = 2;\nexport const MAX_MESSAGE_BYTES = 1024 * 1024;\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 = {\n HELLO: 'studio:hello',\n CONNECTED: 'studio:connected',\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',\n AUTHENTICATED: 'server:authenticated',\n AUTH_REJECTED: 'server:auth_rejected',\n} as const;\n\nexport const ControllerMsg = {\n HELLO: 'controller:hello',\n WELCOME: 'controller:welcome',\n RELAY: 'controller:relay',\n TARGET_STATE: 'controller:target_state',\n SET_ACTIVE_CONNECTION: 'controller:set_active_connection',\n} as const;\n\r\nexport const CliMsg = {\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 GET_DESCENDANTS_PROPERTIES: 'cli:get:descendants: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 SERIALIZE_UI: 'cli:serialize:ui',\r\n MOVE_INSTANCE: 'cli:move:instance',\r\n UNDO: 'cli:undo',\r\n REDO: 'cli:redo',\r\n BULK_SET_PROPERTIES: 'cli:bulk:set:properties',\r\n FIND_REPLACE_SCRIPTS: 'cli:find:replace:scripts',\n V2_GET_TREE: 'studio:v2:get_tree',\n V2_INSPECT: 'studio:v2:inspect',\n V2_GET_SELECTION: 'studio:v2:get_selection',\n V2_READ_SCRIPT: 'studio:v2:read_script',\n V2_UPDATE_SCRIPT: 'studio:v2:update_script',\n V2_APPLY: 'studio:v2:apply',\n V2_DELETE: 'studio:v2:delete',\n V2_BUILD_UI: 'studio:v2:build_ui',\n V2_SNAPSHOT_UI: 'studio:v2:snapshot_ui',\n V2_RUN_TEST: 'studio:v2:run_test',\n V2_GET_OUTPUT: 'studio:v2:get_output',\n V2_GET_REFLECTION: 'studio:v2:get_reflection',\n} as const;\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 {\n name: string;\n className: string;\n path: string;\n ref?: InstanceRef;\n children?: ExplorerNode[];\n}\n\nexport interface InstanceRef {\n instanceId?: string;\n pathSegments?: string[];\n}\n\r\nexport interface StudioConnectedPayload {\n studioVersion: string;\n protocolVersion?: number;\n clientId?: string;\n token?: string;\n connectionId?: string;\n placeId?: number;\n placeName?: string;\n engineVersion?: string;\n}\n\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 {\n if (Buffer.byteLength(raw, 'utf8') > MAX_MESSAGE_BYTES) {\n throw new Error(`WebSocket message exceeds ${MAX_MESSAGE_BYTES} bytes`);\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n return wsMessageSchema.parse(parsed) as WsMessage;\n } catch {\n throw new Error(`Failed to parse WebSocket message: ${raw.slice(0, 100)}`);\n }\n}\n\nexport function serializeMessage(msg: WsMessage): string {\n const serialized = JSON.stringify(msg);\n if (Buffer.byteLength(serialized, 'utf8') > MAX_MESSAGE_BYTES) {\n throw new Error(`WebSocket message exceeds ${MAX_MESSAGE_BYTES} bytes`);\n }\n return serialized;\n}\n\nconst wsMessageSchema = z.object({\n id: z.string().min(1).max(128),\n type: z.string().min(1).max(128),\n payload: z.unknown(),\n ts: z.number().finite(),\n}).strict();\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { getDominusDir } from '../config/config.js';\n\nconst TOKEN_FILE = 'bridge-token';\n\nexport function loadOrCreateBridgeToken(): string {\n const tokenPath = path.join(getDominusDir(), TOKEN_FILE);\n try {\n const existing = fs.readFileSync(tokenPath, 'utf8').trim();\n if (existing.length >= 32) return existing;\n } catch {\n // First run or an unreadable token is repaired below.\n }\n\n const token = crypto.randomBytes(32).toString('base64url');\n fs.writeFileSync(tokenPath, `${token}\\n`, { encoding: 'utf8', mode: 0o600 });\n try {\n fs.chmodSync(tokenPath, 0o600);\n } catch {\n // Windows ACLs do not map directly to POSIX modes.\n }\n return token;\n}\n\nexport function tokensEqual(actual: unknown, expected: string): boolean {\n if (typeof actual !== 'string') return false;\n const actualBuffer = Buffer.from(actual);\n const expectedBuffer = Buffer.from(expected);\n return actualBuffer.length === expectedBuffer.length\n && crypto.timingSafeEqual(actualBuffer, expectedBuffer);\n}\n","import { EventEmitter } from 'node:events';\nimport { WebSocket } from 'ws';\nimport {\n ControllerMsg,\n DOMINUS_PROTOCOL_VERSION,\n StudioMsg,\n createMessage,\n parseMessage,\n serializeMessage,\n type WsMessage,\n} from './protocol.js';\nimport { loadOrCreateBridgeToken } from './auth.js';\nimport type { PlaceInfo, StudioBridge, StudioConnection } from './ws-server.js';\n\ninterface ClientOptions {\n token?: string;\n connectTimeoutMs?: number;\n}\n\ninterface ControlResult {\n success?: boolean;\n error?: string;\n [key: string]: unknown;\n}\n\nexport class DominusClient extends EventEmitter implements StudioBridge {\n private ws: WebSocket | null = null;\n private readonly port: number;\n private readonly token: string;\n private readonly connectTimeoutMs: number;\n private readonly connections = new Map<string, Omit<StudioConnection, 'ws'>>();\n private activeConnectionId: string | null = null;\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: WsMessage) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n constructor(port = 18088, options: ClientOptions = {}) {\n super();\n this.port = port;\n this.token = options.token ?? loadOrCreateBridgeToken();\n this.connectTimeoutMs = options.connectTimeoutMs ?? 8_000;\n }\n\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(`ws://127.0.0.1:${this.port}`, {\n perMessageDeflate: false,\n maxPayload: 1024 * 1024,\n });\n let settled = false;\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n ws.close(1008, 'Dominus controller handshake timed out');\n reject(new Error('Timed out authenticating with the Dominus bridge'));\n }\n }, this.connectTimeoutMs);\n\n ws.on('open', () => {\n this.ws = ws;\n ws.send(serializeMessage(createMessage(ControllerMsg.HELLO, {\n protocolVersion: DOMINUS_PROTOCOL_VERSION,\n token: this.token,\n })));\n });\n\n ws.on('message', (raw) => {\n try {\n const msg = parseMessage(raw.toString());\n if (msg.type === ControllerMsg.WELCOME && !settled) {\n settled = true;\n clearTimeout(timer);\n this.applyWelcome(msg.payload);\n this.emit('server:started', { port: this.port, relay: true });\n resolve();\n return;\n }\n if (msg.type === StudioMsg.AUTH_REJECTED && !settled) {\n settled = true;\n clearTimeout(timer);\n const payload = msg.payload as { error?: string };\n reject(new Error(payload.error ?? 'Dominus controller authentication failed'));\n ws.close(1008, 'Controller authentication failed');\n return;\n }\n this.handleMessage(msg);\n } catch (err) {\n this.emit('server:error', err);\n }\n });\n\n ws.on('close', () => {\n clearTimeout(timer);\n this.ws = null;\n this.connections.clear();\n this.activeConnectionId = null;\n if (!settled) {\n settled = true;\n reject(new Error('Dominus bridge closed before authentication completed'));\n }\n this.rejectPending(new Error('Dominus relay connection lost'));\n this.emit('studio:disconnected');\n });\n\n ws.on('error', (err) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(err);\n }\n this.emit('server:error', err);\n });\n });\n }\n\n private applyWelcome(payload: unknown): void {\n const welcome = payload as {\n connections?: PlaceInfo[];\n activeConnectionId?: string | null;\n };\n this.replaceConnections(welcome.connections ?? []);\n this.activeConnectionId = welcome.activeConnectionId ?? null;\n if (!this.resolveTargetInfo() && this.connections.size === 1) {\n this.activeConnectionId = this.connections.keys().next().value ?? null;\n }\n }\n\n private handleMessage(msg: WsMessage): void {\n if (msg.type === ControllerMsg.TARGET_STATE) {\n const payload = msg.payload as {\n connections?: PlaceInfo[];\n defaultActiveConnectionId?: string | null;\n };\n this.replaceConnections(payload.connections ?? []);\n if (this.activeConnectionId && !this.connections.has(this.activeConnectionId)) {\n this.activeConnectionId = null;\n }\n if (!this.activeConnectionId && this.connections.size === 1) {\n this.activeConnectionId = this.connections.keys().next().value ?? null;\n }\n this.emit('controller:target_state', payload);\n return;\n }\n\n if (msg.type === StudioMsg.CONNECTED) {\n const connection = msg.payload as PlaceInfo;\n this.connections.set(connection.connectionId, toConnectionInfo(connection));\n if (!this.activeConnectionId && this.connections.size === 1) {\n this.activeConnectionId = connection.connectionId;\n }\n this.emit('studio:connected', connection);\n return;\n }\n\n if (msg.type === StudioMsg.DISCONNECTED) {\n const payload = msg.payload as { connectionId?: string };\n if (payload.connectionId) this.connections.delete(payload.connectionId);\n if (this.activeConnectionId === payload.connectionId) this.activeConnectionId = null;\n if (!this.activeConnectionId && this.connections.size === 1) {\n this.activeConnectionId = this.connections.keys().next().value ?? null;\n }\n this.emit('studio:disconnected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n pending.resolve(msg);\n }\n return;\n }\n\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n }\n\n private replaceConnections(connections: PlaceInfo[]): void {\n this.connections.clear();\n for (const connection of connections) {\n this.connections.set(connection.connectionId, toConnectionInfo(connection));\n }\n }\n\n private sendMessage(message: WsMessage): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('Not connected to the Dominus bridge');\n }\n this.ws.send(serializeMessage(message));\n }\n\n private waitForResponse<T = unknown>(message: WsMessage, timeoutMs: number): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error(`Dominus request timed out: ${message.type}`));\n }, timeoutMs);\n this.pendingRequests.set(message.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n });\n try {\n this.sendMessage(message);\n } catch (err) {\n clearTimeout(timer);\n this.pendingRequests.delete(message.id);\n reject(err);\n }\n });\n }\n\n private async sendControlRequest<T extends ControlResult>(\n type: string,\n payload: unknown,\n timeoutMs = 10_000,\n ): Promise<T> {\n const response = await this.waitForResponse<T>(createMessage(type, payload), timeoutMs);\n const result = response.payload;\n if (result.error || result.success === false) throw new Error(result.error ?? `${type} failed`);\n return result;\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 15_000): Promise<WsMessage<T>> {\n const target = this.resolveTargetInfo();\n if (!target || !this.activeConnectionId) {\n return Promise.reject(new Error(this.connections.size > 1\n ? 'Multiple Studio sessions are connected. Call dominus_select_studio first.'\n : 'No authenticated Roblox Studio connection'));\n }\n const request = createMessage(type, payload);\n const relay = createMessage(ControllerMsg.RELAY, {\n connectionId: this.activeConnectionId,\n request,\n });\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(request.id);\n reject(new Error(`Studio request timed out: ${type}`));\n }, timeoutMs);\n this.pendingRequests.set(request.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n });\n try {\n this.sendMessage(relay);\n } catch (err) {\n clearTimeout(timer);\n this.pendingRequests.delete(request.id);\n reject(err);\n }\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n if (!this.activeConnectionId) return;\n const request = createMessage(type, payload);\n this.sendMessage(createMessage(ControllerMsg.RELAY, {\n connectionId: this.activeConnectionId,\n request,\n }));\n }\n\n isConnected(): boolean {\n return this.resolveTargetInfo() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n const target = this.resolveTargetInfo();\n if (!target || !this.ws) return null;\n return { ...target, ws: this.ws };\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.connections.values()].map((connection) => ({\n placeId: connection.placeId ?? 0,\n connectionId: connection.connectionId,\n clientId: connection.clientId,\n placeName: connection.placeName,\n studioVersion: connection.studioVersion,\n connectedAt: connection.connectedAt,\n active: connection.connectionId === this.activeConnectionId,\n }));\n }\n\n getActiveConnectionId(): string | null {\n return this.activeConnectionId;\n }\n\n async setActiveConnectionId(connectionId: string | null): Promise<void> {\n if (connectionId && !this.connections.has(connectionId)) {\n throw new Error(`Studio connection ${connectionId} is not connected`);\n }\n await this.sendControlRequest(ControllerMsg.SET_ACTIVE_CONNECTION, { connectionId });\n this.activeConnectionId = connectionId;\n }\n\n getActivePlaceId(): number {\n return this.resolveTargetInfo()?.placeId ?? 0;\n }\n\n setActivePlaceId(placeId: number): void {\n if (placeId === 0) {\n void this.setActiveConnectionId(null);\n return;\n }\n const matches = [...this.connections.values()].filter((connection) => connection.placeId === placeId);\n if (matches.length !== 1) {\n throw new Error(matches.length === 0\n ? `Place ${placeId} is not connected`\n : `Place ${placeId} has multiple Studio sessions; select a connectionId instead`);\n }\n void this.setActiveConnectionId(matches[0].connectionId);\n }\n\n private resolveTargetInfo(): Omit<StudioConnection, 'ws'> | null {\n if (this.activeConnectionId) return this.connections.get(this.activeConnectionId) ?? null;\n if (this.connections.size === 1) return this.connections.values().next().value ?? null;\n return null;\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n this.rejectPending(new Error('Dominus client is shutting down'));\n return new Promise((resolve) => {\n if (!this.ws) {\n resolve();\n return;\n }\n const ws = this.ws;\n this.ws = null;\n ws.once('close', resolve);\n ws.close(1000, 'Dominus client shutdown');\n });\n }\n\n private rejectPending(error: Error): void {\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timer);\n pending.reject(error);\n }\n this.pendingRequests.clear();\n }\n}\n\nfunction toConnectionInfo(connection: PlaceInfo): Omit<StudioConnection, 'ws'> {\n return {\n connectedAt: connection.connectedAt,\n connectionId: connection.connectionId,\n clientId: connection.clientId,\n studioVersion: connection.studioVersion,\n placeId: connection.placeId,\n placeName: connection.placeName,\n };\n}\n\nexport async function isPortInUse(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const ws = new WebSocket(`ws://127.0.0.1:${port}`);\n const timer = setTimeout(() => {\n ws.close();\n resolve(false);\n }, 750);\n ws.on('open', () => {\n clearTimeout(timer);\n ws.close();\n resolve(true);\n });\n ws.on('error', () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport { WebSocketServer, WebSocket, type RawData } from 'ws';\nimport {\n ControllerMsg,\n DOMINUS_PROTOCOL_VERSION,\n MAX_MESSAGE_BYTES,\n StudioMsg,\n createMessage,\n parseMessage,\n serializeMessage,\n type StudioConnectedPayload,\n type WsMessage,\n} from './protocol.js';\nimport { loadOrCreateBridgeToken, tokensEqual } from './auth.js';\n\nconst HANDSHAKE_TIMEOUT_MS = 8_000;\nconst RATE_WINDOW_MS = 10_000;\nconst RATE_LIMIT = 250;\n\ntype SocketRole = 'unknown' | 'studio' | 'controller';\n\nexport interface StudioConnection {\n ws: WebSocket;\n connectionId: string;\n clientId: string;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface PlaceInfo {\n placeId: number;\n connectionId: string;\n clientId: string;\n placeName?: string;\n studioVersion?: string;\n connectedAt: number;\n active: boolean;\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 listConnections(): PlaceInfo[];\n getActiveConnectionId(): string | null;\n setActiveConnectionId(connectionId: string | null): Promise<void>;\n getActivePlaceId(): number;\n setActivePlaceId(placeId: number): void;\n}\n\ninterface RelayRequest {\n controllerWs: WebSocket;\n targetWs: WebSocket;\n}\n\ninterface ServerOptions {\n token?: string;\n host?: string;\n maxPayloadBytes?: number;\n handshakeTimeoutMs?: number;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n private readonly studioClients = new Map<string, StudioConnection>();\n private readonly wsToConnectionId = new Map<WebSocket, string>();\n private readonly controllers = new Set<WebSocket>();\n private readonly socketRoles = new Map<WebSocket, SocketRole>();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: WsMessage) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n targetWs: WebSocket;\n }\n >();\n private readonly relayRequests = new Map<string, RelayRequest>();\n private readonly rateState = new Map<WebSocket, { startedAt: number; count: number }>();\n private readonly token: string;\n private readonly host: string;\n private readonly maxPayloadBytes: number;\n private readonly handshakeTimeoutMs: number;\n private activeConnectionId: string | null = null;\n private port: number;\n\n constructor(port = 18088, options: ServerOptions = {}) {\n super();\n this.port = port;\n this.token = options.token ?? loadOrCreateBridgeToken();\n this.host = options.host ?? '127.0.0.1';\n this.maxPayloadBytes = options.maxPayloadBytes ?? MAX_MESSAGE_BYTES;\n this.handshakeTimeoutMs = options.handshakeTimeoutMs ?? HANDSHAKE_TIMEOUT_MS;\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({\n port,\n host: this.host,\n maxPayload: this.maxPayloadBytes,\n perMessageDeflate: false,\n });\n\n wss.on('listening', () => {\n this.wss = wss;\n this.port = port;\n wss.on('connection', (ws) => this.handleConnection(ws));\n this.emit('server:started', { port, host: this.host });\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 return;\n }\n this.emit('server:error', err);\n reject(err);\n });\n };\n\n tryPort(this.port, 0);\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n this.socketRoles.set(ws, 'unknown');\n this.rateState.set(ws, { startedAt: Date.now(), count: 0 });\n\n const handshakeTimer = setTimeout(() => {\n if (this.socketRoles.get(ws) === 'unknown') {\n ws.close(1008, 'Dominus handshake timed out');\n }\n }, this.handshakeTimeoutMs);\n\n ws.on('message', (raw) => {\n try {\n if (!this.consumeRateBudget(ws) || rawByteLength(raw) > this.maxPayloadBytes) {\n ws.close(1009, 'Dominus message limit exceeded');\n return;\n }\n const msg = parseMessage(raw.toString());\n const role = this.socketRoles.get(ws) ?? 'unknown';\n\n if (role === 'unknown') {\n clearTimeout(handshakeTimer);\n this.handleHandshake(ws, msg);\n } else if (role === 'controller') {\n this.handleControllerMessage(ws, msg);\n } else if (role === 'studio') {\n this.handleStudioMessage(ws, msg);\n }\n } catch (err) {\n this.emit('server:error', err);\n this.sendSafe(ws, createMessage(StudioMsg.AUTH_REJECTED, {\n error: err instanceof Error ? err.message : String(err),\n }));\n }\n });\n\n ws.on('close', () => {\n clearTimeout(handshakeTimer);\n this.cleanupSocket(ws);\n });\n\n ws.on('error', (err) => this.emit('server:error', err));\n }\n\n private consumeRateBudget(ws: WebSocket): boolean {\n const now = Date.now();\n const state = this.rateState.get(ws) ?? { startedAt: now, count: 0 };\n if (now - state.startedAt >= RATE_WINDOW_MS) {\n state.startedAt = now;\n state.count = 0;\n }\n state.count += 1;\n this.rateState.set(ws, state);\n return state.count <= RATE_LIMIT;\n }\n\n private handleHandshake(ws: WebSocket, msg: WsMessage): void {\n if (msg.type === StudioMsg.HELLO) {\n const hello = validateStudioHello(msg.payload);\n if (tokensEqual(hello.token, this.token)) {\n this.authorizeStudio(ws, hello, randomUUID());\n } else {\n this.sendSafe(ws, createMessage(StudioMsg.AUTH_REJECTED, {\n error: 'Studio plugin credentials are missing or stale. Run dominus-install-plugin and restart Studio.',\n }));\n ws.close(1008, 'Unauthorized Studio plugin');\n }\n return;\n }\n\n if (msg.type === ControllerMsg.HELLO) {\n const payload = msg.payload as { token?: unknown; protocolVersion?: unknown };\n if (payload.protocolVersion !== DOMINUS_PROTOCOL_VERSION || !tokensEqual(payload.token, this.token)) {\n this.sendSafe(ws, createMessage(StudioMsg.AUTH_REJECTED, { error: 'Invalid Dominus controller credentials' }));\n ws.close(1008, 'Unauthorized controller');\n return;\n }\n this.socketRoles.set(ws, 'controller');\n this.controllers.add(ws);\n this.sendSafe(ws, createMessage(ControllerMsg.WELCOME, {\n protocolVersion: DOMINUS_PROTOCOL_VERSION,\n port: this.port,\n connections: this.listConnections(),\n activeConnectionId: this.activeConnectionId,\n }));\n return;\n }\n\n this.sendSafe(ws, createMessage(StudioMsg.AUTH_REJECTED, {\n error: `Expected ${StudioMsg.HELLO} or ${ControllerMsg.HELLO}`,\n }));\n ws.close(1008, 'Invalid Dominus handshake');\n }\n\n private authorizeStudio(ws: WebSocket, hello: StudioConnectedPayload, connectionId: string): StudioConnection {\n const connection: StudioConnection = {\n ws,\n connectionId,\n clientId: hello.clientId!,\n connectedAt: Date.now(),\n studioVersion: hello.studioVersion,\n placeId: hello.placeId ?? 0,\n placeName: hello.placeName,\n };\n this.studioClients.set(connectionId, connection);\n this.wsToConnectionId.set(ws, connectionId);\n this.socketRoles.set(ws, 'studio');\n\n if (!this.activeConnectionId || !this.studioClients.has(this.activeConnectionId)) {\n this.activeConnectionId = connectionId;\n }\n\n this.sendSafe(ws, createMessage(StudioMsg.AUTHENTICATED, {\n protocolVersion: DOMINUS_PROTOCOL_VERSION,\n connectionId,\n token: this.token,\n }));\n const info = this.toPlaceInfo(connection);\n this.emit('studio:connected', info);\n this.broadcastToControllers(StudioMsg.CONNECTED, info);\n this.broadcastTargetState();\n return connection;\n }\n\n private handleControllerMessage(controllerWs: WebSocket, msg: WsMessage): void {\n if (msg.type === ControllerMsg.RELAY) {\n const payload = msg.payload as { connectionId?: unknown; request?: unknown };\n const request = parseMessage(JSON.stringify(payload.request));\n const target = this.resolveConnection(typeof payload.connectionId === 'string' ? payload.connectionId : null);\n if (!target) {\n this.sendResponse(controllerWs, request.id, { error: this.getTargetError() });\n return;\n }\n this.relayRequests.set(request.id, { controllerWs, targetWs: target.ws });\n this.sendSafe(target.ws, request);\n return;\n }\n\n if (msg.type === ControllerMsg.SET_ACTIVE_CONNECTION) {\n const payload = msg.payload as { connectionId?: unknown };\n const connectionId = typeof payload.connectionId === 'string' ? payload.connectionId : null;\n if (connectionId && !this.studioClients.has(connectionId)) {\n this.sendResponse(controllerWs, msg.id, { success: false, error: `Studio connection ${connectionId} is not connected` });\n return;\n }\n this.sendResponse(controllerWs, msg.id, { success: true, connectionId });\n return;\n }\n\n this.sendResponse(controllerWs, msg.id, { error: `Unsupported controller message: ${msg.type}` });\n }\n\n private handleStudioMessage(ws: WebSocket, msg: WsMessage): void {\n if (msg.type === StudioMsg.RESPONSE) {\n const relay = this.relayRequests.get(msg.id);\n if (relay) {\n if (relay.targetWs !== ws) {\n this.emit('server:error', new Error(`Ignored relayed response ${msg.id} from the wrong Studio session`));\n return;\n }\n this.sendSafe(relay.controllerWs, msg);\n this.relayRequests.delete(msg.id);\n return;\n }\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n if (pending.targetWs !== ws) {\n this.emit('server:error', new Error(`Ignored response ${msg.id} from the wrong Studio session`));\n return;\n }\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n pending.resolve(msg);\n }\n return;\n }\n\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n }\n\n private cleanupSocket(ws: WebSocket): void {\n const role = this.socketRoles.get(ws);\n this.socketRoles.delete(ws);\n this.rateState.delete(ws);\n\n if (role === 'controller') {\n this.controllers.delete(ws);\n for (const [id, relay] of this.relayRequests) {\n if (relay.controllerWs === ws) this.relayRequests.delete(id);\n }\n return;\n }\n\n const connectionId = this.wsToConnectionId.get(ws);\n if (!connectionId) return;\n const connection = this.studioClients.get(connectionId);\n this.wsToConnectionId.delete(ws);\n this.studioClients.delete(connectionId);\n\n for (const [id, pending] of this.pendingRequests) {\n if (pending.targetWs === ws) {\n clearTimeout(pending.timer);\n pending.reject(new Error(`Studio disconnected (${connectionId})`));\n this.pendingRequests.delete(id);\n }\n }\n for (const [id, relay] of this.relayRequests) {\n if (relay.targetWs === ws) {\n this.sendResponse(relay.controllerWs, id, { error: `Studio disconnected (${connectionId})` });\n this.relayRequests.delete(id);\n }\n }\n\n if (this.activeConnectionId === connectionId) {\n this.activeConnectionId = this.studioClients.size === 1\n ? this.studioClients.keys().next().value ?? null\n : null;\n }\n const info = connection ? this.toPlaceInfo(connection) : { connectionId };\n this.emit('studio:disconnected', info);\n this.broadcastToControllers(StudioMsg.DISCONNECTED, info);\n this.broadcastTargetState();\n }\n\n private resolveConnection(connectionId: string | null = this.activeConnectionId): StudioConnection | null {\n if (connectionId) {\n const connection = this.studioClients.get(connectionId);\n return connection?.ws.readyState === WebSocket.OPEN ? connection : null;\n }\n if (this.studioClients.size === 1) {\n const connection = this.studioClients.values().next().value as StudioConnection | undefined;\n return connection?.ws.readyState === WebSocket.OPEN ? connection : null;\n }\n return null;\n }\n\n private getTargetError(): string {\n if (this.studioClients.size === 0) return 'No authenticated Roblox Studio connection';\n if (this.activeConnectionId) return `Studio connection ${this.activeConnectionId} is unavailable`;\n return 'Multiple Studio sessions are connected. Call dominus_select_studio with a connectionId.';\n }\n\n private toPlaceInfo(connection: StudioConnection): PlaceInfo {\n return {\n placeId: connection.placeId ?? 0,\n connectionId: connection.connectionId,\n clientId: connection.clientId,\n placeName: connection.placeName,\n studioVersion: connection.studioVersion,\n connectedAt: connection.connectedAt,\n active: connection.connectionId === this.activeConnectionId,\n };\n }\n\n private broadcastToControllers(type: string, payload: unknown): void {\n const message = createMessage(type, payload);\n for (const controller of this.controllers) this.sendSafe(controller, message);\n }\n\n private broadcastTargetState(): void {\n this.broadcastToControllers(ControllerMsg.TARGET_STATE, {\n connections: this.listConnections(),\n defaultActiveConnectionId: this.activeConnectionId,\n });\n }\n\n private sendResponse(ws: WebSocket, id: string, payload: unknown): void {\n this.sendSafe(ws, { id, type: StudioMsg.RESPONSE, payload, ts: Date.now() });\n }\n\n private sendSafe(ws: WebSocket, message: WsMessage): void {\n if (ws.readyState !== WebSocket.OPEN) return;\n try {\n ws.send(serializeMessage(message));\n } catch (err) {\n this.emit('server:error', err);\n }\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 15_000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n const target = this.resolveConnection();\n if (!target) {\n reject(new Error(this.getTargetError()));\n return;\n }\n const message = createMessage(type, payload);\n const timer = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error(`Studio request timed out: ${type}`));\n }, timeoutMs);\n this.pendingRequests.set(message.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n targetWs: target.ws,\n });\n this.sendSafe(target.ws, message);\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n const target = this.resolveConnection();\n if (target) this.sendSafe(target.ws, createMessage(type, payload));\n }\n\n isConnected(): boolean {\n return this.resolveConnection() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.resolveConnection();\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.studioClients.values()]\n .filter(({ ws }) => ws.readyState === WebSocket.OPEN)\n .map((connection) => this.toPlaceInfo(connection));\n }\n\n getActiveConnectionId(): string | null {\n return this.activeConnectionId;\n }\n\n async setActiveConnectionId(connectionId: string | null): Promise<void> {\n if (connectionId && !this.studioClients.has(connectionId)) {\n throw new Error(`Studio connection ${connectionId} is not connected`);\n }\n this.activeConnectionId = connectionId;\n this.broadcastTargetState();\n }\n\n getActivePlaceId(): number {\n return this.resolveConnection()?.placeId ?? 0;\n }\n\n setActivePlaceId(placeId: number): void {\n if (placeId === 0) {\n this.activeConnectionId = null;\n return;\n }\n const matches = [...this.studioClients.values()].filter((connection) => connection.placeId === placeId);\n if (matches.length !== 1) {\n throw new Error(matches.length === 0\n ? `Place ${placeId} is not connected`\n : `Place ${placeId} has multiple Studio sessions; select a connectionId instead`);\n }\n this.activeConnectionId = matches[0].connectionId;\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Dominus bridge is shutting down'));\n }\n this.pendingRequests.clear();\n this.relayRequests.clear();\n for (const ws of this.socketRoles.keys()) ws.close(1001, 'Dominus bridge shutdown');\n this.studioClients.clear();\n this.controllers.clear();\n this.socketRoles.clear();\n this.wsToConnectionId.clear();\n if (this.wss) this.wss.close(() => resolve());\n else resolve();\n });\n }\n}\n\nfunction validateStudioHello(payload: unknown): StudioConnectedPayload {\n if (!payload || typeof payload !== 'object') throw new Error('Invalid Studio hello payload');\n const hello = payload as StudioConnectedPayload;\n if (hello.protocolVersion !== DOMINUS_PROTOCOL_VERSION) {\n throw new Error(`Studio plugin protocol ${hello.protocolVersion ?? 'unknown'} is incompatible; expected ${DOMINUS_PROTOCOL_VERSION}`);\n }\n if (typeof hello.clientId !== 'string' || hello.clientId.length < 8 || hello.clientId.length > 128) {\n throw new Error('Studio hello is missing a valid clientId');\n }\n if (typeof hello.studioVersion !== 'string' || hello.studioVersion.length > 128) {\n throw new Error('Studio hello is missing studioVersion');\n }\n if (hello.placeName && hello.placeName.length > 256) throw new Error('Studio placeName is too long');\n return hello;\n}\n\nfunction rawByteLength(raw: RawData): number {\n if (typeof raw === 'string') return Buffer.byteLength(raw);\n if (Array.isArray(raw)) return raw.reduce((total, item) => total + item.byteLength, 0);\n return raw.byteLength;\n}\n","export const DOMINUS_MCP_INSTRUCTIONS = `Dominus 2 is a Roblox Studio engineering MCP server.\n\nRequired workflow for Studio changes:\n1. Call dominus_status and select the intended Studio connection when more than one is open.\n2. Inspect the relevant tree, selection, instances, scripts, and Roblox API references before editing.\n3. Form a short plan with explicit acceptance checks.\n4. Use stable instance refs returned by Dominus. Prefer instanceId; retain pathSegments as fallback context.\n5. Apply the smallest coherent mutation. Script updates require the expectedRevision returned by studio_read_script.\n6. Read the affected instances back and compare exact values, hierarchy, and source revisions.\n7. Run an appropriate Studio test when behavior changed. Report verification evidence and any remaining uncertainty.\n\nSafety rules:\n- Never invent instance IDs or Roblox API members.\n- Do not retry a failed write unchanged. Inspect the error and current state first.\n- Deletion is a separate destructive tool and requires explicit user intent.\n- studio_apply is transactional. Keep related edits together, but stay within its documented limits.\n- UI fidelity work must snapshot and inspect the result after building; verify fonts, UDim2 values, colors, strokes, and hierarchy.\n- Dominus intentionally has no arbitrary Luau execution tool.`;\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport { DOMINUS_MCP_INSTRUCTIONS } from './instructions.js';\n\nexport function registerDominusResources(server: McpServer, bridge: StudioBridge): void {\n server.registerResource('dominus-status', 'dominus://status', {\n title: 'Dominus 2 Studio Status',\n description: 'Current authenticated Roblox Studio sessions and selected target.',\n mimeType: 'application/json',\n }, async (uri) => ({\n contents: [{\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n protocolVersion: 2,\n activeConnectionId: bridge.getActiveConnectionId(),\n connections: bridge.listConnections(),\n }, null, 2),\n }],\n }));\n\n server.registerPrompt('dominus-workflow', {\n title: 'Dominus 2 Engineering Workflow',\n description: 'Inspect, plan, apply, verify, and test a Roblox Studio change safely.',\n }, async () => ({\n messages: [{\n role: 'user',\n content: { type: 'text', text: DOMINUS_MCP_INSTRUCTIONS },\n }],\n }));\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport interface DominusToolOutput extends Record<string, unknown> {\n success: boolean;\n data?: Record<string, unknown>;\n error?: string;\n}\n\nexport function toolResult(output: DominusToolOutput): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n isError: !output.success,\n };\n}\n\nexport function success(data: Record<string, unknown> = {}): CallToolResult {\n return toolResult({ success: true, data });\n}\n\nexport function failure(error: unknown, data?: Record<string, unknown>): CallToolResult {\n return toolResult({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n data,\n });\n}\n","import { z } from 'zod';\nimport { CliMsg, type InstanceRef } from '../../transport/protocol.js';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport { failure, success } from '../result.js';\n\nexport const instanceRefSchema = z.object({\n instanceId: z.string().uuid().optional(),\n pathSegments: z.array(z.string().min(1).max(256)).min(1).max(100).optional(),\n}).refine((value) => Boolean(value.instanceId || value.pathSegments), {\n message: 'Provide instanceId or pathSegments',\n});\n\nexport const toolOutputSchema = {\n success: z.boolean(),\n data: z.record(z.unknown()).optional(),\n error: z.string().optional(),\n};\n\nexport async function callStudio(\n bridge: StudioBridge,\n command: (typeof CliMsg)[keyof typeof CliMsg],\n payload: Record<string, unknown>,\n timeoutMs = 15_000,\n) {\n try {\n const response = await bridge.sendRequest<Record<string, unknown>>(command, payload, timeoutMs);\n const result = response.payload;\n if (!result || typeof result !== 'object') return failure('Studio returned an invalid response');\n if (result.success === false || typeof result.error === 'string') {\n return failure(result.error ?? 'Studio command failed', result);\n }\n return success(result);\n } catch (err) {\n return failure(err);\n }\n}\n\nexport function ref(value: unknown): InstanceRef {\n return value as InstanceRef;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport { failure, success } from '../result.js';\nimport { toolOutputSchema } from './shared.js';\n\nexport function registerConnectionTools(server: McpServer, bridge: StudioBridge): void {\n server.registerTool('dominus_status', {\n title: 'Dominus Studio Status',\n description: 'List authenticated Roblox Studio sessions, the active target, and bridge health. Call this before Studio work.',\n inputSchema: {},\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, async () => {\n try {\n return success({\n protocolVersion: 2,\n port: bridge.getPort(),\n activeConnectionId: bridge.getActiveConnectionId(),\n connections: bridge.listConnections(),\n });\n } catch (err) {\n return failure(err);\n }\n });\n\n server.registerTool('dominus_select_studio', {\n title: 'Select Studio Session',\n description: 'Choose the exact Studio connection targeted by subsequent tools. Uses connectionId, not placeId, so duplicate windows are safe.',\n inputSchema: { connectionId: z.string().uuid().nullable() },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, async ({ connectionId }) => {\n try {\n await bridge.setActiveConnectionId(connectionId);\n return success({ activeConnectionId: bridge.getActiveConnectionId() });\n } catch (err) {\n return failure(err);\n }\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type RobloxApiKind = 'class' | 'datatype' | 'enum' | 'global' | 'library';\n\nexport interface RobloxApiMember {\n name: string;\n memberType: string;\n definedOn?: string;\n type?: string;\n summary?: string;\n description?: string;\n parameters?: { name?: string; type?: string; summary?: string; default?: string }[];\n returns?: { type?: string; summary?: string }[];\n tags?: string[];\n security?: { read?: string; write?: string };\n threadSafety?: string;\n category?: string;\n deprecationMessage?: string;\n value?: number;\n}\n\nexport interface RobloxApiReference {\n name: string;\n kind: RobloxApiKind;\n summary: string;\n description: string;\n inherits: string[];\n tags: string[];\n deprecationMessage: string;\n sourceUrl: string;\n members: Record<string, RobloxApiMember[]>;\n inheritedClasses?: string[];\n inheritedMembers?: Record<string, RobloxApiMember[]>;\n}\n\nexport interface RobloxApiSearchResult {\n name: string;\n kind: RobloxApiKind;\n score: number;\n sourceUrl: string;\n}\n\ninterface DocsOptions {\n docsRoot?: string;\n includeInherited?: boolean;\n}\n\nconst GITHUB_RAW_BASE =\n 'https://raw.githubusercontent.com/Roblox/creator-docs/main/content/en-us/reference/engine';\nconst GITHUB_TREE_URL =\n 'https://api.github.com/repos/Roblox/creator-docs/git/trees/main?recursive=1';\n\nconst KIND_FOLDERS: Record<RobloxApiKind, string> = {\n class: 'classes',\n datatype: 'datatypes',\n enum: 'enums',\n global: 'globals',\n library: 'libraries',\n};\n\nconst MEMBER_SECTIONS = [\n 'properties',\n 'methods',\n 'events',\n 'callbacks',\n 'constructors',\n 'functions',\n 'items',\n 'constants',\n 'math_operations',\n];\n\nlet remoteTreeCache: { path: string; type: string }[] | null = null;\n\nexport async function getRobloxApiReference(\n name: string,\n opts: DocsOptions & { kind?: RobloxApiKind | 'any' } = {},\n): Promise<RobloxApiReference> {\n const normalizedName = normalizeLookupName(name);\n const kinds = opts.kind && opts.kind !== 'any'\n ? [opts.kind]\n : (Object.keys(KIND_FOLDERS) as RobloxApiKind[]);\n\n for (const kind of kinds) {\n const doc = await readReferenceYaml(normalizedName, kind, opts);\n if (!doc) continue;\n\n const reference = parseReferenceYaml(doc.content, {\n kind,\n sourceUrl: doc.sourceUrl,\n });\n markDefinedOn(reference, reference.name);\n\n if (opts.includeInherited && reference.kind === 'class') {\n const inherited = await collectInheritedMembers(reference, opts, new Set([reference.name]));\n reference.inheritedClasses = inherited.classes;\n reference.inheritedMembers = inherited.members;\n }\n\n return reference;\n }\n\n throw new Error(`Roblox API reference not found for \"${name}\"`);\n}\n\nasync function collectInheritedMembers(\n reference: RobloxApiReference,\n opts: DocsOptions,\n visited: Set<string>,\n): Promise<{ classes: string[]; members: Record<string, RobloxApiMember[]> }> {\n const classes: string[] = [];\n const members: Record<string, RobloxApiMember[]> = {};\n\n for (const parent of reference.inherits) {\n if (!parent || visited.has(parent)) continue;\n visited.add(parent);\n\n const doc = await readReferenceYaml(parent, 'class', opts);\n if (!doc) continue;\n\n const parentReference = parseReferenceYaml(doc.content, {\n kind: 'class',\n sourceUrl: doc.sourceUrl,\n });\n markDefinedOn(parentReference, parentReference.name);\n\n classes.push(parentReference.name);\n mergeMembers(members, parentReference.members);\n\n const inherited = await collectInheritedMembers(parentReference, opts, visited);\n classes.push(...inherited.classes);\n mergeMembers(members, inherited.members);\n }\n\n return { classes, members };\n}\n\nfunction markDefinedOn(reference: RobloxApiReference, className: string): void {\n for (const section of Object.values(reference.members)) {\n for (const member of section) {\n member.definedOn = className;\n }\n }\n}\n\nfunction mergeMembers(\n target: Record<string, RobloxApiMember[]>,\n source: Record<string, RobloxApiMember[]>,\n): void {\n for (const [section, members] of Object.entries(source)) {\n target[section] ??= [];\n target[section].push(...members);\n }\n}\n\nexport async function searchRobloxApi(\n query: string,\n opts: DocsOptions & { kind?: RobloxApiKind | 'any'; limit?: number } = {},\n): Promise<RobloxApiSearchResult[]> {\n const limit = Math.max(1, Math.min(opts.limit ?? 10, 50));\n const normalizedQuery = normalizeSearchText(query);\n const kinds = opts.kind && opts.kind !== 'any'\n ? [opts.kind]\n : (Object.keys(KIND_FOLDERS) as RobloxApiKind[]);\n\n const entries = await listReferenceEntries(opts);\n return entries\n .filter((entry) => kinds.includes(entry.kind))\n .map((entry) => ({\n ...entry,\n score: scoreSearchResult(normalizedQuery, entry.name, entry.kind),\n }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))\n .slice(0, limit);\n}\n\nexport function parseReferenceYaml(\n raw: string,\n opts: { kind?: RobloxApiKind; sourceUrl?: string } = {},\n): RobloxApiReference {\n const kind = opts.kind ?? normalizeKind(readTopScalar(raw, 'type')) ?? 'class';\n const members: Record<string, RobloxApiMember[]> = {};\n\n for (const section of MEMBER_SECTIONS) {\n const parsed = parseMemberSection(raw, section);\n if (parsed.length > 0) {\n members[section] = parsed;\n }\n }\n\n return {\n name: readTopScalar(raw, 'name') || 'Unknown',\n kind,\n summary: cleanDocText(readTopScalar(raw, 'summary')),\n description: cleanDocText(readTopScalar(raw, 'description')),\n inherits: readTopList(raw, 'inherits'),\n tags: readTopList(raw, 'tags'),\n deprecationMessage: cleanDocText(readTopScalar(raw, 'deprecation_message')),\n sourceUrl: opts.sourceUrl ?? '',\n members,\n };\n}\n\nfunction normalizeKind(value: string): RobloxApiKind | undefined {\n if (value === 'class' || value === 'datatype' || value === 'enum' || value === 'global' || value === 'library') {\n return value;\n }\n return undefined;\n}\n\nasync function readReferenceYaml(\n name: string,\n kind: RobloxApiKind,\n opts: DocsOptions,\n): Promise<{ content: string; sourceUrl: string } | null> {\n const localRoot = resolveDocsRoot(opts.docsRoot);\n const folder = KIND_FOLDERS[kind];\n const fileName = `${name}.yaml`;\n\n if (localRoot) {\n const localPath = path.join(localRoot, folder, fileName);\n if (fs.existsSync(localPath)) {\n return {\n content: fs.readFileSync(localPath, 'utf-8'),\n sourceUrl: toCreatorDocsUrl(kind, name),\n };\n }\n }\n\n const sourceUrl = `${GITHUB_RAW_BASE}/${folder}/${encodeURIComponent(fileName)}`;\n try {\n return {\n content: await fetchText(sourceUrl),\n sourceUrl: toCreatorDocsUrl(kind, name),\n };\n } catch {\n return null;\n }\n}\n\nasync function listReferenceEntries(opts: DocsOptions): Promise<RobloxApiSearchResult[]> {\n const localRoot = resolveDocsRoot(opts.docsRoot);\n if (localRoot) {\n const entries: RobloxApiSearchResult[] = [];\n for (const [kind, folder] of Object.entries(KIND_FOLDERS) as [RobloxApiKind, string][]) {\n const dir = path.join(localRoot, folder);\n if (!fs.existsSync(dir)) continue;\n\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith('.yaml')) continue;\n const name = path.basename(file, '.yaml');\n entries.push({ name, kind, score: 0, sourceUrl: toCreatorDocsUrl(kind, name) });\n }\n }\n return entries;\n }\n\n const tree = await getRemoteTree();\n const prefix = 'content/en-us/reference/engine/';\n return tree\n .filter((entry) => entry.type === 'blob')\n .map((entry) => entry.path)\n .filter((entryPath) => entryPath.startsWith(prefix) && entryPath.endsWith('.yaml'))\n .flatMap((entryPath) => {\n const rest = entryPath.slice(prefix.length);\n const [folder, file] = rest.split('/');\n const kind = folderToKind(folder);\n if (!kind || !file) return [];\n\n const name = path.basename(file, '.yaml');\n return [{ name, kind, score: 0, sourceUrl: toCreatorDocsUrl(kind, name) }];\n });\n}\n\nasync function getRemoteTree(): Promise<{ path: string; type: string }[]> {\n if (remoteTreeCache) return remoteTreeCache;\n\n const payload = JSON.parse(await fetchText(GITHUB_TREE_URL)) as {\n tree?: { path: string; type: string }[];\n };\n remoteTreeCache = payload.tree ?? [];\n return remoteTreeCache;\n}\n\nfunction folderToKind(folder: string): RobloxApiKind | undefined {\n for (const [kind, value] of Object.entries(KIND_FOLDERS) as [RobloxApiKind, string][]) {\n if (value === folder) return kind;\n }\n return undefined;\n}\n\nfunction resolveDocsRoot(explicitRoot?: string): string | null {\n const candidates = [\n explicitRoot,\n process.env.ROBLOX_CREATOR_DOCS_PATH,\n path.join(process.cwd(), '.tmp', 'creator-docs'),\n ].filter(Boolean) as string[];\n\n for (const candidate of candidates) {\n const normalized = normalizeDocsRoot(candidate);\n if (normalized && fs.existsSync(normalized)) return normalized;\n }\n\n return null;\n}\n\nfunction normalizeDocsRoot(root: string): string | null {\n const engineRoot = path.join(root, 'content', 'en-us', 'reference', 'engine');\n if (fs.existsSync(engineRoot)) return engineRoot;\n\n const directClasses = path.join(root, 'classes');\n if (fs.existsSync(directClasses)) return root;\n\n return null;\n}\n\nfunction normalizeLookupName(name: string): string {\n const trimmed = name.trim();\n const ownerName = trimmed.split(':')[0];\n const lastToken = ownerName.split('.').pop() ?? ownerName;\n return lastToken.replace(/[^A-Za-z0-9_]/g, '');\n}\n\nfunction normalizeSearchText(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_]+/g, '');\n}\n\nfunction scoreSearchResult(query: string, name: string, kind: RobloxApiKind): number {\n if (!query) return 1;\n\n const normalizedName = normalizeSearchText(name);\n if (normalizedName === query) return 100;\n if (normalizedName.startsWith(query)) return 75;\n if (normalizedName.includes(query)) return 50;\n\n const kindScore = kind.includes(query) ? 10 : 0;\n return kindScore;\n}\n\nfunction toCreatorDocsUrl(kind: RobloxApiKind, name: string): string {\n return `https://create.roblox.com/docs/reference/engine/${KIND_FOLDERS[kind]}/${name}`;\n}\n\nasync function fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { 'User-Agent': 'Dominus Roblox API docs lookup' },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);\n }\n return response.text();\n}\n\nfunction readTopScalar(raw: string, key: string): string {\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n return readYamlValue(lines, i, 0, match[1]);\n }\n return '';\n}\n\nfunction readTopList(raw: string, key: string): string[] {\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n\n const inline = match[1].trim();\n if (inline === '[]' || inline === '') {\n if (inline === '[]') return [];\n return readIndentedList(lines, i + 1, 2);\n }\n return [unquote(inline)];\n }\n return [];\n}\n\nfunction parseMemberSection(raw: string, section: string): RobloxApiMember[] {\n const sectionLines = extractTopSection(raw, section);\n if (sectionLines.length === 0) return [];\n\n const items = splitMemberItems(sectionLines);\n return items\n .map((item) => parseMemberItem(item, section))\n .filter((item): item is RobloxApiMember => Boolean(item));\n}\n\nfunction extractTopSection(raw: string, section: string): string[] {\n const lines = raw.split(/\\r?\\n/);\n const start = lines.findIndex((line) => line === `${section}:`);\n if (start === -1) return [];\n\n const result: string[] = [];\n for (let i = start + 1; i < lines.length; i++) {\n if (/^[A-Za-z_][A-Za-z0-9_]*:/.test(lines[i])) break;\n result.push(lines[i]);\n }\n return result;\n}\n\nfunction splitMemberItems(lines: string[]): string[][] {\n const items: string[][] = [];\n let current: string[] = [];\n\n for (const line of lines) {\n if (/^ - /.test(line)) {\n if (current.length > 0) items.push(current);\n current = [line];\n continue;\n }\n if (current.length > 0) current.push(line);\n }\n\n if (current.length > 0) items.push(current);\n return items;\n}\n\nfunction parseMemberItem(lines: string[], section: string): RobloxApiMember | null {\n const name = readMemberScalar(lines, 'name');\n if (!name) return null;\n\n const member: RobloxApiMember = {\n name,\n memberType: section,\n type: readMemberScalar(lines, 'type') || readMemberScalar(lines, 'return_type'),\n summary: cleanDocText(readMemberScalar(lines, 'summary')),\n description: cleanDocText(readMemberScalar(lines, 'description')),\n parameters: readNestedObjects(lines, 'parameters'),\n returns: readNestedObjects(lines, 'returns'),\n tags: readMemberList(lines, 'tags'),\n security: readSecurity(lines),\n threadSafety: readMemberScalar(lines, 'thread_safety'),\n category: readMemberScalar(lines, 'category'),\n deprecationMessage: cleanDocText(readMemberScalar(lines, 'deprecation_message')),\n };\n\n const value = Number(readMemberScalar(lines, 'value'));\n if (Number.isFinite(value)) member.value = value;\n\n return member;\n}\n\nfunction readMemberScalar(lines: string[], key: string): string {\n for (let i = 0; i < lines.length; i++) {\n const firstLinePattern = new RegExp(`^ - ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const fieldPattern = new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const firstLineMatch = lines[i].match(firstLinePattern);\n const fieldMatch = lines[i].match(fieldPattern);\n const match = firstLineMatch ?? fieldMatch;\n if (!match) continue;\n return readYamlValue(lines, i, firstLineMatch ? 2 : 4, match[1]);\n }\n return '';\n}\n\nfunction readMemberList(lines: string[], key: string): string[] {\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n const inline = match[1].trim();\n if (inline === '[]') return [];\n if (inline) return [unquote(inline)];\n return readIndentedList(lines, i + 1, 6);\n }\n return [];\n}\n\nfunction readNestedObjects(lines: string[], key: string): { name?: string; type?: string; summary?: string; default?: string }[] {\n const start = lines.findIndex((line) => line === ` ${key}:`);\n if (start === -1) return [];\n\n const nested: string[] = [];\n for (let i = start + 1; i < lines.length; i++) {\n if (/^ [A-Za-z_][A-Za-z0-9_]*:/.test(lines[i])) break;\n nested.push(lines[i]);\n }\n\n const items: string[][] = [];\n let current: string[] = [];\n for (const line of nested) {\n if (/^ - /.test(line)) {\n if (current.length > 0) items.push(current);\n current = [line];\n continue;\n }\n if (current.length > 0) current.push(line);\n }\n if (current.length > 0) items.push(current);\n\n return items.map((item) => ({\n name: readNestedScalar(item, 'name'),\n type: readNestedScalar(item, 'type'),\n summary: cleanDocText(readNestedScalar(item, 'summary')),\n default: readNestedScalar(item, 'default'),\n }));\n}\n\nfunction readNestedScalar(lines: string[], key: string): string {\n for (let i = 0; i < lines.length; i++) {\n const firstLinePattern = new RegExp(`^ - ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const fieldPattern = new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const firstLineMatch = lines[i].match(firstLinePattern);\n const fieldMatch = lines[i].match(fieldPattern);\n const match = firstLineMatch ?? fieldMatch;\n if (!match) continue;\n return readYamlValue(lines, i, firstLineMatch ? 6 : 8, match[1]);\n }\n return '';\n}\n\nfunction readSecurity(lines: string[]): { read?: string; write?: string } | undefined {\n const start = lines.findIndex((line) => line === ' security:');\n if (start === -1) return undefined;\n\n return {\n read: readIndentedScalar(lines, start + 1, 'read', 6),\n write: readIndentedScalar(lines, start + 1, 'write', 6),\n };\n}\n\nfunction readIndentedScalar(lines: string[], start: number, key: string, indent: number): string {\n const pattern = new RegExp(`^\\\\s{${indent}}${escapeRegExp(key)}:\\\\s*(.*)$`);\n for (let i = start; i < lines.length; i++) {\n if (indentOf(lines[i]) < indent) break;\n const match = lines[i].match(pattern);\n if (match) return unquote(match[1].trim());\n }\n return '';\n}\n\nfunction readYamlValue(lines: string[], index: number, indent: number, rawValue: string): string {\n const value = rawValue.trim();\n if (value === '|-' || value === '|') {\n return readBlock(lines, index + 1, indent + 2);\n }\n if (value === \"''\" || value === '\"\"') return '';\n return unquote(value);\n}\n\nfunction readBlock(lines: string[], start: number, minIndent: number): string {\n const block: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() && indentOf(line) < minIndent) break;\n block.push(line.slice(Math.min(minIndent, line.length)));\n }\n return block.join('\\n').trim();\n}\n\nfunction readIndentedList(lines: string[], start: number, indent: number): string[] {\n const pattern = new RegExp(`^\\\\s{${indent}}-\\\\s*(.*)$`);\n const values: string[] = [];\n for (let i = start; i < lines.length; i++) {\n if (lines[i].trim() && indentOf(lines[i]) < indent) break;\n const match = lines[i].match(pattern);\n if (match) values.push(unquote(match[1].trim()));\n }\n return values;\n}\n\nfunction cleanDocText(value: string): string {\n return value\n .replace(/\\r/g, '')\n .replace(/[ \\t]+\\n/g, '\\n')\n .trim();\n}\n\nfunction indentOf(line: string): number {\n return line.match(/^ */)?.[0].length ?? 0;\n}\n\nfunction unquote(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"'))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { getRobloxApiReference, searchRobloxApi } from '../../docs/roblox-api.js';\nimport { failure, success } from '../result.js';\nimport { toolOutputSchema } from './shared.js';\n\nconst kindSchema = z.enum(['any', 'class', 'datatype', 'enum', 'global', 'library']);\n\nexport function registerDocsTools(server: McpServer): void {\n server.registerTool('roblox_search_api', {\n title: 'Search Roblox API',\n description: 'Search the official Roblox Creator Docs engine API mirror by exact or partial class, datatype, enum, global, or library name.',\n inputSchema: {\n query: z.string().min(1).max(100),\n kind: kindSchema.optional().default('any'),\n limit: z.number().int().min(1).max(25).optional().default(10),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n }, async ({ query, kind, limit }) => {\n try {\n return success({ results: await searchRobloxApi(query, { kind, limit }) });\n } catch (err) {\n return failure(err);\n }\n });\n\n server.registerTool('roblox_get_api', {\n title: 'Get Roblox API Reference',\n description: 'Read an official Roblox engine API reference including members, types, security, thread safety, inheritance, and source URL.',\n inputSchema: {\n name: z.string().min(1).max(100),\n kind: kindSchema.optional().default('any'),\n includeInherited: z.boolean().optional().default(true),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n }, async ({ name, kind, includeInherited }) => {\n try {\n const reference = await getRobloxApiReference(name, { kind, includeInherited });\n return success({ reference });\n } catch (err) {\n return failure(err);\n }\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CliMsg } from '../../transport/protocol.js';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport { callStudio, instanceRefSchema, ref, toolOutputSchema } from './shared.js';\n\nconst propertiesSchema = z.record(z.unknown()).refine(\n (properties) => Object.keys(properties).length <= 100,\n 'At most 100 properties are allowed per operation',\n);\n\nconst setPropertiesOperation = z.object({\n op: z.literal('setProperties'),\n target: instanceRefSchema,\n properties: propertiesSchema,\n});\n\nconst createOperation = z.object({\n op: z.literal('create'),\n parent: instanceRefSchema,\n className: z.string().min(1).max(100),\n name: z.string().min(1).max(256),\n properties: propertiesSchema.optional(),\n});\n\nconst moveOperation = z.object({\n op: z.literal('move'),\n target: instanceRefSchema,\n parent: instanceRefSchema,\n});\n\nconst mutationOperation = z.discriminatedUnion('op', [\n setPropertiesOperation,\n createOperation,\n moveOperation,\n]);\n\ntype UiNode = {\n ClassName: string;\n Name?: string;\n properties?: Record<string, unknown>;\n Children?: UiNode[];\n};\n\nconst uiNodeSchema: z.ZodType<UiNode> = z.lazy(() => z.object({\n ClassName: z.string().min(1).max(100),\n Name: z.string().min(1).max(256).optional(),\n properties: propertiesSchema.optional(),\n Children: z.array(uiNodeSchema).max(1000).optional(),\n}));\n\nexport function registerStudioTools(server: McpServer, bridge: StudioBridge): void {\n server.registerTool('studio_get_tree', {\n title: 'Inspect Studio Tree',\n description: 'Read a deterministic Studio hierarchy and receive stable instance refs. Use refs from this result in later calls.',\n inputSchema: {\n root: instanceRefSchema.optional(),\n maxDepth: z.number().int().min(0).max(12).optional().default(3),\n maxNodes: z.number().int().min(1).max(5000).optional().default(1000),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, ({ root, maxDepth, maxNodes }) => callStudio(bridge, CliMsg.V2_GET_TREE, {\n root: root ? ref(root) : undefined,\n maxDepth,\n maxNodes,\n }));\n\n server.registerTool('studio_inspect', {\n title: 'Inspect Studio Instances',\n description: 'Read typed property values and immediate children for up to 20 instance refs. Returns writable metadata from live ReflectionService.',\n inputSchema: {\n targets: z.array(instanceRefSchema).min(1).max(20),\n compact: z.boolean().optional().default(true),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, ({ targets, compact }) => callStudio(bridge, CliMsg.V2_INSPECT, { targets, compact }));\n\n server.registerTool('studio_get_selection', {\n title: 'Get Studio Selection',\n description: 'Return the user current Roblox Studio selection as stable instance refs.',\n inputSchema: {},\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, () => callStudio(bridge, CliMsg.V2_GET_SELECTION, {}));\n\n server.registerTool('studio_read_script', {\n title: 'Read Studio Script',\n description: 'Read a Script, LocalScript, or ModuleScript and receive its source plus a revision required for conflict-safe updates.',\n inputSchema: { target: instanceRefSchema },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, ({ target }) => callStudio(bridge, CliMsg.V2_READ_SCRIPT, { target }));\n\n server.registerTool('studio_update_script', {\n title: 'Update Studio Script',\n description: 'Replace script source only if expectedRevision still matches the editor. Read the script again after updating to verify it.',\n inputSchema: {\n target: instanceRefSchema,\n source: z.string().max(750_000),\n expectedRevision: z.string().regex(/^\\d+:[0-9a-f]{8}$/),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },\n }, ({ target, source, expectedRevision }) => callStudio(\n bridge,\n CliMsg.V2_UPDATE_SCRIPT,\n { target, source, expectedRevision },\n 60_000,\n ));\n\n server.registerTool('studio_apply', {\n title: 'Apply Atomic Studio Mutations',\n description: 'Atomically set properties, create instances, and move instances. Any failed operation cancels and undoes the entire batch.',\n inputSchema: { operations: z.array(mutationOperation).min(1).max(100) },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },\n }, ({ operations }) => callStudio(bridge, CliMsg.V2_APPLY, { operations }, 60_000));\n\n server.registerTool('studio_delete_instances', {\n title: 'Delete Studio Instances',\n description: 'Destructively delete up to 50 instances in one undoable recording. Only call when the user explicitly requested deletion or cleanup.',\n inputSchema: {\n targets: z.array(instanceRefSchema).min(1).max(50),\n confirm: z.literal(true),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },\n }, ({ targets, confirm }) => callStudio(bridge, CliMsg.V2_DELETE, { targets, confirm }, 60_000));\n\n server.registerTool('studio_build_ui', {\n title: 'Build Atomic Roblox UI',\n description: 'Build and validate a declarative UI tree off-tree, then commit it in one undoable operation. Existing UI is replaced only when replaceExisting is true.',\n inputSchema: {\n parent: instanceRefSchema.optional(),\n tree: uiNodeSchema,\n replaceExisting: z.boolean().optional().default(false),\n maxDepth: z.number().int().min(1).max(50).optional().default(30),\n maxNodes: z.number().int().min(1).max(3000).optional().default(1000),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },\n }, ({ parent, tree, replaceExisting, maxDepth, maxNodes }) => callStudio(\n bridge,\n CliMsg.V2_BUILD_UI,\n { parent, tree, replaceExisting, maxDepth, maxNodes },\n 120_000,\n ));\n\n server.registerTool('studio_snapshot_ui', {\n title: 'Snapshot Roblox UI',\n description: 'Serialize a live UI subtree into typed, studio_build_ui-compatible data for fidelity checks and read-back verification.',\n inputSchema: {\n target: instanceRefSchema,\n maxDepth: z.number().int().min(0).max(50).optional().default(30),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, ({ target, maxDepth }) => callStudio(bridge, CliMsg.V2_SNAPSHOT_UI, { target, maxDepth }, 120_000));\n\n server.registerTool('studio_run_test', {\n title: 'Run Roblox Studio Test',\n description: 'Run a bounded StudioTestService run, play, or multiplayer scenario. The game test harness must call StudioTestService:EndTest with its result.',\n inputSchema: {\n mode: z.enum(['run', 'play', 'multiplayer']).optional().default('run'),\n args: z.unknown().optional(),\n players: z.number().int().min(1).max(8).optional().default(1),\n timeoutMs: z.number().int().min(5_000).max(600_000).optional().default(120_000),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },\n }, ({ mode, args, players, timeoutMs }) => callStudio(\n bridge,\n CliMsg.V2_RUN_TEST,\n { mode, args, players, timeoutMs },\n timeoutMs + 15_000,\n ));\n\n server.registerTool('studio_get_output', {\n title: 'Read Studio Output',\n description: 'Read the bounded Studio output buffer, optionally filtered by severity. Dominus transport messages are excluded.',\n inputSchema: {\n limit: z.number().int().min(1).max(500).optional().default(100),\n level: z.enum(['info', 'warn', 'error']).optional(),\n },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, ({ limit, level }) => callStudio(bridge, CliMsg.V2_GET_OUTPUT, { limit, level }));\n\n server.registerTool('studio_get_reflection', {\n title: 'Read Live Roblox Reflection',\n description: 'Read current ReflectionService fields for a class in the connected Studio, including Type, Display category, and permission metadata.',\n inputSchema: { className: z.string().min(1).max(100) },\n outputSchema: toolOutputSchema,\n annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },\n }, ({ className }) => callStudio(bridge, CliMsg.V2_GET_REFLECTION, { className }));\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from '../config/config.js';\nimport { DominusClient, isPortInUse } from '../transport/ws-client.js';\nimport { DominusServer, type StudioBridge } from '../transport/ws-server.js';\nimport { DOMINUS_MCP_INSTRUCTIONS } from './instructions.js';\nimport { registerDominusResources } from './resources.js';\nimport { registerConnectionTools } from './tools/connections.js';\nimport { registerDocsTools } from './tools/docs.js';\nimport { registerStudioTools } from './tools/studio.js';\n\nconst VERSION = '2.1.1';\n\nexport function createDominusMcpServer(bridge: StudioBridge): McpServer {\n const server = new McpServer({\n name: 'dominus-2',\n version: VERSION,\n }, {\n instructions: DOMINUS_MCP_INSTRUCTIONS,\n });\n\n registerConnectionTools(server, bridge);\n registerStudioTools(server, bridge);\n registerDocsTools(server);\n registerDominusResources(server, bridge);\n return server;\n}\n\nexport async function createStudioBridge(port: number): Promise<StudioBridge> {\n if (await isPortInUse(port)) {\n const client = new DominusClient(port);\n await client.connect();\n return client;\n }\n\n const server = new DominusServer(port);\n try {\n await server.start();\n return server;\n } catch (err) {\n const error = err as NodeJS.ErrnoException;\n if (error.code !== 'EADDRINUSE') throw err;\n const client = new DominusClient(port);\n await client.connect();\n return client;\n }\n}\n\nexport async function startMcpServer(): Promise<void> {\n const config = loadConfig();\n const bridge = await createStudioBridge(config.port);\n const server = createDominusMcpServer(bridge);\n const transport = new StdioServerTransport();\n\n let stopped = false;\n const stop = async () => {\n if (stopped) return;\n stopped = true;\n await bridge.stop();\n };\n process.once('SIGINT', () => void stop().finally(() => process.exit(0)));\n process.once('SIGTERM', () => void stop().finally(() => process.exit(0)));\n\n await server.connect(transport);\n}\n","import { startMcpServer } from './server.js';\r\n\r\nstartMcpServer().catch((err) => {\r\n console.error('Failed to start Dominus MCP server:', err);\r\n process.exit(1);\r\n});\r\n"]}