@spotpatch/runtime 1.9.0 → 1.11.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controller/external-handoff-workflow.ts","../src/controller/browser-api.ts","../src/controller/external-agent-control-client.ts","../src/ui/external-handoff-panel.ts"],"sourcesContent":["import {\n ERROR_CODES,\n EXTERNAL_AGENT_CONTROL_LIMITS,\n EXTERNAL_AGENT_MANAGED_PROFILE,\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_LIMITS,\n EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n SPOTPATCH_ENDPOINTS,\n SPOTPATCH_TOKEN_HEADER,\n isErrorCode,\n type ErrorCode,\n type ActiveAdapterSummary,\n type DispatchSummary,\n type ExternalAgentControlStatus,\n type ExternalAgentEvent,\n type ExternalHandoffCapability,\n type ExternalHandoffPublishResult,\n type ExternalHandoffStatusResult,\n type ExternalHandoffSummary,\n type SpotAnnotation,\n} from \"@spotpatch/shared/external-handoff-browser\";\n\nimport type {\n ExternalHandoffPanel,\n ExternalHandoffWorkflow,\n} from \"../ui/external-handoff-contract.js\";\nimport {\n exactKeys,\n readBoundedJson,\n record,\n successData,\n validTimestamp,\n} from \"./browser-api.js\";\nimport { createExternalAgentControlClient } from \"./external-agent-control-client.js\";\n\ninterface WorkflowOptions {\n readonly fetch: typeof globalThis.fetch;\n readonly panel: ExternalHandoffPanel;\n readonly selectedAnnotation: () => SpotAnnotation | undefined;\n readonly sessionToken: string;\n readonly window: Window;\n}\n\nconst MAX_SUMMARY_RESPONSE_BYTES = 64 * 1_024;\nconst OPAQUE_ID_PATTERN = /^[A-Za-z0-9_-]{22,128}$/u;\n\nclass ExternalHandoffApiError extends Error {\n constructor(readonly code?: ErrorCode) {\n super(\"SpotPatch external handoff API request failed.\");\n this.name = \"ExternalHandoffApiError\";\n }\n}\n\nfunction parseActiveAdapter(value: unknown): ActiveAdapterSummary | null {\n if (value === null) return null;\n\n if (\n !record(value) ||\n !exactKeys(value, [\"canDispatch\", \"connectedAt\", \"kind\", \"state\", \"updatedAt\"]) ||\n (value.kind !== \"claude-channel\" && value.kind !== \"codex-app-server\") ||\n (value.state !== \"ready\" && value.state !== \"busy\" && value.state !== \"blocked\") ||\n typeof value.canDispatch !== \"boolean\" ||\n value.canDispatch !== (value.state === \"ready\") ||\n !validTimestamp(value.connectedAt) ||\n !validTimestamp(value.updatedAt)\n ) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n kind: value.kind,\n state: value.state,\n canDispatch: value.canDispatch,\n connectedAt: value.connectedAt,\n updatedAt: value.updatedAt,\n });\n}\n\nfunction parseDispatch(value: unknown): DispatchSummary | null {\n if (value === null) return null;\n if (!record(value)) throw new ExternalHandoffApiError();\n\n if (\n !exactKeys(value, [\"adapterKind\", \"phase\", \"revision\", \"updatedAt\"]) ||\n (value.adapterKind !== \"claude-channel\" &&\n value.adapterKind !== \"codex-app-server\") ||\n !Number.isSafeInteger(value.revision) ||\n (value.revision as number) <= 0 ||\n (value.phase !== \"queued\" &&\n value.phase !== \"dispatching\" &&\n value.phase !== \"dispatched\" &&\n value.phase !== \"working\" &&\n value.phase !== \"completed\" &&\n value.phase !== \"failed\" &&\n value.phase !== \"delivery-unknown\") ||\n !validTimestamp(value.updatedAt)\n ) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n adapterKind: value.adapterKind,\n revision: value.revision as number,\n phase: value.phase,\n updatedAt: value.updatedAt,\n });\n}\n\nfunction parseCapability(value: unknown): ExternalHandoffCapability {\n if (\n !record(value) ||\n !exactKeys(value, [\n \"activeAdapter\",\n \"activeWaitCount\",\n \"brokerProtocolVersion\",\n \"brokerReady\",\n \"dispatch\",\n \"enabled\",\n \"snapshotSchemaVersion\",\n ]) ||\n value.enabled !== true ||\n typeof value.brokerReady !== \"boolean\" ||\n !Number.isSafeInteger(value.activeWaitCount) ||\n (value.activeWaitCount as number) < 0 ||\n (value.activeWaitCount as number) > EXTERNAL_HANDOFF_LIMITS.maximumWaiters ||\n value.snapshotSchemaVersion !== EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION ||\n value.brokerProtocolVersion !== EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION\n ) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n enabled: true,\n brokerReady: value.brokerReady,\n activeWaitCount: value.activeWaitCount as number,\n activeAdapter: parseActiveAdapter(value.activeAdapter),\n dispatch: parseDispatch(value.dispatch),\n snapshotSchemaVersion: EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n });\n}\n\nfunction parsePublishResult(value: unknown): ExternalHandoffPublishResult {\n if (\n !record(value) ||\n !exactKeys(value, [\"delivery\", \"handoff\", \"replayed\"]) ||\n typeof value.replayed !== \"boolean\" ||\n !record(value.delivery)\n ) {\n throw new ExternalHandoffApiError();\n }\n\n const handoff = parseSummary(value.handoff);\n\n if (value.delivery.mode === \"inbox\") {\n if (!exactKeys(value.delivery, [\"mode\"])) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n handoff,\n delivery: Object.freeze({ mode: \"inbox\" as const }),\n replayed: value.replayed,\n });\n }\n\n if (\n value.delivery.mode !== \"active\" ||\n !exactKeys(value.delivery, [\"adapter\", \"dispatch\", \"mode\"])\n ) {\n throw new ExternalHandoffApiError();\n }\n\n const adapter = parseActiveAdapter(value.delivery.adapter);\n const dispatch = parseDispatch(value.delivery.dispatch);\n\n if (adapter === null || dispatch?.revision !== handoff.revision) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n handoff,\n delivery: Object.freeze({ mode: \"active\" as const, adapter, dispatch }),\n replayed: value.replayed,\n });\n}\n\nfunction parseStatusResult(value: unknown): ExternalHandoffStatusResult {\n if (!record(value) || !exactKeys(value, [\"activeAdapter\", \"dispatch\", \"handoff\"])) {\n throw new ExternalHandoffApiError();\n }\n\n const handoff = parseSummary(value.handoff);\n const dispatch = parseDispatch(value.dispatch);\n\n if (dispatch !== null && dispatch.revision !== handoff.revision) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n handoff,\n activeAdapter: parseActiveAdapter(value.activeAdapter),\n dispatch,\n });\n}\n\nfunction parseSummary(value: unknown): ExternalHandoffSummary {\n if (!record(value)) throw new ExternalHandoffApiError();\n const expectedKeys = [\n \"cursor\",\n \"expiresAt\",\n \"framework\",\n \"page\",\n \"pickupCount\",\n \"publishedAt\",\n \"revision\",\n \"sessionId\",\n \"state\",\n \"targetCount\",\n ...(value.pickedUpAt === undefined ? [] : [\"pickedUpAt\"]),\n ];\n\n if (\n !exactKeys(value, expectedKeys) ||\n typeof value.sessionId !== \"string\" ||\n !OPAQUE_ID_PATTERN.test(value.sessionId) ||\n (value.framework !== \"vite\" && value.framework !== \"next\") ||\n !Number.isSafeInteger(value.revision) ||\n (value.revision as number) <= 0 ||\n typeof value.cursor !== \"string\" ||\n !OPAQUE_ID_PATTERN.test(value.cursor) ||\n !Number.isSafeInteger(value.targetCount) ||\n (value.targetCount as number) <= 0 ||\n !record(value.page) ||\n !exactKeys(value.page, [\"origin\", \"pathname\"]) ||\n typeof value.page.origin !== \"string\" ||\n typeof value.page.pathname !== \"string\" ||\n !validTimestamp(value.publishedAt) ||\n !validTimestamp(value.expiresAt) ||\n (value.state !== \"available\" &&\n value.state !== \"expired\" &&\n value.state !== \"superseded\") ||\n !Number.isSafeInteger(value.pickupCount) ||\n (value.pickupCount as number) < 0 ||\n (value.pickupCount as number) > EXTERNAL_HANDOFF_LIMITS.maximumConnectorReceipts ||\n (value.pickedUpAt !== undefined && !validTimestamp(value.pickedUpAt))\n ) {\n throw new ExternalHandoffApiError();\n }\n\n return Object.freeze({\n sessionId: value.sessionId,\n framework: value.framework,\n revision: value.revision as number,\n cursor: value.cursor,\n targetCount: value.targetCount as number,\n page: Object.freeze({ origin: value.page.origin, pathname: value.page.pathname }),\n publishedAt: value.publishedAt,\n expiresAt: value.expiresAt,\n state: value.state,\n pickupCount: value.pickupCount as number,\n ...(value.pickedUpAt === undefined ? {} : { pickedUpAt: value.pickedUpAt }),\n });\n}\n\nfunction failureCode(value: unknown): ErrorCode | undefined {\n return record(value) &&\n value.ok === false &&\n record(value.error) &&\n isErrorCode(value.error.code)\n ? value.error.code\n : undefined;\n}\n\nfunction omitBrowserCode(annotation: SpotAnnotation): SpotAnnotation {\n return {\n ...annotation,\n targets: annotation.targets.map((target) => ({\n instruction: target.instruction,\n ...(target.page === undefined ? {} : { page: target.page }),\n source: target.source,\n react: target.react,\n element: target.element,\n styles: target.styles,\n warnings: target.warnings,\n })),\n };\n}\n\nfunction createRequestId(window: Window): string {\n const bytes = new Uint8Array(24);\n window.crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction dispatchIsPending(dispatch: DispatchSummary | null): boolean {\n return (\n dispatch !== null &&\n dispatch.phase !== \"completed\" &&\n dispatch.phase !== \"failed\" &&\n dispatch.phase !== \"delivery-unknown\"\n );\n}\n\nfunction api(options: WorkflowOptions) {\n const pending = new Set<AbortController>();\n\n const request = async (endpoint: string, body: unknown): Promise<unknown> => {\n const controller = new AbortController();\n pending.add(controller);\n\n try {\n const response = await options.fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n [SPOTPATCH_TOKEN_HEADER]: options.sessionToken,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n let envelope: unknown;\n try {\n envelope = await readBoundedJson(response, MAX_SUMMARY_RESPONSE_BYTES);\n } catch {\n throw new ExternalHandoffApiError();\n }\n\n if (!response.ok) throw new ExternalHandoffApiError(failureCode(envelope));\n try {\n return successData(envelope);\n } catch {\n throw new ExternalHandoffApiError();\n }\n } finally {\n pending.delete(controller);\n }\n };\n\n return Object.freeze({\n cancel() {\n for (const controller of pending) controller.abort();\n pending.clear();\n },\n async capability() {\n return parseCapability(\n await request(SPOTPATCH_ENDPOINTS.externalHandoffCapability, {}),\n );\n },\n async publish(requestId: string, annotation: SpotAnnotation) {\n return parsePublishResult(\n await request(SPOTPATCH_ENDPOINTS.externalHandoffPublish, {\n annotation: omitBrowserCode(annotation),\n requestId,\n }),\n );\n },\n async status(cursor?: string) {\n return parseStatusResult(\n await request(\n SPOTPATCH_ENDPOINTS.externalHandoffStatus,\n cursor === undefined ? {} : { cursor },\n ),\n );\n },\n async resolveDelivery(cursor: string) {\n return parseStatusResult(\n await request(SPOTPATCH_ENDPOINTS.externalHandoffResolveDelivery, {\n confirmation: \"workspace-reviewed\",\n cursor,\n }),\n );\n },\n });\n}\n\nexport function createExternalHandoffWorkflow(\n fetch: typeof globalThis.fetch,\n panel: ExternalHandoffPanel,\n selectedAnnotation: () => SpotAnnotation | undefined,\n sessionToken: string,\n window: Window,\n): ExternalHandoffWorkflow {\n const options: WorkflowOptions = {\n fetch,\n panel,\n selectedAnnotation,\n sessionToken,\n window,\n };\n const client = api(options);\n const controlClient = createExternalAgentControlClient(fetch, sessionToken);\n const timers = new Set<number>();\n const lifecycle = {\n disposed: false,\n mounted: false,\n operation: 0,\n userActionPending: false,\n };\n let capability: ExternalHandoffCapability | undefined;\n let controlStatus: ExternalAgentControlStatus | undefined;\n let controlEventController: AbortController | undefined;\n let controlReconnectDelay: number =\n EXTERNAL_AGENT_CONTROL_LIMITS.eventReconnectMinimumMs;\n let controlReconnectTimer: number | undefined;\n let controlActionPending = false;\n let managedResultRevision: number | undefined;\n let managedResultLoadingRevision: number | undefined;\n let current: ExternalHandoffStatusResult | undefined;\n let retryablePublish:\n Readonly<{ annotation: SpotAnnotation; requestId: string }> | undefined;\n const isDisposed = (): boolean => lifecycle.disposed;\n\n const clearTimers = (): void => {\n for (const timer of timers) options.window.clearTimeout(timer);\n timers.clear();\n };\n const clearControlReconnect = (): void => {\n if (controlReconnectTimer === undefined) return;\n options.window.clearTimeout(controlReconnectTimer);\n controlReconnectTimer = undefined;\n };\n const renderManagedResult = async (revision: number): Promise<void> => {\n if (\n lifecycle.disposed ||\n managedResultRevision === revision ||\n managedResultLoadingRevision === revision\n ) {\n return;\n }\n managedResultLoadingRevision = revision;\n try {\n const result = await controlClient.result(revision);\n if (isDisposed() || controlStatus?.task?.revision !== revision) return;\n managedResultRevision = revision;\n options.panel.renderManagedResult(result);\n } catch {\n // The status remains authoritative. A later status event or reconnect retries\n // the bounded result read while it is still retained by the Supervisor.\n } finally {\n if (managedResultLoadingRevision === revision) {\n managedResultLoadingRevision = undefined;\n }\n }\n };\n const applyControlStatus = (value: ExternalAgentControlStatus): void => {\n if (controlStatus !== undefined && value.sequence < controlStatus.sequence) return;\n controlStatus = value;\n controlReconnectDelay = EXTERNAL_AGENT_CONTROL_LIMITS.eventReconnectMinimumMs;\n options.panel.renderControlStatus(value);\n const resultRevision =\n value.task?.resultExpiresAt === undefined ? undefined : value.task.revision;\n if (resultRevision !== undefined) void renderManagedResult(resultRevision);\n };\n const handleControlEvent = (event: ExternalAgentEvent): void => {\n if (event.type === \"status\") {\n applyControlStatus(event.data);\n return;\n }\n const resultRevision =\n controlStatus?.task?.resultExpiresAt === undefined\n ? undefined\n : controlStatus.task.revision;\n if (resultRevision !== undefined) void renderManagedResult(resultRevision);\n };\n const startControlEventStream = (): void => {\n if (\n lifecycle.disposed ||\n !lifecycle.mounted ||\n controlEventController !== undefined\n ) {\n return;\n }\n clearControlReconnect();\n const controller = new AbortController();\n controlEventController = controller;\n void controlClient\n .events(controlStatus?.sequence, controller.signal, handleControlEvent)\n .catch((error: unknown) => {\n if (\n lifecycle.disposed ||\n (error instanceof DOMException && error.name === \"AbortError\")\n ) {\n return;\n }\n if (controlStatus === undefined) options.panel.renderControlUnavailable();\n })\n .finally(() => {\n if (controlEventController === controller) {\n controlEventController = undefined;\n }\n if (lifecycle.disposed || !lifecycle.mounted) return;\n const delay = controlReconnectDelay;\n controlReconnectDelay = Math.min(\n delay * 2,\n EXTERNAL_AGENT_CONTROL_LIMITS.eventReconnectMaximumMs,\n );\n controlReconnectTimer = options.window.setTimeout(() => {\n controlReconnectTimer = undefined;\n startControlEventStream();\n }, delay);\n });\n };\n const refreshControlStatus = async (): Promise<void> => {\n applyControlStatus(await controlClient.status());\n };\n const bootstrapControl = async (): Promise<void> => {\n try {\n await refreshControlStatus();\n } catch {\n if (!lifecycle.disposed) options.panel.renderControlUnavailable();\n } finally {\n if (!lifecycle.disposed) startControlEventStream();\n }\n };\n const performControlAction = async (\n action: () => Promise<ExternalAgentControlStatus>,\n ): Promise<void> => {\n if (lifecycle.disposed || controlActionPending) return;\n controlActionPending = true;\n options.panel.setControlBusy(true);\n try {\n applyControlStatus(await action());\n } catch {\n try {\n await refreshControlStatus();\n } catch {\n if (!isDisposed()) options.panel.renderControlUnavailable();\n }\n } finally {\n controlActionPending = false;\n if (!isDisposed()) options.panel.setControlBusy(false);\n }\n };\n const handleConnectClick = (): void => {\n void performControlAction(() =>\n controlClient.connect({\n requestId: createRequestId(options.window),\n adapterKind: \"codex\",\n profile: EXTERNAL_AGENT_MANAGED_PROFILE,\n }),\n );\n };\n const handleDisconnectClick = (): void => {\n void performControlAction(() =>\n controlClient.disconnect({\n requestId: createRequestId(options.window),\n adapterKind: \"codex\",\n revokeGrant: false,\n }),\n );\n };\n const handleRevokeClick = (): void => {\n void performControlAction(() =>\n controlClient.disconnect({\n requestId: createRequestId(options.window),\n adapterKind: \"codex\",\n revokeGrant: true,\n }),\n );\n };\n const handleManagedCancelClick = (): void => {\n const revision = controlStatus?.task?.revision;\n if (revision === undefined) return;\n void performControlAction(() =>\n controlClient.cancel({\n requestId: createRequestId(options.window),\n revision,\n }),\n );\n };\n const errorCode = (error: unknown): ErrorCode | undefined =>\n error instanceof ExternalHandoffApiError ? error.code : undefined;\n const restorePanel = (): void => {\n if (current !== undefined) options.panel.renderStatus(current);\n else if (capability !== undefined) options.panel.renderCapability(capability);\n };\n const refreshCapability = async (revision: number): Promise<void> => {\n try {\n const result = await client.capability();\n if (lifecycle.disposed || revision !== lifecycle.operation) return;\n capability = result;\n options.panel.renderCapability(result);\n if (result.dispatch !== null) {\n const status = await client.status();\n if (revision !== lifecycle.operation) return;\n current = status;\n options.panel.renderStatus(status);\n }\n } catch (error: unknown) {\n if (\n lifecycle.disposed ||\n revision !== lifecycle.operation ||\n (error instanceof DOMException && error.name === \"AbortError\")\n )\n return;\n options.panel.renderError(errorCode(error));\n }\n };\n const refreshStatus = async (revision: number): Promise<void> => {\n if (current === undefined) {\n await refreshCapability(revision);\n return;\n }\n\n try {\n const result = await client.status(current.handoff.cursor);\n if (lifecycle.disposed || revision !== lifecycle.operation) return;\n current = result;\n options.panel.renderStatus(result);\n } catch (error: unknown) {\n if (\n lifecycle.disposed ||\n revision !== lifecycle.operation ||\n (error instanceof DOMException && error.name === \"AbortError\")\n )\n return;\n options.panel.renderError(errorCode(error));\n }\n };\n const scheduleRefresh = (delay: number, continueWhilePending: boolean): void => {\n const revision = lifecycle.operation;\n const timer = options.window.setTimeout(() => {\n timers.delete(timer);\n void refreshStatus(revision).then(() => {\n if (\n continueWhilePending &&\n !lifecycle.disposed &&\n revision === lifecycle.operation &&\n !lifecycle.userActionPending &&\n current !== undefined &&\n dispatchIsPending(current.dispatch)\n ) {\n scheduleRefresh(\n EXTERNAL_HANDOFF_LIMITS.activeStatusPollMs,\n continueWhilePending,\n );\n }\n });\n }, delay);\n timers.add(timer);\n };\n const handleSend = async (): Promise<void> => {\n if (lifecycle.userActionPending) return;\n lifecycle.userActionPending = true;\n let pending = retryablePublish;\n\n if (pending === undefined) {\n const annotation = options.selectedAnnotation();\n if (annotation === undefined) {\n lifecycle.userActionPending = false;\n options.panel.renderError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n return;\n }\n\n const disclosureRevision = lifecycle.operation;\n options.panel.setBusy(true);\n const confirmed = await options.panel.confirmDisclosure(annotation);\n if (!confirmed || disclosureRevision !== lifecycle.operation) {\n lifecycle.userActionPending = false;\n options.panel.setBusy(false);\n return;\n }\n\n pending = Object.freeze({\n annotation,\n requestId: createRequestId(options.window),\n });\n }\n\n retryablePublish = pending;\n lifecycle.operation += 1;\n const revision = lifecycle.operation;\n clearTimers();\n client.cancel();\n options.panel.renderPublishing();\n\n try {\n const result = await client.publish(pending.requestId, pending.annotation);\n if (revision !== lifecycle.operation) return;\n retryablePublish = undefined;\n current = Object.freeze({\n handoff: result.handoff,\n activeAdapter:\n result.delivery.mode === \"active\" ? result.delivery.adapter : null,\n dispatch: result.delivery.mode === \"active\" ? result.delivery.dispatch : null,\n });\n options.panel.renderPublishResult(result);\n scheduleRefresh(\n result.delivery.mode === \"active\"\n ? EXTERNAL_HANDOFF_LIMITS.activeStatusPollMs\n : 500,\n result.delivery.mode === \"active\",\n );\n } catch (error: unknown) {\n if (\n revision !== lifecycle.operation ||\n (error instanceof DOMException && error.name === \"AbortError\")\n )\n return;\n const code = errorCode(error);\n const retryable = code === undefined;\n if (!retryable) retryablePublish = undefined;\n options.panel.renderError(code, retryable);\n } finally {\n if (revision === lifecycle.operation) {\n lifecycle.userActionPending = false;\n options.panel.setBusy(false);\n }\n }\n };\n const handleRefresh = async (): Promise<void> => {\n if (lifecycle.userActionPending) return;\n lifecycle.userActionPending = true;\n lifecycle.operation += 1;\n const revision = lifecycle.operation;\n clearTimers();\n client.cancel();\n options.panel.setBusy(true);\n\n try {\n await refreshStatus(revision);\n } finally {\n if (!lifecycle.disposed && revision === lifecycle.operation) {\n lifecycle.userActionPending = false;\n options.panel.setBusy(false);\n }\n }\n };\n const handleResolveDelivery = async (): Promise<void> => {\n if (\n lifecycle.userActionPending ||\n current === undefined ||\n current.dispatch?.phase !== \"delivery-unknown\"\n ) {\n return;\n }\n\n lifecycle.userActionPending = true;\n lifecycle.operation += 1;\n const revision = lifecycle.operation;\n clearTimers();\n client.cancel();\n options.panel.setBusy(true);\n\n try {\n const result = await client.resolveDelivery(current.handoff.cursor);\n if (lifecycle.disposed || revision !== lifecycle.operation) return;\n current = result;\n options.panel.renderStatus(result);\n } catch (error: unknown) {\n if (\n lifecycle.disposed ||\n revision !== lifecycle.operation ||\n (error instanceof DOMException && error.name === \"AbortError\")\n ) {\n return;\n }\n options.panel.renderError(errorCode(error));\n } finally {\n if (!lifecycle.disposed && revision === lifecycle.operation) {\n lifecycle.userActionPending = false;\n options.panel.setBusy(false);\n }\n }\n };\n const handleSendClick = (): void => {\n void handleSend();\n };\n const handleRefreshClick = (): void => {\n void handleRefresh();\n };\n const handleResolveClick = (): void => {\n void handleResolveDelivery();\n };\n const cancelPending = (): void => {\n lifecycle.operation += 1;\n lifecycle.userActionPending = false;\n retryablePublish = undefined;\n clearTimers();\n client.cancel();\n restorePanel();\n if (capability === undefined && lifecycle.mounted && !lifecycle.disposed) {\n void refreshCapability(lifecycle.operation);\n }\n };\n\n return Object.freeze({\n mount(): void {\n if (lifecycle.mounted || lifecycle.disposed) return;\n lifecycle.mounted = true;\n options.panel.sendButton.addEventListener(\"click\", handleSendClick);\n options.panel.refreshButton.addEventListener(\"click\", handleRefreshClick);\n options.panel.resolveButton.addEventListener(\"click\", handleResolveClick);\n options.panel.connectButton.addEventListener(\"click\", handleConnectClick);\n options.panel.disconnectButton.addEventListener(\"click\", handleDisconnectClick);\n options.panel.revokeButton.addEventListener(\"click\", handleRevokeClick);\n options.panel.cancelManagedButton.addEventListener(\n \"click\",\n handleManagedCancelClick,\n );\n void refreshCapability(lifecycle.operation);\n void bootstrapControl();\n },\n cancelPending,\n dispose(): void {\n if (lifecycle.disposed) return;\n lifecycle.disposed = true;\n lifecycle.operation += 1;\n lifecycle.userActionPending = false;\n retryablePublish = undefined;\n clearTimers();\n clearControlReconnect();\n controlEventController?.abort(\"workflow-disposed\");\n controlEventController = undefined;\n client.cancel();\n options.panel.sendButton.removeEventListener(\"click\", handleSendClick);\n options.panel.refreshButton.removeEventListener(\"click\", handleRefreshClick);\n options.panel.resolveButton.removeEventListener(\"click\", handleResolveClick);\n options.panel.connectButton.removeEventListener(\"click\", handleConnectClick);\n options.panel.disconnectButton.removeEventListener(\n \"click\",\n handleDisconnectClick,\n );\n options.panel.revokeButton.removeEventListener(\"click\", handleRevokeClick);\n options.panel.cancelManagedButton.removeEventListener(\n \"click\",\n handleManagedCancelClick,\n );\n },\n });\n}\n","export function record(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function exactKeys(\n value: Readonly<Record<string, unknown>>,\n keys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...keys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nexport function validTimestamp(value: unknown): value is string {\n if (typeof value !== \"string\") return false;\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?Z$/u.exec(\n value,\n );\n if (match === null) return false;\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return false;\n const date = new Date(timestamp);\n return (\n date.getUTCFullYear() === Number(match[1]) &&\n date.getUTCMonth() + 1 === Number(match[2]) &&\n date.getUTCDate() === Number(match[3]) &&\n date.getUTCHours() === Number(match[4]) &&\n date.getUTCMinutes() === Number(match[5]) &&\n date.getUTCSeconds() === Number(match[6])\n );\n}\n\nexport async function readBoundedJson(\n response: Response,\n maximumBytes: number,\n): Promise<unknown> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(declaredLength) && declaredLength > maximumBytes) {\n await response.body?.cancel();\n throw new TypeError(\"SpotPatch API response exceeds its safety limit.\");\n }\n if (response.body === null) {\n throw new TypeError(\"SpotPatch API response body is unavailable.\");\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n total += chunk.value.byteLength;\n if (total > maximumBytes) {\n await reader.cancel();\n throw new TypeError(\"SpotPatch API response exceeds its safety limit.\");\n }\n chunks.push(chunk.value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const payload = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n payload.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(payload),\n ) as unknown;\n}\n\nexport function successData(value: unknown): unknown {\n if (!record(value) || !exactKeys(value, [\"data\", \"ok\"]) || value.ok !== true) {\n throw new TypeError(\"SpotPatch API success envelope is invalid.\");\n }\n return value.data;\n}\n","import {\n EXTERNAL_AGENT_ACTIONS as ACTIONS,\n EXTERNAL_AGENT_AUTH_READINESS as AUTH_STATES,\n EXTERNAL_AGENT_CHECK_OUTCOMES as CHECK_OUTCOMES,\n EXTERNAL_AGENT_CONNECTION_STATES as CONNECTION_STATES,\n EXTERNAL_AGENT_CONTROL_LIMITS,\n EXTERNAL_AGENT_DELIVERY_STATUSES as DELIVERY_STATES,\n EXTERNAL_AGENT_ERROR_CODES as ERROR_CODES,\n EXTERNAL_AGENT_ERROR_RECOVERABILITY as RECOVERABILITY,\n EXTERNAL_AGENT_ERROR_STAGES as ERROR_STAGES,\n EXTERNAL_AGENT_EXECUTION_STATUSES as EXECUTION_STATES,\n EXTERNAL_AGENT_GRANT_STATES as GRANT_STATES,\n EXTERNAL_AGENT_MANAGED_PHASES as MANAGED_PHASES,\n EXTERNAL_AGENT_MODES as MODES,\n EXTERNAL_AGENT_VALIDATION_OUTCOMES as VALIDATION_OUTCOMES,\n SPOTPATCH_ENDPOINTS,\n SPOTPATCH_TOKEN_HEADER,\n type ExternalAgentControlCancelRequest,\n type ExternalAgentControlConnectRequest,\n type ExternalAgentControlDisconnectRequest,\n type ExternalAgentControlStatus,\n type ExternalAgentEvent,\n type ExternalAgentManagedResult,\n} from \"@spotpatch/shared/external-handoff-browser\";\n\nimport {\n exactKeys,\n readBoundedJson,\n record,\n successData,\n validTimestamp,\n} from \"./browser-api.js\";\n\nconst RESPONSE_OVERHEAD_BYTES = 64 * 1_024;\n\nfunction member<const T extends readonly string[]>(\n values: T,\n value: unknown,\n): value is T[number] {\n return typeof value === \"string\" && values.includes(value);\n}\n\nfunction integer(value: unknown, minimum = 0): value is number {\n return Number.isSafeInteger(value) && (value as number) >= minimum;\n}\n\nfunction optionalKeys(\n value: Readonly<Record<string, unknown>>,\n base: readonly string[],\n optional: readonly string[],\n): boolean {\n return exactKeys(value, [\n ...base,\n ...optional.filter((key) => value[key] !== undefined),\n ]);\n}\n\nfunction safePath(value: unknown): value is string {\n if (\n typeof value !== \"string\" ||\n value.length === 0 ||\n value.length > 4_096 ||\n value.startsWith(\"/\") ||\n value.includes(\"\\\\\")\n ) {\n return false;\n }\n return value\n .split(\"/\")\n .every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n}\n\nfunction parseFiles(\n value: unknown,\n): NonNullable<ExternalAgentControlStatus[\"task\"]>[\"files\"] {\n if (\n !Array.isArray(value) ||\n value.length > EXTERNAL_AGENT_CONTROL_LIMITS.maximumChangedFiles\n ) {\n throw new TypeError(\"Invalid managed file summaries.\");\n }\n return value.map((file) => {\n if (\n !record(file) ||\n !exactKeys(file, [\"additions\", \"deletions\", \"path\"]) ||\n !safePath(file.path) ||\n !integer(file.additions) ||\n !integer(file.deletions)\n ) {\n throw new TypeError(\"Invalid managed file summary.\");\n }\n return Object.freeze({\n path: file.path,\n additions: file.additions,\n deletions: file.deletions,\n });\n });\n}\n\nfunction parseChecks(\n value: unknown,\n): NonNullable<ExternalAgentControlStatus[\"task\"]>[\"checks\"] {\n if (\n !Array.isArray(value) ||\n value.length > EXTERNAL_AGENT_CONTROL_LIMITS.maximumChecks\n ) {\n throw new TypeError(\"Invalid managed check summaries.\");\n }\n return value.map((check) => {\n if (\n !record(check) ||\n !optionalKeys(check, [\"durationMs\", \"id\", \"outcome\"], [\"exitCode\"]) ||\n typeof check.id !== \"string\" ||\n !/^[A-Za-z0-9._-]{1,128}$/u.test(check.id) ||\n !member(CHECK_OUTCOMES, check.outcome) ||\n !integer(check.durationMs) ||\n (check.exitCode !== undefined && !Number.isSafeInteger(check.exitCode))\n ) {\n throw new TypeError(\"Invalid managed check summary.\");\n }\n return Object.freeze({\n id: check.id,\n outcome: check.outcome,\n durationMs: check.durationMs,\n ...(check.exitCode === undefined ? {} : { exitCode: check.exitCode as number }),\n });\n });\n}\n\nfunction parseTimings(\n value: unknown,\n): NonNullable<ExternalAgentControlStatus[\"task\"]>[\"timings\"] {\n const keys = [\n \"preparing\",\n \"agent\",\n \"auditing\",\n \"validating\",\n \"applying\",\n \"total\",\n ] as const;\n if (!record(value) || !optionalKeys(value, [], keys)) {\n throw new TypeError(\"Invalid managed timings.\");\n }\n for (const key of keys) {\n if (value[key] !== undefined && !integer(value[key])) {\n throw new TypeError(\"Invalid managed timing.\");\n }\n }\n return Object.freeze(\n Object.fromEntries(\n keys.flatMap((key) => (value[key] === undefined ? [] : [[key, value[key]]])),\n ) as NonNullable<ExternalAgentControlStatus[\"task\"]>[\"timings\"],\n );\n}\n\nfunction parseTask(value: unknown): NonNullable<ExternalAgentControlStatus[\"task\"]> {\n if (\n !record(value) ||\n !optionalKeys(\n value,\n [\n \"checks\",\n \"deliveryStatus\",\n \"executionStatus\",\n \"files\",\n \"managedPhase\",\n \"revision\",\n \"timings\",\n ],\n [\"resultExpiresAt\", \"validationOutcome\"],\n ) ||\n !integer(value.revision, 1) ||\n !member(DELIVERY_STATES, value.deliveryStatus) ||\n !member(EXECUTION_STATES, value.executionStatus) ||\n !member(MANAGED_PHASES, value.managedPhase) ||\n (value.validationOutcome !== undefined &&\n !member(VALIDATION_OUTCOMES, value.validationOutcome)) ||\n (value.resultExpiresAt !== undefined && !validTimestamp(value.resultExpiresAt))\n ) {\n throw new TypeError(\"Invalid managed task status.\");\n }\n return Object.freeze({\n revision: value.revision,\n deliveryStatus: value.deliveryStatus,\n executionStatus: value.executionStatus,\n managedPhase: value.managedPhase,\n ...(value.validationOutcome === undefined\n ? {}\n : { validationOutcome: value.validationOutcome }),\n files: parseFiles(value.files),\n checks: parseChecks(value.checks),\n timings: parseTimings(value.timings),\n ...(value.resultExpiresAt === undefined\n ? {}\n : { resultExpiresAt: value.resultExpiresAt }),\n });\n}\n\nexport function parseExternalAgentControlStatus(\n value: unknown,\n): ExternalAgentControlStatus {\n if (\n !record(value) ||\n !optionalKeys(\n value,\n [\n \"adapter\",\n \"authReadiness\",\n \"connectionState\",\n \"grantState\",\n \"mode\",\n \"schemaVersion\",\n \"sequence\",\n \"updatedAt\",\n ],\n [\"effectiveModel\", \"error\", \"requestedModel\", \"task\"],\n ) ||\n value.schemaVersion !== 1 ||\n !integer(value.sequence) ||\n !member(MODES, value.mode) ||\n !member(CONNECTION_STATES, value.connectionState) ||\n !member(AUTH_STATES, value.authReadiness) ||\n !member(GRANT_STATES, value.grantState) ||\n !validTimestamp(value.updatedAt) ||\n (value.requestedModel !== undefined &&\n (typeof value.requestedModel !== \"string\" ||\n value.requestedModel.length === 0 ||\n value.requestedModel.length > 128)) ||\n (value.effectiveModel !== undefined &&\n (typeof value.effectiveModel !== \"string\" ||\n value.effectiveModel.length === 0 ||\n value.effectiveModel.length > 128)) ||\n !record(value.adapter) ||\n !exactKeys(value.adapter, [\"availability\", \"kind\", \"maturity\"]) ||\n value.adapter.kind !== \"codex\" ||\n value.adapter.maturity !== \"experimental\" ||\n (value.adapter.availability !== \"available\" &&\n value.adapter.availability !== \"unavailable\")\n ) {\n throw new TypeError(\"Invalid external Agent control status.\");\n }\n let error: ExternalAgentControlStatus[\"error\"];\n if (value.error !== undefined) {\n if (\n !record(value.error) ||\n !exactKeys(value.error, [\"action\", \"code\", \"recoverability\", \"stage\"]) ||\n !member(ERROR_CODES, value.error.code) ||\n !member(ERROR_STAGES, value.error.stage) ||\n !member(RECOVERABILITY, value.error.recoverability) ||\n !member(ACTIONS, value.error.action)\n ) {\n throw new TypeError(\"Invalid external Agent error.\");\n }\n error = Object.freeze({\n code: value.error.code,\n stage: value.error.stage,\n recoverability: value.error.recoverability,\n action: value.error.action,\n });\n }\n return Object.freeze({\n schemaVersion: 1,\n sequence: value.sequence,\n mode: value.mode,\n adapter: Object.freeze({\n kind: \"codex\",\n maturity: \"experimental\",\n availability: value.adapter.availability,\n }),\n connectionState: value.connectionState,\n authReadiness: value.authReadiness,\n grantState: value.grantState,\n ...(value.requestedModel === undefined\n ? {}\n : { requestedModel: value.requestedModel }),\n ...(value.effectiveModel === undefined\n ? {}\n : { effectiveModel: value.effectiveModel }),\n ...(value.task === undefined ? {} : { task: parseTask(value.task) }),\n ...(error === undefined ? {} : { error }),\n updatedAt: value.updatedAt,\n });\n}\n\nexport function parseExternalAgentManagedResult(\n value: unknown,\n): ExternalAgentManagedResult {\n if (\n !record(value) ||\n !exactKeys(value, [\n \"checks\",\n \"diff\",\n \"expiresAt\",\n \"files\",\n \"revision\",\n \"timings\",\n \"validationOutcome\",\n ]) ||\n !integer(value.revision, 1) ||\n typeof value.diff !== \"string\" ||\n value.diff.length > EXTERNAL_AGENT_CONTROL_LIMITS.maximumResultDiffBytes ||\n !validTimestamp(value.expiresAt) ||\n !member(VALIDATION_OUTCOMES, value.validationOutcome)\n ) {\n throw new TypeError(\"Invalid managed Agent result.\");\n }\n return Object.freeze({\n revision: value.revision,\n diff: value.diff,\n files: parseFiles(value.files),\n checks: parseChecks(value.checks),\n timings: parseTimings(value.timings),\n validationOutcome: value.validationOutcome,\n expiresAt: value.expiresAt,\n });\n}\n\nfunction parseEvent(value: unknown): ExternalAgentEvent {\n if (!record(value) || typeof value.type !== \"string\") {\n throw new TypeError(\"Invalid external Agent event.\");\n }\n if (value.type === \"status\" && exactKeys(value, [\"data\", \"type\"])) {\n return Object.freeze({\n type: \"status\",\n data: parseExternalAgentControlStatus(value.data),\n });\n }\n if (\n value.type === \"heartbeat\" &&\n exactKeys(value, [\"emittedAt\", \"sequence\", \"type\"]) &&\n integer(value.sequence) &&\n validTimestamp(value.emittedAt)\n ) {\n return Object.freeze({\n type: \"heartbeat\",\n sequence: value.sequence,\n emittedAt: value.emittedAt,\n });\n }\n throw new TypeError(\"Invalid external Agent event.\");\n}\n\nexport interface ExternalAgentControlClient {\n status(): Promise<ExternalAgentControlStatus>;\n connect(\n request: ExternalAgentControlConnectRequest,\n ): Promise<ExternalAgentControlStatus>;\n disconnect(\n request: ExternalAgentControlDisconnectRequest,\n ): Promise<ExternalAgentControlStatus>;\n cancel(\n request: ExternalAgentControlCancelRequest,\n ): Promise<ExternalAgentControlStatus>;\n result(revision: number): Promise<ExternalAgentManagedResult>;\n events(\n afterSequence: number | undefined,\n signal: AbortSignal,\n onEvent: (event: ExternalAgentEvent) => void,\n ): Promise<void>;\n}\n\nexport function createExternalAgentControlClient(\n fetch: typeof globalThis.fetch,\n sessionToken: string,\n): ExternalAgentControlClient {\n const request = async (\n endpoint: string,\n body: unknown,\n maximumBytes = RESPONSE_OVERHEAD_BYTES,\n ): Promise<unknown> => {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n [SPOTPATCH_TOKEN_HEADER]: sessionToken,\n },\n body: JSON.stringify(body),\n });\n const envelope = await readBoundedJson(response, maximumBytes);\n if (!response.ok) throw new TypeError(\"External Agent control request failed.\");\n return successData(envelope);\n };\n\n return Object.freeze({\n async status() {\n return parseExternalAgentControlStatus(\n await request(SPOTPATCH_ENDPOINTS.externalAgentControlStatus, {}),\n );\n },\n async connect(value: ExternalAgentControlConnectRequest) {\n return parseExternalAgentControlStatus(\n await request(SPOTPATCH_ENDPOINTS.externalAgentControlConnect, value),\n );\n },\n async disconnect(value: ExternalAgentControlDisconnectRequest) {\n return parseExternalAgentControlStatus(\n await request(SPOTPATCH_ENDPOINTS.externalAgentControlDisconnect, value),\n );\n },\n async cancel(value: ExternalAgentControlCancelRequest) {\n return parseExternalAgentControlStatus(\n await request(SPOTPATCH_ENDPOINTS.externalAgentControlCancel, value),\n );\n },\n async result(revision: number) {\n return parseExternalAgentManagedResult(\n await request(\n SPOTPATCH_ENDPOINTS.externalAgentResult,\n { revision },\n EXTERNAL_AGENT_CONTROL_LIMITS.maximumResultDiffBytes +\n RESPONSE_OVERHEAD_BYTES,\n ),\n );\n },\n async events(\n afterSequence: number | undefined,\n signal: AbortSignal,\n onEvent: (event: ExternalAgentEvent) => void,\n ): Promise<void> {\n const response = await fetch(SPOTPATCH_ENDPOINTS.externalAgentEvents, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n [SPOTPATCH_TOKEN_HEADER]: sessionToken,\n },\n body: JSON.stringify(afterSequence === undefined ? {} : { afterSequence }),\n signal,\n });\n if (!response.ok || response.body === null) {\n await response.body?.cancel();\n throw new TypeError(\"External Agent event stream is unavailable.\");\n }\n const reader = response.body.getReader();\n let pending = new Uint8Array(0);\n\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n const combined = new Uint8Array(pending.byteLength + chunk.value.byteLength);\n combined.set(pending);\n combined.set(chunk.value, pending.byteLength);\n pending = combined;\n\n for (;;) {\n const newline = pending.indexOf(0x0a);\n if (newline === -1) break;\n if (\n newline === 0 ||\n newline > EXTERNAL_AGENT_CONTROL_LIMITS.maximumEventLineBytes\n ) {\n throw new TypeError(\"External Agent event line is invalid.\");\n }\n const line = pending.slice(0, newline);\n pending = pending.slice(newline + 1);\n const value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(line),\n ) as unknown;\n onEvent(parseEvent(value));\n }\n if (\n pending.byteLength > EXTERNAL_AGENT_CONTROL_LIMITS.maximumEventLineBytes\n ) {\n throw new TypeError(\"External Agent event line exceeds its limit.\");\n }\n }\n if (pending.byteLength !== 0) {\n throw new TypeError(\"External Agent event stream ended mid-record.\");\n }\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n","import type {\n ActiveAdapterSummary,\n DispatchSummary,\n ErrorCode,\n ExternalAgentAction,\n ExternalAgentControlStatus,\n ExternalAgentErrorCode,\n ExternalAgentManagedResult,\n ExternalHandoffCapability,\n ExternalHandoffPublishResult,\n ExternalHandoffStatusResult,\n ExternalHandoffSummary,\n SpotAnnotation,\n SpotPatchLocale,\n} from \"@spotpatch/shared/external-handoff-browser\";\n\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport type { ExternalHandoffPanel } from \"./external-handoff-contract.js\";\n\ninterface PanelOptions {\n readonly document: Document;\n readonly framework: \"vite\" | \"next\";\n readonly locale: () => SpotPatchLocale;\n readonly onViewChange: () => void;\n readonly sessionId: string;\n readonly subscribeLocale: (listener: () => void) => () => void;\n}\n\ntype ControlTask = NonNullable<ExternalAgentControlStatus[\"task\"]>;\ntype ControlValidationOutcome = NonNullable<ControlTask[\"validationOutcome\"]>;\ntype ManagedValidationOutcome = ExternalAgentManagedResult[\"validationOutcome\"];\n\ninterface ExternalHandoffMessages {\n readonly activeReady: (agent: string) => string;\n readonly agentLabel: string;\n readonly cancel: string;\n readonly cancelManaged: string;\n readonly codexManaged: string;\n readonly confirm: string;\n readonly connectManaged: string;\n readonly controlActionText: Readonly<Record<ExternalAgentAction, string>>;\n readonly controlAuth: (\n auth: ExternalAgentControlStatus[\"authReadiness\"],\n grant: ExternalAgentControlStatus[\"grantState\"],\n ) => string;\n readonly controlConnection: (\n state: ExternalAgentControlStatus[\"connectionState\"],\n mode: ExternalAgentControlStatus[\"mode\"],\n ) => string;\n readonly controlErrorText: Readonly<Record<ExternalAgentErrorCode, string>>;\n readonly controlFailure: (error: string, action: string) => string;\n readonly controlModel: (model: string) => string;\n readonly controlRevision: (task: ControlTask) => string;\n readonly controlUnavailable: string;\n readonly controlValidation: (outcome: ControlValidationOutcome) => string;\n readonly completed: (agent: string, revision: number) => string;\n readonly description: string;\n readonly dispatched: (agent: string, revision: number) => string;\n readonly dispatching: (agent: string, revision: number) => string;\n readonly disclosureData: string;\n readonly disclosureInbox: string;\n readonly disclosureIntro: (targets: number, files: number) => string;\n readonly disclosureManagedGuarantee: string;\n readonly disclosureNoGuarantee: string;\n readonly disclosureProvider: string;\n readonly disclosureTitle: string;\n readonly error: (code?: ErrorCode) => string;\n readonly disconnectManaged: string;\n readonly expired: (revision: number) => string;\n readonly failed: (agent: string, revision: number) => string;\n readonly inboxSend: string;\n readonly pickedUp: (revision: number, count: number, time?: string) => string;\n readonly published: (revision: number, expiresAt: string) => string;\n readonly publishing: string;\n readonly queued: (agent: string, revision: number) => string;\n readonly ready: string;\n readonly readyWaiting: (count: number) => string;\n readonly refresh: string;\n readonly resultTitle: string;\n readonly resultHeader: (\n revision: number,\n outcome: ManagedValidationOutcome,\n ) => string;\n readonly resultDisposition: (outcome: ManagedValidationOutcome) => string;\n readonly resultTiming: (stage: string, durationMs: number) => string;\n readonly resolveUnknown: string;\n readonly retry: string;\n readonly revokeManaged: string;\n readonly send: string;\n readonly settingsHelp: string;\n readonly settingsTitle: string;\n readonly superseded: (revision: number) => string;\n readonly title: string;\n readonly unknown: (agent: string, revision: number) => string;\n readonly unknownResolved: (agent: string, revision: number) => string;\n readonly working: (agent: string, revision: number) => string;\n}\n\nconst MESSAGES = Object.freeze({\n \"en-US\": Object.freeze({\n title: \"External Agent connection\",\n agentLabel: \"Agent\",\n codexManaged: \"Codex · managed (experimental)\",\n connectManaged: \"Connect Codex\",\n disconnectManaged: \"Disconnect\",\n revokeManaged: \"Revoke grant\",\n cancelManaged: \"Cancel managed task\",\n resultTitle: \"Managed result\",\n controlConnection: (\n state: ExternalAgentControlStatus[\"connectionState\"],\n mode: ExternalAgentControlStatus[\"mode\"],\n ) => `Connection: ${state} · Mode: ${mode}`,\n controlAuth: (\n auth: ExternalAgentControlStatus[\"authReadiness\"],\n grant: ExternalAgentControlStatus[\"grantState\"],\n ) => `Auth: ${auth} · Grant: ${grant}`,\n controlModel: (model: string) => `Model: ${model}`,\n controlRevision: (task: ControlTask) =>\n `Revision ${String(task.revision)}: ${task.deliveryStatus} / ${task.executionStatus} / ${task.managedPhase}`,\n controlValidation: (outcome: ControlValidationOutcome) => `Validation: ${outcome}`,\n controlFailure: (error: string, action: string) =>\n `Error: ${error} · Next: ${action}`,\n controlUnavailable:\n \"Page connection management is unavailable; external handoffs still fall back honestly to the Agent inbox.\",\n controlErrorText: Object.freeze({\n AGENT_BINARY_NOT_FOUND: \"Codex is not installed or is not on PATH.\",\n AGENT_BINARY_UNTRUSTED: \"The resolved Codex executable is not trusted.\",\n AGENT_VERSION_UNSUPPORTED: \"The installed Codex version is unsupported.\",\n APP_SERVER_HANDSHAKE_FAILED: \"Codex App Server did not complete startup.\",\n AGENT_AUTH_REQUIRED: \"Codex requires an authenticated account.\",\n AGENT_MODEL_UNAVAILABLE: \"The configured Codex model is unavailable.\",\n AGENT_PROTOCOL_INCOMPATIBLE: \"The Codex App Server protocol is incompatible.\",\n CODEX_CONFIG_ISOLATION_UNSUPPORTED:\n \"This Codex version cannot prove managed configuration isolation.\",\n MANAGED_GRANT_INVALID: \"The saved project grant failed validation.\",\n MANAGED_PLATFORM_UNSUPPORTED:\n \"Managed execution is not proven safe on this platform.\",\n MANAGED_GIT_REQUIRED: \"Managed execution requires a Git repository.\",\n MANAGED_SNAPSHOT_FAILED:\n \"The independent workspace snapshot could not be created.\",\n MANAGED_SCOPE_VIOLATION: \"The candidate change exceeded its authorized paths.\",\n MANAGED_CHANGE_LIMIT_EXCEEDED: \"The candidate change exceeded safety limits.\",\n MANAGED_VALIDATION_FAILED:\n \"A required check failed or changed the candidate diff.\",\n MANAGED_WORKSPACE_CONFLICT: \"An authorized source file changed during execution.\",\n MANAGED_APPLY_FAILED: \"The audited change could not be applied safely.\",\n MANAGED_CLEANUP_INCOMPLETE: \"Managed thread or workspace cleanup is incomplete.\",\n }),\n controlActionText: Object.freeze({\n \"install-agent\": \"Install Codex and retry.\",\n \"use-supported-version\": \"Use a supported Codex version.\",\n \"sign-in\": \"Sign in with Codex, then retry.\",\n \"choose-available-model\": \"Choose an available model in Codex configuration.\",\n \"use-inbox\": \"Continue with the Agent inbox fallback.\",\n \"confirm-managed-access\": \"Revoke the invalid grant and confirm access again.\",\n \"review-candidate-diff\": \"Review the candidate diff and validation output.\",\n \"review-workspace-conflict\": \"Review the workspace changes before retrying.\",\n retry: \"Retry the managed connection.\",\n \"inspect-cleanup-warning\": \"Inspect cleanup status before reconnecting.\",\n }),\n resultHeader: (revision: number, outcome: ManagedValidationOutcome) =>\n `Revision ${String(revision)} · Validation ${outcome}`,\n resultDisposition: (outcome: ManagedValidationOutcome) =>\n outcome === \"passed\"\n ? \"Applied to the project after validation passed.\"\n : `Candidate only; it was not applied because validation is ${outcome}.`,\n resultTiming: (stage: string, durationMs: number) =>\n `Timing ${stage}: ${String(durationMs)} ms`,\n description:\n \"Send through a ready active adapter, or publish to the project Agent inbox when no active adapter is connected.\",\n ready:\n \"Local Broker ready. No Agent connection is assumed until a connector reads or waits.\",\n readyWaiting: (count: number) =>\n `${String(count)} active connector wait request(s); publishing can wake them immediately.`,\n activeReady: (agent: string) =>\n `${agent} is connected and idle. The next send will dispatch immediately.`,\n publishing: \"Authorizing current source and publishing the handoff…\",\n published: (revision: number, expiresAt: string) =>\n `Revision ${String(revision)} is available until ${expiresAt}. It has not been claimed as edited.`,\n queued: (agent: string, revision: number) =>\n `Revision ${String(revision)} is reserved for ${agent}.`,\n dispatching: (agent: string, revision: number) =>\n `Dispatching revision ${String(revision)} to ${agent}…`,\n dispatched: (agent: string, revision: number) =>\n agent === \"Claude Code\"\n ? `Revision ${String(revision)} was written to the Claude Channel transport; there is no model ACK yet.`\n : `Codex App Server accepted revision ${String(revision)}; waiting for the matching turn to start.`,\n working: (agent: string, revision: number) =>\n `${agent} is working on revision ${String(revision)}.`,\n completed: (agent: string, revision: number) =>\n `${agent} ended revision ${String(revision)} normally. Review the diff and checks; this does not prove the requested change is correct.`,\n failed: (agent: string, revision: number) =>\n `${agent} reported revision ${String(revision)} as failed. The connector is idle again.`,\n unknown: (agent: string, revision: number) =>\n `Delivery of revision ${String(revision)} to ${agent} is uncertain. The managed writer stopped; review the workspace before allowing another task.`,\n unknownResolved: (agent: string, revision: number) =>\n `Revision ${String(revision)} for ${agent} remains delivery-unknown, but the workspace review was confirmed. A new connector or inbox task may now be used.`,\n pickedUp: (revision: number, count: number, time?: string) =>\n `Revision ${String(revision)} was picked up by ${String(count)} connector instance(s)${time === undefined ? \".\" : `; last pickup ${time}.`} This does not prove a code change.`,\n expired: (revision: number) =>\n `Revision ${String(revision)} expired. Review the current selection and publish again.`,\n superseded: (revision: number) =>\n `Revision ${String(revision)} was superseded by a newer handoff.`,\n send: \"Send to Agent\",\n inboxSend: \"Publish to Agent inbox\",\n retry: \"Retry same send\",\n refresh: \"Refresh pickup status\",\n resolveUnknown: \"Workspace reviewed — allow a new task\",\n settingsTitle: \"Project connection setup\",\n settingsHelp:\n \"Codex managed mode is owned by the current development server. The browser never receives vendor credentials or arbitrary command access. Generic and attached adapters remain honest Inbox fallbacks.\",\n disclosureTitle: \"Confirm external Agent handoff\",\n disclosureIntro: (targets: number, files: number) =>\n `Publish ${String(targets)} selected target(s) referencing ${String(files)} relative file(s).`,\n disclosureData:\n \"The handoff includes your instructions, component/page context, sanitized DOM/CSS, and bounded source read again by the local Node service.\",\n disclosureInbox:\n \"Any SpotPatch connector configured for this project may read it during the 15-minute lifetime.\",\n disclosureProvider:\n \"The Agent host may send the content to its cloud provider under that product's data policy.\",\n disclosureNoGuarantee:\n \"External edits do not receive SpotPatch's built-in worktree, Apply, or Revert guarantees.\",\n disclosureManagedGuarantee:\n \"Managed Codex edits run in an independent temporary snapshot. SpotPatch audits the diff and only applies it when every trusted required check passes.\",\n cancel: \"Cancel\",\n confirm: \"Confirm and send\",\n error: (code?: ErrorCode) =>\n code === \"EXTERNAL_AGENT_BUSY\"\n ? \"The active Agent is still busy or blocked by an uncertain delivery.\"\n : code === \"ACTIVE_DISPATCH_INVALID\"\n ? \"The active delivery state changed. Refresh before continuing.\"\n : code === \"HANDOFF_SOURCE_STALE\"\n ? \"The selected source changed. Select the current component again.\"\n : code === \"HANDOFF_RESPONSE_TOO_LARGE\"\n ? \"The handoff is too large. Reduce the selected context.\"\n : code === \"EXTERNAL_HANDOFF_DISABLED\"\n ? \"External Agent handoff is disabled in trusted project configuration.\"\n : code === \"EXTERNAL_HANDOFF_UNAVAILABLE\" || code === \"SESSION_CLOSED\"\n ? \"The local external Agent Broker is unavailable. Restart the development server.\"\n : \"The external Agent handoff request failed without publishing a partial revision.\",\n }),\n \"zh-CN\": Object.freeze({\n title: \"外部 Agent 连接\",\n agentLabel: \"Agent\",\n codexManaged: \"Codex · 受管模式(实验性)\",\n connectManaged: \"连接 Codex\",\n disconnectManaged: \"断开连接\",\n revokeManaged: \"撤销授权\",\n cancelManaged: \"取消受管任务\",\n resultTitle: \"受管执行结果\",\n controlConnection: (\n state: ExternalAgentControlStatus[\"connectionState\"],\n mode: ExternalAgentControlStatus[\"mode\"],\n ) => `连接:${state} · 模式:${mode}`,\n controlAuth: (\n auth: ExternalAgentControlStatus[\"authReadiness\"],\n grant: ExternalAgentControlStatus[\"grantState\"],\n ) => `认证:${auth} · 授权:${grant}`,\n controlModel: (model: string) => `模型:${model}`,\n controlRevision: (task: ControlTask) =>\n `revision ${String(task.revision)}:${task.deliveryStatus} / ${task.executionStatus} / ${task.managedPhase}`,\n controlValidation: (outcome: ControlValidationOutcome) => `验证:${outcome}`,\n controlFailure: (error: string, action: string) =>\n `错误:${error} · 下一步:${action}`,\n controlUnavailable:\n \"页面连接管理不可用;外部交接仍会按真实能力降级为 Agent 收件箱。\",\n controlErrorText: Object.freeze({\n AGENT_BINARY_NOT_FOUND: \"未安装 Codex,或 Codex 不在 PATH 中。\",\n AGENT_BINARY_UNTRUSTED: \"解析到的 Codex 可执行文件不可信。\",\n AGENT_VERSION_UNSUPPORTED: \"已安装的 Codex 版本不受支持。\",\n APP_SERVER_HANDSHAKE_FAILED: \"Codex App Server 未完成启动握手。\",\n AGENT_AUTH_REQUIRED: \"Codex 需要已登录的账户。\",\n AGENT_MODEL_UNAVAILABLE: \"Codex 配置的模型当前不可用。\",\n AGENT_PROTOCOL_INCOMPATIBLE: \"Codex App Server 协议不兼容。\",\n CODEX_CONFIG_ISOLATION_UNSUPPORTED: \"当前 Codex 版本无法证明受管配置隔离。\",\n MANAGED_GRANT_INVALID: \"保存的项目授权未通过校验。\",\n MANAGED_PLATFORM_UNSUPPORTED: \"当前平台尚未证明可安全运行受管执行。\",\n MANAGED_GIT_REQUIRED: \"受管执行要求项目位于 Git 仓库中。\",\n MANAGED_SNAPSHOT_FAILED: \"无法创建独立工作区快照。\",\n MANAGED_SCOPE_VIOLATION: \"候选修改超出授权路径。\",\n MANAGED_CHANGE_LIMIT_EXCEEDED: \"候选修改超过安全上限。\",\n MANAGED_VALIDATION_FAILED: \"required check 失败或改变了候选 diff。\",\n MANAGED_WORKSPACE_CONFLICT: \"执行期间授权源码发生了变化。\",\n MANAGED_APPLY_FAILED: \"已审计修改无法安全写入。\",\n MANAGED_CLEANUP_INCOMPLETE: \"受管 thread 或工作区清理不完整。\",\n }),\n controlActionText: Object.freeze({\n \"install-agent\": \"安装 Codex 后重试。\",\n \"use-supported-version\": \"改用受支持的 Codex 版本。\",\n \"sign-in\": \"登录 Codex 后重试。\",\n \"choose-available-model\": \"在 Codex 配置中选择可用模型。\",\n \"use-inbox\": \"继续使用 Agent 收件箱降级路径。\",\n \"confirm-managed-access\": \"撤销无效授权并重新确认。\",\n \"review-candidate-diff\": \"检查候选 diff 和验证输出。\",\n \"review-workspace-conflict\": \"检查工作区变化后再重试。\",\n retry: \"重试受管连接。\",\n \"inspect-cleanup-warning\": \"确认清理状态后再连接。\",\n }),\n resultHeader: (revision: number, outcome: ManagedValidationOutcome) =>\n `revision ${String(revision)} · 验证 ${outcome}`,\n resultDisposition: (outcome: ManagedValidationOutcome) =>\n outcome === \"passed\"\n ? \"验证通过,修改已写入项目。\"\n : `这只是候选 diff;验证状态为 ${outcome},因此没有写入项目。`,\n resultTiming: (stage: string, durationMs: number) =>\n `耗时 ${stage}: ${String(durationMs)} ms`,\n description:\n \"有主动适配器就立即派发;未连接主动适配器时,诚实降级为项目 Agent 收件箱。\",\n ready: \"本地 Broker 已就绪。只有连接器读取或等待后,才能证明发生过连接。\",\n readyWaiting: (count: number) =>\n `当前有 ${String(count)} 个连接器等待请求,发布后可立即唤醒。`,\n activeReady: (agent: string) =>\n `${agent} 已连接并处于空闲状态,下次发送会立即派发。`,\n publishing: \"正在重新授权当前源码并发布交接……\",\n published: (revision: number, expiresAt: string) =>\n `交接 revision ${String(revision)} 可读取至 ${expiresAt};这不表示代码已被修改。`,\n queued: (agent: string, revision: number) =>\n `交接 revision ${String(revision)} 已为 ${agent} 预留。`,\n dispatching: (agent: string, revision: number) =>\n `正在把 revision ${String(revision)} 派发给 ${agent}……`,\n dispatched: (agent: string, revision: number) =>\n agent === \"Claude Code\"\n ? `revision ${String(revision)} 已写入 Claude Channel transport;当前没有模型 ACK。`\n : `Codex App Server 已接受 revision ${String(revision)},正在等待匹配 turn 启动。`,\n working: (agent: string, revision: number) =>\n `${agent} 正在处理 revision ${String(revision)}。`,\n completed: (agent: string, revision: number) =>\n `${agent} 已正常结束 revision ${String(revision)}。请核对 diff 和检查结果;这不证明修改要求已经正确完成。`,\n failed: (agent: string, revision: number) =>\n `${agent} 已将 revision ${String(revision)} 报告为失败,连接器已恢复空闲。`,\n unknown: (agent: string, revision: number) =>\n `revision ${String(revision)} 向 ${agent} 的投递结果不确定。受管 writer 已停止,请先核对工作区再允许新任务。`,\n unknownResolved: (agent: string, revision: number) =>\n `${agent} 的 revision ${String(revision)} 仍记为投递未知,但工作区核对已经确认;现在可以重新连接或发布新的收件箱任务。`,\n pickedUp: (revision: number, count: number, time?: string) =>\n `交接 revision ${String(revision)} 已被 ${String(count)} 个连接器实例取走${time === undefined ? \"。\" : `,最近取件于 ${time}。`}这不能证明代码已经修改。`,\n expired: (revision: number) =>\n `交接 revision ${String(revision)} 已过期,请核对当前选择后重新发布。`,\n superseded: (revision: number) =>\n `交接 revision ${String(revision)} 已被更新版本取代。`,\n send: \"发送给 Agent\",\n inboxSend: \"发布到 Agent 收件箱\",\n retry: \"重试同一次发送\",\n refresh: \"刷新取件状态\",\n resolveUnknown: \"已核对工作区,允许新任务\",\n settingsTitle: \"项目连接设置\",\n settingsHelp:\n \"Codex 受管模式由当前开发服务托管,浏览器不会获得厂商凭证或任意命令权限;通用与 attached adapter 仍按真实能力降级为收件箱。\",\n disclosureTitle: \"确认发布到外部 Agent\",\n disclosureIntro: (targets: number, files: number) =>\n `将发布 ${String(targets)} 个目标,涉及 ${String(files)} 个项目相对文件。`,\n disclosureData:\n \"交接包含修改说明、组件与页面上下文、已清洗的 DOM/CSS,以及本地 Node 服务重新读取的有界源码。\",\n disclosureInbox:\n \"15 分钟有效期内,本项目中任何已配置的 SpotPatch Connector 都可能读取。\",\n disclosureProvider: \"Agent 宿主可能依据其产品数据策略,将内容发送给云端模型服务。\",\n disclosureNoGuarantee:\n \"外部修改不具备 SpotPatch 内建 Agent 的 worktree、Apply 或 Revert 保证。\",\n disclosureManagedGuarantee:\n \"受管 Codex 只写独立临时快照。SpotPatch 会审计 diff,且仅在所有可信 required checks 通过后才写入业务仓库。\",\n cancel: \"取消\",\n confirm: \"确认并发送\",\n error: (code?: ErrorCode) =>\n code === \"EXTERNAL_AGENT_BUSY\"\n ? \"主动 Agent 仍在工作,或存在尚未核对的投递未知状态。\"\n : code === \"ACTIVE_DISPATCH_INVALID\"\n ? \"主动投递状态已经变化,请刷新后再继续。\"\n : code === \"HANDOFF_SOURCE_STALE\"\n ? \"选中源码已经变化,请重新选择当前组件。\"\n : code === \"HANDOFF_RESPONSE_TOO_LARGE\"\n ? \"交接内容超过上限,请减少所选上下文。\"\n : code === \"EXTERNAL_HANDOFF_DISABLED\"\n ? \"可信项目配置没有启用外部 Agent 交接。\"\n : code === \"EXTERNAL_HANDOFF_UNAVAILABLE\" || code === \"SESSION_CLOSED\"\n ? \"本地外部 Agent Broker 不可用,请重启开发服务。\"\n : \"外部 Agent 交接请求失败,未发布任何部分 revision。\",\n }),\n}) satisfies Readonly<Record<SpotPatchLocale, ExternalHandoffMessages>>;\n\nfunction createStyles(document: Document): HTMLStyleElement {\n const styles = document.createElement(\"style\");\n styles.textContent = `\n .spotpatch-external-handoff { margin-top: 12px; padding: 12px; border: 1px solid var(--spotpatch-border); border-radius: var(--spotpatch-radius-card); background: rgb(82 168 255 / 5%); }\n .spotpatch-external-handoff[hidden] { display: none; }\n .spotpatch-external-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n .spotpatch-external-heading strong { font-size: 12px; font-weight: 680; color: var(--spotpatch-text); }\n .spotpatch-external-description, .spotpatch-external-status, .spotpatch-external-settings p { margin: 6px 0 0; font-size: 11px; line-height: 1.5; color: var(--spotpatch-text-secondary); }\n .spotpatch-external-status { padding-left: 10px; border-left: 2px solid var(--spotpatch-accent-cyan); color: #cbd5e1; }\n .spotpatch-external-status[data-state=\"error\"] { border-color: var(--spotpatch-danger); color: #fecdd3; }\n .spotpatch-external-status[data-state=\"picked-up\"] { border-color: var(--spotpatch-success); color: #a7f3d0; }\n .spotpatch-external-control { margin-top: 9px; padding: 9px; border: 1px solid var(--spotpatch-border); border-radius: 8px; background: rgb(3 7 18 / 28%); }\n .spotpatch-external-control label { display: grid; gap: 4px; color: var(--spotpatch-text-secondary); font-size: 10px; }\n .spotpatch-external-control select { width: 100%; padding: 6px 8px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: var(--spotpatch-bg-input); color: var(--spotpatch-text); font: inherit; }\n .spotpatch-external-control-status { margin: 7px 0 0; color: #cbd5e1; font-size: 10.5px; line-height: 1.5; white-space: pre-wrap; }\n .spotpatch-external-control-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }\n .spotpatch-external-control-actions button { padding: 5px 8px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: var(--spotpatch-bg-active); color: var(--spotpatch-text); font: inherit; font-size: 10px; cursor: pointer; }\n .spotpatch-external-control-actions button:disabled { cursor: default; opacity: .45; }\n .spotpatch-external-result { margin-top: 8px; color: var(--spotpatch-text-secondary); font-size: 10px; }\n .spotpatch-external-result pre { max-height: 180px; overflow: auto; margin: 6px 0 0; padding: 7px; border-radius: 6px; background: var(--spotpatch-bg-input); color: #d8d6ff; font: 9px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre; }\n .spotpatch-external-settings { margin-top: 9px; }\n .spotpatch-external-settings summary { cursor: pointer; color: #c4b5fd; font-size: 11px; }\n .spotpatch-external-refresh { padding: 3px 7px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: transparent; color: var(--spotpatch-text-secondary); font: inherit; font-size: 10px; cursor: pointer; }\n .spotpatch-external-refresh:disabled { cursor: default; opacity: .45; }\n .spotpatch-external-resolve { margin-top: 8px; padding: 6px 8px; border: 1px solid #f59e0b; border-radius: 6px; background: rgb(245 158 11 / 10%); color: #fde68a; font: inherit; font-size: 10px; cursor: pointer; }\n .spotpatch-external-resolve[hidden] { display: none; }\n .spotpatch-external-resolve:disabled { cursor: default; opacity: .45; }\n .spotpatch-external-disclosure { position: fixed; inset: 0; z-index: 4; display: grid; place-items: center; padding: 20px; background: rgb(3 3 8 / 72%); backdrop-filter: blur(3px); }\n .spotpatch-external-disclosure[hidden] { display: none; }\n .spotpatch-external-disclosure-card { width: min(420px, calc(100vw - 40px)); max-height: calc(100vh - 40px); overflow: auto; padding: 18px; border: 1px solid rgb(139 123 255 / 55%); border-radius: 14px; background: var(--spotpatch-bg-raised); box-shadow: var(--spotpatch-shadow-panel); }\n .spotpatch-external-disclosure-card h3 { margin: 0; color: var(--spotpatch-text); font-size: 15px; }\n .spotpatch-external-disclosure-card p { margin: 9px 0 0; color: #c4c7d0; font-size: 11.5px; line-height: 1.55; }\n .spotpatch-external-files { max-height: 96px; overflow: auto; color: #a5b4fc; font: 10px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }\n .spotpatch-external-disclosure-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 15px; }\n .spotpatch-external-disclosure-actions button { padding: 7px 10px; border: 1px solid var(--spotpatch-border); border-radius: 7px; background: var(--spotpatch-bg-active); color: var(--spotpatch-text); font: inherit; cursor: pointer; }\n .spotpatch-external-disclosure-actions .spotpatch-primary { border-color: transparent; background: var(--spotpatch-accent); color: var(--spotpatch-text-on-accent); }\n `;\n return styles;\n}\n\nfunction formatTime(value: string, locale: SpotPatchLocale): string {\n const date = new Date(value);\n return Number.isNaN(date.valueOf())\n ? value\n : new Intl.DateTimeFormat(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n }).format(date);\n}\n\nfunction agentName(kind: ActiveAdapterSummary[\"kind\"]): string {\n return kind === \"claude-channel\" ? \"Claude Code\" : \"Codex\";\n}\n\nfunction dispatchMessage(\n messages: ExternalHandoffMessages,\n dispatch: DispatchSummary,\n): string {\n const agent = agentName(dispatch.adapterKind);\n\n if (dispatch.phase === \"queued\") {\n return messages.queued(agent, dispatch.revision);\n }\n if (dispatch.phase === \"dispatching\") {\n return messages.dispatching(agent, dispatch.revision);\n }\n if (dispatch.phase === \"dispatched\") {\n return messages.dispatched(agent, dispatch.revision);\n }\n if (dispatch.phase === \"working\") {\n return messages.working(agent, dispatch.revision);\n }\n if (dispatch.phase === \"completed\") {\n return messages.completed(agent, dispatch.revision);\n }\n if (dispatch.phase === \"failed\") {\n return messages.failed(agent, dispatch.revision);\n }\n return messages.unknown(agent, dispatch.revision);\n}\n\nfunction disclosurePaths(annotation: SpotAnnotation): readonly string[] {\n return Object.freeze([\n ...new Set(\n annotation.targets.flatMap((target) => {\n const relativePath = target.code?.relativePath ?? target.source.relativePath;\n return relativePath === undefined ? [] : [relativePath];\n }),\n ),\n ]);\n}\n\nfunction controlStatusText(\n value: ExternalAgentControlStatus,\n messages: ExternalHandoffMessages,\n): string {\n const model = value.effectiveModel ?? value.requestedModel;\n const task = value.task;\n const parts = [\n messages.controlConnection(value.connectionState, value.mode),\n messages.controlAuth(value.authReadiness, value.grantState),\n ...(model === undefined ? [] : [messages.controlModel(model)]),\n ...(task === undefined\n ? []\n : [\n messages.controlRevision(task),\n ...(task.validationOutcome === undefined\n ? []\n : [messages.controlValidation(task.validationOutcome)]),\n ]),\n ...(value.error === undefined\n ? []\n : [\n messages.controlFailure(\n messages.controlErrorText[value.error.code],\n messages.controlActionText[value.error.action],\n ),\n ]),\n ];\n return parts.join(\"\\n\");\n}\n\nfunction managedResultText(\n result: ExternalAgentManagedResult,\n messages: ExternalHandoffMessages,\n): string {\n const files = result.files.map(\n (file) => `${file.path} +${String(file.additions)} -${String(file.deletions)}`,\n );\n const checks = result.checks.map(\n (check) =>\n `${check.id}: ${check.outcome} (${String(check.durationMs)} ms${check.exitCode === undefined ? \"\" : `, exit ${String(check.exitCode)}`})`,\n );\n const timings = Object.entries(result.timings).flatMap(([stage, durationMs]) =>\n durationMs === undefined ? [] : [messages.resultTiming(stage, durationMs)],\n );\n return [\n messages.resultHeader(result.revision, result.validationOutcome),\n messages.resultDisposition(result.validationOutcome),\n ...files,\n ...checks,\n ...timings,\n ].join(\"\\n\");\n}\n\nexport function createExternalHandoffPanel(\n document: Document,\n framework: \"vite\" | \"next\",\n locale: () => SpotPatchLocale,\n sessionId: string,\n subscribeLocale: (listener: () => void) => () => void,\n onViewChange: () => void,\n): ExternalHandoffPanel {\n const options: PanelOptions = {\n document,\n framework,\n locale,\n onViewChange,\n sessionId,\n subscribeLocale,\n };\n let messages = MESSAGES[options.locale()];\n let activeAdapter: ActiveAdapterSummary | null = null;\n let brokerReady = false;\n let dispatchBlocksSend = false;\n let operationBusy = false;\n let retryable = false;\n let unknownDelivery = false;\n let contextReady = false;\n let controlOperationBusy = false;\n let visible = false;\n let control: ExternalAgentControlStatus | undefined;\n let managedResultValue: ExternalAgentManagedResult | undefined;\n let pendingDisclosure: ((confirmed: boolean) => void) | undefined;\n let previousFocus: HTMLElement | undefined;\n const consentKey = `spotpatch:external-handoff-consent:${options.sessionId}`;\n const root = createMarkedElement(document, \"section\");\n root.className = \"spotpatch-external-handoff\";\n root.hidden = true;\n const heading = createMarkedElement(document, \"div\");\n heading.className = \"spotpatch-external-heading\";\n const title = createMarkedElement(document, \"strong\");\n const refreshButton = createButton(document, \"\", \"spotpatch-external-refresh\");\n heading.append(title, refreshButton);\n const description = createMarkedElement(document, \"p\");\n description.className = \"spotpatch-external-description\";\n const status = createMarkedElement(document, \"p\");\n status.className = \"spotpatch-external-status\";\n status.setAttribute(\"role\", \"status\");\n status.setAttribute(\"aria-live\", \"polite\");\n const controlRoot = createMarkedElement(document, \"div\");\n controlRoot.className = \"spotpatch-external-control\";\n const agentLabel = createMarkedElement(document, \"label\");\n const agentLabelText = createMarkedElement(document, \"span\");\n const agentSelect = createMarkedElement(document, \"select\");\n const codexOption = createMarkedElement(document, \"option\");\n codexOption.value = \"codex\";\n agentSelect.append(codexOption);\n agentLabel.append(agentLabelText, agentSelect);\n const controlStatus = createMarkedElement(document, \"p\");\n controlStatus.className = \"spotpatch-external-control-status\";\n controlStatus.setAttribute(\"role\", \"status\");\n const controlActions = createMarkedElement(document, \"div\");\n controlActions.className = \"spotpatch-external-control-actions\";\n const connectButton = createButton(document, \"\");\n const disconnectButton = createButton(document, \"\");\n const revokeButton = createButton(document, \"\");\n const cancelManagedButton = createButton(document, \"\");\n controlActions.append(\n connectButton,\n disconnectButton,\n revokeButton,\n cancelManagedButton,\n );\n const managedResult = createMarkedElement(document, \"details\");\n managedResult.className = \"spotpatch-external-result\";\n managedResult.hidden = true;\n const managedResultTitle = createMarkedElement(document, \"summary\");\n const managedResultSummary = createMarkedElement(document, \"p\");\n const managedResultDiff = createMarkedElement(document, \"pre\");\n managedResult.append(managedResultTitle, managedResultSummary, managedResultDiff);\n controlRoot.append(agentLabel, controlStatus, controlActions, managedResult);\n const resolveButton = createButton(document, \"\", \"spotpatch-external-resolve\");\n resolveButton.hidden = true;\n const settings = createMarkedElement(document, \"details\");\n settings.className = \"spotpatch-external-settings\";\n const settingsTitle = createMarkedElement(document, \"summary\");\n const settingsHelp = createMarkedElement(document, \"p\");\n settings.append(settingsTitle, settingsHelp);\n root.append(heading, description, controlRoot, status, resolveButton, settings);\n\n const sendButton = createButton(document, \"\", \"spotpatch-primary\");\n sendButton.hidden = true;\n const disclosure = createMarkedElement(document, \"div\");\n disclosure.className = \"spotpatch-external-disclosure\";\n disclosure.hidden = true;\n const disclosureCard = createMarkedElement(document, \"section\");\n disclosureCard.className = \"spotpatch-external-disclosure-card\";\n disclosureCard.tabIndex = -1;\n disclosureCard.setAttribute(\"role\", \"alertdialog\");\n disclosureCard.setAttribute(\"aria-modal\", \"true\");\n const disclosureTitle = createMarkedElement(document, \"h3\");\n const disclosureIntro = createMarkedElement(document, \"p\");\n const disclosureFiles = createMarkedElement(document, \"p\");\n disclosureFiles.className = \"spotpatch-external-files\";\n const disclosureData = createMarkedElement(document, \"p\");\n const disclosureInbox = createMarkedElement(document, \"p\");\n const disclosureProvider = createMarkedElement(document, \"p\");\n const disclosureNoGuarantee = createMarkedElement(document, \"p\");\n const disclosureActions = createMarkedElement(document, \"div\");\n disclosureActions.className = \"spotpatch-external-disclosure-actions\";\n const cancelButton = createButton(document, \"\");\n const confirmButton = createButton(document, \"\", \"spotpatch-primary\");\n disclosureActions.append(cancelButton, confirmButton);\n disclosureCard.append(\n disclosureTitle,\n disclosureIntro,\n disclosureFiles,\n disclosureData,\n disclosureInbox,\n disclosureProvider,\n disclosureNoGuarantee,\n disclosureActions,\n );\n disclosure.append(disclosureCard);\n root.append(disclosure);\n\n const hasConsent = (): boolean => {\n try {\n return document.defaultView?.sessionStorage.getItem(consentKey) === \"confirmed\";\n } catch {\n return false;\n }\n };\n const rememberConsent = (): void => {\n try {\n document.defaultView?.sessionStorage.setItem(consentKey, \"confirmed\");\n } catch {\n // A blocked storage API only means the disclosure is shown again next time.\n }\n };\n const refreshActions = (): void => {\n sendButton.textContent = retryable\n ? messages.retry\n : activeAdapter?.canDispatch === true\n ? messages.send\n : messages.inboxSend;\n sendButton.disabled =\n !visible ||\n !brokerReady ||\n !contextReady ||\n operationBusy ||\n (!retryable && dispatchBlocksSend);\n sendButton.setAttribute(\"aria-busy\", String(operationBusy));\n refreshButton.disabled = !visible || operationBusy;\n resolveButton.hidden = !unknownDelivery;\n resolveButton.disabled = !visible || operationBusy || !unknownDelivery;\n };\n const refreshControlActions = (): void => {\n if (control === undefined) {\n connectButton.disabled = true;\n disconnectButton.disabled = true;\n revokeButton.disabled = true;\n cancelManagedButton.hidden = true;\n return;\n }\n const state = control.connectionState;\n const operationPending =\n controlOperationBusy ||\n state === \"diagnosing\" ||\n state === \"connecting\" ||\n state === \"disconnecting\";\n connectButton.disabled = operationPending || state === \"ready\" || state === \"busy\";\n disconnectButton.disabled = operationPending || state === \"disconnected\";\n revokeButton.disabled = operationPending || control.grantState !== \"valid\";\n const phase = control.task?.managedPhase;\n cancelManagedButton.hidden =\n phase === undefined ||\n phase === \"completed\" ||\n phase === \"review-required\" ||\n phase === \"failed\" ||\n phase === \"cancelled\" ||\n phase === \"cleanup-warning\";\n cancelManagedButton.disabled = operationPending;\n };\n const settleDisclosure = (confirmed: boolean): void => {\n if (pendingDisclosure === undefined) return;\n const resolve = pendingDisclosure;\n pendingDisclosure = undefined;\n disclosure.hidden = true;\n if (confirmed) rememberConsent();\n previousFocus?.focus({ preventScroll: true });\n previousFocus = undefined;\n resolve(confirmed);\n options.onViewChange();\n };\n const handleDisclosureKeydown = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n settleDisclosure(false);\n return;\n }\n\n if (event.key !== \"Tab\") return;\n const first = cancelButton;\n const last = confirmButton;\n const rootNode = disclosure.getRootNode();\n const activeElement =\n \"activeElement\" in rootNode ? rootNode.activeElement : document.activeElement;\n\n if (event.shiftKey && activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n const applyMessages = (): void => {\n messages = MESSAGES[options.locale()];\n title.textContent = messages.title;\n description.textContent = messages.description;\n refreshButton.textContent = messages.refresh;\n refreshButton.title = messages.refresh;\n settingsTitle.textContent = messages.settingsTitle;\n settingsHelp.textContent = messages.settingsHelp;\n disclosureTitle.textContent = messages.disclosureTitle;\n disclosureData.textContent = messages.disclosureData;\n disclosureInbox.textContent = messages.disclosureInbox;\n disclosureProvider.textContent = messages.disclosureProvider;\n disclosureNoGuarantee.textContent = messages.disclosureNoGuarantee;\n agentLabelText.textContent = messages.agentLabel;\n codexOption.textContent = messages.codexManaged;\n connectButton.textContent = messages.connectManaged;\n disconnectButton.textContent = messages.disconnectManaged;\n revokeButton.textContent = messages.revokeManaged;\n cancelManagedButton.textContent = messages.cancelManaged;\n managedResultTitle.textContent = messages.resultTitle;\n if (control !== undefined) {\n controlStatus.textContent = controlStatusText(control, messages);\n disclosureNoGuarantee.textContent =\n control.mode === \"managed\"\n ? messages.disclosureManagedGuarantee\n : messages.disclosureNoGuarantee;\n }\n if (managedResultValue !== undefined) {\n managedResultSummary.textContent = managedResultText(\n managedResultValue,\n messages,\n );\n }\n cancelButton.textContent = messages.cancel;\n confirmButton.textContent = messages.confirm;\n resolveButton.textContent = messages.resolveUnknown;\n refreshActions();\n refreshControlActions();\n };\n\n cancelButton.addEventListener(\"click\", () => {\n settleDisclosure(false);\n });\n confirmButton.addEventListener(\"click\", () => {\n settleDisclosure(true);\n });\n disclosure.addEventListener(\"keydown\", handleDisclosureKeydown);\n settings.addEventListener(\"toggle\", options.onViewChange);\n managedResult.addEventListener(\"toggle\", options.onViewChange);\n const unsubscribeLocale = options.subscribeLocale(applyMessages);\n applyMessages();\n status.textContent = messages.ready;\n controlStatus.textContent =\n options.locale() === \"zh-CN\"\n ? \"正在读取本地连接状态……\"\n : \"Reading local connection status…\";\n refreshActions();\n refreshControlActions();\n\n const summaryMessage = (summary: ExternalHandoffSummary): string =>\n summary.state === \"expired\"\n ? messages.expired(summary.revision)\n : summary.state === \"superseded\"\n ? messages.superseded(summary.revision)\n : summary.pickupCount > 0\n ? messages.pickedUp(\n summary.revision,\n summary.pickupCount,\n summary.pickedUpAt === undefined\n ? undefined\n : formatTime(summary.pickedUpAt, options.locale()),\n )\n : messages.published(\n summary.revision,\n formatTime(summary.expiresAt, options.locale()),\n );\n\n const applyStatus = (result: ExternalHandoffStatusResult): void => {\n operationBusy = false;\n retryable = false;\n activeAdapter = result.activeAdapter;\n unknownDelivery =\n result.dispatch?.phase === \"delivery-unknown\" &&\n result.activeAdapter?.state === \"blocked\";\n dispatchBlocksSend =\n unknownDelivery ||\n (result.activeAdapter !== null && !result.activeAdapter.canDispatch);\n\n if (result.dispatch !== null) {\n status.dataset.state = result.dispatch.phase;\n status.textContent =\n result.dispatch.phase === \"delivery-unknown\" && !unknownDelivery\n ? messages.unknownResolved(\n agentName(result.dispatch.adapterKind),\n result.dispatch.revision,\n )\n : dispatchMessage(messages, result.dispatch);\n } else {\n status.dataset.state =\n result.handoff.state === \"available\" && result.handoff.pickupCount > 0\n ? \"picked-up\"\n : result.handoff.state;\n status.textContent = summaryMessage(result.handoff);\n }\n\n refreshActions();\n options.onViewChange();\n };\n\n return Object.freeze({\n root,\n styles: createStyles(document),\n sendButton,\n refreshButton,\n resolveButton,\n cancelManagedButton,\n connectButton,\n disconnectButton,\n revokeButton,\n\n confirmDisclosure(annotation: SpotAnnotation): Promise<boolean> {\n if (hasConsent()) return Promise.resolve(true);\n if (pendingDisclosure !== undefined) return Promise.resolve(false);\n const paths = disclosurePaths(annotation);\n disclosureIntro.textContent = messages.disclosureIntro(\n annotation.targets.length,\n paths.length,\n );\n disclosureFiles.textContent = paths.length === 0 ? \"—\" : paths.join(\"\\n\");\n disclosure.hidden = false;\n const rootNode = root.getRootNode();\n const activeElement =\n \"activeElement\" in rootNode ? rootNode.activeElement : document.activeElement;\n previousFocus = activeElement instanceof HTMLElement ? activeElement : undefined;\n options.onViewChange();\n disclosureCard.focus({ preventScroll: true });\n\n return new Promise<boolean>((resolve) => {\n pendingDisclosure = resolve;\n });\n },\n\n renderCapability(capability: ExternalHandoffCapability): void {\n brokerReady = capability.brokerReady;\n operationBusy = false;\n retryable = false;\n activeAdapter = capability.activeAdapter;\n unknownDelivery = false;\n dispatchBlocksSend =\n capability.activeAdapter !== null && !capability.activeAdapter.canDispatch;\n status.dataset.state = capability.brokerReady ? \"ready\" : \"error\";\n status.textContent = capability.brokerReady\n ? capability.activeAdapter?.canDispatch === true\n ? messages.activeReady(agentName(capability.activeAdapter.kind))\n : capability.dispatch !== null && capability.activeAdapter !== null\n ? dispatchMessage(messages, capability.dispatch)\n : capability.activeWaitCount > 0\n ? messages.readyWaiting(capability.activeWaitCount)\n : messages.ready\n : messages.error(\"EXTERNAL_HANDOFF_UNAVAILABLE\");\n refreshActions();\n options.onViewChange();\n },\n\n renderPublishing(): void {\n operationBusy = true;\n retryable = false;\n status.dataset.state = \"publishing\";\n status.textContent = messages.publishing;\n refreshActions();\n options.onViewChange();\n },\n\n renderPublishResult(result: ExternalHandoffPublishResult): void {\n applyStatus(\n Object.freeze({\n handoff: result.handoff,\n activeAdapter:\n result.delivery.mode === \"active\" ? result.delivery.adapter : null,\n dispatch: result.delivery.mode === \"active\" ? result.delivery.dispatch : null,\n }),\n );\n },\n\n renderStatus(result: ExternalHandoffStatusResult): void {\n applyStatus(result);\n },\n\n renderControlStatus(value: ExternalAgentControlStatus): void {\n control = value;\n controlStatus.textContent = controlStatusText(value, messages);\n controlStatus.dataset.state = value.connectionState;\n disclosureNoGuarantee.textContent =\n value.mode === \"managed\"\n ? messages.disclosureManagedGuarantee\n : messages.disclosureNoGuarantee;\n refreshControlActions();\n options.onViewChange();\n },\n\n renderControlUnavailable(): void {\n control = undefined;\n controlStatus.dataset.state = \"unavailable\";\n controlStatus.textContent = messages.controlUnavailable;\n disclosureNoGuarantee.textContent = messages.disclosureNoGuarantee;\n refreshControlActions();\n options.onViewChange();\n },\n\n renderManagedResult(result: ExternalAgentManagedResult): void {\n managedResultValue = result;\n managedResult.hidden = false;\n managedResult.open = true;\n managedResultSummary.textContent = managedResultText(result, messages);\n managedResultDiff.textContent = result.diff;\n options.onViewChange();\n },\n\n renderError(code?: ErrorCode, canRetry = false): void {\n operationBusy = false;\n retryable = canRetry;\n if (code === \"EXTERNAL_AGENT_BUSY\") dispatchBlocksSend = true;\n status.dataset.state = \"error\";\n status.textContent = canRetry\n ? `${messages.error(code)} ${messages.retry}.`\n : messages.error(code);\n refreshActions();\n options.onViewChange();\n },\n\n setBusy(nextBusy: boolean): void {\n operationBusy = nextBusy;\n refreshActions();\n },\n\n setControlBusy(nextBusy: boolean): void {\n controlOperationBusy = nextBusy;\n refreshControlActions();\n },\n\n setContextReady(ready: boolean): void {\n contextReady = ready;\n refreshActions();\n },\n\n setSelectionVisible(nextVisible: boolean): void {\n visible = nextVisible;\n root.hidden = !nextVisible;\n sendButton.hidden = !nextVisible;\n if (!nextVisible) settleDisclosure(false);\n refreshActions();\n },\n\n dispose(): void {\n settleDisclosure(false);\n disclosure.removeEventListener(\"keydown\", handleDisclosureKeydown);\n settings.removeEventListener(\"toggle\", options.onViewChange);\n managedResult.removeEventListener(\"toggle\", options.onViewChange);\n unsubscribeLocale();\n },\n });\n}\n"],"mappings":"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","names":["ERROR_CODES","EXTERNAL_AGENT_CONTROL_LIMITS","SPOTPATCH_ENDPOINTS","SPOTPATCH_TOKEN_HEADER","SPOTPATCH_TOKEN_HEADER","SPOTPATCH_ENDPOINTS","EXTERNAL_AGENT_CONTROL_LIMITS","ERROR_CODES"]}
package/dist/index.cjs CHANGED
@@ -2578,6 +2578,12 @@ function calculateDialogPlacement({
2578
2578
  });
