@rizom/brain 0.2.0-alpha.263 → 0.2.0-alpha.264

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 (27) hide show
  1. package/dist/brain.js +941 -941
  2. package/dist/chunks/{app-g6q939g3.js → app-1ndrgdmg.js} +2 -2
  3. package/dist/chunks/{blog-post-adapter-0qsz1np7.js → blog-post-adapter-2gw2r57p.js} +2 -2
  4. package/dist/chunks/index-1bnxn2w3.js +20 -0
  5. package/dist/chunks/{index-jpbc5wsq.js.map → index-1bnxn2w3.js.map} +3 -3
  6. package/dist/chunks/{index-kjmk8h5s.js → index-30xjh0hd.js} +8 -8
  7. package/dist/chunks/{index-kjmk8h5s.js.map → index-30xjh0hd.js.map} +1 -1
  8. package/dist/chunks/{index-jbep378h.js → index-b2segdse.js} +3 -3
  9. package/dist/chunks/{index-jbep378h.js.map → index-b2segdse.js.map} +1 -1
  10. package/dist/chunks/{index-pfdzna2q.js → index-nd3sc6wc.js} +3 -3
  11. package/dist/chunks/{index-pfdzna2q.js.map → index-nd3sc6wc.js.map} +1 -1
  12. package/dist/chunks/{index-m02t96vk.js → index-w0gcaka3.js} +3 -3
  13. package/dist/chunks/{linkedin-template-xm5pp9zz.js → linkedin-template-zt2v1zj3.js} +2 -2
  14. package/dist/chunks/{rss-datasource-7fc3082p.js → rss-datasource-f41cn0ma.js} +2 -2
  15. package/dist/index.js +1 -1
  16. package/dist/model.js +34 -34
  17. package/dist/model.js.map +1 -1
  18. package/dist/plugins.js +1 -1
  19. package/dist/site.js +2 -2
  20. package/dist/site.js.map +1 -1
  21. package/package.json +1 -1
  22. package/dist/chunks/index-jpbc5wsq.js +0 -20
  23. /package/dist/chunks/{app-g6q939g3.js.map → app-1ndrgdmg.js.map} +0 -0
  24. /package/dist/chunks/{blog-post-adapter-0qsz1np7.js.map → blog-post-adapter-2gw2r57p.js.map} +0 -0
  25. /package/dist/chunks/{index-m02t96vk.js.map → index-w0gcaka3.js.map} +0 -0
  26. /package/dist/chunks/{linkedin-template-xm5pp9zz.js.map → linkedin-template-zt2v1zj3.js.map} +0 -0
  27. /package/dist/chunks/{rss-datasource-7fc3082p.js.map → rss-datasource-f41cn0ma.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{R as a,S as b}from"./index-m02t96vk.js";import"./index-zgensnjg.js";import"./index-bpj6nc4z.js";import"./index-jpbc5wsq.js";import"./index-cffmhf6v.js";import"./index-v2m88v42.js";import"./index-316pn0s9.js";import"./index-ba0xxwak.js";import"./index-pqwt7pdt.js";import"./index-sbjrsnjs.js";import"./index-1ty28bth.js";import"./index-3w937c1f.js";import"./index-329h2b0h.js";import"./index-v92ty0ta.js";export{a as STARTUP_CHECK_API_KEY,b as App};
2
+ import{R as a,S as b}from"./index-w0gcaka3.js";import"./index-zgensnjg.js";import"./index-bpj6nc4z.js";import"./index-1bnxn2w3.js";import"./index-cffmhf6v.js";import"./index-v2m88v42.js";import"./index-316pn0s9.js";import"./index-ba0xxwak.js";import"./index-pqwt7pdt.js";import"./index-sbjrsnjs.js";import"./index-1ty28bth.js";import"./index-3w937c1f.js";import"./index-329h2b0h.js";import"./index-v92ty0ta.js";export{a as STARTUP_CHECK_API_KEY,b as App};
3
3
 
4
4
  //# debugId=E3A871CBB33DE0A064756E2164756E21
5
- //# sourceMappingURL=app-g6q939g3.js.map
5
+ //# sourceMappingURL=app-1ndrgdmg.js.map
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Kb as a,Lb as b}from"./index-qb16141y.js";import"./index-x8vanz81.js";import"./index-jpbc5wsq.js";import"./index-cffmhf6v.js";import"./index-v2m88v42.js";import"./index-316pn0s9.js";import"./index-ba0xxwak.js";import"./index-pqwt7pdt.js";import"./index-sbjrsnjs.js";import"./index-1ty28bth.js";import"./index-3w937c1f.js";import"./index-329h2b0h.js";import"./index-v92ty0ta.js";export{b as blogPostAdapter,a as BlogPostAdapter};
2
+ import{Kb as a,Lb as b}from"./index-qb16141y.js";import"./index-x8vanz81.js";import"./index-1bnxn2w3.js";import"./index-cffmhf6v.js";import"./index-v2m88v42.js";import"./index-316pn0s9.js";import"./index-ba0xxwak.js";import"./index-pqwt7pdt.js";import"./index-sbjrsnjs.js";import"./index-1ty28bth.js";import"./index-3w937c1f.js";import"./index-329h2b0h.js";import"./index-v92ty0ta.js";export{b as blogPostAdapter,a as BlogPostAdapter};
3
3
 
4
4
  //# debugId=62E3B22B22AE977E64756E2164756E21
