@ably/ai-transport 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 +54 -47
- package/dist/ably-ai-transport.js +1006 -539
- package/dist/ably-ai-transport.js.map +1 -1
- package/dist/ably-ai-transport.umd.cjs +1 -1
- package/dist/ably-ai-transport.umd.cjs.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/core/codec/types.d.ts +19 -2
- package/dist/core/transport/decode-history.d.ts +8 -6
- package/dist/core/transport/headers.d.ts +4 -2
- package/dist/core/transport/index.d.ts +4 -1
- package/dist/core/transport/pipe-stream.d.ts +3 -2
- package/dist/core/transport/stream-router.d.ts +11 -1
- package/dist/core/transport/tree.d.ts +171 -0
- package/dist/core/transport/turn-manager.d.ts +4 -1
- package/dist/core/transport/types.d.ts +270 -119
- package/dist/core/transport/view.d.ts +166 -0
- package/dist/errors.d.ts +19 -2
- package/dist/index.d.ts +3 -1
- package/dist/react/ably-ai-transport-react.js +1019 -486
- package/dist/react/ably-ai-transport-react.js.map +1 -1
- package/dist/react/ably-ai-transport-react.umd.cjs +1 -1
- package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -1
- package/dist/react/contexts/transport-context.d.ts +31 -0
- package/dist/react/contexts/transport-provider.d.ts +49 -0
- package/dist/react/create-transport-hooks.d.ts +124 -0
- package/dist/react/index.d.ts +14 -8
- package/dist/react/use-ably-messages.d.ts +14 -8
- package/dist/react/use-active-turns.d.ts +7 -3
- package/dist/react/use-client-transport.d.ts +78 -5
- package/dist/react/use-create-view.d.ts +22 -0
- package/dist/react/use-tree.d.ts +20 -0
- package/dist/react/use-view.d.ts +79 -0
- package/dist/vercel/ably-ai-transport-vercel.js +1478 -842
- package/dist/vercel/ably-ai-transport-vercel.js.map +1 -1
- package/dist/vercel/ably-ai-transport-vercel.umd.cjs +1 -1
- package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -1
- package/dist/vercel/codec/tool-transitions.d.ts +50 -0
- package/dist/vercel/index.d.ts +3 -0
- package/dist/vercel/react/ably-ai-transport-vercel-react.js +9099 -852
- package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -1
- package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +45 -1
- package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -1
- package/dist/vercel/react/contexts/chat-transport-context.d.ts +32 -0
- package/dist/vercel/react/contexts/chat-transport-provider.d.ts +84 -0
- package/dist/vercel/react/index.d.ts +5 -0
- package/dist/vercel/react/use-chat-transport.d.ts +61 -20
- package/dist/vercel/react/use-message-sync.d.ts +41 -9
- package/dist/vercel/react/use-staged-add-tool-approval-response.d.ts +30 -0
- package/dist/vercel/tool-approvals.d.ts +124 -0
- package/dist/vercel/tool-events.d.ts +26 -0
- package/dist/vercel/transport/chat-transport.d.ts +33 -11
- package/dist/vercel/transport/index.d.ts +5 -2
- package/package.json +23 -17
- package/src/constants.ts +6 -0
- package/src/core/codec/encoder.ts +10 -1
- package/src/core/codec/types.ts +19 -3
- package/src/core/transport/client-transport.ts +382 -364
- package/src/core/transport/decode-history.ts +229 -81
- package/src/core/transport/headers.ts +6 -2
- package/src/core/transport/index.ts +13 -5
- package/src/core/transport/pipe-stream.ts +8 -5
- package/src/core/transport/server-transport.ts +212 -58
- package/src/core/transport/stream-router.ts +21 -3
- package/src/core/transport/{conversation-tree.ts → tree.ts} +192 -77
- package/src/core/transport/turn-manager.ts +28 -10
- package/src/core/transport/types.ts +318 -139
- package/src/core/transport/view.ts +840 -0
- package/src/errors.ts +21 -1
- package/src/index.ts +10 -5
- package/src/react/contexts/transport-context.ts +37 -0
- package/src/react/contexts/transport-provider.tsx +164 -0
- package/src/react/create-transport-hooks.ts +144 -0
- package/src/react/index.ts +15 -8
- package/src/react/use-ably-messages.ts +34 -16
- package/src/react/use-active-turns.ts +28 -17
- package/src/react/use-client-transport.ts +184 -24
- package/src/react/use-create-view.ts +68 -0
- package/src/react/use-tree.ts +53 -0
- package/src/react/use-view.ts +233 -0
- package/src/react/vite.config.ts +4 -1
- package/src/vercel/codec/accumulator.ts +64 -79
- package/src/vercel/codec/decoder.ts +11 -8
- package/src/vercel/codec/encoder.ts +68 -54
- package/src/vercel/codec/index.ts +0 -2
- package/src/vercel/codec/tool-transitions.ts +122 -0
- package/src/vercel/index.ts +17 -0
- package/src/vercel/react/contexts/chat-transport-context.ts +40 -0
- package/src/vercel/react/contexts/chat-transport-provider.tsx +122 -0
- package/src/vercel/react/index.ts +14 -0
- package/src/vercel/react/use-chat-transport.ts +164 -42
- package/src/vercel/react/use-message-sync.ts +77 -19
- package/src/vercel/react/use-staged-add-tool-approval-response.ts +87 -0
- package/src/vercel/react/vite.config.ts +4 -2
- package/src/vercel/tool-approvals.ts +380 -0
- package/src/vercel/tool-events.ts +53 -0
- package/src/vercel/transport/chat-transport.ts +225 -79
- package/src/vercel/transport/index.ts +14 -3
- package/dist/core/transport/conversation-tree.d.ts +0 -9
- package/dist/react/use-conversation-tree.d.ts +0 -20
- package/dist/react/use-edit.d.ts +0 -7
- package/dist/react/use-history.d.ts +0 -19
- package/dist/react/use-messages.d.ts +0 -7
- package/dist/react/use-regenerate.d.ts +0 -7
- package/dist/react/use-send.d.ts +0 -7
- package/src/react/use-conversation-tree.ts +0 -71
- package/src/react/use-edit.ts +0 -24
- package/src/react/use-history.ts +0 -111
- package/src/react/use-messages.ts +0 -32
- package/src/react/use-regenerate.ts +0 -24
- package/src/react/use-send.ts +0 -25
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`ably`),require(`ai`)):typeof define==`function`&&define.amd?define([`exports`,`ably`,`ai`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.AblyAiTransportVercel={},e.Ably,e.AI))})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;l<u;l++)d=s[l],!c.call(e,d)&&d!==n&&i(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:r(s(e)),l(t||!e||!e.__esModule?i(n,`default`,{value:e,enumerable:!0}):n,e)))(t);var u=`x-ably-stream`,d=`x-ably-status`,f=`x-ably-stream-id`,p=`x-ably-turn-id`,m=`x-ably-msg-id`,h=`x-ably-turn-client-id`,g=`x-ably-role`,_=`x-ably-cancel-turn-id`,v=`x-ably-cancel-own`,y=`x-ably-cancel-all`,b=`x-ably-cancel-client-id`,x=`x-ably-parent`,ee=`x-ably-fork-of`,S=`x-ably-turn-reason`,C=`x-ably-cancel`,w=`x-ably-turn-start`,T=`x-ably-turn-end`,E=`x-domain-`,D=e=>{let t=e.extras;if(!t||typeof t!=`object`)return{};let n=t.headers;return!n||typeof n!=`object`?{}:n},te=e=>{if(e!==void 0)try{return JSON.parse(e)}catch{return}},O=(e,t)=>({...e,...t}),k=e=>{if(e!==void 0)return e===`true`},A=(e,t)=>e[E+t],j=e=>{let t={};for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==void 0&&(t[n]=e[n]);return t},ne=e=>({str:t=>A(e,t),strOr:(t,n)=>A(e,t)??n,bool:t=>k(A(e,t)),json:t=>te(A(e,t))}),M=()=>{let e={},t={str:(n,r)=>(r!==void 0&&(e[E+n]=r),t),bool:(n,r)=>(r!==void 0&&(e[E+n]=String(r)),t),json:(n,r)=>(r!=null&&(e[E+n]=JSON.stringify(r)),t),build:()=>e};return t},N=e=>j({type:`dynamic-tool`,toolCallId:e.toolCallId,toolName:e.toolName,title:e.title,providerExecuted:e.providerExecuted}),P=class{constructor(e){this._activeIndex=new Map,this._partType=e}start(e,t,n){this._activeIndex.set(e,t.parts.length),t.parts.push({type:this._partType,text:``}),n.set(e,`streaming`)}delta(e,t,n){let r=this._activeIndex.get(e);if(r===void 0)return;let i=t.parts[r];i?.type===this._partType&&(i.text+=n)}end(e,t){t.set(e,`finished`),this._activeIndex.delete(e)}reset(){this._activeIndex=new Map}},re=class{constructor(){this._messageList=[],this._activeMessages=new Map}get messages(){return this._messageList}get completedMessages(){let e=new Set;for(let t of this._activeMessages.values())e.add(t.message);return this._messageList.filter(t=>!e.has(t))}get hasActiveStream(){for(let e of this._activeMessages.values())for(let t of e.streamStatus.values())if(t===`streaming`)return!0;return!1}processOutputs(e){for(let t of e)t.kind===`message`?this._messageList.push(t.message):t.messageId!==void 0&&this._processEvent(t.event,t.messageId)}updateMessage(e){let t=this._messageList.findIndex(t=>t.id===e.id);t!==-1&&(this._messageList[t]=e)}_ensureActiveMessage(e){let t=this._activeMessages.get(e);if(t)return t;let n={message:{id:e,role:`assistant`,parts:[]},textStreams:new P(`text`),reasoningStreams:new P(`reasoning`),toolTrackers:{},streamStatus:new Map};return this._activeMessages.set(e,n),this._messageList.push(n.message),n}_getToolPart(e,t){let n=t.toolTrackers[e];if(!n)return;let r=t.message.parts[n.partIndex];if(r?.type===`dynamic-tool`)return{tracker:n,part:r}}_processEvent(e,t){switch(e.type){case`start`:case`start-step`:case`finish-step`:case`finish`:case`abort`:case`error`:case`message-metadata`:this._processLifecycle(e,t);break;case`text-start`:case`text-delta`:case`text-end`:case`reasoning-start`:case`reasoning-delta`:case`reasoning-end`:this._processTextOrReasoning(e,t);break;case`tool-input-start`:case`tool-input-delta`:case`tool-input-available`:case`tool-input-error`:this._processToolInput(e,t);break;case`tool-output-available`:case`tool-output-error`:case`tool-output-denied`:case`tool-approval-request`:this._processToolOutput(e,t);break;case`file`:case`source-url`:case`source-document`:this._processContentPart(e,t);break;default:if(e.type.startsWith(`data-`)){if(e.transient)break;let n=this._ensureActiveMessage(t),r=j({type:e.type,id:e.id,data:e.data});if(e.id!==void 0){let t=n.message.parts.findIndex(t=>t.type===e.type&&`id`in t&&t.id===e.id);if(t!==-1){n.message.parts[t]=r;break}}n.message.parts.push(r)}break}}_processLifecycle(e,t){switch(e.type){case`start`:{let n=this._ensureActiveMessage(t);e.messageId&&(n.message.id=e.messageId),e.messageMetadata!==void 0&&(n.message.metadata=e.messageMetadata);break}case`start-step`:this._ensureActiveMessage(t).message.parts.push({type:`step-start`});break;case`finish-step`:{let e=this._activeMessages.get(t);e&&(e.textStreams.reset(),e.reasoningStreams.reset());break}case`finish`:{let n=this._activeMessages.get(t);n&&e.messageMetadata!==void 0&&(n.message.metadata=e.messageMetadata),this._activeMessages.delete(t);break}case`abort`:{let e=this._activeMessages.get(t);if(e)for(let[t,n]of e.streamStatus)n===`streaming`&&e.streamStatus.set(t,`aborted`);this._activeMessages.delete(t);break}case`error`:break;case`message-metadata`:{let n=this._activeMessages.get(t);n&&e.messageMetadata!==void 0&&(n.message.metadata=e.messageMetadata);break}}}_processTextOrReasoning(e,t){let n=this._ensureActiveMessage(t);switch(e.type){case`text-start`:n.textStreams.start(e.id,n.message,n.streamStatus);break;case`text-delta`:n.textStreams.delta(e.id,n.message,e.delta);break;case`text-end`:n.textStreams.end(e.id,n.streamStatus);break;case`reasoning-start`:n.reasoningStreams.start(e.id,n.message,n.streamStatus);break;case`reasoning-delta`:n.reasoningStreams.delta(e.id,n.message,e.delta);break;case`reasoning-end`:n.reasoningStreams.end(e.id,n.streamStatus);break}}_processToolInput(e,t){switch(e.type){case`tool-input-start`:{let n=this._ensureActiveMessage(t),r=n.message.parts.length;n.message.parts.push({...N(e),state:`input-streaming`,input:void 0}),n.toolTrackers[e.toolCallId]={partIndex:r,inputText:``},n.streamStatus.set(e.toolCallId,`streaming`);break}case`tool-input-delta`:{let n=this._ensureActiveMessage(t),r=n.toolTrackers[e.toolCallId];if(!r)break;r.inputText+=e.inputTextDelta;let i;try{i=JSON.parse(r.inputText)}catch{i=void 0}let a=this._getToolPart(e.toolCallId,n);if(!a)break;n.message.parts[a.tracker.partIndex]={...N(a.part),state:`input-streaming`,input:i};break}case`tool-input-available`:{let n=this._ensureActiveMessage(t),r=this._getToolPart(e.toolCallId,n);if(!r)break;n.message.parts[r.tracker.partIndex]={...N(r.part),state:`input-available`,input:e.input},n.streamStatus.set(e.toolCallId,`finished`);break}case`tool-input-error`:{let n=this._ensureActiveMessage(t),r=this._getToolPart(e.toolCallId,n);if(r)n.message.parts[r.tracker.partIndex]={...N(r.part),state:`output-error`,input:e.input,errorText:e.errorText};else{let t=n.message.parts.length;n.message.parts.push({...N(e),state:`output-error`,input:e.input,errorText:e.errorText}),n.toolTrackers[e.toolCallId]={partIndex:t,inputText:``}}n.streamStatus.set(e.toolCallId,`finished`);break}}}_processToolOutput(e,t){let n=this._ensureActiveMessage(t),r=this._getToolPart(e.toolCallId,n);if(r)switch(e.type){case`tool-output-available`:n.message.parts[r.tracker.partIndex]=j({...N(r.part),state:`output-available`,input:r.part.input,output:e.output,preliminary:e.preliminary});break;case`tool-output-error`:n.message.parts[r.tracker.partIndex]={...N(r.part),state:`output-error`,input:r.part.input,errorText:e.errorText};break;case`tool-output-denied`:n.message.parts[r.tracker.partIndex]={...N(r.part),state:`output-denied`,input:r.part.input,approval:{id:``,approved:!1}};break;case`tool-approval-request`:n.message.parts[r.tracker.partIndex]={...N(r.part),state:`approval-requested`,input:r.part.input,approval:{id:e.approvalId}};break}}_processContentPart(e,t){let n=this._ensureActiveMessage(t);switch(e.type){case`file`:n.message.parts.push({type:`file`,mediaType:e.mediaType,url:e.url});break;case`source-url`:n.message.parts.push(j({type:`source-url`,sourceId:e.sourceId,url:e.url,title:e.title}));break;case`source-document`:n.message.parts.push(j({type:`source-document`,sourceId:e.sourceId,mediaType:e.mediaType,title:e.title,filename:e.filename}));break}}},ie=()=>new re,ae=e=>[{kind:`event`,event:e}],oe=class{constructor(e,t={}){this._serialState=new Map,this._hooks=e,this._onStreamUpdate=t.onStreamUpdate,this._onStreamDelete=t.onStreamDelete,this._logger=t.logger?.withContext({component:`DecoderCore`})}decode(e){let t=e.action;this._logger?.trace(`DefaultDecoderCore.decode();`,{action:t,serial:e.serial,name:e.name});let n;switch(t){case`message.create`:{let t=this._toPayload(e);n=t.headers?.[`x-ably-stream`]===`true`?this._decodeStreamedCreate(t,e.serial):this._hooks.decodeDiscrete(t);break}case`message.append`:n=this._decodeAppend(e);break;case`message.update`:n=this._decodeUpdate(e);break;case`message.delete`:n=this._decodeDelete(e);break;default:return[]}let r=D(e)[m];if(r)for(let e of n)e.kind===`event`&&(e.messageId=r);return n}_toPayload(e){return{name:e.name??``,data:e.data,headers:D(e)}}_stringData(e){return typeof e.data==`string`?e.data:``}_invokeOnStreamUpdate(e){if(this._onStreamUpdate)try{this._onStreamUpdate(e)}catch(e){this._logger?.error(`DefaultDecoderCore._invokeOnStreamUpdate(); callback threw`,{error:e})}}_invokeOnStreamDelete(e,t){if(this._onStreamDelete)try{this._onStreamDelete(e,t)}catch(e){this._logger?.error(`DefaultDecoderCore._invokeOnStreamDelete(); callback threw`,{error:e})}}_decodeStreamedCreate(e,t){if(!t)return[];let n=e.headers?.[`x-ably-stream-id`]??``,r=e.headers??{},i={name:e.name,streamId:n,accumulated:``,headers:{...r},closed:!1};return this._serialState.set(t,i),this._logger?.debug(`DefaultDecoderCore._decodeStreamedCreate(); new stream`,{name:e.name,streamId:n,serial:t}),this._hooks.buildStartEvents(i)}_decodeAppend(e){let t=e.serial;if(!t)return[];let n=this._serialState.get(t);if(!n)return this._decodeUpdate(e);let r=D(e),i=typeof e.data==`string`?e.data:``,a=r[d],o=[];return i.length>0&&(n.accumulated+=i,o.push(...this._hooks.buildDeltaEvents(n,i))),a===`finished`&&!n.closed?(n.closed=!0,o.push(...this._hooks.buildEndEvents(n,r)),this._logger?.debug(`DefaultDecoderCore._decodeAppend(); stream finished`,{streamId:n.streamId})):a===`aborted`&&!n.closed&&(n.closed=!0,this._logger?.debug(`DefaultDecoderCore._decodeAppend(); stream aborted`,{streamId:n.streamId})),o}_decodeUpdate(e){let t=e.serial;if(!t)return[];let n=this._toPayload(e),r=n.headers??{},i=r[u]===`true`,a=r[d],o=this._serialState.get(t);if(!o)return this._decodeFirstContact(n,i,a,t);let s=this._stringData(e);if(s.startsWith(o.accumulated)){let e=s.slice(o.accumulated.length),t=[];return e.length>0&&(o.accumulated=s,t.push(...this._hooks.buildDeltaEvents(o,e))),a===`finished`&&!o.closed?(o.closed=!0,t.push(...this._hooks.buildEndEvents(o,r))):a===`aborted`&&!o.closed&&(o.closed=!0),t}return o.accumulated=s,o.headers={...r},this._invokeOnStreamUpdate(o),[]}_decodeFirstContact(e,t,n,r){if(!t)return this._hooks.decodeDiscrete(e);let i=e.headers?.[`x-ably-stream-id`]??``,a=e.headers??{},o=typeof e.data==`string`?e.data:``;this._logger?.debug(`DefaultDecoderCore._decodeFirstContact(); first-contact stream`,{name:e.name,streamId:i,serial:r});let s={name:e.name,streamId:i,accumulated:o,headers:{...a},closed:n===`finished`||n===`aborted`};this._serialState.set(r,s);let c=this._hooks.buildStartEvents(s);return o.length>0&&c.push(...this._hooks.buildDeltaEvents(s,o)),n===`finished`&&c.push(...this._hooks.buildEndEvents(s,a)),c}_decodeDelete(e){let t=e.serial;if(!t)return[];let n=this._serialState.get(t);return this._invokeOnStreamDelete(t,n),n&&(n.accumulated=``,n.closed=!0),this._logger?.debug(`DefaultDecoderCore._decodeDelete();`,{serial:t}),[]}},se=(e,t={})=>new oe(e,t),ce=class{constructor(e){this._emitted=new Map,this._phases=e}ensurePhases(e,t){let n=this._getOrCreate(e),r=[];for(let e of this._phases)n.has(e.key)||(n.add(e.key),r.push(...e.build(t)));return r}markEmitted(e,t){this._getOrCreate(e).add(t)}resetPhase(e,t){this._emitted.get(e)?.delete(t)}clearScope(e){this._emitted.delete(e)}_getOrCreate(e){let t=this._emitted.get(e);return t||(t=new Set,this._emitted.set(e,t)),t}},le=e=>new ce(e),F=e=>{let t=ne(e);return{...t,providerMetadata:()=>t.json(`providerMetadata`)}},I=e=>ae(e),ue=(e,t)=>e===`stop`||e===`length`||e===`content-filter`||e===`tool-calls`||e===`error`||e===`other`?e:t,L=e=>e.startsWith(`data-`),R=e=>{if(e)try{return JSON.parse(e)}catch{return e}},z=e=>{let t=F(e.headers);switch(e.name){case`text`:return j({type:`text-start`,id:e.streamId,providerMetadata:t.providerMetadata()});case`reasoning`:return j({type:`reasoning-start`,id:e.streamId,providerMetadata:t.providerMetadata()});case`tool-input`:return j({type:`tool-input-start`,toolCallId:e.streamId,toolName:t.strOr(`toolName`,``),dynamic:t.bool(`dynamic`),title:t.str(`title`),providerExecuted:t.bool(`providerExecuted`),providerMetadata:t.providerMetadata()});default:return{type:`text-start`,id:e.streamId}}},B=(e,t)=>{switch(e.name){case`text`:return{type:`text-delta`,id:e.streamId,delta:t};case`reasoning`:return{type:`reasoning-delta`,id:e.streamId,delta:t};case`tool-input`:return{type:`tool-input-delta`,toolCallId:e.streamId,inputTextDelta:t};default:return{type:`text-delta`,id:e.streamId,delta:t}}},V=(e,t)=>{let n=F(t);switch(e.name){case`text`:return j({type:`text-end`,id:e.streamId,providerMetadata:n.providerMetadata()});case`reasoning`:return j({type:`reasoning-end`,id:e.streamId,providerMetadata:n.providerMetadata()});case`tool-input`:return j({type:`tool-input-available`,toolCallId:e.streamId,toolName:n.strOr(`toolName`,F(e.headers).strOr(`toolName`,``)),input:R(e.accumulated),providerMetadata:n.providerMetadata()});default:return{type:`text-end`,id:e.streamId}}},H=()=>le([{key:`start`,build:e=>[j({type:`start`,messageId:e.messageId})]},{key:`start-step`,build:()=>[{type:`start-step`}]}]),U=(e,t,n)=>e.ensurePhases(t,n).map(e=>({kind:`event`,event:e})),de=(e,t,n)=>(n.markEmitted(t,`start`),I(j({type:`start`,messageId:e.str(`messageId`),messageMetadata:e.json(`messageMetadata`)}))),fe=(e,t)=>(t.markEmitted(e,`start-step`),I({type:`start-step`})),pe=(e,t)=>(t.resetPhase(e,`start-step`),I({type:`finish-step`})),me=(e,t,n)=>(n.clearScope(t),I(j({type:`finish`,finishReason:ue(e.str(`finishReason`),`stop`),messageMetadata:e.json(`messageMetadata`)}))),he=e=>I({type:`error`,errorText:typeof e==`string`?e:``}),ge=(e,t,n)=>(n.clearScope(t),I(j({type:`abort`,reason:typeof e==`string`&&e?e:void 0}))),_e=e=>I({type:`message-metadata`,messageMetadata:e.json(`messageMetadata`)}),ve=(e,t)=>I(j({type:`file`,url:typeof t==`string`?t:``,mediaType:e.strOr(`mediaType`,``),providerMetadata:e.providerMetadata()})),ye=(e,t)=>I(j({type:`source-url`,sourceId:e.strOr(`sourceId`,``),url:typeof t==`string`?t:``,title:e.str(`title`),providerMetadata:e.providerMetadata()})),be=e=>I(j({type:`source-document`,sourceId:e.strOr(`sourceId`,``),mediaType:e.strOr(`mediaType`,``),title:e.strOr(`title`,``),filename:e.str(`filename`),providerMetadata:e.providerMetadata()})),xe=(e,t)=>{let n=t;return I(j({type:`tool-input-error`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),errorText:n?.errorText??``,input:n?.input,dynamic:e.bool(`dynamic`),title:e.str(`title`),providerExecuted:e.bool(`providerExecuted`),providerMetadata:e.providerMetadata()}))},Se=(e,t)=>{let n=t;return I(j({type:`tool-output-available`,toolCallId:e.strOr(`toolCallId`,``),output:n?.output,dynamic:e.bool(`dynamic`),providerExecuted:e.bool(`providerExecuted`),preliminary:e.bool(`preliminary`)}))},Ce=(e,t)=>{let n=t;return I(j({type:`tool-output-error`,toolCallId:e.strOr(`toolCallId`,``),errorText:n?.errorText??``,dynamic:e.bool(`dynamic`),providerExecuted:e.bool(`providerExecuted`)}))},we=e=>I({type:`tool-approval-request`,toolCallId:e.strOr(`toolCallId`,``),approvalId:e.strOr(`approvalId`,``)}),Te=e=>I({type:`tool-output-denied`,toolCallId:e.strOr(`toolCallId`,``)}),Ee=(e,t,n)=>I(j({type:e,data:n,id:t.str(`id`),transient:t.bool(`transient`)})),De=(e,t,n,r)=>{let i=U(r,n,{messageId:e.str(`messageId`)});return i.push({kind:`event`,event:j({type:`tool-input-start`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),dynamic:e.bool(`dynamic`),title:e.str(`title`),providerExecuted:e.bool(`providerExecuted`),providerMetadata:e.providerMetadata()})},{kind:`event`,event:j({type:`tool-input-available`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),input:t,providerMetadata:e.providerMetadata()})}),i},Oe=e=>{let t=e.headers??{},n=F(t),r=t[`x-ably-role`]??`user`,i=n.str(`messageId`)??``,a;switch(e.name){case`text`:a={type:`text`,text:typeof e.data==`string`?e.data:``};break;case`file`:a={type:`file`,mediaType:n.strOr(`mediaType`,``),url:typeof e.data==`string`?e.data:``};break;default:L(e.name)&&(a=j({type:e.name,id:n.str(`id`),data:e.data}));break}return a?[{kind:`message`,message:{id:i,role:r,parts:[a]}}]:[]},ke=(e,t)=>(e===`text`||e===`file`||L(e))&&`x-ably-role`in t,Ae=(e,t)=>{let n=e.headers??{},r=F(n),i=n[`x-ably-turn-id`]??``;if(ke(e.name,n))return Oe(e);if(e.name===`tool-input`)return De(r,e.data,i,t);switch(e.name){case`start`:return de(r,i,t);case`start-step`:return fe(i,t);case`finish-step`:return pe(i,t);case`finish`:return me(r,i,t);case`error`:return he(e.data);case`abort`:return ge(e.data,i,t);case`message-metadata`:return _e(r);case`file`:return ve(r,e.data);case`source-url`:return ye(r,e.data);case`source-document`:return be(r);case`tool-input-error`:return xe(r,e.data);case`tool-output-available`:return Se(r,e.data);case`tool-output-error`:return Ce(r,e.data);case`tool-approval-request`:return we(r);case`tool-output-denied`:return Te(r);default:return L(e.name)?Ee(e.name,r,e.data):[]}},je=e=>({buildStartEvents:t=>{let n=U(e,t.headers[`x-ably-turn-id`]??``,{messageId:F(t.headers).str(`messageId`)});return n.push({kind:`event`,event:z(t)}),n},buildDeltaEvents:(e,t)=>I(B(e,t)),buildEndEvents:(e,t)=>I(V(e,t)),decodeDiscrete:t=>Ae(t,e)}),Me=class{constructor(e={}){this._core=se(je(H()),e)}decode(e){return this._core.decode(e)}},Ne=(e={})=>new Me(e),W=function(e){return e[e.BadRequest=4e4]=`BadRequest`,e[e.InvalidArgument=40003]=`InvalidArgument`,e[e.EncoderRecoveryFailed=104e3]=`EncoderRecoveryFailed`,e[e.TransportSubscriptionError=104001]=`TransportSubscriptionError`,e[e.CancelListenerError=104002]=`CancelListenerError`,e[e.TurnLifecycleError=104003]=`TurnLifecycleError`,e[e.TransportClosed=104004]=`TransportClosed`,e[e.TransportSendFailed=104005]=`TransportSendFailed`,e}({}),Pe=(e,t)=>e.code===t,Fe=class{constructor(e,t={}){this._trackers=new Map,this._pending=[],this._closed=!1,this._writer=e,this._defaultClientId=t.clientId,this._defaultExtras=t.extras,this._onMessageHook=t.onMessage??(()=>{}),this._logger=t.logger?.withContext({component:`EncoderCore`})}async publishDiscrete(e,t){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.publishDiscrete();`,{name:e.name});let n=this._buildDiscreteMessage(e,t);return this._writer.publish(n)}async publishDiscreteBatch(e,t){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.publishDiscreteBatch();`,{count:e.length});let n=e.map(e=>this._buildDiscreteMessage(e,t));return this._writer.publish(n)}async startStream(e,n,r){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.startStream();`,{name:n.name,streamId:e});let i=this._buildHeaders(n.headers??{},r);i[u]=`true`,i[d]=`streaming`,i[f]=e;let a=this._resolveClientId(r),o={name:n.name,data:n.data,extras:{headers:i},...a?{clientId:a}:{}};this._invokeOnMessage(o);let s=(await this._writer.publish(o)).serials[0];if(!s)throw new t.ErrorInfo(`unable to start stream; no serial returned for stream '${n.name}' (streamId: ${e})`,W.BadRequest,400);this._trackers.set(e,{serial:s,name:n.name,streamId:e,accumulated:n.data,persistentHeaders:i,aborted:!1}),this._logger?.debug(`DefaultEncoderCore.startStream(); stream started`,{name:n.name,streamId:e,serial:s})}appendStream(e,n){this._assertNotClosed();let r=this._trackers.get(e);if(!r)throw new t.ErrorInfo(`unable to append to stream; no active stream for streamId '${e}'`,W.InvalidArgument,400);r.accumulated+=n;let i={serial:r.serial,data:n,extras:{headers:{...r.persistentHeaders}}};this._invokeOnMessage(i);let a=this._writer.appendMessage(i);this._pending.push({promise:a,streamId:e})}async closeStream(e,n){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.closeStream();`,{streamId:e});let r=this._trackers.get(e);if(!r)throw new t.ErrorInfo(`unable to close stream; no active stream for streamId '${e}'`,W.InvalidArgument,400);r.accumulated+=n.data;let i=this._buildClosingHeaders(r,n.headers??{});i[d]=`finished`;let a={serial:r.serial,data:n.data,extras:{headers:i}};this._invokeOnMessage(a);let o=this._writer.appendMessage(a);this._pending.push({promise:o,streamId:e}),await this._flushPending(),this._logger?.debug(`DefaultEncoderCore.closeStream(); stream closed`,{streamId:e})}async abortStream(e,n){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.abortStream();`,{streamId:e});let r=this._trackers.get(e);if(!r)throw new t.ErrorInfo(`unable to abort stream; no active stream for streamId '${e}'`,W.InvalidArgument,400);r.aborted=!0;let i=this._buildClosingHeaders(r,{},n);i[d]=`aborted`;let a={serial:r.serial,data:``,extras:{headers:i}};this._invokeOnMessage(a);let o=this._writer.appendMessage(a);this._pending.push({promise:o,streamId:e}),await this._flushPending(),this._logger?.debug(`DefaultEncoderCore.abortStream(); stream aborted`,{streamId:e})}async abortAllStreams(e){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.abortAllStreams();`,{streamCount:this._trackers.size});for(let t of this._trackers.values()){t.aborted=!0;let n=this._buildClosingHeaders(t,{},e);n[d]=`aborted`;let r={serial:t.serial,data:``,extras:{headers:n}};this._invokeOnMessage(r);let i=this._writer.appendMessage(r);this._pending.push({promise:i,streamId:t.streamId})}await this._flushPending()}async _flushPending(){if(this._flushPromise)return this._flushPromise;let e=this._pending;if(this._pending=[],e.length!==0){this._logger?.trace(`DefaultEncoderCore._flushPending();`,{count:e.length}),this._flushPromise=this._doFlush(e);try{await this._flushPromise}finally{this._flushPromise=void 0}}}async _doFlush(e){let n=await Promise.allSettled(e.map(async e=>e.promise)),r=new Set;for(let[t,i]of n.entries()){let n=e[t];n&&i.status===`rejected`&&r.add(n.streamId)}if(r.size===0){this._logger?.debug(`DefaultEncoderCore._flushPending(); all appends succeeded`);return}this._logger?.warn(`DefaultEncoderCore._flushPending(); recovering failed appends`,{failedStreams:[...r]});let i=[];for(let e of r){let t=this._trackers.get(e);if(!t)continue;let n=t.aborted?`aborted`:`finished`,r={serial:t.serial,data:t.accumulated,extras:{headers:{...t.persistentHeaders,[d]:n}}};try{await this._writer.updateMessage(r)}catch(t){i.push({streamId:e,error:t})}}if(i.length>0){let e=i.map(e=>e.streamId).join(`, `);throw this._logger?.error(`DefaultEncoderCore._flushPending(); recovery failed`,{failedStreams:e}),new t.ErrorInfo(`unable to flush pending appends; recovery failed for stream(s): ${e}`,W.EncoderRecoveryFailed,500)}}async close(){if(!this._closed){this._logger?.trace(`DefaultEncoderCore.close();`),this._closed=!0;try{await this._flushPending()}finally{this._trackers.clear()}this._logger?.debug(`DefaultEncoderCore.close(); encoder closed`)}}_invokeOnMessage(e){try{this._onMessageHook(e)}catch(e){this._logger?.error(`DefaultEncoderCore._invokeOnMessage(); hook threw`,{error:e})}}_assertNotClosed(){if(this._closed)throw new t.ErrorInfo(`unable to write to encoder; encoder has been closed`,W.InvalidArgument,400)}_resolveClientId(e){return e?.clientId??this._defaultClientId}_buildHeaders(e,t){let n={...O(this._defaultExtras?.headers,t?.extras?.headers),...e};return t?.messageId!==void 0&&(n[m]=t.messageId),n}_buildDiscreteMessage(e,t){let n=this._buildHeaders(e.headers??{},t);n[u]=`false`;let r=this._resolveClientId(t),i={name:e.name,data:e.data,extras:{headers:n,...e.ephemeral?{ephemeral:!0}:{}},...r?{clientId:r}:{}};return this._invokeOnMessage(i),i}_buildClosingHeaders(e,t,n){let r={...e.persistentHeaders},i=O(this._defaultExtras?.headers,n?.extras?.headers);return Object.assign(r,i),Object.assign(r,t),r}},Ie=(e,t={})=>new Fe(e,t),Le=class{constructor(e,t={}){this._aborted=!1,this._core=Ie(e,t)}async appendEvent(e,n){switch(e.type){case`text-start`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.id,{name:`text`,data:``,headers:t},n);break}case`reasoning-start`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.id,{name:`reasoning`,data:``,headers:t},n);break}case`tool-input-start`:{let t=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).bool(`dynamic`,e.dynamic).str(`title`,e.title).bool(`providerExecuted`,e.providerExecuted).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.toolCallId,{name:`tool-input`,data:``,headers:t},n);break}case`text-delta`:this._core.appendStream(e.id,e.delta);break;case`reasoning-delta`:this._core.appendStream(e.id,e.delta);break;case`tool-input-delta`:this._core.appendStream(e.toolCallId,e.inputTextDelta);break;case`text-end`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.closeStream(e.id,{name:`text`,data:``,headers:t});break}case`reasoning-end`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.closeStream(e.id,{name:`reasoning`,data:``,headers:t});break}case`tool-input-available`:try{let t=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).json(`providerMetadata`,e.providerMetadata).build();await this._core.closeStream(e.toolCallId,{name:`tool-input`,data:``,headers:t})}catch(n){if(!(n instanceof t.ErrorInfo&&Pe(n,W.InvalidArgument)))throw n;let r=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).bool(`dynamic`,e.dynamic).str(`title`,e.title).bool(`providerExecuted`,e.providerExecuted).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`tool-input`,data:e.input,headers:r})}break;case`start`:{let t=M().str(`messageId`,e.messageId).json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`start`,data:``,headers:t},n);break}case`start-step`:await this._core.publishDiscrete({name:`start-step`,data:``},n);break;case`finish-step`:await this._core.publishDiscrete({name:`finish-step`,data:``},n);break;case`finish`:{let t=M().str(`finishReason`,e.finishReason).json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`finish`,data:``,headers:t},n);break}case`error`:await this._core.publishDiscrete({name:`error`,data:e.errorText},n);break;case`abort`:this._aborted=!0,await this._core.abortAllStreams(n),await this._core.publishDiscrete({name:`abort`,data:e.reason??``,headers:{[d]:`aborted`}},n);break;case`tool-input-error`:{let t=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).bool(`dynamic`,e.dynamic).str(`title`,e.title).bool(`providerExecuted`,e.providerExecuted).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`tool-input-error`,data:{errorText:e.errorText,input:e.input},headers:t});break}case`tool-output-available`:{let t=M().str(`toolCallId`,e.toolCallId).bool(`dynamic`,e.dynamic).bool(`providerExecuted`,e.providerExecuted).bool(`preliminary`,e.preliminary).build();await this._core.publishDiscrete({name:`tool-output-available`,data:{output:e.output},headers:t});break}case`tool-output-error`:{let t=M().str(`toolCallId`,e.toolCallId).bool(`dynamic`,e.dynamic).bool(`providerExecuted`,e.providerExecuted).build();await this._core.publishDiscrete({name:`tool-output-error`,data:{errorText:e.errorText},headers:t});break}case`tool-approval-request`:{let t=M().str(`toolCallId`,e.toolCallId).str(`approvalId`,e.approvalId).build();await this._core.publishDiscrete({name:`tool-approval-request`,data:``,headers:t},n);break}case`tool-output-denied`:{let t=M().str(`toolCallId`,e.toolCallId).build();await this._core.publishDiscrete({name:`tool-output-denied`,data:``,headers:t},n);break}case`file`:{let t=M().str(`mediaType`,e.mediaType).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`file`,data:e.url,headers:t},n);break}case`source-url`:{let t=M().str(`sourceId`,e.sourceId).str(`title`,e.title).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`source-url`,data:e.url,headers:t},n);break}case`source-document`:{let t=M().str(`sourceId`,e.sourceId).str(`mediaType`,e.mediaType).str(`title`,e.title).str(`filename`,e.filename).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`source-document`,data:``,headers:t},n);break}case`message-metadata`:{let t=M().json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`message-metadata`,data:``,headers:t},n);break}default:if(e.type.startsWith(`data-`)){let t=M().str(`id`,e.id).bool(`transient`,e.transient).build(),r=e.transient===!0;await this._core.publishDiscrete({name:e.type,data:e.data,headers:t,ephemeral:r},n)}break}}async writeEvent(e,n){if(!e.type.startsWith(`data-`))throw new t.ErrorInfo(`unable to write event; only data-* chunk types are supported, got '${e.type}'`,W.InvalidArgument,400);let r=M().str(`id`,`id`in e?e.id:void 0).bool(`transient`,`transient`in e?e.transient:void 0).build(),i=`transient`in e&&e.transient===!0;return this._core.publishDiscrete({name:e.type,data:`data`in e?e.data:void 0,headers:r,ephemeral:i},n)}async writeMessages(e,t){let n=e.flatMap(e=>Re(e));return this._core.publishDiscreteBatch(n,t)}async abort(e){this._aborted||(this._aborted=!0,await this._core.abortAllStreams(),await this._core.publishDiscrete({name:`abort`,data:e??``,headers:{[d]:`aborted`}}))}async close(){await this._core.close()}},Re=e=>{let t=e.id,r=[];for(let i of e.parts)switch(i.type){case`text`:r.push({name:`text`,data:i.text,headers:M().str(`messageId`,t).build()});break;case`file`:r.push({name:`file`,data:i.url,headers:M().str(`messageId`,t).str(`mediaType`,i.mediaType).build()});break;default:(0,n.isDataUIPart)(i)&&r.push({name:i.type,data:i.data,headers:M().str(`messageId`,t).str(`id`,i.id).build()});break}return r.length===0&&r.push({name:`text`,data:``,headers:M().str(`messageId`,t).build()}),r},G={createEncoder:(e,t={})=>new Le(e,t),createDecoder:Ne,createAccumulator:ie,getMessageKey:e=>e.id,isTerminal:e=>e.type===`finish`||e.type===`error`||e.type===`abort`},ze=(e,n)=>({sendMessages:async r=>{let{messages:i,abortSignal:a,trigger:o,messageId:s}=r,c,l;if(o===`regenerate-message`)c=[],l=i;else{if(i.length===0)throw new t.ErrorInfo(`unable to send messages; messages array is empty for submit-message trigger`,W.InvalidArgument,400);c=[i.at(-1)],l=i.slice(0,-1)}let u,d;if(o===`regenerate-message`&&s){u=s;let t=e.getTree().getNodeByKey(s);t&&(u=t.msgId,d=t.parentId)}let f,p;if(n?.prepareSendMessagesRequest){let e=n.prepareSendMessagesRequest({id:r.chatId,trigger:o,messageId:s,history:l,messages:c,forkOf:u,parent:d});f=e.body??{},p=e.headers}else f={history:l.map(t=>({message:t,headers:e.getMessageHeaders(t)})),id:r.chatId,trigger:o,...s!==void 0&&{messageId:s},...u!==void 0&&{forkOf:u},...d!==void 0&&{parent:d}},p=void 0;let m={body:f,headers:p};u!==void 0&&(m.forkOf=u),d!==void 0&&(m.parent=d);let h=await e.send(c,m);a&&a.addEventListener(`abort`,()=>void e.cancel({all:!0}),{once:!0});let{readable:g,writable:_}=new TransformStream,v=_.getWriter();return h.stream.pipeTo(new WritableStream({close:()=>{v.close().catch(()=>{})},abort:()=>{v.close().catch(()=>{})}})).catch(()=>{v.close().catch(()=>{})}),g},reconnectToStream:()=>Promise.resolve(null),close:async t=>e.close(t)}),Be=e=>({logAction:(t,n,r)=>{e.error(n,{detail:r})},shouldLog:()=>!0}),Ve=t.Realtime.EventEmitter,He=class extends Ve{constructor(e){super(Be(e))}},K=function(e){return e.Trace=`trace`,e.Debug=`debug`,e.Info=`info`,e.Warn=`warn`,e.Error=`error`,e.Silent=`silent`,e}({}),Ue=(e,t,n)=>{let r=n?`, context: ${JSON.stringify(n)}`:``,i=`[${new Date().toISOString()}] ${t.valueOf().toUpperCase()} ably-ai-transport: ${e}${r}`;switch(t){case K.Trace:case K.Debug:console.log(i);break;case K.Info:console.info(i);break;case K.Warn:console.warn(i);break;case K.Error:console.error(i);break;case K.Silent:break}},We=e=>new Ge(e.logHandler??Ue,e.logLevel),q=function(e){return e[e.Trace=0]=`Trace`,e[e.Debug=1]=`Debug`,e[e.Info=2]=`Info`,e[e.Warn=3]=`Warn`,e[e.Error=4]=`Error`,e[e.Silent=5]=`Silent`,e}(q||{}),J=new Map([[K.Trace,q.Trace],[K.Debug,q.Debug],[K.Info,q.Info],[K.Warn,q.Warn],[K.Error,q.Error],[K.Silent,q.Silent]]),Ge=class e{constructor(e,n,r){this._handler=e,this._context=r;let i=J.get(n);if(i===void 0)throw new t.ErrorInfo(`unable to create logger; invalid log level: ${n}`,W.InvalidArgument,400);this._levelNumber=i}trace(e,t){this._write(e,K.Trace,q.Trace,t)}debug(e,t){this._write(e,K.Debug,q.Debug,t)}info(e,t){this._write(e,K.Info,q.Info,t)}warn(e,t){this._write(e,K.Warn,q.Warn,t)}error(e,t){this._write(e,K.Error,q.Error,t)}withContext(t){let n=[...J.entries()].find(([,e])=>e===this._levelNumber)?.[0]??K.Error;return new e(this._handler,n,this._mergeContext(t))}_write(e,t,n,r){n>=this._levelNumber&&this._handler(e,t,this._mergeContext(r))}_mergeContext(e){return this._context?e?{...this._context,...e}:this._context:e??void 0}},Ke=class{constructor(e,t){this._nodeIndex=new Map,this._codecKeyIndex=new Map,this._sortedList=[],this._parentIndex=new Map,this._selections=new Map,this._seqCounter=0,this._getKey=e,this._logger=t}_compareNodes(e,t){let n=e.node.serial,r=t.node.serial;return n===void 0&&r===void 0?e.insertSeq-t.insertSeq:n===void 0?1:r===void 0||n<r?-1:n>r?1:e.insertSeq-t.insertSeq}_insertSorted(e){if(e.node.serial===void 0){this._sortedList.push(e);return}let t=0,n=this._sortedList.length;for(;t<n;){let r=t+n>>>1,i=this._sortedList[r];if(!i)break;this._compareNodes(i,e)<=0?t=r+1:n=r}this._sortedList.splice(t,0,e)}_removeSorted(e){let t=this._sortedList.indexOf(e);t!==-1&&this._sortedList.splice(t,1)}_addToParentIndex(e,t){let n=this._parentIndex.get(e);n||(n=new Set,this._parentIndex.set(e,n)),n.add(t)}_removeFromParentIndex(e,t){let n=this._parentIndex.get(e);n&&(n.delete(t),n.size===0&&this._parentIndex.delete(e))}_getSiblingGroup(e){let t=this._nodeIndex.get(e);if(!t)return[];let n=t.node,r=new Set([n.msgId]);for(;n.forkOf&&!r.has(n.forkOf);){let e=this._nodeIndex.get(n.forkOf);if(!e||e.node.parentId!==n.parentId)break;n=e.node,r.add(n.msgId)}let i=n.parentId,a=n.msgId,o=[],s=this._parentIndex.get(i);if(s)for(let e of s){let t=this._nodeIndex.get(e);t&&this._isSiblingOf(t.node,a)&&o.push(t)}return o.sort((e,t)=>this._compareNodes(e,t)),o.map(e=>e.node)}_isSiblingOf(e,t){if(e.msgId===t)return!0;let n=e,r=new Set([n.msgId]);for(;n.forkOf;){if(n.forkOf===t)return!0;if(r.has(n.forkOf))break;let e=this._nodeIndex.get(n.forkOf);if(!e)break;n=e.node,r.add(n.msgId)}return!1}_getGroupRoot(e){let t=this._nodeIndex.get(e);if(!t)return e;let n=t.node,r=new Set([n.msgId]);for(;n.forkOf&&!r.has(n.forkOf);){let e=this._nodeIndex.get(n.forkOf);if(!e||e.node.parentId!==n.parentId)break;n=e.node,r.add(n.msgId)}return n.msgId}flatten(){let e=[],t=new Set,n=new Map;for(let r of this._sortedList){let i=r.node,{msgId:a,parentId:o}=i;if(o!==void 0&&!t.has(o))continue;let s=this._getSiblingGroup(a);if(s.length>1){let e=this._getGroupRoot(a),t=n.get(e);if(t===void 0){let r=this._selections.get(e)??s.length-1,i=s[Math.max(0,Math.min(r,s.length-1))];if(!i)break;t=i.msgId,n.set(e,t)}if(a!==t)continue}t.add(a),e.push(i.message)}return e}getSiblings(e){return this._getSiblingGroup(e).map(e=>e.message)}hasSiblings(e){return this._getSiblingGroup(e).length>1}getSelectedIndex(e){let t=this._getSiblingGroup(e);if(t.length<=1)return 0;let n=this._getGroupRoot(e),r=this._selections.get(n);return r===void 0?t.length-1:Math.max(0,Math.min(r,t.length-1))}select(e,t){this._logger.debug(`ConversationTree.select();`,{msgId:e,index:t});let n=this._getSiblingGroup(e);if(n.length<=1)return;let r=this._getGroupRoot(e);this._selections.set(r,Math.max(0,Math.min(t,n.length-1)))}getNode(e){return this._nodeIndex.get(e)?.node}getNodeByKey(e){let t=this._codecKeyIndex.get(e);if(t)return this._nodeIndex.get(t)?.node}getHeaders(e){return this._nodeIndex.get(e)?.node.headers}upsert(e,t,n,r){let i=n[`x-ably-parent`]??void 0,a=n[`x-ably-fork-of`]??void 0;this._codecKeyIndex.set(this._getKey(t),e);let o=this._nodeIndex.get(e);if(o){o.node.message=t,Object.keys(n).length>0&&(o.node.headers={...n}),r&&!o.node.serial&&(this._logger.debug(`ConversationTree.upsert(); promoting serial`,{msgId:e,serial:r}),o.node.serial=r,this._removeSorted(o),this._insertSorted(o));return}this._logger.trace(`ConversationTree.upsert(); inserting new node`,{msgId:e,parentId:i,forkOf:a});let s={node:{message:t,msgId:e,parentId:i,forkOf:a,headers:{...n},serial:r},insertSeq:this._seqCounter++};this._nodeIndex.set(e,s),this._addToParentIndex(i,e),this._insertSorted(s)}delete(e){let t=this._nodeIndex.get(e);if(!t)return;this._logger.debug(`ConversationTree.delete();`,{msgId:e});let{node:n}=t,r=this._getKey(n.message);this._codecKeyIndex.get(r)===e&&this._codecKeyIndex.delete(r),this._removeFromParentIndex(n.parentId,e),this._removeSorted(t),this._nodeIndex.delete(e),this._selections.delete(e)}},qe=(e,t)=>new Ke(e,t),Y=e=>{let t=[...e.rawMessages].toReversed(),n=e.codec.createDecoder(),r=new Map,i=e.codec.createAccumulator(),a=0,o=new Map,s=new Map;for(let c of t){let t=n.decode(c),l=D(c),u=l[p],d=l[m],f=c.serial;if(u){let n=r.get(u);if(n||(n={accumulator:e.codec.createAccumulator(),firstSeen:a++,msgHeaders:new Map,msgSerials:new Map},r.set(u,n)),d){let e=n.msgHeaders.get(d);e?Object.keys(l).length>0&&Object.assign(e,l):(n.msgHeaders.set(d,{...l}),f&&n.msgSerials.set(d,f))}n.accumulator.processOutputs(t)}else i.processOutputs(t);for(let n of t)if(n.kind===`message`){let t=e.getMessageKey(n.message),r=o.get(t);r?Object.keys(l).length>0&&Object.assign(r,l):(o.set(t,{...l}),f&&s.set(t,f))}}let c=[];for(let t of i.completedMessages){let n=e.getMessageKey(t);c.push({message:t,headers:o.get(n)??{},serial:s.get(n)??``})}let l=[...r.values()].toSorted((e,t)=>e.firstSeen-t.firstSeen);for(let t of l){let n=new Set,r=new Map,i=new Map;for(let a of t.accumulator.completedMessages){let t=e.getMessageKey(a),c=o.get(t);if(c){r.set(t,c);let e=s.get(t);e&&i.set(t,e);let a=c[m];a&&n.add(a)}}let a=[...t.msgHeaders.entries()].filter(([e])=>!n.has(e)),l=0;for(let n of t.accumulator.completedMessages){let o=e.getMessageKey(n),s=a[l];if(!r.has(o)&&s){let[e,n]=s;r.set(o,n);let a=t.msgSerials.get(e);a&&i.set(o,a),l++}}for(let n of t.accumulator.completedMessages){let t=e.getMessageKey(n);c.push({message:n,headers:r.get(t)??{},serial:i.get(t)??``})}}return c.toReversed()},X=async(e,t,n)=>{e.rawMessages.push(...t.items),e.lastAblyPage=t;let r=Y(e).length;for(;r<e.returnedCount+n&&t.hasNext();){e.logger.debug(`decodeHistory.fetchUntilLimit(); fetching next page`,{collected:e.rawMessages.length,decoded:r});let n=await t.next();if(!n)break;t=n,e.rawMessages.push(...n.items),e.lastAblyPage=n,r=Y(e).length}},Z=(e,t)=>{let n=Y(e),r=n.slice(e.returnedCount,e.returnedCount+t),i=[...r].toReversed();e.returnedCount+=r.length;let a=n.length>e.returnedCount,o=e.lastAblyPage?.hasNext()??!1,s=e.rawMessages.length-e.returnedRawCount>0?e.rawMessages.slice(e.returnedRawCount).toReversed():[];return e.returnedRawCount=e.rawMessages.length,{items:i.map(e=>e.message),itemHeaders:i.map(e=>e.headers),itemSerials:i.map(e=>e.serial),rawMessages:s,hasNext:()=>a||o,next:async()=>{if(a)return Z(e,t);if(!o||!e.lastAblyPage)return;let n=await e.lastAblyPage.next();if(n)return await X(e,n,t),Z(e,t)}}},Je=async(e,t,n,r)=>{let i=n?.limit??100,a={codec:t,rawMessages:[],returnedCount:0,returnedRawCount:0,lastAblyPage:void 0,getMessageKey:t.getMessageKey.bind(t),logger:r};r.trace(`decodeHistory();`,{limit:i});let o=i*10;return await e.attach(),await X(a,await e.history({untilAttach:!0,limit:o}),i),Z(a,i)},Q=e=>{let t={[g]:e.role,[p]:e.turnId,[m]:e.msgId};return e.turnClientId!==void 0&&(t[h]=e.turnClientId),e.parent&&(t[x]=e.parent),e.forkOf&&(t[ee]=e.forkOf),t},Ye=class{constructor(e,t){this._turns=new Map,this._isTerminal=e,this._logger=t}createStream(e){this._logger.trace(`StreamRouter.createStream();`,{turnId:e});let n={},r=new ReadableStream({start(e){n.controller=e}});if(!n.controller)throw new t.ErrorInfo(`unable to create stream; ReadableStream start() was not called synchronously`,W.TransportSubscriptionError,500);return this._turns.set(e,{controller:n.controller,turnId:e}),r}closeStream(e){let t=this._turns.get(e);if(!t)return!1;this._logger.debug(`StreamRouter.closeStream(); closing stream`,{turnId:e});try{t.controller.close()}catch{}return this._turns.delete(e),!0}route(e,t){let n=this._turns.get(e);if(!n)return!1;try{n.controller.enqueue(t)}catch{return this._turns.delete(e),!1}return this._isTerminal(t)&&this.closeStream(e),!0}has(e){return this._turns.has(e)}},Xe=(e,t)=>new Ye(e,t),Ze=()=>{},$=class{constructor(e){if(this._ownMsgIds=new Set,this._ownTurnIds=new Set,this._turnClientIds=new Map,this._turnMsgIds=new Map,this._turnObservers=new Map,this._ablyMessages=[],this._withheldKeys=new Set,this._closed=!1,this._channel=e.channel,this._codec=e.codec,this._clientId=e.clientId,this._api=e.api??`/api/chat`,this._credentials=e.credentials,this._headersFn=typeof e.headers==`function`?e.headers:e.headers?()=>e.headers:void 0,this._bodyFn=typeof e.body==`function`?e.body:e.body?()=>e.body:void 0,this._fetchFn=e.fetch??globalThis.fetch.bind(globalThis),this._logger=(e.logger??We({logLevel:K.Silent})).withContext({component:`ClientTransport`}),this._emitter=new He(this._logger),this._tree=qe(this._codec.getMessageKey.bind(this._codec),this._logger),this._router=Xe(this._codec.isTerminal.bind(this._codec),this._logger),this._decoder=this._codec.createDecoder(),e.messages){let t;for(let n of e.messages){let e=this._codec.getMessageKey(n),r={};t&&(r[x]=t),this._tree.upsert(e,n,r),t=e}this._emitter.emit(`message`)}this._onMessage=e=>{this._handleMessage(e)},this._attachPromise=this._channel.subscribe(this._onMessage)}_handleMessage(e){if(!this._closed){this._ablyMessages.push(e),this._emitter.emit(`ably-message`);try{if(e.name===`x-ably-turn-start`){let t=D(e),n=t[p],r=t[`x-ably-turn-client-id`]??``;n&&(this._turnClientIds.set(n,r),this._emitter.emit(`turn`,{type:w,turnId:n,clientId:r}));return}if(e.name===`x-ably-turn-end`){let t=D(e),n=t[p],r=t[`x-ably-turn-client-id`]??``,i=t[`x-ably-turn-reason`]??`complete`;if(n){this._router.closeStream(n),this._turnObservers.delete(n),this._turnClientIds.delete(n);let e=this._turnMsgIds.get(n);if(e){for(let t of e)this._ownMsgIds.delete(t);this._turnMsgIds.delete(n)}this._ownTurnIds.delete(n),this._emitter.emit(`turn`,{type:T,turnId:n,clientId:r,reason:i})}return}let t=this._decoder.decode(e),n=D(e),r=e.serial,i=n[p];i&&this._updateTurnObserverHeaders(i,n,r);for(let i of t)i.kind===`message`?this._handleMessageOutput(i.message,n,r,e.action):this._handleEventOutput(i,n)}catch(e){let n=e instanceof t.ErrorInfo?e:void 0;this._emitter.emit(`error`,new t.ErrorInfo(`unable to process channel message; ${e instanceof Error?e.message:String(e)}`,W.TransportSubscriptionError,500,n))}}}_handleMessageOutput(e,t,n,r){let i=t[m];if(i&&this._ownMsgIds.has(i)){this._upsertAndNotify(e,t,n);return}r===`message.create`&&this._upsertAndNotify(e,t,n)}_handleEventOutput(e,t){if(e.kind!==`event`)return;let n=e.event,r=t[p];if(r){if(this._router.route(r,n)){this._accumulateAndEmit(r,e),this._codec.isTerminal(n)&&this._turnObservers.delete(r);return}this._ownTurnIds.has(r)&&!this._turnObservers.has(r)||(this._accumulateAndEmit(r,e),this._codec.isTerminal(n)&&this._turnObservers.delete(r))}}_upsertAndNotify(e,t,n){let r=this._codec.getMessageKey(e),i=t[`x-ably-msg-id`]??r;this._tree.upsert(i,e,t,n),this._emitter.emit(`message`)}_updateTurnObserverHeaders(e,t,n){let r=this._turnObservers.get(e);r?(Object.keys(t).length>0&&Object.assign(r.headers,t),n!==void 0&&(r.serial=n)):this._turnObservers.set(e,{headers:{...t},serial:n,accumulator:this._codec.createAccumulator()})}_accumulateAndEmit(e,t){let n=this._turnObservers.get(e);if(!n)return;n.accumulator.processOutputs([t]);let r=n.accumulator.messages;if(r.length===0)return;let i;try{i=structuredClone(r.at(-1))}catch{i=r.at(-1)}i&&(this._tree.upsert(n.headers[`x-ably-msg-id`]??this._codec.getMessageKey(i),i,{...n.headers},n.serial),this._emitter.emit(`message`))}async _publishCancel(e){this._logger.trace(`ClientTransport._publishCancel();`,{filter:e});let t={};e.turnId?t[_]=e.turnId:e.own?t[v]=`true`:e.clientId?t[b]=e.clientId:e.all&&(t[y]=`true`),await this._channel.publish({name:C,extras:{headers:t}})}_closeMatchingTurnStreams(e){if(e.all)for(let e of this._ownTurnIds)this._router.closeStream(e);else if(e.own)for(let e of this._ownTurnIds)this._router.closeStream(e);else if(e.clientId)for(let[t,n]of this._turnClientIds)n===e.clientId&&this._router.closeStream(t);else e.turnId&&this._router.closeStream(e.turnId)}_getMatchingTurnIds(e){let t=new Set;if(e.all)for(let e of this._turnClientIds.keys())t.add(e);else if(e.own)for(let[e,n]of this._turnClientIds)n===this._clientId&&t.add(e);else if(e.clientId)for(let[n,r]of this._turnClientIds)r===e.clientId&&t.add(n);else e.turnId&&this._turnClientIds.has(e.turnId)&&t.add(e.turnId);return t}_getMessagesWithHeaders(){return this._tree.flatten().map(e=>({message:e,headers:this.getMessageHeaders(e)}))}_getHistoryBefore(e){let t=this._getMessagesWithHeaders(),n=t.findIndex(t=>t.headers?.[m]===e);return n===-1?t:t.slice(0,n)}_processHistoryPage(e){for(let[t,n]of e.items.entries()){let r=e.itemHeaders?.[t]??{},i=e.itemSerials?.[t],a=this._codec.getMessageKey(n),o=r[`x-ably-msg-id`]??a;this._tree.upsert(o,n,r,i)}this._emitter.emit(`message`),e.rawMessages&&e.rawMessages.length>0&&(this._ablyMessages.unshift(...e.rawMessages),this._emitter.emit(`ably-message`))}async _loadUntilVisible(e,t,n){this._processHistoryPage(e);let r=e,i=()=>{let e=0;for(let t of this._tree.flatten())n.has(this._codec.getMessageKey(t))||e++;return e};for(;i()<t&&r.hasNext();){let e=await r.next();if(!e)break;this._processHistoryPage(e),r=e}return{newVisible:this._tree.flatten().filter(e=>!n.has(this._codec.getMessageKey(e))),lastPage:r}}_releaseWithheld(e){for(let t of e)this._withheldKeys.delete(this._codec.getMessageKey(t));e.length>0&&this._emitter.emit(`message`)}async send(e,n){if(this._closed||(await this._attachPromise,this._closed))throw new t.ErrorInfo(`unable to send; transport is closed`,W.TransportClosed,400);this._logger.trace(`ClientTransport.send();`);let r=Array.isArray(e)?e:[e],i=crypto.randomUUID();this._ownTurnIds.add(i);let a=new Set,o=[],s=this._getMessagesWithHeaders(),c;if(n?.parent===void 0&&!n?.forkOf){let e=this._tree.flatten();if(e.length>0){let t=e.at(-1);if(t){let e=this._codec.getMessageKey(t);c=this._tree.getNodeByKey(e)?.msgId??e}}}let l=n?.parent===void 0?c:n.parent;for(let e of r){let t=crypto.randomUUID();this._ownMsgIds.add(t),a.add(t);let r=n?.parent===void 0?c:n.parent??void 0,s=Q({role:`user`,turnId:i,msgId:t,turnClientId:this._clientId,parent:r,forkOf:n?.forkOf});this._upsertAndNotify(e,s);let l={[m]:t,[g]:`user`};r&&(l[x]=r),o.push({message:e,headers:l}),n?.parent===void 0&&!n?.forkOf&&(c=t)}this._turnMsgIds.set(i,a);let u=this._router.createStream(i),d=this._headersFn?.()??{},f={...this._bodyFn?.()??{},history:s,...n?.body,turnId:i,clientId:this._clientId,messages:o,...n?.forkOf!==void 0&&{forkOf:n.forkOf},...l!==void 0&&{parent:l}},p={...d,...n?.headers};return this._fetchFn(this._api,{method:`POST`,headers:{"Content-Type":`application/json`,...p},body:JSON.stringify(f),...this._credentials?{credentials:this._credentials}:{}}).then(e=>{e.ok||(this._emitter.emit(`error`,new t.ErrorInfo(`unable to send; HTTP POST to ${this._api} returned ${String(e.status)} ${e.statusText}`,W.TransportSendFailed,e.status)),this._router.closeStream(i))}).catch(e=>{let n=e instanceof t.ErrorInfo?e:void 0;this._emitter.emit(`error`,new t.ErrorInfo(`unable to send; HTTP POST to ${this._api} failed: ${e instanceof Error?e.message:String(e)}`,W.TransportSendFailed,500,n)),this._router.closeStream(i)}),{stream:u,turnId:i,cancel:async()=>this.cancel({turnId:i})}}async regenerate(e,t){this._logger.trace(`ClientTransport.regenerate();`,{messageId:e});let n=this._tree.getNode(e)?.parentId;return this.send([],{...t,body:{history:this._getHistoryBefore(e),...t?.body},forkOf:e,parent:n})}async edit(e,t,n){this._logger.trace(`ClientTransport.edit();`,{messageId:e});let r=this._tree.getNode(e)?.parentId;return this.send(t,{...n,body:{history:this._getHistoryBefore(e),...n?.body},forkOf:e,parent:r})}async cancel(e){if(this._closed)return;let t=e??{own:!0};this._logger.debug(`ClientTransport.cancel();`,{filter:t}),await this._publishCancel(t),this._closeMatchingTurnStreams(t)}async waitForTurn(e){if(this._closed)return;let t=e??{own:!0},n=this._getMatchingTurnIds(t);if(n.size!==0)return this._logger.debug(`ClientTransport.waitForTurn();`,{turnIds:[...n]}),new Promise(e=>{let t=r=>{r.type===`x-ably-turn-end`&&(n.delete(r.turnId),n.size===0&&(this._emitter.off(`turn`,t),e()))};this._emitter.on(`turn`,t)})}on(e,t){if(this._closed)return Ze;let n=t;return this._emitter.on(e,n),()=>{this._emitter.off(e,n)}}getTree(){return this._tree}getActiveTurnIds(){let e=new Map;for(let[t,n]of this._turnClientIds){let r=e.get(n);r||(r=new Set,e.set(n,r)),r.add(t)}return e}getMessageHeaders(e){let t=this._codec.getMessageKey(e);return this._tree.getNodeByKey(t)?.headers}getMessages(){return this._withheldKeys.size===0?this._tree.flatten():this._tree.flatten().filter(e=>!this._withheldKeys.has(this._codec.getMessageKey(e)))}getMessagesWithHeaders(){return this._getMessagesWithHeaders()}getAblyMessages(){return[...this._ablyMessages]}async history(e){if(this._closed)throw new t.ErrorInfo(`unable to load history; transport is closed`,W.TransportClosed,400);this._logger.trace(`ClientTransport.history();`,{limit:e?.limit});let n=e?.limit??100,r=new Set(this._tree.flatten().map(e=>this._codec.getMessageKey(e))),i=await Je(this._channel,this._codec,e,this._logger),a=await this._loadUntilVisible(i,n,r);i=a.lastPage;let o=a.newVisible;for(let e of o)this._withheldKeys.add(this._codec.getMessageKey(e));let s=o.slice(-n),c=o.slice(0,-n);this._releaseWithheld(s);let l=e=>({items:e,hasNext:()=>c.length>0||i.hasNext(),next:async()=>{if(c.length>0){let e=c.splice(-n,n);return this._releaseWithheld(e),l(e)}if(!i.hasNext())return;let e=await i.next();if(!e)return;let t=new Set(r);for(let e of this._tree.flatten())t.add(this._codec.getMessageKey(e));let a=await this._loadUntilVisible(e,n,t);i=a.lastPage;let o=a.newVisible;for(let e of o)this._withheldKeys.add(this._codec.getMessageKey(e));let s=o.splice(-n,n);if(c.push(...o),this._releaseWithheld(s),s.length!==0)return l(s)}});return l(s)}async close(e){if(!this._closed){if(this._closed=!0,this._logger.info(`ClientTransport.close();`),e?.cancel){try{await this._publishCancel(e.cancel)}catch{}this._closeMatchingTurnStreams(e.cancel)}this._channel.unsubscribe(this._onMessage);for(let e of this._ownTurnIds)this._router.closeStream(e);this._turnObservers.clear(),this._emitter.off(),this._ownTurnIds.clear(),this._ownMsgIds.clear(),this._turnMsgIds.clear(),this._turnClientIds.clear(),this._withheldKeys.clear(),this._ablyMessages.length=0}}},Qe=e=>new $(e),$e=async(e,t,n,r,i)=>{i?.trace(`pipeStream();`);let a=e.getReader(),o,s=n?new Promise(e=>{if(n.aborted){e();return}o=()=>{e()},n.addEventListener(`abort`,o,{once:!0})}):new Promise(()=>{}),c=`complete`;try{for(;;){let e=await Promise.race([a.read(),s.then(()=>`aborted`)]);if(e===`aborted`){c=`cancelled`,i?.debug(`pipeStream(); stream cancelled by abort signal`),r&&await r(async e=>t.appendEvent(e)),await t.abort(`cancelled`);break}let{done:n,value:o}=e;if(n){await t.close(),i?.debug(`pipeStream(); stream completed`);break}await t.appendEvent(o)}}catch(e){c=`error`;let n=e instanceof Error?e.message:String(e);i?.error(`pipeStream(); stream error`,{error:n});try{await t.close()}catch{}}finally{o&&n?.removeEventListener(`abort`,o),a.releaseLock()}return{reason:c}},et=class{constructor(e,t){this._activeTurns=new Map,this._channel=e,this._logger=t?.withContext({component:`TurnManager`})}async startTurn(e,t,n){this._logger?.trace(`DefaultTurnManager.startTurn();`,{turnId:e,clientId:t});let r=n??new AbortController,i=t??``;return this._activeTurns.set(e,{controller:r,clientId:i}),await this._channel.publish({name:w,extras:{headers:{[p]:e,[h]:i}}}),this._logger?.debug(`DefaultTurnManager.startTurn(); turn started`,{turnId:e}),r.signal}async endTurn(e,t){this._logger?.trace(`DefaultTurnManager.endTurn();`,{turnId:e,reason:t});let n=this._activeTurns.get(e)?.clientId??``;await this._channel.publish({name:T,extras:{headers:{[p]:e,[h]:n,[S]:t}}}),this._activeTurns.delete(e),this._logger?.debug(`DefaultTurnManager.endTurn(); turn ended`,{turnId:e,reason:t})}getSignal(e){return this._activeTurns.get(e)?.controller.signal}getClientId(e){return this._activeTurns.get(e)?.clientId}abort(e){this._logger?.debug(`DefaultTurnManager.abort();`,{turnId:e}),this._activeTurns.get(e)?.controller.abort()}getActiveTurnIds(){return[...this._activeTurns.keys()]}close(){this._logger?.trace(`DefaultTurnManager.close();`,{activeTurns:this._activeTurns.size});for(let e of this._activeTurns.values())e.controller.abort();this._activeTurns.clear()}},tt=(e,t)=>new et(e,t),nt=class{constructor(e){this._registeredTurns=new Map,this._channel=e.channel,this._codec=e.codec,this._logger=e.logger?.withContext({component:`ServerTransport`}),this._onError=e.onError,this._turnManager=tt(this._channel,this._logger),this._channelListener=e=>{this._handleChannelMessage(e)},this._attachPromise=this._channel.subscribe(C,this._channelListener).then(()=>{},e=>{let n=new t.ErrorInfo(`unable to subscribe to cancel messages; ${e instanceof Error?e.message:String(e)}`,W.TransportSubscriptionError,500,e instanceof t.ErrorInfo?e:void 0);this._logger?.error(`DefaultServerTransport(); subscribe failed`),this._onError?.(n)}),this._logger?.debug(`DefaultServerTransport(); transport created`)}newTurn(e){return this._logger?.trace(`DefaultServerTransport.newTurn();`,{turnId:e.turnId}),this._createTurn(e)}close(){this._logger?.trace(`DefaultServerTransport.close();`),this._channel.unsubscribe(C,this._channelListener);for(let e of this._registeredTurns.values())e.controller.abort();this._registeredTurns.clear(),this._turnManager.close(),this._logger?.debug(`DefaultServerTransport.close(); transport closed`)}_resolveFilter(e,t){let n=[...this._registeredTurns.keys()];return e.all?n:e.own&&t?n.filter(e=>this._registeredTurns.get(e)?.clientId===t):e.clientId?n.filter(t=>this._registeredTurns.get(t)?.clientId===e.clientId):e.turnId&&this._registeredTurns.has(e.turnId)?[e.turnId]:[]}async _handleCancelMessage(e){let n=D(e),r={};n[`x-ably-cancel-turn-id`]?r.turnId=n[_]:n[`x-ably-cancel-own`]===`true`?r.own=!0:n[`x-ably-cancel-client-id`]?r.clientId=n[b]:n[`x-ably-cancel-all`]===`true`&&(r.all=!0);let i=this._resolveFilter(r,e.clientId);if(i.length===0)return;this._logger?.debug(`DefaultServerTransport._handleCancelMessage(); matched turns`,{matchedTurnIds:i,filter:r});let a=new Map;for(let e of i){let t=this._registeredTurns.get(e);a.set(e,t?.clientId??``)}let o={message:e,filter:r,matchedTurnIds:i,turnOwners:a};for(let e of i){let n=this._registeredTurns.get(e);if(n)try{if(n.onCancel&&!await n.onCancel(o)){this._logger?.debug(`DefaultServerTransport._handleCancelMessage(); cancel rejected by onCancel`,{turnId:e});continue}n.controller.abort(),this._logger?.debug(`DefaultServerTransport._handleCancelMessage(); turn aborted`,{turnId:e})}catch(r){let i=new t.ErrorInfo(`unable to process cancel for turn ${e}; onCancel handler threw: ${r instanceof Error?r.message:String(r)}`,W.CancelListenerError,500,r instanceof t.ErrorInfo?r:void 0);this._logger?.error(`DefaultServerTransport._handleCancelMessage(); onCancel threw`,{turnId:e}),(n.onError??this._onError)?.(i)}}}_handleChannelMessage(e){try{e.name===`x-ably-cancel`&&this._handleCancelMessage(e).catch(e=>{let n=new t.ErrorInfo(`unable to route cancel message; ${e instanceof Error?e.message:String(e)}`,W.CancelListenerError,500,e instanceof t.ErrorInfo?e:void 0);this._logger?.error(`DefaultServerTransport._handleChannelMessage(); cancel routing error`),this._onError?.(n)})}catch(e){let n=new t.ErrorInfo(`unable to process channel message; ${e instanceof Error?e.message:String(e)}`,W.TransportSubscriptionError,500,e instanceof t.ErrorInfo?e:void 0);this._logger?.error(`DefaultServerTransport._handleChannelMessage(); subscription error`),this._onError?.(n)}}_createTurn(e){let{turnId:n,clientId:r,onMessage:i,onAbort:a,onCancel:o,onError:s,parent:c,forkOf:l}=e,u=new AbortController,d=!1,f=!1,p={turnId:n,clientId:r??``,controller:u,onCancel:o,onError:s};this._registeredTurns.set(n,p);let m=this._logger,h=this._turnManager,g=this._attachPromise,_=this._codec,v=this._channel,y=this._registeredTurns;return{get turnId(){return n},get abortSignal(){return u.signal},start:async()=>{if(m?.trace(`Turn.start();`,{turnId:n}),u.signal.aborted)throw new t.ErrorInfo(`unable to start turn; turn ${n} was cancelled before start()`,W.InvalidArgument,400);if(!d){d=!0;try{await h.startTurn(n,r,u)}catch(e){let r=new t.ErrorInfo(`unable to publish turn-start for turn ${n}; ${e instanceof Error?e.message:String(e)}`,W.TurnLifecycleError,500,e instanceof t.ErrorInfo?e:void 0);throw m?.error(`Turn.start(); failed to publish turn-start`,{turnId:n}),s?.(r),r}m?.debug(`Turn.start(); turn started`,{turnId:n})}},addMessages:async(e,r)=>{if(m?.trace(`Turn.addMessages();`,{turnId:n,count:e.length}),!d)throw new t.ErrorInfo(`unable to add messages; start() must be called before addMessages() (turn ${n})`,W.InvalidArgument,400);await g;let a=[];for(let t of e){let e=crypto.randomUUID(),o=O(Q({role:`user`,turnId:n,msgId:e,turnClientId:r?.clientId,parent:r?.parent===void 0?c??void 0:r.parent??void 0,forkOf:r?.forkOf??l}),t.headers);await _.createEncoder(v,{extras:{headers:o},onMessage:i}).writeMessages([t.message],r?.clientId?{clientId:r.clientId}:void 0),a.push(o[`x-ably-msg-id`]??e)}return m?.debug(`Turn.addMessages(); messages published`,{turnId:n,count:e.length}),{msgIds:a}},streamResponse:async(e,r)=>{if(m?.trace(`Turn.streamResponse();`,{turnId:n}),!d)throw new t.ErrorInfo(`unable to stream response; start() must be called before streamResponse() (turn ${n})`,W.InvalidArgument,400);await g;let o=h.getSignal(n),s=h.getClientId(n),u=r?.parent===void 0?c??void 0:r.parent??void 0,f=Q({role:`assistant`,turnId:n,msgId:crypto.randomUUID(),turnClientId:s,parent:u,forkOf:r?.forkOf??l}),p=await $e(e,_.createEncoder(v,{extras:{headers:f},onMessage:i}),o,a,m);return m?.debug(`Turn.streamResponse(); stream finished`,{turnId:n,reason:p.reason}),p},end:async e=>{if(m?.trace(`Turn.end();`,{turnId:n,reason:e}),!d)throw new t.ErrorInfo(`unable to end turn; start() must be called before end() (turn ${n})`,W.InvalidArgument,400);if(!f){f=!0;try{await h.endTurn(n,e)}catch(e){let r=new t.ErrorInfo(`unable to publish turn-end for turn ${n}; ${e instanceof Error?e.message:String(e)}`,W.TurnLifecycleError,500,e instanceof t.ErrorInfo?e:void 0);throw m?.error(`Turn.end(); failed to publish turn-end`,{turnId:n}),s?.(r),r}finally{y.delete(n)}m?.debug(`Turn.end(); turn ended`,{turnId:n,reason:e})}}}}},rt=e=>new nt(e);e.UIMessageCodec=G,e.createChatTransport=ze,e.createClientTransport=e=>Qe({...e,codec:G}),e.createServerTransport=e=>rt({...e,codec:G})});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`ably`),require(`ai`)):typeof define==`function`&&define.amd?define([`exports`,`ably`,`ai`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.AblyAiTransportVercel={},e.Ably,e.AI))})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;l<u;l++)d=s[l],!c.call(e,d)&&d!==n&&i(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:r(s(e)),l(t||!e||!e.__esModule?i(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var u=`x-ably-stream`,d=`x-ably-status`,f=`x-ably-stream-id`,p=`x-ably-discrete`,m=`x-ably-turn-id`,h=`x-ably-msg-id`,g=`x-ably-turn-client-id`,_=`x-ably-role`,v=`x-ably-amend`,y=`x-ably-cancel-turn-id`,b=`x-ably-cancel-own`,x=`x-ably-cancel-all`,S=`x-ably-cancel-client-id`,C=`x-ably-parent`,w=`x-ably-fork-of`,ee=`x-ably-turn-reason`,T=`x-ably-cancel`,E=`x-ably-turn-start`,te=`x-ably-turn-end`,D=`x-domain-`,O=e=>{let t=e.extras;if(!t||typeof t!=`object`)return{};let n=t.headers;return!n||typeof n!=`object`?{}:n},ne=e=>{if(e!==void 0)try{return JSON.parse(e)}catch{return}},k=(e,t)=>({...e,...t}),re=e=>{if(e!==void 0)return e===`true`},A=(e,t)=>e[D+t],j=e=>{let t={};for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==void 0&&(t[n]=e[n]);return t},ie=e=>({str:t=>A(e,t),strOr:(t,n)=>A(e,t)??n,bool:t=>re(A(e,t)),json:t=>ne(A(e,t))}),M=()=>{let e={},t={str:(n,r)=>(r!==void 0&&(e[D+n]=r),t),bool:(n,r)=>(r!==void 0&&(e[D+n]=String(r)),t),json:(n,r)=>(r!=null&&(e[D+n]=JSON.stringify(r)),t),build:()=>e};return t},N=e=>j({type:`dynamic-tool`,toolCallId:e.toolCallId,toolName:e.toolName,title:e.title,providerExecuted:e.providerExecuted}),ae=(e,t)=>{let n=N(e);switch(t.type){case`tool-output-available`:return j({...n,state:`output-available`,input:e.input,output:t.output,preliminary:t.preliminary});case`tool-output-error`:return{...n,state:`output-error`,input:e.input,errorText:t.errorText};case`tool-output-denied`:return{...n,state:`output-denied`,input:e.input,approval:{id:``,approved:!1}};case`tool-approval-request`:return{...n,state:`approval-requested`,input:e.input,approval:{id:t.approvalId}}}},P=class{constructor(e){this._activeIndex=new Map,this._partType=e}start(e,t,n){this._activeIndex.set(e,t.parts.length),t.parts.push({type:this._partType,text:``}),n.set(e,`streaming`)}delta(e,t,n){let r=this._activeIndex.get(e);if(r===void 0)return;let i=t.parts[r];i?.type===this._partType&&(i.text+=n)}end(e,t){t.set(e,`finished`),this._activeIndex.delete(e)}reset(){this._activeIndex=new Map}},oe=class{constructor(){this._messageList=[],this._activeMessages=new Map}get messages(){return this._messageList}get completedMessages(){let e=new Set;for(let t of this._activeMessages.values())e.add(t.message);return this._messageList.filter(t=>!e.has(t))}get hasActiveStream(){for(let e of this._activeMessages.values())for(let t of e.streamStatus.values())if(t===`streaming`)return!0;return!1}processOutputs(e){for(let t of e)t.kind===`message`?this._messageList.push(t.message):t.messageId!==void 0&&this._processEvent(t.event,t.messageId)}updateMessage(e){let t=this._messageList.findIndex(t=>t.id===e.id);t!==-1&&(this._messageList[t]=e)}initMessage(e,t){let n=this._activeMessages.get(e);if(n){let e=structuredClone(t),r=this._messageList.indexOf(n.message);n.message=e,r!==-1&&(this._messageList[r]=e),n.toolTrackers={};for(let t=0;t<e.parts.length;t++){let r=e.parts[t];r?.type===`dynamic-tool`&&(n.toolTrackers[r.toolCallId]={partIndex:t,inputText:``},n.streamStatus.set(r.toolCallId,`finished`))}return}let r=structuredClone(t),i={},a=new Map;for(let e=0;e<r.parts.length;e++){let t=r.parts[e];t?.type===`dynamic-tool`&&(i[t.toolCallId]={partIndex:e,inputText:``},a.set(t.toolCallId,`finished`))}let o={message:r,textStreams:new P(`text`),reasoningStreams:new P(`reasoning`),toolTrackers:i,streamStatus:a};this._activeMessages.set(e,o);let s=this._messageList.findIndex(e=>e.id===t.id);s===-1?this._messageList.push(o.message):this._messageList[s]=o.message}completeMessage(e){this._activeMessages.delete(e)}_ensureActiveMessage(e){let t=this._activeMessages.get(e);if(t)return t;let n={message:{id:e,role:`assistant`,parts:[]},textStreams:new P(`text`),reasoningStreams:new P(`reasoning`),toolTrackers:{},streamStatus:new Map};return this._activeMessages.set(e,n),this._messageList.push(n.message),n}_getToolPart(e,t){let n=t.toolTrackers[e];if(!n)return;let r=t.message.parts[n.partIndex];if(r?.type===`dynamic-tool`)return{tracker:n,part:r}}_processEvent(e,t){switch(e.type){case`start`:case`start-step`:case`finish-step`:case`finish`:case`abort`:case`error`:case`message-metadata`:this._processLifecycle(e,t);break;case`text-start`:case`text-delta`:case`text-end`:case`reasoning-start`:case`reasoning-delta`:case`reasoning-end`:this._processTextOrReasoning(e,t);break;case`tool-input-start`:case`tool-input-delta`:case`tool-input-available`:case`tool-input-error`:this._processToolInput(e,t);break;case`tool-output-available`:case`tool-output-error`:case`tool-output-denied`:case`tool-approval-request`:this._processToolOutput(e,t);break;case`file`:case`source-url`:case`source-document`:this._processContentPart(e,t);break;default:if(e.type.startsWith(`data-`)){if(e.transient)break;let n=this._ensureActiveMessage(t),r=j({type:e.type,id:e.id,data:e.data});if(e.id!==void 0){let t=n.message.parts.findIndex(t=>t.type===e.type&&`id`in t&&t.id===e.id);if(t!==-1){n.message.parts[t]=r;break}}n.message.parts.push(r)}break}}_processLifecycle(e,t){switch(e.type){case`start`:{let n=this._ensureActiveMessage(t);e.messageId&&(n.message.id=e.messageId),e.messageMetadata!==void 0&&(n.message.metadata=e.messageMetadata);break}case`start-step`:this._ensureActiveMessage(t).message.parts.push({type:`step-start`});break;case`finish-step`:{let e=this._activeMessages.get(t);e&&(e.textStreams.reset(),e.reasoningStreams.reset());break}case`finish`:{let n=this._activeMessages.get(t);n&&e.messageMetadata!==void 0&&(n.message.metadata=e.messageMetadata),this._activeMessages.delete(t);break}case`abort`:{let e=this._activeMessages.get(t);if(e)for(let[t,n]of e.streamStatus)n===`streaming`&&e.streamStatus.set(t,`aborted`);this._activeMessages.delete(t);break}case`error`:break;case`message-metadata`:{let n=this._activeMessages.get(t);n&&e.messageMetadata!==void 0&&(n.message.metadata=e.messageMetadata);break}}}_processTextOrReasoning(e,t){let n=this._ensureActiveMessage(t);switch(e.type){case`text-start`:n.textStreams.start(e.id,n.message,n.streamStatus);break;case`text-delta`:n.textStreams.delta(e.id,n.message,e.delta);break;case`text-end`:n.textStreams.end(e.id,n.streamStatus);break;case`reasoning-start`:n.reasoningStreams.start(e.id,n.message,n.streamStatus);break;case`reasoning-delta`:n.reasoningStreams.delta(e.id,n.message,e.delta);break;case`reasoning-end`:n.reasoningStreams.end(e.id,n.streamStatus);break}}_processToolInput(e,t){switch(e.type){case`tool-input-start`:{let n=this._ensureActiveMessage(t),r=n.message.parts.length;n.message.parts.push({...N(e),state:`input-streaming`,input:void 0}),n.toolTrackers[e.toolCallId]={partIndex:r,inputText:``},n.streamStatus.set(e.toolCallId,`streaming`);break}case`tool-input-delta`:{let n=this._ensureActiveMessage(t),r=n.toolTrackers[e.toolCallId];if(!r)break;r.inputText+=e.inputTextDelta;let i;try{i=JSON.parse(r.inputText)}catch{i=void 0}let a=this._getToolPart(e.toolCallId,n);if(!a)break;n.message.parts[a.tracker.partIndex]={...N(a.part),state:`input-streaming`,input:i};break}case`tool-input-available`:{let n=this._ensureActiveMessage(t),r=this._getToolPart(e.toolCallId,n);if(!r)break;n.message.parts[r.tracker.partIndex]={...N(r.part),state:`input-available`,input:e.input},n.streamStatus.set(e.toolCallId,`finished`);break}case`tool-input-error`:{let n=this._ensureActiveMessage(t),r=this._getToolPart(e.toolCallId,n);if(r)n.message.parts[r.tracker.partIndex]={...N(r.part),state:`output-error`,input:e.input,errorText:e.errorText};else{let t=n.message.parts.length;n.message.parts.push({...N(e),state:`output-error`,input:e.input,errorText:e.errorText}),n.toolTrackers[e.toolCallId]={partIndex:t,inputText:``}}n.streamStatus.set(e.toolCallId,`finished`);break}}}_processToolOutput(e,t){let n=this._ensureActiveMessage(t),r=this._getToolPart(e.toolCallId,n);r&&(n.message.parts[r.tracker.partIndex]=ae(r.part,e))}_processContentPart(e,t){let n=this._ensureActiveMessage(t);switch(e.type){case`file`:n.message.parts.push({type:`file`,mediaType:e.mediaType,url:e.url});break;case`source-url`:n.message.parts.push(j({type:`source-url`,sourceId:e.sourceId,url:e.url,title:e.title}));break;case`source-document`:n.message.parts.push(j({type:`source-document`,sourceId:e.sourceId,mediaType:e.mediaType,title:e.title,filename:e.filename}));break}}},F=()=>new oe,se=e=>[{kind:`event`,event:e}],ce=class{constructor(e,t={}){this._serialState=new Map,this._hooks=e,this._onStreamUpdate=t.onStreamUpdate,this._onStreamDelete=t.onStreamDelete,this._logger=t.logger?.withContext({component:`DecoderCore`})}decode(e){let t=e.action;this._logger?.trace(`DefaultDecoderCore.decode();`,{action:t,serial:e.serial,name:e.name});let n;switch(t){case`message.create`:{let t=this._toPayload(e);n=t.headers?.[`x-ably-stream`]===`true`?this._decodeStreamedCreate(t,e.serial):this._hooks.decodeDiscrete(t);break}case`message.append`:n=this._decodeAppend(e);break;case`message.update`:n=this._decodeUpdate(e);break;case`message.delete`:n=this._decodeDelete(e);break;default:return[]}let r=O(e)[h];if(r)for(let e of n)e.kind===`event`&&(e.messageId=r);return n}_toPayload(e){return{name:e.name??``,data:e.data,headers:O(e)}}_stringData(e){return typeof e.data==`string`?e.data:``}_invokeOnStreamUpdate(e){if(this._onStreamUpdate)try{this._onStreamUpdate(e)}catch(e){this._logger?.error(`DefaultDecoderCore._invokeOnStreamUpdate(); callback threw`,{error:e})}}_invokeOnStreamDelete(e,t){if(this._onStreamDelete)try{this._onStreamDelete(e,t)}catch(e){this._logger?.error(`DefaultDecoderCore._invokeOnStreamDelete(); callback threw`,{error:e})}}_decodeStreamedCreate(e,t){if(!t)return[];let n=e.headers?.[`x-ably-stream-id`]??``,r=e.headers??{},i={name:e.name,streamId:n,accumulated:``,headers:{...r},closed:!1};return this._serialState.set(t,i),this._logger?.debug(`DefaultDecoderCore._decodeStreamedCreate(); new stream`,{name:e.name,streamId:n,serial:t}),this._hooks.buildStartEvents(i)}_decodeAppend(e){let t=e.serial;if(!t)return[];let n=this._serialState.get(t);if(!n)return this._decodeUpdate(e);let r=O(e),i=typeof e.data==`string`?e.data:``,a=r[d],o=[];return i.length>0&&(n.accumulated+=i,o.push(...this._hooks.buildDeltaEvents(n,i))),a===`finished`&&!n.closed?(n.closed=!0,o.push(...this._hooks.buildEndEvents(n,r)),this._logger?.debug(`DefaultDecoderCore._decodeAppend(); stream finished`,{streamId:n.streamId})):a===`aborted`&&!n.closed&&(n.closed=!0,this._logger?.debug(`DefaultDecoderCore._decodeAppend(); stream aborted`,{streamId:n.streamId})),o}_decodeUpdate(e){let t=e.serial;if(!t)return[];let n=this._toPayload(e),r=n.headers??{},i=r[u]===`true`,a=r[d],o=this._serialState.get(t);if(!o)return this._decodeFirstContact(n,i,a,t);let s=this._stringData(e);if(s.startsWith(o.accumulated)){let e=s.slice(o.accumulated.length),t=[];return e.length>0&&(o.accumulated=s,t.push(...this._hooks.buildDeltaEvents(o,e))),a===`finished`&&!o.closed?(o.closed=!0,t.push(...this._hooks.buildEndEvents(o,r))):a===`aborted`&&!o.closed&&(o.closed=!0),t}return o.accumulated=s,o.headers={...r},this._invokeOnStreamUpdate(o),[]}_decodeFirstContact(e,t,n,r){if(!t)return this._hooks.decodeDiscrete(e);let i=e.headers?.[`x-ably-stream-id`]??``,a=e.headers??{},o=typeof e.data==`string`?e.data:``;this._logger?.debug(`DefaultDecoderCore._decodeFirstContact(); first-contact stream`,{name:e.name,streamId:i,serial:r});let s={name:e.name,streamId:i,accumulated:o,headers:{...a},closed:n===`finished`||n===`aborted`};this._serialState.set(r,s);let c=this._hooks.buildStartEvents(s);return o.length>0&&c.push(...this._hooks.buildDeltaEvents(s,o)),n===`finished`&&c.push(...this._hooks.buildEndEvents(s,a)),c}_decodeDelete(e){let t=e.serial;if(!t)return[];let n=this._serialState.get(t);return this._invokeOnStreamDelete(t,n),n&&(n.accumulated=``,n.closed=!0),this._logger?.debug(`DefaultDecoderCore._decodeDelete();`,{serial:t}),[]}},le=(e,t={})=>new ce(e,t),ue=class{constructor(e){this._emitted=new Map,this._phases=e}ensurePhases(e,t){let n=this._getOrCreate(e),r=[];for(let e of this._phases)n.has(e.key)||(n.add(e.key),r.push(...e.build(t)));return r}markEmitted(e,t){this._getOrCreate(e).add(t)}resetPhase(e,t){this._emitted.get(e)?.delete(t)}clearScope(e){this._emitted.delete(e)}_getOrCreate(e){let t=this._emitted.get(e);return t||(t=new Set,this._emitted.set(e,t)),t}},de=e=>new ue(e),I=e=>{let t=ie(e);return{...t,providerMetadata:()=>t.json(`providerMetadata`)}},L=e=>se(e),fe=(e,t)=>e===`stop`||e===`length`||e===`content-filter`||e===`tool-calls`||e===`error`||e===`other`?e:t,R=e=>e.startsWith(`data-`),pe=e=>{if(e)try{return JSON.parse(e)}catch{return e}},me=e=>{let t=I(e.headers);switch(e.name){case`text`:return j({type:`text-start`,id:e.streamId,providerMetadata:t.providerMetadata()});case`reasoning`:return j({type:`reasoning-start`,id:e.streamId,providerMetadata:t.providerMetadata()});case`tool-input`:return j({type:`tool-input-start`,toolCallId:e.streamId,toolName:t.strOr(`toolName`,``),dynamic:t.bool(`dynamic`),title:t.str(`title`),providerExecuted:t.bool(`providerExecuted`),providerMetadata:t.providerMetadata()});default:return{type:`text-start`,id:e.streamId}}},he=(e,t)=>{switch(e.name){case`text`:return{type:`text-delta`,id:e.streamId,delta:t};case`reasoning`:return{type:`reasoning-delta`,id:e.streamId,delta:t};case`tool-input`:return{type:`tool-input-delta`,toolCallId:e.streamId,inputTextDelta:t};default:return{type:`text-delta`,id:e.streamId,delta:t}}},ge=(e,t)=>{let n=I(t);switch(e.name){case`text`:return j({type:`text-end`,id:e.streamId,providerMetadata:n.providerMetadata()});case`reasoning`:return j({type:`reasoning-end`,id:e.streamId,providerMetadata:n.providerMetadata()});case`tool-input`:return j({type:`tool-input-available`,toolCallId:e.streamId,toolName:n.strOr(`toolName`,I(e.headers).strOr(`toolName`,``)),input:pe(e.accumulated),providerMetadata:n.providerMetadata()});default:return{type:`text-end`,id:e.streamId}}},_e=()=>de([{key:`start`,build:e=>[j({type:`start`,messageId:e.messageId})]},{key:`start-step`,build:()=>[{type:`start-step`}]}]),z=(e,t,n)=>e.ensurePhases(t,n).map(e=>({kind:`event`,event:e})),ve=(e,t,n)=>(n.markEmitted(t,`start`),L(j({type:`start`,messageId:e.str(`messageId`),messageMetadata:e.json(`messageMetadata`)}))),ye=(e,t)=>(t.markEmitted(e,`start-step`),L({type:`start-step`})),be=(e,t)=>(t.resetPhase(e,`start-step`),L({type:`finish-step`})),xe=(e,t,n)=>(n.clearScope(t),L(j({type:`finish`,finishReason:fe(e.str(`finishReason`),`stop`),messageMetadata:e.json(`messageMetadata`)}))),Se=(e,t,n)=>(n.clearScope(t),L({type:`error`,errorText:typeof e==`string`?e:``})),Ce=(e,t,n)=>(n.clearScope(t),L(j({type:`abort`,reason:typeof e==`string`&&e?e:void 0}))),we=e=>L({type:`message-metadata`,messageMetadata:e.json(`messageMetadata`)}),Te=(e,t)=>L(j({type:`file`,url:typeof t==`string`?t:``,mediaType:e.strOr(`mediaType`,``),providerMetadata:e.providerMetadata()})),Ee=(e,t)=>L(j({type:`source-url`,sourceId:e.strOr(`sourceId`,``),url:typeof t==`string`?t:``,title:e.str(`title`),providerMetadata:e.providerMetadata()})),De=e=>L(j({type:`source-document`,sourceId:e.strOr(`sourceId`,``),mediaType:e.strOr(`mediaType`,``),title:e.strOr(`title`,``),filename:e.str(`filename`),providerMetadata:e.providerMetadata()})),Oe=(e,t)=>{let n=t;return L(j({type:`tool-input-error`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),errorText:n?.errorText??``,input:n?.input,dynamic:e.bool(`dynamic`),title:e.str(`title`),providerExecuted:e.bool(`providerExecuted`),providerMetadata:e.providerMetadata()}))},ke=(e,t)=>{let n=t;return L(j({type:`tool-output-available`,toolCallId:e.strOr(`toolCallId`,``),output:n?.output,dynamic:e.bool(`dynamic`),providerExecuted:e.bool(`providerExecuted`),preliminary:e.bool(`preliminary`)}))},Ae=(e,t)=>{let n=t;return L(j({type:`tool-output-error`,toolCallId:e.strOr(`toolCallId`,``),errorText:n?.errorText??``,dynamic:e.bool(`dynamic`),providerExecuted:e.bool(`providerExecuted`)}))},je=e=>L({type:`tool-approval-request`,toolCallId:e.strOr(`toolCallId`,``),approvalId:e.strOr(`approvalId`,``)}),Me=e=>L({type:`tool-output-denied`,toolCallId:e.strOr(`toolCallId`,``)}),Ne=(e,t,n)=>L(j({type:e,data:n,id:t.str(`id`),transient:t.bool(`transient`)})),Pe=(e,t,n,r)=>{let i=z(r,n,{messageId:e.str(`messageId`)});return i.push({kind:`event`,event:j({type:`tool-input-start`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),dynamic:e.bool(`dynamic`),title:e.str(`title`),providerExecuted:e.bool(`providerExecuted`),providerMetadata:e.providerMetadata()})},{kind:`event`,event:j({type:`tool-input-available`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),input:t,providerMetadata:e.providerMetadata()})}),i},Fe=e=>{let t=e.headers??{},n=I(t),r=t[`x-ably-role`]??`user`,i=n.str(`messageId`)??``,a;switch(e.name){case`text`:a={type:`text`,text:typeof e.data==`string`?e.data:``};break;case`file`:a={type:`file`,mediaType:n.strOr(`mediaType`,``),url:typeof e.data==`string`?e.data:``};break;default:R(e.name)&&(a=j({type:e.name,id:n.str(`id`),data:e.data}));break}return a?[{kind:`message`,message:{id:i,role:r,parts:[a]}}]:[]},Ie=(e,t)=>(e===`text`||e===`file`||R(e))&&`x-ably-discrete`in t,Le=(e,t)=>{let n=e.headers??{},r=I(n),i=n[`x-ably-turn-id`]??``;if(Ie(e.name,n))return Fe(e);if(e.name===`tool-input`)return Pe(r,e.data,i,t);switch(e.name){case`start`:return ve(r,i,t);case`start-step`:return ye(i,t);case`finish-step`:return be(i,t);case`finish`:return xe(r,i,t);case`error`:return Se(e.data,i,t);case`abort`:return Ce(e.data,i,t);case`message-metadata`:return we(r);case`file`:return Te(r,e.data);case`source-url`:return Ee(r,e.data);case`source-document`:return De(r);case`tool-input-error`:return Oe(r,e.data);case`tool-output-available`:return ke(r,e.data);case`tool-output-error`:return Ae(r,e.data);case`tool-approval-request`:return je(r);case`tool-output-denied`:return Me(r);default:return R(e.name)?Ne(e.name,r,e.data):[]}},Re=e=>({buildStartEvents:t=>{let n=z(e,t.headers[`x-ably-turn-id`]??``,{messageId:I(t.headers).str(`messageId`)});return n.push({kind:`event`,event:me(t)}),n},buildDeltaEvents:(e,t)=>L(he(e,t)),buildEndEvents:(e,t)=>L(ge(e,t)),decodeDiscrete:t=>Le(t,e)}),ze=class{constructor(e={}){this._core=le(Re(_e()),e)}decode(e){return this._core.decode(e)}},Be=(e={})=>new ze(e),B=function(e){return e[e.BadRequest=4e4]=`BadRequest`,e[e.InvalidArgument=40003]=`InvalidArgument`,e[e.EncoderRecoveryFailed=104e3]=`EncoderRecoveryFailed`,e[e.TransportSubscriptionError=104001]=`TransportSubscriptionError`,e[e.CancelListenerError=104002]=`CancelListenerError`,e[e.TurnLifecycleError=104003]=`TurnLifecycleError`,e[e.TransportClosed=104004]=`TransportClosed`,e[e.TransportSendFailed=104005]=`TransportSendFailed`,e[e.ChannelContinuityLost=104006]=`ChannelContinuityLost`,e[e.ChannelNotReady=104007]=`ChannelNotReady`,e[e.StreamError=104008]=`StreamError`,e}({}),Ve=(e,t)=>e.code===t,He=class{constructor(e,t={}){this._trackers=new Map,this._pending=[],this._closed=!1,this._writer=e,this._defaultClientId=t.clientId,this._defaultExtras=t.extras,this._onMessageHook=t.onMessage??(()=>{}),this._logger=t.logger?.withContext({component:`EncoderCore`})}async publishDiscrete(e,t){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.publishDiscrete();`,{name:e.name});let n=this._buildDiscreteMessage(e,t);return this._writer.publish(n)}async publishDiscreteBatch(e,t){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.publishDiscreteBatch();`,{count:e.length});let n=e.map(e=>this._buildDiscreteMessage(e,t));for(let e of n)e.extras.headers[p]=`true`;return this._writer.publish(n)}async startStream(e,n,r){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.startStream();`,{name:n.name,streamId:e});let i=this._buildHeaders(n.headers??{},r);i[u]=`true`,i[d]=`streaming`,i[f]=e;let a=this._resolveClientId(r),o={name:n.name,data:n.data,extras:{headers:i},...a?{clientId:a}:{}};this._invokeOnMessage(o);let s=(await this._writer.publish(o)).serials[0];if(!s)throw new t.ErrorInfo(`unable to start stream; no serial returned for stream '${n.name}' (streamId: ${e})`,B.BadRequest,400);this._trackers.set(e,{serial:s,name:n.name,streamId:e,accumulated:n.data,persistentHeaders:i,aborted:!1}),this._logger?.debug(`DefaultEncoderCore.startStream(); stream started`,{name:n.name,streamId:e,serial:s})}appendStream(e,n){this._assertNotClosed();let r=this._trackers.get(e);if(!r)throw new t.ErrorInfo(`unable to append to stream; no active stream for streamId '${e}'`,B.InvalidArgument,400);r.accumulated+=n;let i={serial:r.serial,data:n,extras:{headers:{...r.persistentHeaders}}};this._invokeOnMessage(i);let a=this._writer.appendMessage(i);this._pending.push({promise:a,streamId:e})}async closeStream(e,n){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.closeStream();`,{streamId:e});let r=this._trackers.get(e);if(!r)throw new t.ErrorInfo(`unable to close stream; no active stream for streamId '${e}'`,B.InvalidArgument,400);r.accumulated+=n.data;let i=this._buildClosingHeaders(r,n.headers??{});i[d]=`finished`;let a={serial:r.serial,data:n.data,extras:{headers:i}};this._invokeOnMessage(a);let o=this._writer.appendMessage(a);this._pending.push({promise:o,streamId:e}),await this._flushPending(),this._logger?.debug(`DefaultEncoderCore.closeStream(); stream closed`,{streamId:e})}async abortStream(e,n){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.abortStream();`,{streamId:e});let r=this._trackers.get(e);if(!r)throw new t.ErrorInfo(`unable to abort stream; no active stream for streamId '${e}'`,B.InvalidArgument,400);r.aborted=!0;let i=this._buildClosingHeaders(r,{},n);i[d]=`aborted`;let a={serial:r.serial,data:``,extras:{headers:i}};this._invokeOnMessage(a);let o=this._writer.appendMessage(a);this._pending.push({promise:o,streamId:e}),await this._flushPending(),this._logger?.debug(`DefaultEncoderCore.abortStream(); stream aborted`,{streamId:e})}async abortAllStreams(e){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.abortAllStreams();`,{streamCount:this._trackers.size});for(let t of this._trackers.values()){t.aborted=!0;let n=this._buildClosingHeaders(t,{},e);n[d]=`aborted`;let r={serial:t.serial,data:``,extras:{headers:n}};this._invokeOnMessage(r);let i=this._writer.appendMessage(r);this._pending.push({promise:i,streamId:t.streamId})}await this._flushPending()}async _flushPending(){if(this._flushPromise)return this._flushPromise;let e=this._pending;if(this._pending=[],e.length!==0){this._logger?.trace(`DefaultEncoderCore._flushPending();`,{count:e.length}),this._flushPromise=this._doFlush(e);try{await this._flushPromise}finally{this._flushPromise=void 0}}}async _doFlush(e){let n=await Promise.allSettled(e.map(async e=>e.promise)),r=new Set;for(let[t,i]of n.entries()){let n=e[t];n&&i.status===`rejected`&&r.add(n.streamId)}if(r.size===0){this._logger?.debug(`DefaultEncoderCore._flushPending(); all appends succeeded`);return}this._logger?.warn(`DefaultEncoderCore._flushPending(); recovering failed appends`,{failedStreams:[...r]});let i=[];for(let e of r){let t=this._trackers.get(e);if(!t)continue;let n=t.aborted?`aborted`:`finished`,r={serial:t.serial,data:t.accumulated,extras:{headers:{...t.persistentHeaders,[d]:n}}};try{await this._writer.updateMessage(r)}catch(t){i.push({streamId:e,error:t})}}if(i.length>0){let e=i.map(e=>e.streamId).join(`, `);throw this._logger?.error(`DefaultEncoderCore._flushPending(); recovery failed`,{failedStreams:e}),new t.ErrorInfo(`unable to flush pending appends; recovery failed for stream(s): ${e}`,B.EncoderRecoveryFailed,500)}}async close(){if(!this._closed){this._logger?.trace(`DefaultEncoderCore.close();`),this._closed=!0;try{await this._flushPending()}finally{this._trackers.clear()}this._logger?.debug(`DefaultEncoderCore.close(); encoder closed`)}}_invokeOnMessage(e){try{this._onMessageHook(e)}catch(e){this._logger?.error(`DefaultEncoderCore._invokeOnMessage(); hook threw`,{error:e})}}_assertNotClosed(){if(this._closed)throw new t.ErrorInfo(`unable to write to encoder; encoder has been closed`,B.InvalidArgument,400)}_resolveClientId(e){return e?.clientId??this._defaultClientId}_buildHeaders(e,t){let n={...k(this._defaultExtras?.headers,t?.extras?.headers),...e};return t?.messageId!==void 0&&(n[h]=t.messageId),n}_buildDiscreteMessage(e,t){let n=this._buildHeaders(e.headers??{},t);n[u]=`false`;let r=this._resolveClientId(t),i={name:e.name,data:e.data,extras:{headers:n,...e.ephemeral?{ephemeral:!0}:{}},...r?{clientId:r}:{}};return this._invokeOnMessage(i),i}_buildClosingHeaders(e,t,n){let r={...e.persistentHeaders},i=k(this._defaultExtras?.headers,n?.extras?.headers);return Object.assign(r,i),Object.assign(r,t),r}},Ue=(e,t={})=>new He(e,t),V=e=>{switch(e.type){case`tool-output-available`:{let t=M().str(`toolCallId`,e.toolCallId).bool(`dynamic`,e.dynamic).bool(`providerExecuted`,e.providerExecuted).bool(`preliminary`,e.preliminary).build();return{name:`tool-output-available`,data:{output:e.output},headers:t}}case`tool-output-error`:{let t=M().str(`toolCallId`,e.toolCallId).bool(`dynamic`,e.dynamic).bool(`providerExecuted`,e.providerExecuted).build();return{name:`tool-output-error`,data:{errorText:e.errorText},headers:t}}case`tool-approval-request`:return{name:`tool-approval-request`,data:``,headers:M().str(`toolCallId`,e.toolCallId).str(`approvalId`,e.approvalId).build()};case`tool-output-denied`:return{name:`tool-output-denied`,data:``,headers:M().str(`toolCallId`,e.toolCallId).build()};default:if(e.type.startsWith(`data-`)){let t=e,n=M().str(`id`,t.id).bool(`transient`,t.transient).build(),r=t.transient===!0;return{name:e.type,data:t.data,headers:n,ephemeral:r}}throw new t.ErrorInfo(`unable to write event; unsupported chunk type '${e.type}'`,B.InvalidArgument,400)}},We=class{constructor(e,t={}){this._aborted=!1,this._core=Ue(e,t),this._messageId=t.messageId}async appendEvent(e,n){switch(e.type){case`text-start`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.id,{name:`text`,data:``,headers:t},n);break}case`reasoning-start`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.id,{name:`reasoning`,data:``,headers:t},n);break}case`tool-input-start`:{let t=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).bool(`dynamic`,e.dynamic).str(`title`,e.title).bool(`providerExecuted`,e.providerExecuted).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.toolCallId,{name:`tool-input`,data:``,headers:t},n);break}case`text-delta`:this._core.appendStream(e.id,e.delta);break;case`reasoning-delta`:this._core.appendStream(e.id,e.delta);break;case`tool-input-delta`:this._core.appendStream(e.toolCallId,e.inputTextDelta);break;case`text-end`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.closeStream(e.id,{name:`text`,data:``,headers:t});break}case`reasoning-end`:{let t=M().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.closeStream(e.id,{name:`reasoning`,data:``,headers:t});break}case`tool-input-available`:try{let t=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).json(`providerMetadata`,e.providerMetadata).build();await this._core.closeStream(e.toolCallId,{name:`tool-input`,data:``,headers:t})}catch(n){if(!(n instanceof t.ErrorInfo&&Ve(n,B.InvalidArgument)))throw n;let r=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).bool(`dynamic`,e.dynamic).str(`title`,e.title).bool(`providerExecuted`,e.providerExecuted).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`tool-input`,data:e.input,headers:r})}break;case`start`:{let t=M().str(`messageId`,e.messageId??this._messageId).json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`start`,data:``,headers:t},n);break}case`start-step`:await this._core.publishDiscrete({name:`start-step`,data:``},n);break;case`finish-step`:await this._core.publishDiscrete({name:`finish-step`,data:``},n);break;case`finish`:{let t=M().str(`finishReason`,e.finishReason).json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`finish`,data:``,headers:t},n);break}case`error`:await this._core.publishDiscrete({name:`error`,data:e.errorText},n);break;case`abort`:this._aborted=!0,await this._core.abortAllStreams(n),await this._core.publishDiscrete({name:`abort`,data:e.reason??``,headers:{[d]:`aborted`}},n);break;case`tool-input-error`:{let t=M().str(`toolCallId`,e.toolCallId).str(`toolName`,e.toolName).bool(`dynamic`,e.dynamic).str(`title`,e.title).bool(`providerExecuted`,e.providerExecuted).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`tool-input-error`,data:{errorText:e.errorText,input:e.input},headers:t});break}case`tool-output-available`:case`tool-output-error`:case`tool-approval-request`:case`tool-output-denied`:await this._core.publishDiscrete(V(e),n);break;case`file`:{let t=M().str(`mediaType`,e.mediaType).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`file`,data:e.url,headers:t},n);break}case`source-url`:{let t=M().str(`sourceId`,e.sourceId).str(`title`,e.title).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`source-url`,data:e.url,headers:t},n);break}case`source-document`:{let t=M().str(`sourceId`,e.sourceId).str(`mediaType`,e.mediaType).str(`title`,e.title).str(`filename`,e.filename).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`source-document`,data:``,headers:t},n);break}case`message-metadata`:{let t=M().json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`message-metadata`,data:``,headers:t},n);break}default:if(e.type.startsWith(`data-`)){let t=M().str(`id`,e.id).bool(`transient`,e.transient).build(),r=e.transient===!0;await this._core.publishDiscrete({name:e.type,data:e.data,headers:t,ephemeral:r},n)}break}}async writeEvent(e,t){return this._core.publishDiscrete(V(e),t)}async writeMessages(e,t){let n=e.flatMap(e=>Ge(e));return this._core.publishDiscreteBatch(n,t)}async abort(e){this._aborted||(this._aborted=!0,await this._core.abortAllStreams(),await this._core.publishDiscrete({name:`abort`,data:e??``,headers:{[d]:`aborted`}}))}async close(){await this._core.close()}},Ge=e=>{let t=e.id,r=[];for(let i of e.parts)switch(i.type){case`text`:r.push({name:`text`,data:i.text,headers:M().str(`messageId`,t).build()});break;case`file`:r.push({name:`file`,data:i.url,headers:M().str(`messageId`,t).str(`mediaType`,i.mediaType).build()});break;default:(0,n.isDataUIPart)(i)&&r.push({name:i.type,data:i.data,headers:M().str(`messageId`,t).str(`id`,i.id).build()});break}return r.length===0&&r.push({name:`text`,data:``,headers:M().str(`messageId`,t).build()}),r},H={createEncoder:(e,t={})=>new We(e,t),createDecoder:Be,createAccumulator:F,isTerminal:e=>e.type===`finish`||e.type===`error`||e.type===`abort`},Ke=e=>{let t,n=new Promise(e=>{t=e}),r=new TransformStream({flush:()=>{t()}});return e.pipeTo(r.writable).catch(()=>{t()}),{stream:r.readable,done:n}},qe=e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&(e.state===`input-streaming`||e.state===`input-available`||e.state===`approval-requested`)),Je=(e,n)=>{let r=!1,i=new Set,a=e=>{r=e;for(let t of i)try{t(e)}catch{}};return{sendMessages:async r=>{let{messages:i,abortSignal:o,trigger:s,messageId:c}=r,l=e.view.flattenNodes(),u=i.at(-1),d=u?l.find(e=>e.message.id===u.id):void 0,f=s===`submit-message`&&u?.role===`assistant`&&!!d,p=s===`submit-message`&&!c&&u?.role===`user`?i.at(-2):void 0,m=p&&qe(p)?l.find(e=>e.message.id===p.id):void 0,h,g;if(s===`regenerate-message`||f)h=[],g=i;else{if(i.length===0)throw new t.ErrorInfo(`unable to send messages; messages array is empty for submit-message trigger`,B.InvalidArgument,400);h=[i.at(-1)],g=m?i.slice(0,-2):i.slice(0,-1)}let _,v;if(c&&!f){_=c;let e=l.find(e=>e.message.id===c);e&&(_=e.msgId,v=e.parentId)}else f?v=d.msgId:m&&(_=m.msgId,v=m.parentId);let y,b;if(n?.prepareSendMessagesRequest){let e=n.prepareSendMessagesRequest({chatId:r.chatId,trigger:s,messageId:c,history:g,messages:h,forkOf:_,parent:v});y=e.body??{},b=e.headers}else{let e=new Set(g.map(e=>e.id));y={history:l.filter(t=>e.has(t.message.id)),chatId:r.chatId,trigger:s,...c!==void 0&&{messageId:c},..._!==void 0&&{forkOf:_},...v!==void 0&&{parent:v}},b=void 0}let x={body:y,headers:b};_!==void 0&&(x.forkOf=_),v!==void 0&&(x.parent=v);let S=await e.view.send(h,x);o&&o.addEventListener(`abort`,()=>void e.cancel({all:!0}),{once:!0});let{stream:C,done:w}=Ke(S.stream);return a(!0),w.then(()=>{a(!1)}),C},reconnectToStream:()=>Promise.resolve(null),close:async t=>e.close(t),get streaming(){return r},onStreamingChange:e=>(i.add(e),()=>{i.delete(e)})}},Ye=e=>({logAction:(t,n,r)=>{e.error(n,{detail:r})},shouldLog:()=>!0}),Xe=t.Realtime.EventEmitter,U=class extends Xe{constructor(e){super(Ye(e))}},W=function(e){return e.Trace=`trace`,e.Debug=`debug`,e.Info=`info`,e.Warn=`warn`,e.Error=`error`,e.Silent=`silent`,e}({}),Ze=(e,t,n)=>{let r=n?`, context: ${JSON.stringify(n)}`:``,i=`[${new Date().toISOString()}] ${t.valueOf().toUpperCase()} ably-ai-transport: ${e}${r}`;switch(t){case W.Trace:case W.Debug:console.log(i);break;case W.Info:console.info(i);break;case W.Warn:console.warn(i);break;case W.Error:console.error(i);break;case W.Silent:break}},Qe=e=>new $e(e.logHandler??Ze,e.logLevel),G=function(e){return e[e.Trace=0]=`Trace`,e[e.Debug=1]=`Debug`,e[e.Info=2]=`Info`,e[e.Warn=3]=`Warn`,e[e.Error=4]=`Error`,e[e.Silent=5]=`Silent`,e}(G||{}),K=new Map([[W.Trace,G.Trace],[W.Debug,G.Debug],[W.Info,G.Info],[W.Warn,G.Warn],[W.Error,G.Error],[W.Silent,G.Silent]]),$e=class e{constructor(e,n,r){this._handler=e,this._context=r;let i=K.get(n);if(i===void 0)throw new t.ErrorInfo(`unable to create logger; invalid log level: ${n}`,B.InvalidArgument,400);this._levelNumber=i}trace(e,t){this._write(e,W.Trace,G.Trace,t)}debug(e,t){this._write(e,W.Debug,G.Debug,t)}info(e,t){this._write(e,W.Info,G.Info,t)}warn(e,t){this._write(e,W.Warn,G.Warn,t)}error(e,t){this._write(e,W.Error,G.Error,t)}withContext(t){let n=[...K.entries()].find(([,e])=>e===this._levelNumber)?.[0]??W.Error;return new e(this._handler,n,this._mergeContext(t))}_write(e,t,n,r){n>=this._levelNumber&&this._handler(e,t,this._mergeContext(r))}_mergeContext(e){return this._context?e?{...this._context,...e}:this._context:e??void 0}},q=e=>{let t={[_]:e.role,[m]:e.turnId,[h]:e.msgId};return e.turnClientId!==void 0&&(t[g]=e.turnClientId),e.parent&&(t[C]=e.parent),e.forkOf&&(t[w]=e.forkOf),e.amend&&(t[v]=e.amend),t},et=class{constructor(e,t){this._turns=new Map,this._isTerminal=e,this._logger=t}createStream(e){this._logger.trace(`StreamRouter.createStream();`,{turnId:e});let n={},r=new ReadableStream({start(e){n.controller=e}});if(!n.controller)throw new t.ErrorInfo(`unable to create stream; ReadableStream start() was not called synchronously`,B.TransportSubscriptionError,500);return this._turns.set(e,{controller:n.controller,turnId:e}),r}closeStream(e){let t=this._turns.get(e);if(!t)return!1;this._logger.debug(`StreamRouter.closeStream(); closing stream`,{turnId:e});try{t.controller.close()}catch{}return this._turns.delete(e),!0}errorStream(e,t){let n=this._turns.get(e);if(!n)return!1;this._logger.debug(`StreamRouter.errorStream(); erroring stream`,{turnId:e});try{n.controller.error(t)}catch{}return this._turns.delete(e),!0}route(e,t){let n=this._turns.get(e);if(!n)return!1;try{n.controller.enqueue(t)}catch{return this._turns.delete(e),!1}return this._isTerminal(t)&&this.closeStream(e),!0}has(e){return this._turns.has(e)}},tt=(e,t)=>new et(e,t),nt=class{get structuralVersion(){return this._structuralVersion}constructor(e){this._nodeIndex=new Map,this._sortedList=[],this._parentIndex=new Map,this._turnClientIds=new Map,this._seqCounter=0,this._structuralVersion=0,this._logger=e,this._emitter=new U(e)}_compareNodes(e,t){let n=e.node.serial,r=t.node.serial;return n===void 0&&r===void 0?e.insertSeq-t.insertSeq:n===void 0?1:r===void 0||n<r?-1:n>r?1:e.insertSeq-t.insertSeq}_insertSorted(e){if(e.node.serial===void 0){this._sortedList.push(e);return}let t=0,n=this._sortedList.length;for(;t<n;){let r=t+n>>>1,i=this._sortedList[r];if(!i)break;this._compareNodes(i,e)<=0?t=r+1:n=r}this._sortedList.splice(t,0,e)}_removeSorted(e){let t=this._sortedList.indexOf(e);t!==-1&&this._sortedList.splice(t,1)}_addToParentIndex(e,t){let n=this._parentIndex.get(e);n||(n=new Set,this._parentIndex.set(e,n)),n.add(t)}_removeFromParentIndex(e,t){let n=this._parentIndex.get(e);n&&(n.delete(t),n.size===0&&this._parentIndex.delete(e))}_getSiblingGroup(e){let t=this._nodeIndex.get(e);if(!t)return[];let n=t.node,r=new Set([n.msgId]);for(;n.forkOf&&!r.has(n.forkOf);){let e=this._nodeIndex.get(n.forkOf);if(!e||e.node.parentId!==n.parentId)break;n=e.node,r.add(n.msgId)}let i=n.parentId,a=n.msgId,o=[],s=this._parentIndex.get(i);if(s)for(let e of s){let t=this._nodeIndex.get(e);t&&this._isSiblingOf(t.node,a)&&o.push(t)}return o.sort((e,t)=>this._compareNodes(e,t)),o.map(e=>e.node)}_isSiblingOf(e,t){if(e.msgId===t)return!0;let n=e,r=new Set([n.msgId]);for(;n.forkOf;){if(n.forkOf===t)return!0;if(r.has(n.forkOf))break;let e=this._nodeIndex.get(n.forkOf);if(!e)break;n=e.node,r.add(n.msgId)}return!1}getGroupRoot(e){let t=this._nodeIndex.get(e);if(!t)return e;let n=t.node,r=new Set([n.msgId]);for(;n.forkOf&&!r.has(n.forkOf);){let e=this._nodeIndex.get(n.forkOf);if(!e||e.node.parentId!==n.parentId)break;n=e.node,r.add(n.msgId)}return n.msgId}flattenNodes(e){this._logger.trace(`DefaultTree.flattenNodes();`);let t=[],n=new Set,r=new Map;for(let i of this._sortedList){let a=i.node,{msgId:o,parentId:s}=a;if(s!==void 0&&!n.has(s))continue;let c=this._getSiblingGroup(o);if(c.length>1){let t=this.getGroupRoot(o),n=r.get(t);if(n===void 0){let i=e.get(t);if(i&&c.some(e=>e.msgId===i))n=i;else{let e=c.at(-1);if(!e)break;n=e.msgId}r.set(t,n)}if(o!==n)continue}n.add(o),t.push(a)}return t}getSiblings(e){return this._logger.trace(`DefaultTree.getSiblings();`,{msgId:e}),this._getSiblingGroup(e).map(e=>e.message)}getSiblingNodes(e){return this._getSiblingGroup(e)}hasSiblings(e){return this._getSiblingGroup(e).length>1}getNode(e){return this._logger.trace(`DefaultTree.getNode();`,{msgId:e}),this._nodeIndex.get(e)?.node}getHeaders(e){return this._logger.trace(`DefaultTree.getHeaders();`,{msgId:e}),this._nodeIndex.get(e)?.node.headers}upsert(e,t,n,r){let i=n[`x-ably-parent`]??void 0,a=n[`x-ably-fork-of`]??void 0,o=this._nodeIndex.get(e);if(o){o.node.message=t,Object.keys(n).length>0&&(o.node.headers={...n}),r&&!o.node.serial&&(this._logger.debug(`Tree.upsert(); promoting serial`,{msgId:e,serial:r}),o.node.serial=r,this._removeSorted(o),this._insertSorted(o),this._structuralVersion++),this._emitter.emit(`update`);return}this._logger.trace(`Tree.upsert(); inserting new node`,{msgId:e,parentId:i,forkOf:a});let s={node:{kind:`message`,message:t,msgId:e,parentId:i,forkOf:a,headers:{...n},serial:r},insertSeq:this._seqCounter++};this._nodeIndex.set(e,s),this._addToParentIndex(i,e),this._insertSorted(s),this._structuralVersion++,this._emitter.emit(`update`)}delete(e){let t=this._nodeIndex.get(e);if(!t)return;this._logger.debug(`Tree.delete();`,{msgId:e});let{node:n}=t;this._removeFromParentIndex(n.parentId,e),this._removeSorted(t),this._nodeIndex.delete(e),this._structuralVersion++,this._emitter.emit(`update`)}getActiveTurnIds(){this._logger.trace(`DefaultTree.getActiveTurnIds();`);let e=new Map;for(let[t,n]of this._turnClientIds){let r=e.get(n);r||(r=new Set,e.set(n,r)),r.add(t)}return e}on(e,t){let n=t;return this._emitter.on(e,n),()=>{this._emitter.off(e,n)}}emitAblyMessage(e){this._logger.trace(`DefaultTree.emitAblyMessage();`),this._emitter.emit(`ably-message`,e)}emitTurn(e){this._logger.trace(`DefaultTree.emitTurn();`,{turnId:e.turnId}),this._emitter.emit(`turn`,e)}trackTurn(e,t){this._logger.trace(`DefaultTree.trackTurn();`,{turnId:e,clientId:t}),this._turnClientIds.set(e,t)}untrackTurn(e){this._logger.trace(`DefaultTree.untrackTurn();`,{turnId:e}),this._turnClientIds.delete(e)}},rt=e=>new nt(e),it=e=>{let t=[...e.rawMessages].toReversed(),n=e.codec.createDecoder(),r=new Map,i=e.codec.createAccumulator(),a=0,o=new Map,s=new Map,c=[],l=[];for(let u of t){let t=n.decode(u),d=O(u),f=d[m],p=d[h],g=u.serial,_=d[v];if(_){for(let e of r.values())if(e.msgHeaders.has(_)){let n=[...e.msgHeaders.keys()].indexOf(_),r=n===-1?void 0:e.accumulator.messages[n];r&&e.accumulator.initMessage(_,r),e.accumulator.processOutputs(t),l.push({accumulator:e.accumulator,messageId:_});break}continue}if(f){let n=r.get(f);if(n||(n={accumulator:e.codec.createAccumulator(),firstSeen:a++,msgHeaders:new Map,msgSerials:new Map},r.set(f,n)),p){let e=n.msgHeaders.get(p);e?Object.keys(d).length>0&&Object.assign(e,d):(n.msgHeaders.set(p,{...d}),g&&n.msgSerials.set(p,g))}n.accumulator.processOutputs(t)}else{i.processOutputs(t);for(let e of t)if(e.kind===`message`&&p){c.push(p);let e=o.get(p);e?Object.keys(d).length>0&&Object.assign(e,d):(o.set(p,{...d}),g&&s.set(p,g))}}}for(let{accumulator:e,messageId:t}of l)e.completeMessage(t);let u=[];for(let[e,t]of i.completedMessages.entries()){let n=c[e];u.push({message:t,headers:n?o.get(n)??{}:{},serial:n?s.get(n)??``:``})}let d=[...r.values()].toSorted((e,t)=>e.firstSeen-t.firstSeen);for(let e of d){let t=[...e.msgHeaders.entries()],n=0;for(let r of e.accumulator.completedMessages){let i=t[n];if(i){let[t,a]=i;u.push({message:r,headers:a,serial:e.msgSerials.get(t)??``}),n++}else u.push({message:r,headers:{},serial:``})}}return u.toReversed()},at=e=>{if(e.cachedDecode&&e.cachedAtRawLength===e.rawMessages.length)return e.cachedDecode;let t=it(e);return e.cachedDecode=t,e.cachedAtRawLength=e.rawMessages.length,t},J=(e,t)=>{for(let n of t){let t=O(n),r=t[h];if(!r||t[`x-ably-amend`])continue;let i=n.action,a=i===`message.create`&&`x-ably-discrete`in t,o=t[`x-ably-stream`]===`true`&&(i===`message.create`||i===`message.update`||i===`message.append`),s=t[d],c=s===`finished`||s===`aborted`;(a||o)&&e.startedMsgIds.add(r),(a||c)&&e.terminatedMsgIds.add(r),e.startedMsgIds.has(r)&&e.terminatedMsgIds.has(r)&&e.completedMsgIds.add(r)}},Y=async(e,t,n)=>{e.rawMessages.push(...t.items),e.lastAblyPage=t,J(e,t.items);let r=e.returnedCount+n;for(;e.completedMsgIds.size<r&&t.hasNext();){e.logger.debug(`decodeHistory.fetchUntilLimit(); fetching next page`,{collected:e.rawMessages.length,completed:e.completedMsgIds.size});let n=await t.next();if(!n)break;t=n,e.rawMessages.push(...n.items),e.lastAblyPage=n,J(e,n.items)}},X=(e,t)=>{let n=at(e),r=n.slice(e.returnedCount,e.returnedCount+t),i=[...r].toReversed();e.returnedCount+=r.length;let a=n.length>e.returnedCount,o=e.lastAblyPage?.hasNext()??!1,s=e.rawMessages.length-e.returnedRawCount>0?e.rawMessages.slice(e.returnedRawCount).toReversed():[];return e.returnedRawCount=e.rawMessages.length,{items:i.map(e=>({message:e.message,headers:e.headers,serial:e.serial})),rawMessages:s,hasNext:()=>a||o,next:async()=>{if(a)return X(e,t);if(!o||!e.lastAblyPage)return;let n=await e.lastAblyPage.next();if(n)return await Y(e,n,t),X(e,t)}}},ot=async(e,t,n,r)=>{let i=n?.limit??100,a={codec:t,rawMessages:[],returnedCount:0,returnedRawCount:0,lastAblyPage:void 0,cachedDecode:void 0,cachedAtRawLength:0,startedMsgIds:new Set,terminatedMsgIds:new Set,completedMsgIds:new Set,logger:r};r.trace(`decodeHistory();`,{limit:i});let o=i*10;return await e.attach(),await Y(a,await e.history({untilAttach:!0,limit:o}),i),X(a,i)},st=class{constructor(e){this._branchSelections=new Map,this._withheldMsgIds=new Set,this._lastVisibleIds=[],this._lastVisibleMessages=[],this._lastVisibleTurnIds=new Set,this._hasMoreHistory=!1,this._withheldBuffer=[],this._unsubs=[],this._cachedNodes=[],this._lastStructuralVersion=-1,this._loadingOlder=!1,this._processingHistory=!1,this._closed=!1,this._tree=e.tree,this._channel=e.channel,this._codec=e.codec,this._sendDelegate=e.sendDelegate,this._onClose=e.onClose,this._logger=e.logger.withContext({component:`View`}),this._logger.trace(`DefaultView();`),this._emitter=new U(this._logger),this._cachedNodes=this._computeFlatNodes(),this._lastStructuralVersion=this._tree.structuralVersion,this._updateVisibleSnapshot(this._cachedNodes),this._unsubs.push(this._tree.on(`update`,()=>{this._onTreeUpdate()}),this._tree.on(`ably-message`,e=>{this._onTreeAblyMessage(e)}),this._tree.on(`turn`,e=>{this._onTreeTurn(e)}))}getMessages(){return this.flattenNodes().map(e=>e.message)}flattenNodes(){return this._cachedNodes}_computeFlatNodes(){let e=this._tree.flattenNodes(this._resolveSelections());return this._withheldMsgIds.size===0?e:e.filter(e=>!this._withheldMsgIds.has(e.msgId))}hasOlder(){return this._withheldBuffer.length>0||this._hasMoreHistory}async loadOlder(e=100){if(!(this._closed||this._loadingOlder)){this._loadingOlder=!0,this._logger.trace(`DefaultView.loadOlder();`,{limit:e});try{if(this._withheldBuffer.length>0){let t=this._withheldBuffer.splice(-e,e);this._releaseWithheld(t);return}if(!this._hasMoreHistory&&!this._lastHistoryPage){await this._loadFirstPage(e);return}if(!this._hasMoreHistory)return;if(!this._lastHistoryPage?.hasNext()){this._hasMoreHistory=!1;return}let t=await this._lastHistoryPage.next();if(this._closed||!t){t||(this._hasMoreHistory=!1);return}await this._loadAndReveal(t,e)}catch(e){throw this._logger.error(`DefaultView.loadOlder(); failed`,{error:e}),e}finally{this._loadingOlder=!1}}}select(e,t){this._logger.trace(`DefaultView.select();`,{msgId:e,index:t});let n=this._tree.getSiblingNodes(e);if(n.length<=1)return;let r=this._tree.getGroupRoot(e),i=Math.max(0,Math.min(t,n.length-1)),a=n[i];a&&(this._branchSelections.set(r,{kind:`user`,selectedId:a.msgId}),this._logger.debug(`DefaultView.select();`,{msgId:e,index:i,selectedId:a.msgId}),this._cachedNodes=this._computeFlatNodes(),this._updateVisibleSnapshot(this._cachedNodes),this._emitter.emit(`update`))}getSelectedIndex(e){this._logger.trace(`DefaultView.getSelectedIndex();`,{msgId:e});let t=this._tree.getSiblingNodes(e);if(t.length<=1)return 0;let n=this._tree.getGroupRoot(e),r=this._branchSelections.get(n);if(!r||r.kind===`pending`)return t.length-1;let i=t.findIndex(e=>e.msgId===r.selectedId);return i===-1?t.length-1:i}getSiblings(e){return this._tree.getSiblings(e)}hasSiblings(e){return this._tree.hasSiblings(e)}getNode(e){return this._tree.getNode(e)}async send(e,n){if(this._logger.trace(`DefaultView.send();`),this._closed)throw new t.ErrorInfo(`unable to send; view is closed`,B.InvalidArgument,400);let r=this.flattenNodes(),i=await this._sendDelegate(e,n,r);if(n?.forkOf){let e=this._tree.getGroupRoot(n.forkOf);if(i.optimisticMsgIds.length>0){let t=i.optimisticMsgIds.at(-1);t&&(this._branchSelections.set(e,{kind:`auto`,selectedId:t}),this._cachedNodes=this._computeFlatNodes(),this._updateVisibleSnapshot(this._cachedNodes),this._emitter.emit(`update`))}else{this._branchSelections.set(e,{kind:`pending`,turnId:i.turnId}),this._logger.debug(`DefaultView.send(); deferring fork auto-selection`,{forkOf:n.forkOf,groupRoot:e,turnId:i.turnId});let t=this._tree.on(`turn`,n=>{if(n.type!==`x-ably-turn-end`||n.turnId!==i.turnId)return;let r=this._branchSelections.get(e);r?.kind===`pending`&&r.turnId===i.turnId&&this._branchSelections.delete(e),t();let a=this._unsubs.indexOf(t);a!==-1&&this._unsubs.splice(a,1)});this._unsubs.push(t)}}return i}async regenerate(e,n){this._logger.trace(`DefaultView.regenerate();`,{messageId:e});let r=this._tree.getNode(e);if(!r)throw new t.ErrorInfo(`unable to regenerate; message not found in tree: ${e}`,B.InvalidArgument,400);let i=r.parentId;return this.send([],{...n,body:{history:this._getHistoryBefore(e),...n?.body},forkOf:e,parent:i})}async edit(e,n,r){this._logger.trace(`DefaultView.edit();`,{messageId:e});let i=this._tree.getNode(e);if(!i)throw new t.ErrorInfo(`unable to edit; message not found in tree: ${e}`,B.InvalidArgument,400);let a=i.parentId;return this.send(n,{...r,body:{history:this._getHistoryBefore(e),...r?.body},forkOf:e,parent:a})}async update(e,n,r){if(this._closed)throw new t.ErrorInfo(`unable to update; view is closed`,B.InvalidArgument,400);this._logger.trace(`DefaultView.update();`,{msgId:e,eventCount:n.length});let i=[{kind:`event`,msgId:e,events:n}];return this._sendDelegate([],r,this.flattenNodes(),i)}_getHistoryBefore(e){this._logger.trace(`DefaultView._getHistoryBefore();`,{messageId:e});let t=this.flattenNodes(),n=t.findIndex(t=>t.msgId===e);return n===-1?(this._logger.warn(`DefaultView._getHistoryBefore(); target not in visible nodes, returning full list`,{messageId:e}),t):t.slice(0,n)}getActiveTurnIds(){this._logger.trace(`DefaultView.getActiveTurnIds();`);let e=this._tree.getActiveTurnIds();if(this._withheldMsgIds.size===0)return e;let t=new Map;for(let[n,r]of e){let e=new Set;for(let t of r)this._lastVisibleTurnIds.has(t)&&e.add(t);e.size>0&&t.set(n,e)}return t}on(e,t){let n=t;return this._emitter.on(e,n),()=>{this._emitter.off(e,n)}}close(){this._logger.info(`DefaultView.close();`),this._closed=!0,this._loadingOlder=!1;for(let e of this._unsubs)e();this._unsubs.length=0,this._emitter.off(),this._branchSelections.clear(),this._withheldMsgIds.clear(),this._withheldBuffer.length=0,this._onClose?.()}async _loadFirstPage(e){let t=new Set(this._tree.flattenNodes(this._resolveSelections()).map(e=>e.msgId)),n=await ot(this._channel,this._codec,{limit:e},this._logger);if(this._closed)return;let{newVisible:r,lastPage:i}=await this._loadUntilVisible(n,e,t);if(this._closed)return;this._lastHistoryPage=i,this._hasMoreHistory=i.hasNext();let a=r.slice(-e),o=r.slice(0,-e);for(let e of o)this._withheldMsgIds.add(e.msgId);this._withheldBuffer.push(...o),this._releaseWithheld(a)}async _loadAndReveal(e,t){let n=new Set(this._tree.flattenNodes(this._resolveSelections()).map(e=>e.msgId)),{newVisible:r,lastPage:i}=await this._loadUntilVisible(e,t,n);if(this._closed)return;this._lastHistoryPage=i,this._hasMoreHistory=i.hasNext();let a=r.slice(-t),o=r.slice(0,-t);for(let e of o)this._withheldMsgIds.add(e.msgId);this._withheldBuffer.push(...o),this._releaseWithheld(a)}_processHistoryPage(e){this._processingHistory=!0;try{for(let t of e.items){let e=t.headers[h];e&&this._tree.upsert(e,t.message,t.headers,t.serial)}for(let t of e.rawMessages)this._tree.emitAblyMessage(t)}finally{this._processingHistory=!1}}async _loadUntilVisible(e,t,n){this._processHistoryPage(e);let r=e,i=()=>{let e=0;for(let t of this._tree.flattenNodes(this._resolveSelections()))n.has(t.msgId)||e++;return e};for(;i()<t&&r.hasNext();){let e=await r.next();if(!e||this._closed)break;this._processHistoryPage(e),r=e}return{newVisible:this._tree.flattenNodes(this._resolveSelections()).filter(e=>!n.has(e.msgId)),lastPage:r}}_releaseWithheld(e){for(let t of e)this._withheldMsgIds.delete(t.msgId);e.length>0&&(this._cachedNodes=this._computeFlatNodes(),this._updateVisibleSnapshot(this._cachedNodes),this._emitter.emit(`update`))}_updateVisibleSnapshot(e){let t=e??this.flattenNodes();this._lastVisibleIds=t.map(e=>e.msgId),this._lastVisibleMessages=t.map(e=>e.message),this._lastVisibleTurnIds=new Set;for(let e of t){let t=e.headers[m];t&&this._lastVisibleTurnIds.add(t)}}_onTreeUpdate(){if(this._processingHistory)return;let e=this._tree.structuralVersion;if(e===this._lastStructuralVersion){this._cachedNodes.some((e,t)=>e.message!==this._lastVisibleMessages[t])&&(this._lastVisibleMessages=this._cachedNodes.map(e=>e.message),this._cachedNodes=[...this._cachedNodes],this._emitter.emit(`update`));return}this._lastStructuralVersion=e,this._pinBranchSelections(),this._resolvePendingSelections();let t=this._computeFlatNodes(),n=t.map(e=>e.msgId),r=t.map(e=>e.message);this._visibleChanged(n,r)&&(this._cachedNodes=t,this._updateVisibleSnapshot(t),this._emitter.emit(`update`))}_resolveSelections(){let e=new Map;for(let[t,n]of this._branchSelections)n.kind!==`pending`&&e.set(t,n.selectedId);return e}_pinBranchSelections(){for(let e of this._lastVisibleIds){if(!this._tree.hasSiblings(e))continue;let t=this._tree.getGroupRoot(e),n=this._branchSelections.get(t);if(n?.kind===`pending`){let r=this._tree.getSiblingNodes(e).at(-1);r&&r.msgId!==e&&r.headers[`x-ably-turn-id`]===n.turnId&&(this._logger.debug(`DefaultView._pinBranchSelections(); auto-selecting pending fork`,{msgId:e,newestId:r.msgId,turnId:n.turnId}),this._branchSelections.set(t,{kind:`auto`,selectedId:r.msgId}));continue}n||this._branchSelections.set(t,{kind:`pinned`,selectedId:e})}}_resolvePendingSelections(){for(let[e,t]of this._branchSelections){if(t.kind!==`pending`)continue;let n=this._tree.getSiblingNodes(e);if(n.length<=1)continue;let r=n.at(-1);!r||r.msgId===e||r.headers[`x-ably-turn-id`]===t.turnId&&(this._logger.debug(`DefaultView._resolvePendingSelections(); resolving off-branch pending`,{groupRoot:e,newestId:r.msgId,turnId:t.turnId}),this._branchSelections.set(e,{kind:`auto`,selectedId:r.msgId}))}}_onTreeAblyMessage(e){let t=O(e)[h];if(!t){this._emitter.emit(`ably-message`,e);return}this._lastVisibleIds.includes(t)&&this._emitter.emit(`ably-message`,e)}_onTreeTurn(e){if(this._lastVisibleTurnIds.has(e.turnId)){this._emitter.emit(`turn`,e);return}e.type===`x-ably-turn-start`&&this._isTurnStartVisible(e)&&(this._lastVisibleTurnIds.add(e.turnId),this._emitter.emit(`turn`,e))}_isTurnStartVisible(e){let{parent:t}=e;return t===void 0?!0:this._lastVisibleIds.includes(t)}_visibleChanged(e,t){if(e.length!==this._lastVisibleIds.length)return!0;for(let[t,n]of e.entries())if(n!==this._lastVisibleIds[t])return!0;for(let[e,n]of t.entries())if(n!==this._lastVisibleMessages[e])return!0;return!1}},ct=e=>new st(e),lt=()=>{},Z=function(e){return e.READY=`ready`,e.CLOSED=`closed`,e}(Z||{}),ut=class{constructor(e){if(this._ownMsgIds=new Set,this._ownTurnIds=new Set,this._turnMsgIds=new Map,this._turnObservers=new Map,this._closeResolvers=[],this._views=new Set,this._state=Z.READY,this._pendingLocalEvents=[],this._channel=e.channel,this._codec=e.codec,this._clientId=e.clientId,this._api=e.api,this._credentials=e.credentials,this._headersFn=typeof e.headers==`function`?e.headers:e.headers?()=>e.headers:void 0,this._bodyFn=typeof e.body==`function`?e.body:e.body?()=>e.body:void 0,this._fetchFn=e.fetch??globalThis.fetch.bind(globalThis),this._logger=(e.logger??Qe({logLevel:W.Silent})).withContext({component:`ClientTransport`}),this._emitter=new U(this._logger),this._hasAttachedOnce=this._channel.state===`attached`,this._tree=rt(this._logger),this._view=ct({tree:this._tree,channel:this._channel,codec:this._codec,sendDelegate:this._internalSend.bind(this),logger:this._logger,onClose:()=>this._views.delete(this._view)}),this._router=tt(this._codec.isTerminal.bind(this._codec),this._logger),this._decoder=this._codec.createDecoder(),this._views.add(this._view),this.tree=this._tree,this.view=this._view,e.messages){let t;for(let n of e.messages){let e=crypto.randomUUID(),r={[h]:e};t&&(r[C]=t),this._tree.upsert(e,n,r),t=e}}this._onMessage=e=>{this._handleMessage(e)},this._attachPromise=this._channel.subscribe(this._onMessage),this._onChannelStateChange=e=>{this._handleChannelStateChange(e)},this._channel.on(this._onChannelStateChange)}_handleMessage(e){if(this._state!==Z.CLOSED)try{if(e.name===`x-ably-turn-start`){let t=O(e),n=t[m],r=t[`x-ably-turn-client-id`]??``;if(n){this._tree.trackTurn(n,r);let e=t[C],i=t[w];this._tree.emitTurn({type:E,turnId:n,clientId:r,...e!==void 0&&{parent:e},...i!==void 0&&{forkOf:i}})}this._tree.emitAblyMessage(e);return}if(e.name===`x-ably-turn-end`){let t=O(e),n=t[m],r=t[`x-ably-turn-client-id`]??``,i=t[`x-ably-turn-reason`]??`complete`;if(n){this._router.closeStream(n),this._turnObservers.delete(n),this._tree.untrackTurn(n);let e=this._turnMsgIds.get(n);if(e){for(let t of e)this._ownMsgIds.delete(t);this._turnMsgIds.delete(n)}this._ownTurnIds.delete(n),this._tree.emitTurn({type:te,turnId:n,clientId:r,reason:i})}this._tree.emitAblyMessage(e);return}let t=this._decoder.decode(e),n=O(e),r=e.serial,i=n[v];if(i){for(let e of t)e.kind===`event`&&this._handleAmendmentEvent(i,e);return}let a=n[m];a&&this._updateTurnObserverHeaders(a,n,r);for(let i of t)i.kind===`message`?this._handleMessageOutput(i.message,n,r,e.action):this._handleEventOutput(i,n);this._tree.emitAblyMessage(e)}catch(e){let n=e instanceof t.ErrorInfo?e:void 0;this._emitter.emit(`error`,new t.ErrorInfo(`unable to process channel message; ${e instanceof Error?e.message:String(e)}`,B.TransportSubscriptionError,500,n))}}_handleMessageOutput(e,t,n,r){let i=t[h];if(i&&this._ownMsgIds.has(i)){this._upsertAndNotify(e,t,n);return}r===`message.create`&&this._upsertAndNotify(e,t,n)}_handleEventOutput(e,t){if(e.kind!==`event`)return;let n=e.event,r=t[m];if(r){if(this._router.route(r,n)){this._accumulateAndEmit(r,e),this._codec.isTerminal(n)&&this._turnObservers.delete(r);return}this._ownTurnIds.has(r)&&!this._turnObservers.has(r)||(this._accumulateAndEmit(r,e),this._codec.isTerminal(n)&&this._turnObservers.delete(r))}}_handleAmendmentEvent(e,t){this._logger.trace(`ClientTransport._handleAmendmentEvent();`,{targetMsgId:e});let n=this._tree.getNode(e);if(!n){this._logger.debug(`ClientTransport._handleAmendmentEvent(); target not found, dropping`,{targetMsgId:e});return}let r=this._codec.createAccumulator();r.initMessage(e,n.message),r.processOutputs([t]);let i=r.messages.at(-1);i&&this._tree.upsert(e,i,n.headers,n.serial)}_handleChannelStateChange(e){if(this._state===Z.CLOSED)return;let{current:n,resumed:r}=e;if(n===`attached`&&!this._hasAttachedOnce){this._hasAttachedOnce=!0;return}if(!(n===`failed`||n===`suspended`||n===`detached`||n===`attached`&&!r))return;this._logger.error(`ClientTransport._handleChannelStateChange(); channel continuity lost`,{current:n,resumed:r,previous:e.previous});let i=new t.ErrorInfo(`unable to deliver events; channel continuity lost (${n}${n===`attached`?`, resumed: false`:``})`,B.ChannelContinuityLost,500,e.reason);for(let e of this._ownTurnIds)this._router.errorStream(e,i);this._emitter.emit(`error`,i)}_upsertAndNotify(e,t,n){let r=t[h];r&&this._tree.upsert(r,e,t,n)}_updateTurnObserverHeaders(e,t,n){let r=this._turnObservers.get(e);r?(Object.keys(t).length>0&&Object.assign(r.headers,t),n!==void 0&&(r.serial=n)):this._turnObservers.set(e,{headers:{...t},serial:n,accumulator:this._codec.createAccumulator()})}_accumulateAndEmit(e,t){let n=this._turnObservers.get(e);if(!n)return;let r=n.headers[h];if(r){let e=this._tree.getNode(r);e&&n.accumulator.initMessage(r,e.message)}n.accumulator.processOutputs([t]);let i=n.accumulator.messages;if(i.length===0)return;let a;try{a=structuredClone(i.at(-1))}catch{a=i.at(-1)}if(a){let e=n.headers[h];e&&this._tree.upsert(e,a,{...n.headers},n.serial)}}async _publishCancel(e){this._logger.trace(`ClientTransport._publishCancel();`,{filter:e});let t={};e.turnId?t[y]=e.turnId:e.own?t[b]=`true`:e.clientId?t[S]=e.clientId:e.all&&(t[x]=`true`),await this._channel.publish({name:T,extras:{headers:t}})}_closeMatchingTurnStreams(e){for(let t of this._getMatchingTurnIds(e))this._router.closeStream(t)}_getMatchingTurnIds(e){let t=new Set,n=this._tree.getActiveTurnIds();if(e.all)for(let e of n.values())for(let n of e)t.add(n);else if(e.own){let e=n.get(this._clientId??``);if(e)for(let n of e)t.add(n)}else if(e.clientId){let r=n.get(e.clientId);if(r)for(let e of r)t.add(e)}else if(e.turnId){for(let r of n.values())if(r.has(e.turnId)){t.add(e.turnId);break}}return t}createView(){if(this._state===Z.CLOSED)throw new t.ErrorInfo(`unable to create view; transport is closed`,B.TransportClosed,400);this._logger.trace(`DefaultClientTransport.createView();`);let e=ct({tree:this._tree,channel:this._channel,codec:this._codec,sendDelegate:this._internalSend.bind(this),logger:this._logger,onClose:()=>this._views.delete(e)});return this._views.add(e),e}async _internalSend(e,n,r,i){if(this._state===Z.CLOSED||(await this._attachPromise,this._state===Z.CLOSED))throw new t.ErrorInfo(`unable to send; transport is closed`,B.TransportClosed,400);let a=this._channel.state;if(a!==`attached`&&a!==`attaching`)throw new t.ErrorInfo(`unable to send; channel is ${a}`,B.ChannelNotReady,400);this._logger.trace(`ClientTransport._internalSend();`);let o=Array.isArray(e)?e:[e],s=crypto.randomUUID();this._ownTurnIds.add(s),this._tree.trackTurn(s,this._clientId??``);let c=this._pendingLocalEvents;this._pendingLocalEvents=[],i&&i.length>0&&this._applyEventsToTree(i);let l=[...c,...i??[]],u=new Set,d=[],f=r,p;if(n?.parent===void 0&&!n?.forkOf){let e=f.at(-1);e&&(p=e.msgId)}let m=n?.parent===void 0?p:n.parent;for(let e of o){let t=crypto.randomUUID();this._ownMsgIds.add(t),u.add(t);let r=n?.parent===void 0?p:n.parent,i=q({role:`user`,turnId:s,msgId:t,turnClientId:this._clientId,parent:r,forkOf:n?.forkOf});this._upsertAndNotify(e,i),d.push({kind:`message`,message:e,msgId:t,parentId:r,forkOf:n?.forkOf,headers:i,serial:void 0}),n?.parent===void 0&&!n?.forkOf&&(p=t)}this._turnMsgIds.set(s,u);let h=this._router.createStream(s),g=this._headersFn?.()??{},_={...this._bodyFn?.()??{},history:f,...n?.body,turnId:s,clientId:this._clientId,messages:d,...n?.forkOf!==void 0&&{forkOf:n.forkOf},...m!==void 0&&{parent:m},...l.length>0&&{events:l}},v={...g,...n?.headers};return this._fetchFn(this._api,{method:`POST`,headers:{"Content-Type":`application/json`,...v},body:JSON.stringify(_),...this._credentials?{credentials:this._credentials}:{}}).then(e=>{if(!e.ok){let n=new t.ErrorInfo(`unable to send; HTTP POST to ${this._api} returned ${String(e.status)} ${e.statusText}`,B.TransportSendFailed,e.status);this._emitter.emit(`error`,n),this._router.errorStream(s,n)}}).catch(e=>{let n=e instanceof t.ErrorInfo?e:void 0,r=new t.ErrorInfo(`unable to send; HTTP POST to ${this._api} failed: ${e instanceof Error?e.message:String(e)}`,B.TransportSendFailed,500,n);this._emitter.emit(`error`,r),this._router.errorStream(s,r)}),{stream:h,turnId:s,cancel:async()=>this.cancel({turnId:s}),optimisticMsgIds:[...u]}}async cancel(e){if(this._state===Z.CLOSED)return;let t=e??{own:!0};this._logger.debug(`ClientTransport.cancel();`,{filter:t}),await this._publishCancel(t),this._closeMatchingTurnStreams(t)}stageEvents(e,t){if(this._logger.trace(`ClientTransport.stageEvents();`,{msgId:e,eventCount:t.length}),this._state===Z.CLOSED){this._logger.warn(`ClientTransport.stageEvents(); transport is closed`,{msgId:e});return}if(!this._tree.getNode(e)){this._logger.warn(`ClientTransport.stageEvents(); msgId not found in tree`,{msgId:e});return}if(t.length===0)return;let n={kind:`event`,msgId:e,events:t};this._applyEventsToTree([n]),this._pendingLocalEvents.push(n)}stageMessage(e,t){if(this._logger.trace(`ClientTransport.stageMessage();`,{msgId:e}),this._state===Z.CLOSED){this._logger.warn(`ClientTransport.stageMessage(); transport is closed`,{msgId:e});return}let n=this._tree.getNode(e);if(!n){this._logger.warn(`ClientTransport.stageMessage(); msgId not found in tree`,{msgId:e});return}this._tree.upsert(e,t,n.headers,n.serial)}_applyEventsToTree(e){for(let t of e){let e=this._tree.getNode(t.msgId);if(!e)continue;let n=t.events.map(e=>({kind:`event`,event:e,messageId:t.msgId})),r=this._codec.createAccumulator();r.initMessage(t.msgId,e.message),r.processOutputs(n);let i=r.messages.at(-1);i&&this._tree.upsert(t.msgId,i,e.headers,e.serial)}}async waitForTurn(e){if(this._state===Z.CLOSED)return;let t=e??{own:!0},n=this._getMatchingTurnIds(t);if(n.size!==0)return this._logger.debug(`ClientTransport.waitForTurn();`,{turnIds:[...n]}),new Promise(e=>{let t=!1,r=()=>{if(t)return;t=!0,i();let n=this._closeResolvers.indexOf(r);n!==-1&&this._closeResolvers.splice(n,1),e()},i=this._tree.on(`turn`,e=>{e.type===`x-ably-turn-end`&&(n.delete(e.turnId),n.size===0&&r())});this._closeResolvers.push(r)})}on(e,t){if(this._state===Z.CLOSED)return lt;let n=t;return this._emitter.on(e,n),()=>{this._emitter.off(e,n)}}async close(e){if(this._state!==Z.CLOSED){if(this._state=Z.CLOSED,this._logger.info(`ClientTransport.close();`),e?.cancel){try{await this._publishCancel(e.cancel)}catch{}this._closeMatchingTurnStreams(e.cancel)}this._channel.unsubscribe(this._onMessage),this._channel.off(this._onChannelStateChange);for(let e of this._ownTurnIds)this._router.closeStream(e);this._turnObservers.clear(),this._emitter.off();for(let e of this._views)e.close();this._views.clear();for(let e of this._closeResolvers)e();this._closeResolvers.length=0,this._ownTurnIds.clear(),this._ownMsgIds.clear(),this._turnMsgIds.clear()}}},dt=e=>new ut(e),ft=async(e,t,n,r,i,a)=>{a?.trace(`pipeStream();`);let o=e.getReader(),s,c=n?new Promise(e=>{if(n.aborted){e();return}s=()=>{e()},n.addEventListener(`abort`,s,{once:!0})}):new Promise(()=>{}),l=`complete`,u;try{for(;;){let e=await Promise.race([o.read(),c.then(()=>`aborted`)]);if(e===`aborted`){l=`cancelled`,a?.debug(`pipeStream(); stream cancelled by abort signal`),r&&await r(async e=>t.appendEvent(e)),await t.abort(`cancelled`);break}let{done:n,value:s}=e;if(n){await t.close(),a?.debug(`pipeStream(); stream completed`);break}await t.appendEvent(s,i?.(s))}}catch(e){l=`error`,u=e instanceof Error?e:Error(String(e)),a?.error(`pipeStream(); stream error`,{error:u.message});try{await t.close()}catch{}}finally{s&&n?.removeEventListener(`abort`,s),o.releaseLock()}return{reason:l,error:u}},pt=class{constructor(e,t){this._activeTurns=new Map,this._channel=e,this._logger=t?.withContext({component:`TurnManager`})}async startTurn(e,t,n,r){this._logger?.trace(`DefaultTurnManager.startTurn();`,{turnId:e,clientId:t});let i=n??new AbortController,a=t??``;this._activeTurns.set(e,{controller:i,clientId:a});let o={[m]:e,[g]:a};return r?.parent!==void 0&&(o[C]=r.parent),r?.forkOf!==void 0&&(o[w]=r.forkOf),await this._channel.publish({name:E,extras:{headers:o}}),this._logger?.debug(`DefaultTurnManager.startTurn(); turn started`,{turnId:e}),i.signal}async endTurn(e,t){this._logger?.trace(`DefaultTurnManager.endTurn();`,{turnId:e,reason:t});let n=this._activeTurns.get(e)?.clientId??``;await this._channel.publish({name:te,extras:{headers:{[m]:e,[g]:n,[ee]:t}}}),this._activeTurns.delete(e),this._logger?.debug(`DefaultTurnManager.endTurn(); turn ended`,{turnId:e,reason:t})}getSignal(e){return this._activeTurns.get(e)?.controller.signal}getClientId(e){return this._activeTurns.get(e)?.clientId}abort(e){this._logger?.debug(`DefaultTurnManager.abort();`,{turnId:e}),this._activeTurns.get(e)?.controller.abort()}getActiveTurnIds(){return[...this._activeTurns.keys()]}close(){this._logger?.trace(`DefaultTurnManager.close();`,{activeTurns:this._activeTurns.size});for(let e of this._activeTurns.values())e.controller.abort();this._activeTurns.clear()}},mt=(e,t)=>new pt(e,t),Q=function(e){return e.READY=`ready`,e.CLOSED=`closed`,e}(Q||{}),$=function(e){return e.INITIALIZED=`initialized`,e.STARTED=`started`,e.ENDED=`ended`,e}($||{}),ht=class{constructor(e){this._registeredTurns=new Map,this._state=Q.READY,this._channel=e.channel,this._codec=e.codec,this._logger=e.logger?.withContext({component:`ServerTransport`}),this._onError=e.onError,this._turnManager=mt(this._channel,this._logger),this._channelListener=e=>{this._handleChannelMessage(e)},this._attachPromise=this._channel.subscribe(T,this._channelListener).then(()=>{},e=>{let n=new t.ErrorInfo(`unable to subscribe to cancel messages; ${e instanceof Error?e.message:String(e)}`,B.TransportSubscriptionError,500,e instanceof t.ErrorInfo?e:void 0);this._logger?.error(`DefaultServerTransport(); subscribe failed`),this._onError?.(n)}),this._hasAttachedOnce=this._channel.state===`attached`,this._onChannelStateChange=e=>{this._handleChannelStateChange(e)},this._channel.on(this._onChannelStateChange),this._logger?.debug(`DefaultServerTransport(); transport created`)}newTurn(e){return this._logger?.trace(`DefaultServerTransport.newTurn();`,{turnId:e.turnId}),this._createTurn(e)}close(){if(this._state!==Q.CLOSED){this._state=Q.CLOSED,this._logger?.trace(`DefaultServerTransport.close();`),this._channel.unsubscribe(T,this._channelListener),this._channel.off(this._onChannelStateChange);for(let e of this._registeredTurns.values())e.controller.abort();this._registeredTurns.clear(),this._turnManager.close(),this._logger?.debug(`DefaultServerTransport.close(); transport closed`)}}_resolveFilter(e,t){let n=[...this._registeredTurns.keys()];return e.all?n:e.own&&t?n.filter(e=>this._registeredTurns.get(e)?.clientId===t):e.clientId?n.filter(t=>this._registeredTurns.get(t)?.clientId===e.clientId):e.turnId&&this._registeredTurns.has(e.turnId)?[e.turnId]:[]}async _handleCancelMessage(e){let n=O(e),r={};n[`x-ably-cancel-turn-id`]?r.turnId=n[y]:n[`x-ably-cancel-own`]===`true`?r.own=!0:n[`x-ably-cancel-client-id`]?r.clientId=n[S]:n[`x-ably-cancel-all`]===`true`&&(r.all=!0);let i=this._resolveFilter(r,e.clientId);if(i.length===0)return;this._logger?.debug(`DefaultServerTransport._handleCancelMessage(); matched turns`,{matchedTurnIds:i,filter:r});let a=new Map;for(let e of i){let t=this._registeredTurns.get(e);a.set(e,t?.clientId??``)}let o={message:e,filter:r,matchedTurnIds:i,turnOwners:a};for(let e of i){let n=this._registeredTurns.get(e);if(n)try{if(n.onCancel&&!await n.onCancel(o)){this._logger?.debug(`DefaultServerTransport._handleCancelMessage(); cancel rejected by onCancel`,{turnId:e});continue}n.controller.abort(),this._logger?.debug(`DefaultServerTransport._handleCancelMessage(); turn aborted`,{turnId:e})}catch(r){let i=new t.ErrorInfo(`unable to process cancel for turn ${e}; onCancel handler threw: ${r instanceof Error?r.message:String(r)}`,B.CancelListenerError,500,r instanceof t.ErrorInfo?r:void 0);this._logger?.error(`DefaultServerTransport._handleCancelMessage(); onCancel threw`,{turnId:e}),(n.onError??this._onError)?.(i)}}}_handleChannelStateChange(e){if(this._state===Q.CLOSED)return;let{current:n,resumed:r}=e;if(n===`attached`&&!this._hasAttachedOnce){this._hasAttachedOnce=!0;return}if(!(n===`failed`||n===`suspended`||n===`detached`||n===`attached`&&!r))return;this._logger?.error(`DefaultServerTransport._handleChannelStateChange(); channel continuity lost`,{current:n,resumed:r,previous:e.previous});let i=new t.ErrorInfo(`unable to deliver cancel messages; channel continuity lost (${n}${n===`attached`?`, resumed: false`:``})`,B.ChannelContinuityLost,500,e.reason);this._onError?.(i)}_handleChannelMessage(e){try{e.name===`x-ably-cancel`&&this._handleCancelMessage(e).catch(e=>{let n=new t.ErrorInfo(`unable to route cancel message; ${e instanceof Error?e.message:String(e)}`,B.CancelListenerError,500,e instanceof t.ErrorInfo?e:void 0);this._logger?.error(`DefaultServerTransport._handleChannelMessage(); cancel routing error`),this._onError?.(n)})}catch(e){let n=new t.ErrorInfo(`unable to process channel message; ${e instanceof Error?e.message:String(e)}`,B.TransportSubscriptionError,500,e instanceof t.ErrorInfo?e:void 0);this._logger?.error(`DefaultServerTransport._handleChannelMessage(); subscription error`),this._onError?.(n)}}_createTurn(e){let{turnId:n,clientId:r,onMessage:i,onAbort:a,onCancel:o,onError:s,parent:c,forkOf:l,signal:u}=e,d=new AbortController,f=$.INITIALIZED,p=u?AbortSignal.any([d.signal,u]):d.signal,m={turnId:n,clientId:r??``,controller:d,signal:p,onCancel:o,onError:s};this._registeredTurns.set(n,m);let h=this._logger,g=this._turnManager,_=this._attachPromise,v=this._codec,y=this._channel,b=this._registeredTurns;return{get turnId(){return n},get abortSignal(){return p},start:async()=>{if(h?.trace(`Turn.start();`,{turnId:n}),p.aborted)throw new t.ErrorInfo(`unable to start turn; turn ${n} was cancelled before start()`,B.InvalidArgument,400);if(f===$.INITIALIZED){f=$.STARTED;try{await g.startTurn(n,r,d,{parent:c,forkOf:l})}catch(e){let r=new t.ErrorInfo(`unable to publish turn-start for turn ${n}; ${e instanceof Error?e.message:String(e)}`,B.TurnLifecycleError,500,e instanceof t.ErrorInfo?e:void 0);throw h?.error(`Turn.start(); failed to publish turn-start`,{turnId:n}),r}h?.debug(`Turn.start(); turn started`,{turnId:n})}},addMessages:async(e,r)=>{if(h?.trace(`Turn.addMessages();`,{turnId:n,count:e.length}),f===$.INITIALIZED)throw new t.ErrorInfo(`unable to add messages; start() must be called before addMessages() (turn ${n})`,B.InvalidArgument,400);await _;let a=[];try{for(let t of e){let e=k(q({role:`user`,turnId:n,msgId:t.msgId,turnClientId:r?.clientId,parent:t.parentId??c,forkOf:t.forkOf??l}),t.headers);await v.createEncoder(y,{extras:{headers:e},onMessage:i}).writeMessages([t.message],r?.clientId?{clientId:r.clientId}:void 0),a.push(t.msgId)}}catch(e){let r=new t.ErrorInfo(`unable to publish messages for turn ${n}; ${e instanceof Error?e.message:String(e)}`,B.TurnLifecycleError,500,e instanceof t.ErrorInfo?e:void 0);throw h?.error(`Turn.addMessages(); publish failed`,{turnId:n}),r}return h?.debug(`Turn.addMessages(); messages published`,{turnId:n,count:e.length}),{msgIds:a}},addEvents:async e=>{if(h?.trace(`Turn.addEvents();`,{turnId:n,count:e.length}),f===$.INITIALIZED)throw new t.ErrorInfo(`unable to add events; start() must be called before addEvents() (turn ${n})`,B.InvalidArgument,400);await _;let r=g.getClientId(n);try{for(let t of e){let e=q({role:`assistant`,turnId:n,msgId:t.msgId,turnClientId:r,amend:t.msgId}),a=v.createEncoder(y,{extras:{headers:e},onMessage:i});for(let e of t.events)await a.writeEvent(e);await a.close()}}catch(e){let r=new t.ErrorInfo(`unable to publish events for turn ${n}; ${e instanceof Error?e.message:String(e)}`,B.TurnLifecycleError,500,e instanceof t.ErrorInfo?e:void 0);throw h?.error(`Turn.addEvents(); publish failed`,{turnId:n}),r}h?.debug(`Turn.addEvents(); events published`,{turnId:n,count:e.length})},streamResponse:async(e,r)=>{if(h?.trace(`Turn.streamResponse();`,{turnId:n}),f===$.INITIALIZED)throw new t.ErrorInfo(`unable to stream response; start() must be called before streamResponse() (turn ${n})`,B.InvalidArgument,400);await _;let o=g.getClientId(n),u=r?.parent===void 0?c:r.parent,d=crypto.randomUUID(),m=q({role:`assistant`,turnId:n,msgId:d,turnClientId:o,parent:u,forkOf:r?.forkOf??l}),b=await ft(e,v.createEncoder(y,{extras:{headers:m},onMessage:i,messageId:d}),p,a,r?.resolveWriteOptions,h);if(b.error){let e=new t.ErrorInfo(`unable to stream response for turn ${n}; ${b.error.message}`,B.StreamError,500,b.error instanceof t.ErrorInfo?b.error:void 0);h?.error(`Turn.streamResponse(); stream error`,{turnId:n}),s?.(e)}return h?.debug(`Turn.streamResponse(); stream finished`,{turnId:n,reason:b.reason}),b},end:async e=>{if(h?.trace(`Turn.end();`,{turnId:n,reason:e}),f===$.INITIALIZED)throw new t.ErrorInfo(`unable to end turn; start() must be called before end() (turn ${n})`,B.InvalidArgument,400);if(f!==$.ENDED){f=$.ENDED;try{await g.endTurn(n,e)}catch(e){let r=new t.ErrorInfo(`unable to publish turn-end for turn ${n}; ${e instanceof Error?e.message:String(e)}`,B.TurnLifecycleError,500,e instanceof t.ErrorInfo?e:void 0);throw h?.error(`Turn.end(); failed to publish turn-end`,{turnId:n}),r}finally{b.delete(n)}h?.debug(`Turn.end(); turn ended`,{turnId:n,reason:e})}}}}},gt=e=>new ht(e),_t=e=>dt({...e,codec:H,api:e.api??`/api/chat`}),vt=e=>gt({...e,codec:H}),yt=(e,t)=>{if(e.length===0)return t;let n=new Map(e.map(e=>[e.msgId,e]));return t.map(e=>{let t=n.get(e.msgId);if(!t)return e;let r=F();r.initMessage(e.msgId,e.message),r.processOutputs(t.events.map(t=>({kind:`event`,event:t,messageId:e.msgId})));let i=r.messages.at(-1);return i?{...e,message:i}:e})},bt=(e,t,n,r)=>j({...N(e),state:`approval-responded`,input:e.input,approval:j({id:t,approved:n,reason:r})}),xt=(e,t)=>({...N(e),state:`output-denied`,input:e.input,approval:{id:t,approved:!1}}),St=(e,t)=>{if(t.length===0)return e;let n=new Map(t.map(e=>[e.toolCallId,e]));return e.map(e=>{let t;for(let[r,i]of e.parts.entries()){if(i.type!==`dynamic-tool`)continue;let a=n.get(i.toolCallId);if(!a)continue;let o=i.approval?.id??crypto.randomUUID(),s=a.approved?bt(i,o,!0,a.reason):xt(i,o);t??=[...e.parts],t[r]=s}return t?{...e,parts:t}:e})},Ct=(e,t)=>{let n=new Set(t.filter(e=>e.approved).map(e=>e.toolCallId));if(n.size===0)return new Set;let r=new Set;for(let t of e)for(let e of t.parts)e.type===`dynamic-tool`&&n.has(e.toolCallId)&&r.add(e.toolName);return r},wt=(e,t)=>{if(t.size===0)return e;let n=Object.entries(e).map(([e,n])=>t.has(e)?[e,{...n,needsApproval:!1}]:[e,n]);return Object.fromEntries(n)};e.UIMessageCodec=H,e.applyToolApprovalsToHistory=St,e.applyToolEventsToHistory=yt,e.createChatTransport=Je,e.createClientTransport=_t,e.createServerTransport=vt,e.extractApprovalDecisionsFromHistory=e=>{let t=[];for(let n of e)for(let e of n.message.parts)e.type===`dynamic-tool`&&(e.state===`approval-responded`?t.push({toolCallId:e.toolCallId,approved:!0,targetMsgId:n.msgId,...e.approval.reason===void 0?{}:{reason:e.approval.reason}}):e.state===`output-denied`&&t.push({toolCallId:e.toolCallId,approved:!1,targetMsgId:n.msgId}));return t},e.prepareApprovalTurn=async e=>{let{messages:t,decisions:r,tools:i}=e;if(!r||r.length===0)return{modelMessages:await(0,n.convertToModelMessages)(t),tools:i};let a=await(0,n.convertToModelMessages)(St(t,r));return{modelMessages:a.at(-1)?.role===`user`?a.slice(0,-1):a,tools:wt(i,Ct(t,r))}},e.streamResponseWithApprovalRedirect=(e,t,n)=>{let{decisions:r,...i}=n,a=new Map;for(let e of r??[])e.approved&&a.set(e.toolCallId,e.targetMsgId);if(a.size===0)return e.streamResponse(t,i);let o=e=>(e.type===`tool-output-available`||e.type===`tool-output-error`)&&a.has(e.toolCallId),s=[],c=t.pipeThrough(new TransformStream({transform:(e,t)=>{if(o(e)){s.push(e);return}t.enqueue(e)},flush:t=>{if(!e.abortSignal.aborted)for(let e of s)t.enqueue(e)}}));return e.streamResponse(c,{...i,resolveWriteOptions:e=>{if(!o(e))return;let t=a.get(e.toolCallId);if(t!==void 0)return{messageId:t,extras:{headers:{[v]:t}}}}})}});
|
|
2
2
|
//# sourceMappingURL=ably-ai-transport-vercel.umd.cjs.map
|