1import{r as e}from"./chunk-BNv3lrIs.js";import{Xt as t}from"./utils-DJX6_tFu.js";import{m as n,s as r}from"./uiStore-CQnwAuHX.js";import{kr as i,qt as a,t as o}from"./api-CjWme3MJ.js";import{c as s,t as c}from"./ablyStore-D-66BraQ.js";import{t as l}from"./atom-C28IjVjl.js";import{t as u}from"./computed-BHMfc53M.js";import{d}from"./onboardingStore-DBUcSg73.js";function f(e){let t={};for(let n of e)for(let e of n.results??[])(t[e.entityId]??={})[n.id]=e;return t}function p(e,t){let n=new Map(t.map(e=>[e.id,e])),r=e.questions.map(e=>{let t=n.get(e.id);return t?{...e,status:m(e.status,t.status),results:t.results}:e});return{...e,questions:r}}function m(e,t){return e===a.Running?t===a.Completed||t===a.Error?t:e:t}var h=e({AIContextStore:()=>v,aiContextStore:()=>y}),g=t(`AI:Context`),_=(e,t)=>`${e}:${t}`,v=class{constructor(){this.context=l(null),this.loading=l(!1),this.error=l(null),this.pendingResults=r({}),this.questions=u(this.context,e=>e?.questions||[]),this.results=u(this.questions,f),this.hasError=u(this.error,e=>!!e),this.ablyUnsubscribe=null,this.listId=null,this.pollingInterval=null,this.loadContext$=new n,this.loadContext=async e=>{let t=this.context.get();if(!(t&&t.listId===e&&this.listId===e))return this.listId!==e&&(this.loadContext$=new n),this.listId=e,this.loadContext$.run(()=>this.doLoadContext(e))},this.doLoadContext=async e=>{this.loading.set(!0),this.error.set(null),this.stopPolling(),this.cleanupAblySubscription();try{let t=await o.listAIContext.get(e);if(this.listId!==e)return;if(this.context.set(t),t){if(await this.loadResults(t.id),this.listId!==e)return;await this.setupAblySubscription(t.id),t.questions?.some(e=>e.status===a.Running)&&!this.ablyUnsubscribe&&this.startPolling()}}catch(t){if(this.listId!==e)return;if(t.response?.status===404){g.info(`AI context not found, creating new one`,{listId:e});try{await this.ensureContext(e)}catch(t){if(this.listId!==e)return;g.error(`Failed to create AI context`,{error:t,listId:e}),this.error.set(`Failed to create AI context`),i.sendError(t,{listId:e})}}else g.error(`Failed to load AI context`,{error:t,listId:e}),this.error.set(`Failed to load AI context`),i.sendError(t,{listId:e})}finally{this.listId===e&&this.loading.set(!1)}},this.ensureContext=async e=>{this.loading.set(!0),this.error.set(null);try{let t=await o.listAIContext.create(e);return this.context.set(t),t}catch(t){throw g.error(`Failed to ensure AI context`,{error:t,listId:e}),this.error.set(`Failed to create AI context`),i.sendError(t,{listId:e}),t}finally{this.loading.set(!1)}},this.loadResults=async e=>{try{let t=await o.listAIContext.getResults(e),n=this.context.get();if(!n||n.id!==e)return null;let r=p(n,t);this.context.set(r),this.clearPendingForResults(r.questions)}catch(t){g.error(`Failed to load AI context results`,{error:t,contextId:e}),i.sendError(t,{contextId:e})}},this.setPending=(e,t)=>
1{let n=Object.fromEntries(t.map(t=>[_(e,t),!0]));this.pendingResults.set({...this.pendingResults.get(),...n})},this.clearPending=(e,t)=>{let n=_(e,t),r=this.pendingResults.get();if(!r[n])return;let{[n]:i,...a}=r;this.pendingResults.set(a)},this.clearAllForQuestion=e=>{let t=this.pendingResults.get();if(Object.keys(t).length===0)return;let n=`${e}:`,r=Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith(n)));Object.keys(r).length!==Object.keys(t).length&&this.pendingResults.set(r)},this.clearPendingForResults=e=>{let t=this.pendingResults.get();if(Object.keys(t).length===0)return;let n=new Set;for(let r of e)for(let e of r.results??[]){let i=_(r.id,e.entityId);t[i]&&n.add(i)}if(n.size===0)return;let r=Object.fromEntries(Object.entries(t).filter(([e])=>!n.has(e)));this.pendingResults.set(r)},this.addQuestion=async(e,t)=>{let n=this.context.get();if(!n)return await this.ensureContext(e),this.addQuestion(e,t);try{let e=await o.listAIContextQuestions.create(n.id,{question:t});this.context.set({...n,questions:[...n.questions,e]});let r=`aiContext-${e.id}`;return await d.addColumnToViewSettings(r,{visible:!0,width:600}),e}catch(e){throw g.error(`Failed to add question`,{error:e,contextId:n.id}),this.error.set(`Failed to add question`),i.sendError(e,{contextId:n.id}),e}},this.removeQuestion=async e=>{let t=this.context.get();if(t)try{await o.listAIContextQuestions.delete(e);let n=t.questions.filter(t=>t.id!==e);this.context.set({...t,questions:n}),this.clearAllForQuestion(e);let r=`aiContext-${e}`;await d.removeColumnFromViewSettings(r)}catch(t){throw g.error(`Failed to remove question`,{error:t,questionId:e}),this.error.set(`Failed to remove question`),i.sendError(t,{questionId:e}),t}},this.reorderQuestions=async e=>{let t=this.context.get();if(t)try{await o.listAIContextQuestions.reorder(t.id,e);let n=e.map((e,n)=>{let r=t.questions.find(t=>t.id===e);return r?{...r,order:n}:null}).filter(Boolean);this.context.set({...t,questions:n})}catch(e){throw g.error(`Failed to reorder questions`,{error:e,contextId:t.id}),this.error.set(`Failed to reorder questions`),i.sendError(e,{contextId:t.id}),e}},this.runQuestion=async(e,t)=>{if(!this.context.get())throw Error(`No AI context loaded`);try{this.updateQuestionStatus(e,a.Running),t.length>0&&this.setPending(e,t);let n=await o.listAIContextQuestions.run(e,t);return this.ablyUnsubscribe||this.startPolling(),g.info(`Question run started`,{questionId:e,entityCount:t.length,workflowRunId:n.workflowRunId}),n}catch(t){throw this.updateQuestionStatus(e,a.Error),g.error(`Failed to run question`,{error:t,questionId:e}),i.sendError(t,{questionId:e}),t}},this.updateQuestionStatus=(e,t)=>{let n=this.context.get();if(!n)return;let r=n.questions.map(n=>n.id===e?{...n,status:t}:n);this.context.set({...n,questions:r}),(t===a.Completed||t===a.Error)&&this.clearAllForQuestion(e)},this.addResultToQuestion=(e,t)=>{let n=this.context.get();if(!n)return;let r=n.questions.map(n=>{if(n.id!==e)return n;let r=n.results?.findIndex(e=>e.entityId===t.entityId)??-1,i=r>=0?(n.results??[]).map((e,n)=>n===r?t:e):[...n.results??[],t];return{...n,results:i}});this.context.set({...n,questions:r})},this.hasAnyPending=()=>Object.keys(this.pendingResults.get()).length>0,this.startPolling=()=>{if(this.pollingInterval){g.info(`Polling already active, skipping`);return}g.info(`Starting polling for AI context results`),this.pollingInterval=setInterval(()=>{let e=this.questions.get().some(e=>e.status===a.Running),t=this.hasAnyPending(),n=this.context.get();(e||t)&&n?this.loadResults(n.id):(g.info(`No running questions, stopping polling`),this.stopPolling())},2e3)},this.stopPolling=()=>{this.pollingInterval&&=(clearInterval(this.pollingInterval),null)},this.setupAblySubscription=async e=>{try{this.cleanupAblySubscription();let t=await c.getChannel(s(e));if(!t)return;let n=e=>{let t=e.data;g.info(`Received question status update`,t),this.updateQuestionStatus(t.questionId,t.status)},r=e=>{let t=e.data;g.info(`Received question result`,{questionId:t.questionId,entityId:t.entityId}
1),this.addResultToQuestion(t.questionId,{entityId:t.entityId,result:t.result,error:null,metadata:null}),this.clearPending(t.questionId,t.entityId)},i=e=>{let t=e.data;g.info(`Batch processing complete, loading all results`,{contextId:t.contextId}),this.loadResults(t.contextId);let n=this.context.get();if(n){let e=n.questions.map(e=>({...e,status:e.status===a.Running?a.Completed:e.status}));this.context.set({...n,questions:e})}this.pendingResults.set({})};t.subscribe(`question-status`,n),t.subscribe(`question-result`,r),t.subscribe(`batch-complete`,i),this.ablyUnsubscribe=()=>{t.unsubscribe(`question-status`,n),t.unsubscribe(`question-result`,r),t.unsubscribe(`batch-complete`,i)},g.info(`Ably subscription setup complete`,{contextId:e})}catch(e){g.error(`Failed to setup Ably subscription`,{error:e}),this.startPolling()}},this.cleanupAblySubscription=()=>{this.ablyUnsubscribe&&=(this.ablyUnsubscribe(),null)},this.clear=()=>{this.stopPolling(),this.cleanupAblySubscription(),this.context.set(null),this.loading.set(!1),this.error.set(null),this.pendingResults.set({}),this.listId=null,this.loadContext$=new n}}},y=new v;d.list.listen(e=>{e?y.loadContext(e.id):y.clear()});export{h as n,y as t};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.