@rizom/brain 0.2.0-alpha.194 → 0.2.0-alpha.196

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.
@@ -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;\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 { 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",
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",
@@ -26,7 +26,7 @@
26
26
  "import { z } from \"@brains/utils/zod\";\nimport type { DeduplicationStrategy } from \"./schema/types\";\nimport { JOB_STATUS } from \"./schemas\";\nimport type { JobInfo } from \"./types\";\n\nconst deduplicatedJobMetadataSchema = z.looseObject({\n deduplicationKey: z.string().optional(),\n});\n\n/**\n * Applies queue deduplication policy to active jobs of a single type.\n */\nexport class JobDeduplicator {\n public findDuplicate(\n activeJobs: JobInfo[],\n strategy?: DeduplicationStrategy,\n deduplicationKey?: string,\n ): JobInfo | null {\n if (!strategy || strategy === \"none\") {\n return null;\n }\n\n const matchingJobs = this.filterByDeduplicationKey(\n activeJobs,\n deduplicationKey,\n );\n if (matchingJobs.length === 0) {\n return null;\n }\n\n if (strategy === \"skip\" || strategy === \"replace\") {\n return (\n matchingJobs.find((job) => job.status === JOB_STATUS.PENDING) ?? null\n );\n }\n\n return matchingJobs[0] ?? null;\n }\n\n private filterByDeduplicationKey(\n jobs: JobInfo[],\n deduplicationKey?: string,\n ): JobInfo[] {\n if (!deduplicationKey) {\n return jobs;\n }\n\n return jobs.filter((job) => {\n const metadata = deduplicatedJobMetadataSchema.safeParse(job.metadata);\n return (\n metadata.success && metadata.data.deduplicationKey === deduplicationKey\n );\n });\n }\n}\n",
27
27
  "/**\n * Progress notification for long-running operations\n */\nexport interface ProgressNotification {\n progress: number;\n total?: number;\n message?: string;\n rate?: number; // Items per second\n eta?: number; // Estimated time remaining in milliseconds\n}\n\n/**\n * Progress callback type\n */\nexport type ProgressCallback = (\n notification: ProgressNotification,\n) => Promise<void>;\n\n/**\n * A simple utility class for managing progress reporting in nested operations\n *\n * @example\n * ```typescript\n * // Create from a callback\n * const progress = ProgressReporter.from(sendProgress);\n *\n * // Report progress\n * await progress?.report({\n * message: \"Building project\",\n * progress: 10,\n * total: 100\n * });\n *\n * // Create sub-progress with scaled range\n * const subProgress = progress?.createSub({ scale: { start: 10, end: 90 } });\n *\n * // Use with APIs that expect a callback\n * await someApi(subProgress?.toCallback());\n * ```\n */\nexport class ProgressReporter {\n private readonly callback: ProgressCallback;\n private heartbeatInterval: Timer | undefined;\n\n private constructor(callback: ProgressCallback) {\n this.callback = callback;\n }\n\n /**\n * Create a progress reporter from a callback\n */\n static from(\n callback: ProgressCallback | undefined,\n ): ProgressReporter | undefined {\n if (!callback) return undefined;\n return new ProgressReporter(callback);\n }\n\n /**\n * Create a sub-reporter with scaled progress range\n */\n createSub(options?: {\n scale?: { start: number; end: number };\n }): ProgressReporter {\n const { scale } = options ?? {};\n\n if (scale) {\n const { start, end } = scale;\n const range = end - start;\n return new ProgressReporter(async (notification) => {\n const scaledProgress =\n start + (notification.progress / (notification.total ?? 100)) * range;\n await this.callback({\n ...notification,\n progress: scaledProgress,\n total: 100,\n });\n });\n }\n\n return new ProgressReporter(this.callback);\n }\n\n /**\n * Report progress\n */\n async report(notification: ProgressNotification): Promise<void> {\n await this.callback(notification);\n }\n\n /**\n * Start a heartbeat that reports progress periodically\n * Useful for long-running operations to prevent timeouts\n */\n startHeartbeat(message: string, intervalMs = 5000): void {\n this.stopHeartbeat(); // Clear any existing heartbeat\n\n this.heartbeatInterval = setInterval(() => {\n this.report({ message, progress: 0 }).catch(() => {\n // Ignore errors from progress reporting\n });\n }, intervalMs);\n }\n\n /**\n * Stop the heartbeat\n */\n stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n }\n\n /**\n * Get the underlying callback function\n */\n toCallback(): ProgressCallback {\n return this.callback;\n }\n}\n\n/**\n * Interface for job progress monitoring\n * Allows different implementations for production and testing\n */\nexport interface IJobProgressMonitor {\n /**\n * Start the progress monitor\n */\n start(): void;\n\n /**\n * Stop the progress monitor\n */\n stop(): void;\n\n /**\n * Create a ProgressReporter for a specific job\n */\n createProgressReporter(jobId: string): ProgressReporter;\n\n /**\n * Emit job completion event\n */\n emitJobCompletion(jobId: string): Promise<void>;\n\n /**\n * Emit job failure event\n */\n emitJobFailure(jobId: string): Promise<void>;\n\n /**\n * Handle job status changes - emits individual job events and batch progress if applicable\n * This is the main entry point for job completion/failure notifications\n */\n handleJobStatusChange(\n jobId: string,\n status: \"completed\" | \"failed\",\n metadata?: Record<string, unknown>,\n ): Promise<void>;\n}\n",
28
28
  "import type { Logger } from \"@brains/utils/logger\";\nimport { ProgressReporter } from \"@brains/utils/progress\";\nimport { z } from \"@brains/utils/zod\";\nimport type {\n IJobProgressMonitor,\n ProgressNotification,\n} from \"@brains/utils/progress\";\nimport type { MessageBus } from \"@brains/messaging-service\";\nimport type { IBatchJobManager, IJobQueueService, JobInfo } from \"./types\";\nimport { JobContextSchema, type JobContext } from \"./schema/types\";\nimport type { BatchJobStatus } from \"./batch-schemas\";\nimport type { JobProgressEventSchema } from \"./schemas\";\n\nconst jobResultRecordSchema = z.preprocess(\n (value) => {\n if (typeof value !== \"string\") return value;\n return JSON.parse(value);\n },\n z.record(z.string(), z.unknown()),\n);\n\n/**\n * Progress event emitted by the monitor\n */\nexport type JobProgressEvent = z.output<typeof JobProgressEventSchema>;\n\n/**\n * Simplified service that emits job and batch progress events\n *\n * This service provides a simple event-driven approach to progress monitoring\n * without complex polling or state tracking.\n */\nexport class JobProgressMonitor implements IJobProgressMonitor {\n private jobQueueService: IJobQueueService;\n private messageBus: MessageBus;\n private batchJobManager: IBatchJobManager;\n private logger: Logger;\n private static instance: JobProgressMonitor | null = null;\n\n /**\n * Get the singleton instance\n */\n public static getInstance(\n jobQueueService: IJobQueueService,\n messageBus: MessageBus,\n batchJobManager: IBatchJobManager,\n logger: Logger,\n ): JobProgressMonitor {\n JobProgressMonitor.instance ??= new JobProgressMonitor(\n jobQueueService,\n messageBus,\n batchJobManager,\n logger,\n );\n return JobProgressMonitor.instance;\n }\n\n /**\n * Reset the singleton instance (primarily for testing)\n */\n public static resetInstance(): void {\n JobProgressMonitor.instance = null;\n }\n\n /**\n * Create a fresh instance without affecting the singleton\n */\n public static createFresh(\n jobQueueService: IJobQueueService,\n messageBus: MessageBus,\n batchJobManager: IBatchJobManager,\n logger: Logger,\n ): JobProgressMonitor {\n return new JobProgressMonitor(\n jobQueueService,\n messageBus,\n batchJobManager,\n logger,\n );\n }\n\n /**\n * Private constructor to enforce singleton pattern\n */\n private constructor(\n jobQueueService: IJobQueueService,\n messageBus: MessageBus,\n batchJobManager: IBatchJobManager,\n logger: Logger,\n ) {\n this.jobQueueService = jobQueueService;\n this.messageBus = messageBus;\n this.batchJobManager = batchJobManager;\n this.logger = logger;\n }\n\n /**\n * Start monitoring - now a no-op since we're event-driven\n */\n public start(): void {\n this.logger.debug(\"Job progress monitor ready (event-driven mode)\");\n }\n\n /**\n * Stop monitoring - now a no-op since no polling\n */\n public stop(): void {\n this.logger.debug(\"Job progress monitor stopped\");\n }\n\n /**\n * Create a ProgressReporter for a specific job\n */\n public createProgressReporter(jobId: string): ProgressReporter {\n const reporter = ProgressReporter.from(async (notification) => {\n await this.emitJobProgress(jobId, notification);\n });\n\n if (!reporter) {\n // This should never happen since we always provide a callback\n throw new Error(\"Failed to create ProgressReporter\");\n }\n\n return reporter;\n }\n\n /**\n * Emit batch progress event\n */\n public async emitBatchProgress(\n batchId: string,\n status: BatchJobStatus,\n metadata: JobContext,\n ): Promise<void> {\n try {\n const batchDetails: JobProgressEvent[\"batchDetails\"] = {\n totalOperations: status.totalOperations,\n completedOperations: status.completedOperations,\n failedOperations: status.failedOperations,\n currentOperation: status.currentOperation ?? \"Processing batch...\",\n errors: status.errors,\n };\n\n const event: JobProgressEvent = {\n id: batchId,\n type: \"batch\",\n status: status.status,\n metadata,\n batchDetails,\n };\n\n // Calculate overall batch progress\n if (status.totalOperations > 0) {\n event.progress = {\n current: status.completedOperations,\n total: status.totalOperations,\n percentage: Math.round(\n (status.completedOperations / status.totalOperations) * 100,\n ),\n };\n }\n\n await this.messageBus.send({\n type: \"job-progress\",\n payload: event,\n sender: \"job-progress-monitor\",\n broadcast: true,\n });\n\n this.logger.debug(\"Emitted batch progress update\", {\n batchId,\n status: status.status,\n progress: `${status.completedOperations}/${status.totalOperations}`,\n });\n } catch (error) {\n this.logger.error(\"Error emitting batch progress update\", {\n batchId,\n error,\n });\n }\n }\n\n private isBatchChild(jobId: string, rootJobId: string | undefined): boolean {\n return !!rootJobId && rootJobId !== jobId;\n }\n\n private async broadcastEvent(event: JobProgressEvent): Promise<void> {\n await this.messageBus.send({\n type: \"job-progress\",\n payload: event,\n sender: \"job-progress-monitor\",\n broadcast: true,\n });\n }\n\n private async emitJobProgress(\n jobId: string,\n progress: ProgressNotification,\n ): Promise<void> {\n try {\n const job = await this.jobQueueService.getStatus(jobId);\n if (!job) {\n this.logger.warn(\"Job not found for progress update\", { jobId });\n return;\n }\n\n if (job.metadata.silent) {\n return;\n }\n\n if (this.isBatchChild(jobId, job.metadata.rootJobId)) {\n this.logger.debug(\n \"Skipping individual job progress for batch operation\",\n { jobId, rootJobId: job.metadata.rootJobId },\n );\n return;\n }\n\n const total = progress.total ?? 0;\n const event: JobProgressEvent = {\n id: jobId,\n type: \"job\",\n status: \"processing\",\n metadata: job.metadata,\n message: progress.message,\n };\n\n if (total > 0) {\n event.progress = {\n current: progress.progress,\n total,\n percentage: Math.round((progress.progress / total) * 100),\n };\n }\n\n await this.broadcastEvent(event);\n } catch (error) {\n this.logger.error(\"Error emitting job progress\", { jobId, error });\n }\n }\n\n public async emitJobCompletion(jobId: string): Promise<void> {\n await this.emitJobStatusEvent(jobId, \"completed\");\n }\n\n public async emitJobFailure(jobId: string): Promise<void> {\n await this.emitJobStatusEvent(jobId, \"failed\");\n }\n\n private async emitJobStatusEvent(\n jobId: string,\n status: \"completed\" | \"failed\",\n ): Promise<void> {\n try {\n const job = await this.jobQueueService.getStatus(jobId);\n if (!job) {\n this.logger.warn(`Cannot emit ${status} for unknown job`, { jobId });\n return;\n }\n\n if (job.metadata.silent) {\n return;\n }\n\n if (this.isBatchChild(jobId, job.metadata.rootJobId)) {\n this.logger.debug(\n `Skipping individual job ${status} for batch operation`,\n { jobId, rootJobId: job.metadata.rootJobId },\n );\n return;\n }\n\n const event: JobProgressEvent = {\n id: jobId,\n type: \"job\",\n status,\n message: this.extractStatusMessage(job, status),\n metadata: job.metadata,\n jobDetails: {\n jobType: job.type,\n priority: job.priority,\n retryCount: job.retryCount,\n },\n };\n\n await this.broadcastEvent(event);\n this.logger.debug(`Emitted job ${status} event`, { jobId });\n } catch (error) {\n this.logger.error(`Error emitting job ${status} event`, {\n jobId,\n error,\n });\n }\n }\n\n private extractStatusMessage(\n job: JobInfo,\n status: \"completed\" | \"failed\",\n ): string | undefined {\n if (status === \"failed\") {\n return job.lastError ?? undefined;\n }\n\n if (!job.result) {\n return undefined;\n }\n\n try {\n const result = jobResultRecordSchema.parse(job.result);\n const message = result[\"message\"];\n if (message) {\n return String(message);\n }\n const routesBuilt = result[\"routesBuilt\"];\n if (routesBuilt !== undefined) {\n return `${routesBuilt} routes built`;\n }\n } catch {\n // Ignore parsing errors\n }\n\n return undefined;\n }\n\n /**\n * Get monitoring statistics\n */\n public getStats(): {\n isRunning: boolean;\n } {\n return {\n isRunning: true, // Always running in event-driven mode\n };\n }\n\n /**\n * Handle job status changes - emits individual job events and batch progress if applicable\n * This is the main entry point for job completion/failure notifications\n */\n public async handleJobStatusChange(\n jobId: string,\n status: \"completed\" | \"failed\",\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n const parsedMetadata = metadata\n ? JobContextSchema.safeParse(metadata)\n : undefined;\n const jobMetadata = parsedMetadata?.success\n ? parsedMetadata.data\n : undefined;\n\n if (jobMetadata?.silent) {\n return;\n }\n\n try {\n await this.emitJobStatusEvent(jobId, status);\n\n if (jobMetadata && this.isBatchChild(jobId, jobMetadata.rootJobId)) {\n try {\n const rootJobId = jobMetadata.rootJobId;\n const batchStatus =\n await this.batchJobManager.getBatchStatus(rootJobId);\n if (batchStatus) {\n const batchMetadata = batchStatus.metadata ?? jobMetadata;\n await this.emitBatchProgress(rootJobId, batchStatus, batchMetadata);\n }\n } catch (error) {\n this.logger.warn(\"Failed to emit batch progress\", {\n jobId,\n rootJobId: jobMetadata.rootJobId,\n error,\n });\n }\n }\n } catch (error) {\n this.logger.error(\"Failed to handle job status change\", {\n jobId,\n status,\n error,\n });\n }\n }\n}\n",
29
- "import { JobContextSchema } from \"./schema/types\";\nimport type { JobOptions, JobContext } from \"./schema/types\";\nimport type { BatchOperation, BatchJobStatus, Batch } from \"./batch-schemas\";\nimport type { DbConfig } from \"@brains/contracts\";\nimport type { ProgressReporter } from \"@brains/utils/progress\";\nimport { z } from \"@brains/utils/zod\";\n\n// Re-export types that are used internally\nexport type { JobOptions, JobContext, BatchOperation };\n\n/**\n * Request for enqueueing a job in the core job queue service.\n */\nexport interface JobQueueEnqueueRequest {\n /** Job type to enqueue */\n type: string;\n /** Job payload passed to the registered handler */\n data: unknown;\n /** Optional queue behavior, routing metadata, and retry settings */\n options?: JobOptions;\n}\n\nexport interface JobInfo {\n id: string;\n type: string;\n data: string;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n source: string | null;\n priority: number;\n retryCount: number;\n maxRetries: number;\n lastError: string | null;\n createdAt: number;\n scheduledFor: number;\n startedAt: number | null;\n completedAt: number | null;\n metadata: JobContext;\n result?: unknown;\n}\n\n/**\n * Simplified job info schema for external packages\n * Avoids exposing the complex Drizzle-inferred JobQueue type\n */\nexport const JobInfoSchema: z.ZodType<JobInfo, unknown> = z.object({\n id: z.string(),\n type: z.string(),\n data: z.string(),\n status: z.enum([\"pending\", \"processing\", \"completed\", \"failed\"]),\n source: z.string().nullable(),\n priority: z.number(),\n retryCount: z.number(),\n maxRetries: z.number(),\n lastError: z.string().nullable(),\n createdAt: z.number(),\n scheduledFor: z.number(),\n startedAt: z.number().nullable(),\n completedAt: z.number().nullable(),\n metadata: JobContextSchema,\n result: z.unknown().nullable().optional(), // Job result (type varies by job type)\n});\n\n/**\n * Job handler interface for processing specific job types\n *\n * @template TJobType - The job type string (can be any string for plugin extensibility)\n * @template TInput - The input data type for the job\n * @template TOutput - The output data type for the job\n */\nexport interface JobHandler<\n _TJobType extends string = string,\n TInput = unknown,\n TOutput = unknown,\n> {\n /**\n * Process a job of this type\n * @param data - The job input data\n * @param jobId - Unique identifier for this job\n * @param progressReporter - Progress reporter for granular updates\n */\n process(\n data: TInput,\n jobId: string,\n progressReporter: ProgressReporter,\n ): Promise<TOutput>;\n\n /**\n * Handle job failure (optional)\n */\n onError?(\n error: Error,\n data: TInput,\n jobId: string,\n progressReporter: ProgressReporter,\n ): Promise<void>;\n\n /**\n * Validate and parse job data\n * Returns parsed data if valid, null if invalid\n */\n validateAndParse(data: unknown): TInput | null;\n}\n\n/**\n * Job queue service interface\n */\nexport interface IJobQueueService {\n /** Settle database readiness work before runtime services start. */\n initialize?(): Promise<void>;\n\n /**\n * Register a job handler for a specific type\n */\n registerHandler(type: string, handler: JobHandler, pluginId?: string): void;\n\n /**\n * Unregister a job handler for a specific type\n */\n unregisterHandler(type: string): void;\n\n /**\n * Unregister all handlers for a specific plugin\n */\n unregisterPluginHandlers(pluginId: string): void;\n\n /**\n * Get a handler for a specific job type\n */\n getHandler(type: string): JobHandler | undefined;\n\n /**\n * Enqueue a job for processing\n */\n enqueue(request: JobQueueEnqueueRequest): Promise<string>;\n\n /**\n * Dequeue the next available job for processing\n */\n dequeue(): Promise<JobInfo | null>;\n\n /**\n * Mark job as completed\n */\n complete(jobId: string, result: unknown): Promise<void>;\n\n /**\n * Mark job as failed and handle retry\n */\n fail(jobId: string, error: Error): Promise<void>;\n\n /**\n * Update job data\n */\n update(jobId: string, data: unknown): Promise<void>;\n\n /**\n * Get job status by job ID\n */\n getStatus(jobId: string): Promise<JobInfo | null>;\n\n /**\n * Get job status by entity ID (for embedding jobs)\n */\n getStatusByEntityId(entityId: string): Promise<JobInfo | null>;\n\n /**\n * Get queue statistics\n */\n getStats(): Promise<{\n pending: number;\n processing: number;\n failed: number;\n completed: number;\n total: number;\n }>;\n\n /**\n * Clean up old completed jobs\n */\n cleanup(olderThanMs: number): Promise<number>;\n\n /**\n * Get active jobs (pending or processing)\n */\n getActiveJobs(types?: string[]): Promise<JobInfo[]>;\n\n /**\n * Get failed jobs\n */\n getFailedJobs(types?: string[]): Promise<JobInfo[]>;\n\n /**\n * Get registered job types\n */\n getRegisteredTypes(): string[];\n\n /**\n * Close the underlying database connection.\n */\n close(): void;\n}\n\n/**\n * Job enqueue function\n */\nexport type EnqueueJob = (request: JobQueueEnqueueRequest) => Promise<string>;\n\n/**\n * Database configuration for job queue\n */\nexport type { DbConfig as JobQueueDbConfig } from \"@brains/contracts\";\n\n/**\n * Configuration for the JobQueueService.\n */\nexport type JobQueueServiceConfig = DbConfig & {\n /**\n * Reclaim a processing job whose startedAt timestamp is older than this.\n * Defaults to 300_000 ms.\n */\n claimTimeoutMs?: number;\n};\n\n/**\n * Configuration for the JobQueueWorker\n */\nexport interface JobQueueWorkerConfig {\n /** Number of concurrent jobs to process */\n concurrency?: number;\n /** Polling interval in milliseconds */\n pollInterval?: number;\n /** Maximum number of jobs to process before stopping (0 for unlimited) */\n maxJobs?: number;\n /** Whether to start the worker automatically */\n autoStart?: boolean;\n}\n\n/**\n * Statistics for the JobQueueWorker\n */\nexport interface JobQueueWorkerStats {\n /** Number of jobs processed successfully */\n processedJobs: number;\n /** Number of jobs that failed */\n failedJobs: number;\n /** Number of jobs currently being processed */\n activeJobs: number;\n /** Worker uptime in milliseconds */\n uptime: number;\n /** Whether the worker is currently running */\n isRunning: boolean;\n /** Last error encountered */\n lastError?: string;\n}\n\n/**\n * Interface for job queue worker\n */\nexport interface IJobQueueWorker {\n /** Start the worker */\n start(): Promise<void>;\n /** Stop the worker */\n stop(): Promise<void>;\n /** Get worker statistics */\n getStats(): JobQueueWorkerStats;\n /** Check if worker is running */\n isWorkerRunning(): boolean;\n}\n\n/**\n * Interface for batch job manager\n */\nexport interface IBatchJobManager {\n /** Start periodic cleanup of terminal batch metadata. Idempotent. */\n start(intervalMs?: number): void;\n\n /** Stop periodic cleanup and drain in-flight metadata cleanup. */\n stop(): void | Promise<void>;\n\n /** Register a batch for tracking */\n registerBatch(\n batchId: string,\n jobIds: string[],\n operations: BatchOperation[],\n source: string,\n metadata: JobContext,\n ): void;\n\n /** Enqueue a batch of operations */\n enqueueBatch(\n operations: BatchOperation[],\n options: JobOptions,\n batchId: string,\n source: string,\n ): Promise<string>;\n\n /** Get status of a specific batch */\n getBatchStatus(batchId: string): Promise<BatchJobStatus | null>;\n\n /** Get all active batches */\n getActiveBatches(): Promise<Batch[]>;\n}\n\n/**\n * Unified jobs namespace interface\n * Combines job queue and batch operations for shell/context usage\n */\nexport interface IJobsNamespace {\n // === Job Monitoring ===\n\n /** Get active jobs, optionally filtered by type */\n getActiveJobs(types?: string[]): Promise<JobInfo[]>;\n\n /** Get status of a specific job */\n getStatus(jobId: string): Promise<JobInfo | null>;\n\n // === Batch Operations ===\n\n /** Enqueue multiple operations as a batch */\n enqueueBatch(\n operations: BatchOperation[],\n options: JobOptions,\n batchId: string,\n pluginId: string,\n ): Promise<string>;\n\n /** Get all active batches */\n getActiveBatches(): Promise<Batch[]>;\n\n /** Get status of a specific batch */\n getBatchStatus(batchId: string): Promise<BatchJobStatus | null>;\n}\n",
29
+ "import { JobContextSchema } from \"./schema/types\";\nimport type { JobOptions, JobContext } from \"./schema/types\";\nimport type { BatchOperation, BatchJobStatus, Batch } from \"./batch-schemas\";\nimport type { DbConfig } from \"@brains/contracts\";\nimport type { ProgressReporter } from \"@brains/utils/progress\";\nimport { z } from \"@brains/utils/zod\";\n\n// Re-export types that are used internally\nexport type { JobOptions, JobContext, BatchOperation };\n\n/**\n * Request for enqueueing a job in the core job queue service.\n */\nexport interface JobQueueEnqueueRequest {\n /** Job type to enqueue */\n type: string;\n /** Job payload passed to the registered handler */\n data: unknown;\n /** Optional queue behavior, routing metadata, and retry settings */\n options?: JobOptions;\n}\n\nexport interface JobInfo {\n id: string;\n type: string;\n data: string;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n source: string | null;\n priority: number;\n retryCount: number;\n maxRetries: number;\n lastError: string | null;\n createdAt: number;\n scheduledFor: number;\n startedAt: number | null;\n completedAt: number | null;\n metadata: JobContext;\n result?: unknown;\n}\n\n/**\n * Simplified job info schema for external packages\n * Avoids exposing the complex Drizzle-inferred JobQueue type\n */\nexport const JobInfoSchema: z.ZodType<JobInfo, unknown> = z.object({\n id: z.string(),\n type: z.string(),\n data: z.string(),\n status: z.enum([\"pending\", \"processing\", \"completed\", \"failed\"]),\n source: z.string().nullable(),\n priority: z.number(),\n retryCount: z.number(),\n maxRetries: z.number(),\n lastError: z.string().nullable(),\n createdAt: z.number(),\n scheduledFor: z.number(),\n startedAt: z.number().nullable(),\n completedAt: z.number().nullable(),\n metadata: JobContextSchema,\n result: z.unknown().nullable().optional(), // Job result (type varies by job type)\n});\n\n/**\n * Job handler interface for processing specific job types\n *\n * @template TJobType - The job type string (can be any string for plugin extensibility)\n * @template TInput - The input data type for the job\n * @template TOutput - The output data type for the job\n */\nexport interface JobHandler<\n _TJobType extends string = string,\n TInput = unknown,\n TOutput = unknown,\n> {\n /**\n * Process a job of this type\n * @param data - The job input data\n * @param jobId - Unique identifier for this job\n * @param progressReporter - Progress reporter for granular updates\n */\n process(\n data: TInput,\n jobId: string,\n progressReporter: ProgressReporter,\n ): Promise<TOutput>;\n\n /**\n * Handle job failure (optional)\n */\n onError?(\n error: Error,\n data: TInput,\n jobId: string,\n progressReporter: ProgressReporter,\n ): Promise<void>;\n\n /**\n * Validate and parse job data\n * Returns parsed data if valid, null if invalid\n */\n validateAndParse(data: unknown): TInput | null;\n}\n\n/**\n * Job queue service interface\n */\nexport interface IJobQueueService {\n /** Settle database readiness work before runtime services start. */\n initialize?(): Promise<void>;\n\n /**\n * Register a job handler for a specific type\n */\n registerHandler(type: string, handler: JobHandler, pluginId?: string): void;\n\n /**\n * Unregister a job handler for a specific type\n */\n unregisterHandler(type: string): void;\n\n /**\n * Unregister all handlers for a specific plugin\n */\n unregisterPluginHandlers(pluginId: string): void;\n\n /**\n * Get a handler for a specific job type\n */\n getHandler(type: string): JobHandler | undefined;\n\n /**\n * Enqueue a job for processing\n */\n enqueue(request: JobQueueEnqueueRequest): Promise<string>;\n\n /**\n * Dequeue the next available job for processing\n */\n dequeue(): Promise<JobInfo | null>;\n\n /**\n * Mark job as completed\n */\n complete(jobId: string, result: unknown): Promise<void>;\n\n /**\n * Mark job as failed and handle retry\n */\n fail(jobId: string, error: Error): Promise<void>;\n\n /**\n * Update job data\n */\n update(jobId: string, data: unknown): Promise<void>;\n\n /**\n * Get job status by job ID\n */\n getStatus(jobId: string): Promise<JobInfo | null>;\n\n /**\n * Get job status by entity ID (for embedding jobs)\n */\n getStatusByEntityId(entityId: string): Promise<JobInfo | null>;\n\n /**\n * Get queue statistics\n */\n getStats(): Promise<{\n pending: number;\n processing: number;\n failed: number;\n completed: number;\n total: number;\n }>;\n\n /**\n * Clean up old completed jobs\n */\n cleanup(olderThanMs: number): Promise<number>;\n\n /**\n * Get active jobs (pending or processing)\n */\n getActiveJobs(types?: string[]): Promise<JobInfo[]>;\n\n /**\n * Get failed jobs\n */\n getFailedJobs(types?: string[]): Promise<JobInfo[]>;\n\n /**\n * Get registered job types\n */\n getRegisteredTypes(): string[];\n\n /**\n * Close the underlying database connection.\n */\n close(): void;\n}\n\n/**\n * Job enqueue function\n */\nexport type EnqueueJob = (request: JobQueueEnqueueRequest) => Promise<string>;\n\n/**\n * Database configuration for job queue\n */\nexport type { DbConfig as JobQueueDbConfig } from \"@brains/contracts\";\n\n/**\n * Configuration for the JobQueueService.\n */\nexport type JobQueueServiceConfig = DbConfig & {\n /**\n * Reclaim a processing job whose startedAt timestamp is older than this.\n * Defaults to 300_000 ms.\n */\n claimTimeoutMs?: number;\n};\n\n/**\n * Configuration for the JobQueueWorker\n */\nexport interface JobQueueWorkerConfig {\n /** Number of concurrent jobs to process */\n concurrency?: number;\n /** Polling interval in milliseconds */\n pollInterval?: number;\n /** Maximum number of jobs to process before stopping (0 for unlimited) */\n maxJobs?: number;\n /** Whether to start the worker automatically */\n autoStart?: boolean;\n}\n\n/**\n * Statistics for the JobQueueWorker\n */\nexport interface JobQueueWorkerStats {\n /** Number of jobs processed successfully */\n processedJobs: number;\n /** Number of jobs that failed */\n failedJobs: number;\n /** Number of jobs currently being processed */\n activeJobs: number;\n /** Worker uptime in milliseconds */\n uptime: number;\n /** Whether the worker is currently running */\n isRunning: boolean;\n /** Last error encountered */\n lastError?: string;\n}\n\n/**\n * Interface for job queue worker\n */\nexport interface IJobQueueWorker {\n /** Start the worker */\n start(): Promise<void>;\n /** Stop the worker */\n stop(): Promise<void>;\n /** Get worker statistics */\n getStats(): JobQueueWorkerStats;\n /** Check if worker is running */\n isWorkerRunning(): boolean;\n}\n\n/**\n * Interface for batch job manager\n */\nexport interface IBatchJobManager {\n /** Start periodic cleanup of terminal batch metadata. Idempotent. */\n start(intervalMs?: number): void | Promise<void>;\n\n /** Stop periodic cleanup and drain in-flight metadata cleanup. */\n stop(): void | Promise<void>;\n\n /** Register a batch for tracking */\n registerBatch(\n batchId: string,\n jobIds: string[],\n operations: BatchOperation[],\n source: string,\n metadata: JobContext,\n ): void;\n\n /** Enqueue a batch of operations */\n enqueueBatch(\n operations: BatchOperation[],\n options: JobOptions,\n batchId: string,\n source: string,\n ): Promise<string>;\n\n /** Get status of a specific batch */\n getBatchStatus(batchId: string): Promise<BatchJobStatus | null>;\n\n /** Get all active batches */\n getActiveBatches(): Promise<Batch[]>;\n}\n\n/**\n * Unified jobs namespace interface\n * Combines job queue and batch operations for shell/context usage\n */\nexport interface IJobsNamespace {\n // === Job Monitoring ===\n\n /** Get active jobs, optionally filtered by type */\n getActiveJobs(types?: string[]): Promise<JobInfo[]>;\n\n /** Get status of a specific job */\n getStatus(jobId: string): Promise<JobInfo | null>;\n\n // === Batch Operations ===\n\n /** Enqueue multiple operations as a batch */\n enqueueBatch(\n operations: BatchOperation[],\n options: JobOptions,\n batchId: string,\n pluginId: string,\n ): Promise<string>;\n\n /** Get all active batches */\n getActiveBatches(): Promise<Batch[]>;\n\n /** Get status of a specific batch */\n getBatchStatus(batchId: string): Promise<BatchJobStatus | null>;\n}\n",
30
30
  "import type {\n JobOptions,\n IJobQueueService,\n BatchOperation,\n JobHandler,\n JobInfo,\n} from \"./types\";\nimport type { Batch, BatchJobStatus } from \"./batch-schemas\";\nimport { createId } from \"@brains/utils/id\";\nimport type { ToolContext } from \"@brains/mcp-service\";\n\n/**\n * Type for the enqueueJob function created by the helper\n */\nexport interface EnqueueJobRequest {\n /** Job type to enqueue. Service plugin jobs are auto-scoped when unscoped. */\n type: string;\n /** Job payload passed to the registered handler. */\n data: unknown;\n /** Tool routing context, or null/omitted for background jobs. */\n toolContext?: ToolContext | null;\n /** Optional queue behavior, routing metadata, and retry settings. */\n options?: JobOptions;\n}\n\nexport type EnqueueJobFn = (request: EnqueueJobRequest) => Promise<string>;\n\n/**\n * Unified jobs namespace with monitoring and write operations.\n * Used by all plugin contexts and system tools.\n * Scoping (auto-prefix plugin ID) is handled by factory functions, not the type.\n */\nexport interface JobsNamespace {\n // === Monitoring ===\n /** Get active jobs, optionally filtered by type */\n getActiveJobs(types?: string[]): Promise<JobInfo[]>;\n /** Get status of a specific job */\n getStatus(jobId: string): Promise<JobInfo | null>;\n /** Get all active batches */\n getActiveBatches(): Promise<Batch[]>;\n /** Get status of a specific batch */\n getBatchStatus(batchId: string): Promise<BatchJobStatus | null>;\n\n // === Write ===\n /** Enqueue a job for background processing */\n enqueue: EnqueueJobFn;\n /** Enqueue multiple operations as a batch (batchId generated internally) */\n enqueueBatch: (\n operations: BatchOperation[],\n options?: JobOptions,\n ) => Promise<string>;\n /** Register a handler for a job type */\n registerHandler: <T = unknown, R = unknown>(\n type: string,\n handler: JobHandler<string, T, R>,\n ) => void;\n}\n\n/**\n * Creates an enqueueJob function for plugin contexts\n *\n * This shared helper ensures consistent job enqueueing behavior across\n * ServicePluginContext and InterfacePluginContext, including:\n * - Automatic routing context from ToolContext\n * - Plugin ID tracking\n * - Default metadata\n *\n * @param jobQueueService - The job queue service to use\n * @param pluginId - The plugin ID for scoping\n * @param scopeJobType - Whether to auto-scope job types with pluginId (true for service plugins)\n */\nexport function createEnqueueJobFn(\n jobQueueService: IJobQueueService,\n pluginId: string,\n scopeJobType: boolean,\n): EnqueueJobFn {\n return async (request): Promise<string> => {\n const { type, data, toolContext = null, options } = request;\n // Destructure to avoid spreading metadata twice\n const { metadata: optionsMetadata, ...restOptions } = options ?? {};\n\n const jobOptions: JobOptions = {\n source: pluginId,\n // Only set rootJobId if explicitly provided (for batch children)\n // For standalone jobs, let JobQueueService default to the job's own ID\n ...(options?.rootJobId && { rootJobId: options.rootJobId }),\n ...restOptions,\n // Build metadata last to ensure routing context is preserved\n metadata: {\n operationType: \"data_processing\" as const,\n pluginId,\n // Merge routing context from ToolContext when provided\n ...(toolContext && {\n interfaceType: toolContext.interfaceType,\n channelId: toolContext.channelId,\n }),\n ...optionsMetadata,\n },\n };\n\n // Add plugin scope unless already scoped (service plugins) or not scoping (interface plugins)\n const finalType =\n scopeJobType && !type.includes(\":\") ? `${pluginId}:${type}` : type;\n\n return jobQueueService.enqueue({\n type: finalType,\n data,\n options: jobOptions,\n });\n };\n}\n\nexport type EnqueueBatchFn = (\n operations: BatchOperation[],\n options?: JobOptions,\n) => Promise<string>;\n\n/**\n * Creates an enqueueBatch function for plugin contexts.\n *\n * Shared between ServicePluginContext and InterfacePluginContext.\n * Handles operation type scoping, batchId generation, and metadata.\n */\nexport function createEnqueueBatchFn(\n shellJobs: {\n enqueueBatch(\n operations: BatchOperation[],\n options: JobOptions,\n batchId: string,\n pluginId: string,\n ): Promise<string>;\n },\n pluginId: string,\n): EnqueueBatchFn {\n return async (operations, options) => {\n const batchId = createId();\n const scopedOperations = operations.map((op) => ({\n ...op,\n type: op.type.includes(\":\") ? op.type : `${pluginId}:${op.type}`,\n }));\n const jobOptions: JobOptions = {\n ...options,\n source: pluginId,\n rootJobId: batchId,\n metadata: {\n ...options?.metadata,\n operationType: \"batch_processing\" as const,\n pluginId,\n },\n };\n await shellJobs.enqueueBatch(\n scopedOperations,\n jobOptions,\n batchId,\n pluginId,\n );\n return batchId;\n };\n}\n\nexport type RegisterHandlerFn = <T = unknown, R = unknown>(\n type: string,\n handler: JobHandler<string, T, R>,\n) => void;\n\n/**\n * Creates a registerHandler function for plugin contexts.\n *\n * Shared between ServicePluginContext and InterfacePluginContext.\n * Handles automatic type scoping with pluginId.\n */\nexport function createRegisterHandlerFn(\n jobQueueService: IJobQueueService,\n pluginId: string,\n): RegisterHandlerFn {\n return (type, handler) => {\n // If type already contains \":\", treat it as fully qualified (entity-type scoped).\n // Otherwise, auto-scope with pluginId for backward compatibility.\n const scopedType = type.includes(\":\") ? type : `${pluginId}:${type}`;\n jobQueueService.registerHandler(scopedType, handler, pluginId);\n };\n}\n",
31
31
  "import { z } from \"@brains/utils/zod\";\n\n/**\n * Schema for validating Channel objects\n */\nconst channelParserSchema = z.custom<ChannelSchema<unknown>>(\n (value) =>\n typeof value === \"object\" && value !== null && \"safeParse\" in value,\n);\n\nconst channelSchema = z.object({\n name: z.string(),\n schema: channelParserSchema,\n});\n\n/**\n * A typed message channel definition\n *\n * Channels provide type-safe message passing between plugins.\n * When subscribing with a Channel, the payload is automatically\n * validated against the schema and typed.\n *\n * @example\n * ```typescript\n * // Define a channel\n * const EntityCreatedChannel = defineChannel(\n * \"entity:created\",\n * z.object({ entityId: z.string(), entityType: z.string() })\n * );\n *\n * // Subscribe with automatic validation\n * context.messaging.subscribe(EntityCreatedChannel, async (payload) => {\n * // payload is typed as { entityId: string, entityType: string }\n * console.log(`Created: ${payload.entityId}`);\n * return { success: true };\n * });\n *\n * // Send with type checking\n * context.messaging.send({\n * type: EntityCreatedChannel.name,\n * payload: {\n * entityId: \"123\",\n * entityType: \"note\"\n * }\n * });\n * ```\n */\nexport interface ChannelSchema<TPayload> {\n safeParse(\n input: unknown,\n ):\n | { success: true; data: TPayload }\n | { success: false; error: { message: string } };\n}\n\nexport interface Channel<TPayload, TResponse = unknown> {\n /** Channel name/identifier */\n readonly name: string;\n\n /** Schema for validating payloads */\n readonly schema: ChannelSchema<TPayload>;\n\n /** Type marker for response (not used at runtime) */\n readonly _response?: TResponse;\n}\n\n/**\n * Define a typed message channel\n *\n * @param name - Unique channel identifier\n * @param schema - Zod schema for payload validation\n * @returns A typed Channel object\n *\n * @example\n * ```typescript\n * const JobProgressChannel = defineChannel(\n * \"job-progress\",\n * z.object({\n * jobId: z.string(),\n * status: z.enum([\"pending\", \"processing\", \"completed\", \"failed\"]),\n * progress: z.number().optional(),\n * })\n * );\n * ```\n */\nexport function defineChannel<TPayload, TResponse = unknown>(\n name: string,\n schema: ChannelSchema<TPayload>,\n): Channel<TPayload, TResponse> {\n return {\n name,\n schema,\n };\n}\n\n/**\n * Type guard to check if something is a Channel\n */\nexport function isChannel<T, R>(\n value: string | Channel<T, R>,\n): value is Channel<T, R> {\n return channelSchema.safeParse(value).success;\n}\n",
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",
@@ -55,6 +55,6 @@
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
57
  "mappings": "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",
58
- "debugId": "E44F88BB5148ED8064756E2164756E21",
58
+ "debugId": "952A2F9FFF395E5764756E2164756E21",
59
59
  "names": []
60
60
  }
