@my-life-buddies/cli 0.17.6 → 0.18.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../preview/src/controller.ts", "../../../preview/src/device-preview.ts", "../../../preview/src/runtime-diagnostics.ts", "../../../preview/src/server.ts", "../../../preview/src/mlb-simulator.ts", "../../../preview/src/mlb-events.ts", "../../../preview/src/buddy-details.ts", "../../../preview/src/bridge.ts"],
4
- "sourcesContent": ["import { readBuddyConfig, type BuddyConfig } from \"@buddy/cli-core/config\";\nimport type { PreviewBuddyDetails } from \"./buddy-details.js\";\nimport { createBuddyPreviewUrl } from \"./device-preview.js\";\nimport { RuntimeDiagnostics } from \"./runtime-diagnostics.js\";\n\nexport type PreviewDevPhase = \"idle\" | \"starting\" | \"reloading\" | \"reload_failed\" | \"ready\" | \"stopping\" | \"failed\";\n\nexport interface PreviewDevReadyInfo {\n readonly agentId?: string;\n readonly buddy?: PreviewBuddyDetails;\n readonly simulatorUrl?: string;\n readonly devicePairing?: {\n readonly url: string;\n readonly code?: string;\n readonly expiresAt?: string;\n };\n}\n\nexport interface PreviewWidgetOpenTarget {\n readonly version: 1;\n readonly entry: string;\n readonly resource?: { readonly module: string; readonly recordId: string };\n readonly state?: Readonly<Record<string, unknown>>;\n}\n\nexport interface PreviewWidget {\n readonly id: string;\n readonly type?: string;\n readonly title: string;\n readonly summary?: string;\n readonly imageMediaId?: string;\n readonly isPinned?: boolean;\n readonly creatorName?: string;\n readonly role?: \"owner\" | \"editor\" | \"viewer\";\n readonly openTarget?: PreviewWidgetOpenTarget;\n}\n\nexport interface PreviewSimulatorMessage {\n readonly widget?: PreviewWidget;\n readonly messageId: string;\n readonly role: \"user\" | \"assistant\";\n readonly text: string;\n readonly createdAt: string;\n}\n\nexport interface PreviewSimulatorState {\n /** Monotonic within this Preview controller, including resets and reconnect snapshots. */\n readonly stateRevision?: number;\n readonly conversationRevision?: number;\n readonly messages: readonly PreviewSimulatorMessage[];\n /** \u5F53\u524D\u5C1A\u672A\u5F62\u6210\u6B63\u5F0F Assistant \u6D88\u606F\u7684\u4E34\u65F6\u6D41\u5F0F\u6587\u5B57\uFF1B\u65AD\u7EBF\u540E\u4E0D\u80FD\u91CD\u653E\u3002 */\n readonly streaming?: {\n readonly runId: string;\n readonly text: string;\n readonly nextSequence: number;\n readonly updatedAt: string;\n };\n /** \u6700\u8FD1\u4E00\u6B21\u53D1\u9001\u7684\u89C2\u5BDF\u72B6\u6001\uFF1BMLB \u9002\u914D\u5668\u6839\u636E replying \u548C\u53EF\u89C1\u56DE\u590D\u63A8\u65AD\uFF0C\u4E0D\u7B49\u4E8E Runtime \u6267\u884C\u72B6\u6001\u3002 */\n readonly latestRun?: {\n readonly runId: string;\n readonly status: \"pending\" | \"running\" | \"cancel_requested\" | \"completed\" | \"failed\" | \"cancelled\";\n };\n readonly activeRun?: {\n readonly runId: string;\n readonly status: \"pending\" | \"running\" | \"cancel_requested\";\n };\n}\n\nexport type PreviewObservedRunStatus =\n | \"accepted\"\n | \"pending\"\n | \"running\"\n | \"cancel_requested\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface PreviewObservedRun {\n readonly runId: string;\n /** Stable display order within this preview service, not an MLB message sequence. */\n readonly ordinal?: number;\n readonly messageId?: string;\n readonly status: PreviewObservedRunStatus;\n readonly startedAt: string;\n readonly updatedAt: string;\n readonly completedAt?: string;\n readonly acceptLatencyMs?: number;\n readonly firstTextLatencyMs?: number;\n readonly responseTimeMs?: number;\n readonly completion?: \"reply\" | \"no_reply\";\n readonly error?: { readonly code: string; readonly message: string };\n}\n\nexport type PreviewSimulatorOutputEvent =\n | { readonly type: \"state\"; readonly runId: string; readonly state: PreviewSimulatorState; readonly resetStreaming?: boolean }\n | { readonly type: \"reset\"; readonly runId: string }\n | {\n readonly type: \"delta\";\n readonly runId: string;\n readonly sequence: number;\n readonly text: string;\n /** Exact execution identity echoed by the platform delta; not a send receipt. */\n readonly runtimeRunId?: string;\n }\n | {\n readonly type: \"completed\" | \"failed\" | \"cancelled\";\n readonly runId: string;\n readonly status: \"completed\" | \"failed\" | \"cancelled\";\n };\n\nexport interface PreviewDebugEvent {\n readonly eventId: string;\n readonly timestamp: string;\n readonly channel: \"dev\" | \"client\" | \"app_server\";\n readonly type: string;\n readonly summary: string;\n readonly runId?: string;\n readonly durationMs?: number;\n}\n\nexport interface PreviewDebugSnapshot {\n readonly source: \"observed\";\n readonly generatedAt: string;\n readonly runs: readonly PreviewObservedRun[];\n readonly events: readonly PreviewDebugEvent[];\n readonly messages: readonly PreviewSimulatorMessage[];\n readonly diagnostics: ReturnType<RuntimeDiagnostics[\"snapshot\"]>;\n}\n\nexport type PreviewDevicePairing =\n | {\n readonly status: \"ready\";\n readonly url: string;\n readonly code?: string;\n readonly expiresAt?: string;\n }\n | {\n readonly status: \"unavailable\";\n readonly reason: string;\n };\n\nexport interface PreviewSimulatorClient {\n widgets?(): Promise<readonly PreviewWidget[]>;\n widgetHtml?(id: string, openTarget?: PreviewWidgetOpenTarget): Promise<string>;\n pinWidget?(id: string, pinned: boolean): Promise<void>;\n deleteWidget?(id: string): Promise<void>;\n widgetImage?(id: string, mediaId: string): Promise<{ body: Uint8Array; contentType: string }>;\n state(options?: { readonly signal?: AbortSignal }): Promise<PreviewSimulatorState>;\n send(\n input: { readonly text: string; readonly idempotencyKey: string },\n options?: { readonly signal?: AbortSignal },\n ): Promise<{ readonly messageId: string; readonly runId: string }>;\n cancel(\n runId: string,\n options?: { readonly signal?: AbortSignal },\n ): Promise<{ readonly runId: string; readonly status: \"cancel_requested\" | \"already_terminal\" }>;\n /** Start an isolated conversation for the same development Buddy, with fresh context. */\n reset?(options?: { readonly signal?: AbortSignal }): Promise<void>;\n /** Watches live output; reset discards ephemeral deltas before restoring authoritative state. */\n watchOutput?(\n runId: string,\n options: {\n readonly signal?: AbortSignal;\n readonly onEvent: (event: PreviewSimulatorOutputEvent) => void | Promise<void>;\n },\n ): Promise<void>;\n}\n\nexport interface PreviewDevHandle {\n readonly closed: Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface PreviewDevStarter {\n start(options: {\n readonly projectRoot: string;\n readonly signal: AbortSignal;\n readonly onLifecycle?: (event: { readonly phase: \"reloading\" | \"reload_failed\" | \"ready\"; readonly error?: { readonly code: string; readonly message: string } }) => void;\n readonly onLog?: (event: { readonly source: \"agent.stdout\" | \"agent.stderr\"; readonly text: string }) => void;\n }): Promise<{\n readonly handle: PreviewDevHandle;\n readonly ready: PreviewDevReadyInfo;\n readonly simulator?: PreviewSimulatorClient;\n }>;\n}\n\nexport interface PreviewDevState {\n readonly phase: PreviewDevPhase;\n readonly revision: number;\n readonly ready?: PreviewDevReadyInfo;\n readonly error?: { readonly code: string; readonly message: string };\n}\n\nexport interface PreviewControllerOptions {\n readonly projectRoot: string;\n readonly devStarter: PreviewDevStarter;\n readonly readConfig?: (projectRoot: string) => Promise<BuddyConfig>;\n /** Read-only profile lookup; opening Preview does not start DEV or create a conversation. */\n readonly readBuddyDetails?: (buddyId: string) => Promise<PreviewBuddyDetails>;\n readonly now?: () => Date;\n}\n\ntype StateListener = (state: PreviewDevState) => void;\ntype SimulatorListener = (value: {\n readonly state: PreviewSimulatorState;\n readonly debug: PreviewDebugSnapshot;\n}) => void;\n\nconst TERMINAL_RUN_STATUSES = new Set<PreviewObservedRunStatus>([\"completed\", \"failed\", \"cancelled\"]);\n\nfunction publicFailure(cause: unknown): { code: string; message: string } {\n const publicMessage = (\n typeof cause === \"object\"\n && cause !== null\n && \"publicMessage\" in cause\n && typeof cause.publicMessage === \"string\"\n && cause.publicMessage.trim()\n && cause.publicMessage.length <= 512\n && !/[\\u0000-\\u001f\\u007f]/u.test(cause.publicMessage)\n ) ? cause.publicMessage : undefined;\n if (\n typeof cause === \"object\"\n && cause !== null\n && \"code\" in cause\n && typeof cause.code === \"string\"\n && cause.code.trim()\n ) {\n return { code: cause.code, message: publicMessage ?? \"DEV \u4F1A\u8BDD\u672A\u80FD\u5B8C\u6210\" };\n }\n return { code: \"DEV_START_FAILED\", message: \"DEV \u4F1A\u8BDD\u542F\u52A8\u5931\u8D25\" };\n}\n\nexport class PreviewController {\n readonly #projectRoot: string;\n readonly #devStarter: PreviewDevStarter;\n readonly #readConfig: (projectRoot: string) => Promise<BuddyConfig>;\n readonly #readBuddyDetails: PreviewControllerOptions[\"readBuddyDetails\"];\n readonly #now: () => Date;\n readonly #listeners = new Set<StateListener>();\n readonly #simulatorListeners = new Set<SimulatorListener>();\n readonly #runs = new Map<string, PreviewObservedRun>();\n readonly #outputWatchers = new Map<string, AbortController>();\n readonly #failedOutputRuns = new Set<string>();\n readonly #observedActiveRuns = new Set<string>();\n readonly #events: PreviewDebugEvent[] = [];\n readonly #diagnostics = new RuntimeDiagnostics();\n #runOrdinal = 0;\n #conversationRevision = 0;\n #simulatorRevision = 0;\n #resetting = false;\n #sendingMessage = false;\n\n get resetting(): boolean { return this.#resetting; }\n #state: PreviewDevState = Object.freeze({ phase: \"idle\", revision: 0 });\n #handle: PreviewDevHandle | undefined;\n #simulator: PreviewSimulatorClient | undefined;\n #startController: AbortController | undefined;\n #startPromise: Promise<PreviewDevState> | undefined;\n #stopPromise: Promise<PreviewDevState> | undefined;\n #messages: readonly PreviewSimulatorMessage[] = [];\n #simulatorState: PreviewSimulatorState = Object.freeze({ messages: Object.freeze([]) });\n #lastActiveRunId: string | undefined;\n #eventSequence = 0;\n\n constructor(options: PreviewControllerOptions) {\n this.#projectRoot = options.projectRoot;\n this.#devStarter = options.devStarter;\n this.#readConfig = options.readConfig ?? ((root) => readBuddyConfig(root));\n this.#readBuddyDetails = options.readBuddyDetails;\n this.#now = options.now ?? (() => new Date());\n }\n\n get projectRoot(): string {\n return this.#projectRoot;\n }\n\n state(): PreviewDevState {\n return this.#state;\n }\n\n async project(): Promise<BuddyConfig> {\n return this.#readConfig(this.#projectRoot);\n }\n\n async buddyDetails(): Promise<PreviewBuddyDetails | null> {\n if (!this.#readBuddyDetails) return this.#state.ready?.buddy ?? null;\n const config = await this.project();\n return this.#readBuddyDetails(config.buddyId);\n }\n\n subscribe(listener: StateListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n subscribeSimulator(listener: SimulatorListener): () => void {\n this.#simulatorListeners.add(listener);\n return () => this.#simulatorListeners.delete(listener);\n }\n\n simulatorSnapshot(): PreviewSimulatorState {\n return Object.freeze({ ...this.#simulatorState, conversationRevision: this.#conversationRevision, stateRevision: this.#simulatorRevision });\n }\n\n start(): Promise<PreviewDevState> {\n if (this.#startPromise) return this.#startPromise;\n if (this.#handle) return Promise.resolve(this.#state);\n if (this.#state.phase === \"stopping\") {\n return Promise.reject(Object.assign(new Error(\"DEV \u4F1A\u8BDD\u6B63\u5728\u505C\u6B62\"), { code: \"DEV_STOPPING\" }));\n }\n\n const controller = new AbortController();\n this.#diagnostics.boundary();\n this.#startController = controller;\n this.#record({ channel: \"dev\", type: \"dev.start_requested\", summary: \"\u8BF7\u6C42\u542F\u52A8 DEV \u4F1A\u8BDD\" });\n this.#setState({ phase: \"starting\" });\n const startPromise = this.#devStarter\n .start({\n projectRoot: this.#projectRoot,\n signal: controller.signal,\n onLifecycle: ({ phase, error }) => {\n if (controller.signal.aborted || !this.#handle || this.#state.phase === \"stopping\") return;\n if (phase === \"reloading\") this.#stopOutputWatchers();\n this.#record({ channel: \"dev\", type: `dev.${phase}`, summary: phase === \"reloading\" ? \"\u672C\u5730\u6587\u4EF6\u5DF2\u4FEE\u6539\uFF0C\u6B63\u5728\u91CD\u8F7D\uFF1B\u5F53\u524D\u56DE\u590D\u53EF\u80FD\u4E2D\u65AD\" : phase === \"reload_failed\" ? error?.message ?? \"\u91CD\u8F7D\u5931\u8D25\uFF0C\u4FEE\u6B63\u6587\u4EF6\u540E\u81EA\u52A8\u91CD\u8BD5\" : \"\u91CD\u8F7D\u5B8C\u6210\uFF0CDEV \u5DF2\u5C31\u7EEA\" });\n this.#setState({ phase, ready: this.#state.ready, ...(error ? { error } : {}) });\n },\n onLog: ({ source, text }) => {\n if (controller.signal.aborted) return;\n this.#diagnostics.write(source, text, this.#now().toISOString());\n // Legacy events keep a small summary; complete records live in diagnostics.\n this.#record({ channel: \"dev\", type: source, summary: text.slice(0, 512) });\n this.#notifySimulator();\n },\n })\n .then(({ handle, ready, simulator }) => {\n if (controller.signal.aborted) {\n return handle.close().then(() => this.#setState({ phase: \"idle\" }));\n }\n this.#handle = handle;\n this.#simulator = simulator;\n this.#record({\n channel: \"dev\",\n type: \"dev.ready\",\n summary: ready.agentId ? `Agent ${ready.agentId} \u5DF2\u5C31\u7EEA` : \"Agent \u5DF2\u5C31\u7EEA\",\n });\n void handle.closed.then(\n () => {\n if (this.#handle === handle) {\n this.#handle = undefined;\n this.#simulator = undefined;\n this.#stopOutputWatchers();\n this.#record({ channel: \"dev\", type: \"dev.closed\", summary: \"DEV \u4F1A\u8BDD\u5DF2\u7ED3\u675F\" });\n this.#setState({ phase: \"idle\" });\n }\n },\n (cause: unknown) => {\n if (this.#handle === handle) {\n this.#handle = undefined;\n this.#simulator = undefined;\n this.#stopOutputWatchers();\n this.#record({ channel: \"dev\", type: \"dev.failed\", summary: \"DEV \u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F\" });\n this.#setState({ phase: \"failed\", error: publicFailure(cause) });\n }\n },\n );\n return this.#setState({ phase: \"ready\", ready });\n })\n .catch((cause: unknown) => {\n if (controller.signal.aborted) return this.#setState({ phase: \"idle\" });\n this.#record({ channel: \"dev\", type: \"dev.start_failed\", summary: \"DEV \u4F1A\u8BDD\u542F\u52A8\u5931\u8D25\" });\n return this.#setState({ phase: \"failed\", error: publicFailure(cause) });\n })\n .finally(() => {\n if (this.#startController === controller) this.#startController = undefined;\n if (this.#startPromise === startPromise) this.#startPromise = undefined;\n });\n this.#startPromise = startPromise;\n return startPromise;\n }\n\n stop(): Promise<PreviewDevState> {\n if (this.#stopPromise) return this.#stopPromise;\n const stopping = this.#stop();\n this.#stopPromise = stopping;\n const clear = () => { if (this.#stopPromise === stopping) this.#stopPromise = undefined; };\n void stopping.then(clear, clear);\n return stopping;\n }\n\n async #stop(): Promise<PreviewDevState> {\n if (this.#state.phase === \"idle\") return this.#state;\n if (this.#state.phase === \"stopping\") return this.#state;\n\n this.#setState({ phase: \"stopping\" });\n this.#record({ channel: \"dev\", type: \"dev.stop_requested\", summary: \"\u8BF7\u6C42\u505C\u6B62 DEV \u4F1A\u8BDD\" });\n this.#startController?.abort(new Error(\"Preview requested DEV stop\"));\n const handle = this.#handle;\n this.#handle = undefined;\n this.#simulator = undefined;\n this.#stopOutputWatchers();\n try {\n if (handle) await handle.close();\n if (this.#startPromise) await this.#startPromise.catch(() => undefined);\n this.#record({ channel: \"dev\", type: \"dev.stopped\", summary: \"DEV \u4F1A\u8BDD\u5DF2\u505C\u6B62\" });\n return this.#setState({ phase: \"idle\" });\n } catch (cause) {\n this.#setState({ phase: \"failed\", error: publicFailure(cause) });\n throw cause;\n }\n }\n\n async close(): Promise<void> {\n await this.stop();\n this.#listeners.clear();\n this.#simulatorListeners.clear();\n }\n\n async simulatorState(signal?: AbortSignal): Promise<PreviewSimulatorState> {\n if (this.#resetting) return this.simulatorSnapshot();\n const simulator = this.#requiredSimulator();\n const revision = this.#conversationRevision;\n const state = await simulator.state({ signal });\n if (!this.#resetting && revision === this.#conversationRevision && simulator === this.#simulator) {\n this.#observeSimulatorState(state);\n }\n return this.simulatorSnapshot();\n }\n\n /** Never allow an old conversation's delayed widget response to enter the new one. */\n async simulatorWidgets(action: \"list\" | \"html\" | \"pin\" | \"unpin\" | \"image\" | \"delete\", id = \"\", mediaId = \"\", messageId?: string): Promise<unknown> {\n if (this.#resetting) throw Object.assign(new Error(\"\u4F1A\u8BDD\u6B63\u5728\u91CD\u7F6E\"), { status: 409 });\n const client = this.#requiredSimulator();\n const revision = this.#conversationRevision;\n let result: unknown;\n if (action === \"list\" && client.widgets) result = { widgets: await client.widgets(), conversationRevision: revision, capabilities: { documentLifecycle: true, deleteWidget: Boolean(client.deleteWidget) } };\n else if (action === \"html\" && client.widgetHtml) {\n // Keep targets attached to messages, not Widget IDs. Re-read this conversation\n // so the iframe URL contains only a message ID, never arbitrary H5 state or URLs.\n let target: PreviewWidgetOpenTarget | undefined;\n if (messageId !== undefined) {\n const state = await client.state();\n const message = state.messages.find(item => item.messageId === messageId && item.widget?.id === id);\n if (!message?.widget) throw Object.assign(new Error(\"\u8FD9\u6761\u5C0F\u6302\u4EF6\u6D88\u606F\u5DF2\u4E0D\u53EF\u7528\uFF0C\u8BF7\u5237\u65B0\u5BF9\u8BDD\u540E\u91CD\u8BD5\"), { status: 404 });\n target = message.widget.openTarget;\n }\n if (this.#resetting || revision !== this.#conversationRevision || client !== this.#simulator) throw Object.assign(new Error(\"\u4F1A\u8BDD\u5DF2\u5207\u6362\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u5C0F\u6302\u4EF6\"), { status: 409 });\n result = await client.widgetHtml(id, target);\n }\n else if (action === \"delete\" && client.deleteWidget) { await client.deleteWidget(id); result = { ok: true }; }\n else if (action === \"image\" && client.widgetImage) result = await client.widgetImage(id, mediaId);\n else if ((action === \"pin\" || action === \"unpin\") && client.pinWidget) { await client.pinWidget(id, action === \"pin\"); result = { ok: true }; }\n else throw Object.assign(new Error(\"\u5F53\u524D\u6A21\u62DF\u5668\u4E0D\u652F\u6301\u5C0F\u6302\u4EF6\"), { status: 501 });\n if (this.#resetting || revision !== this.#conversationRevision || client !== this.#simulator) throw Object.assign(new Error(\"\u4F1A\u8BDD\u5DF2\u5207\u6362\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u5C0F\u6302\u4EF6\"), { status: 409 });\n return result;\n }\n\n async resetSimulator(): Promise<PreviewSimulatorState> {\n if (this.#resetting || this.#sendingMessage || this.#simulatorState.activeRun) {\n throw Object.assign(new Error(\"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u6216\u64CD\u4F5C\u5B8C\u6210\u540E\u518D\u6E05\u7A7A\"), { status: 409, code: \"SIMULATOR_BUSY\" });\n }\n const simulator = this.#requiredSimulator();\n if (!simulator.reset) {\n throw Object.assign(new Error(\"\u5F53\u524D\u5E73\u53F0\u6682\u4E0D\u652F\u6301\u6E05\u7A7A\u5BF9\u8BDD\"), { status: 501, code: \"RESET_UNSUPPORTED\", publicMessage: \"\u5F53\u524D\u5E73\u53F0\u6682\u4E0D\u652F\u6301\u6E05\u7A7A\u5BF9\u8BDD\" });\n }\n this.#resetting = true;\n try {\n await simulator.reset();\n this.#conversationRevision++;\n this.#stopOutputWatchers();\n this.#runs.clear();\n this.#observedActiveRuns.clear();\n this.#events.length = 0;\n this.#diagnostics.clear();\n this.#runOrdinal = 0;\n this.#lastActiveRunId = undefined;\n this.#messages = Object.freeze([]);\n this.#simulatorState = Object.freeze({ messages: this.#messages });\n this.#notifySimulator();\n // The new conversation identity isolates Runtime context; keep DEV online\n // so the welcome event for this conversation can finish normally.\n return this.simulatorSnapshot();\n } finally {\n this.#resetting = false;\n }\n }\n\n async sendSimulatorMessage(\n input: { readonly text: string; readonly idempotencyKey: string },\n signal?: AbortSignal,\n ): Promise<{ readonly messageId: string; readonly runId: string }> {\n if (this.#resetting || this.#sendingMessage) throw Object.assign(new Error(\"\u6A21\u62DF\u5668\u6B63\u5728\u5904\u7406\u5176\u4ED6\u64CD\u4F5C\"), { status: 409, code: \"SIMULATOR_BUSY\" });\n this.#sendingMessage = true;\n try {\n const started = this.#now();\n this.#record({ channel: \"client\", type: \"message.send\", summary: \"\u53D1\u9001\u4E00\u6761\u79C1\u804A\u6D88\u606F\" });\n const accepted = await this.#requiredSimulator().send(input, { signal });\n if (this.#runs.has(accepted.runId)) {\n // A new send can join the current conversation-level observation window.\n // Keep its stream, timing origin and subscription; retries add no duplicate.\n if (this.#simulatorState.activeRun?.runId === accepted.runId\n && !this.#simulatorState.messages.some(message => message.messageId === accepted.messageId)) {\n this.#record({ channel: \"app_server\", type: \"message.accepted\", summary: \"\u8FFD\u52A0\u6D88\u606F\u5DF2\u63A5\u6536\",\n runId: accepted.runId, durationMs: Math.max(0, this.#now().getTime() - started.getTime()) });\n this.#simulatorState = Object.freeze({ ...this.#simulatorState,\n messages: Object.freeze([...this.#simulatorState.messages, Object.freeze({\n messageId: accepted.messageId, role: \"user\" as const, text: input.text, createdAt: this.#now().toISOString(),\n })]),\n });\n this.#messages = this.#simulatorState.messages;\n this.#notifySimulator();\n }\n return accepted;\n }\n const acceptedAt = this.#now();\n const latency = Math.max(0, acceptedAt.getTime() - started.getTime());\n this.#upsertRun({\n runId: accepted.runId,\n messageId: accepted.messageId,\n status: \"accepted\",\n startedAt: started.toISOString(),\n updatedAt: acceptedAt.toISOString(),\n acceptLatencyMs: latency,\n });\n this.#lastActiveRunId = accepted.runId;\n this.#record({\n channel: \"app_server\",\n type: \"run.accepted\",\n summary: \"App Server \u5DF2\u63A5\u53D7\u6D88\u606F\uFF0C\u5DF2\u8BB0\u5F55\u53D1\u9001\u56DE\u6267\",\n runId: accepted.runId,\n durationMs: latency,\n });\n this.#simulatorState = Object.freeze({\n messages: Object.freeze([\n ...this.#simulatorState.messages.filter((message) => message.messageId !== accepted.messageId),\n Object.freeze({\n messageId: accepted.messageId,\n role: \"user\" as const,\n text: input.text,\n createdAt: acceptedAt.toISOString(),\n }),\n ]),\n latestRun: Object.freeze({ runId: accepted.runId, status: \"pending\" as const }),\n activeRun: Object.freeze({ runId: accepted.runId, status: \"pending\" as const }),\n });\n this.#messages = this.#simulatorState.messages;\n this.#notifySimulator();\n this.#startOutputWatcher(this.#requiredSimulator(), accepted.runId);\n return accepted;\n } finally { this.#sendingMessage = false; }\n }\n\n async cancelSimulatorRun(\n runId: string,\n signal?: AbortSignal,\n ): Promise<{ readonly runId: string; readonly status: \"cancel_requested\" | \"already_terminal\" }> {\n this.#record({\n channel: \"client\",\n type: \"run.cancel_requested\", // Local debug event, not an MLB SSE event.\n summary: \"\u5F00\u53D1\u8005\u8BF7\u6C42\u505C\u6B62\u5F53\u524D\u56DE\u590D\",\n runId,\n });\n const result = await this.#requiredSimulator().cancel(runId, { signal });\n if (result.status === \"cancel_requested\") {\n this.#updateRunStatus(runId, \"cancel_requested\");\n if (this.#simulatorState.activeRun?.runId === runId) {\n this.#simulatorState = Object.freeze({\n messages: this.#simulatorState.messages,\n latestRun: Object.freeze({ runId, status: \"cancel_requested\" as const }),\n activeRun: Object.freeze({ runId, status: \"cancel_requested\" as const }),\n ...(this.#simulatorState.streaming?.runId === runId\n ? { streaming: this.#simulatorState.streaming }\n : {}),\n });\n }\n }\n this.#record({\n channel: \"app_server\",\n type: `run.${result.status}`,\n summary: result.status === \"cancel_requested\" ? \"App Server \u5DF2\u63A5\u53D7\u505C\u6B62\u8BF7\u6C42\" : \"Run \u5DF2\u7ECF\u7ED3\u675F\",\n runId,\n });\n if (result.status === \"already_terminal\") {\n // The terminal transition can win the race with the stop click. Read the\n // authoritative state now so the UI never changes a completed Run back\n // to `cancel_requested` while waiting for the next poll.\n await this.simulatorState(signal).catch(() => this.#notifySimulator());\n } else {\n this.#notifySimulator();\n }\n return result;\n }\n\n debugSnapshot(): PreviewDebugSnapshot {\n return Object.freeze({\n source: \"observed\",\n generatedAt: this.#now().toISOString(),\n runs: Object.freeze([...this.#runs.values()].reverse()),\n events: Object.freeze([...this.#events].reverse()),\n messages: Object.freeze([...this.#messages]),\n diagnostics: this.#diagnostics.snapshot(),\n });\n }\n\n devicePairing(): PreviewDevicePairing {\n const pairing = this.#state.phase === \"ready\" ? this.#state.ready?.devicePairing : undefined;\n if (pairing) {\n try {\n if (\n pairing.url === createBuddyPreviewUrl(this.#state.ready?.agentId ?? \"\")\n && pairing.url.length <= 2_048\n && (pairing.code === undefined || /^[A-Z0-9-]{4,32}$/iu.test(pairing.code))\n && (pairing.expiresAt === undefined || Number.isFinite(Date.parse(pairing.expiresAt)))\n ) {\n return Object.freeze({\n status: \"ready\" as const,\n url: pairing.url,\n ...(pairing.code === undefined ? {} : { code: pairing.code }),\n ...(pairing.expiresAt === undefined ? {} : { expiresAt: pairing.expiresAt }),\n });\n }\n } catch {\n // Invalid starter output is treated as unavailable instead of reaching the browser.\n }\n }\n return Object.freeze({\n status: \"unavailable\" as const,\n reason: this.#state.phase !== \"ready\"\n ? \"\u8BF7\u5148\u542F\u52A8 DEV \u4F1A\u8BDD\"\n : pairing\n ? \"\u5F53\u524D DEV \u73AF\u5883\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u771F\u673A\u5165\u53E3\"\n : \"\u5F53\u524D DEV \u4F1A\u8BDD\u5C1A\u672A\u63D0\u4F9B\u642D\u642D App \u9884\u89C8\u94FE\u63A5\",\n });\n }\n\n #requiredSimulator(): PreviewSimulatorClient {\n if (this.#state.phase !== \"ready\" || !this.#simulator) {\n throw Object.assign(new Error(\"\u6A21\u62DF\u5668\u9700\u8981\u5148\u542F\u52A8 DEV \u4F1A\u8BDD\"), {\n code: \"SIMULATOR_NOT_READY\",\n status: 409,\n publicMessage: \"\u8BF7\u5148\u542F\u52A8 DEV \u4F1A\u8BDD\",\n });\n }\n return this.#simulator;\n }\n\n #observeSimulatorState(state: PreviewSimulatorState): PreviewSimulatorState {\n const previousStreaming = this.#simulatorState.streaming;\n const incomingActiveRun = state.activeRun;\n const existingActiveRun = incomingActiveRun ? this.#runs.get(incomingActiveRun.runId) : undefined;\n if (existingActiveRun && TERMINAL_RUN_STATUSES.has(existingActiveRun.status)) {\n // A state GET may have started before the terminal event and arrive after\n // it. A stale non-terminal snapshot must not resurrect a finished Run or\n // put its already-final reply back into the temporary partial bubble.\n this.#notifySimulator();\n return this.#simulatorState;\n }\n let streaming = state.streaming\n ?? (incomingActiveRun?.runId === previousStreaming?.runId ? previousStreaming : undefined);\n if (streaming && previousStreaming?.runId === streaming.runId) {\n if (streaming.nextSequence < previousStreaming.nextSequence) {\n streaming = previousStreaming;\n } else if (\n streaming.nextSequence === previousStreaming.nextSequence\n && streaming.text !== previousStreaming.text\n ) {\n throw Object.assign(new Error(\"App Server \u6539\u5199\u4E86\u5DF2\u89C2\u5BDF\u5230\u7684\u6D41\u5F0F\u6587\u5B57\"), {\n code: \"OUTPUT_STREAM_PROTOCOL_ERROR\",\n publicMessage: \"App Server \u8FD4\u56DE\u4E86\u4E0D\u4E00\u81F4\u7684\u6D41\u5F0F\u72B6\u6001\",\n });\n } else if (\n streaming.nextSequence > previousStreaming.nextSequence\n && !streaming.text.startsWith(previousStreaming.text)\n ) {\n throw Object.assign(new Error(\"App Server \u6539\u5199\u4E86\u5DF2\u89C2\u5BDF\u5230\u7684\u6D41\u5F0F\u6587\u5B57\"), {\n code: \"OUTPUT_STREAM_PROTOCOL_ERROR\",\n publicMessage: \"App Server \u8FD4\u56DE\u4E86\u4E0D\u4E00\u81F4\u7684\u6D41\u5F0F\u72B6\u6001\",\n });\n }\n }\n this.#simulatorState = Object.freeze({\n messages: Object.freeze([...state.messages]),\n ...(state.latestRun === undefined ? {} : { latestRun: Object.freeze({ ...state.latestRun }) }),\n ...(state.activeRun === undefined ? {} : { activeRun: Object.freeze({ ...state.activeRun }) }),\n ...(streaming === undefined ? {} : { streaming: Object.freeze({ ...streaming }) }),\n });\n this.#messages = this.#simulatorState.messages;\n const now = this.#now();\n const active = this.#simulatorState.activeRun;\n if (active) {\n this.#observedActiveRuns.add(active.runId);\n const existing = this.#runs.get(active.runId);\n const restoredFirstTextLatency = existing?.firstTextLatencyMs\n ?? (this.#simulatorState.streaming?.runId === active.runId\n && this.#simulatorState.streaming.nextSequence > 0\n && this.#simulatorState.streaming.text.length > 0\n ? Math.max(0, now.getTime() - Date.parse(existing?.startedAt ?? now.toISOString()))\n : undefined);\n this.#upsertRun({\n runId: active.runId,\n ...(existing?.messageId ? { messageId: existing.messageId } : {}),\n status: active.status,\n startedAt: existing?.startedAt ?? now.toISOString(),\n updatedAt: now.toISOString(),\n ...(existing?.acceptLatencyMs === undefined ? {} : { acceptLatencyMs: existing.acceptLatencyMs }),\n ...(restoredFirstTextLatency === undefined ? {} : { firstTextLatencyMs: restoredFirstTextLatency }),\n });\n if (existing?.firstTextLatencyMs === undefined && restoredFirstTextLatency !== undefined) {\n this.#record({\n channel: \"app_server\",\n type: \"run.output.restored\",\n summary: \"\u4ECE App Server \u72B6\u6001\u6062\u590D\u5F53\u524D\u6D41\u5F0F\u6587\u5B57\",\n runId: active.runId,\n durationMs: restoredFirstTextLatency,\n });\n }\n if (this.#lastActiveRunId !== active.runId || existing?.status !== active.status) {\n this.#record({\n channel: \"app_server\",\n type: `run.${active.status}`,\n summary: active.status === \"pending\" ? \"Run \u6B63\u5728\u7B49\u5F85 Agent\" : \"Agent \u6B63\u5728\u5904\u7406 Run\",\n runId: active.runId,\n });\n }\n this.#lastActiveRunId = active.runId;\n if (this.#simulator) this.#startOutputWatcher(this.#simulator, active.runId);\n this.#notifySimulator();\n return this.#simulatorState;\n }\n\n if (!this.#lastActiveRunId) {\n this.#notifySimulator();\n return this.#simulatorState;\n }\n const runId = this.#lastActiveRunId;\n const existing = this.#runs.get(runId);\n if (existing && ![\"completed\", \"failed\", \"cancelled\"].includes(existing.status)) {\n const assistant = [...this.#simulatorState.messages]\n .reverse()\n .find((message) => message.role === \"assistant\" && Date.parse(message.createdAt) >= Date.parse(existing.startedAt));\n const elapsed = Math.max(0, now.getTime() - Date.parse(existing.startedAt));\n const terminalStatus = this.#simulatorState.latestRun?.runId === runId\n && (this.#simulatorState.latestRun.status === \"completed\" || this.#simulatorState.latestRun.status === \"failed\" || this.#simulatorState.latestRun.status === \"cancelled\")\n ? this.#simulatorState.latestRun.status\n : undefined;\n if (!assistant && !terminalStatus && !this.#observedActiveRuns.has(runId) && elapsed < 5_000) {\n this.#notifySimulator();\n return this.#simulatorState;\n }\n const completedAt = assistant && Number.isFinite(Date.parse(assistant.createdAt))\n ? new Date(assistant.createdAt)\n : now;\n const status = terminalStatus ?? \"completed\";\n this.#upsertRun({\n ...existing,\n status,\n updatedAt: now.toISOString(),\n completedAt: completedAt.toISOString(),\n responseTimeMs: Math.max(0, completedAt.getTime() - Date.parse(existing.startedAt)),\n completion: assistant ? \"reply\" : \"no_reply\",\n });\n this.#record({\n channel: \"app_server\",\n type: `run.${status}`,\n summary: assistant\n ? \"\u5B8C\u6574\u56DE\u590D\u5DF2\u8FD4\u56DE\uFF0C\u672C\u5730\u56DE\u5408\u7ED3\u675F\"\n : status === \"failed\"\n ? \"Agent \u672C\u5730\u56DE\u5408\u6267\u884C\u5931\u8D25\uFF0C\u672A\u4EA7\u751F\u7528\u6237\u56DE\u590D\"\n : status === \"cancelled\"\n ? \"Agent \u672C\u5730\u56DE\u5408\u5DF2\u53D6\u6D88\uFF0C\u672A\u5B8C\u6210\u56DE\u590D\u5DF2\u4F5C\u5E9F\"\n : \"\u672C\u5730\u56DE\u5408\u5DF2\u7ED3\u675F\uFF0C\u672A\u89C2\u5BDF\u5230\u65B0\u7684\u5B8C\u6574\u56DE\u590D\",\n runId,\n durationMs: Math.max(0, completedAt.getTime() - Date.parse(existing.startedAt)),\n });\n this.#stopOutputWatcher(runId);\n }\n this.#observedActiveRuns.delete(runId);\n this.#lastActiveRunId = undefined;\n this.#notifySimulator();\n return this.#simulatorState;\n }\n\n #startOutputWatcher(simulator: PreviewSimulatorClient, runId: string): void {\n if (!simulator.watchOutput || this.#outputWatchers.has(runId) || this.#failedOutputRuns.has(runId)) return;\n const controller = new AbortController();\n this.#outputWatchers.set(runId, controller);\n void simulator.watchOutput(runId, {\n signal: controller.signal,\n onEvent: (event) => {\n if (controller.signal.aborted || this.#resetting || simulator !== this.#simulator) return;\n return this.#observeOutputEvent(event);\n },\n }).catch((cause: unknown) => {\n if (controller.signal.aborted) return;\n this.#failedOutputRuns.add(runId);\n this.#record({\n channel: \"app_server\",\n type: \"run.output.disconnected\",\n summary: cause && typeof cause === \"object\" && \"status\" in cause && cause.status === 401\n ? \"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\"\n : \"\u6D41\u5F0F\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6A21\u62DF\u5668\u5C06\u4F7F\u7528 App Server \u72B6\u6001\u6062\u590D\",\n runId,\n });\n this.#notifySimulator();\n void this.simulatorState().catch(() => undefined);\n }).finally(() => {\n if (this.#outputWatchers.get(runId) === controller) this.#outputWatchers.delete(runId);\n });\n }\n\n async #observeOutputEvent(event: PreviewSimulatorOutputEvent): Promise<void> {\n if (event.type === \"state\") {\n if (event.resetStreaming) {\n const { streaming: _streaming, ...state } = this.#simulatorState;\n this.#simulatorState = Object.freeze(state);\n }\n this.#observeSimulatorState(event.state);\n return;\n }\n if (event.type === \"reset\") {\n if (this.#simulatorState.streaming?.runId === event.runId) {\n const { streaming: _streaming, ...state } = this.#simulatorState;\n this.#simulatorState = Object.freeze(state);\n this.#notifySimulator();\n }\n return;\n }\n const now = this.#now();\n const existing = this.#runs.get(event.runId);\n if (event.type === \"delta\") {\n if (\n (existing && TERMINAL_RUN_STATUSES.has(existing.status))\n || (\n this.#simulatorState.latestRun?.runId === event.runId\n && TERMINAL_RUN_STATUSES.has(this.#simulatorState.latestRun.status)\n )\n ) {\n return;\n }\n const previous = this.#simulatorState.streaming;\n const expected = previous?.runId === event.runId ? previous.nextSequence : 0;\n // A concurrent state poll may already include these live chunks.\n // Ignore duplicate local sequences within a connection; reset starts a new sequence.\n if (event.sequence < expected) return;\n if (event.sequence > expected) {\n throw Object.assign(new Error(\"App Server \u8FD4\u56DE\u7684\u6D41\u5F0F\u5E8F\u53F7\u4E0D\u8FDE\u7EED\"), { code: \"OUTPUT_SEQUENCE_MISMATCH\" });\n }\n const text = `${previous?.runId === event.runId ? previous.text : \"\"}${event.text}`;\n const firstTextLatencyMs = existing?.firstTextLatencyMs\n ?? (existing ? Math.max(0, now.getTime() - Date.parse(existing.startedAt)) : undefined);\n if (existing) {\n this.#upsertRun({\n ...existing,\n status: \"running\",\n updatedAt: now.toISOString(),\n ...(firstTextLatencyMs === undefined ? {} : { firstTextLatencyMs }),\n });\n }\n this.#simulatorState = Object.freeze({\n messages: this.#simulatorState.messages,\n latestRun: Object.freeze({ runId: event.runId, status: \"running\" as const }),\n activeRun: Object.freeze({ runId: event.runId, status: \"running\" as const }),\n streaming: Object.freeze({\n runId: event.runId,\n text,\n nextSequence: event.sequence + 1,\n updatedAt: now.toISOString(),\n }),\n });\n this.#record({\n channel: \"app_server\",\n type: event.sequence === 0 ? \"run.output.started\" : \"run.output.delta\",\n summary: event.sequence === 0 ? \"\u9996\u6BB5\u6D41\u5F0F\u6587\u5B57\u5DF2\u5230\u8FBE\" : `\u6536\u5230\u7B2C ${event.sequence + 1} \u6BB5\u6D41\u5F0F\u6587\u5B57`,\n runId: event.runId,\n ...(firstTextLatencyMs === undefined || event.sequence !== 0 ? {} : { durationMs: firstTextLatencyMs }),\n });\n this.#notifySimulator();\n return;\n }\n\n this.#record({\n channel: \"app_server\",\n type: `run.output.${event.type}`,\n summary: event.type === \"completed\"\n ? \"\u6D41\u5F0F\u8F93\u51FA\u5B8C\u6210\uFF0C\u6B63\u5728\u786E\u8BA4\u6B63\u5F0F\u56DE\u590D\"\n : event.type === \"failed\"\n ? \"\u672C\u5730\u56DE\u5408\u5931\u8D25\uFF0C\u4E34\u65F6\u6D41\u5F0F\u6587\u5B57\u5DF2\u4F5C\u5E9F\"\n : \"\u672C\u5730\u56DE\u5408\u5DF2\u53D6\u6D88\uFF0C\u4E34\u65F6\u6D41\u5F0F\u6587\u5B57\u5DF2\u4F5C\u5E9F\",\n runId: event.runId,\n });\n if (event.type !== \"completed\") {\n this.#simulatorState = Object.freeze({\n messages: this.#simulatorState.messages,\n latestRun: Object.freeze({ runId: event.runId, status: event.status }),\n });\n this.#notifySimulator();\n }\n await this.simulatorState().catch(() => undefined);\n }\n\n #stopOutputWatchers(): void {\n for (const controller of this.#outputWatchers.values()) {\n controller.abort(new Error(\"Preview DEV session closed\"));\n }\n this.#outputWatchers.clear();\n this.#failedOutputRuns.clear();\n }\n\n #stopOutputWatcher(runId: string): void {\n this.#failedOutputRuns.delete(runId);\n const controller = this.#outputWatchers.get(runId);\n if (!controller) return;\n this.#outputWatchers.delete(runId);\n controller.abort(new Error(\"Agent local turn reached a terminal state\"));\n }\n\n #notifySimulator(): void {\n this.#simulatorRevision++;\n if (this.#simulatorListeners.size === 0) return;\n const value = Object.freeze({ state: this.simulatorSnapshot(), debug: this.debugSnapshot() });\n for (const listener of this.#simulatorListeners) {\n try {\n listener(value);\n } catch {\n // Browser observer failures must not affect the Agent local turn.\n }\n }\n }\n\n #upsertRun(run: PreviewObservedRun): void {\n const ordinal = this.#runs.get(run.runId)?.ordinal ?? ++this.#runOrdinal;\n // Updating an older round must not promote it to \"latest\" in the selector.\n this.#runs.set(run.runId, Object.freeze({ ...run, ordinal }));\n while (this.#runs.size > 100) {\n const oldest = this.#runs.keys().next().value as string | undefined;\n if (!oldest) break;\n this.#runs.delete(oldest);\n }\n }\n\n #updateRunStatus(runId: string, status: PreviewObservedRunStatus): void {\n const existing = this.#runs.get(runId);\n if (!existing) return;\n this.#upsertRun({ ...existing, status, updatedAt: this.#now().toISOString() });\n }\n\n #record(input: Omit<PreviewDebugEvent, \"eventId\" | \"timestamp\">): void {\n this.#eventSequence += 1;\n this.#events.push(Object.freeze({\n ...input,\n eventId: `event-${this.#eventSequence}`,\n timestamp: this.#now().toISOString(),\n }));\n if (this.#events.length > 300) this.#events.splice(0, this.#events.length - 300);\n }\n\n #setState(next: Omit<PreviewDevState, \"revision\">): PreviewDevState {\n this.#state = Object.freeze({ ...next, revision: this.#state.revision + 1 });\n for (const listener of this.#listeners) {\n try {\n listener(this.#state);\n } catch {\n // UI observer failures must never change the DEV lifecycle.\n }\n }\n return this.#state;\n }\n}\n", "/** Matches DadaApp/PreviewBuddyLink.swift. This is an App route, not an auth token. */\nexport function createBuddyPreviewUrl(buddyId: string): string {\n if (!/^[a-zA-Z0-9._-]{1,124}-dev$/u.test(buddyId)) {\n throw new TypeError(\"\u771F\u673A\u9884\u89C8\u9700\u8981\u4E0D\u8D85\u8FC7 128 \u5B57\u7B26\u7684\u5F00\u53D1\u7248 Buddy ID\");\n }\n return `mlb://preview?${new URLSearchParams({ buddyId })}`;\n}\n", "/** Read the data-only subset printed by Runtime's util.inspect logger. Never evaluate log text. */\nexport function parseInspectedData(text: string): Record<string, unknown> | undefined {\n let at = 0;\n const space = () => { while (/\\s/u.test(text[at] ?? \"\") && at < text.length) at++; };\n const fail = (): never => { throw new Error(\"Unsupported log data\"); };\n function string(): string {\n const quote = text[at++];\n let result = \"\";\n while (at < text.length) {\n const char = text[at++];\n if (char === quote) return result;\n if (char !== \"\\\\\") { result += char; continue; }\n const escaped = text[at++];\n const escapes: Record<string, string> = { n: \"\\n\", r: \"\\r\", t: \"\\t\", b: \"\\b\", f: \"\\f\", v: \"\\v\", \"0\": \"\\0\", \"\\\\\": \"\\\\\", \"'\": \"'\", '\"': '\"', \"`\": \"`\", \"$\": \"$\" };\n if (escaped === \"x\" || escaped === \"u\") {\n const length = escaped === \"x\" ? 2 : 4;\n const hex = text.slice(at, at + length);\n if (!new RegExp(`^[0-9a-fA-F]{${length}}$`, \"u\").test(hex)) fail();\n result += String.fromCharCode(parseInt(hex, 16));\n at += length;\n } else if (escaped !== undefined && Object.hasOwn(escapes, escaped)) result += escapes[escaped];\n else fail();\n }\n return fail();\n }\n function value(depth = 0): unknown {\n if (depth > 40) fail();\n space();\n const char = text[at];\n if (char === \"'\" || char === '\"' || char === \"`\") {\n let result = string();\n space();\n // util.inspect splits long multiline strings using literal concatenation.\n while (text[at] === \"+\") {\n at++; space();\n if (![\"'\", '\"', \"`\"].includes(text[at] ?? \"\")) fail();\n result += string(); space();\n }\n return result;\n }\n if (char === \"{\" || char === \"[\") {\n const array = char === \"[\";\n const end = array ? \"]\" : \"}\";\n const result: Record<string, unknown> = Object.create(null);\n const items: unknown[] = [];\n at++; space();\n while (text[at] !== end) {\n if (at >= text.length) fail();\n if (array) items.push(value(depth + 1));\n else {\n const quoted = [\"'\", '\"', \"`\"].includes(text[at] ?? \"\");\n const key = quoted ? string() : /^[\\w$]+/u.exec(text.slice(at))?.[0];\n if (key === undefined) return fail();\n if (!quoted) at += key.length;\n space();\n if (text[at++] !== \":\" || Object.hasOwn(result, key)) fail();\n result[key] = value(depth + 1);\n }\n space();\n if (text[at] === end) break;\n if (text[at++] !== \",\") fail();\n space();\n }\n at++;\n return array ? items : result;\n }\n const literal = /^(true|false|null|undefined|[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(?=[\\s,\\]}]|$)/iu.exec(text.slice(at))?.[0];\n if (!literal) return fail();\n at += literal.length;\n if (literal === \"true\") return true;\n if (literal === \"false\") return false;\n if (literal === \"null\" || literal === \"undefined\") return null;\n const number = Number(literal);\n return Number.isFinite(number) ? number : fail();\n }\n try {\n if (text.length > 98_304) return undefined;\n const result = value();\n space();\n return at === text.length && result !== null && typeof result === \"object\" && !Array.isArray(result)\n ? result as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nexport interface RuntimeLogRecord {\n readonly id: string;\n readonly timestamp: string;\n readonly source: \"agent.stdout\" | \"agent.stderr\";\n readonly level: \"info\" | \"warn\" | \"error\";\n readonly title: string;\n readonly kind: \"request\" | \"response\" | \"log\";\n readonly raw: string;\n readonly convoKey?: string;\n readonly data?: Record<string, unknown>;\n readonly truncated: boolean;\n}\n\nconst HEADER = /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) \\[[^\\]\\r\\n]+\\] (INFO|WARN|ERROR)\\s+(.+)$/u;\nconst MAX_RECORD = 98_304;\nconst MAX_BYTES = 1_500_000;\n\n/** Bounded, in-memory Preview diagnostics. This does not install or change Runtime hooks. */\nexport class RuntimeDiagnostics {\n #sequence = 0;\n #records: RuntimeLogRecord[] = [];\n #active = new Map<RuntimeLogRecord[\"source\"], string>();\n #sizes = new Map<string, number>();\n #bytes = 0;\n #dropped = 0;\n\n write(source: RuntimeLogRecord[\"source\"], text: string, observedAt: string): void {\n for (const line of text.split(/\\r?\\n/u)) {\n if (!line) continue;\n const header = HEADER.exec(line);\n const previousIndex = this.#records.findIndex(record => record.id === this.#active.get(source));\n const previous = this.#records[previousIndex];\n // inspect continuation lines are indented, except the closing brace.\n const continuation = !header && previous && (/^\\s/u.test(line) || line === \"}\");\n let record: RuntimeLogRecord;\n if (continuation) {\n const raw = `${previous.raw}\\n${line}`;\n record = { ...previous, raw: raw.slice(0, MAX_RECORD), truncated: previous.truncated || raw.length > MAX_RECORD || line.endsWith(\" \u2026[truncated]\") };\n } else {\n const title = header ? header[3]!.replace(/ \\{.*$/u, \"\") : line.slice(0, 180);\n const time = header ? Date.parse(`${header[1]!.replace(\" \", \"T\")}+08:00`) : NaN;\n record = {\n id: `runtime-${++this.#sequence}`, timestamp: Number.isFinite(time) ? new Date(time).toISOString() : observedAt,\n source, level: header ? header[2]!.toLowerCase() as RuntimeLogRecord[\"level\"] : source === \"agent.stderr\" ? \"error\" : \"info\",\n title, kind: header && title === \"\u6A21\u578B\u8BF7\u6C42\u4F53\" ? \"request\" : header && title === \"\u6A21\u578B\u54CD\u5E94\" ? \"response\" : \"log\",\n raw: line.slice(0, MAX_RECORD), truncated: line.length > MAX_RECORD || line.endsWith(\" \u2026[truncated]\"),\n };\n this.#active.set(source, record.id);\n }\n // Only parse when a complete object could have arrived. Unsupported formats stay raw.\n if (!record.truncated && line.trimEnd().endsWith(\"}\")) {\n const head = HEADER.exec(record.raw.split(\"\\n\")[0]!);\n const offset = head ? record.raw.indexOf(\" {\", record.raw.indexOf(head[3]!)) : -1;\n const data = offset < 0 ? undefined : parseInspectedData(record.raw.slice(offset + 1));\n if (data) record = { ...record, data, ...(typeof data.convoKey === \"string\" ? { convoKey: data.convoKey } : {}) };\n }\n // Do not retain a formerly parsed object if new continuation data invalidates it.\n if (continuation && previous.data) {\n const { data: _data, convoKey: _convoKey, ...rawRecord } = record;\n record = rawRecord;\n }\n this.#bytes -= this.#sizes.get(record.id) ?? 0;\n const size = Buffer.byteLength(JSON.stringify(record));\n this.#sizes.set(record.id, size);\n this.#bytes += size;\n if (continuation) this.#records[previousIndex] = record;\n else this.#records.push(record);\n while (this.#records.length > 200 || this.#bytes > MAX_BYTES) {\n const removed = this.#records.shift()!;\n this.#bytes -= this.#sizes.get(removed.id) ?? 0;\n this.#sizes.delete(removed.id);\n this.#dropped++;\n }\n }\n }\n\n boundary(): void { this.#active.clear(); }\n clear(): void { this.#records = []; this.#active.clear(); this.#sizes.clear(); this.#bytes = 0; this.#dropped = 0; }\n snapshot(): { records: readonly RuntimeLogRecord[]; dropped: number } {\n return { records: [...this.#records].reverse(), dropped: this.#dropped };\n }\n}\n", "import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { createRequire } from \"node:module\";\n\nimport { PreviewController } from \"./controller.js\";\nimport QRCode from \"qrcode\";\n\nconst LOOPBACK_HOSTS = new Set([\"127.0.0.1\", \"::1\", \"localhost\"]);\nconst SESSION_COOKIE_PREFIX = \"buddy_preview_session\";\nconst require = createRequire(import.meta.url);\nconst BRAND_ICON = Buffer.from(\n readFileSync(new URL(\"../web/assets/developer-platform-icon.png.base64\", import.meta.url), \"utf8\").trim(),\n \"base64\",\n);\nconst WEB_ASSETS = Object.freeze(new Map<string, { readonly contentType: string; readonly body: Buffer }>([\n [\"/\", {\n contentType: \"text/html; charset=utf-8\",\n body: readFileSync(new URL(\"../web/index.html\", import.meta.url)),\n }],\n [\"/assets/app.css\", {\n contentType: \"text/css; charset=utf-8\",\n body: readFileSync(new URL(\"../web/app.css\", import.meta.url)),\n }],\n [\"/assets/tokens.css\", {\n contentType: \"text/css; charset=utf-8\",\n body: readFileSync(new URL(\"../web/tokens.css\", import.meta.url)),\n }],\n [\"/assets/brand.css\", {\n contentType: \"text/css; charset=utf-8\",\n body: readFileSync(new URL(\"../web/brand.css\", import.meta.url)),\n }],\n [\"/assets/widgets.js\", { contentType: \"text/javascript; charset=utf-8\", body: readFileSync(new URL(\"../web/widgets.js\", import.meta.url)) }],\n [\"/assets/widgets.css\", { contentType: \"text/css; charset=utf-8\", body: readFileSync(new URL(\"../web/widgets.css\", import.meta.url)) }],\n [\"/assets/app.js\", {\n contentType: \"text/javascript; charset=utf-8\",\n body: readFileSync(new URL(\"../web/app.js\", import.meta.url)),\n }],\n [\"/assets/diagnostics.js\", { contentType: \"text/javascript; charset=utf-8\", body: readFileSync(new URL(\"../web/diagnostics.js\", import.meta.url)) }],\n [\"/assets/developer-platform-icon.png\", {\n contentType: \"image/png\",\n body: BRAND_ICON,\n }],\n [\"/assets/iphone-16-max.js\", {\n contentType: \"text/javascript; charset=utf-8\",\n body: readFileSync(require.resolve(\"@sneas/telephone/iphone-16-max.js\")),\n }],\n]));\n\nexport interface PreviewControlServerOptions {\n readonly controller: PreviewController;\n readonly host?: \"127.0.0.1\" | \"::1\" | \"localhost\";\n readonly port?: number;\n}\n\nexport interface PreviewControlServer {\n readonly origin: URL;\n readonly bootstrapUrl: URL;\n close(): Promise<void>;\n}\n\nfunction closeServer(server: Server): Promise<void> {\n if (!server.listening) return Promise.resolve();\n return new Promise((resolve, reject) => {\n server.close((error) => error ? reject(error) : resolve());\n });\n}\n\nfunction writeHeaders(response: ServerResponse): void {\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n response.setHeader(\"Referrer-Policy\", \"no-referrer\");\n response.setHeader(\"Cross-Origin-Opener-Policy\", \"same-origin\");\n response.setHeader(\n \"Content-Security-Policy\",\n // Telephone injects its frame CSS into a shadow root and updates one inline sizing variable.\n \"default-src 'self'; connect-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'\",\n );\n}\n\nfunction staticAsset(response: ServerResponse, asset: { readonly contentType: string; readonly body: Buffer }): void {\n response.statusCode = 200;\n writeHeaders(response);\n response.setHeader(\"Content-Type\", asset.contentType);\n response.setHeader(\"Content-Length\", asset.body.length);\n response.end(asset.body);\n}\n\nfunction json(response: ServerResponse, status: number, body: unknown): void {\n const encoded = JSON.stringify(body);\n response.statusCode = status;\n writeHeaders(response);\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(encoded));\n response.end(encoded);\n}\n\nfunction safeEqual(left: string, right: string): boolean {\n const a = Buffer.from(left);\n const b = Buffer.from(right);\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nfunction cookieValue(request: IncomingMessage, name: string): string | undefined {\n for (const part of request.headers.cookie?.split(\";\") ?? []) {\n const separator = part.indexOf(\"=\");\n if (separator < 0) continue;\n if (part.slice(0, separator).trim() === name) return part.slice(separator + 1).trim();\n }\n return undefined;\n}\n\nfunction requestUrl(request: IncomingMessage, origin: URL): URL | null {\n try {\n return new URL(request.url ?? \"/\", origin);\n } catch {\n return null;\n }\n}\n\nfunction allowedHost(request: IncomingMessage, port: number): boolean {\n const value = request.headers.host;\n if (!value) return false;\n try {\n const parsed = new URL(`http://${value}`);\n return LOOPBACK_HOSTS.has(parsed.hostname.replace(/^\\[|\\]$/gu, \"\")) && Number(parsed.port || 80) === port;\n } catch {\n return false;\n }\n}\n\nfunction allowedOrigin(request: IncomingMessage, origin: URL): boolean {\n const value = request.headers.origin;\n return value === undefined || value === origin.origin;\n}\n\nfunction validWidgetRender(value: string | null): value is string {\n return value !== null && /^[a-zA-Z0-9-]{16,64}$/u.test(value);\n}\n\nfunction widgetDocument(response: ServerResponse, html: string, render: string | null, state = \"ready\", status = 200): void {\n writeHeaders(response);\n response.statusCode = status;\n // Opaque origin, no account credentials or application bridge inside generated HTML.\n response.setHeader(\"Content-Security-Policy\", \"sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; connect-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'self'\");\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n if (validWidgetRender(render)) {\n const signal = `<script>window.addEventListener('load',()=>parent.postMessage({channel:'buddy-widget-document',render:${JSON.stringify(render)},state:${JSON.stringify(state)}},'*'),{once:true})</script>`;\n // Preserve standards mode even for documents with an implicit head.\n if (/<head(?:\\s[^>]*)?>/iu.test(html)) html = html.replace(/<head(?:\\s[^>]*)?>/iu, match => match + signal);\n else if (/<!doctype[^>]*>/iu.test(html)) html = html.replace(/<!doctype[^>]*>/iu, match => match + signal);\n else html = signal + html;\n }\n response.end(html);\n}\n\nfunction apiError(response: ServerResponse, status: number, code: string, message: string): void {\n json(response, status, { error: { code, message } });\n}\n\nasync function readJsonBody(request: IncomingMessage, maximumBytes = 64 * 1024): Promise<unknown> {\n const contentType = request.headers[\"content-type\"]?.split(\";\", 1)[0]?.trim().toLowerCase();\n if (contentType !== \"application/json\") {\n throw Object.assign(new Error(\"\u9700\u8981 application/json\"), { code: \"JSON_REQUIRED\", status: 415 });\n }\n const declared = Number(request.headers[\"content-length\"] ?? 0);\n if (!Number.isFinite(declared) || declared < 0 || declared > maximumBytes) {\n throw Object.assign(new Error(\"\u8BF7\u6C42\u6B63\u6587\u8FC7\u5927\"), { code: \"BODY_TOO_LARGE\", status: 413 });\n }\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > maximumBytes) {\n throw Object.assign(new Error(\"\u8BF7\u6C42\u6B63\u6587\u8FC7\u5927\"), { code: \"BODY_TOO_LARGE\", status: 413 });\n }\n chunks.push(buffer);\n }\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n } catch {\n throw Object.assign(new Error(\"\u8BF7\u6C42\u6B63\u6587\u4E0D\u662F\u6709\u6548 JSON\"), { code: \"INVALID_JSON\", status: 400 });\n }\n}\n\nfunction exactObject(value: unknown, keys: readonly string[]): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const object = value as Record<string, unknown>;\n const expected = new Set(keys);\n return Object.keys(object).length === keys.length\n && Object.keys(object).every((key) => expected.has(key))\n ? object\n : null;\n}\n\nfunction safeIdentifier(value: unknown, maximumLength = 200): value is string {\n return typeof value === \"string\"\n && value.length > 0\n && value.length <= maximumLength\n && !/[\\u0000-\\u001f\\u007f]/u.test(value);\n}\n\nfunction requestFailure(cause: unknown): { status: number; code: string; message: string } {\n if (typeof cause === \"object\" && cause !== null) {\n const status = \"status\" in cause\n && typeof cause.status === \"number\"\n && Number.isInteger(cause.status)\n && cause.status >= 400\n && cause.status <= 599\n ? cause.status\n : 502;\n const code = \"code\" in cause && safeIdentifier(cause.code, 80) ? cause.code : \"SIMULATOR_REQUEST_FAILED\";\n const message = \"publicMessage\" in cause\n && typeof cause.publicMessage === \"string\"\n && cause.publicMessage.length <= 512\n && !/[\\u0000-\\u001f\\u007f]/u.test(cause.publicMessage)\n ? cause.publicMessage\n : status < 500 && cause instanceof Error\n ? cause.message\n : \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\";\n return { status, code, message };\n }\n return { status: 502, code: \"SIMULATOR_REQUEST_FAILED\", message: \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\" };\n}\n\nfunction publicProject(config: Awaited<ReturnType<PreviewController[\"project\"]>>): Record<string, unknown> {\n return {\n buddyId: config.buddyId,\n };\n}\n\nexport async function startPreviewControlServer(options: PreviewControlServerOptions): Promise<PreviewControlServer> {\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 0;\n if (!LOOPBACK_HOSTS.has(host)) throw new TypeError(\"Preview control server must bind to loopback\");\n if (!Number.isSafeInteger(port) || port < 0 || port > 65_535) throw new TypeError(\"Preview port must be 0\u201365535\");\n\n const sessionToken = randomBytes(32).toString(\"base64url\");\n let bootstrapAvailable = true;\n let origin: URL | undefined;\n const listeners = new Set<ServerResponse>();\n let eventRevision = 0;\n\n const publish = (event: string, value: unknown): void => {\n eventRevision += 1;\n const payload = `id: ${eventRevision}\\nevent: ${event}\\ndata: ${JSON.stringify(value)}\\n\\n`;\n for (const response of listeners) {\n try {\n response.write(payload);\n } catch {\n listeners.delete(response);\n }\n }\n };\n const unsubscribeDev = options.controller.subscribe((state) => publish(\"dev.state\", state));\n const unsubscribeSimulator = options.controller.subscribeSimulator((value) => publish(\"simulator.state\", value));\n\n const server = createServer(async (request, response) => {\n if (!origin) return apiError(response, 503, \"PREVIEW_STARTING\", \"Preview \u6B63\u5728\u542F\u52A8\");\n if (!allowedHost(request, Number(origin.port)) || !allowedOrigin(request, origin)) {\n return apiError(response, 403, \"PREVIEW_ORIGIN_FORBIDDEN\", \"\u8BF7\u6C42\u6765\u6E90\u4E0D\u53D7\u4FE1\u4EFB\");\n }\n // Cookies share a host across ports; each preview needs its own cookie name.\n const sessionCookie = `${SESSION_COOKIE_PREFIX}_${origin.port}`;\n const url = requestUrl(request, origin);\n if (!url) return apiError(response, 400, \"INVALID_URL\", \"\u8BF7\u6C42\u5730\u5740\u65E0\u6548\");\n\n if (\n request.method === \"GET\"\n && bootstrapAvailable\n && url.pathname === `/bootstrap/${sessionToken}`\n ) {\n bootstrapAvailable = false;\n response.statusCode = 303;\n writeHeaders(response);\n response.setHeader(\n \"Set-Cookie\",\n `${sessionCookie}=${sessionToken}; HttpOnly; SameSite=Strict; Path=/; Max-Age=43200`,\n );\n response.setHeader(\"Location\", \"/\");\n response.end();\n return;\n }\n\n const suppliedToken = cookieValue(request, sessionCookie);\n if (!suppliedToken || !safeEqual(suppliedToken, sessionToken)) {\n return apiError(response, 401, \"PREVIEW_UNAUTHORIZED\", \"\u9700\u8981\u4ECE CLI \u63D0\u4F9B\u7684\u4E00\u6B21\u6027\u5165\u53E3\u6253\u5F00 Preview\");\n }\n\n if (request.method === \"GET\") {\n const asset = WEB_ASSETS.get(url.pathname);\n if (asset) return staticAsset(response, asset);\n }\n\n if (request.method === \"GET\" && url.pathname === \"/api/project\") {\n try {\n return json(response, 200, { project: publicProject(await options.controller.project()) });\n } catch {\n return apiError(response, 422, \"PROJECT_CONFIG_INVALID\", \"\u9879\u76EE\u914D\u7F6E\u65E0\u6CD5\u8BFB\u53D6\u6216\u6821\u9A8C\u5931\u8D25\");\n }\n }\n if (request.method === \"GET\" && url.pathname === \"/api/dev\") {\n return json(response, 200, { state: options.controller.state() });\n }\n if (request.method === \"GET\" && url.pathname === \"/api/buddy\") {\n try {\n return json(response, 200, { buddy: await options.controller.buddyDetails() });\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n if (request.method === \"GET\" && url.pathname === \"/api/debug\") {\n return json(response, 200, { debug: options.controller.debugSnapshot() });\n }\n if (request.method === \"GET\" && url.pathname === \"/api/device/pairing\") {\n const pairing = options.controller.devicePairing();\n if (pairing.status !== \"ready\") return json(response, 200, { pairing });\n const qrCodeDataUrl = await QRCode.toDataURL(pairing.url, {\n errorCorrectionLevel: \"M\", margin: 4, width: 256,\n });\n const current = options.controller.devicePairing();\n return json(response, 200, { pairing: current.status === \"ready\" && current.url === pairing.url\n ? { ...current, qrCodeDataUrl } : current });\n }\n if (request.method === \"GET\" && url.pathname === \"/api/simulator/state\") {\n try {\n return json(response, 200, { state: await options.controller.simulatorState() });\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n const widgetRoute = /^\\/api\\/simulator\\/widgets(?:\\/([^/]+)(?:\\/(image|pin))?)?$/u.exec(url.pathname);\n if (widgetRoute) {\n try {\n const id = widgetRoute[1] ? decodeURIComponent(widgetRoute[1]) : \"\";\n const suffix = widgetRoute[2];\n if (id && !suffix && request.method === \"DELETE\") return json(response, 200, await options.controller.simulatorWidgets(\"delete\", id));\n if (request.method === \"GET\" && !id) return json(response, 200, await options.controller.simulatorWidgets(\"list\"));\n if (id && suffix === \"pin\" && (request.method === \"PUT\" || request.method === \"DELETE\")) return json(response, 200, await options.controller.simulatorWidgets(request.method === \"PUT\" ? \"pin\" : \"unpin\", id));\n if (id && request.method === \"GET\" && suffix === \"image\") {\n const image = await options.controller.simulatorWidgets(\"image\", id, url.searchParams.get(\"mediaId\") ?? \"\") as { body: Uint8Array; contentType: string };\n if (!/^image\\/(png|jpeg|webp|gif)(;|$)/u.test(image.contentType)) throw new Error(\"\u56FE\u7247\u683C\u5F0F\u4E0D\u652F\u6301\");\n writeHeaders(response); response.setHeader(\"Content-Type\", image.contentType); response.end(image.body); return;\n }\n if (id && request.method === \"GET\" && !suffix) {\n const html = await options.controller.simulatorWidgets(\"html\", id, \"\", url.searchParams.get(\"messageId\") ?? undefined) as string;\n widgetDocument(response, html, url.searchParams.get(\"render\"));\n return;\n }\n return apiError(response, 405, \"METHOD_NOT_ALLOWED\", \"\u4E0D\u652F\u6301\u8FD9\u4E2A\u5C0F\u6302\u4EF6\u64CD\u4F5C\");\n } catch (cause) {\n const failure = requestFailure(cause);\n const render = url.searchParams.get(\"render\");\n if (request.method === \"GET\" && widgetRoute[1] && !widgetRoute[2] && validWidgetRender(render)) {\n widgetDocument(response, \"<!doctype html><html><head><meta charset=\\\"utf-8\\\"></head><body>\u5C0F\u6302\u4EF6\u6682\u65F6\u65E0\u6CD5\u6253\u5F00</body></html>\", render, \"error\", failure.status);\n return;\n }\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n if (request.method === \"GET\" && url.pathname === \"/api/events\") {\n response.statusCode = 200;\n writeHeaders(response);\n response.setHeader(\"Content-Type\", \"text/event-stream; charset=utf-8\");\n response.setHeader(\"Connection\", \"keep-alive\");\n eventRevision += 1;\n response.write(`id: ${eventRevision}\\nevent: dev.state\\ndata: ${JSON.stringify(options.controller.state())}\\n\\n`);\n eventRevision += 1;\n response.write(`id: ${eventRevision}\\nevent: simulator.state\\ndata: ${JSON.stringify({\n state: options.controller.simulatorSnapshot(),\n debug: options.controller.debugSnapshot(),\n })}\\n\\n`);\n listeners.add(response);\n request.once(\"close\", () => listeners.delete(response));\n return;\n }\n if (request.method === \"POST\" && options.controller.resetting) {\n return apiError(response, 409, \"SIMULATOR_BUSY\", \"\u6B63\u5728\u6E05\u7A7A\u5BF9\u8BDD\u5E76\u91CD\u542F DEV\uFF0C\u8BF7\u7A0D\u5019\");\n }\n if (request.method === \"POST\" && url.pathname === \"/api/simulator/reset\") {\n try {\n const body = exactObject(await readJsonBody(request), [\"confirm\"]);\n if (body?.confirm !== true) return apiError(response, 400, \"RESET_CONFIRMATION_REQUIRED\", \"\u8BF7\u786E\u8BA4\u6E05\u7A7A\u5F53\u524D\u5F00\u53D1\u7248\u5BF9\u8BDD\");\n const state = await options.controller.resetSimulator();\n return json(response, 200, { state, dev: options.controller.state(), debug: options.controller.debugSnapshot() });\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n if (request.method === \"POST\" && url.pathname === \"/api/dev/start\") {\n if (Number(request.headers[\"content-length\"] ?? 0) > 0) {\n return apiError(response, 400, \"BODY_NOT_ALLOWED\", \"\u8BE5\u64CD\u4F5C\u4E0D\u63A5\u53D7\u8BF7\u6C42\u6B63\u6587\");\n }\n void options.controller.start();\n return json(response, 202, { state: options.controller.state() });\n }\n if (request.method === \"POST\" && url.pathname === \"/api/dev/stop\") {\n if (Number(request.headers[\"content-length\"] ?? 0) > 0) {\n return apiError(response, 400, \"BODY_NOT_ALLOWED\", \"\u8BE5\u64CD\u4F5C\u4E0D\u63A5\u53D7\u8BF7\u6C42\u6B63\u6587\");\n }\n try {\n return json(response, 200, { state: await options.controller.stop() });\n } catch {\n return apiError(response, 500, \"DEV_STOP_FAILED\", \"DEV \u4F1A\u8BDD\u672A\u80FD\u5B89\u5168\u505C\u6B62\uFF0C\u8BF7\u68C0\u67E5\u672C\u5730\u8FDB\u7A0B\");\n }\n }\n if (request.method === \"POST\" && url.pathname === \"/api/simulator/messages\") {\n try {\n const body = exactObject(await readJsonBody(request), [\"text\", \"idempotencyKey\"]);\n if (\n !body\n || typeof body.text !== \"string\"\n || !body.text.trim()\n || Buffer.byteLength(body.text, \"utf8\") > 32 * 1024\n || !safeIdentifier(body.idempotencyKey, 128)\n ) {\n return apiError(response, 400, \"INVALID_MESSAGE\", \"\u6D88\u606F\u6216\u5E42\u7B49\u6807\u8BC6\u4E0D\u7B26\u5408\u8981\u6C42\");\n }\n const accepted = await options.controller.sendSimulatorMessage({\n text: body.text,\n idempotencyKey: body.idempotencyKey,\n });\n return json(response, 202, accepted);\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n const cancelMatch = /^\\/api\\/simulator\\/runs\\/([^/]+)\\/cancel$/u.exec(url.pathname);\n if (request.method === \"POST\" && cancelMatch) {\n if (Number(request.headers[\"content-length\"] ?? 0) > 0) {\n return apiError(response, 400, \"BODY_NOT_ALLOWED\", \"\u8BE5\u64CD\u4F5C\u4E0D\u63A5\u53D7\u8BF7\u6C42\u6B63\u6587\");\n }\n let runId: string;\n try {\n runId = decodeURIComponent(cancelMatch[1]!);\n } catch {\n return apiError(response, 400, \"INVALID_RUN_ID\", \"Run ID \u4E0D\u7B26\u5408\u8981\u6C42\");\n }\n if (!safeIdentifier(runId)) return apiError(response, 400, \"INVALID_RUN_ID\", \"Run ID \u4E0D\u7B26\u5408\u8981\u6C42\");\n try {\n return json(response, 200, await options.controller.cancelSimulatorRun(runId));\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n return apiError(response, 404, \"NOT_FOUND\", \"\u63A5\u53E3\u4E0D\u5B58\u5728\");\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address() as AddressInfo | null;\n if (!address) throw new Error(\"Preview server has no address\");\n const urlHost = address.address.includes(\":\") ? `[${address.address}]` : address.address;\n origin = new URL(`http://${urlHost}:${address.port}`);\n } catch (cause) {\n unsubscribeDev();\n unsubscribeSimulator();\n await closeServer(server).catch(() => undefined);\n throw cause;\n }\n\n const bootstrapUrl = new URL(`/bootstrap/${sessionToken}`, origin);\n return Object.freeze({\n origin,\n bootstrapUrl,\n async close() {\n unsubscribeDev();\n unsubscribeSimulator();\n for (const response of listeners) response.end();\n listeners.clear();\n let controllerFailure: unknown;\n try {\n await options.controller.close();\n } catch (cause) {\n controllerFailure = cause;\n }\n await closeServer(server);\n if (controllerFailure !== undefined) throw controllerFailure;\n },\n });\n}\n", "import { createHash } from \"node:crypto\";\n\nimport { normalizePlatformUrl } from \"@buddy/cli-core\";\nimport { mlbAppCommand, mlbAppEvents, MlbEventStreamError } from \"./mlb-events.js\";\nimport { parsePreviewBuddyDetails, type PreviewBuddyDetails } from \"./buddy-details.js\";\n\nimport type {\n PreviewWidget,\n PreviewWidgetOpenTarget,\n PreviewSimulatorClient,\n PreviewSimulatorMessage,\n PreviewSimulatorOutputEvent,\n PreviewSimulatorState,\n} from \"./controller.js\";\n\nexport interface MlbSimulatorClientOptions {\n readonly baseUrl: string | URL;\n /** Explicit MLB development identity: `<package.json buddyId>-dev`. */\n readonly buddyId: string;\n readonly auth: { readonly developerAccessToken: string };\n readonly fetch?: typeof globalThis.fetch;\n}\n\ninterface MlbHttpErrorShape extends Error {\n readonly code: string;\n readonly status: number;\n readonly publicMessage: string;\n}\n\nfunction safeText(value: unknown, name: string, maximum = 4096): string {\n if (\n typeof value !== \"string\"\n || !value.trim()\n || value.length > maximum\n || /[\\u0000-\\u001f\\u007f]/u.test(value)\n ) {\n throw new TypeError(`${name} is invalid`);\n }\n return value;\n}\n\nfunction endpoint(base: URL, path: string): URL {\n return new URL(path.replace(/^\\//u, \"\"), base);\n}\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n\nfunction httpError(status: number, value: unknown): MlbHttpErrorShape {\n const serverMessage = object(value)?.error;\n const message = typeof serverMessage === \"string\" && serverMessage.trim()\n ? serverMessage.slice(0, 512)\n : status >= 500\n ? \"MLB Server \u6682\u65F6\u4E0D\u53EF\u7528\"\n : \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\";\n return Object.assign(new Error(message), {\n code: \"MLB_REQUEST_FAILED\",\n status,\n publicMessage: message,\n });\n}\n\nfunction message(value: unknown, index: number): PreviewSimulatorMessage | null {\n const input = object(value);\n if (!input || typeof input.author !== \"string\") return null;\n const role = input.author === \"buddy\"\n ? \"assistant\" as const\n : input.author === \"user\" || input.author === \"owner\"\n ? \"user\" as const\n : undefined;\n if (!role) return null;\n const messageId = safeText(input.id, `messages[${index}].id`, 256);\n let text = input.type === \"widget\" && input.text === undefined ? \"\" : input.text;\n if (typeof text !== \"string\" || Buffer.byteLength(text, \"utf8\") > 48 * 1024) {\n throw new Error(`messages[${index}].text is invalid`);\n }\n // Tool steps can carry visible speech, but an empty execution record is not a bubble.\n if (input.type === \"tool\" && !text.trim()) return null;\n if (typeof input.timestamp !== \"number\" || !Number.isFinite(input.timestamp)) {\n throw new Error(`messages[${index}].timestamp is invalid`);\n }\n if (role === \"assistant\" && input.type === \"question\") {\n const options = object(input.question)?.options;\n if (!Array.isArray(options) || options.length < 2 || options.length > 4\n || options.some(option => typeof option !== \"string\" || !option.trim() || option.length > 30)) {\n throw new Error(`messages[${index}].question is invalid`);\n }\n text += `\\n\\n${options.map((option, i) => `${i + 1}. ${option}`).join(\"\\n\")}\\n\\n\u8BF7\u76F4\u63A5\u56DE\u590D\u4F60\u7684\u9009\u62E9\uFF0C\u4E5F\u53EF\u4EE5\u8865\u5145\u8BF4\u660E\u3002`;\n }\n if (role === \"assistant\" && input.type === \"permissionRequest\") {\n const request = object(input.permissionRequest);\n text += request?.status === \"pending\"\n ? \"\\n\\n\u8BF7\u5728\u642D\u642D App \u4E2D\u5904\u7406\u8FD9\u5F20\u6388\u6743\u5361\uFF1B\u6D4F\u89C8\u5668\u9884\u89C8\u4E0D\u4EE3\u66FF\u7CFB\u7EDF\u6388\u6743\u3002\"\n : \"\\n\\n\u6388\u6743\u5361\u7684\u5904\u7406\u7ED3\u679C\u8BF7\u4EE5\u642D\u642D App \u4E2D\u7684\u72B6\u6001\u4E3A\u51C6\u3002\";\n }\n return Object.freeze({\n messageId,\n role,\n text,\n createdAt: new Date(input.timestamp).toISOString(),\n ...(input.type === \"widget\" && object(input.widget) ? { widget: parseWidget(input.widget) } : {}),\n });\n}\n\nfunction widgetId(value: unknown): string {\n const id = safeText(value, \"widgetId\", 64);\n if (/[\\s/\\\\]/u.test(id) || id === \".\" || id === \"..\") throw new TypeError(\"widgetId is invalid\");\n return id;\n}\nfunction parseWidget(value: unknown): PreviewWidget {\n const item = object(value);\n const openTarget = parseOpenTarget(item?.openTarget);\n return Object.freeze({ id: widgetId(item?.id), title: typeof item?.title === \"string\" && item.title.trim() ? item.title : \"\u5C0F\u6302\u4EF6\",\n ...(typeof item?.type === \"string\" ? { type: item.type } : {}),\n ...(typeof item?.summary === \"string\" ? { summary: item.summary } : {}),\n ...(typeof item?.imageMediaId === \"string\" && /^media_[a-zA-Z0-9_-]+$/u.test(item.imageMediaId) ? { imageMediaId: item.imageMediaId } : {}),\n ...(typeof item?.isPinned === \"boolean\" ? { isPinned: item.isPinned } : {}),\n ...(typeof item?.creatorName === \"string\" ? { creatorName: item.creatorName } : {}),\n ...(item?.role === \"owner\" || item?.role === \"editor\" || item?.role === \"viewer\" ? { role: item.role } : {}),\n ...(openTarget ? { openTarget } : {}),\n });\n}\n\n/** Validate protocol shape only; declarations, records and state schemas belong to MLB Server. */\nfunction parseOpenTarget(value: unknown): PreviewWidgetOpenTarget | undefined {\n if (value === undefined) return undefined;\n const target = object(value), resource = object(target?.resource);\n const name = (input: unknown): input is string => typeof input === \"string\" && /^[^\\s/\\u0000-\\u001f\\u007f]{1,64}$/u.test(input);\n if (!target || target.version !== 1 || !name(target.entry)\n || (target.resource !== undefined && (!resource || !name(resource.module) || !name(resource.recordId)))\n || (target.state !== undefined && !object(target.state))) throw new TypeError(\"Widget \u6253\u5F00\u76EE\u6807\u683C\u5F0F\u65E0\u6548\");\n const normalized: PreviewWidgetOpenTarget = {\n version: 1, entry: target.entry,\n ...(resource ? { resource: { module: resource.module as string, recordId: resource.recordId as string } } : {}),\n ...(target.state !== undefined ? { state: object(target.state)! } : {}),\n };\n if (Buffer.byteLength(JSON.stringify(normalized), \"utf8\") > 8 * 1024) throw new TypeError(\"Widget \u6253\u5F00\u76EE\u6807\u8D85\u8FC7 8 KiB\");\n return Object.freeze(normalized);\n}\n\nfunction localReceipt(prefix: string, value: string): string {\n return `${prefix}-${createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 20)}`;\n}\n\nfunction waitForRetry(milliseconds: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(timer);\n reject(signal?.reason);\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, milliseconds);\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\n/** MLB Client adapter used by the browser simulator. No Run API is involved. */\nexport class MlbSimulatorClient implements PreviewSimulatorClient {\n readonly #baseUrl: URL;\n readonly #buddyId: string;\n readonly #accessToken: string;\n readonly #fetch: typeof globalThis.fetch;\n #sending = false;\n #resetTarget: string | undefined;\n #resetArchived = false;\n #lastSend: { key: string; text: string; receipt: { readonly messageId: string; readonly runId: string } } | undefined;\n #privateId: string | undefined;\n #privatePromise: Promise<string> | undefined;\n #active: {\n readonly runId: string;\n readonly messageTimestamp: number;\n readonly observedReplying: boolean;\n } | undefined;\n #latest: PreviewSimulatorState[\"latestRun\"];\n #streaming: PreviewSimulatorState[\"streaming\"];\n #messages: readonly PreviewSimulatorMessage[] = Object.freeze([]);\n\n constructor(options: MlbSimulatorClientOptions) {\n this.#baseUrl = normalizePlatformUrl(options.baseUrl);\n this.#buddyId = safeText(options.buddyId, \"buddyId\", 256);\n if (!this.#buddyId.endsWith(\"-dev\")) {\n throw new TypeError(\"MLB simulator buddyId must use the -dev identity\");\n }\n this.#accessToken = safeText(options.auth.developerAccessToken, \"developerAccessToken\", 16_384);\n this.#fetch = options.fetch ?? globalThis.fetch;\n if (typeof this.#fetch !== \"function\") throw new TypeError(\"A Fetch API implementation is required\");\n }\n\n /** Reading a profile must not add the Buddy or trigger a welcome message. */\n async details(options: { readonly signal?: AbortSignal } = {}): Promise<PreviewBuddyDetails> {\n const signal = AbortSignal.any([AbortSignal.timeout(30_000), ...(options.signal ? [options.signal] : [])]);\n const details = parsePreviewBuddyDetails(await this.#request(\"GET\", `/app/buddies/${encodeURIComponent(this.#buddyId)}`, { signal }), this.#buddyId);\n this.#privateId = details.privateId ?? undefined;\n if (!details.avatar) return details;\n let avatarPreview: string | null = null;\n try {\n const url = new URL(details.avatar, this.#baseUrl);\n if (url.origin !== this.#baseUrl.origin || url.username || url.password || !url.pathname.startsWith(\"/media/\")) throw new Error(\"Unsupported avatar URL\");\n const image = await this.#widgetResource(url.href, false);\n const contentType = image.contentType.split(\";\", 1)[0]!.trim().toLowerCase();\n if (![\"image/png\", \"image/jpeg\", \"image/webp\"].includes(contentType)) throw new Error(\"Unsupported avatar type\");\n avatarPreview = `data:${contentType};base64,${Buffer.from(image.body).toString(\"base64\")}`;\n } catch { /* Profile remains usable when the image is temporarily unavailable. */ }\n return Object.freeze({ ...details, avatarPreview });\n }\n\n async widgets(): Promise<readonly PreviewWidget[]> {\n this.#assertResetComplete();\n const id = await this.#ensurePrivate();\n const body = object(await this.#request(\"GET\", `/app/privates/${encodeURIComponent(id)}/widgets`, {}));\n if (!Array.isArray(body?.widgets)) throw httpError(502, { error: \"\u65E0\u6CD5\u8BFB\u53D6\u4F1A\u8BDD\u5C0F\u6302\u4EF6\" });\n return body.widgets.map(parseWidget).filter(item => item.type !== undefined);\n }\n\n async widgetHtml(id: string, openTarget?: PreviewWidgetOpenTarget): Promise<string> {\n this.#assertResetComplete();\n const target = parseOpenTarget(openTarget);\n const privateId = await this.#ensurePrivate();\n const result = await this.#widgetResource(`/app/widgets/${encodeURIComponent(widgetId(id))}/presentation`, true, {\n method: \"POST\", body: JSON.stringify({ conversationId: privateId, ...(target ? { openTarget: target } : {}) }),\n });\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(result.body);\n }\n\n async pinWidget(id: string, pinned: boolean): Promise<void> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate();\n await this.#request(pinned ? \"PUT\" : \"DELETE\", `/app/widgets/${encodeURIComponent(widgetId(id))}/pin`, { ...(pinned ? { body: { sourceConversationId: privateId } } : {}) });\n }\n\n async deleteWidget(id: string): Promise<void> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate();\n await this.#request(\"DELETE\", `/app/widgets/${encodeURIComponent(widgetId(id))}?conversationId=${encodeURIComponent(privateId)}`, {});\n }\n\n async widgetImage(id: string, mediaId: string): Promise<{ body: Uint8Array; contentType: string }> {\n this.#assertResetComplete();\n if (!/^media_[a-zA-Z0-9_-]+$/u.test(mediaId)) throw new TypeError(\"Invalid media ID\");\n const access = object(await this.#request(\"GET\", `/app/media/${encodeURIComponent(mediaId)}?widgetId=${encodeURIComponent(widgetId(id))}`, {}));\n const url = new URL(String(access?.url));\n if (url.protocol !== \"https:\" || url.username || url.password || access?.mediaId !== mediaId || typeof access.expiresAt !== \"number\" || access.expiresAt <= Date.now()) throw new Error(\"\u56FE\u7247\u94FE\u63A5\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u8BD5\");\n return this.#widgetResource(url.href, false);\n }\n\n async #widgetResource(path: string, authenticated = true, init: Pick<RequestInit, \"method\" | \"body\"> = {}): Promise<{ body: Uint8Array; contentType: string }> {\n const response = await this.#fetch(authenticated ? endpoint(this.#baseUrl, path) : new URL(path), { ...init, headers: {\n ...(authenticated ? { Authorization: `Bearer ${this.#accessToken}` } : {}),\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n }, credentials: \"omit\", redirect: \"error\", signal: AbortSignal.timeout(15_000) });\n if (!response.ok) throw httpError(response.status, { error: response.status === 403 || response.status === 404 ? \"\u5C0F\u6302\u4EF6\u5DF2\u5220\u9664\u3001\u9875\u9762\u672A\u4E0A\u4F20\uFF0C\u6216\u4F60\u5DF2\u4E0D\u5728\u8FD9\u4E2A\u4F1A\u8BDD\u4E2D\u3002\" : \"\u5C0F\u6302\u4EF6\u6682\u65F6\u65E0\u6CD5\u6253\u5F00\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u3002\" });\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"\u5C0F\u6302\u4EF6\u5185\u5BB9\u4E3A\u7A7A\");\n const chunks: Uint8Array[] = []; let size = 0;\n try {\n while (true) { const part = await reader.read(); if (part.done) break; size += part.value.byteLength;\n if (size > 4 * 1024 * 1024) throw new Error(\"\u5C0F\u6302\u4EF6\u5185\u5BB9\u8FC7\u5927\uFF0C\u6682\u65F6\u65E0\u6CD5\u6253\u5F00\");\n chunks.push(part.value);\n }\n } finally { await reader.cancel(); }\n return { body: Buffer.concat(chunks), contentType: response.headers.get(\"content-type\") ?? \"text/html\" };\n }\n\n async state(options: { readonly signal?: AbortSignal } = {}): Promise<PreviewSimulatorState> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate(options.signal);\n const value = await this.#request(\"GET\", `/app/privates/${encodeURIComponent(privateId)}`, {\n signal: options.signal,\n });\n const body = object(value);\n const conversation = object(body?.private);\n if (!body || conversation?.id !== privateId || conversation?.buddyId !== this.#buddyId\n || !Array.isArray(body.messages) || typeof body.replying !== \"boolean\") {\n throw httpError(502, { error: \"MLB Server \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u79C1\u804A\u72B6\u6001\" });\n }\n this.#messages = Object.freeze(body.messages\n .map((item, index) => message(item, index))\n .filter((item): item is PreviewSimulatorMessage => item !== null));\n\n if (this.#active) {\n const replied = this.#messages.some((item) => item.role === \"assistant\"\n && Date.parse(item.createdAt) > this.#active!.messageTimestamp);\n // A visible message may be written between model/tool steps. Only MLB's\n // replying lifecycle can establish that the entire response has ended.\n if (body.replying) {\n this.#active = Object.freeze({ ...this.#active, observedReplying: true });\n this.#latest = Object.freeze({ runId: this.#active.runId, status: \"running\" as const });\n } else if (replied) {\n this.#latest = Object.freeze({ runId: this.#active.runId, status: \"completed\" as const });\n this.#active = undefined;\n this.#streaming = undefined;\n } else if (this.#active.observedReplying) {\n // MLB has no failure terminal event. replying on \u2192 off without a new\n // Assistant message means the local turn ended without a reply.\n this.#latest = Object.freeze({ runId: this.#active.runId, status: \"completed\" as const });\n this.#active = undefined;\n this.#streaming = undefined;\n }\n }\n\n return Object.freeze({\n messages: this.#messages,\n ...(this.#latest === undefined ? {} : { latestRun: this.#latest }),\n ...(this.#active === undefined\n ? {}\n : {\n activeRun: Object.freeze({\n runId: this.#active.runId,\n status: body.replying ? \"running\" as const : \"pending\" as const,\n }),\n }),\n ...(this.#streaming === undefined ? {} : { streaming: this.#streaming }),\n });\n }\n\n async send(\n input: { readonly text: string; readonly idempotencyKey: string },\n options: { readonly signal?: AbortSignal } = {},\n ): Promise<{ readonly messageId: string; readonly runId: string }> {\n if (typeof input.text !== \"string\" || !input.text.trim() || Buffer.byteLength(input.text, \"utf8\") > 32 * 1024) {\n throw new TypeError(\"message text is invalid\");\n }\n this.#assertResetComplete();\n const idempotencyKey = safeText(input.idempotencyKey, \"idempotencyKey\", 128);\n if (this.#lastSend?.key === idempotencyKey) {\n if (this.#lastSend.text !== input.text.trim()) throw httpError(409, { error: \"\u540C\u4E00\u6761\u6D88\u606F\u4E0D\u80FD\u6539\u5199\u5185\u5BB9\" });\n return this.#lastSend.receipt;\n }\n if (this.#sending) {\n throw Object.assign(new Error(\"\u6D88\u606F\u6B63\u5728\u53D1\u9001\"), {\n code: \"SEND_IN_PROGRESS\", status: 409, publicMessage: \"\u6D88\u606F\u6B63\u5728\u53D1\u9001\uFF0C\u8BF7\u7A0D\u5019\",\n });\n }\n this.#sending = true;\n try {\n const privateId = await this.#ensurePrivate(options.signal);\n // The browser's key may contain characters outside MLB's identifier alphabet.\n const clientMessageId = localReceipt(\"client\", idempotencyKey);\n let value: unknown;\n try {\n const url = endpoint(this.#baseUrl, \"/app/ws\");\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n value = await mlbAppCommand(url, this.#accessToken, \"message.send\", {\n kind: \"private\", id: privateId, messages: [{ type: \"text\", text: input.text }], clientMessageId,\n }, { signal: options.signal });\n const receipt = object(value);\n const items = Array.isArray(receipt?.items) ? receipt.items : [];\n const item = object(items[0]);\n if (receipt?.ok !== true || receipt.clientMessageId !== clientMessageId\n || items.length !== 1 || item?.index !== 0\n || typeof item.messageId !== \"string\" || !item.messageId.trim()\n || !Number.isSafeInteger(item.timestamp) || (item.timestamp as number) < 0\n || typeof receipt.shouldReply !== \"boolean\") {\n throw httpError(502, { error: \"MLB \u6D88\u606F\u56DE\u6267\u65E0\u6548\" });\n }\n safeText(item.messageId, \"receipt.items[0].messageId\", 256);\n } catch (cause) {\n if (cause && typeof cause === \"object\" && \"status\" in cause\n && typeof cause.status === \"number\" && cause.status >= 400 && cause.status < 500) throw cause;\n throw Object.assign(new Error(\"\u53D1\u9001\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0\u804A\u5929\u8BB0\u5F55\u540E\u518D\u91CD\u8BD5\"), {\n code: \"MLB_SEND_OUTCOME_UNKNOWN\", status: 502,\n publicMessage: \"\u53D1\u9001\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0\u804A\u5929\u8BB0\u5F55\u540E\u518D\u91CD\u8BD5\",\n });\n }\n const receipt = object(value)!;\n const item = object((receipt.items as unknown[])[0])!;\n // MLB streams are conversation-scoped, without a Runtime turn ID.\n // Additional messages share the current observation window and its one watcher.\n const runId = this.#active?.runId ?? localReceipt(\"turn\", idempotencyKey);\n const messageId = safeText(item.messageId, \"receipt.items[0].messageId\", 256);\n if (!this.#active) {\n this.#active = receipt.shouldReply ? Object.freeze({\n runId, messageTimestamp: item.timestamp as number, observedReplying: false,\n }) : undefined;\n this.#latest = Object.freeze({ runId, status: receipt.shouldReply ? \"pending\" as const : \"completed\" as const });\n this.#streaming = undefined;\n }\n const accepted = Object.freeze({ messageId, runId });\n this.#lastSend = { key: idempotencyKey, text: input.text.trim(), receipt: accepted };\n return accepted;\n } finally {\n this.#sending = false;\n }\n }\n\n #assertResetComplete(): void {\n if (this.#resetTarget) throw Object.assign(new Error(\"\u8BF7\u518D\u6B21\u70B9\u51FB\u6E05\u7A7A\u5BF9\u8BDD\uFF0C\u5B8C\u6210\u65B0\u4F1A\u8BDD\u521B\u5EFA\"), {\n code: \"RESET_INCOMPLETE\", status: 409,\n publicMessage: \"\u4F1A\u8BDD\u91CD\u7F6E\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u518D\u6B21\u70B9\u51FB\u300C\u6E05\u7A7A\u5BF9\u8BDD\u300D\u91CD\u8BD5\",\n });\n }\n\n async reset(options: { readonly signal?: AbortSignal } = {}): Promise<void> {\n if (this.#sending) throw httpError(409, { error: \"\u6D88\u606F\u6B63\u5728\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u6E05\u7A7A\" });\n if (!this.#resetTarget) {\n const privateId = await this.#ensurePrivate(options.signal);\n const current = object(await this.#request(\"GET\", `/app/privates/${encodeURIComponent(privateId)}`, options));\n const conversation = object(current?.private);\n if (conversation?.id !== privateId || conversation?.buddyId !== this.#buddyId || typeof current?.replying !== \"boolean\") {\n throw httpError(502, { error: \"\u65E0\u6CD5\u786E\u8BA4\u5F53\u524D\u79C1\u804A\u72B6\u6001\uFF0C\u672A\u6E05\u7A7A\u5BF9\u8BDD\" });\n }\n if (current.replying) throw httpError(409, { error: \"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u5B8C\u6210\u540E\u518D\u6E05\u7A7A\" });\n this.#resetTarget = privateId;\n }\n try {\n // MLB archives this conversation and invalidates its context and subscriptions.\n // DELETE is idempotent, so an unacknowledged request can be retried safely.\n if (!this.#resetArchived) {\n const receipt = object(await this.#request(\"DELETE\", `/app/privates/${encodeURIComponent(this.#resetTarget)}`, options));\n if (receipt?.ok !== true) throw httpError(502, { error: \"\u65E0\u6CD5\u786E\u8BA4\u65E7\u4F1A\u8BDD\u5DF2\u7ED3\u675F\" });\n this.#resetArchived = true;\n this.#privateId = undefined;\n }\n // POST is also idempotent. If its response is lost, a retry returns the same\n // new conversation instead of archiving it again or reviving the old one.\n const nextId = await this.#ensurePrivate(options.signal);\n if (nextId === this.#resetTarget) {\n this.#privateId = undefined;\n throw httpError(502, { error: \"MLB \u672A\u8FD4\u56DE\u65B0\u7684\u4F1A\u8BDD\u8EAB\u4EFD\" });\n }\n } catch (cause) {\n const detail = object(cause)?.publicMessage;\n throw Object.assign(new Error(\"\u4F1A\u8BDD\u91CD\u7F6E\u5C1A\u672A\u5B8C\u6210\", { cause }), {\n code: \"RESET_INCOMPLETE\", status: 502,\n publicMessage: `${this.#resetArchived ? \"\u65E7\u4F1A\u8BDD\u5DF2\u7ED3\u675F\uFF0C\u65B0\u4F1A\u8BDD\u521B\u5EFA\u672A\u5B8C\u6210\" : \"\u5C1A\u672A\u786E\u8BA4\u65E7\u4F1A\u8BDD\u5DF2\u7ED3\u675F\"}\uFF0C\u8BF7\u518D\u6B21\u70B9\u51FB\u300C\u6E05\u7A7A\u5BF9\u8BDD\u300D\u91CD\u8BD5\u3002${typeof detail === \"string\" ? `\uFF08${detail}\uFF09` : \"\"}`,\n });\n }\n this.#active = undefined;\n this.#latest = undefined;\n this.#streaming = undefined;\n this.#lastSend = undefined;\n this.#messages = Object.freeze([]);\n this.#resetTarget = undefined;\n this.#resetArchived = false;\n }\n\n async cancel(\n _runId: string,\n _options: { readonly signal?: AbortSignal } = {},\n ): Promise<{ readonly runId: string; readonly status: \"cancel_requested\" | \"already_terminal\" }> {\n throw Object.assign(new Error(\"\u5F53\u524D MLB \u534F\u8BAE\u5C1A\u672A\u63D0\u4F9B\u7EC8\u6B62\u56DE\u590D\u63A5\u53E3\"), {\n code: \"TURN_CANCEL_UNSUPPORTED\",\n status: 501,\n publicMessage: \"\u5F53\u524D\u7248\u672C\u6682\u4E0D\u652F\u6301\u7EC8\u6B62\u56DE\u590D\",\n });\n }\n\n async watchOutput(\n runId: string,\n options: {\n readonly signal?: AbortSignal;\n readonly onEvent: (event: PreviewSimulatorOutputEvent) => void | Promise<void>;\n },\n ): Promise<void> {\n const safeRunId = safeText(runId, \"runId\", 256);\n const privateId = await this.#ensurePrivate(options.signal);\n const url = endpoint(this.#baseUrl, \"/app/ws\");\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n let sequence = 0;\n let assistantIds = new Set(this.#messages.filter(message => message.role === \"assistant\").map(message => message.messageId));\n const reset = async () => {\n sequence = 0;\n this.#streaming = undefined;\n await options.onEvent({ type: \"reset\", runId: safeRunId });\n };\n // Bounded reconnection; every ready re-reads durable history, including the initial handshake.\n for (let reconnects = 0; !options.signal?.aborted; reconnects++) {\n try {\n for await (const frame of mlbAppEvents(url, this.#accessToken, {\n signal: options.signal,\n })) {\n const { data } = frame;\n if (frame.event === \"ready\") {\n await reset();\n } else if (data.kind !== \"private\" || data.id !== privateId || data.buddyId !== this.#buddyId) {\n continue;\n }\n if (frame.event === \"delta\" && typeof data.text === \"string\" && data.text.length > 0) {\n const text = `${this.#streaming?.runId === safeRunId ? this.#streaming.text : \"\"}${data.text}`;\n if (Buffer.byteLength(text, \"utf8\") > 48 * 1024) throw new MlbEventStreamError(\"MLB \u6D41\u5F0F\u56DE\u590D\u8D85\u8FC7\u5927\u5C0F\u9650\u5236\", 502, false);\n this.#streaming = Object.freeze({ runId: safeRunId, text, nextSequence: sequence + 1, updatedAt: new Date().toISOString() });\n await options.onEvent({ type: \"delta\", runId: safeRunId, sequence, text: data.text });\n sequence++;\n continue;\n }\n if (frame.event !== \"chat\" && frame.event !== \"ready\") continue;\n let state = await this.state({ signal: options.signal });\n const nextAssistantIds = new Set(state.messages.filter(message => message.role === \"assistant\").map(message => message.messageId));\n const committedReply = [...nextAssistantIds].some(id => !assistantIds.has(id));\n assistantIds = nextAssistantIds;\n if (committedReply && state.activeRun) {\n // One observation can contain several model replies (steering/tools).\n // The durable message replaces the partial bubble before the next delta.\n sequence = 0;\n this.#streaming = undefined;\n const { streaming: _streaming, ...snapshot } = state;\n state = snapshot;\n }\n if (state.latestRun?.runId === safeRunId && (state.latestRun.status === \"completed\" || state.latestRun.status === \"failed\")) {\n await options.onEvent({ type: state.latestRun.status, runId: safeRunId, status: state.latestRun.status });\n return;\n }\n await options.onEvent({ type: \"state\", runId: safeRunId, state, resetStreaming: committedReply });\n // A chat notification may be the user's own send. Pending alone is not a failure.\n }\n if (options.signal?.aborted) return;\n } catch (cause) {\n if (options.signal?.aborted) return;\n await reset();\n const status = object(cause)?.status;\n if ((cause instanceof MlbEventStreamError && !cause.retryable)\n || (typeof status === \"number\" && status >= 400 && status < 500 && status !== 429)\n || reconnects >= 4) throw cause;\n }\n await waitForRetry(Math.min(1_000, (reconnects + 1) * 150), options.signal);\n }\n }\n\n async #ensurePrivate(signal?: AbortSignal): Promise<string> {\n if (this.#privateId) return this.#privateId;\n if (!this.#privatePromise) {\n const pending = this.#request(\n \"POST\",\n \"/app/privates\",\n { signal, body: { buddyId: this.#buddyId } },\n ).then((value) => {\n const body = object(value);\n if (body?.ok !== true || typeof body.id !== \"string\" || !/^p_[a-zA-Z0-9_-]{1,253}$/u.test(body.id)) {\n throw httpError(502, { error: \"MLB \u521B\u5EFA\u79C1\u804A\u54CD\u5E94\u7F3A\u5C11\u6709\u6548\u7684 privateId\" });\n }\n this.#privateId = body.id;\n return body.id;\n }).finally(() => {\n if (this.#privatePromise === pending) this.#privatePromise = undefined;\n });\n this.#privatePromise = pending;\n }\n return this.#privatePromise;\n }\n\n async #request(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n options: {\n readonly signal?: AbortSignal;\n readonly body?: Record<string, unknown>;\n },\n ): Promise<unknown> {\n const headers = new Headers({\n Accept: \"application/json\",\n Authorization: `Bearer ${this.#accessToken}`,\n });\n if (options.body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n const response = await this.#fetch(endpoint(this.#baseUrl, path), {\n method,\n headers,\n ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),\n signal: AbortSignal.any([AbortSignal.timeout(30_000), ...(options.signal ? [options.signal] : [])]),\n redirect: \"error\",\n });\n const value = await response.json().catch(() => undefined);\n if (!response.ok) throw httpError(response.status, value);\n return value;\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { WebSocket } from \"ws\";\n\nexport interface MlbAppEvent {\n readonly event: string;\n readonly data: Record<string, unknown>;\n}\n\nexport class MlbEventStreamError extends Error {\n readonly code = \"MLB_EVENT_STREAM_FAILED\";\n readonly publicMessage: string;\n constructor(message: string, readonly status = 502, readonly retryable = true) {\n super(message);\n this.publicMessage = message;\n }\n}\n\nexport class MlbAppCommandError extends Error {\n readonly code = \"MLB_REQUEST_FAILED\";\n readonly publicMessage: string;\n constructor(message: string, readonly status = 502) {\n super(message);\n this.publicMessage = message;\n }\n}\n\nfunction appSocket(url: URL, token: string): WebSocket {\n return new WebSocket(url, {\n headers: { Authorization: `Bearer ${token}` },\n followRedirects: false,\n handshakeTimeout: 10_000,\n maxPayload: 64 * 1024,\n perMessageDeflate: false,\n });\n}\n\n/** Sends one native App WebSocket command and closes after its matching receipt. */\nexport async function mlbAppCommand(\n url: URL,\n token: string,\n method: string,\n params: Record<string, unknown>,\n options: { readonly signal?: AbortSignal } = {},\n): Promise<Record<string, unknown>> {\n if (options.signal?.aborted) throw options.signal.reason;\n const requestId = randomUUID();\n const socket = appSocket(url, token);\n return await new Promise<Record<string, unknown>>((resolve, reject) => {\n let settled = false;\n let ready = false;\n let sent = false;\n const cleanup = (): void => {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n if (socket.readyState !== WebSocket.CLOSED) socket.terminate();\n };\n const finish = (value: Record<string, unknown>): void => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const fail = (cause: unknown): void => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(cause);\n };\n const abort = (): void => fail(options.signal?.reason);\n const timer = setTimeout(() => fail(new MlbAppCommandError(\"MLB WebSocket \u547D\u4EE4\u7B49\u5F85\u8D85\u65F6\")), 30_000);\n timer.unref();\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n socket.on(\"error\", () => fail(new MlbAppCommandError(\"\u65E0\u6CD5\u8FDE\u63A5 MLB WebSocket\")));\n socket.on(\"unexpected-response\", (_request, response) => {\n const status = response.statusCode ?? 502;\n fail(new MlbAppCommandError(\n status === 401 ? \"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\" : `MLB WebSocket \u63E1\u624B\u5931\u8D25\uFF08HTTP ${status}\uFF09`,\n status,\n ));\n response.destroy();\n });\n socket.on(\"close\", (code) => fail(code === 4401\n ? new MlbAppCommandError(\"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\", 401)\n : new MlbAppCommandError(\"MLB WebSocket \u8FDE\u63A5\u4E2D\u65AD\")));\n socket.on(\"message\", (raw, binary) => {\n if (settled) return;\n try {\n if (binary) throw new Error(\"binary\");\n const bytes = Array.isArray(raw) ? Buffer.concat(raw) : Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n const frame = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n const data = frame.data;\n if (!frame || frame.v !== 1 || !data || typeof data !== \"object\" || Array.isArray(data)) {\n throw new Error(\"envelope\");\n }\n if (frame.type === \"event\") {\n if (!ready) {\n if (frame.event !== \"ready\" || (data as Record<string, unknown>).resync !== true\n || typeof (data as Record<string, unknown>).connectionId !== \"string\"\n || !(data as Record<string, unknown>).connectionId) throw new Error(\"ready required\");\n ready = true;\n if (!sent) {\n sent = true;\n socket.send(JSON.stringify({ v: 1, type: \"request\", requestId, method, params }));\n }\n }\n return;\n }\n if (frame.type !== \"response\" || !ready || frame.requestId !== requestId\n || !Number.isSafeInteger(frame.status) || (frame.status as number) < 100 || (frame.status as number) > 599) {\n throw new Error(\"response\");\n }\n const status = frame.status as number;\n if (status >= 200 && status < 300) {\n finish(data as Record<string, unknown>);\n return;\n }\n const serverMessage = (data as Record<string, unknown>).error;\n fail(new MlbAppCommandError(\n typeof serverMessage === \"string\" && serverMessage.trim()\n ? serverMessage.slice(0, 512)\n : status >= 500 ? \"MLB Server \u6682\u65F6\u4E0D\u53EF\u7528\" : \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\",\n status,\n ));\n } catch {\n fail(new MlbAppCommandError(\"MLB WebSocket \u8FD4\u56DE\u4E86\u65E0\u6548\u547D\u4EE4\u56DE\u6267\"));\n }\n });\n if (options.signal?.aborted) abort();\n });\n}\n\n/** One authenticated Node-side connection. No credentials or remote socket reach the browser. */\nexport async function* mlbAppEvents(\n url: URL,\n token: string,\n options: { readonly signal?: AbortSignal } = {},\n): AsyncGenerator<MlbAppEvent> {\n if (options.signal?.aborted) return;\n const socket = appSocket(url, token);\n const queue: Array<{ frame: MlbAppEvent; bytes: number }> = [];\n let queuedBytes = 0;\n let ready = false;\n let ended = false;\n let failure: MlbEventStreamError | undefined;\n let wake: (() => void) | undefined;\n const finish = (cause?: MlbEventStreamError) => {\n if (ended) return;\n ended = true;\n failure = cause;\n wake?.();\n };\n // A successful handshake without ready, or a silent broken connection, must not hang forever.\n let timer = setTimeout(() => finish(new MlbEventStreamError(\"MLB WebSocket \u672A\u5B8C\u6210\u521D\u59CB\u5316\")), 10_000);\n timer.unref();\n const heartbeat = () => {\n if (!ready || ended) return;\n clearTimeout(timer);\n timer = setTimeout(() => finish(new MlbEventStreamError(\"MLB WebSocket \u5FC3\u8DF3\u4E2D\u65AD\")), 60_000);\n timer.unref();\n };\n const abort = () => finish();\n socket.on(\"ping\", heartbeat); // ws automatically answers the server's ping with pong.\n socket.on(\"error\", () => finish(new MlbEventStreamError(\"\u65E0\u6CD5\u8FDE\u63A5 MLB WebSocket\")));\n socket.on(\"unexpected-response\", (_request, response) => {\n const status = response.statusCode ?? 502;\n finish(new MlbEventStreamError(\n status === 401 ? \"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\" : `MLB WebSocket \u63E1\u624B\u5931\u8D25\uFF08HTTP ${status}\uFF09`,\n status,\n status >= 500 || status === 429,\n ));\n response.destroy();\n });\n socket.on(\"close\", (code) => finish(code === 4401\n ? new MlbEventStreamError(\"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\", 401, false)\n : new MlbEventStreamError(\"MLB WebSocket \u8FDE\u63A5\u4E2D\u65AD\", 502, ![1002, 1003, 1007, 1008, 1009].includes(code))));\n socket.on(\"message\", (raw, binary) => {\n if (ended) return;\n try {\n if (binary) throw new Error(\"binary\");\n const bytes = Array.isArray(raw) ? Buffer.concat(raw) : Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n const frame = JSON.parse(bytes.toString(\"utf8\"));\n if (!frame || frame.v !== 1 || frame.type !== \"event\" || typeof frame.event !== \"string\"\n || !frame.data || typeof frame.data !== \"object\" || Array.isArray(frame.data)) throw new Error(\"envelope\");\n if (!ready && frame.event !== \"ready\") throw new Error(\"ready required\");\n if (frame.event === \"ready\" && (frame.data.resync !== true\n || typeof frame.data.connectionId !== \"string\" || !frame.data.connectionId)) throw new Error(\"invalid ready\");\n ready = true;\n heartbeat();\n queuedBytes += bytes.byteLength;\n if (queuedBytes > 1024 * 1024 || queue.length >= 1024) {\n finish(new MlbEventStreamError(\"MLB \u4E8B\u4EF6\u63A5\u6536\u79EF\u538B\uFF0C\u6B63\u5728\u91CD\u65B0\u540C\u6B65\"));\n return;\n }\n queue.push({ frame: { event: frame.event, data: frame.data }, bytes: bytes.byteLength });\n wake?.();\n } catch {\n finish(new MlbEventStreamError(\"MLB WebSocket \u8FD4\u56DE\u4E86\u65E0\u6548\u4E8B\u4EF6\", 502, false));\n }\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n try {\n while (!ended) {\n const item = queue.shift();\n if (item) {\n queuedBytes -= item.bytes;\n yield item.frame;\n } else {\n await new Promise<void>((resolve) => { wake = resolve; });\n wake = undefined;\n }\n }\n if (failure && !options.signal?.aborted) throw failure;\n } finally {\n ended = true;\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n // Keep the error listener while terminating a socket that may still be upgrading.\n if (socket.readyState !== WebSocket.CLOSED) socket.terminate();\n }\n}\n", "/** Public App-plane profile, not the /cli/buddies response containing a Buddy token. */\nexport interface PreviewBuddyDetails {\n readonly id: string;\n readonly isDev: boolean;\n readonly name: string;\n readonly avatar: string | null;\n /** Local browser-safe preview fetched from the platform, without exposing credentials. */\n readonly avatarPreview?: string | null;\n readonly tagline: string | null;\n readonly intro: string | null;\n readonly creatorUserId: string | null;\n readonly creatorUserName: string | null;\n readonly creatorUserAvatar: string | null;\n readonly privateId: string | null;\n readonly addedCount: number;\n}\n\nfunction invalid(): never {\n throw Object.assign(new Error(\"MLB \u8FD4\u56DE\u7684\u5F00\u53D1\u7248\u642D\u5B50\u8BE6\u60C5\u4E0D\u7B26\u5408\u63A5\u53E3\u7EA6\u5B9A\"), {\n code: \"BUDDY_DETAILS_INVALID\", status: 502,\n publicMessage: \"MLB \u8FD4\u56DE\u7684\u5F00\u53D1\u7248\u642D\u5B50\u8BE6\u60C5\u4E0D\u7B26\u5408\u63A5\u53E3\u7EA6\u5B9A\",\n });\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return invalid();\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, multiline = false): string {\n if (typeof value !== \"string\" || Buffer.byteLength(value) > 32 * 1024\n || (multiline ? /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/u : /[\\u0000-\\u001f\\u007f]/u).test(value)) return invalid();\n return value;\n}\n\nfunction nullableText(value: unknown, multiline = false): string | null {\n return value === null ? null : text(value, multiline);\n}\n\nexport function parsePreviewBuddyDetails(value: unknown, expectedId: string): PreviewBuddyDetails {\n const source = record(value);\n if (source.id !== expectedId || source.isDev !== true || typeof source.name !== \"string\" || !source.name.trim()\n || (source.privateId !== null && (typeof source.privateId !== \"string\" || !/^p_[a-zA-Z0-9_-]{1,253}$/u.test(source.privateId)))\n || !Number.isSafeInteger(source.addedCount) || (source.addedCount as number) < 0) return invalid();\n // Copy the public fields explicitly. Unexpected token/online fields must not\n // reach the browser or be mistaken for a documented App capability.\n return Object.freeze({\n id: expectedId, isDev: true, name: text(source.name),\n avatar: nullableText(source.avatar), tagline: nullableText(source.tagline), intro: nullableText(source.intro, true),\n creatorUserId: nullableText(source.creatorUserId), creatorUserName: nullableText(source.creatorUserName), creatorUserAvatar: nullableText(source.creatorUserAvatar),\n privateId: source.privateId as string | null, addedCount: source.addedCount as number,\n });\n}\n", "import { hostname } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { PreviewController } from \"./controller.js\";\nimport type { PreviewControlServer } from \"./server.js\";\n\ninterface Command { id: string; path: string; method: string; body?: string }\ninterface Reply { id: string; status: number; contentType: string; body: string }\nexport interface PreviewBridgeOptions {\n webUrl: URL; platformOrigin: string; buddyId: string; controller: PreviewController;\n localServer: PreviewControlServer; token: () => Promise<string>; signal: AbortSignal;\n onStatus?: (message: string) => void;\n}\n\n/** Outbound-only HTTPS transport; the browser never receives localhost or account credentials. */\nexport async function connectPreviewBridge(options: PreviewBridgeOptions) {\n const connectionId = randomBytes(32).toString(\"base64url\");\n const shutdown = new AbortController();\n const signal = AbortSignal.any([options.signal, shutdown.signal]);\n const running = new Map<string, Promise<void>>();\n const replies = new Map<string, Reply>();\n const completed = new Set<string>();\n let lastContact = Date.now();\n let stopping: Promise<unknown> | undefined;\n let interrupted = false;\n async function call(path: string, token: string, payload?: unknown, requestSignal = signal) {\n const response = await fetch(new URL(path, options.webUrl), {\n method: \"POST\", redirect: \"error\", signal: AbortSignal.any([requestSignal, AbortSignal.timeout(4000)]),\n headers: { Authorization: `Bearer ${token}`, \"Content-Type\": \"application/json\" }, body: JSON.stringify(payload ?? {}),\n });\n const value = await response.json() as { error?: string; reused?: boolean; liveEvents?: boolean; commands?: Command[]; acknowledged?: string[] };\n if (!response.ok) throw Object.assign(new Error(value.error || \"\u540E\u53F0\u8FDE\u63A5\u5931\u8D25\"), { status: response.status });\n return value;\n }\n const attach = async () => {\n const result = await call(\"api/preview/connect\", await options.token(), {\n connectionId, buddyId: options.buddyId, projectRoot: options.controller.projectRoot, machineName: hostname(), platformOrigin: options.platformOrigin,\n });\n lastContact = Date.now();\n return result;\n };\n // Bootstrap only the CLI's HTTP client. This capability never leaves this process.\n const bootstrap = await fetch(options.localServer.bootstrapUrl, { redirect: \"manual\", signal });\n const cookie = bootstrap.headers.get(\"set-cookie\")?.split(\";\", 1)[0];\n if (bootstrap.status !== 303 || !cookie) throw new Error(\"\u672C\u5730\u8C03\u8BD5\u670D\u52A1\u521D\u59CB\u5316\u5931\u8D25\");\n const initial = await attach();\n if (initial.reused) return { reused: true, completion: Promise.resolve(), async close() {} };\n // Event-driven outbound delivery is independent of the command polling loop.\n // Retain only the newest snapshot of each type while a request is in flight.\n const pendingEvents = new Map<string, { sequence: number; type: string; value: unknown }>();\n let eventSequence = 0;\n let publishing: Promise<void> | undefined;\n let retryEvents: ReturnType<typeof setTimeout> | undefined;\n const flushEvents = () => {\n if (!initial.liveEvents || signal.aborted || publishing || retryEvents || !pendingEvents.size) return;\n publishing = (async () => {\n while (!signal.aborted && pendingEvents.size) {\n const events = [...pendingEvents.values()].sort((a, b) => a.sequence - b.sequence);\n try {\n await call(\"api/preview/events\", connectionId, { events });\n for (const event of events) if (pendingEvents.get(event.type) === event) pendingEvents.delete(event.type);\n } catch {\n if (!signal.aborted) retryEvents = setTimeout(() => { retryEvents = undefined; flushEvents(); }, 500);\n break;\n }\n }\n })().finally(() => { publishing = undefined; });\n };\n const queueEvent = (type: string, value: unknown) => {\n if (!initial.liveEvents || signal.aborted) return;\n pendingEvents.set(type, { sequence: eventSequence++, type, value });\n flushEvents();\n };\n const snapshotEvents = () => {\n queueEvent(\"dev.state\", options.controller.state());\n queueEvent(\"simulator.state\", { state: options.controller.simulatorSnapshot() });\n };\n const unsubscribeDev = options.controller.subscribe(state => queueEvent(\"dev.state\", state));\n // Large diagnostic logs have their own read path; never send them with every token.\n const unsubscribeSimulator = options.controller.subscribeSimulator(({ state }) => queueEvent(\"simulator.state\", { state }));\n snapshotEvents();\n const watchdog = setInterval(() => {\n if (Date.now() - lastContact < 10_000 || stopping || interrupted) return;\n interrupted = true;\n // Stop DEV before the server lease can be claimed by another connector.\n stopping = options.controller.stop();\n void stopping.catch(() => shutdown.abort());\n options.onStatus?.(\"\u540E\u53F0\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u6B63\u5728\u505C\u6B62 DEV\uFF1B\u8FDE\u63A5\u6062\u590D\u540E\u53EF\u5728\u540E\u53F0\u91CD\u65B0\u542F\u52A8\u3002\");\n }, 500);\n watchdog.unref();\n async function execute(command: Command) {\n try {\n if (!command.path.startsWith(\"/api/\") || command.path === \"/api/events\" || command.path.includes(\"..\")) throw new Error(\"\u8C03\u8BD5\u8DEF\u5F84\u65E0\u6548\");\n const target = new URL(command.path, options.localServer.origin);\n if (target.origin !== options.localServer.origin.origin) throw new Error(\"\u8C03\u8BD5\u8DEF\u5F84\u65E0\u6548\");\n if ((await options.controller.project()).buddyId !== options.buddyId) throw new Error(\"\u5DE5\u7A0B buddyId \u5DF2\u6539\u53D8\uFF0C\u8BF7\u9000\u51FA CLI \u540E\u91CD\u65B0\u8FDE\u63A5\u5BF9\u5E94\u642D\u5B50\");\n signal.throwIfAborted();\n if (interrupted) throw new Error(\"\u672C\u5730\u8FDE\u63A5\u5DF2\u4E2D\u65AD\");\n const response = await fetch(target, {\n method: command.method, redirect: \"error\", signal: AbortSignal.any([signal, AbortSignal.timeout(28_000)]),\n headers: { Cookie: cookie!, ...(command.body ? { \"Content-Type\": \"application/json\" } : {}) },\n ...(command.body ? { body: command.body } : {}),\n });\n const chunks: Buffer[] = []; let size = 0;\n for await (const chunk of response.body ?? []) {\n size += chunk.length;\n if (size > 8 * 1024 * 1024) throw new Error(\"\u8C03\u8BD5\u54CD\u5E94\u8FC7\u5927\");\n chunks.push(Buffer.from(chunk));\n }\n replies.set(command.id, { id: command.id, status: response.status, contentType: response.headers.get(\"content-type\") ?? \"application/json\", body: Buffer.concat(chunks).toString(\"base64\") });\n } catch {\n replies.set(command.id, { id: command.id, status: 502, contentType: \"application/json\", body: Buffer.from(JSON.stringify({ error: { code: \"PREVIEW_LOCAL_FAILED\", message: \"\u672C\u5730\u8C03\u8BD5\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7EC8\u7AEF\u53CA\u5DE5\u7A0B buddyId\" } })).toString(\"base64\") });\n } finally { running.delete(command.id); }\n }\n const completion = (async () => {\n try {\n while (!signal.aborted) {\n try {\n if (stopping) { await stopping; stopping = undefined; }\n const result = await call(\"api/preview/poll\", connectionId, { replies: [...replies.values()].slice(0, 1) });\n lastContact = Date.now();\n const recovered = interrupted;\n if (stopping) { await stopping; stopping = undefined; }\n if (recovered) { interrupted = false; options.onStatus?.(\"\u5DF2\u91CD\u65B0\u8FDE\u63A5\u540E\u53F0\uFF0C\u8BF7\u5728\u5F00\u53D1\u8C03\u8BD5\u9875\u542F\u52A8 DEV\u3002\"); }\n for (const id of result.acknowledged ?? []) { replies.delete(id); completed.add(id); }\n while (completed.size > 256) completed.delete(completed.values().next().value!);\n for (const command of result.commands ?? []) {\n if (recovered && !running.has(command.id) && !replies.has(command.id) && !completed.has(command.id)) {\n replies.set(command.id, { id: command.id, status: 409, contentType: \"application/json\", body: Buffer.from(JSON.stringify({ error: { code: \"PREVIEW_RECONNECTED\", message: \"\u672C\u5730\u8FDE\u63A5\u5DF2\u6062\u590D\uFF0C\u8BF7\u91CD\u65B0\u64CD\u4F5C\" } })).toString(\"base64\") });\n }\n if (!running.has(command.id) && !replies.has(command.id) && !completed.has(command.id) && running.size < 32) running.set(command.id, execute(command));\n }\n } catch (cause) {\n if (signal.aborted) break;\n const status = (cause as { status?: number }).status;\n if (status === 410) {\n await options.controller.stop();\n if ((await attach()).reused) throw new Error(\"\u5F53\u524D\u5DE5\u7A0B\u5DF2\u6709\u5176\u4ED6 CLI \u8FDE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C preview \u6253\u5F00\u540E\u53F0\");\n snapshotEvents();\n }\n else if (status && status >= 400 && status < 500 && status !== 429) throw cause;\n }\n await delay(replies.size ? 20 : 500, undefined, { signal }).catch(() => undefined);\n }\n } finally {\n clearInterval(watchdog);\n unsubscribeDev(); unsubscribeSimulator();\n if (retryEvents) clearTimeout(retryEvents);\n shutdown.abort();\n await publishing;\n }\n })();\n // Keep errors observed while the host is opening the browser.\n void completion.catch(() => undefined);\n return {\n reused: false,\n completion,\n async close() {\n shutdown.abort();\n await completion.catch(() => undefined);\n await Promise.allSettled(running.values());\n await stopping;\n await options.controller.stop();\n await call(\"api/preview/disconnect\", connectionId, {}, AbortSignal.timeout(2000)).catch(() => undefined);\n },\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { readBuddyConfig, type BuddyConfig } from \"@buddy/cli-core/config\";\nimport type { PreviewBuddyDetails } from \"./buddy-details.js\";\nimport { createBuddyPreviewUrl } from \"./device-preview.js\";\nimport { RuntimeDiagnostics } from \"./runtime-diagnostics.js\";\n\nexport type PreviewDevPhase = \"idle\" | \"starting\" | \"reloading\" | \"reload_failed\" | \"ready\" | \"stopping\" | \"failed\";\n\nexport interface PreviewDevReadyInfo {\n readonly agentId?: string;\n readonly buddy?: PreviewBuddyDetails;\n readonly simulatorUrl?: string;\n readonly devicePairing?: {\n readonly url: string;\n readonly code?: string;\n readonly expiresAt?: string;\n };\n}\n\nexport interface PreviewWidgetOpenTarget {\n readonly version: 1;\n readonly entry: string;\n readonly resource?: { readonly module: string; readonly recordId: string };\n readonly state?: Readonly<Record<string, unknown>>;\n}\n\nexport interface PreviewWidget {\n readonly id: string;\n readonly type?: string;\n readonly title: string;\n readonly summary?: string;\n readonly imageMediaId?: string;\n readonly isPinned?: boolean;\n readonly creatorName?: string;\n readonly role?: \"owner\" | \"editor\" | \"viewer\";\n readonly openTarget?: PreviewWidgetOpenTarget;\n}\n\nexport interface PreviewSimulatorMessage {\n readonly widget?: PreviewWidget;\n readonly messageId: string;\n readonly role: \"user\" | \"assistant\";\n readonly text: string;\n readonly createdAt: string;\n}\n\nexport interface PreviewSimulatorState {\n /** Monotonic within this Preview controller, including resets and reconnect snapshots. */\n readonly stateRevision?: number;\n readonly conversationRevision?: number;\n readonly messages: readonly PreviewSimulatorMessage[];\n /** \u5F53\u524D\u5C1A\u672A\u5F62\u6210\u6B63\u5F0F Assistant \u6D88\u606F\u7684\u4E34\u65F6\u6D41\u5F0F\u6587\u5B57\uFF1B\u65AD\u7EBF\u540E\u4E0D\u80FD\u91CD\u653E\u3002 */\n readonly streaming?: {\n readonly runId: string;\n readonly text: string;\n readonly nextSequence: number;\n readonly updatedAt: string;\n };\n /** \u6700\u8FD1\u4E00\u6B21\u53D1\u9001\u7684\u89C2\u5BDF\u72B6\u6001\uFF1BMLB \u9002\u914D\u5668\u6839\u636E replying \u548C\u53EF\u89C1\u56DE\u590D\u63A8\u65AD\uFF0C\u4E0D\u7B49\u4E8E Runtime \u6267\u884C\u72B6\u6001\u3002 */\n readonly latestRun?: {\n readonly runId: string;\n readonly status: \"pending\" | \"running\" | \"cancel_requested\" | \"completed\" | \"failed\" | \"cancelled\";\n };\n readonly activeRun?: {\n readonly runId: string;\n readonly status: \"pending\" | \"running\" | \"cancel_requested\";\n };\n}\n\nexport type PreviewObservedRunStatus =\n | \"accepted\"\n | \"pending\"\n | \"running\"\n | \"cancel_requested\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface PreviewObservedRun {\n readonly runId: string;\n /** Stable display order within this preview service, not an MLB message sequence. */\n readonly ordinal?: number;\n readonly messageId?: string;\n readonly status: PreviewObservedRunStatus;\n readonly startedAt: string;\n readonly updatedAt: string;\n readonly completedAt?: string;\n readonly acceptLatencyMs?: number;\n readonly firstTextLatencyMs?: number;\n readonly responseTimeMs?: number;\n readonly completion?: \"reply\" | \"no_reply\";\n readonly error?: { readonly code: string; readonly message: string };\n}\n\nexport type PreviewSimulatorOutputEvent =\n | { readonly type: \"state\"; readonly runId: string; readonly state: PreviewSimulatorState; readonly resetStreaming?: boolean }\n | { readonly type: \"reset\"; readonly runId: string }\n | {\n readonly type: \"delta\";\n readonly runId: string;\n readonly sequence: number;\n readonly text: string;\n /** Exact execution identity echoed by the platform delta; not a send receipt. */\n readonly runtimeRunId?: string;\n }\n | {\n readonly type: \"completed\" | \"failed\" | \"cancelled\";\n readonly runId: string;\n readonly status: \"completed\" | \"failed\" | \"cancelled\";\n };\n\nexport interface PreviewDebugEvent {\n readonly eventId: string;\n readonly timestamp: string;\n readonly channel: \"dev\" | \"client\" | \"app_server\";\n readonly type: string;\n readonly summary: string;\n readonly runId?: string;\n readonly durationMs?: number;\n}\n\nexport interface PreviewDebugSnapshot {\n readonly source: \"observed\";\n readonly generatedAt: string;\n readonly runs: readonly PreviewObservedRun[];\n readonly events: readonly PreviewDebugEvent[];\n readonly messages: readonly PreviewSimulatorMessage[];\n readonly diagnostics: ReturnType<RuntimeDiagnostics[\"snapshot\"]>;\n}\n\nexport type PreviewDevicePairing =\n | {\n readonly status: \"ready\";\n readonly url: string;\n readonly code?: string;\n readonly expiresAt?: string;\n }\n | {\n readonly status: \"unavailable\";\n readonly reason: string;\n };\n\nexport interface PreviewSimulatorClient {\n widgets?(): Promise<readonly PreviewWidget[]>;\n widgetHtml?(id: string, openTarget?: PreviewWidgetOpenTarget): Promise<string>;\n pinWidget?(id: string, pinned: boolean): Promise<void>;\n deleteWidget?(id: string): Promise<void>;\n widgetImage?(id: string, mediaId: string): Promise<{ body: Uint8Array; contentType: string }>;\n state(options?: { readonly signal?: AbortSignal }): Promise<PreviewSimulatorState>;\n send(\n input: { readonly text: string; readonly idempotencyKey: string },\n options?: { readonly signal?: AbortSignal },\n ): Promise<{ readonly messageId: string; readonly runId: string }>;\n cancel(\n runId: string,\n options?: { readonly signal?: AbortSignal },\n ): Promise<{ readonly runId: string; readonly status: \"cancel_requested\" | \"already_terminal\" }>;\n /** Start an isolated conversation for the same development Buddy, with fresh context. */\n reset?(options?: { readonly signal?: AbortSignal }): Promise<void>;\n /** Watches live output; reset discards ephemeral deltas before restoring authoritative state. */\n watchOutput?(\n runId: string,\n options: {\n readonly signal?: AbortSignal;\n readonly onEvent: (event: PreviewSimulatorOutputEvent) => void | Promise<void>;\n },\n ): Promise<void>;\n}\n\nexport interface PreviewDevHandle {\n readonly closed: Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface PreviewDevStarter {\n start(options: {\n readonly projectRoot: string;\n readonly signal: AbortSignal;\n readonly onLifecycle?: (event: { readonly phase: \"reloading\" | \"reload_failed\" | \"ready\"; readonly error?: { readonly code: string; readonly message: string } }) => void;\n readonly onLog?: (event: { readonly source: \"agent.stdout\" | \"agent.stderr\"; readonly text: string }) => void;\n }): Promise<{\n readonly handle: PreviewDevHandle;\n readonly ready: PreviewDevReadyInfo;\n readonly simulator?: PreviewSimulatorClient;\n }>;\n}\n\nexport interface PreviewDevState {\n readonly phase: PreviewDevPhase;\n readonly revision: number;\n readonly ready?: PreviewDevReadyInfo;\n readonly error?: { readonly code: string; readonly message: string };\n}\n\nexport interface PreviewControllerOptions {\n readonly projectRoot: string;\n readonly devStarter: PreviewDevStarter;\n readonly readConfig?: (projectRoot: string) => Promise<BuddyConfig>;\n /** Read-only profile lookup; opening Preview does not start DEV or create a conversation. */\n readonly readBuddyDetails?: (buddyId: string) => Promise<PreviewBuddyDetails>;\n readonly now?: () => Date;\n}\n\ntype StateListener = (state: PreviewDevState) => void;\ntype SimulatorListener = (value: {\n readonly state: PreviewSimulatorState;\n readonly debug: PreviewDebugSnapshot;\n}) => void;\n\nconst TERMINAL_RUN_STATUSES = new Set<PreviewObservedRunStatus>([\"completed\", \"failed\", \"cancelled\"]);\n\nfunction publicFailure(cause: unknown): { code: string; message: string } {\n const publicMessage = (\n typeof cause === \"object\"\n && cause !== null\n && \"publicMessage\" in cause\n && typeof cause.publicMessage === \"string\"\n && cause.publicMessage.trim()\n && cause.publicMessage.length <= 512\n && !/[\\u0000-\\u001f\\u007f]/u.test(cause.publicMessage)\n ) ? cause.publicMessage : undefined;\n if (\n typeof cause === \"object\"\n && cause !== null\n && \"code\" in cause\n && typeof cause.code === \"string\"\n && cause.code.trim()\n ) {\n return { code: cause.code, message: publicMessage ?? \"DEV \u4F1A\u8BDD\u672A\u80FD\u5B8C\u6210\" };\n }\n return { code: \"DEV_START_FAILED\", message: \"DEV \u4F1A\u8BDD\u542F\u52A8\u5931\u8D25\" };\n}\n\nexport class PreviewController {\n readonly #projectRoot: string;\n readonly #devStarter: PreviewDevStarter;\n readonly #readConfig: (projectRoot: string) => Promise<BuddyConfig>;\n readonly #readBuddyDetails: PreviewControllerOptions[\"readBuddyDetails\"];\n readonly #now: () => Date;\n readonly #listeners = new Set<StateListener>();\n readonly #simulatorListeners = new Set<SimulatorListener>();\n readonly #runs = new Map<string, PreviewObservedRun>();\n readonly #outputWatchers = new Map<string, AbortController>();\n readonly #failedOutputRuns = new Set<string>();\n readonly #observedActiveRuns = new Set<string>();\n readonly #events: PreviewDebugEvent[] = [];\n readonly #diagnostics = new RuntimeDiagnostics();\n #runOrdinal = 0;\n #conversationRevision = 0;\n #simulatorRevision = 0;\n #resetting = false;\n #sendingMessage = false;\n\n get resetting(): boolean { return this.#resetting; }\n #state: PreviewDevState = Object.freeze({ phase: \"idle\", revision: 0 });\n #handle: PreviewDevHandle | undefined;\n #simulator: PreviewSimulatorClient | undefined;\n #startController: AbortController | undefined;\n #startPromise: Promise<PreviewDevState> | undefined;\n #stopPromise: Promise<PreviewDevState> | undefined;\n #messages: readonly PreviewSimulatorMessage[] = [];\n #simulatorState: PreviewSimulatorState = Object.freeze({ messages: Object.freeze([]) });\n #lastActiveRunId: string | undefined;\n #eventSequence = 0;\n\n constructor(options: PreviewControllerOptions) {\n this.#projectRoot = options.projectRoot;\n this.#devStarter = options.devStarter;\n this.#readConfig = options.readConfig ?? ((root) => readBuddyConfig(root));\n this.#readBuddyDetails = options.readBuddyDetails;\n this.#now = options.now ?? (() => new Date());\n }\n\n get projectRoot(): string {\n return this.#projectRoot;\n }\n\n state(): PreviewDevState {\n return this.#state;\n }\n\n async project(): Promise<BuddyConfig> {\n return this.#readConfig(this.#projectRoot);\n }\n\n async buddyDetails(): Promise<PreviewBuddyDetails | null> {\n if (!this.#readBuddyDetails) return this.#state.ready?.buddy ?? null;\n const config = await this.project();\n return this.#readBuddyDetails(config.buddyId);\n }\n\n subscribe(listener: StateListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n subscribeSimulator(listener: SimulatorListener): () => void {\n this.#simulatorListeners.add(listener);\n return () => this.#simulatorListeners.delete(listener);\n }\n\n simulatorSnapshot(): PreviewSimulatorState {\n return Object.freeze({ ...this.#simulatorState, conversationRevision: this.#conversationRevision, stateRevision: this.#simulatorRevision });\n }\n\n #closed = false;\n\n start(): Promise<PreviewDevState> {\n if (this.#closed) return Promise.reject(Object.assign(new Error(\"\u672C\u5730\u8FDE\u63A5\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C\u8FDE\u63A5\u6307\u4EE4\"), { code: \"PREVIEW_CLOSED\", status: 409 }));\n if (this.#startPromise) return this.#startPromise;\n if (this.#handle) return Promise.resolve(this.#state);\n if (this.#state.phase === \"stopping\") {\n return Promise.reject(Object.assign(new Error(\"DEV \u4F1A\u8BDD\u6B63\u5728\u505C\u6B62\"), { code: \"DEV_STOPPING\" }));\n }\n\n const controller = new AbortController();\n this.#diagnostics.boundary();\n this.#startController = controller;\n this.#record({ channel: \"dev\", type: \"dev.start_requested\", summary: \"\u8BF7\u6C42\u542F\u52A8 DEV \u4F1A\u8BDD\" });\n this.#setState({ phase: \"starting\" });\n const startPromise = this.#devStarter\n .start({\n projectRoot: this.#projectRoot,\n signal: controller.signal,\n onLifecycle: ({ phase, error }) => {\n if (controller.signal.aborted || !this.#handle || this.#state.phase === \"stopping\") return;\n if (phase === \"reloading\") this.#stopOutputWatchers();\n this.#record({ channel: \"dev\", type: `dev.${phase}`, summary: phase === \"reloading\" ? \"\u672C\u5730\u6587\u4EF6\u5DF2\u4FEE\u6539\uFF0C\u6B63\u5728\u91CD\u8F7D\uFF1B\u5F53\u524D\u56DE\u590D\u53EF\u80FD\u4E2D\u65AD\" : phase === \"reload_failed\" ? error?.message ?? \"\u91CD\u8F7D\u5931\u8D25\uFF0C\u4FEE\u6B63\u6587\u4EF6\u540E\u81EA\u52A8\u91CD\u8BD5\" : \"\u91CD\u8F7D\u5B8C\u6210\uFF0CDEV \u5DF2\u5C31\u7EEA\" });\n this.#setState({ phase, ready: this.#state.ready, ...(error ? { error } : {}) });\n },\n onLog: ({ source, text }) => {\n if (controller.signal.aborted) return;\n this.#diagnostics.write(source, text, this.#now().toISOString());\n // Legacy events keep a small summary; complete records live in diagnostics.\n this.#record({ channel: \"dev\", type: source, summary: text.slice(0, 512) });\n this.#notifySimulator();\n },\n })\n .then(({ handle, ready, simulator }) => {\n if (controller.signal.aborted) {\n return handle.close().then(() => this.#setState({ phase: \"idle\" }));\n }\n this.#handle = handle;\n this.#simulator = simulator;\n this.#record({\n channel: \"dev\",\n type: \"dev.ready\",\n summary: ready.agentId ? `Agent ${ready.agentId} \u5DF2\u5C31\u7EEA` : \"Agent \u5DF2\u5C31\u7EEA\",\n });\n void handle.closed.then(\n () => {\n if (this.#handle === handle) {\n this.#handle = undefined;\n this.#simulator = undefined;\n this.#stopOutputWatchers();\n this.#record({ channel: \"dev\", type: \"dev.closed\", summary: \"DEV \u4F1A\u8BDD\u5DF2\u7ED3\u675F\" });\n this.#setState({ phase: \"idle\" });\n }\n },\n (cause: unknown) => {\n if (this.#handle === handle) {\n this.#handle = undefined;\n this.#simulator = undefined;\n this.#stopOutputWatchers();\n this.#record({ channel: \"dev\", type: \"dev.failed\", summary: \"DEV \u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F\" });\n this.#setState({ phase: \"failed\", error: publicFailure(cause) });\n }\n },\n );\n return this.#setState({ phase: \"ready\", ready });\n })\n .catch((cause: unknown) => {\n if (controller.signal.aborted) return this.#setState({ phase: \"idle\" });\n this.#record({ channel: \"dev\", type: \"dev.start_failed\", summary: \"DEV \u4F1A\u8BDD\u542F\u52A8\u5931\u8D25\" });\n return this.#setState({ phase: \"failed\", error: publicFailure(cause) });\n })\n .finally(() => {\n if (this.#startController === controller) this.#startController = undefined;\n if (this.#startPromise === startPromise) this.#startPromise = undefined;\n });\n this.#startPromise = startPromise;\n return startPromise;\n }\n\n stop(): Promise<PreviewDevState> {\n if (this.#stopPromise) return this.#stopPromise;\n const stopping = this.#stop();\n this.#stopPromise = stopping;\n const clear = () => { if (this.#stopPromise === stopping) this.#stopPromise = undefined; };\n void stopping.then(clear, clear);\n return stopping;\n }\n\n async #stop(): Promise<PreviewDevState> {\n if (this.#state.phase === \"idle\") return this.#state;\n if (this.#state.phase === \"stopping\") return this.#state;\n\n this.#setState({ phase: \"stopping\" });\n this.#record({ channel: \"dev\", type: \"dev.stop_requested\", summary: \"\u8BF7\u6C42\u505C\u6B62 DEV \u4F1A\u8BDD\" });\n this.#startController?.abort(new Error(\"Preview requested DEV stop\"));\n const handle = this.#handle;\n this.#handle = undefined;\n this.#simulator = undefined;\n this.#stopOutputWatchers();\n try {\n if (handle) await handle.close();\n if (this.#startPromise) await this.#startPromise.catch(() => undefined);\n this.#record({ channel: \"dev\", type: \"dev.stopped\", summary: \"DEV \u4F1A\u8BDD\u5DF2\u505C\u6B62\" });\n return this.#setState({ phase: \"idle\" });\n } catch (cause) {\n this.#setState({ phase: \"failed\", error: publicFailure(cause) });\n throw cause;\n }\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.stop();\n this.#listeners.clear();\n this.#simulatorListeners.clear();\n }\n\n async simulatorState(signal?: AbortSignal): Promise<PreviewSimulatorState> {\n if (this.#resetting) return this.simulatorSnapshot();\n const simulator = this.#requiredSimulator();\n const revision = this.#conversationRevision;\n const state = await simulator.state({ signal });\n if (!this.#resetting && revision === this.#conversationRevision && simulator === this.#simulator) {\n this.#observeSimulatorState(state);\n }\n return this.simulatorSnapshot();\n }\n\n /** Never allow an old conversation's delayed widget response to enter the new one. */\n async simulatorWidgets(action: \"list\" | \"html\" | \"pin\" | \"unpin\" | \"image\" | \"delete\", id = \"\", mediaId = \"\", messageId?: string): Promise<unknown> {\n if (this.#resetting) throw Object.assign(new Error(\"\u4F1A\u8BDD\u6B63\u5728\u91CD\u7F6E\"), { status: 409 });\n const client = this.#requiredSimulator();\n const revision = this.#conversationRevision;\n let result: unknown;\n if (action === \"list\" && client.widgets) result = { widgets: await client.widgets(), conversationRevision: revision, capabilities: { documentLifecycle: true, deleteWidget: Boolean(client.deleteWidget) } };\n else if (action === \"html\" && client.widgetHtml) {\n // Keep targets attached to messages, not Widget IDs. Re-read this conversation\n // so the iframe URL contains only a message ID, never arbitrary H5 state or URLs.\n let target: PreviewWidgetOpenTarget | undefined;\n if (messageId !== undefined) {\n const state = await client.state();\n const message = state.messages.find(item => item.messageId === messageId && item.widget?.id === id);\n if (!message?.widget) throw Object.assign(new Error(\"\u8FD9\u6761\u5C0F\u6302\u4EF6\u6D88\u606F\u5DF2\u4E0D\u53EF\u7528\uFF0C\u8BF7\u5237\u65B0\u5BF9\u8BDD\u540E\u91CD\u8BD5\"), { status: 404 });\n target = message.widget.openTarget;\n }\n if (this.#resetting || revision !== this.#conversationRevision || client !== this.#simulator) throw Object.assign(new Error(\"\u4F1A\u8BDD\u5DF2\u5207\u6362\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u5C0F\u6302\u4EF6\"), { status: 409 });\n result = await client.widgetHtml(id, target);\n }\n else if (action === \"delete\" && client.deleteWidget) { await client.deleteWidget(id); result = { ok: true }; }\n else if (action === \"image\" && client.widgetImage) result = await client.widgetImage(id, mediaId);\n else if ((action === \"pin\" || action === \"unpin\") && client.pinWidget) { await client.pinWidget(id, action === \"pin\"); result = { ok: true }; }\n else throw Object.assign(new Error(\"\u5F53\u524D\u6A21\u62DF\u5668\u4E0D\u652F\u6301\u5C0F\u6302\u4EF6\"), { status: 501 });\n if (this.#resetting || revision !== this.#conversationRevision || client !== this.#simulator) throw Object.assign(new Error(\"\u4F1A\u8BDD\u5DF2\u5207\u6362\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u5C0F\u6302\u4EF6\"), { status: 409 });\n return result;\n }\n\n async resetSimulator(): Promise<PreviewSimulatorState> {\n if (this.#resetting || this.#sendingMessage || this.#simulatorState.activeRun) {\n throw Object.assign(new Error(\"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u6216\u64CD\u4F5C\u5B8C\u6210\u540E\u518D\u6E05\u7A7A\"), { status: 409, code: \"SIMULATOR_BUSY\" });\n }\n const simulator = this.#requiredSimulator();\n if (!simulator.reset) {\n throw Object.assign(new Error(\"\u5F53\u524D\u5E73\u53F0\u6682\u4E0D\u652F\u6301\u6E05\u7A7A\u5BF9\u8BDD\"), { status: 501, code: \"RESET_UNSUPPORTED\", publicMessage: \"\u5F53\u524D\u5E73\u53F0\u6682\u4E0D\u652F\u6301\u6E05\u7A7A\u5BF9\u8BDD\" });\n }\n this.#resetting = true;\n try {\n await simulator.reset();\n this.#conversationRevision++;\n this.#stopOutputWatchers();\n this.#runs.clear();\n this.#observedActiveRuns.clear();\n this.#events.length = 0;\n this.#diagnostics.clear();\n this.#runOrdinal = 0;\n this.#lastActiveRunId = undefined;\n this.#messages = Object.freeze([]);\n this.#simulatorState = Object.freeze({ messages: this.#messages });\n this.#notifySimulator();\n // The new conversation identity isolates Runtime context; keep DEV online\n // so the welcome event for this conversation can finish normally.\n return this.simulatorSnapshot();\n } finally {\n this.#resetting = false;\n }\n }\n\n async sendSimulatorMessage(\n input: { readonly text: string; readonly idempotencyKey: string },\n signal?: AbortSignal,\n ): Promise<{ readonly messageId: string; readonly runId: string }> {\n if (this.#resetting || this.#sendingMessage) throw Object.assign(new Error(\"\u6A21\u62DF\u5668\u6B63\u5728\u5904\u7406\u5176\u4ED6\u64CD\u4F5C\"), { status: 409, code: \"SIMULATOR_BUSY\" });\n this.#sendingMessage = true;\n try {\n const started = this.#now();\n this.#record({ channel: \"client\", type: \"message.send\", summary: \"\u53D1\u9001\u4E00\u6761\u79C1\u804A\u6D88\u606F\" });\n const accepted = await this.#requiredSimulator().send(input, { signal });\n if (this.#runs.has(accepted.runId)) {\n // A new send can join the current conversation-level observation window.\n // Keep its stream, timing origin and subscription; retries add no duplicate.\n if (this.#simulatorState.activeRun?.runId === accepted.runId\n && !this.#simulatorState.messages.some(message => message.messageId === accepted.messageId)) {\n this.#record({ channel: \"app_server\", type: \"message.accepted\", summary: \"\u8FFD\u52A0\u6D88\u606F\u5DF2\u63A5\u6536\",\n runId: accepted.runId, durationMs: Math.max(0, this.#now().getTime() - started.getTime()) });\n this.#simulatorState = Object.freeze({ ...this.#simulatorState,\n messages: Object.freeze([...this.#simulatorState.messages, Object.freeze({\n messageId: accepted.messageId, role: \"user\" as const, text: input.text, createdAt: this.#now().toISOString(),\n })]),\n });\n this.#messages = this.#simulatorState.messages;\n this.#notifySimulator();\n }\n return accepted;\n }\n const acceptedAt = this.#now();\n const latency = Math.max(0, acceptedAt.getTime() - started.getTime());\n this.#upsertRun({\n runId: accepted.runId,\n messageId: accepted.messageId,\n status: \"accepted\",\n startedAt: started.toISOString(),\n updatedAt: acceptedAt.toISOString(),\n acceptLatencyMs: latency,\n });\n this.#lastActiveRunId = accepted.runId;\n this.#record({\n channel: \"app_server\",\n type: \"run.accepted\",\n summary: \"App Server \u5DF2\u63A5\u53D7\u6D88\u606F\uFF0C\u5DF2\u8BB0\u5F55\u53D1\u9001\u56DE\u6267\",\n runId: accepted.runId,\n durationMs: latency,\n });\n this.#simulatorState = Object.freeze({\n messages: Object.freeze([\n ...this.#simulatorState.messages.filter((message) => message.messageId !== accepted.messageId),\n Object.freeze({\n messageId: accepted.messageId,\n role: \"user\" as const,\n text: input.text,\n createdAt: acceptedAt.toISOString(),\n }),\n ]),\n latestRun: Object.freeze({ runId: accepted.runId, status: \"pending\" as const }),\n activeRun: Object.freeze({ runId: accepted.runId, status: \"pending\" as const }),\n });\n this.#messages = this.#simulatorState.messages;\n this.#notifySimulator();\n this.#startOutputWatcher(this.#requiredSimulator(), accepted.runId);\n return accepted;\n } finally { this.#sendingMessage = false; }\n }\n\n async cancelSimulatorRun(\n runId: string,\n signal?: AbortSignal,\n ): Promise<{ readonly runId: string; readonly status: \"cancel_requested\" | \"already_terminal\" }> {\n this.#record({\n channel: \"client\",\n type: \"run.cancel_requested\", // Local debug event, not an MLB SSE event.\n summary: \"\u5F00\u53D1\u8005\u8BF7\u6C42\u505C\u6B62\u5F53\u524D\u56DE\u590D\",\n runId,\n });\n const result = await this.#requiredSimulator().cancel(runId, { signal });\n if (result.status === \"cancel_requested\") {\n this.#updateRunStatus(runId, \"cancel_requested\");\n if (this.#simulatorState.activeRun?.runId === runId) {\n this.#simulatorState = Object.freeze({\n messages: this.#simulatorState.messages,\n latestRun: Object.freeze({ runId, status: \"cancel_requested\" as const }),\n activeRun: Object.freeze({ runId, status: \"cancel_requested\" as const }),\n ...(this.#simulatorState.streaming?.runId === runId\n ? { streaming: this.#simulatorState.streaming }\n : {}),\n });\n }\n }\n this.#record({\n channel: \"app_server\",\n type: `run.${result.status}`,\n summary: result.status === \"cancel_requested\" ? \"App Server \u5DF2\u63A5\u53D7\u505C\u6B62\u8BF7\u6C42\" : \"Run \u5DF2\u7ECF\u7ED3\u675F\",\n runId,\n });\n if (result.status === \"already_terminal\") {\n // The terminal transition can win the race with the stop click. Read the\n // authoritative state now so the UI never changes a completed Run back\n // to `cancel_requested` while waiting for the next poll.\n await this.simulatorState(signal).catch(() => this.#notifySimulator());\n } else {\n this.#notifySimulator();\n }\n return result;\n }\n\n debugSnapshot(): PreviewDebugSnapshot {\n return Object.freeze({\n source: \"observed\",\n generatedAt: this.#now().toISOString(),\n runs: Object.freeze([...this.#runs.values()].reverse()),\n events: Object.freeze([...this.#events].reverse()),\n messages: Object.freeze([...this.#messages]),\n diagnostics: this.#diagnostics.snapshot(),\n });\n }\n\n devicePairing(): PreviewDevicePairing {\n const pairing = this.#state.phase === \"ready\" ? this.#state.ready?.devicePairing : undefined;\n if (pairing) {\n try {\n if (\n pairing.url === createBuddyPreviewUrl(this.#state.ready?.agentId ?? \"\")\n && pairing.url.length <= 2_048\n && (pairing.code === undefined || /^[A-Z0-9-]{4,32}$/iu.test(pairing.code))\n && (pairing.expiresAt === undefined || Number.isFinite(Date.parse(pairing.expiresAt)))\n ) {\n return Object.freeze({\n status: \"ready\" as const,\n url: pairing.url,\n ...(pairing.code === undefined ? {} : { code: pairing.code }),\n ...(pairing.expiresAt === undefined ? {} : { expiresAt: pairing.expiresAt }),\n });\n }\n } catch {\n // Invalid starter output is treated as unavailable instead of reaching the browser.\n }\n }\n return Object.freeze({\n status: \"unavailable\" as const,\n reason: this.#state.phase !== \"ready\"\n ? \"\u8BF7\u5148\u542F\u52A8 DEV \u4F1A\u8BDD\"\n : pairing\n ? \"\u5F53\u524D DEV \u73AF\u5883\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u771F\u673A\u5165\u53E3\"\n : \"\u5F53\u524D DEV \u4F1A\u8BDD\u5C1A\u672A\u63D0\u4F9B\u642D\u642D App \u9884\u89C8\u94FE\u63A5\",\n });\n }\n\n #requiredSimulator(): PreviewSimulatorClient {\n if (this.#state.phase !== \"ready\" || !this.#simulator) {\n throw Object.assign(new Error(\"\u6A21\u62DF\u5668\u9700\u8981\u5148\u542F\u52A8 DEV \u4F1A\u8BDD\"), {\n code: \"SIMULATOR_NOT_READY\",\n status: 409,\n publicMessage: \"\u8BF7\u5148\u542F\u52A8 DEV \u4F1A\u8BDD\",\n });\n }\n return this.#simulator;\n }\n\n #observeSimulatorState(state: PreviewSimulatorState): PreviewSimulatorState {\n const previousStreaming = this.#simulatorState.streaming;\n const incomingActiveRun = state.activeRun;\n const existingActiveRun = incomingActiveRun ? this.#runs.get(incomingActiveRun.runId) : undefined;\n if (existingActiveRun && TERMINAL_RUN_STATUSES.has(existingActiveRun.status)) {\n // A state GET may have started before the terminal event and arrive after\n // it. A stale non-terminal snapshot must not resurrect a finished Run or\n // put its already-final reply back into the temporary partial bubble.\n this.#notifySimulator();\n return this.#simulatorState;\n }\n let streaming = state.streaming\n ?? (incomingActiveRun?.runId === previousStreaming?.runId ? previousStreaming : undefined);\n if (streaming && previousStreaming?.runId === streaming.runId) {\n if (streaming.nextSequence < previousStreaming.nextSequence) {\n streaming = previousStreaming;\n } else if (\n streaming.nextSequence === previousStreaming.nextSequence\n && streaming.text !== previousStreaming.text\n ) {\n throw Object.assign(new Error(\"App Server \u6539\u5199\u4E86\u5DF2\u89C2\u5BDF\u5230\u7684\u6D41\u5F0F\u6587\u5B57\"), {\n code: \"OUTPUT_STREAM_PROTOCOL_ERROR\",\n publicMessage: \"App Server \u8FD4\u56DE\u4E86\u4E0D\u4E00\u81F4\u7684\u6D41\u5F0F\u72B6\u6001\",\n });\n } else if (\n streaming.nextSequence > previousStreaming.nextSequence\n && !streaming.text.startsWith(previousStreaming.text)\n ) {\n throw Object.assign(new Error(\"App Server \u6539\u5199\u4E86\u5DF2\u89C2\u5BDF\u5230\u7684\u6D41\u5F0F\u6587\u5B57\"), {\n code: \"OUTPUT_STREAM_PROTOCOL_ERROR\",\n publicMessage: \"App Server \u8FD4\u56DE\u4E86\u4E0D\u4E00\u81F4\u7684\u6D41\u5F0F\u72B6\u6001\",\n });\n }\n }\n this.#simulatorState = Object.freeze({\n messages: Object.freeze([...state.messages]),\n ...(state.latestRun === undefined ? {} : { latestRun: Object.freeze({ ...state.latestRun }) }),\n ...(state.activeRun === undefined ? {} : { activeRun: Object.freeze({ ...state.activeRun }) }),\n ...(streaming === undefined ? {} : { streaming: Object.freeze({ ...streaming }) }),\n });\n this.#messages = this.#simulatorState.messages;\n const now = this.#now();\n const active = this.#simulatorState.activeRun;\n if (active) {\n this.#observedActiveRuns.add(active.runId);\n const existing = this.#runs.get(active.runId);\n const restoredFirstTextLatency = existing?.firstTextLatencyMs\n ?? (this.#simulatorState.streaming?.runId === active.runId\n && this.#simulatorState.streaming.nextSequence > 0\n && this.#simulatorState.streaming.text.length > 0\n ? Math.max(0, now.getTime() - Date.parse(existing?.startedAt ?? now.toISOString()))\n : undefined);\n this.#upsertRun({\n runId: active.runId,\n ...(existing?.messageId ? { messageId: existing.messageId } : {}),\n status: active.status,\n startedAt: existing?.startedAt ?? now.toISOString(),\n updatedAt: now.toISOString(),\n ...(existing?.acceptLatencyMs === undefined ? {} : { acceptLatencyMs: existing.acceptLatencyMs }),\n ...(restoredFirstTextLatency === undefined ? {} : { firstTextLatencyMs: restoredFirstTextLatency }),\n });\n if (existing?.firstTextLatencyMs === undefined && restoredFirstTextLatency !== undefined) {\n this.#record({\n channel: \"app_server\",\n type: \"run.output.restored\",\n summary: \"\u4ECE App Server \u72B6\u6001\u6062\u590D\u5F53\u524D\u6D41\u5F0F\u6587\u5B57\",\n runId: active.runId,\n durationMs: restoredFirstTextLatency,\n });\n }\n if (this.#lastActiveRunId !== active.runId || existing?.status !== active.status) {\n this.#record({\n channel: \"app_server\",\n type: `run.${active.status}`,\n summary: active.status === \"pending\" ? \"Run \u6B63\u5728\u7B49\u5F85 Agent\" : \"Agent \u6B63\u5728\u5904\u7406 Run\",\n runId: active.runId,\n });\n }\n this.#lastActiveRunId = active.runId;\n if (this.#simulator) this.#startOutputWatcher(this.#simulator, active.runId);\n this.#notifySimulator();\n return this.#simulatorState;\n }\n\n if (!this.#lastActiveRunId) {\n this.#notifySimulator();\n return this.#simulatorState;\n }\n const runId = this.#lastActiveRunId;\n const existing = this.#runs.get(runId);\n if (existing && ![\"completed\", \"failed\", \"cancelled\"].includes(existing.status)) {\n const assistant = [...this.#simulatorState.messages]\n .reverse()\n .find((message) => message.role === \"assistant\" && Date.parse(message.createdAt) >= Date.parse(existing.startedAt));\n const elapsed = Math.max(0, now.getTime() - Date.parse(existing.startedAt));\n const terminalStatus = this.#simulatorState.latestRun?.runId === runId\n && (this.#simulatorState.latestRun.status === \"completed\" || this.#simulatorState.latestRun.status === \"failed\" || this.#simulatorState.latestRun.status === \"cancelled\")\n ? this.#simulatorState.latestRun.status\n : undefined;\n if (!assistant && !terminalStatus && !this.#observedActiveRuns.has(runId) && elapsed < 5_000) {\n this.#notifySimulator();\n return this.#simulatorState;\n }\n const completedAt = assistant && Number.isFinite(Date.parse(assistant.createdAt))\n ? new Date(assistant.createdAt)\n : now;\n const status = terminalStatus ?? \"completed\";\n this.#upsertRun({\n ...existing,\n status,\n updatedAt: now.toISOString(),\n completedAt: completedAt.toISOString(),\n responseTimeMs: Math.max(0, completedAt.getTime() - Date.parse(existing.startedAt)),\n completion: assistant ? \"reply\" : \"no_reply\",\n });\n this.#record({\n channel: \"app_server\",\n type: `run.${status}`,\n summary: assistant\n ? \"\u5B8C\u6574\u56DE\u590D\u5DF2\u8FD4\u56DE\uFF0C\u672C\u5730\u56DE\u5408\u7ED3\u675F\"\n : status === \"failed\"\n ? \"Agent \u672C\u5730\u56DE\u5408\u6267\u884C\u5931\u8D25\uFF0C\u672A\u4EA7\u751F\u7528\u6237\u56DE\u590D\"\n : status === \"cancelled\"\n ? \"Agent \u672C\u5730\u56DE\u5408\u5DF2\u53D6\u6D88\uFF0C\u672A\u5B8C\u6210\u56DE\u590D\u5DF2\u4F5C\u5E9F\"\n : \"\u672C\u5730\u56DE\u5408\u5DF2\u7ED3\u675F\uFF0C\u672A\u89C2\u5BDF\u5230\u65B0\u7684\u5B8C\u6574\u56DE\u590D\",\n runId,\n durationMs: Math.max(0, completedAt.getTime() - Date.parse(existing.startedAt)),\n });\n this.#stopOutputWatcher(runId);\n }\n this.#observedActiveRuns.delete(runId);\n this.#lastActiveRunId = undefined;\n this.#notifySimulator();\n return this.#simulatorState;\n }\n\n #startOutputWatcher(simulator: PreviewSimulatorClient, runId: string): void {\n if (!simulator.watchOutput || this.#outputWatchers.has(runId) || this.#failedOutputRuns.has(runId)) return;\n const controller = new AbortController();\n this.#outputWatchers.set(runId, controller);\n void simulator.watchOutput(runId, {\n signal: controller.signal,\n onEvent: (event) => {\n if (controller.signal.aborted || this.#resetting || simulator !== this.#simulator) return;\n return this.#observeOutputEvent(event);\n },\n }).catch((cause: unknown) => {\n if (controller.signal.aborted) return;\n this.#failedOutputRuns.add(runId);\n this.#record({\n channel: \"app_server\",\n type: \"run.output.disconnected\",\n summary: cause && typeof cause === \"object\" && \"status\" in cause && cause.status === 401\n ? \"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\"\n : \"\u6D41\u5F0F\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6A21\u62DF\u5668\u5C06\u4F7F\u7528 App Server \u72B6\u6001\u6062\u590D\",\n runId,\n });\n this.#notifySimulator();\n void this.simulatorState().catch(() => undefined);\n }).finally(() => {\n if (this.#outputWatchers.get(runId) === controller) this.#outputWatchers.delete(runId);\n });\n }\n\n async #observeOutputEvent(event: PreviewSimulatorOutputEvent): Promise<void> {\n if (event.type === \"state\") {\n if (event.resetStreaming) {\n const { streaming: _streaming, ...state } = this.#simulatorState;\n this.#simulatorState = Object.freeze(state);\n }\n this.#observeSimulatorState(event.state);\n return;\n }\n if (event.type === \"reset\") {\n if (this.#simulatorState.streaming?.runId === event.runId) {\n const { streaming: _streaming, ...state } = this.#simulatorState;\n this.#simulatorState = Object.freeze(state);\n this.#notifySimulator();\n }\n return;\n }\n const now = this.#now();\n const existing = this.#runs.get(event.runId);\n if (event.type === \"delta\") {\n if (\n (existing && TERMINAL_RUN_STATUSES.has(existing.status))\n || (\n this.#simulatorState.latestRun?.runId === event.runId\n && TERMINAL_RUN_STATUSES.has(this.#simulatorState.latestRun.status)\n )\n ) {\n return;\n }\n const previous = this.#simulatorState.streaming;\n const expected = previous?.runId === event.runId ? previous.nextSequence : 0;\n // A concurrent state poll may already include these live chunks.\n // Ignore duplicate local sequences within a connection; reset starts a new sequence.\n if (event.sequence < expected) return;\n if (event.sequence > expected) {\n throw Object.assign(new Error(\"App Server \u8FD4\u56DE\u7684\u6D41\u5F0F\u5E8F\u53F7\u4E0D\u8FDE\u7EED\"), { code: \"OUTPUT_SEQUENCE_MISMATCH\" });\n }\n const text = `${previous?.runId === event.runId ? previous.text : \"\"}${event.text}`;\n const firstTextLatencyMs = existing?.firstTextLatencyMs\n ?? (existing ? Math.max(0, now.getTime() - Date.parse(existing.startedAt)) : undefined);\n if (existing) {\n this.#upsertRun({\n ...existing,\n status: \"running\",\n updatedAt: now.toISOString(),\n ...(firstTextLatencyMs === undefined ? {} : { firstTextLatencyMs }),\n });\n }\n this.#simulatorState = Object.freeze({\n messages: this.#simulatorState.messages,\n latestRun: Object.freeze({ runId: event.runId, status: \"running\" as const }),\n activeRun: Object.freeze({ runId: event.runId, status: \"running\" as const }),\n streaming: Object.freeze({\n runId: event.runId,\n text,\n nextSequence: event.sequence + 1,\n updatedAt: now.toISOString(),\n }),\n });\n this.#record({\n channel: \"app_server\",\n type: event.sequence === 0 ? \"run.output.started\" : \"run.output.delta\",\n summary: event.sequence === 0 ? \"\u9996\u6BB5\u6D41\u5F0F\u6587\u5B57\u5DF2\u5230\u8FBE\" : `\u6536\u5230\u7B2C ${event.sequence + 1} \u6BB5\u6D41\u5F0F\u6587\u5B57`,\n runId: event.runId,\n ...(firstTextLatencyMs === undefined || event.sequence !== 0 ? {} : { durationMs: firstTextLatencyMs }),\n });\n this.#notifySimulator();\n return;\n }\n\n this.#record({\n channel: \"app_server\",\n type: `run.output.${event.type}`,\n summary: event.type === \"completed\"\n ? \"\u6D41\u5F0F\u8F93\u51FA\u5B8C\u6210\uFF0C\u6B63\u5728\u786E\u8BA4\u6B63\u5F0F\u56DE\u590D\"\n : event.type === \"failed\"\n ? \"\u672C\u5730\u56DE\u5408\u5931\u8D25\uFF0C\u4E34\u65F6\u6D41\u5F0F\u6587\u5B57\u5DF2\u4F5C\u5E9F\"\n : \"\u672C\u5730\u56DE\u5408\u5DF2\u53D6\u6D88\uFF0C\u4E34\u65F6\u6D41\u5F0F\u6587\u5B57\u5DF2\u4F5C\u5E9F\",\n runId: event.runId,\n });\n if (event.type !== \"completed\") {\n this.#simulatorState = Object.freeze({\n messages: this.#simulatorState.messages,\n latestRun: Object.freeze({ runId: event.runId, status: event.status }),\n });\n this.#notifySimulator();\n }\n await this.simulatorState().catch(() => undefined);\n }\n\n #stopOutputWatchers(): void {\n for (const controller of this.#outputWatchers.values()) {\n controller.abort(new Error(\"Preview DEV session closed\"));\n }\n this.#outputWatchers.clear();\n this.#failedOutputRuns.clear();\n }\n\n #stopOutputWatcher(runId: string): void {\n this.#failedOutputRuns.delete(runId);\n const controller = this.#outputWatchers.get(runId);\n if (!controller) return;\n this.#outputWatchers.delete(runId);\n controller.abort(new Error(\"Agent local turn reached a terminal state\"));\n }\n\n #notifySimulator(): void {\n this.#simulatorRevision++;\n if (this.#simulatorListeners.size === 0) return;\n const value = Object.freeze({ state: this.simulatorSnapshot(), debug: this.debugSnapshot() });\n for (const listener of this.#simulatorListeners) {\n try {\n listener(value);\n } catch {\n // Browser observer failures must not affect the Agent local turn.\n }\n }\n }\n\n #upsertRun(run: PreviewObservedRun): void {\n const ordinal = this.#runs.get(run.runId)?.ordinal ?? ++this.#runOrdinal;\n // Updating an older round must not promote it to \"latest\" in the selector.\n this.#runs.set(run.runId, Object.freeze({ ...run, ordinal }));\n while (this.#runs.size > 100) {\n const oldest = this.#runs.keys().next().value as string | undefined;\n if (!oldest) break;\n this.#runs.delete(oldest);\n }\n }\n\n #updateRunStatus(runId: string, status: PreviewObservedRunStatus): void {\n const existing = this.#runs.get(runId);\n if (!existing) return;\n this.#upsertRun({ ...existing, status, updatedAt: this.#now().toISOString() });\n }\n\n #record(input: Omit<PreviewDebugEvent, \"eventId\" | \"timestamp\">): void {\n this.#eventSequence += 1;\n this.#events.push(Object.freeze({\n ...input,\n eventId: `event-${this.#eventSequence}`,\n timestamp: this.#now().toISOString(),\n }));\n if (this.#events.length > 300) this.#events.splice(0, this.#events.length - 300);\n }\n\n #setState(next: Omit<PreviewDevState, \"revision\">): PreviewDevState {\n this.#state = Object.freeze({ ...next, revision: this.#state.revision + 1 });\n for (const listener of this.#listeners) {\n try {\n listener(this.#state);\n } catch {\n // UI observer failures must never change the DEV lifecycle.\n }\n }\n return this.#state;\n }\n}\n", "/** Matches DadaApp/PreviewBuddyLink.swift. This is an App route, not an auth token. */\nexport function createBuddyPreviewUrl(buddyId: string): string {\n if (!/^[a-zA-Z0-9._-]{1,124}-dev$/u.test(buddyId)) {\n throw new TypeError(\"\u771F\u673A\u9884\u89C8\u9700\u8981\u4E0D\u8D85\u8FC7 128 \u5B57\u7B26\u7684\u5F00\u53D1\u7248 Buddy ID\");\n }\n return `mlb://preview?${new URLSearchParams({ buddyId })}`;\n}\n", "/** Read the data-only subset printed by Runtime's util.inspect logger. Never evaluate log text. */\nexport function parseInspectedData(text: string): Record<string, unknown> | undefined {\n let at = 0;\n const space = () => { while (/\\s/u.test(text[at] ?? \"\") && at < text.length) at++; };\n const fail = (): never => { throw new Error(\"Unsupported log data\"); };\n function string(): string {\n const quote = text[at++];\n let result = \"\";\n while (at < text.length) {\n const char = text[at++];\n if (char === quote) return result;\n if (char !== \"\\\\\") { result += char; continue; }\n const escaped = text[at++];\n const escapes: Record<string, string> = { n: \"\\n\", r: \"\\r\", t: \"\\t\", b: \"\\b\", f: \"\\f\", v: \"\\v\", \"0\": \"\\0\", \"\\\\\": \"\\\\\", \"'\": \"'\", '\"': '\"', \"`\": \"`\", \"$\": \"$\" };\n if (escaped === \"x\" || escaped === \"u\") {\n const length = escaped === \"x\" ? 2 : 4;\n const hex = text.slice(at, at + length);\n if (!new RegExp(`^[0-9a-fA-F]{${length}}$`, \"u\").test(hex)) fail();\n result += String.fromCharCode(parseInt(hex, 16));\n at += length;\n } else if (escaped !== undefined && Object.hasOwn(escapes, escaped)) result += escapes[escaped];\n else fail();\n }\n return fail();\n }\n function value(depth = 0): unknown {\n if (depth > 40) fail();\n space();\n const char = text[at];\n if (char === \"'\" || char === '\"' || char === \"`\") {\n let result = string();\n space();\n // util.inspect splits long multiline strings using literal concatenation.\n while (text[at] === \"+\") {\n at++; space();\n if (![\"'\", '\"', \"`\"].includes(text[at] ?? \"\")) fail();\n result += string(); space();\n }\n return result;\n }\n if (char === \"{\" || char === \"[\") {\n const array = char === \"[\";\n const end = array ? \"]\" : \"}\";\n const result: Record<string, unknown> = Object.create(null);\n const items: unknown[] = [];\n at++; space();\n while (text[at] !== end) {\n if (at >= text.length) fail();\n if (array) items.push(value(depth + 1));\n else {\n const quoted = [\"'\", '\"', \"`\"].includes(text[at] ?? \"\");\n const key = quoted ? string() : /^[\\w$]+/u.exec(text.slice(at))?.[0];\n if (key === undefined) return fail();\n if (!quoted) at += key.length;\n space();\n if (text[at++] !== \":\" || Object.hasOwn(result, key)) fail();\n result[key] = value(depth + 1);\n }\n space();\n if (text[at] === end) break;\n if (text[at++] !== \",\") fail();\n space();\n }\n at++;\n return array ? items : result;\n }\n const literal = /^(true|false|null|undefined|[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(?=[\\s,\\]}]|$)/iu.exec(text.slice(at))?.[0];\n if (!literal) return fail();\n at += literal.length;\n if (literal === \"true\") return true;\n if (literal === \"false\") return false;\n if (literal === \"null\" || literal === \"undefined\") return null;\n const number = Number(literal);\n return Number.isFinite(number) ? number : fail();\n }\n try {\n if (text.length > 98_304) return undefined;\n const result = value();\n space();\n return at === text.length && result !== null && typeof result === \"object\" && !Array.isArray(result)\n ? result as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nexport interface RuntimeLogRecord {\n readonly id: string;\n readonly timestamp: string;\n readonly source: \"agent.stdout\" | \"agent.stderr\";\n readonly level: \"info\" | \"warn\" | \"error\";\n readonly title: string;\n readonly kind: \"request\" | \"response\" | \"log\";\n readonly raw: string;\n readonly convoKey?: string;\n readonly data?: Record<string, unknown>;\n readonly truncated: boolean;\n}\n\nconst HEADER = /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) \\[[^\\]\\r\\n]+\\] (INFO|WARN|ERROR)\\s+(.+)$/u;\nconst MAX_RECORD = 98_304;\nconst MAX_BYTES = 1_500_000;\n\n/** Bounded, in-memory Preview diagnostics. This does not install or change Runtime hooks. */\nexport class RuntimeDiagnostics {\n #sequence = 0;\n #records: RuntimeLogRecord[] = [];\n #active = new Map<RuntimeLogRecord[\"source\"], string>();\n #sizes = new Map<string, number>();\n #bytes = 0;\n #dropped = 0;\n\n write(source: RuntimeLogRecord[\"source\"], text: string, observedAt: string): void {\n for (const line of text.split(/\\r?\\n/u)) {\n if (!line) continue;\n const header = HEADER.exec(line);\n const previousIndex = this.#records.findIndex(record => record.id === this.#active.get(source));\n const previous = this.#records[previousIndex];\n // inspect continuation lines are indented, except the closing brace.\n const continuation = !header && previous && (/^\\s/u.test(line) || line === \"}\");\n let record: RuntimeLogRecord;\n if (continuation) {\n const raw = `${previous.raw}\\n${line}`;\n record = { ...previous, raw: raw.slice(0, MAX_RECORD), truncated: previous.truncated || raw.length > MAX_RECORD || line.endsWith(\" \u2026[truncated]\") };\n } else {\n const title = header ? header[3]!.replace(/ \\{.*$/u, \"\") : line.slice(0, 180);\n const time = header ? Date.parse(`${header[1]!.replace(\" \", \"T\")}+08:00`) : NaN;\n record = {\n id: `runtime-${++this.#sequence}`, timestamp: Number.isFinite(time) ? new Date(time).toISOString() : observedAt,\n source, level: header ? header[2]!.toLowerCase() as RuntimeLogRecord[\"level\"] : source === \"agent.stderr\" ? \"error\" : \"info\",\n title, kind: header && title === \"\u6A21\u578B\u8BF7\u6C42\u4F53\" ? \"request\" : header && title === \"\u6A21\u578B\u54CD\u5E94\" ? \"response\" : \"log\",\n raw: line.slice(0, MAX_RECORD), truncated: line.length > MAX_RECORD || line.endsWith(\" \u2026[truncated]\"),\n };\n this.#active.set(source, record.id);\n }\n // Only parse when a complete object could have arrived. Unsupported formats stay raw.\n if (!record.truncated && line.trimEnd().endsWith(\"}\")) {\n const head = HEADER.exec(record.raw.split(\"\\n\")[0]!);\n const offset = head ? record.raw.indexOf(\" {\", record.raw.indexOf(head[3]!)) : -1;\n const data = offset < 0 ? undefined : parseInspectedData(record.raw.slice(offset + 1));\n if (data) record = { ...record, data, ...(typeof data.convoKey === \"string\" ? { convoKey: data.convoKey } : {}) };\n }\n // Do not retain a formerly parsed object if new continuation data invalidates it.\n if (continuation && previous.data) {\n const { data: _data, convoKey: _convoKey, ...rawRecord } = record;\n record = rawRecord;\n }\n this.#bytes -= this.#sizes.get(record.id) ?? 0;\n const size = Buffer.byteLength(JSON.stringify(record));\n this.#sizes.set(record.id, size);\n this.#bytes += size;\n if (continuation) this.#records[previousIndex] = record;\n else this.#records.push(record);\n while (this.#records.length > 200 || this.#bytes > MAX_BYTES) {\n const removed = this.#records.shift()!;\n this.#bytes -= this.#sizes.get(removed.id) ?? 0;\n this.#sizes.delete(removed.id);\n this.#dropped++;\n }\n }\n }\n\n boundary(): void { this.#active.clear(); }\n clear(): void { this.#records = []; this.#active.clear(); this.#sizes.clear(); this.#bytes = 0; this.#dropped = 0; }\n snapshot(): { records: readonly RuntimeLogRecord[]; dropped: number } {\n return { records: [...this.#records].reverse(), dropped: this.#dropped };\n }\n}\n", "import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { createRequire } from \"node:module\";\n\nimport { PreviewController } from \"./controller.js\";\nimport QRCode from \"qrcode\";\n\nconst LOOPBACK_HOSTS = new Set([\"127.0.0.1\", \"::1\", \"localhost\"]);\nconst SESSION_COOKIE_PREFIX = \"buddy_preview_session\";\nconst require = createRequire(import.meta.url);\nconst BRAND_ICON = Buffer.from(\n readFileSync(new URL(\"../web/assets/developer-platform-icon.png.base64\", import.meta.url), \"utf8\").trim(),\n \"base64\",\n);\nconst WEB_ASSETS = Object.freeze(new Map<string, { readonly contentType: string; readonly body: Buffer }>([\n [\"/\", {\n contentType: \"text/html; charset=utf-8\",\n body: readFileSync(new URL(\"../web/index.html\", import.meta.url)),\n }],\n [\"/assets/app.css\", {\n contentType: \"text/css; charset=utf-8\",\n body: readFileSync(new URL(\"../web/app.css\", import.meta.url)),\n }],\n [\"/assets/tokens.css\", {\n contentType: \"text/css; charset=utf-8\",\n body: readFileSync(new URL(\"../web/tokens.css\", import.meta.url)),\n }],\n [\"/assets/brand.css\", {\n contentType: \"text/css; charset=utf-8\",\n body: readFileSync(new URL(\"../web/brand.css\", import.meta.url)),\n }],\n [\"/assets/widgets.js\", { contentType: \"text/javascript; charset=utf-8\", body: readFileSync(new URL(\"../web/widgets.js\", import.meta.url)) }],\n [\"/assets/widgets.css\", { contentType: \"text/css; charset=utf-8\", body: readFileSync(new URL(\"../web/widgets.css\", import.meta.url)) }],\n [\"/assets/app.js\", {\n contentType: \"text/javascript; charset=utf-8\",\n body: readFileSync(new URL(\"../web/app.js\", import.meta.url)),\n }],\n [\"/assets/diagnostics.js\", { contentType: \"text/javascript; charset=utf-8\", body: readFileSync(new URL(\"../web/diagnostics.js\", import.meta.url)) }],\n [\"/assets/developer-platform-icon.png\", {\n contentType: \"image/png\",\n body: BRAND_ICON,\n }],\n [\"/assets/iphone-16-max.js\", {\n contentType: \"text/javascript; charset=utf-8\",\n body: readFileSync(require.resolve(\"@sneas/telephone/iphone-16-max.js\")),\n }],\n]));\n\nexport interface PreviewControlServerOptions {\n readonly controller: PreviewController;\n readonly host?: \"127.0.0.1\" | \"::1\" | \"localhost\";\n readonly port?: number;\n}\n\nexport interface PreviewControlServer {\n readonly origin: URL;\n readonly bootstrapUrl: URL;\n close(): Promise<void>;\n}\n\nfunction closeServer(server: Server): Promise<void> {\n if (!server.listening) return Promise.resolve();\n return new Promise((resolve, reject) => {\n server.close((error) => error ? reject(error) : resolve());\n });\n}\n\nfunction writeHeaders(response: ServerResponse): void {\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n response.setHeader(\"Referrer-Policy\", \"no-referrer\");\n response.setHeader(\"Cross-Origin-Opener-Policy\", \"same-origin\");\n response.setHeader(\n \"Content-Security-Policy\",\n // Telephone injects its frame CSS into a shadow root and updates one inline sizing variable.\n \"default-src 'self'; connect-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'\",\n );\n}\n\nfunction staticAsset(response: ServerResponse, asset: { readonly contentType: string; readonly body: Buffer }): void {\n response.statusCode = 200;\n writeHeaders(response);\n response.setHeader(\"Content-Type\", asset.contentType);\n response.setHeader(\"Content-Length\", asset.body.length);\n response.end(asset.body);\n}\n\nfunction json(response: ServerResponse, status: number, body: unknown): void {\n const encoded = JSON.stringify(body);\n response.statusCode = status;\n writeHeaders(response);\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(encoded));\n response.end(encoded);\n}\n\nfunction safeEqual(left: string, right: string): boolean {\n const a = Buffer.from(left);\n const b = Buffer.from(right);\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nfunction cookieValue(request: IncomingMessage, name: string): string | undefined {\n for (const part of request.headers.cookie?.split(\";\") ?? []) {\n const separator = part.indexOf(\"=\");\n if (separator < 0) continue;\n if (part.slice(0, separator).trim() === name) return part.slice(separator + 1).trim();\n }\n return undefined;\n}\n\nfunction requestUrl(request: IncomingMessage, origin: URL): URL | null {\n try {\n return new URL(request.url ?? \"/\", origin);\n } catch {\n return null;\n }\n}\n\nfunction allowedHost(request: IncomingMessage, port: number): boolean {\n const value = request.headers.host;\n if (!value) return false;\n try {\n const parsed = new URL(`http://${value}`);\n return LOOPBACK_HOSTS.has(parsed.hostname.replace(/^\\[|\\]$/gu, \"\")) && Number(parsed.port || 80) === port;\n } catch {\n return false;\n }\n}\n\nfunction allowedOrigin(request: IncomingMessage, origin: URL): boolean {\n const value = request.headers.origin;\n return value === undefined || value === origin.origin;\n}\n\nfunction validWidgetRender(value: string | null): value is string {\n return value !== null && /^[a-zA-Z0-9-]{16,64}$/u.test(value);\n}\n\nfunction widgetDocument(response: ServerResponse, html: string, render: string | null, state = \"ready\", status = 200): void {\n writeHeaders(response);\n response.statusCode = status;\n // Opaque origin, no account credentials or application bridge inside generated HTML.\n response.setHeader(\"Content-Security-Policy\", \"sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; connect-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'self'\");\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n if (validWidgetRender(render)) {\n const signal = `<script>window.addEventListener('load',()=>parent.postMessage({channel:'buddy-widget-document',render:${JSON.stringify(render)},state:${JSON.stringify(state)}},'*'),{once:true})</script>`;\n // Preserve standards mode even for documents with an implicit head.\n if (/<head(?:\\s[^>]*)?>/iu.test(html)) html = html.replace(/<head(?:\\s[^>]*)?>/iu, match => match + signal);\n else if (/<!doctype[^>]*>/iu.test(html)) html = html.replace(/<!doctype[^>]*>/iu, match => match + signal);\n else html = signal + html;\n }\n response.end(html);\n}\n\nfunction apiError(response: ServerResponse, status: number, code: string, message: string): void {\n json(response, status, { error: { code, message } });\n}\n\nasync function readJsonBody(request: IncomingMessage, maximumBytes = 64 * 1024): Promise<unknown> {\n const contentType = request.headers[\"content-type\"]?.split(\";\", 1)[0]?.trim().toLowerCase();\n if (contentType !== \"application/json\") {\n throw Object.assign(new Error(\"\u9700\u8981 application/json\"), { code: \"JSON_REQUIRED\", status: 415 });\n }\n const declared = Number(request.headers[\"content-length\"] ?? 0);\n if (!Number.isFinite(declared) || declared < 0 || declared > maximumBytes) {\n throw Object.assign(new Error(\"\u8BF7\u6C42\u6B63\u6587\u8FC7\u5927\"), { code: \"BODY_TOO_LARGE\", status: 413 });\n }\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > maximumBytes) {\n throw Object.assign(new Error(\"\u8BF7\u6C42\u6B63\u6587\u8FC7\u5927\"), { code: \"BODY_TOO_LARGE\", status: 413 });\n }\n chunks.push(buffer);\n }\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n } catch {\n throw Object.assign(new Error(\"\u8BF7\u6C42\u6B63\u6587\u4E0D\u662F\u6709\u6548 JSON\"), { code: \"INVALID_JSON\", status: 400 });\n }\n}\n\nfunction exactObject(value: unknown, keys: readonly string[]): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const object = value as Record<string, unknown>;\n const expected = new Set(keys);\n return Object.keys(object).length === keys.length\n && Object.keys(object).every((key) => expected.has(key))\n ? object\n : null;\n}\n\nfunction safeIdentifier(value: unknown, maximumLength = 200): value is string {\n return typeof value === \"string\"\n && value.length > 0\n && value.length <= maximumLength\n && !/[\\u0000-\\u001f\\u007f]/u.test(value);\n}\n\nfunction requestFailure(cause: unknown): { status: number; code: string; message: string } {\n if (typeof cause === \"object\" && cause !== null) {\n const status = \"status\" in cause\n && typeof cause.status === \"number\"\n && Number.isInteger(cause.status)\n && cause.status >= 400\n && cause.status <= 599\n ? cause.status\n : 502;\n const code = \"code\" in cause && safeIdentifier(cause.code, 80) ? cause.code : \"SIMULATOR_REQUEST_FAILED\";\n const message = \"publicMessage\" in cause\n && typeof cause.publicMessage === \"string\"\n && cause.publicMessage.length <= 512\n && !/[\\u0000-\\u001f\\u007f]/u.test(cause.publicMessage)\n ? cause.publicMessage\n : status < 500 && cause instanceof Error\n ? cause.message\n : \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\";\n return { status, code, message };\n }\n return { status: 502, code: \"SIMULATOR_REQUEST_FAILED\", message: \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\" };\n}\n\nfunction publicProject(config: Awaited<ReturnType<PreviewController[\"project\"]>>): Record<string, unknown> {\n return {\n buddyId: config.buddyId,\n };\n}\n\nexport async function startPreviewControlServer(options: PreviewControlServerOptions): Promise<PreviewControlServer> {\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 0;\n if (!LOOPBACK_HOSTS.has(host)) throw new TypeError(\"Preview control server must bind to loopback\");\n if (!Number.isSafeInteger(port) || port < 0 || port > 65_535) throw new TypeError(\"Preview port must be 0\u201365535\");\n\n const sessionToken = randomBytes(32).toString(\"base64url\");\n let bootstrapAvailable = true;\n let origin: URL | undefined;\n const listeners = new Set<ServerResponse>();\n let eventRevision = 0;\n\n const publish = (event: string, value: unknown): void => {\n eventRevision += 1;\n const payload = `id: ${eventRevision}\\nevent: ${event}\\ndata: ${JSON.stringify(value)}\\n\\n`;\n for (const response of listeners) {\n try {\n response.write(payload);\n } catch {\n listeners.delete(response);\n }\n }\n };\n const unsubscribeDev = options.controller.subscribe((state) => publish(\"dev.state\", state));\n const unsubscribeSimulator = options.controller.subscribeSimulator((value) => publish(\"simulator.state\", value));\n\n const server = createServer(async (request, response) => {\n if (!origin) return apiError(response, 503, \"PREVIEW_STARTING\", \"Preview \u6B63\u5728\u542F\u52A8\");\n if (!allowedHost(request, Number(origin.port)) || !allowedOrigin(request, origin)) {\n return apiError(response, 403, \"PREVIEW_ORIGIN_FORBIDDEN\", \"\u8BF7\u6C42\u6765\u6E90\u4E0D\u53D7\u4FE1\u4EFB\");\n }\n // Cookies share a host across ports; each preview needs its own cookie name.\n const sessionCookie = `${SESSION_COOKIE_PREFIX}_${origin.port}`;\n const url = requestUrl(request, origin);\n if (!url) return apiError(response, 400, \"INVALID_URL\", \"\u8BF7\u6C42\u5730\u5740\u65E0\u6548\");\n\n if (\n request.method === \"GET\"\n && bootstrapAvailable\n && url.pathname === `/bootstrap/${sessionToken}`\n ) {\n bootstrapAvailable = false;\n response.statusCode = 303;\n writeHeaders(response);\n response.setHeader(\n \"Set-Cookie\",\n `${sessionCookie}=${sessionToken}; HttpOnly; SameSite=Strict; Path=/; Max-Age=43200`,\n );\n response.setHeader(\"Location\", \"/\");\n response.end();\n return;\n }\n\n const suppliedToken = cookieValue(request, sessionCookie);\n if (!suppliedToken || !safeEqual(suppliedToken, sessionToken)) {\n return apiError(response, 401, \"PREVIEW_UNAUTHORIZED\", \"\u9700\u8981\u4ECE CLI \u63D0\u4F9B\u7684\u4E00\u6B21\u6027\u5165\u53E3\u6253\u5F00 Preview\");\n }\n\n if (request.method === \"GET\") {\n const asset = WEB_ASSETS.get(url.pathname);\n if (asset) return staticAsset(response, asset);\n }\n\n if (request.method === \"GET\" && url.pathname === \"/api/project\") {\n try {\n return json(response, 200, { project: publicProject(await options.controller.project()) });\n } catch {\n return apiError(response, 422, \"PROJECT_CONFIG_INVALID\", \"\u9879\u76EE\u914D\u7F6E\u65E0\u6CD5\u8BFB\u53D6\u6216\u6821\u9A8C\u5931\u8D25\");\n }\n }\n if (request.method === \"GET\" && url.pathname === \"/api/dev\") {\n return json(response, 200, { state: options.controller.state() });\n }\n if (request.method === \"GET\" && url.pathname === \"/api/buddy\") {\n try {\n return json(response, 200, { buddy: await options.controller.buddyDetails() });\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n if (request.method === \"GET\" && url.pathname === \"/api/debug\") {\n return json(response, 200, { debug: options.controller.debugSnapshot() });\n }\n if (request.method === \"GET\" && url.pathname === \"/api/device/pairing\") {\n const pairing = options.controller.devicePairing();\n if (pairing.status !== \"ready\") return json(response, 200, { pairing });\n const qrCodeDataUrl = await QRCode.toDataURL(pairing.url, {\n errorCorrectionLevel: \"M\", margin: 4, width: 256,\n });\n const current = options.controller.devicePairing();\n return json(response, 200, { pairing: current.status === \"ready\" && current.url === pairing.url\n ? { ...current, qrCodeDataUrl } : current });\n }\n if (request.method === \"GET\" && url.pathname === \"/api/simulator/state\") {\n try {\n return json(response, 200, { state: await options.controller.simulatorState() });\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n const widgetRoute = /^\\/api\\/simulator\\/widgets(?:\\/([^/]+)(?:\\/(image|pin))?)?$/u.exec(url.pathname);\n if (widgetRoute) {\n try {\n const id = widgetRoute[1] ? decodeURIComponent(widgetRoute[1]) : \"\";\n const suffix = widgetRoute[2];\n if (id && !suffix && request.method === \"DELETE\") return json(response, 200, await options.controller.simulatorWidgets(\"delete\", id));\n if (request.method === \"GET\" && !id) return json(response, 200, await options.controller.simulatorWidgets(\"list\"));\n if (id && suffix === \"pin\" && (request.method === \"PUT\" || request.method === \"DELETE\")) return json(response, 200, await options.controller.simulatorWidgets(request.method === \"PUT\" ? \"pin\" : \"unpin\", id));\n if (id && request.method === \"GET\" && suffix === \"image\") {\n const image = await options.controller.simulatorWidgets(\"image\", id, url.searchParams.get(\"mediaId\") ?? \"\") as { body: Uint8Array; contentType: string };\n if (!/^image\\/(png|jpeg|webp|gif)(;|$)/u.test(image.contentType)) throw new Error(\"\u56FE\u7247\u683C\u5F0F\u4E0D\u652F\u6301\");\n writeHeaders(response); response.setHeader(\"Content-Type\", image.contentType); response.end(image.body); return;\n }\n if (id && request.method === \"GET\" && !suffix) {\n const html = await options.controller.simulatorWidgets(\"html\", id, \"\", url.searchParams.get(\"messageId\") ?? undefined) as string;\n widgetDocument(response, html, url.searchParams.get(\"render\"));\n return;\n }\n return apiError(response, 405, \"METHOD_NOT_ALLOWED\", \"\u4E0D\u652F\u6301\u8FD9\u4E2A\u5C0F\u6302\u4EF6\u64CD\u4F5C\");\n } catch (cause) {\n const failure = requestFailure(cause);\n const render = url.searchParams.get(\"render\");\n if (request.method === \"GET\" && widgetRoute[1] && !widgetRoute[2] && validWidgetRender(render)) {\n widgetDocument(response, \"<!doctype html><html><head><meta charset=\\\"utf-8\\\"></head><body>\u5C0F\u6302\u4EF6\u6682\u65F6\u65E0\u6CD5\u6253\u5F00</body></html>\", render, \"error\", failure.status);\n return;\n }\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n if (request.method === \"GET\" && url.pathname === \"/api/events\") {\n response.statusCode = 200;\n writeHeaders(response);\n response.setHeader(\"Content-Type\", \"text/event-stream; charset=utf-8\");\n response.setHeader(\"Connection\", \"keep-alive\");\n eventRevision += 1;\n response.write(`id: ${eventRevision}\\nevent: dev.state\\ndata: ${JSON.stringify(options.controller.state())}\\n\\n`);\n eventRevision += 1;\n response.write(`id: ${eventRevision}\\nevent: simulator.state\\ndata: ${JSON.stringify({\n state: options.controller.simulatorSnapshot(),\n debug: options.controller.debugSnapshot(),\n })}\\n\\n`);\n listeners.add(response);\n request.once(\"close\", () => listeners.delete(response));\n return;\n }\n if (request.method === \"POST\" && options.controller.resetting) {\n return apiError(response, 409, \"SIMULATOR_BUSY\", \"\u6B63\u5728\u6E05\u7A7A\u5BF9\u8BDD\u5E76\u91CD\u542F DEV\uFF0C\u8BF7\u7A0D\u5019\");\n }\n if (request.method === \"POST\" && url.pathname === \"/api/simulator/reset\") {\n try {\n const body = exactObject(await readJsonBody(request), [\"confirm\"]);\n if (body?.confirm !== true) return apiError(response, 400, \"RESET_CONFIRMATION_REQUIRED\", \"\u8BF7\u786E\u8BA4\u6E05\u7A7A\u5F53\u524D\u5F00\u53D1\u7248\u5BF9\u8BDD\");\n const state = await options.controller.resetSimulator();\n return json(response, 200, { state, dev: options.controller.state(), debug: options.controller.debugSnapshot() });\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n if (request.method === \"POST\" && url.pathname === \"/api/dev/start\") {\n if (Number(request.headers[\"content-length\"] ?? 0) > 0) {\n return apiError(response, 400, \"BODY_NOT_ALLOWED\", \"\u8BE5\u64CD\u4F5C\u4E0D\u63A5\u53D7\u8BF7\u6C42\u6B63\u6587\");\n }\n void options.controller.start();\n return json(response, 202, { state: options.controller.state() });\n }\n if (request.method === \"POST\" && url.pathname === \"/api/dev/stop\") {\n if (Number(request.headers[\"content-length\"] ?? 0) > 0) {\n return apiError(response, 400, \"BODY_NOT_ALLOWED\", \"\u8BE5\u64CD\u4F5C\u4E0D\u63A5\u53D7\u8BF7\u6C42\u6B63\u6587\");\n }\n try {\n return json(response, 200, { state: await options.controller.stop() });\n } catch {\n return apiError(response, 500, \"DEV_STOP_FAILED\", \"DEV \u4F1A\u8BDD\u672A\u80FD\u5B89\u5168\u505C\u6B62\uFF0C\u8BF7\u68C0\u67E5\u672C\u5730\u8FDB\u7A0B\");\n }\n }\n if (request.method === \"POST\" && url.pathname === \"/api/simulator/messages\") {\n try {\n const body = exactObject(await readJsonBody(request), [\"text\", \"idempotencyKey\"]);\n if (\n !body\n || typeof body.text !== \"string\"\n || !body.text.trim()\n || Buffer.byteLength(body.text, \"utf8\") > 32 * 1024\n || !safeIdentifier(body.idempotencyKey, 128)\n ) {\n return apiError(response, 400, \"INVALID_MESSAGE\", \"\u6D88\u606F\u6216\u5E42\u7B49\u6807\u8BC6\u4E0D\u7B26\u5408\u8981\u6C42\");\n }\n const accepted = await options.controller.sendSimulatorMessage({\n text: body.text,\n idempotencyKey: body.idempotencyKey,\n });\n return json(response, 202, accepted);\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n const cancelMatch = /^\\/api\\/simulator\\/runs\\/([^/]+)\\/cancel$/u.exec(url.pathname);\n if (request.method === \"POST\" && cancelMatch) {\n if (Number(request.headers[\"content-length\"] ?? 0) > 0) {\n return apiError(response, 400, \"BODY_NOT_ALLOWED\", \"\u8BE5\u64CD\u4F5C\u4E0D\u63A5\u53D7\u8BF7\u6C42\u6B63\u6587\");\n }\n let runId: string;\n try {\n runId = decodeURIComponent(cancelMatch[1]!);\n } catch {\n return apiError(response, 400, \"INVALID_RUN_ID\", \"Run ID \u4E0D\u7B26\u5408\u8981\u6C42\");\n }\n if (!safeIdentifier(runId)) return apiError(response, 400, \"INVALID_RUN_ID\", \"Run ID \u4E0D\u7B26\u5408\u8981\u6C42\");\n try {\n return json(response, 200, await options.controller.cancelSimulatorRun(runId));\n } catch (cause) {\n const failure = requestFailure(cause);\n return apiError(response, failure.status, failure.code, failure.message);\n }\n }\n return apiError(response, 404, \"NOT_FOUND\", \"\u63A5\u53E3\u4E0D\u5B58\u5728\");\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address() as AddressInfo | null;\n if (!address) throw new Error(\"Preview server has no address\");\n const urlHost = address.address.includes(\":\") ? `[${address.address}]` : address.address;\n origin = new URL(`http://${urlHost}:${address.port}`);\n } catch (cause) {\n unsubscribeDev();\n unsubscribeSimulator();\n await closeServer(server).catch(() => undefined);\n throw cause;\n }\n\n const bootstrapUrl = new URL(`/bootstrap/${sessionToken}`, origin);\n return Object.freeze({\n origin,\n bootstrapUrl,\n async close() {\n unsubscribeDev();\n unsubscribeSimulator();\n for (const response of listeners) response.end();\n listeners.clear();\n let controllerFailure: unknown;\n try {\n await options.controller.close();\n } catch (cause) {\n controllerFailure = cause;\n }\n await closeServer(server);\n if (controllerFailure !== undefined) throw controllerFailure;\n },\n });\n}\n", "import { createHash } from \"node:crypto\";\n\nimport { normalizePlatformUrl } from \"@buddy/cli-core\";\nimport { mlbAppCommand, mlbAppEvents, MlbEventStreamError } from \"./mlb-events.js\";\nimport { parsePreviewBuddyDetails, type PreviewBuddyDetails } from \"./buddy-details.js\";\n\nimport type {\n PreviewWidget,\n PreviewWidgetOpenTarget,\n PreviewSimulatorClient,\n PreviewSimulatorMessage,\n PreviewSimulatorOutputEvent,\n PreviewSimulatorState,\n} from \"./controller.js\";\n\nexport interface MlbSimulatorClientOptions {\n readonly baseUrl: string | URL;\n /** Explicit MLB development identity: `<package.json buddyId>-dev`. */\n readonly buddyId: string;\n readonly auth: { readonly developerAccessToken: string };\n readonly fetch?: typeof globalThis.fetch;\n}\n\ninterface MlbHttpErrorShape extends Error {\n readonly code: string;\n readonly status: number;\n readonly publicMessage: string;\n}\n\nfunction safeText(value: unknown, name: string, maximum = 4096): string {\n if (\n typeof value !== \"string\"\n || !value.trim()\n || value.length > maximum\n || /[\\u0000-\\u001f\\u007f]/u.test(value)\n ) {\n throw new TypeError(`${name} is invalid`);\n }\n return value;\n}\n\nfunction endpoint(base: URL, path: string): URL {\n return new URL(path.replace(/^\\//u, \"\"), base);\n}\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n\nfunction httpError(status: number, value: unknown): MlbHttpErrorShape {\n const serverMessage = object(value)?.error;\n const message = typeof serverMessage === \"string\" && serverMessage.trim()\n ? serverMessage.slice(0, 512)\n : status >= 500\n ? \"MLB Server \u6682\u65F6\u4E0D\u53EF\u7528\"\n : \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\";\n return Object.assign(new Error(message), {\n code: \"MLB_REQUEST_FAILED\",\n status,\n publicMessage: message,\n });\n}\n\nfunction message(value: unknown, index: number): PreviewSimulatorMessage | null {\n const input = object(value);\n if (!input || typeof input.author !== \"string\") return null;\n const role = input.author === \"buddy\"\n ? \"assistant\" as const\n : input.author === \"user\" || input.author === \"owner\"\n ? \"user\" as const\n : undefined;\n if (!role) return null;\n const messageId = safeText(input.id, `messages[${index}].id`, 256);\n let text = input.type === \"widget\" && input.text === undefined ? \"\" : input.text;\n if (typeof text !== \"string\" || Buffer.byteLength(text, \"utf8\") > 48 * 1024) {\n throw new Error(`messages[${index}].text is invalid`);\n }\n // Tool steps can carry visible speech, but an empty execution record is not a bubble.\n if (input.type === \"tool\" && !text.trim()) return null;\n if (typeof input.timestamp !== \"number\" || !Number.isFinite(input.timestamp)) {\n throw new Error(`messages[${index}].timestamp is invalid`);\n }\n if (role === \"assistant\" && input.type === \"question\") {\n const options = object(input.question)?.options;\n if (!Array.isArray(options) || options.length < 2 || options.length > 4\n || options.some(option => typeof option !== \"string\" || !option.trim() || option.length > 30)) {\n throw new Error(`messages[${index}].question is invalid`);\n }\n text += `\\n\\n${options.map((option, i) => `${i + 1}. ${option}`).join(\"\\n\")}\\n\\n\u8BF7\u76F4\u63A5\u56DE\u590D\u4F60\u7684\u9009\u62E9\uFF0C\u4E5F\u53EF\u4EE5\u8865\u5145\u8BF4\u660E\u3002`;\n }\n if (role === \"assistant\" && input.type === \"permissionRequest\") {\n const request = object(input.permissionRequest);\n text += request?.status === \"pending\"\n ? \"\\n\\n\u8BF7\u5728\u642D\u642D App \u4E2D\u5904\u7406\u8FD9\u5F20\u6388\u6743\u5361\uFF1B\u6D4F\u89C8\u5668\u9884\u89C8\u4E0D\u4EE3\u66FF\u7CFB\u7EDF\u6388\u6743\u3002\"\n : \"\\n\\n\u6388\u6743\u5361\u7684\u5904\u7406\u7ED3\u679C\u8BF7\u4EE5\u642D\u642D App \u4E2D\u7684\u72B6\u6001\u4E3A\u51C6\u3002\";\n }\n return Object.freeze({\n messageId,\n role,\n text,\n createdAt: new Date(input.timestamp).toISOString(),\n ...(input.type === \"widget\" && object(input.widget) ? { widget: parseWidget(input.widget) } : {}),\n });\n}\n\nfunction widgetId(value: unknown): string {\n const id = safeText(value, \"widgetId\", 64);\n if (/[\\s/\\\\]/u.test(id) || id === \".\" || id === \"..\") throw new TypeError(\"widgetId is invalid\");\n return id;\n}\nfunction parseWidget(value: unknown): PreviewWidget {\n const item = object(value);\n const openTarget = parseOpenTarget(item?.openTarget);\n return Object.freeze({ id: widgetId(item?.id), title: typeof item?.title === \"string\" && item.title.trim() ? item.title : \"\u5C0F\u6302\u4EF6\",\n ...(typeof item?.type === \"string\" ? { type: item.type } : {}),\n ...(typeof item?.summary === \"string\" ? { summary: item.summary } : {}),\n ...(typeof item?.imageMediaId === \"string\" && /^media_[a-zA-Z0-9_-]+$/u.test(item.imageMediaId) ? { imageMediaId: item.imageMediaId } : {}),\n ...(typeof item?.isPinned === \"boolean\" ? { isPinned: item.isPinned } : {}),\n ...(typeof item?.creatorName === \"string\" ? { creatorName: item.creatorName } : {}),\n ...(item?.role === \"owner\" || item?.role === \"editor\" || item?.role === \"viewer\" ? { role: item.role } : {}),\n ...(openTarget ? { openTarget } : {}),\n });\n}\n\n/** Validate protocol shape only; declarations, records and state schemas belong to MLB Server. */\nfunction parseOpenTarget(value: unknown): PreviewWidgetOpenTarget | undefined {\n if (value === undefined) return undefined;\n const target = object(value), resource = object(target?.resource);\n const name = (input: unknown): input is string => typeof input === \"string\" && /^[^\\s/\\u0000-\\u001f\\u007f]{1,64}$/u.test(input);\n if (!target || target.version !== 1 || !name(target.entry)\n || (target.resource !== undefined && (!resource || !name(resource.module) || !name(resource.recordId)))\n || (target.state !== undefined && !object(target.state))) throw new TypeError(\"Widget \u6253\u5F00\u76EE\u6807\u683C\u5F0F\u65E0\u6548\");\n const normalized: PreviewWidgetOpenTarget = {\n version: 1, entry: target.entry,\n ...(resource ? { resource: { module: resource.module as string, recordId: resource.recordId as string } } : {}),\n ...(target.state !== undefined ? { state: object(target.state)! } : {}),\n };\n if (Buffer.byteLength(JSON.stringify(normalized), \"utf8\") > 8 * 1024) throw new TypeError(\"Widget \u6253\u5F00\u76EE\u6807\u8D85\u8FC7 8 KiB\");\n return Object.freeze(normalized);\n}\n\nfunction localReceipt(prefix: string, value: string): string {\n return `${prefix}-${createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 20)}`;\n}\n\nfunction waitForRetry(milliseconds: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(timer);\n reject(signal?.reason);\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, milliseconds);\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\n/** MLB Client adapter used by the browser simulator. No Run API is involved. */\nexport class MlbSimulatorClient implements PreviewSimulatorClient {\n readonly #baseUrl: URL;\n readonly #buddyId: string;\n readonly #accessToken: string;\n readonly #fetch: typeof globalThis.fetch;\n #sending = false;\n #resetTarget: string | undefined;\n #resetArchived = false;\n #lastSend: { key: string; text: string; receipt: { readonly messageId: string; readonly runId: string } } | undefined;\n #privateId: string | undefined;\n #privatePromise: Promise<string> | undefined;\n #active: {\n readonly runId: string;\n readonly messageTimestamp: number;\n readonly observedReplying: boolean;\n } | undefined;\n #latest: PreviewSimulatorState[\"latestRun\"];\n #streaming: PreviewSimulatorState[\"streaming\"];\n #messages: readonly PreviewSimulatorMessage[] = Object.freeze([]);\n\n constructor(options: MlbSimulatorClientOptions) {\n this.#baseUrl = normalizePlatformUrl(options.baseUrl);\n this.#buddyId = safeText(options.buddyId, \"buddyId\", 256);\n if (!this.#buddyId.endsWith(\"-dev\")) {\n throw new TypeError(\"MLB simulator buddyId must use the -dev identity\");\n }\n this.#accessToken = safeText(options.auth.developerAccessToken, \"developerAccessToken\", 16_384);\n this.#fetch = options.fetch ?? globalThis.fetch;\n if (typeof this.#fetch !== \"function\") throw new TypeError(\"A Fetch API implementation is required\");\n }\n\n /** Reading a profile must not add the Buddy or trigger a welcome message. */\n async details(options: { readonly signal?: AbortSignal } = {}): Promise<PreviewBuddyDetails> {\n const signal = AbortSignal.any([AbortSignal.timeout(30_000), ...(options.signal ? [options.signal] : [])]);\n const details = parsePreviewBuddyDetails(await this.#request(\"GET\", `/app/buddies/${encodeURIComponent(this.#buddyId)}`, { signal }), this.#buddyId);\n this.#privateId = details.privateId ?? undefined;\n if (!details.avatar) return details;\n let avatarPreview: string | null = null;\n try {\n const url = new URL(details.avatar, this.#baseUrl);\n if (url.origin !== this.#baseUrl.origin || url.username || url.password || !url.pathname.startsWith(\"/media/\")) throw new Error(\"Unsupported avatar URL\");\n const image = await this.#widgetResource(url.href, false);\n const contentType = image.contentType.split(\";\", 1)[0]!.trim().toLowerCase();\n if (![\"image/png\", \"image/jpeg\", \"image/webp\"].includes(contentType)) throw new Error(\"Unsupported avatar type\");\n avatarPreview = `data:${contentType};base64,${Buffer.from(image.body).toString(\"base64\")}`;\n } catch { /* Profile remains usable when the image is temporarily unavailable. */ }\n return Object.freeze({ ...details, avatarPreview });\n }\n\n async widgets(): Promise<readonly PreviewWidget[]> {\n this.#assertResetComplete();\n const id = await this.#ensurePrivate();\n const body = object(await this.#request(\"GET\", `/app/privates/${encodeURIComponent(id)}/widgets`, {}));\n if (!Array.isArray(body?.widgets)) throw httpError(502, { error: \"\u65E0\u6CD5\u8BFB\u53D6\u4F1A\u8BDD\u5C0F\u6302\u4EF6\" });\n return body.widgets.map(parseWidget).filter(item => item.type !== undefined);\n }\n\n async widgetHtml(id: string, openTarget?: PreviewWidgetOpenTarget): Promise<string> {\n this.#assertResetComplete();\n const target = parseOpenTarget(openTarget);\n const privateId = await this.#ensurePrivate();\n const result = await this.#widgetResource(`/app/widgets/${encodeURIComponent(widgetId(id))}/presentation`, true, {\n method: \"POST\", body: JSON.stringify({ conversationId: privateId, ...(target ? { openTarget: target } : {}) }),\n });\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(result.body);\n }\n\n async pinWidget(id: string, pinned: boolean): Promise<void> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate();\n await this.#request(pinned ? \"PUT\" : \"DELETE\", `/app/widgets/${encodeURIComponent(widgetId(id))}/pin`, { ...(pinned ? { body: { sourceConversationId: privateId } } : {}) });\n }\n\n async deleteWidget(id: string): Promise<void> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate();\n await this.#request(\"DELETE\", `/app/widgets/${encodeURIComponent(widgetId(id))}?conversationId=${encodeURIComponent(privateId)}`, {});\n }\n\n async widgetImage(id: string, mediaId: string): Promise<{ body: Uint8Array; contentType: string }> {\n this.#assertResetComplete();\n if (!/^media_[a-zA-Z0-9_-]+$/u.test(mediaId)) throw new TypeError(\"Invalid media ID\");\n const access = object(await this.#request(\"GET\", `/app/media/${encodeURIComponent(mediaId)}?widgetId=${encodeURIComponent(widgetId(id))}`, {}));\n const url = new URL(String(access?.url));\n if (url.protocol !== \"https:\" || url.username || url.password || access?.mediaId !== mediaId || typeof access.expiresAt !== \"number\" || access.expiresAt <= Date.now()) throw new Error(\"\u56FE\u7247\u94FE\u63A5\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u8BD5\");\n return this.#widgetResource(url.href, false);\n }\n\n async #widgetResource(path: string, authenticated = true, init: Pick<RequestInit, \"method\" | \"body\"> = {}): Promise<{ body: Uint8Array; contentType: string }> {\n const response = await this.#fetch(authenticated ? endpoint(this.#baseUrl, path) : new URL(path), { ...init, headers: {\n ...(authenticated ? { Authorization: `Bearer ${this.#accessToken}` } : {}),\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n }, credentials: \"omit\", redirect: \"error\", signal: AbortSignal.timeout(15_000) });\n if (!response.ok) throw httpError(response.status, { error: response.status === 403 || response.status === 404 ? \"\u5C0F\u6302\u4EF6\u5DF2\u5220\u9664\u3001\u9875\u9762\u672A\u4E0A\u4F20\uFF0C\u6216\u4F60\u5DF2\u4E0D\u5728\u8FD9\u4E2A\u4F1A\u8BDD\u4E2D\u3002\" : \"\u5C0F\u6302\u4EF6\u6682\u65F6\u65E0\u6CD5\u6253\u5F00\uFF0C\u8BF7\u91CD\u65B0\u52A0\u8F7D\u3002\" });\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"\u5C0F\u6302\u4EF6\u5185\u5BB9\u4E3A\u7A7A\");\n const chunks: Uint8Array[] = []; let size = 0;\n try {\n while (true) { const part = await reader.read(); if (part.done) break; size += part.value.byteLength;\n if (size > 4 * 1024 * 1024) throw new Error(\"\u5C0F\u6302\u4EF6\u5185\u5BB9\u8FC7\u5927\uFF0C\u6682\u65F6\u65E0\u6CD5\u6253\u5F00\");\n chunks.push(part.value);\n }\n } finally { await reader.cancel(); }\n return { body: Buffer.concat(chunks), contentType: response.headers.get(\"content-type\") ?? \"text/html\" };\n }\n\n async state(options: { readonly signal?: AbortSignal } = {}): Promise<PreviewSimulatorState> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate(options.signal);\n const value = await this.#request(\"GET\", `/app/privates/${encodeURIComponent(privateId)}`, {\n signal: options.signal,\n });\n const body = object(value);\n const conversation = object(body?.private);\n if (!body || conversation?.id !== privateId || conversation?.buddyId !== this.#buddyId\n || !Array.isArray(body.messages) || typeof body.replying !== \"boolean\") {\n throw httpError(502, { error: \"MLB Server \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u79C1\u804A\u72B6\u6001\" });\n }\n this.#messages = Object.freeze(body.messages\n .map((item, index) => message(item, index))\n .filter((item): item is PreviewSimulatorMessage => item !== null));\n\n if (this.#active) {\n const replied = this.#messages.some((item) => item.role === \"assistant\"\n && Date.parse(item.createdAt) > this.#active!.messageTimestamp);\n // A visible message may be written between model/tool steps. Only MLB's\n // replying lifecycle can establish that the entire response has ended.\n if (body.replying) {\n this.#active = Object.freeze({ ...this.#active, observedReplying: true });\n this.#latest = Object.freeze({ runId: this.#active.runId, status: \"running\" as const });\n } else if (replied) {\n this.#latest = Object.freeze({ runId: this.#active.runId, status: \"completed\" as const });\n this.#active = undefined;\n this.#streaming = undefined;\n } else if (this.#active.observedReplying) {\n // MLB has no failure terminal event. replying on \u2192 off without a new\n // Assistant message means the local turn ended without a reply.\n this.#latest = Object.freeze({ runId: this.#active.runId, status: \"completed\" as const });\n this.#active = undefined;\n this.#streaming = undefined;\n }\n }\n\n return Object.freeze({\n messages: this.#messages,\n ...(this.#latest === undefined ? {} : { latestRun: this.#latest }),\n ...(this.#active === undefined\n ? {}\n : {\n activeRun: Object.freeze({\n runId: this.#active.runId,\n status: body.replying ? \"running\" as const : \"pending\" as const,\n }),\n }),\n ...(this.#streaming === undefined ? {} : { streaming: this.#streaming }),\n });\n }\n\n async send(\n input: { readonly text: string; readonly idempotencyKey: string },\n options: { readonly signal?: AbortSignal } = {},\n ): Promise<{ readonly messageId: string; readonly runId: string }> {\n if (typeof input.text !== \"string\" || !input.text.trim() || Buffer.byteLength(input.text, \"utf8\") > 32 * 1024) {\n throw new TypeError(\"message text is invalid\");\n }\n this.#assertResetComplete();\n const idempotencyKey = safeText(input.idempotencyKey, \"idempotencyKey\", 128);\n if (this.#lastSend?.key === idempotencyKey) {\n if (this.#lastSend.text !== input.text.trim()) throw httpError(409, { error: \"\u540C\u4E00\u6761\u6D88\u606F\u4E0D\u80FD\u6539\u5199\u5185\u5BB9\" });\n return this.#lastSend.receipt;\n }\n if (this.#sending) {\n throw Object.assign(new Error(\"\u6D88\u606F\u6B63\u5728\u53D1\u9001\"), {\n code: \"SEND_IN_PROGRESS\", status: 409, publicMessage: \"\u6D88\u606F\u6B63\u5728\u53D1\u9001\uFF0C\u8BF7\u7A0D\u5019\",\n });\n }\n this.#sending = true;\n try {\n const privateId = await this.#ensurePrivate(options.signal);\n // The browser's key may contain characters outside MLB's identifier alphabet.\n const clientMessageId = localReceipt(\"client\", idempotencyKey);\n let value: unknown;\n try {\n const url = endpoint(this.#baseUrl, \"/app/ws\");\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n value = await mlbAppCommand(url, this.#accessToken, \"message.send\", {\n kind: \"private\", id: privateId, messages: [{ type: \"text\", text: input.text }], clientMessageId,\n }, { signal: options.signal });\n const receipt = object(value);\n const items = Array.isArray(receipt?.items) ? receipt.items : [];\n const item = object(items[0]);\n if (receipt?.ok !== true || receipt.clientMessageId !== clientMessageId\n || items.length !== 1 || item?.index !== 0\n || typeof item.messageId !== \"string\" || !item.messageId.trim()\n || !Number.isSafeInteger(item.timestamp) || (item.timestamp as number) < 0\n || typeof receipt.shouldReply !== \"boolean\") {\n throw httpError(502, { error: \"MLB \u6D88\u606F\u56DE\u6267\u65E0\u6548\" });\n }\n safeText(item.messageId, \"receipt.items[0].messageId\", 256);\n } catch (cause) {\n if (cause && typeof cause === \"object\" && \"status\" in cause\n && typeof cause.status === \"number\" && cause.status >= 400 && cause.status < 500) throw cause;\n throw Object.assign(new Error(\"\u53D1\u9001\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0\u804A\u5929\u8BB0\u5F55\u540E\u518D\u91CD\u8BD5\"), {\n code: \"MLB_SEND_OUTCOME_UNKNOWN\", status: 502,\n publicMessage: \"\u53D1\u9001\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5237\u65B0\u804A\u5929\u8BB0\u5F55\u540E\u518D\u91CD\u8BD5\",\n });\n }\n const receipt = object(value)!;\n const item = object((receipt.items as unknown[])[0])!;\n // MLB streams are conversation-scoped, without a Runtime turn ID.\n // Additional messages share the current observation window and its one watcher.\n const runId = this.#active?.runId ?? localReceipt(\"turn\", idempotencyKey);\n const messageId = safeText(item.messageId, \"receipt.items[0].messageId\", 256);\n if (!this.#active) {\n this.#active = receipt.shouldReply ? Object.freeze({\n runId, messageTimestamp: item.timestamp as number, observedReplying: false,\n }) : undefined;\n this.#latest = Object.freeze({ runId, status: receipt.shouldReply ? \"pending\" as const : \"completed\" as const });\n this.#streaming = undefined;\n }\n const accepted = Object.freeze({ messageId, runId });\n this.#lastSend = { key: idempotencyKey, text: input.text.trim(), receipt: accepted };\n return accepted;\n } finally {\n this.#sending = false;\n }\n }\n\n #assertResetComplete(): void {\n if (this.#resetTarget) throw Object.assign(new Error(\"\u8BF7\u518D\u6B21\u70B9\u51FB\u6E05\u7A7A\u5BF9\u8BDD\uFF0C\u5B8C\u6210\u65B0\u4F1A\u8BDD\u521B\u5EFA\"), {\n code: \"RESET_INCOMPLETE\", status: 409,\n publicMessage: \"\u4F1A\u8BDD\u91CD\u7F6E\u5C1A\u672A\u5B8C\u6210\uFF0C\u8BF7\u518D\u6B21\u70B9\u51FB\u300C\u6E05\u7A7A\u5BF9\u8BDD\u300D\u91CD\u8BD5\",\n });\n }\n\n async reset(options: { readonly signal?: AbortSignal } = {}): Promise<void> {\n if (this.#sending) throw httpError(409, { error: \"\u6D88\u606F\u6B63\u5728\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u6E05\u7A7A\" });\n if (!this.#resetTarget) {\n const privateId = await this.#ensurePrivate(options.signal);\n const current = object(await this.#request(\"GET\", `/app/privates/${encodeURIComponent(privateId)}`, options));\n const conversation = object(current?.private);\n if (conversation?.id !== privateId || conversation?.buddyId !== this.#buddyId || typeof current?.replying !== \"boolean\") {\n throw httpError(502, { error: \"\u65E0\u6CD5\u786E\u8BA4\u5F53\u524D\u79C1\u804A\u72B6\u6001\uFF0C\u672A\u6E05\u7A7A\u5BF9\u8BDD\" });\n }\n if (current.replying) throw httpError(409, { error: \"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u5B8C\u6210\u540E\u518D\u6E05\u7A7A\" });\n this.#resetTarget = privateId;\n }\n try {\n // MLB archives this conversation and invalidates its context and subscriptions.\n // DELETE is idempotent, so an unacknowledged request can be retried safely.\n if (!this.#resetArchived) {\n const receipt = object(await this.#request(\"DELETE\", `/app/privates/${encodeURIComponent(this.#resetTarget)}`, options));\n if (receipt?.ok !== true) throw httpError(502, { error: \"\u65E0\u6CD5\u786E\u8BA4\u65E7\u4F1A\u8BDD\u5DF2\u7ED3\u675F\" });\n this.#resetArchived = true;\n this.#privateId = undefined;\n }\n // POST is also idempotent. If its response is lost, a retry returns the same\n // new conversation instead of archiving it again or reviving the old one.\n const nextId = await this.#ensurePrivate(options.signal);\n if (nextId === this.#resetTarget) {\n this.#privateId = undefined;\n throw httpError(502, { error: \"MLB \u672A\u8FD4\u56DE\u65B0\u7684\u4F1A\u8BDD\u8EAB\u4EFD\" });\n }\n } catch (cause) {\n const detail = object(cause)?.publicMessage;\n throw Object.assign(new Error(\"\u4F1A\u8BDD\u91CD\u7F6E\u5C1A\u672A\u5B8C\u6210\", { cause }), {\n code: \"RESET_INCOMPLETE\", status: 502,\n publicMessage: `${this.#resetArchived ? \"\u65E7\u4F1A\u8BDD\u5DF2\u7ED3\u675F\uFF0C\u65B0\u4F1A\u8BDD\u521B\u5EFA\u672A\u5B8C\u6210\" : \"\u5C1A\u672A\u786E\u8BA4\u65E7\u4F1A\u8BDD\u5DF2\u7ED3\u675F\"}\uFF0C\u8BF7\u518D\u6B21\u70B9\u51FB\u300C\u6E05\u7A7A\u5BF9\u8BDD\u300D\u91CD\u8BD5\u3002${typeof detail === \"string\" ? `\uFF08${detail}\uFF09` : \"\"}`,\n });\n }\n this.#active = undefined;\n this.#latest = undefined;\n this.#streaming = undefined;\n this.#lastSend = undefined;\n this.#messages = Object.freeze([]);\n this.#resetTarget = undefined;\n this.#resetArchived = false;\n }\n\n async cancel(\n _runId: string,\n _options: { readonly signal?: AbortSignal } = {},\n ): Promise<{ readonly runId: string; readonly status: \"cancel_requested\" | \"already_terminal\" }> {\n throw Object.assign(new Error(\"\u5F53\u524D MLB \u534F\u8BAE\u5C1A\u672A\u63D0\u4F9B\u7EC8\u6B62\u56DE\u590D\u63A5\u53E3\"), {\n code: \"TURN_CANCEL_UNSUPPORTED\",\n status: 501,\n publicMessage: \"\u5F53\u524D\u7248\u672C\u6682\u4E0D\u652F\u6301\u7EC8\u6B62\u56DE\u590D\",\n });\n }\n\n async watchOutput(\n runId: string,\n options: {\n readonly signal?: AbortSignal;\n readonly onEvent: (event: PreviewSimulatorOutputEvent) => void | Promise<void>;\n },\n ): Promise<void> {\n const safeRunId = safeText(runId, \"runId\", 256);\n const privateId = await this.#ensurePrivate(options.signal);\n const url = endpoint(this.#baseUrl, \"/app/ws\");\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n let sequence = 0;\n let assistantIds = new Set(this.#messages.filter(message => message.role === \"assistant\").map(message => message.messageId));\n const reset = async () => {\n sequence = 0;\n this.#streaming = undefined;\n await options.onEvent({ type: \"reset\", runId: safeRunId });\n };\n // Bounded reconnection; every ready re-reads durable history, including the initial handshake.\n for (let reconnects = 0; !options.signal?.aborted; reconnects++) {\n try {\n for await (const frame of mlbAppEvents(url, this.#accessToken, {\n signal: options.signal,\n })) {\n const { data } = frame;\n if (frame.event === \"ready\") {\n await reset();\n } else if (data.kind !== \"private\" || data.id !== privateId || data.buddyId !== this.#buddyId) {\n continue;\n }\n if (frame.event === \"delta\" && typeof data.text === \"string\" && data.text.length > 0) {\n const text = `${this.#streaming?.runId === safeRunId ? this.#streaming.text : \"\"}${data.text}`;\n if (Buffer.byteLength(text, \"utf8\") > 48 * 1024) throw new MlbEventStreamError(\"MLB \u6D41\u5F0F\u56DE\u590D\u8D85\u8FC7\u5927\u5C0F\u9650\u5236\", 502, false);\n this.#streaming = Object.freeze({ runId: safeRunId, text, nextSequence: sequence + 1, updatedAt: new Date().toISOString() });\n await options.onEvent({ type: \"delta\", runId: safeRunId, sequence, text: data.text });\n sequence++;\n continue;\n }\n if (frame.event !== \"chat\" && frame.event !== \"ready\") continue;\n let state = await this.state({ signal: options.signal });\n const nextAssistantIds = new Set(state.messages.filter(message => message.role === \"assistant\").map(message => message.messageId));\n const committedReply = [...nextAssistantIds].some(id => !assistantIds.has(id));\n assistantIds = nextAssistantIds;\n if (committedReply && state.activeRun) {\n // One observation can contain several model replies (steering/tools).\n // The durable message replaces the partial bubble before the next delta.\n sequence = 0;\n this.#streaming = undefined;\n const { streaming: _streaming, ...snapshot } = state;\n state = snapshot;\n }\n if (state.latestRun?.runId === safeRunId && (state.latestRun.status === \"completed\" || state.latestRun.status === \"failed\")) {\n await options.onEvent({ type: state.latestRun.status, runId: safeRunId, status: state.latestRun.status });\n return;\n }\n await options.onEvent({ type: \"state\", runId: safeRunId, state, resetStreaming: committedReply });\n // A chat notification may be the user's own send. Pending alone is not a failure.\n }\n if (options.signal?.aborted) return;\n } catch (cause) {\n if (options.signal?.aborted) return;\n await reset();\n const status = object(cause)?.status;\n if ((cause instanceof MlbEventStreamError && !cause.retryable)\n || (typeof status === \"number\" && status >= 400 && status < 500 && status !== 429)\n || reconnects >= 4) throw cause;\n }\n await waitForRetry(Math.min(1_000, (reconnects + 1) * 150), options.signal);\n }\n }\n\n async #ensurePrivate(signal?: AbortSignal): Promise<string> {\n if (this.#privateId) return this.#privateId;\n if (!this.#privatePromise) {\n const pending = this.#request(\n \"POST\",\n \"/app/privates\",\n { signal, body: { buddyId: this.#buddyId } },\n ).then((value) => {\n const body = object(value);\n if (body?.ok !== true || typeof body.id !== \"string\" || !/^p_[a-zA-Z0-9_-]{1,253}$/u.test(body.id)) {\n throw httpError(502, { error: \"MLB \u521B\u5EFA\u79C1\u804A\u54CD\u5E94\u7F3A\u5C11\u6709\u6548\u7684 privateId\" });\n }\n this.#privateId = body.id;\n return body.id;\n }).finally(() => {\n if (this.#privatePromise === pending) this.#privatePromise = undefined;\n });\n this.#privatePromise = pending;\n }\n return this.#privatePromise;\n }\n\n async #request(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n options: {\n readonly signal?: AbortSignal;\n readonly body?: Record<string, unknown>;\n },\n ): Promise<unknown> {\n const headers = new Headers({\n Accept: \"application/json\",\n Authorization: `Bearer ${this.#accessToken}`,\n });\n if (options.body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n const response = await this.#fetch(endpoint(this.#baseUrl, path), {\n method,\n headers,\n ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),\n signal: AbortSignal.any([AbortSignal.timeout(30_000), ...(options.signal ? [options.signal] : [])]),\n redirect: \"error\",\n });\n const value = await response.json().catch(() => undefined);\n if (!response.ok) throw httpError(response.status, value);\n return value;\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { WebSocket } from \"ws\";\n\nexport interface MlbAppEvent {\n readonly event: string;\n readonly data: Record<string, unknown>;\n}\n\nexport class MlbEventStreamError extends Error {\n readonly code = \"MLB_EVENT_STREAM_FAILED\";\n readonly publicMessage: string;\n constructor(message: string, readonly status = 502, readonly retryable = true) {\n super(message);\n this.publicMessage = message;\n }\n}\n\nexport class MlbAppCommandError extends Error {\n readonly code = \"MLB_REQUEST_FAILED\";\n readonly publicMessage: string;\n constructor(message: string, readonly status = 502) {\n super(message);\n this.publicMessage = message;\n }\n}\n\nfunction appSocket(url: URL, token: string): WebSocket {\n return new WebSocket(url, {\n headers: { Authorization: `Bearer ${token}` },\n followRedirects: false,\n handshakeTimeout: 10_000,\n maxPayload: 64 * 1024,\n perMessageDeflate: false,\n });\n}\n\n/** Sends one native App WebSocket command and closes after its matching receipt. */\nexport async function mlbAppCommand(\n url: URL,\n token: string,\n method: string,\n params: Record<string, unknown>,\n options: { readonly signal?: AbortSignal } = {},\n): Promise<Record<string, unknown>> {\n if (options.signal?.aborted) throw options.signal.reason;\n const requestId = randomUUID();\n const socket = appSocket(url, token);\n return await new Promise<Record<string, unknown>>((resolve, reject) => {\n let settled = false;\n let ready = false;\n let sent = false;\n const cleanup = (): void => {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n if (socket.readyState !== WebSocket.CLOSED) socket.terminate();\n };\n const finish = (value: Record<string, unknown>): void => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const fail = (cause: unknown): void => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(cause);\n };\n const abort = (): void => fail(options.signal?.reason);\n const timer = setTimeout(() => fail(new MlbAppCommandError(\"MLB WebSocket \u547D\u4EE4\u7B49\u5F85\u8D85\u65F6\")), 30_000);\n timer.unref();\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n socket.on(\"error\", () => fail(new MlbAppCommandError(\"\u65E0\u6CD5\u8FDE\u63A5 MLB WebSocket\")));\n socket.on(\"unexpected-response\", (_request, response) => {\n const status = response.statusCode ?? 502;\n fail(new MlbAppCommandError(\n status === 401 ? \"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\" : `MLB WebSocket \u63E1\u624B\u5931\u8D25\uFF08HTTP ${status}\uFF09`,\n status,\n ));\n response.destroy();\n });\n socket.on(\"close\", (code) => fail(code === 4401\n ? new MlbAppCommandError(\"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\", 401)\n : new MlbAppCommandError(\"MLB WebSocket \u8FDE\u63A5\u4E2D\u65AD\")));\n socket.on(\"message\", (raw, binary) => {\n if (settled) return;\n try {\n if (binary) throw new Error(\"binary\");\n const bytes = Array.isArray(raw) ? Buffer.concat(raw) : Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n const frame = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n const data = frame.data;\n if (!frame || frame.v !== 1 || !data || typeof data !== \"object\" || Array.isArray(data)) {\n throw new Error(\"envelope\");\n }\n if (frame.type === \"event\") {\n if (!ready) {\n if (frame.event !== \"ready\" || (data as Record<string, unknown>).resync !== true\n || typeof (data as Record<string, unknown>).connectionId !== \"string\"\n || !(data as Record<string, unknown>).connectionId) throw new Error(\"ready required\");\n ready = true;\n if (!sent) {\n sent = true;\n socket.send(JSON.stringify({ v: 1, type: \"request\", requestId, method, params }));\n }\n }\n return;\n }\n if (frame.type !== \"response\" || !ready || frame.requestId !== requestId\n || !Number.isSafeInteger(frame.status) || (frame.status as number) < 100 || (frame.status as number) > 599) {\n throw new Error(\"response\");\n }\n const status = frame.status as number;\n if (status >= 200 && status < 300) {\n finish(data as Record<string, unknown>);\n return;\n }\n const serverMessage = (data as Record<string, unknown>).error;\n fail(new MlbAppCommandError(\n typeof serverMessage === \"string\" && serverMessage.trim()\n ? serverMessage.slice(0, 512)\n : status >= 500 ? \"MLB Server \u6682\u65F6\u4E0D\u53EF\u7528\" : \"\u6A21\u62DF\u5668\u8BF7\u6C42\u672A\u80FD\u5B8C\u6210\",\n status,\n ));\n } catch {\n fail(new MlbAppCommandError(\"MLB WebSocket \u8FD4\u56DE\u4E86\u65E0\u6548\u547D\u4EE4\u56DE\u6267\"));\n }\n });\n if (options.signal?.aborted) abort();\n });\n}\n\n/** One authenticated Node-side connection. No credentials or remote socket reach the browser. */\nexport async function* mlbAppEvents(\n url: URL,\n token: string,\n options: { readonly signal?: AbortSignal } = {},\n): AsyncGenerator<MlbAppEvent> {\n if (options.signal?.aborted) return;\n const socket = appSocket(url, token);\n const queue: Array<{ frame: MlbAppEvent; bytes: number }> = [];\n let queuedBytes = 0;\n let ready = false;\n let ended = false;\n let failure: MlbEventStreamError | undefined;\n let wake: (() => void) | undefined;\n const finish = (cause?: MlbEventStreamError) => {\n if (ended) return;\n ended = true;\n failure = cause;\n wake?.();\n };\n // A successful handshake without ready, or a silent broken connection, must not hang forever.\n let timer = setTimeout(() => finish(new MlbEventStreamError(\"MLB WebSocket \u672A\u5B8C\u6210\u521D\u59CB\u5316\")), 10_000);\n timer.unref();\n const heartbeat = () => {\n if (!ready || ended) return;\n clearTimeout(timer);\n timer = setTimeout(() => finish(new MlbEventStreamError(\"MLB WebSocket \u5FC3\u8DF3\u4E2D\u65AD\")), 60_000);\n timer.unref();\n };\n const abort = () => finish();\n socket.on(\"ping\", heartbeat); // ws automatically answers the server's ping with pong.\n socket.on(\"error\", () => finish(new MlbEventStreamError(\"\u65E0\u6CD5\u8FDE\u63A5 MLB WebSocket\")));\n socket.on(\"unexpected-response\", (_request, response) => {\n const status = response.statusCode ?? 502;\n finish(new MlbEventStreamError(\n status === 401 ? \"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\" : `MLB WebSocket \u63E1\u624B\u5931\u8D25\uFF08HTTP ${status}\uFF09`,\n status,\n status >= 500 || status === 429,\n ));\n response.destroy();\n });\n socket.on(\"close\", (code) => finish(code === 4401\n ? new MlbEventStreamError(\"MLB \u767B\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55\u540E\u91CD\u542F DEV\", 401, false)\n : new MlbEventStreamError(\"MLB WebSocket \u8FDE\u63A5\u4E2D\u65AD\", 502, ![1002, 1003, 1007, 1008, 1009].includes(code))));\n socket.on(\"message\", (raw, binary) => {\n if (ended) return;\n try {\n if (binary) throw new Error(\"binary\");\n const bytes = Array.isArray(raw) ? Buffer.concat(raw) : Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n const frame = JSON.parse(bytes.toString(\"utf8\"));\n if (!frame || frame.v !== 1 || frame.type !== \"event\" || typeof frame.event !== \"string\"\n || !frame.data || typeof frame.data !== \"object\" || Array.isArray(frame.data)) throw new Error(\"envelope\");\n if (!ready && frame.event !== \"ready\") throw new Error(\"ready required\");\n if (frame.event === \"ready\" && (frame.data.resync !== true\n || typeof frame.data.connectionId !== \"string\" || !frame.data.connectionId)) throw new Error(\"invalid ready\");\n ready = true;\n heartbeat();\n queuedBytes += bytes.byteLength;\n if (queuedBytes > 1024 * 1024 || queue.length >= 1024) {\n finish(new MlbEventStreamError(\"MLB \u4E8B\u4EF6\u63A5\u6536\u79EF\u538B\uFF0C\u6B63\u5728\u91CD\u65B0\u540C\u6B65\"));\n return;\n }\n queue.push({ frame: { event: frame.event, data: frame.data }, bytes: bytes.byteLength });\n wake?.();\n } catch {\n finish(new MlbEventStreamError(\"MLB WebSocket \u8FD4\u56DE\u4E86\u65E0\u6548\u4E8B\u4EF6\", 502, false));\n }\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n try {\n while (!ended) {\n const item = queue.shift();\n if (item) {\n queuedBytes -= item.bytes;\n yield item.frame;\n } else {\n await new Promise<void>((resolve) => { wake = resolve; });\n wake = undefined;\n }\n }\n if (failure && !options.signal?.aborted) throw failure;\n } finally {\n ended = true;\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n // Keep the error listener while terminating a socket that may still be upgrading.\n if (socket.readyState !== WebSocket.CLOSED) socket.terminate();\n }\n}\n", "/** Public App-plane profile, not the /cli/buddies response containing a Buddy token. */\nexport interface PreviewBuddyDetails {\n readonly id: string;\n readonly isDev: boolean;\n readonly name: string;\n readonly avatar: string | null;\n /** Local browser-safe preview fetched from the platform, without exposing credentials. */\n readonly avatarPreview?: string | null;\n readonly tagline: string | null;\n readonly intro: string | null;\n readonly creatorUserId: string | null;\n readonly creatorUserName: string | null;\n readonly creatorUserAvatar: string | null;\n readonly privateId: string | null;\n readonly addedCount: number;\n}\n\nfunction invalid(): never {\n throw Object.assign(new Error(\"MLB \u8FD4\u56DE\u7684\u5F00\u53D1\u7248\u642D\u5B50\u8BE6\u60C5\u4E0D\u7B26\u5408\u63A5\u53E3\u7EA6\u5B9A\"), {\n code: \"BUDDY_DETAILS_INVALID\", status: 502,\n publicMessage: \"MLB \u8FD4\u56DE\u7684\u5F00\u53D1\u7248\u642D\u5B50\u8BE6\u60C5\u4E0D\u7B26\u5408\u63A5\u53E3\u7EA6\u5B9A\",\n });\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return invalid();\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, multiline = false): string {\n if (typeof value !== \"string\" || Buffer.byteLength(value) > 32 * 1024\n || (multiline ? /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/u : /[\\u0000-\\u001f\\u007f]/u).test(value)) return invalid();\n return value;\n}\n\nfunction nullableText(value: unknown, multiline = false): string | null {\n return value === null ? null : text(value, multiline);\n}\n\nexport function parsePreviewBuddyDetails(value: unknown, expectedId: string): PreviewBuddyDetails {\n const source = record(value);\n if (source.id !== expectedId || source.isDev !== true || typeof source.name !== \"string\" || !source.name.trim()\n || (source.privateId !== null && (typeof source.privateId !== \"string\" || !/^p_[a-zA-Z0-9_-]{1,253}$/u.test(source.privateId)))\n || !Number.isSafeInteger(source.addedCount) || (source.addedCount as number) < 0) return invalid();\n // Copy the public fields explicitly. Unexpected token/online fields must not\n // reach the browser or be mistaken for a documented App capability.\n return Object.freeze({\n id: expectedId, isDev: true, name: text(source.name),\n avatar: nullableText(source.avatar), tagline: nullableText(source.tagline), intro: nullableText(source.intro, true),\n creatorUserId: nullableText(source.creatorUserId), creatorUserName: nullableText(source.creatorUserName), creatorUserAvatar: nullableText(source.creatorUserAvatar),\n privateId: source.privateId as string | null, addedCount: source.addedCount as number,\n });\n}\n", "import { hostname } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { PreviewController } from \"./controller.js\";\nimport type { PreviewControlServer } from \"./server.js\";\n\ninterface Command { id: string; path: string; method: string; body?: string }\ninterface Reply { id: string; status: number; contentType: string; body: string }\nexport interface PreviewBridgeOptions {\n webUrl: URL; platformOrigin: string; buddyId: string; controller: PreviewController;\n localServer: PreviewControlServer; token: () => Promise<string>; signal: AbortSignal;\n stopLocalDev?: () => Promise<{ stopped: boolean }>;\n onStatus?: (message: string) => void;\n}\n\n/** Outbound-only HTTPS transport; the browser never receives localhost or account credentials. */\nexport async function connectPreviewBridge(options: PreviewBridgeOptions) {\n const connectionId = randomBytes(32).toString(\"base64url\");\n const shutdown = new AbortController();\n const signal = AbortSignal.any([options.signal, shutdown.signal]);\n const running = new Map<string, Promise<void>>();\n const replies = new Map<string, Reply>();\n const completed = new Set<string>();\n let lastContact = Date.now();\n let stopping: Promise<unknown> | undefined;\n let interrupted = false;\n let disconnecting = false;\n async function call(path: string, token: string, payload?: unknown, requestSignal = signal) {\n const response = await fetch(new URL(path, options.webUrl), {\n method: \"POST\", redirect: \"error\", signal: AbortSignal.any([requestSignal, AbortSignal.timeout(4000)]),\n headers: { Authorization: `Bearer ${token}`, \"Content-Type\": \"application/json\" }, body: JSON.stringify(payload ?? {}),\n });\n const value = await response.json() as { error?: string; reused?: boolean; liveEvents?: boolean; commands?: Command[]; acknowledged?: string[] };\n if (!response.ok) throw Object.assign(new Error(value.error || \"\u540E\u53F0\u8FDE\u63A5\u5931\u8D25\"), { status: response.status });\n return value;\n }\n const attach = async () => {\n const result = await call(\"api/preview/connect\", await options.token(), {\n connectionId, forceDisconnect: true, buddyId: options.buddyId, projectRoot: options.controller.projectRoot, machineName: hostname(), platformOrigin: options.platformOrigin,\n });\n lastContact = Date.now();\n return result;\n };\n // Bootstrap only the CLI's HTTP client. This capability never leaves this process.\n const bootstrap = await fetch(options.localServer.bootstrapUrl, { redirect: \"manual\", signal });\n const cookie = bootstrap.headers.get(\"set-cookie\")?.split(\";\", 1)[0];\n if (bootstrap.status !== 303 || !cookie) throw new Error(\"\u672C\u5730\u8C03\u8BD5\u670D\u52A1\u521D\u59CB\u5316\u5931\u8D25\");\n const initial = await attach();\n if (initial.reused) return { reused: true, completion: Promise.resolve(), async close() {} };\n // Event-driven outbound delivery is independent of the command polling loop.\n // Retain only the newest snapshot of each type while a request is in flight.\n const pendingEvents = new Map<string, { sequence: number; type: string; value: unknown }>();\n let eventSequence = 0;\n let publishing: Promise<void> | undefined;\n let retryEvents: ReturnType<typeof setTimeout> | undefined;\n const flushEvents = () => {\n if (!initial.liveEvents || signal.aborted || publishing || retryEvents || !pendingEvents.size) return;\n publishing = (async () => {\n while (!signal.aborted && pendingEvents.size) {\n const events = [...pendingEvents.values()].sort((a, b) => a.sequence - b.sequence);\n try {\n await call(\"api/preview/events\", connectionId, { events });\n for (const event of events) if (pendingEvents.get(event.type) === event) pendingEvents.delete(event.type);\n } catch {\n if (!signal.aborted) retryEvents = setTimeout(() => { retryEvents = undefined; flushEvents(); }, 500);\n break;\n }\n }\n })().finally(() => { publishing = undefined; });\n };\n const queueEvent = (type: string, value: unknown) => {\n if (!initial.liveEvents || signal.aborted) return;\n pendingEvents.set(type, { sequence: eventSequence++, type, value });\n flushEvents();\n };\n const snapshotEvents = () => {\n queueEvent(\"dev.state\", options.controller.state());\n queueEvent(\"simulator.state\", { state: options.controller.simulatorSnapshot() });\n };\n const unsubscribeDev = options.controller.subscribe(state => queueEvent(\"dev.state\", state));\n // Large diagnostic logs have their own read path; never send them with every token.\n const unsubscribeSimulator = options.controller.subscribeSimulator(({ state }) => queueEvent(\"simulator.state\", { state }));\n snapshotEvents();\n const watchdog = setInterval(() => {\n if (Date.now() - lastContact < 10_000 || stopping || interrupted) return;\n interrupted = true;\n // Stop DEV before the server lease can be claimed by another connector.\n stopping = options.controller.stop();\n void stopping.catch(() => shutdown.abort());\n options.onStatus?.(\"\u540E\u53F0\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u6B63\u5728\u505C\u6B62 DEV\uFF1B\u8FDE\u63A5\u6062\u590D\u540E\u53EF\u5728\u540E\u53F0\u91CD\u65B0\u542F\u52A8\u3002\");\n }, 500);\n watchdog.unref();\n async function execute(command: Command) {\n try {\n if (command.path === \"/api/connection/disconnect\" && command.method === \"POST\") {\n disconnecting = true;\n await options.controller.close();\n await options.stopLocalDev?.();\n replies.set(command.id, { id: command.id, status: 200, contentType: \"application/json\", body: Buffer.from(JSON.stringify({ localStopped: Boolean(options.stopLocalDev) })).toString(\"base64\") });\n options.onStatus?.(\"\u540E\u53F0\u5DF2\u8BF7\u6C42\u5F3A\u5236\u65AD\u8FDE\uFF0C\u5F53\u524D\u5DE5\u7A0B DEV \u5DF2\u505C\u6B62\u3002\u9700\u8981\u8C03\u8BD5\u65F6\u91CD\u65B0\u6267\u884C\u8FDE\u63A5\u6307\u4EE4\u3002\");\n return;\n }\n if (disconnecting) throw new Error(\"\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\");\n if (!command.path.startsWith(\"/api/\") || command.path === \"/api/events\" || command.path.includes(\"..\")) throw new Error(\"\u8C03\u8BD5\u8DEF\u5F84\u65E0\u6548\");\n const target = new URL(command.path, options.localServer.origin);\n if (target.origin !== options.localServer.origin.origin) throw new Error(\"\u8C03\u8BD5\u8DEF\u5F84\u65E0\u6548\");\n if ((await options.controller.project()).buddyId !== options.buddyId) throw new Error(\"\u5DE5\u7A0B buddyId \u5DF2\u6539\u53D8\uFF0C\u8BF7\u9000\u51FA CLI \u540E\u91CD\u65B0\u8FDE\u63A5\u5BF9\u5E94\u642D\u5B50\");\n signal.throwIfAborted();\n if (interrupted || disconnecting) throw new Error(\"\u672C\u5730\u8FDE\u63A5\u5DF2\u4E2D\u65AD\");\n const response = await fetch(target, {\n method: command.method, redirect: \"error\", signal: AbortSignal.any([signal, AbortSignal.timeout(28_000)]),\n headers: { Cookie: cookie!, ...(command.body ? { \"Content-Type\": \"application/json\" } : {}) },\n ...(command.body ? { body: command.body } : {}),\n });\n const chunks: Buffer[] = []; let size = 0;\n for await (const chunk of response.body ?? []) {\n size += chunk.length;\n if (size > 8 * 1024 * 1024) throw new Error(\"\u8C03\u8BD5\u54CD\u5E94\u8FC7\u5927\");\n chunks.push(Buffer.from(chunk));\n }\n replies.set(command.id, { id: command.id, status: response.status, contentType: response.headers.get(\"content-type\") ?? \"application/json\", body: Buffer.concat(chunks).toString(\"base64\") });\n } catch {\n replies.set(command.id, { id: command.id, status: 502, contentType: \"application/json\", body: Buffer.from(JSON.stringify({ error: { code: \"PREVIEW_LOCAL_FAILED\", message: \"\u672C\u5730\u8C03\u8BD5\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7EC8\u7AEF\u53CA\u5DE5\u7A0B buddyId\" } })).toString(\"base64\") });\n } finally { running.delete(command.id); }\n }\n const completion = (async () => {\n try {\n while (!signal.aborted) {\n try {\n if (stopping) { await stopping; stopping = undefined; }\n const result = await call(\"api/preview/poll\", connectionId, { replies: [...replies.values()].slice(0, 1) });\n lastContact = Date.now();\n const recovered = interrupted;\n if (stopping) { await stopping; stopping = undefined; }\n if (recovered) { interrupted = false; options.onStatus?.(\"\u5DF2\u91CD\u65B0\u8FDE\u63A5\u540E\u53F0\uFF0C\u8BF7\u5728\u5F00\u53D1\u8C03\u8BD5\u9875\u542F\u52A8 DEV\u3002\"); }\n for (const id of result.acknowledged ?? []) { replies.delete(id); completed.add(id); }\n while (completed.size > 256) completed.delete(completed.values().next().value!);\n for (const command of result.commands ?? []) {\n if (recovered && !running.has(command.id) && !replies.has(command.id) && !completed.has(command.id)) {\n replies.set(command.id, { id: command.id, status: 409, contentType: \"application/json\", body: Buffer.from(JSON.stringify({ error: { code: \"PREVIEW_RECONNECTED\", message: \"\u672C\u5730\u8FDE\u63A5\u5DF2\u6062\u590D\uFF0C\u8BF7\u91CD\u65B0\u64CD\u4F5C\" } })).toString(\"base64\") });\n }\n if (!running.has(command.id) && !replies.has(command.id) && !completed.has(command.id) && running.size < 32) running.set(command.id, execute(command));\n }\n } catch (cause) {\n if (signal.aborted) break;\n const status = (cause as { status?: number }).status;\n if (status === 410) {\n await options.controller.stop();\n options.onStatus?.(\"\u540E\u53F0\u8FDE\u63A5\u5DF2\u7ED3\u675F\uFF1B\u8BF7\u91CD\u65B0\u6267\u884C\u8FDE\u63A5\u6307\u4EE4\u3002\u672A\u81EA\u52A8\u91CD\u65B0\u8FDE\u63A5\u6216\u542F\u52A8 DEV\u3002\");\n break;\n }\n else if (status && status >= 400 && status < 500 && status !== 429) throw cause;\n }\n await delay(replies.size ? 20 : 500, undefined, { signal }).catch(() => undefined);\n }\n } finally {\n clearInterval(watchdog);\n unsubscribeDev(); unsubscribeSimulator();\n if (retryEvents) clearTimeout(retryEvents);\n shutdown.abort();\n await publishing;\n }\n })();\n // Keep errors observed while the host is opening the browser.\n void completion.catch(() => undefined);\n return {\n reused: false,\n completion,\n async close() {\n shutdown.abort();\n await completion.catch(() => undefined);\n await Promise.allSettled(running.values());\n await stopping;\n await options.controller.stop();\n await call(\"api/preview/disconnect\", connectionId, {}, AbortSignal.timeout(2000)).catch(() => undefined);\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["text", "record", "text", "message", "existing", "require", "message", "object", "message", "message", "text", "receipt", "item", "randomBytes"]
7
7
  }