@ably/ai-transport 0.0.1

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.
Files changed (118) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +426 -0
  3. package/dist/ably-ai-transport.js +1388 -0
  4. package/dist/ably-ai-transport.js.map +1 -0
  5. package/dist/ably-ai-transport.umd.cjs +2 -0
  6. package/dist/ably-ai-transport.umd.cjs.map +1 -0
  7. package/dist/constants.d.ts +50 -0
  8. package/dist/core/codec/decoder.d.ts +62 -0
  9. package/dist/core/codec/encoder.d.ts +56 -0
  10. package/dist/core/codec/index.d.ts +8 -0
  11. package/dist/core/codec/lifecycle-tracker.d.ts +74 -0
  12. package/dist/core/codec/types.d.ts +188 -0
  13. package/dist/core/transport/client-transport.d.ts +10 -0
  14. package/dist/core/transport/conversation-tree.d.ts +9 -0
  15. package/dist/core/transport/decode-history.d.ts +41 -0
  16. package/dist/core/transport/headers.d.ts +26 -0
  17. package/dist/core/transport/index.d.ts +4 -0
  18. package/dist/core/transport/pipe-stream.d.ts +16 -0
  19. package/dist/core/transport/server-transport.d.ts +7 -0
  20. package/dist/core/transport/stream-router.d.ts +19 -0
  21. package/dist/core/transport/turn-manager.d.ts +34 -0
  22. package/dist/core/transport/types.d.ts +407 -0
  23. package/dist/errors.d.ts +46 -0
  24. package/dist/event-emitter.d.ts +65 -0
  25. package/dist/index.d.ts +11 -0
  26. package/dist/logger.d.ts +103 -0
  27. package/dist/react/ably-ai-transport-react.js +823 -0
  28. package/dist/react/ably-ai-transport-react.js.map +1 -0
  29. package/dist/react/ably-ai-transport-react.umd.cjs +2 -0
  30. package/dist/react/ably-ai-transport-react.umd.cjs.map +1 -0
  31. package/dist/react/index.d.ts +11 -0
  32. package/dist/react/use-ably-messages.d.ts +18 -0
  33. package/dist/react/use-active-turns.d.ts +8 -0
  34. package/dist/react/use-client-transport.d.ts +7 -0
  35. package/dist/react/use-conversation-tree.d.ts +20 -0
  36. package/dist/react/use-edit.d.ts +7 -0
  37. package/dist/react/use-history.d.ts +19 -0
  38. package/dist/react/use-messages.d.ts +7 -0
  39. package/dist/react/use-regenerate.d.ts +7 -0
  40. package/dist/react/use-send.d.ts +7 -0
  41. package/dist/utils.d.ts +127 -0
  42. package/dist/vercel/ably-ai-transport-vercel.js +2331 -0
  43. package/dist/vercel/ably-ai-transport-vercel.js.map +1 -0
  44. package/dist/vercel/ably-ai-transport-vercel.umd.cjs +2 -0
  45. package/dist/vercel/ably-ai-transport-vercel.umd.cjs.map +1 -0
  46. package/dist/vercel/codec/accumulator.d.ts +21 -0
  47. package/dist/vercel/codec/decoder.d.ts +22 -0
  48. package/dist/vercel/codec/encoder.d.ts +41 -0
  49. package/dist/vercel/codec/index.d.ts +22 -0
  50. package/dist/vercel/index.d.ts +3 -0
  51. package/dist/vercel/react/ably-ai-transport-vercel-react.js +2082 -0
  52. package/dist/vercel/react/ably-ai-transport-vercel-react.js.map +1 -0
  53. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs +2 -0
  54. package/dist/vercel/react/ably-ai-transport-vercel-react.umd.cjs.map +1 -0
  55. package/dist/vercel/react/index.d.ts +3 -0
  56. package/dist/vercel/react/use-chat-transport.d.ts +29 -0
  57. package/dist/vercel/react/use-message-sync.d.ts +19 -0
  58. package/dist/vercel/transport/chat-transport.d.ts +118 -0
  59. package/dist/vercel/transport/index.d.ts +36 -0
  60. package/package.json +123 -0
  61. package/react/README.md +3 -0
  62. package/react/index.d.ts +1 -0
  63. package/react/index.js +1 -0
  64. package/react/index.umd.cjs +1 -0
  65. package/src/constants.ts +98 -0
  66. package/src/core/codec/decoder.ts +402 -0
  67. package/src/core/codec/encoder.ts +470 -0
  68. package/src/core/codec/index.ts +28 -0
  69. package/src/core/codec/lifecycle-tracker.ts +140 -0
  70. package/src/core/codec/types.ts +249 -0
  71. package/src/core/transport/client-transport.ts +959 -0
  72. package/src/core/transport/conversation-tree.ts +434 -0
  73. package/src/core/transport/decode-history.ts +337 -0
  74. package/src/core/transport/headers.ts +46 -0
  75. package/src/core/transport/index.ts +34 -0
  76. package/src/core/transport/pipe-stream.ts +95 -0
  77. package/src/core/transport/server-transport.ts +458 -0
  78. package/src/core/transport/stream-router.ts +118 -0
  79. package/src/core/transport/turn-manager.ts +147 -0
  80. package/src/core/transport/types.ts +533 -0
  81. package/src/errors.ts +58 -0
  82. package/src/event-emitter.ts +103 -0
  83. package/src/index.ts +89 -0
  84. package/src/logger.ts +241 -0
  85. package/src/react/index.ts +11 -0
  86. package/src/react/use-ably-messages.ts +37 -0
  87. package/src/react/use-active-turns.ts +61 -0
  88. package/src/react/use-client-transport.ts +37 -0
  89. package/src/react/use-conversation-tree.ts +71 -0
  90. package/src/react/use-edit.ts +24 -0
  91. package/src/react/use-history.ts +111 -0
  92. package/src/react/use-messages.ts +32 -0
  93. package/src/react/use-regenerate.ts +24 -0
  94. package/src/react/use-send.ts +25 -0
  95. package/src/react/vite.config.ts +32 -0
  96. package/src/tsconfig.json +25 -0
  97. package/src/utils.ts +230 -0
  98. package/src/vercel/codec/accumulator.ts +603 -0
  99. package/src/vercel/codec/decoder.ts +615 -0
  100. package/src/vercel/codec/encoder.ts +396 -0
  101. package/src/vercel/codec/index.ts +37 -0
  102. package/src/vercel/index.ts +12 -0
  103. package/src/vercel/react/index.ts +4 -0
  104. package/src/vercel/react/use-chat-transport.ts +60 -0
  105. package/src/vercel/react/use-message-sync.ts +34 -0
  106. package/src/vercel/react/vite.config.ts +33 -0
  107. package/src/vercel/transport/chat-transport.ts +278 -0
  108. package/src/vercel/transport/index.ts +56 -0
  109. package/src/vercel/vite.config.ts +33 -0
  110. package/src/vite.config.ts +31 -0
  111. package/vercel/README.md +3 -0
  112. package/vercel/index.d.ts +1 -0
  113. package/vercel/index.js +1 -0
  114. package/vercel/index.umd.cjs +1 -0
  115. package/vercel/react/README.md +3 -0
  116. package/vercel/react/index.d.ts +1 -0
  117. package/vercel/react/index.js +1 -0
  118. package/vercel/react/index.umd.cjs +1 -0
