@denispro2006/duke-ai-kernel 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +81 -0
  2. package/config/prompts/default.txt +1 -0
  3. package/config/routing.json +24 -0
  4. package/dist/api/routes.d.ts +3 -0
  5. package/dist/api/routes.d.ts.map +1 -0
  6. package/dist/api/routes.js +114 -0
  7. package/dist/api/routes.js.map +1 -0
  8. package/dist/app.d.ts +7 -0
  9. package/dist/app.d.ts.map +1 -0
  10. package/dist/app.js +21 -0
  11. package/dist/app.js.map +1 -0
  12. package/dist/config/index.d.ts +50 -0
  13. package/dist/config/index.d.ts.map +1 -0
  14. package/dist/config/index.js +86 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/context/context-manager.d.ts +30 -0
  17. package/dist/context/context-manager.d.ts.map +1 -0
  18. package/dist/context/context-manager.js +77 -0
  19. package/dist/context/context-manager.js.map +1 -0
  20. package/dist/controllers/ai.controller.d.ts +3 -0
  21. package/dist/controllers/ai.controller.d.ts.map +1 -0
  22. package/dist/controllers/ai.controller.js +20 -0
  23. package/dist/controllers/ai.controller.js.map +1 -0
  24. package/dist/controllers/message.controller.d.ts +4 -0
  25. package/dist/controllers/message.controller.d.ts.map +1 -0
  26. package/dist/controllers/message.controller.js +28 -0
  27. package/dist/controllers/message.controller.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +31 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/kernel/index.d.ts +17 -0
  33. package/dist/kernel/index.d.ts.map +1 -0
  34. package/dist/kernel/index.js +134 -0
  35. package/dist/kernel/index.js.map +1 -0
  36. package/dist/lib/logger.d.ts +3 -0
  37. package/dist/lib/logger.d.ts.map +1 -0
  38. package/dist/lib/logger.js +15 -0
  39. package/dist/lib/logger.js.map +1 -0
  40. package/dist/middleware/auth.middleware.d.ts +3 -0
  41. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  42. package/dist/middleware/auth.middleware.js +24 -0
  43. package/dist/middleware/auth.middleware.js.map +1 -0
  44. package/dist/middleware/error.middleware.d.ts +6 -0
  45. package/dist/middleware/error.middleware.d.ts.map +1 -0
  46. package/dist/middleware/error.middleware.js +16 -0
  47. package/dist/middleware/error.middleware.js.map +1 -0
  48. package/dist/models/Message.d.ts +10 -0
  49. package/dist/models/Message.d.ts.map +1 -0
  50. package/dist/models/Message.js +3 -0
  51. package/dist/models/Message.js.map +1 -0
  52. package/dist/models/User.d.ts +7 -0
  53. package/dist/models/User.d.ts.map +1 -0
  54. package/dist/models/User.js +3 -0
  55. package/dist/models/User.js.map +1 -0
  56. package/dist/plugins/index.d.ts +10 -0
  57. package/dist/plugins/index.d.ts.map +1 -0
  58. package/dist/plugins/index.js +74 -0
  59. package/dist/plugins/index.js.map +1 -0
  60. package/dist/providers/anthropic.d.ts +3 -0
  61. package/dist/providers/anthropic.d.ts.map +1 -0
  62. package/dist/providers/anthropic.js +65 -0
  63. package/dist/providers/anthropic.js.map +1 -0
  64. package/dist/providers/index.d.ts +8 -0
  65. package/dist/providers/index.d.ts.map +1 -0
  66. package/dist/providers/index.js +38 -0
  67. package/dist/providers/index.js.map +1 -0
  68. package/dist/providers/ollama.d.ts +3 -0
  69. package/dist/providers/ollama.d.ts.map +1 -0
  70. package/dist/providers/ollama.js +77 -0
  71. package/dist/providers/ollama.js.map +1 -0
  72. package/dist/providers/openai.d.ts +3 -0
  73. package/dist/providers/openai.d.ts.map +1 -0
  74. package/dist/providers/openai.js +63 -0
  75. package/dist/providers/openai.js.map +1 -0
  76. package/dist/router/index.d.ts +13 -0
  77. package/dist/router/index.d.ts.map +1 -0
  78. package/dist/router/index.js +70 -0
  79. package/dist/router/index.js.map +1 -0
  80. package/dist/routes/ai.routes.d.ts +3 -0
  81. package/dist/routes/ai.routes.d.ts.map +1 -0
  82. package/dist/routes/ai.routes.js +9 -0
  83. package/dist/routes/ai.routes.js.map +1 -0
  84. package/dist/routes/index.d.ts +2 -0
  85. package/dist/routes/index.d.ts.map +1 -0
  86. package/dist/routes/index.js +6 -0
  87. package/dist/routes/index.js.map +1 -0
  88. package/dist/services/ai.service.d.ts +4 -0
  89. package/dist/services/ai.service.d.ts.map +1 -0
  90. package/dist/services/ai.service.js +28 -0
  91. package/dist/services/ai.service.js.map +1 -0
  92. package/dist/services/db.service.d.ts +3 -0
  93. package/dist/services/db.service.d.ts.map +1 -0
  94. package/dist/services/db.service.js +60 -0
  95. package/dist/services/db.service.js.map +1 -0
  96. package/dist/services/kernel.service.d.ts +4 -0
  97. package/dist/services/kernel.service.d.ts.map +1 -0
  98. package/dist/services/kernel.service.js +14 -0
  99. package/dist/services/kernel.service.js.map +1 -0
  100. package/dist/types.d.ts +72 -0
  101. package/dist/types.d.ts.map +1 -0
  102. package/dist/types.js +3 -0
  103. package/dist/types.js.map +1 -0
  104. package/dist/utils/helpers.d.ts +6 -0
  105. package/dist/utils/helpers.d.ts.map +1 -0
  106. package/dist/utils/helpers.js +24 -0
  107. package/dist/utils/helpers.js.map +1 -0
  108. package/dist/utils/logger.d.ts +2 -0
  109. package/dist/utils/logger.d.ts.map +1 -0
  110. package/dist/utils/logger.js +6 -0
  111. package/dist/utils/logger.js.map +1 -0
  112. package/dist/workers/aiWorker.d.ts +6 -0
  113. package/dist/workers/aiWorker.d.ts.map +1 -0
  114. package/dist/workers/aiWorker.js +42 -0
  115. package/dist/workers/aiWorker.js.map +1 -0
  116. package/dist/ws/gateway.d.ts +3 -0
  117. package/dist/ws/gateway.d.ts.map +1 -0
  118. package/dist/ws/gateway.js +110 -0
  119. package/dist/ws/gateway.js.map +1 -0
  120. package/package.json +68 -0
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("dotenv/config");
7
+ const http_1 = __importDefault(require("http"));
8
+ const ws_1 = require("ws");
9
+ const app_1 = require("./app");
10
+ const gateway_1 = require("./ws/gateway");
11
+ const config_1 = require("./config");
12
+ const logger_1 = require("./lib/logger");
13
+ const kernel_1 = require("./kernel");
14
+ const app = (0, app_1.buildApp)();
15
+ const server = http_1.default.createServer(app);
16
+ const wss = new ws_1.WebSocketServer({ server, path: '/ws' });
17
+ (0, gateway_1.createWsGateway)(wss);
18
+ server.listen(config_1.config.port, () => {
19
+ logger_1.logger.info({ port: config_1.config.port, env: config_1.config.nodeEnv }, 'duke-ai-kernel started');
20
+ });
21
+ async function shutdown(signal) {
22
+ logger_1.logger.info({ signal }, 'Shutdown signal received');
23
+ await kernel_1.kernel.shutdown();
24
+ server.close(() => {
25
+ logger_1.logger.info('HTTP server closed');
26
+ process.exit(0);
27
+ });
28
+ }
29
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
30
+ process.on('SIGINT', () => shutdown('SIGINT'));
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,yBAAsB;AACtB,gDAAuB;AACvB,2BAAoC;AACpC,+BAAgC;AAChC,0CAA8C;AAC9C,qCAAiC;AACjC,yCAAqC;AACrC,qCAAiC;AAEjC,MAAM,GAAG,GAAG,IAAA,cAAQ,GAAE,CAAA;AACtB,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AAErC,MAAM,GAAG,GAAG,IAAI,oBAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACxD,IAAA,yBAAe,EAAC,GAAG,CAAC,CAAA;AAEpB,MAAM,CAAC,MAAM,CAAC,eAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IAC9B,eAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAM,CAAC,IAAI,EAAE,GAAG,EAAE,eAAM,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAA;AACnF,CAAC,CAAC,CAAA;AAEF,KAAK,UAAU,QAAQ,CAAC,MAAc;IACpC,eAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAA;IACnD,MAAM,eAAM,CAAC,QAAQ,EAAE,CAAA;IACvB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QAChB,eAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;AAChD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { KernelRequest, KernelResponse, KernelPlugin } from '../types';
2
+ export declare class AIKernel {
3
+ private plugins;
4
+ private postPlugins;
5
+ private streamListeners;
6
+ private abortSignals;
7
+ use(plugin: KernelPlugin): void;
8
+ onStream(conversationId: string, listener: (chunk: string) => void): void;
9
+ offStream(conversationId: string): void;
10
+ abort(conversationId: string): void;
11
+ process(request: KernelRequest): Promise<KernelResponse>;
12
+ private executeWithRetry;
13
+ private executeWithStream;
14
+ shutdown(): Promise<void>;
15
+ }
16
+ export declare const kernel: AIKernel;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAA0B,MAAM,UAAU,CAAA;AAQ9F,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,YAAY,CAAyB;IAE7C,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAI/B,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIzE,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIvC,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;YAkDhD,gBAAgB;YAqChB,iBAAiB;IA2CzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC;AAED,eAAO,MAAM,MAAM,UAAiB,CAAA"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.kernel = exports.AIKernel = void 0;
4
+ const context_manager_1 = require("../context/context-manager");
5
+ const router_1 = require("../router");
6
+ const plugins_1 = require("../plugins");
7
+ const config_1 = require("../config");
8
+ const logger_1 = require("../lib/logger");
9
+ const helpers_1 = require("../utils/helpers");
10
+ class AIKernel {
11
+ plugins = [...plugins_1.defaultPlugins];
12
+ postPlugins = [...plugins_1.postPlugins];
13
+ streamListeners = new Map();
14
+ abortSignals = new Set();
15
+ use(plugin) {
16
+ this.plugins.push(plugin);
17
+ }
18
+ onStream(conversationId, listener) {
19
+ this.streamListeners.set(conversationId, listener);
20
+ }
21
+ offStream(conversationId) {
22
+ this.streamListeners.delete(conversationId);
23
+ }
24
+ abort(conversationId) {
25
+ this.abortSignals.add(conversationId);
26
+ }
27
+ async process(request) {
28
+ const requestId = request.id ?? (0, helpers_1.generateId)('req');
29
+ logger_1.logger.info({ requestId, conversationId: request.conversationId }, 'Processing request');
30
+ if (!context_manager_1.contextManager.has(request.conversationId)) {
31
+ await context_manager_1.contextManager.create(request.conversationId);
32
+ }
33
+ const { messages: history, systemPrompt } = await context_manager_1.contextManager.getForRequest(request.conversationId);
34
+ const fullMessages = [
35
+ ...(systemPrompt ? [{ role: 'system', content: systemPrompt }] : []),
36
+ ...history,
37
+ ...request.messages,
38
+ ];
39
+ const enrichedRequest = { ...request, messages: fullMessages };
40
+ const ctx = {
41
+ request: enrichedRequest,
42
+ metadata: {},
43
+ };
44
+ await (0, plugins_1.runPipeline)(this.plugins, ctx, 'pre');
45
+ const { provider, model, providerName } = router_1.router.resolve(ctx.request);
46
+ const resolvedModel = model;
47
+ logger_1.logger.debug({ model: resolvedModel, providerName }, 'Provider resolved');
48
+ const streamListener = this.streamListeners.get(request.conversationId);
49
+ let response;
50
+ if (streamListener) {
51
+ response = await this.executeWithStream(ctx, provider, resolvedModel, request.conversationId, streamListener);
52
+ }
53
+ else {
54
+ response = await this.executeWithRetry(ctx, provider, resolvedModel);
55
+ }
56
+ ctx.response = response;
57
+ await (0, plugins_1.runPipeline)(this.postPlugins, ctx, 'post');
58
+ await context_manager_1.contextManager.append(request.conversationId, [
59
+ ...request.messages,
60
+ response.message,
61
+ ]);
62
+ return response;
63
+ }
64
+ async executeWithRetry(ctx, provider, model) {
65
+ let lastError;
66
+ for (let attempt = 0; attempt <= config_1.config.worker.retryLimit; attempt++) {
67
+ try {
68
+ const completion = await Promise.race([
69
+ provider.complete({ model, messages: ctx.request.messages, options: ctx.request.options }),
70
+ new Promise((_, reject) => setTimeout(() => reject(new Error('TIMEOUT')), config_1.config.worker.timeoutMs)),
71
+ ]);
72
+ return {
73
+ id: (0, helpers_1.generateId)('cmpl'),
74
+ conversationId: ctx.request.conversationId,
75
+ ...completion,
76
+ };
77
+ }
78
+ catch (err) {
79
+ lastError = err;
80
+ const status = err.status;
81
+ if (attempt < config_1.config.worker.retryLimit && status && (0, helpers_1.isRetryableStatus)(status)) {
82
+ const delay = (0, helpers_1.exponentialBackoff)(attempt, config_1.config.worker.retryDelayMs);
83
+ logger_1.logger.warn({ attempt, delay, status }, 'Retrying after error');
84
+ await (0, helpers_1.sleep)(delay);
85
+ }
86
+ else {
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ throw lastError ?? new Error('LLM call failed');
92
+ }
93
+ async executeWithStream(ctx, provider, model, conversationId, listener) {
94
+ let fullContent = '';
95
+ let index = 0;
96
+ const stream = provider.stream({ model, messages: ctx.request.messages, options: ctx.request.options });
97
+ for await (const chunk of stream) {
98
+ if (this.abortSignals.has(conversationId)) {
99
+ this.abortSignals.delete(conversationId);
100
+ return {
101
+ id: (0, helpers_1.generateId)('cmpl'),
102
+ conversationId,
103
+ message: { role: 'assistant', content: fullContent },
104
+ usage: { promptTokens: 0, completionTokens: index, totalTokens: index },
105
+ finishReason: 'aborted',
106
+ model,
107
+ };
108
+ }
109
+ fullContent += chunk;
110
+ listener(chunk);
111
+ index++;
112
+ }
113
+ return {
114
+ id: (0, helpers_1.generateId)('cmpl'),
115
+ conversationId,
116
+ message: { role: 'assistant', content: fullContent },
117
+ usage: {
118
+ promptTokens: provider.countTokens(ctx.request.messages),
119
+ completionTokens: Math.ceil(fullContent.length / 4),
120
+ totalTokens: provider.countTokens(ctx.request.messages) + Math.ceil(fullContent.length / 4),
121
+ },
122
+ finishReason: 'stop',
123
+ model,
124
+ };
125
+ }
126
+ async shutdown() {
127
+ logger_1.logger.info('Kernel shutting down');
128
+ this.streamListeners.clear();
129
+ this.abortSignals.clear();
130
+ }
131
+ }
132
+ exports.AIKernel = AIKernel;
133
+ exports.kernel = new AIKernel();
134
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kernel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import pino from 'pino';
2
+ export declare const logger: pino.Logger<never, boolean>;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,eAAO,MAAM,MAAM,6BAMjB,CAAA"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = void 0;
7
+ const pino_1 = __importDefault(require("pino"));
8
+ const config_1 = require("../config");
9
+ exports.logger = (0, pino_1.default)({
10
+ level: config_1.config.logLevel,
11
+ transport: config_1.config.nodeEnv === 'development'
12
+ ? { target: 'pino-pretty', options: { colorize: true } }
13
+ : undefined,
14
+ });
15
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,sCAAkC;AAErB,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC;IACzB,KAAK,EAAE,eAAM,CAAC,QAAQ;IACtB,SAAS,EACP,eAAM,CAAC,OAAO,KAAK,aAAa;QAC9B,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACxD,CAAC,CAAC,SAAS;CAChB,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function authMiddleware(req: Request, res: Response, next: NextFunction): void;
3
+ //# sourceMappingURL=auth.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAIzD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAoBpF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authMiddleware = authMiddleware;
4
+ const config_1 = require("../config");
5
+ const logger_1 = require("../lib/logger");
6
+ function authMiddleware(req, res, next) {
7
+ if (config_1.config.auth.bypass) {
8
+ next();
9
+ return;
10
+ }
11
+ const authHeader = req.headers['authorization'];
12
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
13
+ res.status(401).json({ error: 'UNAUTHORIZED', message: 'Missing or invalid Authorization header' });
14
+ return;
15
+ }
16
+ const token = authHeader.slice(7);
17
+ if (token !== config_1.config.auth.secret) {
18
+ logger_1.logger.warn({ ip: req.ip }, 'Auth failed — invalid token');
19
+ res.status(401).json({ error: 'UNAUTHORIZED', message: 'Invalid bearer token' });
20
+ return;
21
+ }
22
+ next();
23
+ }
24
+ //# sourceMappingURL=auth.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.middleware.js","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":";;AAIA,wCAoBC;AAvBD,sCAAkC;AAClC,0CAAsC;AAEtC,SAAgB,cAAc,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC5E,IAAI,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,EAAE,CAAA;QACN,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC/C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAA;QACnG,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,KAAK,KAAK,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,eAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,6BAA6B,CAAC,CAAA;QAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;QAChF,OAAM;IACR,CAAC;IAED,IAAI,EAAE,CAAA;AACR,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function errorMiddleware(err: Error & {
3
+ status?: number;
4
+ code?: string;
5
+ }, req: Request, res: Response, _next: NextFunction): void;
6
+ //# sourceMappingURL=error.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/error.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGzD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,KAAK,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EAEb,KAAK,EAAE,YAAY,GAClB,IAAI,CAUN"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.errorMiddleware = errorMiddleware;
4
+ const logger_1 = require("../lib/logger");
5
+ function errorMiddleware(err, req, res,
6
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
7
+ _next) {
8
+ logger_1.logger.error({ err, path: req.path, method: req.method }, 'Unhandled error');
9
+ const status = err.status ?? 500;
10
+ const code = err.code ?? 'INTERNAL_ERROR';
11
+ res.status(status).json({
12
+ error: code,
13
+ message: err.message || 'An unexpected error occurred',
14
+ });
15
+ }
16
+ //# sourceMappingURL=error.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.middleware.js","sourceRoot":"","sources":["../../src/middleware/error.middleware.ts"],"names":[],"mappings":";;AAGA,0CAgBC;AAlBD,0CAAsC;AAEtC,SAAgB,eAAe,CAC7B,GAA+C,EAC/C,GAAY,EACZ,GAAa;AACb,6DAA6D;AAC7D,KAAmB;IAEnB,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAA;IAE5E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAA;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,gBAAgB,CAAA;IAEzC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QACtB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,8BAA8B;KACvD,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Role } from '../types';
2
+ export type MessageRecord = {
3
+ id: string;
4
+ conversationId: string;
5
+ role: Role;
6
+ content: string;
7
+ metadata?: Record<string, unknown>;
8
+ createdAt: Date;
9
+ };
10
+ //# sourceMappingURL=Message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../src/models/Message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Message.js","sourceRoot":"","sources":["../../src/models/Message.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export type User = {
2
+ id: string;
3
+ email: string;
4
+ createdAt: Date;
5
+ updatedAt: Date;
6
+ };
7
+ //# sourceMappingURL=User.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.d.ts","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=User.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { KernelPlugin, PluginContext } from '../types';
2
+ export declare const systemPromptPlugin: KernelPlugin;
3
+ export declare const tokenCountPlugin: KernelPlugin;
4
+ export declare const profanityFilterPlugin: KernelPlugin;
5
+ export declare const responseLogPlugin: KernelPlugin;
6
+ export declare const rateLimitPlugin: KernelPlugin;
7
+ export declare const defaultPlugins: KernelPlugin[];
8
+ export declare const postPlugins: KernelPlugin[];
9
+ export declare function runPipeline(plugins: KernelPlugin[], ctx: PluginContext, phase: 'pre' | 'post'): Promise<void>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAItD,eAAO,MAAM,kBAAkB,EAAE,YAYhC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,YAW9B,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,YAKnC,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,YAgB/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,YAK7B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EAKxC,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,YAAY,EAAwB,CAAA;AAE9D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EAAE,EACvB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,KAAK,GAAG,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postPlugins = exports.defaultPlugins = exports.rateLimitPlugin = exports.responseLogPlugin = exports.profanityFilterPlugin = exports.tokenCountPlugin = exports.systemPromptPlugin = void 0;
4
+ exports.runPipeline = runPipeline;
5
+ const logger_1 = require("../lib/logger");
6
+ const config_1 = require("../config");
7
+ exports.systemPromptPlugin = {
8
+ name: 'system-prompt',
9
+ pre: async (ctx, next) => {
10
+ const hasSystem = ctx.request.messages.some((m) => m.role === 'system');
11
+ if (!hasSystem) {
12
+ ctx.request.messages = [
13
+ { role: 'system', content: config_1.config.systemPrompt.text },
14
+ ...ctx.request.messages,
15
+ ];
16
+ }
17
+ await next();
18
+ },
19
+ };
20
+ exports.tokenCountPlugin = {
21
+ name: 'token-count',
22
+ pre: async (ctx, next) => {
23
+ const estimated = ctx.request.messages.reduce((sum, m) => sum + Math.ceil(m.content.length / 4) + 4, 0);
24
+ ctx.metadata['estimatedPromptTokens'] = estimated;
25
+ logger_1.logger.debug({ estimatedPromptTokens: estimated, conversationId: ctx.request.conversationId }, 'Token estimate');
26
+ await next();
27
+ },
28
+ };
29
+ exports.profanityFilterPlugin = {
30
+ name: 'profanity-filter',
31
+ pre: async (_ctx, next) => {
32
+ await next();
33
+ },
34
+ };
35
+ exports.responseLogPlugin = {
36
+ name: 'response-log',
37
+ post: async (ctx, next) => {
38
+ await next();
39
+ if (ctx.response) {
40
+ logger_1.logger.info({
41
+ conversationId: ctx.request.conversationId,
42
+ model: ctx.response.model,
43
+ usage: ctx.response.usage,
44
+ finishReason: ctx.response.finishReason,
45
+ }, 'Completion logged');
46
+ }
47
+ },
48
+ };
49
+ exports.rateLimitPlugin = {
50
+ name: 'rate-limit',
51
+ pre: async (_ctx, next) => {
52
+ await next();
53
+ },
54
+ };
55
+ exports.defaultPlugins = [
56
+ exports.systemPromptPlugin,
57
+ exports.tokenCountPlugin,
58
+ exports.profanityFilterPlugin,
59
+ exports.rateLimitPlugin,
60
+ ];
61
+ exports.postPlugins = [exports.responseLogPlugin];
62
+ async function runPipeline(plugins, ctx, phase) {
63
+ const handlers = plugins
64
+ .filter((p) => p[phase])
65
+ .map((p) => p[phase]);
66
+ async function dispatch(index) {
67
+ if (index >= handlers.length)
68
+ return;
69
+ const handler = handlers[index];
70
+ await handler(ctx, () => dispatch(index + 1));
71
+ }
72
+ await dispatch(0);
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { LLMProvider } from '../types';
2
+ export declare const anthropicProvider: LLMProvider;
3
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,WAAW,EAAW,MAAM,UAAU,CAAA;AAQtF,eAAO,MAAM,iBAAiB,EAAE,WA6D/B,CAAA"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.anthropicProvider = void 0;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ const config_1 = require("../config");
9
+ const logger_1 = require("../lib/logger");
10
+ function buildClient() {
11
+ return new sdk_1.default({ apiKey: config_1.config.providers.anthropic.apiKey });
12
+ }
13
+ exports.anthropicProvider = {
14
+ async complete(request) {
15
+ const client = buildClient();
16
+ const systemMsg = request.messages.find((m) => m.role === 'system');
17
+ const userMessages = request.messages.filter((m) => m.role !== 'system');
18
+ const response = await client.messages.create({
19
+ model: request.model,
20
+ max_tokens: request.options?.maxTokens ?? 1024,
21
+ system: systemMsg?.content,
22
+ messages: userMessages.map((m) => ({
23
+ role: m.role,
24
+ content: m.content,
25
+ })),
26
+ });
27
+ const block = response.content[0];
28
+ const content = block?.type === 'text' ? block.text : '';
29
+ logger_1.logger.debug({ model: request.model }, 'Anthropic completion');
30
+ return {
31
+ message: { role: 'assistant', content },
32
+ usage: {
33
+ promptTokens: response.usage.input_tokens,
34
+ completionTokens: response.usage.output_tokens,
35
+ totalTokens: response.usage.input_tokens + response.usage.output_tokens,
36
+ },
37
+ finishReason: response.stop_reason === 'end_turn' ? 'stop' : 'length',
38
+ model: response.model,
39
+ };
40
+ },
41
+ async *stream(request) {
42
+ const client = buildClient();
43
+ const systemMsg = request.messages.find((m) => m.role === 'system');
44
+ const userMessages = request.messages.filter((m) => m.role !== 'system');
45
+ const stream = client.messages.stream({
46
+ model: request.model,
47
+ max_tokens: request.options?.maxTokens ?? 1024,
48
+ system: systemMsg?.content,
49
+ messages: userMessages.map((m) => ({
50
+ role: m.role,
51
+ content: m.content,
52
+ })),
53
+ });
54
+ for await (const event of stream) {
55
+ if (event.type === 'content_block_delta' &&
56
+ event.delta.type === 'text_delta') {
57
+ yield event.delta.text;
58
+ }
59
+ }
60
+ },
61
+ countTokens(messages) {
62
+ return messages.reduce((sum, m) => sum + Math.ceil(m.content.length / 4) + 4, 0);
63
+ },
64
+ };
65
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { LLMProvider, ModelInfo } from '../types';
2
+ export declare const providers: Record<string, LLMProvider>;
3
+ export declare const modelCatalog: ModelInfo[];
4
+ export declare function getProviderForModel(modelId: string): {
5
+ provider: LLMProvider;
6
+ name: string;
7
+ } | undefined;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAKjD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAIjD,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,SAAS,EAenC,CAAA;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAMxG"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modelCatalog = exports.providers = void 0;
4
+ exports.getProviderForModel = getProviderForModel;
5
+ const openai_1 = require("./openai");
6
+ const anthropic_1 = require("./anthropic");
7
+ const ollama_1 = require("./ollama");
8
+ exports.providers = {
9
+ openai: openai_1.openaiProvider,
10
+ anthropic: anthropic_1.anthropicProvider,
11
+ ollama: ollama_1.ollamaProvider,
12
+ };
13
+ exports.modelCatalog = [
14
+ { id: 'gpt-4o', provider: 'openai', contextWindow: 128000, streaming: true, vision: true },
15
+ { id: 'gpt-4o-mini', provider: 'openai', contextWindow: 128000, streaming: true, vision: true },
16
+ { id: 'gpt-4-turbo', provider: 'openai', contextWindow: 128000, streaming: true, vision: true },
17
+ { id: 'gpt-3.5-turbo', provider: 'openai', contextWindow: 16385, streaming: true, vision: false },
18
+ { id: 'o1-mini', provider: 'openai', contextWindow: 128000, streaming: false, vision: false },
19
+ { id: 'o1', provider: 'openai', contextWindow: 200000, streaming: false, vision: false },
20
+ { id: 'claude-3-5-sonnet-20241022', provider: 'anthropic', contextWindow: 200000, streaming: true, vision: true },
21
+ { id: 'claude-3-5-haiku-20241022', provider: 'anthropic', contextWindow: 200000, streaming: true, vision: true },
22
+ { id: 'claude-3-opus-20240229', provider: 'anthropic', contextWindow: 200000, streaming: true, vision: true },
23
+ { id: 'llama3', provider: 'ollama', contextWindow: 8192, streaming: true, vision: false },
24
+ { id: 'llama3:70b', provider: 'ollama', contextWindow: 8192, streaming: true, vision: false },
25
+ { id: 'mistral', provider: 'ollama', contextWindow: 32768, streaming: true, vision: false },
26
+ { id: 'phi3', provider: 'ollama', contextWindow: 128000, streaming: true, vision: false },
27
+ { id: 'gemma2', provider: 'ollama', contextWindow: 8192, streaming: true, vision: false },
28
+ ];
29
+ function getProviderForModel(modelId) {
30
+ const info = exports.modelCatalog.find((m) => m.id === modelId);
31
+ if (!info)
32
+ return undefined;
33
+ const provider = exports.providers[info.provider];
34
+ if (!provider)
35
+ return undefined;
36
+ return { provider, name: info.provider };
37
+ }
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { LLMProvider } from '../types';
2
+ export declare const ollamaProvider: LLMProvider;
3
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,WAAW,EAAW,MAAM,UAAU,CAAA;AAItF,eAAO,MAAM,cAAc,EAAE,WAgF5B,CAAA"}