@@ -1,6 +1,6 @@
1
1
  // @bun
2
- import{j as v,k as G}from"./index-c41a2n3h.js";import{ba as D}from"./index-e2c4agdd.js";import{Ea as z}from"./index-bs70092j.js";class H extends D{constructor(){super({entityType:"post",purpose:"A long-form published article, essay, or blog post written for an audience.",schema:G,frontmatterSchema:v,supportsCoverImage:!0})}toMarkdown(j){let q=this.extractBody(j.content);try{let x=this.parseFrontMatter(j.content,v),I={...x,slug:x.slug??j.metadata.slug};return this.buildMarkdown(q,I)}catch{return q}}fromMarkdown(j){let q=this.parseFrontMatter(j,v),x=q.slug??z(q.title);return{content:j,entityType:"post",metadata:{title:q.title,slug:x,status:q.status,publishedAt:q.publishedAt,seriesName:q.seriesName,seriesIndex:q.seriesIndex}}}parsePostFrontmatter(j){return this.parseFrontMatter(j.content,v)}createPostContent(j,q){return this.buildMarkdown(q,j)}buildStub(j){let q={title:j.title,slug:j.id,status:"generating",excerpt:"",author:"AI"};return{content:this.buildMarkdown("",q),metadata:{title:j.title,slug:j.id,status:"generating"}}}}var M=new H;
2
+ import{j as v,k as G}from"./index-53ey0fh9.js";import{ba as D}from"./index-e2c4agdd.js";import{Ea as z}from"./index-bs70092j.js";class H extends D{constructor(){super({entityType:"post",purpose:"A long-form published article, essay, or blog post written for an audience.",schema:G,frontmatterSchema:v,supportsCoverImage:!0})}toMarkdown(j){let q=this.extractBody(j.content);try{let x=this.parseFrontMatter(j.content,v),I={...x,slug:x.slug??j.metadata.slug};return this.buildMarkdown(q,I)}catch{return q}}fromMarkdown(j){let q=this.parseFrontMatter(j,v),x=q.slug??z(q.title);return{content:j,entityType:"post",metadata:{title:q.title,slug:x,status:q.status,publishedAt:q.publishedAt,seriesName:q.seriesName,seriesIndex:q.seriesIndex}}}parsePostFrontmatter(j){return this.parseFrontMatter(j.content,v)}createPostContent(j,q){return this.buildMarkdown(q,j)}buildStub(j){let q={title:j.title,slug:j.id,status:"generating",excerpt:"",author:"AI"};return{content:this.buildMarkdown("",q),metadata:{title:j.title,slug:j.id,status:"generating"}}}}var M=new H;
3
3
  export{H as a,M as b};