@@ -0,0 +1,2 @@
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`ably`),require(`ai`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`ably`,`ai`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.AblyAiTransportVercelReact={},e.React,e.Ably,e.AI))})(this,function(e,t,n,r){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var i=Object.create,a=Object.defineProperty,o=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,c=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty,u=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=s(t),c=0,u=i.length,d;c<u;c++)d=i[c],!l.call(e,d)&&d!==n&&a(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=o(t,d))||r.enumerable});return e};n=((e,t,n)=>(n=e==null?{}:i(c(e)),u(t||!e||!e.__esModule?a(n,`default`,{value:e,enumerable:!0}):n,e)))(n);var d=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}({}),f=(e,t)=>e.code===t,p=(e,t)=>({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 n.ErrorInfo(`unable to send messages; messages array is empty for submit-message trigger`,d.InvalidArgument,400);c=[i.at(-1)],l=i.slice(0,-1)}let u,f;if(o===`regenerate-message`&&s){u=s;let t=e.getTree().getNodeByKey(s);t&&(u=t.msgId,f=t.parentId)}let p,m;if(t?.prepareSendMessagesRequest){let e=t.prepareSendMessagesRequest({id:r.chatId,trigger:o,messageId:s,history:l,messages:c,forkOf:u,parent:f});p=e.body??{},m=e.headers}else p={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},...f!==void 0&&{parent:f}},m=void 0;let h={body:p,headers:m};u!==void 0&&(h.forkOf=u),f!==void 0&&(h.parent=f);let g=await e.send(c,h);a&&a.addEventListener(`abort`,()=>void e.cancel({all:!0}),{once:!0});let{readable:_,writable:v}=new TransformStream,y=v.getWriter();return g.stream.pipeTo(new WritableStream({close:()=>{y.close().catch(()=>{})},abort:()=>{y.close().catch(()=>{})}})).catch(()=>{y.close().catch(()=>{})}),_},reconnectToStream:()=>Promise.resolve(null),close:async t=>e.close(t)}),m=`x-ably-stream`,h=`x-ably-status`,g=`x-ably-stream-id`,_=`x-ably-turn-id`,v=`x-ably-msg-id`,y=`x-ably-turn-client-id`,b=`x-ably-role`,ee=`x-ably-cancel-turn-id`,x=`x-ably-cancel-own`,te=`x-ably-cancel-all`,ne=`x-ably-cancel-client-id`,S=`x-ably-parent`,re=`x-ably-fork-of`,C=`x-ably-cancel`,w=`x-ably-turn-start`,T=`x-ably-turn-end`,E=`x-domain-`,D=e=>({logAction:(t,n,r)=>{e.error(n,{detail:r})},shouldLog:()=>!0}),O=n.Realtime.EventEmitter,k=class extends O{constructor(e){super(D(e))}},A=function(e){return e.Trace=`trace`,e.Debug=`debug`,e.Info=`info`,e.Warn=`warn`,e.Error=`error`,e.Silent=`silent`,e}({}),ie=(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 A.Trace:case A.Debug:console.log(i);break;case A.Info:console.info(i);break;case A.Warn:console.warn(i);break;case A.Error:console.error(i);break;case A.Silent:break}},ae=e=>new oe(e.logHandler??ie,e.logLevel),j=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}(j||{}),M=new Map([[A.Trace,j.Trace],[A.Debug,j.Debug],[A.Info,j.Info],[A.Warn,j.Warn],[A.Error,j.Error],[A.Silent,j.Silent]]),oe=class e{constructor(e,t,r){this._handler=e,this._context=r;let i=M.get(t);if(i===void 0)throw new n.ErrorInfo(`unable to create logger; invalid log level: ${t}`,d.InvalidArgument,400);this._levelNumber=i}trace(e,t){this._write(e,A.Trace,j.Trace,t)}debug(e,t){this._write(e,A.Debug,j.Debug,t)}info(e,t){this._write(e,A.Info,j.Info,t)}warn(e,t){this._write(e,A.Warn,j.Warn,t)}error(e,t){this._write(e,A.Error,j.Error,t)}withContext(t){let n=[...M.entries()].find(([,e])=>e===this._levelNumber)?.[0]??A.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}},N=e=>{let t=e.extras;if(!t||typeof t!=`object`)return{};let n=t.headers;return!n||typeof n!=`object`?{}:n},se=e=>{if(e!==void 0)try{return JSON.parse(e)}catch{return}},P=(e,t)=>({...e,...t}),F=e=>{if(e!==void 0)return e===`true`},I=(e,t)=>e[E+t],L=e=>{let t={};for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==void 0&&(t[n]=e[n]);return t},R=e=>({str:t=>I(e,t),strOr:(t,n)=>I(e,t)??n,bool:t=>F(I(e,t)),json:t=>se(I(e,t))}),z=()=>{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},B=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)}},V=(e,t)=>new B(e,t),H=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=N(c),u=l[_],d=l[v],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[v];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()},U=async(e,t,n)=>{e.rawMessages.push(...t.items),e.lastAblyPage=t;let r=H(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=H(e).length}},W=(e,t)=>{let n=H(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 W(e,t);if(!o||!e.lastAblyPage)return;let n=await e.lastAblyPage.next();if(n)return await U(e,n,t),W(e,t)}}},G=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 U(a,await e.history({untilAttach:!0,limit:o}),i),W(a,i)},K=e=>{let t={[b]:e.role,[_]:e.turnId,[v]:e.msgId};return e.turnClientId!==void 0&&(t[y]=e.turnClientId),e.parent&&(t[S]=e.parent),e.forkOf&&(t[re]=e.forkOf),t},ce=class{constructor(e,t){this._turns=new Map,this._isTerminal=e,this._logger=t}createStream(e){this._logger.trace(`StreamRouter.createStream();`,{turnId:e});let t={},r=new ReadableStream({start(e){t.controller=e}});if(!t.controller)throw new n.ErrorInfo(`unable to create stream; ReadableStream start() was not called synchronously`,d.TransportSubscriptionError,500);return this._turns.set(e,{controller:t.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)}},le=(e,t)=>new ce(e,t),ue=()=>{},de=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??ae({logLevel:A.Silent})).withContext({component:`ClientTransport`}),this._emitter=new k(this._logger),this._tree=V(this._codec.getMessageKey.bind(this._codec),this._logger),this._router=le(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[S]=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=N(e),n=t[_],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=N(e),n=t[_],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=N(e),r=e.serial,i=n[_];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 t=e instanceof n.ErrorInfo?e:void 0;this._emitter.emit(`error`,new n.ErrorInfo(`unable to process channel message; ${e instanceof Error?e.message:String(e)}`,d.TransportSubscriptionError,500,t))}}}_handleMessageOutput(e,t,n,r){let i=t[v];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[_];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[ee]=e.turnId:e.own?t[x]=`true`:e.clientId?t[ne]=e.clientId:e.all&&(t[te]=`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?.[v]===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,t){if(this._closed||(await this._attachPromise,this._closed))throw new n.ErrorInfo(`unable to send; transport is closed`,d.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(t?.parent===void 0&&!t?.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=t?.parent===void 0?c:t.parent;for(let e of r){let n=crypto.randomUUID();this._ownMsgIds.add(n),a.add(n);let r=t?.parent===void 0?c:t.parent??void 0,s=K({role:`user`,turnId:i,msgId:n,turnClientId:this._clientId,parent:r,forkOf:t?.forkOf});this._upsertAndNotify(e,s);let l={[v]:n,[b]:`user`};r&&(l[S]=r),o.push({message:e,headers:l}),t?.parent===void 0&&!t?.forkOf&&(c=n)}this._turnMsgIds.set(i,a);let u=this._router.createStream(i),f=this._headersFn?.()??{},p={...this._bodyFn?.()??{},history:s,...t?.body,turnId:i,clientId:this._clientId,messages:o,...t?.forkOf!==void 0&&{forkOf:t.forkOf},...l!==void 0&&{parent:l}},m={...f,...t?.headers};return this._fetchFn(this._api,{method:`POST`,headers:{"Content-Type":`application/json`,...m},body:JSON.stringify(p),...this._credentials?{credentials:this._credentials}:{}}).then(e=>{e.ok||(this._emitter.emit(`error`,new n.ErrorInfo(`unable to send; HTTP POST to ${this._api} returned ${String(e.status)} ${e.statusText}`,d.TransportSendFailed,e.status)),this._router.closeStream(i))}).catch(e=>{let t=e instanceof n.ErrorInfo?e:void 0;this._emitter.emit(`error`,new n.ErrorInfo(`unable to send; HTTP POST to ${this._api} failed: ${e instanceof Error?e.message:String(e)}`,d.TransportSendFailed,500,t)),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 ue;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 n.ErrorInfo(`unable to load history; transport is closed`,d.TransportClosed,400);this._logger.trace(`ClientTransport.history();`,{limit:e?.limit});let t=e?.limit??100,r=new Set(this._tree.flatten().map(e=>this._codec.getMessageKey(e))),i=await G(this._channel,this._codec,e,this._logger),a=await this._loadUntilVisible(i,t,r);i=a.lastPage;let o=a.newVisible;for(let e of o)this._withheldKeys.add(this._codec.getMessageKey(e));let s=o.slice(-t),c=o.slice(0,-t);this._releaseWithheld(s);let l=e=>({items:e,hasNext:()=>c.length>0||i.hasNext(),next:async()=>{if(c.length>0){let e=c.splice(-t,t);return this._releaseWithheld(e),l(e)}if(!i.hasNext())return;let e=await i.next();if(!e)return;let n=new Set(r);for(let e of this._tree.flatten())n.add(this._codec.getMessageKey(e));let a=await this._loadUntilVisible(e,t,n);i=a.lastPage;let o=a.newVisible;for(let e of o)this._withheldKeys.add(this._codec.getMessageKey(e));let s=o.splice(-t,t);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}}},fe=e=>new de(e),q=e=>L({type:`dynamic-tool`,toolCallId:e.toolCallId,toolName:e.toolName,title:e.title,providerExecuted:e.providerExecuted}),J=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}},pe=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 J(`text`),reasoningStreams:new J(`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=L({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({...q(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]={...q(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]={...q(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]={...q(r.part),state:`output-error`,input:e.input,errorText:e.errorText};else{let t=n.message.parts.length;n.message.parts.push({...q(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]=L({...q(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]={...q(r.part),state:`output-error`,input:r.part.input,errorText:e.errorText};break;case`tool-output-denied`:n.message.parts[r.tracker.partIndex]={...q(r.part),state:`output-denied`,input:r.part.input,approval:{id:``,approved:!1}};break;case`tool-approval-request`:n.message.parts[r.tracker.partIndex]={...q(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(L({type:`source-url`,sourceId:e.sourceId,url:e.url,title:e.title}));break;case`source-document`:n.message.parts.push(L({type:`source-document`,sourceId:e.sourceId,mediaType:e.mediaType,title:e.title,filename:e.filename}));break}}},me=()=>new pe,he=e=>[{kind:`event`,event:e}],ge=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=N(e)[v];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:N(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=N(e),i=typeof e.data==`string`?e.data:``,a=r[h],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[m]===`true`,a=r[h],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}),[]}},_e=(e,t={})=>new ge(e,t),ve=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}},ye=e=>new ve(e),Y=e=>{let t=R(e);return{...t,providerMetadata:()=>t.json(`providerMetadata`)}},X=e=>he(e),be=(e,t)=>e===`stop`||e===`length`||e===`content-filter`||e===`tool-calls`||e===`error`||e===`other`?e:t,Z=e=>e.startsWith(`data-`),xe=e=>{if(e)try{return JSON.parse(e)}catch{return e}},Se=e=>{let t=Y(e.headers);switch(e.name){case`text`:return L({type:`text-start`,id:e.streamId,providerMetadata:t.providerMetadata()});case`reasoning`:return L({type:`reasoning-start`,id:e.streamId,providerMetadata:t.providerMetadata()});case`tool-input`:return L({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}}},Ce=(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}}},we=(e,t)=>{let n=Y(t);switch(e.name){case`text`:return L({type:`text-end`,id:e.streamId,providerMetadata:n.providerMetadata()});case`reasoning`:return L({type:`reasoning-end`,id:e.streamId,providerMetadata:n.providerMetadata()});case`tool-input`:return L({type:`tool-input-available`,toolCallId:e.streamId,toolName:n.strOr(`toolName`,Y(e.headers).strOr(`toolName`,``)),input:xe(e.accumulated),providerMetadata:n.providerMetadata()});default:return{type:`text-end`,id:e.streamId}}},Te=()=>ye([{key:`start`,build:e=>[L({type:`start`,messageId:e.messageId})]},{key:`start-step`,build:()=>[{type:`start-step`}]}]),Q=(e,t,n)=>e.ensurePhases(t,n).map(e=>({kind:`event`,event:e})),Ee=(e,t,n)=>(n.markEmitted(t,`start`),X(L({type:`start`,messageId:e.str(`messageId`),messageMetadata:e.json(`messageMetadata`)}))),De=(e,t)=>(t.markEmitted(e,`start-step`),X({type:`start-step`})),Oe=(e,t)=>(t.resetPhase(e,`start-step`),X({type:`finish-step`})),ke=(e,t,n)=>(n.clearScope(t),X(L({type:`finish`,finishReason:be(e.str(`finishReason`),`stop`),messageMetadata:e.json(`messageMetadata`)}))),Ae=e=>X({type:`error`,errorText:typeof e==`string`?e:``}),je=(e,t,n)=>(n.clearScope(t),X(L({type:`abort`,reason:typeof e==`string`&&e?e:void 0}))),Me=e=>X({type:`message-metadata`,messageMetadata:e.json(`messageMetadata`)}),Ne=(e,t)=>X(L({type:`file`,url:typeof t==`string`?t:``,mediaType:e.strOr(`mediaType`,``),providerMetadata:e.providerMetadata()})),Pe=(e,t)=>X(L({type:`source-url`,sourceId:e.strOr(`sourceId`,``),url:typeof t==`string`?t:``,title:e.str(`title`),providerMetadata:e.providerMetadata()})),Fe=e=>X(L({type:`source-document`,sourceId:e.strOr(`sourceId`,``),mediaType:e.strOr(`mediaType`,``),title:e.strOr(`title`,``),filename:e.str(`filename`),providerMetadata:e.providerMetadata()})),Ie=(e,t)=>{let n=t;return X(L({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()}))},Le=(e,t)=>{let n=t;return X(L({type:`tool-output-available`,toolCallId:e.strOr(`toolCallId`,``),output:n?.output,dynamic:e.bool(`dynamic`),providerExecuted:e.bool(`providerExecuted`),preliminary:e.bool(`preliminary`)}))},Re=(e,t)=>{let n=t;return X(L({type:`tool-output-error`,toolCallId:e.strOr(`toolCallId`,``),errorText:n?.errorText??``,dynamic:e.bool(`dynamic`),providerExecuted:e.bool(`providerExecuted`)}))},ze=e=>X({type:`tool-approval-request`,toolCallId:e.strOr(`toolCallId`,``),approvalId:e.strOr(`approvalId`,``)}),Be=e=>X({type:`tool-output-denied`,toolCallId:e.strOr(`toolCallId`,``)}),Ve=(e,t,n)=>X(L({type:e,data:n,id:t.str(`id`),transient:t.bool(`transient`)})),$=(e,t,n,r)=>{let i=Q(r,n,{messageId:e.str(`messageId`)});return i.push({kind:`event`,event:L({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:L({type:`tool-input-available`,toolCallId:e.strOr(`toolCallId`,``),toolName:e.strOr(`toolName`,``),input:t,providerMetadata:e.providerMetadata()})}),i},He=e=>{let t=e.headers??{},n=Y(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:Z(e.name)&&(a=L({type:e.name,id:n.str(`id`),data:e.data}));break}return a?[{kind:`message`,message:{id:i,role:r,parts:[a]}}]:[]},Ue=(e,t)=>(e===`text`||e===`file`||Z(e))&&`x-ably-role`in t,We=(e,t)=>{let n=e.headers??{},r=Y(n),i=n[`x-ably-turn-id`]??``;if(Ue(e.name,n))return He(e);if(e.name===`tool-input`)return $(r,e.data,i,t);switch(e.name){case`start`:return Ee(r,i,t);case`start-step`:return De(i,t);case`finish-step`:return Oe(i,t);case`finish`:return ke(r,i,t);case`error`:return Ae(e.data);case`abort`:return je(e.data,i,t);case`message-metadata`:return Me(r);case`file`:return Ne(r,e.data);case`source-url`:return Pe(r,e.data);case`source-document`:return Fe(r);case`tool-input-error`:return Ie(r,e.data);case`tool-output-available`:return Le(r,e.data);case`tool-output-error`:return Re(r,e.data);case`tool-approval-request`:return ze(r);case`tool-output-denied`:return Be(r);default:return Z(e.name)?Ve(e.name,r,e.data):[]}},Ge=e=>({buildStartEvents:t=>{let n=Q(e,t.headers[`x-ably-turn-id`]??``,{messageId:Y(t.headers).str(`messageId`)});return n.push({kind:`event`,event:Se(t)}),n},buildDeltaEvents:(e,t)=>X(Ce(e,t)),buildEndEvents:(e,t)=>X(we(e,t)),decodeDiscrete:t=>We(t,e)}),Ke=class{constructor(e={}){this._core=_e(Ge(Te()),e)}decode(e){return this._core.decode(e)}},qe=(e={})=>new Ke(e),Je=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,t,r){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.startStream();`,{name:t.name,streamId:e});let i=this._buildHeaders(t.headers??{},r);i[m]=`true`,i[h]=`streaming`,i[g]=e;let a=this._resolveClientId(r),o={name:t.name,data:t.data,extras:{headers:i},...a?{clientId:a}:{}};this._invokeOnMessage(o);let s=(await this._writer.publish(o)).serials[0];if(!s)throw new n.ErrorInfo(`unable to start stream; no serial returned for stream '${t.name}' (streamId: ${e})`,d.BadRequest,400);this._trackers.set(e,{serial:s,name:t.name,streamId:e,accumulated:t.data,persistentHeaders:i,aborted:!1}),this._logger?.debug(`DefaultEncoderCore.startStream(); stream started`,{name:t.name,streamId:e,serial:s})}appendStream(e,t){this._assertNotClosed();let r=this._trackers.get(e);if(!r)throw new n.ErrorInfo(`unable to append to stream; no active stream for streamId '${e}'`,d.InvalidArgument,400);r.accumulated+=t;let i={serial:r.serial,data:t,extras:{headers:{...r.persistentHeaders}}};this._invokeOnMessage(i);let a=this._writer.appendMessage(i);this._pending.push({promise:a,streamId:e})}async closeStream(e,t){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.closeStream();`,{streamId:e});let r=this._trackers.get(e);if(!r)throw new n.ErrorInfo(`unable to close stream; no active stream for streamId '${e}'`,d.InvalidArgument,400);r.accumulated+=t.data;let i=this._buildClosingHeaders(r,t.headers??{});i[h]=`finished`;let a={serial:r.serial,data:t.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,t){this._assertNotClosed(),this._logger?.trace(`DefaultEncoderCore.abortStream();`,{streamId:e});let r=this._trackers.get(e);if(!r)throw new n.ErrorInfo(`unable to abort stream; no active stream for streamId '${e}'`,d.InvalidArgument,400);r.aborted=!0;let i=this._buildClosingHeaders(r,{},t);i[h]=`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[h]=`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 t=await Promise.allSettled(e.map(async e=>e.promise)),r=new Set;for(let[n,i]of t.entries()){let t=e[n];t&&i.status===`rejected`&&r.add(t.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,[h]: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 n.ErrorInfo(`unable to flush pending appends; recovery failed for stream(s): ${e}`,d.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 n.ErrorInfo(`unable to write to encoder; encoder has been closed`,d.InvalidArgument,400)}_resolveClientId(e){return e?.clientId??this._defaultClientId}_buildHeaders(e,t){let n={...P(this._defaultExtras?.headers,t?.extras?.headers),...e};return t?.messageId!==void 0&&(n[v]=t.messageId),n}_buildDiscreteMessage(e,t){let n=this._buildHeaders(e.headers??{},t);n[m]=`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=P(this._defaultExtras?.headers,n?.extras?.headers);return Object.assign(r,i),Object.assign(r,t),r}},Ye=(e,t={})=>new Je(e,t),Xe=class{constructor(e,t={}){this._aborted=!1,this._core=Ye(e,t)}async appendEvent(e,t){switch(e.type){case`text-start`:{let n=z().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.id,{name:`text`,data:``,headers:n},t);break}case`reasoning-start`:{let n=z().str(`id`,e.id).json(`providerMetadata`,e.providerMetadata).build();await this._core.startStream(e.id,{name:`reasoning`,data:``,headers:n},t);break}case`tool-input-start`:{let n=z().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:n},t);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=z().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=z().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=z().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(t){if(!(t instanceof n.ErrorInfo&&f(t,d.InvalidArgument)))throw t;let r=z().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 n=z().str(`messageId`,e.messageId).json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`start`,data:``,headers:n},t);break}case`start-step`:await this._core.publishDiscrete({name:`start-step`,data:``},t);break;case`finish-step`:await this._core.publishDiscrete({name:`finish-step`,data:``},t);break;case`finish`:{let n=z().str(`finishReason`,e.finishReason).json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`finish`,data:``,headers:n},t);break}case`error`:await this._core.publishDiscrete({name:`error`,data:e.errorText},t);break;case`abort`:this._aborted=!0,await this._core.abortAllStreams(t),await this._core.publishDiscrete({name:`abort`,data:e.reason??``,headers:{[h]:`aborted`}},t);break;case`tool-input-error`:{let t=z().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=z().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=z().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 n=z().str(`toolCallId`,e.toolCallId).str(`approvalId`,e.approvalId).build();await this._core.publishDiscrete({name:`tool-approval-request`,data:``,headers:n},t);break}case`tool-output-denied`:{let n=z().str(`toolCallId`,e.toolCallId).build();await this._core.publishDiscrete({name:`tool-output-denied`,data:``,headers:n},t);break}case`file`:{let n=z().str(`mediaType`,e.mediaType).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`file`,data:e.url,headers:n},t);break}case`source-url`:{let n=z().str(`sourceId`,e.sourceId).str(`title`,e.title).json(`providerMetadata`,e.providerMetadata).build();await this._core.publishDiscrete({name:`source-url`,data:e.url,headers:n},t);break}case`source-document`:{let n=z().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:n},t);break}case`message-metadata`:{let n=z().json(`messageMetadata`,e.messageMetadata).build();await this._core.publishDiscrete({name:`message-metadata`,data:``,headers:n},t);break}default:if(e.type.startsWith(`data-`)){let n=z().str(`id`,e.id).bool(`transient`,e.transient).build(),r=e.transient===!0;await this._core.publishDiscrete({name:e.type,data:e.data,headers:n,ephemeral:r},t)}break}}async writeEvent(e,t){if(!e.type.startsWith(`data-`))throw new n.ErrorInfo(`unable to write event; only data-* chunk types are supported, got '${e.type}'`,d.InvalidArgument,400);let r=z().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},t)}async writeMessages(e,t){let n=e.flatMap(e=>Ze(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:{[h]:`aborted`}}))}async close(){await this._core.close()}},Ze=e=>{let t=e.id,n=[];for(let i of e.parts)switch(i.type){case`text`:n.push({name:`text`,data:i.text,headers:z().str(`messageId`,t).build()});break;case`file`:n.push({name:`file`,data:i.url,headers:z().str(`messageId`,t).str(`mediaType`,i.mediaType).build()});break;default:(0,r.isDataUIPart)(i)&&n.push({name:i.type,data:i.data,headers:z().str(`messageId`,t).str(`id`,i.id).build()});break}return n.length===0&&n.push({name:`text`,data:``,headers:z().str(`messageId`,t).build()}),n},Qe={createEncoder:(e,t={})=>new Xe(e,t),createDecoder:qe,createAccumulator:me,getMessageKey:e=>e.id,isTerminal:e=>e.type===`finish`||e.type===`error`||e.type===`abort`},$e=e=>fe({...e,codec:Qe}),et=e=>`send`in e&&typeof e.send==`function`;e.useChatTransport=(e,n)=>{let r=(0,t.useRef)(null);return r.current===null&&(et(e)?r.current=p(e,n):r.current=p($e(e),n)),r.current},e.useMessageSync=(e,n)=>{(0,t.useEffect)(()=>{if(e)return e.on(`message`,()=>{n(()=>e.getMessages())})},[e,n])}});
2
+ //# sourceMappingURL=ably-ai-transport-vercel-react.umd.cjs.map