@my-life-buddies/cli 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -10
- package/dist/bin/buddy.js +9 -0
- package/dist/bin/buddy.js.map +3 -3
- package/dist/bin/core.js +695 -412
- package/dist/bin/core.js.map +4 -4
- package/dist/bin/preview.js +12 -1
- package/dist/bin/preview.js.map +2 -2
- package/dist/web/app.css +4 -0
- package/dist/web/app.js +14 -1
- package/dist/web/index.html +1 -1
- package/dist/web/widgets.js +1 -1
- package/package.json +3 -3
- package/resources/dada-object-avatar/SKILL.md +37 -0
- package/resources/dada-object-avatar/agents/openai.yaml +4 -0
- package/resources/dada-object-avatar/assets/examples/cat.png +0 -0
- package/resources/dada-object-avatar/assets/examples/cooking.png +0 -0
- package/resources/dada-object-avatar/assets/examples/divination.png +0 -0
- package/resources/dada-object-avatar/assets/examples/doctor.png +0 -0
- package/resources/dada-object-avatar/assets/examples/relationship.png +0 -0
- package/resources/dada-object-avatar/assets/examples/work.png +0 -0
- package/resources/dada-object-avatar/assets/preview.png +0 -0
- package/resources/dada-object-avatar/references/evaluation-rubric.md +22 -0
- package/resources/dada-object-avatar/references/examples.json +8 -0
- package/resources/dada-object-avatar/references/prompt-template.md +27 -0
- package/resources/dada-object-avatar/references/style-system.md +54 -0
- package/resources/dada-object-avatar/references/subject-design.md +23 -0
- package/resources/dada-object-avatar/references/training-guide.md +14 -0
- package/resources/dada-object-avatar/references/training-log.jsonl +0 -0
- package/resources/dada-object-avatar/references/training-record.schema.json +20 -0
- package/resources/dada-object-avatar/scripts/choose_gaze.py +36 -0
- package/resources/dada-object-avatar/scripts/record_example.py +22 -0
- package/resources/dada-object-avatar/scripts/validate_png.py +52 -0
- package/resources/dada-object-avatar.manifest.json +85 -0
package/dist/bin/preview.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../preview/src/controller.ts", "../../../preview/src/device-preview.ts", "../../../preview/src/server.ts", "../../../preview/src/mlb-simulator.ts", "../../../preview/src/mlb-events.ts", "../../../preview/src/buddy-details.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\";\n\nexport type PreviewDevPhase = \"idle\" | \"starting\" | \"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 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}\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 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 /** App Server \u7684\u6700\u65B0\u6743\u5A01 Run\uFF1B\u5373\u4F7F\u5DF2\u7ECF\u7ED3\u675F\u4E5F\u4FDD\u7559\uFF0C\u4F9B\u8C03\u8BD5\u5668\u533A\u5206\u5931\u8D25\u3001\u53D6\u6D88\u4E0E\u6210\u529F\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: \"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}\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): Promise<string>;\n pinWidget?(id: string, pinned: boolean): 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 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 #runOrdinal = 0;\n #conversationRevision = 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 #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 });\n }\n\n start(): Promise<PreviewDevState> {\n if (this.#startPromise) return this.#startPromise;\n if (this.#state.phase === \"ready\") 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.#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 onLog: ({ source, text }) => {\n if (controller.signal.aborted) return;\n this.#record({ channel: \"dev\", type: source, summary: text.slice(0, 8_224) });\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 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\", id = \"\", mediaId = \"\"): 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 };\n else if (action === \"html\" && client.widgetHtml) result = await client.widgetHtml(id);\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.#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)) return accepted; // A retry of an acknowledged send keeps its original run.\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 });\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 (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 === \"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 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", "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/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 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 ...(config.model === undefined ? {} : { model: config.model }),\n datasets: (config.datasets ?? []).map(({ id, purpose }) => ({ id, purpose })),\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 (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) as string;\n // Opaque sandbox origin: HTML can run its own scripts but receives no preview/account credentials.\n writeHeaders(response);\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 response.end(html); 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 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 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: `<buddy.agent.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 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 });\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 return details;\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): Promise<string> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate();\n const result = await this.#widgetResource(`/app/widgets/${encodeURIComponent(widgetId(id))}?conversationId=${encodeURIComponent(privateId)}`);\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 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): Promise<{ body: Uint8Array; contentType: string }> {\n const response = await this.#fetch(authenticated ? endpoint(this.#baseUrl, path) : new URL(path), { headers: authenticated ? { Authorization: `Bearer ${this.#accessToken}` } : {}, 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: \"failed\" 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.#active || this.#sending) {\n throw Object.assign(new Error(\"\u4E0A\u4E00\u8F6E\u56DE\u590D\u5C1A\u672A\u7ED3\u675F\"), {\n code: \"TURN_IN_PROGRESS\", status: 409, publicMessage: \"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u5B8C\u6210\u540E\u518D\u53D1\u9001\",\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 const runId = localReceipt(\"turn\", idempotencyKey);\n const messageId = safeText(item.messageId, \"receipt.items[0].messageId\", 256);\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 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 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 const state = await this.state({ signal: options.signal });\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 // 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 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"],
|
|
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\";\n\nexport type PreviewDevPhase = \"idle\" | \"starting\" | \"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 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}\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 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 /** App Server \u7684\u6700\u65B0\u6743\u5A01 Run\uFF1B\u5373\u4F7F\u5DF2\u7ECF\u7ED3\u675F\u4E5F\u4FDD\u7559\uFF0C\u4F9B\u8C03\u8BD5\u5668\u533A\u5206\u5931\u8D25\u3001\u53D6\u6D88\u4E0E\u6210\u529F\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: \"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}\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): Promise<string>;\n pinWidget?(id: string, pinned: boolean): 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 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 #runOrdinal = 0;\n #conversationRevision = 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 #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 });\n }\n\n start(): Promise<PreviewDevState> {\n if (this.#startPromise) return this.#startPromise;\n if (this.#state.phase === \"ready\") 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.#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 onLog: ({ source, text }) => {\n if (controller.signal.aborted) return;\n this.#record({ channel: \"dev\", type: source, summary: text.slice(0, 8_224) });\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 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\", id = \"\", mediaId = \"\"): 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 };\n else if (action === \"html\" && client.widgetHtml) result = await client.widgetHtml(id);\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.#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)) return accepted; // A retry of an acknowledged send keeps its original run.\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 });\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 (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 === \"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 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", "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/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 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 ...(config.model === undefined ? {} : { model: config.model }),\n datasets: (config.datasets ?? []).map(({ id, purpose }) => ({ id, purpose })),\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 (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) as string;\n // Opaque sandbox origin: HTML can run its own scripts but receives no preview/account credentials.\n writeHeaders(response);\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 response.end(html); 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 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 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: `<buddy.agent.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 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 });\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): Promise<string> {\n this.#assertResetComplete();\n const privateId = await this.#ensurePrivate();\n const result = await this.#widgetResource(`/app/widgets/${encodeURIComponent(widgetId(id))}?conversationId=${encodeURIComponent(privateId)}`);\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 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): Promise<{ body: Uint8Array; contentType: string }> {\n const response = await this.#fetch(authenticated ? endpoint(this.#baseUrl, path) : new URL(path), { headers: authenticated ? { Authorization: `Bearer ${this.#accessToken}` } : {}, 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: \"failed\" 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.#active || this.#sending) {\n throw Object.assign(new Error(\"\u4E0A\u4E00\u8F6E\u56DE\u590D\u5C1A\u672A\u7ED3\u675F\"), {\n code: \"TURN_IN_PROGRESS\", status: 409, publicMessage: \"\u8BF7\u7B49\u5F85\u5F53\u524D\u56DE\u590D\u5B8C\u6210\u540E\u518D\u53D1\u9001\",\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 const runId = localReceipt(\"turn\", idempotencyKey);\n const messageId = safeText(item.messageId, \"receipt.items[0].messageId\", 256);\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 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 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 const state = await this.state({ signal: options.signal });\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 // 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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["text", "message", "existing", "require", "message", "object", "message", "message", "text", "receipt", "item"]
|
|
7
7
|
}
|