@parlor/agent-host 0.2.0 → 0.3.0
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/dist/acp.d.ts +21 -0
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +138 -12
- package/dist/acp.js.map +1 -1
- package/dist/agent-options.d.ts +17 -0
- package/dist/agent-options.d.ts.map +1 -0
- package/dist/agent-options.js +73 -0
- package/dist/agent-options.js.map +1 -0
- package/dist/agent-tools.d.ts +30 -0
- package/dist/agent-tools.d.ts.map +1 -0
- package/dist/agent-tools.js +71 -0
- package/dist/agent-tools.js.map +1 -0
- package/dist/control.d.ts +15 -0
- package/dist/control.d.ts.map +1 -1
- package/dist/control.js.map +1 -1
- package/dist/daemon.d.ts +10 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +149 -14
- package/dist/daemon.js.map +1 -1
- package/dist/fold.d.ts.map +1 -1
- package/dist/fold.js +2 -0
- package/dist/fold.js.map +1 -1
- package/dist/grants.d.ts +9 -0
- package/dist/grants.d.ts.map +1 -1
- package/dist/grants.js.map +1 -1
- package/dist/learned.d.ts +23 -0
- package/dist/learned.d.ts.map +1 -0
- package/dist/learned.js +36 -0
- package/dist/learned.js.map +1 -0
- package/dist/main.js +105 -9
- package/dist/main.js.map +1 -1
- package/dist/mcp-proxy.d.ts +26 -3
- package/dist/mcp-proxy.d.ts.map +1 -1
- package/dist/mcp-proxy.js +180 -9
- package/dist/mcp-proxy.js.map +1 -1
- package/dist/pairing.d.ts +2 -0
- package/dist/pairing.d.ts.map +1 -1
- package/dist/pairing.js +25 -3
- package/dist/pairing.js.map +1 -1
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +1 -0
- package/dist/paths.js.map +1 -1
- package/dist/policy.d.ts +12 -2
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +13 -3
- package/dist/policy.js.map +1 -1
- package/dist/prompter.d.ts +5 -0
- package/dist/prompter.d.ts.map +1 -1
- package/dist/prompter.js +15 -0
- package/dist/prompter.js.map +1 -1
- package/dist/spec-kit.d.ts +2 -1
- package/dist/spec-kit.d.ts.map +1 -1
- package/dist/spec-kit.js +6 -1
- package/dist/spec-kit.js.map +1 -1
- package/dist/testing/fake-agent.d.ts +12 -0
- package/dist/testing/fake-agent.d.ts.map +1 -1
- package/dist/testing/fake-agent.js +11 -1
- package/dist/testing/fake-agent.js.map +1 -1
- package/dist/turn.d.ts +7 -1
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +16 -3
- package/dist/turn.js.map +1 -1
- package/package.json +9 -9
package/dist/acp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\n\nimport {\n agent as acpAgent,\n client as acpClient,\n type ClientContext,\n type ContentBlock,\n type CreateElicitationRequest,\n type CreateElicitationResponse,\n type McpServer,\n type McpServerStdio,\n type PromptRequest,\n methods,\n ndJsonStream,\n PROTOCOL_VERSION,\n RequestError,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionModeState,\n type SessionNotification,\n type SessionUpdate,\n type StopReason as AcpStopReason,\n type Stream,\n type ToolCall,\n type ToolCallUpdate,\n type ToolKind as AcpToolKind,\n} from \"@agentclientprotocol/sdk\";\n\nimport { commandOf, launchEnvironment } from \"./adapter-launch.js\";\nimport type { AgentProfile } from \"./agents.js\";\nimport { logEvent } from \"./log.js\";\n\n/**\n * The only file that knows ACP. The v1 adapter speaks ndjson over stdio through\n * `@agentclientprotocol/sdk`; an ACP v2 or HTTP-transport agent implements the same\n * port. No ACP type crosses this file.\n */\nexport interface AgentLauncher {\n /** Spawns the profile (never through a shell), runs `initialize`, reports problems. */\n launch(profile: AgentProfile, options: LaunchOptions): Promise<AgentConnection>;\n}\n\nexport interface LaunchOptions {\n readonly cwd: string;\n readonly env: Readonly<Record<string, string>>;\n readonly signal: AbortSignal;\n}\n\nexport interface AgentConnection {\n readonly capabilities: AgentCapabilities;\n openSession(input: OpenSessionInput): Promise<AgentSession>;\n readonly exited: Promise<AgentExit>;\n /** Kills the whole process group. */\n kill(): Promise<void>;\n}\n\n/** `openSession` would not run the session; `leftOpen` when the agent still holds it. */\nexport class SessionRefused extends Error {\n override readonly name = \"SessionRefused\";\n constructor(\n message: string,\n readonly leftOpen: boolean,\n options?: ErrorOptions,\n ) {\n super(message, options);\n }\n}\n\nexport interface AgentCapabilities {\n readonly resume: boolean;\n readonly close: boolean;\n readonly mcpHttp: boolean;\n /** False until the user logs the agent in on a terminal; `problem` says how. */\n readonly ready: boolean;\n readonly problem?: string | undefined;\n}\n\nexport interface OpenSessionInput {\n readonly cwd: string;\n readonly mcpServers: readonly StdioMcpServer[];\n readonly resume?: string | undefined;\n /** A remote turn never runs in a bypass mode. */\n readonly pinAskMode: boolean;\n readonly strictAsk?: boolean | undefined;\n}\n\nexport interface StdioMcpServer {\n readonly name: string;\n readonly command: string;\n readonly args: readonly string[];\n readonly env: Readonly<Record<string, string>>;\n}\n\nexport interface AgentSession {\n readonly id: string;\n readonly resumed: boolean;\n /**\n * Every update reaches `handlers.update` synchronously and in wire order, and the\n * promise settles only after the last one: the stop is queued behind its chunks.\n */\n prompt(blocks: readonly PromptBlock[], handlers: TurnHandlers): Promise<StopReason>;\n cancel(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport type PromptBlock = { readonly kind: \"text\"; readonly text: string };\n\nexport type StopReason =\n | \"end_turn\"\n | \"max_tokens\"\n | \"max_turn_requests\"\n | \"refusal\"\n | \"cancelled\";\n\nexport interface TurnHandlers {\n update(update: AgentUpdate): void;\n ask(ask: AgentAsk): Promise<AgentAskAnswer>;\n}\n\nexport type ToolKind =\n | \"read\"\n | \"edit\"\n | \"delete\"\n | \"move\"\n | \"search\"\n | \"execute\"\n | \"think\"\n | \"fetch\"\n | \"switch_mode\"\n | \"other\";\n\nexport interface McpToolRef {\n readonly server: string;\n readonly tool: string;\n}\n\nexport type AgentUpdate =\n | { readonly kind: \"text\"; readonly text: string }\n | { readonly kind: \"thought\"; readonly text: string }\n | {\n readonly kind: \"tool_start\";\n readonly toolCallId: string;\n readonly title: string;\n readonly toolKind: ToolKind;\n readonly mcp?: McpToolRef | undefined;\n }\n | {\n readonly kind: \"tool_update\";\n readonly toolCallId: string;\n readonly title?: string | undefined;\n readonly status?: \"pending\" | \"in_progress\" | \"completed\" | \"failed\" | undefined;\n readonly detail?: string | undefined;\n }\n | {\n readonly kind: \"plan\";\n readonly entries: readonly {\n readonly content: string;\n readonly status: \"pending\" | \"in_progress\" | \"completed\";\n }[];\n }\n | { readonly kind: \"mode\"; readonly modeId: string };\n\nexport type AskEffect = \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n\nexport type AgentAsk =\n | {\n readonly kind: \"permission\";\n readonly toolCallId: string;\n readonly title: string;\n readonly toolKind: ToolKind;\n readonly mcp?: McpToolRef | undefined;\n readonly options: readonly {\n readonly id: string;\n readonly label: string;\n readonly effect: AskEffect;\n }[];\n }\n | {\n readonly kind: \"question\";\n readonly message: string;\n readonly schema: Readonly<Record<string, unknown>>;\n };\n\nexport type AgentAskAnswer =\n | { readonly kind: \"selected\"; readonly optionId: string }\n | {\n readonly kind: \"values\";\n readonly values: Readonly<Record<string, string | number | boolean>>;\n }\n | { readonly kind: \"declined\" }\n | { readonly kind: \"cancelled\" };\n\nexport type AgentExit =\n | { readonly kind: \"killed\" }\n | {\n readonly kind: \"exited\";\n readonly code: number | null;\n readonly stderrTail: string;\n };\n\n/** The bytes an ACP peer reads and writes: a child's stdio, or a test's pipe. */\nexport interface AcpStdio {\n readonly input: ReadableStream<Uint8Array>;\n readonly output: WritableStream<Uint8Array>;\n}\n\nexport interface AgentModes {\n readonly current: string;\n readonly available: readonly string[];\n}\n\n/** The agent side of ACP in this file's own terms, for the fake agent. */\nexport interface AcpAgentHandlers {\n readonly capabilities: Pick<AgentCapabilities, \"resume\" | \"close\" | \"mcpHttp\">;\n newSession(\n input: OpenSessionInput,\n ): Promise<{ readonly id: string; readonly modes?: AgentModes | undefined }>;\n prompt(\n sessionId: string,\n blocks: readonly PromptBlock[],\n peer: {\n update(update: AgentUpdate): Promise<void>;\n ask(ask: AgentAsk): Promise<AgentAskAnswer>;\n readonly cancelled: AbortSignal;\n },\n ): Promise<StopReason>;\n}\n\nconst STDERR_TAIL_BYTES = 4_096;\nconst KILL_GRACE_MS = 2_000;\nconst MAX_DETAIL_CHARS = 4_000;\nconst AUTH_REQUIRED = -32000;\nconst MCP_PREFIX = \"mcp__\";\n\nconst ASK_MODES_BY_PREFERENCE = [\"default\", \"workspace-write\", \"read-only\"];\nconst STRICT_ASK_MODES_BY_PREFERENCE = [\"default\", \"read-only\", \"workspace-write\"];\n\ntype Fields = Readonly<Record<string, unknown>>;\n\nconst isFields = (value: unknown): value is Fields =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst TOOL_KINDS: ReadonlySet<string> = new Set<ToolKind>([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"think\",\n \"fetch\",\n \"switch_mode\",\n \"other\",\n]);\n\nfunction toolKindOf(kind: AcpToolKind | null | undefined): ToolKind {\n return kind && TOOL_KINDS.has(kind) ? kind : \"other\";\n}\n\nfunction stopReasonOf(reason: AcpStopReason): StopReason {\n return reason;\n}\n\n/**\n * Which MCP server serves a tool call, by the agents' own conventions: Claude Code's\n * `mcp__<server>__<tool>` name, Codex's `mcp.<server>.<tool>` title and raw input.\n */\nfunction mcpRefOf(call: ToolCall | ToolCallUpdate): McpToolRef | undefined {\n const claude = isFields(call._meta?.claudeCode) ? call._meta.claudeCode : undefined;\n const name = typeof claude?.toolName === \"string\" ? claude.toolName : call.name;\n if (name?.startsWith(MCP_PREFIX)) {\n const rest = name.slice(MCP_PREFIX.length);\n const separator = rest.indexOf(\"__\");\n if (separator > 0 && rest.length > separator + 2) {\n return { server: rest.slice(0, separator), tool: rest.slice(separator + 2) };\n }\n }\n const raw = call.rawInput;\n if (\n call.title?.startsWith(\"mcp.\") &&\n isFields(raw) &&\n typeof raw.server === \"string\" &&\n typeof raw.tool === \"string\"\n ) {\n return { server: raw.server, tool: raw.tool };\n }\n return undefined;\n}\n\nfunction readableTitle(title: string, mcp: McpToolRef): string {\n const keys = [\n `${MCP_PREFIX}${mcp.server}__${mcp.tool}`,\n `mcp.${mcp.server}.${mcp.tool}`,\n ];\n return keys.includes(title) ? mcp.tool : title;\n}\n\nfunction detailOf(update: ToolCallUpdate): string | undefined {\n const texts = (update.content ?? []).flatMap((content) =>\n content.type === \"content\" && content.content.type === \"text\"\n ? [content.content.text]\n : [],\n );\n const text = texts.length > 0 ? texts.join(\"\\n\") : update.rawOutput;\n return typeof text === \"string\" && text.trim() !== \"\"\n ? text.slice(0, MAX_DETAIL_CHARS)\n : undefined;\n}\n\nfunction textOf(content: ContentBlock): string | undefined {\n return content.type === \"text\" ? content.text : undefined;\n}\n\nfunction updateOf(update: SessionUpdate): AgentUpdate | undefined {\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n const text = textOf(update.content);\n return text === undefined ? undefined : { kind: \"text\", text };\n }\n case \"agent_thought_chunk\": {\n const text = textOf(update.content);\n return text === undefined ? undefined : { kind: \"thought\", text };\n }\n case \"tool_call\": {\n const mcp = mcpRefOf(update);\n return {\n kind: \"tool_start\",\n toolCallId: update.toolCallId,\n title: mcp ? readableTitle(update.title, mcp) : update.title,\n toolKind: toolKindOf(update.kind),\n mcp,\n };\n }\n case \"tool_call_update\":\n return {\n kind: \"tool_update\",\n toolCallId: update.toolCallId,\n title: update.title ?? undefined,\n status: update.status ?? undefined,\n detail: detailOf(update),\n };\n case \"plan\":\n return {\n kind: \"plan\",\n entries: update.entries.map((entry) => ({\n content: entry.content,\n status: entry.status,\n })),\n };\n case \"current_mode_update\":\n return { kind: \"mode\", modeId: update.currentModeId };\n default:\n return undefined;\n }\n}\n\nfunction sessionUpdateOf(update: AgentUpdate): SessionUpdate {\n switch (update.kind) {\n case \"text\":\n return {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: update.text },\n };\n case \"thought\":\n return {\n sessionUpdate: \"agent_thought_chunk\",\n content: { type: \"text\", text: update.text },\n };\n case \"tool_start\":\n return {\n sessionUpdate: \"tool_call\",\n toolCallId: update.toolCallId,\n title: update.title,\n kind: update.toolKind,\n status: \"pending\",\n ...(update.mcp ? { _meta: claudeToolName(update.mcp) } : {}),\n };\n case \"tool_update\":\n return {\n sessionUpdate: \"tool_call_update\",\n toolCallId: update.toolCallId,\n ...(update.title !== undefined ? { title: update.title } : {}),\n ...(update.status !== undefined ? { status: update.status } : {}),\n ...(update.detail !== undefined\n ? {\n content: [\n { type: \"content\", content: { type: \"text\", text: update.detail } },\n ],\n }\n : {}),\n };\n case \"plan\":\n return {\n sessionUpdate: \"plan\",\n entries: update.entries.map((entry) => ({ ...entry, priority: \"medium\" })),\n };\n case \"mode\":\n return { sessionUpdate: \"current_mode_update\", currentModeId: update.modeId };\n }\n}\n\nconst claudeToolName = (mcp: McpToolRef) => ({\n claudeCode: { toolName: `${MCP_PREFIX}${mcp.server}__${mcp.tool}` },\n});\n\ninterface KnownCall {\n readonly title?: string | undefined;\n readonly mcp?: McpToolRef | undefined;\n}\n\nfunction commandIn(rawInput: unknown): string | undefined {\n return isFields(rawInput) && typeof rawInput.command === \"string\"\n ? rawInput.command\n : undefined;\n}\n\nfunction permissionQuestion(askedTitle: string, callDetail: string | undefined): string {\n const detail = callDetail?.trim() ?? \"\";\n if (detail === \"\" || askedTitle.includes(detail)) return askedTitle;\n if (askedTitle.trim() === \"\" || detail.includes(askedTitle)) return detail;\n return `${askedTitle}: ${detail}`;\n}\n\nfunction permissionAskOf(\n request: RequestPermissionRequest,\n known: KnownCall | undefined,\n): AgentAsk {\n const call = request.toolCall;\n const mcp = mcpRefOf(call) ?? known?.mcp;\n const title = call.title ?? \"\";\n return {\n kind: \"permission\",\n toolCallId: call.toolCallId,\n title: permissionQuestion(\n mcp ? readableTitle(title, mcp) : title,\n known?.title ?? commandIn(call.rawInput),\n ),\n toolKind: toolKindOf(call.kind),\n mcp,\n options: request.options.map((option) => ({\n id: option.optionId,\n label: option.name,\n effect: option.kind,\n })),\n };\n}\n\nfunction permissionAnswerOf(\n request: RequestPermissionRequest,\n answer: AgentAskAnswer,\n): RequestPermissionResponse {\n const selected = (optionId: string) => ({\n outcome: { outcome: \"selected\" as const, optionId },\n });\n if (answer.kind === \"selected\") return selected(answer.optionId);\n if (answer.kind === \"declined\") {\n const reject =\n request.options.find((option) => option.kind === \"reject_once\") ??\n request.options.find((option) => option.kind === \"reject_always\");\n if (reject) return selected(reject.optionId);\n }\n return { outcome: { outcome: \"cancelled\" } };\n}\n\nfunction elicitationAnswerOf(answer: AgentAskAnswer): CreateElicitationResponse {\n switch (answer.kind) {\n case \"values\":\n return { action: \"accept\", content: { ...answer.values } };\n case \"selected\":\n return { action: \"accept\", content: {} };\n case \"declined\":\n return { action: \"decline\" };\n case \"cancelled\":\n return { action: \"cancel\" };\n }\n}\n\nfunction stdioServerOf(server: StdioMcpServer): McpServerStdio {\n return {\n name: server.name,\n command: server.command,\n args: [...server.args],\n env: Object.entries(server.env).map(([name, value]) => ({ name, value })),\n };\n}\n\nfunction stdioServersOf(servers: readonly McpServer[] | undefined): StdioMcpServer[] {\n return (servers ?? []).flatMap((server) =>\n \"command\" in server\n ? [\n {\n name: server.name,\n command: server.command,\n args: server.args,\n env: Object.fromEntries(server.env.map((entry) => [entry.name, entry.value])),\n },\n ]\n : [],\n );\n}\n\n/** Takes `session/update` off the wire in order, before the SDK sees the reply after it. */\nfunction tapUpdates(\n stream: Stream,\n deliver: (notification: SessionNotification) => void,\n): Stream {\n return {\n writable: stream.writable,\n readable: stream.readable.pipeThrough(\n new TransformStream({\n transform(message, controller) {\n const fields: unknown = message;\n if (\n isFields(fields) &&\n fields.method === methods.client.session.update &&\n !(\"id\" in fields)\n ) {\n deliver(fields.params as SessionNotification);\n return;\n }\n controller.enqueue(message);\n },\n }),\n ),\n };\n}\n\nfunction tapSends(stream: Stream): Stream {\n const writer = stream.writable.getWriter();\n return {\n readable: stream.readable,\n writable: new WritableStream({\n write(message) {\n const fields: unknown = message;\n if (isFields(fields) && typeof fields.method === \"string\") {\n logEvent(\"acp_send\", { method: fields.method });\n }\n return writer.write(message);\n },\n close: () => writer.close(),\n abort: (reason) => writer.abort(reason),\n }),\n };\n}\n\ninterface LiveState {\n handlers: TurnHandlers | undefined;\n readonly calls: Map<string, KnownCall>;\n readonly pinned: string | undefined;\n}\n\nfunction askingModeOf(modes: SessionModeState, strict: boolean): string | undefined {\n const available = new Set(modes.availableModes.map((mode) => mode.id));\n if (strict) {\n available.add(modes.currentModeId);\n return STRICT_ASK_MODES_BY_PREFERENCE.find((mode) => available.has(mode));\n }\n if (ASK_MODES_BY_PREFERENCE.includes(modes.currentModeId)) return modes.currentModeId;\n return ASK_MODES_BY_PREFERENCE.find((mode) => available.has(mode));\n}\n\nfunction sessionModesOf(modes: AgentModes | undefined): SessionModeState | undefined {\n return modes\n ? {\n currentModeId: modes.current,\n availableModes: modes.available.map((id) => ({ id, name: id })),\n }\n : undefined;\n}\n\nfunction signalExit(pid: number | undefined, signal: NodeJS.Signals) {\n if (pid === undefined) return;\n try {\n process.kill(-pid, signal);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") throw error;\n }\n}\n\n/** ACP v1 over stdio. */\nexport function acpLauncher(): AgentLauncher {\n return {\n launch: async (profile, options) => {\n const { command, args } = commandOf(profile);\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: await launchEnvironment(profile, options.env),\n detached: true,\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stderr = \"\";\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n stderr = (stderr + chunk).slice(-STDERR_TAIL_BYTES);\n });\n let killing = false;\n const exited = new Promise<AgentExit>((resolve) => {\n child.once(\"error\", (error) =>\n resolve({\n kind: \"exited\",\n code: null,\n stderrTail: `${stderr}${error.message}`,\n }),\n );\n child.once(\"exit\", (code) =>\n resolve(\n killing ? { kind: \"killed\" } : { kind: \"exited\", code, stderrTail: stderr },\n ),\n );\n });\n const kill = async () => {\n if (child.exitCode !== null || child.signalCode !== null) return;\n killing = true;\n signalExit(child.pid, \"SIGTERM\");\n const force = setTimeout(() => signalExit(child.pid, \"SIGKILL\"), KILL_GRACE_MS);\n await exited;\n clearTimeout(force);\n };\n if (options.signal.aborted) void kill();\n options.signal.addEventListener(\"abort\", () => void kill(), { once: true });\n\n const sessions = new Map<string, LiveState>();\n const deliver = (notification: SessionNotification) => {\n const state = sessions.get(notification.sessionId);\n if (!state) return;\n const { update } = notification;\n const mapped = updateOf(update);\n if (!mapped) return;\n if (mapped.kind === \"tool_start\") {\n state.calls.set(mapped.toolCallId, { title: mapped.title, mcp: mapped.mcp });\n } else if (mapped.kind === \"tool_update\" && mapped.title) {\n const known = state.calls.get(mapped.toolCallId);\n state.calls.set(mapped.toolCallId, { ...known, title: mapped.title });\n }\n if (mapped.kind === \"mode\" && state.pinned && mapped.modeId !== state.pinned) {\n void context\n .request(methods.agent.session.setMode, {\n sessionId: notification.sessionId,\n modeId: state.pinned,\n })\n .catch(() => undefined);\n }\n state.handlers?.update(mapped);\n };\n const stream = tapUpdates(\n tapSends(\n ndJsonStream(\n Writable.toWeb(child.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>,\n ),\n ),\n deliver,\n );\n const ask = async (sessionId: string | undefined, question: AgentAsk) => {\n const handlers =\n sessionId === undefined ? undefined : sessions.get(sessionId)?.handlers;\n return handlers ? handlers.ask(question) : ({ kind: \"cancelled\" } as const);\n };\n const connection = acpClient({ name: \"parlor-host\" })\n .onRequest(methods.client.session.requestPermission, async ({ params }) => {\n const known = sessions\n .get(params.sessionId)\n ?.calls.get(params.toolCall.toolCallId);\n const answer = await ask(params.sessionId, permissionAskOf(params, known));\n return permissionAnswerOf(params, answer);\n })\n .onRequest(\n methods.client.elicitation.create,\n async ({ params }: { params: CreateElicitationRequest }) => {\n if (params.mode !== \"form\") return { action: \"cancel\" };\n const sessionId =\n \"sessionId\" in params && typeof params.sessionId === \"string\"\n ? params.sessionId\n : undefined;\n const schema = isFields(params.requestedSchema) ? params.requestedSchema : {};\n const answer = await ask(sessionId, {\n kind: \"question\",\n message: params.message,\n schema,\n });\n return elicitationAnswerOf(answer);\n },\n )\n .connect(stream);\n const context: ClientContext = connection.agent;\n exited.then(\n () => connection.close(),\n () => undefined,\n );\n\n let initialized;\n try {\n initialized = await context.request(methods.agent.initialize, {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: { elicitation: { form: {} } },\n clientInfo: { name: \"parlor-host\", version: \"0.0.0\" },\n });\n } catch (error) {\n await kill();\n const exit = await exited;\n const why =\n exit.kind === \"exited\" && exit.stderrTail ? `: ${exit.stderrTail.trim()}` : \"\";\n throw new Error(`${profile.name} did not start${why}`, { cause: error });\n }\n const agentCapabilities = initialized.agentCapabilities ?? {};\n const capabilities: AgentCapabilities = {\n resume: Boolean(agentCapabilities.sessionCapabilities?.resume),\n close: Boolean(agentCapabilities.sessionCapabilities?.close),\n mcpHttp: agentCapabilities.mcpCapabilities?.http === true,\n ready: true,\n };\n\n const loginProblem = (error: unknown) =>\n error instanceof RequestError && error.code === AUTH_REQUIRED\n ? new Error(\n `${profile.name} is not logged in on this computer: run \\`${profile.binary}\\` in a terminal to log in.`,\n { cause: error },\n )\n : error;\n\n const open = async (input: OpenSessionInput) => {\n const mcpServers = input.mcpServers.map(stdioServerOf);\n if (input.resume && capabilities.resume) {\n try {\n const resumed = await context.request(methods.agent.session.resume, {\n sessionId: input.resume,\n cwd: input.cwd,\n mcpServers,\n });\n return { id: input.resume, modes: resumed.modes, resumed: true };\n } catch {}\n }\n const created = await context.request(methods.agent.session.new, {\n cwd: input.cwd,\n mcpServers,\n });\n return { id: created.sessionId, modes: created.modes, resumed: false };\n };\n\n return {\n capabilities,\n exited,\n kill,\n openSession: async (input) => {\n let opened;\n try {\n opened = await open(input);\n } catch (error) {\n throw loginProblem(error);\n }\n const sessionId = opened.id;\n const close = async (): Promise<boolean> => {\n sessions.delete(sessionId);\n if (!capabilities.close) return false;\n return context.request(methods.agent.session.close, { sessionId }).then(\n () => true,\n () => false,\n );\n };\n const modes = input.pinAskMode ? opened.modes : undefined;\n const pinned = modes\n ? askingModeOf(modes, input.strictAsk === true)\n : undefined;\n if (modes && pinned === undefined) {\n throw new SessionRefused(\n `${profile.name} offers no mode that asks before it acts, so it cannot take a turn from an app.`,\n !(await close()),\n );\n }\n const state: LiveState = { handlers: undefined, calls: new Map(), pinned };\n sessions.set(sessionId, state);\n if (pinned !== undefined && pinned !== modes?.currentModeId) {\n try {\n await context.request(methods.agent.session.setMode, {\n sessionId,\n modeId: pinned,\n });\n } catch (error) {\n throw new SessionRefused(\n `${profile.name} did not switch to a mode that asks before it acts.`,\n !(await close()),\n { cause: error },\n );\n }\n }\n const session: AgentSession = {\n id: sessionId,\n resumed: opened.resumed,\n prompt: async (blocks, handlers) => {\n if (state.handlers)\n throw new Error(\"This session is already answering a prompt.\");\n state.handlers = handlers;\n try {\n const request: PromptRequest = {\n sessionId,\n prompt: blocks.map((block) => ({ type: \"text\", text: block.text })),\n };\n const response = await context.request(\n methods.agent.session.prompt,\n request,\n );\n return stopReasonOf(response.stopReason);\n } finally {\n state.handlers = undefined;\n }\n },\n cancel: () =>\n context\n .notify(methods.agent.session.cancel, { sessionId })\n .catch(() => undefined),\n close: async () => {\n await close();\n },\n };\n return session;\n },\n };\n },\n };\n}\n\n/** Serves `handlers` as an ACP agent on `io`, until the other side hangs up. */\nexport function serveAcpAgent(handlers: AcpAgentHandlers, io: AcpStdio): Promise<void> {\n const running = new Map<string, AbortController>();\n const aliases = new Map<string, string>();\n const idOf = (sessionId: string) => aliases.get(sessionId) ?? sessionId;\n const app = acpAgent({ name: \"parlor-fake-agent\" })\n .onRequest(methods.agent.initialize, () => ({\n protocolVersion: PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: false,\n mcpCapabilities: { http: handlers.capabilities.mcpHttp, sse: false },\n sessionCapabilities: {\n ...(handlers.capabilities.resume ? { resume: {} } : {}),\n ...(handlers.capabilities.close ? { close: {} } : {}),\n },\n },\n authMethods: [],\n }))\n .onRequest(methods.agent.session.new, async ({ params }) => {\n const { id, modes } = await handlers.newSession({\n cwd: params.cwd,\n mcpServers: stdioServersOf(params.mcpServers),\n pinAskMode: false,\n });\n const state = sessionModesOf(modes);\n return { sessionId: id, ...(state ? { modes: state } : {}) };\n })\n .onRequest(methods.agent.session.resume, async ({ params }) => {\n if (!handlers.capabilities.resume) {\n throw RequestError.methodNotFound(methods.agent.session.resume);\n }\n const { id } = await handlers.newSession({\n cwd: params.cwd,\n mcpServers: stdioServersOf(params.mcpServers),\n pinAskMode: false,\n });\n aliases.set(params.sessionId, id);\n return {};\n })\n .onRequest(methods.agent.session.setMode, () => ({}))\n .onRequest(methods.agent.session.close, () => {\n if (!handlers.capabilities.close) {\n throw RequestError.methodNotFound(methods.agent.session.close);\n }\n return {};\n })\n .onRequest(methods.agent.session.prompt, async ({ params, client }) => {\n const sessionId = params.sessionId;\n const cancelled = new AbortController();\n running.set(sessionId, cancelled);\n try {\n const blocks = params.prompt.flatMap((block): PromptBlock[] =>\n block.type === \"text\" ? [{ kind: \"text\", text: block.text }] : [],\n );\n const stopReason = await handlers.prompt(idOf(sessionId), blocks, {\n update: (update) =>\n client.notify(methods.client.session.update, {\n sessionId,\n update: sessionUpdateOf(update),\n }),\n ask: async (question) => {\n if (question.kind === \"question\") {\n const answer = await client.request(methods.client.elicitation.create, {\n sessionId,\n mode: \"form\",\n message: question.message,\n requestedSchema: question.schema as never,\n });\n if (answer.action === \"accept\") {\n const content = isFields(answer.content) ? answer.content : {};\n return { kind: \"values\", values: content as never };\n }\n return answer.action === \"decline\"\n ? { kind: \"declined\" }\n : { kind: \"cancelled\" };\n }\n const request: RequestPermissionRequest = {\n sessionId,\n toolCall: {\n toolCallId: question.toolCallId,\n title: question.title,\n kind: question.toolKind,\n status: \"pending\",\n ...(question.mcp ? { _meta: claudeToolName(question.mcp) } : {}),\n },\n options: question.options.map((option) => ({\n optionId: option.id,\n name: option.label,\n kind: option.effect,\n })),\n };\n const answer = await client.request(\n methods.client.session.requestPermission,\n request,\n );\n return answer.outcome.outcome === \"selected\"\n ? { kind: \"selected\", optionId: answer.outcome.optionId }\n : { kind: \"cancelled\" };\n },\n cancelled: cancelled.signal,\n });\n return { stopReason };\n } finally {\n running.delete(sessionId);\n }\n })\n .onNotification(methods.agent.session.cancel, ({ params }) => {\n running.get(params.sessionId)?.abort();\n });\n return app.connect(ndJsonStream(io.output, io.input)).closed;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\n\nimport {\n agent as acpAgent,\n client as acpClient,\n type ClientContext,\n type ContentBlock,\n type CreateElicitationRequest,\n type CreateElicitationResponse,\n type McpServer,\n type McpServerStdio,\n type PromptRequest,\n methods,\n ndJsonStream,\n PROTOCOL_VERSION,\n RequestError,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionConfigOption,\n type SessionModeState,\n type SessionNotification,\n type SessionUpdate,\n type StopReason as AcpStopReason,\n type Stream,\n type ToolCall,\n type ToolCallUpdate,\n type ToolKind as AcpToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type { AgentOption, AgentUsage } from \"@parlor/chat\";\n\nimport { commandOf, launchEnvironment } from \"./adapter-launch.js\";\nimport { agentUsageOf } from \"./agent-options.js\";\nimport type { AgentProfile } from \"./agents.js\";\nimport { logEvent } from \"./log.js\";\n\n/**\n * The only file that knows ACP. The v1 adapter speaks ndjson over stdio through\n * `@agentclientprotocol/sdk`; an ACP v2 or HTTP-transport agent implements the same\n * port. No ACP type crosses this file.\n */\nexport interface AgentLauncher {\n /** Spawns the profile (never through a shell), runs `initialize`, reports problems. */\n launch(profile: AgentProfile, options: LaunchOptions): Promise<AgentConnection>;\n}\n\nexport interface LaunchOptions {\n readonly cwd: string;\n readonly env: Readonly<Record<string, string>>;\n readonly signal: AbortSignal;\n}\n\nexport interface AgentConnection {\n readonly capabilities: AgentCapabilities;\n openSession(input: OpenSessionInput): Promise<AgentSession>;\n readonly exited: Promise<AgentExit>;\n /** Kills the whole process group. */\n kill(): Promise<void>;\n}\n\n/** `openSession` would not run the session; `leftOpen` when the agent still holds it. */\nexport class SessionRefused extends Error {\n override readonly name = \"SessionRefused\";\n constructor(\n message: string,\n readonly leftOpen: boolean,\n options?: ErrorOptions,\n ) {\n super(message, options);\n }\n}\n\nexport interface AgentCapabilities {\n readonly resume: boolean;\n readonly close: boolean;\n readonly mcpHttp: boolean;\n /** False until the user logs the agent in on a terminal; `problem` says how. */\n readonly ready: boolean;\n readonly problem?: string | undefined;\n}\n\nexport interface OpenSessionInput {\n readonly cwd: string;\n readonly mcpServers: readonly StdioMcpServer[];\n readonly resume?: string | undefined;\n /** A remote turn never runs in a bypass mode. */\n readonly pinAskMode: boolean;\n readonly strictAsk?: boolean | undefined;\n /**\n * With `pinAskMode`, the agent's own safety review where it has one (Claude's `auto`,\n * Codex's `agent`), asking only for what that review flags. Once the agent leaves it, the\n * session stays in a mode that asks before every action.\n */\n readonly autoMode?: boolean | undefined;\n}\n\nexport interface StdioMcpServer {\n readonly name: string;\n readonly command: string;\n readonly args: readonly string[];\n readonly env: Readonly<Record<string, string>>;\n}\n\nexport interface AgentSession {\n readonly id: string;\n readonly resumed: boolean;\n /**\n * Every update reaches `handlers.update` synchronously and in wire order, and the\n * promise settles only after the last one: the stop is queued behind its chunks.\n */\n prompt(blocks: readonly PromptBlock[], handlers: TurnHandlers): Promise<StopReason>;\n cancel(): Promise<void>;\n close(): Promise<void>;\n /** What a prompt may choose for this session now, with the value it runs with. */\n readonly options: readonly AgentOption[];\n /** Sets one of `options` to one of its values. */\n setOption(id: string, value: string): Promise<void>;\n}\n\nexport type PromptBlock = { readonly kind: \"text\"; readonly text: string };\n\nexport type StopReason =\n | \"end_turn\"\n | \"max_tokens\"\n | \"max_turn_requests\"\n | \"refusal\"\n | \"cancelled\";\n\nexport interface TurnHandlers {\n update(update: AgentUpdate): void;\n ask(ask: AgentAsk): Promise<AgentAskAnswer>;\n}\n\nexport type ToolKind =\n | \"read\"\n | \"edit\"\n | \"delete\"\n | \"move\"\n | \"search\"\n | \"execute\"\n | \"think\"\n | \"fetch\"\n | \"switch_mode\"\n | \"other\";\n\nexport interface McpToolRef {\n readonly server: string;\n readonly tool: string;\n}\n\nexport type AgentUpdate =\n | { readonly kind: \"text\"; readonly text: string }\n | { readonly kind: \"thought\"; readonly text: string }\n | {\n readonly kind: \"tool_start\";\n readonly toolCallId: string;\n readonly title: string;\n readonly toolKind: ToolKind;\n readonly mcp?: McpToolRef | undefined;\n }\n | {\n readonly kind: \"tool_update\";\n readonly toolCallId: string;\n readonly title?: string | undefined;\n readonly status?: \"pending\" | \"in_progress\" | \"completed\" | \"failed\" | undefined;\n readonly detail?: string | undefined;\n }\n | {\n readonly kind: \"plan\";\n readonly entries: readonly {\n readonly content: string;\n readonly status: \"pending\" | \"in_progress\" | \"completed\";\n }[];\n }\n | { readonly kind: \"mode\"; readonly modeId: string }\n | { readonly kind: \"options\"; readonly options: readonly AgentOption[] }\n | { readonly kind: \"usage\"; readonly usage: AgentUsage };\n\nexport type AskEffect = \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n\nexport type AgentAsk =\n | {\n readonly kind: \"permission\";\n readonly toolCallId: string;\n readonly title: string;\n readonly toolKind: ToolKind;\n readonly mcp?: McpToolRef | undefined;\n readonly options: readonly {\n readonly id: string;\n readonly label: string;\n readonly effect: AskEffect;\n }[];\n }\n | {\n readonly kind: \"question\";\n readonly message: string;\n readonly schema: Readonly<Record<string, unknown>>;\n };\n\nexport type AgentAskAnswer =\n | { readonly kind: \"selected\"; readonly optionId: string }\n | {\n readonly kind: \"values\";\n readonly values: Readonly<Record<string, string | number | boolean>>;\n }\n | { readonly kind: \"declined\" }\n | { readonly kind: \"cancelled\" };\n\nexport type AgentExit =\n | { readonly kind: \"killed\" }\n | {\n readonly kind: \"exited\";\n readonly code: number | null;\n readonly stderrTail: string;\n };\n\n/** The bytes an ACP peer reads and writes: a child's stdio, or a test's pipe. */\nexport interface AcpStdio {\n readonly input: ReadableStream<Uint8Array>;\n readonly output: WritableStream<Uint8Array>;\n}\n\nexport interface AgentModes {\n readonly current: string;\n readonly available: readonly string[];\n}\n\n/** The agent side of ACP in this file's own terms, for the fake agent. */\nexport interface AcpAgentHandlers {\n readonly capabilities: Pick<AgentCapabilities, \"resume\" | \"close\" | \"mcpHttp\">;\n newSession(input: OpenSessionInput): Promise<{\n readonly id: string;\n readonly modes?: AgentModes | undefined;\n readonly options?: readonly AgentOption[] | undefined;\n }>;\n prompt(\n sessionId: string,\n blocks: readonly PromptBlock[],\n peer: {\n update(update: AgentUpdate): Promise<void>;\n ask(ask: AgentAsk): Promise<AgentAskAnswer>;\n readonly cancelled: AbortSignal;\n },\n ): Promise<StopReason>;\n}\n\nconst STDERR_TAIL_BYTES = 4_096;\nconst KILL_GRACE_MS = 2_000;\nconst MAX_DETAIL_CHARS = 4_000;\nconst AUTH_REQUIRED = -32000;\nconst MCP_PREFIX = \"mcp__\";\n\nconst AUTO_MODES_BY_PREFERENCE = [\"auto\", \"agent\"];\nconst ASK_MODES_BY_PREFERENCE = [\"default\", \"workspace-write\", \"read-only\"];\nconst STRICT_ASK_MODES_BY_PREFERENCE = [\"default\", \"read-only\", \"workspace-write\"];\n\ntype Fields = Readonly<Record<string, unknown>>;\n\nconst isFields = (value: unknown): value is Fields =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst TOOL_KINDS: ReadonlySet<string> = new Set<ToolKind>([\n \"read\",\n \"edit\",\n \"delete\",\n \"move\",\n \"search\",\n \"execute\",\n \"think\",\n \"fetch\",\n \"switch_mode\",\n \"other\",\n]);\n\nfunction toolKindOf(kind: AcpToolKind | null | undefined): ToolKind {\n return kind && TOOL_KINDS.has(kind) ? kind : \"other\";\n}\n\nfunction stopReasonOf(reason: AcpStopReason): StopReason {\n return reason;\n}\n\n/**\n * Which MCP server serves a tool call, by the agents' own conventions: Claude Code's\n * `mcp__<server>__<tool>` name, Codex's `mcp.<server>.<tool>` title and raw input.\n */\nfunction mcpRefOf(call: ToolCall | ToolCallUpdate): McpToolRef | undefined {\n const claude = isFields(call._meta?.claudeCode) ? call._meta.claudeCode : undefined;\n const name = typeof claude?.toolName === \"string\" ? claude.toolName : call.name;\n if (name?.startsWith(MCP_PREFIX)) {\n const rest = name.slice(MCP_PREFIX.length);\n const separator = rest.indexOf(\"__\");\n if (separator > 0 && rest.length > separator + 2) {\n return { server: rest.slice(0, separator), tool: rest.slice(separator + 2) };\n }\n }\n const raw = call.rawInput;\n if (\n call.title?.startsWith(\"mcp.\") &&\n isFields(raw) &&\n typeof raw.server === \"string\" &&\n typeof raw.tool === \"string\"\n ) {\n return { server: raw.server, tool: raw.tool };\n }\n return undefined;\n}\n\nfunction readableTitle(title: string, mcp: McpToolRef): string {\n const keys = [\n `${MCP_PREFIX}${mcp.server}__${mcp.tool}`,\n `mcp.${mcp.server}.${mcp.tool}`,\n ];\n return keys.includes(title) ? mcp.tool : title;\n}\n\nfunction detailOf(update: ToolCallUpdate): string | undefined {\n const texts = (update.content ?? []).flatMap((content) =>\n content.type === \"content\" && content.content.type === \"text\"\n ? [content.content.text]\n : [],\n );\n const text = texts.length > 0 ? texts.join(\"\\n\") : update.rawOutput;\n return typeof text === \"string\" && text.trim() !== \"\"\n ? text.slice(0, MAX_DETAIL_CHARS)\n : undefined;\n}\n\nfunction textOf(content: ContentBlock): string | undefined {\n return content.type === \"text\" ? content.text : undefined;\n}\n\nfunction updateOf(update: SessionUpdate): AgentUpdate | undefined {\n switch (update.sessionUpdate) {\n case \"agent_message_chunk\": {\n const text = textOf(update.content);\n return text === undefined ? undefined : { kind: \"text\", text };\n }\n case \"agent_thought_chunk\": {\n const text = textOf(update.content);\n return text === undefined ? undefined : { kind: \"thought\", text };\n }\n case \"tool_call\": {\n const mcp = mcpRefOf(update);\n return {\n kind: \"tool_start\",\n toolCallId: update.toolCallId,\n title: mcp ? readableTitle(update.title, mcp) : update.title,\n toolKind: toolKindOf(update.kind),\n mcp,\n };\n }\n case \"tool_call_update\":\n return {\n kind: \"tool_update\",\n toolCallId: update.toolCallId,\n title: update.title ?? undefined,\n status: update.status ?? undefined,\n detail: detailOf(update),\n };\n case \"plan\":\n return {\n kind: \"plan\",\n entries: update.entries.map((entry) => ({\n content: entry.content,\n status: entry.status,\n })),\n };\n case \"current_mode_update\":\n return { kind: \"mode\", modeId: update.currentModeId };\n case \"config_option_update\":\n return { kind: \"options\", options: agentOptionsOf(update.configOptions) };\n case \"usage_update\": {\n const usage = agentUsageOf(update._meta, Date.now());\n return usage && { kind: \"usage\", usage };\n }\n default:\n return undefined;\n }\n}\n\nfunction sessionUpdateOf(update: AgentUpdate): SessionUpdate {\n switch (update.kind) {\n case \"text\":\n return {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: update.text },\n };\n case \"thought\":\n return {\n sessionUpdate: \"agent_thought_chunk\",\n content: { type: \"text\", text: update.text },\n };\n case \"tool_start\":\n return {\n sessionUpdate: \"tool_call\",\n toolCallId: update.toolCallId,\n title: update.title,\n kind: update.toolKind,\n status: \"pending\",\n ...(update.mcp ? { _meta: claudeToolName(update.mcp) } : {}),\n };\n case \"tool_update\":\n return {\n sessionUpdate: \"tool_call_update\",\n toolCallId: update.toolCallId,\n ...(update.title !== undefined ? { title: update.title } : {}),\n ...(update.status !== undefined ? { status: update.status } : {}),\n ...(update.detail !== undefined\n ? {\n content: [\n { type: \"content\", content: { type: \"text\", text: update.detail } },\n ],\n }\n : {}),\n };\n case \"plan\":\n return {\n sessionUpdate: \"plan\",\n entries: update.entries.map((entry) => ({ ...entry, priority: \"medium\" })),\n };\n case \"mode\":\n return { sessionUpdate: \"current_mode_update\", currentModeId: update.modeId };\n case \"options\":\n return {\n sessionUpdate: \"config_option_update\",\n configOptions: update.options.map(configOptionOf),\n };\n case \"usage\":\n return {\n sessionUpdate: \"usage_update\",\n used: 0,\n size: 0,\n _meta: {\n \"_claude/rateLimit\": {\n unifiedWindows: Object.fromEntries(\n update.usage.windows.map((window) => [\n window.id,\n {\n utilization: window.used,\n ...(window.resetsAt === undefined\n ? {}\n : { resetsAt: window.resetsAt / 1000 }),\n },\n ]),\n ),\n },\n },\n };\n }\n}\n\n/** The permission mode is the computer's to pin; `model_config` tunes a model, not a choice. */\nconst HIDDEN_CATEGORIES = new Set([\"mode\", \"model_config\"]);\n\n/** The agent's select options a prompt may choose, its groups flattened. */\nexport function agentOptionsOf(\n configOptions: readonly SessionConfigOption[] | null | undefined,\n): AgentOption[] {\n return (configOptions ?? []).flatMap((option): AgentOption[] => {\n if (option.type !== \"select\") return [];\n if (option.category && HIDDEN_CATEGORIES.has(option.category)) return [];\n const values = option.options.flatMap((entry) =>\n \"options\" in entry ? entry.options : [entry],\n );\n return [\n {\n id: option.id,\n name: option.name,\n ...(option.category ? { category: option.category } : {}),\n current: option.currentValue,\n values: values.map((value) => ({\n id: value.value,\n name: value.name,\n ...(value.description ? { description: value.description } : {}),\n })),\n },\n ];\n });\n}\n\nfunction configOptionOf(option: AgentOption): SessionConfigOption {\n return {\n id: option.id,\n name: option.name,\n ...(option.category ? { category: option.category } : {}),\n type: \"select\",\n currentValue: option.current,\n options: option.values.map((value) => ({\n value: value.id,\n name: value.name,\n ...(value.description ? { description: value.description } : {}),\n })),\n };\n}\n\nconst claudeToolName = (mcp: McpToolRef) => ({\n claudeCode: { toolName: `${MCP_PREFIX}${mcp.server}__${mcp.tool}` },\n});\n\ninterface KnownCall {\n readonly title?: string | undefined;\n readonly mcp?: McpToolRef | undefined;\n}\n\nfunction commandIn(rawInput: unknown): string | undefined {\n return isFields(rawInput) && typeof rawInput.command === \"string\"\n ? rawInput.command\n : undefined;\n}\n\nfunction permissionQuestion(askedTitle: string, callDetail: string | undefined): string {\n const detail = callDetail?.trim() ?? \"\";\n if (detail === \"\" || askedTitle.includes(detail)) return askedTitle;\n if (askedTitle.trim() === \"\" || detail.includes(askedTitle)) return detail;\n return `${askedTitle}: ${detail}`;\n}\n\nfunction permissionAskOf(\n request: RequestPermissionRequest,\n known: KnownCall | undefined,\n): AgentAsk {\n const call = request.toolCall;\n const mcp = mcpRefOf(call) ?? known?.mcp;\n const title = call.title ?? \"\";\n return {\n kind: \"permission\",\n toolCallId: call.toolCallId,\n title: permissionQuestion(\n mcp ? readableTitle(title, mcp) : title,\n known?.title ?? commandIn(call.rawInput),\n ),\n toolKind: toolKindOf(call.kind),\n mcp,\n options: request.options.map((option) => ({\n id: option.optionId,\n label: option.name,\n effect: option.kind,\n })),\n };\n}\n\nfunction permissionAnswerOf(\n request: RequestPermissionRequest,\n answer: AgentAskAnswer,\n): RequestPermissionResponse {\n const selected = (optionId: string) => ({\n outcome: { outcome: \"selected\" as const, optionId },\n });\n if (answer.kind === \"selected\") return selected(answer.optionId);\n if (answer.kind === \"declined\") {\n const reject =\n request.options.find((option) => option.kind === \"reject_once\") ??\n request.options.find((option) => option.kind === \"reject_always\");\n if (reject) return selected(reject.optionId);\n }\n return { outcome: { outcome: \"cancelled\" } };\n}\n\nfunction elicitationAnswerOf(answer: AgentAskAnswer): CreateElicitationResponse {\n switch (answer.kind) {\n case \"values\":\n return { action: \"accept\", content: { ...answer.values } };\n case \"selected\":\n return { action: \"accept\", content: {} };\n case \"declined\":\n return { action: \"decline\" };\n case \"cancelled\":\n return { action: \"cancel\" };\n }\n}\n\nfunction stdioServerOf(server: StdioMcpServer): McpServerStdio {\n return {\n name: server.name,\n command: server.command,\n args: [...server.args],\n env: Object.entries(server.env).map(([name, value]) => ({ name, value })),\n };\n}\n\nfunction stdioServersOf(servers: readonly McpServer[] | undefined): StdioMcpServer[] {\n return (servers ?? []).flatMap((server) =>\n \"command\" in server\n ? [\n {\n name: server.name,\n command: server.command,\n args: server.args,\n env: Object.fromEntries(server.env.map((entry) => [entry.name, entry.value])),\n },\n ]\n : [],\n );\n}\n\n/** Takes `session/update` off the wire in order, before the SDK sees the reply after it. */\nfunction tapUpdates(\n stream: Stream,\n deliver: (notification: SessionNotification) => void,\n): Stream {\n return {\n writable: stream.writable,\n readable: stream.readable.pipeThrough(\n new TransformStream({\n transform(message, controller) {\n const fields: unknown = message;\n if (\n isFields(fields) &&\n fields.method === methods.client.session.update &&\n !(\"id\" in fields)\n ) {\n deliver(fields.params as SessionNotification);\n return;\n }\n controller.enqueue(message);\n },\n }),\n ),\n };\n}\n\nfunction tapSends(stream: Stream): Stream {\n const writer = stream.writable.getWriter();\n return {\n readable: stream.readable,\n writable: new WritableStream({\n write(message) {\n const fields: unknown = message;\n if (isFields(fields) && typeof fields.method === \"string\") {\n logEvent(\"acp_send\", { method: fields.method });\n }\n return writer.write(message);\n },\n close: () => writer.close(),\n abort: (reason) => writer.abort(reason),\n }),\n };\n}\n\ninterface LiveState {\n handlers: TurnHandlers | undefined;\n readonly calls: Map<string, KnownCall>;\n pinned: string | undefined;\n fallback: string | undefined;\n options: readonly AgentOption[];\n}\n\nfunction askingModeOf(modes: SessionModeState, strict: boolean): string | undefined {\n const available = new Set(modes.availableModes.map((mode) => mode.id));\n if (strict) {\n available.add(modes.currentModeId);\n return STRICT_ASK_MODES_BY_PREFERENCE.find((mode) => available.has(mode));\n }\n if (ASK_MODES_BY_PREFERENCE.includes(modes.currentModeId)) return modes.currentModeId;\n return ASK_MODES_BY_PREFERENCE.find((mode) => available.has(mode));\n}\n\nfunction autoModeOf(modes: SessionModeState): string | undefined {\n const available = new Set(modes.availableModes.map((mode) => mode.id));\n return AUTO_MODES_BY_PREFERENCE.find((mode) => available.has(mode));\n}\n\nfunction sessionModesOf(modes: AgentModes | undefined): SessionModeState | undefined {\n return modes\n ? {\n currentModeId: modes.current,\n availableModes: modes.available.map((id) => ({ id, name: id })),\n }\n : undefined;\n}\n\nfunction signalExit(pid: number | undefined, signal: NodeJS.Signals) {\n if (pid === undefined) return;\n try {\n process.kill(-pid, signal);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ESRCH\") throw error;\n }\n}\n\n/** ACP v1 over stdio. */\nexport function acpLauncher(): AgentLauncher {\n return {\n launch: async (profile, options) => {\n const { command, args } = commandOf(profile);\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: await launchEnvironment(profile, options.env),\n detached: true,\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stderr = \"\";\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n stderr = (stderr + chunk).slice(-STDERR_TAIL_BYTES);\n });\n let killing = false;\n const exited = new Promise<AgentExit>((resolve) => {\n child.once(\"error\", (error) =>\n resolve({\n kind: \"exited\",\n code: null,\n stderrTail: `${stderr}${error.message}`,\n }),\n );\n child.once(\"exit\", (code) =>\n resolve(\n killing ? { kind: \"killed\" } : { kind: \"exited\", code, stderrTail: stderr },\n ),\n );\n });\n const kill = async () => {\n if (child.exitCode !== null || child.signalCode !== null) return;\n killing = true;\n signalExit(child.pid, \"SIGTERM\");\n const force = setTimeout(() => signalExit(child.pid, \"SIGKILL\"), KILL_GRACE_MS);\n await exited;\n clearTimeout(force);\n };\n if (options.signal.aborted) void kill();\n options.signal.addEventListener(\"abort\", () => void kill(), { once: true });\n\n const sessions = new Map<string, LiveState>();\n const deliver = (notification: SessionNotification) => {\n const state = sessions.get(notification.sessionId);\n if (!state) return;\n const { update } = notification;\n const mapped = updateOf(update);\n if (!mapped) return;\n if (mapped.kind === \"tool_start\") {\n state.calls.set(mapped.toolCallId, { title: mapped.title, mcp: mapped.mcp });\n } else if (mapped.kind === \"tool_update\" && mapped.title) {\n const known = state.calls.get(mapped.toolCallId);\n state.calls.set(mapped.toolCallId, { ...known, title: mapped.title });\n } else if (mapped.kind === \"options\") {\n state.options = mapped.options;\n }\n if (mapped.kind === \"mode\" && state.pinned && mapped.modeId !== state.pinned) {\n state.pinned = state.fallback ?? state.pinned;\n state.fallback = undefined;\n if (mapped.modeId !== state.pinned) {\n void context\n .request(methods.agent.session.setMode, {\n sessionId: notification.sessionId,\n modeId: state.pinned,\n })\n .catch(() => undefined);\n }\n }\n state.handlers?.update(mapped);\n };\n const stream = tapUpdates(\n tapSends(\n ndJsonStream(\n Writable.toWeb(child.stdin) as WritableStream<Uint8Array>,\n Readable.toWeb(child.stdout) as ReadableStream<Uint8Array>,\n ),\n ),\n deliver,\n );\n const ask = async (sessionId: string | undefined, question: AgentAsk) => {\n const handlers =\n sessionId === undefined ? undefined : sessions.get(sessionId)?.handlers;\n return handlers ? handlers.ask(question) : ({ kind: \"cancelled\" } as const);\n };\n const connection = acpClient({ name: \"parlor-host\" })\n .onRequest(methods.client.session.requestPermission, async ({ params }) => {\n const known = sessions\n .get(params.sessionId)\n ?.calls.get(params.toolCall.toolCallId);\n const answer = await ask(params.sessionId, permissionAskOf(params, known));\n return permissionAnswerOf(params, answer);\n })\n .onRequest(\n methods.client.elicitation.create,\n async ({ params }: { params: CreateElicitationRequest }) => {\n if (params.mode !== \"form\") return { action: \"cancel\" };\n const sessionId =\n \"sessionId\" in params && typeof params.sessionId === \"string\"\n ? params.sessionId\n : undefined;\n const schema = isFields(params.requestedSchema) ? params.requestedSchema : {};\n const answer = await ask(sessionId, {\n kind: \"question\",\n message: params.message,\n schema,\n });\n return elicitationAnswerOf(answer);\n },\n )\n .connect(stream);\n const context: ClientContext = connection.agent;\n exited.then(\n () => connection.close(),\n () => undefined,\n );\n\n let initialized;\n try {\n initialized = await context.request(methods.agent.initialize, {\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: { elicitation: { form: {} } },\n clientInfo: { name: \"parlor-host\", version: \"0.0.0\" },\n });\n } catch (error) {\n await kill();\n const exit = await exited;\n const why =\n exit.kind === \"exited\" && exit.stderrTail ? `: ${exit.stderrTail.trim()}` : \"\";\n throw new Error(`${profile.name} did not start${why}`, { cause: error });\n }\n const agentCapabilities = initialized.agentCapabilities ?? {};\n const capabilities: AgentCapabilities = {\n resume: Boolean(agentCapabilities.sessionCapabilities?.resume),\n close: Boolean(agentCapabilities.sessionCapabilities?.close),\n mcpHttp: agentCapabilities.mcpCapabilities?.http === true,\n ready: true,\n };\n\n const loginProblem = (error: unknown) =>\n error instanceof RequestError && error.code === AUTH_REQUIRED\n ? new Error(\n `${profile.name} is not logged in on this computer: run \\`${profile.binary}\\` in a terminal to log in.`,\n { cause: error },\n )\n : error;\n\n const open = async (input: OpenSessionInput) => {\n const mcpServers = input.mcpServers.map(stdioServerOf);\n if (input.resume && capabilities.resume) {\n try {\n const resumed = await context.request(methods.agent.session.resume, {\n sessionId: input.resume,\n cwd: input.cwd,\n mcpServers,\n });\n return {\n id: input.resume,\n modes: resumed.modes,\n configOptions: resumed.configOptions,\n resumed: true,\n };\n } catch {}\n }\n const created = await context.request(methods.agent.session.new, {\n cwd: input.cwd,\n mcpServers,\n });\n return {\n id: created.sessionId,\n modes: created.modes,\n configOptions: created.configOptions,\n resumed: false,\n };\n };\n\n return {\n capabilities,\n exited,\n kill,\n openSession: async (input) => {\n let opened;\n try {\n opened = await open(input);\n } catch (error) {\n throw loginProblem(error);\n }\n const sessionId = opened.id;\n const close = async (): Promise<boolean> => {\n sessions.delete(sessionId);\n if (!capabilities.close) return false;\n return context.request(methods.agent.session.close, { sessionId }).then(\n () => true,\n () => false,\n );\n };\n const modes = input.pinAskMode ? opened.modes : undefined;\n const asking = modes\n ? askingModeOf(modes, input.strictAsk === true)\n : undefined;\n const auto = modes && input.autoMode ? autoModeOf(modes) : undefined;\n const pinned = asking === undefined ? undefined : (auto ?? asking);\n if (modes && pinned === undefined) {\n throw new SessionRefused(\n `${profile.name} offers no mode that asks before it acts, so it cannot take a turn from an app.`,\n !(await close()),\n );\n }\n const state: LiveState = {\n handlers: undefined,\n calls: new Map(),\n pinned,\n fallback: pinned === asking ? undefined : asking,\n options: agentOptionsOf(opened.configOptions),\n };\n sessions.set(sessionId, state);\n if (pinned !== undefined && pinned !== modes?.currentModeId) {\n try {\n await context.request(methods.agent.session.setMode, {\n sessionId,\n modeId: pinned,\n });\n } catch (error) {\n throw new SessionRefused(\n `${profile.name} did not switch to a mode that asks before it acts.`,\n !(await close()),\n { cause: error },\n );\n }\n }\n const session: AgentSession = {\n id: sessionId,\n resumed: opened.resumed,\n get options() {\n return state.options;\n },\n setOption: async (id, value) => {\n const response = await context.request(\n methods.agent.session.setConfigOption,\n {\n sessionId,\n configId: id,\n value,\n },\n );\n state.options = agentOptionsOf(response.configOptions);\n },\n prompt: async (blocks, handlers) => {\n if (state.handlers)\n throw new Error(\"This session is already answering a prompt.\");\n state.handlers = handlers;\n try {\n const request: PromptRequest = {\n sessionId,\n prompt: blocks.map((block) => ({ type: \"text\", text: block.text })),\n };\n const response = await context.request(\n methods.agent.session.prompt,\n request,\n );\n return stopReasonOf(response.stopReason);\n } finally {\n state.handlers = undefined;\n }\n },\n cancel: () =>\n context\n .notify(methods.agent.session.cancel, { sessionId })\n .catch(() => undefined),\n close: async () => {\n await close();\n },\n };\n return session;\n },\n };\n },\n };\n}\n\n/** Serves `handlers` as an ACP agent on `io`, until the other side hangs up. */\nexport function serveAcpAgent(handlers: AcpAgentHandlers, io: AcpStdio): Promise<void> {\n const running = new Map<string, AbortController>();\n const aliases = new Map<string, string>();\n const configs = new Map<string, SessionConfigOption[]>();\n const idOf = (sessionId: string) => aliases.get(sessionId) ?? sessionId;\n const app = acpAgent({ name: \"parlor-fake-agent\" })\n .onRequest(methods.agent.initialize, () => ({\n protocolVersion: PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: false,\n mcpCapabilities: { http: handlers.capabilities.mcpHttp, sse: false },\n sessionCapabilities: {\n ...(handlers.capabilities.resume ? { resume: {} } : {}),\n ...(handlers.capabilities.close ? { close: {} } : {}),\n },\n },\n authMethods: [],\n }))\n .onRequest(methods.agent.session.new, async ({ params }) => {\n const { id, modes, options } = await handlers.newSession({\n cwd: params.cwd,\n mcpServers: stdioServersOf(params.mcpServers),\n pinAskMode: false,\n });\n const state = sessionModesOf(modes);\n const configOptions = options?.map(configOptionOf);\n if (configOptions) configs.set(id, configOptions);\n return {\n sessionId: id,\n ...(state ? { modes: state } : {}),\n ...(configOptions ? { configOptions } : {}),\n };\n })\n .onRequest(methods.agent.session.resume, async ({ params }) => {\n if (!handlers.capabilities.resume) {\n throw RequestError.methodNotFound(methods.agent.session.resume);\n }\n const { id } = await handlers.newSession({\n cwd: params.cwd,\n mcpServers: stdioServersOf(params.mcpServers),\n pinAskMode: false,\n });\n aliases.set(params.sessionId, id);\n return {};\n })\n .onRequest(methods.agent.session.setMode, () => ({}))\n .onRequest(methods.agent.session.setConfigOption, ({ params }) => {\n const options = (configs.get(idOf(params.sessionId)) ?? []).map((option) =>\n option.id === params.configId && option.type === \"select\"\n ? { ...option, currentValue: String(params.value) }\n : option,\n );\n configs.set(idOf(params.sessionId), options);\n return { configOptions: options };\n })\n .onRequest(methods.agent.session.close, () => {\n if (!handlers.capabilities.close) {\n throw RequestError.methodNotFound(methods.agent.session.close);\n }\n return {};\n })\n .onRequest(methods.agent.session.prompt, async ({ params, client }) => {\n const sessionId = params.sessionId;\n const cancelled = new AbortController();\n running.set(sessionId, cancelled);\n try {\n const blocks = params.prompt.flatMap((block): PromptBlock[] =>\n block.type === \"text\" ? [{ kind: \"text\", text: block.text }] : [],\n );\n const stopReason = await handlers.prompt(idOf(sessionId), blocks, {\n update: (update) =>\n client.notify(methods.client.session.update, {\n sessionId,\n update: sessionUpdateOf(update),\n }),\n ask: async (question) => {\n if (question.kind === \"question\") {\n const answer = await client.request(methods.client.elicitation.create, {\n sessionId,\n mode: \"form\",\n message: question.message,\n requestedSchema: question.schema as never,\n });\n if (answer.action === \"accept\") {\n const content = isFields(answer.content) ? answer.content : {};\n return { kind: \"values\", values: content as never };\n }\n return answer.action === \"decline\"\n ? { kind: \"declined\" }\n : { kind: \"cancelled\" };\n }\n const request: RequestPermissionRequest = {\n sessionId,\n toolCall: {\n toolCallId: question.toolCallId,\n title: question.title,\n kind: question.toolKind,\n status: \"pending\",\n ...(question.mcp ? { _meta: claudeToolName(question.mcp) } : {}),\n },\n options: question.options.map((option) => ({\n optionId: option.id,\n name: option.label,\n kind: option.effect,\n })),\n };\n const answer = await client.request(\n methods.client.session.requestPermission,\n request,\n );\n return answer.outcome.outcome === \"selected\"\n ? { kind: \"selected\", optionId: answer.outcome.optionId }\n : { kind: \"cancelled\" };\n },\n cancelled: cancelled.signal,\n });\n return { stopReason };\n } finally {\n running.delete(sessionId);\n }\n })\n .onNotification(methods.agent.session.cancel, ({ params }) => {\n running.get(params.sessionId)?.abort();\n });\n return app.connect(ndJsonStream(io.output, io.input)).closed;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentOption, AgentUsage } from "@parlor/chat";
|
|
2
|
+
/** The values `chosen` names that `options` offers and does not already run with. */
|
|
3
|
+
export declare function optionChanges(options: readonly AgentOption[], chosen: Readonly<Record<string, string>> | undefined): {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly value: string;
|
|
6
|
+
}[];
|
|
7
|
+
/**
|
|
8
|
+
* Claude Code's rate limit, which rides on a `usage_update`'s `_meta`: every window a newer
|
|
9
|
+
* CLI names under `unifiedWindows`, or the one window an event is about.
|
|
10
|
+
*/
|
|
11
|
+
export declare function agentUsageOf(meta: Readonly<Record<string, unknown>> | null | undefined, at: number): AgentUsage | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* `next` laid over `held` window by window: an event names one window, and the others it
|
|
14
|
+
* leaves out still stand until they roll over.
|
|
15
|
+
*/
|
|
16
|
+
export declare function mergeUsage(held: AgentUsage | undefined, next: AgentUsage): AgentUsage;
|
|
17
|
+
//# sourceMappingURL=agent-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-options.d.ts","sourceRoot":"","sources":["../src/agent-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAE9E,qFAAqF;AACrF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,GACnD;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAQnD;AAiCD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAC1D,EAAE,EAAE,MAAM,GACT,UAAU,GAAG,SAAS,CAmBxB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAQrF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** The values `chosen` names that `options` offers and does not already run with. */
|
|
2
|
+
export function optionChanges(options, chosen) {
|
|
3
|
+
return Object.entries(chosen ?? {}).flatMap(([id, value]) => {
|
|
4
|
+
const option = options.find((candidate) => candidate.id === id);
|
|
5
|
+
if (!option || option.current === value)
|
|
6
|
+
return [];
|
|
7
|
+
return option.values.some((candidate) => candidate.id === value)
|
|
8
|
+
? [{ id, value }]
|
|
9
|
+
: [];
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
const RATE_LIMIT_META = "_claude/rateLimit";
|
|
13
|
+
const WINDOW_MINUTES = {
|
|
14
|
+
five_hour: 5 * 60,
|
|
15
|
+
seven_day: 7 * 24 * 60,
|
|
16
|
+
seven_day_opus: 7 * 24 * 60,
|
|
17
|
+
seven_day_sonnet: 7 * 24 * 60,
|
|
18
|
+
};
|
|
19
|
+
function windowOf(id, slot) {
|
|
20
|
+
const minutes = WINDOW_MINUTES[id];
|
|
21
|
+
const used = slot.utilization;
|
|
22
|
+
if (minutes === undefined || typeof used !== "number" || !Number.isFinite(used)) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const resetsAt = typeof slot.resetsAt === "number" && Number.isFinite(slot.resetsAt)
|
|
26
|
+
? slot.resetsAt * 1000
|
|
27
|
+
: undefined;
|
|
28
|
+
return {
|
|
29
|
+
id,
|
|
30
|
+
minutes,
|
|
31
|
+
used: Math.min(1, Math.max(0, used)),
|
|
32
|
+
...(resetsAt === undefined ? {} : { resetsAt }),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Claude Code's rate limit, which rides on a `usage_update`'s `_meta`: every window a newer
|
|
37
|
+
* CLI names under `unifiedWindows`, or the one window an event is about.
|
|
38
|
+
*/
|
|
39
|
+
export function agentUsageOf(meta, at) {
|
|
40
|
+
const info = meta?.[RATE_LIMIT_META];
|
|
41
|
+
if (!info || typeof info !== "object")
|
|
42
|
+
return undefined;
|
|
43
|
+
const slots = info.unifiedWindows && typeof info.unifiedWindows === "object"
|
|
44
|
+
? Object.entries(info.unifiedWindows)
|
|
45
|
+
: typeof info.rateLimitType === "string"
|
|
46
|
+
? [[info.rateLimitType, info]]
|
|
47
|
+
: [];
|
|
48
|
+
const windows = slots.flatMap(([id, slot]) => {
|
|
49
|
+
const window = windowOf(id, slot);
|
|
50
|
+
return window ? [window] : [];
|
|
51
|
+
});
|
|
52
|
+
return windows.length === 0 ? undefined : { windows: ordered(windows), at };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `next` laid over `held` window by window: an event names one window, and the others it
|
|
56
|
+
* leaves out still stand until they roll over.
|
|
57
|
+
*/
|
|
58
|
+
export function mergeUsage(held, next) {
|
|
59
|
+
const named = new Set(next.windows.map((window) => window.id));
|
|
60
|
+
const kept = (held?.windows ?? []).filter((window) => !named.has(window.id) &&
|
|
61
|
+
(window.resetsAt === undefined || window.resetsAt > next.at));
|
|
62
|
+
return { windows: ordered([...next.windows, ...kept]), at: next.at };
|
|
63
|
+
}
|
|
64
|
+
/** The account's own windows before a model's, each set shortest first. */
|
|
65
|
+
function ordered(windows) {
|
|
66
|
+
const perModel = (window) => (window.id in ACCOUNT_WINDOWS ? 0 : 1);
|
|
67
|
+
return [...windows].sort((a, b) => perModel(a) - perModel(b) || a.minutes - b.minutes || a.id.localeCompare(b.id));
|
|
68
|
+
}
|
|
69
|
+
const ACCOUNT_WINDOWS = {
|
|
70
|
+
five_hour: true,
|
|
71
|
+
seven_day: true,
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=agent-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-options.js","sourceRoot":"","sources":["../src/agent-options.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentOption, AgentUsage, AgentUsageWindow } from \"@parlor/chat\";\n\n/** The values `chosen` names that `options` offers and does not already run with. */\nexport function optionChanges(\n options: readonly AgentOption[],\n chosen: Readonly<Record<string, string>> | undefined,\n): { readonly id: string; readonly value: string }[] {\n return Object.entries(chosen ?? {}).flatMap(([id, value]) => {\n const option = options.find((candidate) => candidate.id === id);\n if (!option || option.current === value) return [];\n return option.values.some((candidate) => candidate.id === value)\n ? [{ id, value }]\n : [];\n });\n}\n\nconst RATE_LIMIT_META = \"_claude/rateLimit\";\nconst WINDOW_MINUTES: Readonly<Record<string, number>> = {\n five_hour: 5 * 60,\n seven_day: 7 * 24 * 60,\n seven_day_opus: 7 * 24 * 60,\n seven_day_sonnet: 7 * 24 * 60,\n};\n\ninterface RateLimitSlot {\n readonly utilization?: unknown;\n readonly resetsAt?: unknown;\n}\n\nfunction windowOf(id: string, slot: RateLimitSlot): AgentUsageWindow | undefined {\n const minutes = WINDOW_MINUTES[id];\n const used = slot.utilization;\n if (minutes === undefined || typeof used !== \"number\" || !Number.isFinite(used)) {\n return undefined;\n }\n const resetsAt =\n typeof slot.resetsAt === \"number\" && Number.isFinite(slot.resetsAt)\n ? slot.resetsAt * 1000\n : undefined;\n return {\n id,\n minutes,\n used: Math.min(1, Math.max(0, used)),\n ...(resetsAt === undefined ? {} : { resetsAt }),\n };\n}\n\n/**\n * Claude Code's rate limit, which rides on a `usage_update`'s `_meta`: every window a newer\n * CLI names under `unifiedWindows`, or the one window an event is about.\n */\nexport function agentUsageOf(\n meta: Readonly<Record<string, unknown>> | null | undefined,\n at: number,\n): AgentUsage | undefined {\n const info = meta?.[RATE_LIMIT_META] as\n | (RateLimitSlot & {\n readonly rateLimitType?: unknown;\n readonly unifiedWindows?: Readonly<Record<string, RateLimitSlot>>;\n })\n | undefined;\n if (!info || typeof info !== \"object\") return undefined;\n const slots: [string, RateLimitSlot][] =\n info.unifiedWindows && typeof info.unifiedWindows === \"object\"\n ? Object.entries(info.unifiedWindows)\n : typeof info.rateLimitType === \"string\"\n ? [[info.rateLimitType, info]]\n : [];\n const windows = slots.flatMap(([id, slot]) => {\n const window = windowOf(id, slot);\n return window ? [window] : [];\n });\n return windows.length === 0 ? undefined : { windows: ordered(windows), at };\n}\n\n/**\n * `next` laid over `held` window by window: an event names one window, and the others it\n * leaves out still stand until they roll over.\n */\nexport function mergeUsage(held: AgentUsage | undefined, next: AgentUsage): AgentUsage {\n const named = new Set(next.windows.map((window) => window.id));\n const kept = (held?.windows ?? []).filter(\n (window) =>\n !named.has(window.id) &&\n (window.resetsAt === undefined || window.resetsAt > next.at),\n );\n return { windows: ordered([...next.windows, ...kept]), at: next.at };\n}\n\n/** The account's own windows before a model's, each set shortest first. */\nfunction ordered(windows: readonly AgentUsageWindow[]): AgentUsageWindow[] {\n const perModel = (window: AgentUsageWindow) => (window.id in ACCOUNT_WINDOWS ? 0 : 1);\n return [...windows].sort(\n (a, b) =>\n perModel(a) - perModel(b) || a.minutes - b.minutes || a.id.localeCompare(b.id),\n );\n}\n\nconst ACCOUNT_WINDOWS: Readonly<Record<string, true>> = {\n five_hour: true,\n seven_day: true,\n};\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentProfile } from "./agents.js";
|
|
2
|
+
/** What a grant hands the coding agents on this computer, outside the app's sidebar. */
|
|
3
|
+
export interface AgentTools {
|
|
4
|
+
/** The MCP server name the agents know the app by, and the name the user asks them with. */
|
|
5
|
+
readonly name: string;
|
|
6
|
+
/** The agents it is registered with, by profile id. */
|
|
7
|
+
readonly agents: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The app's name, with its host and port when it is not a deployed site on the default
|
|
11
|
+
* port: `coursekit`, or `coursekit-localhost-7001` beside it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function agentToolsName(appName: string, appOrigin: string): string;
|
|
14
|
+
export interface AgentToolsDeps {
|
|
15
|
+
/** The installed agents; only those with a known CLI are registered with. */
|
|
16
|
+
readonly profiles: readonly AgentProfile[];
|
|
17
|
+
/** The absolute path of `parlor-host`, which the agents launch as the MCP server. */
|
|
18
|
+
readonly hostCommand: string;
|
|
19
|
+
readonly env: () => Promise<Record<string, string>>;
|
|
20
|
+
}
|
|
21
|
+
/** Registers `appOrigin` with every installed agent that has a CLI for it; returns those that took it. */
|
|
22
|
+
export declare function registerAgentTools(deps: AgentToolsDeps, app: {
|
|
23
|
+
readonly appName: string;
|
|
24
|
+
readonly appOrigin: string;
|
|
25
|
+
}): Promise<AgentTools>;
|
|
26
|
+
/** Removes the app from the agents it was registered with; an agent already rid of it is fine. */
|
|
27
|
+
export declare function unregisterAgentTools(deps: AgentToolsDeps, tools: AgentTools): Promise<void>;
|
|
28
|
+
/** The agents an `AgentTools` names, as people know them: "Claude Code and Codex". */
|
|
29
|
+
export declare function agentNames(profiles: readonly AgentProfile[], tools: AgentTools): string;
|
|
30
|
+
//# sourceMappingURL=agent-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.d.ts","sourceRoot":"","sources":["../src/agent-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CASzE;AAmBD,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAYD,0GAA0G;AAC1G,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,UAAU,CAAC,CAcrB;AAED,kGAAkG;AAClG,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAOvF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { logEvent } from "./log.js";
|
|
3
|
+
import { appServerOf } from "./naming.js";
|
|
4
|
+
const LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]);
|
|
5
|
+
/**
|
|
6
|
+
* The app's name, with its host and port when it is not a deployed site on the default
|
|
7
|
+
* port: `coursekit`, or `coursekit-localhost-7001` beside it.
|
|
8
|
+
*/
|
|
9
|
+
export function agentToolsName(appName, appOrigin) {
|
|
10
|
+
const url = new URL(appOrigin);
|
|
11
|
+
const base = appServerOf(appName);
|
|
12
|
+
if (!LOCAL_HOSTS.has(url.hostname) && url.port === "")
|
|
13
|
+
return base;
|
|
14
|
+
const where = url.host
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
17
|
+
.replace(/^-+|-+$/g, "");
|
|
18
|
+
return `${base}-${where}`;
|
|
19
|
+
}
|
|
20
|
+
const REGISTRARS = {
|
|
21
|
+
claude: {
|
|
22
|
+
add: (name, command) => ["mcp", "add", "--scope", "user", name, "--", ...command],
|
|
23
|
+
remove: (name) => ["mcp", "remove", "--scope", "user", name],
|
|
24
|
+
},
|
|
25
|
+
codex: {
|
|
26
|
+
add: (name, command) => ["mcp", "add", name, "--", ...command],
|
|
27
|
+
remove: (name) => ["mcp", "remove", name],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
function run(binary, args, env) {
|
|
31
|
+
return new Promise((resolve) => {
|
|
32
|
+
execFile(binary, [...args], { env, timeout: 30_000 }, (error) => resolve(!error));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Registers `appOrigin` with every installed agent that has a CLI for it; returns those that took it. */
|
|
36
|
+
export async function registerAgentTools(deps, app) {
|
|
37
|
+
const name = agentToolsName(app.appName, app.appOrigin);
|
|
38
|
+
const command = [deps.hostCommand, "mcp-proxy", "--app", app.appOrigin];
|
|
39
|
+
const env = await deps.env();
|
|
40
|
+
const agents = [];
|
|
41
|
+
for (const profile of deps.profiles) {
|
|
42
|
+
const registrar = REGISTRARS[profile.id];
|
|
43
|
+
if (!registrar)
|
|
44
|
+
continue;
|
|
45
|
+
await run(profile.binary, registrar.remove(name), env);
|
|
46
|
+
if (await run(profile.binary, registrar.add(name, command), env))
|
|
47
|
+
agents.push(profile.id);
|
|
48
|
+
}
|
|
49
|
+
logEvent("agent_tools_registered", { appOrigin: app.appOrigin, name, agents });
|
|
50
|
+
return { name, agents };
|
|
51
|
+
}
|
|
52
|
+
/** Removes the app from the agents it was registered with; an agent already rid of it is fine. */
|
|
53
|
+
export async function unregisterAgentTools(deps, tools) {
|
|
54
|
+
const env = await deps.env();
|
|
55
|
+
for (const id of tools.agents) {
|
|
56
|
+
const registrar = REGISTRARS[id];
|
|
57
|
+
const profile = deps.profiles.find((candidate) => candidate.id === id);
|
|
58
|
+
if (!registrar || !profile)
|
|
59
|
+
continue;
|
|
60
|
+
await run(profile.binary, registrar.remove(tools.name), env);
|
|
61
|
+
}
|
|
62
|
+
logEvent("agent_tools_removed", { name: tools.name, agents: tools.agents });
|
|
63
|
+
}
|
|
64
|
+
/** The agents an `AgentTools` names, as people know them: "Claude Code and Codex". */
|
|
65
|
+
export function agentNames(profiles, tools) {
|
|
66
|
+
const names = tools.agents.map((id) => profiles.find((profile) => profile.id === id)?.name ?? id);
|
|
67
|
+
return names.length <= 1
|
|
68
|
+
? (names[0] ?? "")
|
|
69
|
+
: `${names.slice(0, -1).join(", ")} and ${names.at(-1)}`;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=agent-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../src/agent-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\n\nimport type { AgentProfile } from \"./agents.js\";\nimport { logEvent } from \"./log.js\";\nimport { appServerOf } from \"./naming.js\";\n\n/** What a grant hands the coding agents on this computer, outside the app's sidebar. */\nexport interface AgentTools {\n /** The MCP server name the agents know the app by, and the name the user asks them with. */\n readonly name: string;\n /** The agents it is registered with, by profile id. */\n readonly agents: readonly string[];\n}\n\nconst LOCAL_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\n/**\n * The app's name, with its host and port when it is not a deployed site on the default\n * port: `coursekit`, or `coursekit-localhost-7001` beside it.\n */\nexport function agentToolsName(appName: string, appOrigin: string): string {\n const url = new URL(appOrigin);\n const base = appServerOf(appName);\n if (!LOCAL_HOSTS.has(url.hostname) && url.port === \"\") return base;\n const where = url.host\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return `${base}-${where}`;\n}\n\n/** How one coding agent's own CLI adds and removes a user-wide stdio MCP server. */\ninterface Registrar {\n add(name: string, command: readonly string[]): readonly string[];\n remove(name: string): readonly string[];\n}\n\nconst REGISTRARS: Readonly<Record<string, Registrar>> = {\n claude: {\n add: (name, command) => [\"mcp\", \"add\", \"--scope\", \"user\", name, \"--\", ...command],\n remove: (name) => [\"mcp\", \"remove\", \"--scope\", \"user\", name],\n },\n codex: {\n add: (name, command) => [\"mcp\", \"add\", name, \"--\", ...command],\n remove: (name) => [\"mcp\", \"remove\", name],\n },\n};\n\nexport interface AgentToolsDeps {\n /** The installed agents; only those with a known CLI are registered with. */\n readonly profiles: readonly AgentProfile[];\n /** The absolute path of `parlor-host`, which the agents launch as the MCP server. */\n readonly hostCommand: string;\n readonly env: () => Promise<Record<string, string>>;\n}\n\nfunction run(\n binary: string,\n args: readonly string[],\n env: Record<string, string>,\n): Promise<boolean> {\n return new Promise((resolve) => {\n execFile(binary, [...args], { env, timeout: 30_000 }, (error) => resolve(!error));\n });\n}\n\n/** Registers `appOrigin` with every installed agent that has a CLI for it; returns those that took it. */\nexport async function registerAgentTools(\n deps: AgentToolsDeps,\n app: { readonly appName: string; readonly appOrigin: string },\n): Promise<AgentTools> {\n const name = agentToolsName(app.appName, app.appOrigin);\n const command = [deps.hostCommand, \"mcp-proxy\", \"--app\", app.appOrigin];\n const env = await deps.env();\n const agents: string[] = [];\n for (const profile of deps.profiles) {\n const registrar = REGISTRARS[profile.id];\n if (!registrar) continue;\n await run(profile.binary, registrar.remove(name), env);\n if (await run(profile.binary, registrar.add(name, command), env))\n agents.push(profile.id);\n }\n logEvent(\"agent_tools_registered\", { appOrigin: app.appOrigin, name, agents });\n return { name, agents };\n}\n\n/** Removes the app from the agents it was registered with; an agent already rid of it is fine. */\nexport async function unregisterAgentTools(\n deps: AgentToolsDeps,\n tools: AgentTools,\n): Promise<void> {\n const env = await deps.env();\n for (const id of tools.agents) {\n const registrar = REGISTRARS[id];\n const profile = deps.profiles.find((candidate) => candidate.id === id);\n if (!registrar || !profile) continue;\n await run(profile.binary, registrar.remove(tools.name), env);\n }\n logEvent(\"agent_tools_removed\", { name: tools.name, agents: tools.agents });\n}\n\n/** The agents an `AgentTools` names, as people know them: \"Claude Code and Codex\". */\nexport function agentNames(profiles: readonly AgentProfile[], tools: AgentTools): string {\n const names = tools.agents.map(\n (id) => profiles.find((profile) => profile.id === id)?.name ?? id,\n );\n return names.length <= 1\n ? (names[0] ?? \"\")\n : `${names.slice(0, -1).join(\", \")} and ${names.at(-1)}`;\n}\n"]}
|
package/dist/control.d.ts
CHANGED
|
@@ -32,6 +32,10 @@ export type ControlRequest = {
|
|
|
32
32
|
} | {
|
|
33
33
|
readonly op: "disconnect";
|
|
34
34
|
readonly appOrigin: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly op: "agent_tools";
|
|
37
|
+
readonly appOrigin: string;
|
|
38
|
+
readonly on: boolean;
|
|
35
39
|
} | {
|
|
36
40
|
readonly op: "dev_attach";
|
|
37
41
|
readonly appOrigin: string;
|
|
@@ -46,6 +50,11 @@ export interface GrantSummary {
|
|
|
46
50
|
readonly appName: string;
|
|
47
51
|
readonly grantId: string;
|
|
48
52
|
}
|
|
53
|
+
/** The app's MCP server name in the coding agents on this computer, and which have it. */
|
|
54
|
+
export interface AgentToolsSummary {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly agents: string;
|
|
57
|
+
}
|
|
49
58
|
export type ControlFailure = {
|
|
50
59
|
readonly ok: false;
|
|
51
60
|
readonly error: string;
|
|
@@ -68,6 +77,7 @@ interface ControlReplies {
|
|
|
68
77
|
};
|
|
69
78
|
readonly connect: {
|
|
70
79
|
readonly ok: true;
|
|
80
|
+
readonly agentTools?: AgentToolsSummary;
|
|
71
81
|
};
|
|
72
82
|
readonly begin_local_pairing: {
|
|
73
83
|
readonly ok: true;
|
|
@@ -87,6 +97,11 @@ interface ControlReplies {
|
|
|
87
97
|
};
|
|
88
98
|
readonly disconnect: {
|
|
89
99
|
readonly ok: true;
|
|
100
|
+
readonly agentTools?: AgentToolsSummary;
|
|
101
|
+
};
|
|
102
|
+
readonly agent_tools: {
|
|
103
|
+
readonly ok: true;
|
|
104
|
+
readonly agentTools?: AgentToolsSummary;
|
|
90
105
|
};
|
|
91
106
|
readonly dev_attach: {
|
|
92
107
|
readonly ok: true;
|
package/dist/control.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,uBAAuB,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACjC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrF;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,QAAQ,EACb;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GACrB;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAClB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;QACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,uBAAuB,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACjC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrF;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,0FAA0F;AAC1F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,QAAQ,EACb;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GACrB;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAClB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;QACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACjF,QAAQ,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IACnF,QAAQ,CAAC,oBAAoB,EAAE;QAC7B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,qBAAqB,EAC1B;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GACrB;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC/D,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACpF,QAAQ,CAAC,WAAW,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACrF,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wDAAwD;AACxD,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA8BpC"}
|