@rizom/brain 0.2.0-alpha.216 → 0.2.0-alpha.218
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.
- package/dist/brain.js +947 -967
- package/dist/chunks/blog-post-adapter-nwgbah59.js +5 -0
- package/dist/chunks/{index-fjp4jadv.js → index-457w4zv3.js} +4 -4
- package/dist/chunks/{index-fjp4jadv.js.map → index-457w4zv3.js.map} +1 -1
- package/dist/chunks/{index-gmfgjnnw.js → index-7j5wm2z5.js} +3 -3
- package/dist/chunks/{index-gmfgjnnw.js.map → index-7j5wm2z5.js.map} +1 -1
- package/dist/chunks/{index-e2c4agdd.js → index-c7ehmqhv.js} +4 -4
- package/dist/chunks/{index-e2c4agdd.js.map → index-c7ehmqhv.js.map} +1 -1
- package/dist/chunks/{index-whpvp633.js → index-chnjenm4.js} +3 -3
- package/dist/chunks/{index-whpvp633.js.map → index-chnjenm4.js.map} +1 -1
- package/dist/chunks/{index-w9z1vrm1.js → index-f4gcns9h.js} +4 -4
- package/dist/chunks/{index-w9z1vrm1.js.map → index-f4gcns9h.js.map} +1 -1
- package/dist/chunks/{index-3097wt56.js → index-gbnw7xez.js} +4 -4
- package/dist/chunks/{index-3097wt56.js.map → index-gbnw7xez.js.map} +1 -1
- package/dist/chunks/{index-bs70092j.js → index-q9sthmbv.js} +4 -4
- package/dist/chunks/{index-bs70092j.js.map → index-q9sthmbv.js.map} +1 -1
- package/dist/chunks/{index-wvwq0pm7.js → index-r4f9aab7.js} +4 -4
- package/dist/chunks/{index-wvwq0pm7.js.map → index-r4f9aab7.js.map} +1 -1
- package/dist/chunks/index-vfn2acy1.js +6 -0
- package/dist/chunks/{index-4r98bhg4.js.map → index-vfn2acy1.js.map} +4 -3
- package/dist/chunks/{index-h3s9msd8.js → index-wbjxq811.js} +3 -3
- package/dist/chunks/{index-h3s9msd8.js.map → index-wbjxq811.js.map} +1 -1
- package/dist/chunks/{index-9s5cwp2s.js → index-zmtkjeqj.js} +3 -3
- package/dist/chunks/{index-9s5cwp2s.js.map → index-zmtkjeqj.js.map} +1 -1
- package/dist/chunks/{rss-datasource-8wtv3mt5.js → rss-datasource-zj8k12xw.js} +3 -3
- package/dist/chunks/{rss-datasource-8wtv3mt5.js.map → rss-datasource-zj8k12xw.js.map} +1 -1
- package/dist/deploy.js +1 -1
- package/dist/entities.js +2 -2
- package/dist/entities.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +3 -0
- package/dist/interfaces.js +2 -2
- package/dist/interfaces.js.map +1 -1
- package/dist/plugins.d.ts +3 -0
- package/dist/plugins.js +2 -2
- package/dist/plugins.js.map +1 -1
- package/dist/services.js +2 -2
- package/dist/services.js.map +1 -1
- package/dist/site.js +103 -103
- package/dist/site.js.map +6 -6
- package/dist/templates.js +2 -2
- package/dist/templates.js.map +1 -1
- package/dist/themes.js +1 -1
- package/dist/ui/cms-app.js +399 -403
- package/dist/ui/cms-app.js.map +73 -10
- package/package.json +1 -1
- package/dist/chunks/blog-post-adapter-mcd8g3g5.js +0 -5
- package/dist/chunks/index-4r98bhg4.js +0 -6
- /package/dist/chunks/{blog-post-adapter-mcd8g3g5.js.map → blog-post-adapter-nwgbah59.js.map} +0 -0
package/package.json
CHANGED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{a,b}from"./index-whpvp633.js";import"./index-4r98bhg4.js";import"./index-w9z1vrm1.js";import"./index-fjp4jadv.js";import"./index-e2c4agdd.js";import"./index-3097wt56.js";import"./index-bs70092j.js";import"./index-9s5cwp2s.js";import"./index-wvwq0pm7.js";import"./index-gmfgjnnw.js";export{b as blogPostAdapter,a as BlogPostAdapter};
|
|
3
|
-
|
|
4
|
-
//# debugId=1740B4E5E07C590464756E2164756E21
|
|
5
|
-
//# sourceMappingURL=blog-post-adapter-mcd8g3g5.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{o as t}from"./index-w9z1vrm1.js";import{$ as _f,D as Y,E as $f,L as Bf,N as Kf,O as H,P as z,Q as W,U as G,V as Lf,W as o,Y as ff,_ as g,aa as l,ba as q,ca as s}from"./index-e2c4agdd.js";import{oa as d,pa as e,ua as Tf,wa as P}from"./index-3097wt56.js";import{Qa as x}from"./index-wvwq0pm7.js";var c=/^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 Ak=x.object({id:x.string().regex(c),ref:x.object({kind:x.string().min(1),id:x.string().regex(c)}),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 h(f){if(typeof f!=="object"||f===null||!("entityId"in f))return;let k=f.entityId;return typeof k==="string"&&k.trim().length>0?k.trim():void 0}function uf(f){if(typeof f!=="object"||f===null||!("coverImage"in f))return;let k=f.coverImage;if(k===void 0||k===!1)return;if(k===!0)return{generate:!0};if(typeof k!=="object"||k===null)return;let U=k;if(U.generate===!1)return;let $=U.prompt?.trim();return{generate:!0,...$&&{prompt:$}}}function n(f){return Object.fromEntries(Object.entries(f).filter(([,k])=>k!==void 0))}function Ff(f){let k={...f};return delete k.status,delete k.error,n(k)}class Jf extends t{context;entityType;constructor(f,k,U){super(f,{schema:U.schema,jobTypeName:U.jobTypeName});this.context=k,this.entityType=U.entityType}async afterCreate(f,k,U,$){}async onGenerationFailure(f,k){}validateAndParse(f){let k=super.validateAndParse(f);if(!k)return null;let U=uf(f);if(typeof k!=="object")return k;let $=h(f);if(!U&&!$)return k;return Object.assign(k,{...U&&{coverImage:U},...$&&{entityId:$}}),k}async process(f,k,U){try{await this.reportProgress(U,{progress:P.START,message:`Starting ${this.jobTypeName}`});let $=await this.generate(f,U),M=h(f),A=M?this.applyPreallocatedEntityId(M,$):$;await this.reportProgress(U,{progress:P.SAVE,message:`Saving ${this.entityType} to database`});let w=M?await this.updatePreallocatedStub(M,A):await this.context.entityService.createEntity({entity:{id:A.id,entityType:this.entityType,content:A.content,metadata:A.metadata},options:A.createOptions});return await this.afterCreate(f,w.entityId,U,A),await this.enqueueGenericCoverImageIfRequested(f,w.entityId,U,A),await this.reportProgress(U,{progress:P.COMPLETE,message:`${A.title??this.entityType} created successfully`}),{success:!0,entityId:w.entityId,...A.resultExtras}}catch($){if($ instanceof I)return await this.markPreallocatedStubFailed(f,$.message),await this.onGenerationFailure(f,$.message),{success:!1,error:$.message};let M=Y($);return this.logger.error(`${this.jobTypeName} job failed`,{error:$,jobId:k,data:this.summarizeDataForLog(f)}),await this.markPreallocatedStubFailed(f,M),await this.onGenerationFailure(f,M),Tf.failure($)}}applyPreallocatedEntityId(f,k){let U={...k.metadata},$=k.content,M=k.resultExtras;if(typeof U.slug==="string")U.slug=f,$=l($,"slug",f),M={...M,slug:f};return{...k,id:f,content:$,metadata:U,...M&&{resultExtras:M}}}async updatePreallocatedStub(f,k){let U=await this.context.entityService.getEntity({entityType:this.entityType,id:f,visibilityScope:"restricted"});if(!U)throw Error(`Pre-allocated entity stub not found: ${this.entityType}/${f}`);let $=this.mergeStubWithGenerated(U,k);return this.context.entityService.updateEntity({entity:{...U,id:f,entityType:this.entityType,content:$.content,metadata:$.metadata}})}mergeStubWithGenerated(f,k){let U=Ff(g(f.content).frontmatter),$=Ff(f.metadata),M=n(k.metadata),A=g(k.content),w=n(A.frontmatter),u=n({...U,...M,...w});return this.context.entities.getEffectiveFrontmatterSchema(this.entityType)?.parse(u),{content:_f(u,A.content),metadata:{...$,...M}}}async markPreallocatedStubFailed(f,k){let U=h(f);if(!U)return;try{let $=await this.context.entityService.getEntity({entityType:this.entityType,id:U,visibilityScope:"restricted"});if(!$)return;await this.context.entityService.updateEntity({entity:{...$,content:l(l($.content,"status","failed"),"error",k),metadata:{...$.metadata,status:"failed",error:k}}})}catch($){this.logger.warn("Failed to mark generation stub as failed",{error:$,entityId:U,entityType:this.entityType})}}async enqueueGenericCoverImageIfRequested(f,k,U,$){let M=uf(f);if(!M)return;await this.reportProgress(U,{progress:90,message:"Queueing cover image generation"});let A=$.title??k;await this.context.jobs.enqueue({type:"image:image-generate",data:{prompt:M.prompt??`Editorial cover image for: ${A}. `,title:`${A} Cover`,aspectRatio:"16:9",targetEntityType:this.entityType,targetEntityId:k,entityTitle:A,entityContent:$.content},toolContext:{interfaceType:"job",userId:"system"}})}failEarly(f){throw new I(f)}}class I extends Error{constructor(f){super(f);this.name="GenerationFailure"}}var nf=x.object({kind:x.string().min(1),id:x.string().min(1)}),Ef=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()}),Dk=x.array(Ef),Rk=x.array(e),Qk=x.array(d),Yk=x.record(x.string(),x.unknown());var Bk=x.record(x.string(),x.unknown());var nk=x.record(x.string(),x.unknown());var Sf=new Map([[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"],[".gif","image/gif"],[".pdf","application/pdf"]]),Sk=new Set(Sf.values());async function gx(f){let{entityType:k,title:U,deriveId:$,regeneratePrompt:M,context:A}=f,w=$(U),u=await A.entityService.getEntity({entityType:k,id:w});if(!u||u.metadata.status==="generating")return U;A.logger.debug(`Entity ID collision: ${k}/${w}, asking AI for a new title`);let O=x.object({title:x.string().max(80).describe("A short, unique title (2-6 words)")}),{object:m}=await A.ai.generateObject(`The title "${U}" is already taken. ${M}`,O),K=m.title;return A.logger.debug(`AI suggested new title: "${K}"`),K}var r=G.extend({id:x.literal("brain-character"),entityType:x.literal("brain-character")}),E=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 S extends q{constructor(){super({entityType:"brain-character",purpose:"The brain's own identity, character, and purpose (singleton).",schema:r,frontmatterSchema:E,isSingleton:!0,hasBody:!1})}createCharacterContent(f){return this.buildMarkdown("",f)}parseCharacterBody(f){return this.parseFrontmatter(f)}toMarkdown(f){let k=this.parseFrontmatter(f.content);return this.buildMarkdown("",Df.parse(k))}fromMarkdown(f){return{content:f,entityType:"brain-character"}}extractMetadata(f){let k=this.parseFrontmatter(f.content);return{role:k.role,values:k.values}}generateFrontMatter(f){let k=this.parseFrontmatter(f.content);return this.buildMarkdown("",Df.parse(k))}}class D extends s{static instance=null;adapter=new S;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,k,U){return D.instance??=new D(f,k,U),D.instance}static resetInstance(){D.instance=null}static createFresh(f,k,U){return new D(f,k,U)}constructor(f,k,U){super(f,k,"brain-character",U??D.getDefaultCharacter(),o("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 i=G.extend({id:x.literal("anchor-profile"),entityType:x.literal("anchor-profile")}),X=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 Ix=x.record(x.string(),x.unknown());class Z extends q{constructor(){super({entityType:"anchor-profile",purpose:"The profile of the brain's anchor owner (singleton).",schema:i,frontmatterSchema:X,isSingleton:!0,hasBody:!0})}createProfileContent(f){let k=X.parse(f);return this.buildMarkdown("",k)}parseProfileBody(f,k){if(k){let{metadata:U,content:$}=ff(f,k);return $?{...U,story:$}:U}return this.parseFrontmatter(f)}fromMarkdown(f){return{content:f,entityType:"anchor-profile"}}extractMetadata(f){let k=this.parseFrontmatter(f.content);return{name:k.name,email:k.email,website:k.website}}generateFrontMatter(f){let k=this.parseFrontmatter(f.content);return this.buildMarkdown("",Ix.parse(k))}}var xf=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)")}),Rf=xf.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 U=(await f.listEntities({entityType:"anchor-profile",options:{limit:1}}))[0];if(!U)throw Error("Profile not found \u2014 create an anchor-profile entity");return U.content}async function Qf(f,k){let U=await kf(f);return new Z().parseProfileBody(U,k)}class j extends s{static instance=null;adapter=new Z;static getDefaultProfile(){return{name:"Unknown",kind:"professional"}}static getInstance(f,k,U){return j.instance??=new j(f,k,U),j.instance}static resetInstance(){j.instance=null}static createFresh(f,k,U){return new j(f,k,U)}constructor(f,k,U){super(f,k,"anchor-profile",U??j.getDefaultProfile(),o("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 Yf=x.looseObject({id:x.string(),description:x.string(),name:x.string().optional(),tags:x.array(x.string()).optional().default([])});var tx=x.looseObject({uri:x.string(),params:x.record(x.string(),x.unknown()).optional()}),ax=x.looseObject({name:x.string(),url:x.string(),description:x.string().optional(),skills:x.array(Yf).optional().default([]),capabilities:x.looseObject({extensions:x.array(tx).optional().default([])}).optional()});var dx=x.object({name:x.string(),description:x.string(),tags:x.array(x.string()),examples:x.array(x.string())});import{EventEmitter as Zf}from"events";var C={REGISTERED:"registered",INITIALIZED:"initialized",ERROR:"error",DISABLED:"disabled"},_={REGISTERED:"plugin:registered",BEFORE_INITIALIZE:"plugin:before_initialize",INITIALIZED:"plugin:initialized",ERROR:"plugin:error",DISABLED:"plugin:disabled"};class N extends Error{pluginId;constructor(f,k){super(`Plugin ${f}: ${k}`);this.name="PluginError",this.pluginId=f}}class Uf{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=H.void){return this.closed=!0,this.closePromise??=this.closeScope(f),this.closePromise}async closeScope(f){let k,U=!1,$=[...this.ingress].reverse();for(let u of $)try{u.stopAdmission()}catch(O){if(!U)k=O;U=!0}let M=await Promise.allSettled($.map((u)=>Promise.resolve().then(()=>u.drain())));this.ingress.clear();let A=M.find((u)=>u.status==="rejected");if(!U&&A)k=A.reason,U=!0;let w=await W.runPromiseExit(z.close(this.scope,f));if(!U&&H.isFailure(w))k=Kf.squash(w.cause),U=!0;if(U)throw k}}function Xf(f,k){let U=f.getMessageBus(),$=new Set,M={send:(L)=>U.send(L),subscribe:(L,V,b)=>{let F=!0,J=new Set,T=(y)=>{if(!F)return{noop:!0};let bf,Vf=new Promise((Q)=>{bf=Q});J.add(Vf);let v=()=>{J.delete(Vf),bf()},Cf;try{Cf=Promise.resolve(V(y))}catch(Q){throw v(),Q}return Cf.then((Q)=>{return v(),Q},(Q)=>{throw v(),Q})},p=U.subscribe(L,T,b),B={type:L,originalHandler:V,stopAdmission:()=>{if(!F)return;F=!1,p(),$.delete(B)}};$.add(B);try{k.addIngress({stopAdmission:B.stopAdmission,drain:async()=>{await Promise.all(J)}})}catch(y){throw B.stopAdmission(),y}return B.stopAdmission},unsubscribe:(L,V)=>{let b=[...$].filter((F)=>F.type===L&&F.originalHandler===V);if(b.length===0){U.unsubscribe(L,V);return}for(let F of b)F.stopAdmission()}},A=f.getAttachmentRegistry(),w={...A,register:(L,V,b)=>{let F=!0,J=A.register(L,V,b),T=()=>{if(!F)return;F=!1,J()};return k.addFinalizer(T),T}},u=f.getEntityRegistry(),O=new Proxy(u,{get(L,V){let b=Reflect.get(L,V,L);if(V==="registerEntityType"&&typeof b==="function")return(...F)=>{let J=Reflect.apply(b,L,F),T=F[0];if(typeof T==="string")k.addFinalizer(()=>L.unregisterEntityType(T));return J};return typeof b==="function"?b.bind(L):b}}),m=f.getDataSourceRegistry(),K=new Proxy(m,{get(L,V){let b=Reflect.get(L,V,L);if(V==="register"&&typeof b==="function")return(...F)=>{let J=Reflect.apply(b,L,F),T=F[0];if(typeof T==="object"&&T!==null&&"id"in T&&typeof T.id==="string"){let p=T.id.includes(":")?T.id:`shell:${T.id}`;k.addFinalizer(()=>L.unregister(p))}return J};return typeof b==="function"?b.bind(L):b}}),of=f.getInsightsRegistry(),Pf=new Proxy(of,{get(L,V){let b=Reflect.get(L,V,L);if(V==="register"&&typeof b==="function")return(...F)=>{let J=Reflect.apply(b,L,F),T=F[0];if(typeof T==="string")k.addFinalizer(()=>L.unregister(T));return J};return typeof b==="function"?b.bind(L):b}});return new Proxy(f,{get(L,V){if(V==="getMessageBus")return()=>M;if(V==="getAttachmentRegistry")return()=>w;if(V==="getEntityRegistry")return()=>O;if(V==="getDataSourceRegistry")return()=>K;if(V==="getInsightsRegistry")return()=>Pf;let b=Reflect.get(L,V,L);return typeof b==="function"?b.bind(L):b}})}class Mf{plugins;events;daemonRegistry;logger;resourceScopes=new Map;releasePromises=new Map;constructor(f,k,U,$){this.plugins=f,this.events=k,this.daemonRegistry=U,this.logger=$.child("PluginLifecycle")}async initializePlugin(f,k,U){let $=this.plugins.get(f);if(!$)throw new N(f,"Registration failed: Plugin is not registered");let M=$.plugin,A=new Uf;A.addFinalizer(()=>k.unregisterPluginCapabilities?.(f)),A.addFinalizer(()=>k.getJobQueueService().unregisterPluginHandlers(f)),this.resourceScopes.set(f,A),this.releasePromises.delete(f),this.logger.debug(`Initializing plugin: ${f}`);try{this.events.emit(_.BEFORE_INITIALIZE,f,M);let w=await M.register(Xf(k,A),U);return $.status=C.INITIALIZED,this.logger.debug(`Initialized plugin: ${f}`),this.events.emit(_.INITIALIZED,f,M),w}catch(w){throw this.logger.error(`Error initializing plugin ${f}: ${Y(w)}`),await this.failPluginInitialization(f,w),w}}async readyPlugin(f){let k=this.plugins.get(f);if(!k)throw new N(f,"Ready failed: Plugin is not registered");if(k.status!==C.INITIALIZED){this.logger.debug(`Skipping ready hook for non-initialized plugin: ${f}`);return}try{await k.plugin.ready?.(),this.logger.debug(`Ready hook completed for plugin: ${f}`)}catch(U){let $=$f(U);k.status=C.ERROR,k.error=$;try{this.events.emit(_.ERROR,f,$)}catch(M){this.logger.error(`Plugin error listener failed for ${f}`,M)}throw $}}async startPluginDaemons(f){let k=this.plugins.get(f);if(k?.status!==C.INITIALIZED)return;try{await this.daemonRegistry.startPlugin(f),this.logger.debug(`Started daemons for plugin: ${f}`)}catch(U){if(k.plugin.requiresDaemonStartup?.())throw U;this.logger.warn(`Daemon ${f} failed to start: ${Y(U)}`)}}async failPluginInitialization(f,k){let U=this.plugins.get(f);if(!U)return;let $=U.status!==C.ERROR,M=$f(k);if(U.status=C.ERROR,U.error=M,await this.releasePluginResources(f,H.fail(k)),$)try{this.events.emit(_.ERROR,f,M)}catch(A){this.logger.error(`Plugin error listener failed for ${f}`,A)}}async disablePlugin(f){let k=this.plugins.get(f);if(!k){this.logger.warn(`Cannot disable plugin ${f}: not registered`);return}if(k.status===C.DISABLED)return;this.logger.debug(`Disabling plugin: ${f}`);let U=k.status===C.ERROR;await this.releasePluginResources(f,H.void);let $=this.plugins.get(f);if(!U&&$&&$.status!==C.DISABLED)$.status=C.DISABLED,this.events.emit(_.DISABLED,f,$.plugin);this.logger.debug(`Disabled plugin: ${f}`)}releasePluginResources(f,k){let U=this.releasePromises.get(f);if(U)return U;let $=this.releasePluginResourcesOnce(f,k);return this.releasePromises.set(f,$),$}async releasePluginResourcesOnce(f,k){let U=this.plugins.get(f);if(!U)return;try{await this.daemonRegistry.stopPlugin(f),this.logger.debug(`Stopped daemons for plugin: ${f}`)}catch(M){this.logger.error(`Failed to stop daemons for plugin: ${f}`,M)}let $=this.resourceScopes.get(f);if(this.resourceScopes.delete(f),$)try{await $.close(k)}catch(M){this.logger.error(`Failed to close resources for plugin ${f}`,M)}if(U.plugin.shutdown)try{await U.plugin.shutdown(),this.logger.debug(`Shutdown completed for plugin: ${f}`)}catch(M){this.logger.error(`Plugin shutdown failed for ${f}:`,M)}for(let M of this.daemonRegistry.getByPlugin(f))try{await this.daemonRegistry.unregister(M.name)}catch(A){this.logger.error(`Failed to unregister daemon ${M.name} for plugin ${f}`,A)}}}class Af{plugins;events;logger;constructor(f,k,U){this.plugins=f,this.events=k,this.logger=U.child("DependencyResolver")}async resolveInitializationOrder(f){this.logger.debug("Resolving plugin initialization order...");let k=Array.from(this.plugins.keys()),U=new Set,$=!0;while($&&U.size<k.length){$=!1;for(let w of k){if(U.has(w))continue;if(!this.plugins.get(w))continue;if(this.getUnmetDependencies(w).length===0)try{await f(w),U.add(w),$=!0}catch(m){let K=Y(m);this.logger.error(`Failed to initialize plugin ${w}: ${K}`),U.add(w),$=!0}}}let M=k.filter((w)=>!U.has(w));if(M.length>0){let w=M.join(", ");this.logger.error(`Failed to initialize plugins due to dependency issues: ${w}`);for(let u of M){let O=this.getUnmetDependencies(u);this.logger.error(`Plugin ${u} has unmet dependencies: ${O.join(", ")}`);let m=this.plugins.get(u);if(m)m.status=C.ERROR,m.error=new N(u,`Unmet dependencies: ${O.join(", ")}`);this.events.emit(_.ERROR,u,m?.error)}}let A=new Set;for(let[w,u]of this.plugins)if(u.status===C.INITIALIZED)A.add(w);return this.logger.debug(`Resolved ${A.size} of ${k.length} plugins`),{initialized:A,failed:M}}getUnmetDependencies(f){let k=this.plugins.get(f);if(!k)return[];let{dependencies:U}=k,$=[];for(let M of U){let A=this.plugins.get(M);if(!A){$.push(M);continue}if(A.status!==C.INITIALIZED)$.push(M)}return $}}class wf{logger;constructor(f){this.logger=f.child("CapabilityRegistrar")}async registerCapabilities(f,k,U){if(U.tools.length>0)f.registerTools(k,U.tools),this.logger.debug(`Registered ${U.tools.length} tools from ${k}`);if(U.resources.length>0)f.registerResources(k,U.resources),this.logger.debug(`Registered ${U.resources.length} resources from ${k}`);if(U.instructions)f.registerInstructions(k,U.instructions),this.logger.debug(`Registered instructions from ${k}`)}}async function Hf(f){let U=(await W.runPromise(W.all(f.map(($)=>W.either(W.tryPromise({try:$,catch:(M)=>M}))),{concurrency:"unbounded"}))).find(Bf.isLeft);if(U)throw U.left}class R{static instance=null;plugins=new Map;logger;events=new Zf;daemonRegistry;shell=null;initializedPluginIds=[];pluginLifecycle;dependencyResolver;capabilityRegistrar;static getInstance(f,k){return R.instance??=new R(f,k),R.instance}static resetInstance(){R.instance=null}static createFresh(f,k){return new R(f,k)}setShell(f){this.shell=f}constructor(f,k){this.logger=f.child("PluginManager"),this.events=new Zf,this.daemonRegistry=k,this.pluginLifecycle=new Mf(this.plugins,this.events,this.daemonRegistry,f),this.dependencyResolver=new Af(this.plugins,this.events,f),this.capabilityRegistrar=new wf(f)}registerPlugin(f){if(!f.id)throw new N("unknown","Registration failed: Plugin must have an id");if(this.logger.debug(`Registering plugin: ${f.id} (${f.version})`),this.plugins.has(f.id)){let M=this.plugins.get(f.id)?.plugin.version;throw new N(f.id,`Registration failed: Plugin is already registered with version ${M}`)}let k=f.dependencies??[],U={plugin:f,status:C.REGISTERED,dependencies:k};this.plugins.set(f.id,U),this.logger.debug(`Registered plugin: ${f.id} (${f.version})`),this.events.emit(_.REGISTERED,f.id,f)}async initializePlugins(f){this.logger.debug("Initializing plugins..."),this.initializedPluginIds=[];let k=await this.dependencyResolver.resolveInitializationOrder(async(U)=>{await this.initializePlugin(U,f)});this.logger.debug(`Initialized ${k.initialized.size} of ${this.plugins.size} plugins`)}async initializePlugin(f,k){if(!this.shell)throw new N(f,"Cannot initialize plugin: Shell not set. Call setShell() first.");let U=this.shell;try{let $=await this.pluginLifecycle.initializePlugin(f,U,k);await this.capabilityRegistrar.registerCapabilities(U,f,$),this.initializedPluginIds.push(f)}catch($){throw await this.pluginLifecycle.failPluginInitialization(f,$),$}}async readyPlugins(){this.logger.debug("Dispatching plugin ready hooks...");try{await Hf(this.initializedPluginIds.map((f)=>()=>this.pluginLifecycle.readyPlugin(f)))}catch(f){for(let k of this.initializedPluginIds){let U=this.plugins.get(k);if(U?.status===C.ERROR)await this.pluginLifecycle.failPluginInitialization(k,U.error??f)}throw f}}async startPluginDaemons(){this.logger.debug("Starting plugin daemons..."),await Hf(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===C.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===C.ERROR&&f[1].error!==void 0).map(([f,k])=>({id:f,error:k.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 k of[...this.initializedPluginIds].reverse())await this.disablePlugin(k),f.add(k);for(let k of[...this.plugins.keys()].reverse())if(!f.has(k))await this.disablePlugin(k)}on(f,k){this.events.on(f,k)}once(f,k){this.events.once(f,k)}off(f,k){this.events.off(f,k)}getEventEmitter(){return this.events}}var ex=x.enum(["generating","draft","queued","published","failed"]),Gf=x.enum(["generating","draft","queued","published","failed"]),rx=x.object({title:x.string(),slug:x.string().optional(),status:ex,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()}),Gw=rx.pick({title:!0,status:!0,publishedAt:!0,seriesName:!0,seriesIndex:!0}).extend({slug:x.string(),error:x.string().optional()}),ix=x.object({title:x.string(),status:Gf,publishedAt:x.string().datetime().optional(),seriesName:x.string().optional(),seriesIndex:x.number().optional(),slug:x.string(),error:x.string().optional()}),fk=x.object({title:x.string(),slug:x.string().optional(),status:Gf,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()}),xk=Lf.extend({entityType:x.literal("post"),metadata:ix}),qf=xk.extend({frontmatter:fk,body:x.string(),coverImageUrl:x.string().optional()}),qw=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()}),ow=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{Jf as d,gx as e,X as f,xf as g,Rf as h,Qf as i,rx as j,xk as k,qf as l,qw as m,ow as n};
|
|
4
|
-
|
|
5
|
-
//# debugId=57B45F5640DA165464756E2164756E21
|
|
6
|
-
//# sourceMappingURL=index-4r98bhg4.js.map
|
/package/dist/chunks/{blog-post-adapter-mcd8g3g5.js.map → blog-post-adapter-nwgbah59.js.map}
RENAMED
|
File without changes
|