@revealui/harnesses 0.1.6 → 0.1.8
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/LICENSE +104 -17
- package/dist/{chunk-JG6CAG4A.js → chunk-4F4ANKIZ.js} +3 -2
- package/dist/chunk-4F4ANKIZ.js.map +1 -0
- package/dist/chunk-6E2BKO6U.js +2040 -0
- package/dist/chunk-6E2BKO6U.js.map +1 -0
- package/dist/chunk-DGQ5OB6L.js +380 -0
- package/dist/chunk-DGQ5OB6L.js.map +1 -0
- package/dist/{chunk-XXEKWC6F.js → chunk-PROC6EJC.js} +10 -10
- package/dist/chunk-PROC6EJC.js.map +1 -0
- package/dist/cli.js +43 -7
- package/dist/cli.js.map +1 -1
- package/dist/content/index.d.ts +8 -8
- package/dist/content/index.js +1 -1
- package/dist/index.d.ts +259 -28
- package/dist/index.js +9 -3
- package/dist/storage/index.d.ts +170 -0
- package/dist/storage/index.js +10 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/workboard/index.js +1 -1
- package/package.json +10 -4
- package/LICENSE.commercial +0 -111
- package/dist/chunk-JG6CAG4A.js.map +0 -1
- package/dist/chunk-XLIKSLM3.js +0 -1105
- package/dist/chunk-XLIKSLM3.js.map +0 -1
- package/dist/chunk-XXEKWC6F.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/adapters/claude-code-adapter.ts","../src/adapters/cursor-adapter.ts","../src/config/config-sync.ts","../src/config/harness-config-paths.ts","../src/coordinator.ts","../src/adapters/revealui-agent-adapter.ts","../src/detection/auto-detector.ts","../src/registry/harness-registry.ts","../src/server/http-gateway.ts","../src/server/inference-service.ts","../src/server/rpc-server.ts","../src/detection/process-detector.ts","../src/server/spawner-service.ts"],"sourcesContent":["/**\n * @revealui/harnesses — AI Harness Integration System (Server-side)\n *\n * Adapters, registry, workboard coordination, and JSON-RPC server for\n * integrating AI coding tools (Claude Code, Cursor) into the\n * RevealUI development workflow.\n *\n * Pro tier feature: gated behind isFeatureEnabled(\"ai\").\n *\n * @packageDocumentation\n */\n\nimport { isFeatureEnabled } from '@revealui/core/features';\nimport { initializeLicense } from '@revealui/core/license';\nimport { logger } from '@revealui/core/observability/logger';\n\n/** Check whether the harnesses feature is licensed for this installation. */\nexport async function checkHarnessesLicense(): Promise<boolean> {\n await initializeLicense();\n if (!isFeatureEnabled('ai')) {\n logger.warn(\n '[@revealui/harnesses] AI harness integration requires a Pro or Enterprise license. ' +\n 'Visit https://revealui.com/pricing for details.',\n { feature: 'ai' },\n );\n return false;\n }\n return true;\n}\n\n// Adapters\nexport { ClaudeCodeAdapter } from './adapters/claude-code-adapter.js';\nexport { CursorAdapter } from './adapters/cursor-adapter.js';\n\n// Config\nexport {\n diffAllConfigs,\n diffConfig,\n syncAllConfigs,\n syncConfig,\n validateConfigJson,\n} from './config/config-sync.js';\nexport {\n getConfigurableHarnesses,\n getLocalConfigPath,\n getRootConfigPath,\n} from './config/harness-config-paths.js';\nexport type {\n Agent,\n Command,\n ContentGenerator,\n ContentSummary,\n DiffEntry,\n GeneratedFile,\n Manifest,\n PreambleTier,\n ResolverContext,\n Rule,\n Skill,\n ValidationResult,\n} from './content/index.js';\n// Content layer (canonical content definitions and generators)\nexport {\n buildManifest,\n diffContent,\n generateContent,\n listContent,\n validateManifest,\n} from './content/index.js';\nexport type { CoordinatorOptions } from './coordinator.js';\n// Coordinator\nexport { HarnessCoordinator } from './coordinator.js';\n// Detection\nexport { autoDetectHarnesses } from './detection/auto-detector.js';\nexport {\n findAllHarnessProcesses,\n findClaudeCodeSockets,\n findHarnessProcesses,\n findProcesses,\n} from './detection/process-detector.js';\n// Registry\nexport { HarnessRegistry } from './registry/harness-registry.js';\n// Server\nexport { RpcServer } from './server/rpc-server.js';\nexport type { DaemonStoreConfig } from './storage/daemon-store.js';\n// Storage (PGlite-backed daemon state)\nexport { DaemonStore } from './storage/daemon-store.js';\nexport type {\n AgentMessage,\n AgentSession,\n AgentTask,\n DaemonEvent,\n FileReservation,\n} from './storage/schema.js';\nexport { SCHEMA_SQL } from './storage/schema.js';\nexport type { HarnessAdapter } from './types/adapter.js';\n// Types — harness core\nexport type {\n ConfigDiffEntry,\n ConfigSyncDirection,\n ConfigSyncResult,\n HarnessCapabilities,\n HarnessCommand,\n HarnessCommandResult,\n HarnessEvent,\n HarnessInfo,\n HarnessProcessInfo,\n HealthCheckResult,\n} from './types/core.js';\n// Workboard\nexport {\n acquireLock,\n atomicWriteSync,\n deriveSessionId,\n detectSessionType,\n lockPathFor,\n releaseLock,\n WorkboardManager,\n withLock,\n withLockAsync,\n} from './workboard/index.js';\n// Types — session identity\nexport type { SessionType } from './workboard/session-identity.js';\n// Types — workboard protocol\nexport type {\n ConflictResult,\n WorkboardEntry,\n WorkboardSession,\n WorkboardState,\n} from './workboard/workboard-protocol.js';\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { HarnessAdapter } from '../types/adapter.js';\nimport type {\n HarnessCapabilities,\n HarnessCommand,\n HarnessCommandResult,\n HarnessEvent,\n HarnessInfo,\n} from '../types/core.js';\nimport { WorkboardManager } from '../workboard/workboard-manager.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Adapter for Anthropic Claude Code (CLI: `claude`).\n *\n * Claude Code communicates via its CLI. Config lives at\n * ~/.claude/settings.json and project-level .claude/settings.json.\n * MCP integration is handled separately by @revealui/mcp.\n *\n * Workboard read/write requires REVEALUI_WORKBOARD_PATH to be set to the\n * absolute path of the workboard.md file.\n */\nexport class ClaudeCodeAdapter implements HarnessAdapter {\n readonly id = 'claude-code';\n readonly name = 'Claude Code';\n\n private readonly eventHandlers = new Set<(event: HarnessEvent) => void>();\n private readonly workboardPath: string | undefined;\n\n constructor(workboardPath?: string) {\n this.workboardPath = workboardPath ?? process.env.REVEALUI_WORKBOARD_PATH;\n }\n\n getCapabilities(): HarnessCapabilities {\n return {\n generateCode: false, // interactive only — no headless CLI interface\n analyzeCode: false, // interactive only — no headless CLI interface\n applyEdit: false, // interactive only — edits are applied inside Claude Code sessions\n applyConfig: false, // config managed interactively via ~/.claude/settings.json\n readWorkboard: this.workboardPath !== undefined,\n writeWorkboard: this.workboardPath !== undefined,\n };\n }\n\n async getInfo(): Promise<HarnessInfo> {\n let version: string | undefined;\n try {\n const { stdout } = await execFileAsync('claude', ['--version'], {\n timeout: 5000,\n });\n version = stdout.trim().split('\\n')[0];\n } catch {\n // Not installed or version flag unsupported.\n }\n return { id: this.id, name: this.name, version, capabilities: this.getCapabilities() };\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await execFileAsync('claude', ['--version'], { timeout: 3000 });\n return true;\n } catch {\n return false;\n }\n }\n\n notifyRegistered(): void {\n this.emit({ type: 'harness-connected', harnessId: this.id });\n }\n\n notifyUnregistering(): void {\n this.emit({ type: 'harness-disconnected', harnessId: this.id });\n }\n\n async execute(command: HarnessCommand): Promise<HarnessCommandResult> {\n try {\n return await this.executeInner(command);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', harnessId: this.id, message });\n return { success: false, command: command.type, message };\n }\n }\n\n private async executeInner(command: HarnessCommand): Promise<HarnessCommandResult> {\n switch (command.type) {\n case 'get-status': {\n const available = await this.isAvailable();\n return { success: true, command: command.type, data: { available } };\n }\n case 'get-running-instances': {\n // Claude Code process enumeration is not supported.\n return { success: true, command: command.type, data: [] };\n }\n case 'generate-code':\n case 'analyze-code': {\n return {\n success: false,\n command: command.type,\n message: `${command.type} is not supported — Claude Code operates interactively`,\n };\n }\n case 'apply-config': {\n return {\n success: false,\n command: command.type,\n message: 'Config is managed interactively via ~/.claude/settings.json',\n };\n }\n case 'read-workboard': {\n if (!this.workboardPath) {\n return {\n success: false,\n command: command.type,\n message: 'REVEALUI_WORKBOARD_PATH is not set',\n };\n }\n const manager = new WorkboardManager(this.workboardPath);\n const state = await manager.readAsync();\n return { success: true, command: command.type, data: state };\n }\n case 'update-workboard': {\n if (!this.workboardPath) {\n return {\n success: false,\n command: command.type,\n message: 'REVEALUI_WORKBOARD_PATH is not set',\n };\n }\n const manager = new WorkboardManager(this.workboardPath);\n manager.updateAgent(command.sessionId, {\n ...(command.task !== undefined && { task: command.task }),\n ...(command.files !== undefined && { files: command.files.join(', ') }),\n updated: `${new Date().toISOString().slice(0, 16)}Z`,\n });\n return { success: true, command: command.type };\n }\n default: {\n return {\n success: false,\n command: (command as HarnessCommand).type,\n message: `Command not supported by ${this.name}`,\n };\n }\n }\n }\n\n onEvent(handler: (event: HarnessEvent) => void): () => void {\n this.eventHandlers.add(handler);\n return () => this.eventHandlers.delete(handler);\n }\n\n async dispose(): Promise<void> {\n this.eventHandlers.clear();\n }\n\n private emit(event: HarnessEvent): void {\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch {\n // Swallow subscriber errors — never let a listener crash the adapter\n }\n }\n }\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { HarnessAdapter } from '../types/adapter.js';\nimport type {\n HarnessCapabilities,\n HarnessCommand,\n HarnessCommandResult,\n HarnessEvent,\n HarnessInfo,\n} from '../types/core.js';\nimport { WorkboardManager } from '../workboard/workboard-manager.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Adapter for Cursor IDE.\n *\n * Cursor is a VS Code fork with built-in AI capabilities.\n * This adapter detects Cursor via `cursor --version` and provides\n * workboard read/write when REVEALUI_WORKBOARD_PATH is set.\n */\nexport class CursorAdapter implements HarnessAdapter {\n readonly id = 'cursor';\n readonly name = 'Cursor';\n\n private readonly eventHandlers = new Set<(event: HarnessEvent) => void>();\n private readonly workboardPath: string | undefined;\n\n constructor(workboardPath?: string) {\n this.workboardPath = workboardPath ?? process.env.REVEALUI_WORKBOARD_PATH;\n }\n\n getCapabilities(): HarnessCapabilities {\n return {\n generateCode: false,\n analyzeCode: false,\n applyEdit: false,\n applyConfig: false,\n readWorkboard: this.workboardPath !== undefined,\n writeWorkboard: this.workboardPath !== undefined,\n };\n }\n\n async getInfo(): Promise<HarnessInfo> {\n let version: string | undefined;\n try {\n const { stdout } = await execFileAsync('cursor', ['--version'], {\n timeout: 5000,\n });\n version = stdout.trim().split('\\n')[0];\n } catch {\n // Not installed or version flag unsupported.\n }\n return { id: this.id, name: this.name, version, capabilities: this.getCapabilities() };\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await execFileAsync('cursor', ['--version'], { timeout: 3000 });\n return true;\n } catch {\n return false;\n }\n }\n\n notifyRegistered(): void {\n this.emit({ type: 'harness-connected', harnessId: this.id });\n }\n\n notifyUnregistering(): void {\n this.emit({ type: 'harness-disconnected', harnessId: this.id });\n }\n\n async execute(command: HarnessCommand): Promise<HarnessCommandResult> {\n try {\n return await this.executeInner(command);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', harnessId: this.id, message });\n return { success: false, command: command.type, message };\n }\n }\n\n private async executeInner(command: HarnessCommand): Promise<HarnessCommandResult> {\n switch (command.type) {\n case 'get-status': {\n const available = await this.isAvailable();\n return { success: true, command: command.type, data: { available } };\n }\n case 'read-workboard': {\n if (!this.workboardPath) {\n return {\n success: false,\n command: command.type,\n message: 'REVEALUI_WORKBOARD_PATH is not set',\n };\n }\n const manager = new WorkboardManager(this.workboardPath);\n const state = await manager.readAsync();\n return { success: true, command: command.type, data: state };\n }\n case 'update-workboard': {\n if (!this.workboardPath) {\n return {\n success: false,\n command: command.type,\n message: 'REVEALUI_WORKBOARD_PATH is not set',\n };\n }\n const manager = new WorkboardManager(this.workboardPath);\n manager.updateAgent(command.sessionId, {\n ...(command.task !== undefined && { task: command.task }),\n ...(command.files !== undefined && { files: command.files.join(', ') }),\n updated: `${new Date().toISOString().slice(0, 16)}Z`,\n });\n return { success: true, command: command.type };\n }\n default: {\n return {\n success: false,\n command: (command as HarnessCommand).type,\n message: `Command not supported by ${this.name}`,\n };\n }\n }\n }\n\n onEvent(handler: (event: HarnessEvent) => void): () => void {\n this.eventHandlers.add(handler);\n return () => this.eventHandlers.delete(handler);\n }\n\n async dispose(): Promise<void> {\n this.eventHandlers.clear();\n }\n\n private emit(event: HarnessEvent): void {\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch {\n // Swallow subscriber errors — never let a listener crash the adapter\n }\n }\n }\n}\n","import { copyFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { ConfigDiffEntry, ConfigSyncDirection, ConfigSyncResult } from '../types/core.js';\nimport {\n getConfigurableHarnesses,\n getLocalConfigPath,\n getRootConfigPath,\n} from './harness-config-paths.js';\n\n/**\n * Syncs harness config between local filesystem and root backup.\n * Mirrors config-sync.ts from packages/editors.\n */\nexport function syncConfig(\n harnessId: string,\n direction: ConfigSyncDirection,\n root?: string,\n): ConfigSyncResult {\n const localPath = getLocalConfigPath(harnessId);\n const rootPath = getRootConfigPath(harnessId, root);\n\n if (!(localPath && rootPath)) {\n return {\n success: false,\n harnessId,\n direction,\n message: `No config path known for harness: ${harnessId}`,\n };\n }\n\n try {\n if (direction === 'pull') {\n // Pull: root → local\n if (!existsSync(rootPath)) {\n return {\n success: false,\n harnessId,\n direction,\n message: `Root config not found: ${rootPath}`,\n };\n }\n mkdirSync(dirname(localPath), { recursive: true });\n backupIfExists(localPath);\n copyFileSync(rootPath, localPath);\n return { success: true, harnessId, direction, message: `Pulled ${rootPath} → ${localPath}` };\n } else {\n // Push: local → root\n if (!existsSync(localPath)) {\n return {\n success: false,\n harnessId,\n direction,\n message: `Local config not found: ${localPath}`,\n };\n }\n mkdirSync(dirname(rootPath), { recursive: true });\n backupIfExists(rootPath);\n copyFileSync(localPath, rootPath);\n return { success: true, harnessId, direction, message: `Pushed ${localPath} → ${rootPath}` };\n }\n } catch (err) {\n return {\n success: false,\n harnessId,\n direction,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/** Compares local vs root config for a harness. */\nexport function diffConfig(harnessId: string, root?: string): ConfigDiffEntry {\n const localPath = getLocalConfigPath(harnessId);\n const rootPath = getRootConfigPath(harnessId, root);\n\n const localExists = !!localPath && existsSync(localPath);\n const ssdExists = !!rootPath && existsSync(rootPath);\n\n if (!(localExists && ssdExists)) {\n return { harnessId, localExists, ssdExists, identical: false };\n }\n\n try {\n const localContent = readFileSync(localPath, 'utf8');\n const ssdContent = readFileSync(rootPath, 'utf8');\n return { harnessId, localExists, ssdExists, identical: localContent === ssdContent };\n } catch {\n return { harnessId, localExists, ssdExists, identical: false };\n }\n}\n\n/**\n * Sync all known harness configs in a given direction.\n * Returns results for each harness.\n */\nexport function syncAllConfigs(direction: ConfigSyncDirection, root?: string): ConfigSyncResult[] {\n return getConfigurableHarnesses().map((id) => syncConfig(id, direction, root));\n}\n\n/**\n * Diff all known harness configs.\n * Returns diff entries for each harness.\n */\nexport function diffAllConfigs(root?: string): ConfigDiffEntry[] {\n return getConfigurableHarnesses().map((id) => diffConfig(id, root));\n}\n\n/**\n * Validate that a config file contains parseable JSON.\n * Returns null if valid, or an error message if invalid.\n */\nexport function validateConfigJson(harnessId: string): string | null {\n const localPath = getLocalConfigPath(harnessId);\n if (!localPath) return `No config path known for harness: ${harnessId}`;\n if (!existsSync(localPath)) return `Config file not found: ${localPath}`;\n\n try {\n const content = readFileSync(localPath, 'utf8');\n JSON.parse(content);\n return null;\n } catch (err) {\n return err instanceof Error ? err.message : String(err);\n }\n}\n\n/** Create a .bak copy of a file if it exists (non-fatal if backup fails). */\nfunction backupIfExists(filePath: string): void {\n try {\n if (existsSync(filePath)) {\n copyFileSync(filePath, `${filePath}.bak`);\n }\n } catch {\n // Backup is best-effort — don't block the sync\n }\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/**\n * Config path mappings for AI harnesses.\n * Mirrors editor-config-paths.ts from packages/editors.\n *\n * Local paths: harness config on this machine.\n * Root paths: backup/sync target on the DevPod (ext4 USB) or LTS (NTFS).\n */\n\nconst HOME = homedir();\nconst REVEALUI_ROOT = process.env.REVEALUI_ROOT ?? join(HOME, '.revealui');\n\nconst LOCAL_CONFIG_PATHS: Record<string, string> = {\n 'claude-code': join(HOME, '.claude', 'settings.json'),\n cursor: join(HOME, '.cursor', 'settings.json'),\n copilot: join(HOME, '.config', 'github-copilot', 'hosts.json'),\n};\n\nconst ROOT_CONFIG_FILES: Record<string, string> = {\n 'claude-code': 'settings.json',\n cursor: 'settings.json',\n copilot: 'hosts.json',\n};\n\n/** Returns the local config file path for a given harness id, or undefined if unknown. */\nexport function getLocalConfigPath(harnessId: string): string | undefined {\n return LOCAL_CONFIG_PATHS[harnessId];\n}\n\n/** Returns the root config file path for a given harness id, or undefined if unknown. */\nexport function getRootConfigPath(harnessId: string, root = REVEALUI_ROOT): string | undefined {\n const file = ROOT_CONFIG_FILES[harnessId];\n if (!file) return undefined;\n return join(root, 'harness-configs', harnessId, file);\n}\n\n/** Returns ids of all harnesses with known config paths. */\nexport function getConfigurableHarnesses(): string[] {\n return Object.keys(LOCAL_CONFIG_PATHS);\n}\n","import { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { autoDetectHarnesses } from './detection/auto-detector.js';\nimport { HarnessRegistry } from './registry/harness-registry.js';\nimport { HttpGateway } from './server/http-gateway.js';\nimport { InferenceService } from './server/inference-service.js';\nimport { RpcServer } from './server/rpc-server.js';\nimport { SpawnerService } from './server/spawner-service.js';\nimport { DaemonStore } from './storage/daemon-store.js';\nimport type { HarnessAdapter } from './types/adapter.js';\nimport type { HealthCheckResult } from './types/core.js';\nimport { deriveSessionId, detectSessionType } from './workboard/session-identity.js';\nimport { WorkboardManager } from './workboard/workboard-manager.js';\n\nexport interface CoordinatorOptions {\n /** Absolute path to the project root (where .claude/workboard.md lives) */\n projectRoot: string;\n /** Unix socket path for the RPC server */\n socketPath?: string;\n /** Session task description shown in the workboard */\n task?: string;\n /** Enable HTTP gateway for remote access (default: disabled) */\n httpPort?: number;\n /** HTTP gateway bind address (default: '0.0.0.0') */\n httpHost?: string;\n /** Path to Studio static build for serving via HTTP gateway */\n httpStaticDir?: string;\n}\n\n/**\n * HarnessCoordinator — single entry point for harness-to-harness coordination.\n *\n * On start:\n * 1. Auto-detects installed AI harnesses and registers them\n * 2. Registers this session in the workboard\n * 3. Starts the RPC server\n *\n * On stop:\n * 1. Unregisters this session from the workboard\n * 2. Stops the RPC server\n * 3. Disposes all adapters\n */\nexport class HarnessCoordinator {\n private readonly registry = new HarnessRegistry();\n private rpcServer: RpcServer | null = null;\n private httpGateway: HttpGateway | null = null;\n private store: DaemonStore | null = null;\n private spawner: SpawnerService | null = null;\n private inference: InferenceService | null = null;\n private sessionId: string | null = null;\n private readonly workboard: WorkboardManager;\n\n constructor(private readonly options: CoordinatorOptions) {\n const workboardPath = join(options.projectRoot, '.claude', 'workboard.md');\n this.workboard = new WorkboardManager(workboardPath);\n }\n\n async start(): Promise<void> {\n // 1. Auto-detect harnesses\n await autoDetectHarnesses(this.registry);\n\n // 2. Register in workboard\n const type = detectSessionType();\n const state = this.workboard.read();\n const existingIds = state.agents.map((a) => a.id);\n this.sessionId = deriveSessionId(type, existingIds);\n\n const envLabels: Record<string, string> = {\n zed: 'Zed/ACP',\n cursor: 'Cursor',\n terminal: 'WSL/bash',\n };\n\n this.workboard.registerAgent({\n id: this.sessionId,\n env: envLabels[type] ?? type,\n started: `${new Date().toISOString().slice(0, 16)}Z`,\n task: this.options.task ?? 'Harness coordination active',\n files: '',\n updated: `${new Date().toISOString().slice(0, 16)}Z`,\n });\n\n // 3. Initialize PGlite daemon store\n const dataDir = join(process.env.HOME ?? '/tmp', '.local', 'share', 'revealui', 'harness.db');\n mkdirSync(dataDir, { recursive: true });\n this.store = new DaemonStore({ dataDir });\n await this.store.init();\n\n // 4. Start RPC server\n const socketPath =\n this.options.socketPath ??\n join(process.env.HOME ?? '/tmp', '.local', 'share', 'revealui', 'harness.sock');\n\n this.rpcServer = new RpcServer(this.registry, socketPath, this.store);\n this.rpcServer.setHealthCheck(() => this.healthCheck());\n\n // 4b. Wire agent spawner and inference engine services into RPC\n this.spawner = new SpawnerService();\n this.inference = new InferenceService();\n this.rpcServer.setSpawner(this.spawner);\n this.rpcServer.setInference(this.inference);\n\n await this.rpcServer.start();\n\n // 5. Optionally start HTTP gateway for remote access\n if (this.options.httpPort) {\n this.httpGateway = new HttpGateway({\n port: this.options.httpPort,\n host: this.options.httpHost ?? '0.0.0.0',\n staticDir: this.options.httpStaticDir,\n rpcDispatch: this.rpcServer,\n spawner: this.spawner,\n });\n await this.httpGateway.start();\n }\n }\n\n async stop(): Promise<void> {\n // Unregister from workboard\n if (this.sessionId) {\n this.workboard.unregisterAgent(this.sessionId);\n this.workboard.addLogEntry(\n this.sessionId,\n `Session ended — ${this.options.task ?? 'harness coordination'}`,\n );\n }\n\n // Stop HTTP gateway\n if (this.httpGateway) {\n await this.httpGateway.stop();\n this.httpGateway = null;\n }\n\n // Stop all spawned agent processes\n if (this.spawner) {\n await this.spawner.stopAll();\n this.spawner = null;\n }\n this.inference = null;\n\n // Stop RPC server\n if (this.rpcServer) {\n await this.rpcServer.stop();\n this.rpcServer = null;\n }\n\n // Close PGlite store\n if (this.store) {\n await this.store.close();\n this.store = null;\n }\n\n // Dispose all adapters\n await this.registry.disposeAll();\n }\n\n /** The registry of detected harnesses. Available after start(). */\n getRegistry(): HarnessRegistry {\n return this.registry;\n }\n\n /** The workboard manager. */\n getWorkboard(): WorkboardManager {\n return this.workboard;\n }\n\n /** The daemon persistent store (available after start()). */\n getStore(): DaemonStore | null {\n return this.store;\n }\n\n /** Register a custom adapter (must be called before start()). */\n registerAdapter(adapter: HarnessAdapter): void {\n this.registry.register(adapter);\n }\n\n /** The HTTP gateway (available after start() if httpPort was set). */\n getHttpGateway(): HttpGateway | null {\n return this.httpGateway;\n }\n\n /** Run a health check across all registered harnesses and the workboard. */\n async healthCheck(): Promise<HealthCheckResult> {\n const diagnostics: string[] = [];\n const StaleMs = 4 * 60 * 60 * 1000;\n\n // Check registered harnesses\n const allIds = this.registry.listAll();\n const registeredHarnesses = await Promise.all(\n allIds.map(async (harnessId) => {\n const adapter = this.registry.get(harnessId);\n let available = false;\n try {\n available = adapter ? await adapter.isAvailable() : false;\n } catch (err) {\n diagnostics.push(\n `${harnessId}: availability check failed — ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n if (!available) diagnostics.push(`${harnessId}: not available`);\n return { harnessId, available };\n }),\n );\n\n // Check workboard\n let readable = false;\n let sessionCount = 0;\n const staleSessionIds: string[] = [];\n try {\n const state = this.workboard.read();\n readable = true;\n sessionCount = state.agents.length;\n const now = Date.now();\n for (const s of state.agents) {\n const ts = Date.parse(s.updated);\n if (!Number.isNaN(ts) && now - ts > StaleMs) {\n staleSessionIds.push(s.id);\n }\n }\n if (staleSessionIds.length > 0) {\n diagnostics.push(`Stale sessions: ${staleSessionIds.join(', ')}`);\n }\n } catch (err) {\n diagnostics.push(`Workboard unreadable: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const healthy =\n registeredHarnesses.some((h) => h.available) && readable && staleSessionIds.length === 0;\n\n return {\n healthy,\n timestamp: new Date().toISOString(),\n registeredHarnesses,\n workboard: { readable, sessionCount, staleSessionIds },\n diagnostics,\n };\n }\n}\n","/**\n * RevealUI Agent Adapter\n *\n * Unlike Claude Code and Cursor adapters which wrap external CLIs,\n * this adapter IS the runtime — it creates an Agent with coding tools,\n * wires the content layer as instructions, and runs StreamingAgentRuntime\n * directly. This is RevealUI's own coding agent.\n */\n\nimport type { HarnessAdapter } from '../types/adapter.js';\nimport type {\n HarnessCapabilities,\n HarnessCommand,\n HarnessCommandResult,\n HarnessEvent,\n HarnessInfo,\n} from '../types/core.js';\n\n/**\n * Configuration for the RevealUI Agent Adapter.\n * All fields are optional — sensible defaults are applied.\n */\nexport interface RevealUIAgentConfig {\n /** Project root for coding tools sandbox (default: cwd) */\n projectRoot?: string;\n /** LLM provider override (default: auto-detect from env) */\n provider?: string;\n /** Model name override (default: provider default) */\n model?: string;\n /** Max agentic loop iterations (default: 10) */\n maxIterations?: number;\n /** Task timeout in ms (default: 120000) */\n timeoutMs?: number;\n /** Workboard path for coordination (default: REVEALUI_WORKBOARD_PATH env) */\n workboardPath?: string;\n}\n\nconst DEFAULT_CONFIG: Required<Omit<RevealUIAgentConfig, 'provider' | 'model' | 'workboardPath'>> =\n {\n projectRoot: process.cwd(),\n maxIterations: 10,\n timeoutMs: 120_000,\n };\n\n/**\n * RevealUI's standalone coding agent adapter.\n *\n * This adapter enables ALL capabilities: it can generate code, analyze code,\n * apply edits, and run headless prompts — because it IS the agent runtime,\n * not a wrapper around an external tool.\n */\nexport class RevealUIAgentAdapter implements HarnessAdapter {\n readonly id = 'revealui-agent';\n readonly name = 'RevealUI Agent';\n\n private readonly config: RevealUIAgentConfig;\n private readonly eventHandlers = new Set<(event: HarnessEvent) => void>();\n\n constructor(config?: RevealUIAgentConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n getCapabilities(): HarnessCapabilities {\n return {\n generateCode: true,\n analyzeCode: true,\n applyEdit: true,\n applyConfig: false,\n readWorkboard:\n (this.config.workboardPath ?? process.env.REVEALUI_WORKBOARD_PATH) !== undefined,\n writeWorkboard:\n (this.config.workboardPath ?? process.env.REVEALUI_WORKBOARD_PATH) !== undefined,\n };\n }\n\n async getInfo(): Promise<HarnessInfo> {\n return {\n id: this.id,\n name: this.name,\n version: '0.1.0',\n capabilities: this.getCapabilities(),\n };\n }\n\n /**\n * The RevealUI agent is available if at least one LLM provider is reachable.\n * Checks in order: BitNet (localhost), Ollama (localhost), Groq (API key).\n */\n async isAvailable(): Promise<boolean> {\n // Check BitNet\n if (process.env.BITNET_BASE_URL) {\n try {\n const url = `${process.env.BITNET_BASE_URL}/v1/models`;\n const res = await fetch(url, { signal: AbortSignal.timeout(2000) });\n if (res.ok) return true;\n } catch {\n // BitNet not running\n }\n }\n\n // Check Ollama\n const ollamaUrl = process.env.OLLAMA_BASE_URL ?? 'http://localhost:11434';\n try {\n const res = await fetch(`${ollamaUrl}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (res.ok) return true;\n } catch {\n // Ollama not running\n }\n\n // Check Groq (cloud, just needs API key)\n if (process.env.GROQ_API_KEY) return true;\n\n return false;\n }\n\n notifyRegistered(): void {\n this.emit({ type: 'harness-connected', harnessId: this.id });\n }\n\n notifyUnregistering(): void {\n this.emit({ type: 'harness-disconnected', harnessId: this.id });\n }\n\n async execute(command: HarnessCommand): Promise<HarnessCommandResult> {\n try {\n return await this.executeInner(command);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.emit({ type: 'error', harnessId: this.id, message });\n return { success: false, command: command.type, message };\n }\n }\n\n private async executeInner(command: HarnessCommand): Promise<HarnessCommandResult> {\n switch (command.type) {\n case 'get-status': {\n const available = await this.isAvailable();\n return {\n success: true,\n command: command.type,\n data: {\n available,\n provider: this.config.provider ?? 'auto',\n model: this.config.model ?? 'auto',\n projectRoot: this.config.projectRoot,\n },\n };\n }\n\n case 'headless-prompt': {\n return this.runHeadlessPrompt(command.prompt, command.maxTurns, command.timeoutMs);\n }\n\n case 'generate-code': {\n return this.runHeadlessPrompt(\n `Generate code: ${command.prompt}${command.language ? ` (language: ${command.language})` : ''}${command.context ? `\\n\\nContext:\\n${command.context}` : ''}`,\n );\n }\n\n case 'analyze-code': {\n const question = command.question ?? 'Analyze this file and explain what it does.';\n return this.runHeadlessPrompt(\n `Read the file at ${command.filePath} and answer: ${question}`,\n );\n }\n\n case 'apply-edit': {\n return this.runHeadlessPrompt(\n `Apply the following diff to ${command.filePath}:\\n\\n${command.diff}`,\n );\n }\n\n case 'apply-config':\n case 'sync-config':\n case 'diff-config': {\n return {\n success: false,\n command: command.type,\n message: 'Config sync is not applicable — RevealUI agent uses the content layer directly',\n };\n }\n\n case 'read-workboard':\n case 'update-workboard': {\n // Workboard support delegated to WorkboardManager (same as Claude adapter)\n return {\n success: false,\n command: command.type,\n message: 'Workboard support not yet wired — use WorkboardManager directly',\n };\n }\n\n default: {\n return {\n success: false,\n command: (command as HarnessCommand).type,\n message: `Command not supported by ${this.name}`,\n };\n }\n }\n }\n\n /**\n * Run a headless prompt through the coding agent.\n * Lazy-imports @revealui/ai to avoid hard dependency at module load time.\n * Types are inferred from the dynamic imports — no compile-time @revealui/ai dependency.\n */\n private async runHeadlessPrompt(\n prompt: string,\n maxTurns?: number,\n timeoutMs?: number,\n ): Promise<HarnessCommandResult> {\n // Lazy import — @revealui/ai is an optional peer. Dynamic import()\n // deliberately uses string literals so TS doesn't resolve the types\n // at build time (the harnesses package has no dependency on @revealui/ai).\n const aiRuntimePath = '@revealui/ai/orchestration/streaming-runtime';\n const aiClientPath = '@revealui/ai/llm/client';\n const aiToolsPath = '@revealui/ai/tools/coding';\n\n let runtimeMod: Record<string, unknown>;\n let clientMod: Record<string, unknown>;\n let toolsMod: Record<string, unknown>;\n\n try {\n [runtimeMod, clientMod, toolsMod] = (await Promise.all([\n import(aiRuntimePath),\n import(aiClientPath),\n import(aiToolsPath),\n ])) as [Record<string, unknown>, Record<string, unknown>, Record<string, unknown>];\n } catch {\n return {\n success: false,\n command: 'headless-prompt',\n message:\n '@revealui/ai is not installed. Install it to use the RevealUI agent: npm install @revealui/ai',\n };\n }\n\n const StreamingAgentRuntime = runtimeMod.StreamingAgentRuntime as new (config: {\n maxIterations?: number;\n timeout?: number;\n }) => {\n streamTask(\n agent: unknown,\n task: unknown,\n llmClient: unknown,\n ): AsyncGenerator<{\n type: string;\n content?: string;\n toolCall?: { name: string };\n toolResult?: { content?: string };\n error?: string;\n }>;\n cleanup(): Promise<void>;\n };\n\n const createCodingTools = toolsMod.createCodingTools as (config: {\n projectRoot: string;\n }) => unknown[];\n\n const projectRoot = this.config.projectRoot ?? process.cwd();\n const tools = createCodingTools({ projectRoot });\n\n // Build LLM client via factory\n let llmClient: unknown;\n if (this.config.provider) {\n const LLMClient = clientMod.LLMClient as new (config: Record<string, unknown>) => unknown;\n llmClient = new LLMClient({\n provider: this.config.provider,\n model: this.config.model,\n baseURL: process.env.BITNET_BASE_URL ?? process.env.OLLAMA_BASE_URL,\n apiKey: process.env.GROQ_API_KEY ?? 'not-needed',\n });\n } else {\n const createLLMClientFromEnv = clientMod.createLLMClientFromEnv as () => unknown;\n llmClient = createLLMClientFromEnv();\n }\n\n const agent = {\n id: 'revealui-coding-agent',\n name: 'RevealUI Coding Agent',\n instructions: this.buildInstructions(),\n tools,\n config: {},\n getContext: () => ({ projectRoot, workingDirectory: projectRoot }),\n };\n\n const task = {\n id: `task-${Date.now()}`,\n type: 'headless-prompt',\n description: prompt,\n };\n\n const runtime = new StreamingAgentRuntime({\n maxIterations: maxTurns ?? this.config.maxIterations ?? DEFAULT_CONFIG.maxIterations,\n timeout: timeoutMs ?? this.config.timeoutMs ?? DEFAULT_CONFIG.timeoutMs,\n });\n\n const taskId = task.id;\n this.emit({ type: 'generation-started', taskId });\n\n const outputParts: string[] = [];\n\n try {\n for await (const chunk of runtime.streamTask(agent, task, llmClient)) {\n switch (chunk.type) {\n case 'text':\n if (chunk.content) outputParts.push(chunk.content);\n break;\n case 'tool_call_result':\n if (chunk.toolResult?.content) {\n outputParts.push(`[tool: ${chunk.toolCall?.name}] ${chunk.toolResult.content}`);\n }\n break;\n case 'error':\n if (chunk.error) outputParts.push(`[error] ${chunk.error}`);\n break;\n case 'done':\n break;\n }\n }\n } finally {\n await runtime.cleanup();\n }\n\n const output = outputParts.join('\\n');\n this.emit({ type: 'generation-completed', taskId, output });\n\n return {\n success: true,\n command: 'headless-prompt',\n message: output,\n data: { taskId, output },\n };\n }\n\n /**\n * Build system instructions from the content layer.\n * Loads rules from .claude/rules/ as a baseline (they are the canonical content).\n */\n private buildInstructions(): string {\n const lines: string[] = [\n 'You are the RevealUI coding agent. You help with software development tasks in this project.',\n 'Use the available tools to read, write, edit, search, and execute commands.',\n 'Always read files before modifying them. Prefer surgical edits over full rewrites.',\n 'Follow project conventions discovered via the project_context tool.',\n '',\n ];\n\n // Load project rules if available\n try {\n const { readdirSync, readFileSync } = require('node:fs');\n const { join } = require('node:path');\n const projectRoot = this.config.projectRoot ?? process.cwd();\n const rulesDir = join(projectRoot, '.claude', 'rules');\n\n const ruleFiles: string[] = readdirSync(rulesDir);\n for (const file of ruleFiles) {\n if (file.endsWith('.md')) {\n const content = readFileSync(join(rulesDir, file), 'utf8');\n lines.push(`## ${file.replace('.md', '')}`, content, '');\n }\n }\n } catch {\n // No rules directory — proceed with base instructions\n }\n\n return lines.join('\\n');\n }\n\n onEvent(handler: (event: HarnessEvent) => void): () => void {\n this.eventHandlers.add(handler);\n return () => this.eventHandlers.delete(handler);\n }\n\n async dispose(): Promise<void> {\n this.eventHandlers.clear();\n }\n\n private emit(event: HarnessEvent): void {\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch {\n // Swallow subscriber errors\n }\n }\n }\n}\n","import { ClaudeCodeAdapter } from '../adapters/claude-code-adapter.js';\nimport { CursorAdapter } from '../adapters/cursor-adapter.js';\nimport { RevealUIAgentAdapter } from '../adapters/revealui-agent-adapter.js';\nimport type { HarnessRegistry } from '../registry/harness-registry.js';\n\n/**\n * Detects available AI harnesses and registers them in the registry.\n * Mirrors autoDetectEditors from packages/editors.\n *\n * Creates an adapter for each known harness, checks isAvailable(),\n * and registers those that respond. Unavailable adapters are disposed.\n */\nexport async function autoDetectHarnesses(registry: HarnessRegistry): Promise<string[]> {\n const candidates = [\n new RevealUIAgentAdapter(),\n new ClaudeCodeAdapter(),\n new CursorAdapter(),\n // Copilot adapter excluded — stub only, no standalone CLI available\n ];\n\n const registered: string[] = [];\n\n await Promise.all(\n candidates.map(async (adapter) => {\n try {\n if (await adapter.isAvailable()) {\n registry.register(adapter);\n registered.push(adapter.id);\n } else {\n await adapter.dispose();\n }\n } catch {\n await adapter.dispose();\n }\n }),\n );\n\n return registered;\n}\n","import type { HarnessAdapter } from '../types/adapter.js';\n\n/**\n * Manages the lifecycle of HarnessAdapter instances.\n * Mirrors EditorRegistry from packages/editors.\n */\nexport class HarnessRegistry {\n private readonly adapters = new Map<string, HarnessAdapter>();\n\n /** Register an adapter. Throws if an adapter with the same id already exists. */\n register(adapter: HarnessAdapter): void {\n if (this.adapters.has(adapter.id)) {\n throw new Error(`Harness adapter already registered: ${adapter.id}`);\n }\n this.adapters.set(adapter.id, adapter);\n adapter.notifyRegistered?.();\n }\n\n /** Unregister an adapter, disposing it in the process. */\n async unregister(id: string): Promise<void> {\n const adapter = this.adapters.get(id);\n if (adapter) {\n adapter.notifyUnregistering?.();\n await adapter.dispose();\n this.adapters.delete(id);\n }\n }\n\n /** Retrieve an adapter by id. */\n get(id: string): HarnessAdapter | undefined {\n return this.adapters.get(id);\n }\n\n /** List all registered adapter ids. */\n listAll(): string[] {\n return Array.from(this.adapters.keys());\n }\n\n /** List ids of adapters that report isAvailable() === true. */\n async listAvailable(): Promise<string[]> {\n const results = await Promise.all(\n Array.from(this.adapters.entries()).map(async ([id, adapter]) => ({\n id,\n available: await adapter.isAvailable(),\n })),\n );\n return results.filter((r) => r.available).map((r) => r.id);\n }\n\n /** Dispose all adapters and clear the registry. */\n async disposeAll(): Promise<void> {\n await Promise.all(Array.from(this.adapters.values()).map((a) => a.dispose()));\n this.adapters.clear();\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { createReadStream, existsSync, statSync } from 'node:fs';\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport { extname, join, normalize } from 'node:path';\nimport type { RpcServer } from './rpc-server.js';\nimport type { AgentExitEvent, AgentOutputEvent, SpawnerService } from './spawner-service.js';\n\n/**\n * HTTP gateway that exposes the harness daemon over TCP.\n *\n * Routes:\n * POST /rpc — JSON-RPC 2.0 proxy (same protocol as Unix socket)\n * GET /api/pair — Returns pairing status (requires valid token or no token set)\n * POST /api/pair — Submit pairing code to get a session token\n * GET /api/stream/:id — SSE stream of agent output (real-time)\n * GET / — Serves Studio static frontend (index.html)\n * GET /assets/* — Serves static assets\n *\n * Auth:\n * All /rpc and /api/* requests (except POST /api/pair) require:\n * Authorization: Bearer <session-token>\n * The session token is obtained via the pairing flow.\n */\n\nexport interface HttpGatewayConfig {\n /** TCP port to listen on (default: 7890) */\n port: number;\n /** Bind address (default: '0.0.0.0' for Tailscale access) */\n host: string;\n /** Path to Studio static build directory (optional — disables static serving if absent) */\n staticDir?: string;\n /** Reference to the Unix-socket RPC server for dispatching */\n rpcDispatch: RpcServer;\n /** Reference to the spawner service (enables SSE streaming) */\n spawner?: SpawnerService;\n}\n\n/** MIME types for static file serving */\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.wasm': 'application/wasm',\n};\n\nexport class HttpGateway {\n private server: Server;\n private readonly config: HttpGatewayConfig;\n\n /** 6-digit pairing code (regenerated on each start) */\n private pairingCode: string;\n /** Active session tokens (bearer tokens granted after pairing) */\n private sessionTokens: Set<string> = new Set();\n /** Whether pairing has been completed at least once */\n private paired = false;\n\n constructor(config: HttpGatewayConfig) {\n this.config = config;\n this.pairingCode = generatePairingCode();\n this.server = createServer((req, res) => this.handleRequest(req, res));\n }\n\n /** The current pairing code (display this in Studio/terminal) */\n getPairingCode(): string {\n return this.pairingCode;\n }\n\n /** Regenerate the pairing code (invalidates previous code) */\n regeneratePairingCode(): string {\n this.pairingCode = generatePairingCode();\n return this.pairingCode;\n }\n\n async start(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server.listen(this.config.port, this.config.host, () => resolve());\n this.server.once('error', reject);\n });\n }\n\n async stop(): Promise<void> {\n return new Promise((resolve) => this.server.close(() => resolve()));\n }\n\n private handleRequest(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n\n // CORS headers for mobile browser access\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Pairing endpoint — no auth required\n if (path === '/api/pair' && req.method === 'POST') {\n this.handlePair(req, res);\n return;\n }\n\n // All other API/RPC endpoints require auth\n if (path === '/rpc' || path.startsWith('/api/')) {\n if (!this.checkAuth(req, res)) return;\n\n if (path === '/rpc' && req.method === 'POST') {\n this.handleRpc(req, res);\n return;\n }\n\n if (path === '/api/pair' && req.method === 'GET') {\n this.handlePairStatus(res);\n return;\n }\n\n if (path === '/api/status') {\n this.handleStatus(res);\n return;\n }\n\n // SSE stream: /api/stream or /api/stream/<sessionId>\n if (path.startsWith('/api/stream') && req.method === 'GET') {\n const sessionFilter = path.split('/')[3] ?? null; // optional session ID filter\n this.handleStream(req, res, sessionFilter);\n return;\n }\n\n jsonResponse(res, 404, { error: 'Not found' });\n return;\n }\n\n // Static file serving\n this.handleStatic(path, res);\n }\n\n /** Verify the Authorization: Bearer <token> header */\n private checkAuth(req: IncomingMessage, res: ServerResponse): boolean {\n // If no tokens have been issued yet, allow unauthenticated access\n // (first-time setup before pairing)\n if (this.sessionTokens.size === 0 && !this.paired) {\n return true;\n }\n\n const authHeader = req.headers.authorization ?? '';\n if (!authHeader.startsWith('Bearer ')) {\n jsonResponse(res, 401, { error: 'Authorization required', paired: this.paired });\n return false;\n }\n\n const token = authHeader.slice(7);\n if (!this.sessionTokens.has(token)) {\n jsonResponse(res, 403, { error: 'Invalid token' });\n return false;\n }\n\n return true;\n }\n\n /** POST /api/pair — submit pairing code, receive session token */\n private handlePair(req: IncomingMessage, res: ServerResponse): void {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n if (body.length > 1024) {\n res.writeHead(413);\n res.end();\n req.destroy();\n }\n });\n req.on('end', () => {\n try {\n const { code } = JSON.parse(body) as { code: string };\n if (code !== this.pairingCode) {\n jsonResponse(res, 403, { error: 'Invalid pairing code' });\n return;\n }\n\n // Issue a session token\n const token = randomBytes(32).toString('hex');\n this.sessionTokens.add(token);\n this.paired = true;\n\n // Regenerate pairing code so it can't be reused\n this.pairingCode = generatePairingCode();\n\n jsonResponse(res, 200, { token, expires: null });\n } catch {\n jsonResponse(res, 400, { error: 'Invalid JSON' });\n }\n });\n }\n\n /** GET /api/pair — check pairing status */\n private handlePairStatus(res: ServerResponse): void {\n jsonResponse(res, 200, {\n paired: this.paired,\n activeSessions: this.sessionTokens.size,\n });\n }\n\n /** GET /api/status — daemon status summary */\n private handleStatus(res: ServerResponse): void {\n jsonResponse(res, 200, {\n daemon: 'revdev-harness',\n pid: process.pid,\n uptime: process.uptime(),\n paired: this.paired,\n activeSessions: this.sessionTokens.size,\n });\n }\n\n /** POST /rpc — proxy JSON-RPC to the daemon's dispatch */\n private handleRpc(req: IncomingMessage, res: ServerResponse): void {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n // 1MB limit for RPC payloads\n if (body.length > 1_048_576) {\n res.writeHead(413);\n res.end();\n req.destroy();\n }\n });\n req.on('end', () => {\n // Delegate to the RPC server's dispatch by simulating a socket write\n // We write the JSON line to the dispatch method directly\n this.config.rpcDispatch.dispatchHttp(body, (response) => {\n jsonResponse(res, 200, response);\n });\n });\n }\n\n /** GET /api/stream[/:sessionId] — SSE for agent output and exit events */\n private handleStream(\n req: IncomingMessage,\n res: ServerResponse,\n sessionFilter: string | null,\n ): void {\n const spawner = this.config.spawner;\n if (!spawner) {\n jsonResponse(res, 503, { error: 'Spawner not available' });\n return;\n }\n\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n\n // Send initial keepalive\n res.write(': connected\\n\\n');\n\n const onOutput = (evt: AgentOutputEvent): void => {\n if (sessionFilter && evt.sessionId !== sessionFilter) return;\n res.write(`event: output\\ndata: ${JSON.stringify(evt)}\\n\\n`);\n };\n\n const onExit = (evt: AgentExitEvent): void => {\n if (sessionFilter && evt.sessionId !== sessionFilter) return;\n res.write(`event: exit\\ndata: ${JSON.stringify(evt)}\\n\\n`);\n };\n\n spawner.on('output', onOutput);\n spawner.on('exit', onExit);\n\n // Keepalive every 30s to prevent proxy/firewall timeouts\n const keepalive = setInterval(() => {\n res.write(': keepalive\\n\\n');\n }, 30_000);\n\n // Cleanup on client disconnect\n req.on('close', () => {\n clearInterval(keepalive);\n spawner.off('output', onOutput);\n spawner.off('exit', onExit);\n });\n }\n\n /** Serve static files from the Studio build directory */\n private handleStatic(urlPath: string, res: ServerResponse): void {\n if (!this.config.staticDir) {\n jsonResponse(res, 404, { error: 'Static serving not configured' });\n return;\n }\n\n // Default to index.html for SPA routing\n const filePath = urlPath === '/' ? '/index.html' : urlPath;\n\n // Security: prevent directory traversal\n const normalized = normalize(filePath);\n if (normalized.includes('..')) {\n res.writeHead(400);\n res.end('Bad request');\n return;\n }\n\n const fullPath = join(this.config.staticDir, normalized);\n\n // If file doesn't exist, serve index.html (SPA fallback)\n const targetPath =\n existsSync(fullPath) && statSync(fullPath).isFile()\n ? fullPath\n : join(this.config.staticDir, 'index.html');\n\n if (!existsSync(targetPath)) {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const ext = extname(targetPath);\n const contentType = MIME_TYPES[ext] ?? 'application/octet-stream';\n\n res.writeHead(200, { 'Content-Type': contentType });\n createReadStream(targetPath).pipe(res);\n }\n}\n\n/** Generate a 6-digit numeric pairing code */\nfunction generatePairingCode(): string {\n // Use crypto for uniform distribution\n const bytes = randomBytes(4);\n const num = bytes.readUInt32BE(0) % 1_000_000;\n return num.toString().padStart(6, '0');\n}\n\n/** Helper to send a JSON response */\nfunction jsonResponse(res: ServerResponse, status: number, body: unknown): void {\n const json = JSON.stringify(body);\n res.writeHead(status, {\n 'Content-Type': 'application/json; charset=utf-8',\n 'Content-Length': Buffer.byteLength(json),\n });\n res.end(json);\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\n// ── Types ───────────────────────────────────────────────────────────\n\nexport interface OllamaStatus {\n installed: boolean;\n running: boolean;\n version: string | null;\n}\n\nexport interface OllamaModel {\n name: string;\n size: string;\n modified: string;\n}\n\nexport interface ModelPullResult {\n success: boolean;\n message: string;\n}\n\nexport interface BitNetStatus {\n installed: boolean;\n modelPath: string | null;\n}\n\nexport interface SnapStatus {\n installed: boolean;\n running: boolean;\n snapName: string;\n endpoint: string | null;\n version: string | null;\n}\n\nexport interface SnapModel {\n name: string;\n description: string;\n installed: boolean;\n}\n\n// ── Configuration ───────────────────────────────────────────────────\n\nconst KNOWN_SNAPS: Array<[string, string]> = [\n ['nemotron-3-nano', 'General (reasoning + non-reasoning) — free tier default'],\n ['gemma3', 'General + vision — image understanding, multimodal'],\n ['deepseek-r1', 'Reasoning — complex analysis, chain-of-thought'],\n ['qwen-vl', 'Vision-language — document parsing, visual Q&A'],\n];\n\nconst BITNET_MODEL_PATHS = [\n `${process.env.HOME ?? '/root'}/models/bitnet`,\n '/mnt/forge/models/bitnet',\n];\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execFileAsync('which', [cmd]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function run(cmd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return execFileAsync(cmd, args, { timeout: 30_000 });\n}\n\n// ── Service ─────────────────────────────────────────────────────────\n\n/**\n * Manages local inference engines (Ollama, Snaps, BitNet) on the daemon host.\n * Each method mirrors the equivalent Tauri command from `inference.rs`.\n */\nexport class InferenceService {\n // ── Ollama ──────────────────────────────────────────────────────\n\n async ollamaStatus(): Promise<OllamaStatus> {\n const installed = await commandExists('ollama');\n if (!installed) return { installed: false, running: false, version: null };\n\n let version: string | null = null;\n try {\n const { stdout } = await run('ollama', ['--version']);\n version = stdout.trim() || null;\n } catch {\n // version check failed — binary may exist but be broken\n }\n\n let running = false;\n try {\n await run('ollama', ['list']);\n running = true;\n } catch {\n // list fails when server isn't running\n }\n\n return { installed, running, version };\n }\n\n async ollamaModels(): Promise<OllamaModel[]> {\n const { stdout } = await run('ollama', ['list']);\n const models: OllamaModel[] = [];\n const lines = stdout.split('\\n');\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i]?.trim();\n if (!line) continue;\n const parts = line.split(/\\s+/);\n if (parts.length >= 3) {\n models.push({\n name: parts[0] ?? '',\n size: parts[2] ?? '',\n modified: parts.slice(3).join(' '),\n });\n }\n }\n\n return models;\n }\n\n async ollamaPull(modelName: string): Promise<ModelPullResult> {\n try {\n const { stdout, stderr } = await execFileAsync('ollama', ['pull', modelName], {\n timeout: 600_000, // 10 min for large models\n });\n return { success: true, message: stdout || stderr };\n } catch (err) {\n return { success: false, message: err instanceof Error ? err.message : String(err) };\n }\n }\n\n async ollamaDelete(modelName: string): Promise<void> {\n await run('ollama', ['rm', modelName]);\n }\n\n async ollamaStart(): Promise<void> {\n // Start in background (detached)\n const { spawn } = await import('node:child_process');\n const child = spawn('ollama', ['serve'], {\n stdio: 'ignore',\n detached: true,\n });\n child.unref();\n }\n\n async ollamaStop(): Promise<void> {\n try {\n await run('pkill', ['-f', 'ollama serve']);\n } catch {\n // pkill exit 1 = no processes matched — that's fine\n }\n }\n\n // ── BitNet ──────────────────────────────────────────────────────\n\n async bitnetStatus(): Promise<BitNetStatus> {\n const installed = await commandExists('bitnet');\n let modelPath: string | null = null;\n\n if (installed) {\n const { existsSync } = await import('node:fs');\n for (const p of BITNET_MODEL_PATHS) {\n if (existsSync(p)) {\n modelPath = p;\n break;\n }\n }\n }\n\n return { installed, modelPath };\n }\n\n // ── Inference Snaps ─────────────────────────────────────────────\n\n async snapList(): Promise<SnapModel[]> {\n const results: SnapModel[] = [];\n for (const [name, description] of KNOWN_SNAPS) {\n let installed = false;\n try {\n await run('snap', ['list', name]);\n installed = true;\n } catch {\n // not installed\n }\n results.push({ name, description, installed });\n }\n return results;\n }\n\n async snapStatus(snapName: string): Promise<SnapStatus> {\n let installed = false;\n let version: string | null = null;\n\n try {\n const { stdout } = await run('snap', ['list', snapName]);\n installed = true;\n // Second line, second column is the version\n const secondLine = stdout.split('\\n')[1];\n if (secondLine) {\n version = secondLine.split(/\\s+/)[1] ?? null;\n }\n } catch {\n return { installed: false, running: false, snapName, endpoint: null, version: null };\n }\n\n let running = false;\n try {\n await run(snapName, ['status']);\n running = true;\n } catch {\n // not running\n }\n\n const endpoint = running ? 'http://localhost:9090/v1' : null;\n return { installed, running, snapName, endpoint, version };\n }\n\n async snapInstall(snapName: string): Promise<ModelPullResult> {\n const known = KNOWN_SNAPS.some(([name]) => name === snapName);\n if (!known) throw new Error(`Unknown inference snap: ${snapName}`);\n\n try {\n const { stdout, stderr } = await execFileAsync('sudo', ['snap', 'install', snapName], {\n timeout: 300_000, // 5 min for large snaps\n });\n return { success: true, message: stdout || stderr };\n } catch (err) {\n return { success: false, message: err instanceof Error ? err.message : String(err) };\n }\n }\n\n async snapRemove(snapName: string): Promise<void> {\n await execFileAsync('sudo', ['snap', 'remove', snapName], { timeout: 60_000 });\n }\n}\n","import { existsSync, unlinkSync } from 'node:fs';\nimport { createServer } from 'node:net';\nimport { diffConfig, syncConfig } from '../config/config-sync.js';\nimport { findHarnessProcesses } from '../detection/process-detector.js';\nimport type { HarnessRegistry } from '../registry/harness-registry.js';\nimport type { DaemonStore } from '../storage/daemon-store.js';\nimport type { ConfigSyncDirection } from '../types/core.js';\nimport type { InferenceService } from './inference-service.js';\nimport type { SpawnerService } from './spawner-service.js';\n\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: number | string | null;\n method: string;\n params?: unknown;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: '2.0';\n id: number | string | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nconst ERR_PARSE = -32700;\nconst ERR_INVALID_PARAMS = -32602;\nconst ERR_METHOD_NOT_FOUND = -32601;\nconst ERR_INTERNAL = -32603;\n\n/**\n * JSON-RPC 2.0 server over a Unix domain socket.\n * Mirrors RpcServer from packages/editors.\n *\n * Methods:\n * ping → { status: 'ok', pid }\n * harness.list → HarnessInfo[]\n * harness.execute → HarnessCommandResult\n * harness.info → HarnessInfo\n * harness.listRunning → HarnessProcessInfo[]\n * harness.syncConfig → ConfigSyncResult\n * harness.diffConfig → ConfigDiffEntry\n * harness.health → HealthCheckResult\n * session.register → AgentSession\n * session.update → AgentSession\n * session.end → { ok: true }\n * session.list → AgentSession[]\n * session.history → AgentSession[]\n * mail.send → AgentMessage\n * mail.broadcast → { sent: number }\n * mail.inbox → AgentMessage[]\n * mail.markRead → { ok: true }\n * files.reserve → { success, holder? }\n * files.check → FileReservation | null\n * files.release → { released: number }\n * files.list → FileReservation[]\n * tasks.create → AgentTask\n * tasks.claim → { success, owner? }\n * tasks.complete → { ok: boolean }\n * tasks.release → { ok: boolean }\n * tasks.list → AgentTask[]\n * events.log → DaemonEvent\n * events.recent → DaemonEvent[]\n * agent.spawn → { sessionId: string }\n * agent.stop → { ok: true }\n * agent.list → AgentSessionInfo[]\n * agent.remove → { ok: true }\n * inference.ollama.status → OllamaStatus\n * inference.ollama.models → OllamaModel[]\n * inference.ollama.pull → ModelPullResult\n * inference.ollama.delete → { ok: true }\n * inference.ollama.start → { ok: true }\n * inference.ollama.stop → { ok: true }\n * inference.bitnet.status → BitNetStatus\n * inference.snap.list → SnapModel[]\n * inference.snap.status → SnapStatus\n * inference.snap.install → ModelPullResult\n * inference.snap.remove → { ok: true }\n */\nexport class RpcServer {\n private server = createServer();\n private healthCheckFn: (() => Promise<unknown>) | null = null;\n private spawner: SpawnerService | null = null;\n private inference: InferenceService | null = null;\n\n constructor(\n private readonly registry: HarnessRegistry,\n private readonly socketPath: string,\n private readonly store?: DaemonStore,\n ) {\n this.server.on('connection', (socket) => {\n let buffer = '';\n socket.on('data', (chunk) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n this.handleLine(line.trim(), (response) => {\n socket.write(`${JSON.stringify(response)}\\n`);\n });\n }\n });\n });\n }\n\n private handleLine(line: string, reply: (r: JsonRpcResponse) => void): void {\n let req: JsonRpcRequest;\n try {\n req = JSON.parse(line) as JsonRpcRequest;\n } catch {\n reply({ jsonrpc: '2.0', id: null, error: { code: ERR_PARSE, message: 'Parse error' } });\n return;\n }\n\n this.dispatch(req)\n .then(reply)\n .catch((err) => {\n reply({\n jsonrpc: '2.0',\n id: req.id,\n error: { code: ERR_INTERNAL, message: err instanceof Error ? err.message : String(err) },\n });\n });\n }\n\n private async dispatch(req: JsonRpcRequest): Promise<JsonRpcResponse> {\n const { id, method, params } = req;\n const p = (params ?? {}) as Record<string, unknown>;\n\n switch (method) {\n case 'harness.list': {\n const ids = await this.registry.listAvailable();\n const infos = await Promise.all(ids.map((id) => this.registry.get(id)?.getInfo()));\n return { jsonrpc: '2.0', id, result: infos };\n }\n\n case 'harness.info': {\n const harnessId = p.harnessId as string | undefined;\n if (!harnessId) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: 'harnessId required' },\n };\n }\n const adapter = this.registry.get(harnessId);\n if (!adapter) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: `Harness not found: ${harnessId}` },\n };\n }\n return { jsonrpc: '2.0', id, result: await adapter.getInfo() };\n }\n\n case 'harness.execute': {\n const harnessId = p.harnessId as string | undefined;\n const command = p.command as Record<string, unknown> | undefined;\n if (!(harnessId && command)) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: 'harnessId and command required' },\n };\n }\n const adapter = this.registry.get(harnessId);\n if (!adapter) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: `Harness not found: ${harnessId}` },\n };\n }\n const result = await adapter.execute(command as Parameters<typeof adapter.execute>[0]);\n return { jsonrpc: '2.0', id, result };\n }\n\n case 'harness.syncConfig': {\n const harnessId = p.harnessId as string | undefined;\n const direction = p.direction as ConfigSyncDirection | undefined;\n if (!(harnessId && direction)) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: 'harnessId and direction required' },\n };\n }\n return { jsonrpc: '2.0', id, result: syncConfig(harnessId, direction) };\n }\n\n case 'harness.diffConfig': {\n const harnessId = p.harnessId as string | undefined;\n if (!harnessId) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: 'harnessId required' },\n };\n }\n return { jsonrpc: '2.0', id, result: diffConfig(harnessId) };\n }\n\n case 'harness.listRunning': {\n const harnessId = p.harnessId as string | undefined;\n if (!harnessId) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: 'harnessId required' },\n };\n }\n const processes = await findHarnessProcesses(harnessId);\n return { jsonrpc: '2.0', id, result: processes };\n }\n\n case 'ping': {\n return { jsonrpc: '2.0', id, result: { status: 'ok', pid: process.pid } };\n }\n\n case 'harness.health': {\n if (!this.healthCheckFn) {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INTERNAL, message: 'Health check not configured' },\n };\n }\n const health = await this.healthCheckFn();\n return { jsonrpc: '2.0', id, result: health };\n }\n\n // -----------------------------------------------------------------------\n // Session management (PGlite-backed)\n // -----------------------------------------------------------------------\n case 'session.register': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n const env = p.env as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n const session = await this.store.registerSession({\n id: agentId,\n env: env ?? agentId,\n task: p.task as string | undefined,\n pid: p.pid as number | undefined,\n });\n return { jsonrpc: '2.0', id, result: { session } };\n }\n\n case 'session.update': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n const session = await this.store.updateSession(agentId, {\n task: p.task as string | undefined,\n files: p.files as string | undefined,\n });\n return { jsonrpc: '2.0', id, result: session };\n }\n\n case 'session.end': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n await this.store.endSession(agentId, p.exitSummary as string | undefined);\n await this.store.releaseAllReservations(agentId);\n await this.store.logEvent({\n agentId,\n eventType: 'session-end',\n payload: { exitSummary: p.exitSummary },\n });\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n case 'session.list': {\n if (!this.store) return this.noStore(id);\n const sessions = await this.store.getActiveSessions();\n return { jsonrpc: '2.0', id, result: sessions };\n }\n\n case 'session.history': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n const limit = (p.limit as number | undefined) ?? 10;\n const history = await this.store.getSessionHistory(agentId, limit);\n return { jsonrpc: '2.0', id, result: history };\n }\n\n // -----------------------------------------------------------------------\n // Inter-agent messaging (PGlite-backed)\n // -----------------------------------------------------------------------\n case 'mail.send': {\n if (!this.store) return this.noStore(id);\n const fromAgent = p.fromAgent as string | undefined;\n const toAgent = p.toAgent as string | undefined;\n const subject = p.subject as string | undefined;\n if (!(fromAgent && toAgent && subject)) {\n return this.missingParam(id, 'fromAgent, toAgent, subject');\n }\n const msg = await this.store.sendMessage({\n fromAgent,\n toAgent,\n subject,\n body: p.body as string | undefined,\n });\n return { jsonrpc: '2.0', id, result: msg };\n }\n\n case 'mail.broadcast': {\n if (!this.store) return this.noStore(id);\n const fromAgent = p.fromAgent as string | undefined;\n const subject = p.subject as string | undefined;\n if (!(fromAgent && subject)) return this.missingParam(id, 'fromAgent, subject');\n const sent = await this.store.broadcastMessage({\n fromAgent,\n subject,\n body: p.body as string | undefined,\n });\n return { jsonrpc: '2.0', id, result: { sent } };\n }\n\n case 'mail.inbox': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n const unreadOnly = (p.unreadOnly as boolean | undefined) ?? true;\n const messages = await this.store.getInbox(agentId, unreadOnly);\n return { jsonrpc: '2.0', id, result: messages };\n }\n\n case 'mail.markRead': {\n if (!this.store) return this.noStore(id);\n const messageIds = p.messageIds as number[] | undefined;\n if (!messageIds) return this.missingParam(id, 'messageIds');\n await this.store.markRead(messageIds);\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n // -----------------------------------------------------------------------\n // File reservations (PGlite-backed)\n // -----------------------------------------------------------------------\n case 'files.reserve': {\n if (!this.store) return this.noStore(id);\n const filePath = p.filePath as string | undefined;\n const agentId = p.agentId as string | undefined;\n if (!(filePath && agentId)) return this.missingParam(id, 'filePath, agentId');\n const ttlSeconds = (p.ttlSeconds as number | undefined) ?? 3600;\n const reservation = await this.store.reserveFile({\n filePath,\n agentId,\n ttlSeconds,\n reason: p.reason as string | undefined,\n });\n return { jsonrpc: '2.0', id, result: reservation };\n }\n\n case 'files.check': {\n if (!this.store) return this.noStore(id);\n const filePath = p.filePath as string | undefined;\n if (!filePath) return this.missingParam(id, 'filePath');\n const reservation = await this.store.checkReservation(filePath);\n return { jsonrpc: '2.0', id, result: reservation };\n }\n\n case 'files.release': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n const released = await this.store.releaseAllReservations(agentId);\n return { jsonrpc: '2.0', id, result: { released } };\n }\n\n case 'files.list': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n if (!agentId) return this.missingParam(id, 'agentId');\n const reservations = await this.store.getReservations(agentId);\n return { jsonrpc: '2.0', id, result: reservations };\n }\n\n // -----------------------------------------------------------------------\n // Tasks (PGlite-backed)\n // -----------------------------------------------------------------------\n case 'tasks.create': {\n if (!this.store) return this.noStore(id);\n const taskId = p.taskId as string | undefined;\n const description = p.description as string | undefined;\n if (!taskId) return this.missingParam(id, 'taskId');\n const task = await this.store.createTask({ id: taskId, description: description ?? '' });\n return { jsonrpc: '2.0', id, result: task };\n }\n\n case 'tasks.claim': {\n if (!this.store) return this.noStore(id);\n const taskId = p.taskId as string | undefined;\n const agentId = p.agentId as string | undefined;\n if (!(taskId && agentId)) return this.missingParam(id, 'taskId, agentId');\n const claim = await this.store.claimTask(taskId, agentId);\n return { jsonrpc: '2.0', id, result: claim };\n }\n\n case 'tasks.complete': {\n if (!this.store) return this.noStore(id);\n const taskId = p.taskId as string | undefined;\n const agentId = p.agentId as string | undefined;\n if (!(taskId && agentId)) return this.missingParam(id, 'taskId, agentId');\n const completed = await this.store.completeTask(taskId, agentId);\n return { jsonrpc: '2.0', id, result: { ok: completed } };\n }\n\n case 'tasks.release': {\n if (!this.store) return this.noStore(id);\n const taskId = p.taskId as string | undefined;\n const agentId = p.agentId as string | undefined;\n if (!(taskId && agentId)) return this.missingParam(id, 'taskId, agentId');\n const released = await this.store.releaseTask(taskId, agentId);\n return { jsonrpc: '2.0', id, result: { ok: released } };\n }\n\n case 'tasks.list': {\n if (!this.store) return this.noStore(id);\n const tasks = await this.store.listTasks({\n status: p.status as string | undefined,\n owner: p.owner as string | undefined,\n });\n return { jsonrpc: '2.0', id, result: tasks };\n }\n\n // -----------------------------------------------------------------------\n // Events (PGlite-backed)\n // -----------------------------------------------------------------------\n case 'events.log': {\n if (!this.store) return this.noStore(id);\n const agentId = p.agentId as string | undefined;\n const eventType = p.eventType as string | undefined;\n if (!(agentId && eventType)) return this.missingParam(id, 'agentId, eventType');\n const event = await this.store.logEvent({\n agentId,\n eventType,\n payload: p.payload as Record<string, unknown> | undefined,\n });\n return { jsonrpc: '2.0', id, result: event };\n }\n\n case 'events.recent': {\n if (!this.store) return this.noStore(id);\n const limit = (p.limit as number | undefined) ?? 50;\n const events = await this.store.getRecentEvents(limit);\n return { jsonrpc: '2.0', id, result: events };\n }\n\n // -----------------------------------------------------------------------\n // Agent spawner (process management)\n // -----------------------------------------------------------------------\n case 'agent.spawn': {\n if (!this.spawner) return this.noService(id, 'spawner');\n const name = p.name as string | undefined;\n const backend = p.backend as string | undefined;\n const model = p.model as string | undefined;\n const prompt = p.prompt as string | undefined;\n if (!(name && backend && model && prompt)) {\n return this.missingParam(id, 'name, backend, model, prompt');\n }\n const sessionId = this.spawner.spawn(\n name,\n backend as 'Snap' | 'BitNet' | 'Ollama',\n model,\n prompt,\n );\n return { jsonrpc: '2.0', id, result: { sessionId } };\n }\n\n case 'agent.stop': {\n if (!this.spawner) return this.noService(id, 'spawner');\n const sessionId = p.sessionId as string | undefined;\n if (!sessionId) return this.missingParam(id, 'sessionId');\n this.spawner.stop(sessionId);\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n case 'agent.list': {\n if (!this.spawner) return this.noService(id, 'spawner');\n return { jsonrpc: '2.0', id, result: this.spawner.list() };\n }\n\n case 'agent.remove': {\n if (!this.spawner) return this.noService(id, 'spawner');\n const sessionId = p.sessionId as string | undefined;\n if (!sessionId) return this.missingParam(id, 'sessionId');\n this.spawner.remove(sessionId);\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n // -----------------------------------------------------------------------\n // Inference management (Ollama, BitNet, Snaps)\n // -----------------------------------------------------------------------\n case 'inference.ollama.status': {\n if (!this.inference) return this.noService(id, 'inference');\n return { jsonrpc: '2.0', id, result: await this.inference.ollamaStatus() };\n }\n\n case 'inference.ollama.models': {\n if (!this.inference) return this.noService(id, 'inference');\n return { jsonrpc: '2.0', id, result: await this.inference.ollamaModels() };\n }\n\n case 'inference.ollama.pull': {\n if (!this.inference) return this.noService(id, 'inference');\n const modelName = p.modelName as string | undefined;\n if (!modelName) return this.missingParam(id, 'modelName');\n return { jsonrpc: '2.0', id, result: await this.inference.ollamaPull(modelName) };\n }\n\n case 'inference.ollama.delete': {\n if (!this.inference) return this.noService(id, 'inference');\n const modelName = p.modelName as string | undefined;\n if (!modelName) return this.missingParam(id, 'modelName');\n await this.inference.ollamaDelete(modelName);\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n case 'inference.ollama.start': {\n if (!this.inference) return this.noService(id, 'inference');\n await this.inference.ollamaStart();\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n case 'inference.ollama.stop': {\n if (!this.inference) return this.noService(id, 'inference');\n await this.inference.ollamaStop();\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n case 'inference.bitnet.status': {\n if (!this.inference) return this.noService(id, 'inference');\n return { jsonrpc: '2.0', id, result: await this.inference.bitnetStatus() };\n }\n\n case 'inference.snap.list': {\n if (!this.inference) return this.noService(id, 'inference');\n return { jsonrpc: '2.0', id, result: await this.inference.snapList() };\n }\n\n case 'inference.snap.status': {\n if (!this.inference) return this.noService(id, 'inference');\n const snapName = p.snapName as string | undefined;\n if (!snapName) return this.missingParam(id, 'snapName');\n return { jsonrpc: '2.0', id, result: await this.inference.snapStatus(snapName) };\n }\n\n case 'inference.snap.install': {\n if (!this.inference) return this.noService(id, 'inference');\n const snapName = p.snapName as string | undefined;\n if (!snapName) return this.missingParam(id, 'snapName');\n return { jsonrpc: '2.0', id, result: await this.inference.snapInstall(snapName) };\n }\n\n case 'inference.snap.remove': {\n if (!this.inference) return this.noService(id, 'inference');\n const snapName = p.snapName as string | undefined;\n if (!snapName) return this.missingParam(id, 'snapName');\n await this.inference.snapRemove(snapName);\n return { jsonrpc: '2.0', id, result: { ok: true } };\n }\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_METHOD_NOT_FOUND, message: `Method not found: ${method}` },\n };\n }\n }\n\n /** Helper: store not configured error. */\n private noStore(id: number | string | null): JsonRpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INTERNAL, message: 'Daemon store not initialized' },\n };\n }\n\n /** Helper: missing parameter error. */\n private missingParam(id: number | string | null, param: string): JsonRpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INVALID_PARAMS, message: `Missing required parameter: ${param}` },\n };\n }\n\n /** Helper: service not configured error. */\n private noService(id: number | string | null, service: string): JsonRpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code: ERR_INTERNAL, message: `${service} service not initialized` },\n };\n }\n\n /**\n * Dispatch an HTTP request body (JSON-RPC) and call the reply callback.\n * Used by HttpGateway to proxy requests without going through a socket.\n */\n dispatchHttp(body: string, reply: (response: JsonRpcResponse) => void): void {\n this.handleLine(body.trim(), reply);\n }\n\n /** Set the health check function (called by coordinator after construction). */\n setHealthCheck(fn: () => Promise<unknown>): void {\n this.healthCheckFn = fn;\n }\n\n /** Attach the spawner service (called by coordinator after construction). */\n setSpawner(spawner: SpawnerService): void {\n this.spawner = spawner;\n }\n\n /** Attach the inference service (called by coordinator after construction). */\n setInference(inference: InferenceService): void {\n this.inference = inference;\n }\n\n /** Get the spawner service (used by HTTP gateway for SSE). */\n getSpawner(): SpawnerService | null {\n return this.spawner;\n }\n\n start(): Promise<void> {\n // Clean up stale socket from a previous crash\n if (existsSync(this.socketPath)) {\n unlinkSync(this.socketPath);\n }\n return new Promise((resolve, reject) => {\n this.server.listen(this.socketPath, () => resolve());\n this.server.once('error', reject);\n });\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => this.server.close(() => resolve()));\n }\n}\n","import { execFile } from 'node:child_process';\nimport { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { promisify } from 'node:util';\nimport type { HarnessProcessInfo } from '../types/core.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** Finds running processes matching a pattern using pgrep. */\nexport async function findProcesses(pattern: string): Promise<{ pid: number; command: string }[]> {\n try {\n const { stdout } = await execFileAsync('pgrep', ['-a', pattern], { timeout: 3000 });\n return stdout\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const spaceIdx = line.indexOf(' ');\n const pid = parseInt(line.slice(0, spaceIdx), 10);\n const command = line.slice(spaceIdx + 1);\n return { pid, command };\n });\n } catch {\n return [];\n }\n}\n\nconst HARNESS_PROCESS_PATTERNS: Record<string, string[]> = {\n 'claude-code': ['claude'],\n cursor: ['cursor', 'Cursor'],\n copilot: ['copilot'],\n};\n\n/** Finds running process instances for a specific harness. */\nexport async function findHarnessProcesses(harnessId: string): Promise<HarnessProcessInfo[]> {\n const patterns = HARNESS_PROCESS_PATTERNS[harnessId];\n if (!patterns) return [];\n\n const results = await Promise.all(patterns.map((p) => findProcesses(p)));\n return results.flat().map((p) => ({ ...p, harnessId }));\n}\n\n/** Finds running processes for all known harnesses. */\nexport async function findAllHarnessProcesses(): Promise<HarnessProcessInfo[]> {\n const results = await Promise.all(\n Object.keys(HARNESS_PROCESS_PATTERNS).map((id) => findHarnessProcesses(id)),\n );\n return results.flat();\n}\n\n/** Finds Claude Code Unix socket files (used for IPC). */\nexport async function findClaudeCodeSockets(): Promise<string[]> {\n const dirs = [\n '/tmp',\n process.env.XDG_RUNTIME_DIR,\n join(process.env.HOME ?? '/tmp', '.claude'),\n ].filter(Boolean) as string[];\n\n const sockets: string[] = [];\n for (const dir of dirs) {\n try {\n const entries = await readdir(dir);\n for (const entry of entries) {\n if (/^claude.*\\.sock$/.test(entry)) {\n sockets.push(join(dir, entry));\n }\n }\n } catch {\n // Directory not accessible.\n }\n }\n return sockets;\n}\n","import { type ChildProcess, spawn as nodeSpawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\n\n// ── Types ───────────────────────────────────────────────────────────\n\nexport type AgentBackend = 'Snap' | 'BitNet' | 'Ollama';\n\nexport interface AgentSessionInfo {\n id: string;\n name: string;\n model: string;\n backend: AgentBackend;\n prompt: string;\n status: 'running' | 'stopped' | 'errored';\n pid: number | null;\n}\n\nexport interface AgentOutputEvent {\n sessionId: string;\n stream: 'stdout' | 'stderr';\n line: string;\n}\n\nexport interface AgentExitEvent {\n sessionId: string;\n code: number | null;\n}\n\n// ── Configuration ───────────────────────────────────────────────────\n\nexport interface SpawnerConfig {\n /** Inference snap OpenAI-compatible endpoint (default: http://localhost:9090) */\n snapEndpoint: string;\n /** Max concurrent agent sessions (default: 8) */\n maxSessions: number;\n}\n\nconst DEFAULT_CONFIG: SpawnerConfig = {\n snapEndpoint: 'http://localhost:9090',\n maxSessions: 8,\n};\n\n// ── Service ─────────────────────────────────────────────────────────\n\ninterface AgentProcess {\n name: string;\n model: string;\n backend: AgentBackend;\n prompt: string;\n child: ChildProcess;\n status: 'running' | 'stopped' | 'errored';\n}\n\n/**\n * Manages agent process lifecycle on the daemon host.\n *\n * Emits:\n * 'output' → AgentOutputEvent (each stdout/stderr line)\n * 'exit' → AgentExitEvent (process termination)\n */\nexport class SpawnerService extends EventEmitter {\n private readonly sessions = new Map<string, AgentProcess>();\n private readonly config: SpawnerConfig;\n\n constructor(overrides?: Partial<SpawnerConfig>) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...overrides };\n }\n\n /** Spawn a new agent process. Returns the session ID. */\n spawn(name: string, backend: AgentBackend, model: string, prompt: string): string {\n if (this.sessions.size >= this.config.maxSessions) {\n throw new Error(`Max sessions (${this.config.maxSessions}) reached`);\n }\n\n const sessionId = randomUUID();\n let child: ChildProcess;\n\n switch (backend) {\n case 'Snap': {\n const body = JSON.stringify({\n model,\n messages: [{ role: 'user', content: prompt }],\n stream: false,\n });\n child = nodeSpawn(\n 'curl',\n [\n '-s',\n '-X',\n 'POST',\n `${this.config.snapEndpoint}/v1/chat/completions`,\n '-H',\n 'Content-Type: application/json',\n '-d',\n body,\n ],\n { stdio: ['ignore', 'pipe', 'pipe'] },\n );\n break;\n }\n case 'Ollama': {\n child = nodeSpawn('ollama', ['run', model, prompt], {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n break;\n }\n case 'BitNet': {\n child = nodeSpawn('bitnet', ['run', '--model', model, '--prompt', prompt], {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n break;\n }\n }\n\n const proc: AgentProcess = { name, model, backend, prompt, child, status: 'running' };\n this.sessions.set(sessionId, proc);\n\n // Stream stdout\n child.stdout?.on('data', (chunk: Buffer) => {\n const lines = chunk.toString().split('\\n');\n for (const line of lines) {\n if (line.length > 0) {\n this.emit('output', { sessionId, stream: 'stdout', line } satisfies AgentOutputEvent);\n }\n }\n });\n\n // Stream stderr\n child.stderr?.on('data', (chunk: Buffer) => {\n const lines = chunk.toString().split('\\n');\n for (const line of lines) {\n if (line.length > 0) {\n this.emit('output', { sessionId, stream: 'stderr', line } satisfies AgentOutputEvent);\n }\n }\n });\n\n // Handle exit\n child.on('close', (code) => {\n proc.status = code === 0 ? 'stopped' : 'errored';\n this.emit('exit', { sessionId, code } satisfies AgentExitEvent);\n });\n\n child.on('error', () => {\n proc.status = 'errored';\n this.emit('exit', { sessionId, code: null } satisfies AgentExitEvent);\n });\n\n return sessionId;\n }\n\n /** Stop a running agent by killing its process. */\n stop(sessionId: string): void {\n const proc = this.sessions.get(sessionId);\n if (!proc) throw new Error(`No agent session: ${sessionId}`);\n if (proc.status !== 'running') throw new Error(`Agent is not running (${proc.status})`);\n proc.child.kill('SIGTERM');\n proc.status = 'stopped';\n }\n\n /** List all agent sessions. */\n list(): AgentSessionInfo[] {\n const result: AgentSessionInfo[] = [];\n for (const [id, proc] of this.sessions) {\n result.push({\n id,\n name: proc.name,\n model: proc.model,\n backend: proc.backend,\n prompt: proc.prompt,\n status: proc.status,\n pid: proc.child.pid ?? null,\n });\n }\n return result;\n }\n\n /** Remove a stopped/errored session. */\n remove(sessionId: string): void {\n const proc = this.sessions.get(sessionId);\n if (!proc) throw new Error(`No agent session: ${sessionId}`);\n if (proc.status === 'running') throw new Error('Cannot remove a running agent — stop it first');\n this.sessions.delete(sessionId);\n }\n\n /** Kill all running agents (called on daemon shutdown). */\n stopAll(): void {\n for (const [, proc] of this.sessions) {\n if (proc.status === 'running') {\n proc.child.kill('SIGTERM');\n proc.status = 'stopped';\n }\n }\n }\n}\n"],"mappings":"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","names":["execFile","promisify","execFileAsync","promisify","execFile","mkdirSync","join","readFileSync","join","existsSync","join","execFile","promisify","execFileAsync","existsSync","existsSync","createServer","execFile","join","promisify","execFileAsync","createServer","id","existsSync","DEFAULT_CONFIG","join","mkdirSync"]}
|