@rizom/brain 0.2.0-alpha.224 → 0.2.0-alpha.225
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brain.js +1000 -995
- package/dist/chunks/blog-post-adapter-tk0z5tgh.js +5 -0
- package/dist/chunks/{index-ps0mn8y9.js → index-18d0wj5t.js} +4 -4
- package/dist/chunks/{index-ps0mn8y9.js.map → index-18d0wj5t.js.map} +1 -1
- package/dist/chunks/{index-px8fmtx1.js → index-1qz89akh.js} +4 -4
- package/dist/chunks/{index-px8fmtx1.js.map → index-1qz89akh.js.map} +1 -1
- package/dist/chunks/{index-vtwspye3.js → index-48mg443r.js} +3 -3
- package/dist/chunks/{index-vtwspye3.js.map → index-48mg443r.js.map} +1 -1
- package/dist/chunks/{index-0bjkx8vb.js → index-4xzx30t8.js} +4 -4
- package/dist/chunks/{index-0bjkx8vb.js.map → index-4xzx30t8.js.map} +2 -2
- package/dist/chunks/{index-gca7xnrh.js → index-e933mq3w.js} +3 -3
- package/dist/chunks/{index-gca7xnrh.js.map → index-e933mq3w.js.map} +1 -1
- package/dist/chunks/{index-nqjbkf5n.js → index-gaa2742w.js} +3 -3
- package/dist/chunks/{index-nqjbkf5n.js.map → index-gaa2742w.js.map} +1 -1
- package/dist/chunks/index-gfewwta6.js +6 -0
- package/dist/chunks/{index-59y15khc.js.map → index-gfewwta6.js.map} +2 -2
- package/dist/chunks/{index-57d1xga4.js → index-h1zmmtbw.js} +4 -4
- package/dist/chunks/{index-57d1xga4.js.map → index-h1zmmtbw.js.map} +1 -1
- package/dist/chunks/index-jm9vaxsh.js +10 -0
- package/dist/chunks/{index-836tm28j.js.map → index-jm9vaxsh.js.map} +8 -8
- package/dist/chunks/{index-c93wmj0d.js → index-q53nehd5.js} +4 -4
- package/dist/chunks/{index-c93wmj0d.js.map → index-q53nehd5.js.map} +3 -3
- package/dist/chunks/index-rng6ka15.js +6 -0
- package/dist/chunks/{index-t7hbrpyx.js.map → index-rng6ka15.js.map} +12 -12
- package/dist/chunks/{rss-datasource-c67ta2xa.js → rss-datasource-v805vq9d.js} +3 -3
- package/dist/chunks/{rss-datasource-c67ta2xa.js.map → rss-datasource-v805vq9d.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.js +2 -2
- package/dist/interfaces.js.map +1 -1
- package/dist/plugins.d.ts +17 -5
- package/dist/plugins.js +3 -3
- package/dist/plugins.js.map +3 -3
- package/dist/seed-content/ranger/anchor-profile/anchor-profile.md +1 -1
- package/dist/seed-content/ranger/site-info/site-info.md +1 -0
- package/dist/seed-content/relay/site-info/site-info.md +1 -0
- package/dist/seed-content/rover-seed-content-core/anchor-profile/anchor-profile.md +1 -1
- package/dist/seed-content/rover-seed-content-core/style-guide/style-guide.md +48 -0
- package/dist/seed-content/rover-seed-content-default/anchor-profile/anchor-profile.md +1 -1
- package/dist/seed-content/rover-seed-content-default/site-info/site-info.md +1 -0
- package/dist/seed-content/rover-seed-content-default/style-guide/style-guide.md +48 -0
- package/dist/seed-content/rover-seed-content-full/anchor-profile/anchor-profile.md +1 -1
- package/dist/seed-content/rover-seed-content-full/site-info/site-info.md +1 -0
- package/dist/seed-content/rover-seed-content-full/style-guide/style-guide.md +48 -0
- package/dist/services.js +2 -2
- package/dist/services.js.map +1 -1
- package/dist/site.js +147 -152
- package/dist/site.js.map +32 -24
- 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 +121 -121
- package/dist/ui/cms-app.js.map +6 -6
- package/package.json +1 -1
- package/dist/chunks/blog-post-adapter-gny02sy3.js +0 -5
- package/dist/chunks/index-59y15khc.js +0 -6
- package/dist/chunks/index-836tm28j.js +0 -10
- package/dist/chunks/index-t7hbrpyx.js +0 -6
- /package/dist/chunks/{blog-post-adapter-gny02sy3.js.map → blog-post-adapter-tk0z5tgh.js.map} +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"sources": ["../../../shell/plugins/src/contracts/conversations.ts", "../../../shell/plugins/src/contracts/identity.ts", "../../../shell/conversation-service/src/database.ts", "../../../node_modules/drizzle-orm/sqlite-core/indexes.js", "../../../shell/conversation-service/src/schema.ts", "../../../shell/conversation-service/src/metadata.ts", "../../../shell/conversation-service/src/types.ts", "../../../shell/plugins/src/contracts/agent.ts", "../../../shell/plugins/src/manager/daemon-types.ts", "../../../shell/mcp-service/src/mcp-registration.ts", "../../../shell/mcp-service/src/types.ts", "../../../shell/mcp-service/src/tool-response-validation.ts", "../../../shell/mcp-service/src/tool-helpers.ts", "../../../shell/plugins/src/interfaces.ts", "../../../shell/plugins/src/contracts/app-info.ts", "../../../shell/plugins/src/config.ts", "../../../shell/job-queue/src/schema/types.ts", "../../../shell/job-queue/src/schemas.ts", "../../../shell/job-queue/src/base-job-handler.ts", "../../../shell/job-queue/src/db/index.ts", "../../../shell/job-queue/src/schema/job-queue.ts", "../../../shell/job-queue/src/job-deduplicator.ts", "../../../shared/utils/src/progress.ts", "../../../shell/job-queue/src/job-progress-monitor.ts", "../../../shell/job-queue/src/types.ts", "../../../shell/job-queue/src/job-helpers.ts", "../../../shell/plugins/src/utils/channels.ts", "../../../shell/plugins/src/base/public-app-info.ts", "../../../shell/plugins/src/base/public-conversations.ts", "../../../shell/plugins/src/base/public-identity.ts", "../../../shell/plugins/src/base/namespaces.ts", "../../../shell/plugins/src/base/context.ts", "../../../shell/plugins/src/entity/prompt-resolver.ts", "../../../shell/plugins/src/entity/namespaces.ts", "../../../shell/plugins/src/entity/context.ts", "../../../shell/plugins/src/entity/derived-entity-projection.ts", "../../../shell/plugins/src/base-plugin.ts", "../../../shell/plugins/src/entity/entity-plugin.ts", "../../../shell/plugins/src/base/public-agent-service.ts", "../../../shell/plugins/src/interface/context.ts", "../../../shell/plugins/src/interface/interface-plugin.ts", "../../../shell/plugins/src/message-interface/tool-status.ts", "../../../shell/plugins/src/message-interface/message-content-utils.ts", "../../../shell/plugins/src/message-interface/artifact-entity.ts", "../../../shell/plugins/src/message-interface/artifact-access.ts", "../../../shell/plugins/src/message-interface/progress-handler.ts", "../../../shell/plugins/src/message-interface/tool-event-handler.ts", "../../../shell/plugins/src/message-interface/keyed-cleanup-supervisor.ts", "../../../shell/plugins/src/message-interface/message-interface-plugin.ts", "../../../shell/plugins/src/service/context.ts", "../../../shell/plugins/src/service/service-plugin.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { z } from \"@brains/utils/zod\";\nimport { messageRoleSchema, type MessageRole } from \"@brains/contracts\";\nimport { ExtensionMetadataSchema } from \"./metadata\";\n\n// The canonical message-role contract lives in @brains/contracts; surface it\n// here alongside the Conversation/Message contracts it belongs with.\nexport { messageRoleSchema };\nexport type { MessageRole };\n\nexport const ConversationSchema: z.ZodObject<{\n id: z.ZodString;\n sessionId: z.ZodString;\n interfaceType: z.ZodString;\n channelId: z.ZodString;\n channelName: z.ZodOptional<z.ZodString>;\n startedAt: z.ZodString;\n lastActiveAt: z.ZodString;\n createdAt: z.ZodString;\n updatedAt: z.ZodString;\n metadata: typeof ExtensionMetadataSchema;\n}> = z.object({\n id: z.string(),\n sessionId: z.string(),\n interfaceType: z.string(),\n channelId: z.string(),\n channelName: z.string().optional(),\n startedAt: z.string(),\n lastActiveAt: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n metadata: ExtensionMetadataSchema,\n});\n\nexport type Conversation = z.output<typeof ConversationSchema>;\n\nexport const MessageSchema: z.ZodObject<{\n id: z.ZodString;\n conversationId: z.ZodString;\n role: typeof messageRoleSchema;\n content: z.ZodString;\n timestamp: z.ZodString;\n metadata: typeof ExtensionMetadataSchema;\n}> = z.object({\n id: z.string(),\n conversationId: z.string(),\n role: messageRoleSchema,\n content: z.string(),\n timestamp: z.string(),\n metadata: ExtensionMetadataSchema,\n});\n\nexport type Message = z.output<typeof MessageSchema>;\n",
|
|
6
|
-
"import { z } from \"@brains/utils/zod\";\n\nexport const BrainCharacterSchema: z.ZodObject<{\n name: z.ZodString;\n role: z.ZodString;\n purpose: z.ZodString;\n values: z.ZodArray<z.ZodString>;\n}> = z.object({\n name: z.string(),\n role: z.string(),\n purpose: z.string(),\n values: z.array(z.string()),\n});\n\nexport type BrainCharacter = z.output<typeof BrainCharacterSchema>;\n\nexport const AnchorProfileSchema: z.ZodObject<{\n name: z.ZodString;\n
|
|
6
|
+
"import { z } from \"@brains/utils/zod\";\n\nexport const BrainCharacterSchema: z.ZodObject<{\n name: z.ZodString;\n role: z.ZodString;\n purpose: z.ZodString;\n values: z.ZodArray<z.ZodString>;\n}> = z.object({\n name: z.string(),\n role: z.string(),\n purpose: z.string(),\n values: z.array(z.string()),\n});\n\nexport type BrainCharacter = z.output<typeof BrainCharacterSchema>;\n\nexport const AnchorProfileSchema: z.ZodObject<{\n name: z.ZodString;\n organization: z.ZodOptional<z.ZodString>;\n description: z.ZodOptional<z.ZodString>;\n avatar: z.ZodOptional<z.ZodString>;\n website: z.ZodOptional<z.ZodString>;\n email: z.ZodOptional<z.ZodString>;\n socialLinks: z.ZodOptional<\n z.ZodArray<\n z.ZodObject<{\n platform: z.ZodEnum<{\n github: \"github\";\n instagram: \"instagram\";\n linkedin: \"linkedin\";\n email: \"email\";\n website: \"website\";\n }>;\n url: z.ZodString;\n label: z.ZodOptional<z.ZodString>;\n }>\n >\n >;\n}> = z.object({\n name: z.string(),\n organization: z.string().optional(),\n description: z.string().optional(),\n avatar: z.string().optional(),\n website: z.string().optional(),\n email: z.string().optional(),\n socialLinks: z\n .array(\n z.object({\n platform: z.enum([\n \"github\",\n \"instagram\",\n \"linkedin\",\n \"email\",\n \"website\",\n ]),\n url: z.string(),\n label: z.string().optional(),\n }),\n )\n .optional(),\n});\n\nexport type AnchorProfile = z.output<typeof AnchorProfileSchema>;\n",
|
|
7
7
|
"import { createClient, type Client } from \"@libsql/client\";\nimport { drizzle } from \"drizzle-orm/libsql\";\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\nimport { conversations, messages, summaryTracking } from \"./schema\";\nimport type { ConversationDbConfig } from \"./types\";\n\nexport type ConversationDB = LibSQLDatabase<Record<string, unknown>>;\n\n/**\n * Create a conversation database connection\n * Config is now required - use createShellServiceConfig() for standard paths\n */\nexport function createConversationDatabase(config: ConversationDbConfig): {\n db: ConversationDB;\n client: Client;\n url: string;\n} {\n const url = config.url;\n\n const authToken =\n config.authToken ?? process.env[\"CONVERSATION_DATABASE_AUTH_TOKEN\"];\n\n const client = authToken\n ? createClient({ url, authToken })\n : createClient({ url });\n\n const db = drizzle(client, {\n schema: { conversations, messages, summaryTracking },\n });\n\n return { db, client, url };\n}\n\n/**\n * Enable WAL mode and set busy timeout for better concurrent access\n */\nexport async function enableWALModeForConversations(\n client: Client,\n url: string,\n): Promise<void> {\n // Only enable WAL mode and busy timeout for local SQLite files\n if (url.startsWith(\"file:\")) {\n await client.execute(\"PRAGMA journal_mode = WAL\");\n // Set busy timeout to 5 seconds - SQLite will wait instead of returning SQLITE_BUSY\n await client.execute(\"PRAGMA busy_timeout = 5000\");\n }\n}\n",
|
|
8
8
|
"import { entityKind } from \"../entity.js\";\nclass IndexBuilderOn {\n constructor(name, unique) {\n this.name = name;\n this.unique = unique;\n }\n static [entityKind] = \"SQLiteIndexBuilderOn\";\n on(...columns) {\n return new IndexBuilder(this.name, columns, this.unique);\n }\n}\nclass IndexBuilder {\n static [entityKind] = \"SQLiteIndexBuilder\";\n /** @internal */\n config;\n constructor(name, columns, unique) {\n this.config = {\n name,\n columns,\n unique,\n where: void 0\n };\n }\n /**\n * Condition for partial index.\n */\n where(condition) {\n this.config.where = condition;\n return this;\n }\n /** @internal */\n build(table) {\n return new Index(this.config, table);\n }\n}\nclass Index {\n static [entityKind] = \"SQLiteIndex\";\n config;\n constructor(config, table) {\n this.config = { ...config, table };\n }\n}\nfunction index(name) {\n return new IndexBuilderOn(name, false);\n}\nfunction uniqueIndex(name) {\n return new IndexBuilderOn(name, true);\n}\nexport {\n Index,\n IndexBuilder,\n IndexBuilderOn,\n index,\n uniqueIndex\n};\n//# sourceMappingURL=indexes.js.map",
|
|
9
9
|
"import {\n index,\n integer,\n sqliteTable,\n text,\n type SQLiteColumn,\n type SQLiteTableWithColumns,\n} from \"drizzle-orm/sqlite-core\";\n\ntype ConversationTextColumn<\n TTable extends string,\n TName extends string,\n TNotNull extends boolean,\n TPrimaryKey extends boolean = false,\n> = SQLiteColumn<\n {\n name: TName;\n tableName: TTable;\n dataType: \"string\";\n columnType: \"SQLiteText\";\n data: TNotNull extends true ? string : string | null;\n driverParam: string;\n notNull: TNotNull;\n hasDefault: false;\n isPrimaryKey: TPrimaryKey;\n isAutoincrement: false;\n hasRuntimeDefault: false;\n enumValues: [string, ...string[]];\n baseColumn: never;\n identity: undefined;\n generated: undefined;\n },\n Record<string, never>,\n { length: number | undefined }\n>;\n\ntype ConversationIntegerColumn<\n TTable extends string,\n TName extends string,\n THasDefault extends boolean,\n> = SQLiteColumn<\n {\n name: TName;\n tableName: TTable;\n dataType: \"number\";\n columnType: \"SQLiteInteger\";\n data: number | null;\n driverParam: number;\n notNull: false;\n hasDefault: THasDefault;\n isPrimaryKey: false;\n isAutoincrement: false;\n hasRuntimeDefault: false;\n enumValues: undefined;\n baseColumn: never;\n identity: undefined;\n generated: undefined;\n },\n Record<string, never>,\n Record<string, never>\n>;\n\ntype ConversationsTable = SQLiteTableWithColumns<{\n name: \"conversations\";\n schema: undefined;\n columns: {\n id: ConversationTextColumn<\"conversations\", \"id\", true, true>;\n sessionId: ConversationTextColumn<\"conversations\", \"session_id\", true>;\n interfaceType: ConversationTextColumn<\n \"conversations\",\n \"interface_type\",\n true\n >;\n channelId: ConversationTextColumn<\"conversations\", \"channel_id\", true>;\n started: ConversationTextColumn<\"conversations\", \"started\", true>;\n lastActive: ConversationTextColumn<\"conversations\", \"last_active\", true>;\n metadata: ConversationTextColumn<\"conversations\", \"metadata\", false>;\n created: ConversationTextColumn<\"conversations\", \"created\", true>;\n updated: ConversationTextColumn<\"conversations\", \"updated\", true>;\n };\n dialect: \"sqlite\";\n}>;\n\ntype MessagesTable = SQLiteTableWithColumns<{\n name: \"messages\";\n schema: undefined;\n columns: {\n id: ConversationTextColumn<\"messages\", \"id\", true, true>;\n conversationId: ConversationTextColumn<\"messages\", \"conversation_id\", true>;\n role: ConversationTextColumn<\"messages\", \"role\", true>;\n content: ConversationTextColumn<\"messages\", \"content\", true>;\n timestamp: ConversationTextColumn<\"messages\", \"timestamp\", true>;\n metadata: ConversationTextColumn<\"messages\", \"metadata\", false>;\n };\n dialect: \"sqlite\";\n}>;\n\ntype SummaryTrackingTable = SQLiteTableWithColumns<{\n name: \"summary_tracking\";\n schema: undefined;\n columns: {\n conversationId: ConversationTextColumn<\n \"summary_tracking\",\n \"conversation_id\",\n true,\n true\n >;\n lastSummarizedAt: ConversationTextColumn<\n \"summary_tracking\",\n \"last_summarized_at\",\n false\n >;\n lastMessageId: ConversationTextColumn<\n \"summary_tracking\",\n \"last_message_id\",\n false\n >;\n messagesSinceSummary: ConversationIntegerColumn<\n \"summary_tracking\",\n \"messages_since_summary\",\n true\n >;\n updated: ConversationTextColumn<\"summary_tracking\", \"updated\", true>;\n };\n dialect: \"sqlite\";\n}>;\n\n/**\n * Conversations table - tracks conversation sessions\n */\nexport const conversations: ConversationsTable = sqliteTable(\n \"conversations\",\n {\n id: text(\"id\").primaryKey(),\n sessionId: text(\"session_id\").notNull(), // CLI session ID, Matrix room ID, etc.\n interfaceType: text(\"interface_type\").notNull(), // 'cli' | 'matrix' | 'mcp'\n channelId: text(\"channel_id\").notNull(), // Channel or room identifier\n started: text(\"started\").notNull(),\n lastActive: text(\"last_active\").notNull(),\n metadata: text(\"metadata\"), // JSON string for additional optional data\n created: text(\"created\").notNull(),\n updated: text(\"updated\").notNull(),\n },\n (table) => ({\n sessionIdx: index(\"idx_conversations_session\").on(table.sessionId),\n channelIdx: index(\"idx_conversations_channel\").on(table.channelId),\n interfaceSessionIdx: index(\"idx_conversations_interface_session\").on(\n table.interfaceType,\n table.sessionId,\n ),\n interfaceChannelIdx: index(\"idx_conversations_interface_channel\").on(\n table.interfaceType,\n table.channelId,\n ),\n }),\n);\n\n/**\n * Messages table - stores individual messages in conversations\n */\nexport const messages: MessagesTable = sqliteTable(\n \"messages\",\n {\n id: text(\"id\").primaryKey(),\n conversationId: text(\"conversation_id\")\n .notNull()\n .references(() => conversations.id, { onDelete: \"cascade\" }),\n role: text(\"role\").notNull(), // 'user' | 'assistant'\n content: text(\"content\").notNull(),\n timestamp: text(\"timestamp\").notNull(),\n metadata: text(\"metadata\"), // JSON string for command used, entity refs, etc.\n },\n (table) => ({\n conversationIdx: index(\"idx_messages_conversation\").on(\n table.conversationId,\n ),\n timestampIdx: index(\"idx_messages_timestamp\").on(table.timestamp),\n }),\n);\n\n/**\n * Summary tracking table - tracks when summaries were created\n */\nexport const summaryTracking: SummaryTrackingTable = sqliteTable(\n \"summary_tracking\",\n {\n conversationId: text(\"conversation_id\")\n .primaryKey()\n .references(() => conversations.id, { onDelete: \"cascade\" }),\n lastSummarizedAt: text(\"last_summarized_at\"),\n lastMessageId: text(\"last_message_id\"),\n messagesSinceSummary: integer(\"messages_since_summary\").default(0),\n updated: text(\"updated\").notNull(),\n },\n);\n\n// Type exports for use in the service\nexport type Conversation = typeof conversations.$inferSelect;\nexport type NewConversation = typeof conversations.$inferInsert;\nexport type Message = typeof messages.$inferSelect;\nexport type NewMessage = typeof messages.$inferInsert;\nexport type SummaryTracking = typeof summaryTracking.$inferSelect;\nexport type NewSummaryTracking = typeof summaryTracking.$inferInsert;\n",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\nimport { type ProgressNotification } from \"@brains/utils/progress\";\nimport { z, type ZodRawShape } from \"@brains/utils/zod\";\nimport type { UserPermissionLevel } from \"@brains/templates\";\n\n/**\n * Tool visibility levels for permission control\n * Uses the same levels as UserPermissionLevel for consistency\n */\nexport type ToolVisibility = UserPermissionLevel;\n\n/**\n * Tool execution context\n * Provides progress reporting and routing metadata\n */\nexport interface ToolContext {\n // Progress reporting\n progressToken?: string | number;\n sendProgress?: (notification: ProgressNotification) => Promise<void>;\n /** Cancellation for the active request; handlers may opt in. */\n signal?: AbortSignal;\n\n // Routing metadata for job creation (required for proper context propagation)\n interfaceType: string; // Which interface called the tool (e.g., \"mcp\", \"cli\", \"matrix\")\n userId: string; // User who invoked the tool\n conversationId?: string; // Durable conversation/session id for conversation-scoped tools when available\n channelId?: string; // Transport channel/room context (for Matrix, etc.)\n channelName?: string; // Human-readable channel name (for display)\n runId?: string; // Runtime workflow/playbook run context when available\n toolCallId?: string; // AI SDK tool call id when invoked by an agent\n /** Caller's permission level. Tools that read/write entities use this to derive\n * the content-visibility scope they are allowed to see. */\n userPermissionLevel?: UserPermissionLevel;\n}\n\nexport interface ToolContextRouting {\n interfaceType: string;\n userId: string;\n conversationId?: string | undefined;\n channelId?: string | undefined;\n channelName?: string | undefined;\n runId?: string | undefined;\n toolCallId?: string | undefined;\n userPermissionLevel?: UserPermissionLevel | undefined;\n}\n\ninterface ToolContextRoutingSchemaShape extends ZodRawShape {\n interfaceType: z.ZodString;\n userId: z.ZodString;\n conversationId: z.ZodOptional<z.ZodString>;\n channelId: z.ZodOptional<z.ZodString>;\n channelName: z.ZodOptional<z.ZodString>;\n runId: z.ZodOptional<z.ZodString>;\n toolCallId: z.ZodOptional<z.ZodString>;\n userPermissionLevel: z.ZodOptional<\n z.ZodEnum<{\n anchor: \"anchor\";\n trusted: \"trusted\";\n public: \"public\";\n }>\n >;\n}\n\n/**\n * Schema for ToolContext routing metadata\n * Used to validate routing information in tool execution requests\n */\nexport const ToolContextRoutingSchema: z.ZodObject<ToolContextRoutingSchemaShape> =\n z.object({\n interfaceType: z.string(),\n userId: z.string(),\n conversationId: z.string().optional(),\n channelId: z.string().optional(),\n channelName: z.string().optional(),\n runId: z.string().optional(),\n toolCallId: z.string().optional(),\n userPermissionLevel: z.enum([\"anchor\", \"trusted\", \"public\"]).optional(),\n });\n\nexport interface ToolSuccessResponse {\n success: true;\n data?: unknown;\n message?: string | undefined;\n cached?: true | undefined;\n}\n\n/**\n * Success response schema\n */\nexport const toolSuccessSchema: z.ZodType<ToolSuccessResponse> = z.strictObject(\n {\n success: z.literal(true),\n data: z.unknown().optional(),\n message: z.string().optional(),\n cached: z.literal(true).optional(),\n },\n);\n\nexport interface ToolErrorResponse {\n success: false;\n error: string;\n code?: string | undefined;\n}\n\n/**\n * Error response schema\n */\nexport const toolErrorSchema: z.ZodType<ToolErrorResponse> = z.strictObject({\n success: z.literal(false),\n error: z.string(),\n code: z.string().optional(),\n});\n\n/**\n * Confirmation response schema\n * Tools return this when an operation needs user approval.\n * The agent service detects this shape and enters the confirmation flow.\n */\nexport interface ToolConfirmation {\n needsConfirmation: true;\n toolName: string;\n summary: string;\n completionSummary?: string | undefined;\n preview?: string | undefined;\n args: unknown;\n}\n\nexport const toolConfirmationSchema: z.ZodType<ToolConfirmation> =\n z.strictObject({\n needsConfirmation: z.literal(true),\n toolName: z.string(),\n summary: z.string(),\n completionSummary: z.string().optional(),\n preview: z.string().optional(),\n args: z.unknown(),\n });\n\n/**\n * Standardized tool response schema\n * All tools return one of: success, error, or confirmation request.\n */\nexport type ToolResponse =\n ToolSuccessResponse | ToolErrorResponse | ToolConfirmation;\n\nexport const toolResponseSchema: z.ZodType<ToolResponse> = z.union([\n toolSuccessSchema,\n toolErrorSchema,\n toolConfirmationSchema,\n]);\n\nexport type ToolSideEffects = \"none\" | \"writes\" | \"external\";\nexport type ToolInputSchema = ZodRawShape;\nexport type ToolOutputSchema = z.ZodType;\nexport type MCPProtocolMode = \"basic\" | \"debug\";\n\n/**\n * Tool definition\n * @template TOutput - The output type, defaults to ToolResponse for backward compatibility\n */\nexport interface Tool<TOutput = ToolResponse> {\n name: string;\n description: string;\n inputSchema: ToolInputSchema;\n outputSchema?: ToolOutputSchema; // Optional: Zod schema for type-safe outputs\n handler: (input: unknown, context: ToolContext) => Promise<TOutput>;\n visibility?: ToolVisibility; // Default: \"anchor\" for safety - only explicitly marked tools are public\n /** Declares whether this tool is safe to repeat/cache within one model turn. Undefined defaults to not cacheable. */\n sideEffects?: ToolSideEffects;\n /** MCP protocol annotations advertised to external clients. Derived from sideEffects when omitted. */\n annotations?: ToolAnnotations;\n /** Optional CLI metadata — makes this tool invocable as a brain CLI command */\n cli?: {\n /** CLI command name (e.g. \"list\", \"sync\", \"build\") */\n name: string;\n };\n}\n\n/**\n * Resource definition\n */\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n handler: () => Promise<{\n contents: Array<{\n text: string;\n uri: string;\n mimeType?: string;\n }>;\n }>;\n}\n\n/**\n * Variables extracted from a URI template.\n * Generic parameter ensures handlers receive typed vars, not loose index signatures.\n */\nexport type ResourceVars<K extends string = string> = { [P in K]: string };\n\n/**\n * A parameterized resource with URI template (e.g. \"entity://{type}/{id}\")\n */\nexport interface ResourceTemplate<K extends string = string> {\n name: string;\n uriTemplate: string;\n description?: string;\n mimeType?: string;\n /** List all concrete resources matching this template (for resources/list) */\n list?: () => Promise<Array<{ uri: string; name: string }>>;\n /** Autocomplete values for template variables (populates client selectors) */\n complete?: Record<\n K,\n (\n value: string,\n context?: { arguments?: Partial<ResourceVars<K>> },\n ) => string[] | Promise<string[]>\n >;\n /** Read a single resource by resolved template variables */\n handler: (vars: ResourceVars<K>) => Promise<{\n contents: Array<{ text: string; uri: string; mimeType?: string }>;\n }>;\n}\n\n/**\n * An MCP prompt — parameterized message template for client prompt pickers\n */\nexport interface Prompt {\n name: string;\n description?: string;\n args: Record<string, { description: string; required?: boolean }>;\n handler: (args: Record<string, string>) => Promise<{\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: { type: \"text\"; text: string };\n }>;\n }>;\n /** Default: \"anchor\" — prompt bodies can reference restricted workflows,\n * so they ship as anchor-only unless explicitly marked. */\n visibility?: ToolVisibility;\n}\n\n/**\n * Minimal interface exposed to transport layers\n * Only provides what's needed to connect transports to the MCP server\n */\nexport interface IMCPTransport {\n /**\n * Get the underlying MCP server for transport layers to connect to\n * Transport layers should import McpServer type from @modelcontextprotocol/sdk directly\n */\n getMcpServer(): McpServer;\n\n /**\n * Create a fresh MCP server instance with all registered tools/resources.\n * Required for Streamable HTTP where each session needs its own server.\n */\n createMcpServer(permissionLevel?: UserPermissionLevel): McpServer;\n\n /**\n * Set the permission level for this transport\n */\n setPermissionLevel(level: UserPermissionLevel): void;\n\n /** Select which registered tools are exposed on the external MCP protocol server. */\n setProtocolMode(mode: MCPProtocolMode): void;\n}\n\n/**\n * Full MCP Service interface for managing tool and resource registration\n * Extends the transport interface with registration capabilities\n */\nexport interface IMCPService extends IMCPTransport {\n /**\n * Register a tool with the MCP server\n */\n registerTool(pluginId: string, tool: Tool): void;\n\n /**\n * Register a resource with the MCP server\n */\n registerResource(pluginId: string, resource: Resource): void;\n\n /**\n * Register a resource template with parameterized URI\n */\n registerResourceTemplate<K extends string = string>(\n pluginId: string,\n template: ResourceTemplate<K>,\n ): void;\n\n /**\n * Register an MCP prompt\n */\n registerPrompt(pluginId: string, prompt: Prompt): void;\n\n /**\n * List all registered tools\n */\n listTools(): Array<{ pluginId: string; tool: Tool }>;\n\n /**\n * List tools that have CLI metadata (invocable as brain CLI commands)\n */\n getCliTools(): Array<{ pluginId: string; tool: Tool }>;\n\n /**\n * List tools filtered by user permission level\n */\n listToolsForPermissionLevel(\n userLevel: UserPermissionLevel,\n ): Array<{ pluginId: string; tool: Tool }>;\n\n /**\n * List all registered resources\n */\n listResources(): Array<{ pluginId: string; resource: Resource }>;\n\n /**\n * Register behavioral instructions from a plugin for the agent system prompt\n */\n registerInstructions(pluginId: string, instructions: string): void;\n\n /** Remove every tool, resource, prompt, and instruction owned by a plugin. */\n unregisterPlugin?(pluginId: string): void;\n\n /**\n * Get all registered plugin instructions\n */\n getInstructions(): string[];\n}\n\n/**\n * Tool registration info\n */\nexport interface ToolInfo {\n name: string;\n description: string;\n pluginId: string;\n}\n",
|
|
16
16
|
"import type { MessageResponse } from \"@brains/messaging-service\";\nimport { type Logger } from \"@brains/utils/logger\";\nimport { z } from \"@brains/utils/zod\";\nimport { toolResponseSchema, type Tool, type ToolResponse } from \"./types\";\n\ninterface ToolResponseValidationContext {\n pluginId: string;\n toolName: string;\n logger: Logger;\n}\n\nfunction invalidToolResponse(toolName: string): ToolResponse {\n return {\n success: false,\n error: `Tool ${toolName} returned an invalid response shape`,\n };\n}\n\nfunction invalidEnvelopeResponse(\n toolName: string,\n): MessageResponse<ToolResponse> {\n return {\n success: false,\n error: `Tool ${toolName} returned an invalid message response envelope`,\n };\n}\n\n/**\n * Envelope shape returned by message-bus handlers for `plugin:*:tool:execute`.\n * Success branch carries the raw tool response in `data`; error branch is the\n * bus-level failure (e.g. tool not found, payload invalid). Anything else\n * (missing `success`, `noop`, wrong types) is rejected by the union.\n */\nconst toolExecutionEnvelopeSchema = z.union([\n z.looseObject({ success: z.literal(true) }),\n z.object({ success: z.literal(false), error: z.string() }),\n]);\n\nfunction hasEnvelopeData(value: {\n success: true;\n}): value is { success: true; data: unknown } {\n return Object.prototype.hasOwnProperty.call(value, \"data\");\n}\n\nexport function normalizeToolResponse(\n raw: unknown,\n context: ToolResponseValidationContext,\n): ToolResponse {\n const parsed = toolResponseSchema.safeParse(raw);\n\n if (\n parsed.success &&\n \"success\" in parsed.data &&\n parsed.data.success === true &&\n !Object.prototype.hasOwnProperty.call(parsed.data, \"data\")\n ) {\n context.logger.error(\"Tool returned non-compliant response\", {\n pluginId: context.pluginId,\n toolName: context.toolName,\n issues: [{ path: [\"data\"], message: \"Required\" }],\n });\n return invalidToolResponse(context.toolName);\n }\n\n if (parsed.success) {\n return parsed.data;\n }\n\n context.logger.error(\"Tool returned non-compliant response\", {\n pluginId: context.pluginId,\n toolName: context.toolName,\n issues: parsed.error.issues,\n });\n\n return invalidToolResponse(context.toolName);\n}\n\nexport function normalizeToolExecutionMessageResponse(\n response: unknown,\n context: ToolResponseValidationContext,\n): MessageResponse<ToolResponse> {\n const parsed = toolExecutionEnvelopeSchema.safeParse(response);\n\n if (!parsed.success) {\n context.logger.error(\"Tool returned non-compliant message response\", {\n pluginId: context.pluginId,\n toolName: context.toolName,\n response,\n });\n return invalidEnvelopeResponse(context.toolName);\n }\n\n if (!parsed.data.success) {\n return { success: false, error: parsed.data.error };\n }\n\n if (!hasEnvelopeData(parsed.data)) {\n context.logger.error(\"Tool returned non-compliant message response\", {\n pluginId: context.pluginId,\n toolName: context.toolName,\n response,\n });\n return invalidEnvelopeResponse(context.toolName);\n }\n\n return {\n success: true,\n data: normalizeToolResponse(parsed.data.data, context),\n };\n}\n\nexport function wrapToolWithResponseValidation(\n pluginId: string,\n tool: Tool,\n logger: Logger,\n): Tool {\n return {\n ...tool,\n handler: async (input, context): Promise<ToolResponse> => {\n const raw = await tool.handler(input, context);\n return normalizeToolResponse(raw, {\n pluginId,\n toolName: tool.name,\n logger,\n });\n },\n };\n}\n",
|
|
17
17
|
"import type { Tool, Resource, ToolResponse, ToolContext } from \"./types\";\nimport { getErrorMessage } from \"@brains/utils/error\";\nimport { Logger } from \"@brains/utils/logger\";\nimport { z, type ZodRawShape } from \"@brains/utils/zod\";\n\nexport interface ToolSuccessResult<T = unknown> {\n success: true;\n data: T;\n message?: string | undefined;\n}\n\nexport interface ToolErrorResult {\n success: false;\n error: string;\n code?: string | undefined;\n}\n\n/**\n * Zod schema for tool result validation\n * Use this to parse/validate tool results at runtime\n */\nexport const toolResultSchema: z.ZodType<ToolSuccessResult | ToolErrorResult> =\n z.union([\n z.object({\n success: z.literal(true),\n data: z.unknown(),\n message: z.string().optional(),\n }),\n z.object({\n success: z.literal(false),\n error: z.string(),\n code: z.string().optional(),\n }),\n ]);\n\n/**\n * Standardized tool result type derived from schema\n * All tools should return this format for consistent handling\n *\n * @template T - The type of data returned on success (defaults to unknown)\n */\nexport type ToolResult<T = unknown> = ToolSuccessResult<T> | ToolErrorResult;\n\n/**\n * Helper to create a success result\n */\nexport function toolSuccess<T>(data: T, message?: string): ToolResult<T> {\n return message ? { success: true, data, message } : { success: true, data };\n}\n\n/**\n * Helper to create an error result\n */\nexport function toolError(error: string, code?: string): ToolResult<never> {\n return code ? { success: false, error, code } : { success: false, error };\n}\n\n/**\n * Create a tool with auto-validation and consistent response format.\n *\n * - Input is automatically validated against the schema\n * - Handler receives typed input (no manual parsing needed)\n * - Must return `ToolResult<T>` for consistent response format\n * - Validation errors are automatically caught and formatted\n *\n * @example\n * ```typescript\n * const captureSchema = z.object({\n * url: z.string().url(),\n * title: z.string().optional(),\n * });\n *\n * createTool(\n * pluginId,\n * \"capture\",\n * \"Capture a link\",\n * captureSchema,\n * async (input, ctx) => {\n * // input is typed as { url: string; title?: string }\n * const link = await captureLink(input.url);\n * return toolSuccess({ linkId: link.id });\n * }\n * );\n * ```\n */\nfunction formatZodError(error: z.ZodError): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n return `${path}: ${issue.message}`;\n })\n .join(\", \");\n}\n\nexport function createTool<\n TSchema extends z.ZodObject<ZodRawShape>,\n TOutput = unknown,\n>(\n pluginId: string,\n name: string,\n description: string,\n inputSchema: TSchema,\n handler: (\n input: z.output<TSchema>,\n context: ToolContext,\n ) => Promise<ToolResult<TOutput>>,\n options: {\n visibility?: Tool[\"visibility\"];\n sideEffects?: Tool[\"sideEffects\"];\n annotations?: Tool[\"annotations\"];\n debug?: boolean;\n cli?: Tool[\"cli\"];\n } = {},\n): Tool {\n const {\n visibility = \"anchor\",\n sideEffects,\n annotations,\n debug = false,\n cli,\n } = options;\n const logger = debug ? Logger.createFresh({ context: pluginId }) : null;\n const inputShape = inputSchema.shape;\n\n return {\n name: `${pluginId}_${name}`,\n description,\n inputSchema: inputShape,\n handler: async (input, context): Promise<ToolResponse> => {\n logger?.debug(`Tool ${name} started`);\n try {\n // Auto-validate input\n const parseResult = inputSchema.safeParse(input);\n if (!parseResult.success) {\n const errorMessage = formatZodError(parseResult.error);\n logger?.debug(`Tool ${name} validation failed: ${errorMessage}`);\n return {\n success: false,\n error: `Invalid input: ${errorMessage}`,\n };\n }\n\n // Call handler with validated, typed input\n const result = await handler(parseResult.data, context);\n logger?.debug(`Tool ${name} completed`);\n return result;\n } catch (error) {\n logger?.error(`Tool ${name} failed`, error);\n const errorMessage = getErrorMessage(error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n visibility,\n ...(sideEffects ? { sideEffects } : {}),\n ...(annotations ? { annotations } : {}),\n ...(cli ? { cli } : {}),\n };\n}\n\n/**\n * Create a resource with consistent structure and optional debug logging.\n *\n * Use this in resource factory functions instead of building resource objects manually.\n */\nexport function createResource(\n pluginId: string,\n uri: string,\n name: string,\n description: string,\n handler: Resource[\"handler\"],\n options: {\n mimeType?: string;\n debug?: boolean;\n } = {},\n): Resource {\n const { mimeType = \"text/plain\", debug = false } = options;\n const logger = debug ? Logger.createFresh({ context: pluginId }) : null;\n\n return {\n uri: `${pluginId}_${uri}`,\n name,\n description,\n mimeType,\n handler: async (): Promise<{\n contents: Array<{\n text: string;\n uri: string;\n mimeType?: string;\n }>;\n }> => {\n logger?.debug(`Resource ${uri} started`);\n try {\n const result = await handler();\n logger?.debug(`Resource ${uri} completed`);\n return result;\n } catch (error) {\n logger?.error(`Resource ${uri} failed`, error);\n throw error;\n }\n },\n };\n}\n",
|
|
18
|
-
"import { z } from \"@brains/utils/zod\";\nimport type {\n EntityActionPolicyConfig,\n UserPermissionLevel,\n} from \"@brains/templates\";\nimport {\n defaultQueryResponseSchema,\n simpleTextResponseSchema,\n createEntityResponseSchema,\n updateEntityResponseSchema,\n type DefaultQueryResponse,\n type SimpleTextResponse,\n type CreateEntityResponse,\n type UpdateEntityResponse,\n} from \"@brains/contracts\";\nimport type { IMessageBus } from \"@brains/messaging-service\";\nimport { DaemonStatusInfoSchema, type Daemon } from \"./manager/daemon-types\";\nimport type { IContentService } from \"@brains/content-service\";\nimport type { Template } from \"@brains/templates\";\nimport type { Logger } from \"@brains/utils/logger\";\nimport type {\n ContentVisibility,\n IEntityService,\n IEntityRegistry,\n ICoreEntityService,\n} from \"@brains/entity-service\";\nimport type {\n Tool,\n Resource,\n ResourceTemplate,\n Prompt,\n ToolInfo,\n} from \"@brains/mcp-service\";\nexport type {\n ToolVisibility,\n ToolContext,\n ToolResponse,\n ToolConfirmation,\n Tool,\n Resource,\n ResourceTemplate,\n Prompt,\n ToolInfo,\n} from \"@brains/mcp-service\";\nexport {\n toolResponseSchema,\n ToolContextRoutingSchema,\n} from \"@brains/mcp-service\";\nimport type { IJobQueueService, IJobsNamespace } from \"@brains/job-queue\";\nimport type { RenderService } from \"@brains/templates\";\nimport type { IConversationService } from \"@brains/conversation-service\";\nimport type { IMCPTransport } from \"@brains/mcp-service\";\nimport type { PermissionService } from \"@brains/templates\";\nimport type { DataSourceRegistry } from \"@brains/entity-service\";\nimport type { BrainCharacter } from \"@brains/identity-service\";\nimport type { AnchorProfile } from \"@brains/identity-service\";\nimport type { IAgentService } from \"@brains/ai-service\";\nimport type { IAttachmentsNamespace } from \"./service/attachment-registry\";\nimport type { IRecurringChecksNamespace } from \"@brains/recurring-checks\";\nimport type { IRuntimeStateNamespace } from \"@brains/runtime-state\";\nimport type { IRuntimeUploadsNamespace } from \"./service/upload-registry\";\nimport type {\n AIGenerationSchema,\n ImageGenerationOptions,\n ImageGenerationResult,\n} from \"@brains/ai-service\";\nimport type { RegisteredApiRoute } from \"./types/api-routes\";\nimport type { RegisteredWebRoute } from \"./types/web-routes\";\nimport type { EntityDisplayEntry } from \"@brains/site-composition\";\n\n/**\n * Handler function for plugin evaluations\n * Plugins register these to enable direct (non-chat) testing\n */\nexport type EvalHandler<TInput = unknown, TOutput = unknown> = (\n input: TInput,\n) => Promise<TOutput>;\n\n/**\n * Registry interface for plugin eval handlers\n * Abstraction that allows dependency inversion - implementation lives in ai-evaluation\n */\nexport interface IEvalHandlerRegistry {\n register(pluginId: string, handlerId: string, handler: EvalHandler): void;\n get(pluginId: string, handlerId: string): EvalHandler | undefined;\n has(pluginId: string, handlerId: string): boolean;\n list(): Array<{ pluginId: string; handlerId: string }>;\n unregister(pluginId: string, handlerId: string): boolean;\n}\n\n/**\n * Plugin info for status display\n */\nexport const pluginInfoSchema: z.ZodObject<{\n id: z.ZodString;\n type: z.ZodString;\n version: z.ZodString;\n status: z.ZodString;\n}> = z.object({\n id: z.string(),\n type: z.string(),\n version: z.string(),\n status: z.string(),\n});\n\n/**\n * Tool info for status display\n */\nexport const toolInfoSchema: z.ZodObject<{\n name: z.ZodString;\n description: z.ZodString;\n}> = z.object({\n name: z.string(),\n description: z.string(),\n});\n\n/**\n * Endpoint info — plugins advertise their user-facing URLs via\n * `context.endpoints.register({...})`. Shell collects and exposes\n * through `appInfo.endpoints` so the dashboard (and anything else)\n * can render them without knowing about individual plugins.\n */\nconst userPermissionLevelSchema: z.ZodEnum<{\n anchor: \"anchor\";\n trusted: \"trusted\";\n public: \"public\";\n}> = z.enum([\"anchor\", \"trusted\", \"public\"]);\n\nexport const endpointInfoSchema: z.ZodObject<{\n label: z.ZodString;\n url: z.ZodString;\n pluginId: z.ZodString;\n priority: z.ZodDefault<z.ZodNumber>;\n visibility: z.ZodDefault<typeof userPermissionLevelSchema>;\n}> = z.object({\n label: z.string(),\n url: z.string(),\n pluginId: z.string(),\n priority: z.number().default(100),\n visibility: userPermissionLevelSchema.default(\"public\"),\n});\n\nexport type EndpointInfo = z.output<typeof endpointInfoSchema>;\nexport type EndpointInfoInput = z.input<typeof endpointInfoSchema>;\n\nexport const interactionKindSchema: z.ZodEnum<{\n human: \"human\";\n agent: \"agent\";\n admin: \"admin\";\n protocol: \"protocol\";\n}> = z.enum([\"human\", \"agent\", \"admin\", \"protocol\"]);\n\nexport const interactionStatusSchema: z.ZodEnum<{\n available: \"available\";\n \"coming-soon\": \"coming-soon\";\n disabled: \"disabled\";\n}> = z.enum([\"available\", \"coming-soon\", \"disabled\"]);\n\nexport const interactionInfoSchema: z.ZodObject<{\n id: z.ZodString;\n label: z.ZodString;\n description: z.ZodOptional<z.ZodString>;\n href: z.ZodString;\n kind: typeof interactionKindSchema;\n pluginId: z.ZodString;\n priority: z.ZodDefault<z.ZodNumber>;\n visibility: z.ZodDefault<typeof userPermissionLevelSchema>;\n status: z.ZodDefault<typeof interactionStatusSchema>;\n}> = z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n href: z.string(),\n kind: interactionKindSchema,\n pluginId: z.string(),\n priority: z.number().default(100),\n visibility: userPermissionLevelSchema.default(\"public\"),\n status: interactionStatusSchema.default(\"available\"),\n});\n\nexport type InteractionInfo = z.output<typeof interactionInfoSchema>;\nexport type InteractionInfoInput = z.input<typeof interactionInfoSchema>;\n\nexport const entityCountSchema: z.ZodObject<{\n entityType: z.ZodString;\n count: z.ZodNumber;\n}> = z.object({\n entityType: z.string(),\n count: z.number(),\n});\n\nexport type EntityCount = z.output<typeof entityCountSchema>;\n\n/**\n * App info schema for validation\n */\nexport const appInfoSchema: z.ZodObject<{\n model: z.ZodString;\n version: z.ZodString;\n uptime: z.ZodNumber;\n entities: z.ZodNumber;\n entityCounts: z.ZodArray<typeof entityCountSchema>;\n embeddings: z.ZodNumber;\n ai: z.ZodObject<{\n model: z.ZodString;\n embeddingModel: z.ZodString;\n }>;\n daemons: z.ZodArray<typeof DaemonStatusInfoSchema>;\n endpoints: z.ZodArray<typeof endpointInfoSchema>;\n interactions: z.ZodArray<typeof interactionInfoSchema>;\n}> = z.object({\n model: z.string(),\n version: z.string(),\n uptime: z.number(),\n entities: z.number(),\n entityCounts: z.array(entityCountSchema),\n embeddings: z.number(),\n ai: z.object({\n model: z.string(),\n embeddingModel: z.string(),\n }),\n daemons: z.array(DaemonStatusInfoSchema),\n endpoints: z.array(endpointInfoSchema),\n interactions: z.array(interactionInfoSchema),\n});\n\nexport type RuntimeAppInfo = z.output<typeof appInfoSchema>;\n\n/**\n * Query context for shell queries\n */\nexport interface QueryContext {\n userId?: string;\n conversationHistory?: string;\n messageId?: string;\n threadId?: string;\n timestamp?: string;\n [key: string]: unknown; // Allow additional properties\n}\n\n/**\n * Bounded model-as-judge request exposed to plugins.\n * Kept structural here so public plugin declarations do not import ai-service internals.\n */\nexport interface JudgeInput<T> {\n instruction: string;\n material: string;\n schema: AIGenerationSchema<T>;\n}\n\n/**\n * Shell interface that plugins use to access core services\n * This avoids circular dependencies between core and plugin-context\n */\n/**\n * Handler for a registered insight type.\n * Receives the entity service for data queries plus the caller's visibility\n * scope so aggregate insights can be filtered to what the caller is allowed\n * to see. Returns structured data.\n */\nexport type InsightHandler = (\n entityService: ICoreEntityService,\n visibilityScope: ContentVisibility,\n) => Promise<Record<string, unknown>>;\n\n/**\n * Registry for insight types.\n * Core registers generic insights; plugins register domain-specific ones.\n */\nexport interface IInsightsRegistry {\n register(type: string, handler: InsightHandler): void;\n unregister(type: string): void;\n getTypes(): string[];\n get(\n type: string,\n entityService: ICoreEntityService,\n visibilityScope: ContentVisibility,\n ): Promise<Record<string, unknown>>;\n}\n\nexport interface PluginRegistrationContext {\n /** Site/entity display metadata derived from the active site package. */\n entityDisplay?: Record<string, EntityDisplayEntry>;\n}\n\nexport interface IShell {\n // Core service accessors\n getMessageBus(): IMessageBus;\n getContentService(): IContentService;\n getLogger(): Logger;\n getEntityService(): IEntityService;\n getEntityRegistry(): IEntityRegistry;\n getJobQueueService(): IJobQueueService;\n getRenderService(): RenderService;\n getConversationService(): IConversationService;\n getMCPService(): IMCPTransport;\n listToolsForPermissionLevel(level: UserPermissionLevel): ToolInfo[];\n getPermissionService(): PermissionService;\n getDataSourceRegistry(): DataSourceRegistry;\n getAgentService(): IAgentService;\n getAttachmentRegistry(): IAttachmentsNamespace;\n getRuntimeUploadRegistry(): IRuntimeUploadsNamespace;\n getRuntimeState(): IRuntimeStateNamespace;\n getRecurringChecks(pluginId: string): IRecurringChecksNamespace;\n\n // Identity and Profile\n getIdentity(): BrainCharacter;\n getProfile(): AnchorProfile;\n\n // Domain — bare domain string (e.g. \"yeehaa.io\"), undefined for local dev\n getDomain(): string | undefined;\n getLocalSiteUrl(): string | undefined;\n shouldPreferLocalUrls(): boolean;\n getThemeCSS(): string;\n\n // Shared conversation spaces for this brain/team\n getSpaces(): string[];\n\n // Data directory - where plugins should store entity files\n // Default: ./brain-data, can be overridden for evals or custom deployments\n getDataDir(): string;\n\n // App metadata\n getAppInfo(): Promise<RuntimeAppInfo>;\n\n // High-level operations\n generateContent<T = unknown>(config: ContentGenerationConfig): Promise<T>;\n generateObject<T>(\n prompt: string,\n schema: AIGenerationSchema<T>,\n signal?: AbortSignal,\n ): Promise<{ object: T }>;\n judge<T>(input: JudgeInput<T>): Promise<{\n verdict: T;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n }>;\n query(prompt: string, context?: QueryContext): Promise<DefaultQueryResponse>;\n\n // Image generation (requires AI_API_KEY)\n generateImage(\n prompt: string,\n options?: ImageGenerationOptions,\n ): Promise<ImageGenerationResult>;\n canGenerateImages(): boolean;\n\n registerTemplates(\n templates: Record<string, Template>,\n pluginId?: string,\n ): void;\n getTemplate(name: string): Template | undefined;\n\n // Plugin capability registration\n registerTools(pluginId: string, tools: Tool[]): void;\n registerResources(pluginId: string, resources: Resource[]): void;\n registerResourceTemplate<K extends string = string>(\n pluginId: string,\n template: ResourceTemplate<K>,\n ): void;\n registerPrompt(pluginId: string, prompt: Prompt): void;\n registerInstructions(pluginId: string, instructions: string): void;\n /** @internal Release capabilities owned by a terminally stopped plugin. */\n unregisterPluginCapabilities?(pluginId: string): void | Promise<void>;\n\n // Plugin information\n getPluginPackageName(pluginId: string): string | undefined;\n hasPlugin(id: string): boolean;\n\n // Job operations namespace\n readonly jobs: IJobsNamespace;\n\n // Daemon registration\n registerDaemon(name: string, daemon: Daemon, pluginId: string): void;\n\n // Endpoint advertisement — plugins advertise user-facing URLs\n registerEndpoint(endpoint: EndpointInfoInput): void;\n listEndpoints(): EndpointInfo[];\n\n // Interaction advertisement — plugins advertise user/agent entry points\n registerInteraction(interaction: InteractionInfoInput): void;\n listInteractions(): InteractionInfo[];\n\n // Eval handler registration for plugin testing\n registerEvalHandler(\n pluginId: string,\n handlerId: string,\n handler: EvalHandler,\n ): void;\n\n // Insights registry for plugin-contributed insights\n getInsightsRegistry(): IInsightsRegistry;\n\n // API routes from plugins\n getPluginApiRoutes(): RegisteredApiRoute[];\n\n // Web routes from plugins\n getPluginWebRoutes(): RegisteredWebRoute[];\n}\n\n// Re-export response schemas for backward compatibility\nexport {\n defaultQueryResponseSchema,\n simpleTextResponseSchema,\n createEntityResponseSchema,\n updateEntityResponseSchema,\n type DefaultQueryResponse,\n type SimpleTextResponse,\n type CreateEntityResponse,\n type UpdateEntityResponse,\n};\n\n// Re-export MCP transport interface\nexport type { IMCPTransport } from \"@brains/mcp-service\";\n\n/**\n * Plugin type enumeration\n */\nexport type PluginType = \"core\" | \"entity\" | \"service\" | \"interface\";\n\n/**\n * Base tracking info that all interface plugins must have\n * Contains the essential rootJobId for job inheritance tracking\n */\nexport interface BaseJobTrackingInfo {\n rootJobId: string; // For inheritance tracking (required)\n}\n\n/**\n * Plugin metadata schema - validates the data portion of a plugin\n */\nexport const pluginMetadataSchema: z.ZodObject<{\n id: z.ZodString;\n version: z.ZodString;\n type: z.ZodEnum<{\n core: \"core\";\n entity: \"entity\";\n service: \"service\";\n interface: \"interface\";\n }>;\n description: z.ZodOptional<z.ZodString>;\n dependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;\n packageName: z.ZodString;\n}> = z.object({\n id: z.string(),\n version: z.string(),\n type: z.enum([\"core\", \"entity\", \"service\", \"interface\"] as const), // Required field for plugin type\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n packageName: z.string(), // Package name for import resolution (e.g., \"@brains/site-builder-plugin\")\n});\n\n/**\n * Plugin capabilities that can be exposed\n */\nexport interface PluginCapabilities {\n tools: Tool[];\n resources: Resource[];\n instructions?: string;\n}\n\n/**\n * Plugin interface - combines validated metadata with the register function\n */\nexport type Plugin = z.output<typeof pluginMetadataSchema> & {\n entityActionPolicy?: EntityActionPolicyConfig;\n register(\n shell: IShell,\n context?: PluginRegistrationContext,\n ): Promise<PluginCapabilities>;\n ready?(): Promise<void>;\n shutdown?(): Promise<void>;\n requiresDaemonStartup?(): boolean;\n};\n\n/**\n * Content generation configuration - unified config object\n */\nexport interface ContentGenerationConfig {\n prompt: string;\n templateName: string;\n conversationHistory?: string;\n data?: Record<string, unknown>;\n interfacePermissionGrant?: UserPermissionLevel;\n}\n\n/**\n * Content generation function signature - used by both PluginContext and Shell\n */\nexport type GenerateContentFunction = <T = unknown>(\n config: ContentGenerationConfig,\n) => Promise<T>;\n",
|
|
18
|
+
"import { z } from \"@brains/utils/zod\";\nimport type {\n EntityActionPolicyConfig,\n UserPermissionLevel,\n} from \"@brains/templates\";\nimport {\n defaultQueryResponseSchema,\n simpleTextResponseSchema,\n createEntityResponseSchema,\n updateEntityResponseSchema,\n type DefaultQueryResponse,\n type SimpleTextResponse,\n type CreateEntityResponse,\n type UpdateEntityResponse,\n} from \"@brains/contracts\";\nimport type { IMessageBus } from \"@brains/messaging-service\";\nimport { DaemonStatusInfoSchema, type Daemon } from \"./manager/daemon-types\";\nimport type { IContentService } from \"@brains/content-service\";\nimport type { Template } from \"@brains/templates\";\nimport type { Logger } from \"@brains/utils/logger\";\nimport type {\n ContentVisibility,\n IEntityService,\n IEntityRegistry,\n ICoreEntityService,\n} from \"@brains/entity-service\";\nimport type {\n Tool,\n Resource,\n ResourceTemplate,\n Prompt,\n ToolInfo,\n} from \"@brains/mcp-service\";\nexport type {\n ToolVisibility,\n ToolContext,\n ToolResponse,\n ToolConfirmation,\n Tool,\n Resource,\n ResourceTemplate,\n Prompt,\n ToolInfo,\n} from \"@brains/mcp-service\";\nexport {\n toolResponseSchema,\n ToolContextRoutingSchema,\n} from \"@brains/mcp-service\";\nimport type { IJobQueueService, IJobsNamespace } from \"@brains/job-queue\";\nimport type { RenderService } from \"@brains/templates\";\nimport type { IConversationService } from \"@brains/conversation-service\";\nimport type { IMCPTransport } from \"@brains/mcp-service\";\nimport type { PermissionService } from \"@brains/templates\";\nimport type { DataSourceRegistry } from \"@brains/entity-service\";\nimport type {\n AnchorProfile,\n BrainCharacter,\n IProfileKindRegistry,\n} from \"@brains/identity-service\";\nimport type { IAgentService } from \"@brains/ai-service\";\nimport type { IAttachmentsNamespace } from \"./service/attachment-registry\";\nimport type { IRecurringChecksNamespace } from \"@brains/recurring-checks\";\nimport type { IRuntimeStateNamespace } from \"@brains/runtime-state\";\nimport type { IRuntimeUploadsNamespace } from \"./service/upload-registry\";\nimport type {\n AIGenerationSchema,\n ImageGenerationOptions,\n ImageGenerationResult,\n} from \"@brains/ai-service\";\nimport type { RegisteredApiRoute } from \"./types/api-routes\";\nimport type { RegisteredWebRoute } from \"./types/web-routes\";\nimport type { EntityDisplayEntry } from \"@brains/site-composition\";\n\n/**\n * Handler function for plugin evaluations\n * Plugins register these to enable direct (non-chat) testing\n */\nexport type EvalHandler<TInput = unknown, TOutput = unknown> = (\n input: TInput,\n) => Promise<TOutput>;\n\n/**\n * Registry interface for plugin eval handlers\n * Abstraction that allows dependency inversion - implementation lives in ai-evaluation\n */\nexport interface IEvalHandlerRegistry {\n register(pluginId: string, handlerId: string, handler: EvalHandler): void;\n get(pluginId: string, handlerId: string): EvalHandler | undefined;\n has(pluginId: string, handlerId: string): boolean;\n list(): Array<{ pluginId: string; handlerId: string }>;\n unregister(pluginId: string, handlerId: string): boolean;\n}\n\n/**\n * Plugin info for status display\n */\nexport const pluginInfoSchema: z.ZodObject<{\n id: z.ZodString;\n type: z.ZodString;\n version: z.ZodString;\n status: z.ZodString;\n}> = z.object({\n id: z.string(),\n type: z.string(),\n version: z.string(),\n status: z.string(),\n});\n\n/**\n * Tool info for status display\n */\nexport const toolInfoSchema: z.ZodObject<{\n name: z.ZodString;\n description: z.ZodString;\n}> = z.object({\n name: z.string(),\n description: z.string(),\n});\n\n/**\n * Endpoint info — plugins advertise their user-facing URLs via\n * `context.endpoints.register({...})`. Shell collects and exposes\n * through `appInfo.endpoints` so the dashboard (and anything else)\n * can render them without knowing about individual plugins.\n */\nconst userPermissionLevelSchema: z.ZodEnum<{\n anchor: \"anchor\";\n trusted: \"trusted\";\n public: \"public\";\n}> = z.enum([\"anchor\", \"trusted\", \"public\"]);\n\nexport const endpointInfoSchema: z.ZodObject<{\n label: z.ZodString;\n url: z.ZodString;\n pluginId: z.ZodString;\n priority: z.ZodDefault<z.ZodNumber>;\n visibility: z.ZodDefault<typeof userPermissionLevelSchema>;\n}> = z.object({\n label: z.string(),\n url: z.string(),\n pluginId: z.string(),\n priority: z.number().default(100),\n visibility: userPermissionLevelSchema.default(\"public\"),\n});\n\nexport type EndpointInfo = z.output<typeof endpointInfoSchema>;\nexport type EndpointInfoInput = z.input<typeof endpointInfoSchema>;\n\nexport const interactionKindSchema: z.ZodEnum<{\n human: \"human\";\n agent: \"agent\";\n admin: \"admin\";\n protocol: \"protocol\";\n}> = z.enum([\"human\", \"agent\", \"admin\", \"protocol\"]);\n\nexport const interactionStatusSchema: z.ZodEnum<{\n available: \"available\";\n \"coming-soon\": \"coming-soon\";\n disabled: \"disabled\";\n}> = z.enum([\"available\", \"coming-soon\", \"disabled\"]);\n\nexport const interactionInfoSchema: z.ZodObject<{\n id: z.ZodString;\n label: z.ZodString;\n description: z.ZodOptional<z.ZodString>;\n href: z.ZodString;\n kind: typeof interactionKindSchema;\n pluginId: z.ZodString;\n priority: z.ZodDefault<z.ZodNumber>;\n visibility: z.ZodDefault<typeof userPermissionLevelSchema>;\n status: z.ZodDefault<typeof interactionStatusSchema>;\n}> = z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n href: z.string(),\n kind: interactionKindSchema,\n pluginId: z.string(),\n priority: z.number().default(100),\n visibility: userPermissionLevelSchema.default(\"public\"),\n status: interactionStatusSchema.default(\"available\"),\n});\n\nexport type InteractionInfo = z.output<typeof interactionInfoSchema>;\nexport type InteractionInfoInput = z.input<typeof interactionInfoSchema>;\n\nexport const entityCountSchema: z.ZodObject<{\n entityType: z.ZodString;\n count: z.ZodNumber;\n}> = z.object({\n entityType: z.string(),\n count: z.number(),\n});\n\nexport type EntityCount = z.output<typeof entityCountSchema>;\n\n/**\n * App info schema for validation\n */\nexport const appInfoSchema: z.ZodObject<{\n model: z.ZodString;\n version: z.ZodString;\n uptime: z.ZodNumber;\n entities: z.ZodNumber;\n entityCounts: z.ZodArray<typeof entityCountSchema>;\n embeddings: z.ZodNumber;\n ai: z.ZodObject<{\n model: z.ZodString;\n embeddingModel: z.ZodString;\n }>;\n daemons: z.ZodArray<typeof DaemonStatusInfoSchema>;\n endpoints: z.ZodArray<typeof endpointInfoSchema>;\n interactions: z.ZodArray<typeof interactionInfoSchema>;\n}> = z.object({\n model: z.string(),\n version: z.string(),\n uptime: z.number(),\n entities: z.number(),\n entityCounts: z.array(entityCountSchema),\n embeddings: z.number(),\n ai: z.object({\n model: z.string(),\n embeddingModel: z.string(),\n }),\n daemons: z.array(DaemonStatusInfoSchema),\n endpoints: z.array(endpointInfoSchema),\n interactions: z.array(interactionInfoSchema),\n});\n\nexport type RuntimeAppInfo = z.output<typeof appInfoSchema>;\n\n/**\n * Query context for shell queries\n */\nexport interface QueryContext {\n userId?: string;\n conversationHistory?: string;\n messageId?: string;\n threadId?: string;\n timestamp?: string;\n [key: string]: unknown; // Allow additional properties\n}\n\n/**\n * Bounded model-as-judge request exposed to plugins.\n * Kept structural here so public plugin declarations do not import ai-service internals.\n */\nexport interface JudgeInput<T> {\n instruction: string;\n material: string;\n schema: AIGenerationSchema<T>;\n}\n\n/**\n * Shell interface that plugins use to access core services\n * This avoids circular dependencies between core and plugin-context\n */\n/**\n * Handler for a registered insight type.\n * Receives the entity service for data queries plus the caller's visibility\n * scope so aggregate insights can be filtered to what the caller is allowed\n * to see. Returns structured data.\n */\nexport type InsightHandler = (\n entityService: ICoreEntityService,\n visibilityScope: ContentVisibility,\n) => Promise<Record<string, unknown>>;\n\n/**\n * Registry for insight types.\n * Core registers generic insights; plugins register domain-specific ones.\n */\nexport interface IInsightsRegistry {\n register(type: string, handler: InsightHandler): void;\n unregister(type: string): void;\n getTypes(): string[];\n get(\n type: string,\n entityService: ICoreEntityService,\n visibilityScope: ContentVisibility,\n ): Promise<Record<string, unknown>>;\n}\n\nexport interface PluginRegistrationContext {\n /** Site/entity display metadata derived from the active site package. */\n entityDisplay?: Record<string, EntityDisplayEntry>;\n}\n\nexport interface IShell {\n // Core service accessors\n getMessageBus(): IMessageBus;\n getContentService(): IContentService;\n getLogger(): Logger;\n getEntityService(): IEntityService;\n getEntityRegistry(): IEntityRegistry;\n getJobQueueService(): IJobQueueService;\n getRenderService(): RenderService;\n getConversationService(): IConversationService;\n getMCPService(): IMCPTransport;\n listToolsForPermissionLevel(level: UserPermissionLevel): ToolInfo[];\n getPermissionService(): PermissionService;\n getDataSourceRegistry(): DataSourceRegistry;\n getAgentService(): IAgentService;\n getAttachmentRegistry(): IAttachmentsNamespace;\n getRuntimeUploadRegistry(): IRuntimeUploadsNamespace;\n getRuntimeState(): IRuntimeStateNamespace;\n getRecurringChecks(pluginId: string): IRecurringChecksNamespace;\n\n // Identity and Profile\n getIdentity(): BrainCharacter;\n getProfile(): AnchorProfile;\n getProfileKindRegistry(): IProfileKindRegistry;\n\n // Domain — bare domain string (e.g. \"yeehaa.io\"), undefined for local dev\n getDomain(): string | undefined;\n getLocalSiteUrl(): string | undefined;\n shouldPreferLocalUrls(): boolean;\n getThemeCSS(): string;\n\n // Shared conversation spaces for this brain/team\n getSpaces(): string[];\n\n // Data directory - where plugins should store entity files\n // Default: ./brain-data, can be overridden for evals or custom deployments\n getDataDir(): string;\n\n // App metadata\n getAppInfo(): Promise<RuntimeAppInfo>;\n\n // High-level operations\n generateContent<T = unknown>(config: ContentGenerationConfig): Promise<T>;\n generateObject<T>(\n prompt: string,\n schema: AIGenerationSchema<T>,\n signal?: AbortSignal,\n ): Promise<{ object: T }>;\n judge<T>(input: JudgeInput<T>): Promise<{\n verdict: T;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n }>;\n query(prompt: string, context?: QueryContext): Promise<DefaultQueryResponse>;\n\n // Image generation (requires AI_API_KEY)\n generateImage(\n prompt: string,\n options?: ImageGenerationOptions,\n ): Promise<ImageGenerationResult>;\n canGenerateImages(): boolean;\n\n registerTemplates(\n templates: Record<string, Template>,\n pluginId?: string,\n ): void;\n getTemplate(name: string): Template | undefined;\n\n // Plugin capability registration\n registerTools(pluginId: string, tools: Tool[]): void;\n registerResources(pluginId: string, resources: Resource[]): void;\n registerResourceTemplate<K extends string = string>(\n pluginId: string,\n template: ResourceTemplate<K>,\n ): void;\n registerPrompt(pluginId: string, prompt: Prompt): void;\n registerInstructions(pluginId: string, instructions: string): void;\n /** @internal Release capabilities owned by a terminally stopped plugin. */\n unregisterPluginCapabilities?(pluginId: string): void | Promise<void>;\n\n // Plugin information\n getPluginPackageName(pluginId: string): string | undefined;\n hasPlugin(id: string): boolean;\n\n // Job operations namespace\n readonly jobs: IJobsNamespace;\n\n // Daemon registration\n registerDaemon(name: string, daemon: Daemon, pluginId: string): void;\n\n // Endpoint advertisement — plugins advertise user-facing URLs\n registerEndpoint(endpoint: EndpointInfoInput): void;\n listEndpoints(): EndpointInfo[];\n\n // Interaction advertisement — plugins advertise user/agent entry points\n registerInteraction(interaction: InteractionInfoInput): void;\n listInteractions(): InteractionInfo[];\n\n // Eval handler registration for plugin testing\n registerEvalHandler(\n pluginId: string,\n handlerId: string,\n handler: EvalHandler,\n ): void;\n\n // Insights registry for plugin-contributed insights\n getInsightsRegistry(): IInsightsRegistry;\n\n // API routes from plugins\n getPluginApiRoutes(): RegisteredApiRoute[];\n\n // Web routes from plugins\n getPluginWebRoutes(): RegisteredWebRoute[];\n}\n\n// Re-export response schemas for backward compatibility\nexport {\n defaultQueryResponseSchema,\n simpleTextResponseSchema,\n createEntityResponseSchema,\n updateEntityResponseSchema,\n type DefaultQueryResponse,\n type SimpleTextResponse,\n type CreateEntityResponse,\n type UpdateEntityResponse,\n};\n\n// Re-export MCP transport interface\nexport type { IMCPTransport } from \"@brains/mcp-service\";\n\n/**\n * Plugin type enumeration\n */\nexport type PluginType = \"core\" | \"entity\" | \"service\" | \"interface\";\n\n/**\n * Base tracking info that all interface plugins must have\n * Contains the essential rootJobId for job inheritance tracking\n */\nexport interface BaseJobTrackingInfo {\n rootJobId: string; // For inheritance tracking (required)\n}\n\n/**\n * Plugin metadata schema - validates the data portion of a plugin\n */\nexport const pluginMetadataSchema: z.ZodObject<{\n id: z.ZodString;\n version: z.ZodString;\n type: z.ZodEnum<{\n core: \"core\";\n entity: \"entity\";\n service: \"service\";\n interface: \"interface\";\n }>;\n description: z.ZodOptional<z.ZodString>;\n dependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;\n packageName: z.ZodString;\n}> = z.object({\n id: z.string(),\n version: z.string(),\n type: z.enum([\"core\", \"entity\", \"service\", \"interface\"] as const), // Required field for plugin type\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n packageName: z.string(), // Package name for import resolution (e.g., \"@brains/site-builder-plugin\")\n});\n\n/**\n * Plugin capabilities that can be exposed\n */\nexport interface PluginCapabilities {\n tools: Tool[];\n resources: Resource[];\n instructions?: string;\n}\n\n/**\n * Plugin interface - combines validated metadata with the register function\n */\nexport type Plugin = z.output<typeof pluginMetadataSchema> & {\n entityActionPolicy?: EntityActionPolicyConfig;\n register(\n shell: IShell,\n context?: PluginRegistrationContext,\n ): Promise<PluginCapabilities>;\n finalizeRegistration?(): Promise<void>;\n ready?(): Promise<void>;\n shutdown?(): Promise<void>;\n requiresDaemonStartup?(): boolean;\n};\n\n/**\n * Content generation configuration - unified config object\n */\nexport interface GenerationStyleGuide {\n voice?: string;\n visual?: string;\n}\n\nexport interface ContentGenerationConfig {\n prompt: string;\n templateName: string;\n conversationHistory?: string;\n data?: Record<string, unknown>;\n representedIdentity?: \"brain\" | \"anchor\" | \"none\";\n styleGuide?: GenerationStyleGuide;\n interfacePermissionGrant?: UserPermissionLevel;\n}\n\n/**\n * Content generation function signature - used by both PluginContext and Shell\n */\nexport type GenerateContentFunction = <T = unknown>(\n config: ContentGenerationConfig,\n) => Promise<T>;\n",
|
|
19
19
|
"import { z } from \"@brains/utils/zod\";\nimport {\n endpointInfoSchema,\n entityCountSchema,\n interactionInfoSchema,\n} from \"../interfaces\";\n\n// Public daemon health uses a stringified lastCheck (Date → ISO string);\n// the runtime variant in manager/daemon-types.ts uses z.date().\nconst DaemonHealthSchema: z.ZodObject<{\n status: z.ZodEnum<{\n healthy: \"healthy\";\n warning: \"warning\";\n error: \"error\";\n unknown: \"unknown\";\n }>;\n message: z.ZodOptional<z.ZodString>;\n lastCheck: z.ZodOptional<z.ZodString>;\n details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\n}> = z.object({\n status: z.enum([\"healthy\", \"warning\", \"error\", \"unknown\"]),\n message: z.string().optional(),\n lastCheck: z.string().optional(),\n details: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst DaemonStatusSchema: z.ZodObject<{\n name: z.ZodString;\n pluginId: z.ZodString;\n status: z.ZodString;\n health: z.ZodOptional<typeof DaemonHealthSchema>;\n}> = z.object({\n name: z.string(),\n pluginId: z.string(),\n status: z.string(),\n health: DaemonHealthSchema.optional(),\n});\n\nexport const AppInfoSchema: z.ZodObject<{\n model: z.ZodString;\n version: z.ZodString;\n uptime: z.ZodNumber;\n entities: z.ZodNumber;\n entityCounts: z.ZodArray<typeof entityCountSchema>;\n embeddings: z.ZodNumber;\n ai: z.ZodObject<{\n model: z.ZodString;\n embeddingModel: z.ZodString;\n }>;\n daemons: z.ZodArray<typeof DaemonStatusSchema>;\n endpoints: z.ZodArray<typeof endpointInfoSchema>;\n interactions: z.ZodArray<typeof interactionInfoSchema>;\n}> = z.object({\n model: z.string(),\n version: z.string(),\n uptime: z.number(),\n entities: z.number(),\n entityCounts: z.array(entityCountSchema),\n embeddings: z.number(),\n ai: z.object({\n model: z.string(),\n embeddingModel: z.string(),\n }),\n daemons: z.array(DaemonStatusSchema),\n endpoints: z.array(endpointInfoSchema),\n interactions: z.array(interactionInfoSchema),\n});\n\nexport type AppInfo = z.output<typeof AppInfoSchema>;\n",
|
|
20
20
|
"import { z, type ZodType } from \"@brains/utils/zod\";\n\n/**\n * Base configuration schema that all plugins should extend\n * Provides common fields like enabled, debug, etc.\n */\nexport const basePluginConfigSchema: z.ZodObject<{\n enabled: z.ZodBoolean;\n debug: z.ZodBoolean;\n}> = z.object({\n enabled: z.boolean().describe(\"Whether the plugin is enabled\"),\n debug: z.boolean().describe(\"Enable debug logging for this plugin\"),\n});\n\n/**\n * Type helpers for plugin configuration\n */\nexport type PluginConfigSchema<TConfig> = ZodType<TConfig, unknown>;\nexport type PluginConfigInput<T extends ZodType> = z.input<T>;\nexport type PluginConfig<T extends ZodType> = z.output<T>;\n\nexport interface PluginConfigValidationIssue {\n path: string;\n code: string;\n message: string;\n}\n\nexport class PluginConfigValidationError extends Error {\n public readonly pluginId: string;\n public readonly issues: readonly PluginConfigValidationIssue[];\n\n constructor(\n pluginId: string,\n issues: readonly PluginConfigValidationIssue[],\n ) {\n super(`Invalid plugin config for ${pluginId}`);\n this.name = \"PluginConfigValidationError\";\n this.pluginId = pluginId;\n this.issues = issues;\n }\n}\n",
|
|
21
21
|
"import { z } from \"@brains/utils/zod\";\n\nexport type OperationType =\n | \"file_operations\"\n | \"content_operations\"\n | \"data_processing\"\n | \"batch_processing\";\n\nexport interface JobContextInput {\n [key: string]: unknown;\n pluginId?: string | undefined;\n progressToken?: string | number | undefined;\n operationType: OperationType;\n operationTarget?: string | undefined;\n interfaceType?: string | undefined;\n conversationId?: string | undefined;\n channelId?: string | undefined;\n silent?: boolean | undefined;\n}\n\nexport interface JobContext extends JobContextInput {\n rootJobId: string;\n}\n\n/**\n * Operation type enum for structured progress tracking and aggregation\n * Using generic categories to accommodate various plugin operations\n */\nexport const OperationTypeEnum: z.ZodEnum<{\n file_operations: \"file_operations\";\n content_operations: \"content_operations\";\n data_processing: \"data_processing\";\n batch_processing: \"batch_processing\";\n}> = z.enum([\n \"file_operations\", // directory sync, file processing, import/export\n \"content_operations\", // content generation, promotion, rollback, site building\n \"data_processing\", // entity processing, embedding generation, search indexing\n \"batch_processing\", // batch operations\n]);\n\n/**\n * Job context input schema - what callers provide when creating jobs\n * Note: rootJobId is not included here - it's managed internally by the job queue service\n * and defaults to the job's own ID for standalone jobs, or the batch ID for batch children.\n */\nexport const JobContextInputSchema: z.ZodType<JobContextInput, unknown> =\n z.object({\n pluginId: z.string().optional(),\n progressToken: z.union([z.string(), z.number()]).optional(),\n operationType: OperationTypeEnum,\n operationTarget: z.string().optional(),\n // Routing context for progress message delivery\n interfaceType: z.string().optional(), // Which interface triggered the job (e.g., \"matrix\", \"cli\")\n conversationId: z.string().optional(), // Durable conversation/session to route progress messages to\n channelId: z.string().optional(), // Transport channel/room to route progress messages to\n // Suppress all progress/completion events for this job (e.g. background\n // embedding jobs that would otherwise spam every subscriber)\n silent: z.boolean().optional(),\n });\n\n/**\n * Full job context schema - includes rootJobId for stored/transmitted metadata\n * This is what gets stored in the database and sent in progress events.\n */\nexport const JobContextSchema: z.ZodType<JobContext, unknown> = z.object({\n pluginId: z.string().optional(),\n progressToken: z.union([z.string(), z.number()]).optional(),\n operationType: OperationTypeEnum,\n operationTarget: z.string().optional(),\n interfaceType: z.string().optional(),\n conversationId: z.string().optional(),\n channelId: z.string().optional(),\n silent: z.boolean().optional(),\n rootJobId: z.string(), // Added by job queue service when job is created\n});\n\n/**\n * Deduplication strategy for job queue\n */\nexport const DeduplicationStrategyEnum: z.ZodEnum<{\n none: \"none\";\n skip: \"skip\";\n replace: \"replace\";\n coalesce: \"coalesce\";\n}> = z.enum([\n \"none\", // No deduplication (default behavior)\n \"skip\", // Skip if PENDING job exists (allows queueing if only PROCESSING)\n \"replace\", // Cancel pending job and create new one\n \"coalesce\", // Update existing job's timestamp\n]);\n\nexport type DeduplicationStrategy = z.output<typeof DeduplicationStrategyEnum>;\n\n/**\n * Job options for job creation\n */\nexport interface JobOptions {\n priority?: number; // Job priority (lower = higher priority, 0 = default)\n maxRetries?: number; // Override default retry count\n delayMs?: number; // Initial delay before processing\n source: string; // Source identifier for job progress events\n metadata: JobContextInput; // Caller-provided metadata (rootJobId is added by job queue service)\n deduplication?: DeduplicationStrategy; // Deduplication strategy (default: \"none\")\n deduplicationKey?: string; // Optional key for fine-grained deduplication\n /**\n * Override rootJobId for batch child jobs\n * External callers should not use this - it's set automatically by the job queue service\n * Batch jobs use this to link child jobs to the parent batch\n */\n rootJobId?: string;\n}\n\n/**\n * Job statistics\n */\nexport interface JobStats {\n pending: number;\n processing: number;\n failed: number;\n completed: number;\n total: number;\n}\n",
|
|
@@ -32,13 +32,13 @@
|
|
|
32
32
|
"import type { RuntimeAppInfo } from \"../interfaces\";\nimport type { DaemonHealth } from \"../manager/daemon-types\";\nimport type { AppInfo } from \"../contracts/app-info\";\n\nfunction toPublicDaemonHealth(\n health: DaemonHealth | undefined,\n): AppInfo[\"daemons\"][number][\"health\"] {\n if (!health) return undefined;\n\n return {\n status: health.status,\n message: health.message,\n lastCheck: health.lastCheck?.toISOString(),\n details: health.details,\n };\n}\n\nexport function toPublicAppInfo(appInfo: RuntimeAppInfo): AppInfo {\n return {\n model: appInfo.model,\n version: appInfo.version,\n uptime: appInfo.uptime,\n entities: appInfo.entities,\n entityCounts: appInfo.entityCounts,\n embeddings: appInfo.embeddings,\n ai: appInfo.ai,\n daemons: appInfo.daemons.map((daemon) => ({\n name: daemon.name,\n pluginId: daemon.pluginId,\n status: daemon.status,\n health: toPublicDaemonHealth(daemon.health),\n })),\n endpoints: appInfo.endpoints,\n interactions: appInfo.interactions,\n };\n}\n",
|
|
33
33
|
"import {\n coerceConversationMetadata,\n type Conversation as RuntimeConversation,\n type Message as RuntimeMessage,\n} from \"@brains/conversation-service\";\nimport {\n messageRoleSchema,\n type Conversation,\n type Message,\n type MessageRole,\n} from \"../contracts/conversations\";\n\nfunction toPublicRole(role: string): MessageRole {\n const result = messageRoleSchema.safeParse(role);\n return result.success ? result.data : \"user\";\n}\n\nexport function toPublicConversation(\n conversation: RuntimeConversation,\n): Conversation {\n const metadata = coerceConversationMetadata(conversation.metadata);\n const channelName =\n typeof metadata[\"channelName\"] === \"string\"\n ? metadata[\"channelName\"]\n : undefined;\n\n return {\n id: conversation.id,\n sessionId: conversation.sessionId,\n interfaceType: conversation.interfaceType,\n channelId: conversation.channelId,\n channelName,\n startedAt: conversation.started,\n lastActiveAt: conversation.lastActive,\n createdAt: conversation.created,\n updatedAt: conversation.updated,\n metadata,\n };\n}\n\nexport function toPublicMessage(message: RuntimeMessage): Message {\n return {\n id: message.id,\n conversationId: message.conversationId,\n role: toPublicRole(message.role),\n content: message.content,\n timestamp: message.timestamp,\n metadata: coerceConversationMetadata(message.metadata),\n };\n}\n",
|
|
34
34
|
"import type {\n AnchorProfile as RuntimeAnchorProfile,\n BrainCharacter as RuntimeBrainCharacter,\n} from \"@brains/identity-service\";\nimport {\n AnchorProfileSchema,\n BrainCharacterSchema,\n type AnchorProfile,\n type BrainCharacter,\n} from \"../contracts/identity\";\n\nexport function toPublicBrainCharacter(\n character: RuntimeBrainCharacter,\n): BrainCharacter {\n return BrainCharacterSchema.parse(character);\n}\n\nexport function toPublicAnchorProfile(\n profile: RuntimeAnchorProfile,\n): AnchorProfile {\n return AnchorProfileSchema.parse(profile);\n}\n",
|
|
35
|
-
"import type { GetMessagesOptions } from \"@brains/conversation-service\";\nimport type { JobsNamespace } from \"@brains/job-queue\";\nimport {\n createEnqueueBatchFn,\n createEnqueueJobFn,\n createRegisterHandlerFn,\n} from \"@brains/job-queue\";\nimport type { MessageHandler, MessageSender } from \"@brains/messaging-service\";\nimport type { Logger } from \"@brains/utils/logger\";\nimport type { AppInfo } from \"../contracts/app-info\";\nimport type { Conversation, Message } from \"../contracts/conversations\";\nimport type { EvalHandler, InsightHandler, IShell } from \"../interfaces\";\nimport type { Channel } from \"../utils/channels\";\nimport { isChannel } from \"../utils/channels\";\nimport { toPublicAppInfo } from \"./public-app-info\";\nimport { toPublicConversation, toPublicMessage } from \"./public-conversations\";\nimport {\n toPublicAnchorProfile,\n toPublicBrainCharacter,\n} from \"./public-identity\";\nimport type {\n IConversationsNamespace,\n IEndpointsNamespace,\n IEvalNamespace,\n IIdentityNamespace,\n IInsightsNamespace,\n IInteractionsNamespace,\n IMessagingNamespace,\n IPermissionsNamespace,\n TypedMessageHandler,\n} from \"./context-types\";\n\nexport function createAppInfoGetter(shell: IShell): () => Promise<AppInfo> {\n return async (): Promise<AppInfo> => {\n return toPublicAppInfo(await shell.getAppInfo());\n };\n}\n\nexport function createIdentityNamespace(\n shell: IShell,\n getAppInfo: () => Promise<AppInfo>,\n): IIdentityNamespace {\n return {\n get: () => toPublicBrainCharacter(shell.getIdentity()),\n getProfile: () => toPublicAnchorProfile(shell.getProfile()),\n getAppInfo,\n };\n}\n\nexport function createMessagingNamespace(\n shell: IShell,\n pluginId: string,\n logger: Logger,\n): IMessagingNamespace {\n const messageBus = shell.getMessageBus();\n const sendMessage: MessageSender = async (request) => {\n return messageBus.send({\n ...request,\n sender: pluginId,\n });\n };\n\n return {\n send: sendMessage,\n subscribe: <T = unknown, R = unknown>(\n channelOrName: string | Channel<T, R>,\n handler: MessageHandler<T, R> | TypedMessageHandler<T, R>,\n ): (() => void) => {\n if (isChannel(channelOrName)) {\n const channel = channelOrName;\n const typedHandler = handler as TypedMessageHandler<T, R>;\n\n const wrappedHandler: MessageHandler<unknown, R> = async (message) => {\n const parseResult = channel.schema.safeParse(message.payload);\n if (!parseResult.success) {\n logger.warn(`Invalid payload for channel ${channel.name}`, {\n error: parseResult.error.message,\n });\n return { noop: true };\n }\n\n const { payload: _payload, ...baseMessage } = message;\n return typedHandler(parseResult.data as T, baseMessage);\n };\n\n return messageBus.subscribe(channel.name, wrappedHandler);\n }\n\n return messageBus.subscribe(\n channelOrName,\n handler as MessageHandler<T, R>,\n );\n },\n };\n}\n\nexport function createJobsNamespace(\n shell: IShell,\n pluginId: string,\n): JobsNamespace {\n const jobQueueService = shell.getJobQueueService();\n return {\n ...shell.jobs,\n enqueue: createEnqueueJobFn(jobQueueService, pluginId, true),\n enqueueBatch: createEnqueueBatchFn(shell.jobs, pluginId),\n registerHandler: createRegisterHandlerFn(jobQueueService, pluginId),\n };\n}\n\nexport function createPermissionsNamespace(\n shell: IShell,\n): IPermissionsNamespace {\n const permissionService = shell.getPermissionService();\n return {\n assertEntityActionAllowed: (entityType, action, context): void => {\n permissionService.assertEntityActionAllowed(\n entityType,\n action,\n context.userPermissionLevel,\n );\n },\n };\n}\n\nexport function createConversationsNamespace(\n shell: IShell,\n): IConversationsNamespace {\n return {\n get: async (conversationId: string): Promise<Conversation | null> => {\n const conversationService = shell.getConversationService();\n const conversation =\n await conversationService.getConversation(conversationId);\n return conversation ? toPublicConversation(conversation) : null;\n },\n search: async (query: string): Promise<Conversation[]> => {\n const conversationService = shell.getConversationService();\n const conversations =\n await conversationService.searchConversations(query);\n return conversations.map(toPublicConversation);\n },\n list: async (options): Promise<Conversation[]> => {\n const conversationService = shell.getConversationService();\n const conversations =\n await conversationService.listConversations(options);\n return conversations.map(toPublicConversation);\n },\n getMessages: async (\n conversationId: string,\n options?: GetMessagesOptions,\n ): Promise<Message[]> => {\n const conversationService = shell.getConversationService();\n const messages = await conversationService.getMessages(\n conversationId,\n options,\n );\n return messages.map(toPublicMessage);\n },\n countMessages: async (conversationId: string): Promise<number> => {\n return shell.getConversationService().countMessages(conversationId);\n },\n };\n}\n\nexport function createEvalNamespace(\n shell: IShell,\n pluginId: string,\n): IEvalNamespace {\n return {\n registerHandler: (handlerId: string, handler: EvalHandler): void => {\n shell.registerEvalHandler(pluginId, handlerId, handler);\n },\n };\n}\n\nexport function createInsightsNamespace(shell: IShell): IInsightsNamespace {\n return {\n register: (type: string, handler: InsightHandler): void => {\n shell.getInsightsRegistry().register(type, handler);\n },\n };\n}\n\nexport function createEndpointsNamespace(\n shell: IShell,\n pluginId: string,\n): IEndpointsNamespace {\n return {\n register: (endpoint): void => {\n shell.registerEndpoint({ ...endpoint, pluginId });\n },\n };\n}\n\nexport function createInteractionsNamespace(\n shell: IShell,\n pluginId: string,\n): IInteractionsNamespace {\n return {\n register: (interaction): void => {\n shell.registerInteraction({ ...interaction, pluginId });\n },\n };\n}\n",
|
|
36
|
-
"import type { IShell } from \"../interfaces\";\nimport { type Logger } from \"@brains/utils/logger\";\nimport { derivePreviewDomain } from \"@brains/site-composition\";\nimport type {\n ICoreEntityService,\n ProjectSemanticSpaceRequest,\n SemanticSpaceProjection,\n} from \"@brains/entity-service\";\nimport type { JudgeInput, PluginRegistrationContext } from \"../interfaces\";\nimport type { AppInfo } from \"../contracts/app-info\";\nimport type { EntityDisplayEntry } from \"@brains/site-composition\";\nimport type { JobsNamespace } from \"@brains/job-queue\";\nimport type { IRecurringChecksNamespace } from \"@brains/recurring-checks\";\nimport type { IRuntimeStateNamespace } from \"@brains/runtime-state\";\nimport type { IAttachmentsNamespace } from \"../service/attachment-registry\";\nimport type { IRuntimeUploadsNamespace } from \"../service/upload-registry\";\nimport {\n createAppInfoGetter,\n createConversationsNamespace,\n createEndpointsNamespace,\n createEvalNamespace,\n createIdentityNamespace,\n createInsightsNamespace,\n createInteractionsNamespace,\n createJobsNamespace,\n createMessagingNamespace,\n createPermissionsNamespace,\n} from \"./namespaces\";\nimport type {\n IConversationsNamespace,\n IEndpointsNamespace,\n IEvalNamespace,\n IIdentityNamespace,\n IInsightsNamespace,\n IInteractionsNamespace,\n IMessagingNamespace,\n IPermissionsNamespace,\n} from \"./context-types\";\n\nexport interface ISemanticNamespace {\n project(\n request: ProjectSemanticSpaceRequest,\n ): Promise<SemanticSpaceProjection>;\n}\n\nexport type {\n IConversationsNamespace,\n IEndpointsNamespace,\n IEvalNamespace,\n IIdentityNamespace,\n IInsightsNamespace,\n IInteractionsNamespace,\n IMessagingNamespace,\n IPermissionsNamespace,\n TypedMessageHandler,\n} from \"./context-types\";\n\n/**\n * Base plugin context — shared by all plugin types (Entity, Service, Interface).\n *\n * Contains only capabilities that every plugin needs.\n * AI, templates, views, and transport are on sibling contexts.\n */\nexport interface BasePluginContext {\n // ============================================================================\n // Plugin Identity\n // ============================================================================\n\n /** Unique plugin identifier */\n readonly pluginId: string;\n\n /** Logger instance for this plugin */\n readonly logger: Logger;\n\n /** Data directory for storing entity files */\n readonly dataDir: string;\n\n /** Bare domain string (e.g. \"yeehaa.io\"), undefined for local dev */\n readonly domain: string | undefined;\n\n /** Production site URL derived from domain (e.g. \"https://yeehaa.io\"), undefined if no domain */\n readonly siteUrl: string | undefined;\n\n /** Local runtime site URL (e.g. \"http://localhost:8080\"), undefined when unavailable */\n readonly localSiteUrl: string | undefined;\n\n /** Preview site URL derived from domain (e.g. \"https://preview.yeehaa.io\" or \"https://preview.recall.rizom.ai\"), undefined if no domain */\n readonly previewUrl: string | undefined;\n\n /** Prefer local runtime URLs over public domain URLs when both exist. */\n readonly preferLocalUrls: boolean;\n\n /** Active resolved theme CSS for site, dashboard, and media rendering. */\n readonly themeCSS: string;\n\n /** Entity display metadata from the active site package, if any */\n readonly entityDisplay: Record<string, EntityDisplayEntry> | undefined;\n\n /** Shared conversation spaces for this brain/team */\n readonly spaces: string[];\n\n /** Entity action policy assertions for plugin-owned tools and handlers. */\n readonly permissions: IPermissionsNamespace;\n\n /** App metadata (version, model, plugins) */\n readonly appInfo: () => Promise<AppInfo>;\n\n /** Bounded model-as-judge capability; schema-constrained verdicts only. */\n readonly judge: <T>(input: JudgeInput<T>) => Promise<{\n verdict: T;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n }>;\n\n // ============================================================================\n // Entity Service (Read-Only)\n // ============================================================================\n\n /** Core entity service with read-only operations */\n readonly entityService: ICoreEntityService;\n\n /** Provider-independent semantic indexing operations. */\n readonly semantic: ISemanticNamespace;\n\n // ============================================================================\n // Brain Identity & Profile\n // ============================================================================\n\n /**\n * Identity namespace\n * - `identity.get()` - Get the brain's identity configuration\n * - `identity.getProfile()` - Get the owner's profile\n * - `identity.getAppInfo()` - Get app metadata\n */\n readonly identity: IIdentityNamespace;\n\n // ============================================================================\n // Inter-Plugin Messaging\n // ============================================================================\n\n /**\n * Messaging namespace\n * - `messaging.send()` - Send a message to other plugins\n * - `messaging.subscribe()` - Subscribe to messages on a channel\n */\n readonly messaging: IMessagingNamespace;\n\n // ============================================================================\n // Job Queue (monitoring + scoped write)\n // ============================================================================\n\n /** Job operations — monitoring + plugin-scoped enqueue/registerHandler */\n readonly jobs: JobsNamespace;\n\n // ============================================================================\n // Source-derived Attachments\n // ============================================================================\n\n /** Source-derived publish attachment resolution namespace */\n readonly attachments: IAttachmentsNamespace;\n\n // ============================================================================\n // Runtime Uploads\n // ============================================================================\n\n /** Ephemeral runtime upload storage namespace. */\n readonly uploads: IRuntimeUploadsNamespace;\n\n // ============================================================================\n // Runtime State\n // ============================================================================\n\n /** Disposable, secret-free operational state namespace. */\n readonly runtimeState: IRuntimeStateNamespace;\n\n /** Shell-owned recurring checks registered by this plugin. */\n readonly recurringChecks: IRecurringChecksNamespace;\n\n // ============================================================================\n // Conversations (Read-Only)\n // ============================================================================\n\n /**\n * Conversations namespace\n * - `conversations.get()` - Get a conversation by ID\n * - `conversations.search()` - Search conversations by query\n * - `conversations.getMessages()` - Get messages from a conversation\n */\n readonly conversations: IConversationsNamespace;\n\n // ============================================================================\n // Evaluation\n // ============================================================================\n\n /**\n * Eval namespace for plugin testing\n * - `eval.registerHandler()` - Register an eval handler\n */\n readonly eval: IEvalNamespace;\n\n // ============================================================================\n // Insights\n // ============================================================================\n\n /**\n * Insights namespace\n * - `insights.register()` - Register a domain-specific insight handler\n */\n readonly insights: IInsightsNamespace;\n\n // ============================================================================\n // Endpoint Advertisement\n // ============================================================================\n\n /**\n * Endpoints namespace — advertise this plugin's user-facing URLs\n * so they surface in `appInfo.endpoints` for the dashboard and\n * other operator-facing consumers.\n */\n readonly endpoints: IEndpointsNamespace;\n\n /**\n * Interactions namespace — advertise user/agent entry points for this brain.\n */\n readonly interactions: IInteractionsNamespace;\n}\n\n/**\n * Create a BasePluginContext from the shell.\n *\n * Used by all three sibling context factories (entity, service, interface).\n */\nexport function createBasePluginContext(\n shell: IShell,\n pluginId: string,\n registrationContext?: PluginRegistrationContext,\n): BasePluginContext {\n const entityService = shell.getEntityService();\n const logger = shell.getLogger().child(pluginId);\n const domain = shell.getDomain();\n const localSiteUrl = shell.getLocalSiteUrl();\n const preferLocalUrls = shell.shouldPreferLocalUrls();\n const themeCSS = shell.getThemeCSS();\n const getAppInfo = createAppInfoGetter(shell);\n const attachments = shell.getAttachmentRegistry();\n const uploads = shell.getRuntimeUploadRegistry();\n const runtimeState = shell.getRuntimeState();\n\n return {\n pluginId,\n logger,\n entityService,\n\n semantic: {\n project: (request) => entityService.projectSemanticSpace(request),\n },\n\n identity: createIdentityNamespace(shell, getAppInfo),\n\n appInfo: getAppInfo,\n judge: (input) => shell.judge(input),\n\n domain,\n siteUrl: domain ? `https://${domain}` : undefined,\n localSiteUrl,\n previewUrl: domain ? `https://${derivePreviewDomain(domain)}` : undefined,\n preferLocalUrls,\n themeCSS,\n entityDisplay: registrationContext?.entityDisplay,\n spaces: shell.getSpaces(),\n\n permissions: createPermissionsNamespace(shell),\n\n messaging: createMessagingNamespace(shell, pluginId, logger),\n\n jobs: createJobsNamespace(shell, pluginId),\n\n attachments,\n\n uploads,\n\n runtimeState,\n recurringChecks: shell.getRecurringChecks(pluginId),\n\n conversations: createConversationsNamespace(shell),\n\n dataDir: shell.getDataDir(),\n\n eval: createEvalNamespace(shell, pluginId),\n\n insights: createInsightsNamespace(shell),\n\n endpoints: createEndpointsNamespace(shell, pluginId),\n interactions: createInteractionsNamespace(shell, pluginId),\n };\n}\n",
|
|
35
|
+
"import type { GetMessagesOptions } from \"@brains/conversation-service\";\nimport type { JobsNamespace } from \"@brains/job-queue\";\nimport {\n createEnqueueBatchFn,\n createEnqueueJobFn,\n createRegisterHandlerFn,\n} from \"@brains/job-queue\";\nimport type { MessageHandler, MessageSender } from \"@brains/messaging-service\";\nimport type { Logger } from \"@brains/utils/logger\";\nimport type { AppInfo } from \"../contracts/app-info\";\nimport type { Conversation, Message } from \"../contracts/conversations\";\nimport type { EvalHandler, InsightHandler, IShell } from \"../interfaces\";\nimport type { Channel } from \"../utils/channels\";\nimport { isChannel } from \"../utils/channels\";\nimport { toPublicAppInfo } from \"./public-app-info\";\nimport { toPublicConversation, toPublicMessage } from \"./public-conversations\";\nimport {\n toPublicAnchorProfile,\n toPublicBrainCharacter,\n} from \"./public-identity\";\nimport type {\n IConversationsNamespace,\n IEndpointsNamespace,\n IEvalNamespace,\n IIdentityNamespace,\n IInsightsNamespace,\n IInteractionsNamespace,\n IMessagingNamespace,\n IPermissionsNamespace,\n IProfileKindsNamespace,\n TypedMessageHandler,\n} from \"./context-types\";\n\nexport function createAppInfoGetter(shell: IShell): () => Promise<AppInfo> {\n return async (): Promise<AppInfo> => {\n return toPublicAppInfo(await shell.getAppInfo());\n };\n}\n\nexport function createIdentityNamespace(\n shell: IShell,\n getAppInfo: () => Promise<AppInfo>,\n): IIdentityNamespace {\n return {\n get: () => toPublicBrainCharacter(shell.getIdentity()),\n getProfile: () => toPublicAnchorProfile(shell.getProfile()),\n getAppInfo,\n };\n}\n\nexport function createProfileKindsNamespace(\n shell: IShell,\n pluginId: string,\n): IProfileKindsNamespace {\n const registry = shell.getProfileKindRegistry();\n return {\n register: (definition): void => {\n registry.register(pluginId, definition);\n },\n getResolved: () => registry.getResolved(),\n getSelectedDefinition: () => registry.getSelectedDefinition(),\n };\n}\n\nexport function createMessagingNamespace(\n shell: IShell,\n pluginId: string,\n logger: Logger,\n): IMessagingNamespace {\n const messageBus = shell.getMessageBus();\n const sendMessage: MessageSender = async (request) => {\n return messageBus.send({\n ...request,\n sender: pluginId,\n });\n };\n\n return {\n send: sendMessage,\n subscribe: <T = unknown, R = unknown>(\n channelOrName: string | Channel<T, R>,\n handler: MessageHandler<T, R> | TypedMessageHandler<T, R>,\n ): (() => void) => {\n if (isChannel(channelOrName)) {\n const channel = channelOrName;\n const typedHandler = handler as TypedMessageHandler<T, R>;\n\n const wrappedHandler: MessageHandler<unknown, R> = async (message) => {\n const parseResult = channel.schema.safeParse(message.payload);\n if (!parseResult.success) {\n logger.warn(`Invalid payload for channel ${channel.name}`, {\n error: parseResult.error.message,\n });\n return { noop: true };\n }\n\n const { payload: _payload, ...baseMessage } = message;\n return typedHandler(parseResult.data as T, baseMessage);\n };\n\n return messageBus.subscribe(channel.name, wrappedHandler);\n }\n\n return messageBus.subscribe(\n channelOrName,\n handler as MessageHandler<T, R>,\n );\n },\n };\n}\n\nexport function createJobsNamespace(\n shell: IShell,\n pluginId: string,\n): JobsNamespace {\n const jobQueueService = shell.getJobQueueService();\n return {\n ...shell.jobs,\n enqueue: createEnqueueJobFn(jobQueueService, pluginId, true),\n enqueueBatch: createEnqueueBatchFn(shell.jobs, pluginId),\n registerHandler: createRegisterHandlerFn(jobQueueService, pluginId),\n };\n}\n\nexport function createPermissionsNamespace(\n shell: IShell,\n): IPermissionsNamespace {\n const permissionService = shell.getPermissionService();\n return {\n assertEntityActionAllowed: (entityType, action, context): void => {\n permissionService.assertEntityActionAllowed(\n entityType,\n action,\n context.userPermissionLevel,\n );\n },\n };\n}\n\nexport function createConversationsNamespace(\n shell: IShell,\n): IConversationsNamespace {\n return {\n get: async (conversationId: string): Promise<Conversation | null> => {\n const conversationService = shell.getConversationService();\n const conversation =\n await conversationService.getConversation(conversationId);\n return conversation ? toPublicConversation(conversation) : null;\n },\n search: async (query: string): Promise<Conversation[]> => {\n const conversationService = shell.getConversationService();\n const conversations =\n await conversationService.searchConversations(query);\n return conversations.map(toPublicConversation);\n },\n list: async (options): Promise<Conversation[]> => {\n const conversationService = shell.getConversationService();\n const conversations =\n await conversationService.listConversations(options);\n return conversations.map(toPublicConversation);\n },\n getMessages: async (\n conversationId: string,\n options?: GetMessagesOptions,\n ): Promise<Message[]> => {\n const conversationService = shell.getConversationService();\n const messages = await conversationService.getMessages(\n conversationId,\n options,\n );\n return messages.map(toPublicMessage);\n },\n countMessages: async (conversationId: string): Promise<number> => {\n return shell.getConversationService().countMessages(conversationId);\n },\n };\n}\n\nexport function createEvalNamespace(\n shell: IShell,\n pluginId: string,\n): IEvalNamespace {\n return {\n registerHandler: (handlerId: string, handler: EvalHandler): void => {\n shell.registerEvalHandler(pluginId, handlerId, handler);\n },\n };\n}\n\nexport function createInsightsNamespace(shell: IShell): IInsightsNamespace {\n return {\n register: (type: string, handler: InsightHandler): void => {\n shell.getInsightsRegistry().register(type, handler);\n },\n };\n}\n\nexport function createEndpointsNamespace(\n shell: IShell,\n pluginId: string,\n): IEndpointsNamespace {\n return {\n register: (endpoint): void => {\n shell.registerEndpoint({ ...endpoint, pluginId });\n },\n };\n}\n\nexport function createInteractionsNamespace(\n shell: IShell,\n pluginId: string,\n): IInteractionsNamespace {\n return {\n register: (interaction): void => {\n shell.registerInteraction({ ...interaction, pluginId });\n },\n };\n}\n",
|
|
36
|
+
"import type { IShell } from \"../interfaces\";\nimport { type Logger } from \"@brains/utils/logger\";\nimport { derivePreviewDomain } from \"@brains/site-composition\";\nimport type {\n ICoreEntityService,\n ProjectSemanticSpaceRequest,\n SemanticSpaceProjection,\n} from \"@brains/entity-service\";\nimport type { JudgeInput, PluginRegistrationContext } from \"../interfaces\";\nimport type { AppInfo } from \"../contracts/app-info\";\nimport type { EntityDisplayEntry } from \"@brains/site-composition\";\nimport type { JobsNamespace } from \"@brains/job-queue\";\nimport type { IRecurringChecksNamespace } from \"@brains/recurring-checks\";\nimport type { IRuntimeStateNamespace } from \"@brains/runtime-state\";\nimport type { IAttachmentsNamespace } from \"../service/attachment-registry\";\nimport type { IRuntimeUploadsNamespace } from \"../service/upload-registry\";\nimport {\n createAppInfoGetter,\n createConversationsNamespace,\n createEndpointsNamespace,\n createEvalNamespace,\n createIdentityNamespace,\n createInsightsNamespace,\n createInteractionsNamespace,\n createJobsNamespace,\n createMessagingNamespace,\n createPermissionsNamespace,\n createProfileKindsNamespace,\n} from \"./namespaces\";\nimport type {\n IConversationsNamespace,\n IEndpointsNamespace,\n IEvalNamespace,\n IIdentityNamespace,\n IInsightsNamespace,\n IInteractionsNamespace,\n IMessagingNamespace,\n IPermissionsNamespace,\n IProfileKindsNamespace,\n} from \"./context-types\";\n\nexport interface ISemanticNamespace {\n project(\n request: ProjectSemanticSpaceRequest,\n ): Promise<SemanticSpaceProjection>;\n}\n\nexport type {\n IConversationsNamespace,\n IEndpointsNamespace,\n IEvalNamespace,\n IIdentityNamespace,\n IInsightsNamespace,\n IInteractionsNamespace,\n IMessagingNamespace,\n IPermissionsNamespace,\n IProfileKindsNamespace,\n TypedMessageHandler,\n} from \"./context-types\";\n\n/**\n * Base plugin context — shared by all plugin types (Entity, Service, Interface).\n *\n * Contains only capabilities that every plugin needs.\n * AI, templates, views, and transport are on sibling contexts.\n */\nexport interface BasePluginContext {\n // ============================================================================\n // Plugin Identity\n // ============================================================================\n\n /** Unique plugin identifier */\n readonly pluginId: string;\n\n /** Logger instance for this plugin */\n readonly logger: Logger;\n\n /** Data directory for storing entity files */\n readonly dataDir: string;\n\n /** Bare domain string (e.g. \"yeehaa.io\"), undefined for local dev */\n readonly domain: string | undefined;\n\n /** Production site URL derived from domain (e.g. \"https://yeehaa.io\"), undefined if no domain */\n readonly siteUrl: string | undefined;\n\n /** Local runtime site URL (e.g. \"http://localhost:8080\"), undefined when unavailable */\n readonly localSiteUrl: string | undefined;\n\n /** Preview site URL derived from domain (e.g. \"https://preview.yeehaa.io\" or \"https://preview.recall.rizom.ai\"), undefined if no domain */\n readonly previewUrl: string | undefined;\n\n /** Prefer local runtime URLs over public domain URLs when both exist. */\n readonly preferLocalUrls: boolean;\n\n /** Active resolved theme CSS for site, dashboard, and media rendering. */\n readonly themeCSS: string;\n\n /** Entity display metadata from the active site package, if any */\n readonly entityDisplay: Record<string, EntityDisplayEntry> | undefined;\n\n /** Shared conversation spaces for this brain/team */\n readonly spaces: string[];\n\n /** Entity action policy assertions for plugin-owned tools and handlers. */\n readonly permissions: IPermissionsNamespace;\n\n /** App metadata (version, model, plugins) */\n readonly appInfo: () => Promise<AppInfo>;\n\n /** Bounded model-as-judge capability; schema-constrained verdicts only. */\n readonly judge: <T>(input: JudgeInput<T>) => Promise<{\n verdict: T;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n }>;\n\n // ============================================================================\n // Entity Service (Read-Only)\n // ============================================================================\n\n /** Core entity service with read-only operations */\n readonly entityService: ICoreEntityService;\n\n /** Provider-independent semantic indexing operations. */\n readonly semantic: ISemanticNamespace;\n\n // ============================================================================\n // Brain Identity & Profile\n // ============================================================================\n\n /**\n * Identity namespace\n * - `identity.get()` - Get the brain's identity configuration\n * - `identity.getProfile()` - Get the owner's profile\n * - `identity.getAppInfo()` - Get app metadata\n */\n readonly identity: IIdentityNamespace;\n\n /** App-scoped semantic profile-kind catalog and selected resolution. */\n readonly profileKinds: IProfileKindsNamespace;\n\n // ============================================================================\n // Inter-Plugin Messaging\n // ============================================================================\n\n /**\n * Messaging namespace\n * - `messaging.send()` - Send a message to other plugins\n * - `messaging.subscribe()` - Subscribe to messages on a channel\n */\n readonly messaging: IMessagingNamespace;\n\n // ============================================================================\n // Job Queue (monitoring + scoped write)\n // ============================================================================\n\n /** Job operations — monitoring + plugin-scoped enqueue/registerHandler */\n readonly jobs: JobsNamespace;\n\n // ============================================================================\n // Source-derived Attachments\n // ============================================================================\n\n /** Source-derived publish attachment resolution namespace */\n readonly attachments: IAttachmentsNamespace;\n\n // ============================================================================\n // Runtime Uploads\n // ============================================================================\n\n /** Ephemeral runtime upload storage namespace. */\n readonly uploads: IRuntimeUploadsNamespace;\n\n // ============================================================================\n // Runtime State\n // ============================================================================\n\n /** Disposable, secret-free operational state namespace. */\n readonly runtimeState: IRuntimeStateNamespace;\n\n /** Shell-owned recurring checks registered by this plugin. */\n readonly recurringChecks: IRecurringChecksNamespace;\n\n // ============================================================================\n // Conversations (Read-Only)\n // ============================================================================\n\n /**\n * Conversations namespace\n * - `conversations.get()` - Get a conversation by ID\n * - `conversations.search()` - Search conversations by query\n * - `conversations.getMessages()` - Get messages from a conversation\n */\n readonly conversations: IConversationsNamespace;\n\n // ============================================================================\n // Evaluation\n // ============================================================================\n\n /**\n * Eval namespace for plugin testing\n * - `eval.registerHandler()` - Register an eval handler\n */\n readonly eval: IEvalNamespace;\n\n // ============================================================================\n // Insights\n // ============================================================================\n\n /**\n * Insights namespace\n * - `insights.register()` - Register a domain-specific insight handler\n */\n readonly insights: IInsightsNamespace;\n\n // ============================================================================\n // Endpoint Advertisement\n // ============================================================================\n\n /**\n * Endpoints namespace — advertise this plugin's user-facing URLs\n * so they surface in `appInfo.endpoints` for the dashboard and\n * other operator-facing consumers.\n */\n readonly endpoints: IEndpointsNamespace;\n\n /**\n * Interactions namespace — advertise user/agent entry points for this brain.\n */\n readonly interactions: IInteractionsNamespace;\n}\n\n/**\n * Create a BasePluginContext from the shell.\n *\n * Used by all three sibling context factories (entity, service, interface).\n */\nexport function createBasePluginContext(\n shell: IShell,\n pluginId: string,\n registrationContext?: PluginRegistrationContext,\n): BasePluginContext {\n const entityService = shell.getEntityService();\n const logger = shell.getLogger().child(pluginId);\n const domain = shell.getDomain();\n const localSiteUrl = shell.getLocalSiteUrl();\n const preferLocalUrls = shell.shouldPreferLocalUrls();\n const themeCSS = shell.getThemeCSS();\n const getAppInfo = createAppInfoGetter(shell);\n const attachments = shell.getAttachmentRegistry();\n const uploads = shell.getRuntimeUploadRegistry();\n const runtimeState = shell.getRuntimeState();\n\n return {\n pluginId,\n logger,\n entityService,\n\n semantic: {\n project: (request) => entityService.projectSemanticSpace(request),\n },\n\n identity: createIdentityNamespace(shell, getAppInfo),\n profileKinds: createProfileKindsNamespace(shell, pluginId),\n\n appInfo: getAppInfo,\n judge: (input) => shell.judge(input),\n\n domain,\n siteUrl: domain ? `https://${domain}` : undefined,\n localSiteUrl,\n previewUrl: domain ? `https://${derivePreviewDomain(domain)}` : undefined,\n preferLocalUrls,\n themeCSS,\n entityDisplay: registrationContext?.entityDisplay,\n spaces: shell.getSpaces(),\n\n permissions: createPermissionsNamespace(shell),\n\n messaging: createMessagingNamespace(shell, pluginId, logger),\n\n jobs: createJobsNamespace(shell, pluginId),\n\n attachments,\n\n uploads,\n\n runtimeState,\n recurringChecks: shell.getRecurringChecks(pluginId),\n\n conversations: createConversationsNamespace(shell),\n\n dataDir: shell.getDataDir(),\n\n eval: createEvalNamespace(shell, pluginId),\n\n insights: createInsightsNamespace(shell),\n\n endpoints: createEndpointsNamespace(shell, pluginId),\n interactions: createInteractionsNamespace(shell, pluginId),\n };\n}\n",
|
|
37
37
|
"import type { IEntityService } from \"@brains/entity-service\";\nimport {\n generateMarkdownWithFrontmatter,\n parseMarkdownWithFrontmatter,\n} from \"@brains/entity-service\";\nimport type { TemplateRegistry } from \"@brains/templates\";\nimport { z } from \"@brains/utils/zod\";\n\nfunction targetToEntityId(target: string): string {\n return target.replace(/:/g, \"-\");\n}\n\nfunction targetToTitle(target: string): string {\n return target\n .split(/[:.-]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\n/** Caches resolved prompt bodies and tracks materialization */\nconst promptCache = new Map<string, string>();\n\n/**\n * Resolve a prompt by target name.\n *\n * Looks up a prompt entity in the database. If found, returns the body\n * (markdown content stripped of frontmatter). If not found, creates the\n * entity from the fallback default (materializing it in DB + on disk via\n * directory-sync auto-export), then returns the fallback.\n *\n * Results are cached — subsequent calls for the same target skip the DB.\n */\nexport async function resolvePrompt(\n entityService: IEntityService,\n target: string,\n fallback: string,\n): Promise<string> {\n const cached = promptCache.get(target);\n if (cached !== undefined) return cached;\n\n const entityId = targetToEntityId(target);\n\n let entity;\n try {\n entity = await entityService.getEntity({\n entityType: \"prompt\",\n id: entityId,\n });\n } catch {\n // DB error — return fallback without caching so next call retries\n return fallback;\n }\n\n if (entity?.content) {\n const body = parseMarkdownWithFrontmatter(\n entity.content,\n z.record(z.string(), z.unknown()),\n ).content;\n promptCache.set(target, body);\n return body;\n }\n\n // Entity doesn't exist — materialize the default prompt\n try {\n const title = targetToTitle(target);\n const content = generateMarkdownWithFrontmatter(fallback, {\n title,\n target,\n });\n await entityService.createEntity({\n entity: {\n id: entityId,\n entityType: \"prompt\",\n content,\n metadata: { title, target, slug: entityId },\n },\n });\n } catch {\n // Creation failed (e.g. entity type not registered yet) — silent fallback\n }\n\n promptCache.set(target, fallback);\n return fallback;\n}\n\n/**\n * Reset the prompt cache (for testing).\n */\nexport function resetPromptCache(): void {\n promptCache.clear();\n}\n\n/**\n * Materialize prompt entities for every registered template that carries a\n * basePrompt. Returns the number of templates materialized.\n */\nexport async function materializePrompts(\n templateRegistry: TemplateRegistry,\n entityService: IEntityService,\n): Promise<number> {\n const promptTemplates = templateRegistry\n .list()\n .filter((t): t is typeof t & { basePrompt: string } => !!t.basePrompt);\n\n await Promise.all(\n promptTemplates.map((t) =>\n resolvePrompt(entityService, t.name, t.basePrompt),\n ),\n );\n\n return promptTemplates.length;\n}\n",
|
|
38
|
-
"import type {\n BaseEntity,\n CreateInterceptor,\n DataSource,\n UploadSaveHandlerRegistration,\n EntityAdapter,\n EntityTypeConfig,\n IEntitiesNamespace,\n IEntityService,\n} from \"@brains/entity-service\";\nimport type { IShell } from \"../interfaces\";\nimport { resolvePrompt } from \"./prompt-resolver\";\n\n/**\n * Prompts namespace — resolves AI prompts from prompt entities\n */\nexport interface IPromptsNamespace {\n /** Resolve a prompt by target name. Returns entity content if found, fallback otherwise. */\n resolve: (target: string, fallback: string) => Promise<string>;\n}\n\ntype EntitySchema<TEntity extends BaseEntity> =\n EntityAdapter<TEntity>[\"schema\"];\ntype FrontmatterSchema = NonNullable<\n EntityAdapter<BaseEntity>[\"frontmatterSchema\"]\n>;\n\n/**\n * Create the shared entity-management namespace used by entity and service\n * plugin contexts.\n */\nexport function createEntitiesNamespace(shell: IShell): IEntitiesNamespace {\n const entityService = shell.getEntityService();\n const entityRegistry = shell.getEntityRegistry();\n const dataSourceRegistry = shell.getDataSourceRegistry();\n\n return {\n register: <T extends BaseEntity>(\n entityType: string,\n schema: EntitySchema<T>,\n adapter: EntityAdapter<T>,\n config?: EntityTypeConfig,\n ): void => {\n entityRegistry.registerEntityType(entityType, schema, adapter, config);\n },\n getAdapter: (entityType: string): EntityAdapter<BaseEntity> | undefined => {\n try {\n return entityRegistry.getAdapter(entityType);\n } catch {\n return undefined;\n }\n },\n extendFrontmatterSchema: (\n type: string,\n extension: FrontmatterSchema,\n ): void => {\n entityRegistry.extendFrontmatterSchema(type, extension);\n },\n getEffectiveFrontmatterSchema: (\n type: string,\n ): FrontmatterSchema | undefined => {\n return entityRegistry.getEffectiveFrontmatterSchema(type);\n },\n registerCreateInterceptor: (\n entityType: string,\n interceptor: CreateInterceptor,\n ): void => {\n entityRegistry.registerCreateInterceptor(entityType, interceptor);\n },\n registerUploadSaveHandler: (\n registration: UploadSaveHandlerRegistration,\n ): void => {\n entityRegistry.registerUploadSaveHandler(registration);\n },\n getUploadSaveHandler: (\n mediaType: string,\n ): UploadSaveHandlerRegistration | undefined => {\n return entityRegistry.getUploadSaveHandler(mediaType);\n },\n update: async <T extends BaseEntity>(\n entity: T,\n ): Promise<{ entityId: string; jobId: string }> => {\n return entityService.updateEntity({ entity: entity });\n },\n registerDataSource: (dataSource: DataSource): void => {\n dataSourceRegistry.register(dataSource);\n },\n };\n}\n\n/** Create the shared prompt-resolution namespace. */\nexport function createPromptsNamespace(\n entityService: IEntityService,\n): IPromptsNamespace {\n return {\n resolve: (target: string, fallback: string): Promise<string> => {\n return resolvePrompt(entityService, target, fallback);\n },\n };\n}\n",
|
|
38
|
+
"import type {\n BaseEntity,\n CreateInterceptor,\n DataSource,\n PersistValidator,\n UploadSaveHandlerRegistration,\n EntityAdapter,\n EntityTypeConfig,\n IEntitiesNamespace,\n IEntityService,\n} from \"@brains/entity-service\";\nimport type { IShell } from \"../interfaces\";\nimport { resolvePrompt } from \"./prompt-resolver\";\n\n/**\n * Prompts namespace — resolves AI prompts from prompt entities\n */\nexport interface IPromptsNamespace {\n /** Resolve a prompt by target name. Returns entity content if found, fallback otherwise. */\n resolve: (target: string, fallback: string) => Promise<string>;\n}\n\ntype EntitySchema<TEntity extends BaseEntity> =\n EntityAdapter<TEntity>[\"schema\"];\ntype FrontmatterSchema = NonNullable<\n EntityAdapter<BaseEntity>[\"frontmatterSchema\"]\n>;\n\n/**\n * Create the shared entity-management namespace used by entity and service\n * plugin contexts.\n */\nexport function createEntitiesNamespace(shell: IShell): IEntitiesNamespace {\n const entityService = shell.getEntityService();\n const entityRegistry = shell.getEntityRegistry();\n const dataSourceRegistry = shell.getDataSourceRegistry();\n\n return {\n register: <T extends BaseEntity>(\n entityType: string,\n schema: EntitySchema<T>,\n adapter: EntityAdapter<T>,\n config?: EntityTypeConfig,\n ): void => {\n entityRegistry.registerEntityType(entityType, schema, adapter, config);\n },\n getAdapter: (entityType: string): EntityAdapter<BaseEntity> | undefined => {\n try {\n return entityRegistry.getAdapter(entityType);\n } catch {\n return undefined;\n }\n },\n extendFrontmatterSchema: (\n type: string,\n extension: FrontmatterSchema,\n ): void => {\n entityRegistry.extendFrontmatterSchema(type, extension);\n },\n getEffectiveFrontmatterSchema: (\n type: string,\n ): FrontmatterSchema | undefined => {\n return entityRegistry.getEffectiveFrontmatterSchema(type);\n },\n registerPersistValidator: (\n entityType: string,\n validator: PersistValidator,\n ): void => {\n entityRegistry.registerPersistValidator(entityType, validator);\n },\n registerCreateInterceptor: (\n entityType: string,\n interceptor: CreateInterceptor,\n ): void => {\n entityRegistry.registerCreateInterceptor(entityType, interceptor);\n },\n registerUploadSaveHandler: (\n registration: UploadSaveHandlerRegistration,\n ): void => {\n entityRegistry.registerUploadSaveHandler(registration);\n },\n getUploadSaveHandler: (\n mediaType: string,\n ): UploadSaveHandlerRegistration | undefined => {\n return entityRegistry.getUploadSaveHandler(mediaType);\n },\n update: async <T extends BaseEntity>(\n entity: T,\n ): Promise<{ entityId: string; jobId: string }> => {\n return entityService.updateEntity({ entity: entity });\n },\n registerDataSource: (dataSource: DataSource): void => {\n dataSourceRegistry.register(dataSource);\n },\n };\n}\n\n/** Create the shared prompt-resolution namespace. */\nexport function createPromptsNamespace(\n entityService: IEntityService,\n): IPromptsNamespace {\n return {\n resolve: (target: string, fallback: string): Promise<string> => {\n return resolvePrompt(entityService, target, fallback);\n },\n };\n}\n",
|
|
39
39
|
"import type { BasePluginContext, IPermissionsNamespace } from \"../base/context\";\nimport { createBasePluginContext } from \"../base/context\";\nimport type {\n IShell,\n ContentGenerationConfig,\n PluginRegistrationContext,\n} from \"../interfaces\";\nimport type {\n IEntityService,\n IEntitiesNamespace,\n} from \"@brains/entity-service\";\nimport { createEntitiesNamespace, createPromptsNamespace } from \"./namespaces\";\nimport type { IPromptsNamespace } from \"./namespaces\";\nimport type { DefaultQueryResponse } from \"@brains/contracts\";\nimport type { ZodType } from \"@brains/utils/zod\";\n\nexport type { IEntitiesNamespace };\nexport type { IPromptsNamespace };\n\nexport type AIGenerationSchema<T> = ZodType<T>;\n\nexport type AspectRatio = \"1:1\" | \"16:9\" | \"9:16\" | \"4:3\" | \"3:4\";\n\nexport interface ImageGenerationOptions {\n aspectRatio?: AspectRatio;\n signal?: AbortSignal;\n}\n\nexport interface ImageGenerationResult {\n base64: string;\n dataUrl: string;\n}\n\nexport interface FrontmatterSchemaParser {\n parse(data: unknown): unknown;\n}\n\nexport interface EntityPluginEntitiesNamespace extends Omit<\n IEntitiesNamespace,\n \"getEffectiveFrontmatterSchema\"\n> {\n getEffectiveFrontmatterSchema(\n type: string,\n ): FrontmatterSchemaParser | undefined;\n}\n\n/**\n * AI namespace for entity plugins — includes generation capabilities\n */\nexport interface IEntityAINamespace {\n /** Query the AI with optional context */\n query: (\n prompt: string,\n context?: Record<string, unknown>,\n ) => Promise<DefaultQueryResponse>;\n\n /** Generate content using AI with template */\n generate: <T = unknown>(config: ContentGenerationConfig) => Promise<T>;\n\n /** Generate a structured object using AI with a schema parser */\n generateObject: <T>(\n prompt: string,\n schema: AIGenerationSchema<T>,\n signal?: AbortSignal,\n ) => Promise<{ object: T }>;\n\n /** Generate an image using AI (requires AI_API_KEY) */\n generateImage: (\n prompt: string,\n options?: ImageGenerationOptions,\n ) => Promise<ImageGenerationResult>;\n\n /** Check if image generation is available */\n canGenerateImages: () => boolean;\n}\n\n/**\n * Context for entity plugins.\n *\n * Includes: entity registration, AI generation, prompt resolution, messaging, jobs.\n * Excludes: templates, views, MCP registration, transport.\n */\nexport interface EntityPluginContext extends BasePluginContext {\n readonly entityService: IEntityService;\n readonly entities: EntityPluginEntitiesNamespace;\n readonly ai: IEntityAINamespace;\n readonly prompts: IPromptsNamespace;\n readonly permissions: IPermissionsNamespace;\n}\n\n/**\n * Create an EntityPluginContext from the shell.\n */\nexport function createEntityPluginContext(\n shell: IShell,\n pluginId: string,\n registrationContext?: PluginRegistrationContext,\n): EntityPluginContext {\n const baseContext = createBasePluginContext(\n shell,\n pluginId,\n registrationContext,\n );\n const entityService = shell.getEntityService();\n\n return {\n ...baseContext,\n\n entityService,\n\n entities: createEntitiesNamespace(shell),\n\n ai: {\n query: (prompt, context) => shell.query(prompt, context),\n generate: async <T = unknown>(\n config: ContentGenerationConfig,\n ): Promise<T> => {\n return shell.generateContent<T>(config);\n },\n generateObject: async <T>(\n prompt: string,\n schema: AIGenerationSchema<T>,\n signal?: AbortSignal,\n ): Promise<{ object: T }> => {\n return shell.generateObject(prompt, schema, signal);\n },\n generateImage: async (\n prompt: string,\n options?: ImageGenerationOptions,\n ): Promise<ImageGenerationResult> => {\n return shell.generateImage(prompt, options);\n },\n canGenerateImages: (): boolean => {\n return shell.canGenerateImages();\n },\n },\n\n prompts: createPromptsNamespace(entityService),\n\n permissions: baseContext.permissions,\n };\n}\n",
|
|
40
40
|
"import { DIRECTORY_SYNC_CHANNELS, ENTITY_CHANNELS } from \"@brains/contracts\";\nimport type {\n BaseEntity,\n ContentVisibility,\n EntityInput,\n} from \"@brains/entity-service\";\nimport type { JobHandler, JobOptions } from \"@brains/job-queue\";\nimport { getErrorMessage } from \"@brains/utils/error\";\nimport { type Logger } from \"@brains/utils/logger\";\nimport type { EntityPluginContext } from \"./context\";\nimport { Cause, Effect, Exit } from \"@brains/utils/effect\";\n\nexport interface EntityChangePayload<TEntity extends BaseEntity = BaseEntity> {\n entityType: string;\n entityId?: string;\n entity?: TEntity;\n /**\n * Metadata of the entity as it was before an `entity:updated` change.\n * Present only on update events; lets projections detect a moved value\n * (e.g. a changed `seriesName`) and reconcile the prior state.\n */\n previousMetadata?: TEntity[\"metadata\"];\n}\n\nexport interface ProjectionJobConfig {\n /** Projection job type. Use target-entity scoped names, e.g. \"topic:project\". */\n type: string;\n handler: JobHandler<string, unknown>;\n}\n\nexport interface ProjectionInitialSyncConfig {\n /** Durable gate. Return false to skip enqueueing for this process/restart. */\n shouldEnqueue?: () => boolean | Promise<boolean>;\n jobData: unknown;\n jobOptions?: JobOptions | (() => JobOptions | undefined);\n}\n\nexport type ProjectionSourceKind = \"entity\" | \"conversation\";\n\nexport interface ProjectionSourceChangeConfig {\n sourceTypes: readonly string[];\n /** Explicit source kind for non-entity projections. Defaults to \"entity\". */\n sourceKind?: ProjectionSourceKind;\n /** Custom source type override. Defaults to payload.entityType for entity sources or sourceKind for non-entity sources. */\n sourceType?: string;\n events?: readonly string[];\n requireInitialSync?: boolean;\n shouldEnqueue?: (payload: EntityChangePayload) => boolean | Promise<boolean>;\n jobData: (\n payload: EntityChangePayload,\n ) => unknown | null | Promise<unknown | null>;\n jobOptions?: (payload: EntityChangePayload) => JobOptions | undefined;\n}\n\nexport interface DerivedEntityProjection {\n id: string;\n targetType: string;\n job: ProjectionJobConfig;\n initialSync?: ProjectionInitialSyncConfig;\n sourceChange?: ProjectionSourceChangeConfig;\n}\n\nexport interface DerivedEntityProjectionController {\n hasObservedInitialSync: () => boolean;\n hasQueuedInitialSync: () => boolean;\n}\n\nexport function registerDerivedEntityProjection(\n context: EntityPluginContext,\n logger: Logger,\n projection: DerivedEntityProjection,\n): DerivedEntityProjectionController {\n let observedInitialSync = false;\n let queuedInitialSync = false;\n\n context.jobs.registerHandler(projection.job.type, projection.job.handler);\n\n if (projection.initialSync) {\n const initialSyncConfig = projection.initialSync;\n context.messaging.subscribe(\n DIRECTORY_SYNC_CHANNELS.initialCompleted,\n async (): Promise<{ success: boolean }> => {\n if (observedInitialSync) return { success: true };\n observedInitialSync = true;\n\n const shouldEnqueue =\n (await initialSyncConfig.shouldEnqueue?.()) ?? true;\n if (!shouldEnqueue) {\n logger.info(\"Skipping derived entity projection initial sync\", {\n projectionId: projection.id,\n targetType: projection.targetType,\n });\n return { success: true };\n }\n\n queuedInitialSync = await enqueueProjectionJob(\n context,\n logger,\n projection,\n initialSyncConfig.jobData,\n resolveJobOptions(initialSyncConfig.jobOptions),\n \"initial-sync\",\n );\n return { success: true };\n },\n );\n }\n\n if (projection.sourceChange) {\n const sourceChangeConfig = projection.sourceChange;\n const sourceTypes = new Set(sourceChangeConfig.sourceTypes);\n const events = sourceChangeConfig.events ?? [\n ENTITY_CHANNELS.created,\n ENTITY_CHANNELS.updated,\n ];\n\n const handleChange = async (message: {\n payload: EntityChangePayload;\n }): Promise<{ success: boolean }> => {\n if (sourceChangeConfig.requireInitialSync && !observedInitialSync) {\n return { success: true };\n }\n\n const payload = message.payload;\n const payloadSourceType = getProjectionSourceType(\n sourceChangeConfig,\n payload,\n );\n if (\n !payloadSourceType ||\n (!sourceTypes.has(\"*\") && !sourceTypes.has(payloadSourceType))\n ) {\n return { success: true };\n }\n\n const shouldEnqueue =\n (await sourceChangeConfig.shouldEnqueue?.(payload)) ?? true;\n if (!shouldEnqueue) return { success: true };\n\n const jobData = await sourceChangeConfig.jobData(payload);\n if (!jobData) return { success: true };\n\n await enqueueProjectionJob(\n context,\n logger,\n projection,\n jobData,\n sourceChangeConfig.jobOptions?.(payload),\n \"source-change\",\n );\n return { success: true };\n };\n\n for (const event of events) {\n context.messaging.subscribe(event, handleChange);\n }\n }\n\n return {\n hasObservedInitialSync: () => observedInitialSync,\n hasQueuedInitialSync: () => queuedInitialSync,\n };\n}\n\nfunction getProjectionSourceType(\n config: ProjectionSourceChangeConfig,\n payload: EntityChangePayload,\n): string | undefined {\n if (config.sourceType) return config.sourceType;\n if (config.sourceKind && config.sourceKind !== \"entity\") {\n return config.sourceKind;\n }\n return payload.entityType;\n}\n\nexport async function hasPersistedTargets(\n context: EntityPluginContext,\n targetType: string,\n options?: {\n visibility?: ContentVisibility;\n outputVisibility?: ContentVisibility;\n },\n): Promise<boolean> {\n // Default fails closed to \"public\" — projections that own non-public\n // targets must declare outputVisibility at the callsite.\n const outputVisibility: ContentVisibility =\n options?.outputVisibility ?? \"public\";\n // When only outputVisibility is given, filter the scope-bounded list to the\n // exact partition. When the legacy `visibility` option is explicit, defer to\n // its own per-row check.\n const existing = await context.entityService.listEntities({\n entityType: targetType,\n options:\n options?.visibility === undefined\n ? { filter: { visibilityScope: outputVisibility } }\n : { filter: { visibilityScope: options.visibility } },\n });\n return options?.visibility === undefined\n ? existing.some((entity) => entity.visibility === outputVisibility)\n : existing.some((entity) => entity.visibility === options.visibility);\n}\n\nexport interface ReconcileDerivedEntitiesOptions<\n TDesired,\n TEntity extends BaseEntity = BaseEntity,\n> {\n context: EntityPluginContext;\n targetType: string;\n desired: Iterable<TDesired>;\n getId: (desired: TDesired) => string;\n toEntityInput: (desired: TDesired, id: string) => EntityInput<TEntity>;\n equals?: (existing: TEntity, desired: TDesired) => boolean;\n deleteStale?: boolean;\n /**\n * Visibility this projection writes its outputs at. The reconciler reads\n * existing targets at this scope and stamps `visibility = outputVisibility`\n * on every entity it creates or updates — `toEntityInput` should not set\n * visibility itself; if it does, the runner overrides. Defaults to \"public\".\n */\n outputVisibility?: ContentVisibility;\n /** Bounded concurrency for create/update/delete. Default 1 — derivation usually fans out DB mutations and message-bus side effects. */\n concurrency?: number;\n /** @deprecated Use concurrency. */\n deleteConcurrency?: number;\n logger?: Logger;\n}\n\nexport interface ReconcileDerivedEntitiesResult {\n created: number;\n updated: number;\n deleted: number;\n skipped: number;\n}\n\nexport async function reconcileDerivedEntities<\n TDesired,\n TEntity extends BaseEntity = BaseEntity,\n>({\n context,\n targetType,\n desired,\n getId,\n toEntityInput,\n equals,\n deleteStale = false,\n outputVisibility = \"public\",\n concurrency,\n deleteConcurrency,\n logger,\n}: ReconcileDerivedEntitiesOptions<\n TDesired,\n TEntity\n>): Promise<ReconcileDerivedEntitiesResult> {\n const desiredById = new Map<string, TDesired>();\n for (const item of desired) {\n desiredById.set(getId(item), item);\n }\n\n // Listing at scope returns entities at-or-below the level; filter to the\n // exact partition so a `shared` projection cannot claim, update, or delete\n // public targets that belong to another projection.\n const existing = (\n await context.entityService.listEntities<TEntity>({\n entityType: targetType,\n options: { filter: { visibilityScope: outputVisibility } },\n })\n ).filter((entity) => entity.visibility === outputVisibility);\n const existingById = new Map(existing.map((entity) => [entity.id, entity]));\n\n let created = 0;\n let updated = 0;\n let deleted = 0;\n let skipped = 0;\n\n const mutationConcurrency = Math.max(\n 1,\n concurrency ?? deleteConcurrency ?? 1,\n );\n\n if (deleteStale) {\n const stale = existing.filter((entity) => !desiredById.has(entity.id));\n await runBounded(stale, mutationConcurrency, async (entity) => {\n await context.entityService.deleteEntity({\n entityType: targetType,\n id: entity.id,\n });\n deleted++;\n });\n }\n\n await runBounded(\n Array.from(desiredById),\n mutationConcurrency,\n async ([id, item]) => {\n const existingEntity = existingById.get(id);\n const input = {\n ...toEntityInput(item, id),\n visibility: outputVisibility,\n };\n\n try {\n if (!existingEntity) {\n await context.entityService.createEntity({ entity: input });\n created++;\n return;\n }\n\n if (equals?.(existingEntity, item) ?? false) {\n skipped++;\n return;\n }\n\n const updatedEntity: TEntity = {\n ...existingEntity,\n ...input,\n id,\n entityType: targetType,\n visibility: outputVisibility,\n };\n await context.entityService.updateEntity({ entity: updatedEntity });\n updated++;\n } catch (error) {\n logger?.error(\"Failed to reconcile derived entity\", {\n targetType,\n id,\n error: getErrorMessage(error),\n });\n }\n },\n );\n\n return { created, updated, deleted, skipped };\n}\n\nasync function enqueueProjectionJob(\n context: EntityPluginContext,\n logger: Logger,\n projection: DerivedEntityProjection,\n jobData: unknown,\n options: JobOptions | undefined,\n reason: string,\n): Promise<boolean> {\n try {\n await context.jobs.enqueue({\n type: projection.job.type,\n data: jobData,\n ...(options ? { options } : {}),\n });\n logger.info(\"Queued derived entity projection\", {\n projectionId: projection.id,\n targetType: projection.targetType,\n reason,\n });\n return true;\n } catch (error) {\n logger.error(\"Failed to queue derived entity projection\", {\n projectionId: projection.id,\n targetType: projection.targetType,\n reason,\n error: getErrorMessage(error),\n });\n return false;\n }\n}\n\nfunction resolveJobOptions(\n options: JobOptions | (() => JobOptions | undefined) | undefined,\n): JobOptions | undefined {\n return typeof options === \"function\" ? options() : options;\n}\n\nasync function runBounded<T>(\n items: T[],\n concurrency: number,\n run: (item: T) => Promise<void>,\n): Promise<void> {\n const exit = await Effect.runPromiseExit(\n Effect.forEach(\n items,\n (item) =>\n Effect.tryPromise({\n try: () => run(item),\n catch: (error) => error,\n }),\n { concurrency, discard: true },\n ),\n );\n if (Exit.isFailure(exit)) throw Cause.squash(exit.cause);\n}\n",
|
|
41
|
-
"import { PLUGIN_CHANNELS } from \"@brains/contracts\";\nimport type {\n Plugin,\n PluginType,\n PluginCapabilities,\n Tool,\n Resource,\n ToolContext,\n} from \"./interfaces\";\nimport type { MessageHandler, MessageSender } from \"@brains/messaging-service\";\nimport type { IShell } from \"./interfaces\";\nimport { getErrorMessage } from \"@brains/utils/error\";\nimport { Logger } from \"@brains/utils/logger\";\nimport {\n type ProgressNotification,\n ProgressReporter,\n} from \"@brains/utils/progress\";\nimport type { UserPermissionLevel } from \"@brains/templates\";\nimport { z } from \"@brains/utils/zod\";\nimport { type PluginConfigSchema, PluginConfigValidationError } from \"./config\";\n\n// Message schemas for validation\nconst toolExecuteRequestSchema = z.object({\n toolName: z.string(),\n args: z.unknown(),\n progressToken: z.union([z.string(), z.number()]).optional(),\n hasProgress: z.boolean().optional(),\n interfaceType: z.string(),\n userId: z.string(),\n conversationId: z.string().optional(),\n channelId: z.string().optional(),\n channelName: z.string().optional(),\n runId: z.string().optional(),\n toolCallId: z.string().optional(),\n userPermissionLevel: z.enum([\"anchor\", \"trusted\", \"public\"]).optional(),\n signal: z\n .custom<AbortSignal>((value) => value instanceof AbortSignal)\n .optional(),\n});\n\nconst resourceGetRequestSchema = z.object({\n resourceUri: z.string(),\n});\n\n// Core context interface - minimal requirements for all plugins\nexport interface CoreContext {\n pluginId: string;\n logger: Logger;\n messaging: {\n send: MessageSender;\n subscribe: <T = unknown, R = unknown>(\n channel: string,\n handler: MessageHandler<T, R>,\n ) => () => void;\n };\n}\n\n/**\n * Base abstract class for plugins that provides common functionality\n */\nexport abstract class BasePlugin<\n TConfig,\n TConfigInput,\n TContext extends CoreContext = CoreContext,\n> implements Plugin {\n public readonly id: string;\n public readonly version: string;\n public readonly description: string;\n public readonly packageName: string;\n public abstract readonly type: PluginType;\n protected config: TConfig;\n protected context?: TContext;\n\n /**\n * Get the logger - uses context logger if available, creates temp logger otherwise\n */\n protected get logger(): Logger {\n return this.context?.logger ?? Logger.createFresh({ context: this.id });\n }\n\n constructor(\n id: string,\n packageJson: { name: string; version: string; description?: string },\n partialConfig: TConfigInput,\n configSchema: PluginConfigSchema<TConfig>,\n ) {\n this.id = id;\n this.packageName = packageJson.name;\n this.version = packageJson.version;\n this.description = packageJson.description ?? `${packageJson.name} plugin`;\n\n // Let Zod schema handle defaults during parsing\n const parsedConfig = configSchema.safeParse(partialConfig);\n if (!parsedConfig.success) {\n throw new PluginConfigValidationError(\n id,\n parsedConfig.error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\"),\n code: issue.code,\n message: issue.message,\n })),\n );\n }\n this.config = parsedConfig.data;\n }\n\n /**\n * Register the plugin - must be overridden by typed base classes\n * to create appropriate context from shell\n */\n abstract register(shell: IShell): Promise<PluginCapabilities>;\n\n /**\n * Set up message handlers for tool and resource execution\n */\n protected setupMessageHandlers(context: TContext): void {\n // Subscribe to tool execution requests for this specific plugin\n context.messaging.subscribe(\n PLUGIN_CHANNELS.toolExecute(this.id),\n async (message) => {\n try {\n // Validate and parse the message payload\n const parsedRequest = toolExecuteRequestSchema.safeParse(\n message.payload,\n );\n if (!parsedRequest.success) {\n return {\n success: false,\n error: \"Invalid tool execution request format\",\n };\n }\n\n const {\n toolName,\n args,\n progressToken,\n hasProgress,\n interfaceType,\n userId,\n conversationId,\n channelId,\n channelName,\n runId,\n toolCallId,\n userPermissionLevel,\n signal,\n } = parsedRequest.data;\n\n const tools = await this.getTools();\n const tool = tools.find((t) => t.name === toolName);\n\n if (!tool) {\n return {\n success: false,\n error: `Tool not found: ${toolName}`,\n };\n }\n\n // Create context with routing metadata and optional progress callback\n const toolContext: ToolContext = {\n interfaceType,\n userId,\n ...(conversationId && { conversationId }),\n ...(channelId && { channelId }),\n ...(channelName && { channelName }),\n ...(runId && { runId }),\n ...(toolCallId && { toolCallId }),\n ...(userPermissionLevel && { userPermissionLevel }),\n ...(signal && { signal }),\n ...(hasProgress &&\n progressToken !== undefined && {\n progressToken,\n sendProgress: async (\n notification: ProgressNotification,\n ): Promise<void> => {\n // Send progress notification back through message bus\n await context.messaging.send({\n type: PLUGIN_CHANNELS.progress(this.id),\n payload: {\n progressToken,\n notification,\n },\n });\n },\n }),\n };\n\n // Response shape is validated at the consumer boundary\n // (MCPService registry wrapper / mcp-registration protocol path).\n const result = await tool.handler(args, toolContext);\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n this.logger.error(\"Tool execution error\", error);\n return {\n success: false,\n error: getErrorMessage(error),\n };\n }\n },\n );\n\n // Subscribe to resource get requests for this specific plugin\n context.messaging.subscribe(\n PLUGIN_CHANNELS.resourceGet(this.id),\n async (message) => {\n try {\n // Validate and parse the message payload\n const parsedRequest = resourceGetRequestSchema.safeParse(\n message.payload,\n );\n if (!parsedRequest.success) {\n return {\n success: false,\n error: \"Invalid resource get request format\",\n };\n }\n const { resourceUri } = parsedRequest.data;\n\n const resources = await this.getResources();\n const resource = resources.find((r) => r.uri === resourceUri);\n\n if (!resource) {\n return {\n success: false,\n error: `Resource not found: ${resourceUri}`,\n };\n }\n\n // Get the resource\n const result = await resource.handler();\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n this.logger.error(\"Resource fetch error\", error);\n return {\n success: false,\n error: getErrorMessage(error),\n };\n }\n },\n );\n }\n\n /**\n * Lifecycle hook called during registration.\n * Override this for capability registration and subscriptions that must exist\n * before the system-wide \"all plugins registered\" signal.\n */\n protected async onRegister(_context: TContext): Promise<void> {\n // Default implementation does nothing\n }\n\n /**\n * Lifecycle hook called after all plugins have registered and the shell has\n * completed ready-state preparation.\n * Override this for work that reads identity/profile or depends on other\n * plugins having completed registration.\n */\n protected async onReady(_context: TContext): Promise<void> {\n // Default implementation does nothing\n }\n\n /**\n * Dispatch the ready lifecycle hook.\n */\n public async ready(): Promise<void> {\n await this.onReady(this.getContext());\n }\n\n /**\n * Build plugin capabilities from overridable capability hooks.\n */\n protected async getCapabilities(): Promise<PluginCapabilities> {\n const instructions = await this.getInstructions();\n return {\n tools: await this.getTools(),\n resources: await this.getResources(),\n ...(instructions && { instructions }),\n };\n }\n\n /**\n * Get the tools provided by this plugin\n * Override this to provide plugin-specific tools\n */\n protected async getTools(): Promise<Tool[]> {\n return [];\n }\n\n /**\n * Get the resources provided by this plugin\n * Override this to provide plugin-specific resources\n */\n protected async getResources(): Promise<Resource[]> {\n return [];\n }\n\n /**\n * Get behavioral instructions for the agent's system prompt\n * Override this to provide plugin-specific agent guidance\n */\n protected async getInstructions(): Promise<string | undefined> {\n return undefined;\n }\n\n /**\n * Optional shutdown method for cleanup\n * Override this if your plugin needs cleanup\n */\n async shutdown?(): Promise<void> {\n await this.onShutdown();\n }\n\n /**\n * Lifecycle hook called during shutdown\n * Override this to perform cleanup\n */\n protected async onShutdown(): Promise<void> {\n // Default implementation does nothing\n }\n\n /**\n * Get the plugin context\n */\n protected getContext(): TContext {\n if (!this.context) {\n throw new Error(`Plugin ${this.id}: Plugin not registered yet`);\n }\n return this.context;\n }\n\n /**\n * Determine the permission level for a user in this plugin's context\n * Must be implemented by plugins that handle user permissions\n * Default implementation returns 'public' for safety\n */\n public determineUserPermissionLevel(_userId: string): UserPermissionLevel {\n return \"public\";\n }\n\n /**\n * Create a progress bridge that converts job queue ProgressReporter to MCP progress events\n * Used by job-based tools to report progress via MCP progressToken\n */\n protected createProgressBridge(\n progressToken?: string | number,\n ): ProgressReporter | undefined {\n if (!progressToken) return undefined;\n\n const context = this.context;\n if (!context) return undefined;\n\n const pluginId = this.id;\n return ProgressReporter.from(async (notification: ProgressNotification) => {\n await context.messaging.send({\n type: PLUGIN_CHANNELS.progress(pluginId),\n payload: {\n progressToken,\n notification: {\n progress: notification.progress,\n total: notification.total,\n message: notification.message,\n },\n },\n });\n });\n }\n}\n",
|
|
41
|
+
"import { PLUGIN_CHANNELS } from \"@brains/contracts\";\nimport type {\n Plugin,\n PluginType,\n PluginCapabilities,\n Tool,\n Resource,\n ToolContext,\n} from \"./interfaces\";\nimport type { MessageHandler, MessageSender } from \"@brains/messaging-service\";\nimport type { IShell } from \"./interfaces\";\nimport { getErrorMessage } from \"@brains/utils/error\";\nimport { Logger } from \"@brains/utils/logger\";\nimport {\n type ProgressNotification,\n ProgressReporter,\n} from \"@brains/utils/progress\";\nimport type { UserPermissionLevel } from \"@brains/templates\";\nimport { z } from \"@brains/utils/zod\";\nimport { type PluginConfigSchema, PluginConfigValidationError } from \"./config\";\n\n// Message schemas for validation\nconst toolExecuteRequestSchema = z.object({\n toolName: z.string(),\n args: z.unknown(),\n progressToken: z.union([z.string(), z.number()]).optional(),\n hasProgress: z.boolean().optional(),\n interfaceType: z.string(),\n userId: z.string(),\n conversationId: z.string().optional(),\n channelId: z.string().optional(),\n channelName: z.string().optional(),\n runId: z.string().optional(),\n toolCallId: z.string().optional(),\n userPermissionLevel: z.enum([\"anchor\", \"trusted\", \"public\"]).optional(),\n signal: z\n .custom<AbortSignal>((value) => value instanceof AbortSignal)\n .optional(),\n});\n\nconst resourceGetRequestSchema = z.object({\n resourceUri: z.string(),\n});\n\n// Core context interface - minimal requirements for all plugins\nexport interface CoreContext {\n pluginId: string;\n logger: Logger;\n messaging: {\n send: MessageSender;\n subscribe: <T = unknown, R = unknown>(\n channel: string,\n handler: MessageHandler<T, R>,\n ) => () => void;\n };\n}\n\n/**\n * Base abstract class for plugins that provides common functionality\n */\nexport abstract class BasePlugin<\n TConfig,\n TConfigInput,\n TContext extends CoreContext = CoreContext,\n> implements Plugin {\n public readonly id: string;\n public readonly version: string;\n public readonly description: string;\n public readonly packageName: string;\n public abstract readonly type: PluginType;\n protected config: TConfig;\n protected context?: TContext;\n\n /**\n * Get the logger - uses context logger if available, creates temp logger otherwise\n */\n protected get logger(): Logger {\n return this.context?.logger ?? Logger.createFresh({ context: this.id });\n }\n\n constructor(\n id: string,\n packageJson: { name: string; version: string; description?: string },\n partialConfig: TConfigInput,\n configSchema: PluginConfigSchema<TConfig>,\n ) {\n this.id = id;\n this.packageName = packageJson.name;\n this.version = packageJson.version;\n this.description = packageJson.description ?? `${packageJson.name} plugin`;\n\n // Let Zod schema handle defaults during parsing\n const parsedConfig = configSchema.safeParse(partialConfig);\n if (!parsedConfig.success) {\n throw new PluginConfigValidationError(\n id,\n parsedConfig.error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\"),\n code: issue.code,\n message: issue.message,\n })),\n );\n }\n this.config = parsedConfig.data;\n }\n\n /**\n * Register the plugin - must be overridden by typed base classes\n * to create appropriate context from shell\n */\n abstract register(shell: IShell): Promise<PluginCapabilities>;\n\n /**\n * Set up message handlers for tool and resource execution\n */\n protected setupMessageHandlers(context: TContext): void {\n // Subscribe to tool execution requests for this specific plugin\n context.messaging.subscribe(\n PLUGIN_CHANNELS.toolExecute(this.id),\n async (message) => {\n try {\n // Validate and parse the message payload\n const parsedRequest = toolExecuteRequestSchema.safeParse(\n message.payload,\n );\n if (!parsedRequest.success) {\n return {\n success: false,\n error: \"Invalid tool execution request format\",\n };\n }\n\n const {\n toolName,\n args,\n progressToken,\n hasProgress,\n interfaceType,\n userId,\n conversationId,\n channelId,\n channelName,\n runId,\n toolCallId,\n userPermissionLevel,\n signal,\n } = parsedRequest.data;\n\n const tools = await this.getTools();\n const tool = tools.find((t) => t.name === toolName);\n\n if (!tool) {\n return {\n success: false,\n error: `Tool not found: ${toolName}`,\n };\n }\n\n // Create context with routing metadata and optional progress callback\n const toolContext: ToolContext = {\n interfaceType,\n userId,\n ...(conversationId && { conversationId }),\n ...(channelId && { channelId }),\n ...(channelName && { channelName }),\n ...(runId && { runId }),\n ...(toolCallId && { toolCallId }),\n ...(userPermissionLevel && { userPermissionLevel }),\n ...(signal && { signal }),\n ...(hasProgress &&\n progressToken !== undefined && {\n progressToken,\n sendProgress: async (\n notification: ProgressNotification,\n ): Promise<void> => {\n // Send progress notification back through message bus\n await context.messaging.send({\n type: PLUGIN_CHANNELS.progress(this.id),\n payload: {\n progressToken,\n notification,\n },\n });\n },\n }),\n };\n\n // Response shape is validated at the consumer boundary\n // (MCPService registry wrapper / mcp-registration protocol path).\n const result = await tool.handler(args, toolContext);\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n this.logger.error(\"Tool execution error\", error);\n return {\n success: false,\n error: getErrorMessage(error),\n };\n }\n },\n );\n\n // Subscribe to resource get requests for this specific plugin\n context.messaging.subscribe(\n PLUGIN_CHANNELS.resourceGet(this.id),\n async (message) => {\n try {\n // Validate and parse the message payload\n const parsedRequest = resourceGetRequestSchema.safeParse(\n message.payload,\n );\n if (!parsedRequest.success) {\n return {\n success: false,\n error: \"Invalid resource get request format\",\n };\n }\n const { resourceUri } = parsedRequest.data;\n\n const resources = await this.getResources();\n const resource = resources.find((r) => r.uri === resourceUri);\n\n if (!resource) {\n return {\n success: false,\n error: `Resource not found: ${resourceUri}`,\n };\n }\n\n // Get the resource\n const result = await resource.handler();\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n this.logger.error(\"Resource fetch error\", error);\n return {\n success: false,\n error: getErrorMessage(error),\n };\n }\n },\n );\n }\n\n /**\n * Lifecycle hook called during registration.\n * Override this for capability registration and subscriptions that must exist\n * before the system-wide \"all plugins registered\" signal.\n */\n protected async onRegister(_context: TContext): Promise<void> {\n // Default implementation does nothing\n }\n\n /**\n * Lifecycle hook called after every plugin has registered but before initial\n * content discovery. Override for composition finalization that must precede\n * imported entity validation.\n */\n protected async onRegistrationComplete(_context: TContext): Promise<void> {\n // Default implementation does nothing\n }\n\n /** Dispatch the post-registration lifecycle hook. */\n public async finalizeRegistration(): Promise<void> {\n await this.onRegistrationComplete(this.getContext());\n }\n\n /**\n * Lifecycle hook called after all plugins have registered and the shell has\n * completed ready-state preparation.\n * Override this for work that reads identity/profile or depends on other\n * plugins having completed registration.\n */\n protected async onReady(_context: TContext): Promise<void> {\n // Default implementation does nothing\n }\n\n /**\n * Dispatch the ready lifecycle hook.\n */\n public async ready(): Promise<void> {\n await this.onReady(this.getContext());\n }\n\n /**\n * Build plugin capabilities from overridable capability hooks.\n */\n protected async getCapabilities(): Promise<PluginCapabilities> {\n const instructions = await this.getInstructions();\n return {\n tools: await this.getTools(),\n resources: await this.getResources(),\n ...(instructions && { instructions }),\n };\n }\n\n /**\n * Get the tools provided by this plugin\n * Override this to provide plugin-specific tools\n */\n protected async getTools(): Promise<Tool[]> {\n return [];\n }\n\n /**\n * Get the resources provided by this plugin\n * Override this to provide plugin-specific resources\n */\n protected async getResources(): Promise<Resource[]> {\n return [];\n }\n\n /**\n * Get behavioral instructions for the agent's system prompt\n * Override this to provide plugin-specific agent guidance\n */\n protected async getInstructions(): Promise<string | undefined> {\n return undefined;\n }\n\n /**\n * Optional shutdown method for cleanup\n * Override this if your plugin needs cleanup\n */\n async shutdown?(): Promise<void> {\n await this.onShutdown();\n }\n\n /**\n * Lifecycle hook called during shutdown\n * Override this to perform cleanup\n */\n protected async onShutdown(): Promise<void> {\n // Default implementation does nothing\n }\n\n /**\n * Get the plugin context\n */\n protected getContext(): TContext {\n if (!this.context) {\n throw new Error(`Plugin ${this.id}: Plugin not registered yet`);\n }\n return this.context;\n }\n\n /**\n * Determine the permission level for a user in this plugin's context\n * Must be implemented by plugins that handle user permissions\n * Default implementation returns 'public' for safety\n */\n public determineUserPermissionLevel(_userId: string): UserPermissionLevel {\n return \"public\";\n }\n\n /**\n * Create a progress bridge that converts job queue ProgressReporter to MCP progress events\n * Used by job-based tools to report progress via MCP progressToken\n */\n protected createProgressBridge(\n progressToken?: string | number,\n ): ProgressReporter | undefined {\n if (!progressToken) return undefined;\n\n const context = this.context;\n if (!context) return undefined;\n\n const pluginId = this.id;\n return ProgressReporter.from(async (notification: ProgressNotification) => {\n await context.messaging.send({\n type: PLUGIN_CHANNELS.progress(pluginId),\n payload: {\n progressToken,\n notification: {\n progress: notification.progress,\n total: notification.total,\n message: notification.message,\n },\n },\n });\n });\n }\n}\n",
|
|
42
42
|
"import { BasePlugin } from \"../base-plugin\";\nimport type {\n PluginCapabilities,\n IShell,\n PluginRegistrationContext,\n} from \"../interfaces\";\nimport type {\n CreateExecutionContext,\n CreateInput,\n CreateInterceptionResult,\n EntityAdapter,\n BaseEntity,\n DataSource,\n EntityTypeConfig,\n} from \"@brains/entity-service\";\nimport type { EntityActionPolicyConfig, Template } from \"@brains/templates\";\nimport type { JobHandler } from \"@brains/job-queue\";\nimport { z } from \"@brains/utils/zod\";\nimport type { PluginConfigSchema } from \"../config\";\nimport type { EntityPluginContext } from \"./context\";\nimport { createEntityPluginContext } from \"./context\";\nimport {\n registerDerivedEntityProjection,\n type DerivedEntityProjection,\n type DerivedEntityProjectionController,\n} from \"./derived-entity-projection\";\n\nexport const emptyEntityPluginConfigSchema: z.ZodObject<Record<string, never>> =\n z.object({});\n\n/**\n * Base class for entity plugins — plugins that define an entity type\n * with adapter, optional generation handler, templates, and datasources.\n *\n * EntityPlugins don't expose tools — all entity CRUD goes through system_create/update/delete.\n */\nexport abstract class EntityPlugin<\n TEntity extends BaseEntity,\n TConfig,\n TConfigInput,\n> extends BasePlugin<TConfig, TConfigInput, EntityPluginContext> {\n public readonly type = \"entity\" as const;\n\n /** The entity type name (e.g. \"post\", \"deck\", \"note\") */\n abstract readonly entityType: string;\n\n /** Optional default action policy owned by this entity plugin. */\n public readonly entityActionPolicy?: EntityActionPolicyConfig;\n\n private readonly derivedEntityProjectionControllers = new Map<\n string,\n DerivedEntityProjectionController\n >();\n\n constructor(\n id: string,\n packageJson: { name: string; version: string; description?: string },\n config: TConfigInput,\n configSchema: PluginConfigSchema<TConfig>,\n entityActionPolicy?: EntityActionPolicyConfig,\n ) {\n super(id, packageJson, config, configSchema);\n if (entityActionPolicy !== undefined) {\n this.entityActionPolicy = entityActionPolicy;\n }\n }\n\n /** Schema for validating entities of this type */\n abstract readonly schema: EntityAdapter<TEntity>[\"schema\"];\n\n /** Entity adapter for serialization/deserialization */\n abstract readonly adapter: EntityAdapter<TEntity>;\n\n /**\n * Register the plugin with shell — creates context and auto-registers\n * entity type, handlers, templates, and datasources.\n */\n override async register(\n shell: IShell,\n registrationContext?: PluginRegistrationContext,\n ): Promise<PluginCapabilities> {\n const context = createEntityPluginContext(\n shell,\n this.id,\n registrationContext,\n );\n this.context = context;\n\n // Set up message handlers (tool/resource execution via message bus)\n this.setupMessageHandlers(context);\n\n // Auto-register entity type\n context.entities.register(\n this.entityType,\n this.schema,\n this.adapter,\n this.getEntityTypeConfig(),\n );\n\n if (this.interceptCreate !== EntityPlugin.prototype.interceptCreate) {\n context.entities.registerCreateInterceptor(\n this.entityType,\n (input, executionContext) =>\n this.interceptCreate(input, executionContext, context),\n );\n }\n\n // Auto-register generation handler if provided\n const handler = this.createGenerationHandler(context);\n if (handler) {\n context.jobs.registerHandler(`${this.entityType}:generation`, handler);\n }\n\n // Auto-register templates if provided\n const templates = this.getTemplates();\n if (templates && Object.keys(templates).length > 0) {\n shell.registerTemplates(templates, this.id);\n }\n\n // Auto-register datasources if provided\n const dataSources = this.getDataSources();\n for (const ds of dataSources) {\n context.entities.registerDataSource(ds);\n }\n\n // Auto-register derived entity projections if provided\n const projections = this.getDerivedEntityProjections(context);\n for (const projection of projections) {\n const controller = registerDerivedEntityProjection(\n context,\n this.logger,\n projection,\n );\n this.derivedEntityProjectionControllers.set(projection.id, controller);\n }\n\n // Call subclass hook for additional registration\n await this.onRegister(this.context);\n\n const instructions = await this.getInstructions();\n return {\n tools: [],\n resources: [],\n ...(instructions && { instructions }),\n };\n }\n\n /**\n * Override to intercept system_create for this entity type.\n * Subclasses can fully handle creation or continue with a rewritten input.\n */\n protected async interceptCreate(\n input: CreateInput,\n _executionContext: CreateExecutionContext,\n _context: EntityPluginContext,\n ): Promise<CreateInterceptionResult> {\n return { kind: \"continue\", input };\n }\n\n /**\n * Override to provide a generation handler for this entity type.\n * Registered as `{entityType}:generation` automatically.\n */\n protected createGenerationHandler(\n _context: EntityPluginContext,\n ): JobHandler | null {\n return null;\n }\n\n /**\n * Override to provide AI templates for this entity type.\n */\n protected getTemplates(): Record<string, Template> | null {\n return null;\n }\n\n /**\n * Override to provide datasources for site building.\n */\n protected getDataSources(): DataSource[] {\n return [];\n }\n\n /**\n * Override to provide entity type config (e.g. search weight).\n */\n protected getEntityTypeConfig(): EntityTypeConfig | undefined {\n return undefined;\n }\n\n /**\n * Override to declare derived entity projections owned by this plugin.\n */\n protected getDerivedEntityProjections(\n _context: EntityPluginContext,\n ): DerivedEntityProjection[] {\n return [];\n }\n\n protected getDerivedEntityProjectionController(\n projectionId: string,\n ): DerivedEntityProjectionController | undefined {\n return this.derivedEntityProjectionControllers.get(projectionId);\n }\n}\n",
|
|
43
43
|
"import type {\n ChatContext as RuntimeChatContext,\n IAgentService as RuntimeAgentService,\n} from \"@brains/ai-service\";\nimport { parseAgentResponse } from \"@brains/contracts\";\nimport type {\n AgentNamespace,\n AgentResponse,\n ChatContext,\n} from \"../contracts/agent\";\n\nexport function toPublicAgentResponse(response: unknown): AgentResponse {\n return parseAgentResponse(response);\n}\n\nfunction toRuntimeChatContext(\n context: ChatContext | undefined,\n): RuntimeChatContext | undefined {\n if (!context) return undefined;\n\n return {\n ...(context.userPermissionLevel && {\n userPermissionLevel: context.userPermissionLevel,\n }),\n ...(context.interfaceType && { interfaceType: context.interfaceType }),\n ...(context.channelId && { channelId: context.channelId }),\n ...(context.channelName && { channelName: context.channelName }),\n ...(context.actor && { actor: context.actor }),\n ...(context.source && { source: context.source }),\n ...(context.attachments && { attachments: context.attachments }),\n };\n}\n\nexport function createPublicAgentNamespace(\n agentService: RuntimeAgentService,\n): AgentNamespace {\n return {\n chat: async (\n message,\n conversationId,\n context?: ChatContext,\n signal?: AbortSignal,\n ): Promise<AgentResponse> => {\n const runtimeContext = toRuntimeChatContext(context);\n const response = signal\n ? await agentService.chat(\n message,\n conversationId,\n runtimeContext,\n signal,\n )\n : await agentService.chat(message, conversationId, runtimeContext);\n return toPublicAgentResponse(response);\n },\n confirmPendingAction: async (\n conversationId,\n confirmed,\n approvalId,\n context,\n signal?: AbortSignal,\n ): Promise<AgentResponse> => {\n const runtimeContext = toRuntimeChatContext(context);\n if (!runtimeContext) {\n throw new Error(\"Confirmation requires caller context.\");\n }\n const response = signal\n ? await agentService.confirmPendingAction(\n conversationId,\n confirmed,\n approvalId,\n runtimeContext,\n signal,\n )\n : await agentService.confirmPendingAction(\n conversationId,\n confirmed,\n approvalId,\n runtimeContext,\n );\n return toPublicAgentResponse(response);\n },\n invalidate: (): void => {\n agentService.invalidateAgent();\n },\n };\n}\n",
|
|
44
44
|
"import type {\n BasePluginContext,\n IConversationsNamespace,\n IPermissionsNamespace as IBasePermissionsNamespace,\n} from \"../base/context\";\nimport { createBasePluginContext } from \"../base/context\";\nimport type {\n IShell,\n IMCPTransport,\n PluginRegistrationContext,\n} from \"../interfaces\";\nimport type { Daemon } from \"../manager/daemon-types\";\nimport type {\n PermissionLookupContext,\n UserPermissionLevel,\n} from \"@brains/templates\";\nimport type { AgentNamespace } from \"../contracts/agent\";\nimport { createPublicAgentNamespace } from \"../base/public-agent-service\";\nimport type {\n StartConversationRequest,\n AddConversationMessageRequest,\n UpdateConversationMetadataRequest,\n} from \"@brains/conversation-service\";\nimport type { RegisteredApiRoute } from \"../types/api-routes\";\nimport type { RegisteredWebRoute } from \"../types/web-routes\";\nimport type { IMessageBus } from \"@brains/messaging-service\";\nimport type { ToolInfo } from \"@brains/mcp-service\";\n\n/**\n * Permissions namespace for InterfacePluginContext\n * Provides permission checking for users\n */\nexport interface IPermissionsNamespace extends IBasePermissionsNamespace {\n /** Get permission level for a user on an interface */\n getUserLevel: (\n interfaceType: string,\n userId: string,\n context?: PermissionLookupContext,\n ) => UserPermissionLevel;\n}\n\n/**\n * Daemons namespace for InterfacePluginContext\n * Provides daemon registration\n */\nexport interface IDaemonsNamespace {\n /** Register a daemon for this interface */\n register: (name: string, daemon: Daemon) => void;\n}\n\n/**\n * Tools namespace for InterfacePluginContext\n * Provides access to registered tools filtered by permission level\n */\nexport interface IToolsNamespace {\n /** List tools available at a given permission level */\n listForPermissionLevel: (level: UserPermissionLevel) => ToolInfo[];\n}\n\n/**\n * API Routes namespace for InterfacePluginContext\n * Provides access to plugin-declared API routes\n */\nexport interface IApiRoutesNamespace {\n /** Get all registered API routes from plugins */\n getRoutes: () => RegisteredApiRoute[];\n /** Get the message bus for handling route requests */\n getMessageBus: () => IMessageBus;\n}\n\nexport interface IWebRoutesNamespace {\n /** Get all registered web routes from plugins */\n getRoutes: () => RegisteredWebRoute[];\n}\n\nexport interface IPluginsNamespace {\n /** Check whether a plugin/interface is registered on the shell */\n has: (pluginId: string) => boolean;\n}\n\n/**\n * Extended conversations namespace for InterfacePluginContext\n * Adds write operations to the read-only base\n */\nexport interface IInterfaceConversationsNamespace extends IConversationsNamespace {\n /** Start a new conversation */\n start: (request: StartConversationRequest) => Promise<string>;\n\n /** Add a message to a conversation */\n addMessage: (request: AddConversationMessageRequest) => Promise<void>;\n\n /** Update conversation metadata */\n updateMetadata: (\n request: UpdateConversationMetadataRequest,\n ) => Promise<boolean>;\n\n /** Delete a conversation and its messages */\n delete: (conversationId: string) => Promise<boolean>;\n}\n\n/**\n * Context interface for interface plugins\n * Extends BasePluginContext with daemon support, job creation, and conversation management\n *\n * ## Method Naming Conventions\n * - Properties: Direct access to public namespaces (e.g., `mcpTransport`, `agent`)\n * - `get*`: Retrieve data (e.g., `getUserPermissionLevel`)\n * - `register*`: Register handlers/daemons (e.g., `registerDaemon`, `registerJobHandler`)\n * - Action verbs: Operations with side effects (e.g., `enqueueJob`, `addMessage`)\n */\nexport interface InterfacePluginContext extends BasePluginContext {\n // ============================================================================\n // Services\n // ============================================================================\n\n /** MCP transport for tool execution */\n readonly mcpTransport: IMCPTransport;\n\n /** Public agent namespace for AI-powered interaction */\n readonly agent: AgentNamespace;\n\n // ============================================================================\n // Permissions\n // ============================================================================\n\n /**\n * Permissions namespace for user permission checking\n * - `permissions.getUserLevel()` - Get permission level for a user on an interface\n */\n readonly permissions: IPermissionsNamespace;\n\n // ============================================================================\n // Daemon Management\n // ============================================================================\n\n /**\n * Daemons namespace for daemon registration\n * - `daemons.register()` - Register a daemon for this interface\n */\n readonly daemons: IDaemonsNamespace;\n\n // ============================================================================\n // Job Queue (extends base IJobsNamespace with plugin-scoped operations)\n // ============================================================================\n\n // ============================================================================\n // Conversation Management (Read + Write Operations)\n // ============================================================================\n\n /**\n * Extended conversations namespace with write operations\n * - `conversations.get()` - Get a conversation by ID (from Core)\n * - `conversations.search()` - Search conversations by query (from Core)\n * - `conversations.getMessages()` - Get messages from a conversation (from Core)\n * - `conversations.start()` - Start a new conversation\n * - `conversations.addMessage()` - Add a message to a conversation\n */\n readonly conversations: IInterfaceConversationsNamespace;\n\n // ============================================================================\n // Tools (Registered MCP tools)\n // ============================================================================\n\n /**\n * Tools namespace for accessing registered tools\n * - `tools.listForPermissionLevel()` - List tools available at a given permission level\n */\n readonly tools: IToolsNamespace;\n\n // ============================================================================\n // API Routes (Plugin-declared HTTP endpoints)\n // ============================================================================\n\n /**\n * API Routes namespace for webserver interfaces\n * - `apiRoutes.getRoutes()` - Get all registered API routes from plugins\n * - `apiRoutes.getMessageBus()` - Get message bus for route handling\n */\n readonly apiRoutes: IApiRoutesNamespace;\n\n /** Plugin-contributed web routes for the shared HTTP surface */\n readonly webRoutes: IWebRoutesNamespace;\n\n /** Plugin registry visibility for interface coordination */\n readonly plugins: IPluginsNamespace;\n}\n\n/**\n * Create an InterfacePluginContext for a plugin\n */\nexport function createInterfacePluginContext(\n shell: IShell,\n pluginId: string,\n registrationContext?: PluginRegistrationContext,\n): InterfacePluginContext {\n const baseContext = createBasePluginContext(\n shell,\n pluginId,\n registrationContext,\n );\n\n // Get interface-specific components\n const mcpTransport = shell.getMCPService();\n const permissionService = shell.getPermissionService();\n const agent = createPublicAgentNamespace(shell.getAgentService());\n\n return {\n ...baseContext,\n\n mcpTransport,\n\n agent,\n\n permissions: {\n ...baseContext.permissions,\n getUserLevel: (\n interfaceType: string,\n userId: string,\n context?: PermissionLookupContext,\n ): UserPermissionLevel => {\n return permissionService.determineUserLevel(\n interfaceType,\n userId,\n context,\n );\n },\n },\n\n // Daemons namespace\n daemons: {\n register: (name: string, daemon: Daemon): void => {\n // Ensure daemon name is unique by prefixing with plugin ID\n const daemonName = `${pluginId}:${name}`;\n shell.registerDaemon(daemonName, daemon, pluginId);\n baseContext.logger.debug(`Registered daemon: ${daemonName}`);\n },\n },\n\n conversations: {\n ...baseContext.conversations,\n\n start: async (request: StartConversationRequest): Promise<string> => {\n const conversationService = shell.getConversationService();\n return conversationService.startConversation(request);\n },\n addMessage: async (\n request: AddConversationMessageRequest,\n ): Promise<void> => {\n const conversationService = shell.getConversationService();\n await conversationService.addMessage(request);\n },\n updateMetadata: async (\n request: UpdateConversationMetadataRequest,\n ): Promise<boolean> => {\n const conversationService = shell.getConversationService();\n return conversationService.updateConversationMetadata(request);\n },\n delete: async (conversationId: string): Promise<boolean> => {\n const conversationService = shell.getConversationService();\n return conversationService.deleteConversation(conversationId);\n },\n },\n\n // Tools namespace\n tools: {\n listForPermissionLevel: (level: UserPermissionLevel): ToolInfo[] => {\n return shell.listToolsForPermissionLevel(level);\n },\n },\n\n // API Routes namespace\n apiRoutes: {\n getRoutes: (): RegisteredApiRoute[] => {\n return shell.getPluginApiRoutes();\n },\n getMessageBus: (): IMessageBus => {\n return shell.getMessageBus();\n },\n },\n\n webRoutes: {\n getRoutes: (): RegisteredWebRoute[] => {\n return shell.getPluginWebRoutes();\n },\n },\n\n plugins: {\n has: (candidatePluginId: string): boolean =>\n shell.hasPlugin(candidatePluginId),\n },\n };\n}\n",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"import type { BasePluginContext } from \"../base/context\";\nimport { createBasePluginContext } from \"../base/context\";\nimport type {\n ContentGenerationConfig,\n IShell,\n PluginRegistrationContext,\n} from \"../interfaces\";\nimport type { IWebRoutesNamespace } from \"../interface/context\";\nimport type {\n AIGenerationSchema,\n IEntitiesNamespace,\n IEntityAINamespace,\n ImageGenerationOptions,\n ImageGenerationResult,\n IPromptsNamespace,\n} from \"../entity/context\";\nimport {\n createEntitiesNamespace,\n createPromptsNamespace,\n} from \"../entity/namespaces\";\nimport type { IEntityService } from \"@brains/entity-service\";\nimport type { ResolutionOptions } from \"@brains/content-service\";\nimport { TemplateCapabilities } from \"@brains/templates\";\nimport type {\n OutputFormat,\n Renderer,\n Template,\n ViewTemplate,\n} from \"@brains/templates\";\n\n/**\n * Template operations namespace for ServicePluginContext\n * Includes registration, formatting, parsing, resolution, and capability checking\n */\nexport interface IServiceTemplatesNamespace {\n /** Register templates for this plugin or an explicit template namespace */\n register: (templates: Record<string, Template>, namespace?: string) => void;\n\n /** Format data using a template formatter */\n format: <T = unknown>(templateName: string, data: T) => string;\n\n /** Parse content using a template parser */\n parse: <T = unknown>(templateName: string, content: string) => T;\n\n /** Resolve content from a template (may fetch or generate) */\n resolve: <T = unknown>(\n templateName: string,\n options?: ResolutionOptions,\n ) => Promise<T | null>;\n\n /** Get capabilities of a template */\n getCapabilities: (templateName: string) => {\n canGenerate: boolean;\n canFetch: boolean;\n canRender: boolean;\n isStaticOnly: boolean;\n } | null;\n}\n\n/**\n * Views namespace — view template access and rendering utilities\n */\nexport interface IViewsNamespace {\n /** Get a view template by name */\n get: (name: string) => ViewTemplate<unknown> | undefined;\n\n /** List all registered view templates */\n list: () => ViewTemplate<unknown>[];\n\n /** Check if a template has a renderer for the requested format (defaults to web). */\n hasRenderer: (templateName: string, format?: OutputFormat) => boolean;\n\n /** Get the renderer for a template and format (defaults to web). */\n getRenderer: (\n templateName: string,\n format?: OutputFormat,\n ) => Renderer | undefined;\n\n /** Validate content against a template's schema */\n validate: (templateName: string, content: unknown) => boolean;\n}\n\n/**\n * Context for service plugins.\n *\n * Includes: entity management, templates, views, prompt resolution, AI, messaging, jobs.\n * Excludes: MCP protocol registration, transport.\n */\nexport interface ServicePluginContext extends BasePluginContext {\n /** Full entity service with write operations */\n readonly entityService: IEntityService;\n\n /** Entity management namespace */\n readonly entities: IEntitiesNamespace;\n\n /** Template operations namespace (register, format, parse, resolve, getCapabilities) */\n readonly templates: IServiceTemplatesNamespace;\n\n /** Views namespace for view template access and rendering */\n readonly views: IViewsNamespace;\n\n /** Prompt resolution namespace */\n readonly prompts: IPromptsNamespace;\n\n /**\n * Read-only view of plugin-contributed web routes. Service plugins already\n * contribute routes via getWebRoutes(); this is the symmetric read side\n * (e.g. the dashboard deriving console surface links from what is mounted).\n */\n readonly webRoutes: IWebRoutesNamespace;\n\n /** AI generation namespace */\n readonly ai: IEntityAINamespace;\n\n /** Register or update plugin instructions for the agent system prompt */\n registerInstructions: (instructions: string) => void;\n}\n\n/**\n * Create a ServicePluginContext from the shell.\n */\nexport function createServicePluginContext(\n shell: IShell,\n pluginId: string,\n registrationContext?: PluginRegistrationContext,\n): ServicePluginContext {\n const baseContext = createBasePluginContext(\n shell,\n pluginId,\n registrationContext,\n );\n const entityService = shell.getEntityService();\n const renderService = shell.getRenderService();\n const contentService = shell.getContentService();\n\n return {\n ...baseContext,\n\n entityService,\n\n entities: createEntitiesNamespace(shell),\n\n webRoutes: {\n getRoutes: () => shell.getPluginWebRoutes(),\n },\n\n templates: {\n register: (\n templates: Record<string, Template>,\n namespace?: string,\n ): void => {\n shell.registerTemplates(templates, namespace ?? pluginId);\n },\n format: <T = unknown>(templateName: string, data: T): string => {\n return contentService.formatContent(templateName, data, { pluginId });\n },\n parse: <T = unknown>(templateName: string, content: string): T => {\n return contentService.parseContent(templateName, content, pluginId);\n },\n resolve: async <T = unknown>(\n templateName: string,\n options?: ResolutionOptions,\n ): Promise<T | null> => {\n const result = await contentService.resolveContent(\n templateName,\n options,\n pluginId,\n );\n return result as T;\n },\n getCapabilities: (\n templateName: string,\n ): {\n canGenerate: boolean;\n canFetch: boolean;\n canRender: boolean;\n isStaticOnly: boolean;\n } | null => {\n const scopedTemplateName = templateName.includes(\":\")\n ? templateName\n : `${pluginId}:${templateName}`;\n const template = shell.getTemplate(scopedTemplateName);\n if (!template) return null;\n const capabilities = TemplateCapabilities.getCapabilities(template);\n return {\n canGenerate: capabilities.canGenerate,\n canFetch: capabilities.canFetch,\n canRender: capabilities.canRender,\n isStaticOnly: capabilities.isStaticOnly,\n };\n },\n },\n\n views: {\n get: (name: string): ViewTemplate<unknown> | undefined => {\n return renderService.get(name) ?? undefined;\n },\n list: (): ViewTemplate<unknown>[] => {\n return renderService.list();\n },\n hasRenderer: (\n templateName: string,\n format: OutputFormat = \"web\",\n ): boolean => {\n return renderService.hasRenderer(templateName, format);\n },\n getRenderer: (\n templateName: string,\n format: OutputFormat = \"web\",\n ): Renderer | undefined => {\n return renderService.getRenderer(templateName, format);\n },\n validate: (templateName: string, content: unknown): boolean => {\n return renderService.validate(templateName, content);\n },\n },\n\n prompts: createPromptsNamespace(entityService),\n\n ai: {\n query: (prompt, context) => shell.query(prompt, context),\n generate: async <T = unknown>(\n config: ContentGenerationConfig,\n ): Promise<T> => {\n return shell.generateContent<T>(config);\n },\n generateObject: async <T>(\n prompt: string,\n schema: AIGenerationSchema<T>,\n signal?: AbortSignal,\n ): Promise<{ object: T }> => {\n return shell.generateObject(prompt, schema, signal);\n },\n generateImage: async (\n prompt: string,\n options?: ImageGenerationOptions,\n ): Promise<ImageGenerationResult> => {\n return shell.generateImage(prompt, options);\n },\n canGenerateImages: (): boolean => {\n return shell.canGenerateImages();\n },\n },\n\n registerInstructions: (instructions: string): void => {\n shell.registerInstructions(pluginId, instructions);\n },\n };\n}\n",
|
|
55
55
|
"import { BasePlugin } from \"../base-plugin\";\nimport type {\n PluginCapabilities,\n IShell,\n PluginRegistrationContext,\n} from \"../interfaces\";\nimport type {\n IEntityService,\n BaseEntity,\n EntityAdapter,\n EntityTypeConfig,\n} from \"@brains/entity-service\";\nimport type {\n BatchOperation,\n EnqueueJobRequest,\n JobOptions,\n} from \"@brains/job-queue\";\nimport type { ServicePluginContext } from \"./context\";\nimport { createServicePluginContext } from \"./context\";\nimport type { ApiRouteDefinition } from \"../types/api-routes\";\nimport type { WebRouteDefinition } from \"../types/web-routes\";\n\n/**\n * Base class for service plugins\n * Service plugins extend core functionality with entity management, job queuing, and AI generation\n */\nexport abstract class ServicePlugin<TConfig, TConfigInput> extends BasePlugin<\n TConfig,\n TConfigInput,\n ServicePluginContext\n> {\n public readonly type = \"service\" as const;\n\n /** Get API routes for this plugin (override in subclass) */\n getApiRoutes(): ApiRouteDefinition[] {\n return [];\n }\n\n /** Get web routes for this plugin (override in subclass) */\n getWebRoutes(): WebRouteDefinition[] {\n return [];\n }\n\n /**\n * Register the plugin with shell - creates ServicePluginContext internally\n */\n override async register(\n shell: IShell,\n registrationContext?: PluginRegistrationContext,\n ): Promise<PluginCapabilities> {\n // Create typed context from shell\n const context = createServicePluginContext(\n shell,\n this.id,\n registrationContext,\n );\n this.context = context;\n\n // Set up message handlers\n this.setupMessageHandlers(context);\n\n // Call lifecycle hook with typed context\n await this.onRegister(context);\n\n return this.getCapabilities();\n }\n\n /**\n * Get the entity service for direct access\n */\n protected get entityService(): IEntityService {\n const context = this.getContext();\n return context.entityService;\n }\n\n /**\n * Helper method to register an entity type\n */\n protected registerEntityType<T extends BaseEntity>(\n entityType: string,\n schema: EntityAdapter<T>[\"schema\"],\n adapter: EntityAdapter<T>,\n config?: EntityTypeConfig,\n ): void {\n const context = this.getContext();\n context.entities.register(entityType, schema, adapter, config);\n }\n\n /**\n * Helper method to enqueue a job\n * Pass toolContext in the request for tool-routed jobs, or omit it for background jobs.\n */\n protected async enqueueJob(request: EnqueueJobRequest): Promise<string> {\n const context = this.getContext();\n return context.jobs.enqueue(request);\n }\n\n /**\n * Helper method to enqueue a batch of operations\n */\n protected async enqueueBatch(\n operations: BatchOperation[],\n options?: JobOptions,\n ): Promise<string> {\n const context = this.getContext();\n return context.jobs.enqueueBatch(operations, options);\n }\n\n /**\n * Override to register entity types during initialization\n */\n protected async registerEntityTypes(\n _context: ServicePluginContext,\n ): Promise<void> {\n // Default implementation does nothing\n // Override in subclasses to register entity types\n }\n\n /**\n * Override to register job handlers during initialization\n */\n protected async registerJobHandlers(\n _context: ServicePluginContext,\n ): Promise<void> {\n // Default implementation does nothing\n // Override in subclasses to register job handlers\n }\n\n /**\n * Override onRegister to add service-specific initialization\n */\n protected override async onRegister(\n context: ServicePluginContext,\n ): Promise<void> {\n // Register entity types first\n await this.registerEntityTypes(context);\n\n // Register job handlers\n await this.registerJobHandlers(context);\n }\n}\n"
|
|
56
56
|
],
|
|
57
|
-
"mappings": "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",
|
|
58
|
-
"debugId": "
|
|
57
|
+
"mappings": "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",
|
|
58
|
+
"debugId": "D7FF5754EA41B18E64756E2164756E21",
|
|
59
59
|
"names": []
|
|
60
60
|
}
|