2579
2579
  }
2580
2580
 
2581
+ // src/ui/external-handoff-contract.ts
2582
+ var EXTERNAL_HANDOFF_EXTENSION_KEY = /* @__PURE__ */ Symbol.for("spotpatch.external-handoff.v1");
2583
+ function getExternalHandoffExtension() {
2584
+ return globalThis[EXTERNAL_HANDOFF_EXTENSION_KEY];
2585
+ }
2586
+
2581
2587
  // src/ui/localization.ts
2582
2588
  var import_shared6 = require("@spotpatch/shared");
2583
2589
  var STATUS_EN = Object.freeze({
@@ -2610,6 +2616,8 @@ var STATUS_ZH = Object.freeze({
2610
2616
  reverted: "\u5DF2\u64A4\u9500",
2611
2617
  failed: "\u5931\u8D25"
2612
2618
  });
2619
+ var EXTERNAL_HANDOFF_ERROR_EN = "The external Agent handoff request failed.";
2620
+ var EXTERNAL_HANDOFF_ERROR_ZH = "\u5916\u90E8 Agent \u4EA4\u63A5\u8BF7\u6C42\u5931\u8D25\u3002";
2613
2621
  var ERROR_MESSAGES_EN = Object.freeze({
2614
2622
  [import_shared6.ERROR_CODES.INVALID_REQUEST]: "The Agent request was rejected as invalid.",
2615
2623
  [import_shared6.ERROR_CODES.INVALID_TOKEN]: "The local SpotPatch session expired.",
@@ -2631,6 +2639,24 @@ var ERROR_MESSAGES_EN = Object.freeze({
2631
2639
  [import_shared6.ERROR_CODES.AGENT_BUSY]: "Another write Agent job is still active.",
2632
2640
  [import_shared6.ERROR_CODES.AGENT_LIMIT_EXCEEDED]: "The Agent stopped at a configured time, turn, output, or size limit.",
2633
2641
  [import_shared6.ERROR_CODES.AGENT_CANCELLED]: "The Agent job was cancelled.",
2642
+ [import_shared6.ERROR_CODES.EXTERNAL_HANDOFF_DISABLED]: EXTERNAL_HANDOFF_ERROR_EN,
2643
+ [import_shared6.ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]: EXTERNAL_HANDOFF_ERROR_EN,
2644
+ [import_shared6.ERROR_CODES.HANDOFF_VALIDATION_FAILED]: EXTERNAL_HANDOFF_ERROR_EN,
2645
+ [import_shared6.ERROR_CODES.HANDOFF_SOURCE_STALE]: EXTERNAL_HANDOFF_ERROR_EN,
2646
+ [import_shared6.ERROR_CODES.HANDOFF_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_EN,
2647
+ [import_shared6.ERROR_CODES.HANDOFF_EXPIRED]: EXTERNAL_HANDOFF_ERROR_EN,
2648
+ [import_shared6.ERROR_CODES.HANDOFF_CURSOR_INVALID]: EXTERNAL_HANDOFF_ERROR_EN,
2649
+ [import_shared6.ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: EXTERNAL_HANDOFF_ERROR_EN,
2650
+ [import_shared6.ERROR_CODES.BRIDGE_UNAUTHORIZED]: EXTERNAL_HANDOFF_ERROR_EN,
2651
+ [import_shared6.ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: EXTERNAL_HANDOFF_ERROR_EN,
2652
+ [import_shared6.ERROR_CODES.BRIDGE_BUSY]: EXTERNAL_HANDOFF_ERROR_EN,
2653
+ [import_shared6.ERROR_CODES.EXTERNAL_AGENT_BUSY]: EXTERNAL_HANDOFF_ERROR_EN,
2654
+ [import_shared6.ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: EXTERNAL_HANDOFF_ERROR_EN,
2655
+ [import_shared6.ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]: EXTERNAL_HANDOFF_ERROR_EN,
2656
+ [import_shared6.ERROR_CODES.ACTIVE_DISPATCH_INVALID]: EXTERNAL_HANDOFF_ERROR_EN,
2657
+ [import_shared6.ERROR_CODES.SESSION_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_EN,
2658
+ [import_shared6.ERROR_CODES.SESSION_AMBIGUOUS]: EXTERNAL_HANDOFF_ERROR_EN,
2659
+ [import_shared6.ERROR_CODES.SESSION_CLOSED]: EXTERNAL_HANDOFF_ERROR_EN,
2634
2660
  [import_shared6.ERROR_CODES.WORKTREE_DIRTY]: "Confirm inclusion of local changes before running AI.",
2635
2661
  [import_shared6.ERROR_CODES.WORKTREE_NOT_REPOSITORY]: "Vite root must be an initialized Git repository root.",
2636
2662
  [import_shared6.ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]: "Finish the active merge, rebase, cherry-pick, or revert.",
@@ -2669,6 +2695,24 @@ var ERROR_MESSAGES_ZH = Object.freeze({
2669
2695
  [import_shared6.ERROR_CODES.AGENT_BUSY]: "\u5F53\u524D\u9879\u76EE\u5DF2\u6709\u4E00\u4E2A\u5199\u5165\u4EFB\u52A1\u6B63\u5728\u8FD0\u884C\u3002",
2670
2696
  [import_shared6.ERROR_CODES.AGENT_LIMIT_EXCEEDED]: "Agent \u8FBE\u5230\u65F6\u95F4\u3001\u8F6E\u6B21\u3001\u8F93\u51FA\u6216\u53D8\u66F4\u89C4\u6A21\u9650\u5236\u3002",
2671
2697
  [import_shared6.ERROR_CODES.AGENT_CANCELLED]: "Agent \u4EFB\u52A1\u5DF2\u53D6\u6D88\u3002",
2698
+ [import_shared6.ERROR_CODES.EXTERNAL_HANDOFF_DISABLED]: EXTERNAL_HANDOFF_ERROR_ZH,
2699
+ [import_shared6.ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]: EXTERNAL_HANDOFF_ERROR_ZH,
2700
+ [import_shared6.ERROR_CODES.HANDOFF_VALIDATION_FAILED]: EXTERNAL_HANDOFF_ERROR_ZH,
2701
+ [import_shared6.ERROR_CODES.HANDOFF_SOURCE_STALE]: EXTERNAL_HANDOFF_ERROR_ZH,
2702
+ [import_shared6.ERROR_CODES.HANDOFF_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_ZH,
2703
+ [import_shared6.ERROR_CODES.HANDOFF_EXPIRED]: EXTERNAL_HANDOFF_ERROR_ZH,
2704
+ [import_shared6.ERROR_CODES.HANDOFF_CURSOR_INVALID]: EXTERNAL_HANDOFF_ERROR_ZH,
2705
+ [import_shared6.ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: EXTERNAL_HANDOFF_ERROR_ZH,
2706
+ [import_shared6.ERROR_CODES.BRIDGE_UNAUTHORIZED]: EXTERNAL_HANDOFF_ERROR_ZH,
2707
+ [import_shared6.ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: EXTERNAL_HANDOFF_ERROR_ZH,
2708
+ [import_shared6.ERROR_CODES.BRIDGE_BUSY]: EXTERNAL_HANDOFF_ERROR_ZH,
2709
+ [import_shared6.ERROR_CODES.EXTERNAL_AGENT_BUSY]: EXTERNAL_HANDOFF_ERROR_ZH,
2710
+ [import_shared6.ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: EXTERNAL_HANDOFF_ERROR_ZH,
2711
+ [import_shared6.ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]: EXTERNAL_HANDOFF_ERROR_ZH,
2712
+ [import_shared6.ERROR_CODES.ACTIVE_DISPATCH_INVALID]: EXTERNAL_HANDOFF_ERROR_ZH,
2713
+ [import_shared6.ERROR_CODES.SESSION_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_ZH,
2714
+ [import_shared6.ERROR_CODES.SESSION_AMBIGUOUS]: EXTERNAL_HANDOFF_ERROR_ZH,
2715
+ [import_shared6.ERROR_CODES.SESSION_CLOSED]: EXTERNAL_HANDOFF_ERROR_ZH,
2672
2716
  [import_shared6.ERROR_CODES.WORKTREE_DIRTY]: "\u8FD0\u884C AI \u524D\uFF0C\u8BF7\u660E\u786E\u540C\u610F\u5C06\u5F53\u524D\u672C\u5730\u4FEE\u6539\u7EB3\u5165\u9694\u79BB\u57FA\u7EBF\u3002",
2673
2717
  [import_shared6.ERROR_CODES.WORKTREE_NOT_REPOSITORY]: "Vite \u6839\u76EE\u5F55\u4E0D\u662F\u5DF2\u521D\u59CB\u5316 Git \u4ED3\u5E93\u7684\u9876\u5C42\u76EE\u5F55\u3002",
2674
2718
  [import_shared6.ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]: "\u8BF7\u5148\u5B8C\u6210\u5F53\u524D merge\u3001rebase\u3001cherry-pick \u6216 revert\uFF0C\u518D\u8FD0\u884C AI\u3002",
@@ -3093,6 +3137,15 @@ var DIALOG_FALLBACK_HEIGHT = Object.freeze({
3093
3137
  previewing: 560,
3094
3138
  selected: DIALOG_MAX_HEIGHT
3095
3139
  });
3140
+ function resolveStyleNonce(document) {
3141
+ const nonces = new Set(
3142
+ [...document.querySelectorAll("script[nonce]")].map((script) => script.nonce?.trim() ?? "").filter(Boolean)
3143
+ );
3144
+ if (nonces.size !== 1) {
3145
+ return void 0;
3146
+ }
3147
+ return nonces.values().next().value;
3148
+ }
3096
3149
  function createStyles(document) {
3097
3150
  const style = document.createElement("style");
3098
3151
  style.textContent = `
@@ -3814,7 +3867,7 @@ function createUnavailableDataFlowPanel(document, changesRoot, diagnosticsRoot)
3814
3867
  resetView: () => void 0
3815
3868
  });
3816
3869
  }
3817
- function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: false }), localePreference = "auto", dataFlowEnabled = false) {
3870
+ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: false }), localePreference = "auto", dataFlowEnabled = false, externalAgentEnabled = false, framework = "vite", sessionId = "") {
3818
3871
  const localizer = createUiLocalizer(document, localePreference);
3819
3872
  let messages = localizer.messages();
3820
3873
  const host = document.createElement("spotpatch-root");
@@ -3931,7 +3984,19 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
3931
3984
  diagnostics.append(diagnosticsLabel, summary);
3932
3985
  const agentPanel = createAgentPanel(document, ai, localizer);
3933
3986
  const changesPanel = createMarkedElement(document, "div");
3934
- changesPanel.append(targetsPanel, agentPanel.root);
3987
+ const externalHandoffPanel = externalAgentEnabled ? getExternalHandoffExtension()?.createPanel(
3988
+ document,
3989
+ framework,
3990
+ localizer.locale,
3991
+ sessionId,
3992
+ localizer.subscribe,
3993
+ placeDialog
3994
+ ) : void 0;
3995
+ changesPanel.append(
3996
+ targetsPanel,
3997
+ agentPanel.root,
3998
+ ...externalHandoffPanel === void 0 ? [] : [externalHandoffPanel.root]
3999
+ );
3935
4000
  const dataFlowPanel = getDataFlowExtension()?.createPanel(
3936
4001
  document,
3937
4002
  dataFlowEnabled,
@@ -3983,6 +4048,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
3983
4048
  agentPanel.testButton,
3984
4049
  addTargetButton,
3985
4050
  agentPanel.runButton,
4051
+ ...externalHandoffPanel === void 0 ? [] : [externalHandoffPanel.sendButton],
3986
4052
  previewButton,
3987
4053
  agentPanel.cancelButton,
3988
4054
  agentPanel.applyButton,
@@ -3998,9 +4064,19 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
3998
4064
  liveRegion.className = "spotpatch-live";
3999
4065
  liveRegion.setAttribute("aria-live", "polite");
4000
4066
  liveRegion.setAttribute("aria-atomic", "true");
4001
- shadowRoot.append(
4067
+ const styles2 = [
4002
4068
  createStyles(document),
4003
4069
  dataFlowPanel.styles,
4070
+ ...externalHandoffPanel === void 0 ? [] : [externalHandoffPanel.styles]
4071
+ ];
4072
+ const styleNonce = resolveStyleNonce(document);
4073
+ if (styleNonce !== void 0) {
4074
+ for (const style of styles2) {
4075
+ style.nonce = styleNonce;
4076
+ }
4077
+ }
4078
+ shadowRoot.append(
4079
+ ...styles2,
4004
4080
  selectionHighlights,
4005
4081
  highlight,
4006
4082
  dialog,
@@ -4282,6 +4358,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4282
4358
  openEditorButton.disabled = !canOpenEditor;
4283
4359
  previewButton.disabled = !canPreview;
4284
4360
  agentPanel.setContextReady(canPreview);
4361
+ externalHandoffPanel?.setContextReady(canPreview);
4285
4362
  updateContextOverview(summaryText);
4286
4363
  placeDialog();
4287
4364
  }
@@ -4298,6 +4375,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4298
4375
  previewButton.hidden = !selected;
4299
4376
  secondaryActions.hidden = !selected;
4300
4377
  agentPanel.setSelectionVisible(selected);
4378
+ externalHandoffPanel?.setSelectionVisible(selected);
4301
4379
  copyButton.hidden = !previewing;
4302
4380
  backButton.hidden = !previewing;
4303
4381
  title.textContent = previewing ? messages.dialog.previewTitle : messages.dialog.editTitle;
@@ -4379,6 +4457,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4379
4457
  agentApplyButton: agentPanel.applyButton,
4380
4458
  agentRevertButton: agentPanel.revertButton,
4381
4459
  agentResetButton: agentPanel.resetButton,
4460
+ ...externalHandoffPanel === void 0 ? {} : { externalHandoffPanel },
4382
4461
  renderStatus(status) {
4383
4462
  const inspecting = status === "inspecting";
4384
4463
  triggerButton.setAttribute("aria-pressed", String(inspecting));
@@ -4427,6 +4506,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4427
4506
  currentCanPreview = enabled;
4428
4507
  previewButton.disabled = !enabled;
4429
4508
  agentPanel.setContextReady(enabled);
4509
+ externalHandoffPanel?.setContextReady(enabled);
4430
4510
  },
4431
4511
  hideSelection() {
4432
4512
  dialog.hidden = true;
@@ -4451,6 +4531,8 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4451
4531
  currentCanPreview = false;
4452
4532
  agentPanel.setContextReady(false);
4453
4533
  agentPanel.setSelectionVisible(false);
4534
+ externalHandoffPanel?.setContextReady(false);
4535
+ externalHandoffPanel?.setSelectionVisible(false);
4454
4536
  agentPanel.setEditingEnabled(true);
4455
4537
  agentPanel.resetJob();
4456
4538
  dataFlowPanel.resetView();
@@ -4483,6 +4565,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4483
4565
  });
4484
4566
  openEditorButton.disabled = !currentCanOpenEditor;
4485
4567
  previewButton.disabled = !enabled || !currentCanPreview;
4568
+ externalHandoffPanel?.setContextReady(enabled && currentCanPreview);
4486
4569
  agentPanel.setEditingEnabled(enabled);
4487
4570
  placeDialog();
4488
4571
  },
@@ -4523,6 +4606,7 @@ function createRuntimeView(document, shortcut, ai = Object.freeze({ enabled: fal
4523
4606
  localeButton.removeEventListener("click", localizer.toggle);
4524
4607
  unsubscribeLocale();
4525
4608
  dataFlowPanel.dispose();
4609
+ externalHandoffPanel?.dispose();
4526
4610
  agentPanel.dispose();
4527
4611
  host.remove();
4528
4612
  }
@@ -5018,7 +5102,10 @@ function createController(config, dependencies = {}) {
5018
5102
  config.shortcut,
5019
5103
  config.ai,
5020
5104
  config.locale,
5021
- config.dataFlow.enabled
5105
+ config.dataFlow.enabled,
5106
+ config.externalAgent.enabled,
5107
+ config.framework,
5108
+ config.sessionId
5022
5109
  );
5023
5110
  const api = dependencies.api ?? createRuntimeApi({
5024
5111
  apiBase: config.apiBase,
@@ -5341,6 +5428,7 @@ ${summary}`;
5341
5428
  sessionRevision += 1;
5342
5429
  api.cancelPending();
5343
5430
  agentWorkflow.disposeSelection();
5431
+ externalHandoffWorkflow?.cancelPending();
5344
5432
  clearCollectionTimers();
5345
5433
  resizeObserver?.disconnect();
5346
5434
  targets = [];
@@ -5459,6 +5547,13 @@ ${summary}`;
5459
5547
  },
5460
5548
  view
5461
5549
  });
5550
+ const externalHandoffWorkflow = config.externalAgent.enabled && view.externalHandoffPanel !== void 0 ? getExternalHandoffExtension()?.createWorkflow(
5551
+ browser.window.fetch.bind(browser.window),
5552
+ view.externalHandoffPanel,
5553
+ selectedAnnotation,
5554
+ config.sessionToken,
5555
+ browser.window
5556
+ ) : void 0;
5462
5557
  async function loadSourceContext(target2, revision) {
5463
5558
  const marker = target2.marker;
5464
5559
  if (marker === void 0) {
@@ -5887,6 +5982,7 @@ ${summary}`;
5887
5982
  return;
5888
5983
  }
5889
5984
  mounted = true;
5985
+ externalHandoffWorkflow?.mount();
5890
5986
  view.renderStatus(state.status);
5891
5987
  browser.document.addEventListener("pointermove", handlePointerMove, true);
5892
5988
  browser.document.addEventListener("click", handleClick, true);
@@ -5953,6 +6049,7 @@ ${summary}`;
5953
6049
  api.cancelPending();
5954
6050
  api.dispose();
5955
6051
  agentWorkflow.disposeSelection();
6052
+ externalHandoffWorkflow?.dispose();
5956
6053
  sourceResolver.dispose();
5957
6054
  return;
5958
6055
  }
@@ -6016,6 +6113,7 @@ ${summary}`;
6016
6113
  api.cancelPending();
6017
6114
  api.dispose();
6018
6115
  agentWorkflow.disposeSelection();
6116
+ externalHandoffWorkflow?.dispose();
6019
6117
  sourceResolver.dispose();
6020
6118
  view.dispose();
6021
6119
  state = INITIAL_RUNTIME_STATE;