@rizom/brain 0.2.0-alpha.235 → 0.2.0-alpha.237

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 (28) hide show
  1. package/dist/brain.js +1177 -1312
  2. package/dist/chunks/{blog-post-adapter-0fc8yd1s.js → blog-post-adapter-vt71whj1.js} +2 -2
  3. package/dist/chunks/{index-er159j9b.js → index-51pqwxdb.js} +2 -2
  4. package/dist/chunks/index-atsf9t9d.js +6 -0
  5. package/dist/chunks/{index-kvac8t2y.js.map → index-atsf9t9d.js.map} +5 -4
  6. package/dist/chunks/index-zc6br876.js +10 -0
  7. package/dist/chunks/{index-a4q0aknf.js.map → index-zc6br876.js.map} +8 -8
  8. package/dist/chunks/{rss-datasource-gfgpmvf3.js → rss-datasource-9j87n822.js} +2 -2
  9. package/dist/index.js +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/migrations/auth-service/0009_wild_namor.sql +44 -0
  12. package/dist/migrations/auth-service/0010_mixed_red_skull.sql +23 -0
  13. package/dist/migrations/auth-service/meta/0009_snapshot.json +1824 -0
  14. package/dist/migrations/auth-service/meta/0010_snapshot.json +1820 -0
  15. package/dist/migrations/auth-service/meta/_journal.json +14 -0
  16. package/dist/plugins.d.ts +48 -3
  17. package/dist/plugins.js +3 -3
  18. package/dist/plugins.js.map +4 -4
  19. package/dist/site.js +6 -6
  20. package/dist/site.js.map +1 -1
  21. package/dist/ui/admin-app.js +102 -102
  22. package/dist/ui/admin-app.js.map +10 -10
  23. package/package.json +1 -1
  24. package/dist/chunks/index-a4q0aknf.js +0 -10
  25. package/dist/chunks/index-kvac8t2y.js +0 -6
  26. /package/dist/chunks/{blog-post-adapter-0fc8yd1s.js.map → blog-post-adapter-vt71whj1.js.map} +0 -0
  27. /package/dist/chunks/{index-er159j9b.js.map → index-51pqwxdb.js.map} +0 -0
  28. /package/dist/chunks/{rss-datasource-gfgpmvf3.js.map → rss-datasource-9j87n822.js.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rizom/brain",
3
- "version": "0.2.0-alpha.235",
3
+ "version": "0.2.0-alpha.237",
4
4
  "description": "Brain runtime + CLI — scaffold, run, and manage AI brain instances",
5
5
  "keywords": [
6
6
  "brain",
@@ -1,10 +0,0 @@
1
- // @bun
2
- import{B,D as v,E as k,F as m,G as _,H as D,I as q,M as z,N as f,O as N,P as g,Q as OA,V as tZ,W as eZ}from"./index-72d2a6vf.js";import{oa as oZ,pa as d}from"./index-8hmmeype.js";import{ya as JA}from"./index-8ej1r6tb.js";import{Ja as WA,Ka as L,La as CZ,Ma as yZ,Pa as Q,Qa as HA,Ra as XZ,Ta as e,Wa as E}from"./index-b6k44k1d.js";import{_a as A}from"./index-q5r12b3s.js";var z$=A.object({id:A.string(),sessionId:A.string(),interfaceType:A.string(),channelId:A.string(),personId:A.string().optional(),channelName:A.string().optional(),startedAt:A.string(),lastActiveAt:A.string(),createdAt:A.string(),updatedAt:A.string(),metadata:d}),y$=A.object({id:A.string(),conversationId:A.string(),role:Q,content:A.string(),timestamp:A.string(),metadata:d});var RZ=A.object({name:A.string(),role:A.string(),purpose:A.string(),values:A.array(A.string())}),wZ=A.object({name:A.string(),organization:A.string().optional(),description:A.string().optional(),avatar:A.string().optional(),website:A.string().optional(),email:A.string().optional(),socialLinks:A.array(A.object({platform:A.enum(["github","instagram","linkedin","email","website"]),url:A.string(),label:A.string().optional()})).optional()});import{createClient as u$}from"@libsql/client";class NZ{constructor(Z,$){this.name=Z,this.unique=$}static[m]="SQLiteIndexBuilderOn";on(...Z){return new _Z(this.name,Z,this.unique)}}class _Z{static[m]="SQLiteIndexBuilder";config;constructor(Z,$,H){this.config={name:Z,columns:$,unique:H,where:void 0}}where(Z){return this.config.where=Z,this}build(Z){return new LZ(this.config,Z)}}class LZ{static[m]="SQLiteIndex";config;constructor(Z,$){this.config={...Z,table:$}}}function w(Z){return new NZ(Z,!1)}var h=q("conversations",{id:D("id").primaryKey(),sessionId:D("session_id").notNull(),interfaceType:D("interface_type").notNull(),channelId:D("channel_id").notNull(),personId:D("person_id"),started:D("started").notNull(),lastActive:D("last_active").notNull(),metadata:D("metadata"),created:D("created").notNull(),updated:D("updated").notNull()},(Z)=>({sessionIdx:w("idx_conversations_session").on(Z.sessionId),channelIdx:w("idx_conversations_channel").on(Z.channelId),personIdx:w("idx_conversations_person").on(Z.personId),interfaceSessionIdx:w("idx_conversations_interface_session").on(Z.interfaceType,Z.sessionId),interfaceChannelIdx:w("idx_conversations_interface_channel").on(Z.interfaceType,Z.channelId)})),OZ=q("messages",{id:D("id").primaryKey(),conversationId:D("conversation_id").notNull().references(()=>h.id,{onDelete:"cascade"}),role:D("role").notNull(),content:D("content").notNull(),timestamp:D("timestamp").notNull(),metadata:D("metadata")},(Z)=>({conversationIdx:w("idx_messages_conversation").on(Z.conversationId),timestampIdx:w("idx_messages_timestamp").on(Z.timestamp)})),BZ=q("summary_tracking",{conversationId:D("conversation_id").primaryKey().references(()=>h.id,{onDelete:"cascade"}),lastSummarizedAt:D("last_summarized_at"),lastMessageId:D("last_message_id"),messagesSinceSummary:_("messages_since_summary").default(0),updated:D("updated").notNull()});var SA=A.preprocess((Z)=>{if(typeof Z!=="string")return Z;try{return JSON.parse(Z)}catch{return}},A.record(A.string(),A.unknown())).catch({});function S(Z){return SA.parse(Z)}var j=A.object({identity:L,interfaceType:A.string(),role:Q,displayName:A.string().optional(),username:A.string().optional(),isBot:A.boolean().optional()}),xA=A.preprocess(zA,j);function zA(Z){if(!mA(Z)||"identity"in Z)return Z;let{actorId:$,interfaceType:H,role:X}=Z;if(typeof $!=="string"||typeof H!=="string"||X!=="user"&&X!=="assistant")return Z;let{userId:Y,canonicalId:P}=Z;return{identity:CZ({actorId:$,interfaceType:H,role:X,...typeof Y==="string"?{userId:Y}:{},...typeof P==="string"?{canonicalId:P}:{}}),interfaceType:H,role:X,...typeof Z.displayName==="string"?{displayName:Z.displayName}:{},...typeof Z.username==="string"?{username:Z.username}:{},...typeof Z.isBot==="boolean"?{isBot:Z.isBot}:{}}}var I=A.object({messageId:A.string().optional(),channelId:A.string().optional(),channelName:A.string().optional(),threadId:A.string().optional(),metadata:A.record(A.string(),A.unknown()).optional()}),yA=A.looseObject({actor:xA.optional(),source:I.optional()});function mA(Z){return typeof Z==="object"&&Z!==null&&!Array.isArray(Z)}var hA=A.object({id:A.string(),conversationId:A.string(),role:A.string(),content:A.string(),timestamp:A.string(),metadata:A.string().nullable()}),jA=A.object({conversationId:A.string(),messageCount:A.number(),messages:A.array(hA),windowStart:A.number(),windowEnd:A.number(),windowSize:A.number(),timestamp:A.string()});var MZ=A.object({kind:A.string().min(1),id:A.string().min(1)}),gA=A.object({kind:A.literal("text"),filename:A.string().min(1),mediaType:A.string().min(1),content:A.string(),sizeBytes:A.number().nonnegative().optional(),source:MZ.optional()}),bA=A.custom((Z)=>Z instanceof Uint8Array),pA=A.object({kind:A.literal("file"),filename:A.string().min(1),mediaType:A.string().min(1),data:bA,sizeBytes:A.number().nonnegative().optional(),source:MZ.optional()}),uA=A.discriminatedUnion("kind",[gA,pA]),S1=A.object({userPermissionLevel:A.enum(["admin","trusted","public"]).optional(),isAnchor:A.boolean().optional(),interfaceType:A.string().optional(),channelId:A.string().optional(),channelName:A.string().optional(),actor:j.optional(),source:I.optional(),attachments:A.array(uA).optional()});var cA=A.object({status:A.enum(["healthy","warning","error","unknown"]),message:A.string().optional(),lastCheck:A.date().optional(),details:A.record(A.string(),A.unknown()).optional()}),QZ=A.object({name:A.string(),pluginId:A.string(),status:A.string(),health:cA.optional()});import{McpServer as a1,ResourceTemplate as s1}from"@modelcontextprotocol/sdk/server/mcp.js";var qZ=A.object({interfaceType:A.string(),actor:L,displayName:A.string().optional(),conversationId:A.string().optional(),channelId:A.string().optional(),channelName:A.string().optional(),runId:A.string().optional(),toolCallId:A.string().optional(),userPermissionLevel:A.enum(["admin","trusted","public"]).optional(),isAnchor:A.boolean().optional()}),kZ=A.strictObject({success:A.literal(!0),data:A.unknown().optional(),message:A.string().optional(),cached:A.literal(!0).optional()}),EZ=A.strictObject({success:A.literal(!1),error:A.string(),code:A.string().optional()}),JZ=A.strictObject({needsConfirmation:A.literal(!0),toolName:A.string(),summary:A.string(),completionSummary:A.string().optional(),preview:A.string().optional(),args:A.unknown()}),l=A.union([kZ,EZ,JZ]);var b1=A.union([A.looseObject({success:A.literal(!0)}),A.object({success:A.literal(!1),error:A.string()})]);var dA=A.union([A.object({success:A.literal(!0),data:A.unknown(),message:A.string().optional()}),A.object({success:A.literal(!1),error:A.string(),code:A.string().optional()})]);var b4=A.object({id:A.string(),type:A.string(),version:A.string(),status:A.string()}),p4=A.object({name:A.string(),description:A.string()}),fZ=A.enum(["admin","trusted","public"]),i=A.object({label:A.string(),url:A.string(),pluginId:A.string(),priority:A.number().default(100),visibility:fZ.default("public")}),lA=A.enum(["human","agent","admin","protocol"]),iA=A.enum(["available","coming-soon","disabled"]),n=A.object({id:A.string(),label:A.string(),description:A.string().optional(),href:A.string(),kind:lA,pluginId:A.string(),priority:A.number().default(100),visibility:fZ.default("public"),status:iA.default("available")}),r=A.object({entityType:A.string(),count:A.number()}),u4=A.object({model:A.string(),version:A.string(),uptime:A.number(),entities:A.number(),entityCounts:A.array(r),embeddings:A.number(),ai:A.object({model:A.string(),embeddingModel:A.string()}),daemons:A.array(QZ),endpoints:A.array(i),interactions:A.array(n)});var c4=A.object({id:A.string(),version:A.string(),type:A.enum(["core","entity","service","interface"]),description:A.string().optional(),dependencies:A.array(A.string()).optional(),packageName:A.string()});var nA=A.object({status:A.enum(["healthy","warning","error","unknown"]),message:A.string().optional(),lastCheck:A.string().optional(),details:A.record(A.string(),A.unknown()).optional()}),rA=A.object({name:A.string(),pluginId:A.string(),status:A.string(),health:nA.optional()}),r4=A.object({model:A.string(),version:A.string(),uptime:A.number(),entities:A.number(),entityCounts:A.array(r),embeddings:A.number(),ai:A.object({model:A.string(),embeddingModel:A.string()}),daemons:A.array(rA),endpoints:A.array(i),interactions:A.array(n)});var o4=A.object({enabled:A.boolean().describe("Whether the plugin is enabled"),debug:A.boolean().describe("Enable debug logging for this plugin")});class a extends Error{pluginId;issues;constructor(Z,$){super(`Invalid plugin config for ${Z}`);this.name="PluginConfigValidationError",this.pluginId=Z,this.issues=$}}var s=A.enum(["file_operations","content_operations","data_processing","batch_processing"]),aA=A.object({pluginId:A.string().optional(),progressToken:A.union([A.string(),A.number()]).optional(),operationType:s,operationTarget:A.string().optional(),interfaceType:A.string().optional(),conversationId:A.string().optional(),channelId:A.string().optional(),requestedByActor:L.optional(),requestedByUserId:A.string().optional(),requestedByInterface:A.string().optional(),silent:A.boolean().optional()}),J=A.object({pluginId:A.string().optional(),progressToken:A.union([A.string(),A.number()]).optional(),operationType:s,operationTarget:A.string().optional(),interfaceType:A.string().optional(),conversationId:A.string().optional(),channelId:A.string().optional(),requestedByActor:L.optional(),requestedByUserId:A.string().optional(),requestedByInterface:A.string().optional(),silent:A.boolean().optional(),rootJobId:A.string()}),A6=A.enum(["none","skip","replace","coalesce"]);var o=A.enum(["pending","processing","completed","failed"]),TZ=A.enum(["completed","failed"]);var sA=A.object({id:A.string(),type:A.string(),status:o,data:A.unknown(),result:A.unknown().optional(),lastError:A.string().optional().nullable(),attempts:A.number(),maxRetries:A.number(),priority:A.number(),createdAt:A.date(),updatedAt:A.date(),processedAt:A.date().optional().nullable(),completedAt:A.date().optional().nullable(),failedAt:A.date().optional().nullable()}),oA=A.object({jobId:A.string(),type:A.string(),status:TZ,result:A.unknown().optional(),error:A.string().optional()}),SZ=A.object({success:A.literal(!1),error:A.string().optional()}),t=A.object({id:A.string(),type:A.enum(["job","batch"]),status:o,message:A.string().optional(),progress:A.object({current:A.number(),total:A.number(),percentage:A.number()}).optional(),aggregationKey:A.string().optional(),batchDetails:A.object({totalOperations:A.number(),completedOperations:A.number(),failedOperations:A.number(),currentOperation:A.string().optional(),errors:A.array(A.string()).optional()}).optional(),jobDetails:A.object({jobType:A.string(),priority:A.number(),retryCount:A.number()}).optional(),metadata:J});var tA=A.record(A.string(),A.unknown());class xZ{logger;schema;jobTypeName;constructor(Z,$){this.logger=Z,this.schema=$.schema,this.jobTypeName=$.jobTypeName}validateAndParse(Z){if(!this.schema)throw Error(`${this.jobTypeName}: No schema provided. Override validateAndParse() or provide a schema.`);let $=this.schema.safeParse(Z);if(!$.success)return this.logger.warn(`Invalid ${this.jobTypeName} job data`,{data:Z,validationError:$.error.issues}),null;return this.logger.debug(`${this.jobTypeName} job data validation successful`,{data:this.summarizeDataForLog($.data)}),$.data}async onError(Z,$,H,X){this.logger.error(`${this.jobTypeName} job error handler triggered`,{jobId:H,errorMessage:Z.message,errorStack:Z.stack,data:this.summarizeDataForLog($)})}async reportProgress(Z,$){await Z.report({progress:$.progress,total:$.total??100,message:$.message})}summarizeDataForLog(Z){let $=tA.safeParse(Z);return $.success?$.data:{}}}import{createClient as F6}from"@libsql/client";var zZ=q("job_queue",{id:D("id").primaryKey().$defaultFn(()=>k()),type:D("type").notNull(),data:D("data").notNull(),result:D("result",{mode:"json"}),source:D("source"),metadata:D("metadata",{mode:"json"}).$type().notNull(),status:D("status",{enum:["pending","processing","completed","failed"]}).notNull().default("pending"),priority:_("priority").notNull().default(0),retryCount:_("retryCount").notNull().default(0),maxRetries:_("maxRetries").notNull().default(3),lastError:D("lastError"),createdAt:_("createdAt").notNull().$defaultFn(()=>Date.now()),scheduledFor:_("scheduledFor").notNull().$defaultFn(()=>Date.now()),startedAt:_("startedAt"),completedAt:_("completedAt")},(Z)=>({queueReadyIdx:w("idx_job_queue_ready").on(Z.status,Z.priority,Z.scheduledFor),jobTypeIdx:w("idx_job_queue_type").on(Z.type,Z.status),jobSourceIdx:w("idx_job_queue_source").on(Z.source)}));var C6=A.looseObject({deduplicationKey:A.string().optional()});class C{callback;heartbeatInterval;constructor(Z){this.callback=Z}static from(Z){if(!Z)return;return new C(Z)}createSub(Z){let{scale:$}=Z??{};if($){let{start:H,end:X}=$,Y=X-H;return new C(async(P)=>{let K=H+P.progress/(P.total??100)*Y;await this.callback({...P,progress:K,total:100})})}return new C(this.callback)}async report(Z){await this.callback(Z)}startHeartbeat(Z,$=5000){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.report({message:Z,progress:0}).catch(()=>{})},$)}stopHeartbeat(){if(this.heartbeatInterval)clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0}toCallback(){return this.callback}}var o6=A.preprocess((Z)=>{if(typeof Z!=="string")return Z;return JSON.parse(Z)},A.record(A.string(),A.unknown()));var A$=A.object({id:A.string(),type:A.string(),data:A.string(),status:A.enum(["pending","processing","completed","failed"]),source:A.string().nullable(),priority:A.number(),retryCount:A.number(),maxRetries:A.number(),lastError:A.string().nullable(),createdAt:A.number(),scheduledFor:A.number(),startedAt:A.number().nullable(),completedAt:A.number().nullable(),metadata:J,result:A.unknown().nullable().optional()});function ZZ(Z,$,H){return async(X)=>{let{type:Y,data:P,toolContext:K=null,options:G}=X,W=K?yZ(K):void 0,{metadata:V,...F}=G??{},U={operationType:"data_processing",pluginId:$,...V,...K&&{interfaceType:K.interfaceType,conversationId:K.conversationId,channelId:K.channelId,requestedByActor:K.actor,...W?{requestedByUserId:W}:{},requestedByInterface:K.interfaceType}};if(K&&!W)delete U.requestedByUserId;let O={...F,source:$,...G?.rootJobId&&{rootJobId:G.rootJobId},metadata:U},R=H&&!Y.includes(":")?`${$}:${Y}`:Y;return Z.enqueue({type:R,data:P,options:O})}}function AZ(Z,$){return async(H,X)=>{let Y=k(),P=H.map((G)=>({...G,type:G.type.includes(":")?G.type:`${$}:${G.type}`})),K={...X,source:$,rootJobId:Y,metadata:{...X?.metadata,operationType:"batch_processing",pluginId:$}};return await Z.enqueueBatch(P,K,Y,$),Y}}function $Z(Z,$){return(H,X)=>{let Y=H.includes(":")?H:`${$}:${H}`;Z.registerHandler(Y,X,$)}}var $$=A.custom((Z)=>typeof Z==="object"&&Z!==null&&("safeParse"in Z)),H$=A.object({name:A.string(),schema:$$});function mZ(Z){return H$.safeParse(Z).success}function X$(Z){if(!Z)return;return{status:Z.status,message:Z.message,lastCheck:Z.lastCheck?.toISOString(),details:Z.details}}function hZ(Z){return{model:Z.model,version:Z.version,uptime:Z.uptime,entities:Z.entities,entityCounts:Z.entityCounts,embeddings:Z.embeddings,ai:Z.ai,daemons:Z.daemons.map(($)=>({name:$.name,pluginId:$.pluginId,status:$.status,health:X$($.health)})),endpoints:Z.endpoints,interactions:Z.interactions}}function Y$(Z){let $=Q.safeParse(Z);return $.success?$.data:"user"}function b(Z){let $=S(Z.metadata),H=typeof $.channelName==="string"?$.channelName:void 0;return{id:Z.id,sessionId:Z.sessionId,interfaceType:Z.interfaceType,channelId:Z.channelId,...Z.personId?{personId:Z.personId}:{},channelName:H,startedAt:Z.started,lastActiveAt:Z.lastActive,createdAt:Z.created,updatedAt:Z.updated,metadata:$}}function jZ(Z){return{id:Z.id,conversationId:Z.conversationId,role:Y$(Z.role),content:Z.content,timestamp:Z.timestamp,metadata:S(Z.metadata)}}function IZ(Z){return RZ.parse(Z)}function vZ(Z){return wZ.parse(Z)}function gZ(Z){return async()=>{return hZ(await Z.getAppInfo())}}function bZ(Z,$){return{get:()=>IZ(Z.getIdentity()),getProfile:()=>vZ(Z.getProfile()),getAppInfo:$}}function pZ(Z,$){let H=Z.getProfileKindRegistry();return{register:(X)=>{H.register($,X)},getResolved:()=>H.getResolved(),getSelectedDefinition:()=>H.getSelectedDefinition()}}function uZ(Z,$,H){let X=Z.getMessageBus();return{send:async(P)=>{return X.send({...P,sender:$})},subscribe:(P,K)=>{if(mZ(P)){let G=P,W=K,V=async(F)=>{let U=G.schema.safeParse(F.payload);if(!U.success)return H.warn(`Invalid payload for channel ${G.name}`,{error:U.error.message}),{noop:!0};let{payload:O,...R}=F;return W(U.data,R)};return X.subscribe(G.name,V)}return X.subscribe(P,K)}}}function cZ(Z,$){let H=Z.getJobQueueService();return{...Z.jobs,enqueue:ZZ(H,$,!0),enqueueBatch:AZ(Z.jobs,$),registerHandler:$Z(H,$)}}function dZ(Z){let $=Z.getPermissionService();return{assertEntityActionAllowed:(H,X,Y)=>{$.assertEntityActionAllowed(H,X,Y.userPermissionLevel)}}}function lZ(Z){return{get:async($)=>{let X=await Z.getConversationService().getConversation($);return X?b(X):null},search:async($)=>{return(await Z.getConversationService().searchConversations($)).map(b)},list:async($)=>{return(await Z.getConversationService().listConversations($)).map(b)},getMessages:async($,H)=>{return(await Z.getConversationService().getMessages($,H)).map(jZ)},countMessages:async($)=>{return Z.getConversationService().countMessages($)}}}function iZ(Z,$){return{registerHandler:(H,X)=>{Z.registerEvalHandler($,H,X)}}}function nZ(Z){return{register:($,H)=>{Z.getInsightsRegistry().register($,H)}}}function rZ(Z){return{has:($)=>Z.getPluginPackageName($)!==void 0}}function aZ(Z,$){return{register:(H)=>{Z.registerEndpoint({...H,pluginId:$})}}}function sZ(Z,$){return{register:(H)=>{Z.registerInteraction({...H,pluginId:$})}}}function T(Z,$,H){let X=Z.getEntityService(),Y=Z.getLogger().child($),P=Z.getDomain(),K=Z.getLocalSiteUrl(),G=Z.shouldPreferLocalUrls(),W=Z.getThemeCSS(),V=gZ(Z),F=Z.getAttachmentRegistry(),U=Z.getRuntimeUploadRegistry(),O=Z.getRuntimeState();return{pluginId:$,logger:Y,entityService:X,semantic:{project:(R)=>X.projectSemanticSpace(R)},identity:bZ(Z,V),profileKinds:pZ(Z,$),appInfo:V,judge:(R)=>Z.judge(R),domain:P,siteUrl:P?`https://${P}`:void 0,localSiteUrl:K,previewUrl:P?`https://${oZ(P)}`:void 0,preferLocalUrls:G,themeCSS:W,entityDisplay:H?.entityDisplay,spaces:Z.getSpaces(),permissions:dZ(Z),messaging:uZ(Z,$,Y),jobs:cZ(Z,$),attachments:F,uploads:U,runtimeState:O,recurringChecks:Z.getRecurringChecks($),conversations:lZ(Z),dataDir:Z.getDataDir(),eval:iZ(Z,$),insights:nZ(Z),plugins:rZ(Z),endpoints:aZ(Z,$),interactions:sZ(Z,$)}}function P$(Z){return Z.replace(/:/g,"-")}function K$(Z){return Z.split(/[:.-]/).map(($)=>$.charAt(0).toUpperCase()+$.slice(1)).join(" ")}var HZ=new Map;async function ZA(Z,$,H){let X=HZ.get($);if(X!==void 0)return X;let Y=P$($),P;try{P=await Z.getEntity({entityType:"prompt",id:Y})}catch{return H}if(P?.content){let K=eZ(P.content,A.record(A.string(),A.unknown())).content;return HZ.set($,K),K}try{let K=K$($),G=tZ(H,{title:K,target:$});await Z.createEntity({entity:{id:Y,entityType:"prompt",content:G,metadata:{title:K,target:$,slug:Y}}})}catch{}return HZ.set($,H),H}function p(Z){let $=Z.getEntityService(),H=Z.getEntityRegistry(),X=Z.getDataSourceRegistry();return{register:(Y,P,K,G)=>{H.registerEntityType(Y,P,K,G)},getAdapter:(Y)=>{try{return H.getAdapter(Y)}catch{return}},extendFrontmatterSchema:(Y,P)=>{H.extendFrontmatterSchema(Y,P)},getEffectiveFrontmatterSchema:(Y)=>{return H.getEffectiveFrontmatterSchema(Y)},registerPersistValidator:(Y,P)=>{H.registerPersistValidator(Y,P)},registerCreateInterceptor:(Y,P)=>{H.registerCreateInterceptor(Y,P)},registerUploadSaveHandler:(Y)=>{H.registerUploadSaveHandler(Y)},getUploadSaveHandler:(Y)=>{return H.getUploadSaveHandler(Y)},update:async(Y)=>{return $.updateEntity({entity:Y})},registerDataSource:(Y)=>{X.register(Y)}}}function u(Z){return{resolve:($,H)=>{return ZA(Z,$,H)}}}function AA(Z,$,H){let X=T(Z,$,H),Y=Z.getEntityService();return{...X,entityService:Y,entities:p(Z),ai:{query:(P,K)=>Z.query(P,K),generate:async(P)=>{return Z.generateContent(P)},generateObject:async(P,K,G)=>{return Z.generateObject(P,K,G)},generateImage:async(P,K)=>{return Z.generateImage(P,K)},canGenerateImages:()=>{return Z.canGenerateImages()}},prompts:u(Y),permissions:X.permissions}}function XA(Z,$,H){let X=!1,Y=!1;if(Z.jobs.registerHandler(H.job.type,H.job.handler),H.initialSync){let P=H.initialSync;Z.messaging.subscribe(HA.initialCompleted,async()=>{if(X)return{success:!0};if(X=!0,!(await P.shouldEnqueue?.()??!0))return $.info("Skipping derived entity projection initial sync",{projectionId:H.id,targetType:H.targetType}),{success:!0};return Y=await $A(Z,$,H,P.jobData,G$(P.jobOptions),"initial-sync"),{success:!0}})}if(H.sourceChange){let P=H.sourceChange,K=new Set(P.sourceTypes),G=P.events??[XZ.created,XZ.updated],W=async(V)=>{if(P.requireInitialSync&&!X)return{success:!0};let F=V.payload,U=W$(P,F);if(!U||!K.has("*")&&!K.has(U))return{success:!0};if(!(await P.shouldEnqueue?.(F)??!0))return{success:!0};let R=await P.jobData(F);if(!R)return{success:!0};return await $A(Z,$,H,R,P.jobOptions?.(F),"source-change"),{success:!0}};for(let V of G)Z.messaging.subscribe(V,W)}return{hasObservedInitialSync:()=>X,hasQueuedInitialSync:()=>Y}}function W$(Z,$){if(Z.sourceType)return Z.sourceType;if(Z.sourceKind&&Z.sourceKind!=="entity")return Z.sourceKind;return $.entityType}async function $A(Z,$,H,X,Y,P){try{return await Z.jobs.enqueue({type:H.job.type,data:X,...Y?{options:Y}:{}}),$.info("Queued derived entity projection",{projectionId:H.id,targetType:H.targetType,reason:P}),!0}catch(K){return $.error("Failed to queue derived entity projection",{projectionId:H.id,targetType:H.targetType,reason:P,error:B(K)}),!1}}function G$(Z){return typeof Z==="function"?Z():Z}var V$=A.object({toolName:A.string(),args:A.unknown(),progressToken:A.union([A.string(),A.number()]).optional(),hasProgress:A.boolean().optional(),interfaceType:A.string(),actor:L,displayName:A.string().optional(),conversationId:A.string().optional(),channelId:A.string().optional(),channelName:A.string().optional(),runId:A.string().optional(),toolCallId:A.string().optional(),userPermissionLevel:A.enum(["admin","trusted","public"]).optional(),isAnchor:A.boolean().optional(),signal:A.custom((Z)=>Z instanceof AbortSignal).optional()}),D$=A.object({resourceUri:A.string()});class M{id;version;description;packageName;config;context;get logger(){return this.context?.logger??v.createFresh({context:this.id})}constructor(Z,$,H,X){this.id=Z,this.packageName=$.name,this.version=$.version,this.description=$.description??`${$.name} plugin`;let Y=X.safeParse(H);if(!Y.success)throw new a(Z,Y.error.issues.map((P)=>({path:P.path.map(String).join("."),code:P.code,message:P.message})));this.config=Y.data}setupMessageHandlers(Z){Z.messaging.subscribe(E.toolExecute(this.id),async($)=>{try{let H=V$.safeParse($.payload);if(!H.success)return{success:!1,error:"Invalid tool execution request format"};let{toolName:X,args:Y,progressToken:P,hasProgress:K,interfaceType:G,actor:W,displayName:V,conversationId:F,channelId:U,channelName:O,runId:R,toolCallId:GZ,userPermissionLevel:VZ,isAnchor:DZ,signal:FZ}=H.data,UZ=(await this.getTools()).find((c)=>c.name===X);if(!UZ)return{success:!1,error:`Tool not found: ${X}`};let TA={interfaceType:G,actor:W,...V&&{displayName:V},...F&&{conversationId:F},...U&&{channelId:U},...O&&{channelName:O},...R&&{runId:R},...GZ&&{toolCallId:GZ},...VZ&&{userPermissionLevel:VZ},...DZ!==void 0&&{isAnchor:DZ},...FZ&&{signal:FZ},...K&&P!==void 0&&{progressToken:P,sendProgress:async(c)=>{await Z.messaging.send({type:E.progress(this.id),payload:{progressToken:P,notification:c}})}}};return{success:!0,data:await UZ.handler(Y,TA)}}catch(H){return this.logger.error("Tool execution error",H),{success:!1,error:B(H)}}}),Z.messaging.subscribe(E.resourceGet(this.id),async($)=>{try{let H=D$.safeParse($.payload);if(!H.success)return{success:!1,error:"Invalid resource get request format"};let{resourceUri:X}=H.data,P=(await this.getResources()).find((G)=>G.uri===X);if(!P)return{success:!1,error:`Resource not found: ${X}`};return{success:!0,data:await P.handler()}}catch(H){return this.logger.error("Resource fetch error",H),{success:!1,error:B(H)}}})}async onRegister(Z){}async onRegistrationComplete(Z){}async finalizeRegistration(){await this.onRegistrationComplete(this.getContext())}async onReady(Z){}async ready(){await this.onReady(this.getContext())}async getCapabilities(){let Z=await this.getInstructions();return{tools:await this.getTools(),resources:await this.getResources(),...Z&&{instructions:Z}}}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(Z){return"public"}createProgressBridge(Z){if(!Z)return;let $=this.context;if(!$)return;let H=this.id;return C.from(async(X)=>{await $.messaging.send({type:E.progress(H),payload:{progressToken:Z,notification:{progress:X.progress,total:X.total,message:X.message}}})})}}var K8=A.object({});class YA extends M{type="entity";entityActionPolicy;derivedEntityProjectionControllers=new Map;constructor(Z,$,H,X,Y){super(Z,$,H,X);if(Y!==void 0)this.entityActionPolicy=Y}async register(Z,$){let H=AA(Z,this.id,$);if(this.context=H,this.setupMessageHandlers(H),H.entities.register(this.entityType,this.schema,this.adapter,this.getEntityTypeConfig()),this.interceptCreate!==YA.prototype.interceptCreate)H.entities.registerCreateInterceptor(this.entityType,(W,V)=>this.interceptCreate(W,V,H));let X=this.createGenerationHandler(H);if(X)H.jobs.registerHandler(`${this.entityType}:generation`,X);let Y=this.getTemplates();if(Y&&Object.keys(Y).length>0)Z.registerTemplates(Y,this.id);let P=this.getDataSources();for(let W of P)H.entities.registerDataSource(W);let K=this.getDerivedEntityProjections(H);for(let W of K){let V=XA(H,this.logger,W);this.derivedEntityProjectionControllers.set(W.id,V)}await this.onRegister(this.context);let G=await this.getInstructions();return{tools:[],resources:[],...G&&{instructions:G}}}async interceptCreate(Z,$,H){return{kind:"continue",input:Z}}createGenerationHandler(Z){return null}getTemplates(){return null}getDataSources(){return[]}getEntityTypeConfig(){return}getDerivedEntityProjections(Z){return[]}getDerivedEntityProjectionController(Z){return this.derivedEntityProjectionControllers.get(Z)}}function PA(Z){return WA(Z)}function KA(Z){if(!Z)return;return{...Z.userPermissionLevel&&{userPermissionLevel:Z.userPermissionLevel},...Z.isAnchor!==void 0&&{isAnchor:Z.isAnchor},...Z.interfaceType&&{interfaceType:Z.interfaceType},...Z.channelId&&{channelId:Z.channelId},...Z.channelName&&{channelName:Z.channelName},...Z.actor&&{actor:Z.actor},...Z.source&&{source:Z.source},...Z.attachments&&{attachments:Z.attachments}}}function GA(Z){return{chat:async($,H,X,Y)=>{let P=KA(X),K=Y?await Z.chat($,H,P,Y):await Z.chat($,H,P);return PA(K)},confirmPendingAction:async($,H,X,Y,P)=>{let K=KA(Y);if(!K)throw Error("Confirmation requires caller context.");let G=P?await Z.confirmPendingAction($,H,X,K,P):await Z.confirmPendingAction($,H,X,K);return PA(G)},invalidate:()=>{Z.invalidateAgent()}}}function VA(Z,$,H){let X=T(Z,$,H),Y=Z.getMCPService(),P=Z.getPermissionService(),K=GA(Z.getAgentService());return{...X,mcpTransport:Y,agent:K,permissions:{...X.permissions,getUserLevel:(G,W,V)=>{return P.determineUserLevel(G,W,V)},isAnchor:(G,W)=>P.isAnchor(G,W)},daemons:{register:(G,W)=>{let V=`${$}:${G}`;Z.registerDaemon(V,W,$),X.logger.debug(`Registered daemon: ${V}`)}},conversations:{...X.conversations,start:async(G)=>{return Z.getConversationService().startConversation(G)},addMessage:async(G)=>{await Z.getConversationService().addMessage(G)},updateMetadata:async(G)=>{return Z.getConversationService().updateConversationMetadata(G)},delete:async(G)=>{return Z.getConversationService().deleteConversation(G)}},tools:{listForPermissionLevel:(G)=>{return Z.listToolsForPermissionLevel(G)}},apiRoutes:{getRoutes:()=>{return Z.getPluginApiRoutes()},getMessageBus:()=>{return Z.getMessageBus()}},webRoutes:{getRoutes:()=>{return Z.getPluginWebRoutes()}},plugins:{has:(G)=>Z.hasPlugin(G)}}}var F$=3600000;class YZ extends M{type="interface";daemon;jobTrackingEntries=new Map;jobTrackingTtlMs=F$;async register(Z,$){let H=VA(Z,this.id,$);if(this.context=H,this.initializeDaemon(),this.daemon)await this.registerDaemon(H);return this.setupMessageHandlers(H),await this.onRegister(H),this.getCapabilities()}async onRegister(Z){}async registerDaemon(Z){if(!this.daemon)return;Z.daemons.register(this.id,this.daemon),Z.logger.debug(`Registered daemon for interface: ${this.id}`)}createDaemon(){return}requiresDaemonStartup(){return!1}getWebRoutes(){return[]}initializeDaemon(){let Z=this.createDaemon();if(Z)this.daemon=Z}async handleProgressEvent(Z,$){}cleanupExpiredEntries(){let Z=Date.now(),$=[];for(let[H,X]of this.jobTrackingEntries)if(Z-X.createdAt>this.jobTrackingTtlMs)$.push(H);for(let H of $)this.jobTrackingEntries.delete(H)}ownsJob(Z,$){return this.jobTrackingEntries.has(Z)||$!==void 0&&this.jobTrackingEntries.has($)}getJobTracking(Z,$){let H=this.jobTrackingEntries.get(Z);if(H)return H.info;if($){let X=this.jobTrackingEntries.get($);if(X)return X.info}return}setJobTracking(Z,$){this.cleanupExpiredEntries(),this.jobTrackingEntries.set(Z,{info:$,createdAt:Date.now()})}removeJobTracking(Z){this.jobTrackingEntries.delete(Z)}async createJobWithTracking(Z,$){let X=await this.getContext().jobs.enqueue(Z);return this.setJobTracking(X,$),X}async createBatchWithTracking(Z,$,H){let Y=await this.getContext().jobs.enqueueBatch(Z,H);return this.setJobTracking(Y,$),Y}}function y(Z,$){return{state:$,toolName:Z.toolName,conversationId:Z.conversationId,interfaceType:Z.interfaceType,...Z.channelId!==void 0&&{channelId:Z.channelId},...Z.channelName!==void 0&&{channelName:Z.channelName},...Z.error!==void 0&&{error:Z.error}}}function DA(Z,$){return Z.pendingConfirmations?.some((H)=>H.toolName===$)===!0||U$(Z.cards).some((H)=>H.toolName===$)}function U$(Z){return Z?.filter(($)=>$.kind==="tool-approval"&&$.state==="approval-requested")??[]}var PZ=1e5,R$=[".md",".txt",".markdown"],w$=["text/plain","text/markdown","text/x-markdown"],N$=/https?:\/\/[^\s<>"{}|\\^`[\]]+?(?=[,;:\s]|$)/gi,_$=["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"],L$=A.object({captureUrls:A.boolean().default(!1),blockedUrlDomains:A.array(A.string()).default(_$)});function FA(Z,$){if($&&w$.some((H)=>$.startsWith(H)))return!0;return R$.some((H)=>Z.toLowerCase().endsWith(H))}function UA(Z){return Z<=PZ}function RA(Z){if(Z.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(Z),!0}catch{return!1}}function wA(Z,$){return`User uploaded a file "${Z}":
3
-
4
- ${$}`}function NA(Z,$){let H=Z.match(N$)??[];return[...new Set(H)].filter((X)=>{try{let{hostname:Y}=new URL(X);return!$.some((P)=>Y===P||Y.endsWith(`.${P}`))}catch{return!1}})}function KZ(Z,$){let H=Z.attachment.source;if((H?.entityType==="document"||H?.entityType==="image")&&H.entityId)return{entityType:H.entityType,id:H.entityId};return O$(Z.attachment.downloadUrl??Z.attachment.url,$)}function O$(Z,$="http://local"){if(!Z)return;let H;try{H=new URL(Z,$)}catch{return}let X=H.searchParams.get("id")?.trim();if(!X)return;if(H.pathname==="/api/chat/attachments/document")return{entityType:"document",id:X};if(H.pathname==="/api/chat/attachments/image")return{entityType:"image",id:X};return}function _A(Z,$){let H=B$($,Z==="document"?/^application\/pdf$/i:/^image\/[a-z0-9.+-]+$/i);if(!H)return;if(Z==="document"&&H.mimeType.toLowerCase()!=="application/pdf")return;return H}function LA(Z,$,H,X){let Y=Z?.filename;if(typeof Y==="string"&&Y.trim())return Y;if(H==="document")return`${$}.pdf`;let P=Z?.format;if(typeof P==="string"&&P.trim())return`${$}.${P==="jpeg"?"jpg":P}`;let K=X.split("/")[1]?.split("+")[0]??"png";return`${$}.${K}`}function B$(Z,$){let H=Z.match(/^data:([^;]+);base64,(.+)$/i),X=H?.[1],Y=H?.[2];if(!X||!Y||!$.test(X))return;let P=Buffer.from(Y,"base64");return{mimeType:X,data:P.buffer.slice(P.byteOffset,P.byteOffset+P.byteLength)}}async function BA({entityRef:Z,userLevel:$,getEntity:H,getVisibleEntity:X}){let Y=OA($),P=await X(Z,Y);if(P)return{status:"visible",entity:P};return Boolean(await H(Z))?{status:"denied"}:{status:"missing"}}function CA(Z){return Z==="admin"||Z==="trusted"}function MA(Z,$){Z.messaging.subscribe(e.progress,async(H)=>{try{let X=t.safeParse(H.payload);if(!X.success)return $.onInvalidSchema(),{success:!1};let Y=X.data;return await $.onProgress(Y,Y.metadata),{success:!0}}catch(X){return $.onError(X),{success:!1}}})}function QA(Z){let $=Z.status==="completed"?"\u2705":"\u274C",H=Z.status==="completed"?"completed":"failed",X=Z.metadata.operationType.replace(/_/g," "),Y=Z.metadata.operationTarget?`: ${Z.metadata.operationTarget}`:"",P=`${$} **${X}${Y}** ${H}`;if(Z.message)P+=`
5
- ${Z.message}`;return P}function qA(Z){let $=Z.metadata.operationType.replace(/_/g," "),H=Z.metadata.operationTarget?`: ${Z.metadata.operationTarget}`:"",X=`\uD83D\uDD04 **${$}${H}**`;if(Z.progress&&Z.progress.total>0)X+=` ${Z.progress.current}/${Z.progress.total} (${Z.progress.percentage}%)`;if(Z.message)X+=`
6
- ${Z.message}`;return X}var C$=A.enum(["tool:invoking","tool:completed","tool:failed"]),M$=A.object({toolName:A.string().min(1),conversationId:A.string().min(1),interfaceType:A.string().min(1),channelId:A.string().min(1).optional(),channelName:A.string().min(1).optional(),toolCallId:A.string().min(1).optional(),error:A.string().optional()}),Q$=["tool:invoking","tool:completed","tool:failed"];function kA(Z,$){for(let H of Q$)Z.messaging.subscribe(H,async(X)=>{try{let Y=C$.safeParse(X.type),P=M$.safeParse(X.payload);if(!Y.success||!P.success)return $.onInvalidSchema(),{success:!1};return await $.onToolActivity({type:Y.data,...P.data}),{success:!0}}catch(Y){return $.onError(Y),{success:!1}}})}class WZ{scope;fibers;delayMs;clock;closePromise=null;closed=!1;constructor(Z,$){this.delayMs=Z,this.clock=$?.clock,this.scope=N.runSync(f.make()),this.fibers=N.runSync(f.extend(g.make(),this.scope))}schedule(Z,$){if(this.closed)return;let H=N.sleep(this.delayMs).pipe(N.andThen(N.sync($))),X=this.clock?N.withClock(H,this.clock):H,Y=N.runFork(X);g.unsafeSet(this.fibers,Z,Y)}close(){return this.closed=!0,this.closePromise??=N.runPromise(f.close(this.scope,z.void)),this.closePromise}}var EA=500,q$=500;class k$ extends YZ{isUploadableTextFile(Z,$){return FA(Z,$)}isFileSizeAllowed(Z){return UA(Z)}formatFileUploadMessage(Z,$){return wA(Z,$)}getMaxFileUploadBytes(){return PZ}isLikelyTextContent(Z){return RA(Z)}async resolveNativeArtifactDelivery(Z){let $=[],H=new Set;if(!this.context||!Z.cards)return{files:$,deniedCardIds:H};let X=this.context;for(let Y of Z.cards){if(Y.kind!=="attachment")continue;let P=KZ(Y,Z.displayBaseUrl);if(!P)continue;let K=await BA({entityRef:P,userLevel:Z.userPermissionLevel,getEntity:(W)=>X.entityService.getEntity(W),getVisibleEntity:(W,V)=>X.entityService.getEntity({...W,visibilityScope:V})});if(K.status==="denied"){H.add(Y.id);continue}if(K.status!=="visible")continue;if(!CA(Z.userPermissionLevel))continue;if(typeof K.entity.content!=="string")continue;let G=_A(P.entityType,K.entity.content);if(!G)continue;if(Z.maxBytes!==void 0&&G.data.byteLength>Z.maxBytes){this.logger.debug("Skipping oversized native artifact upload",{cardId:Y.id,sizeBytes:G.data.byteLength});continue}$.push({cardId:Y.id,data:new Uint8Array(G.data),filename:Y.attachment.filename??LA(K.entity.metadata,P.id,P.entityType,G.mimeType),mimeType:G.mimeType})}return{files:$,deniedCardIds:H}}extractCaptureableUrls(Z,$){return NA(Z,$)}async captureUrlViaAgent(Z,$,H,X,Y){if(!this.context)return;let P=this.context.permissions.getUserLevel(X,H,Y);await this.context.agent.chat(`Save this link: ${Z}`,`links-${$}`,{userPermissionLevel:P,interfaceType:X,channelId:$})}progressEvents=new Map;progressCleanupSupervisor=new WZ(q$);sendMessageWithId(Z){return Promise.resolve(void 0)}editMessage(Z){return Promise.resolve(!1)}supportsMessageEditing(){return!1}progressCallback;isProcessingInput=!1;currentChannelId=null;bufferedCompletionMessages=[];progressMessageTracking=new Map;agentResponseTracking=new Map;pendingToolCompletions=new Map;registerProgressCallback(Z){this.progressCallback=Z;let $=Array.from(this.progressEvents.values()).filter((H)=>H.status==="processing");Z($)}unregisterProgressCallback(){delete this.progressCallback}trackAgentResponseForJob(Z,$,H){this.agentResponseTracking.set(Z,{messageId:$,channelId:H,lastUpdate:Date.now()}),this.logger.debug("Tracking agent response for job",{jobId:Z,messageId:$,channelId:H})}async onRegister(Z){await super.onRegister(Z),MA(Z,{onProgress:async($,H)=>{await this.handleProgressEvent($,H)},onError:($)=>{this.logger.error("Error handling progress event",{error:$,interfaceId:this.id})},onInvalidSchema:()=>{this.logger.warn("Invalid progress event schema",{interfaceId:this.id})}}),kA(Z,{onToolActivity:async($)=>{await this.handleToolActivityEvent($)},onError:($)=>{this.logger.error("Error handling tool activity event",{error:$,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.progressCleanupSupervisor.close(),this.progressEvents.clear(),this.progressMessageTracking.clear(),this.agentResponseTracking.clear(),this.pendingToolCompletions.clear(),this.bufferedCompletionMessages=[],this.isProcessingInput=!1,this.currentChannelId=null,delete this.progressCallback,await super.onShutdown()}async handleProgressEvent(Z,$){if(!this.shouldHandleProgressEvent(Z))return;this.updateProgressState(Z);let H=Z.metadata.channelId??null,X=Z.metadata.rootJobId;if(await this.handleProcessingProgress(Z,H,X))return;if(Z.status==="completed"||Z.status==="failed")await this.handleTerminalProgress(Z,H,X);await this.onProgressUpdate(Z),this.logProgressProcessed(Z)}shouldHandleProgressEvent(Z){let $=Z.metadata.interfaceType;return!$||$===this.id}updateProgressState(Z){this.progressEvents.set(Z.id,Z),this.notifyProgressCallback()}async handleProcessingProgress(Z,$,H){if(Z.status!=="processing"||!this.supportsMessageEditing())return!1;let X=this.agentResponseTracking.get(Z.id);if(X)return await this.editTrackedProgressMessage(Z,X),!0;let Y=this.formatProgressOutput(Z),P=this.progressMessageTracking.get(H),K=Date.now();if(P){if(K-P.lastUpdate>=EA)await this.editMessage({channelId:P.channelId,messageId:P.messageId,newMessage:Y}),P.lastUpdate=K}else if($&&!this.isProcessingInput)await this.sendInitialProgressMessage(H,$,Y,K);return!1}async editTrackedProgressMessage(Z,$){let H=Date.now();if(H-$.lastUpdate<EA)return;await this.editMessage({channelId:$.channelId,messageId:$.messageId,newMessage:this.formatProgressOutput(Z)}),$.lastUpdate=H}async sendInitialProgressMessage(Z,$,H,X){let Y=await this.sendMessageWithId({channelId:$,message:H});if(!Y)return;this.progressMessageTracking.set(Z,{messageId:Y,channelId:$,lastUpdate:X}),this.logger.debug("Tracking progress message",{rootJobId:Z,messageId:Y,channelId:$})}async handleTerminalProgress(Z,$,H){let X=this.formatCompletionOutput(Z),Y=this.progressMessageTracking.get(H),P=this.agentResponseTracking.get(Z.id);if(this.logger.debug("Completion event received",{eventId:Z.id,rootJobId:H,hasProgressTracking:!!Y,hasAgentTracking:!!P,supportsEditing:this.supportsMessageEditing()}),this.supportsMessageEditing())await this.updateTrackedCompletion(Z,X,Y,P,H);if(!Y&&!P&&$)this.sendOrBufferCompletionMessage(X,$);this.scheduleProgressCleanup(Z.id)}async updateTrackedCompletion(Z,$,H,X,Y){if(X){if(await this.editMessage({channelId:X.channelId,messageId:X.messageId,newMessage:$}),this.agentResponseTracking.delete(Z.id),H)this.progressMessageTracking.delete(Y);return}if(H)await this.editMessage({channelId:H.channelId,messageId:H.messageId,newMessage:$}),this.progressMessageTracking.delete(Y)}sendOrBufferCompletionMessage(Z,$){if(this.isProcessingInput){this.bufferedCompletionMessages.push({message:Z,channelId:$});return}this.sendMessageToChannel({channelId:$,message:Z})}scheduleProgressCleanup(Z){this.progressCleanupSupervisor.schedule(Z,()=>{this.progressEvents.delete(Z),this.notifyProgressCallback()})}logProgressProcessed(Z){this.logger.debug("Progress event processed",{eventId:Z.id,status:Z.status,operationType:Z.metadata.operationType,targetChannel:Z.metadata.channelId})}formatProgressOutput(Z){return qA(Z)}formatCompletionOutput(Z){return QA(Z)}async onProgressUpdate(Z){}async handleToolActivityEvent(Z){if(Z.interfaceType!==this.id)return;switch(Z.type){case"tool:invoking":this.pendingToolCompletions.delete(this.getToolCompletionKey(Z)),await this.handleToolStatusUpdate(y(Z,"running"));return;case"tool:completed":if(this.isProcessingInput){this.pendingToolCompletions.set(this.getToolCompletionKey(Z),Z);return}await this.handleToolStatusUpdate(y(Z,"completed"));return;case"tool:failed":this.pendingToolCompletions.delete(this.getToolCompletionKey(Z)),await this.handleToolStatusUpdate(y(Z,"failed"));return}}async handleToolStatusUpdate(Z){}async handleAgentResponseToolStatuses(Z,$){if(this.pendingToolCompletions.size===0)return;let H=Array.from(this.pendingToolCompletions.values()).filter((X)=>X.interfaceType===this.id&&X.conversationId===$);for(let X of H){this.pendingToolCompletions.delete(this.getToolCompletionKey(X));let Y=DA(Z,X.toolName)?"awaiting-approval":"completed";await this.handleToolStatusUpdate(y(X,Y))}}getToolCompletionKey(Z){return`${Z.interfaceType}:${Z.conversationId}:${Z.toolName}`}notifyProgressCallback(){if(this.progressCallback){let Z=Array.from(this.progressEvents.values());this.progressCallback(Z)}}getProgressEvents(){return Array.from(this.progressEvents.values())}getActiveProgressEvents(){return Array.from(this.progressEvents.values()).filter((Z)=>Z.status==="processing")}startProcessingInput(Z=null){this.isProcessingInput=!0,this.currentChannelId=Z}endProcessingInput(){this.isProcessingInput=!1;for(let{message:Z,channelId:$}of this.bufferedCompletionMessages)this.sendMessageToChannel({channelId:$,message:Z});this.bufferedCompletionMessages=[],this.currentChannelId=null}getCurrentChannelId(){return this.currentChannelId}}function fA(Z,$,H){let X=T(Z,$,H),Y=Z.getEntityService(),P=Z.getRenderService(),K=Z.getContentService(),G=Z.getPermissionService();return{...X,permissions:{...X.permissions,getConfiguredPrincipalSeeds:()=>G.getConfiguredPrincipalSeeds(),replaceRuntimePrincipalState:(W)=>G.replaceRuntimePrincipalState(W)},entityService:Y,entities:p(Z),webRoutes:{getRoutes:()=>Z.getPluginWebRoutes()},templates:{register:(W,V)=>{Z.registerTemplates(W,V??$)},format:(W,V)=>{return K.formatContent(W,V,{pluginId:$})},parse:(W,V)=>{return K.parseContent(W,V,$)},resolve:async(W,V)=>{return await K.resolveContent(W,V,$)},getCapabilities:(W)=>{let V=W.includes(":")?W:`${$}:${W}`,F=Z.getTemplate(V);if(!F)return null;let U=JA.getCapabilities(F);return{canGenerate:U.canGenerate,canFetch:U.canFetch,canRender:U.canRender,isStaticOnly:U.isStaticOnly}}},views:{get:(W)=>{return P.get(W)??void 0},list:()=>{return P.list()},hasRenderer:(W,V="web")=>{return P.hasRenderer(W,V)},getRenderer:(W,V="web")=>{return P.getRenderer(W,V)},validate:(W,V)=>{return P.validate(W,V)}},prompts:u(Y),ai:{query:(W,V)=>Z.query(W,V),generate:async(W)=>{return Z.generateContent(W)},generateObject:async(W,V,F)=>{return Z.generateObject(W,V,F)},generateImage:async(W,V)=>{return Z.generateImage(W,V)},canGenerateImages:()=>{return Z.canGenerateImages()}},registerInstructions:(W)=>{Z.registerInstructions($,W)}}}class E$ extends M{type="service";getApiRoutes(){return[]}getWebRoutes(){return[]}async register(Z,$){let H=fA(Z,this.id,$);return this.context=H,this.setupMessageHandlers(H),await this.onRegister(H),this.getCapabilities()}get entityService(){return this.getContext().entityService}registerEntityType(Z,$,H,X){this.getContext().entities.register(Z,$,H,X)}async enqueueJob(Z){return this.getContext().jobs.enqueue(Z)}async enqueueBatch(Z,$){return this.getContext().jobs.enqueueBatch(Z,$)}async registerEntityTypes(Z){}async registerJobHandlers(Z){}async onRegister(Z){await this.registerEntityTypes(Z),await this.registerJobHandlers(Z)}}
7
- export{xZ as m,z$ as n,y$ as o,RZ as p,wZ as q,K8 as r,YA as s,YZ as t,k$ as u,E$ as v,S1 as w,r4 as x};
8
-
9
- //# debugId=D5D99B72E3C04D9C64756E2164756E21
10
- //# sourceMappingURL=index-a4q0aknf.js.map
@@ -1,6 +0,0 @@
1
- // @bun
2
- import{m as a}from"./index-a4q0aknf.js";import{$ as q,B as Y,C as kf,J as Gf,L as Yf,M as Z,N as s,O as R,S as K,T as Nf,U as u,W as Uf,Y as t,Z as Of,_ as E,aa as n}from"./index-72d2a6vf.js";import{Fa as r,Ga as i,Oa as Tf,Sa as c,Ya as P}from"./index-b6k44k1d.js";import{_a as U}from"./index-q5r12b3s.js";var zf={pluginsRegistered:"system:plugins:registered",initialSyncCompleted:"sync:initial:completed",shellReady:"system:shell:ready"};var I=/^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;var GU=U.object({id:U.string().regex(I),ref:U.object({kind:U.string().min(1),id:U.string().regex(I)}),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 g(f){if(typeof f!=="object"||f===null||!("entityId"in f))return;let x=f.entityId;return typeof x==="string"&&x.trim().length>0?x.trim():void 0}function bf(f){if(typeof f!=="object"||f===null||!("coverImage"in f))return;let x=f.coverImage;if(x===void 0||x===!1)return;if(x===!0)return{generate:!0};if(typeof x!=="object"||x===null)return;let A=x;if(A.generate===!1)return;let k=A.prompt?.trim();return{generate:!0,...k&&{prompt:k}}}function S(f){return Object.fromEntries(Object.entries(f).filter(([,x])=>x!==void 0))}function Vf(f){let x={...f};return delete x.status,delete x.error,S(x)}class Ff extends a{context;entityType;constructor(f,x,A){super(f,{schema:A.schema,jobTypeName:A.jobTypeName});this.context=x,this.entityType=A.entityType}async afterCreate(f,x,A,k){}async onGenerationFailure(f,x){}validateAndParse(f){let x=super.validateAndParse(f);if(!x)return null;let A=bf(f);if(typeof x!=="object")return x;let k=g(f);if(!A&&!k)return x;return Object.assign(x,{...A&&{coverImage:A},...k&&{entityId:k}}),x}async process(f,x,A){try{await this.reportProgress(A,{progress:P.START,message:`Starting ${this.jobTypeName}`});let k=await this.generate(f,A),$=g(f),M=$?this.applyPreallocatedEntityId($,k):k;await this.reportProgress(A,{progress:P.SAVE,message:`Saving ${this.entityType} to database`});let L=$?await this.updatePreallocatedStub($,M):await this.context.entityService.createEntity({entity:{id:M.id,entityType:this.entityType,content:M.content,metadata:M.metadata},options:M.createOptions});return await this.afterCreate(f,L.entityId,A,M),await this.enqueueGenericCoverImageIfRequested(f,L.entityId,A,M),await this.reportProgress(A,{progress:P.COMPLETE,message:`${M.title??this.entityType} created successfully`}),{success:!0,entityId:L.entityId,...M.resultExtras}}catch(k){if(k instanceof d)return await this.markPreallocatedStubFailed(f,k.message),await this.onGenerationFailure(f,k.message),{success:!1,error:k.message};let $=Y(k);return this.logger.error(`${this.jobTypeName} job failed`,{error:k,jobId:x,data:this.summarizeDataForLog(f)}),await this.markPreallocatedStubFailed(f,$),await this.onGenerationFailure(f,$),Tf.failure(k)}}applyPreallocatedEntityId(f,x){let A={...x.metadata},k=x.content,$=x.resultExtras;if(typeof A.slug==="string")A.slug=f,k=E(k,"slug",f),$={...$,slug:f};return{...x,id:f,content:k,metadata:A,...$&&{resultExtras:$}}}async updatePreallocatedStub(f,x){let A=await this.context.entityService.getEntity({entityType:this.entityType,id:f,visibilityScope:"restricted"});if(!A)throw Error(`Pre-allocated entity stub not found: ${this.entityType}/${f}`);let k=this.mergeStubWithGenerated(A,x);return this.context.entityService.updateEntity({entity:{...A,id:f,entityType:this.entityType,content:k.content,metadata:k.metadata}})}mergeStubWithGenerated(f,x){let A=Vf(t(f.content).frontmatter),k=Vf(f.metadata),$=S(x.metadata),M=t(x.content),L=S(M.frontmatter),V=S({...A,...$,...L});return this.context.entities.getEffectiveFrontmatterSchema(this.entityType)?.parse(V),{content:Of(V,M.content),metadata:{...k,...$}}}async markPreallocatedStubFailed(f,x){let A=g(f);if(!A)return;try{let k=await this.context.entityService.getEntity({entityType:this.entityType,id:A,visibilityScope:"restricted"});if(!k)return;await this.context.entityService.updateEntity({entity:{...k,content:E(E(k.content,"status","failed"),"error",x),metadata:{...k.metadata,status:"failed",error:x}}})}catch(k){this.logger.warn("Failed to mark generation stub as failed",{error:k,entityId:A,entityType:this.entityType})}}async enqueueGenericCoverImageIfRequested(f,x,A,k){let $=bf(f);if(!$)return;await this.reportProgress(A,{progress:90,message:"Queueing cover image generation"});let M=k.title??x;await this.context.jobs.enqueue({type:c.generate,data:{prompt:$.prompt??`Editorial cover image for: ${M}. `,title:`${M} Cover`,aspectRatio:"16:9",targetEntityType:this.entityType,targetEntityId:x,entityTitle:M,entityContent:k.content},toolContext:{interfaceType:"job",actor:{kind:"service",serviceId:"generation-job-handler"}}})}failEarly(f){throw new d(f)}}class d extends Error{constructor(f){super(f);this.name="GenerationFailure"}}var nf=U.object({kind:U.string().min(1),id:U.string().min(1)}),lf=U.object({kind:U.string().min(1),filename:U.string().min(1),mediaType:U.string().min(1),sizeBytes:U.number().nonnegative().optional(),source:nf.optional()}),IU=U.array(lf),gU=U.array(i),tU=U.array(r),dU=U.record(U.string(),U.unknown());var fA=U.record(U.string(),U.unknown());var MA=U.record(U.string(),U.unknown());var yf=new Map([[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"],[".gif","image/gif"],[".pdf","application/pdf"]]),NA=new Set(yf.values());async function tx(f){let{entityType:x,title:A,deriveId:k,regeneratePrompt:$,context:M}=f,L=k(A),V=await M.entityService.getEntity({entityType:x,id:L});if(!V||V.metadata.status==="generating")return A;M.logger.debug(`Entity ID collision: ${x}/${L}, asking AI for a new title`);let J=U.object({title:U.string().max(80).describe("A short, unique title (2-6 words)")}),{object:W}=await M.ai.generateObject(`The title "${A}" is already taken. ${$}`,J),X=W.title;return M.logger.debug(`AI suggested new title: "${X}"`),X}var ff=K.extend({id:U.literal("brain-character"),entityType:U.literal("brain-character")}),z=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 Df=U.record(U.string(),U.unknown());class o extends q{constructor(){super({entityType:"brain-character",purpose:"The brain's own identity, character, and purpose (singleton).",schema:ff,frontmatterSchema:z,isSingleton:!0,hasBody:!1})}createCharacterContent(f){return this.buildMarkdown("",f)}parseCharacterBody(f){return this.parseFrontmatter(f)}toMarkdown(f){let x=this.parseFrontmatter(f.content);return this.buildMarkdown("",Df.parse(x))}fromMarkdown(f){return{content:f,entityType:"brain-character"}}extractMetadata(f){let x=this.parseFrontmatter(f.content);return{role:x.role,values:x.values}}generateFrontMatter(f){let x=this.parseFrontmatter(f.content);return this.buildMarkdown("",Df.parse(x))}}class D extends n{static instance=null;adapter=new o;static getDefaultCharacter(){return{name:"Brain",role:"Knowledge assistant",purpose:"Help organize, understand, and retrieve information from your knowledge base",values:["clarity","accuracy","helpfulness"]}}static getInstance(f,x,A){return D.instance??=new D(f,x,A),D.instance}static resetInstance(){D.instance=null}static createFresh(f,x,A){return new D(f,x,A)}constructor(f,x,A){super(f,x,"brain-character",A??D.getDefaultCharacter(),u("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 xf=K.extend({id:U.literal("anchor-profile"),entityType:U.literal("anchor-profile")}),mf=U.enum(["person","team","organization"]),Q=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 dx=U.record(U.string(),U.unknown());class l extends q{constructor(){super({entityType:"anchor-profile",purpose:"The profile of the brain's Anchor (singleton).",schema:xf,frontmatterSchema:Q,isSingleton:!0,hasBody:!0})}createProfileContent(f){let x=Q.parse(f);return this.buildMarkdown("",x)}parseProfileBody(f,x){if(x){let{metadata:A,content:k}=Uf(f,x);return k?{...A,story:k}:A}return this.parseFrontmatter(f)}fromMarkdown(f){return{content:f,entityType:"anchor-profile"}}extractMetadata(f){let x=this.parseFrontmatter(f.content);return{name:x.name,email:x.email,website:x.website}}generateFrontMatter(f){let x=this.parseFrontmatter(f.content);return this.buildMarkdown("",dx.parse(x))}}class j extends n{static instance=null;adapter=new l;static getDefaultProfile(){return{name:"Unknown"}}static getInstance(f,x,A){return j.instance??=new j(f,x,A),j.instance}static resetInstance(){j.instance=null}static createFresh(f,x,A){return new j(f,x,A)}constructor(f,x,A){super(f,x,"anchor-profile",A??j.getDefaultProfile(),u("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 y=U.enum(["person","team","organization"]),mk=U.object({kind:U.string().trim().min(1),category:y,labels:U.object({singular:U.string().trim().min(1),plural:U.string().trim().min(1)})});var Bf=U.looseObject({id:U.string(),description:U.string(),name:U.string().optional(),tags:U.array(U.string()).optional().default([])}),ax=Q.extend({kind:U.string().trim().min(1).optional(),category:y.optional()}).superRefine((f,x)=>{if(f.kind===void 0!==(f.category===void 0))x.addIssue({code:"custom",message:"Anchor kind and category must be provided together"})}),ex=U.looseObject({uri:U.string(),params:U.record(U.string(),U.unknown()).optional()}),rx=U.looseObject({name:U.string(),url:U.string(),description:U.string().optional(),skills:U.array(Bf).optional().default([]),capabilities:U.looseObject({extensions:U.array(ex).optional().default([])}).optional()});var ix=U.object({name:U.string(),description:U.string(),tags:U.array(U.string()),examples:U.array(U.string())});import{EventEmitter as Xf}from"events";var _={REGISTERED:"registered",INITIALIZED:"initialized",ERROR:"error",DISABLED:"disabled"},F={REGISTERED:"plugin:registered",BEFORE_INITIALIZE:"plugin:before_initialize",INITIALIZED:"plugin:initialized",ERROR:"plugin:error",DISABLED:"plugin:disabled"};class H extends Error{pluginId;constructor(f,x){super(`Plugin ${f}: ${x}`);this.name="PluginError",this.pluginId=f}}class Af{scope;ingress=new Set;closePromise=null;closed=!1;constructor(){this.scope=R.runSync(s.make())}addFinalizer(f){if(this.closed)throw Error("Cannot register a resource after plugin teardown");R.runSync(s.addFinalizer(this.scope,R.promise(async()=>{await f()})))}addIngress(f){if(this.closed)throw Error("Cannot register ingress after plugin teardown");this.ingress.add(f)}close(f=Z.void){return this.closed=!0,this.closePromise??=this.closeScope(f),this.closePromise}async closeScope(f){let x,A=!1,k=[...this.ingress].reverse();for(let V of k)try{V.stopAdmission()}catch(J){if(!A)x=J;A=!0}let $=await Promise.allSettled(k.map((V)=>Promise.resolve().then(()=>V.drain())));this.ingress.clear();let M=$.find((V)=>V.status==="rejected");if(!A&&M)x=M.reason,A=!0;let L=await R.runPromiseExit(s.close(this.scope,f));if(!A&&Z.isFailure(L))x=Yf.squash(L.cause),A=!0;if(A)throw x}}function Qf(f,x){let A=f.getMessageBus(),k=new Set,$={send:(w)=>A.send(w),subscribe:(w,C,N)=>{let b=!0,O=new Set,T=(v)=>{if(!b)return{noop:!0};let Lf,Cf=new Promise((B)=>{Lf=B});O.add(Cf);let h=()=>{O.delete(Cf),Lf()},_f;try{_f=Promise.resolve(C(v))}catch(B){throw h(),B}return _f.then((B)=>{return h(),B},(B)=>{throw h(),B})},p=A.subscribe(w,T,N),G={type:w,originalHandler:C,stopAdmission:()=>{if(!b)return;b=!1,p(),k.delete(G)}};k.add(G);try{x.addIngress({stopAdmission:G.stopAdmission,drain:async()=>{await Promise.all(O)}})}catch(v){throw G.stopAdmission(),v}return G.stopAdmission},unsubscribe:(w,C)=>{let N=[...k].filter((b)=>b.type===w&&b.originalHandler===C);if(N.length===0){A.unsubscribe(w,C);return}for(let b of N)b.stopAdmission()}},M=f.getAttachmentRegistry(),L={...M,register:(w,C,N)=>{let b=!0,O=M.register(w,C,N),T=()=>{if(!b)return;b=!1,O()};return x.addFinalizer(T),T}},V=f.getEntityRegistry(),J=new Proxy(V,{get(w,C){let N=Reflect.get(w,C,w);if(C==="registerEntityType"&&typeof N==="function")return(...b)=>{let O=Reflect.apply(N,w,b),T=b[0];if(typeof T==="string")x.addFinalizer(()=>w.unregisterEntityType(T));return O};return typeof N==="function"?N.bind(w):N}}),W=f.getProfileKindRegistry(),X=new Proxy(W,{get(w,C){let N=Reflect.get(w,C,w);if(C==="register"&&typeof N==="function")return(...b)=>{let O=Reflect.apply(N,w,b),T=b[0];if(typeof T==="string")x.addFinalizer(()=>w.unregisterPlugin(T));return O};return typeof N==="function"?N.bind(w):N}}),uf=f.getDataSourceRegistry(),Pf=new Proxy(uf,{get(w,C){let N=Reflect.get(w,C,w);if(C==="register"&&typeof N==="function")return(...b)=>{let O=Reflect.apply(N,w,b),T=b[0];if(typeof T==="object"&&T!==null&&"id"in T&&typeof T.id==="string"){let p=T.id.includes(":")?T.id:`shell:${T.id}`;x.addFinalizer(()=>w.unregister(p))}return O};return typeof N==="function"?N.bind(w):N}}),Ef=f.getInsightsRegistry(),Sf=new Proxy(Ef,{get(w,C){let N=Reflect.get(w,C,w);if(C==="register"&&typeof N==="function")return(...b)=>{let O=Reflect.apply(N,w,b),T=b[0];if(typeof T==="string")x.addFinalizer(()=>w.unregister(T));return O};return typeof N==="function"?N.bind(w):N}});return new Proxy(f,{get(w,C){if(C==="getMessageBus")return()=>$;if(C==="getAttachmentRegistry")return()=>L;if(C==="getEntityRegistry")return()=>J;if(C==="getDataSourceRegistry")return()=>Pf;if(C==="getProfileKindRegistry")return()=>X;if(C==="getInsightsRegistry")return()=>Sf;let N=Reflect.get(w,C,w);return typeof N==="function"?N.bind(w):N}})}class $f{plugins;events;daemonRegistry;logger;resourceScopes=new Map;releasePromises=new Map;constructor(f,x,A,k){this.plugins=f,this.events=x,this.daemonRegistry=A,this.logger=k.child("PluginLifecycle")}async initializePlugin(f,x,A){let k=this.plugins.get(f);if(!k)throw new H(f,"Registration failed: Plugin is not registered");let $=k.plugin,M=new Af;M.addFinalizer(()=>x.unregisterPluginCapabilities?.(f)),M.addFinalizer(()=>x.getJobQueueService().unregisterPluginHandlers(f)),this.resourceScopes.set(f,M),this.releasePromises.delete(f),this.logger.debug(`Initializing plugin: ${f}`);try{this.events.emit(F.BEFORE_INITIALIZE,f,$);let L=await $.register(Qf(x,M),A);return k.status=_.INITIALIZED,this.logger.debug(`Initialized plugin: ${f}`),this.events.emit(F.INITIALIZED,f,$),L}catch(L){throw this.logger.error(`Error initializing plugin ${f}: ${Y(L)}`),await this.failPluginInitialization(f,L),L}}async finalizePluginRegistration(f){let x=this.plugins.get(f);if(!x)throw new H(f,"Registration finalization failed: Plugin is not registered");if(x.status!==_.INITIALIZED)return;try{await x.plugin.finalizeRegistration?.(),this.logger.debug(`Registration finalized for plugin: ${f}`)}catch(A){throw await this.failPluginInitialization(f,A),A}}async readyPlugin(f){let x=this.plugins.get(f);if(!x)throw new H(f,"Ready failed: Plugin is not registered");if(x.status!==_.INITIALIZED){this.logger.debug(`Skipping ready hook for non-initialized plugin: ${f}`);return}try{await x.plugin.ready?.(),this.logger.debug(`Ready hook completed for plugin: ${f}`)}catch(A){let k=kf(A);x.status=_.ERROR,x.error=k;try{this.events.emit(F.ERROR,f,k)}catch($){this.logger.error(`Plugin error listener failed for ${f}`,$)}throw k}}async startPluginDaemons(f){let x=this.plugins.get(f);if(x?.status!==_.INITIALIZED)return;try{await this.daemonRegistry.startPlugin(f),this.logger.debug(`Started daemons for plugin: ${f}`)}catch(A){if(x.plugin.requiresDaemonStartup?.())throw A;this.logger.warn(`Daemon ${f} failed to start: ${Y(A)}`)}}async failPluginInitialization(f,x){let A=this.plugins.get(f);if(!A)return;let k=A.status!==_.ERROR,$=kf(x);if(A.status=_.ERROR,A.error=$,await this.releasePluginResources(f,Z.fail(x)),k)try{this.events.emit(F.ERROR,f,$)}catch(M){this.logger.error(`Plugin error listener failed for ${f}`,M)}}async disablePlugin(f){let x=this.plugins.get(f);if(!x){this.logger.warn(`Cannot disable plugin ${f}: not registered`);return}if(x.status===_.DISABLED)return;this.logger.debug(`Disabling plugin: ${f}`);let A=x.status===_.ERROR;await this.releasePluginResources(f,Z.void);let k=this.plugins.get(f);if(!A&&k&&k.status!==_.DISABLED)k.status=_.DISABLED,this.events.emit(F.DISABLED,f,k.plugin);this.logger.debug(`Disabled plugin: ${f}`)}releasePluginResources(f,x){let A=this.releasePromises.get(f);if(A)return A;let k=this.releasePluginResourcesOnce(f,x);return this.releasePromises.set(f,k),k}async releasePluginResourcesOnce(f,x){let A=this.plugins.get(f);if(!A)return;try{await this.daemonRegistry.stopPlugin(f),this.logger.debug(`Stopped daemons for plugin: ${f}`)}catch($){this.logger.error(`Failed to stop daemons for plugin: ${f}`,$)}let k=this.resourceScopes.get(f);if(this.resourceScopes.delete(f),k)try{await k.close(x)}catch($){this.logger.error(`Failed to close resources for plugin ${f}`,$)}if(A.plugin.shutdown)try{await A.plugin.shutdown(),this.logger.debug(`Shutdown completed for plugin: ${f}`)}catch($){this.logger.error(`Plugin shutdown failed for ${f}:`,$)}for(let $ of this.daemonRegistry.getByPlugin(f))try{await this.daemonRegistry.unregister($.name)}catch(M){this.logger.error(`Failed to unregister daemon ${$.name} for plugin ${f}`,M)}}}class Mf{plugins;events;logger;constructor(f,x,A){this.plugins=f,this.events=x,this.logger=A.child("DependencyResolver")}async resolveInitializationOrder(f){this.logger.debug("Resolving plugin initialization order...");let x=Array.from(this.plugins.keys()),A=new Set,k=!0;while(k&&A.size<x.length){k=!1;for(let L of x){if(A.has(L))continue;if(!this.plugins.get(L))continue;if(this.getUnmetDependencies(L).length===0)try{await f(L),A.add(L),k=!0}catch(W){let X=Y(W);this.logger.error(`Failed to initialize plugin ${L}: ${X}`),A.add(L),k=!0}}}let $=x.filter((L)=>!A.has(L));if($.length>0){let L=$.join(", ");this.logger.error(`Failed to initialize plugins due to dependency issues: ${L}`);for(let V of $){let J=this.getUnmetDependencies(V);this.logger.error(`Plugin ${V} has unmet dependencies: ${J.join(", ")}`);let W=this.plugins.get(V);if(W)W.status=_.ERROR,W.error=new H(V,`Unmet dependencies: ${J.join(", ")}`);this.events.emit(F.ERROR,V,W?.error)}}let M=new Set;for(let[L,V]of this.plugins)if(V.status===_.INITIALIZED)M.add(L);return this.logger.debug(`Resolved ${M.size} of ${x.length} plugins`),{initialized:M,failed:$}}getUnmetDependencies(f){let x=this.plugins.get(f);if(!x)return[];let{dependencies:A}=x,k=[];for(let $ of A){let M=this.plugins.get($);if(!M){k.push($);continue}if(M.status!==_.INITIALIZED)k.push($)}return k}}class wf{logger;constructor(f){this.logger=f.child("CapabilityRegistrar")}async registerCapabilities(f,x,A){if(A.tools.length>0)f.registerTools(x,A.tools),this.logger.debug(`Registered ${A.tools.length} tools from ${x}`);if(A.resources.length>0)f.registerResources(x,A.resources),this.logger.debug(`Registered ${A.resources.length} resources from ${x}`);if(A.instructions)f.registerInstructions(x,A.instructions),this.logger.debug(`Registered instructions from ${x}`)}}async function Zf(f){let A=(await R.runPromise(R.all(f.map((k)=>R.either(R.tryPromise({try:k,catch:($)=>$}))),{concurrency:"unbounded"}))).find(Gf.isLeft);if(A)throw A.left}class m{static instance=null;plugins=new Map;logger;events=new Xf;daemonRegistry;shell=null;initializedPluginIds=[];pluginLifecycle;dependencyResolver;capabilityRegistrar;static getInstance(f,x){return m.instance??=new m(f,x),m.instance}static resetInstance(){m.instance=null}static createFresh(f,x){return new m(f,x)}setShell(f){this.shell=f}constructor(f,x){this.logger=f.child("PluginManager"),this.events=new Xf,this.daemonRegistry=x,this.pluginLifecycle=new $f(this.plugins,this.events,this.daemonRegistry,f),this.dependencyResolver=new Mf(this.plugins,this.events,f),this.capabilityRegistrar=new wf(f)}registerPlugin(f){if(!f.id)throw new H("unknown","Registration failed: Plugin must have an id");if(this.logger.debug(`Registering plugin: ${f.id} (${f.version})`),this.plugins.has(f.id)){let $=this.plugins.get(f.id)?.plugin.version;throw new H(f.id,`Registration failed: Plugin is already registered with version ${$}`)}let x=f.dependencies??[],A={plugin:f,status:_.REGISTERED,dependencies:x};this.plugins.set(f.id,A),this.logger.debug(`Registered plugin: ${f.id} (${f.version})`),this.events.emit(F.REGISTERED,f.id,f)}async initializePlugins(f){this.logger.debug("Initializing plugins..."),this.initializedPluginIds=[];let x=await this.dependencyResolver.resolveInitializationOrder(async(A)=>{await this.initializePlugin(A,f)});this.logger.debug(`Initialized ${x.initialized.size} of ${this.plugins.size} plugins`)}async initializePlugin(f,x){if(!this.shell)throw new H(f,"Cannot initialize plugin: Shell not set. Call setShell() first.");let A=this.shell;try{let k=await this.pluginLifecycle.initializePlugin(f,A,x);await this.capabilityRegistrar.registerCapabilities(A,f,k),this.initializedPluginIds.push(f)}catch(k){throw await this.pluginLifecycle.failPluginInitialization(f,k),k}}async finalizePluginRegistrations(){this.logger.debug("Finalizing plugin registrations...");for(let f of this.initializedPluginIds)await this.pluginLifecycle.finalizePluginRegistration(f)}async readyPlugins(){this.logger.debug("Dispatching plugin ready hooks...");try{await Zf(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.readyPlugin(f)))}catch(f){for(let x of this.initializedPluginIds){let A=this.plugins.get(x);if(A?.status===_.ERROR)await this.pluginLifecycle.failPluginInitialization(x,A.error??f)}throw f}}async startPluginDaemons(){this.logger.debug("Starting plugin daemons..."),await Zf(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===_.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===_.ERROR&&f[1].error!==void 0).map(([f,x])=>({id:f,error:x.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 x of[...this.initializedPluginIds].reverse())await this.disablePlugin(x),f.add(x);for(let x of[...this.plugins.keys()].reverse())if(!f.has(x))await this.disablePlugin(x)}on(f,x){this.events.on(f,x)}once(f,x){this.events.once(f,x)}off(f,x){this.events.off(f,x)}getEventEmitter(){return this.events}}var fU=U.enum(["generating","draft","queued","published","failed"]),Kf=U.enum(["generating","draft","queued","published","failed"]),xU=U.object({title:U.string(),slug:U.string().optional(),status:fU,publishedAt:U.string().datetime().optional(),excerpt:U.string(),author:U.string(),coverImageId:U.string().optional(),ogImageId:U.string().optional(),seriesName:U.string().optional(),seriesIndex:U.number().optional(),ogImage:U.string().url().optional(),ogDescription:U.string().optional(),twitterCard:U.enum(["summary","summary_large_image"]).optional(),canonicalUrl:U.string().url().optional(),atprotoUri:U.string().optional()}),$N=xU.pick({title:!0,status:!0,publishedAt:!0,seriesName:!0,seriesIndex:!0}).extend({slug:U.string(),error:U.string().optional()}),UU=U.object({title:U.string(),status:Kf,publishedAt:U.string().datetime().optional(),seriesName:U.string().optional(),seriesIndex:U.number().optional(),slug:U.string(),error:U.string().optional()}),AU=U.object({title:U.string(),slug:U.string().optional(),status:Kf,publishedAt:U.string().datetime().optional(),excerpt:U.string(),author:U.string(),coverImageId:U.string().optional(),ogImageId:U.string().optional(),seriesName:U.string().optional(),seriesIndex:U.number().optional(),ogImage:U.string().url().optional(),ogDescription:U.string().optional(),twitterCard:U.enum(["summary","summary_large_image"]).optional(),canonicalUrl:U.string().url().optional(),atprotoUri:U.string().optional()}),kU=Nf.extend({entityType:U.literal("post"),metadata:UU}),qf=kU.extend({frontmatter:AU,body:U.string(),coverImageUrl:U.string().optional()}),MN=qf.extend({url:U.string().optional(),typeLabel:U.string().optional(),listUrl:U.string().optional(),listLabel:U.string().optional(),seriesUrl:U.string().optional(),coverImageUrl:U.string().optional(),ogImageUrl:U.string().optional(),coverImageWidth:U.number().optional(),coverImageHeight:U.number().optional(),coverImageSrcset:U.string().optional(),coverImageSizes:U.string().optional()}),wN=qf.extend({url:U.string(),typeLabel:U.string(),listUrl:U.string(),listLabel:U.string(),seriesUrl:U.string().optional(),coverImageUrl:U.string().optional(),ogImageUrl:U.string().optional(),coverImageWidth:U.number().optional(),coverImageHeight:U.number().optional(),coverImageSrcset:U.string().optional(),coverImageSizes:U.string().optional()});
3
- export{zf as d,Ff as e,tx as f,Q as g,xU as h,kU as i,qf as j,MN as k,wN as l};
4
-
5
- //# debugId=7A02F2B6C9F40B7F64756E2164756E21
6
- //# sourceMappingURL=index-kvac8t2y.js.map