@redocly/replay 0.27.0-next.4 → 0.27.0-next.5

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 (62) hide show
  1. package/dist/replay-AiChatProvider-BGXsZqW2.js +6 -0
  2. package/dist/replay-AiChatProvider-CVvR1kSd.js +1004 -0
  3. package/dist/replay-AiChatSqliteDBStorage-BFHRKFlk.js +88 -0
  4. package/dist/replay-AiChatSqliteDBStorage-DVJ9f2EK.js +1 -0
  5. package/dist/replay-AiPanel-CynVcVmm.js +2873 -0
  6. package/dist/replay-AiPanel-qVp_s4gD.js +849 -0
  7. package/dist/replay-HistorySqliteDBStorage-BrILW8Fu.js +1 -0
  8. package/dist/replay-HistorySqliteDBStorage-CtF6-vY8.js +113 -0
  9. package/dist/replay-SqliteDBStorage-CSz7NYH4.js +2857 -0
  10. package/dist/replay-SqliteDBStorage-eRBPh4E8.js +14 -0
  11. package/dist/replay-StepContextSqliteDBStorage-BSepLyBI.js +1 -0
  12. package/dist/replay-StepContextSqliteDBStorage-BfAAKDwA.js +83 -0
  13. package/dist/replay-agent-loop-C60p47KY.js +1 -0
  14. package/dist/replay-agent-loop-CEZz1kj-.js +1533 -0
  15. package/dist/replay-ai-chat-mappers-BAHU6JIc.js +99 -0
  16. package/dist/replay-ai-chat-mappers-Dqg-QVZy.js +1 -0
  17. package/dist/replay-ai-message-parts.schema-BBdjwldJ.js +1 -0
  18. package/dist/replay-ai-message-parts.schema-E9u9-nqr.js +60 -0
  19. package/dist/replay-create-model-C2NQtDcL.js +38224 -0
  20. package/dist/replay-create-model-CUL-l-eX.js +104 -0
  21. package/dist/replay-db-C4jAfGtc.js +64 -0
  22. package/dist/replay-db-Dw-X2WGx.js +306 -0
  23. package/dist/replay-defaults-CzR6jw9a.js +32 -0
  24. package/dist/replay-defaults-DVvOnvnR.js +27 -0
  25. package/dist/replay-external-resolver-DAkLV0nr.js +34 -0
  26. package/dist/replay-external-resolver-DN_PWq_2.js +2 -0
  27. package/dist/replay-history.schema-5ce6X0R1.js +28 -0
  28. package/dist/replay-history.schema-miM3Etuf.js +1 -0
  29. package/dist/replay-index-BmX1FPBL.js +6877 -0
  30. package/dist/replay-index-DR1uVBvc.js +503 -0
  31. package/dist/replay-index-DSKZHOXq.js +1 -0
  32. package/dist/{replay-index-DuAFN7X8.js → replay-index-DT5gdiBA.js} +1 -1
  33. package/dist/replay-index-O_Pq5an3.js +92924 -0
  34. package/dist/{replay-index-D6LeDb4M.js → replay-index-m00jnWFr.js} +6 -6
  35. package/dist/replay-index-qZlgEmbq.js +1 -0
  36. package/dist/replay-index-rRWvC2pp.js +1 -0
  37. package/dist/replay-indexes-CfsvVMi_.js +1242 -0
  38. package/dist/replay-indexes-Dqjl8m6C.js +1 -0
  39. package/dist/replay-lint-CcVVykW7.js +33217 -0
  40. package/dist/replay-lint-ON47l7Vu.js +184 -0
  41. package/dist/{replay-lint-graphql-8tMA-ttz.js → replay-lint-graphql-5cGt2KR_.js} +5 -5
  42. package/dist/{replay-lint-graphql-Cdmm_aJs.js → replay-lint-graphql-DlD7bblx.js} +2 -2
  43. package/dist/replay-resolve-BTzo-fSv.js +47 -0
  44. package/dist/replay-resolve-Ca3DUbGq.js +3683 -0
  45. package/dist/{replay-respect-run-DGe96SG3.js → replay-respect-run-BtC2agF9.js} +54 -54
  46. package/dist/{replay-respect-run-DrWWHTWp.js → replay-respect-run-eSRzH2dk.js} +447 -447
  47. package/dist/replay-step-context.schema-BuuXkAck.js +1 -0
  48. package/dist/replay-step-context.schema-DBk4jufr.js +21 -0
  49. package/dist/{replay-tauri-path-BQmCYwRI.js → replay-tauri-path-C-oxFOHe.js} +4 -4
  50. package/dist/{replay-tauri-path-BIIo3xjJ.js → replay-tauri-path-CKcvIl_h.js} +1 -1
  51. package/dist/replay-useAiChatQueries-CVTxcu2Z.js +192 -0
  52. package/dist/replay-useAiChatQueries-vdKvbmp2.js +3413 -0
  53. package/dist/replay-validate-key-CwIopif3.js +28 -0
  54. package/dist/replay-validate-key-VkgZoK1f.js +1 -0
  55. package/dist/replay.cjs +1 -1
  56. package/dist/replay.d.ts +2 -0
  57. package/dist/replay.js +21 -21
  58. package/package.json +2 -2
  59. package/dist/replay-index-BFggGnsX.js +0 -181252
  60. package/dist/replay-index-BWX4r5us.js +0 -8354
  61. package/dist/replay-index-DCclzbQl.js +0 -1
  62. package/dist/replay-index-tDvNtfHp.js +0 -1