5
- //# sourceMappingURL=blog-post-adapter-0qsz1np7.js.map
5
+ //# sourceMappingURL=blog-post-adapter-2gw2r57p.js.map
@@ -0,0 +1,20 @@
1
+ // @bun
2
+ import{$e as kf,Af as h,Bf as AA,Cf as P,Df as Hf,Ef as ZA,Gf as $A,Pf as vf,Re as b,Sf as p$,Te as J,Ue as B,Vf as jf,We as E,Xe as Yf,Xf as B$,Ye as _Z,Yf as wf,_e as Of,af as M$,ag as bf,bg as gf,cf as X$,df as EZ,ef as $f,ff as i,fg as hf,hf as v,hg as uA,if as D,jf as t,lf as u,pf as If,qf as nf,uf as I0,xf as LA,zf as g}from"./index-316pn0s9.js";import{sg as tf}from"./index-ba0xxwak.js";import{Lg as $U,Og as dA}from"./index-pqwt7pdt.js";import{eh as ZU}from"./index-1ty28bth.js";import{Ah as XU,Eh as Af,Fh as QZ,Gh as jZ,Hh as UZ,Oh as PZ,Ri as m$,Si as zU,Uh as S,Ui as GA,Vh as Nf,Wh as SU,Xh as Cf,Yh as Uf,_h as W$,ci as EU,di as Jf,ii as _f,li as KA,vh as df,wh as sf,xh as of}from"./index-3w937c1f.js";import{fj as U}from"./index-329h2b0h.js";var c0=U.object({id:U.string(),sessionId:U.string(),interfaceType:U.string(),channelId:U.string(),personId:U.string().optional(),channelName:U.string().optional(),startedAt:U.string(),lastActiveAt:U.string(),createdAt:U.string(),updatedAt:U.string(),metadata:dA}),p0=U.object({id:U.string(),conversationId:U.string(),role:Cf,content:U.string(),timestamp:U.string(),metadata:dA});var iA=U.object({name:U.string(),role:U.string(),purpose:U.string(),values:U.array(U.string())}),sA=U.object({name:U.string(),organization:U.string().optional(),description:U.string().optional(),avatar:U.string().optional(),website:U.string().optional(),email:U.string().optional(),socialLinks:U.array(U.object({platform:U.enum(["github","instagram","linkedin","email","website"]),url:U.string(),label:U.string().optional()})).optional()});function NZ(f){return J`count(${f||J.raw("*")})`.mapWith(Number)}function aA(f){return PZ(oA(f))}function oA(f,A=new Set){if(f===null)return"null";if(typeof f==="string"||typeof f==="boolean")return JSON.stringify(f);if(typeof f==="number"){if(!Number.isFinite(f))throw Error("Projection inputs cannot contain non-finite numbers");if(Number.isInteger(f)&&!Number.isSafeInteger(f))throw Error("Projection inputs cannot contain unsafe integers");return JSON.stringify(f)}if(typeof f!=="object")throw Error(`Projection inputs cannot contain ${typeof f} values`);if(A.has(f))throw Error("Projection inputs cannot contain circular values");let $=new Set(A).add(f);if(Array.isArray(f))return`[${f.map((V)=>oA(V,$)).join(",")}]`;let Z=Object.getPrototypeOf(f);if(Z!==Object.prototype&&Z!==null)throw Error("Projection inputs must contain only plain JSON objects");return`{${Object.entries(f).filter(([,V])=>V!==void 0).sort(([V],[H])=>V.localeCompare(H)).map(([V,H])=>`${JSON.stringify(V)}:${oA(H,$)}`).join(",")}}`}function rA(f){if(f!==null&&typeof f==="object"){for(let A of Object.values(f))rA(A);Object.freeze(f)}return f}var n0=U.strictObject({id:U.string().trim().min(1),version:U.string().trim().min(1),sources:U.array(U.strictObject({kind:U.literal("entity"),types:U.array(U.string().trim().min(1)).min(1),excludeTypes:U.array(U.string().trim().min(1)).optional()})),targetType:U.string().trim().min(1)});function d0(f){let A=n0.parse({id:f.id,version:f.version,sources:f.sources,targetType:f.targetType});if(typeof f.selectInput!=="function")throw Error(`Projection rule "${A.id}" must select input`);if(typeof f.derive!=="function")throw Error(`Projection rule "${A.id}" must derive output`);let $=A.sources.map((Z)=>{let V=Object.freeze([...Z.types]),H=Z.excludeTypes?Object.freeze([...Z.excludeTypes]):void 0,M={kind:"entity",types:V,...H?{excludeTypes:H}:{}};return Object.freeze(M)});return Object.freeze({id:A.id,version:A.version,sources:Object.freeze($),targetType:A.targetType,inputSchema:f.inputSchema,selectInput:async(Z,V,H)=>{let M=await f.selectInput(Z,V,H),X=bf.parse(M);return rA(f.inputSchema.parse(X))},fingerprint:aA,derive:async(Z,V,H)=>{let M=f.inputSchema.parse(Z),X=U.array(gf).parse(await f.derive(M,V,H));for(let L of X){let C=L.operation==="upsert"?L.entity.entityType:L.entityType;if(C!==A.targetType)throw Error(`Projection rule "${A.id}" cannot write entity type "${C}"`)}return rA(X)}})}var KZ={digest:"conversation:digest"};var w=t("conversations",{id:D("id").primaryKey(),sessionId:D("session_id").notNull(),interfaceType:D("interface_type").notNull(),channelId:D("channel_id").notNull(),personId:D("person_id"),started:D("started").notNull(),lastActive:D("last_active").notNull(),metadata:D("metadata"),created:D("created").notNull(),updated:D("updated").notNull()},(f)=>({sessionIdx:u("idx_conversations_session").on(f.sessionId),channelIdx:u("idx_conversations_channel").on(f.channelId),personIdx:u("idx_conversations_person").on(f.personId),interfaceSessionIdx:u("idx_conversations_interface_session").on(f.interfaceType,f.sessionId),interfaceChannelIdx:u("idx_conversations_interface_channel").on(f.interfaceType,f.channelId)})),j=t("messages",{id:D("id").primaryKey(),conversationId:D("conversation_id").notNull().references(()=>w.id,{onDelete:"cascade"}),role:D("role").notNull(),content:D("content").notNull(),timestamp:D("timestamp").notNull(),metadata:D("metadata")},(f)=>({conversationIdx:u("idx_messages_conversation").on(f.conversationId),timestampIdx:u("idx_messages_timestamp").on(f.timestamp)})),e=t("summary_tracking",{conversationId:D("conversation_id").primaryKey().references(()=>w.id,{onDelete:"cascade"}),lastSummarizedAt:D("last_summarized_at"),lastMessageId:D("last_message_id"),messagesSinceSummary:v("messages_since_summary").default(0),updated:D("updated").notNull()});function GZ(f){return If({url:f.url,schema:{conversations:w,messages:j,summaryTracking:e},authToken:f.authToken,authTokenEnv:"CONVERSATION_DATABASE_AUTH_TOKEN"})}var i0=U.preprocess((f)=>{if(typeof f!=="string")return f;try{return JSON.parse(f)}catch{return}},U.record(U.string(),U.unknown())).catch({});function ff(f){return i0.parse(f)}var pf="conversation:messageAdded",tA="conversation:started",Qf=U.object({identity:Af,interfaceType:U.string(),role:Cf,displayName:U.string().optional(),username:U.string().optional(),isBot:U.boolean().optional()}),s0=U.preprocess(o0,Qf);function o0(f){if(!cf(f)||"identity"in f)return f;let{actorId:A,interfaceType:$,role:Z}=f;if(typeof A!=="string"||typeof $!=="string"||Z!=="user"&&Z!=="assistant")return f;let{userId:V,canonicalId:H}=f;return{identity:QZ({actorId:A,interfaceType:$,role:Z,...typeof V==="string"?{userId:V}:{},...typeof H==="string"?{canonicalId:H}:{}}),interfaceType:$,role:Z,...typeof f.displayName==="string"?{displayName:f.displayName}:{},...typeof f.username==="string"?{username:f.username}:{},...typeof f.isBot==="boolean"?{isBot:f.isBot}:{}}}var Wf=U.object({messageId:U.string().optional(),channelId:U.string().optional(),channelName:U.string().optional(),threadId:U.string().optional(),metadata:U.record(U.string(),U.unknown()).optional()}),WZ=U.looseObject({actor:s0.optional(),source:Wf.optional()});function RZ(f){if(typeof f==="string")try{let A=JSON.parse(f);return cf(A)?A:null}catch{return null}return cf(f)?f:null}function a0(f){if(f.role!=="assistant")return!1;if(f.content.trim().length===0)return!1;let A=RZ(f.metadata),$=A?.entityMemoryRefs;if(Array.isArray($)&&$.length>0)return!1;let Z=A?.cards;if(!Array.isArray(Z))return!0;return!Z.some((V)=>{if(!cf(V))return!1;if(V.kind==="tool-approval")return!0;return V.kind==="actions"&&V.id==="actions:upload-intent"})}function cf(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}var r0=U.object({id:U.string(),conversationId:U.string(),role:U.string(),content:U.string(),timestamp:U.string(),metadata:U.string().nullable()}),BZ=U.object({conversationId:U.string(),messageCount:U.number(),messages:U.array(r0),windowStart:U.number(),windowEnd:U.number(),windowSize:U.number(),timestamp:U.string()});class lf{db;logger;messageBus;config;dbClient=null;dbUrl=null;pragmaInitialization=null;constructor(f,A,$,Z={}){this.db=f,this.logger=A,this.messageBus=$,this.config={digestTriggerInterval:5,digestWindowSize:10,...Z}}initialize(){return this.pragmaInitialization??=this.applyPragmas(),this.pragmaInitialization}async applyPragmas(){let f=this.dbClient,A=this.dbUrl;if(!f||A===null)return;try{await nf(f,A)}catch($){this.logger.warn("Failed to enable conversation database pragmas (non-fatal)",$)}}getDatabaseClient(){if(!this.dbClient)throw Error("ConversationService does not own a database client");return this.dbClient}close(){this.dbClient?.close()}static createFresh(f,A,$,Z){return new lf(f,A,$,Z)}static createFreshFromConfig(f,A,$,Z){let{db:V,client:H,url:M}=GZ($),X=new lf(V,f,A,Z);return X.dbClient=H,X.dbUrl=M,X}async startConversation(f){let{sessionId:A,interfaceType:$,channelId:Z,personId:V,metadata:H}=f,M=new Date().toISOString();if(await this.getConversation(A))return await this.db.update(w).set({lastActive:M,updated:M}).where(B(w.id,A)),this.logger.debug("Resumed existing conversation",{conversationId:A,interfaceType:$}),A;let L={id:A,sessionId:A,interfaceType:$,channelId:Z,personId:V??null,started:M,lastActive:M,created:M,updated:M,metadata:JSON.stringify(H)};await this.db.insert(w).values(L);let C={conversationId:A,messagesSinceSummary:0,updated:M};return await this.db.insert(e).values(C),this.logger.debug("Started new conversation",{conversationId:A,sessionId:A,interfaceType:$}),await this.messageBus.send({type:tA,payload:{conversationId:A,sessionId:A,interfaceType:$,timestamp:M},sender:"conversation-service",broadcast:!0}),A}async addMessage(f){let{conversationId:A,role:$,content:Z,metadata:V}=f,H=new Date().toISOString(),M=b(12),X={id:M,conversationId:A,role:$,content:Z,timestamp:H,metadata:V?JSON.stringify(V):null};await this.db.insert(j).values(X),await this.db.update(w).set({lastActive:H,updated:H}).where(B(w.id,A)),await this.db.update(e).set({messagesSinceSummary:J`${e.messagesSinceSummary} + 1`,lastMessageId:M,updated:H}).where(B(e.conversationId,A)),this.logger.debug("Added message to conversation",{conversationId:A,role:$,messageId:M}),await this.messageBus.send({type:pf,payload:{conversationId:A,messageId:M,role:$,content:Z,metadata:V,timestamp:H},sender:"conversation-service",broadcast:!0}),await this.checkAndBroadcastDigest(A,H)}async getMessages(f,A={}){let{limit:$=20,range:Z}=A;if(Z){let V=Z.start-1,H=Z.end-Z.start+1;return await this.db.select().from(j).where(B(j.conversationId,f)).orderBy($f(j.timestamp)).limit(H).offset(V)}else return(await this.db.select().from(j).where(B(j.conversationId,f)).orderBy(i(j.timestamp)).limit($)).reverse()}async getConversation(f){return(await this.db.select().from(w).where(B(w.id,f)).limit(1))[0]??null}async listConversations(f={}){let{limit:A=100,updatedAfter:$,interfaceType:Z,sessionId:V,channelId:H,personId:M}=f,X=[$?_Z(w.updated,$):void 0,Z?B(w.interfaceType,Z):void 0,V?B(w.sessionId,V):void 0,H?B(w.channelId,H):void 0,M?B(w.personId,M):void 0].filter((C)=>C!==void 0),L=this.db.select().from(w).orderBy(i(w.lastActive)).limit(A);if(X.length===0)return L;return L.where(E(...X))}async searchConversations(f,A){let $=`%${f.toLowerCase()}%`;return(await this.db.selectDistinct({conversation:w}).from(w).leftJoin(j,B(j.conversationId,w.id)).where(A?J`lower(${j.content}) LIKE ${$} AND ${w.sessionId} = ${A}`:J`lower(${j.content}) LIKE ${$}`).orderBy(i(w.lastActive))).map((V)=>V.conversation)}async countMessages(f){let[A]=await this.db.select({count:NZ()}).from(j).where(B(j.conversationId,f));return Number(A?.count??0)}async updateConversationMetadata(f){let A=await this.getConversation(f.conversationId);if(!A)return!1;let $=new Date().toISOString(),Z={...ff(A.metadata),...f.metadata};return await this.db.update(w).set({metadata:JSON.stringify(Z),updated:$}).where(B(w.id,f.conversationId)),this.logger.debug("Updated conversation metadata",{conversationId:f.conversationId}),!0}async deleteConversation(f){if(!await this.getConversation(f))return!1;return await this.db.delete(w).where(B(w.id,f)),this.logger.debug("Deleted conversation",{conversationId:f}),!0}async checkAndBroadcastDigest(f,A){let $=await this.countMessages(f),Z=this.config.digestTriggerInterval??10;if($>0&&$%Z===0)await this.broadcastDigest(f,$,A)}async broadcastDigest(f,A,$){let Z=this.config.digestWindowSize??20,V=Math.max(1,A-Z+1),H=A,M=await this.getMessages(f,{range:{start:V,end:H}}),X={conversationId:f,messageCount:A,messages:M,windowStart:V,windowEnd:H,windowSize:M.length,timestamp:$};await this.messageBus.send({type:KZ.digest,payload:X,sender:"conversation-service",broadcast:!0}),this.logger.debug("Broadcast conversation digest",{conversationId:f,messageCount:A,windowStart:V,windowEnd:H,windowSize:M.length})}}var eA=U.object({kind:U.string().min(1),id:U.string().min(1)}),DZ=U.object({kind:U.literal("text"),filename:U.string().min(1),mediaType:U.string().min(1),content:U.string(),sizeBytes:U.number().nonnegative().optional(),source:eA.optional()}),Y1=U.custom((f)=>f instanceof Uint8Array),F1=U.object({kind:U.literal("file"),filename:U.string().min(1),mediaType:U.string().min(1),data:Y1,sizeBytes:U.number().nonnegative().optional(),source:eA.optional()}),OZ=U.discriminatedUnion("kind",[DZ,F1]),N1=U.object({userPermissionLevel:U.enum(["admin","trusted","public"]).optional(),isAnchor:U.boolean().optional(),interfaceType:U.string().optional(),channelId:U.string().optional(),channelName:U.string().optional(),actor:Qf.optional(),source:Wf.optional(),attachments:U.array(OZ).optional()});var P1=U.object({status:U.enum(["healthy","warning","error","unknown"]),message:U.string().optional(),lastCheck:U.date().optional(),details:U.record(U.string(),U.unknown()).optional()}),kZ=U.object({name:U.string(),pluginId:U.string(),status:U.string(),health:P1.optional()});var JZ=U.enum(["admin","trusted","public"]),Rf=U.object({label:U.string(),url:U.string(),pluginId:U.string(),priority:U.number().default(100),visibility:JZ.default("public")}),f$=U.enum(["human","agent","admin","protocol"]),A$=U.enum(["available","coming-soon","disabled"]),Bf=U.object({id:U.string(),label:U.string(),description:U.string().optional(),href:U.string(),kind:f$,pluginId:U.string(),priority:U.number().default(100),visibility:JZ.default("public"),status:A$.default("available")}),af=U.object({entityType:U.string(),count:U.number()}),xZ=U.object({model:U.string(),version:U.string(),uptime:U.number(),entities:U.number(),entityCounts:U.array(af),embeddings:U.number(),ai:U.object({model:U.string(),embeddingModel:U.string()}),daemons:U.array(kZ),endpoints:U.array(Rf),interactions:U.array(Bf)});var K1=U.object({status:U.enum(["healthy","warning","error","unknown"]),message:U.string().optional(),lastCheck:U.string().optional(),details:U.record(U.string(),U.unknown()).optional()}),G1=U.object({name:U.string(),pluginId:U.string(),status:U.string(),health:K1.optional()}),Q1=U.object({model:U.string(),version:U.string(),uptime:U.number(),entities:U.number(),entityCounts:U.array(af),embeddings:U.number(),ai:U.object({model:U.string(),embeddingModel:U.string()}),daemons:U.array(G1),endpoints:U.array(Rf),interactions:U.array(Bf)});var wZ=U.object({name:U.string().min(1),status:U.enum(["healthy","degraded","unhealthy"]),message:U.string().optional(),details:U.record(U.string(),U.unknown()).optional()}),TZ=U.object({totals:U.object({pending:U.number().int().nonnegative(),processing:U.number().int().nonnegative(),completed:U.number().int().nonnegative(),failed:U.number().int().nonnegative()}),byType:U.array(U.object({type:U.string().min(1),status:U.enum(["pending","processing","completed","failed"]),count:U.number().int().nonnegative()})),oldestPendingAgeMs:U.number().nonnegative().nullable(),oldestProcessingAgeMs:U.number().nonnegative().nullable(),staleLeaseCount:U.number().int().nonnegative(),workerSessions:U.object({total:U.number().int().nonnegative(),active:U.number().int().nonnegative(),stale:U.number().int().nonnegative(),latestHeartbeatAgeMs:U.number().nonnegative().nullable()})}),qZ=U.object({memory:U.object({rssBytes:U.number().int().nonnegative(),heapUsedBytes:U.number().int().nonnegative(),heapTotalBytes:U.number().int().nonnegative()}),fileDescriptors:U.number().int().nonnegative().nullable(),processes:U.object({total:U.number().int().nonnegative().nullable(),zombies:U.number().int().nonnegative().nullable()}),queue:TZ.nullable(),projection:U.object({initialized:U.boolean(),trackedRoots:U.number().int().nonnegative(),openCircuits:U.array(U.object({projectionId:U.string().min(1),reason:U.string().min(1),openedAt:U.number().int().nonnegative(),expiresAt:U.number().int().nonnegative()}))}),worker:U.object({total:U.number().int().nonnegative(),active:U.number().int().nonnegative(),stale:U.number().int().nonnegative(),latestHeartbeatAgeMs:U.number().nonnegative().nullable()})}),W1=U.object({status:U.enum(["ready","not_ready"]),operationalStatus:U.enum(["operational","degraded"]),checkedAt:U.iso.datetime(),checks:U.array(wZ),resources:qZ});class s{callback;heartbeatInterval;constructor(f){this.callback=f}static from(f){if(!f)return;return new s(f)}createSub(f){let{scale:A}=f??{};if(A){let{start:$,end:Z}=A,V=Z-$;return new s(async(H)=>{let M=$+H.progress/(H.total??100)*V;await this.callback({...H,progress:M,total:100})})}return new s(this.callback)}async report(f){await this.callback(f)}startHeartbeat(f,A=5000){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.report({message:f,progress:0}).catch(()=>{})},A)}stopHeartbeat(){if(this.heartbeatInterval)clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0}toCallback(){return this.callback}}var R1=U.object({enabled:U.boolean().describe("Whether the plugin is enabled"),debug:U.boolean().describe("Enable debug logging for this plugin")});class rf extends Error{pluginId;issues;constructor(f,A){super(`Invalid plugin config for ${f}`);this.name="PluginConfigValidationError",this.pluginId=f,this.issues=A}}var B1=U.object({toolName:U.string(),args:U.unknown(),progressToken:U.union([U.string(),U.number()]).optional(),hasProgress:U.boolean().optional(),interfaceType:U.string(),actor:Af,displayName:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),channelName:U.string().optional(),runId:U.string().optional(),toolCallId:U.string().optional(),userPermissionLevel:U.enum(["admin","trusted","public"]).optional(),isAnchor:U.boolean().optional(),signal:U.custom((f)=>f instanceof AbortSignal).optional()}),_1=U.object({resourceUri:U.string()});class Zf{id;version;description;packageName;config;context;get logger(){return this.context?.logger??tf.createFresh({context:this.id})}constructor(f,A,$,Z){this.id=f,this.packageName=A.name,this.version=A.version,this.description=A.description??`${A.name} plugin`;let V=Z.safeParse($);if(!V.success)throw new rf(f,V.error.issues.map((H)=>({path:H.path.map(String).join("."),code:H.code,message:H.message})));this.config=V.data}setupMessageHandlers(f){f.messaging.subscribe(_f.toolExecute(this.id),async(A)=>{try{let $=B1.safeParse(A.payload);if(!$.success)return{success:!1,error:"Invalid tool execution request format"};let{toolName:Z,args:V,progressToken:H,hasProgress:M,interfaceType:X,actor:L,displayName:C,conversationId:N,channelId:F,channelName:W,runId:R,toolCallId:q,userPermissionLevel:O,isAnchor:I,signal:a}=$.data,c=(await this.getTools()).find((Q)=>Q.name===Z);if(!c)return{success:!1,error:`Tool not found: ${Z}`};let G={interfaceType:X,actor:L,...C&&{displayName:C},...N&&{conversationId:N},...F&&{channelId:F},...W&&{channelName:W},...R&&{runId:R},...q&&{toolCallId:q},...O&&{userPermissionLevel:O},...I!==void 0&&{isAnchor:I},...a&&{signal:a},...M&&H!==void 0&&{progressToken:H,sendProgress:async(Q)=>{await f.messaging.send({type:_f.progress(this.id),payload:{progressToken:H,notification:Q}})}}};return{success:!0,data:await c.handler(V,G)}}catch($){return this.logger.error("Tool execution error",$),{success:!1,error:S($)}}}),f.messaging.subscribe(_f.resourceGet(this.id),async(A)=>{try{let $=_1.safeParse(A.payload);if(!$.success)return{success:!1,error:"Invalid resource get request format"};let{resourceUri:Z}=$.data,H=(await this.getResources()).find((X)=>X.uri===Z);if(!H)return{success:!1,error:`Resource not found: ${Z}`};return{success:!0,data:await H.handler()}}catch($){return this.logger.error("Resource fetch error",$),{success:!1,error:S($)}}})}async onRegister(f){}async onRegistrationComplete(f){}async finalizeRegistration(){await this.onRegistrationComplete(this.getContext())}async onReady(f){}async ready(){await this.onReady(this.getContext())}async getCapabilities(){let f=await this.getInstructions();return{tools:await this.getTools(),resources:await this.getResources(),...f&&{instructions:f}}}async getTools(){return[]}async getResources(){return[]}async getInstructions(){return}async shutdown(){await this.onShutdown()}async onShutdown(){}getContext(){if(!this.context)throw Error(`Plugin ${this.id}: Plugin not registered yet`);return this.context}determineUserPermissionLevel(f){return"public"}createProgressBridge(f){if(!f)return;let A=this.context;if(!A)return;let $=this.id;return s.from(async(Z)=>{await A.messaging.send({type:_f.progress($),payload:{progressToken:f,notification:{progress:Z.progress,total:Z.total,message:Z.message}}})})}}var $$=U.enum(["file_operations","content_operations","data_processing","batch_processing"]),D1=U.object({pluginId:U.string().optional(),progressToken:U.union([U.string(),U.number()]).optional(),operationType:$$,operationTarget:U.string().optional(),interfaceType:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),requestedByActor:Af.optional(),requestedByUserId:U.string().optional(),requestedByInterface:U.string().optional(),silent:U.boolean().optional(),provenance:Uf.optional()}),Vf=U.object({pluginId:U.string().optional(),progressToken:U.union([U.string(),U.number()]).optional(),operationType:$$,operationTarget:U.string().optional(),interfaceType:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),requestedByActor:Af.optional(),requestedByUserId:U.string().optional(),requestedByInterface:U.string().optional(),silent:U.boolean().optional(),provenance:Uf.optional(),rootJobId:U.string()}),IH=U.enum(["none","skip","replace","coalesce"]);var Z$=U.enum(["pending","processing","completed","failed"]),mZ=U.enum(["completed","failed"]),K={PENDING:"pending",PROCESSING:"processing",COMPLETED:"completed",FAILED:"failed"},O1=U.object({id:U.string(),type:U.string(),status:Z$,data:U.unknown(),result:U.unknown().optional(),lastError:U.string().optional().nullable(),attempts:U.number(),maxRetries:U.number(),priority:U.number(),createdAt:U.date(),updatedAt:U.date(),processedAt:U.date().optional().nullable(),completedAt:U.date().optional().nullable(),failedAt:U.date().optional().nullable()}),k1=U.object({jobId:U.string(),type:U.string(),status:mZ,result:U.unknown().optional(),error:U.string().optional()}),U$=U.object({success:U.literal(!1),error:U.string().optional()}),ef=U.object({id:U.string(),type:U.enum(["job","batch"]),status:Z$,message:U.string().optional(),progress:U.object({current:U.number(),total:U.number(),percentage:U.number()}).optional(),aggregationKey:U.string().optional(),batchDetails:U.object({totalOperations:U.number(),completedOperations:U.number(),failedOperations:U.number(),currentOperation:U.string().optional(),errors:U.array(U.string()).optional()}).optional(),jobDetails:U.object({jobType:U.string(),priority:U.number(),retryCount:U.number()}).optional(),metadata:Vf});var Y=t("job_queue",{id:D("id").primaryKey().$defaultFn(()=>b()),type:D("type").notNull(),data:D("data").notNull(),result:D("result",{mode:"json"}),progress:D("progress",{mode:"json"}).$type(),source:D("source"),metadata:D("metadata",{mode:"json"}).$type().notNull(),status:D("status",{enum:["pending","processing","completed","failed"]}).notNull().default("pending"),priority:v("priority").notNull().default(0),retryCount:v("retryCount").notNull().default(0),maxRetries:v("maxRetries").notNull().default(3),lastError:D("lastError"),createdAt:v("createdAt").notNull().$defaultFn(()=>Date.now()),scheduledFor:v("scheduledFor").notNull().$defaultFn(()=>Date.now()),startedAt:v("startedAt"),completedAt:v("completedAt"),attemptId:D("attemptId"),workerSlotId:D("workerSlotId"),workerSessionId:D("workerSessionId"),leaseExpiresAt:v("leaseExpiresAt"),attemptHeartbeatAt:v("attemptHeartbeatAt"),runtimeUpdatedAt:v("runtimeUpdatedAt")},(f)=>({queueReadyIdx:u("idx_job_queue_ready").on(f.status,f.priority,f.scheduledFor),jobTypeIdx:u("idx_job_queue_type").on(f.type,f.status),runtimeUpdatesIdx:u("idx_job_queue_runtime_updates").on(f.runtimeUpdatedAt,f.id),jobSourceIdx:u("idx_job_queue_source").on(f.source)})),k=t("job_worker_sessions",{slotId:D("slotId").primaryKey(),sessionId:D("sessionId").notNull().unique(),startedAt:v("startedAt").notNull(),heartbeatAt:v("heartbeatAt").notNull()},(f)=>({heartbeatIdx:u("idx_job_worker_sessions_heartbeat").on(f.heartbeatAt)}));function SZ(f){return If({url:f.url,schema:{jobQueue:Y,jobWorkerSessions:k},authToken:f.authToken,authTokenEnv:"JOB_QUEUE_DATABASE_AUTH_TOKEN"})}class V${declarations=new Map;handlers=new Map;validators=new Map;logger;mode;finalizedRegistrations;constructor(f,A){this.logger=f.child("HandlerRegistry"),this.mode=A}registerHandler(f,A,$){if(this.finalizedRegistrations)throw Error("Job handler registrations are finalized");if(this.declarations.has(f))throw Error(`Job handler is already registered for type: ${f}`);if(this.declarations.set(f,{handler:A,pluginId:$}),this.validators.set(f,A),this.mode!=="validation-only")this.handlers.set(f,A);this.logger.debug("Registered job execution declaration",{type:f,pluginId:$,mode:this.mode})}unregisterHandler(f){this.declarations.delete(f),this.handlers.delete(f),this.validators.delete(f),this.logger.debug("Unregistered job handler",{type:f})}unregisterPluginHandlers(f){let A=[...this.declarations.entries()].filter(([,$])=>$.pluginId===f).map(([$])=>$);for(let $ of A)this.declarations.delete($),this.handlers.delete($),this.validators.delete($);if(A.length>0)this.logger.debug("Unregistered plugin handlers",{pluginId:f,count:A.length,types:A})}finalizeRegistrations(){return this.finalizedRegistrations??=Object.freeze([...this.declarations.entries()].sort(([f],[A])=>f.localeCompare(A)).map(([f,A])=>Object.freeze({type:f,pluginId:A.pluginId}))),this.finalizedRegistrations}getExecutionRegistrations(){if(!this.finalizedRegistrations)throw Error("Job handler registrations are not finalized");return this.finalizedRegistrations}getRegisteredTypes(){return[...this.handlers.keys()]}getHandler(f){return this.handlers.get(f)}getValidator(f){return this.validators.get(f)}}var J1=U.object({id:U.string(),type:U.string(),data:U.string(),status:U.enum(["pending","processing","completed","failed"]),source:U.string().nullable(),priority:U.number(),retryCount:U.number(),maxRetries:U.number(),lastError:U.string().nullable(),createdAt:U.number(),scheduledFor:U.number(),startedAt:U.number().nullable(),completedAt:U.number().nullable(),attemptId:U.string().nullable(),workerSlotId:U.string().nullable(),workerSessionId:U.string().nullable(),leaseExpiresAt:U.number().nullable(),attemptHeartbeatAt:U.number().nullable(),runtimeUpdatedAt:U.number().nullable(),metadata:Vf,progress:U.custom((f)=>typeof f==="object"&&f!==null&&("progress"in f)&&typeof f.progress==="number").nullable(),result:U.unknown().nullable().optional()}),Df=15000;var x1=U.looseObject({deduplicationKey:U.string().optional()});class H${findDuplicate(f,A,$){if(!A||A==="none")return null;let Z=this.filterByDeduplicationKey(f,$).sort((H,M)=>M.createdAt-H.createdAt||M.id.localeCompare(H.id)),V=Z.find((H)=>H.status===K.PENDING)??null;if(A==="skip"||A==="replace")return V;return V??Z[0]??null}filterByDeduplicationKey(f,A){if(!A)return f;return f.filter(($)=>{let Z=x1.safeParse($.metadata);return Z.success&&Z.data.deduplicationKey===A})}}var w1=2000,T1=5,q1=40,fA=new Map;class L${db;transactionClient;databaseUrl;logger;deduplicator=new H$;writeRetryBudgetMs;constructor(f,A,$,Z,V){this.db=f,this.transactionClient=A,this.databaseUrl=$,this.logger=Z.child("JobQueueRepository"),this.writeRetryBudgetMs=V?.writeRetryBudgetMs??w1}async insert(f){await this.db.insert(Y).values(f)}async enqueueAtomic(f){let A=fA.get(this.databaseUrl),$=()=>{},Z=new Promise((V)=>{$=V});fA.set(this.databaseUrl,Z),await A;try{let V=await this.acquireWriteTransaction(f);try{let H=await this.decideEnqueue(V,f);return await this.commitWriteTransaction(V,f),H}catch(H){if(!V.closed)try{await V.rollback()}catch(M){this.logger.error("Failed to roll back atomic enqueue",{type:f.jobData.type,rollbackError:M})}throw H}finally{V.close()}}finally{if($(),fA.get(this.databaseUrl)===Z)fA.delete(this.databaseUrl)}}async decideEnqueue(f,A){let{jobData:$,strategy:Z,deduplicationKey:V,beforeInsert:H}=A,M=Z??"none",X=async()=>{await H?.(),await this.insertJob(f,$)};if(M==="none")return await X(),{kind:"inserted",jobId:$.id};let L=await this.getActiveDeduplicationCandidates(f,$.type),C=this.deduplicator.findDuplicate(L,M,V);if(!C)return await X(),{kind:"inserted",jobId:$.id};if(M==="skip")return{kind:"skipped",jobId:C.id};if(M==="coalesce"){if((await f.execute({sql:"UPDATE `job_queue` SET `scheduledFor` = ? WHERE `id` = ? AND `status` = ?",args:[Date.now(),C.id,C.status]})).rowsAffected!==1)throw Error(`Atomic coalesce lost selected job ${C.id}`);return{kind:"coalesced",jobId:C.id}}await H?.();let N=Date.now();if((await f.execute({sql:"UPDATE `job_queue`\n SET `status` = ?,\n `lastError` = ?,\n `completedAt` = ?,\n `runtimeUpdatedAt` = max(?, coalesce((SELECT max(`runtimeUpdatedAt`) FROM `job_queue`), 0) + 1)\n WHERE `id` = ? AND `status` = ?",args:[K.FAILED,"Replaced by newer job",N,N,C.id,K.PENDING]})).rowsAffected!==1)throw Error(`Atomic replace lost selected job ${C.id}`);return await this.insertJob(f,$),{kind:"replaced",jobId:$.id,replacedJobId:C.id}}async getActiveDeduplicationCandidates(f,A){return(await f.execute({sql:"SELECT `id`, `status`, `createdAt`, `metadata`\n FROM `job_queue`\n WHERE `type` = ? AND `status` IN (?, ?)",args:[A,K.PENDING,K.PROCESSING]})).rows.map((Z)=>this.parseDeduplicationCandidate(Z))}parseDeduplicationCandidate(f){let{id:A,status:$,createdAt:Z,metadata:V}=f;if(typeof A!=="string"||$!==K.PENDING&&$!==K.PROCESSING||typeof Z!=="number"&&typeof Z!=="bigint"||typeof V!=="string")throw Error("Invalid active job row returned during atomic enqueue");let H=JSON.parse(V);return{id:A,status:$,createdAt:Number(Z),metadata:H}}async insertJob(f,A){if((await f.execute({sql:"INSERT INTO `job_queue` (\n `id`, `type`, `data`, `result`, `source`, `metadata`,\n `status`, `priority`, `retryCount`, `maxRetries`,\n `lastError`, `createdAt`, `scheduledFor`, `startedAt`,\n `completedAt`\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",args:[A.id,A.type,A.data,this.serializeJson(A.result),A.source,JSON.stringify(A.metadata),A.status,A.priority,A.retryCount,A.maxRetries,A.lastError,A.createdAt,A.scheduledFor,A.startedAt,A.completedAt]})).rowsAffected!==1)throw Error(`Atomic enqueue did not insert job ${A.id}`)}serializeJson(f){if(f===void 0||f===null)return null;return JSON.stringify(f)}commitWriteTransaction(f,A){return this.retryOnConflict("commit",A,async()=>{await f.commit()},($)=>this.isSerializationConflict($)&&!f.closed)}acquireWriteTransaction(f){return this.retryOnConflict("acquire",f,()=>this.transactionClient.transaction("write"),(A)=>this.isSerializationConflict(A))}async retryOnConflict(f,A,$,Z,V=Date.now()+this.writeRetryBudgetMs,H=1){try{return await $()}catch(M){if(!Z(M))throw M;let X=Math.min(T1*2**(H-1),q1),L=X/2+Math.random()*(X/2);if(Date.now()+L>=V)throw this.transactionConflictError(f,A,H,M);return await new Promise((C)=>setTimeout(C,L)),this.retryOnConflict(f,A,$,Z,V,H+1)}}transactionConflictError(f,A,$,Z){let V=A.strategy??"none",H=A.deduplicationKey?"present":"absent";return Error(`Failed to ${f} atomic enqueue transaction for type "${A.jobData.type}" within ${this.writeRetryBudgetMs}ms after ${$} attempts (strategy: ${V}, key: ${H})`,{cause:Z})}isSerializationConflict(f){for(let A=f;A!==void 0;){let $=typeof A==="object"&&A!==null&&"code"in A?String(A.code):"",Z=S(A,"");if(/SQLITE_(?:BUSY|LOCKED)/u.test($)||/SQLITE_(?:BUSY|LOCKED)|database is locked|transaction (?:busy|conflict)/iu.test(Z))return!0;A=A instanceof Error?A.cause:void 0}return!1}async startWorkerSession(f,A,$=Date.now()){await this.db.insert(k).values({slotId:f,sessionId:A,startedAt:$,heartbeatAt:$}).onConflictDoUpdate({target:k.slotId,set:{sessionId:A,startedAt:$,heartbeatAt:$}})}async heartbeatWorkerSession(f,A,$=Date.now()){return(await this.db.update(k).set({heartbeatAt:$}).where(E(B(k.slotId,f),B(k.sessionId,A))).returning({slotId:k.slotId})).length===1}async endWorkerSession(f,A){return(await this.db.delete(k).where(E(B(k.slotId,f),B(k.sessionId,A))).returning({slotId:k.slotId})).length===1}async complete(f,A,$){let Z=Date.now(),H=(await this.db.update(Y).set({status:K.COMPLETED,result:A,lastError:null,completedAt:Z,runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z)}).where(this.attemptWriteGuard(f,$)).returning({id:Y.id})).length===1;if(H)this.logger.debug("Job completed",{jobId:f,hasResult:A!==void 0});return H}async update(f,A,$){let V=(await this.db.update(Y).set({data:JSON.stringify(A)}).where(this.attemptWriteGuard(f,$)).returning({id:Y.id})).length===1;if(V)this.logger.debug("Job data updated",{jobId:f});return V}async recordAttemptProgress(f,A,$,Z=Date.now()){return(await this.db.update(Y).set({attemptHeartbeatAt:Z,runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z),progress:$}).where(this.attemptWriteGuard(f,A)).returning({id:Y.id})).length===1}async renewAttemptLease(f,A,$,Z){return(await this.db.update(Y).set({attemptHeartbeatAt:$,leaseExpiresAt:$+Z}).where(this.attemptWriteGuard(f,A)).returning({id:Y.id})).length===1}async fail(f,A,$,Z=Date.now()){let H=(await this.db.select({retryCount:Y.retryCount,maxRetries:Y.maxRetries,type:Y.type,scheduledFor:Y.scheduledFor,startedAt:Y.startedAt,runtimeUpdatedAt:Y.runtimeUpdatedAt}).from(Y).where(this.attemptWriteGuard(f,$)).limit(1))[0];if(!H)return!1;let M=H.retryCount<H.maxRetries,X=M?H.retryCount+1:H.retryCount,L=Math.min(1000*2**H.retryCount,60000),C=M?Z+L:H.scheduledFor;if((await this.db.update(Y).set({status:M?K.PENDING:K.FAILED,retryCount:X,lastError:A.message,scheduledFor:C,completedAt:M?null:Z,runtimeUpdatedAt:M?H.runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z),startedAt:M?null:H.startedAt,attemptId:null,workerSlotId:null,workerSessionId:null,leaseExpiresAt:null,attemptHeartbeatAt:null}).where(E(this.attemptWriteGuard(f,$),B(Y.retryCount,H.retryCount))).returning({id:Y.id})).length!==1)return!1;if(M)this.logger.debug("Job scheduled for retry",{jobId:f,retryCount:X,backoffMs:L,scheduledFor:new Date(C).toISOString()});else this.logger.error("Job failed after max retries",{jobId:f,type:H.type,retryCount:H.retryCount,error:A.message});return!0}async getStatus(f){return(await this.db.select().from(Y).where(B(Y.id,f)).limit(1))[0]??null}async getStatusByEntityId(f){return(await this.db.select().from(Y).where(J`json_extract(${Y.data}, '$.id') = ${f}`).orderBy(i(Y.createdAt)).limit(1))[0]??null}async getStats(){let f=await this.db.select({status:Y.status,count:J`count(*)`}).from(Y).groupBy(Y.status),A={pending:0,processing:0,failed:0,completed:0,total:0};for(let $ of f){let Z=Number($.count);A[$.status]=Z,A.total+=Z}return A}async getDiagnostics(f=Date.now()){let A=f-Df,[$,Z,V]=await Promise.all([this.db.select({type:Y.type,status:Y.status,count:J`count(*)`}).from(Y).groupBy(Y.type,Y.status),this.db.select({oldestPendingAt:J`min(case when ${Y.status} = ${K.PENDING} then ${Y.createdAt} end)`,oldestProcessingAt:J`min(case when ${Y.status} = ${K.PROCESSING} then ${Y.startedAt} end)`,staleLeaseCount:J`coalesce(sum(case when ${Y.status} = ${K.PROCESSING} and ${Y.leaseExpiresAt} is not null and ${Y.leaseExpiresAt} <= ${f} then 1 else 0 end), 0)`}).from(Y),this.db.select({total:J`count(*)`,active:J`coalesce(sum(case when ${k.heartbeatAt} > ${A} then 1 else 0 end), 0)`,stale:J`coalesce(sum(case when ${k.heartbeatAt} <= ${A} then 1 else 0 end), 0)`,latestHeartbeatAt:J`max(${k.heartbeatAt})`}).from(k)]),H={pending:0,processing:0,completed:0,failed:0},M=$.map((N)=>{let F=Number(N.count);return H[N.status]+=F,{type:N.type,status:N.status,count:F}}),X=Z[0],L=V[0],C=(N)=>N===null||N===void 0?null:Math.max(0,f-Number(N));return{totals:H,byType:M,oldestPendingAgeMs:C(X?.oldestPendingAt),oldestProcessingAgeMs:C(X?.oldestProcessingAt),staleLeaseCount:Number(X?.staleLeaseCount??0),workerSessions:{total:Number(L?.total??0),active:Number(L?.active??0),stale:Number(L?.stale??0),latestHeartbeatAgeMs:C(L?.latestHeartbeatAt)}}}async getRuntimeUpdates(f,A){return(await this.db.select().from(Y).where(J`(${Y.runtimeUpdatedAt}, ${Y.id}) > (${f.updatedAt}, ${f.jobId})`).orderBy($f(Y.runtimeUpdatedAt),$f(Y.id)).limit(A)).map((Z)=>({job:Z,cursor:{updatedAt:Z.runtimeUpdatedAt??0,jobId:Z.id}}))}async cleanup(f){let A=Date.now()-f;return(await this.db.delete(Y).where(E(Yf(B(Y.status,K.COMPLETED),B(Y.status,K.FAILED)),Of(Y.completedAt,A)))).rowsAffected}async getActiveJobs(f){let A=Yf(B(Y.status,K.PENDING),B(Y.status,K.PROCESSING)),$=f&&f.length>0?E(A,kf(Y.type,f)):A;return this.db.select().from(Y).where($).orderBy(i(Y.createdAt))}async getFailedJobs(f){let A=B(Y.status,K.FAILED),$=f&&f.length>0?E(A,kf(Y.type,f)):A;return this.db.select().from(Y).where($).orderBy(i(Y.createdAt))}async claimNextReady(f){let{now:A,attemptId:$,workerSlotId:Z,workerSessionId:V,leaseDurationMs:H,workerSessionTimeoutMs:M,executableTypes:X}=f,L=A-M,C=this.db.select({slotId:k.slotId}).from(k).where(E(B(k.slotId,Z),B(k.sessionId,V))),N=this.db.select({slotId:k.slotId}).from(k).where(E(B(k.slotId,Y.workerSlotId),B(k.sessionId,Y.workerSessionId))),F=this.db.select({slotId:k.slotId}).from(k).where(E(B(k.slotId,Y.workerSlotId),B(k.sessionId,Y.workerSessionId),Of(k.heartbeatAt,L))),W=E(B(Y.status,K.PROCESSING),Yf(M$(Y.attemptId),EZ(N),E(Of(Y.leaseExpiresAt,A),X$(F)))),R=J`${Y.status} = ${K.PROCESSING} AND ${Y.retryCount} + 1 > ${Y.maxRetries}`,q=this.db.select({id:Y.id}).from(Y).where(E(kf(Y.type,X),Yf(E(B(Y.status,K.PENDING),Of(Y.scheduledFor,A)),W))).orderBy($f(Y.priority),$f(Y.createdAt)).limit(1),I=(await this.db.update(Y).set({status:J`CASE WHEN ${R} THEN ${K.FAILED} ELSE ${K.PROCESSING} END`,retryCount:J`CASE WHEN ${Y.status} = ${K.PROCESSING} THEN ${Y.retryCount} + 1 ELSE ${Y.retryCount} END`,lastError:J`CASE WHEN ${Y.status} = ${K.PROCESSING} THEN 'Attempt lease expired' ELSE ${Y.lastError} END`,startedAt:J`CASE WHEN ${R} THEN ${Y.startedAt} ELSE ${A} END`,completedAt:J`CASE WHEN ${R} THEN ${A} ELSE NULL END`,attemptId:J`CASE WHEN ${R} THEN ${Y.attemptId} ELSE ${$} END`,workerSlotId:J`CASE WHEN ${R} THEN ${Y.workerSlotId} ELSE ${Z} END`,workerSessionId:J`CASE WHEN ${R} THEN ${Y.workerSessionId} ELSE ${V} END`,leaseExpiresAt:J`CASE WHEN ${R} THEN ${Y.leaseExpiresAt} ELSE ${A+H} END`,attemptHeartbeatAt:J`CASE WHEN ${R} THEN ${Y.attemptHeartbeatAt} ELSE ${A} END`,runtimeUpdatedAt:J`CASE WHEN ${R} THEN ${this.nextRuntimeUpdatedAt(A)} ELSE ${Y.runtimeUpdatedAt} END`}).where(E(kf(Y.id,q),X$(C))).returning())[0];if(I?.status!==K.PROCESSING)return null;return this.logger.debug("Job claimed",{jobId:I.id,attemptId:I.attemptId,workerSlotId:Z,workerSessionId:V}),I}nextRuntimeUpdatedAt(f){return J`max(${f}, coalesce((select max(${Y.runtimeUpdatedAt}) from ${Y}), 0) + 1)`}attemptWriteGuard(f,A){return A?E(B(Y.id,f),B(Y.status,K.PROCESSING),B(Y.attemptId,A)):E(B(Y.id,f),M$(Y.attemptId),Yf(B(Y.status,K.PENDING),B(Y.status,K.PROCESSING)))}}import{AsyncLocalStorage as m1}from"async_hooks";class Ff{storage=new m1;static createFresh(){return new Ff}constructor(){}current(){return this.storage.getStore()}run(f,A,$){if(A.length===0)throw Error("Operation ID must not be empty");let Z=Uf.parse(f),V=S1(Z);return this.storage.run(Object.freeze({provenance:V,operationId:A}),$)}}function S1(f){if(Object.freeze(f.projectionLineage),f.sourceEntity)Object.freeze(f.sourceEntity);return Object.freeze(f)}class C${client;logger;handlerRegistry;repository;walInitialization=null;walInitializationSettled=!1;closeRequested=!1;clientClosed=!1;inFlightEnqueues=0;databaseUrl;operationContext;projectionAdmission;directWorkerSlotId=`direct:${b()}`;directWorkerSessionId=b();directLeaseDurationMs;directSessionStart=null;close(){this.closeRequested=!0,this.closeClientWhenReady()}static createFresh(f,A,$){return new C$(f,A??tf.getInstance(),$)}constructor(f,A,$){let{db:Z,client:V,url:H}=SZ(f);this.client=V,this.databaseUrl=H,this.logger=A.child("JobQueueService"),this.operationContext=$?.operationContext??Ff.createFresh(),this.projectionAdmission=$?.projectionAdmission,this.handlerRegistry=new V$(this.logger,$?.handlerRegistrationMode??"combined"),this.repository=new L$(Z,V,H,this.logger),this.directLeaseDurationMs=f.claimTimeoutMs??300000}initialize(){if(this.closeRequested)return Promise.resolve();return this.walInitialization??=this.initializeWALMode(),this.walInitialization}async initializeWALMode(){try{await nf(this.client,this.databaseUrl)}catch(f){this.logger.warn("Failed to enable WAL mode (non-fatal)",f)}finally{this.walInitializationSettled=!0,this.closeClientWhenReady()}}closeClientWhenReady(){if(!this.closeRequested||this.inFlightEnqueues>0||this.walInitialization!==null&&!this.walInitializationSettled)return;this.closeClient()}closeClient(){if(this.clientClosed)return;this.clientClosed=!0,this.client.close()}registerHandler(f,A,$){this.handlerRegistry.registerHandler(f,A,$)}unregisterHandler(f){this.handlerRegistry.unregisterHandler(f)}unregisterPluginHandlers(f){this.handlerRegistry.unregisterPluginHandlers(f)}getRegisteredTypes(){return this.handlerRegistry.getRegisteredTypes()}getHandler(f){return this.handlerRegistry.getHandler(f)}getValidator(f){return this.handlerRegistry.getValidator(f)}finalizeHandlerRegistrations(){return this.handlerRegistry.finalizeRegistrations()}getExecutionRegistrations(){return this.handlerRegistry.getExecutionRegistrations()}async enqueue(f){if(this.closeRequested)throw Error("Cannot enqueue a job after the queue service is closed");this.inFlightEnqueues++;try{return await this.enqueueValidated(f)}finally{this.inFlightEnqueues--,this.closeClientWhenReady()}}async enqueueValidated(f){let{type:A,data:$,options:Z}=f,V=this.handlerRegistry.getValidator(A);if(!V)throw Error(`No job type declared: ${A}`);let H=V.validateAndParse($);if(H===null)throw Error(`Invalid job data for type: ${A}`);let M=Date.now(),X=b(),L=Z?.rootJobId??this.operationContext.current()?.provenance.rootJobId??X,C=this.createJobProvenance(X,L,Z),N=Z?.metadata??{operationType:"data_processing"},{provenance:F,...W}=N,R={id:X,type:A,data:JSON.stringify(H),status:K.PENDING,priority:Z?.priority??0,maxRetries:Z?.maxRetries??3,retryCount:0,source:Z?.source??null,metadata:{...W,...Z?.deduplicationKey&&{deduplicationKey:Z.deduplicationKey},rootJobId:L,provenance:C},createdAt:M,scheduledFor:Z?.delayMs?M+Z.delayMs:M,result:null,lastError:null,startedAt:null,completedAt:null},q;try{let O=await this.repository.enqueueAtomic({jobData:R,strategy:Z?.deduplication,deduplicationKey:Z?.deduplicationKey,beforeInsert:async()=>{q=await this.projectionAdmission?.reserveJobAdmission(C)}});if(q?.commit(),O.kind==="skipped")this.logger.debug("Skipping duplicate job (already pending)",{type:A,existingJobId:O.jobId});else if(O.kind==="coalesced")this.logger.debug("Coalescing with existing job",{type:A,existingJobId:O.jobId});else{if(O.kind==="replaced")this.logger.debug("Replacing duplicate job",{type:A,oldJobId:O.replacedJobId});this.logger.debug("Job enqueued",{id:O.jobId,type:A,priority:R.priority,rootJobId:R.metadata.rootJobId})}return O.jobId}catch(O){throw q?.rollback(),this.logger.error("Failed to enqueue job",{type:A,error:S(O)}),O}}createJobProvenance(f,A,$){let Z=this.operationContext.current(),V=$?.metadata.provenance??Z?.provenance,H=V?.rootJobId===A?V:void 0,M=Z?.provenance.rootJobId===A?Z.operationId:void 0,X=$?.projection,L=X?[...H?.projectionLineage??[],X.id]:[...H?.projectionLineage??[]],C=X?.id??H?.projectionId;return Uf.parse({rootJobId:A,causationId:M??H?.causationId??f,...C?{projectionId:C}:{},projectionLineage:L,...X?.sourceEntity?{sourceEntity:X.sourceEntity}:H?.sourceEntity?{sourceEntity:H.sourceEntity}:{},derivationDepth:L.length})}async dequeue(f){let A=this.handlerRegistry.getRegisteredTypes();if(A.length===0)return null;let $=f??await this.getDirectClaimOptions(),Z=Date.now(),V=await this.repository.claimNextReady({...$,now:Z,attemptId:b(),executableTypes:A});if(!V)return null;return this.logger.debug("Job dequeued",{id:V.id,type:V.type,priority:V.priority,retryCount:V.retryCount,attemptId:V.attemptId,workerSlotId:V.workerSlotId,workerSessionId:V.workerSessionId}),V}async startWorkerSession(f,A){await this.repository.startWorkerSession(f,A)}heartbeatWorkerSession(f,A){return this.repository.heartbeatWorkerSession(f,A)}endWorkerSession(f,A){return this.repository.endWorkerSession(f,A)}renewAttemptLease(f,A,$){return this.repository.renewAttemptLease(f,A,Date.now(),$)}recordAttemptProgress(f,A,$){return this.repository.recordAttemptProgress(f,A,$)}complete(f,A,$){return this.repository.complete(f,A,$)}update(f,A,$){return this.repository.update(f,A,$)}fail(f,A,$){return this.repository.fail(f,A,$)}async getDirectClaimOptions(){return this.directSessionStart??=this.repository.startWorkerSession(this.directWorkerSlotId,this.directWorkerSessionId),await this.directSessionStart,{workerSlotId:this.directWorkerSlotId,workerSessionId:this.directWorkerSessionId,leaseDurationMs:this.directLeaseDurationMs,workerSessionTimeoutMs:this.directLeaseDurationMs}}async getStatus(f){return this.repository.getStatus(f)}async getStatusByEntityId(f){return this.repository.getStatusByEntityId(f)}async getStats(){return this.repository.getStats()}getDiagnostics(f){return this.repository.getDiagnostics(f)}getRuntimeUpdates(f,A=1000){return this.repository.getRuntimeUpdates(f,A)}async cleanup(f){let A=await this.repository.cleanup(f);if(A>0)this.logger.info("Cleaned up old jobs",{deletedCount:A,olderThanMs:f});return A}async getActiveJobs(f){return this.repository.getActiveJobs(f)}async getFailedJobs(f){return this.repository.getFailedJobs(f)}}class zZ extends Error{constructor(f,A){super(`Job ${f} exceeded its ${A}ms execution deadline`);this.name="JobDeadlineExceededError"}}class Y${logger;jobQueueService;progressMonitor;config;isRunning=!1;shouldStop=!1;activeJobs=new Set;stats;startTime=0;pollFiber=null;currentPoll=null;workerScope=null;jobFibers=null;activeTransition=null;transitionQueue=[];clock;operationContext;workerSessionId=null;workerHeartbeatTimer=null;workerHeartbeatInFlight=null;static createFresh(f,A,$,Z,V){return new Y$(f,A,$,Z,V)}constructor(f,A,$,Z,V){if(this.logger=$.child("JobQueueWorker"),this.jobQueueService=f,this.progressMonitor=A,this.clock=V?.clock,this.operationContext=V?.operationContext??Ff.createFresh(),this.config={concurrency:Z?.concurrency??1,pollInterval:Z?.pollInterval??1000,maxJobs:Z?.maxJobs??0,autoStart:Z?.autoStart??!1,workerSlotId:Z?.workerSlotId??process.env.BRAIN_JOB_WORKER_SLOT_ID??"default",defaultExecutionTimeoutMs:Z?.defaultExecutionTimeoutMs??300000,cancellationGraceMs:Z?.cancellationGraceMs??5000,errorCallbackTimeoutMs:Z?.errorCallbackTimeoutMs??1e4,leaseDurationMs:Z?.leaseDurationMs??30000,attemptHeartbeatIntervalMs:Z?.attemptHeartbeatIntervalMs??1e4,workerHeartbeatIntervalMs:Z?.workerHeartbeatIntervalMs??5000,workerSessionTimeoutMs:Z?.workerSessionTimeoutMs??Df,onUnhealthy:Z?.onUnhealthy??(()=>{return})},this.stats={processedJobs:0,failedJobs:0,activeJobs:0,uptime:0,isRunning:!1,isHealthy:!0},this.logger.debug("JobQueueWorker initialized",{concurrency:this.config.concurrency,pollInterval:this.config.pollInterval,maxJobs:this.config.maxJobs,autoStart:this.config.autoStart}),this.config.autoStart)this.start().catch((H)=>{this.logger.error("Failed to auto-start JobQueueWorker",{error:H})})}start(){return this.requestTransition("start",!0)}async startWorker(){if(this.isRunning){this.logger.warn("Worker is already running");return}this.logger.debug("Starting JobQueueWorker");let f=b();await this.jobQueueService.startWorkerSession(this.config.workerSlotId,f),this.workerSessionId=f,this.isRunning=!0,this.shouldStop=!1,this.startTime=Date.now(),this.stats.isRunning=!0,this.stats.isHealthy=!0,delete this.stats.unhealthyReason,this.startWorkerHeartbeat(),this.workerScope=P.runSync(h.make()),this.jobFibers=P.runSync(h.extend(Hf.make(),this.workerScope)),this.pollFiber=P.runFork(this.runPollingLoop())}stop(){return this.requestTransition("stop",!0)}async stopWorker(f){if(!this.isRunning){this.logger.warn("Worker is not running");return}if(this.logger.debug("Stopping JobQueueWorker"),this.shouldStop=!0,f.awaitInFlightPoll&&this.pollFiber){let $=this.pollFiber;await P.runPromise(AA.interrupt($)),this.pollFiber=null}if(f.awaitInFlightPoll&&this.currentPoll)await this.currentPoll,this.currentPoll=null;if(this.jobFibers)this.logger.debug("Waiting for active jobs to complete",{activeJobs:this.activeJobs.size}),await P.runPromise(Hf.awaitEmpty(this.jobFibers));await this.closeWorkerScope(),await this.stopWorkerHeartbeat();let A=this.workerSessionId;if(this.workerSessionId=null,A)await this.jobQueueService.endWorkerSession(this.config.workerSlotId,A);this.isRunning=!1,this.stats.isRunning=!1,this.logger.debug("JobQueueWorker stopped")}getStats(){return{...this.stats,activeJobs:this.activeJobs.size,uptime:this.isRunning?Date.now()-this.startTime:0}}isWorkerRunning(){return this.isRunning}isStopRequested(){return this.shouldStop}async processAvailableJobs(){if(!this.isRunning||this.shouldStop)return;try{let f=this.config.concurrency-this.activeJobs.size;if(f<=0)return;if(this.config.maxJobs>0){let Z=this.stats.processedJobs+this.stats.failedJobs,V=this.config.maxJobs-Z-this.activeJobs.size;if(V<=0){this.logger.debug("Maximum job limit reached, stopping worker",{maxJobs:this.config.maxJobs,processedJobs:this.stats.processedJobs,failedJobs:this.stats.failedJobs}),await this.requestTransition("stop",!1);return}f=Math.min(f,V)}let A=[];for(let Z=0;Z<f;Z++){if(this.isStopRequested())break;let V=this.workerSessionId;if(!V)throw Error("Worker session is not available");let H=await this.jobQueueService.dequeue({workerSlotId:this.config.workerSlotId,workerSessionId:V,leaseDurationMs:this.config.leaseDurationMs,workerSessionTimeoutMs:this.config.workerSessionTimeoutMs});if(H)A.push(H);else break}let $=this.jobFibers;if(!$){if(A.length>0)throw Error("Worker job fiber scope is not available");return}for(let Z of A)this.activeJobs.add(Z.id),await P.runPromise(Hf.run($,Z.id,P.promise(()=>this.processJobWrapper(Z))))}catch(f){this.logger.error("Error processing available jobs",{error:f}),this.stats.lastError=S(f)}}async processJobWrapper(f){let A=f.id;try{this.logger.debug("Processing job",{jobId:A,type:f.type,priority:f.priority,retryCount:f.retryCount});let $=await this.processJob(f);if($.status==="completed")this.stats.processedJobs++,this.logger.debug("Job completed successfully",{jobId:A,type:$.type});else this.stats.failedJobs++,this.logger.warn("Job failed",{jobId:A,type:$.type,error:$.error})}catch($){this.stats.failedJobs++,this.logger.error("Error processing job",{jobId:A,type:f.type,error:$}),this.stats.lastError=S($)}finally{this.activeJobs.delete(A)}}runPollingLoop(){let A=P.suspend(()=>{if(!this.isWorkerRunning()||this.isStopRequested())return P.interrupt;return this.currentPoll=this.processAvailableJobs(),P.promise(()=>this.currentPoll??Promise.resolve()).pipe(P.andThen(P.suspend(()=>{return this.currentPoll=null,!this.isWorkerRunning()||this.isStopRequested()?P.interrupt:P.void})))}).pipe(P.schedule($A.spaced(this.config.pollInterval)),P.asVoid);return(this.clock?P.withClock(A,this.clock):A).pipe(P.ensuring(P.sync(()=>{this.pollFiber=null})))}requestTransition(f,A){let $=this.transitionQueue.at(-1)??this.activeTransition;if($?.kind===f)return $.promise;let Z=()=>{return},V=()=>{return},H=new Promise((X,L)=>{Z=X,V=L}),M={kind:f,awaitInFlightPoll:A,promise:H,resolve:Z,reject:V};return this.transitionQueue.push(M),this.runNextTransition(),H}runNextTransition(){if(this.activeTransition)return;let f=this.transitionQueue.shift();if(!f)return;this.activeTransition=f,(f.kind==="start"?this.startWorker():this.stopWorker({awaitInFlightPoll:f.awaitInFlightPoll})).then(()=>this.completeTransition(f,!0),($)=>this.completeTransition(f,!1,$))}completeTransition(f,A,$){if(this.activeTransition!==f)return;if(this.activeTransition=null,A)f.resolve();else f.reject($);queueMicrotask(()=>this.runNextTransition())}async closeWorkerScope(){let f=this.workerScope;if(this.workerScope=null,this.jobFibers=null,f)await P.runPromise(h.close(f,g.void))}startWorkerHeartbeat(){this.workerHeartbeatTimer=setInterval(()=>{let f=this.workerSessionId;if(!f||this.workerHeartbeatInFlight)return;this.workerHeartbeatInFlight=this.jobQueueService.heartbeatWorkerSession(this.config.workerSlotId,f).then((A)=>{if(!A)this.markUnhealthy("Worker session was superseded")}).catch((A)=>{this.markUnhealthy(`Worker session heartbeat failed: ${S(A)}`)}).finally(()=>{this.workerHeartbeatInFlight=null})},Math.max(1,this.config.workerHeartbeatIntervalMs))}async stopWorkerHeartbeat(){if(this.workerHeartbeatTimer)clearInterval(this.workerHeartbeatTimer),this.workerHeartbeatTimer=null;await this.workerHeartbeatInFlight,this.workerHeartbeatInFlight=null}startAttemptHeartbeat(f,A){let $=f.attemptId;if(!$)return async()=>{return};let Z=null,V=!1,H=setInterval(()=>{if(V||Z)return;Z=this.jobQueueService.renewAttemptLease(f.id,$,this.config.leaseDurationMs).then((M)=>{if(M)return;let X=Error("Job attempt was superseded");A.abort(X),this.markUnhealthy(X.message)}).catch((M)=>{let X=Nf(M);A.abort(X),this.markUnhealthy(`Attempt lease heartbeat failed: ${X.message}`)}).finally(()=>{Z=null})},Math.max(1,this.config.attemptHeartbeatIntervalMs));return async()=>{if(V)return;V=!0,clearInterval(H),await Z}}markUnhealthy(f){if(!this.stats.isHealthy)return;this.stats.isHealthy=!1,this.stats.unhealthyReason=f,this.stats.lastError=f,this.shouldStop=!0,this.logger.error("Job queue worker is unhealthy",{reason:f});try{this.config.onUnhealthy(f)}catch(A){this.logger.error("Job queue worker unhealthy callback failed",{reason:f,error:S(A)})}}async executeWithDeadline(f,A,$,Z){let V=Promise.resolve().then(Z).then((W)=>({kind:"success",value:W}),(W)=>({kind:"failure",error:W})),H,M=new Promise((W)=>{H=setTimeout(()=>W({kind:"deadline"}),Math.max(1,A))}),X=await Promise.race([V,M]);if(X.kind!=="deadline"){if(H)clearTimeout(H);if(X.kind==="failure")throw X.error;return X.value}let L=new zZ(f,A);$.abort(L);let C,N=new Promise((W)=>{C=setTimeout(()=>W({kind:"grace-expired"}),Math.max(1,this.config.cancellationGraceMs))});if((await Promise.race([V,N])).kind!=="grace-expired"){if(C)clearTimeout(C);throw L}throw this.markUnhealthy(`${L.message}; handler ignored cancellation grace`),await V,L}processJob(f){let A=f.metadata.provenance??{rootJobId:f.metadata.rootJobId,causationId:f.id,projectionLineage:[],derivationDepth:0};return this.operationContext.run(A,f.id,()=>this.processJobWithinContext(f))}async processJobWithinContext(f){let A=f.attemptId;if(!A){let X=Error(`Claimed job ${f.id} has no attempt fencing token`);return this.markUnhealthy(X.message),{jobId:f.id,type:f.type,status:K.FAILED,error:X.message}}let $=this.jobQueueService.getHandler(f.type);if(!$){let X=Error(`No handler registered for job type: ${f.type}`);return await this.jobQueueService.fail(f.id,X,A),{jobId:f.id,type:f.type,status:K.FAILED,error:X.message}}let Z=new AbortController,V=this.startAttemptHeartbeat(f,Z),H=!1,M=async()=>{if(H)return;H=!0,await V()};try{this.logger.debug("Processing job",{jobId:f.id,type:f.type,attemptId:A});let X=JSON.parse(f.data),L=$.validateAndParse(X);if(L===null)throw Error(`Invalid job data for type: ${f.type}`);let C=this.progressMonitor.createProgressReporter(f.id,A),N=$.executionTimeoutMs??this.config.defaultExecutionTimeoutMs,F=await this.executeWithDeadline(f.type,N,Z,()=>$.process(L,f.id,C,Z.signal));await M();let W=U$.safeParse(F);if(W.success){let q=W.data.error??"Handler returned failure",O=Error(q);if(await this.jobQueueService.fail(f.id,O,A))await this.emitTerminalFailure(f,O,$,A);return{jobId:f.id,type:f.type,status:K.FAILED,error:q}}if(!await this.jobQueueService.complete(f.id,F,A))return{jobId:f.id,type:f.type,status:K.FAILED,error:"Job attempt no longer owns the claim"};return await this.progressMonitor.handleJobStatusChange(f.id,"completed",f.metadata),{jobId:f.id,type:f.type,status:K.COMPLETED,result:F}}catch(X){let L=Nf(X);await M();try{let N=JSON.parse(f.data),F=$.validateAndParse(N);if(F!==null&&$.onError){let W=this.progressMonitor.createProgressReporter(f.id,A),R=new AbortController;await this.executeWithDeadline(`${f.type}:onError`,this.config.errorCallbackTimeoutMs,R,()=>$.onError?.(L,F,f.id,W,R.signal)??Promise.resolve())}}catch(N){this.logger.error("Job handler error callback failed",{jobId:f.id,error:N})}if(await this.jobQueueService.fail(f.id,L,A))await this.emitTerminalFailure(f,L,$,A);return{jobId:f.id,type:f.type,status:K.FAILED,error:L.message}}}async emitTerminalFailure(f,A,$,Z){if((await this.jobQueueService.getStatus(f.id))?.status!==K.FAILED)return;if($.onTerminalError)try{let H=$.validateAndParse(JSON.parse(f.data));if(H!==null){let M=this.progressMonitor.createProgressReporter(f.id,Z),X=new AbortController;await this.executeWithDeadline(`${f.type}:onTerminalError`,this.config.errorCallbackTimeoutMs,X,()=>$.onTerminalError?.(A,H,f.id,M,X.signal)??Promise.resolve())}}catch(H){this.logger.error("Job handler terminal error callback failed",{jobId:f.id,error:H})}await this.progressMonitor.handleJobStatusChange(f.id,"failed",f.metadata)}}var E1=86400000,yZ=3600000;class F${jobQueue;logger;batches=new Map;cleanupFiber=null;cleanupSupervisor=null;inFlightCleanups=new Set;activeTransition=null;transitionQueue=[];acceptingCleanup=!0;clock;static createFresh(f,A,$){return new F$(f,A,$)}constructor(f,A,$){this.jobQueue=f,this.logger=A,this.clock=$?.clock}start(f=yZ){return this.requestTransition("start",f)}stop(){return this.requestTransition("stop",yZ)}async startCleanup(f){if(this.acceptingCleanup=!0,this.cleanupFiber)return;this.cleanupFiber=P.runFork(this.runCleanupLoop(f))}runCleanupLoop(f){let A=this.cleanupTerminalBatchMetadata().pipe(P.schedule($A.spaced(f)),P.asVoid);return this.clock?P.withClock(A,this.clock):A}scheduleTerminalBatchCleanup(){if(!this.acceptingCleanup)return;this.cleanupSupervisor??=this.createCleanupSupervisor();let f=P.runFork(this.cleanupTerminalBatchMetadata());ZA.unsafeAdd(this.cleanupSupervisor.fibers,f)}async stopCleanup(){this.acceptingCleanup=!1;let f=this.cleanupFiber;if(this.cleanupFiber=null,f)await P.runPromise(AA.interrupt(f));let A=this.cleanupSupervisor;if(A)await P.runPromise(ZA.awaitEmpty(A.fibers));while(this.inFlightCleanups.size>0)await Promise.allSettled(this.inFlightCleanups);if(A)await P.runPromise(h.close(A.scope,g.void)),this.cleanupSupervisor=null}requestTransition(f,A){let $=this.transitionQueue.at(-1)??this.activeTransition;if($?.kind===f)return $.promise;let Z=()=>{return},V=()=>{return},H=new Promise((X,L)=>{Z=X,V=L}),M={kind:f,intervalMs:A,promise:H,resolve:Z,reject:V};return this.transitionQueue.push(M),this.runNextTransition(),H}runNextTransition(){if(this.activeTransition)return;let f=this.transitionQueue.shift();if(!f)return;this.activeTransition=f,(f.kind==="start"?this.startCleanup(f.intervalMs):this.stopCleanup()).then(()=>this.completeTransition(f,!0),($)=>this.completeTransition(f,!1,$))}completeTransition(f,A,$){if(this.activeTransition!==f)return;if(this.activeTransition=null,A)f.resolve();else f.reject($);queueMicrotask(()=>this.runNextTransition())}createCleanupSupervisor(){let f=P.runSync(h.make()),A=P.runSync(h.extend(ZA.make(),f));return{scope:f,fibers:A}}cleanupTerminalBatchMetadata(){return P.tryPromise({try:()=>{let f=this.cleanup(E1);return this.inFlightCleanups.add(f),f.then(()=>this.inFlightCleanups.delete(f),()=>this.inFlightCleanups.delete(f)),f},catch:(f)=>f}).pipe(P.asVoid,P.catchAll((f)=>P.sync(()=>{this.logger.warn("Failed to clean up terminal batch metadata",{error:f})})))}validateOperations(f){for(let A of f){let $=this.jobQueue.getValidator(A.type);if(!$)throw Error(`No job type declared: ${A.type}`);if($.validateAndParse(A.data)===null)throw Error(`Invalid job data for type: ${A.type}`)}}async enqueueBatch(f,A,$,Z){if(f.length===0)throw Error("Cannot enqueue empty batch");this.validateOperations(f);let V=[];this.batches.set($,{jobIds:V,operations:f,source:A.source,startedAt:new Date().toISOString(),metadata:{...A.metadata,rootJobId:$}});try{for(let H of f){let M={...A,rootJobId:$,metadata:{...A.metadata,operationTarget:H.type}},X=await this.jobQueue.enqueue({type:H.type,data:H.data,options:M});V.push(X)}return this.logger.debug("Enqueued batch operations",{batchId:$,operationCount:f.length,jobIds:V,rootJobId:$}),this.scheduleTerminalBatchCleanup(),$}catch(H){throw this.batches.delete($),this.logger.error("Failed to enqueue batch operations",{error:H,operationCount:f.length,enqueuedJobs:V.length}),H}}async getBatchStatus(f){let A=this.batches.get(f);if(!A)return null;try{let $=await Promise.all(A.jobIds.map((C)=>this.jobQueue.getStatus(C))),Z=0,V=0,H=0,M=[];for(let[C,N]of $.entries()){if(!N){V++;let F=A.operations[C],W=A.jobIds[C]??"unknown";M.push(`Missing job ${W}${F?` for ${F.type}`:""}`);continue}switch(N.status){case"completed":Z++;break;case"failed":if(V++,N.lastError)M.push(N.lastError);break;case"processing":case"pending":H++;break}}H+=A.operations.length-A.jobIds.length;let X;if(H>0)X=K.PROCESSING;else if(V>0)X=K.FAILED;else X=K.COMPLETED;if(A.terminalAt===void 0&&(X===K.COMPLETED||X===K.FAILED))A.terminalAt=Date.now();let L;for(let C=0;C<A.jobIds.length;C++){let N=$[C];if(N&&N.status!=="completed"&&N.status!=="failed"){let F=A.operations[C];if(F)L=`Processing ${F.type}`;break}}return{batchId:f,totalOperations:A.operations.length,completedOperations:Z,failedOperations:V,errors:M,status:X,currentOperation:L,metadata:A.metadata}}catch($){throw this.logger.error("Failed to get batch status",{batchId:f,error:$}),$}}async cleanup(f){let A=Date.now()-f,$=0;for(let[Z,V]of this.batches.entries()){if(V.terminalAt!==void 0){if(V.terminalAt<=A)this.batches.delete(Z),$++;continue}if(new Date(V.startedAt).getTime()<=A){let M=await this.getBatchStatus(Z);if(M&&(M.status===K.COMPLETED||M.status===K.FAILED))this.batches.delete(Z),$++}}return this.logger.debug("Cleaned up batch metadata",{cleaned:$}),$}registerBatch(f,A,$,Z,V){this.batches.set(f,{jobIds:A,operations:$,source:Z,startedAt:new Date().toISOString(),metadata:V}),this.logger.debug("Registered batch metadata",{batchId:f,operationCount:$.length,jobIds:A})}async getActiveBatches(){let f=[];try{for(let[A,$]of this.batches){let Z=await this.getBatchStatus(A);if(Z&&(Z.status==="pending"||Z.status==="processing"))f.push({batchId:A,status:Z,metadata:{operations:$.operations,source:$.source,startedAt:$.startedAt,metadata:$.metadata}})}return this.logger.debug("Retrieved active batches",{count:f.length}),f}catch(A){throw this.logger.error("Failed to get active batches",{error:A}),A}}}var z1=U.preprocess((f)=>{if(typeof f!=="string")return f;return JSON.parse(f)},U.record(U.string(),U.unknown()));class N${jobQueueService;messageBus;batchJobManager;logger;mode;pollTimer;pollCursor={updatedAt:0,jobId:""};polling=!1;static createFresh(f,A,$,Z,V="combined"){return new N$(f,A,$,Z,V)}constructor(f,A,$,Z,V){this.jobQueueService=f,this.messageBus=A,this.batchJobManager=$,this.logger=Z,this.mode=V}start(){if(this.mode==="durable-reader"&&!this.pollTimer){this.pollCursor={updatedAt:Date.now(),jobId:""},this.pollTimer=setInterval(()=>{this.pollDurableUpdates()},250),this.pollTimer.unref(),this.logger.debug("Job progress monitor ready (durable polling mode)");return}this.logger.debug("Job progress monitor ready (event-driven mode)")}stop(){if(this.pollTimer)clearInterval(this.pollTimer);this.pollTimer=void 0,this.logger.debug("Job progress monitor stopped")}async pollDurableUpdates(){if(this.polling)return;this.polling=!0;try{let f=await this.jobQueueService.getRuntimeUpdates(this.pollCursor,100);for(let A of f)if(this.pollCursor=A.cursor,A.job.status==="processing"&&A.job.progress)await this.publishJobProgress(A.job,A.job.progress);else if(A.job.status==="completed"||A.job.status==="failed")await this.handleJobStatusChange(A.job.id,A.job.status,A.job.metadata)}catch(f){this.logger.error("Failed to poll durable job progress",{error:f})}finally{this.polling=!1}}createProgressReporter(f,A){let $=s.from(async(Z)=>{await this.emitJobProgress(f,Z,A)});if(!$)throw Error("Failed to create ProgressReporter");return $}async emitBatchProgress(f,A,$){try{let Z={totalOperations:A.totalOperations,completedOperations:A.completedOperations,failedOperations:A.failedOperations,currentOperation:A.currentOperation??"Processing batch...",errors:A.errors},V={id:f,type:"batch",status:A.status,metadata:$,batchDetails:Z};if(A.totalOperations>0)V.progress={current:A.completedOperations,total:A.totalOperations,percentage:Math.round(A.completedOperations/A.totalOperations*100)};await this.messageBus.send({type:Jf.progress,payload:V,sender:"job-progress-monitor",broadcast:!0}),this.logger.debug("Emitted batch progress update",{batchId:f,status:A.status,progress:`${A.completedOperations}/${A.totalOperations}`})}catch(Z){this.logger.error("Error emitting batch progress update",{batchId:f,error:Z})}}isBatchChild(f,A){return!!A&&A!==f}async broadcastEvent(f){await this.messageBus.send({type:Jf.progress,payload:f,sender:"job-progress-monitor",broadcast:!0})}async emitJobProgress(f,A,$){try{if($&&!await this.jobQueueService.recordAttemptProgress(f,$,A)){this.logger.debug("Discarding progress from obsolete job attempt",{jobId:f,attemptId:$});return}if(this.mode==="durable-writer")return;let Z=await this.jobQueueService.getStatus(f);if(!Z){this.logger.warn("Job not found for progress update",{jobId:f});return}await this.publishJobProgress(Z,A)}catch(Z){this.logger.error("Error emitting job progress",{jobId:f,error:Z})}}async publishJobProgress(f,A){if(f.metadata.silent)return;if(this.isBatchChild(f.id,f.metadata.rootJobId))return;let $=A.total??0,Z={id:f.id,type:"job",status:"processing",metadata:f.metadata,message:A.message};if($>0)Z.progress={current:A.progress,total:$,percentage:Math.round(A.progress/$*100)};await this.broadcastEvent(Z)}async emitJobCompletion(f){if(this.mode!=="durable-writer")await this.emitJobStatusEvent(f,"completed")}async emitJobFailure(f){if(this.mode!=="durable-writer")await this.emitJobStatusEvent(f,"failed")}async emitJobStatusEvent(f,A){try{let $=await this.jobQueueService.getStatus(f);if(!$){this.logger.warn(`Cannot emit ${A} for unknown job`,{jobId:f});return}if($.metadata.silent)return;if(this.isBatchChild(f,$.metadata.rootJobId)){this.logger.debug(`Skipping individual job ${A} for batch operation`,{jobId:f,rootJobId:$.metadata.rootJobId});return}let Z={id:f,type:"job",status:A,message:this.extractStatusMessage($,A),metadata:$.metadata,jobDetails:{jobType:$.type,priority:$.priority,retryCount:$.retryCount}};await this.broadcastEvent(Z),this.logger.debug(`Emitted job ${A} event`,{jobId:f})}catch($){this.logger.error(`Error emitting job ${A} event`,{jobId:f,error:$})}}extractStatusMessage(f,A){if(A==="failed")return f.lastError??void 0;if(!f.result)return;try{let $=z1.parse(f.result),Z=$.message;if(Z)return String(Z);let V=$.routesBuilt;if(V!==void 0)return`${V} routes built`}catch{}return}getStats(){return{isRunning:!0}}async handleJobStatusChange(f,A,$){if(this.mode==="durable-writer")return;let Z=$?Vf.safeParse($):void 0,V=Z?.success?Z.data:void 0;if(V?.silent)return;try{if(await this.emitJobStatusEvent(f,A),V&&this.isBatchChild(f,V.rootJobId))try{let H=V.rootJobId,M=await this.batchJobManager.getBatchStatus(H);if(M){let X=M.metadata??V;await this.emitBatchProgress(H,M,X)}}catch(H){this.logger.warn("Failed to emit batch progress",{jobId:f,rootJobId:V.rootJobId,error:H})}}catch(H){this.logger.error("Failed to handle job status change",{jobId:f,status:A,error:H})}}}var y1=U.record(U.string(),U.unknown());class xf{logger;schema;jobTypeName;executionTimeoutMs;constructor(f,A){this.logger=f,this.schema=A.schema,this.jobTypeName=A.jobTypeName,this.executionTimeoutMs=A.executionTimeoutMs}validateAndParse(f){if(!this.schema)throw Error(`${this.jobTypeName}: No schema provided. Override validateAndParse() or provide a schema.`);let A=this.schema.safeParse(f);if(!A.success)return this.logger.warn(`Invalid ${this.jobTypeName} job data`,{data:f,validationError:A.error.issues}),null;return this.logger.debug(`${this.jobTypeName} job data validation successful`,{data:this.summarizeDataForLog(A.data)}),A.data}async onError(f,A,$,Z,V){this.logger.error(`${this.jobTypeName} job error handler triggered`,{jobId:$,errorMessage:f.message,errorStack:f.stack,data:this.summarizeDataForLog(A)})}async reportProgress(f,A){await f.report({progress:A.progress,total:A.total??100,message:A.message})}summarizeDataForLog(f){let A=y1.safeParse(f);return A.success?A.data:{}}}function P$(f,A,$){return async(Z)=>{let{type:V,data:H,toolContext:M=null,options:X,projection:L}=Z,C=M?jZ(M):void 0,{metadata:N,...F}=X??{},W={operationType:"data_processing",pluginId:A,...N,...M&&{interfaceType:M.interfaceType,conversationId:M.conversationId,channelId:M.channelId,requestedByActor:M.actor,...C?{requestedByUserId:C}:{},requestedByInterface:M.interfaceType}};if(M&&!C)delete W.requestedByUserId;let R={...F,source:A,...X?.rootJobId&&{rootJobId:X.rootJobId},...L&&{projection:L},metadata:W},q=$&&!V.includes(":")?`${A}:${V}`:V;return f.enqueue({type:q,data:H,options:R})}}function K$(f,A){return async($,Z)=>{let V=b(),H=$.map((X)=>({...X,type:X.type.includes(":")?X.type:`${A}:${X.type}`})),M={...Z,source:A,rootJobId:V,metadata:{...Z?.metadata,operationType:"batch_processing",pluginId:A}};return await f.enqueueBatch(H,M,V,A),V}}function G$(f,A){return($,Z)=>{let V=$.includes(":")?$:`${A}:${$}`;f.registerHandler(V,Z,A)}}var j1=U.custom((f)=>typeof f==="object"&&f!==null&&("safeParse"in f)),h1=U.object({name:U.string(),schema:j1});function hZ(f){return h1.safeParse(f).success}function v1(f){if(!f)return;return{status:f.status,message:f.message,lastCheck:f.lastCheck?.toISOString(),details:f.details}}function vZ(f){return{model:f.model,version:f.version,uptime:f.uptime,entities:f.entities,entityCounts:f.entityCounts,embeddings:f.embeddings,ai:f.ai,daemons:f.daemons.map((A)=>({name:A.name,pluginId:A.pluginId,status:A.status,health:v1(A.health)})),endpoints:f.endpoints,interactions:f.interactions}}function u1(f){let A=Cf.safeParse(f);return A.success?A.data:"user"}function UA(f){let A=ff(f.metadata),$=typeof A.channelName==="string"?A.channelName:void 0;return{id:f.id,sessionId:f.sessionId,interfaceType:f.interfaceType,channelId:f.channelId,...f.personId?{personId:f.personId}:{},channelName:$,startedAt:f.started,lastActiveAt:f.lastActive,createdAt:f.created,updatedAt:f.updated,metadata:A}}function uZ(f){return{id:f.id,conversationId:f.conversationId,role:u1(f.role),content:f.content,timestamp:f.timestamp,metadata:ff(f.metadata)}}function bZ(f){return iA.parse(f)}function gZ(f){return sA.parse(f)}function IZ(f){return async()=>{return vZ(await f.getAppInfo())}}function cZ(f,A){return{get:()=>bZ(f.getIdentity()),getProfile:()=>gZ(f.getProfile()),getAppInfo:A}}function pZ(f,A){let $=f.getProfileKindRegistry();return{register:(Z)=>{$.register(A,Z)},getResolved:()=>$.getResolved(),getSelectedDefinition:()=>$.getSelectedDefinition()}}function Q$(f){let A=f.getChannelRegistry();return{listDescriptors:()=>A.listDescriptors(),getDescriptor:($)=>A.getDescriptor($),getDeliveryProvider:($)=>A.getDeliveryProvider($)}}function lZ(f,A){let $=f.getInboxRegistry();return{registerSource:(Z)=>{$.registerSource(A,Z)},listSources:()=>$.listSources(),getSource:(Z)=>$.getSource(Z)}}function nZ(f,A){let $=f.getChannelRegistry();return{...Q$(f),registerDescriptor:(Z)=>{$.registerDescriptor(A,Z)},registerDeliveryProvider:(Z)=>{$.registerDeliveryProvider(A,Z)}}}function dZ(f,A,$,Z=!1){let V=f.getMessageBus();return{send:async(M)=>{return V.send({...M,sender:A})},subscribe:(M,X)=>{if(Z)return()=>{};if(hZ(M)){let L=M,C=X,N=async(F)=>{let W=L.schema.safeParse(F.payload);if(!W.success)return $.warn(`Invalid payload for channel ${L.name}`,{error:W.error.message}),{noop:!0};let{payload:R,...q}=F;return C(W.data,q)};return V.subscribe(L.name,N)}return V.subscribe(M,X)},subscribeExecution:(M,X)=>V.subscribe(M,X)}}function iZ(f,A){let $=f.getJobQueueService();return{...f.jobs,enqueue:P$($,A,!0),enqueueBatch:K$(f.jobs,A),registerHandler:G$($,A)}}function sZ(f){let A=f.getPermissionService();return{assertEntityActionAllowed:($,Z,V)=>{A.assertEntityActionAllowed($,Z,V.userPermissionLevel)}}}function oZ(f){return{get:async(A)=>{let Z=await f.getConversationService().getConversation(A);return Z?UA(Z):null},search:async(A)=>{return(await f.getConversationService().searchConversations(A)).map(UA)},list:async(A)=>{return(await f.getConversationService().listConversations(A)).map(UA)},getMessages:async(A,$)=>{return(await f.getConversationService().getMessages(A,$)).map(uZ)},countMessages:async(A)=>{return f.getConversationService().countMessages(A)}}}function aZ(f,A){return{registerHandler:($,Z)=>{f.registerEvalHandler(A,$,Z)}}}function rZ(f){return{register:(A,$)=>{f.getInsightsRegistry().register(A,$)}}}function tZ(f){return{has:(A)=>f.getPluginPackageName(A)!==void 0}}function eZ(f,A){return{register:($)=>{f.registerEndpoint({...$,pluginId:A})}}}function fU(f,A){return{register:($)=>{f.registerInteraction({...$,pluginId:A})}}}function AU(f,A){return{registerWidget:async($)=>{await f.send({type:W$.registerWidget,payload:{...$,pluginId:A}})},unregisterWidget:async($)=>{await f.send({type:W$.unregisterWidget,payload:{pluginId:A,...$?{widgetId:$}:{}}})}}}function Mf(f,A,$){let Z=f.getEntityService(),V=f.getLogger().child(A),H=f.getDomain(),M=f.getLocalSiteUrl(),X=f.shouldPreferLocalUrls(),L=f.getThemeCSS(),C=IZ(f),N=f.getAttachmentRegistry(),F=f.getRuntimeUploadRegistry(),W=f.getRuntimeState(),R=$?.executionOnly===!0,q=dZ(f,A,V,R);return{pluginId:A,executionOnly:R,logger:V,entityService:Z,semantic:{project:(O)=>Z.projectSemanticSpace(O)},identity:cZ(f,C),profileKinds:pZ(f,A),channels:Q$(f),inbox:lZ(f,A),appInfo:C,readiness:()=>f.getRuntimeReadiness(),judge:(O)=>f.judge(O),domain:H,siteUrl:H?`https://${H}`:void 0,localSiteUrl:M,previewUrl:H?`https://${$U(H)}`:void 0,preferLocalUrls:X,themeCSS:L,entityDisplay:$?.entityDisplay,spaces:f.getSpaces(),permissions:sZ(f),messaging:q,dashboard:AU(q,A),jobs:iZ(f,A),attachments:N,uploads:F,runtimeState:W,recurringChecks:f.getRecurringChecks(A),conversations:oZ(f),dataDir:f.getDataDir(),eval:R?{registerHandler:()=>{}}:aZ(f,A),insights:R?{register:()=>{}}:rZ(f),plugins:tZ(f),endpoints:R?{register:()=>{}}:eZ(f,A),interactions:R?{register:()=>{}}:fU(f,A)}}function b1(f){return f.replace(/:/g,"-")}function g1(f){return f.split(/[:.-]/).map((A)=>A.charAt(0).toUpperCase()+A.slice(1)).join(" ")}var R$=new Map;async function VA(f,A,$){let Z=R$.get(A);if(Z!==void 0)return Z;let V=b1(A),H;try{H=await f.getEntity({entityType:"prompt",id:V})}catch{return $}if(H?.content){let M=wf(H.content,U.record(U.string(),U.unknown())).content;return R$.set(A,M),M}try{let M=g1(A),X=B$($,{title:M,target:A});await f.createEntity({entity:{id:V,entityType:"prompt",content:X,metadata:{title:M,target:A,slug:V}}})}catch{}return R$.set(A,$),$}async function I1(f,A){let $=f.list().filter((Z)=>!!Z.basePrompt);return await Promise.all($.map((Z)=>VA(A,Z.name,Z.basePrompt))),$.length}function HA(f){let A=f.getEntityService(),$=f.getEntityRegistry(),Z=f.getDataSourceRegistry();return{register:(V,H,M,X)=>{$.registerEntityType(V,H,M,X)},getAdapter:(V)=>{try{return $.getAdapter(V)}catch{return}},extendFrontmatterSchema:(V,H)=>{$.extendFrontmatterSchema(V,H)},getEffectiveFrontmatterSchema:(V)=>{return $.getEffectiveFrontmatterSchema(V)},registerPersistValidator:(V,H)=>{$.registerPersistValidator(V,H)},registerCreateInterceptor:(V,H)=>{$.registerCreateInterceptor(V,H)},registerUploadSaveHandler:(V)=>{$.registerUploadSaveHandler(V)},getUploadSaveHandler:(V)=>{return $.getUploadSaveHandler(V)},update:async(V)=>{return A.updateEntity({entity:V})},registerDataSource:(V)=>{Z.register(V)}}}function MA(f){return{resolve:(A,$)=>{return VA(f,A,$)}}}function XA(f){return{query:(A,$)=>f.query(A,$),generate:async(A)=>{return f.generateContent(A)},generateObject:async(A,$,Z)=>{return f.generateObject(A,$,Z)},generateImage:async(A,$)=>{return f.generateImage(A,$)},canGenerateImages:()=>{return f.canGenerateImages()}}}function _$(f,A,$){let Z=Mf(f,A,$),V=f.getEntityService();return{...Z,entityService:V,entities:HA(f),ai:XA(f),prompts:MA(V),permissions:Z.permissions}}function D$(f,A,$){let Z=Mf(f,A,$),V=f.getEntityService(),H=f.getRenderService(),M=f.getContentService(),X=f.getPermissionService();return{...Z,permissions:{...Z.permissions,getConfiguredPrincipalSeeds:()=>X.getConfiguredPrincipalSeeds(),replaceRuntimePrincipalState:(L)=>X.replaceRuntimePrincipalState(L)},entityService:V,entities:HA(f),webRoutes:{getRoutes:()=>f.getPluginWebRoutes()},templates:{register:(L,C)=>{f.registerTemplates(L,C??A)},format:(L,C)=>{return M.formatContent(L,C,{pluginId:A})},parse:(L,C)=>{return M.parseContent(L,C,A)},resolve:async(L,C)=>{return await M.resolveContent(L,C,A)},getCapabilities:(L)=>{let C=L.includes(":")?L:`${A}:${L}`,N=f.getTemplate(C);if(!N)return null;let F=ZU.getCapabilities(N);return{canGenerate:F.canGenerate,canFetch:F.canFetch,canRender:F.canRender,isStaticOnly:F.isStaticOnly}}},views:{get:(L)=>{return H.get(L)??void 0},list:()=>{return H.list()},hasRenderer:(L,C="web")=>{return H.hasRenderer(L,C)},getRenderer:(L,C="web")=>{return H.getRenderer(L,C)},validate:(L,C)=>{return H.validate(L,C)}},prompts:MA(V),ai:XA(f),registerInstructions:(L)=>{f.registerInstructions(A,L)}}}class UU extends Zf{type="service";getApiRoutes(){return[]}getWebRoutes(){return[]}async register(f,A){let $=D$(f,this.id,A);return this.context=$,this.setupMessageHandlers($),await this.onRegister($),this.getCapabilities()}get entityService(){return this.getContext().entityService}registerEntityType(f,A,$,Z){this.getContext().entities.register(f,A,$,Z)}async enqueueJob(f){return this.getContext().jobs.enqueue(f)}async enqueueBatch(f,A){return this.getContext().jobs.enqueueBatch(f,A)}async registerEntityTypes(f){}async registerJobHandlers(f){}async onRegister(f){await this.registerEntityTypes(f),await this.registerJobHandlers(f)}}var c1=U.object({});class O$ extends Zf{type="entity";entityActionPolicy;constructor(f,A,$,Z,V){super(f,A,$,Z);if(V!==void 0)this.entityActionPolicy=V}async register(f,A){let $=_$(f,this.id,A);this.context=$,this.setupMessageHandlers($);let Z=this.getProjectionRules($),V=this.getEntityTypeConfig(),H=Z.some((W)=>W.targetType===this.entityType),M=V?.projectionSource!==!1&&V?.projectionSourceRole!=="excluded"&&(V?.projectionSource===!0||V?.projectionSourceRole!==void 0),X=H&&!M?{...V,projectionSource:!1,projectionSourceRole:"excluded"}:V;if($.entities.register(this.entityType,this.schema,this.adapter,X),this.interceptCreate!==O$.prototype.interceptCreate)$.entities.registerCreateInterceptor(this.entityType,(W,R)=>this.interceptCreate(W,R,$));let L=this.createGenerationHandler($);if(L)$.jobs.registerHandler(`${this.entityType}:generation`,L);let C=this.getTemplates();if(C&&Object.keys(C).length>0)f.registerTemplates(C,this.id);let N=this.getDataSources();for(let W of N)$.entities.registerDataSource(W);await this.onRegister(this.context);let F=await this.getInstructions();return{tools:[],resources:[],...F&&{instructions:F},...Z.length>0&&{projectionRules:Z}}}async interceptCreate(f,A,$){return{kind:"continue",input:f}}createGenerationHandler(f){return null}getTemplates(){return null}getDataSources(){return[]}getEntityTypeConfig(){return}getProjectionRules(f){return[]}}async function p1({context:f,targetType:A,desired:$,getId:Z,toEntityInput:V,equals:H,deleteStale:M=!1,outputVisibility:X="public",concurrency:L=1,logger:C}){let N=new Map;for(let z of $)N.set(Z(z),z);let F=(await f.entityService.listEntities({entityType:A,options:{filter:{visibilityScope:X}}})).filter((z)=>z.visibility===X),W=new Map(F.map((z)=>[z.id,z])),R=0,q=0,O=0,I=0,a=Math.max(1,L);if(M){let z=F.filter((c)=>!N.has(c.id));await VU(z,a,async(c)=>{await f.entityService.deleteEntity({entityType:A,id:c.id}),O++})}return await VU(Array.from(N),a,async([z,c])=>{let G=W.get(z),_={...V(c,z),visibility:X};try{if(!G){await f.entityService.createEntity({entity:_}),R++;return}if(H?.(G,c)??!1){I++;return}await f.entityService.updateEntity({entity:{...G,..._,id:z,entityType:A,visibility:X}}),q++}catch(Q){C?.error("Failed to reconcile entity",{targetType:A,id:z,error:S(Q)})}}),{created:R,updated:q,deleted:O,skipped:I}}async function VU(f,A,$){let Z=await P.runPromiseExit(P.forEach(f,(V)=>P.tryPromise({try:()=>$(V),catch:(H)=>H}),{concurrency:A,discard:!0}));if(g.isFailure(Z))throw LA.squash(Z.cause)}async function l1({entityService:f,entity:A,options:$}){let Z=await f.getEntity({entityType:A.entityType,id:A.id});if(Z)return{entityId:Z.id,created:!1,existingEntity:Z};let V=await f.createEntity({entity:A,...$?{options:$}:{}});return{entityId:V.entityId,created:!0,mutation:V}}async function n1({entityService:f,entity:A,expectedContentHash:$}){let Z=await f.getEntity({entityType:A.entityType,id:A.id});if(Z){let H={...Z,content:A.content,metadata:A.metadata,updated:A.updated??new Date().toISOString()},M=await f.updateEntity({entity:H,...$!==void 0?{options:{expectedContentHash:$}}:{}});return{entityId:M.entityId,updated:!0,mutation:M,previousEntity:Z}}if($!==void 0)return{entityId:A.id,updated:!1,mutation:{entityId:A.id,jobId:"",skipped:!0,skipReason:"content-conflict"}};let V=await f.createEntity({entity:A});return{entityId:V.entityId,updated:!1,mutation:V}}async function d1({entityService:f,entityType:A,id:$,error:Z,content:V}){let H=await f.getEntity({entityType:A,id:$});if(!H)return{found:!1};let M={...H,content:V??H.content,metadata:{...H.metadata,status:"failed",processingError:Z},updated:new Date().toISOString()},X=await f.updateEntity({entity:M});return{found:!0,entityId:X.entityId,mutation:X,previousEntity:H}}function HU(f){return XU(f)}function MU(f){if(!f)return;return{...f.userPermissionLevel&&{userPermissionLevel:f.userPermissionLevel},...f.isAnchor!==void 0&&{isAnchor:f.isAnchor},...f.interfaceType&&{interfaceType:f.interfaceType},...f.channelId&&{channelId:f.channelId},...f.channelName&&{channelName:f.channelName},...f.actor&&{actor:f.actor},...f.source&&{source:f.source},...f.attachments&&{attachments:f.attachments}}}function LU(f){return{chat:async(A,$,Z,V)=>{let H=MU(Z),M=V?await f.chat(A,$,H,V):await f.chat(A,$,H);return HU(M)},confirmPendingAction:async(A,$,Z,V,H)=>{let M=MU(V);if(!M)throw Error("Confirmation requires caller context.");let X=H?await f.confirmPendingAction(A,$,Z,M,H):await f.confirmPendingAction(A,$,Z,M);return HU(X)},invalidate:()=>{f.invalidateAgent()}}}var CA=new WeakMap;function i1(f,A){if(CA.has(f))throw Error("HTTP route snapshot provider is already bound");CA.set(f,A)}function CU(f,A){let $=CA.get(f);if(!$)throw Error("HTTP route snapshot provider is not bound");i1(A,$)}function YU(f){let A=CA.get(f);if(!A)throw Error("HTTP route snapshot provider is not bound");return A()}function YA(f,A,$){let Z=Mf(f,A,$),V=f.getMCPService(),H=f.getPermissionService(),M=LU(f.getAgentService());return{...Z,mcpTransport:V,agent:M,permissions:{...Z.permissions,getUserLevel:(X,L,C)=>{return H.determineUserLevel(X,L,C)},isAnchor:(X,L)=>H.isAnchor(X,L)},daemons:{register:(X,L)=>{let C=`${A}:${X}`;f.registerDaemon(C,L,A),Z.logger.debug(`Registered daemon: ${C}`)}},conversations:{...Z.conversations,start:async(X)=>{return f.getConversationService().startConversation(X)},addMessage:async(X)=>{await f.getConversationService().addMessage(X)},updateMetadata:async(X)=>{return f.getConversationService().updateConversationMetadata(X)},delete:async(X)=>{return f.getConversationService().deleteConversation(X)}},tools:{listForPermissionLevel:(X)=>{return f.listToolsForPermissionLevel(X)}},apiRoutes:{getRoutes:()=>{return f.getPluginApiRoutes()},getMessageBus:()=>{return f.getMessageBus()}},webRoutes:{getRoutes:()=>{return f.getPluginWebRoutes()}},httpRoutes:{getRoutes:()=>YU(f)},plugins:{has:(X)=>f.hasPlugin(X)}}}function k$(f,A,$){return{...YA(f,A,$),channels:nZ(f,A)}}var s1=3600000;class FA extends Zf{type="interface";daemon;jobTrackingEntries=new Map;jobTrackingTtlMs=s1;createContext(f,A){return YA(f,this.id,A)}async register(f,A){let $=this.createContext(f,A);if(this.context=$,this.initializeDaemon(),this.daemon)await this.registerDaemon($);return this.setupMessageHandlers($),await this.onRegister($),this.getCapabilities()}async onRegister(f){}async registerDaemon(f){if(!this.daemon)return;f.daemons.register(this.id,this.daemon),f.logger.debug(`Registered daemon for interface: ${this.id}`)}createDaemon(){return}requiresDaemonStartup(){return!1}getWebRoutes(){return[]}initializeDaemon(){let f=this.createDaemon();if(f)this.daemon=f}async handleProgressEvent(f,A){}cleanupExpiredEntries(){let f=Date.now(),A=[];for(let[$,Z]of this.jobTrackingEntries)if(f-Z.createdAt>this.jobTrackingTtlMs)A.push($);for(let $ of A)this.jobTrackingEntries.delete($)}ownsJob(f,A){return this.jobTrackingEntries.has(f)||A!==void 0&&this.jobTrackingEntries.has(A)}getJobTracking(f,A){let $=this.jobTrackingEntries.get(f);if($)return $.info;if(A){let Z=this.jobTrackingEntries.get(A);if(Z)return Z.info}return}setJobTracking(f,A){this.cleanupExpiredEntries(),this.jobTrackingEntries.set(f,{info:A,createdAt:Date.now()})}removeJobTracking(f){this.jobTrackingEntries.delete(f)}async createJobWithTracking(f,A){let Z=await this.getContext().jobs.enqueue(f);return this.setJobTracking(Z,A),Z}async createBatchWithTracking(f,A,$){let V=await this.getContext().jobs.enqueueBatch(f,$);return this.setJobTracking(V,A),V}}var PU=/^[a-z][a-z0-9-]*$/,o1=U.strictObject({source:U.string().min(1).max(500),flags:U.string().regex(/^[imu]*$/).optional()}),a1=U.strictObject({type:U.string().trim().regex(PU),displayName:U.string().trim().min(1).max(100),subjectLabel:U.string().trim().min(1).max(100),subjectPattern:o1.optional(),manualDelivery:U.boolean().optional()});class KU{descriptorRegistrations=new Map;providerRegistrations=new Map;activeDescriptors=new Map;activeProviders=new Map;finalized=!1;registerDescriptor(f,A){this.assertRegistrationOpen();let $=FU(f),Z=a1.parse(A);if(Z.subjectPattern)new RegExp(Z.subjectPattern.source,Z.subjectPattern.flags);let V=Object.freeze({type:Z.type,displayName:Z.displayName,subjectLabel:Z.subjectLabel,...Z.subjectPattern?{subjectPattern:Object.freeze({...Z.subjectPattern})}:{},...Z.manualDelivery!==void 0?{manualDelivery:Z.manualDelivery}:{}}),H=this.descriptorRegistrations.get(Z.type)??[];H.push({pluginId:$,descriptor:V}),this.descriptorRegistrations.set(Z.type,H)}registerDeliveryProvider(f,A){this.assertRegistrationOpen();let $=FU(f),Z=J$(A.channelType);if(typeof A.isAvailable!=="function"||typeof A.send!=="function")throw Error("Channel delivery provider operations are required");let V=Object.freeze({channelType:Z,isAvailable:A.isAvailable.bind(A),send:A.send.bind(A)}),H=this.providerRegistrations.get(Z)??[];H.push({pluginId:$,provider:V}),this.providerRegistrations.set(Z,H)}unregisterPlugin(f){let A=f.trim();for(let[$,Z]of this.descriptorRegistrations){let V=Z.filter((H)=>H.pluginId!==A);if(V.length===0)this.descriptorRegistrations.delete($);else this.descriptorRegistrations.set($,V)}for(let[$,Z]of this.providerRegistrations){let V=Z.filter((H)=>H.pluginId!==A);if(V.length===0)this.providerRegistrations.delete($);else this.providerRegistrations.set($,V)}if(this.finalized)this.rebuildActiveState(!1)}finalize(){if(this.finalized)return;this.rebuildActiveState(!0),this.finalized=!0}listDescriptors(){return this.assertFinalized(),[...this.activeDescriptors.values()].sort((f,A)=>f.type.localeCompare(A.type))}getDescriptor(f){return this.assertFinalized(),this.activeDescriptors.get(J$(f))}getDeliveryProvider(f){return this.assertFinalized(),this.activeProviders.get(J$(f))}isFinalized(){return this.finalized}rebuildActiveState(f){let A=new Map,$=new Map;for(let[Z,V]of this.descriptorRegistrations){if(V.length>1){if(!f)continue;throw NU("Channel",Z,V)}let H=V[0]?.descriptor;if(H)A.set(Z,H)}for(let[Z,V]of this.providerRegistrations){if(V.length>1){if(!f)continue;throw NU("Delivery provider for channel",Z,V)}if(!A.has(Z)){if(f)throw Error(`Delivery provider for channel "${Z}" has no descriptor`);continue}let H=this.descriptorRegistrations.get(Z)?.[0]?.pluginId,M=V[0]?.pluginId;if(H!==M){if(f)throw Error(`Delivery provider for channel "${Z}" must be registered by descriptor owner "${H??"unknown"}", not "${M??"unknown"}"`);continue}let X=V[0]?.provider;if(X)$.set(Z,X)}this.activeDescriptors=A,this.activeProviders=$}assertRegistrationOpen(){if(this.finalized)throw Error("Channel registration is closed")}assertFinalized(){if(!this.finalized)throw Error("Channel registry is not finalized")}}function FU(f){let A=f.trim();if(!A)throw Error("Channel registration plugin id is required");return A}function J$(f){let A=f.trim();if(!PU.test(A))throw Error(`Invalid channel type: ${f}`);return A}function NU(f,A,$){let Z=$.map((V)=>V.pluginId).sort().join(", ");return Error(`${f} "${A}" is registered by multiple plugins: ${Z}`)}var NA=/^[a-z][a-z0-9-]*$/,GU=U.strictObject({id:U.string().trim().regex(NA),label:U.string().trim().min(1).max(100),confirm:U.boolean().optional()}),QU=U.strictObject({entityType:U.string().trim().min(1).max(100),entityId:U.string().trim().min(1).max(300)}),WU=U.strictObject({id:U.string().trim().min(1).max(300),title:U.string().trim().min(1).max(160),summary:U.string().trim().min(1).max(1000).optional(),receivedAt:U.iso.datetime(),urgency:U.enum(["high","normal"]),entityRef:QU.optional(),actions:U.array(GU).max(10)}).superRefine((f,A)=>{let $=new Set;for(let Z of f.actions){if($.has(Z.id))A.addIssue({code:"custom",path:["actions"],message:`Duplicate inbox action id: ${Z.id}`});$.add(Z.id)}}),RU=U.array(WU).max(1000),BU=U.strictObject({permissionLevel:U.enum(["admin","trusted","public"])}),_U=U.strictObject({sourceId:U.string().trim().regex(NA),displayName:U.string().trim().min(1).max(100)});class DU{registrations=new Map;activeSources=new Map;finalized=!1;registerSource(f,A){this.assertRegistrationOpen();let $=e1(f),Z=_U.parse({sourceId:A.sourceId,displayName:A.displayName});if(typeof A.list!=="function"||typeof A.act!=="function")throw Error("Inbox source operations are required");let V=r1(Z,A),H=this.registrations.get(Z.sourceId)??[];H.push({pluginId:$,source:V}),this.registrations.set(Z.sourceId,H)}unregisterPlugin(f){let A=f.trim();for(let[$,Z]of this.registrations){let V=Z.filter((H)=>H.pluginId!==A);if(V.length===0)this.registrations.delete($);else this.registrations.set($,V)}if(this.finalized)this.rebuildActiveState(!1)}finalize(){if(this.finalized)return;this.rebuildActiveState(!0),this.finalized=!0}listSources(){return this.assertFinalized(),[...this.activeSources.values()].sort((f,A)=>f.sourceId.localeCompare(A.sourceId))}getSource(f){return this.assertFinalized(),this.activeSources.get(f8(f))}isFinalized(){return this.finalized}rebuildActiveState(f){let A=new Map;for(let[$,Z]of this.registrations){if(Z.length>1){if(!f)continue;let H=Z.map((M)=>M.pluginId).sort().join(", ");throw Error(`Inbox source "${$}" is registered by multiple plugins: ${H}`)}let V=Z[0]?.source;if(V)A.set($,V)}this.activeSources=A}assertRegistrationOpen(){if(this.finalized)throw Error("Inbox registration is closed")}assertFinalized(){if(!this.finalized)throw Error("Inbox registry is not finalized")}}function r1(f,A){return Object.freeze({...f,list:async()=>{return RU.parse(await A.list()).map(t1)},act:async($,Z,V)=>{let H=U.string().trim().min(1).max(300).parse($),M=U.string().trim().regex(NA).parse(Z);await A.act(H,M,BU.parse(V))}})}function t1(f){let A=f.actions.map(($)=>Object.freeze({...$}));return Object.freeze(A),Object.freeze({...f,...f.entityRef?{entityRef:Object.freeze({...f.entityRef})}:{},actions:A})}function e1(f){let A=f.trim();if(!A)throw Error("Inbox registration plugin id is required");return A}function f8(f){return U.string().trim().regex(NA).parse(f)}var A8={pluginsRegistered:"system:plugins:registered",initialSyncCompleted:"sync:initial:completed",shellReady:"system:shell:ready"};function $8(f){return{register:(A,$,Z)=>{return f.register(A,$,Z)},resolve:(A)=>{return f.resolve(A)},hasProvider:(A,$)=>{return f.has(A,$)},getProviderMetadata:(A,$)=>{return f.getMetadata(A,$)}}}class x${providers=new Map;static createFresh(){return new x$}constructor(){}register(f,A,$){return this.getOrCreateSourceProviders(f).set(A,$),()=>{this.unregister(f,A)}}async resolve(f){let A=this.get(f.sourceEntityType,f.attachmentType);if(!A)return;return A.resolve(f)}get(f,A){return this.providers.get(f)?.get(A)}has(f,A){return this.get(f,A)!==void 0}getMetadata(f,A){return this.get(f,A)?.metadata}unregister(f,A){let $=this.providers.get(f);if(!$)return;if($.delete(A),$.size===0)this.providers.delete(f)}getRegisteredAttachmentTypes(f){return Array.from(this.providers.get(f)?.keys()??[])}clear(){this.providers.clear()}getOrCreateSourceProviders(f){let A=this.providers.get(f);if(A)return A;let $=new Map;return this.providers.set(f,$),$}}import{mkdir as Z8,readdir as U8,readFile as OU,rm as kU,stat as V8,writeFile as JU}from"fs/promises";import{basename as H8,dirname as M8,join as n}from"path";var PA=/^upload-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,xU=86400000,wU=200;class Xf extends Error{code;constructor(f,A){super(A);this.code=f,this.name="RuntimeUploadStoreError"}}var X8=U.object({id:U.string().regex(PA),ref:U.object({kind:U.string().min(1),id:U.string().regex(PA)}),filename:U.string().min(1),mediaType:U.string().min(1),sizeBytes:U.number().nonnegative(),createdAt:U.string().datetime(),metadata:U.record(U.string(),U.unknown()).optional()});function L8(f){return{scoped:(A)=>f.scoped(A)}}function TU(f){return H8(f)==="brain-data"?n(M8(f),"data"):f}class w${dataDir;constructor(f){this.dataDir=TU(f.dataDir)}static createFresh(f){return new w$(f)}scoped(f){return new T$({...f,dataDir:this.dataDir})}}class T${options;retentionMs;maxCount;createUploadId;getNow;constructor(f){this.options=f,this.retentionMs=f.retentionMs??xU,this.maxCount=f.maxCount??wU,this.createUploadId=f.createId??(()=>`upload-${crypto.randomUUID()}`),this.getNow=f.now??(()=>new Date)}async save(f){let A=this.createUploadId();this.assertValidUploadId(A);let $={id:A,ref:{kind:this.options.refKind,id:A},filename:f.filename,mediaType:f.mediaType,sizeBytes:f.content.byteLength,createdAt:this.getNow().toISOString(),...f.metadata!==void 0&&{metadata:f.metadata}},Z=this.getUploadDir(A);return await Z8(Z,{recursive:!0}),await JU(n(Z,"content"),f.content),await JU(n(Z,"metadata.json"),`${JSON.stringify($,null,2)}
3
+ `,"utf8"),await this.prune(),$}async remove(f){this.assertValidUploadId(f),await kU(this.getUploadDir(f),{recursive:!0,force:!0})}async read(f){let A=await this.readRecord(f);try{let $=await OU(n(this.getUploadDir(f),"content"));return{record:A,content:$}}catch{throw new Xf("not_found","Upload not found")}}async readRecord(f){this.assertValidUploadId(f);try{let A=await OU(n(this.getUploadDir(f),"metadata.json"),"utf8"),$=X8.safeParse(JSON.parse(A));if(!$.success||$.data.id!==f||$.data.ref.id!==f||$.data.ref.kind!==this.options.refKind)throw new Xf("invalid_metadata","Invalid upload metadata");return $.data}catch(A){if(A instanceof Xf)throw A;throw new Xf("not_found","Upload not found")}}toResponseBody(f){return{...f,url:this.getUploadUrl(f.id),downloadUrl:this.getUploadUrl(f.id,!0)}}async prune(){let f=this.getUploadsRoot();try{let A=await U8(f),Z=(await Promise.all(A.map(async(M)=>{try{let X=await V8(n(f,M));return X.isDirectory()?{entry:M,mtimeMs:X.mtimeMs}:null}catch{return null}}))).filter((M)=>M!==null).sort((M,X)=>X.mtimeMs-M.mtimeMs),V=this.getNow().getTime()-this.retentionMs,H=Z.filter((M,X)=>X>=this.maxCount||M.mtimeMs<V);await Promise.all(H.map((M)=>kU(n(f,M.entry),{recursive:!0,force:!0})))}catch{}}getUploadDir(f){return this.assertValidUploadId(f),n(this.getUploadsRoot(),f)}getUploadsRoot(){return n(this.options.dataDir,this.options.namespace,"uploads")}getUploadUrl(f,A=!1){this.assertValidUploadId(f);let $=encodeURIComponent(f);return`${this.options.routePath}?id=${$}${A?"&download=1":""}`}assertValidUploadId(f){if(!PA.test(f))throw new Xf("invalid_ref","Invalid upload ref")}}var _2=U.object({id:U.string(),type:U.string(),version:U.string(),status:U.string()}),D2=U.object({name:U.string(),description:U.string()});var F8=U.object({id:U.string(),version:U.string(),type:U.enum(["core","entity","service","interface"]),description:U.string().optional(),dependencies:U.array(U.string()).optional(),packageName:U.string()});function q$(f){if(typeof f!=="object"||f===null||!("entityId"in f))return;let A=f.entityId;return typeof A==="string"&&A.trim().length>0?A.trim():void 0}function qU(f){if(typeof f!=="object"||f===null||!("coverImage"in f))return;let A=f.coverImage;if(A===void 0||A===!1)return;if(A===!0)return{generate:!0};if(typeof A!=="object"||A===null)return;let $=A;if($.generate===!1)return;let Z=$.prompt?.trim();return{generate:!0,...Z&&{prompt:Z}}}function QA(f){return Object.fromEntries(Object.entries(f).filter(([,A])=>A!==void 0))}function mU(f){let A={...f};return delete A.status,delete A.error,QA(A)}class yU extends xf{context;entityType;constructor(f,A,$){super(f,{schema:$.schema,jobTypeName:$.jobTypeName});this.context=A,this.entityType=$.entityType}async afterCreate(f,A,$,Z){}async onGenerationFailure(f,A){}validateAndParse(f){let A=super.validateAndParse(f);if(!A)return null;let $=qU(f);if(typeof A!=="object")return A;let Z=q$(f);if(!$&&!Z)return A;return Object.assign(A,{...$&&{coverImage:$},...Z&&{entityId:Z}}),A}async process(f,A,$){try{await this.reportProgress($,{progress:KA.START,message:`Starting ${this.jobTypeName}`});let Z=await this.generate(f,$),V=q$(f),H=V?this.applyPreallocatedEntityId(V,Z):Z;await this.reportProgress($,{progress:KA.SAVE,message:`Saving ${this.entityType} to database`});let M=V?await this.updatePreallocatedStub(V,H):await this.context.entityService.createEntity({entity:{id:H.id,entityType:this.entityType,content:H.content,metadata:H.metadata},options:H.createOptions});return await this.afterCreate(f,M.entityId,$,H),await this.enqueueGenericCoverImageIfRequested(f,M.entityId,$,H),await this.reportProgress($,{progress:KA.COMPLETE,message:`${H.title??this.entityType} created successfully`}),{success:!0,entityId:M.entityId,...H.resultExtras}}catch(Z){if(Z instanceof S$)return await this.markPreallocatedStubFailed(f,Z.message),await this.onGenerationFailure(f,Z.message),{success:!1,error:Z.message};let V=S(Z);return this.logger.error(`${this.jobTypeName} job failed`,{error:Z,jobId:A,data:this.summarizeDataForLog(f)}),await this.markPreallocatedStubFailed(f,V),await this.onGenerationFailure(f,V),SU.failure(Z)}}applyPreallocatedEntityId(f,A){let $={...A.metadata},Z=A.content,V=A.resultExtras;if(typeof $.slug==="string")$.slug=f,Z=GA(Z,"slug",f),V={...V,slug:f};return{...A,id:f,content:Z,metadata:$,...V&&{resultExtras:V}}}async updatePreallocatedStub(f,A){let $=await this.context.entityService.getEntity({entityType:this.entityType,id:f,visibilityScope:"restricted"});if(!$)throw Error(`Pre-allocated entity stub not found: ${this.entityType}/${f}`);let Z=this.mergeStubWithGenerated($,A);return this.context.entityService.updateEntity({entity:{...$,id:f,entityType:this.entityType,content:Z.content,metadata:Z.metadata}})}mergeStubWithGenerated(f,A){let $=mU(m$(f.content).frontmatter),Z=mU(f.metadata),V=QA(A.metadata),H=m$(A.content),M=QA(H.frontmatter),X=QA({...$,...V,...M});return this.context.entities.getEffectiveFrontmatterSchema(this.entityType)?.parse(X),{content:zU(X,H.content),metadata:{...Z,...V}}}async markPreallocatedStubFailed(f,A){let $=q$(f);if(!$)return;try{let Z=await this.context.entityService.getEntity({entityType:this.entityType,id:$,visibilityScope:"restricted"});if(!Z)return;await this.context.entityService.updateEntity({entity:{...Z,content:GA(GA(Z.content,"status","failed"),"error",A),metadata:{...Z.metadata,status:"failed",error:A}}})}catch(Z){this.logger.warn("Failed to mark generation stub as failed",{error:Z,entityId:$,entityType:this.entityType})}}async enqueueGenericCoverImageIfRequested(f,A,$,Z){let V=qU(f);if(!V)return;await this.reportProgress($,{progress:90,message:"Queueing cover image generation"});let H=Z.title??A;await this.context.jobs.enqueue({type:EU.generate,data:{prompt:V.prompt??`Editorial cover image for: ${H}. `,title:`${H} Cover`,aspectRatio:"16:9",targetEntityType:this.entityType,targetEntityId:A,entityTitle:H,entityContent:Z.content},toolContext:{interfaceType:"job",actor:{kind:"service",serviceId:"generation-job-handler"}}})}failEarly(f){throw new S$(f)}}class S$ extends Error{constructor(f){super(f);this.name="GenerationFailure"}}function E$(f,A){f.messaging.subscribe(Jf.progress,async($)=>{try{let Z=ef.safeParse($.payload);if(!Z.success)return A.onInvalidSchema(),{success:!1};let V=Z.data;return await A.onProgress(V,V.metadata),{success:!0}}catch(Z){return A.onError(Z),{success:!1}}})}function z$(f){let A=f.status==="completed"?"\u2705":"\u274C",$=f.status==="completed"?"completed":"failed",Z=f.metadata.operationType.replace(/_/g," "),V=f.metadata.operationTarget?`: ${f.metadata.operationTarget}`:"",H=`${A} **${Z}${V}** ${$}`;if(f.message)H+=`
4
+ ${f.message}`;return H}function y$(f){let A=f.metadata.operationType.replace(/_/g," "),$=f.metadata.operationTarget?`: ${f.metadata.operationTarget}`:"",Z=`\uD83D\uDD04 **${A}${$}**`;if(f.progress&&f.progress.total>0)Z+=` ${f.progress.current}/${f.progress.total} (${f.progress.percentage}%)`;if(f.message)Z+=`
5
+ ${f.message}`;return Z}var N8=U.enum(["tool:invoking","tool:completed","tool:failed"]),P8=U.object({toolName:U.string().min(1),conversationId:U.string().min(1),interfaceType:U.string().min(1),channelId:U.string().min(1).optional(),channelName:U.string().min(1).optional(),toolCallId:U.string().min(1).optional(),error:U.string().optional()}),K8=["tool:invoking","tool:completed","tool:failed"];function j$(f,A){for(let $ of K8)f.messaging.subscribe($,async(Z)=>{try{let V=N8.safeParse(Z.type),H=P8.safeParse(Z.payload);if(!V.success||!H.success)return A.onInvalidSchema(),{success:!1};return await A.onToolActivity({type:V.data,...H.data}),{success:!0}}catch(V){return A.onError(V),{success:!1}}})}class h${scope;fibers;delayMs;clock;closePromise=null;closed=!1;constructor(f,A){this.delayMs=f,this.clock=A?.clock,this.scope=P.runSync(h.make()),this.fibers=P.runSync(h.extend(Hf.make(),this.scope))}schedule(f,A){if(this.closed)return;let $=P.sleep(this.delayMs).pipe(P.andThen(P.sync(A))),Z=this.clock?P.withClock($,this.clock):$,V=P.runFork(Z);Hf.unsafeSet(this.fibers,f,V)}close(){return this.closed=!0,this.closePromise??=P.runPromise(h.close(this.scope,g.void)),this.closePromise}}function Tf(f,A){return{state:A,toolName:f.toolName,conversationId:f.conversationId,interfaceType:f.interfaceType,...f.channelId!==void 0&&{channelId:f.channelId},...f.channelName!==void 0&&{channelName:f.channelName},...f.error!==void 0&&{error:f.error}}}function v$(f){return`${f.conversationId}:${f.toolName}`}function u$(f){if(f.startsWith("playbook_"))return"playbook";return(f.startsWith("system_")?f.slice(7):f).replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").trim().toLowerCase()}function jU(f){switch(f){case"running":return"Tool running";case"completed":return"Tool completed";case"awaiting-approval":return"Approval required";case"failed":return"Tool failed"}}function hU(f){switch(f){case"running":return"Tool running";case"completed":return"Tool completed";case"awaiting-approval":return"Tool awaiting approval";case"failed":return"Tool failed"}}function vU(f){let A=v$(f),$=u$(f.toolName),Z=jU(f.state),V=hU(f.state),H=`${V}: ${$}`;return{key:A,label:$,title:Z,fallbackPrefix:V,fallback:f.error?`${H}: ${f.error}`:H}}function uU(f,A){return f.pendingConfirmations?.some(($)=>$.toolName===A)===!0||G8(f.cards).some(($)=>$.toolName===A)}function G8(f){return f?.filter((A)=>A.kind==="tool-approval"&&A.state==="approval-requested")??[]}var bU=500,Q8=500;class b${transport;cleanupSupervisor=new h$(Q8);progressEvents=new Map;progressMessageTracking=new Map;agentResponseTracking=new Map;pendingToolCompletions=new Map;progressCallback;isProcessingInput=!1;currentChannelId=null;bufferedCompletionMessages=[];constructor(f){this.transport=f}hasProgressCallback(){return this.progressCallback!==void 0}registerProgressCallback(f){this.progressCallback=f,f(this.getActiveProgressEvents())}unregisterProgressCallback(){this.progressCallback=void 0}getProgressEvents(){return Array.from(this.progressEvents.values())}getActiveProgressEvents(){return Array.from(this.progressEvents.values()).filter((f)=>f.status==="processing")}trackAgentResponseForJob(f,A,$){this.agentResponseTracking.set(f,{messageId:A,channelId:$,lastUpdate:Date.now()}),this.transport.logger().debug("Tracking agent response for job",{jobId:f,messageId:A,channelId:$})}startProcessingInput(f=null){this.isProcessingInput=!0,this.currentChannelId=f}endProcessingInput(){this.isProcessingInput=!1;for(let{message:f,channelId:A}of this.bufferedCompletionMessages)this.transport.sendMessageToChannel({channelId:A,message:f});this.bufferedCompletionMessages=[],this.currentChannelId=null}getCurrentChannelId(){return this.currentChannelId}async close(){await this.cleanupSupervisor.close(),this.progressEvents.clear(),this.progressMessageTracking.clear(),this.agentResponseTracking.clear(),this.pendingToolCompletions.clear(),this.bufferedCompletionMessages=[],this.isProcessingInput=!1,this.currentChannelId=null,this.progressCallback=void 0}async handleProgressEvent(f){if(!this.shouldHandleProgressEvent(f))return;this.updateProgressState(f);let A=f.metadata.channelId??null,$=f.metadata.rootJobId;if(await this.handleProcessingProgress(f,A,$))return;if(f.status==="completed"||f.status==="failed")await this.handleTerminalProgress(f,A,$);await this.transport.onProgressUpdate(f),this.logProgressProcessed(f)}async handleToolActivityEvent(f){if(f.interfaceType!==this.transport.interfaceId())return;switch(f.type){case"tool:invoking":this.pendingToolCompletions.delete(this.getToolCompletionKey(f)),await this.transport.handleToolStatusUpdate(Tf(f,"running"));return;case"tool:completed":if(this.isProcessingInput){this.pendingToolCompletions.set(this.getToolCompletionKey(f),f);return}await this.transport.handleToolStatusUpdate(Tf(f,"completed"));return;case"tool:failed":this.pendingToolCompletions.delete(this.getToolCompletionKey(f)),await this.transport.handleToolStatusUpdate(Tf(f,"failed"));return}}async handleAgentResponseToolStatuses(f,A){if(this.pendingToolCompletions.size===0)return;let $=this.transport.interfaceId(),Z=Array.from(this.pendingToolCompletions.values()).filter((V)=>V.interfaceType===$&&V.conversationId===A);for(let V of Z){this.pendingToolCompletions.delete(this.getToolCompletionKey(V));let H=uU(f,V.toolName)?"awaiting-approval":"completed";await this.transport.handleToolStatusUpdate(Tf(V,H))}}shouldHandleProgressEvent(f){let A=f.metadata.interfaceType;return!A||A===this.transport.interfaceId()}updateProgressState(f){this.progressEvents.set(f.id,f),this.notifyProgressCallback()}async handleProcessingProgress(f,A,$){if(f.status!=="processing"||!this.transport.supportsMessageEditing())return!1;let Z=this.agentResponseTracking.get(f.id);if(Z)return await this.editTrackedProgressMessage(f,Z),!0;let V=this.transport.formatProgressOutput(f),H=this.progressMessageTracking.get($),M=Date.now();if(H){if(M-H.lastUpdate>=bU)await this.transport.editMessage({channelId:H.channelId,messageId:H.messageId,newMessage:V}),H.lastUpdate=M}else if(A&&!this.isProcessingInput)await this.sendInitialProgressMessage($,A,V,M);return!1}async editTrackedProgressMessage(f,A){let $=Date.now();if($-A.lastUpdate<bU)return;await this.transport.editMessage({channelId:A.channelId,messageId:A.messageId,newMessage:this.transport.formatProgressOutput(f)}),A.lastUpdate=$}async sendInitialProgressMessage(f,A,$,Z){let V=await this.transport.sendMessageWithId({channelId:A,message:$});if(!V)return;this.progressMessageTracking.set(f,{messageId:V,channelId:A,lastUpdate:Z}),this.transport.logger().debug("Tracking progress message",{rootJobId:f,messageId:V,channelId:A})}async handleTerminalProgress(f,A,$){let Z=this.transport.formatCompletionOutput(f),V=this.progressMessageTracking.get($),H=this.agentResponseTracking.get(f.id);if(this.transport.logger().debug("Completion event received",{eventId:f.id,rootJobId:$,hasProgressTracking:!!V,hasAgentTracking:!!H,supportsEditing:this.transport.supportsMessageEditing()}),this.transport.supportsMessageEditing())await this.updateTrackedCompletion(f,Z,V,H,$);if(!V&&!H&&A)this.sendOrBufferCompletionMessage(Z,A);this.scheduleProgressCleanup(f.id)}async updateTrackedCompletion(f,A,$,Z,V){if(Z){if(await this.transport.editMessage({channelId:Z.channelId,messageId:Z.messageId,newMessage:A}),this.agentResponseTracking.delete(f.id),$)this.progressMessageTracking.delete(V);return}if($)await this.transport.editMessage({channelId:$.channelId,messageId:$.messageId,newMessage:A}),this.progressMessageTracking.delete(V)}sendOrBufferCompletionMessage(f,A){if(this.isProcessingInput){this.bufferedCompletionMessages.push({message:f,channelId:A});return}this.transport.sendMessageToChannel({channelId:A,message:f})}scheduleProgressCleanup(f){this.cleanupSupervisor.schedule(f,()=>{this.progressEvents.delete(f),this.notifyProgressCallback()})}logProgressProcessed(f){this.transport.logger().debug("Progress event processed",{eventId:f.id,status:f.status,operationType:f.metadata.operationType,targetChannel:f.metadata.channelId})}getToolCompletionKey(f){return`${f.interfaceType}:${f.conversationId}:${f.toolName}`}notifyProgressCallback(){this.progressCallback?.(this.getProgressEvents())}}var g$=1e5,W8=[".md",".txt",".markdown"],R8=["text/plain","text/markdown","text/x-markdown"],B8=/https?:\/\/[^\s<>"{}|\\^`[\]]+?(?=[,;:\s]|$)/gi,_8=["meet.google.com","zoom.us","teams.microsoft.com","whereby.com","gather.town","calendly.com","cal.com","discord.com","discord.gg","cdn.discordapp.com","media.discordapp.net","giphy.com","tenor.com","wetransfer.com","file.io"],I$=U.object({captureUrls:U.boolean().default(!1),blockedUrlDomains:U.array(U.string()).default(_8)});function gU(f,A){if(A&&R8.some(($)=>A.startsWith($)))return!0;return W8.some(($)=>f.toLowerCase().endsWith($))}function IU(f){return f<=g$}function cU(f){if(f.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(f),!0}catch{return!1}}function pU(f,A){return`User uploaded a file "${f}":
6
+
7
+ ${A}`}function lU(f,A){let $=f.match(B8)??[];return[...new Set($)].filter((Z)=>{try{let{hostname:V}=new URL(Z);return!A.some((H)=>V===H||V.endsWith(`.${H}`))}catch{return!1}})}function Pf(f,A){let $=f.attachment.source;if(($?.entityType==="document"||$?.entityType==="image")&&$.entityId)return{entityType:$.entityType,id:$.entityId};return c$(f.attachment.downloadUrl??f.attachment.url,A)}function c$(f,A="http://local"){if(!f)return;let $;try{$=new URL(f,A)}catch{return}let Z=$.searchParams.get("id")?.trim();if(!Z)return;if($.pathname==="/api/chat/attachments/document")return{entityType:"document",id:Z};if($.pathname==="/api/chat/attachments/image")return{entityType:"image",id:Z};return}function WA(f,A){let $=D8(A,f==="document"?/^application\/pdf$/i:/^image\/[a-z0-9.+-]+$/i);if(!$)return;if(f==="document"&&$.mimeType.toLowerCase()!=="application/pdf")return;return $}function RA(f,A,$,Z){let V=f?.filename;if(typeof V==="string"&&V.trim())return V;if($==="document")return`${A}.pdf`;let H=f?.format;if(typeof H==="string"&&H.trim())return`${A}.${H==="jpeg"?"jpg":H}`;let M=Z.split("/")[1]?.split("+")[0]??"png";return`${A}.${M}`}function D8(f,A){let $=f.match(/^data:([^;]+);base64,(.+)$/i),Z=$?.[1],V=$?.[2];if(!Z||!V||!A.test(Z))return;let H=Buffer.from(V,"base64");return{mimeType:Z,data:H.buffer.slice(H.byteOffset,H.byteOffset+H.byteLength)}}async function qf({entityRef:f,userLevel:A,getEntity:$,getVisibleEntity:Z}){let V=p$(A),H=await Z(f,V);if(H)return{status:"visible",entity:H};return Boolean(await $(f))?{status:"denied"}:{status:"missing"}}function BA(f){return f==="admin"||f==="trusted"}async function nU(f){let A=new Set;for(let $ of f.cards??[]){if($.kind!=="attachment")continue;let Z=Pf($,f.displayBaseUrl);if(!Z)continue;if((await qf({entityRef:Z,userLevel:f.userLevel,getEntity:f.getEntity,getVisibleEntity:f.getVisibleEntity})).status==="denied")A.add($.id)}return A}class l$ extends FA{createContext(f,A){return k$(f,this.id,A)}isUploadableTextFile(f,A){return gU(f,A)}isFileSizeAllowed(f){return IU(f)}formatFileUploadMessage(f,A){return pU(f,A)}getMaxFileUploadBytes(){return g$}isLikelyTextContent(f){return cU(f)}async resolveNativeArtifactDelivery(f){let A=[],$=new Set;if(!this.context||!f.cards)return{files:A,deniedCardIds:$};let Z=this.context;for(let V of f.cards){if(V.kind!=="attachment")continue;let H=Pf(V,f.displayBaseUrl);if(!H)continue;let M=await qf({entityRef:H,userLevel:f.userPermissionLevel,getEntity:(L)=>Z.entityService.getEntity(L),getVisibleEntity:(L,C)=>Z.entityService.getEntity({...L,visibilityScope:C})});if(M.status==="denied"){$.add(V.id);continue}if(M.status!=="visible")continue;if(!BA(f.userPermissionLevel))continue;if(typeof M.entity.content!=="string")continue;let X=WA(H.entityType,M.entity.content);if(!X)continue;if(f.maxBytes!==void 0&&X.data.byteLength>f.maxBytes){this.logger.debug("Skipping oversized native artifact upload",{cardId:V.id,sizeBytes:X.data.byteLength});continue}A.push({cardId:V.id,data:new Uint8Array(X.data),filename:V.attachment.filename??RA(M.entity.metadata,H.id,H.entityType,X.mimeType),mimeType:X.mimeType})}return{files:A,deniedCardIds:$}}extractCaptureableUrls(f,A){return lU(f,A)}async captureUrlViaAgent(f,A,$,Z,V){if(!this.context)return;let H=this.context.permissions.getUserLevel(Z,$,V);await this.context.agent.chat(`Save this link: ${f}`,`links-${A}`,{userPermissionLevel:H,interfaceType:Z,channelId:A})}progress=new b$({interfaceId:()=>this.id,logger:()=>this.logger,sendMessageToChannel:(f)=>this.sendMessageToChannel(f),sendMessageWithId:(f)=>this.sendMessageWithId(f),editMessage:(f)=>this.editMessage(f),supportsMessageEditing:()=>this.supportsMessageEditing(),formatProgressOutput:(f)=>this.formatProgressOutput(f),formatCompletionOutput:(f)=>this.formatCompletionOutput(f),onProgressUpdate:(f)=>this.onProgressUpdate(f),handleToolStatusUpdate:(f)=>this.handleToolStatusUpdate(f)});sendMessageToChannel(f){return}sendMessageWithId(f){return Promise.resolve(void 0)}editMessage(f){return Promise.resolve(!1)}supportsMessageEditing(){return!1}registerProgressCallback(f){this.progress.registerProgressCallback(f)}unregisterProgressCallback(){this.progress.unregisterProgressCallback()}hasProgressCallback(){return this.progress.hasProgressCallback()}trackAgentResponseForJob(f,A,$){this.progress.trackAgentResponseForJob(f,A,$)}async onRegister(f){await super.onRegister(f),E$(f,{onProgress:async(A,$)=>{await this.handleProgressEvent(A,$)},onError:(A)=>{this.logger.error("Error handling progress event",{error:A,interfaceId:this.id})},onInvalidSchema:()=>{this.logger.warn("Invalid progress event schema",{interfaceId:this.id})}}),j$(f,{onToolActivity:async(A)=>{await this.handleToolActivityEvent(A)},onError:(A)=>{this.logger.error("Error handling tool activity event",{error:A,interfaceId:this.id})},onInvalidSchema:()=>{this.logger.warn("Invalid tool activity event schema",{interfaceId:this.id})}}),this.logger.debug("Message interface registered with progress and tool handlers",{id:this.id})}async onShutdown(){await this.progress.close(),await super.onShutdown()}async handleProgressEvent(f,A){await this.progress.handleProgressEvent(f)}formatProgressOutput(f){return y$(f)}formatCompletionOutput(f){return z$(f)}async onProgressUpdate(f){}async handleToolActivityEvent(f){await this.progress.handleToolActivityEvent(f)}async handleToolStatusUpdate(f){}async handleAgentResponseToolStatuses(f,A){await this.progress.handleAgentResponseToolStatuses(f,A)}getProgressEvents(){return this.progress.getProgressEvents()}getActiveProgressEvents(){return this.progress.getActiveProgressEvents()}startProcessingInput(f=null){this.progress.startProcessingInput(f)}endProcessingInput(){this.progress.endProcessingInput()}getCurrentChannelId(){return this.progress.getCurrentChannelId()}}function dU(f){let A=oU(f.status),$=iU(f),Z=sU(f),V=Z?`${A}: ${$} ${Z}`:`${A}: ${$}`;return{title:A,label:$,...Z?{amount:Z}:{},...f.message?{message:f.message}:{},fallback:f.message?`${V}
8
+ ${f.message}`:V}}function iU(f){let A=f.metadata.operationType.replace(/_/g," ");return f.metadata.operationTarget?`${A}: ${f.metadata.operationTarget}`:A}function sU(f){if(!f.progress||f.progress.total<=0)return;return`${f.progress.current}/${f.progress.total} (${f.progress.percentage}%)`}function oU(f){switch(f){case"pending":return"Job queued";case"processing":return"Job processing";case"completed":return"Job completed";case"failed":return"Job failed"}}var O8=new Set(["yes","y","ok","sure","proceed","confirm","go"]),k8=new Set(["no","n","cancel","abort","stop","nope"]);function Kf(f){let A=f.toLowerCase().trim();if(A==="")return;if(O8.has(A))return{confirmed:!0};if(k8.has(A))return{confirmed:!1};return}function aU(f){return f?.filter((A)=>A.kind==="tool-approval"&&A.state==="approval-requested")??[]}function rU(f){return f?.find((A)=>A.kind==="tool-approval"&&(A.state==="output-available"||A.state==="output-error"||A.state==="output-denied"))}function tU(f,A){if(A.length===0)return f;if(f.trim().length>0)return f;if(A.length===1)return A[0]?.summary??f;return"Multiple approvals required."}function eU(f){let A=f.state==="output-error"?"failed":f.state==="output-denied"?"declined":"completed";return{resolution:A,summary:f.summary,toolName:f.toolName,error:A==="failed"?f.error:void 0}}function A0({message:f,approvalIds:A}){if(A.size===0)return{kind:"not-confirmation"};let $=n$(f,A);if(!$)return{kind:"notice",message:"Please reply with yes to confirm or no/cancel to abort."};if(!$.approvalId&&U0(f))return{kind:"notice",message:`No matching pending approval id. Pending approval ids: ${f0(A)}.`};if(A.size>1&&!$.approvalId)return{kind:"notice",message:`Multiple approvals are pending; include one approval id with yes or no/cancel: ${f0(A)}.`};let Z=$.approvalId??J8(A);if(!Z)return{kind:"notice",message:"No pending approval to resolve."};return{kind:"confirm",approvalId:Z,confirmed:$.confirmed}}function n$(f,A){let $=Kf(f),Z=$0(f,A);if($)return{...$,...Z?{approvalId:Z}:{}};let V=f.split(/\s+/).map((H)=>Kf(H)).find((H)=>H!==void 0);if(!V)return;return{...V,...Z?{approvalId:Z}:{}}}function $0(f,A){if(!A||A.size===0)return;let $=f.toLowerCase();return[...A].sort((Z,V)=>V.length-Z.length).find((Z)=>Z0($,Z.toLowerCase()))}function Z0(f,A){let $=A.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^a-z0-9_-])${$}($|[^a-z0-9_-])`).test(f)}function U0(f){return/(^|[^a-z0-9_-])approval[:-][a-z0-9_-]+/i.test(f)}function J8(f){for(let A of f)return A;return}function f0(f){return[...f].join(", ")}var x8=U.object({kind:U.string().min(1),id:U.string().min(1)}),w8=U.object({kind:U.string().min(1),filename:U.string().min(1),mediaType:U.string().min(1),sizeBytes:U.number().nonnegative().optional(),source:x8.optional()}),T8=U.array(w8),F6=U.array(sf),q8=U.array(df),m8=U.record(U.string(),U.unknown());function Sf(f){if(typeof f==="string")try{return mf(JSON.parse(f))}catch{return null}return mf(f)}function d$(f){let A=Sf(f),$=T8.safeParse(A?.attachments);return $.success?$.data:[]}function V0(f){let $=Sf(f)?.cards;if(!Array.isArray($))return[];return $.map((Z)=>of.safeParse(Z)).filter((Z)=>Z.success).map((Z)=>Z.data)}function _A(f,A){let $=[],Z=new Set;for(let V of f){let H=mf(V);if(!H)continue;if(A.role&&H.role!==A.role)continue;for(let M of d$(H.metadata)){if(M.source?.kind!==A.sourceKind)continue;if(Z.has(M.source.id))continue;Z.add(M.source.id),$.push(M.source.id)}}return $}function DA(f){let A=new Set;for(let $ of f){let Z=mf($);if(!Z)continue;let H=Sf(Z.metadata)?.cards;if(!Array.isArray(H))continue;let M=H.filter((L)=>mf(L)?.kind==="tool-approval"),X=q8.safeParse(M);if(!X.success)continue;for(let L of X.data)if(L.state==="approval-requested")A.add(L.id);else A.delete(L.id)}return A}function mf(f){let A=m8.safeParse(f);return A.success?A.data:null}class i${options;pendingByConversation=new Map;constructor(f){this.options=f}rememberFromResponse(f,A){if(!A.pendingConfirmations||A.pendingConfirmations.length===0)return;this.pendingByConversation.set(f,new Set(A.pendingConfirmations.map(($)=>$.id)))}replaceApprovals(f,A){if(A.length===0){this.pendingByConversation.delete(f);return}this.pendingByConversation.set(f,new Set(A))}async getApprovalIds(f){let A=this.pendingByConversation.get(f);if(A&&A.size>0)return new Set(A);let $=await this.restoreApprovalIds(f);if($.size>0)this.pendingByConversation.set(f,$);return new Set($)}removeApproval(f,A){let $=this.pendingByConversation.get(f);if(!$)return;if($.delete(A),$.size===0)this.pendingByConversation.delete(f)}deleteConversation(f){this.pendingByConversation.delete(f)}syncFromResponse(f,A,$){if(A.pendingConfirmations===void 0)return;let Z=new Set(A.pendingConfirmations.map((V)=>V.id).filter((V)=>V!==$));if(Z.size===0){this.pendingByConversation.delete(f);return}this.pendingByConversation.set(f,Z)}formatRemainingApprovalHelp(f,A){if(A.pendingConfirmations!==void 0)return;let $=this.pendingByConversation.get(f);if(!$||$.size===0)return;return`Remaining pending approval ids: ${[...$].map((Z)=>`\`${Z}\``).join(", ")}.`}async restoreApprovalIds(f){try{let A=await this.options.loadMessages(f);return DA(A)}catch(A){return this.options.onRestoreError?.(A,f),new Set}}}var S8=U.record(U.string(),U.unknown());function H0(f){let A=S8.safeParse(f);return A.success?A.data:null}function OA(f,A){return H0(f)?.[A]}function d(f,A){let $=OA(f,A);return typeof $==="string"?$:void 0}function M0(f,A){let $=OA(f,A);return typeof $==="boolean"?$:void 0}function E8(f){return Array.isArray(f.toolResults)?f.toolResults[0]:void 0}function z8(f){if(!Array.isArray(f.cards))return;return f.cards.find((A)=>d(A,"kind")==="tool-approval")}function y8(f){return OA(f,"data")}function j8(f){let $=f.indexOf(`
9
+
10
+ Result:`);if($===-1)return;let Z=f.slice($+9).trim();if(!Z)return;try{return JSON.parse(Z)}catch{return}}function h8(f){if(!f)return;let A=f.replace(/^system[_-]/,"").split(/[_-]+/).filter(Boolean);if(A.length===0)return;let $=A.join(" ");return`${$.charAt(0).toUpperCase()}${$.slice(1)}`}function kA(f,A){if(A==="declined")return{label:"Declined",variant:"declined"};let $=z8(f),Z=E8(f),V=h8(d($,"toolName")??d(Z,"toolName")),H=OA($,"output")??y8(Z)??j8(f.text),M=d($,"state"),X=M0(H,"success"),L=d($,"error")??d(H,"error")??d(H,"message");if(M==="output-error")return{label:`${V?`${V} failed`:"Action failed"}${L?` \xB7 ${L}`:""}`,variant:"error"};if(M==="output-available")return{label:V?`${V} completed`:"Action completed",variant:"success"};if(M==="output-denied")return{label:V?`${V} denied`:"Action denied",variant:"declined"};if(X===!1)return{label:`${V?`${V} failed`:"Action failed"}${L?` \xB7 ${L}`:""}`,variant:"error"};if(f.text.startsWith("Error:"))return{label:`Action failed \xB7 ${f.text.replace(/^Error:\s*/,"")}`,variant:"error"};if(f.text.startsWith("Failed:"))return{label:`${V?`${V} failed`:"Action failed"}${L?` \xB7 ${L}`:""}`,variant:"error"};if(X===!0)return{label:V?`${V} completed`:"Action completed",variant:"success"};if(f.text.startsWith("Completed:"))return{label:V?`${V} completed`:"Action completed",variant:"success"};return{label:f.text?`Approved \xB7 ${f.text}`:"Approved",variant:"success"}}function X0(f){switch(f){case"success":return"Approval confirmed";case"declined":return"Approval declined";case"error":return"Action failed"}}function JA(f){if(typeof f==="string")return f;if(typeof f==="number"||typeof f==="boolean")return String(f);let A=H0(f);if(!A)return;let $=d(A,"error")??d(A,"message");if(M0(A,"success")===!1)return $?`Failed \xB7 ${$}`:"Failed";return}function s$(f){return["Approvals pending:",...f.map((A)=>`${A.id}: ${A.summary}`),"Reply yes <approval-id> to confirm one item, or no <approval-id> to abort it."].join(`
11
+ `)}function L0(f){if(!f||f.length===0)return;if(f.length===1){let A=f[0];if(!A)return;return[`Approval required: ${A.summary}`,"Reply yes to confirm or no/cancel to abort."].join(`
12
+ `)}return s$(f)}function C0({response:f,confirmed:A,remainingApprovalHelp:$,deniedCardIds:Z,formatCard:V,formatPendingConfirmationHelp:H}){let M=kA(f,A?"approved":"declined"),X=f.pendingConfirmations&&f.pendingConfirmations.length>1?H(f.pendingConfirmations):void 0,L=[M.label,...Y0(f.cards,Z).map(V),X,$].filter(g8);return{variant:M.variant,parts:L}}function Y0(f,A){return(f??[]).filter(($)=>$.kind==="attachment"&&Boolean(A?.has($.id)))}function v8(f,A){return(f??[]).filter(($)=>$.kind==="attachment"&&!A?.has($.id))}function u8(f,A){let $=Boolean(A?.length);return(f??[]).filter((Z)=>{if(Z.kind==="attachment")return!1;return!($&&Z.kind==="tool-approval"&&Z.state==="approval-requested")})}function F0(f,A){let $=f.pendingConfirmations??[],Z=[{kind:"text",text:f.text},...Y0(f.cards,A.deniedCardIds).map((V)=>({kind:"denied-artifact",card:V})),...v8(f.cards,A.deniedCardIds).map((V)=>({kind:"artifact",card:V})),...u8(f.cards,f.pendingConfirmations).map((V)=>({kind:"supplemental",card:V}))];if($.length>0)Z.push({kind:"approvals",cards:(f.cards??[]).filter((V)=>V.kind==="tool-approval"&&V.state==="approval-requested"),confirmations:$});return{directives:Z,jobIds:b8(f)}}function b8(f){let A=new Set;for(let $ of f.toolResults??[])if($.jobId)A.add($.jobId);for(let $ of f.cards??[])if($.kind==="attachment"&&$.jobId)A.add($.jobId);return[...A]}function g8(f){return Boolean(f?.trim())}function N0({disposition:f,filename:A}){return`${f}; filename="${I8(A)}"; filename*=UTF-8''${c8(A)}`}function I8(f){return f.replace(/[^\x20-\x7E]|["\\\r\n]/g,"_")}function c8(f){return encodeURIComponent(f).replace(/[!'()*]/g,(A)=>`%${A.charCodeAt(0).toString(16).toUpperCase()}`)}function xA(f){let A=P0(a$(f,"attachment"));if(!A)return null;let $=o(f,"jobId"),Z=o(f,"description"),V=o(A,"mediaType"),H=o(A,"filename"),M=o$(l8(A,"sizeBytes")),X=o(A,"url"),L=o(A,"downloadUrl"),C=o(A,"previewUrl");return{...$!==void 0?{jobId:$}:{},title:o(f,"title")??"Generated artifact",...Z!==void 0?{description:Z}:{},...V!==void 0?{mediaType:V}:{},...H!==void 0?{filename:H}:{},...M!==void 0?{sizeLabel:M}:{},...X!==void 0?{url:X}:{},...L!==void 0?{downloadUrl:L}:{},...C!==void 0?{previewUrl:C}:{}}}function o$(f){if(f===void 0)return;if(!Number.isFinite(f)||f<0)return;if(f<1024)return`${f} B`;let A=["KB","MB","GB"],$=f/1024;for(let Z of A){if($<1024||Z==="GB")return`${$.toFixed($>=10?0:1)} ${Z}`;$/=1024}return}var p8=U.record(U.string(),U.unknown());function P0(f){let A=p8.safeParse(f);return A.success?A.data:null}function a$(f,A){return P0(f)?.[A]}function o(f,A){let $=a$(f,A);return typeof $==="string"?$:void 0}function l8(f,A){let $=a$(f,A);return typeof $==="number"?$:void 0}var G0="upload.txt";var Q0=5000000,n8=[".md",".txt",".markdown"],d8=["text/plain","text/markdown","text/x-markdown"],r$=new Map([[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"],[".gif","image/gif"],[".pdf","application/pdf"]]),i8=new Set(r$.values());function TA(f,A="upload.txt"){let $=f.split(/[\\/]/).at(-1)?.trim()??"",Z=Array.from($).filter((V)=>{let H=V.charCodeAt(0);return H>31&&H!==127}).join("").slice(0,160);return Z.length>0?Z:A}function qA(f,A){let $=A?.trim()??"";if($.length>0)return $;let Z=f.toLowerCase();if(Z.endsWith(".md")||Z.endsWith(".markdown"))return"text/markdown";if(Z.endsWith(".txt"))return"text/plain";return"application/octet-stream"}function Ef(f,A){let $=A?.trim()??"",Z=$.split(";",1)[0]?.toLowerCase()??$;if(Z.length>0&&Z!=="application/octet-stream")return Z;let V=qA(f,void 0);if(V!=="application/octet-stream")return V;let H=f.toLowerCase();for(let[M,X]of r$)if(H.endsWith(M))return X;return"application/octet-stream"}function zf(f,A){if(A&&d8.some(($)=>A.toLowerCase().startsWith($)))return!0;return n8.some(($)=>f.toLowerCase().endsWith($))}function mA(f){return f<=1e5}function SA(f){return f<=5000000}function EA(f,A){let $=Ef(f,A);if(i8.has($))return!0;return r$.has(s8(f))}function W0(f,A){let $=Ef(f,A);if(zf(f,$))return"text";if(EA(f,$))return"file";return}function R0(f,A){if(A<=0)return!0;return f==="text"?mA(A):SA(A)}function t$(f){if(f.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(f),!0}catch{return!1}}function e$(f){let A=TA(f.filename,f.fallbackFilename),$=qA(A,f.mediaType);if(!zf(A,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};if(!mA(f.content.byteLength))return{ok:!1,code:"file_too_large",message:`File upload too large: ${A}`};if(!t$(f.content))return{ok:!1,code:"binary_content",message:`Unsupported file upload type: ${A}`};return{ok:!0,filename:A,mediaType:$,sizeBytes:f.content.byteLength,text:new TextDecoder("utf-8").decode(f.content).replace(/^\uFEFF/,"")}}function B0(f){let A=TA(f.filename,f.fallbackFilename),$=Ef(A,f.mediaType);if(zf(A,$)){let Z=e$({filename:A,mediaType:$,content:f.content,...f.fallbackFilename!==void 0&&{fallbackFilename:f.fallbackFilename}});return Z.ok?{...Z,kind:"text"}:Z}if(!EA(A,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};if(!SA(f.content.byteLength))return{ok:!1,code:"file_too_large",message:`File upload too large: ${A}`};if(!o8(f.content,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};return{ok:!0,kind:"file",filename:A,mediaType:$,sizeBytes:f.content.byteLength}}function s8(f){let A=f.lastIndexOf(".");return A>=0?f.slice(A).toLowerCase():""}function o8(f,A){switch(A){case"image/png":return K0(f,[137,80,78,71]);case"image/jpeg":return K0(f,[255,216,255]);case"image/gif":return wA(f,"GIF87a")||wA(f,"GIF89a");case"image/webp":return wA(f,"RIFF")&&_0(f,"WEBP",8);case"application/pdf":return wA(f,"%PDF-");default:return!1}}function K0(f,A){return A.every(($,Z)=>f[Z]===$)}function wA(f,A){return _0(f,A,0)}function _0(f,A,$){return Array.from(A).every((Z,V)=>f[$+V]===Z.charCodeAt(0))}class fZ{options;recentUploads=new Map;maxRecent;constructor(f){this.options=f,this.maxRecent=f.maxRecent??20}remember(f,A){if(A.length===0)return;let $=this.recentUploads.get(f)??[];this.recentUploads.set(f,[...$,...A].slice(-this.maxRecent))}clear(){this.recentUploads.clear()}async selectPriorUploads({conversationId:f,currentAttachments:A,canRestore:$}){if(A.length>0)return A;if(!$)return A;let Z=await this.getRecentUploads(f);if(Z.length===0)return A;return Z}async getRecentUploads(f){let A=this.recentUploads.get(f)??[];if(A.length>0)return A;let $=await this.restoreRecentUploads(f);if($.length>0)this.recentUploads.set(f,$.slice(-this.maxRecent));return $}async restoreRecentUploads(f){let A=await this.loadMessages(f),$=[this.options.sourceKind,...this.options.legacySourceKinds??[]],Z=[];for(let V of $){let H=_A(A,{sourceKind:V,role:"user"});for(let M of H){let X=await this.restoreAttachment(M,V);if(X)Z.push(X)}}return Z}async loadMessages(f){try{return await this.options.loadMessages(f)}catch(A){return this.options.onLoadError?.(A,f),[]}}async restoreAttachment(f,A){try{return await this.options.restoreAttachment(f,A)}catch($){this.options.onRestoreError?.($,f);return}}}function D0(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function a8(f){return D0(f)&&f.kind==="upload"&&typeof f.id==="string"}function yf(f){if(a8(f))return"uploaded file";if(Array.isArray(f))return f.map((A)=>yf(A));if(!D0(f))return f;return zA(f)}function zA(f){return Object.fromEntries(Object.entries(f).map(([A,$])=>[A,yf($)]))}function O0(f){if(f.kind!=="tool-approval")return f;return{...f,...f.input!==void 0?{input:zA(f.input)}:{},...f.output!==void 0?{output:yf(f.output)}:{}}}function k0(f,A){if(f.kind==="attachment")return r8(f,A);if(f.kind==="tool-approval")return t8(f);if(f.kind==="sources")return e8(f,A);return fV(f,A)}function r8(f,A){if(A.deniedCardIds?.has(f.id))return"Artifact: Not available at your access level.";let $=xA(f);if(!$)return"Artifact: Generated artifact";let Z=[`Artifact: ${$.title}`];if($.description)Z.push($.description);if($.filename)Z.push(`File: ${$.filename}`);if($.mediaType)Z.push(`Type: ${$.mediaType}`);if($.sizeLabel)Z.push(`Size: ${$.sizeLabel}`);let V=A.resolveUrl($.previewUrl),H=A.resolveUrl($.url),M=A.resolveUrl($.downloadUrl);if(V&&!A.isHiddenUrl(V))Z.push(`Preview: ${V}`);if(H&&!A.isHiddenUrl(H))Z.push(`Open: ${H}`);if(M&&!A.isHiddenUrl(M))Z.push(`Download: ${M}`);return Z.join(`
13
+ `)}function t8(f){let A=[`Approval: ${f.summary||f.toolName}`];if(A.push(`Status: ${f.state}`),f.preview)A.push(f.preview);let $=JA(f.output);if($)A.push(`Result: ${$}`);if(f.error)A.push(`Error: ${f.error}`);return A.join(`
14
+ `)}function e8(f,A){let $=[`Sources: ${f.title??"Retrieved context"}`];for(let Z of f.sources){let V=A.resolveUrl(Z.url),H=V&&!A.isHiddenUrl(V)?` \u2014 ${V}`:"";$.push(`- ${Z.title??Z.source}${H}`)}return $.join(`
15
+ `)}function fV(f,A){let $=[`Actions: ${f.title??"Suggested actions"}`];for(let Z of f.actions){let V=Z.type==="event"&&A.eventActionUnavailableLabel?` (${A.eventActionUnavailableLabel})`:"";$.push(`- ${Z.label}${V}`)}return $.join(`
16
+ `)}function J0(f){return{identity:f.identity,interfaceType:f.interfaceType,role:f.role??"user",...f.displayName?{displayName:f.displayName}:{},...f.username?{username:f.username}:{},...f.isBot!==void 0?{isBot:AV(f.isBot)}:{}}}function AV(f){if(typeof f==="boolean")return f;return f.toLowerCase()==="true"}function x0(f){return{...f.messageId?{messageId:f.messageId}:{},...f.channelId?{channelId:f.channelId}:{},...f.channelName?{channelName:f.channelName}:{},...f.threadId?{threadId:f.threadId}:{},...f.metadata?{metadata:f.metadata}:{}}}function w0(f){if(f.skippedMessages.length===0)return{message:f.message};return{message:["Messages received while the previous response was still running (oldest first, for context only):",...f.skippedMessages.map($V),"","Latest message to answer:",f.message].join(`
17
+ `),metadata:{supersededMessageCount:f.skippedMessages.length,supersededMessageIds:f.skippedMessages.map((Z)=>Z.id).filter((Z)=>Z!==void 0)}}}function $V(f){let A=f.text.trim(),$=f.authorName?.trim();return $?`- ${$}: ${A}`:`- ${A}`}async function YV(f){let{entityType:A,title:$,deriveId:Z,regeneratePrompt:V,context:H}=f,M=Z($),X=await H.entityService.getEntity({entityType:A,id:M});if(!X||X.metadata.status==="generating")return $;H.logger.debug(`Entity ID collision: ${A}/${M}, asking AI for a new title`);let L=U.object({title:U.string().max(80).describe("A short, unique title (2-6 words)")}),{object:C}=await H.ai.generateObject(`The title "${$}" is already taken. ${V}`,L),N=C.title;return H.logger.debug(`AI suggested new title: "${N}"`),N}class yA{tail=Promise.resolve();run(f){let A=this.tail.then(()=>f());return this.tail=A.then(()=>{return},()=>{return}),A}async settle(){await this.tail}}var FV="current";class T0{store;schema;createEmpty;key;queue=new yA;statePromise;constructor(f){this.store=f.runtimeState.scoped({namespace:f.namespace,schema:f.schema}),this.schema=f.schema,this.createEmpty=f.createEmpty,this.key=f.key??FV}mutate(f){return this.queue.run(async()=>{let A=await this.load(),$=await f(A);return await this.persist(A),$})}async snapshot(){return await this.settle(),structuredClone(await this.load())}settle(){return this.queue.settle()}load(){return this.statePromise??=this.store.get(this.key).then((f)=>f??this.createEmpty()),this.statePromise}async persist(f){await this.store.set(this.key,this.schema.parse(f))}}var H7=["GET","POST","PUT","DELETE","OPTIONS"];function NV(f,A={}){return new Response(JSON.stringify(f),{status:A.status??200,headers:{"Content-Type":"application/json; charset=utf-8",...A.headers}})}var AZ="cms:register-workspace";var PV=U.object({workspaceUrl:U.string()});async function KV(f,A){let $=await f.messaging.send({type:AZ,payload:A});if(!("success"in $)||!$.success)return;let Z=PV.safeParse($.data);return Z.success?Z.data.workspaceUrl:void 0}var $Z=jf.extend({id:U.literal("brain-character"),entityType:U.literal("brain-character")}),jA=U.object({name:U.string().describe("The brain's friendly display name"),role:U.string().describe("The brain's primary role"),purpose:U.string().describe("The brain's purpose and goals"),values:U.array(U.string()).describe("Core values that guide behavior")});var q0=U.record(U.string(),U.unknown());class hA extends hf{constructor(){super({entityType:"brain-character",purpose:"The brain's own identity, character, and purpose (singleton).",schema:$Z,frontmatterSchema:jA,isSingleton:!0,hasBody:!1})}createCharacterContent(f){return this.buildMarkdown("",f)}parseCharacterBody(f){return this.parseFrontmatter(f)}toMarkdown(f){let A=this.parseFrontmatter(f.content);return this.buildMarkdown("",q0.parse(A))}fromMarkdown(f){return{content:f,entityType:"brain-character"}}extractMetadata(f){let A=this.parseFrontmatter(f.content);return{role:A.role,values:A.values}}generateFrontMatter(f){let A=this.parseFrontmatter(f.content);return this.buildMarkdown("",q0.parse(A))}}class vA extends uA{adapter=new hA;static getDefaultCharacter(){return{name:"Brain",role:"Knowledge assistant",purpose:"Help organize, understand, and retrieve information from your knowledge base",values:["clarity","accuracy","helpfulness"]}}static createFresh(f,A,$){return new vA(f,A,$)}constructor(f,A,$){super(f,A,"brain-character",$??vA.getDefaultCharacter(),vf("brain character is loaded at bootstrap before any user is in scope"))}parseBody(f){return this.adapter.parseCharacterBody(f)}createContent(f){return this.adapter.createCharacterContent(f)}getCharacter(){return this.get()}getCharacterContent(){return this.getContent()}}var ZZ=jf.extend({id:U.literal("anchor-profile"),entityType:U.literal("anchor-profile")}),m0=U.enum(["person","team","organization"]),Lf=U.object({name:U.string().describe("Name of the anchor"),organization:U.string().optional().describe("Organization the anchor belongs to"),description:U.string().optional().describe("Short description or biography"),avatar:U.string().optional().describe("URL or asset path to avatar/logo"),website:U.string().optional().describe("Primary website URL"),email:U.string().optional().describe("Contact email"),socialLinks:U.array(U.object({platform:U.enum(["github","instagram","linkedin","email","website"]).describe("Social media platform"),url:U.string().describe("Profile or contact URL"),label:U.string().optional().describe("Optional display label")})).optional().describe("Social media and contact links")});var GV=U.record(U.string(),U.unknown());class bA extends hf{constructor(){super({entityType:"anchor-profile",purpose:"The profile of the brain's Anchor (singleton).",schema:ZZ,frontmatterSchema:Lf,isSingleton:!0,hasBody:!0})}createProfileContent(f){let A=Lf.parse(f);return this.buildMarkdown("",A)}parseProfileBody(f,A){if(A){let{metadata:$,content:Z}=wf(f,A);return Z?{...$,story:Z}:$}return this.parseFrontmatter(f)}fromMarkdown(f){return{content:f,entityType:"anchor-profile"}}extractMetadata(f){let A=this.parseFrontmatter(f.content);return{name:A.name,email:A.email,website:A.website}}generateFrontMatter(f){let A=this.parseFrontmatter(f.content);return this.buildMarkdown("",GV.parse(A))}}class uf extends uA{adapter=new bA;static getDefaultProfile(){return{name:"Unknown"}}static createFresh(f,A,$){return new uf(f,A,$)}constructor(f,A,$){super(f,A,"anchor-profile",$??uf.getDefaultProfile(),vf("anchor profile is loaded at bootstrap before any user is in scope"))}parseBody(f){return this.adapter.parseProfileBody(f)}createContent(f){return this.adapter.createProfileContent(f)}getProfile(){return this.get()}getProfileContent(){return this.getContent()}}var gA=U.enum(["person","team","organization"]),QV=U.object({kind:U.string().trim().min(1),category:gA,labels:U.object({singular:U.string().trim().min(1),plural:U.string().trim().min(1)})});function WV(f){if(typeof f!=="object"||f===null||!("shape"in f)||!("safeParse"in f)||typeof f.safeParse!=="function")throw Error("Profile kind fields must be a Zod object schema")}class S0{selectedKind;registrations=new Map;finalized=!1;resolved=null;selectedDefinition;constructor(f){let A=f?.trim();this.selectedKind=A===""?void 0:A}register(f,A){if(this.finalized)throw Error("Profile kind registration is closed");let $=QV.parse(A);WV(A.fields);let Z=Object.freeze({...A,kind:$.kind,category:$.category,labels:Object.freeze({...$.labels})}),V=this.registrations.get($.kind)??[];V.push({pluginId:f,definition:Z}),this.registrations.set($.kind,V)}unregisterPlugin(f){for(let[A,$]of this.registrations){let Z=$.filter((V)=>V.pluginId!==f);if(Z.length===0)this.registrations.delete(A);else this.registrations.set(A,Z)}}finalize(){if(this.finalized)return this.resolved;let A=[...this.registrations.entries()].filter(([,Z])=>Z.length>1).sort(([Z],[V])=>Z.localeCompare(V))[0];if(A){let[Z,V]=A,H=V.map((M)=>M.pluginId).sort().join(", ");throw Error(`Profile kind "${Z}" is registered by multiple plugins: ${H}`)}if(!this.selectedKind)return this.finalized=!0,this.resolved=null,null;let $=this.registrations.get(this.selectedKind)?.[0];if(!$)throw Error(`Selected profile kind "${this.selectedKind}" is not registered`);return this.selectedDefinition=$.definition,this.resolved=Object.freeze({kind:$.definition.kind,category:$.definition.category,labels:Object.freeze({...$.definition.labels})}),this.finalized=!0,this.resolved}getResolved(){return this.assertFinalized(),this.resolved}getSelectedDefinition(){return this.assertFinalized(),this.selectedDefinition}isFinalized(){return this.finalized}assertFinalized(){if(!this.finalized)throw Error("Profile kind selection has not been finalized")}}var E0=30000;class VZ{logger;resolver;links=[];actorIndex=new Map;negativeActorIndex=new Map;static createFresh(f,A){return new VZ(f,A)}constructor(f,A){this.logger=f.child("CanonicalIdentityService"),this.resolver=A}async refreshCache(){this.links=[],this.actorIndex=new Map,this.negativeActorIndex=new Map,this.logger.debug("Canonical identity links refreshed",{linkCount:0,actorCount:0})}getLinks(){return this.links}resolveActor(f){let A=UZ(f),$=this.actorIndex.get(A);if(!$)return null;if($.expiresAt<=Date.now())return this.actorIndex.delete(A),null;return $.resolution}async enrichActor(f){if(f.identity.kind==="user"&&f.identity.canonicalId||f.role!=="user")return f;let A=this.resolveActor(f.identity);if(A)return this.enrichedActor(f,A);let $=UZ(f.identity),Z=this.negativeActorIndex.get($);if(Z&&Z>Date.now())return f;this.negativeActorIndex.delete($);let V=await this.resolver?.(f.identity);if(!V)return this.negativeActorIndex.set($,Date.now()+E0),f;let H={identity:f.identity,...f.displayName?{label:f.displayName}:{}},M={...V,actors:[H],matchedActor:H};return this.actorIndex.set($,{resolution:M,expiresAt:Date.now()+E0}),this.links=[...this.links.filter((X)=>X.userId!==M.userId),M],this.enrichedActor(f,M)}enrichedActor(f,A){return{...f,identity:{kind:"user",userId:A.userId,canonicalId:A.canonicalId},...A.displayName?{displayName:A.displayName}:{}}}}var z0="https://rizom.ai/ext/anchor-profile/v1",y0=U.looseObject({id:U.string(),description:U.string(),name:U.string().optional(),tags:U.array(U.string()).optional().default([])}),j0=Lf.extend({kind:U.string().trim().min(1).optional(),category:gA.optional()}).superRefine((f,A)=>{if(f.kind===void 0!==(f.category===void 0))A.addIssue({code:"custom",message:"Anchor kind and category must be provided together"})}),RV=U.looseObject({uri:U.string(),params:U.record(U.string(),U.unknown()).optional()}),h0=U.looseObject({name:U.string(),url:U.string(),description:U.string().optional(),skills:U.array(y0).optional().default([]),capabilities:U.looseObject({extensions:U.array(RV).optional().default([])}).optional()});function BV(f){let A=h0.safeParse(f);if(!A.success)return null;let $=A.data,V=($.capabilities?.extensions??[]).find((M)=>M.uri===z0),H=null;if(V?.params){let M=j0.safeParse(V.params);if(M.success)H=M.data}return{brainName:$.name,url:$.url,description:$.description??"",skills:$.skills.map((M)=>({id:M.id,name:M.name??M.id,description:M.description,tags:M.tags})),anchor:H}}var _V=U.object({name:U.string(),description:U.string(),tags:U.array(U.string()),examples:U.array(U.string())});import{EventEmitter as b0}from"events";var m={REGISTERED:"registered",INITIALIZED:"initialized",ERROR:"error",DISABLED:"disabled"},p={REGISTERED:"plugin:registered",BEFORE_INITIALIZE:"plugin:before_initialize",INITIALIZED:"plugin:initialized",ERROR:"plugin:error",DISABLED:"plugin:disabled"};class l extends Error{pluginId;constructor(f,A){super(`Plugin ${f}: ${A}`);this.name="PluginError",this.pluginId=f}}class HZ{scope;ingress=new Set;closePromise=null;closed=!1;constructor(){this.scope=P.runSync(h.make())}addFinalizer(f){if(this.closed)throw Error("Cannot register a resource after plugin teardown");P.runSync(h.addFinalizer(this.scope,P.promise(async()=>{await f()})))}addIngress(f){if(this.closed)throw Error("Cannot register ingress after plugin teardown");this.ingress.add(f)}close(f=g.void){return this.closed=!0,this.closePromise??=this.closeScope(f),this.closePromise}async closeScope(f){let A,$=!1,Z=[...this.ingress].reverse();for(let X of Z)try{X.stopAdmission()}catch(L){if(!$)A=L;$=!0}let V=await Promise.allSettled(Z.map((X)=>Promise.resolve().then(()=>X.drain())));this.ingress.clear();let H=V.find((X)=>X.status==="rejected");if(!$&&H)A=H.reason,$=!0;let M=await P.runPromiseExit(h.close(this.scope,f));if(!$&&g.isFailure(M))A=LA.squash(M.cause),$=!0;if($)throw A}}function v0(f,A){let $=f.getMessageBus(),Z=new Set,V={send:(G)=>$.send(G),subscribe:(G,_,Q)=>{let x=!0,y=new Set,T=(lA)=>{if(!x)return{noop:!0};let CZ,YZ=new Promise((r)=>{CZ=r});y.add(YZ);let nA=()=>{y.delete(YZ),CZ()},FZ;try{FZ=Promise.resolve(_(lA))}catch(r){throw nA(),r}return FZ.then((r)=>{return nA(),r},(r)=>{throw nA(),r})},pA=$.subscribe(G,T,Q),Gf={type:G,originalHandler:_,stopAdmission:()=>{if(!x)return;x=!1,pA(),Z.delete(Gf)}};Z.add(Gf);try{A.addIngress({stopAdmission:Gf.stopAdmission,drain:async()=>{await Promise.all(y)}})}catch(lA){throw Gf.stopAdmission(),lA}return Gf.stopAdmission},unsubscribe:(G,_)=>{let Q=[...Z].filter((x)=>x.type===G&&x.originalHandler===_);if(Q.length===0){$.unsubscribe(G,_);return}for(let x of Q)x.stopAdmission()}},H=f.getAttachmentRegistry(),M={...H,register:(G,_,Q)=>{let x=!0,y=H.register(G,_,Q),T=()=>{if(!x)return;x=!1,y()};return A.addFinalizer(T),T}},X=f.getEntityRegistry(),L=new Proxy(X,{get(G,_){let Q=Reflect.get(G,_,G);if(_==="registerEntityType"&&typeof Q==="function")return(...x)=>{let y=Reflect.apply(Q,G,x),T=x[0];if(typeof T==="string")A.addFinalizer(()=>G.unregisterEntityType(T));return y};return typeof Q==="function"?Q.bind(G):Q}}),C=f.getProfileKindRegistry(),N=new Proxy(C,{get(G,_){let Q=Reflect.get(G,_,G);if(_==="register"&&typeof Q==="function")return(...x)=>{let y=Reflect.apply(Q,G,x),T=x[0];if(typeof T==="string")A.addFinalizer(()=>G.unregisterPlugin(T));return y};return typeof Q==="function"?Q.bind(G):Q}}),F=f.getChannelRegistry(),W=new Proxy(F,{get(G,_){let Q=Reflect.get(G,_,G);if((_==="registerDescriptor"||_==="registerDeliveryProvider")&&typeof Q==="function")return(...x)=>{let y=Reflect.apply(Q,G,x),T=x[0];if(typeof T==="string")A.addFinalizer(()=>G.unregisterPlugin(T));return y};return typeof Q==="function"?Q.bind(G):Q}}),R=f.getInboxRegistry(),q=new Proxy(R,{get(G,_){let Q=Reflect.get(G,_,G);if(_==="registerSource"&&typeof Q==="function")return(...x)=>{let y=Reflect.apply(Q,G,x),T=x[0];if(typeof T==="string")A.addFinalizer(()=>G.unregisterPlugin(T));return y};return typeof Q==="function"?Q.bind(G):Q}}),O=f.getDataSourceRegistry(),I=new Proxy(O,{get(G,_){let Q=Reflect.get(G,_,G);if(_==="register"&&typeof Q==="function")return(...x)=>{let y=Reflect.apply(Q,G,x),T=x[0];if(typeof T==="object"&&T!==null&&"id"in T&&typeof T.id==="string"){let pA=T.id.includes(":")?T.id:`shell:${T.id}`;A.addFinalizer(()=>G.unregister(pA))}return y};return typeof Q==="function"?Q.bind(G):Q}}),a=f.getInsightsRegistry(),z=new Proxy(a,{get(G,_){let Q=Reflect.get(G,_,G);if(_==="register"&&typeof Q==="function")return(...x)=>{let y=Reflect.apply(Q,G,x),T=x[0];if(typeof T==="string")A.addFinalizer(()=>G.unregister(T));return y};return typeof Q==="function"?Q.bind(G):Q}}),c=new Proxy(f,{get(G,_){if(_==="getMessageBus")return()=>V;if(_==="getAttachmentRegistry")return()=>M;if(_==="getEntityRegistry")return()=>L;if(_==="getDataSourceRegistry")return()=>I;if(_==="getProfileKindRegistry")return()=>N;if(_==="getChannelRegistry")return()=>W;if(_==="getInboxRegistry")return()=>q;if(_==="getInsightsRegistry")return()=>z;let Q=Reflect.get(G,_,G);return typeof Q==="function"?Q.bind(G):Q}});return CU(f,c),c}class MZ{plugins;events;daemonRegistry;logger;projectionRegistry;resourceScopes=new Map;releasePromises=new Map;constructor(f,A,$,Z,V){this.plugins=f,this.events=A,this.daemonRegistry=$,this.projectionRegistry=Z,this.logger=V.child("PluginLifecycle")}async initializePlugin(f,A,$){let Z=this.plugins.get(f);if(!Z)throw new l(f,"Registration failed: Plugin is not registered");let V=Z.plugin,H=new HZ;H.addFinalizer(()=>A.unregisterPluginCapabilities?.(f)),H.addFinalizer(()=>A.getJobQueueService().unregisterPluginHandlers(f)),H.addFinalizer(()=>this.projectionRegistry.unregisterPlugin(f)),this.resourceScopes.set(f,H),this.releasePromises.delete(f),this.logger.debug(`Initializing plugin: ${f}`);try{this.events.emit(p.BEFORE_INITIALIZE,f,V);let M=await V.register(v0(A,H),$);return Z.status=m.INITIALIZED,this.logger.debug(`Initialized plugin: ${f}`),this.events.emit(p.INITIALIZED,f,V),M}catch(M){throw this.logger.error(`Error initializing plugin ${f}: ${S(M)}`),await this.failPluginInitialization(f,M),M}}async finalizePluginRegistration(f){let A=this.plugins.get(f);if(!A)throw new l(f,"Registration finalization failed: Plugin is not registered");if(A.status!==m.INITIALIZED)return;try{await A.plugin.finalizeRegistration?.(),this.logger.debug(`Registration finalized for plugin: ${f}`)}catch($){throw await this.failPluginInitialization(f,$),$}}async readyPlugin(f){let A=this.plugins.get(f);if(!A)throw new l(f,"Ready failed: Plugin is not registered");if(A.status!==m.INITIALIZED){this.logger.debug(`Skipping ready hook for non-initialized plugin: ${f}`);return}try{await A.plugin.ready?.(),this.logger.debug(`Ready hook completed for plugin: ${f}`)}catch($){let Z=Nf($);A.status=m.ERROR,A.error=Z;try{this.events.emit(p.ERROR,f,Z)}catch(V){this.logger.error(`Plugin error listener failed for ${f}`,V)}throw Z}}async startPluginDaemons(f){let A=this.plugins.get(f);if(A?.status!==m.INITIALIZED)return;try{await this.daemonRegistry.startPlugin(f),this.logger.debug(`Started daemons for plugin: ${f}`)}catch($){if(A.plugin.requiresDaemonStartup?.())throw $;this.logger.warn(`Daemon ${f} failed to start: ${S($)}`)}}async failPluginInitialization(f,A){let $=this.plugins.get(f);if(!$)return;let Z=$.status!==m.ERROR,V=Nf(A);if($.status=m.ERROR,$.error=V,await this.releasePluginResources(f,g.fail(A)),Z)try{this.events.emit(p.ERROR,f,V)}catch(H){this.logger.error(`Plugin error listener failed for ${f}`,H)}}async disablePlugin(f){let A=this.plugins.get(f);if(!A){this.logger.warn(`Cannot disable plugin ${f}: not registered`);return}if(A.status===m.DISABLED)return;this.logger.debug(`Disabling plugin: ${f}`);let $=A.status===m.ERROR;await this.releasePluginResources(f,g.void);let Z=this.plugins.get(f);if(!$&&Z&&Z.status!==m.DISABLED)Z.status=m.DISABLED,this.events.emit(p.DISABLED,f,Z.plugin);this.logger.debug(`Disabled plugin: ${f}`)}releasePluginResources(f,A){let $=this.releasePromises.get(f);if($)return $;let Z=this.releasePluginResourcesOnce(f,A);return this.releasePromises.set(f,Z),Z}async releasePluginResourcesOnce(f,A){let $=this.plugins.get(f);if(!$)return;try{await this.daemonRegistry.stopPlugin(f),this.logger.debug(`Stopped daemons for plugin: ${f}`)}catch(V){this.logger.error(`Failed to stop daemons for plugin: ${f}`,V)}let Z=this.resourceScopes.get(f);if(this.resourceScopes.delete(f),Z)try{await Z.close(A)}catch(V){this.logger.error(`Failed to close resources for plugin ${f}`,V)}if($.plugin.shutdown)try{await $.plugin.shutdown(),this.logger.debug(`Shutdown completed for plugin: ${f}`)}catch(V){this.logger.error(`Plugin shutdown failed for ${f}:`,V)}for(let V of this.daemonRegistry.getByPlugin(f))try{await this.daemonRegistry.unregister(V.name)}catch(H){this.logger.error(`Failed to unregister daemon ${V.name} for plugin ${f}`,H)}}}class XZ{plugins;events;logger;constructor(f,A,$){this.plugins=f,this.events=A,this.logger=$.child("DependencyResolver")}async resolveInitializationOrder(f){this.logger.debug("Resolving plugin initialization order...");let A=Array.from(this.plugins.keys()),$=new Set,Z=!0;while(Z&&$.size<A.length){Z=!1;for(let M of A){if($.has(M))continue;if(!this.plugins.get(M))continue;if(this.getUnmetDependencies(M).length===0)try{await f(M),$.add(M),Z=!0}catch(C){let N=S(C);this.logger.error(`Failed to initialize plugin ${M}: ${N}`),$.add(M),Z=!0}}}let V=A.filter((M)=>!$.has(M));if(V.length>0){let M=V.join(", ");this.logger.error(`Failed to initialize plugins due to dependency issues: ${M}`);for(let X of V){let L=this.getUnmetDependencies(X);this.logger.error(`Plugin ${X} has unmet dependencies: ${L.join(", ")}`);let C=this.plugins.get(X);if(C)C.status=m.ERROR,C.error=new l(X,`Unmet dependencies: ${L.join(", ")}`);this.events.emit(p.ERROR,X,C?.error)}}let H=new Set;for(let[M,X]of this.plugins)if(X.status===m.INITIALIZED)H.add(M);return this.logger.debug(`Resolved ${H.size} of ${A.length} plugins`),{initialized:H,failed:V}}getUnmetDependencies(f){let A=this.plugins.get(f);if(!A)return[];let{dependencies:$}=A,Z=[];for(let V of $){let H=this.plugins.get(V);if(!H){Z.push(V);continue}if(H.status!==m.INITIALIZED)Z.push(V)}return Z}}class LZ{logger;projectionRegistry;constructor(f,A){this.logger=f.child("CapabilityRegistrar"),this.projectionRegistry=A}async registerCapabilities(f,A,$,Z){if(!Z?.executionOnly&&$.tools.length>0)f.registerTools(A,$.tools),this.logger.debug(`Registered ${$.tools.length} tools from ${A}`);if(!Z?.executionOnly&&$.resources.length>0)f.registerResources(A,$.resources),this.logger.debug(`Registered ${$.resources.length} resources from ${A}`);if(!Z?.executionOnly&&$.instructions)f.registerInstructions(A,$.instructions),this.logger.debug(`Registered instructions from ${A}`);let V=$.projectionRules??[];try{for(let H of V)this.projectionRegistry.registerRule(A,H)}catch(H){throw this.projectionRegistry.unregisterPlugin(A),H}if(V.length>0)this.logger.debug(`Registered ${V.length} projection rules from ${A}`)}}class IA{projections=new Map;rules=new Map;static createFresh(){return new IA}constructor(){}registerRule(f,A){if(!Object.isFrozen(A))throw Error(`Projection rule "${A.id}" must be created with defineProjectionRule`);let $=this.projections.get(A.id);if($)throw Error(`Projection "${A.id}" is already registered by "${$.pluginId}"`);let Z={id:A.id,pluginId:f,targetType:A.targetType,sources:A.sources.map((H)=>({kind:H.kind,types:[...H.types],...H.excludeTypes?{excludeTypes:[...H.excludeTypes]}:{}}))};this.projections.set(A.id,Z),this.rules.set(A.id,A);let V=!0;return()=>{if(!V)return;if(V=!1,this.rules.get(A.id)===A)this.rules.delete(A.id);if(this.projections.get(A.id)===Z)this.projections.delete(A.id)}}unregisterPlugin(f){for(let[A,$]of this.projections)if($.pluginId===f)this.projections.delete(A),this.rules.delete(A)}list(){return Array.from(this.projections.values()).sort((f,A)=>f.id.localeCompare(A.id)).map(kV)}listRules(){return[...this.rules.values()].sort((f,A)=>f.id.localeCompare(A.id))}validate(f){let A=this.list(),$=new Set(f.map(({type:M})=>M));for(let M of A)if(!$.has(M.targetType))throw Error(`Projection "${M.id}" targets unregistered entity type "${M.targetType}"`);let Z=f.filter(({projectionSource:M})=>M).map(({type:M})=>M).sort(),V=JV(A,Z),H=wV(A,V)[0];if(H){let M=TV(H,V);throw Error(`Projection cycle is not supported: ${[...M,M[0]].join(" -> ")}`)}return OV({projections:A,edges:V,unknownSourceTypes:DV(A,$)})}}function DV(f,A){let $=[];for(let Z of f){let V=[...new Set(Z.sources.flatMap((H)=>[...H.types,...H.excludeTypes??[]]).filter((H)=>H!=="*"&&!A.has(H)))].sort();if(V.length>0)$.push({projectionId:Z.id,types:V})}return $}function OV(f){for(let A of f.projections){for(let $ of A.sources){if(Object.freeze($.types),$.excludeTypes)Object.freeze($.excludeTypes);Object.freeze($)}Object.freeze(A.sources),Object.freeze(A)}for(let A of f.edges)Object.freeze(A.causes),Object.freeze(A);for(let A of f.unknownSourceTypes)Object.freeze(A.types),Object.freeze(A);return Object.freeze(f.unknownSourceTypes),Object.freeze(f.projections),Object.freeze(f.edges),Object.freeze(f)}function kV(f){return{...f,sources:f.sources.map((A)=>({...A,types:[...A.types],...A.excludeTypes?{excludeTypes:[...A.excludeTypes]}:{}}))}}function JV(f,A){let $=new Map;for(let Z of f)for(let V of f){let H=xV(Z,V,A);if(H.length===0)continue;$.set(`${Z.id}\x00${V.id}`,new Set(H))}return Array.from($,([Z,V])=>{let[H="",M=""]=Z.split("\x00");return{from:H,to:M,causes:[...V].sort()}}).sort((Z,V)=>Z.from.localeCompare(V.from)||Z.to.localeCompare(V.to))}function xV(f,A,$){let Z=[];for(let V of A.sources){let H=new Set(V.excludeTypes??[]);if((V.types.includes("*")?[...V.types.filter((X)=>X!=="*"),...$]:V.types).includes(f.targetType)&&!H.has(f.targetType))Z.push(`entity:${f.targetType}`)}return[...new Set(Z)]}function wV(f,A){let $=f.map(({id:F})=>F).sort(),Z=u0($,A),V=new Map,H=new Map,M=[],X=new Set,L=[],C=0,N=(F)=>{V.set(F,C),H.set(F,C),C++,M.push(F),X.add(F);for(let O of Z.get(F)??[])if(!V.has(O))N(O),H.set(F,Math.min(H.get(F)??0,H.get(O)??0));else if(X.has(O))H.set(F,Math.min(H.get(F)??0,V.get(O)??0));if(H.get(F)!==V.get(F))return;let W=[],R;do{if(R=M.pop(),!R)break;X.delete(R),W.push(R)}while(R!==F);let q=Z.get(F)?.includes(F)??!1;if(W.length>1||q)L.push(W.sort())};for(let F of $)if(!V.has(F))N(F);return L.sort((F,W)=>(F[0]??"").localeCompare(W[0]??""))}function TV(f,A){let $=new Set(f),Z=u0(f,A),V=[...f].sort()[0];if(!V)return[];if(Z.get(V)?.includes(V))return[V];let H=(M,X)=>{for(let L of Z.get(M)??[]){if(!$.has(L))continue;if(L===V)return X;if(X.includes(L))continue;let C=H(L,[...X,L]);if(C)return C}return};return H(V,[V])??[...f].sort()}function u0(f,A){let $=new Map;for(let Z of f)$.set(Z,[]);for(let Z of A){let V=$.get(Z.from);if(V&&!V.includes(Z.to))V.push(Z.to)}for(let Z of $.values())Z.sort();return $}async function g0(f){let $=(await P.runPromise(P.all(f.map((Z)=>P.either(P.tryPromise({try:Z,catch:(V)=>V}))),{concurrency:"unbounded"}))).find(I0.isLeft);if($)throw $.left}class cA{plugins=new Map;logger;events=new b0;daemonRegistry;shell=null;initializedPluginIds=[];pluginLifecycle;dependencyResolver;capabilityRegistrar;projectionRegistry=IA.createFresh();projectionGraph;static createFresh(f,A){return new cA(f,A)}setShell(f){this.shell=f}constructor(f,A){this.logger=f.child("PluginManager"),this.events=new b0,this.daemonRegistry=A,this.pluginLifecycle=new MZ(this.plugins,this.events,this.daemonRegistry,this.projectionRegistry,f),this.dependencyResolver=new XZ(this.plugins,this.events,f),this.capabilityRegistrar=new LZ(f,this.projectionRegistry)}registerPlugin(f){if(!f.id)throw new l("unknown","Registration failed: Plugin must have an id");if(this.logger.debug(`Registering plugin: ${f.id} (${f.version})`),this.plugins.has(f.id)){let V=this.plugins.get(f.id)?.plugin.version;throw new l(f.id,`Registration failed: Plugin is already registered with version ${V}`)}let A=f.dependencies??[],$={plugin:f,status:m.REGISTERED,dependencies:A};this.plugins.set(f.id,$),this.logger.debug(`Registered plugin: ${f.id} (${f.version})`),this.events.emit(p.REGISTERED,f.id,f)}async initializePlugins(f){this.logger.debug("Initializing plugins..."),this.initializedPluginIds=[];let A=await this.dependencyResolver.resolveInitializationOrder(async($)=>{await this.initializePlugin($,f)});this.logger.debug(`Initialized ${A.initialized.size} of ${this.plugins.size} plugins`)}async initializePlugin(f,A){if(!this.shell)throw new l(f,"Cannot initialize plugin: Shell not set. Call setShell() first.");let $=this.shell;try{let Z=await this.pluginLifecycle.initializePlugin(f,$,A);await this.capabilityRegistrar.registerCapabilities($,f,Z,{executionOnly:A?.executionOnly}),this.initializedPluginIds.push(f)}catch(Z){throw await this.pluginLifecycle.failPluginInitialization(f,Z),Z}}async finalizePluginRegistrations(){this.logger.debug("Finalizing plugin registrations...");for(let $ of this.initializedPluginIds)await this.pluginLifecycle.finalizePluginRegistration($);if(!this.shell)throw Error("Cannot validate projections before the shell is set");let f=this.shell.getEntityRegistry(),A=this.projectionRegistry.validate(f.getAllEntityTypes().map(($)=>{let Z=f.getEntityTypeConfig($);return{type:$,projectionSource:Z.projectionSource!==!1&&Z.projectionSourceRole!=="excluded"}}));this.projectionGraph=A;for(let $ of A.unknownSourceTypes)this.logger.warn("Projection declares entity source types no installed plugin registers",{projectionId:$.projectionId,types:$.types});this.logger.debug("Validated projection graph",{projections:A.projections.length,edges:A.edges.length})}getProjectionGraphSnapshot(){if(!this.projectionGraph)throw Error("Projection graph has not been finalized");return this.projectionGraph}getProjectionRulesSnapshot(){if(!this.projectionGraph)throw Error("Projection graph has not been finalized");return Object.freeze(this.projectionRegistry.listRules())}async readyPlugins(){this.logger.debug("Dispatching plugin ready hooks...");try{await g0(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.readyPlugin(f)))}catch(f){for(let A of this.initializedPluginIds){let $=this.plugins.get(A);if($?.status===m.ERROR)await this.pluginLifecycle.failPluginInitialization(A,$.error??f)}throw f}}async startPluginDaemons(){this.logger.debug("Starting plugin daemons..."),await g0(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.startPluginDaemons(f)))}getPlugin(f){return this.plugins.get(f)?.plugin}getPluginStatus(f){return this.plugins.get(f)?.status}hasPlugin(f){return this.plugins.has(f)}isPluginInitialized(f){return this.plugins.get(f)?.status===m.INITIALIZED}getAllPluginIds(){return Array.from(this.plugins.keys())}getAllPlugins(){return new Map(this.plugins)}getFailedPlugins(){return Array.from(this.plugins.entries()).filter((f)=>f[1].status===m.ERROR&&f[1].error!==void 0).map(([f,A])=>({id:f,error:A.error}))}getPluginPackageName(f){return this.plugins.get(f)?.plugin.packageName}async disablePlugin(f){await this.pluginLifecycle.disablePlugin(f)}async shutdownPlugins(){let f=new Set;for(let A of[...this.initializedPluginIds].reverse())await this.disablePlugin(A),f.add(A);for(let A of[...this.plugins.keys()].reverse())if(!f.has(A))await this.disablePlugin(A)}on(f,A){this.events.on(f,A)}once(f,A){this.events.once(f,A)}off(f,A){this.events.off(f,A)}getEventEmitter(){return this.events}}export{i1 as ic,s as jc,rf as kc,ef as lc,Y as mc,k as nc,Ff as oc,C$ as pc,Y$ as qc,F$ as rc,N$ as sc,xf as tc,P$ as uc,K$ as vc,G$ as wc,w as xc,j as yc,e as zc,ff as Ac,WZ as Bc,RZ as Cc,a0 as Dc,lf as Ec,c0 as Fc,p0 as Gc,iA as Hc,sA as Ic,VA as Jc,I1 as Kc,XA as Lc,UU as Mc,c1 as Nc,O$ as Oc,aA as Pc,p1 as Qc,d0 as Rc,l1 as Sc,n1 as Tc,d1 as Uc,FA as Vc,KU as Wc,WU as Xc,RU as Yc,_U as Zc,DU as _c,A8 as $c,$8 as ad,x$ as bd,PA as cd,Xf as dd,L8 as ed,w$ as fd,Rf as gd,Bf as hd,F8 as id,yU as jd,N1 as kd,Q1 as ld,wZ as md,TZ as nd,qZ as od,W1 as pd,v$ as qd,u$ as rd,vU as sd,Pf as td,WA as ud,RA as vd,qf as wd,BA as xd,nU as yd,l$ as zd,dU as Ad,Kf as Bd,aU as Cd,rU as Dd,tU as Ed,eU as Fd,A0 as Gd,n$ as Hd,d$ as Id,V0 as Jd,i$ as Kd,kA as Ld,X0 as Md,JA as Nd,s$ as Od,L0 as Pd,C0 as Qd,F0 as Rd,N0 as Sd,xA as Td,G0 as Ud,Q0 as Vd,TA as Wd,Ef as Xd,zf as Yd,W0 as Zd,R0 as _d,B0 as $d,fZ as ae,yf as be,O0 as ce,k0 as de,J0 as ee,x0 as fe,w0 as ge,YV as he,T0 as ie,H7 as je,NV as ke,AZ as le,KV as me,jA as ne,hA as oe,vA as pe,m0 as qe,Lf as re,bA as se,uf as te,S0 as ue,VZ as ve,z0 as we,BV as xe,_V as ye,l as ze,cA as Ae};
18
+
19
+ //# debugId=7C034AC57450081D64756E2164756E21
20
+ //# sourceMappingURL=index-1bnxn2w3.js.map