@akshar5/cohall 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cohall.js.map CHANGED
@@ -4,27 +4,27 @@
4
4
  "sourcesContent": [
5
5
  "import { Effect, Schema } from \"effect\"\n\ndeclare const __COHALL_VERSION__: string\nexport const version =\n typeof __COHALL_VERSION__ === \"undefined\" ? \"0.0.0-development\" : __COHALL_VERSION__\n\nexport const maxSocketPayloadBytes = 1024 * 1024\n\nconst bounded = (maxLength: number) =>\n Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(maxLength))\nconst optionalText = (maxLength: number) => Schema.String.check(Schema.isMaxLength(maxLength))\nconst boundedArray = <S extends Schema.Top>(schema: S, maxLength: number) =>\n Schema.Array(schema).check(Schema.isMaxLength(maxLength))\nconst count = Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }))\nconst uuid = <Name extends string>(name: Name) =>\n Schema.String.check(Schema.isUUID(4)).pipe(Schema.brand(name))\nconst isoTimestamp = <Name extends string>(name: Name) =>\n Schema.String.check(\n Schema.isPattern(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?Z$/, {\n expected: \"an ISO-8601 UTC timestamp\",\n }),\n ).pipe(Schema.brand(name))\n\nexport const BotId = bounded(256).pipe(Schema.brand(\"BotId\"))\nexport type BotId = typeof BotId.Type\n\nexport const Bot = Schema.Struct({\n id: BotId,\n name: bounded(128),\n description: Schema.optionalKey(optionalText(512)),\n})\nexport interface Bot extends Schema.Schema.Type<typeof Bot> {}\n\nexport const DeviceId = uuid(\"DeviceId\")\nexport type DeviceId = typeof DeviceId.Type\nexport const ThreadId = uuid(\"ThreadId\")\nexport type ThreadId = typeof ThreadId.Type\nexport const MessageId = uuid(\"MessageId\")\nexport type MessageId = typeof MessageId.Type\nexport const TaskId = uuid(\"TaskId\")\nexport type TaskId = typeof TaskId.Type\nexport const AuthSessionId = uuid(\"AuthSessionId\")\nexport type AuthSessionId = typeof AuthSessionId.Type\nexport const OperationId = uuid(\"OperationId\")\nexport type OperationId = typeof OperationId.Type\nexport const Timestamp = isoTimestamp(\"Timestamp\")\nexport type Timestamp = typeof Timestamp.Type\n\nexport const Platform = Schema.Literals([\"darwin\", \"linux\", \"windows\", \"unknown\"])\nexport type Platform = typeof Platform.Type\nexport const Provider = Schema.Literals([\"codex\", \"claude-code\", \"opencode\", \"grok-bot\"])\nexport type Provider = typeof Provider.Type\nexport const DeviceStatus = Schema.Literals([\"online\", \"busy\", \"offline\"])\nexport type DeviceStatus = typeof DeviceStatus.Type\nexport const TaskStatus = Schema.Literals([\n \"queued\",\n \"assigned\",\n \"running\",\n \"cancelling\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n])\nexport type TaskStatus = typeof TaskStatus.Type\nexport const OperationStatus = Schema.Literals([\n \"queued\",\n \"assigned\",\n \"running\",\n \"completed\",\n \"failed\",\n])\nexport type OperationStatus = typeof OperationStatus.Type\nexport const TaskTraceEventKind = Schema.Literals([...TaskStatus.literals, \"requeued\"])\nexport type TaskTraceEventKind = typeof TaskTraceEventKind.Type\nexport const MessageRole = Schema.Literals([\"human\", \"agent\", \"system\"])\nexport type MessageRole = typeof MessageRole.Type\nexport const ConnectionRole = Schema.Literals([\"client\", \"device\"])\nexport type ConnectionRole = typeof ConnectionRole.Type\n\nexport const AuthSession = Schema.Struct({\n id: AuthSessionId,\n label: bounded(128),\n role: ConnectionRole,\n createdAt: Timestamp,\n expiresAt: Timestamp,\n lastSeenAt: Timestamp,\n deviceId: Schema.optionalKey(DeviceId),\n revokedAt: Schema.optionalKey(Timestamp),\n})\nexport interface AuthSession extends Schema.Schema.Type<typeof AuthSession> {}\n\nexport const CreatePairingInput = Schema.Struct({\n label: bounded(128),\n roles: boundedArray(ConnectionRole, 2),\n})\nexport interface CreatePairingInput extends Schema.Schema.Type<typeof CreatePairingInput> {}\n\nexport const PairingCredential = Schema.Struct({\n token: bounded(256),\n expiresAt: Timestamp,\n})\nexport interface PairingCredential extends Schema.Schema.Type<typeof PairingCredential> {}\n\nexport const ExchangePairingInput = Schema.Struct({\n token: bounded(256),\n})\nexport interface ExchangePairingInput extends Schema.Schema.Type<typeof ExchangePairingInput> {}\n\nexport const SessionCredential = Schema.Struct({\n token: bounded(256),\n session: AuthSession,\n})\nexport interface SessionCredential extends Schema.Schema.Type<typeof SessionCredential> {}\n\nexport const PairingResult = Schema.Struct({\n credentials: boundedArray(SessionCredential, 2),\n})\nexport interface PairingResult extends Schema.Schema.Type<typeof PairingResult> {}\n\nexport const Capability = Schema.Struct({\n id: bounded(64),\n label: bounded(128),\n detail: Schema.optionalKey(optionalText(512)),\n})\nexport interface Capability extends Schema.Schema.Type<typeof Capability> {}\n\nexport const Workspace = Schema.Struct({\n path: bounded(4096),\n label: bounded(256),\n})\nexport interface Workspace extends Schema.Schema.Type<typeof Workspace> {}\n\nexport const Device = Schema.Struct({\n id: DeviceId,\n name: bounded(128),\n hostname: bounded(256),\n platform: Platform,\n architecture: bounded(64),\n status: DeviceStatus,\n providers: boundedArray(Provider, Provider.literals.length),\n bots: Schema.optionalKey(boundedArray(Bot, 256)),\n capabilities: boundedArray(Capability, 64),\n workspaces: boundedArray(Workspace, 64),\n version: bounded(32),\n lastSeenAt: Timestamp,\n connectedAt: Schema.optionalKey(Timestamp),\n})\nexport interface Device extends Schema.Schema.Type<typeof Device> {}\n\nexport const minimumDeviceOperationVersion = \"0.5.0\"\n\nconst parsedVersion = (value: string): readonly [number, number, number, boolean] | undefined => {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.exec(value)\n if (match === null) {\n return undefined\n }\n const core = match.slice(1, 4).map(Number)\n if (core.length !== 3 || core.some((part) => !Number.isSafeInteger(part))) {\n return undefined\n }\n return [core[0] ?? 0, core[1] ?? 0, core[2] ?? 0, match[4] !== undefined]\n}\n\nexport const supportsDeviceOperations = (candidate: string): boolean => {\n if (candidate === \"0.0.0-development\") {\n return true\n }\n const current = parsedVersion(candidate)\n const minimum = parsedVersion(minimumDeviceOperationVersion)\n if (current === undefined || minimum === undefined) {\n return false\n }\n for (let index = 0; index < 3; index += 1) {\n if (current[index] !== minimum[index]) {\n return (current[index] ?? 0) > (minimum[index] ?? 0)\n }\n }\n return !current[3]\n}\n\nexport const assertDeviceOperationSupport = (\n devices: ReadonlyArray<{ readonly name: string; readonly version: string }>,\n): void => {\n const unsupported = devices.filter((device) => !supportsDeviceOperations(device.version))\n if (unsupported.length === 0) {\n return\n }\n throw new Error(\n `All-device upgrades require Cohall ${minimumDeviceOperationVersion} or newer on every device. Upgrade individually first: ${unsupported.map((device) => `${device.name} (${device.version})`).join(\", \")}`,\n )\n}\n\nexport const Thread = Schema.Struct({\n id: ThreadId,\n title: bounded(256),\n createdAt: Timestamp,\n updatedAt: Timestamp,\n defaultDeviceId: Schema.optionalKey(DeviceId),\n})\nexport interface Thread extends Schema.Schema.Type<typeof Thread> {}\n\nexport const Message = Schema.Struct({\n id: MessageId,\n threadId: ThreadId,\n role: MessageRole,\n authorName: bounded(128),\n content: optionalText(131_072),\n createdAt: Timestamp,\n taskId: Schema.optionalKey(TaskId),\n deviceId: Schema.optionalKey(DeviceId),\n})\nexport interface Message extends Schema.Schema.Type<typeof Message> {}\n\nconst validBotTarget = (input: {\n readonly provider?: Provider\n readonly botId?: BotId\n readonly workspace?: string\n}) => {\n const provider = input.provider ?? (input.botId === undefined ? \"codex\" : \"grok-bot\")\n if (provider === \"grok-bot\" && input.workspace !== undefined) {\n return \"Grok Bots use their own computer context; omit workspace\"\n }\n return (provider === \"grok-bot\") === (input.botId !== undefined)\n ? undefined\n : \"The grok-bot provider requires botId; other providers cannot select a bot\"\n}\n\nexport const Task = Schema.Struct({\n id: TaskId,\n threadId: ThreadId,\n prompt: bounded(131_072),\n context: Schema.optionalKey(optionalText(131_072)),\n provider: Provider,\n botId: Schema.optionalKey(BotId),\n status: TaskStatus,\n sourceDeviceId: Schema.optionalKey(DeviceId),\n targetDeviceId: DeviceId,\n parentTaskId: Schema.optionalKey(TaskId),\n workspace: Schema.optionalKey(bounded(4096)),\n providerSessionId: Schema.optionalKey(bounded(4096)),\n result: Schema.optionalKey(optionalText(131_072)),\n error: Schema.optionalKey(optionalText(16_384)),\n createdAt: Timestamp,\n updatedAt: Timestamp,\n startedAt: Schema.optionalKey(Timestamp),\n completedAt: Schema.optionalKey(Timestamp),\n}).check(Schema.makeFilter(validBotTarget))\nexport interface Task extends Schema.Schema.Type<typeof Task> {}\n\nexport const taskSlot = (task: Pick<Task, \"provider\" | \"botId\">): string =>\n task.provider === \"grok-bot\" ? `grok-bot:${task.botId}` : \"cli\"\n\nconst upgradeVersion = Schema.String.check(\n Schema.isPattern(/^(?:latest|v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)$/, {\n expected: \"latest or an exact semantic version\",\n }),\n)\n\nexport const CreateUpgradeOperationsInput = Schema.Struct({\n target: upgradeVersion,\n restart: Schema.Boolean,\n})\nexport interface CreateUpgradeOperationsInput extends Schema.Schema.Type<\n typeof CreateUpgradeOperationsInput\n> {}\n\nexport const DeviceOperation = Schema.Struct({\n id: OperationId,\n kind: Schema.Literal(\"upgrade\"),\n status: OperationStatus,\n targetDeviceId: DeviceId,\n requestedVersion: upgradeVersion,\n restart: Schema.Boolean,\n result: Schema.optionalKey(optionalText(16_384)),\n error: Schema.optionalKey(optionalText(16_384)),\n createdAt: Timestamp,\n updatedAt: Timestamp,\n completedAt: Schema.optionalKey(Timestamp),\n})\nexport interface DeviceOperation extends Schema.Schema.Type<typeof DeviceOperation> {}\n\nexport const TaskStatusCounts = Schema.Struct({\n queued: count,\n assigned: count,\n running: count,\n cancelling: count,\n completed: count,\n failed: count,\n cancelled: count,\n})\nexport interface TaskStatusCounts extends Schema.Schema.Type<typeof TaskStatusCounts> {}\n\nexport const ProviderUsage = Schema.Struct({\n provider: Provider,\n tasks: count,\n})\nexport interface ProviderUsage extends Schema.Schema.Type<typeof ProviderUsage> {}\n\nexport const DeviceUsage = Schema.Struct({\n deviceId: DeviceId,\n deviceName: bounded(128),\n tasks: count,\n byStatus: TaskStatusCounts,\n byProvider: boundedArray(ProviderUsage, Provider.literals.length),\n})\nexport interface DeviceUsage extends Schema.Schema.Type<typeof DeviceUsage> {}\n\nexport const UsageSummary = Schema.Struct({\n retainedTasks: count,\n byStatus: TaskStatusCounts,\n byProvider: boundedArray(ProviderUsage, Provider.literals.length),\n devices: boundedArray(DeviceUsage, 256),\n})\nexport interface UsageSummary extends Schema.Schema.Type<typeof UsageSummary> {}\n\nexport const TaskTraceEvent = Schema.Struct({\n kind: TaskTraceEventKind,\n at: Timestamp,\n detail: Schema.optionalKey(optionalText(512)),\n})\nexport interface TaskTraceEvent extends Schema.Schema.Type<typeof TaskTraceEvent> {}\n\nexport const TaskTrace = Schema.Struct({\n taskId: TaskId,\n threadId: ThreadId,\n status: TaskStatus,\n provider: Provider,\n botId: Schema.optionalKey(BotId),\n sourceDeviceId: Schema.optionalKey(DeviceId),\n targetDevice: Device,\n parentTaskId: Schema.optionalKey(TaskId),\n workspace: Schema.optionalKey(bounded(4096)),\n createdAt: Timestamp,\n updatedAt: Timestamp,\n startedAt: Schema.optionalKey(Timestamp),\n completedAt: Schema.optionalKey(Timestamp),\n events: boundedArray(TaskTraceEvent, 100),\n truncated: Schema.Boolean,\n error: Schema.optionalKey(optionalText(16_384)),\n}).check(Schema.makeFilter(validBotTarget))\nexport interface TaskTrace extends Schema.Schema.Type<typeof TaskTrace> {}\n\nexport const ThreadContext = Schema.Struct({\n thread: Thread,\n messages: boundedArray(Message, 20),\n tasks: boundedArray(Task, 20),\n truncated: Schema.Boolean,\n})\nexport interface ThreadContext extends Schema.Schema.Type<typeof ThreadContext> {}\n\nexport const CreateTaskInput = Schema.Struct({\n threadId: Schema.optionalKey(ThreadId),\n title: Schema.optionalKey(bounded(256)),\n prompt: bounded(131_072),\n context: Schema.optionalKey(optionalText(131_072)),\n provider: Schema.optionalKey(Provider),\n botId: Schema.optionalKey(BotId),\n targetDeviceId: Schema.optionalKey(DeviceId),\n parentTaskId: Schema.optionalKey(TaskId),\n workspace: Schema.optionalKey(bounded(4096)),\n}).check(Schema.makeFilter(validBotTarget))\nexport interface CreateTaskInput extends Schema.Schema.Type<typeof CreateTaskInput> {}\n\nexport const SocketEvent = Schema.TaggedUnion({\n Authenticate: { token: bounded(256) },\n Connected: { serverVersion: bounded(32), connectedAt: Timestamp },\n DeviceHello: { device: Device },\n DeviceHeartbeat: {\n deviceId: DeviceId,\n status: DeviceStatus,\n bots: Schema.optionalKey(boundedArray(Bot, 256)),\n },\n TaskAssigned: { task: Task },\n TaskAccepted: { taskId: TaskId },\n TaskFinished: {\n taskId: TaskId,\n result: optionalText(131_072),\n providerSessionId: Schema.optionalKey(bounded(4096)),\n },\n TaskFailed: { taskId: TaskId, error: bounded(16_384) },\n TaskCancelled: { taskId: TaskId },\n TaskSettled: { taskId: TaskId },\n CancelTask: { taskId: TaskId },\n OperationAssigned: { operation: DeviceOperation },\n OperationAccepted: { operationId: OperationId },\n OperationFinished: { operationId: OperationId, result: optionalText(16_384) },\n OperationFailed: { operationId: OperationId, error: bounded(16_384) },\n OperationSettled: { operationId: OperationId },\n Error: { code: bounded(64), message: bounded(2048) },\n})\nexport type SocketEvent = typeof SocketEvent.Type\n\nexport const ErrorResponse = Schema.Struct({\n error: bounded(2048),\n})\nexport interface ErrorResponse extends Schema.Schema.Type<typeof ErrorResponse> {}\n\nexport const terminalTaskStatuses: ReadonlySet<TaskStatus> = new Set([\n \"completed\",\n \"failed\",\n \"cancelled\",\n])\nexport const isTerminalTask = (task: Task): boolean => terminalTaskStatuses.has(task.status)\nexport const now = (): Timestamp => Timestamp.make(new Date().toISOString())\nexport const makeDeviceId = (): DeviceId => DeviceId.make(crypto.randomUUID())\nexport const makeThreadId = (): ThreadId => ThreadId.make(crypto.randomUUID())\nexport const makeMessageId = (): MessageId => MessageId.make(crypto.randomUUID())\nexport const makeTaskId = (): TaskId => TaskId.make(crypto.randomUUID())\nexport const makeAuthSessionId = (): AuthSessionId => AuthSessionId.make(crypto.randomUUID())\nexport const makeOperationId = (): OperationId => OperationId.make(crypto.randomUUID())\n\nexport const decodeCreatePairingInput = Schema.decodeUnknownEffect(CreatePairingInput)\nexport const decodeExchangePairingInput = Schema.decodeUnknownEffect(ExchangePairingInput)\nexport const decodeCreateTaskInput = (input: unknown) =>\n Schema.decodeUnknownEffect(CreateTaskInput)(input).pipe(\n Effect.map(\n (task): CreateTaskInput => ({\n ...task,\n provider: task.provider ?? (task.botId === undefined ? \"codex\" : \"grok-bot\"),\n }),\n ),\n )\nexport const decodeCreateUpgradeOperationsInput = Schema.decodeUnknownEffect(\n CreateUpgradeOperationsInput,\n)\nexport const decodeDevice = Schema.decodeUnknownEffect(Device)\nexport const decodeSocketEvent = Schema.decodeUnknownEffect(SocketEvent)\n",
6
6
  "import { Effect, Schema } from \"effect\"\nimport { access, chmod, mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { homedir, platform } from \"node:os\"\nimport { join, resolve } from \"node:path\"\n\nexport const RelayConfiguration = Schema.Struct({\n host: Schema.NonEmptyString,\n port: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65_535 })),\n token: Schema.String.check(Schema.isMinLength(32)),\n dataDirectory: Schema.NonEmptyString,\n databasePath: Schema.NonEmptyString,\n allowRemote: Schema.Boolean,\n historyTaskLimit: Schema.Int.check(Schema.isBetween({ minimum: 100, maximum: 100_000 })),\n})\nexport interface RelayConfiguration extends Schema.Schema.Type<typeof RelayConfiguration> {}\n\nconst defaultDataDirectory = (): string => {\n if (platform() === \"win32\") {\n return join(process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\"), \"Cohall\")\n }\n if (platform() === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\", \"Cohall\", \"relay\")\n }\n return join(process.env.XDG_DATA_HOME ?? join(homedir(), \".local\", \"share\"), \"cohall\")\n}\n\nconst generatedToken = (): string =>\n Array.from(crypto.getRandomValues(new Uint8Array(32)), (value) =>\n value.toString(16).padStart(2, \"0\"),\n ).join(\"\")\n\nconst tokenFrom = async (path: string): Promise<string> => {\n if (\n await access(path)\n .then(() => true)\n .catch(() => false)\n ) {\n return (await readFile(path, \"utf8\")).trim()\n }\n const token = generatedToken()\n await writeFile(path, `${token}\\n`, { mode: 0o600 })\n if (platform() !== \"win32\") {\n await chmod(path, 0o600)\n }\n return token\n}\n\nconst booleanEnvironment = (name: string): boolean => {\n const value = process.env[name]\n if (value === undefined || value === \"false\" || value === \"0\") {\n return false\n }\n if (value === \"true\" || value === \"1\") {\n return true\n }\n throw new Error(`${name} must be true or false`)\n}\n\nconst isLoopback = (host: string): boolean =>\n host === \"127.0.0.1\" || host === \"localhost\" || host === \"::1\"\n\nexport const loadEnvironmentConfiguration = Effect.tryPromise({\n try: async () => {\n const host = process.env.COHALL_RELAY_HOST ?? \"127.0.0.1\"\n const port = Number(process.env.COHALL_RELAY_PORT ?? \"8787\")\n const allowRemote = booleanEnvironment(\"COHALL_RELAY_ALLOW_REMOTE\")\n if (!isLoopback(host) && !allowRemote) {\n throw new Error(\n \"Remote relay binding is disabled. Use a private network or TLS reverse proxy, then set COHALL_RELAY_ALLOW_REMOTE=true.\",\n )\n }\n const dataDirectory = resolve(process.env.COHALL_DATA_DIR ?? defaultDataDirectory())\n await mkdir(dataDirectory, { recursive: true, mode: 0o700 })\n if (platform() !== \"win32\") {\n await chmod(dataDirectory, 0o700)\n }\n const token = process.env.COHALL_TOKEN ?? (await tokenFrom(join(dataDirectory, \"owner-token\")))\n if (token.length < 32) {\n throw new Error(\"The Cohall relay owner token must be at least 32 characters\")\n }\n const historyTaskLimit = Number(process.env.COHALL_HISTORY_TASK_LIMIT ?? \"1000\")\n return Schema.decodeUnknownSync(RelayConfiguration)({\n host,\n port,\n token,\n dataDirectory,\n databasePath: join(dataDirectory, \"cohall.db\"),\n allowRemote,\n historyTaskLimit,\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n",
7
- "import type { AuthSessionId, DeviceId, SocketEvent, Timestamp } from \"@cohall/protocol\"\nimport { WebSocket } from \"ws\"\n\nexport interface ConnectionData {\n processing: Promise<void>\n stageDeadline: ReturnType<typeof setTimeout> | undefined\n preAuthFrameReceived: boolean\n queuedMessages: number\n closed: boolean\n}\n\nexport type ConnectionSocket = WebSocket & { data: ConnectionData }\n\ninterface Principal {\n readonly sessionId?: AuthSessionId\n readonly boundDeviceId?: DeviceId\n readonly expiresAt?: Timestamp\n}\n\nexport class Hub {\n readonly #principals = new Map<ConnectionSocket, Principal>()\n readonly #devices = new Map<DeviceId, ConnectionSocket>()\n readonly #deviceIds = new Map<ConnectionSocket, DeviceId>()\n readonly #sessions = new Map<AuthSessionId, ConnectionSocket>()\n readonly #ownerSockets = new Set<ConnectionSocket>()\n\n attach(socket: ConnectionSocket, principal: Principal): boolean {\n if (principal.sessionId === undefined) {\n if (this.#ownerSockets.size >= 16) {\n return false\n }\n this.#ownerSockets.add(socket)\n } else {\n const existing = this.#sessions.get(principal.sessionId)\n if (existing !== undefined && existing.readyState === WebSocket.OPEN) {\n return false\n }\n this.#sessions.set(principal.sessionId, socket)\n }\n this.#principals.set(socket, principal)\n if (socket.data.stageDeadline !== undefined) {\n clearTimeout(socket.data.stageDeadline)\n socket.data.stageDeadline = undefined\n }\n return true\n }\n\n isAuthorized(socket: ConnectionSocket): boolean {\n const principal = this.#principals.get(socket)\n if (principal === undefined) {\n return false\n }\n if (principal.expiresAt !== undefined && Date.parse(principal.expiresAt) <= Date.now()) {\n socket.close(4003, \"Session expired\")\n return false\n }\n return true\n }\n\n boundDeviceId(socket: ConnectionSocket): DeviceId | undefined {\n return this.#principals.get(socket)?.boundDeviceId\n }\n\n registerDevice(deviceId: DeviceId, socket: ConnectionSocket): boolean {\n if (this.#deviceIds.has(socket)) {\n return false\n }\n const previous = this.#devices.get(deviceId)\n if (previous !== undefined && previous !== socket && previous.readyState === WebSocket.OPEN) {\n return false\n }\n this.#devices.set(deviceId, socket)\n this.#deviceIds.set(socket, deviceId)\n if (socket.data.stageDeadline !== undefined) {\n clearTimeout(socket.data.stageDeadline)\n socket.data.stageDeadline = undefined\n }\n return true\n }\n\n pendingConnections(): number {\n return this.#principals.size - this.#deviceIds.size\n }\n\n detach(socket: ConnectionSocket): DeviceId | undefined {\n if (socket.data.stageDeadline !== undefined) {\n clearTimeout(socket.data.stageDeadline)\n }\n const principal = this.#principals.get(socket)\n this.#principals.delete(socket)\n this.#ownerSockets.delete(socket)\n if (principal?.sessionId !== undefined && this.#sessions.get(principal.sessionId) === socket) {\n this.#sessions.delete(principal.sessionId)\n }\n const deviceId = this.#deviceIds.get(socket)\n this.#deviceIds.delete(socket)\n if (deviceId === undefined || this.#devices.get(deviceId) !== socket) {\n return undefined\n }\n this.#devices.delete(deviceId)\n return deviceId\n }\n\n deviceId(socket: ConnectionSocket): DeviceId | undefined {\n return this.#deviceIds.get(socket)\n }\n\n closeSession(sessionId: AuthSessionId): void {\n for (const [socket, principal] of this.#principals) {\n if (principal.sessionId === sessionId) {\n socket.close(4003, \"Session revoked\")\n }\n }\n }\n\n closeDevice(deviceId: DeviceId): void {\n this.#devices.get(deviceId)?.close(4003, \"Device forgotten\")\n }\n\n hasDevice(deviceId: DeviceId): boolean {\n return this.#devices.get(deviceId)?.readyState === WebSocket.OPEN\n }\n\n sendToDevice(deviceId: DeviceId, event: SocketEvent): boolean {\n const socket = this.#devices.get(deviceId)\n if (socket?.readyState !== WebSocket.OPEN || !this.isAuthorized(socket)) {\n return false\n }\n try {\n socket.send(JSON.stringify(event))\n return true\n } catch {\n return false\n }\n }\n}\n",
7
+ "import type { AuthSessionId, DeviceId, SocketEvent, Timestamp } from \"@cohall/protocol\"\nimport { WebSocket } from \"ws\"\n\nexport interface ConnectionData {\n processing: Promise<void>\n stageDeadline: ReturnType<typeof setTimeout> | undefined\n preAuthFrameReceived: boolean\n queuedMessages: number\n closed: boolean\n}\n\nexport type ConnectionSocket = WebSocket & { data: ConnectionData }\n\ninterface Principal {\n readonly sessionId?: AuthSessionId\n readonly boundDeviceId?: DeviceId\n readonly expiresAt?: Timestamp\n}\n\nexport class Hub {\n readonly #principals = new Map<ConnectionSocket, Principal>()\n readonly #devices = new Map<DeviceId, ConnectionSocket>()\n readonly #deviceIds = new Map<ConnectionSocket, DeviceId>()\n readonly #sessions = new Map<AuthSessionId, ConnectionSocket>()\n readonly #ownerSockets = new Set<ConnectionSocket>()\n\n attach(socket: ConnectionSocket, principal: Principal): boolean {\n if (principal.sessionId === undefined) {\n if (this.#ownerSockets.size >= 16) {\n return false\n }\n this.#ownerSockets.add(socket)\n } else {\n const existing = this.#sessions.get(principal.sessionId)\n if (existing !== undefined && existing.readyState === WebSocket.OPEN) {\n return false\n }\n this.#sessions.set(principal.sessionId, socket)\n }\n this.#principals.set(socket, principal)\n if (socket.data.stageDeadline !== undefined) {\n clearTimeout(socket.data.stageDeadline)\n socket.data.stageDeadline = undefined\n }\n return true\n }\n\n isAuthorized(socket: ConnectionSocket): boolean {\n const principal = this.#principals.get(socket)\n if (principal === undefined) {\n return false\n }\n if (principal.expiresAt !== undefined && Date.parse(principal.expiresAt) <= Date.now()) {\n socket.close(4003, \"Session expired\")\n return false\n }\n return true\n }\n\n boundDeviceId(socket: ConnectionSocket): DeviceId | undefined {\n return this.#principals.get(socket)?.boundDeviceId\n }\n\n registerDevice(deviceId: DeviceId, socket: ConnectionSocket): boolean {\n if (this.#deviceIds.has(socket)) {\n return false\n }\n const previous = this.#devices.get(deviceId)\n if (previous !== undefined && previous !== socket && previous.readyState === WebSocket.OPEN) {\n return false\n }\n this.#devices.set(deviceId, socket)\n this.#deviceIds.set(socket, deviceId)\n if (socket.data.stageDeadline !== undefined) {\n clearTimeout(socket.data.stageDeadline)\n socket.data.stageDeadline = undefined\n }\n return true\n }\n\n pendingConnections(): number {\n return this.#principals.size - this.#deviceIds.size\n }\n\n detach(socket: ConnectionSocket): DeviceId | undefined {\n if (socket.data.stageDeadline !== undefined) {\n clearTimeout(socket.data.stageDeadline)\n }\n const principal = this.#principals.get(socket)\n this.#principals.delete(socket)\n this.#ownerSockets.delete(socket)\n if (principal?.sessionId !== undefined && this.#sessions.get(principal.sessionId) === socket) {\n this.#sessions.delete(principal.sessionId)\n }\n const deviceId = this.#deviceIds.get(socket)\n this.#deviceIds.delete(socket)\n if (deviceId === undefined || this.#devices.get(deviceId) !== socket) {\n return undefined\n }\n this.#devices.delete(deviceId)\n return deviceId\n }\n\n deviceId(socket: ConnectionSocket): DeviceId | undefined {\n return this.#deviceIds.get(socket)\n }\n\n closeSession(sessionId: AuthSessionId): void {\n for (const [socket, principal] of this.#principals) {\n if (principal.sessionId === sessionId) {\n socket.close(4003, \"Session revoked\")\n }\n }\n }\n\n closeDevice(deviceId: DeviceId): void {\n this.#devices.get(deviceId)?.close(4003, \"Device forgotten\")\n }\n\n hasDevice(deviceId: DeviceId): boolean {\n return this.#devices.get(deviceId)?.readyState === WebSocket.OPEN\n }\n\n sendToDevice(deviceId: DeviceId, event: SocketEvent, beforeSend?: () => void): boolean {\n const socket = this.#devices.get(deviceId)\n if (socket?.readyState !== WebSocket.OPEN || !this.isAuthorized(socket)) {\n return false\n }\n const payload = JSON.stringify(event)\n // Persist dispatch without yielding between the live-connection check and the send attempt.\n beforeSend?.()\n try {\n socket.send(payload)\n return true\n } catch {\n return false\n }\n }\n}\n",
8
8
  "import { DatabaseSync, type SQLInputValue, type StatementSync } from \"node:sqlite\"\n\ninterface RunResult {\n readonly changes: number\n}\n\nclass Statement<Row, Parameters extends Array<SQLInputValue>> {\n readonly #statement: StatementSync\n\n constructor(statement: StatementSync) {\n this.#statement = statement\n }\n\n get(...parameters: Parameters): Row | null {\n const row = this.#statement.get(...parameters)\n return row === undefined ? null : (row as unknown as Row)\n }\n\n all(...parameters: Parameters): ReadonlyArray<Row> {\n return this.#statement.all(...parameters) as unknown as ReadonlyArray<Row>\n }\n\n run(...parameters: Parameters): RunResult {\n const result = this.#statement.run(...parameters)\n return { changes: Number(result.changes) }\n }\n}\n\nexport class Database {\n readonly #database: DatabaseSync\n\n constructor(path: string) {\n this.#database = new DatabaseSync(path)\n }\n\n query<\n Row = Record<string, unknown>,\n Parameters extends Array<SQLInputValue> = Array<SQLInputValue>,\n >(sql: string): Statement<Row, Parameters> {\n return new Statement(this.#database.prepare(sql))\n }\n\n exec(sql: string): void {\n this.#database.exec(sql)\n }\n\n transaction<Result>(operation: () => Result): () => Result {\n return () => {\n this.#database.exec(\"BEGIN IMMEDIATE\")\n try {\n const result = operation()\n this.#database.exec(\"COMMIT\")\n return result\n } catch (cause) {\n this.#database.exec(\"ROLLBACK\")\n throw cause\n }\n }\n }\n\n close(): void {\n this.#database.close()\n }\n}\n",
9
- "import {\n AuthSession,\n ConnectionRole,\n Device,\n DeviceId,\n DeviceOperation,\n DeviceUsage,\n Message,\n PairingCredential,\n PairingResult,\n Provider,\n Task,\n TaskId,\n TaskStatus,\n TaskTrace,\n TaskTraceEvent,\n TaskStatusCounts,\n Timestamp,\n Thread,\n ThreadContext,\n UsageSummary,\n assertDeviceOperationSupport,\n makeAuthSessionId,\n makeDeviceId,\n makeMessageId,\n makeOperationId,\n makeTaskId,\n makeThreadId,\n now,\n taskSlot,\n type AuthSessionId,\n type ConnectionRole as ConnectionRoleName,\n type CreatePairingInput,\n type CreateTaskInput,\n type CreateUpgradeOperationsInput,\n type OperationId,\n type OperationStatus,\n type TaskTraceEventKind,\n type ThreadId,\n} from \"@cohall/protocol\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport { createHash, randomBytes } from \"node:crypto\"\nimport { Database } from \"./database.ts\"\n\nexport class PersistenceError extends Schema.TaggedErrorClass<PersistenceError>()(\n \"RelayStore.PersistenceError\",\n { operation: Schema.String, message: Schema.String },\n) {}\n\ninterface ThreadRow {\n readonly id: string\n readonly title: string\n readonly created_at: string\n readonly updated_at: string\n readonly default_device_id: string | null\n}\n\ninterface MessageRow {\n readonly id: string\n readonly thread_id: string\n readonly role: string\n readonly author_name: string\n readonly content: string\n readonly created_at: string\n readonly task_id: string | null\n readonly device_id: string | null\n}\n\ninterface DeviceRow {\n readonly id: string\n readonly name: string\n readonly hostname: string\n readonly platform: string\n readonly architecture: string\n readonly status: string\n readonly providers_json: string\n readonly bots_json: string | null\n readonly capabilities_json: string\n readonly workspaces_json: string\n readonly version: string\n readonly last_seen_at: string\n readonly connected_at: string | null\n}\n\ninterface TaskRow {\n readonly id: string\n readonly thread_id: string\n readonly prompt: string\n readonly context: string | null\n readonly provider: string\n readonly bot_id: string | null\n readonly status: string\n readonly source_device_id: string | null\n readonly target_device_id: string\n readonly parent_task_id: string | null\n readonly workspace: string | null\n readonly provider_session_id: string | null\n readonly result: string | null\n readonly error: string | null\n readonly created_at: string\n readonly updated_at: string\n readonly started_at: string | null\n readonly completed_at: string | null\n}\n\ninterface TaskTraceEventRow {\n readonly id: number\n readonly kind: string\n readonly created_at: string\n readonly detail: string | null\n}\n\ninterface DeviceOperationRow {\n readonly id: string\n readonly kind: string\n readonly status: string\n readonly target_device_id: string\n readonly requested_version: string\n readonly restart: number\n readonly result: string | null\n readonly error: string | null\n readonly created_at: string\n readonly updated_at: string\n readonly completed_at: string | null\n}\n\ninterface UsageRow {\n readonly device_id: string\n readonly device_name: string\n readonly status: string\n readonly provider: string\n readonly tasks: number\n}\n\ninterface PairingRow {\n readonly token_hash: string\n readonly label: string\n readonly roles_json: string\n readonly expires_at: string\n readonly used_at: string | null\n}\n\ninterface AuthSessionRow {\n readonly id: string\n readonly token_hash: string\n readonly label: string\n readonly roles_json: string\n readonly created_at: string\n readonly expires_at: string\n readonly last_seen_at: string\n readonly bound_device_id: string | null\n readonly revoked_at: string | null\n}\n\nexport interface TaskUpdate {\n readonly status?: TaskStatus\n readonly providerSessionId?: string\n readonly result?: string\n readonly error?: string\n readonly startedAt?: Timestamp\n readonly completedAt?: Timestamp\n}\n\nexport interface Interface {\n readonly recover: () => Effect.Effect<void, PersistenceError>\n readonly listDevices: () => Effect.Effect<ReadonlyArray<Device>, PersistenceError>\n readonly usage: () => Effect.Effect<UsageSummary, PersistenceError>\n readonly forgetDevice: (deviceId: DeviceId) => Effect.Effect<Device, PersistenceError>\n readonly upsertDevice: (device: Device) => Effect.Effect<Device, PersistenceError>\n readonly heartbeat: (\n deviceId: DeviceId,\n status: \"online\" | \"busy\",\n bots?: Device[\"bots\"],\n ) => Effect.Effect<Device, PersistenceError>\n readonly markDeviceOffline: (deviceId: DeviceId) => Effect.Effect<Device, PersistenceError>\n readonly createDelegation: (\n input: CreateTaskInput,\n targetDeviceId: DeviceId,\n sourceDeviceId?: DeviceId,\n providerSessionId?: string,\n ) => Effect.Effect<Task, PersistenceError>\n readonly getTask: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly traceTask: (taskId: TaskId) => Effect.Effect<TaskTrace, PersistenceError>\n readonly threadContext: (threadId: ThreadId) => Effect.Effect<ThreadContext, PersistenceError>\n readonly pendingTasksFor: (\n deviceId: DeviceId,\n ) => Effect.Effect<ReadonlyArray<Task>, PersistenceError>\n readonly assignTask: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly rollbackAssignment: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly acceptTask: (taskId: TaskId, deviceId: DeviceId) => Effect.Effect<Task, PersistenceError>\n readonly finishTask: (\n taskId: TaskId,\n deviceId: DeviceId,\n result: string,\n providerSessionId?: string,\n ) => Effect.Effect<Task, PersistenceError>\n readonly failTask: (\n taskId: TaskId,\n deviceId: DeviceId,\n error: string,\n ) => Effect.Effect<Task, PersistenceError>\n readonly acknowledgeCancellation: (\n taskId: TaskId,\n deviceId: DeviceId,\n ) => Effect.Effect<Task, PersistenceError>\n readonly requestCancellation: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly requeueTasksFor: (deviceId: DeviceId) => Effect.Effect<void, PersistenceError>\n readonly createUpgradeOperations: (\n input: CreateUpgradeOperationsInput,\n ) => Effect.Effect<ReadonlyArray<DeviceOperation>, PersistenceError>\n readonly listOperations: () => Effect.Effect<ReadonlyArray<DeviceOperation>, PersistenceError>\n readonly abandonOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly pendingOperationsFor: (\n deviceId: DeviceId,\n ) => Effect.Effect<ReadonlyArray<DeviceOperation>, PersistenceError>\n readonly assignOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly rollbackOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly acceptOperation: (\n operationId: OperationId,\n deviceId: DeviceId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly finishOperation: (\n operationId: OperationId,\n deviceId: DeviceId,\n result: string,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly failOperation: (\n operationId: OperationId,\n deviceId: DeviceId,\n error: string,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly requeueOperationsFor: (deviceId: DeviceId) => Effect.Effect<void, PersistenceError>\n readonly sessionFor: (\n threadId: ThreadId,\n deviceId: DeviceId,\n provider: Provider,\n ) => Effect.Effect<string | undefined, PersistenceError>\n readonly createPairing: (\n input: CreatePairingInput,\n ) => Effect.Effect<PairingCredential, PersistenceError>\n readonly exchangePairing: (token: string) => Effect.Effect<PairingResult, PersistenceError>\n readonly authenticateSession: (\n token: string,\n role: ConnectionRoleName,\n ) => Effect.Effect<AuthSession | undefined, PersistenceError>\n readonly listAuthSessions: () => Effect.Effect<ReadonlyArray<AuthSession>, PersistenceError>\n readonly revokeAuthSession: (\n sessionId: AuthSessionId,\n ) => Effect.Effect<AuthSession, PersistenceError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@cohall/RelayStore\") {}\n\nconst operationError =\n (operation: string) =>\n (cause: unknown): PersistenceError =>\n new PersistenceError({\n operation,\n message: cause instanceof Error ? cause.message : String(cause),\n })\n\nconst decode = <S extends Schema.Top & { readonly DecodingServices: never }>(\n operation: string,\n schema: S,\n value: unknown,\n): Effect.Effect<S[\"Type\"], PersistenceError> =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(operationError(operation)))\n\nconst threadFromRow = (row: ThreadRow): Effect.Effect<Thread, PersistenceError> =>\n decode(\"RelayStore.decodeThread\", Thread, {\n id: row.id,\n title: row.title,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n ...(row.default_device_id === null ? {} : { defaultDeviceId: row.default_device_id }),\n })\n\nconst messageFromRow = (row: MessageRow): Effect.Effect<Message, PersistenceError> =>\n decode(\"RelayStore.decodeMessage\", Message, {\n id: row.id,\n threadId: row.thread_id,\n role: row.role === \"tool\" ? \"agent\" : row.role,\n authorName: row.author_name,\n content: row.content,\n createdAt: row.created_at,\n ...(row.task_id === null ? {} : { taskId: row.task_id }),\n ...(row.device_id === null ? {} : { deviceId: row.device_id }),\n })\n\nconst deviceFromRow = (row: DeviceRow): Effect.Effect<Device, PersistenceError> =>\n decode(\"RelayStore.decodeDevice\", Device, {\n id: row.id,\n name: row.name,\n hostname: row.hostname,\n platform: row.platform,\n architecture: row.architecture,\n status: row.status,\n providers: JSON.parse(row.providers_json) as unknown,\n ...(row.bots_json === null ? {} : { bots: JSON.parse(row.bots_json) as unknown }),\n capabilities: JSON.parse(row.capabilities_json) as unknown,\n workspaces: JSON.parse(row.workspaces_json) as unknown,\n version: row.version,\n lastSeenAt: row.last_seen_at,\n ...(row.connected_at === null ? {} : { connectedAt: row.connected_at }),\n })\n\nconst taskFromRow = (row: TaskRow): Effect.Effect<Task, PersistenceError> =>\n decode(\"RelayStore.decodeTask\", Task, {\n id: row.id,\n threadId: row.thread_id,\n prompt: row.prompt,\n provider: row.provider,\n ...(row.bot_id === null ? {} : { botId: row.bot_id }),\n status: row.status,\n targetDeviceId: row.target_device_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n ...(row.context === null ? {} : { context: row.context }),\n ...(row.source_device_id === null ? {} : { sourceDeviceId: row.source_device_id }),\n ...(row.parent_task_id === null ? {} : { parentTaskId: row.parent_task_id }),\n ...(row.workspace === null ? {} : { workspace: row.workspace }),\n ...(row.provider_session_id === null ? {} : { providerSessionId: row.provider_session_id }),\n ...(row.result === null ? {} : { result: row.result }),\n ...(row.error === null ? {} : { error: row.error }),\n ...(row.started_at === null ? {} : { startedAt: row.started_at }),\n ...(row.completed_at === null ? {} : { completedAt: row.completed_at }),\n })\n\nconst operationFromRow = (\n row: DeviceOperationRow,\n): Effect.Effect<DeviceOperation, PersistenceError> =>\n decode(\"RelayStore.decodeOperation\", DeviceOperation, {\n id: row.id,\n kind: row.kind,\n status: row.status,\n targetDeviceId: row.target_device_id,\n requestedVersion: row.requested_version,\n restart: row.restart === 1,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n ...(row.result === null ? {} : { result: row.result }),\n ...(row.error === null ? {} : { error: row.error }),\n ...(row.completed_at === null ? {} : { completedAt: row.completed_at }),\n })\n\nconst emptyStatusCounts = (): Record<TaskStatus, number> => ({\n queued: 0,\n assigned: 0,\n running: 0,\n cancelling: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n})\n\nconst taskTraceEventFromRow = (\n row: TaskTraceEventRow,\n): Effect.Effect<TaskTraceEvent, PersistenceError> =>\n decode(\"RelayStore.decodeTaskTraceEvent\", TaskTraceEvent, {\n kind: row.kind,\n at: row.created_at,\n ...(row.detail === null ? {} : { detail: row.detail }),\n })\n\nconst rolesFromRow = (row: AuthSessionRow): ReadonlyArray<ConnectionRoleName> =>\n Schema.decodeUnknownSync(Schema.Array(ConnectionRole))(JSON.parse(row.roles_json))\n\nconst authSessionFromRow = (row: AuthSessionRow): Effect.Effect<AuthSession, PersistenceError> => {\n const roles = rolesFromRow(row)\n const role = roles[0]\n return role === undefined\n ? Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.decodeAuthSession\",\n message: `Session ${row.id} has no role`,\n }),\n )\n : decode(\"RelayStore.decodeAuthSession\", AuthSession, {\n id: row.id,\n label: row.label,\n role,\n createdAt: row.created_at,\n expiresAt: row.expires_at,\n lastSeenAt: row.last_seen_at,\n ...(row.bound_device_id === null ? {} : { deviceId: row.bound_device_id }),\n ...(row.revoked_at === null ? {} : { revokedAt: row.revoked_at }),\n })\n}\n\nconst secret = (prefix: \"pair\" | \"session\"): string => {\n return `cohall_${prefix}_${randomBytes(32).toString(\"hex\")}`\n}\nconst tokenHash = (token: string): string => createHash(\"sha256\").update(token).digest(\"hex\")\n\nconst providerName = (provider: Provider): string => {\n switch (provider) {\n case \"codex\":\n return \"Codex\"\n case \"claude-code\":\n return \"Claude Code\"\n case \"opencode\":\n return \"OpenCode\"\n case \"grok-bot\":\n return \"Grok Bot\"\n }\n}\n\nconst recentWithin = <A>(items: ReadonlyArray<A>, byteBudget: number) => {\n const encoder = new TextEncoder()\n const selected: Array<A> = []\n let bytes = 0\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index]\n if (item === undefined) {\n continue\n }\n const itemBytes = encoder.encode(JSON.stringify(item)).byteLength\n if (bytes + itemBytes > byteBudget) {\n break\n }\n bytes += itemBytes\n selected.unshift(item)\n }\n return { items: selected, truncated: selected.length < items.length }\n}\n\nconst derivedTraceEvents = (task: Task): ReadonlyArray<TaskTraceEvent> => {\n const detail = \"Derived from task timestamps; earlier trace events were not recorded\"\n const events: Array<TaskTraceEvent> = [\n TaskTraceEvent.make({ kind: \"queued\", at: task.createdAt, detail }),\n ]\n if (task.startedAt !== undefined) {\n events.push(TaskTraceEvent.make({ kind: \"running\", at: task.startedAt, detail }))\n } else if (task.status === \"assigned\") {\n events.push(TaskTraceEvent.make({ kind: \"assigned\", at: task.updatedAt, detail }))\n }\n if (task.status === \"cancelling\") {\n events.push(TaskTraceEvent.make({ kind: \"cancelling\", at: task.updatedAt, detail }))\n }\n if (\n task.completedAt !== undefined &&\n (task.status === \"completed\" || task.status === \"failed\" || task.status === \"cancelled\")\n ) {\n events.push(TaskTraceEvent.make({ kind: task.status, at: task.completedAt, detail }))\n }\n return events\n}\n\nconst makeService = (db: Database, retainedTerminalTasks = 1_000): Interface => {\n const recordTaskTraceEvent = (\n taskId: TaskId,\n kind: TaskTraceEventKind,\n detail: string,\n createdAt: Timestamp = now(),\n ): void => {\n db.query(\n `INSERT INTO task_trace_events (task_id, kind, created_at, detail)\n VALUES (?, ?, ?, ?)`,\n ).run(taskId, kind, createdAt, detail)\n db.query(\n `DELETE FROM task_trace_events WHERE task_id = ? AND id NOT IN (\n SELECT id FROM task_trace_events WHERE task_id = ? ORDER BY id DESC LIMIT 1000\n )`,\n ).run(taskId, taskId)\n }\n\n const pruneTerminalHistory = (preserveTaskId?: TaskId): void => {\n const exclusion = preserveTaskId === undefined ? \"\" : \"AND id <> ?\"\n const offset = preserveTaskId === undefined ? retainedTerminalTasks : retainedTerminalTasks - 1\n const staleTasks = `SELECT id FROM tasks\n WHERE status IN ('completed', 'failed', 'cancelled')\n ${exclusion}\n ORDER BY completed_at DESC, updated_at DESC, id DESC\n LIMIT -1 OFFSET ?`\n const parameters = preserveTaskId === undefined ? [offset] : [preserveTaskId, offset]\n db.query(`DELETE FROM messages WHERE task_id IN (${staleTasks})`).run(...parameters)\n db.query(`DELETE FROM tasks WHERE id IN (${staleTasks})`).run(...parameters)\n db.query(\n `DELETE FROM threads\n WHERE NOT EXISTS (SELECT 1 FROM tasks WHERE tasks.thread_id = threads.id)\n AND NOT EXISTS (SELECT 1 FROM messages WHERE messages.thread_id = threads.id)`,\n ).run()\n }\n\n const pruneTerminalOperations = (preserveOperationId?: OperationId): void => {\n const exclusion = preserveOperationId === undefined ? \"\" : \"AND id <> ?\"\n const offset =\n preserveOperationId === undefined ? retainedTerminalTasks : retainedTerminalTasks - 1\n const parameters = preserveOperationId === undefined ? [offset] : [preserveOperationId, offset]\n db.query(\n `DELETE FROM device_operations\n WHERE id IN (\n SELECT id FROM device_operations\n WHERE status IN ('completed', 'failed') ${exclusion}\n ORDER BY completed_at DESC, updated_at DESC, id DESC\n LIMIT -1 OFFSET ?\n )`,\n ).run(...parameters)\n }\n\n const queryTask = (taskId: TaskId): TaskRow | null =>\n db.query<TaskRow, [string]>(\"SELECT * FROM tasks WHERE id = ?\").get(taskId)\n\n const queryOperation = (operationId: OperationId): DeviceOperationRow | null =>\n db\n .query<DeviceOperationRow, [string]>(\"SELECT * FROM device_operations WHERE id = ?\")\n .get(operationId)\n\n const getTask = Effect.fn(\"RelayStore.getTask\")(function* (taskId: TaskId) {\n const row = yield* Effect.try({\n try: () => queryTask(taskId),\n catch: operationError(\"RelayStore.getTask\"),\n })\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.getTask\",\n message: `Unknown task ${taskId}`,\n }),\n )\n }\n return yield* taskFromRow(row)\n })\n\n const traceTask = Effect.fn(\"RelayStore.traceTask\")(function* (taskId: TaskId) {\n const task = yield* getTask(taskId)\n const [deviceRow, eventRows] = yield* Effect.try({\n try: () =>\n [\n db\n .query<DeviceRow, [string]>(\"SELECT * FROM devices WHERE id = ?\")\n .get(task.targetDeviceId),\n db\n .query<TaskTraceEventRow, [string]>(\n `SELECT * FROM (\n SELECT id, kind, created_at, detail FROM task_trace_events\n WHERE task_id = ? ORDER BY id DESC LIMIT 101\n ) ORDER BY id`,\n )\n .all(taskId),\n ] as const,\n catch: operationError(\"RelayStore.traceTask\"),\n })\n if (deviceRow === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.traceTask.device\",\n message: `Unknown target device ${task.targetDeviceId}`,\n }),\n )\n }\n const targetDevice = yield* deviceFromRow(deviceRow)\n const selectedRows = eventRows.slice(-100)\n const recordedEvents = yield* Effect.forEach(selectedRows, taskTraceEventFromRow)\n const events = recordedEvents.length === 0 ? derivedTraceEvents(task) : recordedEvents\n return TaskTrace.make({\n taskId: task.id,\n threadId: task.threadId,\n status: task.status,\n provider: task.provider,\n ...(task.botId === undefined ? {} : { botId: task.botId }),\n targetDevice,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n events,\n truncated:\n eventRows.length > 100 ||\n recordedEvents.length === 0 ||\n recordedEvents[0]?.kind !== \"queued\",\n ...(task.sourceDeviceId === undefined ? {} : { sourceDeviceId: task.sourceDeviceId }),\n ...(task.parentTaskId === undefined ? {} : { parentTaskId: task.parentTaskId }),\n ...(task.workspace === undefined ? {} : { workspace: task.workspace }),\n ...(task.startedAt === undefined ? {} : { startedAt: task.startedAt }),\n ...(task.completedAt === undefined ? {} : { completedAt: task.completedAt }),\n ...(task.error === undefined ? {} : { error: task.error }),\n })\n })\n\n const listDevices = Effect.fn(\"RelayStore.listDevices\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<DeviceRow, []>(\n \"SELECT * FROM devices WHERE forgotten_at IS NULL ORDER BY name COLLATE NOCASE, id\",\n )\n .all(),\n catch: operationError(\"RelayStore.listDevices\"),\n })\n return yield* Effect.forEach(rows, deviceFromRow)\n })\n\n const usage = Effect.fn(\"RelayStore.usage\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<UsageRow, []>(\n `SELECT tasks.target_device_id AS device_id, devices.name AS device_name,\n tasks.status, tasks.provider, COUNT(*) AS tasks\n FROM tasks\n JOIN devices ON devices.id = tasks.target_device_id\n GROUP BY tasks.target_device_id, devices.name, tasks.status, tasks.provider\n ORDER BY devices.name COLLATE NOCASE, tasks.target_device_id, tasks.provider`,\n )\n .all(),\n catch: operationError(\"RelayStore.usage\"),\n })\n const totalStatus = emptyStatusCounts()\n const totalProviders = new Map<Provider, number>()\n const devices = new Map<\n DeviceId,\n {\n readonly name: string\n readonly status: Record<TaskStatus, number>\n readonly providers: Map<Provider, number>\n }\n >()\n let retainedTasks = 0\n for (const row of rows) {\n const status = Schema.decodeUnknownSync(TaskStatus)(row.status)\n const provider = Schema.decodeUnknownSync(Provider)(row.provider)\n const deviceId = Schema.decodeUnknownSync(DeviceId)(row.device_id)\n retainedTasks += row.tasks\n totalStatus[status] += row.tasks\n totalProviders.set(provider, (totalProviders.get(provider) ?? 0) + row.tasks)\n const current = devices.get(deviceId) ?? {\n name: row.device_name,\n status: emptyStatusCounts(),\n providers: new Map<Provider, number>(),\n }\n current.status[status] += row.tasks\n current.providers.set(provider, (current.providers.get(provider) ?? 0) + row.tasks)\n devices.set(deviceId, current)\n }\n const providerUsage = (providers: ReadonlyMap<Provider, number>) =>\n Provider.literals.flatMap((provider) => {\n const tasks = providers.get(provider)\n return tasks === undefined ? [] : [{ provider, tasks }]\n })\n return UsageSummary.make({\n retainedTasks,\n byStatus: TaskStatusCounts.make(totalStatus),\n byProvider: providerUsage(totalProviders),\n devices: [...devices.entries()].map(([deviceId, device]) =>\n DeviceUsage.make({\n deviceId,\n deviceName: device.name,\n tasks: Object.values(device.status).reduce((sum, tasks) => sum + tasks, 0),\n byStatus: TaskStatusCounts.make(device.status),\n byProvider: providerUsage(device.providers),\n }),\n ),\n })\n })\n\n const getOperation = Effect.fn(\"RelayStore.getOperation\")(function* (operationId: OperationId) {\n const row = yield* Effect.try({\n try: () => queryOperation(operationId),\n catch: operationError(\"RelayStore.getOperation\"),\n })\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.getOperation\",\n message: `Unknown device operation ${operationId}`,\n }),\n )\n }\n return yield* operationFromRow(row)\n })\n\n const listOperations = Effect.fn(\"RelayStore.listOperations\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<DeviceOperationRow, []>(\n \"SELECT * FROM device_operations ORDER BY created_at DESC, id DESC LIMIT 50\",\n )\n .all(),\n catch: operationError(\"RelayStore.listOperations\"),\n })\n return yield* Effect.forEach(rows, operationFromRow)\n })\n\n const createUpgradeOperations = Effect.fn(\"RelayStore.createUpgradeOperations\")(function* (\n input: CreateUpgradeOperationsInput,\n ) {\n const timestamp = now()\n const operations = yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const devices = db\n .query<DeviceRow, []>(\n \"SELECT * FROM devices WHERE forgotten_at IS NULL ORDER BY name COLLATE NOCASE, id\",\n )\n .all()\n if (devices.length === 0) {\n throw new Error(\"No Cohall devices are registered\")\n }\n if (devices.length > 256) {\n throw new Error(\"All-device operations support at most 256 registered devices\")\n }\n assertDeviceOperationSupport(devices)\n for (const device of devices) {\n const outstanding = db\n .query<{ readonly count: number }, [string]>(\n `SELECT COUNT(*) AS count FROM device_operations\n WHERE target_device_id = ? AND status IN ('queued', 'assigned', 'running')`,\n )\n .get(device.id)\n if ((outstanding?.count ?? 0) > 0) {\n throw new Error(`${device.name} already has an upgrade operation in progress`)\n }\n }\n pruneTerminalOperations()\n return devices.map((device) => {\n const operation = DeviceOperation.make({\n id: makeOperationId(),\n kind: \"upgrade\",\n status: \"queued\",\n targetDeviceId: DeviceId.make(device.id),\n requestedVersion: input.target,\n restart: input.restart,\n createdAt: timestamp,\n updatedAt: timestamp,\n })\n db.query(\n `INSERT INTO device_operations (\n id, kind, status, target_device_id, requested_version, restart,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n operation.id,\n operation.kind,\n operation.status,\n operation.targetDeviceId,\n operation.requestedVersion,\n operation.restart ? 1 : 0,\n operation.createdAt,\n operation.updatedAt,\n )\n return operation\n })\n })(),\n catch: operationError(\"RelayStore.createUpgradeOperations\"),\n })\n return operations\n })\n\n const pendingOperationsFor = Effect.fn(\"RelayStore.pendingOperationsFor\")(function* (\n deviceId: DeviceId,\n ) {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<DeviceOperationRow, [string]>(\n `SELECT * FROM device_operations WHERE target_device_id = ? AND status = 'queued'\n ORDER BY created_at, id LIMIT 10`,\n )\n .all(deviceId),\n catch: operationError(\"RelayStore.pendingOperationsFor\"),\n })\n return yield* Effect.forEach(rows, operationFromRow)\n })\n\n const transitionOperation = Effect.fn(\"RelayStore.transitionOperation\")(function* (\n operationId: OperationId,\n expected: ReadonlyArray<OperationStatus>,\n status: OperationStatus,\n result?: string,\n error?: string,\n ) {\n const current = yield* getOperation(operationId)\n if (!expected.includes(current.status)) {\n return current\n }\n const timestamp = now()\n const completed = status === \"completed\" || status === \"failed\" ? timestamp : undefined\n const placeholders = expected.map(() => \"?\").join(\", \")\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const updated = db\n .query(\n `UPDATE device_operations\n SET status = ?, result = ?, error = ?, updated_at = ?, completed_at = ?\n WHERE id = ? AND status IN (${placeholders})`,\n )\n .run(\n status,\n result ?? current.result ?? null,\n error ?? current.error ?? null,\n timestamp,\n completed ?? current.completedAt ?? null,\n operationId,\n ...expected,\n )\n if (updated.changes === 1 && completed !== undefined) {\n pruneTerminalOperations(operationId)\n }\n })(),\n catch: operationError(\"RelayStore.transitionOperation\"),\n })\n return yield* getOperation(operationId)\n })\n\n const requireOperationTarget = Effect.fn(\"RelayStore.requireOperationTarget\")(function* (\n operationId: OperationId,\n deviceId: DeviceId,\n ) {\n const operation = yield* getOperation(operationId)\n if (operation.targetDeviceId !== deviceId) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.requireOperationTarget\",\n message: `Device ${deviceId} cannot update operation ${operationId}`,\n }),\n )\n }\n return operation\n })\n\n const assignOperation = Effect.fn(\"RelayStore.assignOperation\")(function* (\n operationId: OperationId,\n ) {\n const current = yield* getOperation(operationId)\n if (current.status !== \"queued\") {\n return current\n }\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db\n .query(\n `UPDATE device_operations SET status = 'assigned', updated_at = ?\n WHERE id = ? AND status = 'queued'\n AND NOT EXISTS (\n SELECT 1 FROM tasks WHERE target_device_id = ?\n AND status IN ('assigned', 'running', 'cancelling')\n )\n AND NOT EXISTS (\n SELECT 1 FROM device_operations active\n WHERE active.target_device_id = ? AND active.id <> ?\n AND active.status IN ('assigned', 'running')\n )`,\n )\n .run(timestamp, operationId, current.targetDeviceId, current.targetDeviceId, operationId),\n catch: operationError(\"RelayStore.assignOperation\"),\n })\n return yield* getOperation(operationId)\n })\n\n const acceptOperation = (operationId: OperationId, deviceId: DeviceId) =>\n requireOperationTarget(operationId, deviceId).pipe(\n Effect.flatMap(() => transitionOperation(operationId, [\"assigned\"], \"running\")),\n )\n\n const finishOperation = (operationId: OperationId, deviceId: DeviceId, result: string) =>\n requireOperationTarget(operationId, deviceId).pipe(\n Effect.flatMap(() =>\n transitionOperation(operationId, [\"queued\", \"assigned\", \"running\"], \"completed\", result),\n ),\n )\n\n const failOperation = (operationId: OperationId, deviceId: DeviceId, error: string) =>\n requireOperationTarget(operationId, deviceId).pipe(\n Effect.flatMap(() =>\n transitionOperation(\n operationId,\n [\"queued\", \"assigned\", \"running\"],\n \"failed\",\n undefined,\n error,\n ),\n ),\n )\n\n const abandonOperation = (operationId: OperationId) =>\n transitionOperation(\n operationId,\n [\"queued\", \"assigned\", \"running\"],\n \"failed\",\n undefined,\n \"Abandoned by the relay owner\",\n )\n\n const requeueOperationsFor = Effect.fn(\"RelayStore.requeueOperationsFor\")(function* (\n deviceId: DeviceId,\n ) {\n yield* Effect.try({\n try: () =>\n db\n .query(\n `UPDATE device_operations SET status = 'queued', updated_at = ?\n WHERE target_device_id = ? AND status IN ('assigned', 'running')`,\n )\n .run(now(), deviceId),\n catch: operationError(\"RelayStore.requeueOperationsFor\"),\n })\n })\n\n const forgetDevice = Effect.fn(\"RelayStore.forgetDevice\")(function* (deviceId: DeviceId) {\n const row = yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const device = db\n .query<DeviceRow, [string]>(\n \"SELECT * FROM devices WHERE id = ? AND forgotten_at IS NULL\",\n )\n .get(deviceId)\n if (device === null) {\n throw new Error(`Unknown device ${deviceId}`)\n }\n if (device.status !== \"offline\") {\n throw new Error(`Device ${deviceId} must be offline before it can be forgotten`)\n }\n const outstanding = db\n .query<{ readonly count: number }, [string]>(\n `SELECT COUNT(*) AS count FROM tasks\n WHERE target_device_id = ? AND status NOT IN ('completed', 'failed', 'cancelled')`,\n )\n .get(deviceId)\n if ((outstanding?.count ?? 0) > 0) {\n throw new Error(`Device ${deviceId} still has outstanding tasks`)\n }\n const timestamp = now()\n db.query(\n `UPDATE device_operations\n SET status = 'failed', error = ?, updated_at = ?, completed_at = ?\n WHERE target_device_id = ? AND status IN ('queued', 'assigned', 'running')`,\n ).run(\"Target device was forgotten by the relay owner\", timestamp, timestamp, deviceId)\n pruneTerminalOperations()\n db.query(\"UPDATE devices SET forgotten_at = ? WHERE id = ?\").run(timestamp, deviceId)\n db.query(\n \"UPDATE auth_sessions SET revoked_at = ? WHERE bound_device_id = ? AND revoked_at IS NULL\",\n ).run(timestamp, deviceId)\n return device\n })(),\n catch: operationError(\"RelayStore.forgetDevice\"),\n })\n return yield* deviceFromRow(row)\n })\n\n const recover = Effect.fn(\"RelayStore.recover\")(function* () {\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const timestamp = now()\n const interrupted = db\n .query<{ readonly id: string }, []>(\n \"SELECT id FROM tasks WHERE status IN ('assigned', 'running')\",\n )\n .all()\n db.query(\"UPDATE devices SET status = 'offline'\").run()\n db.query(\n \"UPDATE tasks SET status = 'queued', updated_at = ? WHERE status IN ('assigned', 'running')\",\n ).run(timestamp)\n db.query(\n \"UPDATE device_operations SET status = 'queued', updated_at = ? WHERE status IN ('assigned', 'running')\",\n ).run(timestamp)\n for (const task of interrupted) {\n recordTaskTraceEvent(\n TaskId.make(task.id),\n \"requeued\",\n \"Relay restarted before the task completed\",\n timestamp,\n )\n }\n db.query(\"DELETE FROM auth_pairings WHERE expires_at <= ? OR used_at IS NOT NULL\").run(\n timestamp,\n )\n db.query(\n \"UPDATE auth_sessions SET revoked_at = ? WHERE revoked_at IS NULL AND roles_json LIKE '%,%'\",\n ).run(timestamp)\n pruneTerminalHistory()\n pruneTerminalOperations()\n })(),\n catch: operationError(\"RelayStore.recover\"),\n })\n })\n\n const upsertDevice = Effect.fn(\"RelayStore.upsertDevice\")(function* (device: Device) {\n yield* Effect.try({\n try: () =>\n db\n .query(\n `INSERT INTO devices (\n id, name, hostname, platform, architecture, status, providers_json,\n capabilities_json, workspaces_json, version, last_seen_at, connected_at, bots_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name, hostname = excluded.hostname, platform = excluded.platform,\n architecture = excluded.architecture, status = excluded.status,\n providers_json = excluded.providers_json, bots_json = excluded.bots_json,\n capabilities_json = excluded.capabilities_json,\n workspaces_json = excluded.workspaces_json, version = excluded.version,\n last_seen_at = excluded.last_seen_at, connected_at = excluded.connected_at,\n forgotten_at = NULL`,\n )\n .run(\n device.id,\n device.name,\n device.hostname,\n device.platform,\n device.architecture,\n device.status,\n JSON.stringify(device.providers),\n JSON.stringify(device.capabilities),\n JSON.stringify(device.workspaces),\n device.version,\n device.lastSeenAt,\n device.connectedAt ?? null,\n device.bots === undefined ? null : JSON.stringify(device.bots),\n ),\n catch: operationError(\"RelayStore.upsertDevice\"),\n })\n return device\n })\n\n const updateDeviceStatus = Effect.fn(\"RelayStore.updateDeviceStatus\")(function* (\n deviceId: DeviceId,\n status: \"online\" | \"busy\" | \"offline\",\n bots?: Device[\"bots\"],\n ) {\n const timestamp = now()\n const result = yield* Effect.try({\n try: () =>\n db\n .query(\n \"UPDATE devices SET status = ?, last_seen_at = ?, bots_json = COALESCE(?, bots_json) WHERE id = ?\",\n )\n .run(status, timestamp, bots === undefined ? null : JSON.stringify(bots), deviceId),\n catch: operationError(\"RelayStore.updateDeviceStatus\"),\n })\n if (result.changes !== 1) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.updateDeviceStatus\",\n message: `Unknown device ${deviceId}`,\n }),\n )\n }\n const row = db.query<DeviceRow, [string]>(\"SELECT * FROM devices WHERE id = ?\").get(deviceId)\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.updateDeviceStatus.read\",\n message: `Device ${deviceId} disappeared after update`,\n }),\n )\n }\n return yield* deviceFromRow(row)\n })\n\n const createDelegation = Effect.fn(\"RelayStore.createDelegation\")(function* (\n input: CreateTaskInput,\n targetDeviceId: DeviceId,\n sourceDeviceId?: DeviceId,\n providerSessionId?: string,\n ) {\n const timestamp = now()\n const threadId = input.threadId ?? makeThreadId()\n const task = Task.make({\n id: makeTaskId(),\n threadId,\n prompt: input.prompt,\n provider: input.provider ?? (input.botId === undefined ? \"codex\" : \"grok-bot\"),\n ...(input.botId === undefined ? {} : { botId: input.botId }),\n status: \"queued\",\n targetDeviceId,\n createdAt: timestamp,\n updatedAt: timestamp,\n ...(input.context === undefined ? {} : { context: input.context }),\n ...(sourceDeviceId === undefined ? {} : { sourceDeviceId }),\n ...(input.parentTaskId === undefined ? {} : { parentTaskId: input.parentTaskId }),\n ...(input.workspace === undefined ? {} : { workspace: input.workspace }),\n ...(providerSessionId === undefined ? {} : { providerSessionId }),\n })\n const thread =\n input.threadId === undefined\n ? Thread.make({\n id: threadId,\n title: input.title ?? input.prompt.slice(0, 72),\n createdAt: timestamp,\n updatedAt: timestamp,\n })\n : undefined\n const message = Message.make({\n id: makeMessageId(),\n threadId,\n role: \"human\",\n authorName: sourceDeviceId === undefined ? \"User\" : \"Remote agent\",\n content: input.prompt,\n createdAt: timestamp,\n taskId: task.id,\n ...(sourceDeviceId === undefined ? {} : { deviceId: sourceDeviceId }),\n })\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const outstanding = db\n .query<{ readonly count: number }, [string]>(\n `SELECT COUNT(*) AS count FROM tasks WHERE target_device_id = ?\n AND status IN ('queued', 'assigned', 'running', 'cancelling')`,\n )\n .get(targetDeviceId)\n if ((outstanding?.count ?? 0) >= 100) {\n throw new Error(`Device ${targetDeviceId} has reached its outstanding task limit`)\n }\n if (thread !== undefined) {\n db.query(\n \"INSERT INTO threads (id, title, created_at, updated_at) VALUES (?, ?, ?, ?)\",\n ).run(thread.id, thread.title, thread.createdAt, thread.updatedAt)\n } else if (\n db\n .query<{ readonly id: string }, [string]>(\"SELECT id FROM threads WHERE id = ?\")\n .get(threadId) === null\n ) {\n throw new Error(`Unknown thread ${threadId}`)\n }\n db.query(\n `INSERT INTO tasks (\n id, thread_id, prompt, context, provider, status, source_device_id,\n target_device_id, parent_task_id, workspace, provider_session_id, bot_id,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n task.id,\n task.threadId,\n task.prompt,\n task.context ?? null,\n task.provider,\n task.status,\n task.sourceDeviceId ?? null,\n task.targetDeviceId,\n task.parentTaskId ?? null,\n task.workspace ?? null,\n task.providerSessionId ?? null,\n task.botId ?? null,\n task.createdAt,\n task.updatedAt,\n )\n recordTaskTraceEvent(task.id, \"queued\", \"Relay accepted the task\", timestamp)\n db.query(\n `INSERT INTO messages (\n id, thread_id, role, kind, author_id, author_name, content, created_at,\n task_id, device_id\n ) VALUES (?, ?, ?, 'chat', ?, ?, ?, ?, ?, ?)`,\n ).run(\n message.id,\n message.threadId,\n message.role,\n sourceDeviceId ?? \"user\",\n message.authorName,\n message.content,\n message.createdAt,\n message.taskId ?? null,\n message.deviceId ?? null,\n )\n db.query(\"UPDATE threads SET updated_at = ? WHERE id = ?\").run(timestamp, threadId)\n })(),\n catch: operationError(\"RelayStore.createDelegation\"),\n })\n return task\n })\n\n const threadContext = Effect.fn(\"RelayStore.threadContext\")(function* (threadId: ThreadId) {\n const threadRow = yield* Effect.try({\n try: () => db.query<ThreadRow, [string]>(\"SELECT * FROM threads WHERE id = ?\").get(threadId),\n catch: operationError(\"RelayStore.threadContext.thread\"),\n })\n if (threadRow === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.threadContext\",\n message: `Unknown thread ${threadId}`,\n }),\n )\n }\n const [messageRows, taskRows] = yield* Effect.try({\n try: () =>\n [\n db\n .query<MessageRow, [string]>(\n `SELECT * FROM (\n SELECT * FROM messages WHERE thread_id = ?\n ORDER BY created_at DESC, id DESC LIMIT 21\n ) ORDER BY created_at, id`,\n )\n .all(threadId),\n db\n .query<TaskRow, [string]>(\n `SELECT * FROM (\n SELECT * FROM tasks WHERE thread_id = ?\n ORDER BY created_at DESC, id DESC LIMIT 21\n ) ORDER BY created_at, id`,\n )\n .all(threadId),\n ] as const,\n catch: operationError(\"RelayStore.threadContext.items\"),\n })\n const [thread, messages, tasks] = yield* Effect.all([\n threadFromRow(threadRow),\n Effect.forEach(messageRows.slice(-20), messageFromRow),\n Effect.forEach(taskRows.slice(-20), taskFromRow),\n ])\n const recentMessages = recentWithin(messages, 256 * 1024)\n const recentTasks = recentWithin(tasks, 768 * 1024)\n return ThreadContext.make({\n thread,\n messages: recentMessages.items,\n tasks: recentTasks.items,\n truncated:\n messageRows.length > 20 ||\n taskRows.length > 20 ||\n recentMessages.truncated ||\n recentTasks.truncated,\n })\n })\n\n const pendingTasksFor = Effect.fn(\"RelayStore.pendingTasksFor\")(function* (deviceId: DeviceId) {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<TaskRow, [string]>(\n `SELECT * FROM tasks WHERE target_device_id = ?\n AND status IN ('queued', 'cancelling') ORDER BY created_at, id LIMIT 100`,\n )\n .all(deviceId),\n catch: operationError(\"RelayStore.pendingTasksFor\"),\n })\n return yield* Effect.forEach(rows, taskFromRow)\n })\n\n const transition = Effect.fn(\"RelayStore.transition\")(function* (\n taskId: TaskId,\n expected: ReadonlyArray<TaskStatus>,\n update: TaskUpdate,\n event?: { readonly kind: TaskTraceEventKind; readonly detail: string },\n ) {\n const current = yield* getTask(taskId)\n if (!expected.includes(current.status)) {\n return current\n }\n const placeholders = expected.map(() => \"?\").join(\", \")\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const result = db\n .query(\n `UPDATE tasks SET status = ?, provider_session_id = ?, result = ?, error = ?,\n started_at = ?, completed_at = ?, updated_at = ?\n WHERE id = ? AND status IN (${placeholders})`,\n )\n .run(\n update.status ?? current.status,\n update.providerSessionId ?? current.providerSessionId ?? null,\n update.result ?? current.result ?? null,\n update.error ?? current.error ?? null,\n update.startedAt ?? current.startedAt ?? null,\n update.completedAt ?? current.completedAt ?? null,\n timestamp,\n taskId,\n ...expected,\n )\n if (result.changes === 1 && event !== undefined) {\n recordTaskTraceEvent(taskId, event.kind, event.detail, timestamp)\n }\n if (\n result.changes === 1 &&\n update.status !== undefined &&\n [\"completed\", \"failed\", \"cancelled\"].includes(update.status)\n ) {\n pruneTerminalHistory(taskId)\n }\n })(),\n catch: operationError(\"RelayStore.transition\"),\n })\n return yield* getTask(taskId)\n })\n\n const assignTask = Effect.fn(\"RelayStore.assignTask\")(function* (taskId: TaskId) {\n const current = yield* getTask(taskId)\n if (current.status !== \"queued\") {\n return current\n }\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const result = db\n .query(\n `UPDATE tasks SET status = 'assigned', updated_at = ?\n WHERE id = ? AND status = 'queued' AND NOT EXISTS (\n SELECT 1 FROM tasks active\n WHERE active.target_device_id = ? AND active.id <> ?\n AND CASE WHEN active.provider = 'grok-bot'\n THEN 'grok-bot:' || active.bot_id ELSE 'cli' END = ?\n AND active.status IN ('assigned', 'running', 'cancelling')\n ) AND NOT EXISTS (\n SELECT 1 FROM device_operations active\n WHERE active.target_device_id = ?\n AND active.status IN ('assigned', 'running')\n )`,\n )\n .run(\n timestamp,\n taskId,\n current.targetDeviceId,\n taskId,\n taskSlot(current),\n current.targetDeviceId,\n )\n if (result.changes === 1) {\n recordTaskTraceEvent(\n taskId,\n \"assigned\",\n \"Relay dispatched the task over the device WebSocket\",\n timestamp,\n )\n }\n })(),\n catch: operationError(\"RelayStore.assignTask\"),\n })\n return yield* getTask(taskId)\n })\n\n const requireTarget = Effect.fn(\"RelayStore.requireTarget\")(function* (\n taskId: TaskId,\n deviceId: DeviceId,\n ) {\n const task = yield* getTask(taskId)\n if (task.targetDeviceId !== deviceId) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.requireTarget\",\n message: `Task ${taskId} belongs to another device`,\n }),\n )\n }\n return task\n })\n\n const terminal = Effect.fn(\"RelayStore.terminal\")(function* (\n taskId: TaskId,\n deviceId: DeviceId,\n status: \"completed\" | \"failed\" | \"cancelled\",\n result?: string,\n error?: string,\n providerSessionId?: string,\n ) {\n const current = yield* requireTarget(taskId, deviceId)\n if ([\"completed\", \"failed\", \"cancelled\"].includes(current.status)) {\n return current\n }\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const updated = db\n .query(\n `UPDATE tasks SET status = ?, result = ?, error = ?, provider_session_id = ?,\n completed_at = ?, updated_at = ? WHERE id = ?\n AND status NOT IN ('completed', 'failed', 'cancelled')`,\n )\n .run(\n status,\n result ?? null,\n error ?? null,\n current.provider === \"grok-bot\"\n ? null\n : (providerSessionId ?? current.providerSessionId ?? null),\n timestamp,\n timestamp,\n taskId,\n )\n if (updated.changes !== 1) {\n return\n }\n recordTaskTraceEvent(\n taskId,\n status,\n status === \"completed\"\n ? \"Target device completed the task\"\n : status === \"failed\"\n ? \"Target device reported a task failure\"\n : \"Target device acknowledged cancellation\",\n timestamp,\n )\n if (current.provider !== \"grok-bot\" && providerSessionId !== undefined) {\n db.query(\n `INSERT INTO provider_sessions (thread_id, device_id, provider, session_id, updated_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(thread_id, device_id, provider) DO UPDATE SET\n session_id = excluded.session_id, updated_at = excluded.updated_at`,\n ).run(current.threadId, deviceId, current.provider, providerSessionId, timestamp)\n }\n const content = result ?? error\n if (content !== undefined) {\n const role = status === \"completed\" ? \"agent\" : \"system\"\n db.query(\n `INSERT INTO messages (\n id, thread_id, role, kind, author_id, author_name, content, created_at,\n task_id, device_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n makeMessageId(),\n current.threadId,\n role,\n status === \"failed\" ? \"error\" : \"chat\",\n deviceId,\n status === \"completed\" ? providerName(current.provider) : \"Cohall\",\n content,\n timestamp,\n taskId,\n deviceId,\n )\n db.query(\"UPDATE threads SET updated_at = ? WHERE id = ?\").run(\n timestamp,\n current.threadId,\n )\n }\n pruneTerminalHistory(taskId)\n })(),\n catch: operationError(\"RelayStore.terminal\"),\n })\n return yield* getTask(taskId)\n })\n\n const requestCancellation = Effect.fn(\"RelayStore.requestCancellation\")(function* (\n taskId: TaskId,\n ) {\n const current = yield* getTask(taskId)\n if ([\"completed\", \"failed\", \"cancelled\"].includes(current.status)) {\n return current\n }\n if (current.provider === \"grok-bot\" && current.status !== \"queued\") {\n return yield* new PersistenceError({\n operation: \"RelayStore.requestCancellation\",\n message:\n \"Stop this bot in Grok Bot; its gateway cannot cancel an individual Cohall request\",\n })\n }\n if (current.status === \"cancelling\") {\n return current\n }\n const timestamp = now()\n return current.status === \"queued\"\n ? yield* transition(\n taskId,\n [\"queued\"],\n { status: \"cancelled\", completedAt: timestamp },\n { kind: \"cancelled\", detail: \"Client cancelled the task before dispatch\" },\n )\n : yield* transition(\n taskId,\n [\"assigned\", \"running\"],\n {\n status: \"cancelling\",\n },\n { kind: \"cancelling\", detail: \"Client requested task cancellation\" },\n )\n })\n\n const requeueTasksFor = Effect.fn(\"RelayStore.requeueTasksFor\")(function* (deviceId: DeviceId) {\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const interrupted = db\n .query<{ readonly id: string }, [string]>(\n `SELECT id FROM tasks WHERE target_device_id = ?\n AND status IN ('assigned', 'running')`,\n )\n .all(deviceId)\n db.query(\n `UPDATE tasks SET status = 'queued', updated_at = ?\n WHERE target_device_id = ? AND status IN ('assigned', 'running')`,\n ).run(timestamp, deviceId)\n for (const task of interrupted) {\n recordTaskTraceEvent(\n TaskId.make(task.id),\n \"requeued\",\n \"Target device disconnected before task completion\",\n timestamp,\n )\n }\n })(),\n catch: operationError(\"RelayStore.requeueTasksFor\"),\n })\n })\n\n const sessionFor = Effect.fn(\"RelayStore.sessionFor\")(function* (\n threadId: ThreadId,\n deviceId: DeviceId,\n provider: Provider,\n ) {\n const row = yield* Effect.try({\n try: () =>\n db\n .query<{ readonly session_id: string }, [string, string, string]>(\n `SELECT session_id FROM provider_sessions\n WHERE thread_id = ? AND device_id = ? AND provider = ?`,\n )\n .get(threadId, deviceId, provider),\n catch: operationError(\"RelayStore.sessionFor\"),\n })\n return row?.session_id\n })\n\n const createPairing = Effect.fn(\"RelayStore.createPairing\")(function* (\n input: CreatePairingInput,\n ) {\n const roles = [...new Set(input.roles)]\n if (roles.length === 0) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.createPairing\",\n message: \"A pairing must allow at least one role\",\n }),\n )\n }\n const token = secret(\"pair\")\n const expiresAt = new Date(Date.now() + 10 * 60 * 1_000).toISOString()\n yield* Effect.try({\n try: () =>\n db\n .query(\n `INSERT INTO auth_pairings (token_hash, label, roles_json, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(tokenHash(token), input.label, JSON.stringify(roles), expiresAt, now()),\n catch: operationError(\"RelayStore.createPairing\"),\n })\n return PairingCredential.make({ token, expiresAt: Timestamp.make(expiresAt) })\n })\n\n const exchangePairing = Effect.fn(\"RelayStore.exchangePairing\")(function* (token: string) {\n const timestamp = now()\n const expiresAt = new Date(Date.now() + 90 * 24 * 60 * 60 * 1_000).toISOString()\n const created = yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const pairing = db\n .query<PairingRow, [string, string]>(\n `SELECT * FROM auth_pairings\n WHERE token_hash = ? AND used_at IS NULL AND expires_at > ?`,\n )\n .get(tokenHash(token), timestamp)\n if (pairing === null) {\n throw new Error(\"Pairing credential is invalid, expired, or already used\")\n }\n const roles = Schema.decodeUnknownSync(Schema.Array(ConnectionRole))(\n JSON.parse(pairing.roles_json),\n )\n const deviceId = roles.includes(\"device\") ? makeDeviceId() : undefined\n const consumed = db\n .query(\"UPDATE auth_pairings SET used_at = ? WHERE token_hash = ? AND used_at IS NULL\")\n .run(timestamp, pairing.token_hash)\n if (consumed.changes !== 1) {\n throw new Error(\"Pairing credential was already used\")\n }\n return [...new Set(roles)].map((role) => {\n const sessionToken = secret(\"session\")\n const row = {\n id: makeAuthSessionId(),\n token_hash: tokenHash(sessionToken),\n label: pairing.label,\n roles_json: JSON.stringify([role]),\n created_at: timestamp,\n expires_at: expiresAt,\n last_seen_at: timestamp,\n bound_device_id: role === \"device\" ? (deviceId ?? null) : null,\n revoked_at: null,\n } satisfies AuthSessionRow\n db.query(\n `INSERT INTO auth_sessions (\n id, token_hash, label, roles_json, created_at, expires_at, last_seen_at,\n bound_device_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n row.id,\n row.token_hash,\n row.label,\n row.roles_json,\n row.created_at,\n row.expires_at,\n row.last_seen_at,\n row.bound_device_id,\n )\n return { token: sessionToken, row }\n })\n })(),\n catch: operationError(\"RelayStore.exchangePairing\"),\n })\n const credentials = yield* Effect.forEach(created, ({ token: sessionToken, row }) =>\n authSessionFromRow(row).pipe(Effect.map((session) => ({ token: sessionToken, session }))),\n )\n return PairingResult.make({ credentials })\n })\n\n const authenticateSession = Effect.fn(\"RelayStore.authenticateSession\")(function* (\n token: string,\n role: ConnectionRoleName,\n ) {\n const row = yield* Effect.try({\n try: () =>\n db\n .query<AuthSessionRow, [string, string]>(\n `SELECT * FROM auth_sessions\n WHERE token_hash = ? AND revoked_at IS NULL AND expires_at > ?`,\n )\n .get(tokenHash(token), now()),\n catch: operationError(\"RelayStore.authenticateSession\"),\n })\n if (row === null || !rolesFromRow(row).includes(role)) {\n return undefined\n }\n const lastSeenAt = now()\n yield* Effect.try({\n try: () =>\n db.query(\"UPDATE auth_sessions SET last_seen_at = ? WHERE id = ?\").run(lastSeenAt, row.id),\n catch: operationError(\"RelayStore.authenticateSession.touch\"),\n })\n const session = yield* authSessionFromRow(row)\n return AuthSession.make({ ...session, lastSeenAt })\n })\n\n const listAuthSessions = Effect.fn(\"RelayStore.listAuthSessions\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<AuthSessionRow, []>(\n \"SELECT * FROM auth_sessions ORDER BY created_at DESC, id LIMIT 1000\",\n )\n .all(),\n catch: operationError(\"RelayStore.listAuthSessions\"),\n })\n return yield* Effect.forEach(rows, authSessionFromRow)\n })\n\n const revokeAuthSession = Effect.fn(\"RelayStore.revokeAuthSession\")(function* (\n sessionId: AuthSessionId,\n ) {\n const revokedAt = now()\n const result = yield* Effect.try({\n try: () =>\n db\n .query(\"UPDATE auth_sessions SET revoked_at = ? WHERE id = ? AND revoked_at IS NULL\")\n .run(revokedAt, sessionId),\n catch: operationError(\"RelayStore.revokeAuthSession\"),\n })\n if (result.changes !== 1) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.revokeAuthSession\",\n message: `Unknown or already revoked session ${sessionId}`,\n }),\n )\n }\n const row = db\n .query<AuthSessionRow, [string]>(\"SELECT * FROM auth_sessions WHERE id = ?\")\n .get(sessionId)\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.revokeAuthSession.read\",\n message: `Session ${sessionId} disappeared after revocation`,\n }),\n )\n }\n return yield* authSessionFromRow(row)\n })\n\n return Service.of({\n recover,\n listDevices,\n usage,\n forgetDevice,\n upsertDevice,\n heartbeat: (deviceId, status, bots) => updateDeviceStatus(deviceId, status, bots),\n markDeviceOffline: (deviceId) => updateDeviceStatus(deviceId, \"offline\"),\n createDelegation,\n getTask,\n traceTask,\n threadContext,\n pendingTasksFor,\n assignTask,\n rollbackAssignment: (taskId) =>\n transition(\n taskId,\n [\"assigned\"],\n { status: \"queued\" },\n { kind: \"requeued\", detail: \"Target device was unavailable during dispatch\" },\n ),\n acceptTask: (taskId, deviceId) =>\n requireTarget(taskId, deviceId).pipe(\n Effect.flatMap(() =>\n transition(\n taskId,\n [\"assigned\"],\n { status: \"running\", startedAt: now() },\n { kind: \"running\", detail: \"Target device accepted the task and started the provider\" },\n ),\n ),\n ),\n finishTask: (taskId, deviceId, result, providerSessionId) =>\n terminal(taskId, deviceId, \"completed\", result, undefined, providerSessionId),\n failTask: (taskId, deviceId, error) => terminal(taskId, deviceId, \"failed\", undefined, error),\n acknowledgeCancellation: (taskId, deviceId) => terminal(taskId, deviceId, \"cancelled\"),\n requestCancellation,\n requeueTasksFor,\n createUpgradeOperations,\n listOperations,\n abandonOperation,\n pendingOperationsFor,\n assignOperation,\n rollbackOperation: (operationId) => transitionOperation(operationId, [\"assigned\"], \"queued\"),\n acceptOperation,\n finishOperation,\n failOperation,\n requeueOperationsFor,\n sessionFor,\n createPairing,\n exchangePairing,\n authenticateSession,\n listAuthSessions,\n revokeAuthSession,\n })\n}\n\nconst migrate = (db: Database): Effect.Effect<void, PersistenceError> =>\n Effect.try({\n try: () => {\n db.exec(\"PRAGMA journal_mode = WAL\")\n db.exec(\"PRAGMA foreign_keys = ON\")\n db.exec(\"PRAGMA busy_timeout = 5000\")\n db.exec(`\n CREATE TABLE IF NOT EXISTS devices (\n id TEXT PRIMARY KEY, name TEXT NOT NULL, hostname TEXT NOT NULL,\n platform TEXT NOT NULL, architecture TEXT NOT NULL, status TEXT NOT NULL,\n providers_json TEXT NOT NULL, bots_json TEXT, capabilities_json TEXT NOT NULL,\n workspaces_json TEXT NOT NULL, version TEXT NOT NULL, last_seen_at TEXT NOT NULL,\n connected_at TEXT, forgotten_at TEXT\n );\n CREATE TABLE IF NOT EXISTS threads (\n id TEXT PRIMARY KEY, title TEXT NOT NULL, created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL, archived_at TEXT,\n default_device_id TEXT REFERENCES devices(id)\n );\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY, thread_id TEXT NOT NULL REFERENCES threads(id) ON DELETE CASCADE,\n role TEXT NOT NULL, kind TEXT NOT NULL DEFAULT 'chat', author_id TEXT NOT NULL,\n author_name TEXT NOT NULL, content TEXT NOT NULL, created_at TEXT NOT NULL,\n task_id TEXT, reply_to TEXT, device_id TEXT REFERENCES devices(id)\n );\n CREATE INDEX IF NOT EXISTS messages_thread_created ON messages(thread_id, created_at);\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY, thread_id TEXT NOT NULL REFERENCES threads(id) ON DELETE CASCADE,\n prompt TEXT NOT NULL, context TEXT, provider TEXT NOT NULL, bot_id TEXT, status TEXT NOT NULL,\n source_device_id TEXT REFERENCES devices(id),\n target_device_id TEXT NOT NULL REFERENCES devices(id), parent_task_id TEXT,\n workspace TEXT, provider_session_id TEXT, result TEXT, error TEXT,\n created_at TEXT NOT NULL, updated_at TEXT NOT NULL, started_at TEXT, completed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS tasks_thread_created ON tasks(thread_id, created_at);\n CREATE INDEX IF NOT EXISTS tasks_target_status ON tasks(target_device_id, status);\n CREATE TABLE IF NOT EXISTS task_trace_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n kind TEXT NOT NULL, created_at TEXT NOT NULL, detail TEXT\n );\n CREATE INDEX IF NOT EXISTS task_trace_events_task_id\n ON task_trace_events(task_id, id);\n CREATE TABLE IF NOT EXISTS provider_sessions (\n thread_id TEXT NOT NULL REFERENCES threads(id) ON DELETE CASCADE,\n device_id TEXT NOT NULL REFERENCES devices(id) ON DELETE CASCADE,\n provider TEXT NOT NULL, session_id TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY(thread_id, device_id, provider)\n );\n CREATE TABLE IF NOT EXISTS device_operations (\n id TEXT PRIMARY KEY, kind TEXT NOT NULL, status TEXT NOT NULL,\n target_device_id TEXT NOT NULL REFERENCES devices(id),\n requested_version TEXT NOT NULL, restart INTEGER NOT NULL,\n result TEXT, error TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n completed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS device_operations_target_status\n ON device_operations(target_device_id, status);\n CREATE TABLE IF NOT EXISTS auth_pairings (\n token_hash TEXT PRIMARY KEY, label TEXT NOT NULL, roles_json TEXT NOT NULL,\n expires_at TEXT NOT NULL, created_at TEXT NOT NULL, used_at TEXT\n );\n CREATE TABLE IF NOT EXISTS auth_sessions (\n id TEXT PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE, label TEXT NOT NULL,\n roles_json TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT NOT NULL,\n last_seen_at TEXT NOT NULL, bound_device_id TEXT, revoked_at TEXT\n );\n CREATE INDEX IF NOT EXISTS auth_sessions_token ON auth_sessions(token_hash);\n `)\n const deviceColumns = db\n .query<{ readonly name: string }, []>(\"PRAGMA table_info(devices)\")\n .all()\n if (!deviceColumns.some((column) => column.name === \"forgotten_at\")) {\n db.exec(\"ALTER TABLE devices ADD COLUMN forgotten_at TEXT\")\n }\n if (!deviceColumns.some((column) => column.name === \"bots_json\")) {\n db.exec(\"ALTER TABLE devices ADD COLUMN bots_json TEXT\")\n }\n const taskColumns = db.query<{ readonly name: string }, []>(\"PRAGMA table_info(tasks)\").all()\n if (!taskColumns.some((column) => column.name === \"bot_id\")) {\n db.exec(\"ALTER TABLE tasks ADD COLUMN bot_id TEXT\")\n }\n },\n catch: operationError(\"RelayStore.migrate\"),\n })\n\nexport const layer = (path: string, retainedTerminalTasks = 1_000) =>\n Layer.effect(\n Service,\n Effect.acquireRelease(\n Effect.try({\n try: () => new Database(path),\n catch: operationError(\"RelayStore.open\"),\n }).pipe(Effect.tap(migrate)),\n (db) => Effect.sync(() => db.close()),\n ).pipe(Effect.map((db) => makeService(db, retainedTerminalTasks))),\n )\n\nexport const layerFromDatabase = (db: Database) =>\n Layer.effect(Service, migrate(db).pipe(Effect.map(() => makeService(db))))\n\nexport * as RelayStore from \"./store.ts\"\n",
10
- "import {\n AuthSessionId,\n Device,\n DeviceId,\n OperationId,\n SocketEvent,\n maxSocketPayloadBytes,\n TaskId,\n ThreadId,\n decodeCreatePairingInput,\n decodeCreateTaskInput,\n decodeCreateUpgradeOperationsInput,\n decodeExchangePairingInput,\n decodeSocketEvent,\n now,\n version,\n type AuthSession,\n type CreateTaskInput,\n type DeviceId as DeviceIdType,\n type DeviceOperation,\n type Task,\n} from \"@cohall/protocol\"\nimport { Effect, ManagedRuntime, Schema } from \"effect\"\nimport { createHash, timingSafeEqual } from \"node:crypto\"\nimport { access, chmod } from \"node:fs/promises\"\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\"\nimport type { ListenOptions } from \"node:net\"\nimport { platform } from \"node:os\"\nimport { WebSocketServer, type RawData } from \"ws\"\nimport { loadEnvironmentConfiguration, type RelayConfiguration } from \"./config.ts\"\nimport { Hub, type ConnectionSocket } from \"./hub.ts\"\nimport { RelayStore } from \"./store.ts\"\n\ntype RelayListenOptions = ListenOptions | { readonly fd: number }\n\nclass RequestError extends Schema.TaggedErrorClass<RequestError>()(\"Relay.RequestError\", {\n status: Schema.Int,\n message: Schema.String,\n}) {}\n\nexport const relayListenOptions = (\n configuration: Pick<RelayConfiguration, \"host\" | \"port\">,\n environment: NodeJS.ProcessEnv = process.env,\n pid = process.pid,\n): RelayListenOptions => {\n const listenPid = Number(environment.LISTEN_PID)\n const listenFds = Number(environment.LISTEN_FDS)\n if (listenPid !== pid || !Number.isInteger(listenFds) || listenFds < 1) {\n return { host: configuration.host, port: configuration.port }\n }\n\n const descriptorNames = environment.LISTEN_FDNAMES?.split(\":\") ?? []\n const namedIndex = descriptorNames.indexOf(\"cohall-relay\")\n if (namedIndex >= 0 && namedIndex < listenFds) {\n return { fd: 3 + namedIndex }\n }\n if (listenFds === 1) {\n return { fd: 3 }\n }\n throw new Error(\"Cohall received multiple systemd sockets but none was named cohall-relay\")\n}\n\nconst json = (value: unknown, status = 200): Response =>\n Response.json(value, {\n status,\n headers: {\n \"cache-control\": \"no-store\",\n \"x-content-type-options\": \"nosniff\",\n },\n })\n\nconst requestBody = (request: IncomingMessage, limit: number): Promise<Buffer | undefined> => {\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n return Promise.resolve(undefined)\n }\n return new Promise((resolve, reject) => {\n const chunks: Array<Buffer> = []\n let size = 0\n const cleanup = (): void => {\n request.off(\"data\", onData)\n request.off(\"end\", onEnd)\n request.off(\"error\", onError)\n }\n const onData = (chunk: Buffer): void => {\n size += chunk.byteLength\n if (size <= limit) {\n chunks.push(chunk)\n return\n }\n cleanup()\n reject(new Error(\"Request body exceeded 256 KiB\"))\n }\n const onEnd = (): void => {\n cleanup()\n resolve(Buffer.concat(chunks, size))\n }\n const onError = (cause: Error): void => {\n cleanup()\n reject(cause)\n }\n request.on(\"data\", onData)\n request.once(\"end\", onEnd)\n request.once(\"error\", onError)\n })\n}\n\nconst webRequest = async (request: IncomingMessage): Promise<Request> => {\n const headers = new Headers()\n for (let index = 0; index < request.rawHeaders.length; index += 2) {\n const name = request.rawHeaders[index]\n const value = request.rawHeaders[index + 1]\n if (name !== undefined && value !== undefined) {\n headers.append(name, value)\n }\n }\n const payload = await requestBody(request, 256 * 1024)\n return new Request(new URL(request.url ?? \"/\", \"http://cohall.local\"), {\n method: request.method ?? \"GET\",\n headers,\n ...(payload === undefined ? {} : { body: new Uint8Array(payload) }),\n })\n}\n\nconst sendResponse = async (target: ServerResponse, response: Response): Promise<void> => {\n target.statusCode = response.status\n response.headers.forEach((value, name) => target.setHeader(name, value))\n target.end(Buffer.from(await response.arrayBuffer()))\n}\n\nconst socketText = (message: RawData): string => {\n if (Buffer.isBuffer(message)) {\n return message.toString(\"utf8\")\n }\n if (message instanceof ArrayBuffer) {\n return Buffer.from(message).toString(\"utf8\")\n }\n if (Array.isArray(message)) {\n return Buffer.concat(message).toString(\"utf8\")\n }\n return Buffer.from(message).toString(\"utf8\")\n}\n\nconst rejectUpgrade = (socket: NodeJS.WritableStream, status: number, message: string): void => {\n socket.write(`HTTP/1.1 ${status} ${message}\\r\\nConnection: close\\r\\nContent-Length: 0\\r\\n\\r\\n`)\n if (\"destroy\" in socket && typeof socket.destroy === \"function\") {\n socket.destroy()\n }\n}\n\nconst body = <A, E, R>(\n request: Request,\n decode: (input: unknown) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, RequestError, R> =>\n Effect.tryPromise({\n try: () => request.json(),\n catch: () => new RequestError({ status: 400, message: \"Expected a JSON request body\" }),\n }).pipe(\n Effect.flatMap(decode),\n Effect.mapError((cause) =>\n cause instanceof RequestError\n ? cause\n : new RequestError({ status: 400, message: String(cause).slice(0, 2_048) }),\n ),\n )\n\nconst pathId = <S extends Schema.Top & { readonly DecodingServices: never }>(\n schema: S,\n value: string,\n): Effect.Effect<S[\"Type\"], RequestError> =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError(\n () => new RequestError({ status: 400, message: `Invalid identifier: ${value}` }),\n ),\n )\n\nconst scoreDevice = (\n device: Device,\n input: CreateTaskInput,\n sourceDeviceId: DeviceIdType | undefined,\n): number => {\n const prompt = `${input.prompt} ${input.context ?? \"\"}`.toLowerCase()\n const needsXcode = /\\b(xcode|ios|macos|swiftui|app store)\\b/.test(prompt)\n const needsBrowser =\n /\\b(browser|chrome|youtube|twitter|logged[- ]?in|signed[- ]?in|x\\.com)\\b/.test(prompt)\n return (\n (device.status === \"offline\" ? 0 : 100) +\n (input.workspace !== undefined &&\n device.workspaces.some(\n (workspace) =>\n input.workspace === workspace.path || input.workspace?.startsWith(`${workspace.path}/`),\n )\n ? 80\n : 0) +\n (needsXcode && device.capabilities.some((capability) => capability.id === \"xcode\") ? 60 : 0) +\n (needsBrowser && device.capabilities.some((capability) => capability.id === \"browser-session\")\n ? 40\n : 0) +\n (sourceDeviceId === device.id ? -5 : 0)\n )\n}\n\nexport const chooseDevice = (\n input: CreateTaskInput,\n sourceDeviceId?: DeviceIdType,\n): Effect.Effect<DeviceIdType, RequestError, RelayStore.Service> =>\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n const devices = yield* store\n .listDevices()\n .pipe(Effect.mapError((cause) => new RequestError({ status: 500, message: cause.message })))\n const provider = input.provider ?? (input.botId === undefined ? \"codex\" : \"grok-bot\")\n if (input.targetDeviceId !== undefined) {\n const target = devices.find((device) => device.id === input.targetDeviceId)\n if (target === undefined) {\n return yield* new RequestError({\n status: 404,\n message: `Unknown target device ${input.targetDeviceId}`,\n })\n }\n if (!target.providers.includes(provider)) {\n return yield* new RequestError({\n status: 409,\n message: `${target.name} does not advertise the ${provider} provider`,\n })\n }\n if (input.botId !== undefined && !target.bots?.some((bot) => bot.id === input.botId)) {\n return yield* new RequestError({\n status: 404,\n message: `${target.name} does not advertise bot ${input.botId}; refresh the bot list`,\n })\n }\n return target.id\n }\n const candidates = devices.filter(\n (device) =>\n device.providers.includes(provider) &&\n (input.botId === undefined || device.bots?.some((bot) => bot.id === input.botId)),\n )\n if (input.botId !== undefined && candidates.length > 1) {\n return yield* new RequestError({\n status: 409,\n message: `Bot ${input.botId} is advertised by more than one device; select a device`,\n })\n }\n const selected = candidates.sort(\n (left, right) =>\n scoreDevice(right, input, sourceDeviceId) - scoreDevice(left, input, sourceDeviceId),\n )[0]\n if (selected === undefined) {\n return yield* new RequestError({\n status: 409,\n message:\n input.botId === undefined\n ? `No Cohall device advertises the ${provider} provider`\n : `No Cohall device advertises bot ${input.botId}; refresh the bot list`,\n })\n }\n return selected.id\n })\n\ntype Principal = \"owner\" | AuthSession\n\nexport const runRelay = async (): Promise<void> => {\n const configuration = await Effect.runPromise(loadEnvironmentConfiguration)\n process.umask(0o077)\n const runtime = ManagedRuntime.make(\n RelayStore.layer(configuration.databasePath, configuration.historyTaskLimit),\n )\n const run = <A, E>(effect: Effect.Effect<A, E, RelayStore.Service>): Promise<A> =>\n runtime.runPromise(effect)\n await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n yield* store.recover()\n }),\n )\n if (\n platform() !== \"win32\" &&\n (await access(configuration.databasePath)\n .then(() => true)\n .catch(() => false))\n ) {\n await chmod(configuration.databasePath, 0o600)\n }\n\n const hub = new Hub()\n let connections = 0\n\n const tokenDigest = (token: string): Buffer => createHash(\"sha256\").update(token).digest()\n const ownerToken = (token: string): boolean =>\n timingSafeEqual(tokenDigest(token), tokenDigest(configuration.token))\n\n const authenticate = async (\n token: string,\n role: \"client\" | \"device\",\n ): Promise<Principal | undefined> => {\n if (ownerToken(token)) {\n return \"owner\"\n }\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.authenticateSession(token, role)\n }),\n ).catch(() => undefined)\n }\n\n const principalFor = async (request: Request): Promise<Principal | undefined> => {\n const authorization = request.headers.get(\"authorization\")\n if (authorization?.startsWith(\"Bearer \") !== true) {\n return undefined\n }\n return authenticate(authorization.slice(\"Bearer \".length), \"client\")\n }\n\n const dispatch = async (task: Task): Promise<Task> => {\n const assigned = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.assignTask(task.id)\n }),\n )\n if (assigned.status !== \"assigned\") {\n return assigned\n }\n if (\n hub.sendToDevice(\n assigned.targetDeviceId,\n SocketEvent.make({ _tag: \"TaskAssigned\", task: assigned }),\n )\n ) {\n return assigned\n }\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.rollbackAssignment(task.id)\n }),\n )\n }\n\n const dispatchOperation = async (operation: DeviceOperation): Promise<DeviceOperation> => {\n const assigned = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.assignOperation(operation.id)\n }),\n )\n if (assigned.status !== \"assigned\") {\n return assigned\n }\n if (\n hub.sendToDevice(\n assigned.targetDeviceId,\n SocketEvent.make({ _tag: \"OperationAssigned\", operation: assigned }),\n )\n ) {\n return assigned\n }\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.rollbackOperation(operation.id)\n }),\n )\n }\n\n const dispatchPendingOperations = async (deviceId: DeviceIdType): Promise<void> => {\n const operations = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.pendingOperationsFor(deviceId)\n }),\n )\n for (const operation of operations) {\n await dispatchOperation(operation)\n }\n }\n\n const dispatchPendingTasks = async (deviceId: DeviceIdType): Promise<void> => {\n const tasks = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.pendingTasksFor(deviceId)\n }),\n )\n for (const task of tasks) {\n if (task.status === \"cancelling\") {\n hub.sendToDevice(deviceId, SocketEvent.make({ _tag: \"CancelTask\", taskId: task.id }))\n } else {\n await dispatch(task)\n }\n }\n }\n\n const dispatchPending = async (deviceId: DeviceIdType): Promise<void> => {\n await dispatchPendingOperations(deviceId)\n await dispatchPendingTasks(deviceId)\n }\n\n const sendError = (socket: ConnectionSocket, code: string, message: string): void => {\n socket.send(\n JSON.stringify(\n SocketEvent.make({\n _tag: \"Error\",\n code: code.slice(0, 64),\n message: message.slice(0, 2_048),\n }),\n ),\n )\n }\n\n const handleSocketEvent = async (socket: ConnectionSocket, input: RawData): Promise<void> => {\n const event = await Effect.runPromise(\n Effect.try({\n try: () => JSON.parse(socketText(input)) as unknown,\n catch: () => new RequestError({ status: 400, message: \"Invalid socket JSON\" }),\n }).pipe(Effect.flatMap(decodeSocketEvent)),\n ).catch((cause: unknown) => {\n sendError(socket, \"invalid_event\", cause instanceof Error ? cause.message : String(cause))\n return undefined\n })\n if (event === undefined) {\n return\n }\n\n if (!hub.isAuthorized(socket)) {\n if (event._tag !== \"Authenticate\") {\n socket.close(4003, \"Authentication required\")\n return\n }\n const principal = await authenticate(event.token, \"device\")\n if (principal === undefined) {\n socket.close(4003, \"Authentication failed\")\n return\n }\n if (hub.pendingConnections() >= 64) {\n socket.close(4008, \"Pending device connection limit reached\")\n return\n }\n const attached = hub.attach(socket, {\n ...(principal === \"owner\" ? {} : { sessionId: principal.id }),\n ...(principal === \"owner\" || principal.deviceId === undefined\n ? {}\n : { boundDeviceId: principal.deviceId }),\n ...(principal === \"owner\" ? {} : { expiresAt: principal.expiresAt }),\n })\n if (!attached) {\n socket.close(4008, \"Credential connection limit reached\")\n return\n }\n socket.data.stageDeadline = setTimeout(() => {\n if (hub.deviceId(socket) === undefined) {\n socket.close(4003, \"Device registration timeout\")\n }\n }, 5_000)\n socket.send(\n JSON.stringify(\n SocketEvent.make({ _tag: \"Connected\", serverVersion: version, connectedAt: now() }),\n ),\n )\n return\n }\n\n if (event._tag === \"Authenticate\") {\n return\n }\n if (event._tag === \"DeviceHello\") {\n const bound = hub.boundDeviceId(socket)\n if (bound !== undefined && bound !== event.device.id) {\n socket.close(4003, \"Device identity does not match its session\")\n return\n }\n const device = Device.make({\n ...event.device,\n status: \"online\",\n connectedAt: now(),\n lastSeenAt: now(),\n })\n if (!hub.registerDevice(device.id, socket)) {\n socket.close(4009, \"Device is already connected\")\n return\n }\n await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n yield* store.upsertDevice(device)\n }),\n )\n // Reconcile work the daemon may still be running before an upgrade can occupy the device.\n await dispatchPendingTasks(device.id)\n await dispatchPendingOperations(device.id)\n return\n }\n\n const deviceId = hub.deviceId(socket)\n if (deviceId === undefined) {\n sendError(socket, \"device_hello_required\", \"Send DeviceHello before device events\")\n return\n }\n\n const settle = (taskId: TaskId): void => {\n socket.send(JSON.stringify(SocketEvent.make({ _tag: \"TaskSettled\", taskId })))\n }\n const settleOperation = (operationId: OperationId): void => {\n socket.send(JSON.stringify(SocketEvent.make({ _tag: \"OperationSettled\", operationId })))\n }\n const processed = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n switch (event._tag) {\n case \"DeviceHeartbeat\":\n if (event.deviceId === deviceId) {\n yield* store.heartbeat(\n deviceId,\n event.status === \"busy\" ? \"busy\" : \"online\",\n event.bots,\n )\n }\n return\n case \"TaskAccepted\":\n yield* store.acceptTask(event.taskId, deviceId)\n return\n case \"TaskFinished\":\n yield* store.finishTask(event.taskId, deviceId, event.result, event.providerSessionId)\n return\n case \"TaskFailed\":\n yield* store.failTask(event.taskId, deviceId, event.error)\n return\n case \"TaskCancelled\":\n yield* store.acknowledgeCancellation(event.taskId, deviceId)\n return\n case \"OperationAccepted\":\n yield* store.acceptOperation(event.operationId, deviceId)\n return\n case \"OperationFinished\":\n yield* store.finishOperation(event.operationId, deviceId, event.result)\n return\n case \"OperationFailed\":\n yield* store.failOperation(event.operationId, deviceId, event.error)\n return\n case \"Connected\":\n case \"TaskAssigned\":\n case \"TaskSettled\":\n case \"CancelTask\":\n case \"OperationAssigned\":\n case \"OperationSettled\":\n case \"Error\":\n return\n }\n }),\n )\n .then(() => true)\n .catch((cause: unknown) => {\n sendError(socket, \"event_failed\", cause instanceof Error ? cause.message : String(cause))\n return false\n })\n if (\n processed &&\n (event._tag === \"TaskFinished\" ||\n event._tag === \"TaskFailed\" ||\n event._tag === \"TaskCancelled\")\n ) {\n settle(event.taskId)\n await dispatchPending(deviceId)\n }\n if (processed && (event._tag === \"OperationFinished\" || event._tag === \"OperationFailed\")) {\n settleOperation(event.operationId)\n await dispatchPending(deviceId)\n }\n }\n\n const api = async (request: Request, url: URL): Promise<Response> => {\n if (url.pathname === \"/api/health\" && request.method === \"GET\") {\n return json({ ok: true, version })\n }\n if (url.pathname === \"/api/auth/pair\" && request.method === \"POST\") {\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n const input = yield* body(request, decodeExchangePairingInput)\n return yield* store.exchangePairing(input.token)\n }),\n )\n .then((value) => json(value, 201))\n .catch(() =>\n json({ error: \"Pairing credential is invalid, expired, or already used\" }, 401),\n )\n }\n\n const principal = await principalFor(request)\n if (principal === undefined) {\n return json({ error: \"Unauthorized\" }, 401)\n }\n const ownerOnly =\n url.pathname.startsWith(\"/api/auth/\") || url.pathname.startsWith(\"/api/operations\")\n if (ownerOnly && principal !== \"owner\") {\n return json({ error: \"Owner token required\" }, 403)\n }\n const sourceDeviceId = principal === \"owner\" ? undefined : principal.deviceId\n\n const effect = Effect.gen(function* () {\n const store = yield* RelayStore.Service\n if (url.pathname === \"/api/auth/pairings\" && request.method === \"POST\") {\n const input = yield* body(request, decodeCreatePairingInput)\n return json(yield* store.createPairing(input), 201)\n }\n if (url.pathname === \"/api/auth/sessions\" && request.method === \"GET\") {\n return json(yield* store.listAuthSessions())\n }\n const revoke = url.pathname.match(/^\\/api\\/auth\\/sessions\\/([^/]+)\\/revoke$/)\n if (request.method === \"POST\" && revoke?.[1] !== undefined) {\n const id = yield* pathId(AuthSessionId, revoke[1])\n const session = yield* store.revokeAuthSession(id)\n hub.closeSession(id)\n return json(session)\n }\n if (url.pathname === \"/api/devices\" && request.method === \"GET\") {\n return json(yield* store.listDevices())\n }\n if (url.pathname === \"/api/usage\" && request.method === \"GET\") {\n return json(yield* store.usage())\n }\n if (url.pathname === \"/api/operations\" && request.method === \"GET\") {\n return json(yield* store.listOperations())\n }\n if (url.pathname === \"/api/operations/upgrades\" && request.method === \"POST\") {\n const input = yield* body(request, decodeCreateUpgradeOperationsInput)\n const operations = yield* store.createUpgradeOperations(input)\n return json(\n yield* Effect.tryPromise(() => Promise.all(operations.map(dispatchOperation))),\n 201,\n )\n }\n const abandonOperation = url.pathname.match(/^\\/api\\/operations\\/([^/]+)\\/abandon$/)\n if (request.method === \"POST\" && abandonOperation?.[1] !== undefined) {\n const operation = yield* store.abandonOperation(\n yield* pathId(OperationId, abandonOperation[1]),\n )\n hub.sendToDevice(\n operation.targetDeviceId,\n SocketEvent.make({ _tag: \"OperationSettled\", operationId: operation.id }),\n )\n return json(operation)\n }\n const forgetDevice = url.pathname.match(/^\\/api\\/devices\\/([^/]+)\\/forget$/)\n if (request.method === \"POST\" && forgetDevice?.[1] !== undefined) {\n if (principal !== \"owner\") {\n return yield* new RequestError({ status: 403, message: \"Owner token required\" })\n }\n const id = yield* pathId(DeviceId, forgetDevice[1])\n if (hub.hasDevice(id)) {\n return yield* new RequestError({\n status: 409,\n message: `Device ${id} must be offline before it can be forgotten`,\n })\n }\n const forgotten = yield* store.forgetDevice(id)\n hub.closeDevice(id)\n return json(forgotten)\n }\n if (url.pathname === \"/api/tasks\" && request.method === \"POST\") {\n const input = yield* body(request, decodeCreateTaskInput)\n const target = yield* chooseDevice(input, sourceDeviceId)\n const providerSessionId =\n input.threadId === undefined || input.provider === \"grok-bot\"\n ? undefined\n : yield* store.sessionFor(input.threadId, target, input.provider ?? \"codex\")\n const task = yield* store.createDelegation(input, target, sourceDeviceId, providerSessionId)\n return json(yield* Effect.tryPromise(() => dispatch(task)), 201)\n }\n const task = url.pathname.match(/^\\/api\\/tasks\\/([^/]+)$/)\n if (request.method === \"GET\" && task?.[1] !== undefined) {\n return json(yield* store.getTask(yield* pathId(TaskId, task[1])))\n }\n const trace = url.pathname.match(/^\\/api\\/tasks\\/([^/]+)\\/trace$/)\n if (request.method === \"GET\" && trace?.[1] !== undefined) {\n return json(yield* store.traceTask(yield* pathId(TaskId, trace[1])))\n }\n const cancel = url.pathname.match(/^\\/api\\/tasks\\/([^/]+)\\/cancel$/)\n if (request.method === \"POST\" && cancel?.[1] !== undefined) {\n const id = yield* pathId(TaskId, cancel[1])\n const updated = yield* store.requestCancellation(id)\n if (updated.status === \"cancelling\") {\n hub.sendToDevice(\n updated.targetDeviceId,\n SocketEvent.make({ _tag: \"CancelTask\", taskId: id }),\n )\n }\n return json(updated)\n }\n const thread = url.pathname.match(/^\\/api\\/threads\\/([^/]+)$/)\n if (request.method === \"GET\" && thread?.[1] !== undefined) {\n return json(yield* store.threadContext(yield* pathId(ThreadId, thread[1])))\n }\n return yield* new RequestError({ status: 404, message: \"Route not found\" })\n }).pipe(\n Effect.mapError((cause) =>\n cause instanceof RequestError\n ? cause\n : new RequestError({\n status:\n cause._tag !== \"RelayStore.PersistenceError\"\n ? 500\n : cause.message.startsWith(\"Unknown\")\n ? 404\n : cause.message.includes(\"cannot cancel an individual Cohall request\")\n ? 409\n : cause.message.includes(\"outstanding task limit\")\n ? 429\n : cause.message.includes(\"must be offline\") ||\n cause.message.includes(\"still has outstanding tasks\") ||\n cause.message.includes(\"upgrade operation in progress\") ||\n cause.message === \"No Cohall devices are registered\" ||\n cause.message.startsWith(\"All-device operations support\")\n ? 409\n : 500,\n message: cause.message,\n }),\n ),\n )\n return run(effect).catch((cause: unknown) =>\n cause instanceof RequestError\n ? json(\n { error: cause.status === 500 ? \"Relay request failed\" : cause.message },\n cause.status,\n )\n : json({ error: \"Relay request failed\" }, 500),\n )\n }\n\n const websocketServer = new WebSocketServer({\n noServer: true,\n maxPayload: maxSocketPayloadBytes,\n perMessageDeflate: false,\n allowSynchronousEvents: false,\n })\n websocketServer.on(\"connection\", (rawSocket) => {\n const socket = rawSocket as ConnectionSocket\n socket.data = {\n processing: Promise.resolve(),\n stageDeadline: undefined,\n preAuthFrameReceived: false,\n queuedMessages: 0,\n closed: false,\n }\n connections += 1\n socket.data.stageDeadline = setTimeout(() => {\n if (!hub.isAuthorized(socket)) {\n socket.close(4003, \"Authentication timeout\")\n }\n }, 5_000)\n let alive = true\n socket.on(\"pong\", () => {\n alive = true\n })\n const heartbeat = setInterval(() => {\n if (!hub.isAuthorized(socket)) {\n return\n }\n if (!alive) {\n socket.terminate()\n return\n }\n alive = false\n socket.ping()\n }, 30_000)\n heartbeat.unref()\n\n socket.on(\"message\", (message: RawData) => {\n if (!hub.isAuthorized(socket)) {\n const size = Buffer.byteLength(socketText(message))\n if (socket.data.preAuthFrameReceived || size > 1_024) {\n socket.close(4003, \"Only one authentication frame is allowed\")\n return\n }\n socket.data.preAuthFrameReceived = true\n socket.data.processing = handleSocketEvent(socket, message).catch((cause: unknown) => {\n sendError(socket, \"event_failed\", cause instanceof Error ? cause.message : String(cause))\n })\n return\n }\n if (socket.data.queuedMessages >= 8) {\n socket.close(4008, \"Message queue limit reached\")\n return\n }\n socket.data.queuedMessages += 1\n socket.data.processing = socket.data.processing\n .then(() => (socket.data.closed ? undefined : handleSocketEvent(socket, message)))\n .catch((cause: unknown) => {\n sendError(socket, \"event_failed\", cause instanceof Error ? cause.message : String(cause))\n })\n .finally(() => {\n socket.data.queuedMessages = Math.max(0, socket.data.queuedMessages - 1)\n })\n })\n\n socket.once(\"close\", () => {\n clearInterval(heartbeat)\n socket.data.closed = true\n connections = Math.max(0, connections - 1)\n const deviceId = hub.detach(socket)\n if (deviceId === undefined) {\n return\n }\n void run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n yield* store.requeueTasksFor(deviceId)\n yield* store.requeueOperationsFor(deviceId)\n yield* store.markDeviceOffline(deviceId)\n }),\n ).catch((cause: unknown) => console.error(cause))\n })\n })\n\n const server = createServer((incoming, outgoing) => {\n void webRequest(incoming)\n .then((request) => {\n const url = new URL(request.url)\n return url.pathname.startsWith(\"/api/\")\n ? api(request, url)\n : json({ name: \"Cohall relay\", version, status: \"running\" })\n })\n .then((response) => sendResponse(outgoing, response))\n .catch((cause: unknown) =>\n sendResponse(\n outgoing,\n json(\n { error: cause instanceof Error ? cause.message : \"Invalid request\" },\n cause instanceof Error && cause.message.includes(\"256 KiB\") ? 413 : 400,\n ),\n ),\n )\n })\n server.on(\"upgrade\", (request, socket, head) => {\n const url = new URL(request.url ?? \"/\", \"http://cohall.local\")\n if (url.pathname !== \"/ws/device\") {\n rejectUpgrade(socket, 404, \"Not Found\")\n return\n }\n if (connections >= 1_024) {\n rejectUpgrade(socket, 503, \"Service Unavailable\")\n return\n }\n websocketServer.handleUpgrade(request, socket, head, (websocket) => {\n websocketServer.emit(\"connection\", websocket, request)\n })\n })\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(relayListenOptions(configuration), () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n\n const address = server.address()\n const listener =\n typeof address === \"string\"\n ? address\n : address?.family === \"IPv6\"\n ? `[${address.address}]:${address.port}`\n : `${address?.address ?? configuration.host}:${address?.port ?? configuration.port}`\n console.log(`Cohall relay listening on http://${listener}`)\n let stopping = false\n const shutdown = async (): Promise<void> => {\n if (stopping) {\n return\n }\n stopping = true\n for (const socket of websocketServer.clients) {\n socket.close(1001, \"Relay shutting down\")\n }\n await new Promise<void>((resolve) => server.close(() => resolve()))\n websocketServer.close()\n await runtime.dispose()\n }\n process.once(\"SIGINT\", () => void shutdown())\n process.once(\"SIGTERM\", () => void shutdown())\n}\n\nif (import.meta.main) {\n await runRelay().catch((cause: unknown) => {\n console.error(cause instanceof Error ? cause.message : String(cause))\n process.exitCode = 1\n })\n}\n",
9
+ "import {\n AuthSession,\n ConnectionRole,\n Device,\n DeviceId,\n DeviceOperation,\n DeviceUsage,\n Message,\n PairingCredential,\n PairingResult,\n Provider,\n Task,\n TaskId,\n TaskStatus,\n TaskTrace,\n TaskTraceEvent,\n TaskStatusCounts,\n Timestamp,\n Thread,\n ThreadContext,\n UsageSummary,\n assertDeviceOperationSupport,\n makeAuthSessionId,\n makeDeviceId,\n makeMessageId,\n makeOperationId,\n makeTaskId,\n makeThreadId,\n now,\n taskSlot,\n type AuthSessionId,\n type ConnectionRole as ConnectionRoleName,\n type CreatePairingInput,\n type CreateTaskInput,\n type CreateUpgradeOperationsInput,\n type OperationId,\n type OperationStatus,\n type TaskTraceEventKind,\n type ThreadId,\n} from \"@cohall/protocol\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport { createHash, randomBytes } from \"node:crypto\"\nimport { Database } from \"./database.ts\"\n\nexport class PersistenceError extends Schema.TaggedErrorClass<PersistenceError>()(\n \"RelayStore.PersistenceError\",\n { operation: Schema.String, message: Schema.String },\n) {}\n\ninterface ThreadRow {\n readonly id: string\n readonly title: string\n readonly created_at: string\n readonly updated_at: string\n readonly default_device_id: string | null\n}\n\ninterface MessageRow {\n readonly id: string\n readonly thread_id: string\n readonly role: string\n readonly author_name: string\n readonly content: string\n readonly created_at: string\n readonly task_id: string | null\n readonly device_id: string | null\n}\n\ninterface DeviceRow {\n readonly id: string\n readonly name: string\n readonly hostname: string\n readonly platform: string\n readonly architecture: string\n readonly status: string\n readonly providers_json: string\n readonly bots_json: string | null\n readonly capabilities_json: string\n readonly workspaces_json: string\n readonly version: string\n readonly last_seen_at: string\n readonly connected_at: string | null\n}\n\ninterface TaskRow {\n readonly id: string\n readonly thread_id: string\n readonly prompt: string\n readonly context: string | null\n readonly provider: string\n readonly bot_id: string | null\n readonly status: string\n readonly source_device_id: string | null\n readonly target_device_id: string\n readonly parent_task_id: string | null\n readonly workspace: string | null\n readonly provider_session_id: string | null\n readonly result: string | null\n readonly error: string | null\n readonly created_at: string\n readonly updated_at: string\n readonly started_at: string | null\n readonly completed_at: string | null\n}\n\ninterface TaskTraceEventRow {\n readonly id: number\n readonly kind: string\n readonly created_at: string\n readonly detail: string | null\n}\n\ninterface DeviceOperationRow {\n readonly id: string\n readonly kind: string\n readonly status: string\n readonly target_device_id: string\n readonly requested_version: string\n readonly restart: number\n readonly result: string | null\n readonly error: string | null\n readonly created_at: string\n readonly updated_at: string\n readonly completed_at: string | null\n}\n\ninterface UsageRow {\n readonly device_id: string\n readonly device_name: string\n readonly status: string\n readonly provider: string\n readonly tasks: number\n}\n\ninterface PairingRow {\n readonly token_hash: string\n readonly label: string\n readonly roles_json: string\n readonly expires_at: string\n readonly used_at: string | null\n}\n\ninterface AuthSessionRow {\n readonly id: string\n readonly token_hash: string\n readonly label: string\n readonly roles_json: string\n readonly created_at: string\n readonly expires_at: string\n readonly last_seen_at: string\n readonly bound_device_id: string | null\n readonly revoked_at: string | null\n}\n\nexport interface TaskUpdate {\n readonly status?: TaskStatus\n readonly providerSessionId?: string\n readonly result?: string\n readonly error?: string\n readonly startedAt?: Timestamp\n readonly completedAt?: Timestamp\n}\n\nexport interface Interface {\n readonly recover: () => Effect.Effect<void, PersistenceError>\n readonly listDevices: () => Effect.Effect<ReadonlyArray<Device>, PersistenceError>\n readonly usage: () => Effect.Effect<UsageSummary, PersistenceError>\n readonly forgetDevice: (deviceId: DeviceId) => Effect.Effect<Device, PersistenceError>\n readonly upsertDevice: (device: Device) => Effect.Effect<Device, PersistenceError>\n readonly heartbeat: (\n deviceId: DeviceId,\n status: \"online\" | \"busy\",\n bots?: Device[\"bots\"],\n ) => Effect.Effect<Device, PersistenceError>\n readonly markDeviceOffline: (deviceId: DeviceId) => Effect.Effect<Device, PersistenceError>\n readonly createDelegation: (\n input: CreateTaskInput,\n targetDeviceId: DeviceId,\n sourceDeviceId?: DeviceId,\n providerSessionId?: string,\n ) => Effect.Effect<Task, PersistenceError>\n readonly getTask: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly traceTask: (taskId: TaskId) => Effect.Effect<TaskTrace, PersistenceError>\n readonly threadContext: (threadId: ThreadId) => Effect.Effect<ThreadContext, PersistenceError>\n readonly pendingTasksFor: (\n deviceId: DeviceId,\n ) => Effect.Effect<ReadonlyArray<Task>, PersistenceError>\n readonly assignTask: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly markTaskDispatched: (taskId: TaskId) => Effect.Effect<void, PersistenceError>\n readonly rollbackAssignment: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly acceptTask: (taskId: TaskId, deviceId: DeviceId) => Effect.Effect<Task, PersistenceError>\n readonly finishTask: (\n taskId: TaskId,\n deviceId: DeviceId,\n result: string,\n providerSessionId?: string,\n ) => Effect.Effect<Task, PersistenceError>\n readonly failTask: (\n taskId: TaskId,\n deviceId: DeviceId,\n error: string,\n ) => Effect.Effect<Task, PersistenceError>\n readonly acknowledgeCancellation: (\n taskId: TaskId,\n deviceId: DeviceId,\n ) => Effect.Effect<Task, PersistenceError>\n readonly requestCancellation: (taskId: TaskId) => Effect.Effect<Task, PersistenceError>\n readonly requeueTasksFor: (deviceId: DeviceId) => Effect.Effect<void, PersistenceError>\n readonly createUpgradeOperations: (\n input: CreateUpgradeOperationsInput,\n ) => Effect.Effect<ReadonlyArray<DeviceOperation>, PersistenceError>\n readonly listOperations: () => Effect.Effect<ReadonlyArray<DeviceOperation>, PersistenceError>\n readonly abandonOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly pendingOperationsFor: (\n deviceId: DeviceId,\n ) => Effect.Effect<ReadonlyArray<DeviceOperation>, PersistenceError>\n readonly assignOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly rollbackOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly acceptOperation: (\n operationId: OperationId,\n deviceId: DeviceId,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly finishOperation: (\n operationId: OperationId,\n deviceId: DeviceId,\n result: string,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly failOperation: (\n operationId: OperationId,\n deviceId: DeviceId,\n error: string,\n ) => Effect.Effect<DeviceOperation, PersistenceError>\n readonly requeueOperationsFor: (deviceId: DeviceId) => Effect.Effect<void, PersistenceError>\n readonly sessionFor: (\n threadId: ThreadId,\n deviceId: DeviceId,\n provider: Provider,\n ) => Effect.Effect<string | undefined, PersistenceError>\n readonly createPairing: (\n input: CreatePairingInput,\n ) => Effect.Effect<PairingCredential, PersistenceError>\n readonly exchangePairing: (token: string) => Effect.Effect<PairingResult, PersistenceError>\n readonly authenticateSession: (\n token: string,\n role: ConnectionRoleName,\n ) => Effect.Effect<AuthSession | undefined, PersistenceError>\n readonly listAuthSessions: () => Effect.Effect<ReadonlyArray<AuthSession>, PersistenceError>\n readonly revokeAuthSession: (\n sessionId: AuthSessionId,\n ) => Effect.Effect<AuthSession, PersistenceError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@cohall/RelayStore\") {}\n\nconst operationError =\n (operation: string) =>\n (cause: unknown): PersistenceError =>\n new PersistenceError({\n operation,\n message: cause instanceof Error ? cause.message : String(cause),\n })\n\nconst decode = <S extends Schema.Top & { readonly DecodingServices: never }>(\n operation: string,\n schema: S,\n value: unknown,\n): Effect.Effect<S[\"Type\"], PersistenceError> =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(operationError(operation)))\n\nconst threadFromRow = (row: ThreadRow): Effect.Effect<Thread, PersistenceError> =>\n decode(\"RelayStore.decodeThread\", Thread, {\n id: row.id,\n title: row.title,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n ...(row.default_device_id === null ? {} : { defaultDeviceId: row.default_device_id }),\n })\n\nconst messageFromRow = (row: MessageRow): Effect.Effect<Message, PersistenceError> =>\n decode(\"RelayStore.decodeMessage\", Message, {\n id: row.id,\n threadId: row.thread_id,\n role: row.role === \"tool\" ? \"agent\" : row.role,\n authorName: row.author_name,\n content: row.content,\n createdAt: row.created_at,\n ...(row.task_id === null ? {} : { taskId: row.task_id }),\n ...(row.device_id === null ? {} : { deviceId: row.device_id }),\n })\n\nconst deviceFromRow = (row: DeviceRow): Effect.Effect<Device, PersistenceError> =>\n decode(\"RelayStore.decodeDevice\", Device, {\n id: row.id,\n name: row.name,\n hostname: row.hostname,\n platform: row.platform,\n architecture: row.architecture,\n status: row.status,\n providers: JSON.parse(row.providers_json) as unknown,\n ...(row.bots_json === null ? {} : { bots: JSON.parse(row.bots_json) as unknown }),\n capabilities: JSON.parse(row.capabilities_json) as unknown,\n workspaces: JSON.parse(row.workspaces_json) as unknown,\n version: row.version,\n lastSeenAt: row.last_seen_at,\n ...(row.connected_at === null ? {} : { connectedAt: row.connected_at }),\n })\n\nconst taskFromRow = (row: TaskRow): Effect.Effect<Task, PersistenceError> =>\n decode(\"RelayStore.decodeTask\", Task, {\n id: row.id,\n threadId: row.thread_id,\n prompt: row.prompt,\n provider: row.provider,\n ...(row.bot_id === null ? {} : { botId: row.bot_id }),\n status: row.status,\n targetDeviceId: row.target_device_id,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n ...(row.context === null ? {} : { context: row.context }),\n ...(row.source_device_id === null ? {} : { sourceDeviceId: row.source_device_id }),\n ...(row.parent_task_id === null ? {} : { parentTaskId: row.parent_task_id }),\n ...(row.workspace === null ? {} : { workspace: row.workspace }),\n ...(row.provider_session_id === null ? {} : { providerSessionId: row.provider_session_id }),\n ...(row.result === null ? {} : { result: row.result }),\n ...(row.error === null ? {} : { error: row.error }),\n ...(row.started_at === null ? {} : { startedAt: row.started_at }),\n ...(row.completed_at === null ? {} : { completedAt: row.completed_at }),\n })\n\nconst operationFromRow = (\n row: DeviceOperationRow,\n): Effect.Effect<DeviceOperation, PersistenceError> =>\n decode(\"RelayStore.decodeOperation\", DeviceOperation, {\n id: row.id,\n kind: row.kind,\n status: row.status,\n targetDeviceId: row.target_device_id,\n requestedVersion: row.requested_version,\n restart: row.restart === 1,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n ...(row.result === null ? {} : { result: row.result }),\n ...(row.error === null ? {} : { error: row.error }),\n ...(row.completed_at === null ? {} : { completedAt: row.completed_at }),\n })\n\nconst emptyStatusCounts = (): Record<TaskStatus, number> => ({\n queued: 0,\n assigned: 0,\n running: 0,\n cancelling: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n})\n\nconst taskTraceEventFromRow = (\n row: TaskTraceEventRow,\n): Effect.Effect<TaskTraceEvent, PersistenceError> =>\n decode(\"RelayStore.decodeTaskTraceEvent\", TaskTraceEvent, {\n kind: row.kind,\n at: row.created_at,\n ...(row.detail === null ? {} : { detail: row.detail }),\n })\n\nconst rolesFromRow = (row: AuthSessionRow): ReadonlyArray<ConnectionRoleName> =>\n Schema.decodeUnknownSync(Schema.Array(ConnectionRole))(JSON.parse(row.roles_json))\n\nconst authSessionFromRow = (row: AuthSessionRow): Effect.Effect<AuthSession, PersistenceError> => {\n const roles = rolesFromRow(row)\n const role = roles[0]\n return role === undefined\n ? Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.decodeAuthSession\",\n message: `Session ${row.id} has no role`,\n }),\n )\n : decode(\"RelayStore.decodeAuthSession\", AuthSession, {\n id: row.id,\n label: row.label,\n role,\n createdAt: row.created_at,\n expiresAt: row.expires_at,\n lastSeenAt: row.last_seen_at,\n ...(row.bound_device_id === null ? {} : { deviceId: row.bound_device_id }),\n ...(row.revoked_at === null ? {} : { revokedAt: row.revoked_at }),\n })\n}\n\nconst secret = (prefix: \"pair\" | \"session\"): string => {\n return `cohall_${prefix}_${randomBytes(32).toString(\"hex\")}`\n}\nconst tokenHash = (token: string): string => createHash(\"sha256\").update(token).digest(\"hex\")\n\nconst providerName = (provider: Provider): string => {\n switch (provider) {\n case \"codex\":\n return \"Codex\"\n case \"claude-code\":\n return \"Claude Code\"\n case \"opencode\":\n return \"OpenCode\"\n case \"grok-bot\":\n return \"Grok Bot\"\n }\n}\n\nconst recentWithin = <A>(items: ReadonlyArray<A>, byteBudget: number) => {\n const encoder = new TextEncoder()\n const selected: Array<A> = []\n let bytes = 0\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index]\n if (item === undefined) {\n continue\n }\n const itemBytes = encoder.encode(JSON.stringify(item)).byteLength\n if (bytes + itemBytes > byteBudget) {\n break\n }\n bytes += itemBytes\n selected.unshift(item)\n }\n return { items: selected, truncated: selected.length < items.length }\n}\n\nconst derivedTraceEvents = (task: Task): ReadonlyArray<TaskTraceEvent> => {\n const detail = \"Derived from task timestamps; earlier trace events were not recorded\"\n const events: Array<TaskTraceEvent> = [\n TaskTraceEvent.make({ kind: \"queued\", at: task.createdAt, detail }),\n ]\n if (task.startedAt !== undefined) {\n events.push(TaskTraceEvent.make({ kind: \"running\", at: task.startedAt, detail }))\n } else if (task.status === \"assigned\") {\n events.push(TaskTraceEvent.make({ kind: \"assigned\", at: task.updatedAt, detail }))\n }\n if (task.status === \"cancelling\") {\n events.push(TaskTraceEvent.make({ kind: \"cancelling\", at: task.updatedAt, detail }))\n }\n if (\n task.completedAt !== undefined &&\n (task.status === \"completed\" || task.status === \"failed\" || task.status === \"cancelled\")\n ) {\n events.push(TaskTraceEvent.make({ kind: task.status, at: task.completedAt, detail }))\n }\n return events\n}\n\nconst makeService = (db: Database, retainedTerminalTasks = 1_000): Interface => {\n const recordTaskTraceEvent = (\n taskId: TaskId,\n kind: TaskTraceEventKind,\n detail: string,\n createdAt: Timestamp = now(),\n ): void => {\n db.query(\n `INSERT INTO task_trace_events (task_id, kind, created_at, detail)\n VALUES (?, ?, ?, ?)`,\n ).run(taskId, kind, createdAt, detail)\n db.query(\n `DELETE FROM task_trace_events WHERE task_id = ? AND id NOT IN (\n SELECT id FROM task_trace_events WHERE task_id = ? ORDER BY id DESC LIMIT 1000\n )`,\n ).run(taskId, taskId)\n }\n\n const pruneTerminalHistory = (preserveTaskId?: TaskId): void => {\n const exclusion = preserveTaskId === undefined ? \"\" : \"AND id <> ?\"\n const offset = preserveTaskId === undefined ? retainedTerminalTasks : retainedTerminalTasks - 1\n const staleTasks = `SELECT id FROM tasks\n WHERE status IN ('completed', 'failed', 'cancelled')\n ${exclusion}\n ORDER BY completed_at DESC, updated_at DESC, id DESC\n LIMIT -1 OFFSET ?`\n const parameters = preserveTaskId === undefined ? [offset] : [preserveTaskId, offset]\n db.query(`DELETE FROM messages WHERE task_id IN (${staleTasks})`).run(...parameters)\n db.query(`DELETE FROM tasks WHERE id IN (${staleTasks})`).run(...parameters)\n db.query(\n `DELETE FROM threads\n WHERE NOT EXISTS (SELECT 1 FROM tasks WHERE tasks.thread_id = threads.id)\n AND NOT EXISTS (SELECT 1 FROM messages WHERE messages.thread_id = threads.id)`,\n ).run()\n }\n\n const pruneTerminalOperations = (preserveOperationId?: OperationId): void => {\n const exclusion = preserveOperationId === undefined ? \"\" : \"AND id <> ?\"\n const offset =\n preserveOperationId === undefined ? retainedTerminalTasks : retainedTerminalTasks - 1\n const parameters = preserveOperationId === undefined ? [offset] : [preserveOperationId, offset]\n db.query(\n `DELETE FROM device_operations\n WHERE id IN (\n SELECT id FROM device_operations\n WHERE status IN ('completed', 'failed') ${exclusion}\n ORDER BY completed_at DESC, updated_at DESC, id DESC\n LIMIT -1 OFFSET ?\n )`,\n ).run(...parameters)\n }\n\n const queryTask = (taskId: TaskId): TaskRow | null =>\n db.query<TaskRow, [string]>(\"SELECT * FROM tasks WHERE id = ?\").get(taskId)\n\n const queryOperation = (operationId: OperationId): DeviceOperationRow | null =>\n db\n .query<DeviceOperationRow, [string]>(\"SELECT * FROM device_operations WHERE id = ?\")\n .get(operationId)\n\n const getTask = Effect.fn(\"RelayStore.getTask\")(function* (taskId: TaskId) {\n const row = yield* Effect.try({\n try: () => queryTask(taskId),\n catch: operationError(\"RelayStore.getTask\"),\n })\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.getTask\",\n message: `Unknown task ${taskId}`,\n }),\n )\n }\n return yield* taskFromRow(row)\n })\n\n const traceTask = Effect.fn(\"RelayStore.traceTask\")(function* (taskId: TaskId) {\n const task = yield* getTask(taskId)\n const [deviceRow, eventRows] = yield* Effect.try({\n try: () =>\n [\n db\n .query<DeviceRow, [string]>(\"SELECT * FROM devices WHERE id = ?\")\n .get(task.targetDeviceId),\n db\n .query<TaskTraceEventRow, [string]>(\n `SELECT * FROM (\n SELECT id, kind, created_at, detail FROM task_trace_events\n WHERE task_id = ? ORDER BY id DESC LIMIT 101\n ) ORDER BY id`,\n )\n .all(taskId),\n ] as const,\n catch: operationError(\"RelayStore.traceTask\"),\n })\n if (deviceRow === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.traceTask.device\",\n message: `Unknown target device ${task.targetDeviceId}`,\n }),\n )\n }\n const targetDevice = yield* deviceFromRow(deviceRow)\n const selectedRows = eventRows.slice(-100)\n const recordedEvents = yield* Effect.forEach(selectedRows, taskTraceEventFromRow)\n const events = recordedEvents.length === 0 ? derivedTraceEvents(task) : recordedEvents\n return TaskTrace.make({\n taskId: task.id,\n threadId: task.threadId,\n status: task.status,\n provider: task.provider,\n ...(task.botId === undefined ? {} : { botId: task.botId }),\n targetDevice,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n events,\n truncated:\n eventRows.length > 100 ||\n recordedEvents.length === 0 ||\n recordedEvents[0]?.kind !== \"queued\",\n ...(task.sourceDeviceId === undefined ? {} : { sourceDeviceId: task.sourceDeviceId }),\n ...(task.parentTaskId === undefined ? {} : { parentTaskId: task.parentTaskId }),\n ...(task.workspace === undefined ? {} : { workspace: task.workspace }),\n ...(task.startedAt === undefined ? {} : { startedAt: task.startedAt }),\n ...(task.completedAt === undefined ? {} : { completedAt: task.completedAt }),\n ...(task.error === undefined ? {} : { error: task.error }),\n })\n })\n\n const listDevices = Effect.fn(\"RelayStore.listDevices\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<DeviceRow, []>(\n \"SELECT * FROM devices WHERE forgotten_at IS NULL ORDER BY name COLLATE NOCASE, id\",\n )\n .all(),\n catch: operationError(\"RelayStore.listDevices\"),\n })\n return yield* Effect.forEach(rows, deviceFromRow)\n })\n\n const usage = Effect.fn(\"RelayStore.usage\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<UsageRow, []>(\n `SELECT tasks.target_device_id AS device_id, devices.name AS device_name,\n tasks.status, tasks.provider, COUNT(*) AS tasks\n FROM tasks\n JOIN devices ON devices.id = tasks.target_device_id\n GROUP BY tasks.target_device_id, devices.name, tasks.status, tasks.provider\n ORDER BY devices.name COLLATE NOCASE, tasks.target_device_id, tasks.provider`,\n )\n .all(),\n catch: operationError(\"RelayStore.usage\"),\n })\n const totalStatus = emptyStatusCounts()\n const totalProviders = new Map<Provider, number>()\n const devices = new Map<\n DeviceId,\n {\n readonly name: string\n readonly status: Record<TaskStatus, number>\n readonly providers: Map<Provider, number>\n }\n >()\n let retainedTasks = 0\n for (const row of rows) {\n const status = Schema.decodeUnknownSync(TaskStatus)(row.status)\n const provider = Schema.decodeUnknownSync(Provider)(row.provider)\n const deviceId = Schema.decodeUnknownSync(DeviceId)(row.device_id)\n retainedTasks += row.tasks\n totalStatus[status] += row.tasks\n totalProviders.set(provider, (totalProviders.get(provider) ?? 0) + row.tasks)\n const current = devices.get(deviceId) ?? {\n name: row.device_name,\n status: emptyStatusCounts(),\n providers: new Map<Provider, number>(),\n }\n current.status[status] += row.tasks\n current.providers.set(provider, (current.providers.get(provider) ?? 0) + row.tasks)\n devices.set(deviceId, current)\n }\n const providerUsage = (providers: ReadonlyMap<Provider, number>) =>\n Provider.literals.flatMap((provider) => {\n const tasks = providers.get(provider)\n return tasks === undefined ? [] : [{ provider, tasks }]\n })\n return UsageSummary.make({\n retainedTasks,\n byStatus: TaskStatusCounts.make(totalStatus),\n byProvider: providerUsage(totalProviders),\n devices: [...devices.entries()].map(([deviceId, device]) =>\n DeviceUsage.make({\n deviceId,\n deviceName: device.name,\n tasks: Object.values(device.status).reduce((sum, tasks) => sum + tasks, 0),\n byStatus: TaskStatusCounts.make(device.status),\n byProvider: providerUsage(device.providers),\n }),\n ),\n })\n })\n\n const getOperation = Effect.fn(\"RelayStore.getOperation\")(function* (operationId: OperationId) {\n const row = yield* Effect.try({\n try: () => queryOperation(operationId),\n catch: operationError(\"RelayStore.getOperation\"),\n })\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.getOperation\",\n message: `Unknown device operation ${operationId}`,\n }),\n )\n }\n return yield* operationFromRow(row)\n })\n\n const listOperations = Effect.fn(\"RelayStore.listOperations\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<DeviceOperationRow, []>(\n \"SELECT * FROM device_operations ORDER BY created_at DESC, id DESC LIMIT 50\",\n )\n .all(),\n catch: operationError(\"RelayStore.listOperations\"),\n })\n return yield* Effect.forEach(rows, operationFromRow)\n })\n\n const createUpgradeOperations = Effect.fn(\"RelayStore.createUpgradeOperations\")(function* (\n input: CreateUpgradeOperationsInput,\n ) {\n const timestamp = now()\n const operations = yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const devices = db\n .query<DeviceRow, []>(\n \"SELECT * FROM devices WHERE forgotten_at IS NULL ORDER BY name COLLATE NOCASE, id\",\n )\n .all()\n if (devices.length === 0) {\n throw new Error(\"No Cohall devices are registered\")\n }\n if (devices.length > 256) {\n throw new Error(\"All-device operations support at most 256 registered devices\")\n }\n assertDeviceOperationSupport(devices)\n for (const device of devices) {\n const outstanding = db\n .query<{ readonly count: number }, [string]>(\n `SELECT COUNT(*) AS count FROM device_operations\n WHERE target_device_id = ? AND status IN ('queued', 'assigned', 'running')`,\n )\n .get(device.id)\n if ((outstanding?.count ?? 0) > 0) {\n throw new Error(`${device.name} already has an upgrade operation in progress`)\n }\n }\n pruneTerminalOperations()\n return devices.map((device) => {\n const operation = DeviceOperation.make({\n id: makeOperationId(),\n kind: \"upgrade\",\n status: \"queued\",\n targetDeviceId: DeviceId.make(device.id),\n requestedVersion: input.target,\n restart: input.restart,\n createdAt: timestamp,\n updatedAt: timestamp,\n })\n db.query(\n `INSERT INTO device_operations (\n id, kind, status, target_device_id, requested_version, restart,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n operation.id,\n operation.kind,\n operation.status,\n operation.targetDeviceId,\n operation.requestedVersion,\n operation.restart ? 1 : 0,\n operation.createdAt,\n operation.updatedAt,\n )\n return operation\n })\n })(),\n catch: operationError(\"RelayStore.createUpgradeOperations\"),\n })\n return operations\n })\n\n const pendingOperationsFor = Effect.fn(\"RelayStore.pendingOperationsFor\")(function* (\n deviceId: DeviceId,\n ) {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<DeviceOperationRow, [string]>(\n `SELECT * FROM device_operations WHERE target_device_id = ? AND status = 'queued'\n ORDER BY created_at, id LIMIT 10`,\n )\n .all(deviceId),\n catch: operationError(\"RelayStore.pendingOperationsFor\"),\n })\n return yield* Effect.forEach(rows, operationFromRow)\n })\n\n const transitionOperation = Effect.fn(\"RelayStore.transitionOperation\")(function* (\n operationId: OperationId,\n expected: ReadonlyArray<OperationStatus>,\n status: OperationStatus,\n result?: string,\n error?: string,\n ) {\n const current = yield* getOperation(operationId)\n if (!expected.includes(current.status)) {\n return current\n }\n const timestamp = now()\n const completed = status === \"completed\" || status === \"failed\" ? timestamp : undefined\n const placeholders = expected.map(() => \"?\").join(\", \")\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const updated = db\n .query(\n `UPDATE device_operations\n SET status = ?, result = ?, error = ?, updated_at = ?, completed_at = ?\n WHERE id = ? AND status IN (${placeholders})`,\n )\n .run(\n status,\n result ?? current.result ?? null,\n error ?? current.error ?? null,\n timestamp,\n completed ?? current.completedAt ?? null,\n operationId,\n ...expected,\n )\n if (updated.changes === 1 && completed !== undefined) {\n pruneTerminalOperations(operationId)\n }\n })(),\n catch: operationError(\"RelayStore.transitionOperation\"),\n })\n return yield* getOperation(operationId)\n })\n\n const requireOperationTarget = Effect.fn(\"RelayStore.requireOperationTarget\")(function* (\n operationId: OperationId,\n deviceId: DeviceId,\n ) {\n const operation = yield* getOperation(operationId)\n if (operation.targetDeviceId !== deviceId) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.requireOperationTarget\",\n message: `Device ${deviceId} cannot update operation ${operationId}`,\n }),\n )\n }\n return operation\n })\n\n const assignOperation = Effect.fn(\"RelayStore.assignOperation\")(function* (\n operationId: OperationId,\n ) {\n const current = yield* getOperation(operationId)\n if (current.status !== \"queued\") {\n return current\n }\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db\n .query(\n `UPDATE device_operations SET status = 'assigned', updated_at = ?\n WHERE id = ? AND status = 'queued'\n AND NOT EXISTS (\n SELECT 1 FROM tasks WHERE target_device_id = ?\n AND status IN ('assigned', 'running', 'cancelling')\n )\n AND NOT EXISTS (\n SELECT 1 FROM device_operations active\n WHERE active.target_device_id = ? AND active.id <> ?\n AND active.status IN ('assigned', 'running')\n )`,\n )\n .run(timestamp, operationId, current.targetDeviceId, current.targetDeviceId, operationId),\n catch: operationError(\"RelayStore.assignOperation\"),\n })\n return yield* getOperation(operationId)\n })\n\n const acceptOperation = (operationId: OperationId, deviceId: DeviceId) =>\n requireOperationTarget(operationId, deviceId).pipe(\n Effect.flatMap(() => transitionOperation(operationId, [\"assigned\"], \"running\")),\n )\n\n const finishOperation = (operationId: OperationId, deviceId: DeviceId, result: string) =>\n requireOperationTarget(operationId, deviceId).pipe(\n Effect.flatMap(() =>\n transitionOperation(operationId, [\"queued\", \"assigned\", \"running\"], \"completed\", result),\n ),\n )\n\n const failOperation = (operationId: OperationId, deviceId: DeviceId, error: string) =>\n requireOperationTarget(operationId, deviceId).pipe(\n Effect.flatMap(() =>\n transitionOperation(\n operationId,\n [\"queued\", \"assigned\", \"running\"],\n \"failed\",\n undefined,\n error,\n ),\n ),\n )\n\n const abandonOperation = (operationId: OperationId) =>\n transitionOperation(\n operationId,\n [\"queued\", \"assigned\", \"running\"],\n \"failed\",\n undefined,\n \"Abandoned by the relay owner\",\n )\n\n const requeueOperationsFor = Effect.fn(\"RelayStore.requeueOperationsFor\")(function* (\n deviceId: DeviceId,\n ) {\n yield* Effect.try({\n try: () =>\n db\n .query(\n `UPDATE device_operations SET status = 'queued', updated_at = ?\n WHERE target_device_id = ? AND status IN ('assigned', 'running')`,\n )\n .run(now(), deviceId),\n catch: operationError(\"RelayStore.requeueOperationsFor\"),\n })\n })\n\n const forgetDevice = Effect.fn(\"RelayStore.forgetDevice\")(function* (deviceId: DeviceId) {\n const row = yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const device = db\n .query<DeviceRow, [string]>(\n \"SELECT * FROM devices WHERE id = ? AND forgotten_at IS NULL\",\n )\n .get(deviceId)\n if (device === null) {\n throw new Error(`Unknown device ${deviceId}`)\n }\n if (device.status !== \"offline\") {\n throw new Error(`Device ${deviceId} must be offline before it can be forgotten`)\n }\n const outstanding = db\n .query<{ readonly count: number }, [string]>(\n `SELECT COUNT(*) AS count FROM tasks\n WHERE target_device_id = ? AND status NOT IN ('completed', 'failed', 'cancelled')`,\n )\n .get(deviceId)\n if ((outstanding?.count ?? 0) > 0) {\n throw new Error(`Device ${deviceId} still has outstanding tasks`)\n }\n const timestamp = now()\n db.query(\n `UPDATE device_operations\n SET status = 'failed', error = ?, updated_at = ?, completed_at = ?\n WHERE target_device_id = ? AND status IN ('queued', 'assigned', 'running')`,\n ).run(\"Target device was forgotten by the relay owner\", timestamp, timestamp, deviceId)\n pruneTerminalOperations()\n db.query(\"UPDATE devices SET forgotten_at = ? WHERE id = ?\").run(timestamp, deviceId)\n db.query(\n \"UPDATE auth_sessions SET revoked_at = ? WHERE bound_device_id = ? AND revoked_at IS NULL\",\n ).run(timestamp, deviceId)\n return device\n })(),\n catch: operationError(\"RelayStore.forgetDevice\"),\n })\n return yield* deviceFromRow(row)\n })\n\n const recover = Effect.fn(\"RelayStore.recover\")(function* () {\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const timestamp = now()\n const interrupted = db\n .query<{ readonly id: string }, []>(\n \"SELECT id FROM tasks WHERE status IN ('assigned', 'running')\",\n )\n .all()\n db.query(\"UPDATE devices SET status = 'offline'\").run()\n db.query(\n \"UPDATE tasks SET status = 'queued', updated_at = ? WHERE status IN ('assigned', 'running')\",\n ).run(timestamp)\n db.query(\n \"UPDATE device_operations SET status = 'queued', updated_at = ? WHERE status IN ('assigned', 'running')\",\n ).run(timestamp)\n for (const task of interrupted) {\n recordTaskTraceEvent(\n TaskId.make(task.id),\n \"requeued\",\n \"Relay restarted before the task completed\",\n timestamp,\n )\n }\n db.query(\"DELETE FROM auth_pairings WHERE expires_at <= ? OR used_at IS NOT NULL\").run(\n timestamp,\n )\n db.query(\n \"UPDATE auth_sessions SET revoked_at = ? WHERE revoked_at IS NULL AND roles_json LIKE '%,%'\",\n ).run(timestamp)\n pruneTerminalHistory()\n pruneTerminalOperations()\n })(),\n catch: operationError(\"RelayStore.recover\"),\n })\n })\n\n const upsertDevice = Effect.fn(\"RelayStore.upsertDevice\")(function* (device: Device) {\n yield* Effect.try({\n try: () =>\n db\n .query(\n `INSERT INTO devices (\n id, name, hostname, platform, architecture, status, providers_json,\n capabilities_json, workspaces_json, version, last_seen_at, connected_at, bots_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name, hostname = excluded.hostname, platform = excluded.platform,\n architecture = excluded.architecture, status = excluded.status,\n providers_json = excluded.providers_json, bots_json = excluded.bots_json,\n capabilities_json = excluded.capabilities_json,\n workspaces_json = excluded.workspaces_json, version = excluded.version,\n last_seen_at = excluded.last_seen_at, connected_at = excluded.connected_at,\n forgotten_at = NULL`,\n )\n .run(\n device.id,\n device.name,\n device.hostname,\n device.platform,\n device.architecture,\n device.status,\n JSON.stringify(device.providers),\n JSON.stringify(device.capabilities),\n JSON.stringify(device.workspaces),\n device.version,\n device.lastSeenAt,\n device.connectedAt ?? null,\n device.bots === undefined ? null : JSON.stringify(device.bots),\n ),\n catch: operationError(\"RelayStore.upsertDevice\"),\n })\n return device\n })\n\n const updateDeviceStatus = Effect.fn(\"RelayStore.updateDeviceStatus\")(function* (\n deviceId: DeviceId,\n status: \"online\" | \"busy\" | \"offline\",\n bots?: Device[\"bots\"],\n ) {\n const timestamp = now()\n const result = yield* Effect.try({\n try: () =>\n db\n .query(\n \"UPDATE devices SET status = ?, last_seen_at = ?, bots_json = COALESCE(?, bots_json) WHERE id = ?\",\n )\n .run(status, timestamp, bots === undefined ? null : JSON.stringify(bots), deviceId),\n catch: operationError(\"RelayStore.updateDeviceStatus\"),\n })\n if (result.changes !== 1) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.updateDeviceStatus\",\n message: `Unknown device ${deviceId}`,\n }),\n )\n }\n const row = db.query<DeviceRow, [string]>(\"SELECT * FROM devices WHERE id = ?\").get(deviceId)\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.updateDeviceStatus.read\",\n message: `Device ${deviceId} disappeared after update`,\n }),\n )\n }\n return yield* deviceFromRow(row)\n })\n\n const createDelegation = Effect.fn(\"RelayStore.createDelegation\")(function* (\n input: CreateTaskInput,\n targetDeviceId: DeviceId,\n boundDeviceId?: DeviceId,\n providerSessionId?: string,\n ) {\n const sourceDeviceId = yield* Effect.try({\n try: () =>\n boundDeviceId === undefined ||\n db\n .query(\"SELECT id FROM devices WHERE id = ? AND forgotten_at IS NULL\")\n .get(boundDeviceId) === null\n ? undefined\n : boundDeviceId,\n catch: operationError(\"RelayStore.createDelegation.source\"),\n })\n const timestamp = now()\n const threadId = input.threadId ?? makeThreadId()\n const task = Task.make({\n id: makeTaskId(),\n threadId,\n prompt: input.prompt,\n provider: input.provider ?? (input.botId === undefined ? \"codex\" : \"grok-bot\"),\n ...(input.botId === undefined ? {} : { botId: input.botId }),\n status: \"queued\",\n targetDeviceId,\n createdAt: timestamp,\n updatedAt: timestamp,\n ...(input.context === undefined ? {} : { context: input.context }),\n ...(sourceDeviceId === undefined ? {} : { sourceDeviceId }),\n ...(input.parentTaskId === undefined ? {} : { parentTaskId: input.parentTaskId }),\n ...(input.workspace === undefined ? {} : { workspace: input.workspace }),\n ...(providerSessionId === undefined ? {} : { providerSessionId }),\n })\n const thread =\n input.threadId === undefined\n ? Thread.make({\n id: threadId,\n title: input.title ?? input.prompt.slice(0, 72),\n createdAt: timestamp,\n updatedAt: timestamp,\n })\n : undefined\n const message = Message.make({\n id: makeMessageId(),\n threadId,\n role: \"human\",\n authorName: sourceDeviceId === undefined ? \"User\" : \"Remote agent\",\n content: input.prompt,\n createdAt: timestamp,\n taskId: task.id,\n ...(sourceDeviceId === undefined ? {} : { deviceId: sourceDeviceId }),\n })\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const outstanding = db\n .query<{ readonly count: number }, [string]>(\n `SELECT COUNT(*) AS count FROM tasks WHERE target_device_id = ?\n AND status IN ('queued', 'assigned', 'running', 'cancelling')`,\n )\n .get(targetDeviceId)\n if ((outstanding?.count ?? 0) >= 100) {\n throw new Error(`Device ${targetDeviceId} has reached its outstanding task limit`)\n }\n if (thread !== undefined) {\n db.query(\n \"INSERT INTO threads (id, title, created_at, updated_at) VALUES (?, ?, ?, ?)\",\n ).run(thread.id, thread.title, thread.createdAt, thread.updatedAt)\n } else if (\n db\n .query<{ readonly id: string }, [string]>(\"SELECT id FROM threads WHERE id = ?\")\n .get(threadId) === null\n ) {\n throw new Error(`Unknown thread ${threadId}`)\n }\n db.query(\n `INSERT INTO tasks (\n id, thread_id, prompt, context, provider, status, source_device_id,\n target_device_id, parent_task_id, workspace, provider_session_id, bot_id,\n created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n task.id,\n task.threadId,\n task.prompt,\n task.context ?? null,\n task.provider,\n task.status,\n task.sourceDeviceId ?? null,\n task.targetDeviceId,\n task.parentTaskId ?? null,\n task.workspace ?? null,\n task.providerSessionId ?? null,\n task.botId ?? null,\n task.createdAt,\n task.updatedAt,\n )\n recordTaskTraceEvent(task.id, \"queued\", \"Relay accepted the task\", timestamp)\n db.query(\n `INSERT INTO messages (\n id, thread_id, role, kind, author_id, author_name, content, created_at,\n task_id, device_id\n ) VALUES (?, ?, ?, 'chat', ?, ?, ?, ?, ?, ?)`,\n ).run(\n message.id,\n message.threadId,\n message.role,\n sourceDeviceId ?? \"user\",\n message.authorName,\n message.content,\n message.createdAt,\n message.taskId ?? null,\n message.deviceId ?? null,\n )\n db.query(\"UPDATE threads SET updated_at = ? WHERE id = ?\").run(timestamp, threadId)\n })(),\n catch: operationError(\"RelayStore.createDelegation\"),\n })\n return task\n })\n\n const threadContext = Effect.fn(\"RelayStore.threadContext\")(function* (threadId: ThreadId) {\n const threadRow = yield* Effect.try({\n try: () => db.query<ThreadRow, [string]>(\"SELECT * FROM threads WHERE id = ?\").get(threadId),\n catch: operationError(\"RelayStore.threadContext.thread\"),\n })\n if (threadRow === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.threadContext\",\n message: `Unknown thread ${threadId}`,\n }),\n )\n }\n const [messageRows, taskRows] = yield* Effect.try({\n try: () =>\n [\n db\n .query<MessageRow, [string]>(\n `SELECT * FROM (\n SELECT * FROM messages WHERE thread_id = ?\n ORDER BY created_at DESC, id DESC LIMIT 21\n ) ORDER BY created_at, id`,\n )\n .all(threadId),\n db\n .query<TaskRow, [string]>(\n `SELECT * FROM (\n SELECT * FROM tasks WHERE thread_id = ?\n ORDER BY created_at DESC, id DESC LIMIT 21\n ) ORDER BY created_at, id`,\n )\n .all(threadId),\n ] as const,\n catch: operationError(\"RelayStore.threadContext.items\"),\n })\n const [thread, messages, tasks] = yield* Effect.all([\n threadFromRow(threadRow),\n Effect.forEach(messageRows.slice(-20), messageFromRow),\n Effect.forEach(taskRows.slice(-20), taskFromRow),\n ])\n const recentMessages = recentWithin(messages, 256 * 1024)\n const recentTasks = recentWithin(tasks, 768 * 1024)\n return ThreadContext.make({\n thread,\n messages: recentMessages.items,\n tasks: recentTasks.items,\n truncated:\n messageRows.length > 20 ||\n taskRows.length > 20 ||\n recentMessages.truncated ||\n recentTasks.truncated,\n })\n })\n\n const pendingTasksFor = Effect.fn(\"RelayStore.pendingTasksFor\")(function* (deviceId: DeviceId) {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<TaskRow, [string]>(\n `SELECT * FROM tasks WHERE target_device_id = ?\n AND status IN ('queued', 'cancelling') ORDER BY created_at, id LIMIT 100`,\n )\n .all(deviceId),\n catch: operationError(\"RelayStore.pendingTasksFor\"),\n })\n return yield* Effect.forEach(rows, taskFromRow)\n })\n\n const transition = Effect.fn(\"RelayStore.transition\")(function* (\n taskId: TaskId,\n expected: ReadonlyArray<TaskStatus>,\n update: TaskUpdate,\n event?: { readonly kind: TaskTraceEventKind; readonly detail: string },\n ) {\n const current = yield* getTask(taskId)\n if (!expected.includes(current.status)) {\n return current\n }\n const placeholders = expected.map(() => \"?\").join(\", \")\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const result = db\n .query(\n `UPDATE tasks SET status = ?, provider_session_id = ?, result = ?, error = ?,\n started_at = ?, completed_at = ?, updated_at = ?\n WHERE id = ? AND status IN (${placeholders})`,\n )\n .run(\n update.status ?? current.status,\n update.providerSessionId ?? current.providerSessionId ?? null,\n update.result ?? current.result ?? null,\n update.error ?? current.error ?? null,\n update.startedAt ?? current.startedAt ?? null,\n update.completedAt ?? current.completedAt ?? null,\n timestamp,\n taskId,\n ...expected,\n )\n if (result.changes === 1 && event !== undefined) {\n recordTaskTraceEvent(taskId, event.kind, event.detail, timestamp)\n }\n if (\n result.changes === 1 &&\n update.status !== undefined &&\n [\"completed\", \"failed\", \"cancelled\"].includes(update.status)\n ) {\n pruneTerminalHistory(taskId)\n }\n })(),\n catch: operationError(\"RelayStore.transition\"),\n })\n return yield* getTask(taskId)\n })\n\n const assignTask = Effect.fn(\"RelayStore.assignTask\")(function* (taskId: TaskId) {\n const current = yield* getTask(taskId)\n if (current.status !== \"queued\") {\n return current\n }\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const result = db\n .query(\n `UPDATE tasks SET status = 'assigned', updated_at = ?,\n provider_session_id = CASE\n WHEN provider = 'grok-bot' THEN NULL\n WHEN started_at IS NULL THEN COALESCE((\n SELECT session_id FROM provider_sessions\n WHERE thread_id = tasks.thread_id AND device_id = tasks.target_device_id\n AND provider = tasks.provider\n ), provider_session_id)\n ELSE provider_session_id END\n WHERE id = ? AND status = 'queued' AND NOT EXISTS (\n SELECT 1 FROM tasks active\n WHERE active.target_device_id = ? AND active.id <> ?\n AND CASE WHEN active.provider = 'grok-bot'\n THEN 'grok-bot:' || active.bot_id ELSE 'cli' END = ?\n AND active.status IN ('assigned', 'running', 'cancelling')\n ) AND NOT EXISTS (\n SELECT 1 FROM device_operations active\n WHERE active.target_device_id = ?\n AND active.status IN ('assigned', 'running')\n )`,\n )\n .run(\n timestamp,\n taskId,\n current.targetDeviceId,\n taskId,\n taskSlot(current),\n current.targetDeviceId,\n )\n if (result.changes === 1) {\n recordTaskTraceEvent(\n taskId,\n \"assigned\",\n \"Relay dispatched the task over the device WebSocket\",\n timestamp,\n )\n }\n })(),\n catch: operationError(\"RelayStore.assignTask\"),\n })\n return yield* getTask(taskId)\n })\n\n const requireTarget = Effect.fn(\"RelayStore.requireTarget\")(function* (\n taskId: TaskId,\n deviceId: DeviceId,\n ) {\n const task = yield* getTask(taskId)\n if (task.targetDeviceId !== deviceId) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.requireTarget\",\n message: `Task ${taskId} belongs to another device`,\n }),\n )\n }\n return task\n })\n\n const terminal = Effect.fn(\"RelayStore.terminal\")(function* (\n taskId: TaskId,\n deviceId: DeviceId,\n status: \"completed\" | \"failed\" | \"cancelled\",\n result?: string,\n error?: string,\n providerSessionId?: string,\n ) {\n const current = yield* requireTarget(taskId, deviceId)\n if ([\"completed\", \"failed\", \"cancelled\"].includes(current.status)) {\n return current\n }\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const updated = db\n .query(\n `UPDATE tasks SET status = ?, result = ?, error = ?, provider_session_id = ?,\n completed_at = ?, updated_at = ? WHERE id = ?\n AND status NOT IN ('completed', 'failed', 'cancelled')`,\n )\n .run(\n status,\n result ?? null,\n error ?? null,\n current.provider === \"grok-bot\"\n ? null\n : (providerSessionId ?? current.providerSessionId ?? null),\n timestamp,\n timestamp,\n taskId,\n )\n if (updated.changes !== 1) {\n return\n }\n recordTaskTraceEvent(\n taskId,\n status,\n status === \"completed\"\n ? \"Target device completed the task\"\n : status === \"failed\"\n ? \"Target device reported a task failure\"\n : \"Target device acknowledged cancellation\",\n timestamp,\n )\n if (current.provider !== \"grok-bot\" && providerSessionId !== undefined) {\n db.query(\n `INSERT INTO provider_sessions (thread_id, device_id, provider, session_id, updated_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(thread_id, device_id, provider) DO UPDATE SET\n session_id = excluded.session_id, updated_at = excluded.updated_at`,\n ).run(current.threadId, deviceId, current.provider, providerSessionId, timestamp)\n }\n const content = result ?? error\n if (content !== undefined) {\n const role = status === \"completed\" ? \"agent\" : \"system\"\n db.query(\n `INSERT INTO messages (\n id, thread_id, role, kind, author_id, author_name, content, created_at,\n task_id, device_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n makeMessageId(),\n current.threadId,\n role,\n status === \"failed\" ? \"error\" : \"chat\",\n deviceId,\n status === \"completed\" ? providerName(current.provider) : \"Cohall\",\n content,\n timestamp,\n taskId,\n deviceId,\n )\n db.query(\"UPDATE threads SET updated_at = ? WHERE id = ?\").run(\n timestamp,\n current.threadId,\n )\n }\n pruneTerminalHistory(taskId)\n })(),\n catch: operationError(\"RelayStore.terminal\"),\n })\n return yield* getTask(taskId)\n })\n\n const requestCancellation = Effect.fn(\"RelayStore.requestCancellation\")(function* (\n taskId: TaskId,\n ) {\n const current = yield* getTask(taskId)\n if ([\"completed\", \"failed\", \"cancelled\"].includes(current.status)) {\n return current\n }\n const dispatched =\n current.provider === \"grok-bot\" &&\n (yield* Effect.try({\n try: () =>\n db.query(\"SELECT 1 FROM tasks WHERE id = ? AND dispatched_at IS NOT NULL\").get(taskId) !==\n null,\n catch: operationError(\"RelayStore.requestCancellation\"),\n }))\n if (\n current.provider === \"grok-bot\" &&\n (current.status !== \"queued\" || current.startedAt !== undefined || dispatched)\n ) {\n return yield* new PersistenceError({\n operation: \"RelayStore.requestCancellation\",\n message:\n \"Stop this bot in Grok Bot; its gateway cannot cancel an individual Cohall request\",\n })\n }\n if (current.status === \"cancelling\") {\n return current\n }\n const timestamp = now()\n return current.status === \"queued\"\n ? yield* transition(\n taskId,\n [\"queued\"],\n { status: \"cancelled\", completedAt: timestamp },\n { kind: \"cancelled\", detail: \"Client cancelled the task before dispatch\" },\n )\n : yield* transition(\n taskId,\n [\"assigned\", \"running\"],\n {\n status: \"cancelling\",\n },\n { kind: \"cancelling\", detail: \"Client requested task cancellation\" },\n )\n })\n\n const requeueTasksFor = Effect.fn(\"RelayStore.requeueTasksFor\")(function* (deviceId: DeviceId) {\n const timestamp = now()\n yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const interrupted = db\n .query<{ readonly id: string }, [string]>(\n `SELECT id FROM tasks WHERE target_device_id = ?\n AND status IN ('assigned', 'running')`,\n )\n .all(deviceId)\n db.query(\n `UPDATE tasks SET status = 'queued', updated_at = ?\n WHERE target_device_id = ? AND status IN ('assigned', 'running')`,\n ).run(timestamp, deviceId)\n for (const task of interrupted) {\n recordTaskTraceEvent(\n TaskId.make(task.id),\n \"requeued\",\n \"Target device disconnected before task completion\",\n timestamp,\n )\n }\n })(),\n catch: operationError(\"RelayStore.requeueTasksFor\"),\n })\n })\n\n const sessionFor = Effect.fn(\"RelayStore.sessionFor\")(function* (\n threadId: ThreadId,\n deviceId: DeviceId,\n provider: Provider,\n ) {\n const row = yield* Effect.try({\n try: () =>\n db\n .query<{ readonly session_id: string }, [string, string, string]>(\n `SELECT session_id FROM provider_sessions\n WHERE thread_id = ? AND device_id = ? AND provider = ?`,\n )\n .get(threadId, deviceId, provider),\n catch: operationError(\"RelayStore.sessionFor\"),\n })\n return row?.session_id\n })\n\n const createPairing = Effect.fn(\"RelayStore.createPairing\")(function* (\n input: CreatePairingInput,\n ) {\n const roles = [...new Set(input.roles)]\n if (roles.length === 0) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.createPairing\",\n message: \"A pairing must allow at least one role\",\n }),\n )\n }\n const token = secret(\"pair\")\n const expiresAt = new Date(Date.now() + 10 * 60 * 1_000).toISOString()\n yield* Effect.try({\n try: () =>\n db\n .query(\n `INSERT INTO auth_pairings (token_hash, label, roles_json, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(tokenHash(token), input.label, JSON.stringify(roles), expiresAt, now()),\n catch: operationError(\"RelayStore.createPairing\"),\n })\n return PairingCredential.make({ token, expiresAt: Timestamp.make(expiresAt) })\n })\n\n const exchangePairing = Effect.fn(\"RelayStore.exchangePairing\")(function* (token: string) {\n const timestamp = now()\n const expiresAt = new Date(Date.now() + 90 * 24 * 60 * 60 * 1_000).toISOString()\n const created = yield* Effect.try({\n try: () =>\n db.transaction(() => {\n const pairing = db\n .query<PairingRow, [string, string]>(\n `SELECT * FROM auth_pairings\n WHERE token_hash = ? AND used_at IS NULL AND expires_at > ?`,\n )\n .get(tokenHash(token), timestamp)\n if (pairing === null) {\n throw new Error(\"Pairing credential is invalid, expired, or already used\")\n }\n const roles = Schema.decodeUnknownSync(Schema.Array(ConnectionRole))(\n JSON.parse(pairing.roles_json),\n )\n const deviceId = roles.includes(\"device\") ? makeDeviceId() : undefined\n const consumed = db\n .query(\"UPDATE auth_pairings SET used_at = ? WHERE token_hash = ? AND used_at IS NULL\")\n .run(timestamp, pairing.token_hash)\n if (consumed.changes !== 1) {\n throw new Error(\"Pairing credential was already used\")\n }\n return [...new Set(roles)].map((role) => {\n const sessionToken = secret(\"session\")\n const row = {\n id: makeAuthSessionId(),\n token_hash: tokenHash(sessionToken),\n label: pairing.label,\n roles_json: JSON.stringify([role]),\n created_at: timestamp,\n expires_at: expiresAt,\n last_seen_at: timestamp,\n bound_device_id: deviceId ?? null,\n revoked_at: null,\n } satisfies AuthSessionRow\n db.query(\n `INSERT INTO auth_sessions (\n id, token_hash, label, roles_json, created_at, expires_at, last_seen_at,\n bound_device_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n row.id,\n row.token_hash,\n row.label,\n row.roles_json,\n row.created_at,\n row.expires_at,\n row.last_seen_at,\n row.bound_device_id,\n )\n return { token: sessionToken, row }\n })\n })(),\n catch: operationError(\"RelayStore.exchangePairing\"),\n })\n const credentials = yield* Effect.forEach(created, ({ token: sessionToken, row }) =>\n authSessionFromRow(row).pipe(Effect.map((session) => ({ token: sessionToken, session }))),\n )\n return PairingResult.make({ credentials })\n })\n\n const authenticateSession = Effect.fn(\"RelayStore.authenticateSession\")(function* (\n token: string,\n role: ConnectionRoleName,\n ) {\n const row = yield* Effect.try({\n try: () =>\n db\n .query<AuthSessionRow, [string, string]>(\n `SELECT * FROM auth_sessions\n WHERE token_hash = ? AND revoked_at IS NULL AND expires_at > ?`,\n )\n .get(tokenHash(token), now()),\n catch: operationError(\"RelayStore.authenticateSession\"),\n })\n if (row === null || !rolesFromRow(row).includes(role)) {\n return undefined\n }\n const lastSeenAt = now()\n yield* Effect.try({\n try: () =>\n db.query(\"UPDATE auth_sessions SET last_seen_at = ? WHERE id = ?\").run(lastSeenAt, row.id),\n catch: operationError(\"RelayStore.authenticateSession.touch\"),\n })\n const session = yield* authSessionFromRow(row)\n return AuthSession.make({ ...session, lastSeenAt })\n })\n\n const listAuthSessions = Effect.fn(\"RelayStore.listAuthSessions\")(function* () {\n const rows = yield* Effect.try({\n try: () =>\n db\n .query<AuthSessionRow, []>(\n \"SELECT * FROM auth_sessions ORDER BY created_at DESC, id LIMIT 1000\",\n )\n .all(),\n catch: operationError(\"RelayStore.listAuthSessions\"),\n })\n return yield* Effect.forEach(rows, authSessionFromRow)\n })\n\n const revokeAuthSession = Effect.fn(\"RelayStore.revokeAuthSession\")(function* (\n sessionId: AuthSessionId,\n ) {\n const revokedAt = now()\n const result = yield* Effect.try({\n try: () =>\n db\n .query(\"UPDATE auth_sessions SET revoked_at = ? WHERE id = ? AND revoked_at IS NULL\")\n .run(revokedAt, sessionId),\n catch: operationError(\"RelayStore.revokeAuthSession\"),\n })\n if (result.changes !== 1) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.revokeAuthSession\",\n message: `Unknown or already revoked session ${sessionId}`,\n }),\n )\n }\n const row = db\n .query<AuthSessionRow, [string]>(\"SELECT * FROM auth_sessions WHERE id = ?\")\n .get(sessionId)\n if (row === null) {\n return yield* Effect.fail(\n new PersistenceError({\n operation: \"RelayStore.revokeAuthSession.read\",\n message: `Session ${sessionId} disappeared after revocation`,\n }),\n )\n }\n return yield* authSessionFromRow(row)\n })\n\n return Service.of({\n recover,\n listDevices,\n usage,\n forgetDevice,\n upsertDevice,\n heartbeat: (deviceId, status, bots) => updateDeviceStatus(deviceId, status, bots),\n markDeviceOffline: (deviceId) => updateDeviceStatus(deviceId, \"offline\"),\n createDelegation,\n getTask,\n traceTask,\n threadContext,\n pendingTasksFor,\n assignTask,\n markTaskDispatched: (taskId) =>\n Effect.try({\n try: () => {\n db.query(\n \"UPDATE tasks SET dispatched_at = COALESCE(dispatched_at, ?) WHERE id = ? AND status = 'assigned'\",\n ).run(now(), taskId)\n },\n catch: operationError(\"RelayStore.markTaskDispatched\"),\n }),\n rollbackAssignment: (taskId) =>\n transition(\n taskId,\n [\"assigned\"],\n { status: \"queued\" },\n { kind: \"requeued\", detail: \"Target device was unavailable during dispatch\" },\n ),\n acceptTask: (taskId, deviceId) =>\n requireTarget(taskId, deviceId).pipe(\n Effect.flatMap(() =>\n transition(\n taskId,\n [\"assigned\"],\n { status: \"running\", startedAt: now() },\n { kind: \"running\", detail: \"Target device accepted the task and started the provider\" },\n ),\n ),\n ),\n finishTask: (taskId, deviceId, result, providerSessionId) =>\n terminal(taskId, deviceId, \"completed\", result, undefined, providerSessionId),\n failTask: (taskId, deviceId, error) => terminal(taskId, deviceId, \"failed\", undefined, error),\n acknowledgeCancellation: (taskId, deviceId) => terminal(taskId, deviceId, \"cancelled\"),\n requestCancellation,\n requeueTasksFor,\n createUpgradeOperations,\n listOperations,\n abandonOperation,\n pendingOperationsFor,\n assignOperation,\n rollbackOperation: (operationId) => transitionOperation(operationId, [\"assigned\"], \"queued\"),\n acceptOperation,\n finishOperation,\n failOperation,\n requeueOperationsFor,\n sessionFor,\n createPairing,\n exchangePairing,\n authenticateSession,\n listAuthSessions,\n revokeAuthSession,\n })\n}\n\nconst migrate = (db: Database): Effect.Effect<void, PersistenceError> =>\n Effect.try({\n try: () => {\n db.exec(\"PRAGMA journal_mode = WAL\")\n db.exec(\"PRAGMA foreign_keys = ON\")\n db.exec(\"PRAGMA busy_timeout = 5000\")\n db.exec(`\n CREATE TABLE IF NOT EXISTS devices (\n id TEXT PRIMARY KEY, name TEXT NOT NULL, hostname TEXT NOT NULL,\n platform TEXT NOT NULL, architecture TEXT NOT NULL, status TEXT NOT NULL,\n providers_json TEXT NOT NULL, bots_json TEXT, capabilities_json TEXT NOT NULL,\n workspaces_json TEXT NOT NULL, version TEXT NOT NULL, last_seen_at TEXT NOT NULL,\n connected_at TEXT, forgotten_at TEXT\n );\n CREATE TABLE IF NOT EXISTS threads (\n id TEXT PRIMARY KEY, title TEXT NOT NULL, created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL, archived_at TEXT,\n default_device_id TEXT REFERENCES devices(id)\n );\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY, thread_id TEXT NOT NULL REFERENCES threads(id) ON DELETE CASCADE,\n role TEXT NOT NULL, kind TEXT NOT NULL DEFAULT 'chat', author_id TEXT NOT NULL,\n author_name TEXT NOT NULL, content TEXT NOT NULL, created_at TEXT NOT NULL,\n task_id TEXT, reply_to TEXT, device_id TEXT REFERENCES devices(id)\n );\n CREATE INDEX IF NOT EXISTS messages_thread_created ON messages(thread_id, created_at);\n CREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY, thread_id TEXT NOT NULL REFERENCES threads(id) ON DELETE CASCADE,\n prompt TEXT NOT NULL, context TEXT, provider TEXT NOT NULL, bot_id TEXT, status TEXT NOT NULL,\n source_device_id TEXT REFERENCES devices(id),\n target_device_id TEXT NOT NULL REFERENCES devices(id), parent_task_id TEXT,\n workspace TEXT, provider_session_id TEXT, result TEXT, error TEXT,\n created_at TEXT NOT NULL, updated_at TEXT NOT NULL, started_at TEXT, completed_at TEXT,\n dispatched_at TEXT\n );\n CREATE INDEX IF NOT EXISTS tasks_thread_created ON tasks(thread_id, created_at);\n CREATE INDEX IF NOT EXISTS tasks_target_status ON tasks(target_device_id, status);\n CREATE TABLE IF NOT EXISTS task_trace_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n kind TEXT NOT NULL, created_at TEXT NOT NULL, detail TEXT\n );\n CREATE INDEX IF NOT EXISTS task_trace_events_task_id\n ON task_trace_events(task_id, id);\n CREATE TABLE IF NOT EXISTS provider_sessions (\n thread_id TEXT NOT NULL REFERENCES threads(id) ON DELETE CASCADE,\n device_id TEXT NOT NULL REFERENCES devices(id) ON DELETE CASCADE,\n provider TEXT NOT NULL, session_id TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY(thread_id, device_id, provider)\n );\n CREATE TABLE IF NOT EXISTS device_operations (\n id TEXT PRIMARY KEY, kind TEXT NOT NULL, status TEXT NOT NULL,\n target_device_id TEXT NOT NULL REFERENCES devices(id),\n requested_version TEXT NOT NULL, restart INTEGER NOT NULL,\n result TEXT, error TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n completed_at TEXT\n );\n CREATE INDEX IF NOT EXISTS device_operations_target_status\n ON device_operations(target_device_id, status);\n CREATE TABLE IF NOT EXISTS auth_pairings (\n token_hash TEXT PRIMARY KEY, label TEXT NOT NULL, roles_json TEXT NOT NULL,\n expires_at TEXT NOT NULL, created_at TEXT NOT NULL, used_at TEXT\n );\n CREATE TABLE IF NOT EXISTS auth_sessions (\n id TEXT PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE, label TEXT NOT NULL,\n roles_json TEXT NOT NULL, created_at TEXT NOT NULL, expires_at TEXT NOT NULL,\n last_seen_at TEXT NOT NULL, bound_device_id TEXT, revoked_at TEXT\n );\n CREATE INDEX IF NOT EXISTS auth_sessions_token ON auth_sessions(token_hash);\n `)\n const deviceColumns = db\n .query<{ readonly name: string }, []>(\"PRAGMA table_info(devices)\")\n .all()\n if (!deviceColumns.some((column) => column.name === \"forgotten_at\")) {\n db.exec(\"ALTER TABLE devices ADD COLUMN forgotten_at TEXT\")\n }\n if (!deviceColumns.some((column) => column.name === \"bots_json\")) {\n db.exec(\"ALTER TABLE devices ADD COLUMN bots_json TEXT\")\n }\n const taskColumns = db.query<{ readonly name: string }, []>(\"PRAGMA table_info(tasks)\").all()\n if (!taskColumns.some((column) => column.name === \"bot_id\")) {\n db.exec(\"ALTER TABLE tasks ADD COLUMN bot_id TEXT\")\n }\n if (!taskColumns.some((column) => column.name === \"dispatched_at\")) {\n db.transaction(() => {\n db.exec(\"ALTER TABLE tasks ADD COLUMN dispatched_at TEXT\")\n // Older queued Bot tasks may already be running with a lost acceptance event.\n db.exec(`UPDATE tasks SET dispatched_at = COALESCE(started_at, updated_at)\n WHERE provider = 'grok-bot' AND status NOT IN ('completed', 'failed', 'cancelled')`)\n })()\n }\n },\n catch: operationError(\"RelayStore.migrate\"),\n })\n\nexport const layer = (path: string, retainedTerminalTasks = 1_000) =>\n Layer.effect(\n Service,\n Effect.acquireRelease(\n Effect.try({\n try: () => new Database(path),\n catch: operationError(\"RelayStore.open\"),\n }).pipe(Effect.tap(migrate)),\n (db) => Effect.sync(() => db.close()),\n ).pipe(Effect.map((db) => makeService(db, retainedTerminalTasks))),\n )\n\nexport const layerFromDatabase = (db: Database) =>\n Layer.effect(Service, migrate(db).pipe(Effect.map(() => makeService(db))))\n\nexport * as RelayStore from \"./store.ts\"\n",
10
+ "import {\n AuthSessionId,\n Device,\n DeviceId,\n OperationId,\n SocketEvent,\n maxSocketPayloadBytes,\n TaskId,\n ThreadId,\n decodeCreatePairingInput,\n decodeCreateTaskInput,\n decodeCreateUpgradeOperationsInput,\n decodeExchangePairingInput,\n decodeSocketEvent,\n now,\n isTerminalTask,\n taskSlot,\n version,\n type AuthSession,\n type CreateTaskInput,\n type DeviceId as DeviceIdType,\n type DeviceOperation,\n type Task,\n} from \"@cohall/protocol\"\nimport { Effect, ManagedRuntime, Schema } from \"effect\"\nimport { createHash, timingSafeEqual } from \"node:crypto\"\nimport { access, chmod } from \"node:fs/promises\"\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\"\nimport type { ListenOptions } from \"node:net\"\nimport { platform } from \"node:os\"\nimport { WebSocketServer, type RawData } from \"ws\"\nimport { loadEnvironmentConfiguration, type RelayConfiguration } from \"./config.ts\"\nimport { Hub, type ConnectionSocket } from \"./hub.ts\"\nimport { RelayStore } from \"./store.ts\"\n\ntype RelayListenOptions = ListenOptions | { readonly fd: number }\n\nclass RequestError extends Schema.TaggedErrorClass<RequestError>()(\"Relay.RequestError\", {\n status: Schema.Int,\n message: Schema.String,\n}) {}\n\nexport const relayListenOptions = (\n configuration: Pick<RelayConfiguration, \"host\" | \"port\">,\n environment: NodeJS.ProcessEnv = process.env,\n pid = process.pid,\n): RelayListenOptions => {\n const listenPid = Number(environment.LISTEN_PID)\n const listenFds = Number(environment.LISTEN_FDS)\n if (listenPid !== pid || !Number.isInteger(listenFds) || listenFds < 1) {\n return { host: configuration.host, port: configuration.port }\n }\n\n const descriptorNames = environment.LISTEN_FDNAMES?.split(\":\") ?? []\n const namedIndex = descriptorNames.indexOf(\"cohall-relay\")\n if (namedIndex >= 0 && namedIndex < listenFds) {\n return { fd: 3 + namedIndex }\n }\n if (listenFds === 1) {\n return { fd: 3 }\n }\n throw new Error(\"Cohall received multiple systemd sockets but none was named cohall-relay\")\n}\n\nconst json = (value: unknown, status = 200): Response =>\n Response.json(value, {\n status,\n headers: {\n \"cache-control\": \"no-store\",\n \"x-content-type-options\": \"nosniff\",\n },\n })\n\nconst requestBody = (request: IncomingMessage, limit: number): Promise<Buffer | undefined> => {\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n return Promise.resolve(undefined)\n }\n return new Promise((resolve, reject) => {\n const chunks: Array<Buffer> = []\n let size = 0\n const cleanup = (): void => {\n request.off(\"data\", onData)\n request.off(\"end\", onEnd)\n request.off(\"error\", onError)\n }\n const onData = (chunk: Buffer): void => {\n size += chunk.byteLength\n if (size <= limit) {\n chunks.push(chunk)\n return\n }\n cleanup()\n reject(new Error(\"Request body exceeded 256 KiB\"))\n }\n const onEnd = (): void => {\n cleanup()\n resolve(Buffer.concat(chunks, size))\n }\n const onError = (cause: Error): void => {\n cleanup()\n reject(cause)\n }\n request.on(\"data\", onData)\n request.once(\"end\", onEnd)\n request.once(\"error\", onError)\n })\n}\n\nconst webRequest = async (request: IncomingMessage): Promise<Request> => {\n const headers = new Headers()\n for (let index = 0; index < request.rawHeaders.length; index += 2) {\n const name = request.rawHeaders[index]\n const value = request.rawHeaders[index + 1]\n if (name !== undefined && value !== undefined) {\n headers.append(name, value)\n }\n }\n const payload = await requestBody(request, 256 * 1024)\n return new Request(new URL(request.url ?? \"/\", \"http://cohall.local\"), {\n method: request.method ?? \"GET\",\n headers,\n ...(payload === undefined ? {} : { body: new Uint8Array(payload) }),\n })\n}\n\nconst sendResponse = async (target: ServerResponse, response: Response): Promise<void> => {\n target.statusCode = response.status\n response.headers.forEach((value, name) => target.setHeader(name, value))\n target.end(Buffer.from(await response.arrayBuffer()))\n}\n\nconst socketText = (message: RawData): string => {\n if (Buffer.isBuffer(message)) {\n return message.toString(\"utf8\")\n }\n if (message instanceof ArrayBuffer) {\n return Buffer.from(message).toString(\"utf8\")\n }\n if (Array.isArray(message)) {\n return Buffer.concat(message).toString(\"utf8\")\n }\n return Buffer.from(message).toString(\"utf8\")\n}\n\nconst rejectUpgrade = (socket: NodeJS.WritableStream, status: number, message: string): void => {\n socket.write(`HTTP/1.1 ${status} ${message}\\r\\nConnection: close\\r\\nContent-Length: 0\\r\\n\\r\\n`)\n if (\"destroy\" in socket && typeof socket.destroy === \"function\") {\n socket.destroy()\n }\n}\n\nconst body = <A, E, R>(\n request: Request,\n decode: (input: unknown) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, RequestError, R> =>\n Effect.tryPromise({\n try: () => request.json(),\n catch: () => new RequestError({ status: 400, message: \"Expected a JSON request body\" }),\n }).pipe(\n Effect.flatMap(decode),\n Effect.mapError((cause) =>\n cause instanceof RequestError\n ? cause\n : new RequestError({ status: 400, message: String(cause).slice(0, 2_048) }),\n ),\n )\n\nconst pathId = <S extends Schema.Top & { readonly DecodingServices: never }>(\n schema: S,\n value: string,\n): Effect.Effect<S[\"Type\"], RequestError> =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError(\n () => new RequestError({ status: 400, message: `Invalid identifier: ${value}` }),\n ),\n )\n\nconst scoreDevice = (\n device: Device,\n input: CreateTaskInput,\n sourceDeviceId: DeviceIdType | undefined,\n): number => {\n const prompt = `${input.prompt} ${input.context ?? \"\"}`.toLowerCase()\n const needsXcode = /\\b(xcode|ios|macos|swiftui|app store)\\b/.test(prompt)\n const needsBrowser =\n /\\b(browser|chrome|youtube|twitter|logged[- ]?in|signed[- ]?in|x\\.com)\\b/.test(prompt)\n return (\n (device.status === \"offline\" ? 0 : 100) +\n (input.workspace !== undefined &&\n device.workspaces.some(\n (workspace) =>\n input.workspace === workspace.path || input.workspace?.startsWith(`${workspace.path}/`),\n )\n ? 80\n : 0) +\n (needsXcode && device.capabilities.some((capability) => capability.id === \"xcode\") ? 60 : 0) +\n (needsBrowser && device.capabilities.some((capability) => capability.id === \"browser-session\")\n ? 40\n : 0) +\n (sourceDeviceId === device.id ? -5 : 0)\n )\n}\n\nexport const resolveDelegation = (\n input: CreateTaskInput,\n sourceDeviceId?: DeviceIdType,\n): Effect.Effect<\n { readonly input: CreateTaskInput; readonly targetDeviceId: DeviceIdType },\n RequestError,\n RelayStore.Service\n> =>\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n const ancestors: Array<Task> = []\n const seen = new Set<TaskId>()\n let nextParentId = input.parentTaskId\n while (nextParentId !== undefined && !seen.has(nextParentId)) {\n const parentId = nextParentId\n seen.add(parentId)\n const parent = yield* store.getTask(parentId).pipe(\n Effect.catch((cause) => {\n const missing = cause.message === `Unknown task ${parentId}`\n if (missing && ancestors.length > 0) return Effect.succeed(undefined)\n return Effect.fail(\n new RequestError({ status: missing ? 404 : 500, message: cause.message }),\n )\n }),\n )\n if (parent === undefined) break\n ancestors.push(parent)\n nextParentId = parent.parentTaskId\n }\n const parent = ancestors[0]\n if (\n parent !== undefined &&\n input.threadId !== undefined &&\n input.threadId !== parent.threadId\n ) {\n return yield* new RequestError({\n status: 400,\n message: \"A child task must use its parent's thread\",\n })\n }\n const resolvedInput = parent === undefined ? input : { ...input, threadId: parent.threadId }\n const devices = yield* store\n .listDevices()\n .pipe(Effect.mapError((cause) => new RequestError({ status: 500, message: cause.message })))\n const provider = input.provider ?? (input.botId === undefined ? \"codex\" : \"grok-bot\")\n const slot = taskSlot({\n provider,\n ...(input.botId === undefined ? {} : { botId: input.botId }),\n })\n const blocked = new Set(\n ancestors\n .filter((task) => !isTerminalTask(task) && taskSlot(task) === slot)\n .map((task) => task.targetDeviceId),\n )\n if (input.targetDeviceId !== undefined) {\n const target = devices.find((device) => device.id === input.targetDeviceId)\n if (target === undefined) {\n return yield* new RequestError({\n status: 404,\n message: `Unknown target device ${input.targetDeviceId}`,\n })\n }\n if (!target.providers.includes(provider)) {\n return yield* new RequestError({\n status: 409,\n message: `${target.name} does not advertise the ${provider} provider`,\n })\n }\n if (input.botId !== undefined && !target.bots?.some((bot) => bot.id === input.botId)) {\n return yield* new RequestError({\n status: 404,\n message: `${target.name} does not advertise bot ${input.botId}; refresh the bot list`,\n })\n }\n if (blocked.has(target.id)) {\n return yield* new RequestError({\n status: 409,\n message: `${target.name} cannot run this task while an unfinished parent occupies the same worker slot; select another device or bot`,\n })\n }\n return { input: resolvedInput, targetDeviceId: target.id }\n }\n const candidates = devices.filter(\n (device) =>\n device.providers.includes(provider) &&\n (input.botId === undefined || device.bots?.some((bot) => bot.id === input.botId)),\n )\n if (input.botId !== undefined && candidates.length > 1) {\n return yield* new RequestError({\n status: 409,\n message: `Bot ${input.botId} is advertised by more than one device; select a device`,\n })\n }\n const selected = candidates\n .filter((device) => !blocked.has(device.id))\n .sort(\n (left, right) =>\n scoreDevice(right, input, sourceDeviceId) - scoreDevice(left, input, sourceDeviceId),\n )[0]\n if (selected === undefined) {\n return yield* new RequestError({\n status: 409,\n message:\n candidates.length > 0\n ? \"No available delegation target avoids an unfinished parent's worker slot; select another device or bot\"\n : input.botId === undefined\n ? `No Cohall device advertises the ${provider} provider`\n : `No Cohall device advertises bot ${input.botId}; refresh the bot list`,\n })\n }\n return { input: resolvedInput, targetDeviceId: selected.id }\n })\n\ntype Principal = \"owner\" | AuthSession\n\nexport const runRelay = async (): Promise<void> => {\n const configuration = await Effect.runPromise(loadEnvironmentConfiguration)\n process.umask(0o077)\n const runtime = ManagedRuntime.make(\n RelayStore.layer(configuration.databasePath, configuration.historyTaskLimit),\n )\n const run = <A, E>(effect: Effect.Effect<A, E, RelayStore.Service>): Promise<A> =>\n runtime.runPromise(effect)\n await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n yield* store.recover()\n }),\n )\n if (\n platform() !== \"win32\" &&\n (await access(configuration.databasePath)\n .then(() => true)\n .catch(() => false))\n ) {\n await chmod(configuration.databasePath, 0o600)\n }\n\n const hub = new Hub()\n let connections = 0\n\n const tokenDigest = (token: string): Buffer => createHash(\"sha256\").update(token).digest()\n const ownerToken = (token: string): boolean =>\n timingSafeEqual(tokenDigest(token), tokenDigest(configuration.token))\n\n const authenticate = async (\n token: string,\n role: \"client\" | \"device\",\n ): Promise<Principal | undefined> => {\n if (ownerToken(token)) {\n return \"owner\"\n }\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.authenticateSession(token, role)\n }),\n ).catch(() => undefined)\n }\n\n const principalFor = async (request: Request): Promise<Principal | undefined> => {\n const authorization = request.headers.get(\"authorization\")\n if (authorization?.startsWith(\"Bearer \") !== true) {\n return undefined\n }\n return authenticate(authorization.slice(\"Bearer \".length), \"client\")\n }\n\n const dispatch = async (task: Task): Promise<Task> => {\n const store = await run(RelayStore.Service)\n const assigned = await Effect.runPromise(store.assignTask(task.id))\n if (assigned.status !== \"assigned\") {\n return assigned\n }\n if (\n hub.sendToDevice(\n assigned.targetDeviceId,\n SocketEvent.make({ _tag: \"TaskAssigned\", task: assigned }),\n assigned.provider === \"grok-bot\"\n ? () => Effect.runSync(store.markTaskDispatched(assigned.id))\n : undefined,\n )\n ) {\n return assigned\n }\n return Effect.runPromise(store.rollbackAssignment(task.id))\n }\n\n const dispatchOperation = async (operation: DeviceOperation): Promise<DeviceOperation> => {\n const assigned = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.assignOperation(operation.id)\n }),\n )\n if (assigned.status !== \"assigned\") {\n return assigned\n }\n if (\n hub.sendToDevice(\n assigned.targetDeviceId,\n SocketEvent.make({ _tag: \"OperationAssigned\", operation: assigned }),\n )\n ) {\n return assigned\n }\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.rollbackOperation(operation.id)\n }),\n )\n }\n\n const dispatchPendingOperations = async (deviceId: DeviceIdType): Promise<void> => {\n const operations = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.pendingOperationsFor(deviceId)\n }),\n )\n for (const operation of operations) {\n await dispatchOperation(operation)\n }\n }\n\n const dispatchPendingTasks = async (deviceId: DeviceIdType): Promise<void> => {\n const tasks = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n return yield* store.pendingTasksFor(deviceId)\n }),\n )\n for (const task of tasks) {\n if (task.status === \"cancelling\") {\n hub.sendToDevice(deviceId, SocketEvent.make({ _tag: \"CancelTask\", taskId: task.id }))\n } else {\n await dispatch(task)\n }\n }\n }\n\n const dispatchPending = async (deviceId: DeviceIdType): Promise<void> => {\n await dispatchPendingOperations(deviceId)\n await dispatchPendingTasks(deviceId)\n }\n\n const sendError = (socket: ConnectionSocket, code: string, message: string): void => {\n socket.send(\n JSON.stringify(\n SocketEvent.make({\n _tag: \"Error\",\n code: code.slice(0, 64),\n message: message.slice(0, 2_048),\n }),\n ),\n )\n }\n\n const handleSocketEvent = async (socket: ConnectionSocket, input: RawData): Promise<void> => {\n const event = await Effect.runPromise(\n Effect.try({\n try: () => JSON.parse(socketText(input)) as unknown,\n catch: () => new RequestError({ status: 400, message: \"Invalid socket JSON\" }),\n }).pipe(Effect.flatMap(decodeSocketEvent)),\n ).catch((cause: unknown) => {\n sendError(socket, \"invalid_event\", cause instanceof Error ? cause.message : String(cause))\n return undefined\n })\n if (event === undefined) {\n return\n }\n\n if (!hub.isAuthorized(socket)) {\n if (event._tag !== \"Authenticate\") {\n socket.close(4003, \"Authentication required\")\n return\n }\n const principal = await authenticate(event.token, \"device\")\n if (principal === undefined) {\n socket.close(4003, \"Authentication failed\")\n return\n }\n if (hub.pendingConnections() >= 64) {\n socket.close(4008, \"Pending device connection limit reached\")\n return\n }\n const attached = hub.attach(socket, {\n ...(principal === \"owner\" ? {} : { sessionId: principal.id }),\n ...(principal === \"owner\" || principal.deviceId === undefined\n ? {}\n : { boundDeviceId: principal.deviceId }),\n ...(principal === \"owner\" ? {} : { expiresAt: principal.expiresAt }),\n })\n if (!attached) {\n socket.close(4008, \"Credential connection limit reached\")\n return\n }\n socket.data.stageDeadline = setTimeout(() => {\n if (hub.deviceId(socket) === undefined) {\n socket.close(4003, \"Device registration timeout\")\n }\n }, 5_000)\n socket.send(\n JSON.stringify(\n SocketEvent.make({ _tag: \"Connected\", serverVersion: version, connectedAt: now() }),\n ),\n )\n return\n }\n\n if (event._tag === \"Authenticate\") {\n return\n }\n if (event._tag === \"DeviceHello\") {\n const bound = hub.boundDeviceId(socket)\n if (bound !== undefined && bound !== event.device.id) {\n socket.close(4003, \"Device identity does not match its session\")\n return\n }\n const device = Device.make({\n ...event.device,\n status: \"online\",\n connectedAt: now(),\n lastSeenAt: now(),\n })\n if (!hub.registerDevice(device.id, socket)) {\n socket.close(4009, \"Device is already connected\")\n return\n }\n await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n yield* store.upsertDevice(device)\n }),\n )\n // Reconcile work the daemon may still be running before an upgrade can occupy the device.\n await dispatchPendingTasks(device.id)\n await dispatchPendingOperations(device.id)\n return\n }\n\n const deviceId = hub.deviceId(socket)\n if (deviceId === undefined) {\n sendError(socket, \"device_hello_required\", \"Send DeviceHello before device events\")\n return\n }\n\n const settle = (taskId: TaskId): void => {\n socket.send(JSON.stringify(SocketEvent.make({ _tag: \"TaskSettled\", taskId })))\n }\n const settleOperation = (operationId: OperationId): void => {\n socket.send(JSON.stringify(SocketEvent.make({ _tag: \"OperationSettled\", operationId })))\n }\n const processed = await run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n switch (event._tag) {\n case \"DeviceHeartbeat\":\n if (event.deviceId === deviceId) {\n yield* store.heartbeat(\n deviceId,\n event.status === \"busy\" ? \"busy\" : \"online\",\n event.bots,\n )\n }\n return\n case \"TaskAccepted\":\n yield* store.acceptTask(event.taskId, deviceId)\n return\n case \"TaskFinished\":\n yield* store.finishTask(event.taskId, deviceId, event.result, event.providerSessionId)\n return\n case \"TaskFailed\":\n yield* store.failTask(event.taskId, deviceId, event.error)\n return\n case \"TaskCancelled\":\n yield* store.acknowledgeCancellation(event.taskId, deviceId)\n return\n case \"OperationAccepted\":\n yield* store.acceptOperation(event.operationId, deviceId)\n return\n case \"OperationFinished\":\n yield* store.finishOperation(event.operationId, deviceId, event.result)\n return\n case \"OperationFailed\":\n yield* store.failOperation(event.operationId, deviceId, event.error)\n return\n case \"Connected\":\n case \"TaskAssigned\":\n case \"TaskSettled\":\n case \"CancelTask\":\n case \"OperationAssigned\":\n case \"OperationSettled\":\n case \"Error\":\n return\n }\n }),\n )\n .then(() => true)\n .catch((cause: unknown) => {\n sendError(socket, \"event_failed\", cause instanceof Error ? cause.message : String(cause))\n return false\n })\n if (\n processed &&\n (event._tag === \"TaskFinished\" ||\n event._tag === \"TaskFailed\" ||\n event._tag === \"TaskCancelled\")\n ) {\n settle(event.taskId)\n await dispatchPending(deviceId)\n }\n if (processed && (event._tag === \"OperationFinished\" || event._tag === \"OperationFailed\")) {\n settleOperation(event.operationId)\n await dispatchPending(deviceId)\n }\n }\n\n const api = async (request: Request, url: URL): Promise<Response> => {\n if (url.pathname === \"/api/health\" && request.method === \"GET\") {\n return json({ ok: true, version })\n }\n if (url.pathname === \"/api/auth/pair\" && request.method === \"POST\") {\n return run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n const input = yield* body(request, decodeExchangePairingInput)\n return yield* store.exchangePairing(input.token)\n }),\n )\n .then((value) => json(value, 201))\n .catch(() =>\n json({ error: \"Pairing credential is invalid, expired, or already used\" }, 401),\n )\n }\n\n const principal = await principalFor(request)\n if (principal === undefined) {\n return json({ error: \"Unauthorized\" }, 401)\n }\n const ownerOnly =\n url.pathname.startsWith(\"/api/auth/\") || url.pathname.startsWith(\"/api/operations\")\n if (ownerOnly && principal !== \"owner\") {\n return json({ error: \"Owner token required\" }, 403)\n }\n const sourceDeviceId = principal === \"owner\" ? undefined : principal.deviceId\n\n const effect = Effect.gen(function* () {\n const store = yield* RelayStore.Service\n if (url.pathname === \"/api/auth/pairings\" && request.method === \"POST\") {\n const input = yield* body(request, decodeCreatePairingInput)\n return json(yield* store.createPairing(input), 201)\n }\n if (url.pathname === \"/api/auth/sessions\" && request.method === \"GET\") {\n return json(yield* store.listAuthSessions())\n }\n const revoke = url.pathname.match(/^\\/api\\/auth\\/sessions\\/([^/]+)\\/revoke$/)\n if (request.method === \"POST\" && revoke?.[1] !== undefined) {\n const id = yield* pathId(AuthSessionId, revoke[1])\n const session = yield* store.revokeAuthSession(id)\n hub.closeSession(id)\n return json(session)\n }\n if (url.pathname === \"/api/devices\" && request.method === \"GET\") {\n return json(yield* store.listDevices())\n }\n if (url.pathname === \"/api/usage\" && request.method === \"GET\") {\n return json(yield* store.usage())\n }\n if (url.pathname === \"/api/operations\" && request.method === \"GET\") {\n return json(yield* store.listOperations())\n }\n if (url.pathname === \"/api/operations/upgrades\" && request.method === \"POST\") {\n const input = yield* body(request, decodeCreateUpgradeOperationsInput)\n const operations = yield* store.createUpgradeOperations(input)\n return json(\n yield* Effect.tryPromise(() => Promise.all(operations.map(dispatchOperation))),\n 201,\n )\n }\n const abandonOperation = url.pathname.match(/^\\/api\\/operations\\/([^/]+)\\/abandon$/)\n if (request.method === \"POST\" && abandonOperation?.[1] !== undefined) {\n const operation = yield* store.abandonOperation(\n yield* pathId(OperationId, abandonOperation[1]),\n )\n hub.sendToDevice(\n operation.targetDeviceId,\n SocketEvent.make({ _tag: \"OperationSettled\", operationId: operation.id }),\n )\n return json(operation)\n }\n const forgetDevice = url.pathname.match(/^\\/api\\/devices\\/([^/]+)\\/forget$/)\n if (request.method === \"POST\" && forgetDevice?.[1] !== undefined) {\n if (principal !== \"owner\") {\n return yield* new RequestError({ status: 403, message: \"Owner token required\" })\n }\n const id = yield* pathId(DeviceId, forgetDevice[1])\n if (hub.hasDevice(id)) {\n return yield* new RequestError({\n status: 409,\n message: `Device ${id} must be offline before it can be forgotten`,\n })\n }\n const forgotten = yield* store.forgetDevice(id)\n hub.closeDevice(id)\n return json(forgotten)\n }\n if (url.pathname === \"/api/tasks\" && request.method === \"POST\") {\n const { input, targetDeviceId: target } = yield* resolveDelegation(\n yield* body(request, decodeCreateTaskInput),\n sourceDeviceId,\n )\n const providerSessionId =\n input.threadId === undefined || input.provider === \"grok-bot\"\n ? undefined\n : yield* store.sessionFor(input.threadId, target, input.provider ?? \"codex\")\n const task = yield* store.createDelegation(input, target, sourceDeviceId, providerSessionId)\n return json(yield* Effect.tryPromise(() => dispatch(task)), 201)\n }\n const task = url.pathname.match(/^\\/api\\/tasks\\/([^/]+)$/)\n if (request.method === \"GET\" && task?.[1] !== undefined) {\n return json(yield* store.getTask(yield* pathId(TaskId, task[1])))\n }\n const trace = url.pathname.match(/^\\/api\\/tasks\\/([^/]+)\\/trace$/)\n if (request.method === \"GET\" && trace?.[1] !== undefined) {\n return json(yield* store.traceTask(yield* pathId(TaskId, trace[1])))\n }\n const cancel = url.pathname.match(/^\\/api\\/tasks\\/([^/]+)\\/cancel$/)\n if (request.method === \"POST\" && cancel?.[1] !== undefined) {\n const id = yield* pathId(TaskId, cancel[1])\n const updated = yield* store.requestCancellation(id)\n if (updated.status === \"cancelling\") {\n hub.sendToDevice(\n updated.targetDeviceId,\n SocketEvent.make({ _tag: \"CancelTask\", taskId: id }),\n )\n }\n return json(updated)\n }\n const thread = url.pathname.match(/^\\/api\\/threads\\/([^/]+)$/)\n if (request.method === \"GET\" && thread?.[1] !== undefined) {\n return json(yield* store.threadContext(yield* pathId(ThreadId, thread[1])))\n }\n return yield* new RequestError({ status: 404, message: \"Route not found\" })\n }).pipe(\n Effect.mapError((cause) =>\n cause instanceof RequestError\n ? cause\n : new RequestError({\n status:\n cause._tag !== \"RelayStore.PersistenceError\"\n ? 500\n : cause.message.startsWith(\"Unknown\")\n ? 404\n : cause.message.includes(\"cannot cancel an individual Cohall request\")\n ? 409\n : cause.message.includes(\"outstanding task limit\")\n ? 429\n : cause.message.includes(\"must be offline\") ||\n cause.message.includes(\"still has outstanding tasks\") ||\n cause.message.includes(\"upgrade operation in progress\") ||\n cause.message === \"No Cohall devices are registered\" ||\n cause.message.startsWith(\"All-device operations support\")\n ? 409\n : 500,\n message: cause.message,\n }),\n ),\n )\n return run(effect).catch((cause: unknown) =>\n cause instanceof RequestError\n ? json(\n { error: cause.status === 500 ? \"Relay request failed\" : cause.message },\n cause.status,\n )\n : json({ error: \"Relay request failed\" }, 500),\n )\n }\n\n const websocketServer = new WebSocketServer({\n noServer: true,\n maxPayload: maxSocketPayloadBytes,\n perMessageDeflate: false,\n allowSynchronousEvents: false,\n })\n websocketServer.on(\"connection\", (rawSocket) => {\n const socket = rawSocket as ConnectionSocket\n socket.on(\"error\", () => socket.terminate())\n socket.data = {\n processing: Promise.resolve(),\n stageDeadline: undefined,\n preAuthFrameReceived: false,\n queuedMessages: 0,\n closed: false,\n }\n connections += 1\n socket.data.stageDeadline = setTimeout(() => {\n if (!hub.isAuthorized(socket)) {\n socket.close(4003, \"Authentication timeout\")\n }\n }, 5_000)\n let alive = true\n socket.on(\"pong\", () => {\n alive = true\n })\n const heartbeat = setInterval(() => {\n if (!hub.isAuthorized(socket)) {\n return\n }\n if (!alive) {\n socket.terminate()\n return\n }\n alive = false\n socket.ping()\n }, 30_000)\n heartbeat.unref()\n\n socket.on(\"message\", (message: RawData) => {\n if (!hub.isAuthorized(socket)) {\n const size = Buffer.byteLength(socketText(message))\n if (socket.data.preAuthFrameReceived || size > 1_024) {\n socket.close(4003, \"Only one authentication frame is allowed\")\n return\n }\n socket.data.preAuthFrameReceived = true\n socket.data.processing = handleSocketEvent(socket, message).catch((cause: unknown) => {\n sendError(socket, \"event_failed\", cause instanceof Error ? cause.message : String(cause))\n })\n return\n }\n if (socket.data.queuedMessages >= 8) {\n socket.close(4008, \"Message queue limit reached\")\n return\n }\n socket.data.queuedMessages += 1\n socket.data.processing = socket.data.processing\n .then(() => (socket.data.closed ? undefined : handleSocketEvent(socket, message)))\n .catch((cause: unknown) => {\n sendError(socket, \"event_failed\", cause instanceof Error ? cause.message : String(cause))\n })\n .finally(() => {\n socket.data.queuedMessages = Math.max(0, socket.data.queuedMessages - 1)\n })\n })\n\n socket.once(\"close\", () => {\n clearInterval(heartbeat)\n socket.data.closed = true\n connections = Math.max(0, connections - 1)\n const deviceId = hub.detach(socket)\n if (deviceId === undefined) {\n return\n }\n void run(\n Effect.gen(function* () {\n const store = yield* RelayStore.Service\n yield* store.requeueTasksFor(deviceId)\n yield* store.requeueOperationsFor(deviceId)\n yield* store.markDeviceOffline(deviceId)\n }),\n ).catch((cause: unknown) => console.error(cause))\n })\n })\n\n const server = createServer((incoming, outgoing) => {\n void webRequest(incoming)\n .then((request) => {\n const url = new URL(request.url)\n return url.pathname.startsWith(\"/api/\")\n ? api(request, url)\n : json({ name: \"Cohall relay\", version, status: \"running\" })\n })\n .then((response) => sendResponse(outgoing, response))\n .catch((cause: unknown) =>\n sendResponse(\n outgoing,\n json(\n { error: cause instanceof Error ? cause.message : \"Invalid request\" },\n cause instanceof Error && cause.message.includes(\"256 KiB\") ? 413 : 400,\n ),\n ),\n )\n })\n server.on(\"upgrade\", (request, socket, head) => {\n const url = URL.parse(request.url ?? \"/\", \"http://cohall.local\")\n if (url === null) {\n rejectUpgrade(socket, 400, \"Bad Request\")\n return\n }\n if (url.pathname !== \"/ws/device\") {\n rejectUpgrade(socket, 404, \"Not Found\")\n return\n }\n if (connections >= 1_024) {\n rejectUpgrade(socket, 503, \"Service Unavailable\")\n return\n }\n websocketServer.handleUpgrade(request, socket, head, (websocket) => {\n websocketServer.emit(\"connection\", websocket, request)\n })\n })\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(relayListenOptions(configuration), () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n\n const address = server.address()\n const listener =\n typeof address === \"string\"\n ? address\n : address?.family === \"IPv6\"\n ? `[${address.address}]:${address.port}`\n : `${address?.address ?? configuration.host}:${address?.port ?? configuration.port}`\n console.log(`Cohall relay listening on http://${listener}`)\n let stopping = false\n const shutdown = async (): Promise<void> => {\n if (stopping) {\n return\n }\n stopping = true\n for (const socket of websocketServer.clients) {\n socket.close(1001, \"Relay shutting down\")\n }\n await new Promise<void>((resolve) => server.close(() => resolve()))\n websocketServer.close()\n await runtime.dispose()\n }\n process.once(\"SIGINT\", () => void shutdown())\n process.once(\"SIGTERM\", () => void shutdown())\n}\n\nif (import.meta.main) {\n await runRelay().catch((cause: unknown) => {\n console.error(cause instanceof Error ? cause.message : String(cause))\n process.exitCode = 1\n })\n}\n",
11
11
  "#!/usr/bin/env node\n\nimport { version } from \"@cohall/protocol\"\nimport { Effect } from \"effect\"\nimport { printHelp, runCli } from \"./cli.ts\"\nimport { loadClientConfiguration, loadDeviceConfiguration } from \"./config.ts\"\nimport { runDaemon } from \"./daemon.ts\"\nimport { runMcp } from \"./mcp.ts\"\n\nconst main = async (): Promise<void> => {\n const command = process.argv[2]\n if (command === undefined || command === \"help\" || command === \"--help\" || command === \"-h\") {\n printHelp()\n return\n }\n if (command === \"--version\" || command === \"version\") {\n console.log(version)\n return\n }\n const commandArguments = process.argv.slice(3)\n if (\n commandArguments.length === 1 &&\n [\"--help\", \"-h\", \"help\"].includes(commandArguments[0] ?? \"\")\n ) {\n printHelp()\n return\n }\n if ([\"device\", \"mcp\"].includes(command) && process.argv.length > 3) {\n throw new Error(`${command} does not accept arguments`)\n }\n if (command === \"relay\" && commandArguments.length === 0) {\n const { runRelay } = await import(\"@cohall/relay\")\n await runRelay()\n return\n }\n if (command === \"device\") {\n const configuration = await Effect.runPromise(loadDeviceConfiguration)\n await Effect.runPromise(runDaemon(configuration))\n return\n }\n if (command === \"mcp\") {\n const configuration = await Effect.runPromise(loadClientConfiguration)\n await runMcp(configuration)\n return\n }\n await runCli(command, commandArguments)\n}\n\nawait main().catch((cause: unknown) => {\n console.error(\n JSON.stringify({ error: cause instanceof Error ? cause.message : String(cause) }, null, 2),\n )\n process.exitCode = 1\n})\n",
12
12
  "import {\n AuthSession,\n CreatePairingInput,\n CreateTaskInput,\n CreateUpgradeOperationsInput,\n Device,\n DeviceOperation,\n ErrorResponse,\n ExchangePairingInput,\n PairingCredential,\n PairingResult,\n Task,\n TaskTrace,\n ThreadContext,\n UsageSummary,\n type AuthSessionId,\n type DeviceId,\n type OperationId,\n type TaskId,\n type ThreadId,\n} from \"@cohall/protocol\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\n\nexport interface RelayClientOptions {\n readonly baseUrl: string\n readonly token: string\n}\n\nexport class RelayRequestError extends Schema.TaggedErrorClass<RelayRequestError>()(\n \"RelayClient.RequestError\",\n {\n operation: Schema.String,\n message: Schema.String,\n status: Schema.optionalKey(Schema.Number),\n },\n) {}\n\nexport class RelayDecodeError extends Schema.TaggedErrorClass<RelayDecodeError>()(\n \"RelayClient.DecodeError\",\n { operation: Schema.String, message: Schema.String },\n) {}\n\nexport type RelayClientError = RelayRequestError | RelayDecodeError\n\nexport interface Interface {\n readonly devices: () => Effect.Effect<ReadonlyArray<Device>, RelayClientError>\n readonly forgetDevice: (deviceId: DeviceId) => Effect.Effect<Device, RelayClientError>\n readonly createTask: (input: CreateTaskInput) => Effect.Effect<Task, RelayClientError>\n readonly getTask: (taskId: TaskId) => Effect.Effect<Task, RelayClientError>\n readonly traceTask: (taskId: TaskId) => Effect.Effect<TaskTrace, RelayClientError>\n readonly cancelTask: (taskId: TaskId) => Effect.Effect<Task, RelayClientError>\n readonly threadContext: (threadId: ThreadId) => Effect.Effect<ThreadContext, RelayClientError>\n readonly createPairing: (\n input: CreatePairingInput,\n ) => Effect.Effect<PairingCredential, RelayClientError>\n readonly authSessions: () => Effect.Effect<ReadonlyArray<AuthSession>, RelayClientError>\n readonly revokeAuthSession: (\n sessionId: AuthSessionId,\n ) => Effect.Effect<AuthSession, RelayClientError>\n readonly usage: () => Effect.Effect<UsageSummary, RelayClientError>\n readonly createUpgradeOperations: (\n input: CreateUpgradeOperationsInput,\n ) => Effect.Effect<ReadonlyArray<DeviceOperation>, RelayClientError>\n readonly operations: () => Effect.Effect<ReadonlyArray<DeviceOperation>, RelayClientError>\n readonly abandonOperation: (\n operationId: OperationId,\n ) => Effect.Effect<DeviceOperation, RelayClientError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@cohall/RelayClient\") {}\n\nconst normalizeBaseUrl = (url: string): string => url.replace(/\\/+$/, \"\")\n\nconst jsonBody = async (response: Response, operation: string): Promise<unknown> => {\n if (response.body === null) {\n throw new RelayDecodeError({ operation, message: \"Relay returned an empty response\" })\n }\n const reader = response.body.getReader()\n const chunks: Array<Uint8Array> = []\n let size = 0\n while (true) {\n const chunk = await reader.read()\n if (chunk.done) {\n break\n }\n size += chunk.value.byteLength\n if (size > 2 * 1024 * 1024) {\n await reader.cancel()\n throw new RelayDecodeError({ operation, message: \"Relay response exceeded 2 MiB\" })\n }\n chunks.push(chunk.value)\n }\n const bytes = new Uint8Array(size)\n let offset = 0\n for (const chunk of chunks) {\n bytes.set(chunk, offset)\n offset += chunk.byteLength\n }\n const text = new TextDecoder().decode(bytes)\n try {\n return JSON.parse(text) as unknown\n } catch (cause) {\n throw new RelayDecodeError({\n operation,\n message: cause instanceof Error ? cause.message : String(cause),\n })\n }\n}\n\nconst responseMessage = async (response: Response, operation: string): Promise<string> => {\n const json = await jsonBody(response, operation).catch(() => undefined)\n const decoded = Schema.decodeUnknownOption(ErrorResponse)(json)\n return decoded._tag === \"Some\"\n ? decoded.value.error\n : `${response.status} ${response.statusText}`.trim()\n}\n\nexport const make = (options: RelayClientOptions): Interface => {\n const baseUrl = normalizeBaseUrl(options.baseUrl)\n\n const request = <S extends Schema.Top & { readonly DecodingServices: never }>(\n operation: string,\n path: string,\n schema: S,\n init?: RequestInit,\n ): Effect.Effect<S[\"Type\"], RelayClientError> =>\n Effect.gen(function* () {\n const response = yield* Effect.tryPromise({\n try: (signal) =>\n fetch(`${baseUrl}${path}`, {\n ...init,\n signal: AbortSignal.any([signal, AbortSignal.timeout(30_000)]),\n headers: {\n authorization: `Bearer ${options.token}`,\n \"content-type\": \"application/json\",\n ...init?.headers,\n },\n }),\n catch: (cause) =>\n new RelayRequestError({\n operation,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n if (!response.ok) {\n return yield* Effect.fail(\n new RelayRequestError({\n operation,\n message: yield* Effect.promise(() => responseMessage(response, operation)),\n status: response.status,\n }),\n )\n }\n const json = yield* Effect.tryPromise({\n try: () => jsonBody(response, operation),\n catch: (cause) =>\n cause instanceof RelayDecodeError\n ? cause\n : new RelayDecodeError({ operation, message: String(cause) }),\n })\n return yield* Schema.decodeUnknownEffect(schema)(json).pipe(\n Effect.mapError((cause) => new RelayDecodeError({ operation, message: String(cause) })),\n )\n })\n\n return Service.of({\n devices: () => request(\"RelayClient.devices\", \"/api/devices\", Schema.Array(Device)),\n forgetDevice: (deviceId) =>\n request(\n \"RelayClient.forgetDevice\",\n `/api/devices/${encodeURIComponent(deviceId)}/forget`,\n Device,\n { method: \"POST\" },\n ),\n createTask: (input) =>\n request(\"RelayClient.createTask\", \"/api/tasks\", Task, {\n method: \"POST\",\n body: JSON.stringify(input),\n }),\n getTask: (taskId) =>\n request(\"RelayClient.getTask\", `/api/tasks/${encodeURIComponent(taskId)}`, Task),\n traceTask: (taskId) =>\n request(\"RelayClient.traceTask\", `/api/tasks/${encodeURIComponent(taskId)}/trace`, TaskTrace),\n cancelTask: (taskId) =>\n request(\"RelayClient.cancelTask\", `/api/tasks/${encodeURIComponent(taskId)}/cancel`, Task, {\n method: \"POST\",\n }),\n threadContext: (threadId) =>\n request(\n \"RelayClient.threadContext\",\n `/api/threads/${encodeURIComponent(threadId)}`,\n ThreadContext,\n ),\n createPairing: (input) =>\n request(\"RelayClient.createPairing\", \"/api/auth/pairings\", PairingCredential, {\n method: \"POST\",\n body: JSON.stringify(input),\n }),\n authSessions: () =>\n request(\"RelayClient.authSessions\", \"/api/auth/sessions\", Schema.Array(AuthSession)),\n revokeAuthSession: (sessionId) =>\n request(\n \"RelayClient.revokeAuthSession\",\n `/api/auth/sessions/${encodeURIComponent(sessionId)}/revoke`,\n AuthSession,\n { method: \"POST\" },\n ),\n usage: () => request(\"RelayClient.usage\", \"/api/usage\", UsageSummary),\n createUpgradeOperations: (input) =>\n request(\n \"RelayClient.createUpgradeOperations\",\n \"/api/operations/upgrades\",\n Schema.Array(DeviceOperation),\n { method: \"POST\", body: JSON.stringify(input) },\n ),\n operations: () =>\n request(\"RelayClient.operations\", \"/api/operations\", Schema.Array(DeviceOperation)),\n abandonOperation: (operationId) =>\n request(\n \"RelayClient.abandonOperation\",\n `/api/operations/${encodeURIComponent(operationId)}/abandon`,\n DeviceOperation,\n { method: \"POST\" },\n ),\n })\n}\n\nexport const exchangePairing = (\n baseUrl: string,\n input: ExchangePairingInput,\n): Effect.Effect<PairingResult, RelayClientError> =>\n Effect.gen(function* () {\n const operation = \"RelayClient.exchangePairing\"\n const response = yield* Effect.tryPromise({\n try: (signal) =>\n fetch(`${normalizeBaseUrl(baseUrl)}/api/auth/pair`, {\n method: \"POST\",\n signal: AbortSignal.any([signal, AbortSignal.timeout(30_000)]),\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }),\n catch: (cause) =>\n new RelayRequestError({\n operation,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n if (!response.ok) {\n return yield* Effect.fail(\n new RelayRequestError({\n operation,\n message: yield* Effect.promise(() => responseMessage(response, operation)),\n status: response.status,\n }),\n )\n }\n const json = yield* Effect.tryPromise({\n try: () => jsonBody(response, operation),\n catch: (cause) =>\n cause instanceof RelayDecodeError\n ? cause\n : new RelayDecodeError({ operation, message: String(cause) }),\n })\n return yield* Schema.decodeUnknownEffect(PairingResult)(json).pipe(\n Effect.mapError((cause) => new RelayDecodeError({ operation, message: String(cause) })),\n )\n })\n\nexport const layer = (options: RelayClientOptions) => Layer.succeed(Service, make(options))\nexport * as RelayClient from \"./index.ts\"\n",
13
- "import { RelayClient } from \"@cohall/client\"\nimport {\n AuthSessionId,\n DeviceId,\n OperationId,\n Provider,\n TaskId,\n ThreadId,\n assertDeviceOperationSupport,\n makeDeviceId,\n version,\n} from \"@cohall/protocol\"\nimport * as Providers from \"@cohall/providers\"\nimport { Effect, Schema } from \"effect\"\nimport { access, mkdir, readFile, stat, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join, resolve } from \"node:path\"\nimport skill from \"../../../skills/cohall/SKILL.md\" with { type: \"text\" }\nimport {\n StoredConfiguration,\n configurationPath,\n credentialsForRelay,\n loadClientConfiguration,\n loadOwnerConfiguration,\n makeStoredConfiguration,\n normalizeRelayUrl,\n parseProviders,\n parseWorkspaces,\n readStoredConfiguration,\n writeStoredConfiguration,\n} from \"./config.ts\"\nimport {\n createDelegation,\n followTaskTrace,\n listBots,\n taskResult,\n threadContext,\n waitForTask,\n} from \"./delegation.ts\"\nimport { allDeviceHealth, deviceVersions } from \"./device-overview.ts\"\nimport { discoverGrokBots } from \"./grok-bot.ts\"\nimport { writeBotReply } from \"./bot-replies.ts\"\nimport { guidedSetupInput, joinRelay, terminalPrompter, type Prompter } from \"./setup.ts\"\nimport { backupRelay, restoreRelay, switchRelay } from \"./relay-migration.ts\"\nimport { installDeviceService } from \"./service.ts\"\nimport { deviceVersionWarning, normalizeUpgradeTarget, upgrade } from \"./upgrade.ts\"\n\ninterface Arguments {\n readonly options: ReadonlyMap<string, ReadonlyArray<string> | true>\n readonly positionals: ReadonlyArray<string>\n}\n\nconst valueOptions = new Set([\n \"context\",\n \"context-file\",\n \"grok-gateway\",\n \"error\",\n \"label\",\n \"model\",\n \"message\",\n \"message-file\",\n \"name\",\n \"parent\",\n \"prompt\",\n \"prompt-file\",\n \"provider\",\n \"providers\",\n \"relay\",\n \"sandbox\",\n \"target\",\n \"thread\",\n \"timeout\",\n \"token-file\",\n \"to\",\n \"workspace\",\n])\nconst flagOptions = new Set([\n \"all\",\n \"allow-http\",\n \"client-only\",\n \"dry-run\",\n \"follow\",\n \"no-restart\",\n \"no-wait\",\n \"service\",\n])\nconst aliases = new Map([\n [\"-c\", \"context\"],\n [\"-p\", \"prompt\"],\n [\"-t\", \"target\"],\n [\"-T\", \"thread\"],\n [\"-w\", \"workspace\"],\n])\n\nconst help = `Cohall connects agents running on your own devices.\n\nUsage:\n cohall init [--relay url] [--workspace path] [--providers list] [--service]\n cohall join --relay <url> --workspace <path> [--providers list] [--token-file <path>]\n cohall configure [--relay url] [--name name] [--workspace path]\n [--providers codex,opencode|auto] [--model id]\n [--grok-gateway path]\n cohall config\n cohall devices\n cohall bots\n cohall send [@device-or-bot] [prompt] [delegate options]\n cohall delegate [prompt] [--target @device-or-bot] [--provider provider]\n [--context text] [--thread uuid] [--parent task-id] [--workspace path]\n [--timeout seconds] [--no-wait]\n cohall status <task-id>\n cohall trace <task-id> [--follow]\n cohall wait <task-id> [--timeout seconds]\n cohall cancel <task-id>\n cohall reply <task-id> --message-file path | --message text | --message - | --error text\n cohall thread <thread-id>\n cohall pair [--label name] [--client-only]\n cohall sessions\n cohall revoke <session-id>\n cohall forget <device-id>\n cohall doctor [--all]\n cohall versions\n cohall usage\n cohall upgrade [--to version|latest] [--no-restart] [--dry-run]\n cohall upgrade --all [--to version|latest] [--no-restart] [--dry-run]\n cohall upgrades [abandon <operation-id>]\n cohall service install\n cohall device\n cohall relay\n cohall relay backup <directory>\n cohall relay restore <directory>\n cohall relay use <url> [--no-restart] [--allow-http]\n cohall mcp\n cohall skill [install [agents|claude|opencode|all]]\n cohall integrations\n\nProviders: codex, claude-code, opencode, grok-bot.\nConfiguration is stored per user; environment variables override it.`\n\nconst parseArguments = (values: ReadonlyArray<string>): Arguments => {\n const options = new Map<string, ReadonlyArray<string> | true>()\n const positionals: Array<string> = []\n for (let index = 0; index < values.length; index += 1) {\n const argument = values[index]\n if (argument === undefined) {\n break\n }\n if (argument === \"--\") {\n positionals.push(...values.slice(index + 1))\n break\n }\n if (!argument.startsWith(\"-\")) {\n positionals.push(argument)\n continue\n }\n const separator = argument.indexOf(\"=\")\n const rawName = separator === -1 ? argument : argument.slice(0, separator)\n const inline = separator === -1 ? undefined : argument.slice(separator + 1)\n const name = aliases.get(rawName) ?? rawName.replace(/^--/, \"\")\n if (flagOptions.has(name)) {\n if (inline !== undefined) {\n throw new Error(`--${name} does not accept a value`)\n }\n options.set(name, true)\n continue\n }\n if (!valueOptions.has(name)) {\n throw new Error(`Unknown option: ${argument}`)\n }\n const value = inline ?? values[index + 1]\n if (value === undefined || (inline === undefined && value.startsWith(\"-\") && value !== \"-\")) {\n throw new Error(`${rawName} requires a value`)\n }\n const previous = options.get(name)\n options.set(name, previous === undefined || previous === true ? [value] : [...previous, value])\n if (inline === undefined) {\n index += 1\n }\n }\n return { options, positionals }\n}\n\nconst values = (arguments_: Arguments, name: string): ReadonlyArray<string> => {\n const option = arguments_.options.get(name)\n if (option === true) {\n throw new Error(`--${name} requires a value`)\n }\n return option ?? []\n}\nconst option = (arguments_: Arguments, name: string): string | undefined => {\n const found = values(arguments_, name)\n if (found.length > 1 && name !== \"workspace\") {\n throw new Error(`--${name} may only be specified once`)\n }\n return found[0]\n}\nconst allowOptions = (arguments_: Arguments, names: ReadonlyArray<string>): void => {\n const allowed = new Set(names)\n for (const name of arguments_.options.keys()) {\n if (!allowed.has(name)) {\n throw new Error(`--${name} is not valid for this command`)\n }\n }\n}\nconst noPositionals = (arguments_: Arguments, command: string): void => {\n if (arguments_.positionals.length > 0) {\n throw new Error(`${command} does not accept positional arguments`)\n }\n}\nconst identifier = (arguments_: Arguments, label: string): string => {\n const value = arguments_.positionals[0]\n if (value === undefined) {\n throw new Error(`${label} is required`)\n }\n if (arguments_.positionals.length > 1) {\n throw new Error(`Unexpected arguments after ${label}`)\n }\n return value\n}\nconst print = (value: unknown): void => console.log(JSON.stringify(value, null, 2))\nconst printLine = (value: unknown): void => console.log(JSON.stringify(value))\n\nconst readInput = async (\n arguments_: Arguments,\n name: \"prompt\" | \"context\" | \"message\",\n): Promise<string | undefined> => {\n const direct = option(arguments_, name)\n const path = option(arguments_, `${name}-file`)\n const byteLimit = name === \"message\" ? 4 * 131_072 : 131_072\n if (direct !== undefined && path !== undefined) {\n throw new Error(`Use either --${name} or --${name}-file, not both`)\n }\n if (path !== undefined) {\n if (\n !(await access(path)\n .then(() => true)\n .catch(() => false))\n ) {\n throw new Error(`File does not exist: ${path}`)\n }\n if ((await stat(path)).size > byteLimit) {\n throw new Error(`${name} file exceeds ${byteLimit / 1024} KiB`)\n }\n }\n const result =\n path === undefined\n ? direct === \"-\"\n ? await readStdin(byteLimit, name)\n : direct\n : await readFile(path, \"utf8\")\n if (result !== undefined && result.length > 131_072) {\n throw new Error(`${name} exceeds 131072 characters`)\n }\n return result\n}\n\nconst readStdin = async (limit: number, label: string): Promise<string> => {\n const chunks: Array<Buffer> = []\n let size = 0\n for await (const chunk of process.stdin) {\n const bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : Buffer.from(chunk)\n size += bytes.byteLength\n if (size > limit) {\n throw new Error(`${label} exceeds ${Math.floor(limit / 1024)} KiB`)\n }\n chunks.push(bytes)\n }\n return Buffer.concat(chunks, size).toString(\"utf8\")\n}\n\nconst timeout = (arguments_: Arguments): number => {\n const seconds = Number(option(arguments_, \"timeout\") ?? \"900\")\n if (!Number.isInteger(seconds) || seconds < 5 || seconds > 86_400) {\n throw new Error(\"--timeout must be an integer between 5 and 86400\")\n }\n return seconds\n}\n\nconst pairingToken = async (arguments_: Arguments): Promise<string> => {\n const path = option(arguments_, \"token-file\")\n if (\n path !== undefined &&\n !(await access(path)\n .then(() => true)\n .catch(() => false))\n ) {\n throw new Error(`Pairing token file does not exist: ${path}`)\n }\n if (path !== undefined && (await stat(path)).size > 512) {\n throw new Error(\"Pairing token file exceeds 512 bytes\")\n }\n const token = (\n path === undefined ? await readStdin(512, \"Pairing token\") : await readFile(path, \"utf8\")\n ).trim()\n if (token.length === 0 || new TextEncoder().encode(token).byteLength > 256) {\n throw new Error(\"Provide a pairing token on stdin or with --token-file\")\n }\n return token\n}\n\nconst client = async () => {\n const configuration = await Effect.runPromise(loadClientConfiguration)\n return {\n configuration,\n relay: RelayClient.make({ baseUrl: configuration.relayUrl, token: configuration.token }),\n }\n}\n\nconst ownerClient = async () => {\n const configuration = await Effect.runPromise(loadOwnerConfiguration)\n return {\n configuration,\n relay: RelayClient.make({ baseUrl: configuration.relayUrl, token: configuration.token }),\n }\n}\n\nconst installSkill = async (target: string): Promise<ReadonlyArray<string>> => {\n const roots = {\n agents: join(homedir(), \".agents\", \"skills\", \"cohall\", \"SKILL.md\"),\n claude: join(homedir(), \".claude\", \"skills\", \"cohall\", \"SKILL.md\"),\n opencode: join(homedir(), \".config\", \"opencode\", \"skills\", \"cohall\", \"SKILL.md\"),\n } as const\n const selected =\n target === \"all\"\n ? Object.values(roots)\n : target in roots\n ? [roots[target as keyof typeof roots]]\n : undefined\n if (selected === undefined) {\n throw new Error(\"Skill target must be agents, claude, opencode, or all\")\n }\n for (const path of selected) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, skill)\n }\n return selected\n}\n\nexport const printHelp = (): void => console.log(help)\nexport const printSkill = (): void => console.log(skill.trimEnd())\n\nexport const runCli = async (command: string, raw: ReadonlyArray<string>): Promise<void> => {\n const arguments_ = parseArguments(raw)\n\n if (command === \"reply\") {\n allowOptions(arguments_, [\"message\", \"message-file\", \"error\"])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n const error = option(arguments_, \"error\")\n if (\n error !== undefined &&\n (option(arguments_, \"message\") !== undefined ||\n option(arguments_, \"message-file\") !== undefined)\n ) {\n throw new Error(\"Use either --error or --message/--message-file, not both\")\n }\n const message = error === undefined ? await readInput(arguments_, \"message\") : undefined\n if (error === undefined && message === undefined) {\n throw new Error(\"A bot reply requires --message, --message-file, or --error\")\n }\n await writeBotReply(id, error === undefined ? { result: message ?? \"\" } : { error })\n print({ submitted: true, task_id: id })\n return\n }\n\n if (command === \"init\") {\n allowOptions(arguments_, [\n \"client-only\",\n \"name\",\n \"providers\",\n \"relay\",\n \"service\",\n \"token-file\",\n \"workspace\",\n ])\n noPositionals(arguments_, command)\n const token =\n option(arguments_, \"token-file\") === undefined ? undefined : await pairingToken(arguments_)\n const interactive = process.stdin.isTTY === true && process.stderr.isTTY === true\n const relayUrl = option(arguments_, \"relay\")\n const deviceName = option(arguments_, \"name\")\n const providerInput = option(arguments_, \"providers\")\n const prompter: Prompter = interactive\n ? terminalPrompter()\n : {\n answer: (_label, fallback) => Promise.resolve(fallback),\n secret: () => pairingToken(arguments_),\n close: () => undefined,\n }\n try {\n const input = await guidedSetupInput(\n {\n clientOnly: arguments_.options.has(\"client-only\"),\n workspaces: values(arguments_, \"workspace\"),\n cwd: process.cwd(),\n ...(relayUrl === undefined ? {} : { relayUrl }),\n ...(token === undefined ? {} : { token }),\n ...(deviceName === undefined ? {} : { deviceName }),\n ...(providerInput === undefined ? {} : { providers: providerInput }),\n },\n prompter,\n )\n const providers = input.providers === \"auto\" ? \"auto\" : parseProviders(input.providers)\n const existing = await readStoredConfiguration()\n const result = input.reusedConfiguration\n ? {\n configuration: await makeStoredConfiguration({\n relayUrl: input.relayUrl,\n ...(input.deviceName === undefined ? {} : { deviceName: input.deviceName }),\n workspaces: input.workspaces,\n providers,\n }),\n roles: [\n ...(existing?.clientToken === undefined ? [] : ([\"client\"] as const)),\n ...(arguments_.options.has(\"client-only\") || existing?.deviceToken === undefined\n ? []\n : ([\"device\"] as const)),\n ],\n }\n : await joinRelay({\n relayUrl: input.relayUrl,\n token: input.token ?? \"\",\n clientOnly: arguments_.options.has(\"client-only\"),\n ...(input.deviceName === undefined ? {} : { deviceName: input.deviceName }),\n workspaces: input.workspaces,\n providers,\n })\n if (input.reusedConfiguration) {\n await writeStoredConfiguration(result.configuration)\n }\n const installedSkills = await installSkill(\"all\")\n const service = arguments_.options.has(\"service\") ? await installDeviceService() : undefined\n print({\n initialized: true,\n reused_configuration: input.reusedConfiguration,\n config_path: configurationPath(),\n relay_url: result.configuration.relayUrl,\n device_id: result.configuration.deviceId,\n roles: result.roles,\n workspaces: result.configuration.workspaces,\n skills: installedSkills,\n ...(service === undefined ? {} : { service }),\n next:\n service === undefined && !arguments_.options.has(\"client-only\")\n ? \"Run `cohall service install` for background availability, or `cohall device` now.\"\n : \"Run `cohall doctor` to verify this device.\",\n })\n } finally {\n prompter.close()\n }\n return\n }\n\n if (command === \"service\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length !== 1 || arguments_.positionals[0] !== \"install\") {\n throw new Error(\"Usage: cohall service install\")\n }\n print(await installDeviceService())\n return\n }\n\n if (command === \"relay\") {\n const action = arguments_.positionals[0]\n if (action === \"backup\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length !== 2) {\n throw new Error(\"Usage: cohall relay backup <directory>\")\n }\n print(await backupRelay(arguments_.positionals[1] ?? \"\"))\n return\n }\n if (action === \"restore\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length !== 2) {\n throw new Error(\"Usage: cohall relay restore <directory>\")\n }\n print(await restoreRelay(arguments_.positionals[1] ?? \"\"))\n return\n }\n if (action === \"use\") {\n allowOptions(arguments_, [\"allow-http\", \"no-restart\"])\n if (arguments_.positionals.length !== 2) {\n throw new Error(\"Usage: cohall relay use <url> [--no-restart] [--allow-http]\")\n }\n print(\n await switchRelay({\n relayUrl: arguments_.positionals[1] ?? \"\",\n restart: !arguments_.options.has(\"no-restart\"),\n allowHttp: arguments_.options.has(\"allow-http\"),\n }),\n )\n return\n }\n throw new Error(\n \"Usage: cohall relay [backup <directory>|restore <directory>|use <url> [--no-restart] [--allow-http]]\",\n )\n }\n\n if (command === \"upgrade\") {\n allowOptions(arguments_, [\"all\", \"dry-run\", \"no-restart\", \"to\"])\n noPositionals(arguments_, command)\n const target = option(arguments_, \"to\")\n if (arguments_.options.has(\"all\")) {\n const normalizedTarget = normalizeUpgradeTarget(target)\n const { relay } = await ownerClient()\n const restart = !arguments_.options.has(\"no-restart\")\n if (arguments_.options.has(\"dry-run\")) {\n const devices = await Effect.runPromise(relay.devices())\n assertDeviceOperationSupport(devices)\n print({\n dry_run: true,\n requested_version: normalizedTarget,\n restart,\n devices: devices.map((device) => ({ id: device.id, name: device.name })),\n })\n return\n }\n const operations = await Effect.runPromise(\n relay.createUpgradeOperations({ target: normalizedTarget, restart }),\n )\n print({\n queued: operations.length,\n requested_version: normalizedTarget,\n restart,\n operations,\n next: \"Run `cohall upgrades` to inspect progress.\",\n })\n return\n }\n print(\n await upgrade({\n currentVersion: version,\n ...(target === undefined ? {} : { target }),\n restart: !arguments_.options.has(\"no-restart\"),\n dryRun: arguments_.options.has(\"dry-run\"),\n delegated: process.env.COHALL_PROVIDER !== undefined,\n }),\n )\n return\n }\n\n if (command === \"upgrades\") {\n allowOptions(arguments_, [])\n const { relay } = await ownerClient()\n if (arguments_.positionals.length > 0) {\n if (arguments_.positionals.length !== 2 || arguments_.positionals[0] !== \"abandon\") {\n throw new Error(\"Usage: cohall upgrades [abandon <operation-id>]\")\n }\n print(\n await Effect.runPromise(\n relay.abandonOperation(Schema.decodeUnknownSync(OperationId)(arguments_.positionals[1])),\n ),\n )\n return\n }\n print(await Effect.runPromise(relay.operations()))\n return\n }\n\n if (command === \"join\") {\n allowOptions(arguments_, [\n \"client-only\",\n \"name\",\n \"providers\",\n \"relay\",\n \"token-file\",\n \"workspace\",\n ])\n noPositionals(arguments_, command)\n const token = await pairingToken(arguments_)\n const relayUrl = normalizeRelayUrl(option(arguments_, \"relay\") ?? \"http://127.0.0.1:8787\")\n const existing = await readStoredConfiguration()\n const suppliedWorkspaces = values(arguments_, \"workspace\")\n const workspaces = suppliedWorkspaces.length === 0 ? existing?.workspaces : suppliedWorkspaces\n const deviceName = option(arguments_, \"name\")\n const providerInput = option(arguments_, \"providers\")\n const providers =\n providerInput === undefined\n ? undefined\n : providerInput === \"auto\"\n ? \"auto\"\n : parseProviders(providerInput)\n if (!arguments_.options.has(\"client-only\") && (workspaces?.length ?? 0) === 0) {\n throw new Error(\"At least one --workspace is required when joining a device\")\n }\n const clientOnly = arguments_.options.has(\"client-only\")\n const { configuration, roles } = await joinRelay({\n relayUrl,\n token,\n clientOnly,\n ...(deviceName === undefined ? {} : { deviceName }),\n ...(workspaces === undefined ? {} : { workspaces }),\n ...(providers === undefined ? {} : { providers }),\n })\n print({\n configured: true,\n config_path: configurationPath(),\n relay_url: configuration.relayUrl,\n device_id: configuration.deviceId,\n roles,\n workspaces: configuration.workspaces,\n })\n return\n }\n\n if (command === \"config\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n const configuration = await readStoredConfiguration()\n print({\n config_path: configurationPath(),\n configured: configuration !== undefined,\n ...(configuration === undefined\n ? {}\n : {\n relay_url: configuration.relayUrl,\n device_id: configuration.deviceId,\n device_name: configuration.deviceName,\n workspaces: configuration.workspaces,\n client_credential: configuration.clientToken !== undefined,\n device_credential: configuration.deviceToken !== undefined,\n providers: configuration.providers ?? \"auto\",\n model: configuration.model,\n sandbox: configuration.sandbox,\n grok_gateway: configuration.grokGateway,\n }),\n })\n return\n }\n\n if (command === \"configure\") {\n allowOptions(arguments_, [\n \"grok-gateway\",\n \"model\",\n \"name\",\n \"providers\",\n \"relay\",\n \"sandbox\",\n \"workspace\",\n ])\n noPositionals(arguments_, command)\n const existing = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(\n option(arguments_, \"relay\") ?? existing?.relayUrl ?? \"http://127.0.0.1:8787\",\n )\n const supplied = values(arguments_, \"workspace\")\n const workspaces =\n supplied.length === 0\n ? (existing?.workspaces ?? [])\n : await Effect.runPromise(parseWorkspaces(\"\", JSON.stringify(supplied)))\n const sandbox = option(arguments_, \"sandbox\")\n const model = option(arguments_, \"model\") ?? existing?.model\n const gatewayInput = option(arguments_, \"grok-gateway\") ?? existing?.grokGateway\n const grokGateway = gatewayInput === undefined ? undefined : resolve(gatewayInput)\n const providerInput = option(arguments_, \"providers\")\n const providers =\n providerInput === undefined\n ? existing?.providers\n : providerInput === \"auto\"\n ? undefined\n : parseProviders(providerInput)\n const configuration = StoredConfiguration.make({\n version: 1,\n relayUrl,\n deviceId: existing?.deviceId ?? makeDeviceId(),\n deviceName: option(arguments_, \"name\") ?? existing?.deviceName ?? \"cohall-device\",\n workspaces,\n ...credentialsForRelay(existing, relayUrl),\n ...(providers === undefined ? {} : { providers }),\n ...(model === undefined ? {} : { model }),\n ...(grokGateway === undefined ? {} : { grokGateway }),\n ...((sandbox ?? existing?.sandbox) === undefined\n ? {}\n : {\n sandbox: Schema.decodeUnknownSync(\n Schema.Literals([\"read-only\", \"workspace-write\", \"danger-full-access\"]),\n )(sandbox ?? existing?.sandbox),\n }),\n })\n await writeStoredConfiguration(configuration)\n print({ configured: true, config_path: configurationPath() })\n return\n }\n\n if (command === \"skill\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length === 0) {\n printSkill()\n return\n }\n if (arguments_.positionals[0] !== \"install\" || arguments_.positionals.length > 2) {\n throw new Error(\"Usage: cohall skill [install [agents|claude|opencode|all]]\")\n }\n print({ installed: await installSkill(arguments_.positionals[1] ?? \"all\") })\n return\n }\n\n if (command === \"integrations\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print({\n cli_skill: \"npx -y @akshar5/cohall skill install all\",\n codex_mcp: \"codex mcp add cohall -- npx -y @akshar5/cohall mcp\",\n claude_mcp:\n \"claude mcp add --transport stdio --scope user cohall -- npx -y @akshar5/cohall mcp\",\n stdio_config: {\n command: \"npx\",\n args: [\"-y\", \"@akshar5/cohall\", \"mcp\"],\n },\n opencode_mcp: {\n type: \"local\",\n command: [\"npx\", \"-y\", \"@akshar5/cohall\", \"mcp\"],\n enabled: true,\n },\n })\n return\n }\n\n if (command === \"doctor\") {\n allowOptions(arguments_, [\"all\"])\n noPositionals(arguments_, command)\n if (arguments_.options.has(\"all\")) {\n const { relay } = await client()\n print(allDeviceHealth(await Effect.runPromise(relay.devices()), version))\n return\n }\n const configuration = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(\n process.env.COHALL_RELAY_URL ?? configuration?.relayUrl ?? \"http://127.0.0.1:8787\",\n )\n const storedCredentials = credentialsForRelay(configuration, relayUrl)\n const response = await fetch(`${relayUrl}/api/health`, {\n signal: AbortSignal.timeout(10_000),\n }).catch(() => undefined)\n const providerInput = process.env.COHALL_DEVICE_PROVIDERS\n const selectedProviders =\n providerInput === undefined\n ? configuration?.providers\n : providerInput === \"auto\"\n ? undefined\n : parseProviders(providerInput)\n const providerExecutables = Object.fromEntries(\n Provider.literals\n .filter((provider) => provider !== \"grok-bot\")\n .map((provider) => [\n provider,\n Providers.findExecutable(provider === \"claude-code\" ? \"claude\" : provider) ?? \"not found\",\n ]),\n )\n const grokGateway = process.env.COHALL_GROK_GATEWAY ?? configuration?.grokGateway\n const grokBots =\n grokGateway === undefined\n ? undefined\n : await discoverGrokBots(grokGateway).catch(() => undefined)\n const clientToken = process.env.COHALL_CLIENT_TOKEN ?? storedCredentials.clientToken\n const hasDeviceCredential =\n process.env.COHALL_DEVICE_TOKEN !== undefined || storedCredentials.deviceToken !== undefined\n const deviceId = process.env.COHALL_DEVICE_ID ?? configuration?.deviceId\n const currentDevice =\n response?.ok !== true || clientToken === undefined || deviceId === undefined\n ? undefined\n : await Effect.runPromise(\n RelayClient.make({ baseUrl: relayUrl, token: clientToken }).devices(),\n )\n .then((devices) => devices.find((device) => device.id === deviceId))\n .catch(() => undefined)\n const versionWarning = deviceVersionWarning(version, currentDevice?.version)\n const warnings = [\n ...(response?.ok === true ? [] : [\"Relay is unreachable\"]),\n ...(versionWarning === undefined ? [] : [versionWarning]),\n ...(hasDeviceCredential &&\n response?.ok === true &&\n currentDevice?.status !== \"online\" &&\n currentDevice?.status !== \"busy\"\n ? [\n clientToken === undefined\n ? \"Device status cannot be checked without a client credential\"\n : \"Device daemon is not connected or is not registered with the relay\",\n ]\n : []),\n ...(selectedProviders?.flatMap((provider) =>\n provider === \"grok-bot\"\n ? grokBots === undefined\n ? [\n \"Configured Grok Bot gateway is unavailable; check its discovery file and host process\",\n ]\n : []\n : providerExecutables[provider] === \"not found\"\n ? [`Configured provider ${provider} is not installed or not on PATH`]\n : [],\n ) ?? []),\n ]\n print({\n version,\n relay: response?.ok === true ? \"reachable\" : \"unreachable\",\n relay_url: relayUrl,\n config_path: configurationPath(),\n client_credential:\n process.env.COHALL_CLIENT_TOKEN !== undefined ||\n storedCredentials.clientToken !== undefined,\n device_credential: hasDeviceCredential,\n workspaces: configuration?.workspaces ?? [],\n providers: providerExecutables,\n ...(grokGateway === undefined\n ? {}\n : {\n grok_gateway: {\n path: grokGateway,\n reachable: grokBots !== undefined,\n bots: grokBots?.length ?? 0,\n },\n }),\n provider_selection: selectedProviders ?? \"auto\",\n provider_authentication: \"checked when delegated work starts\",\n device_status:\n hasDeviceCredential === false ? \"not configured\" : (currentDevice?.status ?? \"unknown\"),\n device_version: currentDevice?.version,\n warnings,\n })\n return\n }\n\n if (command === \"versions\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n const { relay } = await client()\n print(deviceVersions(await Effect.runPromise(relay.devices()), version))\n return\n }\n\n if (command === \"usage\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n const { relay } = await client()\n print({\n ...(await Effect.runPromise(relay.usage())),\n scope: \"Retained Cohall task activity; provider token and billing usage are not available.\",\n })\n return\n }\n\n if (\n command === \"pair\" ||\n command === \"sessions\" ||\n command === \"revoke\" ||\n command === \"forget\"\n ) {\n const { configuration, relay } = await ownerClient()\n if (command === \"pair\") {\n allowOptions(arguments_, [\"client-only\", \"label\"])\n noPositionals(arguments_, command)\n const roles = arguments_.options.has(\"client-only\")\n ? ([\"client\"] as const)\n : ([\"client\", \"device\"] as const)\n const credential = await Effect.runPromise(\n relay.createPairing({ label: option(arguments_, \"label\") ?? \"Cohall device\", roles }),\n )\n print({\n relay_url: configuration.relayUrl,\n pairing_token: credential.token,\n expires_at: credential.expiresAt,\n roles,\n })\n return\n }\n if (command === \"sessions\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print(await Effect.runPromise(relay.authSessions()))\n return\n }\n if (command === \"forget\") {\n allowOptions(arguments_, [])\n print(\n await Effect.runPromise(\n relay.forgetDevice(\n Schema.decodeUnknownSync(DeviceId)(identifier(arguments_, \"device id\")),\n ),\n ),\n )\n return\n }\n allowOptions(arguments_, [])\n print(\n await Effect.runPromise(\n relay.revokeAuthSession(\n Schema.decodeUnknownSync(AuthSessionId)(identifier(arguments_, \"session id\")),\n ),\n ),\n )\n return\n }\n\n const { configuration, relay } = await client()\n if (command === \"devices\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print(await Effect.runPromise(relay.devices()))\n return\n }\n if (command === \"bots\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print(listBots(await Effect.runPromise(relay.devices())))\n return\n }\n if (command === \"delegate\" || command === \"send\") {\n allowOptions(arguments_, [\n \"context\",\n \"context-file\",\n \"no-wait\",\n \"parent\",\n \"prompt\",\n \"prompt-file\",\n \"provider\",\n \"target\",\n \"thread\",\n \"timeout\",\n \"workspace\",\n ])\n const positionalTarget =\n command === \"send\" && arguments_.positionals[0]?.startsWith(\"@\")\n ? arguments_.positionals[0]\n : undefined\n const positionals =\n positionalTarget === undefined ? arguments_.positionals : arguments_.positionals.slice(1)\n if (positionalTarget !== undefined && option(arguments_, \"target\") !== undefined) {\n throw new Error(\"Use either a positional target or --target, not both\")\n }\n if (option(arguments_, \"prompt\") === \"-\" && option(arguments_, \"context\") === \"-\") {\n throw new Error(\"Only one of --prompt and --context may read from stdin\")\n }\n const suppliedPrompt = await readInput(arguments_, \"prompt\")\n const prompt = suppliedPrompt ?? positionals.join(\" \")\n if (prompt.trim().length === 0) {\n throw new Error(\"A prompt is required\")\n }\n if (suppliedPrompt !== undefined && positionals.length > 0) {\n throw new Error(\"Use either a positional prompt or --prompt, not both\")\n }\n const context = await readInput(arguments_, \"context\")\n const target = positionalTarget ?? option(arguments_, \"target\")\n const thread = option(arguments_, \"thread\")\n const workspace = option(arguments_, \"workspace\")\n const provider = option(arguments_, \"provider\")\n const parent = option(arguments_, \"parent\")\n const task = await Effect.runPromise(\n createDelegation(relay, configuration, {\n prompt,\n ...(target === undefined ? {} : { target }),\n ...(context === undefined ? {} : { context }),\n ...(thread === undefined ? {} : { threadId: Schema.decodeUnknownSync(ThreadId)(thread) }),\n ...(parent === undefined ? {} : { parentTaskId: Schema.decodeUnknownSync(TaskId)(parent) }),\n ...(workspace === undefined ? {} : { workspace }),\n ...(provider === undefined\n ? {}\n : { provider: Schema.decodeUnknownSync(Provider)(provider) }),\n }),\n )\n print(\n taskResult(\n arguments_.options.has(\"no-wait\")\n ? task\n : await Effect.runPromise(waitForTask(relay, task, timeout(arguments_))),\n ),\n )\n return\n }\n if (command === \"status\") {\n allowOptions(arguments_, [])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n print(taskResult(await Effect.runPromise(relay.getTask(id))))\n return\n }\n if (command === \"trace\") {\n allowOptions(arguments_, [\"follow\"])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n if (arguments_.options.has(\"follow\")) {\n await Effect.runPromise(followTaskTrace(relay, id, printLine))\n return\n }\n print(await Effect.runPromise(relay.traceTask(id)))\n return\n }\n if (command === \"wait\") {\n allowOptions(arguments_, [\"timeout\"])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n const task = await Effect.runPromise(relay.getTask(id))\n print(taskResult(await Effect.runPromise(waitForTask(relay, task, timeout(arguments_)))))\n return\n }\n if (command === \"cancel\") {\n allowOptions(arguments_, [])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n print(taskResult(await Effect.runPromise(relay.cancelTask(id))))\n return\n }\n if (command === \"thread\") {\n allowOptions(arguments_, [])\n const id = Schema.decodeUnknownSync(ThreadId)(identifier(arguments_, \"thread id\"))\n print(await Effect.runPromise(threadContext(relay, id)))\n return\n }\n throw new Error(`Unknown Cohall command: ${command}`)\n}\n",
14
- "import { Provider, type Provider as ProviderName } from \"@cohall/protocol\"\nimport { Effect, Schema } from \"effect\"\nimport { accessSync, constants } from \"node:fs\"\nimport { chmod, mkdtemp, rm, writeFile } from \"node:fs/promises\"\nimport { homedir, platform, tmpdir } from \"node:os\"\nimport { delimiter, extname, isAbsolute, join } from \"node:path\"\nimport { execFile, spawn } from \"node:child_process\"\nimport type { Readable } from \"node:stream\"\n\nexport class ProviderUnavailableError extends Schema.TaggedErrorClass<ProviderUnavailableError>()(\n \"CohallProvider.Unavailable\",\n { provider: Provider, message: Schema.String },\n) {}\n\nexport class ProviderRunError extends Schema.TaggedErrorClass<ProviderRunError>()(\n \"CohallProvider.RunError\",\n {\n provider: Provider,\n message: Schema.String,\n exitCode: Schema.optionalKey(Schema.Number),\n },\n) {}\n\nexport type ProviderError = ProviderUnavailableError | ProviderRunError\nexport type CliProvider = Exclude<ProviderName, \"grok-bot\">\n\nexport interface RunOptions {\n readonly provider: CliProvider\n readonly threadId: string\n readonly taskId?: string\n readonly prompt: string\n readonly cwd: string\n readonly beforeSpawn?: () => Promise<void>\n readonly sessionId?: string\n readonly model?: string\n readonly sandbox?: \"read-only\" | \"workspace-write\" | \"danger-full-access\"\n}\n\nexport interface RunResult {\n readonly result: string\n readonly sessionId?: string\n}\n\ntype JsonRecord = Readonly<Record<string, unknown>>\n\nconst executables = {\n codex: \"codex\",\n \"claude-code\": \"claude\",\n opencode: \"opencode\",\n} as const satisfies Record<CliProvider, string>\n\nconst providerEnvironment = (): NodeJS.ProcessEnv => ({\n ...Object.fromEntries(\n Object.entries(process.env).filter(\n ([name]) => !name.startsWith(\"COHALL_\") || name === \"COHALL_CONFIG\",\n ),\n ),\n PATH: executableDirectories().join(delimiter),\n})\n\nconst record = (value: unknown): JsonRecord | undefined =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? Object.fromEntries(Object.entries(value))\n : undefined\nconst text = (value: unknown): string | undefined => (typeof value === \"string\" ? value : undefined)\n\nconst executableCandidates = (command: string): ReadonlyArray<string> => {\n if (platform() !== \"win32\" || extname(command).length > 0) {\n return [command]\n }\n return (process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .filter((extension) => extension.length > 0)\n .map((extension) => `${command}${extension.toLowerCase()}`)\n}\n\nconst executableDirectories = (): ReadonlyArray<string> => {\n const home = homedir()\n const configured = (process.env.PATH ?? \"\").split(delimiter).filter(Boolean)\n const common =\n platform() === \"win32\"\n ? [\n process.env.APPDATA === undefined ? undefined : join(process.env.APPDATA, \"npm\"),\n process.env.LOCALAPPDATA === undefined\n ? undefined\n : join(process.env.LOCALAPPDATA, \"pnpm\"),\n join(home, \".bun\", \"bin\"),\n ]\n : [\n join(home, \".local\", \"bin\"),\n join(home, \".npm-global\", \"bin\"),\n join(home, \".bun\", \"bin\"),\n join(home, \".local\", \"share\", \"pnpm\"),\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n ]\n return [...new Set([...configured, ...common.filter((path) => path !== undefined)])]\n}\n\nexport const findExecutable = (command: string): string | undefined => {\n const paths =\n isAbsolute(command) || command.includes(\"/\") || command.includes(\"\\\\\")\n ? [\"\"]\n : executableDirectories()\n for (const directory of paths) {\n for (const candidate of executableCandidates(command)) {\n const path = directory.length === 0 ? candidate : join(directory, candidate)\n try {\n accessSync(path, platform() === \"win32\" ? constants.F_OK : constants.X_OK)\n return path\n } catch {\n continue\n }\n }\n }\n return undefined\n}\n\nexport const available = (provider: ProviderName): boolean =>\n provider !== \"grok-bot\" && findExecutable(executables[provider]) !== undefined\nexport const availableProviders = (): ReadonlyArray<CliProvider> =>\n Provider.literals\n .filter((provider): provider is CliProvider => provider !== \"grok-bot\")\n .filter(available)\n\nconst boundedText = (stream: Readable, limit: number, onOverflow: () => void): Promise<string> =>\n new Promise((resolve, reject) => {\n const chunks: Array<Buffer> = []\n let size = 0\n const cleanup = (): void => {\n stream.off(\"data\", onData)\n stream.off(\"end\", onEnd)\n stream.off(\"error\", onError)\n }\n const onData = (chunk: Buffer | string): void => {\n const bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk\n size += bytes.byteLength\n if (size <= limit) {\n chunks.push(bytes)\n return\n }\n cleanup()\n onOverflow()\n reject(new Error(`Provider output exceeded ${Math.floor(limit / 1024)} KiB`))\n }\n const onEnd = (): void => {\n cleanup()\n resolve(Buffer.concat(chunks, size).toString(\"utf8\"))\n }\n const onError = (cause: Error): void => {\n cleanup()\n reject(cause)\n }\n stream.on(\"data\", onData)\n stream.once(\"end\", onEnd)\n stream.once(\"error\", onError)\n })\n\ninterface CapturedText {\n readonly text: string\n readonly truncated: boolean\n}\n\nconst captureText = (stream: Readable, limit: number): Promise<CapturedText> =>\n new Promise((resolve, reject) => {\n const chunks: Array<Buffer> = []\n let captured = 0\n let truncated = false\n const onData = (chunk: Buffer | string): void => {\n const bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk\n const remaining = limit - captured\n if (remaining > 0) {\n const selected = bytes.byteLength <= remaining ? bytes : bytes.subarray(0, remaining)\n chunks.push(selected)\n captured += selected.byteLength\n }\n truncated ||= bytes.byteLength > remaining\n }\n const onEnd = (): void =>\n resolve({ text: Buffer.concat(chunks, captured).toString(\"utf8\"), truncated })\n stream.on(\"data\", onData)\n stream.once(\"end\", onEnd)\n stream.once(\"error\", reject)\n })\n\nconst failureMessage = (command: string, stderr: CapturedText, exitCode: number): string => {\n const fallback = `${command} exited with status ${exitCode}`\n const suffix = stderr.truncated ? \"\\n[stderr truncated after 64 KiB]\" : \"\"\n const available = 16_384 - suffix.length\n return `${(stderr.text.trim() || fallback).slice(0, available)}${suffix}`\n}\n\nconst codexCommand = (options: RunOptions): ReadonlyArray<string> => {\n const common = [\n \"--json\",\n \"--skip-git-repo-check\",\n \"-c\",\n 'approval_policy=\"never\"',\n ...(options.model === undefined ? [] : [\"--model\", options.model]),\n ...(options.sandbox === undefined\n ? []\n : [\"-c\", `sandbox_mode=${JSON.stringify(options.sandbox)}`]),\n ]\n return options.sessionId === undefined\n ? [\"codex\", \"exec\", ...common, \"-\"]\n : [\"codex\", \"exec\", \"resume\", ...common, options.sessionId, \"-\"]\n}\n\nconst claudeCommand = (options: RunOptions): ReadonlyArray<string> => [\n \"claude\",\n \"-p\",\n \"--output-format\",\n \"json\",\n ...(options.model === undefined ? [] : [\"--model\", options.model]),\n ...(options.sessionId === undefined ? [] : [\"--resume\", options.sessionId]),\n]\n\nconst opencodeCommand = (options: RunOptions, promptPath: string): ReadonlyArray<string> => [\n \"opencode\",\n \"run\",\n \"--format\",\n \"json\",\n ...(options.model === undefined ? [] : [\"--model\", options.model]),\n ...(options.sessionId === undefined ? [] : [\"--session\", options.sessionId]),\n \"Complete the task described in the attached Cohall prompt file.\",\n `--file=${promptPath}`,\n]\n\ninterface PreparedCommand {\n readonly command: ReadonlyArray<string>\n readonly input?: string\n readonly cleanup: () => Promise<void>\n}\n\nconst prepareCommand = async (options: RunOptions): Promise<PreparedCommand> => {\n switch (options.provider) {\n case \"codex\":\n return {\n command: codexCommand(options),\n input: options.prompt,\n cleanup: () => Promise.resolve(),\n }\n case \"claude-code\":\n return {\n command: claudeCommand(options),\n input: options.prompt,\n cleanup: () => Promise.resolve(),\n }\n case \"opencode\": {\n const directory = await mkdtemp(join(tmpdir(), \"cohall-opencode-\"))\n const promptPath = join(directory, \"prompt.md\")\n try {\n if (platform() !== \"win32\") {\n await chmod(directory, 0o700)\n }\n await writeFile(promptPath, options.prompt, { mode: 0o600 })\n return {\n command: opencodeCommand(options, promptPath),\n cleanup: () => rm(directory, { recursive: true, force: true }),\n }\n } catch (cause) {\n await rm(directory, { recursive: true, force: true }).catch(() => undefined)\n throw cause\n }\n }\n }\n}\n\nconst forEachJsonEvent = async (\n stdout: Readable,\n onEvent: (event: JsonRecord) => void,\n): Promise<void> => {\n const limit = 1024 * 1024\n let chunks: Array<Buffer> = []\n let size = 0\n let oversized = false\n const append = (chunk: Buffer): void => {\n if (oversized) {\n return\n }\n if (size + chunk.byteLength > limit) {\n chunks = []\n size = 0\n oversized = true\n return\n }\n if (chunk.byteLength > 0) {\n chunks.push(chunk)\n size += chunk.byteLength\n }\n }\n const emit = (): void => {\n if (oversized) {\n oversized = false\n return\n }\n const line = Buffer.concat(chunks, size).toString(\"utf8\")\n chunks = []\n size = 0\n if (line.trim().length === 0) {\n return\n }\n const event = record(JSON.parse(line) as unknown)\n if (event !== undefined) {\n onEvent(event)\n }\n }\n\n for await (const chunk of stdout) {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n let start = 0\n for (let newline = bytes.indexOf(0x0a, start); newline !== -1; ) {\n append(bytes.subarray(start, newline))\n emit()\n start = newline + 1\n newline = bytes.indexOf(0x0a, start)\n }\n append(bytes.subarray(start))\n }\n if (size > 0 || oversized) {\n emit()\n }\n}\n\nconst parseCodex = async (stdout: Readable, existingSession?: string): Promise<RunResult> => {\n let result = \"\"\n let sessionId = existingSession\n await forEachJsonEvent(stdout, (event) => {\n if (text(event.type) === \"thread.started\") {\n sessionId = text(event.thread_id) ?? sessionId\n }\n if (text(event.type) !== \"item.completed\") {\n return\n }\n const item = record(event.item)\n if (text(item?.type) === \"agent_message\") {\n result = text(item?.text) ?? text(item?.content) ?? result\n }\n })\n return {\n result: result || \"Codex completed the task without a text response.\",\n ...(sessionId === undefined ? {} : { sessionId }),\n }\n}\n\nconst parseClaude = (stdout: string, existingSession?: string): RunResult => {\n const value = record(JSON.parse(stdout) as unknown)\n const result = text(value?.result) ?? text(value?.content)\n if (result === undefined) {\n throw new Error(\"Claude Code returned JSON without a result\")\n }\n const sessionId = text(value?.session_id) ?? text(value?.sessionId) ?? existingSession\n return { result, ...(sessionId === undefined ? {} : { sessionId }) }\n}\n\nconst textFromPart = (value: unknown): string | undefined => {\n const part = record(value)\n if (part === undefined) {\n return undefined\n }\n return text(part.text) ?? text(part.content) ?? text(record(part.part)?.text)\n}\n\nconst openCodeError = (event: JsonRecord): string | undefined => {\n if (text(event.type) !== \"error\") {\n return undefined\n }\n const error = record(event.error)\n const name = text(error?.name)\n const message =\n text(record(error?.data)?.message) ??\n text(error?.message) ??\n text(event.message) ??\n text(event.error)\n if (name !== undefined && message !== undefined) {\n return `OpenCode ${name}: ${message}`\n }\n return message === undefined ? \"OpenCode reported an error\" : `OpenCode: ${message}`\n}\n\nconst parseOpenCode = async (stdout: Readable, existingSession?: string): Promise<RunResult> => {\n let result = \"\"\n let sessionId = existingSession\n await forEachJsonEvent(stdout, (event) => {\n const failure = openCodeError(event)\n if (failure !== undefined) {\n throw new Error(failure)\n }\n sessionId =\n text(event.sessionID) ??\n text(event.sessionId) ??\n text(event.session_id) ??\n text(record(event.info)?.sessionID) ??\n sessionId\n const content = textFromPart(event.part) ?? textFromPart(event) ?? text(event.result)\n if (content !== undefined && content.length > 0) {\n result = content\n }\n })\n if (result.length === 0) {\n throw new Error(\n \"OpenCode produced no result; verify its authentication and use a supported project workspace\",\n )\n }\n return { result, ...(sessionId === undefined ? {} : { sessionId }) }\n}\n\nconst parse = async (\n options: RunOptions,\n stdout: Readable,\n onFailure: () => void,\n): Promise<RunResult> => {\n try {\n switch (options.provider) {\n case \"codex\":\n return await parseCodex(stdout, options.sessionId)\n case \"claude-code\":\n return parseClaude(await boundedText(stdout, 1024 * 1024, onFailure), options.sessionId)\n case \"opencode\":\n return await parseOpenCode(stdout, options.sessionId)\n }\n } catch (cause) {\n onFailure()\n throw cause\n }\n}\n\nconst byteLength = (value: string): number => new TextEncoder().encode(value).byteLength\n\nconst processExists = (pid: number): boolean => {\n try {\n process.kill(-pid, 0)\n return true\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === \"ESRCH\") {\n return false\n }\n throw cause\n }\n}\n\nconst waitForProcessGroup = async (pid: number, timeoutMs: number): Promise<boolean> => {\n const deadline = Date.now() + timeoutMs\n while (processExists(pid)) {\n if (Date.now() >= deadline) {\n return false\n }\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n return true\n}\n\nconst terminateWindowsTree = (pid: number): Promise<void> =>\n new Promise((resolve) => {\n const systemRoot = process.env.SystemRoot ?? \"C:\\\\Windows\"\n execFile(\n join(systemRoot, \"System32\", \"taskkill.exe\"),\n [\"/PID\", String(pid), \"/T\", \"/F\"],\n { windowsHide: true },\n () => resolve(),\n )\n })\n\nconst terminateProcessTree = async (pid: number): Promise<void> => {\n if (platform() === \"win32\") {\n await terminateWindowsTree(pid)\n return\n }\n try {\n process.kill(-pid, \"SIGTERM\")\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === \"ESRCH\") {\n return\n }\n throw cause\n }\n if (await waitForProcessGroup(pid, 5_000)) {\n return\n }\n process.kill(-pid, \"SIGKILL\")\n await waitForProcessGroup(pid, 1_000)\n}\n\nexport const run = (options: RunOptions): Effect.Effect<RunResult, ProviderError> =>\n Effect.tryPromise({\n try: async (signal) => {\n const executable = findExecutable(executables[options.provider])\n if (executable === undefined) {\n throw new ProviderUnavailableError({\n provider: options.provider,\n message: `${executables[options.provider]} is not available on this device`,\n })\n }\n const prepared = await prepareCommand(options)\n try {\n await options.beforeSpawn?.()\n const [, ...arguments_] = prepared.command\n const child = spawn(executable, arguments_, {\n cwd: options.cwd,\n env: {\n ...providerEnvironment(),\n COHALL_PROVIDER: options.provider,\n COHALL_THREAD_ID: options.threadId,\n ...(options.taskId === undefined ? {} : { COHALL_TASK_ID: options.taskId }),\n },\n detached: platform() !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n const exited = new Promise<number>((resolve, reject) => {\n child.once(\"error\", reject)\n child.once(\"exit\", (code) => resolve(code ?? 1))\n })\n let termination: Promise<void> | undefined\n const terminate = (): void => {\n if (child.pid === undefined || termination !== undefined) {\n return\n }\n termination = terminateProcessTree(child.pid).catch(() => undefined)\n }\n signal.addEventListener(\"abort\", terminate, { once: true })\n if (signal.aborted) {\n terminate()\n }\n child.stdin.end(prepared.input)\n\n try {\n const [result, stderr, exitCode] = await Promise.all([\n parse(options, child.stdout, terminate),\n captureText(child.stderr, 64 * 1024),\n exited,\n ])\n if (exitCode !== 0) {\n throw new ProviderRunError({\n provider: options.provider,\n message: failureMessage(executables[options.provider], stderr, exitCode),\n exitCode,\n })\n }\n if (byteLength(result.result) > 131_072) {\n throw new ProviderRunError({\n provider: options.provider,\n message: \"Provider result exceeded 128 KiB\",\n })\n }\n if (result.sessionId !== undefined && byteLength(result.sessionId) > 4_096) {\n throw new ProviderRunError({\n provider: options.provider,\n message: \"Provider session ID exceeded 4 KiB\",\n })\n }\n return result\n } finally {\n signal.removeEventListener(\"abort\", terminate)\n if (child.exitCode === null) {\n terminate()\n await exited.catch(() => undefined)\n }\n await termination\n }\n } finally {\n await prepared.cleanup()\n }\n },\n catch: (cause) => {\n if (cause instanceof ProviderUnavailableError || cause instanceof ProviderRunError) {\n return cause\n }\n return new ProviderRunError({\n provider: options.provider,\n message: (cause instanceof Error ? cause.message : String(cause)).slice(0, 16_384),\n })\n },\n })\n",
15
- "import { DeviceId, Provider, makeDeviceId, type Provider as ProviderName } from \"@cohall/protocol\"\nimport { Effect, Schema } from \"effect\"\nimport { access, chmod, mkdir, readFile, realpath, rename, writeFile } from \"node:fs/promises\"\nimport { homedir, hostname, platform } from \"node:os\"\nimport { dirname, join, resolve } from \"node:path\"\n\nconst WorkspaceList = Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(64))\nconst ProviderList = Schema.Array(Provider)\n .check(Schema.isMinLength(1))\n .check(Schema.isMaxLength(Provider.literals.length))\nconst Sandbox = Schema.Literals([\"read-only\", \"workspace-write\", \"danger-full-access\"])\n\nexport const StoredConfiguration = Schema.Struct({\n version: Schema.Literal(1),\n relayUrl: Schema.NonEmptyString,\n deviceId: DeviceId,\n deviceName: Schema.NonEmptyString,\n workspaces: WorkspaceList,\n clientToken: Schema.optionalKey(Schema.NonEmptyString),\n deviceToken: Schema.optionalKey(Schema.NonEmptyString),\n providers: Schema.optionalKey(ProviderList),\n model: Schema.optionalKey(Schema.NonEmptyString),\n sandbox: Schema.optionalKey(Sandbox),\n grokGateway: Schema.optionalKey(Schema.NonEmptyString),\n})\nexport interface StoredConfiguration extends Schema.Schema.Type<typeof StoredConfiguration> {}\n\nexport const ClientConfiguration = Schema.Struct({\n relayUrl: Schema.NonEmptyString,\n token: Schema.NonEmptyString,\n mcpThreadId: Schema.optionalKey(Schema.String),\n mcpTaskId: Schema.optionalKey(Schema.String),\n})\nexport interface ClientConfiguration extends Schema.Schema.Type<typeof ClientConfiguration> {}\n\nexport const DeviceConfiguration = Schema.Struct({\n relayUrl: Schema.NonEmptyString,\n token: Schema.NonEmptyString,\n id: DeviceId,\n name: Schema.NonEmptyString,\n workspaces: WorkspaceList,\n providers: Schema.optionalKey(ProviderList),\n model: Schema.optionalKey(Schema.NonEmptyString),\n sandbox: Schema.optionalKey(Sandbox),\n grokGateway: Schema.optionalKey(Schema.NonEmptyString),\n})\nexport interface DeviceConfiguration extends Schema.Schema.Type<typeof DeviceConfiguration> {}\n\nconst defaultConfigDirectory = (): string => {\n if (platform() === \"win32\") {\n return join(process.env.APPDATA ?? join(homedir(), \"AppData\", \"Roaming\"), \"Cohall\")\n }\n if (platform() === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\", \"Cohall\")\n }\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"cohall\")\n}\n\nconst defaultRelayDataDirectory = (): string => {\n if (platform() === \"win32\") {\n return join(process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\"), \"Cohall\")\n }\n if (platform() === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\", \"Cohall\", \"relay\")\n }\n return join(process.env.XDG_DATA_HOME ?? join(homedir(), \".local\", \"share\"), \"cohall\")\n}\n\nexport const relayDataDirectory = (): string =>\n resolve(process.env.COHALL_DATA_DIR ?? defaultRelayDataDirectory())\n\nexport const configurationPath = (): string =>\n resolve(process.env.COHALL_CONFIG ?? join(defaultConfigDirectory(), \"config.json\"))\n\nexport const normalizeRelayUrl = (input: string): string => {\n const url = new URL(input)\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"Relay URL must use http or https\")\n }\n if (\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw new Error(\"Relay URL cannot include credentials, a query, or a fragment\")\n }\n if (url.pathname !== \"/\" && url.pathname !== \"\") {\n throw new Error(\"Relay URL cannot include a path\")\n }\n url.pathname = \"/\"\n return url.toString().replace(/\\/$/, \"\")\n}\n\nexport const parseWorkspaces = (\n workspaceList: string,\n workspaceJson?: string,\n): Effect.Effect<ReadonlyArray<string>, Error> =>\n Effect.tryPromise({\n try: async () => {\n const values =\n workspaceJson === undefined\n ? workspaceList\n .split(\",\")\n .map((workspace) => workspace.trim())\n .filter((workspace) => workspace.length > 0)\n : Schema.decodeUnknownSync(WorkspaceList)(JSON.parse(workspaceJson))\n const canonical = await Promise.all(values.map((workspace) => realpath(resolve(workspace))))\n return [...new Set(canonical)]\n },\n catch: (cause) =>\n new Error(\n `Workspace roots must be existing paths; JSON input must be an array of paths: ${cause instanceof Error ? cause.message : String(cause)}`,\n ),\n })\n\nexport const parseProviders = (input: string): ReadonlyArray<ProviderName> =>\n Schema.decodeUnknownSync(ProviderList)([\n ...new Set(\n input\n .split(\",\")\n .map((provider) => provider.trim())\n .filter(Boolean),\n ),\n ])\n\nexport const readStoredConfiguration = async (): Promise<StoredConfiguration | undefined> => {\n const path = configurationPath()\n if (\n !(await access(path)\n .then(() => true)\n .catch(() => false))\n ) {\n return undefined\n }\n if (platform() !== \"win32\") {\n await chmod(path, 0o600)\n }\n try {\n return Schema.decodeUnknownSync(StoredConfiguration)(JSON.parse(await readFile(path, \"utf8\")))\n } catch (cause) {\n throw new Error(`Invalid Cohall configuration at ${path}: ${String(cause)}`)\n }\n}\n\nexport const writeStoredConfiguration = async (\n configuration: StoredConfiguration,\n): Promise<void> => {\n const path = configurationPath()\n const directory = dirname(path)\n const temporary = `${path}.${process.pid}.tmp`\n await mkdir(directory, { recursive: true, mode: 0o700 })\n if (platform() !== \"win32\") {\n await chmod(directory, 0o700)\n }\n await writeFile(temporary, `${JSON.stringify(configuration, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporary, path)\n if (platform() !== \"win32\") {\n await chmod(path, 0o600)\n }\n}\n\nexport const credentialsForRelay = (\n configuration: StoredConfiguration | undefined,\n relayUrl: string,\n): { readonly clientToken?: string; readonly deviceToken?: string } => {\n if (configuration?.relayUrl !== normalizeRelayUrl(relayUrl)) {\n return {}\n }\n return {\n ...(configuration.clientToken === undefined ? {} : { clientToken: configuration.clientToken }),\n ...(configuration.deviceToken === undefined ? {} : { deviceToken: configuration.deviceToken }),\n }\n}\n\nexport const makeStoredConfiguration = async (input: {\n readonly relayUrl: string\n readonly deviceName?: string\n readonly workspaces?: ReadonlyArray<string>\n readonly providers?: ReadonlyArray<ProviderName> | \"auto\"\n readonly clientToken?: string\n readonly deviceToken?: string\n}): Promise<StoredConfiguration> => {\n const existing = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(input.relayUrl)\n const retainedCredentials = credentialsForRelay(existing, relayUrl)\n const canonicalWorkspaces =\n input.workspaces === undefined\n ? (existing?.workspaces ?? [])\n : await Effect.runPromise(parseWorkspaces(\"\", JSON.stringify(input.workspaces)))\n const clientToken = input.clientToken ?? retainedCredentials.clientToken\n const deviceToken = input.deviceToken ?? retainedCredentials.deviceToken\n const providers =\n input.providers === \"auto\" ? undefined : (input.providers ?? existing?.providers)\n return StoredConfiguration.make({\n version: 1,\n relayUrl,\n deviceId: existing?.deviceId ?? makeDeviceId(),\n deviceName: input.deviceName ?? existing?.deviceName ?? hostname(),\n workspaces: canonicalWorkspaces,\n ...(clientToken === undefined ? {} : { clientToken }),\n ...(deviceToken === undefined ? {} : { deviceToken }),\n ...(providers === undefined ? {} : { providers }),\n ...(existing?.model === undefined ? {} : { model: existing.model }),\n ...(existing?.sandbox === undefined ? {} : { sandbox: existing.sandbox }),\n ...(existing?.grokGateway === undefined ? {} : { grokGateway: existing.grokGateway }),\n })\n}\n\nconst environmentWorkspaces = async (\n stored: StoredConfiguration | undefined,\n): Promise<ReadonlyArray<string>> => {\n const list = process.env.COHALL_DEVICE_WORKSPACES\n const json = process.env.COHALL_DEVICE_WORKSPACES_JSON\n if (list === undefined && json === undefined) {\n return stored?.workspaces ?? []\n }\n return Effect.runPromise(parseWorkspaces(list ?? \"\", json))\n}\n\nconst environmentProvider = (): string | undefined =>\n process.env.COHALL_MODEL ?? process.env.COHALL_CODEX_MODEL\n\nconst environmentSandbox = (): DeviceConfiguration[\"sandbox\"] => {\n const value = process.env.COHALL_SANDBOX ?? process.env.COHALL_CODEX_SANDBOX\n return value === undefined ? undefined : Schema.decodeUnknownSync(Sandbox)(value)\n}\n\nconst environmentProviders = (\n stored: StoredConfiguration | undefined,\n): ReadonlyArray<ProviderName> | undefined => {\n const value = process.env.COHALL_DEVICE_PROVIDERS\n return value === undefined\n ? stored?.providers\n : value === \"auto\"\n ? undefined\n : parseProviders(value)\n}\n\nconst storedOrDefaults = async (): Promise<StoredConfiguration> => {\n const stored = await readStoredConfiguration()\n return (\n stored ??\n StoredConfiguration.make({\n version: 1,\n relayUrl: \"http://127.0.0.1:8787\",\n deviceId: makeDeviceId(),\n deviceName: hostname(),\n workspaces: [],\n })\n )\n}\n\nexport const loadClientConfiguration = Effect.tryPromise({\n try: async () => {\n const stored = await storedOrDefaults()\n const relayUrl = normalizeRelayUrl(process.env.COHALL_RELAY_URL ?? stored.relayUrl)\n const token =\n process.env.COHALL_CLIENT_TOKEN ?? credentialsForRelay(stored, relayUrl).clientToken\n if (token === undefined) {\n throw new Error(\n `No client credential. Run cohall join with a pairing token on stdin or set COHALL_CLIENT_TOKEN.`,\n )\n }\n return ClientConfiguration.make({\n relayUrl,\n token,\n ...(process.env.COHALL_THREAD_ID === undefined\n ? {}\n : { mcpThreadId: process.env.COHALL_THREAD_ID }),\n ...(process.env.COHALL_TASK_ID === undefined\n ? {}\n : { mcpTaskId: process.env.COHALL_TASK_ID }),\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n\nexport const loadOwnerConfiguration = Effect.tryPromise({\n try: async () => {\n const stored = await storedOrDefaults()\n const ownerTokenPath = join(relayDataDirectory(), \"owner-token\")\n const token =\n process.env.COHALL_TOKEN ??\n (await readFile(ownerTokenPath, \"utf8\")\n .then((value) => value.trim())\n .catch(() => undefined))\n if (token === undefined || token.length === 0) {\n throw new Error(\n \"No owner credential. Run this command on the relay host or set COHALL_TOKEN.\",\n )\n }\n if (token.length < 32) {\n throw new Error(\"The Cohall relay owner token must be at least 32 characters\")\n }\n return ClientConfiguration.make({\n relayUrl: normalizeRelayUrl(process.env.COHALL_RELAY_URL ?? stored.relayUrl),\n token,\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n\nexport const loadDeviceConfiguration = Effect.tryPromise({\n try: async () => {\n const stored = await storedOrDefaults()\n const relayUrl = normalizeRelayUrl(process.env.COHALL_RELAY_URL ?? stored.relayUrl)\n const token =\n process.env.COHALL_DEVICE_TOKEN ?? credentialsForRelay(stored, relayUrl).deviceToken\n if (token === undefined) {\n throw new Error(\n `No device credential. Run cohall join with a pairing token on stdin or set COHALL_DEVICE_TOKEN.`,\n )\n }\n const workspaces = await environmentWorkspaces(stored)\n if (workspaces.length === 0) {\n throw new Error(\"No device workspace roots are configured\")\n }\n const model = environmentProvider() ?? stored.model\n const sandbox = environmentSandbox() ?? stored.sandbox\n const providers = environmentProviders(stored)\n const grokGateway = process.env.COHALL_GROK_GATEWAY ?? stored.grokGateway\n return DeviceConfiguration.make({\n relayUrl,\n token,\n id:\n process.env.COHALL_DEVICE_ID === undefined\n ? stored.deviceId\n : DeviceId.make(process.env.COHALL_DEVICE_ID),\n name: process.env.COHALL_DEVICE_NAME ?? stored.deviceName,\n workspaces,\n ...(providers === undefined ? {} : { providers }),\n ...(model === undefined ? {} : { model }),\n ...(sandbox === undefined ? {} : { sandbox }),\n ...(grokGateway === undefined ? {} : { grokGateway: resolve(grokGateway) }),\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n\nexport const knownProviders = Provider.literals\n",
13
+ "import { RelayClient } from \"@cohall/client\"\nimport {\n AuthSessionId,\n DeviceId,\n OperationId,\n Provider,\n TaskId,\n ThreadId,\n assertDeviceOperationSupport,\n makeDeviceId,\n version,\n} from \"@cohall/protocol\"\nimport * as Providers from \"@cohall/providers\"\nimport { Effect, Schema } from \"effect\"\nimport { access, mkdir, readFile, stat, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join, resolve } from \"node:path\"\nimport skill from \"../../../skills/cohall/SKILL.md\" with { type: \"text\" }\nimport {\n StoredConfiguration,\n configurationPath,\n credentialsForRelay,\n loadClientConfiguration,\n loadOwnerConfiguration,\n makeStoredConfiguration,\n normalizeRelayUrl,\n parseProviders,\n parseWorkspaces,\n readStoredConfiguration,\n writeStoredConfiguration,\n} from \"./config.ts\"\nimport {\n createDelegation,\n followTaskTrace,\n listBots,\n taskResult,\n threadContext,\n waitForTask,\n} from \"./delegation.ts\"\nimport { allDeviceHealth, deviceVersions } from \"./device-overview.ts\"\nimport { discoverGrokBots } from \"./grok-bot.ts\"\nimport { writeBotReply } from \"./bot-replies.ts\"\nimport { guidedSetupInput, joinRelay, terminalPrompter, type Prompter } from \"./setup.ts\"\nimport { backupRelay, restoreRelay, switchRelay } from \"./relay-migration.ts\"\nimport { installDeviceService } from \"./service.ts\"\nimport { deviceVersionWarning, normalizeUpgradeTarget, upgrade } from \"./upgrade.ts\"\n\ninterface Arguments {\n readonly options: ReadonlyMap<string, ReadonlyArray<string> | true>\n readonly positionals: ReadonlyArray<string>\n}\n\nconst valueOptions = new Set([\n \"context\",\n \"context-file\",\n \"grok-gateway\",\n \"error\",\n \"label\",\n \"model\",\n \"message\",\n \"message-file\",\n \"name\",\n \"parent\",\n \"prompt\",\n \"prompt-file\",\n \"provider\",\n \"providers\",\n \"relay\",\n \"sandbox\",\n \"target\",\n \"thread\",\n \"timeout\",\n \"token-file\",\n \"to\",\n \"workspace\",\n])\nconst flagOptions = new Set([\n \"all\",\n \"allow-http\",\n \"client-only\",\n \"dry-run\",\n \"follow\",\n \"no-restart\",\n \"no-wait\",\n \"service\",\n])\nconst aliases = new Map([\n [\"-c\", \"context\"],\n [\"-p\", \"prompt\"],\n [\"-t\", \"target\"],\n [\"-T\", \"thread\"],\n [\"-w\", \"workspace\"],\n])\n\nconst help = `Cohall connects agents running on your own devices.\n\nUsage:\n cohall init [--relay url] [--workspace path] [--providers list] [--service]\n cohall join --relay <url> --workspace <path> [--providers list] [--token-file <path>]\n cohall configure [--relay url] [--name name] [--workspace path]\n [--providers codex,opencode|auto] [--model id]\n [--grok-gateway path]\n cohall config\n cohall devices\n cohall bots\n cohall send [@device-or-bot] [prompt] [delegate options]\n cohall delegate [prompt] [--target @device-or-bot] [--provider provider]\n [--context text] [--thread uuid] [--parent task-id] [--workspace path]\n [--timeout seconds] [--no-wait]\n cohall status <task-id>\n cohall trace <task-id> [--follow]\n cohall wait <task-id> [--timeout seconds]\n cohall cancel <task-id>\n cohall reply <task-id> --message-file path | --message text | --message - | --error text\n cohall thread <thread-id>\n cohall pair [--label name] [--client-only]\n cohall sessions\n cohall revoke <session-id>\n cohall forget <device-id>\n cohall doctor [--all]\n cohall versions\n cohall usage\n cohall upgrade [--to version|latest] [--no-restart] [--dry-run]\n cohall upgrade --all [--to version|latest] [--no-restart] [--dry-run]\n cohall upgrades [abandon <operation-id>]\n cohall service install\n cohall device\n cohall relay\n cohall relay backup <directory>\n cohall relay restore <directory>\n cohall relay use <url> [--no-restart] [--allow-http]\n cohall mcp\n cohall skill [install [agents|claude|opencode|all]]\n cohall integrations\n\nProviders: codex, claude-code, opencode, grok-bot.\nConfiguration is stored per user; environment variables override it.`\n\nconst parseArguments = (values: ReadonlyArray<string>): Arguments => {\n const options = new Map<string, ReadonlyArray<string> | true>()\n const positionals: Array<string> = []\n for (let index = 0; index < values.length; index += 1) {\n const argument = values[index]\n if (argument === undefined) {\n break\n }\n if (argument === \"--\") {\n positionals.push(...values.slice(index + 1))\n break\n }\n if (!argument.startsWith(\"-\")) {\n positionals.push(argument)\n continue\n }\n const separator = argument.indexOf(\"=\")\n const rawName = separator === -1 ? argument : argument.slice(0, separator)\n const inline = separator === -1 ? undefined : argument.slice(separator + 1)\n const name = aliases.get(rawName) ?? rawName.replace(/^--/, \"\")\n if (flagOptions.has(name)) {\n if (inline !== undefined) {\n throw new Error(`--${name} does not accept a value`)\n }\n options.set(name, true)\n continue\n }\n if (!valueOptions.has(name)) {\n throw new Error(`Unknown option: ${argument}`)\n }\n const value = inline ?? values[index + 1]\n if (value === undefined || (inline === undefined && value.startsWith(\"-\") && value !== \"-\")) {\n throw new Error(`${rawName} requires a value`)\n }\n const previous = options.get(name)\n options.set(name, previous === undefined || previous === true ? [value] : [...previous, value])\n if (inline === undefined) {\n index += 1\n }\n }\n return { options, positionals }\n}\n\nconst values = (arguments_: Arguments, name: string): ReadonlyArray<string> => {\n const option = arguments_.options.get(name)\n if (option === true) {\n throw new Error(`--${name} requires a value`)\n }\n return option ?? []\n}\nconst option = (arguments_: Arguments, name: string): string | undefined => {\n const found = values(arguments_, name)\n if (found.length > 1 && name !== \"workspace\") {\n throw new Error(`--${name} may only be specified once`)\n }\n return found[0]\n}\nconst allowOptions = (arguments_: Arguments, names: ReadonlyArray<string>): void => {\n const allowed = new Set(names)\n for (const name of arguments_.options.keys()) {\n if (!allowed.has(name)) {\n throw new Error(`--${name} is not valid for this command`)\n }\n }\n}\nconst noPositionals = (arguments_: Arguments, command: string): void => {\n if (arguments_.positionals.length > 0) {\n throw new Error(`${command} does not accept positional arguments`)\n }\n}\nconst identifier = (arguments_: Arguments, label: string): string => {\n const value = arguments_.positionals[0]\n if (value === undefined) {\n throw new Error(`${label} is required`)\n }\n if (arguments_.positionals.length > 1) {\n throw new Error(`Unexpected arguments after ${label}`)\n }\n return value\n}\nconst print = (value: unknown): void => console.log(JSON.stringify(value, null, 2))\nconst printLine = (value: unknown): void => console.log(JSON.stringify(value))\n\nconst readInput = async (\n arguments_: Arguments,\n name: \"prompt\" | \"context\" | \"message\",\n): Promise<string | undefined> => {\n const direct = option(arguments_, name)\n const path = option(arguments_, `${name}-file`)\n const byteLimit = name === \"message\" ? 4 * 131_072 : 131_072\n if (direct !== undefined && path !== undefined) {\n throw new Error(`Use either --${name} or --${name}-file, not both`)\n }\n if (path !== undefined) {\n if (\n !(await access(path)\n .then(() => true)\n .catch(() => false))\n ) {\n throw new Error(`File does not exist: ${path}`)\n }\n if ((await stat(path)).size > byteLimit) {\n throw new Error(`${name} file exceeds ${byteLimit / 1024} KiB`)\n }\n }\n const result =\n path === undefined\n ? direct === \"-\"\n ? await readStdin(byteLimit, name)\n : direct\n : await readFile(path, \"utf8\")\n if (result !== undefined && result.length > 131_072) {\n throw new Error(`${name} exceeds 131072 characters`)\n }\n return result\n}\n\nconst readStdin = async (limit: number, label: string): Promise<string> => {\n const chunks: Array<Buffer> = []\n let size = 0\n for await (const chunk of process.stdin) {\n const bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : Buffer.from(chunk)\n size += bytes.byteLength\n if (size > limit) {\n throw new Error(`${label} exceeds ${Math.floor(limit / 1024)} KiB`)\n }\n chunks.push(bytes)\n }\n return Buffer.concat(chunks, size).toString(\"utf8\")\n}\n\nconst timeout = (arguments_: Arguments): number => {\n const seconds = Number(option(arguments_, \"timeout\") ?? \"900\")\n if (!Number.isInteger(seconds) || seconds < 5 || seconds > 86_400) {\n throw new Error(\"--timeout must be an integer between 5 and 86400\")\n }\n return seconds\n}\n\nconst pairingToken = async (arguments_: Arguments): Promise<string> => {\n const path = option(arguments_, \"token-file\")\n if (\n path !== undefined &&\n !(await access(path)\n .then(() => true)\n .catch(() => false))\n ) {\n throw new Error(`Pairing token file does not exist: ${path}`)\n }\n if (path !== undefined && (await stat(path)).size > 512) {\n throw new Error(\"Pairing token file exceeds 512 bytes\")\n }\n const token = (\n path === undefined ? await readStdin(512, \"Pairing token\") : await readFile(path, \"utf8\")\n ).trim()\n if (token.length === 0 || new TextEncoder().encode(token).byteLength > 256) {\n throw new Error(\"Provide a pairing token on stdin or with --token-file\")\n }\n return token\n}\n\nconst client = async () => {\n const configuration = await Effect.runPromise(loadClientConfiguration)\n return {\n configuration,\n relay: RelayClient.make({ baseUrl: configuration.relayUrl, token: configuration.token }),\n }\n}\n\nconst ownerClient = async () => {\n const configuration = await Effect.runPromise(loadOwnerConfiguration)\n return {\n configuration,\n relay: RelayClient.make({ baseUrl: configuration.relayUrl, token: configuration.token }),\n }\n}\n\nconst installSkill = async (target: string): Promise<ReadonlyArray<string>> => {\n const roots = {\n agents: join(homedir(), \".agents\", \"skills\", \"cohall\", \"SKILL.md\"),\n claude: join(homedir(), \".claude\", \"skills\", \"cohall\", \"SKILL.md\"),\n opencode: join(homedir(), \".config\", \"opencode\", \"skills\", \"cohall\", \"SKILL.md\"),\n } as const\n const selected =\n target === \"all\"\n ? Object.values(roots)\n : target in roots\n ? [roots[target as keyof typeof roots]]\n : undefined\n if (selected === undefined) {\n throw new Error(\"Skill target must be agents, claude, opencode, or all\")\n }\n for (const path of selected) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, skill)\n }\n return selected\n}\n\nexport const printHelp = (): void => console.log(help)\nexport const printSkill = (): void => console.log(skill.trimEnd())\n\nexport const runCli = async (command: string, raw: ReadonlyArray<string>): Promise<void> => {\n const arguments_ = parseArguments(raw)\n\n if (command === \"reply\") {\n allowOptions(arguments_, [\"message\", \"message-file\", \"error\"])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n const error = option(arguments_, \"error\")\n if (\n error !== undefined &&\n (option(arguments_, \"message\") !== undefined ||\n option(arguments_, \"message-file\") !== undefined)\n ) {\n throw new Error(\"Use either --error or --message/--message-file, not both\")\n }\n const message = error === undefined ? await readInput(arguments_, \"message\") : undefined\n if (error === undefined && message === undefined) {\n throw new Error(\"A bot reply requires --message, --message-file, or --error\")\n }\n await writeBotReply(id, error === undefined ? { result: message ?? \"\" } : { error })\n print({ submitted: true, task_id: id })\n return\n }\n\n if (command === \"init\") {\n allowOptions(arguments_, [\n \"client-only\",\n \"name\",\n \"providers\",\n \"relay\",\n \"service\",\n \"token-file\",\n \"workspace\",\n ])\n noPositionals(arguments_, command)\n const token =\n option(arguments_, \"token-file\") === undefined ? undefined : await pairingToken(arguments_)\n const interactive = process.stdin.isTTY === true && process.stderr.isTTY === true\n const relayUrl = option(arguments_, \"relay\")\n const deviceName = option(arguments_, \"name\")\n const providerInput = option(arguments_, \"providers\")\n const prompter: Prompter = interactive\n ? terminalPrompter()\n : {\n answer: (_label, fallback) => Promise.resolve(fallback),\n secret: () => pairingToken(arguments_),\n close: () => undefined,\n }\n try {\n const input = await guidedSetupInput(\n {\n clientOnly: arguments_.options.has(\"client-only\"),\n workspaces: values(arguments_, \"workspace\"),\n cwd: process.cwd(),\n ...(relayUrl === undefined ? {} : { relayUrl }),\n ...(token === undefined ? {} : { token }),\n ...(deviceName === undefined ? {} : { deviceName }),\n ...(providerInput === undefined ? {} : { providers: providerInput }),\n },\n prompter,\n )\n const providers = input.providers === \"auto\" ? \"auto\" : parseProviders(input.providers)\n const existing = await readStoredConfiguration()\n const result = input.reusedConfiguration\n ? {\n configuration: await makeStoredConfiguration({\n relayUrl: input.relayUrl,\n ...(input.deviceName === undefined ? {} : { deviceName: input.deviceName }),\n workspaces: input.workspaces,\n providers,\n }),\n roles: [\n ...(existing?.clientToken === undefined ? [] : ([\"client\"] as const)),\n ...(arguments_.options.has(\"client-only\") || existing?.deviceToken === undefined\n ? []\n : ([\"device\"] as const)),\n ],\n }\n : await joinRelay({\n relayUrl: input.relayUrl,\n token: input.token ?? \"\",\n clientOnly: arguments_.options.has(\"client-only\"),\n ...(input.deviceName === undefined ? {} : { deviceName: input.deviceName }),\n workspaces: input.workspaces,\n providers,\n })\n if (input.reusedConfiguration) {\n await writeStoredConfiguration(result.configuration)\n }\n const installedSkills = await installSkill(\"all\")\n const service = arguments_.options.has(\"service\") ? await installDeviceService() : undefined\n print({\n initialized: true,\n reused_configuration: input.reusedConfiguration,\n config_path: configurationPath(),\n relay_url: result.configuration.relayUrl,\n device_id: result.configuration.deviceId,\n roles: result.roles,\n workspaces: result.configuration.workspaces,\n skills: installedSkills,\n ...(service === undefined ? {} : { service }),\n next:\n service === undefined && !arguments_.options.has(\"client-only\")\n ? \"Run `cohall service install` for background availability, or `cohall device` now.\"\n : \"Run `cohall doctor` to verify this device.\",\n })\n } finally {\n prompter.close()\n }\n return\n }\n\n if (command === \"service\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length !== 1 || arguments_.positionals[0] !== \"install\") {\n throw new Error(\"Usage: cohall service install\")\n }\n print(await installDeviceService())\n return\n }\n\n if (command === \"relay\") {\n const action = arguments_.positionals[0]\n if (action === \"backup\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length !== 2) {\n throw new Error(\"Usage: cohall relay backup <directory>\")\n }\n print(await backupRelay(arguments_.positionals[1] ?? \"\"))\n return\n }\n if (action === \"restore\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length !== 2) {\n throw new Error(\"Usage: cohall relay restore <directory>\")\n }\n print(await restoreRelay(arguments_.positionals[1] ?? \"\"))\n return\n }\n if (action === \"use\") {\n allowOptions(arguments_, [\"allow-http\", \"no-restart\"])\n if (arguments_.positionals.length !== 2) {\n throw new Error(\"Usage: cohall relay use <url> [--no-restart] [--allow-http]\")\n }\n print(\n await switchRelay({\n relayUrl: arguments_.positionals[1] ?? \"\",\n restart: !arguments_.options.has(\"no-restart\"),\n allowHttp: arguments_.options.has(\"allow-http\"),\n }),\n )\n return\n }\n throw new Error(\n \"Usage: cohall relay [backup <directory>|restore <directory>|use <url> [--no-restart] [--allow-http]]\",\n )\n }\n\n if (command === \"upgrade\") {\n allowOptions(arguments_, [\"all\", \"dry-run\", \"no-restart\", \"to\"])\n noPositionals(arguments_, command)\n const target = option(arguments_, \"to\")\n if (arguments_.options.has(\"all\")) {\n const normalizedTarget = normalizeUpgradeTarget(target)\n const { relay } = await ownerClient()\n const restart = !arguments_.options.has(\"no-restart\")\n if (arguments_.options.has(\"dry-run\")) {\n const devices = await Effect.runPromise(relay.devices())\n assertDeviceOperationSupport(devices)\n print({\n dry_run: true,\n requested_version: normalizedTarget,\n restart,\n devices: devices.map((device) => ({ id: device.id, name: device.name })),\n })\n return\n }\n const operations = await Effect.runPromise(\n relay.createUpgradeOperations({ target: normalizedTarget, restart }),\n )\n print({\n queued: operations.length,\n requested_version: normalizedTarget,\n restart,\n operations,\n next: \"Run `cohall upgrades` to inspect progress.\",\n })\n return\n }\n print(\n await upgrade({\n currentVersion: version,\n ...(target === undefined ? {} : { target }),\n restart: !arguments_.options.has(\"no-restart\"),\n dryRun: arguments_.options.has(\"dry-run\"),\n delegated: process.env.COHALL_PROVIDER !== undefined,\n }),\n )\n return\n }\n\n if (command === \"upgrades\") {\n allowOptions(arguments_, [])\n const { relay } = await ownerClient()\n if (arguments_.positionals.length > 0) {\n if (arguments_.positionals.length !== 2 || arguments_.positionals[0] !== \"abandon\") {\n throw new Error(\"Usage: cohall upgrades [abandon <operation-id>]\")\n }\n print(\n await Effect.runPromise(\n relay.abandonOperation(Schema.decodeUnknownSync(OperationId)(arguments_.positionals[1])),\n ),\n )\n return\n }\n print(await Effect.runPromise(relay.operations()))\n return\n }\n\n if (command === \"join\") {\n allowOptions(arguments_, [\n \"client-only\",\n \"name\",\n \"providers\",\n \"relay\",\n \"token-file\",\n \"workspace\",\n ])\n noPositionals(arguments_, command)\n const token = await pairingToken(arguments_)\n const relayUrl = normalizeRelayUrl(option(arguments_, \"relay\") ?? \"http://127.0.0.1:8787\")\n const existing = await readStoredConfiguration()\n const suppliedWorkspaces = values(arguments_, \"workspace\")\n const workspaces = suppliedWorkspaces.length === 0 ? existing?.workspaces : suppliedWorkspaces\n const deviceName = option(arguments_, \"name\")\n const providerInput = option(arguments_, \"providers\")\n const providers =\n providerInput === undefined\n ? undefined\n : providerInput === \"auto\"\n ? \"auto\"\n : parseProviders(providerInput)\n if (!arguments_.options.has(\"client-only\") && (workspaces?.length ?? 0) === 0) {\n throw new Error(\"At least one --workspace is required when joining a device\")\n }\n const clientOnly = arguments_.options.has(\"client-only\")\n const { configuration, roles } = await joinRelay({\n relayUrl,\n token,\n clientOnly,\n ...(deviceName === undefined ? {} : { deviceName }),\n ...(workspaces === undefined ? {} : { workspaces }),\n ...(providers === undefined ? {} : { providers }),\n })\n print({\n configured: true,\n config_path: configurationPath(),\n relay_url: configuration.relayUrl,\n device_id: configuration.deviceId,\n roles,\n workspaces: configuration.workspaces,\n })\n return\n }\n\n if (command === \"config\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n const configuration = await readStoredConfiguration()\n print({\n config_path: configurationPath(),\n configured: configuration !== undefined,\n ...(configuration === undefined\n ? {}\n : {\n relay_url: configuration.relayUrl,\n device_id: configuration.deviceId,\n device_name: configuration.deviceName,\n workspaces: configuration.workspaces,\n client_credential: configuration.clientToken !== undefined,\n device_credential: configuration.deviceToken !== undefined,\n providers: configuration.providers ?? \"auto\",\n model: configuration.model,\n sandbox: configuration.sandbox,\n grok_gateway: configuration.grokGateway,\n }),\n })\n return\n }\n\n if (command === \"configure\") {\n allowOptions(arguments_, [\n \"grok-gateway\",\n \"model\",\n \"name\",\n \"providers\",\n \"relay\",\n \"sandbox\",\n \"workspace\",\n ])\n noPositionals(arguments_, command)\n const existing = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(\n option(arguments_, \"relay\") ?? existing?.relayUrl ?? \"http://127.0.0.1:8787\",\n )\n const supplied = values(arguments_, \"workspace\")\n const workspaces =\n supplied.length === 0\n ? (existing?.workspaces ?? [])\n : await Effect.runPromise(parseWorkspaces(\"\", JSON.stringify(supplied)))\n const sandbox = option(arguments_, \"sandbox\")\n const model = option(arguments_, \"model\") ?? existing?.model\n const gatewayInput = option(arguments_, \"grok-gateway\") ?? existing?.grokGateway\n const grokGateway = gatewayInput === undefined ? undefined : resolve(gatewayInput)\n const providerInput = option(arguments_, \"providers\")\n const providers =\n providerInput === undefined\n ? existing?.providers\n : providerInput === \"auto\"\n ? undefined\n : parseProviders(providerInput)\n const configuration = StoredConfiguration.make({\n version: 1,\n relayUrl,\n deviceId: existing?.deviceId ?? makeDeviceId(),\n deviceName: option(arguments_, \"name\") ?? existing?.deviceName ?? \"cohall-device\",\n workspaces,\n ...credentialsForRelay(existing, relayUrl),\n ...(providers === undefined ? {} : { providers }),\n ...(model === undefined ? {} : { model }),\n ...(grokGateway === undefined ? {} : { grokGateway }),\n ...((sandbox ?? existing?.sandbox) === undefined\n ? {}\n : {\n sandbox: Schema.decodeUnknownSync(\n Schema.Literals([\"read-only\", \"workspace-write\", \"danger-full-access\"]),\n )(sandbox ?? existing?.sandbox),\n }),\n })\n await writeStoredConfiguration(configuration)\n print({ configured: true, config_path: configurationPath() })\n return\n }\n\n if (command === \"skill\") {\n allowOptions(arguments_, [])\n if (arguments_.positionals.length === 0) {\n printSkill()\n return\n }\n if (arguments_.positionals[0] !== \"install\" || arguments_.positionals.length > 2) {\n throw new Error(\"Usage: cohall skill [install [agents|claude|opencode|all]]\")\n }\n print({ installed: await installSkill(arguments_.positionals[1] ?? \"all\") })\n return\n }\n\n if (command === \"integrations\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print({\n cli_skill: \"npx -y @akshar5/cohall skill install all\",\n codex_mcp: \"codex mcp add cohall -- npx -y @akshar5/cohall mcp\",\n claude_mcp:\n \"claude mcp add --transport stdio --scope user cohall -- npx -y @akshar5/cohall mcp\",\n stdio_config: {\n command: \"npx\",\n args: [\"-y\", \"@akshar5/cohall\", \"mcp\"],\n },\n opencode_mcp: {\n type: \"local\",\n command: [\"npx\", \"-y\", \"@akshar5/cohall\", \"mcp\"],\n enabled: true,\n },\n })\n return\n }\n\n if (command === \"doctor\") {\n allowOptions(arguments_, [\"all\"])\n noPositionals(arguments_, command)\n if (arguments_.options.has(\"all\")) {\n const { relay } = await client()\n print(allDeviceHealth(await Effect.runPromise(relay.devices()), version))\n return\n }\n const configuration = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(\n process.env.COHALL_RELAY_URL ?? configuration?.relayUrl ?? \"http://127.0.0.1:8787\",\n )\n const storedCredentials = credentialsForRelay(configuration, relayUrl)\n const response = await fetch(`${relayUrl}/api/health`, {\n signal: AbortSignal.timeout(10_000),\n }).catch(() => undefined)\n const providerInput = process.env.COHALL_DEVICE_PROVIDERS\n const selectedProviders =\n providerInput === undefined\n ? configuration?.providers\n : providerInput === \"auto\"\n ? undefined\n : parseProviders(providerInput)\n const providerExecutables = Object.fromEntries(\n Provider.literals\n .filter((provider) => provider !== \"grok-bot\")\n .map((provider) => [\n provider,\n Providers.findExecutable(provider === \"claude-code\" ? \"claude\" : provider) ?? \"not found\",\n ]),\n )\n const grokGateway = process.env.COHALL_GROK_GATEWAY ?? configuration?.grokGateway\n const grokBots =\n grokGateway === undefined\n ? undefined\n : await discoverGrokBots(grokGateway).catch(() => undefined)\n const clientToken = process.env.COHALL_CLIENT_TOKEN ?? storedCredentials.clientToken\n const hasDeviceCredential =\n process.env.COHALL_DEVICE_TOKEN !== undefined || storedCredentials.deviceToken !== undefined\n const deviceId = process.env.COHALL_DEVICE_ID ?? configuration?.deviceId\n const currentDevice =\n response?.ok !== true || clientToken === undefined || deviceId === undefined\n ? undefined\n : await Effect.runPromise(\n RelayClient.make({ baseUrl: relayUrl, token: clientToken }).devices(),\n )\n .then((devices) => devices.find((device) => device.id === deviceId))\n .catch(() => undefined)\n const versionWarning = deviceVersionWarning(version, currentDevice?.version)\n const warnings = [\n ...(response?.ok === true ? [] : [\"Relay is unreachable\"]),\n ...(versionWarning === undefined ? [] : [versionWarning]),\n ...(hasDeviceCredential &&\n response?.ok === true &&\n currentDevice?.status !== \"online\" &&\n currentDevice?.status !== \"busy\"\n ? [\n clientToken === undefined\n ? \"Device status cannot be checked without a client credential\"\n : \"Device daemon is not connected or is not registered with the relay\",\n ]\n : []),\n ...(selectedProviders?.flatMap((provider) =>\n provider === \"grok-bot\"\n ? grokBots === undefined\n ? [\n \"Configured Grok Bot gateway is unavailable; check its discovery file and host process\",\n ]\n : []\n : providerExecutables[provider] === \"not found\"\n ? [`Configured provider ${provider} is not installed or not on PATH`]\n : [],\n ) ?? []),\n ]\n print({\n version,\n relay: response?.ok === true ? \"reachable\" : \"unreachable\",\n relay_url: relayUrl,\n config_path: configurationPath(),\n client_credential:\n process.env.COHALL_CLIENT_TOKEN !== undefined ||\n storedCredentials.clientToken !== undefined,\n device_credential: hasDeviceCredential,\n workspaces: configuration?.workspaces ?? [],\n providers: providerExecutables,\n ...(grokGateway === undefined\n ? {}\n : {\n grok_gateway: {\n path: grokGateway,\n reachable: grokBots !== undefined,\n bots: grokBots?.length ?? 0,\n },\n }),\n provider_selection: selectedProviders ?? \"auto\",\n provider_authentication: \"checked when delegated work starts\",\n device_status:\n hasDeviceCredential === false ? \"not configured\" : (currentDevice?.status ?? \"unknown\"),\n device_version: currentDevice?.version,\n warnings,\n })\n return\n }\n\n if (command === \"versions\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n const { relay } = await client()\n print(deviceVersions(await Effect.runPromise(relay.devices()), version))\n return\n }\n\n if (command === \"usage\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n const { relay } = await client()\n print({\n ...(await Effect.runPromise(relay.usage())),\n scope: \"Retained Cohall task activity; provider token and billing usage are not available.\",\n })\n return\n }\n\n if (\n command === \"pair\" ||\n command === \"sessions\" ||\n command === \"revoke\" ||\n command === \"forget\"\n ) {\n const { configuration, relay } = await ownerClient()\n if (command === \"pair\") {\n allowOptions(arguments_, [\"client-only\", \"label\"])\n noPositionals(arguments_, command)\n const roles = arguments_.options.has(\"client-only\")\n ? ([\"client\"] as const)\n : ([\"client\", \"device\"] as const)\n const credential = await Effect.runPromise(\n relay.createPairing({ label: option(arguments_, \"label\") ?? \"Cohall device\", roles }),\n )\n print({\n relay_url: configuration.relayUrl,\n pairing_token: credential.token,\n expires_at: credential.expiresAt,\n roles,\n })\n return\n }\n if (command === \"sessions\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print(await Effect.runPromise(relay.authSessions()))\n return\n }\n if (command === \"forget\") {\n allowOptions(arguments_, [])\n print(\n await Effect.runPromise(\n relay.forgetDevice(\n Schema.decodeUnknownSync(DeviceId)(identifier(arguments_, \"device id\")),\n ),\n ),\n )\n return\n }\n allowOptions(arguments_, [])\n print(\n await Effect.runPromise(\n relay.revokeAuthSession(\n Schema.decodeUnknownSync(AuthSessionId)(identifier(arguments_, \"session id\")),\n ),\n ),\n )\n return\n }\n\n const { configuration, relay } = await client()\n if (command === \"devices\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print(await Effect.runPromise(relay.devices()))\n return\n }\n if (command === \"bots\") {\n allowOptions(arguments_, [])\n noPositionals(arguments_, command)\n print(listBots(await Effect.runPromise(relay.devices())))\n return\n }\n if (command === \"delegate\" || command === \"send\") {\n allowOptions(arguments_, [\n \"context\",\n \"context-file\",\n \"no-wait\",\n \"parent\",\n \"prompt\",\n \"prompt-file\",\n \"provider\",\n \"target\",\n \"thread\",\n \"timeout\",\n \"workspace\",\n ])\n const waitSeconds = timeout(arguments_)\n const positionalTarget =\n command === \"send\" && arguments_.positionals[0]?.startsWith(\"@\")\n ? arguments_.positionals[0]\n : undefined\n const positionals =\n positionalTarget === undefined ? arguments_.positionals : arguments_.positionals.slice(1)\n if (positionalTarget !== undefined && option(arguments_, \"target\") !== undefined) {\n throw new Error(\"Use either a positional target or --target, not both\")\n }\n if (option(arguments_, \"prompt\") === \"-\" && option(arguments_, \"context\") === \"-\") {\n throw new Error(\"Only one of --prompt and --context may read from stdin\")\n }\n const suppliedPrompt = await readInput(arguments_, \"prompt\")\n const prompt = suppliedPrompt ?? positionals.join(\" \")\n if (prompt.trim().length === 0) {\n throw new Error(\"A prompt is required\")\n }\n if (suppliedPrompt !== undefined && positionals.length > 0) {\n throw new Error(\"Use either a positional prompt or --prompt, not both\")\n }\n const context = await readInput(arguments_, \"context\")\n const target = positionalTarget ?? option(arguments_, \"target\")\n const thread = option(arguments_, \"thread\")\n const workspace = option(arguments_, \"workspace\")\n const provider = option(arguments_, \"provider\")\n const parent = option(arguments_, \"parent\")\n const task = await Effect.runPromise(\n createDelegation(relay, configuration, {\n prompt,\n ...(target === undefined ? {} : { target }),\n ...(context === undefined ? {} : { context }),\n ...(thread === undefined ? {} : { threadId: Schema.decodeUnknownSync(ThreadId)(thread) }),\n ...(parent === undefined ? {} : { parentTaskId: Schema.decodeUnknownSync(TaskId)(parent) }),\n ...(workspace === undefined ? {} : { workspace }),\n ...(provider === undefined\n ? {}\n : { provider: Schema.decodeUnknownSync(Provider)(provider) }),\n }),\n )\n print(\n taskResult(\n arguments_.options.has(\"no-wait\")\n ? task\n : await Effect.runPromise(waitForTask(relay, task, waitSeconds)),\n ),\n )\n return\n }\n if (command === \"status\") {\n allowOptions(arguments_, [])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n print(taskResult(await Effect.runPromise(relay.getTask(id))))\n return\n }\n if (command === \"trace\") {\n allowOptions(arguments_, [\"follow\"])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n if (arguments_.options.has(\"follow\")) {\n await Effect.runPromise(followTaskTrace(relay, id, printLine))\n return\n }\n print(await Effect.runPromise(relay.traceTask(id)))\n return\n }\n if (command === \"wait\") {\n allowOptions(arguments_, [\"timeout\"])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n const task = await Effect.runPromise(relay.getTask(id))\n print(taskResult(await Effect.runPromise(waitForTask(relay, task, timeout(arguments_)))))\n return\n }\n if (command === \"cancel\") {\n allowOptions(arguments_, [])\n const id = Schema.decodeUnknownSync(TaskId)(identifier(arguments_, \"task id\"))\n print(taskResult(await Effect.runPromise(relay.cancelTask(id))))\n return\n }\n if (command === \"thread\") {\n allowOptions(arguments_, [])\n const id = Schema.decodeUnknownSync(ThreadId)(identifier(arguments_, \"thread id\"))\n print(await Effect.runPromise(threadContext(relay, id)))\n return\n }\n throw new Error(`Unknown Cohall command: ${command}`)\n}\n",
14
+ "import { Provider, type Provider as ProviderName } from \"@cohall/protocol\"\nimport { Effect, Schema } from \"effect\"\nimport { execa } from \"execa\"\nimport { accessSync, constants } from \"node:fs\"\nimport { chmod, mkdtemp, rm, writeFile } from \"node:fs/promises\"\nimport { homedir, platform, tmpdir } from \"node:os\"\nimport { delimiter, extname, isAbsolute, join } from \"node:path\"\nimport { execFile } from \"node:child_process\"\nimport type { Readable } from \"node:stream\"\n\nexport class ProviderUnavailableError extends Schema.TaggedErrorClass<ProviderUnavailableError>()(\n \"CohallProvider.Unavailable\",\n { provider: Provider, message: Schema.String },\n) {}\n\nexport class ProviderRunError extends Schema.TaggedErrorClass<ProviderRunError>()(\n \"CohallProvider.RunError\",\n {\n provider: Provider,\n message: Schema.String,\n exitCode: Schema.optionalKey(Schema.Number),\n },\n) {}\n\nexport type ProviderError = ProviderUnavailableError | ProviderRunError\nexport type CliProvider = Exclude<ProviderName, \"grok-bot\">\n\nexport interface RunOptions {\n readonly provider: CliProvider\n readonly threadId: string\n readonly taskId?: string\n readonly prompt: string\n readonly cwd: string\n readonly beforeSpawn?: () => Promise<void>\n readonly sessionId?: string\n readonly model?: string\n readonly sandbox?: \"read-only\" | \"workspace-write\" | \"danger-full-access\"\n}\n\nexport interface RunResult {\n readonly result: string\n readonly sessionId?: string\n}\n\ntype JsonRecord = Readonly<Record<string, unknown>>\n\nconst executables = {\n codex: \"codex\",\n \"claude-code\": \"claude\",\n opencode: \"opencode\",\n} as const satisfies Record<CliProvider, string>\n\nconst providerEnvironment = (): NodeJS.ProcessEnv => ({\n ...Object.fromEntries(\n Object.entries(process.env).filter(([name]) => {\n const key = platform() === \"win32\" ? name.toUpperCase() : name\n return !key.startsWith(\"COHALL_\") || key === \"COHALL_CONFIG\"\n }),\n ),\n PATH: executableDirectories().join(delimiter),\n})\n\nconst record = (value: unknown): JsonRecord | undefined =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? Object.fromEntries(Object.entries(value))\n : undefined\nconst text = (value: unknown): string | undefined => (typeof value === \"string\" ? value : undefined)\n\nconst executableCandidates = (command: string): ReadonlyArray<string> => {\n if (platform() !== \"win32\" || extname(command).length > 0) {\n return [command]\n }\n return (process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .filter((extension) => extension.length > 0)\n .map((extension) => `${command}${extension.toLowerCase()}`)\n}\n\nconst executableDirectories = (): ReadonlyArray<string> => {\n const home = homedir()\n const configured = (process.env.PATH ?? \"\").split(delimiter).filter(Boolean)\n const common =\n platform() === \"win32\"\n ? [\n process.env.APPDATA === undefined ? undefined : join(process.env.APPDATA, \"npm\"),\n process.env.LOCALAPPDATA === undefined\n ? undefined\n : join(process.env.LOCALAPPDATA, \"pnpm\"),\n join(home, \".bun\", \"bin\"),\n ]\n : [\n join(home, \".local\", \"bin\"),\n join(home, \".npm-global\", \"bin\"),\n join(home, \".bun\", \"bin\"),\n join(home, \".local\", \"share\", \"pnpm\"),\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n ]\n return [...new Set([...configured, ...common.filter((path) => path !== undefined)])]\n}\n\nexport const findExecutable = (command: string): string | undefined => {\n const paths =\n isAbsolute(command) || command.includes(\"/\") || command.includes(\"\\\\\")\n ? [\"\"]\n : executableDirectories()\n for (const directory of paths) {\n for (const candidate of executableCandidates(command)) {\n const path = directory.length === 0 ? candidate : join(directory, candidate)\n try {\n accessSync(path, platform() === \"win32\" ? constants.F_OK : constants.X_OK)\n return path\n } catch {\n continue\n }\n }\n }\n return undefined\n}\n\nexport const available = (provider: ProviderName): boolean =>\n provider !== \"grok-bot\" && findExecutable(executables[provider]) !== undefined\nexport const availableProviders = (): ReadonlyArray<CliProvider> =>\n Provider.literals\n .filter((provider): provider is CliProvider => provider !== \"grok-bot\")\n .filter(available)\n\nconst boundedText = (stream: Readable, limit: number, onOverflow: () => void): Promise<string> =>\n new Promise((resolve, reject) => {\n const chunks: Array<Buffer> = []\n let size = 0\n const cleanup = (): void => {\n stream.off(\"data\", onData)\n stream.off(\"end\", onEnd)\n stream.off(\"error\", onError)\n }\n const onData = (chunk: Buffer | string): void => {\n const bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk\n size += bytes.byteLength\n if (size <= limit) {\n chunks.push(bytes)\n return\n }\n cleanup()\n onOverflow()\n reject(new Error(`Provider output exceeded ${Math.floor(limit / 1024)} KiB`))\n }\n const onEnd = (): void => {\n cleanup()\n resolve(Buffer.concat(chunks, size).toString(\"utf8\"))\n }\n const onError = (cause: Error): void => {\n cleanup()\n reject(cause)\n }\n stream.on(\"data\", onData)\n stream.once(\"end\", onEnd)\n stream.once(\"error\", onError)\n })\n\ninterface CapturedText {\n readonly text: string\n readonly truncated: boolean\n}\n\nconst captureText = (stream: Readable, limit: number): Promise<CapturedText> =>\n new Promise((resolve, reject) => {\n const chunks: Array<Buffer> = []\n let captured = 0\n let truncated = false\n const onData = (chunk: Buffer | string): void => {\n const bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk\n const remaining = limit - captured\n if (remaining > 0) {\n const selected = bytes.byteLength <= remaining ? bytes : bytes.subarray(0, remaining)\n chunks.push(selected)\n captured += selected.byteLength\n }\n truncated ||= bytes.byteLength > remaining\n }\n const onEnd = (): void =>\n resolve({ text: Buffer.concat(chunks, captured).toString(\"utf8\"), truncated })\n stream.on(\"data\", onData)\n stream.once(\"end\", onEnd)\n stream.once(\"error\", reject)\n })\n\nconst failureMessage = (command: string, stderr: CapturedText, exitCode: number): string => {\n const fallback = `${command} exited with status ${exitCode}`\n const suffix = stderr.truncated ? \"\\n[stderr truncated after 64 KiB]\" : \"\"\n const available = 16_384 - suffix.length\n return `${(stderr.text.trim() || fallback).slice(0, available)}${suffix}`\n}\n\nconst codexCommand = (options: RunOptions): ReadonlyArray<string> => {\n const common = [\n \"--json\",\n \"--skip-git-repo-check\",\n \"-c\",\n 'approval_policy=\"never\"',\n ...(options.model === undefined ? [] : [\"--model\", options.model]),\n ...(options.sandbox === undefined\n ? []\n : [\"-c\", `sandbox_mode=${JSON.stringify(options.sandbox)}`]),\n ]\n return options.sessionId === undefined\n ? [\"codex\", \"exec\", ...common, \"-\"]\n : [\"codex\", \"exec\", \"resume\", ...common, options.sessionId, \"-\"]\n}\n\nconst claudeCommand = (options: RunOptions): ReadonlyArray<string> => [\n \"claude\",\n \"-p\",\n \"--output-format\",\n \"json\",\n ...(options.model === undefined ? [] : [\"--model\", options.model]),\n ...(options.sessionId === undefined ? [] : [\"--resume\", options.sessionId]),\n]\n\nconst opencodeCommand = (options: RunOptions, promptPath: string): ReadonlyArray<string> => [\n \"opencode\",\n \"run\",\n \"--format\",\n \"json\",\n ...(options.model === undefined ? [] : [\"--model\", options.model]),\n ...(options.sessionId === undefined ? [] : [\"--session\", options.sessionId]),\n \"Complete the task described in the attached Cohall prompt file.\",\n `--file=${promptPath}`,\n]\n\ninterface PreparedCommand {\n readonly command: ReadonlyArray<string>\n readonly input?: string\n readonly cleanup: () => Promise<void>\n}\n\nconst prepareCommand = async (options: RunOptions): Promise<PreparedCommand> => {\n switch (options.provider) {\n case \"codex\":\n return {\n command: codexCommand(options),\n input: options.prompt,\n cleanup: () => Promise.resolve(),\n }\n case \"claude-code\":\n return {\n command: claudeCommand(options),\n input: options.prompt,\n cleanup: () => Promise.resolve(),\n }\n case \"opencode\": {\n const directory = await mkdtemp(join(tmpdir(), \"cohall-opencode-\"))\n const promptPath = join(directory, \"prompt.md\")\n try {\n if (platform() !== \"win32\") {\n await chmod(directory, 0o700)\n }\n await writeFile(promptPath, options.prompt, { mode: 0o600 })\n return {\n command: opencodeCommand(options, promptPath),\n cleanup: () => rm(directory, { recursive: true, force: true }),\n }\n } catch (cause) {\n await rm(directory, { recursive: true, force: true }).catch(() => undefined)\n throw cause\n }\n }\n }\n}\n\nconst forEachJsonEvent = async (\n stdout: Readable,\n onEvent: (event: JsonRecord) => void,\n): Promise<void> => {\n const limit = 1024 * 1024\n let chunks: Array<Buffer> = []\n let size = 0\n let oversized = false\n const append = (chunk: Buffer): void => {\n if (oversized) {\n return\n }\n if (size + chunk.byteLength > limit) {\n chunks = []\n size = 0\n oversized = true\n return\n }\n if (chunk.byteLength > 0) {\n chunks.push(chunk)\n size += chunk.byteLength\n }\n }\n const emit = (): void => {\n if (oversized) {\n oversized = false\n return\n }\n const line = Buffer.concat(chunks, size).toString(\"utf8\")\n chunks = []\n size = 0\n if (line.trim().length === 0) {\n return\n }\n const event = record(JSON.parse(line) as unknown)\n if (event !== undefined) {\n onEvent(event)\n }\n }\n\n for await (const chunk of stdout) {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n let start = 0\n for (let newline = bytes.indexOf(0x0a, start); newline !== -1; ) {\n append(bytes.subarray(start, newline))\n emit()\n start = newline + 1\n newline = bytes.indexOf(0x0a, start)\n }\n append(bytes.subarray(start))\n }\n if (size > 0 || oversized) {\n emit()\n }\n}\n\nconst parseCodex = async (stdout: Readable, existingSession?: string): Promise<RunResult> => {\n let result = \"\"\n let sessionId = existingSession\n await forEachJsonEvent(stdout, (event) => {\n if (text(event.type) === \"thread.started\") {\n sessionId = text(event.thread_id) ?? sessionId\n }\n if (text(event.type) !== \"item.completed\") {\n return\n }\n const item = record(event.item)\n if (text(item?.type) === \"agent_message\") {\n result = text(item?.text) ?? text(item?.content) ?? result\n }\n })\n return {\n result: result || \"Codex completed the task without a text response.\",\n ...(sessionId === undefined ? {} : { sessionId }),\n }\n}\n\nconst parseClaude = (stdout: string, existingSession?: string): RunResult => {\n const value = record(JSON.parse(stdout) as unknown)\n const result = text(value?.result) ?? text(value?.content)\n if (result === undefined) {\n throw new Error(\"Claude Code returned JSON without a result\")\n }\n const sessionId = text(value?.session_id) ?? text(value?.sessionId) ?? existingSession\n return { result, ...(sessionId === undefined ? {} : { sessionId }) }\n}\n\nconst textFromPart = (value: unknown): string | undefined => {\n const part = record(value)\n if (part === undefined) {\n return undefined\n }\n return text(part.text) ?? text(part.content) ?? text(record(part.part)?.text)\n}\n\nconst openCodeError = (event: JsonRecord): string | undefined => {\n if (text(event.type) !== \"error\") {\n return undefined\n }\n const error = record(event.error)\n const name = text(error?.name)\n const message =\n text(record(error?.data)?.message) ??\n text(error?.message) ??\n text(event.message) ??\n text(event.error)\n if (name !== undefined && message !== undefined) {\n return `OpenCode ${name}: ${message}`\n }\n return message === undefined ? \"OpenCode reported an error\" : `OpenCode: ${message}`\n}\n\nconst parseOpenCode = async (stdout: Readable, existingSession?: string): Promise<RunResult> => {\n let result = \"\"\n let sessionId = existingSession\n await forEachJsonEvent(stdout, (event) => {\n const failure = openCodeError(event)\n if (failure !== undefined) {\n throw new Error(failure)\n }\n sessionId =\n text(event.sessionID) ??\n text(event.sessionId) ??\n text(event.session_id) ??\n text(record(event.info)?.sessionID) ??\n sessionId\n const content = textFromPart(event.part) ?? textFromPart(event) ?? text(event.result)\n if (content !== undefined && content.length > 0) {\n result = content\n }\n })\n if (result.length === 0) {\n throw new Error(\n \"OpenCode produced no result; verify its authentication and use a supported project workspace\",\n )\n }\n return { result, ...(sessionId === undefined ? {} : { sessionId }) }\n}\n\nconst parse = async (\n options: RunOptions,\n stdout: Readable,\n onFailure: () => void,\n): Promise<RunResult> => {\n try {\n switch (options.provider) {\n case \"codex\":\n return await parseCodex(stdout, options.sessionId)\n case \"claude-code\":\n return parseClaude(await boundedText(stdout, 1024 * 1024, onFailure), options.sessionId)\n case \"opencode\":\n return await parseOpenCode(stdout, options.sessionId)\n }\n } catch (cause) {\n onFailure()\n throw cause\n }\n}\n\nconst byteLength = (value: string): number => new TextEncoder().encode(value).byteLength\n\nconst processExists = (pid: number): boolean => {\n try {\n process.kill(-pid, 0)\n return true\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === \"ESRCH\") {\n return false\n }\n throw cause\n }\n}\n\nconst waitForProcessGroup = async (pid: number, timeoutMs: number): Promise<boolean> => {\n const deadline = Date.now() + timeoutMs\n while (processExists(pid)) {\n if (Date.now() >= deadline) {\n return false\n }\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n return true\n}\n\nconst terminateWindowsTree = (pid: number): Promise<void> =>\n new Promise((resolve) => {\n const systemRoot = process.env.SystemRoot ?? \"C:\\\\Windows\"\n execFile(\n join(systemRoot, \"System32\", \"taskkill.exe\"),\n [\"/PID\", String(pid), \"/T\", \"/F\"],\n { windowsHide: true },\n () => resolve(),\n )\n })\n\nconst terminateProcessTree = async (pid: number): Promise<void> => {\n if (platform() === \"win32\") {\n await terminateWindowsTree(pid)\n return\n }\n try {\n process.kill(-pid, \"SIGTERM\")\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"code\" in cause && cause.code === \"ESRCH\") {\n return\n }\n throw cause\n }\n if (await waitForProcessGroup(pid, 5_000)) {\n return\n }\n process.kill(-pid, \"SIGKILL\")\n await waitForProcessGroup(pid, 1_000)\n}\n\nexport const run = (options: RunOptions): Effect.Effect<RunResult, ProviderError> =>\n Effect.callback((resume, signal) => {\n const running = (async () => {\n const executable = findExecutable(executables[options.provider])\n if (executable === undefined) {\n throw new ProviderUnavailableError({\n provider: options.provider,\n message: `${executables[options.provider]} is not available on this device`,\n })\n }\n const prepared = await prepareCommand(options)\n try {\n await options.beforeSpawn?.()\n signal.throwIfAborted()\n const [, ...arguments_] = prepared.command\n const child = execa(executable, arguments_, {\n cwd: options.cwd,\n env: {\n ...providerEnvironment(),\n COHALL_PROVIDER: options.provider,\n COHALL_THREAD_ID: options.threadId,\n ...(options.taskId === undefined ? {} : { COHALL_TASK_ID: options.taskId }),\n },\n extendEnv: false,\n detached: platform() !== \"win32\",\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n buffer: false,\n reject: false,\n cleanup: false,\n })\n let finished = false\n const exited = child.then(({ exitCode, failed, originalMessage, shortMessage }) => {\n finished = true\n if (failed && exitCode === undefined) {\n throw new Error(originalMessage ?? shortMessage ?? \"Provider failed to start\")\n }\n return exitCode ?? 1\n })\n let termination: Promise<void> | undefined\n const terminate = (): void => {\n if (child.pid === undefined || termination !== undefined) {\n return\n }\n termination = terminateProcessTree(child.pid).catch(() => undefined)\n }\n signal.addEventListener(\"abort\", terminate, { once: true })\n if (signal.aborted) {\n terminate()\n }\n try {\n const written = new Promise<void>((resolve, reject) => {\n child.stdin.once(\"error\", reject)\n child.stdin.end(prepared.input, (cause?: Error | null) =>\n cause === undefined || cause === null ? resolve() : reject(cause),\n )\n })\n const [result, stderr, exitCode] = await Promise.all([\n parse(options, child.stdout, terminate),\n captureText(child.stderr, 64 * 1024),\n exited,\n written,\n ])\n if (exitCode !== 0) {\n throw new ProviderRunError({\n provider: options.provider,\n message: failureMessage(executables[options.provider], stderr, exitCode),\n exitCode,\n })\n }\n if (byteLength(result.result) > 131_072) {\n throw new ProviderRunError({\n provider: options.provider,\n message: \"Provider result exceeded 128 KiB\",\n })\n }\n if (result.sessionId !== undefined && byteLength(result.sessionId) > 4_096) {\n throw new ProviderRunError({\n provider: options.provider,\n message: \"Provider session ID exceeded 4 KiB\",\n })\n }\n return result\n } finally {\n signal.removeEventListener(\"abort\", terminate)\n if (!finished) {\n terminate()\n await exited.catch(() => undefined)\n }\n await termination\n }\n } finally {\n await prepared.cleanup()\n }\n })()\n void running.then(\n (result) => resume(Effect.succeed(result)),\n (cause: unknown) =>\n resume(\n Effect.fail(\n cause instanceof ProviderUnavailableError || cause instanceof ProviderRunError\n ? cause\n : new ProviderRunError({\n provider: options.provider,\n message: (cause instanceof Error ? cause.message : String(cause)).slice(\n 0,\n 16_384,\n ),\n }),\n ),\n ),\n )\n // Keep the device's task slot occupied until interruption has finished cleanup.\n return Effect.promise(() =>\n running.then(\n () => undefined,\n () => undefined,\n ),\n )\n })\n",
15
+ "import { DeviceId, Provider, makeDeviceId, type Provider as ProviderName } from \"@cohall/protocol\"\nimport { Effect, Schema } from \"effect\"\nimport { access, chmod, mkdir, readFile, realpath, rename, stat, writeFile } from \"node:fs/promises\"\nimport { homedir, hostname, platform } from \"node:os\"\nimport { dirname, join, resolve } from \"node:path\"\n\nconst WorkspaceList = Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(64))\nconst ProviderList = Schema.Array(Provider)\n .check(Schema.isMinLength(1))\n .check(Schema.isMaxLength(Provider.literals.length))\nconst Sandbox = Schema.Literals([\"read-only\", \"workspace-write\", \"danger-full-access\"])\n\nexport const StoredConfiguration = Schema.Struct({\n version: Schema.Literal(1),\n relayUrl: Schema.NonEmptyString,\n deviceId: DeviceId,\n deviceName: Schema.NonEmptyString,\n workspaces: WorkspaceList,\n clientToken: Schema.optionalKey(Schema.NonEmptyString),\n deviceToken: Schema.optionalKey(Schema.NonEmptyString),\n providers: Schema.optionalKey(ProviderList),\n model: Schema.optionalKey(Schema.NonEmptyString),\n sandbox: Schema.optionalKey(Sandbox),\n grokGateway: Schema.optionalKey(Schema.NonEmptyString),\n})\nexport interface StoredConfiguration extends Schema.Schema.Type<typeof StoredConfiguration> {}\n\nexport const ClientConfiguration = Schema.Struct({\n relayUrl: Schema.NonEmptyString,\n token: Schema.NonEmptyString,\n mcpThreadId: Schema.optionalKey(Schema.String),\n mcpTaskId: Schema.optionalKey(Schema.String),\n})\nexport interface ClientConfiguration extends Schema.Schema.Type<typeof ClientConfiguration> {}\n\nexport const DeviceConfiguration = Schema.Struct({\n relayUrl: Schema.NonEmptyString,\n token: Schema.NonEmptyString,\n id: DeviceId,\n name: Schema.NonEmptyString,\n workspaces: WorkspaceList,\n providers: Schema.optionalKey(ProviderList),\n model: Schema.optionalKey(Schema.NonEmptyString),\n sandbox: Schema.optionalKey(Sandbox),\n grokGateway: Schema.optionalKey(Schema.NonEmptyString),\n})\nexport interface DeviceConfiguration extends Schema.Schema.Type<typeof DeviceConfiguration> {}\n\nconst defaultConfigDirectory = (): string => {\n if (platform() === \"win32\") {\n return join(process.env.APPDATA ?? join(homedir(), \"AppData\", \"Roaming\"), \"Cohall\")\n }\n if (platform() === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\", \"Cohall\")\n }\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"cohall\")\n}\n\nconst defaultRelayDataDirectory = (): string => {\n if (platform() === \"win32\") {\n return join(process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\"), \"Cohall\")\n }\n if (platform() === \"darwin\") {\n return join(homedir(), \"Library\", \"Application Support\", \"Cohall\", \"relay\")\n }\n return join(process.env.XDG_DATA_HOME ?? join(homedir(), \".local\", \"share\"), \"cohall\")\n}\n\nexport const relayDataDirectory = (): string =>\n resolve(process.env.COHALL_DATA_DIR ?? defaultRelayDataDirectory())\n\nexport const configurationPath = (): string =>\n resolve(process.env.COHALL_CONFIG ?? join(defaultConfigDirectory(), \"config.json\"))\n\nexport const normalizeRelayUrl = (input: string): string => {\n const url = new URL(input)\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"Relay URL must use http or https\")\n }\n if (\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw new Error(\"Relay URL cannot include credentials, a query, or a fragment\")\n }\n if (url.pathname !== \"/\" && url.pathname !== \"\") {\n throw new Error(\"Relay URL cannot include a path\")\n }\n url.pathname = \"/\"\n return url.toString().replace(/\\/$/, \"\")\n}\n\nexport const parseWorkspaces = (\n workspaceList: string,\n workspaceJson?: string,\n): Effect.Effect<ReadonlyArray<string>, Error> =>\n Effect.tryPromise({\n try: async () => {\n const values =\n workspaceJson === undefined\n ? workspaceList\n .split(\",\")\n .map((workspace) => workspace.trim())\n .filter((workspace) => workspace.length > 0)\n : Schema.decodeUnknownSync(WorkspaceList)(JSON.parse(workspaceJson))\n const canonical = await Promise.all(\n values.map(async (workspace) => {\n const path = await realpath(resolve(workspace))\n if (!(await stat(path)).isDirectory()) {\n throw new Error(`Not a directory: ${workspace}`)\n }\n return path\n }),\n )\n return [...new Set(canonical)]\n },\n catch: (cause) =>\n new Error(\n `Workspace roots must be existing directories; JSON input must be an array of paths: ${cause instanceof Error ? cause.message : String(cause)}`,\n ),\n })\n\nexport const parseProviders = (input: string): ReadonlyArray<ProviderName> =>\n Schema.decodeUnknownSync(ProviderList)([\n ...new Set(\n input\n .split(\",\")\n .map((provider) => provider.trim())\n .filter(Boolean),\n ),\n ])\n\nexport const readStoredConfiguration = async (): Promise<StoredConfiguration | undefined> => {\n const path = configurationPath()\n if (\n !(await access(path)\n .then(() => true)\n .catch(() => false))\n ) {\n return undefined\n }\n if (platform() !== \"win32\") {\n await chmod(path, 0o600)\n }\n try {\n return Schema.decodeUnknownSync(StoredConfiguration)(JSON.parse(await readFile(path, \"utf8\")))\n } catch (cause) {\n throw new Error(`Invalid Cohall configuration at ${path}: ${String(cause)}`)\n }\n}\n\nexport const writeStoredConfiguration = async (\n configuration: StoredConfiguration,\n): Promise<void> => {\n const path = configurationPath()\n const directory = dirname(path)\n const temporary = `${path}.${process.pid}.tmp`\n await mkdir(directory, { recursive: true, mode: 0o700 })\n if (platform() !== \"win32\") {\n await chmod(directory, 0o700)\n }\n await writeFile(temporary, `${JSON.stringify(configuration, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporary, path)\n if (platform() !== \"win32\") {\n await chmod(path, 0o600)\n }\n}\n\nexport const credentialsForRelay = (\n configuration: StoredConfiguration | undefined,\n relayUrl: string,\n): { readonly clientToken?: string; readonly deviceToken?: string } => {\n if (configuration?.relayUrl !== normalizeRelayUrl(relayUrl)) {\n return {}\n }\n return {\n ...(configuration.clientToken === undefined ? {} : { clientToken: configuration.clientToken }),\n ...(configuration.deviceToken === undefined ? {} : { deviceToken: configuration.deviceToken }),\n }\n}\n\nexport const makeStoredConfiguration = async (input: {\n readonly relayUrl: string\n readonly deviceName?: string\n readonly workspaces?: ReadonlyArray<string>\n readonly providers?: ReadonlyArray<ProviderName> | \"auto\"\n readonly clientToken?: string\n readonly deviceToken?: string\n}): Promise<StoredConfiguration> => {\n const existing = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(input.relayUrl)\n const retainedCredentials = credentialsForRelay(existing, relayUrl)\n const canonicalWorkspaces =\n input.workspaces === undefined\n ? (existing?.workspaces ?? [])\n : await Effect.runPromise(parseWorkspaces(\"\", JSON.stringify(input.workspaces)))\n const clientToken = input.clientToken ?? retainedCredentials.clientToken\n const deviceToken = input.deviceToken ?? retainedCredentials.deviceToken\n const providers =\n input.providers === \"auto\" ? undefined : (input.providers ?? existing?.providers)\n return StoredConfiguration.make({\n version: 1,\n relayUrl,\n deviceId: existing?.deviceId ?? makeDeviceId(),\n deviceName: input.deviceName ?? existing?.deviceName ?? hostname(),\n workspaces: canonicalWorkspaces,\n ...(clientToken === undefined ? {} : { clientToken }),\n ...(deviceToken === undefined ? {} : { deviceToken }),\n ...(providers === undefined ? {} : { providers }),\n ...(existing?.model === undefined ? {} : { model: existing.model }),\n ...(existing?.sandbox === undefined ? {} : { sandbox: existing.sandbox }),\n ...(existing?.grokGateway === undefined ? {} : { grokGateway: existing.grokGateway }),\n })\n}\n\nconst environmentWorkspaces = async (\n stored: StoredConfiguration | undefined,\n): Promise<ReadonlyArray<string>> => {\n const list = process.env.COHALL_DEVICE_WORKSPACES\n const json = process.env.COHALL_DEVICE_WORKSPACES_JSON\n if (list === undefined && json === undefined) {\n return stored?.workspaces ?? []\n }\n return Effect.runPromise(parseWorkspaces(list ?? \"\", json))\n}\n\nconst environmentProvider = (): string | undefined =>\n process.env.COHALL_MODEL ?? process.env.COHALL_CODEX_MODEL\n\nconst environmentSandbox = (): DeviceConfiguration[\"sandbox\"] => {\n const value = process.env.COHALL_SANDBOX ?? process.env.COHALL_CODEX_SANDBOX\n return value === undefined ? undefined : Schema.decodeUnknownSync(Sandbox)(value)\n}\n\nconst environmentProviders = (\n stored: StoredConfiguration | undefined,\n): ReadonlyArray<ProviderName> | undefined => {\n const value = process.env.COHALL_DEVICE_PROVIDERS\n return value === undefined\n ? stored?.providers\n : value === \"auto\"\n ? undefined\n : parseProviders(value)\n}\n\nconst storedOrDefaults = async (): Promise<StoredConfiguration> => {\n const stored = await readStoredConfiguration()\n return (\n stored ??\n StoredConfiguration.make({\n version: 1,\n relayUrl: \"http://127.0.0.1:8787\",\n deviceId: makeDeviceId(),\n deviceName: hostname(),\n workspaces: [],\n })\n )\n}\n\nexport const loadClientConfiguration = Effect.tryPromise({\n try: async () => {\n const stored = await storedOrDefaults()\n const relayUrl = normalizeRelayUrl(process.env.COHALL_RELAY_URL ?? stored.relayUrl)\n const token =\n process.env.COHALL_CLIENT_TOKEN ?? credentialsForRelay(stored, relayUrl).clientToken\n if (token === undefined) {\n throw new Error(\n `No client credential. Run cohall join with a pairing token on stdin or set COHALL_CLIENT_TOKEN.`,\n )\n }\n return ClientConfiguration.make({\n relayUrl,\n token,\n ...(process.env.COHALL_THREAD_ID === undefined\n ? {}\n : { mcpThreadId: process.env.COHALL_THREAD_ID }),\n ...(process.env.COHALL_TASK_ID === undefined\n ? {}\n : { mcpTaskId: process.env.COHALL_TASK_ID }),\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n\nexport const loadOwnerConfiguration = Effect.tryPromise({\n try: async () => {\n const stored = await storedOrDefaults()\n const ownerTokenPath = join(relayDataDirectory(), \"owner-token\")\n const token =\n process.env.COHALL_TOKEN ??\n (await readFile(ownerTokenPath, \"utf8\")\n .then((value) => value.trim())\n .catch(() => undefined))\n if (token === undefined || token.length === 0) {\n throw new Error(\n \"No owner credential. Run this command on the relay host or set COHALL_TOKEN.\",\n )\n }\n if (token.length < 32) {\n throw new Error(\"The Cohall relay owner token must be at least 32 characters\")\n }\n return ClientConfiguration.make({\n relayUrl: normalizeRelayUrl(process.env.COHALL_RELAY_URL ?? stored.relayUrl),\n token,\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n\nexport const loadDeviceConfiguration = Effect.tryPromise({\n try: async () => {\n const stored = await storedOrDefaults()\n const relayUrl = normalizeRelayUrl(process.env.COHALL_RELAY_URL ?? stored.relayUrl)\n const token =\n process.env.COHALL_DEVICE_TOKEN ?? credentialsForRelay(stored, relayUrl).deviceToken\n if (token === undefined) {\n throw new Error(\n `No device credential. Run cohall join with a pairing token on stdin or set COHALL_DEVICE_TOKEN.`,\n )\n }\n const workspaces = await environmentWorkspaces(stored)\n if (workspaces.length === 0) {\n throw new Error(\"No device workspace roots are configured\")\n }\n const model = environmentProvider() ?? stored.model\n const sandbox = environmentSandbox() ?? stored.sandbox\n const providers = environmentProviders(stored)\n const grokGateway = process.env.COHALL_GROK_GATEWAY ?? stored.grokGateway\n return DeviceConfiguration.make({\n relayUrl,\n token,\n id:\n process.env.COHALL_DEVICE_ID === undefined\n ? stored.deviceId\n : DeviceId.make(process.env.COHALL_DEVICE_ID),\n name: process.env.COHALL_DEVICE_NAME ?? stored.deviceName,\n workspaces,\n ...(providers === undefined ? {} : { providers }),\n ...(model === undefined ? {} : { model }),\n ...(sandbox === undefined ? {} : { sandbox }),\n ...(grokGateway === undefined ? {} : { grokGateway: resolve(grokGateway) }),\n })\n },\n catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),\n})\n\nexport const knownProviders = Provider.literals\n",
16
16
  "import type { Interface as RelayClient } from \"@cohall/client\"\nimport {\n BotId,\n DeviceId,\n Provider,\n TaskId,\n TaskStatus,\n ThreadId,\n terminalTaskStatuses,\n isTerminalTask,\n type Device,\n type Provider as ProviderName,\n type Task,\n type TaskTrace,\n type ThreadId as ThreadIdType,\n} from \"@cohall/protocol\"\nimport { Effect, Schedule, Schema } from \"effect\"\nimport type { ClientConfiguration } from \"./config.ts\"\n\nexport class DeviceSelectionError extends Schema.TaggedErrorClass<DeviceSelectionError>()(\n \"Cohall.DeviceSelectionError\",\n { message: Schema.String, devices: Schema.Array(Schema.String) },\n) {}\n\nexport class TaskWaitTimeoutError extends Schema.TaggedErrorClass<TaskWaitTimeoutError>()(\n \"Cohall.TaskWaitTimeoutError\",\n { message: Schema.String, taskId: TaskId, status: TaskStatus },\n) {}\n\nexport interface DelegateOptions {\n readonly prompt: string\n readonly target?: string\n readonly context?: string\n readonly threadId?: ThreadIdType\n readonly workspace?: string\n readonly provider?: ProviderName\n readonly parentTaskId?: TaskId\n}\n\nexport const TaskResult = Schema.Struct({\n task_id: TaskId,\n thread_id: ThreadId,\n status: TaskStatus,\n provider: Provider,\n target_device_id: DeviceId,\n bot_id: Schema.optionalKey(BotId),\n result: Schema.optionalKey(Schema.String),\n error: Schema.optionalKey(Schema.String),\n})\nexport interface TaskResult extends Schema.Schema.Type<typeof TaskResult> {}\n\nconst matchingDevices = (devices: ReadonlyArray<Device>, target: string): ReadonlyArray<Device> => {\n const value = target.replace(/^@/, \"\")\n const normalized = value.toLowerCase()\n const byId = devices.find((device) => device.id === value)\n return byId === undefined\n ? devices.filter(\n (device) =>\n device.name.toLowerCase() === normalized || device.hostname.toLowerCase() === normalized,\n )\n : [byId]\n}\n\nexport const listBots = (devices: ReadonlyArray<Device>) =>\n devices.flatMap((device) =>\n (device.bots ?? []).map((bot) => ({\n id: bot.id,\n name: bot.name,\n ...(bot.description === undefined ? {} : { description: bot.description }),\n device_id: device.id,\n device_name: device.name,\n status: device.status,\n target: `@${device.id}/${bot.id}`,\n })),\n )\n\nconst selectTarget = Effect.fn(\"Cohall.selectTarget\")(function* (\n devices: ReadonlyArray<Device>,\n target: string,\n) {\n const value = target.replace(/^@/, \"\")\n const separator = value.indexOf(\"/\")\n const qualified = separator !== -1\n const deviceMatches = matchingDevices(devices, qualified ? value.slice(0, separator) : value)\n const botValue = qualified ? value.slice(separator + 1) : value\n const bots = listBots(qualified ? deviceMatches : devices)\n const botsById = bots.filter((bot) => bot.id === botValue)\n const botMatches =\n botsById.length > 0\n ? botsById\n : bots.filter((bot) => bot.name.toLowerCase() === botValue.toLowerCase())\n // An exact device ID remains a direct device target, even if a bot uses it as a name.\n const exactDevice = qualified ? undefined : deviceMatches.find((device) => device.id === value)\n if (exactDevice !== undefined) return { deviceId: exactDevice.id, botId: undefined }\n const matches = [\n ...(qualified\n ? []\n : deviceMatches.map((device) => ({ deviceId: device.id, botId: undefined }))),\n ...botMatches.map((bot) => ({ deviceId: bot.device_id, botId: bot.id })),\n ]\n const selected = matches[0]\n if (matches.length === 1 && selected !== undefined) return selected\n return yield* new DeviceSelectionError({\n message:\n matches.length === 0\n ? `No Cohall device or bot matches ${target}; use cohall devices or cohall bots`\n : `${target} is ambiguous; use a device ID or @device-id/bot-id from cohall bots`,\n devices: [\n ...deviceMatches.map((device) => `${device.name} (@${device.id})`),\n ...botMatches.map((bot) => `${bot.name} on ${bot.device_name} (${bot.target})`),\n ],\n })\n})\n\nexport const taskResult = (task: Task): TaskResult =>\n TaskResult.make({\n task_id: task.id,\n thread_id: task.threadId,\n status: task.status,\n provider: task.provider,\n target_device_id: task.targetDeviceId,\n ...(task.botId === undefined ? {} : { bot_id: task.botId }),\n ...(task.result === undefined ? {} : { result: task.result }),\n ...(task.error === undefined ? {} : { error: task.error }),\n })\n\nexport const createDelegation = Effect.fn(\"Cohall.createDelegation\")(function* (\n client: RelayClient,\n configuration: ClientConfiguration,\n options: DelegateOptions,\n) {\n const devices = yield* client.devices()\n if (devices.length === 0) {\n return yield* new DeviceSelectionError({\n message: \"No Cohall devices are registered\",\n devices: [],\n })\n }\n let target =\n options.target === undefined ? undefined : yield* selectTarget(devices, options.target)\n if (\n target === undefined &&\n options.threadId !== undefined &&\n options.provider === undefined &&\n options.parentTaskId === undefined &&\n configuration.mcpTaskId === undefined\n ) {\n const context = yield* client.threadContext(options.threadId)\n const previous = context.tasks.findLast((task) => task.parentTaskId === undefined)\n if (previous === undefined && context.truncated) {\n return yield* new DeviceSelectionError({\n message: \"Earlier thread targets are no longer in the retained context; specify --target\",\n devices: [],\n })\n }\n if (previous?.provider === \"grok-bot\" && previous.botId !== undefined) {\n target = yield* selectTarget(devices, `@${previous.targetDeviceId}/${previous.botId}`)\n }\n }\n const botId = target?.botId\n if (botId !== undefined && options.provider !== undefined && options.provider !== \"grok-bot\") {\n return yield* new DeviceSelectionError({\n message: `A bot target requires provider grok-bot, not ${options.provider}`,\n devices: [],\n })\n }\n if (botId === undefined && options.provider === \"grok-bot\") {\n return yield* new DeviceSelectionError({\n message: \"Select a bot with --target; use cohall bots to list available bots\",\n devices: [],\n })\n }\n const provider = botId === undefined ? options.provider : \"grok-bot\"\n const inheritedThread = configuration.mcpThreadId\n const parentTaskId =\n options.parentTaskId ??\n (configuration.mcpTaskId === undefined\n ? undefined\n : yield* Schema.decodeUnknownEffect(TaskId)(configuration.mcpTaskId))\n return yield* client.createTask({\n prompt: options.prompt,\n ...(target === undefined ? {} : { targetDeviceId: target.deviceId }),\n ...(botId === undefined ? {} : { botId }),\n ...(options.threadId !== undefined\n ? { threadId: options.threadId }\n : inheritedThread === undefined\n ? {}\n : { threadId: ThreadId.make(inheritedThread) }),\n ...(options.context === undefined ? {} : { context: options.context }),\n ...(options.workspace === undefined ? {} : { workspace: options.workspace }),\n ...(provider === undefined ? {} : { provider }),\n ...(parentTaskId === undefined ? {} : { parentTaskId }),\n })\n})\n\nexport const waitForTask = Effect.fn(\"Cohall.waitForTask\")(function* (\n client: RelayClient,\n initial: Task,\n timeoutSeconds: number,\n) {\n const deadline = Date.now() + timeoutSeconds * 1_000\n let task = initial\n while (!isTerminalTask(task)) {\n if (Date.now() >= deadline) {\n return yield* new TaskWaitTimeoutError({\n message: `Task ${task.id} is still ${task.status} after ${timeoutSeconds} seconds`,\n taskId: task.id,\n status: task.status,\n })\n }\n yield* Effect.sleep(\"1 second\")\n task = yield* client.getTask(task.id)\n }\n return task\n})\n\nexport const followTaskTrace = Effect.fn(\"Cohall.followTaskTrace\")(function* (\n client: RelayClient,\n taskId: TaskId,\n onTrace: (trace: TaskTrace) => void,\n) {\n let revision: string | undefined\n const poll = client.traceTask(taskId).pipe(\n Effect.tap((trace) => {\n const latest = trace.events.at(-1)\n const nextRevision = `${trace.status}:${latest?.kind ?? \"none\"}:${latest?.at ?? \"none\"}`\n if (nextRevision === revision) {\n return Effect.succeed(undefined)\n }\n revision = nextRevision\n return Effect.sync(() => onTrace(trace))\n }),\n )\n return yield* poll.pipe(\n Effect.repeat({\n until: (trace) => terminalTaskStatuses.has(trace.status),\n schedule: Schedule.spaced(\"1 second\"),\n }),\n )\n})\n\nexport const threadContext = Effect.fn(\"Cohall.threadContext\")(function* (\n client: RelayClient,\n threadId: ThreadIdType,\n) {\n return yield* client.threadContext(threadId)\n})\n",
17
17
  "import type { Device } from \"@cohall/protocol\"\n\nexport const deviceVersions = (devices: ReadonlyArray<Device>, localVersion: string) => ({\n local_version: localVersion,\n current: devices.filter((device) => device.version === localVersion).length,\n different: devices.filter((device) => device.version !== localVersion).length,\n devices: devices.map((device) => ({\n id: device.id,\n name: device.name,\n status: device.status,\n version: device.version,\n current: device.version === localVersion,\n })),\n})\n\nexport const allDeviceHealth = (devices: ReadonlyArray<Device>, localVersion: string) => {\n const summaries = devices.map((device) => {\n const warnings = [\n ...(device.status === \"offline\" ? [\"Device is offline\"] : []),\n ...(device.providers.length === 0 ? [\"No provider executable is available\"] : []),\n ...(device.version === localVersion\n ? []\n : [`Running Cohall ${device.version}; local CLI is ${localVersion}`]),\n ]\n return {\n id: device.id,\n name: device.name,\n hostname: device.hostname,\n platform: device.platform,\n architecture: device.architecture,\n status: device.status,\n version: device.version,\n providers: device.providers,\n workspaces: device.workspaces.map((workspace) => workspace.path),\n last_seen_at: device.lastSeenAt,\n warnings,\n }\n })\n return {\n healthy: summaries.length > 0 && summaries.every((device) => device.warnings.length === 0),\n total: devices.length,\n online: devices.filter((device) => device.status === \"online\").length,\n busy: devices.filter((device) => device.status === \"busy\").length,\n offline: devices.filter((device) => device.status === \"offline\").length,\n warnings: summaries.length === 0 ? [\"No Cohall devices are registered\"] : [],\n devices: summaries,\n }\n}\n",
18
18
  "import { Bot, type Task } from \"@cohall/protocol\"\nimport { Effect, Schedule, Schema } from \"effect\"\nimport { open } from \"node:fs/promises\"\nimport { isIP } from \"node:net\"\nimport { claimBotDispatch, prepareBotReply, readBotReply } from \"./bot-replies.ts\"\n\nconst maxResponseBytes = 4 * 1024 * 1024\nconst maxDiscoveryBytes = 64 * 1024\nconst text = Schema.NonEmptyString\nconst Discovery = Schema.Struct({\n port: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65_535 })),\n host: Schema.optionalKey(text),\n scheme: Schema.optionalKey(Schema.Literals([\"http\", \"https\"])),\n token: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(16_384))),\n})\nconst Agent = Schema.Struct({\n id: Bot.fields.id,\n name: Bot.fields.name,\n description: Schema.optionalKey(Schema.String),\n isGroup: Schema.optionalKey(Schema.Boolean),\n})\nconst Roster = Schema.Array(Agent).check(Schema.isMaxLength(1024))\nconst Acceptance = Schema.Union([\n Schema.Struct({ outcome: Schema.Literals([\"not-found\", \"unknown-durability\"]) }),\n Schema.Struct({\n outcome: Schema.Literal(\"found\"),\n record: Schema.Struct({\n status: Schema.Literals([\"accepted\", \"pending\", \"rejected\"]),\n }),\n }),\n])\nconst SendResult = Schema.Struct({ accepted: Schema.Literal(true) })\nclass GatewayError extends Error {}\n\nconst decode = <S extends Schema.ConstraintDecoder<unknown>>(\n schema: S,\n value: unknown,\n label: string,\n): S[\"Type\"] => {\n const result = Schema.decodeUnknownResult(schema)(value)\n if (result._tag === \"Failure\") throw new GatewayError(`Grok Bot returned an invalid ${label}`)\n return result.success\n}\n\nconst readConnection = async (path: string) => {\n const value = await (async () => {\n const file = await open(path, \"r\")\n try {\n const buffer = Buffer.alloc(maxDiscoveryBytes + 1)\n const { bytesRead } = await file.read(buffer, 0, buffer.length, 0)\n if (bytesRead > maxDiscoveryBytes) throw new Error(\"Discovery file exceeds its size limit\")\n return decode(\n Discovery,\n JSON.parse(buffer.subarray(0, bytesRead).toString(\"utf8\")),\n \"discovery file\",\n )\n } finally {\n await file.close()\n }\n })().catch(() => {\n throw new Error(\n \"Cannot read Grok Bot gateway discovery; check its configured file and running gateway\",\n )\n })\n const host = value.host ?? \"127.0.0.1\"\n const normalized =\n host === \"0.0.0.0\" || host === \"localhost\"\n ? \"127.0.0.1\"\n : host === \"::\" || host === \"::1\" || host === \"[::1]\"\n ? \"[::1]\"\n : host\n if (!(normalized === \"[::1]\" || (isIP(normalized) === 4 && normalized.startsWith(\"127.\")))) {\n throw new Error(\"Grok Bot gateway must use a loopback address on this device\")\n }\n return { url: `${value.scheme ?? \"http\"}://${normalized}:${value.port}`, token: value.token }\n}\n\ntype Connection = Awaited<ReturnType<typeof readConnection>>\n\nconst rpc = async <S extends Schema.ConstraintDecoder<unknown>>(\n connection: Connection,\n method: string,\n args: object,\n schema: S,\n signal?: AbortSignal,\n): Promise<S[\"Type\"]> => {\n const controller = new AbortController()\n const deadline = setTimeout(() => controller.abort(), 20_000)\n const combined =\n signal === undefined ? controller.signal : AbortSignal.any([signal, controller.signal])\n try {\n const response = await fetch(`${connection.url}/api/${method}`, {\n method: \"POST\",\n redirect: \"error\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-sand-slim-avatars\": \"1\",\n ...(connection.token === undefined || connection.token.length === 0\n ? {}\n : { authorization: `Bearer ${connection.token}` }),\n },\n body: JSON.stringify(args),\n signal: combined,\n })\n if (!response.ok) {\n await response.body?.cancel()\n throw new GatewayError(`Grok Bot ${method} failed (HTTP ${response.status})`)\n }\n if (response.body === null) throw new GatewayError(\"Grok Bot returned an empty response\")\n const reader = response.body.getReader()\n const chunks: Array<Uint8Array> = []\n let size = 0\n try {\n for (;;) {\n const chunk = await reader.read()\n if (chunk.done) break\n size += chunk.value.byteLength\n if (size > maxResponseBytes) throw new GatewayError(\"Grok Bot response exceeded 4 MiB\")\n chunks.push(chunk.value)\n }\n } finally {\n await reader.cancel().catch(() => undefined)\n reader.releaseLock()\n }\n let json: unknown\n try {\n json = JSON.parse(Buffer.concat(chunks, size).toString(\"utf8\"))\n } catch {\n throw new GatewayError(`Grok Bot ${method} returned invalid JSON`)\n }\n return decode(schema, json, `${method} response`)\n } catch (cause) {\n // Fetch errors and decoder failures can contain bearer tokens or private response bodies.\n if (signal?.aborted)\n throw new Error(\"Stopped waiting for Grok Bot; its run may still be active\")\n if (cause instanceof GatewayError) throw cause\n throw new Error(`Grok Bot ${method} failed; check gateway availability and compatibility`)\n } finally {\n clearTimeout(deadline)\n }\n}\n\nexport const discoverGrokBots = async (path: string): Promise<ReadonlyArray<Bot>> => {\n const connection = await readConnection(path)\n const roster = await rpc(connection, \"listAgents\", {}, Roster)\n const bots = roster.filter((agent) => agent.isGroup !== true)\n if (bots.length > 256) throw new Error(\"Grok Bot discovery exceeds Cohall's limit of 256 bots\")\n if (new Set(bots.map((bot) => bot.id)).size !== bots.length) {\n throw new Error(\"Grok Bot returned duplicate bot identities\")\n }\n return bots.map(({ id, name, description }) => ({\n id,\n name,\n ...(description === undefined ? {} : { description: description.slice(0, 512) }),\n }))\n}\n\nconst poll = <A>(pass: (signal: AbortSignal) => Promise<A | undefined>, intervalMs = 1000) =>\n Effect.tryPromise({ try: pass, catch: (cause) => cause }).pipe(\n Effect.repeat({\n schedule: Schedule.spaced(intervalMs),\n until: (value) => value !== undefined,\n }),\n )\n\nconst timeoutMessage =\n \"Timed out waiting for the bot to reply through Cohall; the bot may still be running.\"\n\nconst requireTime = (deadline: number): void => {\n if (Date.now() >= deadline) throw new Error(timeoutMessage)\n}\n\nconst finishReply = (\n reply: NonNullable<Awaited<ReturnType<typeof readBotReply>>>,\n): { result: string } => {\n if (reply.error !== undefined) throw new Error(reply.error)\n if (reply.result === undefined) throw new Error(\"Grok Bot returned an invalid Cohall reply\")\n return { result: reply.result }\n}\n\nconst taskPrompt = (task: Task, command: string): string =>\n [\n task.prompt,\n task.context === undefined ? \"\" : `Context:\\n${task.context}`,\n `This request came through Cohall. Thread: ${task.threadId}. Task: ${task.id}.`,\n `You may use your own tools and delegate work to another Cohall device when the request calls for it. Discover devices with: ${command} devices`,\n `Delegation example: ${command} delegate --thread ${task.threadId} --parent ${task.id} --target @device --provider codex --prompt 'Concrete task' --context 'Relevant context'`,\n \"When finished, hand the final answer back to Cohall so it reaches the requesting device. Write it to a UTF-8 file on this computer, then run:\",\n `${command} reply ${task.id} --message-file /absolute/path/to/your-answer.txt`,\n `Alternatively pipe your answer into: ${command} reply ${task.id} --message -`,\n `If you cannot complete this task, report the reason with: ${command} reply ${task.id} --error 'Reason'`,\n \"The reply command must succeed. Then send the same answer in this chat. A normal chat message alone does not complete the Cohall task.\",\n ]\n .filter(Boolean)\n .join(\"\\n\\n\")\n\nexport const runGrokBot = async (\n path: string | undefined,\n task: Task,\n signal: AbortSignal,\n): Promise<{ result: string }> => {\n const existing = await readBotReply(task.id)\n if (existing !== undefined) return finishReply(existing)\n const { deadline, command, dispatched } = await prepareBotReply(task)\n requireTime(deadline)\n const agentId = task.botId\n if (agentId === undefined) throw new Error(\"Select a Grok Bot for this task\")\n const lookup = async (lookupSignal = signal) => {\n if (path === undefined)\n throw new Error(\"Configure this device's Grok Bot gateway discovery file first\")\n return rpc(\n await readConnection(path),\n \"promptAcceptanceStatus\",\n { accountSlot: \"host\", agentId, clientNonce: task.id },\n Acceptance,\n lookupSignal,\n )\n }\n const waitForReply = (reconcile = false) => {\n const receipt = poll(async () => {\n const receipt = await readBotReply(task.id)\n if (receipt !== undefined) return finishReply(receipt)\n requireTime(deadline)\n return undefined\n })\n if (!reconcile || path === undefined) return Effect.runPromise(receipt, { signal })\n // Acceptance ends reconciliation; only the local reply completes the task.\n const acceptance = poll(async (lookupSignal) => {\n const current = await lookup(lookupSignal).catch(() => undefined)\n if (current?.outcome !== \"found\") return undefined\n if (current.record.status === \"rejected\")\n throw new Error(\"Grok Bot rejected this task; check its conversation\")\n return current.record.status === \"accepted\" ? true : undefined\n }, 5000).pipe(Effect.andThen(Effect.never))\n return Effect.runPromise(Effect.raceFirst(receipt, acceptance), { signal })\n }\n if (dispatched) return waitForReply(true)\n if (path === undefined)\n throw new Error(\"Configure this device's Grok Bot gateway discovery file first\")\n const connection = await readConnection(path)\n let acceptance = await lookup()\n if (acceptance.outcome === \"unknown-durability\")\n throw new Error(\n \"Grok Bot cannot confirm whether this task was accepted; check its conversation before retrying\",\n )\n if (acceptance.outcome === \"not-found\") {\n const receipt = await readBotReply(task.id)\n if (receipt !== undefined) return finishReply(receipt)\n requireTime(deadline)\n const roster = await rpc(connection, \"listAgents\", {}, Roster, signal)\n if (!roster.some((row) => row.id === agentId && row.isGroup !== true)) {\n throw new Error(\"The selected Grok Bot no longer exists on this device\")\n }\n requireTime(deadline)\n acceptance = await lookup()\n if (acceptance.outcome === \"not-found\") {\n requireTime(deadline)\n if (!(await claimBotDispatch(task.id))) {\n return waitForReply(true)\n }\n try {\n await rpc(\n connection,\n \"sendPrompt\",\n {\n agentId,\n prompt: taskPrompt(task, command),\n clientNonce: task.id,\n directAddressedAcceptance: true,\n },\n SendResult,\n signal,\n )\n } catch {\n if (signal.aborted)\n throw new Error(\"Stopped waiting for Grok Bot; its run may still be active\")\n const receipt = await readBotReply(task.id)\n if (receipt !== undefined) return finishReply(receipt)\n return waitForReply(true)\n }\n return waitForReply()\n }\n }\n if (acceptance.outcome === \"unknown-durability\")\n throw new Error(\"Grok Bot cannot confirm task acceptance; the prompt was not resent\")\n if (acceptance.outcome === \"found\" && acceptance.record.status === \"rejected\")\n throw new Error(\"Grok Bot rejected this task; check its conversation\")\n return waitForReply(acceptance.outcome === \"found\" && acceptance.record.status === \"pending\")\n}\n",
19
19
  "import { BotId, TaskId, ThreadId, type Task } from \"@cohall/protocol\"\nimport { Schema } from \"effect\"\nimport { randomUUID } from \"node:crypto\"\nimport { chmod, link, mkdir, open, unlink } from \"node:fs/promises\"\nimport { dirname, join } from \"node:path\"\nimport { platform } from \"node:os\"\nimport { configurationPath } from \"./config.ts\"\n\nconst replyLifetimeMs = 6 * 60 * 60 * 1_000\nconst Pending = Schema.Struct({\n taskId: TaskId,\n botId: BotId,\n threadId: ThreadId,\n deadline: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n})\nconst Dispatch = Schema.Struct({ taskId: TaskId })\nconst Reply = Schema.Union([\n Schema.Struct({\n result: Schema.String.check(Schema.isMaxLength(131_072)),\n error: Schema.optionalKey(Schema.Never),\n }),\n Schema.Struct({\n error: Schema.NonEmptyString.check(Schema.isMaxLength(16_384)),\n result: Schema.optionalKey(Schema.Never),\n }),\n])\nexport type BotReply = typeof Reply.Type\nconst Receipt = Schema.Struct({\n taskId: TaskId,\n submittedAt: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n reply: Reply,\n})\n\nconst isMissing = (cause: unknown) =>\n cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\"\nconst alreadyExists = (cause: unknown) =>\n cause instanceof Error && \"code\" in cause && cause.code === \"EEXIST\"\n\nconst paths = (taskId: TaskId) => {\n const id = Schema.decodeUnknownSync(TaskId)(taskId)\n const directory = join(dirname(configurationPath()), \"bot-replies\")\n return {\n directory,\n pending: join(directory, `${id}.pending.json`),\n receipt: join(directory, `${id}.reply.json`),\n dispatch: join(directory, `${id}.dispatch.json`),\n }\n}\n\nconst readJson = async (path: string, limit: number): Promise<unknown | undefined> => {\n const file = await open(path, \"r\").catch((cause: unknown) => {\n if (isMissing(cause)) return undefined\n throw cause\n })\n if (file === undefined) return undefined\n try {\n const buffer = Buffer.alloc(limit + 1)\n let size = 0\n while (size < buffer.length) {\n const { bytesRead } = await file.read(buffer, size, buffer.length - size, size)\n if (bytesRead === 0) break\n size += bytesRead\n }\n if (size > limit) throw new Error(\"Bot reply record exceeds its size limit\")\n return JSON.parse(buffer.subarray(0, size).toString(\"utf8\"))\n } catch {\n throw new Error(\"Invalid local bot reply record\")\n } finally {\n await file.close()\n }\n}\n\nconst pendingReply = async (taskId: TaskId) => {\n const value = await readJson(paths(taskId).pending, 4096)\n if (value === undefined) return undefined\n const decoded = Schema.decodeUnknownResult(Pending)(value)\n if (decoded._tag === \"Failure\" || decoded.success.taskId !== taskId) {\n throw new Error(\"Invalid local bot reply manifest\")\n }\n return decoded.success\n}\n\nconst publish = async (path: string, value: object): Promise<boolean> => {\n const temporary = `${path}.${randomUUID()}.tmp`\n const file = await open(temporary, \"wx\", 0o600)\n try {\n try {\n await file.writeFile(`${JSON.stringify(value)}\\n`, \"utf8\")\n await file.sync()\n } finally {\n await file.close()\n }\n await link(temporary, path)\n if (platform() !== \"win32\") {\n const directory = await open(dirname(path), \"r\")\n try {\n await directory.sync()\n } finally {\n await directory.close()\n }\n }\n return true\n } catch (cause) {\n if (alreadyExists(cause)) return false\n throw cause\n } finally {\n await unlink(temporary)\n }\n}\n\nconst shellQuote = (value: string) => `'${value.replaceAll(\"'\", \"'\\\\''\")}'`\n\nexport const prepareBotReply = async (\n task: Task,\n): Promise<{ deadline: number; command: string; dispatched: boolean }> => {\n if (task.provider !== \"grok-bot\" || task.botId === undefined) {\n throw new Error(\"Only a named Grok Bot task can receive a bot reply\")\n }\n const files = paths(task.id)\n await mkdir(files.directory, { recursive: true, mode: 0o700 })\n await chmod(files.directory, 0o700)\n const record = Pending.make({\n taskId: task.id,\n botId: task.botId,\n threadId: task.threadId,\n deadline: Date.now() + replyLifetimeMs,\n })\n await publish(files.pending, record)\n const pending = await pendingReply(task.id)\n if (pending === undefined || pending.botId !== task.botId || pending.threadId !== task.threadId) {\n throw new Error(\"Bot reply manifest does not match this task\")\n }\n const dispatch = await readJson(files.dispatch, 4096)\n if (dispatch !== undefined) {\n const decoded = Schema.decodeUnknownResult(Dispatch)(dispatch)\n if (decoded._tag === \"Failure\" || decoded.success.taskId !== task.id) {\n throw new Error(\"Invalid local bot dispatch record\")\n }\n }\n return {\n deadline: pending.deadline,\n command: `COHALL_CONFIG=${shellQuote(configurationPath())} cohall`,\n dispatched: dispatch !== undefined,\n }\n}\n\nexport const claimBotDispatch = async (taskId: TaskId): Promise<boolean> => {\n const pending = await pendingReply(taskId)\n if (pending === undefined) throw new Error(\"No pending bot reply for this task\")\n if (Date.now() >= pending.deadline) throw new Error(\"Bot reply deadline has expired\")\n return publish(paths(taskId).dispatch, { taskId })\n}\n\nexport const readBotReply = async (taskId: TaskId): Promise<BotReply | undefined> => {\n const pending = await pendingReply(taskId)\n if (pending === undefined) return undefined\n const value = await readJson(paths(taskId).receipt, 1024 * 1024)\n if (value === undefined) return undefined\n const decoded = Schema.decodeUnknownResult(Receipt)(value)\n if (decoded._tag === \"Failure\" || decoded.success.taskId !== taskId) {\n throw new Error(\"Invalid local bot reply receipt\")\n }\n if (decoded.success.submittedAt >= pending.deadline) {\n throw new Error(\"Bot reply was submitted after its deadline\")\n }\n return decoded.success.reply\n}\n\nexport const writeBotReply = async (taskId: TaskId, reply: BotReply): Promise<void> => {\n const decoded = Schema.decodeUnknownResult(Reply)(reply)\n if (decoded._tag === \"Failure\") {\n throw new Error(\n \"Provide a result of at most 131072 characters or a nonempty error of at most 16384 characters\",\n )\n }\n const pending = await pendingReply(taskId)\n if (pending === undefined) throw new Error(\"No pending bot reply for this task\")\n const existing = await readBotReply(taskId)\n if (existing !== undefined) {\n if (JSON.stringify(existing) === JSON.stringify(decoded.success)) return\n throw new Error(\"A different reply has already been submitted for this task\")\n }\n const submittedAt = Date.now()\n if (submittedAt >= pending.deadline) throw new Error(\"Bot reply deadline has expired\")\n if (await publish(paths(taskId).receipt, { taskId, submittedAt, reply: decoded.success })) return\n const winner = await readBotReply(taskId)\n if (JSON.stringify(winner) !== JSON.stringify(decoded.success)) {\n throw new Error(\"A different reply has already been submitted for this task\")\n }\n}\n\nexport const cleanupBotReply = async (taskId: TaskId): Promise<void> => {\n const files = paths(taskId)\n for (const path of [files.pending, files.receipt, files.dispatch]) {\n await unlink(path).catch((cause: unknown) => {\n if (!isMissing(cause)) throw cause\n })\n }\n}\n",
20
20
  "import { exchangePairing } from \"@cohall/client\"\nimport { type Provider as ProviderName } from \"@cohall/protocol\"\nimport { Effect } from \"effect\"\nimport { hostname } from \"node:os\"\nimport { Writable } from \"node:stream\"\nimport { createInterface } from \"node:readline/promises\"\nimport {\n StoredConfiguration,\n credentialsForRelay,\n makeStoredConfiguration,\n normalizeRelayUrl,\n readStoredConfiguration,\n writeStoredConfiguration,\n} from \"./config.ts\"\n\nexport interface JoinOptions {\n readonly relayUrl: string\n readonly token: string\n readonly clientOnly: boolean\n readonly deviceName?: string\n readonly workspaces?: ReadonlyArray<string>\n readonly providers?: ReadonlyArray<ProviderName> | \"auto\"\n}\n\nexport interface JoinResult {\n readonly configuration: StoredConfiguration\n readonly roles: ReadonlyArray<\"client\" | \"device\">\n}\n\nexport const joinRelay = async (options: JoinOptions): Promise<JoinResult> => {\n const draft = await makeStoredConfiguration({\n relayUrl: options.relayUrl,\n ...(options.deviceName === undefined ? {} : { deviceName: options.deviceName }),\n ...(options.workspaces === undefined ? {} : { workspaces: options.workspaces }),\n ...(options.providers === undefined ? {} : { providers: options.providers }),\n })\n if (!options.clientOnly && draft.workspaces.length === 0) {\n throw new Error(\"At least one workspace is required when joining a device\")\n }\n\n const paired = await Effect.runPromise(exchangePairing(draft.relayUrl, { token: options.token }))\n const clientToken = paired.credentials.find(\n (credential) => credential.session.role === \"client\",\n )?.token\n const deviceCredential = paired.credentials.find(\n (credential) => credential.session.role === \"device\",\n )\n if (options.clientOnly && clientToken === undefined) {\n throw new Error(\"The pairing credential did not include client access\")\n }\n if (!options.clientOnly && deviceCredential === undefined) {\n throw new Error(\"The pairing credential did not include device access\")\n }\n\n const {\n clientToken: _retainedClientToken,\n deviceToken: _retainedDeviceToken,\n ...configurationDraft\n } = draft\n const configuration = StoredConfiguration.make({\n ...configurationDraft,\n deviceId: options.clientOnly\n ? configurationDraft.deviceId\n : (deviceCredential?.session.deviceId ?? configurationDraft.deviceId),\n ...(clientToken === undefined ? {} : { clientToken }),\n ...(options.clientOnly || deviceCredential === undefined\n ? {}\n : { deviceToken: deviceCredential.token }),\n })\n await writeStoredConfiguration(configuration)\n return {\n configuration,\n roles: options.clientOnly\n ? paired.credentials\n .map((credential) => credential.session.role)\n .filter((role) => role === \"client\")\n : paired.credentials.map((credential) => credential.session.role),\n }\n}\n\nexport interface Prompter {\n readonly answer: (label: string, fallback: string) => Promise<string>\n readonly secret: (label: string) => Promise<string>\n readonly close: () => void\n}\n\nexport const terminalPrompter = (): Prompter => {\n let muted = false\n const output = new Writable({\n write(chunk: Buffer | string, _encoding, callback) {\n if (!muted) {\n process.stderr.write(chunk)\n }\n callback()\n },\n })\n const terminal = createInterface({ input: process.stdin, output, terminal: true })\n return {\n answer: async (label, fallback) => {\n const value = (await terminal.question(`${label} [${fallback}]: `)).trim()\n return value || fallback\n },\n secret: async (label) => {\n const pending = terminal.question(`${label}: `)\n muted = true\n try {\n return (await pending).trim()\n } finally {\n muted = false\n process.stderr.write(\"\\n\")\n }\n },\n close: () => terminal.close(),\n }\n}\n\nexport interface GuidedSetupOptions {\n readonly relayUrl?: string\n readonly token?: string\n readonly clientOnly: boolean\n readonly deviceName?: string\n readonly workspaces: ReadonlyArray<string>\n readonly providers?: string\n readonly cwd: string\n}\n\nexport interface GuidedSetupInput {\n readonly relayUrl: string\n readonly token?: string\n readonly deviceName?: string\n readonly workspaces: ReadonlyArray<string>\n readonly providers: string\n readonly reusedConfiguration: boolean\n}\n\nexport const guidedSetupInput = async (\n options: GuidedSetupOptions,\n prompter: Prompter,\n): Promise<GuidedSetupInput> => {\n const existing = await readStoredConfiguration()\n const relayUrl = normalizeRelayUrl(\n options.relayUrl ??\n (await prompter.answer(\"Relay URL\", existing?.relayUrl ?? \"http://127.0.0.1:8787\")),\n )\n const credentials = credentialsForRelay(existing, relayUrl)\n const hasRequiredCredentials =\n credentials.clientToken !== undefined &&\n (options.clientOnly || credentials.deviceToken !== undefined)\n const workspaces = options.clientOnly\n ? (existing?.workspaces ?? [])\n : options.workspaces.length > 0\n ? options.workspaces\n : [await prompter.answer(\"Workspace root\", existing?.workspaces[0] ?? options.cwd)]\n const deviceName = options.clientOnly\n ? undefined\n : (options.deviceName ??\n (await prompter.answer(\"Device name\", existing?.deviceName ?? hostname())))\n const providers =\n options.providers ??\n (options.clientOnly\n ? \"auto\"\n : await prompter.answer(\"Providers\", existing?.providers?.join(\",\") ?? \"auto\"))\n const token =\n options.token ?? (hasRequiredCredentials ? undefined : await prompter.secret(\"Pairing token\"))\n if (!hasRequiredCredentials && (token === undefined || token.length === 0)) {\n throw new Error(\"A pairing token is required\")\n }\n if (token !== undefined && new TextEncoder().encode(token).byteLength > 256) {\n throw new Error(\"Pairing token exceeds 256 bytes\")\n }\n return {\n relayUrl,\n ...(token === undefined ? {} : { token }),\n ...(deviceName === undefined ? {} : { deviceName }),\n workspaces,\n providers,\n reusedConfiguration: hasRequiredCredentials && token === undefined,\n }\n}\n",
21
21
  "import { RelayClient } from \"@cohall/client\"\nimport { SocketEvent, Timestamp, version } from \"@cohall/protocol\"\nimport { Effect, Schema } from \"effect\"\nimport { createHash } from \"node:crypto\"\nimport { createReadStream } from \"node:fs\"\nimport {\n access,\n chmod,\n copyFile,\n lstat,\n mkdir,\n mkdtemp,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { basename, dirname, join, resolve } from \"node:path\"\nimport { backup as sqliteBackup, DatabaseSync } from \"node:sqlite\"\nimport { WebSocket } from \"ws\"\nimport {\n StoredConfiguration,\n normalizeRelayUrl,\n readStoredConfiguration,\n relayDataDirectory,\n writeStoredConfiguration,\n} from \"./config.ts\"\nimport { restartDeviceService, type DeviceServiceRestart } from \"./service.ts\"\n\nconst sha256 = Schema.String.check(\n Schema.isPattern(/^[a-f0-9]{64}$/, { expected: \"a lowercase SHA-256 digest\" }),\n)\n\nconst RelayBackupManifest = Schema.Struct({\n formatVersion: Schema.Literal(1),\n cohallVersion: Schema.NonEmptyString,\n createdAt: Timestamp,\n databaseSha256: sha256,\n ownerTokenSha256: sha256,\n})\ninterface RelayBackupManifest extends Schema.Schema.Type<typeof RelayBackupManifest> {}\n\nconst exists = (path: string): Promise<boolean> =>\n access(path)\n .then(() => true)\n .catch(() => false)\n\nconst digest = async (path: string): Promise<string> => {\n const hash = createHash(\"sha256\")\n for await (const chunk of createReadStream(path)) {\n hash.update(chunk)\n }\n return hash.digest(\"hex\")\n}\n\nconst verifyBackupMember = async (path: string, maximumBytes?: number): Promise<void> => {\n const metadata = await lstat(path)\n if (!metadata.isFile()) {\n throw new Error(`Relay backup member must be a regular file: ${path}`)\n }\n if (maximumBytes !== undefined && metadata.size > maximumBytes) {\n throw new Error(`Relay backup member exceeds ${maximumBytes} bytes: ${path}`)\n }\n}\n\nconst readManifest = async (path: string): Promise<RelayBackupManifest> => {\n await verifyBackupMember(path, 16_384)\n return Schema.decodeUnknownSync(RelayBackupManifest)(JSON.parse(await readFile(path, \"utf8\")))\n}\n\nconst verifyBackupDestinationParent = async (path: string): Promise<void> => {\n if (process.platform === \"win32\") {\n return\n }\n for (let current = await realpath(path); ; current = dirname(current)) {\n const metadata = await stat(current)\n const writableByOthers = (metadata.mode & 0o022) !== 0\n const sticky = (metadata.mode & 0o1000) !== 0\n if (writableByOthers && !sticky) {\n throw new Error(\n `Backup destination ancestors must not be group- or world-writable unless they use the sticky bit: ${current}`,\n )\n }\n const parent = dirname(current)\n if (parent === current) {\n return\n }\n }\n}\n\nconst ownerToken = async (dataDirectory: string): Promise<string> => {\n const path = join(dataDirectory, \"owner-token\")\n const configured = process.env.COHALL_TOKEN\n if (configured !== undefined) {\n return configured\n }\n if (!(await exists(path))) {\n throw new Error(`Relay owner token was not found at ${path}`)\n }\n if ((await stat(path)).size > 512) {\n throw new Error(\"Relay owner token file exceeds 512 bytes\")\n }\n return (await readFile(path, \"utf8\")).trim()\n}\n\nconst verifyDatabase = (path: string): void => {\n const database = new DatabaseSync(path, { readOnly: true })\n try {\n const result = database.prepare(\"PRAGMA quick_check\").get()\n if (result === undefined || Object.values(result)[0] !== \"ok\") {\n throw new Error(`SQLite integrity check failed for ${path}`)\n }\n } finally {\n database.close()\n }\n}\n\nexport interface RelayBackupResult {\n readonly backup_directory: string\n readonly database: string\n readonly created_at: Timestamp\n readonly warning: string\n}\n\nexport const backupRelay = async (destinationInput: string): Promise<RelayBackupResult> => {\n const sourceDirectory = relayDataDirectory()\n const sourceDatabase = join(sourceDirectory, \"cohall.db\")\n if (!(await exists(sourceDatabase))) {\n throw new Error(`Relay database was not found at ${sourceDatabase}`)\n }\n const destination = resolve(destinationInput)\n if (await exists(destination)) {\n throw new Error(`Backup destination already exists: ${destination}`)\n }\n await verifyBackupDestinationParent(dirname(destination))\n await mkdir(destination, { mode: 0o700 })\n try {\n const databasePath = join(destination, \"cohall.db\")\n const ownerTokenPath = join(destination, \"owner-token\")\n const database = new DatabaseSync(sourceDatabase, { readOnly: true })\n try {\n await sqliteBackup(database, databasePath)\n } finally {\n database.close()\n }\n verifyDatabase(databasePath)\n const token = await ownerToken(sourceDirectory)\n if (token.length < 32 || new TextEncoder().encode(token).byteLength > 512) {\n throw new Error(\"The relay owner token must contain between 32 and 512 bytes\")\n }\n await writeFile(ownerTokenPath, `${token}\\n`, { mode: 0o600 })\n await Promise.all([chmod(databasePath, 0o600), chmod(ownerTokenPath, 0o600)])\n const createdAt = Timestamp.make(new Date().toISOString())\n const manifest = RelayBackupManifest.make({\n formatVersion: 1,\n cohallVersion: version,\n createdAt,\n databaseSha256: await digest(databasePath),\n ownerTokenSha256: await digest(ownerTokenPath),\n })\n await writeFile(join(destination, \"manifest.json\"), `${JSON.stringify(manifest, null, 2)}\\n`, {\n mode: 0o600,\n })\n return {\n backup_directory: destination,\n database: databasePath,\n created_at: createdAt,\n warning:\n \"This backup contains relay credentials and task history. Transfer and store it privately.\",\n }\n } catch (cause) {\n await rm(destination, { recursive: true, force: true })\n throw cause\n }\n}\n\nexport interface RelayRestoreResult {\n readonly restored: true\n readonly data_directory: string\n readonly backup_version: string\n readonly next: string\n}\n\nexport const restoreRelay = async (sourceInput: string): Promise<RelayRestoreResult> => {\n const source = resolve(sourceInput)\n const sourceDatabase = join(source, \"cohall.db\")\n const sourceOwnerToken = join(source, \"owner-token\")\n const sourceManifest = join(source, \"manifest.json\")\n for (const path of [sourceDatabase, sourceOwnerToken, sourceManifest]) {\n if (!(await exists(path))) {\n throw new Error(`Relay backup is missing ${basename(path)}`)\n }\n }\n await Promise.all([\n verifyBackupMember(sourceDatabase),\n verifyBackupMember(sourceOwnerToken, 1_024),\n verifyBackupMember(sourceManifest, 16_384),\n ])\n\n const target = relayDataDirectory()\n if (await exists(target)) {\n throw new Error(\n `Relay data directory already exists: ${target}. Restore into a new COHALL_DATA_DIR.`,\n )\n }\n const parent = dirname(target)\n await mkdir(parent, { recursive: true, mode: 0o700 })\n const staging = await mkdtemp(join(parent, `.${basename(target)}.restore-`))\n let backupVersion = \"\"\n try {\n await chmod(staging, 0o700)\n const databasePath = join(staging, \"cohall.db\")\n const ownerTokenPath = join(staging, \"owner-token\")\n const manifestPath = join(staging, \"migration-manifest.json\")\n await Promise.all([\n copyFile(sourceDatabase, databasePath),\n copyFile(sourceOwnerToken, ownerTokenPath),\n copyFile(sourceManifest, manifestPath),\n ])\n await Promise.all([\n chmod(databasePath, 0o600),\n chmod(ownerTokenPath, 0o600),\n chmod(manifestPath, 0o600),\n ])\n const manifest = await readManifest(manifestPath)\n if (\n (await digest(databasePath)) !== manifest.databaseSha256 ||\n (await digest(ownerTokenPath)) !== manifest.ownerTokenSha256\n ) {\n throw new Error(\"Relay backup checksum verification failed\")\n }\n verifyDatabase(databasePath)\n const token = (await readFile(ownerTokenPath, \"utf8\")).trim()\n if (token.length < 32 || new TextEncoder().encode(token).byteLength > 512) {\n throw new Error(\"Relay backup contains an invalid owner token\")\n }\n backupVersion = manifest.cohallVersion\n await rename(staging, target)\n } catch (cause) {\n await rm(staging, { recursive: true, force: true })\n throw cause\n }\n return {\n restored: true,\n data_directory: target,\n backup_version: backupVersion,\n next: \"Start the relay at its new address, then run `cohall relay use <new-url>` on each client and device.\",\n }\n}\n\nconst websocketUrl = (relayUrl: string): string => {\n const url = new URL(relayUrl)\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n url.pathname = \"/ws/device\"\n return url.toString()\n}\n\nconst isLoopback = (url: URL): boolean =>\n url.hostname === \"localhost\" ||\n url.hostname === \"[::1]\" ||\n /^127(?:\\.\\d{1,3}){3}$/.test(url.hostname)\n\nconst verifyClientCredential = async (relayUrl: string, token: string): Promise<void> => {\n await Effect.runPromise(RelayClient.make({ baseUrl: relayUrl, token }).devices())\n}\n\nconst verifyDeviceCredential = (relayUrl: string, token: string): Promise<void> =>\n new Promise((resolvePromise, reject) => {\n const socket = new WebSocket(websocketUrl(relayUrl), {\n handshakeTimeout: 10_000,\n maxPayload: 1024 * 1024,\n perMessageDeflate: false,\n })\n let settled = false\n const finish = (error?: Error): void => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timeout)\n socket.terminate()\n if (error === undefined) {\n resolvePromise()\n return\n }\n reject(error)\n }\n const timeout = setTimeout(\n () => finish(new Error(\"Timed out while verifying the device credential\")),\n 10_000,\n )\n socket.once(\"open\", () => {\n socket.send(JSON.stringify(SocketEvent.make({ _tag: \"Authenticate\", token })))\n })\n socket.on(\"message\", (data) => {\n try {\n const event = Schema.decodeUnknownSync(SocketEvent)(JSON.parse(data.toString()) as unknown)\n if (event._tag === \"Connected\") {\n finish()\n } else if (event._tag === \"Error\") {\n finish(new Error(event.message))\n }\n } catch (cause) {\n finish(new Error(`New relay returned an invalid device response: ${String(cause)}`))\n }\n })\n socket.once(\"error\", (cause) => finish(cause))\n socket.once(\"close\", () => finish(new Error(\"New relay rejected the stored device credential\")))\n })\n\nexport interface RelaySwitchResult {\n readonly updated: boolean\n readonly relay_url: string\n readonly verified_roles: ReadonlyArray<\"client\" | \"device\">\n readonly service: DeviceServiceRestart\n readonly warning?: string\n}\n\nexport const switchRelay = async (options: {\n readonly relayUrl: string\n readonly restart: boolean\n readonly allowHttp?: boolean\n readonly verifyClient?: (relayUrl: string, token: string) => Promise<void>\n readonly verifyDevice?: (relayUrl: string, token: string) => Promise<void>\n readonly restartService?: () => Promise<DeviceServiceRestart>\n}): Promise<RelaySwitchResult> => {\n if (process.env.COHALL_RELAY_URL !== undefined) {\n throw new Error(\"Unset COHALL_RELAY_URL before changing the stored relay URL\")\n }\n const configuration = await readStoredConfiguration()\n if (configuration === undefined) {\n throw new Error(\"This user has no stored Cohall configuration\")\n }\n const relayUrl = normalizeRelayUrl(options.relayUrl)\n const parsedRelayUrl = new URL(relayUrl)\n if (\n parsedRelayUrl.protocol === \"http:\" &&\n !isLoopback(parsedRelayUrl) &&\n options.allowHttp !== true\n ) {\n throw new Error(\n \"Refusing to send stored credentials over remote HTTP. Use HTTPS, or --allow-http only on an independently encrypted private network.\",\n )\n }\n const clientTokens = [configuration.clientToken, process.env.COHALL_CLIENT_TOKEN].filter(\n (token): token is string => token !== undefined,\n )\n const deviceTokens = [configuration.deviceToken, process.env.COHALL_DEVICE_TOKEN].filter(\n (token): token is string => token !== undefined,\n )\n if (clientTokens.length === 0 && deviceTokens.length === 0) {\n throw new Error(\"This configuration has no client or device credentials to verify\")\n }\n const roles: Array<\"client\" | \"device\"> = []\n if (clientTokens.length > 0) {\n for (const token of new Set(clientTokens)) {\n await (options.verifyClient ?? verifyClientCredential)(relayUrl, token)\n }\n roles.push(\"client\")\n }\n if (deviceTokens.length > 0) {\n for (const token of new Set(deviceTokens)) {\n await (options.verifyDevice ?? verifyDeviceCredential)(relayUrl, token)\n }\n roles.push(\"device\")\n }\n const updated = configuration.relayUrl !== relayUrl\n if (updated) {\n await writeStoredConfiguration(StoredConfiguration.make({ ...configuration, relayUrl }))\n }\n let service: DeviceServiceRestart = { running: false, restarted: false }\n let warning: string | undefined\n if (updated && options.restart && deviceTokens.length > 0) {\n service = await (options.restartService ?? restartDeviceService)().catch((cause: unknown) => {\n warning = `Relay URL changed, but the device service could not restart: ${cause instanceof Error ? cause.message : String(cause)}`\n return { running: true, restarted: false }\n })\n }\n return {\n updated,\n relay_url: relayUrl,\n verified_roles: roles,\n service,\n ...(warning === undefined ? {} : { warning }),\n }\n}\n",
22
- "import { execFile, type ExecFileException } from \"node:child_process\"\nimport { chmod, mkdir, realpath, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport {\n packageInstallation,\n trustedExecutable,\n type CommandResult,\n type CommandRunner,\n} from \"./upgrade.ts\"\n\ninterface ServiceFile {\n readonly path: string\n readonly content: string\n readonly mode: number\n}\n\nexport interface DeviceServicePlan {\n readonly file: ServiceFile\n readonly commands: ReadonlyArray<{\n readonly command: string\n readonly arguments: ReadonlyArray<string>\n }>\n readonly note?: string\n}\n\nconst xml = (value: string): string =>\n value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&apos;\")\n\nconst systemdArgument = (value: string): string =>\n `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`\n\nexport const deviceServicePlan = (options: {\n readonly platform: NodeJS.Platform\n readonly entrypoint: string\n readonly home: string\n readonly uid?: number\n}): DeviceServicePlan => {\n if (options.platform === \"linux\") {\n const path = join(options.home, \".config\", \"systemd\", \"user\", \"cohall-device.service\")\n return {\n file: {\n path,\n mode: 0o600,\n content: `[Unit]\\nDescription=Cohall device agent\\nAfter=network-online.target\\nWants=network-online.target\\n\\n[Service]\\nType=simple\\nEnvironment=PATH=%h/.local/bin:%h/.npm-global/bin:%h/.bun/bin:%h/.local/share/pnpm:/usr/local/bin:/usr/bin:/bin\\nExecStart=${systemdArgument(options.entrypoint)} device\\nRestart=always\\nRestartSec=3\\nUMask=0077\\nNoNewPrivileges=true\\nPrivateTmp=true\\n\\n[Install]\\nWantedBy=default.target\\n`,\n },\n commands: [\n { command: \"systemctl\", arguments: [\"--user\", \"daemon-reload\"] },\n { command: \"systemctl\", arguments: [\"--user\", \"enable\", \"--now\", \"cohall-device.service\"] },\n ],\n note: \"The device starts after login. Run loginctl enable-linger $USER if it must run before login.\",\n }\n }\n if (options.platform === \"darwin\") {\n const label = \"com.cohall.device\"\n const path = join(options.home, \"Library\", \"LaunchAgents\", `${label}.plist`)\n const domain = `gui/${options.uid ?? 0}`\n return {\n file: {\n path,\n mode: 0o600,\n content: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\\n<plist version=\"1.0\">\\n<dict>\\n <key>Label</key>\\n <string>${label}</string>\\n <key>ProgramArguments</key>\\n <array>\\n <string>${xml(options.entrypoint)}</string>\\n <string>device</string>\\n </array>\\n <key>EnvironmentVariables</key>\\n <dict>\\n <key>PATH</key>\\n <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>\\n </dict>\\n <key>RunAtLoad</key>\\n <true/>\\n <key>KeepAlive</key>\\n <dict>\\n <key>NetworkState</key>\\n <true/>\\n <key>SuccessfulExit</key>\\n <false/>\\n </dict>\\n <key>ThrottleInterval</key>\\n <integer>3</integer>\\n <key>ProcessType</key>\\n <string>Background</string>\\n</dict>\\n</plist>\\n`,\n },\n commands: [\n { command: \"launchctl\", arguments: [\"bootout\", domain, path] },\n { command: \"launchctl\", arguments: [\"bootstrap\", domain, path] },\n { command: \"launchctl\", arguments: [\"kickstart\", \"-k\", `${domain}/${label}`] },\n ],\n }\n }\n throw new Error(\"Automatic device service installation supports Linux and macOS\")\n}\n\nconst defaultRunner: CommandRunner = {\n run: async (command, arguments_, timeoutMs = 60_000) => {\n const executable = await trustedExecutable(command)\n return new Promise((resolve) => {\n execFile(\n executable,\n [...arguments_],\n { encoding: \"utf8\", maxBuffer: 1024 * 1024, timeout: timeoutMs, windowsHide: true },\n (error: ExecFileException | null, stdout, stderr) =>\n resolve({\n exitCode: typeof error?.code === \"number\" ? error.code : error === null ? 0 : 1,\n stdout,\n stderr,\n ...(error === null ? {} : { error: error.message }),\n }),\n )\n })\n },\n}\n\nconst checked = async (\n runner: CommandRunner,\n command: string,\n arguments_: ReadonlyArray<string>,\n allowFailure = false,\n): Promise<CommandResult> => {\n const result = await runner.run(command, arguments_, 60_000)\n if (result.exitCode === 0 || allowFailure) {\n return result\n }\n throw new Error(\n `${command} failed: ${result.stderr.trim() || result.stdout.trim() || result.error || `status ${result.exitCode}`}`,\n )\n}\n\nexport const installDeviceService = async (\n options: {\n readonly entrypoint?: string\n readonly platform?: NodeJS.Platform\n readonly home?: string\n readonly uid?: number\n readonly runner?: CommandRunner\n } = {},\n): Promise<{ readonly installed: string; readonly note?: string }> => {\n const entrypoint = await realpath(options.entrypoint ?? process.argv[1] ?? \"\")\n packageInstallation(entrypoint)\n const platform = options.platform ?? process.platform\n const runner = options.runner ?? defaultRunner\n if (platform === \"win32\") {\n const script = join(dirname(dirname(entrypoint)), \"deploy\", \"windows\", \"install-device.ps1\")\n await checked(runner, \"powershell.exe\", [\n \"-NoProfile\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-File\",\n script,\n ])\n return { installed: \"scheduled-task:Cohall Device\" }\n }\n const uid = options.uid ?? process.getuid?.()\n const plan = deviceServicePlan({\n platform,\n entrypoint,\n home: options.home ?? homedir(),\n ...(uid === undefined ? {} : { uid }),\n })\n await mkdir(dirname(plan.file.path), { recursive: true, mode: 0o700 })\n await writeFile(plan.file.path, plan.file.content, { mode: plan.file.mode })\n await chmod(plan.file.path, plan.file.mode)\n for (const [index, command] of plan.commands.entries()) {\n await checked(runner, command.command, command.arguments, platform === \"darwin\" && index === 0)\n }\n return {\n installed: plan.file.path,\n ...(plan.note === undefined ? {} : { note: plan.note }),\n }\n}\n\nexport interface DeviceServiceRestart {\n readonly running: boolean\n readonly restarted: boolean\n readonly service?: string\n}\n\nexport const restartDeviceService = async (\n options: {\n readonly platform?: NodeJS.Platform\n readonly uid?: number\n readonly runner?: CommandRunner\n } = {},\n): Promise<DeviceServiceRestart> => {\n const platform = options.platform ?? process.platform\n const runner = options.runner ?? defaultRunner\n if (platform === \"linux\") {\n const service = \"cohall-device.service\"\n const check = await runner.run(\"systemctl\", [\"--user\", \"is-active\", \"--quiet\", service], 10_000)\n if (check.exitCode !== 0) {\n return { running: false, restarted: false }\n }\n await checked(runner, \"systemctl\", [\"--user\", \"restart\", service])\n return { running: true, restarted: true, service }\n }\n if (platform === \"darwin\") {\n const service = \"com.cohall.device\"\n const target = `gui/${options.uid ?? process.getuid?.() ?? 0}/${service}`\n const check = await runner.run(\"launchctl\", [\"print\", target], 10_000)\n if (check.exitCode !== 0) {\n return { running: false, restarted: false }\n }\n await checked(runner, \"launchctl\", [\"kickstart\", \"-k\", target])\n return { running: true, restarted: true, service }\n }\n if (platform === \"win32\") {\n const service = \"Cohall Device\"\n const check = await runner.run(\"schtasks.exe\", [\"/Query\", \"/TN\", service], 10_000)\n if (check.exitCode !== 0) {\n return { running: false, restarted: false }\n }\n await checked(runner, \"schtasks.exe\", [\"/End\", \"/TN\", service], true)\n await checked(runner, \"schtasks.exe\", [\"/Run\", \"/TN\", service])\n return { running: true, restarted: true, service }\n }\n return { running: false, restarted: false }\n}\n",
23
- "import { Schema } from \"effect\"\nimport { execFile, type ExecFileException } from \"node:child_process\"\nimport { constants } from \"node:fs\"\nimport {\n access,\n chmod,\n mkdir,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { delimiter, dirname, extname, isAbsolute, join, relative } from \"node:path\"\nimport { platform as operatingSystem } from \"node:os\"\nimport { configurationPath } from \"./config.ts\"\n\nconst packageName = \"@akshar5/cohall\"\nconst semanticVersion = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\n\nexport const PackageManager = Schema.Literals([\"npm\", \"bun\", \"pnpm\"])\nexport type PackageManager = typeof PackageManager.Type\nexport type ServiceManager = \"launchd\" | \"scheduled-task\" | \"systemd-system\" | \"systemd-user\"\n\nexport interface CommandResult {\n readonly exitCode: number\n readonly stdout: string\n readonly stderr: string\n readonly error?: string\n}\n\nexport interface CommandRunner {\n readonly run: (\n command: string,\n arguments_: ReadonlyArray<string>,\n timeoutMs?: number,\n ) => Promise<CommandResult>\n}\n\nexport interface PackageInstallation {\n readonly manager: PackageManager\n readonly prefix?: string\n readonly entrypoint: string\n}\n\nexport interface ManagedService {\n readonly id: string\n readonly label: string\n readonly manager: ServiceManager\n readonly device: boolean\n readonly check: CommandInvocation\n readonly activeOutput?: RegExp\n readonly entrypoint?: {\n readonly inspect: CommandInvocation\n readonly parse: (output: string) => string | undefined\n }\n readonly restart: ReadonlyArray<CommandInvocation>\n}\n\nexport interface CommandInvocation {\n readonly command: string\n readonly arguments: ReadonlyArray<string>\n readonly allowFailure?: boolean\n}\n\nconst RestartReceipt = Schema.Struct({\n version: Schema.String,\n fromVersion: Schema.String,\n packageManager: PackageManager,\n pendingServices: Schema.Array(Schema.String),\n restartedServices: Schema.Array(Schema.String),\n restartingService: Schema.optionalKey(Schema.String),\n})\ninterface RestartReceipt extends Schema.Schema.Type<typeof RestartReceipt> {}\n\nexport interface UpgradeOptions {\n readonly currentVersion: string\n readonly target?: string\n readonly restart: boolean\n readonly dryRun: boolean\n readonly entrypoint?: string\n readonly platform?: NodeJS.Platform\n readonly uid?: number\n readonly statePath?: string\n readonly delegated?: boolean\n readonly runner?: CommandRunner\n readonly resolveExecutable?: (command: string) => Promise<string>\n}\n\nexport interface UpgradeResult {\n readonly upgraded: boolean\n readonly from_version: string\n readonly installed_version: string\n readonly requested_version: string\n readonly package_manager: PackageManager\n readonly services_restarted: ReadonlyArray<string>\n readonly services_pending_restart: ReadonlyArray<string>\n readonly resumed_after_restart: boolean\n readonly dry_run: boolean\n}\n\nconst normalizePath = (path: string): string => path.replaceAll(\"\\\\\", \"/\")\n\nexport const normalizeUpgradeTarget = (target: string | undefined): string => {\n if (target === undefined || target === \"latest\") {\n return \"latest\"\n }\n const normalized = target.startsWith(\"v\") ? target.slice(1) : target\n if (!semanticVersion.test(normalized)) {\n throw new Error(\"--to must be latest or an exact semantic version\")\n }\n return normalized\n}\n\nexport const deviceVersionWarning = (\n cliVersion: string,\n deviceVersion: string | undefined,\n): string | undefined =>\n deviceVersion === undefined || deviceVersion === cliVersion\n ? undefined\n : `Running device daemon uses Cohall ${deviceVersion}, while this CLI is ${cliVersion}. Run upgrade through the executable configured by the device service.`\n\nexport const packageInstallation = (\n canonicalEntrypoint: string,\n entrypoint = canonicalEntrypoint,\n): PackageInstallation => {\n const path = normalizePath(canonicalEntrypoint)\n const marker = `/node_modules/${packageName}/`\n const packageIndex = path.lastIndexOf(marker)\n if (packageIndex === -1) {\n throw new Error(\n \"cohall upgrade requires a global npm, Bun, or pnpm installation; package-runner and source-checkout executions cannot upgrade themselves\",\n )\n }\n if (\n path.includes(\"/.npm/_npx/\") ||\n path.includes(\"/.bunx/\") ||\n path.includes(\"/pnpm/dlx/\") ||\n path.includes(\"/dlx/\")\n ) {\n throw new Error(\n \"This Cohall process is running from a temporary package-runner cache; install it globally before using cohall upgrade\",\n )\n }\n if (path.includes(\"/.bun/install/global/node_modules/\")) {\n return { manager: \"bun\", entrypoint }\n }\n if (path.includes(\"/pnpm/global/\")) {\n return { manager: \"pnpm\", entrypoint }\n }\n\n const nodeModulesParent = path.slice(0, packageIndex)\n const prefix = nodeModulesParent.endsWith(\"/lib\")\n ? nodeModulesParent.slice(0, -\"/lib\".length)\n : nodeModulesParent\n return { manager: \"npm\", prefix, entrypoint }\n}\n\nexport const packageInstallCommand = (\n installation: PackageInstallation,\n target: string,\n): CommandInvocation => {\n const specification = `${packageName}@${target}`\n switch (installation.manager) {\n case \"bun\":\n return { command: \"bun\", arguments: [\"add\", \"--global\", specification] }\n case \"pnpm\":\n return { command: \"pnpm\", arguments: [\"add\", \"--global\", specification] }\n case \"npm\":\n return {\n command: \"npm\",\n arguments: [\n \"install\",\n \"--global\",\n ...(installation.prefix === undefined ? [] : [\"--prefix\", installation.prefix]),\n specification,\n ],\n }\n }\n}\n\nconst executableNames = (command: string): ReadonlyArray<string> => {\n if (operatingSystem() !== \"win32\" || extname(command).length > 0) {\n return [command]\n }\n return (process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .filter(Boolean)\n .map((extension) => `${command}${extension.toLowerCase()}`)\n}\n\nconst containsPath = (root: string, path: string): boolean => {\n const child = relative(root, path)\n return child === \"\" || (!child.startsWith(\"..\") && !isAbsolute(child))\n}\n\nconst linuxSystemExecutableRoots = [\n \"/bin\",\n \"/sbin\",\n \"/usr/bin\",\n \"/usr/sbin\",\n \"/usr/lib/node_modules\",\n \"/usr/share/nodejs\",\n \"/nix/store\",\n]\nconst macosHomebrewRoots = [\"/opt/homebrew\", \"/usr/local\"]\nconst macosAdminGroup = 80\n\nexport const isTrustedSystemPath = (platform: NodeJS.Platform, path: string): boolean =>\n platform === \"linux\" &&\n (path === \"/home\" ||\n linuxSystemExecutableRoots.some((root) => containsPath(root, path) || containsPath(path, root)))\n\nexport const isTrustedGroupWritablePath = (options: {\n readonly platform: NodeJS.Platform\n readonly canonical: string\n readonly writableRoot: string | undefined\n readonly path: string\n readonly uid: number | undefined\n readonly ownerUid: number\n readonly ownerGid: number\n}): boolean => {\n const writableRoot = options.writableRoot\n return (\n options.platform === \"darwin\" &&\n writableRoot !== undefined &&\n options.uid !== undefined &&\n options.ownerUid === options.uid &&\n options.ownerGid === macosAdminGroup &&\n macosHomebrewRoots.some((root) => containsPath(root, writableRoot)) &&\n containsPath(writableRoot, options.canonical) &&\n containsPath(writableRoot, options.path)\n )\n}\n\nconst validateExecutable = async (\n candidate: string,\n installationRoot: string | undefined,\n): Promise<string> => {\n const canonical = await realpath(candidate)\n if (operatingSystem() === \"win32\") {\n return canonical\n }\n const uid = process.getuid?.()\n const writableRoot = installationRoot === undefined ? undefined : await realpath(installationRoot)\n for (let path = canonical; ; path = dirname(path)) {\n const metadata = await stat(path)\n // Homebrew's shared prefix is admin-group writable. Local administrators are already inside\n // the OS trust boundary; arbitrary shared Unix groups remain rejected.\n const trustedGroupWritablePath = isTrustedGroupWritablePath({\n platform: operatingSystem(),\n canonical,\n writableRoot,\n path,\n uid,\n ownerUid: metadata.uid,\n ownerGid: metadata.gid,\n })\n if (\n (metadata.mode & 0o002) !== 0 ||\n ((metadata.mode & 0o020) !== 0 && !trustedGroupWritablePath)\n ) {\n throw new Error(`Refusing executable beneath group- or world-writable path ${path}`)\n }\n // User namespaces can hide host-root ownership. Only fixed OS paths are trusted this way;\n // user-installed executables and their private ancestors must still belong to this user.\n if (\n uid !== undefined &&\n metadata.uid !== 0 &&\n metadata.uid !== uid &&\n !isTrustedSystemPath(operatingSystem(), path)\n ) {\n throw new Error(`Refusing executable owned by another user at ${path}`)\n }\n const parent = dirname(path)\n if (parent === path) {\n break\n }\n }\n return canonical\n}\n\nexport const trustedExecutable = async (\n command: string,\n options: { readonly writableRoot?: string } = {},\n): Promise<string> => {\n const candidates = isAbsolute(command)\n ? [command]\n : (process.env.PATH ?? \"\")\n .split(delimiter)\n .filter(Boolean)\n .flatMap((directory) => executableNames(command).map((name) => join(directory, name)))\n let failure: unknown\n for (const path of candidates) {\n const available = await access(\n path,\n operatingSystem() === \"win32\" ? constants.F_OK : constants.X_OK,\n )\n .then(() => true)\n .catch(() => false)\n if (!available) continue\n try {\n return await validateExecutable(path, options.writableRoot)\n } catch (cause) {\n failure ??= cause\n }\n }\n throw failure ?? new Error(`Could not find ${command} on PATH`)\n}\n\nconst trustedServices = async (\n services: ReadonlyArray<ManagedService>,\n resolveExecutable: (command: string) => Promise<string>,\n): Promise<ReadonlyArray<ManagedService>> => {\n const resolved = new Map<string, Promise<string>>()\n const invocation = async (value: CommandInvocation): Promise<CommandInvocation> => {\n let command = resolved.get(value.command)\n if (command === undefined) {\n command = resolveExecutable(value.command)\n resolved.set(value.command, command)\n }\n return { ...value, command: await command }\n }\n const secured: Array<ManagedService> = []\n for (const service of services) {\n let check: CommandInvocation\n try {\n check = await invocation(service.check)\n } catch (cause) {\n if (cause instanceof Error && cause.message.startsWith(\"Could not find \")) {\n continue\n }\n throw cause\n }\n secured.push({\n ...service,\n check,\n ...(service.entrypoint === undefined\n ? {}\n : {\n entrypoint: {\n ...service.entrypoint,\n inspect: await invocation(service.entrypoint.inspect),\n },\n }),\n restart: await Promise.all(service.restart.map(invocation)),\n })\n }\n return secured\n}\n\nexport const serviceCandidates = (\n runtimePlatform: NodeJS.Platform,\n uid: number | undefined,\n): ReadonlyArray<ManagedService> => {\n if (runtimePlatform === \"linux\") {\n const systemd = (\n manager: \"systemd-user\" | \"systemd-system\",\n unit: string,\n device: boolean,\n ): ManagedService => {\n const user = manager === \"systemd-user\" ? [\"--user\"] : []\n return {\n id: `${manager}:${unit}`,\n label: unit,\n manager,\n device,\n check: { command: \"systemctl\", arguments: [...user, \"is-active\", \"--quiet\", unit] },\n entrypoint: {\n inspect: {\n command: \"systemctl\",\n arguments: [...user, \"show\", \"--property=ExecStart\", \"--value\", unit],\n },\n parse: (output) => output.match(/\\bpath=(.*?)\\s*;/)?.[1]?.trim(),\n },\n restart: [{ command: \"systemctl\", arguments: [...user, \"restart\", unit] }],\n }\n }\n return [\n systemd(\"systemd-user\", \"cohall-relay.service\", false),\n systemd(\"systemd-system\", \"cohall-relay.service\", false),\n systemd(\"systemd-user\", \"cohall-device.service\", true),\n ]\n }\n\n if (runtimePlatform === \"darwin\") {\n const domain = `gui/${uid ?? 0}`\n const launchd = (label: string, device: boolean): ManagedService => ({\n id: `launchd:${label}`,\n label,\n manager: \"launchd\",\n device,\n check: { command: \"launchctl\", arguments: [\"print\", `${domain}/${label}`] },\n activeOutput: /\\bstate\\s*=\\s*running\\b/,\n entrypoint: {\n inspect: { command: \"launchctl\", arguments: [\"print\", `${domain}/${label}`] },\n parse: (output) => output.match(/^\\s*program\\s*=\\s*(.+)$/m)?.[1]?.trim(),\n },\n restart: [{ command: \"launchctl\", arguments: [\"kickstart\", \"-k\", `${domain}/${label}`] }],\n })\n return [launchd(\"com.cohall.relay\", false), launchd(\"com.cohall.device\", true)]\n }\n\n if (runtimePlatform === \"win32\") {\n return [\n {\n id: \"scheduled-task:Cohall Device\",\n label: \"Cohall Device\",\n manager: \"scheduled-task\",\n device: true,\n check: {\n command: \"powershell.exe\",\n arguments: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"if ((Get-ScheduledTask -TaskName 'Cohall Device' -ErrorAction SilentlyContinue).State -eq 'Running') { exit 0 } else { exit 1 }\",\n ],\n },\n restart: [\n {\n command: \"schtasks.exe\",\n arguments: [\"/End\", \"/TN\", \"Cohall Device\"],\n allowFailure: true,\n },\n { command: \"schtasks.exe\", arguments: [\"/Run\", \"/TN\", \"Cohall Device\"] },\n ],\n },\n ]\n }\n\n return []\n}\n\nconst defaultRunner: CommandRunner = {\n run: (command, arguments_, timeoutMs = 300_000) =>\n new Promise((resolve) => {\n execFile(\n command,\n [...arguments_],\n { encoding: \"utf8\", maxBuffer: 1024 * 1024, timeout: timeoutMs, windowsHide: true },\n (error: ExecFileException | null, stdout, stderr) => {\n resolve({\n exitCode: typeof error?.code === \"number\" ? error.code : error === null ? 0 : 1,\n stdout,\n stderr,\n ...(error === null ? {} : { error: error.message }),\n })\n },\n )\n }),\n}\n\nconst checked = async (\n runner: CommandRunner,\n invocation: CommandInvocation,\n timeoutMs?: number,\n): Promise<CommandResult> => {\n const result = await runner.run(invocation.command, invocation.arguments, timeoutMs)\n if (result.exitCode === 0 || invocation.allowFailure === true) {\n return result\n }\n const detail = (\n result.stderr.trim() ||\n result.stdout.trim() ||\n result.error ||\n \"unknown error\"\n ).slice(0, 16_384)\n throw new Error(\n `${invocation.command} ${invocation.arguments.join(\" \")} failed with status ${result.exitCode}: ${detail}`,\n )\n}\n\nconst activeServices = async (\n runner: CommandRunner,\n candidates: ReadonlyArray<ManagedService>,\n): Promise<ReadonlyArray<ManagedService>> => {\n const active: Array<ManagedService> = []\n for (const service of candidates) {\n const result = await runner.run(service.check.command, service.check.arguments, 10_000)\n if (\n result.exitCode === 0 &&\n (service.activeOutput === undefined ||\n service.activeOutput.test(`${result.stdout}\\n${result.stderr}`))\n ) {\n active.push(service)\n }\n }\n return active\n}\n\nconst assertServiceInstallations = async (\n runner: CommandRunner,\n services: ReadonlyArray<ManagedService>,\n canonicalEntrypoint: string,\n entrypoint: string,\n): Promise<void> => {\n for (const service of services) {\n if (service.entrypoint === undefined) {\n continue\n }\n const result = await checked(runner, service.entrypoint.inspect, 10_000)\n const serviceEntrypoint = service.entrypoint.parse(`${result.stdout}\\n${result.stderr}`)\n if (serviceEntrypoint === undefined) {\n throw new Error(`Could not determine the executable used by active ${service.label}`)\n }\n const canonicalServiceEntrypoint = await realpath(serviceEntrypoint).catch((cause: unknown) => {\n throw new Error(\n `Could not resolve the executable used by active ${service.label}: ${cause instanceof Error ? cause.message : String(cause)}`,\n )\n })\n if (canonicalServiceEntrypoint === canonicalEntrypoint) {\n continue\n }\n throw new Error(\n `Active ${service.label} uses ${serviceEntrypoint}, but this Cohall CLI uses ${entrypoint}. Run the service executable's upgrade command so its installation is updated before restart.`,\n )\n }\n}\n\nconst readReceipt = async (path: string): Promise<RestartReceipt | undefined> =>\n readFile(path, \"utf8\")\n .then((content) => Schema.decodeUnknownOption(RestartReceipt)(JSON.parse(content)))\n .then((decoded) => (decoded._tag === \"Some\" ? decoded.value : undefined))\n .catch(() => undefined)\n\nconst writeReceipt = async (path: string, value: RestartReceipt): Promise<void> => {\n const directory = dirname(path)\n const temporary = `${path}.${process.pid}.tmp`\n await mkdir(directory, { recursive: true, mode: 0o700 })\n if (operatingSystem() !== \"win32\") {\n await chmod(directory, 0o700)\n }\n await writeFile(temporary, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporary, path)\n}\n\nconst installedVersion = async (entrypoint: string): Promise<string> => {\n const canonicalEntrypoint = await realpath(entrypoint)\n const metadata: unknown = JSON.parse(\n await readFile(join(dirname(dirname(canonicalEntrypoint)), \"package.json\"), \"utf8\"),\n )\n if (\n typeof metadata !== \"object\" ||\n metadata === null ||\n !(\"name\" in metadata) ||\n metadata.name !== packageName ||\n !(\"version\" in metadata) ||\n typeof metadata.version !== \"string\"\n ) {\n throw new Error(`Could not verify the installed ${packageName} version`)\n }\n return metadata.version\n}\n\nconst restartReceiptPath = (): string => join(dirname(configurationPath()), \"upgrade-restart.json\")\n\nconst restartServices = async (\n runner: CommandRunner,\n services: ReadonlyArray<ManagedService>,\n statePath: string,\n state: RestartReceipt,\n preserveDeviceReceipt: boolean,\n): Promise<RestartReceipt> => {\n let current = state\n for (const service of services) {\n current = { ...current, restartingService: service.id }\n await writeReceipt(statePath, current)\n try {\n for (const invocation of service.restart) {\n await checked(runner, invocation, 60_000)\n }\n } catch (cause) {\n current = {\n version: current.version,\n fromVersion: current.fromVersion,\n packageManager: current.packageManager,\n pendingServices: current.pendingServices,\n restartedServices: current.restartedServices,\n }\n await writeReceipt(statePath, current)\n throw cause\n }\n if (service.device && preserveDeviceReceipt) {\n // Some service managers return before terminating this process. The replacement task consumes the marker.\n return current\n }\n current = {\n version: current.version,\n fromVersion: current.fromVersion,\n packageManager: current.packageManager,\n pendingServices: current.pendingServices.filter((id) => id !== service.id),\n restartedServices: [...current.restartedServices, service.id],\n }\n await writeReceipt(statePath, current)\n }\n return current\n}\n\nconst reportedRestartServices = (receipt: RestartReceipt): ReadonlyArray<string> =>\n receipt.restartingService === undefined ||\n receipt.restartedServices.includes(receipt.restartingService)\n ? receipt.restartedServices\n : [...receipt.restartedServices, receipt.restartingService]\n\nexport const upgrade = async (options: UpgradeOptions): Promise<UpgradeResult> => {\n const target = normalizeUpgradeTarget(options.target)\n const runner = options.runner ?? defaultRunner\n const resolveExecutable = options.resolveExecutable ?? trustedExecutable\n const runtimePlatform = options.platform ?? process.platform\n const uid = options.uid ?? process.getuid?.()\n const candidates = await trustedServices(\n serviceCandidates(runtimePlatform, uid),\n resolveExecutable,\n )\n const statePath = options.statePath ?? restartReceiptPath()\n const previous = await readReceipt(statePath)\n\n if (\n previous?.version === options.currentVersion &&\n (target === \"latest\" || target === previous.version)\n ) {\n const byId = new Map(candidates.map((service) => [service.id, service]))\n const pending = previous.pendingServices.flatMap((id) => {\n const service = byId.get(id)\n return service === undefined ? [] : [service]\n })\n const active = await activeServices(runner, pending)\n if (options.dryRun || !options.restart) {\n return {\n upgraded: previous.fromVersion !== previous.version,\n from_version: previous.fromVersion,\n installed_version: previous.version,\n requested_version: previous.version,\n package_manager: previous.packageManager,\n services_restarted: previous.restartedServices,\n services_pending_restart: active.map((service) => service.id),\n resumed_after_restart: false,\n dry_run: options.dryRun,\n }\n }\n const activeIds = new Set(active.map((service) => service.id))\n const completedByRestart = pending.filter(\n (service) =>\n service.device && service.id === previous.restartingService && activeIds.has(service.id),\n )\n const completedIds = new Set(completedByRestart.map((service) => service.id))\n const remaining = active.filter((service) => !completedIds.has(service.id))\n let resumed: RestartReceipt = {\n version: previous.version,\n fromVersion: previous.fromVersion,\n packageManager: previous.packageManager,\n pendingServices: previous.pendingServices.filter((id) => !completedIds.has(id)),\n restartedServices: [\n ...previous.restartedServices,\n ...completedByRestart.map((service) => service.id),\n ],\n }\n if (remaining.length > 0) {\n await writeReceipt(statePath, resumed)\n resumed = await restartServices(\n runner,\n remaining,\n statePath,\n resumed,\n options.delegated === true,\n )\n }\n if (resumed.restartingService === undefined) {\n await rm(statePath, { force: true })\n }\n return {\n upgraded: previous.fromVersion !== previous.version,\n from_version: previous.fromVersion,\n installed_version: previous.version,\n requested_version: previous.version,\n package_manager: previous.packageManager,\n services_restarted: reportedRestartServices(resumed),\n services_pending_restart: [],\n resumed_after_restart: true,\n dry_run: false,\n }\n }\n\n const entrypoint = options.entrypoint ?? process.argv[1]\n if (entrypoint === undefined) {\n throw new Error(\"Could not resolve the Cohall executable path\")\n }\n const canonicalEntrypoint = await realpath(entrypoint)\n const installation = packageInstallation(canonicalEntrypoint, entrypoint)\n const services = await activeServices(runner, candidates)\n await assertServiceInstallations(runner, services, canonicalEntrypoint, entrypoint)\n\n if (options.dryRun) {\n return {\n upgraded: false,\n from_version: options.currentVersion,\n installed_version: options.currentVersion,\n requested_version: target,\n package_manager: installation.manager,\n services_restarted: [],\n services_pending_restart: options.restart ? services.map((service) => service.id) : [],\n resumed_after_restart: false,\n dry_run: true,\n }\n }\n\n let nextVersion = await installedVersion(entrypoint).catch(() => undefined)\n if (nextVersion === undefined || target !== nextVersion) {\n const install = packageInstallCommand(installation, target)\n const installExecutable =\n options.resolveExecutable === undefined\n ? await trustedExecutable(\n install.command,\n installation.prefix === undefined ? {} : { writableRoot: installation.prefix },\n )\n : await resolveExecutable(install.command)\n await checked(runner, { ...install, command: installExecutable })\n nextVersion = await installedVersion(entrypoint)\n }\n if (target !== \"latest\" && nextVersion !== target) {\n throw new Error(`Installed Cohall ${nextVersion}, expected ${target}`)\n }\n const upgraded = nextVersion !== options.currentVersion\n\n if (!options.restart || services.length === 0) {\n await rm(statePath, { force: true })\n return {\n upgraded,\n from_version: options.currentVersion,\n installed_version: nextVersion,\n requested_version: target,\n package_manager: installation.manager,\n services_restarted: [],\n services_pending_restart: options.restart ? [] : services.map((service) => service.id),\n resumed_after_restart: false,\n dry_run: false,\n }\n }\n\n const initial: RestartReceipt = {\n version: nextVersion,\n fromVersion: options.currentVersion,\n packageManager: installation.manager,\n pendingServices: services.map((service) => service.id),\n restartedServices: [],\n }\n await writeReceipt(statePath, initial)\n const completed = await restartServices(\n runner,\n services,\n statePath,\n initial,\n options.delegated === true,\n )\n if (completed.restartingService === undefined) {\n await rm(statePath, { force: true })\n }\n return {\n upgraded,\n from_version: options.currentVersion,\n installed_version: nextVersion,\n requested_version: target,\n package_manager: installation.manager,\n services_restarted: reportedRestartServices(completed),\n services_pending_restart: [],\n resumed_after_restart: false,\n dry_run: false,\n }\n}\n",
22
+ "import { execFile, type ExecFileException } from \"node:child_process\"\nimport { chmod, mkdir, realpath, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { configurationPath } from \"./config.ts\"\nimport {\n packageInstallation,\n trustedExecutable,\n type CommandResult,\n type CommandRunner,\n} from \"./upgrade.ts\"\n\ninterface ServiceFile {\n readonly path: string\n readonly content: string\n readonly mode: number\n}\n\nexport interface DeviceServicePlan {\n readonly file: ServiceFile\n readonly commands: ReadonlyArray<{\n readonly command: string\n readonly arguments: ReadonlyArray<string>\n }>\n readonly note?: string\n}\n\nconst xml = (value: string): string =>\n value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&apos;\")\n\nconst systemdArgument = (value: string): string =>\n `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"').replaceAll(\"%\", \"%%\").replaceAll(\"\\n\", \"\\\\n\").replaceAll(\"\\r\", \"\\\\r\")}\"`\n\nexport const deviceServicePlan = (options: {\n readonly platform: NodeJS.Platform\n readonly entrypoint: string\n readonly home: string\n readonly nodeExecutable: string\n readonly configPath: string\n readonly uid?: number\n}): DeviceServicePlan => {\n const servicePath = [\n dirname(options.nodeExecutable),\n join(options.home, \".local\", \"bin\"),\n join(options.home, \".npm-global\", \"bin\"),\n join(options.home, \".bun\", \"bin\"),\n options.platform === \"darwin\"\n ? join(options.home, \"Library\", \"pnpm\")\n : join(options.home, \".local\", \"share\", \"pnpm\"),\n ...(options.platform === \"darwin\" ? [\"/opt/homebrew/bin\"] : []),\n \"/usr/local/bin\",\n \"/usr/bin\",\n \"/bin\",\n ].join(\":\")\n if (options.platform === \"linux\") {\n const path = join(options.home, \".config\", \"systemd\", \"user\", \"cohall-device.service\")\n return {\n file: {\n path,\n mode: 0o600,\n content: `[Unit]\\nDescription=Cohall device agent\\nAfter=network-online.target\\nWants=network-online.target\\n\\n[Service]\\nType=simple\\nEnvironment=${systemdArgument(`PATH=${servicePath}`)}\\nEnvironment=${systemdArgument(`COHALL_CONFIG=${options.configPath}`)}\\nExecStart=${systemdArgument(options.entrypoint)} device\\nRestart=always\\nRestartSec=3\\nUMask=0077\\nNoNewPrivileges=true\\nPrivateTmp=true\\n\\n[Install]\\nWantedBy=default.target\\n`,\n },\n commands: [\n { command: \"systemctl\", arguments: [\"--user\", \"daemon-reload\"] },\n { command: \"systemctl\", arguments: [\"--user\", \"enable\", \"cohall-device.service\"] },\n { command: \"systemctl\", arguments: [\"--user\", \"restart\", \"cohall-device.service\"] },\n ],\n note: \"The device starts after login. Run loginctl enable-linger $USER if it must run before login.\",\n }\n }\n if (options.platform === \"darwin\") {\n const label = \"com.cohall.device\"\n const path = join(options.home, \"Library\", \"LaunchAgents\", `${label}.plist`)\n const domain = `gui/${options.uid ?? 0}`\n return {\n file: {\n path,\n mode: 0o600,\n content: `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\\n<plist version=\"1.0\">\\n<dict>\\n <key>Label</key>\\n <string>${label}</string>\\n <key>ProgramArguments</key>\\n <array>\\n <string>${xml(options.entrypoint)}</string>\\n <string>device</string>\\n </array>\\n <key>EnvironmentVariables</key>\\n <dict>\\n <key>PATH</key>\\n <string>${xml(servicePath)}</string>\\n <key>COHALL_CONFIG</key>\\n <string>${xml(options.configPath)}</string>\\n </dict>\\n <key>RunAtLoad</key>\\n <true/>\\n <key>KeepAlive</key>\\n <dict>\\n <key>NetworkState</key>\\n <true/>\\n <key>SuccessfulExit</key>\\n <false/>\\n </dict>\\n <key>ThrottleInterval</key>\\n <integer>3</integer>\\n <key>ProcessType</key>\\n <string>Background</string>\\n</dict>\\n</plist>\\n`,\n },\n commands: [\n { command: \"launchctl\", arguments: [\"bootout\", domain, path] },\n { command: \"launchctl\", arguments: [\"bootstrap\", domain, path] },\n { command: \"launchctl\", arguments: [\"kickstart\", \"-k\", `${domain}/${label}`] },\n ],\n }\n }\n throw new Error(\"Automatic device service installation supports Linux and macOS\")\n}\n\nconst defaultRunner: CommandRunner = {\n run: async (command, arguments_, timeoutMs = 60_000) => {\n const executable = await trustedExecutable(command)\n return new Promise((resolve) => {\n execFile(\n executable,\n [...arguments_],\n { encoding: \"utf8\", maxBuffer: 1024 * 1024, timeout: timeoutMs, windowsHide: true },\n (error: ExecFileException | null, stdout, stderr) =>\n resolve({\n exitCode: typeof error?.code === \"number\" ? error.code : error === null ? 0 : 1,\n stdout,\n stderr,\n ...(error === null ? {} : { error: error.message }),\n }),\n )\n })\n },\n}\n\nconst checked = async (\n runner: CommandRunner,\n command: string,\n arguments_: ReadonlyArray<string>,\n allowFailure = false,\n): Promise<CommandResult> => {\n const result = await runner.run(command, arguments_, 60_000)\n if (result.exitCode === 0 || allowFailure) {\n return result\n }\n throw new Error(\n `${command} failed: ${result.stderr.trim() || result.stdout.trim() || result.error || `status ${result.exitCode}`}`,\n )\n}\n\nexport const installDeviceService = async (\n options: {\n readonly entrypoint?: string\n readonly platform?: NodeJS.Platform\n readonly home?: string\n readonly uid?: number\n readonly runner?: CommandRunner\n } = {},\n): Promise<{ readonly installed: string; readonly note?: string }> => {\n const entrypoint = await realpath(options.entrypoint ?? process.argv[1] ?? \"\")\n packageInstallation(entrypoint)\n const platform = options.platform ?? process.platform\n const runner = options.runner ?? defaultRunner\n if (platform === \"win32\") {\n const script = join(dirname(dirname(entrypoint)), \"deploy\", \"windows\", \"install-device.ps1\")\n await checked(runner, \"powershell.exe\", [\n \"-NoProfile\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-File\",\n script,\n \"-NodeExecutable\",\n process.execPath,\n \"-Entrypoint\",\n entrypoint,\n \"-ConfigurationPath\",\n configurationPath(),\n ])\n return { installed: \"scheduled-task:Cohall Device\" }\n }\n const uid = options.uid ?? process.getuid?.()\n const plan = deviceServicePlan({\n platform,\n entrypoint,\n home: options.home ?? homedir(),\n nodeExecutable: process.execPath,\n configPath: configurationPath(),\n ...(uid === undefined ? {} : { uid }),\n })\n await mkdir(dirname(plan.file.path), { recursive: true, mode: 0o700 })\n await writeFile(plan.file.path, plan.file.content, { mode: plan.file.mode })\n await chmod(plan.file.path, plan.file.mode)\n for (const [index, command] of plan.commands.entries()) {\n await checked(runner, command.command, command.arguments, platform === \"darwin\" && index === 0)\n }\n return {\n installed: plan.file.path,\n ...(plan.note === undefined ? {} : { note: plan.note }),\n }\n}\n\nexport interface DeviceServiceRestart {\n readonly running: boolean\n readonly restarted: boolean\n readonly service?: string\n}\n\nexport const restartDeviceService = async (\n options: {\n readonly platform?: NodeJS.Platform\n readonly uid?: number\n readonly runner?: CommandRunner\n } = {},\n): Promise<DeviceServiceRestart> => {\n const platform = options.platform ?? process.platform\n const runner = options.runner ?? defaultRunner\n if (platform === \"linux\") {\n const service = \"cohall-device.service\"\n const check = await runner.run(\"systemctl\", [\"--user\", \"is-active\", \"--quiet\", service], 10_000)\n if (check.exitCode !== 0) {\n return { running: false, restarted: false }\n }\n await checked(runner, \"systemctl\", [\"--user\", \"restart\", service])\n return { running: true, restarted: true, service }\n }\n if (platform === \"darwin\") {\n const service = \"com.cohall.device\"\n const target = `gui/${options.uid ?? process.getuid?.() ?? 0}/${service}`\n const check = await runner.run(\"launchctl\", [\"print\", target], 10_000)\n if (check.exitCode !== 0) {\n return { running: false, restarted: false }\n }\n await checked(runner, \"launchctl\", [\"kickstart\", \"-k\", target])\n return { running: true, restarted: true, service }\n }\n if (platform === \"win32\") {\n const service = \"Cohall Device\"\n const check = await runner.run(\"schtasks.exe\", [\"/Query\", \"/TN\", service], 10_000)\n if (check.exitCode !== 0) {\n return { running: false, restarted: false }\n }\n await checked(runner, \"schtasks.exe\", [\"/End\", \"/TN\", service], true)\n await checked(runner, \"schtasks.exe\", [\"/Run\", \"/TN\", service])\n return { running: true, restarted: true, service }\n }\n return { running: false, restarted: false }\n}\n",
23
+ "import { Schema } from \"effect\"\nimport { execa } from \"execa\"\nimport { constants } from \"node:fs\"\nimport {\n access,\n chmod,\n mkdir,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { delimiter, dirname, extname, isAbsolute, join, relative } from \"node:path\"\nimport { platform as operatingSystem } from \"node:os\"\nimport { configurationPath } from \"./config.ts\"\n\nconst packageName = \"@akshar5/cohall\"\nconst semanticVersion = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\n\nexport const PackageManager = Schema.Literals([\"npm\", \"bun\", \"pnpm\"])\nexport type PackageManager = typeof PackageManager.Type\nexport type ServiceManager = \"launchd\" | \"scheduled-task\" | \"systemd-system\" | \"systemd-user\"\n\nexport interface CommandResult {\n readonly exitCode: number\n readonly stdout: string\n readonly stderr: string\n readonly error?: string\n}\n\nexport interface CommandRunner {\n readonly run: (\n command: string,\n arguments_: ReadonlyArray<string>,\n timeoutMs?: number,\n ) => Promise<CommandResult>\n}\n\nexport interface PackageInstallation {\n readonly manager: PackageManager\n readonly prefix?: string\n readonly entrypoint: string\n}\n\nexport interface ManagedService {\n readonly id: string\n readonly label: string\n readonly manager: ServiceManager\n readonly device: boolean\n readonly check: CommandInvocation\n readonly activeOutput?: RegExp\n readonly entrypoint?: {\n readonly inspect: CommandInvocation\n readonly parse: (output: string) => string | undefined\n }\n readonly restart: ReadonlyArray<CommandInvocation>\n}\n\nexport interface CommandInvocation {\n readonly command: string\n readonly arguments: ReadonlyArray<string>\n readonly allowFailure?: boolean\n}\n\nconst RestartReceipt = Schema.Struct({\n version: Schema.String,\n fromVersion: Schema.String,\n packageManager: PackageManager,\n pendingServices: Schema.Array(Schema.String),\n restartedServices: Schema.Array(Schema.String),\n restartingService: Schema.optionalKey(Schema.String),\n})\ninterface RestartReceipt extends Schema.Schema.Type<typeof RestartReceipt> {}\n\nexport interface UpgradeOptions {\n readonly currentVersion: string\n readonly target?: string\n readonly restart: boolean\n readonly dryRun: boolean\n readonly entrypoint?: string\n readonly platform?: NodeJS.Platform\n readonly uid?: number\n readonly statePath?: string\n readonly delegated?: boolean\n readonly runner?: CommandRunner\n readonly resolveExecutable?: (command: string) => Promise<string>\n}\n\nexport interface UpgradeResult {\n readonly upgraded: boolean\n readonly from_version: string\n readonly installed_version: string\n readonly requested_version: string\n readonly package_manager: PackageManager\n readonly services_restarted: ReadonlyArray<string>\n readonly services_pending_restart: ReadonlyArray<string>\n readonly resumed_after_restart: boolean\n readonly dry_run: boolean\n}\n\nconst normalizePath = (path: string): string => path.replaceAll(\"\\\\\", \"/\")\n\nexport const normalizeUpgradeTarget = (target: string | undefined): string => {\n if (target === undefined || target === \"latest\") {\n return \"latest\"\n }\n const normalized = target.startsWith(\"v\") ? target.slice(1) : target\n if (!semanticVersion.test(normalized)) {\n throw new Error(\"--to must be latest or an exact semantic version\")\n }\n return normalized\n}\n\nexport const deviceVersionWarning = (\n cliVersion: string,\n deviceVersion: string | undefined,\n): string | undefined =>\n deviceVersion === undefined || deviceVersion === cliVersion\n ? undefined\n : `Running device daemon uses Cohall ${deviceVersion}, while this CLI is ${cliVersion}. Run upgrade through the executable configured by the device service.`\n\nexport const packageInstallation = (\n canonicalEntrypoint: string,\n entrypoint = canonicalEntrypoint,\n): PackageInstallation => {\n const path = normalizePath(canonicalEntrypoint)\n const marker = `/node_modules/${packageName}/`\n const packageIndex = path.lastIndexOf(marker)\n if (packageIndex === -1) {\n throw new Error(\n \"cohall upgrade requires a global npm, Bun, or pnpm installation; package-runner and source-checkout executions cannot upgrade themselves\",\n )\n }\n if (\n path.includes(\"/.npm/_npx/\") ||\n path.includes(\"/.bunx/\") ||\n path.includes(\"/pnpm/dlx/\") ||\n path.includes(\"/dlx/\")\n ) {\n throw new Error(\n \"This Cohall process is running from a temporary package-runner cache; install it globally before using cohall upgrade\",\n )\n }\n if (path.includes(\"/.bun/install/global/node_modules/\")) {\n return { manager: \"bun\", entrypoint }\n }\n if (path.includes(\"/pnpm/global/\")) {\n return { manager: \"pnpm\", entrypoint }\n }\n\n const nodeModulesParent = path.slice(0, packageIndex)\n const prefix = nodeModulesParent.endsWith(\"/lib\")\n ? nodeModulesParent.slice(0, -\"/lib\".length)\n : nodeModulesParent\n return { manager: \"npm\", prefix, entrypoint }\n}\n\nexport const packageInstallCommand = (\n installation: PackageInstallation,\n target: string,\n): CommandInvocation => {\n const specification = `${packageName}@${target}`\n switch (installation.manager) {\n case \"bun\":\n return { command: \"bun\", arguments: [\"add\", \"--global\", specification] }\n case \"pnpm\":\n return { command: \"pnpm\", arguments: [\"add\", \"--global\", specification] }\n case \"npm\":\n return {\n command: \"npm\",\n arguments: [\n \"install\",\n \"--global\",\n ...(installation.prefix === undefined ? [] : [\"--prefix\", installation.prefix]),\n specification,\n ],\n }\n }\n}\n\nconst executableNames = (command: string): ReadonlyArray<string> => {\n if (operatingSystem() !== \"win32\" || extname(command).length > 0) {\n return [command]\n }\n return (process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .filter(Boolean)\n .map((extension) => `${command}${extension.toLowerCase()}`)\n}\n\nconst containsPath = (root: string, path: string): boolean => {\n const child = relative(root, path)\n return child === \"\" || (!child.startsWith(\"..\") && !isAbsolute(child))\n}\n\nconst linuxSystemExecutableRoots = [\n \"/bin\",\n \"/sbin\",\n \"/usr/bin\",\n \"/usr/sbin\",\n \"/usr/lib/node_modules\",\n \"/usr/share/nodejs\",\n \"/nix/store\",\n]\nconst macosHomebrewRoots = [\"/opt/homebrew\", \"/usr/local\"]\nconst macosAdminGroup = 80\n\nexport const isTrustedSystemPath = (platform: NodeJS.Platform, path: string): boolean =>\n platform === \"linux\" &&\n (path === \"/home\" ||\n linuxSystemExecutableRoots.some((root) => containsPath(root, path) || containsPath(path, root)))\n\nexport const isTrustedGroupWritablePath = (options: {\n readonly platform: NodeJS.Platform\n readonly canonical: string\n readonly writableRoot: string | undefined\n readonly path: string\n readonly uid: number | undefined\n readonly ownerUid: number\n readonly ownerGid: number\n}): boolean => {\n const writableRoot = options.writableRoot\n return (\n options.platform === \"darwin\" &&\n writableRoot !== undefined &&\n options.uid !== undefined &&\n options.ownerUid === options.uid &&\n options.ownerGid === macosAdminGroup &&\n macosHomebrewRoots.some((root) => containsPath(root, writableRoot)) &&\n containsPath(writableRoot, options.canonical) &&\n containsPath(writableRoot, options.path)\n )\n}\n\nconst validateExecutable = async (\n candidate: string,\n installationRoot: string | undefined,\n): Promise<string> => {\n const canonical = await realpath(candidate)\n if (operatingSystem() === \"win32\") {\n return canonical\n }\n const uid = process.getuid?.()\n const writableRoot = installationRoot === undefined ? undefined : await realpath(installationRoot)\n for (let path = canonical; ; path = dirname(path)) {\n const metadata = await stat(path)\n // Homebrew's shared prefix is admin-group writable. Local administrators are already inside\n // the OS trust boundary; arbitrary shared Unix groups remain rejected.\n const trustedGroupWritablePath = isTrustedGroupWritablePath({\n platform: operatingSystem(),\n canonical,\n writableRoot,\n path,\n uid,\n ownerUid: metadata.uid,\n ownerGid: metadata.gid,\n })\n if (\n (metadata.mode & 0o002) !== 0 ||\n ((metadata.mode & 0o020) !== 0 && !trustedGroupWritablePath)\n ) {\n throw new Error(`Refusing executable beneath group- or world-writable path ${path}`)\n }\n // User namespaces can hide host-root ownership. Only fixed OS paths are trusted this way;\n // user-installed executables and their private ancestors must still belong to this user.\n if (\n uid !== undefined &&\n metadata.uid !== 0 &&\n metadata.uid !== uid &&\n !isTrustedSystemPath(operatingSystem(), path)\n ) {\n throw new Error(`Refusing executable owned by another user at ${path}`)\n }\n const parent = dirname(path)\n if (parent === path) {\n break\n }\n }\n return canonical\n}\n\nexport const trustedExecutable = async (\n command: string,\n options: { readonly writableRoot?: string } = {},\n): Promise<string> => {\n const candidates = isAbsolute(command)\n ? [command]\n : (process.env.PATH ?? \"\")\n .split(delimiter)\n .filter(Boolean)\n .flatMap((directory) => executableNames(command).map((name) => join(directory, name)))\n let failure: unknown\n for (const path of candidates) {\n const available = await access(\n path,\n operatingSystem() === \"win32\" ? constants.F_OK : constants.X_OK,\n )\n .then(() => true)\n .catch(() => false)\n if (!available) continue\n try {\n return await validateExecutable(path, options.writableRoot)\n } catch (cause) {\n failure ??= cause\n }\n }\n throw failure ?? new Error(`Could not find ${command} on PATH`)\n}\n\nconst trustedServices = async (\n services: ReadonlyArray<ManagedService>,\n resolveExecutable: (command: string) => Promise<string>,\n): Promise<ReadonlyArray<ManagedService>> => {\n const resolved = new Map<string, Promise<string>>()\n const invocation = async (value: CommandInvocation): Promise<CommandInvocation> => {\n let command = resolved.get(value.command)\n if (command === undefined) {\n command = resolveExecutable(value.command)\n resolved.set(value.command, command)\n }\n return { ...value, command: await command }\n }\n const secured: Array<ManagedService> = []\n for (const service of services) {\n let check: CommandInvocation\n try {\n check = await invocation(service.check)\n } catch (cause) {\n if (cause instanceof Error && cause.message.startsWith(\"Could not find \")) {\n continue\n }\n throw cause\n }\n secured.push({\n ...service,\n check,\n ...(service.entrypoint === undefined\n ? {}\n : {\n entrypoint: {\n ...service.entrypoint,\n inspect: await invocation(service.entrypoint.inspect),\n },\n }),\n restart: await Promise.all(service.restart.map(invocation)),\n })\n }\n return secured\n}\n\nexport const serviceCandidates = (\n runtimePlatform: NodeJS.Platform,\n uid: number | undefined,\n): ReadonlyArray<ManagedService> => {\n if (runtimePlatform === \"linux\") {\n const systemd = (\n manager: \"systemd-user\" | \"systemd-system\",\n unit: string,\n device: boolean,\n ): ManagedService => {\n const user = manager === \"systemd-user\" ? [\"--user\"] : []\n return {\n id: `${manager}:${unit}`,\n label: unit,\n manager,\n device,\n check: { command: \"systemctl\", arguments: [...user, \"is-active\", \"--quiet\", unit] },\n entrypoint: {\n inspect: {\n command: \"systemctl\",\n arguments: [...user, \"show\", \"--property=ExecStart\", \"--value\", unit],\n },\n parse: (output) => output.match(/\\bpath=(.*?)\\s*;/)?.[1]?.trim(),\n },\n restart: [{ command: \"systemctl\", arguments: [...user, \"restart\", unit] }],\n }\n }\n return [\n systemd(\"systemd-user\", \"cohall-relay.service\", false),\n systemd(\"systemd-system\", \"cohall-relay.service\", false),\n systemd(\"systemd-user\", \"cohall-device.service\", true),\n ]\n }\n\n if (runtimePlatform === \"darwin\") {\n const domain = `gui/${uid ?? 0}`\n const launchd = (label: string, device: boolean): ManagedService => ({\n id: `launchd:${label}`,\n label,\n manager: \"launchd\",\n device,\n check: { command: \"launchctl\", arguments: [\"print\", `${domain}/${label}`] },\n activeOutput: /\\bstate\\s*=\\s*running\\b/,\n entrypoint: {\n inspect: { command: \"launchctl\", arguments: [\"print\", `${domain}/${label}`] },\n parse: (output) => output.match(/^\\s*program\\s*=\\s*(.+)$/m)?.[1]?.trim(),\n },\n restart: [{ command: \"launchctl\", arguments: [\"kickstart\", \"-k\", `${domain}/${label}`] }],\n })\n return [launchd(\"com.cohall.relay\", false), launchd(\"com.cohall.device\", true)]\n }\n\n if (runtimePlatform === \"win32\") {\n return [\n {\n id: \"scheduled-task:Cohall Device\",\n label: \"Cohall Device\",\n manager: \"scheduled-task\",\n device: true,\n check: {\n command: \"powershell.exe\",\n arguments: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"if ((Get-ScheduledTask -TaskName 'Cohall Device' -ErrorAction SilentlyContinue).State -eq 'Running') { exit 0 } else { exit 1 }\",\n ],\n },\n restart: [\n {\n command: \"schtasks.exe\",\n arguments: [\"/End\", \"/TN\", \"Cohall Device\"],\n allowFailure: true,\n },\n { command: \"schtasks.exe\", arguments: [\"/Run\", \"/TN\", \"Cohall Device\"] },\n ],\n },\n ]\n }\n\n return []\n}\n\nconst defaultRunner: CommandRunner = {\n run: async (command, arguments_, timeoutMs = 300_000) => {\n const result = await execa(command, arguments_, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n timeout: timeoutMs,\n windowsHide: true,\n stdin: \"ignore\",\n reject: false,\n stripFinalNewline: false,\n })\n return {\n exitCode: result.failed ? result.exitCode || 1 : 0,\n stdout: result.stdout,\n stderr: result.stderr,\n ...(result.shortMessage === undefined ? {} : { error: result.shortMessage.slice(0, 16_384) }),\n }\n },\n}\n\nconst checked = async (\n runner: CommandRunner,\n invocation: CommandInvocation,\n timeoutMs?: number,\n): Promise<CommandResult> => {\n const result = await runner.run(invocation.command, invocation.arguments, timeoutMs)\n if (result.exitCode === 0 || invocation.allowFailure === true) {\n return result\n }\n const detail = (\n result.stderr.trim() ||\n result.stdout.trim() ||\n result.error ||\n \"unknown error\"\n ).slice(0, 16_384)\n throw new Error(\n `${invocation.command} ${invocation.arguments.join(\" \")} failed with status ${result.exitCode}: ${detail}`,\n )\n}\n\nconst activeServices = async (\n runner: CommandRunner,\n candidates: ReadonlyArray<ManagedService>,\n): Promise<ReadonlyArray<ManagedService>> => {\n const active: Array<ManagedService> = []\n for (const service of candidates) {\n const result = await runner.run(service.check.command, service.check.arguments, 10_000)\n if (\n result.exitCode === 0 &&\n (service.activeOutput === undefined ||\n service.activeOutput.test(`${result.stdout}\\n${result.stderr}`))\n ) {\n active.push(service)\n }\n }\n return active\n}\n\nconst assertServiceInstallations = async (\n runner: CommandRunner,\n services: ReadonlyArray<ManagedService>,\n canonicalEntrypoint: string,\n entrypoint: string,\n): Promise<void> => {\n for (const service of services) {\n if (service.entrypoint === undefined) {\n continue\n }\n const result = await checked(runner, service.entrypoint.inspect, 10_000)\n const serviceEntrypoint = service.entrypoint.parse(`${result.stdout}\\n${result.stderr}`)\n if (serviceEntrypoint === undefined) {\n throw new Error(`Could not determine the executable used by active ${service.label}`)\n }\n const canonicalServiceEntrypoint = await realpath(serviceEntrypoint).catch((cause: unknown) => {\n throw new Error(\n `Could not resolve the executable used by active ${service.label}: ${cause instanceof Error ? cause.message : String(cause)}`,\n )\n })\n if (canonicalServiceEntrypoint === canonicalEntrypoint) {\n continue\n }\n throw new Error(\n `Active ${service.label} uses ${serviceEntrypoint}, but this Cohall CLI uses ${entrypoint}. Run the service executable's upgrade command so its installation is updated before restart.`,\n )\n }\n}\n\nconst readReceipt = async (path: string): Promise<RestartReceipt | undefined> =>\n readFile(path, \"utf8\")\n .then((content) => Schema.decodeUnknownOption(RestartReceipt)(JSON.parse(content)))\n .then((decoded) => (decoded._tag === \"Some\" ? decoded.value : undefined))\n .catch(() => undefined)\n\nconst writeReceipt = async (path: string, value: RestartReceipt): Promise<void> => {\n const directory = dirname(path)\n const temporary = `${path}.${process.pid}.tmp`\n await mkdir(directory, { recursive: true, mode: 0o700 })\n if (operatingSystem() !== \"win32\") {\n await chmod(directory, 0o700)\n }\n await writeFile(temporary, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporary, path)\n}\n\nconst installedVersion = async (entrypoint: string): Promise<string> => {\n const canonicalEntrypoint = await realpath(entrypoint)\n const metadata: unknown = JSON.parse(\n await readFile(join(dirname(dirname(canonicalEntrypoint)), \"package.json\"), \"utf8\"),\n )\n if (\n typeof metadata !== \"object\" ||\n metadata === null ||\n !(\"name\" in metadata) ||\n metadata.name !== packageName ||\n !(\"version\" in metadata) ||\n typeof metadata.version !== \"string\"\n ) {\n throw new Error(`Could not verify the installed ${packageName} version`)\n }\n return metadata.version\n}\n\nconst restartReceiptPath = (): string => join(dirname(configurationPath()), \"upgrade-restart.json\")\n\nconst restartServices = async (\n runner: CommandRunner,\n services: ReadonlyArray<ManagedService>,\n statePath: string,\n state: RestartReceipt,\n preserveDeviceReceipt: boolean,\n): Promise<RestartReceipt> => {\n let current = state\n for (const service of services) {\n current = { ...current, restartingService: service.id }\n await writeReceipt(statePath, current)\n try {\n for (const invocation of service.restart) {\n await checked(runner, invocation, 60_000)\n }\n } catch (cause) {\n current = {\n version: current.version,\n fromVersion: current.fromVersion,\n packageManager: current.packageManager,\n pendingServices: current.pendingServices,\n restartedServices: current.restartedServices,\n }\n await writeReceipt(statePath, current)\n throw cause\n }\n if (service.device && preserveDeviceReceipt) {\n // Some service managers return before terminating this process. The replacement task consumes the marker.\n return current\n }\n current = {\n version: current.version,\n fromVersion: current.fromVersion,\n packageManager: current.packageManager,\n pendingServices: current.pendingServices.filter((id) => id !== service.id),\n restartedServices: [...current.restartedServices, service.id],\n }\n await writeReceipt(statePath, current)\n }\n return current\n}\n\nconst reportedRestartServices = (receipt: RestartReceipt): ReadonlyArray<string> =>\n receipt.restartingService === undefined ||\n receipt.restartedServices.includes(receipt.restartingService)\n ? receipt.restartedServices\n : [...receipt.restartedServices, receipt.restartingService]\n\nexport const upgrade = async (options: UpgradeOptions): Promise<UpgradeResult> => {\n const target = normalizeUpgradeTarget(options.target)\n const runner = options.runner ?? defaultRunner\n const resolveExecutable = options.resolveExecutable ?? trustedExecutable\n const runtimePlatform = options.platform ?? process.platform\n const uid = options.uid ?? process.getuid?.()\n const candidates = await trustedServices(\n serviceCandidates(runtimePlatform, uid),\n resolveExecutable,\n )\n const statePath = options.statePath ?? restartReceiptPath()\n const previous = await readReceipt(statePath)\n\n if (\n previous?.version === options.currentVersion &&\n (target === \"latest\" || target === previous.version)\n ) {\n const byId = new Map(candidates.map((service) => [service.id, service]))\n const pending = previous.pendingServices.flatMap((id) => {\n const service = byId.get(id)\n return service === undefined ? [] : [service]\n })\n const active = await activeServices(runner, pending)\n if (options.dryRun || !options.restart) {\n return {\n upgraded: previous.fromVersion !== previous.version,\n from_version: previous.fromVersion,\n installed_version: previous.version,\n requested_version: previous.version,\n package_manager: previous.packageManager,\n services_restarted: previous.restartedServices,\n services_pending_restart: active.map((service) => service.id),\n resumed_after_restart: false,\n dry_run: options.dryRun,\n }\n }\n const activeIds = new Set(active.map((service) => service.id))\n const completedByRestart = pending.filter(\n (service) =>\n service.device && service.id === previous.restartingService && activeIds.has(service.id),\n )\n const completedIds = new Set(completedByRestart.map((service) => service.id))\n const remaining = active.filter((service) => !completedIds.has(service.id))\n let resumed: RestartReceipt = {\n version: previous.version,\n fromVersion: previous.fromVersion,\n packageManager: previous.packageManager,\n pendingServices: previous.pendingServices.filter((id) => !completedIds.has(id)),\n restartedServices: [\n ...previous.restartedServices,\n ...completedByRestart.map((service) => service.id),\n ],\n }\n if (remaining.length > 0) {\n await writeReceipt(statePath, resumed)\n resumed = await restartServices(\n runner,\n remaining,\n statePath,\n resumed,\n options.delegated === true,\n )\n }\n if (resumed.restartingService === undefined) {\n await rm(statePath, { force: true })\n }\n return {\n upgraded: previous.fromVersion !== previous.version,\n from_version: previous.fromVersion,\n installed_version: previous.version,\n requested_version: previous.version,\n package_manager: previous.packageManager,\n services_restarted: reportedRestartServices(resumed),\n services_pending_restart: [],\n resumed_after_restart: true,\n dry_run: false,\n }\n }\n\n const entrypoint = options.entrypoint ?? process.argv[1]\n if (entrypoint === undefined) {\n throw new Error(\"Could not resolve the Cohall executable path\")\n }\n const canonicalEntrypoint = await realpath(entrypoint)\n const installation = packageInstallation(canonicalEntrypoint, entrypoint)\n const services = await activeServices(runner, candidates)\n await assertServiceInstallations(runner, services, canonicalEntrypoint, entrypoint)\n\n if (options.dryRun) {\n return {\n upgraded: false,\n from_version: options.currentVersion,\n installed_version: options.currentVersion,\n requested_version: target,\n package_manager: installation.manager,\n services_restarted: [],\n services_pending_restart: options.restart ? services.map((service) => service.id) : [],\n resumed_after_restart: false,\n dry_run: true,\n }\n }\n\n let nextVersion = await installedVersion(entrypoint).catch(() => undefined)\n if (nextVersion === undefined || target !== nextVersion) {\n const install = packageInstallCommand(installation, target)\n const installExecutable =\n options.resolveExecutable === undefined\n ? await trustedExecutable(\n install.command,\n installation.prefix === undefined ? {} : { writableRoot: installation.prefix },\n )\n : await resolveExecutable(install.command)\n await checked(runner, { ...install, command: installExecutable })\n nextVersion = await installedVersion(entrypoint)\n }\n if (target !== \"latest\" && nextVersion !== target) {\n throw new Error(`Installed Cohall ${nextVersion}, expected ${target}`)\n }\n const upgraded = nextVersion !== options.currentVersion\n\n if (!options.restart || services.length === 0) {\n await rm(statePath, { force: true })\n return {\n upgraded,\n from_version: options.currentVersion,\n installed_version: nextVersion,\n requested_version: target,\n package_manager: installation.manager,\n services_restarted: [],\n services_pending_restart: options.restart ? [] : services.map((service) => service.id),\n resumed_after_restart: false,\n dry_run: false,\n }\n }\n\n const initial: RestartReceipt = {\n version: nextVersion,\n fromVersion: options.currentVersion,\n packageManager: installation.manager,\n pendingServices: services.map((service) => service.id),\n restartedServices: [],\n }\n await writeReceipt(statePath, initial)\n const completed = await restartServices(\n runner,\n services,\n statePath,\n initial,\n options.delegated === true,\n )\n if (completed.restartingService === undefined) {\n await rm(statePath, { force: true })\n }\n return {\n upgraded,\n from_version: options.currentVersion,\n installed_version: nextVersion,\n requested_version: target,\n package_manager: installation.manager,\n services_restarted: reportedRestartServices(completed),\n services_pending_restart: [],\n resumed_after_restart: false,\n dry_run: false,\n }\n}\n",
24
24
  "import {\n Device,\n SocketEvent,\n decodeSocketEvent,\n maxSocketPayloadBytes,\n now,\n taskSlot,\n version,\n type Bot,\n type Provider,\n type DeviceOperation,\n type OperationId,\n type Task,\n type TaskId,\n} from \"@cohall/protocol\"\nimport * as Providers from \"@cohall/providers\"\nimport { Effect, Schedule, Schema } from \"effect\"\nimport { constants } from \"node:fs\"\nimport { open, realpath, stat } from \"node:fs/promises\"\nimport { arch, hostname, platform } from \"node:os\"\nimport { basename, isAbsolute, relative } from \"node:path\"\nimport { WebSocket, type RawData } from \"ws\"\nimport type { DeviceConfiguration } from \"./config.ts\"\nimport { discoverGrokBots, runGrokBot } from \"./grok-bot.ts\"\nimport { cleanupBotReply } from \"./bot-replies.ts\"\nimport { upgrade, type UpgradeOptions, type UpgradeResult } from \"./upgrade.ts\"\n\nconst maxQueuedRelayMessages = 8\n\nexport class DeviceConnectionError extends Schema.TaggedErrorClass<DeviceConnectionError>()(\n \"Device.ConnectionError\",\n { message: Schema.String },\n) {}\n\ninterface State {\n socket: WebSocket | undefined\n processing: Promise<void>\n readonly terminal: Map<TaskId, string>\n readonly queue: Array<Task>\n readonly sessions: Map<string, string>\n readonly tasks: Map<TaskId, { readonly task: Task; readonly controller: AbortController }>\n readonly completed: Set<TaskId>\n operation: DeviceOperation | undefined\n readonly operationQueue: Array<DeviceOperation>\n readonly operationTerminal: Map<OperationId, string>\n readonly completedOperations: Set<OperationId>\n}\n\nconst socketUrl = (configuration: DeviceConfiguration): string => {\n const url = new URL(configuration.relayUrl)\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n url.pathname = \"/ws/device\"\n return url.toString()\n}\n\nconst providerLabel = (provider: Provider): string => {\n switch (provider) {\n case \"codex\":\n return \"Codex\"\n case \"claude-code\":\n return \"Claude Code\"\n case \"opencode\":\n return \"OpenCode\"\n case \"grok-bot\":\n return \"Grok Bot\"\n }\n}\n\nconst capabilities = (providers: ReadonlyArray<Provider>): Device[\"capabilities\"] => {\n const values: Array<Device[\"capabilities\"][number]> = providers.map((provider) => ({\n id: provider,\n label: providerLabel(provider),\n detail:\n provider === \"grok-bot\"\n ? \"Named bots through this computer's local Grok Bot gateway\"\n : `${providerLabel(provider)} executable detected; authentication is checked when work starts`,\n }))\n if (\n Providers.findExecutable(\"google-chrome\") !== undefined ||\n Providers.findExecutable(\"chromium\") !== undefined ||\n platform() === \"darwin\"\n ) {\n values.push({ id: \"browser-session\", label: \"Signed-in browser\" })\n }\n if (Providers.findExecutable(\"xcodebuild\") !== undefined) {\n values.push({ id: \"xcode\", label: \"Xcode\" })\n }\n if (Providers.findExecutable(\"docker\") !== undefined) {\n values.push({ id: \"docker\", label: \"Docker\" })\n }\n return values\n}\n\nexport const selectProviders = (\n installed: ReadonlyArray<Provider>,\n configured?: ReadonlyArray<Provider>,\n): ReadonlyArray<Provider> =>\n configured === undefined\n ? installed\n : configured.filter((provider) => installed.includes(provider))\n\nconst describeDevice = (\n configuration: DeviceConfiguration,\n status: \"online\" | \"busy\" = \"online\",\n bots: ReadonlyArray<Bot> = [],\n): Device => {\n const operatingSystem = platform()\n const platformName =\n operatingSystem === \"darwin\" || operatingSystem === \"linux\"\n ? operatingSystem\n : operatingSystem === \"win32\"\n ? \"windows\"\n : \"unknown\"\n const installed: ReadonlyArray<Provider> = [\n ...Providers.availableProviders(),\n ...(configuration.grokGateway === undefined ? [] : [\"grok-bot\" as const]),\n ]\n const providers = selectProviders(installed, configuration.providers)\n return Device.make({\n id: configuration.id,\n name: configuration.name,\n hostname: hostname(),\n platform: platformName,\n architecture: arch(),\n status,\n providers,\n ...(providers.includes(\"grok-bot\") ? { bots } : {}),\n capabilities: capabilities(providers),\n workspaces: configuration.workspaces.map((path) => ({\n path,\n label: basename(path) || path,\n })),\n version,\n lastSeenAt: now(),\n })\n}\n\nexport const allowedWorkspace = async (\n configuration: DeviceConfiguration,\n requested: string | undefined,\n): Promise<string> => {\n const selected = requested ?? configuration.workspaces[0]\n if (selected === undefined) {\n throw new Error(\"No workspace is configured on this device\")\n }\n const candidate = await realpath(selected)\n const allowed = configuration.workspaces.some((root) => {\n const child = relative(root, candidate)\n return child === \"\" || (!child.startsWith(\"..\") && !isAbsolute(child))\n })\n if (!allowed) {\n throw new Error(`Workspace ${candidate} is outside this device's configured workspace roots`)\n }\n return candidate\n}\n\ninterface AuthorizedWorkspace {\n readonly cwd: string\n readonly validate: () => Promise<void>\n readonly close: () => Promise<void>\n}\n\nexport const openAllowedWorkspace = async (\n configuration: DeviceConfiguration,\n requested: string | undefined,\n): Promise<AuthorizedWorkspace> => {\n const path = await allowedWorkspace(configuration, requested)\n const operatingSystem = platform()\n const flags =\n constants.O_RDONLY |\n (operatingSystem === \"win32\" ? 0 : constants.O_DIRECTORY | constants.O_NOFOLLOW)\n const handle = await open(path, flags)\n const identity = await handle.stat()\n if (!identity.isDirectory()) {\n await handle.close()\n throw new Error(`Workspace ${path} is not a directory`)\n }\n // macOS resolves cwd after closing non-inherited descriptors during posix_spawn,\n // so /dev/fd cannot safely serve as a directory cwd there.\n const cwd = operatingSystem === \"linux\" ? `/proc/self/fd/${handle.fd}` : path\n return {\n cwd,\n validate: async () => {\n const current = await handle.stat()\n if (!current.isDirectory() || current.dev !== identity.dev || current.ino !== identity.ino) {\n throw new Error(`Workspace ${path} changed before provider startup`)\n }\n if (operatingSystem !== \"linux\") {\n const currentPath = await realpath(path)\n const currentPathIdentity = await stat(currentPath)\n if (currentPathIdentity.dev !== identity.dev || currentPathIdentity.ino !== identity.ino) {\n throw new Error(`Workspace ${path} changed before provider startup`)\n }\n }\n },\n close: () => handle.close(),\n }\n}\n\nconst promptFor = (task: Task, deviceName: string): string => {\n const context =\n task.context === undefined\n ? \"\"\n : `\\n\\nRelevant context supplied by the sending agent:\\n${task.context}`\n return [\n `You are the Cohall agent running on ${deviceName}.`,\n \"Complete the delegated task using this device's local workspace, tools, credentials, and signed-in services.\",\n \"Never read, reveal, copy, or use Cohall configuration files or Cohall authentication tokens.\",\n \"Return a concise, complete result with the evidence the sending agent needs.\",\n `\\nTask:\\n${task.prompt}${context}`,\n ].join(\"\\n\")\n}\n\nconst send = (state: State, event: SocketEvent): void => {\n if (state.socket?.readyState === WebSocket.OPEN) {\n state.socket.send(JSON.stringify(event))\n }\n}\n\nconst sendTerminal = (state: State, taskId: TaskId, event: SocketEvent): void => {\n const payload = JSON.stringify(event)\n state.terminal.set(taskId, payload)\n if (state.socket?.readyState === WebSocket.OPEN) {\n state.socket.send(payload)\n }\n}\n\nconst sendOperationTerminal = (\n state: State,\n operationId: OperationId,\n event: SocketEvent,\n): void => {\n const payload = JSON.stringify(event)\n state.operationTerminal.set(operationId, payload)\n if (state.socket?.readyState === WebSocket.OPEN) {\n state.socket.send(payload)\n }\n}\n\nconst remember = (state: State, taskId: TaskId): void => {\n state.completed.add(taskId)\n if (state.completed.size <= 1_000) {\n return\n }\n const oldest = state.completed.values().next()\n if (!oldest.done) {\n state.completed.delete(oldest.value)\n state.terminal.delete(oldest.value)\n }\n}\n\nconst rememberOperation = (state: State, operationId: OperationId): void => {\n state.completedOperations.add(operationId)\n if (state.completedOperations.size <= 100) {\n return\n }\n const oldest = state.completedOperations.values().next()\n if (!oldest.done) {\n state.completedOperations.delete(oldest.value)\n state.operationTerminal.delete(oldest.value)\n }\n}\n\nconst sessionKey = (task: Task): string => `${task.threadId}:${task.provider}`\n\nconst drain = (configuration: DeviceConfiguration, state: State): void => {\n if (state.operation !== undefined) {\n return\n }\n if (state.tasks.size === 0) {\n const operation = state.operationQueue.shift()\n if (operation !== undefined) {\n executeOperation(configuration, state, operation)\n return\n }\n }\n const occupied = new Set([...state.tasks.values()].map(({ task }) => taskSlot(task)))\n for (let index = 0; index < state.queue.length; ) {\n const next = state.queue[index]\n if (next === undefined || occupied.has(taskSlot(next))) {\n index += 1\n continue\n }\n state.queue.splice(index, 1)\n occupied.add(taskSlot(next))\n execute(configuration, state, next)\n }\n}\n\nconst execute = (configuration: DeviceConfiguration, state: State, task: Task): void => {\n if (state.tasks.has(task.id) || state.completed.has(task.id)) {\n return\n }\n const controller = new AbortController()\n state.tasks.set(task.id, { task, controller })\n send(state, SocketEvent.make({ _tag: \"TaskAccepted\", taskId: task.id }))\n\n const workflow: Effect.Effect<Providers.RunResult, Providers.ProviderError> = Effect.gen(\n function* () {\n if (task.provider === \"grok-bot\") {\n return yield* Effect.tryPromise({\n try: (signal) => runGrokBot(configuration.grokGateway, task, signal),\n catch: (cause) =>\n new Providers.ProviderRunError({\n provider: task.provider,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n }\n const workspace = yield* Effect.tryPromise({\n try: () => openAllowedWorkspace(configuration, task.workspace),\n catch: (cause) =>\n new Providers.ProviderRunError({\n provider: task.provider,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n const sessionId = task.providerSessionId ?? state.sessions.get(sessionKey(task))\n return yield* Providers.run({\n provider: task.provider,\n threadId: task.threadId,\n taskId: task.id,\n prompt: promptFor(task, configuration.name),\n cwd: workspace.cwd,\n beforeSpawn: workspace.validate,\n ...(sessionId === undefined ? {} : { sessionId }),\n ...(configuration.model === undefined ? {} : { model: configuration.model }),\n ...(configuration.sandbox === undefined ? {} : { sandbox: configuration.sandbox }),\n }).pipe(Effect.ensuring(Effect.promise(() => workspace.close().catch(() => undefined))))\n },\n )\n\n void Effect.runPromise(workflow, { signal: controller.signal })\n .then((result) => {\n if (result.sessionId !== undefined) {\n state.sessions.set(sessionKey(task), result.sessionId)\n }\n remember(state, task.id)\n sendTerminal(\n state,\n task.id,\n SocketEvent.make({\n _tag: \"TaskFinished\",\n taskId: task.id,\n result: result.result,\n ...(result.sessionId === undefined ? {} : { providerSessionId: result.sessionId }),\n }),\n )\n })\n .catch((cause: unknown) => {\n remember(state, task.id)\n sendTerminal(\n state,\n task.id,\n controller.signal.aborted\n ? SocketEvent.make({ _tag: \"TaskCancelled\", taskId: task.id })\n : SocketEvent.make({\n _tag: \"TaskFailed\",\n taskId: task.id,\n error: (cause instanceof Error ? cause.message : String(cause)).slice(0, 16_384),\n }),\n )\n })\n .finally(() => {\n state.tasks.delete(task.id)\n drain(configuration, state)\n })\n}\n\nconst executeOperation = (\n configuration: DeviceConfiguration,\n state: State,\n operation: DeviceOperation,\n): void => {\n if (state.operation !== undefined || state.completedOperations.has(operation.id)) {\n return\n }\n state.operation = operation\n send(state, SocketEvent.make({ _tag: \"OperationAccepted\", operationId: operation.id }))\n void performDeviceOperation(operation, version)\n .then((result) => {\n rememberOperation(state, operation.id)\n sendOperationTerminal(\n state,\n operation.id,\n SocketEvent.make({\n _tag: \"OperationFinished\",\n operationId: operation.id,\n result,\n }),\n )\n })\n .catch((cause: unknown) => {\n rememberOperation(state, operation.id)\n sendOperationTerminal(\n state,\n operation.id,\n SocketEvent.make({\n _tag: \"OperationFailed\",\n operationId: operation.id,\n error: (cause instanceof Error ? cause.message : String(cause)).slice(0, 16_384),\n }),\n )\n })\n .finally(() => {\n state.operation = undefined\n drain(configuration, state)\n })\n}\n\nconst scheduleOperation = (\n configuration: DeviceConfiguration,\n state: State,\n operation: DeviceOperation,\n): void => {\n if (\n state.completedOperations.has(operation.id) ||\n state.operation?.id === operation.id ||\n state.operationQueue.some((pending) => pending.id === operation.id)\n ) {\n return\n }\n if (state.tasks.size > 0 || state.operation !== undefined) {\n if (state.operationQueue.length >= 10) {\n state.socket?.close(4008, \"Operation queue limit reached\")\n return\n }\n state.operationQueue.push(operation)\n return\n }\n executeOperation(configuration, state, operation)\n}\n\nexport const performDeviceOperation = (\n operation: DeviceOperation,\n currentVersion: string,\n runUpgrade: (options: UpgradeOptions) => Promise<UpgradeResult> = upgrade,\n): Promise<string> =>\n runUpgrade({\n currentVersion,\n target: operation.requestedVersion,\n restart: operation.restart,\n dryRun: false,\n delegated: true,\n }).then((result) => JSON.stringify(result))\n\nconst schedule = (configuration: DeviceConfiguration, state: State, task: Task): void => {\n if (\n state.tasks.has(task.id) ||\n state.completed.has(task.id) ||\n state.queue.some((queued) => queued.id === task.id)\n ) {\n return\n }\n if (task.providerSessionId !== undefined) {\n state.sessions.set(sessionKey(task), task.providerSessionId)\n }\n if (\n [...state.tasks.values()].some(({ task: active }) => taskSlot(active) === taskSlot(task)) ||\n state.operation !== undefined\n ) {\n if (state.queue.length >= 100) {\n state.socket?.close(4008, \"Task queue limit reached\")\n return\n }\n state.queue.push(task)\n return\n }\n execute(configuration, state, task)\n}\n\nconst cancel = (state: State, taskId: TaskId): void => {\n const running = state.tasks.get(taskId)\n if (running !== undefined) {\n if (running.task.provider !== \"grok-bot\") {\n running.controller.abort()\n }\n return\n }\n const index = state.queue.findIndex((task) => task.id === taskId)\n if (index !== -1) {\n state.queue.splice(index, 1)\n }\n remember(state, taskId)\n sendTerminal(state, taskId, SocketEvent.make({ _tag: \"TaskCancelled\", taskId }))\n}\n\nconst connect = (\n configuration: DeviceConfiguration,\n state: State,\n): Effect.Effect<void, DeviceConnectionError> =>\n Effect.tryPromise({\n try: (signal) =>\n new Promise<void>((complete) => {\n const socket = new WebSocket(socketUrl(configuration), {\n maxPayload: maxSocketPayloadBytes,\n perMessageDeflate: false,\n allowSynchronousEvents: false,\n })\n let bots: ReadonlyArray<Bot> = []\n let refreshing = false\n const refreshBots = async (): Promise<void> => {\n if (\n refreshing ||\n configuration.grokGateway === undefined ||\n (configuration.providers !== undefined && !configuration.providers.includes(\"grok-bot\"))\n ) {\n return\n }\n refreshing = true\n bots = await discoverGrokBots(configuration.grokGateway).catch(() => [])\n refreshing = false\n if (!closed) {\n send(\n state,\n SocketEvent.make({\n _tag: \"DeviceHeartbeat\",\n deviceId: configuration.id,\n status: state.tasks.size > 0 || state.operation !== undefined ? \"busy\" : \"online\",\n bots,\n }),\n )\n }\n }\n const heartbeat = setInterval(() => {\n send(\n state,\n SocketEvent.make({\n _tag: \"DeviceHeartbeat\",\n deviceId: configuration.id,\n status: state.tasks.size > 0 || state.operation !== undefined ? \"busy\" : \"online\",\n ...(configuration.grokGateway === undefined ? {} : { bots }),\n }),\n )\n void refreshBots()\n }, 15_000)\n let closed = false\n let queuedMessages = 0\n const close = (): void => {\n if (closed) {\n return\n }\n closed = true\n clearInterval(heartbeat)\n if (state.socket === socket) {\n state.socket = undefined\n }\n complete()\n }\n signal.addEventListener(\n \"abort\",\n () => {\n socket.close()\n close()\n },\n { once: true },\n )\n socket.once(\"open\", () => {\n socket.send(\n JSON.stringify(SocketEvent.make({ _tag: \"Authenticate\", token: configuration.token })),\n )\n })\n socket.on(\"message\", (message: RawData) => {\n if (queuedMessages >= maxQueuedRelayMessages) {\n socket.close(4008, \"Message queue limit reached\")\n return\n }\n queuedMessages += 1\n state.processing = state.processing\n .then(async () => {\n if (closed) {\n return\n }\n const text = Buffer.isBuffer(message)\n ? message.toString(\"utf8\")\n : message instanceof ArrayBuffer\n ? Buffer.from(message).toString(\"utf8\")\n : Array.isArray(message)\n ? Buffer.concat(message).toString(\"utf8\")\n : Buffer.from(message).toString(\"utf8\")\n const event = await Effect.runPromise(\n Effect.try({\n try: () => JSON.parse(text) as unknown,\n catch: () => new DeviceConnectionError({ message: \"Relay sent invalid JSON\" }),\n }).pipe(Effect.flatMap(decodeSocketEvent)),\n )\n if (event._tag === \"Connected\") {\n state.socket = socket\n socket.send(\n JSON.stringify(\n SocketEvent.make({\n _tag: \"DeviceHello\",\n device: describeDevice(\n configuration,\n state.tasks.size > 0 || state.operation !== undefined ? \"busy\" : \"online\",\n bots,\n ),\n }),\n ),\n )\n for (const payload of state.terminal.values()) {\n socket.send(payload)\n }\n for (const payload of state.operationTerminal.values()) {\n socket.send(payload)\n }\n void refreshBots()\n return\n }\n if (event._tag === \"TaskAssigned\") {\n schedule(configuration, state, event.task)\n return\n }\n if (event._tag === \"CancelTask\") {\n cancel(state, event.taskId)\n return\n }\n if (event._tag === \"TaskSettled\") {\n state.terminal.delete(event.taskId)\n void cleanupBotReply(event.taskId).catch(() => {\n console.error(`Could not remove local bot reply for settled task ${event.taskId}`)\n })\n return\n }\n if (event._tag === \"OperationAssigned\") {\n scheduleOperation(configuration, state, event.operation)\n return\n }\n if (event._tag === \"OperationSettled\") {\n state.operationTerminal.delete(event.operationId)\n return\n }\n if (event._tag === \"Error\") {\n console.error(`Relay error: ${event.message}`)\n }\n })\n .catch((cause: unknown) => {\n console.error(\n `Invalid relay event: ${cause instanceof Error ? cause.message : String(cause)}`,\n )\n })\n .finally(() => {\n queuedMessages = Math.max(0, queuedMessages - 1)\n })\n })\n socket.once(\"close\", close)\n socket.once(\"error\", () => socket.close())\n }),\n catch: (cause) =>\n new DeviceConnectionError({\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n\nexport const runDaemon = (\n configuration: DeviceConfiguration,\n): Effect.Effect<void, DeviceConnectionError> => {\n const state: State = {\n socket: undefined,\n processing: Promise.resolve(),\n terminal: new Map(),\n queue: [],\n sessions: new Map(),\n tasks: new Map(),\n completed: new Set(),\n operation: undefined,\n operationQueue: [],\n operationTerminal: new Map(),\n completedOperations: new Set(),\n }\n return connect(configuration, state).pipe(\n Effect.repeat({ schedule: Schedule.spaced(\"2 seconds\") }),\n Effect.ensuring(\n Effect.sync(() => {\n state.socket?.close()\n for (const { controller } of state.tasks.values()) {\n controller.abort()\n }\n }),\n ),\n )\n}\n",
25
25
  "import { RelayClient } from \"@cohall/client\"\nimport { Provider, TaskId, ThreadId, version } from \"@cohall/protocol\"\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { Effect } from \"effect\"\nimport * as z from \"zod/v4\"\nimport type { ClientConfiguration } from \"./config.ts\"\nimport { createDelegation, listBots, taskResult, threadContext, waitForTask } from \"./delegation.ts\"\n\nconst output = (value: unknown) => ({\n content: [{ type: \"text\" as const, text: JSON.stringify(value, null, 2) }],\n})\n\nexport const runMcp = async (configuration: ClientConfiguration): Promise<void> => {\n const client = RelayClient.make({\n baseUrl: configuration.relayUrl,\n token: configuration.token,\n })\n const server = new McpServer({ name: \"cohall\", version })\n\n server.registerTool(\n \"list_devices\",\n {\n title: \"List Cohall devices\",\n description:\n \"List devices, their availability, local providers, capabilities, and allowed workspaces.\",\n inputSchema: {},\n },\n async () => output(await Effect.runPromise(client.devices())),\n )\n\n server.registerTool(\n \"list_bots\",\n {\n title: \"List Cohall bots\",\n description:\n \"List named Grok Bots on paired devices, their host availability, and unambiguous targets for delegate. Bot names can also be used when unique.\",\n inputSchema: {},\n },\n async () => output(listBots(await Effect.runPromise(client.devices()))),\n )\n\n server.registerTool(\n \"delegate\",\n {\n title: \"Send work to a device or bot\",\n description:\n \"Send focused work to a Cohall device or named Grok Bot. When the request depends on the current conversation, distill its motivation, relevant facts, prior findings, constraints, and desired decision into context; Cohall cannot read the host transcript. Never forward unrelated transcript content. Reuse thread_id for related follow-ups. Grok Bots use their existing conversation; a Cohall thread does not isolate it.\",\n inputSchema: {\n prompt: z.string().min(1).max(131_072),\n target: z\n .string()\n .optional()\n .describe(\n \"Device name, hostname or ID; @BotName; or @device/BotName. Use list_bots targets to disambiguate.\",\n ),\n provider: z\n .enum(Provider.literals)\n .optional()\n .describe(\"Inferred as grok-bot for a bot target; otherwise defaults to codex.\"),\n context: z\n .string()\n .max(131_072)\n .optional()\n .describe(\n \"Distilled context the target needs: why the user is asking, relevant facts and prior findings, constraints, and the intended decision. The calling agent must supply this when the prompt depends on its conversation; omit it only for a self-contained task.\",\n ),\n thread_id: z.string().uuid().optional(),\n parent_task_id: z\n .string()\n .uuid()\n .optional()\n .describe(\"The task delegating this work. Inherited from COHALL_TASK_ID when present.\"),\n workspace: z\n .string()\n .max(4096)\n .optional()\n .describe(\"Coding provider workspace. Omit for named Grok Bots.\"),\n wait: z.boolean().default(true),\n timeout_seconds: z.number().int().min(5).max(86_400).default(900),\n },\n },\n async ({\n prompt,\n target,\n provider,\n context,\n thread_id,\n parent_task_id,\n workspace,\n wait,\n timeout_seconds,\n }) => {\n const task = await Effect.runPromise(\n createDelegation(client, configuration, {\n prompt,\n ...(provider === undefined ? {} : { provider }),\n ...(target === undefined ? {} : { target }),\n ...(context === undefined ? {} : { context }),\n ...(thread_id === undefined ? {} : { threadId: ThreadId.make(thread_id) }),\n ...(parent_task_id === undefined ? {} : { parentTaskId: TaskId.make(parent_task_id) }),\n ...(workspace === undefined ? {} : { workspace }),\n }),\n )\n return output(\n taskResult(\n wait ? await Effect.runPromise(waitForTask(client, task, timeout_seconds)) : task,\n ),\n )\n },\n )\n\n server.registerTool(\n \"task_status\",\n {\n title: \"Get delegated task status\",\n description: \"Read the current state and result of a Cohall task.\",\n inputSchema: { task_id: z.string().uuid() },\n },\n async ({ task_id }) =>\n output(taskResult(await Effect.runPromise(client.getTask(TaskId.make(task_id))))),\n )\n\n server.registerTool(\n \"task_trace\",\n {\n title: \"Trace a delegated task\",\n description:\n \"Read the redacted relay and device lifecycle for troubleshooting a Cohall task.\",\n inputSchema: { task_id: z.string().uuid() },\n },\n async ({ task_id }) => output(await Effect.runPromise(client.traceTask(TaskId.make(task_id)))),\n )\n\n server.registerTool(\n \"wait_task\",\n {\n title: \"Wait for delegated work\",\n description: \"Wait for a Cohall task to finish and return its final result.\",\n inputSchema: {\n task_id: z.string().uuid(),\n timeout_seconds: z.number().int().min(5).max(86_400).default(900),\n },\n },\n async ({ task_id, timeout_seconds }) => {\n const task = await Effect.runPromise(client.getTask(TaskId.make(task_id)))\n return output(taskResult(await Effect.runPromise(waitForTask(client, task, timeout_seconds))))\n },\n )\n\n server.registerTool(\n \"cancel_task\",\n {\n title: \"Cancel delegated work\",\n description:\n \"Request cancellation of coding work or a queued Bot task. Active Grok Bot tasks must be stopped in Grok Bot.\",\n inputSchema: { task_id: z.string().uuid() },\n },\n async ({ task_id }) =>\n output(taskResult(await Effect.runPromise(client.cancelTask(TaskId.make(task_id))))),\n )\n\n server.registerTool(\n \"thread_context\",\n {\n title: \"Read a Cohall thread\",\n description: \"Read shared task prompts and final results for a cross-device thread.\",\n inputSchema: { thread_id: z.string().uuid() },\n },\n async ({ thread_id }) =>\n output(await Effect.runPromise(threadContext(client, ThreadId.make(thread_id)))),\n )\n\n await server.connect(new StdioServerTransport())\n}\n"
26
26
  ],
27
- "mappings": "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",
28
- "debugId": "78963F23872A4D6564756E2164756E21",
27
+ "mappings": "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",
28
+ "debugId": "B9C02E5590F539C264756E2164756E21",
29
29
  "names": []
30
30
  }