@rizom/brain 0.2.0-alpha.627 → 0.2.0-alpha.628
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 +42 -66
- package/dist/chunks/{app-9jnwk6y6.js → app-jx30vvg4.js} +2 -2
- package/dist/chunks/{index-ghy45qv5.js → index-1yj28j3y.js} +3 -3
- package/dist/chunks/{index-ghy45qv5.js.map → index-1yj28j3y.js.map} +1 -1
- package/dist/chunks/{index-15jzczwk.js → index-82mtca3x.js} +2 -2
- package/dist/chunks/{index-hdwsmqe7.js → index-e72ehmam.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/model.js +42 -42
- package/dist/model.js.map +1 -1
- package/package.json +1 -1
- /package/dist/chunks/{app-9jnwk6y6.js.map → app-jx30vvg4.js.map} +0 -0
- /package/dist/chunks/{index-15jzczwk.js.map → index-82mtca3x.js.map} +0 -0
- /package/dist/chunks/{index-hdwsmqe7.js.map → index-e72ehmam.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{qa as a,ra as b,sa as c,ta as d}from"./index-
|
|
2
|
+
import{qa as a,ra as b,sa as c,ta as d}from"./index-e72ehmam.js";import"./index-d86pb7vs.js";import"./index-zzwvfjs6.js";import"./index-kpt8xb7g.js";import"./index-2vxfqw6s.js";import"./index-qycndwgy.js";import"./index-s8aedkfw.js";import"./index-1s8837bg.js";import"./index-nna4x5ae.js";import"./index-9m34pk29.js";export{d as App,a as STARTUP_CHECK_API_KEY,c as buildShellConfig,b as toAppConfig};
|
|
3
3
|
|
|
4
4
|
//# debugId=4DFE435CC07EE88764756E2164756E21
|
|
5
|
-
//# sourceMappingURL=app-
|
|
5
|
+
//# sourceMappingURL=app-jx30vvg4.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{a as z,b as f}from"./index-5p9ytejh.js";import{d as c,e as l}from"./index-e59ez8j3.js";import{ua as D}from"./index-d86pb7vs.js";import{Ag as x,Lh as B,ih as I,jh as A,ji as M,kh as P,lh as T,mh as R,nh as S,qh as L,xh as w}from"./index-zzwvfjs6.js";import"./index-kpt8xb7g.js";import"./index-2vxfqw6s.js";import"./index-qycndwgy.js";import"./index-s8aedkfw.js";import{vs as k}from"./index-1s8837bg.js";import{Zt as d}from"./index-nna4x5ae.js";import{du as h}from"./index-9m34pk29.js";var m=d.object({theme:d.object({primaryColor:d.string().describe("Primary color for the CLI theme").default("#0066cc"),accentColor:d.string().describe("Accent color for the CLI theme").default("#ff6600")}).describe("Theme configuration for the CLI interface").default({primaryColor:"#0066cc",accentColor:"#ff6600"})});var y={name:"@brains/chat-repl",license:"AGPL-3.0-only",version:"0.2.0-alpha.
|
|
2
|
+
import{a as z,b as f}from"./index-5p9ytejh.js";import{d as c,e as l}from"./index-e59ez8j3.js";import{ua as D}from"./index-d86pb7vs.js";import{Ag as x,Lh as B,ih as I,jh as A,ji as M,kh as P,lh as T,mh as R,nh as S,qh as L,xh as w}from"./index-zzwvfjs6.js";import"./index-kpt8xb7g.js";import"./index-2vxfqw6s.js";import"./index-qycndwgy.js";import"./index-s8aedkfw.js";import{vs as k}from"./index-1s8837bg.js";import{Zt as d}from"./index-nna4x5ae.js";import{du as h}from"./index-9m34pk29.js";var m=d.object({theme:d.object({primaryColor:d.string().describe("Primary color for the CLI theme").default("#0066cc"),accentColor:d.string().describe("Accent color for the CLI theme").default("#ff6600")}).describe("Theme configuration for the CLI interface").default({primaryColor:"#0066cc",accentColor:"#ff6600"})});var y={name:"@brains/chat-repl",license:"AGPL-3.0-only",version:"0.2.0-alpha.628",dependencies:{"@brains/job-queue":"workspace:*","@brains/plugins":"workspace:*","@brains/utils":"workspace:*",chalk:"^5.4.1",ink:"^7.0.6","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0",marked:"^18.0.5",react:"^19.2.7"},devDependencies:{"@brains/eslint-config":"workspace:*","@brains/typescript-config":"workspace:*","@types/bun":"^1.4.0","@types/react":"^19.2.17",typescript:"^7.0.2"},files:["src"],main:"./src/index.ts",module:"./src/index.ts",private:!0,scripts:{dev:"tsc --watch",lint:"eslint . --max-warnings 0","lint:fix":"eslint . --max-warnings 0 --fix",test:"bun test",typecheck:"tsc --noEmit"},type:"module",types:"./src/index.ts"};var j={completed:"\u2713",declined:"\u25CB",failed:"\u2717"},Z={deniedCardIds:void 0,resolveUrl:(e)=>e,isHiddenUrl:()=>!1,eventActionUnavailableLabel:void 0};class E extends x{inkApp=null;responseCallback;systemMessageCallback;agentService;removeSignalHandlers;approvalTracker;constructor(e={}){super("cli",y,e,m)}getAgentService(){if(!this.agentService)throw Error("AgentService not initialized - plugin not registered");return this.agentService}async onRegister(e){await super.onRegister(e),this.agentService=e.agent,this.logger.debug("CLI interface registered with AgentService")}sendMessageToChannel({message:e}){let s=typeof e==="string"?e:e.fallbackText??"";if(!s)return;(this.systemMessageCallback??this.responseCallback)?.(s)}sendReply(e){this.responseCallback?.(e)}registerResponseCallback(e){this.responseCallback=e}registerSystemMessageCallback(e){this.systemMessageCallback=e}unregisterMessageCallbacks(){this.responseCallback=void 0,this.systemMessageCallback=void 0}async onProgressUpdate(e){this.logger.debug("CLI progress update",{eventId:e.id,status:e.status,progress:e.progress,message:e.message})}createDaemon(){return{start:async()=>{if(!this.context)throw new M(this.id,"Initialization failed: Plugin context not initialized");this.logger.debug("Starting CLI interface");try{let[e,s,n]=await Promise.all([import("./index-2h3g86da.js"),import("react"),import("./EnhancedApp-z10ssdg0.js")]),{render:r}=e,t=s.default,o=n.default,g=t.createElement(o,{interface:this,registerProgressCallback:(i)=>this.registerProgressCallback(i),unregisterProgressCallback:()=>this.unregisterProgressCallback(),registerResponseCallback:(i)=>this.registerResponseCallback(i),registerSystemMessageCallback:(i)=>this.registerSystemMessageCallback(i),unregisterMessageCallbacks:()=>this.unregisterMessageCallbacks()});this.inkApp=r(g),this.registerSignalHandlers()}catch(e){throw this.logger.error("Failed to start CLI interface",{error:e}),e}},stop:async()=>{this.logger.debug("Stopping CLI interface"),await this.cleanup()},healthCheck:async()=>{let e=this.inkApp!==null;return{status:e?"healthy":"error",message:e?"CLI interface is running":"CLI interface not running",lastCheck:new Date,details:{hasInkApp:this.inkApp!==null,hasCallbacks:this.hasProgressCallback()}}}}}getApprovalTracker(){return this.approvalTracker??=new L({loadMessages:async(e)=>await this.context?.conversations.getMessages(e,{limit:50})??[],onRestoreError:(e,s)=>{this.logger.debug("Failed to restore pending CLI approvals",{error:e,conversationId:s})}}),this.approvalTracker}async getPendingApprovalIds(e){return[...await this.getApprovalTracker().getApprovalIds(e)]}async processInput(e){this.startProcessingInput();try{let n=await this.getPendingApprovalIds("cli");if(n.length>0){if(await this.handleConfirmationResponse(e,"cli",n))return}let r=await this.getAgentService().chat(e,"cli",{userPermissionLevel:"admin",isAnchor:this.getContext().permissions.isAnchor("cli","local"),interfaceType:"cli",channelId:"cli",channelName:"CLI Terminal"}),t=I(r.cards),o=t.length>0?t.map((i)=>i.id):r.pendingConfirmations?.map((i)=>i.id)??[];this.getApprovalTracker().replaceApprovals("cli",o);let g=this.renderAgentResponse(r);this.logger.debug("Agent response received",{textLength:r.text.length,toolResultsCount:r.toolResults?.length??0,toolResults:r.toolResults?.map((i)=>({toolName:i.toolName,hasData:i.data!==void 0}))}),this.sendReply(g)}catch(n){this.logger.error("Error processing input",{error:n,input:e});let r=k(n,"An unknown error occurred");this.sendReply(`**Error:** ${r}`)}finally{this.endProcessingInput()}}renderAgentResponse(e){let s=w(e,{deniedCardIds:void 0}),n=[],r=[],t="";for(let o of s.directives)switch(o.kind){case"text":t=o.text;break;case"approvals":n.push(...o.cards);break;default:if(o.card.kind==="tool-approval"&&o.card.state==="approval-requested"){n.push(o.card);break}r.push(B(o.card,Z))}return[this.formatAgentResponseText(t,n),...r].filter((o)=>o.trim().length>0).join(`
|
|
3
3
|
|
|
4
4
|
`)}formatAgentResponseText(e,s){if(s.length===0)return e;let n=P(e,s);if(s.length===1){let t=s[0];if(!t)return e;let o=t.preview?`
|
|
5
5
|
|
|
@@ -15,5 +15,5 @@ _Please reply with **yes 1** / **no 1** for the matching action._`}formatApprova
|
|
|
15
15
|
|
|
16
16
|
${r.error}`:`${t} ${r.summary}`}resolveApprovalIndexSugar(e,s){let n=/^(.*?)\s+#?(\d+)$/.exec(e.trim());if(!n?.[1]||!n[2])return e;let r=s[Number(n[2])-1];return r?`${n[1]} ${r}`:e}async handleConfirmationResponse(e,s,n){let r=new Set(n);if(!S(e,r))return!1;let t=R({message:this.resolveApprovalIndexSugar(e,n),approvalIds:r});if(t.kind==="not-confirmation")return!1;if(t.kind==="notice")return this.sendReply(`_${t.message}_`),!0;this.getApprovalTracker().removeApproval(s,t.approvalId);let o=await this.getAgentService().confirmPendingAction(s,t.confirmed,t.approvalId,{userPermissionLevel:"admin",isAnchor:this.getContext().permissions.isAnchor("cli","local"),interfaceType:"cli"});return this.getApprovalTracker().syncFromResponse(s,o,t.approvalId),this.sendReply(this.formatApprovalResultText(o.text,o.cards)),!0}registerSignalHandlers(){let e=()=>{this.logger.debug("Received termination signal, stopping CLI"),this.cleanup()};this.removeSignalHandlers=D(["SIGINT","SIGTERM"],e)}async cleanup(){if(this.unregisterProgressCallback(),this.unregisterMessageCallbacks(),this.removeSignalHandlers?.(),this.removeSignalHandlers=void 0,this.inkApp)this.inkApp.unmount(),this.inkApp=null}}import{jsx as a,jsxs as p}from"react/jsx-runtime";function q({batchStatus:e,showDetails:s=!0}){let{batchId:n,totalOperations:r,completedOperations:t,failedOperations:o,currentOperation:g,errors:i,status:u}=e,O=u==="processing",v=u==="completed",C=u==="failed",b=t-o;return p(c,{flexDirection:"column",marginY:1,children:[a(c,{marginBottom:1,children:p(l,{bold:!0,color:"cyan",children:["Batch Operation: ",n.slice(0,8),"..."]})}),a(c,{marginBottom:1,children:a(f,{current:t,total:r,message:"Overall Progress:",color:C?"red":v?"green":"yellow"})}),O&&g&&p(c,{marginBottom:1,children:[a(l,{color:"green",children:a(z,{type:"dots"})}),p(l,{color:"gray",children:[" ",g]})]}),s&&p(c,{flexDirection:"column",marginLeft:2,children:[b>0&&p(c,{children:[a(l,{color:"green",children:"\u2713 "}),p(l,{color:"gray",children:[b," successful"]})]}),o>0&&p(c,{children:[a(l,{color:"red",children:"\u2717 "}),p(l,{color:"gray",children:[o," failed"]})]}),i.length>0&&p(c,{flexDirection:"column",marginTop:1,children:[a(l,{color:"red",bold:!0,children:"Errors:"}),i.slice(0,3).map((H,_)=>p(c,{marginLeft:2,children:[a(l,{color:"red",children:"\u2022 "}),a(l,{color:"gray",children:H})]},_)),i.length>3&&a(c,{marginLeft:2,children:p(l,{color:"gray",children:["... and ",i.length-3," more"]})})]})]}),v&&a(c,{marginTop:1,children:a(l,{color:"green",bold:!0,children:"\u2713 Batch completed successfully"})}),C&&a(c,{marginTop:1,children:a(l,{color:"red",bold:!0,children:"\u2717 Batch failed"})})]})}export{q as BatchProgress,E as CLIInterface,f as ProgressBar,m as cliConfigSchema};
|
|
17
17
|
|
|
18
|
-
//# debugId=
|
|
19
|
-
//# sourceMappingURL=index-
|
|
18
|
+
//# debugId=12C1EEC80E9E952664756E2164756E21
|
|
19
|
+
//# sourceMappingURL=index-1yj28j3y.js.map
|
|
@@ -7,6 +7,6 @@
|
|
|
7
7
|
"/** @jsxImportSource react */\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport type { BatchJobStatus } from \"@brains/job-queue\";\nimport { ProgressBar } from \"./ProgressBar\";\n\ninterface BatchProgressProps {\n batchStatus: BatchJobStatus;\n showDetails?: boolean;\n}\n\nexport function BatchProgress({\n batchStatus,\n showDetails = true,\n}: BatchProgressProps): React.ReactElement {\n const {\n batchId,\n totalOperations,\n completedOperations,\n failedOperations,\n currentOperation,\n errors,\n status,\n } = batchStatus;\n\n const inProgress = status === \"processing\";\n const isCompleted = status === \"completed\";\n const isFailed = status === \"failed\";\n\n // Calculate successful operations\n const successfulOperations = completedOperations - failedOperations;\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Batch Operation: {batchId.slice(0, 8)}...\n </Text>\n </Box>\n\n {/* Main progress bar */}\n <Box marginBottom={1}>\n <ProgressBar\n current={completedOperations}\n total={totalOperations}\n message=\"Overall Progress:\"\n color={isFailed ? \"red\" : isCompleted ? \"green\" : \"yellow\"}\n />\n </Box>\n\n {/* Current operation */}\n {inProgress && currentOperation && (\n <Box marginBottom={1}>\n <Text color=\"green\">\n <Spinner type=\"dots\" />\n </Text>\n <Text color=\"gray\"> {currentOperation}</Text>\n </Box>\n )}\n\n {/* Details section */}\n {showDetails && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {/* Success count */}\n {successfulOperations > 0 && (\n <Box>\n <Text color=\"green\">✓ </Text>\n <Text color=\"gray\">{successfulOperations} successful</Text>\n </Box>\n )}\n\n {/* Failure count */}\n {failedOperations > 0 && (\n <Box>\n <Text color=\"red\">✗ </Text>\n <Text color=\"gray\">{failedOperations} failed</Text>\n </Box>\n )}\n\n {/* Errors */}\n {errors.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"red\" bold>\n Errors:\n </Text>\n {errors.slice(0, 3).map((error, index) => (\n <Box key={index} marginLeft={2}>\n <Text color=\"red\">• </Text>\n <Text color=\"gray\">{error}</Text>\n </Box>\n ))}\n {errors.length > 3 && (\n <Box marginLeft={2}>\n <Text color=\"gray\">... and {errors.length - 3} more</Text>\n </Box>\n )}\n </Box>\n )}\n </Box>\n )}\n\n {/* Final status */}\n {isCompleted && (\n <Box marginTop={1}>\n <Text color=\"green\" bold>\n ✓ Batch completed successfully\n </Text>\n </Box>\n )}\n\n {isFailed && (\n <Box marginTop={1}>\n <Text color=\"red\" bold>\n ✗ Batch failed\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n"
|
|
8
8
|
],
|
|
9
9
|
"mappings": "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",
|
|
10
|
-
"debugId": "
|
|
10
|
+
"debugId": "12C1EEC80E9E952664756E2164756E21",
|
|
11
11
|
"names": []
|
|
12
12
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Z as c,_ as y}from"./index-
|
|
2
|
+
import{Z as c,_ as y}from"./index-e72ehmam.js";import{Id as z,Zf as a,pd as R}from"./index-zzwvfjs6.js";import{oi as i}from"./index-kpt8xb7g.js";import{Nt as l,Ot as h,Pt as C}from"./index-1s8837bg.js";import{Zt as e}from"./index-nna4x5ae.js";function _(t,n={}){if(!a(t))throw Error("use() expects a package definition returned by a @rizom/brain define helper");return Object.freeze({kind:"rizom-configured-plugin",definition:t,config:Object.freeze({...n})})}function O(t){if(t===null||typeof t!=="object")return!1;return Reflect.get(t,"kind")==="rizom-configured-plugin"&&a(Reflect.get(t,"definition"))&&typeof Reflect.get(t,"config")==="object"}var Ee=e.array(e.string()),Ie=e.record(e.string(),e.unknown()),Ae=e.unknown();var Be=e.enum(["eval"]),p=e.enum(["person","team","organization"]);function K(t){if(t.bundleContract?.trim().length===0)throw Error("Brain bundleContract must not be empty");return t}function f(t){if(Array.isArray(t))return t.map((n)=>f(n));if(i(t))return Object.fromEntries(Object.entries(t).map(([n,o])=>[n,f(o)]));return t}function u(t){return f(t)}var r=e.string().min(1),V=e.strictObject({member:r,value:e.record(e.string(),e.unknown()),overrides:r.optional()}),G=e.custom(i,{message:"Expected an opaque permission config object"}),q=e.strictObject({member:r,config:G,overrides:r.optional()}),U=e.strictObject({id:r,members:e.array(r),config:e.array(V).optional(),permissions:e.array(q).optional(),agentInstructions:e.array(e.string().min(1)).optional(),evalDisable:e.array(r).optional()});function E(t,n,o,Z){let w=new Set;for(let[j,g]of t.entries()){if(w.has(g))Z.addIssue({code:e.ZodIssueCode.custom,message:`Duplicate ${n} "${g}"`,path:[o,j]});w.add(g)}}var H=U.superRefine((t,n)=>{E(t.members,"member","members",n),E(t.evalDisable??[],"eval exclusion","evalDisable",n)});function I(t){return u(H.parse(t))}function J(t){if(t===void 0)return[];return Array.isArray(t)?t:[t]}var W=e.record(e.string(),e.unknown()),ut=e.record(e.string(),e.unknown()),Y=e.enum(["eval"]),Q=l,s=h,X=e.strictObject({create:s.optional(),update:s.optional(),delete:s.optional(),extract:s.optional(),publish:s.optional()}),ee=e.record(e.string(),X),A=W.superRefine((t,n)=>{if(typeof t.package!=="string")return;n.addIssue({code:"custom",message:'"package" uses the removed alpha external-plugin contract. Default-export a declarative package definition from a @rizom/brain define helper and compose it with use() in defineBrain().'})}),mt=e.strictObject({brain:e.string().optional(),bundleContract:e.string().trim().min(1).optional(),anchor:p.optional(),site:e.object({package:e.string().optional(),variant:e.string().optional(),theme:e.string().optional(),themeOverride:e.string().optional()}).optional(),name:e.string().optional(),kind:e.string().trim().min(1).optional(),logLevel:c.optional(),logFile:e.string().optional(),port:e.number().optional(),domain:e.string().optional(),database:e.string().optional(),embedding:e.strictObject({enabled:e.boolean().optional()}).optional(),model:e.string().optional(),reasoningEffort:y.optional(),bundles:e.array(e.string().min(1)).optional(),mode:Y.optional(),add:e.array(e.string()).optional(),remove:e.array(e.string()).optional(),admins:e.array(e.string()).optional(),anchors:e.array(e.string()).optional(),trusted:e.array(e.string()).optional(),spaces:e.array(e.string()).optional(),plugins:e.record(e.string(),A).optional(),permissions:e.object({admins:e.array(e.string()).optional(),anchors:e.array(e.string()).optional(),trusted:e.array(e.string()).optional(),rules:e.array(e.object({pattern:e.string(),level:Q})).optional(),entityActions:ee.optional()}).optional()});var Pt=e.record(e.string(),e.unknown());var ne=e.strictObject({pattern:e.string(),level:l}),Et=e.strictObject({admins:e.array(e.string()).optional(),anchors:e.array(e.string()).optional(),trusted:e.array(e.string()).optional(),rules:e.array(ne).optional(),entityActions:C.optional()});var D=`/* ============================================
|
|
3
3
|
THEME BASE - Shared utilities for all themes
|
|
4
4
|
============================================
|
|
5
5
|
This file contains CSS that is IDENTICAL across all themes.
|
|
@@ -528,4 +528,4 @@ import{Z as c,_ as y}from"./index-hdwsmqe7.js";import{Id as z,Zf as a,pd as R}fr
|
|
|
528
528
|
`+t}var B=e.custom((t)=>z.safeParse(t).success),se=e.custom((t)=>{if(!i(t))return!1;let{plugin:n,...o}=t;if(n!==void 0&&typeof n!=="function")return!1;return R.safeParse(o).success});var ce=e.looseObject({id:e.string().min(1)}),de=e.looseObject({label:e.string().min(1)}),ge=e.custom((t)=>typeof t==="function"),pe=e.looseObject({layouts:e.record(e.string(),e.unknown()).optional(),plugin:ge.optional(),pluginConfig:e.record(e.string(),e.unknown()).optional(),routes:e.array(ce).optional(),entityDisplay:e.record(e.string(),de).optional(),content:e.unknown().optional(),themeOverride:e.string().optional(),headScripts:e.array(e.string()).optional(),staticAssets:e.record(e.string(),e.string()).optional()}),Ut=e.custom((t)=>pe.safeParse(t).success);var In=e.looseObject({name:e.string().min(1),version:e.string().min(1),dependencies:e.record(e.string(),e.string()).optional(),peerDependencies:e.record(e.string(),e.string()).optional()});export{_ as T,O as U,K as V,I as W,J as X,re as Y};
|
|
529
529
|
|
|
530
530
|
//# debugId=46D0F8C5727883BC64756E2164756E21
|
|
531
|
-
//# sourceMappingURL=index-
|
|
531
|
+
//# sourceMappingURL=index-82mtca3x.js.map
|
|
@@ -29,9 +29,9 @@ ${yt(u)}`}:p,f=t.buildArgs((g)=>({operation:s,confirmed:!0,confirmationToken:g})
|
|
|
29
29
|
|
|
30
30
|
`}${c.text}`}).join("")}var fu=0.5;function vs(e,t,r){let i=pr(e.entity,r);if(i!==e.entity)return{...e,entity:i,excerpt:i.content};let n=Rr(i.content);if(n.length<=ys)return{...e,entity:i};let{content:o,...s}=i;return{...e,entity:s,excerpt:hs(n,t),excerpted:!0}}var Et=(e)=>e==="public"?{publishedOnly:!0}:{};function yu(e,t){if(e.length===0)return;let r=Math.round(Math.max(...e.map((i)=>i.score))*100)/100;return{minScore:t,weakerMatches:e.length,bestScore:r,hint:`No result reached minScore ${t}, but ${e.length} weaker match${e.length===1?"":"es"} exist (best score ${r}). Broad or abstract questions match content weakly: search again with a lower minScore, such as 0.3, before concluding that nothing relevant exists.`}}function bs(e){let{entityService:t,logger:r}=e;return[X("system","search","Search entities using semantic search. For broad search, make one system_search call with scope.kind all. Use scope.kind type only when the user asks for a specific entity type. When the user names entity types, search each with scope.kind type in the same step, without a broad search first. Applies a default minScore of 0.5 to reduce weak matches; lower minScore only for exploratory or loose recall. An empty result with belowThreshold means weaker matches exist: search again with a lower minScore before concluding that nothing relevant exists. Search results include each matched entity's content; a long one's is excerpted to its best-matching sections, which system_get reads whole. When relevant results already contain the complete evidence needed, answer from those results instead of redundantly listing or getting the same entities. Search results are candidates; do not present weak or unrelated candidates as exact matches. For each new user question about what they have written, mentioned, discussed, or saved, run a fresh search for that turn instead of answering from prior-turn results or memory, including analysis phrasing such as 'How do I discuss X in my writing?'.",Yn,async(i,n)=>{kt(n);let o=x(n.userPermissionLevel);if(i.scope.kind==="type"&&e.entityRegistry.getEntityTypeConfig(i.scope.entityType).embeddable===!1){let{entityType:d}=i.scope;return{success:!0,data:{results:(await t.listEntities({entityType:d,options:{limit:i.limit??e.searchLimit,filter:{visibilityScope:o},...Et(o)}})).map((m)=>vs({entity:m},i.query,e.entityRegistry)),notSearchable:{entityType:d,hint:`${d} is not in the search index, so the results are its entries, unranked.`}}}}let s=i.minScore??fu,c=await t.search({query:i.query,options:{limit:i.limit??e.searchLimit,...i.scope.kind==="type"&&{types:[i.scope.entityType]},...i.includeUngenerated!==void 0&&{includeUngenerated:i.includeUngenerated},visibilityScope:o,...Et(o)}}),l=c.filter((d)=>d.score>=s),u=l.length===0?yu(c,s):void 0;return{success:!0,data:{results:l.map((d)=>vs(d,i.query,e.entityRegistry)),...u&&{belowThreshold:u}}}},{visibility:"public",sideEffects:"none",cli:{name:"search"}}),X("system","get","Retrieve a specific entity by type and identifier (ID, slug, or title). If retrieval fails, report the entity as not found rather than describing related generation work as pending.",Xn,async(i,n)=>{if(kt(n),!t.getEntityTypes().includes(i.entityType))return{success:!1,error:`Unknown entity type: ${i.entityType}. Available: ${t.getEntityTypes().join(", ")}`};let o=x(n.userPermissionLevel),s=await M(t,i.entityType,i.id,r,void 0,o,Et(o));if(!s.ok)return{success:!1,error:s.error};let c=pr(s.entity,e.entityRegistry);return{success:!0,data:{entity:i.part==="body"?{...c,content:Rr(c.content)}:c}}},{visibility:"public",sideEffects:"none",cli:{name:"get"}}),X("system","list","List entities by a known entity type. Returns metadata only; it answers a request to show or list items of a type, such as titles, dates and descriptions, so answer from it and use system_get only when the user asks about an item's full content. Use system_search, not system_list, for broad or vague lookup requests. For list/show-all requests that name or browse a known type or synonym (essays/articles/blog posts => post), list that type instead of searching; for a whole-type summary such as 'summarize my blog posts', list it first, then summarize the returned entities. Use system_list to inspect metadata dates such as publishedAt when the user asks for the latest item of a known type, such as latest blog post.",eo,async(i,n)=>{if(kt(n),!t.getEntityTypes().includes(i.entityType))return{success:!1,error:`Unknown entity type: ${i.entityType}. Available: ${t.getEntityTypes().join(", ")}`};let o=x(n.userPermissionLevel),s={visibilityScope:o};if(i.status&&i.status!=="any")s.metadata={status:i.status};let{defaultSort:c}=e.entityRegistry.getEntityTypeConfig(i.entityType),u=(await t.listEntities({entityType:i.entityType,options:{limit:i.limit??20,filter:s,...Et(o),...c?{sortFields:c}:{}}})).map(({content:d,contentHash:p,...m})=>m);return{success:!0,data:{entities:u,count:u.length}}},{visibility:"public",sideEffects:"none",cli:{name:"list"}})]}function hu(e){let t=Object.fromEntries(Object.entries(e.params.shape).map(([r,i])=>{let n=i instanceof a.ZodDefault?i.unwrap():i,o=i.description?n.describe(i.description):n;return[r,o.optional()]}));return a.looseObject(t).describe(`Params for ${e.type}`)}function vu(e){let[t,...r]=e.map((o)=>o.type);if(t===void 0)throw Error("No analytics reports registered");let i=e.filter((o)=>Object.keys(o.params.shape).length>0).map(hu),n=a.union([...i,a.looseObject({})]);return a.object({type:a.enum([t,...r]).describe("The report to run"),params:n.optional().describe("The report's params; each report lists its own")})}function Ss(e){let{entityService:t,analytics:r}=e,i=r.getDefinitions(),n=i.map((o)=>`${o.type} (${o.description})`).join("; ");return[X("system","analytics",`Aggregate metrics and reports over the brain, not its content: for actual content use system_list, system_get or system_search. Reports: ${n}.`,vu(i),async(o,s)=>({success:!0,data:await r.run({type:o.type,params:o.params,entityService:t,permission:s.userPermissionLevel??"public"})}),{visibility:"public",sideEffects:"none"})]}function Rs(e){let{jobs:t}=e;return[F("job_status","Inspect runtime job status for ready checks only when the prior operation created a job, or for status disputes. With a known batch ID, pass batchId. Without an ID, call this tool with no arguments to list active jobs and batches; do not ask the user for an ID first. Do not argue from the transcript alone.",co,async(r)=>{if(r.batchId){let o=await t.getBatchStatus(r.batchId);if(!o)return{success:!1,error:`No batch found with ID: ${r.batchId}`};let s=o.totalOperations>0?Math.round(o.completedOperations/o.totalOperations*100):0;return{success:!0,data:{batchId:r.batchId,status:o.status,progress:{total:o.totalOperations,completed:o.completedOperations,failed:o.failedOperations,percentComplete:s},currentOperation:o.currentOperation,errors:o.errors}}}let i=await t.getActiveJobs(r.jobTypes),n=await t.getActiveBatches();return{success:!0,data:{summary:{activeJobs:i.length,activeBatches:n.length},jobs:i.map((o)=>({id:o.id,type:o.type,status:o.status,priority:o.priority,retryCount:o.retryCount,createdAt:new Date(o.createdAt).toISOString(),startedAt:o.startedAt?new Date(o.startedAt).toISOString():null})),batches:n.map((o)=>({batchId:o.batchId,status:o.status.status,totalOperations:o.status.totalOperations,completedOperations:o.status.completedOperations,failedOperations:o.status.failedOperations,currentOperation:o.status.currentOperation,pluginId:o.metadata.metadata.pluginId,errors:o.status.errors}))}}},{visibility:"public",sideEffects:"none"})]}function bu(e,t){let{entityCounts:r,daemons:i,endpoints:n,interactions:o,...s}=e;return{...s,endpoints:n.filter((c)=>t(c.visibility)).sort((c,l)=>c.priority-l.priority).map(({label:c,url:l})=>({label:c,url:l}))}}function ws(e){return[X("system","status","Get system status including model, version, background work, and the web surfaces (such as the dashboard and Studio) the caller can open, with their paths",a.object({}),async(t,r)=>({success:!0,data:bu(await e.getAppInfo(),(i)=>e.permissionService.hasPermission(r.userPermissionLevel??"public",i))}),{visibility:"public",sideEffects:"none",cli:{name:"status"}})]}function Is(e){return[...bs(e),...Rs(e),...ws(e),...ps(e),...Ss(e)]}function Ps(e){return[{uri:"entity://types",name:"Entity Types",description:"List of registered entity types",mimeType:"text/plain",handler:async()=>({contents:[{uri:"entity://types",mimeType:"text/plain",text:e.entityService.getEntityTypes().join(`
|
|
31
31
|
`)}]})},{uri:"brain://identity",name:"Brain Identity",description:"Brain character \u2014 name, role, purpose, values",mimeType:"application/json",handler:async()=>({contents:[{uri:"brain://identity",mimeType:"application/json",text:JSON.stringify(e.getIdentity(),null,2)}]})},{uri:"brain://profile",name:"Anchor Profile",description:"Brain owner profile \u2014 name, bio, expertise",mimeType:"application/json",handler:async()=>({contents:[{uri:"brain://profile",mimeType:"application/json",text:JSON.stringify(e.getProfile(),null,2)}]})},{uri:"brain://status",name:"Brain Status",description:"System status \u2014 version, model, interfaces, tools",mimeType:"application/json",handler:async()=>({contents:[{uri:"brain://status",mimeType:"application/json",text:JSON.stringify(await e.getAppInfo(),null,2)}]})}]}function Cs(e){let{entityService:t}=e;return[{name:"entity-list",uriTemplate:"entity://{type}",description:"List entities of a given type",mimeType:"application/json",list:async()=>t.getEntityTypes().map((i)=>({uri:`entity://${i}`,name:`${i} entities`})),complete:{type:async()=>t.getEntityTypes()},handler:async({type:r})=>{let i=t.getEntityTypes();if(!i.includes(r))throw Error(`Unknown entity type: ${r}. Available: ${i.join(", ")}`);let o=(await t.listEntities({entityType:r})).map((s)=>({id:s.id,entityType:s.entityType,...s.metadata,updated:s.updated}));return{contents:[{uri:`entity://${r}`,mimeType:"application/json",text:JSON.stringify(o,null,2)}]}}},{name:"entity-detail",uriTemplate:"entity://{type}/{id}",description:"Read a single entity by type and ID",mimeType:"text/markdown",complete:{type:async(r)=>{let i=t.getEntityTypes();return r?i.filter((n)=>n.startsWith(r)):i},id:async()=>[]},handler:async({type:r,id:i})=>{let n=await t.getEntity({entityType:r,id:i});if(!n)throw Error(`Entity not found: ${r}/${i}`);return{contents:[{uri:`entity://${r}/${i}`,mimeType:"text/markdown",text:n.content}]}}}]}function Ts(e){return[{name:"create",description:"Create new content of any type",args:{type:{description:"Entity type (e.g. post, deck, note)",required:!0},topic:{description:"Topic or title for the content"}},handler:async({topic:r,type:i})=>({messages:[{role:"user",content:{type:"text",text:r?`Create a new ${i} about: ${r}`:`Create a new ${i}. Ask me what it should be about.`}}]})},{name:"generate",description:"AI-generate content with a prompt",args:{type:{description:`Entity type (${(()=>e.entityService.getEntityTypes().join(", "))()})`,required:!0},topic:{description:"What to generate",required:!0}},handler:async({type:r,topic:i})=>({messages:[{role:"user",content:{type:"text",text:`Generate a ${r} about: ${i}`}}]})},{name:"review",description:"Review and improve existing content",args:{type:{description:"Entity type",required:!0},id:{description:"Entity ID or slug",required:!0}},handler:async({type:r,id:i})=>({messages:[{role:"user",content:{type:"text",text:`Review my ${r} "${i}". Read it first, then give me specific feedback on structure, clarity, and impact. Suggest concrete improvements.`}}]})},{name:"publish",description:"Publish content \u2014 preview, confirm, and publish",args:{type:{description:"Entity type",required:!0},id:{description:"Entity ID or slug",required:!0}},handler:async({type:r,id:i})=>({messages:[{role:"user",content:{type:"text",text:`I want to publish my ${r} "${i}". Show me a preview first, then publish it.`}}]})},{name:"brainstorm",description:"Brainstorm ideas using brain context and expertise",args:{topic:{description:"Topic to brainstorm about",required:!0}},handler:async({topic:r})=>({messages:[{role:"user",content:{type:"text",text:`Let's brainstorm about: ${r}. Use my existing content and expertise as context. Give me fresh angles and concrete ideas.`}}]})}]}function ks(e){return["## Entity CRUD","","Use the system tools for ALL entity operations; each tool's description is its contract.","","Treat explicit verbs such as save, create, capture, remember, import, add/connect an agent, approve/archive an agent, update, delete, generate, publish, or sync as mutation requests. Entity-specific instructions may require proactively recording the user's request itself for demand or workflow tracking; follow those instructions even when the user did not use a separate save/create verb. Ordinary status questions like 'what is the status', 'is it ready', 'did that finish', or 'what happened' are not capture requests; answer them by using the relevant status/read tool for the prior operation. Never call system_create for a status follow-up.","","Do not ask for prose confirmation instead of calling the applicable mutating tool; for create, update, delete, generate, publish, sync, and similar state-changing requests, the initial tool call without `confirmed` is how you create the pending confirmation. Never pass `confirmed: true` on the initial user request. Deletion is Admin-only: if system_delete is not available in the current tool surface, say deletion requires Admin access; do not imply a confirmation flow is available. Never claim a durable create/update/delete change was saved, created, done, or completed unless the relevant tool call succeeded or returned a pending confirmation. If a create/update/delete tool is unavailable, unauthorized, or intentionally not called, say you can't make that durable change from the current context; never say saved/created/done. For an explicit write request from an unauthorized/currently unwritable context, refuse directly; do not call system_status or system_search to check permission or look up related content. Entity type descriptions may mark projection-owned or system-maintained types read-only; refuse mutation requests for those types directly without calling read or write tools, searching for a target, or asking which record to mutate.","","Entity types \u2014 select `entityType` by what the type is for:",...e.entityService.getEntityTypes().map((i)=>`- ${i}: ${e.entityRegistry.getAdapter(i).purpose}`)].join(`
|
|
32
|
-
`)}var ve="system",Su=a.object({toolName:a.string(),args:a.unknown(),...xs.partial().shape});function xt(e,t,r,i,n){for(let o of e)try{t(o)}catch{n.debug(`System ${i} ${r(o)} already registered, skipping`)}}function js(e,t,r,i){let n=Is(e);xt(n,(d)=>t.registerTool(ve,d),(d)=>d.name,"tool",i);let o=r.subscribe(Es.toolExecute(ve),async(d)=>{let p=Su.safeParse(d.payload);if(!p.success)return{success:!1,error:"Invalid system tool execute payload"};let{toolName:m,args:f,interfaceType:g,actor:y,conversationId:w,channelId:v,userPermissionLevel:S}=p.data,b=n.find((A)=>A.name===m);if(!b)return{success:!1,error:`System tool not found: ${m}`};let P={interfaceType:g??"system",actor:y??{kind:"service",serviceId:"system"}};if(w)P.conversationId=w;if(v)P.channelId=v;if(S)P.userPermissionLevel=S;return{success:!0,data:await b.handler(f,P)}});i.debug(`Registered ${n.length} system tools`);let s=Ps(e);xt(s,(d)=>t.registerResource(ve,d),(d)=>d.uri,"resource",i),i.debug(`Registered ${s.length} system resources`);let c=Cs(e);xt(c,(d)=>t.registerResourceTemplate(ve,d),(d)=>d.uriTemplate,"resource template",i),i.debug(`Registered ${c.length} system resource templates`);let l=Ts(e);xt(l,(d)=>t.registerPrompt(ve,d),(d)=>d.name,"prompt",i),i.debug(`Registered ${l.length} system prompts`);let u=ks(e);try{t.registerInstructions(ve,u)}catch{i.debug("System instructions already registered, skipping")}return i.debug("Registered system instructions"),o}function Os(e){let{services:t,jobs:r,analytics:i,query:n,getAppInfo:o}=e,s=t.jobQueueService,c=t.logger.child("system"),l=js({entityService:t.entityService,entityRegistry:t.entityRegistry,jobs:{...r,enqueue:As(s,"system",!1),enqueueBatch:Ds(r,"system"),registerHandler:zs(s,"system")},conversationService:t.conversationService,runtimeUploads:t.runtimeUploadRegistry,attachments:jt(t.attachmentRegistry),logger:c,query:n,getIdentity:()=>t.identityService.getCharacter(),getProfile:()=>t.profileService.getProfile(),getAppInfo:o,searchLimit:10,analytics:i,permissionService:t.permissionService},t.mcpService,t.messageBus,c);t.disposables.push(l)}class Cr{scope;closePromise=null;closed=!1;constructor(){this.scope=h.runSync(k.make())}buildLayer(e){this.assertOpen();let t=h.runSyncExit(J.buildWithScope(e,this.scope));if(E.isFailure(t))throw V.squash(t.cause);return t.value}addFinalizer(e){this.assertOpen(),h.runSync(k.addFinalizer(this.scope,h.promise(async()=>{await e()})))}addSyncFinalizer(e){this.assertOpen(),h.runSync(k.addFinalizer(this.scope,h.sync(()=>{e()})))}async fork(e){if(this.closed)throw Error("Cannot start background work after shell shutdown");await h.runPromise(h.forkIn(e,this.scope))}close(e=E.void){if(this.closePromise)return this.closePromise;if(this.closed)return Promise.resolve();return this.closed=!0,this.closePromise=h.runPromise(k.close(this.scope,e)),this.closePromise}closeSync(e){if(this.closed)return;this.closed=!0,h.runSync(k.close(this.scope,e))}assertOpen(){if(this.closed)throw Error("Cannot register cleanup after shell shutdown")}}class je{config;services;lifecycle;bootloader;initialized=!1;lifecycleState="constructed";bootMode;bootPromise=null;shutdownPromise=null;analyticsRegistry;bootTime=Date.now();endpointRegistry=new or;interactionRegistry=new sr;httpRouteRegistry=ct.createFresh();jobs;static createFresh(e,t,r){return new je(Ze(e),t,r)}constructor(e,t,r){this.config=e,this.lifecycle=new Cr,Us(this,()=>this.httpRouteRegistry.getSnapshot());let i=t?.logger??U.getInstance(),n=nt.createFresh(i,this.config,r?.processRole,r?.peerChannel);try{this.services=n.initializeServices(this.lifecycle,t),this.jobs=Jn(this.services.batchJobManager,this.services.jobQueueService),this.analyticsRegistry=Fn(this.services.entityRegistry),this.bootloader=new ir(this.config,this.services,this.lifecycle,n,r?.processRole,{registerCoreDataSources:()=>Zr(this.services,this.config),finalizeHttpRoutes:()=>{this.httpRouteRegistry.finalize(Gn(this.services.pluginManager))},registerSystemCapabilities:()=>Os({services:this.services,jobs:this.jobs,analytics:this.analyticsRegistry,query:(o,s)=>this.query(o,s),getAppInfo:()=>this.getAppInfo()}),createProjectionInputContext:()=>({entities:this.services.entityService,resolvePrompt:(o,s)=>Fe(this.services.entityService,o,s),appInfo:()=>this.getAppInfo(),identityInput:()=>{let o=this.getIdentity(),s=this.getProfile();return Ls.parse({brainName:o.name,role:o.role,purpose:o.purpose,values:o.values,profileName:s.name,...s.description!==void 0?{profileDescription:s.description}:{},...s.organization!==void 0?{profileOrganization:s.organization}:{}})}}),createProjectionExecutionContext:()=>({ai:$s(this),logger:this.services.logger.child("ProjectionRuntime")}),...t?.projectionRuntime&&{projectionRuntime:t.projectionRuntime}}),n.wireShell(this.services,this),Kn(this.lifecycle,this.services)}catch(o){try{this.lifecycle.closeSync(E.fail(o))}catch(s){i.error("Failed to roll back Shell service construction",s)}throw o}}getAnalyticsRegistry(){return this.analyticsRegistry}async initialize(e){this.services.logger.debug("Shell.initialize() called");let t=e?.mode;if(this.lifecycleState==="running")return this.services.logger.warn("Shell already initialized"),Promise.resolve();if(this.lifecycleState==="booting"){if(this.bootMode!==t)return Promise.reject(Error(`Shell is already initializing in ${this.bootMode??"normal"} mode; cannot join ${t??"normal"} mode`));return this.bootPromise??Promise.resolve()}if(this.lifecycleState==="closing"||this.lifecycleState==="closed")return Promise.reject(Error("Cannot initialize a closing shell"));if(this.lifecycleState==="failed")return Promise.reject(Error("Cannot initialize a shell after boot failure"));return this.lifecycleState="booting",this.bootMode=t,this.bootPromise=this.boot(e),this.bootPromise}async boot(e){try{if(await this.bootloader.boot(e),this.lifecycleState==="booting"){if(this.lifecycleState="running",this.initialized=!0,e?.mode===void 0)await this.services.messageBus.send({type:N.shellReady,payload:{timestamp:new Date().toISOString()},sender:"shell",broadcast:!0}),this.services.logger.debug("Emitted shell ready event")}}catch(t){if(this.initialized=!1,this.services.logger.error("Failed to initialize Shell",t),this.lifecycleState!=="closing")this.lifecycleState="failed";try{await this.lifecycle.close(E.fail(t))}catch(r){this.services.logger.error("Failed to clean up Shell after initialization failure",r)}throw t}}registerTemplates(e,t){this.services.logger.debug("Registering templates",{pluginId:t,count:Object.keys(e).length});for(let[r,i]of Object.entries(e))this.registerTemplate(r,i,t)}shutdown(){return this.shutdownPromise??=this.shutdownShell(),this.shutdownPromise}async shutdownShell(){if(this.services.logger.debug("Shutting down Shell"),this.lifecycleState==="closed")return;let e=this.bootPromise;if(this.lifecycleState="closing",this.initialized=!1,e)try{await e}catch{}await this.lifecycle.close(),this.lifecycleState="closed",this.services.logger.debug("Shell shutdown complete")}async generateContent(e,t){return this.requireInitialized("Shell content generation"),Fr(this.services,e,t)}async query(e,t){this.requireInitialized("Shell query");let r=await this.getAppInfo(),i={...t,appInfo:r,timestamp:new Date().toISOString()},{conversationHistory:n,...o}=i;return Ms.parse(await this.generateContent({prompt:e,templateName:we.KNOWLEDGE_QUERY,...n&&{conversationHistory:n},data:o,interfacePermissionGrant:"public"}))}registerPlugin(e){this.requireInitialized("Plugin registration"),this.services.pluginManager.registerPlugin(e)}isInitialized(){return this.initialized}requireInitialized(e){if(!this.initialized)throw Error(`${e} attempted before initialization`)}getEntityService(){return this.services.entityService}getConversationService(){return this.services.conversationService}getEntityRegistry(){return this.services.entityRegistry}async generateObject(e,t,r){this.requireInitialized("Shell generateObject");let{object:i}=await this.services.aiService.generateObject("You are a helpful assistant. Respond with the requested structured data.",e,t,r);return{object:i}}async judge(e){return this.requireInitialized("Shell judge"),this.services.aiService.judge(e)}getAIService(){return this.services.aiService}generateImage(e,t){return this.services.aiService.generateImage(e,t)}canGenerateImages(){return this.services.aiService.canGenerateImages()}getPluginManager(){return this.services.pluginManager}getContentService(){return this.services.contentService}getRenderService(){return this.services.renderService}getAttachmentRegistry(){return jt(this.services.attachmentRegistry)}getRuntimeUploadRegistry(){return Zs(this.services.runtimeUploadRegistry)}getRuntimeState(){return this.services.runtimeStateService}getRecurringChecks(e){return this.services.recurringCheckService.namespace(e)}isJobQueueWorkerRunning(){return this.services.jobQueueWorker.isWorkerRunning()}getMessageBus(){return this.services.messageBus}getLogger(){return this.services.logger}getJobQueueService(){return this.services.jobQueueService}getMCPService(){return this.services.mcpService}listToolsForPermissionLevel(e){return this.services.mcpService.listToolsForPermissionLevel(e).map(({pluginId:t,tool:r})=>({name:r.name,description:r.description,pluginId:t}))}getPermissionService(){return this.services.permissionService}getAgentService(){return this.services.agentService}registerTools(e,t){for(let r of t)this.services.mcpService.registerTool(e,r)}registerResources(e,t){for(let r of t)this.services.mcpService.registerResource(e,r)}registerResourceTemplate(e,t){this.services.mcpService.registerResourceTemplate(e,t)}registerPrompt(e,t){this.services.mcpService.registerPrompt(e,t)}registerInstructions(e,t){if(this.services.mcpService.registerInstructions(e,t),this.initialized)this.services.agentService.invalidateAgent()}async unregisterPluginCapabilities(e){this.services.mcpService.unregisterPlugin?.(e),this.services.jobQueueService.unregisterPluginHandlers(e),this.endpointRegistry.unregister(e),this.interactionRegistry.unregister(e);for(let r of this.services.templateRegistry.getNames())if(r.startsWith(`${e}:`))this.services.templateRegistry.unregister(r);let t=this.config.evalHandlerRegistry;if(t){for(let r of t.list())if(r.pluginId===e)t.unregister(e,r.handlerId)}this.services.agentService.invalidateAgent(),await this.services.recurringCheckService.unregisterPlugin(e)}getPluginPackageName(e){return this.services.pluginManager.getPluginPackageName(e)}hasPlugin(e){return this.services.pluginManager.hasPlugin(e)}getPluginHttpRouteManifest(){return this.httpRouteRegistry.getManifest()}getPluginApiRoutes(){return this.httpRouteRegistry.getApiRoutes()}getPluginWebRoutes(){return this.httpRouteRegistry.getWebRoutes()}registerDaemon(e,t,r){this.services.daemonRegistry.register(e,t,r)}registerEndpoint(e){this.endpointRegistry.register(e)}listEndpoints(){return this.endpointRegistry.list()}registerInteraction(e){this.interactionRegistry.register(e)}listInteractions(){return this.interactionRegistry.list()}registerTemplate(e,t,r){let i=r?`${r}:${e}`:`shell:${e}`;this.services.templateRegistry.register(i,t),this.services.logger.debug(`Registered template: ${i}`)}getTemplate(e){return this.services.templateRegistry.get(e)}getDataSourceRegistry(){return this.services.dataSourceRegistry}getIdentity(){return this.services.identityService.getCharacter()}getProfile(){return this.services.profileService.getProfile()}getProfileKindRegistry(){return this.services.profileKindRegistry}getChannelRegistry(){return this.services.channelRegistry}getInboxRegistry(){return this.services.inboxRegistry}getInboxFollowUpRegistry(){return this.services.inboxFollowUpRegistry}getOperationalHealthRegistry(){return this.services.operationalHealthRegistry}getAccountSettingsRegistry(){return this.services.accountSettingsRegistry}getDomain(){return this.config.siteBaseUrl}getLocalSiteUrl(){return this.config.localSiteUrl}shouldPreferLocalUrls(){return this.config.preferLocalUrls}getThemeCSS(){return this.config.themeCSS}getSpaces(){return this.config.spaces}getDataDir(){return this.config.dataDir}getGitBrokerSocket(){return this.config.gitBrokerSocket}getGitBrokerCheckout(){return this.config.gitBrokerCheckout}registerEvalHandler(e,t,r){this.config.evalHandlerRegistry?.register(e,t,r)}async getAppInfo(){return Dr({config:this.config,services:this.services,bootTime:this.bootTime,endpoints:()=>this.listEndpoints(),interactions:()=>this.listInteractions()})}getRuntimeReadiness(){return Mr(this.services)}}var Fs={kind:"service",serviceId:"brain-cli"},Tr=`${Fs.kind}:${Fs.serviceId}`;var Ru=a.object({provider:a.enum(["hetzner","docker"]).default("hetzner"),serverSize:a.string().default("cx33"),location:a.string().default("fsn1"),domain:a.string().optional(),docker:a.object({enabled:a.boolean().default(!0),image:a.string().optional()}).prefault({}),ports:a.object({default:a.number().default(3333),preview:a.number().default(4321),production:a.number().default(8080)}).prefault({}),cdn:a.object({enabled:a.boolean().default(!1),provider:a.enum(["bunny","none"]).default("none")}).prefault({}),dns:a.object({enabled:a.boolean().default(!1),provider:a.enum(["bunny","none"]).default("none")}).prefault({}),paths:a.object({install:a.string().optional(),data:a.string().optional()}).prefault({})}),Ws=a.object({name:a.string().default("brain-app"),version:a.string().default("1.0.0"),database:a.string().optional(),aiApiKey:a.string().optional(),aiImageKey:a.string().optional(),aiModel:a.string().optional(),aiReasoningEffort:ge.optional(),logLevel:me.optional(),logFile:a.string().optional(),profileKind:a.string().trim().min(1).optional(),plugins:a.array(Ue).default([]),spaces:a.array(a.string()).default([]),identity:Bs.optional(),agentInstructions:a.array(a.string()).optional(),deployment:Ru.prefault({})});async function Xs(e,t){await ee({label:"entity",config:e,schema:{assets:Ns,entities:_s,entityMutationReceipts:Js,projectionDirtyInputs:qs,projectionWaves:Hs,projectionIncidents:Gs,projectionWaveInputs:Qs,projectionWaveRules:Ks,projectionRuleMemos:Vs},migrationsFolder:te(import.meta.url,"entity-service"),authTokenEnv:"DATABASE_AUTH_TOKEN",logger:t,afterMigrate:Ys})}async function ra(e,t){await ee({label:"job-queue",config:e,schema:{jobQueue:ea,jobWorkerSessions:ta},migrationsFolder:te(import.meta.url,"job-queue"),authTokenEnv:"JOB_QUEUE_DATABASE_AUTH_TOKEN",logger:t})}async function sa(e,t){await ee({label:"conversation",config:e,schema:{conversations:ia,messages:na,summaryTracking:oa},migrationsFolder:te(import.meta.url,"conversation-service"),authTokenEnv:"CONVERSATION_DATABASE_AUTH_TOKEN",logger:t})}async function aa(e,t){await ee({label:"runtime-state",config:e,schema:{runtimeStateRecords:R},migrationsFolder:te(import.meta.url,"runtime-state"),authTokenEnv:"RUNTIME_STATE_DATABASE_AUTH_TOKEN",logger:t})}import{mkdir as kr}from"fs/promises";import{isAbsolute as wu}from"path";function ca(e=process.env){return{dataDir:e.XDG_DATA_HOME??"./data",cacheDir:e.XDG_CACHE_HOME??"./cache",distDir:"./dist"}}function la(e=process.env){let t=e.BRAIN_GIT_BROKER_CHECKOUT;if(!t)return;if(!wu(t))throw Error(`Git broker checkout path must be absolute: ${t}`);return t}function ua(e=process.env){let t=e.BRAIN_GIT_BROKER_SOCKET;if(!t)return;let r=107;if(Buffer.byteLength(t)>r)throw Error(`Git broker socket path is too long for a unix socket (${Buffer.byteLength(t)} > ${r} bytes): ${t}`);return t}function da(e=process.env){return ie(ca(e))}async function pa(e=process.env){let t=ca(e);try{await kr(t.dataDir,{recursive:!0}),await kr(t.cacheDir,{recursive:!0}),await kr(t.distDir,{recursive:!0})}catch(r){let i=r instanceof Error&&r.message.includes("EACCES")?`Cannot create data directories \u2014 permission denied. Run from a writable directory or check permissions on ${t.dataDir}`:`Cannot create data directories: ${C(r)}`;throw Error(i,{cause:r})}return ie(t)}class Er{logger;migrations;constructor(e,t){this.logger=e,this.migrations=t??{getStandardConfigWithDirectories:()=>pa(),migrateEntities:Xs,migrateJobQueue:ra,migrateConversations:sa,migrateRuntimeState:aa}}async runAllMigrations(e){this.logger.debug("Running database migrations...");let t=await this.migrations.getStandardConfigWithDirectories();if(e?.database)t.database.url=e.database;if(e?.jobQueueDatabase)t.jobQueueDatabase.url=e.jobQueueDatabase;if(e?.conversationDatabase)t.conversationDatabase.url=e.conversationDatabase;if(e?.runtimeStateDatabase)t.runtimeStateDatabase.url=e.runtimeStateDatabase;await this.migrateEntityDatabase(t),await this.migrateJobQueueDatabase(t),await this.migrateConversationDatabase(t),await this.migrateRuntimeStateDatabase(t),this.logger.debug("All database migrations completed successfully")}async migrateEntityDatabase(e){this.logger.debug("Running entity database migrations..."),await this.migrations.migrateEntities({url:e.database.url,...e.database.authToken&&{authToken:e.database.authToken}},this.logger)}async migrateJobQueueDatabase(e){this.logger.debug("Running job queue database migrations..."),await this.migrations.migrateJobQueue({url:e.jobQueueDatabase.url,...e.jobQueueDatabase.authToken&&{authToken:e.jobQueueDatabase.authToken}},this.logger)}async migrateConversationDatabase(e){this.logger.debug("Running conversation database migrations..."),await this.migrations.migrateConversations({url:e.conversationDatabase.url,...e.conversationDatabase.authToken&&{authToken:e.conversationDatabase.authToken}},this.logger)}async migrateRuntimeStateDatabase(e){this.logger.debug("Running runtime state database migrations..."),await this.migrations.migrateRuntimeState({url:e.runtimeStateDatabase.url,...e.runtimeStateDatabase.authToken&&{authToken:e.runtimeStateDatabase.authToken}},this.logger)}}var Iu="NODE_ENV";function Pu(){return process.env[Iu]}function ma(){return Pu()!=="production"}var Tu="startup-check";function ku(e){let r={...Ws.parse(e??{}),plugins:e?.plugins??[]};if(e?.permissions)r.permissions=e.permissions;if(e?.spaces)r.spaces=e.spaces;if(e?.cliConfig)r.cliConfig=e.cliConfig;if(e?.shellConfig)r.shellConfig=e.shellConfig;return r}function Eu(e,t){let r={plugins:e.plugins??[],...e.shellConfig};return xu(r),ju(e,r),Au(e,r,t),Du(e,r),zu(e,r),Ou(e,r),Mu(e,r),Lu(e,r),$u(e,r),r}function xu(e){let t=da();e.database??=t.database,e.jobQueueDatabase??=t.jobQueueDatabase,e.conversationDatabase??=t.conversationDatabase,e.runtimeStateDatabase??=t.runtimeStateDatabase,e.embeddingDatabase??=t.embeddingDatabase,e.embedding??=t.embedding,e.gitBrokerSocket??=ua(),e.gitBrokerCheckout??=la()}function ju(e,t){if(e.database)t.database={url:e.database};if(e.profileKind)t.profileKind=e.profileKind;t.features={}}function Au(e,t,r){let i=r?.mode==="startup-check";if(!e.aiApiKey&&!e.aiImageKey&&!e.aiModel&&!e.aiReasoningEffort&&!i)return;t.ai={...t.ai,...i&&!t.ai?.apiKey&&{apiKey:Tu},...e.aiApiKey&&{apiKey:e.aiApiKey},...e.aiImageKey&&{imageApiKey:e.aiImageKey},...e.aiModel&&{model:e.aiModel},...e.aiReasoningEffort&&{reasoningEffort:e.aiReasoningEffort}}}function Du(e,t){if(!e.logLevel&&!e.logFile)return;t.logging={level:e.logLevel??"info",format:"text",context:e.name,...e.logFile&&{file:e.logFile}}}function zu(e,t){let r=e.permissions?.rules??[];t.permissions={...e.permissions,rules:r.some((i)=>i.pattern===Tr)?r:[{pattern:Tr,level:"admin"},...r]}}function Ou(e,t){if(e.spaces)t.spaces=e.spaces}function Mu(e,t){if(e.identity)t.identity=e.identity}function Lu(e,t){if(e.agentInstructions)t.agentInstructions=e.agentInstructions}function $u(e,t){if(t.name=e.name,t.version=e.version,e.deployment.domain)t.siteBaseUrl=e.deployment.domain;t.localSiteUrl=`http://localhost:${e.deployment.ports.production}`,t.preferLocalUrls=ma()}class jr{shell=null;config;signalScope=null;signalShutdownFiber=null;stopPromise=null;hasCLI=!1;static create(e,t){return new jr(ku(e),t)}constructor(e,t){if(this.config=e,this.hasCLI=process.argv.slice(2).includes("--cli"),t)this.shell=t}async migrate(){let e=U.getInstance();await new Er(e).runAllMigrations({database:this.config.shellConfig?.database?.url??this.config.database,jobQueueDatabase:this.config.shellConfig?.jobQueueDatabase?.url,conversationDatabase:this.config.shellConfig?.conversationDatabase?.url,runtimeStateDatabase:this.config.shellConfig?.runtimeStateDatabase?.url})}createShell(e,t){this.shell=je.createFresh(Eu(this.config,e),void 0,{...t?.processRole&&{processRole:t.processRole},...t?.peerChannel&&{peerChannel:t.peerChannel}})}async registerCLIInterface(){if(!this.hasCLI)return;let e=this.getShell().getPluginManager(),{CLIInterface:t}=await import("./index-ghy45qv5.js"),r=new t(this.config.cliConfig);e.registerPlugin(r)}async initialize(e,t){if(!this.shell){if(!t?.migrationsCompleted)await this.migrate();this.createShell(e,t)}await this.registerCLIInterface(),await this.getShell().initialize(e)}async start(){if(this.stopPromise)return;this.setupSignalHandlers()}stop(){return this.stopPromise??=this.stopApp(),this.stopPromise}async stopApp(){await this.closeSignalScope(),await this.shell?.shutdown()}async run(e){let r={debug:j.DEBUG,info:j.INFO,warn:j.WARN,error:j.ERROR}[this.config.logLevel??"info"]??j.INFO,i=U.createFresh({level:r,context:this.config.name,useStderr:this.hasCLI});if(this.hasCLI)U.getInstance().setUseStderr(!0);try{await this.initialize(void 0,e),await this.start(),e?.onRuntimeReady?.(),i.info(`\u2705 ${this.config.name} v${this.config.version} ready`),process.stdin.resume()}catch(n){i.error(`\u274C Failed to start ${this.config.name}:`,n),process.exit(1)}}static async run(e,t,r){await jr.create(e,t).run(r)}setupSignalHandlers(){if(this.signalScope)return;let e=h.runSync(k.make()),t=()=>{this.requestGracefulShutdown("SIGINT")},r=()=>{this.requestGracefulShutdown("SIGTERM")},i=xr(["SIGINT"],t),n=xr(["SIGTERM"],r);h.runSync(k.addFinalizer(e,h.sync(()=>{n(),i()}))),this.signalScope=e}requestGracefulShutdown(e){if(this.signalShutdownFiber)return;let t=U.getInstance();t.info(`
|
|
32
|
+
`)}var ve="system",Su=a.object({toolName:a.string(),args:a.unknown(),...xs.partial().shape});function xt(e,t,r,i,n){for(let o of e)try{t(o)}catch{n.debug(`System ${i} ${r(o)} already registered, skipping`)}}function js(e,t,r,i){let n=Is(e);xt(n,(d)=>t.registerTool(ve,d),(d)=>d.name,"tool",i);let o=r.subscribe(Es.toolExecute(ve),async(d)=>{let p=Su.safeParse(d.payload);if(!p.success)return{success:!1,error:"Invalid system tool execute payload"};let{toolName:m,args:f,interfaceType:g,actor:y,conversationId:w,channelId:v,userPermissionLevel:S}=p.data,b=n.find((A)=>A.name===m);if(!b)return{success:!1,error:`System tool not found: ${m}`};let P={interfaceType:g??"system",actor:y??{kind:"service",serviceId:"system"}};if(w)P.conversationId=w;if(v)P.channelId=v;if(S)P.userPermissionLevel=S;return{success:!0,data:await b.handler(f,P)}});i.debug(`Registered ${n.length} system tools`);let s=Ps(e);xt(s,(d)=>t.registerResource(ve,d),(d)=>d.uri,"resource",i),i.debug(`Registered ${s.length} system resources`);let c=Cs(e);xt(c,(d)=>t.registerResourceTemplate(ve,d),(d)=>d.uriTemplate,"resource template",i),i.debug(`Registered ${c.length} system resource templates`);let l=Ts(e);xt(l,(d)=>t.registerPrompt(ve,d),(d)=>d.name,"prompt",i),i.debug(`Registered ${l.length} system prompts`);let u=ks(e);try{t.registerInstructions(ve,u)}catch{i.debug("System instructions already registered, skipping")}return i.debug("Registered system instructions"),o}function Os(e){let{services:t,jobs:r,analytics:i,query:n,getAppInfo:o}=e,s=t.jobQueueService,c=t.logger.child("system"),l=js({entityService:t.entityService,entityRegistry:t.entityRegistry,jobs:{...r,enqueue:As(s,"system",!1),enqueueBatch:Ds(r,"system"),registerHandler:zs(s,"system")},conversationService:t.conversationService,runtimeUploads:t.runtimeUploadRegistry,attachments:jt(t.attachmentRegistry),logger:c,query:n,getIdentity:()=>t.identityService.getCharacter(),getProfile:()=>t.profileService.getProfile(),getAppInfo:o,searchLimit:10,analytics:i,permissionService:t.permissionService},t.mcpService,t.messageBus,c);t.disposables.push(l)}class Cr{scope;closePromise=null;closed=!1;constructor(){this.scope=h.runSync(k.make())}buildLayer(e){this.assertOpen();let t=h.runSyncExit(J.buildWithScope(e,this.scope));if(E.isFailure(t))throw V.squash(t.cause);return t.value}addFinalizer(e){this.assertOpen(),h.runSync(k.addFinalizer(this.scope,h.promise(async()=>{await e()})))}addSyncFinalizer(e){this.assertOpen(),h.runSync(k.addFinalizer(this.scope,h.sync(()=>{e()})))}async fork(e){if(this.closed)throw Error("Cannot start background work after shell shutdown");await h.runPromise(h.forkIn(e,this.scope))}close(e=E.void){if(this.closePromise)return this.closePromise;if(this.closed)return Promise.resolve();return this.closed=!0,this.closePromise=h.runPromise(k.close(this.scope,e)),this.closePromise}closeSync(e){if(this.closed)return;this.closed=!0,h.runSync(k.close(this.scope,e))}assertOpen(){if(this.closed)throw Error("Cannot register cleanup after shell shutdown")}}class je{config;services;lifecycle;bootloader;initialized=!1;lifecycleState="constructed";bootMode;bootPromise=null;shutdownPromise=null;analyticsRegistry;bootTime=Date.now();endpointRegistry=new or;interactionRegistry=new sr;httpRouteRegistry=ct.createFresh();jobs;static createFresh(e,t,r){return new je(Ze(e),t,r)}constructor(e,t,r){this.config=e,this.lifecycle=new Cr,Us(this,()=>this.httpRouteRegistry.getSnapshot());let i=t?.logger??U.getInstance(),n=nt.createFresh(i,this.config,r?.processRole,r?.peerChannel);try{this.services=n.initializeServices(this.lifecycle,t),this.jobs=Jn(this.services.batchJobManager,this.services.jobQueueService),this.analyticsRegistry=Fn(this.services.entityRegistry),this.bootloader=new ir(this.config,this.services,this.lifecycle,n,r?.processRole,{registerCoreDataSources:()=>Zr(this.services,this.config),finalizeHttpRoutes:()=>{this.httpRouteRegistry.finalize(Gn(this.services.pluginManager))},registerSystemCapabilities:()=>Os({services:this.services,jobs:this.jobs,analytics:this.analyticsRegistry,query:(o,s)=>this.query(o,s),getAppInfo:()=>this.getAppInfo()}),createProjectionInputContext:()=>({entities:this.services.entityService,resolvePrompt:(o,s)=>Fe(this.services.entityService,o,s),appInfo:()=>this.getAppInfo(),identityInput:()=>{let o=this.getIdentity(),s=this.getProfile();return Ls.parse({brainName:o.name,role:o.role,purpose:o.purpose,values:o.values,profileName:s.name,...s.description!==void 0?{profileDescription:s.description}:{},...s.organization!==void 0?{profileOrganization:s.organization}:{}})}}),createProjectionExecutionContext:()=>({ai:$s(this),logger:this.services.logger.child("ProjectionRuntime")}),...t?.projectionRuntime&&{projectionRuntime:t.projectionRuntime}}),n.wireShell(this.services,this),Kn(this.lifecycle,this.services)}catch(o){try{this.lifecycle.closeSync(E.fail(o))}catch(s){i.error("Failed to roll back Shell service construction",s)}throw o}}getAnalyticsRegistry(){return this.analyticsRegistry}async initialize(e){this.services.logger.debug("Shell.initialize() called");let t=e?.mode;if(this.lifecycleState==="running")return this.services.logger.warn("Shell already initialized"),Promise.resolve();if(this.lifecycleState==="booting"){if(this.bootMode!==t)return Promise.reject(Error(`Shell is already initializing in ${this.bootMode??"normal"} mode; cannot join ${t??"normal"} mode`));return this.bootPromise??Promise.resolve()}if(this.lifecycleState==="closing"||this.lifecycleState==="closed")return Promise.reject(Error("Cannot initialize a closing shell"));if(this.lifecycleState==="failed")return Promise.reject(Error("Cannot initialize a shell after boot failure"));return this.lifecycleState="booting",this.bootMode=t,this.bootPromise=this.boot(e),this.bootPromise}async boot(e){try{if(await this.bootloader.boot(e),this.lifecycleState==="booting"){if(this.lifecycleState="running",this.initialized=!0,e?.mode===void 0)await this.services.messageBus.send({type:N.shellReady,payload:{timestamp:new Date().toISOString()},sender:"shell",broadcast:!0}),this.services.logger.debug("Emitted shell ready event")}}catch(t){if(this.initialized=!1,this.services.logger.error("Failed to initialize Shell",t),this.lifecycleState!=="closing")this.lifecycleState="failed";try{await this.lifecycle.close(E.fail(t))}catch(r){this.services.logger.error("Failed to clean up Shell after initialization failure",r)}throw t}}registerTemplates(e,t){this.services.logger.debug("Registering templates",{pluginId:t,count:Object.keys(e).length});for(let[r,i]of Object.entries(e))this.registerTemplate(r,i,t)}shutdown(){return this.shutdownPromise??=this.shutdownShell(),this.shutdownPromise}async shutdownShell(){if(this.services.logger.debug("Shutting down Shell"),this.lifecycleState==="closed")return;let e=this.bootPromise;if(this.lifecycleState="closing",this.initialized=!1,e)try{await e}catch{}await this.lifecycle.close(),this.lifecycleState="closed",this.services.logger.debug("Shell shutdown complete")}async generateContent(e,t){return this.requireInitialized("Shell content generation"),Fr(this.services,e,t)}async query(e,t){this.requireInitialized("Shell query");let r=await this.getAppInfo(),i={...t,appInfo:r,timestamp:new Date().toISOString()},{conversationHistory:n,...o}=i;return Ms.parse(await this.generateContent({prompt:e,templateName:we.KNOWLEDGE_QUERY,...n&&{conversationHistory:n},data:o,interfacePermissionGrant:"public"}))}registerPlugin(e){this.requireInitialized("Plugin registration"),this.services.pluginManager.registerPlugin(e)}isInitialized(){return this.initialized}requireInitialized(e){if(!this.initialized)throw Error(`${e} attempted before initialization`)}getEntityService(){return this.services.entityService}getConversationService(){return this.services.conversationService}getEntityRegistry(){return this.services.entityRegistry}async generateObject(e,t,r){this.requireInitialized("Shell generateObject");let{object:i}=await this.services.aiService.generateObject("You are a helpful assistant. Respond with the requested structured data.",e,t,r);return{object:i}}async judge(e){return this.requireInitialized("Shell judge"),this.services.aiService.judge(e)}getAIService(){return this.services.aiService}generateImage(e,t){return this.services.aiService.generateImage(e,t)}canGenerateImages(){return this.services.aiService.canGenerateImages()}getPluginManager(){return this.services.pluginManager}getContentService(){return this.services.contentService}getRenderService(){return this.services.renderService}getAttachmentRegistry(){return jt(this.services.attachmentRegistry)}getRuntimeUploadRegistry(){return Zs(this.services.runtimeUploadRegistry)}getRuntimeState(){return this.services.runtimeStateService}getRecurringChecks(e){return this.services.recurringCheckService.namespace(e)}isJobQueueWorkerRunning(){return this.services.jobQueueWorker.isWorkerRunning()}getMessageBus(){return this.services.messageBus}getLogger(){return this.services.logger}getJobQueueService(){return this.services.jobQueueService}getMCPService(){return this.services.mcpService}listToolsForPermissionLevel(e){return this.services.mcpService.listToolsForPermissionLevel(e).map(({pluginId:t,tool:r})=>({name:r.name,description:r.description,pluginId:t}))}getPermissionService(){return this.services.permissionService}getAgentService(){return this.services.agentService}registerTools(e,t){for(let r of t)this.services.mcpService.registerTool(e,r)}registerResources(e,t){for(let r of t)this.services.mcpService.registerResource(e,r)}registerResourceTemplate(e,t){this.services.mcpService.registerResourceTemplate(e,t)}registerPrompt(e,t){this.services.mcpService.registerPrompt(e,t)}registerInstructions(e,t){if(this.services.mcpService.registerInstructions(e,t),this.initialized)this.services.agentService.invalidateAgent()}async unregisterPluginCapabilities(e){this.services.mcpService.unregisterPlugin?.(e),this.services.jobQueueService.unregisterPluginHandlers(e),this.endpointRegistry.unregister(e),this.interactionRegistry.unregister(e);for(let r of this.services.templateRegistry.getNames())if(r.startsWith(`${e}:`))this.services.templateRegistry.unregister(r);let t=this.config.evalHandlerRegistry;if(t){for(let r of t.list())if(r.pluginId===e)t.unregister(e,r.handlerId)}this.services.agentService.invalidateAgent(),await this.services.recurringCheckService.unregisterPlugin(e)}getPluginPackageName(e){return this.services.pluginManager.getPluginPackageName(e)}hasPlugin(e){return this.services.pluginManager.hasPlugin(e)}getPluginHttpRouteManifest(){return this.httpRouteRegistry.getManifest()}getPluginApiRoutes(){return this.httpRouteRegistry.getApiRoutes()}getPluginWebRoutes(){return this.httpRouteRegistry.getWebRoutes()}registerDaemon(e,t,r){this.services.daemonRegistry.register(e,t,r)}registerEndpoint(e){this.endpointRegistry.register(e)}listEndpoints(){return this.endpointRegistry.list()}registerInteraction(e){this.interactionRegistry.register(e)}listInteractions(){return this.interactionRegistry.list()}registerTemplate(e,t,r){let i=r?`${r}:${e}`:`shell:${e}`;this.services.templateRegistry.register(i,t),this.services.logger.debug(`Registered template: ${i}`)}getTemplate(e){return this.services.templateRegistry.get(e)}getDataSourceRegistry(){return this.services.dataSourceRegistry}getIdentity(){return this.services.identityService.getCharacter()}getProfile(){return this.services.profileService.getProfile()}getProfileKindRegistry(){return this.services.profileKindRegistry}getChannelRegistry(){return this.services.channelRegistry}getInboxRegistry(){return this.services.inboxRegistry}getInboxFollowUpRegistry(){return this.services.inboxFollowUpRegistry}getOperationalHealthRegistry(){return this.services.operationalHealthRegistry}getAccountSettingsRegistry(){return this.services.accountSettingsRegistry}getDomain(){return this.config.siteBaseUrl}getLocalSiteUrl(){return this.config.localSiteUrl}shouldPreferLocalUrls(){return this.config.preferLocalUrls}getThemeCSS(){return this.config.themeCSS}getSpaces(){return this.config.spaces}getDataDir(){return this.config.dataDir}getGitBrokerSocket(){return this.config.gitBrokerSocket}getGitBrokerCheckout(){return this.config.gitBrokerCheckout}registerEvalHandler(e,t,r){this.config.evalHandlerRegistry?.register(e,t,r)}async getAppInfo(){return Dr({config:this.config,services:this.services,bootTime:this.bootTime,endpoints:()=>this.listEndpoints(),interactions:()=>this.listInteractions()})}getRuntimeReadiness(){return Mr(this.services)}}var Fs={kind:"service",serviceId:"brain-cli"},Tr=`${Fs.kind}:${Fs.serviceId}`;var Ru=a.object({provider:a.enum(["hetzner","docker"]).default("hetzner"),serverSize:a.string().default("cx33"),location:a.string().default("fsn1"),domain:a.string().optional(),docker:a.object({enabled:a.boolean().default(!0),image:a.string().optional()}).prefault({}),ports:a.object({default:a.number().default(3333),preview:a.number().default(4321),production:a.number().default(8080)}).prefault({}),cdn:a.object({enabled:a.boolean().default(!1),provider:a.enum(["bunny","none"]).default("none")}).prefault({}),dns:a.object({enabled:a.boolean().default(!1),provider:a.enum(["bunny","none"]).default("none")}).prefault({}),paths:a.object({install:a.string().optional(),data:a.string().optional()}).prefault({})}),Ws=a.object({name:a.string().default("brain-app"),version:a.string().default("1.0.0"),database:a.string().optional(),aiApiKey:a.string().optional(),aiImageKey:a.string().optional(),aiModel:a.string().optional(),aiReasoningEffort:ge.optional(),logLevel:me.optional(),logFile:a.string().optional(),profileKind:a.string().trim().min(1).optional(),plugins:a.array(Ue).default([]),spaces:a.array(a.string()).default([]),identity:Bs.optional(),agentInstructions:a.array(a.string()).optional(),deployment:Ru.prefault({})});async function Xs(e,t){await ee({label:"entity",config:e,schema:{assets:Ns,entities:_s,entityMutationReceipts:Js,projectionDirtyInputs:qs,projectionWaves:Hs,projectionIncidents:Gs,projectionWaveInputs:Qs,projectionWaveRules:Ks,projectionRuleMemos:Vs},migrationsFolder:te(import.meta.url,"entity-service"),authTokenEnv:"DATABASE_AUTH_TOKEN",logger:t,afterMigrate:Ys})}async function ra(e,t){await ee({label:"job-queue",config:e,schema:{jobQueue:ea,jobWorkerSessions:ta},migrationsFolder:te(import.meta.url,"job-queue"),authTokenEnv:"JOB_QUEUE_DATABASE_AUTH_TOKEN",logger:t})}async function sa(e,t){await ee({label:"conversation",config:e,schema:{conversations:ia,messages:na,summaryTracking:oa},migrationsFolder:te(import.meta.url,"conversation-service"),authTokenEnv:"CONVERSATION_DATABASE_AUTH_TOKEN",logger:t})}async function aa(e,t){await ee({label:"runtime-state",config:e,schema:{runtimeStateRecords:R},migrationsFolder:te(import.meta.url,"runtime-state"),authTokenEnv:"RUNTIME_STATE_DATABASE_AUTH_TOKEN",logger:t})}import{mkdir as kr}from"fs/promises";import{isAbsolute as wu}from"path";function ca(e=process.env){return{dataDir:e.XDG_DATA_HOME??"./data",cacheDir:e.XDG_CACHE_HOME??"./cache",distDir:"./dist"}}function la(e=process.env){let t=e.BRAIN_GIT_BROKER_CHECKOUT;if(!t)return;if(!wu(t))throw Error(`Git broker checkout path must be absolute: ${t}`);return t}function ua(e=process.env){let t=e.BRAIN_GIT_BROKER_SOCKET;if(!t)return;let r=107;if(Buffer.byteLength(t)>r)throw Error(`Git broker socket path is too long for a unix socket (${Buffer.byteLength(t)} > ${r} bytes): ${t}`);return t}function da(e=process.env){return ie(ca(e))}async function pa(e=process.env){let t=ca(e);try{await kr(t.dataDir,{recursive:!0}),await kr(t.cacheDir,{recursive:!0}),await kr(t.distDir,{recursive:!0})}catch(r){let i=r instanceof Error&&r.message.includes("EACCES")?`Cannot create data directories \u2014 permission denied. Run from a writable directory or check permissions on ${t.dataDir}`:`Cannot create data directories: ${C(r)}`;throw Error(i,{cause:r})}return ie(t)}class Er{logger;migrations;constructor(e,t){this.logger=e,this.migrations=t??{getStandardConfigWithDirectories:()=>pa(),migrateEntities:Xs,migrateJobQueue:ra,migrateConversations:sa,migrateRuntimeState:aa}}async runAllMigrations(e){this.logger.debug("Running database migrations...");let t=await this.migrations.getStandardConfigWithDirectories();if(e?.database)t.database.url=e.database;if(e?.jobQueueDatabase)t.jobQueueDatabase.url=e.jobQueueDatabase;if(e?.conversationDatabase)t.conversationDatabase.url=e.conversationDatabase;if(e?.runtimeStateDatabase)t.runtimeStateDatabase.url=e.runtimeStateDatabase;await this.migrateEntityDatabase(t),await this.migrateJobQueueDatabase(t),await this.migrateConversationDatabase(t),await this.migrateRuntimeStateDatabase(t),this.logger.debug("All database migrations completed successfully")}async migrateEntityDatabase(e){this.logger.debug("Running entity database migrations..."),await this.migrations.migrateEntities({url:e.database.url,...e.database.authToken&&{authToken:e.database.authToken}},this.logger)}async migrateJobQueueDatabase(e){this.logger.debug("Running job queue database migrations..."),await this.migrations.migrateJobQueue({url:e.jobQueueDatabase.url,...e.jobQueueDatabase.authToken&&{authToken:e.jobQueueDatabase.authToken}},this.logger)}async migrateConversationDatabase(e){this.logger.debug("Running conversation database migrations..."),await this.migrations.migrateConversations({url:e.conversationDatabase.url,...e.conversationDatabase.authToken&&{authToken:e.conversationDatabase.authToken}},this.logger)}async migrateRuntimeStateDatabase(e){this.logger.debug("Running runtime state database migrations..."),await this.migrations.migrateRuntimeState({url:e.runtimeStateDatabase.url,...e.runtimeStateDatabase.authToken&&{authToken:e.runtimeStateDatabase.authToken}},this.logger)}}var Iu="NODE_ENV";function Pu(){return process.env[Iu]}function ma(){return Pu()!=="production"}var Tu="startup-check";function ku(e){let r={...Ws.parse(e??{}),plugins:e?.plugins??[]};if(e?.permissions)r.permissions=e.permissions;if(e?.spaces)r.spaces=e.spaces;if(e?.cliConfig)r.cliConfig=e.cliConfig;if(e?.shellConfig)r.shellConfig=e.shellConfig;return r}function Eu(e,t){let r={plugins:e.plugins??[],...e.shellConfig};return xu(r),ju(e,r),Au(e,r,t),Du(e,r),zu(e,r),Ou(e,r),Mu(e,r),Lu(e,r),$u(e,r),r}function xu(e){let t=da();e.database??=t.database,e.jobQueueDatabase??=t.jobQueueDatabase,e.conversationDatabase??=t.conversationDatabase,e.runtimeStateDatabase??=t.runtimeStateDatabase,e.embeddingDatabase??=t.embeddingDatabase,e.embedding??=t.embedding,e.gitBrokerSocket??=ua(),e.gitBrokerCheckout??=la()}function ju(e,t){if(e.database)t.database={url:e.database};if(e.profileKind)t.profileKind=e.profileKind;t.features={}}function Au(e,t,r){let i=r?.mode==="startup-check";if(!e.aiApiKey&&!e.aiImageKey&&!e.aiModel&&!e.aiReasoningEffort&&!i)return;t.ai={...t.ai,...i&&!t.ai?.apiKey&&{apiKey:Tu},...e.aiApiKey&&{apiKey:e.aiApiKey},...e.aiImageKey&&{imageApiKey:e.aiImageKey},...e.aiModel&&{model:e.aiModel},...e.aiReasoningEffort&&{reasoningEffort:e.aiReasoningEffort}}}function Du(e,t){if(!e.logLevel&&!e.logFile)return;t.logging={level:e.logLevel??"info",format:"text",context:e.name,...e.logFile&&{file:e.logFile}}}function zu(e,t){let r=e.permissions?.rules??[];t.permissions={...e.permissions,rules:r.some((i)=>i.pattern===Tr)?r:[{pattern:Tr,level:"admin"},...r]}}function Ou(e,t){if(e.spaces)t.spaces=e.spaces}function Mu(e,t){if(e.identity)t.identity=e.identity}function Lu(e,t){if(e.agentInstructions)t.agentInstructions=e.agentInstructions}function $u(e,t){if(t.name=e.name,t.version=e.version,e.deployment.domain)t.siteBaseUrl=e.deployment.domain;t.localSiteUrl=`http://localhost:${e.deployment.ports.production}`,t.preferLocalUrls=ma()}class jr{shell=null;config;signalScope=null;signalShutdownFiber=null;stopPromise=null;hasCLI=!1;static create(e,t){return new jr(ku(e),t)}constructor(e,t){if(this.config=e,this.hasCLI=process.argv.slice(2).includes("--cli"),t)this.shell=t}async migrate(){let e=U.getInstance();await new Er(e).runAllMigrations({database:this.config.shellConfig?.database?.url??this.config.database,jobQueueDatabase:this.config.shellConfig?.jobQueueDatabase?.url,conversationDatabase:this.config.shellConfig?.conversationDatabase?.url,runtimeStateDatabase:this.config.shellConfig?.runtimeStateDatabase?.url})}createShell(e,t){this.shell=je.createFresh(Eu(this.config,e),void 0,{...t?.processRole&&{processRole:t.processRole},...t?.peerChannel&&{peerChannel:t.peerChannel}})}async registerCLIInterface(){if(!this.hasCLI)return;let e=this.getShell().getPluginManager(),{CLIInterface:t}=await import("./index-1yj28j3y.js"),r=new t(this.config.cliConfig);e.registerPlugin(r)}async initialize(e,t){if(!this.shell){if(!t?.migrationsCompleted)await this.migrate();this.createShell(e,t)}await this.registerCLIInterface(),await this.getShell().initialize(e)}async start(){if(this.stopPromise)return;this.setupSignalHandlers()}stop(){return this.stopPromise??=this.stopApp(),this.stopPromise}async stopApp(){await this.closeSignalScope(),await this.shell?.shutdown()}async run(e){let r={debug:j.DEBUG,info:j.INFO,warn:j.WARN,error:j.ERROR}[this.config.logLevel??"info"]??j.INFO,i=U.createFresh({level:r,context:this.config.name,useStderr:this.hasCLI});if(this.hasCLI)U.getInstance().setUseStderr(!0);try{await this.initialize(void 0,e),await this.start(),e?.onRuntimeReady?.(),i.info(`\u2705 ${this.config.name} v${this.config.version} ready`),process.stdin.resume()}catch(n){i.error(`\u274C Failed to start ${this.config.name}:`,n),process.exit(1)}}static async run(e,t,r){await jr.create(e,t).run(r)}setupSignalHandlers(){if(this.signalScope)return;let e=h.runSync(k.make()),t=()=>{this.requestGracefulShutdown("SIGINT")},r=()=>{this.requestGracefulShutdown("SIGTERM")},i=xr(["SIGINT"],t),n=xr(["SIGTERM"],r);h.runSync(k.addFinalizer(e,h.sync(()=>{n(),i()}))),this.signalScope=e}requestGracefulShutdown(e){if(this.signalShutdownFiber)return;let t=U.getInstance();t.info(`
|
|
33
33
|
Received ${e}, shutting down gracefully...`);let r=h.tryPromise({try:()=>this.stop(),catch:(i)=>i}).pipe(h.match({onFailure:(i)=>{t.error("Error during shutdown:",i),process.exit(1)},onSuccess:()=>{process.exit(0)}}));this.signalShutdownFiber=h.runFork(r)}async closeSignalScope(){let e=this.signalScope;if(this.signalScope=null,e)await h.runPromise(k.close(e,E.void))}getShell(){if(!this.shell)throw Error("Shell not initialized. Call initialize() first.");return this.shell}}
|
|
34
34
|
export{me as Z,ge as _,ke as $,Bo as aa,No as ba,wt as ca,ql as da,yr as ea,Gl as fa,It as ga,Ql as ha,oy as ia,Yo as ja,Yl as ka,vr as la,br as ma,Xl as na,eu as oa,tu as pa,Tu as qa,ku as ra,Eu as sa,jr as ta};
|
|
35
35
|
|
|
36
36
|
//# debugId=0B0CAAB0F16E125B64756E2164756E21
|
|
37
|
-
//# sourceMappingURL=index-
|
|
37
|
+
//# sourceMappingURL=index-e72ehmam.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{T as d,U as t}from"./chunks/index-
|
|
2
|
+
import{T as d,U as t}from"./chunks/index-82mtca3x.js";import"./chunks/index-e72ehmam.js";import"./chunks/index-d86pb7vs.js";import{Yf as a}from"./chunks/index-zzwvfjs6.js";import"./chunks/index-kpt8xb7g.js";import"./chunks/index-2vxfqw6s.js";import"./chunks/index-qycndwgy.js";import"./chunks/index-s8aedkfw.js";import"./chunks/index-1s8837bg.js";import"./chunks/index-nna4x5ae.js";import"./chunks/index-9m34pk29.js";function s(e,i){let o=new Set,n=new Set;for(let r of e){if(!t(r))throw Error(`${i} contains a value that was not returned by use()`);if(o.has(r.definition))throw Error(`${i} contains duplicate plugin definition "${r.definition.id}"; include each configured definition only once`);if(n.has(r.definition.id))throw Error(`${i} contains duplicate local plugin id "${r.definition.id}"; give each package definition a unique local id before composing it`);o.add(r.definition),n.add(r.definition.id)}}function l(e){a(e.id,"Bundle id"),s(e.members,`Bundle "${e.id}"`);for(let i of e.config??[])if(!t(i.member))throw Error(`Bundle "${e.id}" config contains a value that was not returned by use()`);for(let i of e.permissions??[])if(!t(i.member))throw Error(`Bundle "${e.id}" permissions contains a value that was not returned by use()`);for(let i of e.evalDisable??[])if(!t(i))throw Error(`Bundle "${e.id}" evalDisable contains a value that was not returned by use()`);return Object.freeze({...e,members:Object.freeze([...e.members]),...e.config?{config:Object.freeze([...e.config])}:{},...e.permissions?{permissions:Object.freeze([...e.permissions])}:{},...e.agentInstructions?{agentInstructions:Object.freeze([...e.agentInstructions])}:{},...e.evalDisable?{evalDisable:Object.freeze([...e.evalDisable])}:{}})}function u(e){if(!e.name.trim())throw Error("Brain name must not be empty");if(e.bundleContract?.trim().length===0)throw Error("Brain bundleContract must not be empty");s(e.plugins,`Brain "${e.name}"`);let i=new Set(e.plugins),o=new Set;for(let n of e.bundles??[]){if(o.has(n.id))throw Error(`Brain "${e.name}" has duplicate bundle "${n.id}"`);o.add(n.id);for(let r of n.members)if(!i.has(r))throw Error(`Brain "${e.name}" bundle "${n.id}" references a plugin outside its catalog`);for(let r of n.config??[])if(!i.has(r.member))throw Error(`Brain "${e.name}" bundle "${n.id}" config references a plugin outside its catalog`);for(let r of n.permissions??[])if(!i.has(r.member))throw Error(`Brain "${e.name}" bundle "${n.id}" permissions reference a plugin outside its catalog`);for(let r of n.evalDisable??[])if(!i.has(r))throw Error(`Brain "${e.name}" bundle "${n.id}" evalDisable references a plugin outside its catalog`)}for(let n of e.evalDisable??[])if(!i.has(n))throw Error(`Brain "${e.name}" evalDisable references a plugin outside its catalog`);return Object.freeze({...e,plugins:Object.freeze([...e.plugins]),...e.bundles?{bundles:Object.freeze([...e.bundles])}:{},...e.agentInstructions?{agentInstructions:Object.freeze([...e.agentInstructions])}:{},...e.evalDisable?{evalDisable:Object.freeze([...e.evalDisable])}:{}})}export{u as defineBrain,l as defineBundle,d as use};
|
|
3
3
|
|
|
4
4
|
//# debugId=974AB3431508922464756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.js.map
|