@cms.ai/brand_brain 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -38
- package/dist/index.cjs +272 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +560 -16
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +560 -16
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +261 -10
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.cjs +261 -13
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +579 -20
- package/dist/react/index.d.cts.map +1 -1
- package/dist/react/index.d.mts +579 -20
- package/dist/react/index.d.mts.map +1 -1
- package/dist/react/index.mjs +261 -13
- package/dist/react/index.mjs.map +1 -1
- package/llms.txt +115 -0
- package/package.json +6 -5
- package/src/GuideClient.test.ts +28 -0
- package/src/GuideClient.ts +24 -3
- package/src/chat-stream.test.ts +28 -0
- package/src/chat-stream.ts +28 -3
- package/src/index.ts +2 -0
- package/src/react/index.ts +1 -1
- package/src/react/useGuide.ts +107 -6
- package/src/skill-state.test.ts +144 -0
- package/src/skill-state.ts +206 -0
- package/src/types.ts +504 -17
package/dist/react/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#cleanup","#next","#isDone","#isExecuteComplete","toStandardHeaders","#serialize","#deserialize","#api"],"sources":["../../../../node_modules/.pnpm/@orpc+shared@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/shared/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/shared/client.KWZYf6QD.mjs","../../../../node_modules/.pnpm/@orpc+standard-server@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/standard-server/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/shared/client.BLtwTQUg.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+standard-server-fetch@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/standard-server-fetch/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/shared/client.DrB9nq_G.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/adapters/fetch/index.mjs","../../../orpc/src/shared/client.ts","../../../orpc/src/live/client.ts","../../src/api.ts","../../src/analytics.ts","../../src/types.ts","../../src/chat-stream.ts","../../src/GuideClient.ts","../../src/react/useGuide.ts"],"sourcesContent":["export { group, guard, mapEntries, mapValues, omit, retry, sleep } from 'radash';\n\nfunction resolveMaybeOptionalOptions(rest) {\n return rest[0] ?? {};\n}\n\nfunction toArray(value) {\n return Array.isArray(value) ? value : value === void 0 || value === null ? [] : [value];\n}\nfunction splitInHalf(arr) {\n const half = Math.ceil(arr.length / 2);\n return [arr.slice(0, half), arr.slice(half)];\n}\n\nfunction readAsBuffer(source) {\n if (typeof source.bytes === \"function\") {\n return source.bytes();\n }\n return source.arrayBuffer();\n}\n\nconst ORPC_NAME = \"orpc\";\nconst ORPC_SHARED_PACKAGE_NAME = \"@orpc/shared\";\nconst ORPC_SHARED_PACKAGE_VERSION = \"1.14.0\";\n\nclass AbortError extends Error {\n constructor(...rest) {\n super(...rest);\n this.name = \"AbortError\";\n }\n}\n\nfunction once(fn) {\n let cached;\n return () => {\n if (cached) {\n return cached.result;\n }\n const result = fn();\n cached = { result };\n return result;\n };\n}\nfunction sequential(fn) {\n let lastOperationPromise = Promise.resolve();\n return (...args) => {\n return lastOperationPromise = lastOperationPromise.catch(() => {\n }).then(() => {\n return fn(...args);\n });\n };\n}\nfunction defer(callback) {\n if (typeof setTimeout === \"function\") {\n setTimeout(callback, 0);\n } else {\n Promise.resolve().then(() => Promise.resolve().then(() => Promise.resolve().then(callback)));\n }\n}\n\nconst SPAN_ERROR_STATUS = 2;\nconst GLOBAL_OTEL_CONFIG_KEY = `__${ORPC_SHARED_PACKAGE_NAME}@${ORPC_SHARED_PACKAGE_VERSION}/otel/config__`;\nfunction setGlobalOtelConfig(config) {\n globalThis[GLOBAL_OTEL_CONFIG_KEY] = config;\n}\nfunction getGlobalOtelConfig() {\n return globalThis[GLOBAL_OTEL_CONFIG_KEY];\n}\nfunction startSpan(name, options = {}, context) {\n const tracer = getGlobalOtelConfig()?.tracer;\n return tracer?.startSpan(name, options, context);\n}\nfunction setSpanError(span, error, options = {}) {\n if (!span) {\n return;\n }\n const exception = toOtelException(error);\n span.recordException(exception);\n if (!options.signal?.aborted || options.signal.reason !== error) {\n span.setStatus({\n code: SPAN_ERROR_STATUS,\n message: exception.message\n });\n }\n}\nfunction setSpanAttribute(span, key, value) {\n if (!span || value === void 0) {\n return;\n }\n span.setAttribute(key, value);\n}\nfunction toOtelException(error) {\n if (error instanceof Error) {\n const exception = {\n message: error.message,\n name: error.name,\n stack: error.stack\n };\n if (\"code\" in error && (typeof error.code === \"string\" || typeof error.code === \"number\")) {\n exception.code = error.code;\n }\n return exception;\n }\n return { message: String(error) };\n}\nfunction toSpanAttributeValue(data) {\n if (data === void 0) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(data, (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n if (value instanceof Map || value instanceof Set) {\n return Array.from(value);\n }\n return value;\n });\n } catch {\n return String(data);\n }\n}\nasync function runWithSpan({ name, context, ...options }, fn) {\n const tracer = getGlobalOtelConfig()?.tracer;\n if (!tracer) {\n return fn();\n }\n const callback = async (span) => {\n try {\n return await fn(span);\n } catch (e) {\n setSpanError(span, e, options);\n throw e;\n } finally {\n span.end();\n }\n };\n if (context) {\n return tracer.startActiveSpan(name, options, context, callback);\n } else {\n return tracer.startActiveSpan(name, options, callback);\n }\n}\nasync function runInSpanContext(span, fn) {\n const otelConfig = getGlobalOtelConfig();\n if (!span || !otelConfig) {\n return fn();\n }\n const ctx = otelConfig.trace.setSpan(otelConfig.context.active(), span);\n return otelConfig.context.with(ctx, fn);\n}\n\nclass AsyncIdQueue {\n openIds = /* @__PURE__ */ new Set();\n queues = /* @__PURE__ */ new Map();\n waiters = /* @__PURE__ */ new Map();\n get length() {\n return this.openIds.size;\n }\n get waiterIds() {\n return Array.from(this.waiters.keys());\n }\n hasBufferedItems(id) {\n return Boolean(this.queues.get(id)?.length);\n }\n open(id) {\n this.openIds.add(id);\n }\n isOpen(id) {\n return this.openIds.has(id);\n }\n push(id, item) {\n this.assertOpen(id);\n const pending = this.waiters.get(id);\n if (pending?.length) {\n pending.shift()[0](item);\n if (pending.length === 0) {\n this.waiters.delete(id);\n }\n } else {\n const items = this.queues.get(id);\n if (items) {\n items.push(item);\n } else {\n this.queues.set(id, [item]);\n }\n }\n }\n async pull(id) {\n this.assertOpen(id);\n const items = this.queues.get(id);\n if (items?.length) {\n const item = items.shift();\n if (items.length === 0) {\n this.queues.delete(id);\n }\n return item;\n }\n return new Promise((resolve, reject) => {\n const waitingPulls = this.waiters.get(id);\n const pending = [resolve, reject];\n if (waitingPulls) {\n waitingPulls.push(pending);\n } else {\n this.waiters.set(id, [pending]);\n }\n });\n }\n close({ id, reason } = {}) {\n if (id === void 0) {\n this.waiters.forEach((pendingPulls, id2) => {\n const error2 = reason ?? new AbortError(`[AsyncIdQueue] Queue[${id2}] was closed or aborted while waiting for pulling.`);\n pendingPulls.forEach(([, reject]) => reject(error2));\n });\n this.waiters.clear();\n this.openIds.clear();\n this.queues.clear();\n return;\n }\n const error = reason ?? new AbortError(`[AsyncIdQueue] Queue[${id}] was closed or aborted while waiting for pulling.`);\n this.waiters.get(id)?.forEach(([, reject]) => reject(error));\n this.waiters.delete(id);\n this.openIds.delete(id);\n this.queues.delete(id);\n }\n assertOpen(id) {\n if (!this.isOpen(id)) {\n throw new Error(`[AsyncIdQueue] Cannot access queue[${id}] because it is not open or aborted.`);\n }\n }\n}\n\nfunction isAsyncIteratorObject(maybe) {\n if (!maybe || typeof maybe !== \"object\") {\n return false;\n }\n return \"next\" in maybe && typeof maybe.next === \"function\" && Symbol.asyncIterator in maybe && typeof maybe[Symbol.asyncIterator] === \"function\";\n}\nconst fallbackAsyncDisposeSymbol = Symbol.for(\"asyncDispose\");\nconst asyncDisposeSymbol = Symbol.asyncDispose ?? fallbackAsyncDisposeSymbol;\nclass AsyncIteratorClass {\n #isDone = false;\n #isExecuteComplete = false;\n #cleanup;\n #next;\n constructor(next, cleanup) {\n this.#cleanup = cleanup;\n this.#next = sequential(async () => {\n if (this.#isDone) {\n return { done: true, value: void 0 };\n }\n try {\n const result = await next();\n if (result.done) {\n this.#isDone = true;\n }\n return result;\n } catch (err) {\n this.#isDone = true;\n throw err;\n } finally {\n if (this.#isDone && !this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"next\");\n }\n }\n });\n }\n next() {\n return this.#next();\n }\n async return(value) {\n this.#isDone = true;\n if (!this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"return\");\n }\n return { done: true, value };\n }\n async throw(err) {\n this.#isDone = true;\n if (!this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"throw\");\n }\n throw err;\n }\n /**\n * asyncDispose symbol only available in esnext, we should fallback to Symbol.for('asyncDispose')\n */\n async [asyncDisposeSymbol]() {\n this.#isDone = true;\n if (!this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"dispose\");\n }\n }\n [Symbol.asyncIterator]() {\n return this;\n }\n}\nfunction replicateAsyncIterator(source, count) {\n const queue = new AsyncIdQueue();\n const ids = Array.from({ length: count }, (_, i) => i.toString());\n let isSourceFinished = false;\n const start = once(async () => {\n try {\n while (true) {\n const item = await source.next();\n ids.forEach((id) => {\n if (queue.isOpen(id)) {\n queue.push(id, { next: item });\n }\n });\n if (item.done) {\n break;\n }\n }\n } catch (error) {\n ids.forEach((id) => {\n if (queue.isOpen(id)) {\n queue.push(id, { error });\n }\n });\n } finally {\n isSourceFinished = true;\n }\n });\n const replicated = ids.map((id) => {\n queue.open(id);\n return new AsyncIteratorClass(\n async () => {\n start();\n const item = await queue.pull(id);\n if (item.next) {\n return item.next;\n }\n throw item.error;\n },\n async (reason) => {\n queue.close({ id });\n if (reason !== \"next\" && !queue.length && !isSourceFinished) {\n isSourceFinished = true;\n await source?.return?.();\n }\n }\n );\n });\n return replicated;\n}\nfunction asyncIteratorWithSpan({ name, ...options }, iterator) {\n let span;\n return new AsyncIteratorClass(\n async () => {\n span ??= startSpan(name);\n try {\n const result = await runInSpanContext(span, () => iterator.next());\n span?.addEvent(result.done ? \"completed\" : \"yielded\");\n return result;\n } catch (err) {\n setSpanError(span, err, options);\n throw err;\n }\n },\n async (reason) => {\n try {\n if (reason !== \"next\") {\n await runInSpanContext(span, () => iterator.return?.());\n }\n } catch (err) {\n setSpanError(span, err, options);\n throw err;\n } finally {\n span?.end();\n }\n }\n );\n}\n\nclass EventPublisher {\n #listenersMap = /* @__PURE__ */ new Map();\n #maxBufferedEvents;\n constructor(options = {}) {\n this.#maxBufferedEvents = options.maxBufferedEvents ?? 100;\n }\n get size() {\n return this.#listenersMap.size;\n }\n /**\n * Emits an event and delivers the payload to all subscribed listeners.\n */\n publish(event, payload) {\n const listeners = this.#listenersMap.get(event);\n if (!listeners) {\n return;\n }\n for (const listener of listeners) {\n listener(payload);\n }\n }\n subscribe(event, listenerOrOptions) {\n if (typeof listenerOrOptions === \"function\") {\n let listeners = this.#listenersMap.get(event);\n if (!listeners) {\n this.#listenersMap.set(event, listeners = []);\n }\n listeners.push(listenerOrOptions);\n return once(() => {\n listeners.splice(listeners.indexOf(listenerOrOptions), 1);\n if (listeners.length === 0) {\n this.#listenersMap.delete(event);\n }\n });\n }\n const signal = listenerOrOptions?.signal;\n const maxBufferedEvents = listenerOrOptions?.maxBufferedEvents ?? this.#maxBufferedEvents;\n signal?.throwIfAborted();\n const bufferedEvents = [];\n const pullResolvers = [];\n const unsubscribe = this.subscribe(event, (payload) => {\n const resolver = pullResolvers.shift();\n if (resolver) {\n resolver[0]({ done: false, value: payload });\n } else {\n bufferedEvents.push(payload);\n if (bufferedEvents.length > maxBufferedEvents) {\n bufferedEvents.shift();\n }\n }\n });\n const abortListener = (event2) => {\n unsubscribe();\n pullResolvers.forEach((resolver) => resolver[1](event2.target.reason));\n pullResolvers.length = 0;\n bufferedEvents.length = 0;\n };\n signal?.addEventListener(\"abort\", abortListener, { once: true });\n return new AsyncIteratorClass(async () => {\n if (signal?.aborted) {\n throw signal.reason;\n }\n if (bufferedEvents.length > 0) {\n return { done: false, value: bufferedEvents.shift() };\n }\n return new Promise((resolve, reject) => {\n pullResolvers.push([resolve, reject]);\n });\n }, async () => {\n unsubscribe();\n signal?.removeEventListener(\"abort\", abortListener);\n pullResolvers.forEach((resolver) => resolver[0]({ done: true, value: void 0 }));\n pullResolvers.length = 0;\n bufferedEvents.length = 0;\n });\n }\n}\n\nclass SequentialIdGenerator {\n index = BigInt(1);\n generate() {\n const id = this.index.toString(36);\n this.index++;\n return id;\n }\n}\nfunction compareSequentialIds(a, b) {\n if (a.length !== b.length) {\n return a.length - b.length;\n }\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction onStart(callback) {\n return async (options, ...rest) => {\n await callback(options, ...rest);\n return await options.next();\n };\n}\nfunction onSuccess(callback) {\n return async (options, ...rest) => {\n const result = await options.next();\n await callback(result, options, ...rest);\n return result;\n };\n}\nfunction onError(callback) {\n return async (options, ...rest) => {\n try {\n return await options.next();\n } catch (error) {\n await callback(error, options, ...rest);\n throw error;\n }\n };\n}\nfunction onFinish(callback) {\n let state;\n return async (options, ...rest) => {\n try {\n const result = await options.next();\n state = [null, result, true];\n return result;\n } catch (error) {\n state = [error, void 0, false];\n throw error;\n } finally {\n await callback(state, options, ...rest);\n }\n };\n}\nfunction intercept(interceptors, options, main) {\n const next = (options2, index) => {\n const interceptor = interceptors[index];\n if (!interceptor) {\n return main(options2);\n }\n return interceptor({\n ...options2,\n next: (newOptions = options2) => next(newOptions, index + 1)\n });\n };\n return next(options, 0);\n}\n\nfunction parseEmptyableJSON(text) {\n if (!text) {\n return void 0;\n }\n return JSON.parse(text);\n}\nfunction stringifyJSON(value) {\n return JSON.stringify(value);\n}\n\nfunction findDeepMatches(check, payload, segments = [], maps = [], values = []) {\n if (check(payload)) {\n maps.push(segments);\n values.push(payload);\n } else if (Array.isArray(payload)) {\n payload.forEach((v, i) => {\n findDeepMatches(check, v, [...segments, i], maps, values);\n });\n } else if (isObject(payload)) {\n for (const key in payload) {\n findDeepMatches(check, payload[key], [...segments, key], maps, values);\n }\n }\n return { maps, values };\n}\nfunction getConstructor(value) {\n if (!isTypescriptObject(value)) {\n return null;\n }\n return Object.getPrototypeOf(value)?.constructor;\n}\nfunction isObject(value) {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || !proto || !proto.constructor;\n}\nfunction isTypescriptObject(value) {\n return !!value && (typeof value === \"object\" || typeof value === \"function\");\n}\nfunction clone(value) {\n if (Array.isArray(value)) {\n return value.map(clone);\n }\n if (isObject(value)) {\n const result = {};\n for (const key in value) {\n result[key] = clone(value[key]);\n }\n for (const sym of Object.getOwnPropertySymbols(value)) {\n result[sym] = clone(value[sym]);\n }\n return result;\n }\n return value;\n}\nfunction get(object, path) {\n let current = object;\n for (const key of path) {\n if (!isTypescriptObject(current)) {\n return void 0;\n }\n current = current[key];\n }\n return current;\n}\nfunction isPropertyKey(value) {\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"symbol\";\n}\nconst NullProtoObj = /* @__PURE__ */ (() => {\n const e = function() {\n };\n e.prototype = /* @__PURE__ */ Object.create(null);\n Object.freeze(e.prototype);\n return e;\n})();\n\nfunction value(value2, ...args) {\n if (typeof value2 === \"function\") {\n return value2(...args);\n }\n return value2;\n}\nfunction fallback(value2, fallback2) {\n return value2 === void 0 ? fallback2 : value2;\n}\n\nfunction preventNativeAwait(target) {\n return new Proxy(target, {\n get(target2, prop, receiver) {\n const value2 = Reflect.get(target2, prop, receiver);\n if (prop !== \"then\" || typeof value2 !== \"function\") {\n return value2;\n }\n return new Proxy(value2, {\n apply(targetFn, thisArg, args) {\n if (args.length !== 2 || args.some((arg) => !isNativeFunction(arg))) {\n return Reflect.apply(targetFn, thisArg, args);\n }\n let shouldOmit = true;\n args[0].call(thisArg, preventNativeAwait(new Proxy(target2, {\n get: (target3, prop2, receiver2) => {\n if (shouldOmit && prop2 === \"then\") {\n shouldOmit = false;\n return void 0;\n }\n return Reflect.get(target3, prop2, receiver2);\n }\n })));\n }\n });\n }\n });\n}\nconst NATIVE_FUNCTION_REGEX = /^\\s*function\\s*\\(\\)\\s*\\{\\s*\\[native code\\]\\s*\\}\\s*$/;\nfunction isNativeFunction(fn) {\n return typeof fn === \"function\" && NATIVE_FUNCTION_REGEX.test(fn.toString());\n}\nfunction overlayProxy(target, partial) {\n const proxy = new Proxy(typeof target === \"function\" ? partial : target, {\n get(_, prop) {\n const targetValue = prop in partial ? partial : value(target);\n const v = Reflect.get(targetValue, prop);\n return typeof v === \"function\" ? v.bind(targetValue) : v;\n },\n has(_, prop) {\n return Reflect.has(partial, prop) || Reflect.has(value(target), prop);\n }\n });\n return proxy;\n}\n\nfunction streamToAsyncIteratorClass(stream) {\n const reader = stream.getReader();\n return new AsyncIteratorClass(\n async () => {\n return reader.read();\n },\n async () => {\n await reader.cancel();\n }\n );\n}\nfunction asyncIteratorToStream(iterator) {\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iterator.return?.();\n }\n });\n}\nfunction asyncIteratorToUnproxiedDataStream(iterator) {\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n const unproxied = isObject(value) ? { ...value } : Array.isArray(value) ? value.map((i) => i) : value;\n controller.enqueue(unproxied);\n }\n },\n async cancel() {\n await iterator.return?.();\n }\n });\n}\n\nfunction tryDecodeURIComponent(value) {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nexport { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorToUnproxiedDataStream, asyncIteratorWithSpan, clone, compareSequentialIds, defer, fallback, findDeepMatches, get, getConstructor, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, overlayProxy, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };\n","import { resolveMaybeOptionalOptions, getConstructor, isObject } from '@orpc/shared';\n\nconst ORPC_CLIENT_PACKAGE_NAME = \"@orpc/client\";\nconst ORPC_CLIENT_PACKAGE_VERSION = \"1.14.0\";\n\nconst COMMON_ORPC_ERROR_DEFS = {\n BAD_REQUEST: {\n status: 400,\n message: \"Bad Request\"\n },\n UNAUTHORIZED: {\n status: 401,\n message: \"Unauthorized\"\n },\n FORBIDDEN: {\n status: 403,\n message: \"Forbidden\"\n },\n NOT_FOUND: {\n status: 404,\n message: \"Not Found\"\n },\n METHOD_NOT_SUPPORTED: {\n status: 405,\n message: \"Method Not Supported\"\n },\n NOT_ACCEPTABLE: {\n status: 406,\n message: \"Not Acceptable\"\n },\n TIMEOUT: {\n status: 408,\n message: \"Request Timeout\"\n },\n CONFLICT: {\n status: 409,\n message: \"Conflict\"\n },\n PRECONDITION_FAILED: {\n status: 412,\n message: \"Precondition Failed\"\n },\n PAYLOAD_TOO_LARGE: {\n status: 413,\n message: \"Payload Too Large\"\n },\n UNSUPPORTED_MEDIA_TYPE: {\n status: 415,\n message: \"Unsupported Media Type\"\n },\n UNPROCESSABLE_CONTENT: {\n status: 422,\n message: \"Unprocessable Content\"\n },\n TOO_MANY_REQUESTS: {\n status: 429,\n message: \"Too Many Requests\"\n },\n CLIENT_CLOSED_REQUEST: {\n status: 499,\n message: \"Client Closed Request\"\n },\n INTERNAL_SERVER_ERROR: {\n status: 500,\n message: \"Internal Server Error\"\n },\n NOT_IMPLEMENTED: {\n status: 501,\n message: \"Not Implemented\"\n },\n BAD_GATEWAY: {\n status: 502,\n message: \"Bad Gateway\"\n },\n SERVICE_UNAVAILABLE: {\n status: 503,\n message: \"Service Unavailable\"\n },\n GATEWAY_TIMEOUT: {\n status: 504,\n message: \"Gateway Timeout\"\n }\n};\nfunction fallbackORPCErrorStatus(code, status) {\n return status ?? COMMON_ORPC_ERROR_DEFS[code]?.status ?? 500;\n}\nfunction fallbackORPCErrorMessage(code, message) {\n return message || COMMON_ORPC_ERROR_DEFS[code]?.message || code;\n}\nconst GLOBAL_ORPC_ERROR_CONSTRUCTORS_SYMBOL = Symbol.for(`__${ORPC_CLIENT_PACKAGE_NAME}@${ORPC_CLIENT_PACKAGE_VERSION}/error/ORPC_ERROR_CONSTRUCTORS__`);\nvoid (globalThis[GLOBAL_ORPC_ERROR_CONSTRUCTORS_SYMBOL] ??= /* @__PURE__ */ new WeakSet());\nconst globalORPCErrorConstructors = globalThis[GLOBAL_ORPC_ERROR_CONSTRUCTORS_SYMBOL];\nclass ORPCError extends Error {\n defined;\n code;\n status;\n data;\n constructor(code, ...rest) {\n const options = resolveMaybeOptionalOptions(rest);\n if (options.status !== void 0 && !isORPCErrorStatus(options.status)) {\n throw new Error(\"[ORPCError] Invalid error status code.\");\n }\n const message = fallbackORPCErrorMessage(code, options.message);\n super(message, options);\n this.code = code;\n this.status = fallbackORPCErrorStatus(code, options.status);\n this.defined = options.defined ?? false;\n this.data = options.data;\n }\n toJSON() {\n return {\n defined: this.defined,\n code: this.code,\n status: this.status,\n message: this.message,\n data: this.data\n };\n }\n /**\n * Workaround for Next.js where different contexts use separate\n * dependency graphs, causing multiple ORPCError constructors existing and breaking\n * `instanceof` checks across contexts.\n *\n * This is particularly problematic with \"Optimized SSR\", where orpc-client\n * executes in one context but is invoked from another. When an error is thrown\n * in the execution context, `instanceof ORPCError` checks fail in the\n * invocation context due to separate class constructors.\n *\n * @todo Remove this and related code if Next.js resolves the multiple dependency graph issue.\n */\n static [Symbol.hasInstance](instance) {\n if (globalORPCErrorConstructors.has(this)) {\n const constructor = getConstructor(instance);\n if (constructor && globalORPCErrorConstructors.has(constructor)) {\n return true;\n }\n }\n return super[Symbol.hasInstance](instance);\n }\n}\nglobalORPCErrorConstructors.add(ORPCError);\nfunction isDefinedError(error) {\n return error instanceof ORPCError && error.defined;\n}\nfunction toORPCError(error) {\n return error instanceof ORPCError ? error : new ORPCError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Internal server error\",\n cause: error\n });\n}\nfunction isORPCErrorStatus(status) {\n return status < 200 || status >= 400;\n}\nfunction isORPCErrorJson(json) {\n if (!isObject(json)) {\n return false;\n }\n const validKeys = [\"defined\", \"code\", \"status\", \"message\", \"data\"];\n if (Object.keys(json).some((k) => !validKeys.includes(k))) {\n return false;\n }\n return \"defined\" in json && typeof json.defined === \"boolean\" && \"code\" in json && typeof json.code === \"string\" && \"status\" in json && typeof json.status === \"number\" && isORPCErrorStatus(json.status) && \"message\" in json && typeof json.message === \"string\";\n}\nfunction createORPCErrorFromJson(json, options = {}) {\n return new ORPCError(json.code, {\n ...options,\n ...json\n });\n}\n\nexport { COMMON_ORPC_ERROR_DEFS as C, ORPC_CLIENT_PACKAGE_NAME as O, ORPC_CLIENT_PACKAGE_VERSION as a, fallbackORPCErrorMessage as b, ORPCError as c, isORPCErrorStatus as d, isORPCErrorJson as e, fallbackORPCErrorStatus as f, createORPCErrorFromJson as g, isDefinedError as i, toORPCError as t };\n","import { isTypescriptObject, AsyncIteratorClass, tryDecodeURIComponent, toArray, once, isAsyncIteratorObject, replicateAsyncIterator } from '@orpc/shared';\n\nclass EventEncoderError extends TypeError {\n}\nclass EventDecoderError extends TypeError {\n}\nclass ErrorEvent extends Error {\n data;\n constructor(options) {\n super(options?.message ?? \"An error event was received\", options);\n this.data = options?.data;\n }\n}\n\nfunction decodeEventMessage(encoded) {\n const lines = encoded.replace(/\\n+$/, \"\").split(/\\n/);\n const message = {\n data: void 0,\n event: void 0,\n id: void 0,\n retry: void 0,\n comments: []\n };\n for (const line of lines) {\n const index = line.indexOf(\":\");\n const key = index === -1 ? line : line.slice(0, index);\n const value = index === -1 ? \"\" : line.slice(index + 1).replace(/^\\s/, \"\");\n if (index === 0) {\n message.comments.push(value);\n } else if (key === \"data\") {\n message.data ??= \"\";\n message.data += `${value}\n`;\n } else if (key === \"event\") {\n message.event = value;\n } else if (key === \"id\") {\n message.id = value;\n } else if (key === \"retry\") {\n const maybeInteger = Number.parseInt(value);\n if (Number.isInteger(maybeInteger) && maybeInteger >= 0 && maybeInteger.toString() === value) {\n message.retry = maybeInteger;\n }\n }\n }\n message.data = message.data?.replace(/\\n$/, \"\");\n return message;\n}\nclass EventDecoder {\n constructor(options = {}) {\n this.options = options;\n }\n incomplete = \"\";\n feed(chunk) {\n this.incomplete += chunk;\n const lastCompleteIndex = this.incomplete.lastIndexOf(\"\\n\\n\");\n if (lastCompleteIndex === -1) {\n return;\n }\n const completes = this.incomplete.slice(0, lastCompleteIndex).split(/\\n\\n/);\n this.incomplete = this.incomplete.slice(lastCompleteIndex + 2);\n for (const encoded of completes) {\n const message = decodeEventMessage(`${encoded}\n\n`);\n if (this.options.onEvent) {\n this.options.onEvent(message);\n }\n }\n }\n end() {\n if (this.incomplete) {\n throw new EventDecoderError(\"Event Iterator ended before complete\");\n }\n }\n}\nclass EventDecoderStream extends TransformStream {\n constructor() {\n let decoder;\n super({\n start(controller) {\n decoder = new EventDecoder({\n onEvent: (event) => {\n controller.enqueue(event);\n }\n });\n },\n transform(chunk) {\n decoder.feed(chunk);\n },\n flush() {\n decoder.end();\n }\n });\n }\n}\n\nfunction assertEventId(id) {\n if (id.includes(\"\\n\")) {\n throw new EventEncoderError(\"Event's id must not contain a newline character\");\n }\n}\nfunction assertEventName(event) {\n if (event.includes(\"\\n\")) {\n throw new EventEncoderError(\"Event's event must not contain a newline character\");\n }\n}\nfunction assertEventRetry(retry) {\n if (!Number.isInteger(retry) || retry < 0) {\n throw new EventEncoderError(\"Event's retry must be a integer and >= 0\");\n }\n}\nfunction assertEventComment(comment) {\n if (comment.includes(\"\\n\")) {\n throw new EventEncoderError(\"Event's comment must not contain a newline character\");\n }\n}\nfunction encodeEventData(data) {\n const lines = data?.split(/\\n/) ?? [];\n let output = \"\";\n for (const line of lines) {\n output += `data: ${line}\n`;\n }\n return output;\n}\nfunction encodeEventComments(comments) {\n let output = \"\";\n for (const comment of comments ?? []) {\n assertEventComment(comment);\n output += `: ${comment}\n`;\n }\n return output;\n}\nfunction encodeEventMessage(message) {\n let output = \"\";\n output += encodeEventComments(message.comments);\n if (message.event !== void 0) {\n assertEventName(message.event);\n output += `event: ${message.event}\n`;\n }\n if (message.retry !== void 0) {\n assertEventRetry(message.retry);\n output += `retry: ${message.retry}\n`;\n }\n if (message.id !== void 0) {\n assertEventId(message.id);\n output += `id: ${message.id}\n`;\n }\n output += encodeEventData(message.data);\n output += \"\\n\";\n return output;\n}\n\nconst EVENT_SOURCE_META_SYMBOL = Symbol(\"ORPC_EVENT_SOURCE_META\");\nfunction withEventMeta(container, meta) {\n if (meta.id === void 0 && meta.retry === void 0 && !meta.comments?.length) {\n return container;\n }\n if (meta.id !== void 0) {\n assertEventId(meta.id);\n }\n if (meta.retry !== void 0) {\n assertEventRetry(meta.retry);\n }\n if (meta.comments !== void 0) {\n for (const comment of meta.comments) {\n assertEventComment(comment);\n }\n }\n return new Proxy(container, {\n get(target, prop, receiver) {\n if (prop === EVENT_SOURCE_META_SYMBOL) {\n return meta;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nfunction getEventMeta(container) {\n return isTypescriptObject(container) ? Reflect.get(container, EVENT_SOURCE_META_SYMBOL) : void 0;\n}\n\nclass HibernationEventIterator extends AsyncIteratorClass {\n /**\n * this property is not transferred to the client, so it should be optional for type safety\n */\n hibernationCallback;\n constructor(hibernationCallback) {\n super(async () => {\n throw new Error(\"Cannot iterate over hibernating iterator directly\");\n }, async (reason) => {\n if (reason !== \"next\") {\n throw new Error(\"Cannot cleanup hibernating iterator directly\");\n }\n });\n this.hibernationCallback = hibernationCallback;\n }\n}\n\nfunction generateContentDisposition(filename, disposition = \"inline\") {\n const encodedFileName = filename.replace(/[^\\x20-\\x7E]/g, \"_\").replace(/\"/g, '\\\\\"');\n const encodedFilenameStar = encodeURIComponent(filename).replace(/['()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`).replace(/%(7C|60|5E)/g, (str, hex) => String.fromCharCode(Number.parseInt(hex, 16)));\n return `${disposition}; filename=\"${encodedFileName}\"; filename*=utf-8''${encodedFilenameStar}`;\n}\nfunction getFilenameFromContentDisposition(contentDisposition) {\n const encodedFilenameStarMatch = contentDisposition.match(/filename\\*=(UTF-8'')?([^;]*)/i);\n if (encodedFilenameStarMatch && typeof encodedFilenameStarMatch[2] === \"string\") {\n return tryDecodeURIComponent(encodedFilenameStarMatch[2]);\n }\n const encodedFilenameMatch = contentDisposition.match(/filename=\"((?:\\\\\"|[^\"])*)\"/i);\n if (encodedFilenameMatch && typeof encodedFilenameMatch[1] === \"string\") {\n return encodedFilenameMatch[1].replace(/\\\\\"/g, '\"');\n }\n}\nfunction mergeStandardHeaders(a, b) {\n const merged = { ...a };\n for (const key in b) {\n if (Array.isArray(b[key])) {\n merged[key] = [...toArray(merged[key]), ...b[key]];\n } else if (b[key] !== void 0) {\n if (Array.isArray(merged[key])) {\n merged[key] = [...merged[key], b[key]];\n } else if (merged[key] !== void 0) {\n merged[key] = [merged[key], b[key]];\n } else {\n merged[key] = b[key];\n }\n }\n }\n return merged;\n}\nfunction flattenHeader(header) {\n if (typeof header === \"string\" || header === void 0) {\n return header;\n }\n if (header.length === 0) {\n return void 0;\n }\n return header.join(\", \");\n}\nfunction replicateStandardLazyResponse(response, count) {\n const replicated = [];\n let bodyPromise;\n let replicatedAsyncIteratorObjects;\n for (let i = 0; i < count; i++) {\n replicated.push({\n ...response,\n body: once(async () => {\n const body = await (bodyPromise ??= response.body());\n if (!isAsyncIteratorObject(body)) {\n return body;\n }\n replicatedAsyncIteratorObjects ??= replicateAsyncIterator(body, count);\n return replicatedAsyncIteratorObjects.shift();\n })\n });\n }\n return replicated;\n}\nfunction isEventIteratorHeaders(headers) {\n return Boolean(flattenHeader(headers[\"content-type\"])?.startsWith(\"text/event-stream\") && flattenHeader(headers[\"content-disposition\"]) === void 0);\n}\n\nexport { ErrorEvent, EventDecoder, EventDecoderError, EventDecoderStream, EventEncoderError, HibernationEventIterator, assertEventComment, assertEventId, assertEventName, assertEventRetry, decodeEventMessage, encodeEventComments, encodeEventData, encodeEventMessage, flattenHeader, generateContentDisposition, getEventMeta, getFilenameFromContentDisposition, isEventIteratorHeaders, mergeStandardHeaders, replicateStandardLazyResponse, withEventMeta };\n","import { AsyncIteratorClass, isTypescriptObject } from '@orpc/shared';\nimport { getEventMeta, withEventMeta } from '@orpc/standard-server';\n\nfunction mapEventIterator(iterator, maps) {\n const mapError = async (error) => {\n let mappedError = await maps.error(error);\n if (mappedError !== error) {\n const meta = getEventMeta(error);\n if (meta && isTypescriptObject(mappedError)) {\n mappedError = withEventMeta(mappedError, meta);\n }\n }\n return mappedError;\n };\n return new AsyncIteratorClass(async () => {\n const { done, value } = await (async () => {\n try {\n return await iterator.next();\n } catch (error) {\n throw await mapError(error);\n }\n })();\n let mappedValue = await maps.value(value, done);\n if (mappedValue !== value) {\n const meta = getEventMeta(value);\n if (meta && isTypescriptObject(mappedValue)) {\n mappedValue = withEventMeta(mappedValue, meta);\n }\n }\n return { done, value: mappedValue };\n }, async () => {\n try {\n await iterator.return?.();\n } catch (error) {\n throw await mapError(error);\n }\n });\n}\n\nexport { mapEventIterator as m };\n","import { preventNativeAwait, isTypescriptObject } from '@orpc/shared';\nexport { AsyncIteratorClass, EventPublisher, asyncIteratorToStream as eventIteratorToStream, asyncIteratorToUnproxiedDataStream as eventIteratorToUnproxiedDataStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';\nimport { i as isDefinedError } from './shared/client.KWZYf6QD.mjs';\nexport { C as COMMON_ORPC_ERROR_DEFS, c as ORPCError, O as ORPC_CLIENT_PACKAGE_NAME, a as ORPC_CLIENT_PACKAGE_VERSION, g as createORPCErrorFromJson, b as fallbackORPCErrorMessage, f as fallbackORPCErrorStatus, e as isORPCErrorJson, d as isORPCErrorStatus, t as toORPCError } from './shared/client.KWZYf6QD.mjs';\nexport { m as mapEventIterator } from './shared/client.BLtwTQUg.mjs';\nexport { ErrorEvent, getEventMeta, withEventMeta } from '@orpc/standard-server';\n\nasync function safe(promise) {\n try {\n const output = await promise;\n return Object.assign(\n [null, output, false, true],\n { error: null, data: output, isDefined: false, isSuccess: true }\n );\n } catch (e) {\n const error = e;\n if (isDefinedError(error)) {\n return Object.assign(\n [error, void 0, true, false],\n { error, data: void 0, isDefined: true, isSuccess: false }\n );\n }\n return Object.assign(\n [error, void 0, false, false],\n { error, data: void 0, isDefined: false, isSuccess: false }\n );\n }\n}\nfunction resolveFriendlyClientOptions(options) {\n return {\n ...options,\n context: options.context ?? {}\n // Context only optional if all fields are optional\n };\n}\nfunction consumeEventIterator(iterator, options) {\n void (async () => {\n let onFinishState;\n try {\n const resolvedIterator = await iterator;\n while (true) {\n const { done, value } = await resolvedIterator.next();\n if (done) {\n const realValue = value;\n onFinishState = [null, realValue, true];\n options.onSuccess?.(realValue);\n break;\n }\n options.onEvent(value);\n }\n } catch (error) {\n onFinishState = [error, void 0, false];\n if (!options.onError && !options.onFinish) {\n throw error;\n }\n options.onError?.(error);\n } finally {\n options.onFinish?.(onFinishState);\n }\n })();\n return async () => {\n await (await iterator)?.return?.();\n };\n}\n\nfunction createORPCClient(link, options = {}) {\n const path = options.path ?? [];\n const procedureClient = async (...[input, options2 = {}]) => {\n return await link.call(path, input, resolveFriendlyClientOptions(options2));\n };\n const recursive = new Proxy(procedureClient, {\n get(target, key) {\n if (typeof key !== \"string\") {\n return Reflect.get(target, key);\n }\n return createORPCClient(link, {\n ...options,\n path: [...path, key]\n });\n }\n });\n return preventNativeAwait(recursive);\n}\n\nfunction createSafeClient(client) {\n const proxy = new Proxy((...args) => safe(client(...args)), {\n get(_, prop, receiver) {\n const value = Reflect.get(client, prop, receiver);\n if (typeof prop !== \"string\") {\n return value;\n }\n if (!isTypescriptObject(value)) {\n return value;\n }\n return createSafeClient(value);\n }\n });\n return proxy;\n}\n\nclass DynamicLink {\n constructor(linkResolver) {\n this.linkResolver = linkResolver;\n }\n async call(path, input, options) {\n const resolvedLink = await this.linkResolver(options, path, input);\n const output = await resolvedLink.call(path, input, options);\n return output;\n }\n}\n\nexport { DynamicLink, consumeEventIterator, createORPCClient, createSafeClient, isDefinedError, resolveFriendlyClientOptions, safe };\n","import { AsyncIteratorClass, startSpan, runInSpanContext, AbortError, parseEmptyableJSON, isTypescriptObject, setSpanError, stringifyJSON, runWithSpan, isAsyncIteratorObject, once } from '@orpc/shared';\nimport { EventDecoderStream, withEventMeta, ErrorEvent, encodeEventMessage, getEventMeta, getFilenameFromContentDisposition, generateContentDisposition } from '@orpc/standard-server';\n\nfunction toEventIterator(stream, options = {}) {\n const eventStream = stream?.pipeThrough(new TextDecoderStream()).pipeThrough(new EventDecoderStream());\n const reader = eventStream?.getReader();\n let span;\n let isCancelled = false;\n return new AsyncIteratorClass(async () => {\n span ??= startSpan(\"consume_event_iterator_stream\");\n try {\n while (true) {\n if (reader === void 0) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await runInSpanContext(span, () => reader.read());\n if (done) {\n if (isCancelled) {\n throw new AbortError(\"Stream was cancelled\");\n }\n return { done: true, value: void 0 };\n }\n switch (value.event) {\n case \"message\": {\n let message = parseEmptyableJSON(value.data);\n if (isTypescriptObject(message)) {\n message = withEventMeta(message, value);\n }\n span?.addEvent(\"message\");\n return { done: false, value: message };\n }\n case \"error\": {\n let error = new ErrorEvent({\n data: parseEmptyableJSON(value.data)\n });\n error = withEventMeta(error, value);\n span?.addEvent(\"error\");\n throw error;\n }\n case \"done\": {\n let done2 = parseEmptyableJSON(value.data);\n if (isTypescriptObject(done2)) {\n done2 = withEventMeta(done2, value);\n }\n span?.addEvent(\"done\");\n return { done: true, value: done2 };\n }\n default: {\n span?.addEvent(\"maybe_keepalive\");\n }\n }\n }\n } catch (e) {\n if (!(e instanceof ErrorEvent)) {\n setSpanError(span, e, options);\n }\n throw e;\n }\n }, async (reason) => {\n try {\n if (reason !== \"next\") {\n isCancelled = true;\n span?.addEvent(\"cancelled\");\n }\n await runInSpanContext(span, () => reader?.cancel());\n } catch (e) {\n setSpanError(span, e, options);\n throw e;\n } finally {\n span?.end();\n }\n });\n}\nfunction toEventStream(iterator, options = {}) {\n const keepAliveEnabled = options.eventIteratorKeepAliveEnabled ?? true;\n const keepAliveInterval = options.eventIteratorKeepAliveInterval ?? 5e3;\n const keepAliveComment = options.eventIteratorKeepAliveComment ?? \"\";\n const initialCommentEnabled = options.eventIteratorInitialCommentEnabled ?? true;\n const initialComment = options.eventIteratorInitialComment ?? \"\";\n let cancelled = false;\n let timeout;\n let span;\n const stream = new ReadableStream({\n start(controller) {\n span = startSpan(\"stream_event_iterator\");\n if (initialCommentEnabled) {\n controller.enqueue(encodeEventMessage({\n comments: [initialComment]\n }));\n }\n },\n async pull(controller) {\n try {\n if (keepAliveEnabled) {\n timeout = setInterval(() => {\n controller.enqueue(encodeEventMessage({\n comments: [keepAliveComment]\n }));\n span?.addEvent(\"keepalive\");\n }, keepAliveInterval);\n }\n const value = await runInSpanContext(span, () => iterator.next());\n clearInterval(timeout);\n if (cancelled) {\n return;\n }\n const meta = getEventMeta(value.value);\n if (!value.done || value.value !== void 0 || meta !== void 0) {\n const event = value.done ? \"done\" : \"message\";\n controller.enqueue(encodeEventMessage({\n ...meta,\n event,\n data: stringifyJSON(value.value)\n }));\n span?.addEvent(event);\n }\n if (value.done) {\n controller.close();\n span?.end();\n }\n } catch (err) {\n clearInterval(timeout);\n if (cancelled) {\n return;\n }\n if (err instanceof ErrorEvent) {\n controller.enqueue(encodeEventMessage({\n ...getEventMeta(err),\n event: \"error\",\n data: stringifyJSON(err.data)\n }));\n span?.addEvent(\"error\");\n controller.close();\n } else {\n setSpanError(span, err);\n controller.error(err);\n }\n span?.end();\n }\n },\n async cancel() {\n try {\n cancelled = true;\n clearInterval(timeout);\n span?.addEvent(\"cancelled\");\n await runInSpanContext(span, () => iterator.return?.());\n } catch (e) {\n setSpanError(span, e);\n throw e;\n } finally {\n span?.end();\n }\n }\n }).pipeThrough(new TextEncoderStream());\n return stream;\n}\n\nfunction toStandardBody(re, options = {}) {\n return runWithSpan(\n { name: \"parse_standard_body\", signal: options.signal },\n async () => {\n const contentDisposition = re.headers.get(\"content-disposition\");\n if (typeof contentDisposition === \"string\") {\n const fileName = getFilenameFromContentDisposition(contentDisposition) ?? \"blob\";\n const blob2 = await re.blob();\n return new File([blob2], fileName, {\n type: blob2.type\n });\n }\n const contentType = re.headers.get(\"content-type\");\n if (!contentType || contentType.startsWith(\"application/json\")) {\n const text = await re.text();\n return parseEmptyableJSON(text);\n }\n if (contentType.startsWith(\"multipart/form-data\")) {\n return await re.formData();\n }\n if (contentType.startsWith(\"application/x-www-form-urlencoded\")) {\n const text = await re.text();\n return new URLSearchParams(text);\n }\n if (contentType.startsWith(\"text/event-stream\")) {\n return toEventIterator(re.body, options);\n }\n if (contentType.startsWith(\"text/plain\")) {\n return await re.text();\n }\n const blob = await re.blob();\n return new File([blob], \"blob\", {\n type: blob.type\n });\n }\n );\n}\nfunction toFetchBody(body, headers, options = {}) {\n if (body instanceof ReadableStream) {\n return body;\n }\n const currentContentDisposition = headers.get(\"content-disposition\");\n headers.delete(\"content-type\");\n headers.delete(\"content-disposition\");\n if (body === void 0) {\n return void 0;\n }\n if (body instanceof Blob) {\n headers.set(\"content-type\", body.type);\n headers.set(\"content-length\", body.size.toString());\n headers.set(\n \"content-disposition\",\n currentContentDisposition ?? generateContentDisposition(body instanceof File ? body.name : \"blob\")\n );\n return body;\n }\n if (body instanceof FormData) {\n return body;\n }\n if (body instanceof URLSearchParams) {\n return body;\n }\n if (isAsyncIteratorObject(body)) {\n headers.set(\"content-type\", \"text/event-stream\");\n return toEventStream(body, options);\n }\n headers.set(\"content-type\", \"application/json\");\n return stringifyJSON(body);\n}\n\nfunction toStandardHeaders(headers, standardHeaders = {}) {\n headers.forEach((value, key) => {\n if (Array.isArray(standardHeaders[key])) {\n standardHeaders[key].push(value);\n } else if (standardHeaders[key] !== void 0) {\n standardHeaders[key] = [standardHeaders[key], value];\n } else {\n standardHeaders[key] = value;\n }\n });\n return standardHeaders;\n}\nfunction toFetchHeaders(headers, fetchHeaders = new Headers()) {\n for (const [key, value] of Object.entries(headers)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n fetchHeaders.append(key, v);\n }\n } else if (value !== void 0) {\n fetchHeaders.append(key, value);\n }\n }\n return fetchHeaders;\n}\n\nfunction toStandardLazyRequest(request) {\n return {\n url: new URL(request.url),\n signal: request.signal,\n method: request.method,\n body: once(() => toStandardBody(request, { signal: request.signal })),\n get headers() {\n const headers = toStandardHeaders(request.headers);\n Object.defineProperty(this, \"headers\", { value: headers, writable: true });\n return headers;\n },\n set headers(value) {\n Object.defineProperty(this, \"headers\", { value, writable: true });\n }\n };\n}\nfunction toFetchRequest(request, options = {}) {\n const headers = toFetchHeaders(request.headers);\n const body = toFetchBody(request.body, headers, options);\n return new Request(request.url, {\n signal: request.signal,\n method: request.method,\n headers,\n body\n });\n}\n\nfunction toFetchResponse(response, options = {}) {\n const headers = toFetchHeaders(response.headers);\n const body = toFetchBody(response.body, headers, options);\n return new Response(body, { headers, status: response.status });\n}\nfunction toStandardLazyResponse(response, options = {}) {\n return {\n body: once(() => toStandardBody(response, options)),\n status: response.status,\n get headers() {\n const headers = toStandardHeaders(response.headers);\n Object.defineProperty(this, \"headers\", { value: headers, writable: true });\n return headers;\n },\n set headers(value) {\n Object.defineProperty(this, \"headers\", { value, writable: true });\n }\n };\n}\n\nexport { toEventIterator, toEventStream, toFetchBody, toFetchHeaders, toFetchRequest, toFetchResponse, toStandardBody, toStandardHeaders, toStandardLazyRequest, toStandardLazyResponse };\n","import { toArray, runWithSpan, ORPC_NAME, isAsyncIteratorObject, asyncIteratorWithSpan, intercept, getGlobalOtelConfig, isObject, value, stringifyJSON } from '@orpc/shared';\nimport { mergeStandardHeaders, ErrorEvent } from '@orpc/standard-server';\nimport { C as COMMON_ORPC_ERROR_DEFS, d as isORPCErrorStatus, e as isORPCErrorJson, g as createORPCErrorFromJson, c as ORPCError, t as toORPCError } from './client.KWZYf6QD.mjs';\nimport { toStandardHeaders as toStandardHeaders$1 } from '@orpc/standard-server-fetch';\nimport { m as mapEventIterator } from './client.BLtwTQUg.mjs';\n\nclass CompositeStandardLinkPlugin {\n plugins;\n constructor(plugins = []) {\n this.plugins = [...plugins].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n init(options) {\n for (const plugin of this.plugins) {\n plugin.init?.(options);\n }\n }\n}\n\nclass StandardLink {\n constructor(codec, sender, options = {}) {\n this.codec = codec;\n this.sender = sender;\n const plugin = new CompositeStandardLinkPlugin(options.plugins);\n plugin.init(options);\n this.interceptors = toArray(options.interceptors);\n this.clientInterceptors = toArray(options.clientInterceptors);\n }\n interceptors;\n clientInterceptors;\n call(path, input, options) {\n return runWithSpan(\n { name: `${ORPC_NAME}.${path.join(\"/\")}`, signal: options.signal },\n (span) => {\n span?.setAttribute(\"rpc.system\", ORPC_NAME);\n span?.setAttribute(\"rpc.method\", path.join(\".\"));\n if (isAsyncIteratorObject(input)) {\n input = asyncIteratorWithSpan(\n { name: \"consume_event_iterator_input\", signal: options.signal },\n input\n );\n }\n return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {\n const otelConfig = getGlobalOtelConfig();\n let otelContext;\n const currentSpan = otelConfig?.trace.getActiveSpan() ?? span;\n if (currentSpan && otelConfig) {\n otelContext = otelConfig?.trace.setSpan(otelConfig.context.active(), currentSpan);\n }\n const request = await runWithSpan(\n { name: \"encode_request\", context: otelContext },\n () => this.codec.encode(path2, input2, options2)\n );\n const response = await intercept(\n this.clientInterceptors,\n { ...options2, input: input2, path: path2, request },\n ({ input: input3, path: path3, request: request2, ...options3 }) => {\n return runWithSpan(\n { name: \"send_request\", signal: options3.signal, context: otelContext },\n () => this.sender.call(request2, options3, path3, input3)\n );\n }\n );\n const output = await runWithSpan(\n { name: \"decode_response\", context: otelContext },\n () => this.codec.decode(response, options2, path2, input2)\n );\n if (isAsyncIteratorObject(output)) {\n return asyncIteratorWithSpan(\n { name: \"consume_event_iterator_output\", signal: options2.signal },\n output\n );\n }\n return output;\n });\n }\n );\n }\n}\n\nconst STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES = {\n BIGINT: 0,\n DATE: 1,\n NAN: 2,\n UNDEFINED: 3,\n URL: 4,\n REGEXP: 5,\n SET: 6,\n MAP: 7\n};\nclass StandardRPCJsonSerializer {\n customSerializers;\n constructor(options = {}) {\n this.customSerializers = options.customJsonSerializers ?? [];\n if (this.customSerializers.length !== new Set(this.customSerializers.map((custom) => custom.type)).size) {\n throw new Error(\"Custom serializer type must be unique.\");\n }\n }\n serialize(data, segments = [], meta = [], maps = [], blobs = []) {\n for (const custom of this.customSerializers) {\n if (custom.condition(data)) {\n const result = this.serialize(custom.serialize(data), segments, meta, maps, blobs);\n meta.push([custom.type, ...segments]);\n return result;\n }\n }\n if (data instanceof Blob) {\n maps.push(segments);\n blobs.push(data);\n return [data, meta, maps, blobs];\n }\n if (typeof data === \"bigint\") {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT, ...segments]);\n return [data.toString(), meta, maps, blobs];\n }\n if (data instanceof Date) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.DATE, ...segments]);\n if (Number.isNaN(data.getTime())) {\n return [null, meta, maps, blobs];\n }\n return [data.toISOString(), meta, maps, blobs];\n }\n if (Number.isNaN(data)) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN, ...segments]);\n return [null, meta, maps, blobs];\n }\n if (data instanceof URL) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL, ...segments]);\n return [data.toString(), meta, maps, blobs];\n }\n if (data instanceof RegExp) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.REGEXP, ...segments]);\n return [data.toString(), meta, maps, blobs];\n }\n if (data instanceof Set) {\n const result = this.serialize(Array.from(data), segments, meta, maps, blobs);\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET, ...segments]);\n return result;\n }\n if (data instanceof Map) {\n const result = this.serialize(Array.from(data.entries()), segments, meta, maps, blobs);\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.MAP, ...segments]);\n return result;\n }\n if (Array.isArray(data)) {\n const json = data.map((v, i) => {\n if (v === void 0) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED, ...segments, i]);\n return null;\n }\n return this.serialize(v, [...segments, i], meta, maps, blobs)[0];\n });\n return [json, meta, maps, blobs];\n }\n if (isObject(data)) {\n const json = {};\n for (const k in data) {\n if (k === \"toJSON\" && typeof data[k] === \"function\") {\n continue;\n }\n json[k] = this.serialize(data[k], [...segments, k], meta, maps, blobs)[0];\n }\n return [json, meta, maps, blobs];\n }\n return [data, meta, maps, blobs];\n }\n deserialize(json, meta, maps, getBlob) {\n const ref = { data: json };\n if (maps && getBlob) {\n maps.forEach((segments, i) => {\n let currentRef = ref;\n let preSegment = \"data\";\n segments.forEach((segment) => {\n currentRef = currentRef[preSegment];\n preSegment = segment;\n if (!Object.hasOwn(currentRef, preSegment)) {\n throw new Error(`Security error: accessing non-existent path during deserialization. Path segment: ${preSegment}`);\n }\n });\n currentRef[preSegment] = getBlob(i);\n });\n }\n for (const item of meta) {\n const type = item[0];\n let currentRef = ref;\n let preSegment = \"data\";\n for (let i = 1; i < item.length; i++) {\n currentRef = currentRef[preSegment];\n preSegment = item[i];\n if (!Object.hasOwn(currentRef, preSegment)) {\n throw new Error(`Security error: accessing non-existent path during deserialization. Path segment: ${preSegment}`);\n }\n }\n for (const custom of this.customSerializers) {\n if (custom.type === type) {\n currentRef[preSegment] = custom.deserialize(currentRef[preSegment]);\n break;\n }\n }\n switch (type) {\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT:\n currentRef[preSegment] = BigInt(currentRef[preSegment]);\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.DATE:\n currentRef[preSegment] = new Date(currentRef[preSegment] ?? \"Invalid Date\");\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN:\n currentRef[preSegment] = Number.NaN;\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED:\n currentRef[preSegment] = void 0;\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL:\n currentRef[preSegment] = new URL(currentRef[preSegment]);\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.REGEXP: {\n const [, pattern, flags] = currentRef[preSegment].match(/^\\/(.*)\\/([a-z]*)$/);\n currentRef[preSegment] = new RegExp(pattern, flags);\n break;\n }\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET:\n currentRef[preSegment] = new Set(currentRef[preSegment]);\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.MAP:\n currentRef[preSegment] = new Map(currentRef[preSegment]);\n break;\n }\n }\n return ref.data;\n }\n}\n\nfunction toHttpPath(path) {\n return `/${path.map(encodeURIComponent).join(\"/\")}`;\n}\nfunction toStandardHeaders(headers) {\n if (typeof headers.forEach === \"function\") {\n return toStandardHeaders$1(headers);\n }\n return headers;\n}\nfunction getMalformedResponseErrorCode(status) {\n return Object.entries(COMMON_ORPC_ERROR_DEFS).find(([, def]) => def.status === status)?.[0] ?? \"MALFORMED_ORPC_ERROR_RESPONSE\";\n}\n\nclass StandardRPCLinkCodec {\n constructor(serializer, options) {\n this.serializer = serializer;\n this.baseUrl = options.url;\n this.maxUrlLength = options.maxUrlLength ?? 2083;\n this.fallbackMethod = options.fallbackMethod ?? \"POST\";\n this.expectedMethod = options.method ?? this.fallbackMethod;\n this.headers = options.headers ?? {};\n }\n baseUrl;\n maxUrlLength;\n fallbackMethod;\n expectedMethod;\n headers;\n async encode(path, input, options) {\n let headers = toStandardHeaders(await value(this.headers, options, path, input));\n if (options.lastEventId !== void 0) {\n headers = mergeStandardHeaders(headers, { \"last-event-id\": options.lastEventId });\n }\n const expectedMethod = await value(this.expectedMethod, options, path, input);\n const baseUrl = await value(this.baseUrl, options, path, input);\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, \"\")}${toHttpPath(path)}`;\n const serialized = this.serializer.serialize(input);\n if (expectedMethod === \"GET\" && !(serialized instanceof FormData) && !isAsyncIteratorObject(serialized)) {\n const maxUrlLength = await value(this.maxUrlLength, options, path, input);\n const getUrl = new URL(url);\n getUrl.searchParams.append(\"data\", stringifyJSON(serialized));\n if (getUrl.toString().length <= maxUrlLength) {\n return {\n body: void 0,\n method: expectedMethod,\n headers,\n url: getUrl,\n signal: options.signal\n };\n }\n }\n return {\n url,\n method: expectedMethod === \"GET\" ? this.fallbackMethod : expectedMethod,\n headers,\n body: serialized,\n signal: options.signal\n };\n }\n async decode(response) {\n const isOk = !isORPCErrorStatus(response.status);\n const deserialized = await (async () => {\n let isBodyOk = false;\n try {\n const body = await response.body();\n isBodyOk = true;\n return this.serializer.deserialize(body);\n } catch (error) {\n if (!isBodyOk) {\n throw new Error(\"Cannot parse response body, please check the response body and content-type.\", {\n cause: error\n });\n }\n throw new Error(\"Invalid RPC response format.\", {\n cause: error\n });\n }\n })();\n if (!isOk) {\n if (isORPCErrorJson(deserialized)) {\n throw createORPCErrorFromJson(deserialized);\n }\n throw new ORPCError(getMalformedResponseErrorCode(response.status), {\n status: response.status,\n data: { ...response, body: deserialized }\n });\n }\n return deserialized;\n }\n}\n\nclass StandardRPCSerializer {\n constructor(jsonSerializer) {\n this.jsonSerializer = jsonSerializer;\n }\n serialize(data) {\n if (isAsyncIteratorObject(data)) {\n return mapEventIterator(data, {\n value: async (value) => this.#serialize(value, false),\n error: async (e) => {\n return new ErrorEvent({\n data: this.#serialize(toORPCError(e).toJSON(), false),\n cause: e\n });\n }\n });\n }\n return this.#serialize(data, true);\n }\n #serialize(data, enableFormData) {\n const [json, meta_, maps, blobs] = this.jsonSerializer.serialize(data);\n const meta = meta_.length === 0 ? void 0 : meta_;\n if (!enableFormData || blobs.length === 0) {\n return {\n json,\n meta\n };\n }\n const form = new FormData();\n form.set(\"data\", stringifyJSON({ json, meta, maps }));\n blobs.forEach((blob, i) => {\n form.set(i.toString(), blob);\n });\n return form;\n }\n deserialize(data) {\n if (isAsyncIteratorObject(data)) {\n return mapEventIterator(data, {\n value: async (value) => this.#deserialize(value),\n error: async (e) => {\n if (!(e instanceof ErrorEvent)) {\n return e;\n }\n const deserialized = this.#deserialize(e.data);\n if (isORPCErrorJson(deserialized)) {\n return createORPCErrorFromJson(deserialized, { cause: e });\n }\n return new ErrorEvent({\n data: deserialized,\n cause: e\n });\n }\n });\n }\n return this.#deserialize(data);\n }\n #deserialize(data) {\n if (data === void 0) {\n return void 0;\n }\n if (!(data instanceof FormData)) {\n return this.jsonSerializer.deserialize(data.json, data.meta ?? []);\n }\n const serialized = JSON.parse(data.get(\"data\"));\n return this.jsonSerializer.deserialize(\n serialized.json,\n serialized.meta ?? [],\n serialized.maps,\n (i) => data.get(i.toString())\n );\n }\n}\n\nclass StandardRPCLink extends StandardLink {\n constructor(linkClient, options) {\n const jsonSerializer = new StandardRPCJsonSerializer(options);\n const serializer = new StandardRPCSerializer(jsonSerializer);\n const linkCodec = new StandardRPCLinkCodec(serializer, options);\n super(linkCodec, linkClient, options);\n }\n}\n\nexport { CompositeStandardLinkPlugin as C, StandardLink as S, STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES as a, StandardRPCJsonSerializer as b, StandardRPCLink as c, StandardRPCLinkCodec as d, StandardRPCSerializer as e, toStandardHeaders as f, getMalformedResponseErrorCode as g, toHttpPath as t };\n","import { toArray, intercept } from '@orpc/shared';\nimport { toFetchRequest, toStandardLazyResponse } from '@orpc/standard-server-fetch';\nimport { C as CompositeStandardLinkPlugin, c as StandardRPCLink } from '../../shared/client.DrB9nq_G.mjs';\nimport '@orpc/standard-server';\nimport '../../shared/client.KWZYf6QD.mjs';\nimport '../../shared/client.BLtwTQUg.mjs';\n\nclass CompositeLinkFetchPlugin extends CompositeStandardLinkPlugin {\n initRuntimeAdapter(options) {\n for (const plugin of this.plugins) {\n plugin.initRuntimeAdapter?.(options);\n }\n }\n}\n\nclass LinkFetchClient {\n fetch;\n toFetchRequestOptions;\n adapterInterceptors;\n constructor(options) {\n const plugin = new CompositeLinkFetchPlugin(options.plugins);\n plugin.initRuntimeAdapter(options);\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.toFetchRequestOptions = options;\n this.adapterInterceptors = toArray(options.adapterInterceptors);\n }\n async call(standardRequest, options, path, input) {\n const request = toFetchRequest(standardRequest, this.toFetchRequestOptions);\n const fetchResponse = await intercept(\n this.adapterInterceptors,\n { ...options, request, path, input, init: { redirect: \"manual\" } },\n ({ request: request2, path: path2, input: input2, init, ...options2 }) => this.fetch(request2, init, options2, path2, input2)\n );\n const lazyResponse = toStandardLazyResponse(fetchResponse, { signal: request.signal });\n return lazyResponse;\n }\n}\n\nclass RPCLink extends StandardRPCLink {\n constructor(options) {\n const linkClient = new LinkFetchClient(options);\n super(linkClient, options);\n }\n}\n\nexport { LinkFetchClient, RPCLink };\n","import { RPCLink } from \"@orpc/client/fetch\";\n\nexport type ORPCHttpClientOptions = {\n /** Base URL for the oRPC API (e.g., \"http://localhost:3001/api/v3\") */\n baseUrl: string;\n /** Optional function to get auth token for requests */\n getAuthToken?: () => string | Promise<string | undefined> | undefined;\n /** Optional custom headers or async function to get headers */\n headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);\n /** Optional custom fetch function for intercepting requests/responses */\n fetch?: typeof globalThis.fetch;\n /** Optional callback called with each response for handling Set-Cookie headers etc */\n onResponse?: (response: Response) => void | Promise<void>;\n};\n\nexport function createLink(options: ORPCHttpClientOptions) {\n return new RPCLink({\n url: options.baseUrl,\n headers: async () => {\n const baseHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Get custom headers (supports both static and async)\n const customHeaders = typeof options.headers === \"function\" ? await options.headers() : options.headers;\n\n if (customHeaders) {\n Object.assign(baseHeaders, customHeaders);\n }\n\n if (options.getAuthToken) {\n const token = await options.getAuthToken();\n if (token) {\n baseHeaders[\"Cookie\"] = `tourial-session=${token}`;\n }\n }\n\n return baseHeaders;\n },\n fetch:\n options.fetch || options.onResponse\n ? async (request, init) => {\n const fetchFn = options.fetch || globalThis.fetch;\n const response = await fetchFn(request, init);\n\n if (options.onResponse) {\n await options.onResponse(response);\n }\n\n return response;\n }\n : undefined,\n });\n}\n","import { createORPCClient } from \"@orpc/client\";\nimport type { RouterClient } from \"@orpc/server\";\nimport { createLink, type ORPCHttpClientOptions } from \"../shared/client\";\nimport type { LiveRouter } from \"./router\";\n\n/** Type-safe HTTP client for the live oRPC API */\nexport type LiveHttpClient = RouterClient<LiveRouter>;\n\n/**\n * Create an HTTP client for calling live oRPC API endpoints\n */\nexport function createLiveHttpClient(options: ORPCHttpClientOptions): LiveHttpClient {\n return createORPCClient<LiveHttpClient>(createLink(options));\n}\n","import { createLiveHttpClient, type LiveHttpClient } from \"@navless/orpc/live/client\";\n\n/**\n * Normalize a branded-host origin into the `/api/v3` base the live API is served\n * under. Accepts a bare origin (\"https://guide.acme.com\") or a URL that already\n * ends with `/api/v3`.\n */\nexport function toApiBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, \"\");\n return trimmed.endsWith(\"/api/v3\") ? trimmed : `${trimmed}/api/v3`;\n}\n\n/**\n * Wrap a fetch implementation so every request carries the visitor cookies.\n * This is the load-bearing piece: the branded host is same-site with the\n * customer's page, so `credentials: \"include\"` lets the existing\n * `navless-live-*` cookies attach in every browser.\n */\nexport function withCredentials(fetchImpl: typeof globalThis.fetch): typeof globalThis.fetch {\n return (input, init) => fetchImpl(input, { ...init, credentials: \"include\" });\n}\n\n/** Build the typed live oRPC client, reusing @navless/orpc's client factory. */\nexport function createApiClient(apiBaseUrl: string, fetchImpl: typeof globalThis.fetch): LiveHttpClient {\n return createLiveHttpClient({ baseUrl: apiBaseUrl, fetch: withCredentials(fetchImpl) });\n}\n","const UTM_KEYS = [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_term\", \"utm_content\"] as const;\nconst INTEGRATION_COOKIE_KEYS = [\"hubspotutk\", \"_mkto_trk\"] as const;\n\n/** Pull UTM attribution params out of a `location.search` string. */\nexport function extractUTMParams(search: string): Record<string, string> {\n const params = new URLSearchParams(search);\n const result: Record<string, string> = {};\n for (const key of UTM_KEYS) {\n const value = params.get(key);\n if (value) result[key] = value;\n }\n return result;\n}\n\n/**\n * Pull first-party integration cookies (HubSpot, Marketo) out of a\n * `document.cookie` string so they can be forwarded for CRM stitching.\n */\nexport function extractIntegrationCookies(cookieString: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const key of INTEGRATION_COOKIE_KEYS) {\n const match = cookieString.match(new RegExp(`(?:^|;\\\\s*)${key}=([^;]*)`));\n if (match?.[1]) cookies[key] = decodeURIComponent(match[1]);\n }\n return cookies;\n}\n\n/** Read `document.cookie`, swallowing the SecurityError thrown in opaque origins. */\nexport function safeCookieString(): string {\n if (typeof document === \"undefined\") return \"\";\n try {\n return document.cookie;\n } catch {\n return \"\";\n }\n}\n","// This package is deliberately self-contained: it imports NO types from\n// @navless/types. That package is a barrel (`export *` over dozens of modules),\n// so importing any symbol drags the whole surface into the bundled .d.ts and the\n// dts bundler chokes on it. The wire-protocol enums below are stable contracts,\n// hand-mirrored here so the published package has zero @navless/* runtime deps\n// and a self-contained declaration file.\n\n/** AG-UI protocol frame types written by the guide SSE stream. */\nexport const SSEMessageType = {\n RunStarted: \"RUN_STARTED\",\n RunFinished: \"RUN_FINISHED\",\n RunError: \"RUN_ERROR\",\n TextMessageStart: \"TEXT_MESSAGE_START\",\n TextMessageContent: \"TEXT_MESSAGE_CONTENT\",\n TextMessageEnd: \"TEXT_MESSAGE_END\",\n Custom: \"CUSTOM\",\n} as const;\nexport type SSEMessageTypeName = (typeof SSEMessageType)[keyof typeof SSEMessageType];\n\n/** The `name` on `CUSTOM` guide events (skill payloads). */\nexport const GuideEvent = {\n SkillStart: \"skill_start\",\n SkillContent: \"skill_content\",\n SkillDocuments: \"skill_documents\",\n SkillRecommendations: \"skill_recommendations\",\n SkillCTAs: \"skill_ctas\",\n SkillDiagnoseHeader: \"skill_diagnose_header\",\n SkillDiagnoseQuestion: \"skill_diagnose_question\",\n SkillPlaylistItems: \"skill_playlist_items\",\n SkillPlaylistHeader: \"skill_playlist_header\",\n SkillPlaylistRationale: \"skill_playlist_rationale\",\n SkillHowToOutline: \"skill_howto_outline\",\n SkillHowToSteps: \"skill_howto_steps\",\n SkillBusinessCaseChooser: \"skill_businesscase_chooser\",\n SkillBusinessCaseDelta: \"skill_businesscase_delta\",\n SkillSolutionDesignHeader: \"skill_solutiondesign_header\",\n SkillSolutionDesignDiagram: \"skill_solutiondesign_diagram\",\n SkillEnd: \"skill_end\",\n SkillError: \"skill_error\",\n SkillGate: \"skill_gate\",\n InputSuggestions: \"input_suggestions\",\n} as const;\nexport type GuideEventName = (typeof GuideEvent)[keyof typeof GuideEvent];\n\n/** The guide skill types. `answer` is always on; the rest are enabled per-guide. */\nexport const SkillResponseType = {\n Answer: \"answer\",\n HowTo: \"howto\",\n Diagnose: \"diagnose\",\n Recommend: \"recommend\",\n Playlist: \"playlist\",\n BusinessCase: \"businesscase\",\n SolutionDesign: \"solutiondesign\",\n} as const;\nexport type SkillResponseTypeType = (typeof SkillResponseType)[keyof typeof SkillResponseType];\n\n/** Consent tiers. `essential` is always granted server-side. */\nexport const ConsentTier = {\n Essential: \"essential\",\n Functional: \"functional\",\n Analytical: \"analytical\",\n} as const;\nexport type ConsentTierName = (typeof ConsentTier)[keyof typeof ConsentTier];\n\n/** Analytics events fired by the SDK bootstrap. */\nexport const EmbedTrackingEvent = {\n EmbedLoaded: \"embed_loaded\",\n EmbedPageView: \"embed_page_view\",\n EmbedTriggerClicked: \"embed_trigger_clicked\",\n EmbedSideTabClicked: \"embed_side_tab_clicked\",\n EmbedSideTabDismissed: \"embed_side_tab_dismissed\",\n} as const;\nexport type EmbedTrackingEventName = (typeof EmbedTrackingEvent)[keyof typeof EmbedTrackingEvent];\n\n/**\n * The `eventType` passed to {@link GuideClient.track}. Any server-recognized\n * event string is accepted — use an {@link EmbedTrackingEvent} member for the\n * common cases.\n */\nexport type TrackEventType = string;\n\n/** Consent tiers a visitor can grant. `essential` is always granted server-side. */\nexport interface ConsentLevels {\n functional?: boolean;\n analytical?: boolean;\n}\n\nexport interface ConsentFlags {\n essential: boolean;\n functional: boolean;\n analytical: boolean;\n}\n\n/** Per-guide UI copy overrides. */\nexport interface GuideCustomization {\n welcomeMessage?: string;\n chatInputPlaceholders?: string[];\n suggestionsTitle?: string;\n helpTitle?: string;\n pickUpWhereYouLeftOff?: string;\n showGuideName?: boolean;\n sideTabButtonText?: string;\n pdfDisclaimerLine1?: string;\n pdfDisclaimerLine2?: string;\n pdfDownloadDescription?: string;\n}\n\n/** Lightweight knowledge-graph snapshot for page-load visualization. */\nexport interface GuideGraphSnapshot {\n nodes: Array<{ id: string; name: string; type: string; tier: number }>;\n edges: Array<{ from: string; to: string; relationship: string; strength: number }>;\n}\n\n/**\n * Resolved guide metadata returned by `guides.resolve`. `theme` / `skillIconStyle`\n * are left as `unknown` in v1 — read them defensively or narrow as needed.\n */\nexport interface ResolvedGuide {\n id: string;\n name: string;\n slug: string;\n brandKitId: string | null;\n magicLinkFormId: string | null;\n accountId: string;\n companyName: string;\n gdprEnabled: boolean;\n advancedSettings: { gatePdfDownload: boolean };\n theme: unknown;\n skillIconStyle: unknown;\n faviconUrl: string | null;\n logoUrl: string | null;\n heroImageUrl: string | null;\n customization: GuideCustomization | null;\n graphSnapshot: GuideGraphSnapshot | null;\n}\n\n/** A conversation record. */\nexport interface Conversation {\n id: string;\n accountId: string;\n guideId: string;\n visitorId: string;\n sessionId: string;\n title: string | null;\n createdAt: Date;\n deletedAt: Date | null;\n}\n\n/** A persisted conversation message. */\nexport interface ConversationMessage {\n id: string;\n accountId: string;\n conversationId: string;\n role: \"human\" | \"assistant\";\n content: string | null;\n isSynthetic: boolean;\n createdAt: Date;\n deletedAt: Date | null;\n}\n\n/** A conversation plus a page of its messages. */\nexport interface ConversationWithMessages {\n conversation: Conversation;\n messages: ConversationMessage[];\n}\n\n/** A persisted skill deliverable. `data` shape varies by `type`. */\nexport interface SkillInstance {\n id: string;\n skillOutputId: string;\n accountId: string;\n conversationId: string;\n type: SkillResponseTypeType;\n visitorId: string;\n sessionId: string;\n title: string | null;\n data: Record<string, unknown>;\n surfacedCta: unknown;\n sharedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n deletedAt: Date | null;\n}\n\n/** A skill instance as returned in history lists (no `data`/`surfacedCta`). */\nexport interface SkillHistoryInstance {\n id: string;\n skillOutputId: string;\n accountId: string;\n conversationId: string;\n type: SkillResponseTypeType;\n visitorId: string;\n sessionId: string;\n title: string | null;\n sharedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n deletedAt: Date | null;\n stepsCompleted: number | null;\n totalSteps: number | null;\n}\n\n/** Skill history grouped by conversation. */\nexport interface SkillHistoryGroup {\n conversationId: string;\n conversationTitle: string | null;\n latestActivityAt: Date;\n instances: SkillHistoryInstance[];\n}\n\nexport interface UpdateSkillInstanceResult {\n id: string;\n data: Record<string, unknown>;\n updatedAt: Date;\n}\n\nexport interface SelectDraftResult {\n skillInstanceId: string | null;\n}\n\nexport interface MarkSharedResult {\n sharedAt: Date;\n}\n\nexport interface ImportSharedResult {\n skillInstanceId: string;\n type: SkillResponseTypeType;\n conversationId: string;\n}\n\n/** The current visitor's tracking + consent + email status. */\nexport interface VisitorStatus {\n visitorId: string;\n isTracked: boolean;\n consent: { functional: boolean; analytical: boolean };\n email: string | null;\n verified: boolean;\n}\n\n/** Result of an email-gate submission. */\nexport interface SubmitGateResult {\n success: boolean;\n needsVerification: boolean;\n}\n\n/** Optional lead-capture fields beyond the ones the SDK fills automatically. */\nexport interface SubmitGateOptions {\n redirectUrl?: string;\n skill?: string;\n prompt?: string;\n skillInstanceId?: string;\n hostUrl?: string;\n requireVerification?: boolean;\n downloadIntent?: boolean;\n shareIntent?: boolean;\n}\n\nexport interface InitGuideConfig {\n /**\n * Branded host origin the SDK talks to, e.g. \"https://guide.acme.com\". Must be\n * on the customer's own root domain so the visitor cookies stay same-site.\n * `/api/v3` is appended automatically.\n */\n baseUrl: string;\n /** Guide slug to resolve (e.g. \"default\"). */\n slug: string;\n /**\n * Host domain used for account resolution + attribution. Defaults to\n * `window.location.hostname`. Required when running without a browser window.\n */\n domain?: string;\n /**\n * Consent handling on init:\n * - `\"auto\"` (default): grant all tiers when the guide has GDPR disabled; wait\n * for an explicit `setConsent()` when it is enabled.\n * - explicit levels: submit these immediately.\n * - `false`: submit nothing; call `setConsent()` yourself.\n */\n consent?: \"auto\" | ConsentLevels | false;\n /** Fire an initial `embed_loaded` + page-view event on init. Default `true`. */\n trackLoad?: boolean;\n /**\n * Custom fetch implementation (SSR/testing). Defaults to `globalThis.fetch`.\n * `credentials: \"include\"` is always applied so visitor cookies ride along.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/** A message in the SDK's in-memory conversation history. */\nexport interface ChatMessage {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AskOptions {\n /** Force a specific skill, bypassing server-side LLM routing. */\n forcedSkill?: SkillResponseTypeType;\n /** Abort the in-flight stream. */\n signal?: AbortSignal;\n}\n\n/**\n * A single event yielded by {@link GuideClient.ask}. The common case is `text`\n * (the streamed chat reply); `skill` carries every structured skill payload,\n * discriminated by its {@link GuideEventName} `name`.\n */\nexport type GuideStreamEvent =\n | { type: \"run-started\"; runId: string }\n | { type: \"message-start\"; messageId: string; role: string }\n | { type: \"text\"; messageId: string; delta: string }\n | { type: \"message-end\"; messageId: string }\n | { type: \"skill\"; name: GuideEventName; value: Record<string, unknown> }\n | { type: \"gate\"; skill: SkillResponseTypeType; prompt?: string; skillInstanceId?: string }\n | { type: \"error\"; message: string; code?: string }\n | { type: \"run-finished\"; finishReason?: string };\n","import { GuideEvent, SSEMessageType } from \"./types\";\nimport type { ChatMessage, GuideEventName, GuideStreamEvent, SkillResponseTypeType } from \"./types\";\n\nexport interface StreamConversationParams {\n apiBaseUrl: string;\n guideId: string;\n messages: ChatMessage[];\n forcedSkill?: SkillResponseTypeType;\n fetchImpl: typeof globalThis.fetch;\n signal?: AbortSignal;\n}\n\n/** Raw SSE frame as written by the API's `toSSE` adapter. */\ninterface SSEFrame {\n type: string;\n name?: string;\n value?: Record<string, unknown>;\n delta?: string;\n messageId?: string;\n role?: string;\n runId?: string;\n finishReason?: string;\n error?: { message: string; code?: string };\n}\n\nconst DATA_PREFIX = \"data:\";\nconst DONE_SENTINEL = \"[DONE]\";\n\n/**\n * Stream a guide chat turn. POSTs the conversation to the SSE route\n * (`/api/v3/guide/conversation`) and yields normalized {@link GuideStreamEvent}s\n * until the server writes `data: [DONE]`. This is the one endpoint that is not\n * part of the typed oRPC router, so it is spoken by hand here.\n */\nexport async function* streamConversation(params: StreamConversationParams): AsyncGenerator<GuideStreamEvent> {\n const { apiBaseUrl, guideId, messages, forcedSkill, fetchImpl, signal } = params;\n\n const body: Record<string, unknown> = {\n guideId,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n };\n if (forcedSkill) body.forcedSkill = forcedSkill;\n\n const response = await fetchImpl(`${apiBaseUrl}/guide/conversation`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok || !response.body) {\n throw new Error(`[brand_brain] Conversation request failed with status ${response.status}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separatorIndex = buffer.indexOf(\"\\n\\n\");\n while (separatorIndex !== -1) {\n const rawEvent = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + 2);\n separatorIndex = buffer.indexOf(\"\\n\\n\");\n\n const dataLine = rawEvent.split(\"\\n\").find((line) => line.startsWith(DATA_PREFIX));\n if (!dataLine) continue;\n\n const data = dataLine.slice(DATA_PREFIX.length).trim();\n if (data === DONE_SENTINEL) return;\n\n const mapped = mapFrame(JSON.parse(data) as SSEFrame);\n if (mapped) yield mapped;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction mapFrame(frame: SSEFrame): GuideStreamEvent | null {\n switch (frame.type) {\n case SSEMessageType.RunStarted:\n return { type: \"run-started\", runId: frame.runId ?? \"\" };\n case SSEMessageType.RunFinished:\n return { type: \"run-finished\", finishReason: frame.finishReason };\n case SSEMessageType.RunError:\n return { type: \"error\", message: frame.error?.message ?? \"Unknown error\", code: frame.error?.code };\n case SSEMessageType.TextMessageStart:\n return { type: \"message-start\", messageId: frame.messageId ?? \"\", role: frame.role ?? \"assistant\" };\n case SSEMessageType.TextMessageContent:\n return { type: \"text\", messageId: frame.messageId ?? \"\", delta: frame.delta ?? \"\" };\n case SSEMessageType.TextMessageEnd:\n return { type: \"message-end\", messageId: frame.messageId ?? \"\" };\n case SSEMessageType.Custom:\n return mapCustomFrame(frame);\n default:\n return null;\n }\n}\n\nfunction mapCustomFrame(frame: SSEFrame): GuideStreamEvent | null {\n if (!frame.name) return null;\n const value = frame.value ?? {};\n\n // Wire-boundary reads: `value` is untyped JSON from the SSE stream, so the\n // fields below are asserted against the shapes the API's toSSE adapter writes.\n if (frame.name === GuideEvent.SkillGate) {\n return {\n type: \"gate\",\n skill: value.skill as SkillResponseTypeType,\n prompt: value.prompt as string | undefined,\n skillInstanceId: value.skillInstanceId as string | undefined,\n };\n }\n if (frame.name === GuideEvent.SkillError) {\n return {\n type: \"error\",\n message: (value.message as string | undefined) ?? \"Skill error\",\n code: value.errorType as string | undefined,\n };\n }\n return { type: \"skill\", name: frame.name as GuideEventName, value };\n}\n","import type { LiveHttpClient } from \"@navless/orpc/live/client\";\nimport { createApiClient, toApiBaseUrl } from \"./api\";\nimport { extractIntegrationCookies, extractUTMParams, safeCookieString } from \"./analytics\";\nimport { streamConversation } from \"./chat-stream\";\nimport { EmbedTrackingEvent } from \"./types\";\nimport type {\n AskOptions,\n ChatMessage,\n ConsentLevels,\n Conversation,\n ConversationWithMessages,\n GuideStreamEvent,\n ImportSharedResult,\n InitGuideConfig,\n MarkSharedResult,\n ResolvedGuide,\n SelectDraftResult,\n SkillHistoryGroup,\n SkillInstance,\n SubmitGateOptions,\n SubmitGateResult,\n TrackEventType,\n UpdateSkillInstanceResult,\n VisitorStatus,\n} from \"./types\";\n\n// Explicit shapes for the grouped API namespaces, annotated with locally-authored\n// types rather than the deep @orpc/client-derived client types — so the published\n// .d.ts stays self-contained and never inlines an external type across chunks.\ninterface ConversationsApi {\n getOrCreate(): Promise<Conversation>;\n list(): Promise<Conversation[]>;\n get(conversationId: string, options?: { cursor?: string; limit?: number }): Promise<ConversationWithMessages>;\n delete(conversationId: string): Promise<Conversation>;\n}\n\ninterface SkillsApi {\n listHistory(): Promise<SkillHistoryGroup[]>;\n get(skillInstanceId: string): Promise<SkillInstance>;\n update(skillInstanceId: string, data: Record<string, unknown>): Promise<UpdateSkillInstanceResult>;\n selectDraft(draftId: string): Promise<SelectDraftResult>;\n markShared(skillInstanceId: string): Promise<MarkSharedResult>;\n importShared(sourceSkillInstanceId: string): Promise<ImportSharedResult>;\n}\n\nfunction resolveDomain(config: InitGuideConfig): string {\n if (config.domain) return config.domain;\n if (typeof window !== \"undefined\") return window.location.hostname;\n throw new Error(\"[brand_brain] `domain` is required when running without a browser `window`.\");\n}\n\ninterface GuideClientParams {\n guide: ResolvedGuide;\n apiBaseUrl: string;\n domain: string;\n fetchImpl: typeof globalThis.fetch;\n}\n\n/**\n * The client returned by {@link initGuide}. Holds the resolved guide, the\n * credentialed live API client, and the in-memory conversation history. Every\n * method reuses an existing public endpoint — the SDK adds no server surface.\n */\nexport class GuideClient {\n /** Resolved guide metadata (ids, theme, customization). */\n readonly guide: ResolvedGuide;\n\n private readonly apiBaseUrl: string;\n private readonly domain: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n // ECMAScript-private so the heavy LiveHttpClient type never reaches the .d.ts.\n #api: LiveHttpClient;\n private readonly history: ChatMessage[] = [];\n\n private constructor(params: GuideClientParams) {\n this.guide = params.guide;\n this.apiBaseUrl = params.apiBaseUrl;\n this.domain = params.domain;\n this.fetchImpl = params.fetchImpl;\n this.#api = createApiClient(this.apiBaseUrl, this.fetchImpl);\n }\n\n static async init(config: InitGuideConfig): Promise<GuideClient> {\n const fetchImpl = config.fetch ?? globalThis.fetch.bind(globalThis);\n const apiBaseUrl = toApiBaseUrl(config.baseUrl);\n const domain = resolveDomain(config);\n\n // First credentialed call — resolves the guide AND mints the visitor +\n // session cookies via the live router middleware.\n const api = createApiClient(apiBaseUrl, fetchImpl);\n const guide = await api.guides.resolve({ domain, slug: config.slug });\n const client = new GuideClient({ guide, apiBaseUrl, domain, fetchImpl });\n\n await client.applyInitialConsent(config.consent ?? \"auto\", guide.gdprEnabled);\n if (config.trackLoad ?? true) client.trackLoad();\n\n return client;\n }\n\n /** The account this guide belongs to (used implicitly by history calls). */\n get accountId(): string {\n return this.guide.accountId;\n }\n\n /** The in-memory conversation history accumulated by {@link ask}. */\n get messages(): readonly ChatMessage[] {\n return this.history;\n }\n\n /**\n * Send a message and stream the reply. Yields text deltas for the chat bubble\n * plus every structured skill event; the full 7-skill surface flows through\n * one stream. The user + assistant turns are appended to {@link messages}.\n */\n async *ask(message: string, options: AskOptions = {}): AsyncGenerator<GuideStreamEvent> {\n this.history.push({ id: crypto.randomUUID(), role: \"user\", content: message });\n\n let assistant: ChatMessage | null = null;\n for await (const event of streamConversation({\n apiBaseUrl: this.apiBaseUrl,\n guideId: this.guide.id,\n messages: this.history,\n forcedSkill: options.forcedSkill,\n fetchImpl: this.fetchImpl,\n signal: options.signal,\n })) {\n if (event.type === \"message-start\") {\n assistant = { id: event.messageId || crypto.randomUUID(), role: \"assistant\", content: \"\" };\n this.history.push(assistant);\n } else if (event.type === \"text\" && assistant) {\n assistant.content += event.delta;\n }\n yield event;\n }\n }\n\n /** Clear the in-memory conversation history (server-side history is unaffected). */\n reset(): void {\n this.history.length = 0;\n }\n\n /** Grant consent tiers. `essential` is always forced true server-side. */\n async setConsent(levels: ConsentLevels): Promise<void> {\n await this.#api.visitors.setConsent({ domain: this.domain, consent: levels });\n }\n\n /** Read the current visitor's tracking + consent + email status. */\n getStatus(): Promise<VisitorStatus> {\n return this.#api.visitors.getVisitorStatus();\n }\n\n /** Capture a lead email (sends a magic link when verification is required). */\n submitGate(email: string, options: SubmitGateOptions = {}): Promise<SubmitGateResult> {\n return this.#api.visitors.submitGate({ email, domain: this.domain, guideId: this.guide.id, ...options });\n }\n\n /**\n * Fire an analytics event. Fire-and-forget — never throws into the host page.\n * Uses a raw request (the same shape the embed script posts) so it stays\n * decoupled from the typed client's event enum.\n */\n track(eventType: TrackEventType, properties?: Record<string, unknown>): void {\n void this.fetchImpl(`${this.apiBaseUrl}/events/track`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ json: { domain: this.domain, guideId: this.guide.id, eventType, properties: properties ?? {} } }),\n }).catch(() => {\n // Best-effort — analytics must not break the host page.\n });\n }\n\n /** Fire the initial `embed_loaded` (with attribution) + first page view. */\n trackLoad(): void {\n const search = typeof window !== \"undefined\" ? window.location.search : \"\";\n const parentUrl = typeof window !== \"undefined\" ? window.location.href : undefined;\n const referrer = typeof document !== \"undefined\" ? document.referrer : undefined;\n this.track(EmbedTrackingEvent.EmbedLoaded, {\n referrer,\n parentUrl,\n utmParams: extractUTMParams(search),\n integrationCookies: extractIntegrationCookies(safeCookieString()),\n });\n this.trackPageView();\n }\n\n /** Record a page view (call on client-side route changes in an SPA). */\n trackPageView(url?: string): void {\n const pageUrl = url ?? (typeof window !== \"undefined\" ? window.location.href : undefined);\n this.track(EmbedTrackingEvent.EmbedPageView, { pageUrl });\n }\n\n /** End the current visit (best to call on `pagehide`). */\n async endSession(): Promise<void> {\n await this.#api.sessions.endSession();\n }\n\n /** Conversation history CRUD, scoped to this guide + account. */\n readonly conversations: ConversationsApi = {\n getOrCreate: () => this.#api.conversations.getOrCreate({ guideId: this.guide.id, accountId: this.guide.accountId }),\n list: () => this.#api.conversations.list({ guideId: this.guide.id, accountId: this.guide.accountId }),\n get: (conversationId: string, options?: { cursor?: string; limit?: number }) =>\n this.#api.conversations.get({ conversationId, accountId: this.guide.accountId, ...options }),\n delete: (conversationId: string) => this.#api.conversations.delete({ conversationId, accountId: this.guide.accountId }),\n };\n\n /** Persisted skill deliverables (how-to progress, diagnose answers, etc.). */\n readonly skills: SkillsApi = {\n listHistory: () => this.#api.skillInstances.listHistory({ accountId: this.guide.accountId, guideId: this.guide.id }),\n get: (skillInstanceId: string) => this.#api.skillInstances.get({ skillInstanceId }),\n update: (skillInstanceId: string, data: Record<string, unknown>) =>\n this.#api.skillInstances.update({ skillInstanceId, data }),\n selectDraft: (draftId: string) => this.#api.skillInstances.selectDraft({ draftId }),\n markShared: (skillInstanceId: string) => this.#api.skillInstances.markShared({ skillInstanceId }),\n importShared: (sourceSkillInstanceId: string) =>\n this.#api.skillInstances.importShared({ sourceSkillInstanceId, accountId: this.guide.accountId }),\n };\n\n private async applyInitialConsent(consent: \"auto\" | ConsentLevels | false, gdprEnabled: boolean): Promise<void> {\n if (consent === false) return;\n try {\n if (consent === \"auto\") {\n // Non-GDPR guides auto-grant everything (mirrors the live app). GDPR\n // guides wait for an explicit setConsent() from the host.\n if (!gdprEnabled) await this.setConsent({ functional: true, analytical: true });\n return;\n }\n await this.setConsent(consent);\n } catch {\n // Best-effort at init — the host can retry via setConsent() and inspect\n // getStatus(). Don't fail init on a consent hiccup.\n }\n }\n}\n\n/** Bootstrap a guide session and return a ready-to-use {@link GuideClient}. */\nexport async function initGuide(config: InitGuideConfig): Promise<GuideClient> {\n return GuideClient.init(config);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { initGuide, type GuideClient } from \"../GuideClient\";\nimport type { AskOptions, ChatMessage, InitGuideConfig, ResolvedGuide } from \"../types\";\n\nexport interface UseGuideResult {\n /** The client once bootstrapped, else `null`. */\n client: GuideClient | null;\n /** Resolved guide metadata once ready, else `null`. */\n guide: ResolvedGuide | null;\n /** Conversation history, kept in sync with the client. */\n messages: ChatMessage[];\n /** `true` once the client has finished initializing. */\n isReady: boolean;\n /** `true` while a reply is streaming. */\n isStreaming: boolean;\n /** Init or stream error, else `null`. */\n error: Error | null;\n /** Send a message and stream the reply into `messages`. */\n ask: (message: string, options?: AskOptions) => Promise<void>;\n /** Clear the in-memory conversation. */\n reset: () => void;\n}\n\n/**\n * React binding over {@link initGuide}. Bootstraps once per `baseUrl`+`slug`,\n * mirrors the streamed reply into state, and ends the session on unmount —\n * encapsulating the streaming/cleanup patterns so generated UIs stay correct.\n */\nexport function useGuide(config: InitGuideConfig): UseGuideResult {\n const [client, setClient] = useState<GuideClient | null>(null);\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const { baseUrl, slug } = config;\n const configRef = useRef(config);\n configRef.current = config;\n\n useEffect(() => {\n let active = true;\n let created: GuideClient | null = null;\n\n void initGuide(configRef.current)\n .then((instance) => {\n if (!active) {\n void instance.endSession();\n return;\n }\n created = instance;\n setClient(instance);\n setError(null);\n })\n .catch((err: unknown) => {\n if (active) setError(err instanceof Error ? err : new Error(String(err)));\n });\n\n return () => {\n active = false;\n void created?.endSession();\n };\n }, [baseUrl, slug]);\n\n const ask = useCallback(\n async (message: string, options?: AskOptions) => {\n if (!client) return;\n setIsStreaming(true);\n setError(null);\n try {\n for await (const event of client.ask(message, options)) {\n if (event.type === \"text\" || event.type === \"message-start\") {\n setMessages([...client.messages]);\n }\n }\n setMessages([...client.messages]);\n } catch (err: unknown) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsStreaming(false);\n }\n },\n [client],\n );\n\n const reset = useCallback(() => {\n client?.reset();\n setMessages([]);\n }, [client]);\n\n return {\n client,\n guide: client?.guide ?? null,\n messages,\n isReady: client !== null,\n isStreaming,\n error,\n ask,\n reset,\n };\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#cleanup","#next","#isDone","#isExecuteComplete","toStandardHeaders","#serialize","#deserialize","#api"],"sources":["../../../../node_modules/.pnpm/@orpc+shared@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/shared/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/shared/client.KWZYf6QD.mjs","../../../../node_modules/.pnpm/@orpc+standard-server@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/standard-server/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/shared/client.BLtwTQUg.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+standard-server-fetch@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/standard-server-fetch/dist/index.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/shared/client.DrB9nq_G.mjs","../../../../node_modules/.pnpm/@orpc+client@1.14.0_@opentelemetry+api@1.9.0/node_modules/@orpc/client/dist/adapters/fetch/index.mjs","../../../orpc/src/shared/client.ts","../../../orpc/src/live/client.ts","../../src/api.ts","../../src/analytics.ts","../../src/types.ts","../../src/chat-stream.ts","../../src/GuideClient.ts","../../src/skill-state.ts","../../src/react/useGuide.ts"],"sourcesContent":["export { group, guard, mapEntries, mapValues, omit, retry, sleep } from 'radash';\n\nfunction resolveMaybeOptionalOptions(rest) {\n return rest[0] ?? {};\n}\n\nfunction toArray(value) {\n return Array.isArray(value) ? value : value === void 0 || value === null ? [] : [value];\n}\nfunction splitInHalf(arr) {\n const half = Math.ceil(arr.length / 2);\n return [arr.slice(0, half), arr.slice(half)];\n}\n\nfunction readAsBuffer(source) {\n if (typeof source.bytes === \"function\") {\n return source.bytes();\n }\n return source.arrayBuffer();\n}\n\nconst ORPC_NAME = \"orpc\";\nconst ORPC_SHARED_PACKAGE_NAME = \"@orpc/shared\";\nconst ORPC_SHARED_PACKAGE_VERSION = \"1.14.0\";\n\nclass AbortError extends Error {\n constructor(...rest) {\n super(...rest);\n this.name = \"AbortError\";\n }\n}\n\nfunction once(fn) {\n let cached;\n return () => {\n if (cached) {\n return cached.result;\n }\n const result = fn();\n cached = { result };\n return result;\n };\n}\nfunction sequential(fn) {\n let lastOperationPromise = Promise.resolve();\n return (...args) => {\n return lastOperationPromise = lastOperationPromise.catch(() => {\n }).then(() => {\n return fn(...args);\n });\n };\n}\nfunction defer(callback) {\n if (typeof setTimeout === \"function\") {\n setTimeout(callback, 0);\n } else {\n Promise.resolve().then(() => Promise.resolve().then(() => Promise.resolve().then(callback)));\n }\n}\n\nconst SPAN_ERROR_STATUS = 2;\nconst GLOBAL_OTEL_CONFIG_KEY = `__${ORPC_SHARED_PACKAGE_NAME}@${ORPC_SHARED_PACKAGE_VERSION}/otel/config__`;\nfunction setGlobalOtelConfig(config) {\n globalThis[GLOBAL_OTEL_CONFIG_KEY] = config;\n}\nfunction getGlobalOtelConfig() {\n return globalThis[GLOBAL_OTEL_CONFIG_KEY];\n}\nfunction startSpan(name, options = {}, context) {\n const tracer = getGlobalOtelConfig()?.tracer;\n return tracer?.startSpan(name, options, context);\n}\nfunction setSpanError(span, error, options = {}) {\n if (!span) {\n return;\n }\n const exception = toOtelException(error);\n span.recordException(exception);\n if (!options.signal?.aborted || options.signal.reason !== error) {\n span.setStatus({\n code: SPAN_ERROR_STATUS,\n message: exception.message\n });\n }\n}\nfunction setSpanAttribute(span, key, value) {\n if (!span || value === void 0) {\n return;\n }\n span.setAttribute(key, value);\n}\nfunction toOtelException(error) {\n if (error instanceof Error) {\n const exception = {\n message: error.message,\n name: error.name,\n stack: error.stack\n };\n if (\"code\" in error && (typeof error.code === \"string\" || typeof error.code === \"number\")) {\n exception.code = error.code;\n }\n return exception;\n }\n return { message: String(error) };\n}\nfunction toSpanAttributeValue(data) {\n if (data === void 0) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(data, (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n if (value instanceof Map || value instanceof Set) {\n return Array.from(value);\n }\n return value;\n });\n } catch {\n return String(data);\n }\n}\nasync function runWithSpan({ name, context, ...options }, fn) {\n const tracer = getGlobalOtelConfig()?.tracer;\n if (!tracer) {\n return fn();\n }\n const callback = async (span) => {\n try {\n return await fn(span);\n } catch (e) {\n setSpanError(span, e, options);\n throw e;\n } finally {\n span.end();\n }\n };\n if (context) {\n return tracer.startActiveSpan(name, options, context, callback);\n } else {\n return tracer.startActiveSpan(name, options, callback);\n }\n}\nasync function runInSpanContext(span, fn) {\n const otelConfig = getGlobalOtelConfig();\n if (!span || !otelConfig) {\n return fn();\n }\n const ctx = otelConfig.trace.setSpan(otelConfig.context.active(), span);\n return otelConfig.context.with(ctx, fn);\n}\n\nclass AsyncIdQueue {\n openIds = /* @__PURE__ */ new Set();\n queues = /* @__PURE__ */ new Map();\n waiters = /* @__PURE__ */ new Map();\n get length() {\n return this.openIds.size;\n }\n get waiterIds() {\n return Array.from(this.waiters.keys());\n }\n hasBufferedItems(id) {\n return Boolean(this.queues.get(id)?.length);\n }\n open(id) {\n this.openIds.add(id);\n }\n isOpen(id) {\n return this.openIds.has(id);\n }\n push(id, item) {\n this.assertOpen(id);\n const pending = this.waiters.get(id);\n if (pending?.length) {\n pending.shift()[0](item);\n if (pending.length === 0) {\n this.waiters.delete(id);\n }\n } else {\n const items = this.queues.get(id);\n if (items) {\n items.push(item);\n } else {\n this.queues.set(id, [item]);\n }\n }\n }\n async pull(id) {\n this.assertOpen(id);\n const items = this.queues.get(id);\n if (items?.length) {\n const item = items.shift();\n if (items.length === 0) {\n this.queues.delete(id);\n }\n return item;\n }\n return new Promise((resolve, reject) => {\n const waitingPulls = this.waiters.get(id);\n const pending = [resolve, reject];\n if (waitingPulls) {\n waitingPulls.push(pending);\n } else {\n this.waiters.set(id, [pending]);\n }\n });\n }\n close({ id, reason } = {}) {\n if (id === void 0) {\n this.waiters.forEach((pendingPulls, id2) => {\n const error2 = reason ?? new AbortError(`[AsyncIdQueue] Queue[${id2}] was closed or aborted while waiting for pulling.`);\n pendingPulls.forEach(([, reject]) => reject(error2));\n });\n this.waiters.clear();\n this.openIds.clear();\n this.queues.clear();\n return;\n }\n const error = reason ?? new AbortError(`[AsyncIdQueue] Queue[${id}] was closed or aborted while waiting for pulling.`);\n this.waiters.get(id)?.forEach(([, reject]) => reject(error));\n this.waiters.delete(id);\n this.openIds.delete(id);\n this.queues.delete(id);\n }\n assertOpen(id) {\n if (!this.isOpen(id)) {\n throw new Error(`[AsyncIdQueue] Cannot access queue[${id}] because it is not open or aborted.`);\n }\n }\n}\n\nfunction isAsyncIteratorObject(maybe) {\n if (!maybe || typeof maybe !== \"object\") {\n return false;\n }\n return \"next\" in maybe && typeof maybe.next === \"function\" && Symbol.asyncIterator in maybe && typeof maybe[Symbol.asyncIterator] === \"function\";\n}\nconst fallbackAsyncDisposeSymbol = Symbol.for(\"asyncDispose\");\nconst asyncDisposeSymbol = Symbol.asyncDispose ?? fallbackAsyncDisposeSymbol;\nclass AsyncIteratorClass {\n #isDone = false;\n #isExecuteComplete = false;\n #cleanup;\n #next;\n constructor(next, cleanup) {\n this.#cleanup = cleanup;\n this.#next = sequential(async () => {\n if (this.#isDone) {\n return { done: true, value: void 0 };\n }\n try {\n const result = await next();\n if (result.done) {\n this.#isDone = true;\n }\n return result;\n } catch (err) {\n this.#isDone = true;\n throw err;\n } finally {\n if (this.#isDone && !this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"next\");\n }\n }\n });\n }\n next() {\n return this.#next();\n }\n async return(value) {\n this.#isDone = true;\n if (!this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"return\");\n }\n return { done: true, value };\n }\n async throw(err) {\n this.#isDone = true;\n if (!this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"throw\");\n }\n throw err;\n }\n /**\n * asyncDispose symbol only available in esnext, we should fallback to Symbol.for('asyncDispose')\n */\n async [asyncDisposeSymbol]() {\n this.#isDone = true;\n if (!this.#isExecuteComplete) {\n this.#isExecuteComplete = true;\n await this.#cleanup(\"dispose\");\n }\n }\n [Symbol.asyncIterator]() {\n return this;\n }\n}\nfunction replicateAsyncIterator(source, count) {\n const queue = new AsyncIdQueue();\n const ids = Array.from({ length: count }, (_, i) => i.toString());\n let isSourceFinished = false;\n const start = once(async () => {\n try {\n while (true) {\n const item = await source.next();\n ids.forEach((id) => {\n if (queue.isOpen(id)) {\n queue.push(id, { next: item });\n }\n });\n if (item.done) {\n break;\n }\n }\n } catch (error) {\n ids.forEach((id) => {\n if (queue.isOpen(id)) {\n queue.push(id, { error });\n }\n });\n } finally {\n isSourceFinished = true;\n }\n });\n const replicated = ids.map((id) => {\n queue.open(id);\n return new AsyncIteratorClass(\n async () => {\n start();\n const item = await queue.pull(id);\n if (item.next) {\n return item.next;\n }\n throw item.error;\n },\n async (reason) => {\n queue.close({ id });\n if (reason !== \"next\" && !queue.length && !isSourceFinished) {\n isSourceFinished = true;\n await source?.return?.();\n }\n }\n );\n });\n return replicated;\n}\nfunction asyncIteratorWithSpan({ name, ...options }, iterator) {\n let span;\n return new AsyncIteratorClass(\n async () => {\n span ??= startSpan(name);\n try {\n const result = await runInSpanContext(span, () => iterator.next());\n span?.addEvent(result.done ? \"completed\" : \"yielded\");\n return result;\n } catch (err) {\n setSpanError(span, err, options);\n throw err;\n }\n },\n async (reason) => {\n try {\n if (reason !== \"next\") {\n await runInSpanContext(span, () => iterator.return?.());\n }\n } catch (err) {\n setSpanError(span, err, options);\n throw err;\n } finally {\n span?.end();\n }\n }\n );\n}\n\nclass EventPublisher {\n #listenersMap = /* @__PURE__ */ new Map();\n #maxBufferedEvents;\n constructor(options = {}) {\n this.#maxBufferedEvents = options.maxBufferedEvents ?? 100;\n }\n get size() {\n return this.#listenersMap.size;\n }\n /**\n * Emits an event and delivers the payload to all subscribed listeners.\n */\n publish(event, payload) {\n const listeners = this.#listenersMap.get(event);\n if (!listeners) {\n return;\n }\n for (const listener of listeners) {\n listener(payload);\n }\n }\n subscribe(event, listenerOrOptions) {\n if (typeof listenerOrOptions === \"function\") {\n let listeners = this.#listenersMap.get(event);\n if (!listeners) {\n this.#listenersMap.set(event, listeners = []);\n }\n listeners.push(listenerOrOptions);\n return once(() => {\n listeners.splice(listeners.indexOf(listenerOrOptions), 1);\n if (listeners.length === 0) {\n this.#listenersMap.delete(event);\n }\n });\n }\n const signal = listenerOrOptions?.signal;\n const maxBufferedEvents = listenerOrOptions?.maxBufferedEvents ?? this.#maxBufferedEvents;\n signal?.throwIfAborted();\n const bufferedEvents = [];\n const pullResolvers = [];\n const unsubscribe = this.subscribe(event, (payload) => {\n const resolver = pullResolvers.shift();\n if (resolver) {\n resolver[0]({ done: false, value: payload });\n } else {\n bufferedEvents.push(payload);\n if (bufferedEvents.length > maxBufferedEvents) {\n bufferedEvents.shift();\n }\n }\n });\n const abortListener = (event2) => {\n unsubscribe();\n pullResolvers.forEach((resolver) => resolver[1](event2.target.reason));\n pullResolvers.length = 0;\n bufferedEvents.length = 0;\n };\n signal?.addEventListener(\"abort\", abortListener, { once: true });\n return new AsyncIteratorClass(async () => {\n if (signal?.aborted) {\n throw signal.reason;\n }\n if (bufferedEvents.length > 0) {\n return { done: false, value: bufferedEvents.shift() };\n }\n return new Promise((resolve, reject) => {\n pullResolvers.push([resolve, reject]);\n });\n }, async () => {\n unsubscribe();\n signal?.removeEventListener(\"abort\", abortListener);\n pullResolvers.forEach((resolver) => resolver[0]({ done: true, value: void 0 }));\n pullResolvers.length = 0;\n bufferedEvents.length = 0;\n });\n }\n}\n\nclass SequentialIdGenerator {\n index = BigInt(1);\n generate() {\n const id = this.index.toString(36);\n this.index++;\n return id;\n }\n}\nfunction compareSequentialIds(a, b) {\n if (a.length !== b.length) {\n return a.length - b.length;\n }\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction onStart(callback) {\n return async (options, ...rest) => {\n await callback(options, ...rest);\n return await options.next();\n };\n}\nfunction onSuccess(callback) {\n return async (options, ...rest) => {\n const result = await options.next();\n await callback(result, options, ...rest);\n return result;\n };\n}\nfunction onError(callback) {\n return async (options, ...rest) => {\n try {\n return await options.next();\n } catch (error) {\n await callback(error, options, ...rest);\n throw error;\n }\n };\n}\nfunction onFinish(callback) {\n let state;\n return async (options, ...rest) => {\n try {\n const result = await options.next();\n state = [null, result, true];\n return result;\n } catch (error) {\n state = [error, void 0, false];\n throw error;\n } finally {\n await callback(state, options, ...rest);\n }\n };\n}\nfunction intercept(interceptors, options, main) {\n const next = (options2, index) => {\n const interceptor = interceptors[index];\n if (!interceptor) {\n return main(options2);\n }\n return interceptor({\n ...options2,\n next: (newOptions = options2) => next(newOptions, index + 1)\n });\n };\n return next(options, 0);\n}\n\nfunction parseEmptyableJSON(text) {\n if (!text) {\n return void 0;\n }\n return JSON.parse(text);\n}\nfunction stringifyJSON(value) {\n return JSON.stringify(value);\n}\n\nfunction findDeepMatches(check, payload, segments = [], maps = [], values = []) {\n if (check(payload)) {\n maps.push(segments);\n values.push(payload);\n } else if (Array.isArray(payload)) {\n payload.forEach((v, i) => {\n findDeepMatches(check, v, [...segments, i], maps, values);\n });\n } else if (isObject(payload)) {\n for (const key in payload) {\n findDeepMatches(check, payload[key], [...segments, key], maps, values);\n }\n }\n return { maps, values };\n}\nfunction getConstructor(value) {\n if (!isTypescriptObject(value)) {\n return null;\n }\n return Object.getPrototypeOf(value)?.constructor;\n}\nfunction isObject(value) {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || !proto || !proto.constructor;\n}\nfunction isTypescriptObject(value) {\n return !!value && (typeof value === \"object\" || typeof value === \"function\");\n}\nfunction clone(value) {\n if (Array.isArray(value)) {\n return value.map(clone);\n }\n if (isObject(value)) {\n const result = {};\n for (const key in value) {\n result[key] = clone(value[key]);\n }\n for (const sym of Object.getOwnPropertySymbols(value)) {\n result[sym] = clone(value[sym]);\n }\n return result;\n }\n return value;\n}\nfunction get(object, path) {\n let current = object;\n for (const key of path) {\n if (!isTypescriptObject(current)) {\n return void 0;\n }\n current = current[key];\n }\n return current;\n}\nfunction isPropertyKey(value) {\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"symbol\";\n}\nconst NullProtoObj = /* @__PURE__ */ (() => {\n const e = function() {\n };\n e.prototype = /* @__PURE__ */ Object.create(null);\n Object.freeze(e.prototype);\n return e;\n})();\n\nfunction value(value2, ...args) {\n if (typeof value2 === \"function\") {\n return value2(...args);\n }\n return value2;\n}\nfunction fallback(value2, fallback2) {\n return value2 === void 0 ? fallback2 : value2;\n}\n\nfunction preventNativeAwait(target) {\n return new Proxy(target, {\n get(target2, prop, receiver) {\n const value2 = Reflect.get(target2, prop, receiver);\n if (prop !== \"then\" || typeof value2 !== \"function\") {\n return value2;\n }\n return new Proxy(value2, {\n apply(targetFn, thisArg, args) {\n if (args.length !== 2 || args.some((arg) => !isNativeFunction(arg))) {\n return Reflect.apply(targetFn, thisArg, args);\n }\n let shouldOmit = true;\n args[0].call(thisArg, preventNativeAwait(new Proxy(target2, {\n get: (target3, prop2, receiver2) => {\n if (shouldOmit && prop2 === \"then\") {\n shouldOmit = false;\n return void 0;\n }\n return Reflect.get(target3, prop2, receiver2);\n }\n })));\n }\n });\n }\n });\n}\nconst NATIVE_FUNCTION_REGEX = /^\\s*function\\s*\\(\\)\\s*\\{\\s*\\[native code\\]\\s*\\}\\s*$/;\nfunction isNativeFunction(fn) {\n return typeof fn === \"function\" && NATIVE_FUNCTION_REGEX.test(fn.toString());\n}\nfunction overlayProxy(target, partial) {\n const proxy = new Proxy(typeof target === \"function\" ? partial : target, {\n get(_, prop) {\n const targetValue = prop in partial ? partial : value(target);\n const v = Reflect.get(targetValue, prop);\n return typeof v === \"function\" ? v.bind(targetValue) : v;\n },\n has(_, prop) {\n return Reflect.has(partial, prop) || Reflect.has(value(target), prop);\n }\n });\n return proxy;\n}\n\nfunction streamToAsyncIteratorClass(stream) {\n const reader = stream.getReader();\n return new AsyncIteratorClass(\n async () => {\n return reader.read();\n },\n async () => {\n await reader.cancel();\n }\n );\n}\nfunction asyncIteratorToStream(iterator) {\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iterator.return?.();\n }\n });\n}\nfunction asyncIteratorToUnproxiedDataStream(iterator) {\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n const unproxied = isObject(value) ? { ...value } : Array.isArray(value) ? value.map((i) => i) : value;\n controller.enqueue(unproxied);\n }\n },\n async cancel() {\n await iterator.return?.();\n }\n });\n}\n\nfunction tryDecodeURIComponent(value) {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nexport { AbortError, AsyncIdQueue, AsyncIteratorClass, EventPublisher, NullProtoObj, ORPC_NAME, ORPC_SHARED_PACKAGE_NAME, ORPC_SHARED_PACKAGE_VERSION, SequentialIdGenerator, asyncIteratorToStream, asyncIteratorToUnproxiedDataStream, asyncIteratorWithSpan, clone, compareSequentialIds, defer, fallback, findDeepMatches, get, getConstructor, getGlobalOtelConfig, intercept, isAsyncIteratorObject, isObject, isPropertyKey, isTypescriptObject, onError, onFinish, onStart, onSuccess, once, overlayProxy, parseEmptyableJSON, preventNativeAwait, readAsBuffer, replicateAsyncIterator, resolveMaybeOptionalOptions, runInSpanContext, runWithSpan, sequential, setGlobalOtelConfig, setSpanAttribute, setSpanError, splitInHalf, startSpan, streamToAsyncIteratorClass, stringifyJSON, toArray, toOtelException, toSpanAttributeValue, tryDecodeURIComponent, value };\n","import { resolveMaybeOptionalOptions, getConstructor, isObject } from '@orpc/shared';\n\nconst ORPC_CLIENT_PACKAGE_NAME = \"@orpc/client\";\nconst ORPC_CLIENT_PACKAGE_VERSION = \"1.14.0\";\n\nconst COMMON_ORPC_ERROR_DEFS = {\n BAD_REQUEST: {\n status: 400,\n message: \"Bad Request\"\n },\n UNAUTHORIZED: {\n status: 401,\n message: \"Unauthorized\"\n },\n FORBIDDEN: {\n status: 403,\n message: \"Forbidden\"\n },\n NOT_FOUND: {\n status: 404,\n message: \"Not Found\"\n },\n METHOD_NOT_SUPPORTED: {\n status: 405,\n message: \"Method Not Supported\"\n },\n NOT_ACCEPTABLE: {\n status: 406,\n message: \"Not Acceptable\"\n },\n TIMEOUT: {\n status: 408,\n message: \"Request Timeout\"\n },\n CONFLICT: {\n status: 409,\n message: \"Conflict\"\n },\n PRECONDITION_FAILED: {\n status: 412,\n message: \"Precondition Failed\"\n },\n PAYLOAD_TOO_LARGE: {\n status: 413,\n message: \"Payload Too Large\"\n },\n UNSUPPORTED_MEDIA_TYPE: {\n status: 415,\n message: \"Unsupported Media Type\"\n },\n UNPROCESSABLE_CONTENT: {\n status: 422,\n message: \"Unprocessable Content\"\n },\n TOO_MANY_REQUESTS: {\n status: 429,\n message: \"Too Many Requests\"\n },\n CLIENT_CLOSED_REQUEST: {\n status: 499,\n message: \"Client Closed Request\"\n },\n INTERNAL_SERVER_ERROR: {\n status: 500,\n message: \"Internal Server Error\"\n },\n NOT_IMPLEMENTED: {\n status: 501,\n message: \"Not Implemented\"\n },\n BAD_GATEWAY: {\n status: 502,\n message: \"Bad Gateway\"\n },\n SERVICE_UNAVAILABLE: {\n status: 503,\n message: \"Service Unavailable\"\n },\n GATEWAY_TIMEOUT: {\n status: 504,\n message: \"Gateway Timeout\"\n }\n};\nfunction fallbackORPCErrorStatus(code, status) {\n return status ?? COMMON_ORPC_ERROR_DEFS[code]?.status ?? 500;\n}\nfunction fallbackORPCErrorMessage(code, message) {\n return message || COMMON_ORPC_ERROR_DEFS[code]?.message || code;\n}\nconst GLOBAL_ORPC_ERROR_CONSTRUCTORS_SYMBOL = Symbol.for(`__${ORPC_CLIENT_PACKAGE_NAME}@${ORPC_CLIENT_PACKAGE_VERSION}/error/ORPC_ERROR_CONSTRUCTORS__`);\nvoid (globalThis[GLOBAL_ORPC_ERROR_CONSTRUCTORS_SYMBOL] ??= /* @__PURE__ */ new WeakSet());\nconst globalORPCErrorConstructors = globalThis[GLOBAL_ORPC_ERROR_CONSTRUCTORS_SYMBOL];\nclass ORPCError extends Error {\n defined;\n code;\n status;\n data;\n constructor(code, ...rest) {\n const options = resolveMaybeOptionalOptions(rest);\n if (options.status !== void 0 && !isORPCErrorStatus(options.status)) {\n throw new Error(\"[ORPCError] Invalid error status code.\");\n }\n const message = fallbackORPCErrorMessage(code, options.message);\n super(message, options);\n this.code = code;\n this.status = fallbackORPCErrorStatus(code, options.status);\n this.defined = options.defined ?? false;\n this.data = options.data;\n }\n toJSON() {\n return {\n defined: this.defined,\n code: this.code,\n status: this.status,\n message: this.message,\n data: this.data\n };\n }\n /**\n * Workaround for Next.js where different contexts use separate\n * dependency graphs, causing multiple ORPCError constructors existing and breaking\n * `instanceof` checks across contexts.\n *\n * This is particularly problematic with \"Optimized SSR\", where orpc-client\n * executes in one context but is invoked from another. When an error is thrown\n * in the execution context, `instanceof ORPCError` checks fail in the\n * invocation context due to separate class constructors.\n *\n * @todo Remove this and related code if Next.js resolves the multiple dependency graph issue.\n */\n static [Symbol.hasInstance](instance) {\n if (globalORPCErrorConstructors.has(this)) {\n const constructor = getConstructor(instance);\n if (constructor && globalORPCErrorConstructors.has(constructor)) {\n return true;\n }\n }\n return super[Symbol.hasInstance](instance);\n }\n}\nglobalORPCErrorConstructors.add(ORPCError);\nfunction isDefinedError(error) {\n return error instanceof ORPCError && error.defined;\n}\nfunction toORPCError(error) {\n return error instanceof ORPCError ? error : new ORPCError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Internal server error\",\n cause: error\n });\n}\nfunction isORPCErrorStatus(status) {\n return status < 200 || status >= 400;\n}\nfunction isORPCErrorJson(json) {\n if (!isObject(json)) {\n return false;\n }\n const validKeys = [\"defined\", \"code\", \"status\", \"message\", \"data\"];\n if (Object.keys(json).some((k) => !validKeys.includes(k))) {\n return false;\n }\n return \"defined\" in json && typeof json.defined === \"boolean\" && \"code\" in json && typeof json.code === \"string\" && \"status\" in json && typeof json.status === \"number\" && isORPCErrorStatus(json.status) && \"message\" in json && typeof json.message === \"string\";\n}\nfunction createORPCErrorFromJson(json, options = {}) {\n return new ORPCError(json.code, {\n ...options,\n ...json\n });\n}\n\nexport { COMMON_ORPC_ERROR_DEFS as C, ORPC_CLIENT_PACKAGE_NAME as O, ORPC_CLIENT_PACKAGE_VERSION as a, fallbackORPCErrorMessage as b, ORPCError as c, isORPCErrorStatus as d, isORPCErrorJson as e, fallbackORPCErrorStatus as f, createORPCErrorFromJson as g, isDefinedError as i, toORPCError as t };\n","import { isTypescriptObject, AsyncIteratorClass, tryDecodeURIComponent, toArray, once, isAsyncIteratorObject, replicateAsyncIterator } from '@orpc/shared';\n\nclass EventEncoderError extends TypeError {\n}\nclass EventDecoderError extends TypeError {\n}\nclass ErrorEvent extends Error {\n data;\n constructor(options) {\n super(options?.message ?? \"An error event was received\", options);\n this.data = options?.data;\n }\n}\n\nfunction decodeEventMessage(encoded) {\n const lines = encoded.replace(/\\n+$/, \"\").split(/\\n/);\n const message = {\n data: void 0,\n event: void 0,\n id: void 0,\n retry: void 0,\n comments: []\n };\n for (const line of lines) {\n const index = line.indexOf(\":\");\n const key = index === -1 ? line : line.slice(0, index);\n const value = index === -1 ? \"\" : line.slice(index + 1).replace(/^\\s/, \"\");\n if (index === 0) {\n message.comments.push(value);\n } else if (key === \"data\") {\n message.data ??= \"\";\n message.data += `${value}\n`;\n } else if (key === \"event\") {\n message.event = value;\n } else if (key === \"id\") {\n message.id = value;\n } else if (key === \"retry\") {\n const maybeInteger = Number.parseInt(value);\n if (Number.isInteger(maybeInteger) && maybeInteger >= 0 && maybeInteger.toString() === value) {\n message.retry = maybeInteger;\n }\n }\n }\n message.data = message.data?.replace(/\\n$/, \"\");\n return message;\n}\nclass EventDecoder {\n constructor(options = {}) {\n this.options = options;\n }\n incomplete = \"\";\n feed(chunk) {\n this.incomplete += chunk;\n const lastCompleteIndex = this.incomplete.lastIndexOf(\"\\n\\n\");\n if (lastCompleteIndex === -1) {\n return;\n }\n const completes = this.incomplete.slice(0, lastCompleteIndex).split(/\\n\\n/);\n this.incomplete = this.incomplete.slice(lastCompleteIndex + 2);\n for (const encoded of completes) {\n const message = decodeEventMessage(`${encoded}\n\n`);\n if (this.options.onEvent) {\n this.options.onEvent(message);\n }\n }\n }\n end() {\n if (this.incomplete) {\n throw new EventDecoderError(\"Event Iterator ended before complete\");\n }\n }\n}\nclass EventDecoderStream extends TransformStream {\n constructor() {\n let decoder;\n super({\n start(controller) {\n decoder = new EventDecoder({\n onEvent: (event) => {\n controller.enqueue(event);\n }\n });\n },\n transform(chunk) {\n decoder.feed(chunk);\n },\n flush() {\n decoder.end();\n }\n });\n }\n}\n\nfunction assertEventId(id) {\n if (id.includes(\"\\n\")) {\n throw new EventEncoderError(\"Event's id must not contain a newline character\");\n }\n}\nfunction assertEventName(event) {\n if (event.includes(\"\\n\")) {\n throw new EventEncoderError(\"Event's event must not contain a newline character\");\n }\n}\nfunction assertEventRetry(retry) {\n if (!Number.isInteger(retry) || retry < 0) {\n throw new EventEncoderError(\"Event's retry must be a integer and >= 0\");\n }\n}\nfunction assertEventComment(comment) {\n if (comment.includes(\"\\n\")) {\n throw new EventEncoderError(\"Event's comment must not contain a newline character\");\n }\n}\nfunction encodeEventData(data) {\n const lines = data?.split(/\\n/) ?? [];\n let output = \"\";\n for (const line of lines) {\n output += `data: ${line}\n`;\n }\n return output;\n}\nfunction encodeEventComments(comments) {\n let output = \"\";\n for (const comment of comments ?? []) {\n assertEventComment(comment);\n output += `: ${comment}\n`;\n }\n return output;\n}\nfunction encodeEventMessage(message) {\n let output = \"\";\n output += encodeEventComments(message.comments);\n if (message.event !== void 0) {\n assertEventName(message.event);\n output += `event: ${message.event}\n`;\n }\n if (message.retry !== void 0) {\n assertEventRetry(message.retry);\n output += `retry: ${message.retry}\n`;\n }\n if (message.id !== void 0) {\n assertEventId(message.id);\n output += `id: ${message.id}\n`;\n }\n output += encodeEventData(message.data);\n output += \"\\n\";\n return output;\n}\n\nconst EVENT_SOURCE_META_SYMBOL = Symbol(\"ORPC_EVENT_SOURCE_META\");\nfunction withEventMeta(container, meta) {\n if (meta.id === void 0 && meta.retry === void 0 && !meta.comments?.length) {\n return container;\n }\n if (meta.id !== void 0) {\n assertEventId(meta.id);\n }\n if (meta.retry !== void 0) {\n assertEventRetry(meta.retry);\n }\n if (meta.comments !== void 0) {\n for (const comment of meta.comments) {\n assertEventComment(comment);\n }\n }\n return new Proxy(container, {\n get(target, prop, receiver) {\n if (prop === EVENT_SOURCE_META_SYMBOL) {\n return meta;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nfunction getEventMeta(container) {\n return isTypescriptObject(container) ? Reflect.get(container, EVENT_SOURCE_META_SYMBOL) : void 0;\n}\n\nclass HibernationEventIterator extends AsyncIteratorClass {\n /**\n * this property is not transferred to the client, so it should be optional for type safety\n */\n hibernationCallback;\n constructor(hibernationCallback) {\n super(async () => {\n throw new Error(\"Cannot iterate over hibernating iterator directly\");\n }, async (reason) => {\n if (reason !== \"next\") {\n throw new Error(\"Cannot cleanup hibernating iterator directly\");\n }\n });\n this.hibernationCallback = hibernationCallback;\n }\n}\n\nfunction generateContentDisposition(filename, disposition = \"inline\") {\n const encodedFileName = filename.replace(/[^\\x20-\\x7E]/g, \"_\").replace(/\"/g, '\\\\\"');\n const encodedFilenameStar = encodeURIComponent(filename).replace(/['()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`).replace(/%(7C|60|5E)/g, (str, hex) => String.fromCharCode(Number.parseInt(hex, 16)));\n return `${disposition}; filename=\"${encodedFileName}\"; filename*=utf-8''${encodedFilenameStar}`;\n}\nfunction getFilenameFromContentDisposition(contentDisposition) {\n const encodedFilenameStarMatch = contentDisposition.match(/filename\\*=(UTF-8'')?([^;]*)/i);\n if (encodedFilenameStarMatch && typeof encodedFilenameStarMatch[2] === \"string\") {\n return tryDecodeURIComponent(encodedFilenameStarMatch[2]);\n }\n const encodedFilenameMatch = contentDisposition.match(/filename=\"((?:\\\\\"|[^\"])*)\"/i);\n if (encodedFilenameMatch && typeof encodedFilenameMatch[1] === \"string\") {\n return encodedFilenameMatch[1].replace(/\\\\\"/g, '\"');\n }\n}\nfunction mergeStandardHeaders(a, b) {\n const merged = { ...a };\n for (const key in b) {\n if (Array.isArray(b[key])) {\n merged[key] = [...toArray(merged[key]), ...b[key]];\n } else if (b[key] !== void 0) {\n if (Array.isArray(merged[key])) {\n merged[key] = [...merged[key], b[key]];\n } else if (merged[key] !== void 0) {\n merged[key] = [merged[key], b[key]];\n } else {\n merged[key] = b[key];\n }\n }\n }\n return merged;\n}\nfunction flattenHeader(header) {\n if (typeof header === \"string\" || header === void 0) {\n return header;\n }\n if (header.length === 0) {\n return void 0;\n }\n return header.join(\", \");\n}\nfunction replicateStandardLazyResponse(response, count) {\n const replicated = [];\n let bodyPromise;\n let replicatedAsyncIteratorObjects;\n for (let i = 0; i < count; i++) {\n replicated.push({\n ...response,\n body: once(async () => {\n const body = await (bodyPromise ??= response.body());\n if (!isAsyncIteratorObject(body)) {\n return body;\n }\n replicatedAsyncIteratorObjects ??= replicateAsyncIterator(body, count);\n return replicatedAsyncIteratorObjects.shift();\n })\n });\n }\n return replicated;\n}\nfunction isEventIteratorHeaders(headers) {\n return Boolean(flattenHeader(headers[\"content-type\"])?.startsWith(\"text/event-stream\") && flattenHeader(headers[\"content-disposition\"]) === void 0);\n}\n\nexport { ErrorEvent, EventDecoder, EventDecoderError, EventDecoderStream, EventEncoderError, HibernationEventIterator, assertEventComment, assertEventId, assertEventName, assertEventRetry, decodeEventMessage, encodeEventComments, encodeEventData, encodeEventMessage, flattenHeader, generateContentDisposition, getEventMeta, getFilenameFromContentDisposition, isEventIteratorHeaders, mergeStandardHeaders, replicateStandardLazyResponse, withEventMeta };\n","import { AsyncIteratorClass, isTypescriptObject } from '@orpc/shared';\nimport { getEventMeta, withEventMeta } from '@orpc/standard-server';\n\nfunction mapEventIterator(iterator, maps) {\n const mapError = async (error) => {\n let mappedError = await maps.error(error);\n if (mappedError !== error) {\n const meta = getEventMeta(error);\n if (meta && isTypescriptObject(mappedError)) {\n mappedError = withEventMeta(mappedError, meta);\n }\n }\n return mappedError;\n };\n return new AsyncIteratorClass(async () => {\n const { done, value } = await (async () => {\n try {\n return await iterator.next();\n } catch (error) {\n throw await mapError(error);\n }\n })();\n let mappedValue = await maps.value(value, done);\n if (mappedValue !== value) {\n const meta = getEventMeta(value);\n if (meta && isTypescriptObject(mappedValue)) {\n mappedValue = withEventMeta(mappedValue, meta);\n }\n }\n return { done, value: mappedValue };\n }, async () => {\n try {\n await iterator.return?.();\n } catch (error) {\n throw await mapError(error);\n }\n });\n}\n\nexport { mapEventIterator as m };\n","import { preventNativeAwait, isTypescriptObject } from '@orpc/shared';\nexport { AsyncIteratorClass, EventPublisher, asyncIteratorToStream as eventIteratorToStream, asyncIteratorToUnproxiedDataStream as eventIteratorToUnproxiedDataStream, onError, onFinish, onStart, onSuccess, streamToAsyncIteratorClass as streamToEventIterator } from '@orpc/shared';\nimport { i as isDefinedError } from './shared/client.KWZYf6QD.mjs';\nexport { C as COMMON_ORPC_ERROR_DEFS, c as ORPCError, O as ORPC_CLIENT_PACKAGE_NAME, a as ORPC_CLIENT_PACKAGE_VERSION, g as createORPCErrorFromJson, b as fallbackORPCErrorMessage, f as fallbackORPCErrorStatus, e as isORPCErrorJson, d as isORPCErrorStatus, t as toORPCError } from './shared/client.KWZYf6QD.mjs';\nexport { m as mapEventIterator } from './shared/client.BLtwTQUg.mjs';\nexport { ErrorEvent, getEventMeta, withEventMeta } from '@orpc/standard-server';\n\nasync function safe(promise) {\n try {\n const output = await promise;\n return Object.assign(\n [null, output, false, true],\n { error: null, data: output, isDefined: false, isSuccess: true }\n );\n } catch (e) {\n const error = e;\n if (isDefinedError(error)) {\n return Object.assign(\n [error, void 0, true, false],\n { error, data: void 0, isDefined: true, isSuccess: false }\n );\n }\n return Object.assign(\n [error, void 0, false, false],\n { error, data: void 0, isDefined: false, isSuccess: false }\n );\n }\n}\nfunction resolveFriendlyClientOptions(options) {\n return {\n ...options,\n context: options.context ?? {}\n // Context only optional if all fields are optional\n };\n}\nfunction consumeEventIterator(iterator, options) {\n void (async () => {\n let onFinishState;\n try {\n const resolvedIterator = await iterator;\n while (true) {\n const { done, value } = await resolvedIterator.next();\n if (done) {\n const realValue = value;\n onFinishState = [null, realValue, true];\n options.onSuccess?.(realValue);\n break;\n }\n options.onEvent(value);\n }\n } catch (error) {\n onFinishState = [error, void 0, false];\n if (!options.onError && !options.onFinish) {\n throw error;\n }\n options.onError?.(error);\n } finally {\n options.onFinish?.(onFinishState);\n }\n })();\n return async () => {\n await (await iterator)?.return?.();\n };\n}\n\nfunction createORPCClient(link, options = {}) {\n const path = options.path ?? [];\n const procedureClient = async (...[input, options2 = {}]) => {\n return await link.call(path, input, resolveFriendlyClientOptions(options2));\n };\n const recursive = new Proxy(procedureClient, {\n get(target, key) {\n if (typeof key !== \"string\") {\n return Reflect.get(target, key);\n }\n return createORPCClient(link, {\n ...options,\n path: [...path, key]\n });\n }\n });\n return preventNativeAwait(recursive);\n}\n\nfunction createSafeClient(client) {\n const proxy = new Proxy((...args) => safe(client(...args)), {\n get(_, prop, receiver) {\n const value = Reflect.get(client, prop, receiver);\n if (typeof prop !== \"string\") {\n return value;\n }\n if (!isTypescriptObject(value)) {\n return value;\n }\n return createSafeClient(value);\n }\n });\n return proxy;\n}\n\nclass DynamicLink {\n constructor(linkResolver) {\n this.linkResolver = linkResolver;\n }\n async call(path, input, options) {\n const resolvedLink = await this.linkResolver(options, path, input);\n const output = await resolvedLink.call(path, input, options);\n return output;\n }\n}\n\nexport { DynamicLink, consumeEventIterator, createORPCClient, createSafeClient, isDefinedError, resolveFriendlyClientOptions, safe };\n","import { AsyncIteratorClass, startSpan, runInSpanContext, AbortError, parseEmptyableJSON, isTypescriptObject, setSpanError, stringifyJSON, runWithSpan, isAsyncIteratorObject, once } from '@orpc/shared';\nimport { EventDecoderStream, withEventMeta, ErrorEvent, encodeEventMessage, getEventMeta, getFilenameFromContentDisposition, generateContentDisposition } from '@orpc/standard-server';\n\nfunction toEventIterator(stream, options = {}) {\n const eventStream = stream?.pipeThrough(new TextDecoderStream()).pipeThrough(new EventDecoderStream());\n const reader = eventStream?.getReader();\n let span;\n let isCancelled = false;\n return new AsyncIteratorClass(async () => {\n span ??= startSpan(\"consume_event_iterator_stream\");\n try {\n while (true) {\n if (reader === void 0) {\n return { done: true, value: void 0 };\n }\n const { done, value } = await runInSpanContext(span, () => reader.read());\n if (done) {\n if (isCancelled) {\n throw new AbortError(\"Stream was cancelled\");\n }\n return { done: true, value: void 0 };\n }\n switch (value.event) {\n case \"message\": {\n let message = parseEmptyableJSON(value.data);\n if (isTypescriptObject(message)) {\n message = withEventMeta(message, value);\n }\n span?.addEvent(\"message\");\n return { done: false, value: message };\n }\n case \"error\": {\n let error = new ErrorEvent({\n data: parseEmptyableJSON(value.data)\n });\n error = withEventMeta(error, value);\n span?.addEvent(\"error\");\n throw error;\n }\n case \"done\": {\n let done2 = parseEmptyableJSON(value.data);\n if (isTypescriptObject(done2)) {\n done2 = withEventMeta(done2, value);\n }\n span?.addEvent(\"done\");\n return { done: true, value: done2 };\n }\n default: {\n span?.addEvent(\"maybe_keepalive\");\n }\n }\n }\n } catch (e) {\n if (!(e instanceof ErrorEvent)) {\n setSpanError(span, e, options);\n }\n throw e;\n }\n }, async (reason) => {\n try {\n if (reason !== \"next\") {\n isCancelled = true;\n span?.addEvent(\"cancelled\");\n }\n await runInSpanContext(span, () => reader?.cancel());\n } catch (e) {\n setSpanError(span, e, options);\n throw e;\n } finally {\n span?.end();\n }\n });\n}\nfunction toEventStream(iterator, options = {}) {\n const keepAliveEnabled = options.eventIteratorKeepAliveEnabled ?? true;\n const keepAliveInterval = options.eventIteratorKeepAliveInterval ?? 5e3;\n const keepAliveComment = options.eventIteratorKeepAliveComment ?? \"\";\n const initialCommentEnabled = options.eventIteratorInitialCommentEnabled ?? true;\n const initialComment = options.eventIteratorInitialComment ?? \"\";\n let cancelled = false;\n let timeout;\n let span;\n const stream = new ReadableStream({\n start(controller) {\n span = startSpan(\"stream_event_iterator\");\n if (initialCommentEnabled) {\n controller.enqueue(encodeEventMessage({\n comments: [initialComment]\n }));\n }\n },\n async pull(controller) {\n try {\n if (keepAliveEnabled) {\n timeout = setInterval(() => {\n controller.enqueue(encodeEventMessage({\n comments: [keepAliveComment]\n }));\n span?.addEvent(\"keepalive\");\n }, keepAliveInterval);\n }\n const value = await runInSpanContext(span, () => iterator.next());\n clearInterval(timeout);\n if (cancelled) {\n return;\n }\n const meta = getEventMeta(value.value);\n if (!value.done || value.value !== void 0 || meta !== void 0) {\n const event = value.done ? \"done\" : \"message\";\n controller.enqueue(encodeEventMessage({\n ...meta,\n event,\n data: stringifyJSON(value.value)\n }));\n span?.addEvent(event);\n }\n if (value.done) {\n controller.close();\n span?.end();\n }\n } catch (err) {\n clearInterval(timeout);\n if (cancelled) {\n return;\n }\n if (err instanceof ErrorEvent) {\n controller.enqueue(encodeEventMessage({\n ...getEventMeta(err),\n event: \"error\",\n data: stringifyJSON(err.data)\n }));\n span?.addEvent(\"error\");\n controller.close();\n } else {\n setSpanError(span, err);\n controller.error(err);\n }\n span?.end();\n }\n },\n async cancel() {\n try {\n cancelled = true;\n clearInterval(timeout);\n span?.addEvent(\"cancelled\");\n await runInSpanContext(span, () => iterator.return?.());\n } catch (e) {\n setSpanError(span, e);\n throw e;\n } finally {\n span?.end();\n }\n }\n }).pipeThrough(new TextEncoderStream());\n return stream;\n}\n\nfunction toStandardBody(re, options = {}) {\n return runWithSpan(\n { name: \"parse_standard_body\", signal: options.signal },\n async () => {\n const contentDisposition = re.headers.get(\"content-disposition\");\n if (typeof contentDisposition === \"string\") {\n const fileName = getFilenameFromContentDisposition(contentDisposition) ?? \"blob\";\n const blob2 = await re.blob();\n return new File([blob2], fileName, {\n type: blob2.type\n });\n }\n const contentType = re.headers.get(\"content-type\");\n if (!contentType || contentType.startsWith(\"application/json\")) {\n const text = await re.text();\n return parseEmptyableJSON(text);\n }\n if (contentType.startsWith(\"multipart/form-data\")) {\n return await re.formData();\n }\n if (contentType.startsWith(\"application/x-www-form-urlencoded\")) {\n const text = await re.text();\n return new URLSearchParams(text);\n }\n if (contentType.startsWith(\"text/event-stream\")) {\n return toEventIterator(re.body, options);\n }\n if (contentType.startsWith(\"text/plain\")) {\n return await re.text();\n }\n const blob = await re.blob();\n return new File([blob], \"blob\", {\n type: blob.type\n });\n }\n );\n}\nfunction toFetchBody(body, headers, options = {}) {\n if (body instanceof ReadableStream) {\n return body;\n }\n const currentContentDisposition = headers.get(\"content-disposition\");\n headers.delete(\"content-type\");\n headers.delete(\"content-disposition\");\n if (body === void 0) {\n return void 0;\n }\n if (body instanceof Blob) {\n headers.set(\"content-type\", body.type);\n headers.set(\"content-length\", body.size.toString());\n headers.set(\n \"content-disposition\",\n currentContentDisposition ?? generateContentDisposition(body instanceof File ? body.name : \"blob\")\n );\n return body;\n }\n if (body instanceof FormData) {\n return body;\n }\n if (body instanceof URLSearchParams) {\n return body;\n }\n if (isAsyncIteratorObject(body)) {\n headers.set(\"content-type\", \"text/event-stream\");\n return toEventStream(body, options);\n }\n headers.set(\"content-type\", \"application/json\");\n return stringifyJSON(body);\n}\n\nfunction toStandardHeaders(headers, standardHeaders = {}) {\n headers.forEach((value, key) => {\n if (Array.isArray(standardHeaders[key])) {\n standardHeaders[key].push(value);\n } else if (standardHeaders[key] !== void 0) {\n standardHeaders[key] = [standardHeaders[key], value];\n } else {\n standardHeaders[key] = value;\n }\n });\n return standardHeaders;\n}\nfunction toFetchHeaders(headers, fetchHeaders = new Headers()) {\n for (const [key, value] of Object.entries(headers)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n fetchHeaders.append(key, v);\n }\n } else if (value !== void 0) {\n fetchHeaders.append(key, value);\n }\n }\n return fetchHeaders;\n}\n\nfunction toStandardLazyRequest(request) {\n return {\n url: new URL(request.url),\n signal: request.signal,\n method: request.method,\n body: once(() => toStandardBody(request, { signal: request.signal })),\n get headers() {\n const headers = toStandardHeaders(request.headers);\n Object.defineProperty(this, \"headers\", { value: headers, writable: true });\n return headers;\n },\n set headers(value) {\n Object.defineProperty(this, \"headers\", { value, writable: true });\n }\n };\n}\nfunction toFetchRequest(request, options = {}) {\n const headers = toFetchHeaders(request.headers);\n const body = toFetchBody(request.body, headers, options);\n return new Request(request.url, {\n signal: request.signal,\n method: request.method,\n headers,\n body\n });\n}\n\nfunction toFetchResponse(response, options = {}) {\n const headers = toFetchHeaders(response.headers);\n const body = toFetchBody(response.body, headers, options);\n return new Response(body, { headers, status: response.status });\n}\nfunction toStandardLazyResponse(response, options = {}) {\n return {\n body: once(() => toStandardBody(response, options)),\n status: response.status,\n get headers() {\n const headers = toStandardHeaders(response.headers);\n Object.defineProperty(this, \"headers\", { value: headers, writable: true });\n return headers;\n },\n set headers(value) {\n Object.defineProperty(this, \"headers\", { value, writable: true });\n }\n };\n}\n\nexport { toEventIterator, toEventStream, toFetchBody, toFetchHeaders, toFetchRequest, toFetchResponse, toStandardBody, toStandardHeaders, toStandardLazyRequest, toStandardLazyResponse };\n","import { toArray, runWithSpan, ORPC_NAME, isAsyncIteratorObject, asyncIteratorWithSpan, intercept, getGlobalOtelConfig, isObject, value, stringifyJSON } from '@orpc/shared';\nimport { mergeStandardHeaders, ErrorEvent } from '@orpc/standard-server';\nimport { C as COMMON_ORPC_ERROR_DEFS, d as isORPCErrorStatus, e as isORPCErrorJson, g as createORPCErrorFromJson, c as ORPCError, t as toORPCError } from './client.KWZYf6QD.mjs';\nimport { toStandardHeaders as toStandardHeaders$1 } from '@orpc/standard-server-fetch';\nimport { m as mapEventIterator } from './client.BLtwTQUg.mjs';\n\nclass CompositeStandardLinkPlugin {\n plugins;\n constructor(plugins = []) {\n this.plugins = [...plugins].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n init(options) {\n for (const plugin of this.plugins) {\n plugin.init?.(options);\n }\n }\n}\n\nclass StandardLink {\n constructor(codec, sender, options = {}) {\n this.codec = codec;\n this.sender = sender;\n const plugin = new CompositeStandardLinkPlugin(options.plugins);\n plugin.init(options);\n this.interceptors = toArray(options.interceptors);\n this.clientInterceptors = toArray(options.clientInterceptors);\n }\n interceptors;\n clientInterceptors;\n call(path, input, options) {\n return runWithSpan(\n { name: `${ORPC_NAME}.${path.join(\"/\")}`, signal: options.signal },\n (span) => {\n span?.setAttribute(\"rpc.system\", ORPC_NAME);\n span?.setAttribute(\"rpc.method\", path.join(\".\"));\n if (isAsyncIteratorObject(input)) {\n input = asyncIteratorWithSpan(\n { name: \"consume_event_iterator_input\", signal: options.signal },\n input\n );\n }\n return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {\n const otelConfig = getGlobalOtelConfig();\n let otelContext;\n const currentSpan = otelConfig?.trace.getActiveSpan() ?? span;\n if (currentSpan && otelConfig) {\n otelContext = otelConfig?.trace.setSpan(otelConfig.context.active(), currentSpan);\n }\n const request = await runWithSpan(\n { name: \"encode_request\", context: otelContext },\n () => this.codec.encode(path2, input2, options2)\n );\n const response = await intercept(\n this.clientInterceptors,\n { ...options2, input: input2, path: path2, request },\n ({ input: input3, path: path3, request: request2, ...options3 }) => {\n return runWithSpan(\n { name: \"send_request\", signal: options3.signal, context: otelContext },\n () => this.sender.call(request2, options3, path3, input3)\n );\n }\n );\n const output = await runWithSpan(\n { name: \"decode_response\", context: otelContext },\n () => this.codec.decode(response, options2, path2, input2)\n );\n if (isAsyncIteratorObject(output)) {\n return asyncIteratorWithSpan(\n { name: \"consume_event_iterator_output\", signal: options2.signal },\n output\n );\n }\n return output;\n });\n }\n );\n }\n}\n\nconst STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES = {\n BIGINT: 0,\n DATE: 1,\n NAN: 2,\n UNDEFINED: 3,\n URL: 4,\n REGEXP: 5,\n SET: 6,\n MAP: 7\n};\nclass StandardRPCJsonSerializer {\n customSerializers;\n constructor(options = {}) {\n this.customSerializers = options.customJsonSerializers ?? [];\n if (this.customSerializers.length !== new Set(this.customSerializers.map((custom) => custom.type)).size) {\n throw new Error(\"Custom serializer type must be unique.\");\n }\n }\n serialize(data, segments = [], meta = [], maps = [], blobs = []) {\n for (const custom of this.customSerializers) {\n if (custom.condition(data)) {\n const result = this.serialize(custom.serialize(data), segments, meta, maps, blobs);\n meta.push([custom.type, ...segments]);\n return result;\n }\n }\n if (data instanceof Blob) {\n maps.push(segments);\n blobs.push(data);\n return [data, meta, maps, blobs];\n }\n if (typeof data === \"bigint\") {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT, ...segments]);\n return [data.toString(), meta, maps, blobs];\n }\n if (data instanceof Date) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.DATE, ...segments]);\n if (Number.isNaN(data.getTime())) {\n return [null, meta, maps, blobs];\n }\n return [data.toISOString(), meta, maps, blobs];\n }\n if (Number.isNaN(data)) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN, ...segments]);\n return [null, meta, maps, blobs];\n }\n if (data instanceof URL) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL, ...segments]);\n return [data.toString(), meta, maps, blobs];\n }\n if (data instanceof RegExp) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.REGEXP, ...segments]);\n return [data.toString(), meta, maps, blobs];\n }\n if (data instanceof Set) {\n const result = this.serialize(Array.from(data), segments, meta, maps, blobs);\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET, ...segments]);\n return result;\n }\n if (data instanceof Map) {\n const result = this.serialize(Array.from(data.entries()), segments, meta, maps, blobs);\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.MAP, ...segments]);\n return result;\n }\n if (Array.isArray(data)) {\n const json = data.map((v, i) => {\n if (v === void 0) {\n meta.push([STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED, ...segments, i]);\n return null;\n }\n return this.serialize(v, [...segments, i], meta, maps, blobs)[0];\n });\n return [json, meta, maps, blobs];\n }\n if (isObject(data)) {\n const json = {};\n for (const k in data) {\n if (k === \"toJSON\" && typeof data[k] === \"function\") {\n continue;\n }\n json[k] = this.serialize(data[k], [...segments, k], meta, maps, blobs)[0];\n }\n return [json, meta, maps, blobs];\n }\n return [data, meta, maps, blobs];\n }\n deserialize(json, meta, maps, getBlob) {\n const ref = { data: json };\n if (maps && getBlob) {\n maps.forEach((segments, i) => {\n let currentRef = ref;\n let preSegment = \"data\";\n segments.forEach((segment) => {\n currentRef = currentRef[preSegment];\n preSegment = segment;\n if (!Object.hasOwn(currentRef, preSegment)) {\n throw new Error(`Security error: accessing non-existent path during deserialization. Path segment: ${preSegment}`);\n }\n });\n currentRef[preSegment] = getBlob(i);\n });\n }\n for (const item of meta) {\n const type = item[0];\n let currentRef = ref;\n let preSegment = \"data\";\n for (let i = 1; i < item.length; i++) {\n currentRef = currentRef[preSegment];\n preSegment = item[i];\n if (!Object.hasOwn(currentRef, preSegment)) {\n throw new Error(`Security error: accessing non-existent path during deserialization. Path segment: ${preSegment}`);\n }\n }\n for (const custom of this.customSerializers) {\n if (custom.type === type) {\n currentRef[preSegment] = custom.deserialize(currentRef[preSegment]);\n break;\n }\n }\n switch (type) {\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.BIGINT:\n currentRef[preSegment] = BigInt(currentRef[preSegment]);\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.DATE:\n currentRef[preSegment] = new Date(currentRef[preSegment] ?? \"Invalid Date\");\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.NAN:\n currentRef[preSegment] = Number.NaN;\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.UNDEFINED:\n currentRef[preSegment] = void 0;\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.URL:\n currentRef[preSegment] = new URL(currentRef[preSegment]);\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.REGEXP: {\n const [, pattern, flags] = currentRef[preSegment].match(/^\\/(.*)\\/([a-z]*)$/);\n currentRef[preSegment] = new RegExp(pattern, flags);\n break;\n }\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.SET:\n currentRef[preSegment] = new Set(currentRef[preSegment]);\n break;\n case STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES.MAP:\n currentRef[preSegment] = new Map(currentRef[preSegment]);\n break;\n }\n }\n return ref.data;\n }\n}\n\nfunction toHttpPath(path) {\n return `/${path.map(encodeURIComponent).join(\"/\")}`;\n}\nfunction toStandardHeaders(headers) {\n if (typeof headers.forEach === \"function\") {\n return toStandardHeaders$1(headers);\n }\n return headers;\n}\nfunction getMalformedResponseErrorCode(status) {\n return Object.entries(COMMON_ORPC_ERROR_DEFS).find(([, def]) => def.status === status)?.[0] ?? \"MALFORMED_ORPC_ERROR_RESPONSE\";\n}\n\nclass StandardRPCLinkCodec {\n constructor(serializer, options) {\n this.serializer = serializer;\n this.baseUrl = options.url;\n this.maxUrlLength = options.maxUrlLength ?? 2083;\n this.fallbackMethod = options.fallbackMethod ?? \"POST\";\n this.expectedMethod = options.method ?? this.fallbackMethod;\n this.headers = options.headers ?? {};\n }\n baseUrl;\n maxUrlLength;\n fallbackMethod;\n expectedMethod;\n headers;\n async encode(path, input, options) {\n let headers = toStandardHeaders(await value(this.headers, options, path, input));\n if (options.lastEventId !== void 0) {\n headers = mergeStandardHeaders(headers, { \"last-event-id\": options.lastEventId });\n }\n const expectedMethod = await value(this.expectedMethod, options, path, input);\n const baseUrl = await value(this.baseUrl, options, path, input);\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname.replace(/\\/$/, \"\")}${toHttpPath(path)}`;\n const serialized = this.serializer.serialize(input);\n if (expectedMethod === \"GET\" && !(serialized instanceof FormData) && !isAsyncIteratorObject(serialized)) {\n const maxUrlLength = await value(this.maxUrlLength, options, path, input);\n const getUrl = new URL(url);\n getUrl.searchParams.append(\"data\", stringifyJSON(serialized));\n if (getUrl.toString().length <= maxUrlLength) {\n return {\n body: void 0,\n method: expectedMethod,\n headers,\n url: getUrl,\n signal: options.signal\n };\n }\n }\n return {\n url,\n method: expectedMethod === \"GET\" ? this.fallbackMethod : expectedMethod,\n headers,\n body: serialized,\n signal: options.signal\n };\n }\n async decode(response) {\n const isOk = !isORPCErrorStatus(response.status);\n const deserialized = await (async () => {\n let isBodyOk = false;\n try {\n const body = await response.body();\n isBodyOk = true;\n return this.serializer.deserialize(body);\n } catch (error) {\n if (!isBodyOk) {\n throw new Error(\"Cannot parse response body, please check the response body and content-type.\", {\n cause: error\n });\n }\n throw new Error(\"Invalid RPC response format.\", {\n cause: error\n });\n }\n })();\n if (!isOk) {\n if (isORPCErrorJson(deserialized)) {\n throw createORPCErrorFromJson(deserialized);\n }\n throw new ORPCError(getMalformedResponseErrorCode(response.status), {\n status: response.status,\n data: { ...response, body: deserialized }\n });\n }\n return deserialized;\n }\n}\n\nclass StandardRPCSerializer {\n constructor(jsonSerializer) {\n this.jsonSerializer = jsonSerializer;\n }\n serialize(data) {\n if (isAsyncIteratorObject(data)) {\n return mapEventIterator(data, {\n value: async (value) => this.#serialize(value, false),\n error: async (e) => {\n return new ErrorEvent({\n data: this.#serialize(toORPCError(e).toJSON(), false),\n cause: e\n });\n }\n });\n }\n return this.#serialize(data, true);\n }\n #serialize(data, enableFormData) {\n const [json, meta_, maps, blobs] = this.jsonSerializer.serialize(data);\n const meta = meta_.length === 0 ? void 0 : meta_;\n if (!enableFormData || blobs.length === 0) {\n return {\n json,\n meta\n };\n }\n const form = new FormData();\n form.set(\"data\", stringifyJSON({ json, meta, maps }));\n blobs.forEach((blob, i) => {\n form.set(i.toString(), blob);\n });\n return form;\n }\n deserialize(data) {\n if (isAsyncIteratorObject(data)) {\n return mapEventIterator(data, {\n value: async (value) => this.#deserialize(value),\n error: async (e) => {\n if (!(e instanceof ErrorEvent)) {\n return e;\n }\n const deserialized = this.#deserialize(e.data);\n if (isORPCErrorJson(deserialized)) {\n return createORPCErrorFromJson(deserialized, { cause: e });\n }\n return new ErrorEvent({\n data: deserialized,\n cause: e\n });\n }\n });\n }\n return this.#deserialize(data);\n }\n #deserialize(data) {\n if (data === void 0) {\n return void 0;\n }\n if (!(data instanceof FormData)) {\n return this.jsonSerializer.deserialize(data.json, data.meta ?? []);\n }\n const serialized = JSON.parse(data.get(\"data\"));\n return this.jsonSerializer.deserialize(\n serialized.json,\n serialized.meta ?? [],\n serialized.maps,\n (i) => data.get(i.toString())\n );\n }\n}\n\nclass StandardRPCLink extends StandardLink {\n constructor(linkClient, options) {\n const jsonSerializer = new StandardRPCJsonSerializer(options);\n const serializer = new StandardRPCSerializer(jsonSerializer);\n const linkCodec = new StandardRPCLinkCodec(serializer, options);\n super(linkCodec, linkClient, options);\n }\n}\n\nexport { CompositeStandardLinkPlugin as C, StandardLink as S, STANDARD_RPC_JSON_SERIALIZER_BUILT_IN_TYPES as a, StandardRPCJsonSerializer as b, StandardRPCLink as c, StandardRPCLinkCodec as d, StandardRPCSerializer as e, toStandardHeaders as f, getMalformedResponseErrorCode as g, toHttpPath as t };\n","import { toArray, intercept } from '@orpc/shared';\nimport { toFetchRequest, toStandardLazyResponse } from '@orpc/standard-server-fetch';\nimport { C as CompositeStandardLinkPlugin, c as StandardRPCLink } from '../../shared/client.DrB9nq_G.mjs';\nimport '@orpc/standard-server';\nimport '../../shared/client.KWZYf6QD.mjs';\nimport '../../shared/client.BLtwTQUg.mjs';\n\nclass CompositeLinkFetchPlugin extends CompositeStandardLinkPlugin {\n initRuntimeAdapter(options) {\n for (const plugin of this.plugins) {\n plugin.initRuntimeAdapter?.(options);\n }\n }\n}\n\nclass LinkFetchClient {\n fetch;\n toFetchRequestOptions;\n adapterInterceptors;\n constructor(options) {\n const plugin = new CompositeLinkFetchPlugin(options.plugins);\n plugin.initRuntimeAdapter(options);\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.toFetchRequestOptions = options;\n this.adapterInterceptors = toArray(options.adapterInterceptors);\n }\n async call(standardRequest, options, path, input) {\n const request = toFetchRequest(standardRequest, this.toFetchRequestOptions);\n const fetchResponse = await intercept(\n this.adapterInterceptors,\n { ...options, request, path, input, init: { redirect: \"manual\" } },\n ({ request: request2, path: path2, input: input2, init, ...options2 }) => this.fetch(request2, init, options2, path2, input2)\n );\n const lazyResponse = toStandardLazyResponse(fetchResponse, { signal: request.signal });\n return lazyResponse;\n }\n}\n\nclass RPCLink extends StandardRPCLink {\n constructor(options) {\n const linkClient = new LinkFetchClient(options);\n super(linkClient, options);\n }\n}\n\nexport { LinkFetchClient, RPCLink };\n","import { RPCLink } from \"@orpc/client/fetch\";\n\nexport type ORPCHttpClientOptions = {\n /** Base URL for the oRPC API (e.g., \"http://localhost:3001/api/v3\") */\n baseUrl: string;\n /** Optional function to get auth token for requests */\n getAuthToken?: () => string | Promise<string | undefined> | undefined;\n /** Optional custom headers or async function to get headers */\n headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);\n /** Optional custom fetch function for intercepting requests/responses */\n fetch?: typeof globalThis.fetch;\n /** Optional callback called with each response for handling Set-Cookie headers etc */\n onResponse?: (response: Response) => void | Promise<void>;\n};\n\nexport function createLink(options: ORPCHttpClientOptions) {\n return new RPCLink({\n url: options.baseUrl,\n headers: async () => {\n const baseHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Get custom headers (supports both static and async)\n const customHeaders = typeof options.headers === \"function\" ? await options.headers() : options.headers;\n\n if (customHeaders) {\n Object.assign(baseHeaders, customHeaders);\n }\n\n if (options.getAuthToken) {\n const token = await options.getAuthToken();\n if (token) {\n baseHeaders[\"Cookie\"] = `tourial-session=${token}`;\n }\n }\n\n return baseHeaders;\n },\n fetch:\n options.fetch || options.onResponse\n ? async (request, init) => {\n const fetchFn = options.fetch || globalThis.fetch;\n const response = await fetchFn(request, init);\n\n if (options.onResponse) {\n await options.onResponse(response);\n }\n\n return response;\n }\n : undefined,\n });\n}\n","import { createORPCClient } from \"@orpc/client\";\nimport type { RouterClient } from \"@orpc/server\";\nimport { createLink, type ORPCHttpClientOptions } from \"../shared/client\";\nimport type { LiveRouter } from \"./router\";\n\n/** Type-safe HTTP client for the live oRPC API */\nexport type LiveHttpClient = RouterClient<LiveRouter>;\n\n/**\n * Create an HTTP client for calling live oRPC API endpoints\n */\nexport function createLiveHttpClient(options: ORPCHttpClientOptions): LiveHttpClient {\n return createORPCClient<LiveHttpClient>(createLink(options));\n}\n","import { createLiveHttpClient, type LiveHttpClient } from \"@navless/orpc/live/client\";\n\n/**\n * Normalize a branded-host origin into the `/api/v3` base the live API is served\n * under. Accepts a bare origin (\"https://guide.acme.com\") or a URL that already\n * ends with `/api/v3`.\n */\nexport function toApiBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, \"\");\n return trimmed.endsWith(\"/api/v3\") ? trimmed : `${trimmed}/api/v3`;\n}\n\n/**\n * Wrap a fetch implementation so every request carries the visitor cookies.\n * This is the load-bearing piece: the branded host is same-site with the\n * customer's page, so `credentials: \"include\"` lets the existing\n * `navless-live-*` cookies attach in every browser.\n */\nexport function withCredentials(fetchImpl: typeof globalThis.fetch): typeof globalThis.fetch {\n return (input, init) => fetchImpl(input, { ...init, credentials: \"include\" });\n}\n\n/** Build the typed live oRPC client, reusing @navless/orpc's client factory. */\nexport function createApiClient(apiBaseUrl: string, fetchImpl: typeof globalThis.fetch): LiveHttpClient {\n return createLiveHttpClient({ baseUrl: apiBaseUrl, fetch: withCredentials(fetchImpl) });\n}\n","const UTM_KEYS = [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_term\", \"utm_content\"] as const;\nconst INTEGRATION_COOKIE_KEYS = [\"hubspotutk\", \"_mkto_trk\"] as const;\n\n/** Pull UTM attribution params out of a `location.search` string. */\nexport function extractUTMParams(search: string): Record<string, string> {\n const params = new URLSearchParams(search);\n const result: Record<string, string> = {};\n for (const key of UTM_KEYS) {\n const value = params.get(key);\n if (value) result[key] = value;\n }\n return result;\n}\n\n/**\n * Pull first-party integration cookies (HubSpot, Marketo) out of a\n * `document.cookie` string so they can be forwarded for CRM stitching.\n */\nexport function extractIntegrationCookies(cookieString: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const key of INTEGRATION_COOKIE_KEYS) {\n const match = cookieString.match(new RegExp(`(?:^|;\\\\s*)${key}=([^;]*)`));\n if (match?.[1]) cookies[key] = decodeURIComponent(match[1]);\n }\n return cookies;\n}\n\n/** Read `document.cookie`, swallowing the SecurityError thrown in opaque origins. */\nexport function safeCookieString(): string {\n if (typeof document === \"undefined\") return \"\";\n try {\n return document.cookie;\n } catch {\n return \"\";\n }\n}\n","// This package is deliberately self-contained: it imports NO types from\n// @navless/types. That package is a barrel (`export *` over dozens of modules),\n// so importing any symbol drags the whole surface into the bundled .d.ts and the\n// dts bundler chokes on it. The wire-protocol enums and payload interfaces below\n// are stable contracts, hand-mirrored here so the published package has zero\n// @navless/* runtime deps and a self-contained declaration file. Authoritative\n// server sources: `guide-runtime/sse-adapter.ts` (wire frames) and\n// `@navless/types/guide.types.ts` (payload shapes).\n\n/** AG-UI protocol frame types written by the guide SSE stream. */\nexport const SSEMessageType = {\n RunStarted: \"RUN_STARTED\",\n RunFinished: \"RUN_FINISHED\",\n RunError: \"RUN_ERROR\",\n TextMessageStart: \"TEXT_MESSAGE_START\",\n TextMessageContent: \"TEXT_MESSAGE_CONTENT\",\n TextMessageEnd: \"TEXT_MESSAGE_END\",\n Custom: \"CUSTOM\",\n} as const;\nexport type SSEMessageTypeName = (typeof SSEMessageType)[keyof typeof SSEMessageType];\n\n/**\n * The `name` on `CUSTOM` guide events (skill payloads). `SkillGate` and\n * `SkillError` never surface as `skill` stream events — the SDK re-maps them to\n * the dedicated `gate` / `error` {@link GuideStreamEvent} variants.\n */\nexport const GuideEvent = {\n SkillStart: \"skill_start\",\n SkillContent: \"skill_content\",\n SkillDocuments: \"skill_documents\",\n SkillRecommendations: \"skill_recommendations\",\n SkillCTAs: \"skill_ctas\",\n SkillDiagnoseHeader: \"skill_diagnose_header\",\n SkillDiagnoseQuestion: \"skill_diagnose_question\",\n SkillPlaylistItems: \"skill_playlist_items\",\n SkillPlaylistHeader: \"skill_playlist_header\",\n SkillPlaylistRationale: \"skill_playlist_rationale\",\n SkillHowToOutline: \"skill_howto_outline\",\n SkillHowToSteps: \"skill_howto_steps\",\n SkillBusinessCaseChooser: \"skill_businesscase_chooser\",\n SkillBusinessCaseDelta: \"skill_businesscase_delta\",\n SkillSolutionDesignHeader: \"skill_solutiondesign_header\",\n SkillSolutionDesignDiagram: \"skill_solutiondesign_diagram\",\n SkillEnd: \"skill_end\",\n SkillError: \"skill_error\",\n SkillGate: \"skill_gate\",\n} as const;\nexport type GuideEventName = (typeof GuideEvent)[keyof typeof GuideEvent];\n\n/** The guide skill types. `answer` is always on; the rest are enabled per-guide. */\nexport const SkillResponseType = {\n Answer: \"answer\",\n HowTo: \"howto\",\n Diagnose: \"diagnose\",\n Recommend: \"recommend\",\n Playlist: \"playlist\",\n BusinessCase: \"businesscase\",\n SolutionDesign: \"solutiondesign\",\n} as const;\nexport type SkillResponseTypeType = (typeof SkillResponseType)[keyof typeof SkillResponseType];\n\n/** Consent tiers. `essential` is always granted server-side. */\nexport const ConsentTier = {\n Essential: \"essential\",\n Functional: \"functional\",\n Analytical: \"analytical\",\n} as const;\nexport type ConsentTierName = (typeof ConsentTier)[keyof typeof ConsentTier];\n\n/** Analytics events fired by the SDK bootstrap. */\nexport const EmbedTrackingEvent = {\n EmbedLoaded: \"embed_loaded\",\n EmbedPageView: \"embed_page_view\",\n EmbedTriggerClicked: \"embed_trigger_clicked\",\n EmbedSideTabClicked: \"embed_side_tab_clicked\",\n EmbedSideTabDismissed: \"embed_side_tab_dismissed\",\n} as const;\nexport type EmbedTrackingEventName = (typeof EmbedTrackingEvent)[keyof typeof EmbedTrackingEvent];\n\n/**\n * The `eventType` passed to {@link GuideClient.track}. Any server-recognized\n * event string is accepted — use an {@link EmbedTrackingEvent} member for the\n * common cases.\n */\nexport type TrackEventType = string;\n\n/** Consent tiers a visitor can grant. `essential` is always granted server-side. */\nexport interface ConsentLevels {\n functional?: boolean;\n analytical?: boolean;\n}\n\nexport interface ConsentFlags {\n essential: boolean;\n functional: boolean;\n analytical: boolean;\n}\n\n/** Per-guide UI copy overrides. */\nexport interface GuideCustomization {\n welcomeMessage?: string;\n chatInputPlaceholders?: string[];\n suggestionsTitle?: string;\n helpTitle?: string;\n pickUpWhereYouLeftOff?: string;\n showGuideName?: boolean;\n sideTabButtonText?: string;\n pdfDisclaimerLine1?: string;\n pdfDisclaimerLine2?: string;\n pdfDownloadDescription?: string;\n}\n\n/** Lightweight knowledge-graph snapshot for page-load visualization. */\nexport interface GuideGraphSnapshot {\n nodes: Array<{ id: string; name: string; type: string; tier: number }>;\n edges: Array<{ from: string; to: string; relationship: string; strength: number }>;\n}\n\n// ============================================================================\n// Brand theme\n// ============================================================================\n\n/**\n * The guide's brand theme — shadcn-style design tokens as CSS color strings\n * (hex or `oklch(...)`). Every property is optional: absent tokens mean \"keep\n * your default\". Map them onto your CSS variables / Tailwind theme so the\n * guide UI matches the brand:\n *\n * ```css\n * :root {\n * --primary: <theme.primary>;\n * --background: <theme.background>;\n * }\n * ```\n */\nexport interface BrandKitTheme {\n /** Main brand color (buttons, focus rings) */\n primary?: string;\n /** Text on primary backgrounds */\n primaryForeground?: string;\n /** Secondary surface color */\n secondary?: string;\n /** Text on secondary surfaces */\n secondaryForeground?: string;\n /** Main page background */\n background?: string;\n /** Default body text */\n foreground?: string;\n /** Muted areas, borders, inputs */\n muted?: string;\n /** Muted/secondary text */\n mutedForeground?: string;\n /** Border color */\n border?: string;\n /** Input border color */\n input?: string;\n /** Focus ring color */\n ring?: string;\n}\n\n/** How a brand kit colors the guide's skill icons. */\nexport const SkillIconColorMode = {\n /** Keep the built-in per-skill colors. */\n Default: \"default\",\n /** Apply a single brand color to every skill icon. */\n Mono: \"mono\",\n /** Pick a color per skill; skills left unset fall back to the default. */\n PerSkill: \"per_skill\",\n} as const;\nexport type SkillIconColorModeType = (typeof SkillIconColorMode)[keyof typeof SkillIconColorMode];\n\n/**\n * Per-brand-kit skill icon color customization, discriminated on `mode`.\n * Colors are CSS color strings (same format as {@link BrandKitTheme}).\n */\nexport type SkillIconStyle =\n | { mode: typeof SkillIconColorMode.Default }\n | {\n mode: typeof SkillIconColorMode.Mono;\n /** Single color applied to every skill icon. */\n monoColor: string;\n }\n | {\n mode: typeof SkillIconColorMode.PerSkill;\n /** Color per skill; missing keys fall back to the default. */\n colors: Partial<Record<SkillResponseTypeType, string>>;\n };\n\n/** Resolved guide metadata returned by `guides.resolve`. */\nexport interface ResolvedGuide {\n id: string;\n name: string;\n slug: string;\n brandKitId: string | null;\n magicLinkFormId: string | null;\n accountId: string;\n companyName: string;\n gdprEnabled: boolean;\n advancedSettings: { gatePdfDownload: boolean };\n /** Brand design tokens — apply to your UI so the guide matches the brand. */\n theme: BrandKitTheme | null;\n skillIconStyle: SkillIconStyle | null;\n faviconUrl: string | null;\n logoUrl: string | null;\n heroImageUrl: string | null;\n customization: GuideCustomization | null;\n graphSnapshot: GuideGraphSnapshot | null;\n}\n\n/** A conversation record. */\nexport interface Conversation {\n id: string;\n accountId: string;\n guideId: string;\n visitorId: string;\n sessionId: string;\n title: string | null;\n createdAt: Date;\n deletedAt: Date | null;\n}\n\n/** A persisted conversation message. */\nexport interface ConversationMessage {\n id: string;\n accountId: string;\n conversationId: string;\n role: \"human\" | \"assistant\";\n content: string | null;\n isSynthetic: boolean;\n createdAt: Date;\n deletedAt: Date | null;\n}\n\n/** A conversation plus a page of its messages. */\nexport interface ConversationWithMessages {\n conversation: Conversation;\n messages: ConversationMessage[];\n}\n\n/**\n * A persisted skill deliverable. `data` shape varies by `type` — it is the\n * skill's completed output (e.g. for `howto` a `{ title, steps: HowToStep[] }`\n * record); the streamed payload interfaces in this file describe the same\n * building blocks.\n */\nexport interface SkillInstance {\n id: string;\n skillOutputId: string;\n accountId: string;\n conversationId: string;\n type: SkillResponseTypeType;\n visitorId: string;\n sessionId: string;\n title: string | null;\n data: Record<string, unknown>;\n surfacedCta: unknown;\n sharedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n deletedAt: Date | null;\n}\n\n/** A skill instance as returned in history lists (no `data`/`surfacedCta`). */\nexport interface SkillHistoryInstance {\n id: string;\n skillOutputId: string;\n accountId: string;\n conversationId: string;\n type: SkillResponseTypeType;\n visitorId: string;\n sessionId: string;\n title: string | null;\n sharedAt: Date | null;\n createdAt: Date;\n updatedAt: Date;\n deletedAt: Date | null;\n stepsCompleted: number | null;\n totalSteps: number | null;\n}\n\n/** Skill history grouped by conversation. */\nexport interface SkillHistoryGroup {\n conversationId: string;\n conversationTitle: string | null;\n latestActivityAt: Date;\n instances: SkillHistoryInstance[];\n}\n\nexport interface UpdateSkillInstanceResult {\n id: string;\n data: Record<string, unknown>;\n updatedAt: Date;\n}\n\nexport interface SelectDraftResult {\n skillInstanceId: string | null;\n}\n\nexport interface MarkSharedResult {\n sharedAt: Date;\n}\n\nexport interface ImportSharedResult {\n skillInstanceId: string;\n type: SkillResponseTypeType;\n conversationId: string;\n}\n\n/** The current visitor's tracking + consent + email status. */\nexport interface VisitorStatus {\n visitorId: string;\n isTracked: boolean;\n consent: { functional: boolean; analytical: boolean };\n email: string | null;\n verified: boolean;\n}\n\n/** Result of an email-gate submission. */\nexport interface SubmitGateResult {\n success: boolean;\n needsVerification: boolean;\n}\n\n/** Optional lead-capture fields beyond the ones the SDK fills automatically. */\nexport interface SubmitGateOptions {\n redirectUrl?: string;\n skill?: string;\n prompt?: string;\n skillInstanceId?: string;\n hostUrl?: string;\n requireVerification?: boolean;\n downloadIntent?: boolean;\n shareIntent?: boolean;\n}\n\nexport interface InitGuideConfig {\n /**\n * Branded host origin the SDK talks to, e.g. \"https://guide.acme.com\". Must be\n * on the customer's own root domain so the visitor cookies stay same-site.\n * `/api/v3` is appended automatically.\n */\n baseUrl: string;\n /** Guide slug to resolve (e.g. \"default\"). */\n slug: string;\n /**\n * Optional override for the host used in account resolution + attribution.\n * Defaults to the `baseUrl` hostname (lowercased, `www.`/port stripped), which\n * is the registered account domain. Only set this if resolution must key off a\n * different registered domain than the one requests are sent to.\n */\n domain?: string;\n /**\n * Consent handling on init:\n * - `\"auto\"` (default): grant all tiers when the guide has GDPR disabled; wait\n * for an explicit `setConsent()` when it is enabled.\n * - explicit levels: submit these immediately.\n * - `false`: submit nothing; call `setConsent()` yourself.\n */\n consent?: \"auto\" | ConsentLevels | false;\n /** Fire an initial `embed_loaded` + page-view event on init. Default `true`. */\n trackLoad?: boolean;\n /**\n * Custom fetch implementation (SSR/testing). Defaults to `globalThis.fetch`.\n * `credentials: \"include\"` is always applied so visitor cookies ride along.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/** A message in the SDK's in-memory conversation history. */\nexport interface ChatMessage {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AskOptions {\n /** Force a specific skill, bypassing server-side LLM routing. */\n forcedSkill?: SkillResponseTypeType;\n /** Abort the in-flight stream. */\n signal?: AbortSignal;\n}\n\n// ============================================================================\n// Skill payload building blocks (mirrored from @navless/types/guide.types.ts)\n// ============================================================================\n\n/** Kind of content a document/playlist item points at. */\nexport const ContentType = {\n PDF: \"pdf\",\n DOCX: \"docx\",\n PPTX: \"pptx\",\n Image: \"image\",\n VideoNative: \"video_native\",\n VideoYouTube: \"video_youtube\",\n VideoWistia: \"video_wistia\",\n Document: \"document\",\n URL: \"url\",\n Text: \"text\",\n Markdown: \"markdown\",\n} as const;\nexport type ContentTypeName = (typeof ContentType)[keyof typeof ContentType];\n\n/**\n * Document reference streamed with a reply — the sources behind the answer.\n * Render as source cards/citations: title, optional link, optional thumbnail.\n */\nexport interface GuideDocument {\n id: string;\n title: string;\n tag?: string;\n /** Lucide icon name. */\n icon?: string;\n url?: string;\n contentType?: ContentTypeName;\n body?: string;\n thumbnailUrl?: string;\n /** 1-based citation number matching the [N] references in the reply text. Undefined if the document was not part of the reply context. */\n citationIndex?: number;\n}\n\n/** Confidence level attached to a content recommendation. */\nexport const Confidence = {\n High: \"high\",\n Medium: \"medium\",\n Low: \"low\",\n} as const;\nexport type ConfidenceName = (typeof Confidence)[keyof typeof Confidence];\n\n/**\n * Follow-up recommendation to invoke a skill — render as a pill button that\n * calls `ask(prompt, { forcedSkill: skill })`.\n */\nexport interface SkillRecommendation {\n id: string;\n skill: SkillResponseTypeType;\n label: string;\n prompt: string;\n}\n\n/**\n * A content recommendation generated by the recommend skill — render as a card\n * whose click calls `ask(prompt, { forcedSkill: targetSkill })`.\n */\nexport interface ContentRecommendation {\n id: string;\n targetSkill: Exclude<SkillResponseTypeType, \"recommend\">;\n title: string;\n rationale: string;\n prompt: string;\n confidence: ConfidenceName;\n}\n\n/** The render kind of a surfaced call-to-action. */\nexport const SkillCtaKind = {\n Url: \"url\",\n Form: \"form\",\n Product: \"product\",\n Scheduler: \"scheduler\",\n} as const;\nexport type SkillCtaKindName = (typeof SkillCtaKind)[keyof typeof SkillCtaKind];\n\n/** Where a surfaced CTA renders. One slot today: below the skill response. */\nexport const CtaPlacement = {\n ResponseFooter: \"response_footer\",\n} as const;\nexport type CtaPlacementName = (typeof CtaPlacement)[keyof typeof CtaPlacement];\n\n/** Which scheduler embed a scheduler CTA loads. */\nexport const SchedulerProvider = {\n HubSpot: \"hubspot\",\n Calendly: \"calendly\",\n} as const;\nexport type SchedulerProviderName = (typeof SchedulerProvider)[keyof typeof SchedulerProvider];\n\n/**\n * A call-to-action surfaced for a turn, discriminated on `kind`:\n * - `url`: external link — render a button that opens `href`.\n * - `form`: in-guide form — render a button/banner for the form `formId`.\n * - `product`: product recommendation — render a link/card to `href`.\n * - `scheduler`: meeting embed — render a button that opens `url` in the\n * provider's scheduling widget (or a new tab).\n *\n * Only render the first CTA in the list; the wire carries a list for forward\n * compatibility. `ctaInstanceId` (when present) should be echoed on CTA\n * analytics events so impressions and clicks join up.\n */\nexport type SkillCTA =\n | {\n kind: typeof SkillCtaKind.Url;\n placement: CtaPlacementName;\n ctaId: string | null;\n label: string;\n href: string;\n /** Custom banner heading; absent → use a default like \"Recommended next step\". */\n bannerText?: string;\n /** Lucide icon name; absent → a default lightbulb. */\n bannerIcon?: string;\n ctaInstanceId?: string;\n }\n | {\n kind: typeof SkillCtaKind.Form;\n placement: CtaPlacementName;\n ctaId: string;\n label: string;\n formId: string;\n bannerText?: string;\n bannerIcon?: string;\n ctaInstanceId?: string;\n }\n | {\n kind: typeof SkillCtaKind.Product;\n placement: CtaPlacementName;\n productId: string;\n label: string;\n href: string;\n ctaInstanceId?: string;\n }\n | {\n kind: typeof SkillCtaKind.Scheduler;\n placement: CtaPlacementName;\n ctaId: string;\n label: string;\n provider: SchedulerProviderName;\n /** The meeting/scheduling link the embed loads. */\n url: string;\n bannerText?: string;\n bannerIcon?: string;\n ctaInstanceId?: string;\n };\n\n/** Diagnose skill mode. */\nexport const DiagnoseSubtype = {\n /** A scored self-assessment rendered with results at the end. */\n Standalone: \"standalone\",\n /** Questions gather context for a follow-up skill (see `followUpSkill`). */\n ContextGathering: \"context_gathering\",\n} as const;\nexport type DiagnoseSubtypeName = (typeof DiagnoseSubtype)[keyof typeof DiagnoseSubtype];\n\n/** Answer option labels for diagnose questions. */\nexport const DiagnoseOptionLabel = {\n A: \"A\",\n B: \"B\",\n C: \"C\",\n D: \"D\",\n} as const;\nexport type DiagnoseOptionLabelName = (typeof DiagnoseOptionLabel)[keyof typeof DiagnoseOptionLabel];\n\n/** Header for a diagnostic assessment — render as the assessment intro. */\nexport interface DiagnosticHeader {\n targetTopic: string;\n subtitle: string;\n /** Total number of questions the assessment will stream. */\n questionCount: number;\n subtype?: DiagnoseSubtypeName;\n /** For context_gathering mode — the skill to invoke after the user submits answers. */\n followUpSkill?: string;\n /** For context_gathering mode — the prompt to send to `followUpSkill` afterwards. */\n followUpPrompt?: string;\n}\n\n/**\n * A self-assessment question (no correct answer). Render the options as a\n * single-choice list; `score` supports a results chart in standalone mode.\n */\nexport interface DiagnosticQuestion {\n id: string;\n /** Short category name, usable as a results-chart axis label. */\n category: string;\n questionText: string;\n options: Array<{ label: DiagnoseOptionLabelName; text: string; score?: number }>;\n prerequisiteConceptId: string | null;\n prerequisiteConceptName: string | null;\n}\n\n/** A step title in a how-to outline (details stream later as {@link HowToStep}). */\nexport interface HowToStepOutline {\n id: string;\n title: string;\n}\n\n/** How-to outline — render immediately as a skeleton; steps fill in after. */\nexport interface HowToOutline {\n title: string;\n steps: HowToStepOutline[];\n}\n\n/** Content reference attached to a how-to step — render as a source card. */\nexport interface HowToStepContent {\n contentId: string;\n title: string;\n url: string | null;\n contentType: ContentTypeName | null;\n /** The matching excerpt that demonstrates relevance. */\n excerpt: string;\n thumbnailUrl?: string;\n}\n\n/** A fully detailed how-to step — replaces the outline entry with the same `id`. */\nexport interface HowToStep {\n id: string;\n title: string;\n description: string;\n content: HowToStepContent | null;\n /** Lucide icon name. */\n icon?: string;\n}\n\n/** Header for a playlist — render as the playlist title/description. */\nexport interface PlaylistHeader {\n title: string;\n description: string;\n}\n\n/** A single item in a curated playlist — render as a content card. */\nexport interface PlaylistItem {\n id: string;\n title: string;\n description: string | null;\n body?: string | null;\n contentType: ContentTypeName;\n url: string | null;\n thumbnailUrl?: string;\n /** Why this item is included — streams in later via `skill_playlist_rationale`. */\n rationale?: string;\n}\n\n/** Business case format sub-types. */\nexport const BusinessCaseSubType = {\n RoiAnalysis: \"roi-analysis\",\n StakeholderBrief: \"stakeholder-brief\",\n VendorComparison: \"vendor-comparison\",\n} as const;\nexport type BusinessCaseSubTypeName = (typeof BusinessCaseSubType)[keyof typeof BusinessCaseSubType];\n\n/** Format option in the business case chooser — render as a selectable card. */\nexport interface BusinessCaseFormatOption {\n subType: BusinessCaseSubTypeName;\n label: string;\n description: string;\n /** Lucide icon name. */\n icon: string;\n}\n\n/** Reference to a pre-generated business case draft, keyed by sub-type. */\nexport interface BusinessCaseDraftRef {\n draftId: string;\n skillInstanceId: string;\n}\n\n/** Node types in a solution design diagram. */\nexport const SolutionDesignNodeType = {\n Process: \"process\",\n Decision: \"decision\",\n Datastore: \"datastore\",\n External: \"external\",\n Trigger: \"trigger\",\n Start: \"start\",\n End: \"end\",\n} as const;\nexport type SolutionDesignNodeTypeName = (typeof SolutionDesignNodeType)[keyof typeof SolutionDesignNodeType];\n\n/** A node in a solution design diagram — render as a flowchart node. */\nexport interface SolutionDesignNode {\n id: string;\n label: string;\n description: string;\n nodeType: SolutionDesignNodeTypeName;\n /** Lucide icon name. */\n icon: string;\n}\n\n/** A directed edge between two solution design nodes (by node `id`). */\nexport interface SolutionDesignEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n}\n\n/** Header for a solution design — render as the diagram title/summary. */\nexport interface SolutionDesignHeader {\n title: string;\n summary: string;\n}\n\n/** Suggested retry attached to a recoverable skill error. */\nexport interface SkillErrorRetryHint {\n /** Re-ask with this prompt… */\n prompt: string;\n /** …optionally forcing this skill. */\n forcedSkill?: SkillResponseTypeType;\n}\n\n// ============================================================================\n// The `ask()` event stream\n// ============================================================================\n\n/**\n * A structured skill event, discriminated on `name`. Every turn runs one skill\n * (plain answers are the `answer` skill): `skill_start` announces which,\n * payload events stream the deliverable, and `skill_end` closes it. Use\n * {@link reduceSkillEvent} to fold these into renderable state instead of\n * handling each variant by hand.\n */\nexport type GuideSkillEvent =\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillStart;\n /** Which skill this turn runs, and the assistant message it belongs to. */\n value: { skill: SkillResponseTypeType; messageId: string; diagnoseSubtype?: DiagnoseSubtypeName; followUpSkill?: string };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillContent;\n /** Markdown token chunk of the skill's long-form body (business case drafts, etc.). */\n value: { delta: string };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillDocuments;\n /** Source documents behind the reply — render as citation/source cards. */\n value: { documents: GuideDocument[] };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillRecommendations;\n /**\n * Either the recommend skill's content cards ({@link ContentRecommendation},\n * has `targetSkill`) or post-answer follow-up pills ({@link SkillRecommendation},\n * has `skill`). Discriminate by which of those keys is present.\n */\n value: { recommendations: ContentRecommendation[] | SkillRecommendation[] };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillCTAs;\n /** Calls-to-action for this turn — render the first below the response. */\n value: { ctas: SkillCTA[] };\n }\n | { type: \"skill\"; name: typeof GuideEvent.SkillDiagnoseHeader; value: { header: DiagnosticHeader } }\n | { type: \"skill\"; name: typeof GuideEvent.SkillDiagnoseQuestion; value: { question: DiagnosticQuestion } }\n | { type: \"skill\"; name: typeof GuideEvent.SkillPlaylistItems; value: { items: PlaylistItem[] } }\n | { type: \"skill\"; name: typeof GuideEvent.SkillPlaylistHeader; value: { header: PlaylistHeader } }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillPlaylistRationale;\n /** Late-streamed rationale for the playlist item with this `itemId`. */\n value: { itemId: string; rationale: string };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillHowToOutline;\n /** Render the outline immediately; detailed steps stream in `skill_howto_steps`. */\n value: { outline: HowToOutline; skillInstanceId?: string };\n }\n | { type: \"skill\"; name: typeof GuideEvent.SkillHowToSteps; value: { steps: HowToStep[] } }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillBusinessCaseChooser;\n /** Format options to choose from; `drafts` maps subType → pre-generated draft. */\n value: { formats: BusinessCaseFormatOption[]; drafts: Record<string, BusinessCaseDraftRef> };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillBusinessCaseDelta;\n /** Markdown chunk of the draft for one business case format. */\n value: { subType: BusinessCaseSubTypeName; delta: string };\n }\n | { type: \"skill\"; name: typeof GuideEvent.SkillSolutionDesignHeader; value: { header: SolutionDesignHeader } }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillSolutionDesignDiagram;\n /** Flowchart nodes + edges — render with any diagram/graph component. */\n value: { nodes: SolutionDesignNode[]; edges: SolutionDesignEdge[] };\n }\n | {\n type: \"skill\";\n name: typeof GuideEvent.SkillEnd;\n /** `skillInstanceId` is the persisted deliverable's id (for `skills.get`/`update`). */\n value: { skillInstanceId?: string; skillResponseId?: string };\n };\n\n/**\n * A single event yielded by {@link GuideClient.ask}.\n *\n * - `text` streams the chat reply; `skill` carries the structured deliverable\n * (see {@link GuideSkillEvent}).\n * - `gate` means the guide wants an email before continuing — collect one,\n * call `submitGate(email)`, then re-send the message.\n * - `skill-unknown` is a forward-compatibility escape hatch: a structured\n * event this SDK version doesn't know. Safe to ignore.\n */\nexport type GuideStreamEvent =\n | { type: \"run-started\"; runId: string }\n | { type: \"message-start\"; messageId: string; role: string }\n | { type: \"text\"; messageId: string; delta: string }\n | { type: \"message-end\"; messageId: string }\n | GuideSkillEvent\n | { type: \"skill-unknown\"; name: string; value: Record<string, unknown> }\n | { type: \"gate\"; skill: SkillResponseTypeType; prompt?: string; skillInstanceId?: string }\n | { type: \"error\"; message: string; code?: string; retryable?: boolean; retryHint?: SkillErrorRetryHint }\n | { type: \"run-finished\"; finishReason?: string };\n","import { GuideEvent, SSEMessageType } from \"./types\";\nimport type { ChatMessage, GuideSkillEvent, GuideStreamEvent, SkillErrorRetryHint, SkillResponseTypeType } from \"./types\";\n\nexport interface StreamConversationParams {\n apiBaseUrl: string;\n guideId: string;\n messages: ChatMessage[];\n forcedSkill?: SkillResponseTypeType;\n fetchImpl: typeof globalThis.fetch;\n signal?: AbortSignal;\n}\n\n/** Raw SSE frame as written by the API's `toSSE` adapter. */\ninterface SSEFrame {\n type: string;\n name?: string;\n value?: Record<string, unknown>;\n delta?: string;\n messageId?: string;\n role?: string;\n runId?: string;\n finishReason?: string;\n error?: { message: string; code?: string };\n}\n\nconst DATA_PREFIX = \"data:\";\nconst DONE_SENTINEL = \"[DONE]\";\n\n/**\n * Stream a guide chat turn. POSTs the conversation to the SSE route\n * (`/api/v3/guide/conversation`) and yields normalized {@link GuideStreamEvent}s\n * until the server writes `data: [DONE]`. This is the one endpoint that is not\n * part of the typed oRPC router, so it is spoken by hand here.\n */\nexport async function* streamConversation(params: StreamConversationParams): AsyncGenerator<GuideStreamEvent> {\n const { apiBaseUrl, guideId, messages, forcedSkill, fetchImpl, signal } = params;\n\n const body: Record<string, unknown> = {\n guideId,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n };\n if (forcedSkill) body.forcedSkill = forcedSkill;\n\n const response = await fetchImpl(`${apiBaseUrl}/guide/conversation`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify(body),\n signal,\n });\n\n if (!response.ok || !response.body) {\n // Surface the server's error body (e.g. `{ \"error\": \"guideId is required\" }`)\n // so integration failures are debuggable rather than just a bare status.\n let detail = \"\";\n try {\n detail = (await response.text()).trim();\n } catch {\n // ignore — the body may be empty or already consumed\n }\n throw new Error(`[brand_brain] Conversation request failed with status ${response.status}${detail ? `: ${detail}` : \"\"}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separatorIndex = buffer.indexOf(\"\\n\\n\");\n while (separatorIndex !== -1) {\n const rawEvent = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + 2);\n separatorIndex = buffer.indexOf(\"\\n\\n\");\n\n const dataLine = rawEvent.split(\"\\n\").find((line) => line.startsWith(DATA_PREFIX));\n if (!dataLine) continue;\n\n const data = dataLine.slice(DATA_PREFIX.length).trim();\n if (data === DONE_SENTINEL) return;\n\n const mapped = mapFrame(JSON.parse(data) as SSEFrame);\n if (mapped) yield mapped;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction mapFrame(frame: SSEFrame): GuideStreamEvent | null {\n switch (frame.type) {\n case SSEMessageType.RunStarted:\n return { type: \"run-started\", runId: frame.runId ?? \"\" };\n case SSEMessageType.RunFinished:\n return { type: \"run-finished\", finishReason: frame.finishReason };\n case SSEMessageType.RunError:\n return { type: \"error\", message: frame.error?.message ?? \"Unknown error\", code: frame.error?.code };\n case SSEMessageType.TextMessageStart:\n return { type: \"message-start\", messageId: frame.messageId ?? \"\", role: frame.role ?? \"assistant\" };\n case SSEMessageType.TextMessageContent:\n return { type: \"text\", messageId: frame.messageId ?? \"\", delta: frame.delta ?? \"\" };\n case SSEMessageType.TextMessageEnd:\n return { type: \"message-end\", messageId: frame.messageId ?? \"\" };\n case SSEMessageType.Custom:\n return mapCustomFrame(frame);\n default:\n return null;\n }\n}\n\n/**\n * Names that surface as typed `skill` events. `SkillGate`/`SkillError` are\n * re-mapped to the `gate`/`error` variants below, so they are excluded here;\n * any name outside this set is a server event this SDK version predates and\n * flows through as `skill-unknown`.\n */\nconst SKILL_EVENT_NAMES: ReadonlySet<string> = new Set(\n Object.values(GuideEvent).filter((name) => name !== GuideEvent.SkillGate && name !== GuideEvent.SkillError),\n);\n\nfunction mapCustomFrame(frame: SSEFrame): GuideStreamEvent | null {\n if (!frame.name) return null;\n const value = frame.value ?? {};\n\n // Wire-boundary reads: `value` is untyped JSON from the SSE stream, so the\n // fields below are asserted against the shapes the API's toSSE adapter writes.\n if (frame.name === GuideEvent.SkillGate) {\n return {\n type: \"gate\",\n skill: value.skill as SkillResponseTypeType,\n prompt: value.prompt as string | undefined,\n skillInstanceId: value.skillInstanceId as string | undefined,\n };\n }\n if (frame.name === GuideEvent.SkillError) {\n return {\n type: \"error\",\n message: (value.message as string | undefined) ?? \"Skill error\",\n code: value.errorType as string | undefined,\n retryable: value.retryable as boolean | undefined,\n retryHint: value.retryHint as SkillErrorRetryHint | undefined,\n };\n }\n if (SKILL_EVENT_NAMES.has(frame.name)) {\n // Wire-boundary assertion: membership in SKILL_EVENT_NAMES pins `name` to a\n // known skill event, and toSSE writes the payload shape the union declares.\n return { type: \"skill\", name: frame.name, value } as GuideSkillEvent;\n }\n return { type: \"skill-unknown\", name: frame.name, value };\n}\n","import type { LiveHttpClient } from \"@navless/orpc/live/client\";\nimport { createApiClient, toApiBaseUrl } from \"./api\";\nimport { extractIntegrationCookies, extractUTMParams, safeCookieString } from \"./analytics\";\nimport { streamConversation } from \"./chat-stream\";\nimport { EmbedTrackingEvent } from \"./types\";\nimport type {\n AskOptions,\n ChatMessage,\n ConsentLevels,\n Conversation,\n ConversationWithMessages,\n GuideStreamEvent,\n ImportSharedResult,\n InitGuideConfig,\n MarkSharedResult,\n ResolvedGuide,\n SelectDraftResult,\n SkillHistoryGroup,\n SkillInstance,\n SubmitGateOptions,\n SubmitGateResult,\n TrackEventType,\n UpdateSkillInstanceResult,\n VisitorStatus,\n} from \"./types\";\n\n// Explicit shapes for the grouped API namespaces, annotated with locally-authored\n// types rather than the deep @orpc/client-derived client types — so the published\n// .d.ts stays self-contained and never inlines an external type across chunks.\ninterface ConversationsApi {\n getOrCreate(): Promise<Conversation>;\n list(): Promise<Conversation[]>;\n get(conversationId: string, options?: { cursor?: string; limit?: number }): Promise<ConversationWithMessages>;\n delete(conversationId: string): Promise<Conversation>;\n}\n\ninterface SkillsApi {\n listHistory(): Promise<SkillHistoryGroup[]>;\n get(skillInstanceId: string): Promise<SkillInstance>;\n update(skillInstanceId: string, data: Record<string, unknown>): Promise<UpdateSkillInstanceResult>;\n selectDraft(draftId: string): Promise<SelectDraftResult>;\n markShared(skillInstanceId: string): Promise<MarkSharedResult>;\n importShared(sourceSkillInstanceId: string): Promise<ImportSharedResult>;\n}\n\n/**\n * The account is resolved by the branded host the SDK talks to, and that host\n * must be same-site with `baseUrl` for the visitor cookies to attach — so the\n * `baseUrl` hostname IS the registered account domain. Derive it from there\n * rather than the host page's `window.location`, which is an unrelated origin\n * for cross-site embeds and produces a \"Domain not found\" 404 on resolve.\n */\nfunction resolveDomain(config: InitGuideConfig): string {\n if (config.domain) return config.domain;\n return hostnameFromBaseUrl(config.baseUrl);\n}\n\n/**\n * Normalize `baseUrl` to the bare host the server stores: lowercased, no port,\n * no leading `www.` (the domain write-path strips it, so a `www.` host can\n * never match). Accepts a bare host too, in case `baseUrl` omits the protocol.\n */\nexport function hostnameFromBaseUrl(baseUrl: string): string {\n const withProtocol = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(baseUrl) ? baseUrl : `https://${baseUrl}`;\n const hostname = new URL(withProtocol).hostname.toLowerCase();\n return hostname.replace(/^www\\./, \"\");\n}\n\ninterface GuideClientParams {\n guide: ResolvedGuide;\n apiBaseUrl: string;\n domain: string;\n fetchImpl: typeof globalThis.fetch;\n}\n\n/**\n * The client returned by {@link initGuide}. Holds the resolved guide, the\n * credentialed live API client, and the in-memory conversation history. Every\n * method reuses an existing public endpoint — the SDK adds no server surface.\n */\nexport class GuideClient {\n /** Resolved guide metadata (ids, theme, customization). */\n readonly guide: ResolvedGuide;\n\n private readonly apiBaseUrl: string;\n private readonly domain: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n // ECMAScript-private so the heavy LiveHttpClient type never reaches the .d.ts.\n #api: LiveHttpClient;\n private readonly history: ChatMessage[] = [];\n\n private constructor(params: GuideClientParams) {\n this.guide = params.guide;\n this.apiBaseUrl = params.apiBaseUrl;\n this.domain = params.domain;\n this.fetchImpl = params.fetchImpl;\n this.#api = createApiClient(this.apiBaseUrl, this.fetchImpl);\n }\n\n static async init(config: InitGuideConfig): Promise<GuideClient> {\n const globalFetch = typeof globalThis.fetch === \"function\" ? globalThis.fetch.bind(globalThis) : undefined;\n const fetchImpl = config.fetch ?? globalFetch;\n if (!fetchImpl) {\n throw new Error(\"[brand_brain] No `fetch` is available — pass `config.fetch` when running without a global fetch.\");\n }\n const apiBaseUrl = toApiBaseUrl(config.baseUrl);\n const domain = resolveDomain(config);\n\n // First credentialed call — resolves the guide AND mints the visitor +\n // session cookies via the live router middleware.\n const api = createApiClient(apiBaseUrl, fetchImpl);\n const guide = await api.guides.resolve({ domain, slug: config.slug });\n const client = new GuideClient({ guide, apiBaseUrl, domain, fetchImpl });\n\n await client.applyInitialConsent(config.consent ?? \"auto\", guide.gdprEnabled);\n if (config.trackLoad ?? true) client.trackLoad();\n\n return client;\n }\n\n /** The account this guide belongs to (used implicitly by history calls). */\n get accountId(): string {\n return this.guide.accountId;\n }\n\n /** The in-memory conversation history accumulated by {@link ask}. */\n get messages(): readonly ChatMessage[] {\n return this.history;\n }\n\n /**\n * Send a message and stream the reply. Yields text deltas for the chat bubble\n * plus every structured skill event; the full 7-skill surface flows through\n * one stream. The user + assistant turns are appended to {@link messages}.\n */\n async *ask(message: string, options: AskOptions = {}): AsyncGenerator<GuideStreamEvent> {\n this.history.push({ id: crypto.randomUUID(), role: \"user\", content: message });\n\n let assistant: ChatMessage | null = null;\n for await (const event of streamConversation({\n apiBaseUrl: this.apiBaseUrl,\n guideId: this.guide.id,\n messages: this.history,\n forcedSkill: options.forcedSkill,\n fetchImpl: this.fetchImpl,\n signal: options.signal,\n })) {\n if (event.type === \"message-start\") {\n assistant = { id: event.messageId || crypto.randomUUID(), role: \"assistant\", content: \"\" };\n this.history.push(assistant);\n } else if (event.type === \"text\" && assistant) {\n assistant.content += event.delta;\n }\n yield event;\n }\n }\n\n /** Clear the in-memory conversation history (server-side history is unaffected). */\n reset(): void {\n this.history.length = 0;\n }\n\n /** Grant consent tiers. `essential` is always forced true server-side. */\n async setConsent(levels: ConsentLevels): Promise<void> {\n await this.#api.visitors.setConsent({ domain: this.domain, consent: levels });\n }\n\n /** Read the current visitor's tracking + consent + email status. */\n getStatus(): Promise<VisitorStatus> {\n return this.#api.visitors.getVisitorStatus();\n }\n\n /** Capture a lead email (sends a magic link when verification is required). */\n submitGate(email: string, options: SubmitGateOptions = {}): Promise<SubmitGateResult> {\n return this.#api.visitors.submitGate({ email, domain: this.domain, guideId: this.guide.id, ...options });\n }\n\n /**\n * Fire an analytics event. Fire-and-forget — never throws into the host page.\n * Uses a raw request (the same shape the embed script posts) so it stays\n * decoupled from the typed client's event enum.\n */\n track(eventType: TrackEventType, properties?: Record<string, unknown>): void {\n void this.fetchImpl(`${this.apiBaseUrl}/events/track`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ json: { domain: this.domain, guideId: this.guide.id, eventType, properties: properties ?? {} } }),\n }).catch(() => {\n // Best-effort — analytics must not break the host page.\n });\n }\n\n /** Fire the initial `embed_loaded` (with attribution) + first page view. */\n trackLoad(): void {\n const search = typeof window !== \"undefined\" ? window.location.search : \"\";\n const parentUrl = typeof window !== \"undefined\" ? window.location.href : undefined;\n const referrer = typeof document !== \"undefined\" ? document.referrer : undefined;\n this.track(EmbedTrackingEvent.EmbedLoaded, {\n referrer,\n parentUrl,\n utmParams: extractUTMParams(search),\n integrationCookies: extractIntegrationCookies(safeCookieString()),\n });\n this.trackPageView();\n }\n\n /** Record a page view (call on client-side route changes in an SPA). */\n trackPageView(url?: string): void {\n const pageUrl = url ?? (typeof window !== \"undefined\" ? window.location.href : undefined);\n this.track(EmbedTrackingEvent.EmbedPageView, { pageUrl });\n }\n\n /** End the current visit (best to call on `pagehide`). */\n async endSession(): Promise<void> {\n await this.#api.sessions.endSession();\n }\n\n /** Conversation history CRUD, scoped to this guide + account. */\n readonly conversations: ConversationsApi = {\n getOrCreate: () => this.#api.conversations.getOrCreate({ guideId: this.guide.id, accountId: this.guide.accountId }),\n list: () => this.#api.conversations.list({ guideId: this.guide.id, accountId: this.guide.accountId }),\n get: (conversationId: string, options?: { cursor?: string; limit?: number }) =>\n this.#api.conversations.get({ conversationId, accountId: this.guide.accountId, ...options }),\n delete: (conversationId: string) => this.#api.conversations.delete({ conversationId, accountId: this.guide.accountId }),\n };\n\n /** Persisted skill deliverables (how-to progress, diagnose answers, etc.). */\n readonly skills: SkillsApi = {\n listHistory: () => this.#api.skillInstances.listHistory({ accountId: this.guide.accountId, guideId: this.guide.id }),\n get: (skillInstanceId: string) => this.#api.skillInstances.get({ skillInstanceId }),\n update: (skillInstanceId: string, data: Record<string, unknown>) =>\n this.#api.skillInstances.update({ skillInstanceId, data }),\n selectDraft: (draftId: string) => this.#api.skillInstances.selectDraft({ draftId }),\n markShared: (skillInstanceId: string) => this.#api.skillInstances.markShared({ skillInstanceId }),\n importShared: (sourceSkillInstanceId: string) =>\n this.#api.skillInstances.importShared({ sourceSkillInstanceId, accountId: this.guide.accountId }),\n };\n\n private async applyInitialConsent(consent: \"auto\" | ConsentLevels | false, gdprEnabled: boolean): Promise<void> {\n if (consent === false) return;\n try {\n if (consent === \"auto\") {\n // Non-GDPR guides auto-grant everything (mirrors the live app). GDPR\n // guides wait for an explicit setConsent() from the host.\n if (!gdprEnabled) await this.setConsent({ functional: true, analytical: true });\n return;\n }\n await this.setConsent(consent);\n } catch {\n // Best-effort at init — the host can retry via setConsent() and inspect\n // getStatus(). Don't fail init on a consent hiccup.\n }\n }\n}\n\n/** Bootstrap a guide session and return a ready-to-use {@link GuideClient}. */\nexport async function initGuide(config: InitGuideConfig): Promise<GuideClient> {\n return GuideClient.init(config);\n}\n","import { GuideEvent, SkillResponseType } from \"./types\";\nimport type {\n BusinessCaseDraftRef,\n BusinessCaseFormatOption,\n ContentRecommendation,\n DiagnoseSubtypeName,\n DiagnosticHeader,\n DiagnosticQuestion,\n GuideDocument,\n GuideSkillEvent,\n HowToOutline,\n HowToStep,\n PlaylistHeader,\n PlaylistItem,\n SkillCTA,\n SkillRecommendation,\n SkillResponseTypeType,\n SolutionDesignEdge,\n SolutionDesignHeader,\n SolutionDesignNode,\n} from \"./types\";\n\n/**\n * Renderable state for one skill turn, folded from the `skill` events of a\n * single {@link GuideClient.ask} stream. Which fields fill in depends on\n * `skill`; everything else stays at its empty default:\n *\n * - `answer`: `documents`, `followUpRecommendations`, `ctas`\n * - `recommend`: `contentRecommendations`, `ctas`\n * - `diagnose`: `diagnoseHeader`, `diagnoseQuestions`\n * - `playlist`: `playlistHeader`, `playlistItems`\n * - `howto`: `howToOutline` (render first), then `howToSteps`\n * - `businesscase`: `businessCaseFormats`/`businessCaseDrafts` (chooser), then\n * `businessCaseContent[subType]` markdown as a format streams\n * - `solutiondesign`: `solutionDesignHeader`, `solutionDesignNodes`/`Edges`\n */\nexport interface GuideSkillTurn {\n /** Which skill this turn ran. Null until `skill_start` arrives. */\n skill: SkillResponseTypeType | null;\n /** `streaming` until `skill_end`. */\n status: \"streaming\" | \"complete\";\n /** The assistant message this skill output belongs to. */\n messageId: string | null;\n /** Diagnose mode — `context_gathering` runs `followUpSkill` after answers are submitted. */\n diagnoseSubtype: DiagnoseSubtypeName | null;\n followUpSkill: string | null;\n /** Accumulated long-form markdown body (`skill_content` deltas). */\n content: string;\n /** Source documents behind the reply — render as citation/source cards. */\n documents: GuideDocument[];\n /** The recommend skill's content cards. */\n contentRecommendations: ContentRecommendation[];\n /** Post-answer follow-up pills — `ask(prompt, { forcedSkill: skill })` on click. */\n followUpRecommendations: SkillRecommendation[];\n /** Calls-to-action — render the first below the response. */\n ctas: SkillCTA[];\n diagnoseHeader: DiagnosticHeader | null;\n diagnoseQuestions: DiagnosticQuestion[];\n playlistHeader: PlaylistHeader | null;\n playlistItems: PlaylistItem[];\n howToOutline: HowToOutline | null;\n howToSteps: HowToStep[];\n businessCaseFormats: BusinessCaseFormatOption[];\n businessCaseDrafts: Record<string, BusinessCaseDraftRef>;\n /** Accumulated draft markdown per business case subType. */\n businessCaseContent: Record<string, string>;\n solutionDesignHeader: SolutionDesignHeader | null;\n solutionDesignNodes: SolutionDesignNode[];\n solutionDesignEdges: SolutionDesignEdge[];\n /** Persisted deliverable id (for `client.skills.get`/`update`), set on `skill_end`. */\n skillInstanceId: string | null;\n}\n\n/** A fresh, empty turn state. */\nexport function createSkillTurn(): GuideSkillTurn {\n return {\n skill: null,\n status: \"streaming\",\n messageId: null,\n diagnoseSubtype: null,\n followUpSkill: null,\n content: \"\",\n documents: [],\n contentRecommendations: [],\n followUpRecommendations: [],\n ctas: [],\n diagnoseHeader: null,\n diagnoseQuestions: [],\n playlistHeader: null,\n playlistItems: [],\n howToOutline: null,\n howToSteps: [],\n businessCaseFormats: [],\n businessCaseDrafts: {},\n businessCaseContent: {},\n solutionDesignHeader: null,\n solutionDesignNodes: [],\n solutionDesignEdges: [],\n skillInstanceId: null,\n };\n}\n\n/** A recommendations payload is content cards iff its entries carry `targetSkill`. */\nfunction isContentRecommendations(\n recommendations: ContentRecommendation[] | SkillRecommendation[],\n): recommendations is ContentRecommendation[] {\n return recommendations.length > 0 && \"targetSkill\" in recommendations[0];\n}\n\n/**\n * Fold one `skill` stream event into the turn state. Pure and immutable — the\n * returned object is a new reference whenever anything changed, so the result\n * can back React state directly:\n *\n * ```ts\n * let turn = createSkillTurn();\n * for await (const event of client.ask(message)) {\n * if (event.type === \"skill\") turn = reduceSkillEvent(turn, event);\n * }\n * ```\n */\nexport function reduceSkillEvent(turn: GuideSkillTurn, event: GuideSkillEvent): GuideSkillTurn {\n switch (event.name) {\n case GuideEvent.SkillStart: {\n // A business case turn continues across skill_start when the visitor picks\n // a format from the chooser — preserve the chooser + accumulated drafts.\n const continuesBusinessCase =\n event.value.skill === SkillResponseType.BusinessCase && turn.skill === SkillResponseType.BusinessCase;\n const base = continuesBusinessCase\n ? {\n ...createSkillTurn(),\n businessCaseFormats: turn.businessCaseFormats,\n businessCaseDrafts: turn.businessCaseDrafts,\n businessCaseContent: turn.businessCaseContent,\n }\n : createSkillTurn();\n return {\n ...base,\n skill: event.value.skill,\n messageId: event.value.messageId,\n diagnoseSubtype: event.value.diagnoseSubtype ?? null,\n followUpSkill: event.value.followUpSkill ?? null,\n };\n }\n case GuideEvent.SkillContent:\n return { ...turn, content: turn.content + event.value.delta };\n case GuideEvent.SkillDocuments:\n return { ...turn, documents: event.value.documents };\n case GuideEvent.SkillRecommendations:\n return isContentRecommendations(event.value.recommendations)\n ? { ...turn, contentRecommendations: event.value.recommendations }\n : { ...turn, followUpRecommendations: event.value.recommendations };\n case GuideEvent.SkillCTAs:\n return { ...turn, ctas: event.value.ctas };\n case GuideEvent.SkillDiagnoseHeader:\n return { ...turn, diagnoseHeader: event.value.header };\n case GuideEvent.SkillDiagnoseQuestion:\n return { ...turn, diagnoseQuestions: [...turn.diagnoseQuestions, event.value.question] };\n case GuideEvent.SkillPlaylistHeader:\n return { ...turn, playlistHeader: event.value.header };\n case GuideEvent.SkillPlaylistItems:\n return { ...turn, playlistItems: event.value.items };\n case GuideEvent.SkillPlaylistRationale:\n return {\n ...turn,\n playlistItems: turn.playlistItems.map((item) =>\n item.id === event.value.itemId ? { ...item, rationale: event.value.rationale } : item,\n ),\n };\n case GuideEvent.SkillHowToOutline:\n // The how-to instance is persisted at outline time, so the id can arrive\n // here — long before skill_end — letting consumers save progress early.\n return {\n ...turn,\n howToOutline: event.value.outline,\n skillInstanceId: event.value.skillInstanceId ?? turn.skillInstanceId,\n };\n case GuideEvent.SkillHowToSteps:\n return { ...turn, howToSteps: event.value.steps };\n case GuideEvent.SkillBusinessCaseChooser:\n return { ...turn, businessCaseFormats: event.value.formats, businessCaseDrafts: event.value.drafts };\n case GuideEvent.SkillBusinessCaseDelta: {\n const existing = turn.businessCaseContent[event.value.subType] ?? \"\";\n return {\n ...turn,\n businessCaseContent: { ...turn.businessCaseContent, [event.value.subType]: existing + event.value.delta },\n };\n }\n case GuideEvent.SkillSolutionDesignHeader:\n return { ...turn, solutionDesignHeader: event.value.header };\n case GuideEvent.SkillSolutionDesignDiagram:\n return { ...turn, solutionDesignNodes: event.value.nodes, solutionDesignEdges: event.value.edges };\n case GuideEvent.SkillEnd:\n return {\n ...turn,\n status: \"complete\",\n // skillResponseId is the wire's legacy alias for the same id.\n skillInstanceId: event.value.skillInstanceId ?? event.value.skillResponseId ?? turn.skillInstanceId,\n };\n default: {\n // Exhaustiveness guard: a new GuideSkillEvent variant must be handled here.\n const _exhaustive: never = event;\n return _exhaustive;\n }\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { initGuide, type GuideClient } from \"../GuideClient\";\nimport { createSkillTurn, reduceSkillEvent, type GuideSkillTurn } from \"../skill-state\";\nimport type {\n AskOptions,\n ChatMessage,\n GuideStreamEvent,\n InitGuideConfig,\n ResolvedGuide,\n SkillResponseTypeType,\n SubmitGateOptions,\n SubmitGateResult,\n} from \"../types\";\n\nexport interface UseGuideConfig extends InitGuideConfig {\n /**\n * Called with every raw stream event, in order — the escape hatch for\n * anything the hook's derived state doesn't cover.\n */\n onEvent?: (event: GuideStreamEvent) => void;\n}\n\n/** A pending email gate — the guide wants an email before finishing the turn. */\nexport interface GateRequest {\n /** The skill that was gated. */\n skill: SkillResponseTypeType;\n /** The visitor prompt that triggered the gate (re-sent after unlocking). */\n prompt?: string;\n skillInstanceId?: string;\n}\n\nexport interface UseGuideResult {\n /** The client once bootstrapped, else `null`. */\n client: GuideClient | null;\n /** Resolved guide metadata once ready, else `null`. */\n guide: ResolvedGuide | null;\n /** Conversation history, kept in sync with the client. */\n messages: ChatMessage[];\n /**\n * Structured deliverable of the current / most recent turn (documents,\n * recommendations, CTAs, how-to steps, …). `null` before the first ask.\n */\n skillTurn: GuideSkillTurn | null;\n /**\n * Set when the guide asks for an email mid-turn. Render an email form, call\n * `submitGate(email)`, then `retryLastAsk()` to finish the interrupted turn.\n */\n gate: GateRequest | null;\n /** `true` once the client has finished initializing. */\n isReady: boolean;\n /** `true` while a reply is streaming. */\n isStreaming: boolean;\n /** Init or stream error, else `null`. */\n error: Error | null;\n /** Send a message and stream the reply into `messages` / `skillTurn`. */\n ask: (message: string, options?: AskOptions) => Promise<void>;\n /**\n * Submit the visitor's email — for the pending `gate` (its context is merged\n * in automatically) or as general lead capture. Clears `gate` on success.\n */\n submitGate: (email: string, options?: SubmitGateOptions) => Promise<SubmitGateResult>;\n /** Re-send the last user message, e.g. to finish a gated turn after `submitGate`. */\n retryLastAsk: () => Promise<void>;\n /** Clear the in-memory conversation. */\n reset: () => void;\n}\n\n/**\n * React binding over {@link initGuide}. Bootstraps once per `baseUrl`+`slug`,\n * mirrors the streamed reply into `messages`, folds structured skill events\n * into `skillTurn`, surfaces email gates, and ends the session on unmount —\n * encapsulating the streaming/cleanup patterns so generated UIs stay correct.\n */\nexport function useGuide(config: UseGuideConfig): UseGuideResult {\n const [client, setClient] = useState<GuideClient | null>(null);\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [skillTurn, setSkillTurn] = useState<GuideSkillTurn | null>(null);\n const [gate, setGate] = useState<GateRequest | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const { baseUrl, slug } = config;\n const configRef = useRef(config);\n configRef.current = config;\n // The turn state lives in a ref (not just React state) so the reducer can\n // fold consecutive events synchronously and business-case continuations can\n // read the previous turn without a re-render in between.\n const turnRef = useRef<GuideSkillTurn | null>(null);\n const lastAskRef = useRef<{ message: string; options?: AskOptions } | null>(null);\n\n useEffect(() => {\n let active = true;\n let created: GuideClient | null = null;\n\n // Clear any prior guide's client + state so a baseUrl/slug change doesn't\n // leave callers talking to the old guide (or rendering its messages) while\n // the new one resolves.\n setClient(null);\n setMessages([]);\n setSkillTurn(null);\n setGate(null);\n setError(null);\n turnRef.current = null;\n lastAskRef.current = null;\n\n void initGuide(configRef.current)\n .then((instance) => {\n if (!active) {\n void instance.endSession().catch(() => {});\n return;\n }\n created = instance;\n setClient(instance);\n setError(null);\n })\n .catch((err: unknown) => {\n if (active) setError(err instanceof Error ? err : new Error(String(err)));\n });\n\n return () => {\n active = false;\n void created?.endSession().catch(() => {});\n };\n }, [baseUrl, slug]);\n\n const ask = useCallback(\n async (message: string, options?: AskOptions) => {\n if (!client) return;\n lastAskRef.current = { message, options };\n setIsStreaming(true);\n setError(null);\n // A new ask supersedes a pending gate for the previous turn.\n setGate(null);\n try {\n for await (const event of client.ask(message, options)) {\n configRef.current.onEvent?.(event);\n if (event.type === \"text\" || event.type === \"message-start\") {\n setMessages([...client.messages]);\n } else if (event.type === \"skill\") {\n turnRef.current = reduceSkillEvent(turnRef.current ?? createSkillTurn(), event);\n setSkillTurn(turnRef.current);\n } else if (event.type === \"gate\") {\n setGate({ skill: event.skill, prompt: event.prompt, skillInstanceId: event.skillInstanceId });\n } else if (event.type === \"error\") {\n setError(new Error(event.message));\n }\n }\n setMessages([...client.messages]);\n } catch (err: unknown) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsStreaming(false);\n }\n },\n [client],\n );\n\n const submitGate = useCallback(\n async (email: string, options?: SubmitGateOptions): Promise<SubmitGateResult> => {\n if (!client) throw new Error(\"[brand_brain] Guide is not ready yet — wait for isReady before submitting the gate.\");\n const pending = gate;\n const result = await client.submitGate(email, {\n ...(pending && { skill: pending.skill, prompt: pending.prompt, skillInstanceId: pending.skillInstanceId }),\n ...options,\n });\n if (result.success) setGate(null);\n return result;\n },\n [client, gate],\n );\n\n const retryLastAsk = useCallback(async () => {\n const last = lastAskRef.current;\n if (last) await ask(last.message, last.options);\n }, [ask]);\n\n const reset = useCallback(() => {\n client?.reset();\n setMessages([]);\n setSkillTurn(null);\n setGate(null);\n turnRef.current = null;\n lastAskRef.current = null;\n }, [client]);\n\n return {\n client,\n guide: client?.guide ?? null,\n messages,\n skillTurn,\n gate,\n isReady: client !== null,\n isStreaming,\n error,\n ask,\n submitGate,\n retryLastAsk,\n reset,\n };\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7],"mappings":"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"}
|