alepha 0.14.3 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/api/audits/index.d.ts +338 -417
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +1 -80
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +156 -235
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/notifications/index.d.ts +170 -249
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/parameters/index.d.ts +266 -345
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/users/index.d.ts +755 -834
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/verifications/index.d.ts +125 -125
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/cli/index.d.ts +116 -20
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +212 -124
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +6 -11
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2 -2
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +26 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +16 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +26 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +26 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/logger/index.d.ts +1 -1
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +12 -2
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.d.ts +37 -173
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +193 -422
- package/dist/orm/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +167 -167
- package/dist/server/cache/index.d.ts +12 -0
- package/dist/server/cache/index.d.ts.map +1 -1
- package/dist/server/cache/index.js +55 -2
- package/dist/server/cache/index.js.map +1 -1
- package/dist/server/compress/index.d.ts +6 -0
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +36 -1
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/core/index.browser.js +2 -2
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +10 -10
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +6 -3
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.d.ts +39 -39
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/security/index.d.ts +9 -9
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js +4 -0
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -3
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/vite/index.d.ts +101 -106
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +571 -508
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/apps/AlephaCli.ts +0 -2
- package/src/cli/atoms/buildOptions.ts +88 -0
- package/src/cli/commands/build.ts +32 -69
- package/src/cli/commands/db.ts +0 -4
- package/src/cli/commands/dev.ts +16 -4
- package/src/cli/commands/gen/env.ts +53 -0
- package/src/cli/commands/gen/openapi.ts +1 -1
- package/src/cli/commands/gen/resource.ts +15 -0
- package/src/cli/commands/gen.ts +7 -1
- package/src/cli/commands/init.ts +0 -1
- package/src/cli/commands/test.ts +0 -1
- package/src/cli/commands/verify.ts +1 -1
- package/src/cli/defineConfig.ts +49 -7
- package/src/cli/index.ts +0 -1
- package/src/cli/services/AlephaCliUtils.ts +36 -25
- package/src/command/helpers/Runner.spec.ts +2 -2
- package/src/command/helpers/Runner.ts +1 -1
- package/src/command/primitives/$command.ts +0 -6
- package/src/command/providers/CliProvider.ts +1 -3
- package/src/core/Alepha.ts +42 -0
- package/src/logger/index.ts +15 -3
- package/src/mcp/transports/StdioMcpTransport.ts +1 -1
- package/src/orm/index.ts +2 -8
- package/src/queue/core/providers/WorkerProvider.spec.ts +48 -32
- package/src/server/cache/providers/ServerCacheProvider.spec.ts +183 -0
- package/src/server/cache/providers/ServerCacheProvider.ts +94 -9
- package/src/server/compress/providers/ServerCompressProvider.ts +61 -2
- package/src/server/core/helpers/ServerReply.ts +2 -2
- package/src/server/core/providers/ServerProvider.ts +11 -1
- package/src/server/static/providers/ServerStaticProvider.ts +10 -0
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +5 -8
- package/src/vite/helpers/importViteReact.ts +13 -0
- package/src/vite/index.ts +1 -21
- package/src/vite/plugins/viteAlephaDev.ts +16 -1
- package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
- package/src/vite/tasks/buildClient.ts +11 -0
- package/src/vite/tasks/buildServer.ts +47 -3
- package/src/vite/tasks/devServer.ts +69 -0
- package/src/vite/tasks/index.ts +2 -1
- package/src/cli/assets/viteConfigTs.ts +0 -14
- package/src/cli/commands/run.ts +0 -24
- package/src/vite/plugins/viteAlepha.ts +0 -37
- package/src/vite/plugins/viteAlephaBuild.ts +0 -281
package/dist/logger/index.d.ts
CHANGED
|
@@ -257,7 +257,7 @@ declare const envSchema: alepha6.TObject<{
|
|
|
257
257
|
* Built-in log formats.
|
|
258
258
|
* - "json" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}
|
|
259
259
|
* - "pretty" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}
|
|
260
|
-
* - "raw" - Raw format, no formatting, just the message.
|
|
260
|
+
* - "raw" - Raw format, no formatting, just the message. {@link RawFormatterProvider}
|
|
261
261
|
*/
|
|
262
262
|
LOG_FORMAT: alepha6.TOptional<alepha6.TUnsafe<"json" | "pretty" | "raw">>;
|
|
263
263
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEa,wBAAc;SAWzB,OAAA,CAAA;;;EAXW,MAAA,iBAWX;EAAA,OAAA,mBAAA,iBAAA;;;;;KAEU,QAAA,GAAW,cAAc;;;uBCbf,sBAAA;yCAC0B;;;;uBCD1B,oBAAA;yBACU;;;;AFDnB,cGUA,MAAA,YAAkB,eHC7B,CAAA;EAAA,mBAAA,MAAA,EGAyB,MHAzB;gCGC4B;kCACE;uCACK;6BAER;;;;;sBAcP;;aH9BK,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAA,IAAA,KAAA,CAAA,CAAA,EAAA,MAAA;EAaf,UAAA,CAAQ,KAAA,EAAA,MAAiB,EAAA,GAAA,EAAA,MAAA,CAAd,EGsC0B,QHtCpB;;iCG6FW;;EF1GlB,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAsB,CAAA,EAAA,OAAA,CACI,EAAA,IAAA;;;;ECD1B,UAAA,GAAA,CAAA,KAAA,ECyIC,QDzImB,EAAA,OACV,EAAA,MAAQ,EAAA,IAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;wBC8KhB;;;;;;;AH/KxB;;;;;;;;;;;;;;AAaA;;cIOa;aAAoB,yBAA8B;EHpBzC,MAAA,EAAA,aAAA;;UGgCL,sBAAA;;AFhCjB;;;cGYa,oBAAA;;;;ILZA,GAAA,EAAA,MAAA;IAWX,KAAA,EAAA,MAAA;;;;;;;;;;;UAXyB,EAAA,MAAA;IAAA,KAAA,EAAA,MAAA;IAaf,IAAA,EAAA,MAAQ;;;;ECbE,CAAA;;;;ECAA,CAAA;6BGsCK;;;EF5Bd,SAAO,CAAA,CAAA,EAAA,OAAA;EACO,GAAA,CAAA,KAAA,EAAA,MAAA,OEgDH,oBAAA,CAAqB,MFhDlB,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;cGXd,0BAAA,SAAmC,sBAAA;;;;;cCCnC,qBAAA,SAA8B,oBAAA;gBACpB;yBAoBS;APtBhC;;;cQCa,yBAAA,SAAkC,sBAAA;qBAC1B,MAAM;;ERFd,CAAA,CAAA;EAWX,SAAA,OAAA,EAAA;;;kCQHuC;;;;;;;;URRd,EAAA,MAAA;IAAA,SAAA,EAAA,MAAA;EAaf,CAAA,GAAA;;;;ACbZ;;;cQGa,uBAAA,SAAgC,oBAAA;ETHhC,UAAA,KAAA,ESII,oBTOf;EAAA,UAAA,MAAA,ESNgB,MTMhB;gBSJqB;;;;;;;;+BAyFQ;;;;;;;;;;;ATnF/B;;;;ACbA;;;;ACAA;;;;ACUA;;;;;;;;;;;;;;;;ACUA;;;;;;AAYA;;;;ACpBA;;;;ACZA;;;;ACCA;;;;;;;;ACAA;;;;;;;cE6Fa,cAAY,OAAA,CAAA,QAoFvB,OAAA,CApFuB,MAAA;cAwFnB,mBAAS;EDnLF;;;;;;;;;;AC2Fb;AAoFG;;;;;WAIY,mBAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEa,wBAAc;SAWzB,OAAA,CAAA;;;EAXW,MAAA,iBAWX;EAAA,OAAA,mBAAA,iBAAA;;;;;KAEU,QAAA,GAAW,cAAc;;;uBCbf,sBAAA;yCAC0B;;;;uBCD1B,oBAAA;yBACU;;;;AFDnB,cGUA,MAAA,YAAkB,eHC7B,CAAA;EAAA,mBAAA,MAAA,EGAyB,MHAzB;gCGC4B;kCACE;uCACK;6BAER;;;;;sBAcP;;aH9BK,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAA,IAAA,KAAA,CAAA,CAAA,EAAA,MAAA;EAaf,UAAA,CAAQ,KAAA,EAAA,MAAiB,EAAA,GAAA,EAAA,MAAA,CAAd,EGsC0B,QHtCpB;;iCG6FW;;EF1GlB,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAsB,CAAA,EAAA,OAAA,CACI,EAAA,IAAA;;;;ECD1B,UAAA,GAAA,CAAA,KAAA,ECyIC,QDzImB,EAAA,OACV,EAAA,MAAQ,EAAA,IAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;wBC8KhB;;;;;;;AH/KxB;;;;;;;;;;;;;;AAaA;;cIOa;aAAoB,yBAA8B;EHpBzC,MAAA,EAAA,aAAA;;UGgCL,sBAAA;;AFhCjB;;;cGYa,oBAAA;;;;ILZA,GAAA,EAAA,MAAA;IAWX,KAAA,EAAA,MAAA;;;;;;;;;;;UAXyB,EAAA,MAAA;IAAA,KAAA,EAAA,MAAA;IAaf,IAAA,EAAA,MAAQ;;;;ECbE,CAAA;;;;ECAA,CAAA;6BGsCK;;;EF5Bd,SAAO,CAAA,CAAA,EAAA,OAAA;EACO,GAAA,CAAA,KAAA,EAAA,MAAA,OEgDH,oBAAA,CAAqB,MFhDlB,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;cGXd,0BAAA,SAAmC,sBAAA;;;;;cCCnC,qBAAA,SAA8B,oBAAA;gBACpB;yBAoBS;APtBhC;;;cQCa,yBAAA,SAAkC,sBAAA;qBAC1B,MAAM;;ERFd,CAAA,CAAA;EAWX,SAAA,OAAA,EAAA;;;kCQHuC;;;;;;;;URRd,EAAA,MAAA;IAAA,SAAA,EAAA,MAAA;EAaf,CAAA,GAAA;;;;ACbZ;;;cQGa,uBAAA,SAAgC,oBAAA;ETHhC,UAAA,KAAA,ESII,oBTOf;EAAA,UAAA,MAAA,ESNgB,MTMhB;gBSJqB;;;;;;;;+BAyFQ;;;;;;;;;;;ATnF/B;;;;ACbA;;;;ACAA;;;;ACUA;;;;;;;;;;;;;;;;ACUA;;;;;;AAYA;;;;ACpBA;;;;ACZA;;;;ACCA;;;;;;;;ACAA;;;;;;;cE6Fa,cAAY,OAAA,CAAA,QAoFvB,OAAA,CApFuB,MAAA;cAwFnB,mBAAS;EDnLF;;;;;;;;;;AC2Fb;AAoFG;;;;;WAIY,mBAAA,CAwCb,OAAA,CAAA,OAAA,CAxCa;EAAA;AAAA;;;;;EA6CgB,UAAA,mBAAA,gBAAA,CAAA,MAAA,GAAA,QAAA,GAAA,KAAA,CAAA,CAAA;EAYlB;eAAQ,QAAA,CAAA;EAAA,UAAA,GAAA,SAZU,OAYV,CAZkB,MAYlB,CAAA,OAZgC,SAYhC,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;aAAR"}
|
package/dist/logger/index.js
CHANGED
|
@@ -503,12 +503,22 @@ const AlephaLogger = $module({
|
|
|
503
503
|
}
|
|
504
504
|
});
|
|
505
505
|
const envSchema = t.object({
|
|
506
|
-
LOG_LEVEL: t.optional(t.text({
|
|
506
|
+
LOG_LEVEL: t.optional(t.text({
|
|
507
|
+
description: `Application log level on startup.
|
|
508
|
+
Levels are: trace, debug, info, warn, error, silent
|
|
509
|
+
Level can be set for a specific module:
|
|
510
|
+
"my.module.name:debug,info" -> Set debug level for my.module.name and info for all other modules
|
|
511
|
+
"alepha:trace,info" -> Set trace level for all alepha modules and info for all other modules`,
|
|
512
|
+
lowercase: true
|
|
513
|
+
})),
|
|
507
514
|
LOG_FORMAT: t.optional(t.enum([
|
|
508
515
|
"json",
|
|
509
516
|
"pretty",
|
|
510
517
|
"raw"
|
|
511
|
-
], {
|
|
518
|
+
], {
|
|
519
|
+
description: "Default log format for the application.",
|
|
520
|
+
lowercase: true
|
|
521
|
+
}))
|
|
512
522
|
});
|
|
513
523
|
|
|
514
524
|
//#endregion
|
package/dist/logger/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["envSchema"],"sources":["../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new Error(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n private matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && !!data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $env, $inject, Alepha, t } from \"alepha\";\n\nconst envSchema = t.object({\n /**\n * Disable colors in the console output.\n */\n NO_COLOR: t.optional(t.text()),\n\n /**\n * Force color output for the application.\n */\n FORCE_COLOR: t.optional(t.text()),\n});\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.env.NO_COLOR) {\n return false;\n }\n\n if (this.env.FORCE_COLOR) {\n return true;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 1000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n try {\n details = JSON.stringify(data);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n if (this.alepha.isViteDev()) {\n // Node.js - try to fix stack trace with Vite SSR helper\n // Actually, it works only because we have a global helper in viteAlephaDev.ts\n const gl = globalThis as Record<string, unknown>;\n if (typeof gl === \"object\" && typeof gl.ssrFixStacktrace === \"function\") {\n gl.ssrFixStacktrace(error);\n }\n }\n\n let str = error.stack ?? error.message;\n\n const anyError = error as any;\n while (anyError.cause && anyError.cause instanceof Error) {\n str += `\\nCaused by: ${anyError.cause.stack ?? anyError.cause.message}`;\n anyError.cause = anyError.cause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Minimalist logger module for Alepha.\n *\n * It offers a global logger interface (info, warn, ...) via the `$logger` primitive.\n *\n * ```ts\n * import { $logger } from \"alepha/logger\";\n *\n * class App {\n * log = $logger();\n * }\n * ```\n *\n * ### Formatting and Destinations\n *\n * `AlephaLogger` is **extensible**, destinations and formatters can be added or replaced.\n *\n * Default log destinations are:\n * - ConsoleDestinationProvider: logs to the console.\n * - MemoryDestinationProvider: stores logs in memory for later retrieval.\n *\n * Default log formatters are:\n * - JsonFormatterProvider: formats logs as JSON.\n * - SimpleFormatterProvider: formats logs as simple text (with colors when possible).\n * - RawFormatterProvider: formats logs as raw text without any formatting.\n *\n * ### Event Emission\n *\n * The logger emits 'log' events that can be listened to by external code, allowing for custom log processing and destinations.\n *\n * ```ts\n * class CustomDestination {\n * onLog = $hook({\n * on: \"log\",\n * handler: (ev) => {\n * // ev.message (formatted message)\n * // ev.entry (level, raw message, ...)\n * }\n * });\n * }\n * ```\n *\n * ### Log Level\n *\n * You can configure the log level and format via environment variables:\n *\n * - `LOG_LEVEL`: Sets the default log level for the application.\n * - `LOG_FORMAT`: Sets the default log format for the application.\n *\n * ```bash\n * LOG_LEVEL=debug LOG_FORMAT=json node src/index.ts\n * ```\n *\n * Log level is also available in the state as `logLevel`, which can be used to dynamically change the log level at runtime.\n * ```ts\n * alepha.state.set(\"alepha.logger.level\", \"debug\");\n * ```\n *\n * Log level is $module aware, meaning you can set different log levels for different modules.\n *\n * **Module-specific configuration:**\n * - `LOG_LEVEL=my.module.name:debug,info` - debug for `my.module.name` (and submodules), info for others\n * - `LOG_LEVEL=alepha:trace,my.app:error,info` - trace for alepha modules, error for my.app modules, info for others\n *\n * **Wildcard patterns (NEW):**\n * - `LOG_LEVEL=alepha.*:debug,info` - debug for all alepha submodules\n * - `LOG_LEVEL=*.test:silent,*.core:trace,info` - silent for test modules, trace for core modules\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [\n Logger,\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ConsoleColorProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !env.LOG_LEVEL) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (env.LOG_FORMAT) {\n if (env.LOG_FORMAT === \"json\") {\n return JsonFormatterProvider;\n }\n if (env.LOG_FORMAT === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n env.LOG_LEVEL ?? (alepha.isTest() ? \"trace\" : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(t.text({ lowercase: true })),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], { lowercase: true }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["envSchema"],"sources":["../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new Error(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n private matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && !!data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $env, $inject, Alepha, t } from \"alepha\";\n\nconst envSchema = t.object({\n /**\n * Disable colors in the console output.\n */\n NO_COLOR: t.optional(t.text()),\n\n /**\n * Force color output for the application.\n */\n FORCE_COLOR: t.optional(t.text()),\n});\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.env.NO_COLOR) {\n return false;\n }\n\n if (this.env.FORCE_COLOR) {\n return true;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 1000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n try {\n details = JSON.stringify(data);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n if (this.alepha.isViteDev()) {\n // Node.js - try to fix stack trace with Vite SSR helper\n // Actually, it works only because we have a global helper in viteAlephaDev.ts\n const gl = globalThis as Record<string, unknown>;\n if (typeof gl === \"object\" && typeof gl.ssrFixStacktrace === \"function\") {\n gl.ssrFixStacktrace(error);\n }\n }\n\n let str = error.stack ?? error.message;\n\n const anyError = error as any;\n while (anyError.cause && anyError.cause instanceof Error) {\n str += `\\nCaused by: ${anyError.cause.stack ?? anyError.cause.message}`;\n anyError.cause = anyError.cause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Minimalist logger module for Alepha.\n *\n * It offers a global logger interface (info, warn, ...) via the `$logger` primitive.\n *\n * ```ts\n * import { $logger } from \"alepha/logger\";\n *\n * class App {\n * log = $logger();\n * }\n * ```\n *\n * ### Formatting and Destinations\n *\n * `AlephaLogger` is **extensible**, destinations and formatters can be added or replaced.\n *\n * Default log destinations are:\n * - ConsoleDestinationProvider: logs to the console.\n * - MemoryDestinationProvider: stores logs in memory for later retrieval.\n *\n * Default log formatters are:\n * - JsonFormatterProvider: formats logs as JSON.\n * - SimpleFormatterProvider: formats logs as simple text (with colors when possible).\n * - RawFormatterProvider: formats logs as raw text without any formatting.\n *\n * ### Event Emission\n *\n * The logger emits 'log' events that can be listened to by external code, allowing for custom log processing and destinations.\n *\n * ```ts\n * class CustomDestination {\n * onLog = $hook({\n * on: \"log\",\n * handler: (ev) => {\n * // ev.message (formatted message)\n * // ev.entry (level, raw message, ...)\n * }\n * });\n * }\n * ```\n *\n * ### Log Level\n *\n * You can configure the log level and format via environment variables:\n *\n * - `LOG_LEVEL`: Sets the default log level for the application.\n * - `LOG_FORMAT`: Sets the default log format for the application.\n *\n * ```bash\n * LOG_LEVEL=debug LOG_FORMAT=json node src/index.ts\n * ```\n *\n * Log level is also available in the state as `logLevel`, which can be used to dynamically change the log level at runtime.\n * ```ts\n * alepha.state.set(\"alepha.logger.level\", \"debug\");\n * ```\n *\n * Log level is $module aware, meaning you can set different log levels for different modules.\n *\n * **Module-specific configuration:**\n * - `LOG_LEVEL=my.module.name:debug,info` - debug for `my.module.name` (and submodules), info for others\n * - `LOG_LEVEL=alepha:trace,my.app:error,info` - trace for alepha modules, error for my.app modules, info for others\n *\n * **Wildcard patterns (NEW):**\n * - `LOG_LEVEL=alepha.*:debug,info` - debug for all alepha submodules\n * - `LOG_LEVEL=*.test:silent,*.core:trace,info` - silent for test modules, trace for core modules\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [\n Logger,\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ConsoleColorProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !env.LOG_LEVEL) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (env.LOG_FORMAT) {\n if (env.LOG_FORMAT === \"json\") {\n return JsonFormatterProvider;\n }\n if (env.LOG_FORMAT === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n env.LOG_LEVEL ?? (alepha.isTest() ? \"trace\" : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":";;;;AAEA,IAAsB,yBAAtB,MAA6C;;;;ACA7C,IAAsB,uBAAtB,MAA2C;;;;ACU3C,IAAa,SAAb,MAA+C;CAC7C,AAAmB,SAAS,QAAQ,OAAO;CAC3C,AAAmB,YAAY,QAAQ,qBAAqB;CAC5D,AAAmB,cAAc,QAAQ,uBAAuB;CAChE,AAAmB,mBAAmB,QAAQ,iBAAiB;CAE/D,AAAmB,SAAiC;EAClD,QAAQ;EACR,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;EACR;CAED,AAAmB;CACnB,AAAmB;CACnB,AAAmB;CAEnB,AAAU,cAAsB;CAChC,AAAU,WAAqB;CAE/B,YAAY,SAAiB,QAAgB;AAC3C,OAAK,UAAU;AACf,OAAK,SAAS;AACd,OAAK,MAAM,KAAK,OAAO,IAAI;;CAG7B,IAAW,UAA8B;AACvC,SAAO,KAAK,OAAO,QAAQ,IAAY,UAAU;;CAGnD,IAAW,QAAgB;EACzB,MAAM,gBAAgB,KAAK,OAAO,MAAM,IAAI,sBAAsB;AAClE,MAAI,iBAAiB,kBAAkB,KAAK,aAAa;AACvD,QAAK,cAAc;AACnB,QAAK,WAAW,KAAK,WAAW,KAAK,aAAa,KAAK,OAAO;;AAEhE,SAAO,KAAK;;CAGd,AAAO,WAAW,OAAe,KAAuB;EACtD,MAAM,QAAQ,MAAM,aAAa,CAAC,MAAM,OAAO;AAG/C,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,cAAc,KAAK,MAAM;AAC/B,OAAI,CAAC,YAAa;AAElB,OAAI,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,IAAI,EAAE;IAC1D,MAAM,CAAC,eAAe,cAAc,YAAY,MAAM,OAAO;IAC7D,MAAM,gBAAgB,cAAc,MAAM;IAC1C,MAAM,eAAe,YAAY,MAAM;AAEvC,QAAI,CAAC,aAAc;AAEnB,QAAI,KAAK,eAAe,KAAK,cAAc,CACzC,KAAI;AACF,YAAO,KAAK,WAAW,aAAa;aAC7B,OAAO;AACd,WAAM,IAAI,YACR,sBAAsB,YAAY,MAAM,CAAC,wBAAwB,cAAc,GAChF;;;;AAOT,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,cAAc,KAAK,MAAM;AAC/B,OAAI,CAAC,YAAa;AAElB,OAAI,CAAC,YAAY,SAAS,IAAI,IAAI,CAAC,YAAY,SAAS,IAAI,CAC1D,KAAI;AACF,WAAO,KAAK,WAAW,YAAY;YAC5B,OAAO;AACd,UAAM,IAAI,MAAM,6BAA6B,YAAY,GAAG;;;AAKlE,SAAO;;CAGT,AAAQ,eAAe,YAAoB,SAA0B;AACnE,MAAI,QAAQ,SAAS,IAAI,EAAE;GAEzB,MAAM,eAAe,QAAQ,QAAQ,OAAO,MAAM,CAAC,QAAQ,OAAO,KAAK;AACvE,2BAAO,IAAI,OAAO,IAAI,eAAe,EAAC,KAAK,WAAW;;AAIxD,SAAO,WAAW,WAAW,QAAQ;;CAGvC,AAAO,WAAW,WAA6B;EAC7C,MAAM,QAAQ,UAAU,MAAM,CAAC,aAAa;AAC5C,MAAI,KAAK,OAAO,WAAW,OACzB,QAAO;AAGT,QAAM,IAAI,YAAY,sBAAsB,YAAY;;CAK1D,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,IAAI,SAAS,SAAS,KAAK;;CAGlC,AAAO,KAAK,SAAiB,MAAsB;AACjD,OAAK,IAAI,QAAQ,SAAS,KAAK;;CAGjC,AAAO,KAAK,SAAiB,MAAsB;AACjD,OAAK,IAAI,QAAQ,SAAS,KAAK;;CAGjC,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,IAAI,SAAS,SAAS,KAAK;;CAGlC,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,IAAI,SAAS,SAAS,KAAK;;CAGlC,AAAU,IAAI,OAAiB,SAAiB,MAAsB;EACpE,IAAI,WAAW;AACf,MAAI,OAAO,YAAY,SACrB,YAAW;WACF,OAAO,SAAS,SACzB,YAAW;EAGb,IAAI;AACJ,MAAI,OAAO,SAAS,YAAY,CAAC,CAAC,KAChC,SAAQ;WACC,OAAO,YAAY,YAAY,QACxC,SAAQ;EAGV,MAAM,WAAqB;GACzB;GACA,SAAS;GACT,MAAM;GACN,SAAS,KAAK;GACd,SAAS,KAAK;GACd,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,WAAW,KAAK,iBAAiB,WAAW;GAC7C;AAED,MAAI,KAAK,OAAO,SAAS,KAAK,OAAO,KAAK,QAAQ;AAChD,QAAK,KAAK,SAAS;AACnB;;EAGF,MAAM,YAAY,KAAK,UAAU,OAAO,SAAS;AAEjD,OAAK,KAAK,UAAU,UAAU;AAE9B,OAAK,YAAY,MAAM,WAAW,SAAS;;CAG7C,AAAU,KAAK,OAAiB,SAAkB;AAChD,OAAK,OAAO,OACT,KACC,OACA;GACE;GACA;GACD,EACD,EACE,OAAO,MACR,CACF,CACA,YAAY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;ACvKxB,MAAa,WAAW,UAAkC,EAAE,KAAa;CACvE,MAAM,EAAE,QAAQ,SAAS,WAAW,UAAU;AAE9C,QAAO,QAAQ,QAAQ;EACrB,UAAU;EACV,MAAM,CACJ,QAAQ,QAAQ,SAAS,QAAQ,QACjC,QAAQ,QAAQ,OAAO,IAAI,eAAe,MAC3C;EACF,CAAC;;AAOJ,QAAQ,QAAQ;;;;ACpChB,MAAMA,cAAY,EAAE,OAAO;CAIzB,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC;CAK9B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,IAAa,uBAAb,MAAa,qBAAqB;CAChC,OAAgB,SAAS;EACvB,OAAO;EACP,OAAO;EACP,KAAK;EACL,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,iBAAiB;EACjB,WAAW;EACX,gBAAgB;EAChB,OAAO;EACP,YAAY;EAEZ,QAAQ;EACR,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;EACR;CAED,AAAmB,MAAM,KAAKA,YAAU;CACxC,AAAmB,SAAS,QAAQ,OAAO;CAE3C,AAAU,UAAU;CAEpB,cAAc;AACZ,OAAK,UAAU,KAAK,WAAW;;CAGjC,AAAO,YAAqB;AAC1B,MAAI,KAAK,IAAI,SACX,QAAO;AAGT,MAAI,KAAK,IAAI,YACX,QAAO;AAGT,SAAO,CAAC,KAAK,OAAO,cAAc;;CAGpC,AAAO,IACL,OACA,MACA,QAAgB,qBAAqB,OAAO,OACpC;AACR,MAAI,CAAC,KAAK,QACR,QAAO;AAGT,SAAO,GAAG,qBAAqB,OAAO,SAAS,OAAO;;;;;;ACnE1D,IAAa,6BAAb,cAAgD,uBAAuB;CACrE,AAAO,MAAM,SAAuB;AAClC,UAAQ,IAAI,QAAQ;;;;;;ACDxB,IAAa,wBAAb,cAA2C,qBAAqB;CAC9D,AAAO,OAAO,OAAyB;EACrC,MAAM,OAA4B;GAChC,OAAO,MAAM;GACb,SAAS,MAAM;GACf,SAAS,MAAM;GACf,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,KAAK,MAAM;GACX,MAAM,MAAM;GACb;AAED,MAAI,MAAM,gBAAgB,MACxB,MAAK,QAAQ,KAAK,gBAAgB,MAAM,KAAK;MAE7C,MAAK,OAAO,MAAM;AAGpB,SAAO,KAAK,UAAU,KAAK;;CAG7B,AAAO,gBAAgB,OAAsB;AAC3C,SAAO;GACL,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,OAAO,MAAM;GACb,OACE,MAAM,iBAAiB,QACnB,KAAK,gBAAgB,MAAM,MAAM,GACjC;GACP;;;;;;AC9BL,IAAa,4BAAb,cAA+C,uBAAuB;CACpE,AAAU,UAAmD,EAAE;CAE/D,AAAgB,UAAU,EACxB,YAAY,KACb;CAED,AAAO,MAAM,WAAmB,OAAuB;AACrD,OAAK,QAAQ,KAAK;GAAE,GAAG;GAAO;GAAW,CAAC;AAE1C,MAAI,KAAK,QAAQ,SAAS,KAAK,QAAQ,WACrC,MAAK,UAAU,KAAK,QAAQ,MAC1B,CAAC,KAAK,MAAM,KAAK,QAAQ,aAAa,GAAI,CAC3C;;CAIL,IAAW,OAAO;AAChB,SAAO,CAAC,GAAG,KAAK,QAAQ;;CAG1B,AAAO,QAAc;AACnB,OAAK,UAAU,EAAE;;;;;;ACpBrB,IAAa,0BAAb,cAA6C,qBAAqB;CAChE,AAAU,QAAQ,QAAQ,qBAAqB;CAC/C,AAAU,SAAS,QAAQ,OAAO;CAElC,AAAO,OAAO,OAAyB;EACrC,MAAM,EAAE,MAAM,cAAc;EAE5B,IAAI,SAAS;EACb,IAAI,UAAU;EAEd,MAAM,UAAU,gBAAgB;AAChC,MAAI,QACF,WAAU,KAAK,YAAY,KAAK;WACvB,KACT,KAAI;AACF,aAAU,KAAK,UAAU,KAAK;UACxB;AACN,aAAU;;AAId,YAAU,KAAK,MAAM,IACnB,aACA,IAAI,KAAK,gBAAgB,UAAU,CAAC,GACrC;AACD,YAAU;AAEV,YAAU,KAAK,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,aAAa,CAAC;AAChE,YAAU;AAEV,MAAI,MAAM,KAAK;AACb,aAAU,KAAK,MAAM,IAAI,aAAa,GAAG,MAAM,MAAM;AACrD,aAAU;;AAGZ,MAAI,MAAM,SAAS;AACjB,aAAU,KAAK,MAAM,IACnB,aACA,IAAI,KAAK,cAAc,MAAM,QAAQ,CAAC,GACvC;AACD,aAAU;;EAGZ,MAAM,SAAS,KAAK,MAAM,IAAI,cAAc,GAAG,MAAM,OAAO,GAAG;EAC/D,MAAM,UAAU,KAAK,MAAM,IACzB,KAAK,OAAO,WAAW,GAAG,UAAU,SACpC,MAAM,QACP;AAED,YAAU,IAAI,SAAS,QAAQ;AAE/B,MAAI,MAAM,QACR,WAAU,KAAK,KAAK,MAAM,IAAI,QAAQ,MAAM,QAAQ;MAEpD,WAAU;AAGZ,MAAI,QACF,KAAI,QACF,WAAU,MAAM;MAEhB,WAAU,IAAI,KAAK,MAAM,IAAI,aAAa,QAAQ;AAItD,SAAO;;CAGT,AAAO,gBAAgB,WAA2B;EAChD,MAAM,IAAI,IAAI,KAAK,UAAU;EAC7B,MAAM,IAAI,EAAE,UAAU;EACtB,MAAM,IAAI,EAAE,YAAY;EACxB,MAAM,IAAI,EAAE,YAAY;EACxB,MAAM,KAAK,EAAE,iBAAiB;AAE9B,SAAO,GAAG,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,KAAK,GAAG;;CAGzE,AAAU,QAAQ,OAAe,IAAI,KAAK,MAAM,MAAM;CACtD,AAAU,QAAQ,MAChB,IAAI,KAAK,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG;;;;CAK7C,AAAU,cAAc,SAAyB;AAC/C,MAAI,KAAK,OAAO,cAAc,CAC5B,QAAO;AAGT,SAAO,QAAQ,MAAM,GAAG,EAAE;;CAG5B,AAAU,YAAY,OAAsB;AAG1C,MAAI,KAAK,OAAO,WAAW,EAAE;AAE3B,oBAAiB;AACf,YAAQ,MAAM,MAAM;KACpB;AACF,UAAO;;AAGT,MAAI,KAAK,OAAO,WAAW,EAAE;GAG3B,MAAM,KAAK;AACX,OAAI,OAAO,OAAO,YAAY,OAAO,GAAG,qBAAqB,WAC3D,IAAG,iBAAiB,MAAM;;EAI9B,IAAI,MAAM,MAAM,SAAS,MAAM;EAE/B,MAAM,WAAW;AACjB,SAAO,SAAS,SAAS,SAAS,iBAAiB,OAAO;AACxD,UAAO,gBAAgB,SAAS,MAAM,SAAS,SAAS,MAAM;AAC9D,YAAS,QAAQ,SAAS,MAAM;;AAGlC,SAAO;;;;;;AC3HX,IAAa,uBAAb,cAA0C,qBAAqB;CAC7D,AAAO,OAAO,OAAyB;EACrC,IAAI,SAAS;AAEb,YAAU,GAAG,MAAM;AAEnB,MAAI,MAAM,gBAAgB,OAAO;AAC/B,aAAU,KAAK,MAAM,KAAK;GAC1B,IAAI,QAAQ,MAAM,KAAK;AACvB,UAAO,iBAAiB,OAAO;AAC7B,cAAU,gBAAgB,MAAM;AAChC,YAAQ,MAAM;;;AAIlB,SAAO;;;;;;AChBX,MAAa,iBAAiB,EAAE,OAAO;CACrC,OAAO,EAAE,KAAK;EAAC;EAAU;EAAS;EAAS;EAAQ;EAAQ;EAAQ,CAAC;CACpE,SAAS,EAAE,KAAK,EACd,MAAM,QACP,CAAC;CACF,SAAS,EAAE,MAAM;CACjB,QAAQ,EAAE,MAAM;CAChB,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;CAC7B,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC;CACzB,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC;CACzB,WAAW,EAAE,QAAQ;CACtB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACmFF,MAAa,eAAe,QAAQ;CAClC,MAAM;CACN,YAAY,CAAC,QAAQ;CACrB,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,WAAW,WAAW;EACpB,MAAM,MAAM,OAAO,SAAS,UAAU;EAEtC,MAAM,kCAAkC;AAGtC,OAAI,OAAO,QAAQ,IAAI,CAAC,IAAI,WAAW;IACrC,MAAM,gBAAgB,OAAY;AAChC,SAAI,GAAG,MAAM,QAAQ,UAAU,QAAQ;MACrC,MAAM,SAAS,OAAO,OAAO,0BAA0B;AACvD,WAAK,MAAM,OAAO,OAAO,KACvB,SAAQ,IAAI,IAAI,UAAU;;;AAKhC,QAAI;AACF,YAAO,MAAM,IAAI,wBAAwB,GAAG,aAAa;AACzD,YAAO,MAAM,IAAI,6BAA6B,GAAG,aAAa;YACxD;AAIR,WAAO;;AAGT,UAAO;;EAGT,MAAM,gCAAgC;AACpC,OAAI,IAAI,YAAY;AAClB,QAAI,IAAI,eAAe,OACrB,QAAO;AAET,QAAI,IAAI,eAAe,MACrB,QAAO;AAET,WAAO;;AAGT,OAAI,OAAO,cAAc,IAAI,CAAC,OAAO,WAAW,CAC9C,QAAO;AAGT,UAAO;;AAGT,SAAO,KAAK;GACV,UAAU;GACV,SAAS;GACT,KAAK,2BAA2B;GACjC,CAAC;AAEF,SAAO,KAAK;GACV,UAAU;GACV,SAAS;GACT,KAAK,yBAAyB;GAC/B,CAAC;AAEF,SAAO,MAAM,IACX,iBACA,OAAO,OAAO,QAAQ;GACpB,UAAU;GACV,MAAM,CAAC,UAAU,cAAc;GAChC,CAAC,CACH;AAED,SAAO,MAAM,IACX,uBACA,IAAI,cAAc,OAAO,QAAQ,GAAG,UAAU,QAC/C;;CAEJ,CAAC;AAIF,MAAM,YAAY,EAAE,OAAO;CAiBzB,WAAW,EAAE,SACX,EAAE,KAAK;EACL,aAAa;;;;;EAKb,WAAW;EACZ,CAAC,CACH;CAQD,YAAY,EAAE,SACZ,EAAE,KAAK;EAAC;EAAQ;EAAU;EAAM,EAAE;EAChC,aAAa;EACb,WAAW;EACZ,CAAC,CACH;CACF,CAAC"}
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/mcp/errors/McpError.ts","../../src/mcp/interfaces/McpTypes.ts","../../src/mcp/helpers/jsonrpc.ts","../../src/mcp/primitives/$resource.ts","../../src/mcp/primitives/$tool.ts","../../src/mcp/providers/McpServerProvider.ts","../../src/mcp/primitives/$prompt.ts","../../src/mcp/transports/SseMcpTransport.ts","../../src/mcp/transports/StdioMcpTransport.ts","../../src/mcp/index.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/mcp/errors/McpError.ts","../../src/mcp/interfaces/McpTypes.ts","../../src/mcp/helpers/jsonrpc.ts","../../src/mcp/primitives/$resource.ts","../../src/mcp/primitives/$tool.ts","../../src/mcp/providers/McpServerProvider.ts","../../src/mcp/primitives/$prompt.ts","../../src/mcp/transports/SseMcpTransport.ts","../../src/mcp/transports/StdioMcpTransport.ts","../../src/mcp/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/mcp/index.js
CHANGED
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["t"],"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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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["t"],"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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"}
|