@@ -0,0 +1,6 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const X=require("react/jsx-runtime"),i=require("react"),a=require("./replay-index-BmX1FPBL.js"),te=require("./replay-create-model-CUL-l-eX.js"),fe=require("./replay-agent-loop-C60p47KY.js"),ge=require("./replay-db-C4jAfGtc.js"),m=require("./replay-useAiChatQueries-CVTxcu2Z.js"),F=require("@tanstack/react-query"),Z=require("./replay-ai-chat-mappers-Dqg-QVZy.js");class Ce{handlers=new Map;middlewares;constructor(t){this.middlewares=t?.middlewares??[]}register(t){this.handlers.set(t.name,t)}getToolSet(){const t={};for(const[n,s]of this.handlers)t[n]=this.buildTool(s);return t}buildTool(t){return{...t.definition,execute:this.wrapExecutor(t)}}wrapExecutor(t){const n=(o,r)=>({isError:!0,error:{message:o,details:r}}),s=this.applyMiddlewares(t.name,t.execute);return(o,r)=>{if(r.abortSignal?.aborted)return n("Tool execution was aborted.");try{const l=s(o,r);return typeof l=="object"&&l!==null&&"then"in l?l.then(c=>c,c=>n(c instanceof Error?c.message:"Unknown tool execution error")):l}catch(l){return n(l instanceof Error?l.message:"Unknown tool execution error")}}}applyMiddlewares(t,n){return this.middlewares.length===0?n:this.middlewares.reduceRight((s,o)=>o(t,s),n)}}function ue(){const e=F.useQueryClient();return F.useMutation({async mutationFn(t){const n=Z.buildPersistableUiChat(t);await a.AiChatServiceFactory.getInstance().upsert(n)},onSuccess(){e.invalidateQueries({queryKey:a.aiChatKeys.all()})},onError(t){console.error("Failed to upsert ai chat item:",t)}})}function me(e){const t=F.useQueryClient(),n=a.aiChatKeys.detailTitle(e??"");return F.useMutation({mutationKey:n,async mutationFn(s){if(t.isMutating({mutationKey:n,exact:!0})>1)return;const o=Z.buildPersistableUiChat(s);await a.AiChatServiceFactory.getInstance().upsert(o)},onSuccess(){t.invalidateQueries({queryKey:a.aiChatKeys.all()})},onError(s){console.error("Failed to upsert ai chat item:",s)}})}function ve(){const e=F.useQueryClient();return F.useMutation({async mutationFn(t){await a.AiChatServiceFactory.getInstance().remove(t)},onMutate:async t=>{await e.cancelQueries({queryKey:a.aiChatKeys.all()});const n=e.getQueryData(a.aiChatKeys.all());n&&e.setQueryData(a.aiChatKeys.all(),n.filter(s=>s.id!==t)),e.setQueryData(a.aiChatKeys.detail(t),null),e.setQueriesData({queryKey:a.aiChatKeys.infiniteHistories()},s=>s&&{...s,pages:s.pages.map(o=>({...o,items:o.items.filter(r=>r.id!==t)}))})},onError(t){console.error("Failed to remove ai chat:",t)},onSettled(){e.invalidateQueries({queryKey:a.aiChatKeys.all()})}})}var ee,ae;function we(){if(ae)return ee;ae=1;function e(t,n){if(typeof t!="function")throw new TypeError(`Expected the first argument to be a \`function\`, got \`${typeof t}\`.`);let s,o=0;return function(...l){clearTimeout(s);const c=Date.now(),u=c-o,p=n-u;p<=0?(o=c,t.apply(this,l)):s=setTimeout(()=>{o=Date.now(),t.apply(this,l)},p)}}return ee=e,ee}var Ie=we();const Te=a.getDefaultExportFromCjs(Ie);var de=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},h=(e,t,n)=>(de(e,t,"read from private field"),n?n.call(e):t.get(e)),y=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},E=(e,t,n,s)=>(de(e,t,"write to private field"),t.set(e,n),n);function ye(e,t){return t!=null?Te(e,t):e}var I,Y,J,j,Q,V,B,ne,se,be=class{constructor(e=[]){y(this,I,void 0),y(this,Y,"ready"),y(this,J,void 0),y(this,j,new Set),y(this,Q,new Set),y(this,V,new Set),this.pushMessage=t=>{E(this,I,h(this,I).concat(t)),h(this,B).call(this)},this.popMessage=()=>{E(this,I,h(this,I).slice(0,-1)),h(this,B).call(this)},this.replaceMessage=(t,n)=>{E(this,I,[...h(this,I).slice(0,t),this.snapshot(n),...h(this,I).slice(t+1)]),h(this,B).call(this)},this.snapshot=t=>structuredClone(t),this["~registerMessagesCallback"]=(t,n)=>{const s=n?ye(t,n):t;return h(this,j).add(s),()=>{h(this,j).delete(s)}},this["~registerStatusCallback"]=t=>(h(this,Q).add(t),()=>{h(this,Q).delete(t)}),this["~registerErrorCallback"]=t=>(h(this,V).add(t),()=>{h(this,V).delete(t)}),y(this,B,()=>{h(this,j).forEach(t=>t())}),y(this,ne,()=>{h(this,Q).forEach(t=>t())}),y(this,se,()=>{h(this,V).forEach(t=>t())}),E(this,I,e)}get status(){return h(this,Y)}set status(e){E(this,Y,e),h(this,ne).call(this)}get error(){return h(this,J)}set error(e){E(this,J,e),h(this,se).call(this)}get messages(){return h(this,I)}set messages(e){E(this,I,[...e]),h(this,B).call(this)}};I=new WeakMap;Y=new WeakMap;J=new WeakMap;j=new WeakMap;Q=new WeakMap;V=new WeakMap;B=new WeakMap;ne=new WeakMap;se=new WeakMap;var L,ie=class extends te.AbstractChat{constructor({messages:e,...t}){const n=new be(e);super({...t,state:n}),y(this,L,void 0),this["~registerMessagesCallback"]=(s,o)=>h(this,L)["~registerMessagesCallback"](s,o),this["~registerStatusCallback"]=s=>h(this,L)["~registerStatusCallback"](s),this["~registerErrorCallback"]=s=>h(this,L)["~registerErrorCallback"](s),E(this,L,n)}};L=new WeakMap;function Se({experimental_throttle:e,resume:t=!1,...n}={}){const s=i.useRef("chat"in n?{}:{onToolCall:n.onToolCall,onData:n.onData,onFinish:n.onFinish,onError:n.onError,sendAutomaticallyWhen:n.sendAutomaticallyWhen});"chat"in n||(s.current={onToolCall:n.onToolCall,onData:n.onData,onFinish:n.onFinish,onError:n.onError,sendAutomaticallyWhen:n.sendAutomaticallyWhen});const o={...n,onToolCall:d=>{var g,f;return(f=(g=s.current).onToolCall)==null?void 0:f.call(g,d)},onData:d=>{var g,f;return(f=(g=s.current).onData)==null?void 0:f.call(g,d)},onFinish:d=>{var g,f;return(f=(g=s.current).onFinish)==null?void 0:f.call(g,d)},onError:d=>{var g,f;return(f=(g=s.current).onError)==null?void 0:f.call(g,d)},sendAutomaticallyWhen:d=>{var g,f,R;return(R=(f=(g=s.current).sendAutomaticallyWhen)==null?void 0:f.call(g,d))!=null?R:!1}},r=i.useRef("chat"in n?n.chat:new ie(o));("chat"in n&&n.chat!==r.current||"id"in n&&n.id!=null&&r.current.id!==n.id)&&(r.current="chat"in n?n.chat:new ie(o));const c=i.useCallback(d=>r.current["~registerMessagesCallback"](d,e),[e,r.current.id]),u=i.useSyncExternalStore(c,()=>r.current.messages,()=>r.current.messages),p=i.useSyncExternalStore(r.current["~registerStatusCallback"],()=>r.current.status,()=>r.current.status),w=i.useSyncExternalStore(r.current["~registerErrorCallback"],()=>r.current.error,()=>r.current.error),M=i.useCallback(d=>{typeof d=="function"&&(d=d(r.current.messages)),r.current.messages=d},[r]);return i.useEffect(()=>{t&&r.current.resumeStream()},[t,r]),{id:r.current.id,messages:u,setMessages:M,sendMessage:r.current.sendMessage,regenerate:r.current.regenerate,clearError:r.current.clearError,stop:r.current.stop,error:w,resumeStream:r.current.resumeStream,status:p,addToolResult:r.current.addToolOutput,addToolOutput:r.current.addToolOutput,addToolApprovalResponse:r.current.addToolApprovalResponse}}const Ae=20;function ke(e){if(e.length===0)return"No OpenAPI specs loaded.";const t=e.slice(0,Ae),n=t.map(Ee),s=e.length-t.length;return s>0&&n.push(` …and ${s} more API(s) not shown.`),[`Loaded APIs (${e.length}):`,...n].join(`
2
+ `)}function Ee(e){return[` apiId="${e.apiId}"`,`title="${e.title}"`,e.version?`version="${e.version}"`:null,e.primaryServer?`server="${e.primaryServer}"`:null].filter(Boolean).join(" ")}const Me=30;function Re(e){if(e.length===0)return"No Arazzo collections loaded.";const t=[`Arazzo collections (${e.length}):`];let n=Me,s=0,o=0;for(const l of e){if(n<=0){s+=l.workflows.length,o++;continue}if(t.push(_e(l)),n--,l.workflows.length===0)t.push(" (no workflows)");else if(n>=2){t.push(` workflows (${l.workflows.length}):`),n--;for(const c of l.workflows)n>0?(t.push(` ${xe(c)}`),n--):s++}else s+=l.workflows.length}const r=[s>0?`${s} more workflow(s)`:null,o>0?`${o} more collection(s)`:null].filter(Boolean);return r.length>0&&t.push(` …and ${r.join(", plus ")} not shown.`),t.join(`
3
+ `)}function _e(e){const t=e.sourceApiIds.length>0?` apis=[${e.sourceApiIds.join(", ")}]`:"";return` collectionId="${e.collectionId}" title="${e.title}"${t}`}function xe(e){const t=`id="${e.workflowId}"`,n=e.summary?`label="${e.summary}"`:null,s=`[${e.stepCount} step${e.stepCount!==1?"s":""}]`;return[t,n,s].filter(Boolean).join(" ")}const Pe=20;function De(e){if(e.length===0)return"No environments configured.";const t=e.slice(0,Pe),n=t.map($e),s=e.length-t.length;return s>0&&n.push(` …and ${s} more environment(s) not shown.`),[`Environments (${e.length}); * marks the active environment:`,...n].join(`
4
+ `)}function $e(e){return[`${e.isActive?"*":" "} name="${e.name}"`,`inputs=${e.inputCount}`,`servers=${e.serverCount}`].join(" ")}const Oe=30;function Ue(e){if(e.length===0)return"No tabs are open.";const t=e.slice(0,Oe),n=t.map(We),s=e.length-t.length;return s>0&&n.push(` …and ${s} more tab(s) not shown.`),[`Open tabs (${e.length}), listed by tabIndex; * marks the active (focused) tab:`,...n].join(`
5
+ `)}function We(e){const t=[e.collectionId?`collectionId="${e.collectionId}"`:null,e.workflowId?`workflowId="${e.workflowId}"`:null,e.stepId?`stepId="${e.stepId}"`:null,e.operationId?`operationId="${e.operationId}"`:null].filter(Boolean),n=[e.isPreview?"preview":null,e.isDraft?"draft":null,e.isHistory?"history":null].filter(Boolean);return[`${e.isActive?"*":" "} ${e.tabIndex}.`,`type="${e.type}"`,`label="${e.label}"`,...t,n.length>0?`(${n.join(", ")})`:null].filter(Boolean).join(" ")}const Be="Auto-attached snapshot of the user's current Replay UI state. Generated by Replay before each step; not written by the user. It is a shallow summary — use tools to read detailed tab contents when needed.";function Le(e){const t=`
6
+ `.repeat(2),n=[Be,t,Ue(e.tabs),t,ke(e.apis),t,Re(e.collections),t,De(e.environments)].join("");return ge.section("active_state",n)}function Fe(e){return e.apis.get({noproxy:!0}).map(Ne)}function Ne(e){return{apiId:e.id,title:e.info?.title??"Untitled API",version:e.info?.version,primaryServer:e.servers?.[0]?.url}}function qe(e){return e.collections.get({noproxy:!0}).map(Ke)}function Ke(e){const t=(e.workflows??[]).map(s=>({workflowId:s.workflowId,summary:s.summary,stepCount:s.steps?.length??0})),n=(e.sourceDescriptions??[]).map(s=>s.apiId).filter(Boolean);return{collectionId:e.id,title:e.info?.title??"Untitled Collection",workflows:t,sourceApiIds:n}}function je(e){const t=e.environments.get({noproxy:!0}),n=e.activeEnvironmentId.get({noproxy:!0});return t.filter(s=>s.state!==a.ItemState.Draft).map(s=>({name:s.name,isActive:s.name===n,inputCount:s.inputs.length,serverCount:s.servers.length}))}function Qe(e){const t=e.tabsState.tabs.get({noproxy:!0}),n=e.tabsState.activeTabIdx.get({noproxy:!0});return t.map((s,o)=>Ve(e,s,o,o===n))}function Ve(e,t,n,s){const o={tabIndex:n,type:t.data.type,isActive:s,isPreview:t.state===a.TabState.Preview};switch(t.data.type){case a.TabDataType.Collection:{const{collectionId:r}=t.data;return{...o,label:Ge(e,r)??r,collectionId:r}}case a.TabDataType.Workflow:{const{collectionId:r,workflowId:l}=t.data;return{...o,label:l,collectionId:r,workflowId:l}}case a.TabDataType.WorkflowRun:{const{collectionId:r,workflowId:l,historyId:c,label:u}=t.data;return{...o,label:u??`${l} run`,collectionId:r,workflowId:l,isHistory:c!=null}}case a.TabDataType.Step:{const r=t.data;return{...o,label:He(r),collectionId:r.collectionId,workflowId:r.workflowId,stepId:r.stepId,operationId:r.draftStep?.operation?.operationId??null,isDraft:!r.collectionId&&!r.workflowId,isHistory:r.historyId!=null}}}}function Ge(e,t){return e.collections.find(s=>s.id.get()===t)?.info.title.get()}function He(e){if(e.stepId)return e.stepId;if(e.draftStep){const t=[a.getStepMethod(e.draftStep),a.getStepUrl(e.draftStep)].filter(Boolean).join(" ");if(t)return t}return"New Request"}function ze(e){return{tabs:Qe(e),apis:Fe(e),collections:qe(e),environments:je(e)}}function Ye(){const{getCollection:e}=a.useCollections(),{getWorkflow:t}=a.useWorkflows(),{getStep:n}=a.useSteps(),{tab:s}=a.useActiveTab(),o=s?.data.get();return i.useMemo(()=>{if(!o)return null;switch(o.type){case a.TabDataType.Collection:const l=e(o.collectionId);return{...o,collection:l?l.get():null};case a.TabDataType.Workflow:const c=t({collectionId:o.collectionId,workflowId:o.workflowId});return{...o,workflow:c?c.get():null};case a.TabDataType.Step:const u=n({collectionId:o.collectionId,workflowId:o.workflowId,stepId:o.stepId});return{...o,step:u?u.get():null};case a.TabDataType.WorkflowRun:const p=t({collectionId:o.collectionId,workflowId:o.workflowId});return{...o,workflow:p?p.get():null}}},[o,e,t,n])}function Je(e){if(!e||typeof e!="object"||!("changes"in e)||!Array.isArray(e.changes))return e;const t=e.changes.filter(s=>s&&typeof s=="object"&&"approved"in s&&s.approved===!0),n="meta"in e&&typeof e.meta=="object"?e.meta:{};return{...e,changes:t,meta:{...n,totalChanges:e.changes.length,approvedChanges:t.length}}}function Xe(){return(e,t)=>(n,s)=>t(Je(n),s)}function Ze(){const{getApiOperation:e}=a.useApiOperation(),t=a.useTabHandlers();return i.useMemo(()=>({getApiOperation:e,...t}),[e,t])}function et(e){const{convertOperationToReplayValue:t}=a.useSettingsContext(),n=Ye(),s=Ze(),o=a.useSettingsState(),r=a.useGlobalStore(),{attachApiToCollection:l}=a.useCollections(),{handleCloseByDataId:c}=a.useTabHandlers(),u=i.useRef(n);return u.current=n,{tools:i.useMemo(()=>{const w=new Ce({middlewares:[Xe()]});return m.registerBuiltInTools(w,{[m.reportStatusBlueprint.name]:void 0,[m.runRequestBlueprint.name]:{store:r,settingsState:o},[m.updateSecurityBlueprint.name]:{store:r},[m.updateStepBlueprint.name]:{store:r},[m.manageCollectionBlueprint.name]:{store:r,attachApiToCollection:l,handleCloseByDataId:c,convertOperationToReplayValue:t},[m.manageEnvironmentBlueprint.name]:{store:r},[m.webSearchBlueprint.name]:{model:e},[m.searchBlueprint.name]:{store:r},[m.openTabBlueprint.name]:{store:r,context:s},[m.getCurrentTabBlueprint.name]:{getActiveTabDetailedData:()=>u.current},[m.getApiMetadataBlueprint.name]:{store:r}}),w.getToolSet()},[l,t,c,e,s,o,r])}}function tt(e){const{children:t,chatId:n,model:s,initialMessages:o,onChatFinish:r,onChatMessagesUpdated:l}=e,c=a.useSettingsState(),{getReuniteAuth:u}=a.useSettingsContext(),{tools:p}=et(s),{sendEvent:w}=a.useTelemetry(),M=i.useRef(p),d=i.useRef(s),{isOpen:g,openPanel:f,closePanel:R}=a.useAiPanel(),_=i.useRef(void 0),N=a.useGlobalStore(),b=i.useRef(N);M.current=p,d.current=s,b.current=N;const v=i.useMemo(()=>{_.current?.end();const A=a.trace.getTracer("replay-ai-chat").startSpan("ai.chat.session",{attributes:{conversation_id:n}});_.current=A;const k=a.trace.setSpan(a.context.active(),A);return new fe.AgentLoop({activeConversationId:n,model:d.current,tools:M.current,sendEvent:w,parentCtx:k,getActiveStateMessage:()=>Le(ze(b.current))})},[n,w]);i.useEffect(()=>()=>_.current?.end(),[]);const U=i.useMemo(()=>{if(v)return new te.DirectChatTransport({agent:v.getAgent()})},[v]);i.useEffect(()=>{v.setModel(s)},[v,s]),i.useEffect(()=>{v.registerTools(p)},[v,p]);const{messages:S,setMessages:x,sendMessage:q,status:P,error:G,stop:D,addToolApprovalResponse:$}=Se({id:n,messages:o,transport:U,sendAutomaticallyWhen:te.lastAssistantMessageIsCompleteWithApprovalResponses,onFinish(A){if(!r||!v)return;r({agentLoop:v,chat:this},A)}}),O=i.useMemo(()=>P==="streaming"||P==="submitted",[P]),K=i.useCallback(()=>{c.aiEnabled.get()===!0&&f()},[f,c.aiEnabled]),H=i.useCallback(()=>{R()},[R]),C=i.useCallback(async A=>{const k=A.trim();if(!(!k||!U)){if(s.provider===a.REUNITE_AI_PROVIDER){const T=await u?.();T?.baseUrl&&T?.accessToken&&v.setModel({provider:a.REUNITE_AI_PROVIDER,baseUrl:T.baseUrl,accessToken:T.accessToken})}x(T=>m.hasPendingApprovalMessage(T)?m.denyPendingApprovals(T):T),q({text:k})}},[v,u,s.provider,q,x,U]),W=i.useCallback(()=>{O&&D()},[O,D]);i.useEffect(()=>()=>{D()},[n,D]);const re=i.useCallback(A=>{const k=A(S),T=k.map(z=>z.message),oe=[...S];for(const z of k)oe[z.index]=z.message;x(oe),l?.(T)},[S,l,x]),he=i.useMemo(()=>({messages:S,isStreaming:O,chatStatus:P,chatError:G,sendMessage:C,updateMessages:re,stopGeneration:W,addToolApprovalResponse:$}),[$,G,O,S,C,P,W,re]),pe=i.useMemo(()=>({isOpen:g,openPanel:K,closePanel:H}),[g,K,H]);return X.jsx(m.AiConversationContext.Provider,{value:he,children:X.jsx(a.AiPanelContext.Provider,{value:pe,children:t})})}function nt(e){return e.slice(-2)}function st(e,t){return!!(e||t<1)}function rt(e){return i.useCallback(async(t,n)=>{if(st(e,n.messages.length))return null;const s=n.messages[0],o=m.getMessageTextContent(s.parts);try{return(await t.agentLoop.generateTitle(o)).trim()}catch(r){return console.error("Unable to generate chat title",r),null}},[e])}function ot({chatId:e,model:t,existingTitle:n}){const{mutate:s}=me(e),o=rt(n);return i.useCallback(async(...r)=>{const l=await o(...r);l!==null&&l.length!==0&&s({id:e,model:t,messages:[],title:l})},[o,t,e,s])}function at({chatId:e,model:t}){const{mutate:n}=ue();return i.useCallback((s,o)=>{const r=nt(o.messages);n({id:e,model:t,messages:r})},[t,e,n])}function it({chatId:e,model:t}){const{mutate:n}=ue();return i.useCallback(s=>{s.length!==0&&n({id:e,model:t,messages:s})},[t,e,n])}function lt(e){return i.useMemo(()=>{const t=[a.REUNITE_MODEL_OPTION];if(e){for(const[n,s]of Object.entries(e))if(s.enabled&&s.apiKey){const o=s.models.map(r=>({...r,provider:n}));t.push(...o)}}return t},[e])}function le(e){return typeof e=="function"?e():e}function ce(e,t){try{const n=globalThis.localStorage.getItem(e);return n===null?le(t):n}catch{return le(t)}}function ct(e,t){try{globalThis.localStorage.setItem(e,t)}catch{console.error("Failed to write to localStorage",{key:e,value:t})}}function ut(e,t){const[n,s]=i.useState(()=>ce(e,t)),o=i.useRef(t);o.current=t,i.useEffect(()=>{s(ce(e,o.current))},[e]);const r=i.useCallback(l=>{s(c=>{const u=l instanceof Function?l(c):l;return ct(e,u),u})},[e]);return[n,r]}const dt="replay:ai:selectedModelId";function ht(e){const{availableModels:t,aiProviders:n,reuniteAuth:s}=e,[o,r]=ut(dt,a.REUNITE_MODEL_OPTION.id);return i.useEffect(()=>{t.find(u=>u.id===o)||r(a.REUNITE_MODEL_OPTION.id)},[t,o,r]),{model:i.useMemo(()=>{const c={provider:a.REUNITE_AI_PROVIDER,baseUrl:s.baseUrl,accessToken:s.accessToken},u=t.find(w=>w.id===o);if(!u||u.provider===a.REUNITE_AI_PROVIDER)return c;const p=n?.[u.provider];return!p||!p.apiKey||!p.enabled?c:{provider:u.provider,modelId:u.id,apiKey:p.apiKey}},[o,t,n,s]),selectedModelId:o,selectModel:r}}function pt(){const[e,t]=i.useState({baseUrl:"",accessToken:""}),{getReuniteAuth:n}=a.useSettingsContext();return i.useEffect(()=>{let s=!1;async function o(){const r=await n?.();s||t({baseUrl:r?.baseUrl??"",accessToken:r?.accessToken??""})}return o().catch(()=>{s||t({baseUrl:"",accessToken:""})}),()=>{s=!0}},[n]),e}function ft(e){const{children:t}=e,[n,s]=i.useState(Z.generateAiChatId),[o,r]=i.useState(n),[l,c]=i.useState(null),u=a.useSettingsState(),p=a.useSettingsContext(),{openPanel:w}=a.useAiPanel(),M=o!==n,d=i.useCallback(()=>{const C=Z.generateAiChatId();r(C),s(C)},[]),g=i.useCallback(C=>{r(C)},[]),{data:f}=m.useAiChat(o),R=pt(),_=lt(p.aiProviders),{selectedModelId:N,model:b,selectModel:v}=ht({availableModels:_,aiProviders:p.aiProviders,reuniteAuth:R}),U=ve(),S=at({chatId:n,model:b}),x=it({chatId:n,model:b}),q=ot({chatId:n,model:b,existingTitle:f?.title}),P=i.useCallback((C,W)=>{W.isAbort||(S(C,W),q(C,W))},[S,q]),G=i.useCallback((...C)=>{x(...C)},[x]),D=i.useCallback(C=>{(o===C||n===C)&&d(),U.mutate(C)},[d,n,U,o]),$=f?.id;i.useEffect(()=>{$&&$!==n&&s($)},[$,o,n]);const O=i.useCallback(()=>{c(null)},[]),K=i.useCallback(C=>{u.aiEnabled.get()&&(d(),c(C),w())},[w,d,u.aiEnabled]),H=i.useMemo(()=>({chatId:n,model:b,availableModels:_,selectedModelId:N,selectModel:v,onSettingsOpen:p.onSettingsOpen,title:f?.title??a.defaultAiChatContextValue.title,isLoading:M,selectChat:g,removeChat:D,createNewChat:d,openAiChatWithPresetInput:K,pendingComposerPreset:l,clearPendingComposerPreset:O}),[n,_,f?.title,b,M,g,D,d,K,l,O,N,v,p.onSettingsOpen]);return X.jsx(a.AiChatContext.Provider,{value:H,children:X.jsx(tt,{chatId:n,model:b,initialMessages:f?.messages,onChatFinish:P,onChatMessagesUpdated:G,children:t})})}exports.AiChatProvider=ft;