@asgard-js/core 0.3.85 → 0.3.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -3
- package/dist/index.mjs.map +1 -1
- package/dist/lib/derived-stores.d.ts.map +1 -1
- package/dist/lib/subagent-reducer.d.ts +2 -0
- package/dist/lib/subagent-reducer.d.ts.map +1 -1
- package/dist/types/subagent.d.ts +7 -0
- package/dist/types/subagent.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/types/http-error.ts","../src/types/channel-busy-error.ts","../src/types/channel-awaiting-consent-error.ts","../src/constants/enum.ts","../../../node_modules/@microsoft/fetch-event-source/lib/esm/parse.js","../../../node_modules/@microsoft/fetch-event-source/lib/esm/fetch.js","../../../node_modules/tslib/tslib.es6.mjs","../../../node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../node_modules/rxjs/dist/esm5/internal/config.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../node_modules/rxjs/dist/esm5/internal/Observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../node_modules/rxjs/dist/esm5/internal/util/ObjectUnsubscribedError.js","../../../node_modules/rxjs/dist/esm5/internal/Subject.js","../../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../node_modules/rxjs/dist/esm5/internal/util/isScheduler.js","../../../node_modules/rxjs/dist/esm5/internal/util/args.js","../../../node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../node_modules/rxjs/dist/esm5/internal/operators/observeOn.js","../../../node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js","../../../node_modules/rxjs/dist/esm5/internal/observable/from.js","../../../node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../node_modules/rxjs/dist/esm5/internal/util/mapOneOrManyArgs.js","../../../node_modules/rxjs/dist/esm5/internal/util/argsArgArrayOrObject.js","../../../node_modules/rxjs/dist/esm5/internal/util/createObject.js","../../../node_modules/rxjs/dist/esm5/internal/observable/combineLatest.js","../../../node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../node_modules/rxjs/dist/esm5/internal/operators/bufferTime.js","../../../node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js","../../../node_modules/rxjs/dist/esm5/internal/operators/finalize.js","../../../node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js","../src/lib/create-sse-observable.ts","../src/lib/event-emitter.ts","../src/lib/client.ts","../src/lib/source-set-path.ts","../src/lib/source-set-client.ts","../node_modules/uuid/dist/stringify.js","../node_modules/uuid/dist/rng.js","../node_modules/uuid/dist/native.js","../node_modules/uuid/dist/v4.js","../src/lib/conversation.ts","../src/lib/task-reducer.ts","../src/lib/subagent-reducer.ts","../src/lib/derived-stores.ts","../src/lib/launched-sandboxes.ts","../src/lib/channel.ts","../src/lib/feedback-message.ts","../src/lib/resolve-sandbox-uri.ts","../src/lib/keysym.ts","../src/lib/sandbox-browser-transport.ts"],"sourcesContent":["export class HttpError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n /**\n * The decoded error payload, when the response carried one.\n *\n * Consumers branch on this — `asgard-ai-data-insight-web` reads `reason_code` off it to raise its\n * credit-limit dialog on a `429` — so **always pass it when constructing from a real response**,\n * even though the parameter is optional.\n */\n public readonly body: unknown;\n\n // `body` is optional because every construction site derives it from a response whose text or JSON\n // may fail to parse, yielding `undefined` or `null`. An absent body is therefore a normal outcome\n // rather than a caller mistake, and a test raising a status-only error need not pass a filler value.\n constructor(status: number, statusText: string, body?: unknown) {\n super(`HTTP ${status}: ${statusText}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.body = body;\n }\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n","import { RunKind } from './channel';\n\n/**\n * Thrown by `Channel.sendMessage()` when a run is already in flight on that channel (F-023 AC6 /\n * UC-045). Because runs execute in the background on the server, dispatching a second one would leave\n * two concurrent runs writing to the same transcript. The SDK's own composer already gates every send\n * entrance, so this only surfaces for programmatic sends — a rejection rather than a silent drop, so\n * the caller can tell the message never left.\n */\nexport class ChannelBusyError extends Error {\n /** Which run is holding the channel. */\n public readonly runKind: RunKind;\n\n constructor(runKind: RunKind) {\n super(`Cannot send a message while a \"${runKind}\" run is in flight on this channel.`);\n this.name = 'ChannelBusyError';\n this.runKind = runKind;\n }\n}\n\nexport function isChannelBusyError(error: unknown): error is ChannelBusyError {\n return error instanceof ChannelBusyError;\n}\n","/**\n * Thrown by `Channel.sendMessage()` and `Channel.nudge()` when the channel is parked on a tool-call\n * consent prompt. The server holds such a channel in a pause that only a consent reply resumes — every\n * other turn is rejected (\"use RespondToolCallConsent\"), a nudge included: it takes the same\n * `PostUserMessage` path as a plain message. The pause is invisible to the run-in-flight guard, because\n * the consent frame arrives *before* the run terminal — by the time the prompt is on screen the run has\n * already ended and the channel looks idle. Refusing here keeps a doomed turn from pushing an\n * optimistic bubble and a backend error into the thread. Answer with `replyToolCallConsents()` first.\n */\nexport class ChannelAwaitingConsentError extends Error {\n /**\n * The paused batch's process id, as carried by the pending consent prompt.\n *\n * **Empty string on a rejoin.** A prompt recovered after a reload is reconstructed by the backend\n * from its durable pause state, and that path deliberately leaves the process id blank (clients are\n * meant to detect a consent pause from the prompt's presence, not from this id). Treat it as a\n * diagnostic hint, never as a key.\n */\n public readonly processId: string;\n\n constructor(processId: string) {\n super('Cannot send this turn while the channel is awaiting a tool-call consent response.');\n this.name = 'ChannelAwaitingConsentError';\n this.processId = processId;\n }\n}\n\nexport function isChannelAwaitingConsentError(error: unknown): error is ChannelAwaitingConsentError {\n return error instanceof ChannelAwaitingConsentError;\n}\n","export enum FetchSseAction {\n /**\n * @deprecated The SDK no longer sends this (F-032). It bundles \"delete the channel\" and \"post the\n * first message\" into one request, and blobs belong to the channel that was live when they were\n * uploaded — so the delete strips them and the accompanying `blobIds` resolve to nothing, silently.\n * The backend now answers `400` to `RESET_CHANNEL` carrying a non-empty `blobIds`.\n *\n * To clear a conversation and start over on the same id, call `client.deleteChannel(customChannelId)`\n * and then open with `action: NONE` — `Channel.reset()` does exactly that. Retained (and still\n * accepted by the backend) so existing type references keep compiling.\n */\n RESET_CHANNEL = 'RESET_CHANNEL',\n NONE = 'NONE',\n RESPONSE_TOOL_CALL_CONSENT = 'RESPONSE_TOOL_CALL_CONSENT',\n NUDGE = 'NUDGE',\n}\n\nexport enum EventType {\n INIT = 'asgard.run.init',\n PROCESS = 'asgard.process',\n PROCESS_START = 'asgard.process.start',\n PROCESS_COMPLETE = 'asgard.process.complete',\n MESSAGE = 'asgard.message',\n MESSAGE_START = 'asgard.message.start',\n MESSAGE_DELTA = 'asgard.message.delta',\n MESSAGE_COMPLETE = 'asgard.message.complete',\n // Persist-only user turn — never on the live plane; only replayed on GET rejoin (F-014).\n MESSAGE_USER = 'asgard.message.user',\n // Extended-thinking (reasoning) stream — same shape as a normal message, rendered as a\n // separate collapsible thinking block (F-001). Independent of and usually earlier than the answer.\n MESSAGE_THINKING_START = 'asgard.message.thinking.start',\n MESSAGE_THINKING_DELTA = 'asgard.message.thinking.delta',\n MESSAGE_THINKING_COMPLETE = 'asgard.message.thinking.complete',\n\n // Canvas stream (F-030). `start` opens the block, each `delta` carries the markup that became\n // available (in the message's `text`, appended exactly like a text delta), and `complete` carries the\n // whole fragment as a CANVAS template — authoritative and self-sufficient, since a rejoin replays\n // only the complete. A `complete` with no template means the canvas could not be rendered.\n MESSAGE_CANVAS_START = 'asgard.message.canvas.start',\n MESSAGE_CANVAS_DELTA = 'asgard.message.canvas.delta',\n MESSAGE_CANVAS_COMPLETE = 'asgard.message.canvas.complete',\n TOOL_CALL = 'asgard.tool_call',\n TOOL_CALL_START = 'asgard.tool_call.start',\n TOOL_CALL_COMPLETE = 'asgard.tool_call.complete',\n TOOL_CALL_CONSENT = 'asgard.tool_call.consent',\n // Subagent lifecycle — a subagent spawned by an `Agent` tool-call. Its status is driven only by\n // these events, never the `Agent` tool_call.complete (async → completes early). Accumulated into\n // the Subagent list (F-012), keyed by `parentToolUseId` = the `Agent` tool-call's `toolUseId`.\n SUBAGENT_START = 'asgard.subagent.start',\n SUBAGENT_COMPLETE = 'asgard.subagent.complete',\n // Channel title push — reserved for F-016 to consume; enum aligned with asgard-core here (F-014).\n CHANNEL_TITLE_UPDATE = 'asgard.channel.title.update',\n // Next-turn prediction: at most one per run, pushed after the reply and before the run's terminal\n // event (F-028). Live-only — never persisted, so a rejoin replay does not carry it. \"No suggestion\"\n // is the normal case: most turns get none, and nothing may block waiting for one.\n PROMPT_SUGGESTION = 'asgard.prompt_suggestion',\n // Sandbox cold-start lifecycle (F-018) — `launch` = the backend is provisioning a compute sandbox,\n // `ready` = it is up. Drives the sandbox-phase store consumed by the Launch HUD; independent of the\n // run seam / RunningIndicator. Fact shape aligns with asgard-sdk-go `{ sandboxName, blueprintName }`.\n SANDBOX_LAUNCH = 'asgard.sandbox.launch',\n SANDBOX_READY = 'asgard.sandbox.ready',\n // A user's Good / Bad verdict on one assistant reply (F-033). A first-class transcript entry: delivered\n // live and replayed on rejoin, so the rated state is restored from the server rather than remembered\n // locally. Append-only — several frames may target the same reply and the latest one is the state.\n MESSAGE_FEEDBACK = 'asgard.message.feedback',\n DONE = 'asgard.run.done',\n ERROR = 'asgard.run.error',\n}\n\nexport enum ToolCallConsentResult {\n ALLOW_ONCE = 'ALLOW_ONCE',\n ALLOW_ALWAYS = 'ALLOW_ALWAYS',\n DENY_ONCE = 'DENY_ONCE',\n}\n\nexport enum MessageTemplateType {\n TEXT = 'TEXT',\n HINT = 'HINT',\n BUTTON = 'BUTTON',\n IMAGE = 'IMAGE',\n VIDEO = 'VIDEO',\n AUDIO = 'AUDIO',\n LOCATION = 'LOCATION',\n CAROUSEL = 'CAROUSEL',\n CHART = 'CHART',\n TABLE = 'TABLE',\n ATTACHMENT = 'ATTACHMENT',\n QUESTION = 'QUESTION',\n CANVAS = 'CANVAS',\n}\n","export async function getBytes(stream, onChunk) {\r\n const reader = stream.getReader();\r\n let result;\r\n while (!(result = await reader.read()).done) {\r\n onChunk(result.value);\r\n }\r\n}\r\nexport function getLines(onLine) {\r\n let buffer;\r\n let position;\r\n let fieldLength;\r\n let discardTrailingNewline = false;\r\n return function onChunk(arr) {\r\n if (buffer === undefined) {\r\n buffer = arr;\r\n position = 0;\r\n fieldLength = -1;\r\n }\r\n else {\r\n buffer = concat(buffer, arr);\r\n }\r\n const bufLength = buffer.length;\r\n let lineStart = 0;\r\n while (position < bufLength) {\r\n if (discardTrailingNewline) {\r\n if (buffer[position] === 10) {\r\n lineStart = ++position;\r\n }\r\n discardTrailingNewline = false;\r\n }\r\n let lineEnd = -1;\r\n for (; position < bufLength && lineEnd === -1; ++position) {\r\n switch (buffer[position]) {\r\n case 58:\r\n if (fieldLength === -1) {\r\n fieldLength = position - lineStart;\r\n }\r\n break;\r\n case 13:\r\n discardTrailingNewline = true;\r\n case 10:\r\n lineEnd = position;\r\n break;\r\n }\r\n }\r\n if (lineEnd === -1) {\r\n break;\r\n }\r\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength);\r\n lineStart = position;\r\n fieldLength = -1;\r\n }\r\n if (lineStart === bufLength) {\r\n buffer = undefined;\r\n }\r\n else if (lineStart !== 0) {\r\n buffer = buffer.subarray(lineStart);\r\n position -= lineStart;\r\n }\r\n };\r\n}\r\nexport function getMessages(onId, onRetry, onMessage) {\r\n let message = newMessage();\r\n const decoder = new TextDecoder();\r\n return function onLine(line, fieldLength) {\r\n if (line.length === 0) {\r\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);\r\n message = newMessage();\r\n }\r\n else if (fieldLength > 0) {\r\n const field = decoder.decode(line.subarray(0, fieldLength));\r\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1);\r\n const value = decoder.decode(line.subarray(valueOffset));\r\n switch (field) {\r\n case 'data':\r\n message.data = message.data\r\n ? message.data + '\\n' + value\r\n : value;\r\n break;\r\n case 'event':\r\n message.event = value;\r\n break;\r\n case 'id':\r\n onId(message.id = value);\r\n break;\r\n case 'retry':\r\n const retry = parseInt(value, 10);\r\n if (!isNaN(retry)) {\r\n onRetry(message.retry = retry);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\nfunction concat(a, b) {\r\n const res = new Uint8Array(a.length + b.length);\r\n res.set(a);\r\n res.set(b, a.length);\r\n return res;\r\n}\r\nfunction newMessage() {\r\n return {\r\n data: '',\r\n event: '',\r\n id: '',\r\n retry: undefined,\r\n };\r\n}\r\n//# sourceMappingURL=parse.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { getBytes, getLines, getMessages } from './parse';\r\nexport const EventStreamContentType = 'text/event-stream';\r\nconst DefaultRetryInterval = 1000;\r\nconst LastEventId = 'last-event-id';\r\nexport function fetchEventSource(input, _a) {\r\n var { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, fetch: inputFetch } = _a, rest = __rest(_a, [\"signal\", \"headers\", \"onopen\", \"onmessage\", \"onclose\", \"onerror\", \"openWhenHidden\", \"fetch\"]);\r\n return new Promise((resolve, reject) => {\r\n const headers = Object.assign({}, inputHeaders);\r\n if (!headers.accept) {\r\n headers.accept = EventStreamContentType;\r\n }\r\n let curRequestController;\r\n function onVisibilityChange() {\r\n curRequestController.abort();\r\n if (!document.hidden) {\r\n create();\r\n }\r\n }\r\n if (!openWhenHidden) {\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n }\r\n let retryInterval = DefaultRetryInterval;\r\n let retryTimer = 0;\r\n function dispose() {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.clearTimeout(retryTimer);\r\n curRequestController.abort();\r\n }\r\n inputSignal === null || inputSignal === void 0 ? void 0 : inputSignal.addEventListener('abort', () => {\r\n dispose();\r\n resolve();\r\n });\r\n const fetch = inputFetch !== null && inputFetch !== void 0 ? inputFetch : window.fetch;\r\n const onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;\r\n async function create() {\r\n var _a;\r\n curRequestController = new AbortController();\r\n try {\r\n const response = await fetch(input, Object.assign(Object.assign({}, rest), { headers, signal: curRequestController.signal }));\r\n await onopen(response);\r\n await getBytes(response.body, getLines(getMessages(id => {\r\n if (id) {\r\n headers[LastEventId] = id;\r\n }\r\n else {\r\n delete headers[LastEventId];\r\n }\r\n }, retry => {\r\n retryInterval = retry;\r\n }, onmessage)));\r\n onclose === null || onclose === void 0 ? void 0 : onclose();\r\n dispose();\r\n resolve();\r\n }\r\n catch (err) {\r\n if (!curRequestController.signal.aborted) {\r\n try {\r\n const interval = (_a = onerror === null || onerror === void 0 ? void 0 : onerror(err)) !== null && _a !== void 0 ? _a : retryInterval;\r\n window.clearTimeout(retryTimer);\r\n retryTimer = window.setTimeout(create, interval);\r\n }\r\n catch (innerErr) {\r\n dispose();\r\n reject(innerErr);\r\n }\r\n }\r\n }\r\n }\r\n create();\r\n });\r\n}\r\nfunction defaultOnOpen(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(EventStreamContentType))) {\r\n throw new Error(`Expected content-type to be ${EventStreamContentType}, Actual: ${contentType}`);\r\n }\r\n}\r\n//# sourceMappingURL=fetch.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export function isFunction(value) {\n return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","export function createErrorClass(createImpl) {\n var _super = function (instance) {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n var ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n return function UnsubscriptionErrorImpl(errors) {\n _super(this);\n this.message = errors\n ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n ')\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function arrRemove(arr, item) {\n if (arr) {\n var index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n function Subscription(initialTeardown) {\n this.initialTeardown = initialTeardown;\n this.closed = false;\n this._parentage = null;\n this._finalizers = null;\n }\n Subscription.prototype.unsubscribe = function () {\n var e_1, _a, e_2, _b;\n var errors;\n if (!this.closed) {\n this.closed = true;\n var _parentage = this._parentage;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n try {\n for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n var parent_1 = _parentage_1_1.value;\n parent_1.remove(this);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n _parentage.remove(this);\n }\n }\n var initialFinalizer = this.initialTeardown;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n }\n catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n var _finalizers = this._finalizers;\n if (_finalizers) {\n this._finalizers = null;\n try {\n for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n var finalizer = _finalizers_1_1.value;\n try {\n execFinalizer(finalizer);\n }\n catch (err) {\n errors = errors !== null && errors !== void 0 ? errors : [];\n if (err instanceof UnsubscriptionError) {\n errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n };\n Subscription.prototype.add = function (teardown) {\n var _a;\n if (teardown && teardown !== this) {\n if (this.closed) {\n execFinalizer(teardown);\n }\n else {\n if (teardown instanceof Subscription) {\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n }\n }\n };\n Subscription.prototype._hasParent = function (parent) {\n var _parentage = this._parentage;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n };\n Subscription.prototype._addParent = function (parent) {\n var _parentage = this._parentage;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n };\n Subscription.prototype._removeParent = function (parent) {\n var _parentage = this._parentage;\n if (_parentage === parent) {\n this._parentage = null;\n }\n else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n };\n Subscription.prototype.remove = function (teardown) {\n var _finalizers = this._finalizers;\n _finalizers && arrRemove(_finalizers, teardown);\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n };\n Subscription.EMPTY = (function () {\n var empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n return (value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n if (isFunction(finalizer)) {\n finalizer();\n }\n else {\n finalizer.unsubscribe();\n }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n setTimeout: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = timeoutProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearTimeout: function (handle) {\n var delegate = timeoutProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n timeoutProvider.setTimeout(function () {\n var onUnhandledError = config.onUnhandledError;\n if (onUnhandledError) {\n onUnhandledError(err);\n }\n else {\n throw err;\n }\n });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n var isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n }\n else {\n cb();\n }\n}\nexport function captureError(err) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n//# sourceMappingURL=errorContext.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n function Subscriber(destination) {\n var _this = _super.call(this) || this;\n _this.isStopped = false;\n if (destination) {\n _this.destination = destination;\n if (isSubscription(destination)) {\n destination.add(_this);\n }\n }\n else {\n _this.destination = EMPTY_OBSERVER;\n }\n return _this;\n }\n Subscriber.create = function (next, error, complete) {\n return new SafeSubscriber(next, error, complete);\n };\n Subscriber.prototype.next = function (value) {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n }\n else {\n this._next(value);\n }\n };\n Subscriber.prototype.error = function (err) {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n }\n else {\n this.isStopped = true;\n this._error(err);\n }\n };\n Subscriber.prototype.complete = function () {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n }\n else {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (!this.closed) {\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n this.destination = null;\n }\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n try {\n this.destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n };\n Subscriber.prototype._complete = function () {\n try {\n this.destination.complete();\n }\n finally {\n this.unsubscribe();\n }\n };\n return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n function ConsumerObserver(partialObserver) {\n this.partialObserver = partialObserver;\n }\n ConsumerObserver.prototype.next = function (value) {\n var partialObserver = this.partialObserver;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n ConsumerObserver.prototype.error = function (err) {\n var partialObserver = this.partialObserver;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n else {\n handleUnhandledError(err);\n }\n };\n ConsumerObserver.prototype.complete = function () {\n var partialObserver = this.partialObserver;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(observerOrNext, error, complete) {\n var _this = _super.call(this) || this;\n var partialObserver;\n if (isFunction(observerOrNext) || !observerOrNext) {\n partialObserver = {\n next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n error: error !== null && error !== void 0 ? error : undefined,\n complete: complete !== null && complete !== void 0 ? complete : undefined,\n };\n }\n else {\n var context_1;\n if (_this && config.useDeprecatedNextContext) {\n context_1 = Object.create(observerOrNext);\n context_1.unsubscribe = function () { return _this.unsubscribe(); };\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context_1),\n error: observerOrNext.error && bind(observerOrNext.error, context_1),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n };\n }\n else {\n partialObserver = observerOrNext;\n }\n }\n _this.destination = new ConsumerObserver(partialObserver);\n return _this;\n }\n return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n }\n else {\n reportUnhandledError(error);\n }\n}\nfunction defaultErrorHandler(err) {\n throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n var onStoppedNotification = config.onStoppedNotification;\n onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n return x;\n}\n//# sourceMappingURL=identity.js.map","import { identity } from './identity';\nexport function pipe() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n if (fns.length === 0) {\n return identity;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return function piped(input) {\n return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n };\n}\n//# sourceMappingURL=pipe.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n function Observable(subscribe) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var _this = this;\n var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n errorContext(function () {\n var _a = _this, operator = _a.operator, source = _a.source;\n subscriber.add(operator\n ?\n operator.call(subscriber, source)\n : source\n ?\n _this._subscribe(subscriber)\n :\n _this._trySubscribe(subscriber));\n });\n return subscriber;\n };\n Observable.prototype._trySubscribe = function (sink) {\n try {\n return this._subscribe(sink);\n }\n catch (err) {\n sink.error(err);\n }\n };\n Observable.prototype.forEach = function (next, promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n _this.subscribe(subscriber);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n var _a;\n return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n };\n Observable.prototype[Symbol_observable] = function () {\n return this;\n };\n Observable.prototype.pipe = function () {\n var operations = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n operations[_i] = arguments[_i];\n }\n return pipeFromArray(operations)(this);\n };\n Observable.prototype.toPromise = function (promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n };\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n var _a;\n return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n return function (source) {\n if (hasLift(source)) {\n return source.lift(function (liftedSource) {\n try {\n return init(liftedSource, this);\n }\n catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n//# sourceMappingURL=lift.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n __extends(OperatorSubscriber, _super);\n function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n var _this = _super.call(this, destination) || this;\n _this.onFinalize = onFinalize;\n _this.shouldUnsubscribe = shouldUnsubscribe;\n _this._next = onNext\n ? function (value) {\n try {\n onNext(value);\n }\n catch (err) {\n destination.error(err);\n }\n }\n : _super.prototype._next;\n _this._error = onError\n ? function (err) {\n try {\n onError(err);\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._error;\n _this._complete = onComplete\n ? function () {\n try {\n onComplete();\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._complete;\n return _this;\n }\n OperatorSubscriber.prototype.unsubscribe = function () {\n var _a;\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n var closed_1 = this.closed;\n _super.prototype.unsubscribe.call(this);\n !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n }\n };\n return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","import { createErrorClass } from './createErrorClass';\nexport var ObjectUnsubscribedError = createErrorClass(function (_super) {\n return function ObjectUnsubscribedErrorImpl() {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n };\n});\n//# sourceMappingURL=ObjectUnsubscribedError.js.map","import { __extends, __values } from \"tslib\";\nimport { Observable } from './Observable';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\nvar Subject = (function (_super) {\n __extends(Subject, _super);\n function Subject() {\n var _this = _super.call(this) || this;\n _this.closed = false;\n _this.currentObservers = null;\n _this.observers = [];\n _this.isStopped = false;\n _this.hasError = false;\n _this.thrownError = null;\n return _this;\n }\n Subject.prototype.lift = function (operator) {\n var subject = new AnonymousSubject(this, this);\n subject.operator = operator;\n return subject;\n };\n Subject.prototype._throwIfClosed = function () {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n };\n Subject.prototype.next = function (value) {\n var _this = this;\n errorContext(function () {\n var e_1, _a;\n _this._throwIfClosed();\n if (!_this.isStopped) {\n if (!_this.currentObservers) {\n _this.currentObservers = Array.from(_this.observers);\n }\n try {\n for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {\n var observer = _c.value;\n observer.next(value);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n });\n };\n Subject.prototype.error = function (err) {\n var _this = this;\n errorContext(function () {\n _this._throwIfClosed();\n if (!_this.isStopped) {\n _this.hasError = _this.isStopped = true;\n _this.thrownError = err;\n var observers = _this.observers;\n while (observers.length) {\n observers.shift().error(err);\n }\n }\n });\n };\n Subject.prototype.complete = function () {\n var _this = this;\n errorContext(function () {\n _this._throwIfClosed();\n if (!_this.isStopped) {\n _this.isStopped = true;\n var observers = _this.observers;\n while (observers.length) {\n observers.shift().complete();\n }\n }\n });\n };\n Subject.prototype.unsubscribe = function () {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null;\n };\n Object.defineProperty(Subject.prototype, \"observed\", {\n get: function () {\n var _a;\n return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;\n },\n enumerable: false,\n configurable: true\n });\n Subject.prototype._trySubscribe = function (subscriber) {\n this._throwIfClosed();\n return _super.prototype._trySubscribe.call(this, subscriber);\n };\n Subject.prototype._subscribe = function (subscriber) {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n };\n Subject.prototype._innerSubscribe = function (subscriber) {\n var _this = this;\n var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(function () {\n _this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n };\n Subject.prototype._checkFinalizedStatuses = function (subscriber) {\n var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;\n if (hasError) {\n subscriber.error(thrownError);\n }\n else if (isStopped) {\n subscriber.complete();\n }\n };\n Subject.prototype.asObservable = function () {\n var observable = new Observable();\n observable.source = this;\n return observable;\n };\n Subject.create = function (destination, source) {\n return new AnonymousSubject(destination, source);\n };\n return Subject;\n}(Observable));\nexport { Subject };\nvar AnonymousSubject = (function (_super) {\n __extends(AnonymousSubject, _super);\n function AnonymousSubject(destination, source) {\n var _this = _super.call(this) || this;\n _this.destination = destination;\n _this.source = source;\n return _this;\n }\n AnonymousSubject.prototype.next = function (value) {\n var _a, _b;\n (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);\n };\n AnonymousSubject.prototype.error = function (err) {\n var _a, _b;\n (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);\n };\n AnonymousSubject.prototype.complete = function () {\n var _a, _b;\n (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);\n };\n AnonymousSubject.prototype._subscribe = function (subscriber) {\n var _a, _b;\n return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;\n };\n return AnonymousSubject;\n}(Subject));\nexport { AnonymousSubject };\n//# sourceMappingURL=Subject.js.map","import { __extends } from \"tslib\";\nimport { Subject } from './Subject';\nvar BehaviorSubject = (function (_super) {\n __extends(BehaviorSubject, _super);\n function BehaviorSubject(_value) {\n var _this = _super.call(this) || this;\n _this._value = _value;\n return _this;\n }\n Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n get: function () {\n return this.getValue();\n },\n enumerable: false,\n configurable: true\n });\n BehaviorSubject.prototype._subscribe = function (subscriber) {\n var subscription = _super.prototype._subscribe.call(this, subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n };\n BehaviorSubject.prototype.getValue = function () {\n var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n };\n BehaviorSubject.prototype.next = function (value) {\n _super.prototype.next.call(this, (this._value = value));\n };\n return BehaviorSubject;\n}(Subject));\nexport { BehaviorSubject };\n//# sourceMappingURL=BehaviorSubject.js.map","export var dateTimestampProvider = {\n now: function () {\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n return _super.call(this) || this;\n }\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n setInterval: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = intervalProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearInterval: function (handle) {\n var delegate = intervalProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n var _this = _super.call(this, scheduler, work) || this;\n _this.scheduler = scheduler;\n _this.work = work;\n _this.pending = false;\n return _this;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n var _a;\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n this.state = state;\n var id = this.id;\n var scheduler = this.scheduler;\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.pending = true;\n this.delay = delay;\n this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n if (delay === void 0) { delay = 0; }\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n return undefined;\n };\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, _delay) {\n var errored = false;\n var errorValue;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype.unsubscribe = function () {\n if (!this.closed) {\n var _a = this, id = _a.id, scheduler = _a.scheduler;\n var actions = scheduler.actions;\n this.work = this.state = this.scheduler = null;\n this.pending = false;\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n this.delay = null;\n _super.prototype.unsubscribe.call(this);\n }\n };\n return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n function Scheduler(schedulerActionCtor, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.schedulerActionCtor = schedulerActionCtor;\n this.now = now;\n }\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n };\n Scheduler.now = dateTimestampProvider.now;\n return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n var _this = _super.call(this, SchedulerAction, now) || this;\n _this.actions = [];\n _this._active = false;\n return _this;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this._active) {\n actions.push(action);\n return;\n }\n var error;\n this._active = true;\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()));\n this._active = false;\n if (error) {\n while ((action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { isFunction } from './isFunction';\nexport function isScheduler(value) {\n return value && isFunction(value.schedule);\n}\n//# sourceMappingURL=isScheduler.js.map","import { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\nfunction last(arr) {\n return arr[arr.length - 1];\n}\nexport function popResultSelector(args) {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\nexport function popScheduler(args) {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\nexport function popNumber(args, defaultValue) {\n return typeof last(args) === 'number' ? args.pop() : defaultValue;\n}\n//# sourceMappingURL=args.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator';\n }\n return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n var reader, _a, value, done;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n reader = readableStream.getReader();\n _b.label = 1;\n case 1:\n _b.trys.push([1, , 9, 10]);\n _b.label = 2;\n case 2:\n if (!true) return [3, 8];\n return [4, __await(reader.read())];\n case 3:\n _a = _b.sent(), value = _a.value, done = _a.done;\n if (!done) return [3, 5];\n return [4, __await(void 0)];\n case 4: return [2, _b.sent()];\n case 5: return [4, __await(value)];\n case 6: return [4, _b.sent()];\n case 7:\n _b.sent();\n return [3, 2];\n case 8: return [3, 10];\n case 9:\n reader.releaseLock();\n return [7];\n case 10: return [2];\n }\n });\n });\n}\nexport function isReadableStreamLike(obj) {\n return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n if (input instanceof Observable) {\n return input;\n }\n if (input != null) {\n if (isInteropObservable(input)) {\n return fromInteropObservable(input);\n }\n if (isArrayLike(input)) {\n return fromArrayLike(input);\n }\n if (isPromise(input)) {\n return fromPromise(input);\n }\n if (isAsyncIterable(input)) {\n return fromAsyncIterable(input);\n }\n if (isIterable(input)) {\n return fromIterable(input);\n }\n if (isReadableStreamLike(input)) {\n return fromReadableStreamLike(input);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n return new Observable(function (subscriber) {\n var obs = obj[Symbol_observable]();\n if (isFunction(obs.subscribe)) {\n return obs.subscribe(subscriber);\n }\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n });\n}\nexport function fromArrayLike(array) {\n return new Observable(function (subscriber) {\n for (var i = 0; i < array.length && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n });\n}\nexport function fromPromise(promise) {\n return new Observable(function (subscriber) {\n promise\n .then(function (value) {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) { return subscriber.error(err); })\n .then(null, reportUnhandledError);\n });\n}\nexport function fromIterable(iterable) {\n return new Observable(function (subscriber) {\n var e_1, _a;\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var value = iterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriber.complete();\n });\n}\nexport function fromAsyncIterable(asyncIterable) {\n return new Observable(function (subscriber) {\n process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n });\n}\nexport function fromReadableStreamLike(readableStream) {\n return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n var asyncIterable_1, asyncIterable_1_1;\n var e_2, _a;\n return __awaiter(this, void 0, void 0, function () {\n var value, e_2_1;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 5, 6, 11]);\n asyncIterable_1 = __asyncValues(asyncIterable);\n _b.label = 1;\n case 1: return [4, asyncIterable_1.next()];\n case 2:\n if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n value = asyncIterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return [2];\n }\n _b.label = 3;\n case 3: return [3, 1];\n case 4: return [3, 11];\n case 5:\n e_2_1 = _b.sent();\n e_2 = { error: e_2_1 };\n return [3, 11];\n case 6:\n _b.trys.push([6, , 9, 10]);\n if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n return [4, _a.call(asyncIterable_1)];\n case 7:\n _b.sent();\n _b.label = 8;\n case 8: return [3, 10];\n case 9:\n if (e_2) throw e_2.error;\n return [7];\n case 10: return [7];\n case 11:\n subscriber.complete();\n return [2];\n }\n });\n });\n}\n//# sourceMappingURL=innerFrom.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n if (delay === void 0) { delay = 0; }\n if (repeat === void 0) { repeat = false; }\n var scheduleSubscription = scheduler.schedule(function () {\n work();\n if (repeat) {\n parentSubscription.add(this.schedule(null, delay));\n }\n else {\n this.unsubscribe();\n }\n }, delay);\n parentSubscription.add(scheduleSubscription);\n if (!repeat) {\n return scheduleSubscription;\n }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { executeSchedule } from '../util/executeSchedule';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function observeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));\n });\n}\n//# sourceMappingURL=observeOn.js.map","import { operate } from '../util/lift';\nexport function subscribeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));\n });\n}\n//# sourceMappingURL=subscribeOn.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function scheduleObservable(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=scheduleObservable.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function schedulePromise(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=schedulePromise.js.map","import { Observable } from '../Observable';\nexport function scheduleArray(input, scheduler) {\n return new Observable(function (subscriber) {\n var i = 0;\n return scheduler.schedule(function () {\n if (i === input.length) {\n subscriber.complete();\n }\n else {\n subscriber.next(input[i++]);\n if (!subscriber.closed) {\n this.schedule();\n }\n }\n });\n });\n}\n//# sourceMappingURL=scheduleArray.js.map","import { Observable } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from '../util/isFunction';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleIterable(input, scheduler) {\n return new Observable(function (subscriber) {\n var iterator;\n executeSchedule(subscriber, scheduler, function () {\n iterator = input[Symbol_iterator]();\n executeSchedule(subscriber, scheduler, function () {\n var _a;\n var value;\n var done;\n try {\n (_a = iterator.next(), value = _a.value, done = _a.done);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (done) {\n subscriber.complete();\n }\n else {\n subscriber.next(value);\n }\n }, 0, true);\n });\n return function () { return isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };\n });\n}\n//# sourceMappingURL=scheduleIterable.js.map","import { Observable } from '../Observable';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleAsyncIterable(input, scheduler) {\n if (!input) {\n throw new Error('Iterable cannot be null');\n }\n return new Observable(function (subscriber) {\n executeSchedule(subscriber, scheduler, function () {\n var iterator = input[Symbol.asyncIterator]();\n executeSchedule(subscriber, scheduler, function () {\n iterator.next().then(function (result) {\n if (result.done) {\n subscriber.complete();\n }\n else {\n subscriber.next(result.value);\n }\n });\n }, 0, true);\n });\n });\n}\n//# sourceMappingURL=scheduleAsyncIterable.js.map","import { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nexport function scheduleReadableStreamLike(input, scheduler) {\n return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);\n}\n//# sourceMappingURL=scheduleReadableStreamLike.js.map","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isReadableStreamLike } from '../util/isReadableStreamLike';\nimport { scheduleReadableStreamLike } from './scheduleReadableStreamLike';\nexport function scheduled(input, scheduler) {\n if (input != null) {\n if (isInteropObservable(input)) {\n return scheduleObservable(input, scheduler);\n }\n if (isArrayLike(input)) {\n return scheduleArray(input, scheduler);\n }\n if (isPromise(input)) {\n return schedulePromise(input, scheduler);\n }\n if (isAsyncIterable(input)) {\n return scheduleAsyncIterable(input, scheduler);\n }\n if (isIterable(input)) {\n return scheduleIterable(input, scheduler);\n }\n if (isReadableStreamLike(input)) {\n return scheduleReadableStreamLike(input, scheduler);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\n//# sourceMappingURL=scheduled.js.map","import { scheduled } from '../scheduled/scheduled';\nimport { innerFrom } from './innerFrom';\nexport function from(input, scheduler) {\n return scheduler ? scheduled(input, scheduler) : innerFrom(input);\n}\n//# sourceMappingURL=from.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n subscriber.next(project.call(thisArg, value, index++));\n }));\n });\n}\n//# sourceMappingURL=map.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { map } from \"../operators/map\";\nvar isArray = Array.isArray;\nfunction callOrApply(fn, args) {\n return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);\n}\nexport function mapOneOrManyArgs(fn) {\n return map(function (args) { return callOrApply(fn, args); });\n}\n//# sourceMappingURL=mapOneOrManyArgs.js.map","var isArray = Array.isArray;\nvar getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;\nexport function argsArgArrayOrObject(args) {\n if (args.length === 1) {\n var first_1 = args[0];\n if (isArray(first_1)) {\n return { args: first_1, keys: null };\n }\n if (isPOJO(first_1)) {\n var keys = getKeys(first_1);\n return {\n args: keys.map(function (key) { return first_1[key]; }),\n keys: keys,\n };\n }\n }\n return { args: args, keys: null };\n}\nfunction isPOJO(obj) {\n return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;\n}\n//# sourceMappingURL=argsArgArrayOrObject.js.map","export function createObject(keys, values) {\n return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});\n}\n//# sourceMappingURL=createObject.js.map","import { Observable } from '../Observable';\nimport { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';\nimport { from } from './from';\nimport { identity } from '../util/identity';\nimport { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';\nimport { popResultSelector, popScheduler } from '../util/args';\nimport { createObject } from '../util/createObject';\nimport { createOperatorSubscriber } from '../operators/OperatorSubscriber';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function combineLatest() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var scheduler = popScheduler(args);\n var resultSelector = popResultSelector(args);\n var _a = argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;\n if (observables.length === 0) {\n return from([], scheduler);\n }\n var result = new Observable(combineLatestInit(observables, scheduler, keys\n ?\n function (values) { return createObject(keys, values); }\n :\n identity));\n return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;\n}\nexport function combineLatestInit(observables, scheduler, valueTransform) {\n if (valueTransform === void 0) { valueTransform = identity; }\n return function (subscriber) {\n maybeSchedule(scheduler, function () {\n var length = observables.length;\n var values = new Array(length);\n var active = length;\n var remainingFirstValues = length;\n var _loop_1 = function (i) {\n maybeSchedule(scheduler, function () {\n var source = from(observables[i], scheduler);\n var hasFirstValue = false;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n values[i] = value;\n if (!hasFirstValue) {\n hasFirstValue = true;\n remainingFirstValues--;\n }\n if (!remainingFirstValues) {\n subscriber.next(valueTransform(values.slice()));\n }\n }, function () {\n if (!--active) {\n subscriber.complete();\n }\n }));\n }, subscriber);\n };\n for (var i = 0; i < length; i++) {\n _loop_1(i);\n }\n }, subscriber);\n };\n}\nfunction maybeSchedule(scheduler, execute, subscription) {\n if (scheduler) {\n executeSchedule(subscription, scheduler, execute);\n }\n else {\n execute();\n }\n}\n//# sourceMappingURL=combineLatest.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n });\n}\n//# sourceMappingURL=filter.js.map","import { __values } from \"tslib\";\nimport { Subscription } from '../Subscription';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { arrRemove } from '../util/arrRemove';\nimport { asyncScheduler } from '../scheduler/async';\nimport { popScheduler } from '../util/args';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function bufferTime(bufferTimeSpan) {\n var _a, _b;\n var otherArgs = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n otherArgs[_i - 1] = arguments[_i];\n }\n var scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;\n var bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;\n var maxBufferSize = otherArgs[1] || Infinity;\n return operate(function (source, subscriber) {\n var bufferRecords = [];\n var restartOnEmit = false;\n var emit = function (record) {\n var buffer = record.buffer, subs = record.subs;\n subs.unsubscribe();\n arrRemove(bufferRecords, record);\n subscriber.next(buffer);\n restartOnEmit && startBuffer();\n };\n var startBuffer = function () {\n if (bufferRecords) {\n var subs = new Subscription();\n subscriber.add(subs);\n var buffer = [];\n var record_1 = {\n buffer: buffer,\n subs: subs,\n };\n bufferRecords.push(record_1);\n executeSchedule(subs, scheduler, function () { return emit(record_1); }, bufferTimeSpan);\n }\n };\n if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {\n executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);\n }\n else {\n restartOnEmit = true;\n }\n startBuffer();\n var bufferTimeSubscriber = createOperatorSubscriber(subscriber, function (value) {\n var e_1, _a;\n var recordsCopy = bufferRecords.slice();\n try {\n for (var recordsCopy_1 = __values(recordsCopy), recordsCopy_1_1 = recordsCopy_1.next(); !recordsCopy_1_1.done; recordsCopy_1_1 = recordsCopy_1.next()) {\n var record = recordsCopy_1_1.value;\n var buffer = record.buffer;\n buffer.push(value);\n maxBufferSize <= buffer.length && emit(record);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (recordsCopy_1_1 && !recordsCopy_1_1.done && (_a = recordsCopy_1.return)) _a.call(recordsCopy_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }, function () {\n while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {\n subscriber.next(bufferRecords.shift().buffer);\n }\n bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();\n subscriber.complete();\n subscriber.unsubscribe();\n }, undefined, function () { return (bufferRecords = null); });\n source.subscribe(bufferTimeSubscriber);\n });\n}\n//# sourceMappingURL=bufferTime.js.map","import { identity } from '../util/identity';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function distinctUntilChanged(comparator, keySelector) {\n if (keySelector === void 0) { keySelector = identity; }\n comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;\n return operate(function (source, subscriber) {\n var previousKey;\n var first = true;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n var currentKey = keySelector(value);\n if (first || !comparator(previousKey, currentKey)) {\n first = false;\n previousKey = currentKey;\n subscriber.next(value);\n }\n }));\n });\n}\nfunction defaultCompare(a, b) {\n return a === b;\n}\n//# sourceMappingURL=distinctUntilChanged.js.map","import { operate } from '../util/lift';\nexport function finalize(callback) {\n return operate(function (source, subscriber) {\n try {\n source.subscribe(subscriber);\n }\n finally {\n subscriber.add(callback);\n }\n });\n}\n//# sourceMappingURL=finalize.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { innerFrom } from '../observable/innerFrom';\nimport { noop } from '../util/noop';\nexport function takeUntil(notifier) {\n return operate(function (source, subscriber) {\n innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop));\n !subscriber.closed && source.subscribe(subscriber);\n });\n}\n//# sourceMappingURL=takeUntil.js.map","import { Observable } from 'rxjs';\nimport { EventSourceMessage, fetchEventSource } from '@microsoft/fetch-event-source';\nimport { FetchSsePayload, SseResponse } from '../types';\nimport { HttpError } from '../types/http-error';\nimport { EventType } from '../constants/enum';\n\ninterface CreateSseObservableOptions {\n endpoint: string;\n apiKey?: string;\n debugMode?: boolean;\n /** POST dispatches a run; GET is the transcript cold-start rejoin (F-014). Defaults to POST. */\n method?: 'GET' | 'POST';\n /** Only sent for POST; a GET rejoin carries its params in the URL. */\n payload?: FetchSsePayload;\n customHeaders?: Record<string, string>;\n}\n\nexport function createSseObservable(options: CreateSseObservableOptions): Observable<SseResponse<EventType>> {\n const { endpoint, apiKey, payload, debugMode, customHeaders } = options;\n const method = options.method ?? 'POST';\n\n return new Observable<SseResponse<EventType>>(subscriber => {\n const controller = new AbortController();\n let currentTraceId: string | undefined;\n // Whether a resumable cursor exists — set once any event carries an `id:`. `@microsoft/fetch-event-source`\n // tracks that `id:` and replays it as the `Last-Event-ID` header on its native reconnect (F-002).\n let hasCursor = false;\n // Set by this observable's teardown: the consumer deliberately let go (unsubscribe on unmount,\n // channel switch, or the legacy stop fallback). Distinguishes \"we cut it\" from \"it broke\" (F-023\n // AC10) — an intentional abort must never be reported as an error nor trigger the reconnect below.\n let disposed = false;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...customHeaders,\n };\n\n if (apiKey) {\n headers['X-API-KEY'] = apiKey;\n }\n\n // Preserve any query already on the endpoint (e.g. the GET rejoin's `custom_channel_id`) and add\n // `is_debug` on top, rather than overwriting the search string.\n const url = new URL(endpoint);\n\n if (debugMode) {\n url.searchParams.set('is_debug', 'true');\n }\n\n fetchEventSource(url.toString(), {\n method,\n headers,\n body: method === 'POST' && payload ? JSON.stringify(payload) : undefined,\n signal: controller.signal,\n /**\n * Allow SSE to work when the page is hidden.\n * https://github.com/Azure/fetch-event-source/issues/17#issuecomment-1525904929\n */\n openWhenHidden: true,\n onopen: async response => {\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n try {\n body = await response.text();\n } catch {\n body = null;\n }\n }\n\n subscriber.error(new HttpError(response.status, response.statusText, body));\n controller.abort();\n } else {\n currentTraceId = response.headers.get('X-Trace-Id') ?? undefined;\n }\n },\n onmessage: (esm: EventSourceMessage) => {\n // A non-empty `id:` is the resume cursor; from here a mid-stream drop can be resumed (F-002).\n if (esm.id) hasCursor = true;\n\n const data = JSON.parse(esm.data) as SseResponse<EventType>;\n\n if (currentTraceId) {\n data.traceId = currentTraceId;\n } else if (data.requestId) {\n data.traceId = data.requestId;\n if (!currentTraceId) {\n currentTraceId = data.requestId;\n }\n }\n\n subscriber.next(data);\n },\n onclose: () => {\n subscriber.complete();\n },\n onerror: err => {\n // The consumer aborted on purpose (F-023 AC10). The in-flight fetch rejects with an\n // AbortError, which is not a failure of the stream — swallow it: no `subscriber.error`, and no\n // reconnect (returning here would schedule a retry, resurrecting a connection we just dropped).\n // Throwing is what tells @microsoft/fetch-event-source to stop for good.\n if (disposed) throw err;\n\n // A cursor exists → let @microsoft/fetch-event-source run its native Last-Event-ID reconnect:\n // returning without throwing tells the library to retry (obeying the server `retry:`), and it\n // replays the last `id:` as `Last-Event-ID`, so the backend resumes from the cursor with no\n // re-dispatch (F-002 / UC-003).\n if (hasCursor) return;\n\n // No cursor yet (failure before 200, or no `id:` received) → do NOT reconnect: an empty-cursor\n // POST would be re-dispatched as a new run. Surface the error to the caller instead (F-002 / UC-004).\n subscriber.error(err);\n controller.abort();\n throw err;\n },\n });\n\n return (): void => {\n disposed = true;\n controller.abort();\n };\n });\n}\n","import { Listeners } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<Events extends Record<string, any>> {\n private listeners: Listeners<Events> = {};\n\n on<K extends keyof Events>(event: K, listener: Events[K]): void {\n this.listeners = Object.assign({}, this.listeners, {\n [event]: (this.listeners[event] ?? []).concat(listener),\n });\n }\n\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n if (!this.listeners[event]) return;\n\n this.listeners = Object.assign({}, this.listeners, {\n [event]: (this.listeners[event] ?? []).filter((l: Events[K]) => l !== listener),\n });\n }\n\n remove<K extends keyof Events>(event: K): void {\n delete this.listeners[event];\n }\n\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n if (!this.listeners[event]) return;\n\n this.listeners[event].forEach((listener: Events[K]) => listener(...args));\n }\n}\n","import {\n ChannelMetadata,\n ClientConfig,\n IAsgardServiceClient,\n FetchSsePayload,\n FetchSseOptions,\n SseResponse,\n SseEvents,\n BlobUploadResponse,\n ChannelHomeDownloadResult,\n MessageFeedbackReply,\n MessageFeedbackRequest,\n SandboxBrowserSessionCredentials,\n SandboxChannelScope,\n SandboxFsCopyMoveOptions,\n SandboxFsCopyResult,\n SandboxFsListResult,\n SandboxFsReadOptions,\n SandboxFsReadResult,\n SandboxFsStatResult,\n SandboxFsWatchEvent,\n SandboxFsWriteOptions,\n SandboxFsWriteResult,\n StopGenerationOptions,\n} from '../types';\nimport { HttpError } from '../types/http-error';\nimport { fetchEventSource } from '@microsoft/fetch-event-source';\nimport { createSseObservable } from './create-sse-observable';\nimport { bufferTime, filter, finalize, Observable, Subject, Subscription, takeUntil } from 'rxjs';\nimport { EventType } from '../constants/enum';\nimport { EventEmitter } from './event-emitter';\n\n/**\n * How long `runSse` gathers SSE frames before handing them on. One window is the whole latency the SDK\n * adds, no matter how many frames land in it — see the rationale on the `bufferTime` call below.\n */\nconst DEFAULT_SSE_BATCH_WINDOW_MS = 50;\n\n/**\n * Write the sandbox channel scope onto a URL. `scope` is required although its type includes `undefined`:\n * a new sandbox call must state what it wants rather than silently inherit an omission.\n */\nfunction withChannelScope(url: URL, scope: SandboxChannelScope | undefined): URL {\n if (scope?.customChannelId) url.searchParams.set('custom_channel_id', scope.customChannelId);\n\n return url;\n}\n\nexport default class AsgardServiceClient implements IAsgardServiceClient {\n private apiKey?: string;\n private endpoint!: string;\n private botProviderEndpoint?: string;\n readonly debugMode?: boolean;\n private destroy$ = new Subject<void>();\n private closed = false;\n private detached = false;\n private detachTimer?: ReturnType<typeof setTimeout>;\n private inFlight = 0;\n private sseEmitter = new EventEmitter<SseEvents>();\n private transformSsePayload?: (payload: FetchSsePayload) => FetchSsePayload;\n private customHeaders?: Record<string, string>;\n\n constructor(config: ClientConfig) {\n // Validate that either endpoint or botProviderEndpoint is provided\n if (!config.endpoint && !config.botProviderEndpoint) {\n throw new Error('Either endpoint or botProviderEndpoint must be provided');\n }\n\n this.apiKey = config.apiKey;\n this.debugMode = config.debugMode;\n this.transformSsePayload = config.transformSsePayload;\n this.botProviderEndpoint = config.botProviderEndpoint;\n this.customHeaders = {\n ...config.customHeaders,\n ...(config.userIdentityHint ? { 'X-ASGARD-USER-IDENTITY-HINT': config.userIdentityHint } : {}),\n };\n\n // Handle endpoint derivation and deprecation\n if (!config.endpoint && config.botProviderEndpoint) {\n // Derive endpoint from botProviderEndpoint (new recommended way)\n // Handle trailing slashes to prevent double slashes\n const baseEndpoint = config.botProviderEndpoint.replace(/\\/+$/, '');\n this.endpoint = `${baseEndpoint}/message/sse`;\n } else if (config.endpoint) {\n // Use provided endpoint but warn about deprecation\n this.endpoint = config.endpoint;\n if (this.debugMode) {\n // eslint-disable-next-line no-console\n console.warn(\n '[AsgardServiceClient] The \"endpoint\" option is deprecated and will be removed in the next major version. ' +\n `Please use \"botProviderEndpoint\" instead. The SSE endpoint will be automatically derived as \"\\${botProviderEndpoint}/message/sse\".`,\n );\n }\n }\n }\n\n on<K extends keyof SseEvents>(event: K, listener: SseEvents[K]): void {\n this.sseEmitter.remove(event);\n this.sseEmitter.on(event, listener);\n }\n\n handleEvent(response: SseResponse<EventType>): void {\n switch (response.eventType) {\n case EventType.INIT:\n this.sseEmitter.emit(EventType.INIT, response as SseResponse<EventType.INIT>);\n\n break;\n case EventType.PROCESS_START:\n case EventType.PROCESS_COMPLETE:\n this.sseEmitter.emit(EventType.PROCESS, response as Parameters<SseEvents[EventType.PROCESS]>[0]);\n\n break;\n case EventType.MESSAGE_START:\n case EventType.MESSAGE_DELTA:\n case EventType.MESSAGE_COMPLETE:\n this.sseEmitter.emit(EventType.MESSAGE, response as Parameters<SseEvents[EventType.MESSAGE]>[0]);\n\n break;\n case EventType.TOOL_CALL_START:\n case EventType.TOOL_CALL_COMPLETE:\n this.sseEmitter.emit(EventType.TOOL_CALL, response as Parameters<SseEvents[EventType.TOOL_CALL]>[0]);\n\n break;\n case EventType.TOOL_CALL_CONSENT:\n this.sseEmitter.emit(\n EventType.TOOL_CALL_CONSENT,\n response as Parameters<SseEvents[EventType.TOOL_CALL_CONSENT]>[0],\n );\n\n break;\n case EventType.DONE:\n this.sseEmitter.emit(EventType.DONE, response as SseResponse<EventType.DONE>);\n\n break;\n case EventType.ERROR:\n this.sseEmitter.emit(EventType.ERROR, response as SseResponse<EventType.ERROR>);\n\n break;\n default:\n break;\n }\n }\n\n fetchSse(payload: FetchSsePayload, options?: FetchSseOptions): Subscription {\n options?.onSseStart?.();\n this.inFlight += 1;\n\n return this.runSse(\n createSseObservable({\n apiKey: this.apiKey,\n endpoint: this.endpoint,\n debugMode: this.debugMode,\n payload: this.transformSsePayload?.(payload) ?? payload,\n customHeaders: this.customHeaders,\n }),\n options,\n );\n }\n\n /**\n * Cold-start transcript rejoin (F-014): a `GET /message/sse?custom_channel_id=…` with an empty\n * `Last-Event-ID` replays the collapsed history (`message.user` + self-sufficient `*.complete`),\n * assembled through the same reducer. Reuses the F-002 native Last-Event-ID transport (no re-POST).\n */\n rejoinSse(customChannelId: string, options?: FetchSseOptions): Subscription {\n options?.onSseStart?.();\n this.inFlight += 1;\n\n const url = new URL(this.endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n return this.runSse(\n createSseObservable({\n apiKey: this.apiKey,\n endpoint: url.toString(),\n debugMode: this.debugMode,\n method: 'GET',\n customHeaders: this.customHeaders,\n }),\n options,\n );\n }\n\n private deriveChannelMetadataEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/channel/metadata` : null;\n }\n\n /**\n * Join-init existence + restore gate (F-015): `GET {base}/channel/metadata?custom_channel_id=…`.\n * `200` → parsed {@link ChannelMetadata}; `404` → `null` (channel does not exist); any other non-OK\n * status or network error throws. The caller must never treat an indeterminate result (throw) as\n * \"not exists\" — that would let a mount-time reset wipe an existing channel's history.\n */\n async channelMetadata(customChannelId: string): Promise<ChannelMetadata | null> {\n const endpoint = this.deriveChannelMetadataEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive channel metadata endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const url = new URL(endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n const headers: Record<string, string> = { ...this.customHeaders };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n const response = await fetch(url.toString(), { method: 'GET', headers });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n // Accept both a `{ data: … }` envelope (the convention used by the bot-provider metadata fetch) and\n // a bare body, so the shape can be confirmed against the real backend without a code change here.\n const json: { data?: ChannelMetadata } & Partial<ChannelMetadata> = await response.json();\n const data = json.data ?? (json as ChannelMetadata);\n\n return {\n title: data.title ?? null,\n runState: data.runState ?? 'IDLE',\n lastActivityAt: data.lastActivityAt,\n // F-019 — whitelist-pass the live-sandbox list (map the five backend fields); `[]` for an old\n // backend / a channel with none live. metadata is the sole authority on \"who is live\".\n launchedSandboxes: (data.launchedSandboxes ?? []).map(sandbox => ({\n sandboxName: sandbox.sandboxName,\n sandboxBlueprintName: sandbox.sandboxBlueprintName,\n workingDirectory: sandbox.workingDirectory,\n editorServerEnabled: sandbox.editorServerEnabled,\n browserEnabled: sandbox.browserEnabled,\n })),\n };\n }\n\n private deriveSuspendEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/message/suspend` : null;\n }\n\n /**\n * Ask the backend to suspend this channel's background run (F-023 AC1):\n * `POST {base}/message/suspend?custom_channel_id=…`. The six downstream relays expose this at the\n * exact same shape as `GET {base}/message/sse`, so it is derived identically with no per-backend case.\n *\n * `custom_channel_id` is always sent — some backends take the channel from the path and ignore it,\n * others require it, and sending it is correct for both (same rule as the GET rejoin).\n *\n * **Resolving means \"accepted\", not \"stopped\".** The run winds down on the server and declares itself\n * finished through the terminal event on the already-open SSE stream (the same event a normal run\n * ends with), so callers must keep that stream connected and wait for it.\n *\n * Success is **any 2xx** — relays variously answer `204 No Content` or `200` with an envelope, so no\n * single status is hardcoded. `404` means the channel was never created, i.e. there is nothing to\n * stop, which is a success rather than an error. Every other non-2xx throws {@link HttpError}.\n */\n async suspendChannel(\n customChannelId: string,\n options?: StopGenerationOptions & { requestId?: string },\n ): Promise<void> {\n const endpoint = this.deriveSuspendEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive channel suspend endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const url = new URL(endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n if (options?.requestId) {\n url.searchParams.set('request_id', options.requestId);\n }\n\n if (options?.force) {\n url.searchParams.set('force', 'true');\n }\n\n const response = await fetch(url.toString(), { method: 'POST', headers: this.apiHeaders() });\n\n // 404 = the channel does not exist = nothing to stop. Not a failure the user should ever see.\n if (response.ok || response.status === 404) {\n return;\n }\n\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n private deriveChannelEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/channel` : null;\n }\n\n /**\n * End the conversation and release the whole channel (F-032):\n * `DELETE {base}/channel?custom_channel_id=…`. The backend tears down the in-flight run, the\n * transcript, uploaded blobs, the tool-call allow-list, the Sandbox and the Channel Home, and only\n * then answers — so once this resolves the same `customChannelId` is genuinely a blank slate\n * (`GET /channel/metadata` goes back to `404`).\n *\n * Success is **any 2xx**: the endpoint answers `204 No Content`, and does so for a channel that never\n * existed too (deleting nothing is not a failure). Unlike {@link suspendChannel} there is no `404`\n * special case, because the backend never answers one here. Everything else throws {@link HttpError},\n * and a throw must never be read as \"deleted\" — a `500` means the teardown failed and the old\n * conversation is still there.\n *\n * **No timeout is imposed.** A channel with a live Sandbox blocks until the pod is really gone (up to\n * about a minute), on purpose: the next turn must not race a dying pod.\n */\n async deleteChannel(customChannelId: string): Promise<void> {\n const endpoint = this.deriveChannelEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive channel endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const url = new URL(endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n const response = await fetch(url.toString(), { method: 'DELETE', headers: this.apiHeaders() });\n\n if (response.ok) {\n return;\n }\n\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n private deriveFeedbackEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/message/feedback` : null;\n }\n\n /**\n * Rate one assistant reply Good or Bad (F-033): `POST {base}/message/feedback` with\n * `{ customChannelId, messageId, verdict, comment? }`. Derived from `botProviderEndpoint` exactly like\n * `/message/sse`, because every product relay exposes it at that same shape.\n *\n * Resolves to `{ messageId, seq }` — the persisted entry's own id and transcript cursor — on any 2xx\n * (the relays wrap it in a `{ data }` envelope; a bare body is accepted too). `404` means the target is\n * not a ratable reply (a thinking block, the user's own message, an unknown id), `400` a bad verdict\n * or a comment over 8 KiB; both, like any other failure, reject with {@link HttpError}. Nothing is\n * retried: the caller decides whether to offer another attempt, with the user's comment intact.\n */\n async sendMessageFeedback(request: MessageFeedbackRequest): Promise<MessageFeedbackReply> {\n const endpoint = this.deriveFeedbackEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive message feedback endpoint. Please provide botProviderEndpoint in config.');\n }\n\n // `comment` is optional on the wire; an empty string is \"no comment\", not a comment.\n const comment = request.comment?.trim();\n const body: MessageFeedbackRequest = {\n customChannelId: request.customChannelId,\n messageId: request.messageId,\n verdict: request.verdict,\n ...(comment ? { comment } : {}),\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { ...this.apiHeaders(), 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: MessageFeedbackReply } & Partial<MessageFeedbackReply> = await response.json();\n const data = json.data ?? (json as MessageFeedbackReply);\n\n return { messageId: data.messageId, seq: data.seq };\n }\n\n private runSse(observable: Observable<SseResponse<EventType>>, options?: FetchSseOptions): Subscription {\n return observable\n .pipe(\n // No RxJS-level retry: re-subscribing would re-POST and the backend would re-dispatch a duplicate\n // run. Mid-stream resume is the library's job (native Last-Event-ID reconnect in\n // create-sse-observable); a no-cursor failure surfaces via `error` below.\n //\n // **Gate on a window, not on every frame.** This used to be\n // `concatMap(event => of(event).pipe(delay(delayTime ?? 50)))`. `concatMap` is strictly serial,\n // so the cost grew with the *number* of frames rather than the amount of data or the backend's\n // speed — and stream deltas are token-sized. A canvas fragment arrives as hundreds of frames\n // (measured: a 2.6KB drawing = 372 frames of ~7 characters), which made the SDK alone add\n // ~19s at 51.7ms per frame before the conversation held the whole fragment. That is precisely\n // the \"stare at a blank card, then it pops in\" F-030 exists to avoid.\n //\n // `bufferTime` keeps the reason the delay was here — never push hundreds of separate updates\n // at a consumer, one microtask apart — but the latency it adds is one window total, no matter\n // how many frames land in it. Frames are still delivered individually and in order below, so\n // nothing downstream can tell the difference apart from the timing.\n bufferTime(options?.delayTime ?? DEFAULT_SSE_BATCH_WINDOW_MS),\n // An idle stream still ticks an empty buffer every window; do not wake the consumer for nothing.\n filter(batch => batch.length > 0),\n takeUntil(this.destroy$),\n // Settle the run accounting on every termination path — complete, error, AND a user-initiated\n // unsubscribe (stop-generation aborts the connection without a terminal event).\n finalize(() => this.onRunSettled()),\n )\n .subscribe({\n next: batch => {\n // Once detached the connection is kept open only so the backend can\n // finish the run; the owning component is gone, so stop notifying it.\n if (this.detached) return;\n\n for (const response of batch) {\n options?.onSseMessage?.(response);\n this.handleEvent(response);\n }\n },\n error: error => {\n if (!this.detached) options?.onSseError?.(error);\n },\n complete: () => {\n if (!this.detached) options?.onSseCompleted?.();\n },\n });\n }\n\n /**\n * Detach the client from its owning component without aborting in-flight SSE\n * runs. Used when a chatbot unmounts (e.g. the user navigates to another\n * in-app page) but the current run should be allowed to finish on the\n * backend instead of being cut off. After detaching, the stream is still\n * drained to keep the connection open but consumer callbacks no longer fire.\n *\n * The connection cleans itself up in all cases:\n * - No run in flight → close immediately (nothing to keep alive).\n * - Runs in flight → close once they all settle (`onRunSettled`), so the\n * client never lingers past the work it is keeping alive.\n * - A run gets stuck (stream stays open, no `run.done`/error) → the safety\n * timeout force-closes it so the orphaned connection cannot leak.\n */\n detach(options: { timeoutMs: number }): void {\n if (this.detached || this.closed) return;\n\n this.detached = true;\n\n if (this.inFlight === 0) {\n this.close();\n\n return;\n }\n\n this.detachTimer = setTimeout(() => this.close(), options.timeoutMs);\n }\n\n private onRunSettled(): void {\n this.inFlight = Math.max(0, this.inFlight - 1);\n\n // Close only once every kept run has finished, so one run settling never\n // tears down another that is still streaming on the same client.\n if (this.detached && this.inFlight === 0) {\n this.close();\n }\n }\n\n close(): void {\n if (this.closed) return;\n\n this.closed = true;\n\n if (this.detachTimer) {\n clearTimeout(this.detachTimer);\n this.detachTimer = undefined;\n }\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * 上傳檔案到 Blob API\n * 根據 API 文件:/ns/{namespace}/bot-provider/{bot_provider_name}/blob\n */\n async uploadFile(file: File, customChannelId: string): Promise<BlobUploadResponse> {\n const blobEndpoint = this.deriveBlobEndpoint();\n\n if (!blobEndpoint) {\n throw new Error('Unable to derive blob endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('customChannelId', customChannelId);\n\n const headers: HeadersInit = {\n ...this.customHeaders,\n };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n try {\n const response = await fetch(blobEndpoint, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.status} ${response.statusText}`);\n }\n\n const result = await response.json();\n\n if (this.debugMode) {\n // eslint-disable-next-line no-console\n console.log('[AsgardServiceClient] File upload response:', result);\n }\n\n return result as BlobUploadResponse;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[AsgardServiceClient] File upload error:', error);\n throw error;\n }\n }\n\n /**\n * 下載 Channel Home(每個 channel 的檔案交換平面)裡的檔案(channel-home:// URI action)。\n * 呼叫 Edge Server GET <base>/channel-home/download?custom_channel_id=xxx&relative_path=xxx 取回 binary。\n */\n async downloadChannelHomeFile(relativePath: string, customChannelId: string): Promise<ChannelHomeDownloadResult> {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error('Unable to derive channel-home download endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const query =\n `custom_channel_id=${encodeURIComponent(customChannelId)}` + `&relative_path=${encodeURIComponent(relativePath)}`;\n const url = `${baseEndpoint}/channel-home/download?${query}`;\n\n const headers: HeadersInit = {\n ...this.customHeaders,\n };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Channel Home download failed: ${response.status} ${response.statusText}`);\n }\n\n const blob = await response.blob();\n // 後端送的 relative_path 是未編碼的原字串,basename 即下載檔名(不做 decode)。\n const filename = relativePath.split('/').pop() || 'download';\n\n if (this.debugMode) {\n // eslint-disable-next-line no-console\n console.log('[AsgardServiceClient] Channel Home download response:', { filename, size: blob.size });\n }\n\n return { blob, filename };\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[AsgardServiceClient] Channel Home download error:', error);\n throw error;\n }\n }\n\n /**\n * F-020 — 取得 sandbox 瀏覽器一次性接手 URL(`sandbox://<name>/open-browser` 卡的副作用)。\n * 呼叫 `POST {base}/sandbox/{sandboxName}/browser/open-url`(對標 asgard-core edgeserver\n * `GenerateSandboxBrowserOpenUrl`:path 參數 namespace / bot-provider 已在 base、sandbox_name 在路徑)。\n * 回應 `{ data: { openURL } }`(envelope 容錯,比照 `channelMetadata`)。\n *\n * `options.customChannelId` 帶上該 sandbox 所屬的 channel(`SandboxChannelScope`)。直接對 edge server\n * 呼叫時它會被忽略,但前置 relay 用它做 ownership 證明,缺了就是 `400`。\n */\n async generateSandboxBrowserOpenUrl(sandboxName: string, options?: SandboxChannelScope): Promise<string> {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error(\n 'Unable to derive sandbox browser open-url endpoint. Please provide botProviderEndpoint in config.',\n );\n }\n\n const url = withChannelScope(\n new URL(`${baseEndpoint}/sandbox/${encodeURIComponent(sandboxName)}/browser/open-url`),\n options,\n );\n\n const response = await fetch(url.toString(), { method: 'POST', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: { openURL?: string } } & { openURL?: string } = await response.json();\n const openURL = json.data?.openURL ?? json.openURL;\n\n if (!openURL) {\n throw new Error('Sandbox browser open-url response did not contain an openURL.');\n }\n\n return openURL;\n }\n\n /**\n * F-035 — 取得 sandbox 瀏覽器的串流連線憑證:`POST {base}/sandbox/{sandboxName}/browser/session`\n * → `{ wsUrl, token }`(envelope 容錯,比照 `generateSandboxBrowserOpenUrl`)。\n *\n * 與 `generateSandboxBrowserOpenUrl` 的差別在**誰畫畫面**:那一支拿的是一次性網址、交給新分頁載入\n * Neko 自己的前端(UC-034,保留不動當 fallback);這一支拿的是 WebSocket endpoint 與 token,由 SDK\n * 自己接 WebRTC、自己畫、自己轉送鍵鼠。\n *\n * 三件呼叫端必須知道的性質:\n * - **token 是 Neko 的 session token,不是 Asgard 的。** 權限等同使用者透過舊的 open-url 流程本來就\n * 能做的事,並隨 sandbox pod 一起消失。\n * - **token 不在 `wsUrl` 裡**,連線時自己 append `?token=`(瀏覽器的 WebSocket API 不能設 header)。\n * - **可以重複呼叫**,每次 mint 一個新 session。連線斷掉或 sandbox 重啟後就該重呼,不要留著舊 token\n * 重試 —— token 沒有 TTL 但存在 Neko 的記憶體裡,pod 一重啟就失效。\n */\n async createSandboxBrowserSession(\n sandboxName: string,\n options?: SandboxChannelScope,\n ): Promise<SandboxBrowserSessionCredentials> {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error(\n 'Unable to derive sandbox browser session endpoint. Please provide botProviderEndpoint in config.',\n );\n }\n\n const url = withChannelScope(\n new URL(`${baseEndpoint}/sandbox/${encodeURIComponent(sandboxName)}/browser/session`),\n options,\n );\n\n const response = await fetch(url.toString(), { method: 'POST', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: Partial<SandboxBrowserSessionCredentials> } & Partial<SandboxBrowserSessionCredentials> =\n await response.json();\n const wsUrl = json.data?.wsUrl ?? json.wsUrl;\n const token = json.data?.token ?? json.token;\n\n // 半套憑證比沒有還糟:少了任何一邊,連線會在 WebSocket 那層失敗,而那個錯誤指向的是網路不是這裡。\n if (!wsUrl || !token) {\n throw new Error('Sandbox browser session response did not contain both wsUrl and token.');\n }\n\n return { wsUrl, token };\n }\n\n /**\n * F-021 — 衍生 sandbox fs 端點 base:`{base}/sandbox/{sandboxName}/fs`(namespace / bot-provider 已在 base)。\n */\n private deriveSandboxFsEndpoint(sandboxName: string): string {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error('Unable to derive sandbox fs endpoint. Please provide botProviderEndpoint in config.');\n }\n\n return `${baseEndpoint}/sandbox/${encodeURIComponent(sandboxName)}/fs`;\n }\n\n /**\n * F-021 — one sandbox fs URL, with the channel scope already on it. Every `fs/*` call goes through here\n * so the ownership parameter cannot be forgotten in one of eleven places (see `withChannelScope`).\n */\n private sandboxFsUrl(sandboxName: string, op: string, scope: SandboxChannelScope | undefined): URL {\n return withChannelScope(new URL(`${this.deriveSandboxFsEndpoint(sandboxName)}/${op}`), scope);\n }\n\n /** The shared auth / custom headers for the client's plain-JSON REST calls (no SSE). */\n private apiHeaders(): Record<string, string> {\n const headers: Record<string, string> = { ...this.customHeaders };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n return headers;\n }\n\n /**\n * F-021 — 列出 sandbox 目錄內容(`GET fs/list?path=`)。回應 `{ data: { entries, truncated } }`(envelope\n * 容錯,比照 `channelMetadata`)。\n */\n async sandboxFsList(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<SandboxFsListResult> {\n const url = this.sandboxFsUrl(sandboxName, 'list', options);\n url.searchParams.set('path', path);\n\n const response = await fetch(url.toString(), { method: 'GET', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: SandboxFsListResult } & Partial<SandboxFsListResult> = await response.json();\n const data = json.data ?? (json as SandboxFsListResult);\n\n return { entries: data.entries ?? [], truncated: data.truncated ?? false };\n }\n\n /**\n * F-021 — 讀取 sandbox 檔案(`GET fs/file?path=[&offset_bytes&limit_bytes]`)。回應是 raw octet-stream,\n * 檔案總長度 / 是否截斷走 `X-Total-Bytes` / `X-Truncated` header。\n */\n async sandboxFsRead(sandboxName: string, path: string, options?: SandboxFsReadOptions): Promise<SandboxFsReadResult> {\n const url = this.sandboxFsUrl(sandboxName, 'file', options);\n url.searchParams.set('path', path);\n if (options?.offsetBytes != null) url.searchParams.set('offset_bytes', String(options.offsetBytes));\n\n if (options?.limitBytes != null) url.searchParams.set('limit_bytes', String(options.limitBytes));\n\n const response = await fetch(url.toString(), { method: 'GET', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const content = await response.blob();\n const totalBytesHeader = response.headers.get('X-Total-Bytes');\n\n return {\n content,\n totalBytes: totalBytesHeader != null ? Number(totalBytesHeader) : content.size,\n truncated: response.headers.get('X-Truncated') === 'true',\n };\n }\n\n /**\n * F-021 — 寫入 sandbox 檔案(`PUT fs/file?path=[&mode&create_only]`,`multipart/form-data` 帶 `file`)。\n * 回應 `{ data: { bytesWritten } }`。\n */\n async sandboxFsWrite(\n sandboxName: string,\n path: string,\n content: Blob | string,\n options?: SandboxFsWriteOptions,\n ): Promise<SandboxFsWriteResult> {\n const url = this.sandboxFsUrl(sandboxName, 'file', options);\n url.searchParams.set('path', path);\n if (options?.mode != null) url.searchParams.set('mode', String(options.mode));\n\n if (options?.createOnly) url.searchParams.set('create_only', 'true');\n\n const form = new FormData();\n form.append('file', content instanceof Blob ? content : new Blob([content]));\n\n const response = await fetch(url.toString(), {\n method: 'PUT',\n headers: this.apiHeaders(),\n body: form,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: SandboxFsWriteResult } & Partial<SandboxFsWriteResult> = await response.json();\n const data = json.data ?? (json as SandboxFsWriteResult);\n\n return { bytesWritten: data.bytesWritten ?? 0 };\n }\n\n /** F-021 Cycle 2 — `sandbox://` fs mutation shared request helper (throws `HttpError` on non-OK). */\n private async sandboxFsRequest(\n sandboxName: string,\n op: string,\n method: 'POST' | 'DELETE',\n query: Record<string, string>,\n scope: SandboxChannelScope | undefined,\n ): Promise<unknown> {\n const url = this.sandboxFsUrl(sandboxName, op, scope);\n Object.entries(query).forEach(([k, v]) => url.searchParams.set(k, v));\n\n const response = await fetch(url.toString(), { method, headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n return response.json().catch(() => null);\n }\n\n /** F-021 — stat a sandbox path (`GET fs/stat?path=`). */\n async sandboxFsStat(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<SandboxFsStatResult> {\n const url = this.sandboxFsUrl(sandboxName, 'stat', options);\n url.searchParams.set('path', path);\n\n const response = await fetch(url.toString(), { method: 'GET', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: SandboxFsStatResult } & Partial<SandboxFsStatResult> = await response.json();\n const data = json.data ?? (json as SandboxFsStatResult);\n\n return {\n exists: data.exists ?? false,\n isDir: data.isDir ?? false,\n sizeBytes: data.sizeBytes ?? 0,\n mtimeUnix: data.mtimeUnix ?? 0,\n mode: data.mode ?? 0,\n etag: data.etag,\n };\n }\n\n /** F-021 — create a directory (`POST fs/mkdir?path=`). */\n async sandboxFsMkdir(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void> {\n await this.sandboxFsRequest(sandboxName, 'mkdir', 'POST', { path }, options);\n }\n\n /** F-021 — delete a file (`DELETE fs/item?path=`). */\n async sandboxFsRemove(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void> {\n await this.sandboxFsRequest(sandboxName, 'item', 'DELETE', { path }, options);\n }\n\n /** F-021 — recursively delete a directory (`DELETE fs/all?path=`). */\n async sandboxFsRemoveAll(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void> {\n await this.sandboxFsRequest(sandboxName, 'all', 'DELETE', { path }, options);\n }\n\n /** F-021 — copy a path (`POST fs/copy?src=&dst=[&overwrite]`) → bytes copied. */\n async sandboxFsCopy(\n sandboxName: string,\n src: string,\n dst: string,\n options?: SandboxFsCopyMoveOptions,\n ): Promise<SandboxFsCopyResult> {\n const query: Record<string, string> = { src, dst };\n if (options?.overwrite) query.overwrite = 'true';\n\n const json = (await this.sandboxFsRequest(sandboxName, 'copy', 'POST', query, options)) as\n | ({ data?: SandboxFsCopyResult } & Partial<SandboxFsCopyResult>)\n | null;\n const data = json?.data ?? (json as SandboxFsCopyResult | null);\n\n return { bytesCopied: data?.bytesCopied ?? 0 };\n }\n\n /** F-021 — move / rename a path (`POST fs/move?src=&dst=[&overwrite]`). */\n async sandboxFsMove(\n sandboxName: string,\n src: string,\n dst: string,\n options?: SandboxFsCopyMoveOptions,\n ): Promise<void> {\n const query: Record<string, string> = { src, dst };\n if (options?.overwrite) query.overwrite = 'true';\n\n await this.sandboxFsRequest(sandboxName, 'move', 'POST', query, options);\n }\n\n /**\n * F-021 — watch a sandbox path for changes (`GET fs/watch?path=`, SSE). Each `event: change` frame is one\n * `SandboxFsWatchEvent`. The backend probes the path first, so a missing path errors as HTTP rather than\n * as a dead stream. Unsubscribing aborts the request, which ends the sandbox-side watcher.\n */\n sandboxFsWatch(sandboxName: string, path: string, options?: SandboxChannelScope): Observable<SandboxFsWatchEvent> {\n const url = this.sandboxFsUrl(sandboxName, 'watch', options);\n url.searchParams.set('path', path);\n\n return new Observable<SandboxFsWatchEvent>(subscriber => {\n const controller = new AbortController();\n\n void fetchEventSource(url.toString(), {\n headers: this.apiHeaders(),\n signal: controller.signal,\n openWhenHidden: true,\n onopen: async response => {\n if (!response.ok) {\n const body = await response.text().catch(() => undefined);\n subscriber.error(new HttpError(response.status, response.statusText, body));\n controller.abort();\n }\n },\n onmessage: esm => {\n if (esm.event === 'change') subscriber.next(JSON.parse(esm.data) as SandboxFsWatchEvent);\n },\n onclose: () => subscriber.complete(),\n onerror: err => {\n // Unlike the run stream this one carries no `id:` cursor, so there is nothing to resume from —\n // surface the failure instead of letting the library silently reconnect forever.\n subscriber.error(err);\n controller.abort();\n throw err;\n },\n });\n\n return (): void => controller.abort();\n });\n }\n\n /**\n * 從 botProviderEndpoint 衍生 Blob API endpoint\n */\n private deriveBlobEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/blob` : null;\n }\n\n /**\n * 衍生 bot provider 的 base endpoint(不含子路徑)。\n * 優先用 botProviderEndpoint;若只有 deprecated 的 endpoint 則反推(移除 /message/sse)。已去除尾部斜線。\n */\n private getBaseEndpoint(): string | null {\n let baseEndpoint = this.botProviderEndpoint;\n\n // 如果沒有 botProviderEndpoint,嘗試從 endpoint 反推\n if (!baseEndpoint && this.endpoint) {\n baseEndpoint = this.endpoint.replace('/message/sse', '');\n }\n\n if (!baseEndpoint) {\n return null;\n }\n\n // 移除尾部斜線\n return baseEndpoint.replace(/\\/+$/, '');\n }\n}\n","// F-024 — path rules for a SourceSet volume.\n//\n// Volume paths are relative and the root is the **empty string**, not `/`. This is the opposite of the\n// in-sandbox fs API, whose paths are container-absolute — so a path copied from that side reaches the\n// backend and comes back 400. Checking here turns a round trip and an opaque status into an immediate,\n// readable error, and keeps the rule in one place for `@asgard-js/react` to reuse.\n\n/** The volume root. Only `list` / `listAll` accept it; every mutation needs a real path. */\nexport const SOURCE_SET_VOLUME_ROOT = '';\n\n/** Segments the backend rejects: empty (a doubled slash) and the two relative-traversal forms. */\nconst INVALID_SEGMENTS: ReadonlySet<string> = new Set(['', '.', '..']);\n\n/**\n * Validate a volume-relative path, returning it unchanged so it can be inlined into a query.\n *\n * @param path Volume-relative, e.g. `notes/todo.md`.\n * @param options `allowRoot` permits the empty-string root — set it only for listing.\n * @throws Error when the path has a leading or trailing slash, a doubled slash, or a `.` / `..` segment.\n */\nexport function assertVolumePath(path: string, options?: { allowRoot?: boolean }): string {\n if (path === SOURCE_SET_VOLUME_ROOT) {\n if (options?.allowRoot) {\n return path;\n }\n\n throw new Error(\n 'SourceSet volume path must not be empty: the volume root is not a valid target for this operation.',\n );\n }\n\n if (path.startsWith('/')) {\n throw new Error(`SourceSet volume path must be relative, with no leading slash (the root is \"\"): \"${path}\".`);\n }\n\n if (path.endsWith('/')) {\n throw new Error(`SourceSet volume path must not end with a slash: \"${path}\".`);\n }\n\n if (path.split('/').some(segment => INVALID_SEGMENTS.has(segment))) {\n throw new Error(`SourceSet volume path must not contain empty, \".\" or \"..\" segments: \"${path}\".`);\n }\n\n return path;\n}\n","import { HttpError } from '../types/http-error';\nimport type {\n SourceSetClientConfig,\n SourceSetCopyMoveOptions,\n SourceSetCopyResult,\n SourceSetDirEntry,\n SourceSetListAllOptions,\n SourceSetListAllResult,\n SourceSetListOptions,\n SourceSetListResult,\n SourceSetMkdirOptions,\n SourceSetPaging,\n SourceSetReadOptions,\n SourceSetReadResult,\n SourceSetStatResult,\n SourceSetWriteOptions,\n SourceSetWriteResult,\n} from '../types/source-set-fs';\nimport { assertVolumePath } from './source-set-path';\n\n// F-024 / F-026 — a standalone client for the SourceSet volume HTTP API.\n//\n// It has nothing to do with `AsgardServiceClient`: no inheritance, no shared instance, no shared\n// state. A SourceSet volume is a plain remote filesystem that is always there, so there is no channel,\n// no sandbox and no lifecycle to coordinate with. The request conventions below mirror that client's\n// `sandboxFs*` methods on purpose (same envelope tolerance, same `HttpError`), but by reading it —\n// nothing here imports it.\n//\n// One instance serves all four bases, because the backend guarantees identical path segments after the\n// base: `{EDGE}/ns/{ns}/source-set/{name}/volume` (apiKey) and the Platform source-set / skill-set and\n// Agent Hub directory relays (Bearer, via `customHeaders`).\n\n/** The server rejects anything larger (`page_size` max 1000), so clamp rather than let it 400. */\nexport const SOURCE_SET_MAX_PAGE_SIZE = 1000;\n\n/**\n * Default ceiling for {@link AsgardSourceSetClient.listAll}.\n *\n * Ten pages of the maximum page size. Past this a file-tree node is not something anyone scrolls, and\n * the walk is sequential, so the cost of going further is paid in round trips for entries nobody reads.\n * It is a ceiling, not a silent truncation: the result reports `total` and `truncatedAtCap` so the UI\n * can say how many were left out, and a caller who genuinely needs more raises `maxEntries`.\n */\nexport const SOURCE_SET_DEFAULT_MAX_ENTRIES = 10_000;\n\n/**\n * The wire envelope. `data` is the documented `RespWrapper` shape, but every reader also accepts a bare\n * body (`json.data ?? json`) the way `channelMetadata` does. `paging` is declared **both** on the\n * envelope and inside the list payload, so it is read from either.\n */\ntype Envelope<T> = { data?: T; paging?: SourceSetPaging } & Partial<T>;\n\nfunction clampPageSize(pageSize: number): number {\n // The lower bound is not cosmetic: a page size of 0 would make `listAll` loop without progressing.\n return Math.min(Math.max(1, Math.floor(pageSize)), SOURCE_SET_MAX_PAGE_SIZE);\n}\n\nexport default class AsgardSourceSetClient {\n private readonly endpoint: string;\n private readonly apiKey?: string;\n private readonly customHeaders?: Record<string, string>;\n\n constructor(config: SourceSetClientConfig) {\n this.endpoint = config.sourceSetEndpoint.replace(/\\/+$/, '');\n this.apiKey = config.apiKey;\n this.customHeaders = config.customHeaders;\n }\n\n /** Auth + caller headers for every request, including the multipart upload and the binary download. */\n private headers(): Record<string, string> {\n const headers: Record<string, string> = { ...this.customHeaders };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n return headers;\n }\n\n /** Issue one volume request, turning any non-2xx into {@link HttpError} (409 included, see R8). */\n private async request(\n op: string,\n method: string,\n query: Record<string, string>,\n body?: BodyInit,\n signal?: AbortSignal,\n ): Promise<Response> {\n const url = new URL(`${this.endpoint}/${op}`);\n Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, value));\n\n const response = await fetch(url.toString(), { method, headers: this.headers(), body, signal });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n return response;\n }\n\n /** One page of a directory (`GET volume/list?path=[&page&page_size]`). `path` may be the root `''`. */\n async list(path: string, options?: SourceSetListOptions): Promise<SourceSetListResult> {\n const query: Record<string, string> = { path: assertVolumePath(path, { allowRoot: true }) };\n if (options?.page != null) query.page = String(options.page);\n\n if (options?.pageSize != null) query.page_size = String(clampPageSize(options.pageSize));\n\n const response = await this.request('list', 'GET', query);\n const json: Envelope<SourceSetListResult> = await response.json();\n const data = json.data ?? (json as SourceSetListResult);\n\n return {\n entries: data.entries ?? [],\n // Reported as `null` rather than invented. An earlier version synthesized\n // `{ total: entries.length }` here to keep `listAll` terminating, which worked — and made a\n // relay that omits `paging` report the first 1000 of 3000 files as the whole directory.\n paging: data.paging ?? json.paging ?? null,\n };\n }\n\n /**\n * F-026 — every entry in a directory, paging until `paging.total` or the cap.\n *\n * A failed page rejects rather than returning what it managed to collect: handing back half a\n * directory that looks whole is the failure this exists to prevent.\n */\n async listAll(path: string, options?: SourceSetListAllOptions): Promise<SourceSetListAllResult> {\n const pageSize = clampPageSize(options?.pageSize ?? SOURCE_SET_MAX_PAGE_SIZE);\n const maxEntries = options?.maxEntries ?? SOURCE_SET_DEFAULT_MAX_ENTRIES;\n const entries: SourceSetDirEntry[] = [];\n let total = 0;\n let complete = true;\n let page = 0;\n\n for (;;) {\n const result = await this.list(path, { page, pageSize });\n const paging = result.paging;\n\n // A page indexed differently from the one requested means the backend is not honouring `page`.\n // Everything after this point would be a re-serve of something already collected, so stop before\n // appending it: duplicates are worse than a shortfall, because the same file appears twice and\n // the user acts on the wrong one.\n if (paging && paging.index !== page) {\n total = paging.total;\n complete = false;\n\n break;\n }\n\n entries.push(...result.entries);\n\n if (!paging) {\n // No paging at all. A short page is the whole directory and can be reported as such; a full\n // one is simply unanswerable — there is no way to distinguish \"exactly one page of files\" from\n // \"the first page of many\", so say so instead of guessing.\n complete = result.entries.length < pageSize;\n\n break;\n }\n\n total = paging.total;\n\n if (entries.length >= total) {\n break;\n }\n\n // An empty page short of `total` means the backend stopped producing; break rather than spin.\n if (entries.length >= maxEntries || result.entries.length === 0) {\n complete = false;\n\n break;\n }\n\n page += 1;\n }\n\n return { entries, total, complete };\n }\n\n /** Stat a path (`GET volume/stat?path=`). A missing path is 200 with `exists: false`, not a 404. */\n async stat(path: string): Promise<SourceSetStatResult> {\n const response = await this.request('stat', 'GET', { path: assertVolumePath(path) });\n const json: Envelope<SourceSetStatResult> = await response.json();\n const data = json.data ?? (json as SourceSetStatResult);\n\n return {\n exists: data.exists ?? false,\n isDir: data.isDir ?? false,\n sizeBytes: data.sizeBytes ?? 0,\n mtimeUnix: data.mtimeUnix ?? 0,\n mode: data.mode ?? 0,\n etag: data.etag,\n };\n }\n\n /** Read a file (`GET volume/file?path=[&offset_bytes&limit_bytes]`) as raw bytes. */\n async read(path: string, options?: SourceSetReadOptions): Promise<SourceSetReadResult> {\n const query: Record<string, string> = { path: assertVolumePath(path) };\n if (options?.offsetBytes != null) query.offset_bytes = String(options.offsetBytes);\n\n if (options?.limitBytes != null) query.limit_bytes = String(options.limitBytes);\n\n const response = await this.request('file', 'GET', query);\n const content = await response.blob();\n const totalBytesHeader = response.headers.get('X-Total-Bytes');\n\n return {\n content,\n totalBytes: totalBytesHeader != null ? Number(totalBytesHeader) : content.size,\n truncated: response.headers.get('X-Truncated') === 'true',\n };\n }\n\n /**\n * Write a file (`PUT volume/file?path=[&mode&create_only]`, `multipart/form-data` with a `file` field).\n * With `createOnly`, an existing path is a 409 rather than an overwrite.\n */\n async write(path: string, content: Blob | string, options?: SourceSetWriteOptions): Promise<SourceSetWriteResult> {\n const query: Record<string, string> = { path: assertVolumePath(path) };\n if (options?.mode != null) query.mode = String(options.mode);\n\n if (options?.createOnly) query.create_only = 'true';\n\n const form = new FormData();\n form.append('file', content instanceof Blob ? content : new Blob([content]));\n\n const response = await this.request('file', 'PUT', query, form, options?.signal);\n const json: Envelope<SourceSetWriteResult> = await response.json();\n const data = json.data ?? (json as SourceSetWriteResult);\n\n return { bytesWritten: data.bytesWritten ?? 0 };\n }\n\n /** Create a directory and any missing parents (`POST volume/mkdir?path=`). */\n async mkdir(path: string, options?: SourceSetMkdirOptions): Promise<void> {\n await this.request('mkdir', 'POST', { path: assertVolumePath(path) }, undefined, options?.signal);\n }\n\n /** Delete a file or empty directory (`DELETE volume/item?path=`). */\n async remove(path: string): Promise<void> {\n await this.request('item', 'DELETE', { path: assertVolumePath(path) });\n }\n\n /** Recursively delete a directory (`DELETE volume/all?path=`). The volume root is not a valid target. */\n async removeAll(path: string): Promise<void> {\n await this.request('all', 'DELETE', { path: assertVolumePath(path) });\n }\n\n /** Copy a file or directory tree (`POST volume/copy?src=&dst=[&overwrite]`). */\n async copy(src: string, dst: string, options?: SourceSetCopyMoveOptions): Promise<SourceSetCopyResult> {\n const query = this.copyMoveQuery(src, dst, options);\n const response = await this.request('copy', 'POST', query);\n const json: Envelope<SourceSetCopyResult> = await response.json();\n const data = json.data ?? (json as SourceSetCopyResult);\n\n return { bytesCopied: data.bytesCopied ?? 0 };\n }\n\n /** Move or rename (`POST volume/move?src=&dst=[&overwrite]`) — also how the UI renames. */\n async move(src: string, dst: string, options?: SourceSetCopyMoveOptions): Promise<void> {\n await this.request('move', 'POST', this.copyMoveQuery(src, dst, options));\n }\n\n private copyMoveQuery(src: string, dst: string, options?: SourceSetCopyMoveOptions): Record<string, string> {\n const query: Record<string, string> = { src: assertVolumePath(src), dst: assertVolumePath(dst) };\n if (options?.overwrite) query.overwrite = 'true';\n\n return query;\n }\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","import { v4 as uuidv4 } from 'uuid';\nimport { EventType, MessageTemplateType } from '../constants/enum';\nimport {\n ConversationBotMessage,\n ConversationCanvasMessage,\n ConversationMessage,\n ConversationSubagentMessage,\n ConversationThinkingMessage,\n ConversationToolCallMessage,\n ConversationUserMessage,\n MessageFeedbackState,\n SseResponse,\n ToolCallConsentEventData,\n} from '../types';\n\ninterface IConversation {\n messages: Map<string, ConversationMessage> | null;\n pendingConsent?: ToolCallConsentEventData | null;\n /**\n * Feedback frames whose target reply has not arrived yet (F-033), keyed by `targetMessageId`. The\n * server writes a reply before anything can rate it, so in seq order the target always precedes its\n * feedback — this only catches an out-of-order delivery, the same class of defect F-011 hardens\n * against. Applied when the target's `message.complete` lands; never rendered on its own.\n */\n pendingFeedback?: Map<string, MessageFeedbackState> | null;\n}\n\nexport default class Conversation implements IConversation {\n public messages: Map<string, ConversationMessage> | null = null;\n public pendingConsent: ToolCallConsentEventData | null = null;\n public pendingFeedback: Map<string, MessageFeedbackState> | null = null;\n\n constructor({ messages, pendingConsent = null, pendingFeedback = null }: IConversation) {\n this.messages = messages;\n this.pendingConsent = pendingConsent ?? null;\n this.pendingFeedback = pendingFeedback ?? null;\n }\n\n pushMessage(message: ConversationMessage): Conversation {\n const messages = new Map(this.messages);\n messages.set(message.messageId, message);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n clearPendingConsent(): Conversation {\n if (!this.pendingConsent) return this;\n\n return new Conversation({ messages: this.messages, pendingConsent: null, pendingFeedback: this.pendingFeedback });\n }\n\n /**\n * Put a consent prompt back (#410) — the mirror of {@link clearPendingConsent}, used to undo the\n * optimistic clear when the reply never reaches the server. Yields to a prompt that arrived in the\n * meantime: that one is newer than the batch being restored.\n */\n restorePendingConsent(pendingConsent: ToolCallConsentEventData): Conversation {\n if (this.pendingConsent) return this;\n\n return new Conversation({ messages: this.messages, pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n /**\n * Converge everything the aborted run left mid-flight (F-020 AC10, F-023). A stopped run sends no\n * closing frame for whatever was in progress, so without this those messages advertise activity that\n * has ceased — and they persist in the transcript that way:\n *\n * - a tool-call with `isComplete === false` gets no `tool_call.complete`, and would render as\n * `running` forever, so it converges to `cancelled`;\n * - a thinking block with `isThinking === true` gets no `message.thinking.complete`, and would keep\n * its highlighted \"Thinking…\" state forever, so it converges to the settled state.\n *\n * Content is preserved either way — never rolled back. Already-settled messages and every other\n * message type are untouched, and the same instance is returned when nothing was in flight.\n */\n settleInFlightMessages(): Conversation {\n if (!this.messages) return this;\n\n let changed = false;\n const messages = new Map(this.messages);\n for (const [id, message] of messages) {\n if (message.type === 'tool-call' && !message.isComplete) {\n messages.set(id, { ...message, isComplete: true, isCancelled: true });\n changed = true;\n }\n\n // F-023 — found only by stopping a real run mid-thinking: the mock and the unit tests had always\n // interrupted after the thinking block had already completed, so this path went unexercised.\n if (message.type === 'thinking' && message.isThinking) {\n messages.set(id, { ...message, isThinking: false });\n changed = true;\n }\n }\n\n if (!changed) return this;\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n /**\n * @deprecated Renamed to {@link settleInFlightMessages} in 0.3.27 — it settles in-flight thinking\n * blocks as well as tool-calls, which the old name no longer described. Behaviour is unchanged;\n * this alias will be removed in a future major version.\n */\n cancelInFlightToolCalls(): Conversation {\n return this.settleInFlightMessages();\n }\n\n onMessage(response: SseResponse<EventType>): Conversation {\n switch (response.eventType) {\n case EventType.MESSAGE_START:\n return this.onMessageStart(response as SseResponse<EventType.MESSAGE_START>);\n case EventType.MESSAGE_DELTA:\n return this.onMessageDelta(response as SseResponse<EventType.MESSAGE_DELTA>);\n case EventType.MESSAGE_COMPLETE:\n return this.onMessageComplete(response as SseResponse<EventType.MESSAGE_COMPLETE>);\n case EventType.MESSAGE_USER:\n return this.onMessageUser(response as SseResponse<EventType.MESSAGE_USER>);\n case EventType.MESSAGE_FEEDBACK:\n return this.onMessageFeedback(response as SseResponse<EventType.MESSAGE_FEEDBACK>);\n case EventType.MESSAGE_THINKING_START:\n return this.onThinkingStart(response as SseResponse<EventType.MESSAGE_THINKING_START>);\n case EventType.MESSAGE_THINKING_DELTA:\n return this.onThinkingDelta(response as SseResponse<EventType.MESSAGE_THINKING_DELTA>);\n case EventType.MESSAGE_THINKING_COMPLETE:\n return this.onThinkingComplete(response as SseResponse<EventType.MESSAGE_THINKING_COMPLETE>);\n case EventType.MESSAGE_CANVAS_START:\n return this.onCanvasStart(response as SseResponse<EventType.MESSAGE_CANVAS_START>);\n case EventType.MESSAGE_CANVAS_DELTA:\n return this.onCanvasDelta(response as SseResponse<EventType.MESSAGE_CANVAS_DELTA>);\n case EventType.MESSAGE_CANVAS_COMPLETE:\n return this.onCanvasComplete(response as SseResponse<EventType.MESSAGE_CANVAS_COMPLETE>);\n case EventType.TOOL_CALL_START:\n return this.onToolCallStart(response as SseResponse<EventType.TOOL_CALL_START>);\n case EventType.TOOL_CALL_COMPLETE:\n return this.onToolCallComplete(response as SseResponse<EventType.TOOL_CALL_COMPLETE>);\n case EventType.TOOL_CALL_CONSENT:\n return this.onToolCallConsent(response as SseResponse<EventType.TOOL_CALL_CONSENT>);\n case EventType.SUBAGENT_START:\n return this.onSubagentStart(response as SseResponse<EventType.SUBAGENT_START>);\n case EventType.SUBAGENT_COMPLETE:\n return this.onSubagentComplete(response as SseResponse<EventType.SUBAGENT_COMPLETE>);\n case EventType.ERROR:\n return this.onMessageError(response as SseResponse<EventType.ERROR>);\n default:\n return this;\n }\n }\n\n /**\n * A message is terminal once `complete` has materialized it (a bot message with `isTyping === false`).\n * Terminal messages must never regress to typing/streaming — late `start`/`delta` frames from replay\n * or out-of-order delivery are ignored (F-011 / UC-018).\n */\n private isTerminalBot(message: ConversationMessage | undefined): boolean {\n return message?.type === 'bot' && !message.isTyping;\n }\n\n /**\n * A thinking block is terminal once `thinking.complete` has settled it (`isThinking === false`).\n * Like the bot terminal guard (F-011), it must never regress to the streaming state — late\n * `thinking.start` / `thinking.delta` frames from replay or out-of-order delivery are ignored.\n */\n private isTerminalThinking(message: ConversationMessage | undefined): boolean {\n return message?.type === 'thinking' && !message.isThinking;\n }\n\n /**\n * A tool-call is terminal once it has completed (`isComplete === true`), whether that came from a\n * live `tool_call.complete` or from one materialized on GET rejoin. Same policy as the bot and\n * thinking guards (F-011): a late / out-of-order `tool_call.start` must not roll it back to\n * running, which would also drop the result and hide it from the Task list.\n */\n private isTerminalToolCall(message: ConversationMessage | undefined): boolean {\n return message?.type === 'tool-call' && message.isComplete === true;\n }\n\n /**\n * A canvas is terminal once `canvas.complete` has delivered the authoritative fragment\n * (`isDrawing === false`). Same policy as the bot / thinking guards (F-011): a late start or delta\n * must not swap that fragment back to whatever prefix happened to be in flight.\n */\n private isTerminalCanvas(message: ConversationMessage | undefined): boolean {\n return message?.type === 'canvas' && !message.isDrawing;\n }\n\n onMessageStart(response: SseResponse<EventType.MESSAGE_START>): Conversation {\n const message = response.fact.messageStart.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n // Terminal guard: a completed message stays put; a late `start` must not blank it into a typing bubble.\n if (this.isTerminalBot(this.messages?.get(message.messageId))) return this;\n\n const messages = new Map(this.messages);\n\n messages.set(message.messageId, {\n type: 'bot',\n eventType: EventType.MESSAGE_START,\n isTyping: true,\n typingText: '',\n messageId: message.messageId,\n message,\n time: new Date(),\n traceId: response.traceId,\n raw: '',\n });\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageDelta(response: SseResponse<EventType.MESSAGE_DELTA>): Conversation {\n const message = response.fact.messageDelta.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n\n // Terminal guard: a late `delta` after `complete` must not flip the message back into typing (UC-018).\n if (this.isTerminalBot(currentMessage)) return this;\n\n // Lazy-init: a `delta` with no existing entry (delta-before-start / mid-stream join) creates the\n // typing message rather than silently dropping its text (UC-017).\n const currentBot = currentMessage?.type === 'bot' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n\n messages.set(message.messageId, {\n type: 'bot',\n eventType: EventType.MESSAGE_DELTA,\n isTyping: true,\n typingText: `${currentBot?.typingText ?? ''}${message.text}`,\n messageId: message.messageId,\n message,\n time: new Date(),\n traceId: response.traceId ?? currentBot?.traceId,\n raw: currentBot?.raw ?? '',\n });\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageComplete(response: SseResponse<EventType.MESSAGE_COMPLETE>): Conversation {\n const message = response.fact.messageComplete.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const messages = new Map(this.messages);\n\n const currentMessage = messages.get(message.messageId);\n const currentBot = currentMessage?.type === 'bot' ? currentMessage : undefined;\n\n // F-033 — the rating is state *about* the reply, not part of the frame, so a late / duplicate\n // `complete` must not wipe it. A feedback frame that arrived before this reply (out of order) is\n // consumed here; it wins over whatever the reply carried, being the newer fact.\n const pendingFeedback = this.pendingFeedback?.get(message.messageId);\n const feedback = pendingFeedback ?? currentBot?.feedback;\n\n messages.set(message.messageId, {\n type: 'bot',\n eventType: EventType.MESSAGE_COMPLETE,\n isTyping: false,\n typingText: null,\n messageId: message.messageId,\n message,\n ...(feedback ? { feedback } : {}),\n time: new Date(),\n traceId: response.traceId ?? currentBot?.traceId,\n raw: JSON.stringify(response),\n });\n\n let remainingPending = this.pendingFeedback;\n if (pendingFeedback) {\n remainingPending = new Map(this.pendingFeedback);\n remainingPending.delete(message.messageId);\n }\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: remainingPending });\n }\n\n /**\n * `asgard.message.feedback` (F-033): fold a rating into the reply it targets. The server is\n * append-only and latest-wins, so a later frame for the same target simply replaces the earlier\n * state — on a replay the frames arrive in seq order and the last one standing is the current one.\n * Only a bot reply can carry a rating; a frame naming anything else (or a reply that has not arrived\n * yet) is parked in `pendingFeedback` and applied if that reply's `complete` shows up later.\n */\n onMessageFeedback(response: SseResponse<EventType.MESSAGE_FEEDBACK>): Conversation {\n const data = response.fact.messageFeedback;\n const feedback: MessageFeedbackState = {\n verdict: data.verdict,\n ...(data.text ? { comment: data.text } : {}),\n };\n\n return this.applyFeedback(data.targetMessageId, feedback);\n }\n\n /**\n * Set the current rating of one bot reply (F-033). Used by the reducer for server frames and by\n * `Channel.sendMessageFeedback` once this client's own POST has been accepted — the SDK has no open\n * stream between runs, so the live echo of its own feedback would never reach it. A target that is not\n * (yet) a bot reply is parked in `pendingFeedback`; see {@link onMessageComplete}.\n */\n applyFeedback(targetMessageId: string, feedback: MessageFeedbackState): Conversation {\n const target = this.messages?.get(targetMessageId);\n\n if (target?.type === 'bot') {\n const messages = new Map(this.messages);\n const rated: ConversationBotMessage = { ...target, feedback };\n messages.set(targetMessageId, rated);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n const pendingFeedback = new Map(this.pendingFeedback);\n pendingFeedback.set(targetMessageId, feedback);\n\n return new Conversation({ messages: this.messages, pendingConsent: this.pendingConsent, pendingFeedback });\n }\n\n onThinkingStart(response: SseResponse<EventType.MESSAGE_THINKING_START>): Conversation {\n const message = response.fact.messageThinkingStart.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n // Terminal guard: a completed thinking block stays put; a late `start` must not reopen it (F-011).\n if (this.isTerminalThinking(this.messages?.get(message.messageId))) return this;\n\n const messages = new Map(this.messages);\n const thinking: ConversationThinkingMessage = {\n type: 'thinking',\n messageId: message.messageId,\n text: message.text,\n isThinking: true,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(message.messageId, thinking);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onThinkingDelta(response: SseResponse<EventType.MESSAGE_THINKING_DELTA>): Conversation {\n const message = response.fact.messageThinkingDelta.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n\n // Terminal guard: a late `delta` after `complete` must not flip the block back into streaming (F-011).\n if (this.isTerminalThinking(currentMessage)) return this;\n\n // Lazy-init: a `delta` with no existing block (delta-before-start / mid-stream join) creates the\n // streaming block rather than dropping its reasoning text (F-011 / UC-001).\n const currentThinking = currentMessage?.type === 'thinking' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n const thinking: ConversationThinkingMessage = {\n type: 'thinking',\n messageId: message.messageId,\n text: `${currentThinking?.text ?? ''}${message.text}`,\n isThinking: true,\n time: currentThinking?.time ?? new Date(),\n traceId: response.traceId ?? currentThinking?.traceId,\n };\n messages.set(message.messageId, thinking);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onThinkingComplete(response: SseResponse<EventType.MESSAGE_THINKING_COMPLETE>): Conversation {\n const message = response.fact.messageThinkingComplete.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n const currentThinking = currentMessage?.type === 'thinking' ? currentMessage : undefined;\n\n const messages = new Map(this.messages);\n const thinking: ConversationThinkingMessage = {\n type: 'thinking',\n messageId: message.messageId,\n // Self-sufficient (F-011): the complete frame carries the full reasoning, so a complete-only\n // replay (no start/delta) still renders the whole text.\n text: message.text,\n isThinking: false,\n time: currentThinking?.time ?? new Date(),\n traceId: response.traceId ?? currentThinking?.traceId,\n };\n messages.set(message.messageId, thinking);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onCanvasStart(response: SseResponse<EventType.MESSAGE_CANVAS_START>): Conversation {\n const message = response.fact.messageCanvasStart.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n // Terminal guard: a finished canvas stays put; a late `start` must not blank it (F-011).\n if (this.isTerminalCanvas(this.messages?.get(message.messageId))) return this;\n\n const messages = new Map(this.messages);\n const canvas: ConversationCanvasMessage = {\n type: 'canvas',\n messageId: message.messageId,\n html: '',\n isDrawing: true,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(message.messageId, canvas);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onCanvasDelta(response: SseResponse<EventType.MESSAGE_CANVAS_DELTA>): Conversation {\n const message = response.fact.messageCanvasDelta.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n\n // Terminal guard: a late `delta` must not flip a finished canvas back into drawing (F-011).\n if (this.isTerminalCanvas(currentMessage)) return this;\n\n // Lazy-init: a `delta` with no existing canvas (joining mid-stream) opens the block rather than\n // dropping the markup that already arrived.\n const currentCanvas = currentMessage?.type === 'canvas' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n const canvas: ConversationCanvasMessage = {\n type: 'canvas',\n messageId: message.messageId,\n // Deltas are incremental, exactly like a text delta.\n html: `${currentCanvas?.html ?? ''}${message.text}`,\n title: currentCanvas?.title,\n isDrawing: true,\n time: currentCanvas?.time ?? new Date(),\n traceId: response.traceId ?? currentCanvas?.traceId,\n };\n messages.set(message.messageId, canvas);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onCanvasComplete(response: SseResponse<EventType.MESSAGE_CANVAS_COMPLETE>): Conversation {\n const message = response.fact.messageCanvasComplete.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const template = message.template?.type === MessageTemplateType.CANVAS ? message.template : undefined;\n const html = template?.canvas?.html;\n\n // No template (or no markup) means the backend could not render this canvas — the frame exists only\n // to close the block `start` opened. Discard the whole card: keeping the partial markup would\n // present an unfinished document as a finished one. For an unknown id this is a no-op.\n if (!html) {\n if (!this.messages?.has(message.messageId)) return this;\n\n const messages = new Map(this.messages);\n messages.delete(message.messageId);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n const currentMessage = this.messages?.get(message.messageId);\n const currentCanvas = currentMessage?.type === 'canvas' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n const canvas: ConversationCanvasMessage = {\n type: 'canvas',\n messageId: message.messageId,\n // **Replace, never append.** This fragment is authoritative, and a rejoin replays only the\n // complete — appending here would stream correctly and come back empty after a reload.\n html,\n title: template?.title,\n isDrawing: false,\n time: currentCanvas?.time ?? new Date(),\n traceId: response.traceId ?? currentCanvas?.traceId,\n };\n messages.set(message.messageId, canvas);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageUser(response: SseResponse<EventType.MESSAGE_USER>): Conversation {\n const data = response.fact.messageUser;\n\n // Dedup: the optimistic bubble sent live is keyed by the customMessageId the client generated, which\n // the backend echoes back here as `customMessageId`. If that (or the backend messageId) already maps\n // to a user message, this replayed turn is a duplicate — keep the existing one (F-014 invariant).\n const existing =\n this.messages?.get(data.messageId) ??\n (data.customMessageId ? this.messages?.get(data.customMessageId) : undefined);\n\n if (existing?.type === 'user') return this;\n\n const messages = new Map(this.messages);\n const userMessage: ConversationUserMessage = {\n type: 'user',\n messageId: data.messageId,\n text: data.text,\n blobIds: data.blobIds,\n blobs: data.blobs,\n customMessageId: data.customMessageId,\n identityHint: data.identityHint,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(data.messageId, userMessage);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageError(response: SseResponse<EventType.ERROR>): Conversation {\n const messageId = uuidv4();\n const error = response.fact.runError.error;\n\n const messages = new Map(this.messages);\n\n messages.set(messageId, {\n type: 'error',\n eventType: EventType.ERROR,\n messageId,\n error,\n time: new Date(),\n traceId: response.traceId,\n });\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onToolCallStart(response: SseResponse<EventType.TOOL_CALL_START>): Conversation {\n const toolCallStart = response.fact.toolCallStart;\n const messages = new Map(this.messages);\n const toolCallKey = `${toolCallStart.processId}-${toolCallStart.callSeq}`;\n\n // Terminal guard, mirroring `isTerminalBot` / `isTerminalThinking` (F-011): a tool-call that has\n // already completed must never regress to running. This became reachable once a replayed\n // `tool_call.complete` can materialize the message on its own — a late or out-of-order `start`\n // would otherwise overwrite it back to `isComplete: false` and drop `result` / `isError` /\n // `sidecar`, with no further `complete` coming to repair it. `isComplete` is also what the Task\n // list folds on (`derived-stores.ts`), so the regression would silently empty that list too.\n if (this.isTerminalToolCall(this.messages?.get(toolCallKey))) return this;\n\n const toolCallMessage: ConversationToolCallMessage = {\n type: 'tool-call',\n eventType: EventType.TOOL_CALL_START,\n messageId: toolCallKey,\n processId: toolCallStart.processId,\n callSeq: toolCallStart.callSeq,\n toolName: toolCallStart.toolCall.toolName,\n reason: toolCallStart.toolCall.reason,\n toolsetName: toolCallStart.toolCall.toolsetName,\n parameter: toolCallStart.toolCall.parameter,\n toolUseId: toolCallStart.toolUseId,\n parentToolUseId: toolCallStart.parentToolUseId,\n isComplete: false,\n time: new Date(),\n traceId: response.traceId,\n };\n\n messages.set(toolCallKey, toolCallMessage);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onToolCallComplete(response: SseResponse<EventType.TOOL_CALL_COMPLETE>): Conversation {\n const toolCallComplete = response.fact.toolCallComplete;\n const messages = new Map(this.messages);\n const toolCallKey = `${toolCallComplete.processId}-${toolCallComplete.callSeq}`;\n\n const existingMessage = messages.get(toolCallKey);\n\n if (existingMessage?.type === 'tool-call') {\n const updatedMessage: ConversationToolCallMessage = {\n ...existingMessage,\n eventType: EventType.TOOL_CALL_COMPLETE,\n result: toolCallComplete.toolCallResult,\n isError: toolCallComplete.isError,\n sidecar: toolCallComplete.toolUseResultSidecar,\n isComplete: true,\n traceId: response.traceId ?? existingMessage.traceId,\n };\n messages.set(toolCallKey, updatedMessage);\n } else {\n // Replay-safety (BUG-009): a GET rejoin only replays terminal frames, so `tool_call.complete`\n // arrives with no preceding `tool_call.start`. Dropping it here made every tool-call block\n // vanish when re-entering a conversation. The complete frame extends the same base payload as\n // the start frame (`toolCall.*` plus the correlation ids), so it can stand alone as a finished\n // call — the only thing lost is the original start timestamp.\n const replayedMessage: ConversationToolCallMessage = {\n type: 'tool-call',\n eventType: EventType.TOOL_CALL_COMPLETE,\n messageId: toolCallKey,\n processId: toolCallComplete.processId,\n callSeq: toolCallComplete.callSeq,\n toolName: toolCallComplete.toolCall.toolName,\n reason: toolCallComplete.toolCall.reason,\n toolsetName: toolCallComplete.toolCall.toolsetName,\n parameter: toolCallComplete.toolCall.parameter,\n toolUseId: toolCallComplete.toolUseId,\n parentToolUseId: toolCallComplete.parentToolUseId,\n result: toolCallComplete.toolCallResult,\n isError: toolCallComplete.isError,\n sidecar: toolCallComplete.toolUseResultSidecar,\n isComplete: true,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(toolCallKey, replayedMessage);\n }\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onToolCallConsent(response: SseResponse<EventType.TOOL_CALL_CONSENT>): Conversation {\n const consent = response.fact.toolCallConsent;\n\n return new Conversation({\n messages: this.messages,\n pendingConsent: consent,\n pendingFeedback: this.pendingFeedback,\n });\n }\n\n onSubagentStart(response: SseResponse<EventType.SUBAGENT_START>): Conversation {\n const start = response.fact.subagentStart;\n const messages = new Map(this.messages);\n const key = `subagent:${start.parentToolUseId}:start`;\n\n const message: ConversationSubagentMessage = {\n type: 'subagent',\n messageId: key,\n kind: 'start',\n parentToolUseId: start.parentToolUseId,\n agentId: start.agentId,\n subagentType: start.subagentType,\n description: start.description,\n time: new Date(),\n traceId: response.traceId,\n };\n\n // Re-key to the tail: a resumed subagent re-emits `start` under the same key, and `Map.set` alone\n // would keep it at the first run's position. `deriveSubagents` reads insertion order as arrival\n // order, so a stale position would fold the resume before the tool-calls it precedes (issue #382).\n messages.delete(key);\n messages.set(key, message);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onSubagentComplete(response: SseResponse<EventType.SUBAGENT_COMPLETE>): Conversation {\n const complete = response.fact.subagentComplete;\n const messages = new Map(this.messages);\n const key = `subagent:${complete.parentToolUseId}:complete`;\n\n const message: ConversationSubagentMessage = {\n type: 'subagent',\n messageId: key,\n kind: 'complete',\n parentToolUseId: complete.parentToolUseId,\n agentId: complete.agentId,\n subagentType: complete.subagentType,\n status: complete.status,\n summary: complete.summary,\n time: new Date(),\n traceId: response.traceId,\n };\n\n // Same re-keying as `onSubagentStart`: the second `complete` of a resumed subagent must fold after\n // that run's child tool-calls, otherwise the card never settles back to terminal (issue #382).\n messages.delete(key);\n messages.set(key, message);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n}\n","// Task Check List accumulation (F-010) — the framework-agnostic data-layer SoT.\n//\n// `TaskCreate` / `TaskUpdate` are native built-in tool-calls (`toolsetName === \"\"`, `reason === \"\"`),\n// but their meaning is \"an incremental edit to one list\", not \"a tool call\". So the react layer:\n// 1. routes them out of the tool-call group via `isTaskTool`;\n// 2. folds them into one current list with `reduceTaskEvents`, presented by `<TaskList>`.\n//\n// Authority (replay-safe): id / status transitions come from the `tool_call.complete` result sidecar,\n// never parsed from the human-readable `toolCallResult` string. `parameter` supplies subject /\n// activeForm / description / the target status fallback.\nimport { Task, TaskStatus } from '../types/task';\n\nconst TASK_TOOLS = new Set(['TaskCreate', 'TaskUpdate']);\n\n/** Native built-in check. `true` → route out of the tool-call group, feed to `reduceTaskEvents`. */\nexport function isTaskTool(call: { toolsetName: string; toolName: string }): boolean {\n return call.toolsetName === '' && TASK_TOOLS.has(call.toolName);\n}\n\n/**\n * A completed task tool-call — the fields `reduceTaskEvents` needs, mirroring a completed\n * `ConversationToolCallMessage` (or the raw `tool_call.complete` fact).\n */\nexport interface TaskToolEvent {\n toolName: string;\n parameter: Record<string, unknown>;\n /** `toolUseResultSidecar`: `TaskCreate` → authoritative id; `TaskUpdate` → `statusChange.to`. */\n sidecar?: Record<string, unknown>;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Fold the `TaskCreate` / `TaskUpdate` complete-event stream into the current list (in create-arrival\n * order). Pure and replay-safe: any prefix of the same stream folds to the same snapshot.\n */\nexport function reduceTaskEvents(events: TaskToolEvent[]): Task[] {\n const order: string[] = [];\n const byId = new Map<string, Task>();\n\n for (const event of events) {\n const parameter = event.parameter ?? {};\n const sidecar = event.sidecar ?? {};\n\n if (event.toolName === 'TaskCreate') {\n const task = asRecord(sidecar.task);\n const id = asString(task?.id);\n\n if (!id) continue; // no authoritative id → skip (never guess from the result string)\n\n if (!byId.has(id)) order.push(id);\n\n byId.set(id, {\n id,\n subject: asString(parameter.subject) || asString(task?.subject) || '',\n activeForm: asString(parameter.activeForm),\n description: asString(parameter.description),\n status: byId.get(id)?.status ?? 'pending', // initial status = pending (keep existing on repeat)\n });\n } else if (event.toolName === 'TaskUpdate') {\n const statusChange = asRecord(sidecar.statusChange);\n const id = asString(parameter.taskId) || asString(sidecar.taskId);\n // sidecar authoritative, parameter.status fallback.\n const to = (asString(statusChange?.to) || asString(parameter.status)) as TaskStatus | undefined;\n\n if (!id || !to) continue;\n\n const prev = byId.get(id);\n\n if (prev) byId.set(id, { ...prev, status: to });\n // update arriving before its create (shouldn't happen in order) → ignore.\n }\n }\n\n return order.map(id => byId.get(id) as Task);\n}\n","// Subagent list accumulation (F-012) — the framework-agnostic data-layer SoT.\n//\n// An `Agent` tool-call spawns a subagent, but it is only the \"launch\" viewpoint and lacks the\n// subagent's detail. So the react layer:\n// 1. routes the `Agent` tool-call (isAgentTool) and every child tool-call (parentToolUseId !== \"\")\n// out of the main tool-call group;\n// 2. folds the `Agent` tool-call + `subagent.{start,complete}` + child tool-calls into one current\n// subagent list with `reduceSubagents`, presented by `<SubagentList>`.\n//\n// Two correctness rules (verified against asgard-sdk-go + the new-example11 dump):\n// - A subagent's status is driven by `subagent.start` → `subagent.complete`, NOT the `Agent`\n// tool_call.complete — async subagents complete the `Agent` tool early (result.status =\n// \"async_launched\") while the subagent is still running.\n// - Correlation key = `parentToolUseId` (= the `Agent` tool-call's `toolUseId`).\n// - A subagent is not one-shot: the orchestrator can resume an existing one, so a terminal card that\n// produces new activity goes back to `running` (issue #382 — see `resume` below).\nimport { Subagent, SubagentStatus, SubagentToolCall } from '../types/subagent';\n\n/** The spawning `Agent` tool-call (native builtin). `true` → route out of the tool-call group. */\nexport function isAgentTool(call: { toolsetName: string; toolName: string }): boolean {\n return call.toolsetName === '' && call.toolName === 'Agent';\n}\n\n/** Whether a tool-call belongs to a subagent (child). The main group keeps only `parentToolUseId === \"\"`. */\nexport function isSubagentChildTool(parentToolUseId?: string): boolean {\n return !!parentToolUseId;\n}\n\n/** The subagent-related SSE events, adapted from their facts by the react layer, in arrival order. */\nexport type SubagentEvent =\n | { kind: 'agentStart'; toolUseId: string; description?: string }\n | { kind: 'subagentStart'; parentToolUseId: string; agentId?: string; subagentType?: string; description?: string }\n | {\n kind: 'toolStart';\n parentToolUseId: string;\n toolUseId: string;\n toolsetName: string;\n toolName: string;\n parameter?: Record<string, unknown>;\n reason?: string;\n }\n | { kind: 'toolComplete'; parentToolUseId: string; toolUseId: string; isError?: boolean }\n | { kind: 'subagentComplete'; parentToolUseId: string; status: SubagentStatus; summary?: string };\n\ninterface Meta {\n agentId?: string;\n subagentType?: string;\n description?: string;\n status: SubagentStatus;\n summary?: string;\n}\n\n/**\n * A subagent that produces new activity is working again, so a terminal card goes back to `running`\n * and drops the summary — that summary concluded the run that already finished (issue #382).\n */\nfunction resume(m: Meta): void {\n if (m.status === 'running') return;\n\n m.status = 'running';\n m.summary = undefined;\n}\n\n/**\n * Fold the subagent event stream into the current list (in first-seen order). Pure and replay-safe:\n * a replay re-applies the same arrival order, so the trailing `subagentComplete` wins and the snapshot\n * is unchanged. (The guard would only be load-bearing if a replay could deliver a `start` — or a child\n * `toolStart` — *without* the `complete` that followed it, which is not how the folded stream is built.)\n */\nexport function reduceSubagents(events: SubagentEvent[]): Subagent[] {\n const order: string[] = [];\n const meta = new Map<string, Meta>();\n const tools = new Map<string, Map<string, SubagentToolCall>>(); // parentToolUseId -> (toolUseId -> tool)\n\n const ensure = (id: string): Meta => {\n if (!meta.has(id)) {\n order.push(id);\n meta.set(id, { status: 'running' });\n tools.set(id, new Map());\n }\n\n return meta.get(id) as Meta;\n };\n\n for (const event of events) {\n switch (event.kind) {\n case 'agentStart': {\n const m = ensure(event.toolUseId);\n\n if (event.description && !m.description) m.description = event.description;\n\n break;\n }\n\n case 'subagentStart': {\n const m = ensure(event.parentToolUseId);\n\n m.agentId = event.agentId ?? m.agentId;\n m.subagentType = event.subagentType ?? m.subagentType;\n m.description = event.description ?? m.description;\n resume(m); // shape A: the orchestrator re-started an existing subagent within the same turn\n\n break;\n }\n\n case 'toolStart': {\n // shape B (the common resume): a later-turn resume carries no lifecycle event at all, so a\n // child tool-call landing on a terminal card is the only signal that it is working again.\n resume(ensure(event.parentToolUseId));\n (tools.get(event.parentToolUseId) as Map<string, SubagentToolCall>).set(event.toolUseId, {\n toolsetName: event.toolsetName,\n toolName: event.toolName,\n parameter: event.parameter ?? {},\n reason: event.reason,\n status: 'running',\n });\n\n break;\n }\n\n case 'toolComplete': {\n const tool = tools.get(event.parentToolUseId)?.get(event.toolUseId);\n\n if (tool) tool.status = event.isError ? 'error' : 'completed';\n\n break;\n }\n\n case 'subagentComplete': {\n const m = ensure(event.parentToolUseId);\n\n m.status = event.status;\n m.summary = event.summary;\n\n break;\n }\n }\n }\n\n return order.map(id => ({\n parentToolUseId: id,\n ...(meta.get(id) as Meta),\n tools: Array.from((tools.get(id) as Map<string, SubagentToolCall>).values()),\n }));\n}\n","// Derived-state stores (F-013) — framework-agnostic Task / Subagent stores.\n//\n// The Task List (F-010) and Subagent List (F-012) are pure folds over the conversation. This module\n// exposes them as reactive slices so SDK consumers can render the lists *outside* the Chatbot in any\n// framework: a current immutable snapshot + change notification, never a fire-and-forget delta event.\n//\n// The key performance property: `conversation` changes on every message delta (high frequency), but a\n// consumer that \"just wants to draw the list\" must not re-render on unrelated deltas. Each slice is a\n// `BehaviorSubject` fed through `distinctUntilChanged` on structural equality, so it only emits when\n// that slice actually changes.\nimport { BehaviorSubject, distinctUntilChanged, map, Observable, Subscription } from 'rxjs';\nimport Conversation from './conversation';\nimport { isTaskTool, reduceTaskEvents } from './task-reducer';\nimport { isAgentTool, isSubagentChildTool, reduceSubagents, SubagentEvent } from './subagent-reducer';\nimport { ConversationMessage, ConversationToolCallMessage, Subagent, SubagentToolCall, Task } from '../types';\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Adapt the ordered conversation messages into the `SubagentEvent[]` that `reduceSubagents` folds.\n * Iterating the conversation Map yields arrival order: a message updated in place keeps its slot (a\n * tool-call completing does not jump the queue), and the one case where a message genuinely arrives\n * again — a resumed subagent re-emitting `subagent.start` / `subagent.complete` under the same key —\n * is re-keyed to the tail by `Conversation` so this fold still sees true order (issue #382). A completed\n * child tool emits toolStart + toolComplete back-to-back (its final status is what shows); an\n * in-progress child emits only toolStart (→ running).\n */\nexport function conversationToSubagentEvents(messages: ConversationMessage[]): SubagentEvent[] {\n const events: SubagentEvent[] = [];\n\n for (const message of messages) {\n if (message.type === 'tool-call' && isAgentTool(message)) {\n events.push({\n kind: 'agentStart',\n toolUseId: message.toolUseId ?? message.messageId,\n description: str(message.parameter.description),\n });\n continue;\n }\n\n if (message.type === 'tool-call' && isSubagentChildTool(message.parentToolUseId)) {\n const toolUseId = message.toolUseId ?? message.messageId;\n\n events.push({\n kind: 'toolStart',\n parentToolUseId: message.parentToolUseId as string,\n toolUseId,\n toolsetName: message.toolsetName,\n toolName: message.toolName,\n parameter: message.parameter,\n reason: message.reason,\n });\n\n if (message.isComplete) {\n events.push({\n kind: 'toolComplete',\n parentToolUseId: message.parentToolUseId as string,\n toolUseId,\n isError: message.isError,\n });\n }\n\n continue;\n }\n\n if (message.type === 'subagent' && message.kind === 'start') {\n events.push({\n kind: 'subagentStart',\n parentToolUseId: message.parentToolUseId,\n agentId: message.agentId,\n subagentType: message.subagentType,\n description: message.description,\n });\n continue;\n }\n\n if (message.type === 'subagent' && message.kind === 'complete' && message.status) {\n events.push({\n kind: 'subagentComplete',\n parentToolUseId: message.parentToolUseId,\n status: message.status,\n summary: message.summary,\n });\n }\n }\n\n return events;\n}\n\n/** Fold the conversation's completed Task tool-calls into the current Task list (F-010). */\nexport function deriveTasks(conversation: Conversation): Task[] {\n const messages = Array.from(conversation.messages?.values() ?? []).filter(\n (message): message is ConversationToolCallMessage =>\n message.type === 'tool-call' && message.isComplete && isTaskTool(message),\n );\n\n return reduceTaskEvents(messages);\n}\n\n/** Fold the conversation's Agent / subagent / child tool-call events into the current Subagent list (F-012). */\nexport function deriveSubagents(conversation: Conversation): Subagent[] {\n return reduceSubagents(conversationToSubagentEvents(Array.from(conversation.messages?.values() ?? [])));\n}\n\n/** Structural equality for two derived Task lists (so a slice only emits when the list truly changes). */\nexport function tasksEqual(a: Task[], b: Task[]): boolean {\n if (a === b) return true;\n\n if (a.length !== b.length) return false;\n\n return a.every((task, i) => {\n const other = b[i];\n\n return (\n task.id === other.id &&\n task.status === other.status &&\n task.subject === other.subject &&\n task.activeForm === other.activeForm &&\n task.description === other.description\n );\n });\n}\n\nfunction toolsEqual(a: SubagentToolCall[], b: SubagentToolCall[]): boolean {\n if (a.length !== b.length) return false;\n\n return a.every((tool, i) => {\n const other = b[i];\n\n return (\n tool.toolName === other.toolName &&\n tool.toolsetName === other.toolsetName &&\n tool.status === other.status &&\n tool.reason === other.reason\n );\n });\n}\n\n/** Structural equality for two derived Subagent lists (including each subagent's child tool list). */\nexport function subagentsEqual(a: Subagent[], b: Subagent[]): boolean {\n if (a === b) return true;\n\n if (a.length !== b.length) return false;\n\n return a.every((subagent, i) => {\n const other = b[i];\n\n return (\n subagent.parentToolUseId === other.parentToolUseId &&\n subagent.status === other.status &&\n subagent.subagentType === other.subagentType &&\n subagent.description === other.description &&\n subagent.summary === other.summary &&\n toolsEqual(subagent.tools, other.tools)\n );\n });\n}\n\nexport interface DerivedStores {\n /** Emits the current Task list; only when it changes (not on every conversation delta). */\n tasks$: Observable<Task[]>;\n /** Emits the current Subagent list; only when it changes. */\n subagents$: Observable<Subagent[]>;\n /** The current Task list snapshot (immutable). */\n getTasks: () => Task[];\n /** The current Subagent list snapshot (immutable). */\n getSubagents: () => Subagent[];\n /** Tear down the internal subscriptions. */\n teardown: () => void;\n}\n\n/**\n * Build the per-slice derived stores from a `conversation$` source. Each slice is a `BehaviorSubject`\n * (replays the current snapshot to late subscribers) fed through `distinctUntilChanged`, so it emits\n * only when that slice structurally changes — unrelated high-frequency deltas are suppressed.\n */\nexport function createDerivedStores(conversation$: Observable<Conversation>): DerivedStores {\n const tasks$ = new BehaviorSubject<Task[]>([]);\n const subagents$ = new BehaviorSubject<Subagent[]>([]);\n const subscription = new Subscription();\n\n subscription.add(conversation$.pipe(map(deriveTasks), distinctUntilChanged(tasksEqual)).subscribe(tasks$));\n subscription.add(\n conversation$.pipe(map(deriveSubagents), distinctUntilChanged(subagentsEqual)).subscribe(subagents$),\n );\n\n return {\n tasks$: tasks$.asObservable(),\n subagents$: subagents$.asObservable(),\n getTasks: () => tasks$.value,\n getSubagents: () => subagents$.value,\n teardown: () => subscription.unsubscribe(),\n };\n}\n","import { LaunchedSandbox } from '../types';\n\n/**\n * Normalize a raw `/channel/metadata` `launchedSandboxes[]` snapshot into a stable live list (F-019 /\n * UC-032): dedup by `sandboxName` (metadata should not repeat, but a defensive dedup keeps the UI stable)\n * and sort by display label (`sandboxBlueprintName || sandboxName`) so a different backend ordering never\n * makes a downstream dropdown jump. metadata is the sole authority on \"who is live\" — this folds in no\n * SSE-derived guesses. Never mutates the input.\n */\nexport function reconcileLaunched(metadata: readonly LaunchedSandbox[]): LaunchedSandbox[] {\n const byName = new Map<string, LaunchedSandbox>();\n for (const sandbox of metadata) byName.set(sandbox.sandboxName, sandbox); // last write wins: same name → latest snapshot\n\n return [...byName.values()].sort((a, b) =>\n (a.sandboxBlueprintName || a.sandboxName).localeCompare(b.sandboxBlueprintName || b.sandboxName),\n );\n}\n","import { BehaviorSubject, combineLatest, distinctUntilChanged, map, Observable, Subscription } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ChannelConfig,\n ChannelRunState,\n ChannelStates,\n FetchSseOptions,\n FetchSsePayload,\n IAsgardServiceClient,\n LaunchedSandbox,\n MessageFeedbackReply,\n MessageFeedbackState,\n ObserverOrNext,\n RunKind,\n RunStatus,\n SandboxPhase,\n StopGenerationOptions,\n Subagent,\n SseResponse,\n Task,\n ToolCallConsentAnswer,\n} from '../types';\nimport { ChannelBusyError } from '../types/channel-busy-error';\nimport { ChannelAwaitingConsentError } from '../types/channel-awaiting-consent-error';\nimport { FetchSseAction, EventType } from '../constants/enum';\nimport Conversation from './conversation';\nimport { createDerivedStores, DerivedStores } from './derived-stores';\nimport { reconcileLaunched } from './launched-sandboxes';\n\n/** Nothing running, nothing stopping. */\nconst IDLE_RUN_STATUS: RunStatus = { kind: null, stopPhase: 'idle' };\n\n/** How long an accepted stop waits for the terminal event before offering force-stop (F-023 AC7). */\nexport const FORCE_STOP_TIMEOUT_MS = 10_000;\n\nfunction runStatusEqual(a: RunStatus, b: RunStatus): boolean {\n return a.kind === b.kind && a.stopPhase === b.stopPhase && a.requestId === b.requestId;\n}\n\nexport default class Channel {\n private client: IAsgardServiceClient;\n\n public customChannelId: string;\n public customMessageId?: string;\n // Join-time run state from `GET /channel/metadata` (F-023 AC9): decides whether a rejoin is tailing a\n // live run (`restore`) or replaying a finished transcript (`replay`).\n private joinRunState: ChannelRunState;\n\n private isConnecting$: BehaviorSubject<boolean>;\n private runStatusSubject: BehaviorSubject<RunStatus>;\n private conversation$: BehaviorSubject<Conversation>;\n private channelTitleSubject: BehaviorSubject<string | null>;\n private promptSuggestionSubject: BehaviorSubject<string | null>;\n private sandboxPhaseSubject: BehaviorSubject<SandboxPhase>;\n private launchedSandboxesSubject: BehaviorSubject<LaunchedSandbox[]>;\n // Sandboxes hinted live by an `asgard.sandbox.launch` frame but not yet confirmed by metadata (F-019).\n // Never merged into the live list directly — cleared once metadata confirms (or held until it does).\n private pendingLaunches: string[] = [];\n private derivedStores: DerivedStores;\n private statesObserver?: ObserverOrNext<ChannelStates>;\n private statesSubscription?: Subscription;\n\n /** Reactive Task Check List store (F-013): emits only when the list changes; replays the snapshot. */\n public readonly tasks$: Observable<Task[]>;\n /** Reactive Subagent list store (F-013): emits only when the list changes; replays the snapshot. */\n public readonly subagents$: Observable<Subagent[]>;\n /** Reactive channel title store (F-016): seeded from metadata, updated by `title.update`; replay-safe. */\n public readonly channelTitle$: Observable<string | null>;\n /**\n * Reactive next-turn suggestion store (F-028): fed by `asgard.prompt_suggestion`, cleared when the\n * prediction expires. Live-only — a rejoin replay carries no such event, so this legitimately stays\n * `null` after a reload. Never seeded: there is no metadata source for it.\n */\n public readonly promptSuggestion$: Observable<string | null>;\n /** Reactive sandbox cold-start phase store (F-018): per-slice, derived from the last sandbox event; replay-safe. */\n public readonly sandboxPhase$: Observable<SandboxPhase>;\n /** Reactive live-sandbox list store (F-019): authoritative from `/channel/metadata`, per-slice; replay-safe. */\n public readonly launchedSandboxes$: Observable<LaunchedSandbox[]>;\n /** Reactive run identity + stop lifecycle store (F-023): who holds the connection, and is a stop pending. */\n public readonly runStatus$: Observable<RunStatus>;\n private currentUserMessageId?: string;\n // The most-recently-sent user message id. Unlike currentUserMessageId (which\n // is cleared once a traceId is attached), this is kept across the SSE\n // lifecycle so RESPONSE_TOOL_CALL_CONSENT — fired after run.done — can echo\n // back the message id the bot is waiting on.\n private lastSentMessageId?: string;\n // The in-flight SSE run's subscription. Held so the connection can be aborted locally (unsubscribe →\n // create-sse-observable teardown → AbortController.abort()) on close, on channel switch, and on the\n // legacy stop fallback. Cleared on every terminal (complete / error).\n //\n // NOTE (F-023): a user-initiated stop no longer unsubscribes this. Runs execute in the background on\n // the server, so cutting the stream would only stop *watching* — the stop is requested through\n // `client.suspendChannel()` and declared by this same stream's terminal event.\n private currentRun?: Subscription;\n // Armed when a stop is accepted; fires after FORCE_STOP_TIMEOUT_MS to offer force-stop (F-023 AC7).\n // Cleared on terminal, on suspend failure, and in close() (§1.5).\n private forceStopTimer?: ReturnType<typeof setTimeout>;\n\n private constructor(config: ChannelConfig) {\n if (!config.client) {\n throw new Error('client must be required');\n }\n\n if (!config.customChannelId) {\n throw new Error('customChannelId must be required');\n }\n\n this.client = config.client;\n this.customChannelId = config.customChannelId;\n this.customMessageId = config.customMessageId;\n this.joinRunState = config.runState ?? 'IDLE';\n\n this.isConnecting$ = new BehaviorSubject(false);\n this.runStatusSubject = new BehaviorSubject<RunStatus>(IDLE_RUN_STATUS);\n this.conversation$ = new BehaviorSubject(config.conversation);\n this.channelTitleSubject = new BehaviorSubject<string | null>(config.channelTitle ?? null);\n this.promptSuggestionSubject = new BehaviorSubject<string | null>(null);\n this.sandboxPhaseSubject = new BehaviorSubject<SandboxPhase>('idle');\n this.launchedSandboxesSubject = new BehaviorSubject<LaunchedSandbox[]>(\n reconcileLaunched(config.launchedSandboxes ?? []),\n );\n this.derivedStores = createDerivedStores(this.conversation$);\n this.tasks$ = this.derivedStores.tasks$;\n this.subagents$ = this.derivedStores.subagents$;\n // Emit only when the title actually changes (ignore duplicate `title.update`s with the same value).\n this.channelTitle$ = this.channelTitleSubject.pipe(distinctUntilChanged());\n // Per-slice: the same suggestion arriving twice must not re-notify consumers (F-028).\n this.promptSuggestion$ = this.promptSuggestionSubject.pipe(distinctUntilChanged());\n // Per-slice: emit only when the phase actually changes, so unrelated high-frequency message\n // deltas never re-notify the HUD (UC-031, same performance rule as the F-013 derived stores).\n this.sandboxPhase$ = this.sandboxPhaseSubject.pipe(distinctUntilChanged());\n // Per-slice: only `applyLaunchedSandboxes` / `dropSandbox` push here (never the conversation stream),\n // so high-frequency message deltas never re-emit the live-sandbox list (UC-032 ALT2).\n this.launchedSandboxes$ = this.launchedSandboxesSubject.pipe(distinctUntilChanged());\n // Per-slice: `RunStatus` is a fresh object on every write, so compare by field — otherwise the\n // states observer would re-notify on every identical write during a run (F-023).\n this.runStatus$ = this.runStatusSubject.pipe(distinctUntilChanged(runStatusEqual));\n this.statesObserver = config.statesObserver;\n }\n\n /** Current Task Check List snapshot (F-013) — for framework-agnostic `getSnapshot()` bridging. */\n public getTasks(): Task[] {\n return this.derivedStores.getTasks();\n }\n\n /** Current Subagent list snapshot (F-013) — for framework-agnostic `getSnapshot()` bridging. */\n public getSubagents(): Subagent[] {\n return this.derivedStores.getSubagents();\n }\n\n /** Current channel title snapshot (F-016) — for framework-agnostic `getSnapshot()` bridging. */\n public getChannelTitle(): string | null {\n return this.channelTitleSubject.value;\n }\n\n /** Current next-turn suggestion snapshot (F-028) — for framework-agnostic `getSnapshot()` bridging. */\n public getPromptSuggestion(): string | null {\n return this.promptSuggestionSubject.value;\n }\n\n /**\n * Drop the current suggestion (F-028). Called when the prediction has expired: the user adopted it\n * (it is in the textarea now, and re-offering it would duplicate the text), or a send / a new run\n * made it stale. Losing focus is deliberately NOT one of those moments.\n */\n public clearPromptSuggestion(): void {\n this.promptSuggestionSubject.next(null);\n }\n\n /** Current sandbox phase snapshot (F-018) — for framework-agnostic `getSnapshot()` bridging. */\n public getSandboxPhase(): SandboxPhase {\n return this.sandboxPhaseSubject.value;\n }\n\n /** Current live-sandbox snapshot (F-019) — for framework-agnostic `getSnapshot()` bridging. */\n public getLaunchedSandboxes(): LaunchedSandbox[] {\n return this.launchedSandboxesSubject.value;\n }\n\n /** Current run identity + stop lifecycle snapshot (F-023) — for framework-agnostic `getSnapshot()` bridging. */\n public getRunStatus(): RunStatus {\n return this.runStatusSubject.value;\n }\n\n /** Names hinted by `sandbox.launch` but not yet confirmed live by metadata (F-019) — \"starting\" placeholders. */\n public getPendingLaunches(): string[] {\n return this.pendingLaunches;\n }\n\n /**\n * Authoritatively replace the live-sandbox list from a fresh `/channel/metadata` snapshot (F-019). This\n * is the only sanctioned way to change \"who is live\": it reconciles the list and clears any pending\n * launch whose name now appears (promoted to live). metadata (heartbeat-backed) is the sole authority.\n */\n public applyLaunchedSandboxes(list: readonly LaunchedSandbox[]): void {\n const next = reconcileLaunched(list);\n this.pendingLaunches = this.pendingLaunches.filter(name => !next.some(sandbox => sandbox.sandboxName === name));\n this.launchedSandboxesSubject.next(next);\n }\n\n /**\n * Optimistically drop one sandbox (F-019) — e.g. its fs calls keep failing or it is known to be\n * recycled. The next `/channel/metadata` refetch reconciles the authoritative truth.\n */\n public dropSandbox(sandboxName: string): void {\n const current = this.launchedSandboxesSubject.value;\n const next = current.filter(sandbox => sandbox.sandboxName !== sandboxName);\n if (next.length !== current.length) this.launchedSandboxesSubject.next(next);\n }\n\n /**\n * Record an `asgard.sandbox.launch` hint (F-019): the event is not trusted to add a live sandbox (it may\n * not be Ready / heartbeat-visible yet), so the name is held as pending and a metadata refetch is\n * scheduled. `applyLaunchedSandboxes` promotes it to live once metadata confirms.\n */\n public noteSandboxLaunch(sandboxName: string): void {\n if (!this.pendingLaunches.includes(sandboxName)) {\n this.pendingLaunches = [...this.pendingLaunches, sandboxName];\n }\n\n void this.refetchMetadata();\n }\n\n /**\n * Re-fetch `/channel/metadata` and authoritatively apply its `launchedSandboxes` (F-019). Called on a\n * launch hint, and by the react adapter on `visibilitychange` / polling. A client without metadata\n * support is a no-op.\n */\n public async refetchMetadata(): Promise<void> {\n if (!this.client.channelMetadata) return;\n\n const metadata = await this.client.channelMetadata(this.customChannelId);\n if (metadata) this.applyLaunchedSandboxes(metadata.launchedSandboxes);\n }\n\n /** Seed / override the channel title (F-016) — used by the join-restore metadata seed (F-015). */\n public setChannelTitle(title: string | null): void {\n this.channelTitleSubject.next(title);\n }\n\n public static create(config: ChannelConfig): Channel {\n const channel = new Channel(config);\n channel.subscribe();\n\n return channel;\n }\n\n /**\n * Open a channel with a fresh conversation (F-032): create it and dispatch a single `action=NONE`\n * opening turn, which the backend answers with the welcome run. Used for the mount-time opening of a\n * channel that does not exist yet (UC-025) — nothing is deleted, because there is nothing there.\n *\n * The run's kind stays `'reset'`: an opening turn is not a turn the user dispatched, so\n * stop-generation must not fire on it (F-023 AC8).\n */\n public static async open(\n config: ChannelConfig,\n payload?: Pick<FetchSsePayload, 'text' | 'payload'>,\n options?: FetchSseOptions,\n onChannelCreated?: (channel: Channel) => void,\n ): Promise<Channel> {\n const channel = new Channel(config);\n\n try {\n channel.subscribe();\n\n // Expose the channel before the opening run finishes. The backend can emit a tool_call.consent\n // *during* this run (before run.done), so a reply submitted while the modal is up must reach a\n // non-null channel — otherwise the consent answer is silently dropped.\n onChannelCreated?.(channel);\n\n await channel.openChannel(payload, options);\n\n return channel;\n } catch (error) {\n channel.close();\n\n throw error;\n }\n }\n\n /**\n * Clear an **existing** conversation and start over on the same id (F-032) — what the header's reset\n * button does. Two steps, in this order and never bundled:\n *\n * 1. `client.deleteChannel()` — the backend releases the run, transcript, blobs, consent allow-list,\n * Sandbox and Channel Home, and answers only once that teardown is done.\n * 2. {@link Channel.open} — a plain `action=NONE` opening turn on the now-empty id.\n *\n * This replaces the single `RESET_CHANNEL` turn, which bundled both into one request and therefore\n * could never carry attachments: blobs belong to the channel that was live when they were uploaded, so\n * the delete stripped them and the `blobIds` resolved to nothing without an error. A host that needs\n * \"clear, then send with attachments\" sequences it itself: `deleteChannel` → upload → `sendMessage`.\n *\n * **Nothing local changes until the delete succeeds** — no channel is constructed, so no state\n * observer fires. A failed delete therefore leaves the caller's current channel and conversation\n * exactly as they were, which is the point: the screen must never be cleared while the server still\n * holds the old conversation.\n */\n public static async reset(\n config: ChannelConfig,\n payload?: Pick<FetchSsePayload, 'text' | 'payload'>,\n options?: FetchSseOptions,\n onChannelCreated?: (channel: Channel) => void,\n ): Promise<Channel> {\n if (!config.client.deleteChannel) {\n // A hand-rolled IAsgardServiceClient that predates F-032. Refuse loudly rather than skipping the\n // delete (the screen would clear while the backend keeps the old conversation) or falling back to\n // the retired RESET_CHANNEL turn. `AsgardServiceClient` always has the method, so only a custom\n // client can land here.\n throw new Error(\n 'This client cannot reset a channel: IAsgardServiceClient.deleteChannel is not implemented. ' +\n 'Implement it (DELETE {base}/channel?custom_channel_id=…) or use AsgardServiceClient.',\n );\n }\n\n await config.client.deleteChannel(config.customChannelId);\n\n return Channel.open(config, payload, options, onChannelCreated);\n }\n\n /**\n * Join an **existing** channel without resetting it (F-015). Seeds the title from `config.channelTitle`\n * (the `GET /channel/metadata` value) at construction, then replays the server transcript via GET\n * `rejoinSse` and holds `isConnecting` until the run reaches a terminal. Never deletes and never\n * opens, so the channel's history / session / title are preserved — this is the fix for the mount-time\n * \"join an existing channel and wipe its history\" data-loss bug.\n */\n public static async restore(\n config: ChannelConfig,\n options?: FetchSseOptions,\n onChannelCreated?: (channel: Channel) => void,\n ): Promise<Channel> {\n const channel = new Channel(config);\n\n try {\n channel.subscribe();\n\n // Adopt the channel before the replay finishes — a RUNNING restore can stream a tool_call.consent\n // before its terminal, and a reply submitted then must reach a non-null channel (same rationale as\n // reset).\n onChannelCreated?.(channel);\n\n await channel.rejoinChannel(options);\n\n return channel;\n } catch (error) {\n channel.close();\n\n throw error;\n }\n }\n\n private subscribe(): void {\n this.statesSubscription = combineLatest([\n this.isConnecting$,\n this.conversation$,\n this.derivedStores.tasks$,\n this.derivedStores.subagents$,\n this.channelTitle$,\n this.promptSuggestion$,\n this.sandboxPhase$,\n this.launchedSandboxes$,\n this.runStatus$,\n ])\n .pipe(\n map(\n ([\n isConnecting,\n conversation,\n tasks,\n subagents,\n channelTitle,\n promptSuggestion,\n sandboxPhase,\n launchedSandboxes,\n runStatus,\n ]) => ({\n isConnecting,\n conversation,\n tasks,\n subagents,\n channelTitle,\n promptSuggestion,\n sandboxPhase,\n launchedSandboxes,\n runStatus,\n }),\n ),\n )\n .subscribe(this.statesObserver);\n }\n\n /**\n * Resolves payload by executing it if it's a function, otherwise returns as-is.\n */\n private resolvePayload(\n payload: Record<string, unknown> | (() => Record<string, unknown>) | undefined,\n ): Record<string, unknown> | undefined {\n if (typeof payload === 'function') {\n try {\n return payload();\n } catch (error) {\n throw new Error(\n `Failed to resolve payload function: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return payload;\n }\n\n /**\n * Advance the sandbox phase store from an incoming event's type (F-018). Only sandbox / run-boundary\n * events move it; every other event is a no-op, so `distinctUntilChanged` suppresses re-emission on\n * high-frequency message deltas.\n */\n private updateSandboxPhase(eventType: EventType): void {\n switch (eventType) {\n case EventType.SANDBOX_LAUNCH:\n this.sandboxPhaseSubject.next('launching');\n\n break;\n case EventType.SANDBOX_READY:\n this.sandboxPhaseSubject.next('ready');\n\n break;\n case EventType.INIT:\n case EventType.ERROR:\n this.sandboxPhaseSubject.next('idle');\n\n break;\n default:\n break;\n }\n }\n\n /**\n * The SSE run handlers shared by every run kind (POST send/reset and GET rejoin): fold each frame\n * through the conversation reducer, keep the title store in sync, attach the traceId to the pending\n * user bubble, and settle the run promise (releasing `isConnecting`) on completion / error.\n */\n private buildRunHandlers(\n options: FetchSseOptions | undefined,\n resolve: () => void,\n reject: (err: unknown) => void,\n ): FetchSseOptions {\n return {\n onSseStart: options?.onSseStart,\n onSseMessage: (response: SseResponse<EventType>): void => {\n options?.onSseMessage?.(response);\n\n // F-023 — remember which run this is so a stop can name it (`request_id`), stopping only this\n // run rather than whatever happens to be live when the request lands.\n this.captureRequestId(response.requestId);\n\n // F-016 — the channel title is run-level state, not a message; keep it out of the conversation\n // (it is ephemeral and must survive rejoin replays, which don't carry this event).\n if (response.eventType === EventType.CHANNEL_TITLE_UPDATE) {\n this.channelTitleSubject.next(\n (response as SseResponse<EventType.CHANNEL_TITLE_UPDATE>).fact.channelTitleUpdate.title,\n );\n }\n\n // F-028 — the next-turn suggestion is run-level state, not a message: ephemeral, live-only,\n // and kept out of the conversation. A new run makes the previous prediction stale (it was\n // about the turn that just ended), so `run.init` drops it — including on a rejoin replay,\n // which carries `run.init` but never a suggestion.\n if (response.eventType === EventType.PROMPT_SUGGESTION) {\n this.promptSuggestionSubject.next(\n (response as SseResponse<EventType.PROMPT_SUGGESTION>).fact.promptSuggestion.suggestion,\n );\n } else if (response.eventType === EventType.INIT) {\n this.clearPromptSuggestion();\n }\n\n // F-018 — sandbox cold-start phase, derived from the last sandbox event. Run-level (not a\n // conversation message); folds identically on live and on rejoin replay (replay-safe). Reset to\n // idle on run init (fresh run re-arms) and error (collapse); `done` is left to the react latch so\n // the ready-beat / fade-out can finish (happy path: `done` arrives after `ready`).\n this.updateSandboxPhase(response.eventType);\n\n // F-019 — a `sandbox.launch` frame is only a hint: record the name as pending and schedule a\n // metadata refetch (the authority on \"who is live\"). Never merge it into the live list directly.\n if (response.eventType === EventType.SANDBOX_LAUNCH) {\n this.noteSandboxLaunch((response as SseResponse<EventType.SANDBOX_LAUNCH>).fact.sandboxLaunch.sandboxName);\n }\n\n if (this.currentUserMessageId && response.traceId) {\n const messages = new Map(this.conversation$.value.messages);\n const userMessage = messages.get(this.currentUserMessageId);\n\n if (userMessage && userMessage.type === 'user') {\n messages.set(this.currentUserMessageId, {\n ...userMessage,\n traceId: response.traceId,\n });\n // Carry `pendingConsent` over — this rebuild bypasses the reducer (which preserves it on\n // every hop), so omitting it silently discards a consent prompt that arrived on an earlier,\n // traceId-less frame, stranding a run that is still waiting for the answer.\n this.conversation$.next(\n new Conversation({\n messages,\n pendingConsent: this.conversation$.value.pendingConsent,\n pendingFeedback: this.conversation$.value.pendingFeedback,\n }),\n );\n }\n\n this.currentUserMessageId = undefined;\n }\n\n this.conversation$.next(this.conversation$.value.onMessage(response));\n },\n onSseError: (err: unknown): void => {\n options?.onSseError?.(err);\n this.settleRun();\n reject(err);\n },\n onSseCompleted: (): void => {\n options?.onSseCompleted?.();\n this.settleRun();\n resolve();\n },\n };\n }\n\n /**\n * The terminal of a run, whichever way it ended. For a stop in flight this is the moment the backend\n * declares the run actually finished (F-023 AC3) — the same event a normal run ends with — so it is\n * the only place `stopping` is released back to \"waiting for input\".\n */\n private settleRun(): void {\n const wasStopping = this.runStatusSubject.value.stopPhase !== 'idle';\n\n this.clearForceStopTimer();\n this.isConnecting$.next(false);\n this.runStatusSubject.next(IDLE_RUN_STATUS);\n this.currentUserMessageId = undefined;\n this.currentRun = undefined;\n\n // F-020 AC10 / F-023 — a suspended turn is rolled back, so whatever was mid-flight gets no closing\n // frame of its own: a tool-call would spin as `running` forever and a thinking block would stay\n // highlighted as \"Thinking…\". Settle both rather than leaving them advertising activity that stopped.\n if (wasStopping) {\n this.conversation$.next(this.conversation$.value.settleInFlightMessages());\n }\n }\n\n /** Record the backend run id from the first frame that carries one; later frames must not overwrite it. */\n private captureRequestId(requestId: string | undefined): void {\n const current = this.runStatusSubject.value;\n\n if (!requestId || current.requestId || !current.kind) return;\n\n this.runStatusSubject.next({ ...current, requestId });\n }\n\n private clearForceStopTimer(): void {\n if (!this.forceStopTimer) return;\n\n clearTimeout(this.forceStopTimer);\n this.forceStopTimer = undefined;\n }\n\n private fetchSse(kind: RunKind, payload: FetchSsePayload, options?: FetchSseOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n this.isConnecting$.next(true);\n this.runStatusSubject.next({ kind, stopPhase: 'idle' });\n this.currentRun = this.client.fetchSse(payload, this.buildRunHandlers(options, resolve, reject));\n });\n }\n\n /**\n * Join-restore transport (F-015): replay the server transcript via GET `rejoinSse` (F-014) and, if a\n * run is still live, keep listening until its terminal — holding `isConnecting` the whole time so the\n * input stays gated (F-003). A client without GET-replay support settles immediately (nothing to\n * restore), so the input is released rather than stuck.\n */\n private rejoinChannel(options?: FetchSseOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.client.rejoinSse) {\n resolve();\n\n return;\n }\n\n this.isConnecting$.next(true);\n // Never stoppable either way — a rejoin is not a turn the user just dispatched (F-023 AC8). But\n // the two cases must not look alike on screen (AC9 / UC-046): `restore` is tailing a run the\n // server says is still RUNNING, whereas `replay` is only loading a finished conversation and must\n // not show a run-in-progress indicator.\n this.runStatusSubject.next({\n kind: this.joinRunState === 'RUNNING' ? 'restore' : 'replay',\n stopPhase: 'idle',\n });\n this.currentRun = this.client.rejoinSse(this.customChannelId, this.buildRunHandlers(options, resolve, reject));\n });\n }\n\n /**\n * The opening turn (F-032): a plain `action=NONE` with the caller's text / payload (empty text when\n * they gave none). On a channel that does not exist the backend creates it and runs the welcome; on\n * one just emptied by `deleteChannel` it starts the new conversation.\n */\n private openChannel(payload?: Pick<FetchSsePayload, 'text' | 'payload'>, options?: FetchSseOptions): Promise<void> {\n return this.fetchSse(\n 'reset',\n {\n action: FetchSseAction.NONE,\n customChannelId: this.customChannelId,\n customMessageId: this.customMessageId,\n text: payload?.text || '',\n payload: this.resolvePayload(payload?.payload),\n },\n options,\n );\n }\n\n public sendMessage(\n payload: Pick<FetchSsePayload, 'customMessageId' | 'text' | 'payload' | 'blobIds'> & {\n filePreviewUrls?: string[];\n documentNames?: string[];\n },\n options?: FetchSseOptions,\n ): Promise<void> {\n // F-023 AC6 / UC-045 — a channel may only ever hold one run. Runs execute in the background on the\n // server, so dispatching a second would leave two of them writing to the same transcript. Refuse\n // *before* the optimistic user bubble is pushed, so a rejected send leaves no trace in the thread.\n //\n // A rejected promise, not a synchronous throw: this method's contract is `Promise<void>`, and\n // fire-and-forget callers (`sendMessage(...)` inside a DOM handler) must not have it explode\n // underneath them.\n const busyWith = this.runStatusSubject.value.kind;\n\n if (busyWith) return Promise.reject(new ChannelBusyError(busyWith));\n\n // #404 — the same rule for a case the run-kind check cannot see. A channel parked on a consent\n // prompt is paused on the server and only `RESPONSE_TOOL_CALL_CONSENT` resumes it; a plain turn\n // comes back rejected (\"use RespondToolCallConsent\"). The pause is invisible above because the\n // consent frame precedes the run terminal — by the time the prompt is on screen the run has already\n // settled and `kind` is undefined. Refuse before the optimistic bubble, same as the busy guard.\n const pendingConsent = this.conversation$.value.pendingConsent;\n\n if (pendingConsent) return Promise.reject(new ChannelAwaitingConsentError(pendingConsent.processId));\n\n // F-028 — the prediction was about what to say after the previous turn, so sending expires it\n // whether or not it was adopted. Cleared here rather than in the composer so programmatic sends\n // expire it too; after the guards above, so a refused send leaves the offer standing.\n this.clearPromptSuggestion();\n\n const text = payload.text.trim();\n const messageId = payload.customMessageId ?? uuidv4();\n\n this.currentUserMessageId = messageId;\n this.lastSentMessageId = messageId;\n\n this.conversation$.next(\n this.conversation$.value.pushMessage({\n type: 'user',\n messageId,\n text,\n blobIds: payload.blobIds,\n filePreviewUrls: payload.filePreviewUrls,\n documentNames: payload.documentNames,\n time: new Date(),\n }),\n );\n\n return this.fetchSse(\n 'user',\n {\n action: FetchSseAction.NONE,\n customChannelId: this.customChannelId,\n customMessageId: messageId,\n payload: this.resolvePayload(payload?.payload),\n text,\n blobIds: payload?.blobIds,\n },\n options,\n );\n }\n\n /**\n * Rate one assistant reply Good or Bad (F-033 / UC-055, UC-056, UC-059). Posts the verdict, and only\n * once the server has accepted it writes the rating into that reply's `feedback` — the SDK holds no\n * open stream between runs, so the live `asgard.message.feedback` echo of its own post would never\n * arrive; the next rejoin replays it from the transcript instead. A rejection leaves the conversation\n * untouched (no optimistic update, UC-059 Alt B), so the caller can show the error and let the user try\n * again with the same comment.\n *\n * Rating is **not** telling the agent: when the user also wants that, the caller sends an ordinary\n * message composed by `composeFeedbackMessage()` through `sendMessage` after this resolves (UC-057).\n */\n public async sendMessageFeedback(messageId: string, feedback: MessageFeedbackState): Promise<MessageFeedbackReply> {\n if (!this.client.sendMessageFeedback) {\n throw new Error(\n 'This client cannot rate a reply: IAsgardServiceClient.sendMessageFeedback is not implemented. ' +\n 'Implement it (POST {base}/message/feedback) or use AsgardServiceClient.',\n );\n }\n\n const reply = await this.client.sendMessageFeedback({\n customChannelId: this.customChannelId,\n messageId,\n verdict: feedback.verdict,\n comment: feedback.comment,\n });\n\n const comment = feedback.comment?.trim();\n this.conversation$.next(\n this.conversation$.value.applyFeedback(messageId, {\n verdict: feedback.verdict,\n ...(comment ? { comment } : {}),\n }),\n );\n\n return reply;\n }\n\n public replyToolCallConsents(\n toolCallConsents: ToolCallConsentAnswer[],\n options?: FetchSseOptions,\n payload?: FetchSsePayload['payload'],\n ): Promise<void> {\n // Cleared optimistically so the modal closes the moment the user answers, rather than lingering\n // while the reply is in flight. Kept so it can be put back if the reply never lands (#410).\n const answered = this.conversation$.value.pendingConsent;\n\n this.conversation$.next(this.conversation$.value.clearPendingConsent());\n\n // `user` — answering a consent prompt resumes the user's own turn, so it stays stoppable (F-023 AC8).\n return this.fetchSse(\n 'user',\n {\n action: FetchSseAction.RESPONSE_TOOL_CALL_CONSENT,\n customChannelId: this.customChannelId,\n customMessageId: this.lastSentMessageId ?? this.customMessageId,\n payload: this.resolvePayload(payload),\n text: '',\n toolCallConsents,\n },\n options,\n ).catch((error: unknown) => {\n // #410 — the server is still paused, so leaving the prompt cleared would disarm the send/nudge\n // guards and let the next turn hit the backend rejection they exist to prevent. Put it back: the\n // modal returns and the user can answer again.\n if (answered) {\n this.conversation$.next(this.conversation$.value.restorePendingConsent(answered));\n }\n\n throw error;\n });\n }\n\n /**\n * Nudge an idle / recycled sandbox back to life (F-021 AC4). Sends an `action=NUDGE` turn with empty\n * text — the backend suppresses `message.*` and writes no transcript, so nothing renders in the\n * conversation; the FE simply waits for the resulting `sandbox.launch`/`ready` frames (and a metadata\n * refetch) to refill `launchedSandboxes$`. An invisible turn, unlike `sendMessage`.\n *\n * Invisible, but still a real turn — so it needs `payload` exactly like the other three outbounds\n * (BUG-004). The backend rebuilds `prevPayload` from *this* turn's incoming payload and never carries\n * the previous turn's over, and the sandbox blueprint reads its subagents / source-set mounts /\n * working directory straight out of it. Omitting payload therefore wakes an empty sandbox rather than\n * the one the channel was working in, and every one of those expressions has a falsy fallback, so it\n * fails silently.\n *\n * @param payload Turn-level payload, resolved through the same path as `sendMessage` — pass a\n * function to compute it at send time. In `@asgard-js/react` this is filled in automatically from\n * `onBeforeSendMessage`.\n *\n * Rejects with `ChannelBusyError` when a run already holds the channel, and with\n * `ChannelAwaitingConsentError` while a consent prompt is pending — exactly like `sendMessage`.\n */\n public nudge(options?: FetchSseOptions, payload?: FetchSsePayload['payload']): Promise<void> {\n // F-023 AC6 / UC-045 — one run per channel. Invisible or not, a nudge is a turn, so it queues\n // behind whatever is running instead of displacing it. Without this the damage went past a\n // duplicate run: `fetchSse` replaces `currentRun` without unsubscribing the old one and stamps\n // `runStatus.kind` with `nudge`, and a stop control is only offered while that is `user` — so the\n // user's own turn quietly lost its stop button and could never be stopped again.\n const busyWith = this.runStatusSubject.value.kind;\n\n if (busyWith) return Promise.reject(new ChannelBusyError(busyWith));\n\n // #406 — a nudge is dispatched down the same `PostUserMessage` path as a plain turn (the backend\n // hardcodes `IsTrigger: false` there; `IsNudge` is a separate field), so a channel paused on a\n // consent prompt rejects it exactly like a message. Same guard as `sendMessage`, for the same\n // reason the busy check above cannot catch it: the consent frame precedes the run terminal.\n const pendingConsent = this.conversation$.value.pendingConsent;\n\n if (pendingConsent) return Promise.reject(new ChannelAwaitingConsentError(pendingConsent.processId));\n\n // `nudge` — invisible to the user, so it must never surface a stop control (F-023 AC8).\n return this.fetchSse(\n 'nudge',\n {\n action: FetchSseAction.NUDGE,\n customChannelId: this.customChannelId,\n customMessageId: this.lastSentMessageId ?? this.customMessageId,\n payload: this.resolvePayload(payload),\n text: '',\n },\n options,\n );\n }\n\n /**\n * User-initiated stop-generation (F-023).\n *\n * Runs execute in the **background on the server**, so aborting the local SSE connection would only\n * stop *watching*: the agent would keep running, keep spending tokens and keep writing the\n * transcript. Instead this asks the backend to suspend the run and **keeps the stream open**, because\n * the stop is declared by that stream's terminal event — the same event a normal run ends with.\n *\n * The call is therefore asynchronous in two stages:\n * 1. resolving here means the backend **accepted** the request, not that the run has stopped;\n * 2. `isConnecting` / `runStatus` only return to idle when the terminal event arrives (AC3).\n *\n * While waiting, `runStatus.stopPhase` is `stopping` and every send entrance must stay gated (AC5).\n * If the terminal event has not arrived within {@link FORCE_STOP_TIMEOUT_MS} the phase becomes\n * `force-stoppable`, and calling again with `{ force: true }` tells the backend to give up on the run\n * rather than let it wind down (AC7).\n *\n * No-ops (resolving) when nothing is running, when the run is not the user's own — an opening\n * welcome, a transcript replay or an invisible nudge must never be stopped (AC8) — or when a stop is\n * already pending and this is not a force.\n *\n * **Rejects** when the suspend request fails (network error, or a non-2xx that is not `404`). The\n * stop phase is rolled back to `idle` first, so the caller can retry and the UI can never be stuck in\n * `stopping` (AC4).\n *\n * A client that predates the suspend endpoint (a custom `IAsgardServiceClient`) falls back to the old\n * local-abort behavior, so existing integrations keep working.\n */\n public async stopGeneration(options?: StopGenerationOptions): Promise<void> {\n const status = this.runStatusSubject.value;\n\n if (!this.currentRun || status.kind !== 'user') return;\n\n // A second press while stopping does nothing; only an explicit force re-issues the request (AC2).\n if (status.stopPhase !== 'idle' && !options?.force) return;\n\n if (!this.client.suspendChannel) {\n this.abortConnection();\n\n return;\n }\n\n this.clearForceStopTimer();\n this.runStatusSubject.next({ ...status, stopPhase: 'stopping' });\n\n try {\n await this.client.suspendChannel(this.customChannelId, {\n requestId: status.requestId,\n force: options?.force,\n });\n } catch (error) {\n // AC4 — never strand the UI in `stopping`; hand the stop control back so the user can retry.\n this.clearForceStopTimer();\n this.runStatusSubject.next({ ...this.runStatusSubject.value, stopPhase: 'idle' });\n\n throw error;\n }\n\n // Accepted. The stream stays connected; `settleRun()` releases the input when the terminal arrives.\n this.armForceStopTimer();\n }\n\n /**\n * Escalate to `force-stoppable` once an accepted stop has waited too long for the terminal event\n * (F-023 AC7 / UC-044) — the escape hatch for an agent that never winds down. Re-armed on a force\n * retry, so a second timeout offers the same way out again.\n */\n private armForceStopTimer(): void {\n this.clearForceStopTimer();\n\n this.forceStopTimer = setTimeout(() => {\n this.forceStopTimer = undefined;\n\n const current = this.runStatusSubject.value;\n\n if (current.stopPhase !== 'stopping') return;\n\n this.runStatusSubject.next({ ...current, stopPhase: 'force-stoppable' });\n }, FORCE_STOP_TIMEOUT_MS);\n }\n\n /**\n * Cut the local SSE connection without telling the backend. This is *not* stop-generation (see\n * {@link stopGeneration}) — the server-side run keeps going. Used when there is nothing to stop\n * remotely: a client without suspend support, and channel teardown.\n *\n * The deliberate abort must never be read as a transport failure — `create-sse-observable` marks the\n * stream disposed so no reconnect is attempted (F-023 AC10).\n */\n private abortConnection(): void {\n if (!this.currentRun) return;\n\n this.currentRun.unsubscribe();\n this.clearForceStopTimer();\n this.currentRun = undefined;\n this.isConnecting$.next(false);\n this.runStatusSubject.next(IDLE_RUN_STATUS);\n this.currentUserMessageId = undefined;\n // F-020 AC10: settle whatever is still in flight — no closing frame will arrive now that the run is\n // aborted, so a tool-call must not linger as `running` nor a thinking block as \"Thinking…\".\n this.conversation$.next(this.conversation$.value.settleInFlightMessages());\n }\n\n public close(): void {\n this.currentRun?.unsubscribe();\n this.currentRun = undefined;\n this.clearForceStopTimer();\n this.isConnecting$.complete();\n this.runStatusSubject.complete();\n this.conversation$.complete();\n this.channelTitleSubject.complete();\n this.sandboxPhaseSubject.complete();\n this.launchedSandboxesSubject.complete();\n this.derivedStores.teardown();\n this.statesSubscription?.unsubscribe();\n }\n}\n","import { FeedbackVerdict } from '../types';\n\n/**\n * The opening line of the optional follow-up a client sends into the conversation when the user asks\n * to \"send to AI as well\" (F-033 / UC-057). **Platform contract, byte for byte**: asgard-core's system\n * prompt (`ResponseFeedbackNote`) recognises exactly these strings and teaches the agent to treat the\n * message as an interlude about its previous reply — acknowledge briefly, adjust if the verdict was\n * Bad, then continue the conversation. Mirrors asgard-core `ResponseFeedbackPrefixGood/Bad` and\n * asgard-sdk-go's constants of the same name.\n */\nexport const RESPONSE_FEEDBACK_PREFIX: Readonly<Record<FeedbackVerdict, string>> = {\n GOOD: '[Response Feedback: Good]',\n BAD: '[Response Feedback: Bad]',\n};\n\n/**\n * The backend's cap on a feedback comment (F-033): 8 KiB of **UTF-8**, not 8 192 characters. A CJK\n * character is three bytes, so a length check in characters would let a comment through that the server\n * then rejects with `400`. Measure with {@link feedbackCommentByteLength}.\n */\nexport const FEEDBACK_COMMENT_MAX_BYTES = 8 * 1024;\n\n/** UTF-8 byte length of a comment — the unit the backend's 8 KiB cap is measured in. */\nexport function feedbackCommentByteLength(comment: string): number {\n return new TextEncoder().encode(comment).length;\n}\n\n/**\n * Compose the follow-up message for \"send to AI as well\" (F-033 / UC-057): the verdict's prefix, then —\n * only when the user wrote something — a blank line and the comment verbatim (trimmed). This is an\n * ordinary message: send it through the normal `sendMessage` path, **after** the structured verdict has\n * been posted and only if that succeeded. Rating and telling the agent are two separate acts.\n */\nexport function composeFeedbackMessage(verdict: FeedbackVerdict, comment?: string): string {\n const prefix = RESPONSE_FEEDBACK_PREFIX[verdict];\n const body = comment?.trim() ?? '';\n\n return body ? `${prefix}\\n\\n${body}` : prefix;\n}\n","// F-020 / F-034 — the typed intent a `sandbox://` custom URI resolves to. The host runs the side effect from this\n// (open-browser → one-time browser URL; open-file → File Explorer preview; open-folder → expand that directory on\n// the tree); it is never a browsable URL.\n//\n// `open-file` and `open-folder` are two separate actions rather than one action with a flag, because their\n// destinations are not interchangeable: a file goes into the viewer (read + watch), a folder only unfolds the tree.\n// The backend's fs API refuses both calls for a directory (`fs/file` → 500 `path is a directory`, `fs/watch` → a\n// dead connection), so a file card pointing at a directory cannot succeed — which is exactly what an agent holding\n// only `open_sandbox_file` used to do after unzipping an archive.\nexport type SandboxUriIntent =\n | { kind: 'open-browser'; sandboxName: string }\n | { kind: 'open-file'; sandboxName: string; absolutePath: string }\n | { kind: 'open-folder'; sandboxName: string; absolutePath: string };\n\n/** The actions that carry an `absolute_path` — parsed by one shared rule so the two can never drift apart. */\nconst PATH_ACTIONS = ['open-file', 'open-folder'] as const;\n\ntype PathAction = (typeof PATH_ACTIONS)[number];\n\nfunction isPathAction(action: string): action is PathAction {\n return (PATH_ACTIONS as readonly string[]).includes(action);\n}\n\n/**\n * Parse `sandbox://<name>/<action>?<query>` into a typed {@link SandboxUriIntent} (F-020 / F-034, UC-036).\n * Returns `null` for an unknown action, a missing `absolute_path`, or a non-`sandbox://` / malformed URI —\n * the host must then treat it as a plain card and never `window.open()` the raw scheme.\n *\n * A hand-written regex (not `new URL()`) is used deliberately: absolute paths carry many `/`, and a\n * non-special scheme's host casing is unreliable under the WHATWG URL parser; the query is still handed to\n * `URLSearchParams` (which decodes).\n */\nexport function resolveSandboxUri(uri: string): SandboxUriIntent | null {\n const match = /^sandbox:\\/\\/([^/]+)\\/([^?#]+)(?:\\?([^#]*))?/.exec(uri.trim());\n if (!match) return null;\n\n const sandboxName = decodeURIComponent(match[1]);\n const action = match[2];\n const params = new URLSearchParams(match[3] ?? '');\n\n if (action === 'open-browser') return { kind: 'open-browser', sandboxName };\n\n if (isPathAction(action)) {\n const absolutePath = params.get('absolute_path'); // URLSearchParams already decodes\n if (!absolutePath) return null;\n\n return { kind: action, sandboxName, absolutePath };\n }\n\n return null; // unknown action: do not guess, hand back to the host\n}\n","// F-035 — X11 keysym conversion and wheel normalization for the sandbox browser (spec §7.2 / §7.3 / §7.6).\n//\n// Everything here is pure arithmetic over numbers and plain objects, which is why it sits in core rather\n// than in the panel: an iOS / Android client needs exactly the same table and the same three rules.\n//\n// The reason this is its own module rather than a handful of inline constants: every mistake in it is\n// **silent**. A wrong keysym does not raise anything — the remote just does nothing, or types something\n// else, and there is no way to work backwards from that symptom. The values below are not derived from\n// documentation; they were measured against a real Neko container.\n\n/**\n * X11 keysyms for the keys that have no arithmetic rule — function keys, navigation, modifiers.\n *\n * Printable characters are **not** in here; they follow the two rules in `charToKeysym`. F5 and F12 are\n * listed because driving a remote browser genuinely uses them.\n */\nexport const KEYSYM: Readonly<Record<string, number>> = {\n Backspace: 0xff08,\n Tab: 0xff09,\n Enter: 0xff0d,\n Escape: 0xff1b,\n Delete: 0xffff,\n Home: 0xff50,\n ArrowLeft: 0xff51,\n ArrowUp: 0xff52,\n ArrowRight: 0xff53,\n ArrowDown: 0xff54,\n PageUp: 0xff55,\n PageDown: 0xff56,\n End: 0xff57,\n Insert: 0xff63,\n F1: 0xffbe,\n F2: 0xffbf,\n F3: 0xffc0,\n F4: 0xffc1,\n F5: 0xffc2,\n F6: 0xffc3,\n F7: 0xffc4,\n F8: 0xffc5,\n F9: 0xffc6,\n F10: 0xffc7,\n F11: 0xffc8,\n F12: 0xffc9,\n Shift: 0xffe1,\n Control: 0xffe3,\n CapsLock: 0xffe5,\n Alt: 0xffe9,\n Meta: 0xffeb,\n ContextMenu: 0xff67,\n ' ': 0x0020,\n} as const;\n\n/** The modifier keysyms the macOS remap reads and writes. Named so the mapping below is legible. */\nexport const XK = {\n ISO_Level3_Shift: 0xfe03,\n Shift_L: 0xffe1,\n Mode_switch: 0xff7e,\n Control_L: 0xffe3,\n Meta_L: 0xffe7,\n Alt_L: 0xffe9,\n Alt_R: 0xffea,\n Super_L: 0xffeb,\n Super_R: 0xffec,\n} as const;\n\n/** Unicode keysyms start here: a code point above 0xFF is offset into this block. */\nconst UNICODE_KEYSYM_OFFSET = 0x01000000;\n\n/**\n * One character → one keysym. Two rules, no table:\n *\n * 1. At or below `0xFF`, the keysym *is* the code point (ASCII and Latin-1 line up by design).\n * 2. Above it, `codePoint | 0x01000000`.\n *\n * Rule 2 is why **the remote needs no input method installed**: its `XKey()` hands an unknown keysym to\n * `XkbAddKeyKeysym`, which allocates an empty keycode for it on the spot. Whether the character exists in\n * the remote keyboard layout is simply not a question that gets asked.\n */\nexport function charToKeysym(character: string): number {\n const codePoint = character.codePointAt(0) ?? 0;\n\n return codePoint > 0xff ? codePoint | UNICODE_KEYSYM_OFFSET : codePoint;\n}\n\n/**\n * A `KeyboardEvent.key` value → keysym, or `null` when there is no answer.\n *\n * Returning `null` rather than a fallback is deliberate: a guessed keysym is indistinguishable from a\n * correct one until the remote does the wrong thing. Callers should surface the unmapped key (the lab page\n * lists them) instead of sending something plausible.\n */\nexport function keyToKeysym(key: string): number | null {\n if (key in KEYSYM) return KEYSYM[key];\n\n // `key.length === 1` is a UTF-16 unit test, so it deliberately excludes astral characters; those arrive\n // through the IME text path, not as a single `keydown`.\n if (key.length === 1) return charToKeysym(key);\n\n return null;\n}\n\n/**\n * Whether a keysym denotes something that turns into text.\n *\n * The distinction drives routing, not display: printable characters must travel the IME text path (it is\n * the only one that can handle composition), while the keysym path carries modifiers and function keys.\n */\nexport function isPrintableKeysym(keysym: number): boolean {\n return (keysym >= 0x20 && keysym <= 0x7e) || keysym >= UNICODE_KEYSYM_OFFSET;\n}\n\n/** Whether this platform's keyboard needs the macOS modifier remap. Read lazily so core stays SSR-safe. */\nfunction isMacOSKeyboard(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n // `navigator.platform` is deprecated but remains the only reliable signal here: `userAgentData.platform`\n // is not available in Safari or Firefox, which is exactly where this has to be right.\n const platform = navigator.platform || '';\n\n return /(Mac|iPhone|iPod|iPad)/i.test(platform);\n}\n\n/**\n * Remap a modifier keysym for the remote's X11 expectations. Identity on every non-macOS platform.\n *\n * The one that matters is **⌘ (`Meta_L`) → `Control_L`**: without it, ⌘A and ⌘C do nothing at all on the\n * remote, because the Chromium over there is waiting for Ctrl. The full table is copied from the upstream\n * neko client, which in turn credits noVNC / RealVNC / TigerVNC — it is what this class of client does, not\n * a preference.\n */\nexport function mapModifierKeysym(keysym: number, macOS: boolean = isMacOSKeyboard()): number {\n if (!macOS) return keysym;\n\n switch (keysym) {\n case XK.Meta_L:\n return XK.Control_L;\n case XK.Super_L:\n return XK.Alt_L;\n case XK.Super_R:\n return XK.Super_L;\n case XK.Alt_L:\n return XK.Mode_switch;\n case XK.Alt_R:\n return XK.ISO_Level3_Shift;\n default:\n return keysym;\n }\n}\n\n/**\n * Firefox reports the wheel in lines (`deltaMode === 1`) where Chrome reports pixels. The same flick is\n * `100` in one and `3` in the other — a factor of thirty. 19 px per line is the upstream neko value.\n */\nconst WHEEL_LINE_HEIGHT = 19;\n\n/**\n * Ceiling on how many X11 scroll clicks one wheel event may become.\n *\n * **Not a sensitivity tuning knob.** The server loops `for (i < abs(delta))` and emits one XTest event per\n * iteration, so forwarding Chrome's `deltaY = 100` verbatim tells the remote to scroll one hundred times.\n * 10 is the upstream default.\n */\nexport const WHEEL_MAX = 10;\n\n/** Upstream's wheel throttle window, in milliseconds. Exported so the panel throttles to the same figure. */\nexport const WHEEL_THROTTLE_MS = 100;\n\n/** The parts of a `WheelEvent` this conversion needs. Structural, so core never names a DOM type. */\nexport interface WheelDelta {\n deltaX: number;\n deltaY: number;\n /** 0 = pixels, 1 = lines, 2 = pages. */\n deltaMode: number;\n}\n\n/**\n * Browser wheel deltas → remote scroll deltas.\n *\n * **The sign flips.** A browser's `deltaY > 0` means \"content moves down\"; X11's positive direction is\n * button 4, which is *up*. The two conventions are opposites. Upstream neko exposes this as a\n * `scroll_invert` *setting*, which makes it look like taste — but its default is `true`, i.e. everybody is\n * running the inverted value, because the un-inverted one is simply wrong.\n */\nexport function normalizeWheel(event: WheelDelta): { x: number; y: number } {\n const scale = event.deltaMode === 0 ? 1 : WHEEL_LINE_HEIGHT;\n // `|| 0` collapses the `-0` that negating a zero delta produces. It makes no difference on the wire\n // (JSON renders both as `0`), but it keeps the output canonical so equality checks mean what they look like.\n const clamp = (value: number): number => Math.max(-WHEEL_MAX, Math.min(WHEEL_MAX, -value * scale)) || 0;\n\n return { x: clamp(event.deltaX), y: clamp(event.deltaY) };\n}\n","// F-035 — the Neko protocol client (spec §5 / §6 / §7). Framework-agnostic: one WebSocket, one\n// RTCPeerConnection, one set of X11 input messages. Nothing here touches the DOM.\n//\n// The protocol has three properties that contradict what a WebRTC example would lead you to write, and all\n// three fail silently:\n//\n// 1. **The server is the offerer.** We receive `signal/provide` and answer it. Most examples are the\n// other way round.\n// 2. **`signal/candidate` arrives before `signal/provide`.** Candidates that show up before the peer\n// connection exists must be buffered and flushed after `setRemoteDescription`. This is not an\n// optimization — drop them and the connection never establishes, with no error anywhere.\n// 3. **A refused `control/request` produces no reply.** The server writes its own log and says nothing\n// to us. So the caller has to time out on its own, and must never send a control message it does not\n// already believe it is entitled to send — every one of those is rejected and floods the server log.\n//\n// Reference: the prototype's lab transport, asgard-core `dev/webrtc-probe/client.html`, and neko upstream\n// `server/pkg/types/event/events.go`.\nimport type {\n BrowserHost,\n RemoteKeyEvent,\n RemotePointerEvent,\n SandboxBrowserSession,\n SandboxBrowserSessionCredentials,\n SandboxBrowserTransport,\n SandboxBrowserTransportHandlers,\n} from '../types/sandbox-browser';\nimport { charToKeysym, XK } from './keysym';\n\n/**\n * Uppercase ASCII letters are the one class of character the text path cannot send as a bare keysym.\n *\n * Measured against a real container: `A` arrives as `a`. `XKeysymToKeycode(XK_A)` finds the *same* keycode\n * as `a` — `A` is that key's shifted level — and the server presses it without asserting Shift. Shifted\n * symbols (`!`, `@`, `+`) are unaffected: no existing keycode produces them at level 1, so the server\n * allocates a fresh mapping and they come through exactly. CJK is unaffected for the same reason.\n *\n * So the remedy is narrow and does not need a keyboard-layout model: state the modifier for A–Z.\n */\nfunction needsShift(keysym: number): boolean {\n return keysym >= 0x41 && keysym <= 0x5a;\n}\n\n/** How often to tell the server we are still here. Upstream's interval. */\nconst HEARTBEAT_INTERVAL_MS = 10_000;\n\n/** How long to wait for the socket to open before giving up. */\nconst OPEN_TIMEOUT_MS = 8_000;\n\n/**\n * Cursor position opcode on the binary data channel\n * (neko `server/internal/webrtc/payload/send.go`).\n */\nconst OP_CURSOR_POSITION = 0x01;\n\n/** `[event:u8][length:u16][X:u16][Y:u16]`, big-endian — the length field counts the header, so 7. */\nconst CURSOR_FRAME_BYTES = 7;\n\n/** Volume-only exclusion: `control/move` would drown out every other line in a diagnostic log. */\nconst WIRE_LOG_EXCLUDED = new Set(['control/move']);\n\n/** One `{event, payload}` frame as it travels the socket. */\ninterface NekoMessage {\n event: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * Decode one data-channel frame into a cursor position, or `null` if it is not one.\n *\n * Exported for its own unit test: the frame layout is three big-endian reads at fixed offsets, and getting\n * one offset wrong puts the remote cursor somewhere plausible but wrong — which looks like a rendering bug,\n * not a decoding one.\n */\nexport function decodeCursorFrame(data: ArrayBuffer): { x: number; y: number } | null {\n if (data.byteLength < CURSOR_FRAME_BYTES) return null;\n\n const view = new DataView(data);\n if (view.getUint8(0) !== OP_CURSOR_POSITION) return null;\n\n return { x: view.getUint16(3), y: view.getUint16(5) };\n}\n\n/** How the transport obtains `{ wsUrl, token }`. Injected so the lab can swap in a direct Neko login. */\nexport type SandboxBrowserCredentialSource = (sandboxName: string) => Promise<SandboxBrowserSessionCredentials>;\n\nexport interface SandboxBrowserTransportOptions {\n /** Mints connection credentials — normally `client.createSandboxBrowserSession.bind(client)`. */\n createSession: SandboxBrowserCredentialSource;\n /** Display name announced in `signal/answer`. Cosmetic; shows up in Neko's member list. */\n displayName?: string;\n}\n\n/**\n * Build a transport over the Neko protocol.\n *\n * Credentials are fetched per `connect()` call rather than cached, which is what makes reconnection\n * correct: the token has no TTL but lives in the server's memory, so a pod restart invalidates it, and\n * retrying with the old one fails in a way that looks like a network problem (spec §7.10).\n */\nexport function createSandboxBrowserTransport(options: SandboxBrowserTransportOptions): SandboxBrowserTransport {\n return {\n async connect(sandboxName: string, handlers: SandboxBrowserTransportHandlers): Promise<SandboxBrowserSession> {\n handlers.onStatus('connecting');\n\n const { wsUrl, token } = await options.createSession(sandboxName);\n\n const separator = wsUrl.includes('?') ? '&' : '?';\n const socket = new WebSocket(`${wsUrl}${separator}token=${encodeURIComponent(token)}`);\n\n let peer: RTCPeerConnection | null = null;\n let sessionId: string | null = null;\n let host: BrowserHost = 'none';\n let heartbeat: ReturnType<typeof setInterval> | undefined;\n let closed = false;\n /** Id of the stream already handed to the caller — `ontrack` fires per track, not per stream. */\n let announcedStreamId: string | null = null;\n\n /** Candidates that arrived before the peer connection existed (see the header, point 2). */\n const pendingCandidates: RTCIceCandidateInit[] = [];\n\n const send = (event: string, payload?: Record<string, unknown>): void => {\n if (socket.readyState !== WebSocket.OPEN) return;\n\n socket.send(JSON.stringify({ event, payload }));\n if (!WIRE_LOG_EXCLUDED.has(event)) handlers.onWire?.('send', event, payload);\n };\n\n /**\n * Control-gated send. Spec §6: without control every one of these is refused *and* logged by the\n * server, so the gate belongs here rather than only in the UI — a panel bug should not be able to\n * flood somebody else's log.\n */\n const sendControlled = (event: string, payload?: Record<string, unknown>): void => {\n if (host !== 'me') return;\n\n send(event, payload);\n };\n\n const setHost = (next: BrowserHost): void => {\n if (host === next) return;\n\n host = next;\n handlers.onHostChange(next);\n };\n\n try {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error('Sandbox browser WebSocket connection timed out.')),\n OPEN_TIMEOUT_MS,\n );\n socket.onopen = (): void => {\n clearTimeout(timer);\n resolve();\n };\n\n socket.onerror = (): void => {\n clearTimeout(timer);\n reject(new Error('Sandbox browser WebSocket failed to connect.'));\n };\n });\n } catch (error) {\n // Close what we opened before giving up. `connect()` rejecting hands the caller no session, so\n // this socket has no other owner — left alone it stays pending, or connects moments later and\n // lives for the rest of the page, and the retry path stacks another one on top every attempt.\n closed = true;\n socket.close();\n\n throw error;\n }\n\n socket.onclose = (event: CloseEvent): void => {\n // A close we asked for is not a failure. Without this guard, every teardown reports an error and\n // the panel offers to reconnect to something the caller deliberately ended.\n if (closed) return;\n\n handlers.onStatus('error', `Sandbox browser connection closed (code ${event.code}).`);\n handlers.onWire?.('recv', 'ws/close', { code: event.code });\n };\n\n const handleProvide = async (payload: Record<string, unknown>): Promise<void> => {\n const connection = new RTCPeerConnection({\n // Use the server's ICE configuration verbatim. The platform injects the pod's TURN URLs and\n // time-limited credentials, and they arrive here untouched — the client never needs to know how\n // the media gateway is deployed, and must not carry its own.\n iceServers: (payload.iceservers as RTCIceServer[] | undefined) ?? [],\n });\n peer = connection;\n\n connection.onicecandidate = (event: RTCPeerConnectionIceEvent): void => {\n if (event.candidate) send('signal/candidate', event.candidate.toJSON() as Record<string, unknown>);\n };\n\n connection.oniceconnectionstatechange = (): void => {\n handlers.onWire?.('recv', 'ice/state', connection.iceConnectionState);\n if (connection.iceConnectionState === 'failed') {\n handlers.onStatus('error', 'ICE connection failed.');\n }\n };\n\n connection.ontrack = (event: RTCTrackEvent): void => {\n const [stream] = event.streams;\n if (!stream) return;\n\n // `ontrack` fires **once per track**, and the offer carries both audio and video — measured\n // against a real container, where this ran twice for one stream. Reporting twice would have the\n // panel reassign `srcObject` to a stream it is already playing, which restarts playback. Only a\n // genuinely different stream is worth announcing.\n if (announcedStreamId === stream.id) return;\n\n announcedStreamId = stream.id;\n\n handlers.onStream(stream);\n handlers.onStatus('live');\n };\n\n connection.ondatachannel = (event: RTCDataChannelEvent): void => {\n const channel = event.channel;\n channel.binaryType = 'arraybuffer';\n channel.onmessage = (message: MessageEvent): void => {\n if (!(message.data instanceof ArrayBuffer)) return;\n\n const position = decodeCursorFrame(message.data);\n if (position) handlers.onRemoteCursor?.(position);\n };\n };\n\n await connection.setRemoteDescription({ type: 'offer', sdp: payload.sdp as string });\n\n // Flush only now: addIceCandidate before setRemoteDescription throws.\n for (const candidate of pendingCandidates.splice(0)) {\n await connection.addIceCandidate(candidate).catch(() => undefined);\n }\n\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n send('signal/answer', { sdp: answer.sdp, displayname: options.displayName ?? 'asgard-js-sdk' });\n };\n\n socket.onmessage = (event: MessageEvent): void => {\n let message: NekoMessage;\n try {\n message = JSON.parse(String(event.data)) as NekoMessage;\n } catch {\n return; // A frame we cannot parse is not a frame we can act on.\n }\n\n const payload = message.payload ?? {};\n if (message.event !== 'signal/candidate') handlers.onWire?.('recv', message.event, payload);\n\n switch (message.event) {\n case 'system/init': {\n sessionId = (payload.session_id as string | undefined) ?? null;\n // `system/init` already states who holds control, so the initial value comes from here rather\n // than waiting for a `control/host` that may not arrive until somebody changes it.\n const initialHost = (payload.control_host as Record<string, unknown> | undefined) ?? undefined;\n const initialHostId = (initialHost?.id as string | undefined) ?? undefined;\n if (initialHostId !== undefined) {\n setHost(!initialHostId ? 'none' : initialHostId === sessionId ? 'me' : 'agent');\n }\n\n return;\n }\n\n case 'control/host': {\n const hostId = (payload.host_id as string | undefined) ?? null;\n setHost(!hostId ? 'none' : hostId === sessionId ? 'me' : 'agent');\n\n return;\n }\n\n case 'clipboard/updated': {\n handlers.onClipboardChange?.((payload.text as string | undefined) ?? '');\n\n return;\n }\n\n case 'signal/provide':\n case 'signal/offer': {\n // The server can renegotiate on its own, so `signal/offer` runs the same path.\n void handleProvide(payload).catch((error: unknown) => {\n handlers.onStatus('error', error instanceof Error ? error.message : String(error));\n });\n\n return;\n }\n\n case 'signal/candidate': {\n const candidate = payload as RTCIceCandidateInit;\n if (peer?.remoteDescription) void peer.addIceCandidate(candidate).catch(() => undefined);\n else pendingCandidates.push(candidate);\n\n return;\n }\n\n default:\n return;\n }\n };\n\n send('signal/request', { video: {}, audio: {} });\n heartbeat = setInterval(() => send('client/heartbeat', {}), HEARTBEAT_INTERVAL_MS);\n\n return {\n requestControl(): void {\n // Not control-gated: this is the message you send *because* you do not have control.\n send('control/request', {});\n },\n releaseControl(): void {\n sendControlled('control/release', {});\n },\n sendPointer(event: RemotePointerEvent): void {\n const x = Math.round(event.x);\n const y = Math.round(event.y);\n\n if (event.type === 'move') {\n sendControlled('control/move', { x, y });\n\n return;\n }\n\n if (event.type === 'scroll') {\n sendControlled('control/scroll', {\n delta_x: Math.round(event.deltaX ?? 0),\n delta_y: Math.round(event.deltaY ?? 0),\n control_key: false,\n });\n\n return;\n }\n\n sendControlled(event.type === 'down' ? 'control/buttondown' : 'control/buttonup', {\n x,\n y,\n code: event.button ?? 1,\n });\n },\n sendKey(event: RemoteKeyEvent): void {\n if (event.type === 'text') {\n // `for...of` iterates code points, so an astral character stays one keysym instead of becoming\n // two meaningless surrogate halves.\n for (const character of event.text ?? '') {\n const keysym = charToKeysym(character);\n const shift = needsShift(keysym);\n\n if (shift) sendControlled('control/keydown', { keysym: XK.Shift_L });\n\n sendControlled('control/keydown', { keysym });\n sendControlled('control/keyup', { keysym });\n if (shift) sendControlled('control/keyup', { keysym: XK.Shift_L });\n }\n\n return;\n }\n\n // The keysym is the caller's: turning a KeyboardEvent into one is the panel's job (see the\n // module header of `types/sandbox-browser.ts`).\n if (typeof event.keysym !== 'number') return;\n\n sendControlled(event.type === 'down' ? 'control/keydown' : 'control/keyup', { keysym: event.keysym });\n },\n setClipboard(text: string): void {\n // The server requires both `CanAccessClipboard` and that the caller is the host; failing either\n // is silent, so the gate matters more here than it looks.\n sendControlled('clipboard/set', { text });\n },\n paste(text: string): void {\n sendControlled('control/paste', { text });\n },\n close(): void {\n closed = true;\n if (heartbeat) clearInterval(heartbeat);\n\n heartbeat = undefined;\n peer?.close();\n peer = null;\n socket.close();\n },\n };\n },\n };\n}\n"],"names":["HttpError","status","statusText","body","isHttpError","error","ChannelBusyError","runKind","isChannelBusyError","ChannelAwaitingConsentError","processId","isChannelAwaitingConsentError","FetchSseAction","EventType","ToolCallConsentResult","MessageTemplateType","getBytes","stream","onChunk","reader","result","getLines","onLine","buffer","position","fieldLength","discardTrailingNewline","arr","concat","bufLength","lineStart","lineEnd","getMessages","onId","onRetry","onMessage","message","newMessage","decoder","line","field","valueOffset","value","retry","a","b","res","__rest","s","e","t","p","i","EventStreamContentType","DefaultRetryInterval","LastEventId","fetchEventSource","input","_a","inputSignal","inputHeaders","inputOnOpen","onmessage","onclose","onerror","openWhenHidden","inputFetch","rest","resolve","reject","headers","curRequestController","onVisibilityChange","create","retryInterval","retryTimer","dispose","fetch","onopen","defaultOnOpen","response","id","err","interval","innerErr","contentType","extendStatics","d","__extends","__","__awaiter","thisArg","_arguments","P","generator","adopt","fulfilled","step","rejected","__generator","_","f","y","g","verb","n","v","op","__values","o","m","__read","ar","__spreadArray","to","from","pack","l","__await","__asyncGenerator","q","awaitReturn","resume","settle","r","fulfill","__asyncValues","isFunction","createErrorClass","createImpl","_super","instance","ctorFunc","UnsubscriptionError","errors","arrRemove","item","index","Subscription","initialTeardown","e_1","e_2","_b","_parentage","_parentage_1","_parentage_1_1","parent_1","e_1_1","initialFinalizer","_finalizers","_finalizers_1","_finalizers_1_1","finalizer","execFinalizer","e_2_1","teardown","parent","empty","EMPTY_SUBSCRIPTION","isSubscription","config","timeoutProvider","handler","timeout","args","_i","handle","reportUnhandledError","noop","errorContext","cb","Subscriber","destination","_this","EMPTY_OBSERVER","next","complete","SafeSubscriber","ConsumerObserver","partialObserver","handleUnhandledError","observerOrNext","defaultErrorHandler","observable","identity","x","pipeFromArray","fns","prev","fn","Observable","subscribe","operator","subscriber","isSubscriber","source","sink","promiseCtor","getPromiseCtor","Symbol_observable","operations","isObserver","hasLift","operate","init","liftedSource","createOperatorSubscriber","onNext","onComplete","onError","onFinalize","OperatorSubscriber","shouldUnsubscribe","closed_1","ObjectUnsubscribedError","Subject","subject","AnonymousSubject","_c","observer","observers","hasError","isStopped","thrownError","BehaviorSubject","_value","subscription","dateTimestampProvider","Action","scheduler","work","state","delay","intervalProvider","AsyncAction","_id","_scheduler","_delay","errored","errorValue","actions","Scheduler","schedulerActionCtor","now","AsyncScheduler","SchedulerAction","action","asyncScheduler","isScheduler","last","popResultSelector","popScheduler","isArrayLike","isPromise","isInteropObservable","isAsyncIterable","obj","createInvalidObservableTypeError","getSymbolIterator","iterator","isIterable","Symbol_iterator","readableStreamLikeToAsyncGenerator","readableStream","done","isReadableStreamLike","innerFrom","fromInteropObservable","fromArrayLike","fromPromise","fromAsyncIterable","fromIterable","fromReadableStreamLike","obs","array","promise","iterable","iterable_1","iterable_1_1","asyncIterable","process","asyncIterable_1","asyncIterable_1_1","executeSchedule","parentSubscription","repeat","scheduleSubscription","observeOn","subscribeOn","scheduleObservable","schedulePromise","scheduleArray","scheduleIterable","scheduleAsyncIterable","scheduleReadableStreamLike","scheduled","map","project","isArray","callOrApply","mapOneOrManyArgs","getPrototypeOf","objectProto","getKeys","argsArgArrayOrObject","first_1","isPOJO","keys","key","createObject","values","combineLatest","resultSelector","observables","combineLatestInit","valueTransform","maybeSchedule","length","active","remainingFirstValues","_loop_1","hasFirstValue","execute","filter","predicate","bufferTime","bufferTimeSpan","otherArgs","bufferCreationInterval","maxBufferSize","bufferRecords","restartOnEmit","emit","record","subs","startBuffer","record_1","bufferTimeSubscriber","recordsCopy","recordsCopy_1","recordsCopy_1_1","distinctUntilChanged","comparator","keySelector","defaultCompare","previousKey","first","currentKey","finalize","callback","takeUntil","notifier","createSseObservable","options","endpoint","apiKey","payload","debugMode","customHeaders","method","controller","currentTraceId","hasCursor","disposed","url","esm","data","EventEmitter","event","listener","DEFAULT_SSE_BATCH_WINDOW_MS","withChannelScope","scope","AsgardServiceClient","baseEndpoint","customChannelId","json","sandbox","request","comment","batch","file","blobEndpoint","formData","relativePath","query","blob","filename","sandboxName","openURL","wsUrl","token","path","content","totalBytesHeader","form","k","src","dst","SOURCE_SET_VOLUME_ROOT","INVALID_SEGMENTS","assertVolumePath","segment","SOURCE_SET_MAX_PAGE_SIZE","SOURCE_SET_DEFAULT_MAX_ENTRIES","clampPageSize","pageSize","AsgardSourceSetClient","signal","maxEntries","entries","total","page","paging","byteToHex","unsafeStringify","offset","getRandomValues","rnds8","rng","randomUUID","native","_v4","buf","rnds","v4","Conversation","messages","pendingConsent","pendingFeedback","changed","currentMessage","currentBot","feedback","remainingPending","targetMessageId","target","rated","thinking","currentThinking","canvas","currentCanvas","template","html","userMessage","messageId","uuidv4","toolCallStart","toolCallKey","toolCallMessage","toolCallComplete","existingMessage","updatedMessage","replayedMessage","consent","start","TASK_TOOLS","isTaskTool","call","asRecord","asString","reduceTaskEvents","events","order","byId","parameter","sidecar","task","statusChange","isAgentTool","isSubagentChildTool","parentToolUseId","reduceSubagents","meta","tools","ensure","tool","str","conversationToSubagentEvents","toolUseId","deriveTasks","conversation","deriveSubagents","tasksEqual","other","toolsEqual","subagentsEqual","subagent","createDerivedStores","conversation$","tasks$","subagents$","reconcileLaunched","metadata","byName","IDLE_RUN_STATUS","FORCE_STOP_TIMEOUT_MS","runStatusEqual","Channel","list","name","current","title","channel","onChannelCreated","isConnecting","tasks","subagents","channelTitle","promptSuggestion","sandboxPhase","launchedSandboxes","runStatus","eventType","wasStopping","requestId","kind","busyWith","text","reply","toolCallConsents","answered","RESPONSE_FEEDBACK_PREFIX","FEEDBACK_COMMENT_MAX_BYTES","feedbackCommentByteLength","composeFeedbackMessage","verdict","prefix","PATH_ACTIONS","isPathAction","resolveSandboxUri","uri","match","params","absolutePath","KEYSYM","XK","UNICODE_KEYSYM_OFFSET","charToKeysym","character","codePoint","keyToKeysym","isPrintableKeysym","keysym","isMacOSKeyboard","platform","mapModifierKeysym","macOS","WHEEL_LINE_HEIGHT","WHEEL_MAX","WHEEL_THROTTLE_MS","normalizeWheel","scale","clamp","needsShift","HEARTBEAT_INTERVAL_MS","OPEN_TIMEOUT_MS","OP_CURSOR_POSITION","CURSOR_FRAME_BYTES","WIRE_LOG_EXCLUDED","decodeCursorFrame","view","createSandboxBrowserTransport","handlers","separator","socket","peer","sessionId","host","heartbeat","closed","announcedStreamId","pendingCandidates","send","sendControlled","setHost","timer","handleProvide","connection","candidate","answer","initialHostId","hostId","shift"],"mappings":"AAAO,MAAMA,UAAkB,MAAM;AAAA,EACnB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA,EAKhB,YAAYC,GAAgBC,GAAoBC,GAAgB;AAC9D,UAAM,QAAQF,CAAM,KAAKC,CAAU,EAAE,GACrC,KAAK,OAAO,aACZ,KAAK,SAASD,GACd,KAAK,aAAaC,GAClB,KAAK,OAAOC;AAAA,EACd;AACF;AAEO,SAASC,GAAYC,GAAoC;AAC9D,SAAOA,aAAiBL;AAC1B;ACjBO,MAAMM,WAAyB,MAAM;AAAA;AAAA,EAE1B;AAAA,EAEhB,YAAYC,GAAkB;AAC5B,UAAM,kCAAkCA,CAAO,qCAAqC,GACpF,KAAK,OAAO,oBACZ,KAAK,UAAUA;AAAA,EACjB;AACF;AAEO,SAASC,GAAmBH,GAA2C;AAC5E,SAAOA,aAAiBC;AAC1B;ACbO,MAAMG,WAAoC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrC;AAAA,EAEhB,YAAYC,GAAmB;AAC7B,UAAM,mFAAmF,GACzF,KAAK,OAAO,+BACZ,KAAK,YAAYA;AAAA,EACnB;AACF;AAEO,SAASC,GAA8BN,GAAsD;AAClG,SAAOA,aAAiBI;AAC1B;AC7BO,IAAKG,sBAAAA,OAWVA,EAAA,gBAAgB,iBAChBA,EAAA,OAAO,QACPA,EAAA,6BAA6B,8BAC7BA,EAAA,QAAQ,SAdEA,IAAAA,KAAA,CAAA,CAAA,GAiBAC,sBAAAA,OACVA,EAAA,OAAO,mBACPA,EAAA,UAAU,kBACVA,EAAA,gBAAgB,wBAChBA,EAAA,mBAAmB,2BACnBA,EAAA,UAAU,kBACVA,EAAA,gBAAgB,wBAChBA,EAAA,gBAAgB,wBAChBA,EAAA,mBAAmB,2BAEnBA,EAAA,eAAe,uBAGfA,EAAA,yBAAyB,iCACzBA,EAAA,yBAAyB,iCACzBA,EAAA,4BAA4B,oCAM5BA,EAAA,uBAAuB,+BACvBA,EAAA,uBAAuB,+BACvBA,EAAA,0BAA0B,kCAC1BA,EAAA,YAAY,oBACZA,EAAA,kBAAkB,0BAClBA,EAAA,qBAAqB,6BACrBA,EAAA,oBAAoB,4BAIpBA,EAAA,iBAAiB,yBACjBA,EAAA,oBAAoB,4BAEpBA,EAAA,uBAAuB,+BAIvBA,EAAA,oBAAoB,4BAIpBA,EAAA,iBAAiB,yBACjBA,EAAA,gBAAgB,wBAIhBA,EAAA,mBAAmB,2BACnBA,EAAA,OAAO,mBACPA,EAAA,QAAQ,oBAjDEA,IAAAA,KAAA,CAAA,CAAA,GAoDAC,uBAAAA,OACVA,EAAA,aAAa,cACbA,EAAA,eAAe,gBACfA,EAAA,YAAY,aAHFA,IAAAA,MAAA,CAAA,CAAA,GAMAC,uBAAAA,OACVA,EAAA,OAAO,QACPA,EAAA,OAAO,QACPA,EAAA,SAAS,UACTA,EAAA,QAAQ,SACRA,EAAA,QAAQ,SACRA,EAAA,QAAQ,SACRA,EAAA,WAAW,YACXA,EAAA,WAAW,YACXA,EAAA,QAAQ,SACRA,EAAA,QAAQ,SACRA,EAAA,aAAa,cACbA,EAAA,WAAW,YACXA,EAAA,SAAS,UAbCA,IAAAA,MAAA,CAAA,CAAA;AC3EL,eAAeC,GAASC,GAAQC,GAAS;AAC5C,QAAMC,IAASF,EAAO;AACtB,MAAIG;AACJ,SAAO,EAAEA,IAAS,MAAMD,EAAO,KAAI,GAAI;AACnC,IAAAD,EAAQE,EAAO,KAAK;AAE5B;AACO,SAASC,GAASC,GAAQ;AAC7B,MAAIC,GACAC,GACAC,GACAC,IAAyB;AAC7B,SAAO,SAAiBC,GAAK;AACzB,IAAIJ,MAAW,UACXA,IAASI,GACTH,IAAW,GACXC,IAAc,MAGdF,IAASK,GAAOL,GAAQI,CAAG;AAE/B,UAAME,IAAYN,EAAO;AACzB,QAAIO,IAAY;AAChB,WAAON,IAAWK,KAAW;AACzB,MAAIH,MACIH,EAAOC,CAAQ,MAAM,OACrBM,IAAY,EAAEN,IAElBE,IAAyB;AAE7B,UAAIK,IAAU;AACd,aAAOP,IAAWK,KAAaE,MAAY,IAAI,EAAEP;AAC7C,gBAAQD,EAAOC,CAAQ,GAAC;AAAA,UACpB,KAAK;AACD,YAAIC,MAAgB,OAChBA,IAAcD,IAAWM;AAE7B;AAAA,UACJ,KAAK;AACD,YAAAJ,IAAyB;AAAA,UAC7B,KAAK;AACD,YAAAK,IAAUP;AACV;AAAA,QACxB;AAEY,UAAIO,MAAY;AACZ;AAEJ,MAAAT,EAAOC,EAAO,SAASO,GAAWC,CAAO,GAAGN,CAAW,GACvDK,IAAYN,GACZC,IAAc;AAAA,IAClB;AACA,IAAIK,MAAcD,IACdN,IAAS,SAEJO,MAAc,MACnBP,IAASA,EAAO,SAASO,CAAS,GAClCN,KAAYM;AAAA,EAEpB;AACJ;AACO,SAASE,GAAYC,GAAMC,GAASC,GAAW;AAClD,MAAIC,IAAUC;AACd,QAAMC,IAAU,IAAI;AACpB,SAAO,SAAgBC,GAAMd,GAAa;AACtC,QAAIc,EAAK,WAAW;AAChB,MAAsDJ,IAAUC,CAAO,GACvEA,IAAUC,GAAU;AAAA,aAEfZ,IAAc,GAAG;AACtB,YAAMe,IAAQF,EAAQ,OAAOC,EAAK,SAAS,GAAGd,CAAW,CAAC,GACpDgB,IAAchB,KAAec,EAAKd,IAAc,CAAC,MAAM,KAAK,IAAI,IAChEiB,IAAQJ,EAAQ,OAAOC,EAAK,SAASE,CAAW,CAAC;AACvD,cAAQD,GAAK;AAAA,QACT,KAAK;AACD,UAAAJ,EAAQ,OAAOA,EAAQ,OACjBA,EAAQ,OAAO;AAAA,IAAOM,IACtBA;AACN;AAAA,QACJ,KAAK;AACD,UAAAN,EAAQ,QAAQM;AAChB;AAAA,QACJ,KAAK;AACD,UAAAT,EAAKG,EAAQ,KAAKM,CAAK;AACvB;AAAA,QACJ,KAAK;AACD,gBAAMC,IAAQ,SAASD,GAAO,EAAE;AAChC,UAAK,MAAMC,CAAK,KACZT,EAAQE,EAAQ,QAAQO,CAAK;AAEjC;AAAA,MACpB;AAAA,IACQ;AAAA,EACJ;AACJ;AACA,SAASf,GAAOgB,GAAGC,GAAG;AAClB,QAAMC,IAAM,IAAI,WAAWF,EAAE,SAASC,EAAE,MAAM;AAC9C,SAAAC,EAAI,IAAIF,CAAC,GACTE,EAAI,IAAID,GAAGD,EAAE,MAAM,GACZE;AACX;AACA,SAAST,KAAa;AAClB,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,EACf;AACA;AC5GA,IAAIU,KAAkC,SAAUC,GAAGC,GAAG;AAClD,MAAIC,IAAI,CAAA;AACR,WAASC,KAAKH,EAAG,CAAI,OAAO,UAAU,eAAe,KAAKA,GAAGG,CAAC,KAAKF,EAAE,QAAQE,CAAC,IAAI,MAC9ED,EAAEC,CAAC,IAAIH,EAAEG,CAAC;AACd,MAAIH,KAAK,QAAQ,OAAO,OAAO,yBAA0B;AACrD,aAASI,IAAI,GAAGD,IAAI,OAAO,sBAAsBH,CAAC,GAAGI,IAAID,EAAE,QAAQC;AAC/D,MAAIH,EAAE,QAAQE,EAAEC,CAAC,CAAC,IAAI,KAAK,OAAO,UAAU,qBAAqB,KAAKJ,GAAGG,EAAEC,CAAC,CAAC,MACzEF,EAAEC,EAAEC,CAAC,CAAC,IAAIJ,EAAEG,EAAEC,CAAC,CAAC;AAE5B,SAAOF;AACX;AAEO,MAAMG,KAAyB,qBAChCC,KAAuB,KACvBC,KAAc;AACb,SAASC,GAAiBC,GAAOC,GAAI;AACxC,MAAI,EAAE,QAAQC,GAAa,SAASC,GAAc,QAAQC,GAAa,WAAAC,GAAW,SAAAC,GAAS,SAAAC,GAAS,gBAAAC,GAAgB,OAAOC,EAAU,IAAKR,GAAIS,IAAOpB,GAAOW,GAAI,CAAC,UAAU,WAAW,UAAU,aAAa,WAAW,WAAW,kBAAkB,OAAO,CAAC;AAC7P,SAAO,IAAI,QAAQ,CAACU,GAASC,MAAW;AACpC,UAAMC,IAAU,OAAO,OAAO,CAAA,GAAIV,CAAY;AAC9C,IAAKU,EAAQ,WACTA,EAAQ,SAASjB;AAErB,QAAIkB;AACJ,aAASC,IAAqB;AAC1B,MAAAD,EAAqB,MAAK,GACrB,SAAS,UACVE;IAER;AACA,IAAKR,KACD,SAAS,iBAAiB,oBAAoBO,CAAkB;AAEpE,QAAIE,IAAgBpB,IAChBqB,IAAa;AACjB,aAASC,IAAU;AACf,eAAS,oBAAoB,oBAAoBJ,CAAkB,GACnE,OAAO,aAAaG,CAAU,GAC9BJ,EAAqB,MAAK;AAAA,IAC9B;AACA,IAA0DZ,GAAY,iBAAiB,SAAS,MAAM;AAClG,MAAAiB,KACAR;IACJ,CAAC;AACD,UAAMS,IAAQX,KAA4D,OAAO,OAC3EY,IAASjB,KAA+DkB;AAC9E,mBAAeN,IAAS;AACpB,UAAIf;AACJ,MAAAa,IAAuB,IAAI;AAC3B,UAAI;AACA,cAAMS,IAAW,MAAMH,EAAMpB,GAAO,OAAO,OAAO,OAAO,OAAO,CAAA,GAAIU,CAAI,GAAG,EAAE,SAAAG,GAAS,QAAQC,EAAqB,OAAM,CAAE,CAAC;AAC5H,cAAMO,EAAOE,CAAQ,GACrB,MAAMhE,GAASgE,EAAS,MAAM3D,GAASW,GAAY,CAAAiD,MAAM;AACrD,UAAIA,IACAX,EAAQf,EAAW,IAAI0B,IAGvB,OAAOX,EAAQf,EAAW;AAAA,QAElC,GAAG,CAAAZ,MAAS;AACR,UAAA+B,IAAgB/B;AAAA,QACpB,GAAGmB,CAAS,CAAC,CAAC,GACoCC,OAClDa,KACAR;MACJ,SACOc,GAAK;AACR,YAAI,CAACX,EAAqB,OAAO;AAC7B,cAAI;AACA,kBAAMY,KAAYzB,IAAuDM,IAAQkB,CAAG,OAAO,QAAQxB,MAAO,SAASA,IAAKgB;AACxH,mBAAO,aAAaC,CAAU,GAC9BA,IAAa,OAAO,WAAWF,GAAQU,CAAQ;AAAA,UACnD,SACOC,GAAU;AACb,YAAAR,KACAP,EAAOe,CAAQ;AAAA,UACnB;AAAA,MAER;AAAA,IACJ;AACA,IAAAX;EACJ,CAAC;AACL;AACA,SAASM,GAAcC,GAAU;AAC7B,QAAMK,IAAcL,EAAS,QAAQ,IAAI,cAAc;AACvD,MAAI,CAA4DK,GAAY,WAAWhC,EAAsB;AACzG,UAAM,IAAI,MAAM,+BAA+BA,EAAsB,aAAagC,CAAW,EAAE;AAEvG;ACvEA,IAAIC,KAAgB,SAASC,GAAG1C,GAAG;AACjC,SAAAyC,KAAgB,OAAO,kBAClB,EAAE,WAAW,CAAA,eAAgB,SAAS,SAAUC,GAAG1C,GAAG;AAAE,IAAA0C,EAAE,YAAY1C;AAAA,EAAG,KAC1E,SAAU0C,GAAG1C,GAAG;AAAE,aAASM,KAAKN,EAAG,CAAI,OAAO,UAAU,eAAe,KAAKA,GAAGM,CAAC,MAAGoC,EAAEpC,CAAC,IAAIN,EAAEM,CAAC;AAAA,EAAG,GAC7FmC,GAAcC,GAAG1C,CAAC;AAC3B;AAEO,SAAS2C,EAAUD,GAAG1C,GAAG;AAC9B,MAAI,OAAOA,KAAM,cAAcA,MAAM;AACjC,UAAM,IAAI,UAAU,yBAAyB,OAAOA,CAAC,IAAI,+BAA+B;AAC5F,EAAAyC,GAAcC,GAAG1C,CAAC;AAClB,WAAS4C,IAAK;AAAE,SAAK,cAAcF;AAAA,EAAG;AACtC,EAAAA,EAAE,YAAY1C,MAAM,OAAO,OAAO,OAAOA,CAAC,KAAK4C,EAAG,YAAY5C,EAAE,WAAW,IAAI4C,EAAE;AACnF;AAqFO,SAASC,GAAUC,GAASC,GAAYC,GAAGC,GAAW;AAC3D,WAASC,EAAMrD,GAAO;AAAE,WAAOA,aAAiBmD,IAAInD,IAAQ,IAAImD,EAAE,SAAUzB,GAAS;AAAE,MAAAA,EAAQ1B,CAAK;AAAA,IAAG,CAAC;AAAA,EAAG;AAC3G,SAAO,KAAKmD,MAAMA,IAAI,UAAU,SAAUzB,GAASC,GAAQ;AACvD,aAAS2B,EAAUtD,GAAO;AAAE,UAAI;AAAE,QAAAuD,EAAKH,EAAU,KAAKpD,CAAK,CAAC;AAAA,MAAG,SAASO,GAAG;AAAE,QAAAoB,EAAOpB,CAAC;AAAA,MAAG;AAAA,IAAE;AAC1F,aAASiD,EAASxD,GAAO;AAAE,UAAI;AAAE,QAAAuD,EAAKH,EAAU,MAASpD,CAAK,CAAC;AAAA,MAAG,SAASO,GAAG;AAAE,QAAAoB,EAAOpB,CAAC;AAAA,MAAG;AAAA,IAAE;AAC7F,aAASgD,EAAK7E,GAAQ;AAAE,MAAAA,EAAO,OAAOgD,EAAQhD,EAAO,KAAK,IAAI2E,EAAM3E,EAAO,KAAK,EAAE,KAAK4E,GAAWE,CAAQ;AAAA,IAAG;AAC7G,IAAAD,GAAMH,IAAYA,EAAU,MAAMH,GAASC,KAAc,CAAA,CAAE,GAAG,MAAM;AAAA,EACxE,CAAC;AACH;AAEO,SAASO,GAAYR,GAASxF,GAAM;AACzC,MAAIiG,IAAI,EAAE,OAAO,GAAG,MAAM,WAAW;AAAE,QAAIlD,EAAE,CAAC,IAAI,EAAG,OAAMA,EAAE,CAAC;AAAG,WAAOA,EAAE,CAAC;AAAA,EAAG,GAAG,MAAM,CAAA,GAAI,KAAK,CAAA,EAAE,GAAImD,GAAGC,GAAGpD,GAAGqD,IAAI,OAAO,QAAQ,OAAO,YAAa,aAAa,WAAW,QAAQ,SAAS;AAC/L,SAAOA,EAAE,OAAOC,EAAK,CAAC,GAAGD,EAAE,QAAWC,EAAK,CAAC,GAAGD,EAAE,SAAYC,EAAK,CAAC,GAAG,OAAO,UAAW,eAAeD,EAAE,OAAO,QAAQ,IAAI,WAAW;AAAE,WAAO;AAAA,EAAM,IAAIA;AAC1J,WAASC,EAAKC,GAAG;AAAE,WAAO,SAAUC,GAAG;AAAE,aAAOT,EAAK,CAACQ,GAAGC,CAAC,CAAC;AAAA,IAAG;AAAA,EAAG;AACjE,WAAST,EAAKU,GAAI;AACd,QAAIN,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAC5D,WAAOE,MAAMA,IAAI,GAAGI,EAAG,CAAC,MAAMP,IAAI,KAAKA,IAAG,KAAI;AAC1C,UAAIC,IAAI,GAAGC,MAAMpD,IAAIyD,EAAG,CAAC,IAAI,IAAIL,EAAE,SAAYK,EAAG,CAAC,IAAIL,EAAE,WAAcpD,IAAIoD,EAAE,WAAcpD,EAAE,KAAKoD,CAAC,GAAG,KAAKA,EAAE,SAAS,EAAEpD,IAAIA,EAAE,KAAKoD,GAAGK,EAAG,CAAC,CAAC,GAAG,KAAM,QAAOzD;AAE3J,cADIoD,IAAI,GAAGpD,MAAGyD,IAAK,CAACA,EAAG,CAAC,IAAI,GAAGzD,EAAE,KAAK,IAC9ByD,EAAG,CAAC,GAAC;AAAA,QACT,KAAK;AAAA,QAAG,KAAK;AAAG,UAAAzD,IAAIyD;AAAI;AAAA,QACxB,KAAK;AAAG,iBAAAP,EAAE,SAAgB,EAAE,OAAOO,EAAG,CAAC,GAAG,MAAM,GAAK;AAAA,QACrD,KAAK;AAAG,UAAAP,EAAE,SAASE,IAAIK,EAAG,CAAC,GAAGA,IAAK,CAAC,CAAC;AAAG;AAAA,QACxC,KAAK;AAAG,UAAAA,IAAKP,EAAE,IAAI,OAAOA,EAAE,KAAK,IAAG;AAAI;AAAA,QACxC;AACI,cAAMlD,IAAIkD,EAAE,MAAM,EAAAlD,IAAIA,EAAE,SAAS,KAAKA,EAAEA,EAAE,SAAS,CAAC,OAAOyD,EAAG,CAAC,MAAM,KAAKA,EAAG,CAAC,MAAM,IAAI;AAAE,YAAAP,IAAI;AAAG;AAAA,UAAU;AAC3G,cAAIO,EAAG,CAAC,MAAM,MAAM,CAACzD,KAAMyD,EAAG,CAAC,IAAIzD,EAAE,CAAC,KAAKyD,EAAG,CAAC,IAAIzD,EAAE,CAAC,IAAK;AAAE,YAAAkD,EAAE,QAAQO,EAAG,CAAC;AAAG;AAAA,UAAO;AACrF,cAAIA,EAAG,CAAC,MAAM,KAAKP,EAAE,QAAQlD,EAAE,CAAC,GAAG;AAAE,YAAAkD,EAAE,QAAQlD,EAAE,CAAC,GAAGA,IAAIyD;AAAI;AAAA,UAAO;AACpE,cAAIzD,KAAKkD,EAAE,QAAQlD,EAAE,CAAC,GAAG;AAAE,YAAAkD,EAAE,QAAQlD,EAAE,CAAC,GAAGkD,EAAE,IAAI,KAAKO,CAAE;AAAG;AAAA,UAAO;AAClE,UAAIzD,EAAE,CAAC,KAAGkD,EAAE,IAAI,IAAG,GACnBA,EAAE,KAAK,IAAG;AAAI;AAAA,MAChC;AACU,MAAAO,IAAKxG,EAAK,KAAKwF,GAASS,CAAC;AAAA,IAC7B,SAASnD,GAAG;AAAE,MAAA0D,IAAK,CAAC,GAAG1D,CAAC,GAAGqD,IAAI;AAAA,IAAG,UAAC;AAAW,MAAAD,IAAInD,IAAI;AAAA,IAAG;AACzD,QAAIyD,EAAG,CAAC,IAAI,EAAG,OAAMA,EAAG,CAAC;AAAG,WAAO,EAAE,OAAOA,EAAG,CAAC,IAAIA,EAAG,CAAC,IAAI,QAAQ,MAAM,GAAI;AAAA,EAClF;AACF;AAkBO,SAASC,EAASC,GAAG;AAC1B,MAAI7D,IAAI,OAAO,UAAW,cAAc,OAAO,UAAU8D,IAAI9D,KAAK6D,EAAE7D,CAAC,GAAGI,IAAI;AAC5E,MAAI0D,EAAG,QAAOA,EAAE,KAAKD,CAAC;AACtB,MAAIA,KAAK,OAAOA,EAAE,UAAW,SAAU,QAAO;AAAA,IAC1C,MAAM,WAAY;AACd,aAAIA,KAAKzD,KAAKyD,EAAE,WAAQA,IAAI,SACrB,EAAE,OAAOA,KAAKA,EAAEzD,GAAG,GAAG,MAAM,CAACyD,EAAC;AAAA,IACzC;AAAA,EACN;AACE,QAAM,IAAI,UAAU7D,IAAI,4BAA4B,iCAAiC;AACvF;AAEO,SAAS+D,EAAOF,GAAGJ,GAAG;AAC3B,MAAIK,IAAI,OAAO,UAAW,cAAcD,EAAE,OAAO,QAAQ;AACzD,MAAI,CAACC,EAAG,QAAOD;AACf,MAAIzD,IAAI0D,EAAE,KAAKD,CAAC,GAAG,GAAGG,IAAK,CAAA,GAAI/D;AAC/B,MAAI;AACA,YAAQwD,MAAM,UAAUA,MAAM,MAAM,EAAE,IAAIrD,EAAE,KAAI,GAAI,OAAM,CAAA4D,EAAG,KAAK,EAAE,KAAK;AAAA,EAC7E,SACO3G,GAAO;AAAE,IAAA4C,IAAI,EAAE,OAAO5C,EAAK;AAAA,EAAI,UACxC;AACM,QAAI;AACA,MAAI,KAAK,CAAC,EAAE,SAASyG,IAAI1D,EAAE,WAAY0D,EAAE,KAAK1D,CAAC;AAAA,IACnD,UACN;AAAgB,UAAIH,EAAG,OAAMA,EAAE;AAAA,IAAO;AAAA,EACpC;AACA,SAAO+D;AACT;AAkBO,SAASC,EAAcC,GAAIC,GAAMC,GAAM;AAC5C,MAAIA,KAAQ,UAAU,WAAW,EAAG,UAAShE,IAAI,GAAGiE,IAAIF,EAAK,QAAQH,GAAI5D,IAAIiE,GAAGjE;AAC5E,KAAI4D,KAAM,EAAE5D,KAAK+D,QACRH,MAAIA,IAAK,MAAM,UAAU,MAAM,KAAKG,GAAM,GAAG/D,CAAC,IACnD4D,EAAG5D,CAAC,IAAI+D,EAAK/D,CAAC;AAGtB,SAAO8D,EAAG,OAAOF,KAAM,MAAM,UAAU,MAAM,KAAKG,CAAI,CAAC;AACzD;AAEO,SAASG,EAAQZ,GAAG;AACzB,SAAO,gBAAgBY,KAAW,KAAK,IAAIZ,GAAG,QAAQ,IAAIY,EAAQZ,CAAC;AACrE;AAEO,SAASa,GAAiB5B,GAASC,GAAYE,GAAW;AAC/D,MAAI,CAAC,OAAO,cAAe,OAAM,IAAI,UAAU,sCAAsC;AACrF,MAAIS,IAAIT,EAAU,MAAMH,GAASC,KAAc,EAAE,GAAGxC,GAAGoE,IAAI,CAAA;AAC3D,SAAOpE,IAAI,OAAO,QAAQ,OAAO,iBAAkB,aAAa,gBAAgB,QAAQ,SAAS,GAAGoD,EAAK,MAAM,GAAGA,EAAK,OAAO,GAAGA,EAAK,UAAUiB,CAAW,GAAGrE,EAAE,OAAO,aAAa,IAAI,WAAY;AAAE,WAAO;AAAA,EAAM,GAAGA;AACtN,WAASqE,EAAYpB,GAAG;AAAE,WAAO,SAAUK,GAAG;AAAE,aAAO,QAAQ,QAAQA,CAAC,EAAE,KAAKL,GAAGhC,CAAM;AAAA,IAAG;AAAA,EAAG;AAC9F,WAASmC,EAAKC,GAAGJ,GAAG;AAAE,IAAIE,EAAEE,CAAC,MAAKrD,EAAEqD,CAAC,IAAI,SAAUC,GAAG;AAAE,aAAO,IAAI,QAAQ,SAAU9D,GAAGC,GAAG;AAAE,QAAA2E,EAAE,KAAK,CAACf,GAAGC,GAAG9D,GAAGC,CAAC,CAAC,IAAI,KAAK6E,EAAOjB,GAAGC,CAAC;AAAA,MAAG,CAAC;AAAA,IAAG,GAAOL,MAAGjD,EAAEqD,CAAC,IAAIJ,EAAEjD,EAAEqD,CAAC,CAAC;AAAA,EAAK;AACvK,WAASiB,EAAOjB,GAAGC,GAAG;AAAE,QAAI;AAAE,MAAAT,EAAKM,EAAEE,CAAC,EAAEC,CAAC,CAAC;AAAA,IAAG,SAASzD,GAAG;AAAE,MAAA0E,EAAOH,EAAE,CAAC,EAAE,CAAC,GAAGvE,CAAC;AAAA,IAAG;AAAA,EAAE;AACjF,WAASgD,EAAK2B,GAAG;AAAE,IAAAA,EAAE,iBAAiBN,IAAU,QAAQ,QAAQM,EAAE,MAAM,CAAC,EAAE,KAAKC,GAASxD,CAAM,IAAIsD,EAAOH,EAAE,CAAC,EAAE,CAAC,GAAGI,CAAC;AAAA,EAAG;AACvH,WAASC,EAAQnF,GAAO;AAAE,IAAAgF,EAAO,QAAQhF,CAAK;AAAA,EAAG;AACjD,WAAS2B,EAAO3B,GAAO;AAAE,IAAAgF,EAAO,SAAShF,CAAK;AAAA,EAAG;AACjD,WAASiF,EAAOtB,GAAGK,GAAG;AAAE,IAAIL,EAAEK,CAAC,GAAGc,EAAE,MAAK,GAAIA,EAAE,UAAQE,EAAOF,EAAE,CAAC,EAAE,CAAC,GAAGA,EAAE,CAAC,EAAE,CAAC,CAAC;AAAA,EAAG;AACnF;AAQO,SAASM,GAAcjB,GAAG;AAC/B,MAAI,CAAC,OAAO,cAAe,OAAM,IAAI,UAAU,sCAAsC;AACrF,MAAIC,IAAID,EAAE,OAAO,aAAa,GAAGzD;AACjC,SAAO0D,IAAIA,EAAE,KAAKD,CAAC,KAAKA,IAAI,OAAOD,KAAa,aAAaA,EAASC,CAAC,IAAIA,EAAE,OAAO,QAAQ,EAAC,GAAIzD,IAAI,CAAA,GAAIoD,EAAK,MAAM,GAAGA,EAAK,OAAO,GAAGA,EAAK,QAAQ,GAAGpD,EAAE,OAAO,aAAa,IAAI,WAAY;AAAE,WAAO;AAAA,EAAM,GAAGA;AAC9M,WAASoD,EAAKC,GAAG;AAAE,IAAArD,EAAEqD,CAAC,IAAII,EAAEJ,CAAC,KAAK,SAAUC,GAAG;AAAE,aAAO,IAAI,QAAQ,SAAUtC,GAASC,GAAQ;AAAE,QAAAqC,IAAIG,EAAEJ,CAAC,EAAEC,CAAC,GAAGiB,EAAOvD,GAASC,GAAQqC,EAAE,MAAMA,EAAE,KAAK;AAAA,MAAG,CAAC;AAAA,IAAG;AAAA,EAAG;AAC/J,WAASiB,EAAOvD,GAASC,GAAQkB,GAAGmB,GAAG;AAAE,YAAQ,QAAQA,CAAC,EAAE,KAAK,SAASA,GAAG;AAAE,MAAAtC,EAAQ,EAAE,OAAOsC,GAAG,MAAMnB,EAAC,CAAE;AAAA,IAAG,GAAGlB,CAAM;AAAA,EAAG;AAC7H;AC5PO,SAAS0D,EAAWrF,GAAO;AAC9B,SAAO,OAAOA,KAAU;AAC5B;ACFO,SAASsF,GAAiBC,GAAY;AACzC,MAAIC,IAAS,SAAUC,GAAU;AAC7B,UAAM,KAAKA,CAAQ,GACnBA,EAAS,QAAQ,IAAI,MAAK,EAAG;AAAA,EACjC,GACIC,IAAWH,EAAWC,CAAM;AAChC,SAAAE,EAAS,YAAY,OAAO,OAAO,MAAM,SAAS,GAClDA,EAAS,UAAU,cAAcA,GAC1BA;AACX;ACRO,IAAIC,IAAsBL,GAAiB,SAAUE,GAAQ;AAChE,SAAO,SAAiCI,GAAQ;AAC5C,IAAAJ,EAAO,IAAI,GACX,KAAK,UAAUI,IACTA,EAAO,SAAS;AAAA,IAA8CA,EAAO,IAAI,SAAUpD,GAAK9B,GAAG;AAAE,aAAOA,IAAI,IAAI,OAAO8B,EAAI,SAAQ;AAAA,IAAI,CAAC,EAAE,KAAK;AAAA,GAAM,IACjJ,IACN,KAAK,OAAO,uBACZ,KAAK,SAASoD;AAAA,EAClB;AACJ,CAAC;ACVM,SAASC,EAAU5G,GAAK6G,GAAM;AACjC,MAAI7G,GAAK;AACL,QAAI8G,IAAQ9G,EAAI,QAAQ6G,CAAI;AAC5B,SAAKC,KAAS9G,EAAI,OAAO8G,GAAO,CAAC;AAAA,EACrC;AACJ;ACDA,IAAIC,KAAgB,WAAY;AAC5B,WAASA,EAAaC,GAAiB;AACnC,SAAK,kBAAkBA,GACvB,KAAK,SAAS,IACd,KAAK,aAAa,MAClB,KAAK,cAAc;AAAA,EACvB;AACA,SAAAD,EAAa,UAAU,cAAc,WAAY;AAC7C,QAAIE,GAAKlF,GAAImF,GAAKC,GACdR;AACJ,QAAI,CAAC,KAAK,QAAQ;AACd,WAAK,SAAS;AACd,UAAIS,IAAa,KAAK;AACtB,UAAIA;AAEA,YADA,KAAK,aAAa,MACd,MAAM,QAAQA,CAAU;AACxB,cAAI;AACA,qBAASC,IAAepC,EAASmC,CAAU,GAAGE,IAAiBD,EAAa,KAAI,GAAI,CAACC,EAAe,MAAMA,IAAiBD,EAAa,KAAI,GAAI;AAC5I,kBAAIE,IAAWD,EAAe;AAC9B,cAAAC,EAAS,OAAO,IAAI;AAAA,YACxB;AAAA,UACJ,SACOC,GAAO;AAAE,YAAAP,IAAM,EAAE,OAAOO,EAAK;AAAA,UAAI,UAC5D;AACwB,gBAAI;AACA,cAAIF,KAAkB,CAACA,EAAe,SAASvF,IAAKsF,EAAa,WAAStF,EAAG,KAAKsF,CAAY;AAAA,YAClG,UACxB;AAAkC,kBAAIJ,EAAK,OAAMA,EAAI;AAAA,YAAO;AAAA,UACxC;AAAA;AAGA,UAAAG,EAAW,OAAO,IAAI;AAG9B,UAAIK,IAAmB,KAAK;AAC5B,UAAIrB,EAAWqB,CAAgB;AAC3B,YAAI;AACA,UAAAA,EAAgB;AAAA,QACpB,SACOnG,GAAG;AACN,UAAAqF,IAASrF,aAAaoF,IAAsBpF,EAAE,SAAS,CAACA,CAAC;AAAA,QAC7D;AAEJ,UAAIoG,IAAc,KAAK;AACvB,UAAIA,GAAa;AACb,aAAK,cAAc;AACnB,YAAI;AACA,mBAASC,IAAgB1C,EAASyC,CAAW,GAAGE,IAAkBD,EAAc,KAAI,GAAI,CAACC,EAAgB,MAAMA,IAAkBD,EAAc,KAAI,GAAI;AACnJ,gBAAIE,IAAYD,EAAgB;AAChC,gBAAI;AACA,cAAAE,GAAcD,CAAS;AAAA,YAC3B,SACOtE,GAAK;AACR,cAAAoD,IAASA,KAAgD,CAAA,GACrDpD,aAAemD,IACfC,IAASrB,EAAcA,EAAc,CAAA,GAAIF,EAAOuB,CAAM,CAAC,GAAGvB,EAAO7B,EAAI,MAAM,CAAC,IAG5EoD,EAAO,KAAKpD,CAAG;AAAA,YAEvB;AAAA,UACJ;AAAA,QACJ,SACOwE,GAAO;AAAE,UAAAb,IAAM,EAAE,OAAOa,EAAK;AAAA,QAAI,UACxD;AACoB,cAAI;AACA,YAAIH,KAAmB,CAACA,EAAgB,SAAST,IAAKQ,EAAc,WAASR,EAAG,KAAKQ,CAAa;AAAA,UACtG,UACpB;AAA8B,gBAAIT,EAAK,OAAMA,EAAI;AAAA,UAAO;AAAA,QACxC;AAAA,MACJ;AACA,UAAIP;AACA,cAAM,IAAID,EAAoBC,CAAM;AAAA,IAE5C;AAAA,EACJ,GACAI,EAAa,UAAU,MAAM,SAAUiB,GAAU;AAC7C,QAAIjG;AACJ,QAAIiG,KAAYA,MAAa;AACzB,UAAI,KAAK;AACL,QAAAF,GAAcE,CAAQ;AAAA,WAErB;AACD,YAAIA,aAAoBjB,GAAc;AAClC,cAAIiB,EAAS,UAAUA,EAAS,WAAW,IAAI;AAC3C;AAEJ,UAAAA,EAAS,WAAW,IAAI;AAAA,QAC5B;AACA,SAAC,KAAK,eAAejG,IAAK,KAAK,iBAAiB,QAAQA,MAAO,SAASA,IAAK,CAAA,GAAI,KAAKiG,CAAQ;AAAA,MAClG;AAAA,EAER,GACAjB,EAAa,UAAU,aAAa,SAAUkB,GAAQ;AAClD,QAAIb,IAAa,KAAK;AACtB,WAAOA,MAAea,KAAW,MAAM,QAAQb,CAAU,KAAKA,EAAW,SAASa,CAAM;AAAA,EAC5F,GACAlB,EAAa,UAAU,aAAa,SAAUkB,GAAQ;AAClD,QAAIb,IAAa,KAAK;AACtB,SAAK,aAAa,MAAM,QAAQA,CAAU,KAAKA,EAAW,KAAKa,CAAM,GAAGb,KAAcA,IAAa,CAACA,GAAYa,CAAM,IAAIA;AAAA,EAC9H,GACAlB,EAAa,UAAU,gBAAgB,SAAUkB,GAAQ;AACrD,QAAIb,IAAa,KAAK;AACtB,IAAIA,MAAea,IACf,KAAK,aAAa,OAEb,MAAM,QAAQb,CAAU,KAC7BR,EAAUQ,GAAYa,CAAM;AAAA,EAEpC,GACAlB,EAAa,UAAU,SAAS,SAAUiB,GAAU;AAChD,QAAIN,IAAc,KAAK;AACvB,IAAAA,KAAed,EAAUc,GAAaM,CAAQ,GAC1CA,aAAoBjB,KACpBiB,EAAS,cAAc,IAAI;AAAA,EAEnC,GACAjB,EAAa,SAAS,WAAY;AAC9B,QAAImB,IAAQ,IAAInB,EAAY;AAC5B,WAAAmB,EAAM,SAAS,IACRA;AAAA,EACX,GAAC,GACMnB;AACX,MAEWoB,KAAqBpB,EAAa;AACtC,SAASqB,GAAerH,GAAO;AAClC,SAAQA,aAAiBgG,KACpBhG,KAAS,YAAYA,KAASqF,EAAWrF,EAAM,MAAM,KAAKqF,EAAWrF,EAAM,GAAG,KAAKqF,EAAWrF,EAAM,WAAW;AACxH;AACA,SAAS+G,GAAcD,GAAW;AAC9B,EAAIzB,EAAWyB,CAAS,IACpBA,EAAS,IAGTA,EAAU,YAAW;AAE7B;AC7IO,IAAIQ,KAAS;AAAA,EAGhB,SAAS;AAGb,GCLWC,KAAkB;AAAA,EACzB,YAAY,SAAUC,GAASC,GAAS;AAEpC,aADIC,IAAO,CAAA,GACFC,IAAK,GAAGA,IAAK,UAAU,QAAQA;AACpC,MAAAD,EAAKC,IAAK,CAAC,IAAI,UAAUA,CAAE;AAM/B,WAAO,WAAW,MAAM,QAAQpD,EAAc,CAACiD,GAASC,CAAO,GAAGpD,EAAOqD,CAAI,CAAC,CAAC;AAAA,EACnF;AAAA,EACA,cAAc,SAAUE,GAAQ;AAE5B,WAAuF,aAAcA,CAAM;AAAA,EAC/G;AAAA,EACA,UAAU;AACd;AChBO,SAASC,GAAqBrF,GAAK;AACtC,EAAA+E,GAAgB,WAAW,WAAY;AAM/B,UAAM/E;AAAA,EAEd,CAAC;AACL;ACZO,SAASsF,KAAO;AAAE;ACElB,SAASC,EAAaC,GAAI;AAgBzB,EAAAA,EAAE;AAEV;ACXA,IAAIC,MAAc,SAAUzC,GAAQ;AAChC,EAAA1C,EAAUmF,GAAYzC,CAAM;AAC5B,WAASyC,EAAWC,GAAa;AAC7B,QAAIC,IAAQ3C,EAAO,KAAK,IAAI,KAAK;AACjC,WAAA2C,EAAM,YAAY,IACdD,KACAC,EAAM,cAAcD,GAChBb,GAAea,CAAW,KAC1BA,EAAY,IAAIC,CAAK,KAIzBA,EAAM,cAAcC,IAEjBD;AAAA,EACX;AACA,SAAAF,EAAW,SAAS,SAAUI,GAAM1K,GAAO2K,GAAU;AACjD,WAAO,IAAIC,GAAeF,GAAM1K,GAAO2K,CAAQ;AAAA,EACnD,GACAL,EAAW,UAAU,OAAO,SAAUjI,GAAO;AACzC,IAAI,KAAK,aAIL,KAAK,MAAMA,CAAK;AAAA,EAExB,GACAiI,EAAW,UAAU,QAAQ,SAAUzF,GAAK;AACxC,IAAI,KAAK,cAIL,KAAK,YAAY,IACjB,KAAK,OAAOA,CAAG;AAAA,EAEvB,GACAyF,EAAW,UAAU,WAAW,WAAY;AACxC,IAAI,KAAK,cAIL,KAAK,YAAY,IACjB,KAAK,UAAS;AAAA,EAEtB,GACAA,EAAW,UAAU,cAAc,WAAY;AAC3C,IAAK,KAAK,WACN,KAAK,YAAY,IACjBzC,EAAO,UAAU,YAAY,KAAK,IAAI,GACtC,KAAK,cAAc;AAAA,EAE3B,GACAyC,EAAW,UAAU,QAAQ,SAAUjI,GAAO;AAC1C,SAAK,YAAY,KAAKA,CAAK;AAAA,EAC/B,GACAiI,EAAW,UAAU,SAAS,SAAUzF,GAAK;AACzC,QAAI;AACA,WAAK,YAAY,MAAMA,CAAG;AAAA,IAC9B,UACR;AACY,WAAK,YAAW;AAAA,IACpB;AAAA,EACJ,GACAyF,EAAW,UAAU,YAAY,WAAY;AACzC,QAAI;AACA,WAAK,YAAY,SAAQ;AAAA,IAC7B,UACR;AACY,WAAK,YAAW;AAAA,IACpB;AAAA,EACJ,GACOA;AACX,GAAEjC,CAAY,GAMVwC,MAAoB,WAAY;AAChC,WAASA,EAAiBC,GAAiB;AACvC,SAAK,kBAAkBA;AAAA,EAC3B;AACA,SAAAD,EAAiB,UAAU,OAAO,SAAUxI,GAAO;AAC/C,QAAIyI,IAAkB,KAAK;AAC3B,QAAIA,EAAgB;AAChB,UAAI;AACA,QAAAA,EAAgB,KAAKzI,CAAK;AAAA,MAC9B,SACOrC,GAAO;AACV,QAAA+K,EAAqB/K,CAAK;AAAA,MAC9B;AAAA,EAER,GACA6K,EAAiB,UAAU,QAAQ,SAAUhG,GAAK;AAC9C,QAAIiG,IAAkB,KAAK;AAC3B,QAAIA,EAAgB;AAChB,UAAI;AACA,QAAAA,EAAgB,MAAMjG,CAAG;AAAA,MAC7B,SACO7E,GAAO;AACV,QAAA+K,EAAqB/K,CAAK;AAAA,MAC9B;AAAA;AAGA,MAAA+K,EAAqBlG,CAAG;AAAA,EAEhC,GACAgG,EAAiB,UAAU,WAAW,WAAY;AAC9C,QAAIC,IAAkB,KAAK;AAC3B,QAAIA,EAAgB;AAChB,UAAI;AACA,QAAAA,EAAgB,SAAQ;AAAA,MAC5B,SACO9K,GAAO;AACV,QAAA+K,EAAqB/K,CAAK;AAAA,MAC9B;AAAA,EAER,GACO6K;AACX,MACID,MAAkB,SAAU/C,GAAQ;AACpC,EAAA1C,EAAUyF,GAAgB/C,CAAM;AAChC,WAAS+C,EAAeI,GAAgBhL,GAAO2K,GAAU;AACrD,QAAIH,IAAQ3C,EAAO,KAAK,IAAI,KAAK,MAC7BiD;AACJ,WAAIpD,EAAWsD,CAAc,KAAK,CAACA,IAC/BF,IAAkB;AAAA,MACd,MAAOE,KAAwE;AAAA,MAC/E,OAAOhL,KAA6C;AAAA,MACpD,UAAU2K,KAAsD;AAAA,IAChF,IAcgBG,IAAkBE,GAG1BR,EAAM,cAAc,IAAIK,GAAiBC,CAAe,GACjDN;AAAA,EACX;AACA,SAAOI;AACX,GAAEN,EAAU;AAEZ,SAASS,EAAqB/K,GAAO;AAK7B,EAAAkK,GAAqBlK,CAAK;AAElC;AACA,SAASiL,GAAoBpG,GAAK;AAC9B,QAAMA;AACV;AAKO,IAAI4F,KAAiB;AAAA,EACxB,QAAQ;AAAA,EACR,MAAMN;AAAA,EACN,OAAOc;AAAA,EACP,UAAUd;AACd,GCtLWe,MAAc,WAAY;AAAE,SAAQ,OAAO,UAAW,cAAc,OAAO,cAAe;AAAgB,GAAC;ACA/G,SAASC,EAASC,GAAG;AACxB,SAAOA;AACX;ACMO,SAASC,GAAcC,GAAK;AAC/B,SAAIA,EAAI,WAAW,IACRH,IAEPG,EAAI,WAAW,IACRA,EAAI,CAAC,IAET,SAAelI,GAAO;AACzB,WAAOkI,EAAI,OAAO,SAAUC,GAAMC,GAAI;AAAE,aAAOA,EAAGD,CAAI;AAAA,IAAG,GAAGnI,CAAK;AAAA,EACrE;AACJ;ACXA,IAAIqI,KAAc,WAAY;AAC1B,WAASA,EAAWC,GAAW;AAC3B,IAAIA,MACA,KAAK,aAAaA;AAAA,EAE1B;AACA,SAAAD,EAAW,UAAU,OAAO,SAAUE,GAAU;AAC5C,QAAIT,IAAa,IAAIO,EAAU;AAC/B,WAAAP,EAAW,SAAS,MACpBA,EAAW,WAAWS,GACfT;AAAA,EACX,GACAO,EAAW,UAAU,YAAY,SAAUT,GAAgBhL,GAAO2K,GAAU;AACxE,QAAIH,IAAQ,MACRoB,IAAaC,GAAab,CAAc,IAAIA,IAAiB,IAAIJ,GAAeI,GAAgBhL,GAAO2K,CAAQ;AACnH,WAAAP,EAAa,WAAY;AACrB,UAAI/G,IAAKmH,GAAOmB,IAAWtI,EAAG,UAAUyI,IAASzI,EAAG;AACpD,MAAAuI,EAAW,IAAID,IAEPA,EAAS,KAAKC,GAAYE,CAAM,IAClCA,IAEMtB,EAAM,WAAWoB,CAAU,IAE3BpB,EAAM,cAAcoB,CAAU,CAAC;AAAA,IAC/C,CAAC,GACMA;AAAA,EACX,GACAH,EAAW,UAAU,gBAAgB,SAAUM,GAAM;AACjD,QAAI;AACA,aAAO,KAAK,WAAWA,CAAI;AAAA,IAC/B,SACOlH,GAAK;AACR,MAAAkH,EAAK,MAAMlH,CAAG;AAAA,IAClB;AAAA,EACJ,GACA4G,EAAW,UAAU,UAAU,SAAUf,GAAMsB,GAAa;AACxD,QAAIxB,IAAQ;AACZ,WAAAwB,IAAcC,GAAeD,CAAW,GACjC,IAAIA,EAAY,SAAUjI,GAASC,GAAQ;AAC9C,UAAI4H,IAAa,IAAIhB,GAAe;AAAA,QAChC,MAAM,SAAUvI,GAAO;AACnB,cAAI;AACA,YAAAqI,EAAKrI,CAAK;AAAA,UACd,SACOwC,GAAK;AACR,YAAAb,EAAOa,CAAG,GACV+G,EAAW,YAAW;AAAA,UAC1B;AAAA,QACJ;AAAA,QACA,OAAO5H;AAAA,QACP,UAAUD;AAAA,MAC1B,CAAa;AACD,MAAAyG,EAAM,UAAUoB,CAAU;AAAA,IAC9B,CAAC;AAAA,EACL,GACAH,EAAW,UAAU,aAAa,SAAUG,GAAY;AACpD,QAAIvI;AACJ,YAAQA,IAAK,KAAK,YAAY,QAAQA,MAAO,SAAS,SAASA,EAAG,UAAUuI,CAAU;AAAA,EAC1F,GACAH,EAAW,UAAUS,EAAiB,IAAI,WAAY;AAClD,WAAO;AAAA,EACX,GACAT,EAAW,UAAU,OAAO,WAAY;AAEpC,aADIU,IAAa,CAAA,GACRnC,IAAK,GAAGA,IAAK,UAAU,QAAQA;AACpC,MAAAmC,EAAWnC,CAAE,IAAI,UAAUA,CAAE;AAEjC,WAAOqB,GAAcc,CAAU,EAAE,IAAI;AAAA,EACzC,GACAV,EAAW,UAAU,YAAY,SAAUO,GAAa;AACpD,QAAIxB,IAAQ;AACZ,WAAAwB,IAAcC,GAAeD,CAAW,GACjC,IAAIA,EAAY,SAAUjI,GAASC,GAAQ;AAC9C,UAAI3B;AACJ,MAAAmI,EAAM,UAAU,SAAUY,GAAG;AAAE,eAAQ/I,IAAQ+I;AAAA,MAAI,GAAG,SAAUvG,GAAK;AAAE,eAAOb,EAAOa,CAAG;AAAA,MAAG,GAAG,WAAY;AAAE,eAAOd,EAAQ1B,CAAK;AAAA,MAAG,CAAC;AAAA,IACxI,CAAC;AAAA,EACL,GACAoJ,EAAW,SAAS,SAAUC,GAAW;AACrC,WAAO,IAAID,EAAWC,CAAS;AAAA,EACnC,GACOD;AACX;AAEA,SAASQ,GAAeD,GAAa;AACjC,MAAI3I;AACJ,UAAQA,IAAK2I,KAA+DrC,GAAO,aAAa,QAAQtG,MAAO,SAASA,IAAK;AACjI;AACA,SAAS+I,GAAW/J,GAAO;AACvB,SAAOA,KAASqF,EAAWrF,EAAM,IAAI,KAAKqF,EAAWrF,EAAM,KAAK,KAAKqF,EAAWrF,EAAM,QAAQ;AAClG;AACA,SAASwJ,GAAaxJ,GAAO;AACzB,SAAQA,KAASA,aAAiBiI,MAAgB8B,GAAW/J,CAAK,KAAKqH,GAAerH,CAAK;AAC/F;ACnGO,SAASgK,GAAQP,GAAQ;AAC5B,SAAOpE,EAA2DoE,GAAO,IAAI;AACjF;AACO,SAASQ,EAAQC,GAAM;AAC1B,SAAO,SAAUT,GAAQ;AACrB,QAAIO,GAAQP,CAAM;AACd,aAAOA,EAAO,KAAK,SAAUU,GAAc;AACvC,YAAI;AACA,iBAAOD,EAAKC,GAAc,IAAI;AAAA,QAClC,SACO3H,GAAK;AACR,eAAK,MAAMA,CAAG;AAAA,QAClB;AAAA,MACJ,CAAC;AAEL,UAAM,IAAI,UAAU,wCAAwC;AAAA,EAChE;AACJ;AChBO,SAAS4H,EAAyBlC,GAAamC,GAAQC,GAAYC,GAASC,GAAY;AAC3F,SAAO,IAAIC,GAAmBvC,GAAamC,GAAQC,GAAYC,GAASC,CAAU;AACtF;AACA,IAAIC,MAAsB,SAAUjF,GAAQ;AACxC,EAAA1C,EAAU2H,GAAoBjF,CAAM;AACpC,WAASiF,EAAmBvC,GAAamC,GAAQC,GAAYC,GAASC,GAAYE,GAAmB;AACjG,QAAIvC,IAAQ3C,EAAO,KAAK,MAAM0C,CAAW,KAAK;AAC9C,WAAAC,EAAM,aAAaqC,GACnBrC,EAAM,oBAAoBuC,GAC1BvC,EAAM,QAAQkC,IACR,SAAUrK,GAAO;AACf,UAAI;AACA,QAAAqK,EAAOrK,CAAK;AAAA,MAChB,SACOwC,GAAK;AACR,QAAA0F,EAAY,MAAM1F,CAAG;AAAA,MACzB;AAAA,IACJ,IACEgD,EAAO,UAAU,OACvB2C,EAAM,SAASoC,IACT,SAAU/H,GAAK;AACb,UAAI;AACA,QAAA+H,EAAQ/H,CAAG;AAAA,MACf,SACOA,GAAK;AACR,QAAA0F,EAAY,MAAM1F,CAAG;AAAA,MACzB,UAChB;AACoB,aAAK,YAAW;AAAA,MACpB;AAAA,IACJ,IACEgD,EAAO,UAAU,QACvB2C,EAAM,YAAYmC,IACZ,WAAY;AACV,UAAI;AACA,QAAAA,EAAU;AAAA,MACd,SACO9H,GAAK;AACR,QAAA0F,EAAY,MAAM1F,CAAG;AAAA,MACzB,UAChB;AACoB,aAAK,YAAW;AAAA,MACpB;AAAA,IACJ,IACEgD,EAAO,UAAU,WAChB2C;AAAA,EACX;AACA,SAAAsC,EAAmB,UAAU,cAAc,WAAY;AACnD,QAAIzJ;AACJ,QAAI,CAAC,KAAK,qBAAqB,KAAK,kBAAiB,GAAI;AACrD,UAAI2J,IAAW,KAAK;AACpB,MAAAnF,EAAO,UAAU,YAAY,KAAK,IAAI,GACtC,CAACmF,OAAc3J,IAAK,KAAK,gBAAgB,QAAQA,MAAO,UAAkBA,EAAG,KAAK,IAAI;AAAA,IAC1F;AAAA,EACJ,GACOyJ;AACX,GAAExC,EAAU,GCzDD2C,KAA0BtF,GAAiB,SAAUE,GAAQ;AACpE,SAAO,WAAuC;AAC1C,IAAAA,EAAO,IAAI,GACX,KAAK,OAAO,2BACZ,KAAK,UAAU;AAAA,EACnB;AACJ,CAAC,GCDGqF,MAAW,SAAUrF,GAAQ;AAC7B,EAAA1C,EAAU+H,GAASrF,CAAM;AACzB,WAASqF,IAAU;AACf,QAAI1C,IAAQ3C,EAAO,KAAK,IAAI,KAAK;AACjC,WAAA2C,EAAM,SAAS,IACfA,EAAM,mBAAmB,MACzBA,EAAM,YAAY,CAAA,GAClBA,EAAM,YAAY,IAClBA,EAAM,WAAW,IACjBA,EAAM,cAAc,MACbA;AAAA,EACX;AACA,SAAA0C,EAAQ,UAAU,OAAO,SAAUvB,GAAU;AACzC,QAAIwB,IAAU,IAAIC,GAAiB,MAAM,IAAI;AAC7C,WAAAD,EAAQ,WAAWxB,GACZwB;AAAA,EACX,GACAD,EAAQ,UAAU,iBAAiB,WAAY;AAC3C,QAAI,KAAK;AACL,YAAM,IAAID,GAAuB;AAAA,EAEzC,GACAC,EAAQ,UAAU,OAAO,SAAU7K,GAAO;AACtC,QAAImI,IAAQ;AACZ,IAAAJ,EAAa,WAAY;AACrB,UAAI7B,GAAKlF;AAET,UADAmH,EAAM,eAAc,GAChB,CAACA,EAAM,WAAW;AAClB,QAAKA,EAAM,qBACPA,EAAM,mBAAmB,MAAM,KAAKA,EAAM,SAAS;AAEvD,YAAI;AACA,mBAAS/B,IAAKlC,EAASiE,EAAM,gBAAgB,GAAG6C,IAAK5E,EAAG,KAAI,GAAI,CAAC4E,EAAG,MAAMA,IAAK5E,EAAG,QAAQ;AACtF,gBAAI6E,IAAWD,EAAG;AAClB,YAAAC,EAAS,KAAKjL,CAAK;AAAA,UACvB;AAAA,QACJ,SACOyG,GAAO;AAAE,UAAAP,IAAM,EAAE,OAAOO,EAAK;AAAA,QAAI,UACxD;AACoB,cAAI;AACA,YAAIuE,KAAM,CAACA,EAAG,SAAShK,IAAKoF,EAAG,WAASpF,EAAG,KAAKoF,CAAE;AAAA,UACtD,UACpB;AAA8B,gBAAIF,EAAK,OAAMA,EAAI;AAAA,UAAO;AAAA,QACxC;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL,GACA2E,EAAQ,UAAU,QAAQ,SAAUrI,GAAK;AACrC,QAAI2F,IAAQ;AACZ,IAAAJ,EAAa,WAAY;AAErB,UADAI,EAAM,eAAc,GAChB,CAACA,EAAM,WAAW;AAClB,QAAAA,EAAM,WAAWA,EAAM,YAAY,IACnCA,EAAM,cAAc3F;AAEpB,iBADI0I,IAAY/C,EAAM,WACf+C,EAAU;AACb,UAAAA,EAAU,MAAK,EAAG,MAAM1I,CAAG;AAAA,MAEnC;AAAA,IACJ,CAAC;AAAA,EACL,GACAqI,EAAQ,UAAU,WAAW,WAAY;AACrC,QAAI1C,IAAQ;AACZ,IAAAJ,EAAa,WAAY;AAErB,UADAI,EAAM,eAAc,GAChB,CAACA,EAAM,WAAW;AAClB,QAAAA,EAAM,YAAY;AAElB,iBADI+C,IAAY/C,EAAM,WACf+C,EAAU;AACb,UAAAA,EAAU,MAAK,EAAG,SAAQ;AAAA,MAElC;AAAA,IACJ,CAAC;AAAA,EACL,GACAL,EAAQ,UAAU,cAAc,WAAY;AACxC,SAAK,YAAY,KAAK,SAAS,IAC/B,KAAK,YAAY,KAAK,mBAAmB;AAAA,EAC7C,GACA,OAAO,eAAeA,EAAQ,WAAW,YAAY;AAAA,IACjD,KAAK,WAAY;AACb,UAAI7J;AACJ,eAASA,IAAK,KAAK,eAAe,QAAQA,MAAO,SAAS,SAASA,EAAG,UAAU;AAAA,IACpF;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EACtB,CAAK,GACD6J,EAAQ,UAAU,gBAAgB,SAAUtB,GAAY;AACpD,gBAAK,eAAc,GACZ/D,EAAO,UAAU,cAAc,KAAK,MAAM+D,CAAU;AAAA,EAC/D,GACAsB,EAAQ,UAAU,aAAa,SAAUtB,GAAY;AACjD,gBAAK,eAAc,GACnB,KAAK,wBAAwBA,CAAU,GAChC,KAAK,gBAAgBA,CAAU;AAAA,EAC1C,GACAsB,EAAQ,UAAU,kBAAkB,SAAUtB,GAAY;AACtD,QAAIpB,IAAQ,MACRnH,IAAK,MAAMmK,IAAWnK,EAAG,UAAUoK,IAAYpK,EAAG,WAAWkK,IAAYlK,EAAG;AAChF,WAAImK,KAAYC,IACLhE,MAEX,KAAK,mBAAmB,MACxB8D,EAAU,KAAK3B,CAAU,GAClB,IAAIvD,EAAa,WAAY;AAChC,MAAAmC,EAAM,mBAAmB,MACzBtC,EAAUqF,GAAW3B,CAAU;AAAA,IACnC,CAAC;AAAA,EACL,GACAsB,EAAQ,UAAU,0BAA0B,SAAUtB,GAAY;AAC9D,QAAIvI,IAAK,MAAMmK,IAAWnK,EAAG,UAAUqK,IAAcrK,EAAG,aAAaoK,IAAYpK,EAAG;AACpF,IAAImK,IACA5B,EAAW,MAAM8B,CAAW,IAEvBD,KACL7B,EAAW,SAAQ;AAAA,EAE3B,GACAsB,EAAQ,UAAU,eAAe,WAAY;AACzC,QAAIhC,IAAa,IAAIO,EAAU;AAC/B,WAAAP,EAAW,SAAS,MACbA;AAAA,EACX,GACAgC,EAAQ,SAAS,SAAU3C,GAAauB,GAAQ;AAC5C,WAAO,IAAIsB,GAAiB7C,GAAauB,CAAM;AAAA,EACnD,GACOoB;AACX,GAAEzB,CAAU,GAER2B,MAAoB,SAAUvF,GAAQ;AACtC,EAAA1C,EAAUiI,GAAkBvF,CAAM;AAClC,WAASuF,EAAiB7C,GAAauB,GAAQ;AAC3C,QAAItB,IAAQ3C,EAAO,KAAK,IAAI,KAAK;AACjC,WAAA2C,EAAM,cAAcD,GACpBC,EAAM,SAASsB,GACRtB;AAAA,EACX;AACA,SAAA4C,EAAiB,UAAU,OAAO,SAAU/K,GAAO;AAC/C,QAAIgB,GAAIoF;AACR,KAACA,KAAMpF,IAAK,KAAK,iBAAiB,QAAQA,MAAO,SAAS,SAASA,EAAG,UAAU,QAAQoF,MAAO,UAAkBA,EAAG,KAAKpF,GAAIhB,CAAK;AAAA,EACtI,GACA+K,EAAiB,UAAU,QAAQ,SAAUvI,GAAK;AAC9C,QAAIxB,GAAIoF;AACR,KAACA,KAAMpF,IAAK,KAAK,iBAAiB,QAAQA,MAAO,SAAS,SAASA,EAAG,WAAW,QAAQoF,MAAO,UAAkBA,EAAG,KAAKpF,GAAIwB,CAAG;AAAA,EACrI,GACAuI,EAAiB,UAAU,WAAW,WAAY;AAC9C,QAAI/J,GAAIoF;AACR,KAACA,KAAMpF,IAAK,KAAK,iBAAiB,QAAQA,MAAO,SAAS,SAASA,EAAG,cAAc,QAAQoF,MAAO,UAAkBA,EAAG,KAAKpF,CAAE;AAAA,EACnI,GACA+J,EAAiB,UAAU,aAAa,SAAUxB,GAAY;AAC1D,QAAIvI,GAAIoF;AACR,YAAQA,KAAMpF,IAAK,KAAK,YAAY,QAAQA,MAAO,SAAS,SAASA,EAAG,UAAUuI,CAAU,OAAO,QAAQnD,MAAO,SAASA,IAAKgB;AAAA,EACpI,GACO2D;AACX,GAAEF,EAAO,GC7JLS,KAAmB,SAAU9F,GAAQ;AACrC,EAAA1C,EAAUwI,GAAiB9F,CAAM;AACjC,WAAS8F,EAAgBC,GAAQ;AAC7B,QAAIpD,IAAQ3C,EAAO,KAAK,IAAI,KAAK;AACjC,WAAA2C,EAAM,SAASoD,GACRpD;AAAA,EACX;AACA,gBAAO,eAAemD,EAAgB,WAAW,SAAS;AAAA,IACtD,KAAK,WAAY;AACb,aAAO,KAAK,SAAQ;AAAA,IACxB;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EACtB,CAAK,GACDA,EAAgB,UAAU,aAAa,SAAU/B,GAAY;AACzD,QAAIiC,IAAehG,EAAO,UAAU,WAAW,KAAK,MAAM+D,CAAU;AACpE,YAACiC,EAAa,UAAUjC,EAAW,KAAK,KAAK,MAAM,GAC5CiC;AAAA,EACX,GACAF,EAAgB,UAAU,WAAW,WAAY;AAC7C,QAAItK,IAAK,MAAMmK,IAAWnK,EAAG,UAAUqK,IAAcrK,EAAG,aAAauK,IAASvK,EAAG;AACjF,QAAImK;AACA,YAAME;AAEV,gBAAK,eAAc,GACZE;AAAA,EACX,GACAD,EAAgB,UAAU,OAAO,SAAUtL,GAAO;AAC9C,IAAAwF,EAAO,UAAU,KAAK,KAAK,MAAO,KAAK,SAASxF,CAAK;AAAA,EACzD,GACOsL;AACX,GAAET,EAAO,GCjCEY,KAAwB;AAAA,EAC/B,KAAK,WAAY;AACb,WAA0C,KAAM,IAAG;AAAA,EACvD;AAEJ,GCHIC,MAAU,SAAUlG,GAAQ;AAC5B,EAAA1C,EAAU4I,GAAQlG,CAAM;AACxB,WAASkG,EAAOC,GAAWC,GAAM;AAC7B,WAAOpG,EAAO,KAAK,IAAI,KAAK;AAAA,EAChC;AACA,SAAAkG,EAAO,UAAU,WAAW,SAAUG,GAAOC,GAAO;AAEhD,WAAO;AAAA,EACX,GACOJ;AACX,GAAE1F,CAAY,GCXH+F,KAAmB;AAAA,EAC1B,aAAa,SAAUvE,GAASC,GAAS;AAErC,aADIC,IAAO,CAAA,GACFC,IAAK,GAAGA,IAAK,UAAU,QAAQA;AACpC,MAAAD,EAAKC,IAAK,CAAC,IAAI,UAAUA,CAAE;AAM/B,WAAO,YAAY,MAAM,QAAQpD,EAAc,CAACiD,GAASC,CAAO,GAAGpD,EAAOqD,CAAI,CAAC,CAAC;AAAA,EACpF;AAAA,EACA,eAAe,SAAUE,GAAQ;AAE7B,WAAwF,cAAeA,CAAM;AAAA,EACjH;AAAA,EACA,UAAU;AACd,GCdIoE,MAAe,SAAUxG,GAAQ;AACjC,EAAA1C,EAAUkJ,GAAaxG,CAAM;AAC7B,WAASwG,EAAYL,GAAWC,GAAM;AAClC,QAAIzD,IAAQ3C,EAAO,KAAK,MAAMmG,GAAWC,CAAI,KAAK;AAClD,WAAAzD,EAAM,YAAYwD,GAClBxD,EAAM,OAAOyD,GACbzD,EAAM,UAAU,IACTA;AAAA,EACX;AACA,SAAA6D,EAAY,UAAU,WAAW,SAAUH,GAAOC,GAAO;AACrD,QAAI9K;AAEJ,QADI8K,MAAU,WAAUA,IAAQ,IAC5B,KAAK;AACL,aAAO;AAEX,SAAK,QAAQD;AACb,QAAItJ,IAAK,KAAK,IACVoJ,IAAY,KAAK;AACrB,WAAIpJ,KAAM,SACN,KAAK,KAAK,KAAK,eAAeoJ,GAAWpJ,GAAIuJ,CAAK,IAEtD,KAAK,UAAU,IACf,KAAK,QAAQA,GACb,KAAK,MAAM9K,IAAK,KAAK,QAAQ,QAAQA,MAAO,SAASA,IAAK,KAAK,eAAe2K,GAAW,KAAK,IAAIG,CAAK,GAChG;AAAA,EACX,GACAE,EAAY,UAAU,iBAAiB,SAAUL,GAAWM,GAAKH,GAAO;AACpE,WAAIA,MAAU,WAAUA,IAAQ,IACzBC,GAAiB,YAAYJ,EAAU,MAAM,KAAKA,GAAW,IAAI,GAAGG,CAAK;AAAA,EACpF,GACAE,EAAY,UAAU,iBAAiB,SAAUE,GAAY3J,GAAIuJ,GAAO;AAEpE,QADIA,MAAU,WAAUA,IAAQ,IAC5BA,KAAS,QAAQ,KAAK,UAAUA,KAAS,KAAK,YAAY;AAC1D,aAAOvJ;AAEX,IAAIA,KAAM,QACNwJ,GAAiB,cAAcxJ,CAAE;AAAA,EAGzC,GACAyJ,EAAY,UAAU,UAAU,SAAUH,GAAOC,GAAO;AACpD,QAAI,KAAK;AACL,aAAO,IAAI,MAAM,8BAA8B;AAEnD,SAAK,UAAU;AACf,QAAInO,IAAQ,KAAK,SAASkO,GAAOC,CAAK;AACtC,QAAInO;AACA,aAAOA;AAEN,IAAI,KAAK,YAAY,MAAS,KAAK,MAAM,SAC1C,KAAK,KAAK,KAAK,eAAe,KAAK,WAAW,KAAK,IAAI,IAAI;AAAA,EAEnE,GACAqO,EAAY,UAAU,WAAW,SAAUH,GAAOM,GAAQ;AACtD,QAAIC,IAAU,IACVC;AACJ,QAAI;AACA,WAAK,KAAKR,CAAK;AAAA,IACnB,SACOtL,GAAG;AACN,MAAA6L,IAAU,IACVC,IAAa9L,KAAQ,IAAI,MAAM,oCAAoC;AAAA,IACvE;AACA,QAAI6L;AACA,kBAAK,YAAW,GACTC;AAAA,EAEf,GACAL,EAAY,UAAU,cAAc,WAAY;AAC5C,QAAI,CAAC,KAAK,QAAQ;AACd,UAAIhL,IAAK,MAAMuB,IAAKvB,EAAG,IAAI2K,IAAY3K,EAAG,WACtCsL,IAAUX,EAAU;AACxB,WAAK,OAAO,KAAK,QAAQ,KAAK,YAAY,MAC1C,KAAK,UAAU,IACf9F,EAAUyG,GAAS,IAAI,GACnB/J,KAAM,SACN,KAAK,KAAK,KAAK,eAAeoJ,GAAWpJ,GAAI,IAAI,IAErD,KAAK,QAAQ,MACbiD,EAAO,UAAU,YAAY,KAAK,IAAI;AAAA,IAC1C;AAAA,EACJ,GACOwG;AACX,GAAEN,EAAM,GCtFJa,MAAa,WAAY;AACzB,WAASA,EAAUC,GAAqBC,GAAK;AACzC,IAAIA,MAAQ,WAAUA,IAAMF,EAAU,MACtC,KAAK,sBAAsBC,GAC3B,KAAK,MAAMC;AAAA,EACf;AACA,SAAAF,EAAU,UAAU,WAAW,SAAUX,GAAME,GAAOD,GAAO;AACzD,WAAIC,MAAU,WAAUA,IAAQ,IACzB,IAAI,KAAK,oBAAoB,MAAMF,CAAI,EAAE,SAASC,GAAOC,CAAK;AAAA,EACzE,GACAS,EAAU,MAAMd,GAAsB,KAC/Bc;AACX,MCXIG,MAAkB,SAAUlH,GAAQ;AACpC,EAAA1C,EAAU4J,GAAgBlH,CAAM;AAChC,WAASkH,EAAeC,GAAiBF,GAAK;AAC1C,IAAIA,MAAQ,WAAUA,IAAMF,GAAU;AACtC,QAAIpE,IAAQ3C,EAAO,KAAK,MAAMmH,GAAiBF,CAAG,KAAK;AACvD,WAAAtE,EAAM,UAAU,CAAA,GAChBA,EAAM,UAAU,IACTA;AAAA,EACX;AACA,SAAAuE,EAAe,UAAU,QAAQ,SAAUE,GAAQ;AAC/C,QAAIN,IAAU,KAAK;AACnB,QAAI,KAAK,SAAS;AACd,MAAAA,EAAQ,KAAKM,CAAM;AACnB;AAAA,IACJ;AACA,QAAIjP;AACJ,SAAK,UAAU;AACf;AACI,UAAKA,IAAQiP,EAAO,QAAQA,EAAO,OAAOA,EAAO,KAAK;AAClD;AAAA,WAEEA,IAASN,EAAQ,MAAK;AAEhC,QADA,KAAK,UAAU,IACX3O,GAAO;AACP,aAAQiP,IAASN,EAAQ;AACrB,QAAAM,EAAO,YAAW;AAEtB,YAAMjP;AAAA,IACV;AAAA,EACJ,GACO+O;AACX,GAAEH,EAAS,GC/BAM,KAAiB,IAAIH,GAAeV,EAAW;ACDnD,SAASc,GAAY9M,GAAO;AAC/B,SAAOA,KAASqF,EAAWrF,EAAM,QAAQ;AAC7C;ACDA,SAAS+M,GAAK9N,GAAK;AACf,SAAOA,EAAIA,EAAI,SAAS,CAAC;AAC7B;AACO,SAAS+N,GAAkBtF,GAAM;AACpC,SAAOrC,EAAW0H,GAAKrF,CAAI,CAAC,IAAIA,EAAK,IAAG,IAAK;AACjD;AACO,SAASuF,GAAavF,GAAM;AAC/B,SAAOoF,GAAYC,GAAKrF,CAAI,CAAC,IAAIA,EAAK,IAAG,IAAK;AAClD;ACVO,IAAIwF,MAAe,SAAUnE,GAAG;AAAE,SAAOA,KAAK,OAAOA,EAAE,UAAW,YAAY,OAAOA,KAAM;AAAY;ACCvG,SAASoE,GAAUnN,GAAO;AAC7B,SAAOqF,EAAyDrF,GAAM,IAAI;AAC9E;ACDO,SAASoN,GAAoBrM,GAAO;AACvC,SAAOsE,EAAWtE,EAAM8I,EAAiB,CAAC;AAC9C;ACHO,SAASwD,GAAgBC,GAAK;AACjC,SAAO,OAAO,iBAAiBjI,EAAqDiI,IAAI,OAAO,aAAa,CAAC;AACjH;ACHO,SAASC,GAAiCxM,GAAO;AACpD,SAAO,IAAI,UAAU,mBAAmBA,MAAU,QAAQ,OAAOA,KAAU,WAAW,sBAAsB,MAAMA,IAAQ,OAAO,0HAA0H;AAC/P;ACFO,SAASyM,KAAoB;AAChC,SAAI,OAAO,UAAW,cAAc,CAAC,OAAO,WACjC,eAEJ,OAAO;AAClB;AACO,IAAIC,KAAWD,GAAiB;ACJhC,SAASE,GAAW3M,GAAO;AAC9B,SAAOsE,EAAyDtE,IAAM4M,EAAe,CAAC;AAC1F;ACFO,SAASC,GAAmCC,GAAgB;AAC/D,SAAOhJ,GAAiB,MAAM,WAAW,WAAgD;AACrF,QAAIpG,GAAQuC,GAAIhB,GAAO8N;AACvB,WAAOrK,GAAY,MAAM,SAAU2C,GAAI;AACnC,cAAQA,EAAG,OAAK;AAAA,QACZ,KAAK;AACD,UAAA3H,IAASoP,EAAe,UAAS,GACjCzH,EAAG,QAAQ;AAAA,QACf,KAAK;AACD,UAAAA,EAAG,KAAK,KAAK,CAAC,GAAC,EAAI,GAAG,EAAE,CAAC,GACzBA,EAAG,QAAQ;AAAA,QACf,KAAK;AAED,iBAAO,CAAC,GAAGxB,EAAQnG,EAAO,KAAI,CAAE,CAAC;AAAA,QACrC,KAAK;AAED,iBADAuC,IAAKoF,EAAG,QAAQpG,IAAQgB,EAAG,OAAO8M,IAAO9M,EAAG,MACvC8M,IACE,CAAC,GAAGlJ,EAAQ,MAAM,CAAC,IADR,CAAC,GAAG,CAAC;AAAA,QAE3B,KAAK;AAAG,iBAAO,CAAC,GAAGwB,EAAG,KAAI,CAAE;AAAA,QAC5B,KAAK;AAAG,iBAAO,CAAC,GAAGxB,EAAQ5E,CAAK,CAAC;AAAA,QACjC,KAAK;AAAG,iBAAO,CAAC,GAAGoG,EAAG,KAAI,CAAE;AAAA,QAC5B,KAAK;AACD,iBAAAA,EAAG,KAAI,GACA,CAAC,GAAG,CAAC;AAAA,QAChB,KAAK;AAAG,iBAAO,CAAC,GAAG,EAAE;AAAA,QACrB,KAAK;AACD,iBAAA3H,EAAO,YAAW,GACX,CAAC,CAAC;AAAA,QACb,KAAK;AAAI,iBAAO,CAAC,CAAC;AAAA,MAClC;AAAA,IACQ,CAAC;AAAA,EACL,CAAC;AACL;AACO,SAASsP,GAAqBT,GAAK;AACtC,SAAOjI,EAAqDiI,GAAI,SAAS;AAC7E;ACzBO,SAASU,EAAUjN,GAAO;AAC7B,MAAIA,aAAiBqI;AACjB,WAAOrI;AAEX,MAAIA,KAAS,MAAM;AACf,QAAIqM,GAAoBrM,CAAK;AACzB,aAAOkN,GAAsBlN,CAAK;AAEtC,QAAImM,GAAYnM,CAAK;AACjB,aAAOmN,GAAcnN,CAAK;AAE9B,QAAIoM,GAAUpM,CAAK;AACf,aAAOoN,GAAYpN,CAAK;AAE5B,QAAIsM,GAAgBtM,CAAK;AACrB,aAAOqN,GAAkBrN,CAAK;AAElC,QAAI2M,GAAW3M,CAAK;AAChB,aAAOsN,GAAatN,CAAK;AAE7B,QAAIgN,GAAqBhN,CAAK;AAC1B,aAAOuN,GAAuBvN,CAAK;AAAA,EAE3C;AACA,QAAMwM,GAAiCxM,CAAK;AAChD;AACO,SAASkN,GAAsBX,GAAK;AACvC,SAAO,IAAIlE,EAAW,SAAUG,GAAY;AACxC,QAAIgF,IAAMjB,EAAIzD,EAAiB,EAAC;AAChC,QAAIxE,EAAWkJ,EAAI,SAAS;AACxB,aAAOA,EAAI,UAAUhF,CAAU;AAEnC,UAAM,IAAI,UAAU,gEAAgE;AAAA,EACxF,CAAC;AACL;AACO,SAAS2E,GAAcM,GAAO;AACjC,SAAO,IAAIpF,EAAW,SAAUG,GAAY;AACxC,aAAS7I,IAAI,GAAGA,IAAI8N,EAAM,UAAU,CAACjF,EAAW,QAAQ7I;AACpD,MAAA6I,EAAW,KAAKiF,EAAM9N,CAAC,CAAC;AAE5B,IAAA6I,EAAW,SAAQ;AAAA,EACvB,CAAC;AACL;AACO,SAAS4E,GAAYM,GAAS;AACjC,SAAO,IAAIrF,EAAW,SAAUG,GAAY;AACxC,IAAAkF,EACK,KAAK,SAAUzO,GAAO;AACvB,MAAKuJ,EAAW,WACZA,EAAW,KAAKvJ,CAAK,GACrBuJ,EAAW,SAAQ;AAAA,IAE3B,GAAG,SAAU/G,GAAK;AAAE,aAAO+G,EAAW,MAAM/G,CAAG;AAAA,IAAG,CAAC,EAC9C,KAAK,MAAMqF,EAAoB;AAAA,EACxC,CAAC;AACL;AACO,SAASwG,GAAaK,GAAU;AACnC,SAAO,IAAItF,EAAW,SAAUG,GAAY;AACxC,QAAIrD,GAAKlF;AACT,QAAI;AACA,eAAS2N,IAAazK,EAASwK,CAAQ,GAAGE,IAAeD,EAAW,KAAI,GAAI,CAACC,EAAa,MAAMA,IAAeD,EAAW,KAAI,GAAI;AAC9H,YAAI3O,IAAQ4O,EAAa;AAEzB,YADArF,EAAW,KAAKvJ,CAAK,GACjBuJ,EAAW;AACX;AAAA,MAER;AAAA,IACJ,SACO9C,GAAO;AAAE,MAAAP,IAAM,EAAE,OAAOO,EAAK;AAAA,IAAI,UAChD;AACY,UAAI;AACA,QAAImI,KAAgB,CAACA,EAAa,SAAS5N,IAAK2N,EAAW,WAAS3N,EAAG,KAAK2N,CAAU;AAAA,MAC1F,UACZ;AAAsB,YAAIzI,EAAK,OAAMA,EAAI;AAAA,MAAO;AAAA,IACxC;AACA,IAAAqD,EAAW,SAAQ;AAAA,EACvB,CAAC;AACL;AACO,SAAS6E,GAAkBS,GAAe;AAC7C,SAAO,IAAIzF,EAAW,SAAUG,GAAY;AACxC,IAAAuF,GAAQD,GAAetF,CAAU,EAAE,MAAM,SAAU/G,GAAK;AAAE,aAAO+G,EAAW,MAAM/G,CAAG;AAAA,IAAG,CAAC;AAAA,EAC7F,CAAC;AACL;AACO,SAAS8L,GAAuBT,GAAgB;AACnD,SAAOO,GAAkBR,GAAmCC,CAAc,CAAC;AAC/E;AACA,SAASiB,GAAQD,GAAetF,GAAY;AACxC,MAAIwF,GAAiBC,GACjB7I,GAAKnF;AACT,SAAOgC,GAAU,MAAM,QAAQ,QAAQ,WAAY;AAC/C,QAAIhD,GAAOgH;AACX,WAAOvD,GAAY,MAAM,SAAU2C,GAAI;AACnC,cAAQA,EAAG,OAAK;AAAA,QACZ,KAAK;AACD,UAAAA,EAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,GAC1B2I,IAAkB3J,GAAcyJ,CAAa,GAC7CzI,EAAG,QAAQ;AAAA,QACf,KAAK;AAAG,iBAAO,CAAC,GAAG2I,EAAgB,KAAI,CAAE;AAAA,QACzC,KAAK;AACD,cAAMC,IAAoB5I,EAAG,QAAQ,EAAC4I,EAAkB,KAAO,QAAO,CAAC,GAAG,CAAC;AAG3E,cAFAhP,IAAQgP,EAAkB,OAC1BzF,EAAW,KAAKvJ,CAAK,GACjBuJ,EAAW;AACX,mBAAO,CAAC,CAAC;AAEb,UAAAnD,EAAG,QAAQ;AAAA,QACf,KAAK;AAAG,iBAAO,CAAC,GAAG,CAAC;AAAA,QACpB,KAAK;AAAG,iBAAO,CAAC,GAAG,EAAE;AAAA,QACrB,KAAK;AACD,iBAAAY,IAAQZ,EAAG,KAAI,GACfD,IAAM,EAAE,OAAOa,EAAK,GACb,CAAC,GAAG,EAAE;AAAA,QACjB,KAAK;AAED,iBADAZ,EAAG,KAAK,KAAK,CAAC,GAAC,EAAI,GAAG,EAAE,CAAC,GACnB4I,KAAqB,CAACA,EAAkB,SAAShO,IAAK+N,EAAgB,UACrE,CAAC,GAAG/N,EAAG,KAAK+N,CAAe,CAAC,IAD0D,CAAC,GAAG,CAAC;AAAA,QAEtG,KAAK;AACD,UAAA3I,EAAG,KAAI,GACPA,EAAG,QAAQ;AAAA,QACf,KAAK;AAAG,iBAAO,CAAC,GAAG,EAAE;AAAA,QACrB,KAAK;AACD,cAAID,EAAK,OAAMA,EAAI;AACnB,iBAAO,CAAC,CAAC;AAAA,QACb,KAAK;AAAI,iBAAO,CAAC,CAAC;AAAA,QAClB,KAAK;AACD,iBAAAoD,EAAW,SAAQ,GACZ,CAAC,CAAC;AAAA,MAC7B;AAAA,IACQ,CAAC;AAAA,EACL,CAAC;AACL;AC7IO,SAAS0F,EAAgBC,GAAoBvD,GAAWC,GAAME,GAAOqD,GAAQ;AAChF,EAAIrD,MAAU,WAAUA,IAAQ,IAC5BqD,MAAW,WAAUA,IAAS;AAClC,MAAIC,IAAuBzD,EAAU,SAAS,WAAY;AACtD,IAAAC,EAAI,GACAuD,IACAD,EAAmB,IAAI,KAAK,SAAS,MAAMpD,CAAK,CAAC,IAGjD,KAAK,YAAW;AAAA,EAExB,GAAGA,CAAK;AAER,MADAoD,EAAmB,IAAIE,CAAoB,GACvC,CAACD;AACD,WAAOC;AAEf;ACbO,SAASC,GAAU1D,GAAWG,GAAO;AACxC,SAAIA,MAAU,WAAUA,IAAQ,IACzB7B,EAAQ,SAAUR,GAAQF,GAAY;AACzC,IAAAE,EAAO,UAAUW,EAAyBb,GAAY,SAAUvJ,GAAO;AAAE,aAAOiP,EAAgB1F,GAAYoC,GAAW,WAAY;AAAE,eAAOpC,EAAW,KAAKvJ,CAAK;AAAA,MAAG,GAAG8L,CAAK;AAAA,IAAG,GAAG,WAAY;AAAE,aAAOmD,EAAgB1F,GAAYoC,GAAW,WAAY;AAAE,eAAOpC,EAAW;MAAY,GAAGuC,CAAK;AAAA,IAAG,GAAG,SAAUtJ,GAAK;AAAE,aAAOyM,EAAgB1F,GAAYoC,GAAW,WAAY;AAAE,eAAOpC,EAAW,MAAM/G,CAAG;AAAA,MAAG,GAAGsJ,CAAK;AAAA,IAAG,CAAC,CAAC;AAAA,EACpa,CAAC;AACL;ACPO,SAASwD,GAAY3D,GAAWG,GAAO;AAC1C,SAAIA,MAAU,WAAUA,IAAQ,IACzB7B,EAAQ,SAAUR,GAAQF,GAAY;AACzC,IAAAA,EAAW,IAAIoC,EAAU,SAAS,WAAY;AAAE,aAAOlC,EAAO,UAAUF,CAAU;AAAA,IAAG,GAAGuC,CAAK,CAAC;AAAA,EAClG,CAAC;AACL;ACHO,SAASyD,GAAmBxO,GAAO4K,GAAW;AACjD,SAAOqC,EAAUjN,CAAK,EAAE,KAAKuO,GAAY3D,CAAS,GAAG0D,GAAU1D,CAAS,CAAC;AAC7E;ACFO,SAAS6D,GAAgBzO,GAAO4K,GAAW;AAC9C,SAAOqC,EAAUjN,CAAK,EAAE,KAAKuO,GAAY3D,CAAS,GAAG0D,GAAU1D,CAAS,CAAC;AAC7E;ACJO,SAAS8D,GAAc1O,GAAO4K,GAAW;AAC5C,SAAO,IAAIvC,EAAW,SAAUG,GAAY;AACxC,QAAI7I,IAAI;AACR,WAAOiL,EAAU,SAAS,WAAY;AAClC,MAAIjL,MAAMK,EAAM,SACZwI,EAAW,SAAQ,KAGnBA,EAAW,KAAKxI,EAAML,GAAG,CAAC,GACrB6I,EAAW,UACZ,KAAK,SAAQ;AAAA,IAGzB,CAAC;AAAA,EACL,CAAC;AACL;ACZO,SAASmG,GAAiB3O,GAAO4K,GAAW;AAC/C,SAAO,IAAIvC,EAAW,SAAUG,GAAY;AACxC,QAAIkE;AACJ,WAAAwB,EAAgB1F,GAAYoC,GAAW,WAAY;AAC/C8B,MAAAA,IAAW1M,EAAM4M,EAAe,EAAC,GACjCsB,EAAgB1F,GAAYoC,GAAW,WAAY;AAC/C,YAAI3K,GACAhB,GACA8N;AACJ,YAAI;AACA,UAAC9M,IAAKyM,EAAS,QAAQzN,IAAQgB,EAAG,OAAO8M,IAAO9M,EAAG;AAAA,QACvD,SACOwB,GAAK;AACR,UAAA+G,EAAW,MAAM/G,CAAG;AACpB;AAAA,QACJ;AACA,QAAIsL,IACAvE,EAAW,SAAQ,IAGnBA,EAAW,KAAKvJ,CAAK;AAAA,MAE7B,GAAG,GAAG,EAAI;AAAA,IACd,CAAC,GACM,WAAY;AAAE,aAAOqF,EAA+DoI,GAAS,MAAM,KAAKA,EAAS,OAAM;AAAA,IAAI;AAAA,EACtI,CAAC;AACL;AC5BO,SAASkC,GAAsB5O,GAAO4K,GAAW;AACpD,MAAI,CAAC5K;AACD,UAAM,IAAI,MAAM,yBAAyB;AAE7C,SAAO,IAAIqI,EAAW,SAAUG,GAAY;AACxC,IAAA0F,EAAgB1F,GAAYoC,GAAW,WAAY;AAC/C,UAAI8B,IAAW1M,EAAM,OAAO,aAAa,EAAC;AAC1C,MAAAkO,EAAgB1F,GAAYoC,GAAW,WAAY;AAC/C,QAAA8B,EAAS,KAAI,EAAG,KAAK,SAAU/O,GAAQ;AACnC,UAAIA,EAAO,OACP6K,EAAW,SAAQ,IAGnBA,EAAW,KAAK7K,EAAO,KAAK;AAAA,QAEpC,CAAC;AAAA,MACL,GAAG,GAAG,EAAI;AAAA,IACd,CAAC;AAAA,EACL,CAAC;AACL;ACnBO,SAASkR,GAA2B7O,GAAO4K,GAAW;AACzD,SAAOgE,GAAsB/B,GAAmC7M,CAAK,GAAG4K,CAAS;AACrF;ACSO,SAASkE,GAAU9O,GAAO4K,GAAW;AACxC,MAAI5K,KAAS,MAAM;AACf,QAAIqM,GAAoBrM,CAAK;AACzB,aAAOwO,GAAmBxO,GAAO4K,CAAS;AAE9C,QAAIuB,GAAYnM,CAAK;AACjB,aAAO0O,GAAc1O,GAAO4K,CAAS;AAEzC,QAAIwB,GAAUpM,CAAK;AACf,aAAOyO,GAAgBzO,GAAO4K,CAAS;AAE3C,QAAI0B,GAAgBtM,CAAK;AACrB,aAAO4O,GAAsB5O,GAAO4K,CAAS;AAEjD,QAAI+B,GAAW3M,CAAK;AAChB,aAAO2O,GAAiB3O,GAAO4K,CAAS;AAE5C,QAAIoC,GAAqBhN,CAAK;AAC1B,aAAO6O,GAA2B7O,GAAO4K,CAAS;AAAA,EAE1D;AACA,QAAM4B,GAAiCxM,CAAK;AAChD;ACjCO,SAAS0D,GAAK1D,GAAO4K,GAAW;AACnC,SAAOA,IAAYkE,GAAU9O,GAAO4K,CAAS,IAAIqC,EAAUjN,CAAK;AACpE;ACFO,SAAS+O,EAAIC,GAAS9M,GAAS;AAClC,SAAOgH,EAAQ,SAAUR,GAAQF,GAAY;AACzC,QAAIxD,IAAQ;AACZ,IAAA0D,EAAO,UAAUW,EAAyBb,GAAY,SAAUvJ,GAAO;AACnE,MAAAuJ,EAAW,KAAKwG,EAAQ,KAAK9M,GAASjD,GAAO+F,GAAO,CAAC;AAAA,IACzD,CAAC,CAAC;AAAA,EACN,CAAC;AACL;ACPA,IAAIiK,KAAU,MAAM;AACpB,SAASC,GAAY9G,GAAIzB,GAAM;AAC3B,SAAOsI,GAAQtI,CAAI,IAAIyB,EAAG,MAAM,QAAQ5E,EAAc,CAAA,GAAIF,EAAOqD,CAAI,CAAC,CAAC,IAAIyB,EAAGzB,CAAI;AACtF;AACO,SAASwI,GAAiB/G,GAAI;AACjC,SAAO2G,EAAI,SAAUpI,GAAM;AAAE,WAAOuI,GAAY9G,GAAIzB,CAAI;AAAA,EAAG,CAAC;AAChE;ACRA,IAAIsI,KAAU,MAAM,SAChBG,KAAiB,OAAO,gBAAgBC,KAAc,OAAO,WAAWC,KAAU,OAAO;AACtF,SAASC,GAAqB5I,GAAM;AACvC,MAAIA,EAAK,WAAW,GAAG;AACnB,QAAI6I,IAAU7I,EAAK,CAAC;AACpB,QAAIsI,GAAQO,CAAO;AACf,aAAO,EAAE,MAAMA,GAAS,MAAM,KAAI;AAEtC,QAAIC,GAAOD,CAAO,GAAG;AACjB,UAAIE,IAAOJ,GAAQE,CAAO;AAC1B,aAAO;AAAA,QACH,MAAME,EAAK,IAAI,SAAUC,GAAK;AAAE,iBAAOH,EAAQG,CAAG;AAAA,QAAG,CAAC;AAAA,QACtD,MAAMD;AAAA,MACtB;AAAA,IACQ;AAAA,EACJ;AACA,SAAO,EAAE,MAAM/I,GAAM,MAAM,KAAI;AACnC;AACA,SAAS8I,GAAOlD,GAAK;AACjB,SAAOA,KAAO,OAAOA,KAAQ,YAAY6C,GAAe7C,CAAG,MAAM8C;AACrE;ACpBO,SAASO,GAAaF,GAAMG,GAAQ;AACvC,SAAOH,EAAK,OAAO,SAAU/R,GAAQgS,GAAKhQ,GAAG;AAAE,WAAShC,EAAOgS,CAAG,IAAIE,EAAOlQ,CAAC,GAAIhC;AAAA,EAAS,GAAG,EAAE;AACpG;ACOO,SAASmS,KAAgB;AAE5B,WADInJ,IAAO,CAAA,GACFC,IAAK,GAAGA,IAAK,UAAU,QAAQA;AACpC,IAAAD,EAAKC,CAAE,IAAI,UAAUA,CAAE;AAE3B,MAAIgE,IAAYsB,GAAavF,CAAI,GAC7BoJ,IAAiB9D,GAAkBtF,CAAI,GACvC1G,IAAKsP,GAAqB5I,CAAI,GAAGqJ,IAAc/P,EAAG,MAAMyP,IAAOzP,EAAG;AACtE,MAAI+P,EAAY,WAAW;AACvB,WAAOtM,GAAK,CAAA,GAAIkH,CAAS;AAE7B,MAAIjN,IAAS,IAAI0K,EAAW4H,GAAkBD,GAAapF,GAAW8E,IAE9D,SAAUG,GAAQ;AAAE,WAAOD,GAAaF,GAAMG,CAAM;AAAA,EAAG,IAEvD9H,CAAQ,CAAC;AACjB,SAAOgI,IAAiBpS,EAAO,KAAKwR,GAAiBY,CAAc,CAAC,IAAIpS;AAC5E;AACO,SAASsS,GAAkBD,GAAapF,GAAWsF,GAAgB;AACtE,SAAIA,MAAmB,WAAUA,IAAiBnI,IAC3C,SAAUS,GAAY;AACzB,IAAA2H,GAAcvF,GAAW,WAAY;AAyBjC,eAxBIwF,IAASJ,EAAY,QACrBH,IAAS,IAAI,MAAMO,CAAM,GACzBC,IAASD,GACTE,IAAuBF,GACvBG,IAAU,SAAU5Q,GAAG;AACvB,QAAAwQ,GAAcvF,GAAW,WAAY;AACjC,cAAIlC,IAAShF,GAAKsM,EAAYrQ,CAAC,GAAGiL,CAAS,GACvC4F,IAAgB;AACpB,UAAA9H,EAAO,UAAUW,EAAyBb,GAAY,SAAUvJ,GAAO;AACnE,YAAA4Q,EAAOlQ,CAAC,IAAIV,GACPuR,MACDA,IAAgB,IAChBF,MAECA,KACD9H,EAAW,KAAK0H,EAAeL,EAAO,MAAK,CAAE,CAAC;AAAA,UAEtD,GAAG,WAAY;AACX,YAAK,EAAEQ,KACH7H,EAAW,SAAQ;AAAA,UAE3B,CAAC,CAAC;AAAA,QACN,GAAGA,CAAU;AAAA,MACjB,GACS7I,IAAI,GAAGA,IAAIyQ,GAAQzQ;AACxB,QAAA4Q,EAAQ5Q,CAAC;AAAA,IAEjB,GAAG6I,CAAU;AAAA,EACjB;AACJ;AACA,SAAS2H,GAAcvF,GAAW6F,GAAShG,GAAc;AACrD,EAAIG,IACAsD,EAAgBzD,GAAcG,GAAW6F,CAAO,IAGhDA,EAAO;AAEf;AClEO,SAASC,GAAOC,GAAWzO,GAAS;AACvC,SAAOgH,EAAQ,SAAUR,GAAQF,GAAY;AACzC,QAAIxD,IAAQ;AACZ,IAAA0D,EAAO,UAAUW,EAAyBb,GAAY,SAAUvJ,GAAO;AAAE,aAAO0R,EAAU,KAAKzO,GAASjD,GAAO+F,GAAO,KAAKwD,EAAW,KAAKvJ,CAAK;AAAA,IAAG,CAAC,CAAC;AAAA,EACzJ,CAAC;AACL;ACCO,SAAS2R,GAAWC,GAAgB;AAGvC,WAFI5Q,GAAIoF,GACJyL,IAAY,CAAA,GACPlK,IAAK,GAAGA,IAAK,UAAU,QAAQA;AACpC,IAAAkK,EAAUlK,IAAK,CAAC,IAAI,UAAUA,CAAE;AAEpC,MAAIgE,KAAa3K,IAAKiM,GAAa4E,CAAS,OAAO,QAAQ7Q,MAAO,SAASA,IAAK6L,IAC5EiF,KAA0B1L,IAAKyL,EAAU,CAAC,OAAO,QAAQzL,MAAO,SAASA,IAAK,MAC9E2L,IAAgBF,EAAU,CAAC,KAAK;AACpC,SAAO5H,EAAQ,SAAUR,GAAQF,GAAY;AACzC,QAAIyI,IAAgB,CAAA,GAChBC,IAAgB,IAChBC,IAAO,SAAUC,GAAQ;AACzB,UAAItT,IAASsT,EAAO,QAAQC,IAAOD,EAAO;AAC1C,MAAAC,EAAK,YAAW,GAChBvM,EAAUmM,GAAeG,CAAM,GAC/B5I,EAAW,KAAK1K,CAAM,GACtBoT,KAAiBI,EAAW;AAAA,IAChC,GACIA,IAAc,WAAY;AAC1B,UAAIL,GAAe;AACf,YAAII,IAAO,IAAIpM,EAAY;AAC3B,QAAAuD,EAAW,IAAI6I,CAAI;AACnB,YAAIvT,IAAS,CAAA,GACTyT,IAAW;AAAA,UACX,QAAQzT;AAAA,UACR,MAAMuT;AAAA,QAC1B;AACgB,QAAAJ,EAAc,KAAKM,CAAQ,GAC3BrD,EAAgBmD,GAAMzG,GAAW,WAAY;AAAE,iBAAOuG,EAAKI,CAAQ;AAAA,QAAG,GAAGV,CAAc;AAAA,MAC3F;AAAA,IACJ;AACA,IAAIE,MAA2B,QAAQA,KAA0B,IAC7D7C,EAAgB1F,GAAYoC,GAAW0G,GAAaP,GAAwB,EAAI,IAGhFG,IAAgB,IAEpBI,EAAW;AACX,QAAIE,IAAuBnI,EAAyBb,GAAY,SAAUvJ,GAAO;AAC7E,UAAIkG,GAAKlF,GACLwR,IAAcR,EAAc,MAAK;AACrC,UAAI;AACA,iBAASS,IAAgBvO,EAASsO,CAAW,GAAGE,IAAkBD,EAAc,KAAI,GAAI,CAACC,EAAgB,MAAMA,IAAkBD,EAAc,KAAI,GAAI;AACnJ,cAAIN,IAASO,EAAgB,OACzB7T,IAASsT,EAAO;AACpB,UAAAtT,EAAO,KAAKmB,CAAK,GACjB+R,KAAiBlT,EAAO,UAAUqT,EAAKC,CAAM;AAAA,QACjD;AAAA,MACJ,SACO1L,GAAO;AAAE,QAAAP,IAAM,EAAE,OAAOO,EAAK;AAAA,MAAI,UACpD;AACgB,YAAI;AACA,UAAIiM,KAAmB,CAACA,EAAgB,SAAS1R,IAAKyR,EAAc,WAASzR,EAAG,KAAKyR,CAAa;AAAA,QACtG,UAChB;AAA0B,cAAIvM,EAAK,OAAMA,EAAI;AAAA,QAAO;AAAA,MACxC;AAAA,IACJ,GAAG,WAAY;AACX,aAAqE8L,GAAc;AAC/E,QAAAzI,EAAW,KAAKyI,EAAc,MAAK,EAAG,MAAM;AAEhD,MAA4EO,GAAqB,YAAW,GAC5GhJ,EAAW,SAAQ,GACnBA,EAAW,YAAW;AAAA,IAC1B,GAAG,QAAW,WAAY;AAAE,aAAQyI,IAAgB;AAAA,IAAO,CAAC;AAC5D,IAAAvI,EAAO,UAAU8I,CAAoB;AAAA,EACzC,CAAC;AACL;ACxEO,SAASI,EAAqBC,GAAYC,GAAa;AAC1D,SAAIA,MAAgB,WAAUA,IAAc/J,IAC5C8J,IAAaA,KAA4DE,IAClE7I,EAAQ,SAAUR,GAAQF,GAAY;AACzC,QAAIwJ,GACAC,IAAQ;AACZ,IAAAvJ,EAAO,UAAUW,EAAyBb,GAAY,SAAUvJ,GAAO;AACnE,UAAIiT,IAAaJ,EAAY7S,CAAK;AAClC,OAAIgT,KAAS,CAACJ,EAAWG,GAAaE,CAAU,OAC5CD,IAAQ,IACRD,IAAcE,GACd1J,EAAW,KAAKvJ,CAAK;AAAA,IAE7B,CAAC,CAAC;AAAA,EACN,CAAC;AACL;AACA,SAAS8S,GAAe5S,GAAGC,GAAG;AAC1B,SAAOD,MAAMC;AACjB;ACpBO,SAAS+S,GAASC,GAAU;AAC/B,SAAOlJ,EAAQ,SAAUR,GAAQF,GAAY;AACzC,QAAI;AACA,MAAAE,EAAO,UAAUF,CAAU;AAAA,IAC/B,UACR;AACY,MAAAA,EAAW,IAAI4J,CAAQ;AAAA,IAC3B;AAAA,EACJ,CAAC;AACL;ACNO,SAASC,GAAUC,GAAU;AAChC,SAAOpJ,EAAQ,SAAUR,GAAQF,GAAY;AACzC,IAAAyE,EAAUqF,CAAQ,EAAE,UAAUjJ,EAAyBb,GAAY,WAAY;AAAE,aAAOA,EAAW,SAAQ;AAAA,IAAI,GAAGzB,EAAI,CAAC,GACvH,CAACyB,EAAW,UAAUE,EAAO,UAAUF,CAAU;AAAA,EACrD,CAAC;AACL;ACQO,SAAS+J,GAAoBC,GAAyE;AAC3G,QAAM,EAAE,UAAAC,GAAU,QAAAC,GAAQ,SAAAC,GAAS,WAAAC,GAAW,eAAAC,MAAkBL,GAC1DM,IAASN,EAAQ,UAAU;AAEjC,SAAO,IAAInK,EAAmC,CAAAG,MAAc;AAC1D,UAAMuK,IAAa,IAAI,gBAAA;AACvB,QAAIC,GAGAC,IAAY,IAIZC,IAAW;AAEf,UAAMrS,IAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,GAAGgS;AAAA,IAAA;AAGL,IAAIH,MACF7R,EAAQ,WAAW,IAAI6R;AAKzB,UAAMS,IAAM,IAAI,IAAIV,CAAQ;AAE5B,WAAIG,KACFO,EAAI,aAAa,IAAI,YAAY,MAAM,GAGzCpT,GAAiBoT,EAAI,YAAY;AAAA,MAC/B,QAAAL;AAAA,MACA,SAAAjS;AAAA,MACA,MAAMiS,MAAW,UAAUH,IAAU,KAAK,UAAUA,CAAO,IAAI;AAAA,MAC/D,QAAQI,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKnB,gBAAgB;AAAA,MAChB,QAAQ,OAAMxR,MAAY;AACxB,YAAKA,EAAS;AAeZ,UAAAyR,IAAiBzR,EAAS,QAAQ,IAAI,YAAY,KAAK;AAAA,aAfvC;AAChB,cAAI7E;AACJ,cAAI;AACF,YAAAA,IAAO,MAAM6E,EAAS,KAAA;AAAA,UACxB,QAAQ;AACN,gBAAI;AACF,cAAA7E,IAAO,MAAM6E,EAAS,KAAA;AAAA,YACxB,QAAQ;AACN,cAAA7E,IAAO;AAAA,YACT;AAAA,UACF;AAEA,UAAA8L,EAAW,MAAM,IAAIjM,EAAUgF,EAAS,QAAQA,EAAS,YAAY7E,CAAI,CAAC,GAC1EqW,EAAW,MAAA;AAAA,QACb;AAAA,MAGF;AAAA,MACA,WAAW,CAACK,MAA4B;AAEtC,QAAIA,EAAI,OAAIH,IAAY;AAExB,cAAMI,IAAO,KAAK,MAAMD,EAAI,IAAI;AAEhC,QAAIJ,IACFK,EAAK,UAAUL,IACNK,EAAK,cACdA,EAAK,UAAUA,EAAK,WACfL,MACHA,IAAiBK,EAAK,aAI1B7K,EAAW,KAAK6K,CAAI;AAAA,MACtB;AAAA,MACA,SAAS,MAAM;AACb,QAAA7K,EAAW,SAAA;AAAA,MACb;AAAA,MACA,SAAS,CAAA/G,MAAO;AAKd,YAAIyR,EAAU,OAAMzR;AAMpB,YAAI,CAAAwR;AAIJ,gBAAAzK,EAAW,MAAM/G,CAAG,GACpBsR,EAAW,MAAA,GACLtR;AAAA,MACR;AAAA,IAAA,CACD,GAEM,MAAY;AACjB,MAAAyR,IAAW,IACXH,EAAW,MAAA;AAAA,IACb;AAAA,EACF,CAAC;AACH;ACzHO,MAAMO,GAAiD;AAAA,EACpD,YAA+B,CAAA;AAAA,EAEvC,GAA2BC,GAAUC,GAA2B;AAC9D,SAAK,YAAY,OAAO,OAAO,CAAA,GAAI,KAAK,WAAW;AAAA,MACjD,CAACD,CAAK,IAAI,KAAK,UAAUA,CAAK,KAAK,CAAA,GAAI,OAAOC,CAAQ;AAAA,IAAA,CACvD;AAAA,EACH;AAAA,EAEA,IAA4BD,GAAUC,GAA2B;AAC/D,IAAK,KAAK,UAAUD,CAAK,MAEzB,KAAK,YAAY,OAAO,OAAO,CAAA,GAAI,KAAK,WAAW;AAAA,MACjD,CAACA,CAAK,IAAI,KAAK,UAAUA,CAAK,KAAK,CAAA,GAAI,OAAO,CAAC3P,MAAiBA,MAAM4P,CAAQ;AAAA,IAAA,CAC/E;AAAA,EACH;AAAA,EAEA,OAA+BD,GAAgB;AAC7C,WAAO,KAAK,UAAUA,CAAK;AAAA,EAC7B;AAAA,EAEA,KAA6BA,MAAa5M,GAAmC;AAC3E,IAAK,KAAK,UAAU4M,CAAK,KAEzB,KAAK,UAAUA,CAAK,EAAE,QAAQ,CAACC,MAAwBA,EAAS,GAAG7M,CAAI,CAAC;AAAA,EAC1E;AACF;ACOA,MAAM8M,KAA8B;AAMpC,SAASC,GAAiBP,GAAUQ,GAA6C;AAC/E,SAAIA,GAAO,mBAAiBR,EAAI,aAAa,IAAI,qBAAqBQ,EAAM,eAAe,GAEpFR;AACT;AAEA,MAAqBS,GAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EACD,WAAW,IAAI9J,GAAA;AAAA,EACf,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACA,WAAW;AAAA,EACX,aAAa,IAAIwJ,GAAA;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY/M,GAAsB;AAEhC,QAAI,CAACA,EAAO,YAAY,CAACA,EAAO;AAC9B,YAAM,IAAI,MAAM,yDAAyD;AAa3E,QAVA,KAAK,SAASA,EAAO,QACrB,KAAK,YAAYA,EAAO,WACxB,KAAK,sBAAsBA,EAAO,qBAClC,KAAK,sBAAsBA,EAAO,qBAClC,KAAK,gBAAgB;AAAA,MACnB,GAAGA,EAAO;AAAA,MACV,GAAIA,EAAO,mBAAmB,EAAE,+BAA+BA,EAAO,iBAAA,IAAqB,CAAA;AAAA,IAAC,GAI1F,CAACA,EAAO,YAAYA,EAAO,qBAAqB;AAGlD,YAAMsN,IAAetN,EAAO,oBAAoB,QAAQ,QAAQ,EAAE;AAClE,WAAK,WAAW,GAAGsN,CAAY;AAAA,IACjC,MAAA,CAAWtN,EAAO,aAEhB,KAAK,WAAWA,EAAO,UACnB,KAAK,aAEP,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EAKR;AAAA,EAEA,GAA8BgN,GAAUC,GAA8B;AACpE,SAAK,WAAW,OAAOD,CAAK,GAC5B,KAAK,WAAW,GAAGA,GAAOC,CAAQ;AAAA,EACpC;AAAA,EAEA,YAAYjS,GAAwC;AAClD,YAAQA,EAAS,WAAA;AAAA,MACf,KAAKnE,EAAU;AACb,aAAK,WAAW,KAAKA,EAAU,MAAMmE,CAAuC;AAE5E;AAAA,MACF,KAAKnE,EAAU;AAAA,MACf,KAAKA,EAAU;AACb,aAAK,WAAW,KAAKA,EAAU,SAASmE,CAAuD;AAE/F;AAAA,MACF,KAAKnE,EAAU;AAAA,MACf,KAAKA,EAAU;AAAA,MACf,KAAKA,EAAU;AACb,aAAK,WAAW,KAAKA,EAAU,SAASmE,CAAuD;AAE/F;AAAA,MACF,KAAKnE,EAAU;AAAA,MACf,KAAKA,EAAU;AACb,aAAK,WAAW,KAAKA,EAAU,WAAWmE,CAAyD;AAEnG;AAAA,MACF,KAAKnE,EAAU;AACb,aAAK,WAAW;AAAA,UACdA,EAAU;AAAA,UACVmE;AAAA,QAAA;AAGF;AAAA,MACF,KAAKnE,EAAU;AACb,aAAK,WAAW,KAAKA,EAAU,MAAMmE,CAAuC;AAE5E;AAAA,MACF,KAAKnE,EAAU;AACb,aAAK,WAAW,KAAKA,EAAU,OAAOmE,CAAwC;AAE9E;AAAA,IAEA;AAAA,EAEN;AAAA,EAEA,SAASoR,GAA0BH,GAAyC;AAC1E,WAAAA,GAAS,aAAA,GACT,KAAK,YAAY,GAEV,KAAK;AAAA,MACVD,GAAoB;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK,sBAAsBI,CAAO,KAAKA;AAAA,QAChD,eAAe,KAAK;AAAA,MAAA,CACrB;AAAA,MACDH;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAUsB,GAAyBtB,GAAyC;AAC1E,IAAAA,GAAS,aAAA,GACT,KAAK,YAAY;AAEjB,UAAMW,IAAM,IAAI,IAAI,KAAK,QAAQ;AACjC,WAAAA,EAAI,aAAa,IAAI,qBAAqBW,CAAe,GAElD,KAAK;AAAA,MACVvB,GAAoB;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,UAAUY,EAAI,SAAA;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,QACR,eAAe,KAAK;AAAA,MAAA,CACrB;AAAA,MACDX;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,gCAA+C;AACrD,UAAMqB,IAAe,KAAK,gBAAA;AAE1B,WAAOA,IAAe,GAAGA,CAAY,sBAAsB;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBAAgBC,GAA0D;AAC9E,UAAMrB,IAAW,KAAK,8BAAA;AAEtB,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,2FAA2F;AAG7G,UAAMU,IAAM,IAAI,IAAIV,CAAQ;AAC5B,IAAAU,EAAI,aAAa,IAAI,qBAAqBW,CAAe;AAEzD,UAAMjT,IAAkC,EAAE,GAAG,KAAK,cAAA;AAClD,IAAI,KAAK,WACPA,EAAQ,WAAW,IAAI,KAAK;AAG9B,UAAMU,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,OAAO,SAAAtS,GAAS;AAEvE,QAAIU,EAAS,WAAW;AACtB,aAAO;AAGT,QAAI,CAACA,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAKxG,UAAMwS,IAA8D,MAAMxS,EAAS,KAAA,GAC7E8R,IAAOU,EAAK,QAASA;AAE3B,WAAO;AAAA,MACL,OAAOV,EAAK,SAAS;AAAA,MACrB,UAAUA,EAAK,YAAY;AAAA,MAC3B,gBAAgBA,EAAK;AAAA;AAAA;AAAA,MAGrB,oBAAoBA,EAAK,qBAAqB,CAAA,GAAI,IAAI,CAAAW,OAAY;AAAA,QAChE,aAAaA,EAAQ;AAAA,QACrB,sBAAsBA,EAAQ;AAAA,QAC9B,kBAAkBA,EAAQ;AAAA,QAC1B,qBAAqBA,EAAQ;AAAA,QAC7B,gBAAgBA,EAAQ;AAAA,MAAA,EACxB;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,wBAAuC;AAC7C,UAAMH,IAAe,KAAK,gBAAA;AAE1B,WAAOA,IAAe,GAAGA,CAAY,qBAAqB;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,eACJC,GACAtB,GACe;AACf,UAAMC,IAAW,KAAK,sBAAA;AAEtB,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,0FAA0F;AAG5G,UAAMU,IAAM,IAAI,IAAIV,CAAQ;AAC5B,IAAAU,EAAI,aAAa,IAAI,qBAAqBW,CAAe,GAErDtB,GAAS,aACXW,EAAI,aAAa,IAAI,cAAcX,EAAQ,SAAS,GAGlDA,GAAS,SACXW,EAAI,aAAa,IAAI,SAAS,MAAM;AAGtC,UAAM5R,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,QAAQ,SAAS,KAAK,WAAA,GAAc;AAG3F,QAAI,EAAA5R,EAAS,MAAMA,EAAS,WAAW;AAIvC,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAAA,EACxG;AAAA,EAEQ,wBAAuC;AAC7C,UAAMsS,IAAe,KAAK,gBAAA;AAE1B,WAAOA,IAAe,GAAGA,CAAY,aAAa;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,cAAcC,GAAwC;AAC1D,UAAMrB,IAAW,KAAK,sBAAA;AAEtB,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,kFAAkF;AAGpG,UAAMU,IAAM,IAAI,IAAIV,CAAQ;AAC5B,IAAAU,EAAI,aAAa,IAAI,qBAAqBW,CAAe;AAEzD,UAAMvS,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,UAAU,SAAS,KAAK,WAAA,GAAc;AAE7F,QAAI,CAAA5R,EAAS;AAIb,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAAA,EACxG;AAAA,EAEQ,yBAAwC;AAC9C,UAAMsS,IAAe,KAAK,gBAAA;AAE1B,WAAOA,IAAe,GAAGA,CAAY,sBAAsB;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,oBAAoBI,GAAgE;AACxF,UAAMxB,IAAW,KAAK,uBAAA;AAEtB,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,2FAA2F;AAI7G,UAAMyB,IAAUD,EAAQ,SAAS,KAAA,GAC3BvX,IAA+B;AAAA,MACnC,iBAAiBuX,EAAQ;AAAA,MACzB,WAAWA,EAAQ;AAAA,MACnB,SAASA,EAAQ;AAAA,MACjB,GAAIC,IAAU,EAAE,SAAAA,MAAY,CAAA;AAAA,IAAC,GAGzB3S,IAAW,MAAM,MAAMkR,GAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,EAAE,GAAG,KAAK,WAAA,GAAc,gBAAgB,mBAAA;AAAA,MACjD,MAAM,KAAK,UAAU/V,CAAI;AAAA,IAAA,CAC1B;AAED,QAAI,CAAC6E,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMwS,IAAwE,MAAMxS,EAAS,KAAA,GACvF8R,IAAOU,EAAK,QAASA;AAE3B,WAAO,EAAE,WAAWV,EAAK,WAAW,KAAKA,EAAK,IAAA;AAAA,EAChD;AAAA,EAEQ,OAAOvL,GAAgD0K,GAAyC;AACtG,WAAO1K,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiBC8I,GAAW4B,GAAS,aAAaiB,EAA2B;AAAA;AAAA,MAE5D/C,GAAO,CAAAyD,MAASA,EAAM,SAAS,CAAC;AAAA,MAChC9B,GAAU,KAAK,QAAQ;AAAA;AAAA;AAAA,MAGvBF,GAAS,MAAM,KAAK,aAAA,CAAc;AAAA,IAAA,EAEnC,UAAU;AAAA,MACT,MAAM,CAAAgC,MAAS;AAGb,YAAI,MAAK;AAET,qBAAW5S,KAAY4S;AACrB,YAAA3B,GAAS,eAAejR,CAAQ,GAChC,KAAK,YAAYA,CAAQ;AAAA,MAE7B;AAAA,MACA,OAAO,CAAA3E,MAAS;AACd,QAAK,KAAK,YAAU4V,GAAS,aAAa5V,CAAK;AAAA,MACjD;AAAA,MACA,UAAU,MAAM;AACd,QAAK,KAAK,YAAU4V,GAAS,iBAAA;AAAA,MAC/B;AAAA,IAAA,CACD;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAOA,GAAsC;AAC3C,QAAI,OAAK,YAAY,KAAK,SAI1B;AAAA,UAFA,KAAK,WAAW,IAEZ,KAAK,aAAa,GAAG;AACvB,aAAK,MAAA;AAEL;AAAA,MACF;AAEA,WAAK,cAAc,WAAW,MAAM,KAAK,MAAA,GAASA,EAAQ,SAAS;AAAA;AAAA,EACrE;AAAA,EAEQ,eAAqB;AAC3B,SAAK,WAAW,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC,GAIzC,KAAK,YAAY,KAAK,aAAa,KACrC,KAAK,MAAA;AAAA,EAET;AAAA,EAEA,QAAc;AACZ,IAAI,KAAK,WAET,KAAK,SAAS,IAEV,KAAK,gBACP,aAAa,KAAK,WAAW,GAC7B,KAAK,cAAc,SAGrB,KAAK,SAAS,KAAA,GACd,KAAK,SAAS,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW4B,GAAYN,GAAsD;AACjF,UAAMO,IAAe,KAAK,mBAAA;AAE1B,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,+EAA+E;AAGjG,UAAMC,IAAW,IAAI,SAAA;AACrB,IAAAA,EAAS,OAAO,QAAQF,CAAI,GAC5BE,EAAS,OAAO,mBAAmBR,CAAe;AAElD,UAAMjT,IAAuB;AAAA,MAC3B,GAAG,KAAK;AAAA,IAAA;AAEV,IAAI,KAAK,WACPA,EAAQ,WAAW,IAAI,KAAK;AAG9B,QAAI;AACF,YAAMU,IAAW,MAAM,MAAM8S,GAAc;AAAA,QACzC,QAAQ;AAAA,QACR,SAAAxT;AAAA,QACA,MAAMyT;AAAA,MAAA,CACP;AAED,UAAI,CAAC/S,EAAS;AACZ,cAAM,IAAI,MAAM,kBAAkBA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE;AAG5E,YAAM5D,IAAS,MAAM4D,EAAS,KAAA;AAE9B,aAAI,KAAK,aAEP,QAAQ,IAAI,+CAA+C5D,CAAM,GAG5DA;AAAA,IACT,SAASf,GAAO;AAEd,oBAAQ,MAAM,4CAA4CA,CAAK,GACzDA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,wBAAwB2X,GAAsBT,GAA6D;AAC/G,UAAMD,IAAe,KAAK,gBAAA;AAE1B,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,gGAAgG;AAGlH,UAAMW,IACJ,qBAAqB,mBAAmBV,CAAe,CAAC,kBAAuB,mBAAmBS,CAAY,CAAC,IAC3GpB,IAAM,GAAGU,CAAY,0BAA0BW,CAAK,IAEpD3T,IAAuB;AAAA,MAC3B,GAAG,KAAK;AAAA,IAAA;AAEV,IAAI,KAAK,WACPA,EAAQ,WAAW,IAAI,KAAK;AAG9B,QAAI;AACF,YAAMU,IAAW,MAAM,MAAM4R,GAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAAtS;AAAA,MAAA,CACD;AAED,UAAI,CAACU,EAAS;AACZ,cAAM,IAAI,MAAM,iCAAiCA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE;AAG3F,YAAMkT,IAAO,MAAMlT,EAAS,KAAA,GAEtBmT,IAAWH,EAAa,MAAM,GAAG,EAAE,SAAS;AAElD,aAAI,KAAK,aAEP,QAAQ,IAAI,yDAAyD,EAAE,UAAAG,GAAU,MAAMD,EAAK,MAAM,GAG7F,EAAE,MAAAA,GAAM,UAAAC,EAAA;AAAA,IACjB,SAAS9X,GAAO;AAEd,oBAAQ,MAAM,sDAAsDA,CAAK,GACnEA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,8BAA8B+X,GAAqBnC,GAAgD;AACvG,UAAMqB,IAAe,KAAK,gBAAA;AAE1B,QAAI,CAACA;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAIJ,UAAMV,IAAMO;AAAA,MACV,IAAI,IAAI,GAAGG,CAAY,YAAY,mBAAmBc,CAAW,CAAC,mBAAmB;AAAA,MACrFnC;AAAA,IAAA,GAGIjR,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,QAAQ,SAAS,KAAK,WAAA,GAAc;AAE3F,QAAI,CAAC5R,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMwS,IAA+D,MAAMxS,EAAS,KAAA,GAC9EqT,IAAUb,EAAK,MAAM,WAAWA,EAAK;AAE3C,QAAI,CAACa;AACH,YAAM,IAAI,MAAM,+DAA+D;AAGjF,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,4BACJD,GACAnC,GAC2C;AAC3C,UAAMqB,IAAe,KAAK,gBAAA;AAE1B,QAAI,CAACA;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAIJ,UAAMV,IAAMO;AAAA,MACV,IAAI,IAAI,GAAGG,CAAY,YAAY,mBAAmBc,CAAW,CAAC,kBAAkB;AAAA,MACpFnC;AAAA,IAAA,GAGIjR,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,QAAQ,SAAS,KAAK,WAAA,GAAc;AAE3F,QAAI,CAAC5R,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMwS,IACJ,MAAMxS,EAAS,KAAA,GACXsT,IAAQd,EAAK,MAAM,SAASA,EAAK,OACjCe,IAAQf,EAAK,MAAM,SAASA,EAAK;AAGvC,QAAI,CAACc,KAAS,CAACC;AACb,YAAM,IAAI,MAAM,wEAAwE;AAG1F,WAAO,EAAE,OAAAD,GAAO,OAAAC,EAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwBH,GAA6B;AAC3D,UAAMd,IAAe,KAAK,gBAAA;AAE1B,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,qFAAqF;AAGvG,WAAO,GAAGA,CAAY,YAAY,mBAAmBc,CAAW,CAAC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAaA,GAAqBzR,GAAYyQ,GAA6C;AACjG,WAAOD,GAAiB,IAAI,IAAI,GAAG,KAAK,wBAAwBiB,CAAW,CAAC,IAAIzR,CAAE,EAAE,GAAGyQ,CAAK;AAAA,EAC9F;AAAA;AAAA,EAGQ,aAAqC;AAC3C,UAAM9S,IAAkC,EAAE,GAAG,KAAK,cAAA;AAClD,WAAI,KAAK,WACPA,EAAQ,WAAW,IAAI,KAAK,SAGvBA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc8T,GAAqBI,GAAcvC,GAA6D;AAClH,UAAMW,IAAM,KAAK,aAAawB,GAAa,QAAQnC,CAAO;AAC1D,IAAAW,EAAI,aAAa,IAAI,QAAQ4B,CAAI;AAEjC,UAAMxT,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,OAAO,SAAS,KAAK,WAAA,GAAc;AAE1F,QAAI,CAAC5R,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMwS,IAAsE,MAAMxS,EAAS,KAAA,GACrF8R,IAAOU,EAAK,QAASA;AAE3B,WAAO,EAAE,SAASV,EAAK,WAAW,CAAA,GAAI,WAAWA,EAAK,aAAa,GAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAcsB,GAAqBI,GAAcvC,GAA8D;AACnH,UAAMW,IAAM,KAAK,aAAawB,GAAa,QAAQnC,CAAO;AAC1D,IAAAW,EAAI,aAAa,IAAI,QAAQ4B,CAAI,GAC7BvC,GAAS,eAAe,QAAMW,EAAI,aAAa,IAAI,gBAAgB,OAAOX,EAAQ,WAAW,CAAC,GAE9FA,GAAS,cAAc,QAAMW,EAAI,aAAa,IAAI,eAAe,OAAOX,EAAQ,UAAU,CAAC;AAE/F,UAAMjR,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,OAAO,SAAS,KAAK,WAAA,GAAc;AAE1F,QAAI,CAAC5R,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMyT,IAAU,MAAMzT,EAAS,KAAA,GACzB0T,IAAmB1T,EAAS,QAAQ,IAAI,eAAe;AAE7D,WAAO;AAAA,MACL,SAAAyT;AAAA,MACA,YAAYC,KAAoB,OAAO,OAAOA,CAAgB,IAAID,EAAQ;AAAA,MAC1E,WAAWzT,EAAS,QAAQ,IAAI,aAAa,MAAM;AAAA,IAAA;AAAA,EAEvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eACJoT,GACAI,GACAC,GACAxC,GAC+B;AAC/B,UAAMW,IAAM,KAAK,aAAawB,GAAa,QAAQnC,CAAO;AAC1D,IAAAW,EAAI,aAAa,IAAI,QAAQ4B,CAAI,GAC7BvC,GAAS,QAAQ,QAAMW,EAAI,aAAa,IAAI,QAAQ,OAAOX,EAAQ,IAAI,CAAC,GAExEA,GAAS,cAAYW,EAAI,aAAa,IAAI,eAAe,MAAM;AAEnE,UAAM+B,IAAO,IAAI,SAAA;AACjB,IAAAA,EAAK,OAAO,QAAQF,aAAmB,OAAOA,IAAU,IAAI,KAAK,CAACA,CAAO,CAAC,CAAC;AAE3E,UAAMzT,IAAW,MAAM,MAAM4R,EAAI,YAAY;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS,KAAK,WAAA;AAAA,MACd,MAAM+B;AAAA,MACN,QAAQ1C,GAAS;AAAA,IAAA,CAClB;AAED,QAAI,CAACjR,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMwS,IAAwE,MAAMxS,EAAS,KAAA;AAG7F,WAAO,EAAE,eAFIwS,EAAK,QAASA,GAEC,gBAAgB,EAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAc,iBACZY,GACAzR,GACA4P,GACA0B,GACAb,GACkB;AAClB,UAAMR,IAAM,KAAK,aAAawB,GAAazR,GAAIyQ,CAAK;AACpD,WAAO,QAAQa,CAAK,EAAE,QAAQ,CAAC,CAACW,GAAGlS,CAAC,MAAMkQ,EAAI,aAAa,IAAIgC,GAAGlS,CAAC,CAAC;AAEpE,UAAM1B,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAAL,GAAQ,SAAS,KAAK,WAAA,EAAW,CAAG;AAEnF,QAAI,CAACvR,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,WAAOA,EAAS,KAAA,EAAO,MAAM,MAAM,IAAI;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,cAAcoT,GAAqBI,GAAcvC,GAA6D;AAClH,UAAMW,IAAM,KAAK,aAAawB,GAAa,QAAQnC,CAAO;AAC1D,IAAAW,EAAI,aAAa,IAAI,QAAQ4B,CAAI;AAEjC,UAAMxT,IAAW,MAAM,MAAM4R,EAAI,SAAA,GAAY,EAAE,QAAQ,OAAO,SAAS,KAAK,WAAA,GAAc;AAE1F,QAAI,CAAC5R,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,UAAMwS,IAAsE,MAAMxS,EAAS,KAAA,GACrF8R,IAAOU,EAAK,QAASA;AAE3B,WAAO;AAAA,MACL,QAAQV,EAAK,UAAU;AAAA,MACvB,OAAOA,EAAK,SAAS;AAAA,MACrB,WAAWA,EAAK,aAAa;AAAA,MAC7B,WAAWA,EAAK,aAAa;AAAA,MAC7B,MAAMA,EAAK,QAAQ;AAAA,MACnB,MAAMA,EAAK;AAAA,IAAA;AAAA,EAEf;AAAA;AAAA,EAGA,MAAM,eAAesB,GAAqBI,GAAcvC,GAA8C;AACpG,UAAM,KAAK,iBAAiBmC,GAAa,SAAS,QAAQ,EAAE,MAAAI,EAAA,GAAQvC,CAAO;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,gBAAgBmC,GAAqBI,GAAcvC,GAA8C;AACrG,UAAM,KAAK,iBAAiBmC,GAAa,QAAQ,UAAU,EAAE,MAAAI,EAAA,GAAQvC,CAAO;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,mBAAmBmC,GAAqBI,GAAcvC,GAA8C;AACxG,UAAM,KAAK,iBAAiBmC,GAAa,OAAO,UAAU,EAAE,MAAAI,EAAA,GAAQvC,CAAO;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,cACJmC,GACAS,GACAC,GACA7C,GAC8B;AAC9B,UAAMgC,IAAgC,EAAE,KAAAY,GAAK,KAAAC,EAAA;AAC7C,IAAI7C,GAAS,cAAWgC,EAAM,YAAY;AAE1C,UAAMT,IAAQ,MAAM,KAAK,iBAAiBY,GAAa,QAAQ,QAAQH,GAAOhC,CAAO;AAKrF,WAAO,EAAE,cAFIuB,GAAM,QAASA,IAEA,eAAe,EAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,cACJY,GACAS,GACAC,GACA7C,GACe;AACf,UAAMgC,IAAgC,EAAE,KAAAY,GAAK,KAAAC,EAAA;AAC7C,IAAI7C,GAAS,cAAWgC,EAAM,YAAY,SAE1C,MAAM,KAAK,iBAAiBG,GAAa,QAAQ,QAAQH,GAAOhC,CAAO;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAemC,GAAqBI,GAAcvC,GAAgE;AAChH,UAAMW,IAAM,KAAK,aAAawB,GAAa,SAASnC,CAAO;AAC3D,WAAAW,EAAI,aAAa,IAAI,QAAQ4B,CAAI,GAE1B,IAAI1M,EAAgC,CAAAG,MAAc;AACvD,YAAMuK,IAAa,IAAI,gBAAA;AAEvB,aAAKhT,GAAiBoT,EAAI,YAAY;AAAA,QACpC,SAAS,KAAK,WAAA;AAAA,QACd,QAAQJ,EAAW;AAAA,QACnB,gBAAgB;AAAA,QAChB,QAAQ,OAAMxR,MAAY;AACxB,cAAI,CAACA,EAAS,IAAI;AAChB,kBAAM7E,IAAO,MAAM6E,EAAS,OAAO,MAAM,MAAA;AAAA,aAAe;AACxD,YAAAiH,EAAW,MAAM,IAAIjM,EAAUgF,EAAS,QAAQA,EAAS,YAAY7E,CAAI,CAAC,GAC1EqW,EAAW,MAAA;AAAA,UACb;AAAA,QACF;AAAA,QACA,WAAW,CAAAK,MAAO;AAChB,UAAIA,EAAI,UAAU,YAAU5K,EAAW,KAAK,KAAK,MAAM4K,EAAI,IAAI,CAAwB;AAAA,QACzF;AAAA,QACA,SAAS,MAAM5K,EAAW,SAAA;AAAA,QAC1B,SAAS,CAAA/G,MAAO;AAGd,gBAAA+G,EAAW,MAAM/G,CAAG,GACpBsR,EAAW,MAAA,GACLtR;AAAA,QACR;AAAA,MAAA,CACD,GAEM,MAAYsR,EAAW,MAAA;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAoC;AAC1C,UAAMc,IAAe,KAAK,gBAAA;AAE1B,WAAOA,IAAe,GAAGA,CAAY,UAAU;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAiC;AACvC,QAAIA,IAAe,KAAK;AAOxB,WAJI,CAACA,KAAgB,KAAK,aACxBA,IAAe,KAAK,SAAS,QAAQ,gBAAgB,EAAE,IAGpDA,IAKEA,EAAa,QAAQ,QAAQ,EAAE,IAJ7B;AAAA,EAKX;AACF;ACt6BO,MAAMyB,KAAyB,IAGhCC,KAAwC,oBAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;AAS9D,SAASC,EAAiBT,GAAcvC,GAA2C;AACxF,MAAIuC,MAASO,IAAwB;AACnC,QAAI9C,GAAS;AACX,aAAOuC;AAGT,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,MAAIA,EAAK,WAAW,GAAG;AACrB,UAAM,IAAI,MAAM,oFAAoFA,CAAI,IAAI;AAG9G,MAAIA,EAAK,SAAS,GAAG;AACnB,UAAM,IAAI,MAAM,qDAAqDA,CAAI,IAAI;AAG/E,MAAIA,EAAK,MAAM,GAAG,EAAE,KAAK,OAAWQ,GAAiB,IAAIE,CAAO,CAAC;AAC/D,UAAM,IAAI,MAAM,wEAAwEV,CAAI,IAAI;AAGlG,SAAOA;AACT;ACXO,MAAMW,KAA2B,KAU3BC,KAAiC;AAS9C,SAASC,GAAcC,GAA0B;AAE/C,SAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAQ,CAAC,GAAGH,EAAwB;AAC7E;AAEA,MAAqBI,GAAsB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAYvP,GAA+B;AACzC,SAAK,WAAWA,EAAO,kBAAkB,QAAQ,QAAQ,EAAE,GAC3D,KAAK,SAASA,EAAO,QACrB,KAAK,gBAAgBA,EAAO;AAAA,EAC9B;AAAA;AAAA,EAGQ,UAAkC;AACxC,UAAM1F,IAAkC,EAAE,GAAG,KAAK,cAAA;AAClD,WAAI,KAAK,WACPA,EAAQ,WAAW,IAAI,KAAK,SAGvBA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,QACZqC,GACA4P,GACA0B,GACA9X,GACAqZ,GACmB;AACnB,UAAM5C,IAAM,IAAI,IAAI,GAAG,KAAK,QAAQ,IAAIjQ,CAAE,EAAE;AAC5C,WAAO,QAAQsR,CAAK,EAAE,QAAQ,CAAC,CAAC7E,GAAK1Q,CAAK,MAAMkU,EAAI,aAAa,IAAIxD,GAAK1Q,CAAK,CAAC;AAEhF,UAAMsC,IAAW,MAAM,MAAM4R,EAAI,YAAY,EAAE,QAAAL,GAAQ,SAAS,KAAK,QAAA,GAAW,MAAApW,GAAM,QAAAqZ,GAAQ;AAE9F,QAAI,CAACxU,EAAS;AACZ,YAAM,IAAIhF,EAAUgF,EAAS,QAAQA,EAAS,YAAY,MAAMA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAA,OAAe,CAAC;AAGxG,WAAOA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAKwT,GAAcvC,GAA8D;AACrF,UAAMgC,IAAgC,EAAE,MAAMgB,EAAiBT,GAAM,EAAE,WAAW,GAAA,CAAM,EAAA;AACxF,IAAIvC,GAAS,QAAQ,WAAY,OAAO,OAAOA,EAAQ,IAAI,IAEvDA,GAAS,YAAY,SAAMgC,EAAM,YAAY,OAAOoB,GAAcpD,EAAQ,QAAQ,CAAC;AAGvF,UAAMuB,IAAsC,OAD3B,MAAM,KAAK,QAAQ,QAAQ,OAAOS,CAAK,GACG,KAAA,GACrDnB,IAAOU,EAAK,QAASA;AAE3B,WAAO;AAAA,MACL,SAASV,EAAK,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,MAIzB,QAAQA,EAAK,UAAUU,EAAK,UAAU;AAAA,IAAA;AAAA,EAE1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAQgB,GAAcvC,GAAoE;AAC9F,UAAMqD,IAAWD,GAAcpD,GAAS,YAAYkD,EAAwB,GACtEM,IAAaxD,GAAS,cAAcmD,IACpCM,IAA+B,CAAA;AACrC,QAAIC,IAAQ,GACR3O,IAAW,IACX4O,IAAO;AAEX,eAAS;AACP,YAAMxY,IAAS,MAAM,KAAK,KAAKoX,GAAM,EAAE,MAAAoB,GAAM,UAAAN,GAAU,GACjDO,IAASzY,EAAO;AAMtB,UAAIyY,KAAUA,EAAO,UAAUD,GAAM;AACnC,QAAAD,IAAQE,EAAO,OACf7O,IAAW;AAEX;AAAA,MACF;AAIA,UAFA0O,EAAQ,KAAK,GAAGtY,EAAO,OAAO,GAE1B,CAACyY,GAAQ;AAIX,QAAA7O,IAAW5J,EAAO,QAAQ,SAASkY;AAEnC;AAAA,MACF;AAIA,UAFAK,IAAQE,EAAO,OAEXH,EAAQ,UAAUC;AACpB;AAIF,UAAID,EAAQ,UAAUD,KAAcrY,EAAO,QAAQ,WAAW,GAAG;AAC/D,QAAA4J,IAAW;AAEX;AAAA,MACF;AAEA,MAAA4O,KAAQ;AAAA,IACV;AAEA,WAAO,EAAE,SAAAF,GAAS,OAAAC,GAAO,UAAA3O,EAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,MAAM,KAAKwN,GAA4C;AAErD,UAAMhB,IAAsC,OAD3B,MAAM,KAAK,QAAQ,QAAQ,OAAO,EAAE,MAAMyB,EAAiBT,CAAI,GAAG,GACxB,KAAA,GACrD1B,IAAOU,EAAK,QAASA;AAE3B,WAAO;AAAA,MACL,QAAQV,EAAK,UAAU;AAAA,MACvB,OAAOA,EAAK,SAAS;AAAA,MACrB,WAAWA,EAAK,aAAa;AAAA,MAC7B,WAAWA,EAAK,aAAa;AAAA,MAC7B,MAAMA,EAAK,QAAQ;AAAA,MACnB,MAAMA,EAAK;AAAA,IAAA;AAAA,EAEf;AAAA;AAAA,EAGA,MAAM,KAAK0B,GAAcvC,GAA8D;AACrF,UAAMgC,IAAgC,EAAE,MAAMgB,EAAiBT,CAAI,EAAA;AACnE,IAAIvC,GAAS,eAAe,WAAY,eAAe,OAAOA,EAAQ,WAAW,IAE7EA,GAAS,cAAc,WAAY,cAAc,OAAOA,EAAQ,UAAU;AAE9E,UAAMjR,IAAW,MAAM,KAAK,QAAQ,QAAQ,OAAOiT,CAAK,GAClDQ,IAAU,MAAMzT,EAAS,KAAA,GACzB0T,IAAmB1T,EAAS,QAAQ,IAAI,eAAe;AAE7D,WAAO;AAAA,MACL,SAAAyT;AAAA,MACA,YAAYC,KAAoB,OAAO,OAAOA,CAAgB,IAAID,EAAQ;AAAA,MAC1E,WAAWzT,EAAS,QAAQ,IAAI,aAAa,MAAM;AAAA,IAAA;AAAA,EAEvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAMwT,GAAcC,GAAwBxC,GAAgE;AAChH,UAAMgC,IAAgC,EAAE,MAAMgB,EAAiBT,CAAI,EAAA;AACnE,IAAIvC,GAAS,QAAQ,WAAY,OAAO,OAAOA,EAAQ,IAAI,IAEvDA,GAAS,eAAYgC,EAAM,cAAc;AAE7C,UAAMU,IAAO,IAAI,SAAA;AACjB,IAAAA,EAAK,OAAO,QAAQF,aAAmB,OAAOA,IAAU,IAAI,KAAK,CAACA,CAAO,CAAC,CAAC;AAG3E,UAAMjB,IAAuC,OAD5B,MAAM,KAAK,QAAQ,QAAQ,OAAOS,GAAOU,GAAM1C,GAAS,MAAM,GACnB,KAAA;AAG5D,WAAO,EAAE,eAFIuB,EAAK,QAASA,GAEC,gBAAgB,EAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,MAAMgB,GAAcvC,GAAgD;AACxE,UAAM,KAAK,QAAQ,SAAS,QAAQ,EAAE,MAAMgD,EAAiBT,CAAI,EAAA,GAAK,QAAWvC,GAAS,MAAM;AAAA,EAClG;AAAA;AAAA,EAGA,MAAM,OAAOuC,GAA6B;AACxC,UAAM,KAAK,QAAQ,QAAQ,UAAU,EAAE,MAAMS,EAAiBT,CAAI,GAAG;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,UAAUA,GAA6B;AAC3C,UAAM,KAAK,QAAQ,OAAO,UAAU,EAAE,MAAMS,EAAiBT,CAAI,GAAG;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,KAAKK,GAAaC,GAAa7C,GAAkE;AACrG,UAAMgC,IAAQ,KAAK,cAAcY,GAAKC,GAAK7C,CAAO,GAE5CuB,IAAsC,OAD3B,MAAM,KAAK,QAAQ,QAAQ,QAAQS,CAAK,GACE,KAAA;AAG3D,WAAO,EAAE,cAFIT,EAAK,QAASA,GAEA,eAAe,EAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAM,KAAKqB,GAAaC,GAAa7C,GAAmD;AACtF,UAAM,KAAK,QAAQ,QAAQ,QAAQ,KAAK,cAAc4C,GAAKC,GAAK7C,CAAO,CAAC;AAAA,EAC1E;AAAA,EAEQ,cAAc4C,GAAaC,GAAa7C,GAA4D;AAC1G,UAAMgC,IAAgC,EAAE,KAAKgB,EAAiBJ,CAAG,GAAG,KAAKI,EAAiBH,CAAG,EAAA;AAC7F,WAAI7C,GAAS,cAAWgC,EAAM,YAAY,SAEnCA;AAAA,EACT;AACF;AC1QA,MAAM6B,IAAY,CAAA;AAClB,SAAS1W,IAAI,GAAGA,IAAI,KAAK,EAAEA;AACvB,EAAA0W,EAAU,MAAM1W,IAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAE7C,SAAS2W,GAAgBpY,GAAKqY,IAAS,GAAG;AAC7C,UAAQF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IAC7BF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzBF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzBF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzB,MACAF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzBF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzB,MACAF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzBF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzB,MACAF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzBF,EAAUnY,EAAIqY,IAAS,CAAC,CAAC,IACzB,MACAF,EAAUnY,EAAIqY,IAAS,EAAE,CAAC,IAC1BF,EAAUnY,EAAIqY,IAAS,EAAE,CAAC,IAC1BF,EAAUnY,EAAIqY,IAAS,EAAE,CAAC,IAC1BF,EAAUnY,EAAIqY,IAAS,EAAE,CAAC,IAC1BF,EAAUnY,EAAIqY,IAAS,EAAE,CAAC,IAC1BF,EAAUnY,EAAIqY,IAAS,EAAE,CAAC,GAAG,YAAW;AAChD;AC1BA,IAAIC;AACJ,MAAMC,KAAQ,IAAI,WAAW,EAAE;AAChB,SAASC,KAAM;AAC1B,MAAI,CAACF,IAAiB;AAClB,QAAI,OAAO,SAAW,OAAe,CAAC,OAAO;AACzC,YAAM,IAAI,MAAM,0GAA0G;AAE9H,IAAAA,KAAkB,OAAO,gBAAgB,KAAK,MAAM;AAAA,EACxD;AACA,SAAOA,GAAgBC,EAAK;AAChC;ACVA,MAAME,KAAa,OAAO,SAAW,OAAe,OAAO,cAAc,OAAO,WAAW,KAAK,MAAM,GACtGC,KAAe,EAAE,YAAAD,GAAU;ACE3B,SAASE,GAAIrE,GAASsE,GAAKP,GAAQ;AAC/B,EAAA/D,IAAUA,KAAW,CAAA;AACrB,QAAMuE,IAAOvE,EAAQ,UAAUA,EAAQ,MAAG,KAAQkE,GAAG;AACrD,MAAIK,EAAK,SAAS;AACd,UAAM,IAAI,MAAM,mCAAmC;AAEvD,SAAAA,EAAK,CAAC,IAAKA,EAAK,CAAC,IAAI,KAAQ,IAC7BA,EAAK,CAAC,IAAKA,EAAK,CAAC,IAAI,KAAQ,KAWtBT,GAAgBS,CAAI;AAC/B;AACA,SAASC,GAAGxE,GAASsE,GAAKP,GAAQ;AAC9B,SAAIK,GAAO,cAAsB,CAACpE,IACvBoE,GAAO,WAAU,IAErBC,GAAIrE,CAAoB;AACnC;ACDA,MAAqByE,EAAsC;AAAA,EAClD,WAAoD;AAAA,EACpD,iBAAkD;AAAA,EAClD,kBAA4D;AAAA,EAEnE,YAAY,EAAE,UAAAC,GAAU,gBAAAC,IAAiB,MAAM,iBAAAC,IAAkB,QAAuB;AACtF,SAAK,WAAWF,GAChB,KAAK,iBAAiBC,KAAkB,MACxC,KAAK,kBAAkBC,KAAmB;AAAA,EAC5C;AAAA,EAEA,YAAYzY,GAA4C;AACtD,UAAMuY,IAAW,IAAI,IAAI,KAAK,QAAQ;AACtC,WAAAA,EAAS,IAAIvY,EAAQ,WAAWA,CAAO,GAEhC,IAAIsY,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,sBAAoC;AAClC,WAAK,KAAK,iBAEH,IAAID,EAAa,EAAE,UAAU,KAAK,UAAU,gBAAgB,MAAM,iBAAiB,KAAK,gBAAA,CAAiB,IAF/E;AAAA,EAGnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsBE,GAAwD;AAC5E,WAAI,KAAK,iBAAuB,OAEzB,IAAIF,EAAa,EAAE,UAAU,KAAK,UAAU,gBAAAE,GAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,yBAAuC;AACrC,QAAI,CAAC,KAAK,SAAU,QAAO;AAE3B,QAAIE,IAAU;AACd,UAAMH,IAAW,IAAI,IAAI,KAAK,QAAQ;AACtC,eAAW,CAAC1V,GAAI7C,CAAO,KAAKuY;AAC1B,MAAIvY,EAAQ,SAAS,eAAe,CAACA,EAAQ,eAC3CuY,EAAS,IAAI1V,GAAI,EAAE,GAAG7C,GAAS,YAAY,IAAM,aAAa,IAAM,GACpE0Y,IAAU,KAKR1Y,EAAQ,SAAS,cAAcA,EAAQ,eACzCuY,EAAS,IAAI1V,GAAI,EAAE,GAAG7C,GAAS,YAAY,IAAO,GAClD0Y,IAAU;AAId,WAAKA,IAEE,IAAIJ,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB,IAF3F;AAAA,EAGvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAAwC;AACtC,WAAO,KAAK,uBAAA;AAAA,EACd;AAAA,EAEA,UAAU3V,GAAgD;AACxD,YAAQA,EAAS,WAAA;AAAA,MACf,KAAKnE,EAAU;AACb,eAAO,KAAK,eAAemE,CAAgD;AAAA,MAC7E,KAAKnE,EAAU;AACb,eAAO,KAAK,eAAemE,CAAgD;AAAA,MAC7E,KAAKnE,EAAU;AACb,eAAO,KAAK,kBAAkBmE,CAAmD;AAAA,MACnF,KAAKnE,EAAU;AACb,eAAO,KAAK,cAAcmE,CAA+C;AAAA,MAC3E,KAAKnE,EAAU;AACb,eAAO,KAAK,kBAAkBmE,CAAmD;AAAA,MACnF,KAAKnE,EAAU;AACb,eAAO,KAAK,gBAAgBmE,CAAyD;AAAA,MACvF,KAAKnE,EAAU;AACb,eAAO,KAAK,gBAAgBmE,CAAyD;AAAA,MACvF,KAAKnE,EAAU;AACb,eAAO,KAAK,mBAAmBmE,CAA4D;AAAA,MAC7F,KAAKnE,EAAU;AACb,eAAO,KAAK,cAAcmE,CAAuD;AAAA,MACnF,KAAKnE,EAAU;AACb,eAAO,KAAK,cAAcmE,CAAuD;AAAA,MACnF,KAAKnE,EAAU;AACb,eAAO,KAAK,iBAAiBmE,CAA0D;AAAA,MACzF,KAAKnE,EAAU;AACb,eAAO,KAAK,gBAAgBmE,CAAkD;AAAA,MAChF,KAAKnE,EAAU;AACb,eAAO,KAAK,mBAAmBmE,CAAqD;AAAA,MACtF,KAAKnE,EAAU;AACb,eAAO,KAAK,kBAAkBmE,CAAoD;AAAA,MACpF,KAAKnE,EAAU;AACb,eAAO,KAAK,gBAAgBmE,CAAiD;AAAA,MAC/E,KAAKnE,EAAU;AACb,eAAO,KAAK,mBAAmBmE,CAAoD;AAAA,MACrF,KAAKnE,EAAU;AACb,eAAO,KAAK,eAAemE,CAAwC;AAAA,MACrE;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAc5C,GAAmD;AACvE,WAAOA,GAAS,SAAS,SAAS,CAACA,EAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBAAmBA,GAAmD;AAC5E,WAAOA,GAAS,SAAS,cAAc,CAACA,EAAQ;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAmBA,GAAmD;AAC5E,WAAOA,GAAS,SAAS,eAAeA,EAAQ,eAAe;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAiBA,GAAmD;AAC1E,WAAOA,GAAS,SAAS,YAAY,CAACA,EAAQ;AAAA,EAChD;AAAA,EAEA,eAAe4C,GAA8D;AAC3E,UAAM5C,IAAU4C,EAAS,KAAK,aAAa;AAG3C,QAAI5C,EAAQ,gBAAiB,QAAO;AAGpC,QAAI,KAAK,cAAc,KAAK,UAAU,IAAIA,EAAQ,SAAS,CAAC,EAAG,QAAO;AAEtE,UAAMuY,IAAW,IAAI,IAAI,KAAK,QAAQ;AAEtC,WAAAA,EAAS,IAAIvY,EAAQ,WAAW;AAAA,MAC9B,MAAM;AAAA,MACN,WAAWvB,EAAU;AAAA,MACrB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,WAAWuB,EAAQ;AAAA,MACnB,SAAAA;AAAA,MACA,0BAAU,KAAA;AAAA,MACV,SAAS4C,EAAS;AAAA,MAClB,KAAK;AAAA,IAAA,CACN,GAEM,IAAI0V,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,eAAe3V,GAA8D;AAC3E,UAAM5C,IAAU4C,EAAS,KAAK,aAAa;AAG3C,QAAI5C,EAAQ,gBAAiB,QAAO;AAEpC,UAAM2Y,IAAiB,KAAK,UAAU,IAAI3Y,EAAQ,SAAS;AAG3D,QAAI,KAAK,cAAc2Y,CAAc,EAAG,QAAO;AAI/C,UAAMC,IAAaD,GAAgB,SAAS,QAAQA,IAAiB,QAC/DJ,IAAW,IAAI,IAAI,KAAK,QAAQ;AAEtC,WAAAA,EAAS,IAAIvY,EAAQ,WAAW;AAAA,MAC9B,MAAM;AAAA,MACN,WAAWvB,EAAU;AAAA,MACrB,UAAU;AAAA,MACV,YAAY,GAAGma,GAAY,cAAc,EAAE,GAAG5Y,EAAQ,IAAI;AAAA,MAC1D,WAAWA,EAAQ;AAAA,MACnB,SAAAA;AAAA,MACA,0BAAU,KAAA;AAAA,MACV,SAAS4C,EAAS,WAAWgW,GAAY;AAAA,MACzC,KAAKA,GAAY,OAAO;AAAA,IAAA,CACzB,GAEM,IAAIN,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,kBAAkB3V,GAAiE;AACjF,UAAM5C,IAAU4C,EAAS,KAAK,gBAAgB;AAG9C,QAAI5C,EAAQ,gBAAiB,QAAO;AAEpC,UAAMuY,IAAW,IAAI,IAAI,KAAK,QAAQ,GAEhCI,IAAiBJ,EAAS,IAAIvY,EAAQ,SAAS,GAC/C4Y,IAAaD,GAAgB,SAAS,QAAQA,IAAiB,QAK/DF,IAAkB,KAAK,iBAAiB,IAAIzY,EAAQ,SAAS,GAC7D6Y,IAAWJ,KAAmBG,GAAY;AAEhD,IAAAL,EAAS,IAAIvY,EAAQ,WAAW;AAAA,MAC9B,MAAM;AAAA,MACN,WAAWvB,EAAU;AAAA,MACrB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,WAAWuB,EAAQ;AAAA,MACnB,SAAAA;AAAA,MACA,GAAI6Y,IAAW,EAAE,UAAAA,EAAA,IAAa,CAAA;AAAA,MAC9B,0BAAU,KAAA;AAAA,MACV,SAASjW,EAAS,WAAWgW,GAAY;AAAA,MACzC,KAAK,KAAK,UAAUhW,CAAQ;AAAA,IAAA,CAC7B;AAED,QAAIkW,IAAmB,KAAK;AAC5B,WAAIL,MACFK,IAAmB,IAAI,IAAI,KAAK,eAAe,GAC/CA,EAAiB,OAAO9Y,EAAQ,SAAS,IAGpC,IAAIsY,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiBO,GAAkB;AAAA,EAC9G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkBlW,GAAiE;AACjF,UAAM8R,IAAO9R,EAAS,KAAK,iBACrBiW,IAAiC;AAAA,MACrC,SAASnE,EAAK;AAAA,MACd,GAAIA,EAAK,OAAO,EAAE,SAASA,EAAK,KAAA,IAAS,CAAA;AAAA,IAAC;AAG5C,WAAO,KAAK,cAAcA,EAAK,iBAAiBmE,CAAQ;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAcE,GAAyBF,GAA8C;AACnF,UAAMG,IAAS,KAAK,UAAU,IAAID,CAAe;AAEjD,QAAIC,GAAQ,SAAS,OAAO;AAC1B,YAAMT,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCU,IAAgC,EAAE,GAAGD,GAAQ,UAAAH,EAAA;AACnD,aAAAN,EAAS,IAAIQ,GAAiBE,CAAK,GAE5B,IAAIX,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,IAClH;AAEA,UAAME,IAAkB,IAAI,IAAI,KAAK,eAAe;AACpD,WAAAA,EAAgB,IAAIM,GAAiBF,CAAQ,GAEtC,IAAIP,EAAa,EAAE,UAAU,KAAK,UAAU,gBAAgB,KAAK,gBAAgB,iBAAAG,GAAiB;AAAA,EAC3G;AAAA,EAEA,gBAAgB7V,GAAuE;AACrF,UAAM5C,IAAU4C,EAAS,KAAK,qBAAqB;AAGnD,QAAI5C,EAAQ,gBAAiB,QAAO;AAGpC,QAAI,KAAK,mBAAmB,KAAK,UAAU,IAAIA,EAAQ,SAAS,CAAC,EAAG,QAAO;AAE3E,UAAMuY,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCW,IAAwC;AAAA,MAC5C,MAAM;AAAA,MACN,WAAWlZ,EAAQ;AAAA,MACnB,MAAMA,EAAQ;AAAA,MACd,YAAY;AAAA,MACZ,0BAAU,KAAA;AAAA,MACV,SAAS4C,EAAS;AAAA,IAAA;AAEpB,WAAA2V,EAAS,IAAIvY,EAAQ,WAAWkZ,CAAQ,GAEjC,IAAIZ,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,gBAAgB3V,GAAuE;AACrF,UAAM5C,IAAU4C,EAAS,KAAK,qBAAqB;AAGnD,QAAI5C,EAAQ,gBAAiB,QAAO;AAEpC,UAAM2Y,IAAiB,KAAK,UAAU,IAAI3Y,EAAQ,SAAS;AAG3D,QAAI,KAAK,mBAAmB2Y,CAAc,EAAG,QAAO;AAIpD,UAAMQ,IAAkBR,GAAgB,SAAS,aAAaA,IAAiB,QACzEJ,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCW,IAAwC;AAAA,MAC5C,MAAM;AAAA,MACN,WAAWlZ,EAAQ;AAAA,MACnB,MAAM,GAAGmZ,GAAiB,QAAQ,EAAE,GAAGnZ,EAAQ,IAAI;AAAA,MACnD,YAAY;AAAA,MACZ,MAAMmZ,GAAiB,QAAQ,oBAAI,KAAA;AAAA,MACnC,SAASvW,EAAS,WAAWuW,GAAiB;AAAA,IAAA;AAEhD,WAAAZ,EAAS,IAAIvY,EAAQ,WAAWkZ,CAAQ,GAEjC,IAAIZ,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,mBAAmB3V,GAA0E;AAC3F,UAAM5C,IAAU4C,EAAS,KAAK,wBAAwB;AAGtD,QAAI5C,EAAQ,gBAAiB,QAAO;AAEpC,UAAM2Y,IAAiB,KAAK,UAAU,IAAI3Y,EAAQ,SAAS,GACrDmZ,IAAkBR,GAAgB,SAAS,aAAaA,IAAiB,QAEzEJ,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCW,IAAwC;AAAA,MAC5C,MAAM;AAAA,MACN,WAAWlZ,EAAQ;AAAA;AAAA;AAAA,MAGnB,MAAMA,EAAQ;AAAA,MACd,YAAY;AAAA,MACZ,MAAMmZ,GAAiB,QAAQ,oBAAI,KAAA;AAAA,MACnC,SAASvW,EAAS,WAAWuW,GAAiB;AAAA,IAAA;AAEhD,WAAAZ,EAAS,IAAIvY,EAAQ,WAAWkZ,CAAQ,GAEjC,IAAIZ,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,cAAc3V,GAAqE;AACjF,UAAM5C,IAAU4C,EAAS,KAAK,mBAAmB;AAGjD,QAAI5C,EAAQ,gBAAiB,QAAO;AAGpC,QAAI,KAAK,iBAAiB,KAAK,UAAU,IAAIA,EAAQ,SAAS,CAAC,EAAG,QAAO;AAEzE,UAAMuY,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCa,IAAoC;AAAA,MACxC,MAAM;AAAA,MACN,WAAWpZ,EAAQ;AAAA,MACnB,MAAM;AAAA,MACN,WAAW;AAAA,MACX,0BAAU,KAAA;AAAA,MACV,SAAS4C,EAAS;AAAA,IAAA;AAEpB,WAAA2V,EAAS,IAAIvY,EAAQ,WAAWoZ,CAAM,GAE/B,IAAId,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,cAAc3V,GAAqE;AACjF,UAAM5C,IAAU4C,EAAS,KAAK,mBAAmB;AAGjD,QAAI5C,EAAQ,gBAAiB,QAAO;AAEpC,UAAM2Y,IAAiB,KAAK,UAAU,IAAI3Y,EAAQ,SAAS;AAG3D,QAAI,KAAK,iBAAiB2Y,CAAc,EAAG,QAAO;AAIlD,UAAMU,IAAgBV,GAAgB,SAAS,WAAWA,IAAiB,QACrEJ,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCa,IAAoC;AAAA,MACxC,MAAM;AAAA,MACN,WAAWpZ,EAAQ;AAAA;AAAA,MAEnB,MAAM,GAAGqZ,GAAe,QAAQ,EAAE,GAAGrZ,EAAQ,IAAI;AAAA,MACjD,OAAOqZ,GAAe;AAAA,MACtB,WAAW;AAAA,MACX,MAAMA,GAAe,QAAQ,oBAAI,KAAA;AAAA,MACjC,SAASzW,EAAS,WAAWyW,GAAe;AAAA,IAAA;AAE9C,WAAAd,EAAS,IAAIvY,EAAQ,WAAWoZ,CAAM,GAE/B,IAAId,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,iBAAiB3V,GAAwE;AACvF,UAAM5C,IAAU4C,EAAS,KAAK,sBAAsB;AAGpD,QAAI5C,EAAQ,gBAAiB,QAAO;AAEpC,UAAMsZ,IAAWtZ,EAAQ,UAAU,SAASrB,GAAoB,SAASqB,EAAQ,WAAW,QACtFuZ,IAAOD,GAAU,QAAQ;AAK/B,QAAI,CAACC,GAAM;AACT,UAAI,CAAC,KAAK,UAAU,IAAIvZ,EAAQ,SAAS,EAAG,QAAO;AAEnD,YAAMuY,IAAW,IAAI,IAAI,KAAK,QAAQ;AACtCA,aAAAA,EAAS,OAAOvY,EAAQ,SAAS,GAE1B,IAAIsY,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,gBAAA,CAAiB;AAAA,IAClH;AAEA,UAAMI,IAAiB,KAAK,UAAU,IAAI3Y,EAAQ,SAAS,GACrDqZ,IAAgBV,GAAgB,SAAS,WAAWA,IAAiB,QACrEJ,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCa,IAAoC;AAAA,MACxC,MAAM;AAAA,MACN,WAAWpZ,EAAQ;AAAA;AAAA;AAAA,MAGnB,MAAAuZ;AAAA,MACA,OAAOD,GAAU;AAAA,MACjB,WAAW;AAAA,MACX,MAAMD,GAAe,QAAQ,oBAAI,KAAA;AAAA,MACjC,SAASzW,EAAS,WAAWyW,GAAe;AAAA,IAAA;AAE9C,WAAAd,EAAS,IAAIvY,EAAQ,WAAWoZ,CAAM,GAE/B,IAAId,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,cAAc3V,GAA6D;AACzE,UAAM8R,IAAO9R,EAAS,KAAK;AAS3B,SAHE,KAAK,UAAU,IAAI8R,EAAK,SAAS,MAChCA,EAAK,kBAAkB,KAAK,UAAU,IAAIA,EAAK,eAAe,IAAI,UAEvD,SAAS,OAAQ,QAAO;AAEtC,UAAM6D,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCiB,IAAuC;AAAA,MAC3C,MAAM;AAAA,MACN,WAAW9E,EAAK;AAAA,MAChB,MAAMA,EAAK;AAAA,MACX,SAASA,EAAK;AAAA,MACd,OAAOA,EAAK;AAAA,MACZ,iBAAiBA,EAAK;AAAA,MACtB,cAAcA,EAAK;AAAA,MACnB,0BAAU,KAAA;AAAA,MACV,SAAS9R,EAAS;AAAA,IAAA;AAEpB,WAAA2V,EAAS,IAAI7D,EAAK,WAAW8E,CAAW,GAEjC,IAAIlB,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,eAAe3V,GAAsD;AACnE,UAAM6W,IAAYC,GAAA,GACZzb,IAAQ2E,EAAS,KAAK,SAAS,OAE/B2V,IAAW,IAAI,IAAI,KAAK,QAAQ;AAEtC,WAAAA,EAAS,IAAIkB,GAAW;AAAA,MACtB,MAAM;AAAA,MACN,WAAWhb,EAAU;AAAA,MACrB,WAAAgb;AAAA,MACA,OAAAxb;AAAA,MACA,0BAAU,KAAA;AAAA,MACV,SAAS2E,EAAS;AAAA,IAAA,CACnB,GAEM,IAAI0V,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,gBAAgB3V,GAAgE;AAC9E,UAAM+W,IAAgB/W,EAAS,KAAK,eAC9B2V,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCqB,IAAc,GAAGD,EAAc,SAAS,IAAIA,EAAc,OAAO;AAQvE,QAAI,KAAK,mBAAmB,KAAK,UAAU,IAAIC,CAAW,CAAC,EAAG,QAAO;AAErE,UAAMC,IAA+C;AAAA,MACnD,MAAM;AAAA,MACN,WAAWpb,EAAU;AAAA,MACrB,WAAWmb;AAAA,MACX,WAAWD,EAAc;AAAA,MACzB,SAASA,EAAc;AAAA,MACvB,UAAUA,EAAc,SAAS;AAAA,MACjC,QAAQA,EAAc,SAAS;AAAA,MAC/B,aAAaA,EAAc,SAAS;AAAA,MACpC,WAAWA,EAAc,SAAS;AAAA,MAClC,WAAWA,EAAc;AAAA,MACzB,iBAAiBA,EAAc;AAAA,MAC/B,YAAY;AAAA,MACZ,0BAAU,KAAA;AAAA,MACV,SAAS/W,EAAS;AAAA,IAAA;AAGpB,WAAA2V,EAAS,IAAIqB,GAAaC,CAAe,GAElC,IAAIvB,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,mBAAmB3V,GAAmE;AACpF,UAAMkX,IAAmBlX,EAAS,KAAK,kBACjC2V,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCqB,IAAc,GAAGE,EAAiB,SAAS,IAAIA,EAAiB,OAAO,IAEvEC,IAAkBxB,EAAS,IAAIqB,CAAW;AAEhD,QAAIG,GAAiB,SAAS,aAAa;AACzC,YAAMC,IAA8C;AAAA,QAClD,GAAGD;AAAA,QACH,WAAWtb,EAAU;AAAA,QACrB,QAAQqb,EAAiB;AAAA,QACzB,SAASA,EAAiB;AAAA,QAC1B,SAASA,EAAiB;AAAA,QAC1B,YAAY;AAAA,QACZ,SAASlX,EAAS,WAAWmX,EAAgB;AAAA,MAAA;AAE/C,MAAAxB,EAAS,IAAIqB,GAAaI,CAAc;AAAA,IAC1C,OAAO;AAML,YAAMC,IAA+C;AAAA,QACnD,MAAM;AAAA,QACN,WAAWxb,EAAU;AAAA,QACrB,WAAWmb;AAAA,QACX,WAAWE,EAAiB;AAAA,QAC5B,SAASA,EAAiB;AAAA,QAC1B,UAAUA,EAAiB,SAAS;AAAA,QACpC,QAAQA,EAAiB,SAAS;AAAA,QAClC,aAAaA,EAAiB,SAAS;AAAA,QACvC,WAAWA,EAAiB,SAAS;AAAA,QACrC,WAAWA,EAAiB;AAAA,QAC5B,iBAAiBA,EAAiB;AAAA,QAClC,QAAQA,EAAiB;AAAA,QACzB,SAASA,EAAiB;AAAA,QAC1B,SAASA,EAAiB;AAAA,QAC1B,YAAY;AAAA,QACZ,0BAAU,KAAA;AAAA,QACV,SAASlX,EAAS;AAAA,MAAA;AAEpB,MAAA2V,EAAS,IAAIqB,GAAaK,CAAe;AAAA,IAC3C;AAEA,WAAO,IAAI3B,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,kBAAkB3V,GAAkE;AAClF,UAAMsX,IAAUtX,EAAS,KAAK;AAE9B,WAAO,IAAI0V,EAAa;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,gBAAgB4B;AAAA,MAChB,iBAAiB,KAAK;AAAA,IAAA,CACvB;AAAA,EACH;AAAA,EAEA,gBAAgBtX,GAA+D;AAC7E,UAAMuX,IAAQvX,EAAS,KAAK,eACtB2V,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCvH,IAAM,YAAYmJ,EAAM,eAAe,UAEvCna,IAAuC;AAAA,MAC3C,MAAM;AAAA,MACN,WAAWgR;AAAA,MACX,MAAM;AAAA,MACN,iBAAiBmJ,EAAM;AAAA,MACvB,SAASA,EAAM;AAAA,MACf,cAAcA,EAAM;AAAA,MACpB,aAAaA,EAAM;AAAA,MACnB,0BAAU,KAAA;AAAA,MACV,SAASvX,EAAS;AAAA,IAAA;AAMpB,WAAA2V,EAAS,OAAOvH,CAAG,GACnBuH,EAAS,IAAIvH,GAAKhR,CAAO,GAElB,IAAIsY,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AAAA,EAEA,mBAAmB3V,GAAkE;AACnF,UAAMgG,IAAWhG,EAAS,KAAK,kBACzB2V,IAAW,IAAI,IAAI,KAAK,QAAQ,GAChCvH,IAAM,YAAYpI,EAAS,eAAe,aAE1C5I,IAAuC;AAAA,MAC3C,MAAM;AAAA,MACN,WAAWgR;AAAA,MACX,MAAM;AAAA,MACN,iBAAiBpI,EAAS;AAAA,MAC1B,SAASA,EAAS;AAAA,MAClB,cAAcA,EAAS;AAAA,MACvB,QAAQA,EAAS;AAAA,MACjB,SAASA,EAAS;AAAA,MAClB,0BAAU,KAAA;AAAA,MACV,SAAShG,EAAS;AAAA,IAAA;AAKpB,WAAA2V,EAAS,OAAOvH,CAAG,GACnBuH,EAAS,IAAIvH,GAAKhR,CAAO,GAElB,IAAIsY,EAAa,EAAE,UAAAC,GAAU,gBAAgB,KAAK,gBAAgB,iBAAiB,KAAK,iBAAiB;AAAA,EAClH;AACF;AC/pBA,MAAM6B,KAAa,oBAAI,IAAI,CAAC,cAAc,YAAY,CAAC;AAGhD,SAASC,GAAWC,GAA0D;AACnF,SAAOA,EAAK,gBAAgB,MAAMF,GAAW,IAAIE,EAAK,QAAQ;AAChE;AAaA,SAASC,GAASja,GAAqD;AACrE,SAAO,OAAOA,KAAU,YAAYA,MAAU,OAAQA,IAAoC;AAC5F;AAEA,SAASka,EAASla,GAAoC;AACpD,SAAO,OAAOA,KAAU,WAAWA,IAAQ;AAC7C;AAMO,SAASma,GAAiBC,GAAiC;AAChE,QAAMC,IAAkB,CAAA,GAClBC,wBAAW,IAAA;AAEjB,aAAWhG,KAAS8F,GAAQ;AAC1B,UAAMG,IAAYjG,EAAM,aAAa,CAAA,GAC/BkG,IAAUlG,EAAM,WAAW,CAAA;AAEjC,QAAIA,EAAM,aAAa,cAAc;AACnC,YAAMmG,IAAOR,GAASO,EAAQ,IAAI,GAC5BjY,IAAK2X,EAASO,GAAM,EAAE;AAE5B,UAAI,CAAClY,EAAI;AAET,MAAK+X,EAAK,IAAI/X,CAAE,KAAG8X,EAAM,KAAK9X,CAAE,GAEhC+X,EAAK,IAAI/X,GAAI;AAAA,QACX,IAAAA;AAAA,QACA,SAAS2X,EAASK,EAAU,OAAO,KAAKL,EAASO,GAAM,OAAO,KAAK;AAAA,QACnE,YAAYP,EAASK,EAAU,UAAU;AAAA,QACzC,aAAaL,EAASK,EAAU,WAAW;AAAA,QAC3C,QAAQD,EAAK,IAAI/X,CAAE,GAAG,UAAU;AAAA;AAAA,MAAA,CACjC;AAAA,IACH,WAAW+R,EAAM,aAAa,cAAc;AAC1C,YAAMoG,IAAeT,GAASO,EAAQ,YAAY,GAC5CjY,IAAK2X,EAASK,EAAU,MAAM,KAAKL,EAASM,EAAQ,MAAM,GAE1DhW,IAAM0V,EAASQ,GAAc,EAAE,KAAKR,EAASK,EAAU,MAAM;AAEnE,UAAI,CAAChY,KAAM,CAACiC,EAAI;AAEhB,YAAM0E,IAAOoR,EAAK,IAAI/X,CAAE;AAExB,MAAI2G,OAAW,IAAI3G,GAAI,EAAE,GAAG2G,GAAM,QAAQ1E,GAAI;AAAA,IAEhD;AAAA,EACF;AAEA,SAAO6V,EAAM,IAAI,CAAA9X,MAAM+X,EAAK,IAAI/X,CAAE,CAAS;AAC7C;AC9DO,SAASoY,GAAYX,GAA0D;AACpF,SAAOA,EAAK,gBAAgB,MAAMA,EAAK,aAAa;AACtD;AAGO,SAASY,GAAoBC,GAAmC;AACrE,SAAO,CAAC,CAACA;AACX;AA8BA,SAAS7V,GAAOZ,GAAe;AAC7B,EAAIA,EAAE,WAAW,cAEjBA,EAAE,SAAS,WACXA,EAAE,UAAU;AACd;AAQO,SAAS0W,GAAgBV,GAAqC;AACnE,QAAMC,IAAkB,CAAA,GAClBU,wBAAW,IAAA,GACXC,wBAAY,IAAA,GAEZC,IAAS,CAAC1Y,OACTwY,EAAK,IAAIxY,CAAE,MACd8X,EAAM,KAAK9X,CAAE,GACbwY,EAAK,IAAIxY,GAAI,EAAE,QAAQ,WAAW,GAClCyY,EAAM,IAAIzY,GAAI,oBAAI,IAAA,CAAK,IAGlBwY,EAAK,IAAIxY,CAAE;AAGpB,aAAW+R,KAAS8F;AAClB,YAAQ9F,EAAM,MAAA;AAAA,MACZ,KAAK,cAAc;AACjB,cAAMlQ,IAAI6W,EAAO3G,EAAM,SAAS;AAEhC,QAAIA,EAAM,eAAe,CAAClQ,EAAE,gBAAaA,EAAE,cAAckQ,EAAM;AAE/D;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAMlQ,IAAI6W,EAAO3G,EAAM,eAAe;AAEtC,QAAAlQ,EAAE,UAAUkQ,EAAM,WAAWlQ,EAAE,SAC/BA,EAAE,eAAekQ,EAAM,gBAAgBlQ,EAAE,cACzCA,EAAE,cAAckQ,EAAM,eAAelQ,EAAE,aACvCY,GAAOZ,CAAC;AAER;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAGhB,QAAAY,GAAOiW,EAAO3G,EAAM,eAAe,CAAC,GACnC0G,EAAM,IAAI1G,EAAM,eAAe,EAAoC,IAAIA,EAAM,WAAW;AAAA,UACvF,aAAaA,EAAM;AAAA,UACnB,UAAUA,EAAM;AAAA,UAChB,WAAWA,EAAM,aAAa,CAAA;AAAA,UAC9B,QAAQA,EAAM;AAAA,UACd,QAAQ;AAAA,QAAA,CACT;AAED;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM4G,IAAOF,EAAM,IAAI1G,EAAM,eAAe,GAAG,IAAIA,EAAM,SAAS;AAElE,QAAI4G,MAAMA,EAAK,SAAS5G,EAAM,UAAU,UAAU;AAElD;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAMlQ,IAAI6W,EAAO3G,EAAM,eAAe;AAEtC,QAAAlQ,EAAE,SAASkQ,EAAM,QACjBlQ,EAAE,UAAUkQ,EAAM;AAElB;AAAA,MACF;AAAA,IAAA;AAIJ,SAAO+F,EAAM,IAAI,CAAA9X,OAAO;AAAA,IACtB,iBAAiBA;AAAA,IACjB,GAAIwY,EAAK,IAAIxY,CAAE;AAAA,IACf,OAAO,MAAM,KAAMyY,EAAM,IAAIzY,CAAE,EAAoC,QAAQ;AAAA,EAAA,EAC3E;AACJ;AChIA,SAAS4Y,GAAInb,GAAoC;AAC/C,SAAO,OAAOA,KAAU,WAAWA,IAAQ;AAC7C;AAWO,SAASob,GAA6BnD,GAAkD;AAC7F,QAAMmC,IAA0B,CAAA;AAEhC,aAAW1a,KAAWuY,GAAU;AAC9B,QAAIvY,EAAQ,SAAS,eAAeib,GAAYjb,CAAO,GAAG;AACxD,MAAA0a,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,WAAW1a,EAAQ,aAAaA,EAAQ;AAAA,QACxC,aAAayb,GAAIzb,EAAQ,UAAU,WAAW;AAAA,MAAA,CAC/C;AACD;AAAA,IACF;AAEA,QAAIA,EAAQ,SAAS,eAAekb,GAAoBlb,EAAQ,eAAe,GAAG;AAChF,YAAM2b,IAAY3b,EAAQ,aAAaA,EAAQ;AAE/C,MAAA0a,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,iBAAiB1a,EAAQ;AAAA,QACzB,WAAA2b;AAAA,QACA,aAAa3b,EAAQ;AAAA,QACrB,UAAUA,EAAQ;AAAA,QAClB,WAAWA,EAAQ;AAAA,QACnB,QAAQA,EAAQ;AAAA,MAAA,CACjB,GAEGA,EAAQ,cACV0a,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,iBAAiB1a,EAAQ;AAAA,QACzB,WAAA2b;AAAA,QACA,SAAS3b,EAAQ;AAAA,MAAA,CAClB;AAGH;AAAA,IACF;AAEA,QAAIA,EAAQ,SAAS,cAAcA,EAAQ,SAAS,SAAS;AAC3D,MAAA0a,EAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,iBAAiB1a,EAAQ;AAAA,QACzB,SAASA,EAAQ;AAAA,QACjB,cAAcA,EAAQ;AAAA,QACtB,aAAaA,EAAQ;AAAA,MAAA,CACtB;AACD;AAAA,IACF;AAEA,IAAIA,EAAQ,SAAS,cAAcA,EAAQ,SAAS,cAAcA,EAAQ,UACxE0a,EAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,iBAAiB1a,EAAQ;AAAA,MACzB,QAAQA,EAAQ;AAAA,MAChB,SAASA,EAAQ;AAAA,IAAA,CAClB;AAAA,EAEL;AAEA,SAAO0a;AACT;AAGO,SAASkB,GAAYC,GAAoC;AAC9D,QAAMtD,IAAW,MAAM,KAAKsD,EAAa,UAAU,OAAA,KAAY,CAAA,CAAE,EAAE;AAAA,IACjE,CAAC7b,MACCA,EAAQ,SAAS,eAAeA,EAAQ,cAAcqa,GAAWra,CAAO;AAAA,EAAA;AAG5E,SAAOya,GAAiBlC,CAAQ;AAClC;AAGO,SAASuD,GAAgBD,GAAwC;AACtE,SAAOT,GAAgBM,GAA6B,MAAM,KAAKG,EAAa,UAAU,OAAA,KAAY,CAAA,CAAE,CAAC,CAAC;AACxG;AAGO,SAASE,GAAWvb,GAAWC,GAAoB;AACxD,SAAID,MAAMC,IAAU,KAEhBD,EAAE,WAAWC,EAAE,SAAe,KAE3BD,EAAE,MAAM,CAACua,GAAM/Z,MAAM;AAC1B,UAAMgb,IAAQvb,EAAEO,CAAC;AAEjB,WACE+Z,EAAK,OAAOiB,EAAM,MAClBjB,EAAK,WAAWiB,EAAM,UACtBjB,EAAK,YAAYiB,EAAM,WACvBjB,EAAK,eAAeiB,EAAM,cAC1BjB,EAAK,gBAAgBiB,EAAM;AAAA,EAE/B,CAAC;AACH;AAEA,SAASC,GAAWzb,GAAuBC,GAAgC;AACzE,SAAID,EAAE,WAAWC,EAAE,SAAe,KAE3BD,EAAE,MAAM,CAACgb,GAAMxa,MAAM;AAC1B,UAAMgb,IAAQvb,EAAEO,CAAC;AAEjB,WACEwa,EAAK,aAAaQ,EAAM,YACxBR,EAAK,gBAAgBQ,EAAM,eAC3BR,EAAK,WAAWQ,EAAM,UACtBR,EAAK,WAAWQ,EAAM;AAAA,EAE1B,CAAC;AACH;AAGO,SAASE,GAAe1b,GAAeC,GAAwB;AACpE,SAAID,MAAMC,IAAU,KAEhBD,EAAE,WAAWC,EAAE,SAAe,KAE3BD,EAAE,MAAM,CAAC2b,GAAUnb,MAAM;AAC9B,UAAMgb,IAAQvb,EAAEO,CAAC;AAEjB,WACEmb,EAAS,oBAAoBH,EAAM,mBACnCG,EAAS,WAAWH,EAAM,UAC1BG,EAAS,iBAAiBH,EAAM,gBAChCG,EAAS,gBAAgBH,EAAM,eAC/BG,EAAS,YAAYH,EAAM,WAC3BC,GAAWE,EAAS,OAAOH,EAAM,KAAK;AAAA,EAE1C,CAAC;AACH;AAoBO,SAASI,GAAoBC,GAAwD;AAC1F,QAAMC,IAAS,IAAI1Q,EAAwB,EAAE,GACvC2Q,IAAa,IAAI3Q,EAA4B,EAAE,GAC/CE,IAAe,IAAIxF,EAAA;AAEzB,SAAAwF,EAAa,IAAIuQ,EAAc,KAAKjM,EAAIwL,EAAW,GAAG3I,EAAqB8I,EAAU,CAAC,EAAE,UAAUO,CAAM,CAAC,GACzGxQ,EAAa;AAAA,IACXuQ,EAAc,KAAKjM,EAAI0L,EAAe,GAAG7I,EAAqBiJ,EAAc,CAAC,EAAE,UAAUK,CAAU;AAAA,EAAA,GAG9F;AAAA,IACL,QAAQD,EAAO,aAAA;AAAA,IACf,YAAYC,EAAW,aAAA;AAAA,IACvB,UAAU,MAAMD,EAAO;AAAA,IACvB,cAAc,MAAMC,EAAW;AAAA,IAC/B,UAAU,MAAMzQ,EAAa,YAAA;AAAA,EAAY;AAE7C;AC1LO,SAAS0Q,GAAkBC,GAAyD;AACzF,QAAMC,wBAAa,IAAA;AACnB,aAAWrH,KAAWoH,EAAU,CAAAC,EAAO,IAAIrH,EAAQ,aAAaA,CAAO;AAEvE,SAAO,CAAC,GAAGqH,EAAO,OAAA,CAAQ,EAAE;AAAA,IAAK,CAAClc,GAAGC,OAClCD,EAAE,wBAAwBA,EAAE,aAAa,cAAcC,EAAE,wBAAwBA,EAAE,WAAW;AAAA,EAAA;AAEnG;ACcA,MAAMkc,KAA6B,EAAE,MAAM,MAAM,WAAW,OAAA,GAG/CC,KAAwB;AAErC,SAASC,GAAerc,GAAcC,GAAuB;AAC3D,SAAOD,EAAE,SAASC,EAAE,QAAQD,EAAE,cAAcC,EAAE,aAAaD,EAAE,cAAcC,EAAE;AAC/E;AAEA,MAAqBqc,EAAQ;AAAA,EACnB;AAAA,EAED;AAAA,EACA;AAAA;AAAA;AAAA,EAGC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA,kBAA4B,CAAA;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGQ;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA,EAGA;AAAA,EAEA,YAAYlV,GAAuB;AACzC,QAAI,CAACA,EAAO;AACV,YAAM,IAAI,MAAM,yBAAyB;AAG3C,QAAI,CAACA,EAAO;AACV,YAAM,IAAI,MAAM,kCAAkC;AAGpD,SAAK,SAASA,EAAO,QACrB,KAAK,kBAAkBA,EAAO,iBAC9B,KAAK,kBAAkBA,EAAO,iBAC9B,KAAK,eAAeA,EAAO,YAAY,QAEvC,KAAK,gBAAgB,IAAIgE,EAAgB,EAAK,GAC9C,KAAK,mBAAmB,IAAIA,EAA2B+Q,EAAe,GACtE,KAAK,gBAAgB,IAAI/Q,EAAgBhE,EAAO,YAAY,GAC5D,KAAK,sBAAsB,IAAIgE,EAA+BhE,EAAO,gBAAgB,IAAI,GACzF,KAAK,0BAA0B,IAAIgE,EAA+B,IAAI,GACtE,KAAK,sBAAsB,IAAIA,EAA8B,MAAM,GACnE,KAAK,2BAA2B,IAAIA;AAAA,MAClC4Q,GAAkB5U,EAAO,qBAAqB,CAAA,CAAE;AAAA,IAAA,GAElD,KAAK,gBAAgBwU,GAAoB,KAAK,aAAa,GAC3D,KAAK,SAAS,KAAK,cAAc,QACjC,KAAK,aAAa,KAAK,cAAc,YAErC,KAAK,gBAAgB,KAAK,oBAAoB,KAAKnJ,GAAsB,GAEzE,KAAK,oBAAoB,KAAK,wBAAwB,KAAKA,GAAsB,GAGjF,KAAK,gBAAgB,KAAK,oBAAoB,KAAKA,GAAsB,GAGzE,KAAK,qBAAqB,KAAK,yBAAyB,KAAKA,GAAsB,GAGnF,KAAK,aAAa,KAAK,iBAAiB,KAAKA,EAAqB4J,EAAc,CAAC,GACjF,KAAK,iBAAiBjV,EAAO;AAAA,EAC/B;AAAA;AAAA,EAGO,WAAmB;AACxB,WAAO,KAAK,cAAc,SAAA;AAAA,EAC5B;AAAA;AAAA,EAGO,eAA2B;AAChC,WAAO,KAAK,cAAc,aAAA;AAAA,EAC5B;AAAA;AAAA,EAGO,kBAAiC;AACtC,WAAO,KAAK,oBAAoB;AAAA,EAClC;AAAA;AAAA,EAGO,sBAAqC;AAC1C,WAAO,KAAK,wBAAwB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,wBAA8B;AACnC,SAAK,wBAAwB,KAAK,IAAI;AAAA,EACxC;AAAA;AAAA,EAGO,kBAAgC;AACrC,WAAO,KAAK,oBAAoB;AAAA,EAClC;AAAA;AAAA,EAGO,uBAA0C;AAC/C,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAAA;AAAA,EAGO,eAA0B;AAC/B,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA;AAAA,EAGO,qBAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,uBAAuBmV,GAAwC;AACpE,UAAMpU,IAAO6T,GAAkBO,CAAI;AACnC,SAAK,kBAAkB,KAAK,gBAAgB,OAAO,CAAAC,MAAQ,CAACrU,EAAK,KAAK,CAAA0M,MAAWA,EAAQ,gBAAgB2H,CAAI,CAAC,GAC9G,KAAK,yBAAyB,KAAKrU,CAAI;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,YAAYqN,GAA2B;AAC5C,UAAMiH,IAAU,KAAK,yBAAyB,OACxCtU,IAAOsU,EAAQ,OAAO,CAAA5H,MAAWA,EAAQ,gBAAgBW,CAAW;AAC1E,IAAIrN,EAAK,WAAWsU,EAAQ,UAAQ,KAAK,yBAAyB,KAAKtU,CAAI;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAkBqN,GAA2B;AAClD,IAAK,KAAK,gBAAgB,SAASA,CAAW,MAC5C,KAAK,kBAAkB,CAAC,GAAG,KAAK,iBAAiBA,CAAW,IAGzD,KAAK,gBAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,kBAAiC;AAC5C,QAAI,CAAC,KAAK,OAAO,gBAAiB;AAElC,UAAMyG,IAAW,MAAM,KAAK,OAAO,gBAAgB,KAAK,eAAe;AACvE,IAAIA,KAAU,KAAK,uBAAuBA,EAAS,iBAAiB;AAAA,EACtE;AAAA;AAAA,EAGO,gBAAgBS,GAA4B;AACjD,SAAK,oBAAoB,KAAKA,CAAK;AAAA,EACrC;AAAA,EAEA,OAAc,OAAOtV,GAAgC;AACnD,UAAMuV,IAAU,IAAIL,EAAQlV,CAAM;AAClC,WAAAuV,EAAQ,UAAA,GAEDA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAoB,KAClBvV,GACAoM,GACAH,GACAuJ,GACkB;AAClB,UAAMD,IAAU,IAAIL,EAAQlV,CAAM;AAElC,QAAI;AACF,aAAAuV,EAAQ,UAAA,GAKRC,IAAmBD,CAAO,GAE1B,MAAMA,EAAQ,YAAYnJ,GAASH,CAAO,GAEnCsJ;AAAA,IACT,SAASlf,GAAO;AACd,YAAAkf,EAAQ,MAAA,GAEFlf;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAoB,MAClB2J,GACAoM,GACAH,GACAuJ,GACkB;AAClB,QAAI,CAACxV,EAAO,OAAO;AAKjB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAKJ,iBAAMA,EAAO,OAAO,cAAcA,EAAO,eAAe,GAEjDkV,EAAQ,KAAKlV,GAAQoM,GAASH,GAASuJ,CAAgB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAoB,QAClBxV,GACAiM,GACAuJ,GACkB;AAClB,UAAMD,IAAU,IAAIL,EAAQlV,CAAM;AAElC,QAAI;AACF,aAAAuV,EAAQ,UAAA,GAKRC,IAAmBD,CAAO,GAE1B,MAAMA,EAAQ,cAActJ,CAAO,GAE5BsJ;AAAA,IACT,SAASlf,GAAO;AACd,YAAAkf,EAAQ,MAAA,GAEFlf;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,SAAK,qBAAqBkT,GAAc;AAAA,MACtC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,CACN,EACE;AAAA,MACCf;AAAA,QACE,CAAC;AAAA,UACCiN;AAAA,UACAxB;AAAA,UACAyB;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,QAAA,OACK;AAAA,UACL,cAAAP;AAAA,UACA,cAAAxB;AAAA,UACA,OAAAyB;AAAA,UACA,WAAAC;AAAA,UACA,cAAAC;AAAA,UACA,kBAAAC;AAAA,UACA,cAAAC;AAAA,UACA,mBAAAC;AAAA,UACA,WAAAC;AAAA,QAAA;AAAA,MACF;AAAA,IACF,EAED,UAAU,KAAK,cAAc;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN5J,GACqC;AACrC,QAAI,OAAOA,KAAY;AACrB,UAAI;AACF,eAAOA,EAAA;AAAA,MACT,SAAS/V,GAAO;AACd,cAAM,IAAI;AAAA,UACR,uCAAuCA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK,CAAC;AAAA,QAAA;AAAA,MAEjG;AAGF,WAAO+V;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBAAmB6J,GAA4B;AACrD,YAAQA,GAAA;AAAA,MACN,KAAKpf,EAAU;AACb,aAAK,oBAAoB,KAAK,WAAW;AAEzC;AAAA,MACF,KAAKA,EAAU;AACb,aAAK,oBAAoB,KAAK,OAAO;AAErC;AAAA,MACF,KAAKA,EAAU;AAAA,MACf,KAAKA,EAAU;AACb,aAAK,oBAAoB,KAAK,MAAM;AAEpC;AAAA,IAEA;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBACNoV,GACA7R,GACAC,GACiB;AACjB,WAAO;AAAA,MACL,YAAY4R,GAAS;AAAA,MACrB,cAAc,CAACjR,MAA2C;AAuCxD,YAtCAiR,GAAS,eAAejR,CAAQ,GAIhC,KAAK,iBAAiBA,EAAS,SAAS,GAIpCA,EAAS,cAAcnE,EAAU,wBACnC,KAAK,oBAAoB;AAAA,UACtBmE,EAAyD,KAAK,mBAAmB;AAAA,QAAA,GAQlFA,EAAS,cAAcnE,EAAU,oBACnC,KAAK,wBAAwB;AAAA,UAC1BmE,EAAsD,KAAK,iBAAiB;AAAA,QAAA,IAEtEA,EAAS,cAAcnE,EAAU,QAC1C,KAAK,sBAAA,GAOP,KAAK,mBAAmBmE,EAAS,SAAS,GAItCA,EAAS,cAAcnE,EAAU,kBACnC,KAAK,kBAAmBmE,EAAmD,KAAK,cAAc,WAAW,GAGvG,KAAK,wBAAwBA,EAAS,SAAS;AACjD,gBAAM2V,IAAW,IAAI,IAAI,KAAK,cAAc,MAAM,QAAQ,GACpDiB,IAAcjB,EAAS,IAAI,KAAK,oBAAoB;AAE1D,UAAIiB,KAAeA,EAAY,SAAS,WACtCjB,EAAS,IAAI,KAAK,sBAAsB;AAAA,YACtC,GAAGiB;AAAA,YACH,SAAS5W,EAAS;AAAA,UAAA,CACnB,GAID,KAAK,cAAc;AAAA,YACjB,IAAI0V,EAAa;AAAA,cACf,UAAAC;AAAA,cACA,gBAAgB,KAAK,cAAc,MAAM;AAAA,cACzC,iBAAiB,KAAK,cAAc,MAAM;AAAA,YAAA,CAC3C;AAAA,UAAA,IAIL,KAAK,uBAAuB;AAAA,QAC9B;AAEA,aAAK,cAAc,KAAK,KAAK,cAAc,MAAM,UAAU3V,CAAQ,CAAC;AAAA,MACtE;AAAA,MACA,YAAY,CAACE,MAAuB;AAClC,QAAA+Q,GAAS,aAAa/Q,CAAG,GACzB,KAAK,UAAA,GACLb,EAAOa,CAAG;AAAA,MACZ;AAAA,MACA,gBAAgB,MAAY;AAC1B,QAAA+Q,GAAS,iBAAA,GACT,KAAK,UAAA,GACL7R,EAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAkB;AACxB,UAAM8b,IAAc,KAAK,iBAAiB,MAAM,cAAc;AAE9D,SAAK,oBAAA,GACL,KAAK,cAAc,KAAK,EAAK,GAC7B,KAAK,iBAAiB,KAAKnB,EAAe,GAC1C,KAAK,uBAAuB,QAC5B,KAAK,aAAa,QAKdmB,KACF,KAAK,cAAc,KAAK,KAAK,cAAc,MAAM,wBAAwB;AAAA,EAE7E;AAAA;AAAA,EAGQ,iBAAiBC,GAAqC;AAC5D,UAAMd,IAAU,KAAK,iBAAiB;AAEtC,IAAI,CAACc,KAAad,EAAQ,aAAa,CAACA,EAAQ,QAEhD,KAAK,iBAAiB,KAAK,EAAE,GAAGA,GAAS,WAAAc,GAAW;AAAA,EACtD;AAAA,EAEQ,sBAA4B;AAClC,IAAK,KAAK,mBAEV,aAAa,KAAK,cAAc,GAChC,KAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,SAASC,GAAehK,GAA0BH,GAA0C;AAClG,WAAO,IAAI,QAAQ,CAAC7R,GAASC,MAAW;AACtC,WAAK,cAAc,KAAK,EAAI,GAC5B,KAAK,iBAAiB,KAAK,EAAE,MAAA+b,GAAM,WAAW,QAAQ,GACtD,KAAK,aAAa,KAAK,OAAO,SAAShK,GAAS,KAAK,iBAAiBH,GAAS7R,GAASC,CAAM,CAAC;AAAA,IACjG,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,cAAc4R,GAA0C;AAC9D,WAAO,IAAI,QAAQ,CAAC7R,GAASC,MAAW;AACtC,UAAI,CAAC,KAAK,OAAO,WAAW;AAC1B,QAAAD,EAAA;AAEA;AAAA,MACF;AAEA,WAAK,cAAc,KAAK,EAAI,GAK5B,KAAK,iBAAiB,KAAK;AAAA,QACzB,MAAM,KAAK,iBAAiB,YAAY,YAAY;AAAA,QACpD,WAAW;AAAA,MAAA,CACZ,GACD,KAAK,aAAa,KAAK,OAAO,UAAU,KAAK,iBAAiB,KAAK,iBAAiB6R,GAAS7R,GAASC,CAAM,CAAC;AAAA,IAC/G,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY+R,GAAqDH,GAA0C;AACjH,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQrV,EAAe;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,QACtB,MAAMwV,GAAS,QAAQ;AAAA,QACvB,SAAS,KAAK,eAAeA,GAAS,OAAO;AAAA,MAAA;AAAA,MAE/CH;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEO,YACLG,GAIAH,GACe;AAQf,UAAMoK,IAAW,KAAK,iBAAiB,MAAM;AAE7C,QAAIA,EAAU,QAAO,QAAQ,OAAO,IAAI/f,GAAiB+f,CAAQ,CAAC;AAOlE,UAAMzF,IAAiB,KAAK,cAAc,MAAM;AAEhD,QAAIA,UAAuB,QAAQ,OAAO,IAAIna,GAA4Bma,EAAe,SAAS,CAAC;AAKnG,SAAK,sBAAA;AAEL,UAAM0F,IAAOlK,EAAQ,KAAK,KAAA,GACpByF,IAAYzF,EAAQ,mBAAmB0F,GAAA;AAE7C,gBAAK,uBAAuBD,GAC5B,KAAK,oBAAoBA,GAEzB,KAAK,cAAc;AAAA,MACjB,KAAK,cAAc,MAAM,YAAY;AAAA,QACnC,MAAM;AAAA,QACN,WAAAA;AAAA,QACA,MAAAyE;AAAA,QACA,SAASlK,EAAQ;AAAA,QACjB,iBAAiBA,EAAQ;AAAA,QACzB,eAAeA,EAAQ;AAAA,QACvB,0BAAU,KAAA;AAAA,MAAK,CAChB;AAAA,IAAA,GAGI,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQxV,EAAe;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,iBAAiBib;AAAA,QACjB,SAAS,KAAK,eAAezF,GAAS,OAAO;AAAA,QAC7C,MAAAkK;AAAA,QACA,SAASlK,GAAS;AAAA,MAAA;AAAA,MAEpBH;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,oBAAoB4F,GAAmBZ,GAA+D;AACjH,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAKJ,UAAMsF,IAAQ,MAAM,KAAK,OAAO,oBAAoB;AAAA,MAClD,iBAAiB,KAAK;AAAA,MACtB,WAAA1E;AAAA,MACA,SAASZ,EAAS;AAAA,MAClB,SAASA,EAAS;AAAA,IAAA,CACnB,GAEKtD,IAAUsD,EAAS,SAAS,KAAA;AAClC,gBAAK,cAAc;AAAA,MACjB,KAAK,cAAc,MAAM,cAAcY,GAAW;AAAA,QAChD,SAASZ,EAAS;AAAA,QAClB,GAAItD,IAAU,EAAE,SAAAA,MAAY,CAAA;AAAA,MAAC,CAC9B;AAAA,IAAA,GAGI4I;AAAA,EACT;AAAA,EAEO,sBACLC,GACAvK,GACAG,GACe;AAGf,UAAMqK,IAAW,KAAK,cAAc,MAAM;AAE1C,gBAAK,cAAc,KAAK,KAAK,cAAc,MAAM,qBAAqB,GAG/D,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ7f,EAAe;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK,qBAAqB,KAAK;AAAA,QAChD,SAAS,KAAK,eAAewV,CAAO;AAAA,QACpC,MAAM;AAAA,QACN,kBAAAoK;AAAA,MAAA;AAAA,MAEFvK;AAAA,IAAA,EACA,MAAM,CAAC5V,MAAmB;AAI1B,YAAIogB,KACF,KAAK,cAAc,KAAK,KAAK,cAAc,MAAM,sBAAsBA,CAAQ,CAAC,GAG5EpgB;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBO,MAAM4V,GAA2BG,GAAqD;AAM3F,UAAMiK,IAAW,KAAK,iBAAiB,MAAM;AAE7C,QAAIA,EAAU,QAAO,QAAQ,OAAO,IAAI/f,GAAiB+f,CAAQ,CAAC;AAMlE,UAAMzF,IAAiB,KAAK,cAAc,MAAM;AAEhD,WAAIA,IAAuB,QAAQ,OAAO,IAAIna,GAA4Bma,EAAe,SAAS,CAAC,IAG5F,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQha,EAAe;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK,qBAAqB,KAAK;AAAA,QAChD,SAAS,KAAK,eAAewV,CAAO;AAAA,QACpC,MAAM;AAAA,MAAA;AAAA,MAERH;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,MAAa,eAAeA,GAAgD;AAC1E,UAAMhW,IAAS,KAAK,iBAAiB;AAErC,QAAI,GAAC,KAAK,cAAcA,EAAO,SAAS,WAGpC,EAAAA,EAAO,cAAc,UAAU,CAACgW,GAAS,QAE7C;AAAA,UAAI,CAAC,KAAK,OAAO,gBAAgB;AAC/B,aAAK,gBAAA;AAEL;AAAA,MACF;AAEA,WAAK,oBAAA,GACL,KAAK,iBAAiB,KAAK,EAAE,GAAGhW,GAAQ,WAAW,YAAY;AAE/D,UAAI;AACF,cAAM,KAAK,OAAO,eAAe,KAAK,iBAAiB;AAAA,UACrD,WAAWA,EAAO;AAAA,UAClB,OAAOgW,GAAS;AAAA,QAAA,CACjB;AAAA,MACH,SAAS5V,GAAO;AAEd,mBAAK,oBAAA,GACL,KAAK,iBAAiB,KAAK,EAAE,GAAG,KAAK,iBAAiB,OAAO,WAAW,QAAQ,GAE1EA;AAAA,MACR;AAGA,WAAK,kBAAA;AAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAA0B;AAChC,SAAK,oBAAA,GAEL,KAAK,iBAAiB,WAAW,MAAM;AACrC,WAAK,iBAAiB;AAEtB,YAAMgf,IAAU,KAAK,iBAAiB;AAEtC,MAAIA,EAAQ,cAAc,cAE1B,KAAK,iBAAiB,KAAK,EAAE,GAAGA,GAAS,WAAW,mBAAmB;AAAA,IACzE,GAAGL,EAAqB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAwB;AAC9B,IAAK,KAAK,eAEV,KAAK,WAAW,YAAA,GAChB,KAAK,oBAAA,GACL,KAAK,aAAa,QAClB,KAAK,cAAc,KAAK,EAAK,GAC7B,KAAK,iBAAiB,KAAKD,EAAe,GAC1C,KAAK,uBAAuB,QAG5B,KAAK,cAAc,KAAK,KAAK,cAAc,MAAM,wBAAwB;AAAA,EAC3E;AAAA,EAEO,QAAc;AACnB,SAAK,YAAY,YAAA,GACjB,KAAK,aAAa,QAClB,KAAK,oBAAA,GACL,KAAK,cAAc,SAAA,GACnB,KAAK,iBAAiB,SAAA,GACtB,KAAK,cAAc,SAAA,GACnB,KAAK,oBAAoB,SAAA,GACzB,KAAK,oBAAoB,SAAA,GACzB,KAAK,yBAAyB,SAAA,GAC9B,KAAK,cAAc,SAAA,GACnB,KAAK,oBAAoB,YAAA;AAAA,EAC3B;AACF;ACj5BO,MAAM2B,KAAsE;AAAA,EACjF,MAAM;AAAA,EACN,KAAK;AACP,GAOaC,KAA6B,IAAI;AAGvC,SAASC,GAA0BjJ,GAAyB;AACjE,SAAO,IAAI,YAAA,EAAc,OAAOA,CAAO,EAAE;AAC3C;AAQO,SAASkJ,GAAuBC,GAA0BnJ,GAA0B;AACzF,QAAMoJ,IAASL,GAAyBI,CAAO,GACzC3gB,IAAOwX,GAAS,KAAA,KAAU;AAEhC,SAAOxX,IAAO,GAAG4gB,CAAM;AAAA;AAAA,EAAO5gB,CAAI,KAAK4gB;AACzC;ACvBA,MAAMC,KAAe,CAAC,aAAa,aAAa;AAIhD,SAASC,GAAa3R,GAAsC;AAC1D,SAAQ0R,GAAmC,SAAS1R,CAAM;AAC5D;AAWO,SAAS4R,GAAkBC,GAAsC;AACtE,QAAMC,IAAQ,+CAA+C,KAAKD,EAAI,MAAM;AAC5E,MAAI,CAACC,EAAO,QAAO;AAEnB,QAAMhJ,IAAc,mBAAmBgJ,EAAM,CAAC,CAAC,GACzC9R,IAAS8R,EAAM,CAAC,GAChBC,IAAS,IAAI,gBAAgBD,EAAM,CAAC,KAAK,EAAE;AAEjD,MAAI9R,MAAW,eAAgB,QAAO,EAAE,MAAM,gBAAgB,aAAA8I,EAAA;AAE9D,MAAI6I,GAAa3R,CAAM,GAAG;AACxB,UAAMgS,IAAeD,EAAO,IAAI,eAAe;AAC/C,WAAKC,IAEE,EAAE,MAAMhS,GAAQ,aAAA8I,GAAa,cAAAkJ,EAAA,IAFV;AAAA,EAG5B;AAEA,SAAO;AACT;AClCO,MAAMC,KAA2C;AAAA,EACtD,WAAW;AAAA,EACX,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,aAAa;AAAA,EACb,KAAK;AACP,GAGaC,IAAK;AAAA,EAChB,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AACX,GAGMC,KAAwB;AAYvB,SAASC,GAAaC,GAA2B;AACtD,QAAMC,IAAYD,EAAU,YAAY,CAAC,KAAK;AAE9C,SAAOC,IAAY,MAAOA,IAAYH,KAAwBG;AAChE;AASO,SAASC,GAAYzO,GAA4B;AACtD,SAAIA,KAAOmO,KAAeA,GAAOnO,CAAG,IAIhCA,EAAI,WAAW,IAAUsO,GAAatO,CAAG,IAEtC;AACT;AAQO,SAAS0O,GAAkBC,GAAyB;AACzD,SAAQA,KAAU,MAAQA,KAAU,OAASA,KAAUN;AACzD;AAGA,SAASO,KAA2B;AAClC,MAAI,OAAO,YAAc,IAAa,QAAO;AAI7C,QAAMC,IAAW,UAAU,YAAY;AAEvC,SAAO,0BAA0B,KAAKA,CAAQ;AAChD;AAUO,SAASC,GAAkBH,GAAgBI,IAAiBH,MAA2B;AAC5F,MAAI,CAACG,EAAO,QAAOJ;AAEnB,UAAQA,GAAA;AAAA,IACN,KAAKP,EAAG;AACN,aAAOA,EAAG;AAAA,IACZ,KAAKA,EAAG;AACN,aAAOA,EAAG;AAAA,IACZ,KAAKA,EAAG;AACN,aAAOA,EAAG;AAAA,IACZ,KAAKA,EAAG;AACN,aAAOA,EAAG;AAAA,IACZ,KAAKA,EAAG;AACN,aAAOA,EAAG;AAAA,IACZ;AACE,aAAOO;AAAA,EAAA;AAEb;AAMA,MAAMK,KAAoB,IASbC,KAAY,IAGZC,KAAoB;AAkB1B,SAASC,GAAevL,GAA6C;AAC1E,QAAMwL,IAAQxL,EAAM,cAAc,IAAI,IAAIoL,IAGpCK,IAAQ,CAAC/f,MAA0B,KAAK,IAAI,CAAC2f,IAAW,KAAK,IAAIA,IAAW,CAAC3f,IAAQ8f,CAAK,CAAC,KAAK;AAEtG,SAAO,EAAE,GAAGC,EAAMzL,EAAM,MAAM,GAAG,GAAGyL,EAAMzL,EAAM,MAAM,EAAA;AACxD;ACxJA,SAAS0L,GAAWX,GAAyB;AAC3C,SAAOA,KAAU,MAAQA,KAAU;AACrC;AAGA,MAAMY,KAAwB,KAGxBC,KAAkB,KAMlBC,KAAqB,GAGrBC,KAAqB,GAGrBC,KAAoB,oBAAI,IAAI,CAAC,cAAc,CAAC;AAe3C,SAASC,GAAkBlM,GAAoD;AACpF,MAAIA,EAAK,aAAagM,GAAoB,QAAO;AAEjD,QAAMG,IAAO,IAAI,SAASnM,CAAI;AAC9B,SAAImM,EAAK,SAAS,CAAC,MAAMJ,KAA2B,OAE7C,EAAE,GAAGI,EAAK,UAAU,CAAC,GAAG,GAAGA,EAAK,UAAU,CAAC,EAAA;AACpD;AAmBO,SAASC,GAA8BjN,GAAkE;AAC9G,SAAO;AAAA,IACL,MAAM,QAAQmC,GAAqB+K,GAA2E;AAC5G,MAAAA,EAAS,SAAS,YAAY;AAE9B,YAAM,EAAE,OAAA7K,GAAO,OAAAC,EAAA,IAAU,MAAMtC,EAAQ,cAAcmC,CAAW,GAE1DgL,IAAY9K,EAAM,SAAS,GAAG,IAAI,MAAM,KACxC+K,IAAS,IAAI,UAAU,GAAG/K,CAAK,GAAG8K,CAAS,SAAS,mBAAmB7K,CAAK,CAAC,EAAE;AAErF,UAAI+K,IAAiC,MACjCC,IAA2B,MAC3BC,IAAoB,QACpBC,GACAC,IAAS,IAETC,IAAmC;AAGvC,YAAMC,IAA2C,CAAA,GAE3CC,IAAO,CAAC7M,GAAeZ,MAA4C;AACvE,QAAIiN,EAAO,eAAe,UAAU,SAEpCA,EAAO,KAAK,KAAK,UAAU,EAAE,OAAArM,GAAO,SAAAZ,EAAA,CAAS,CAAC,GACzC2M,GAAkB,IAAI/L,CAAK,KAAGmM,EAAS,SAAS,QAAQnM,GAAOZ,CAAO;AAAA,MAC7E,GAOM0N,IAAiB,CAAC9M,GAAeZ,MAA4C;AACjF,QAAIoN,MAAS,QAEbK,EAAK7M,GAAOZ,CAAO;AAAA,MACrB,GAEM2N,IAAU,CAAChZ,MAA4B;AAC3C,QAAIyY,MAASzY,MAEbyY,IAAOzY,GACPoY,EAAS,aAAapY,CAAI;AAAA,MAC5B;AAEA,UAAI;AACF,cAAM,IAAI,QAAc,CAAC3G,GAASC,MAAW;AAC3C,gBAAM2f,IAAQ;AAAA,YACZ,MAAM3f,EAAO,IAAI,MAAM,iDAAiD,CAAC;AAAA,YACzEue;AAAA,UAAA;AAEF,UAAAS,EAAO,SAAS,MAAY;AAC1B,yBAAaW,CAAK,GAClB5f,EAAA;AAAA,UACF,GAEAif,EAAO,UAAU,MAAY;AAC3B,yBAAaW,CAAK,GAClB3f,EAAO,IAAI,MAAM,8CAA8C,CAAC;AAAA,UAClE;AAAA,QACF,CAAC;AAAA,MACH,SAAShE,GAAO;AAId,cAAAqjB,IAAS,IACTL,EAAO,MAAA,GAEDhjB;AAAA,MACR;AAEA,MAAAgjB,EAAO,UAAU,CAACrM,MAA4B;AAG5C,QAAI0M,MAEJP,EAAS,SAAS,SAAS,2CAA2CnM,EAAM,IAAI,IAAI,GACpFmM,EAAS,SAAS,QAAQ,YAAY,EAAE,MAAMnM,EAAM,MAAM;AAAA,MAC5D;AAEA,YAAMiN,IAAgB,OAAO7N,MAAoD;AAC/E,cAAM8N,IAAa,IAAI,kBAAkB;AAAA;AAAA;AAAA;AAAA,UAIvC,YAAa9N,EAAQ,cAA6C,CAAA;AAAA,QAAC,CACpE;AACD,QAAAkN,IAAOY,GAEPA,EAAW,iBAAiB,CAAClN,MAA2C;AACtE,UAAIA,EAAM,aAAW6M,EAAK,oBAAoB7M,EAAM,UAAU,QAAmC;AAAA,QACnG,GAEAkN,EAAW,6BAA6B,MAAY;AAClD,UAAAf,EAAS,SAAS,QAAQ,aAAae,EAAW,kBAAkB,GAChEA,EAAW,uBAAuB,YACpCf,EAAS,SAAS,SAAS,wBAAwB;AAAA,QAEvD,GAEAe,EAAW,UAAU,CAAClN,MAA+B;AACnD,gBAAM,CAAC/V,CAAM,IAAI+V,EAAM;AACvB,UAAK/V,KAMD0iB,MAAsB1iB,EAAO,OAEjC0iB,IAAoB1iB,EAAO,IAE3BkiB,EAAS,SAASliB,CAAM,GACxBkiB,EAAS,SAAS,MAAM;AAAA,QAC1B,GAEAe,EAAW,gBAAgB,CAAClN,MAAqC;AAC/D,gBAAMuI,IAAUvI,EAAM;AACtB,UAAAuI,EAAQ,aAAa,eACrBA,EAAQ,YAAY,CAACnd,MAAgC;AACnD,gBAAI,EAAEA,EAAQ,gBAAgB,aAAc;AAE5C,kBAAMZ,IAAWwhB,GAAkB5gB,EAAQ,IAAI;AAC/C,YAAIZ,KAAU2hB,EAAS,iBAAiB3hB,CAAQ;AAAA,UAClD;AAAA,QACF,GAEA,MAAM0iB,EAAW,qBAAqB,EAAE,MAAM,SAAS,KAAK9N,EAAQ,KAAe;AAGnF,mBAAW+N,KAAaP,EAAkB,OAAO,CAAC;AAChD,gBAAMM,EAAW,gBAAgBC,CAAS,EAAE,MAAM,MAAA;AAAA,WAAe;AAGnE,cAAMC,IAAS,MAAMF,EAAW,aAAA;AAChC,cAAMA,EAAW,oBAAoBE,CAAM,GAC3CP,EAAK,iBAAiB,EAAE,KAAKO,EAAO,KAAK,aAAanO,EAAQ,eAAe,iBAAiB;AAAA,MAChG;AAEA,aAAAoN,EAAO,YAAY,CAACrM,MAA8B;AAChD,YAAI5U;AACJ,YAAI;AACF,UAAAA,IAAU,KAAK,MAAM,OAAO4U,EAAM,IAAI,CAAC;AAAA,QACzC,QAAQ;AACN;AAAA,QACF;AAEA,cAAMZ,IAAUhU,EAAQ,WAAW,CAAA;AAGnC,gBAFIA,EAAQ,UAAU,sBAAoB+gB,EAAS,SAAS,QAAQ/gB,EAAQ,OAAOgU,CAAO,GAElFhU,EAAQ,OAAA;AAAA,UACd,KAAK,eAAe;AAClB,YAAAmhB,IAAanN,EAAQ,cAAqC;AAI1D,kBAAMiO,KADejO,EAAQ,gBAAwD,SACjD,MAA6B;AACjE,YAAIiO,MAAkB,UACpBN,EAASM,IAAyBA,MAAkBd,IAAY,OAAO,UAA9C,MAAqD;AAGhF;AAAA,UACF;AAAA,UAEA,KAAK,gBAAgB;AACnB,kBAAMe,IAAUlO,EAAQ,WAAkC;AAC1D,YAAA2N,EAASO,IAAkBA,MAAWf,IAAY,OAAO,UAAvC,MAA8C;AAEhE;AAAA,UACF;AAAA,UAEA,KAAK,qBAAqB;AACxB,YAAAJ,EAAS,oBAAqB/M,EAAQ,QAA+B,EAAE;AAEvE;AAAA,UACF;AAAA,UAEA,KAAK;AAAA,UACL,KAAK,gBAAgB;AAEnB,YAAK6N,EAAc7N,CAAO,EAAE,MAAM,CAAC/V,MAAmB;AACpD,cAAA8iB,EAAS,SAAS,SAAS9iB,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK,CAAC;AAAA,YACnF,CAAC;AAED;AAAA,UACF;AAAA,UAEA,KAAK,oBAAoB;AACvB,kBAAM8jB,IAAY/N;AAClB,YAAIkN,GAAM,oBAAwBA,EAAK,gBAAgBa,CAAS,EAAE,MAAM,MAAA;AAAA,aAAe,IAClFP,EAAkB,KAAKO,CAAS;AAErC;AAAA,UACF;AAAA,UAEA;AACE;AAAA,QAAA;AAAA,MAEN,GAEAN,EAAK,kBAAkB,EAAE,OAAO,CAAA,GAAI,OAAO,CAAA,GAAI,GAC/CJ,IAAY,YAAY,MAAMI,EAAK,oBAAoB,CAAA,CAAE,GAAGlB,EAAqB,GAE1E;AAAA,QACL,iBAAuB;AAErB,UAAAkB,EAAK,mBAAmB,EAAE;AAAA,QAC5B;AAAA,QACA,iBAAuB;AACrB,UAAAC,EAAe,mBAAmB,EAAE;AAAA,QACtC;AAAA,QACA,YAAY9M,GAAiC;AAC3C,gBAAMvL,IAAI,KAAK,MAAMuL,EAAM,CAAC,GACtB1Q,IAAI,KAAK,MAAM0Q,EAAM,CAAC;AAE5B,cAAIA,EAAM,SAAS,QAAQ;AACzB,YAAA8M,EAAe,gBAAgB,EAAE,GAAArY,GAAG,GAAAnF,EAAA,CAAG;AAEvC;AAAA,UACF;AAEA,cAAI0Q,EAAM,SAAS,UAAU;AAC3B,YAAA8M,EAAe,kBAAkB;AAAA,cAC/B,SAAS,KAAK,MAAM9M,EAAM,UAAU,CAAC;AAAA,cACrC,SAAS,KAAK,MAAMA,EAAM,UAAU,CAAC;AAAA,cACrC,aAAa;AAAA,YAAA,CACd;AAED;AAAA,UACF;AAEA,UAAA8M,EAAe9M,EAAM,SAAS,SAAS,uBAAuB,oBAAoB;AAAA,YAChF,GAAAvL;AAAA,YACA,GAAAnF;AAAA,YACA,MAAM0Q,EAAM,UAAU;AAAA,UAAA,CACvB;AAAA,QACH;AAAA,QACA,QAAQA,GAA6B;AACnC,cAAIA,EAAM,SAAS,QAAQ;AAGzB,uBAAW2K,KAAa3K,EAAM,QAAQ,IAAI;AACxC,oBAAM+K,IAASL,GAAaC,CAAS,GAC/B4C,IAAQ7B,GAAWX,CAAM;AAE/B,cAAIwC,KAAOT,EAAe,mBAAmB,EAAE,QAAQtC,EAAG,SAAS,GAEnEsC,EAAe,mBAAmB,EAAE,QAAA/B,GAAQ,GAC5C+B,EAAe,iBAAiB,EAAE,QAAA/B,GAAQ,GACtCwC,KAAOT,EAAe,iBAAiB,EAAE,QAAQtC,EAAG,SAAS;AAAA,YACnE;AAEA;AAAA,UACF;AAIA,UAAI,OAAOxK,EAAM,UAAW,YAE5B8M,EAAe9M,EAAM,SAAS,SAAS,oBAAoB,iBAAiB,EAAE,QAAQA,EAAM,QAAQ;AAAA,QACtG;AAAA,QACA,aAAasJ,GAAoB;AAG/B,UAAAwD,EAAe,iBAAiB,EAAE,MAAAxD,GAAM;AAAA,QAC1C;AAAA,QACA,MAAMA,GAAoB;AACxB,UAAAwD,EAAe,iBAAiB,EAAE,MAAAxD,GAAM;AAAA,QAC1C;AAAA,QACA,QAAc;AACZ,UAAAoD,IAAS,IACLD,mBAAyBA,CAAS,GAEtCA,IAAY,QACZH,GAAM,MAAA,GACNA,IAAO,MACPD,EAAO,MAAA;AAAA,QACT;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAEJ;","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,71,72,73,74]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/types/http-error.ts","../src/types/channel-busy-error.ts","../src/types/channel-awaiting-consent-error.ts","../src/constants/enum.ts","../../../node_modules/@microsoft/fetch-event-source/lib/esm/parse.js","../../../node_modules/@microsoft/fetch-event-source/lib/esm/fetch.js","../../../node_modules/tslib/tslib.es6.mjs","../../../node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../node_modules/rxjs/dist/esm5/internal/config.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../node_modules/rxjs/dist/esm5/internal/Observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../node_modules/rxjs/dist/esm5/internal/util/ObjectUnsubscribedError.js","../../../node_modules/rxjs/dist/esm5/internal/Subject.js","../../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../node_modules/rxjs/dist/esm5/internal/util/isScheduler.js","../../../node_modules/rxjs/dist/esm5/internal/util/args.js","../../../node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../node_modules/rxjs/dist/esm5/internal/operators/observeOn.js","../../../node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js","../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js","../../../node_modules/rxjs/dist/esm5/internal/observable/from.js","../../../node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../node_modules/rxjs/dist/esm5/internal/util/mapOneOrManyArgs.js","../../../node_modules/rxjs/dist/esm5/internal/util/argsArgArrayOrObject.js","../../../node_modules/rxjs/dist/esm5/internal/util/createObject.js","../../../node_modules/rxjs/dist/esm5/internal/observable/combineLatest.js","../../../node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../node_modules/rxjs/dist/esm5/internal/operators/bufferTime.js","../../../node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js","../../../node_modules/rxjs/dist/esm5/internal/operators/finalize.js","../../../node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js","../src/lib/create-sse-observable.ts","../src/lib/event-emitter.ts","../src/lib/client.ts","../src/lib/source-set-path.ts","../src/lib/source-set-client.ts","../node_modules/uuid/dist/stringify.js","../node_modules/uuid/dist/rng.js","../node_modules/uuid/dist/native.js","../node_modules/uuid/dist/v4.js","../src/lib/conversation.ts","../src/lib/task-reducer.ts","../src/lib/subagent-reducer.ts","../src/lib/derived-stores.ts","../src/lib/launched-sandboxes.ts","../src/lib/channel.ts","../src/lib/feedback-message.ts","../src/lib/resolve-sandbox-uri.ts","../src/lib/keysym.ts","../src/lib/sandbox-browser-transport.ts"],"sourcesContent":["export class HttpError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n /**\n * The decoded error payload, when the response carried one.\n *\n * Consumers branch on this — `asgard-ai-data-insight-web` reads `reason_code` off it to raise its\n * credit-limit dialog on a `429` — so **always pass it when constructing from a real response**,\n * even though the parameter is optional.\n */\n public readonly body: unknown;\n\n // `body` is optional because every construction site derives it from a response whose text or JSON\n // may fail to parse, yielding `undefined` or `null`. An absent body is therefore a normal outcome\n // rather than a caller mistake, and a test raising a status-only error need not pass a filler value.\n constructor(status: number, statusText: string, body?: unknown) {\n super(`HTTP ${status}: ${statusText}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.body = body;\n }\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n","import { RunKind } from './channel';\n\n/**\n * Thrown by `Channel.sendMessage()` when a run is already in flight on that channel (F-023 AC6 /\n * UC-045). Because runs execute in the background on the server, dispatching a second one would leave\n * two concurrent runs writing to the same transcript. The SDK's own composer already gates every send\n * entrance, so this only surfaces for programmatic sends — a rejection rather than a silent drop, so\n * the caller can tell the message never left.\n */\nexport class ChannelBusyError extends Error {\n /** Which run is holding the channel. */\n public readonly runKind: RunKind;\n\n constructor(runKind: RunKind) {\n super(`Cannot send a message while a \"${runKind}\" run is in flight on this channel.`);\n this.name = 'ChannelBusyError';\n this.runKind = runKind;\n }\n}\n\nexport function isChannelBusyError(error: unknown): error is ChannelBusyError {\n return error instanceof ChannelBusyError;\n}\n","/**\n * Thrown by `Channel.sendMessage()` and `Channel.nudge()` when the channel is parked on a tool-call\n * consent prompt. The server holds such a channel in a pause that only a consent reply resumes — every\n * other turn is rejected (\"use RespondToolCallConsent\"), a nudge included: it takes the same\n * `PostUserMessage` path as a plain message. The pause is invisible to the run-in-flight guard, because\n * the consent frame arrives *before* the run terminal — by the time the prompt is on screen the run has\n * already ended and the channel looks idle. Refusing here keeps a doomed turn from pushing an\n * optimistic bubble and a backend error into the thread. Answer with `replyToolCallConsents()` first.\n */\nexport class ChannelAwaitingConsentError extends Error {\n /**\n * The paused batch's process id, as carried by the pending consent prompt.\n *\n * **Empty string on a rejoin.** A prompt recovered after a reload is reconstructed by the backend\n * from its durable pause state, and that path deliberately leaves the process id blank (clients are\n * meant to detect a consent pause from the prompt's presence, not from this id). Treat it as a\n * diagnostic hint, never as a key.\n */\n public readonly processId: string;\n\n constructor(processId: string) {\n super('Cannot send this turn while the channel is awaiting a tool-call consent response.');\n this.name = 'ChannelAwaitingConsentError';\n this.processId = processId;\n }\n}\n\nexport function isChannelAwaitingConsentError(error: unknown): error is ChannelAwaitingConsentError {\n return error instanceof ChannelAwaitingConsentError;\n}\n","export enum FetchSseAction {\n /**\n * @deprecated The SDK no longer sends this (F-032). It bundles \"delete the channel\" and \"post the\n * first message\" into one request, and blobs belong to the channel that was live when they were\n * uploaded — so the delete strips them and the accompanying `blobIds` resolve to nothing, silently.\n * The backend now answers `400` to `RESET_CHANNEL` carrying a non-empty `blobIds`.\n *\n * To clear a conversation and start over on the same id, call `client.deleteChannel(customChannelId)`\n * and then open with `action: NONE` — `Channel.reset()` does exactly that. Retained (and still\n * accepted by the backend) so existing type references keep compiling.\n */\n RESET_CHANNEL = 'RESET_CHANNEL',\n NONE = 'NONE',\n RESPONSE_TOOL_CALL_CONSENT = 'RESPONSE_TOOL_CALL_CONSENT',\n NUDGE = 'NUDGE',\n}\n\nexport enum EventType {\n INIT = 'asgard.run.init',\n PROCESS = 'asgard.process',\n PROCESS_START = 'asgard.process.start',\n PROCESS_COMPLETE = 'asgard.process.complete',\n MESSAGE = 'asgard.message',\n MESSAGE_START = 'asgard.message.start',\n MESSAGE_DELTA = 'asgard.message.delta',\n MESSAGE_COMPLETE = 'asgard.message.complete',\n // Persist-only user turn — never on the live plane; only replayed on GET rejoin (F-014).\n MESSAGE_USER = 'asgard.message.user',\n // Extended-thinking (reasoning) stream — same shape as a normal message, rendered as a\n // separate collapsible thinking block (F-001). Independent of and usually earlier than the answer.\n MESSAGE_THINKING_START = 'asgard.message.thinking.start',\n MESSAGE_THINKING_DELTA = 'asgard.message.thinking.delta',\n MESSAGE_THINKING_COMPLETE = 'asgard.message.thinking.complete',\n\n // Canvas stream (F-030). `start` opens the block, each `delta` carries the markup that became\n // available (in the message's `text`, appended exactly like a text delta), and `complete` carries the\n // whole fragment as a CANVAS template — authoritative and self-sufficient, since a rejoin replays\n // only the complete. A `complete` with no template means the canvas could not be rendered.\n MESSAGE_CANVAS_START = 'asgard.message.canvas.start',\n MESSAGE_CANVAS_DELTA = 'asgard.message.canvas.delta',\n MESSAGE_CANVAS_COMPLETE = 'asgard.message.canvas.complete',\n TOOL_CALL = 'asgard.tool_call',\n TOOL_CALL_START = 'asgard.tool_call.start',\n TOOL_CALL_COMPLETE = 'asgard.tool_call.complete',\n TOOL_CALL_CONSENT = 'asgard.tool_call.consent',\n // Subagent lifecycle — a subagent spawned by an `Agent` tool-call. Its status is driven only by\n // these events, never the `Agent` tool_call.complete (async → completes early). Accumulated into\n // the Subagent list (F-012), keyed by `parentToolUseId` = the `Agent` tool-call's `toolUseId`.\n SUBAGENT_START = 'asgard.subagent.start',\n SUBAGENT_COMPLETE = 'asgard.subagent.complete',\n // Channel title push — reserved for F-016 to consume; enum aligned with asgard-core here (F-014).\n CHANNEL_TITLE_UPDATE = 'asgard.channel.title.update',\n // Next-turn prediction: at most one per run, pushed after the reply and before the run's terminal\n // event (F-028). Live-only — never persisted, so a rejoin replay does not carry it. \"No suggestion\"\n // is the normal case: most turns get none, and nothing may block waiting for one.\n PROMPT_SUGGESTION = 'asgard.prompt_suggestion',\n // Sandbox cold-start lifecycle (F-018) — `launch` = the backend is provisioning a compute sandbox,\n // `ready` = it is up. Drives the sandbox-phase store consumed by the Launch HUD; independent of the\n // run seam / RunningIndicator. Fact shape aligns with asgard-sdk-go `{ sandboxName, blueprintName }`.\n SANDBOX_LAUNCH = 'asgard.sandbox.launch',\n SANDBOX_READY = 'asgard.sandbox.ready',\n // A user's Good / Bad verdict on one assistant reply (F-033). A first-class transcript entry: delivered\n // live and replayed on rejoin, so the rated state is restored from the server rather than remembered\n // locally. Append-only — several frames may target the same reply and the latest one is the state.\n MESSAGE_FEEDBACK = 'asgard.message.feedback',\n DONE = 'asgard.run.done',\n ERROR = 'asgard.run.error',\n}\n\nexport enum ToolCallConsentResult {\n ALLOW_ONCE = 'ALLOW_ONCE',\n ALLOW_ALWAYS = 'ALLOW_ALWAYS',\n DENY_ONCE = 'DENY_ONCE',\n}\n\nexport enum MessageTemplateType {\n TEXT = 'TEXT',\n HINT = 'HINT',\n BUTTON = 'BUTTON',\n IMAGE = 'IMAGE',\n VIDEO = 'VIDEO',\n AUDIO = 'AUDIO',\n LOCATION = 'LOCATION',\n CAROUSEL = 'CAROUSEL',\n CHART = 'CHART',\n TABLE = 'TABLE',\n ATTACHMENT = 'ATTACHMENT',\n QUESTION = 'QUESTION',\n CANVAS = 'CANVAS',\n}\n","export async function getBytes(stream, onChunk) {\r\n const reader = stream.getReader();\r\n let result;\r\n while (!(result = await reader.read()).done) {\r\n onChunk(result.value);\r\n }\r\n}\r\nexport function getLines(onLine) {\r\n let buffer;\r\n let position;\r\n let fieldLength;\r\n let discardTrailingNewline = false;\r\n return function onChunk(arr) {\r\n if (buffer === undefined) {\r\n buffer = arr;\r\n position = 0;\r\n fieldLength = -1;\r\n }\r\n else {\r\n buffer = concat(buffer, arr);\r\n }\r\n const bufLength = buffer.length;\r\n let lineStart = 0;\r\n while (position < bufLength) {\r\n if (discardTrailingNewline) {\r\n if (buffer[position] === 10) {\r\n lineStart = ++position;\r\n }\r\n discardTrailingNewline = false;\r\n }\r\n let lineEnd = -1;\r\n for (; position < bufLength && lineEnd === -1; ++position) {\r\n switch (buffer[position]) {\r\n case 58:\r\n if (fieldLength === -1) {\r\n fieldLength = position - lineStart;\r\n }\r\n break;\r\n case 13:\r\n discardTrailingNewline = true;\r\n case 10:\r\n lineEnd = position;\r\n break;\r\n }\r\n }\r\n if (lineEnd === -1) {\r\n break;\r\n }\r\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength);\r\n lineStart = position;\r\n fieldLength = -1;\r\n }\r\n if (lineStart === bufLength) {\r\n buffer = undefined;\r\n }\r\n else if (lineStart !== 0) {\r\n buffer = buffer.subarray(lineStart);\r\n position -= lineStart;\r\n }\r\n };\r\n}\r\nexport function getMessages(onId, onRetry, onMessage) {\r\n let message = newMessage();\r\n const decoder = new TextDecoder();\r\n return function onLine(line, fieldLength) {\r\n if (line.length === 0) {\r\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);\r\n message = newMessage();\r\n }\r\n else if (fieldLength > 0) {\r\n const field = decoder.decode(line.subarray(0, fieldLength));\r\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1);\r\n const value = decoder.decode(line.subarray(valueOffset));\r\n switch (field) {\r\n case 'data':\r\n message.data = message.data\r\n ? message.data + '\\n' + value\r\n : value;\r\n break;\r\n case 'event':\r\n message.event = value;\r\n break;\r\n case 'id':\r\n onId(message.id = value);\r\n break;\r\n case 'retry':\r\n const retry = parseInt(value, 10);\r\n if (!isNaN(retry)) {\r\n onRetry(message.retry = retry);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\nfunction concat(a, b) {\r\n const res = new Uint8Array(a.length + b.length);\r\n res.set(a);\r\n res.set(b, a.length);\r\n return res;\r\n}\r\nfunction newMessage() {\r\n return {\r\n data: '',\r\n event: '',\r\n id: '',\r\n retry: undefined,\r\n };\r\n}\r\n//# sourceMappingURL=parse.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { getBytes, getLines, getMessages } from './parse';\r\nexport const EventStreamContentType = 'text/event-stream';\r\nconst DefaultRetryInterval = 1000;\r\nconst LastEventId = 'last-event-id';\r\nexport function fetchEventSource(input, _a) {\r\n var { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, fetch: inputFetch } = _a, rest = __rest(_a, [\"signal\", \"headers\", \"onopen\", \"onmessage\", \"onclose\", \"onerror\", \"openWhenHidden\", \"fetch\"]);\r\n return new Promise((resolve, reject) => {\r\n const headers = Object.assign({}, inputHeaders);\r\n if (!headers.accept) {\r\n headers.accept = EventStreamContentType;\r\n }\r\n let curRequestController;\r\n function onVisibilityChange() {\r\n curRequestController.abort();\r\n if (!document.hidden) {\r\n create();\r\n }\r\n }\r\n if (!openWhenHidden) {\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n }\r\n let retryInterval = DefaultRetryInterval;\r\n let retryTimer = 0;\r\n function dispose() {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.clearTimeout(retryTimer);\r\n curRequestController.abort();\r\n }\r\n inputSignal === null || inputSignal === void 0 ? void 0 : inputSignal.addEventListener('abort', () => {\r\n dispose();\r\n resolve();\r\n });\r\n const fetch = inputFetch !== null && inputFetch !== void 0 ? inputFetch : window.fetch;\r\n const onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;\r\n async function create() {\r\n var _a;\r\n curRequestController = new AbortController();\r\n try {\r\n const response = await fetch(input, Object.assign(Object.assign({}, rest), { headers, signal: curRequestController.signal }));\r\n await onopen(response);\r\n await getBytes(response.body, getLines(getMessages(id => {\r\n if (id) {\r\n headers[LastEventId] = id;\r\n }\r\n else {\r\n delete headers[LastEventId];\r\n }\r\n }, retry => {\r\n retryInterval = retry;\r\n }, onmessage)));\r\n onclose === null || onclose === void 0 ? void 0 : onclose();\r\n dispose();\r\n resolve();\r\n }\r\n catch (err) {\r\n if (!curRequestController.signal.aborted) {\r\n try {\r\n const interval = (_a = onerror === null || onerror === void 0 ? void 0 : onerror(err)) !== null && _a !== void 0 ? _a : retryInterval;\r\n window.clearTimeout(retryTimer);\r\n retryTimer = window.setTimeout(create, interval);\r\n }\r\n catch (innerErr) {\r\n dispose();\r\n reject(innerErr);\r\n }\r\n }\r\n }\r\n }\r\n create();\r\n });\r\n}\r\nfunction defaultOnOpen(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(EventStreamContentType))) {\r\n throw new Error(`Expected content-type to be ${EventStreamContentType}, Actual: ${contentType}`);\r\n }\r\n}\r\n//# sourceMappingURL=fetch.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export function isFunction(value) {\n return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","export function createErrorClass(createImpl) {\n var _super = function (instance) {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n var ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n return function UnsubscriptionErrorImpl(errors) {\n _super(this);\n this.message = errors\n ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n ')\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function arrRemove(arr, item) {\n if (arr) {\n var index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n function Subscription(initialTeardown) {\n this.initialTeardown = initialTeardown;\n this.closed = false;\n this._parentage = null;\n this._finalizers = null;\n }\n Subscription.prototype.unsubscribe = function () {\n var e_1, _a, e_2, _b;\n var errors;\n if (!this.closed) {\n this.closed = true;\n var _parentage = this._parentage;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n try {\n for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n var parent_1 = _parentage_1_1.value;\n parent_1.remove(this);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n _parentage.remove(this);\n }\n }\n var initialFinalizer = this.initialTeardown;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n }\n catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n var _finalizers = this._finalizers;\n if (_finalizers) {\n this._finalizers = null;\n try {\n for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n var finalizer = _finalizers_1_1.value;\n try {\n execFinalizer(finalizer);\n }\n catch (err) {\n errors = errors !== null && errors !== void 0 ? errors : [];\n if (err instanceof UnsubscriptionError) {\n errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n };\n Subscription.prototype.add = function (teardown) {\n var _a;\n if (teardown && teardown !== this) {\n if (this.closed) {\n execFinalizer(teardown);\n }\n else {\n if (teardown instanceof Subscription) {\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n }\n }\n };\n Subscription.prototype._hasParent = function (parent) {\n var _parentage = this._parentage;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n };\n Subscription.prototype._addParent = function (parent) {\n var _parentage = this._parentage;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n };\n Subscription.prototype._removeParent = function (parent) {\n var _parentage = this._parentage;\n if (_parentage === parent) {\n this._parentage = null;\n }\n else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n };\n Subscription.prototype.remove = function (teardown) {\n var _finalizers = this._finalizers;\n _finalizers && arrRemove(_finalizers, teardown);\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n };\n Subscription.EMPTY = (function () {\n var empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n return (value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n if (isFunction(finalizer)) {\n finalizer();\n }\n else {\n finalizer.unsubscribe();\n }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n setTimeout: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = timeoutProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearTimeout: function (handle) {\n var delegate = timeoutProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n timeoutProvider.setTimeout(function () {\n var onUnhandledError = config.onUnhandledError;\n if (onUnhandledError) {\n onUnhandledError(err);\n }\n else {\n throw err;\n }\n });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n var isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n }\n else {\n cb();\n }\n}\nexport function captureError(err) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n//# sourceMappingURL=errorContext.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n function Subscriber(destination) {\n var _this = _super.call(this) || this;\n _this.isStopped = false;\n if (destination) {\n _this.destination = destination;\n if (isSubscription(destination)) {\n destination.add(_this);\n }\n }\n else {\n _this.destination = EMPTY_OBSERVER;\n }\n return _this;\n }\n Subscriber.create = function (next, error, complete) {\n return new SafeSubscriber(next, error, complete);\n };\n Subscriber.prototype.next = function (value) {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n }\n else {\n this._next(value);\n }\n };\n Subscriber.prototype.error = function (err) {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n }\n else {\n this.isStopped = true;\n this._error(err);\n }\n };\n Subscriber.prototype.complete = function () {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n }\n else {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (!this.closed) {\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n this.destination = null;\n }\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n try {\n this.destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n };\n Subscriber.prototype._complete = function () {\n try {\n this.destination.complete();\n }\n finally {\n this.unsubscribe();\n }\n };\n return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n function ConsumerObserver(partialObserver) {\n this.partialObserver = partialObserver;\n }\n ConsumerObserver.prototype.next = function (value) {\n var partialObserver = this.partialObserver;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n ConsumerObserver.prototype.error = function (err) {\n var partialObserver = this.partialObserver;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n else {\n handleUnhandledError(err);\n }\n };\n ConsumerObserver.prototype.complete = function () {\n var partialObserver = this.partialObserver;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(observerOrNext, error, complete) {\n var _this = _super.call(this) || this;\n var partialObserver;\n if (isFunction(observerOrNext) || !observerOrNext) {\n partialObserver = {\n next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n error: error !== null && error !== void 0 ? error : undefined,\n complete: complete !== null && complete !== void 0 ? complete : undefined,\n };\n }\n else {\n var context_1;\n if (_this && config.useDeprecatedNextContext) {\n context_1 = Object.create(observerOrNext);\n context_1.unsubscribe = function () { return _this.unsubscribe(); };\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context_1),\n error: observerOrNext.error && bind(observerOrNext.error, context_1),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n };\n }\n else {\n partialObserver = observerOrNext;\n }\n }\n _this.destination = new ConsumerObserver(partialObserver);\n return _this;\n }\n return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n }\n else {\n reportUnhandledError(error);\n }\n}\nfunction defaultErrorHandler(err) {\n throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n var onStoppedNotification = config.onStoppedNotification;\n onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n return x;\n}\n//# sourceMappingURL=identity.js.map","import { identity } from './identity';\nexport function pipe() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n if (fns.length === 0) {\n return identity;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return function piped(input) {\n return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n };\n}\n//# sourceMappingURL=pipe.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n function Observable(subscribe) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var _this = this;\n var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n errorContext(function () {\n var _a = _this, operator = _a.operator, source = _a.source;\n subscriber.add(operator\n ?\n operator.call(subscriber, source)\n : source\n ?\n _this._subscribe(subscriber)\n :\n _this._trySubscribe(subscriber));\n });\n return subscriber;\n };\n Observable.prototype._trySubscribe = function (sink) {\n try {\n return this._subscribe(sink);\n }\n catch (err) {\n sink.error(err);\n }\n };\n Observable.prototype.forEach = function (next, promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n _this.subscribe(subscriber);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n var _a;\n return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n };\n Observable.prototype[Symbol_observable] = function () {\n return this;\n };\n Observable.prototype.pipe = function () {\n var operations = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n operations[_i] = arguments[_i];\n }\n return pipeFromArray(operations)(this);\n };\n Observable.prototype.toPromise = function (promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n };\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n var _a;\n return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n return function (source) {\n if (hasLift(source)) {\n return source.lift(function (liftedSource) {\n try {\n return init(liftedSource, this);\n }\n catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n//# sourceMappingURL=lift.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n __extends(OperatorSubscriber, _super);\n function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n var _this = _super.call(this, destination) || this;\n _this.onFinalize = onFinalize;\n _this.shouldUnsubscribe = shouldUnsubscribe;\n _this._next = onNext\n ? function (value) {\n try {\n onNext(value);\n }\n catch (err) {\n destination.error(err);\n }\n }\n : _super.prototype._next;\n _this._error = onError\n ? function (err) {\n try {\n onError(err);\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._error;\n _this._complete = onComplete\n ? function () {\n try {\n onComplete();\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._complete;\n return _this;\n }\n OperatorSubscriber.prototype.unsubscribe = function () {\n var _a;\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n var closed_1 = this.closed;\n _super.prototype.unsubscribe.call(this);\n !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n }\n };\n return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","import { createErrorClass } from './createErrorClass';\nexport var ObjectUnsubscribedError = createErrorClass(function (_super) {\n return function ObjectUnsubscribedErrorImpl() {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n };\n});\n//# sourceMappingURL=ObjectUnsubscribedError.js.map","import { __extends, __values } from \"tslib\";\nimport { Observable } from './Observable';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\nvar Subject = (function (_super) {\n __extends(Subject, _super);\n function Subject() {\n var _this = _super.call(this) || this;\n _this.closed = false;\n _this.currentObservers = null;\n _this.observers = [];\n _this.isStopped = false;\n _this.hasError = false;\n _this.thrownError = null;\n return _this;\n }\n Subject.prototype.lift = function (operator) {\n var subject = new AnonymousSubject(this, this);\n subject.operator = operator;\n return subject;\n };\n Subject.prototype._throwIfClosed = function () {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n };\n Subject.prototype.next = function (value) {\n var _this = this;\n errorContext(function () {\n var e_1, _a;\n _this._throwIfClosed();\n if (!_this.isStopped) {\n if (!_this.currentObservers) {\n _this.currentObservers = Array.from(_this.observers);\n }\n try {\n for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {\n var observer = _c.value;\n observer.next(value);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n });\n };\n Subject.prototype.error = function (err) {\n var _this = this;\n errorContext(function () {\n _this._throwIfClosed();\n if (!_this.isStopped) {\n _this.hasError = _this.isStopped = true;\n _this.thrownError = err;\n var observers = _this.observers;\n while (observers.length) {\n observers.shift().error(err);\n }\n }\n });\n };\n Subject.prototype.complete = function () {\n var _this = this;\n errorContext(function () {\n _this._throwIfClosed();\n if (!_this.isStopped) {\n _this.isStopped = true;\n var observers = _this.observers;\n while (observers.length) {\n observers.shift().complete();\n }\n }\n });\n };\n Subject.prototype.unsubscribe = function () {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null;\n };\n Object.defineProperty(Subject.prototype, \"observed\", {\n get: function () {\n var _a;\n return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;\n },\n enumerable: false,\n configurable: true\n });\n Subject.prototype._trySubscribe = function (subscriber) {\n this._throwIfClosed();\n return _super.prototype._trySubscribe.call(this, subscriber);\n };\n Subject.prototype._subscribe = function (subscriber) {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n };\n Subject.prototype._innerSubscribe = function (subscriber) {\n var _this = this;\n var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(function () {\n _this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n };\n Subject.prototype._checkFinalizedStatuses = function (subscriber) {\n var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;\n if (hasError) {\n subscriber.error(thrownError);\n }\n else if (isStopped) {\n subscriber.complete();\n }\n };\n Subject.prototype.asObservable = function () {\n var observable = new Observable();\n observable.source = this;\n return observable;\n };\n Subject.create = function (destination, source) {\n return new AnonymousSubject(destination, source);\n };\n return Subject;\n}(Observable));\nexport { Subject };\nvar AnonymousSubject = (function (_super) {\n __extends(AnonymousSubject, _super);\n function AnonymousSubject(destination, source) {\n var _this = _super.call(this) || this;\n _this.destination = destination;\n _this.source = source;\n return _this;\n }\n AnonymousSubject.prototype.next = function (value) {\n var _a, _b;\n (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);\n };\n AnonymousSubject.prototype.error = function (err) {\n var _a, _b;\n (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);\n };\n AnonymousSubject.prototype.complete = function () {\n var _a, _b;\n (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);\n };\n AnonymousSubject.prototype._subscribe = function (subscriber) {\n var _a, _b;\n return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;\n };\n return AnonymousSubject;\n}(Subject));\nexport { AnonymousSubject };\n//# sourceMappingURL=Subject.js.map","import { __extends } from \"tslib\";\nimport { Subject } from './Subject';\nvar BehaviorSubject = (function (_super) {\n __extends(BehaviorSubject, _super);\n function BehaviorSubject(_value) {\n var _this = _super.call(this) || this;\n _this._value = _value;\n return _this;\n }\n Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n get: function () {\n return this.getValue();\n },\n enumerable: false,\n configurable: true\n });\n BehaviorSubject.prototype._subscribe = function (subscriber) {\n var subscription = _super.prototype._subscribe.call(this, subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n };\n BehaviorSubject.prototype.getValue = function () {\n var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n };\n BehaviorSubject.prototype.next = function (value) {\n _super.prototype.next.call(this, (this._value = value));\n };\n return BehaviorSubject;\n}(Subject));\nexport { BehaviorSubject };\n//# sourceMappingURL=BehaviorSubject.js.map","export var dateTimestampProvider = {\n now: function () {\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n return _super.call(this) || this;\n }\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n setInterval: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = intervalProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearInterval: function (handle) {\n var delegate = intervalProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n var _this = _super.call(this, scheduler, work) || this;\n _this.scheduler = scheduler;\n _this.work = work;\n _this.pending = false;\n return _this;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n var _a;\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n this.state = state;\n var id = this.id;\n var scheduler = this.scheduler;\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.pending = true;\n this.delay = delay;\n this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n if (delay === void 0) { delay = 0; }\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n return undefined;\n };\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, _delay) {\n var errored = false;\n var errorValue;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype.unsubscribe = function () {\n if (!this.closed) {\n var _a = this, id = _a.id, scheduler = _a.scheduler;\n var actions = scheduler.actions;\n this.work = this.state = this.scheduler = null;\n this.pending = false;\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n this.delay = null;\n _super.prototype.unsubscribe.call(this);\n }\n };\n return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n function Scheduler(schedulerActionCtor, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.schedulerActionCtor = schedulerActionCtor;\n this.now = now;\n }\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n };\n Scheduler.now = dateTimestampProvider.now;\n return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n var _this = _super.call(this, SchedulerAction, now) || this;\n _this.actions = [];\n _this._active = false;\n return _this;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this._active) {\n actions.push(action);\n return;\n }\n var error;\n this._active = true;\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()));\n this._active = false;\n if (error) {\n while ((action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { isFunction } from './isFunction';\nexport function isScheduler(value) {\n return value && isFunction(value.schedule);\n}\n//# sourceMappingURL=isScheduler.js.map","import { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\nfunction last(arr) {\n return arr[arr.length - 1];\n}\nexport function popResultSelector(args) {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\nexport function popScheduler(args) {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\nexport function popNumber(args, defaultValue) {\n return typeof last(args) === 'number' ? args.pop() : defaultValue;\n}\n//# sourceMappingURL=args.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator';\n }\n return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n var reader, _a, value, done;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n reader = readableStream.getReader();\n _b.label = 1;\n case 1:\n _b.trys.push([1, , 9, 10]);\n _b.label = 2;\n case 2:\n if (!true) return [3, 8];\n return [4, __await(reader.read())];\n case 3:\n _a = _b.sent(), value = _a.value, done = _a.done;\n if (!done) return [3, 5];\n return [4, __await(void 0)];\n case 4: return [2, _b.sent()];\n case 5: return [4, __await(value)];\n case 6: return [4, _b.sent()];\n case 7:\n _b.sent();\n return [3, 2];\n case 8: return [3, 10];\n case 9:\n reader.releaseLock();\n return [7];\n case 10: return [2];\n }\n });\n });\n}\nexport function isReadableStreamLike(obj) {\n return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n if (input instanceof Observable) {\n return input;\n }\n if (input != null) {\n if (isInteropObservable(input)) {\n return fromInteropObservable(input);\n }\n if (isArrayLike(input)) {\n return fromArrayLike(input);\n }\n if (isPromise(input)) {\n return fromPromise(input);\n }\n if (isAsyncIterable(input)) {\n return fromAsyncIterable(input);\n }\n if (isIterable(input)) {\n return fromIterable(input);\n }\n if (isReadableStreamLike(input)) {\n return fromReadableStreamLike(input);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n return new Observable(function (subscriber) {\n var obs = obj[Symbol_observable]();\n if (isFunction(obs.subscribe)) {\n return obs.subscribe(subscriber);\n }\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n });\n}\nexport function fromArrayLike(array) {\n return new Observable(function (subscriber) {\n for (var i = 0; i < array.length && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n });\n}\nexport function fromPromise(promise) {\n return new Observable(function (subscriber) {\n promise\n .then(function (value) {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) { return subscriber.error(err); })\n .then(null, reportUnhandledError);\n });\n}\nexport function fromIterable(iterable) {\n return new Observable(function (subscriber) {\n var e_1, _a;\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var value = iterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriber.complete();\n });\n}\nexport function fromAsyncIterable(asyncIterable) {\n return new Observable(function (subscriber) {\n process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n });\n}\nexport function fromReadableStreamLike(readableStream) {\n return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n var asyncIterable_1, asyncIterable_1_1;\n var e_2, _a;\n return __awaiter(this, void 0, void 0, function () {\n var value, e_2_1;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 5, 6, 11]);\n asyncIterable_1 = __asyncValues(asyncIterable);\n _b.label = 1;\n case 1: return [4, asyncIterable_1.next()];\n case 2:\n if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n value = asyncIterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return [2];\n }\n _b.label = 3;\n case 3: return [3, 1];\n case 4: return [3, 11];\n case 5:\n e_2_1 = _b.sent();\n e_2 = { error: e_2_1 };\n return [3, 11];\n case 6:\n _b.trys.push([6, , 9, 10]);\n if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n return [4, _a.call(asyncIterable_1)];\n case 7:\n _b.sent();\n _b.label = 8;\n case 8: return [3, 10];\n case 9:\n if (e_2) throw e_2.error;\n return [7];\n case 10: return [7];\n case 11:\n subscriber.complete();\n return [2];\n }\n });\n });\n}\n//# sourceMappingURL=innerFrom.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n if (delay === void 0) { delay = 0; }\n if (repeat === void 0) { repeat = false; }\n var scheduleSubscription = scheduler.schedule(function () {\n work();\n if (repeat) {\n parentSubscription.add(this.schedule(null, delay));\n }\n else {\n this.unsubscribe();\n }\n }, delay);\n parentSubscription.add(scheduleSubscription);\n if (!repeat) {\n return scheduleSubscription;\n }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { executeSchedule } from '../util/executeSchedule';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function observeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));\n });\n}\n//# sourceMappingURL=observeOn.js.map","import { operate } from '../util/lift';\nexport function subscribeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return operate(function (source, subscriber) {\n subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));\n });\n}\n//# sourceMappingURL=subscribeOn.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function scheduleObservable(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=scheduleObservable.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function schedulePromise(input, scheduler) {\n return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=schedulePromise.js.map","import { Observable } from '../Observable';\nexport function scheduleArray(input, scheduler) {\n return new Observable(function (subscriber) {\n var i = 0;\n return scheduler.schedule(function () {\n if (i === input.length) {\n subscriber.complete();\n }\n else {\n subscriber.next(input[i++]);\n if (!subscriber.closed) {\n this.schedule();\n }\n }\n });\n });\n}\n//# sourceMappingURL=scheduleArray.js.map","import { Observable } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from '../util/isFunction';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleIterable(input, scheduler) {\n return new Observable(function (subscriber) {\n var iterator;\n executeSchedule(subscriber, scheduler, function () {\n iterator = input[Symbol_iterator]();\n executeSchedule(subscriber, scheduler, function () {\n var _a;\n var value;\n var done;\n try {\n (_a = iterator.next(), value = _a.value, done = _a.done);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (done) {\n subscriber.complete();\n }\n else {\n subscriber.next(value);\n }\n }, 0, true);\n });\n return function () { return isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };\n });\n}\n//# sourceMappingURL=scheduleIterable.js.map","import { Observable } from '../Observable';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleAsyncIterable(input, scheduler) {\n if (!input) {\n throw new Error('Iterable cannot be null');\n }\n return new Observable(function (subscriber) {\n executeSchedule(subscriber, scheduler, function () {\n var iterator = input[Symbol.asyncIterator]();\n executeSchedule(subscriber, scheduler, function () {\n iterator.next().then(function (result) {\n if (result.done) {\n subscriber.complete();\n }\n else {\n subscriber.next(result.value);\n }\n });\n }, 0, true);\n });\n });\n}\n//# sourceMappingURL=scheduleAsyncIterable.js.map","import { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nexport function scheduleReadableStreamLike(input, scheduler) {\n return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);\n}\n//# sourceMappingURL=scheduleReadableStreamLike.js.map","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isReadableStreamLike } from '../util/isReadableStreamLike';\nimport { scheduleReadableStreamLike } from './scheduleReadableStreamLike';\nexport function scheduled(input, scheduler) {\n if (input != null) {\n if (isInteropObservable(input)) {\n return scheduleObservable(input, scheduler);\n }\n if (isArrayLike(input)) {\n return scheduleArray(input, scheduler);\n }\n if (isPromise(input)) {\n return schedulePromise(input, scheduler);\n }\n if (isAsyncIterable(input)) {\n return scheduleAsyncIterable(input, scheduler);\n }\n if (isIterable(input)) {\n return scheduleIterable(input, scheduler);\n }\n if (isReadableStreamLike(input)) {\n return scheduleReadableStreamLike(input, scheduler);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\n//# sourceMappingURL=scheduled.js.map","import { scheduled } from '../scheduled/scheduled';\nimport { innerFrom } from './innerFrom';\nexport function from(input, scheduler) {\n return scheduler ? scheduled(input, scheduler) : innerFrom(input);\n}\n//# sourceMappingURL=from.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n subscriber.next(project.call(thisArg, value, index++));\n }));\n });\n}\n//# sourceMappingURL=map.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { map } from \"../operators/map\";\nvar isArray = Array.isArray;\nfunction callOrApply(fn, args) {\n return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);\n}\nexport function mapOneOrManyArgs(fn) {\n return map(function (args) { return callOrApply(fn, args); });\n}\n//# sourceMappingURL=mapOneOrManyArgs.js.map","var isArray = Array.isArray;\nvar getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;\nexport function argsArgArrayOrObject(args) {\n if (args.length === 1) {\n var first_1 = args[0];\n if (isArray(first_1)) {\n return { args: first_1, keys: null };\n }\n if (isPOJO(first_1)) {\n var keys = getKeys(first_1);\n return {\n args: keys.map(function (key) { return first_1[key]; }),\n keys: keys,\n };\n }\n }\n return { args: args, keys: null };\n}\nfunction isPOJO(obj) {\n return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;\n}\n//# sourceMappingURL=argsArgArrayOrObject.js.map","export function createObject(keys, values) {\n return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});\n}\n//# sourceMappingURL=createObject.js.map","import { Observable } from '../Observable';\nimport { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';\nimport { from } from './from';\nimport { identity } from '../util/identity';\nimport { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';\nimport { popResultSelector, popScheduler } from '../util/args';\nimport { createObject } from '../util/createObject';\nimport { createOperatorSubscriber } from '../operators/OperatorSubscriber';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function combineLatest() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var scheduler = popScheduler(args);\n var resultSelector = popResultSelector(args);\n var _a = argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;\n if (observables.length === 0) {\n return from([], scheduler);\n }\n var result = new Observable(combineLatestInit(observables, scheduler, keys\n ?\n function (values) { return createObject(keys, values); }\n :\n identity));\n return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;\n}\nexport function combineLatestInit(observables, scheduler, valueTransform) {\n if (valueTransform === void 0) { valueTransform = identity; }\n return function (subscriber) {\n maybeSchedule(scheduler, function () {\n var length = observables.length;\n var values = new Array(length);\n var active = length;\n var remainingFirstValues = length;\n var _loop_1 = function (i) {\n maybeSchedule(scheduler, function () {\n var source = from(observables[i], scheduler);\n var hasFirstValue = false;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n values[i] = value;\n if (!hasFirstValue) {\n hasFirstValue = true;\n remainingFirstValues--;\n }\n if (!remainingFirstValues) {\n subscriber.next(valueTransform(values.slice()));\n }\n }, function () {\n if (!--active) {\n subscriber.complete();\n }\n }));\n }, subscriber);\n };\n for (var i = 0; i < length; i++) {\n _loop_1(i);\n }\n }, subscriber);\n };\n}\nfunction maybeSchedule(scheduler, execute, subscription) {\n if (scheduler) {\n executeSchedule(subscription, scheduler, execute);\n }\n else {\n execute();\n }\n}\n//# sourceMappingURL=combineLatest.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n });\n}\n//# sourceMappingURL=filter.js.map","import { __values } from \"tslib\";\nimport { Subscription } from '../Subscription';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { arrRemove } from '../util/arrRemove';\nimport { asyncScheduler } from '../scheduler/async';\nimport { popScheduler } from '../util/args';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function bufferTime(bufferTimeSpan) {\n var _a, _b;\n var otherArgs = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n otherArgs[_i - 1] = arguments[_i];\n }\n var scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;\n var bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;\n var maxBufferSize = otherArgs[1] || Infinity;\n return operate(function (source, subscriber) {\n var bufferRecords = [];\n var restartOnEmit = false;\n var emit = function (record) {\n var buffer = record.buffer, subs = record.subs;\n subs.unsubscribe();\n arrRemove(bufferRecords, record);\n subscriber.next(buffer);\n restartOnEmit && startBuffer();\n };\n var startBuffer = function () {\n if (bufferRecords) {\n var subs = new Subscription();\n subscriber.add(subs);\n var buffer = [];\n var record_1 = {\n buffer: buffer,\n subs: subs,\n };\n bufferRecords.push(record_1);\n executeSchedule(subs, scheduler, function () { return emit(record_1); }, bufferTimeSpan);\n }\n };\n if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {\n executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);\n }\n else {\n restartOnEmit = true;\n }\n startBuffer();\n var bufferTimeSubscriber = createOperatorSubscriber(subscriber, function (value) {\n var e_1, _a;\n var recordsCopy = bufferRecords.slice();\n try {\n for (var recordsCopy_1 = __values(recordsCopy), recordsCopy_1_1 = recordsCopy_1.next(); !recordsCopy_1_1.done; recordsCopy_1_1 = recordsCopy_1.next()) {\n var record = recordsCopy_1_1.value;\n var buffer = record.buffer;\n buffer.push(value);\n maxBufferSize <= buffer.length && emit(record);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (recordsCopy_1_1 && !recordsCopy_1_1.done && (_a = recordsCopy_1.return)) _a.call(recordsCopy_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }, function () {\n while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {\n subscriber.next(bufferRecords.shift().buffer);\n }\n bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();\n subscriber.complete();\n subscriber.unsubscribe();\n }, undefined, function () { return (bufferRecords = null); });\n source.subscribe(bufferTimeSubscriber);\n });\n}\n//# sourceMappingURL=bufferTime.js.map","import { identity } from '../util/identity';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function distinctUntilChanged(comparator, keySelector) {\n if (keySelector === void 0) { keySelector = identity; }\n comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;\n return operate(function (source, subscriber) {\n var previousKey;\n var first = true;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n var currentKey = keySelector(value);\n if (first || !comparator(previousKey, currentKey)) {\n first = false;\n previousKey = currentKey;\n subscriber.next(value);\n }\n }));\n });\n}\nfunction defaultCompare(a, b) {\n return a === b;\n}\n//# sourceMappingURL=distinctUntilChanged.js.map","import { operate } from '../util/lift';\nexport function finalize(callback) {\n return operate(function (source, subscriber) {\n try {\n source.subscribe(subscriber);\n }\n finally {\n subscriber.add(callback);\n }\n });\n}\n//# sourceMappingURL=finalize.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { innerFrom } from '../observable/innerFrom';\nimport { noop } from '../util/noop';\nexport function takeUntil(notifier) {\n return operate(function (source, subscriber) {\n innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop));\n !subscriber.closed && source.subscribe(subscriber);\n });\n}\n//# sourceMappingURL=takeUntil.js.map","import { Observable } from 'rxjs';\nimport { EventSourceMessage, fetchEventSource } from '@microsoft/fetch-event-source';\nimport { FetchSsePayload, SseResponse } from '../types';\nimport { HttpError } from '../types/http-error';\nimport { EventType } from '../constants/enum';\n\ninterface CreateSseObservableOptions {\n endpoint: string;\n apiKey?: string;\n debugMode?: boolean;\n /** POST dispatches a run; GET is the transcript cold-start rejoin (F-014). Defaults to POST. */\n method?: 'GET' | 'POST';\n /** Only sent for POST; a GET rejoin carries its params in the URL. */\n payload?: FetchSsePayload;\n customHeaders?: Record<string, string>;\n}\n\nexport function createSseObservable(options: CreateSseObservableOptions): Observable<SseResponse<EventType>> {\n const { endpoint, apiKey, payload, debugMode, customHeaders } = options;\n const method = options.method ?? 'POST';\n\n return new Observable<SseResponse<EventType>>(subscriber => {\n const controller = new AbortController();\n let currentTraceId: string | undefined;\n // Whether a resumable cursor exists — set once any event carries an `id:`. `@microsoft/fetch-event-source`\n // tracks that `id:` and replays it as the `Last-Event-ID` header on its native reconnect (F-002).\n let hasCursor = false;\n // Set by this observable's teardown: the consumer deliberately let go (unsubscribe on unmount,\n // channel switch, or the legacy stop fallback). Distinguishes \"we cut it\" from \"it broke\" (F-023\n // AC10) — an intentional abort must never be reported as an error nor trigger the reconnect below.\n let disposed = false;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...customHeaders,\n };\n\n if (apiKey) {\n headers['X-API-KEY'] = apiKey;\n }\n\n // Preserve any query already on the endpoint (e.g. the GET rejoin's `custom_channel_id`) and add\n // `is_debug` on top, rather than overwriting the search string.\n const url = new URL(endpoint);\n\n if (debugMode) {\n url.searchParams.set('is_debug', 'true');\n }\n\n fetchEventSource(url.toString(), {\n method,\n headers,\n body: method === 'POST' && payload ? JSON.stringify(payload) : undefined,\n signal: controller.signal,\n /**\n * Allow SSE to work when the page is hidden.\n * https://github.com/Azure/fetch-event-source/issues/17#issuecomment-1525904929\n */\n openWhenHidden: true,\n onopen: async response => {\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n try {\n body = await response.text();\n } catch {\n body = null;\n }\n }\n\n subscriber.error(new HttpError(response.status, response.statusText, body));\n controller.abort();\n } else {\n currentTraceId = response.headers.get('X-Trace-Id') ?? undefined;\n }\n },\n onmessage: (esm: EventSourceMessage) => {\n // A non-empty `id:` is the resume cursor; from here a mid-stream drop can be resumed (F-002).\n if (esm.id) hasCursor = true;\n\n const data = JSON.parse(esm.data) as SseResponse<EventType>;\n\n if (currentTraceId) {\n data.traceId = currentTraceId;\n } else if (data.requestId) {\n data.traceId = data.requestId;\n if (!currentTraceId) {\n currentTraceId = data.requestId;\n }\n }\n\n subscriber.next(data);\n },\n onclose: () => {\n subscriber.complete();\n },\n onerror: err => {\n // The consumer aborted on purpose (F-023 AC10). The in-flight fetch rejects with an\n // AbortError, which is not a failure of the stream — swallow it: no `subscriber.error`, and no\n // reconnect (returning here would schedule a retry, resurrecting a connection we just dropped).\n // Throwing is what tells @microsoft/fetch-event-source to stop for good.\n if (disposed) throw err;\n\n // A cursor exists → let @microsoft/fetch-event-source run its native Last-Event-ID reconnect:\n // returning without throwing tells the library to retry (obeying the server `retry:`), and it\n // replays the last `id:` as `Last-Event-ID`, so the backend resumes from the cursor with no\n // re-dispatch (F-002 / UC-003).\n if (hasCursor) return;\n\n // No cursor yet (failure before 200, or no `id:` received) → do NOT reconnect: an empty-cursor\n // POST would be re-dispatched as a new run. Surface the error to the caller instead (F-002 / UC-004).\n subscriber.error(err);\n controller.abort();\n throw err;\n },\n });\n\n return (): void => {\n disposed = true;\n controller.abort();\n };\n });\n}\n","import { Listeners } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<Events extends Record<string, any>> {\n private listeners: Listeners<Events> = {};\n\n on<K extends keyof Events>(event: K, listener: Events[K]): void {\n this.listeners = Object.assign({}, this.listeners, {\n [event]: (this.listeners[event] ?? []).concat(listener),\n });\n }\n\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n if (!this.listeners[event]) return;\n\n this.listeners = Object.assign({}, this.listeners, {\n [event]: (this.listeners[event] ?? []).filter((l: Events[K]) => l !== listener),\n });\n }\n\n remove<K extends keyof Events>(event: K): void {\n delete this.listeners[event];\n }\n\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n if (!this.listeners[event]) return;\n\n this.listeners[event].forEach((listener: Events[K]) => listener(...args));\n }\n}\n","import {\n ChannelMetadata,\n ClientConfig,\n IAsgardServiceClient,\n FetchSsePayload,\n FetchSseOptions,\n SseResponse,\n SseEvents,\n BlobUploadResponse,\n ChannelHomeDownloadResult,\n MessageFeedbackReply,\n MessageFeedbackRequest,\n SandboxBrowserSessionCredentials,\n SandboxChannelScope,\n SandboxFsCopyMoveOptions,\n SandboxFsCopyResult,\n SandboxFsListResult,\n SandboxFsReadOptions,\n SandboxFsReadResult,\n SandboxFsStatResult,\n SandboxFsWatchEvent,\n SandboxFsWriteOptions,\n SandboxFsWriteResult,\n StopGenerationOptions,\n} from '../types';\nimport { HttpError } from '../types/http-error';\nimport { fetchEventSource } from '@microsoft/fetch-event-source';\nimport { createSseObservable } from './create-sse-observable';\nimport { bufferTime, filter, finalize, Observable, Subject, Subscription, takeUntil } from 'rxjs';\nimport { EventType } from '../constants/enum';\nimport { EventEmitter } from './event-emitter';\n\n/**\n * How long `runSse` gathers SSE frames before handing them on. One window is the whole latency the SDK\n * adds, no matter how many frames land in it — see the rationale on the `bufferTime` call below.\n */\nconst DEFAULT_SSE_BATCH_WINDOW_MS = 50;\n\n/**\n * Write the sandbox channel scope onto a URL. `scope` is required although its type includes `undefined`:\n * a new sandbox call must state what it wants rather than silently inherit an omission.\n */\nfunction withChannelScope(url: URL, scope: SandboxChannelScope | undefined): URL {\n if (scope?.customChannelId) url.searchParams.set('custom_channel_id', scope.customChannelId);\n\n return url;\n}\n\nexport default class AsgardServiceClient implements IAsgardServiceClient {\n private apiKey?: string;\n private endpoint!: string;\n private botProviderEndpoint?: string;\n readonly debugMode?: boolean;\n private destroy$ = new Subject<void>();\n private closed = false;\n private detached = false;\n private detachTimer?: ReturnType<typeof setTimeout>;\n private inFlight = 0;\n private sseEmitter = new EventEmitter<SseEvents>();\n private transformSsePayload?: (payload: FetchSsePayload) => FetchSsePayload;\n private customHeaders?: Record<string, string>;\n\n constructor(config: ClientConfig) {\n // Validate that either endpoint or botProviderEndpoint is provided\n if (!config.endpoint && !config.botProviderEndpoint) {\n throw new Error('Either endpoint or botProviderEndpoint must be provided');\n }\n\n this.apiKey = config.apiKey;\n this.debugMode = config.debugMode;\n this.transformSsePayload = config.transformSsePayload;\n this.botProviderEndpoint = config.botProviderEndpoint;\n this.customHeaders = {\n ...config.customHeaders,\n ...(config.userIdentityHint ? { 'X-ASGARD-USER-IDENTITY-HINT': config.userIdentityHint } : {}),\n };\n\n // Handle endpoint derivation and deprecation\n if (!config.endpoint && config.botProviderEndpoint) {\n // Derive endpoint from botProviderEndpoint (new recommended way)\n // Handle trailing slashes to prevent double slashes\n const baseEndpoint = config.botProviderEndpoint.replace(/\\/+$/, '');\n this.endpoint = `${baseEndpoint}/message/sse`;\n } else if (config.endpoint) {\n // Use provided endpoint but warn about deprecation\n this.endpoint = config.endpoint;\n if (this.debugMode) {\n // eslint-disable-next-line no-console\n console.warn(\n '[AsgardServiceClient] The \"endpoint\" option is deprecated and will be removed in the next major version. ' +\n `Please use \"botProviderEndpoint\" instead. The SSE endpoint will be automatically derived as \"\\${botProviderEndpoint}/message/sse\".`,\n );\n }\n }\n }\n\n on<K extends keyof SseEvents>(event: K, listener: SseEvents[K]): void {\n this.sseEmitter.remove(event);\n this.sseEmitter.on(event, listener);\n }\n\n handleEvent(response: SseResponse<EventType>): void {\n switch (response.eventType) {\n case EventType.INIT:\n this.sseEmitter.emit(EventType.INIT, response as SseResponse<EventType.INIT>);\n\n break;\n case EventType.PROCESS_START:\n case EventType.PROCESS_COMPLETE:\n this.sseEmitter.emit(EventType.PROCESS, response as Parameters<SseEvents[EventType.PROCESS]>[0]);\n\n break;\n case EventType.MESSAGE_START:\n case EventType.MESSAGE_DELTA:\n case EventType.MESSAGE_COMPLETE:\n this.sseEmitter.emit(EventType.MESSAGE, response as Parameters<SseEvents[EventType.MESSAGE]>[0]);\n\n break;\n case EventType.TOOL_CALL_START:\n case EventType.TOOL_CALL_COMPLETE:\n this.sseEmitter.emit(EventType.TOOL_CALL, response as Parameters<SseEvents[EventType.TOOL_CALL]>[0]);\n\n break;\n case EventType.TOOL_CALL_CONSENT:\n this.sseEmitter.emit(\n EventType.TOOL_CALL_CONSENT,\n response as Parameters<SseEvents[EventType.TOOL_CALL_CONSENT]>[0],\n );\n\n break;\n case EventType.DONE:\n this.sseEmitter.emit(EventType.DONE, response as SseResponse<EventType.DONE>);\n\n break;\n case EventType.ERROR:\n this.sseEmitter.emit(EventType.ERROR, response as SseResponse<EventType.ERROR>);\n\n break;\n default:\n break;\n }\n }\n\n fetchSse(payload: FetchSsePayload, options?: FetchSseOptions): Subscription {\n options?.onSseStart?.();\n this.inFlight += 1;\n\n return this.runSse(\n createSseObservable({\n apiKey: this.apiKey,\n endpoint: this.endpoint,\n debugMode: this.debugMode,\n payload: this.transformSsePayload?.(payload) ?? payload,\n customHeaders: this.customHeaders,\n }),\n options,\n );\n }\n\n /**\n * Cold-start transcript rejoin (F-014): a `GET /message/sse?custom_channel_id=…` with an empty\n * `Last-Event-ID` replays the collapsed history (`message.user` + self-sufficient `*.complete`),\n * assembled through the same reducer. Reuses the F-002 native Last-Event-ID transport (no re-POST).\n */\n rejoinSse(customChannelId: string, options?: FetchSseOptions): Subscription {\n options?.onSseStart?.();\n this.inFlight += 1;\n\n const url = new URL(this.endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n return this.runSse(\n createSseObservable({\n apiKey: this.apiKey,\n endpoint: url.toString(),\n debugMode: this.debugMode,\n method: 'GET',\n customHeaders: this.customHeaders,\n }),\n options,\n );\n }\n\n private deriveChannelMetadataEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/channel/metadata` : null;\n }\n\n /**\n * Join-init existence + restore gate (F-015): `GET {base}/channel/metadata?custom_channel_id=…`.\n * `200` → parsed {@link ChannelMetadata}; `404` → `null` (channel does not exist); any other non-OK\n * status or network error throws. The caller must never treat an indeterminate result (throw) as\n * \"not exists\" — that would let a mount-time reset wipe an existing channel's history.\n */\n async channelMetadata(customChannelId: string): Promise<ChannelMetadata | null> {\n const endpoint = this.deriveChannelMetadataEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive channel metadata endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const url = new URL(endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n const headers: Record<string, string> = { ...this.customHeaders };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n const response = await fetch(url.toString(), { method: 'GET', headers });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n // Accept both a `{ data: … }` envelope (the convention used by the bot-provider metadata fetch) and\n // a bare body, so the shape can be confirmed against the real backend without a code change here.\n const json: { data?: ChannelMetadata } & Partial<ChannelMetadata> = await response.json();\n const data = json.data ?? (json as ChannelMetadata);\n\n return {\n title: data.title ?? null,\n runState: data.runState ?? 'IDLE',\n lastActivityAt: data.lastActivityAt,\n // F-019 — whitelist-pass the live-sandbox list (map the five backend fields); `[]` for an old\n // backend / a channel with none live. metadata is the sole authority on \"who is live\".\n launchedSandboxes: (data.launchedSandboxes ?? []).map(sandbox => ({\n sandboxName: sandbox.sandboxName,\n sandboxBlueprintName: sandbox.sandboxBlueprintName,\n workingDirectory: sandbox.workingDirectory,\n editorServerEnabled: sandbox.editorServerEnabled,\n browserEnabled: sandbox.browserEnabled,\n })),\n };\n }\n\n private deriveSuspendEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/message/suspend` : null;\n }\n\n /**\n * Ask the backend to suspend this channel's background run (F-023 AC1):\n * `POST {base}/message/suspend?custom_channel_id=…`. The six downstream relays expose this at the\n * exact same shape as `GET {base}/message/sse`, so it is derived identically with no per-backend case.\n *\n * `custom_channel_id` is always sent — some backends take the channel from the path and ignore it,\n * others require it, and sending it is correct for both (same rule as the GET rejoin).\n *\n * **Resolving means \"accepted\", not \"stopped\".** The run winds down on the server and declares itself\n * finished through the terminal event on the already-open SSE stream (the same event a normal run\n * ends with), so callers must keep that stream connected and wait for it.\n *\n * Success is **any 2xx** — relays variously answer `204 No Content` or `200` with an envelope, so no\n * single status is hardcoded. `404` means the channel was never created, i.e. there is nothing to\n * stop, which is a success rather than an error. Every other non-2xx throws {@link HttpError}.\n */\n async suspendChannel(\n customChannelId: string,\n options?: StopGenerationOptions & { requestId?: string },\n ): Promise<void> {\n const endpoint = this.deriveSuspendEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive channel suspend endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const url = new URL(endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n if (options?.requestId) {\n url.searchParams.set('request_id', options.requestId);\n }\n\n if (options?.force) {\n url.searchParams.set('force', 'true');\n }\n\n const response = await fetch(url.toString(), { method: 'POST', headers: this.apiHeaders() });\n\n // 404 = the channel does not exist = nothing to stop. Not a failure the user should ever see.\n if (response.ok || response.status === 404) {\n return;\n }\n\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n private deriveChannelEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/channel` : null;\n }\n\n /**\n * End the conversation and release the whole channel (F-032):\n * `DELETE {base}/channel?custom_channel_id=…`. The backend tears down the in-flight run, the\n * transcript, uploaded blobs, the tool-call allow-list, the Sandbox and the Channel Home, and only\n * then answers — so once this resolves the same `customChannelId` is genuinely a blank slate\n * (`GET /channel/metadata` goes back to `404`).\n *\n * Success is **any 2xx**: the endpoint answers `204 No Content`, and does so for a channel that never\n * existed too (deleting nothing is not a failure). Unlike {@link suspendChannel} there is no `404`\n * special case, because the backend never answers one here. Everything else throws {@link HttpError},\n * and a throw must never be read as \"deleted\" — a `500` means the teardown failed and the old\n * conversation is still there.\n *\n * **No timeout is imposed.** A channel with a live Sandbox blocks until the pod is really gone (up to\n * about a minute), on purpose: the next turn must not race a dying pod.\n */\n async deleteChannel(customChannelId: string): Promise<void> {\n const endpoint = this.deriveChannelEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive channel endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const url = new URL(endpoint);\n url.searchParams.set('custom_channel_id', customChannelId);\n\n const response = await fetch(url.toString(), { method: 'DELETE', headers: this.apiHeaders() });\n\n if (response.ok) {\n return;\n }\n\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n private deriveFeedbackEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/message/feedback` : null;\n }\n\n /**\n * Rate one assistant reply Good or Bad (F-033): `POST {base}/message/feedback` with\n * `{ customChannelId, messageId, verdict, comment? }`. Derived from `botProviderEndpoint` exactly like\n * `/message/sse`, because every product relay exposes it at that same shape.\n *\n * Resolves to `{ messageId, seq }` — the persisted entry's own id and transcript cursor — on any 2xx\n * (the relays wrap it in a `{ data }` envelope; a bare body is accepted too). `404` means the target is\n * not a ratable reply (a thinking block, the user's own message, an unknown id), `400` a bad verdict\n * or a comment over 8 KiB; both, like any other failure, reject with {@link HttpError}. Nothing is\n * retried: the caller decides whether to offer another attempt, with the user's comment intact.\n */\n async sendMessageFeedback(request: MessageFeedbackRequest): Promise<MessageFeedbackReply> {\n const endpoint = this.deriveFeedbackEndpoint();\n\n if (!endpoint) {\n throw new Error('Unable to derive message feedback endpoint. Please provide botProviderEndpoint in config.');\n }\n\n // `comment` is optional on the wire; an empty string is \"no comment\", not a comment.\n const comment = request.comment?.trim();\n const body: MessageFeedbackRequest = {\n customChannelId: request.customChannelId,\n messageId: request.messageId,\n verdict: request.verdict,\n ...(comment ? { comment } : {}),\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { ...this.apiHeaders(), 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: MessageFeedbackReply } & Partial<MessageFeedbackReply> = await response.json();\n const data = json.data ?? (json as MessageFeedbackReply);\n\n return { messageId: data.messageId, seq: data.seq };\n }\n\n private runSse(observable: Observable<SseResponse<EventType>>, options?: FetchSseOptions): Subscription {\n return observable\n .pipe(\n // No RxJS-level retry: re-subscribing would re-POST and the backend would re-dispatch a duplicate\n // run. Mid-stream resume is the library's job (native Last-Event-ID reconnect in\n // create-sse-observable); a no-cursor failure surfaces via `error` below.\n //\n // **Gate on a window, not on every frame.** This used to be\n // `concatMap(event => of(event).pipe(delay(delayTime ?? 50)))`. `concatMap` is strictly serial,\n // so the cost grew with the *number* of frames rather than the amount of data or the backend's\n // speed — and stream deltas are token-sized. A canvas fragment arrives as hundreds of frames\n // (measured: a 2.6KB drawing = 372 frames of ~7 characters), which made the SDK alone add\n // ~19s at 51.7ms per frame before the conversation held the whole fragment. That is precisely\n // the \"stare at a blank card, then it pops in\" F-030 exists to avoid.\n //\n // `bufferTime` keeps the reason the delay was here — never push hundreds of separate updates\n // at a consumer, one microtask apart — but the latency it adds is one window total, no matter\n // how many frames land in it. Frames are still delivered individually and in order below, so\n // nothing downstream can tell the difference apart from the timing.\n bufferTime(options?.delayTime ?? DEFAULT_SSE_BATCH_WINDOW_MS),\n // An idle stream still ticks an empty buffer every window; do not wake the consumer for nothing.\n filter(batch => batch.length > 0),\n takeUntil(this.destroy$),\n // Settle the run accounting on every termination path — complete, error, AND a user-initiated\n // unsubscribe (stop-generation aborts the connection without a terminal event).\n finalize(() => this.onRunSettled()),\n )\n .subscribe({\n next: batch => {\n // Once detached the connection is kept open only so the backend can\n // finish the run; the owning component is gone, so stop notifying it.\n if (this.detached) return;\n\n for (const response of batch) {\n options?.onSseMessage?.(response);\n this.handleEvent(response);\n }\n },\n error: error => {\n if (!this.detached) options?.onSseError?.(error);\n },\n complete: () => {\n if (!this.detached) options?.onSseCompleted?.();\n },\n });\n }\n\n /**\n * Detach the client from its owning component without aborting in-flight SSE\n * runs. Used when a chatbot unmounts (e.g. the user navigates to another\n * in-app page) but the current run should be allowed to finish on the\n * backend instead of being cut off. After detaching, the stream is still\n * drained to keep the connection open but consumer callbacks no longer fire.\n *\n * The connection cleans itself up in all cases:\n * - No run in flight → close immediately (nothing to keep alive).\n * - Runs in flight → close once they all settle (`onRunSettled`), so the\n * client never lingers past the work it is keeping alive.\n * - A run gets stuck (stream stays open, no `run.done`/error) → the safety\n * timeout force-closes it so the orphaned connection cannot leak.\n */\n detach(options: { timeoutMs: number }): void {\n if (this.detached || this.closed) return;\n\n this.detached = true;\n\n if (this.inFlight === 0) {\n this.close();\n\n return;\n }\n\n this.detachTimer = setTimeout(() => this.close(), options.timeoutMs);\n }\n\n private onRunSettled(): void {\n this.inFlight = Math.max(0, this.inFlight - 1);\n\n // Close only once every kept run has finished, so one run settling never\n // tears down another that is still streaming on the same client.\n if (this.detached && this.inFlight === 0) {\n this.close();\n }\n }\n\n close(): void {\n if (this.closed) return;\n\n this.closed = true;\n\n if (this.detachTimer) {\n clearTimeout(this.detachTimer);\n this.detachTimer = undefined;\n }\n\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * 上傳檔案到 Blob API\n * 根據 API 文件:/ns/{namespace}/bot-provider/{bot_provider_name}/blob\n */\n async uploadFile(file: File, customChannelId: string): Promise<BlobUploadResponse> {\n const blobEndpoint = this.deriveBlobEndpoint();\n\n if (!blobEndpoint) {\n throw new Error('Unable to derive blob endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('customChannelId', customChannelId);\n\n const headers: HeadersInit = {\n ...this.customHeaders,\n };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n try {\n const response = await fetch(blobEndpoint, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.status} ${response.statusText}`);\n }\n\n const result = await response.json();\n\n if (this.debugMode) {\n // eslint-disable-next-line no-console\n console.log('[AsgardServiceClient] File upload response:', result);\n }\n\n return result as BlobUploadResponse;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[AsgardServiceClient] File upload error:', error);\n throw error;\n }\n }\n\n /**\n * 下載 Channel Home(每個 channel 的檔案交換平面)裡的檔案(channel-home:// URI action)。\n * 呼叫 Edge Server GET <base>/channel-home/download?custom_channel_id=xxx&relative_path=xxx 取回 binary。\n */\n async downloadChannelHomeFile(relativePath: string, customChannelId: string): Promise<ChannelHomeDownloadResult> {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error('Unable to derive channel-home download endpoint. Please provide botProviderEndpoint in config.');\n }\n\n const query =\n `custom_channel_id=${encodeURIComponent(customChannelId)}` + `&relative_path=${encodeURIComponent(relativePath)}`;\n const url = `${baseEndpoint}/channel-home/download?${query}`;\n\n const headers: HeadersInit = {\n ...this.customHeaders,\n };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Channel Home download failed: ${response.status} ${response.statusText}`);\n }\n\n const blob = await response.blob();\n // 後端送的 relative_path 是未編碼的原字串,basename 即下載檔名(不做 decode)。\n const filename = relativePath.split('/').pop() || 'download';\n\n if (this.debugMode) {\n // eslint-disable-next-line no-console\n console.log('[AsgardServiceClient] Channel Home download response:', { filename, size: blob.size });\n }\n\n return { blob, filename };\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[AsgardServiceClient] Channel Home download error:', error);\n throw error;\n }\n }\n\n /**\n * F-020 — 取得 sandbox 瀏覽器一次性接手 URL(`sandbox://<name>/open-browser` 卡的副作用)。\n * 呼叫 `POST {base}/sandbox/{sandboxName}/browser/open-url`(對標 asgard-core edgeserver\n * `GenerateSandboxBrowserOpenUrl`:path 參數 namespace / bot-provider 已在 base、sandbox_name 在路徑)。\n * 回應 `{ data: { openURL } }`(envelope 容錯,比照 `channelMetadata`)。\n *\n * `options.customChannelId` 帶上該 sandbox 所屬的 channel(`SandboxChannelScope`)。直接對 edge server\n * 呼叫時它會被忽略,但前置 relay 用它做 ownership 證明,缺了就是 `400`。\n */\n async generateSandboxBrowserOpenUrl(sandboxName: string, options?: SandboxChannelScope): Promise<string> {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error(\n 'Unable to derive sandbox browser open-url endpoint. Please provide botProviderEndpoint in config.',\n );\n }\n\n const url = withChannelScope(\n new URL(`${baseEndpoint}/sandbox/${encodeURIComponent(sandboxName)}/browser/open-url`),\n options,\n );\n\n const response = await fetch(url.toString(), { method: 'POST', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: { openURL?: string } } & { openURL?: string } = await response.json();\n const openURL = json.data?.openURL ?? json.openURL;\n\n if (!openURL) {\n throw new Error('Sandbox browser open-url response did not contain an openURL.');\n }\n\n return openURL;\n }\n\n /**\n * F-035 — 取得 sandbox 瀏覽器的串流連線憑證:`POST {base}/sandbox/{sandboxName}/browser/session`\n * → `{ wsUrl, token }`(envelope 容錯,比照 `generateSandboxBrowserOpenUrl`)。\n *\n * 與 `generateSandboxBrowserOpenUrl` 的差別在**誰畫畫面**:那一支拿的是一次性網址、交給新分頁載入\n * Neko 自己的前端(UC-034,保留不動當 fallback);這一支拿的是 WebSocket endpoint 與 token,由 SDK\n * 自己接 WebRTC、自己畫、自己轉送鍵鼠。\n *\n * 三件呼叫端必須知道的性質:\n * - **token 是 Neko 的 session token,不是 Asgard 的。** 權限等同使用者透過舊的 open-url 流程本來就\n * 能做的事,並隨 sandbox pod 一起消失。\n * - **token 不在 `wsUrl` 裡**,連線時自己 append `?token=`(瀏覽器的 WebSocket API 不能設 header)。\n * - **可以重複呼叫**,每次 mint 一個新 session。連線斷掉或 sandbox 重啟後就該重呼,不要留著舊 token\n * 重試 —— token 沒有 TTL 但存在 Neko 的記憶體裡,pod 一重啟就失效。\n */\n async createSandboxBrowserSession(\n sandboxName: string,\n options?: SandboxChannelScope,\n ): Promise<SandboxBrowserSessionCredentials> {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error(\n 'Unable to derive sandbox browser session endpoint. Please provide botProviderEndpoint in config.',\n );\n }\n\n const url = withChannelScope(\n new URL(`${baseEndpoint}/sandbox/${encodeURIComponent(sandboxName)}/browser/session`),\n options,\n );\n\n const response = await fetch(url.toString(), { method: 'POST', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: Partial<SandboxBrowserSessionCredentials> } & Partial<SandboxBrowserSessionCredentials> =\n await response.json();\n const wsUrl = json.data?.wsUrl ?? json.wsUrl;\n const token = json.data?.token ?? json.token;\n\n // 半套憑證比沒有還糟:少了任何一邊,連線會在 WebSocket 那層失敗,而那個錯誤指向的是網路不是這裡。\n if (!wsUrl || !token) {\n throw new Error('Sandbox browser session response did not contain both wsUrl and token.');\n }\n\n return { wsUrl, token };\n }\n\n /**\n * F-021 — 衍生 sandbox fs 端點 base:`{base}/sandbox/{sandboxName}/fs`(namespace / bot-provider 已在 base)。\n */\n private deriveSandboxFsEndpoint(sandboxName: string): string {\n const baseEndpoint = this.getBaseEndpoint();\n\n if (!baseEndpoint) {\n throw new Error('Unable to derive sandbox fs endpoint. Please provide botProviderEndpoint in config.');\n }\n\n return `${baseEndpoint}/sandbox/${encodeURIComponent(sandboxName)}/fs`;\n }\n\n /**\n * F-021 — one sandbox fs URL, with the channel scope already on it. Every `fs/*` call goes through here\n * so the ownership parameter cannot be forgotten in one of eleven places (see `withChannelScope`).\n */\n private sandboxFsUrl(sandboxName: string, op: string, scope: SandboxChannelScope | undefined): URL {\n return withChannelScope(new URL(`${this.deriveSandboxFsEndpoint(sandboxName)}/${op}`), scope);\n }\n\n /** The shared auth / custom headers for the client's plain-JSON REST calls (no SSE). */\n private apiHeaders(): Record<string, string> {\n const headers: Record<string, string> = { ...this.customHeaders };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n return headers;\n }\n\n /**\n * F-021 — 列出 sandbox 目錄內容(`GET fs/list?path=`)。回應 `{ data: { entries, truncated } }`(envelope\n * 容錯,比照 `channelMetadata`)。\n */\n async sandboxFsList(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<SandboxFsListResult> {\n const url = this.sandboxFsUrl(sandboxName, 'list', options);\n url.searchParams.set('path', path);\n\n const response = await fetch(url.toString(), { method: 'GET', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: SandboxFsListResult } & Partial<SandboxFsListResult> = await response.json();\n const data = json.data ?? (json as SandboxFsListResult);\n\n return { entries: data.entries ?? [], truncated: data.truncated ?? false };\n }\n\n /**\n * F-021 — 讀取 sandbox 檔案(`GET fs/file?path=[&offset_bytes&limit_bytes]`)。回應是 raw octet-stream,\n * 檔案總長度 / 是否截斷走 `X-Total-Bytes` / `X-Truncated` header。\n */\n async sandboxFsRead(sandboxName: string, path: string, options?: SandboxFsReadOptions): Promise<SandboxFsReadResult> {\n const url = this.sandboxFsUrl(sandboxName, 'file', options);\n url.searchParams.set('path', path);\n if (options?.offsetBytes != null) url.searchParams.set('offset_bytes', String(options.offsetBytes));\n\n if (options?.limitBytes != null) url.searchParams.set('limit_bytes', String(options.limitBytes));\n\n const response = await fetch(url.toString(), { method: 'GET', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const content = await response.blob();\n const totalBytesHeader = response.headers.get('X-Total-Bytes');\n\n return {\n content,\n totalBytes: totalBytesHeader != null ? Number(totalBytesHeader) : content.size,\n truncated: response.headers.get('X-Truncated') === 'true',\n };\n }\n\n /**\n * F-021 — 寫入 sandbox 檔案(`PUT fs/file?path=[&mode&create_only]`,`multipart/form-data` 帶 `file`)。\n * 回應 `{ data: { bytesWritten } }`。\n */\n async sandboxFsWrite(\n sandboxName: string,\n path: string,\n content: Blob | string,\n options?: SandboxFsWriteOptions,\n ): Promise<SandboxFsWriteResult> {\n const url = this.sandboxFsUrl(sandboxName, 'file', options);\n url.searchParams.set('path', path);\n if (options?.mode != null) url.searchParams.set('mode', String(options.mode));\n\n if (options?.createOnly) url.searchParams.set('create_only', 'true');\n\n const form = new FormData();\n form.append('file', content instanceof Blob ? content : new Blob([content]));\n\n const response = await fetch(url.toString(), {\n method: 'PUT',\n headers: this.apiHeaders(),\n body: form,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: SandboxFsWriteResult } & Partial<SandboxFsWriteResult> = await response.json();\n const data = json.data ?? (json as SandboxFsWriteResult);\n\n return { bytesWritten: data.bytesWritten ?? 0 };\n }\n\n /** F-021 Cycle 2 — `sandbox://` fs mutation shared request helper (throws `HttpError` on non-OK). */\n private async sandboxFsRequest(\n sandboxName: string,\n op: string,\n method: 'POST' | 'DELETE',\n query: Record<string, string>,\n scope: SandboxChannelScope | undefined,\n ): Promise<unknown> {\n const url = this.sandboxFsUrl(sandboxName, op, scope);\n Object.entries(query).forEach(([k, v]) => url.searchParams.set(k, v));\n\n const response = await fetch(url.toString(), { method, headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n return response.json().catch(() => null);\n }\n\n /** F-021 — stat a sandbox path (`GET fs/stat?path=`). */\n async sandboxFsStat(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<SandboxFsStatResult> {\n const url = this.sandboxFsUrl(sandboxName, 'stat', options);\n url.searchParams.set('path', path);\n\n const response = await fetch(url.toString(), { method: 'GET', headers: this.apiHeaders() });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n const json: { data?: SandboxFsStatResult } & Partial<SandboxFsStatResult> = await response.json();\n const data = json.data ?? (json as SandboxFsStatResult);\n\n return {\n exists: data.exists ?? false,\n isDir: data.isDir ?? false,\n sizeBytes: data.sizeBytes ?? 0,\n mtimeUnix: data.mtimeUnix ?? 0,\n mode: data.mode ?? 0,\n etag: data.etag,\n };\n }\n\n /** F-021 — create a directory (`POST fs/mkdir?path=`). */\n async sandboxFsMkdir(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void> {\n await this.sandboxFsRequest(sandboxName, 'mkdir', 'POST', { path }, options);\n }\n\n /** F-021 — delete a file (`DELETE fs/item?path=`). */\n async sandboxFsRemove(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void> {\n await this.sandboxFsRequest(sandboxName, 'item', 'DELETE', { path }, options);\n }\n\n /** F-021 — recursively delete a directory (`DELETE fs/all?path=`). */\n async sandboxFsRemoveAll(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void> {\n await this.sandboxFsRequest(sandboxName, 'all', 'DELETE', { path }, options);\n }\n\n /** F-021 — copy a path (`POST fs/copy?src=&dst=[&overwrite]`) → bytes copied. */\n async sandboxFsCopy(\n sandboxName: string,\n src: string,\n dst: string,\n options?: SandboxFsCopyMoveOptions,\n ): Promise<SandboxFsCopyResult> {\n const query: Record<string, string> = { src, dst };\n if (options?.overwrite) query.overwrite = 'true';\n\n const json = (await this.sandboxFsRequest(sandboxName, 'copy', 'POST', query, options)) as\n | ({ data?: SandboxFsCopyResult } & Partial<SandboxFsCopyResult>)\n | null;\n const data = json?.data ?? (json as SandboxFsCopyResult | null);\n\n return { bytesCopied: data?.bytesCopied ?? 0 };\n }\n\n /** F-021 — move / rename a path (`POST fs/move?src=&dst=[&overwrite]`). */\n async sandboxFsMove(\n sandboxName: string,\n src: string,\n dst: string,\n options?: SandboxFsCopyMoveOptions,\n ): Promise<void> {\n const query: Record<string, string> = { src, dst };\n if (options?.overwrite) query.overwrite = 'true';\n\n await this.sandboxFsRequest(sandboxName, 'move', 'POST', query, options);\n }\n\n /**\n * F-021 — watch a sandbox path for changes (`GET fs/watch?path=`, SSE). Each `event: change` frame is one\n * `SandboxFsWatchEvent`. The backend probes the path first, so a missing path errors as HTTP rather than\n * as a dead stream. Unsubscribing aborts the request, which ends the sandbox-side watcher.\n */\n sandboxFsWatch(sandboxName: string, path: string, options?: SandboxChannelScope): Observable<SandboxFsWatchEvent> {\n const url = this.sandboxFsUrl(sandboxName, 'watch', options);\n url.searchParams.set('path', path);\n\n return new Observable<SandboxFsWatchEvent>(subscriber => {\n const controller = new AbortController();\n\n void fetchEventSource(url.toString(), {\n headers: this.apiHeaders(),\n signal: controller.signal,\n openWhenHidden: true,\n onopen: async response => {\n if (!response.ok) {\n const body = await response.text().catch(() => undefined);\n subscriber.error(new HttpError(response.status, response.statusText, body));\n controller.abort();\n }\n },\n onmessage: esm => {\n if (esm.event === 'change') subscriber.next(JSON.parse(esm.data) as SandboxFsWatchEvent);\n },\n onclose: () => subscriber.complete(),\n onerror: err => {\n // Unlike the run stream this one carries no `id:` cursor, so there is nothing to resume from —\n // surface the failure instead of letting the library silently reconnect forever.\n subscriber.error(err);\n controller.abort();\n throw err;\n },\n });\n\n return (): void => controller.abort();\n });\n }\n\n /**\n * 從 botProviderEndpoint 衍生 Blob API endpoint\n */\n private deriveBlobEndpoint(): string | null {\n const baseEndpoint = this.getBaseEndpoint();\n\n return baseEndpoint ? `${baseEndpoint}/blob` : null;\n }\n\n /**\n * 衍生 bot provider 的 base endpoint(不含子路徑)。\n * 優先用 botProviderEndpoint;若只有 deprecated 的 endpoint 則反推(移除 /message/sse)。已去除尾部斜線。\n */\n private getBaseEndpoint(): string | null {\n let baseEndpoint = this.botProviderEndpoint;\n\n // 如果沒有 botProviderEndpoint,嘗試從 endpoint 反推\n if (!baseEndpoint && this.endpoint) {\n baseEndpoint = this.endpoint.replace('/message/sse', '');\n }\n\n if (!baseEndpoint) {\n return null;\n }\n\n // 移除尾部斜線\n return baseEndpoint.replace(/\\/+$/, '');\n }\n}\n","// F-024 — path rules for a SourceSet volume.\n//\n// Volume paths are relative and the root is the **empty string**, not `/`. This is the opposite of the\n// in-sandbox fs API, whose paths are container-absolute — so a path copied from that side reaches the\n// backend and comes back 400. Checking here turns a round trip and an opaque status into an immediate,\n// readable error, and keeps the rule in one place for `@asgard-js/react` to reuse.\n\n/** The volume root. Only `list` / `listAll` accept it; every mutation needs a real path. */\nexport const SOURCE_SET_VOLUME_ROOT = '';\n\n/** Segments the backend rejects: empty (a doubled slash) and the two relative-traversal forms. */\nconst INVALID_SEGMENTS: ReadonlySet<string> = new Set(['', '.', '..']);\n\n/**\n * Validate a volume-relative path, returning it unchanged so it can be inlined into a query.\n *\n * @param path Volume-relative, e.g. `notes/todo.md`.\n * @param options `allowRoot` permits the empty-string root — set it only for listing.\n * @throws Error when the path has a leading or trailing slash, a doubled slash, or a `.` / `..` segment.\n */\nexport function assertVolumePath(path: string, options?: { allowRoot?: boolean }): string {\n if (path === SOURCE_SET_VOLUME_ROOT) {\n if (options?.allowRoot) {\n return path;\n }\n\n throw new Error(\n 'SourceSet volume path must not be empty: the volume root is not a valid target for this operation.',\n );\n }\n\n if (path.startsWith('/')) {\n throw new Error(`SourceSet volume path must be relative, with no leading slash (the root is \"\"): \"${path}\".`);\n }\n\n if (path.endsWith('/')) {\n throw new Error(`SourceSet volume path must not end with a slash: \"${path}\".`);\n }\n\n if (path.split('/').some(segment => INVALID_SEGMENTS.has(segment))) {\n throw new Error(`SourceSet volume path must not contain empty, \".\" or \"..\" segments: \"${path}\".`);\n }\n\n return path;\n}\n","import { HttpError } from '../types/http-error';\nimport type {\n SourceSetClientConfig,\n SourceSetCopyMoveOptions,\n SourceSetCopyResult,\n SourceSetDirEntry,\n SourceSetListAllOptions,\n SourceSetListAllResult,\n SourceSetListOptions,\n SourceSetListResult,\n SourceSetMkdirOptions,\n SourceSetPaging,\n SourceSetReadOptions,\n SourceSetReadResult,\n SourceSetStatResult,\n SourceSetWriteOptions,\n SourceSetWriteResult,\n} from '../types/source-set-fs';\nimport { assertVolumePath } from './source-set-path';\n\n// F-024 / F-026 — a standalone client for the SourceSet volume HTTP API.\n//\n// It has nothing to do with `AsgardServiceClient`: no inheritance, no shared instance, no shared\n// state. A SourceSet volume is a plain remote filesystem that is always there, so there is no channel,\n// no sandbox and no lifecycle to coordinate with. The request conventions below mirror that client's\n// `sandboxFs*` methods on purpose (same envelope tolerance, same `HttpError`), but by reading it —\n// nothing here imports it.\n//\n// One instance serves all four bases, because the backend guarantees identical path segments after the\n// base: `{EDGE}/ns/{ns}/source-set/{name}/volume` (apiKey) and the Platform source-set / skill-set and\n// Agent Hub directory relays (Bearer, via `customHeaders`).\n\n/** The server rejects anything larger (`page_size` max 1000), so clamp rather than let it 400. */\nexport const SOURCE_SET_MAX_PAGE_SIZE = 1000;\n\n/**\n * Default ceiling for {@link AsgardSourceSetClient.listAll}.\n *\n * Ten pages of the maximum page size. Past this a file-tree node is not something anyone scrolls, and\n * the walk is sequential, so the cost of going further is paid in round trips for entries nobody reads.\n * It is a ceiling, not a silent truncation: the result reports `total` and `truncatedAtCap` so the UI\n * can say how many were left out, and a caller who genuinely needs more raises `maxEntries`.\n */\nexport const SOURCE_SET_DEFAULT_MAX_ENTRIES = 10_000;\n\n/**\n * The wire envelope. `data` is the documented `RespWrapper` shape, but every reader also accepts a bare\n * body (`json.data ?? json`) the way `channelMetadata` does. `paging` is declared **both** on the\n * envelope and inside the list payload, so it is read from either.\n */\ntype Envelope<T> = { data?: T; paging?: SourceSetPaging } & Partial<T>;\n\nfunction clampPageSize(pageSize: number): number {\n // The lower bound is not cosmetic: a page size of 0 would make `listAll` loop without progressing.\n return Math.min(Math.max(1, Math.floor(pageSize)), SOURCE_SET_MAX_PAGE_SIZE);\n}\n\nexport default class AsgardSourceSetClient {\n private readonly endpoint: string;\n private readonly apiKey?: string;\n private readonly customHeaders?: Record<string, string>;\n\n constructor(config: SourceSetClientConfig) {\n this.endpoint = config.sourceSetEndpoint.replace(/\\/+$/, '');\n this.apiKey = config.apiKey;\n this.customHeaders = config.customHeaders;\n }\n\n /** Auth + caller headers for every request, including the multipart upload and the binary download. */\n private headers(): Record<string, string> {\n const headers: Record<string, string> = { ...this.customHeaders };\n if (this.apiKey) {\n headers['X-API-KEY'] = this.apiKey;\n }\n\n return headers;\n }\n\n /** Issue one volume request, turning any non-2xx into {@link HttpError} (409 included, see R8). */\n private async request(\n op: string,\n method: string,\n query: Record<string, string>,\n body?: BodyInit,\n signal?: AbortSignal,\n ): Promise<Response> {\n const url = new URL(`${this.endpoint}/${op}`);\n Object.entries(query).forEach(([key, value]) => url.searchParams.set(key, value));\n\n const response = await fetch(url.toString(), { method, headers: this.headers(), body, signal });\n\n if (!response.ok) {\n throw new HttpError(response.status, response.statusText, await response.text().catch(() => undefined));\n }\n\n return response;\n }\n\n /** One page of a directory (`GET volume/list?path=[&page&page_size]`). `path` may be the root `''`. */\n async list(path: string, options?: SourceSetListOptions): Promise<SourceSetListResult> {\n const query: Record<string, string> = { path: assertVolumePath(path, { allowRoot: true }) };\n if (options?.page != null) query.page = String(options.page);\n\n if (options?.pageSize != null) query.page_size = String(clampPageSize(options.pageSize));\n\n const response = await this.request('list', 'GET', query);\n const json: Envelope<SourceSetListResult> = await response.json();\n const data = json.data ?? (json as SourceSetListResult);\n\n return {\n entries: data.entries ?? [],\n // Reported as `null` rather than invented. An earlier version synthesized\n // `{ total: entries.length }` here to keep `listAll` terminating, which worked — and made a\n // relay that omits `paging` report the first 1000 of 3000 files as the whole directory.\n paging: data.paging ?? json.paging ?? null,\n };\n }\n\n /**\n * F-026 — every entry in a directory, paging until `paging.total` or the cap.\n *\n * A failed page rejects rather than returning what it managed to collect: handing back half a\n * directory that looks whole is the failure this exists to prevent.\n */\n async listAll(path: string, options?: SourceSetListAllOptions): Promise<SourceSetListAllResult> {\n const pageSize = clampPageSize(options?.pageSize ?? SOURCE_SET_MAX_PAGE_SIZE);\n const maxEntries = options?.maxEntries ?? SOURCE_SET_DEFAULT_MAX_ENTRIES;\n const entries: SourceSetDirEntry[] = [];\n let total = 0;\n let complete = true;\n let page = 0;\n\n for (;;) {\n const result = await this.list(path, { page, pageSize });\n const paging = result.paging;\n\n // A page indexed differently from the one requested means the backend is not honouring `page`.\n // Everything after this point would be a re-serve of something already collected, so stop before\n // appending it: duplicates are worse than a shortfall, because the same file appears twice and\n // the user acts on the wrong one.\n if (paging && paging.index !== page) {\n total = paging.total;\n complete = false;\n\n break;\n }\n\n entries.push(...result.entries);\n\n if (!paging) {\n // No paging at all. A short page is the whole directory and can be reported as such; a full\n // one is simply unanswerable — there is no way to distinguish \"exactly one page of files\" from\n // \"the first page of many\", so say so instead of guessing.\n complete = result.entries.length < pageSize;\n\n break;\n }\n\n total = paging.total;\n\n if (entries.length >= total) {\n break;\n }\n\n // An empty page short of `total` means the backend stopped producing; break rather than spin.\n if (entries.length >= maxEntries || result.entries.length === 0) {\n complete = false;\n\n break;\n }\n\n page += 1;\n }\n\n return { entries, total, complete };\n }\n\n /** Stat a path (`GET volume/stat?path=`). A missing path is 200 with `exists: false`, not a 404. */\n async stat(path: string): Promise<SourceSetStatResult> {\n const response = await this.request('stat', 'GET', { path: assertVolumePath(path) });\n const json: Envelope<SourceSetStatResult> = await response.json();\n const data = json.data ?? (json as SourceSetStatResult);\n\n return {\n exists: data.exists ?? false,\n isDir: data.isDir ?? false,\n sizeBytes: data.sizeBytes ?? 0,\n mtimeUnix: data.mtimeUnix ?? 0,\n mode: data.mode ?? 0,\n etag: data.etag,\n };\n }\n\n /** Read a file (`GET volume/file?path=[&offset_bytes&limit_bytes]`) as raw bytes. */\n async read(path: string, options?: SourceSetReadOptions): Promise<SourceSetReadResult> {\n const query: Record<string, string> = { path: assertVolumePath(path) };\n if (options?.offsetBytes != null) query.offset_bytes = String(options.offsetBytes);\n\n if (options?.limitBytes != null) query.limit_bytes = String(options.limitBytes);\n\n const response = await this.request('file', 'GET', query);\n const content = await response.blob();\n const totalBytesHeader = response.headers.get('X-Total-Bytes');\n\n return {\n content,\n totalBytes: totalBytesHeader != null ? Number(totalBytesHeader) : content.size,\n truncated: response.headers.get('X-Truncated') === 'true',\n };\n }\n\n /**\n * Write a file (`PUT volume/file?path=[&mode&create_only]`, `multipart/form-data` with a `file` field).\n * With `createOnly`, an existing path is a 409 rather than an overwrite.\n */\n async write(path: string, content: Blob | string, options?: SourceSetWriteOptions): Promise<SourceSetWriteResult> {\n const query: Record<string, string> = { path: assertVolumePath(path) };\n if (options?.mode != null) query.mode = String(options.mode);\n\n if (options?.createOnly) query.create_only = 'true';\n\n const form = new FormData();\n form.append('file', content instanceof Blob ? content : new Blob([content]));\n\n const response = await this.request('file', 'PUT', query, form, options?.signal);\n const json: Envelope<SourceSetWriteResult> = await response.json();\n const data = json.data ?? (json as SourceSetWriteResult);\n\n return { bytesWritten: data.bytesWritten ?? 0 };\n }\n\n /** Create a directory and any missing parents (`POST volume/mkdir?path=`). */\n async mkdir(path: string, options?: SourceSetMkdirOptions): Promise<void> {\n await this.request('mkdir', 'POST', { path: assertVolumePath(path) }, undefined, options?.signal);\n }\n\n /** Delete a file or empty directory (`DELETE volume/item?path=`). */\n async remove(path: string): Promise<void> {\n await this.request('item', 'DELETE', { path: assertVolumePath(path) });\n }\n\n /** Recursively delete a directory (`DELETE volume/all?path=`). The volume root is not a valid target. */\n async removeAll(path: string): Promise<void> {\n await this.request('all', 'DELETE', { path: assertVolumePath(path) });\n }\n\n /** Copy a file or directory tree (`POST volume/copy?src=&dst=[&overwrite]`). */\n async copy(src: string, dst: string, options?: SourceSetCopyMoveOptions): Promise<SourceSetCopyResult> {\n const query = this.copyMoveQuery(src, dst, options);\n const response = await this.request('copy', 'POST', query);\n const json: Envelope<SourceSetCopyResult> = await response.json();\n const data = json.data ?? (json as SourceSetCopyResult);\n\n return { bytesCopied: data.bytesCopied ?? 0 };\n }\n\n /** Move or rename (`POST volume/move?src=&dst=[&overwrite]`) — also how the UI renames. */\n async move(src: string, dst: string, options?: SourceSetCopyMoveOptions): Promise<void> {\n await this.request('move', 'POST', this.copyMoveQuery(src, dst, options));\n }\n\n private copyMoveQuery(src: string, dst: string, options?: SourceSetCopyMoveOptions): Record<string, string> {\n const query: Record<string, string> = { src: assertVolumePath(src), dst: assertVolumePath(dst) };\n if (options?.overwrite) query.overwrite = 'true';\n\n return query;\n }\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","import { v4 as uuidv4 } from 'uuid';\nimport { EventType, MessageTemplateType } from '../constants/enum';\nimport {\n ConversationBotMessage,\n ConversationCanvasMessage,\n ConversationMessage,\n ConversationSubagentMessage,\n ConversationThinkingMessage,\n ConversationToolCallMessage,\n ConversationUserMessage,\n MessageFeedbackState,\n SseResponse,\n ToolCallConsentEventData,\n} from '../types';\n\ninterface IConversation {\n messages: Map<string, ConversationMessage> | null;\n pendingConsent?: ToolCallConsentEventData | null;\n /**\n * Feedback frames whose target reply has not arrived yet (F-033), keyed by `targetMessageId`. The\n * server writes a reply before anything can rate it, so in seq order the target always precedes its\n * feedback — this only catches an out-of-order delivery, the same class of defect F-011 hardens\n * against. Applied when the target's `message.complete` lands; never rendered on its own.\n */\n pendingFeedback?: Map<string, MessageFeedbackState> | null;\n}\n\nexport default class Conversation implements IConversation {\n public messages: Map<string, ConversationMessage> | null = null;\n public pendingConsent: ToolCallConsentEventData | null = null;\n public pendingFeedback: Map<string, MessageFeedbackState> | null = null;\n\n constructor({ messages, pendingConsent = null, pendingFeedback = null }: IConversation) {\n this.messages = messages;\n this.pendingConsent = pendingConsent ?? null;\n this.pendingFeedback = pendingFeedback ?? null;\n }\n\n pushMessage(message: ConversationMessage): Conversation {\n const messages = new Map(this.messages);\n messages.set(message.messageId, message);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n clearPendingConsent(): Conversation {\n if (!this.pendingConsent) return this;\n\n return new Conversation({ messages: this.messages, pendingConsent: null, pendingFeedback: this.pendingFeedback });\n }\n\n /**\n * Put a consent prompt back (#410) — the mirror of {@link clearPendingConsent}, used to undo the\n * optimistic clear when the reply never reaches the server. Yields to a prompt that arrived in the\n * meantime: that one is newer than the batch being restored.\n */\n restorePendingConsent(pendingConsent: ToolCallConsentEventData): Conversation {\n if (this.pendingConsent) return this;\n\n return new Conversation({ messages: this.messages, pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n /**\n * Converge everything the aborted run left mid-flight (F-020 AC10, F-023). A stopped run sends no\n * closing frame for whatever was in progress, so without this those messages advertise activity that\n * has ceased — and they persist in the transcript that way:\n *\n * - a tool-call with `isComplete === false` gets no `tool_call.complete`, and would render as\n * `running` forever, so it converges to `cancelled`;\n * - a thinking block with `isThinking === true` gets no `message.thinking.complete`, and would keep\n * its highlighted \"Thinking…\" state forever, so it converges to the settled state.\n *\n * Content is preserved either way — never rolled back. Already-settled messages and every other\n * message type are untouched, and the same instance is returned when nothing was in flight.\n */\n settleInFlightMessages(): Conversation {\n if (!this.messages) return this;\n\n let changed = false;\n const messages = new Map(this.messages);\n for (const [id, message] of messages) {\n if (message.type === 'tool-call' && !message.isComplete) {\n messages.set(id, { ...message, isComplete: true, isCancelled: true });\n changed = true;\n }\n\n // F-023 — found only by stopping a real run mid-thinking: the mock and the unit tests had always\n // interrupted after the thinking block had already completed, so this path went unexercised.\n if (message.type === 'thinking' && message.isThinking) {\n messages.set(id, { ...message, isThinking: false });\n changed = true;\n }\n }\n\n if (!changed) return this;\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n /**\n * @deprecated Renamed to {@link settleInFlightMessages} in 0.3.27 — it settles in-flight thinking\n * blocks as well as tool-calls, which the old name no longer described. Behaviour is unchanged;\n * this alias will be removed in a future major version.\n */\n cancelInFlightToolCalls(): Conversation {\n return this.settleInFlightMessages();\n }\n\n onMessage(response: SseResponse<EventType>): Conversation {\n switch (response.eventType) {\n case EventType.MESSAGE_START:\n return this.onMessageStart(response as SseResponse<EventType.MESSAGE_START>);\n case EventType.MESSAGE_DELTA:\n return this.onMessageDelta(response as SseResponse<EventType.MESSAGE_DELTA>);\n case EventType.MESSAGE_COMPLETE:\n return this.onMessageComplete(response as SseResponse<EventType.MESSAGE_COMPLETE>);\n case EventType.MESSAGE_USER:\n return this.onMessageUser(response as SseResponse<EventType.MESSAGE_USER>);\n case EventType.MESSAGE_FEEDBACK:\n return this.onMessageFeedback(response as SseResponse<EventType.MESSAGE_FEEDBACK>);\n case EventType.MESSAGE_THINKING_START:\n return this.onThinkingStart(response as SseResponse<EventType.MESSAGE_THINKING_START>);\n case EventType.MESSAGE_THINKING_DELTA:\n return this.onThinkingDelta(response as SseResponse<EventType.MESSAGE_THINKING_DELTA>);\n case EventType.MESSAGE_THINKING_COMPLETE:\n return this.onThinkingComplete(response as SseResponse<EventType.MESSAGE_THINKING_COMPLETE>);\n case EventType.MESSAGE_CANVAS_START:\n return this.onCanvasStart(response as SseResponse<EventType.MESSAGE_CANVAS_START>);\n case EventType.MESSAGE_CANVAS_DELTA:\n return this.onCanvasDelta(response as SseResponse<EventType.MESSAGE_CANVAS_DELTA>);\n case EventType.MESSAGE_CANVAS_COMPLETE:\n return this.onCanvasComplete(response as SseResponse<EventType.MESSAGE_CANVAS_COMPLETE>);\n case EventType.TOOL_CALL_START:\n return this.onToolCallStart(response as SseResponse<EventType.TOOL_CALL_START>);\n case EventType.TOOL_CALL_COMPLETE:\n return this.onToolCallComplete(response as SseResponse<EventType.TOOL_CALL_COMPLETE>);\n case EventType.TOOL_CALL_CONSENT:\n return this.onToolCallConsent(response as SseResponse<EventType.TOOL_CALL_CONSENT>);\n case EventType.SUBAGENT_START:\n return this.onSubagentStart(response as SseResponse<EventType.SUBAGENT_START>);\n case EventType.SUBAGENT_COMPLETE:\n return this.onSubagentComplete(response as SseResponse<EventType.SUBAGENT_COMPLETE>);\n case EventType.ERROR:\n return this.onMessageError(response as SseResponse<EventType.ERROR>);\n default:\n return this;\n }\n }\n\n /**\n * A message is terminal once `complete` has materialized it (a bot message with `isTyping === false`).\n * Terminal messages must never regress to typing/streaming — late `start`/`delta` frames from replay\n * or out-of-order delivery are ignored (F-011 / UC-018).\n */\n private isTerminalBot(message: ConversationMessage | undefined): boolean {\n return message?.type === 'bot' && !message.isTyping;\n }\n\n /**\n * A thinking block is terminal once `thinking.complete` has settled it (`isThinking === false`).\n * Like the bot terminal guard (F-011), it must never regress to the streaming state — late\n * `thinking.start` / `thinking.delta` frames from replay or out-of-order delivery are ignored.\n */\n private isTerminalThinking(message: ConversationMessage | undefined): boolean {\n return message?.type === 'thinking' && !message.isThinking;\n }\n\n /**\n * A tool-call is terminal once it has completed (`isComplete === true`), whether that came from a\n * live `tool_call.complete` or from one materialized on GET rejoin. Same policy as the bot and\n * thinking guards (F-011): a late / out-of-order `tool_call.start` must not roll it back to\n * running, which would also drop the result and hide it from the Task list.\n */\n private isTerminalToolCall(message: ConversationMessage | undefined): boolean {\n return message?.type === 'tool-call' && message.isComplete === true;\n }\n\n /**\n * A canvas is terminal once `canvas.complete` has delivered the authoritative fragment\n * (`isDrawing === false`). Same policy as the bot / thinking guards (F-011): a late start or delta\n * must not swap that fragment back to whatever prefix happened to be in flight.\n */\n private isTerminalCanvas(message: ConversationMessage | undefined): boolean {\n return message?.type === 'canvas' && !message.isDrawing;\n }\n\n onMessageStart(response: SseResponse<EventType.MESSAGE_START>): Conversation {\n const message = response.fact.messageStart.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n // Terminal guard: a completed message stays put; a late `start` must not blank it into a typing bubble.\n if (this.isTerminalBot(this.messages?.get(message.messageId))) return this;\n\n const messages = new Map(this.messages);\n\n messages.set(message.messageId, {\n type: 'bot',\n eventType: EventType.MESSAGE_START,\n isTyping: true,\n typingText: '',\n messageId: message.messageId,\n message,\n time: new Date(),\n traceId: response.traceId,\n raw: '',\n });\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageDelta(response: SseResponse<EventType.MESSAGE_DELTA>): Conversation {\n const message = response.fact.messageDelta.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n\n // Terminal guard: a late `delta` after `complete` must not flip the message back into typing (UC-018).\n if (this.isTerminalBot(currentMessage)) return this;\n\n // Lazy-init: a `delta` with no existing entry (delta-before-start / mid-stream join) creates the\n // typing message rather than silently dropping its text (UC-017).\n const currentBot = currentMessage?.type === 'bot' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n\n messages.set(message.messageId, {\n type: 'bot',\n eventType: EventType.MESSAGE_DELTA,\n isTyping: true,\n typingText: `${currentBot?.typingText ?? ''}${message.text}`,\n messageId: message.messageId,\n message,\n time: new Date(),\n traceId: response.traceId ?? currentBot?.traceId,\n raw: currentBot?.raw ?? '',\n });\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageComplete(response: SseResponse<EventType.MESSAGE_COMPLETE>): Conversation {\n const message = response.fact.messageComplete.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const messages = new Map(this.messages);\n\n const currentMessage = messages.get(message.messageId);\n const currentBot = currentMessage?.type === 'bot' ? currentMessage : undefined;\n\n // F-033 — the rating is state *about* the reply, not part of the frame, so a late / duplicate\n // `complete` must not wipe it. A feedback frame that arrived before this reply (out of order) is\n // consumed here; it wins over whatever the reply carried, being the newer fact.\n const pendingFeedback = this.pendingFeedback?.get(message.messageId);\n const feedback = pendingFeedback ?? currentBot?.feedback;\n\n messages.set(message.messageId, {\n type: 'bot',\n eventType: EventType.MESSAGE_COMPLETE,\n isTyping: false,\n typingText: null,\n messageId: message.messageId,\n message,\n ...(feedback ? { feedback } : {}),\n time: new Date(),\n traceId: response.traceId ?? currentBot?.traceId,\n raw: JSON.stringify(response),\n });\n\n let remainingPending = this.pendingFeedback;\n if (pendingFeedback) {\n remainingPending = new Map(this.pendingFeedback);\n remainingPending.delete(message.messageId);\n }\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: remainingPending });\n }\n\n /**\n * `asgard.message.feedback` (F-033): fold a rating into the reply it targets. The server is\n * append-only and latest-wins, so a later frame for the same target simply replaces the earlier\n * state — on a replay the frames arrive in seq order and the last one standing is the current one.\n * Only a bot reply can carry a rating; a frame naming anything else (or a reply that has not arrived\n * yet) is parked in `pendingFeedback` and applied if that reply's `complete` shows up later.\n */\n onMessageFeedback(response: SseResponse<EventType.MESSAGE_FEEDBACK>): Conversation {\n const data = response.fact.messageFeedback;\n const feedback: MessageFeedbackState = {\n verdict: data.verdict,\n ...(data.text ? { comment: data.text } : {}),\n };\n\n return this.applyFeedback(data.targetMessageId, feedback);\n }\n\n /**\n * Set the current rating of one bot reply (F-033). Used by the reducer for server frames and by\n * `Channel.sendMessageFeedback` once this client's own POST has been accepted — the SDK has no open\n * stream between runs, so the live echo of its own feedback would never reach it. A target that is not\n * (yet) a bot reply is parked in `pendingFeedback`; see {@link onMessageComplete}.\n */\n applyFeedback(targetMessageId: string, feedback: MessageFeedbackState): Conversation {\n const target = this.messages?.get(targetMessageId);\n\n if (target?.type === 'bot') {\n const messages = new Map(this.messages);\n const rated: ConversationBotMessage = { ...target, feedback };\n messages.set(targetMessageId, rated);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n const pendingFeedback = new Map(this.pendingFeedback);\n pendingFeedback.set(targetMessageId, feedback);\n\n return new Conversation({ messages: this.messages, pendingConsent: this.pendingConsent, pendingFeedback });\n }\n\n onThinkingStart(response: SseResponse<EventType.MESSAGE_THINKING_START>): Conversation {\n const message = response.fact.messageThinkingStart.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n // Terminal guard: a completed thinking block stays put; a late `start` must not reopen it (F-011).\n if (this.isTerminalThinking(this.messages?.get(message.messageId))) return this;\n\n const messages = new Map(this.messages);\n const thinking: ConversationThinkingMessage = {\n type: 'thinking',\n messageId: message.messageId,\n text: message.text,\n isThinking: true,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(message.messageId, thinking);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onThinkingDelta(response: SseResponse<EventType.MESSAGE_THINKING_DELTA>): Conversation {\n const message = response.fact.messageThinkingDelta.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n\n // Terminal guard: a late `delta` after `complete` must not flip the block back into streaming (F-011).\n if (this.isTerminalThinking(currentMessage)) return this;\n\n // Lazy-init: a `delta` with no existing block (delta-before-start / mid-stream join) creates the\n // streaming block rather than dropping its reasoning text (F-011 / UC-001).\n const currentThinking = currentMessage?.type === 'thinking' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n const thinking: ConversationThinkingMessage = {\n type: 'thinking',\n messageId: message.messageId,\n text: `${currentThinking?.text ?? ''}${message.text}`,\n isThinking: true,\n time: currentThinking?.time ?? new Date(),\n traceId: response.traceId ?? currentThinking?.traceId,\n };\n messages.set(message.messageId, thinking);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onThinkingComplete(response: SseResponse<EventType.MESSAGE_THINKING_COMPLETE>): Conversation {\n const message = response.fact.messageThinkingComplete.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n const currentThinking = currentMessage?.type === 'thinking' ? currentMessage : undefined;\n\n const messages = new Map(this.messages);\n const thinking: ConversationThinkingMessage = {\n type: 'thinking',\n messageId: message.messageId,\n // Self-sufficient (F-011): the complete frame carries the full reasoning, so a complete-only\n // replay (no start/delta) still renders the whole text.\n text: message.text,\n isThinking: false,\n time: currentThinking?.time ?? new Date(),\n traceId: response.traceId ?? currentThinking?.traceId,\n };\n messages.set(message.messageId, thinking);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onCanvasStart(response: SseResponse<EventType.MESSAGE_CANVAS_START>): Conversation {\n const message = response.fact.messageCanvasStart.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n // Terminal guard: a finished canvas stays put; a late `start` must not blank it (F-011).\n if (this.isTerminalCanvas(this.messages?.get(message.messageId))) return this;\n\n const messages = new Map(this.messages);\n const canvas: ConversationCanvasMessage = {\n type: 'canvas',\n messageId: message.messageId,\n html: '',\n isDrawing: true,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(message.messageId, canvas);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onCanvasDelta(response: SseResponse<EventType.MESSAGE_CANVAS_DELTA>): Conversation {\n const message = response.fact.messageCanvasDelta.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const currentMessage = this.messages?.get(message.messageId);\n\n // Terminal guard: a late `delta` must not flip a finished canvas back into drawing (F-011).\n if (this.isTerminalCanvas(currentMessage)) return this;\n\n // Lazy-init: a `delta` with no existing canvas (joining mid-stream) opens the block rather than\n // dropping the markup that already arrived.\n const currentCanvas = currentMessage?.type === 'canvas' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n const canvas: ConversationCanvasMessage = {\n type: 'canvas',\n messageId: message.messageId,\n // Deltas are incremental, exactly like a text delta.\n html: `${currentCanvas?.html ?? ''}${message.text}`,\n title: currentCanvas?.title,\n isDrawing: true,\n time: currentCanvas?.time ?? new Date(),\n traceId: response.traceId ?? currentCanvas?.traceId,\n };\n messages.set(message.messageId, canvas);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onCanvasComplete(response: SseResponse<EventType.MESSAGE_CANVAS_COMPLETE>): Conversation {\n const message = response.fact.messageCanvasComplete.message;\n\n // BUG-001: subagent frames carry a non-empty `parentToolUseId`; hide them from the main conversation.\n if (message.parentToolUseId) return this;\n\n const template = message.template?.type === MessageTemplateType.CANVAS ? message.template : undefined;\n const html = template?.canvas?.html;\n\n // No template (or no markup) means the backend could not render this canvas — the frame exists only\n // to close the block `start` opened. Discard the whole card: keeping the partial markup would\n // present an unfinished document as a finished one. For an unknown id this is a no-op.\n if (!html) {\n if (!this.messages?.has(message.messageId)) return this;\n\n const messages = new Map(this.messages);\n messages.delete(message.messageId);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n const currentMessage = this.messages?.get(message.messageId);\n const currentCanvas = currentMessage?.type === 'canvas' ? currentMessage : undefined;\n const messages = new Map(this.messages);\n const canvas: ConversationCanvasMessage = {\n type: 'canvas',\n messageId: message.messageId,\n // **Replace, never append.** This fragment is authoritative, and a rejoin replays only the\n // complete — appending here would stream correctly and come back empty after a reload.\n html,\n title: template?.title,\n isDrawing: false,\n time: currentCanvas?.time ?? new Date(),\n traceId: response.traceId ?? currentCanvas?.traceId,\n };\n messages.set(message.messageId, canvas);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageUser(response: SseResponse<EventType.MESSAGE_USER>): Conversation {\n const data = response.fact.messageUser;\n\n // Dedup: the optimistic bubble sent live is keyed by the customMessageId the client generated, which\n // the backend echoes back here as `customMessageId`. If that (or the backend messageId) already maps\n // to a user message, this replayed turn is a duplicate — keep the existing one (F-014 invariant).\n const existing =\n this.messages?.get(data.messageId) ??\n (data.customMessageId ? this.messages?.get(data.customMessageId) : undefined);\n\n if (existing?.type === 'user') return this;\n\n const messages = new Map(this.messages);\n const userMessage: ConversationUserMessage = {\n type: 'user',\n messageId: data.messageId,\n text: data.text,\n blobIds: data.blobIds,\n blobs: data.blobs,\n customMessageId: data.customMessageId,\n identityHint: data.identityHint,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(data.messageId, userMessage);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onMessageError(response: SseResponse<EventType.ERROR>): Conversation {\n const messageId = uuidv4();\n const error = response.fact.runError.error;\n\n const messages = new Map(this.messages);\n\n messages.set(messageId, {\n type: 'error',\n eventType: EventType.ERROR,\n messageId,\n error,\n time: new Date(),\n traceId: response.traceId,\n });\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onToolCallStart(response: SseResponse<EventType.TOOL_CALL_START>): Conversation {\n const toolCallStart = response.fact.toolCallStart;\n const messages = new Map(this.messages);\n const toolCallKey = `${toolCallStart.processId}-${toolCallStart.callSeq}`;\n\n // Terminal guard, mirroring `isTerminalBot` / `isTerminalThinking` (F-011): a tool-call that has\n // already completed must never regress to running. This became reachable once a replayed\n // `tool_call.complete` can materialize the message on its own — a late or out-of-order `start`\n // would otherwise overwrite it back to `isComplete: false` and drop `result` / `isError` /\n // `sidecar`, with no further `complete` coming to repair it. `isComplete` is also what the Task\n // list folds on (`derived-stores.ts`), so the regression would silently empty that list too.\n if (this.isTerminalToolCall(this.messages?.get(toolCallKey))) return this;\n\n const toolCallMessage: ConversationToolCallMessage = {\n type: 'tool-call',\n eventType: EventType.TOOL_CALL_START,\n messageId: toolCallKey,\n processId: toolCallStart.processId,\n callSeq: toolCallStart.callSeq,\n toolName: toolCallStart.toolCall.toolName,\n reason: toolCallStart.toolCall.reason,\n toolsetName: toolCallStart.toolCall.toolsetName,\n parameter: toolCallStart.toolCall.parameter,\n toolUseId: toolCallStart.toolUseId,\n parentToolUseId: toolCallStart.parentToolUseId,\n isComplete: false,\n time: new Date(),\n traceId: response.traceId,\n };\n\n messages.set(toolCallKey, toolCallMessage);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onToolCallComplete(response: SseResponse<EventType.TOOL_CALL_COMPLETE>): Conversation {\n const toolCallComplete = response.fact.toolCallComplete;\n const messages = new Map(this.messages);\n const toolCallKey = `${toolCallComplete.processId}-${toolCallComplete.callSeq}`;\n\n const existingMessage = messages.get(toolCallKey);\n\n if (existingMessage?.type === 'tool-call') {\n const updatedMessage: ConversationToolCallMessage = {\n ...existingMessage,\n eventType: EventType.TOOL_CALL_COMPLETE,\n result: toolCallComplete.toolCallResult,\n isError: toolCallComplete.isError,\n sidecar: toolCallComplete.toolUseResultSidecar,\n isComplete: true,\n traceId: response.traceId ?? existingMessage.traceId,\n };\n messages.set(toolCallKey, updatedMessage);\n } else {\n // Replay-safety (BUG-009): a GET rejoin only replays terminal frames, so `tool_call.complete`\n // arrives with no preceding `tool_call.start`. Dropping it here made every tool-call block\n // vanish when re-entering a conversation. The complete frame extends the same base payload as\n // the start frame (`toolCall.*` plus the correlation ids), so it can stand alone as a finished\n // call — the only thing lost is the original start timestamp.\n const replayedMessage: ConversationToolCallMessage = {\n type: 'tool-call',\n eventType: EventType.TOOL_CALL_COMPLETE,\n messageId: toolCallKey,\n processId: toolCallComplete.processId,\n callSeq: toolCallComplete.callSeq,\n toolName: toolCallComplete.toolCall.toolName,\n reason: toolCallComplete.toolCall.reason,\n toolsetName: toolCallComplete.toolCall.toolsetName,\n parameter: toolCallComplete.toolCall.parameter,\n toolUseId: toolCallComplete.toolUseId,\n parentToolUseId: toolCallComplete.parentToolUseId,\n result: toolCallComplete.toolCallResult,\n isError: toolCallComplete.isError,\n sidecar: toolCallComplete.toolUseResultSidecar,\n isComplete: true,\n time: new Date(),\n traceId: response.traceId,\n };\n messages.set(toolCallKey, replayedMessage);\n }\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onToolCallConsent(response: SseResponse<EventType.TOOL_CALL_CONSENT>): Conversation {\n const consent = response.fact.toolCallConsent;\n\n return new Conversation({\n messages: this.messages,\n pendingConsent: consent,\n pendingFeedback: this.pendingFeedback,\n });\n }\n\n onSubagentStart(response: SseResponse<EventType.SUBAGENT_START>): Conversation {\n const start = response.fact.subagentStart;\n const messages = new Map(this.messages);\n const key = `subagent:${start.parentToolUseId}:start`;\n\n const message: ConversationSubagentMessage = {\n type: 'subagent',\n messageId: key,\n kind: 'start',\n parentToolUseId: start.parentToolUseId,\n agentId: start.agentId,\n subagentType: start.subagentType,\n description: start.description,\n time: new Date(),\n traceId: response.traceId,\n };\n\n // Re-key to the tail: a resumed subagent re-emits `start` under the same key, and `Map.set` alone\n // would keep it at the first run's position. `deriveSubagents` reads insertion order as arrival\n // order, so a stale position would fold the resume before the tool-calls it precedes (issue #382).\n messages.delete(key);\n messages.set(key, message);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n\n onSubagentComplete(response: SseResponse<EventType.SUBAGENT_COMPLETE>): Conversation {\n const complete = response.fact.subagentComplete;\n const messages = new Map(this.messages);\n const key = `subagent:${complete.parentToolUseId}:complete`;\n\n const message: ConversationSubagentMessage = {\n type: 'subagent',\n messageId: key,\n kind: 'complete',\n parentToolUseId: complete.parentToolUseId,\n agentId: complete.agentId,\n subagentType: complete.subagentType,\n status: complete.status,\n summary: complete.summary,\n time: new Date(),\n traceId: response.traceId,\n };\n\n // Same re-keying as `onSubagentStart`: the second `complete` of a resumed subagent must fold after\n // that run's child tool-calls, otherwise the card never settles back to terminal (issue #382).\n messages.delete(key);\n messages.set(key, message);\n\n return new Conversation({ messages, pendingConsent: this.pendingConsent, pendingFeedback: this.pendingFeedback });\n }\n}\n","// Task Check List accumulation (F-010) — the framework-agnostic data-layer SoT.\n//\n// `TaskCreate` / `TaskUpdate` are native built-in tool-calls (`toolsetName === \"\"`, `reason === \"\"`),\n// but their meaning is \"an incremental edit to one list\", not \"a tool call\". So the react layer:\n// 1. routes them out of the tool-call group via `isTaskTool`;\n// 2. folds them into one current list with `reduceTaskEvents`, presented by `<TaskList>`.\n//\n// Authority (replay-safe): id / status transitions come from the `tool_call.complete` result sidecar,\n// never parsed from the human-readable `toolCallResult` string. `parameter` supplies subject /\n// activeForm / description / the target status fallback.\nimport { Task, TaskStatus } from '../types/task';\n\nconst TASK_TOOLS = new Set(['TaskCreate', 'TaskUpdate']);\n\n/** Native built-in check. `true` → route out of the tool-call group, feed to `reduceTaskEvents`. */\nexport function isTaskTool(call: { toolsetName: string; toolName: string }): boolean {\n return call.toolsetName === '' && TASK_TOOLS.has(call.toolName);\n}\n\n/**\n * A completed task tool-call — the fields `reduceTaskEvents` needs, mirroring a completed\n * `ConversationToolCallMessage` (or the raw `tool_call.complete` fact).\n */\nexport interface TaskToolEvent {\n toolName: string;\n parameter: Record<string, unknown>;\n /** `toolUseResultSidecar`: `TaskCreate` → authoritative id; `TaskUpdate` → `statusChange.to`. */\n sidecar?: Record<string, unknown>;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Fold the `TaskCreate` / `TaskUpdate` complete-event stream into the current list (in create-arrival\n * order). Pure and replay-safe: any prefix of the same stream folds to the same snapshot.\n */\nexport function reduceTaskEvents(events: TaskToolEvent[]): Task[] {\n const order: string[] = [];\n const byId = new Map<string, Task>();\n\n for (const event of events) {\n const parameter = event.parameter ?? {};\n const sidecar = event.sidecar ?? {};\n\n if (event.toolName === 'TaskCreate') {\n const task = asRecord(sidecar.task);\n const id = asString(task?.id);\n\n if (!id) continue; // no authoritative id → skip (never guess from the result string)\n\n if (!byId.has(id)) order.push(id);\n\n byId.set(id, {\n id,\n subject: asString(parameter.subject) || asString(task?.subject) || '',\n activeForm: asString(parameter.activeForm),\n description: asString(parameter.description),\n status: byId.get(id)?.status ?? 'pending', // initial status = pending (keep existing on repeat)\n });\n } else if (event.toolName === 'TaskUpdate') {\n const statusChange = asRecord(sidecar.statusChange);\n const id = asString(parameter.taskId) || asString(sidecar.taskId);\n // sidecar authoritative, parameter.status fallback.\n const to = (asString(statusChange?.to) || asString(parameter.status)) as TaskStatus | undefined;\n\n if (!id || !to) continue;\n\n const prev = byId.get(id);\n\n if (prev) byId.set(id, { ...prev, status: to });\n // update arriving before its create (shouldn't happen in order) → ignore.\n }\n }\n\n return order.map(id => byId.get(id) as Task);\n}\n","// Subagent list accumulation (F-012) — the framework-agnostic data-layer SoT.\n//\n// An `Agent` tool-call spawns a subagent, but it is only the \"launch\" viewpoint and lacks the\n// subagent's detail. So the react layer:\n// 1. routes the `Agent` tool-call (isAgentTool) and every child tool-call (parentToolUseId !== \"\")\n// out of the main tool-call group;\n// 2. folds the `Agent` tool-call + `subagent.{start,complete}` + child tool-calls into one current\n// subagent list with `reduceSubagents`, presented by `<SubagentList>`.\n//\n// Two correctness rules (verified against asgard-sdk-go + the new-example11 dump):\n// - A subagent's status is driven by `subagent.start` → `subagent.complete`, NOT the `Agent`\n// tool_call.complete — async subagents complete the `Agent` tool early (result.status =\n// \"async_launched\") while the subagent is still running.\n// - Correlation key = `parentToolUseId` (= the `Agent` tool-call's `toolUseId`).\n// - A subagent is not one-shot: the orchestrator can resume an existing one, so a terminal card that\n// produces new activity goes back to `running` (issue #382 — see `resume` below).\nimport { Subagent, SubagentStatus, SubagentToolCall } from '../types/subagent';\n\n/** The spawning `Agent` tool-call (native builtin). `true` → route out of the tool-call group. */\nexport function isAgentTool(call: { toolsetName: string; toolName: string }): boolean {\n return call.toolsetName === '' && call.toolName === 'Agent';\n}\n\n/** Whether a tool-call belongs to a subagent (child). The main group keeps only `parentToolUseId === \"\"`. */\nexport function isSubagentChildTool(parentToolUseId?: string): boolean {\n return !!parentToolUseId;\n}\n\n/** The subagent-related SSE events, adapted from their facts by the react layer, in arrival order. */\nexport type SubagentEvent =\n | { kind: 'agentStart'; toolUseId: string; description?: string }\n | { kind: 'subagentStart'; parentToolUseId: string; agentId?: string; subagentType?: string; description?: string }\n | {\n kind: 'toolStart';\n parentToolUseId: string;\n toolUseId: string;\n toolsetName: string;\n toolName: string;\n parameter?: Record<string, unknown>;\n reason?: string;\n }\n | {\n kind: 'toolComplete';\n parentToolUseId: string;\n toolUseId: string;\n isError?: boolean;\n result?: Record<string, unknown>;\n sidecar?: Record<string, unknown>;\n }\n | { kind: 'subagentComplete'; parentToolUseId: string; status: SubagentStatus; summary?: string };\n\ninterface Meta {\n agentId?: string;\n subagentType?: string;\n description?: string;\n status: SubagentStatus;\n summary?: string;\n}\n\n/**\n * A subagent that produces new activity is working again, so a terminal card goes back to `running`\n * and drops the summary — that summary concluded the run that already finished (issue #382).\n */\nfunction resume(m: Meta): void {\n if (m.status === 'running') return;\n\n m.status = 'running';\n m.summary = undefined;\n}\n\n/**\n * Fold the subagent event stream into the current list (in first-seen order). Pure and replay-safe:\n * a replay re-applies the same arrival order, so the trailing `subagentComplete` wins and the snapshot\n * is unchanged. (The guard would only be load-bearing if a replay could deliver a `start` — or a child\n * `toolStart` — *without* the `complete` that followed it, which is not how the folded stream is built.)\n */\nexport function reduceSubagents(events: SubagentEvent[]): Subagent[] {\n const order: string[] = [];\n const meta = new Map<string, Meta>();\n const tools = new Map<string, Map<string, SubagentToolCall>>(); // parentToolUseId -> (toolUseId -> tool)\n\n const ensure = (id: string): Meta => {\n if (!meta.has(id)) {\n order.push(id);\n meta.set(id, { status: 'running' });\n tools.set(id, new Map());\n }\n\n return meta.get(id) as Meta;\n };\n\n for (const event of events) {\n switch (event.kind) {\n case 'agentStart': {\n const m = ensure(event.toolUseId);\n\n if (event.description && !m.description) m.description = event.description;\n\n break;\n }\n\n case 'subagentStart': {\n const m = ensure(event.parentToolUseId);\n\n m.agentId = event.agentId ?? m.agentId;\n m.subagentType = event.subagentType ?? m.subagentType;\n m.description = event.description ?? m.description;\n resume(m); // shape A: the orchestrator re-started an existing subagent within the same turn\n\n break;\n }\n\n case 'toolStart': {\n // shape B (the common resume): a later-turn resume carries no lifecycle event at all, so a\n // child tool-call landing on a terminal card is the only signal that it is working again.\n resume(ensure(event.parentToolUseId));\n (tools.get(event.parentToolUseId) as Map<string, SubagentToolCall>).set(event.toolUseId, {\n toolsetName: event.toolsetName,\n toolName: event.toolName,\n parameter: event.parameter ?? {},\n reason: event.reason,\n status: 'running',\n });\n\n break;\n }\n\n case 'toolComplete': {\n const tool = tools.get(event.parentToolUseId)?.get(event.toolUseId);\n\n if (!tool) break;\n\n tool.status = event.isError ? 'error' : 'completed';\n\n // Hand over the frame's own objects: a consumer may compare them by reference (subagentsEqual does).\n if (event.result !== undefined) tool.result = event.result;\n\n if (event.sidecar !== undefined) tool.sidecar = event.sidecar;\n\n break;\n }\n\n case 'subagentComplete': {\n const m = ensure(event.parentToolUseId);\n\n m.status = event.status;\n m.summary = event.summary;\n\n break;\n }\n }\n }\n\n return order.map(id => ({\n parentToolUseId: id,\n ...(meta.get(id) as Meta),\n tools: Array.from((tools.get(id) as Map<string, SubagentToolCall>).values()),\n }));\n}\n","// Derived-state stores (F-013) — framework-agnostic Task / Subagent stores.\n//\n// The Task List (F-010) and Subagent List (F-012) are pure folds over the conversation. This module\n// exposes them as reactive slices so SDK consumers can render the lists *outside* the Chatbot in any\n// framework: a current immutable snapshot + change notification, never a fire-and-forget delta event.\n//\n// The key performance property: `conversation` changes on every message delta (high frequency), but a\n// consumer that \"just wants to draw the list\" must not re-render on unrelated deltas. Each slice is a\n// `BehaviorSubject` fed through `distinctUntilChanged` on structural equality, so it only emits when\n// that slice actually changes.\nimport { BehaviorSubject, distinctUntilChanged, map, Observable, Subscription } from 'rxjs';\nimport Conversation from './conversation';\nimport { isTaskTool, reduceTaskEvents } from './task-reducer';\nimport { isAgentTool, isSubagentChildTool, reduceSubagents, SubagentEvent } from './subagent-reducer';\nimport { ConversationMessage, ConversationToolCallMessage, Subagent, SubagentToolCall, Task } from '../types';\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Adapt the ordered conversation messages into the `SubagentEvent[]` that `reduceSubagents` folds.\n * Iterating the conversation Map yields arrival order: a message updated in place keeps its slot (a\n * tool-call completing does not jump the queue), and the one case where a message genuinely arrives\n * again — a resumed subagent re-emitting `subagent.start` / `subagent.complete` under the same key —\n * is re-keyed to the tail by `Conversation` so this fold still sees true order (issue #382). A completed\n * child tool emits toolStart + toolComplete back-to-back (its final status is what shows); an\n * in-progress child emits only toolStart (→ running).\n */\nexport function conversationToSubagentEvents(messages: ConversationMessage[]): SubagentEvent[] {\n const events: SubagentEvent[] = [];\n\n for (const message of messages) {\n if (message.type === 'tool-call' && isAgentTool(message)) {\n events.push({\n kind: 'agentStart',\n toolUseId: message.toolUseId ?? message.messageId,\n description: str(message.parameter.description),\n });\n continue;\n }\n\n if (message.type === 'tool-call' && isSubagentChildTool(message.parentToolUseId)) {\n const toolUseId = message.toolUseId ?? message.messageId;\n\n events.push({\n kind: 'toolStart',\n parentToolUseId: message.parentToolUseId as string,\n toolUseId,\n toolsetName: message.toolsetName,\n toolName: message.toolName,\n parameter: message.parameter,\n reason: message.reason,\n });\n\n if (message.isComplete) {\n events.push({\n kind: 'toolComplete',\n parentToolUseId: message.parentToolUseId as string,\n toolUseId,\n isError: message.isError,\n result: message.result,\n sidecar: message.sidecar,\n });\n }\n\n continue;\n }\n\n if (message.type === 'subagent' && message.kind === 'start') {\n events.push({\n kind: 'subagentStart',\n parentToolUseId: message.parentToolUseId,\n agentId: message.agentId,\n subagentType: message.subagentType,\n description: message.description,\n });\n continue;\n }\n\n if (message.type === 'subagent' && message.kind === 'complete' && message.status) {\n events.push({\n kind: 'subagentComplete',\n parentToolUseId: message.parentToolUseId,\n status: message.status,\n summary: message.summary,\n });\n }\n }\n\n return events;\n}\n\n/** Fold the conversation's completed Task tool-calls into the current Task list (F-010). */\nexport function deriveTasks(conversation: Conversation): Task[] {\n const messages = Array.from(conversation.messages?.values() ?? []).filter(\n (message): message is ConversationToolCallMessage =>\n message.type === 'tool-call' && message.isComplete && isTaskTool(message),\n );\n\n return reduceTaskEvents(messages);\n}\n\n/** Fold the conversation's Agent / subagent / child tool-call events into the current Subagent list (F-012). */\nexport function deriveSubagents(conversation: Conversation): Subagent[] {\n return reduceSubagents(conversationToSubagentEvents(Array.from(conversation.messages?.values() ?? [])));\n}\n\n/** Structural equality for two derived Task lists (so a slice only emits when the list truly changes). */\nexport function tasksEqual(a: Task[], b: Task[]): boolean {\n if (a === b) return true;\n\n if (a.length !== b.length) return false;\n\n return a.every((task, i) => {\n const other = b[i];\n\n return (\n task.id === other.id &&\n task.status === other.status &&\n task.subject === other.subject &&\n task.activeForm === other.activeForm &&\n task.description === other.description\n );\n });\n}\n\nfunction toolsEqual(a: SubagentToolCall[], b: SubagentToolCall[]): boolean {\n if (a.length !== b.length) return false;\n\n return a.every((tool, i) => {\n const other = b[i];\n\n return (\n tool.toolName === other.toolName &&\n tool.toolsetName === other.toolsetName &&\n tool.status === other.status &&\n tool.reason === other.reason &&\n // By reference: `Conversation` keeps an untouched message's objects across updates, so an unrelated\n // delta re-derives the very same result and does not count as a change.\n tool.result === other.result &&\n tool.sidecar === other.sidecar\n );\n });\n}\n\n/** Structural equality for two derived Subagent lists (including each subagent's child tool list). */\nexport function subagentsEqual(a: Subagent[], b: Subagent[]): boolean {\n if (a === b) return true;\n\n if (a.length !== b.length) return false;\n\n return a.every((subagent, i) => {\n const other = b[i];\n\n return (\n subagent.parentToolUseId === other.parentToolUseId &&\n subagent.status === other.status &&\n subagent.subagentType === other.subagentType &&\n subagent.description === other.description &&\n subagent.summary === other.summary &&\n toolsEqual(subagent.tools, other.tools)\n );\n });\n}\n\nexport interface DerivedStores {\n /** Emits the current Task list; only when it changes (not on every conversation delta). */\n tasks$: Observable<Task[]>;\n /** Emits the current Subagent list; only when it changes. */\n subagents$: Observable<Subagent[]>;\n /** The current Task list snapshot (immutable). */\n getTasks: () => Task[];\n /** The current Subagent list snapshot (immutable). */\n getSubagents: () => Subagent[];\n /** Tear down the internal subscriptions. */\n teardown: () => void;\n}\n\n/**\n * Build the per-slice derived stores from a `conversation$` source. Each slice is a `BehaviorSubject`\n * (replays the current snapshot to late subscribers) fed through `distinctUntilChanged`, so it emits\n * only when that slice structurally changes — unrelated high-frequency deltas are suppressed.\n */\nexport function createDerivedStores(conversation$: Observable<Conversation>): DerivedStores {\n const tasks$ = new BehaviorSubject<Task[]>([]);\n const subagents$ = new BehaviorSubject<Subagent[]>([]);\n const subscription = new Subscription();\n\n subscription.add(conversation$.pipe(map(deriveTasks), distinctUntilChanged(tasksEqual)).subscribe(tasks$));\n subscription.add(\n conversation$.pipe(map(deriveSubagents), distinctUntilChanged(subagentsEqual)).subscribe(subagents$),\n );\n\n return {\n tasks$: tasks$.asObservable(),\n subagents$: subagents$.asObservable(),\n getTasks: () => tasks$.value,\n getSubagents: () => subagents$.value,\n teardown: () => subscription.unsubscribe(),\n };\n}\n","import { LaunchedSandbox } from '../types';\n\n/**\n * Normalize a raw `/channel/metadata` `launchedSandboxes[]` snapshot into a stable live list (F-019 /\n * UC-032): dedup by `sandboxName` (metadata should not repeat, but a defensive dedup keeps the UI stable)\n * and sort by display label (`sandboxBlueprintName || sandboxName`) so a different backend ordering never\n * makes a downstream dropdown jump. metadata is the sole authority on \"who is live\" — this folds in no\n * SSE-derived guesses. Never mutates the input.\n */\nexport function reconcileLaunched(metadata: readonly LaunchedSandbox[]): LaunchedSandbox[] {\n const byName = new Map<string, LaunchedSandbox>();\n for (const sandbox of metadata) byName.set(sandbox.sandboxName, sandbox); // last write wins: same name → latest snapshot\n\n return [...byName.values()].sort((a, b) =>\n (a.sandboxBlueprintName || a.sandboxName).localeCompare(b.sandboxBlueprintName || b.sandboxName),\n );\n}\n","import { BehaviorSubject, combineLatest, distinctUntilChanged, map, Observable, Subscription } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ChannelConfig,\n ChannelRunState,\n ChannelStates,\n FetchSseOptions,\n FetchSsePayload,\n IAsgardServiceClient,\n LaunchedSandbox,\n MessageFeedbackReply,\n MessageFeedbackState,\n ObserverOrNext,\n RunKind,\n RunStatus,\n SandboxPhase,\n StopGenerationOptions,\n Subagent,\n SseResponse,\n Task,\n ToolCallConsentAnswer,\n} from '../types';\nimport { ChannelBusyError } from '../types/channel-busy-error';\nimport { ChannelAwaitingConsentError } from '../types/channel-awaiting-consent-error';\nimport { FetchSseAction, EventType } from '../constants/enum';\nimport Conversation from './conversation';\nimport { createDerivedStores, DerivedStores } from './derived-stores';\nimport { reconcileLaunched } from './launched-sandboxes';\n\n/** Nothing running, nothing stopping. */\nconst IDLE_RUN_STATUS: RunStatus = { kind: null, stopPhase: 'idle' };\n\n/** How long an accepted stop waits for the terminal event before offering force-stop (F-023 AC7). */\nexport const FORCE_STOP_TIMEOUT_MS = 10_000;\n\nfunction runStatusEqual(a: RunStatus, b: RunStatus): boolean {\n return a.kind === b.kind && a.stopPhase === b.stopPhase && a.requestId === b.requestId;\n}\n\nexport default class Channel {\n private client: IAsgardServiceClient;\n\n public customChannelId: string;\n public customMessageId?: string;\n // Join-time run state from `GET /channel/metadata` (F-023 AC9): decides whether a rejoin is tailing a\n // live run (`restore`) or replaying a finished transcript (`replay`).\n private joinRunState: ChannelRunState;\n\n private isConnecting$: BehaviorSubject<boolean>;\n private runStatusSubject: BehaviorSubject<RunStatus>;\n private conversation$: BehaviorSubject<Conversation>;\n private channelTitleSubject: BehaviorSubject<string | null>;\n private promptSuggestionSubject: BehaviorSubject<string | null>;\n private sandboxPhaseSubject: BehaviorSubject<SandboxPhase>;\n private launchedSandboxesSubject: BehaviorSubject<LaunchedSandbox[]>;\n // Sandboxes hinted live by an `asgard.sandbox.launch` frame but not yet confirmed by metadata (F-019).\n // Never merged into the live list directly — cleared once metadata confirms (or held until it does).\n private pendingLaunches: string[] = [];\n private derivedStores: DerivedStores;\n private statesObserver?: ObserverOrNext<ChannelStates>;\n private statesSubscription?: Subscription;\n\n /** Reactive Task Check List store (F-013): emits only when the list changes; replays the snapshot. */\n public readonly tasks$: Observable<Task[]>;\n /** Reactive Subagent list store (F-013): emits only when the list changes; replays the snapshot. */\n public readonly subagents$: Observable<Subagent[]>;\n /** Reactive channel title store (F-016): seeded from metadata, updated by `title.update`; replay-safe. */\n public readonly channelTitle$: Observable<string | null>;\n /**\n * Reactive next-turn suggestion store (F-028): fed by `asgard.prompt_suggestion`, cleared when the\n * prediction expires. Live-only — a rejoin replay carries no such event, so this legitimately stays\n * `null` after a reload. Never seeded: there is no metadata source for it.\n */\n public readonly promptSuggestion$: Observable<string | null>;\n /** Reactive sandbox cold-start phase store (F-018): per-slice, derived from the last sandbox event; replay-safe. */\n public readonly sandboxPhase$: Observable<SandboxPhase>;\n /** Reactive live-sandbox list store (F-019): authoritative from `/channel/metadata`, per-slice; replay-safe. */\n public readonly launchedSandboxes$: Observable<LaunchedSandbox[]>;\n /** Reactive run identity + stop lifecycle store (F-023): who holds the connection, and is a stop pending. */\n public readonly runStatus$: Observable<RunStatus>;\n private currentUserMessageId?: string;\n // The most-recently-sent user message id. Unlike currentUserMessageId (which\n // is cleared once a traceId is attached), this is kept across the SSE\n // lifecycle so RESPONSE_TOOL_CALL_CONSENT — fired after run.done — can echo\n // back the message id the bot is waiting on.\n private lastSentMessageId?: string;\n // The in-flight SSE run's subscription. Held so the connection can be aborted locally (unsubscribe →\n // create-sse-observable teardown → AbortController.abort()) on close, on channel switch, and on the\n // legacy stop fallback. Cleared on every terminal (complete / error).\n //\n // NOTE (F-023): a user-initiated stop no longer unsubscribes this. Runs execute in the background on\n // the server, so cutting the stream would only stop *watching* — the stop is requested through\n // `client.suspendChannel()` and declared by this same stream's terminal event.\n private currentRun?: Subscription;\n // Armed when a stop is accepted; fires after FORCE_STOP_TIMEOUT_MS to offer force-stop (F-023 AC7).\n // Cleared on terminal, on suspend failure, and in close() (§1.5).\n private forceStopTimer?: ReturnType<typeof setTimeout>;\n\n private constructor(config: ChannelConfig) {\n if (!config.client) {\n throw new Error('client must be required');\n }\n\n if (!config.customChannelId) {\n throw new Error('customChannelId must be required');\n }\n\n this.client = config.client;\n this.customChannelId = config.customChannelId;\n this.customMessageId = config.customMessageId;\n this.joinRunState = config.runState ?? 'IDLE';\n\n this.isConnecting$ = new BehaviorSubject(false);\n this.runStatusSubject = new BehaviorSubject<RunStatus>(IDLE_RUN_STATUS);\n this.conversation$ = new BehaviorSubject(config.conversation);\n this.channelTitleSubject = new BehaviorSubject<string | null>(config.channelTitle ?? null);\n this.promptSuggestionSubject = new BehaviorSubject<string | null>(null);\n this.sandboxPhaseSubject = new BehaviorSubject<SandboxPhase>('idle');\n this.launchedSandboxesSubject = new BehaviorSubject<LaunchedSandbox[]>(\n reconcileLaunched(config.launchedSandboxes ?? []),\n );\n this.derivedStores = createDerivedStores(this.conversation$);\n this.tasks$ = this.derivedStores.tasks$;\n this.subagents$ = this.derivedStores.subagents$;\n // Emit only when the title actually changes (ignore duplicate `title.update`s with the same value).\n this.channelTitle$ = this.channelTitleSubject.pipe(distinctUntilChanged());\n // Per-slice: the same suggestion arriving twice must not re-notify consumers (F-028).\n this.promptSuggestion$ = this.promptSuggestionSubject.pipe(distinctUntilChanged());\n // Per-slice: emit only when the phase actually changes, so unrelated high-frequency message\n // deltas never re-notify the HUD (UC-031, same performance rule as the F-013 derived stores).\n this.sandboxPhase$ = this.sandboxPhaseSubject.pipe(distinctUntilChanged());\n // Per-slice: only `applyLaunchedSandboxes` / `dropSandbox` push here (never the conversation stream),\n // so high-frequency message deltas never re-emit the live-sandbox list (UC-032 ALT2).\n this.launchedSandboxes$ = this.launchedSandboxesSubject.pipe(distinctUntilChanged());\n // Per-slice: `RunStatus` is a fresh object on every write, so compare by field — otherwise the\n // states observer would re-notify on every identical write during a run (F-023).\n this.runStatus$ = this.runStatusSubject.pipe(distinctUntilChanged(runStatusEqual));\n this.statesObserver = config.statesObserver;\n }\n\n /** Current Task Check List snapshot (F-013) — for framework-agnostic `getSnapshot()` bridging. */\n public getTasks(): Task[] {\n return this.derivedStores.getTasks();\n }\n\n /** Current Subagent list snapshot (F-013) — for framework-agnostic `getSnapshot()` bridging. */\n public getSubagents(): Subagent[] {\n return this.derivedStores.getSubagents();\n }\n\n /** Current channel title snapshot (F-016) — for framework-agnostic `getSnapshot()` bridging. */\n public getChannelTitle(): string | null {\n return this.channelTitleSubject.value;\n }\n\n /** Current next-turn suggestion snapshot (F-028) — for framework-agnostic `getSnapshot()` bridging. */\n public getPromptSuggestion(): string | null {\n return this.promptSuggestionSubject.value;\n }\n\n /**\n * Drop the current suggestion (F-028). Called when the prediction has expired: the user adopted it\n * (it is in the textarea now, and re-offering it would duplicate the text), or a send / a new run\n * made it stale. Losing focus is deliberately NOT one of those moments.\n */\n public clearPromptSuggestion(): void {\n this.promptSuggestionSubject.next(null);\n }\n\n /** Current sandbox phase snapshot (F-018) — for framework-agnostic `getSnapshot()` bridging. */\n public getSandboxPhase(): SandboxPhase {\n return this.sandboxPhaseSubject.value;\n }\n\n /** Current live-sandbox snapshot (F-019) — for framework-agnostic `getSnapshot()` bridging. */\n public getLaunchedSandboxes(): LaunchedSandbox[] {\n return this.launchedSandboxesSubject.value;\n }\n\n /** Current run identity + stop lifecycle snapshot (F-023) — for framework-agnostic `getSnapshot()` bridging. */\n public getRunStatus(): RunStatus {\n return this.runStatusSubject.value;\n }\n\n /** Names hinted by `sandbox.launch` but not yet confirmed live by metadata (F-019) — \"starting\" placeholders. */\n public getPendingLaunches(): string[] {\n return this.pendingLaunches;\n }\n\n /**\n * Authoritatively replace the live-sandbox list from a fresh `/channel/metadata` snapshot (F-019). This\n * is the only sanctioned way to change \"who is live\": it reconciles the list and clears any pending\n * launch whose name now appears (promoted to live). metadata (heartbeat-backed) is the sole authority.\n */\n public applyLaunchedSandboxes(list: readonly LaunchedSandbox[]): void {\n const next = reconcileLaunched(list);\n this.pendingLaunches = this.pendingLaunches.filter(name => !next.some(sandbox => sandbox.sandboxName === name));\n this.launchedSandboxesSubject.next(next);\n }\n\n /**\n * Optimistically drop one sandbox (F-019) — e.g. its fs calls keep failing or it is known to be\n * recycled. The next `/channel/metadata` refetch reconciles the authoritative truth.\n */\n public dropSandbox(sandboxName: string): void {\n const current = this.launchedSandboxesSubject.value;\n const next = current.filter(sandbox => sandbox.sandboxName !== sandboxName);\n if (next.length !== current.length) this.launchedSandboxesSubject.next(next);\n }\n\n /**\n * Record an `asgard.sandbox.launch` hint (F-019): the event is not trusted to add a live sandbox (it may\n * not be Ready / heartbeat-visible yet), so the name is held as pending and a metadata refetch is\n * scheduled. `applyLaunchedSandboxes` promotes it to live once metadata confirms.\n */\n public noteSandboxLaunch(sandboxName: string): void {\n if (!this.pendingLaunches.includes(sandboxName)) {\n this.pendingLaunches = [...this.pendingLaunches, sandboxName];\n }\n\n void this.refetchMetadata();\n }\n\n /**\n * Re-fetch `/channel/metadata` and authoritatively apply its `launchedSandboxes` (F-019). Called on a\n * launch hint, and by the react adapter on `visibilitychange` / polling. A client without metadata\n * support is a no-op.\n */\n public async refetchMetadata(): Promise<void> {\n if (!this.client.channelMetadata) return;\n\n const metadata = await this.client.channelMetadata(this.customChannelId);\n if (metadata) this.applyLaunchedSandboxes(metadata.launchedSandboxes);\n }\n\n /** Seed / override the channel title (F-016) — used by the join-restore metadata seed (F-015). */\n public setChannelTitle(title: string | null): void {\n this.channelTitleSubject.next(title);\n }\n\n public static create(config: ChannelConfig): Channel {\n const channel = new Channel(config);\n channel.subscribe();\n\n return channel;\n }\n\n /**\n * Open a channel with a fresh conversation (F-032): create it and dispatch a single `action=NONE`\n * opening turn, which the backend answers with the welcome run. Used for the mount-time opening of a\n * channel that does not exist yet (UC-025) — nothing is deleted, because there is nothing there.\n *\n * The run's kind stays `'reset'`: an opening turn is not a turn the user dispatched, so\n * stop-generation must not fire on it (F-023 AC8).\n */\n public static async open(\n config: ChannelConfig,\n payload?: Pick<FetchSsePayload, 'text' | 'payload'>,\n options?: FetchSseOptions,\n onChannelCreated?: (channel: Channel) => void,\n ): Promise<Channel> {\n const channel = new Channel(config);\n\n try {\n channel.subscribe();\n\n // Expose the channel before the opening run finishes. The backend can emit a tool_call.consent\n // *during* this run (before run.done), so a reply submitted while the modal is up must reach a\n // non-null channel — otherwise the consent answer is silently dropped.\n onChannelCreated?.(channel);\n\n await channel.openChannel(payload, options);\n\n return channel;\n } catch (error) {\n channel.close();\n\n throw error;\n }\n }\n\n /**\n * Clear an **existing** conversation and start over on the same id (F-032) — what the header's reset\n * button does. Two steps, in this order and never bundled:\n *\n * 1. `client.deleteChannel()` — the backend releases the run, transcript, blobs, consent allow-list,\n * Sandbox and Channel Home, and answers only once that teardown is done.\n * 2. {@link Channel.open} — a plain `action=NONE` opening turn on the now-empty id.\n *\n * This replaces the single `RESET_CHANNEL` turn, which bundled both into one request and therefore\n * could never carry attachments: blobs belong to the channel that was live when they were uploaded, so\n * the delete stripped them and the `blobIds` resolved to nothing without an error. A host that needs\n * \"clear, then send with attachments\" sequences it itself: `deleteChannel` → upload → `sendMessage`.\n *\n * **Nothing local changes until the delete succeeds** — no channel is constructed, so no state\n * observer fires. A failed delete therefore leaves the caller's current channel and conversation\n * exactly as they were, which is the point: the screen must never be cleared while the server still\n * holds the old conversation.\n */\n public static async reset(\n config: ChannelConfig,\n payload?: Pick<FetchSsePayload, 'text' | 'payload'>,\n options?: FetchSseOptions,\n onChannelCreated?: (channel: Channel) => void,\n ): Promise<Channel> {\n if (!config.client.deleteChannel) {\n // A hand-rolled IAsgardServiceClient that predates F-032. Refuse loudly rather than skipping the\n // delete (the screen would clear while the backend keeps the old conversation) or falling back to\n // the retired RESET_CHANNEL turn. `AsgardServiceClient` always has the method, so only a custom\n // client can land here.\n throw new Error(\n 'This client cannot reset a channel: IAsgardServiceClient.deleteChannel is not implemented. ' +\n 'Implement it (DELETE {base}/channel?custom_channel_id=…) or use AsgardServiceClient.',\n );\n }\n\n await config.client.deleteChannel(config.customChannelId);\n\n return Channel.open(config, payload, options, onChannelCreated);\n }\n\n /**\n * Join an **existing** channel without resetting it (F-015). Seeds the title from `config.channelTitle`\n * (the `GET /channel/metadata` value) at construction, then replays the server transcript via GET\n * `rejoinSse` and holds `isConnecting` until the run reaches a terminal. Never deletes and never\n * opens, so the channel's history / session / title are preserved — this is the fix for the mount-time\n * \"join an existing channel and wipe its history\" data-loss bug.\n */\n public static async restore(\n config: ChannelConfig,\n options?: FetchSseOptions,\n onChannelCreated?: (channel: Channel) => void,\n ): Promise<Channel> {\n const channel = new Channel(config);\n\n try {\n channel.subscribe();\n\n // Adopt the channel before the replay finishes — a RUNNING restore can stream a tool_call.consent\n // before its terminal, and a reply submitted then must reach a non-null channel (same rationale as\n // reset).\n onChannelCreated?.(channel);\n\n await channel.rejoinChannel(options);\n\n return channel;\n } catch (error) {\n channel.close();\n\n throw error;\n }\n }\n\n private subscribe(): void {\n this.statesSubscription = combineLatest([\n this.isConnecting$,\n this.conversation$,\n this.derivedStores.tasks$,\n this.derivedStores.subagents$,\n this.channelTitle$,\n this.promptSuggestion$,\n this.sandboxPhase$,\n this.launchedSandboxes$,\n this.runStatus$,\n ])\n .pipe(\n map(\n ([\n isConnecting,\n conversation,\n tasks,\n subagents,\n channelTitle,\n promptSuggestion,\n sandboxPhase,\n launchedSandboxes,\n runStatus,\n ]) => ({\n isConnecting,\n conversation,\n tasks,\n subagents,\n channelTitle,\n promptSuggestion,\n sandboxPhase,\n launchedSandboxes,\n runStatus,\n }),\n ),\n )\n .subscribe(this.statesObserver);\n }\n\n /**\n * Resolves payload by executing it if it's a function, otherwise returns as-is.\n */\n private resolvePayload(\n payload: Record<string, unknown> | (() => Record<string, unknown>) | undefined,\n ): Record<string, unknown> | undefined {\n if (typeof payload === 'function') {\n try {\n return payload();\n } catch (error) {\n throw new Error(\n `Failed to resolve payload function: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return payload;\n }\n\n /**\n * Advance the sandbox phase store from an incoming event's type (F-018). Only sandbox / run-boundary\n * events move it; every other event is a no-op, so `distinctUntilChanged` suppresses re-emission on\n * high-frequency message deltas.\n */\n private updateSandboxPhase(eventType: EventType): void {\n switch (eventType) {\n case EventType.SANDBOX_LAUNCH:\n this.sandboxPhaseSubject.next('launching');\n\n break;\n case EventType.SANDBOX_READY:\n this.sandboxPhaseSubject.next('ready');\n\n break;\n case EventType.INIT:\n case EventType.ERROR:\n this.sandboxPhaseSubject.next('idle');\n\n break;\n default:\n break;\n }\n }\n\n /**\n * The SSE run handlers shared by every run kind (POST send/reset and GET rejoin): fold each frame\n * through the conversation reducer, keep the title store in sync, attach the traceId to the pending\n * user bubble, and settle the run promise (releasing `isConnecting`) on completion / error.\n */\n private buildRunHandlers(\n options: FetchSseOptions | undefined,\n resolve: () => void,\n reject: (err: unknown) => void,\n ): FetchSseOptions {\n return {\n onSseStart: options?.onSseStart,\n onSseMessage: (response: SseResponse<EventType>): void => {\n options?.onSseMessage?.(response);\n\n // F-023 — remember which run this is so a stop can name it (`request_id`), stopping only this\n // run rather than whatever happens to be live when the request lands.\n this.captureRequestId(response.requestId);\n\n // F-016 — the channel title is run-level state, not a message; keep it out of the conversation\n // (it is ephemeral and must survive rejoin replays, which don't carry this event).\n if (response.eventType === EventType.CHANNEL_TITLE_UPDATE) {\n this.channelTitleSubject.next(\n (response as SseResponse<EventType.CHANNEL_TITLE_UPDATE>).fact.channelTitleUpdate.title,\n );\n }\n\n // F-028 — the next-turn suggestion is run-level state, not a message: ephemeral, live-only,\n // and kept out of the conversation. A new run makes the previous prediction stale (it was\n // about the turn that just ended), so `run.init` drops it — including on a rejoin replay,\n // which carries `run.init` but never a suggestion.\n if (response.eventType === EventType.PROMPT_SUGGESTION) {\n this.promptSuggestionSubject.next(\n (response as SseResponse<EventType.PROMPT_SUGGESTION>).fact.promptSuggestion.suggestion,\n );\n } else if (response.eventType === EventType.INIT) {\n this.clearPromptSuggestion();\n }\n\n // F-018 — sandbox cold-start phase, derived from the last sandbox event. Run-level (not a\n // conversation message); folds identically on live and on rejoin replay (replay-safe). Reset to\n // idle on run init (fresh run re-arms) and error (collapse); `done` is left to the react latch so\n // the ready-beat / fade-out can finish (happy path: `done` arrives after `ready`).\n this.updateSandboxPhase(response.eventType);\n\n // F-019 — a `sandbox.launch` frame is only a hint: record the name as pending and schedule a\n // metadata refetch (the authority on \"who is live\"). Never merge it into the live list directly.\n if (response.eventType === EventType.SANDBOX_LAUNCH) {\n this.noteSandboxLaunch((response as SseResponse<EventType.SANDBOX_LAUNCH>).fact.sandboxLaunch.sandboxName);\n }\n\n if (this.currentUserMessageId && response.traceId) {\n const messages = new Map(this.conversation$.value.messages);\n const userMessage = messages.get(this.currentUserMessageId);\n\n if (userMessage && userMessage.type === 'user') {\n messages.set(this.currentUserMessageId, {\n ...userMessage,\n traceId: response.traceId,\n });\n // Carry `pendingConsent` over — this rebuild bypasses the reducer (which preserves it on\n // every hop), so omitting it silently discards a consent prompt that arrived on an earlier,\n // traceId-less frame, stranding a run that is still waiting for the answer.\n this.conversation$.next(\n new Conversation({\n messages,\n pendingConsent: this.conversation$.value.pendingConsent,\n pendingFeedback: this.conversation$.value.pendingFeedback,\n }),\n );\n }\n\n this.currentUserMessageId = undefined;\n }\n\n this.conversation$.next(this.conversation$.value.onMessage(response));\n },\n onSseError: (err: unknown): void => {\n options?.onSseError?.(err);\n this.settleRun();\n reject(err);\n },\n onSseCompleted: (): void => {\n options?.onSseCompleted?.();\n this.settleRun();\n resolve();\n },\n };\n }\n\n /**\n * The terminal of a run, whichever way it ended. For a stop in flight this is the moment the backend\n * declares the run actually finished (F-023 AC3) — the same event a normal run ends with — so it is\n * the only place `stopping` is released back to \"waiting for input\".\n */\n private settleRun(): void {\n const wasStopping = this.runStatusSubject.value.stopPhase !== 'idle';\n\n this.clearForceStopTimer();\n this.isConnecting$.next(false);\n this.runStatusSubject.next(IDLE_RUN_STATUS);\n this.currentUserMessageId = undefined;\n this.currentRun = undefined;\n\n // F-020 AC10 / F-023 — a suspended turn is rolled back, so whatever was mid-flight gets no closing\n // frame of its own: a tool-call would spin as `running` forever and a thinking block would stay\n // highlighted as \"Thinking…\". Settle both rather than leaving them advertising activity that stopped.\n if (wasStopping) {\n this.conversation$.next(this.conversation$.value.settleInFlightMessages());\n }\n }\n\n /** Record the backend run id from the first frame that carries one; later frames must not overwrite it. */\n private captureRequestId(requestId: string | undefined): void {\n const current = this.runStatusSubject.value;\n\n if (!requestId || current.requestId || !current.kind) return;\n\n this.runStatusSubject.next({ ...current, requestId });\n }\n\n private clearForceStopTimer(): void {\n if (!this.forceStopTimer) return;\n\n clearTimeout(this.forceStopTimer);\n this.forceStopTimer = undefined;\n }\n\n private fetchSse(kind: RunKind, payload: FetchSsePayload, options?: FetchSseOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n this.isConnecting$.next(true);\n this.runStatusSubject.next({ kind, stopPhase: 'idle' });\n this.currentRun = this.client.fetchSse(payload, this.buildRunHandlers(options, resolve, reject));\n });\n }\n\n /**\n * Join-restore transport (F-015): replay the server transcript via GET `rejoinSse` (F-014) and, if a\n * run is still live, keep listening until its terminal — holding `isConnecting` the whole time so the\n * input stays gated (F-003). A client without GET-replay support settles immediately (nothing to\n * restore), so the input is released rather than stuck.\n */\n private rejoinChannel(options?: FetchSseOptions): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.client.rejoinSse) {\n resolve();\n\n return;\n }\n\n this.isConnecting$.next(true);\n // Never stoppable either way — a rejoin is not a turn the user just dispatched (F-023 AC8). But\n // the two cases must not look alike on screen (AC9 / UC-046): `restore` is tailing a run the\n // server says is still RUNNING, whereas `replay` is only loading a finished conversation and must\n // not show a run-in-progress indicator.\n this.runStatusSubject.next({\n kind: this.joinRunState === 'RUNNING' ? 'restore' : 'replay',\n stopPhase: 'idle',\n });\n this.currentRun = this.client.rejoinSse(this.customChannelId, this.buildRunHandlers(options, resolve, reject));\n });\n }\n\n /**\n * The opening turn (F-032): a plain `action=NONE` with the caller's text / payload (empty text when\n * they gave none). On a channel that does not exist the backend creates it and runs the welcome; on\n * one just emptied by `deleteChannel` it starts the new conversation.\n */\n private openChannel(payload?: Pick<FetchSsePayload, 'text' | 'payload'>, options?: FetchSseOptions): Promise<void> {\n return this.fetchSse(\n 'reset',\n {\n action: FetchSseAction.NONE,\n customChannelId: this.customChannelId,\n customMessageId: this.customMessageId,\n text: payload?.text || '',\n payload: this.resolvePayload(payload?.payload),\n },\n options,\n );\n }\n\n public sendMessage(\n payload: Pick<FetchSsePayload, 'customMessageId' | 'text' | 'payload' | 'blobIds'> & {\n filePreviewUrls?: string[];\n documentNames?: string[];\n },\n options?: FetchSseOptions,\n ): Promise<void> {\n // F-023 AC6 / UC-045 — a channel may only ever hold one run. Runs execute in the background on the\n // server, so dispatching a second would leave two of them writing to the same transcript. Refuse\n // *before* the optimistic user bubble is pushed, so a rejected send leaves no trace in the thread.\n //\n // A rejected promise, not a synchronous throw: this method's contract is `Promise<void>`, and\n // fire-and-forget callers (`sendMessage(...)` inside a DOM handler) must not have it explode\n // underneath them.\n const busyWith = this.runStatusSubject.value.kind;\n\n if (busyWith) return Promise.reject(new ChannelBusyError(busyWith));\n\n // #404 — the same rule for a case the run-kind check cannot see. A channel parked on a consent\n // prompt is paused on the server and only `RESPONSE_TOOL_CALL_CONSENT` resumes it; a plain turn\n // comes back rejected (\"use RespondToolCallConsent\"). The pause is invisible above because the\n // consent frame precedes the run terminal — by the time the prompt is on screen the run has already\n // settled and `kind` is undefined. Refuse before the optimistic bubble, same as the busy guard.\n const pendingConsent = this.conversation$.value.pendingConsent;\n\n if (pendingConsent) return Promise.reject(new ChannelAwaitingConsentError(pendingConsent.processId));\n\n // F-028 — the prediction was about what to say after the previous turn, so sending expires it\n // whether or not it was adopted. Cleared here rather than in the composer so programmatic sends\n // expire it too; after the guards above, so a refused send leaves the offer standing.\n this.clearPromptSuggestion();\n\n const text = payload.text.trim();\n const messageId = payload.customMessageId ?? uuidv4();\n\n this.currentUserMessageId = messageId;\n this.lastSentMessageId = messageId;\n\n this.conversation$.next(\n this.conversation$.value.pushMessage({\n type: 'user',\n messageId,\n text,\n blobIds: payload.blobIds,\n filePreviewUrls: payload.filePreviewUrls,\n documentNames: payload.documentNames,\n time: new Date(),\n }),\n );\n\n return this.fetchSse(\n 'user',\n {\n action: FetchSseAction.NONE,\n customChannelId: this.customChannelId,\n customMessageId: messageId,\n payload: this.resolvePayload(payload?.payload),\n text,\n blobIds: payload?.blobIds,\n },\n options,\n );\n }\n\n /**\n * Rate one assistant reply Good or Bad (F-033 / UC-055, UC-056, UC-059). Posts the verdict, and only\n * once the server has accepted it writes the rating into that reply's `feedback` — the SDK holds no\n * open stream between runs, so the live `asgard.message.feedback` echo of its own post would never\n * arrive; the next rejoin replays it from the transcript instead. A rejection leaves the conversation\n * untouched (no optimistic update, UC-059 Alt B), so the caller can show the error and let the user try\n * again with the same comment.\n *\n * Rating is **not** telling the agent: when the user also wants that, the caller sends an ordinary\n * message composed by `composeFeedbackMessage()` through `sendMessage` after this resolves (UC-057).\n */\n public async sendMessageFeedback(messageId: string, feedback: MessageFeedbackState): Promise<MessageFeedbackReply> {\n if (!this.client.sendMessageFeedback) {\n throw new Error(\n 'This client cannot rate a reply: IAsgardServiceClient.sendMessageFeedback is not implemented. ' +\n 'Implement it (POST {base}/message/feedback) or use AsgardServiceClient.',\n );\n }\n\n const reply = await this.client.sendMessageFeedback({\n customChannelId: this.customChannelId,\n messageId,\n verdict: feedback.verdict,\n comment: feedback.comment,\n });\n\n const comment = feedback.comment?.trim();\n this.conversation$.next(\n this.conversation$.value.applyFeedback(messageId, {\n verdict: feedback.verdict,\n ...(comment ? { comment } : {}),\n }),\n );\n\n return reply;\n }\n\n public replyToolCallConsents(\n toolCallConsents: ToolCallConsentAnswer[],\n options?: FetchSseOptions,\n payload?: FetchSsePayload['payload'],\n ): Promise<void> {\n // Cleared optimistically so the modal closes the moment the user answers, rather than lingering\n // while the reply is in flight. Kept so it can be put back if the reply never lands (#410).\n const answered = this.conversation$.value.pendingConsent;\n\n this.conversation$.next(this.conversation$.value.clearPendingConsent());\n\n // `user` — answering a consent prompt resumes the user's own turn, so it stays stoppable (F-023 AC8).\n return this.fetchSse(\n 'user',\n {\n action: FetchSseAction.RESPONSE_TOOL_CALL_CONSENT,\n customChannelId: this.customChannelId,\n customMessageId: this.lastSentMessageId ?? this.customMessageId,\n payload: this.resolvePayload(payload),\n text: '',\n toolCallConsents,\n },\n options,\n ).catch((error: unknown) => {\n // #410 — the server is still paused, so leaving the prompt cleared would disarm the send/nudge\n // guards and let the next turn hit the backend rejection they exist to prevent. Put it back: the\n // modal returns and the user can answer again.\n if (answered) {\n this.conversation$.next(this.conversation$.value.restorePendingConsent(answered));\n }\n\n throw error;\n });\n }\n\n /**\n * Nudge an idle / recycled sandbox back to life (F-021 AC4). Sends an `action=NUDGE` turn with empty\n * text — the backend suppresses `message.*` and writes no transcript, so nothing renders in the\n * conversation; the FE simply waits for the resulting `sandbox.launch`/`ready` frames (and a metadata\n * refetch) to refill `launchedSandboxes$`. An invisible turn, unlike `sendMessage`.\n *\n * Invisible, but still a real turn — so it needs `payload` exactly like the other three outbounds\n * (BUG-004). The backend rebuilds `prevPayload` from *this* turn's incoming payload and never carries\n * the previous turn's over, and the sandbox blueprint reads its subagents / source-set mounts /\n * working directory straight out of it. Omitting payload therefore wakes an empty sandbox rather than\n * the one the channel was working in, and every one of those expressions has a falsy fallback, so it\n * fails silently.\n *\n * @param payload Turn-level payload, resolved through the same path as `sendMessage` — pass a\n * function to compute it at send time. In `@asgard-js/react` this is filled in automatically from\n * `onBeforeSendMessage`.\n *\n * Rejects with `ChannelBusyError` when a run already holds the channel, and with\n * `ChannelAwaitingConsentError` while a consent prompt is pending — exactly like `sendMessage`.\n */\n public nudge(options?: FetchSseOptions, payload?: FetchSsePayload['payload']): Promise<void> {\n // F-023 AC6 / UC-045 — one run per channel. Invisible or not, a nudge is a turn, so it queues\n // behind whatever is running instead of displacing it. Without this the damage went past a\n // duplicate run: `fetchSse` replaces `currentRun` without unsubscribing the old one and stamps\n // `runStatus.kind` with `nudge`, and a stop control is only offered while that is `user` — so the\n // user's own turn quietly lost its stop button and could never be stopped again.\n const busyWith = this.runStatusSubject.value.kind;\n\n if (busyWith) return Promise.reject(new ChannelBusyError(busyWith));\n\n // #406 — a nudge is dispatched down the same `PostUserMessage` path as a plain turn (the backend\n // hardcodes `IsTrigger: false` there; `IsNudge` is a separate field), so a channel paused on a\n // consent prompt rejects it exactly like a message. Same guard as `sendMessage`, for the same\n // reason the busy check above cannot catch it: the consent frame precedes the run terminal.\n const pendingConsent = this.conversation$.value.pendingConsent;\n\n if (pendingConsent) return Promise.reject(new ChannelAwaitingConsentError(pendingConsent.processId));\n\n // `nudge` — invisible to the user, so it must never surface a stop control (F-023 AC8).\n return this.fetchSse(\n 'nudge',\n {\n action: FetchSseAction.NUDGE,\n customChannelId: this.customChannelId,\n customMessageId: this.lastSentMessageId ?? this.customMessageId,\n payload: this.resolvePayload(payload),\n text: '',\n },\n options,\n );\n }\n\n /**\n * User-initiated stop-generation (F-023).\n *\n * Runs execute in the **background on the server**, so aborting the local SSE connection would only\n * stop *watching*: the agent would keep running, keep spending tokens and keep writing the\n * transcript. Instead this asks the backend to suspend the run and **keeps the stream open**, because\n * the stop is declared by that stream's terminal event — the same event a normal run ends with.\n *\n * The call is therefore asynchronous in two stages:\n * 1. resolving here means the backend **accepted** the request, not that the run has stopped;\n * 2. `isConnecting` / `runStatus` only return to idle when the terminal event arrives (AC3).\n *\n * While waiting, `runStatus.stopPhase` is `stopping` and every send entrance must stay gated (AC5).\n * If the terminal event has not arrived within {@link FORCE_STOP_TIMEOUT_MS} the phase becomes\n * `force-stoppable`, and calling again with `{ force: true }` tells the backend to give up on the run\n * rather than let it wind down (AC7).\n *\n * No-ops (resolving) when nothing is running, when the run is not the user's own — an opening\n * welcome, a transcript replay or an invisible nudge must never be stopped (AC8) — or when a stop is\n * already pending and this is not a force.\n *\n * **Rejects** when the suspend request fails (network error, or a non-2xx that is not `404`). The\n * stop phase is rolled back to `idle` first, so the caller can retry and the UI can never be stuck in\n * `stopping` (AC4).\n *\n * A client that predates the suspend endpoint (a custom `IAsgardServiceClient`) falls back to the old\n * local-abort behavior, so existing integrations keep working.\n */\n public async stopGeneration(options?: StopGenerationOptions): Promise<void> {\n const status = this.runStatusSubject.value;\n\n if (!this.currentRun || status.kind !== 'user') return;\n\n // A second press while stopping does nothing; only an explicit force re-issues the request (AC2).\n if (status.stopPhase !== 'idle' && !options?.force) return;\n\n if (!this.client.suspendChannel) {\n this.abortConnection();\n\n return;\n }\n\n this.clearForceStopTimer();\n this.runStatusSubject.next({ ...status, stopPhase: 'stopping' });\n\n try {\n await this.client.suspendChannel(this.customChannelId, {\n requestId: status.requestId,\n force: options?.force,\n });\n } catch (error) {\n // AC4 — never strand the UI in `stopping`; hand the stop control back so the user can retry.\n this.clearForceStopTimer();\n this.runStatusSubject.next({ ...this.runStatusSubject.value, stopPhase: 'idle' });\n\n throw error;\n }\n\n // Accepted. The stream stays connected; `settleRun()` releases the input when the terminal arrives.\n this.armForceStopTimer();\n }\n\n /**\n * Escalate to `force-stoppable` once an accepted stop has waited too long for the terminal event\n * (F-023 AC7 / UC-044) — the escape hatch for an agent that never winds down. Re-armed on a force\n * retry, so a second timeout offers the same way out again.\n */\n private armForceStopTimer(): void {\n this.clearForceStopTimer();\n\n this.forceStopTimer = setTimeout(() => {\n this.forceStopTimer = undefined;\n\n const current = this.runStatusSubject.value;\n\n if (current.stopPhase !== 'stopping') return;\n\n this.runStatusSubject.next({ ...current, stopPhase: 'force-stoppable' });\n }, FORCE_STOP_TIMEOUT_MS);\n }\n\n /**\n * Cut the local SSE connection without telling the backend. This is *not* stop-generation (see\n * {@link stopGeneration}) — the server-side run keeps going. Used when there is nothing to stop\n * remotely: a client without suspend support, and channel teardown.\n *\n * The deliberate abort must never be read as a transport failure — `create-sse-observable` marks the\n * stream disposed so no reconnect is attempted (F-023 AC10).\n */\n private abortConnection(): void {\n if (!this.currentRun) return;\n\n this.currentRun.unsubscribe();\n this.clearForceStopTimer();\n this.currentRun = undefined;\n this.isConnecting$.next(false);\n this.runStatusSubject.next(IDLE_RUN_STATUS);\n this.currentUserMessageId = undefined;\n // F-020 AC10: settle whatever is still in flight — no closing frame will arrive now that the run is\n // aborted, so a tool-call must not linger as `running` nor a thinking block as \"Thinking…\".\n this.conversation$.next(this.conversation$.value.settleInFlightMessages());\n }\n\n public close(): void {\n this.currentRun?.unsubscribe();\n this.currentRun = undefined;\n this.clearForceStopTimer();\n this.isConnecting$.complete();\n this.runStatusSubject.complete();\n this.conversation$.complete();\n this.channelTitleSubject.complete();\n this.sandboxPhaseSubject.complete();\n this.launchedSandboxesSubject.complete();\n this.derivedStores.teardown();\n this.statesSubscription?.unsubscribe();\n }\n}\n","import { FeedbackVerdict } from '../types';\n\n/**\n * The opening line of the optional follow-up a client sends into the conversation when the user asks\n * to \"send to AI as well\" (F-033 / UC-057). **Platform contract, byte for byte**: asgard-core's system\n * prompt (`ResponseFeedbackNote`) recognises exactly these strings and teaches the agent to treat the\n * message as an interlude about its previous reply — acknowledge briefly, adjust if the verdict was\n * Bad, then continue the conversation. Mirrors asgard-core `ResponseFeedbackPrefixGood/Bad` and\n * asgard-sdk-go's constants of the same name.\n */\nexport const RESPONSE_FEEDBACK_PREFIX: Readonly<Record<FeedbackVerdict, string>> = {\n GOOD: '[Response Feedback: Good]',\n BAD: '[Response Feedback: Bad]',\n};\n\n/**\n * The backend's cap on a feedback comment (F-033): 8 KiB of **UTF-8**, not 8 192 characters. A CJK\n * character is three bytes, so a length check in characters would let a comment through that the server\n * then rejects with `400`. Measure with {@link feedbackCommentByteLength}.\n */\nexport const FEEDBACK_COMMENT_MAX_BYTES = 8 * 1024;\n\n/** UTF-8 byte length of a comment — the unit the backend's 8 KiB cap is measured in. */\nexport function feedbackCommentByteLength(comment: string): number {\n return new TextEncoder().encode(comment).length;\n}\n\n/**\n * Compose the follow-up message for \"send to AI as well\" (F-033 / UC-057): the verdict's prefix, then —\n * only when the user wrote something — a blank line and the comment verbatim (trimmed). This is an\n * ordinary message: send it through the normal `sendMessage` path, **after** the structured verdict has\n * been posted and only if that succeeded. Rating and telling the agent are two separate acts.\n */\nexport function composeFeedbackMessage(verdict: FeedbackVerdict, comment?: string): string {\n const prefix = RESPONSE_FEEDBACK_PREFIX[verdict];\n const body = comment?.trim() ?? '';\n\n return body ? `${prefix}\\n\\n${body}` : prefix;\n}\n","// F-020 / F-034 — the typed intent a `sandbox://` custom URI resolves to. The host runs the side effect from this\n// (open-browser → one-time browser URL; open-file → File Explorer preview; open-folder → expand that directory on\n// the tree); it is never a browsable URL.\n//\n// `open-file` and `open-folder` are two separate actions rather than one action with a flag, because their\n// destinations are not interchangeable: a file goes into the viewer (read + watch), a folder only unfolds the tree.\n// The backend's fs API refuses both calls for a directory (`fs/file` → 500 `path is a directory`, `fs/watch` → a\n// dead connection), so a file card pointing at a directory cannot succeed — which is exactly what an agent holding\n// only `open_sandbox_file` used to do after unzipping an archive.\nexport type SandboxUriIntent =\n | { kind: 'open-browser'; sandboxName: string }\n | { kind: 'open-file'; sandboxName: string; absolutePath: string }\n | { kind: 'open-folder'; sandboxName: string; absolutePath: string };\n\n/** The actions that carry an `absolute_path` — parsed by one shared rule so the two can never drift apart. */\nconst PATH_ACTIONS = ['open-file', 'open-folder'] as const;\n\ntype PathAction = (typeof PATH_ACTIONS)[number];\n\nfunction isPathAction(action: string): action is PathAction {\n return (PATH_ACTIONS as readonly string[]).includes(action);\n}\n\n/**\n * Parse `sandbox://<name>/<action>?<query>` into a typed {@link SandboxUriIntent} (F-020 / F-034, UC-036).\n * Returns `null` for an unknown action, a missing `absolute_path`, or a non-`sandbox://` / malformed URI —\n * the host must then treat it as a plain card and never `window.open()` the raw scheme.\n *\n * A hand-written regex (not `new URL()`) is used deliberately: absolute paths carry many `/`, and a\n * non-special scheme's host casing is unreliable under the WHATWG URL parser; the query is still handed to\n * `URLSearchParams` (which decodes).\n */\nexport function resolveSandboxUri(uri: string): SandboxUriIntent | null {\n const match = /^sandbox:\\/\\/([^/]+)\\/([^?#]+)(?:\\?([^#]*))?/.exec(uri.trim());\n if (!match) return null;\n\n const sandboxName = decodeURIComponent(match[1]);\n const action = match[2];\n const params = new URLSearchParams(match[3] ?? '');\n\n if (action === 'open-browser') return { kind: 'open-browser', sandboxName };\n\n if (isPathAction(action)) {\n const absolutePath = params.get('absolute_path'); // URLSearchParams already decodes\n if (!absolutePath) return null;\n\n return { kind: action, sandboxName, absolutePath };\n }\n\n return null; // unknown action: do not guess, hand back to the host\n}\n","// F-035 — X11 keysym conversion and wheel normalization for the sandbox browser (spec §7.2 / §7.3 / §7.6).\n//\n// Everything here is pure arithmetic over numbers and plain objects, which is why it sits in core rather\n// than in the panel: an iOS / Android client needs exactly the same table and the same three rules.\n//\n// The reason this is its own module rather than a handful of inline constants: every mistake in it is\n// **silent**. A wrong keysym does not raise anything — the remote just does nothing, or types something\n// else, and there is no way to work backwards from that symptom. The values below are not derived from\n// documentation; they were measured against a real Neko container.\n\n/**\n * X11 keysyms for the keys that have no arithmetic rule — function keys, navigation, modifiers.\n *\n * Printable characters are **not** in here; they follow the two rules in `charToKeysym`. F5 and F12 are\n * listed because driving a remote browser genuinely uses them.\n */\nexport const KEYSYM: Readonly<Record<string, number>> = {\n Backspace: 0xff08,\n Tab: 0xff09,\n Enter: 0xff0d,\n Escape: 0xff1b,\n Delete: 0xffff,\n Home: 0xff50,\n ArrowLeft: 0xff51,\n ArrowUp: 0xff52,\n ArrowRight: 0xff53,\n ArrowDown: 0xff54,\n PageUp: 0xff55,\n PageDown: 0xff56,\n End: 0xff57,\n Insert: 0xff63,\n F1: 0xffbe,\n F2: 0xffbf,\n F3: 0xffc0,\n F4: 0xffc1,\n F5: 0xffc2,\n F6: 0xffc3,\n F7: 0xffc4,\n F8: 0xffc5,\n F9: 0xffc6,\n F10: 0xffc7,\n F11: 0xffc8,\n F12: 0xffc9,\n Shift: 0xffe1,\n Control: 0xffe3,\n CapsLock: 0xffe5,\n Alt: 0xffe9,\n Meta: 0xffeb,\n ContextMenu: 0xff67,\n ' ': 0x0020,\n} as const;\n\n/** The modifier keysyms the macOS remap reads and writes. Named so the mapping below is legible. */\nexport const XK = {\n ISO_Level3_Shift: 0xfe03,\n Shift_L: 0xffe1,\n Mode_switch: 0xff7e,\n Control_L: 0xffe3,\n Meta_L: 0xffe7,\n Alt_L: 0xffe9,\n Alt_R: 0xffea,\n Super_L: 0xffeb,\n Super_R: 0xffec,\n} as const;\n\n/** Unicode keysyms start here: a code point above 0xFF is offset into this block. */\nconst UNICODE_KEYSYM_OFFSET = 0x01000000;\n\n/**\n * One character → one keysym. Two rules, no table:\n *\n * 1. At or below `0xFF`, the keysym *is* the code point (ASCII and Latin-1 line up by design).\n * 2. Above it, `codePoint | 0x01000000`.\n *\n * Rule 2 is why **the remote needs no input method installed**: its `XKey()` hands an unknown keysym to\n * `XkbAddKeyKeysym`, which allocates an empty keycode for it on the spot. Whether the character exists in\n * the remote keyboard layout is simply not a question that gets asked.\n */\nexport function charToKeysym(character: string): number {\n const codePoint = character.codePointAt(0) ?? 0;\n\n return codePoint > 0xff ? codePoint | UNICODE_KEYSYM_OFFSET : codePoint;\n}\n\n/**\n * A `KeyboardEvent.key` value → keysym, or `null` when there is no answer.\n *\n * Returning `null` rather than a fallback is deliberate: a guessed keysym is indistinguishable from a\n * correct one until the remote does the wrong thing. Callers should surface the unmapped key (the lab page\n * lists them) instead of sending something plausible.\n */\nexport function keyToKeysym(key: string): number | null {\n if (key in KEYSYM) return KEYSYM[key];\n\n // `key.length === 1` is a UTF-16 unit test, so it deliberately excludes astral characters; those arrive\n // through the IME text path, not as a single `keydown`.\n if (key.length === 1) return charToKeysym(key);\n\n return null;\n}\n\n/**\n * Whether a keysym denotes something that turns into text.\n *\n * The distinction drives routing, not display: printable characters must travel the IME text path (it is\n * the only one that can handle composition), while the keysym path carries modifiers and function keys.\n */\nexport function isPrintableKeysym(keysym: number): boolean {\n return (keysym >= 0x20 && keysym <= 0x7e) || keysym >= UNICODE_KEYSYM_OFFSET;\n}\n\n/** Whether this platform's keyboard needs the macOS modifier remap. Read lazily so core stays SSR-safe. */\nfunction isMacOSKeyboard(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n // `navigator.platform` is deprecated but remains the only reliable signal here: `userAgentData.platform`\n // is not available in Safari or Firefox, which is exactly where this has to be right.\n const platform = navigator.platform || '';\n\n return /(Mac|iPhone|iPod|iPad)/i.test(platform);\n}\n\n/**\n * Remap a modifier keysym for the remote's X11 expectations. Identity on every non-macOS platform.\n *\n * The one that matters is **⌘ (`Meta_L`) → `Control_L`**: without it, ⌘A and ⌘C do nothing at all on the\n * remote, because the Chromium over there is waiting for Ctrl. The full table is copied from the upstream\n * neko client, which in turn credits noVNC / RealVNC / TigerVNC — it is what this class of client does, not\n * a preference.\n */\nexport function mapModifierKeysym(keysym: number, macOS: boolean = isMacOSKeyboard()): number {\n if (!macOS) return keysym;\n\n switch (keysym) {\n case XK.Meta_L:\n return XK.Control_L;\n case XK.Super_L:\n return XK.Alt_L;\n case XK.Super_R:\n return XK.Super_L;\n case XK.Alt_L:\n return XK.Mode_switch;\n case XK.Alt_R:\n return XK.ISO_Level3_Shift;\n default:\n return keysym;\n }\n}\n\n/**\n * Firefox reports the wheel in lines (`deltaMode === 1`) where Chrome reports pixels. The same flick is\n * `100` in one and `3` in the other — a factor of thirty. 19 px per line is the upstream neko value.\n */\nconst WHEEL_LINE_HEIGHT = 19;\n\n/**\n * Ceiling on how many X11 scroll clicks one wheel event may become.\n *\n * **Not a sensitivity tuning knob.** The server loops `for (i < abs(delta))` and emits one XTest event per\n * iteration, so forwarding Chrome's `deltaY = 100` verbatim tells the remote to scroll one hundred times.\n * 10 is the upstream default.\n */\nexport const WHEEL_MAX = 10;\n\n/** Upstream's wheel throttle window, in milliseconds. Exported so the panel throttles to the same figure. */\nexport const WHEEL_THROTTLE_MS = 100;\n\n/** The parts of a `WheelEvent` this conversion needs. Structural, so core never names a DOM type. */\nexport interface WheelDelta {\n deltaX: number;\n deltaY: number;\n /** 0 = pixels, 1 = lines, 2 = pages. */\n deltaMode: number;\n}\n\n/**\n * Browser wheel deltas → remote scroll deltas.\n *\n * **The sign flips.** A browser's `deltaY > 0` means \"content moves down\"; X11's positive direction is\n * button 4, which is *up*. The two conventions are opposites. Upstream neko exposes this as a\n * `scroll_invert` *setting*, which makes it look like taste — but its default is `true`, i.e. everybody is\n * running the inverted value, because the un-inverted one is simply wrong.\n */\nexport function normalizeWheel(event: WheelDelta): { x: number; y: number } {\n const scale = event.deltaMode === 0 ? 1 : WHEEL_LINE_HEIGHT;\n // `|| 0` collapses the `-0` that negating a zero delta produces. It makes no difference on the wire\n // (JSON renders both as `0`), but it keeps the output canonical so equality checks mean what they look like.\n const clamp = (value: number): number => Math.max(-WHEEL_MAX, Math.min(WHEEL_MAX, -value * scale)) || 0;\n\n return { x: clamp(event.deltaX), y: clamp(event.deltaY) };\n}\n","// F-035 — the Neko protocol client (spec §5 / §6 / §7). Framework-agnostic: one WebSocket, one\n// RTCPeerConnection, one set of X11 input messages. Nothing here touches the DOM.\n//\n// The protocol has three properties that contradict what a WebRTC example would lead you to write, and all\n// three fail silently:\n//\n// 1. **The server is the offerer.** We receive `signal/provide` and answer it. Most examples are the\n// other way round.\n// 2. **`signal/candidate` arrives before `signal/provide`.** Candidates that show up before the peer\n// connection exists must be buffered and flushed after `setRemoteDescription`. This is not an\n// optimization — drop them and the connection never establishes, with no error anywhere.\n// 3. **A refused `control/request` produces no reply.** The server writes its own log and says nothing\n// to us. So the caller has to time out on its own, and must never send a control message it does not\n// already believe it is entitled to send — every one of those is rejected and floods the server log.\n//\n// Reference: the prototype's lab transport, asgard-core `dev/webrtc-probe/client.html`, and neko upstream\n// `server/pkg/types/event/events.go`.\nimport type {\n BrowserHost,\n RemoteKeyEvent,\n RemotePointerEvent,\n SandboxBrowserSession,\n SandboxBrowserSessionCredentials,\n SandboxBrowserTransport,\n SandboxBrowserTransportHandlers,\n} from '../types/sandbox-browser';\nimport { charToKeysym, XK } from './keysym';\n\n/**\n * Uppercase ASCII letters are the one class of character the text path cannot send as a bare keysym.\n *\n * Measured against a real container: `A` arrives as `a`. `XKeysymToKeycode(XK_A)` finds the *same* keycode\n * as `a` — `A` is that key's shifted level — and the server presses it without asserting Shift. Shifted\n * symbols (`!`, `@`, `+`) are unaffected: no existing keycode produces them at level 1, so the server\n * allocates a fresh mapping and they come through exactly. CJK is unaffected for the same reason.\n *\n * So the remedy is narrow and does not need a keyboard-layout model: state the modifier for A–Z.\n */\nfunction needsShift(keysym: number): boolean {\n return keysym >= 0x41 && keysym <= 0x5a;\n}\n\n/** How often to tell the server we are still here. Upstream's interval. */\nconst HEARTBEAT_INTERVAL_MS = 10_000;\n\n/** How long to wait for the socket to open before giving up. */\nconst OPEN_TIMEOUT_MS = 8_000;\n\n/**\n * Cursor position opcode on the binary data channel\n * (neko `server/internal/webrtc/payload/send.go`).\n */\nconst OP_CURSOR_POSITION = 0x01;\n\n/** `[event:u8][length:u16][X:u16][Y:u16]`, big-endian — the length field counts the header, so 7. */\nconst CURSOR_FRAME_BYTES = 7;\n\n/** Volume-only exclusion: `control/move` would drown out every other line in a diagnostic log. */\nconst WIRE_LOG_EXCLUDED = new Set(['control/move']);\n\n/** One `{event, payload}` frame as it travels the socket. */\ninterface NekoMessage {\n event: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * Decode one data-channel frame into a cursor position, or `null` if it is not one.\n *\n * Exported for its own unit test: the frame layout is three big-endian reads at fixed offsets, and getting\n * one offset wrong puts the remote cursor somewhere plausible but wrong — which looks like a rendering bug,\n * not a decoding one.\n */\nexport function decodeCursorFrame(data: ArrayBuffer): { x: number; y: number } | null {\n if (data.byteLength < CURSOR_FRAME_BYTES) return null;\n\n const view = new DataView(data);\n if (view.getUint8(0) !== OP_CURSOR_POSITION) return null;\n\n return { x: view.getUint16(3), y: view.getUint16(5) };\n}\n\n/** How the transport obtains `{ wsUrl, token }`. Injected so the lab can swap in a direct Neko login. */\nexport type SandboxBrowserCredentialSource = (sandboxName: string) => Promise<SandboxBrowserSessionCredentials>;\n\nexport interface SandboxBrowserTransportOptions {\n /** Mints connection credentials — normally `client.createSandboxBrowserSession.bind(client)`. */\n createSession: SandboxBrowserCredentialSource;\n /** Display name announced in `signal/answer`. Cosmetic; shows up in Neko's member list. */\n displayName?: string;\n}\n\n/**\n * Build a transport over the Neko protocol.\n *\n * Credentials are fetched per `connect()` call rather than cached, which is what makes reconnection\n * correct: the token has no TTL but lives in the server's memory, so a pod restart invalidates it, and\n * retrying with the old one fails in a way that looks like a network problem (spec §7.10).\n */\nexport function createSandboxBrowserTransport(options: SandboxBrowserTransportOptions): SandboxBrowserTransport {\n return {\n async connect(sandboxName: string, handlers: SandboxBrowserTransportHandlers): Promise<SandboxBrowserSession> {\n handlers.onStatus('connecting');\n\n const { wsUrl, token } = await options.createSession(sandboxName);\n\n const separator = wsUrl.includes('?') ? '&' : '?';\n const socket = new WebSocket(`${wsUrl}${separator}token=${encodeURIComponent(token)}`);\n\n let peer: RTCPeerConnection | null = null;\n let sessionId: string | null = null;\n let host: BrowserHost = 'none';\n let heartbeat: ReturnType<typeof setInterval> | undefined;\n let closed = false;\n /** Id of the stream already handed to the caller — `ontrack` fires per track, not per stream. */\n let announcedStreamId: string | null = null;\n\n /** Candidates that arrived before the peer connection existed (see the header, point 2). */\n const pendingCandidates: RTCIceCandidateInit[] = [];\n\n const send = (event: string, payload?: Record<string, unknown>): void => {\n if (socket.readyState !== WebSocket.OPEN) return;\n\n socket.send(JSON.stringify({ event, payload }));\n if (!WIRE_LOG_EXCLUDED.has(event)) handlers.onWire?.('send', event, payload);\n };\n\n /**\n * Control-gated send. Spec §6: without control every one of these is refused *and* logged by the\n * server, so the gate belongs here rather than only in the UI — a panel bug should not be able to\n * flood somebody else's log.\n */\n const sendControlled = (event: string, payload?: Record<string, unknown>): void => {\n if (host !== 'me') return;\n\n send(event, payload);\n };\n\n const setHost = (next: BrowserHost): void => {\n if (host === next) return;\n\n host = next;\n handlers.onHostChange(next);\n };\n\n try {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error('Sandbox browser WebSocket connection timed out.')),\n OPEN_TIMEOUT_MS,\n );\n socket.onopen = (): void => {\n clearTimeout(timer);\n resolve();\n };\n\n socket.onerror = (): void => {\n clearTimeout(timer);\n reject(new Error('Sandbox browser WebSocket failed to connect.'));\n };\n });\n } catch (error) {\n // Close what we opened before giving up. `connect()` rejecting hands the caller no session, so\n // this socket has no other owner — left alone it stays pending, or connects moments later and\n // lives for the rest of the page, and the retry path stacks another one on top every attempt.\n closed = true;\n socket.close();\n\n throw error;\n }\n\n socket.onclose = (event: CloseEvent): void => {\n // A close we asked for is not a failure. Without this guard, every teardown reports an error and\n // the panel offers to reconnect to something the caller deliberately ended.\n if (closed) return;\n\n handlers.onStatus('error', `Sandbox browser connection closed (code ${event.code}).`);\n handlers.onWire?.('recv', 'ws/close', { code: event.code });\n };\n\n const handleProvide = async (payload: Record<string, unknown>): Promise<void> => {\n const connection = new RTCPeerConnection({\n // Use the server's ICE configuration verbatim. The platform injects the pod's TURN URLs and\n // time-limited credentials, and they arrive here untouched — the client never needs to know how\n // the media gateway is deployed, and must not carry its own.\n iceServers: (payload.iceservers as RTCIceServer[] | undefined) ?? [],\n });\n peer = connection;\n\n connection.onicecandidate = (event: RTCPeerConnectionIceEvent): void => {\n if (event.candidate) send('signal/candidate', event.candidate.toJSON() as Record<string, unknown>);\n };\n\n connection.oniceconnectionstatechange = (): void => {\n handlers.onWire?.('recv', 'ice/state', connection.iceConnectionState);\n if (connection.iceConnectionState === 'failed') {\n handlers.onStatus('error', 'ICE connection failed.');\n }\n };\n\n connection.ontrack = (event: RTCTrackEvent): void => {\n const [stream] = event.streams;\n if (!stream) return;\n\n // `ontrack` fires **once per track**, and the offer carries both audio and video — measured\n // against a real container, where this ran twice for one stream. Reporting twice would have the\n // panel reassign `srcObject` to a stream it is already playing, which restarts playback. Only a\n // genuinely different stream is worth announcing.\n if (announcedStreamId === stream.id) return;\n\n announcedStreamId = stream.id;\n\n handlers.onStream(stream);\n handlers.onStatus('live');\n };\n\n connection.ondatachannel = (event: RTCDataChannelEvent): void => {\n const channel = event.channel;\n channel.binaryType = 'arraybuffer';\n channel.onmessage = (message: MessageEvent): void => {\n if (!(message.data instanceof ArrayBuffer)) return;\n\n const position = decodeCursorFrame(message.data);\n if (position) handlers.onRemoteCursor?.(position);\n };\n };\n\n await connection.setRemoteDescription({ type: 'offer', sdp: payload.sdp as string });\n\n // Flush only now: addIceCandidate before setRemoteDescription throws.\n for (const candidate of pendingCandidates.splice(0)) {\n await connection.addIceCandidate(candidate).catch(() => undefined);\n }\n\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n send('signal/answer', { sdp: answer.sdp, displayname: options.displayName ?? 'asgard-js-sdk' });\n };\n\n socket.onmessage = (event: MessageEvent): void => {\n let message: NekoMessage;\n try {\n message = JSON.parse(String(event.data)) as NekoMessage;\n } catch {\n return; // A frame we cannot parse is not a frame we can act on.\n }\n\n const payload = message.payload ?? {};\n if (message.event !== 'signal/candidate') handlers.onWire?.('recv', message.event, payload);\n\n switch (message.event) {\n case 'system/init': {\n sessionId = (payload.session_id as string | undefined) ?? null;\n // `system/init` already states who holds control, so the initial value comes from here rather\n // than waiting for a `control/host` that may not arrive until somebody changes it.\n const initialHost = (payload.control_host as Record<string, unknown> | undefined) ?? undefined;\n const initialHostId = (initialHost?.id as string | undefined) ?? undefined;\n if (initialHostId !== undefined) {\n setHost(!initialHostId ? 'none' : initialHostId === sessionId ? 'me' : 'agent');\n }\n\n return;\n }\n\n case 'control/host': {\n const hostId = (payload.host_id as string | undefined) ?? null;\n setHost(!hostId ? 'none' : hostId === sessionId ? 'me' : 'agent');\n\n return;\n }\n\n case 'clipboard/updated': {\n handlers.onClipboardChange?.((payload.text as string | undefined) ?? '');\n\n return;\n }\n\n case 'signal/provide':\n case 'signal/offer': {\n // The server can renegotiate on its own, so `signal/offer` runs the same path.\n void handleProvide(payload).catch((error: unknown) => {\n handlers.onStatus('error', error instanceof Error ? error.message : String(error));\n });\n\n return;\n }\n\n case 'signal/candidate': {\n const candidate = payload as RTCIceCandidateInit;\n if (peer?.remoteDescription) void peer.addIceCandidate(candidate).catch(() => undefined);\n else pendingCandidates.push(candidate);\n\n return;\n }\n\n default:\n return;\n }\n };\n\n send('signal/request', { video: {}, audio: {} });\n heartbeat = setInterval(() => send('client/heartbeat', {}), HEARTBEAT_INTERVAL_MS);\n\n return {\n requestControl(): void {\n // Not control-gated: this is the message you send *because* you do not have control.\n send('control/request', {});\n },\n releaseControl(): void {\n sendControlled('control/release', {});\n },\n sendPointer(event: RemotePointerEvent): void {\n const x = Math.round(event.x);\n const y = Math.round(event.y);\n\n if (event.type === 'move') {\n sendControlled('control/move', { x, y });\n\n return;\n }\n\n if (event.type === 'scroll') {\n sendControlled('control/scroll', {\n delta_x: Math.round(event.deltaX ?? 0),\n delta_y: Math.round(event.deltaY ?? 0),\n control_key: false,\n });\n\n return;\n }\n\n sendControlled(event.type === 'down' ? 'control/buttondown' : 'control/buttonup', {\n x,\n y,\n code: event.button ?? 1,\n });\n },\n sendKey(event: RemoteKeyEvent): void {\n if (event.type === 'text') {\n // `for...of` iterates code points, so an astral character stays one keysym instead of becoming\n // two meaningless surrogate halves.\n for (const character of event.text ?? '') {\n const keysym = charToKeysym(character);\n const shift = needsShift(keysym);\n\n if (shift) sendControlled('control/keydown', { keysym: XK.Shift_L });\n\n sendControlled('control/keydown', { keysym });\n sendControlled('control/keyup', { keysym });\n if (shift) sendControlled('control/keyup', { keysym: XK.Shift_L });\n }\n\n return;\n }\n\n // The keysym is the caller's: turning a KeyboardEvent into one is the panel's job (see the\n // module header of `types/sandbox-browser.ts`).\n if (typeof event.keysym !== 'number') return;\n\n sendControlled(event.type === 'down' ? 'control/keydown' : 'control/keyup', { keysym: event.keysym });\n },\n setClipboard(text: string): void {\n // The server requires both `CanAccessClipboard` and that the caller is the host; failing either\n // is silent, so the gate matters more here than it looks.\n sendControlled('clipboard/set', { text });\n },\n paste(text: string): void {\n sendControlled('control/paste', { text });\n },\n close(): void {\n closed = true;\n if (heartbeat) clearInterval(heartbeat);\n\n heartbeat = undefined;\n peer?.close();\n peer = null;\n socket.close();\n },\n };\n },\n };\n}\n"],"names":["HttpError","status","statusText","body","isHttpError","error","ChannelBusyError","runKind","isChannelBusyError","ChannelAwaitingConsentError","processId","isChannelAwaitingConsentError","FetchSseAction","EventType","ToolCallConsentResult","MessageTemplateType","getBytes","stream","onChunk","reader","result","getLines","onLine","buffer","position","fieldLength","discardTrailingNewline","arr","concat","bufLength","lineStart","lineEnd","getMessages","onId","onRetry","onMessage","message","newMessage","decoder","line","field","valueOffset","value","retry","a","b","res","__rest","s","e","t","p","i","EventStreamContentType","DefaultRetryInterval","LastEventId","fetchEventSource","input","_a","inputSignal","inputHeaders","inputOnOpen","onmessage","onclose","onerror","openWhenHidden","inputFetch","rest","resolve","reject","headers","curRequestController","onVisibilityChange","create","retryInterval","retryTimer","dispose","fetch","onopen","defaultOnOpen","response","id","err","interval","innerErr","contentType","extendStatics","d","__extends","__","__awaiter","thisArg","_arguments","P","generator","adopt","fulfilled","step","rejected","__generator","_","f","y","g","verb","n","v","op","__values","o","m","__read","ar","__spreadArray","to","from","pack","l","__await","__asyncGenerator","q","awaitReturn","resume","settle","r","fulfill","__asyncValues","isFunction","createErrorClass","createImpl","_super","instance","ctorFunc","UnsubscriptionError","errors","arrRemove","item","index","Subscription","initialTeardown","e_1","e_2","_b","_parentage","_parentage_1","_parentage_1_1","parent_1","e_1_1","initialFinalizer","_finalizers","_finalizers_1","_finalizers_1_1","finalizer","execFinalizer","e_2_1","teardown","parent","empty","EMPTY_SUBSCRIPTION","isSubscription","config","timeoutProvider","handler","timeout","args","_i","handle","reportUnhandledError","noop","errorContext","cb","Subscriber","destination","_this","EMPTY_OBSERVER","next","complete","SafeSubscriber","ConsumerObserver","partialObserver","handleUnhandledError","observerOrNext","defaultErrorHandler","observable","identity","x","pipeFromArray","fns","prev","fn","Observable","subscribe","operator","subscriber","isSubscriber","source","sink","promiseCtor","getPromiseCtor","Symbol_observable","operations","isObserver","hasLift","operate","init","liftedSource","createOperatorSubscriber","onNext","onComplete","onError","onFinalize","OperatorSubscriber","shouldUnsubscribe","closed_1","ObjectUnsubscribedError","Subject","subject","AnonymousSubject","_c","observer","observers","hasError","isStopped","thrownError","BehaviorSubject","_value","subscription","dateTimestampProvider","Action","scheduler","work","state","delay","intervalProvider","AsyncAction","_id","_scheduler","_delay","errored","errorValue","actions","Scheduler","schedulerActionCtor","now","AsyncScheduler","SchedulerAction","action","asyncScheduler","isScheduler","last","popResultSelector","popScheduler","isArrayLike","isPromise","isInteropObservable","isAsyncIterable","obj","createInvalidObservableTypeError","getSymbolIterator","iterator","isIterable","Symbol_iterator","readableStreamLikeToAsyncGenerator","readableStream","done","isReadableStreamLike","innerFrom","fromInteropObservable","fromArrayLike","fromPromise","fromAsyncIterable","fromIterable","fromReadableStreamLike","obs","array","promise","iterable","iterable_1","iterable_1_1","asyncIterable","process","asyncIterable_1","asyncIterable_1_1","executeSchedule","parentSubscription","repeat","scheduleSubscription","observeOn","subscribeOn","scheduleObservable","schedulePromise","scheduleArray","scheduleIterable","scheduleAsyncIterable","scheduleReadableStreamLike","scheduled","map","project","isArray","callOrApply","mapOneOrManyArgs","getPrototypeOf","objectProto","getKeys","argsArgArrayOrObject","first_1","isPOJO","keys","key","createObject","values","combineLatest","resultSelector","observables","combineLatestInit","valueTransform","maybeSchedule","length","active","remainingFirstValues","_loop_1","hasFirstValue","execute","filter","predicate","bufferTime","bufferTimeSpan","otherArgs","bufferCreationInterval","maxBufferSize","bufferRecords","restartOnEmit","emit","record","subs","startBuffer","record_1","bufferTimeSubscriber","recordsCopy","recordsCopy_1","recordsCopy_1_1","distinctUntilChanged","comparator","keySelector","defaultCompare","previousKey","first","currentKey","finalize","callback","takeUntil","notifier","createSseObservable","options","endpoint","apiKey","payload","debugMode","customHeaders","method","controller","currentTraceId","hasCursor","disposed","url","esm","data","EventEmitter","event","listener","DEFAULT_SSE_BATCH_WINDOW_MS","withChannelScope","scope","AsgardServiceClient","baseEndpoint","customChannelId","json","sandbox","request","comment","batch","file","blobEndpoint","formData","relativePath","query","blob","filename","sandboxName","openURL","wsUrl","token","path","content","totalBytesHeader","form","k","src","dst","SOURCE_SET_VOLUME_ROOT","INVALID_SEGMENTS","assertVolumePath","segment","SOURCE_SET_MAX_PAGE_SIZE","SOURCE_SET_DEFAULT_MAX_ENTRIES","clampPageSize","pageSize","AsgardSourceSetClient","signal","maxEntries","entries","total","page","paging","byteToHex","unsafeStringify","offset","getRandomValues","rnds8","rng","randomUUID","native","_v4","buf","rnds","v4","Conversation","messages","pendingConsent","pendingFeedback","changed","currentMessage","currentBot","feedback","remainingPending","targetMessageId","target","rated","thinking","currentThinking","canvas","currentCanvas","template","html","userMessage","messageId","uuidv4","toolCallStart","toolCallKey","toolCallMessage","toolCallComplete","existingMessage","updatedMessage","replayedMessage","consent","start","TASK_TOOLS","isTaskTool","call","asRecord","asString","reduceTaskEvents","events","order","byId","parameter","sidecar","task","statusChange","isAgentTool","isSubagentChildTool","parentToolUseId","reduceSubagents","meta","tools","ensure","tool","str","conversationToSubagentEvents","toolUseId","deriveTasks","conversation","deriveSubagents","tasksEqual","other","toolsEqual","subagentsEqual","subagent","createDerivedStores","conversation$","tasks$","subagents$","reconcileLaunched","metadata","byName","IDLE_RUN_STATUS","FORCE_STOP_TIMEOUT_MS","runStatusEqual","Channel","list","name","current","title","channel","onChannelCreated","isConnecting","tasks","subagents","channelTitle","promptSuggestion","sandboxPhase","launchedSandboxes","runStatus","eventType","wasStopping","requestId","kind","busyWith","text","reply","toolCallConsents","answered","RESPONSE_FEEDBACK_PREFIX","FEEDBACK_COMMENT_MAX_BYTES","feedbackCommentByteLength","composeFeedbackMessage","verdict","prefix","PATH_ACTIONS","isPathAction","resolveSandboxUri","uri","match","params","absolutePath","KEYSYM","XK","UNICODE_KEYSYM_OFFSET","charToKeysym","character","codePoint","keyToKeysym","isPrintableKeysym","keysym","isMacOSKeyboard","platform","mapModifierKeysym","macOS","WHEEL_LINE_HEIGHT","WHEEL_MAX","WHEEL_THROTTLE_MS","normalizeWheel","scale","clamp","needsShift","HEARTBEAT_INTERVAL_MS","OPEN_TIMEOUT_MS","OP_CURSOR_POSITION","CURSOR_FRAME_BYTES","WIRE_LOG_EXCLUDED","decodeCursorFrame","view","createSandboxBrowserTransport","handlers","separator","socket","peer","sessionId","host","heartbeat","closed","announcedStreamId","pendingCandidates","send","sendControlled","setHost","timer","handleProvide","connection","candidate","answer","initialHostId","hostId","shift"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,71,72,73,74]}
|