@rizom/brain 0.2.0-alpha.256 → 0.2.0-alpha.257

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 (26) hide show
  1. package/dist/brain.js +722 -722
  2. package/dist/chunks/{app-fw81tb9g.js → app-ej3mv0ar.js} +2 -2
  3. package/dist/chunks/{blog-post-adapter-6w81asjz.js → blog-post-adapter-nntgatf9.js} +2 -2
  4. package/dist/chunks/{index-s6peg2cd.js → index-7h8w47y4.js} +3 -3
  5. package/dist/chunks/{index-s6peg2cd.js.map → index-7h8w47y4.js.map} +1 -1
  6. package/dist/chunks/{index-6b3x594d.js → index-7ytt9vvj.js} +10 -10
  7. package/dist/chunks/{index-6b3x594d.js.map → index-7ytt9vvj.js.map} +4 -4
  8. package/dist/chunks/{index-sfb88x96.js → index-n2xnspzc.js} +3 -3
  9. package/dist/chunks/{index-sfb88x96.js.map → index-n2xnspzc.js.map} +1 -1
  10. package/dist/chunks/{index-kq5r1h63.js → index-rx43w27v.js} +8 -8
  11. package/dist/chunks/{index-kq5r1h63.js.map → index-rx43w27v.js.map} +1 -1
  12. package/dist/chunks/{index-s4qkwc1g.js → index-vjhwdpxj.js} +60 -60
  13. package/dist/chunks/{index-s4qkwc1g.js.map → index-vjhwdpxj.js.map} +4 -4
  14. package/dist/chunks/{linkedin-template-45ne0d2t.js → linkedin-template-snenfv8p.js} +2 -2
  15. package/dist/chunks/{rss-datasource-m3zgkn5z.js → rss-datasource-hbtj9tz9.js} +2 -2
  16. package/dist/index.js +1 -1
  17. package/dist/model.js +34 -34
  18. package/dist/model.js.map +1 -1
  19. package/dist/plugins.js +1 -1
  20. package/dist/site.js +2 -2
  21. package/dist/site.js.map +1 -1
  22. package/package.json +1 -1
  23. /package/dist/chunks/{app-fw81tb9g.js.map → app-ej3mv0ar.js.map} +0 -0
  24. /package/dist/chunks/{blog-post-adapter-6w81asjz.js.map → blog-post-adapter-nntgatf9.js.map} +0 -0
  25. /package/dist/chunks/{linkedin-template-45ne0d2t.js.map → linkedin-template-snenfv8p.js.map} +0 -0
  26. /package/dist/chunks/{rss-datasource-m3zgkn5z.js.map → rss-datasource-hbtj9tz9.js.map} +0 -0
@@ -1,20 +1,20 @@
1
1
  // @bun
