@rizom/brain 0.2.0-alpha.224 → 0.2.0-alpha.225

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/brain.js +1000 -995
  2. package/dist/chunks/blog-post-adapter-tk0z5tgh.js +5 -0
  3. package/dist/chunks/{index-ps0mn8y9.js → index-18d0wj5t.js} +4 -4
  4. package/dist/chunks/{index-ps0mn8y9.js.map → index-18d0wj5t.js.map} +1 -1
  5. package/dist/chunks/{index-px8fmtx1.js → index-1qz89akh.js} +4 -4
  6. package/dist/chunks/{index-px8fmtx1.js.map → index-1qz89akh.js.map} +1 -1
  7. package/dist/chunks/{index-vtwspye3.js → index-48mg443r.js} +3 -3
  8. package/dist/chunks/{index-vtwspye3.js.map → index-48mg443r.js.map} +1 -1
  9. package/dist/chunks/{index-0bjkx8vb.js → index-4xzx30t8.js} +4 -4
  10. package/dist/chunks/{index-0bjkx8vb.js.map → index-4xzx30t8.js.map} +2 -2
  11. package/dist/chunks/{index-gca7xnrh.js → index-e933mq3w.js} +3 -3
  12. package/dist/chunks/{index-gca7xnrh.js.map → index-e933mq3w.js.map} +1 -1
  13. package/dist/chunks/{index-nqjbkf5n.js → index-gaa2742w.js} +3 -3
  14. package/dist/chunks/{index-nqjbkf5n.js.map → index-gaa2742w.js.map} +1 -1
  15. package/dist/chunks/index-gfewwta6.js +6 -0
  16. package/dist/chunks/{index-59y15khc.js.map → index-gfewwta6.js.map} +2 -2
  17. package/dist/chunks/{index-57d1xga4.js → index-h1zmmtbw.js} +4 -4
  18. package/dist/chunks/{index-57d1xga4.js.map → index-h1zmmtbw.js.map} +1 -1
  19. package/dist/chunks/index-jm9vaxsh.js +10 -0
  20. package/dist/chunks/{index-836tm28j.js.map → index-jm9vaxsh.js.map} +8 -8
  21. package/dist/chunks/{index-c93wmj0d.js → index-q53nehd5.js} +4 -4
  22. package/dist/chunks/{index-c93wmj0d.js.map → index-q53nehd5.js.map} +3 -3
  23. package/dist/chunks/index-rng6ka15.js +6 -0
  24. package/dist/chunks/{index-t7hbrpyx.js.map → index-rng6ka15.js.map} +12 -12
  25. package/dist/chunks/{rss-datasource-c67ta2xa.js → rss-datasource-v805vq9d.js} +3 -3
  26. package/dist/chunks/{rss-datasource-c67ta2xa.js.map → rss-datasource-v805vq9d.js.map} +1 -1
  27. package/dist/deploy.js +1 -1
  28. package/dist/entities.js +2 -2
  29. package/dist/entities.js.map +1 -1
  30. package/dist/index.js +2 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/interfaces.js +2 -2
  33. package/dist/interfaces.js.map +1 -1
  34. package/dist/plugins.d.ts +17 -5
  35. package/dist/plugins.js +3 -3
  36. package/dist/plugins.js.map +3 -3
  37. package/dist/seed-content/ranger/anchor-profile/anchor-profile.md +1 -1
  38. package/dist/seed-content/ranger/site-info/site-info.md +1 -0
  39. package/dist/seed-content/relay/site-info/site-info.md +1 -0
  40. package/dist/seed-content/rover-seed-content-core/anchor-profile/anchor-profile.md +1 -1
  41. package/dist/seed-content/rover-seed-content-core/style-guide/style-guide.md +48 -0
  42. package/dist/seed-content/rover-seed-content-default/anchor-profile/anchor-profile.md +1 -1
  43. package/dist/seed-content/rover-seed-content-default/site-info/site-info.md +1 -0
  44. package/dist/seed-content/rover-seed-content-default/style-guide/style-guide.md +48 -0
  45. package/dist/seed-content/rover-seed-content-full/anchor-profile/anchor-profile.md +1 -1
  46. package/dist/seed-content/rover-seed-content-full/site-info/site-info.md +1 -0
  47. package/dist/seed-content/rover-seed-content-full/style-guide/style-guide.md +48 -0
  48. package/dist/services.js +2 -2
  49. package/dist/services.js.map +1 -1
  50. package/dist/site.js +147 -152
  51. package/dist/site.js.map +32 -24
  52. package/dist/templates.js +2 -2
  53. package/dist/templates.js.map +1 -1
  54. package/dist/themes.js +1 -1
  55. package/dist/ui/cms-app.js +121 -121
  56. package/dist/ui/cms-app.js.map +6 -6
  57. package/package.json +1 -1
  58. package/dist/chunks/blog-post-adapter-gny02sy3.js +0 -5
  59. package/dist/chunks/index-59y15khc.js +0 -6
  60. package/dist/chunks/index-836tm28j.js +0 -10
  61. package/dist/chunks/index-t7hbrpyx.js +0 -6
  62. /package/dist/chunks/{blog-post-adapter-gny02sy3.js.map → blog-post-adapter-tk0z5tgh.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.224",
3
+ "version": "0.2.0-alpha.225",
4
4
  "description": "Brain runtime + CLI — scaffold, run, and manage AI brain instances",
5
5
  "keywords": [
6
6
  "brain",
@@ -1,5 +0,0 @@
1
- // @bun
2
- import{a,b}from"./index-59y15khc.js";import"./index-t7hbrpyx.js";import"./index-836tm28j.js";import"./index-px8fmtx1.js";import"./index-0bjkx8vb.js";import"./index-c93wmj0d.js";import"./index-ps0mn8y9.js";import"./index-gca7xnrh.js";import"./index-57d1xga4.js";import"./index-vtwspye3.js";export{b as blogPostAdapter,a as BlogPostAdapter};
3
-
4
- //# debugId=1740B4E5E07C590464756E2164756E21
5
- //# sourceMappingURL=blog-post-adapter-gny02sy3.js.map
@@ -1,6 +0,0 @@
1
- // @bun
2
- import{k as v,l as G}from"./index-t7hbrpyx.js";import{ca as D}from"./index-0bjkx8vb.js";import{Na as z}from"./index-ps0mn8y9.js";class H extends D{constructor(){super({entityType:"post",purpose:"A long-form published article, essay, or blog post written for an audience.",schema:G,frontmatterSchema:v,supportsCoverImage:!0})}toMarkdown(j){let q=this.extractBody(j.content);try{let x=this.parseFrontMatter(j.content,v),I={...x,slug:x.slug??j.metadata.slug};return this.buildMarkdown(q,I)}catch{return q}}fromMarkdown(j){let q=this.parseFrontMatter(j,v),x=q.slug??z(q.title);return{content:j,entityType:"post",metadata:{title:q.title,slug:x,status:q.status,publishedAt:q.publishedAt,seriesName:q.seriesName,seriesIndex:q.seriesIndex}}}parsePostFrontmatter(j){return this.parseFrontMatter(j.content,v)}createPostContent(j,q){return this.buildMarkdown(q,j)}buildStub(j){let q={title:j.title,slug:j.id,status:"generating",excerpt:"",author:"AI"};return{content:this.buildMarkdown("",q),metadata:{title:j.title,slug:j.id,status:"generating"}}}}var M=new H;
3
- export{H as a,M as b};
4
-
5
- //# debugId=CB3E09598E913FD564756E2164756E21
6
- //# sourceMappingURL=index-59y15khc.js.map
@@ -1,10 +0,0 @@
1
- // @bun
2
- import{E as L,G as v,H as Q,I as z,J as _,K as D,L as q,P as x,Q as f,R,S as I,T as FZ,Y as lA,Z as iA}from"./index-0bjkx8vb.js";import{qa as dA,ra as c}from"./index-c93wmj0d.js";import{Ca as M,Da as sA,Ea as HA,Ga as t,Ja as k,za as ZZ}from"./index-ps0mn8y9.js";import{Sa as BZ}from"./index-gca7xnrh.js";import{Za as Z}from"./index-57d1xga4.js";var M$=Z.object({id:Z.string(),sessionId:Z.string(),interfaceType:Z.string(),channelId:Z.string(),channelName:Z.string().optional(),startedAt:Z.string(),lastActiveAt:Z.string(),createdAt:Z.string(),updatedAt:Z.string(),metadata:c}),q$=Z.object({id:Z.string(),conversationId:Z.string(),role:M,content:Z.string(),timestamp:Z.string(),metadata:c});var DA=Z.object({name:Z.string(),role:Z.string(),purpose:Z.string(),values:Z.array(Z.string())}),FA=Z.object({name:Z.string(),kind:Z.enum(["professional","team","collective"]),organization:Z.string().optional(),description:Z.string().optional(),avatar:Z.string().optional(),website:Z.string().optional(),email:Z.string().optional(),socialLinks:Z.array(Z.object({platform:Z.enum(["github","instagram","linkedin","email","website"]),url:Z.string(),label:Z.string().optional()})).optional()});import{createClient as y$}from"@libsql/client";class UA{constructor(A,$){this.name=A,this.unique=$}static[z]="SQLiteIndexBuilderOn";on(...A){return new RA(this.name,A,this.unique)}}class RA{static[z]="SQLiteIndexBuilder";config;constructor(A,$,H){this.config={name:A,columns:$,unique:H,where:void 0}}where(A){return this.config.where=A,this}build(A){return new wA(this.config,A)}}class wA{static[z]="SQLiteIndex";config;constructor(A,$){this.config={...A,table:$}}}function N(A){return new UA(A,!1)}var m=q("conversations",{id:D("id").primaryKey(),sessionId:D("session_id").notNull(),interfaceType:D("interface_type").notNull(),channelId:D("channel_id").notNull(),started:D("started").notNull(),lastActive:D("last_active").notNull(),metadata:D("metadata"),created:D("created").notNull(),updated:D("updated").notNull()},(A)=>({sessionIdx:N("idx_conversations_session").on(A.sessionId),channelIdx:N("idx_conversations_channel").on(A.channelId),interfaceSessionIdx:N("idx_conversations_interface_session").on(A.interfaceType,A.sessionId),interfaceChannelIdx:N("idx_conversations_interface_channel").on(A.interfaceType,A.channelId)})),NA=q("messages",{id:D("id").primaryKey(),conversationId:D("conversation_id").notNull().references(()=>m.id,{onDelete:"cascade"}),role:D("role").notNull(),content:D("content").notNull(),timestamp:D("timestamp").notNull(),metadata:D("metadata")},(A)=>({conversationIdx:N("idx_messages_conversation").on(A.conversationId),timestampIdx:N("idx_messages_timestamp").on(A.timestamp)})),_A=q("summary_tracking",{conversationId:D("conversation_id").primaryKey().references(()=>m.id,{onDelete:"cascade"}),lastSummarizedAt:D("last_summarized_at"),lastMessageId:D("last_message_id"),messagesSinceSummary:_("messages_since_summary").default(0),updated:D("updated").notNull()});var qZ=Z.preprocess((A)=>{if(typeof A!=="string")return A;try{return JSON.parse(A)}catch{return}},Z.record(Z.string(),Z.unknown())).catch({});function T(A){return qZ.parse(A)}var h=Z.object({actorId:Z.string(),canonicalId:Z.string().optional(),interfaceType:Z.string(),role:M,displayName:Z.string().optional(),username:Z.string().optional(),isBot:Z.boolean().optional()}),j=Z.object({messageId:Z.string().optional(),channelId:Z.string().optional(),channelName:Z.string().optional(),threadId:Z.string().optional(),metadata:Z.record(Z.string(),Z.unknown()).optional()}),QZ=Z.looseObject({actor:h.optional(),source:j.optional()});var kZ=Z.object({id:Z.string(),conversationId:Z.string(),role:Z.string(),content:Z.string(),timestamp:Z.string(),metadata:Z.string().nullable()}),EZ=Z.object({conversationId:Z.string(),messageCount:Z.number(),messages:Z.array(kZ),windowStart:Z.number(),windowEnd:Z.number(),windowSize:Z.number(),timestamp:Z.string()});var LA=Z.object({kind:Z.string().min(1),id:Z.string().min(1)}),TZ=Z.object({kind:Z.literal("text"),filename:Z.string().min(1),mediaType:Z.string().min(1),content:Z.string(),sizeBytes:Z.number().nonnegative().optional(),source:LA.optional()}),SZ=Z.custom((A)=>A instanceof Uint8Array),xZ=Z.object({kind:Z.literal("file"),filename:Z.string().min(1),mediaType:Z.string().min(1),data:SZ,sizeBytes:Z.number().nonnegative().optional(),source:LA.optional()}),yZ=Z.discriminatedUnion("kind",[TZ,xZ]),B1=Z.object({userPermissionLevel:Z.enum(["anchor","trusted","public"]).optional(),interfaceType:Z.string().optional(),channelId:Z.string().optional(),channelName:Z.string().optional(),actor:h.optional(),source:j.optional(),attachments:Z.array(yZ).optional()});var zZ=Z.object({status:Z.enum(["healthy","warning","error","unknown"]),message:Z.string().optional(),lastCheck:Z.date().optional(),details:Z.record(Z.string(),Z.unknown()).optional()}),OA=Z.object({name:Z.string(),pluginId:Z.string(),status:Z.string(),health:zZ.optional()});import{McpServer as v1,ResourceTemplate as I1}from"@modelcontextprotocol/sdk/server/mcp.js";var BA=Z.object({interfaceType:Z.string(),userId:Z.string(),conversationId:Z.string().optional(),channelId:Z.string().optional(),channelName:Z.string().optional(),runId:Z.string().optional(),toolCallId:Z.string().optional(),userPermissionLevel:Z.enum(["anchor","trusted","public"]).optional()}),CA=Z.strictObject({success:Z.literal(!0),data:Z.unknown().optional(),message:Z.string().optional(),cached:Z.literal(!0).optional()}),MA=Z.strictObject({success:Z.literal(!1),error:Z.string(),code:Z.string().optional()}),qA=Z.strictObject({needsConfirmation:Z.literal(!0),toolName:Z.string(),summary:Z.string(),completionSummary:Z.string().optional(),preview:Z.string().optional(),args:Z.unknown()}),d=Z.union([CA,MA,qA]);var T1=Z.union([Z.looseObject({success:Z.literal(!0)}),Z.object({success:Z.literal(!1),error:Z.string()})]);var mZ=Z.union([Z.object({success:Z.literal(!0),data:Z.unknown(),message:Z.string().optional()}),Z.object({success:Z.literal(!1),error:Z.string(),code:Z.string().optional()})]);var J4=Z.object({id:Z.string(),type:Z.string(),version:Z.string(),status:Z.string()}),T4=Z.object({name:Z.string(),description:Z.string()}),QA=Z.enum(["anchor","trusted","public"]),l=Z.object({label:Z.string(),url:Z.string(),pluginId:Z.string(),priority:Z.number().default(100),visibility:QA.default("public")}),hZ=Z.enum(["human","agent","admin","protocol"]),jZ=Z.enum(["available","coming-soon","disabled"]),i=Z.object({id:Z.string(),label:Z.string(),description:Z.string().optional(),href:Z.string(),kind:hZ,pluginId:Z.string(),priority:Z.number().default(100),visibility:QA.default("public"),status:jZ.default("available")}),n=Z.object({entityType:Z.string(),count:Z.number()}),S4=Z.object({model:Z.string(),version:Z.string(),uptime:Z.number(),entities:Z.number(),entityCounts:Z.array(n),embeddings:Z.number(),ai:Z.object({model:Z.string(),embeddingModel:Z.string()}),daemons:Z.array(OA),endpoints:Z.array(l),interactions:Z.array(i)});var x4=Z.object({id:Z.string(),version:Z.string(),type:Z.enum(["core","entity","service","interface"]),description:Z.string().optional(),dependencies:Z.array(Z.string()).optional(),packageName:Z.string()});var vZ=Z.object({status:Z.enum(["healthy","warning","error","unknown"]),message:Z.string().optional(),lastCheck:Z.string().optional(),details:Z.record(Z.string(),Z.unknown()).optional()}),IZ=Z.object({name:Z.string(),pluginId:Z.string(),status:Z.string(),health:vZ.optional()}),j4=Z.object({model:Z.string(),version:Z.string(),uptime:Z.number(),entities:Z.number(),entityCounts:Z.array(n),embeddings:Z.number(),ai:Z.object({model:Z.string(),embeddingModel:Z.string()}),daemons:Z.array(IZ),endpoints:Z.array(l),interactions:Z.array(i)});var g4=Z.object({enabled:Z.boolean().describe("Whether the plugin is enabled"),debug:Z.boolean().describe("Enable debug logging for this plugin")});class r extends Error{pluginId;issues;constructor(A,$){super(`Invalid plugin config for ${A}`);this.name="PluginConfigValidationError",this.pluginId=A,this.issues=$}}var a=Z.enum(["file_operations","content_operations","data_processing","batch_processing"]),gZ=Z.object({pluginId:Z.string().optional(),progressToken:Z.union([Z.string(),Z.number()]).optional(),operationType:a,operationTarget:Z.string().optional(),interfaceType:Z.string().optional(),conversationId:Z.string().optional(),channelId:Z.string().optional(),silent:Z.boolean().optional()}),E=Z.object({pluginId:Z.string().optional(),progressToken:Z.union([Z.string(),Z.number()]).optional(),operationType:a,operationTarget:Z.string().optional(),interfaceType:Z.string().optional(),conversationId:Z.string().optional(),channelId:Z.string().optional(),silent:Z.boolean().optional(),rootJobId:Z.string()}),u4=Z.enum(["none","skip","replace","coalesce"]);var s=Z.enum(["pending","processing","completed","failed"]),kA=Z.enum(["completed","failed"]);var bZ=Z.object({id:Z.string(),type:Z.string(),status:s,data:Z.unknown(),result:Z.unknown().optional(),lastError:Z.string().optional().nullable(),attempts:Z.number(),maxRetries:Z.number(),priority:Z.number(),createdAt:Z.date(),updatedAt:Z.date(),processedAt:Z.date().optional().nullable(),completedAt:Z.date().optional().nullable(),failedAt:Z.date().optional().nullable()}),pZ=Z.object({jobId:Z.string(),type:Z.string(),status:kA,result:Z.unknown().optional(),error:Z.string().optional()}),EA=Z.object({success:Z.literal(!1),error:Z.string().optional()}),o=Z.object({id:Z.string(),type:Z.enum(["job","batch"]),status:s,message:Z.string().optional(),progress:Z.object({current:Z.number(),total:Z.number(),percentage:Z.number()}).optional(),aggregationKey:Z.string().optional(),batchDetails:Z.object({totalOperations:Z.number(),completedOperations:Z.number(),failedOperations:Z.number(),currentOperation:Z.string().optional(),errors:Z.array(Z.string()).optional()}).optional(),jobDetails:Z.object({jobType:Z.string(),priority:Z.number(),retryCount:Z.number()}).optional(),metadata:E});var uZ=Z.record(Z.string(),Z.unknown());class fA{logger;schema;jobTypeName;constructor(A,$){this.logger=A,this.schema=$.schema,this.jobTypeName=$.jobTypeName}validateAndParse(A){if(!this.schema)throw Error(`${this.jobTypeName}: No schema provided. Override validateAndParse() or provide a schema.`);let $=this.schema.safeParse(A);if(!$.success)return this.logger.warn(`Invalid ${this.jobTypeName} job data`,{data:A,validationError:$.error.issues}),null;return this.logger.debug(`${this.jobTypeName} job data validation successful`,{data:this.summarizeDataForLog($.data)}),$.data}async onError(A,$,H,X){this.logger.error(`${this.jobTypeName} job error handler triggered`,{jobId:H,errorMessage:A.message,errorStack:A.stack,data:this.summarizeDataForLog($)})}async reportProgress(A,$){await A.report({progress:$.progress,total:$.total??100,message:$.message})}summarizeDataForLog(A){let $=uZ.safeParse(A);return $.success?$.data:{}}}import{createClient as e4}from"@libsql/client";var JA=q("job_queue",{id:D("id").primaryKey().$defaultFn(()=>Q()),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")},(A)=>({queueReadyIdx:N("idx_job_queue_ready").on(A.status,A.priority,A.scheduledFor),jobTypeIdx:N("idx_job_queue_type").on(A.type,A.status),jobSourceIdx:N("idx_job_queue_source").on(A.source)}));var K6=Z.looseObject({deduplicationKey:Z.string().optional()});class O{callback;heartbeatInterval;constructor(A){this.callback=A}static from(A){if(!A)return;return new O(A)}createSub(A){let{scale:$}=A??{};if($){let{start:H,end:X}=$,Y=X-H;return new O(async(W)=>{let K=H+W.progress/(W.total??100)*Y;await this.callback({...W,progress:K,total:100})})}return new O(this.callback)}async report(A){await this.callback(A)}startHeartbeat(A,$=5000){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.report({message:A,progress:0}).catch(()=>{})},$)}stopHeartbeat(){if(this.heartbeatInterval)clearInterval(this.heartbeatInterval),this.heartbeatInterval=void 0}toCallback(){return this.callback}}var I6=Z.preprocess((A)=>{if(typeof A!=="string")return A;return JSON.parse(A)},Z.record(Z.string(),Z.unknown()));var lZ=Z.object({id:Z.string(),type:Z.string(),data:Z.string(),status:Z.enum(["pending","processing","completed","failed"]),source:Z.string().nullable(),priority:Z.number(),retryCount:Z.number(),maxRetries:Z.number(),lastError:Z.string().nullable(),createdAt:Z.number(),scheduledFor:Z.number(),startedAt:Z.number().nullable(),completedAt:Z.number().nullable(),metadata:E,result:Z.unknown().nullable().optional()});function e(A,$,H){return async(X)=>{let{type:Y,data:W,toolContext:K=null,options:G}=X,{metadata:P,...V}=G??{},F={source:$,...G?.rootJobId&&{rootJobId:G.rootJobId},...V,metadata:{operationType:"data_processing",pluginId:$,...K&&{interfaceType:K.interfaceType,channelId:K.channelId},...P}},U=H&&!Y.includes(":")?`${$}:${Y}`:Y;return A.enqueue({type:U,data:W,options:F})}}function AA(A,$){return async(H,X)=>{let Y=Q(),W=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 A.enqueueBatch(W,K,Y,$),Y}}function ZA(A,$){return(H,X)=>{let Y=H.includes(":")?H:`${$}:${H}`;A.registerHandler(Y,X,$)}}var iZ=Z.custom((A)=>typeof A==="object"&&A!==null&&("safeParse"in A)),nZ=Z.object({name:Z.string(),schema:iZ});function TA(A){return nZ.safeParse(A).success}function rZ(A){if(!A)return;return{status:A.status,message:A.message,lastCheck:A.lastCheck?.toISOString(),details:A.details}}function SA(A){return{model:A.model,version:A.version,uptime:A.uptime,entities:A.entities,entityCounts:A.entityCounts,embeddings:A.embeddings,ai:A.ai,daemons:A.daemons.map(($)=>({name:$.name,pluginId:$.pluginId,status:$.status,health:rZ($.health)})),endpoints:A.endpoints,interactions:A.interactions}}function aZ(A){let $=M.safeParse(A);return $.success?$.data:"user"}function g(A){let $=T(A.metadata),H=typeof $.channelName==="string"?$.channelName:void 0;return{id:A.id,sessionId:A.sessionId,interfaceType:A.interfaceType,channelId:A.channelId,channelName:H,startedAt:A.started,lastActiveAt:A.lastActive,createdAt:A.created,updatedAt:A.updated,metadata:$}}function xA(A){return{id:A.id,conversationId:A.conversationId,role:aZ(A.role),content:A.content,timestamp:A.timestamp,metadata:T(A.metadata)}}function yA(A){return DA.parse(A)}function zA(A){return FA.parse(A)}function mA(A){return async()=>{return SA(await A.getAppInfo())}}function hA(A,$){return{get:()=>yA(A.getIdentity()),getProfile:()=>zA(A.getProfile()),getAppInfo:$}}function jA(A,$,H){let X=A.getMessageBus();return{send:async(W)=>{return X.send({...W,sender:$})},subscribe:(W,K)=>{if(TA(W)){let G=W,P=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:C,...w}=F;return P(U.data,w)};return X.subscribe(G.name,V)}return X.subscribe(W,K)}}}function vA(A,$){let H=A.getJobQueueService();return{...A.jobs,enqueue:e(H,$,!0),enqueueBatch:AA(A.jobs,$),registerHandler:ZA(H,$)}}function IA(A){let $=A.getPermissionService();return{assertEntityActionAllowed:(H,X,Y)=>{$.assertEntityActionAllowed(H,X,Y.userPermissionLevel)}}}function gA(A){return{get:async($)=>{let X=await A.getConversationService().getConversation($);return X?g(X):null},search:async($)=>{return(await A.getConversationService().searchConversations($)).map(g)},list:async($)=>{return(await A.getConversationService().listConversations($)).map(g)},getMessages:async($,H)=>{return(await A.getConversationService().getMessages($,H)).map(xA)},countMessages:async($)=>{return A.getConversationService().countMessages($)}}}function bA(A,$){return{registerHandler:(H,X)=>{A.registerEvalHandler($,H,X)}}}function pA(A){return{register:($,H)=>{A.getInsightsRegistry().register($,H)}}}function uA(A,$){return{register:(H)=>{A.registerEndpoint({...H,pluginId:$})}}}function cA(A,$){return{register:(H)=>{A.registerInteraction({...H,pluginId:$})}}}function J(A,$,H){let X=A.getEntityService(),Y=A.getLogger().child($),W=A.getDomain(),K=A.getLocalSiteUrl(),G=A.shouldPreferLocalUrls(),P=A.getThemeCSS(),V=mA(A),F=A.getAttachmentRegistry(),U=A.getRuntimeUploadRegistry(),C=A.getRuntimeState();return{pluginId:$,logger:Y,entityService:X,semantic:{project:(w)=>X.projectSemanticSpace(w)},identity:hA(A,V),appInfo:V,judge:(w)=>A.judge(w),domain:W,siteUrl:W?`https://${W}`:void 0,localSiteUrl:K,previewUrl:W?`https://${dA(W)}`:void 0,preferLocalUrls:G,themeCSS:P,entityDisplay:H?.entityDisplay,spaces:A.getSpaces(),permissions:IA(A),messaging:jA(A,$,Y),jobs:vA(A,$),attachments:F,uploads:U,runtimeState:C,recurringChecks:A.getRecurringChecks($),conversations:gA(A),dataDir:A.getDataDir(),eval:bA(A,$),insights:pA(A),endpoints:uA(A,$),interactions:cA(A,$)}}function sZ(A){return A.replace(/:/g,"-")}function oZ(A){return A.split(/[:.-]/).map(($)=>$.charAt(0).toUpperCase()+$.slice(1)).join(" ")}var $A=new Map;async function nA(A,$,H){let X=$A.get($);if(X!==void 0)return X;let Y=sZ($),W;try{W=await A.getEntity({entityType:"prompt",id:Y})}catch{return H}if(W?.content){let K=iA(W.content,Z.record(Z.string(),Z.unknown())).content;return $A.set($,K),K}try{let K=oZ($),G=lA(H,{title:K,target:$});await A.createEntity({entity:{id:Y,entityType:"prompt",content:G,metadata:{title:K,target:$,slug:Y}}})}catch{}return $A.set($,H),H}function b(A){let $=A.getEntityService(),H=A.getEntityRegistry(),X=A.getDataSourceRegistry();return{register:(Y,W,K,G)=>{H.registerEntityType(Y,W,K,G)},getAdapter:(Y)=>{try{return H.getAdapter(Y)}catch{return}},extendFrontmatterSchema:(Y,W)=>{H.extendFrontmatterSchema(Y,W)},getEffectiveFrontmatterSchema:(Y)=>{return H.getEffectiveFrontmatterSchema(Y)},registerCreateInterceptor:(Y,W)=>{H.registerCreateInterceptor(Y,W)},registerUploadSaveHandler:(Y)=>{H.registerUploadSaveHandler(Y)},getUploadSaveHandler:(Y)=>{return H.getUploadSaveHandler(Y)},update:async(Y)=>{return $.updateEntity({entity:Y})},registerDataSource:(Y)=>{X.register(Y)}}}function p(A){return{resolve:($,H)=>{return nA(A,$,H)}}}function rA(A,$,H){let X=J(A,$,H),Y=A.getEntityService();return{...X,entityService:Y,entities:b(A),ai:{query:(W,K)=>A.query(W,K),generate:async(W)=>{return A.generateContent(W)},generateObject:async(W,K,G)=>{return A.generateObject(W,K,G)},generateImage:async(W,K)=>{return A.generateImage(W,K)},canGenerateImages:()=>{return A.canGenerateImages()}},prompts:p(Y),permissions:X.permissions}}function oA(A,$,H){let X=!1,Y=!1;if(A.jobs.registerHandler(H.job.type,H.job.handler),H.initialSync){let W=H.initialSync;A.messaging.subscribe(sA.initialCompleted,async()=>{if(X)return{success:!0};if(X=!0,!(await W.shouldEnqueue?.()??!0))return $.info("Skipping derived entity projection initial sync",{projectionId:H.id,targetType:H.targetType}),{success:!0};return Y=await aA(A,$,H,W.jobData,eZ(W.jobOptions),"initial-sync"),{success:!0}})}if(H.sourceChange){let W=H.sourceChange,K=new Set(W.sourceTypes),G=W.events??[HA.created,HA.updated],P=async(V)=>{if(W.requireInitialSync&&!X)return{success:!0};let F=V.payload,U=tZ(W,F);if(!U||!K.has("*")&&!K.has(U))return{success:!0};if(!(await W.shouldEnqueue?.(F)??!0))return{success:!0};let w=await W.jobData(F);if(!w)return{success:!0};return await aA(A,$,H,w,W.jobOptions?.(F),"source-change"),{success:!0}};for(let V of G)A.messaging.subscribe(V,P)}return{hasObservedInitialSync:()=>X,hasQueuedInitialSync:()=>Y}}function tZ(A,$){if(A.sourceType)return A.sourceType;if(A.sourceKind&&A.sourceKind!=="entity")return A.sourceKind;return $.entityType}async function aA(A,$,H,X,Y,W){try{return await A.jobs.enqueue({type:H.job.type,data:X,...Y?{options:Y}:{}}),$.info("Queued derived entity projection",{projectionId:H.id,targetType:H.targetType,reason:W}),!0}catch(K){return $.error("Failed to queue derived entity projection",{projectionId:H.id,targetType:H.targetType,reason:W,error:L(K)}),!1}}function eZ(A){return typeof A==="function"?A():A}var A$=Z.object({toolName:Z.string(),args:Z.unknown(),progressToken:Z.union([Z.string(),Z.number()]).optional(),hasProgress:Z.boolean().optional(),interfaceType:Z.string(),userId:Z.string(),conversationId:Z.string().optional(),channelId:Z.string().optional(),channelName:Z.string().optional(),runId:Z.string().optional(),toolCallId:Z.string().optional(),userPermissionLevel:Z.enum(["anchor","trusted","public"]).optional(),signal:Z.custom((A)=>A instanceof AbortSignal).optional()}),Z$=Z.object({resourceUri:Z.string()});class B{id;version;description;packageName;config;context;get logger(){return this.context?.logger??v.createFresh({context:this.id})}constructor(A,$,H,X){this.id=A,this.packageName=$.name,this.version=$.version,this.description=$.description??`${$.name} plugin`;let Y=X.safeParse(H);if(!Y.success)throw new r(A,Y.error.issues.map((W)=>({path:W.path.map(String).join("."),code:W.code,message:W.message})));this.config=Y.data}setupMessageHandlers(A){A.messaging.subscribe(k.toolExecute(this.id),async($)=>{try{let H=A$.safeParse($.payload);if(!H.success)return{success:!1,error:"Invalid tool execution request format"};let{toolName:X,args:Y,progressToken:W,hasProgress:K,interfaceType:G,userId:P,conversationId:V,channelId:F,channelName:U,runId:C,toolCallId:w,userPermissionLevel:KA,signal:PA}=H.data,VA=(await this.getTools()).find((u)=>u.name===X);if(!VA)return{success:!1,error:`Tool not found: ${X}`};let MZ={interfaceType:G,userId:P,...V&&{conversationId:V},...F&&{channelId:F},...U&&{channelName:U},...C&&{runId:C},...w&&{toolCallId:w},...KA&&{userPermissionLevel:KA},...PA&&{signal:PA},...K&&W!==void 0&&{progressToken:W,sendProgress:async(u)=>{await A.messaging.send({type:k.progress(this.id),payload:{progressToken:W,notification:u}})}}};return{success:!0,data:await VA.handler(Y,MZ)}}catch(H){return this.logger.error("Tool execution error",H),{success:!1,error:L(H)}}}),A.messaging.subscribe(k.resourceGet(this.id),async($)=>{try{let H=Z$.safeParse($.payload);if(!H.success)return{success:!1,error:"Invalid resource get request format"};let{resourceUri:X}=H.data,W=(await this.getResources()).find((G)=>G.uri===X);if(!W)return{success:!1,error:`Resource not found: ${X}`};return{success:!0,data:await W.handler()}}catch(H){return this.logger.error("Resource fetch error",H),{success:!1,error:L(H)}}})}async onRegister(A){}async onReady(A){}async ready(){await this.onReady(this.getContext())}async getCapabilities(){let A=await this.getInstructions();return{tools:await this.getTools(),resources:await this.getResources(),...A&&{instructions:A}}}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(A){return"public"}createProgressBridge(A){if(!A)return;let $=this.context;if(!$)return;let H=this.id;return O.from(async(X)=>{await $.messaging.send({type:k.progress(H),payload:{progressToken:A,notification:{progress:X.progress,total:X.total,message:X.message}}})})}}var i0=Z.object({});class tA extends B{type="entity";entityActionPolicy;derivedEntityProjectionControllers=new Map;constructor(A,$,H,X,Y){super(A,$,H,X);if(Y!==void 0)this.entityActionPolicy=Y}async register(A,$){let H=rA(A,this.id,$);if(this.context=H,this.setupMessageHandlers(H),H.entities.register(this.entityType,this.schema,this.adapter,this.getEntityTypeConfig()),this.interceptCreate!==tA.prototype.interceptCreate)H.entities.registerCreateInterceptor(this.entityType,(P,V)=>this.interceptCreate(P,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)A.registerTemplates(Y,this.id);let W=this.getDataSources();for(let P of W)H.entities.registerDataSource(P);let K=this.getDerivedEntityProjections(H);for(let P of K){let V=oA(H,this.logger,P);this.derivedEntityProjectionControllers.set(P.id,V)}await this.onRegister(this.context);let G=await this.getInstructions();return{tools:[],resources:[],...G&&{instructions:G}}}async interceptCreate(A,$,H){return{kind:"continue",input:A}}createGenerationHandler(A){return null}getTemplates(){return null}getDataSources(){return[]}getEntityTypeConfig(){return}getDerivedEntityProjections(A){return[]}getDerivedEntityProjectionController(A){return this.derivedEntityProjectionControllers.get(A)}}function eA(A){return ZZ(A)}function AZ(A){if(!A)return;return{...A.userPermissionLevel&&{userPermissionLevel:A.userPermissionLevel},...A.interfaceType&&{interfaceType:A.interfaceType},...A.channelId&&{channelId:A.channelId},...A.channelName&&{channelName:A.channelName},...A.actor&&{actor:A.actor},...A.source&&{source:A.source},...A.attachments&&{attachments:A.attachments}}}function $Z(A){return{chat:async($,H,X,Y)=>{let W=AZ(X),K=Y?await A.chat($,H,W,Y):await A.chat($,H,W);return eA(K)},confirmPendingAction:async($,H,X,Y,W)=>{let K=AZ(Y);if(!K)throw Error("Confirmation requires caller context.");let G=W?await A.confirmPendingAction($,H,X,K,W):await A.confirmPendingAction($,H,X,K);return eA(G)},invalidate:()=>{A.invalidateAgent()}}}function HZ(A,$,H){let X=J(A,$,H),Y=A.getMCPService(),W=A.getPermissionService(),K=$Z(A.getAgentService());return{...X,mcpTransport:Y,agent:K,permissions:{...X.permissions,getUserLevel:(G,P,V)=>{return W.determineUserLevel(G,P,V)}},daemons:{register:(G,P)=>{let V=`${$}:${G}`;A.registerDaemon(V,P,$),X.logger.debug(`Registered daemon: ${V}`)}},conversations:{...X.conversations,start:async(G)=>{return A.getConversationService().startConversation(G)},addMessage:async(G)=>{await A.getConversationService().addMessage(G)},updateMetadata:async(G)=>{return A.getConversationService().updateConversationMetadata(G)},delete:async(G)=>{return A.getConversationService().deleteConversation(G)}},tools:{listForPermissionLevel:(G)=>{return A.listToolsForPermissionLevel(G)}},apiRoutes:{getRoutes:()=>{return A.getPluginApiRoutes()},getMessageBus:()=>{return A.getMessageBus()}},webRoutes:{getRoutes:()=>{return A.getPluginWebRoutes()}},plugins:{has:(G)=>A.hasPlugin(G)}}}var $$=3600000;class XA extends B{type="interface";daemon;jobTrackingEntries=new Map;jobTrackingTtlMs=$$;async register(A,$){let H=HZ(A,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(A){}async registerDaemon(A){if(!this.daemon)return;A.daemons.register(this.id,this.daemon),A.logger.debug(`Registered daemon for interface: ${this.id}`)}createDaemon(){return}requiresDaemonStartup(){return!1}getWebRoutes(){return[]}initializeDaemon(){let A=this.createDaemon();if(A)this.daemon=A}async handleProgressEvent(A,$){}cleanupExpiredEntries(){let A=Date.now(),$=[];for(let[H,X]of this.jobTrackingEntries)if(A-X.createdAt>this.jobTrackingTtlMs)$.push(H);for(let H of $)this.jobTrackingEntries.delete(H)}ownsJob(A,$){return this.jobTrackingEntries.has(A)||$!==void 0&&this.jobTrackingEntries.has($)}getJobTracking(A,$){let H=this.jobTrackingEntries.get(A);if(H)return H.info;if($){let X=this.jobTrackingEntries.get($);if(X)return X.info}return}setJobTracking(A,$){this.cleanupExpiredEntries(),this.jobTrackingEntries.set(A,{info:$,createdAt:Date.now()})}removeJobTracking(A){this.jobTrackingEntries.delete(A)}async createJobWithTracking(A,$){let X=await this.getContext().jobs.enqueue(A);return this.setJobTracking(X,$),X}async createBatchWithTracking(A,$,H){let Y=await this.getContext().jobs.enqueueBatch(A,H);return this.setJobTracking(Y,$),Y}}function y(A,$){return{state:$,toolName:A.toolName,conversationId:A.conversationId,interfaceType:A.interfaceType,...A.channelId!==void 0&&{channelId:A.channelId},...A.channelName!==void 0&&{channelName:A.channelName},...A.error!==void 0&&{error:A.error}}}function XZ(A,$){return A.pendingConfirmations?.some((H)=>H.toolName===$)===!0||H$(A.cards).some((H)=>H.toolName===$)}function H$(A){return A?.filter(($)=>$.kind==="tool-approval"&&$.state==="approval-requested")??[]}var YA=1e5,X$=[".md",".txt",".markdown"],Y$=["text/plain","text/markdown","text/x-markdown"],W$=/https?:\/\/[^\s<>"{}|\\^`[\]]+?(?=[,;:\s]|$)/gi,G$=["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"],K$=Z.object({captureUrls:Z.boolean().default(!1),blockedUrlDomains:Z.array(Z.string()).default(G$)});function YZ(A,$){if($&&Y$.some((H)=>$.startsWith(H)))return!0;return X$.some((H)=>A.toLowerCase().endsWith(H))}function WZ(A){return A<=YA}function GZ(A){if(A.includes(0))return!1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(A),!0}catch{return!1}}function KZ(A,$){return`User uploaded a file "${A}":
3
-
4
- ${$}`}function PZ(A,$){let H=A.match(W$)??[];return[...new Set(H)].filter((X)=>{try{let{hostname:Y}=new URL(X);return!$.some((W)=>Y===W||Y.endsWith(`.${W}`))}catch{return!1}})}function WA(A,$){let H=A.attachment.source;if((H?.entityType==="document"||H?.entityType==="image")&&H.entityId)return{entityType:H.entityType,id:H.entityId};return P$(A.attachment.downloadUrl??A.attachment.url,$)}function P$(A,$="http://local"){if(!A)return;let H;try{H=new URL(A,$)}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 VZ(A,$){let H=V$($,A==="document"?/^application\/pdf$/i:/^image\/[a-z0-9.+-]+$/i);if(!H)return;if(A==="document"&&H.mimeType.toLowerCase()!=="application/pdf")return;return H}function DZ(A,$,H,X){let Y=A?.filename;if(typeof Y==="string"&&Y.trim())return Y;if(H==="document")return`${$}.pdf`;let W=A?.format;if(typeof W==="string"&&W.trim())return`${$}.${W==="jpeg"?"jpg":W}`;let K=X.split("/")[1]?.split("+")[0]??"png";return`${$}.${K}`}function V$(A,$){let H=A.match(/^data:([^;]+);base64,(.+)$/i),X=H?.[1],Y=H?.[2];if(!X||!Y||!$.test(X))return;let W=Buffer.from(Y,"base64");return{mimeType:X,data:W.buffer.slice(W.byteOffset,W.byteOffset+W.byteLength)}}async function UZ({entityRef:A,userLevel:$,getEntity:H,getVisibleEntity:X}){let Y=FZ($),W=await X(A,Y);if(W)return{status:"visible",entity:W};return Boolean(await H(A))?{status:"denied"}:{status:"missing"}}function RZ(A){return A==="anchor"||A==="trusted"}function wZ(A,$){A.messaging.subscribe(t.progress,async(H)=>{try{let X=o.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 NZ(A){let $=A.status==="completed"?"\u2705":"\u274C",H=A.status==="completed"?"completed":"failed",X=A.metadata.operationType.replace(/_/g," "),Y=A.metadata.operationTarget?`: ${A.metadata.operationTarget}`:"",W=`${$} **${X}${Y}** ${H}`;if(A.message)W+=`
5
- ${A.message}`;return W}function _Z(A){let $=A.metadata.operationType.replace(/_/g," "),H=A.metadata.operationTarget?`: ${A.metadata.operationTarget}`:"",X=`\uD83D\uDD04 **${$}${H}**`;if(A.progress&&A.progress.total>0)X+=` ${A.progress.current}/${A.progress.total} (${A.progress.percentage}%)`;if(A.message)X+=`
6
- ${A.message}`;return X}var D$=Z.enum(["tool:invoking","tool:completed","tool:failed"]),F$=Z.object({toolName:Z.string().min(1),conversationId:Z.string().min(1),interfaceType:Z.string().min(1),channelId:Z.string().min(1).optional(),channelName:Z.string().min(1).optional(),toolCallId:Z.string().min(1).optional(),error:Z.string().optional()}),U$=["tool:invoking","tool:completed","tool:failed"];function LZ(A,$){for(let H of U$)A.messaging.subscribe(H,async(X)=>{try{let Y=D$.safeParse(X.type),W=F$.safeParse(X.payload);if(!Y.success||!W.success)return $.onInvalidSchema(),{success:!1};return await $.onToolActivity({type:Y.data,...W.data}),{success:!0}}catch(Y){return $.onError(Y),{success:!1}}})}class GA{scope;fibers;delayMs;clock;closePromise=null;closed=!1;constructor(A,$){this.delayMs=A,this.clock=$?.clock,this.scope=R.runSync(f.make()),this.fibers=R.runSync(f.extend(I.make(),this.scope))}schedule(A,$){if(this.closed)return;let H=R.sleep(this.delayMs).pipe(R.andThen(R.sync($))),X=this.clock?R.withClock(H,this.clock):H,Y=R.runFork(X);I.unsafeSet(this.fibers,A,Y)}close(){return this.closed=!0,this.closePromise??=R.runPromise(f.close(this.scope,x.void)),this.closePromise}}var OZ=500,R$=500;class w$ extends XA{isUploadableTextFile(A,$){return YZ(A,$)}isFileSizeAllowed(A){return WZ(A)}formatFileUploadMessage(A,$){return KZ(A,$)}getMaxFileUploadBytes(){return YA}isLikelyTextContent(A){return GZ(A)}async resolveNativeArtifactDelivery(A){let $=[],H=new Set;if(!this.context||!A.cards)return{files:$,deniedCardIds:H};let X=this.context;for(let Y of A.cards){if(Y.kind!=="attachment")continue;let W=WA(Y,A.displayBaseUrl);if(!W)continue;let K=await UZ({entityRef:W,userLevel:A.userPermissionLevel,getEntity:(P)=>X.entityService.getEntity(P),getVisibleEntity:(P,V)=>X.entityService.getEntity({...P,visibilityScope:V})});if(K.status==="denied"){H.add(Y.id);continue}if(K.status!=="visible")continue;if(!RZ(A.userPermissionLevel))continue;if(typeof K.entity.content!=="string")continue;let G=VZ(W.entityType,K.entity.content);if(!G)continue;if(A.maxBytes!==void 0&&G.data.byteLength>A.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??DZ(K.entity.metadata,W.id,W.entityType,G.mimeType),mimeType:G.mimeType})}return{files:$,deniedCardIds:H}}extractCaptureableUrls(A,$){return PZ(A,$)}async captureUrlViaAgent(A,$,H,X,Y){if(!this.context)return;let W=this.context.permissions.getUserLevel(X,H,Y);await this.context.agent.chat(`Save this link: ${A}`,`links-${$}`,{userPermissionLevel:W,interfaceType:X,channelId:$})}progressEvents=new Map;progressCleanupSupervisor=new GA(R$);sendMessageWithId(A){return Promise.resolve(void 0)}editMessage(A){return Promise.resolve(!1)}supportsMessageEditing(){return!1}progressCallback;isProcessingInput=!1;currentChannelId=null;bufferedCompletionMessages=[];progressMessageTracking=new Map;agentResponseTracking=new Map;pendingToolCompletions=new Map;registerProgressCallback(A){this.progressCallback=A;let $=Array.from(this.progressEvents.values()).filter((H)=>H.status==="processing");A($)}unregisterProgressCallback(){delete this.progressCallback}trackAgentResponseForJob(A,$,H){this.agentResponseTracking.set(A,{messageId:$,channelId:H,lastUpdate:Date.now()}),this.logger.debug("Tracking agent response for job",{jobId:A,messageId:$,channelId:H})}async onRegister(A){await super.onRegister(A),wZ(A,{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})}}),LZ(A,{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(A,$){if(!this.shouldHandleProgressEvent(A))return;this.updateProgressState(A);let H=A.metadata.channelId??null,X=A.metadata.rootJobId;if(await this.handleProcessingProgress(A,H,X))return;if(A.status==="completed"||A.status==="failed")await this.handleTerminalProgress(A,H,X);await this.onProgressUpdate(A),this.logProgressProcessed(A)}shouldHandleProgressEvent(A){let $=A.metadata.interfaceType;return!$||$===this.id}updateProgressState(A){this.progressEvents.set(A.id,A),this.notifyProgressCallback()}async handleProcessingProgress(A,$,H){if(A.status!=="processing"||!this.supportsMessageEditing())return!1;let X=this.agentResponseTracking.get(A.id);if(X)return await this.editTrackedProgressMessage(A,X),!0;let Y=this.formatProgressOutput(A),W=this.progressMessageTracking.get(H),K=Date.now();if(W){if(K-W.lastUpdate>=OZ)await this.editMessage({channelId:W.channelId,messageId:W.messageId,newMessage:Y}),W.lastUpdate=K}else if($&&!this.isProcessingInput)await this.sendInitialProgressMessage(H,$,Y,K);return!1}async editTrackedProgressMessage(A,$){let H=Date.now();if(H-$.lastUpdate<OZ)return;await this.editMessage({channelId:$.channelId,messageId:$.messageId,newMessage:this.formatProgressOutput(A)}),$.lastUpdate=H}async sendInitialProgressMessage(A,$,H,X){let Y=await this.sendMessageWithId({channelId:$,message:H});if(!Y)return;this.progressMessageTracking.set(A,{messageId:Y,channelId:$,lastUpdate:X}),this.logger.debug("Tracking progress message",{rootJobId:A,messageId:Y,channelId:$})}async handleTerminalProgress(A,$,H){let X=this.formatCompletionOutput(A),Y=this.progressMessageTracking.get(H),W=this.agentResponseTracking.get(A.id);if(this.logger.debug("Completion event received",{eventId:A.id,rootJobId:H,hasProgressTracking:!!Y,hasAgentTracking:!!W,supportsEditing:this.supportsMessageEditing()}),this.supportsMessageEditing())await this.updateTrackedCompletion(A,X,Y,W,H);if(!Y&&!W&&$)this.sendOrBufferCompletionMessage(X,$);this.scheduleProgressCleanup(A.id)}async updateTrackedCompletion(A,$,H,X,Y){if(X){if(await this.editMessage({channelId:X.channelId,messageId:X.messageId,newMessage:$}),this.agentResponseTracking.delete(A.id),H)this.progressMessageTracking.delete(Y);return}if(H)await this.editMessage({channelId:H.channelId,messageId:H.messageId,newMessage:$}),this.progressMessageTracking.delete(Y)}sendOrBufferCompletionMessage(A,$){if(this.isProcessingInput){this.bufferedCompletionMessages.push({message:A,channelId:$});return}this.sendMessageToChannel({channelId:$,message:A})}scheduleProgressCleanup(A){this.progressCleanupSupervisor.schedule(A,()=>{this.progressEvents.delete(A),this.notifyProgressCallback()})}logProgressProcessed(A){this.logger.debug("Progress event processed",{eventId:A.id,status:A.status,operationType:A.metadata.operationType,targetChannel:A.metadata.channelId})}formatProgressOutput(A){return _Z(A)}formatCompletionOutput(A){return NZ(A)}async onProgressUpdate(A){}async handleToolActivityEvent(A){if(A.interfaceType!==this.id)return;switch(A.type){case"tool:invoking":this.pendingToolCompletions.delete(this.getToolCompletionKey(A)),await this.handleToolStatusUpdate(y(A,"running"));return;case"tool:completed":if(this.isProcessingInput){this.pendingToolCompletions.set(this.getToolCompletionKey(A),A);return}await this.handleToolStatusUpdate(y(A,"completed"));return;case"tool:failed":this.pendingToolCompletions.delete(this.getToolCompletionKey(A)),await this.handleToolStatusUpdate(y(A,"failed"));return}}async handleToolStatusUpdate(A){}async handleAgentResponseToolStatuses(A,$){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=XZ(A,X.toolName)?"awaiting-approval":"completed";await this.handleToolStatusUpdate(y(X,Y))}}getToolCompletionKey(A){return`${A.interfaceType}:${A.conversationId}:${A.toolName}`}notifyProgressCallback(){if(this.progressCallback){let A=Array.from(this.progressEvents.values());this.progressCallback(A)}}getProgressEvents(){return Array.from(this.progressEvents.values())}getActiveProgressEvents(){return Array.from(this.progressEvents.values()).filter((A)=>A.status==="processing")}startProcessingInput(A=null){this.isProcessingInput=!0,this.currentChannelId=A}endProcessingInput(){this.isProcessingInput=!1;for(let{message:A,channelId:$}of this.bufferedCompletionMessages)this.sendMessageToChannel({channelId:$,message:A});this.bufferedCompletionMessages=[],this.currentChannelId=null}getCurrentChannelId(){return this.currentChannelId}}function CZ(A,$,H){let X=J(A,$,H),Y=A.getEntityService(),W=A.getRenderService(),K=A.getContentService();return{...X,entityService:Y,entities:b(A),webRoutes:{getRoutes:()=>A.getPluginWebRoutes()},templates:{register:(G,P)=>{A.registerTemplates(G,P??$)},format:(G,P)=>{return K.formatContent(G,P,{pluginId:$})},parse:(G,P)=>{return K.parseContent(G,P,$)},resolve:async(G,P)=>{return await K.resolveContent(G,P,$)},getCapabilities:(G)=>{let P=G.includes(":")?G:`${$}:${G}`,V=A.getTemplate(P);if(!V)return null;let F=BZ.getCapabilities(V);return{canGenerate:F.canGenerate,canFetch:F.canFetch,canRender:F.canRender,isStaticOnly:F.isStaticOnly}}},views:{get:(G)=>{return W.get(G)??void 0},list:()=>{return W.list()},hasRenderer:(G,P="web")=>{return W.hasRenderer(G,P)},getRenderer:(G,P="web")=>{return W.getRenderer(G,P)},validate:(G,P)=>{return W.validate(G,P)}},prompts:p(Y),ai:{query:(G,P)=>A.query(G,P),generate:async(G)=>{return A.generateContent(G)},generateObject:async(G,P,V)=>{return A.generateObject(G,P,V)},generateImage:async(G,P)=>{return A.generateImage(G,P)},canGenerateImages:()=>{return A.canGenerateImages()}},registerInstructions:(G)=>{A.registerInstructions($,G)}}}class N$ extends B{type="service";getApiRoutes(){return[]}getWebRoutes(){return[]}async register(A,$){let H=CZ(A,this.id,$);return this.context=H,this.setupMessageHandlers(H),await this.onRegister(H),this.getCapabilities()}get entityService(){return this.getContext().entityService}registerEntityType(A,$,H,X){this.getContext().entities.register(A,$,H,X)}async enqueueJob(A){return this.getContext().jobs.enqueue(A)}async enqueueBatch(A,$){return this.getContext().jobs.enqueueBatch(A,$)}async registerEntityTypes(A){}async registerJobHandlers(A){}async onRegister(A){await this.registerEntityTypes(A),await this.registerJobHandlers(A)}}
7
- export{fA as p,M$ as q,q$ as r,DA as s,FA as t,i0 as u,tA as v,XA as w,w$ as x,N$ as y,B1 as z,j4 as A};
8
-
9
- //# debugId=F33DF31996262F9964756E2164756E21
10
- //# sourceMappingURL=index-836tm28j.js.map
@@ -1,6 +0,0 @@
1
- // @bun
2
- import{p as a}from"./index-836tm28j.js";import{$ as g,E as Y,F as $f,M as Gf,O as Qf,P as X,Q as z,R as W,V as G,W as Lf,X as q,Z as xf,aa as Of,ba as E,ca as o,da as s}from"./index-0bjkx8vb.js";import{Ba as uf,Fa as c,La as P,va as e,wa as r}from"./index-ps0mn8y9.js";import{Za as x}from"./index-57d1xga4.js";var lf={pluginsRegistered:"system:plugins:registered",initialSyncCompleted:"sync:initial:completed"};var h=/^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 KU=x.object({id:x.string().regex(h),ref:x.object({kind:x.string().min(1),id:x.string().regex(h)}),filename:x.string().min(1),mediaType:x.string().min(1),sizeBytes:x.number().nonnegative(),createdAt:x.string().datetime(),metadata:x.record(x.string(),x.unknown()).optional()});function I(f){if(typeof f!=="object"||f===null||!("entityId"in f))return;let U=f.entityId;return typeof U==="string"&&U.trim().length>0?U.trim():void 0}function bf(f){if(typeof f!=="object"||f===null||!("coverImage"in f))return;let U=f.coverImage;if(U===void 0||U===!1)return;if(U===!0)return{generate:!0};if(typeof U!=="object"||U===null)return;let k=U;if(k.generate===!1)return;let A=k.prompt?.trim();return{generate:!0,...A&&{prompt:A}}}function l(f){return Object.fromEntries(Object.entries(f).filter(([,U])=>U!==void 0))}function Vf(f){let U={...f};return delete U.status,delete U.error,l(U)}class Hf extends a{context;entityType;constructor(f,U,k){super(f,{schema:k.schema,jobTypeName:k.jobTypeName});this.context=U,this.entityType=k.entityType}async afterCreate(f,U,k,A){}async onGenerationFailure(f,U){}validateAndParse(f){let U=super.validateAndParse(f);if(!U)return null;let k=bf(f);if(typeof U!=="object")return U;let A=I(f);if(!k&&!A)return U;return Object.assign(U,{...k&&{coverImage:k},...A&&{entityId:A}}),U}async process(f,U,k){try{await this.reportProgress(k,{progress:P.START,message:`Starting ${this.jobTypeName}`});let A=await this.generate(f,k),$=I(f),M=$?this.applyPreallocatedEntityId($,A):A;await this.reportProgress(k,{progress:P.SAVE,message:`Saving ${this.entityType} to database`});let w=$?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,w.entityId,k,M),await this.enqueueGenericCoverImageIfRequested(f,w.entityId,k,M),await this.reportProgress(k,{progress:P.COMPLETE,message:`${M.title??this.entityType} created successfully`}),{success:!0,entityId:w.entityId,...M.resultExtras}}catch(A){if(A instanceof t)return await this.markPreallocatedStubFailed(f,A.message),await this.onGenerationFailure(f,A.message),{success:!1,error:A.message};let $=Y(A);return this.logger.error(`${this.jobTypeName} job failed`,{error:A,jobId:U,data:this.summarizeDataForLog(f)}),await this.markPreallocatedStubFailed(f,$),await this.onGenerationFailure(f,$),uf.failure(A)}}applyPreallocatedEntityId(f,U){let k={...U.metadata},A=U.content,$=U.resultExtras;if(typeof k.slug==="string")k.slug=f,A=E(A,"slug",f),$={...$,slug:f};return{...U,id:f,content:A,metadata:k,...$&&{resultExtras:$}}}async updatePreallocatedStub(f,U){let k=await this.context.entityService.getEntity({entityType:this.entityType,id:f,visibilityScope:"restricted"});if(!k)throw Error(`Pre-allocated entity stub not found: ${this.entityType}/${f}`);let A=this.mergeStubWithGenerated(k,U);return this.context.entityService.updateEntity({entity:{...k,id:f,entityType:this.entityType,content:A.content,metadata:A.metadata}})}mergeStubWithGenerated(f,U){let k=Vf(g(f.content).frontmatter),A=Vf(f.metadata),$=l(U.metadata),M=g(U.content),w=l(M.frontmatter),T=l({...k,...$,...w});return this.context.entities.getEffectiveFrontmatterSchema(this.entityType)?.parse(T),{content:Of(T,M.content),metadata:{...A,...$}}}async markPreallocatedStubFailed(f,U){let k=I(f);if(!k)return;try{let A=await this.context.entityService.getEntity({entityType:this.entityType,id:k,visibilityScope:"restricted"});if(!A)return;await this.context.entityService.updateEntity({entity:{...A,content:E(E(A.content,"status","failed"),"error",U),metadata:{...A.metadata,status:"failed",error:U}}})}catch(A){this.logger.warn("Failed to mark generation stub as failed",{error:A,entityId:k,entityType:this.entityType})}}async enqueueGenericCoverImageIfRequested(f,U,k,A){let $=bf(f);if(!$)return;await this.reportProgress(k,{progress:90,message:"Queueing cover image generation"});let M=A.title??U;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:U,entityTitle:M,entityContent:A.content},toolContext:{interfaceType:"job",userId:"system"}})}failEarly(f){throw new t(f)}}class t extends Error{constructor(f){super(f);this.name="GenerationFailure"}}var nf=x.object({kind:x.string().min(1),id:x.string().min(1)}),sf=x.object({kind:x.string().min(1),filename:x.string().min(1),mediaType:x.string().min(1),sizeBytes:x.number().nonnegative().optional(),source:nf.optional()}),hU=x.array(sf),IU=x.array(r),gU=x.array(e),tU=x.record(x.string(),x.unknown());var iU=x.record(x.string(),x.unknown());var $k=x.record(x.string(),x.unknown());var zf=new Map([[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"],[".gif","image/gif"],[".pdf","application/pdf"]]),wk=new Set(zf.values());async function tx(f){let{entityType:U,title:k,deriveId:A,regeneratePrompt:$,context:M}=f,w=A(k),T=await M.entityService.getEntity({entityType:U,id:w});if(!T||T.metadata.status==="generating")return k;M.logger.debug(`Entity ID collision: ${U}/${w}, asking AI for a new title`);let F=x.object({title:x.string().max(80).describe("A short, unique title (2-6 words)")}),{object:J}=await M.ai.generateObject(`The title "${k}" is already taken. ${$}`,F),B=J.title;return M.logger.debug(`AI suggested new title: "${B}"`),B}var i=G.extend({id:x.literal("brain-character"),entityType:x.literal("brain-character")}),S=x.object({name:x.string().describe("The brain's friendly display name"),role:x.string().describe("The brain's primary role"),purpose:x.string().describe("The brain's purpose and goals"),values:x.array(x.string()).describe("Core values that guide behavior")});var Df=x.record(x.string(),x.unknown());class n extends o{constructor(){super({entityType:"brain-character",purpose:"The brain's own identity, character, and purpose (singleton).",schema:i,frontmatterSchema:S,isSingleton:!0,hasBody:!1})}createCharacterContent(f){return this.buildMarkdown("",f)}parseCharacterBody(f){return this.parseFrontmatter(f)}toMarkdown(f){let U=this.parseFrontmatter(f.content);return this.buildMarkdown("",Df.parse(U))}fromMarkdown(f){return{content:f,entityType:"brain-character"}}extractMetadata(f){let U=this.parseFrontmatter(f.content);return{role:U.role,values:U.values}}generateFrontMatter(f){let U=this.parseFrontmatter(f.content);return this.buildMarkdown("",Df.parse(U))}}class R extends s{static instance=null;adapter=new n;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,U,k){return R.instance??=new R(f,U,k),R.instance}static resetInstance(){R.instance=null}static createFresh(f,U,k){return new R(f,U,k)}constructor(f,U,k){super(f,U,"brain-character",k??R.getDefaultCharacter(),q("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 ff=G.extend({id:x.literal("anchor-profile"),entityType:x.literal("anchor-profile")}),Q=x.object({name:x.string().describe("Name (person or organization)"),kind:x.enum(["professional","team","collective"]).describe("Type of anchor: professional (individual), team, or collective"),organization:x.string().optional().describe("Organization the anchor belongs to"),description:x.string().optional().describe("Short description or biography"),avatar:x.string().optional().describe("URL or asset path to avatar/logo"),website:x.string().optional().describe("Primary website URL"),email:x.string().optional().describe("Contact email"),socialLinks:x.array(x.object({platform:x.enum(["github","instagram","linkedin","email","website"]).describe("Social media platform"),url:x.string().describe("Profile or contact URL"),label:x.string().optional().describe("Optional display label")})).optional().describe("Social media and contact links")});var ax=x.record(x.string(),x.unknown());class K extends o{constructor(){super({entityType:"anchor-profile",purpose:"The profile of the brain's anchor owner (singleton).",schema:ff,frontmatterSchema:Q,isSingleton:!0,hasBody:!0})}createProfileContent(f){let U=Q.parse(f);return this.buildMarkdown("",U)}parseProfileBody(f,U){if(U){let{metadata:k,content:A}=xf(f,U);return A?{...k,story:A}:k}return this.parseFrontmatter(f)}fromMarkdown(f){return{content:f,entityType:"anchor-profile"}}extractMetadata(f){let U=this.parseFrontmatter(f.content);return{name:U.name,email:U.email,website:U.website}}generateFrontMatter(f){let U=this.parseFrontmatter(f.content);return this.buildMarkdown("",ax.parse(U))}}var Uf=x.object({tagline:x.string().optional().describe("Short, punchy one-liner for homepage"),intro:x.string().optional().describe("Optional longer introduction for homepage"),story:x.string().optional().describe("Extended bio/narrative (multi-paragraph markdown)")}),jf=Uf.extend({role:x.string().optional().describe("Professional role or working identity"),audience:x.string().optional().describe("Primary audience or community served"),expertise:x.array(x.string()).optional().describe("Skills, domains, areas of focus"),currentFocus:x.string().optional().describe("What you're currently working on"),availability:x.string().optional().describe("What you're open to (consulting, speaking, etc.)"),desiredTone:x.string().optional().describe("Preferred tone for profile-shaped outputs")});async function kf(f){let k=(await f.listEntities({entityType:"anchor-profile",options:{limit:1}}))[0];if(!k)throw Error("Profile not found \u2014 create an anchor-profile entity");return k.content}async function Yf(f,U){let k=await kf(f);return new K().parseProfileBody(k,U)}class m extends s{static instance=null;adapter=new K;static getDefaultProfile(){return{name:"Unknown",kind:"professional"}}static getInstance(f,U,k){return m.instance??=new m(f,U,k),m.instance}static resetInstance(){m.instance=null}static createFresh(f,U,k){return new m(f,U,k)}constructor(f,U,k){super(f,U,"anchor-profile",k??m.getDefaultProfile(),q("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 Bf=x.looseObject({id:x.string(),description:x.string(),name:x.string().optional(),tags:x.array(x.string()).optional().default([])});var dx=x.looseObject({uri:x.string(),params:x.record(x.string(),x.unknown()).optional()}),ex=x.looseObject({name:x.string(),url:x.string(),description:x.string().optional(),skills:x.array(Bf).optional().default([]),capabilities:x.looseObject({extensions:x.array(dx).optional().default([])}).optional()});var rx=x.object({name:x.string(),description:x.string(),tags:x.array(x.string()),examples:x.array(x.string())});import{EventEmitter as Xf}from"events";var _={REGISTERED:"registered",INITIALIZED:"initialized",ERROR:"error",DISABLED:"disabled"},u={REGISTERED:"plugin:registered",BEFORE_INITIALIZE:"plugin:before_initialize",INITIALIZED:"plugin:initialized",ERROR:"plugin:error",DISABLED:"plugin:disabled"};class H extends Error{pluginId;constructor(f,U){super(`Plugin ${f}: ${U}`);this.name="PluginError",this.pluginId=f}}class Af{scope;ingress=new Set;closePromise=null;closed=!1;constructor(){this.scope=W.runSync(z.make())}addFinalizer(f){if(this.closed)throw Error("Cannot register a resource after plugin teardown");W.runSync(z.addFinalizer(this.scope,W.promise(async()=>{await f()})))}addIngress(f){if(this.closed)throw Error("Cannot register ingress after plugin teardown");this.ingress.add(f)}close(f=X.void){return this.closed=!0,this.closePromise??=this.closeScope(f),this.closePromise}async closeScope(f){let U,k=!1,A=[...this.ingress].reverse();for(let T of A)try{T.stopAdmission()}catch(F){if(!k)U=F;k=!0}let $=await Promise.allSettled(A.map((T)=>Promise.resolve().then(()=>T.drain())));this.ingress.clear();let M=$.find((T)=>T.status==="rejected");if(!k&&M)U=M.reason,k=!0;let w=await W.runPromiseExit(z.close(this.scope,f));if(!k&&X.isFailure(w))U=Qf.squash(w.cause),k=!0;if(k)throw U}}function Kf(f,U){let k=f.getMessageBus(),A=new Set,$={send:(N)=>k.send(N),subscribe:(N,C,L)=>{let b=!0,O=new Set,V=(y)=>{if(!b)return{noop:!0};let Cf,_f=new Promise((j)=>{Cf=j});O.add(_f);let v=()=>{O.delete(_f),Cf()},Tf;try{Tf=Promise.resolve(C(y))}catch(j){throw v(),j}return Tf.then((j)=>{return v(),j},(j)=>{throw v(),j})},p=k.subscribe(N,V,L),Z={type:N,originalHandler:C,stopAdmission:()=>{if(!b)return;b=!1,p(),A.delete(Z)}};A.add(Z);try{U.addIngress({stopAdmission:Z.stopAdmission,drain:async()=>{await Promise.all(O)}})}catch(y){throw Z.stopAdmission(),y}return Z.stopAdmission},unsubscribe:(N,C)=>{let L=[...A].filter((b)=>b.type===N&&b.originalHandler===C);if(L.length===0){k.unsubscribe(N,C);return}for(let b of L)b.stopAdmission()}},M=f.getAttachmentRegistry(),w={...M,register:(N,C,L)=>{let b=!0,O=M.register(N,C,L),V=()=>{if(!b)return;b=!1,O()};return U.addFinalizer(V),V}},T=f.getEntityRegistry(),F=new Proxy(T,{get(N,C){let L=Reflect.get(N,C,N);if(C==="registerEntityType"&&typeof L==="function")return(...b)=>{let O=Reflect.apply(L,N,b),V=b[0];if(typeof V==="string")U.addFinalizer(()=>N.unregisterEntityType(V));return O};return typeof L==="function"?L.bind(N):L}}),J=f.getDataSourceRegistry(),B=new Proxy(J,{get(N,C){let L=Reflect.get(N,C,N);if(C==="register"&&typeof L==="function")return(...b)=>{let O=Reflect.apply(L,N,b),V=b[0];if(typeof V==="object"&&V!==null&&"id"in V&&typeof V.id==="string"){let p=V.id.includes(":")?V.id:`shell:${V.id}`;U.addFinalizer(()=>N.unregister(p))}return O};return typeof L==="function"?L.bind(N):L}}),Pf=f.getInsightsRegistry(),Ef=new Proxy(Pf,{get(N,C){let L=Reflect.get(N,C,N);if(C==="register"&&typeof L==="function")return(...b)=>{let O=Reflect.apply(L,N,b),V=b[0];if(typeof V==="string")U.addFinalizer(()=>N.unregister(V));return O};return typeof L==="function"?L.bind(N):L}});return new Proxy(f,{get(N,C){if(C==="getMessageBus")return()=>$;if(C==="getAttachmentRegistry")return()=>w;if(C==="getEntityRegistry")return()=>F;if(C==="getDataSourceRegistry")return()=>B;if(C==="getInsightsRegistry")return()=>Ef;let L=Reflect.get(N,C,N);return typeof L==="function"?L.bind(N):L}})}class Mf{plugins;events;daemonRegistry;logger;resourceScopes=new Map;releasePromises=new Map;constructor(f,U,k,A){this.plugins=f,this.events=U,this.daemonRegistry=k,this.logger=A.child("PluginLifecycle")}async initializePlugin(f,U,k){let A=this.plugins.get(f);if(!A)throw new H(f,"Registration failed: Plugin is not registered");let $=A.plugin,M=new Af;M.addFinalizer(()=>U.unregisterPluginCapabilities?.(f)),M.addFinalizer(()=>U.getJobQueueService().unregisterPluginHandlers(f)),this.resourceScopes.set(f,M),this.releasePromises.delete(f),this.logger.debug(`Initializing plugin: ${f}`);try{this.events.emit(u.BEFORE_INITIALIZE,f,$);let w=await $.register(Kf(U,M),k);return A.status=_.INITIALIZED,this.logger.debug(`Initialized plugin: ${f}`),this.events.emit(u.INITIALIZED,f,$),w}catch(w){throw this.logger.error(`Error initializing plugin ${f}: ${Y(w)}`),await this.failPluginInitialization(f,w),w}}async readyPlugin(f){let U=this.plugins.get(f);if(!U)throw new H(f,"Ready failed: Plugin is not registered");if(U.status!==_.INITIALIZED){this.logger.debug(`Skipping ready hook for non-initialized plugin: ${f}`);return}try{await U.plugin.ready?.(),this.logger.debug(`Ready hook completed for plugin: ${f}`)}catch(k){let A=$f(k);U.status=_.ERROR,U.error=A;try{this.events.emit(u.ERROR,f,A)}catch($){this.logger.error(`Plugin error listener failed for ${f}`,$)}throw A}}async startPluginDaemons(f){let U=this.plugins.get(f);if(U?.status!==_.INITIALIZED)return;try{await this.daemonRegistry.startPlugin(f),this.logger.debug(`Started daemons for plugin: ${f}`)}catch(k){if(U.plugin.requiresDaemonStartup?.())throw k;this.logger.warn(`Daemon ${f} failed to start: ${Y(k)}`)}}async failPluginInitialization(f,U){let k=this.plugins.get(f);if(!k)return;let A=k.status!==_.ERROR,$=$f(U);if(k.status=_.ERROR,k.error=$,await this.releasePluginResources(f,X.fail(U)),A)try{this.events.emit(u.ERROR,f,$)}catch(M){this.logger.error(`Plugin error listener failed for ${f}`,M)}}async disablePlugin(f){let U=this.plugins.get(f);if(!U){this.logger.warn(`Cannot disable plugin ${f}: not registered`);return}if(U.status===_.DISABLED)return;this.logger.debug(`Disabling plugin: ${f}`);let k=U.status===_.ERROR;await this.releasePluginResources(f,X.void);let A=this.plugins.get(f);if(!k&&A&&A.status!==_.DISABLED)A.status=_.DISABLED,this.events.emit(u.DISABLED,f,A.plugin);this.logger.debug(`Disabled plugin: ${f}`)}releasePluginResources(f,U){let k=this.releasePromises.get(f);if(k)return k;let A=this.releasePluginResourcesOnce(f,U);return this.releasePromises.set(f,A),A}async releasePluginResourcesOnce(f,U){let k=this.plugins.get(f);if(!k)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 A=this.resourceScopes.get(f);if(this.resourceScopes.delete(f),A)try{await A.close(U)}catch($){this.logger.error(`Failed to close resources for plugin ${f}`,$)}if(k.plugin.shutdown)try{await k.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 wf{plugins;events;logger;constructor(f,U,k){this.plugins=f,this.events=U,this.logger=k.child("DependencyResolver")}async resolveInitializationOrder(f){this.logger.debug("Resolving plugin initialization order...");let U=Array.from(this.plugins.keys()),k=new Set,A=!0;while(A&&k.size<U.length){A=!1;for(let w of U){if(k.has(w))continue;if(!this.plugins.get(w))continue;if(this.getUnmetDependencies(w).length===0)try{await f(w),k.add(w),A=!0}catch(J){let B=Y(J);this.logger.error(`Failed to initialize plugin ${w}: ${B}`),k.add(w),A=!0}}}let $=U.filter((w)=>!k.has(w));if($.length>0){let w=$.join(", ");this.logger.error(`Failed to initialize plugins due to dependency issues: ${w}`);for(let T of $){let F=this.getUnmetDependencies(T);this.logger.error(`Plugin ${T} has unmet dependencies: ${F.join(", ")}`);let J=this.plugins.get(T);if(J)J.status=_.ERROR,J.error=new H(T,`Unmet dependencies: ${F.join(", ")}`);this.events.emit(u.ERROR,T,J?.error)}}let M=new Set;for(let[w,T]of this.plugins)if(T.status===_.INITIALIZED)M.add(w);return this.logger.debug(`Resolved ${M.size} of ${U.length} plugins`),{initialized:M,failed:$}}getUnmetDependencies(f){let U=this.plugins.get(f);if(!U)return[];let{dependencies:k}=U,A=[];for(let $ of k){let M=this.plugins.get($);if(!M){A.push($);continue}if(M.status!==_.INITIALIZED)A.push($)}return A}}class Nf{logger;constructor(f){this.logger=f.child("CapabilityRegistrar")}async registerCapabilities(f,U,k){if(k.tools.length>0)f.registerTools(U,k.tools),this.logger.debug(`Registered ${k.tools.length} tools from ${U}`);if(k.resources.length>0)f.registerResources(U,k.resources),this.logger.debug(`Registered ${k.resources.length} resources from ${U}`);if(k.instructions)f.registerInstructions(U,k.instructions),this.logger.debug(`Registered instructions from ${U}`)}}async function Zf(f){let k=(await W.runPromise(W.all(f.map((A)=>W.either(W.tryPromise({try:A,catch:($)=>$}))),{concurrency:"unbounded"}))).find(Gf.isLeft);if(k)throw k.left}class D{static instance=null;plugins=new Map;logger;events=new Xf;daemonRegistry;shell=null;initializedPluginIds=[];pluginLifecycle;dependencyResolver;capabilityRegistrar;static getInstance(f,U){return D.instance??=new D(f,U),D.instance}static resetInstance(){D.instance=null}static createFresh(f,U){return new D(f,U)}setShell(f){this.shell=f}constructor(f,U){this.logger=f.child("PluginManager"),this.events=new Xf,this.daemonRegistry=U,this.pluginLifecycle=new Mf(this.plugins,this.events,this.daemonRegistry,f),this.dependencyResolver=new wf(this.plugins,this.events,f),this.capabilityRegistrar=new Nf(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 U=f.dependencies??[],k={plugin:f,status:_.REGISTERED,dependencies:U};this.plugins.set(f.id,k),this.logger.debug(`Registered plugin: ${f.id} (${f.version})`),this.events.emit(u.REGISTERED,f.id,f)}async initializePlugins(f){this.logger.debug("Initializing plugins..."),this.initializedPluginIds=[];let U=await this.dependencyResolver.resolveInitializationOrder(async(k)=>{await this.initializePlugin(k,f)});this.logger.debug(`Initialized ${U.initialized.size} of ${this.plugins.size} plugins`)}async initializePlugin(f,U){if(!this.shell)throw new H(f,"Cannot initialize plugin: Shell not set. Call setShell() first.");let k=this.shell;try{let A=await this.pluginLifecycle.initializePlugin(f,k,U);await this.capabilityRegistrar.registerCapabilities(k,f,A),this.initializedPluginIds.push(f)}catch(A){throw await this.pluginLifecycle.failPluginInitialization(f,A),A}}async readyPlugins(){this.logger.debug("Dispatching plugin ready hooks...");try{await Zf(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.readyPlugin(f)))}catch(f){for(let U of this.initializedPluginIds){let k=this.plugins.get(U);if(k?.status===_.ERROR)await this.pluginLifecycle.failPluginInitialization(U,k.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,U])=>({id:f,error:U.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 U of[...this.initializedPluginIds].reverse())await this.disablePlugin(U),f.add(U);for(let U of[...this.plugins.keys()].reverse())if(!f.has(U))await this.disablePlugin(U)}on(f,U){this.events.on(f,U)}once(f,U){this.events.once(f,U)}off(f,U){this.events.off(f,U)}getEventEmitter(){return this.events}}var ix=x.enum(["generating","draft","queued","published","failed"]),of=x.enum(["generating","draft","queued","published","failed"]),fU=x.object({title:x.string(),slug:x.string().optional(),status:ix,publishedAt:x.string().datetime().optional(),excerpt:x.string(),author:x.string(),coverImageId:x.string().optional(),ogImageId:x.string().optional(),seriesName:x.string().optional(),seriesIndex:x.number().optional(),ogImage:x.string().url().optional(),ogDescription:x.string().optional(),twitterCard:x.enum(["summary","summary_large_image"]).optional(),canonicalUrl:x.string().url().optional(),atprotoUri:x.string().optional()}),fN=fU.pick({title:!0,status:!0,publishedAt:!0,seriesName:!0,seriesIndex:!0}).extend({slug:x.string(),error:x.string().optional()}),xU=x.object({title:x.string(),status:of,publishedAt:x.string().datetime().optional(),seriesName:x.string().optional(),seriesIndex:x.number().optional(),slug:x.string(),error:x.string().optional()}),UU=x.object({title:x.string(),slug:x.string().optional(),status:of,publishedAt:x.string().datetime().optional(),excerpt:x.string(),author:x.string(),coverImageId:x.string().optional(),ogImageId:x.string().optional(),seriesName:x.string().optional(),seriesIndex:x.number().optional(),ogImage:x.string().url().optional(),ogDescription:x.string().optional(),twitterCard:x.enum(["summary","summary_large_image"]).optional(),canonicalUrl:x.string().url().optional(),atprotoUri:x.string().optional()}),kU=Lf.extend({entityType:x.literal("post"),metadata:xU}),qf=kU.extend({frontmatter:UU,body:x.string(),coverImageUrl:x.string().optional()}),xN=qf.extend({url:x.string().optional(),typeLabel:x.string().optional(),listUrl:x.string().optional(),listLabel:x.string().optional(),seriesUrl:x.string().optional(),coverImageUrl:x.string().optional(),ogImageUrl:x.string().optional(),coverImageWidth:x.number().optional(),coverImageHeight:x.number().optional(),coverImageSrcset:x.string().optional(),coverImageSizes:x.string().optional()}),UN=qf.extend({url:x.string(),typeLabel:x.string(),listUrl:x.string(),listLabel:x.string(),seriesUrl:x.string().optional(),coverImageUrl:x.string().optional(),ogImageUrl:x.string().optional(),coverImageWidth:x.number().optional(),coverImageHeight:x.number().optional(),coverImageSrcset:x.string().optional(),coverImageSizes:x.string().optional()});
3
- export{lf as d,Hf as e,tx as f,Q as g,Uf as h,jf as i,Yf as j,fU as k,kU as l,qf as m,xN as n,UN as o};
4
-
5
- //# debugId=36DB131612A5B36664756E2164756E21
6
- //# sourceMappingURL=index-t7hbrpyx.js.map