4
4
 
5
5
  //# debugId=6FBA410E0FE26B5E64756E2164756E21
6
- //# sourceMappingURL=index-yexw408f.js.map
6
+ //# sourceMappingURL=index-z2sa7222.js.map
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{c as K}from"./index-d5r8p459.js";import{j as J}from"./index-c41a2n3h.js";import"./index-z6qhxkv8.js";import"./index-fjp4jadv.js";import{Y as I}from"./index-e2c4agdd.js";import"./index-3097wt56.js";import"./index-bs70092j.js";import"./index-9s5cwp2s.js";import{Qa as j}from"./index-wvwq0pm7.js";import"./index-gmfgjnnw.js";var V=j.object({siteUrl:j.url(),title:j.string(),description:j.string(),language:j.string().optional(),copyright:j.string().optional()});class Y{logger;id="blog:rss";name="Blog RSS Feed DataSource";description="Generates RSS 2.0 feed XML from published blog posts";constructor(D){this.logger=D,this.logger.debug("RSSDataSource initialized")}async fetch(D,N,O){let v=V.parse(D),E=(await O.entityService.listEntities({entityType:"post",options:{limit:1000}})).filter((A)=>A.metadata.status==="published"&&A.metadata.publishedAt).map((A)=>{let H=I(A.content,J);return{...A,frontmatter:H.metadata,body:H.content}});this.logger.debug(`Generating RSS feed with ${E.length} posts`);let T={title:v.title,description:v.description,link:v.siteUrl,language:v.language??"en-us",...v.copyright&&{copyright:v.copyright}},U={xml:K(E,T)};return N.parse(U)}}export{Y as RSSDataSource};
2
+ import{c as K}from"./index-d5r8p459.js";import{j as J}from"./index-53ey0fh9.js";import"./index-w9z1vrm1.js";import"./index-fjp4jadv.js";import{Y as I}from"./index-e2c4agdd.js";import"./index-3097wt56.js";import"./index-bs70092j.js";import"./index-9s5cwp2s.js";import{Qa as j}from"./index-wvwq0pm7.js";import"./index-gmfgjnnw.js";var V=j.object({siteUrl:j.url(),title:j.string(),description:j.string(),language:j.string().optional(),copyright:j.string().optional()});class Y{logger;id="blog:rss";name="Blog RSS Feed DataSource";description="Generates RSS 2.0 feed XML from published blog posts";constructor(D){this.logger=D,this.logger.debug("RSSDataSource initialized")}async fetch(D,N,O){let v=V.parse(D),E=(await O.entityService.listEntities({entityType:"post",options:{limit:1000}})).filter((A)=>A.metadata.status==="published"&&A.metadata.publishedAt).map((A)=>{let H=I(A.content,J);return{...A,frontmatter:H.metadata,body:H.content}});this.logger.debug(`Generating RSS feed with ${E.length} posts`);let T={title:v.title,description:v.description,link:v.siteUrl,language:v.language??"en-us",...v.copyright&&{copyright:v.copyright}},U={xml:K(E,T)};return N.parse(U)}}export{Y as RSSDataSource};
3
3
 