2
- import{$e as j,Hf as zf,Je as g,Kf as b$,Le as w,Me as R,Nf as mf,Oe as m,Pe as Lf,Pf as K$,Qe as W0,Qf as Of,Se as _f,Te as of,Ue as A$,Uf as hf,Vf as vf,We as $$,Xe as q0,Ye as Af,Yf as w$,Ze as d,Zf as QZ,_f as CA,af as B,ag as Sf,bf as o,cg as yA,df as b,hf as jf,if as If,mf as hU,pf as HA,rf as u,sf as v,tf,uf as K,vf as Vf,wf as fA,yf as ef}from"./index-x1z91h8f.js";import{ng as af}from"./index-fd1gxz8a.js";import{Fg as t0,Ig as cA}from"./index-ra0ektdg.js";import{Bh as e0}from"./index-gq8ts1j6.js";import{$h as ff,Ai as Bf,Fi as Pf,Ii as FA,Sh as cf,Th as pf,Uh as lf,Xh as UZ,ai as C0,bi as m0,ci as e$,ji as Y0,pi as S,qi as Cf,ri as wZ,si as Yf,ti as Zf,vi as N$,zi as JZ}from"./index-sam9qxh9.js";import{Qi as U}from"./index-8p1j80d4.js";var vU=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:cA}),jU=U.object({id:U.string(),conversationId:U.string(),role:Yf,content:U.string(),timestamp:U.string(),metadata:cA});var pA=U.object({name:U.string(),role:U.string(),purpose:U.string(),values:U.array(U.string())}),lA=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 X0(f){return w`count(${f||w.raw("*")})`.mapWith(Number)}function dA(f){return Y0(nA(f))}function nA(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)=>nA(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)}:${nA(H,$)}`).join(",")}}`}function iA(f){if(f!==null&&typeof f==="object"){for(let A of Object.values(f))iA(A);Object.freeze(f)}return f}var gU=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 uU(f){let A=gU.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=hf.parse(M);return iA(f.inputSchema.parse(X))},fingerprint:dA,derive:async(Z,V,H)=>{let M=f.inputSchema.parse(Z),X=U.array(vf).parse(await f.derive(M,V,H));for(let Y of X){let F=Y.operation==="upsert"?Y.entity.entityType:Y.entityType;if(F!==A.targetType)throw Error(`Projection rule "${A.id}" cannot write entity type "${F}"`)}return iA(X)}})}var L0={digest:"conversation:digest"};var J=o("conversations",{id:B("id").primaryKey(),sessionId:B("session_id").notNull(),interfaceType:B("interface_type").notNull(),channelId:B("channel_id").notNull(),personId:B("person_id"),started:B("started").notNull(),lastActive:B("last_active").notNull(),metadata:B("metadata"),created:B("created").notNull(),updated:B("updated").notNull()},(f)=>({sessionIdx:b("idx_conversations_session").on(f.sessionId),channelIdx:b("idx_conversations_channel").on(f.channelId),personIdx:b("idx_conversations_person").on(f.personId),interfaceSessionIdx:b("idx_conversations_interface_session").on(f.interfaceType,f.sessionId),interfaceChannelIdx:b("idx_conversations_interface_channel").on(f.interfaceType,f.channelId)})),h=o("messages",{id:B("id").primaryKey(),conversationId:B("conversation_id").notNull().references(()=>J.id,{onDelete:"cascade"}),role:B("role").notNull(),content:B("content").notNull(),timestamp:B("timestamp").notNull(),metadata:B("metadata")},(f)=>({conversationIdx:b("idx_messages_conversation").on(f.conversationId),timestampIdx:b("idx_messages_timestamp").on(f.timestamp)})),t=o("summary_tracking",{conversationId:B("conversation_id").primaryKey().references(()=>J.id,{onDelete:"cascade"}),lastSummarizedAt:B("last_summarized_at"),lastMessageId:B("last_message_id"),messagesSinceSummary:j("messages_since_summary").default(0),updated:B("updated").notNull()});function F0(f){return jf({url:f.url,schema:{conversations:J,messages:h,summaryTracking:t},authToken:f.authToken,authTokenEnv:"CONVERSATION_DATABASE_AUTH_TOKEN"})}var IU=U.preprocess((f)=>{if(typeof f!=="string")return f;try{return JSON.parse(f)}catch{return}},U.record(U.string(),U.unknown())).catch({});function e(f){return IU.parse(f)}var gf="conversation:messageAdded",sA="conversation:started",Wf=U.object({identity:ff,interfaceType:U.string(),role:Yf,displayName:U.string().optional(),username:U.string().optional(),isBot:U.boolean().optional()}),cU=U.preprocess(pU,Wf);function pU(f){if(!bf(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:C0({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 Df=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()}),N0=U.looseObject({actor:cU.optional(),source:Df.optional()});function G0(f){if(typeof f==="string")try{let A=JSON.parse(f);return bf(A)?A:null}catch{return null}return bf(f)?f:null}function lU(f){if(f.role!=="assistant")return!1;if(f.content.trim().length===0)return!1;let A=G0(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(!bf(V))return!1;if(V.kind==="tool-approval")return!0;return V.kind==="actions"&&V.id==="actions:upload-intent"})}function bf(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}var nU=U.object({id:U.string(),conversationId:U.string(),role:U.string(),content:U.string(),timestamp:U.string(),metadata:U.string().nullable()}),K0=U.object({conversationId:U.string(),messageCount:U.number(),messages:U.array(nU),windowStart:U.number(),windowEnd:U.number(),windowSize:U.number(),timestamp:U.string()});class uf{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 If(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 uf(f,A,$,Z)}static createFreshFromConfig(f,A,$,Z){let{db:V,client:H,url:M}=F0($),X=new uf(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(J).set({lastActive:M,updated:M}).where(R(J.id,A)),this.logger.debug("Resumed existing conversation",{conversationId:A,interfaceType:$}),A;let Y={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(J).values(Y);let F={conversationId:A,messagesSinceSummary:0,updated:M};return await this.db.insert(t).values(F),this.logger.debug("Started new conversation",{conversationId:A,sessionId:A,interfaceType:$}),await this.messageBus.send({type:sA,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=g(12),X={id:M,conversationId:A,role:$,content:Z,timestamp:H,metadata:V?JSON.stringify(V):null};await this.db.insert(h).values(X),await this.db.update(J).set({lastActive:H,updated:H}).where(R(J.id,A)),await this.db.update(t).set({messagesSinceSummary:w`${t.messagesSinceSummary} + 1`,lastMessageId:M,updated:H}).where(R(t.conversationId,A)),this.logger.debug("Added message to conversation",{conversationId:A,role:$,messageId:M}),await this.messageBus.send({type:gf,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(h).where(R(h.conversationId,f)).orderBy(Af(h.timestamp)).limit(H).offset(V)}else return(await this.db.select().from(h).where(R(h.conversationId,f)).orderBy(d(h.timestamp)).limit($)).reverse()}async getConversation(f){return(await this.db.select().from(J).where(R(J.id,f)).limit(1))[0]??null}async listConversations(f={}){let{limit:A=100,updatedAfter:$,interfaceType:Z,sessionId:V,channelId:H,personId:M}=f,X=[$?W0(J.updated,$):void 0,Z?R(J.interfaceType,Z):void 0,V?R(J.sessionId,V):void 0,H?R(J.channelId,H):void 0,M?R(J.personId,M):void 0].filter((F)=>F!==void 0),Y=this.db.select().from(J).orderBy(d(J.lastActive)).limit(A);if(X.length===0)return Y;return Y.where(m(...X))}async searchConversations(f,A){let $=`%${f.toLowerCase()}%`;return(await this.db.selectDistinct({conversation:J}).from(J).leftJoin(h,R(h.conversationId,J.id)).where(A?w`lower(${h.content}) LIKE ${$} AND ${J.sessionId} = ${A}`:w`lower(${h.content}) LIKE ${$}`).orderBy(d(J.lastActive))).map((V)=>V.conversation)}async countMessages(f){let[A]=await this.db.select({count:X0()}).from(h).where(R(h.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={...e(A.metadata),...f.metadata};return await this.db.update(J).set({metadata:JSON.stringify(Z),updated:$}).where(R(J.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(J).where(R(J.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:L0.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 aA=U.object({kind:U.string().min(1),id:U.string().min(1)}),D0=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:aA.optional()}),V1=U.custom((f)=>f instanceof Uint8Array),H1=U.object({kind:U.literal("file"),filename:U.string().min(1),mediaType:U.string().min(1),data:V1,sizeBytes:U.number().nonnegative().optional(),source:aA.optional()}),P0=U.discriminatedUnion("kind",[D0,H1]),M1=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:Wf.optional(),source:Df.optional(),attachments:U.array(P0).optional()});var X1=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()}),R0=U.object({name:U.string(),pluginId:U.string(),status:U.string(),health:X1.optional()});var P4=U.object({id:U.string(),type:U.string(),version:U.string(),status:U.string()}),R4=U.object({name:U.string(),description:U.string()}),_0=U.enum(["admin","trusted","public"]),nf=U.object({label:U.string(),url:U.string(),pluginId:U.string(),priority:U.number().default(100),visibility:_0.default("public")}),B0=U.enum(["human","agent","admin","protocol"]),k0=U.enum(["available","coming-soon","disabled"]),df=U.object({id:U.string(),label:U.string(),description:U.string().optional(),href:U.string(),kind:B0,pluginId:U.string(),priority:U.number().default(100),visibility:_0.default("public"),status:k0.default("available")}),rA=U.object({entityType:U.string(),count:U.number()}),F1=U.object({model:U.string(),version:U.string(),uptime:U.number(),entities:U.number(),entityCounts:U.array(rA),embeddings:U.number(),ai:U.object({model:U.string(),embeddingModel:U.string()}),daemons:U.array(R0),endpoints:U.array(nf),interactions:U.array(df)});var C1=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()});var N1=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:N1.optional()}),K1=U.object({model:U.string(),version:U.string(),uptime:U.number(),entities:U.number(),entityCounts:U.array(rA),embeddings:U.number(),ai:U.object({model:U.string(),embeddingModel:U.string()}),daemons:U.array(G1),endpoints:U.array(nf),interactions:U.array(df)});var O0=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()}),x0=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()})}),w0=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:x0.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(O0),resources:w0});class i{callback;heartbeatInterval;constructor(f){this.callback=f}static from(f){if(!f)return;return new i(f)}createSub(f){let{scale:A}=f??{};if(A){let{start:$,end:Z}=A,V=Z-$;return new i(async(H)=>{let M=$+H.progress/(H.total??100)*V;await this.callback({...H,progress:M,total:100})})}return new i(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 D1=U.object({enabled:U.boolean().describe("Whether the plugin is enabled"),debug:U.boolean().describe("Enable debug logging for this plugin")});class sf extends Error{pluginId;issues;constructor(f,A){super(`Invalid plugin config for ${f}`);this.name="PluginConfigValidationError",this.pluginId=f,this.issues=A}}var P1=U.object({toolName:U.string(),args:U.unknown(),progressToken:U.union([U.string(),U.number()]).optional(),hasProgress:U.boolean().optional(),interfaceType:U.string(),actor:ff,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()}),R1=U.object({resourceUri:U.string()});class $f{id;version;description;packageName;config;context;get logger(){return this.context?.logger??af.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 sf(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(Pf.toolExecute(this.id),async(A)=>{try{let $=P1.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:Y,displayName:F,conversationId:N,channelId:C,channelName:W,runId:k,toolCallId:E,userPermissionLevel:q,isAnchor:n,signal:a}=$.data,G=(await this.getTools()).find((O)=>O.name===Z);if(!G)return{success:!1,error:`Tool not found: ${Z}`};let _={interfaceType:X,actor:Y,...F&&{displayName:F},...N&&{conversationId:N},...C&&{channelId:C},...W&&{channelName:W},...k&&{runId:k},...E&&{toolCallId:E},...q&&{userPermissionLevel:q},...n!==void 0&&{isAnchor:n},...a&&{signal:a},...M&&H!==void 0&&{progressToken:H,sendProgress:async(O)=>{await f.messaging.send({type:Pf.progress(this.id),payload:{progressToken:H,notification:O}})}}};return{success:!0,data:await G.handler(V,_)}}catch($){return this.logger.error("Tool execution error",$),{success:!1,error:S($)}}}),f.messaging.subscribe(Pf.resourceGet(this.id),async(A)=>{try{let $=R1.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 i.from(async(Z)=>{await A.messaging.send({type:Pf.progress($),payload:{progressToken:f,notification:{progress:Z.progress,total:Z.total,message:Z.message}}})})}}var oA=U.enum(["file_operations","content_operations","data_processing","batch_processing"]),_1=U.object({pluginId:U.string().optional(),progressToken:U.union([U.string(),U.number()]).optional(),operationType:oA,operationTarget:U.string().optional(),interfaceType:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),requestedByActor:ff.optional(),requestedByUserId:U.string().optional(),requestedByInterface:U.string().optional(),silent:U.boolean().optional(),provenance:Zf.optional()}),Uf=U.object({pluginId:U.string().optional(),progressToken:U.union([U.string(),U.number()]).optional(),operationType:oA,operationTarget:U.string().optional(),interfaceType:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),requestedByActor:ff.optional(),requestedByUserId:U.string().optional(),requestedByInterface:U.string().optional(),silent:U.boolean().optional(),provenance:Zf.optional(),rootJobId:U.string()}),u4=U.enum(["none","skip","replace","coalesce"]);var tA=U.enum(["pending","processing","completed","failed"]),J0=U.enum(["completed","failed"]),P={PENDING:"pending",PROCESSING:"processing",COMPLETED:"completed",FAILED:"failed"},B1=U.object({id:U.string(),type:U.string(),status:tA,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:J0,result:U.unknown().optional(),error:U.string().optional()}),eA=U.object({success:U.literal(!1),error:U.string().optional()}),rf=U.object({id:U.string(),type:U.enum(["job","batch"]),status:tA,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:Uf});var L=o("job_queue",{id:B("id").primaryKey().$defaultFn(()=>g()),type:B("type").notNull(),data:B("data").notNull(),result:B("result",{mode:"json"}),progress:B("progress",{mode:"json"}).$type(),source:B("source"),metadata:B("metadata",{mode:"json"}).$type().notNull(),status:B("status",{enum:["pending","processing","completed","failed"]}).notNull().default("pending"),priority:j("priority").notNull().default(0),retryCount:j("retryCount").notNull().default(0),maxRetries:j("maxRetries").notNull().default(3),lastError:B("lastError"),createdAt:j("createdAt").notNull().$defaultFn(()=>Date.now()),scheduledFor:j("scheduledFor").notNull().$defaultFn(()=>Date.now()),startedAt:j("startedAt"),completedAt:j("completedAt"),attemptId:B("attemptId"),workerSlotId:B("workerSlotId"),workerSessionId:B("workerSessionId"),leaseExpiresAt:j("leaseExpiresAt"),attemptHeartbeatAt:j("attemptHeartbeatAt"),runtimeUpdatedAt:j("runtimeUpdatedAt")},(f)=>({queueReadyIdx:b("idx_job_queue_ready").on(f.status,f.priority,f.scheduledFor),jobTypeIdx:b("idx_job_queue_type").on(f.type,f.status),runtimeUpdatesIdx:b("idx_job_queue_runtime_updates").on(f.runtimeUpdatedAt,f.id),jobSourceIdx:b("idx_job_queue_source").on(f.source)})),x=o("job_worker_sessions",{slotId:B("slotId").primaryKey(),sessionId:B("sessionId").notNull().unique(),startedAt:j("startedAt").notNull(),heartbeatAt:j("heartbeatAt").notNull()},(f)=>({heartbeatIdx:b("idx_job_worker_sessions_heartbeat").on(f.heartbeatAt)}));function Q0(f){return jf({url:f.url,schema:{jobQueue:L,jobWorkerSessions:x},authToken:f.authToken,authTokenEnv:"JOB_QUEUE_DATABASE_AUTH_TOKEN"})}class f${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 O1=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:Uf,progress:U.custom((f)=>typeof f==="object"&&f!==null&&("progress"in f)&&typeof f.progress==="number").nullable(),result:U.unknown().nullable().optional()}),Rf=15000;class Z${db;logger;constructor(f,A){this.db=f,this.logger=A.child("JobQueueRepository")}async insert(f){await this.db.insert(L).values(f)}async startWorkerSession(f,A,$=Date.now()){await this.db.insert(x).values({slotId:f,sessionId:A,startedAt:$,heartbeatAt:$}).onConflictDoUpdate({target:x.slotId,set:{sessionId:A,startedAt:$,heartbeatAt:$}})}async heartbeatWorkerSession(f,A,$=Date.now()){return(await this.db.update(x).set({heartbeatAt:$}).where(m(R(x.slotId,f),R(x.sessionId,A))).returning({slotId:x.slotId})).length===1}async endWorkerSession(f,A){return(await this.db.delete(x).where(m(R(x.slotId,f),R(x.sessionId,A))).returning({slotId:x.slotId})).length===1}async markTerminallyFailed(f,A){let $=Date.now();await this.db.update(L).set({status:P.FAILED,lastError:A,completedAt:$,runtimeUpdatedAt:this.nextRuntimeUpdatedAt($)}).where(m(R(L.id,f),R(L.status,P.PENDING)))}async setScheduledFor(f,A){await this.db.update(L).set({scheduledFor:A}).where(R(L.id,f))}async complete(f,A,$){let Z=Date.now(),H=(await this.db.update(L).set({status:P.COMPLETED,result:A,lastError:null,completedAt:Z,runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z)}).where(this.attemptWriteGuard(f,$)).returning({id:L.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(L).set({data:JSON.stringify(A)}).where(this.attemptWriteGuard(f,$)).returning({id:L.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(L).set({attemptHeartbeatAt:Z,runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z),progress:$}).where(this.attemptWriteGuard(f,A)).returning({id:L.id})).length===1}async renewAttemptLease(f,A,$,Z){return(await this.db.update(L).set({attemptHeartbeatAt:$,leaseExpiresAt:$+Z}).where(this.attemptWriteGuard(f,A)).returning({id:L.id})).length===1}async fail(f,A,$,Z=Date.now()){let H=(await this.db.select({retryCount:L.retryCount,maxRetries:L.maxRetries,type:L.type,scheduledFor:L.scheduledFor,startedAt:L.startedAt,runtimeUpdatedAt:L.runtimeUpdatedAt}).from(L).where(this.attemptWriteGuard(f,$)).limit(1))[0];if(!H)return!1;let M=H.retryCount<H.maxRetries,X=M?H.retryCount+1:H.retryCount,Y=Math.min(1000*2**H.retryCount,60000),F=M?Z+Y:H.scheduledFor;if((await this.db.update(L).set({status:M?P.PENDING:P.FAILED,retryCount:X,lastError:A.message,scheduledFor:F,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(m(this.attemptWriteGuard(f,$),R(L.retryCount,H.retryCount))).returning({id:L.id})).length!==1)return!1;if(M)this.logger.debug("Job scheduled for retry",{jobId:f,retryCount:X,backoffMs:Y,scheduledFor:new Date(F).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(L).where(R(L.id,f)).limit(1))[0]??null}async getStatusByEntityId(f){return(await this.db.select().from(L).where(w`json_extract(${L.data}, '$.id') = ${f}`).orderBy(d(L.createdAt)).limit(1))[0]??null}async getStats(){let f=await this.db.select({status:L.status,count:w`count(*)`}).from(L).groupBy(L.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-Rf,[$,Z,V]=await Promise.all([this.db.select({type:L.type,status:L.status,count:w`count(*)`}).from(L).groupBy(L.type,L.status),this.db.select({oldestPendingAt:w`min(case when ${L.status} = ${P.PENDING} then ${L.createdAt} end)`,oldestProcessingAt:w`min(case when ${L.status} = ${P.PROCESSING} then ${L.startedAt} end)`,staleLeaseCount:w`coalesce(sum(case when ${L.status} = ${P.PROCESSING} and ${L.leaseExpiresAt} is not null and ${L.leaseExpiresAt} <= ${f} then 1 else 0 end), 0)`}).from(L),this.db.select({total:w`count(*)`,active:w`coalesce(sum(case when ${x.heartbeatAt} > ${A} then 1 else 0 end), 0)`,stale:w`coalesce(sum(case when ${x.heartbeatAt} <= ${A} then 1 else 0 end), 0)`,latestHeartbeatAt:w`max(${x.heartbeatAt})`}).from(x)]),H={pending:0,processing:0,completed:0,failed:0},M=$.map((N)=>{let C=Number(N.count);return H[N.status]+=C,{type:N.type,status:N.status,count:C}}),X=Z[0],Y=V[0],F=(N)=>N===null||N===void 0?null:Math.max(0,f-Number(N));return{totals:H,byType:M,oldestPendingAgeMs:F(X?.oldestPendingAt),oldestProcessingAgeMs:F(X?.oldestProcessingAt),staleLeaseCount:Number(X?.staleLeaseCount??0),workerSessions:{total:Number(Y?.total??0),active:Number(Y?.active??0),stale:Number(Y?.stale??0),latestHeartbeatAgeMs:F(Y?.latestHeartbeatAt)}}}async getRuntimeUpdates(f,A){return(await this.db.select().from(L).where(w`(${L.runtimeUpdatedAt}, ${L.id}) > (${f.updatedAt}, ${f.jobId})`).orderBy(Af(L.runtimeUpdatedAt),Af(L.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(L).where(m(Lf(R(L.status,P.COMPLETED),R(L.status,P.FAILED)),_f(L.completedAt,A)))).rowsAffected}async getActiveJobs(f){let A=Lf(R(L.status,P.PENDING),R(L.status,P.PROCESSING)),$=f&&f.length>0?m(A,of(L.type,f)):A;return this.db.select().from(L).where($).orderBy(d(L.createdAt))}async getFailedJobs(f){let A=R(L.status,P.FAILED),$=f&&f.length>0?m(A,of(L.type,f)):A;return this.db.select().from(L).where($).orderBy(d(L.createdAt))}async claimNextReady(f){let{now:A,attemptId:$,workerSlotId:Z,workerSessionId:V,leaseDurationMs:H,workerSessionTimeoutMs:M}=f,X=A-M,Y=this.db.select({slotId:x.slotId}).from(x).where(m(R(x.slotId,Z),R(x.sessionId,V))),F=this.db.select({slotId:x.slotId}).from(x).where(m(R(x.slotId,L.workerSlotId),R(x.sessionId,L.workerSessionId))),N=this.db.select({slotId:x.slotId}).from(x).where(m(R(x.slotId,L.workerSlotId),R(x.sessionId,L.workerSessionId),_f(x.heartbeatAt,X))),C=m(R(L.status,P.PROCESSING),Lf(A$(L.attemptId),q0(F),m(_f(L.leaseExpiresAt,A),$$(N)))),W=w`${L.status} = ${P.PROCESSING} AND ${L.retryCount} + 1 > ${L.maxRetries}`,k=this.db.select({id:L.id}).from(L).where(Lf(m(R(L.status,P.PENDING),_f(L.scheduledFor,A)),C)).orderBy(Af(L.priority),Af(L.createdAt)).limit(1),q=(await this.db.update(L).set({status:w`CASE WHEN ${W} THEN ${P.FAILED} ELSE ${P.PROCESSING} END`,retryCount:w`CASE WHEN ${L.status} = ${P.PROCESSING} THEN ${L.retryCount} + 1 ELSE ${L.retryCount} END`,lastError:w`CASE WHEN ${L.status} = ${P.PROCESSING} THEN 'Attempt lease expired' ELSE ${L.lastError} END`,startedAt:w`CASE WHEN ${W} THEN ${L.startedAt} ELSE ${A} END`,completedAt:w`CASE WHEN ${W} THEN ${A} ELSE NULL END`,attemptId:w`CASE WHEN ${W} THEN ${L.attemptId} ELSE ${$} END`,workerSlotId:w`CASE WHEN ${W} THEN ${L.workerSlotId} ELSE ${Z} END`,workerSessionId:w`CASE WHEN ${W} THEN ${L.workerSessionId} ELSE ${V} END`,leaseExpiresAt:w`CASE WHEN ${W} THEN ${L.leaseExpiresAt} ELSE ${A+H} END`,attemptHeartbeatAt:w`CASE WHEN ${W} THEN ${L.attemptHeartbeatAt} ELSE ${A} END`,runtimeUpdatedAt:w`CASE WHEN ${W} THEN ${this.nextRuntimeUpdatedAt(A)} ELSE ${L.runtimeUpdatedAt} END`}).where(m(of(L.id,k),$$(Y))).returning())[0];if(q?.status!==P.PROCESSING)return null;return this.logger.debug("Job claimed",{jobId:q.id,attemptId:q.attemptId,workerSlotId:Z,workerSessionId:V}),q}nextRuntimeUpdatedAt(f){return w`max(${f}, coalesce((select max(${L.runtimeUpdatedAt}) from ${L}), 0) + 1)`}attemptWriteGuard(f,A){return A?m(R(L.id,f),R(L.status,P.PROCESSING),R(L.attemptId,A)):m(R(L.id,f),A$(L.attemptId),Lf(R(L.status,P.PENDING),R(L.status,P.PROCESSING)))}}var x1=U.looseObject({deduplicationKey:U.string().optional()});class U${findDuplicate(f,A,$){if(!A||A==="none")return null;let Z=this.filterByDeduplicationKey(f,$);if(Z.length===0)return null;if(A==="skip"||A==="replace")return Z.find((V)=>V.status===P.PENDING)??null;return 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})}}import{AsyncLocalStorage as w1}from"async_hooks";class Ff{storage=new w1;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=Zf.parse(f),V=J1(Z);return this.storage.run(Object.freeze({provenance:V,operationId:A}),$)}}function J1(f){if(Object.freeze(f.projectionLineage),f.sourceEntity)Object.freeze(f.sourceEntity);return Object.freeze(f)}class V${client;logger;handlerRegistry;repository;deduplicator;walInitialization=null;walInitializationSettled=!1;closeRequested=!1;clientClosed=!1;databaseUrl;operationContext;projectionAdmission;directWorkerSlotId=`direct:${g()}`;directWorkerSessionId=g();directLeaseDurationMs;directSessionStart=null;close(){if(this.closeRequested=!0,!this.walInitialization||this.walInitializationSettled)this.closeClient()}static createFresh(f,A,$){return new V$(f,A??af.getInstance(),$)}constructor(f,A,$){let{db:Z,client:V,url:H}=Q0(f);this.client=V,this.databaseUrl=H,this.logger=A.child("JobQueueService"),this.operationContext=$?.operationContext??Ff.createFresh(),this.projectionAdmission=$?.projectionAdmission,this.handlerRegistry=new f$(this.logger,$?.handlerRegistrationMode??"combined"),this.repository=new Z$(Z,this.logger),this.directLeaseDurationMs=f.claimTimeoutMs??300000,this.deduplicator=new U$}initialize(){if(this.closeRequested)return Promise.resolve();return this.walInitialization??=this.initializeWALMode(),this.walInitialization}async initializeWALMode(){try{await If(this.client,this.databaseUrl)}catch(f){this.logger.warn("Failed to enable WAL mode (non-fatal)",f)}finally{if(this.walInitializationSettled=!0,this.closeRequested)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)}finalizeHandlerRegistrations(){return this.handlerRegistry.finalizeRegistrations()}getExecutionRegistrations(){return this.handlerRegistry.getExecutionRegistrations()}async checkForDuplicate(f,A,$){let Z=await this.getActiveJobs([f]);return this.deduplicator.findDuplicate(Z,A,$)}async enqueue(f){let{type:A,data:$,options:Z}=f,V=await this.checkForDuplicate(A,Z?.deduplication,Z?.deduplicationKey);if(V){if(Z?.deduplication==="skip")return this.logger.debug("Skipping duplicate job (already pending)",{type:A,existingJobId:V.id}),V.id;if(Z?.deduplication==="replace")this.logger.debug("Replacing duplicate job",{type:A,oldJobId:V.id}),await this.repository.markTerminallyFailed(V.id,"Replaced by newer job");if(Z?.deduplication==="coalesce")return this.logger.debug("Coalescing with existing job",{type:A,existingJobId:V.id}),await this.repository.setScheduledFor(V.id,Date.now()),V.id}let H=this.handlerRegistry.getValidator(A);if(!H)throw Error(`No handler registered for job type: ${A}`);let M=H.validateAndParse($);if(M===null)throw Error(`Invalid job data for type: ${A}`);let X=Date.now(),Y=g(),F=Z?.rootJobId??this.operationContext.current()?.provenance.rootJobId??Y,N=this.createJobProvenance(Y,F,Z);await this.projectionAdmission?.assertJobAdmission(N);let{provenance:C,...W}=Z?.metadata??{operationType:"data_processing"},k={id:Y,type:A,data:JSON.stringify(M),status:P.PENDING,priority:Z?.priority??0,maxRetries:Z?.maxRetries??3,retryCount:0,source:Z?.source??null,metadata:{...W,...Z?.deduplicationKey&&{deduplicationKey:Z.deduplicationKey},rootJobId:F,provenance:N},createdAt:X,scheduledFor:Z?.delayMs?X+Z.delayMs:X,result:null,lastError:null,startedAt:null,completedAt:null};try{return await this.repository.insert(k),this.logger.debug("Job enqueued",{id:Y,type:A,priority:k.priority,rootJobId:k.metadata.rootJobId}),Y}catch(E){throw this.logger.error("Failed to enqueue job",{type:A,error:S(E)}),E}}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,Y=X?[...H?.projectionLineage??[],X.id]:[...H?.projectionLineage??[]],F=X?.id??H?.projectionId;return Zf.parse({rootJobId:A,causationId:M??H?.causationId??f,...F?{projectionId:F}:{},projectionLineage:Y,...X?.sourceEntity?{sourceEntity:X.sourceEntity}:H?.sourceEntity?{sourceEntity:H.sourceEntity}:{},derivationDepth:Y.length})}async dequeue(f){let A=f??await this.getDirectClaimOptions(),$=Date.now(),Z=await this.repository.claimNextReady({...A,now:$,attemptId:g()});if(!Z)return null;return this.logger.debug("Job dequeued",{id:Z.id,type:Z.type,priority:Z.priority,retryCount:Z.retryCount,attemptId:Z.attemptId,workerSlotId:Z.workerSlotId,workerSessionId:Z.workerSessionId}),Z}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 T0 extends Error{constructor(f,A){super(`Job ${f} exceeded its ${A}ms execution deadline`);this.name="JobDeadlineExceededError"}}class H${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 H$(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??Rf,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=g();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=K.runSync(v.make()),this.jobFibers=K.runSync(v.extend(Vf.make(),this.workerScope)),this.pollFiber=K.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 K.runPromise(tf.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 K.runPromise(Vf.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 K.runPromise(Vf.run($,Z.id,K.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=K.suspend(()=>{if(!this.isWorkerRunning()||this.isStopRequested())return K.interrupt;return this.currentPoll=this.processAvailableJobs(),K.promise(()=>this.currentPoll??Promise.resolve()).pipe(K.andThen(K.suspend(()=>{return this.currentPoll=null,!this.isWorkerRunning()||this.isStopRequested()?K.interrupt:K.void})))}).pipe(K.schedule(ef.spaced(this.config.pollInterval)),K.asVoid);return(this.clock?K.withClock(A,this.clock):A).pipe(K.ensuring(K.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,Y)=>{Z=X,V=Y}),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 K.runPromise(v.close(f,u.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=Cf(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 Y=new T0(f,A);$.abort(Y);let F,N=new Promise((W)=>{F=setTimeout(()=>W({kind:"grace-expired"}),Math.max(1,this.config.cancellationGraceMs))});if((await Promise.race([V,N])).kind!=="grace-expired"){if(F)clearTimeout(F);throw Y}throw this.markUnhealthy(`${Y.message}; handler ignored cancellation grace`),await V,Y}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:P.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:P.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),Y=$.validateAndParse(X);if(Y===null)throw Error(`Invalid job data for type: ${f.type}`);let F=this.progressMonitor.createProgressReporter(f.id,A),N=$.executionTimeoutMs??this.config.defaultExecutionTimeoutMs,C=await this.executeWithDeadline(f.type,N,Z,()=>$.process(Y,f.id,F,Z.signal));await M();let W=eA.safeParse(C);if(W.success){let E=W.data.error??"Handler returned failure",q=Error(E);if(await this.jobQueueService.fail(f.id,q,A))await this.emitTerminalFailure(f,q,$,A);return{jobId:f.id,type:f.type,status:P.FAILED,error:E}}if(!await this.jobQueueService.complete(f.id,C,A))return{jobId:f.id,type:f.type,status:P.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:P.COMPLETED,result:C}}catch(X){let Y=Cf(X);await M();try{let N=JSON.parse(f.data),C=$.validateAndParse(N);if(C!==null&&$.onError){let W=this.progressMonitor.createProgressReporter(f.id,A),k=new AbortController;await this.executeWithDeadline(`${f.type}:onError`,this.config.errorCallbackTimeoutMs,k,()=>$.onError?.(Y,C,f.id,W,k.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,Y,A))await this.emitTerminalFailure(f,Y,$,A);return{jobId:f.id,type:f.type,status:P.FAILED,error:Y.message}}}async emitTerminalFailure(f,A,$,Z){if((await this.jobQueueService.getStatus(f.id))?.status!==P.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 Q1=86400000,E0=3600000;class M${jobQueue;logger;batches=new Map;cleanupFiber=null;cleanupSupervisor=null;inFlightCleanups=new Set;activeTransition=null;transitionQueue=[];acceptingCleanup=!0;clock;static createFresh(f,A,$){return new M$(f,A,$)}constructor(f,A,$){this.jobQueue=f,this.logger=A,this.clock=$?.clock}start(f=E0){return this.requestTransition("start",f)}stop(){return this.requestTransition("stop",E0)}async startCleanup(f){if(this.acceptingCleanup=!0,this.cleanupFiber)return;this.cleanupFiber=K.runFork(this.runCleanupLoop(f))}runCleanupLoop(f){let A=this.cleanupTerminalBatchMetadata().pipe(K.schedule(ef.spaced(f)),K.asVoid);return this.clock?K.withClock(A,this.clock):A}scheduleTerminalBatchCleanup(){if(!this.acceptingCleanup)return;this.cleanupSupervisor??=this.createCleanupSupervisor();let f=K.runFork(this.cleanupTerminalBatchMetadata());fA.unsafeAdd(this.cleanupSupervisor.fibers,f)}async stopCleanup(){this.acceptingCleanup=!1;let f=this.cleanupFiber;if(this.cleanupFiber=null,f)await K.runPromise(tf.interrupt(f));let A=this.cleanupSupervisor;if(A)await K.runPromise(fA.awaitEmpty(A.fibers));while(this.inFlightCleanups.size>0)await Promise.allSettled(this.inFlightCleanups);if(A)await K.runPromise(v.close(A.scope,u.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,Y)=>{Z=X,V=Y}),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=K.runSync(v.make()),A=K.runSync(v.extend(fA.make(),f));return{scope:f,fibers:A}}cleanupTerminalBatchMetadata(){return K.tryPromise({try:()=>{let f=this.cleanup(Q1);return this.inFlightCleanups.add(f),f.then(()=>this.inFlightCleanups.delete(f),()=>this.inFlightCleanups.delete(f)),f},catch:(f)=>f}).pipe(K.asVoid,K.catchAll((f)=>K.sync(()=>{this.logger.warn("Failed to clean up terminal batch metadata",{error:f})})))}validateOperations(f){for(let A of f){let $=this.jobQueue.getHandler(A.type);if(!$)throw Error(`No handler registered for job type: ${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((F)=>this.jobQueue.getStatus(F))),Z=0,V=0,H=0,M=[];for(let[F,N]of $.entries()){if(!N){V++;let C=A.operations[F],W=A.jobIds[F]??"unknown";M.push(`Missing job ${W}${C?` for ${C.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=P.PROCESSING;else if(V>0)X=P.FAILED;else X=P.COMPLETED;if(A.terminalAt===void 0&&(X===P.COMPLETED||X===P.FAILED))A.terminalAt=Date.now();let Y;for(let F=0;F<A.jobIds.length;F++){let N=$[F];if(N&&N.status!=="completed"&&N.status!=="failed"){let C=A.operations[F];if(C)Y=`Processing ${C.type}`;break}}return{batchId:f,totalOperations:A.operations.length,completedOperations:Z,failedOperations:V,errors:M,status:X,currentOperation:Y,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===P.COMPLETED||M.status===P.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 q1=U.preprocess((f)=>{if(typeof f!=="string")return f;return JSON.parse(f)},U.record(U.string(),U.unknown()));class X${jobQueueService;messageBus;batchJobManager;logger;mode;pollTimer;pollCursor={updatedAt:0,jobId:""};polling=!1;static createFresh(f,A,$,Z,V="combined"){return new X$(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 $=i.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:Bf.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:Bf.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 $=q1.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=$?Uf.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 T1=U.record(U.string(),U.unknown());class kf{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=T1.safeParse(f);return A.success?A.data:{}}}function Y$(f,A,$){return async(Z)=>{let{type:V,data:H,toolContext:M=null,options:X,projection:Y}=Z,F=M?m0(M):void 0,{metadata:N,...C}=X??{},W={operationType:"data_processing",pluginId:A,...N,...M&&{interfaceType:M.interfaceType,conversationId:M.conversationId,channelId:M.channelId,requestedByActor:M.actor,...F?{requestedByUserId:F}:{},requestedByInterface:M.interfaceType}};if(M&&!F)delete W.requestedByUserId;let k={...C,source:A,...X?.rootJobId&&{rootJobId:X.rootJobId},...Y&&{projection:Y},metadata:W},E=$&&!V.includes(":")?`${A}:${V}`:V;return f.enqueue({type:E,data:H,options:k})}}function L$(f,A){return async($,Z)=>{let V=g(),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 F$(f,A){return($,Z)=>{let V=$.includes(":")?$:`${A}:${$}`;f.registerHandler(V,Z,A)}}var E1=U.custom((f)=>typeof f==="object"&&f!==null&&("safeParse"in f)),m1=U.object({name:U.string(),schema:E1});function S0(f){return m1.safeParse(f).success}function S1(f){if(!f)return;return{status:f.status,message:f.message,lastCheck:f.lastCheck?.toISOString(),details:f.details}}function z0(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:S1(A.health)})),endpoints:f.endpoints,interactions:f.interactions}}function z1(f){let A=Yf.safeParse(f);return A.success?A.data:"user"}function AA(f){let A=e(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 y0(f){return{id:f.id,conversationId:f.conversationId,role:z1(f.role),content:f.content,timestamp:f.timestamp,metadata:e(f.metadata)}}function h0(f){return pA.parse(f)}function v0(f){return lA.parse(f)}function j0(f){return async()=>{return z0(await f.getAppInfo())}}function b0(f,A){return{get:()=>h0(f.getIdentity()),getProfile:()=>v0(f.getProfile()),getAppInfo:A}}function g0(f,A){let $=f.getProfileKindRegistry();return{register:(Z)=>{$.register(A,Z)},getResolved:()=>$.getResolved(),getSelectedDefinition:()=>$.getSelectedDefinition()}}function C$(f){let A=f.getChannelRegistry();return{listDescriptors:()=>A.listDescriptors(),getDescriptor:($)=>A.getDescriptor($),getDeliveryProvider:($)=>A.getDeliveryProvider($)}}function u0(f,A){let $=f.getInboxRegistry();return{registerSource:(Z)=>{$.registerSource(A,Z)},listSources:()=>$.listSources(),getSource:(Z)=>$.getSource(Z)}}function I0(f,A){let $=f.getChannelRegistry();return{...C$(f),registerDescriptor:(Z)=>{$.registerDescriptor(A,Z)},registerDeliveryProvider:(Z)=>{$.registerDeliveryProvider(A,Z)}}}function c0(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(S0(M)){let Y=M,F=X,N=async(C)=>{let W=Y.schema.safeParse(C.payload);if(!W.success)return $.warn(`Invalid payload for channel ${Y.name}`,{error:W.error.message}),{noop:!0};let{payload:k,...E}=C;return F(W.data,E)};return V.subscribe(Y.name,N)}return V.subscribe(M,X)},subscribeExecution:(M,X)=>V.subscribe(M,X)}}function p0(f,A){let $=f.getJobQueueService();return{...f.jobs,enqueue:Y$($,A,!0),enqueueBatch:L$(f.jobs,A),registerHandler:F$($,A)}}function l0(f){let A=f.getPermissionService();return{assertEntityActionAllowed:($,Z,V)=>{A.assertEntityActionAllowed($,Z,V.userPermissionLevel)}}}function n0(f){return{get:async(A)=>{let Z=await f.getConversationService().getConversation(A);return Z?AA(Z):null},search:async(A)=>{return(await f.getConversationService().searchConversations(A)).map(AA)},list:async(A)=>{return(await f.getConversationService().listConversations(A)).map(AA)},getMessages:async(A,$)=>{return(await f.getConversationService().getMessages(A,$)).map(y0)},countMessages:async(A)=>{return f.getConversationService().countMessages(A)}}}function d0(f,A){return{registerHandler:($,Z)=>{f.registerEvalHandler(A,$,Z)}}}function i0(f){return{register:(A,$)=>{f.getInsightsRegistry().register(A,$)}}}function s0(f){return{has:(A)=>f.getPluginPackageName(A)!==void 0}}function a0(f,A){return{register:($)=>{f.registerEndpoint({...$,pluginId:A})}}}function r0(f,A){return{register:($)=>{f.registerInteraction({...$,pluginId:A})}}}function o0(f,A){return{registerWidget:async($)=>{await f.send({type:N$.registerWidget,payload:{...$,pluginId:A}})},unregisterWidget:async($)=>{await f.send({type:N$.unregisterWidget,payload:{pluginId:A,...$?{widgetId:$}:{}}})}}}function Hf(f,A,$){let Z=f.getEntityService(),V=f.getLogger().child(A),H=f.getDomain(),M=f.getLocalSiteUrl(),X=f.shouldPreferLocalUrls(),Y=f.getThemeCSS(),F=j0(f),N=f.getAttachmentRegistry(),C=f.getRuntimeUploadRegistry(),W=f.getRuntimeState(),k=$?.executionOnly===!0,E=c0(f,A,V,k);return{pluginId:A,executionOnly:k,logger:V,entityService:Z,semantic:{project:(q)=>Z.projectSemanticSpace(q)},identity:b0(f,F),profileKinds:g0(f,A),channels:C$(f),inbox:u0(f,A),appInfo:F,readiness:()=>f.getRuntimeReadiness(),judge:(q)=>f.judge(q),domain:H,siteUrl:H?`https://${H}`:void 0,localSiteUrl:M,previewUrl:H?`https://${t0(H)}`:void 0,preferLocalUrls:X,themeCSS:Y,entityDisplay:$?.entityDisplay,spaces:f.getSpaces(),permissions:l0(f),messaging:E,dashboard:o0(E,A),jobs:p0(f,A),attachments:N,uploads:C,runtimeState:W,recurringChecks:f.getRecurringChecks(A),conversations:n0(f),dataDir:f.getDataDir(),eval:k?{registerHandler:()=>{}}:d0(f,A),insights:k?{register:()=>{}}:i0(f),plugins:s0(f),endpoints:k?{register:()=>{}}:a0(f,A),interactions:k?{register:()=>{}}:r0(f,A)}}function y1(f){return f.replace(/:/g,"-")}function h1(f){return f.split(/[:.-]/).map((A)=>A.charAt(0).toUpperCase()+A.slice(1)).join(" ")}var G$=new Map;async function $A(f,A,$){let Z=G$.get(A);if(Z!==void 0)return Z;let V=y1(A),H;try{H=await f.getEntity({entityType:"prompt",id:V})}catch{return $}if(H?.content){let M=Of(H.content,U.record(U.string(),U.unknown())).content;return G$.set(A,M),M}try{let M=h1(A),X=K$($,{title:M,target:A});await f.createEntity({entity:{id:V,entityType:"prompt",content:X,metadata:{title:M,target:A,slug:V}}})}catch{}return G$.set(A,$),$}async function v1(f,A){let $=f.list().filter((Z)=>!!Z.basePrompt);return await Promise.all($.map((Z)=>$A(A,Z.name,Z.basePrompt))),$.length}function ZA(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 UA(f){return{resolve:(A,$)=>{return $A(f,A,$)}}}function VA(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 W$(f,A,$){let Z=Hf(f,A,$),V=f.getEntityService();return{...Z,entityService:V,entities:ZA(f),ai:VA(f),prompts:UA(V),permissions:Z.permissions}}function D$(f,A,$){let Z=Hf(f,A,$),V=f.getEntityService(),H=f.getRenderService(),M=f.getContentService(),X=f.getPermissionService();return{...Z,permissions:{...Z.permissions,getConfiguredPrincipalSeeds:()=>X.getConfiguredPrincipalSeeds(),replaceRuntimePrincipalState:(Y)=>X.replaceRuntimePrincipalState(Y)},entityService:V,entities:ZA(f),webRoutes:{getRoutes:()=>f.getPluginWebRoutes()},templates:{register:(Y,F)=>{f.registerTemplates(Y,F??A)},format:(Y,F)=>{return M.formatContent(Y,F,{pluginId:A})},parse:(Y,F)=>{return M.parseContent(Y,F,A)},resolve:async(Y,F)=>{return await M.resolveContent(Y,F,A)},getCapabilities:(Y)=>{let F=Y.includes(":")?Y:`${A}:${Y}`,N=f.getTemplate(F);if(!N)return null;let C=e0.getCapabilities(N);return{canGenerate:C.canGenerate,canFetch:C.canFetch,canRender:C.canRender,isStaticOnly:C.isStaticOnly}}},views:{get:(Y)=>{return H.get(Y)??void 0},list:()=>{return H.list()},hasRenderer:(Y,F="web")=>{return H.hasRenderer(Y,F)},getRenderer:(Y,F="web")=>{return H.getRenderer(Y,F)},validate:(Y,F)=>{return H.validate(Y,F)}},prompts:UA(V),ai:VA(f),registerInstructions:(Y)=>{f.registerInstructions(A,Y)}}}class fZ extends $f{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 j1=U.object({});class P$ extends $f{type="entity";entityActionPolicy;constructor(f,A,$,Z,V){super(f,A,$,Z);if(V!==void 0)this.entityActionPolicy=V}async register(f,A){let $=W$(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!==P$.prototype.interceptCreate)$.entities.registerCreateInterceptor(this.entityType,(W,k)=>this.interceptCreate(W,k,$));let Y=this.createGenerationHandler($);if(Y)$.jobs.registerHandler(`${this.entityType}:generation`,Y);let F=this.getTemplates();if(F&&Object.keys(F).length>0)f.registerTemplates(F,this.id);let N=this.getDataSources();for(let W of N)$.entities.registerDataSource(W);await this.onRegister(this.context);let C=await this.getInstructions();return{tools:[],resources:[],...C&&{instructions:C},...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 b1({context:f,targetType:A,desired:$,getId:Z,toEntityInput:V,equals:H,deleteStale:M=!1,outputVisibility:X="public",concurrency:Y=1,logger:F}){let N=new Map;for(let z of $)N.set(Z(z),z);let C=(await f.entityService.listEntities({entityType:A,options:{filter:{visibilityScope:X}}})).filter((z)=>z.visibility===X),W=new Map(C.map((z)=>[z.id,z])),k=0,E=0,q=0,n=0,a=Math.max(1,Y);if(M){let z=C.filter((G)=>!N.has(G.id));await AZ(z,a,async(G)=>{await f.entityService.deleteEntity({entityType:A,id:G.id}),q++})}return await AZ(Array.from(N),a,async([z,G])=>{let _=W.get(z),D={...V(G,z),visibility:X};try{if(!_){await f.entityService.createEntity({entity:D}),k++;return}if(H?.(_,G)??!1){n++;return}await f.entityService.updateEntity({entity:{..._,...D,id:z,entityType:A,visibility:X}}),E++}catch(O){F?.error("Failed to reconcile entity",{targetType:A,id:z,error:S(O)})}}),{created:k,updated:E,deleted:q,skipped:n}}async function AZ(f,A,$){let Z=await K.runPromiseExit(K.forEach(f,(V)=>K.tryPromise({try:()=>$(V),catch:(H)=>H}),{concurrency:A,discard:!0}));if(u.isFailure(Z))throw HA.squash(Z.cause)}async function g1({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 u1({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 I1({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 $Z(f){return UZ(f)}function ZZ(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 VZ(f){return{chat:async(A,$,Z,V)=>{let H=ZZ(Z),M=V?await f.chat(A,$,H,V):await f.chat(A,$,H);return $Z(M)},confirmPendingAction:async(A,$,Z,V,H)=>{let M=ZZ(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 $Z(X)},invalidate:()=>{f.invalidateAgent()}}}function MA(f,A,$){let Z=Hf(f,A,$),V=f.getMCPService(),H=f.getPermissionService(),M=VZ(f.getAgentService());return{...Z,mcpTransport:V,agent:M,permissions:{...Z.permissions,getUserLevel:(X,Y,F)=>{return H.determineUserLevel(X,Y,F)},isAnchor:(X,Y)=>H.isAnchor(X,Y)},daemons:{register:(X,Y)=>{let F=`${A}:${X}`;f.registerDaemon(F,Y,A),Z.logger.debug(`Registered daemon: ${F}`)}},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()}},plugins:{has:(X)=>f.hasPlugin(X)}}}function R$(f,A,$){return{...MA(f,A,$),channels:I0(f,A)}}var c1=3600000;class XA extends $f{type="interface";daemon;jobTrackingEntries=new Map;jobTrackingTtlMs=c1;createContext(f,A){return MA(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 XZ=/^[a-z][a-z0-9-]*$/,p1=U.strictObject({source:U.string().min(1).max(500),flags:U.string().regex(/^[imu]*$/).optional()}),l1=U.strictObject({type:U.string().trim().regex(XZ),displayName:U.string().trim().min(1).max(100),subjectLabel:U.string().trim().min(1).max(100),subjectPattern:p1.optional(),manualDelivery:U.boolean().optional()});class YZ{descriptorRegistrations=new Map;providerRegistrations=new Map;activeDescriptors=new Map;activeProviders=new Map;finalized=!1;registerDescriptor(f,A){this.assertRegistrationOpen();let $=HZ(f),Z=l1.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 $=HZ(f),Z=_$(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(_$(f))}getDeliveryProvider(f){return this.assertFinalized(),this.activeProviders.get(_$(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 MZ("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 MZ("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 HZ(f){let A=f.trim();if(!A)throw Error("Channel registration plugin id is required");return A}function _$(f){let A=f.trim();if(!XZ.test(A))throw Error(`Invalid channel type: ${f}`);return A}function MZ(f,A,$){let Z=$.map((V)=>V.pluginId).sort().join(", ");return Error(`${f} "${A}" is registered by multiple plugins: ${Z}`)}var YA=/^[a-z][a-z0-9-]*$/,LZ=U.strictObject({id:U.string().trim().regex(YA),label:U.string().trim().min(1).max(100),confirm:U.boolean().optional()}),FZ=U.strictObject({entityType:U.string().trim().min(1).max(100),entityId:U.string().trim().min(1).max(300)}),CZ=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:FZ.optional(),actions:U.array(LZ).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)}}),NZ=U.array(CZ).max(1000),GZ=U.strictObject({permissionLevel:U.enum(["admin","trusted","public"])}),KZ=U.strictObject({sourceId:U.string().trim().regex(YA),displayName:U.string().trim().min(1).max(100)});class WZ{registrations=new Map;activeSources=new Map;finalized=!1;registerSource(f,A){this.assertRegistrationOpen();let $=i1(f),Z=KZ.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=n1(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(s1(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 n1(f,A){return Object.freeze({...f,list:async()=>{return NZ.parse(await A.list()).map(d1)},act:async($,Z,V)=>{let H=U.string().trim().min(1).max(300).parse($),M=U.string().trim().regex(YA).parse(Z);await A.act(H,M,GZ.parse(V))}})}function d1(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 i1(f){let A=f.trim();if(!A)throw Error("Inbox registration plugin id is required");return A}function s1(f){return U.string().trim().regex(YA).parse(f)}var a1={pluginsRegistered:"system:plugins:registered",initialSyncCompleted:"sync:initial:completed",shellReady:"system:shell:ready"};function r1(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 B${providers=new Map;static createFresh(){return new B$}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 o1,readdir as t1,readFile as DZ,rm as PZ,stat as e1,writeFile as RZ}from"fs/promises";import{basename as f8,dirname as A8,join as p}from"path";var LA=/^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,_Z=86400000,BZ=200;class Mf extends Error{code;constructor(f,A){super(A);this.code=f,this.name="RuntimeUploadStoreError"}}var $8=U.object({id:U.string().regex(LA),ref:U.object({kind:U.string().min(1),id:U.string().regex(LA)}),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 Z8(f){return{scoped:(A)=>f.scoped(A)}}function kZ(f){return f8(f)==="brain-data"?p(A8(f),"data"):f}class k${dataDir;constructor(f){this.dataDir=kZ(f.dataDir)}static createFresh(f){return new k$(f)}scoped(f){return new O$({...f,dataDir:this.dataDir})}}class O${options;retentionMs;maxCount;createUploadId;getNow;constructor(f){this.options=f,this.retentionMs=f.retentionMs??_Z,this.maxCount=f.maxCount??BZ,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 o1(Z,{recursive:!0}),await RZ(p(Z,"content"),f.content),await RZ(p(Z,"metadata.json"),`${JSON.stringify($,null,2)}
3
- `,"utf8"),await this.prune(),$}async remove(f){this.assertValidUploadId(f),await PZ(this.getUploadDir(f),{recursive:!0,force:!0})}async read(f){let A=await this.readRecord(f);try{let $=await DZ(p(this.getUploadDir(f),"content"));return{record:A,content:$}}catch{throw new Mf("not_found","Upload not found")}}async readRecord(f){this.assertValidUploadId(f);try{let A=await DZ(p(this.getUploadDir(f),"metadata.json"),"utf8"),$=$8.safeParse(JSON.parse(A));if(!$.success||$.data.id!==f||$.data.ref.id!==f||$.data.ref.kind!==this.options.refKind)throw new Mf("invalid_metadata","Invalid upload metadata");return $.data}catch(A){if(A instanceof Mf)throw A;throw new Mf("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 t1(f),Z=(await Promise.all(A.map(async(M)=>{try{let X=await e1(p(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)=>PZ(p(f,M.entry),{recursive:!0,force:!0})))}catch{}}getUploadDir(f){return this.assertValidUploadId(f),p(this.getUploadsRoot(),f)}getUploadsRoot(){return p(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(!LA.test(f))throw new Mf("invalid_ref","Invalid upload ref")}}function x$(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 OZ(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 NA(f){return Object.fromEntries(Object.entries(f).filter(([,A])=>A!==void 0))}function xZ(f){let A={...f};return delete A.status,delete A.error,NA(A)}class qZ extends kf{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 $=OZ(f);if(typeof A!=="object")return A;let Z=x$(f);if(!$&&!Z)return A;return Object.assign(A,{...$&&{coverImage:$},...Z&&{entityId:Z}}),A}async process(f,A,$){try{await this.reportProgress($,{progress:FA.START,message:`Starting ${this.jobTypeName}`});let Z=await this.generate(f,$),V=x$(f),H=V?this.applyPreallocatedEntityId(V,Z):Z;await this.reportProgress($,{progress:FA.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:FA.COMPLETE,message:`${H.title??this.entityType} created successfully`}),{success:!0,entityId:M.entityId,...H.resultExtras}}catch(Z){if(Z instanceof J$)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),wZ.failure(Z)}}applyPreallocatedEntityId(f,A){let $={...A.metadata},Z=A.content,V=A.resultExtras;if(typeof $.slug==="string")$.slug=f,Z=CA(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 $=xZ(w$(f.content).frontmatter),Z=xZ(f.metadata),V=NA(A.metadata),H=w$(A.content),M=NA(H.frontmatter),X=NA({...$,...V,...M});return this.context.entities.getEffectiveFrontmatterSchema(this.entityType)?.parse(X),{content:QZ(X,H.content),metadata:{...Z,...V}}}async markPreallocatedStubFailed(f,A){let $=x$(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:CA(CA(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=OZ(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:JZ.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 J$(f)}}class J$ extends Error{constructor(f){super(f);this.name="GenerationFailure"}}function Q$(f,A){f.messaging.subscribe(Bf.progress,async($)=>{try{let Z=rf.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 q$(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+=`
2
+ import{$e as j,Hf as yf,Je as g,Kf as b$,Le as x,Me as R,Nf as Sf,Oe as m,Pe as Lf,Pf as K$,Qe as W0,Qf as wf,Se as _f,Te as Bf,Ue as A$,Uf as vf,Vf as jf,We as $$,Xe as q0,Ye as Af,Yf as x$,Ze as d,Zf as QZ,_f as CA,af as k,ag as zf,bf as o,cg as yA,df as b,hf as bf,if as cf,mf as hU,pf as HA,rf as I,sf as v,tf,uf as K,vf as Vf,wf as fA,yf as ef}from"./index-x1z91h8f.js";import{ng as rf}from"./index-fd1gxz8a.js";import{Fg as t0,Ig as cA}from"./index-ra0ektdg.js";import{Bh as e0}from"./index-gq8ts1j6.js";import{$h as ff,Ai as kf,Fi as Pf,Ii as FA,Sh as pf,Th as lf,Uh as nf,Xh as UZ,ai as C0,bi as m0,ci as e$,ji as Y0,pi as S,qi as Cf,ri as xZ,si as Yf,ti as Zf,vi as N$,zi as JZ}from"./index-sam9qxh9.js";import{Qi as U}from"./index-8p1j80d4.js";var vU=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:cA}),jU=U.object({id:U.string(),conversationId:U.string(),role:Yf,content:U.string(),timestamp:U.string(),metadata:cA});var pA=U.object({name:U.string(),role:U.string(),purpose:U.string(),values:U.array(U.string())}),lA=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 X0(f){return x`count(${f||x.raw("*")})`.mapWith(Number)}function dA(f){return Y0(nA(f))}function nA(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)=>nA(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)}:${nA(H,$)}`).join(",")}}`}function iA(f){if(f!==null&&typeof f==="object"){for(let A of Object.values(f))iA(A);Object.freeze(f)}return f}var gU=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 IU(f){let A=gU.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=vf.parse(M);return iA(f.inputSchema.parse(X))},fingerprint:dA,derive:async(Z,V,H)=>{let M=f.inputSchema.parse(Z),X=U.array(jf).parse(await f.derive(M,V,H));for(let Y of X){let F=Y.operation==="upsert"?Y.entity.entityType:Y.entityType;if(F!==A.targetType)throw Error(`Projection rule "${A.id}" cannot write entity type "${F}"`)}return iA(X)}})}var L0={digest:"conversation:digest"};var J=o("conversations",{id:k("id").primaryKey(),sessionId:k("session_id").notNull(),interfaceType:k("interface_type").notNull(),channelId:k("channel_id").notNull(),personId:k("person_id"),started:k("started").notNull(),lastActive:k("last_active").notNull(),metadata:k("metadata"),created:k("created").notNull(),updated:k("updated").notNull()},(f)=>({sessionIdx:b("idx_conversations_session").on(f.sessionId),channelIdx:b("idx_conversations_channel").on(f.channelId),personIdx:b("idx_conversations_person").on(f.personId),interfaceSessionIdx:b("idx_conversations_interface_session").on(f.interfaceType,f.sessionId),interfaceChannelIdx:b("idx_conversations_interface_channel").on(f.interfaceType,f.channelId)})),h=o("messages",{id:k("id").primaryKey(),conversationId:k("conversation_id").notNull().references(()=>J.id,{onDelete:"cascade"}),role:k("role").notNull(),content:k("content").notNull(),timestamp:k("timestamp").notNull(),metadata:k("metadata")},(f)=>({conversationIdx:b("idx_messages_conversation").on(f.conversationId),timestampIdx:b("idx_messages_timestamp").on(f.timestamp)})),t=o("summary_tracking",{conversationId:k("conversation_id").primaryKey().references(()=>J.id,{onDelete:"cascade"}),lastSummarizedAt:k("last_summarized_at"),lastMessageId:k("last_message_id"),messagesSinceSummary:j("messages_since_summary").default(0),updated:k("updated").notNull()});function F0(f){return bf({url:f.url,schema:{conversations:J,messages:h,summaryTracking:t},authToken:f.authToken,authTokenEnv:"CONVERSATION_DATABASE_AUTH_TOKEN"})}var uU=U.preprocess((f)=>{if(typeof f!=="string")return f;try{return JSON.parse(f)}catch{return}},U.record(U.string(),U.unknown())).catch({});function e(f){return uU.parse(f)}var If="conversation:messageAdded",sA="conversation:started",Wf=U.object({identity:ff,interfaceType:U.string(),role:Yf,displayName:U.string().optional(),username:U.string().optional(),isBot:U.boolean().optional()}),cU=U.preprocess(pU,Wf);function pU(f){if(!gf(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:C0({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 Df=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()}),N0=U.looseObject({actor:cU.optional(),source:Df.optional()});function G0(f){if(typeof f==="string")try{let A=JSON.parse(f);return gf(A)?A:null}catch{return null}return gf(f)?f:null}function lU(f){if(f.role!=="assistant")return!1;if(f.content.trim().length===0)return!1;let A=G0(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(!gf(V))return!1;if(V.kind==="tool-approval")return!0;return V.kind==="actions"&&V.id==="actions:upload-intent"})}function gf(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}var nU=U.object({id:U.string(),conversationId:U.string(),role:U.string(),content:U.string(),timestamp:U.string(),metadata:U.string().nullable()}),K0=U.object({conversationId:U.string(),messageCount:U.number(),messages:U.array(nU),windowStart:U.number(),windowEnd:U.number(),windowSize:U.number(),timestamp:U.string()});class uf{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 cf(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 uf(f,A,$,Z)}static createFreshFromConfig(f,A,$,Z){let{db:V,client:H,url:M}=F0($),X=new uf(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(J).set({lastActive:M,updated:M}).where(R(J.id,A)),this.logger.debug("Resumed existing conversation",{conversationId:A,interfaceType:$}),A;let Y={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(J).values(Y);let F={conversationId:A,messagesSinceSummary:0,updated:M};return await this.db.insert(t).values(F),this.logger.debug("Started new conversation",{conversationId:A,sessionId:A,interfaceType:$}),await this.messageBus.send({type:sA,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=g(12),X={id:M,conversationId:A,role:$,content:Z,timestamp:H,metadata:V?JSON.stringify(V):null};await this.db.insert(h).values(X),await this.db.update(J).set({lastActive:H,updated:H}).where(R(J.id,A)),await this.db.update(t).set({messagesSinceSummary:x`${t.messagesSinceSummary} + 1`,lastMessageId:M,updated:H}).where(R(t.conversationId,A)),this.logger.debug("Added message to conversation",{conversationId:A,role:$,messageId:M}),await this.messageBus.send({type:If,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(h).where(R(h.conversationId,f)).orderBy(Af(h.timestamp)).limit(H).offset(V)}else return(await this.db.select().from(h).where(R(h.conversationId,f)).orderBy(d(h.timestamp)).limit($)).reverse()}async getConversation(f){return(await this.db.select().from(J).where(R(J.id,f)).limit(1))[0]??null}async listConversations(f={}){let{limit:A=100,updatedAfter:$,interfaceType:Z,sessionId:V,channelId:H,personId:M}=f,X=[$?W0(J.updated,$):void 0,Z?R(J.interfaceType,Z):void 0,V?R(J.sessionId,V):void 0,H?R(J.channelId,H):void 0,M?R(J.personId,M):void 0].filter((F)=>F!==void 0),Y=this.db.select().from(J).orderBy(d(J.lastActive)).limit(A);if(X.length===0)return Y;return Y.where(m(...X))}async searchConversations(f,A){let $=`%${f.toLowerCase()}%`;return(await this.db.selectDistinct({conversation:J}).from(J).leftJoin(h,R(h.conversationId,J.id)).where(A?x`lower(${h.content}) LIKE ${$} AND ${J.sessionId} = ${A}`:x`lower(${h.content}) LIKE ${$}`).orderBy(d(J.lastActive))).map((V)=>V.conversation)}async countMessages(f){let[A]=await this.db.select({count:X0()}).from(h).where(R(h.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={...e(A.metadata),...f.metadata};return await this.db.update(J).set({metadata:JSON.stringify(Z),updated:$}).where(R(J.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(J).where(R(J.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:L0.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 aA=U.object({kind:U.string().min(1),id:U.string().min(1)}),D0=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:aA.optional()}),V1=U.custom((f)=>f instanceof Uint8Array),H1=U.object({kind:U.literal("file"),filename:U.string().min(1),mediaType:U.string().min(1),data:V1,sizeBytes:U.number().nonnegative().optional(),source:aA.optional()}),P0=U.discriminatedUnion("kind",[D0,H1]),M1=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:Wf.optional(),source:Df.optional(),attachments:U.array(P0).optional()});var X1=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()}),R0=U.object({name:U.string(),pluginId:U.string(),status:U.string(),health:X1.optional()});var P4=U.object({id:U.string(),type:U.string(),version:U.string(),status:U.string()}),R4=U.object({name:U.string(),description:U.string()}),_0=U.enum(["admin","trusted","public"]),df=U.object({label:U.string(),url:U.string(),pluginId:U.string(),priority:U.number().default(100),visibility:_0.default("public")}),B0=U.enum(["human","agent","admin","protocol"]),k0=U.enum(["available","coming-soon","disabled"]),sf=U.object({id:U.string(),label:U.string(),description:U.string().optional(),href:U.string(),kind:B0,pluginId:U.string(),priority:U.number().default(100),visibility:_0.default("public"),status:k0.default("available")}),rA=U.object({entityType:U.string(),count:U.number()}),F1=U.object({model:U.string(),version:U.string(),uptime:U.number(),entities:U.number(),entityCounts:U.array(rA),embeddings:U.number(),ai:U.object({model:U.string(),embeddingModel:U.string()}),daemons:U.array(R0),endpoints:U.array(df),interactions:U.array(sf)});var C1=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()});var N1=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:N1.optional()}),K1=U.object({model:U.string(),version:U.string(),uptime:U.number(),entities:U.number(),entityCounts:U.array(rA),embeddings:U.number(),ai:U.object({model:U.string(),embeddingModel:U.string()}),daemons:U.array(G1),endpoints:U.array(df),interactions:U.array(sf)});var O0=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()}),w0=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()})}),x0=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:w0.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(O0),resources:x0});class i{callback;heartbeatInterval;constructor(f){this.callback=f}static from(f){if(!f)return;return new i(f)}createSub(f){let{scale:A}=f??{};if(A){let{start:$,end:Z}=A,V=Z-$;return new i(async(H)=>{let M=$+H.progress/(H.total??100)*V;await this.callback({...H,progress:M,total:100})})}return new i(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 D1=U.object({enabled:U.boolean().describe("Whether the plugin is enabled"),debug:U.boolean().describe("Enable debug logging for this plugin")});class af extends Error{pluginId;issues;constructor(f,A){super(`Invalid plugin config for ${f}`);this.name="PluginConfigValidationError",this.pluginId=f,this.issues=A}}var P1=U.object({toolName:U.string(),args:U.unknown(),progressToken:U.union([U.string(),U.number()]).optional(),hasProgress:U.boolean().optional(),interfaceType:U.string(),actor:ff,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()}),R1=U.object({resourceUri:U.string()});class $f{id;version;description;packageName;config;context;get logger(){return this.context?.logger??rf.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 af(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(Pf.toolExecute(this.id),async(A)=>{try{let $=P1.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:Y,displayName:F,conversationId:N,channelId:C,channelName:P,runId:_,toolCallId:q,userPermissionLevel:E,isAnchor:u,signal:a}=$.data,G=(await this.getTools()).find((O)=>O.name===Z);if(!G)return{success:!1,error:`Tool not found: ${Z}`};let B={interfaceType:X,actor:Y,...F&&{displayName:F},...N&&{conversationId:N},...C&&{channelId:C},...P&&{channelName:P},..._&&{runId:_},...q&&{toolCallId:q},...E&&{userPermissionLevel:E},...u!==void 0&&{isAnchor:u},...a&&{signal:a},...M&&H!==void 0&&{progressToken:H,sendProgress:async(O)=>{await f.messaging.send({type:Pf.progress(this.id),payload:{progressToken:H,notification:O}})}}};return{success:!0,data:await G.handler(V,B)}}catch($){return this.logger.error("Tool execution error",$),{success:!1,error:S($)}}}),f.messaging.subscribe(Pf.resourceGet(this.id),async(A)=>{try{let $=R1.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 i.from(async(Z)=>{await A.messaging.send({type:Pf.progress($),payload:{progressToken:f,notification:{progress:Z.progress,total:Z.total,message:Z.message}}})})}}var oA=U.enum(["file_operations","content_operations","data_processing","batch_processing"]),_1=U.object({pluginId:U.string().optional(),progressToken:U.union([U.string(),U.number()]).optional(),operationType:oA,operationTarget:U.string().optional(),interfaceType:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),requestedByActor:ff.optional(),requestedByUserId:U.string().optional(),requestedByInterface:U.string().optional(),silent:U.boolean().optional(),provenance:Zf.optional()}),Uf=U.object({pluginId:U.string().optional(),progressToken:U.union([U.string(),U.number()]).optional(),operationType:oA,operationTarget:U.string().optional(),interfaceType:U.string().optional(),conversationId:U.string().optional(),channelId:U.string().optional(),requestedByActor:ff.optional(),requestedByUserId:U.string().optional(),requestedByInterface:U.string().optional(),silent:U.boolean().optional(),provenance:Zf.optional(),rootJobId:U.string()}),I4=U.enum(["none","skip","replace","coalesce"]);var tA=U.enum(["pending","processing","completed","failed"]),J0=U.enum(["completed","failed"]),D={PENDING:"pending",PROCESSING:"processing",COMPLETED:"completed",FAILED:"failed"},B1=U.object({id:U.string(),type:U.string(),status:tA,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:J0,result:U.unknown().optional(),error:U.string().optional()}),eA=U.object({success:U.literal(!1),error:U.string().optional()}),of=U.object({id:U.string(),type:U.enum(["job","batch"]),status:tA,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:Uf});var L=o("job_queue",{id:k("id").primaryKey().$defaultFn(()=>g()),type:k("type").notNull(),data:k("data").notNull(),result:k("result",{mode:"json"}),progress:k("progress",{mode:"json"}).$type(),source:k("source"),metadata:k("metadata",{mode:"json"}).$type().notNull(),status:k("status",{enum:["pending","processing","completed","failed"]}).notNull().default("pending"),priority:j("priority").notNull().default(0),retryCount:j("retryCount").notNull().default(0),maxRetries:j("maxRetries").notNull().default(3),lastError:k("lastError"),createdAt:j("createdAt").notNull().$defaultFn(()=>Date.now()),scheduledFor:j("scheduledFor").notNull().$defaultFn(()=>Date.now()),startedAt:j("startedAt"),completedAt:j("completedAt"),attemptId:k("attemptId"),workerSlotId:k("workerSlotId"),workerSessionId:k("workerSessionId"),leaseExpiresAt:j("leaseExpiresAt"),attemptHeartbeatAt:j("attemptHeartbeatAt"),runtimeUpdatedAt:j("runtimeUpdatedAt")},(f)=>({queueReadyIdx:b("idx_job_queue_ready").on(f.status,f.priority,f.scheduledFor),jobTypeIdx:b("idx_job_queue_type").on(f.type,f.status),runtimeUpdatesIdx:b("idx_job_queue_runtime_updates").on(f.runtimeUpdatedAt,f.id),jobSourceIdx:b("idx_job_queue_source").on(f.source)})),w=o("job_worker_sessions",{slotId:k("slotId").primaryKey(),sessionId:k("sessionId").notNull().unique(),startedAt:j("startedAt").notNull(),heartbeatAt:j("heartbeatAt").notNull()},(f)=>({heartbeatIdx:b("idx_job_worker_sessions_heartbeat").on(f.heartbeatAt)}));function Q0(f){return bf({url:f.url,schema:{jobQueue:L,jobWorkerSessions:w},authToken:f.authToken,authTokenEnv:"JOB_QUEUE_DATABASE_AUTH_TOKEN"})}class f${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 O1=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:Uf,progress:U.custom((f)=>typeof f==="object"&&f!==null&&("progress"in f)&&typeof f.progress==="number").nullable(),result:U.unknown().nullable().optional()}),Rf=15000;class Z${db;logger;constructor(f,A){this.db=f,this.logger=A.child("JobQueueRepository")}async insert(f){await this.db.insert(L).values(f)}async startWorkerSession(f,A,$=Date.now()){await this.db.insert(w).values({slotId:f,sessionId:A,startedAt:$,heartbeatAt:$}).onConflictDoUpdate({target:w.slotId,set:{sessionId:A,startedAt:$,heartbeatAt:$}})}async heartbeatWorkerSession(f,A,$=Date.now()){return(await this.db.update(w).set({heartbeatAt:$}).where(m(R(w.slotId,f),R(w.sessionId,A))).returning({slotId:w.slotId})).length===1}async endWorkerSession(f,A){return(await this.db.delete(w).where(m(R(w.slotId,f),R(w.sessionId,A))).returning({slotId:w.slotId})).length===1}async markTerminallyFailed(f,A){let $=Date.now();await this.db.update(L).set({status:D.FAILED,lastError:A,completedAt:$,runtimeUpdatedAt:this.nextRuntimeUpdatedAt($)}).where(m(R(L.id,f),R(L.status,D.PENDING)))}async setScheduledFor(f,A){await this.db.update(L).set({scheduledFor:A}).where(R(L.id,f))}async complete(f,A,$){let Z=Date.now(),H=(await this.db.update(L).set({status:D.COMPLETED,result:A,lastError:null,completedAt:Z,runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z)}).where(this.attemptWriteGuard(f,$)).returning({id:L.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(L).set({data:JSON.stringify(A)}).where(this.attemptWriteGuard(f,$)).returning({id:L.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(L).set({attemptHeartbeatAt:Z,runtimeUpdatedAt:this.nextRuntimeUpdatedAt(Z),progress:$}).where(this.attemptWriteGuard(f,A)).returning({id:L.id})).length===1}async renewAttemptLease(f,A,$,Z){return(await this.db.update(L).set({attemptHeartbeatAt:$,leaseExpiresAt:$+Z}).where(this.attemptWriteGuard(f,A)).returning({id:L.id})).length===1}async fail(f,A,$,Z=Date.now()){let H=(await this.db.select({retryCount:L.retryCount,maxRetries:L.maxRetries,type:L.type,scheduledFor:L.scheduledFor,startedAt:L.startedAt,runtimeUpdatedAt:L.runtimeUpdatedAt}).from(L).where(this.attemptWriteGuard(f,$)).limit(1))[0];if(!H)return!1;let M=H.retryCount<H.maxRetries,X=M?H.retryCount+1:H.retryCount,Y=Math.min(1000*2**H.retryCount,60000),F=M?Z+Y:H.scheduledFor;if((await this.db.update(L).set({status:M?D.PENDING:D.FAILED,retryCount:X,lastError:A.message,scheduledFor:F,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(m(this.attemptWriteGuard(f,$),R(L.retryCount,H.retryCount))).returning({id:L.id})).length!==1)return!1;if(M)this.logger.debug("Job scheduled for retry",{jobId:f,retryCount:X,backoffMs:Y,scheduledFor:new Date(F).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(L).where(R(L.id,f)).limit(1))[0]??null}async getStatusByEntityId(f){return(await this.db.select().from(L).where(x`json_extract(${L.data}, '$.id') = ${f}`).orderBy(d(L.createdAt)).limit(1))[0]??null}async getStats(){let f=await this.db.select({status:L.status,count:x`count(*)`}).from(L).groupBy(L.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-Rf,[$,Z,V]=await Promise.all([this.db.select({type:L.type,status:L.status,count:x`count(*)`}).from(L).groupBy(L.type,L.status),this.db.select({oldestPendingAt:x`min(case when ${L.status} = ${D.PENDING} then ${L.createdAt} end)`,oldestProcessingAt:x`min(case when ${L.status} = ${D.PROCESSING} then ${L.startedAt} end)`,staleLeaseCount:x`coalesce(sum(case when ${L.status} = ${D.PROCESSING} and ${L.leaseExpiresAt} is not null and ${L.leaseExpiresAt} <= ${f} then 1 else 0 end), 0)`}).from(L),this.db.select({total:x`count(*)`,active:x`coalesce(sum(case when ${w.heartbeatAt} > ${A} then 1 else 0 end), 0)`,stale:x`coalesce(sum(case when ${w.heartbeatAt} <= ${A} then 1 else 0 end), 0)`,latestHeartbeatAt:x`max(${w.heartbeatAt})`}).from(w)]),H={pending:0,processing:0,completed:0,failed:0},M=$.map((N)=>{let C=Number(N.count);return H[N.status]+=C,{type:N.type,status:N.status,count:C}}),X=Z[0],Y=V[0],F=(N)=>N===null||N===void 0?null:Math.max(0,f-Number(N));return{totals:H,byType:M,oldestPendingAgeMs:F(X?.oldestPendingAt),oldestProcessingAgeMs:F(X?.oldestProcessingAt),staleLeaseCount:Number(X?.staleLeaseCount??0),workerSessions:{total:Number(Y?.total??0),active:Number(Y?.active??0),stale:Number(Y?.stale??0),latestHeartbeatAgeMs:F(Y?.latestHeartbeatAt)}}}async getRuntimeUpdates(f,A){return(await this.db.select().from(L).where(x`(${L.runtimeUpdatedAt}, ${L.id}) > (${f.updatedAt}, ${f.jobId})`).orderBy(Af(L.runtimeUpdatedAt),Af(L.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(L).where(m(Lf(R(L.status,D.COMPLETED),R(L.status,D.FAILED)),_f(L.completedAt,A)))).rowsAffected}async getActiveJobs(f){let A=Lf(R(L.status,D.PENDING),R(L.status,D.PROCESSING)),$=f&&f.length>0?m(A,Bf(L.type,f)):A;return this.db.select().from(L).where($).orderBy(d(L.createdAt))}async getFailedJobs(f){let A=R(L.status,D.FAILED),$=f&&f.length>0?m(A,Bf(L.type,f)):A;return this.db.select().from(L).where($).orderBy(d(L.createdAt))}async claimNextReady(f){let{now:A,attemptId:$,workerSlotId:Z,workerSessionId:V,leaseDurationMs:H,workerSessionTimeoutMs:M,executableTypes:X}=f,Y=A-M,F=this.db.select({slotId:w.slotId}).from(w).where(m(R(w.slotId,Z),R(w.sessionId,V))),N=this.db.select({slotId:w.slotId}).from(w).where(m(R(w.slotId,L.workerSlotId),R(w.sessionId,L.workerSessionId))),C=this.db.select({slotId:w.slotId}).from(w).where(m(R(w.slotId,L.workerSlotId),R(w.sessionId,L.workerSessionId),_f(w.heartbeatAt,Y))),P=m(R(L.status,D.PROCESSING),Lf(A$(L.attemptId),q0(N),m(_f(L.leaseExpiresAt,A),$$(C)))),_=x`${L.status} = ${D.PROCESSING} AND ${L.retryCount} + 1 > ${L.maxRetries}`,q=this.db.select({id:L.id}).from(L).where(m(Bf(L.type,X),Lf(m(R(L.status,D.PENDING),_f(L.scheduledFor,A)),P))).orderBy(Af(L.priority),Af(L.createdAt)).limit(1),u=(await this.db.update(L).set({status:x`CASE WHEN ${_} THEN ${D.FAILED} ELSE ${D.PROCESSING} END`,retryCount:x`CASE WHEN ${L.status} = ${D.PROCESSING} THEN ${L.retryCount} + 1 ELSE ${L.retryCount} END`,lastError:x`CASE WHEN ${L.status} = ${D.PROCESSING} THEN 'Attempt lease expired' ELSE ${L.lastError} END`,startedAt:x`CASE WHEN ${_} THEN ${L.startedAt} ELSE ${A} END`,completedAt:x`CASE WHEN ${_} THEN ${A} ELSE NULL END`,attemptId:x`CASE WHEN ${_} THEN ${L.attemptId} ELSE ${$} END`,workerSlotId:x`CASE WHEN ${_} THEN ${L.workerSlotId} ELSE ${Z} END`,workerSessionId:x`CASE WHEN ${_} THEN ${L.workerSessionId} ELSE ${V} END`,leaseExpiresAt:x`CASE WHEN ${_} THEN ${L.leaseExpiresAt} ELSE ${A+H} END`,attemptHeartbeatAt:x`CASE WHEN ${_} THEN ${L.attemptHeartbeatAt} ELSE ${A} END`,runtimeUpdatedAt:x`CASE WHEN ${_} THEN ${this.nextRuntimeUpdatedAt(A)} ELSE ${L.runtimeUpdatedAt} END`}).where(m(Bf(L.id,q),$$(F))).returning())[0];if(u?.status!==D.PROCESSING)return null;return this.logger.debug("Job claimed",{jobId:u.id,attemptId:u.attemptId,workerSlotId:Z,workerSessionId:V}),u}nextRuntimeUpdatedAt(f){return x`max(${f}, coalesce((select max(${L.runtimeUpdatedAt}) from ${L}), 0) + 1)`}attemptWriteGuard(f,A){return A?m(R(L.id,f),R(L.status,D.PROCESSING),R(L.attemptId,A)):m(R(L.id,f),A$(L.attemptId),Lf(R(L.status,D.PENDING),R(L.status,D.PROCESSING)))}}var w1=U.looseObject({deduplicationKey:U.string().optional()});class U${findDuplicate(f,A,$){if(!A||A==="none")return null;let Z=this.filterByDeduplicationKey(f,$);if(Z.length===0)return null;if(A==="skip"||A==="replace")return Z.find((V)=>V.status===D.PENDING)??null;return Z[0]??null}filterByDeduplicationKey(f,A){if(!A)return f;return f.filter(($)=>{let Z=w1.safeParse($.metadata);return Z.success&&Z.data.deduplicationKey===A})}}import{AsyncLocalStorage as x1}from"async_hooks";class Ff{storage=new x1;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=Zf.parse(f),V=J1(Z);return this.storage.run(Object.freeze({provenance:V,operationId:A}),$)}}function J1(f){if(Object.freeze(f.projectionLineage),f.sourceEntity)Object.freeze(f.sourceEntity);return Object.freeze(f)}class V${client;logger;handlerRegistry;repository;deduplicator;walInitialization=null;walInitializationSettled=!1;closeRequested=!1;clientClosed=!1;databaseUrl;operationContext;projectionAdmission;directWorkerSlotId=`direct:${g()}`;directWorkerSessionId=g();directLeaseDurationMs;directSessionStart=null;close(){if(this.closeRequested=!0,!this.walInitialization||this.walInitializationSettled)this.closeClient()}static createFresh(f,A,$){return new V$(f,A??rf.getInstance(),$)}constructor(f,A,$){let{db:Z,client:V,url:H}=Q0(f);this.client=V,this.databaseUrl=H,this.logger=A.child("JobQueueService"),this.operationContext=$?.operationContext??Ff.createFresh(),this.projectionAdmission=$?.projectionAdmission,this.handlerRegistry=new f$(this.logger,$?.handlerRegistrationMode??"combined"),this.repository=new Z$(Z,this.logger),this.directLeaseDurationMs=f.claimTimeoutMs??300000,this.deduplicator=new U$}initialize(){if(this.closeRequested)return Promise.resolve();return this.walInitialization??=this.initializeWALMode(),this.walInitialization}async initializeWALMode(){try{await cf(this.client,this.databaseUrl)}catch(f){this.logger.warn("Failed to enable WAL mode (non-fatal)",f)}finally{if(this.walInitializationSettled=!0,this.closeRequested)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)}finalizeHandlerRegistrations(){return this.handlerRegistry.finalizeRegistrations()}getExecutionRegistrations(){return this.handlerRegistry.getExecutionRegistrations()}async checkForDuplicate(f,A,$){let Z=await this.getActiveJobs([f]);return this.deduplicator.findDuplicate(Z,A,$)}async enqueue(f){let{type:A,data:$,options:Z}=f,V=await this.checkForDuplicate(A,Z?.deduplication,Z?.deduplicationKey);if(V){if(Z?.deduplication==="skip")return this.logger.debug("Skipping duplicate job (already pending)",{type:A,existingJobId:V.id}),V.id;if(Z?.deduplication==="replace")this.logger.debug("Replacing duplicate job",{type:A,oldJobId:V.id}),await this.repository.markTerminallyFailed(V.id,"Replaced by newer job");if(Z?.deduplication==="coalesce")return this.logger.debug("Coalescing with existing job",{type:A,existingJobId:V.id}),await this.repository.setScheduledFor(V.id,Date.now()),V.id}let H=this.handlerRegistry.getValidator(A);if(!H)throw Error(`No handler registered for job type: ${A}`);let M=H.validateAndParse($);if(M===null)throw Error(`Invalid job data for type: ${A}`);let X=Date.now(),Y=g(),F=Z?.rootJobId??this.operationContext.current()?.provenance.rootJobId??Y,N=this.createJobProvenance(Y,F,Z);await this.projectionAdmission?.assertJobAdmission(N);let{provenance:C,...P}=Z?.metadata??{operationType:"data_processing"},_={id:Y,type:A,data:JSON.stringify(M),status:D.PENDING,priority:Z?.priority??0,maxRetries:Z?.maxRetries??3,retryCount:0,source:Z?.source??null,metadata:{...P,...Z?.deduplicationKey&&{deduplicationKey:Z.deduplicationKey},rootJobId:F,provenance:N},createdAt:X,scheduledFor:Z?.delayMs?X+Z.delayMs:X,result:null,lastError:null,startedAt:null,completedAt:null};try{return await this.repository.insert(_),this.logger.debug("Job enqueued",{id:Y,type:A,priority:_.priority,rootJobId:_.metadata.rootJobId}),Y}catch(q){throw this.logger.error("Failed to enqueue job",{type:A,error:S(q)}),q}}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,Y=X?[...H?.projectionLineage??[],X.id]:[...H?.projectionLineage??[]],F=X?.id??H?.projectionId;return Zf.parse({rootJobId:A,causationId:M??H?.causationId??f,...F?{projectionId:F}:{},projectionLineage:Y,...X?.sourceEntity?{sourceEntity:X.sourceEntity}:H?.sourceEntity?{sourceEntity:H.sourceEntity}:{},derivationDepth:Y.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:g(),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 T0 extends Error{constructor(f,A){super(`Job ${f} exceeded its ${A}ms execution deadline`);this.name="JobDeadlineExceededError"}}class H${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 H$(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??Rf,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=g();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=K.runSync(v.make()),this.jobFibers=K.runSync(v.extend(Vf.make(),this.workerScope)),this.pollFiber=K.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 K.runPromise(tf.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 K.runPromise(Vf.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 K.runPromise(Vf.run($,Z.id,K.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=K.suspend(()=>{if(!this.isWorkerRunning()||this.isStopRequested())return K.interrupt;return this.currentPoll=this.processAvailableJobs(),K.promise(()=>this.currentPoll??Promise.resolve()).pipe(K.andThen(K.suspend(()=>{return this.currentPoll=null,!this.isWorkerRunning()||this.isStopRequested()?K.interrupt:K.void})))}).pipe(K.schedule(ef.spaced(this.config.pollInterval)),K.asVoid);return(this.clock?K.withClock(A,this.clock):A).pipe(K.ensuring(K.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,Y)=>{Z=X,V=Y}),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 K.runPromise(v.close(f,I.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=Cf(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((P)=>({kind:"success",value:P}),(P)=>({kind:"failure",error:P})),H,M=new Promise((P)=>{H=setTimeout(()=>P({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 Y=new T0(f,A);$.abort(Y);let F,N=new Promise((P)=>{F=setTimeout(()=>P({kind:"grace-expired"}),Math.max(1,this.config.cancellationGraceMs))});if((await Promise.race([V,N])).kind!=="grace-expired"){if(F)clearTimeout(F);throw Y}throw this.markUnhealthy(`${Y.message}; handler ignored cancellation grace`),await V,Y}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:D.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:D.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),Y=$.validateAndParse(X);if(Y===null)throw Error(`Invalid job data for type: ${f.type}`);let F=this.progressMonitor.createProgressReporter(f.id,A),N=$.executionTimeoutMs??this.config.defaultExecutionTimeoutMs,C=await this.executeWithDeadline(f.type,N,Z,()=>$.process(Y,f.id,F,Z.signal));await M();let P=eA.safeParse(C);if(P.success){let q=P.data.error??"Handler returned failure",E=Error(q);if(await this.jobQueueService.fail(f.id,E,A))await this.emitTerminalFailure(f,E,$,A);return{jobId:f.id,type:f.type,status:D.FAILED,error:q}}if(!await this.jobQueueService.complete(f.id,C,A))return{jobId:f.id,type:f.type,status:D.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:D.COMPLETED,result:C}}catch(X){let Y=Cf(X);await M();try{let N=JSON.parse(f.data),C=$.validateAndParse(N);if(C!==null&&$.onError){let P=this.progressMonitor.createProgressReporter(f.id,A),_=new AbortController;await this.executeWithDeadline(`${f.type}:onError`,this.config.errorCallbackTimeoutMs,_,()=>$.onError?.(Y,C,f.id,P,_.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,Y,A))await this.emitTerminalFailure(f,Y,$,A);return{jobId:f.id,type:f.type,status:D.FAILED,error:Y.message}}}async emitTerminalFailure(f,A,$,Z){if((await this.jobQueueService.getStatus(f.id))?.status!==D.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 Q1=86400000,E0=3600000;class M${jobQueue;logger;batches=new Map;cleanupFiber=null;cleanupSupervisor=null;inFlightCleanups=new Set;activeTransition=null;transitionQueue=[];acceptingCleanup=!0;clock;static createFresh(f,A,$){return new M$(f,A,$)}constructor(f,A,$){this.jobQueue=f,this.logger=A,this.clock=$?.clock}start(f=E0){return this.requestTransition("start",f)}stop(){return this.requestTransition("stop",E0)}async startCleanup(f){if(this.acceptingCleanup=!0,this.cleanupFiber)return;this.cleanupFiber=K.runFork(this.runCleanupLoop(f))}runCleanupLoop(f){let A=this.cleanupTerminalBatchMetadata().pipe(K.schedule(ef.spaced(f)),K.asVoid);return this.clock?K.withClock(A,this.clock):A}scheduleTerminalBatchCleanup(){if(!this.acceptingCleanup)return;this.cleanupSupervisor??=this.createCleanupSupervisor();let f=K.runFork(this.cleanupTerminalBatchMetadata());fA.unsafeAdd(this.cleanupSupervisor.fibers,f)}async stopCleanup(){this.acceptingCleanup=!1;let f=this.cleanupFiber;if(this.cleanupFiber=null,f)await K.runPromise(tf.interrupt(f));let A=this.cleanupSupervisor;if(A)await K.runPromise(fA.awaitEmpty(A.fibers));while(this.inFlightCleanups.size>0)await Promise.allSettled(this.inFlightCleanups);if(A)await K.runPromise(v.close(A.scope,I.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,Y)=>{Z=X,V=Y}),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=K.runSync(v.make()),A=K.runSync(v.extend(fA.make(),f));return{scope:f,fibers:A}}cleanupTerminalBatchMetadata(){return K.tryPromise({try:()=>{let f=this.cleanup(Q1);return this.inFlightCleanups.add(f),f.then(()=>this.inFlightCleanups.delete(f),()=>this.inFlightCleanups.delete(f)),f},catch:(f)=>f}).pipe(K.asVoid,K.catchAll((f)=>K.sync(()=>{this.logger.warn("Failed to clean up terminal batch metadata",{error:f})})))}validateOperations(f){for(let A of f){let $=this.jobQueue.getHandler(A.type);if(!$)throw Error(`No handler registered for job type: ${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((F)=>this.jobQueue.getStatus(F))),Z=0,V=0,H=0,M=[];for(let[F,N]of $.entries()){if(!N){V++;let C=A.operations[F],P=A.jobIds[F]??"unknown";M.push(`Missing job ${P}${C?` for ${C.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=D.PROCESSING;else if(V>0)X=D.FAILED;else X=D.COMPLETED;if(A.terminalAt===void 0&&(X===D.COMPLETED||X===D.FAILED))A.terminalAt=Date.now();let Y;for(let F=0;F<A.jobIds.length;F++){let N=$[F];if(N&&N.status!=="completed"&&N.status!=="failed"){let C=A.operations[F];if(C)Y=`Processing ${C.type}`;break}}return{batchId:f,totalOperations:A.operations.length,completedOperations:Z,failedOperations:V,errors:M,status:X,currentOperation:Y,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===D.COMPLETED||M.status===D.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 q1=U.preprocess((f)=>{if(typeof f!=="string")return f;return JSON.parse(f)},U.record(U.string(),U.unknown()));class X${jobQueueService;messageBus;batchJobManager;logger;mode;pollTimer;pollCursor={updatedAt:0,jobId:""};polling=!1;static createFresh(f,A,$,Z,V="combined"){return new X$(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 $=i.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:kf.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:kf.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 $=q1.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=$?Uf.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 T1=U.record(U.string(),U.unknown());class Of{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=T1.safeParse(f);return A.success?A.data:{}}}function Y$(f,A,$){return async(Z)=>{let{type:V,data:H,toolContext:M=null,options:X,projection:Y}=Z,F=M?m0(M):void 0,{metadata:N,...C}=X??{},P={operationType:"data_processing",pluginId:A,...N,...M&&{interfaceType:M.interfaceType,conversationId:M.conversationId,channelId:M.channelId,requestedByActor:M.actor,...F?{requestedByUserId:F}:{},requestedByInterface:M.interfaceType}};if(M&&!F)delete P.requestedByUserId;let _={...C,source:A,...X?.rootJobId&&{rootJobId:X.rootJobId},...Y&&{projection:Y},metadata:P},q=$&&!V.includes(":")?`${A}:${V}`:V;return f.enqueue({type:q,data:H,options:_})}}function L$(f,A){return async($,Z)=>{let V=g(),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 F$(f,A){return($,Z)=>{let V=$.includes(":")?$:`${A}:${$}`;f.registerHandler(V,Z,A)}}var E1=U.custom((f)=>typeof f==="object"&&f!==null&&("safeParse"in f)),m1=U.object({name:U.string(),schema:E1});function S0(f){return m1.safeParse(f).success}function S1(f){if(!f)return;return{status:f.status,message:f.message,lastCheck:f.lastCheck?.toISOString(),details:f.details}}function z0(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:S1(A.health)})),endpoints:f.endpoints,interactions:f.interactions}}function z1(f){let A=Yf.safeParse(f);return A.success?A.data:"user"}function AA(f){let A=e(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 y0(f){return{id:f.id,conversationId:f.conversationId,role:z1(f.role),content:f.content,timestamp:f.timestamp,metadata:e(f.metadata)}}function h0(f){return pA.parse(f)}function v0(f){return lA.parse(f)}function j0(f){return async()=>{return z0(await f.getAppInfo())}}function b0(f,A){return{get:()=>h0(f.getIdentity()),getProfile:()=>v0(f.getProfile()),getAppInfo:A}}function g0(f,A){let $=f.getProfileKindRegistry();return{register:(Z)=>{$.register(A,Z)},getResolved:()=>$.getResolved(),getSelectedDefinition:()=>$.getSelectedDefinition()}}function C$(f){let A=f.getChannelRegistry();return{listDescriptors:()=>A.listDescriptors(),getDescriptor:($)=>A.getDescriptor($),getDeliveryProvider:($)=>A.getDeliveryProvider($)}}function I0(f,A){let $=f.getInboxRegistry();return{registerSource:(Z)=>{$.registerSource(A,Z)},listSources:()=>$.listSources(),getSource:(Z)=>$.getSource(Z)}}function u0(f,A){let $=f.getChannelRegistry();return{...C$(f),registerDescriptor:(Z)=>{$.registerDescriptor(A,Z)},registerDeliveryProvider:(Z)=>{$.registerDeliveryProvider(A,Z)}}}function c0(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(S0(M)){let Y=M,F=X,N=async(C)=>{let P=Y.schema.safeParse(C.payload);if(!P.success)return $.warn(`Invalid payload for channel ${Y.name}`,{error:P.error.message}),{noop:!0};let{payload:_,...q}=C;return F(P.data,q)};return V.subscribe(Y.name,N)}return V.subscribe(M,X)},subscribeExecution:(M,X)=>V.subscribe(M,X)}}function p0(f,A){let $=f.getJobQueueService();return{...f.jobs,enqueue:Y$($,A,!0),enqueueBatch:L$(f.jobs,A),registerHandler:F$($,A)}}function l0(f){let A=f.getPermissionService();return{assertEntityActionAllowed:($,Z,V)=>{A.assertEntityActionAllowed($,Z,V.userPermissionLevel)}}}function n0(f){return{get:async(A)=>{let Z=await f.getConversationService().getConversation(A);return Z?AA(Z):null},search:async(A)=>{return(await f.getConversationService().searchConversations(A)).map(AA)},list:async(A)=>{return(await f.getConversationService().listConversations(A)).map(AA)},getMessages:async(A,$)=>{return(await f.getConversationService().getMessages(A,$)).map(y0)},countMessages:async(A)=>{return f.getConversationService().countMessages(A)}}}function d0(f,A){return{registerHandler:($,Z)=>{f.registerEvalHandler(A,$,Z)}}}function i0(f){return{register:(A,$)=>{f.getInsightsRegistry().register(A,$)}}}function s0(f){return{has:(A)=>f.getPluginPackageName(A)!==void 0}}function a0(f,A){return{register:($)=>{f.registerEndpoint({...$,pluginId:A})}}}function r0(f,A){return{register:($)=>{f.registerInteraction({...$,pluginId:A})}}}function o0(f,A){return{registerWidget:async($)=>{await f.send({type:N$.registerWidget,payload:{...$,pluginId:A}})},unregisterWidget:async($)=>{await f.send({type:N$.unregisterWidget,payload:{pluginId:A,...$?{widgetId:$}:{}}})}}}function Hf(f,A,$){let Z=f.getEntityService(),V=f.getLogger().child(A),H=f.getDomain(),M=f.getLocalSiteUrl(),X=f.shouldPreferLocalUrls(),Y=f.getThemeCSS(),F=j0(f),N=f.getAttachmentRegistry(),C=f.getRuntimeUploadRegistry(),P=f.getRuntimeState(),_=$?.executionOnly===!0,q=c0(f,A,V,_);return{pluginId:A,executionOnly:_,logger:V,entityService:Z,semantic:{project:(E)=>Z.projectSemanticSpace(E)},identity:b0(f,F),profileKinds:g0(f,A),channels:C$(f),inbox:I0(f,A),appInfo:F,readiness:()=>f.getRuntimeReadiness(),judge:(E)=>f.judge(E),domain:H,siteUrl:H?`https://${H}`:void 0,localSiteUrl:M,previewUrl:H?`https://${t0(H)}`:void 0,preferLocalUrls:X,themeCSS:Y,entityDisplay:$?.entityDisplay,spaces:f.getSpaces(),permissions:l0(f),messaging:q,dashboard:o0(q,A),jobs:p0(f,A),attachments:N,uploads:C,runtimeState:P,recurringChecks:f.getRecurringChecks(A),conversations:n0(f),dataDir:f.getDataDir(),eval:_?{registerHandler:()=>{}}:d0(f,A),insights:_?{register:()=>{}}:i0(f),plugins:s0(f),endpoints:_?{register:()=>{}}:a0(f,A),interactions:_?{register:()=>{}}:r0(f,A)}}function y1(f){return f.replace(/:/g,"-")}function h1(f){return f.split(/[:.-]/).map((A)=>A.charAt(0).toUpperCase()+A.slice(1)).join(" ")}var G$=new Map;async function $A(f,A,$){let Z=G$.get(A);if(Z!==void 0)return Z;let V=y1(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 G$.set(A,M),M}try{let M=h1(A),X=K$($,{title:M,target:A});await f.createEntity({entity:{id:V,entityType:"prompt",content:X,metadata:{title:M,target:A,slug:V}}})}catch{}return G$.set(A,$),$}async function v1(f,A){let $=f.list().filter((Z)=>!!Z.basePrompt);return await Promise.all($.map((Z)=>$A(A,Z.name,Z.basePrompt))),$.length}function ZA(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 UA(f){return{resolve:(A,$)=>{return $A(f,A,$)}}}function VA(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 W$(f,A,$){let Z=Hf(f,A,$),V=f.getEntityService();return{...Z,entityService:V,entities:ZA(f),ai:VA(f),prompts:UA(V),permissions:Z.permissions}}function D$(f,A,$){let Z=Hf(f,A,$),V=f.getEntityService(),H=f.getRenderService(),M=f.getContentService(),X=f.getPermissionService();return{...Z,permissions:{...Z.permissions,getConfiguredPrincipalSeeds:()=>X.getConfiguredPrincipalSeeds(),replaceRuntimePrincipalState:(Y)=>X.replaceRuntimePrincipalState(Y)},entityService:V,entities:ZA(f),webRoutes:{getRoutes:()=>f.getPluginWebRoutes()},templates:{register:(Y,F)=>{f.registerTemplates(Y,F??A)},format:(Y,F)=>{return M.formatContent(Y,F,{pluginId:A})},parse:(Y,F)=>{return M.parseContent(Y,F,A)},resolve:async(Y,F)=>{return await M.resolveContent(Y,F,A)},getCapabilities:(Y)=>{let F=Y.includes(":")?Y:`${A}:${Y}`,N=f.getTemplate(F);if(!N)return null;let C=e0.getCapabilities(N);return{canGenerate:C.canGenerate,canFetch:C.canFetch,canRender:C.canRender,isStaticOnly:C.isStaticOnly}}},views:{get:(Y)=>{return H.get(Y)??void 0},list:()=>{return H.list()},hasRenderer:(Y,F="web")=>{return H.hasRenderer(Y,F)},getRenderer:(Y,F="web")=>{return H.getRenderer(Y,F)},validate:(Y,F)=>{return H.validate(Y,F)}},prompts:UA(V),ai:VA(f),registerInstructions:(Y)=>{f.registerInstructions(A,Y)}}}class fZ extends $f{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 j1=U.object({});class P$ extends $f{type="entity";entityActionPolicy;constructor(f,A,$,Z,V){super(f,A,$,Z);if(V!==void 0)this.entityActionPolicy=V}async register(f,A){let $=W$(f,this.id,A);this.context=$,this.setupMessageHandlers($);let Z=this.getProjectionRules($),V=this.getEntityTypeConfig(),H=Z.some((P)=>P.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!==P$.prototype.interceptCreate)$.entities.registerCreateInterceptor(this.entityType,(P,_)=>this.interceptCreate(P,_,$));let Y=this.createGenerationHandler($);if(Y)$.jobs.registerHandler(`${this.entityType}:generation`,Y);let F=this.getTemplates();if(F&&Object.keys(F).length>0)f.registerTemplates(F,this.id);let N=this.getDataSources();for(let P of N)$.entities.registerDataSource(P);await this.onRegister(this.context);let C=await this.getInstructions();return{tools:[],resources:[],...C&&{instructions:C},...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 b1({context:f,targetType:A,desired:$,getId:Z,toEntityInput:V,equals:H,deleteStale:M=!1,outputVisibility:X="public",concurrency:Y=1,logger:F}){let N=new Map;for(let z of $)N.set(Z(z),z);let C=(await f.entityService.listEntities({entityType:A,options:{filter:{visibilityScope:X}}})).filter((z)=>z.visibility===X),P=new Map(C.map((z)=>[z.id,z])),_=0,q=0,E=0,u=0,a=Math.max(1,Y);if(M){let z=C.filter((G)=>!N.has(G.id));await AZ(z,a,async(G)=>{await f.entityService.deleteEntity({entityType:A,id:G.id}),E++})}return await AZ(Array.from(N),a,async([z,G])=>{let B=P.get(z),W={...V(G,z),visibility:X};try{if(!B){await f.entityService.createEntity({entity:W}),_++;return}if(H?.(B,G)??!1){u++;return}await f.entityService.updateEntity({entity:{...B,...W,id:z,entityType:A,visibility:X}}),q++}catch(O){F?.error("Failed to reconcile entity",{targetType:A,id:z,error:S(O)})}}),{created:_,updated:q,deleted:E,skipped:u}}async function AZ(f,A,$){let Z=await K.runPromiseExit(K.forEach(f,(V)=>K.tryPromise({try:()=>$(V),catch:(H)=>H}),{concurrency:A,discard:!0}));if(I.isFailure(Z))throw HA.squash(Z.cause)}async function g1({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 I1({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 u1({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 $Z(f){return UZ(f)}function ZZ(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 VZ(f){return{chat:async(A,$,Z,V)=>{let H=ZZ(Z),M=V?await f.chat(A,$,H,V):await f.chat(A,$,H);return $Z(M)},confirmPendingAction:async(A,$,Z,V,H)=>{let M=ZZ(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 $Z(X)},invalidate:()=>{f.invalidateAgent()}}}function MA(f,A,$){let Z=Hf(f,A,$),V=f.getMCPService(),H=f.getPermissionService(),M=VZ(f.getAgentService());return{...Z,mcpTransport:V,agent:M,permissions:{...Z.permissions,getUserLevel:(X,Y,F)=>{return H.determineUserLevel(X,Y,F)},isAnchor:(X,Y)=>H.isAnchor(X,Y)},daemons:{register:(X,Y)=>{let F=`${A}:${X}`;f.registerDaemon(F,Y,A),Z.logger.debug(`Registered daemon: ${F}`)}},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()}},plugins:{has:(X)=>f.hasPlugin(X)}}}function R$(f,A,$){return{...MA(f,A,$),channels:u0(f,A)}}var c1=3600000;class XA extends $f{type="interface";daemon;jobTrackingEntries=new Map;jobTrackingTtlMs=c1;createContext(f,A){return MA(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 XZ=/^[a-z][a-z0-9-]*$/,p1=U.strictObject({source:U.string().min(1).max(500),flags:U.string().regex(/^[imu]*$/).optional()}),l1=U.strictObject({type:U.string().trim().regex(XZ),displayName:U.string().trim().min(1).max(100),subjectLabel:U.string().trim().min(1).max(100),subjectPattern:p1.optional(),manualDelivery:U.boolean().optional()});class YZ{descriptorRegistrations=new Map;providerRegistrations=new Map;activeDescriptors=new Map;activeProviders=new Map;finalized=!1;registerDescriptor(f,A){this.assertRegistrationOpen();let $=HZ(f),Z=l1.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 $=HZ(f),Z=_$(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(_$(f))}getDeliveryProvider(f){return this.assertFinalized(),this.activeProviders.get(_$(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 MZ("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 MZ("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 HZ(f){let A=f.trim();if(!A)throw Error("Channel registration plugin id is required");return A}function _$(f){let A=f.trim();if(!XZ.test(A))throw Error(`Invalid channel type: ${f}`);return A}function MZ(f,A,$){let Z=$.map((V)=>V.pluginId).sort().join(", ");return Error(`${f} "${A}" is registered by multiple plugins: ${Z}`)}var YA=/^[a-z][a-z0-9-]*$/,LZ=U.strictObject({id:U.string().trim().regex(YA),label:U.string().trim().min(1).max(100),confirm:U.boolean().optional()}),FZ=U.strictObject({entityType:U.string().trim().min(1).max(100),entityId:U.string().trim().min(1).max(300)}),CZ=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:FZ.optional(),actions:U.array(LZ).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)}}),NZ=U.array(CZ).max(1000),GZ=U.strictObject({permissionLevel:U.enum(["admin","trusted","public"])}),KZ=U.strictObject({sourceId:U.string().trim().regex(YA),displayName:U.string().trim().min(1).max(100)});class WZ{registrations=new Map;activeSources=new Map;finalized=!1;registerSource(f,A){this.assertRegistrationOpen();let $=i1(f),Z=KZ.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=n1(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(s1(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 n1(f,A){return Object.freeze({...f,list:async()=>{return NZ.parse(await A.list()).map(d1)},act:async($,Z,V)=>{let H=U.string().trim().min(1).max(300).parse($),M=U.string().trim().regex(YA).parse(Z);await A.act(H,M,GZ.parse(V))}})}function d1(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 i1(f){let A=f.trim();if(!A)throw Error("Inbox registration plugin id is required");return A}function s1(f){return U.string().trim().regex(YA).parse(f)}var a1={pluginsRegistered:"system:plugins:registered",initialSyncCompleted:"sync:initial:completed",shellReady:"system:shell:ready"};function r1(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 B${providers=new Map;static createFresh(){return new B$}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 o1,readdir as t1,readFile as DZ,rm as PZ,stat as e1,writeFile as RZ}from"fs/promises";import{basename as f8,dirname as A8,join as l}from"path";var LA=/^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,_Z=86400000,BZ=200;class Mf extends Error{code;constructor(f,A){super(A);this.code=f,this.name="RuntimeUploadStoreError"}}var $8=U.object({id:U.string().regex(LA),ref:U.object({kind:U.string().min(1),id:U.string().regex(LA)}),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 Z8(f){return{scoped:(A)=>f.scoped(A)}}function kZ(f){return f8(f)==="brain-data"?l(A8(f),"data"):f}class k${dataDir;constructor(f){this.dataDir=kZ(f.dataDir)}static createFresh(f){return new k$(f)}scoped(f){return new O$({...f,dataDir:this.dataDir})}}class O${options;retentionMs;maxCount;createUploadId;getNow;constructor(f){this.options=f,this.retentionMs=f.retentionMs??_Z,this.maxCount=f.maxCount??BZ,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 o1(Z,{recursive:!0}),await RZ(l(Z,"content"),f.content),await RZ(l(Z,"metadata.json"),`${JSON.stringify($,null,2)}
3
+ `,"utf8"),await this.prune(),$}async remove(f){this.assertValidUploadId(f),await PZ(this.getUploadDir(f),{recursive:!0,force:!0})}async read(f){let A=await this.readRecord(f);try{let $=await DZ(l(this.getUploadDir(f),"content"));return{record:A,content:$}}catch{throw new Mf("not_found","Upload not found")}}async readRecord(f){this.assertValidUploadId(f);try{let A=await DZ(l(this.getUploadDir(f),"metadata.json"),"utf8"),$=$8.safeParse(JSON.parse(A));if(!$.success||$.data.id!==f||$.data.ref.id!==f||$.data.ref.kind!==this.options.refKind)throw new Mf("invalid_metadata","Invalid upload metadata");return $.data}catch(A){if(A instanceof Mf)throw A;throw new Mf("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 t1(f),Z=(await Promise.all(A.map(async(M)=>{try{let X=await e1(l(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)=>PZ(l(f,M.entry),{recursive:!0,force:!0})))}catch{}}getUploadDir(f){return this.assertValidUploadId(f),l(this.getUploadsRoot(),f)}getUploadsRoot(){return l(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(!LA.test(f))throw new Mf("invalid_ref","Invalid upload ref")}}function w$(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 OZ(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 NA(f){return Object.fromEntries(Object.entries(f).filter(([,A])=>A!==void 0))}function wZ(f){let A={...f};return delete A.status,delete A.error,NA(A)}class qZ extends Of{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 $=OZ(f);if(typeof A!=="object")return A;let Z=w$(f);if(!$&&!Z)return A;return Object.assign(A,{...$&&{coverImage:$},...Z&&{entityId:Z}}),A}async process(f,A,$){try{await this.reportProgress($,{progress:FA.START,message:`Starting ${this.jobTypeName}`});let Z=await this.generate(f,$),V=w$(f),H=V?this.applyPreallocatedEntityId(V,Z):Z;await this.reportProgress($,{progress:FA.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:FA.COMPLETE,message:`${H.title??this.entityType} created successfully`}),{success:!0,entityId:M.entityId,...H.resultExtras}}catch(Z){if(Z instanceof J$)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),xZ.failure(Z)}}applyPreallocatedEntityId(f,A){let $={...A.metadata},Z=A.content,V=A.resultExtras;if(typeof $.slug==="string")$.slug=f,Z=CA(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 $=wZ(x$(f.content).frontmatter),Z=wZ(f.metadata),V=NA(A.metadata),H=x$(A.content),M=NA(H.frontmatter),X=NA({...$,...V,...M});return this.context.entities.getEffectiveFrontmatterSchema(this.entityType)?.parse(X),{content:QZ(X,H.content),metadata:{...Z,...V}}}async markPreallocatedStubFailed(f,A){let $=w$(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:CA(CA(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=OZ(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:JZ.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 J$(f)}}class J$ extends Error{constructor(f){super(f);this.name="GenerationFailure"}}function Q$(f,A){f.messaging.subscribe(kf.progress,async($)=>{try{let Z=of.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 q$(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
4
  ${f.message}`;return H}function T$(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 U8=U.enum(["tool:invoking","tool:completed","tool:failed"]),V8=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()}),H8=["tool:invoking","tool:completed","tool:failed"];function E$(f,A){for(let $ of H8)f.messaging.subscribe($,async(Z)=>{try{let V=U8.safeParse(Z.type),H=V8.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 m${scope;fibers;delayMs;clock;closePromise=null;closed=!1;constructor(f,A){this.delayMs=f,this.clock=A?.clock,this.scope=K.runSync(v.make()),this.fibers=K.runSync(v.extend(Vf.make(),this.scope))}schedule(f,A){if(this.closed)return;let $=K.sleep(this.delayMs).pipe(K.andThen(K.sync(A))),Z=this.clock?K.withClock($,this.clock):$,V=K.runFork(Z);Vf.unsafeSet(this.fibers,f,V)}close(){return this.closed=!0,this.closePromise??=K.runPromise(v.close(this.scope,u.void)),this.closePromise}}function xf(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 S$(f){return`${f.conversationId}:${f.toolName}`}function z$(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 TZ(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 EZ(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 mZ(f){let A=S$(f),$=z$(f.toolName),Z=TZ(f.state),V=EZ(f.state),H=`${V}: ${$}`;return{key:A,label:$,title:Z,fallbackPrefix:V,fallback:f.error?`${H}: ${f.error}`:H}}function SZ(f,A){return f.pendingConfirmations?.some(($)=>$.toolName===A)===!0||M8(f.cards).some(($)=>$.toolName===A)}function M8(f){return f?.filter((A)=>A.kind==="tool-approval"&&A.state==="approval-requested")??[]}var zZ=500,X8=500;class y${transport;cleanupSupervisor=new m$(X8);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(xf(f,"running"));return;case"tool:completed":if(this.isProcessingInput){this.pendingToolCompletions.set(this.getToolCompletionKey(f),f);return}await this.transport.handleToolStatusUpdate(xf(f,"completed"));return;case"tool:failed":this.pendingToolCompletions.delete(this.getToolCompletionKey(f)),await this.transport.handleToolStatusUpdate(xf(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=SZ(f,V.toolName)?"awaiting-approval":"completed";await this.transport.handleToolStatusUpdate(xf(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>=zZ)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<zZ)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 h$=1e5,Y8=[".md",".txt",".markdown"],L8=["text/plain","text/markdown","text/x-markdown"],F8=/https?:\/\/[^\s<>"{}|\\^`[\]]+?(?=[,;:\s]|$)/gi,C8=["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"],v$=U.object({captureUrls:U.boolean().default(!1),blockedUrlDomains:U.array(U.string()).default(C8)});function yZ(f,A){if(A&&L8.some(($)=>A.startsWith($)))return!0;return Y8.some(($)=>f.toLowerCase().endsWith($))}function hZ(f){return f<=h$}function vZ(f){if(f.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(f),!0}catch{return!1}}function jZ(f,A){return`User uploaded a file "${f}":
5
+ ${f.message}`;return Z}var U8=U.enum(["tool:invoking","tool:completed","tool:failed"]),V8=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()}),H8=["tool:invoking","tool:completed","tool:failed"];function E$(f,A){for(let $ of H8)f.messaging.subscribe($,async(Z)=>{try{let V=U8.safeParse(Z.type),H=V8.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 m${scope;fibers;delayMs;clock;closePromise=null;closed=!1;constructor(f,A){this.delayMs=f,this.clock=A?.clock,this.scope=K.runSync(v.make()),this.fibers=K.runSync(v.extend(Vf.make(),this.scope))}schedule(f,A){if(this.closed)return;let $=K.sleep(this.delayMs).pipe(K.andThen(K.sync(A))),Z=this.clock?K.withClock($,this.clock):$,V=K.runFork(Z);Vf.unsafeSet(this.fibers,f,V)}close(){return this.closed=!0,this.closePromise??=K.runPromise(v.close(this.scope,I.void)),this.closePromise}}function xf(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 S$(f){return`${f.conversationId}:${f.toolName}`}function z$(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 TZ(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 EZ(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 mZ(f){let A=S$(f),$=z$(f.toolName),Z=TZ(f.state),V=EZ(f.state),H=`${V}: ${$}`;return{key:A,label:$,title:Z,fallbackPrefix:V,fallback:f.error?`${H}: ${f.error}`:H}}function SZ(f,A){return f.pendingConfirmations?.some(($)=>$.toolName===A)===!0||M8(f.cards).some(($)=>$.toolName===A)}function M8(f){return f?.filter((A)=>A.kind==="tool-approval"&&A.state==="approval-requested")??[]}var zZ=500,X8=500;class y${transport;cleanupSupervisor=new m$(X8);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(xf(f,"running"));return;case"tool:completed":if(this.isProcessingInput){this.pendingToolCompletions.set(this.getToolCompletionKey(f),f);return}await this.transport.handleToolStatusUpdate(xf(f,"completed"));return;case"tool:failed":this.pendingToolCompletions.delete(this.getToolCompletionKey(f)),await this.transport.handleToolStatusUpdate(xf(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=SZ(f,V.toolName)?"awaiting-approval":"completed";await this.transport.handleToolStatusUpdate(xf(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>=zZ)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<zZ)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 h$=1e5,Y8=[".md",".txt",".markdown"],L8=["text/plain","text/markdown","text/x-markdown"],F8=/https?:\/\/[^\s<>"{}|\\^`[\]]+?(?=[,;:\s]|$)/gi,C8=["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"],v$=U.object({captureUrls:U.boolean().default(!1),blockedUrlDomains:U.array(U.string()).default(C8)});function yZ(f,A){if(A&&L8.some(($)=>A.startsWith($)))return!0;return Y8.some(($)=>f.toLowerCase().endsWith($))}function hZ(f){return f<=h$}function vZ(f){if(f.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(f),!0}catch{return!1}}function jZ(f,A){return`User uploaded a file "${f}":
6
6
 
7
- ${A}`}function bZ(f,A){let $=f.match(F8)??[];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 Nf(f,A){let $=f.attachment.source;if(($?.entityType==="document"||$?.entityType==="image")&&$.entityId)return{entityType:$.entityType,id:$.entityId};return j$(f.attachment.downloadUrl??f.attachment.url,A)}function j$(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 GA(f,A){let $=N8(A,f==="document"?/^application\/pdf$/i:/^image\/[a-z0-9.+-]+$/i);if(!$)return;if(f==="document"&&$.mimeType.toLowerCase()!=="application/pdf")return;return $}function KA(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 N8(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 wf({entityRef:f,userLevel:A,getEntity:$,getVisibleEntity:Z}){let V=b$(A),H=await Z(f,V);if(H)return{status:"visible",entity:H};return Boolean(await $(f))?{status:"denied"}:{status:"missing"}}function WA(f){return f==="admin"||f==="trusted"}async function gZ(f){let A=new Set;for(let $ of f.cards??[]){if($.kind!=="attachment")continue;let Z=Nf($,f.displayBaseUrl);if(!Z)continue;if((await wf({entityRef:Z,userLevel:f.userLevel,getEntity:f.getEntity,getVisibleEntity:f.getVisibleEntity})).status==="denied")A.add($.id)}return A}class g$ extends XA{createContext(f,A){return R$(f,this.id,A)}isUploadableTextFile(f,A){return yZ(f,A)}isFileSizeAllowed(f){return hZ(f)}formatFileUploadMessage(f,A){return jZ(f,A)}getMaxFileUploadBytes(){return h$}isLikelyTextContent(f){return vZ(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=Nf(V,f.displayBaseUrl);if(!H)continue;let M=await wf({entityRef:H,userLevel:f.userPermissionLevel,getEntity:(Y)=>Z.entityService.getEntity(Y),getVisibleEntity:(Y,F)=>Z.entityService.getEntity({...Y,visibilityScope:F})});if(M.status==="denied"){$.add(V.id);continue}if(M.status!=="visible")continue;if(!WA(f.userPermissionLevel))continue;if(typeof M.entity.content!=="string")continue;let X=GA(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??KA(M.entity.metadata,H.id,H.entityType,X.mimeType),mimeType:X.mimeType})}return{files:A,deniedCardIds:$}}extractCaptureableUrls(f,A){return bZ(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 y$({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),Q$(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})}}),E$(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 T$(f)}formatCompletionOutput(f){return q$(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 uZ(f){let A=pZ(f.status),$=IZ(f),Z=cZ(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 IZ(f){let A=f.metadata.operationType.replace(/_/g," ");return f.metadata.operationTarget?`${A}: ${f.metadata.operationTarget}`:A}function cZ(f){if(!f.progress||f.progress.total<=0)return;return`${f.progress.current}/${f.progress.total} (${f.progress.percentage}%)`}function pZ(f){switch(f){case"pending":return"Job queued";case"processing":return"Job processing";case"completed":return"Job completed";case"failed":return"Job failed"}}var G8=new Set(["yes","y","ok","sure","proceed","confirm","go"]),K8=new Set(["no","n","cancel","abort","stop","nope"]);function Gf(f){let A=f.toLowerCase().trim();if(A==="")return;if(G8.has(A))return{confirmed:!0};if(K8.has(A))return{confirmed:!1};return}function lZ(f){return f?.filter((A)=>A.kind==="tool-approval"&&A.state==="approval-requested")??[]}function nZ(f){return f?.find((A)=>A.kind==="tool-approval"&&(A.state==="output-available"||A.state==="output-error"||A.state==="output-denied"))}function dZ(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 iZ(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 aZ({message:f,approvalIds:A}){if(A.size===0)return{kind:"not-confirmation"};let $=u$(f,A);if(!$)return{kind:"notice",message:"Please reply with yes to confirm or no/cancel to abort."};if(!$.approvalId&&tZ(f))return{kind:"notice",message:`No matching pending approval id. Pending approval ids: ${sZ(A)}.`};if(A.size>1&&!$.approvalId)return{kind:"notice",message:`Multiple approvals are pending; include one approval id with yes or no/cancel: ${sZ(A)}.`};let Z=$.approvalId??W8(A);if(!Z)return{kind:"notice",message:"No pending approval to resolve."};return{kind:"confirm",approvalId:Z,confirmed:$.confirmed}}function u$(f,A){let $=Gf(f),Z=rZ(f,A);if($)return{...$,...Z?{approvalId:Z}:{}};let V=f.split(/\s+/).map((H)=>Gf(H)).find((H)=>H!==void 0);if(!V)return;return{...V,...Z?{approvalId:Z}:{}}}function rZ(f,A){if(!A||A.size===0)return;let $=f.toLowerCase();return[...A].sort((Z,V)=>V.length-Z.length).find((Z)=>oZ($,Z.toLowerCase()))}function oZ(f,A){let $=A.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^a-z0-9_-])${$}($|[^a-z0-9_-])`).test(f)}function tZ(f){return/(^|[^a-z0-9_-])approval[:-][a-z0-9_-]+/i.test(f)}function W8(f){for(let A of f)return A;return}function sZ(f){return[...f].join(", ")}var D8=U.object({kind:U.string().min(1),id:U.string().min(1)}),P8=U.object({kind:U.string().min(1),filename:U.string().min(1),mediaType:U.string().min(1),sizeBytes:U.number().nonnegative().optional(),source:D8.optional()}),R8=U.array(P8),o6=U.array(pf),_8=U.array(cf),B8=U.record(U.string(),U.unknown());function Qf(f){if(typeof f==="string")try{return Jf(JSON.parse(f))}catch{return null}return Jf(f)}function I$(f){let A=Qf(f),$=R8.safeParse(A?.attachments);return $.success?$.data:[]}function eZ(f){let $=Qf(f)?.cards;if(!Array.isArray($))return[];return $.map((Z)=>lf.safeParse(Z)).filter((Z)=>Z.success).map((Z)=>Z.data)}function DA(f,A){let $=[],Z=new Set;for(let V of f){let H=Jf(V);if(!H)continue;if(A.role&&H.role!==A.role)continue;for(let M of I$(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 PA(f){let A=new Set;for(let $ of f){let Z=Jf($);if(!Z)continue;let H=Qf(Z.metadata)?.cards;if(!Array.isArray(H))continue;let M=H.filter((Y)=>Jf(Y)?.kind==="tool-approval"),X=_8.safeParse(M);if(!X.success)continue;for(let Y of X.data)if(Y.state==="approval-requested")A.add(Y.id);else A.delete(Y.id)}return A}function Jf(f){let A=B8.safeParse(f);return A.success?A.data:null}class c${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 PA(A)}catch(A){return this.options.onRestoreError?.(A,f),new Set}}}var k8=U.record(U.string(),U.unknown());function fU(f){let A=k8.safeParse(f);return A.success?A.data:null}function RA(f,A){return fU(f)?.[A]}function l(f,A){let $=RA(f,A);return typeof $==="string"?$:void 0}function AU(f,A){let $=RA(f,A);return typeof $==="boolean"?$:void 0}function O8(f){return Array.isArray(f.toolResults)?f.toolResults[0]:void 0}function x8(f){if(!Array.isArray(f.cards))return;return f.cards.find((A)=>l(A,"kind")==="tool-approval")}function w8(f){return RA(f,"data")}function J8(f){let $=f.indexOf(`
7
+ ${A}`}function bZ(f,A){let $=f.match(F8)??[];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 Nf(f,A){let $=f.attachment.source;if(($?.entityType==="document"||$?.entityType==="image")&&$.entityId)return{entityType:$.entityType,id:$.entityId};return j$(f.attachment.downloadUrl??f.attachment.url,A)}function j$(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 GA(f,A){let $=N8(A,f==="document"?/^application\/pdf$/i:/^image\/[a-z0-9.+-]+$/i);if(!$)return;if(f==="document"&&$.mimeType.toLowerCase()!=="application/pdf")return;return $}function KA(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 N8(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 Jf({entityRef:f,userLevel:A,getEntity:$,getVisibleEntity:Z}){let V=b$(A),H=await Z(f,V);if(H)return{status:"visible",entity:H};return Boolean(await $(f))?{status:"denied"}:{status:"missing"}}function WA(f){return f==="admin"||f==="trusted"}async function gZ(f){let A=new Set;for(let $ of f.cards??[]){if($.kind!=="attachment")continue;let Z=Nf($,f.displayBaseUrl);if(!Z)continue;if((await Jf({entityRef:Z,userLevel:f.userLevel,getEntity:f.getEntity,getVisibleEntity:f.getVisibleEntity})).status==="denied")A.add($.id)}return A}class g$ extends XA{createContext(f,A){return R$(f,this.id,A)}isUploadableTextFile(f,A){return yZ(f,A)}isFileSizeAllowed(f){return hZ(f)}formatFileUploadMessage(f,A){return jZ(f,A)}getMaxFileUploadBytes(){return h$}isLikelyTextContent(f){return vZ(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=Nf(V,f.displayBaseUrl);if(!H)continue;let M=await Jf({entityRef:H,userLevel:f.userPermissionLevel,getEntity:(Y)=>Z.entityService.getEntity(Y),getVisibleEntity:(Y,F)=>Z.entityService.getEntity({...Y,visibilityScope:F})});if(M.status==="denied"){$.add(V.id);continue}if(M.status!=="visible")continue;if(!WA(f.userPermissionLevel))continue;if(typeof M.entity.content!=="string")continue;let X=GA(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??KA(M.entity.metadata,H.id,H.entityType,X.mimeType),mimeType:X.mimeType})}return{files:A,deniedCardIds:$}}extractCaptureableUrls(f,A){return bZ(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 y$({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),Q$(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})}}),E$(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 T$(f)}formatCompletionOutput(f){return q$(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 IZ(f){let A=pZ(f.status),$=uZ(f),Z=cZ(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 uZ(f){let A=f.metadata.operationType.replace(/_/g," ");return f.metadata.operationTarget?`${A}: ${f.metadata.operationTarget}`:A}function cZ(f){if(!f.progress||f.progress.total<=0)return;return`${f.progress.current}/${f.progress.total} (${f.progress.percentage}%)`}function pZ(f){switch(f){case"pending":return"Job queued";case"processing":return"Job processing";case"completed":return"Job completed";case"failed":return"Job failed"}}var G8=new Set(["yes","y","ok","sure","proceed","confirm","go"]),K8=new Set(["no","n","cancel","abort","stop","nope"]);function Gf(f){let A=f.toLowerCase().trim();if(A==="")return;if(G8.has(A))return{confirmed:!0};if(K8.has(A))return{confirmed:!1};return}function lZ(f){return f?.filter((A)=>A.kind==="tool-approval"&&A.state==="approval-requested")??[]}function nZ(f){return f?.find((A)=>A.kind==="tool-approval"&&(A.state==="output-available"||A.state==="output-error"||A.state==="output-denied"))}function dZ(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 iZ(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 aZ({message:f,approvalIds:A}){if(A.size===0)return{kind:"not-confirmation"};let $=I$(f,A);if(!$)return{kind:"notice",message:"Please reply with yes to confirm or no/cancel to abort."};if(!$.approvalId&&tZ(f))return{kind:"notice",message:`No matching pending approval id. Pending approval ids: ${sZ(A)}.`};if(A.size>1&&!$.approvalId)return{kind:"notice",message:`Multiple approvals are pending; include one approval id with yes or no/cancel: ${sZ(A)}.`};let Z=$.approvalId??W8(A);if(!Z)return{kind:"notice",message:"No pending approval to resolve."};return{kind:"confirm",approvalId:Z,confirmed:$.confirmed}}function I$(f,A){let $=Gf(f),Z=rZ(f,A);if($)return{...$,...Z?{approvalId:Z}:{}};let V=f.split(/\s+/).map((H)=>Gf(H)).find((H)=>H!==void 0);if(!V)return;return{...V,...Z?{approvalId:Z}:{}}}function rZ(f,A){if(!A||A.size===0)return;let $=f.toLowerCase();return[...A].sort((Z,V)=>V.length-Z.length).find((Z)=>oZ($,Z.toLowerCase()))}function oZ(f,A){let $=A.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^a-z0-9_-])${$}($|[^a-z0-9_-])`).test(f)}function tZ(f){return/(^|[^a-z0-9_-])approval[:-][a-z0-9_-]+/i.test(f)}function W8(f){for(let A of f)return A;return}function sZ(f){return[...f].join(", ")}var D8=U.object({kind:U.string().min(1),id:U.string().min(1)}),P8=U.object({kind:U.string().min(1),filename:U.string().min(1),mediaType:U.string().min(1),sizeBytes:U.number().nonnegative().optional(),source:D8.optional()}),R8=U.array(P8),o6=U.array(lf),_8=U.array(pf),B8=U.record(U.string(),U.unknown());function qf(f){if(typeof f==="string")try{return Qf(JSON.parse(f))}catch{return null}return Qf(f)}function u$(f){let A=qf(f),$=R8.safeParse(A?.attachments);return $.success?$.data:[]}function eZ(f){let $=qf(f)?.cards;if(!Array.isArray($))return[];return $.map((Z)=>nf.safeParse(Z)).filter((Z)=>Z.success).map((Z)=>Z.data)}function DA(f,A){let $=[],Z=new Set;for(let V of f){let H=Qf(V);if(!H)continue;if(A.role&&H.role!==A.role)continue;for(let M of u$(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 PA(f){let A=new Set;for(let $ of f){let Z=Qf($);if(!Z)continue;let H=qf(Z.metadata)?.cards;if(!Array.isArray(H))continue;let M=H.filter((Y)=>Qf(Y)?.kind==="tool-approval"),X=_8.safeParse(M);if(!X.success)continue;for(let Y of X.data)if(Y.state==="approval-requested")A.add(Y.id);else A.delete(Y.id)}return A}function Qf(f){let A=B8.safeParse(f);return A.success?A.data:null}class c${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 PA(A)}catch(A){return this.options.onRestoreError?.(A,f),new Set}}}var k8=U.record(U.string(),U.unknown());function fU(f){let A=k8.safeParse(f);return A.success?A.data:null}function RA(f,A){return fU(f)?.[A]}function n(f,A){let $=RA(f,A);return typeof $==="string"?$:void 0}function AU(f,A){let $=RA(f,A);return typeof $==="boolean"?$:void 0}function O8(f){return Array.isArray(f.toolResults)?f.toolResults[0]:void 0}function w8(f){if(!Array.isArray(f.cards))return;return f.cards.find((A)=>n(A,"kind")==="tool-approval")}function x8(f){return RA(f,"data")}function J8(f){let $=f.indexOf(`
9
9
 
10
- Result:`);if($===-1)return;let Z=f.slice($+9).trim();if(!Z)return;try{return JSON.parse(Z)}catch{return}}function Q8(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 _A(f,A){if(A==="declined")return{label:"Declined",variant:"declined"};let $=x8(f),Z=O8(f),V=Q8(l($,"toolName")??l(Z,"toolName")),H=RA($,"output")??w8(Z)??J8(f.text),M=l($,"state"),X=AU(H,"success"),Y=l($,"error")??l(H,"error")??l(H,"message");if(M==="output-error")return{label:`${V?`${V} failed`:"Action failed"}${Y?` \xB7 ${Y}`:""}`,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"}${Y?` \xB7 ${Y}`:""}`,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"}${Y?` \xB7 ${Y}`:""}`,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 $U(f){switch(f){case"success":return"Approval confirmed";case"declined":return"Approval declined";case"error":return"Action failed"}}function BA(f){if(typeof f==="string")return f;if(typeof f==="number"||typeof f==="boolean")return String(f);let A=fU(f);if(!A)return;let $=l(A,"error")??l(A,"message");if(AU(A,"success")===!1)return $?`Failed \xB7 ${$}`:"Failed";return}function p$(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(`
10
+ Result:`);if($===-1)return;let Z=f.slice($+9).trim();if(!Z)return;try{return JSON.parse(Z)}catch{return}}function Q8(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 _A(f,A){if(A==="declined")return{label:"Declined",variant:"declined"};let $=w8(f),Z=O8(f),V=Q8(n($,"toolName")??n(Z,"toolName")),H=RA($,"output")??x8(Z)??J8(f.text),M=n($,"state"),X=AU(H,"success"),Y=n($,"error")??n(H,"error")??n(H,"message");if(M==="output-error")return{label:`${V?`${V} failed`:"Action failed"}${Y?` \xB7 ${Y}`:""}`,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"}${Y?` \xB7 ${Y}`:""}`,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"}${Y?` \xB7 ${Y}`:""}`,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 $U(f){switch(f){case"success":return"Approval confirmed";case"declined":return"Approval declined";case"error":return"Action failed"}}function BA(f){if(typeof f==="string")return f;if(typeof f==="number"||typeof f==="boolean")return String(f);let A=fU(f);if(!A)return;let $=n(A,"error")??n(A,"message");if(AU(A,"success")===!1)return $?`Failed \xB7 ${$}`:"Failed";return}function p$(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
11
  `)}function ZU(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 p$(f)}function UU({response:f,confirmed:A,remainingApprovalHelp:$,deniedCardIds:Z,formatCard:V,formatPendingConfirmationHelp:H}){let M=_A(f,A?"approved":"declined"),X=f.pendingConfirmations&&f.pendingConfirmations.length>1?H(f.pendingConfirmations):void 0,Y=[M.label,...VU(f.cards,Z).map(V),X,$].filter(m8);return{variant:M.variant,parts:Y}}function VU(f,A){return(f??[]).filter(($)=>$.kind==="attachment"&&Boolean(A?.has($.id)))}function q8(f,A){return(f??[]).filter(($)=>$.kind==="attachment"&&!A?.has($.id))}function T8(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 HU(f,A){let $=f.pendingConfirmations??[],Z=[{kind:"text",text:f.text},...VU(f.cards,A.deniedCardIds).map((V)=>({kind:"denied-artifact",card:V})),...q8(f.cards,A.deniedCardIds).map((V)=>({kind:"artifact",card:V})),...T8(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:E8(f)}}function E8(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 m8(f){return Boolean(f?.trim())}function MU({disposition:f,filename:A}){return`${f}; filename="${S8(A)}"; filename*=UTF-8''${z8(A)}`}function S8(f){return f.replace(/[^\x20-\x7E]|["\\\r\n]/g,"_")}function z8(f){return encodeURIComponent(f).replace(/[!'()*]/g,(A)=>`%${A.charCodeAt(0).toString(16).toUpperCase()}`)}function kA(f){let A=XU(n$(f,"attachment"));if(!A)return null;let $=s(f,"jobId"),Z=s(f,"description"),V=s(A,"mediaType"),H=s(A,"filename"),M=l$(h8(A,"sizeBytes")),X=s(A,"url"),Y=s(A,"downloadUrl"),F=s(A,"previewUrl");return{...$!==void 0?{jobId:$}:{},title:s(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}:{},...Y!==void 0?{downloadUrl:Y}:{},...F!==void 0?{previewUrl:F}:{}}}function l$(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 y8=U.record(U.string(),U.unknown());function XU(f){let A=y8.safeParse(f);return A.success?A.data:null}function n$(f,A){return XU(f)?.[A]}function s(f,A){let $=n$(f,A);return typeof $==="string"?$:void 0}function h8(f,A){let $=n$(f,A);return typeof $==="number"?$:void 0}var LU="upload.txt";var FU=5000000,v8=[".md",".txt",".markdown"],j8=["text/plain","text/markdown","text/x-markdown"],d$=new Map([[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"],[".gif","image/gif"],[".pdf","application/pdf"]]),b8=new Set(d$.values());function xA(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 wA(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 qf(f,A){let $=A?.trim()??"",Z=$.split(";",1)[0]?.toLowerCase()??$;if(Z.length>0&&Z!=="application/octet-stream")return Z;let V=wA(f,void 0);if(V!=="application/octet-stream")return V;let H=f.toLowerCase();for(let[M,X]of d$)if(H.endsWith(M))return X;return"application/octet-stream"}function Tf(f,A){if(A&&j8.some(($)=>A.toLowerCase().startsWith($)))return!0;return v8.some(($)=>f.toLowerCase().endsWith($))}function JA(f){return f<=1e5}function QA(f){return f<=5000000}function qA(f,A){let $=qf(f,A);if(b8.has($))return!0;return d$.has(g8(f))}function CU(f,A){let $=qf(f,A);if(Tf(f,$))return"text";if(qA(f,$))return"file";return}function NU(f,A){if(A<=0)return!0;return f==="text"?JA(A):QA(A)}function i$(f){if(f.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(f),!0}catch{return!1}}function s$(f){let A=xA(f.filename,f.fallbackFilename),$=wA(A,f.mediaType);if(!Tf(A,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};if(!JA(f.content.byteLength))return{ok:!1,code:"file_too_large",message:`File upload too large: ${A}`};if(!i$(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 GU(f){let A=xA(f.filename,f.fallbackFilename),$=qf(A,f.mediaType);if(Tf(A,$)){let Z=s$({filename:A,mediaType:$,content:f.content,...f.fallbackFilename!==void 0&&{fallbackFilename:f.fallbackFilename}});return Z.ok?{...Z,kind:"text"}:Z}if(!qA(A,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};if(!QA(f.content.byteLength))return{ok:!1,code:"file_too_large",message:`File upload too large: ${A}`};if(!u8(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 g8(f){let A=f.lastIndexOf(".");return A>=0?f.slice(A).toLowerCase():""}function u8(f,A){switch(A){case"image/png":return YU(f,[137,80,78,71]);case"image/jpeg":return YU(f,[255,216,255]);case"image/gif":return OA(f,"GIF87a")||OA(f,"GIF89a");case"image/webp":return OA(f,"RIFF")&&KU(f,"WEBP",8);case"application/pdf":return OA(f,"%PDF-");default:return!1}}function YU(f,A){return A.every(($,Z)=>f[Z]===$)}function OA(f,A){return KU(f,A,0)}function KU(f,A,$){return Array.from(A).every((Z,V)=>f[$+V]===Z.charCodeAt(0))}class a${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=DA(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 WU(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function I8(f){return WU(f)&&f.kind==="upload"&&typeof f.id==="string"}function Ef(f){if(I8(f))return"uploaded file";if(Array.isArray(f))return f.map((A)=>Ef(A));if(!WU(f))return f;return TA(f)}function TA(f){return Object.fromEntries(Object.entries(f).map(([A,$])=>[A,Ef($)]))}function DU(f){if(f.kind!=="tool-approval")return f;return{...f,...f.input!==void 0?{input:TA(f.input)}:{},...f.output!==void 0?{output:Ef(f.output)}:{}}}function PU(f,A){if(f.kind==="attachment")return c8(f,A);if(f.kind==="tool-approval")return p8(f);if(f.kind==="sources")return l8(f,A);return n8(f,A)}function c8(f,A){if(A.deniedCardIds?.has(f.id))return"Artifact: Not available at your access level.";let $=kA(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(`
12
+ `)}return p$(f)}function UU({response:f,confirmed:A,remainingApprovalHelp:$,deniedCardIds:Z,formatCard:V,formatPendingConfirmationHelp:H}){let M=_A(f,A?"approved":"declined"),X=f.pendingConfirmations&&f.pendingConfirmations.length>1?H(f.pendingConfirmations):void 0,Y=[M.label,...VU(f.cards,Z).map(V),X,$].filter(m8);return{variant:M.variant,parts:Y}}function VU(f,A){return(f??[]).filter(($)=>$.kind==="attachment"&&Boolean(A?.has($.id)))}function q8(f,A){return(f??[]).filter(($)=>$.kind==="attachment"&&!A?.has($.id))}function T8(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 HU(f,A){let $=f.pendingConfirmations??[],Z=[{kind:"text",text:f.text},...VU(f.cards,A.deniedCardIds).map((V)=>({kind:"denied-artifact",card:V})),...q8(f.cards,A.deniedCardIds).map((V)=>({kind:"artifact",card:V})),...T8(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:E8(f)}}function E8(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 m8(f){return Boolean(f?.trim())}function MU({disposition:f,filename:A}){return`${f}; filename="${S8(A)}"; filename*=UTF-8''${z8(A)}`}function S8(f){return f.replace(/[^\x20-\x7E]|["\\\r\n]/g,"_")}function z8(f){return encodeURIComponent(f).replace(/[!'()*]/g,(A)=>`%${A.charCodeAt(0).toString(16).toUpperCase()}`)}function kA(f){let A=XU(n$(f,"attachment"));if(!A)return null;let $=s(f,"jobId"),Z=s(f,"description"),V=s(A,"mediaType"),H=s(A,"filename"),M=l$(h8(A,"sizeBytes")),X=s(A,"url"),Y=s(A,"downloadUrl"),F=s(A,"previewUrl");return{...$!==void 0?{jobId:$}:{},title:s(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}:{},...Y!==void 0?{downloadUrl:Y}:{},...F!==void 0?{previewUrl:F}:{}}}function l$(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 y8=U.record(U.string(),U.unknown());function XU(f){let A=y8.safeParse(f);return A.success?A.data:null}function n$(f,A){return XU(f)?.[A]}function s(f,A){let $=n$(f,A);return typeof $==="string"?$:void 0}function h8(f,A){let $=n$(f,A);return typeof $==="number"?$:void 0}var LU="upload.txt";var FU=5000000,v8=[".md",".txt",".markdown"],j8=["text/plain","text/markdown","text/x-markdown"],d$=new Map([[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"],[".gif","image/gif"],[".pdf","application/pdf"]]),b8=new Set(d$.values());function wA(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 xA(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 Tf(f,A){let $=A?.trim()??"",Z=$.split(";",1)[0]?.toLowerCase()??$;if(Z.length>0&&Z!=="application/octet-stream")return Z;let V=xA(f,void 0);if(V!=="application/octet-stream")return V;let H=f.toLowerCase();for(let[M,X]of d$)if(H.endsWith(M))return X;return"application/octet-stream"}function Ef(f,A){if(A&&j8.some(($)=>A.toLowerCase().startsWith($)))return!0;return v8.some(($)=>f.toLowerCase().endsWith($))}function JA(f){return f<=1e5}function QA(f){return f<=5000000}function qA(f,A){let $=Tf(f,A);if(b8.has($))return!0;return d$.has(g8(f))}function CU(f,A){let $=Tf(f,A);if(Ef(f,$))return"text";if(qA(f,$))return"file";return}function NU(f,A){if(A<=0)return!0;return f==="text"?JA(A):QA(A)}function i$(f){if(f.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(f),!0}catch{return!1}}function s$(f){let A=wA(f.filename,f.fallbackFilename),$=xA(A,f.mediaType);if(!Ef(A,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};if(!JA(f.content.byteLength))return{ok:!1,code:"file_too_large",message:`File upload too large: ${A}`};if(!i$(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 GU(f){let A=wA(f.filename,f.fallbackFilename),$=Tf(A,f.mediaType);if(Ef(A,$)){let Z=s$({filename:A,mediaType:$,content:f.content,...f.fallbackFilename!==void 0&&{fallbackFilename:f.fallbackFilename}});return Z.ok?{...Z,kind:"text"}:Z}if(!qA(A,$))return{ok:!1,code:"unsupported_type",message:`Unsupported file upload type: ${A}`};if(!QA(f.content.byteLength))return{ok:!1,code:"file_too_large",message:`File upload too large: ${A}`};if(!I8(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 g8(f){let A=f.lastIndexOf(".");return A>=0?f.slice(A).toLowerCase():""}function I8(f,A){switch(A){case"image/png":return YU(f,[137,80,78,71]);case"image/jpeg":return YU(f,[255,216,255]);case"image/gif":return OA(f,"GIF87a")||OA(f,"GIF89a");case"image/webp":return OA(f,"RIFF")&&KU(f,"WEBP",8);case"application/pdf":return OA(f,"%PDF-");default:return!1}}function YU(f,A){return A.every(($,Z)=>f[Z]===$)}function OA(f,A){return KU(f,A,0)}function KU(f,A,$){return Array.from(A).every((Z,V)=>f[$+V]===Z.charCodeAt(0))}class a${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=DA(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 WU(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function u8(f){return WU(f)&&f.kind==="upload"&&typeof f.id==="string"}function mf(f){if(u8(f))return"uploaded file";if(Array.isArray(f))return f.map((A)=>mf(A));if(!WU(f))return f;return TA(f)}function TA(f){return Object.fromEntries(Object.entries(f).map(([A,$])=>[A,mf($)]))}function DU(f){if(f.kind!=="tool-approval")return f;return{...f,...f.input!==void 0?{input:TA(f.input)}:{},...f.output!==void 0?{output:mf(f.output)}:{}}}function PU(f,A){if(f.kind==="attachment")return c8(f,A);if(f.kind==="tool-approval")return p8(f);if(f.kind==="sources")return l8(f,A);return n8(f,A)}function c8(f,A){if(A.deniedCardIds?.has(f.id))return"Artifact: Not available at your access level.";let $=kA(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
13
  `)}function p8(f){let A=[`Approval: ${f.summary||f.toolName}`];if(A.push(`Status: ${f.state}`),f.preview)A.push(f.preview);let $=BA(f.output);if($)A.push(`Result: ${$}`);if(f.error)A.push(`Error: ${f.error}`);return A.join(`
14
14
  `)}function l8(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
15
  `)}function n8(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
16
  `)}function RU(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:d8(f.isBot)}:{}}}function d8(f){if(typeof f==="boolean")return f;return f.toLowerCase()==="true"}function _U(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 BU(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(i8),"","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 i8(f){let A=f.text.trim(),$=f.authorName?.trim();return $?`- ${$}: ${A}`:`- ${A}`}async function $V(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 Y=U.object({title:U.string().max(80).describe("A short, unique title (2-6 words)")}),{object:F}=await H.ai.generateObject(`The title "${$}" is already taken. ${V}`,Y),N=F.title;return H.logger.debug(`AI suggested new title: "${N}"`),N}class EA{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 ZV="current";class kU{store;schema;createEmpty;key;queue=new EA;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??ZV}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))}}function UV(f,A={}){return new Response(JSON.stringify(f),{status:A.status??200,headers:{"Content-Type":"application/json; charset=utf-8",...A.headers}})}var r$="cms:register-workspace";var VV=U.object({workspaceUrl:U.string()});async function HV(f,A){let $=await f.messaging.send({type:r$,payload:A});if(!("success"in $)||!$.success)return;let Z=VV.safeParse($.data);return Z.success?Z.data.workspaceUrl:void 0}var o$=mf.extend({id:U.literal("brain-character"),entityType:U.literal("brain-character")}),mA=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 OU=U.record(U.string(),U.unknown());class SA extends Sf{constructor(){super({entityType:"brain-character",purpose:"The brain's own identity, character, and purpose (singleton).",schema:o$,frontmatterSchema:mA,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("",OU.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("",OU.parse(A))}}class zA extends yA{adapter=new SA;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 zA(f,A,$)}constructor(f,A,$){super(f,A,"brain-character",$??zA.getDefaultCharacter(),zf("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 t$=mf.extend({id:U.literal("anchor-profile"),entityType:U.literal("anchor-profile")}),xU=U.enum(["person","team","organization"]),Xf=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 MV=U.record(U.string(),U.unknown());class hA extends Sf{constructor(){super({entityType:"anchor-profile",purpose:"The profile of the brain's Anchor (singleton).",schema:t$,frontmatterSchema:Xf,isSingleton:!0,hasBody:!0})}createProfileContent(f){let A=Xf.parse(f);return this.buildMarkdown("",A)}parseProfileBody(f,A){if(A){let{metadata:$,content:Z}=Of(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("",MV.parse(A))}}class yf extends yA{adapter=new hA;static getDefaultProfile(){return{name:"Unknown"}}static createFresh(f,A,$){return new yf(f,A,$)}constructor(f,A,$){super(f,A,"anchor-profile",$??yf.getDefaultProfile(),zf("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 vA=U.enum(["person","team","organization"]),XV=U.object({kind:U.string().trim().min(1),category:vA,labels:U.object({singular:U.string().trim().min(1),plural:U.string().trim().min(1)})});function YV(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 wU{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 $=XV.parse(A);YV(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 JU=30000;class f0{logger;resolver;links=[];actorIndex=new Map;negativeActorIndex=new Map;static createFresh(f,A){return new f0(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=e$(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 $=e$(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()+JU),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()+JU}),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 QU="https://rizom.ai/ext/anchor-profile/v1",qU=U.looseObject({id:U.string(),description:U.string(),name:U.string().optional(),tags:U.array(U.string()).optional().default([])}),TU=Xf.extend({kind:U.string().trim().min(1).optional(),category:vA.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"})}),LV=U.looseObject({uri:U.string(),params:U.record(U.string(),U.unknown()).optional()}),EU=U.looseObject({name:U.string(),url:U.string(),description:U.string().optional(),skills:U.array(qU).optional().default([]),capabilities:U.looseObject({extensions:U.array(LV).optional().default([])}).optional()});function FV(f){let A=EU.safeParse(f);if(!A.success)return null;let $=A.data,V=($.capabilities?.extensions??[]).find((M)=>M.uri===QU),H=null;if(V?.params){let M=TU.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 CV=U.object({name:U.string(),description:U.string(),tags:U.array(U.string()),examples:U.array(U.string())});import{EventEmitter as zU}from"events";var T={REGISTERED:"registered",INITIALIZED:"initialized",ERROR:"error",DISABLED:"disabled"},I={REGISTERED:"plugin:registered",BEFORE_INITIALIZE:"plugin:before_initialize",INITIALIZED:"plugin:initialized",ERROR:"plugin:error",DISABLED:"plugin:disabled"};class c extends Error{pluginId;constructor(f,A){super(`Plugin ${f}: ${A}`);this.name="PluginError",this.pluginId=f}}class A0{scope;ingress=new Set;closePromise=null;closed=!1;constructor(){this.scope=K.runSync(v.make())}addFinalizer(f){if(this.closed)throw Error("Cannot register a resource after plugin teardown");K.runSync(v.addFinalizer(this.scope,K.promise(async()=>{await f()})))}addIngress(f){if(this.closed)throw Error("Cannot register ingress after plugin teardown");this.ingress.add(f)}close(f=u.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(Y){if(!$)A=Y;$=!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 K.runPromiseExit(v.close(this.scope,f));if(!$&&u.isFailure(M))A=HA.squash(M.cause),$=!0;if($)throw A}}function mU(f,A){let $=f.getMessageBus(),Z=new Set,V={send:(G)=>$.send(G),subscribe:(G,_,D)=>{let O=!0,y=new Set,Q=(uA)=>{if(!O)return{noop:!0};let V0,H0=new Promise((r)=>{V0=r});y.add(H0);let IA=()=>{y.delete(H0),V0()},M0;try{M0=Promise.resolve(_(uA))}catch(r){throw IA(),r}return M0.then((r)=>{return IA(),r},(r)=>{throw IA(),r})},gA=$.subscribe(G,Q,D),Kf={type:G,originalHandler:_,stopAdmission:()=>{if(!O)return;O=!1,gA(),Z.delete(Kf)}};Z.add(Kf);try{A.addIngress({stopAdmission:Kf.stopAdmission,drain:async()=>{await Promise.all(y)}})}catch(uA){throw Kf.stopAdmission(),uA}return Kf.stopAdmission},unsubscribe:(G,_)=>{let D=[...Z].filter((O)=>O.type===G&&O.originalHandler===_);if(D.length===0){$.unsubscribe(G,_);return}for(let O of D)O.stopAdmission()}},H=f.getAttachmentRegistry(),M={...H,register:(G,_,D)=>{let O=!0,y=H.register(G,_,D),Q=()=>{if(!O)return;O=!1,y()};return A.addFinalizer(Q),Q}},X=f.getEntityRegistry(),Y=new Proxy(X,{get(G,_){let D=Reflect.get(G,_,G);if(_==="registerEntityType"&&typeof D==="function")return(...O)=>{let y=Reflect.apply(D,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterEntityType(Q));return y};return typeof D==="function"?D.bind(G):D}}),F=f.getProfileKindRegistry(),N=new Proxy(F,{get(G,_){let D=Reflect.get(G,_,G);if(_==="register"&&typeof D==="function")return(...O)=>{let y=Reflect.apply(D,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterPlugin(Q));return y};return typeof D==="function"?D.bind(G):D}}),C=f.getChannelRegistry(),W=new Proxy(C,{get(G,_){let D=Reflect.get(G,_,G);if((_==="registerDescriptor"||_==="registerDeliveryProvider")&&typeof D==="function")return(...O)=>{let y=Reflect.apply(D,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterPlugin(Q));return y};return typeof D==="function"?D.bind(G):D}}),k=f.getInboxRegistry(),E=new Proxy(k,{get(G,_){let D=Reflect.get(G,_,G);if(_==="registerSource"&&typeof D==="function")return(...O)=>{let y=Reflect.apply(D,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterPlugin(Q));return y};return typeof D==="function"?D.bind(G):D}}),q=f.getDataSourceRegistry(),n=new Proxy(q,{get(G,_){let D=Reflect.get(G,_,G);if(_==="register"&&typeof D==="function")return(...O)=>{let y=Reflect.apply(D,G,O),Q=O[0];if(typeof Q==="object"&&Q!==null&&"id"in Q&&typeof Q.id==="string"){let gA=Q.id.includes(":")?Q.id:`shell:${Q.id}`;A.addFinalizer(()=>G.unregister(gA))}return y};return typeof D==="function"?D.bind(G):D}}),a=f.getInsightsRegistry(),z=new Proxy(a,{get(G,_){let D=Reflect.get(G,_,G);if(_==="register"&&typeof D==="function")return(...O)=>{let y=Reflect.apply(D,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregister(Q));return y};return typeof D==="function"?D.bind(G):D}});return new Proxy(f,{get(G,_){if(_==="getMessageBus")return()=>V;if(_==="getAttachmentRegistry")return()=>M;if(_==="getEntityRegistry")return()=>Y;if(_==="getDataSourceRegistry")return()=>n;if(_==="getProfileKindRegistry")return()=>N;if(_==="getChannelRegistry")return()=>W;if(_==="getInboxRegistry")return()=>E;if(_==="getInsightsRegistry")return()=>z;let D=Reflect.get(G,_,G);return typeof D==="function"?D.bind(G):D}})}class $0{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 c(f,"Registration failed: Plugin is not registered");let V=Z.plugin,H=new A0;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(I.BEFORE_INITIALIZE,f,V);let M=await V.register(mU(A,H),$);return Z.status=T.INITIALIZED,this.logger.debug(`Initialized plugin: ${f}`),this.events.emit(I.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 c(f,"Registration finalization failed: Plugin is not registered");if(A.status!==T.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 c(f,"Ready failed: Plugin is not registered");if(A.status!==T.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=Cf($);A.status=T.ERROR,A.error=Z;try{this.events.emit(I.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!==T.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!==T.ERROR,V=Cf(A);if($.status=T.ERROR,$.error=V,await this.releasePluginResources(f,u.fail(A)),Z)try{this.events.emit(I.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===T.DISABLED)return;this.logger.debug(`Disabling plugin: ${f}`);let $=A.status===T.ERROR;await this.releasePluginResources(f,u.void);let Z=this.plugins.get(f);if(!$&&Z&&Z.status!==T.DISABLED)Z.status=T.DISABLED,this.events.emit(I.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 Z0{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(F){let N=S(F);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 Y=this.getUnmetDependencies(X);this.logger.error(`Plugin ${X} has unmet dependencies: ${Y.join(", ")}`);let F=this.plugins.get(X);if(F)F.status=T.ERROR,F.error=new c(X,`Unmet dependencies: ${Y.join(", ")}`);this.events.emit(I.ERROR,X,F?.error)}}let H=new Set;for(let[M,X]of this.plugins)if(X.status===T.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!==T.INITIALIZED)Z.push(V)}return Z}}class U0{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 jA{projections=new Map;rules=new Map;static createFresh(){return new jA}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=WV(A,Z),H=PV(A,V)[0];if(H){let M=RV(H,V);throw Error(`Projection cycle is not supported: ${[...M,M[0]].join(" -> ")}`)}return GV({projections:A,edges:V,unknownSourceTypes:NV(A,$)})}}function NV(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 GV(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 WV(f,A){let $=new Map;for(let Z of f)for(let V of f){let H=DV(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 DV(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 PV(f,A){let $=f.map(({id:C})=>C).sort(),Z=SU($,A),V=new Map,H=new Map,M=[],X=new Set,Y=[],F=0,N=(C)=>{V.set(C,F),H.set(C,F),F++,M.push(C),X.add(C);for(let q of Z.get(C)??[])if(!V.has(q))N(q),H.set(C,Math.min(H.get(C)??0,H.get(q)??0));else if(X.has(q))H.set(C,Math.min(H.get(C)??0,V.get(q)??0));if(H.get(C)!==V.get(C))return;let W=[],k;do{if(k=M.pop(),!k)break;X.delete(k),W.push(k)}while(k!==C);let E=Z.get(C)?.includes(C)??!1;if(W.length>1||E)Y.push(W.sort())};for(let C of $)if(!V.has(C))N(C);return Y.sort((C,W)=>(C[0]??"").localeCompare(W[0]??""))}function RV(f,A){let $=new Set(f),Z=SU(f,A),V=[...f].sort()[0];if(!V)return[];if(Z.get(V)?.includes(V))return[V];let H=(M,X)=>{for(let Y of Z.get(M)??[]){if(!$.has(Y))continue;if(Y===V)return X;if(X.includes(Y))continue;let F=H(Y,[...X,Y]);if(F)return F}return};return H(V,[V])??[...f].sort()}function SU(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 yU(f){let $=(await K.runPromise(K.all(f.map((Z)=>K.either(K.tryPromise({try:Z,catch:(V)=>V}))),{concurrency:"unbounded"}))).find(hU.isLeft);if($)throw $.left}class bA{plugins=new Map;logger;events=new zU;daemonRegistry;shell=null;initializedPluginIds=[];pluginLifecycle;dependencyResolver;capabilityRegistrar;projectionRegistry=jA.createFresh();projectionGraph;static createFresh(f,A){return new bA(f,A)}setShell(f){this.shell=f}constructor(f,A){this.logger=f.child("PluginManager"),this.events=new zU,this.daemonRegistry=A,this.pluginLifecycle=new $0(this.plugins,this.events,this.daemonRegistry,this.projectionRegistry,f),this.dependencyResolver=new Z0(this.plugins,this.events,f),this.capabilityRegistrar=new U0(f,this.projectionRegistry)}registerPlugin(f){if(!f.id)throw new c("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 c(f.id,`Registration failed: Plugin is already registered with version ${V}`)}let A=f.dependencies??[],$={plugin:f,status:T.REGISTERED,dependencies:A};this.plugins.set(f.id,$),this.logger.debug(`Registered plugin: ${f.id} (${f.version})`),this.events.emit(I.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 c(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 yU(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.readyPlugin(f)))}catch(f){for(let A of this.initializedPluginIds){let $=this.plugins.get(A);if($?.status===T.ERROR)await this.pluginLifecycle.failPluginInitialization(A,$.error??f)}throw f}}async startPluginDaemons(){this.logger.debug("Starting plugin daemons..."),await yU(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===T.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===T.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{i as cc,sf as dc,rf as ec,L as fc,x as gc,Ff as hc,V$ as ic,H$ as jc,M$ as kc,X$ as lc,kf as mc,Y$ as nc,L$ as oc,F$ as pc,J as qc,h as rc,t as sc,e as tc,N0 as uc,G0 as vc,lU as wc,uf as xc,vU as yc,jU as zc,pA as Ac,lA as Bc,$A as Cc,v1 as Dc,VA as Ec,fZ as Fc,j1 as Gc,P$ as Hc,dA as Ic,b1 as Jc,uU as Kc,g1 as Lc,u1 as Mc,I1 as Nc,XA as Oc,YZ as Pc,CZ as Qc,NZ as Rc,KZ as Sc,WZ as Tc,a1 as Uc,r1 as Vc,B$ as Wc,LA as Xc,Mf as Yc,Z8 as Zc,k$ as _c,nf as $c,df as ad,C1 as bd,qZ as cd,M1 as dd,K1 as ed,O0 as fd,x0 as gd,w0 as hd,W1 as id,S$ as jd,z$ as kd,mZ as ld,Nf as md,GA as nd,KA as od,wf as pd,WA as qd,gZ as rd,g$ as sd,uZ as td,Gf as ud,lZ as vd,nZ as wd,dZ as xd,iZ as yd,aZ as zd,u$ as Ad,I$ as Bd,eZ as Cd,c$ as Dd,_A as Ed,$U as Fd,BA as Gd,p$ as Hd,ZU as Id,UU as Jd,HU as Kd,MU as Ld,kA as Md,LU as Nd,FU as Od,xA as Pd,qf as Qd,Tf as Rd,CU as Sd,NU as Td,GU as Ud,a$ as Vd,Ef as Wd,DU as Xd,PU as Yd,RU as Zd,_U as _d,BU as $d,$V as ae,kU as be,UV as ce,r$ as de,HV as ee,mA as fe,SA as ge,zA as he,xU as ie,Xf as je,hA as ke,yf as le,wU as me,f0 as ne,QU as oe,FV as pe,CV as qe,c as re,bA as se};
17
+ `),metadata:{supersededMessageCount:f.skippedMessages.length,supersededMessageIds:f.skippedMessages.map((Z)=>Z.id).filter((Z)=>Z!==void 0)}}}function i8(f){let A=f.text.trim(),$=f.authorName?.trim();return $?`- ${$}: ${A}`:`- ${A}`}async function $V(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 Y=U.object({title:U.string().max(80).describe("A short, unique title (2-6 words)")}),{object:F}=await H.ai.generateObject(`The title "${$}" is already taken. ${V}`,Y),N=F.title;return H.logger.debug(`AI suggested new title: "${N}"`),N}class EA{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 ZV="current";class kU{store;schema;createEmpty;key;queue=new EA;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??ZV}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))}}function UV(f,A={}){return new Response(JSON.stringify(f),{status:A.status??200,headers:{"Content-Type":"application/json; charset=utf-8",...A.headers}})}var r$="cms:register-workspace";var VV=U.object({workspaceUrl:U.string()});async function HV(f,A){let $=await f.messaging.send({type:r$,payload:A});if(!("success"in $)||!$.success)return;let Z=VV.safeParse($.data);return Z.success?Z.data.workspaceUrl:void 0}var o$=Sf.extend({id:U.literal("brain-character"),entityType:U.literal("brain-character")}),mA=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 OU=U.record(U.string(),U.unknown());class SA extends zf{constructor(){super({entityType:"brain-character",purpose:"The brain's own identity, character, and purpose (singleton).",schema:o$,frontmatterSchema:mA,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("",OU.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("",OU.parse(A))}}class zA extends yA{adapter=new SA;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 zA(f,A,$)}constructor(f,A,$){super(f,A,"brain-character",$??zA.getDefaultCharacter(),yf("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 t$=Sf.extend({id:U.literal("anchor-profile"),entityType:U.literal("anchor-profile")}),wU=U.enum(["person","team","organization"]),Xf=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 MV=U.record(U.string(),U.unknown());class hA extends zf{constructor(){super({entityType:"anchor-profile",purpose:"The profile of the brain's Anchor (singleton).",schema:t$,frontmatterSchema:Xf,isSingleton:!0,hasBody:!0})}createProfileContent(f){let A=Xf.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("",MV.parse(A))}}class hf extends yA{adapter=new hA;static getDefaultProfile(){return{name:"Unknown"}}static createFresh(f,A,$){return new hf(f,A,$)}constructor(f,A,$){super(f,A,"anchor-profile",$??hf.getDefaultProfile(),yf("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 vA=U.enum(["person","team","organization"]),XV=U.object({kind:U.string().trim().min(1),category:vA,labels:U.object({singular:U.string().trim().min(1),plural:U.string().trim().min(1)})});function YV(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 xU{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 $=XV.parse(A);YV(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 JU=30000;class f0{logger;resolver;links=[];actorIndex=new Map;negativeActorIndex=new Map;static createFresh(f,A){return new f0(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=e$(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 $=e$(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()+JU),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()+JU}),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 QU="https://rizom.ai/ext/anchor-profile/v1",qU=U.looseObject({id:U.string(),description:U.string(),name:U.string().optional(),tags:U.array(U.string()).optional().default([])}),TU=Xf.extend({kind:U.string().trim().min(1).optional(),category:vA.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"})}),LV=U.looseObject({uri:U.string(),params:U.record(U.string(),U.unknown()).optional()}),EU=U.looseObject({name:U.string(),url:U.string(),description:U.string().optional(),skills:U.array(qU).optional().default([]),capabilities:U.looseObject({extensions:U.array(LV).optional().default([])}).optional()});function FV(f){let A=EU.safeParse(f);if(!A.success)return null;let $=A.data,V=($.capabilities?.extensions??[]).find((M)=>M.uri===QU),H=null;if(V?.params){let M=TU.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 CV=U.object({name:U.string(),description:U.string(),tags:U.array(U.string()),examples:U.array(U.string())});import{EventEmitter as zU}from"events";var T={REGISTERED:"registered",INITIALIZED:"initialized",ERROR:"error",DISABLED:"disabled"},c={REGISTERED:"plugin:registered",BEFORE_INITIALIZE:"plugin:before_initialize",INITIALIZED:"plugin:initialized",ERROR:"plugin:error",DISABLED:"plugin:disabled"};class p extends Error{pluginId;constructor(f,A){super(`Plugin ${f}: ${A}`);this.name="PluginError",this.pluginId=f}}class A0{scope;ingress=new Set;closePromise=null;closed=!1;constructor(){this.scope=K.runSync(v.make())}addFinalizer(f){if(this.closed)throw Error("Cannot register a resource after plugin teardown");K.runSync(v.addFinalizer(this.scope,K.promise(async()=>{await f()})))}addIngress(f){if(this.closed)throw Error("Cannot register ingress after plugin teardown");this.ingress.add(f)}close(f=I.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(Y){if(!$)A=Y;$=!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 K.runPromiseExit(v.close(this.scope,f));if(!$&&I.isFailure(M))A=HA.squash(M.cause),$=!0;if($)throw A}}function mU(f,A){let $=f.getMessageBus(),Z=new Set,V={send:(G)=>$.send(G),subscribe:(G,B,W)=>{let O=!0,y=new Set,Q=(IA)=>{if(!O)return{noop:!0};let V0,H0=new Promise((r)=>{V0=r});y.add(H0);let uA=()=>{y.delete(H0),V0()},M0;try{M0=Promise.resolve(B(IA))}catch(r){throw uA(),r}return M0.then((r)=>{return uA(),r},(r)=>{throw uA(),r})},gA=$.subscribe(G,Q,W),Kf={type:G,originalHandler:B,stopAdmission:()=>{if(!O)return;O=!1,gA(),Z.delete(Kf)}};Z.add(Kf);try{A.addIngress({stopAdmission:Kf.stopAdmission,drain:async()=>{await Promise.all(y)}})}catch(IA){throw Kf.stopAdmission(),IA}return Kf.stopAdmission},unsubscribe:(G,B)=>{let W=[...Z].filter((O)=>O.type===G&&O.originalHandler===B);if(W.length===0){$.unsubscribe(G,B);return}for(let O of W)O.stopAdmission()}},H=f.getAttachmentRegistry(),M={...H,register:(G,B,W)=>{let O=!0,y=H.register(G,B,W),Q=()=>{if(!O)return;O=!1,y()};return A.addFinalizer(Q),Q}},X=f.getEntityRegistry(),Y=new Proxy(X,{get(G,B){let W=Reflect.get(G,B,G);if(B==="registerEntityType"&&typeof W==="function")return(...O)=>{let y=Reflect.apply(W,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterEntityType(Q));return y};return typeof W==="function"?W.bind(G):W}}),F=f.getProfileKindRegistry(),N=new Proxy(F,{get(G,B){let W=Reflect.get(G,B,G);if(B==="register"&&typeof W==="function")return(...O)=>{let y=Reflect.apply(W,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterPlugin(Q));return y};return typeof W==="function"?W.bind(G):W}}),C=f.getChannelRegistry(),P=new Proxy(C,{get(G,B){let W=Reflect.get(G,B,G);if((B==="registerDescriptor"||B==="registerDeliveryProvider")&&typeof W==="function")return(...O)=>{let y=Reflect.apply(W,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterPlugin(Q));return y};return typeof W==="function"?W.bind(G):W}}),_=f.getInboxRegistry(),q=new Proxy(_,{get(G,B){let W=Reflect.get(G,B,G);if(B==="registerSource"&&typeof W==="function")return(...O)=>{let y=Reflect.apply(W,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregisterPlugin(Q));return y};return typeof W==="function"?W.bind(G):W}}),E=f.getDataSourceRegistry(),u=new Proxy(E,{get(G,B){let W=Reflect.get(G,B,G);if(B==="register"&&typeof W==="function")return(...O)=>{let y=Reflect.apply(W,G,O),Q=O[0];if(typeof Q==="object"&&Q!==null&&"id"in Q&&typeof Q.id==="string"){let gA=Q.id.includes(":")?Q.id:`shell:${Q.id}`;A.addFinalizer(()=>G.unregister(gA))}return y};return typeof W==="function"?W.bind(G):W}}),a=f.getInsightsRegistry(),z=new Proxy(a,{get(G,B){let W=Reflect.get(G,B,G);if(B==="register"&&typeof W==="function")return(...O)=>{let y=Reflect.apply(W,G,O),Q=O[0];if(typeof Q==="string")A.addFinalizer(()=>G.unregister(Q));return y};return typeof W==="function"?W.bind(G):W}});return new Proxy(f,{get(G,B){if(B==="getMessageBus")return()=>V;if(B==="getAttachmentRegistry")return()=>M;if(B==="getEntityRegistry")return()=>Y;if(B==="getDataSourceRegistry")return()=>u;if(B==="getProfileKindRegistry")return()=>N;if(B==="getChannelRegistry")return()=>P;if(B==="getInboxRegistry")return()=>q;if(B==="getInsightsRegistry")return()=>z;let W=Reflect.get(G,B,G);return typeof W==="function"?W.bind(G):W}})}class $0{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 p(f,"Registration failed: Plugin is not registered");let V=Z.plugin,H=new A0;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(c.BEFORE_INITIALIZE,f,V);let M=await V.register(mU(A,H),$);return Z.status=T.INITIALIZED,this.logger.debug(`Initialized plugin: ${f}`),this.events.emit(c.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 p(f,"Registration finalization failed: Plugin is not registered");if(A.status!==T.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 p(f,"Ready failed: Plugin is not registered");if(A.status!==T.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=Cf($);A.status=T.ERROR,A.error=Z;try{this.events.emit(c.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!==T.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!==T.ERROR,V=Cf(A);if($.status=T.ERROR,$.error=V,await this.releasePluginResources(f,I.fail(A)),Z)try{this.events.emit(c.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===T.DISABLED)return;this.logger.debug(`Disabling plugin: ${f}`);let $=A.status===T.ERROR;await this.releasePluginResources(f,I.void);let Z=this.plugins.get(f);if(!$&&Z&&Z.status!==T.DISABLED)Z.status=T.DISABLED,this.events.emit(c.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 Z0{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(F){let N=S(F);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 Y=this.getUnmetDependencies(X);this.logger.error(`Plugin ${X} has unmet dependencies: ${Y.join(", ")}`);let F=this.plugins.get(X);if(F)F.status=T.ERROR,F.error=new p(X,`Unmet dependencies: ${Y.join(", ")}`);this.events.emit(c.ERROR,X,F?.error)}}let H=new Set;for(let[M,X]of this.plugins)if(X.status===T.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!==T.INITIALIZED)Z.push(V)}return Z}}class U0{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 jA{projections=new Map;rules=new Map;static createFresh(){return new jA}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=WV(A,Z),H=PV(A,V)[0];if(H){let M=RV(H,V);throw Error(`Projection cycle is not supported: ${[...M,M[0]].join(" -> ")}`)}return GV({projections:A,edges:V,unknownSourceTypes:NV(A,$)})}}function NV(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 GV(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 WV(f,A){let $=new Map;for(let Z of f)for(let V of f){let H=DV(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 DV(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 PV(f,A){let $=f.map(({id:C})=>C).sort(),Z=SU($,A),V=new Map,H=new Map,M=[],X=new Set,Y=[],F=0,N=(C)=>{V.set(C,F),H.set(C,F),F++,M.push(C),X.add(C);for(let E of Z.get(C)??[])if(!V.has(E))N(E),H.set(C,Math.min(H.get(C)??0,H.get(E)??0));else if(X.has(E))H.set(C,Math.min(H.get(C)??0,V.get(E)??0));if(H.get(C)!==V.get(C))return;let P=[],_;do{if(_=M.pop(),!_)break;X.delete(_),P.push(_)}while(_!==C);let q=Z.get(C)?.includes(C)??!1;if(P.length>1||q)Y.push(P.sort())};for(let C of $)if(!V.has(C))N(C);return Y.sort((C,P)=>(C[0]??"").localeCompare(P[0]??""))}function RV(f,A){let $=new Set(f),Z=SU(f,A),V=[...f].sort()[0];if(!V)return[];if(Z.get(V)?.includes(V))return[V];let H=(M,X)=>{for(let Y of Z.get(M)??[]){if(!$.has(Y))continue;if(Y===V)return X;if(X.includes(Y))continue;let F=H(Y,[...X,Y]);if(F)return F}return};return H(V,[V])??[...f].sort()}function SU(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 yU(f){let $=(await K.runPromise(K.all(f.map((Z)=>K.either(K.tryPromise({try:Z,catch:(V)=>V}))),{concurrency:"unbounded"}))).find(hU.isLeft);if($)throw $.left}class bA{plugins=new Map;logger;events=new zU;daemonRegistry;shell=null;initializedPluginIds=[];pluginLifecycle;dependencyResolver;capabilityRegistrar;projectionRegistry=jA.createFresh();projectionGraph;static createFresh(f,A){return new bA(f,A)}setShell(f){this.shell=f}constructor(f,A){this.logger=f.child("PluginManager"),this.events=new zU,this.daemonRegistry=A,this.pluginLifecycle=new $0(this.plugins,this.events,this.daemonRegistry,this.projectionRegistry,f),this.dependencyResolver=new Z0(this.plugins,this.events,f),this.capabilityRegistrar=new U0(f,this.projectionRegistry)}registerPlugin(f){if(!f.id)throw new p("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 p(f.id,`Registration failed: Plugin is already registered with version ${V}`)}let A=f.dependencies??[],$={plugin:f,status:T.REGISTERED,dependencies:A};this.plugins.set(f.id,$),this.logger.debug(`Registered plugin: ${f.id} (${f.version})`),this.events.emit(c.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 p(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 yU(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.readyPlugin(f)))}catch(f){for(let A of this.initializedPluginIds){let $=this.plugins.get(A);if($?.status===T.ERROR)await this.pluginLifecycle.failPluginInitialization(A,$.error??f)}throw f}}async startPluginDaemons(){this.logger.debug("Starting plugin daemons..."),await yU(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===T.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===T.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{i as cc,af as dc,of as ec,L as fc,w as gc,Ff as hc,V$ as ic,H$ as jc,M$ as kc,X$ as lc,Of as mc,Y$ as nc,L$ as oc,F$ as pc,J as qc,h as rc,t as sc,e as tc,N0 as uc,G0 as vc,lU as wc,uf as xc,vU as yc,jU as zc,pA as Ac,lA as Bc,$A as Cc,v1 as Dc,VA as Ec,fZ as Fc,j1 as Gc,P$ as Hc,dA as Ic,b1 as Jc,IU as Kc,g1 as Lc,I1 as Mc,u1 as Nc,XA as Oc,YZ as Pc,CZ as Qc,NZ as Rc,KZ as Sc,WZ as Tc,a1 as Uc,r1 as Vc,B$ as Wc,LA as Xc,Mf as Yc,Z8 as Zc,k$ as _c,df as $c,sf as ad,C1 as bd,qZ as cd,M1 as dd,K1 as ed,O0 as fd,w0 as gd,x0 as hd,W1 as id,S$ as jd,z$ as kd,mZ as ld,Nf as md,GA as nd,KA as od,Jf as pd,WA as qd,gZ as rd,g$ as sd,IZ as td,Gf as ud,lZ as vd,nZ as wd,dZ as xd,iZ as yd,aZ as zd,I$ as Ad,u$ as Bd,eZ as Cd,c$ as Dd,_A as Ed,$U as Fd,BA as Gd,p$ as Hd,ZU as Id,UU as Jd,HU as Kd,MU as Ld,kA as Md,LU as Nd,FU as Od,wA as Pd,Tf as Qd,Ef as Rd,CU as Sd,NU as Td,GU as Ud,a$ as Vd,mf as Wd,DU as Xd,PU as Yd,RU as Zd,_U as _d,BU as $d,$V as ae,kU as be,UV as ce,r$ as de,HV as ee,mA as fe,SA as ge,zA as he,wU as ie,Xf as je,hA as ke,hf as le,xU as me,f0 as ne,QU as oe,FV as pe,CV as qe,p as re,bA as se};
18
18
 
19
- //# debugId=9F653E89DFC0BF7064756E2164756E21
20
- //# sourceMappingURL=index-6b3x594d.js.map
19
+ //# debugId=515521FE0558F68864756E2164756E21
20
+ //# sourceMappingURL=index-7ytt9vvj.js.map