alepha 0.13.8 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/api/audits/index.d.ts +418 -338
  2. package/dist/api/audits/index.d.ts.map +1 -0
  3. package/dist/api/files/index.d.ts +81 -1
  4. package/dist/api/files/index.d.ts.map +1 -0
  5. package/dist/api/jobs/index.d.ts +107 -27
  6. package/dist/api/jobs/index.d.ts.map +1 -0
  7. package/dist/api/notifications/index.d.ts +21 -1
  8. package/dist/api/notifications/index.d.ts.map +1 -0
  9. package/dist/api/parameters/index.d.ts +455 -8
  10. package/dist/api/parameters/index.d.ts.map +1 -0
  11. package/dist/api/users/index.d.ts +844 -840
  12. package/dist/api/users/index.d.ts.map +1 -0
  13. package/dist/api/verifications/index.d.ts.map +1 -0
  14. package/dist/batch/index.d.ts.map +1 -0
  15. package/dist/bucket/index.d.ts.map +1 -0
  16. package/dist/cache/core/index.d.ts.map +1 -0
  17. package/dist/cache/redis/index.d.ts.map +1 -0
  18. package/dist/cli/index.d.ts +254 -59
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +499 -127
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/command/index.d.ts +217 -10
  23. package/dist/command/index.d.ts.map +1 -0
  24. package/dist/command/index.js +350 -74
  25. package/dist/command/index.js.map +1 -1
  26. package/dist/core/index.browser.js +1334 -1318
  27. package/dist/core/index.browser.js.map +1 -1
  28. package/dist/core/index.d.ts +76 -72
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +1337 -1321
  31. package/dist/core/index.js.map +1 -1
  32. package/dist/core/index.native.js +1337 -1321
  33. package/dist/core/index.native.js.map +1 -1
  34. package/dist/datetime/index.d.ts.map +1 -0
  35. package/dist/email/index.d.ts.map +1 -0
  36. package/dist/fake/index.d.ts.map +1 -0
  37. package/dist/file/index.d.ts.map +1 -0
  38. package/dist/file/index.js.map +1 -1
  39. package/dist/lock/core/index.d.ts.map +1 -0
  40. package/dist/lock/redis/index.d.ts.map +1 -0
  41. package/dist/logger/index.d.ts +1 -0
  42. package/dist/logger/index.d.ts.map +1 -0
  43. package/dist/mcp/index.d.ts +820 -0
  44. package/dist/mcp/index.d.ts.map +1 -0
  45. package/dist/mcp/index.js +978 -0
  46. package/dist/mcp/index.js.map +1 -0
  47. package/dist/orm/index.d.ts +234 -107
  48. package/dist/orm/index.d.ts.map +1 -0
  49. package/dist/orm/index.js +376 -316
  50. package/dist/orm/index.js.map +1 -1
  51. package/dist/queue/core/index.d.ts +4 -4
  52. package/dist/queue/core/index.d.ts.map +1 -0
  53. package/dist/queue/redis/index.d.ts.map +1 -0
  54. package/dist/queue/redis/index.js +2 -4
  55. package/dist/queue/redis/index.js.map +1 -1
  56. package/dist/redis/index.d.ts +400 -29
  57. package/dist/redis/index.d.ts.map +1 -0
  58. package/dist/redis/index.js +412 -21
  59. package/dist/redis/index.js.map +1 -1
  60. package/dist/retry/index.d.ts.map +1 -0
  61. package/dist/router/index.d.ts.map +1 -0
  62. package/dist/scheduler/index.d.ts +6 -6
  63. package/dist/scheduler/index.d.ts.map +1 -0
  64. package/dist/security/index.d.ts +28 -28
  65. package/dist/security/index.d.ts.map +1 -0
  66. package/dist/server/auth/index.d.ts +155 -155
  67. package/dist/server/auth/index.d.ts.map +1 -0
  68. package/dist/server/cache/index.d.ts.map +1 -0
  69. package/dist/server/compress/index.d.ts.map +1 -0
  70. package/dist/server/cookies/index.d.ts.map +1 -0
  71. package/dist/server/core/index.d.ts +0 -1
  72. package/dist/server/core/index.d.ts.map +1 -0
  73. package/dist/server/core/index.js.map +1 -1
  74. package/dist/server/cors/index.d.ts.map +1 -0
  75. package/dist/server/health/index.d.ts +17 -17
  76. package/dist/server/health/index.d.ts.map +1 -0
  77. package/dist/server/helmet/index.d.ts +4 -1
  78. package/dist/server/helmet/index.d.ts.map +1 -0
  79. package/dist/server/links/index.d.ts +33 -33
  80. package/dist/server/links/index.d.ts.map +1 -0
  81. package/dist/server/metrics/index.d.ts.map +1 -0
  82. package/dist/server/multipart/index.d.ts.map +1 -0
  83. package/dist/server/multipart/index.js.map +1 -1
  84. package/dist/server/proxy/index.d.ts.map +1 -0
  85. package/dist/server/proxy/index.js.map +1 -1
  86. package/dist/server/rate-limit/index.d.ts.map +1 -0
  87. package/dist/server/security/index.d.ts +9 -9
  88. package/dist/server/security/index.d.ts.map +1 -0
  89. package/dist/server/static/index.d.ts.map +1 -0
  90. package/dist/server/swagger/index.d.ts.map +1 -0
  91. package/dist/sms/index.d.ts.map +1 -0
  92. package/dist/thread/index.d.ts.map +1 -0
  93. package/dist/topic/core/index.d.ts.map +1 -0
  94. package/dist/topic/redis/index.d.ts.map +1 -0
  95. package/dist/topic/redis/index.js +3 -3
  96. package/dist/topic/redis/index.js.map +1 -1
  97. package/dist/vite/index.d.ts +10 -2
  98. package/dist/vite/index.d.ts.map +1 -0
  99. package/dist/vite/index.js +45 -20
  100. package/dist/vite/index.js.map +1 -1
  101. package/dist/websocket/index.d.ts.map +1 -0
  102. package/package.json +9 -4
  103. package/src/cli/apps/AlephaCli.ts +10 -3
  104. package/src/cli/apps/AlephaPackageBuilderCli.ts +15 -8
  105. package/src/cli/assets/mainTs.ts +9 -10
  106. package/src/cli/atoms/changelogOptions.ts +45 -0
  107. package/src/cli/commands/ChangelogCommands.ts +259 -0
  108. package/src/cli/commands/DeployCommands.ts +118 -0
  109. package/src/cli/commands/DrizzleCommands.ts +230 -10
  110. package/src/cli/commands/ViteCommands.ts +47 -23
  111. package/src/cli/defineConfig.ts +15 -0
  112. package/src/cli/index.ts +3 -0
  113. package/src/cli/services/AlephaCliUtils.ts +10 -154
  114. package/src/cli/services/GitMessageParser.ts +77 -0
  115. package/src/command/helpers/EnvUtils.ts +37 -0
  116. package/src/command/index.ts +3 -1
  117. package/src/command/primitives/$command.ts +172 -6
  118. package/src/command/providers/CliProvider.ts +499 -95
  119. package/src/core/Alepha.ts +1 -1
  120. package/src/core/providers/SchemaValidator.ts +23 -1
  121. package/src/file/providers/NodeFileSystemProvider.ts +3 -1
  122. package/src/mcp/errors/McpError.ts +72 -0
  123. package/src/mcp/helpers/jsonrpc.ts +163 -0
  124. package/src/mcp/index.ts +132 -0
  125. package/src/mcp/interfaces/McpTypes.ts +248 -0
  126. package/src/mcp/primitives/$prompt.ts +188 -0
  127. package/src/mcp/primitives/$resource.ts +171 -0
  128. package/src/mcp/primitives/$tool.ts +285 -0
  129. package/src/mcp/providers/McpServerProvider.ts +382 -0
  130. package/src/mcp/transports/SseMcpTransport.ts +172 -0
  131. package/src/mcp/transports/StdioMcpTransport.ts +126 -0
  132. package/src/orm/index.ts +20 -4
  133. package/src/orm/interfaces/PgQueryWhere.ts +1 -26
  134. package/src/orm/providers/drivers/BunPostgresProvider.ts +225 -0
  135. package/src/orm/providers/drivers/BunSqliteProvider.ts +180 -0
  136. package/src/orm/providers/drivers/CloudflareD1Provider.ts +164 -0
  137. package/src/orm/providers/drivers/DatabaseProvider.ts +25 -0
  138. package/src/orm/providers/drivers/NodePostgresProvider.ts +0 -25
  139. package/src/orm/providers/drivers/NodeSqliteProvider.ts +3 -1
  140. package/src/orm/services/QueryManager.ts +10 -125
  141. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -7
  142. package/src/redis/index.ts +65 -3
  143. package/src/redis/providers/BunRedisProvider.ts +304 -0
  144. package/src/redis/providers/BunRedisSubscriberProvider.ts +94 -0
  145. package/src/redis/providers/NodeRedisProvider.ts +280 -0
  146. package/src/redis/providers/NodeRedisSubscriberProvider.ts +94 -0
  147. package/src/redis/providers/RedisProvider.ts +134 -140
  148. package/src/redis/providers/RedisSubscriberProvider.ts +58 -49
  149. package/src/server/core/providers/BunHttpServerProvider.ts +0 -3
  150. package/src/server/core/providers/ServerBodyParserProvider.ts +3 -1
  151. package/src/server/core/providers/ServerProvider.ts +7 -4
  152. package/src/server/multipart/providers/ServerMultipartProvider.ts +3 -1
  153. package/src/server/proxy/providers/ServerProxyProvider.ts +1 -1
  154. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  155. package/src/vite/plugins/viteAlephaBuild.ts +8 -2
  156. package/src/vite/plugins/viteAlephaDev.ts +6 -2
  157. package/src/vite/tasks/buildServer.ts +2 -1
  158. package/src/vite/tasks/generateCloudflare.ts +43 -15
  159. package/src/vite/tasks/runAlepha.ts +1 -0
  160. package/src/orm/services/PgJsonQueryManager.ts +0 -511
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["parsed: unknown","t","resourceContent: McpResourceContent","mcpMessages: McpPromptMessage[]","args: McpPromptArgument[]","validatedParams: any","properties: Record<string, unknown>","required: string[]","result: Record<string, unknown>","context: McpContext"],"sources":["../../src/mcp/helpers/jsonrpc.ts","../../src/mcp/errors/McpError.ts","../../src/mcp/providers/McpServerProvider.ts","../../src/mcp/primitives/$prompt.ts","../../src/mcp/primitives/$resource.ts","../../src/mcp/primitives/$tool.ts","../../src/mcp/transports/SseMcpTransport.ts","../../src/mcp/transports/StdioMcpTransport.ts","../../src/mcp/index.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type {\n JsonRpcError,\n JsonRpcNotification,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"../interfaces/McpTypes.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const JSONRPC_VERSION = \"2.0\" as const;\n\nexport const MCP_PROTOCOL_VERSION = \"2024-11-05\" as const;\n\nexport const JsonRpcErrorCodes = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Response Builders\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function createResponse(\n id: string | number,\n result: unknown,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n result,\n };\n}\n\nexport function createErrorResponse(\n id: string | number,\n error: JsonRpcError,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n error,\n };\n}\n\nexport function createNotification(\n method: string,\n params?: Record<string, unknown>,\n): JsonRpcNotification {\n return {\n jsonrpc: JSONRPC_VERSION,\n method,\n params,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Error Builders\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function createParseError(message = \"Parse error\"): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.PARSE_ERROR,\n message,\n };\n}\n\nexport function createInvalidRequestError(\n message = \"Invalid request\",\n): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INVALID_REQUEST,\n message,\n };\n}\n\nexport function createMethodNotFoundError(method: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.METHOD_NOT_FOUND,\n message: `Method not found: ${method}`,\n };\n}\n\nexport function createInvalidParamsError(message: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INVALID_PARAMS,\n message,\n };\n}\n\nexport function createInternalError(message: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INTERNAL_ERROR,\n message,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Message Parsing\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function parseMessage(data: string): JsonRpcRequest {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new JsonRpcParseError(\"Invalid JSON\");\n }\n\n if (!isValidJsonRpcRequest(parsed)) {\n throw new JsonRpcParseError(\"Invalid JSON-RPC request\");\n }\n\n return parsed;\n}\n\nexport function isValidJsonRpcRequest(value: unknown): value is JsonRpcRequest {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (obj.jsonrpc !== JSONRPC_VERSION) {\n return false;\n }\n\n if (typeof obj.method !== \"string\") {\n return false;\n }\n\n if (\n obj.id !== undefined &&\n typeof obj.id !== \"string\" &&\n typeof obj.id !== \"number\"\n ) {\n return false;\n }\n\n if (obj.params !== undefined && typeof obj.params !== \"object\") {\n return false;\n }\n\n return true;\n}\n\nexport function isNotification(request: JsonRpcRequest): boolean {\n return request.id === undefined;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class JsonRpcParseError extends AlephaError {\n name = \"JsonRpcParseError\";\n}\n","import { JsonRpcErrorCodes } from \"../helpers/jsonrpc.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpError extends Error {\n name = \"McpError\";\n code: number;\n\n constructor(\n message: string,\n code: number = JsonRpcErrorCodes.INTERNAL_ERROR,\n ) {\n super(message);\n this.code = code;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpMethodNotFoundError extends McpError {\n name = \"McpMethodNotFoundError\";\n\n constructor(method: string) {\n super(`Method not found: ${method}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpToolNotFoundError extends McpError {\n name = \"McpToolNotFoundError\";\n tool: string;\n\n constructor(tool: string) {\n super(`Tool not found: ${tool}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.tool = tool;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpResourceNotFoundError extends McpError {\n name = \"McpResourceNotFoundError\";\n uri: string;\n\n constructor(uri: string) {\n super(`Resource not found: ${uri}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.uri = uri;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpPromptNotFoundError extends McpError {\n name = \"McpPromptNotFoundError\";\n prompt: string;\n\n constructor(prompt: string) {\n super(`Prompt not found: ${prompt}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.prompt = prompt;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpInvalidParamsError extends McpError {\n name = \"McpInvalidParamsError\";\n\n constructor(message: string) {\n super(message, JsonRpcErrorCodes.INVALID_PARAMS);\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n McpError,\n McpMethodNotFoundError,\n McpPromptNotFoundError,\n McpResourceNotFoundError,\n McpToolNotFoundError,\n} from \"../errors/McpError.ts\";\nimport {\n createErrorResponse,\n createInternalError,\n createResponse,\n MCP_PROTOCOL_VERSION,\n} from \"../helpers/jsonrpc.ts\";\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpCapabilities,\n McpContent,\n McpContext,\n McpInitializeResult,\n McpPromptDescriptor,\n McpPromptGetResult,\n McpPromptMessage,\n McpResourceContent,\n McpResourceDescriptor,\n McpResourceReadResult,\n McpServerInfo,\n McpToolCallResult,\n McpToolDescriptor,\n} from \"../interfaces/McpTypes.ts\";\nimport type { PromptPrimitive } from \"../primitives/$prompt.ts\";\nimport type { ResourcePrimitive } from \"../primitives/$resource.ts\";\nimport type { ToolPrimitive } from \"../primitives/$tool.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Core MCP server provider that handles protocol messages.\n *\n * This provider maintains registries of tools, resources, and prompts,\n * and routes incoming JSON-RPC requests to the appropriate handlers.\n *\n * It is transport-agnostic - actual communication is handled by\n * transport providers like StdioMcpTransport or SseMcpTransport.\n */\nexport class McpServerProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n protected readonly tools = new Map<string, ToolPrimitive<any>>();\n protected readonly resources = new Map<string, ResourcePrimitive>();\n protected readonly prompts = new Map<string, PromptPrimitive<any>>();\n\n protected initialized = false;\n\n protected serverInfo: McpServerInfo = {\n name: \"alepha-mcp\",\n version: \"1.0.0\",\n };\n\n // -----------------------------------------------------------------------------------------------------------------\n // Registration Methods\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Register a tool with the MCP server.\n */\n public registerTool(tool: ToolPrimitive<any>): void {\n this.log.trace(`Registering MCP tool: ${tool.name}`);\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Register a resource with the MCP server.\n */\n public registerResource(resource: ResourcePrimitive): void {\n this.log.trace(`Registering MCP resource: ${resource.uri}`);\n this.resources.set(resource.uri, resource);\n }\n\n /**\n * Register a prompt with the MCP server.\n */\n public registerPrompt(prompt: PromptPrimitive<any>): void {\n this.log.trace(`Registering MCP prompt: ${prompt.name}`);\n this.prompts.set(prompt.name, prompt);\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Getters\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Get the server capabilities based on registered primitives.\n */\n public getCapabilities(): McpCapabilities {\n return {\n tools: this.tools.size > 0 ? {} : undefined,\n resources: this.resources.size > 0 ? {} : undefined,\n prompts: this.prompts.size > 0 ? {} : undefined,\n };\n }\n\n /**\n * Get all registered tools.\n */\n public getTools(): ToolPrimitive<any>[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get all registered resources.\n */\n public getResources(): ResourcePrimitive[] {\n return Array.from(this.resources.values());\n }\n\n /**\n * Get all registered prompts.\n */\n public getPrompts(): PromptPrimitive<any>[] {\n return Array.from(this.prompts.values());\n }\n\n /**\n * Get a tool by name.\n */\n public getTool(name: string): ToolPrimitive<any> | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get a resource by URI.\n */\n public getResource(uri: string): ResourcePrimitive | undefined {\n return this.resources.get(uri);\n }\n\n /**\n * Get a prompt by name.\n */\n public getPrompt(name: string): PromptPrimitive<any> | undefined {\n return this.prompts.get(name);\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Message Handling\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Handle an incoming JSON-RPC request.\n *\n * @param request - The parsed JSON-RPC request\n * @param context - Optional context from the transport layer (headers, auth, etc.)\n * @returns The JSON-RPC response, or null for notifications\n */\n public async handleMessage(\n request: JsonRpcRequest,\n context?: McpContext,\n ): Promise<JsonRpcResponse | null> {\n const id = request.id;\n\n // Notifications have no id and expect no response\n if (id === undefined) {\n await this.handleNotification(request);\n return null;\n }\n\n try {\n const result = await this.handleRequest(request, context);\n return createResponse(id, result);\n } catch (error) {\n this.log.error(\"MCP request failed\", error);\n // Preserve error code from McpError instances\n if (error instanceof McpError) {\n return createErrorResponse(id, {\n code: error.code,\n message: error.message,\n });\n }\n return createErrorResponse(\n id,\n createInternalError((error as Error).message),\n );\n }\n }\n\n /**\n * Handle a JSON-RPC request that expects a response.\n */\n protected async handleRequest(\n request: JsonRpcRequest,\n context?: McpContext,\n ): Promise<unknown> {\n const { method, params = {} } = request;\n\n switch (method) {\n case \"initialize\":\n return this.handleInitialize(params);\n case \"ping\":\n return this.handlePing();\n case \"tools/list\":\n return this.handleToolsList();\n case \"tools/call\":\n return this.handleToolsCall(params, context);\n case \"resources/list\":\n return this.handleResourcesList();\n case \"resources/read\":\n return this.handleResourcesRead(params, context);\n case \"prompts/list\":\n return this.handlePromptsList();\n case \"prompts/get\":\n return this.handlePromptsGet(params, context);\n default:\n throw new McpMethodNotFoundError(method);\n }\n }\n\n /**\n * Handle a notification (no response expected).\n */\n protected async handleNotification(request: JsonRpcRequest): Promise<void> {\n const { method } = request;\n\n switch (method) {\n case \"notifications/initialized\":\n this.log.debug(\"MCP client initialized\");\n break;\n case \"notifications/cancelled\":\n this.log.debug(\"MCP request cancelled\", request.params);\n break;\n default:\n this.log.debug(`Unknown MCP notification: ${method}`);\n }\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Protocol Handlers\n // -----------------------------------------------------------------------------------------------------------------\n\n protected handleInitialize(\n params: Record<string, unknown>,\n ): McpInitializeResult {\n this.log.info(\"MCP client initializing\", {\n clientInfo: params.clientInfo,\n protocolVersion: params.protocolVersion,\n });\n\n this.initialized = true;\n\n return {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: this.getCapabilities(),\n serverInfo: this.serverInfo,\n };\n }\n\n protected handlePing(): Record<string, never> {\n return {};\n }\n\n protected handleToolsList(): { tools: McpToolDescriptor[] } {\n return {\n tools: Array.from(this.tools.values()).map((t) => t.toDescriptor()),\n };\n }\n\n protected async handleToolsCall(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpToolCallResult> {\n const name = params.name as string;\n const args = (params.arguments ?? {}) as Record<string, unknown>;\n\n const tool = this.tools.get(name);\n if (!tool) {\n throw new McpToolNotFoundError(name);\n }\n\n try {\n const result = await tool.execute(args, context);\n\n const content: McpContent[] = [\n {\n type: \"text\",\n text:\n typeof result === \"string\"\n ? result\n : JSON.stringify(result ?? null),\n },\n ];\n\n return { content };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${(error as Error).message}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n protected handleResourcesList(): { resources: McpResourceDescriptor[] } {\n return {\n resources: Array.from(this.resources.values()).map((r) =>\n r.toDescriptor(),\n ),\n };\n }\n\n protected async handleResourcesRead(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpResourceReadResult> {\n const uri = params.uri as string;\n\n const resource = this.resources.get(uri);\n if (!resource) {\n throw new McpResourceNotFoundError(uri);\n }\n\n const content = await resource.read(context);\n\n const resourceContent: McpResourceContent = {\n uri,\n mimeType: resource.mimeType,\n };\n\n if (content.text !== undefined) {\n resourceContent.text = content.text;\n }\n\n if (content.blob !== undefined) {\n // Convert binary to base64 for transport\n resourceContent.blob = Buffer.from(content.blob).toString(\"base64\");\n }\n\n return {\n contents: [resourceContent],\n };\n }\n\n protected handlePromptsList(): { prompts: McpPromptDescriptor[] } {\n return {\n prompts: Array.from(this.prompts.values()).map((p) => p.toDescriptor()),\n };\n }\n\n protected async handlePromptsGet(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpPromptGetResult> {\n const name = params.name as string;\n const args = (params.arguments ?? {}) as Record<string, string>;\n\n const prompt = this.prompts.get(name);\n if (!prompt) {\n throw new McpPromptNotFoundError(name);\n }\n\n const messages = await prompt.get(args, context);\n\n const mcpMessages: McpPromptMessage[] = messages.map((msg) => ({\n role: msg.role,\n content: {\n type: \"text\" as const,\n text: msg.content,\n },\n }));\n\n return {\n description: prompt.description,\n messages: mcpMessages,\n };\n }\n}\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n t,\n} from \"alepha\";\nimport type {\n McpContext,\n McpPromptArgument,\n McpPromptDescriptor,\n PromptHandlerArgs,\n PromptMessage,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP prompt primitive for defining reusable prompt templates.\n *\n * Prompts allow you to define templated messages that can be filled in\n * with arguments at runtime. They're useful for creating consistent\n * interaction patterns.\n *\n * @example\n * ```ts\n * class Prompts {\n * greeting = $prompt({\n * description: \"Generate a personalized greeting\",\n * args: t.object({\n * name: t.text({ description: \"Name of the person to greet\" }),\n * style: t.optional(t.enum([\"formal\", \"casual\"])),\n * }),\n * handler: async ({ args }) => [\n * {\n * role: \"user\",\n * content: args.style === \"formal\"\n * ? `Please greet ${args.name} in a formal manner.`\n * : `Say hi to ${args.name}!`,\n * },\n * ],\n * });\n *\n * codeReview = $prompt({\n * description: \"Request a code review\",\n * args: t.object({\n * code: t.text({ description: \"The code to review\" }),\n * language: t.text({ description: \"Programming language\" }),\n * }),\n * handler: async ({ args }) => [\n * {\n * role: \"user\",\n * content: `Please review this ${args.language} code:\\n\\n${args.code}`,\n * },\n * ],\n * });\n * }\n * ```\n */\nexport const $prompt = <T extends TObject>(\n options: PromptPrimitiveOptions<T>,\n): PromptPrimitive<T> => {\n return createPrimitive(PromptPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface PromptPrimitiveOptions<T extends TObject> {\n /**\n * The name of the prompt.\n *\n * If not provided, defaults to the property key where the prompt is declared.\n *\n * @example \"greeting\"\n * @example \"code-review\"\n */\n name?: string;\n\n /**\n * Description of what this prompt does.\n *\n * Helps users understand the purpose of the prompt.\n *\n * @example \"Generate a personalized greeting message\"\n */\n description?: string;\n\n /**\n * TypeBox schema defining the prompt arguments.\n *\n * Each property in the schema becomes an argument that can be\n * filled in when the prompt is used.\n */\n args?: T;\n\n /**\n * Handler function that generates the prompt messages.\n *\n * Receives the validated arguments and returns an array of messages.\n *\n * @param args - Object containing validated arguments\n * @returns Array of prompt messages\n */\n handler: (args: PromptHandlerArgs<T>) => Async<PromptMessage[]>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class PromptPrimitive<T extends TObject> extends Primitive<\n PromptPrimitiveOptions<T>\n> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the prompt.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the description of the prompt.\n */\n public get description(): string | undefined {\n return this.options.description;\n }\n\n protected onInit(): void {\n this.mcpServer.registerPrompt(this);\n }\n\n /**\n * Get the prompt messages with the given arguments.\n *\n * @param rawArgs - Raw arguments to validate and pass to the handler\n * @param context - Optional context from the transport layer\n * @returns Array of prompt messages\n */\n public async get(\n rawArgs: unknown,\n context?: McpContext,\n ): Promise<PromptMessage[]> {\n let args = (rawArgs ?? {}) as Static<T>;\n\n if (this.options.args) {\n args = this.alepha.codec.decode(this.options.args, rawArgs ?? {});\n }\n\n return this.options.handler({ args, context });\n }\n\n /**\n * Convert the prompt to an MCP prompt descriptor for protocol messages.\n */\n public toDescriptor(): McpPromptDescriptor {\n return {\n name: this.name,\n description: this.description,\n arguments: this.options.args\n ? this.schemaToArguments(this.options.args)\n : [],\n };\n }\n\n /**\n * Convert a TypeBox schema to an array of prompt arguments.\n */\n protected schemaToArguments(schema: TObject): McpPromptArgument[] {\n const args: McpPromptArgument[] = [];\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n const prop = propSchema as Record<string, unknown>;\n args.push({\n name,\n description: prop.description as string | undefined,\n required: !t.schema.isOptional(propSchema),\n });\n }\n\n return args;\n }\n}\n\n$prompt[KIND] = PromptPrimitive;\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type {\n McpContext,\n McpResourceDescriptor,\n ResourceContent,\n ResourceHandler,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP resource primitive for exposing read-only data.\n *\n * Resources represent any kind of data that an LLM might want to read,\n * such as files, database records, API responses, or computed data.\n *\n * **Key Features**\n * - URI-based identification for resources\n * - Support for text and binary content\n * - MIME type specification\n * - Lazy loading via handler function\n *\n * @example\n * ```ts\n * class ProjectResources {\n * readme = $resource({\n * uri: \"file:///readme\",\n * description: \"Project README file\",\n * mimeType: \"text/markdown\",\n * handler: async () => ({\n * text: await fs.readFile(\"README.md\", \"utf-8\"),\n * }),\n * });\n *\n * config = $resource({\n * uri: \"config://app\",\n * name: \"Application Configuration\",\n * mimeType: \"application/json\",\n * handler: async () => ({\n * text: JSON.stringify(this.configService.getConfig()),\n * }),\n * });\n * }\n * ```\n */\nexport const $resource = (\n options: ResourcePrimitiveOptions,\n): ResourcePrimitive => {\n return createPrimitive(ResourcePrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ResourcePrimitiveOptions {\n /**\n * The URI that identifies this resource.\n *\n * URIs should follow a consistent scheme for your application.\n * Common patterns:\n * - `file:///path/to/file` - File system resources\n * - `db://table/id` - Database records\n * - `api://endpoint` - API responses\n * - `config://name` - Configuration values\n *\n * @example \"file:///readme.md\"\n * @example \"db://users/123\"\n */\n uri: string;\n\n /**\n * Human-readable name for the resource.\n *\n * If not provided, defaults to the property key where the resource is declared.\n *\n * @example \"Project README\"\n * @example \"User Profile\"\n */\n name?: string;\n\n /**\n * Description of what this resource contains.\n *\n * Helps the LLM understand the purpose and content of the resource.\n *\n * @example \"The main README file for the project\"\n */\n description?: string;\n\n /**\n * MIME type of the resource content.\n *\n * Helps clients understand how to interpret the content.\n *\n * @default \"text/plain\"\n * @example \"text/markdown\"\n * @example \"application/json\"\n */\n mimeType?: string;\n\n /**\n * Handler function that returns the resource content.\n *\n * Called when the resource is read. Can return text or binary content.\n *\n * @returns Resource content with either `text` or `blob` property\n */\n handler: ResourceHandler;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ResourcePrimitive extends Primitive<ResourcePrimitiveOptions> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the resource.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the URI of the resource.\n */\n public get uri(): string {\n return this.options.uri;\n }\n\n /**\n * Returns the description of the resource.\n */\n public get description(): string | undefined {\n return this.options.description;\n }\n\n /**\n * Returns the MIME type of the resource.\n */\n public get mimeType(): string {\n return this.options.mimeType ?? \"text/plain\";\n }\n\n protected onInit(): void {\n this.mcpServer.registerResource(this);\n }\n\n /**\n * Read the resource content.\n *\n * @param context - Optional context from the transport layer\n * @returns The resource content\n */\n public async read(context?: McpContext): Promise<ResourceContent> {\n return this.options.handler({ context });\n }\n\n /**\n * Convert the resource to an MCP resource descriptor for protocol messages.\n */\n public toDescriptor(): McpResourceDescriptor {\n return {\n uri: this.uri,\n name: this.name,\n description: this.description,\n mimeType: this.mimeType,\n };\n }\n}\n\n$resource[KIND] = ResourcePrimitive;\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type {\n McpContext,\n McpJsonSchema,\n McpToolDescriptor,\n ToolHandlerArgs,\n ToolHandlerResult,\n ToolPrimitiveSchema,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP tool primitive for defining callable functions.\n *\n * Tools are the primary way for LLMs to interact with external systems through MCP.\n * Each tool has a name, description, typed parameters, and a handler function.\n *\n * **Key Features**\n * - Full TypeScript inference for parameters and results\n * - Automatic schema validation using TypeBox\n * - JSON Schema generation for MCP protocol\n * - Integration with MCP server provider\n *\n * @example\n * ```ts\n * class CalculatorTools {\n * add = $tool({\n * description: \"Add two numbers together\",\n * schema: {\n * params: t.object({\n * a: t.number(),\n * b: t.number(),\n * }),\n * result: t.number(),\n * },\n * handler: async ({ params }) => {\n * return params.a + params.b;\n * },\n * });\n *\n * greet = $tool({\n * description: \"Generate a greeting message\",\n * schema: {\n * params: t.object({\n * name: t.text(),\n * }),\n * result: t.text(),\n * },\n * handler: async ({ params }) => {\n * return `Hello, ${params.name}!`;\n * },\n * });\n * }\n * ```\n */\nexport const $tool = <T extends ToolPrimitiveSchema>(\n options: ToolPrimitiveOptions<T>,\n): ToolPrimitive<T> => {\n return createPrimitive(ToolPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ToolPrimitiveOptions<T extends ToolPrimitiveSchema> {\n /**\n * The name of the tool.\n *\n * If not provided, defaults to the property key where the tool is declared.\n * Names should be descriptive and use kebab-case or snake_case.\n *\n * @example \"calculate-sum\"\n * @example \"get_weather\"\n */\n name?: string;\n\n /**\n * A human-readable description of what the tool does.\n *\n * This description is sent to the LLM to help it understand\n * when and how to use the tool. Be clear and specific.\n *\n * @example \"Calculate the sum of two numbers\"\n * @example \"Retrieve current weather data for a given location\"\n */\n description: string;\n\n /**\n * TypeBox schema defining the tool's parameters and result type.\n *\n * - **params**: TObject schema for input parameters (optional)\n * - **result**: TSchema for the return value (optional)\n *\n * Schemas provide:\n * - Type inference for handler function\n * - Runtime validation of inputs\n * - JSON Schema generation for MCP protocol\n */\n schema?: T;\n\n /**\n * The handler function that executes when the tool is called.\n *\n * Receives validated parameters and returns the result.\n * Errors thrown here are caught and returned as MCP errors.\n *\n * @param args - Object containing validated params\n * @returns The tool result (can be async)\n */\n handler: (args: ToolHandlerArgs<T>) => Async<ToolHandlerResult<T>>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ToolPrimitive<T extends ToolPrimitiveSchema> extends Primitive<\n ToolPrimitiveOptions<T>\n> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the tool.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the description of the tool.\n */\n public get description(): string {\n return this.options.description;\n }\n\n protected onInit(): void {\n this.mcpServer.registerTool(this);\n }\n\n /**\n * Execute the tool with the given parameters.\n *\n * @param params - Raw parameters to validate and pass to the handler\n * @param context - Optional context from the transport layer\n * @returns The tool result\n */\n public async execute(\n params: unknown,\n context?: McpContext,\n ): Promise<ToolHandlerResult<T>> {\n let validatedParams: any = params ?? {};\n\n // Validate params using alepha.codec if schema provided\n if (this.options.schema?.params) {\n validatedParams = this.alepha.codec.decode(\n this.options.schema.params,\n validatedParams,\n );\n }\n\n const result = await this.options.handler({\n params: validatedParams,\n context,\n });\n\n // Validate and encode result if schema provided\n if (this.options.schema?.result && result !== undefined) {\n return this.alepha.codec.encode(\n this.options.schema.result,\n result,\n ) as ToolHandlerResult<T>;\n }\n\n return result as ToolHandlerResult<T>;\n }\n\n /**\n * Convert the tool to an MCP tool descriptor for protocol messages.\n */\n public toDescriptor(): McpToolDescriptor {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.options.schema?.params\n ? this.schemaToJsonSchema(this.options.schema.params)\n : { type: \"object\", properties: {}, required: [] },\n };\n }\n\n /**\n * Convert a TypeBox schema to JSON Schema format.\n */\n protected schemaToJsonSchema(schema: TObject): McpJsonSchema {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n properties[key] = this.propertyToJsonSchema(propSchema as TSchema);\n\n // Check if property is required (not optional)\n if (!t.schema.isOptional(propSchema as TSchema)) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Convert a single property schema to JSON Schema format.\n */\n protected propertyToJsonSchema(schema: TSchema): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Check for description on all types\n if (\"description\" in schema) {\n result.description = schema.description;\n }\n\n if (t.schema.isString(schema)) {\n result.type = \"string\";\n if (\"minLength\" in schema) result.minLength = schema.minLength;\n if (\"maxLength\" in schema) result.maxLength = schema.maxLength;\n if (\"pattern\" in schema) result.pattern = schema.pattern;\n if (\"enum\" in schema) result.enum = schema.enum;\n } else if (t.schema.isNumber(schema)) {\n result.type = \"number\";\n if (\"minimum\" in schema) result.minimum = schema.minimum;\n if (\"maximum\" in schema) result.maximum = schema.maximum;\n } else if (t.schema.isInteger(schema)) {\n result.type = \"integer\";\n if (\"minimum\" in schema) result.minimum = schema.minimum;\n if (\"maximum\" in schema) result.maximum = schema.maximum;\n } else if (t.schema.isBoolean(schema)) {\n result.type = \"boolean\";\n } else if (t.schema.isArray(schema)) {\n result.type = \"array\";\n if (\"items\" in schema) {\n result.items = this.propertyToJsonSchema(schema.items as TSchema);\n }\n } else if (t.schema.isObject(schema)) {\n Object.assign(result, this.schemaToJsonSchema(schema));\n } else if (t.schema.isUnsafe(schema) || t.schema.isOptional(schema)) {\n // Handle Unsafe types (like t.enum) and optional wrappers by checking the underlying type property\n const schemaAny = schema as { type?: string; enum?: unknown[] };\n if (schemaAny.type === \"string\") {\n result.type = \"string\";\n if (\"enum\" in schema) result.enum = schema.enum;\n if (\"pattern\" in schema) result.pattern = schema.pattern;\n } else if (schemaAny.type === \"number\") {\n result.type = \"number\";\n } else if (schemaAny.type === \"integer\") {\n result.type = \"integer\";\n } else if (schemaAny.type === \"boolean\") {\n result.type = \"boolean\";\n } else if (schemaAny.type === \"array\") {\n result.type = \"array\";\n } else if (schemaAny.type === \"object\") {\n result.type = \"object\";\n } else {\n // Fallback\n result.type = \"string\";\n }\n } else {\n // Fallback for other types\n result.type = \"string\";\n }\n\n return result;\n }\n}\n\n$tool[KIND] = ToolPrimitive;\n","import { $env, $inject, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $route } from \"alepha/server\";\nimport {\n createErrorResponse,\n createNotification,\n createParseError,\n JsonRpcParseError,\n parseMessage,\n} from \"../helpers/jsonrpc.ts\";\nimport type { McpContext } from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n MCP_SSE_PATH: t.text({\n description: \"Path for MCP SSE endpoint\",\n default: \"/mcp\",\n }),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * SSE (Server-Sent Events) transport for MCP communication.\n *\n * This transport uses HTTP with SSE for server-to-client messages\n * and POST requests for client-to-server messages.\n *\n * Endpoints:\n * - GET /mcp - SSE stream for server events\n * - POST /mcp - JSON-RPC request endpoint\n *\n * @example\n * ```ts\n * import { Alepha, run } from \"alepha\";\n * import { AlephaServer } from \"alepha/server\";\n * import { AlephaMcp, AlephaMcpSse } from \"alepha/mcp\";\n *\n * class MyTools {\n * // ... tool definitions\n * }\n *\n * run(\n * Alepha.create()\n * .with(AlephaServer)\n * .with(AlephaMcp)\n * .with(AlephaMcpSse)\n * .with(MyTools)\n * );\n * ```\n */\nexport class SseMcpTransport {\n protected readonly log = $logger();\n protected readonly env = $env(envSchema);\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * SSE endpoint for server-to-client messages.\n *\n * Returns a text/event-stream response with server capabilities\n * and keeps the connection open for notifications.\n */\n sse = $route({\n method: \"GET\",\n path: this.env.MCP_SSE_PATH,\n handler: async (request) => {\n this.log.debug(\"MCP SSE connection established\");\n\n const encoder = new TextEncoder();\n\n // Create SSE stream\n const stream = new ReadableStream({\n start: (controller) => {\n // Send initial endpoint info\n const endpointEvent = this.formatSseEvent(\n \"endpoint\",\n `${this.env.MCP_SSE_PATH}`,\n );\n controller.enqueue(encoder.encode(endpointEvent));\n\n // Send capabilities notification\n const capabilitiesNotification = createNotification(\n \"notifications/capabilities\",\n { capabilities: this.mcpServer.getCapabilities() },\n );\n const capabilitiesEvent = this.formatSseEvent(\n \"message\",\n JSON.stringify(capabilitiesNotification),\n );\n controller.enqueue(encoder.encode(capabilitiesEvent));\n },\n cancel: () => {\n this.log.debug(\"MCP SSE connection closed\");\n },\n });\n\n request.reply.status = 200;\n request.reply.headers = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n };\n request.reply.body = stream;\n },\n });\n\n /**\n * POST endpoint for client-to-server JSON-RPC messages.\n */\n message = $route({\n method: \"POST\",\n path: this.env.MCP_SSE_PATH,\n secure: false,\n schema: {\n body: t.json(),\n },\n handler: async (request) => {\n try {\n const body =\n typeof request.body === \"string\"\n ? request.body\n : JSON.stringify(request.body);\n\n this.log.debug(\"MCP request body\", {\n body,\n bodyType: typeof request.body,\n });\n\n const rpcRequest = parseMessage(body);\n\n // Build context from request headers\n const context: McpContext = {\n headers: request.headers as Record<\n string,\n string | string[] | undefined\n >,\n };\n\n const response = await this.mcpServer.handleMessage(\n rpcRequest,\n context,\n );\n\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = response ? JSON.stringify(response) : \"\";\n } catch (error) {\n if (error instanceof JsonRpcParseError) {\n request.reply.status = 400;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify(\n createErrorResponse(0, createParseError(error.message)),\n );\n } else {\n this.log.error(\"Failed to process MCP message\", error);\n request.reply.status = 500;\n request.reply.body = JSON.stringify({\n error: (error as Error).message,\n });\n }\n }\n },\n });\n\n /**\n * Format a message as an SSE event.\n */\n protected formatSseEvent(event: string, data: string): string {\n return `event: ${event}\\ndata: ${data}\\n\\n`;\n }\n}\n","import * as readline from \"node:readline\";\nimport { $hook, $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n createErrorResponse,\n createParseError,\n JsonRpcParseError,\n parseMessage,\n} from \"../helpers/jsonrpc.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Stdio transport for MCP communication.\n *\n * This transport uses stdin/stdout for JSON-RPC message exchange,\n * which is the standard transport for local MCP servers.\n *\n * Messages are newline-delimited JSON objects.\n *\n * @example\n * ```ts\n * import { Alepha, run } from \"alepha\";\n * import { AlephaMcp, AlephaMcpStdio } from \"alepha/mcp\";\n *\n * class MyTools {\n * // ... tool definitions\n * }\n *\n * run(\n * Alepha.create()\n * .with(AlephaMcp)\n * .with(AlephaMcpStdio)\n * .with(MyTools)\n * );\n * ```\n */\nexport class StdioMcpTransport {\n protected readonly log = $logger();\n protected readonly mcpServer = $inject(McpServerProvider);\n\n protected rl?: readline.Interface;\n protected started = false;\n\n onStart = $hook({\n on: \"start\",\n handler: () => this.start(),\n });\n\n onStop = $hook({\n on: \"stop\",\n handler: () => this.stop(),\n });\n\n /**\n * Start the stdio transport.\n */\n protected start(): void {\n if (this.started) return;\n this.started = true;\n\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n this.rl.on(\"line\", (line) => this.handleLine(line));\n this.rl.on(\"close\", () => this.handleClose());\n\n this.log.info(\"MCP stdio transport started\");\n }\n\n /**\n * Stop the stdio transport.\n */\n protected stop(): void {\n if (!this.started) return;\n this.started = false;\n\n this.rl?.close();\n this.rl = undefined;\n\n this.log.info(\"MCP stdio transport stopped\");\n }\n\n /**\n * Handle an incoming line from stdin.\n */\n protected async handleLine(line: string): Promise<void> {\n // Skip empty lines\n if (!line.trim()) return;\n\n try {\n const request = parseMessage(line);\n const response = await this.mcpServer.handleMessage(request);\n\n if (response) {\n this.send(response);\n }\n } catch (error) {\n if (error instanceof JsonRpcParseError) {\n // Send parse error response\n this.send(createErrorResponse(0, createParseError(error.message)));\n } else {\n this.log.error(\"Failed to process MCP message\", error);\n }\n }\n }\n\n /**\n * Handle stdin close event.\n */\n protected handleClose(): void {\n this.log.debug(\"MCP stdio input closed\");\n }\n\n /**\n * Send a message to stdout.\n */\n protected send(message: object): void {\n const json = JSON.stringify(message);\n process.stdout.write(json + \"\\n\");\n }\n}\n","import { $module } from \"alepha\";\nimport { $prompt } from \"./primitives/$prompt.ts\";\nimport { $resource } from \"./primitives/$resource.ts\";\nimport { $tool } from \"./primitives/$tool.ts\";\nimport { McpServerProvider } from \"./providers/McpServerProvider.ts\";\nimport { SseMcpTransport } from \"./transports/SseMcpTransport.ts\";\nimport { StdioMcpTransport } from \"./transports/StdioMcpTransport.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport {\n McpError,\n McpInvalidParamsError,\n McpMethodNotFoundError,\n McpPromptNotFoundError,\n McpResourceNotFoundError,\n McpToolNotFoundError,\n} from \"./errors/McpError.ts\";\nexport {\n createErrorResponse,\n createInternalError,\n createInvalidParamsError,\n createInvalidRequestError,\n createMethodNotFoundError,\n createNotification,\n createParseError,\n createResponse,\n isNotification,\n isValidJsonRpcRequest,\n JSONRPC_VERSION,\n JsonRpcErrorCodes,\n JsonRpcParseError,\n MCP_PROTOCOL_VERSION,\n parseMessage,\n} from \"./helpers/jsonrpc.ts\";\nexport type {\n JsonRpcError,\n JsonRpcNotification,\n // JSON-RPC types\n JsonRpcRequest,\n JsonRpcResponse,\n // MCP protocol types\n McpCapabilities,\n McpClientInfo,\n McpContent,\n // Context type for auth/headers\n McpContext,\n McpInitializeParams,\n McpInitializeResult,\n McpJsonSchema,\n McpPromptArgument,\n McpPromptContent,\n // Prompt types\n McpPromptDescriptor,\n McpPromptGetParams,\n McpPromptGetResult,\n McpPromptMessage,\n McpResourceContent,\n // Resource types\n McpResourceDescriptor,\n McpResourceReadParams,\n McpResourceReadResult,\n McpServerInfo,\n McpToolCallParams,\n McpToolCallResult,\n // Tool types\n McpToolDescriptor,\n PromptHandler,\n PromptHandlerArgs,\n PromptMessage,\n ResourceContent,\n ResourceHandler,\n ResourceHandlerArgs,\n ToolHandler,\n ToolHandlerArgs,\n ToolHandlerResult,\n // Handler types\n ToolPrimitiveSchema,\n} from \"./interfaces/McpTypes.ts\";\nexport type { PromptPrimitiveOptions } from \"./primitives/$prompt.ts\";\nexport { $prompt, PromptPrimitive } from \"./primitives/$prompt.ts\";\nexport type { ResourcePrimitiveOptions } from \"./primitives/$resource.ts\";\nexport { $resource, ResourcePrimitive } from \"./primitives/$resource.ts\";\nexport type { ToolPrimitiveOptions } from \"./primitives/$tool.ts\";\nexport { $tool, ToolPrimitive } from \"./primitives/$tool.ts\";\nexport { McpServerProvider } from \"./providers/McpServerProvider.ts\";\nexport { SseMcpTransport } from \"./transports/SseMcpTransport.ts\";\nexport { StdioMcpTransport } from \"./transports/StdioMcpTransport.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Core MCP module with primitives and server provider.\n *\n * This module registers the $tool, $resource, and $prompt primitives\n * and the McpServerProvider. You need to add a transport module\n * (AlephaMcpStdio or AlephaMcpSse) for actual communication.\n *\n * @example\n * ```ts\n * import { Alepha, run } from \"alepha\";\n * import { AlephaMcp, AlephaMcpStdio, $tool, t } from \"alepha/mcp\";\n *\n * class MyMcpServer {\n * add = $tool({\n * description: \"Add two numbers\",\n * schema: {\n * params: t.object({ a: t.number(), b: t.number() }),\n * result: t.number(),\n * },\n * handler: async ({ params }) => params.a + params.b,\n * });\n * }\n *\n * run(\n * Alepha.create()\n * .with(AlephaMcp)\n * .with(AlephaMcpStdio)\n * .with(MyMcpServer)\n * );\n * ```\n *\n * @module alepha.mcp\n */\nexport const AlephaMcp = $module({\n name: \"alepha.mcp\",\n primitives: [$tool, $resource, $prompt],\n services: [McpServerProvider, SseMcpTransport, StdioMcpTransport],\n register: (alepha) => {\n alepha.with(McpServerProvider);\n },\n});\n"],"mappings":"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"}
@@ -7,11 +7,16 @@ import * as drizzle_orm_pg_core0 from "drizzle-orm/pg-core";
7
7
  import { LockConfig, LockStrength, PgColumn, PgColumnBuilderBase, PgDatabase, PgInsertValue, PgSchema, PgSelectBase, PgSequenceOptions, PgTableExtraConfigValue, PgTableWithColumns, PgTransaction, UpdateDeleteAction } from "drizzle-orm/pg-core";
