@wordinweb/agent 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -16
- package/dist/{chunk-E7AFDS2O.js → chunk-EMDLXVNY.js} +20243 -8902
- package/dist/chunk-EMDLXVNY.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +330 -36
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1578 -100
- package/dist/index.js +43 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-E7AFDS2O.js.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { webcrypto } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { chmodSync, realpathSync, rmSync } from \"node:fs\";\nimport { createConnection, createServer, type Socket } from \"node:net\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createInterface } from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport WebSocket from \"ws\";\nimport {\n CollabConnection,\n EncryptedCollabConnection,\n createWebSocketTransport,\n stretchShareCode,\n type ConnectionCallbacks,\n type ParticipantProfile,\n type RosterEntry,\n} from \"@wordinweb/collab/client\";\nimport { AgentDocument } from \"./document.js\";\n\nif (!globalThis.crypto) Object.defineProperty(globalThis, \"crypto\", { value: webcrypto });\n\ninterface InvitePayload {\n version: 1;\n room: { wsUrl: string; httpBase: string; docId: string; docKey?: string; shareCode?: string };\n invite: { inviteId: string; token: string; chatKey: string; expiresAt: number };\n agent: { name: string; instructions: string; mode?: AgentMode };\n}\n\ntype AgentMode = \"suggest\" | \"edit\";\n\ntype WakeTarget = { provider: \"codex\" | \"claude\"; sessionId: string };\n\nconst AGENT_MODE_CONTROL_PREFIX = \"\\u0000wordinweb-agent-mode:\";\nconst AGENT_PACKAGE_URL = \"https://collab.word-in-web.com/wordinweb-agent.tgz?v=short-invite-3\";\n\ninterface Command {\n id?: string | number;\n command?: string;\n request?: Record<string, unknown>;\n category?: string;\n kind?: string;\n text?: string;\n timeoutMs?: number;\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array {\n const padded = value.replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(Math.ceil(value.length / 4) * 4, \"=\");\n return Uint8Array.from(Buffer.from(padded, \"base64\"));\n}\n\nfunction bytesToBase64Url(value: Uint8Array): string {\n return Buffer.from(value).toString(\"base64url\");\n}\n\nasync function parseInvite(url: string): Promise<InvitePayload> {\n const parsed = new URL(url);\n const encoded = parsed.hash.match(/(?:^#|&)invite=([A-Za-z0-9_-]+)/)?.[1];\n let payload: InvitePayload;\n if (encoded) {\n payload = JSON.parse(new TextDecoder().decode(base64UrlToBytes(encoded))) as InvitePayload;\n } else {\n const values = new URLSearchParams(parsed.hash.slice(1));\n const inviteId = values.get(\"i\");\n const secret = values.get(\"k\");\n if (!inviteId || !/^[A-Za-z0-9_-]{16,64}$/.test(inviteId) || !secret) throw new Error(\"The URL has no AI invitation payload\");\n const response = await fetch(new URL(`/agent-invites/${inviteId}`, parsed.origin));\n if (!response.ok) throw new Error(response.status === 404 ? \"The AI invitation is unavailable or expired\" : `The AI invitation could not be loaded (${response.status})`);\n const stored = await response.json() as { iv: string; ciphertext: string; expiresAt: number };\n if (stored.expiresAt <= Date.now()) throw new Error(\"The AI invitation has expired\");\n const key = await crypto.subtle.importKey(\"raw\", base64UrlToBytes(secret) as BufferSource, \"AES-GCM\", false, [\"decrypt\"]);\n const plaintext = await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: base64UrlToBytes(stored.iv) as BufferSource,\n additionalData: new TextEncoder().encode(`wordinweb-agent-invite:${inviteId}`) as BufferSource,\n },\n key,\n base64UrlToBytes(stored.ciphertext) as BufferSource,\n );\n payload = JSON.parse(new TextDecoder().decode(plaintext)) as InvitePayload;\n }\n if (payload.version !== 1) throw new Error(\"The AI invitation version is unsupported\");\n if (payload.invite.expiresAt <= Date.now()) throw new Error(\"The AI invitation has expired\");\n return payload;\n}\n\nfunction parseAgentModeControl(text: string): AgentMode | null {\n if (!text.startsWith(AGENT_MODE_CONTROL_PREFIX)) return null;\n const mode = text.slice(AGENT_MODE_CONTROL_PREFIX.length);\n return mode === \"suggest\" || mode === \"edit\" ? mode : null;\n}\n\nfunction editRequestForMode(request: Record<string, unknown> | undefined, mode: AgentMode): Record<string, unknown> | undefined {\n if (mode === \"edit\" || !request) return request;\n if (!Array.isArray(request.operations)) return request;\n const operations = request.operations.map((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Each edit operation must be an object\");\n const operation = value as Record<string, unknown>;\n switch (operation.kind) {\n case \"insertText\":\n case \"splitParagraph\":\n return { ...operation, suggest: true };\n case \"deleteText\":\n return {\n kind: \"suggestRevision\",\n ranges: [{ blockRef: operation.blockRef, runRef: operation.runRef, start: operation.start, end: operation.end }],\n };\n case \"mergeParagraph\":\n return { kind: \"suggestRevision\", marks: [{ blockRef: operation.blockRef, glyph: \"del\" }] };\n case \"suggestRevision\":\n case \"commentRun\":\n case \"replyComment\":\n return operation;\n default:\n throw new Error(`${String(operation.kind)} is unavailable in suggestion mode. Ask the inviter to switch this agent to editing mode`);\n }\n });\n return { ...request, operations };\n}\n\nfunction randomId(prefix: string): string {\n return `${prefix}_${bytesToBase64Url(crypto.getRandomValues(new Uint8Array(16)))}`;\n}\n\nexport function detectWakeTarget(env: NodeJS.ProcessEnv = process.env): WakeTarget | null {\n const codexSessionId = env.CODEX_THREAD_ID?.trim();\n if (codexSessionId && /^[A-Za-z0-9_-]{8,128}$/.test(codexSessionId)) {\n return { provider: \"codex\", sessionId: codexSessionId };\n }\n const claudeSessionId = env.CLAUDE_CODE_SESSION_ID?.trim();\n if (claudeSessionId && /^[A-Za-z0-9_-]{8,128}$/.test(claudeSessionId)) {\n return { provider: \"claude\", sessionId: claudeSessionId };\n }\n return null;\n}\n\nexport function agentWakePrompt(agentSessionId: string, text: string): string {\n return [\n \"An authenticated private WordInWeb message resumed this agent task.\",\n `The inviter's message is ${JSON.stringify(text)}.`,\n `The detached document bridge session is ${agentSessionId}. Do not run the connect command again.`,\n `Run document commands with: npx -y --package='${AGENT_PACKAGE_URL}' wordinweb-agent session '${agentSessionId}' '<JSON command>'`,\n 'Start with sync. For a broad text task, inspect all non-empty stories in one compact call: {\"command\":\"inspect\",\"request\":{\"kind\":\"context\"}}. Use overview, read, object, or spatial only when the task needs their extra detail.',\n \"Inspect the relevant content before every edit. If an edit returns needs_sync, sync and inspect again.\",\n \"Complete this task, then send the inviter a concise result with the chat command.\",\n \"End this agent turn after the reply. Do not call wait. The detached bridge will resume this task for the next message.\",\n ].join(\"\\n\\n\");\n}\n\nfunction write(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n}\n\ntype Emit = (value: unknown) => void;\n\nfunction sessionSocketPath(sessionId: string): string {\n if (!/^session_[A-Za-z0-9_-]{16,128}$/.test(sessionId)) throw new Error(\"The agent session ID is invalid\");\n return process.platform === \"win32\"\n ? `\\\\\\\\.\\\\pipe\\\\wordinweb-agent-${sessionId}`\n : join(\"/tmp\", `wordinweb-agent-${sessionId}.sock`);\n}\n\nasync function importChatKey(value: string): Promise<CryptoKey> {\n return crypto.subtle.importKey(\"raw\", base64UrlToBytes(value) as BufferSource, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nfunction chatAad(agentClientId: string, messageId: string): Uint8Array {\n return new TextEncoder().encode(`wordinweb-agent-chat:${agentClientId}:${messageId}`);\n}\n\nasync function encryptChat(key: CryptoKey, agentClientId: string, messageId: string, text: string) {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const ciphertext = await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv: iv as BufferSource, additionalData: chatAad(agentClientId, messageId) as BufferSource },\n key,\n new TextEncoder().encode(text),\n );\n return { iv: bytesToBase64Url(iv), ciphertext: bytesToBase64Url(new Uint8Array(ciphertext)) };\n}\n\nasync function decryptChat(\n key: CryptoKey,\n agentClientId: string,\n messageId: string,\n iv: string,\n ciphertext: string,\n): Promise<string> {\n const plaintext = await crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv: base64UrlToBytes(iv) as BufferSource, additionalData: chatAad(agentClientId, messageId) as BufferSource },\n key,\n base64UrlToBytes(ciphertext) as BufferSource,\n );\n return new TextDecoder().decode(plaintext);\n}\n\nexport async function connectAgent(\n invitationUrl: string,\n inputStream: NodeJS.ReadableStream = process.stdin,\n emit: Emit = write,\n): Promise<void> {\n const payload = await parseInvite(invitationUrl);\n let mode: AgentMode = payload.agent.mode === \"edit\" ? \"edit\" : \"suggest\";\n const clientId = randomId(\"agent\");\n const socket = new WebSocket(payload.room.wsUrl);\n const transport = createWebSocketTransport(socket as never);\n const chatKey = await importChatKey(payload.invite.chatKey);\n let connection: CollabConnection;\n let revision = 0;\n let ready = false;\n const connectionState: { current: \"reconnecting\" | \"live\" | \"offline\" } = { current: \"reconnecting\" };\n let roster: RosterEntry[] = [];\n let lastActivityIndex = 0;\n const events: unknown[] = [];\n const waiters: Array<(event: unknown) => void> = [];\n\n const publish = (event: unknown): void => {\n const waiter = waiters.shift();\n if (waiter) waiter(event);\n else events.push(event);\n emit(event);\n };\n const heartbeat = setInterval(() => {\n if (socket.readyState === WebSocket.OPEN) socket.ping();\n }, 25_000);\n socket.addEventListener(\"close\", (event) => {\n connectionState.current = \"offline\";\n clearInterval(heartbeat);\n publish({ event: \"connection_closed\", code: event.code, reason: event.reason || undefined });\n });\n\n let readyResolve: (() => void) | null = null;\n let readyReject: ((error: Error) => void) | null = null;\n const readyPromise = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n const callbacks: ConnectionCallbacks = {\n onChange: () => {\n revision++;\n if (connection?.ready && !ready) {\n ready = true;\n connectionState.current = \"live\";\n readyResolve?.();\n return;\n }\n if (ready) publish({ event: \"document_changed\", revision: String(revision) });\n },\n onRoster: (next) => {\n roster = next;\n if (ready) publish({ event: \"roster\", roster });\n },\n onRefused: (reason) => {\n const error = new Error(`Room connection refused: ${reason}`);\n readyReject?.(error);\n if (ready) publish({ event: \"refused\", reason });\n },\n onAgentChat: (message) => {\n if (message.agentClientId !== clientId || message.sender !== \"inviter\") return;\n void decryptChat(chatKey, clientId, message.messageId, message.iv, message.ciphertext).then(\n (text) => {\n const nextMode = parseAgentModeControl(text);\n if (nextMode) {\n mode = nextMode;\n publish({ event: \"mode_changed\", mode });\n } else publish({ event: \"chat\", messageId: message.messageId, text });\n },\n () => publish({ event: \"chat_error\", messageId: message.messageId }),\n );\n },\n onError: ({ where, error }) => publish({ event: \"connection_error\", where, message: error instanceof Error ? error.message : String(error) }),\n };\n\n const stretched = payload.room.docKey && payload.room.shareCode\n ? await stretchShareCode(payload.room.shareCode, payload.room.docId)\n : undefined;\n const codeProof = stretched ? Buffer.from(stretched).toString(\"base64\") : undefined;\n connection = payload.room.docKey\n ? new EncryptedCollabConnection(\n transport,\n clientId,\n payload.room.docKey,\n callbacks,\n stretched,\n undefined,\n payload.room.httpBase ? { httpBase: payload.room.httpBase } : undefined,\n ) as unknown as CollabConnection\n : new CollabConnection(\n transport,\n clientId,\n callbacks,\n payload.room.httpBase ? { httpBase: payload.room.httpBase } : undefined,\n );\n const profile: ParticipantProfile = { name: payload.agent.name || \"AI Agent\", color: \"\" };\n connection.join(payload.room.docId, undefined, {\n profile,\n codeProof,\n agentInvite: { inviteId: payload.invite.inviteId, token: payload.invite.token },\n });\n\n const timeout = setTimeout(() => readyReject?.(new Error(\"The document did not become ready within 30 seconds\")), 30_000);\n await readyPromise.finally(() => clearTimeout(timeout));\n const document = AgentDocument.connect({\n getDocument: () => connection.doc,\n getRevision: () => revision,\n allocateIds: (count) => connection.allocIds(count),\n submit: (operation) => connection.submit(operation),\n setPresence: (position) => {\n const deadline = Date.now() + 30_000;\n const send = (): void => {\n if (connection.pendingCount === 0) connection.setPresence(position);\n else if (connectionState.current === \"live\" && Date.now() < deadline) setTimeout(send, 25);\n };\n send();\n },\n uploadMedia: (bytes) => connection.uploadMedia(bytes),\n getConnectionState: () => connectionState.current,\n }, { provenance: { author: profile.name } });\n\n emit({\n event: \"ready\",\n clientId,\n revision: document.revision,\n mode,\n instructions: payload.agent.instructions,\n commands: [\"sync\", \"capabilities\", \"inspect\", \"edit\", \"chat\", \"wait\", \"close\"],\n });\n\n const nextEvent = (timeoutMs: number): Promise<unknown> => {\n if (events.length) return Promise.resolve(events.shift());\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n const index = waiters.indexOf(done);\n if (index >= 0) waiters.splice(index, 1);\n resolve({ event: \"wait_timeout\" });\n }, timeoutMs);\n const done = (event: unknown) => {\n clearTimeout(timer);\n resolve(event);\n };\n waiters.push(done);\n });\n };\n\n const respond = (id: Command[\"id\"], result?: unknown, error?: unknown): void => {\n emit(error === undefined ? { id, ok: true, result } : { id, ok: false, error: String(error) });\n };\n const input = createInterface({ input: inputStream, terminal: false });\n for await (const line of input) {\n if (!line.trim()) continue;\n let command: Command;\n try {\n command = JSON.parse(line) as Command;\n } catch {\n respond(undefined, undefined, \"Each input line must be valid JSON\");\n continue;\n }\n try {\n switch (command.command) {\n case \"sync\": {\n const activity = connection.activity.slice(lastActivityIndex);\n lastActivityIndex = connection.activity.length;\n respond(command.id, { revision: document.revision, activity, roster, mode });\n break;\n }\n case \"capabilities\":\n respond(command.id, document.capabilities(command.category as never, command.kind as never));\n break;\n case \"inspect\":\n respond(command.id, document.inspect(command.request as never));\n break;\n case \"edit\":\n try {\n if (connectionState.current !== \"live\") throw new Error(\"The collaboration connection is offline. Reconnect before editing\");\n respond(command.id, await document.edit(editRequestForMode(command.request, mode) as never));\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"revision is stale\")) {\n respond(command.id, { status: \"needs_sync\", latestRevision: document.revision });\n } else throw error;\n }\n break;\n case \"chat\": {\n if (connectionState.current !== \"live\") throw new Error(\"The collaboration connection is offline. Reconnect before sending chat\");\n if (!command.text?.trim()) throw new Error(\"Chat text is required\");\n const messageId = randomId(\"message\");\n const sealed = await encryptChat(chatKey, clientId, messageId, command.text.trim());\n connection.sendAgentChat(clientId, messageId, sealed.iv, sealed.ciphertext);\n respond(command.id, { messageId });\n break;\n }\n case \"wait\":\n respond(command.id, await nextEvent(Math.min(Math.max(command.timeoutMs ?? 30_000, 1), 55_000)));\n break;\n case \"close\":\n respond(command.id, { closed: true });\n clearInterval(heartbeat);\n socket.close();\n input.close();\n return;\n default:\n throw new Error(\"Unknown command\");\n }\n } catch (error) {\n respond(command.id, undefined, error instanceof Error ? error.message : String(error));\n }\n }\n clearInterval(heartbeat);\n socket.close();\n}\n\ninterface PendingCommand {\n socket: Socket;\n originalId?: string | number;\n}\n\nfunction sendSocketValue(socket: Socket, value: unknown): void {\n socket.end(`${JSON.stringify(value)}\\n`);\n}\n\nasync function listen(server: ReturnType<typeof createServer>, path: string): Promise<void> {\n if (process.platform !== \"win32\") rmSync(path, { force: true });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(path, () => {\n server.off(\"error\", reject);\n if (process.platform !== \"win32\") chmodSync(path, 0o600);\n resolve();\n });\n });\n}\n\nasync function runDaemon(invitationUrl: string, sessionId: string): Promise<void> {\n const path = sessionSocketPath(sessionId);\n const input = new PassThrough();\n const wakeTarget = detectWakeTarget();\n const wakeQueue: string[] = [];\n const pending = new Map<string, PendingCommand>();\n let readyEvent: Record<string, unknown> | null = null;\n let fatalError: string | null = null;\n let closeTimer: ReturnType<typeof setTimeout> | null = null;\n let wakeChild: ReturnType<typeof spawn> | null = null;\n let requestCounter = 0;\n let stopped = false;\n\n const sendWakeFailure = (): void => {\n input.write(`${JSON.stringify({ command: \"chat\", text: \"I could not resume the agent task. Reopen the original Codex or Claude task and reconnect this AI.\" })}\\n`);\n };\n\n const startNextWake = (): void => {\n if (!wakeTarget || wakeChild || wakeQueue.length === 0 || stopped) return;\n const prompt = agentWakePrompt(sessionId, wakeQueue.shift()!);\n const childEnv = { ...process.env };\n delete childEnv.CODEX_THREAD_ID;\n delete childEnv.CLAUDE_CODE_SESSION_ID;\n delete childEnv.CLAUDECODE;\n wakeChild = wakeTarget.provider === \"codex\"\n ? spawn(\"codex\", [\"exec\", \"resume\", wakeTarget.sessionId, \"-\"], { env: childEnv, stdio: [\"pipe\", \"ignore\", \"ignore\"] })\n : spawn(\"claude\", [\"-p\", \"--resume\", wakeTarget.sessionId], { env: childEnv, stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n let finished = false;\n const finish = (ok: boolean): void => {\n if (finished) return;\n finished = true;\n wakeChild = null;\n if (!ok && !stopped) sendWakeFailure();\n startNextWake();\n };\n wakeChild.once(\"error\", () => finish(false));\n wakeChild.once(\"exit\", (code) => finish(code === 0));\n wakeChild.stdin?.on(\"error\", () => undefined);\n wakeChild.stdin?.end(prompt);\n };\n\n const shutdown = (): void => {\n if (stopped) return;\n stopped = true;\n if (closeTimer) clearTimeout(closeTimer);\n wakeChild?.kill();\n input.end();\n server.close();\n if (process.platform !== \"win32\") rmSync(path, { force: true });\n };\n\n const emit: Emit = (value) => {\n const message = value as Record<string, unknown>;\n if (message.event === \"ready\") readyEvent = message;\n if (message.event === \"connection_closed\" && !closeTimer) {\n closeTimer = setTimeout(shutdown, 60_000);\n closeTimer.unref();\n }\n if (message.event === \"chat\" && typeof message.text === \"string\" && wakeTarget) {\n wakeQueue.push(message.text);\n startNextWake();\n }\n if (typeof message.id !== \"string\") return;\n const command = pending.get(message.id);\n if (!command) return;\n pending.delete(message.id);\n const response = { ...message };\n if (command.originalId === undefined) delete response.id;\n else response.id = command.originalId;\n sendSocketValue(command.socket, response);\n };\n\n const server = createServer((socket) => {\n socket.setEncoding(\"utf8\");\n let buffer = \"\";\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n const newline = buffer.indexOf(\"\\n\");\n if (newline < 0) return;\n socket.removeAllListeners(\"data\");\n try {\n const message = JSON.parse(buffer.slice(0, newline)) as Record<string, unknown>;\n if (message.daemon === \"status\") {\n if (fatalError) sendSocketValue(socket, { ok: false, error: fatalError });\n else if (readyEvent) sendSocketValue(socket, { ok: true, result: { state: \"ready\", ready: readyEvent } });\n else sendSocketValue(socket, { ok: true, result: { state: \"starting\" } });\n return;\n }\n if (!readyEvent) {\n sendSocketValue(socket, { ok: false, error: fatalError ?? \"The agent bridge is still starting\" });\n return;\n }\n const id = `request_${++requestCounter}`;\n pending.set(id, { socket, originalId: message.id as string | number | undefined });\n input.write(`${JSON.stringify({ ...message, id })}\\n`);\n } catch (error) {\n sendSocketValue(socket, { ok: false, error: error instanceof Error ? error.message : String(error) });\n }\n });\n });\n\n await listen(server, path);\n try {\n await connectAgent(invitationUrl, input, emit);\n } catch (error) {\n fatalError = error instanceof Error ? error.message : String(error);\n for (const command of pending.values()) sendSocketValue(command.socket, { ok: false, error: fatalError });\n pending.clear();\n await new Promise<void>((resolve) => setTimeout(resolve, 1_000));\n } finally {\n shutdown();\n }\n}\n\nfunction daemonRequest(sessionId: string, request: unknown, timeoutMs = 60_000): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const socket = createConnection(sessionSocketPath(sessionId));\n let buffer = \"\";\n const fail = (error: Error) => {\n socket.destroy();\n reject(error);\n };\n socket.setEncoding(\"utf8\");\n socket.setTimeout(timeoutMs, () => fail(new Error(\"The agent bridge command timed out\")));\n socket.once(\"error\", fail);\n socket.once(\"connect\", () => socket.write(`${JSON.stringify(request)}\\n`));\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n const newline = buffer.indexOf(\"\\n\");\n if (newline < 0) return;\n socket.destroy();\n try {\n resolve(JSON.parse(buffer.slice(0, newline)) as Record<string, unknown>);\n } catch (error) {\n reject(error);\n }\n });\n });\n}\n\nasync function startDaemon(invitationUrl: string): Promise<void> {\n const sessionId = randomId(\"session\");\n const wakeTarget = detectWakeTarget();\n const child = spawn(process.execPath, [fileURLToPath(import.meta.url), \"daemon\", invitationUrl, sessionId], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n const deadline = Date.now() + 35_000;\n while (Date.now() < deadline) {\n try {\n const status = await daemonRequest(sessionId, { daemon: \"status\" }, 2_000);\n if (!status.ok) throw new Error(String(status.error));\n const result = status.result as { state?: string; ready?: Record<string, unknown> } | undefined;\n if (result?.state === \"ready\" && result.ready) {\n write({\n ...result.ready,\n sessionId,\n mode: \"detached\",\n wake: wakeTarget\n ? { state: \"armed\", provider: wakeTarget.provider }\n : { state: \"unavailable\", reason: \"This command did not run inside a Codex or Claude task\" },\n next: `wordinweb-agent session '${sessionId}' '<JSON command>'`,\n });\n return;\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\" && code !== \"ECONNREFUSED\") throw error;\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 100));\n }\n throw new Error(\"The detached agent bridge did not become ready within 35 seconds\");\n}\n\nasync function main(): Promise<void> {\n const [command, first, second] = process.argv.slice(2);\n if (command === \"connect\" && first) return startDaemon(first);\n if (command === \"session\" && first && second) {\n const request = JSON.parse(second) as Command;\n const timeoutMs = request.command === \"wait\"\n ? Math.min(Math.max(request.timeoutMs ?? 30_000, 1), 55_000) + 5_000\n : 60_000;\n write(await daemonRequest(first, request, timeoutMs));\n return;\n }\n if (command === \"daemon\" && first && second) return runDaemon(first, second);\n process.stderr.write(\n \"Usage:\\n\" +\n \" wordinweb-agent connect '<AI invitation URL>'\\n\" +\n \" wordinweb-agent session '<session ID>' '<JSON command>'\\n\",\n );\n process.exitCode = 1;\n}\n\nif (process.argv[1] && fileURLToPath(import.meta.url) === realpathSync(process.argv[1])) {\n void main().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { webcrypto } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { chmodSync, mkdirSync, realpathSync, rmSync } from \"node:fs\";\nimport { createConnection, createServer, type Socket } from \"node:net\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createInterface } from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport WebSocket from \"ws\";\nimport {\n CollabConnection,\n type CollabConnectionLike,\n EncryptedCollabConnection,\n createWebSocketTransport,\n stretchShareCode,\n type ConnectionCallbacks,\n type ParticipantProfile,\n type RosterEntry,\n} from \"@wordinweb/collab/client\";\nimport { AgentDocument } from \"./document.js\";\nimport { isSuggestable, isSuggestableTableOp } from \"./edit.js\";\n\nif (!globalThis.crypto) Object.defineProperty(globalThis, \"crypto\", { value: webcrypto });\n\ninterface InvitePayload {\n version: 1;\n room: { wsUrl: string; httpBase: string; docId: string; docKey?: string; shareCode?: string };\n invite: { inviteId: string; token: string; chatKey: string; expiresAt: number };\n agent: { name: string; instructions: string; mode?: AgentMode };\n}\n\ntype AgentMode = \"suggest\" | \"edit\";\n\ntype WakeTarget = { provider: \"codex\" | \"claude\"; sessionId: string };\n\nconst AGENT_MODE_CONTROL_PREFIX = \"\\u0000wordinweb-agent-mode:\";\ninterface Command {\n id?: string | number;\n command?: string;\n wakeId?: string;\n request?: Record<string, unknown>;\n category?: string;\n kind?: string;\n text?: string;\n timeoutMs?: number;\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array {\n const padded = value.replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(Math.ceil(value.length / 4) * 4, \"=\");\n return Uint8Array.from(Buffer.from(padded, \"base64\"));\n}\n\nfunction bytesToBase64Url(value: Uint8Array): string {\n return Buffer.from(value).toString(\"base64url\");\n}\n\nasync function parseInvite(url: string): Promise<InvitePayload> {\n const parsed = new URL(url);\n const encoded = parsed.hash.match(/(?:^#|&)invite=([A-Za-z0-9_-]+)/)?.[1];\n let payload: InvitePayload;\n if (encoded) {\n payload = JSON.parse(new TextDecoder().decode(base64UrlToBytes(encoded))) as InvitePayload;\n } else {\n const values = new URLSearchParams(parsed.hash.slice(1));\n const inviteId = values.get(\"i\");\n const secret = values.get(\"k\");\n if (!inviteId || !/^[A-Za-z0-9_-]{16,64}$/.test(inviteId) || !secret) throw new Error(\"The URL has no AI invitation payload\");\n const response = await fetch(new URL(`/agent-invites/${inviteId}`, parsed.origin));\n if (!response.ok) throw new Error(response.status === 404 ? \"The AI invitation is unavailable or expired\" : `The AI invitation could not be loaded (${response.status})`);\n const stored = await response.json() as { iv: string; ciphertext: string; expiresAt: number };\n if (stored.expiresAt <= Date.now()) throw new Error(\"The AI invitation has expired\");\n const key = await crypto.subtle.importKey(\"raw\", base64UrlToBytes(secret) as BufferSource, \"AES-GCM\", false, [\"decrypt\"]);\n const plaintext = await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: base64UrlToBytes(stored.iv) as BufferSource,\n additionalData: new TextEncoder().encode(`wordinweb-agent-invite:${inviteId}`) as BufferSource,\n },\n key,\n base64UrlToBytes(stored.ciphertext) as BufferSource,\n );\n payload = JSON.parse(new TextDecoder().decode(plaintext)) as InvitePayload;\n }\n if (payload.version !== 1) throw new Error(\"The AI invitation version is unsupported\");\n if (payload.invite.expiresAt <= Date.now()) throw new Error(\"The AI invitation has expired\");\n return payload;\n}\n\nfunction parseAgentModeControl(text: string): AgentMode | null {\n if (!text.startsWith(AGENT_MODE_CONTROL_PREFIX)) return null;\n const mode = text.slice(AGENT_MODE_CONTROL_PREFIX.length);\n return mode === \"suggest\" || mode === \"edit\" ? mode : null;\n}\n\nfunction editRequestForMode(request: Record<string, unknown> | undefined, mode: AgentMode): Record<string, unknown> | undefined {\n if (mode === \"edit\" || !request) return request;\n if (!Array.isArray(request.operations)) return request;\n const operations = request.operations.map((value) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Each edit operation must be an object\");\n const operation = value as Record<string, unknown>;\n // tableOp is half formatting and half structure. Shading, vertical\n // alignment and text wrapping record a `*PrChange`; a row or column insert\n // or delete, a merge and a split have no tracked form here, so they keep\n // the refusal the whole operation used to carry.\n if (operation.kind === \"tableOp\") {\n if (!isSuggestableTableOp(operation.op)) {\n throw new Error(\n `tableOp ${String((operation.op as { kind?: unknown } | undefined)?.kind ?? operation.op)} restructures the table and is unavailable in suggestion mode. Ask the inviter to switch this agent to editing mode`,\n );\n }\n return { ...operation, suggest: true };\n }\n // Every kind with a tracked OOXML form takes the flag; the compiler stamps\n // the author and date and the engine writes w:ins, a `*PrChange`, or a\n // struck paragraph mark.\n if (isSuggestable(operation.kind)) return { ...operation, suggest: true };\n switch (operation.kind) {\n case \"deleteText\":\n return {\n kind: \"suggestRevision\",\n ranges: [{ blockRef: operation.blockRef, runRef: operation.runRef, start: operation.start, end: operation.end }],\n };\n case \"suggestRevision\":\n case \"commentRun\":\n case \"replyComment\":\n return operation;\n default:\n throw new Error(`${String(operation.kind)} is unavailable in suggestion mode. Ask the inviter to switch this agent to editing mode`);\n }\n });\n return { ...request, operations };\n}\n\n/** A projection patch compiles to the same intents an editor emits, so\n * suggestion mode asks the patch compiler for the tracked form rather than\n * rewriting the operations it produced. */\nfunction patchRequestForMode(request: Record<string, unknown> | undefined, mode: AgentMode): Record<string, unknown> | undefined {\n if (mode === \"edit\" || !request) return request;\n return { ...request, suggest: true };\n}\n\nfunction randomId(prefix: string): string {\n return `${prefix}_${bytesToBase64Url(crypto.getRandomValues(new Uint8Array(16)))}`;\n}\n\nexport function detectWakeTarget(env: NodeJS.ProcessEnv = process.env): WakeTarget | null {\n const codexSessionId = env.CODEX_THREAD_ID?.trim();\n if (codexSessionId && /^[A-Za-z0-9_-]{8,128}$/.test(codexSessionId)) {\n return { provider: \"codex\", sessionId: codexSessionId };\n }\n const claudeSessionId = env.CLAUDE_CODE_SESSION_ID?.trim();\n if (claudeSessionId && /^[A-Za-z0-9_-]{8,128}$/.test(claudeSessionId)) {\n return { provider: \"claude\", sessionId: claudeSessionId };\n }\n return null;\n}\n\nexport function agentWakePrompt(agentSessionId: string, wakeId: string, text: string): string {\n const sessionCommand = `${JSON.stringify(process.execPath)} ${JSON.stringify(fileURLToPath(import.meta.url))} session ${JSON.stringify(agentSessionId)} '<JSON command>'`;\n return [\n \"An authenticated private WordInWeb message started this document-agent turn.\",\n `The inviter's message is ${JSON.stringify(text)}.`,\n `The detached document bridge session is ${agentSessionId}. Use this existing bridge for the task.`,\n `The wake ID is ${wakeId}. Include ${JSON.stringify(wakeId)} as the wakeId field in every document command.`,\n `Run document commands with: ${sessionCommand}`,\n `Start with {\"command\":\"sync\",\"wakeId\":${JSON.stringify(wakeId)}}. For a broad text task, inspect all non-empty stories in one compact call: {\"command\":\"inspect\",\"wakeId\":${JSON.stringify(wakeId)},\"request\":{\"kind\":\"context\"}}. Use overview, read, object, or spatial only when the task needs their extra detail.`,\n `For a bulk prose rewrite, read the story as text and send the changed lines back: {\"command\":\"project\",\"wakeId\":${JSON.stringify(wakeId)},\"request\":{\"mode\":\"md\"}}, then {\"command\":\"patch\",\"wakeId\":${JSON.stringify(wakeId)},\"request\":{\"revision\":\"<the projection revision>\",\"mode\":\"md\",\"edits\":[{\"startLine\":4,\"endLine\":4,\"newText\":\"the rewritten line\"}]}}. The patch result carries the refreshed projection, so a second read is unnecessary.`,\n \"Inspect the relevant content before every edit. If an edit or patch returns needs_sync, sync and read the content again.\",\n \"Complete this task, then send the inviter a concise result with the chat command.\",\n \"End this agent turn after the reply and stay idle. The detached bridge will start the next turn when another message arrives.\",\n ].join(\"\\n\\n\");\n}\n\nfunction write(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n}\n\ntype Emit = (value: unknown) => void;\n\nfunction validateSessionId(sessionId: string): void {\n if (!/^session_[A-Za-z0-9_-]{16,128}$/.test(sessionId)) throw new Error(\"The agent session ID is invalid\");\n}\n\nfunction sessionDirectory(sessionId: string): string {\n validateSessionId(sessionId);\n return join(tmpdir(), `wiw-${sessionId.slice(\"session_\".length)}`);\n}\n\nfunction sessionSocketPath(sessionId: string): string {\n validateSessionId(sessionId);\n return process.platform === \"win32\"\n ? `\\\\\\\\.\\\\pipe\\\\wordinweb-agent-${sessionId}`\n : join(sessionDirectory(sessionId), \"bridge.sock\");\n}\n\nasync function importChatKey(value: string): Promise<CryptoKey> {\n return crypto.subtle.importKey(\"raw\", base64UrlToBytes(value) as BufferSource, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nfunction chatAad(agentClientId: string, messageId: string): Uint8Array {\n return new TextEncoder().encode(`wordinweb-agent-chat:${agentClientId}:${messageId}`);\n}\n\nasync function encryptChat(key: CryptoKey, agentClientId: string, messageId: string, text: string) {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const ciphertext = await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv: iv as BufferSource, additionalData: chatAad(agentClientId, messageId) as BufferSource },\n key,\n new TextEncoder().encode(text),\n );\n return { iv: bytesToBase64Url(iv), ciphertext: bytesToBase64Url(new Uint8Array(ciphertext)) };\n}\n\nasync function decryptChat(\n key: CryptoKey,\n agentClientId: string,\n messageId: string,\n iv: string,\n ciphertext: string,\n): Promise<string> {\n const plaintext = await crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv: base64UrlToBytes(iv) as BufferSource, additionalData: chatAad(agentClientId, messageId) as BufferSource },\n key,\n base64UrlToBytes(ciphertext) as BufferSource,\n );\n return new TextDecoder().decode(plaintext);\n}\n\nexport async function connectAgent(\n invitationUrl: string,\n inputStream: NodeJS.ReadableStream = process.stdin,\n emit: Emit = write,\n): Promise<void> {\n const payload = await parseInvite(invitationUrl);\n let mode: AgentMode = payload.agent.mode === \"edit\" ? \"edit\" : \"suggest\";\n const clientId = randomId(\"agent\");\n const socket = new WebSocket(payload.room.wsUrl);\n const transport = createWebSocketTransport(socket as never);\n const chatKey = await importChatKey(payload.invite.chatKey);\n let connection: CollabConnectionLike;\n let revision = 0;\n let ready = false;\n const connectionState: { current: \"reconnecting\" | \"live\" | \"offline\" } = { current: \"reconnecting\" };\n let roster: RosterEntry[] = [];\n let lastActivityIndex = 0;\n const events: unknown[] = [];\n const waiters: Array<(event: unknown) => void> = [];\n\n const publish = (event: unknown): void => {\n const waiter = waiters.shift();\n if (waiter) waiter(event);\n else events.push(event);\n emit(event);\n };\n const heartbeat = setInterval(() => {\n if (socket.readyState === WebSocket.OPEN) socket.ping();\n }, 25_000);\n socket.addEventListener(\"close\", (event) => {\n connectionState.current = \"offline\";\n clearInterval(heartbeat);\n publish({ event: \"connection_closed\", code: event.code, reason: event.reason || undefined });\n });\n\n let readyResolve: (() => void) | null = null;\n let readyReject: ((error: Error) => void) | null = null;\n const readyPromise = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n readyReject = reject;\n });\n const callbacks: ConnectionCallbacks = {\n onChange: () => {\n revision++;\n if (connection?.ready && !ready) {\n ready = true;\n connectionState.current = \"live\";\n readyResolve?.();\n return;\n }\n if (ready) publish({ event: \"document_changed\", revision: String(revision) });\n },\n onRoster: (next) => {\n roster = next;\n if (ready) publish({ event: \"roster\", roster });\n },\n onRefused: (reason) => {\n const error = new Error(`Room connection refused: ${reason}`);\n readyReject?.(error);\n if (ready) publish({ event: \"refused\", reason });\n },\n onAgentChat: (message) => {\n if (message.agentClientId !== clientId || message.sender !== \"inviter\") return;\n void decryptChat(chatKey, clientId, message.messageId, message.iv, message.ciphertext).then(\n (text) => {\n const nextMode = parseAgentModeControl(text);\n if (nextMode) {\n mode = nextMode;\n publish({ event: \"mode_changed\", mode });\n } else publish({ event: \"chat\", messageId: message.messageId, text });\n },\n () => publish({ event: \"chat_error\", messageId: message.messageId }),\n );\n },\n onError: ({ where, error }) => publish({ event: \"connection_error\", where, message: error instanceof Error ? error.message : String(error) }),\n };\n\n const stretched = payload.room.docKey && payload.room.shareCode\n ? await stretchShareCode(payload.room.shareCode, payload.room.docId)\n : undefined;\n const codeProof = stretched ? Buffer.from(stretched).toString(\"base64\") : undefined;\n connection = payload.room.docKey\n ? new EncryptedCollabConnection(\n transport,\n clientId,\n payload.room.docKey,\n callbacks,\n stretched,\n undefined,\n payload.room.httpBase ? { httpBase: payload.room.httpBase } : undefined,\n )\n : new CollabConnection(\n transport,\n clientId,\n callbacks,\n payload.room.httpBase ? { httpBase: payload.room.httpBase } : undefined,\n );\n const profile: ParticipantProfile = { name: payload.agent.name || \"AI Agent\", color: \"\" };\n connection.join(payload.room.docId, undefined, {\n profile,\n codeProof,\n agentInvite: { inviteId: payload.invite.inviteId, token: payload.invite.token },\n });\n\n const timeout = setTimeout(() => readyReject?.(new Error(\"The document did not become ready within 30 seconds\")), 30_000);\n await readyPromise.finally(() => clearTimeout(timeout));\n const document = AgentDocument.connect({\n getDocument: () => connection.doc,\n getRevision: () => revision,\n allocateIds: (count) => connection.allocIds(count),\n submit: (operation) => connection.submit(operation),\n setPresence: (position) => {\n const deadline = Date.now() + 30_000;\n const send = (): void => {\n if (connection.pendingCount === 0) connection.setPresence(position);\n else if (connectionState.current === \"live\" && Date.now() < deadline) setTimeout(send, 25);\n };\n send();\n },\n uploadMedia: (bytes) => connection.uploadMedia(bytes),\n getConnectionState: () => connectionState.current,\n }, { provenance: { author: profile.name } });\n\n emit({\n event: \"ready\",\n clientId,\n revision: document.revision,\n mode,\n instructions: payload.agent.instructions,\n commands: [\"sync\", \"capabilities\", \"inspect\", \"edit\", \"project\", \"patch\", \"chat\", \"wait\", \"close\"],\n });\n\n const nextEvent = (timeoutMs: number): Promise<unknown> => {\n if (events.length) return Promise.resolve(events.shift());\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n const index = waiters.indexOf(done);\n if (index >= 0) waiters.splice(index, 1);\n resolve({ event: \"wait_timeout\" });\n }, timeoutMs);\n const done = (event: unknown) => {\n clearTimeout(timer);\n resolve(event);\n };\n waiters.push(done);\n });\n };\n\n const respond = (id: Command[\"id\"], result?: unknown, error?: unknown): void => {\n emit(error === undefined ? { id, ok: true, result } : { id, ok: false, error: String(error) });\n };\n const input = createInterface({ input: inputStream, terminal: false });\n for await (const line of input) {\n if (!line.trim()) continue;\n let command: Command;\n try {\n command = JSON.parse(line) as Command;\n } catch {\n respond(undefined, undefined, \"Each input line must be valid JSON\");\n continue;\n }\n try {\n switch (command.command) {\n case \"sync\": {\n const activity = connection.activity.slice(lastActivityIndex);\n lastActivityIndex = connection.activity.length;\n respond(command.id, { revision: document.revision, activity, roster, mode });\n break;\n }\n case \"capabilities\":\n respond(command.id, document.capabilities(command.category as never, command.kind as never));\n break;\n case \"inspect\":\n respond(command.id, document.inspect(command.request as never));\n break;\n case \"edit\":\n try {\n if (connectionState.current !== \"live\") throw new Error(\"The collaboration connection is offline. Reconnect before editing\");\n respond(command.id, await document.edit(editRequestForMode(command.request, mode) as never));\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"revision is stale\")) {\n respond(command.id, { status: \"needs_sync\", latestRevision: document.revision });\n } else throw error;\n }\n break;\n case \"project\":\n respond(command.id, document.project(command.request as never));\n break;\n case \"patch\":\n try {\n if (connectionState.current !== \"live\") throw new Error(\"The collaboration connection is offline. Reconnect before editing\");\n respond(command.id, await document.patch(patchRequestForMode(command.request, mode) as never));\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"revision is stale\")) {\n respond(command.id, { status: \"needs_sync\", latestRevision: document.revision });\n } else throw error;\n }\n break;\n case \"chat\": {\n if (connectionState.current !== \"live\") throw new Error(\"The collaboration connection is offline. Reconnect before sending chat\");\n if (!command.text?.trim()) throw new Error(\"Chat text is required\");\n const messageId = randomId(\"message\");\n const sealed = await encryptChat(chatKey, clientId, messageId, command.text.trim());\n connection.sendAgentChat(clientId, messageId, sealed.iv, sealed.ciphertext);\n respond(command.id, { messageId });\n break;\n }\n case \"wait\":\n respond(command.id, await nextEvent(Math.min(Math.max(command.timeoutMs ?? 30_000, 1), 55_000)));\n break;\n case \"close\":\n respond(command.id, { closed: true });\n clearInterval(heartbeat);\n socket.close();\n input.close();\n return;\n default:\n throw new Error(\"Unknown command\");\n }\n } catch (error) {\n respond(command.id, undefined, error instanceof Error ? error.message : String(error));\n }\n }\n clearInterval(heartbeat);\n socket.close();\n}\n\ninterface PendingCommand {\n socket: Socket;\n originalId?: string | number;\n command?: string;\n wakeId?: string;\n}\n\nfunction sendSocketValue(socket: Socket, value: unknown): void {\n socket.end(`${JSON.stringify(value)}\\n`);\n}\n\nasync function listen(server: ReturnType<typeof createServer>, path: string): Promise<void> {\n if (process.platform !== \"win32\") rmSync(path, { force: true });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(path, () => {\n server.off(\"error\", reject);\n if (process.platform !== \"win32\") chmodSync(path, 0o600);\n resolve();\n });\n });\n}\n\ninterface CodexWakeHost {\n startTurn(prompt: string): Promise<void>;\n interrupt(): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface AppServerRequest {\n resolve: (result: Record<string, unknown>) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nasync function startCodexWakeHost(sessionId: string): Promise<CodexWakeHost> {\n const cwd = sessionDirectory(sessionId);\n const childEnv = { ...process.env };\n delete childEnv.CODEX_THREAD_ID;\n delete childEnv.CLAUDE_CODE_SESSION_ID;\n delete childEnv.CLAUDECODE;\n const child = spawn(\"codex\", [\"app-server\"], {\n cwd,\n env: childEnv,\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const output = createInterface({ input: child.stdout, terminal: false });\n const requests = new Map<number, AppServerRequest>();\n let requestId = 0;\n let threadId = \"\";\n let activeTurn: { turnId?: string; resolve: () => void; reject: (error: Error) => void } | null = null;\n let closed = false;\n\n const fail = (error: Error): void => {\n for (const request of requests.values()) {\n clearTimeout(request.timer);\n request.reject(error);\n }\n requests.clear();\n activeTurn?.reject(error);\n activeTurn = null;\n };\n\n child.once(\"error\", (error) => fail(error));\n child.once(\"exit\", (code) => {\n if (!closed) {\n fail(new Error(`The Codex document session exited with code ${code ?? \"unknown\"}`));\n closed = true;\n }\n });\n\n output.on(\"line\", (line) => {\n let message: Record<string, unknown>;\n try {\n message = JSON.parse(line) as Record<string, unknown>;\n } catch {\n fail(new Error(\"The Codex document session returned invalid JSON\"));\n child.kill();\n return;\n }\n if (typeof message.id === \"number\") {\n const request = requests.get(message.id);\n if (!request) return;\n requests.delete(message.id);\n clearTimeout(request.timer);\n if (message.error) {\n const error = message.error as { message?: string };\n request.reject(new Error(error.message ?? \"The Codex document session request failed\"));\n } else {\n request.resolve((message.result ?? {}) as Record<string, unknown>);\n }\n return;\n }\n if (message.method !== \"turn/completed\" || !activeTurn) return;\n const params = message.params as { threadId?: string; turn?: { id?: string; status?: string; error?: { message?: string } } } | undefined;\n if (params?.threadId !== threadId) return;\n if (activeTurn.turnId && params.turn?.id !== activeTurn.turnId) return;\n const turn = activeTurn;\n activeTurn = null;\n if (params.turn?.status === \"completed\") turn.resolve();\n else turn.reject(new Error(params.turn?.error?.message ?? `The Codex document turn ${params.turn?.status ?? \"failed\"}`));\n });\n\n const request = (method: string, params: Record<string, unknown>, timeoutMs = 30_000): Promise<Record<string, unknown>> => {\n const id = ++requestId;\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n requests.delete(id);\n reject(new Error(`The Codex document session timed out during ${method}`));\n }, timeoutMs);\n requests.set(id, { resolve, reject, timer });\n child.stdin.write(`${JSON.stringify({ id, method, params })}\\n`);\n });\n };\n\n try {\n await request(\"initialize\", {\n clientInfo: { name: \"wordinweb-agent\", title: \"WordInWeb document agent\", version: \"0.1.0\" },\n });\n child.stdin.write(`${JSON.stringify({ method: \"initialized\" })}\\n`);\n const started = await request(\"thread/start\", {\n cwd,\n approvalPolicy: \"never\",\n sandbox: \"workspace-write\",\n ephemeral: true,\n serviceName: \"wordinweb-agent\",\n developerInstructions: \"Act as a WordInWeb document collaborator. Treat each private message as one document task. Use the exact local session command in the message. Complete the task and reply through document chat.\",\n });\n threadId = String((started.thread as { id?: string } | undefined)?.id ?? \"\");\n if (!threadId) throw new Error(\"The Codex document session returned no thread ID\");\n } catch (error) {\n closed = true;\n child.kill();\n throw error;\n }\n\n return {\n async startTurn(prompt) {\n if (closed) throw new Error(\"The Codex document session is closed\");\n if (activeTurn) throw new Error(\"The Codex document session already has an active turn\");\n let turn: { turnId?: string; resolve: () => void; reject: (error: Error) => void };\n const completed = new Promise<void>((resolve, reject) => {\n turn = { resolve, reject };\n activeTurn = turn;\n });\n try {\n const started = await request(\"turn/start\", {\n threadId,\n effort: \"low\",\n sandboxPolicy: { type: \"workspaceWrite\", networkAccess: true },\n input: [{ type: \"text\", text: prompt }],\n });\n turn!.turnId = String((started.turn as { id?: string } | undefined)?.id ?? \"\");\n await completed;\n } catch (error) {\n activeTurn = null;\n throw error;\n }\n },\n async interrupt() {\n const turn = activeTurn;\n if (!turn) return;\n try {\n if (turn.turnId) await request(\"turn/interrupt\", { threadId, turnId: turn.turnId }, 5_000);\n } finally {\n if (activeTurn === turn) {\n activeTurn = null;\n turn.reject(new Error(\"The Codex document turn timed out\"));\n }\n }\n },\n async close() {\n if (closed) return;\n closed = true;\n activeTurn?.reject(new Error(\"The Codex document session closed\"));\n activeTurn = null;\n await request(\"thread/delete\", { threadId }, 2_000).catch(() => undefined).finally(() => {\n output.close();\n child.kill();\n });\n },\n };\n}\n\nasync function runDaemon(invitationUrl: string, sessionId: string): Promise<void> {\n const directory = sessionDirectory(sessionId);\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n chmodSync(directory, 0o700);\n const path = sessionSocketPath(sessionId);\n const input = new PassThrough();\n const wakeTarget = detectWakeTarget();\n const wakeTimeoutMs = Number(process.env.WORDINWEB_WAKE_TIMEOUT_MS) || 60_000;\n const wakeQueue: string[] = [];\n const pending = new Map<string, PendingCommand>();\n let readyEvent: Record<string, unknown> | null = null;\n let fatalError: string | null = null;\n let closeTimer: ReturnType<typeof setTimeout> | null = null;\n let wakeChild: ReturnType<typeof spawn> | null = null;\n let codexWakeHost: CodexWakeHost | null = null;\n let activeWake: { id: string; startedAt: number; replied: boolean; timedOut: boolean; timer: ReturnType<typeof setTimeout> } | null = null;\n let wakeState: \"idle\" | \"active\" | \"failed\" = \"idle\";\n let wakeId: string | null = null;\n let wakeStartedAt: number | null = null;\n let lastWakeError: string | null = null;\n let lastSuccessfulChatAt: number | null = null;\n let requestCounter = 0;\n let stopped = false;\n let shutdownPromise: Promise<void> | null = null;\n\n const sendWakeFailure = (text: string): void => {\n input.write(`${JSON.stringify({ command: \"chat\", text })}\\n`);\n };\n\n let startNextWake: () => void = () => undefined;\n const finishWake = (id: string, error: string | null, failureReply: string): void => {\n const wake = activeWake;\n if (!wake || wake.id !== id) return;\n clearTimeout(wake.timer);\n activeWake = null;\n if (error && !wake.replied) {\n wakeState = \"failed\";\n lastWakeError = error;\n if (!stopped) sendWakeFailure(failureReply);\n } else {\n wakeState = \"idle\";\n lastWakeError = null;\n }\n startNextWake();\n };\n\n startNextWake = (): void => {\n if (!wakeTarget || wakeChild || activeWake || wakeQueue.length === 0 || stopped) return;\n const text = wakeQueue.shift()!;\n const id = randomId(\"wake\");\n const startedAt = Date.now();\n wakeId = id;\n wakeStartedAt = startedAt;\n wakeState = \"active\";\n lastWakeError = null;\n const timer = setTimeout(() => {\n const wake = activeWake;\n if (!wake || wake.id !== id) return;\n wake.timedOut = true;\n if (wakeTarget.provider === \"codex\") {\n const interrupted = codexWakeHost ? codexWakeHost.interrupt() : Promise.resolve();\n void interrupted.finally(() => {\n finishWake(id, \"turn_timed_out\", \"The bridge stayed connected, but this document task timed out. Send the task again.\");\n });\n } else {\n wakeChild?.kill();\n }\n }, wakeTimeoutMs);\n timer.unref();\n activeWake = { id, startedAt, replied: false, timedOut: false, timer };\n const prompt = agentWakePrompt(sessionId, id, text);\n if (wakeTarget.provider === \"codex\") {\n if (!codexWakeHost) {\n finishWake(id, \"wake_host_unavailable\", \"The bridge stayed connected, but this document task could not start. Send the task again.\");\n return;\n }\n void codexWakeHost.startTurn(prompt).then(\n () => {\n const replied = activeWake?.id === id && activeWake.replied;\n finishWake(\n id,\n replied ? null : \"turn_completed_without_chat\",\n \"The bridge stayed connected, but this document task ended before the agent sent a reply. Send the task again.\",\n );\n },\n () => {\n const timedOut = activeWake?.id === id && activeWake.timedOut;\n finishWake(\n id,\n timedOut ? \"turn_timed_out\" : \"turn_failed\",\n timedOut\n ? \"The bridge stayed connected, but this document task timed out. Send the task again.\"\n : \"The bridge stayed connected, but this document task failed. Send the task again.\",\n );\n },\n );\n return;\n }\n const childEnv = { ...process.env };\n delete childEnv.CODEX_THREAD_ID;\n delete childEnv.CLAUDE_CODE_SESSION_ID;\n delete childEnv.CLAUDECODE;\n wakeChild = spawn(\"claude\", [\"-p\", \"--resume\", wakeTarget.sessionId], { env: childEnv, stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n let finished = false;\n const finish = (ok: boolean): void => {\n if (finished) return;\n finished = true;\n wakeChild = null;\n const wake = activeWake?.id === id ? activeWake : null;\n const error = wake?.timedOut ? \"turn_timed_out\" : ok && wake?.replied ? null : \"turn_failed\";\n finishWake(\n id,\n error,\n wake?.timedOut\n ? \"The bridge stayed connected, but this document task timed out. Send the task again.\"\n : \"The bridge stayed connected, but this document task failed. Send the task again.\",\n );\n };\n wakeChild.once(\"error\", () => finish(false));\n wakeChild.once(\"exit\", (code) => finish(code === 0));\n wakeChild.stdin?.on(\"error\", () => undefined);\n wakeChild.stdin?.end(prompt);\n };\n\n let serverListening = false;\n const shutdown = (): Promise<void> => {\n if (shutdownPromise) return shutdownPromise;\n stopped = true;\n if (closeTimer) clearTimeout(closeTimer);\n if (activeWake) clearTimeout(activeWake.timer);\n activeWake = null;\n wakeChild?.kill();\n const host = codexWakeHost;\n codexWakeHost = null;\n input.end();\n shutdownPromise = Promise.all([\n host?.close() ?? Promise.resolve(),\n serverListening\n ? new Promise<void>((resolve) => server.close(() => resolve()))\n : Promise.resolve(),\n ]).then(() => {\n rmSync(directory, { recursive: true, force: true });\n });\n return shutdownPromise;\n };\n\n const emit: Emit = (value) => {\n const message = value as Record<string, unknown>;\n if (message.event === \"ready\") readyEvent = message;\n if (message.event === \"connection_closed\" && !closeTimer) {\n closeTimer = setTimeout(() => { void shutdown(); }, 60_000);\n closeTimer.unref();\n }\n if (message.event === \"chat\" && typeof message.text === \"string\" && wakeTarget) {\n wakeQueue.push(message.text);\n startNextWake();\n }\n if (typeof message.id !== \"string\") return;\n const command = pending.get(message.id);\n if (!command) return;\n pending.delete(message.id);\n if (\n message.ok === true &&\n command.command === \"chat\" &&\n command.wakeId &&\n activeWake?.id === command.wakeId\n ) {\n activeWake.replied = true;\n lastSuccessfulChatAt = Date.now();\n }\n const response = { ...message };\n if (command.originalId === undefined) delete response.id;\n else response.id = command.originalId;\n sendSocketValue(command.socket, response);\n };\n\n const server = createServer((socket) => {\n socket.setEncoding(\"utf8\");\n let buffer = \"\";\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n const newline = buffer.indexOf(\"\\n\");\n if (newline < 0) return;\n socket.removeAllListeners(\"data\");\n try {\n const message = JSON.parse(buffer.slice(0, newline)) as Record<string, unknown>;\n if (message.daemon === \"status\") {\n if (fatalError) sendSocketValue(socket, { ok: false, error: fatalError });\n else sendSocketValue(socket, {\n ok: true,\n result: {\n state: readyEvent ? \"ready\" : \"starting\",\n ready: readyEvent,\n wakeState,\n wakeId,\n wakeStartedAt,\n lastWakeError,\n lastSuccessfulChatAt,\n },\n });\n return;\n }\n if (!readyEvent) {\n sendSocketValue(socket, { ok: false, error: fatalError ?? \"The agent bridge is still starting\" });\n return;\n }\n if (message.command === \"chat\" && activeWake && message.wakeId !== activeWake.id) {\n sendSocketValue(socket, { ok: false, error: \"The chat command must include the current wakeId\" });\n return;\n }\n const id = `request_${++requestCounter}`;\n pending.set(id, {\n socket,\n originalId: message.id as string | number | undefined,\n command: typeof message.command === \"string\" ? message.command : undefined,\n wakeId: typeof message.wakeId === \"string\" ? message.wakeId : undefined,\n });\n input.write(`${JSON.stringify({ ...message, id })}\\n`);\n } catch (error) {\n sendSocketValue(socket, { ok: false, error: error instanceof Error ? error.message : String(error) });\n }\n });\n });\n\n try {\n await listen(server, path);\n serverListening = true;\n if (wakeTarget?.provider === \"codex\") codexWakeHost = await startCodexWakeHost(sessionId);\n await connectAgent(invitationUrl, input, emit);\n } catch (error) {\n fatalError = error instanceof Error ? error.message : String(error);\n for (const command of pending.values()) sendSocketValue(command.socket, { ok: false, error: fatalError });\n pending.clear();\n await new Promise<void>((resolve) => setTimeout(resolve, 1_000));\n } finally {\n await shutdown();\n }\n}\n\nfunction daemonRequest(sessionId: string, request: unknown, timeoutMs = 60_000): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const socket = createConnection(sessionSocketPath(sessionId));\n let buffer = \"\";\n const fail = (error: Error) => {\n socket.destroy();\n reject(error);\n };\n socket.setEncoding(\"utf8\");\n socket.setTimeout(timeoutMs, () => fail(new Error(\"The agent bridge command timed out\")));\n socket.once(\"error\", fail);\n socket.once(\"connect\", () => socket.write(`${JSON.stringify(request)}\\n`));\n socket.on(\"data\", (chunk: string) => {\n buffer += chunk;\n const newline = buffer.indexOf(\"\\n\");\n if (newline < 0) return;\n socket.destroy();\n try {\n resolve(JSON.parse(buffer.slice(0, newline)) as Record<string, unknown>);\n } catch (error) {\n reject(error);\n }\n });\n });\n}\n\nasync function startDaemon(invitationUrl: string): Promise<void> {\n const sessionId = randomId(\"session\");\n const wakeTarget = detectWakeTarget();\n const child = spawn(process.execPath, [fileURLToPath(import.meta.url), \"daemon\", invitationUrl, sessionId], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n const deadline = Date.now() + 35_000;\n while (Date.now() < deadline) {\n try {\n const status = await daemonRequest(sessionId, { daemon: \"status\" }, 2_000);\n if (!status.ok) throw new Error(String(status.error));\n const result = status.result as { state?: string; ready?: Record<string, unknown> } | undefined;\n if (result?.state === \"ready\" && result.ready) {\n write({\n ...result.ready,\n sessionId,\n mode: \"detached\",\n wake: wakeTarget\n ? { state: \"armed\", provider: wakeTarget.provider }\n : { state: \"unavailable\", reason: \"This command did not run inside a Codex or Claude task\" },\n next: `wordinweb-agent session '${sessionId}' '<JSON command>'`,\n });\n return;\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\" && code !== \"ECONNREFUSED\" && code !== \"EINVAL\") throw error;\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 100));\n }\n throw new Error(\"The detached agent bridge did not become ready within 35 seconds\");\n}\n\nasync function main(): Promise<void> {\n const [command, first, second] = process.argv.slice(2);\n if (command === \"connect\" && first) return startDaemon(first);\n if (command === \"session\" && first && second) {\n const request = JSON.parse(second) as Command;\n const timeoutMs = request.command === \"wait\"\n ? Math.min(Math.max(request.timeoutMs ?? 30_000, 1), 55_000) + 5_000\n : 60_000;\n write(await daemonRequest(first, request, timeoutMs));\n return;\n }\n if (command === \"daemon\" && first && second) return runDaemon(first, second);\n process.stderr.write(\n \"Usage:\\n\" +\n \" wordinweb-agent connect '<AI invitation URL>'\\n\" +\n \" wordinweb-agent session '<session ID>' '<JSON command>'\\n\",\n );\n process.exitCode = 1;\n}\n\nif (process.argv[1] && fileURLToPath(import.meta.url) === realpathSync(process.argv[1])) {\n void main().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n });\n}\n"],"mappings":"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","names":["request"]}
|