@hivemind-os/collective-daemon 0.2.6 → 0.2.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.
@@ -9,7 +9,6 @@ import net2 from "net";
9
9
  import pino3 from "pino";
10
10
 
11
11
  // src/ipc/connection.ts
12
- import { createRequire as createRequire2 } from "module";
13
12
  import { randomUUID as randomUUID3 } from "crypto";
14
13
  import "net";
15
14
  import pino2 from "pino";
@@ -26,7 +25,6 @@ function logAuditEvent(event) {
26
25
  }
27
26
 
28
27
  // src/mcp/session.ts
29
- import { createRequire } from "module";
30
28
  import { randomUUID as randomUUID2 } from "crypto";
31
29
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
32
30
  import {
@@ -208,8 +206,7 @@ var McpTaskStore = class {
208
206
  };
209
207
 
210
208
  // src/mcp/session.ts
211
- var require2 = createRequire(import.meta.url);
212
- var { version: DAEMON_VERSION } = require2("../../package.json");
209
+ var DAEMON_VERSION = "0.2.7";
213
210
  var IpcTransport = class {
214
211
  constructor(emit) {
215
212
  this.emit = emit;
@@ -666,8 +663,7 @@ function delay(ms) {
666
663
  }
667
664
 
668
665
  // src/ipc/connection.ts
669
- var require3 = createRequire2(import.meta.url);
670
- var { version: DAEMON_VERSION2 } = require3("../../package.json");
666
+ var DAEMON_VERSION2 = "0.2.7";
671
667
  var logger2 = pino2({ name: "@hivemind-os/collective-daemon:connection" });
672
668
  var Connection = class {
673
669
  constructor(socket, state, options) {
@@ -1200,4 +1196,4 @@ var IpcServer = class {
1200
1196
  export {
1201
1197
  IpcServer
1202
1198
  };
1203
- //# sourceMappingURL=chunk-J7E3KQ5G.js.map
1199
+ //# sourceMappingURL=chunk-YZFGSEUY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ipc/server.ts","../src/ipc/connection.ts","../src/audit.ts","../src/mcp/session.ts","../src/ipc/protocol.ts","../src/mcp/task-store.ts","../src/ipc/connection-registry.ts"],"sourcesContent":["import { chmod, rm } from 'node:fs/promises';\nimport net from 'node:net';\n\nimport pino from 'pino';\n\nimport type { DaemonAuthStatus } from '../auth/session-monitor.js';\nimport type { DaemonStatusBase, DaemonState } from '../state.js';\nimport { Connection } from './connection.js';\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { MeshToolContext } from '@hivemind-os/collective-mcp-server';\nimport { ConnectionRegistry, type ConnectedApp, type ConnectedAppMetadata } from './connection-registry.js';\nimport {\n validateClientProcessOwnership,\n verifyPipeSecurity,\n type ClientValidationResult,\n type PipeSecurityStatus,\n} from './pipe-security.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:ipc-server' });\n\nexport interface DaemonStatusSnapshot extends DaemonStatusBase {\n connectedApps: ConnectedApp[];\n}\n\nexport interface IpcServerOptions {\n validateClient?: (metadata: ConnectedAppMetadata) => Promise<ClientValidationResult>;\n verifyPipeSecurity?: (ipcPath: string) => Promise<PipeSecurityStatus>;\n getAuthStatus?: () => DaemonAuthStatus;\n triggerReauth?: () => Promise<{ portalUrl: string | null; browserOpened: boolean; status: DaemonAuthStatus }>;\n}\n\nexport class IpcServer {\n private server?: net.Server;\n private readonly connections = new Map<string, Connection>();\n private readonly connectionRegistry = new ConnectionRegistry();\n toolContext?: MeshToolContext;\n\n constructor(\n private readonly ipcPath: string,\n private readonly state: DaemonState,\n private readonly options: IpcServerOptions = {},\n ) {}\n\n async start(): Promise<void> {\n if (this.server) {\n return;\n }\n\n if (process.platform !== 'win32') {\n await rm(this.ipcPath, { force: true });\n }\n\n const server = net.createServer((socket) => {\n this.handleConnection(socket);\n });\n\n await new Promise<void>((resolvePromise, reject) => {\n server.once('error', reject);\n if (process.platform === 'win32') {\n server.listen(this.ipcPath, () => {\n server.off('error', reject);\n resolvePromise();\n });\n return;\n }\n\n server.listen({ path: this.ipcPath, readableAll: false, writableAll: false }, () => {\n server.off('error', reject);\n resolvePromise();\n });\n });\n\n if (process.platform !== 'win32') {\n await chmod(this.ipcPath, 0o600);\n logger.debug({ ipcPath: this.ipcPath }, 'IPC socket permissions set to 0600 for local-user isolation.');\n } else {\n await this.logPipeSecurity();\n }\n\n server.on('error', (error) => {\n logger.error({ err: error }, 'IPC server error.');\n });\n this.server = server;\n }\n\n async stop(): Promise<void> {\n const server = this.server;\n if (!server) {\n return;\n }\n\n this.server = undefined;\n for (const connection of [...this.connections.values()]) {\n connection.close();\n }\n\n await new Promise<void>((resolvePromise, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolvePromise();\n });\n });\n\n if (process.platform !== 'win32') {\n await rm(this.ipcPath, { force: true });\n }\n }\n\n getConnectedApps(): ConnectedApp[] {\n return this.connectionRegistry.getConnectedApps();\n }\n\n getStatus(): DaemonStatusSnapshot {\n return {\n ...this.state.getStatusBase(),\n connectedApps: this.getConnectedApps(),\n };\n }\n\n getAuthStatus(): DaemonAuthStatus {\n return this.options.getAuthStatus?.() ?? {\n authMode: this.state.authProvider.mode,\n authenticated: this.state.authProvider.isAuthenticated(),\n state: this.state.authProvider.isAuthenticated() ? 'authenticated' : 'reauth_required',\n address: this.state.authProvider.isAuthenticated() ? this.state.address : null,\n expiresAt: null,\n expiresInMs: null,\n refreshAvailable: false,\n lastError: null,\n updatedAt: Date.now(),\n };\n }\n\n notifyAuthStatusChanged(status = this.getAuthStatus()): void {\n for (const connection of this.connections.values()) {\n connection.sendNotification('auth.status_changed', status);\n }\n }\n\n /**\n * Broadcast a notification to all connected MCP sessions.\n * Used for provider inbound task notifications and other system-wide events.\n */\n broadcastNotification(method: string, params?: unknown): void {\n for (const connection of this.connections.values()) {\n connection.sendNotification(method, params);\n }\n }\n\n /**\n * Look up the low-level MCP Server for a connected app by name.\n * Throws if multiple connections match (ambiguous).\n * Returns undefined if no match is found.\n */\n getMcpServerForApp(appName: string): Server | undefined {\n const matches: Connection[] = [];\n for (const connection of this.connections.values()) {\n if (connection.connectedAppName === appName) {\n matches.push(connection);\n }\n }\n\n if (matches.length > 1) {\n throw new Error(\n `Ambiguous MCP sampling target: ${matches.length} connections match appName \"${appName}\". ` +\n 'Use a more specific identifier or disconnect duplicate clients.',\n );\n }\n\n return matches[0]?.mcpServer;\n }\n\n private handleConnection(socket: net.Socket): void {\n logger.info({ ipcPath: this.ipcPath }, 'Received IPC connection attempt.');\n\n const connection = new Connection(socket, this.state, {\n getStatus: () => this.getStatus(),\n getAuthStatus: () => this.getAuthStatus(),\n triggerReauth: () => this.options.triggerReauth?.() ?? Promise.resolve({ portalUrl: null, browserOpened: false, status: this.getAuthStatus() }),\n validateClient: (metadata) => this.validateClient(metadata),\n toolContext: this.toolContext,\n onHello: (metadata) => {\n this.connectionRegistry.updateConnection(connection.id, metadata);\n },\n onClose: () => {\n this.connections.delete(connection.id);\n this.connectionRegistry.unregisterConnection(connection.id);\n },\n });\n\n this.connections.set(connection.id, connection);\n this.connectionRegistry.registerConnection(connection.id, connection.connectedAt);\n }\n\n private async logPipeSecurity(): Promise<void> {\n try {\n const inspectPipeSecurity = this.options.verifyPipeSecurity ?? verifyPipeSecurity;\n const status = await inspectPipeSecurity(this.ipcPath);\n const bindings = {\n ipcPath: this.ipcPath,\n userScoped: status.userScoped,\n aclVerified: status.aclVerified,\n owner: status.acl?.owner,\n identities: status.acl?.identities,\n };\n\n if (!status.userScoped) {\n logger.warn(bindings, status.note);\n return;\n }\n\n if (!status.aclVerified) {\n logger.debug(bindings, status.note);\n return;\n }\n\n logger.info(bindings, status.note);\n } catch (error) {\n logger.warn({ err: error, ipcPath: this.ipcPath }, 'Failed to inspect Windows pipe security.');\n }\n }\n\n private async validateClient(metadata: ConnectedAppMetadata): Promise<ClientValidationResult> {\n if (process.platform !== 'win32') {\n return {\n allowed: true,\n source: 'unix-socket',\n };\n }\n\n const validateClientProcess = this.options.validateClient ?? ((client) => validateClientProcessOwnership(client.appPid));\n const validation = await validateClientProcess(metadata);\n if (!validation.allowed) {\n logger.warn(\n {\n ipcPath: this.ipcPath,\n appName: metadata.appName,\n appPid: metadata.appPid,\n expectedUser: validation.expectedUser,\n actualUser: validation.actualUser,\n reason: validation.reason,\n },\n 'Rejected IPC client during Windows identity validation.',\n );\n }\n\n return validation;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport net from 'node:net';\n\nimport pino from 'pino';\n\ndeclare const PKG_VERSION: string;\nconst DAEMON_VERSION = PKG_VERSION;\n\nimport { logAuditEvent } from '../audit.js';\nimport type { DaemonAuthStatus } from '../auth/session-monitor.js';\nimport { McpSession, type McpSessionStatus } from '../mcp/session.js';\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { MeshToolContext } from '@hivemind-os/collective-mcp-server';\nimport type { DaemonState } from '../state.js';\nimport type { ConnectedAppMetadata } from './connection-registry.js';\nimport type { ClientValidationResult } from './pipe-security.js';\nimport {\n createErrorResponse,\n isJsonRpcNotification,\n isJsonRpcRequest,\n parseMessage,\n serializeResponse,\n type JsonRpcMessage,\n} from './protocol.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:connection' });\n\ninterface ConnectionOptions {\n getStatus: () => McpSessionStatus;\n getAuthStatus: () => DaemonAuthStatus;\n triggerReauth: () => Promise<{ portalUrl: string | null; browserOpened: boolean; status: DaemonAuthStatus }>;\n validateClient: (metadata: ConnectedAppMetadata) => Promise<ClientValidationResult>;\n toolContext?: MeshToolContext;\n onHello: (metadata: ConnectedAppMetadata) => void;\n onClose: () => void;\n}\n\nexport class Connection {\n readonly id = randomUUID();\n readonly connectedAt = Date.now();\n\n /** The app name set during shim_hello handshake, or undefined if not yet received. */\n get connectedAppName(): string | undefined {\n return this.appName;\n }\n\n /** The low-level MCP Server for this connection (for sampling requests). */\n get mcpServer(): Server {\n return this.session.mcpServer;\n }\n\n private appName?: string;\n private appPid?: number;\n private profile?: string;\n private readonly session: McpSession;\n private readonly sessionReady: Promise<void>;\n private buffer = '';\n private helloReceived = false;\n private closed = false;\n\n constructor(\n private readonly socket: net.Socket,\n private readonly state: DaemonState,\n private readonly options: ConnectionOptions,\n ) {\n this.socket.setEncoding('utf8');\n this.socket.setNoDelay(true);\n this.session = new McpSession({\n state: this.state,\n emit: async (message) => {\n this.sendMessage(message);\n },\n getStatus: this.options.getStatus,\n getAppName: () => this.appName ?? 'unknown',\n toolContext: this.options.toolContext,\n });\n this.sessionReady = this.session.initialize();\n this.socket.on('data', (chunk: string | Buffer) => {\n this.buffer += chunk.toString();\n this.drainBuffer();\n });\n this.socket.on('close', () => {\n this.close();\n });\n this.socket.on('end', () => {\n this.close();\n });\n this.socket.on('error', (error) => {\n logger.debug({ err: error, connectionId: this.id }, 'Socket error.');\n this.close();\n });\n }\n\n private drainBuffer(): void {\n let newlineIndex = this.buffer.indexOf('\\n');\n while (newlineIndex >= 0) {\n const line = this.buffer.slice(0, newlineIndex).trim();\n this.buffer = this.buffer.slice(newlineIndex + 1);\n\n if (line) {\n const message = parseMessage(line);\n if (!message) {\n this.sendMessage(createErrorResponse(null, -32700, 'Parse error'));\n } else {\n void this.handleMessage(message).catch((error) => {\n logger.error({ err: error, connectionId: this.id }, 'Failed to handle IPC message.');\n if (isJsonRpcRequest(message)) {\n this.sendMessage(createErrorResponse(message.id, -32603, 'Internal error'));\n }\n });\n }\n }\n\n newlineIndex = this.buffer.indexOf('\\n');\n }\n }\n\n private async handleMessage(message: JsonRpcMessage): Promise<void> {\n if (isJsonRpcRequest(message) && message.method === 'shim_hello') {\n if (this.helloReceived) {\n this.sendMessage(createErrorResponse(message.id, -32600, 'shim_hello has already been received'));\n return;\n }\n\n await this.handleShimHello(message.id, message.params);\n return;\n }\n\n if (!this.helloReceived) {\n if (isJsonRpcRequest(message)) {\n this.sendMessage(createErrorResponse(message.id, -32000, 'Expected shim_hello as the first message'));\n }\n return;\n }\n\n if (isJsonRpcRequest(message) && message.method === 'daemon_status') {\n this.handleDaemonStatus(message.id);\n return;\n }\n\n if (isJsonRpcRequest(message) && message.method === 'auth.status') {\n this.handleAuthStatus(message.id);\n return;\n }\n\n if (isJsonRpcRequest(message) && message.method === 'auth.reauth') {\n await this.handleAuthReauth(message.id);\n return;\n }\n\n await this.handleMcpMessage(message);\n }\n\n private async handleShimHello(id: string | number, params: unknown): Promise<void> {\n if (!isRecord(params)) {\n this.sendMessage(createErrorResponse(id, -32602, 'shim_hello requires app metadata'));\n return;\n }\n\n const appPid = readPid(params.pid ?? params.appPid);\n const appName = readString(params.appName) ?? readString(params.clientName) ?? inferAppName(appPid);\n const profile = readString(params.profile);\n if (!appName || appPid === undefined) {\n this.sendMessage(createErrorResponse(id, -32602, 'shim_hello requires appName and pid'));\n return;\n }\n\n const validation = await this.options.validateClient({\n appName,\n appPid,\n profile,\n });\n if (!validation.allowed) {\n logger.warn(\n {\n connectionId: this.id,\n appName,\n appPid,\n expectedUser: validation.expectedUser,\n actualUser: validation.actualUser,\n reason: validation.reason,\n },\n 'IPC client validation failed.',\n );\n this.rejectAndClose(id, validation.reason ?? 'IPC client validation failed.');\n return;\n }\n\n this.appName = appName;\n this.appPid = appPid;\n this.profile = profile;\n this.helloReceived = true;\n this.options.onHello({\n appName: this.appName,\n appPid: this.appPid,\n profile: this.profile,\n });\n logAuditEvent({\n event: 'app_connected',\n appName: this.appName,\n appPid: this.appPid,\n connectionId: this.id,\n });\n\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result: {\n acknowledged: true,\n connectionId: this.id,\n daemonVersion: DAEMON_VERSION,\n },\n });\n }\n\n private handleDaemonStatus(id: string | number): void {\n const status = this.options.getStatus();\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result: {\n did: status.did,\n uptime: status.uptime,\n connectedApps: status.connectedApps.map((app) => ({\n appName: app.appName,\n connectedAt: app.connectedAt,\n })),\n spendingToday: status.spendingToday,\n providerRunning: status.providerRunning,\n },\n });\n }\n\n private handleAuthStatus(id: string | number): void {\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result: this.options.getAuthStatus(),\n });\n }\n\n private async handleAuthReauth(id: string | number): Promise<void> {\n const result = await this.options.triggerReauth();\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result,\n });\n }\n\n private async handleMcpMessage(message: JsonRpcMessage): Promise<void> {\n await this.sessionReady;\n\n try {\n if (isJsonRpcRequest(message)) {\n const toolCall = parseToolCall(message);\n if (toolCall) {\n logAuditEvent({\n event: 'tool_call',\n appName: this.appName ?? 'unknown',\n tool: toolCall.tool,\n taskId: toolCall.taskId,\n });\n }\n }\n\n await this.session.handleMessage(message);\n } catch (error) {\n logger.error({ err: error, connectionId: this.id }, 'MCP session error.');\n if (isJsonRpcRequest(message)) {\n this.sendMessage(createErrorResponse(message.id, -32603, 'MCP session error'));\n } else if (isJsonRpcNotification(message)) {\n this.close();\n }\n }\n }\n\n sendNotification(method: string, params?: unknown): void {\n this.sendMessage({\n jsonrpc: '2.0',\n method,\n params,\n });\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.options.onClose();\n if (this.appName) {\n logAuditEvent({\n event: 'app_disconnected',\n appName: this.appName,\n connectionId: this.id,\n duration: Date.now() - this.connectedAt,\n });\n }\n void this.session.close().catch((error) => {\n logger.debug({ err: error, connectionId: this.id }, 'Failed to close MCP session cleanly.');\n });\n if (!this.socket.destroyed && !this.socket.writableEnded) {\n this.socket.destroy();\n }\n }\n\n private rejectAndClose(id: string | number, message: string): void {\n if (this.closed || this.socket.destroyed) {\n return;\n }\n\n this.socket.end(`${serializeResponse(createErrorResponse(id, -32001, message))}\\n`);\n this.close();\n }\n\n private sendMessage(message: JsonRpcMessage): void {\n if (this.closed || this.socket.destroyed) {\n return;\n }\n\n this.socket.write(`${serializeResponse(message)}\\n`);\n }\n}\n\nfunction parseToolCall(message: { params?: unknown; method: string }): { tool: string; taskId?: string } | null {\n if (message.method !== 'tools/call' || !isRecord(message.params) || typeof message.params.name !== 'string') {\n return null;\n }\n\n return {\n tool: message.params.name,\n taskId: readTaskId(message.params.arguments),\n };\n}\n\nfunction readTaskId(value: unknown): string | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return readString(value.taskId) ?? readString(value.task_id);\n}\n\nfunction readPid(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\nfunction inferAppName(pid?: number): string | undefined {\n return typeof pid === 'number' ? `app-${pid}` : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n","import pino from 'pino';\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:audit' });\n\nexport type AuditEvent =\n | {\n event: 'app_connected';\n appName: string;\n appPid: number;\n connectionId: string;\n }\n | {\n event: 'app_disconnected';\n appName: string;\n connectionId: string;\n duration: number;\n }\n | {\n event: 'tool_call';\n appName: string;\n tool: string;\n taskId?: string;\n }\n | {\n event: 'spending';\n appName: string;\n amount: string;\n taskId: string;\n };\n\ntype AuditListener = (event: AuditEvent) => void;\n\nconst listeners = new Set<AuditListener>();\n\nexport function logAuditEvent(event: AuditEvent): void {\n logger.info(event);\n for (const listener of listeners) {\n listener(event);\n }\n}\n\nexport function subscribeAuditEvents(listener: AuditListener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n","import { randomUUID } from 'node:crypto';\n\ndeclare const PKG_VERSION: string;\nconst DAEMON_VERSION = PKG_VERSION;\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {\n CallToolRequestSchema,\n GetTaskRequestSchema,\n GetTaskPayloadRequestSchema,\n ListTasksRequestSchema,\n CancelTaskRequestSchema,\n ListToolsRequestSchema,\n type CallToolResult,\n type JSONRPCMessage as SdkJsonRpcMessage,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { SessionExpiredError } from '@hivemind-os/collective-core';\nimport {\n meshToolDefinitions,\n meshToolHandlers,\n registerResourceHandlers,\n type MeshToolContext,\n} from '@hivemind-os/collective-mcp-server';\nimport { PaymentRail, TaskStatus } from '@hivemind-os/collective-types';\n\nimport { logAuditEvent } from '../audit.js';\nimport type { ConnectedApp } from '../ipc/connection-registry.js';\nimport type { JsonRpcMessage, JsonRpcResponse } from '../ipc/protocol.js';\nimport { isJsonRpcRequest } from '../ipc/protocol.js';\nimport type { DaemonState } from '../state.js';\nimport { McpTaskStore, type McpTaskEntry, type McpTaskStatus } from './task-store.js';\n\nclass IpcTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage) => void;\n sessionId = randomUUID();\n\n private closed = false;\n private readonly pendingResponses = new Map<string | number, (message: JsonRpcResponse) => void>();\n\n constructor(private readonly emit: (message: JsonRpcMessage) => Promise<void> | void) {}\n\n async start(): Promise<void> {\n return;\n }\n\n async send(message: SdkJsonRpcMessage): Promise<void> {\n const jsonRpcMessage = message as unknown as JsonRpcMessage;\n if (isJsonRpcResponse(jsonRpcMessage) && jsonRpcMessage.id !== null) {\n this.pendingResponses.get(jsonRpcMessage.id)?.(jsonRpcMessage);\n this.pendingResponses.delete(jsonRpcMessage.id);\n }\n\n await this.emit(jsonRpcMessage);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.pendingResponses.clear();\n this.onclose?.();\n }\n\n async dispatch(message: JsonRpcMessage): Promise<void> {\n if (this.closed) {\n throw new Error('Transport is closed.');\n }\n\n this.onmessage?.(message as unknown as SdkJsonRpcMessage);\n }\n\n waitForResponse(id: string | number): Promise<JsonRpcResponse> {\n return new Promise((resolvePromise) => {\n this.pendingResponses.set(id, resolvePromise);\n });\n }\n}\n\nexport interface McpSessionStatus {\n did: string;\n address: string;\n uptime: number;\n connectedApps: ConnectedApp[];\n spendingToday: string;\n providerRunning: boolean;\n}\n\nexport class McpSession {\n private readonly server: Server;\n private readonly transport: IpcTransport;\n private readonly state: DaemonState;\n private readonly getStatus: () => McpSessionStatus;\n private readonly getAppName: () => string;\n private readonly toolContext?: MeshToolContext;\n private readonly taskStore = new McpTaskStore();\n private initializePromise?: Promise<void>;\n\n constructor(params: {\n state: DaemonState;\n emit: (message: JsonRpcMessage) => Promise<void> | void;\n getStatus: () => McpSessionStatus;\n getAppName: () => string;\n toolContext?: MeshToolContext;\n }) {\n this.state = params.state;\n this.getStatus = params.getStatus;\n this.getAppName = params.getAppName;\n this.toolContext = params.toolContext;\n this.server = new Server(\n { name: '@hivemind-os/collective-daemon', version: DAEMON_VERSION },\n {\n capabilities: {\n tools: {},\n tasks: {},\n ...(params.toolContext ? { resources: {} } : {}),\n },\n },\n );\n this.transport = new IpcTransport(params.emit);\n }\n\n async initialize(): Promise<void> {\n if (this.initializePromise) {\n await this.initializePromise;\n return;\n }\n\n this.registerTools();\n this.initializePromise = this.server.connect(this.transport);\n await this.initializePromise;\n }\n\n async handleMessage(message: JsonRpcMessage): Promise<JsonRpcResponse | null> {\n if (isJsonRpcRequest(message)) {\n const responsePromise = this.transport.waitForResponse(message.id);\n await this.transport.dispatch(message);\n return responsePromise;\n }\n\n await this.transport.dispatch(message);\n return null;\n }\n\n evaluateSpending(request: { amountMist: bigint; rail: PaymentRail; appId?: string }) {\n return this.state.spendingPolicy.evaluate({\n ...request,\n originAppName: this.getAppName(),\n });\n }\n\n recordSpending(entry: { amountMist: bigint; rail: PaymentRail; taskId: string; appId?: string }): void {\n const appName = this.getAppName();\n logAuditEvent({\n event: 'spending',\n appName,\n amount: entry.amountMist.toString(),\n taskId: entry.taskId,\n });\n this.state.spendingPolicy.record({\n ...entry,\n originAppName: appName,\n });\n }\n\n async close(): Promise<void> {\n this.taskStore.cleanup();\n await this.server.close();\n }\n\n /** Expose the low-level MCP Server for sampling requests. */\n get mcpServer(): Server {\n return this.server;\n }\n\n /** Get the per-session MCP task store. */\n getTaskStore(): McpTaskStore {\n return this.taskStore;\n }\n\n /** Send a progress notification to the connected client. */\n async sendProgress(progressToken: string | number, progress: number, total?: number, message?: string): Promise<void> {\n await this.server.notification({\n method: 'notifications/progress',\n params: { progressToken, progress, total, message },\n });\n }\n\n /** Send a task status notification to the connected client. */\n async sendTaskStatusNotification(entry: McpTaskEntry): Promise<void> {\n await this.server.notification({\n method: 'notifications/tasks/status',\n params: {\n taskId: entry.taskId,\n status: entry.status,\n ttl: entry.ttl,\n createdAt: entry.createdAt,\n lastUpdatedAt: entry.lastUpdatedAt,\n ...(entry.pollInterval !== undefined ? { pollInterval: entry.pollInterval } : {}),\n ...(entry.statusMessage !== undefined ? { statusMessage: entry.statusMessage } : {}),\n },\n });\n }\n\n private registerTools(): void {\n const daemonToolDefs = [\n {\n name: 'collective_balance',\n description: 'Return the daemon wallet SUI balance, address, and DID.',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'collective_status',\n description: 'Return daemon identity, uptime, and connected apps.',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n ];\n\n const daemonToolHandlers: Record<string, () => Promise<unknown>> = {\n collective_balance: async () => {\n const balanceMist = await this.state.suiClient.getBalance(this.state.address);\n return {\n did: this.state.did,\n address: this.state.address,\n balanceMist: balanceMist.toString(),\n };\n },\n collective_status: async () => {\n const status = this.getStatus();\n return {\n ...status,\n connectedApps: status.connectedApps.map((app) => ({ ...app, pid: app.appPid })),\n };\n },\n };\n\n // Merge: daemon-specific tools + mcp-server tools (skip mcp-server's collective_balance)\n const allToolDefs = [\n ...daemonToolDefs,\n ...meshToolDefinitions.filter((def) => !daemonToolHandlers[def.name]).map((def) => {\n // Annotate collective_execute with task support hint for task-capable clients\n if (def.name === 'collective_execute') {\n return { ...def, execution: { taskSupport: 'optional' as const } };\n }\n return def;\n }),\n ];\n\n const context = this.toolContext;\n\n this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: allToolDefs,\n }));\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n const meta = request.params._meta as Record<string, unknown> | undefined;\n const progressToken = meta?.progressToken as string | number | undefined;\n\n // Daemon-specific handlers\n const daemonHandler = daemonToolHandlers[toolName];\n if (daemonHandler) {\n try {\n const result = await daemonHandler();\n return createDaemonToolResult(result as Record<string, unknown>);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error.message : String(error));\n }\n }\n\n // mcp-server handlers\n const meshHandler = meshToolHandlers[toolName];\n if (meshHandler && context) {\n // For collective_execute: use MCP Tasks (async) only if the client advertises tasks support;\n // otherwise default to blocking (standard CallToolResult) for maximum compatibility.\n if (toolName === 'collective_execute' && this.clientSupportsTasks()) {\n try {\n return await this.handleExecuteAsTask(request.params.arguments as Record<string, unknown>, context, progressToken);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return createErrorResult(message);\n }\n }\n\n try {\n const callContext = { ...context, originAppName: this.getAppName() };\n const result = await meshHandler((request.params.arguments ?? {}) as never, callContext);\n return createSuccessResult(result);\n } catch (error) {\n const message =\n error instanceof SessionExpiredError\n ? 'Authentication expired. Please re-authenticate via the daemon portal.'\n : error instanceof Error\n ? error.message\n : String(error);\n return createErrorResult(message);\n }\n }\n\n return createErrorResult(`Unknown tool: ${toolName}`);\n });\n\n // Register MCP task protocol handlers\n this.registerTaskHandlers();\n\n // Register resource handlers (capabilities, wallet, agent, task resources)\n if (context) {\n registerResourceHandlers(this.server, context);\n }\n }\n\n /**\n * Check whether the connected client advertises MCP Tasks support.\n * Only VS Code Copilot (as of 2025-11-25 spec) does this; Claude Desktop,\n * ChatGPT, Cursor, Windsurf, and GH Coding Agent do not.\n */\n private clientSupportsTasks(): boolean {\n const caps = this.server.getClientCapabilities();\n return caps?.tasks != null;\n }\n\n /**\n * Handle collective_execute as an MCP Task: post the on-chain task, return immediately\n * with a task handle, and track completion in the background.\n */\n private async handleExecuteAsTask(\n args: Record<string, unknown>,\n context: MeshToolContext,\n progressToken?: string | number,\n ): Promise<{ task: McpTaskEntry } & Record<string, unknown>> {\n const callContext = { ...context, originAppName: this.getAppName() };\n const executeAsyncHandler = meshToolHandlers['collective_execute_async'];\n if (!executeAsyncHandler) {\n throw new Error('collective_execute_async handler not found');\n }\n\n // Post the task on chain (calls prepareMeshExecution under the hood)\n const asyncResult = await executeAsyncHandler(args as never, callContext) as {\n task_id: string;\n provider_did: string;\n price_mist: string;\n status: string;\n };\n\n // Create an MCP task entry tracking this on-chain task\n const mcpTask = this.taskStore.create(asyncResult.task_id, {\n progressToken,\n pollInterval: 2_000,\n });\n\n // Launch background completion tracker\n void this.trackTaskCompletion(mcpTask.taskId, asyncResult.task_id, callContext, {\n providerDid: asyncResult.provider_did,\n priceMist: BigInt(asyncResult.price_mist),\n });\n\n // Return MCP CreateTaskResult shape\n return {\n task: mcpTask,\n };\n }\n\n /**\n * Background loop that polls on-chain task status and sends notifications.\n */\n private async trackTaskCompletion(\n mcpTaskId: string,\n onChainTaskId: string,\n context: MeshToolContext,\n params: { providerDid: string; priceMist: bigint },\n ): Promise<void> {\n const POLL_INTERVAL_MS = 2_000;\n const MAX_DURATION_MS = 300_000; // 5 minutes max\n const startedAt = Date.now();\n let lastChainStatus: number | undefined;\n\n const entry = this.taskStore.get(mcpTaskId);\n const progressToken = entry?.progressToken;\n\n try {\n while (true) {\n if (Date.now() - startedAt > MAX_DURATION_MS) {\n this.taskStore.update(mcpTaskId, 'failed', { statusMessage: 'Timed out waiting for provider' });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n const task = await context.taskClient.getTask(onChainTaskId);\n if (!task) {\n this.taskStore.update(mcpTaskId, 'failed', { statusMessage: 'Task not found on chain' });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n // Send progress notifications on state transitions\n if (task.status !== lastChainStatus) {\n lastChainStatus = task.status;\n if (progressToken !== undefined) {\n await this.emitProgressForChainStatus(progressToken, task.status);\n }\n }\n\n // Check for cancellation by client\n const currentEntry = this.taskStore.get(mcpTaskId);\n if (!currentEntry || currentEntry.status === 'cancelled') {\n return;\n }\n\n if (task.status === TaskStatus.COMPLETED || task.status === TaskStatus.RELEASED) {\n // Fetch result and release payment\n let resultText = '';\n if (task.resultBlobId) {\n const resultBytes = await context.blobStore.fetch(task.resultBlobId);\n if (resultBytes) {\n resultText = new TextDecoder().decode(resultBytes);\n }\n }\n\n if (task.status === TaskStatus.COMPLETED) {\n await context.taskClient.releasePayment({\n taskId: onChainTaskId,\n keypair: context.keypair,\n });\n context.spendingPolicy.record({\n amountMist: params.priceMist,\n rail: PaymentRail.SUI_ESCROW,\n taskId: onChainTaskId,\n appId: params.providerDid,\n originAppName: context.originAppName,\n });\n }\n\n const toolResult: CallToolResult = {\n content: [{\n type: 'text',\n text: serialize({\n task_id: onChainTaskId,\n result: resultText,\n provider_did: params.providerDid,\n price_mist: params.priceMist.toString(),\n status: 'RELEASED',\n execution_mode: 'async',\n payment_rail: PaymentRail.SUI_ESCROW,\n }),\n }],\n };\n\n this.taskStore.update(mcpTaskId, 'completed', { result: toolResult });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n if (task.status === TaskStatus.CANCELLED || task.status === TaskStatus.DISPUTED) {\n this.taskStore.update(mcpTaskId, 'failed', {\n statusMessage: `Task ended with status ${TaskStatus[task.status]}`,\n });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.taskStore.update(mcpTaskId, 'failed', { statusMessage: message });\n try {\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n } catch {\n // notification send may fail if connection closed\n }\n }\n }\n\n private async emitProgressForChainStatus(progressToken: string | number, chainStatus: number): Promise<void> {\n const stages: Record<number, { progress: number; message: string }> = {\n [TaskStatus.POSTED]: { progress: 0.25, message: 'Escrow posted, waiting for provider' },\n [TaskStatus.ACCEPTED]: { progress: 0.5, message: 'Task accepted by provider' },\n [TaskStatus.COMPLETED]: { progress: 0.9, message: 'Provider completed, verifying result' },\n [TaskStatus.RELEASED]: { progress: 1, message: 'Payment released, task complete' },\n };\n\n const stage = stages[chainStatus];\n if (stage) {\n try {\n await this.sendProgress(progressToken, stage.progress, 1, stage.message);\n } catch {\n // ignore send failures\n }\n }\n }\n\n private registerTaskHandlers(): void {\n // tasks/get — return current task status\n this.server.setRequestHandler(GetTaskRequestSchema, async (request) => {\n const entry = this.taskStore.get(request.params.taskId);\n if (!entry) {\n throw new Error(`Task ${request.params.taskId} not found`);\n }\n return toTaskResult(entry);\n });\n\n // tasks/result — return the completed result\n this.server.setRequestHandler(GetTaskPayloadRequestSchema, async (request) => {\n const entry = this.taskStore.get(request.params.taskId);\n if (!entry) {\n throw new Error(`Task ${request.params.taskId} not found`);\n }\n if (entry.status !== 'completed' || !entry.result) {\n throw new Error(`Task ${request.params.taskId} is not yet completed (status: ${entry.status})`);\n }\n return entry.result;\n });\n\n // tasks/list — return all tasks for this session\n this.server.setRequestHandler(ListTasksRequestSchema, async () => {\n const tasks = this.taskStore.list().map((entry) => toTaskResult(entry));\n return { tasks };\n });\n\n // tasks/cancel — cancel a task, trigger on-chain cancel if possible\n this.server.setRequestHandler(CancelTaskRequestSchema, async (request) => {\n const entry = this.taskStore.get(request.params.taskId);\n if (!entry) {\n throw new Error(`Task ${request.params.taskId} not found`);\n }\n\n if (entry.status === 'completed' || entry.status === 'failed' || entry.status === 'cancelled') {\n return toTaskResult(entry);\n }\n\n // Attempt on-chain cancellation\n if (this.toolContext) {\n try {\n const chainTask = await this.toolContext.taskClient.getTask(entry.onChainTaskId);\n if (chainTask) {\n if (chainTask.status === TaskStatus.POSTED) {\n await this.toolContext.taskClient.cancelTask({\n taskId: entry.onChainTaskId,\n keypair: this.toolContext.keypair,\n });\n } else if (chainTask.status === TaskStatus.ACCEPTED) {\n await this.toolContext.taskClient.disputeTask({\n taskId: entry.onChainTaskId,\n keypair: this.toolContext.keypair,\n });\n }\n }\n } catch {\n // Chain cancellation is best-effort\n }\n }\n\n const cancelled = this.taskStore.cancel(request.params.taskId);\n return toTaskResult(cancelled ?? entry);\n });\n }\n}\n\nfunction createDaemonToolResult(payload: Record<string, unknown>): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: Record<string, unknown>;\n} {\n return {\n content: [{ type: 'text', text: serialize(payload) }],\n structuredContent: payload,\n };\n}\n\nfunction createSuccessResult(payload: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n} {\n return {\n content: [{ type: 'text', text: serialize(payload) }],\n };\n}\n\nfunction createErrorResult(message: string): {\n isError: true;\n content: Array<{ type: 'text'; text: string }>;\n} {\n return {\n isError: true,\n content: [{ type: 'text', text: serialize({ error: message }) }],\n };\n}\n\nfunction toTaskResult(entry: McpTaskEntry): {\n taskId: string;\n status: McpTaskStatus;\n ttl: number | null;\n createdAt: string;\n lastUpdatedAt: string;\n pollInterval?: number;\n statusMessage?: string;\n} {\n return {\n taskId: entry.taskId,\n status: entry.status,\n ttl: entry.ttl,\n createdAt: entry.createdAt,\n lastUpdatedAt: entry.lastUpdatedAt,\n ...(entry.pollInterval !== undefined ? { pollInterval: entry.pollInterval } : {}),\n ...(entry.statusMessage !== undefined ? { statusMessage: entry.statusMessage } : {}),\n };\n}\n\nfunction serialize(payload: unknown): string {\n return JSON.stringify(payload, bigintReplacer, 2);\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === 'bigint' ? value.toString() : value;\n}\n\nfunction isJsonRpcResponse(message: JsonRpcMessage): message is JsonRpcResponse {\n return !('method' in message);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n","export interface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: '2.0';\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport function parseMessage(line: string): JsonRpcMessage | null {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (!parsed || parsed.jsonrpc !== '2.0') {\n return null;\n }\n\n if (typeof parsed.method === 'string') {\n if ('id' in parsed) {\n if (typeof parsed.id !== 'string' && typeof parsed.id !== 'number') {\n return null;\n }\n\n return {\n jsonrpc: '2.0',\n id: parsed.id,\n method: parsed.method,\n params: parsed.params,\n } satisfies JsonRpcRequest;\n }\n\n return {\n jsonrpc: '2.0',\n method: parsed.method,\n params: parsed.params,\n } satisfies JsonRpcNotification;\n }\n\n if ('id' in parsed && (typeof parsed.id === 'string' || typeof parsed.id === 'number' || parsed.id === null)) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: parsed.id as JsonRpcResponse['id'],\n };\n\n if ('result' in parsed) {\n response.result = parsed.result;\n }\n\n if ('error' in parsed) {\n const error = parsed.error;\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const code = (error as Record<string, unknown>).code;\n const message = (error as Record<string, unknown>).message;\n if (typeof code !== 'number' || typeof message !== 'string') {\n return null;\n }\n\n response.error = {\n code,\n message,\n data: (error as Record<string, unknown>).data,\n };\n }\n\n if (!('result' in parsed) && !('error' in parsed)) {\n return null;\n }\n\n return response;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function serializeResponse(response: JsonRpcMessage): string {\n return JSON.stringify(response);\n}\n\nexport function createErrorResponse(\n id: string | number | null,\n code: number,\n message: string,\n data?: unknown,\n): JsonRpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code, message, data },\n };\n}\n\nexport function isJsonRpcRequest(message: JsonRpcMessage): message is JsonRpcRequest {\n return 'method' in message && 'id' in message;\n}\n\nexport function isJsonRpcNotification(message: JsonRpcMessage): message is JsonRpcNotification {\n return 'method' in message && !('id' in message);\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport type McpTaskStatus = 'working' | 'input_required' | 'completed' | 'failed' | 'cancelled';\n\nexport interface McpTaskEntry {\n taskId: string;\n onChainTaskId: string;\n status: McpTaskStatus;\n statusMessage?: string;\n createdAt: string;\n lastUpdatedAt: string;\n ttl: number | null;\n pollInterval?: number;\n result?: CallToolResult;\n progressToken?: string | number;\n}\n\nconst DEFAULT_TTL_MS = 3_600_000; // 1 hour\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\n\n/**\n * Per-session in-memory store mapping MCP task IDs to on-chain task IDs.\n * Tracks lifecycle state for each task and enables MCP task protocol support.\n */\nexport class McpTaskStore {\n private readonly tasks = new Map<string, McpTaskEntry>();\n private readonly chainToMcpId = new Map<string, string>();\n private readonly cleanupTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n create(onChainTaskId: string, options?: { ttl?: number | null; pollInterval?: number; progressToken?: string | number }): McpTaskEntry {\n const taskId = randomUUID();\n const now = new Date().toISOString();\n const ttl = options?.ttl !== undefined ? options.ttl : DEFAULT_TTL_MS;\n\n const entry: McpTaskEntry = {\n taskId,\n onChainTaskId,\n status: 'working',\n createdAt: now,\n lastUpdatedAt: now,\n ttl,\n pollInterval: options?.pollInterval ?? DEFAULT_POLL_INTERVAL_MS,\n progressToken: options?.progressToken,\n };\n\n this.tasks.set(taskId, entry);\n this.chainToMcpId.set(onChainTaskId, taskId);\n this.scheduleCleanup(entry);\n return entry;\n }\n\n get(taskId: string): McpTaskEntry | undefined {\n return this.tasks.get(taskId);\n }\n\n getByChainId(onChainTaskId: string): McpTaskEntry | undefined {\n const mcpId = this.chainToMcpId.get(onChainTaskId);\n return mcpId ? this.tasks.get(mcpId) : undefined;\n }\n\n update(taskId: string, status: McpTaskStatus, options?: { statusMessage?: string; result?: CallToolResult }): McpTaskEntry | undefined {\n const entry = this.tasks.get(taskId);\n if (!entry) {\n return undefined;\n }\n\n entry.status = status;\n entry.lastUpdatedAt = new Date().toISOString();\n if (options?.statusMessage !== undefined) {\n entry.statusMessage = options.statusMessage;\n }\n if (options?.result !== undefined) {\n entry.result = options.result;\n }\n\n // Reschedule cleanup from now on terminal states\n if (status === 'completed' || status === 'failed' || status === 'cancelled') {\n this.scheduleCleanup(entry);\n }\n\n return entry;\n }\n\n cancel(taskId: string): McpTaskEntry | undefined {\n return this.update(taskId, 'cancelled', { statusMessage: 'Cancelled by client' });\n }\n\n list(): McpTaskEntry[] {\n return [...this.tasks.values()];\n }\n\n cleanup(): void {\n for (const timer of this.cleanupTimers.values()) {\n clearTimeout(timer);\n }\n this.cleanupTimers.clear();\n this.tasks.clear();\n this.chainToMcpId.clear();\n }\n\n private scheduleCleanup(entry: McpTaskEntry): void {\n if (entry.ttl === null) {\n return;\n }\n\n const existing = this.cleanupTimers.get(entry.taskId);\n if (existing) {\n clearTimeout(existing);\n }\n\n const timer = setTimeout(() => {\n this.tasks.delete(entry.taskId);\n this.chainToMcpId.delete(entry.onChainTaskId);\n this.cleanupTimers.delete(entry.taskId);\n }, entry.ttl);\n\n // Don't keep the process alive for cleanup timers\n if (typeof timer === 'object' && 'unref' in timer) {\n timer.unref();\n }\n\n this.cleanupTimers.set(entry.taskId, timer);\n }\n}\n","export interface ConnectedApp {\n connectionId: string;\n appName: string;\n appPid: number;\n profile?: string;\n connectedAt: number;\n}\n\nexport interface ConnectedAppMetadata {\n appName: string;\n appPid: number;\n profile?: string;\n}\n\ninterface ConnectionEntry {\n connectionId: string;\n connectedAt: number;\n appName?: string;\n appPid?: number;\n profile?: string;\n}\n\nexport class ConnectionRegistry {\n private readonly connections = new Map<string, ConnectionEntry>();\n\n registerConnection(connectionId: string, connectedAt = Date.now()): void {\n this.connections.set(connectionId, {\n connectionId,\n connectedAt,\n });\n }\n\n updateConnection(connectionId: string, metadata: ConnectedAppMetadata): ConnectedApp {\n const current = this.connections.get(connectionId);\n const next: ConnectionEntry = {\n connectionId,\n connectedAt: current?.connectedAt ?? Date.now(),\n appName: metadata.appName,\n appPid: metadata.appPid,\n profile: metadata.profile,\n };\n\n this.connections.set(connectionId, next);\n return toConnectedApp(next);\n }\n\n unregisterConnection(connectionId: string): void {\n this.connections.delete(connectionId);\n }\n\n getConnectedApps(): ConnectedApp[] {\n return Array.from(this.connections.values())\n .filter(isConnectedApp)\n .map(toConnectedApp)\n .sort((left, right) => left.connectedAt - right.connectedAt);\n }\n}\n\nfunction isConnectedApp(entry: ConnectionEntry): entry is ConnectedApp {\n return typeof entry.appName === 'string' && typeof entry.appPid === 'number';\n}\n\nfunction toConnectedApp(entry: ConnectionEntry): ConnectedApp {\n if (!isConnectedApp(entry)) {\n throw new Error(`Connection ${entry.connectionId} is missing app metadata.`);\n }\n\n return {\n connectionId: entry.connectionId,\n connectedAt: entry.connectedAt,\n appName: entry.appName,\n appPid: entry.appPid,\n profile: entry.profile,\n };\n}\n"],"mappings":"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","names":["net","pino","randomUUID","pino","randomUUID","randomUUID","DAEMON_VERSION","logger","pino","randomUUID","logger","pino","net"]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  IpcServer
4
- } from "./chunk-J7E3KQ5G.js";
4
+ } from "./chunk-YZFGSEUY.js";
5
5
  import {
6
6
  PortalServer
7
7
  } from "./chunk-H5MBULPC.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  IpcServer
3
- } from "../chunk-J7E3KQ5G.js";
3
+ } from "../chunk-YZFGSEUY.js";
4
4
  import "../chunk-NXIFS427.js";
5
5
  export {
6
6
  IpcServer
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hivemind-os/collective-daemon",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -52,10 +52,10 @@
52
52
  "pino": "^9.0.0",
53
53
  "pino-pretty": "^13.0.0",
54
54
  "ws": "^8.0.0",
55
- "@hivemind-os/collective-core": "0.2.6",
56
- "@hivemind-os/collective-relay": "0.2.6",
57
- "@hivemind-os/collective-types": "0.2.6",
58
- "@hivemind-os/collective-mcp-server": "0.2.6"
55
+ "@hivemind-os/collective-core": "0.2.8",
56
+ "@hivemind-os/collective-mcp-server": "0.2.8",
57
+ "@hivemind-os/collective-types": "0.2.8",
58
+ "@hivemind-os/collective-relay": "0.2.8"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/js-yaml": "^4.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ipc/server.ts","../src/ipc/connection.ts","../src/audit.ts","../src/mcp/session.ts","../src/ipc/protocol.ts","../src/mcp/task-store.ts","../src/ipc/connection-registry.ts"],"sourcesContent":["import { chmod, rm } from 'node:fs/promises';\nimport net from 'node:net';\n\nimport pino from 'pino';\n\nimport type { DaemonAuthStatus } from '../auth/session-monitor.js';\nimport type { DaemonStatusBase, DaemonState } from '../state.js';\nimport { Connection } from './connection.js';\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { MeshToolContext } from '@hivemind-os/collective-mcp-server';\nimport { ConnectionRegistry, type ConnectedApp, type ConnectedAppMetadata } from './connection-registry.js';\nimport {\n validateClientProcessOwnership,\n verifyPipeSecurity,\n type ClientValidationResult,\n type PipeSecurityStatus,\n} from './pipe-security.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:ipc-server' });\n\nexport interface DaemonStatusSnapshot extends DaemonStatusBase {\n connectedApps: ConnectedApp[];\n}\n\nexport interface IpcServerOptions {\n validateClient?: (metadata: ConnectedAppMetadata) => Promise<ClientValidationResult>;\n verifyPipeSecurity?: (ipcPath: string) => Promise<PipeSecurityStatus>;\n getAuthStatus?: () => DaemonAuthStatus;\n triggerReauth?: () => Promise<{ portalUrl: string | null; browserOpened: boolean; status: DaemonAuthStatus }>;\n}\n\nexport class IpcServer {\n private server?: net.Server;\n private readonly connections = new Map<string, Connection>();\n private readonly connectionRegistry = new ConnectionRegistry();\n toolContext?: MeshToolContext;\n\n constructor(\n private readonly ipcPath: string,\n private readonly state: DaemonState,\n private readonly options: IpcServerOptions = {},\n ) {}\n\n async start(): Promise<void> {\n if (this.server) {\n return;\n }\n\n if (process.platform !== 'win32') {\n await rm(this.ipcPath, { force: true });\n }\n\n const server = net.createServer((socket) => {\n this.handleConnection(socket);\n });\n\n await new Promise<void>((resolvePromise, reject) => {\n server.once('error', reject);\n if (process.platform === 'win32') {\n server.listen(this.ipcPath, () => {\n server.off('error', reject);\n resolvePromise();\n });\n return;\n }\n\n server.listen({ path: this.ipcPath, readableAll: false, writableAll: false }, () => {\n server.off('error', reject);\n resolvePromise();\n });\n });\n\n if (process.platform !== 'win32') {\n await chmod(this.ipcPath, 0o600);\n logger.debug({ ipcPath: this.ipcPath }, 'IPC socket permissions set to 0600 for local-user isolation.');\n } else {\n await this.logPipeSecurity();\n }\n\n server.on('error', (error) => {\n logger.error({ err: error }, 'IPC server error.');\n });\n this.server = server;\n }\n\n async stop(): Promise<void> {\n const server = this.server;\n if (!server) {\n return;\n }\n\n this.server = undefined;\n for (const connection of [...this.connections.values()]) {\n connection.close();\n }\n\n await new Promise<void>((resolvePromise, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolvePromise();\n });\n });\n\n if (process.platform !== 'win32') {\n await rm(this.ipcPath, { force: true });\n }\n }\n\n getConnectedApps(): ConnectedApp[] {\n return this.connectionRegistry.getConnectedApps();\n }\n\n getStatus(): DaemonStatusSnapshot {\n return {\n ...this.state.getStatusBase(),\n connectedApps: this.getConnectedApps(),\n };\n }\n\n getAuthStatus(): DaemonAuthStatus {\n return this.options.getAuthStatus?.() ?? {\n authMode: this.state.authProvider.mode,\n authenticated: this.state.authProvider.isAuthenticated(),\n state: this.state.authProvider.isAuthenticated() ? 'authenticated' : 'reauth_required',\n address: this.state.authProvider.isAuthenticated() ? this.state.address : null,\n expiresAt: null,\n expiresInMs: null,\n refreshAvailable: false,\n lastError: null,\n updatedAt: Date.now(),\n };\n }\n\n notifyAuthStatusChanged(status = this.getAuthStatus()): void {\n for (const connection of this.connections.values()) {\n connection.sendNotification('auth.status_changed', status);\n }\n }\n\n /**\n * Broadcast a notification to all connected MCP sessions.\n * Used for provider inbound task notifications and other system-wide events.\n */\n broadcastNotification(method: string, params?: unknown): void {\n for (const connection of this.connections.values()) {\n connection.sendNotification(method, params);\n }\n }\n\n /**\n * Look up the low-level MCP Server for a connected app by name.\n * Throws if multiple connections match (ambiguous).\n * Returns undefined if no match is found.\n */\n getMcpServerForApp(appName: string): Server | undefined {\n const matches: Connection[] = [];\n for (const connection of this.connections.values()) {\n if (connection.connectedAppName === appName) {\n matches.push(connection);\n }\n }\n\n if (matches.length > 1) {\n throw new Error(\n `Ambiguous MCP sampling target: ${matches.length} connections match appName \"${appName}\". ` +\n 'Use a more specific identifier or disconnect duplicate clients.',\n );\n }\n\n return matches[0]?.mcpServer;\n }\n\n private handleConnection(socket: net.Socket): void {\n logger.info({ ipcPath: this.ipcPath }, 'Received IPC connection attempt.');\n\n const connection = new Connection(socket, this.state, {\n getStatus: () => this.getStatus(),\n getAuthStatus: () => this.getAuthStatus(),\n triggerReauth: () => this.options.triggerReauth?.() ?? Promise.resolve({ portalUrl: null, browserOpened: false, status: this.getAuthStatus() }),\n validateClient: (metadata) => this.validateClient(metadata),\n toolContext: this.toolContext,\n onHello: (metadata) => {\n this.connectionRegistry.updateConnection(connection.id, metadata);\n },\n onClose: () => {\n this.connections.delete(connection.id);\n this.connectionRegistry.unregisterConnection(connection.id);\n },\n });\n\n this.connections.set(connection.id, connection);\n this.connectionRegistry.registerConnection(connection.id, connection.connectedAt);\n }\n\n private async logPipeSecurity(): Promise<void> {\n try {\n const inspectPipeSecurity = this.options.verifyPipeSecurity ?? verifyPipeSecurity;\n const status = await inspectPipeSecurity(this.ipcPath);\n const bindings = {\n ipcPath: this.ipcPath,\n userScoped: status.userScoped,\n aclVerified: status.aclVerified,\n owner: status.acl?.owner,\n identities: status.acl?.identities,\n };\n\n if (!status.userScoped) {\n logger.warn(bindings, status.note);\n return;\n }\n\n if (!status.aclVerified) {\n logger.debug(bindings, status.note);\n return;\n }\n\n logger.info(bindings, status.note);\n } catch (error) {\n logger.warn({ err: error, ipcPath: this.ipcPath }, 'Failed to inspect Windows pipe security.');\n }\n }\n\n private async validateClient(metadata: ConnectedAppMetadata): Promise<ClientValidationResult> {\n if (process.platform !== 'win32') {\n return {\n allowed: true,\n source: 'unix-socket',\n };\n }\n\n const validateClientProcess = this.options.validateClient ?? ((client) => validateClientProcessOwnership(client.appPid));\n const validation = await validateClientProcess(metadata);\n if (!validation.allowed) {\n logger.warn(\n {\n ipcPath: this.ipcPath,\n appName: metadata.appName,\n appPid: metadata.appPid,\n expectedUser: validation.expectedUser,\n actualUser: validation.actualUser,\n reason: validation.reason,\n },\n 'Rejected IPC client during Windows identity validation.',\n );\n }\n\n return validation;\n }\n}\n","import { createRequire } from 'node:module';\nimport { randomUUID } from 'node:crypto';\nimport net from 'node:net';\n\nimport pino from 'pino';\n\nconst require = createRequire(import.meta.url);\nconst { version: DAEMON_VERSION } = require('../../package.json') as { version: string };\n\nimport { logAuditEvent } from '../audit.js';\nimport type { DaemonAuthStatus } from '../auth/session-monitor.js';\nimport { McpSession, type McpSessionStatus } from '../mcp/session.js';\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { MeshToolContext } from '@hivemind-os/collective-mcp-server';\nimport type { DaemonState } from '../state.js';\nimport type { ConnectedAppMetadata } from './connection-registry.js';\nimport type { ClientValidationResult } from './pipe-security.js';\nimport {\n createErrorResponse,\n isJsonRpcNotification,\n isJsonRpcRequest,\n parseMessage,\n serializeResponse,\n type JsonRpcMessage,\n} from './protocol.js';\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:connection' });\n\ninterface ConnectionOptions {\n getStatus: () => McpSessionStatus;\n getAuthStatus: () => DaemonAuthStatus;\n triggerReauth: () => Promise<{ portalUrl: string | null; browserOpened: boolean; status: DaemonAuthStatus }>;\n validateClient: (metadata: ConnectedAppMetadata) => Promise<ClientValidationResult>;\n toolContext?: MeshToolContext;\n onHello: (metadata: ConnectedAppMetadata) => void;\n onClose: () => void;\n}\n\nexport class Connection {\n readonly id = randomUUID();\n readonly connectedAt = Date.now();\n\n /** The app name set during shim_hello handshake, or undefined if not yet received. */\n get connectedAppName(): string | undefined {\n return this.appName;\n }\n\n /** The low-level MCP Server for this connection (for sampling requests). */\n get mcpServer(): Server {\n return this.session.mcpServer;\n }\n\n private appName?: string;\n private appPid?: number;\n private profile?: string;\n private readonly session: McpSession;\n private readonly sessionReady: Promise<void>;\n private buffer = '';\n private helloReceived = false;\n private closed = false;\n\n constructor(\n private readonly socket: net.Socket,\n private readonly state: DaemonState,\n private readonly options: ConnectionOptions,\n ) {\n this.socket.setEncoding('utf8');\n this.socket.setNoDelay(true);\n this.session = new McpSession({\n state: this.state,\n emit: async (message) => {\n this.sendMessage(message);\n },\n getStatus: this.options.getStatus,\n getAppName: () => this.appName ?? 'unknown',\n toolContext: this.options.toolContext,\n });\n this.sessionReady = this.session.initialize();\n this.socket.on('data', (chunk: string | Buffer) => {\n this.buffer += chunk.toString();\n this.drainBuffer();\n });\n this.socket.on('close', () => {\n this.close();\n });\n this.socket.on('end', () => {\n this.close();\n });\n this.socket.on('error', (error) => {\n logger.debug({ err: error, connectionId: this.id }, 'Socket error.');\n this.close();\n });\n }\n\n private drainBuffer(): void {\n let newlineIndex = this.buffer.indexOf('\\n');\n while (newlineIndex >= 0) {\n const line = this.buffer.slice(0, newlineIndex).trim();\n this.buffer = this.buffer.slice(newlineIndex + 1);\n\n if (line) {\n const message = parseMessage(line);\n if (!message) {\n this.sendMessage(createErrorResponse(null, -32700, 'Parse error'));\n } else {\n void this.handleMessage(message).catch((error) => {\n logger.error({ err: error, connectionId: this.id }, 'Failed to handle IPC message.');\n if (isJsonRpcRequest(message)) {\n this.sendMessage(createErrorResponse(message.id, -32603, 'Internal error'));\n }\n });\n }\n }\n\n newlineIndex = this.buffer.indexOf('\\n');\n }\n }\n\n private async handleMessage(message: JsonRpcMessage): Promise<void> {\n if (isJsonRpcRequest(message) && message.method === 'shim_hello') {\n if (this.helloReceived) {\n this.sendMessage(createErrorResponse(message.id, -32600, 'shim_hello has already been received'));\n return;\n }\n\n await this.handleShimHello(message.id, message.params);\n return;\n }\n\n if (!this.helloReceived) {\n if (isJsonRpcRequest(message)) {\n this.sendMessage(createErrorResponse(message.id, -32000, 'Expected shim_hello as the first message'));\n }\n return;\n }\n\n if (isJsonRpcRequest(message) && message.method === 'daemon_status') {\n this.handleDaemonStatus(message.id);\n return;\n }\n\n if (isJsonRpcRequest(message) && message.method === 'auth.status') {\n this.handleAuthStatus(message.id);\n return;\n }\n\n if (isJsonRpcRequest(message) && message.method === 'auth.reauth') {\n await this.handleAuthReauth(message.id);\n return;\n }\n\n await this.handleMcpMessage(message);\n }\n\n private async handleShimHello(id: string | number, params: unknown): Promise<void> {\n if (!isRecord(params)) {\n this.sendMessage(createErrorResponse(id, -32602, 'shim_hello requires app metadata'));\n return;\n }\n\n const appPid = readPid(params.pid ?? params.appPid);\n const appName = readString(params.appName) ?? readString(params.clientName) ?? inferAppName(appPid);\n const profile = readString(params.profile);\n if (!appName || appPid === undefined) {\n this.sendMessage(createErrorResponse(id, -32602, 'shim_hello requires appName and pid'));\n return;\n }\n\n const validation = await this.options.validateClient({\n appName,\n appPid,\n profile,\n });\n if (!validation.allowed) {\n logger.warn(\n {\n connectionId: this.id,\n appName,\n appPid,\n expectedUser: validation.expectedUser,\n actualUser: validation.actualUser,\n reason: validation.reason,\n },\n 'IPC client validation failed.',\n );\n this.rejectAndClose(id, validation.reason ?? 'IPC client validation failed.');\n return;\n }\n\n this.appName = appName;\n this.appPid = appPid;\n this.profile = profile;\n this.helloReceived = true;\n this.options.onHello({\n appName: this.appName,\n appPid: this.appPid,\n profile: this.profile,\n });\n logAuditEvent({\n event: 'app_connected',\n appName: this.appName,\n appPid: this.appPid,\n connectionId: this.id,\n });\n\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result: {\n acknowledged: true,\n connectionId: this.id,\n daemonVersion: DAEMON_VERSION,\n },\n });\n }\n\n private handleDaemonStatus(id: string | number): void {\n const status = this.options.getStatus();\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result: {\n did: status.did,\n uptime: status.uptime,\n connectedApps: status.connectedApps.map((app) => ({\n appName: app.appName,\n connectedAt: app.connectedAt,\n })),\n spendingToday: status.spendingToday,\n providerRunning: status.providerRunning,\n },\n });\n }\n\n private handleAuthStatus(id: string | number): void {\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result: this.options.getAuthStatus(),\n });\n }\n\n private async handleAuthReauth(id: string | number): Promise<void> {\n const result = await this.options.triggerReauth();\n this.sendMessage({\n jsonrpc: '2.0',\n id,\n result,\n });\n }\n\n private async handleMcpMessage(message: JsonRpcMessage): Promise<void> {\n await this.sessionReady;\n\n try {\n if (isJsonRpcRequest(message)) {\n const toolCall = parseToolCall(message);\n if (toolCall) {\n logAuditEvent({\n event: 'tool_call',\n appName: this.appName ?? 'unknown',\n tool: toolCall.tool,\n taskId: toolCall.taskId,\n });\n }\n }\n\n await this.session.handleMessage(message);\n } catch (error) {\n logger.error({ err: error, connectionId: this.id }, 'MCP session error.');\n if (isJsonRpcRequest(message)) {\n this.sendMessage(createErrorResponse(message.id, -32603, 'MCP session error'));\n } else if (isJsonRpcNotification(message)) {\n this.close();\n }\n }\n }\n\n sendNotification(method: string, params?: unknown): void {\n this.sendMessage({\n jsonrpc: '2.0',\n method,\n params,\n });\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.options.onClose();\n if (this.appName) {\n logAuditEvent({\n event: 'app_disconnected',\n appName: this.appName,\n connectionId: this.id,\n duration: Date.now() - this.connectedAt,\n });\n }\n void this.session.close().catch((error) => {\n logger.debug({ err: error, connectionId: this.id }, 'Failed to close MCP session cleanly.');\n });\n if (!this.socket.destroyed && !this.socket.writableEnded) {\n this.socket.destroy();\n }\n }\n\n private rejectAndClose(id: string | number, message: string): void {\n if (this.closed || this.socket.destroyed) {\n return;\n }\n\n this.socket.end(`${serializeResponse(createErrorResponse(id, -32001, message))}\\n`);\n this.close();\n }\n\n private sendMessage(message: JsonRpcMessage): void {\n if (this.closed || this.socket.destroyed) {\n return;\n }\n\n this.socket.write(`${serializeResponse(message)}\\n`);\n }\n}\n\nfunction parseToolCall(message: { params?: unknown; method: string }): { tool: string; taskId?: string } | null {\n if (message.method !== 'tools/call' || !isRecord(message.params) || typeof message.params.name !== 'string') {\n return null;\n }\n\n return {\n tool: message.params.name,\n taskId: readTaskId(message.params.arguments),\n };\n}\n\nfunction readTaskId(value: unknown): string | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return readString(value.taskId) ?? readString(value.task_id);\n}\n\nfunction readPid(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\nfunction inferAppName(pid?: number): string | undefined {\n return typeof pid === 'number' ? `app-${pid}` : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n","import pino from 'pino';\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:audit' });\n\nexport type AuditEvent =\n | {\n event: 'app_connected';\n appName: string;\n appPid: number;\n connectionId: string;\n }\n | {\n event: 'app_disconnected';\n appName: string;\n connectionId: string;\n duration: number;\n }\n | {\n event: 'tool_call';\n appName: string;\n tool: string;\n taskId?: string;\n }\n | {\n event: 'spending';\n appName: string;\n amount: string;\n taskId: string;\n };\n\ntype AuditListener = (event: AuditEvent) => void;\n\nconst listeners = new Set<AuditListener>();\n\nexport function logAuditEvent(event: AuditEvent): void {\n logger.info(event);\n for (const listener of listeners) {\n listener(event);\n }\n}\n\nexport function subscribeAuditEvents(listener: AuditListener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n","import { createRequire } from 'node:module';\nimport { randomUUID } from 'node:crypto';\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {\n CallToolRequestSchema,\n GetTaskRequestSchema,\n GetTaskPayloadRequestSchema,\n ListTasksRequestSchema,\n CancelTaskRequestSchema,\n ListToolsRequestSchema,\n type CallToolResult,\n type JSONRPCMessage as SdkJsonRpcMessage,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { SessionExpiredError } from '@hivemind-os/collective-core';\nimport {\n meshToolDefinitions,\n meshToolHandlers,\n registerResourceHandlers,\n type MeshToolContext,\n} from '@hivemind-os/collective-mcp-server';\nimport { PaymentRail, TaskStatus } from '@hivemind-os/collective-types';\n\nimport { logAuditEvent } from '../audit.js';\nimport type { ConnectedApp } from '../ipc/connection-registry.js';\nimport type { JsonRpcMessage, JsonRpcResponse } from '../ipc/protocol.js';\nimport { isJsonRpcRequest } from '../ipc/protocol.js';\nimport type { DaemonState } from '../state.js';\nimport { McpTaskStore, type McpTaskEntry, type McpTaskStatus } from './task-store.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: DAEMON_VERSION } = require('../../package.json') as { version: string };\n\nclass IpcTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage) => void;\n sessionId = randomUUID();\n\n private closed = false;\n private readonly pendingResponses = new Map<string | number, (message: JsonRpcResponse) => void>();\n\n constructor(private readonly emit: (message: JsonRpcMessage) => Promise<void> | void) {}\n\n async start(): Promise<void> {\n return;\n }\n\n async send(message: SdkJsonRpcMessage): Promise<void> {\n const jsonRpcMessage = message as unknown as JsonRpcMessage;\n if (isJsonRpcResponse(jsonRpcMessage) && jsonRpcMessage.id !== null) {\n this.pendingResponses.get(jsonRpcMessage.id)?.(jsonRpcMessage);\n this.pendingResponses.delete(jsonRpcMessage.id);\n }\n\n await this.emit(jsonRpcMessage);\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.pendingResponses.clear();\n this.onclose?.();\n }\n\n async dispatch(message: JsonRpcMessage): Promise<void> {\n if (this.closed) {\n throw new Error('Transport is closed.');\n }\n\n this.onmessage?.(message as unknown as SdkJsonRpcMessage);\n }\n\n waitForResponse(id: string | number): Promise<JsonRpcResponse> {\n return new Promise((resolvePromise) => {\n this.pendingResponses.set(id, resolvePromise);\n });\n }\n}\n\nexport interface McpSessionStatus {\n did: string;\n address: string;\n uptime: number;\n connectedApps: ConnectedApp[];\n spendingToday: string;\n providerRunning: boolean;\n}\n\nexport class McpSession {\n private readonly server: Server;\n private readonly transport: IpcTransport;\n private readonly state: DaemonState;\n private readonly getStatus: () => McpSessionStatus;\n private readonly getAppName: () => string;\n private readonly toolContext?: MeshToolContext;\n private readonly taskStore = new McpTaskStore();\n private initializePromise?: Promise<void>;\n\n constructor(params: {\n state: DaemonState;\n emit: (message: JsonRpcMessage) => Promise<void> | void;\n getStatus: () => McpSessionStatus;\n getAppName: () => string;\n toolContext?: MeshToolContext;\n }) {\n this.state = params.state;\n this.getStatus = params.getStatus;\n this.getAppName = params.getAppName;\n this.toolContext = params.toolContext;\n this.server = new Server(\n { name: '@hivemind-os/collective-daemon', version: DAEMON_VERSION },\n {\n capabilities: {\n tools: {},\n tasks: {},\n ...(params.toolContext ? { resources: {} } : {}),\n },\n },\n );\n this.transport = new IpcTransport(params.emit);\n }\n\n async initialize(): Promise<void> {\n if (this.initializePromise) {\n await this.initializePromise;\n return;\n }\n\n this.registerTools();\n this.initializePromise = this.server.connect(this.transport);\n await this.initializePromise;\n }\n\n async handleMessage(message: JsonRpcMessage): Promise<JsonRpcResponse | null> {\n if (isJsonRpcRequest(message)) {\n const responsePromise = this.transport.waitForResponse(message.id);\n await this.transport.dispatch(message);\n return responsePromise;\n }\n\n await this.transport.dispatch(message);\n return null;\n }\n\n evaluateSpending(request: { amountMist: bigint; rail: PaymentRail; appId?: string }) {\n return this.state.spendingPolicy.evaluate({\n ...request,\n originAppName: this.getAppName(),\n });\n }\n\n recordSpending(entry: { amountMist: bigint; rail: PaymentRail; taskId: string; appId?: string }): void {\n const appName = this.getAppName();\n logAuditEvent({\n event: 'spending',\n appName,\n amount: entry.amountMist.toString(),\n taskId: entry.taskId,\n });\n this.state.spendingPolicy.record({\n ...entry,\n originAppName: appName,\n });\n }\n\n async close(): Promise<void> {\n this.taskStore.cleanup();\n await this.server.close();\n }\n\n /** Expose the low-level MCP Server for sampling requests. */\n get mcpServer(): Server {\n return this.server;\n }\n\n /** Get the per-session MCP task store. */\n getTaskStore(): McpTaskStore {\n return this.taskStore;\n }\n\n /** Send a progress notification to the connected client. */\n async sendProgress(progressToken: string | number, progress: number, total?: number, message?: string): Promise<void> {\n await this.server.notification({\n method: 'notifications/progress',\n params: { progressToken, progress, total, message },\n });\n }\n\n /** Send a task status notification to the connected client. */\n async sendTaskStatusNotification(entry: McpTaskEntry): Promise<void> {\n await this.server.notification({\n method: 'notifications/tasks/status',\n params: {\n taskId: entry.taskId,\n status: entry.status,\n ttl: entry.ttl,\n createdAt: entry.createdAt,\n lastUpdatedAt: entry.lastUpdatedAt,\n ...(entry.pollInterval !== undefined ? { pollInterval: entry.pollInterval } : {}),\n ...(entry.statusMessage !== undefined ? { statusMessage: entry.statusMessage } : {}),\n },\n });\n }\n\n private registerTools(): void {\n const daemonToolDefs = [\n {\n name: 'collective_balance',\n description: 'Return the daemon wallet SUI balance, address, and DID.',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'collective_status',\n description: 'Return daemon identity, uptime, and connected apps.',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n ];\n\n const daemonToolHandlers: Record<string, () => Promise<unknown>> = {\n collective_balance: async () => {\n const balanceMist = await this.state.suiClient.getBalance(this.state.address);\n return {\n did: this.state.did,\n address: this.state.address,\n balanceMist: balanceMist.toString(),\n };\n },\n collective_status: async () => {\n const status = this.getStatus();\n return {\n ...status,\n connectedApps: status.connectedApps.map((app) => ({ ...app, pid: app.appPid })),\n };\n },\n };\n\n // Merge: daemon-specific tools + mcp-server tools (skip mcp-server's collective_balance)\n const allToolDefs = [\n ...daemonToolDefs,\n ...meshToolDefinitions.filter((def) => !daemonToolHandlers[def.name]).map((def) => {\n // Annotate collective_execute with task support hint for task-capable clients\n if (def.name === 'collective_execute') {\n return { ...def, execution: { taskSupport: 'optional' as const } };\n }\n return def;\n }),\n ];\n\n const context = this.toolContext;\n\n this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: allToolDefs,\n }));\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n const meta = request.params._meta as Record<string, unknown> | undefined;\n const progressToken = meta?.progressToken as string | number | undefined;\n\n // Daemon-specific handlers\n const daemonHandler = daemonToolHandlers[toolName];\n if (daemonHandler) {\n try {\n const result = await daemonHandler();\n return createDaemonToolResult(result as Record<string, unknown>);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error.message : String(error));\n }\n }\n\n // mcp-server handlers\n const meshHandler = meshToolHandlers[toolName];\n if (meshHandler && context) {\n // For collective_execute: use MCP Tasks (async) only if the client advertises tasks support;\n // otherwise default to blocking (standard CallToolResult) for maximum compatibility.\n if (toolName === 'collective_execute' && this.clientSupportsTasks()) {\n try {\n return await this.handleExecuteAsTask(request.params.arguments as Record<string, unknown>, context, progressToken);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return createErrorResult(message);\n }\n }\n\n try {\n const callContext = { ...context, originAppName: this.getAppName() };\n const result = await meshHandler((request.params.arguments ?? {}) as never, callContext);\n return createSuccessResult(result);\n } catch (error) {\n const message =\n error instanceof SessionExpiredError\n ? 'Authentication expired. Please re-authenticate via the daemon portal.'\n : error instanceof Error\n ? error.message\n : String(error);\n return createErrorResult(message);\n }\n }\n\n return createErrorResult(`Unknown tool: ${toolName}`);\n });\n\n // Register MCP task protocol handlers\n this.registerTaskHandlers();\n\n // Register resource handlers (capabilities, wallet, agent, task resources)\n if (context) {\n registerResourceHandlers(this.server, context);\n }\n }\n\n /**\n * Check whether the connected client advertises MCP Tasks support.\n * Only VS Code Copilot (as of 2025-11-25 spec) does this; Claude Desktop,\n * ChatGPT, Cursor, Windsurf, and GH Coding Agent do not.\n */\n private clientSupportsTasks(): boolean {\n const caps = this.server.getClientCapabilities();\n return caps?.tasks != null;\n }\n\n /**\n * Handle collective_execute as an MCP Task: post the on-chain task, return immediately\n * with a task handle, and track completion in the background.\n */\n private async handleExecuteAsTask(\n args: Record<string, unknown>,\n context: MeshToolContext,\n progressToken?: string | number,\n ): Promise<{ task: McpTaskEntry } & Record<string, unknown>> {\n const callContext = { ...context, originAppName: this.getAppName() };\n const executeAsyncHandler = meshToolHandlers['collective_execute_async'];\n if (!executeAsyncHandler) {\n throw new Error('collective_execute_async handler not found');\n }\n\n // Post the task on chain (calls prepareMeshExecution under the hood)\n const asyncResult = await executeAsyncHandler(args as never, callContext) as {\n task_id: string;\n provider_did: string;\n price_mist: string;\n status: string;\n };\n\n // Create an MCP task entry tracking this on-chain task\n const mcpTask = this.taskStore.create(asyncResult.task_id, {\n progressToken,\n pollInterval: 2_000,\n });\n\n // Launch background completion tracker\n void this.trackTaskCompletion(mcpTask.taskId, asyncResult.task_id, callContext, {\n providerDid: asyncResult.provider_did,\n priceMist: BigInt(asyncResult.price_mist),\n });\n\n // Return MCP CreateTaskResult shape\n return {\n task: mcpTask,\n };\n }\n\n /**\n * Background loop that polls on-chain task status and sends notifications.\n */\n private async trackTaskCompletion(\n mcpTaskId: string,\n onChainTaskId: string,\n context: MeshToolContext,\n params: { providerDid: string; priceMist: bigint },\n ): Promise<void> {\n const POLL_INTERVAL_MS = 2_000;\n const MAX_DURATION_MS = 300_000; // 5 minutes max\n const startedAt = Date.now();\n let lastChainStatus: number | undefined;\n\n const entry = this.taskStore.get(mcpTaskId);\n const progressToken = entry?.progressToken;\n\n try {\n while (true) {\n if (Date.now() - startedAt > MAX_DURATION_MS) {\n this.taskStore.update(mcpTaskId, 'failed', { statusMessage: 'Timed out waiting for provider' });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n const task = await context.taskClient.getTask(onChainTaskId);\n if (!task) {\n this.taskStore.update(mcpTaskId, 'failed', { statusMessage: 'Task not found on chain' });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n // Send progress notifications on state transitions\n if (task.status !== lastChainStatus) {\n lastChainStatus = task.status;\n if (progressToken !== undefined) {\n await this.emitProgressForChainStatus(progressToken, task.status);\n }\n }\n\n // Check for cancellation by client\n const currentEntry = this.taskStore.get(mcpTaskId);\n if (!currentEntry || currentEntry.status === 'cancelled') {\n return;\n }\n\n if (task.status === TaskStatus.COMPLETED || task.status === TaskStatus.RELEASED) {\n // Fetch result and release payment\n let resultText = '';\n if (task.resultBlobId) {\n const resultBytes = await context.blobStore.fetch(task.resultBlobId);\n if (resultBytes) {\n resultText = new TextDecoder().decode(resultBytes);\n }\n }\n\n if (task.status === TaskStatus.COMPLETED) {\n await context.taskClient.releasePayment({\n taskId: onChainTaskId,\n keypair: context.keypair,\n });\n context.spendingPolicy.record({\n amountMist: params.priceMist,\n rail: PaymentRail.SUI_ESCROW,\n taskId: onChainTaskId,\n appId: params.providerDid,\n originAppName: context.originAppName,\n });\n }\n\n const toolResult: CallToolResult = {\n content: [{\n type: 'text',\n text: serialize({\n task_id: onChainTaskId,\n result: resultText,\n provider_did: params.providerDid,\n price_mist: params.priceMist.toString(),\n status: 'RELEASED',\n execution_mode: 'async',\n payment_rail: PaymentRail.SUI_ESCROW,\n }),\n }],\n };\n\n this.taskStore.update(mcpTaskId, 'completed', { result: toolResult });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n if (task.status === TaskStatus.CANCELLED || task.status === TaskStatus.DISPUTED) {\n this.taskStore.update(mcpTaskId, 'failed', {\n statusMessage: `Task ended with status ${TaskStatus[task.status]}`,\n });\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n return;\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.taskStore.update(mcpTaskId, 'failed', { statusMessage: message });\n try {\n await this.sendTaskStatusNotification(this.taskStore.get(mcpTaskId)!);\n } catch {\n // notification send may fail if connection closed\n }\n }\n }\n\n private async emitProgressForChainStatus(progressToken: string | number, chainStatus: number): Promise<void> {\n const stages: Record<number, { progress: number; message: string }> = {\n [TaskStatus.POSTED]: { progress: 0.25, message: 'Escrow posted, waiting for provider' },\n [TaskStatus.ACCEPTED]: { progress: 0.5, message: 'Task accepted by provider' },\n [TaskStatus.COMPLETED]: { progress: 0.9, message: 'Provider completed, verifying result' },\n [TaskStatus.RELEASED]: { progress: 1, message: 'Payment released, task complete' },\n };\n\n const stage = stages[chainStatus];\n if (stage) {\n try {\n await this.sendProgress(progressToken, stage.progress, 1, stage.message);\n } catch {\n // ignore send failures\n }\n }\n }\n\n private registerTaskHandlers(): void {\n // tasks/get — return current task status\n this.server.setRequestHandler(GetTaskRequestSchema, async (request) => {\n const entry = this.taskStore.get(request.params.taskId);\n if (!entry) {\n throw new Error(`Task ${request.params.taskId} not found`);\n }\n return toTaskResult(entry);\n });\n\n // tasks/result — return the completed result\n this.server.setRequestHandler(GetTaskPayloadRequestSchema, async (request) => {\n const entry = this.taskStore.get(request.params.taskId);\n if (!entry) {\n throw new Error(`Task ${request.params.taskId} not found`);\n }\n if (entry.status !== 'completed' || !entry.result) {\n throw new Error(`Task ${request.params.taskId} is not yet completed (status: ${entry.status})`);\n }\n return entry.result;\n });\n\n // tasks/list — return all tasks for this session\n this.server.setRequestHandler(ListTasksRequestSchema, async () => {\n const tasks = this.taskStore.list().map((entry) => toTaskResult(entry));\n return { tasks };\n });\n\n // tasks/cancel — cancel a task, trigger on-chain cancel if possible\n this.server.setRequestHandler(CancelTaskRequestSchema, async (request) => {\n const entry = this.taskStore.get(request.params.taskId);\n if (!entry) {\n throw new Error(`Task ${request.params.taskId} not found`);\n }\n\n if (entry.status === 'completed' || entry.status === 'failed' || entry.status === 'cancelled') {\n return toTaskResult(entry);\n }\n\n // Attempt on-chain cancellation\n if (this.toolContext) {\n try {\n const chainTask = await this.toolContext.taskClient.getTask(entry.onChainTaskId);\n if (chainTask) {\n if (chainTask.status === TaskStatus.POSTED) {\n await this.toolContext.taskClient.cancelTask({\n taskId: entry.onChainTaskId,\n keypair: this.toolContext.keypair,\n });\n } else if (chainTask.status === TaskStatus.ACCEPTED) {\n await this.toolContext.taskClient.disputeTask({\n taskId: entry.onChainTaskId,\n keypair: this.toolContext.keypair,\n });\n }\n }\n } catch {\n // Chain cancellation is best-effort\n }\n }\n\n const cancelled = this.taskStore.cancel(request.params.taskId);\n return toTaskResult(cancelled ?? entry);\n });\n }\n}\n\nfunction createDaemonToolResult(payload: Record<string, unknown>): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: Record<string, unknown>;\n} {\n return {\n content: [{ type: 'text', text: serialize(payload) }],\n structuredContent: payload,\n };\n}\n\nfunction createSuccessResult(payload: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n} {\n return {\n content: [{ type: 'text', text: serialize(payload) }],\n };\n}\n\nfunction createErrorResult(message: string): {\n isError: true;\n content: Array<{ type: 'text'; text: string }>;\n} {\n return {\n isError: true,\n content: [{ type: 'text', text: serialize({ error: message }) }],\n };\n}\n\nfunction toTaskResult(entry: McpTaskEntry): {\n taskId: string;\n status: McpTaskStatus;\n ttl: number | null;\n createdAt: string;\n lastUpdatedAt: string;\n pollInterval?: number;\n statusMessage?: string;\n} {\n return {\n taskId: entry.taskId,\n status: entry.status,\n ttl: entry.ttl,\n createdAt: entry.createdAt,\n lastUpdatedAt: entry.lastUpdatedAt,\n ...(entry.pollInterval !== undefined ? { pollInterval: entry.pollInterval } : {}),\n ...(entry.statusMessage !== undefined ? { statusMessage: entry.statusMessage } : {}),\n };\n}\n\nfunction serialize(payload: unknown): string {\n return JSON.stringify(payload, bigintReplacer, 2);\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === 'bigint' ? value.toString() : value;\n}\n\nfunction isJsonRpcResponse(message: JsonRpcMessage): message is JsonRpcResponse {\n return !('method' in message);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolvePromise) => {\n setTimeout(resolvePromise, ms);\n });\n}\n","export interface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: '2.0';\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport function parseMessage(line: string): JsonRpcMessage | null {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (!parsed || parsed.jsonrpc !== '2.0') {\n return null;\n }\n\n if (typeof parsed.method === 'string') {\n if ('id' in parsed) {\n if (typeof parsed.id !== 'string' && typeof parsed.id !== 'number') {\n return null;\n }\n\n return {\n jsonrpc: '2.0',\n id: parsed.id,\n method: parsed.method,\n params: parsed.params,\n } satisfies JsonRpcRequest;\n }\n\n return {\n jsonrpc: '2.0',\n method: parsed.method,\n params: parsed.params,\n } satisfies JsonRpcNotification;\n }\n\n if ('id' in parsed && (typeof parsed.id === 'string' || typeof parsed.id === 'number' || parsed.id === null)) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id: parsed.id as JsonRpcResponse['id'],\n };\n\n if ('result' in parsed) {\n response.result = parsed.result;\n }\n\n if ('error' in parsed) {\n const error = parsed.error;\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const code = (error as Record<string, unknown>).code;\n const message = (error as Record<string, unknown>).message;\n if (typeof code !== 'number' || typeof message !== 'string') {\n return null;\n }\n\n response.error = {\n code,\n message,\n data: (error as Record<string, unknown>).data,\n };\n }\n\n if (!('result' in parsed) && !('error' in parsed)) {\n return null;\n }\n\n return response;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function serializeResponse(response: JsonRpcMessage): string {\n return JSON.stringify(response);\n}\n\nexport function createErrorResponse(\n id: string | number | null,\n code: number,\n message: string,\n data?: unknown,\n): JsonRpcResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: { code, message, data },\n };\n}\n\nexport function isJsonRpcRequest(message: JsonRpcMessage): message is JsonRpcRequest {\n return 'method' in message && 'id' in message;\n}\n\nexport function isJsonRpcNotification(message: JsonRpcMessage): message is JsonRpcNotification {\n return 'method' in message && !('id' in message);\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport type McpTaskStatus = 'working' | 'input_required' | 'completed' | 'failed' | 'cancelled';\n\nexport interface McpTaskEntry {\n taskId: string;\n onChainTaskId: string;\n status: McpTaskStatus;\n statusMessage?: string;\n createdAt: string;\n lastUpdatedAt: string;\n ttl: number | null;\n pollInterval?: number;\n result?: CallToolResult;\n progressToken?: string | number;\n}\n\nconst DEFAULT_TTL_MS = 3_600_000; // 1 hour\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\n\n/**\n * Per-session in-memory store mapping MCP task IDs to on-chain task IDs.\n * Tracks lifecycle state for each task and enables MCP task protocol support.\n */\nexport class McpTaskStore {\n private readonly tasks = new Map<string, McpTaskEntry>();\n private readonly chainToMcpId = new Map<string, string>();\n private readonly cleanupTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n create(onChainTaskId: string, options?: { ttl?: number | null; pollInterval?: number; progressToken?: string | number }): McpTaskEntry {\n const taskId = randomUUID();\n const now = new Date().toISOString();\n const ttl = options?.ttl !== undefined ? options.ttl : DEFAULT_TTL_MS;\n\n const entry: McpTaskEntry = {\n taskId,\n onChainTaskId,\n status: 'working',\n createdAt: now,\n lastUpdatedAt: now,\n ttl,\n pollInterval: options?.pollInterval ?? DEFAULT_POLL_INTERVAL_MS,\n progressToken: options?.progressToken,\n };\n\n this.tasks.set(taskId, entry);\n this.chainToMcpId.set(onChainTaskId, taskId);\n this.scheduleCleanup(entry);\n return entry;\n }\n\n get(taskId: string): McpTaskEntry | undefined {\n return this.tasks.get(taskId);\n }\n\n getByChainId(onChainTaskId: string): McpTaskEntry | undefined {\n const mcpId = this.chainToMcpId.get(onChainTaskId);\n return mcpId ? this.tasks.get(mcpId) : undefined;\n }\n\n update(taskId: string, status: McpTaskStatus, options?: { statusMessage?: string; result?: CallToolResult }): McpTaskEntry | undefined {\n const entry = this.tasks.get(taskId);\n if (!entry) {\n return undefined;\n }\n\n entry.status = status;\n entry.lastUpdatedAt = new Date().toISOString();\n if (options?.statusMessage !== undefined) {\n entry.statusMessage = options.statusMessage;\n }\n if (options?.result !== undefined) {\n entry.result = options.result;\n }\n\n // Reschedule cleanup from now on terminal states\n if (status === 'completed' || status === 'failed' || status === 'cancelled') {\n this.scheduleCleanup(entry);\n }\n\n return entry;\n }\n\n cancel(taskId: string): McpTaskEntry | undefined {\n return this.update(taskId, 'cancelled', { statusMessage: 'Cancelled by client' });\n }\n\n list(): McpTaskEntry[] {\n return [...this.tasks.values()];\n }\n\n cleanup(): void {\n for (const timer of this.cleanupTimers.values()) {\n clearTimeout(timer);\n }\n this.cleanupTimers.clear();\n this.tasks.clear();\n this.chainToMcpId.clear();\n }\n\n private scheduleCleanup(entry: McpTaskEntry): void {\n if (entry.ttl === null) {\n return;\n }\n\n const existing = this.cleanupTimers.get(entry.taskId);\n if (existing) {\n clearTimeout(existing);\n }\n\n const timer = setTimeout(() => {\n this.tasks.delete(entry.taskId);\n this.chainToMcpId.delete(entry.onChainTaskId);\n this.cleanupTimers.delete(entry.taskId);\n }, entry.ttl);\n\n // Don't keep the process alive for cleanup timers\n if (typeof timer === 'object' && 'unref' in timer) {\n timer.unref();\n }\n\n this.cleanupTimers.set(entry.taskId, timer);\n }\n}\n","export interface ConnectedApp {\n connectionId: string;\n appName: string;\n appPid: number;\n profile?: string;\n connectedAt: number;\n}\n\nexport interface ConnectedAppMetadata {\n appName: string;\n appPid: number;\n profile?: string;\n}\n\ninterface ConnectionEntry {\n connectionId: string;\n connectedAt: number;\n appName?: string;\n appPid?: number;\n profile?: string;\n}\n\nexport class ConnectionRegistry {\n private readonly connections = new Map<string, ConnectionEntry>();\n\n registerConnection(connectionId: string, connectedAt = Date.now()): void {\n this.connections.set(connectionId, {\n connectionId,\n connectedAt,\n });\n }\n\n updateConnection(connectionId: string, metadata: ConnectedAppMetadata): ConnectedApp {\n const current = this.connections.get(connectionId);\n const next: ConnectionEntry = {\n connectionId,\n connectedAt: current?.connectedAt ?? Date.now(),\n appName: metadata.appName,\n appPid: metadata.appPid,\n profile: metadata.profile,\n };\n\n this.connections.set(connectionId, next);\n return toConnectedApp(next);\n }\n\n unregisterConnection(connectionId: string): void {\n this.connections.delete(connectionId);\n }\n\n getConnectedApps(): ConnectedApp[] {\n return Array.from(this.connections.values())\n .filter(isConnectedApp)\n .map(toConnectedApp)\n .sort((left, right) => left.connectedAt - right.connectedAt);\n }\n}\n\nfunction isConnectedApp(entry: ConnectionEntry): entry is ConnectedApp {\n return typeof entry.appName === 'string' && typeof entry.appPid === 'number';\n}\n\nfunction toConnectedApp(entry: ConnectionEntry): ConnectedApp {\n if (!isConnectedApp(entry)) {\n throw new Error(`Connection ${entry.connectionId} is missing app metadata.`);\n }\n\n return {\n connectionId: entry.connectionId,\n connectedAt: entry.connectedAt,\n appName: entry.appName,\n appPid: entry.appPid,\n profile: entry.profile,\n };\n}\n"],"mappings":"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","names":["net","pino","createRequire","randomUUID","pino","randomUUID","require","randomUUID","require","createRequire","DAEMON_VERSION","logger","pino","randomUUID","logger","pino","net"]}