8
8
  import * as alepha_logger0 from "alepha/logger";
9
9
  import * as alepha_lock0 from "alepha/lock";
10
- import { PostgresJsDatabase } from "drizzle-orm/postgres-js";
11
- import postgres from "postgres";
12
10
  import * as pg$1 from "drizzle-orm/sqlite-core";
13
11
  import { SQLiteColumnBuilderBase } from "drizzle-orm/sqlite-core";
12
+ import { PostgresJsDatabase } from "drizzle-orm/postgres-js";
13
+ import postgres from "postgres";
14
14
  import * as alepha_retry0 from "alepha/retry";
15
+ import { SQL as SQL$1 } from "bun";
16
+ import { Database } from "bun:sqlite";
17
+ import { BunSQLDatabase } from "drizzle-orm/bun-sql";
18
+ import { BunSQLiteDatabase } from "drizzle-orm/bun-sqlite";
19
+ import { DrizzleD1Database } from "drizzle-orm/d1";
15
20
  import { DatabaseSync } from "node:sqlite";
16
21
  import { PgTransactionConfig } from "drizzle-orm/pg-core/session";
17
22
  import * as DrizzleKit from "drizzle-kit/api";
@@ -766,7 +771,7 @@ type PgRelation<Base extends TObject> = {
766
771
  //#region ../../src/orm/interfaces/PgQueryWhere.d.ts
767
772
  type PgQueryWhere<T extends TObject, Relations extends PgRelationMap<TObject> | undefined = undefined> = (PgQueryWhereOperators<T> & PgQueryWhereConditions<T>) | (PgQueryWhereRelations<Relations> & PgQueryWhereOperators<T> & PgQueryWhereConditions<T, Relations>);
768
773
  type PgQueryWhereOrSQL<T extends TObject, Relations extends PgRelationMap<TObject> | undefined = undefined> = SQLWrapper | PgQueryWhere<T, Relations>;
769
- type PgQueryWhereOperators<T extends TObject> = { [Key in keyof Static<T>]?: FilterOperators<Static<T>[Key]> | Static<T>[Key] | (Static<T>[Key] extends object ? NestedJsonbQuery<Static<T>[Key]> : never) };
774
+ type PgQueryWhereOperators<T extends TObject> = { [Key in keyof Static<T>]?: FilterOperators<Static<T>[Key]> | Static<T>[Key] };
770
775
  type PgQueryWhereConditions<T extends TObject, Relations extends PgRelationMap<TObject> | undefined = undefined> = {
771
776
  /**
772
777
  * Combine a list of conditions with the `and` operator. Conditions
@@ -837,10 +842,6 @@ type PgQueryWhereConditions<T extends TObject, Relations extends PgRelationMap<T
837
842
  exists?: SQLWrapper;
838
843
  };
839
844
  type PgQueryWhereRelations<Relations extends PgRelationMap<TObject> | undefined = undefined> = Relations extends PgRelationMap<TObject> ? { [K in keyof Relations]?: PgQueryWhere<Relations[K]["join"]["schema"], Relations[K]["with"]> } : {};
840
- /**
841
- * Recursively allow nested queries for JSONB object/array types
842
- */
843
- type NestedJsonbQuery<T> = T extends object ? T extends Array<infer U> ? U extends object ? { [K in keyof U]?: FilterOperators<U[K]> | U[K] } : FilterOperators<U> | U : { [K in keyof T]?: FilterOperators<T[K]> | T[K] | (T[K] extends object ? NestedJsonbQuery<T[K]> : never) } : FilterOperators<T> | T;
844
845
  //#endregion
845
846
  //#region ../../src/orm/helpers/parseQueryString.d.ts
846
847
  /**
@@ -1118,84 +1119,16 @@ declare abstract class DatabaseProvider {
1118
1119
  * MUST be implemented by each provider
1119
1120
  */
1120
1121
  protected abstract executeMigrations(migrationsFolder: string): Promise<void>;
1121
- }
1122
- //#endregion
1123
- //#region ../../src/orm/services/PgJsonQueryManager.d.ts
1124
- /**
1125
- * Manages JSONB query generation for nested object and array queries in PostgreSQL.
1126
- * This class handles complex nested queries using PostgreSQL's JSONB operators.
1127
- */
1128
- declare class PgJsonQueryManager {
1129
- /**
1130
- * Check if a query contains nested JSONB queries.
1131
- * A nested query is when the value is an object with operator keys.
1132
- */
1133
- hasNestedQuery(where: PgQueryWhere<TObject>): boolean;
1134
- /**
1135
- * Build a JSONB query condition for nested object queries.
1136
- * Supports deep nesting like: { profile: { contact: { email: { eq: "test@example.com" } } } }
1137
- *
1138
- * @param column The JSONB column
1139
- * @param path The path to the nested property (e.g., ['profile', 'contact', 'email'])
1140
- * @param operator The filter operator (e.g., { eq: "test@example.com" })
1141
- * @param dialect Database dialect (postgresql or sqlite)
1142
- * @param columnSchema Optional schema of the JSON column for type inference
1143
- * @returns SQL condition
1144
- */
1145
- buildJsonbCondition(column: PgColumn, path: string[], operator: FilterOperators<any>, dialect: "postgresql" | "sqlite", columnSchema?: any): SQL | undefined;
1146
- /**
1147
- * Build JSONB array query conditions.
1148
- * Supports queries like: { addresses: { city: { eq: "Wonderland" } } }
1149
- * which translates to: EXISTS (SELECT 1 FROM jsonb_array_elements(addresses) elem WHERE elem->>'city' = 'Wonderland')
1150
- *
1151
- * @param dialect Database dialect (postgresql or sqlite)
1152
- * Note: SQLite array queries are not yet supported
1153
- */
1154
- buildJsonbArrayCondition(column: PgColumn, path: string[], arrayPath: string, operator: FilterOperators<any>, dialect: "postgresql" | "sqlite"): SQL | undefined;
1155
- /**
1156
- * Apply a filter operator to a JSONB value.
1157
- * @param dialect Database dialect for appropriate casting syntax
1158
- * @param fieldType Optional field type from schema for smart casting
1159
- */
1160
- private applyOperatorToJsonValue;
1161
- /**
1162
- * Parse a nested query object and extract the path and operator.
1163
- * For example: { profile: { contact: { email: { eq: "test@example.com" } } } }
1164
- * Returns: { path: ['profile', 'contact', 'email'], operator: { eq: "test@example.com" } }
1165
- */
1166
- parseNestedQuery(nestedQuery: any, currentPath?: string[]): Array<{
1167
- path: string[];
1168
- operator: FilterOperators<any>;
1169
- }>;
1170
- /**
1171
- * Determine if a property is a JSONB column based on the schema.
1172
- * A column is JSONB if it's defined as an object or array in the TypeBox schema.
1173
- */
1174
- isJsonbColumn(schema: TObject, columnName: string): boolean;
1175
1122
  /**
1176
- * Check if an array property contains primitive types (string, number, boolean, etc.)
1177
- * rather than objects. Primitive arrays should use native Drizzle operators.
1178
- * @returns true if the array contains primitives, false if it contains objects
1179
- */
1180
- isPrimitiveArray(schema: TObject, columnName: string): boolean;
1181
- /**
1182
- * Get the type of a field by navigating through a schema path.
1183
- * Used for smart type casting in SQL queries.
1184
- *
1185
- * @param columnSchema The schema of the JSON column (e.g., t.object({ age: t.integer() }))
1186
- * @param path The path to navigate (e.g., ['contact', 'email'])
1187
- * @returns The type string (e.g., 'integer', 'number', 'string') or undefined if not found
1188
- */
1189
- private getFieldType;
1190
- /**
1191
- * Check if a nested path points to an array property.
1123
+ * For testing purposes, generate a unique schema name.
1124
+ * The schema name will be generated based on the current date and time.
1125
+ * It will be in the format of `test_YYYYMMDD_HHMMSS_randomSuffix`.
1192
1126
  */
1193
- isArrayProperty(schema: TObject, path: string[]): boolean;
1127
+ protected generateTestSchemaName(): string;
1194
1128
  }
1195
1129
  //#endregion
1196
1130
  //#region ../../src/orm/services/QueryManager.d.ts
1197
1131
  declare class QueryManager {
1198
- protected readonly jsonQueryManager: PgJsonQueryManager;
1199
1132
  protected readonly alepha: Alepha;
1200
1133
  /**
1201
1134
  * Convert a query object to a SQL query.
@@ -1206,10 +1139,6 @@ declare class QueryManager {
1206
1139
  joins?: PgJoin[];
1207
1140
  dialect: "postgresql" | "sqlite";
1208
1141
  }): SQL | undefined;
1209
- /**
1210
- * Build a JSONB query for nested object/array queries.
1211
- */
1212
- protected buildJsonbQuery(column: PgColumn, nestedQuery: any, schema: TObject, columnName: string, dialect: "postgresql" | "sqlite"): SQL | undefined;
1213
1142
  /**
1214
1143
  * Check if an object has any filter operator properties.
1215
1144
  */
@@ -1732,11 +1661,11 @@ declare class PostgresModelBuilder extends ModelBuilder {
1732
1661
  }> | drizzle_orm_pg_core0.PgTimestampStringBuilderInitial<string> | drizzle_orm_pg_core0.PgDateStringBuilderInitial<string> | drizzle_orm_pg_core0.PgTextBuilderInitial<string, [string, ...string[]]>;
1733
1662
  }
1734
1663
  //#endregion
1735
- //#region ../../src/orm/providers/drivers/NodePostgresProvider.d.ts
1664
+ //#region ../../src/orm/providers/drivers/BunPostgresProvider.d.ts
1736
1665
  declare module "alepha" {
1737
- interface Env extends Partial<Static<typeof envSchema>> {}
1666
+ interface Env extends Partial<Static<typeof envSchema$1>> {}
1738
1667
  }
1739
- declare const envSchema: alepha1.TObject<{
1668
+ declare const envSchema$1: alepha1.TObject<{
1740
1669
  /**
1741
1670
  * Main configuration for database connection.
1742
1671
  * Accept a string in the format of a Postgres connection URL.
@@ -1747,13 +1676,28 @@ declare const envSchema: alepha1.TObject<{
1747
1676
  DATABASE_URL: alepha1.TOptional<alepha1.TString>;
1748
1677
  /**
1749
1678
  * In addition to the DATABASE_URL, you can specify the postgres schema name.
1750
- *
1751
- * It will monkey patch drizzle tables.
1752
1679
  */
1753
1680
  POSTGRES_SCHEMA: alepha1.TOptional<alepha1.TString>;
1754
1681
  }>;
1755
- declare class NodePostgresProvider extends DatabaseProvider {
1756
- static readonly SSL_MODES: readonly ["require", "allow", "prefer", "verify-full"];
1682
+ /**
1683
+ * Bun PostgreSQL provider using Drizzle ORM with Bun's native SQL client.
1684
+ *
1685
+ * This provider uses Bun's built-in SQL class for PostgreSQL connections,
1686
+ * which provides excellent performance on the Bun runtime.
1687
+ *
1688
+ * @example
1689
+ * ```ts
1690
+ * // Set DATABASE_URL environment variable
1691
+ * // DATABASE_URL=postgres://user:password@localhost:5432/database
1692
+ *
1693
+ * // Or configure programmatically
1694
+ * alepha.with({
1695
+ * provide: DatabaseProvider,
1696
+ * use: BunPostgresProvider,
1697
+ * });
1698
+ * ```
1699
+ */
1700
+ declare class BunPostgresProvider extends DatabaseProvider {
1757
1701
  protected readonly log: alepha_logger0.Logger;
1758
1702
  protected readonly env: {
1759
1703
  DATABASE_URL?: string | undefined;
@@ -1761,8 +1705,8 @@ declare class NodePostgresProvider extends DatabaseProvider {
1761
1705
  };
1762
1706
  protected readonly kit: DrizzleKitProvider;
1763
1707
  protected readonly builder: PostgresModelBuilder;
1764
- protected client?: postgres.Sql;
1765
- protected pg?: PostgresJsDatabase;
1708
+ protected client?: SQL$1;
1709
+ protected bunDb?: BunSQLDatabase;
1766
1710
  readonly dialect = "postgresql";
1767
1711
  get name(): string;
1768
1712
  /**
@@ -1781,24 +1725,13 @@ declare class NodePostgresProvider extends DatabaseProvider {
1781
1725
  /**
1782
1726
  * Get the Drizzle Postgres database instance.
1783
1727
  */
1784
- get db(): PostgresJsDatabase;
1728
+ get db(): PgDatabase<any>;
1785
1729
  protected executeMigrations(migrationsFolder: string): Promise<void>;
1786
1730
  protected readonly onStart: alepha1.HookPrimitive<"start">;
1787
1731
  protected readonly onStop: alepha1.HookPrimitive<"stop">;
1788
1732
  connect(): Promise<void>;
1789
1733
  close(): Promise<void>;
1790
1734
  protected migrate: alepha_lock0.LockPrimitive<() => Promise<void>>;
1791
- /**
1792
- * Map the DATABASE_URL to postgres client options.
1793
- */
1794
- protected getClientOptions(): postgres.Options<any>;
1795
- protected ssl(url: URL): "require" | "allow" | "prefer" | "verify-full" | undefined;
1796
- /**
1797
- * For testing purposes, generate a unique schema name.
1798
- * The schema name will be generated based on the current date and time.
1799
- * It will be in the format of `test_YYYYMMDD_HHMMSS_randomSuffix`.
1800
- */
1801
- protected generateTestSchemaName(): string;
1802
1735
  }
1803
1736
  //#endregion
1804
1737
  //#region ../../src/orm/services/SqliteModelBuilder.d.ts
@@ -1857,10 +1790,10 @@ declare class SqliteModelBuilder extends ModelBuilder {
1857
1790
  name: string;
1858
1791
  dataType: "custom";
1859
1792
  columnType: "SQLiteCustomColumn";
1860
- data: Record<string, unknown>;
1793
+ data: typebox1.StaticRecord<[], "Decode", {}, {}, string, TSchema>;
1861
1794
  driverParam: string;
1862
1795
  enumValues: undefined;
1863
- }>, Record<string, unknown>> | drizzle_orm0.$Type<pg$1.SQLiteCustomColumnBuilder<{
1796
+ }>, typebox1.StaticRecord<[], "Decode", {}, {}, string, TSchema>> | drizzle_orm0.$Type<pg$1.SQLiteCustomColumnBuilder<{
1864
1797
  name: string;
1865
1798
  dataType: "custom";
1866
1799
  columnType: "SQLiteCustomColumn";
@@ -1955,6 +1888,200 @@ declare class SqliteModelBuilder extends ModelBuilder {
1955
1888
  }
1956
1889
  type SchemaToSqliteBuilder<T extends TObject> = { [key in keyof T["properties"]]: SQLiteColumnBuilderBase };
1957
1890
  //#endregion
1891
+ //#region ../../src/orm/providers/drivers/BunSqliteProvider.d.ts
1892
+ /**
1893
+ * Configuration options for the Bun SQLite database provider.
1894
+ */
1895
+ declare const bunSqliteOptions: alepha1.Atom<alepha1.TObject<{
1896
+ path: alepha1.TOptional<alepha1.TString>;
1897
+ }>, "alepha.postgres.bun-sqlite.options">;
1898
+ type BunSqliteProviderOptions = Static<typeof bunSqliteOptions.schema>;
1899
+ declare module "alepha" {
1900
+ interface State {
1901
+ [bunSqliteOptions.key]: BunSqliteProviderOptions;
1902
+ }
1903
+ }
1904
+ /**
1905
+ * Bun SQLite provider using Drizzle ORM with Bun's native SQLite client.
1906
+ *
1907
+ * This provider uses Bun's built-in `bun:sqlite` for SQLite connections,
1908
+ * which provides excellent performance on the Bun runtime.
1909
+ *
1910
+ * @example
1911
+ * ```ts
1912
+ * // Set DATABASE_URL environment variable
1913
+ * // DATABASE_URL=sqlite://./my-database.db
1914
+ *
1915
+ * // Or configure programmatically
1916
+ * alepha.with({
1917
+ * provide: DatabaseProvider,
1918
+ * use: BunSqliteProvider,
1919
+ * });
1920
+ *
1921
+ * // Or use options atom
1922
+ * alepha.store.mut(bunSqliteOptions, (old) => ({
1923
+ * ...old,
1924
+ * path: ":memory:",
1925
+ * }));
1926
+ * ```
1927
+ */
1928
+ declare class BunSqliteProvider extends DatabaseProvider {
1929
+ protected readonly kit: DrizzleKitProvider;
1930
+ protected readonly log: alepha_logger0.Logger;
1931
+ protected readonly env: {
1932
+ DATABASE_URL?: string | undefined;
1933
+ };
1934
+ protected readonly builder: SqliteModelBuilder;
1935
+ protected readonly options: Readonly<{
1936
+ path?: string | undefined;
1937
+ }>;
1938
+ protected sqlite?: Database;
1939
+ protected bunDb?: BunSQLiteDatabase;
1940
+ get name(): string;
1941
+ readonly dialect = "sqlite";
1942
+ get url(): string;
1943
+ get db(): PgDatabase<any>;
1944
+ execute(query: SQLLike): Promise<Array<Record<string, unknown>>>;
1945
+ protected readonly onStart: alepha1.HookPrimitive<"start">;
1946
+ protected readonly onStop: alepha1.HookPrimitive<"stop">;
1947
+ protected executeMigrations(migrationsFolder: string): Promise<void>;
1948
+ }
1949
+ //#endregion
1950
+ //#region ../../src/orm/providers/drivers/CloudflareD1Provider.d.ts
1951
+ /**
1952
+ * D1Database interface matching Cloudflare's D1 API.
1953
+ */
1954
+ interface D1Database {
1955
+ prepare(query: string): D1PreparedStatement;
1956
+ batch<T = unknown>(statements: D1PreparedStatement[]): Promise<T[]>;
1957
+ exec(query: string): Promise<D1ExecResult>;
1958
+ dump(): Promise<ArrayBuffer>;
1959
+ }
1960
+ interface D1PreparedStatement {
1961
+ bind(...values: unknown[]): D1PreparedStatement;
1962
+ first<T = unknown>(colName?: string): Promise<T | null>;
1963
+ run(): Promise<D1Result>;
1964
+ all<T = unknown>(): Promise<D1Result<T>>;
1965
+ raw<T = unknown>(): Promise<T[]>;
1966
+ }
1967
+ interface D1Result<T = unknown> {
1968
+ results: T[];
1969
+ success: boolean;
1970
+ meta: {
1971
+ duration: number;
1972
+ changes: number;
1973
+ last_row_id: number;
1974
+ served_by: string;
1975
+ internal_stats: unknown;
1976
+ };
1977
+ }
1978
+ interface D1ExecResult {
1979
+ count: number;
1980
+ duration: number;
1981
+ }
1982
+ /**
1983
+ * Cloudflare D1 SQLite provider using Drizzle ORM.
1984
+ *
1985
+ * This provider requires a D1 binding to be set via `cloudflareD1Options` before starting.
1986
+ * The binding is typically obtained from the Cloudflare Workers environment.
1987
+ *
1988
+ * @example
1989
+ * ```ts
1990
+ * // In your Cloudflare Worker
1991
+ * alepha.set(cloudflareD1Options, { binding: env.DB });
1992
+ * ```
1993
+ */
1994
+ declare class CloudflareD1Provider extends DatabaseProvider {
1995
+ protected readonly kit: DrizzleKitProvider;
1996
+ protected readonly log: alepha_logger0.Logger;
1997
+ protected readonly builder: SqliteModelBuilder;
1998
+ protected readonly env: {
1999
+ DATABASE_URL: string;
2000
+ };
2001
+ protected d1?: D1Database;
2002
+ protected drizzleDb?: DrizzleD1Database;
2003
+ get name(): string;
2004
+ readonly dialect = "sqlite";
2005
+ get url(): string;
2006
+ get db(): PgDatabase<any>;
2007
+ execute(query: SQLLike): Promise<Array<Record<string, unknown>>>;
2008
+ protected readonly onStart: alepha1.HookPrimitive<"start">;
2009
+ protected executeMigrations(migrationsFolder: string): Promise<void>;
2010
+ /**
2011
+ * Override development migration to skip sync (not supported on D1).
2012
+ * D1 requires proper migrations to be applied.
2013
+ */
2014
+ protected runDevelopmentMigration(migrationsFolder: string): Promise<void>;
2015
+ /**
2016
+ * Override test migration to run migrations instead of sync.
2017
+ * D1 doesn't support schema synchronization.
2018
+ */
2019
+ protected runTestMigration(): Promise<void>;
2020
+ }
2021
+ //#endregion
2022
+ //#region ../../src/orm/providers/drivers/NodePostgresProvider.d.ts
2023
+ declare module "alepha" {
2024
+ interface Env extends Partial<Static<typeof envSchema>> {}
2025
+ }
2026
+ declare const envSchema: alepha1.TObject<{
2027
+ /**
2028
+ * Main configuration for database connection.
2029
+ * Accept a string in the format of a Postgres connection URL.
2030
+ * Example: postgres://user:password@localhost:5432/database
2031
+ * or
2032
+ * Example: postgres://user:password@localhost:5432/database?sslmode=require
2033
+ */
2034
+ DATABASE_URL: alepha1.TOptional<alepha1.TString>;
2035
+ /**
2036
+ * In addition to the DATABASE_URL, you can specify the postgres schema name.
2037
+ *
2038
+ * It will monkey patch drizzle tables.
2039
+ */
2040
+ POSTGRES_SCHEMA: alepha1.TOptional<alepha1.TString>;
2041
+ }>;
2042
+ declare class NodePostgresProvider extends DatabaseProvider {
2043
+ static readonly SSL_MODES: readonly ["require", "allow", "prefer", "verify-full"];
2044
+ protected readonly log: alepha_logger0.Logger;
2045
+ protected readonly env: {
2046
+ DATABASE_URL?: string | undefined;
2047
+ POSTGRES_SCHEMA?: string | undefined;
2048
+ };
2049
+ protected readonly kit: DrizzleKitProvider;
2050
+ protected readonly builder: PostgresModelBuilder;
2051
+ protected client?: postgres.Sql;
2052
+ protected pg?: PostgresJsDatabase;
2053
+ readonly dialect = "postgresql";
2054
+ get name(): string;
2055
+ /**
2056
+ * In testing mode, the schema name will be generated and deleted after the test.
2057
+ */
2058
+ protected schemaForTesting: string | undefined;
2059
+ get url(): string;
2060
+ /**
2061
+ * Execute a SQL statement.
2062
+ */
2063
+ execute(statement: SQLLike): Promise<Array<Record<string, unknown>>>;
2064
+ /**
2065
+ * Get Postgres schema used by this provider.
2066
+ */
2067
+ get schema(): string;
2068
+ /**
2069
+ * Get the Drizzle Postgres database instance.
2070
+ */
2071
+ get db(): PostgresJsDatabase;
2072
+ protected executeMigrations(migrationsFolder: string): Promise<void>;
2073
+ protected readonly onStart: alepha1.HookPrimitive<"start">;
2074
+ protected readonly onStop: alepha1.HookPrimitive<"stop">;
2075
+ connect(): Promise<void>;
2076
+ close(): Promise<void>;
2077
+ protected migrate: alepha_lock0.LockPrimitive<() => Promise<void>>;
2078
+ /**
2079
+ * Map the DATABASE_URL to postgres client options.
2080
+ */
2081
+ protected getClientOptions(): postgres.Options<any>;
2082
+ protected ssl(url: URL): "require" | "allow" | "prefer" | "verify-full" | undefined;
2083
+ }
2084
+ //#endregion
1958
2085
  //#region ../../src/orm/providers/drivers/NodeSqliteProvider.d.ts
1959
2086
  /**
1960
2087
  * Configuration options for the Node.js SQLite database provider.
@@ -2213,5 +2340,5 @@ declare module "alepha" {
2213
2340
  */
2214
2341
  declare const AlephaPostgres: alepha1.Service<alepha1.Module>;
2215
2342
  //#endregion
2216
- export { $entity, $repository, $sequence, $transaction, AlephaPostgres, DatabaseProvider, DbConflictError, DbEntityNotFoundError, DbError, DbMigrationError, DbVersionMismatchError, DrizzleKitProvider, EntityColumn, EntityColumns, EntityPrimitive, EntityPrimitiveOptions, FilterOperators, FromSchema, NodePostgresProvider, NodeSqliteProvider, NodeSqliteProviderOptions, OrderBy, OrderByClause, OrderDirection, PG_CREATED_AT, PG_DEFAULT, PG_DELETED_AT, PG_ENUM, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, PG_VERSION, type Page, type PageQuery, PgAttr, PgAttrField, PgDefault, PgEnumOptions, PgIdentityOptions, PgPrimaryKey, PgQuery, PgQueryRelations, PgQueryWhere, PgQueryWhereOrSQL, PgRef, PgRefOptions, PgRelation, PgRelationMap, PgStatic, PgSymbolKeys, PgSymbols, PostgresTypeProvider, Repository, RepositoryProvider, SQLLike, SchemaToTableConfig, SequencePrimitive, SequencePrimitiveOptions, StatementOptions, TObjectInsert, TObjectUpdate, TransactionContext, TransactionPrimitiveOptions, buildQueryString, drizzle_orm0 as drizzle, getAttrFields, insertSchema, legacyIdSchema, nodeSqliteOptions, pageQuerySchema, pageSchema, parseQueryString, pg, pgAttr, schema, sql, updateSchema };
2343
+ export { $entity, $repository, $sequence, $transaction, AlephaPostgres, BunPostgresProvider, BunSqliteProvider, BunSqliteProviderOptions, CloudflareD1Provider, D1Database, D1ExecResult, D1PreparedStatement, D1Result, DatabaseProvider, DbConflictError, DbEntityNotFoundError, DbError, DbMigrationError, DbVersionMismatchError, DrizzleKitProvider, EntityColumn, EntityColumns, EntityPrimitive, EntityPrimitiveOptions, FilterOperators, FromSchema, NodePostgresProvider, NodeSqliteProvider, NodeSqliteProviderOptions, OrderBy, OrderByClause, OrderDirection, PG_CREATED_AT, PG_DEFAULT, PG_DELETED_AT, PG_ENUM, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, PG_VERSION, type Page, type PageQuery, PgAttr, PgAttrField, PgDefault, PgEnumOptions, PgIdentityOptions, PgPrimaryKey, PgQuery, PgQueryRelations, PgQueryWhere, PgQueryWhereOrSQL, PgRef, PgRefOptions, PgRelation, PgRelationMap, PgStatic, PgSymbolKeys, PgSymbols, PostgresTypeProvider, Repository, RepositoryProvider, SQLLike, SchemaToTableConfig, SequencePrimitive, SequencePrimitiveOptions, StatementOptions, TObjectInsert, TObjectUpdate, TransactionContext, TransactionPrimitiveOptions, buildQueryString, bunSqliteOptions, drizzle_orm0 as drizzle, getAttrFields, insertSchema, legacyIdSchema, nodeSqliteOptions, pageQuerySchema, pageSchema, parseQueryString, pg, pgAttr, schema, sql, updateSchema };
2217
2344
  //# sourceMappingURL=index.d.ts.map