4
4
  //# debugId=A37060E2D9903BE964756E2164756E21
5
- //# sourceMappingURL=rss-datasource-80k89rww.js.map
5
+ //# sourceMappingURL=rss-datasource-gm50xxrm.js.map
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Pa as r,Qa as o}from"./chunks/index-wvwq0pm7.js";import"./chunks/index-gmfgjnnw.js";function t(i){return i}var e={name:"@rizom/brain",version:"0.2.0-alpha.194",description:"Brain runtime + CLI \u2014 scaffold, run, and manage AI brain instances",keywords:["brain","ai","cli","mcp","agent","personal-ai","knowledge-management"],license:"Apache-2.0",author:"Yeehaa <yeehaa@rizom.ai> (https://rizom.ai)",bin:{brain:"./dist/brain.js"},bugs:"https://github.com/rizom-ai/brains/issues",dependencies:{"@clack/prompts":"^1.5.1","@modelcontextprotocol/sdk":"^1.29.0","@tailwindcss/postcss":"^4.3.1","@tailwindcss/typography":"^0.5.20",postcss:"^8.5.15",preact:"^10.27.2","preact-render-to-string":"^6.7.0",tailwindcss:"^4.3.1",zod:"^4.1.8"},devDependencies:{"@brains/app":"workspace:*","@brains/build-tools":"workspace:*","@brains/content-formatters":"workspace:*","@brains/deploy-support":"workspace:*","@brains/eslint-config":"workspace:*","@brains/mcp-service":"workspace:*","@brains/plugins":"workspace:*","@brains/ranger":"workspace:*","@brains/relay":"workspace:*","@brains/rover":"workspace:*","@brains/site-composition":"workspace:*","@brains/site-default":"workspace:*","@brains/site-personal":"workspace:*","@brains/site-professional":"workspace:*","@brains/theme-rizom":"workspace:*","@brains/typescript-config":"workspace:*","@brains/utils":"workspace:*","@rizom/theme-default":"workspace:*","@types/bun":"^1.3.14",rolldown:"^1.0.0","rolldown-plugin-dts":"^0.27.4",typescript:"^7.0.2"},engines:{bun:">=1.3.3"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./cli":"./dist/brain.js","./plugins":{types:"./dist/plugins.d.ts",import:"./dist/plugins.js"},"./entities":{types:"./dist/entities.d.ts",import:"./dist/entities.js"},"./services":{types:"./dist/services.d.ts",import:"./dist/services.js"},"./interfaces":{types:"./dist/interfaces.d.ts",import:"./dist/interfaces.js"},"./templates":{types:"./dist/templates.d.ts",import:"./dist/templates.js"},"./site":{types:"./dist/site.d.ts",import:"./dist/site.js"},"./themes":{types:"./dist/themes.d.ts",import:"./dist/themes.js"},"./deploy":{types:"./dist/deploy.d.ts",import:"./dist/deploy.js"},"./tsconfig.instance.json":"./tsconfig.instance.json"},files:["dist","templates","tsconfig.instance.json"],homepage:"https://github.com/rizom-ai/brains/tree/main/packages/brain-cli#readme",optionalDependencies:{"@bitwarden/sdk-napi":"^1.0.0","@libsql/client":"^0.17.4","@tailwindcss/oxide":"^4.1.4",lightningcss:"^1.29.2","playwright-core":"^1.61.0","react-devtools-core":"^7.0.1",sharp:"^0.35.1"},publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/rizom-ai/brains.git",directory:"packages/brain-cli"},scripts:{build:"bun scripts/build.ts","dev:start":"bun scripts/build.ts && bun dist/brain.js start",lint:"eslint . --max-warnings 0","lint:fix":"eslint . --max-warnings 0 --fix",prepublishOnly:"bun scripts/build.ts",test:"bun test",typecheck:"tsc --noEmit"},type:"module"};var n=e.version;export{o as z,t as defineBrain,r as ZodError,n as PLUGIN_API_VERSION};
2
+ import{Pa as r,Qa as o}from"./chunks/index-wvwq0pm7.js";import"./chunks/index-gmfgjnnw.js";function t(i){return i}var e={name:"@rizom/brain",version:"0.2.0-alpha.196",description:"Brain runtime + CLI \u2014 scaffold, run, and manage AI brain instances",keywords:["brain","ai","cli","mcp","agent","personal-ai","knowledge-management"],license:"Apache-2.0",author:"Yeehaa <yeehaa@rizom.ai> (https://rizom.ai)",bin:{brain:"./dist/brain.js"},bugs:"https://github.com/rizom-ai/brains/issues",dependencies:{"@clack/prompts":"^1.5.1","@modelcontextprotocol/sdk":"^1.29.0","@tailwindcss/postcss":"^4.3.1","@tailwindcss/typography":"^0.5.20",postcss:"^8.5.15",preact:"^10.27.2","preact-render-to-string":"^6.7.0",tailwindcss:"^4.3.1",zod:"^4.1.8"},devDependencies:{"@brains/app":"workspace:*","@brains/build-tools":"workspace:*","@brains/content-formatters":"workspace:*","@brains/deploy-support":"workspace:*","@brains/eslint-config":"workspace:*","@brains/mcp-service":"workspace:*","@brains/plugins":"workspace:*","@brains/ranger":"workspace:*","@brains/relay":"workspace:*","@brains/rover":"workspace:*","@brains/site-composition":"workspace:*","@brains/site-default":"workspace:*","@brains/site-personal":"workspace:*","@brains/site-professional":"workspace:*","@brains/theme-rizom":"workspace:*","@brains/typescript-config":"workspace:*","@brains/utils":"workspace:*","@rizom/theme-default":"workspace:*","@types/bun":"^1.3.14",rolldown:"^1.0.0","rolldown-plugin-dts":"^0.27.4",typescript:"^7.0.2"},engines:{bun:">=1.3.3"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./cli":"./dist/brain.js","./plugins":{types:"./dist/plugins.d.ts",import:"./dist/plugins.js"},"./entities":{types:"./dist/entities.d.ts",import:"./dist/entities.js"},"./services":{types:"./dist/services.d.ts",import:"./dist/services.js"},"./interfaces":{types:"./dist/interfaces.d.ts",import:"./dist/interfaces.js"},"./templates":{types:"./dist/templates.d.ts",import:"./dist/templates.js"},"./site":{types:"./dist/site.d.ts",import:"./dist/site.js"},"./themes":{types:"./dist/themes.d.ts",import:"./dist/themes.js"},"./deploy":{types:"./dist/deploy.d.ts",import:"./dist/deploy.js"},"./tsconfig.instance.json":"./tsconfig.instance.json"},files:["dist","templates","tsconfig.instance.json"],homepage:"https://github.com/rizom-ai/brains/tree/main/packages/brain-cli#readme",optionalDependencies:{"@bitwarden/sdk-napi":"^1.0.0","@libsql/client":"^0.17.4","@tailwindcss/oxide":"^4.1.4",lightningcss:"^1.29.2","playwright-core":"^1.61.0","react-devtools-core":"^7.0.1",sharp:"^0.35.1"},publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/rizom-ai/brains.git",directory:"packages/brain-cli"},scripts:{build:"bun scripts/build.ts","dev:start":"bun scripts/build.ts && bun dist/brain.js start",lint:"eslint . --max-warnings 0","lint:fix":"eslint . --max-warnings 0 --fix",prepublishOnly:"bun scripts/build.ts",test:"bun test",typecheck:"tsc --noEmit"},type:"module"};var n=e.version;export{o as z,t as defineBrain,r as ZodError,n as PLUGIN_API_VERSION};
3
3
 
4
- //# debugId=8B0D78761EA7D17964756E2164756E21
4
+ //# debugId=88299C1265EB486D64756E2164756E21
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -6,6 +6,6 @@
6
6
  "import packageJson from \"../package.json\" with { type: \"json\" };\n\n/**\n * Pre-v1 external plugin API marker.\n *\n * During alpha, the external plugin API compatibility marker tracks the\n * published @rizom/brain package version. Once the plugin API is declared\n * stable, this can move to an independent semver contract such as 1.0.0.\n */\nexport const PLUGIN_API_VERSION: string = packageJson.version;\n"
7
7
  ],
8
8
  "mappings": ";0FA0EO,UAAS,CAAW,CAAC,EAA8C,CACxE,OAAO,6yFClEF,IAAM,EAA6B,EAAY",
9
- "debugId": "8B0D78761EA7D17964756E2164756E21",
9
+ "debugId": "88299C1265EB486D64756E2164756E21",
10
10
  "names": []
11
11
  }
package/dist/plugins.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{p as N,q as A,r as D,s as U,u as c,v as l,w as y,x as P,y as B,z as O}from"./chunks/index-z6qhxkv8.js";import"./chunks/index-e2c4agdd.js";import{Aa as w,Ba as _,Ca as H,na as E,qa as b,ra as k}from"./chunks/index-3097wt56.js";import"./chunks/index-bs70092j.js";import"./chunks/index-9s5cwp2s.js";import{Qa as o}from"./chunks/index-wvwq0pm7.js";import"./chunks/index-gmfgjnnw.js";function v(e){return e}function R(e){return e}function C(e){return e===void 0?{success:!0}:{success:!0,data:e}}function S(e){return{success:!1,error:e}}var x=o.object({captureUrls:o.boolean().default(!1),blockedUrlDomains:o.array(o.string()).default(["meet.google.com","zoom.us","teams.microsoft.com","whereby.com","gather.town","calendly.com","cal.com","discord.com","discord.gg","cdn.discordapp.com","media.discordapp.net","giphy.com","tenor.com","wetransfer.com","file.io"])});function I(e,t){return{name:e,schema:t}}class p extends c{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}get entityType(){return this.hooks.getEntityType()}get schema(){return this.hooks.getSchema()}get adapter(){return this.hooks.getAdapter()}onRegister(e){return this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getEntityTypeConfig(){return this.hooks.getEntityTypeConfig()}getDataSources(){return this.hooks.getDataSources()}getInstructions(){return this.hooks.getInstructions()}interceptCreate(e,t,i){return this.hooks.interceptCreate(e,t,i)}}class u{type="entity";id;version;packageName;description;delegate;constructor(e,t,i,r){if(this.id=e,this.version=t.version,this.packageName=t.name,t.description!==void 0)this.description=t.description;this.delegate=new p(e,t,i,r,{getEntityType:()=>this.entityType,getSchema:()=>this.schema,getAdapter:()=>this.adapter,onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getEntityTypeConfig:()=>this.getEntityTypeConfig(),getDataSources:()=>this.getDataSources(),getInstructions:()=>this.getInstructions(),interceptCreate:(n,a,T)=>this.interceptCreate(n,a,T)})}register(e,t){return this.delegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getInstructions(){return}getEntityTypeConfig(){return}getDataSources(){return[]}async interceptCreate(e,t,i){return{kind:"continue",input:e}}ready(){return this.delegate.ready()}shutdown(){return this.delegate.shutdown?.()??Promise.resolve()}}class m extends l{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}onRegister(e){return this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getTools(){return this.hooks.getTools()}getResources(){return this.hooks.getResources()}getInstructions(){return this.hooks.getInstructions()}getWebRoutes(){return this.hooks.getWebRoutes()}requiresDaemonStartup(){return this.hooks.requiresDaemonStartup()}}class s{type="interface";id;version;packageName;description;delegate;constructor(e,t,i,r){if(this.id=e,this.version=t.version,this.packageName=t.name,t.description!==void 0)this.description=t.description;this.delegate=new m(e,t,i,r,{onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getTools:()=>this.getTools(),getResources:()=>this.getResources(),getInstructions:()=>this.getInstructions(),getWebRoutes:()=>this.getWebRoutes(),requiresDaemonStartup:()=>this.requiresDaemonStartup()})}register(e,t){return this.delegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getTools(){return[]}async getResources(){return[]}async getInstructions(){return}getWebRoutes(){return[]}requiresDaemonStartup(){return!1}ready(){return this.delegate.ready()}shutdown(){return this.delegate.shutdown?.()??Promise.resolve()}}class f extends y{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}async onRegister(e){await super.onRegister(e),await this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getTools(){return this.hooks.getTools()}getResources(){return this.hooks.getResources()}getInstructions(){return this.hooks.getInstructions()}getWebRoutes(){return this.hooks.getWebRoutes()}requiresDaemonStartup(){return this.hooks.requiresDaemonStartup()}sendMessageToChannel(e){this.hooks.sendMessageToChannel(e)}sendMessageWithId(e){return this.hooks.sendMessageWithId(e)}editMessage(e){return this.hooks.editMessage(e)}supportsMessageEditing(){return this.hooks.supportsMessageEditing()}onProgressUpdate(e){return this.hooks.onProgressUpdate(e)}trackAgentResponseForJobPublic(e,t,i){this.trackAgentResponseForJob(e,t,i)}captureUrlViaAgentPublic(e,t,i,r,n){return this.captureUrlViaAgent(e,t,i,r,n)}getCurrentChannelIdPublic(){return this.getCurrentChannelId()}}class d extends s{messageDelegate;constructor(e,t,i,r){super(e,t,i,r);this.messageDelegate=new f(e,t,i,r,{onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getTools:()=>this.getTools(),getResources:()=>this.getResources(),getInstructions:()=>this.getInstructions(),getWebRoutes:()=>this.getWebRoutes(),requiresDaemonStartup:()=>this.requiresDaemonStartup(),sendMessageToChannel:(n)=>this.sendMessageToChannel(n),sendMessageWithId:(n)=>this.sendMessageWithId(n),editMessage:(n)=>this.editMessage(n),supportsMessageEditing:()=>this.supportsMessageEditing(),onProgressUpdate:(n)=>this.onProgressUpdate(n)})}register(e,t){return this.messageDelegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getTools(){return[]}async getResources(){return[]}async getInstructions(){return}sendMessageWithId(e){return Promise.resolve(void 0)}editMessage(e){return Promise.resolve(!1)}supportsMessageEditing(){return!1}async onProgressUpdate(e){}isUploadableTextFile(e,t){let i=[".md",".txt",".markdown"];if(t&&["text/plain","text/markdown","text/x-markdown"].some((n)=>t.startsWith(n)))return!0;return i.some((n)=>e.toLowerCase().endsWith(n))}isFileSizeAllowed(e){return e<=1e5}formatFileUploadMessage(e,t){return`User uploaded a file "${e}":
2
+ import{p as N,q as A,r as D,s as U,u as c,v as l,w as y,x as P,y as B,z as O}from"./chunks/index-w9z1vrm1.js";import"./chunks/index-e2c4agdd.js";import{Aa as w,Ba as _,Ca as H,na as E,qa as b,ra as k}from"./chunks/index-3097wt56.js";import"./chunks/index-bs70092j.js";import"./chunks/index-9s5cwp2s.js";import{Qa as o}from"./chunks/index-wvwq0pm7.js";import"./chunks/index-gmfgjnnw.js";function v(e){return e}function R(e){return e}function C(e){return e===void 0?{success:!0}:{success:!0,data:e}}function S(e){return{success:!1,error:e}}var x=o.object({captureUrls:o.boolean().default(!1),blockedUrlDomains:o.array(o.string()).default(["meet.google.com","zoom.us","teams.microsoft.com","whereby.com","gather.town","calendly.com","cal.com","discord.com","discord.gg","cdn.discordapp.com","media.discordapp.net","giphy.com","tenor.com","wetransfer.com","file.io"])});function I(e,t){return{name:e,schema:t}}class p extends c{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}get entityType(){return this.hooks.getEntityType()}get schema(){return this.hooks.getSchema()}get adapter(){return this.hooks.getAdapter()}onRegister(e){return this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getEntityTypeConfig(){return this.hooks.getEntityTypeConfig()}getDataSources(){return this.hooks.getDataSources()}getInstructions(){return this.hooks.getInstructions()}interceptCreate(e,t,i){return this.hooks.interceptCreate(e,t,i)}}class u{type="entity";id;version;packageName;description;delegate;constructor(e,t,i,r){if(this.id=e,this.version=t.version,this.packageName=t.name,t.description!==void 0)this.description=t.description;this.delegate=new p(e,t,i,r,{getEntityType:()=>this.entityType,getSchema:()=>this.schema,getAdapter:()=>this.adapter,onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getEntityTypeConfig:()=>this.getEntityTypeConfig(),getDataSources:()=>this.getDataSources(),getInstructions:()=>this.getInstructions(),interceptCreate:(n,a,T)=>this.interceptCreate(n,a,T)})}register(e,t){return this.delegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getInstructions(){return}getEntityTypeConfig(){return}getDataSources(){return[]}async interceptCreate(e,t,i){return{kind:"continue",input:e}}ready(){return this.delegate.ready()}shutdown(){return this.delegate.shutdown?.()??Promise.resolve()}}class m extends l{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}onRegister(e){return this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getTools(){return this.hooks.getTools()}getResources(){return this.hooks.getResources()}getInstructions(){return this.hooks.getInstructions()}getWebRoutes(){return this.hooks.getWebRoutes()}requiresDaemonStartup(){return this.hooks.requiresDaemonStartup()}}class s{type="interface";id;version;packageName;description;delegate;constructor(e,t,i,r){if(this.id=e,this.version=t.version,this.packageName=t.name,t.description!==void 0)this.description=t.description;this.delegate=new m(e,t,i,r,{onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getTools:()=>this.getTools(),getResources:()=>this.getResources(),getInstructions:()=>this.getInstructions(),getWebRoutes:()=>this.getWebRoutes(),requiresDaemonStartup:()=>this.requiresDaemonStartup()})}register(e,t){return this.delegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getTools(){return[]}async getResources(){return[]}async getInstructions(){return}getWebRoutes(){return[]}requiresDaemonStartup(){return!1}ready(){return this.delegate.ready()}shutdown(){return this.delegate.shutdown?.()??Promise.resolve()}}class f extends y{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}async onRegister(e){await super.onRegister(e),await this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getTools(){return this.hooks.getTools()}getResources(){return this.hooks.getResources()}getInstructions(){return this.hooks.getInstructions()}getWebRoutes(){return this.hooks.getWebRoutes()}requiresDaemonStartup(){return this.hooks.requiresDaemonStartup()}sendMessageToChannel(e){this.hooks.sendMessageToChannel(e)}sendMessageWithId(e){return this.hooks.sendMessageWithId(e)}editMessage(e){return this.hooks.editMessage(e)}supportsMessageEditing(){return this.hooks.supportsMessageEditing()}onProgressUpdate(e){return this.hooks.onProgressUpdate(e)}trackAgentResponseForJobPublic(e,t,i){this.trackAgentResponseForJob(e,t,i)}captureUrlViaAgentPublic(e,t,i,r,n){return this.captureUrlViaAgent(e,t,i,r,n)}getCurrentChannelIdPublic(){return this.getCurrentChannelId()}}class d extends s{messageDelegate;constructor(e,t,i,r){super(e,t,i,r);this.messageDelegate=new f(e,t,i,r,{onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getTools:()=>this.getTools(),getResources:()=>this.getResources(),getInstructions:()=>this.getInstructions(),getWebRoutes:()=>this.getWebRoutes(),requiresDaemonStartup:()=>this.requiresDaemonStartup(),sendMessageToChannel:(n)=>this.sendMessageToChannel(n),sendMessageWithId:(n)=>this.sendMessageWithId(n),editMessage:(n)=>this.editMessage(n),supportsMessageEditing:()=>this.supportsMessageEditing(),onProgressUpdate:(n)=>this.onProgressUpdate(n)})}register(e,t){return this.messageDelegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getTools(){return[]}async getResources(){return[]}async getInstructions(){return}sendMessageWithId(e){return Promise.resolve(void 0)}editMessage(e){return Promise.resolve(!1)}supportsMessageEditing(){return!1}async onProgressUpdate(e){}isUploadableTextFile(e,t){let i=[".md",".txt",".markdown"];if(t&&["text/plain","text/markdown","text/x-markdown"].some((n)=>t.startsWith(n)))return!0;return i.some((n)=>e.toLowerCase().endsWith(n))}isFileSizeAllowed(e){return e<=1e5}formatFileUploadMessage(e,t){return`User uploaded a file "${e}":
3
3
 
4
4
  ${t}`}extractCaptureableUrls(e,t){let i=e.match(/https?:\/\/[^\s<>"{}|\\^`[\]]+?(?=[,;:\s]|$)/gi)??[];return[...new Set(i)].filter((r)=>{try{let{hostname:n}=new URL(r);return!t.some((a)=>n===a||n.endsWith(`.${a}`))}catch{return!1}})}captureUrlViaAgent(e,t,i,r,n){return this.messageDelegate.captureUrlViaAgentPublic(e,t,i,r,n)}trackAgentResponseForJob(e,t,i){this.messageDelegate.trackAgentResponseForJobPublic(e,t,i)}registerProgressCallback(e){this.messageDelegate.registerProgressCallback(e)}unregisterProgressCallback(){this.messageDelegate.unregisterProgressCallback()}getProgressEvents(){return this.messageDelegate.getProgressEvents()}getActiveProgressEvents(){return this.messageDelegate.getActiveProgressEvents()}startProcessingInput(e=null){this.messageDelegate.startProcessingInput(e)}endProcessingInput(){this.messageDelegate.endProcessingInput()}getCurrentChannelId(){return this.messageDelegate.getCurrentChannelIdPublic()}ready(){return this.messageDelegate.ready()}shutdown(){return this.messageDelegate.shutdown?.()??Promise.resolve()}}class h extends P{hooks;constructor(e,t,i,r,n){super(e,t,i,r);this.hooks=n}onRegister(e){return this.hooks.onRegister(e)}onReady(e){return this.hooks.onReady(e)}onShutdown(){return this.hooks.onShutdown()}getTools(){return this.hooks.getTools()}getResources(){return this.hooks.getResources()}getInstructions(){return this.hooks.getInstructions()}}class g{type="service";id;version;packageName;description;delegate;constructor(e,t,i,r){if(this.id=e,this.version=t.version,this.packageName=t.name,t.description!==void 0)this.description=t.description;this.delegate=new h(e,t,i,r,{onRegister:(n)=>this.onRegister(n),onReady:(n)=>this.onReady(n),onShutdown:()=>this.onShutdown(),getTools:()=>this.getTools(),getResources:()=>this.getResources(),getInstructions:()=>this.getInstructions()})}register(e,t){return this.delegate.register(e,t)}async onRegister(e){}async onReady(e){}async onShutdown(){}async getTools(){return[]}async getResources(){return[]}async getInstructions(){return}ready(){return this.delegate.ready()}shutdown(){return this.delegate.shutdown?.()??Promise.resolve()}}export{x as urlCaptureConfigSchema,C as toolSuccess,S as toolError,I as defineChannel,v as createTool,R as createResource,b as ToolResultDataSchema,g as ServicePlugin,E as PendingConfirmationSchema,A as MessageSchema,_ as MessageResponseSchema,d as MessageInterfacePlugin,s as InterfacePlugin,w as ExtensionMetadataSchema,u as EntityPlugin,N as ConversationSchema,B as ChatContextSchema,D as BrainCharacterSchema,H as BaseMessageSchema,O as AppInfoSchema,U as AnchorProfileSchema,k as AgentResponseSchema};
5
5