@overmux/pi 0.0.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 +118 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-2jNv4tol.d.ts +34 -0
- package/dist/config-2jNv4tol.d.ts.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/extension.d.ts +19 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +265 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonl-tail.d.ts +13 -0
- package/dist/jsonl-tail.d.ts.map +1 -0
- package/dist/jsonl-tail.js +83 -0
- package/dist/jsonl-tail.js.map +1 -0
- package/dist/live-events-ClhFOMGW.js +497 -0
- package/dist/live-events-ClhFOMGW.js.map +1 -0
- package/dist/live-events-DAmf6RRx.d.ts +107 -0
- package/dist/live-events-DAmf6RRx.d.ts.map +1 -0
- package/dist/live-events.d.ts +2 -0
- package/dist/live-events.js +2 -0
- package/dist/notification-DzOd9cRc.d.ts +20 -0
- package/dist/notification-DzOd9cRc.d.ts.map +1 -0
- package/dist/notification.d.ts +2 -0
- package/dist/notification.js +54 -0
- package/dist/notification.js.map +1 -0
- package/dist/plugin.d.ts +90 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +213 -0
- package/dist/plugin.js.map +1 -0
- package/dist/projection.d.ts +101 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +550 -0
- package/dist/projection.js.map +1 -0
- package/dist/protocol-CsrnSPOv.d.ts +115 -0
- package/dist/protocol-CsrnSPOv.d.ts.map +1 -0
- package/dist/protocol.d.ts +2 -0
- package/dist/protocol.js +365 -0
- package/dist/protocol.js.map +1 -0
- package/dist/react.d.ts +139 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +796 -0
- package/dist/react.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +4 -0
- package/dist/session-status-CZLTo8Km.d.ts +71 -0
- package/dist/session-status-CZLTo8Km.d.ts.map +1 -0
- package/dist/styles.css +619 -0
- package/docs/index.md +10 -0
- package/package.json +115 -0
- package/src/cli.ts +59 -0
- package/src/config.ts +87 -0
- package/src/extension.ts +486 -0
- package/src/index.ts +14 -0
- package/src/jsonl-tail.ts +110 -0
- package/src/live-events.ts +578 -0
- package/src/notification.ts +109 -0
- package/src/plugin.ts +369 -0
- package/src/projection.ts +995 -0
- package/src/protocol.ts +805 -0
- package/src/react.tsx +1293 -0
- package/src/server.ts +15 -0
- package/src/session-status.ts +379 -0
- package/src/styles.css +619 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","names":[],"sources":["../src/protocol.ts"],"sourcesContent":["import { lstat, mkdir, unlink } from \"node:fs/promises\";\nimport {\n createConnection,\n createServer,\n type Server,\n type Socket,\n} from \"node:net\";\nimport { join } from \"node:path\";\n\nexport const CHILD_ENV = \"PI_CHILD\";\nexport const PARENT_SESSION_ENV = \"PI_PARENT_SESSION_ID\";\nexport const TASK_SLUG_ENV = \"PI_TASK_SLUG\";\n\nconst MAX_MESSAGE_BYTES = 4096;\nconst MAX_USER_MESSAGE_BYTES = 3072;\nconst ACK = \"ACK\";\nconst MAX_RESPONSE_BYTES = 512;\nconst SOCKET_PATH_LIMIT = 100;\nconst ACK_TIMEOUT_MS = 400;\nconst PROBE_TIMEOUT_MS = 150;\nconst INBOUND_TIMEOUT_MS = 1000;\nconst MAX_CONNECTIONS = 32;\nconst RETRY_DELAYS_MS = [0, 80, 160] as const;\nconst ID_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/;\nexport const TASK_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,11}[a-z0-9])?$/;\nexport const DEFAULT_OVERMUX_PI_RUNTIME_DIR = `/tmp/overmux-pi-${process.getuid?.() ?? \"u\"}`;\n\nexport type DelegateSettledEnvelope = {\n childSessionId: string;\n taskSlug: string;\n leafId: string;\n cwd: string;\n timestamp: number;\n};\n\nexport type UserMessageRequest = {\n version: 1;\n requestId: string;\n type: \"user_message\";\n message: string;\n deliverAs: \"steer\" | \"followUp\";\n expandPromptTemplates: boolean;\n};\n\nexport type UserMessageResponse =\n | {\n version: 1;\n requestId: string;\n ok: true;\n delivery: \"immediate\" | \"steer\" | \"followUp\";\n }\n | {\n version: 1;\n requestId: string;\n ok: false;\n error: \"shutting_down\" | \"unavailable\";\n };\n\nexport type UserMessageInput = Omit<\n UserMessageRequest,\n \"version\" | \"type\" | \"expandPromptTemplates\"\n> & {\n expandPromptTemplates?: boolean;\n};\n\nexport type AbortRequest = {\n version: 1;\n requestId: string;\n type: \"abort\";\n};\n\nexport type AbortResponse =\n | { version: 1; requestId: string; ok: true }\n | {\n version: 1;\n requestId: string;\n ok: false;\n error: \"shutting_down\" | \"unavailable\";\n };\n\nexport type AbortInput = Omit<AbortRequest, \"version\" | \"type\">;\n\ntype PiControlError = \"no_key\" | \"not_found\" | \"shutting_down\" | \"unavailable\";\ntype PiControlResponse =\n | { version: 1; requestId: string; ok: true }\n | { version: 1; requestId: string; ok: false; error: PiControlError };\n\nexport type SetModelRequest = {\n version: 1;\n requestId: string;\n type: \"set_model\";\n provider: string;\n id: string;\n};\nexport type SetModelInput = Omit<SetModelRequest, \"version\" | \"type\">;\nexport type SetModelResponse = PiControlResponse;\n\nexport type SetThinkingLevelRequest = {\n version: 1;\n requestId: string;\n type: \"set_thinking_level\";\n level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n};\nexport type SetThinkingLevelInput = Omit<\n SetThinkingLevelRequest,\n \"version\" | \"type\"\n>;\nexport type SetThinkingLevelResponse = PiControlResponse;\n\nexport type Receiver = { close: () => Promise<void> };\nexport type ReceiverOptions = {\n onAbort?: (request: AbortRequest) => AbortResponse;\n onSetModel?: (request: SetModelRequest) => Promise<SetModelResponse>;\n onSetThinkingLevel?: (\n request: SetThinkingLevelRequest,\n ) => SetThinkingLevelResponse;\n onUserMessage?: (request: UserMessageRequest) => UserMessageResponse;\n};\nexport type SenderOptions = {\n runtimeDir?: string;\n timeoutMs?: number;\n retryDelaysMs?: readonly number[];\n};\n\nexport type ProbeOptions = Pick<SenderOptions, \"runtimeDir\" | \"timeoutMs\">;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isId = (value: unknown): value is string =>\n typeof value === \"string\" && ID_PATTERN.test(value);\n\nexport const socketPathForSession = (\n sessionId: string,\n runtimeDir = DEFAULT_OVERMUX_PI_RUNTIME_DIR,\n): string => {\n if (!isId(sessionId)) {\n throw new Error(\"Invalid Pi session ID for delegate notification socket\");\n }\n const socketPath = join(runtimeDir, `${sessionId}.sock`);\n if (Buffer.byteLength(socketPath) > SOCKET_PATH_LIMIT) {\n throw new Error(\n `Delegate notification socket path exceeds ${SOCKET_PATH_LIMIT} bytes`,\n );\n }\n return socketPath;\n};\n\nexport const parseEnvelope = (\n input: string,\n): DelegateSettledEnvelope | undefined => {\n if (Buffer.byteLength(input) > MAX_MESSAGE_BYTES) {\n return undefined;\n }\n try {\n const value: unknown = JSON.parse(input);\n if (!isRecord(value)) {\n return undefined;\n }\n if (\n Object.keys(value).length !== 5 ||\n !isId(value.childSessionId) ||\n !isId(value.leafId)\n ) {\n return undefined;\n }\n if (\n typeof value.taskSlug !== \"string\" ||\n !TASK_SLUG_PATTERN.test(value.taskSlug)\n ) {\n return undefined;\n }\n if (\n typeof value.cwd !== \"string\" ||\n value.cwd.length < 1 ||\n value.cwd.length > 2048\n ) {\n return undefined;\n }\n if (\n !Number.isSafeInteger(value.timestamp) ||\n (value.timestamp as number) < 0\n ) {\n return undefined;\n }\n return value as DelegateSettledEnvelope;\n } catch {\n return undefined;\n }\n};\n\nexport const parseAbortRequest = (input: string): AbortRequest | undefined => {\n if (Buffer.byteLength(input) > MAX_MESSAGE_BYTES) {\n return undefined;\n }\n try {\n const value: unknown = JSON.parse(input);\n if (\n !isRecord(value) ||\n Object.keys(value).length !== 3 ||\n value.version !== 1 ||\n value.type !== \"abort\" ||\n !isId(value.requestId)\n ) {\n return undefined;\n }\n return value as AbortRequest;\n } catch {\n return undefined;\n }\n};\n\nexport const parseSetModelRequest = (\n input: string,\n): SetModelRequest | undefined => {\n try {\n const value: unknown = JSON.parse(input);\n if (\n !isRecord(value) ||\n Object.keys(value).length !== 5 ||\n value.version !== 1 ||\n value.type !== \"set_model\" ||\n !isId(value.requestId) ||\n typeof value.provider !== \"string\" ||\n !value.provider ||\n typeof value.id !== \"string\" ||\n !value.id\n ) {\n return undefined;\n }\n return value as SetModelRequest;\n } catch {\n return undefined;\n }\n};\n\nexport const parseSetThinkingLevelRequest = (\n input: string,\n): SetThinkingLevelRequest | undefined => {\n try {\n const value: unknown = JSON.parse(input);\n const levels = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n if (\n !isRecord(value) ||\n Object.keys(value).length !== 4 ||\n value.version !== 1 ||\n value.type !== \"set_thinking_level\" ||\n !isId(value.requestId) ||\n typeof value.level !== \"string\" ||\n !levels.includes(value.level)\n ) {\n return undefined;\n }\n return value as SetThinkingLevelRequest;\n } catch {\n return undefined;\n }\n};\n\nexport const parseUserMessageRequest = (\n input: string,\n): UserMessageRequest | undefined => {\n if (Buffer.byteLength(input) > MAX_MESSAGE_BYTES) {\n return undefined;\n }\n try {\n const value: unknown = JSON.parse(input);\n if (!isRecord(value)) {\n return undefined;\n }\n const keys = Object.keys(value);\n const allowedKeys = new Set([\n \"version\",\n \"requestId\",\n \"type\",\n \"message\",\n \"deliverAs\",\n \"expandPromptTemplates\",\n ]);\n if (\n keys.length < 5 ||\n keys.length > 6 ||\n keys.some((key) => !allowedKeys.has(key))\n ) {\n return undefined;\n }\n if (\n value.version !== 1 ||\n value.type !== \"user_message\" ||\n !isId(value.requestId)\n ) {\n return undefined;\n }\n if (typeof value.message !== \"string\" || !value.message.trim()) {\n return undefined;\n }\n if (Buffer.byteLength(value.message) > MAX_USER_MESSAGE_BYTES) {\n return undefined;\n }\n if (value.deliverAs !== \"steer\" && value.deliverAs !== \"followUp\") {\n return undefined;\n }\n if (\n value.expandPromptTemplates !== undefined &&\n typeof value.expandPromptTemplates !== \"boolean\"\n ) {\n return undefined;\n }\n return {\n ...value,\n expandPromptTemplates: value.expandPromptTemplates ?? true,\n } as UserMessageRequest;\n } catch {\n return undefined;\n }\n};\n\nconst parseUserMessageResponse = (\n input: string,\n requestId: string,\n): UserMessageResponse | undefined => {\n try {\n const value: unknown = JSON.parse(input);\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n value.requestId !== requestId\n ) {\n return undefined;\n }\n const keys = Object.keys(value);\n const successKeys = [\"version\", \"requestId\", \"ok\", \"delivery\"];\n if (\n value.ok === true &&\n keys.length === successKeys.length &&\n keys.every((key) => successKeys.includes(key)) &&\n (value.delivery === \"immediate\" ||\n value.delivery === \"steer\" ||\n value.delivery === \"followUp\")\n ) {\n return value as UserMessageResponse;\n }\n const errorKeys = [\"version\", \"requestId\", \"ok\", \"error\"];\n if (\n value.ok === false &&\n keys.length === errorKeys.length &&\n keys.every((key) => errorKeys.includes(key)) &&\n (value.error === \"shutting_down\" || value.error === \"unavailable\")\n ) {\n return value as UserMessageResponse;\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const eventKey = ({\n childSessionId,\n leafId,\n}: DelegateSettledEnvelope): string => `${childSessionId}\\0${leafId}`;\n\nconst responsePayload = (\n response:\n | UserMessageResponse\n | AbortResponse\n | SetModelResponse\n | SetThinkingLevelResponse,\n): string => JSON.stringify(response);\n\nconst parseControlResponse = (\n input: string,\n requestId: string,\n): PiControlResponse | undefined => {\n try {\n const value: unknown = JSON.parse(input);\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n value.requestId !== requestId\n ) {\n return undefined;\n }\n if (value.ok === true && Object.keys(value).length === 3) {\n return value as PiControlResponse;\n }\n if (\n value.ok === false &&\n Object.keys(value).length === 4 &&\n (value.error === \"no_key\" ||\n value.error === \"not_found\" ||\n value.error === \"shutting_down\" ||\n value.error === \"unavailable\")\n ) {\n return value as PiControlResponse;\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nconst parseAbortResponse = (\n input: string,\n requestId: string,\n): AbortResponse | undefined => {\n try {\n const value: unknown = JSON.parse(input);\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n value.requestId !== requestId\n ) {\n return undefined;\n }\n if (value.ok === true && Object.keys(value).length === 3) {\n return value as AbortResponse;\n }\n if (\n value.ok === false &&\n Object.keys(value).length === 4 &&\n (value.error === \"shutting_down\" || value.error === \"unavailable\")\n ) {\n return value as AbortResponse;\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const startReceiver = async (\n socketPath: string,\n onEnvelope: (envelope: DelegateSettledEnvelope) => void,\n options: ReceiverOptions | number = {},\n timeoutMs = INBOUND_TIMEOUT_MS,\n): Promise<Receiver> => {\n const receiverOptions = typeof options === \"number\" ? {} : options;\n const resolvedTimeoutMs = typeof options === \"number\" ? options : timeoutMs;\n await removeStaleSocket(socketPath);\n const sockets = new Set<Socket>();\n const server = createServer({ allowHalfOpen: true }, (socket) => {\n sockets.add(socket);\n socket.setEncoding(\"utf8\");\n socket.setTimeout(resolvedTimeoutMs, () => socket.destroy());\n let input = \"\";\n socket.on(\"data\", (chunk: string) => {\n input += chunk;\n if (Buffer.byteLength(input) > MAX_MESSAGE_BYTES) {\n socket.destroy();\n }\n });\n socket.on(\"end\", () => {\n const envelope = parseEnvelope(input);\n if (envelope) {\n try {\n onEnvelope(envelope);\n socket.end(ACK);\n } catch {\n socket.destroy();\n }\n return;\n }\n const setModelRequest = parseSetModelRequest(input);\n if (setModelRequest && receiverOptions.onSetModel) {\n void receiverOptions\n .onSetModel(setModelRequest)\n .then((response) => socket.end(responsePayload(response)))\n .catch(() => socket.destroy());\n return;\n }\n const setThinkingLevelRequest = parseSetThinkingLevelRequest(input);\n if (setThinkingLevelRequest && receiverOptions.onSetThinkingLevel) {\n try {\n socket.end(\n responsePayload(\n receiverOptions.onSetThinkingLevel(setThinkingLevelRequest),\n ),\n );\n } catch {\n socket.destroy();\n }\n return;\n }\n const abortRequest = parseAbortRequest(input);\n if (abortRequest && receiverOptions.onAbort) {\n try {\n socket.end(responsePayload(receiverOptions.onAbort(abortRequest)));\n } catch {\n socket.destroy();\n }\n return;\n }\n const userMessageRequest = parseUserMessageRequest(input);\n if (!userMessageRequest || !receiverOptions.onUserMessage) {\n socket.destroy();\n return;\n }\n try {\n socket.end(\n responsePayload(receiverOptions.onUserMessage(userMessageRequest)),\n );\n } catch {\n socket.destroy();\n }\n });\n socket.on(\"close\", () => sockets.delete(socket));\n socket.on(\"error\", () => undefined);\n });\n server.maxConnections = MAX_CONNECTIONS;\n await listen(server, socketPath);\n let closed = false;\n return {\n close: async () => {\n if (closed) {\n return;\n }\n closed = true;\n sockets.forEach((socket) => socket.destroy());\n await closeServer(server);\n await unlink(socketPath).catch((error: NodeJS.ErrnoException) => {\n if (error.code !== \"ENOENT\") {\n throw error;\n }\n });\n },\n };\n};\n\nconst probeSocket = (socketPath: string): Promise<\"active\" | \"stale\"> =>\n new Promise((resolve) => {\n const socket = createConnection(socketPath);\n const finish = (result: \"active\" | \"stale\") => {\n socket.destroy();\n resolve(result);\n };\n socket.setTimeout(100, () => finish(\"active\"));\n socket.on(\"connect\", () => finish(\"active\"));\n socket.on(\"error\", (error: NodeJS.ErrnoException) =>\n finish(\n error.code === \"ECONNREFUSED\" || error.code === \"ENOENT\"\n ? \"stale\"\n : \"active\",\n ),\n );\n });\n\nconst removeStaleSocket = async (socketPath: string): Promise<void> => {\n const stats = await lstat(socketPath).catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n },\n );\n if (!stats) {\n return;\n }\n if (!stats.isSocket()) {\n throw new Error(\n `Delegate notification path is not a socket: ${socketPath}`,\n );\n }\n if ((await probeSocket(socketPath)) === \"active\") {\n throw new Error(\n `Delegate notification socket is already active: ${socketPath}`,\n );\n }\n await unlink(socketPath);\n};\n\nconst listen = (server: Server, socketPath: string): Promise<void> =>\n new Promise((resolve, reject) => {\n const onError = (error: Error) => reject(error);\n server.once(\"error\", onError);\n server.listen(socketPath, () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n\nconst closeServer = (server: Server): Promise<void> =>\n new Promise((resolve, reject) =>\n server.close((error) => (error ? reject(error) : resolve())),\n );\n\nconst wait = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nconst sendAttempt = (\n socketPath: string,\n payload: string,\n timeoutMs: number,\n): Promise<string | undefined> =>\n new Promise((resolve) => {\n const socket = createConnection(socketPath);\n socket.setEncoding(\"utf8\");\n let response = \"\";\n let finished = false;\n const finish = (result: string | undefined) => {\n if (finished) {\n return;\n }\n finished = true;\n socket.destroy();\n resolve(result);\n };\n socket.setTimeout(timeoutMs, () => finish(undefined));\n socket.on(\"connect\", () => socket.end(payload));\n socket.on(\"data\", (chunk: string) => {\n response += chunk;\n if (Buffer.byteLength(response) > MAX_RESPONSE_BYTES) {\n finish(undefined);\n }\n });\n socket.on(\"end\", () => finish(response));\n socket.on(\"error\", () => finish(undefined));\n });\n\nexport const probePiSession = async (\n sessionId: string,\n options: ProbeOptions = {},\n): Promise<boolean> => {\n let socketPath: string;\n try {\n socketPath = socketPathForSession(sessionId, options.runtimeDir);\n } catch {\n return false;\n }\n return (\n (await sendAttempt(\n socketPath,\n \"\",\n options.timeoutMs ?? PROBE_TIMEOUT_MS,\n )) !== undefined\n );\n};\n\nexport const sendEnvelope = async (\n socketPath: string,\n envelope: DelegateSettledEnvelope,\n options: { ackTimeoutMs?: number; retryDelaysMs?: readonly number[] } = {},\n): Promise<boolean> => {\n const payload = JSON.stringify(envelope);\n if (!parseEnvelope(payload)) {\n return false;\n }\n for (const delay of options.retryDelaysMs ?? RETRY_DELAYS_MS) {\n if (delay > 0) {\n await wait(delay);\n }\n if (\n (await sendAttempt(\n socketPath,\n payload,\n options.ackTimeoutMs ?? ACK_TIMEOUT_MS,\n )) === ACK\n ) {\n return true;\n }\n }\n return false;\n};\n\nexport const sendUserMessage = async (\n sessionId: string,\n request: UserMessageInput,\n options: SenderOptions = {},\n): Promise<UserMessageResponse | undefined> => {\n const payload = JSON.stringify({\n version: 1,\n type: \"user_message\",\n ...request,\n });\n const parsed = parseUserMessageRequest(payload);\n if (!parsed) {\n return undefined;\n }\n\n const socketPath = socketPathForSession(sessionId, options.runtimeDir);\n for (const delay of options.retryDelaysMs ?? RETRY_DELAYS_MS) {\n if (delay > 0) {\n await wait(delay);\n }\n const response = await sendAttempt(\n socketPath,\n payload,\n options.timeoutMs ?? ACK_TIMEOUT_MS,\n );\n const parsedResponse = response\n ? parseUserMessageResponse(response, parsed.requestId)\n : undefined;\n if (parsedResponse) {\n return parsedResponse;\n }\n }\n return undefined;\n};\n\nexport const sendAbort = async (\n sessionId: string,\n request: AbortInput,\n options: SenderOptions = {},\n): Promise<AbortResponse | undefined> => {\n const payload = JSON.stringify({ version: 1, type: \"abort\", ...request });\n const parsed = parseAbortRequest(payload);\n if (!parsed) {\n return undefined;\n }\n\n const socketPath = socketPathForSession(sessionId, options.runtimeDir);\n for (const delay of options.retryDelaysMs ?? RETRY_DELAYS_MS) {\n if (delay > 0) {\n await wait(delay);\n }\n const response = await sendAttempt(\n socketPath,\n payload,\n options.timeoutMs ?? ACK_TIMEOUT_MS,\n );\n const parsedResponse = response\n ? parseAbortResponse(response, parsed.requestId)\n : undefined;\n if (parsedResponse) {\n return parsedResponse;\n }\n }\n return undefined;\n};\n\nconst sendControl = async <Input extends { requestId: string }>(\n sessionId: string,\n payload: Record<string, unknown>,\n request: Input,\n options: SenderOptions,\n): Promise<PiControlResponse | undefined> => {\n const socketPath = socketPathForSession(sessionId, options.runtimeDir);\n for (const delay of options.retryDelaysMs ?? RETRY_DELAYS_MS) {\n if (delay > 0) {\n await wait(delay);\n }\n const response = await sendAttempt(\n socketPath,\n JSON.stringify(payload),\n options.timeoutMs ?? ACK_TIMEOUT_MS,\n );\n const parsed = response\n ? parseControlResponse(response, request.requestId)\n : undefined;\n if (parsed) {\n return parsed;\n }\n }\n return undefined;\n};\n\nexport const sendSetModel = (\n sessionId: string,\n request: SetModelInput,\n options: SenderOptions = {},\n): Promise<SetModelResponse | undefined> =>\n sendControl(\n sessionId,\n { version: 1, type: \"set_model\", ...request },\n request,\n options,\n );\n\nexport const sendSetThinkingLevel = (\n sessionId: string,\n request: SetThinkingLevelInput,\n options: SenderOptions = {},\n): Promise<SetThinkingLevelResponse | undefined> =>\n sendControl(\n sessionId,\n { version: 1, type: \"set_thinking_level\", ...request },\n request,\n options,\n );\n\nexport const ensureRuntimeDir = async (runtimeDir: string): Promise<void> => {\n await mkdir(runtimeDir, { mode: 0o700 }).catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code !== \"EEXIST\") {\n throw error;\n }\n },\n );\n const stats = await lstat(runtimeDir);\n const expectedUid = process.getuid?.();\n if (\n !stats.isDirectory() ||\n (expectedUid !== undefined && stats.uid !== expectedUid)\n ) {\n throw new Error(\n `Delegate notification runtime directory is not private: ${runtimeDir}`,\n );\n }\n if ((stats.mode & 0o777) !== 0o700) {\n throw new Error(\n `Delegate notification runtime directory must have mode 0700: ${runtimeDir}`,\n );\n }\n};\n"],"mappings":"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"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import "./styles.css";
|
|
2
|
+
import { CSSProperties, ReactNode } from "react";
|
|
3
|
+
//#region src/react.d.ts
|
|
4
|
+
type OvermuxStyle = CSSProperties & Record<`--${string}`, string | number | undefined>;
|
|
5
|
+
type PiContentBlock = {
|
|
6
|
+
arguments?: unknown;
|
|
7
|
+
data?: string;
|
|
8
|
+
id?: string;
|
|
9
|
+
mimeType?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
text?: string;
|
|
12
|
+
thinking?: string;
|
|
13
|
+
tool?: PiToolProjection;
|
|
14
|
+
type: string;
|
|
15
|
+
};
|
|
16
|
+
type PiToolResultProjection = {
|
|
17
|
+
content: PiContentBlock[];
|
|
18
|
+
details?: unknown;
|
|
19
|
+
isError: boolean;
|
|
20
|
+
toolCallId: string;
|
|
21
|
+
toolName: string;
|
|
22
|
+
};
|
|
23
|
+
type PiToolProjection = {
|
|
24
|
+
result?: PiToolResultProjection;
|
|
25
|
+
status: "error" | "pending" | "success";
|
|
26
|
+
};
|
|
27
|
+
type PiConversationEntry = {
|
|
28
|
+
content: PiContentBlock[];
|
|
29
|
+
errorMessage?: string;
|
|
30
|
+
id: string;
|
|
31
|
+
role: "assistant" | "toolResult" | "user";
|
|
32
|
+
source: "canonical" | "live";
|
|
33
|
+
status: "complete" | "error" | "pending";
|
|
34
|
+
toolName?: string;
|
|
35
|
+
};
|
|
36
|
+
type PiSessionMetadata = {
|
|
37
|
+
contextUsage?: {
|
|
38
|
+
tokens: number;
|
|
39
|
+
contextWindow: number;
|
|
40
|
+
percent: number;
|
|
41
|
+
};
|
|
42
|
+
model?: {
|
|
43
|
+
provider: string;
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
};
|
|
47
|
+
modelOptions?: {
|
|
48
|
+
provider: string;
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
}[];
|
|
52
|
+
thinkingLevel: string;
|
|
53
|
+
};
|
|
54
|
+
type PiConversationSnapshot = {
|
|
55
|
+
agentAvailable: boolean;
|
|
56
|
+
entries: PiConversationEntry[];
|
|
57
|
+
sessionMetadata?: PiSessionMetadata;
|
|
58
|
+
status: "busy" | "degraded" | "idle" | "offline";
|
|
59
|
+
};
|
|
60
|
+
type PiConversationStream = {
|
|
61
|
+
error?: Error;
|
|
62
|
+
status: "closed" | "open" | "opening";
|
|
63
|
+
subscribe: (listener: (snapshot: PiConversationSnapshot) => void) => () => void;
|
|
64
|
+
};
|
|
65
|
+
type PiConversationSendRequest = {
|
|
66
|
+
deliverAs: "followUp" | "steer";
|
|
67
|
+
message: string;
|
|
68
|
+
};
|
|
69
|
+
type PiConversationSendResult = {
|
|
70
|
+
delivery?: "followUp" | "immediate" | "steer";
|
|
71
|
+
requestId?: string;
|
|
72
|
+
};
|
|
73
|
+
type PiConversationSend = (request: PiConversationSendRequest) => Promise<PiConversationSendResult | void>;
|
|
74
|
+
type PiConversationStop = () => Promise<void>;
|
|
75
|
+
type PiConversationSetModel = (model: {
|
|
76
|
+
provider: string;
|
|
77
|
+
id: string;
|
|
78
|
+
}) => Promise<void>;
|
|
79
|
+
type PiConversationSetThinkingLevel = (level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max") => Promise<void>;
|
|
80
|
+
type PiConversationClassNames = Partial<{
|
|
81
|
+
composer: string;
|
|
82
|
+
content: string;
|
|
83
|
+
entry: string;
|
|
84
|
+
root: string;
|
|
85
|
+
scroller: string;
|
|
86
|
+
status: string;
|
|
87
|
+
}>;
|
|
88
|
+
type PiConversationBlockRender = (input: {
|
|
89
|
+
block: PiContentBlock;
|
|
90
|
+
entry: PiConversationEntry;
|
|
91
|
+
index: number;
|
|
92
|
+
}) => ReactNode | undefined;
|
|
93
|
+
type ToolStatus = "error" | "pending" | "success";
|
|
94
|
+
type ToolRendererResult = {
|
|
95
|
+
content: {
|
|
96
|
+
data?: string;
|
|
97
|
+
text?: string;
|
|
98
|
+
thinking?: string;
|
|
99
|
+
}[];
|
|
100
|
+
details?: unknown;
|
|
101
|
+
isError: boolean;
|
|
102
|
+
};
|
|
103
|
+
type ToolRendererInput = {
|
|
104
|
+
arguments?: unknown;
|
|
105
|
+
result?: ToolRendererResult;
|
|
106
|
+
status: ToolStatus;
|
|
107
|
+
toolName: string;
|
|
108
|
+
};
|
|
109
|
+
type ToolRenderer = (input: ToolRendererInput) => ReactNode;
|
|
110
|
+
type ToolRendererRegistry = Record<string, ToolRenderer>;
|
|
111
|
+
type PiConversationProps = {
|
|
112
|
+
autoFocus?: boolean;
|
|
113
|
+
className?: string;
|
|
114
|
+
classNames?: PiConversationClassNames;
|
|
115
|
+
conversation: PiConversationStream;
|
|
116
|
+
emptyState?: ReactNode;
|
|
117
|
+
renderBlock?: PiConversationBlockRender;
|
|
118
|
+
renderers?: ToolRendererRegistry;
|
|
119
|
+
sendMessage: PiConversationSend;
|
|
120
|
+
setModel?: PiConversationSetModel;
|
|
121
|
+
setThinkingLevel?: PiConversationSetThinkingLevel;
|
|
122
|
+
stop?: PiConversationStop;
|
|
123
|
+
style?: OvermuxStyle;
|
|
124
|
+
};
|
|
125
|
+
declare const defaultToolRenderers: ToolRendererRegistry;
|
|
126
|
+
type PiMessageComposerProps = {
|
|
127
|
+
autoFocus?: boolean;
|
|
128
|
+
available: boolean;
|
|
129
|
+
busy?: boolean;
|
|
130
|
+
className?: string;
|
|
131
|
+
sendMessage: PiConversationSend;
|
|
132
|
+
stop?: PiConversationStop;
|
|
133
|
+
style?: OvermuxStyle;
|
|
134
|
+
};
|
|
135
|
+
declare const PiMessageComposer: ({ autoFocus, available, busy, className, sendMessage, stop, style }: PiMessageComposerProps) => import("react").JSX.Element;
|
|
136
|
+
declare const PiConversation: ({ autoFocus, conversation, className, classNames, emptyState, renderBlock, renderers, sendMessage, setModel, setThinkingLevel, stop, style }: PiConversationProps) => import("react").JSX.Element;
|
|
137
|
+
//#endregion
|
|
138
|
+
export { PiConversation, PiConversationProps, PiMessageComposer, PiMessageComposerProps, ToolRenderer, ToolRendererInput, ToolRendererRegistry, ToolRendererResult, ToolStatus, defaultToolRenderers };
|
|
139
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.tsx"],"mappings":";;;KAkBK,eAAe,gBAClB;KAEG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAO;EACP;;KAGG;EACH,SAAS;EACT;EACA;EACA;EACA;;KAGG;EACH,SAAS;EACT;;KAGG;EACH,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;;KAGG;EACH;IACE;IACA;IACA;;EAEF;IACE;IACA;IACA;;EAEF;IAAiB;IAAkB;IAAY;;EAC/C;;KAGG;EACH;EACA,SAAS;EACT,kBAAkB;EAClB;;KAGG;EACH,QAAQ;EACR;EACA,YACE,WAAW,UAAU;;KAIpB;EACH;EACA;;KAGG;EACH;EACA;;KAGG,sBACH,SAAS,8BACN,QAAQ;KACR,2BAA2B;KAC3B,0BAA0B;EAC7B;EACA;MACI;KACD,kCACH,2EACG;KAEA,2BAA2B;EAC9B;EACA;EACA;EACA;EACA;EACA;;KAGG,6BAA6B;EAChC,OAAO;EACP,OAAO;EACP;MACI;KAEM;KAEA;EACV;IAAW;IAAe;IAAe;;EACzC;EACA;;KAGU;EACV;EACA,SAAS;EACT,QAAQ;EACR;;KAGU,gBAAgB,OAAO,sBAAsB;KAE7C,uBAAuB,eAAe;KAEtC;EACV;EACA;EACA,aAAa;EACb,cAAc;EACd,aAAa;EACb,cAAc;EACd,YAAY;EACZ,aAAa;EACb,WAAW;EACX,mBAAmB;EACnB,OAAO;EACP,QAAQ;;cAwrBG,sBAAsB;KAoIvB;EACV;EACA;EACA;EACA;EACA,aAAa;EACb,OAAO;EACP,QAAQ;;cAGG,sBAAqB,WAAA,WAAA,MAAA,WAAA,aAAA,MAAA,SAQ/B,2CAAsB,IAAA;cA4JZ,mBAAkB,WAAA,cAAA,WAAA,YAAA,YAAA,aAAA,WAAA,aAAA,UAAA,kBAAA,MAAA,SAa5B,wCAAmB,IAAA"}
|