@chrishdx/llm-dev-server 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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +164 -0
  3. package/backend/bin/llm-dev-server.js +3 -0
  4. package/backend/dist/cli.d.ts +15 -0
  5. package/backend/dist/cli.d.ts.map +1 -0
  6. package/backend/dist/cli.js +326 -0
  7. package/backend/dist/cli.js.map +1 -0
  8. package/backend/dist/config/database.d.ts +10 -0
  9. package/backend/dist/config/database.d.ts.map +1 -0
  10. package/backend/dist/config/database.js +61 -0
  11. package/backend/dist/config/database.js.map +1 -0
  12. package/backend/dist/config/environment.d.ts +20 -0
  13. package/backend/dist/config/environment.d.ts.map +1 -0
  14. package/backend/dist/config/environment.js +77 -0
  15. package/backend/dist/config/environment.js.map +1 -0
  16. package/backend/dist/controllers/AuthController.d.ts +18 -0
  17. package/backend/dist/controllers/AuthController.d.ts.map +1 -0
  18. package/backend/dist/controllers/AuthController.js +282 -0
  19. package/backend/dist/controllers/AuthController.js.map +1 -0
  20. package/backend/dist/controllers/ConversationController.d.ts +44 -0
  21. package/backend/dist/controllers/ConversationController.d.ts.map +1 -0
  22. package/backend/dist/controllers/ConversationController.js +193 -0
  23. package/backend/dist/controllers/ConversationController.js.map +1 -0
  24. package/backend/dist/controllers/JobController.d.ts +49 -0
  25. package/backend/dist/controllers/JobController.d.ts.map +1 -0
  26. package/backend/dist/controllers/JobController.js +227 -0
  27. package/backend/dist/controllers/JobController.js.map +1 -0
  28. package/backend/dist/index.d.ts +2 -0
  29. package/backend/dist/index.d.ts.map +1 -0
  30. package/backend/dist/index.js +160 -0
  31. package/backend/dist/index.js.map +1 -0
  32. package/backend/dist/middleware/auth.middleware.d.ts +25 -0
  33. package/backend/dist/middleware/auth.middleware.d.ts.map +1 -0
  34. package/backend/dist/middleware/auth.middleware.js +116 -0
  35. package/backend/dist/middleware/auth.middleware.js.map +1 -0
  36. package/backend/dist/middleware/authelia.middleware.d.ts +26 -0
  37. package/backend/dist/middleware/authelia.middleware.d.ts.map +1 -0
  38. package/backend/dist/middleware/authelia.middleware.js +165 -0
  39. package/backend/dist/middleware/authelia.middleware.js.map +1 -0
  40. package/backend/dist/middleware/error.middleware.d.ts +23 -0
  41. package/backend/dist/middleware/error.middleware.d.ts.map +1 -0
  42. package/backend/dist/middleware/error.middleware.js +59 -0
  43. package/backend/dist/middleware/error.middleware.js.map +1 -0
  44. package/backend/dist/models/AuthToken.d.ts +42 -0
  45. package/backend/dist/models/AuthToken.d.ts.map +1 -0
  46. package/backend/dist/models/AuthToken.js +97 -0
  47. package/backend/dist/models/AuthToken.js.map +1 -0
  48. package/backend/dist/models/Conversation.d.ts +36 -0
  49. package/backend/dist/models/Conversation.d.ts.map +1 -0
  50. package/backend/dist/models/Conversation.js +100 -0
  51. package/backend/dist/models/Conversation.js.map +1 -0
  52. package/backend/dist/models/FileOperation.d.ts +36 -0
  53. package/backend/dist/models/FileOperation.d.ts.map +1 -0
  54. package/backend/dist/models/FileOperation.js +117 -0
  55. package/backend/dist/models/FileOperation.js.map +1 -0
  56. package/backend/dist/models/Job.d.ts +48 -0
  57. package/backend/dist/models/Job.d.ts.map +1 -0
  58. package/backend/dist/models/Job.js +87 -0
  59. package/backend/dist/models/Job.js.map +1 -0
  60. package/backend/dist/models/Message.d.ts +38 -0
  61. package/backend/dist/models/Message.d.ts.map +1 -0
  62. package/backend/dist/models/Message.js +87 -0
  63. package/backend/dist/models/Message.js.map +1 -0
  64. package/backend/dist/models/User.d.ts +26 -0
  65. package/backend/dist/models/User.d.ts.map +1 -0
  66. package/backend/dist/models/User.js +67 -0
  67. package/backend/dist/models/User.js.map +1 -0
  68. package/backend/dist/models/index.d.ts +13 -0
  69. package/backend/dist/models/index.d.ts.map +1 -0
  70. package/backend/dist/models/index.js +24 -0
  71. package/backend/dist/models/index.js.map +1 -0
  72. package/backend/dist/routes/auth.routes.d.ts +3 -0
  73. package/backend/dist/routes/auth.routes.d.ts.map +1 -0
  74. package/backend/dist/routes/auth.routes.js +27 -0
  75. package/backend/dist/routes/auth.routes.js.map +1 -0
  76. package/backend/dist/routes/conversation.routes.d.ts +3 -0
  77. package/backend/dist/routes/conversation.routes.d.ts.map +1 -0
  78. package/backend/dist/routes/conversation.routes.js +17 -0
  79. package/backend/dist/routes/conversation.routes.js.map +1 -0
  80. package/backend/dist/routes/filesystem.routes.d.ts +3 -0
  81. package/backend/dist/routes/filesystem.routes.d.ts.map +1 -0
  82. package/backend/dist/routes/filesystem.routes.js +64 -0
  83. package/backend/dist/routes/filesystem.routes.js.map +1 -0
  84. package/backend/dist/routes/index.d.ts +3 -0
  85. package/backend/dist/routes/index.d.ts.map +1 -0
  86. package/backend/dist/routes/index.js +27 -0
  87. package/backend/dist/routes/index.js.map +1 -0
  88. package/backend/dist/routes/job.routes.d.ts +3 -0
  89. package/backend/dist/routes/job.routes.d.ts.map +1 -0
  90. package/backend/dist/routes/job.routes.js +18 -0
  91. package/backend/dist/routes/job.routes.js.map +1 -0
  92. package/backend/dist/services/auth/BaseAuthService.d.ts +49 -0
  93. package/backend/dist/services/auth/BaseAuthService.d.ts.map +1 -0
  94. package/backend/dist/services/auth/BaseAuthService.js +97 -0
  95. package/backend/dist/services/auth/BaseAuthService.js.map +1 -0
  96. package/backend/dist/services/auth/ClaudeAuthService.d.ts +69 -0
  97. package/backend/dist/services/auth/ClaudeAuthService.d.ts.map +1 -0
  98. package/backend/dist/services/auth/ClaudeAuthService.js +401 -0
  99. package/backend/dist/services/auth/ClaudeAuthService.js.map +1 -0
  100. package/backend/dist/services/auth/CodexAuthService.d.ts +37 -0
  101. package/backend/dist/services/auth/CodexAuthService.d.ts.map +1 -0
  102. package/backend/dist/services/auth/CodexAuthService.js +186 -0
  103. package/backend/dist/services/auth/CodexAuthService.js.map +1 -0
  104. package/backend/dist/services/auth/GeminiAuthService.d.ts +50 -0
  105. package/backend/dist/services/auth/GeminiAuthService.d.ts.map +1 -0
  106. package/backend/dist/services/auth/GeminiAuthService.js +284 -0
  107. package/backend/dist/services/auth/GeminiAuthService.js.map +1 -0
  108. package/backend/dist/services/auth/JwtService.d.ts +27 -0
  109. package/backend/dist/services/auth/JwtService.d.ts.map +1 -0
  110. package/backend/dist/services/auth/JwtService.js +65 -0
  111. package/backend/dist/services/auth/JwtService.js.map +1 -0
  112. package/backend/dist/services/auth/TokenRefreshService.d.ts +36 -0
  113. package/backend/dist/services/auth/TokenRefreshService.d.ts.map +1 -0
  114. package/backend/dist/services/auth/TokenRefreshService.js +178 -0
  115. package/backend/dist/services/auth/TokenRefreshService.js.map +1 -0
  116. package/backend/dist/services/conversation/ConversationService.d.ts +89 -0
  117. package/backend/dist/services/conversation/ConversationService.d.ts.map +1 -0
  118. package/backend/dist/services/conversation/ConversationService.js +255 -0
  119. package/backend/dist/services/conversation/ConversationService.js.map +1 -0
  120. package/backend/dist/services/job/JobService.d.ts +83 -0
  121. package/backend/dist/services/job/JobService.d.ts.map +1 -0
  122. package/backend/dist/services/job/JobService.js +213 -0
  123. package/backend/dist/services/job/JobService.js.map +1 -0
  124. package/backend/dist/services/job/WorkingDirectoryService.d.ts +73 -0
  125. package/backend/dist/services/job/WorkingDirectoryService.d.ts.map +1 -0
  126. package/backend/dist/services/job/WorkingDirectoryService.js +289 -0
  127. package/backend/dist/services/job/WorkingDirectoryService.js.map +1 -0
  128. package/backend/dist/services/llm/ClaudeProvider.d.ts +16 -0
  129. package/backend/dist/services/llm/ClaudeProvider.d.ts.map +1 -0
  130. package/backend/dist/services/llm/ClaudeProvider.js +229 -0
  131. package/backend/dist/services/llm/ClaudeProvider.js.map +1 -0
  132. package/backend/dist/services/llm/CodexProvider.d.ts +15 -0
  133. package/backend/dist/services/llm/CodexProvider.d.ts.map +1 -0
  134. package/backend/dist/services/llm/CodexProvider.js +301 -0
  135. package/backend/dist/services/llm/CodexProvider.js.map +1 -0
  136. package/backend/dist/services/llm/GeminiProvider.d.ts +17 -0
  137. package/backend/dist/services/llm/GeminiProvider.d.ts.map +1 -0
  138. package/backend/dist/services/llm/GeminiProvider.js +190 -0
  139. package/backend/dist/services/llm/GeminiProvider.js.map +1 -0
  140. package/backend/dist/services/llm/LLMProviderBase.d.ts +76 -0
  141. package/backend/dist/services/llm/LLMProviderBase.d.ts.map +1 -0
  142. package/backend/dist/services/llm/LLMProviderBase.js +34 -0
  143. package/backend/dist/services/llm/LLMProviderBase.js.map +1 -0
  144. package/backend/dist/services/llm/ProviderFactory.d.ts +17 -0
  145. package/backend/dist/services/llm/ProviderFactory.d.ts.map +1 -0
  146. package/backend/dist/services/llm/ProviderFactory.js +58 -0
  147. package/backend/dist/services/llm/ProviderFactory.js.map +1 -0
  148. package/backend/dist/utils/crypto.d.ts +33 -0
  149. package/backend/dist/utils/crypto.d.ts.map +1 -0
  150. package/backend/dist/utils/crypto.js +165 -0
  151. package/backend/dist/utils/crypto.js.map +1 -0
  152. package/backend/dist/utils/logger.d.ts +4 -0
  153. package/backend/dist/utils/logger.d.ts.map +1 -0
  154. package/backend/dist/utils/logger.js +44 -0
  155. package/backend/dist/utils/logger.js.map +1 -0
  156. package/backend/dist/utils/validators.d.ts +22 -0
  157. package/backend/dist/utils/validators.d.ts.map +1 -0
  158. package/backend/dist/utils/validators.js +127 -0
  159. package/backend/dist/utils/validators.js.map +1 -0
  160. package/backend/package.json +45 -0
  161. package/backend/public/assets/index-C207-KqP.js +188 -0
  162. package/backend/public/index.html +12 -0
  163. package/package.json +96 -0
  164. package/shared/dist/index.d.ts +5 -0
  165. package/shared/dist/index.d.ts.map +1 -0
  166. package/shared/dist/index.js +25 -0
  167. package/shared/dist/index.js.map +1 -0
  168. package/shared/dist/types/api.d.ts +27 -0
  169. package/shared/dist/types/api.d.ts.map +1 -0
  170. package/shared/dist/types/api.js +3 -0
  171. package/shared/dist/types/api.js.map +1 -0
  172. package/shared/dist/types/auth.d.ts +62 -0
  173. package/shared/dist/types/auth.d.ts.map +1 -0
  174. package/shared/dist/types/auth.js +3 -0
  175. package/shared/dist/types/auth.js.map +1 -0
  176. package/shared/dist/types/conversation.d.ts +98 -0
  177. package/shared/dist/types/conversation.d.ts.map +1 -0
  178. package/shared/dist/types/conversation.js +3 -0
  179. package/shared/dist/types/conversation.js.map +1 -0
  180. package/shared/dist/types/job.d.ts +93 -0
  181. package/shared/dist/types/job.d.ts.map +1 -0
  182. package/shared/dist/types/job.js +3 -0
  183. package/shared/dist/types/job.js.map +1 -0
  184. package/shared/package.json +15 -0
@@ -0,0 +1,44 @@
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
+ const winston_1 = __importDefault(require("winston"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const logLevel = process.env.LOG_LEVEL || 'info';
9
+ const logFormat = winston_1.default.format.combine(winston_1.default.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston_1.default.format.errors({ stack: true }), winston_1.default.format.splat(), winston_1.default.format.json());
10
+ const consoleFormat = winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston_1.default.format.printf(({ timestamp, level, message, ...metadata }) => {
11
+ let msg = `${timestamp} [${level}]: ${message}`;
12
+ if (Object.keys(metadata).length > 0) {
13
+ msg += ` ${JSON.stringify(metadata)}`;
14
+ }
15
+ return msg;
16
+ }));
17
+ const logger = winston_1.default.createLogger({
18
+ level: logLevel,
19
+ format: logFormat,
20
+ defaultMeta: { service: 'llm-dev-server' },
21
+ transports: [
22
+ // Console output
23
+ new winston_1.default.transports.Console({
24
+ format: consoleFormat,
25
+ }),
26
+ ],
27
+ });
28
+ // Add file transport in production
29
+ if (process.env.NODE_ENV === 'production') {
30
+ const dataDir = process.env.DATA_DIR || './data';
31
+ logger.add(new winston_1.default.transports.File({
32
+ filename: path_1.default.join(dataDir, 'error.log'),
33
+ level: 'error',
34
+ maxsize: 5242880, // 5MB
35
+ maxFiles: 5,
36
+ }));
37
+ logger.add(new winston_1.default.transports.File({
38
+ filename: path_1.default.join(dataDir, 'combined.log'),
39
+ maxsize: 5242880, // 5MB
40
+ maxFiles: 5,
41
+ }));
42
+ }
43
+ exports.default = logger;
44
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAC9B,gDAAwB;AAExB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;AAEjD,MAAM,SAAS,GAAG,iBAAO,CAAC,MAAM,CAAC,OAAO,CACtC,iBAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,iBAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,iBAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EACtB,iBAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACtB,CAAC;AAEF,MAAM,aAAa,GAAG,iBAAO,CAAC,MAAM,CAAC,OAAO,CAC1C,iBAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,iBAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,iBAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE;IACnE,IAAI,GAAG,GAAG,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,EAAE,CAAC;IAChD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,MAAM,GAAG,iBAAO,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;IAC1C,UAAU,EAAE;QACV,iBAAiB;QACjB,IAAI,iBAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,aAAa;SACtB,CAAC;KACH;CACF,CAAC,CAAC;AAEH,mCAAmC;AACnC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAEjD,MAAM,CAAC,GAAG,CACR,IAAI,iBAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QACzC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,OAAO,EAAE,MAAM;QACxB,QAAQ,EAAE,CAAC;KACZ,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,IAAI,iBAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,MAAM;QACxB,QAAQ,EAAE,CAAC;KACZ,CAAC,CACH,CAAC;AACJ,CAAC;AAED,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,22 @@
1
+ import Joi from 'joi';
2
+ export declare const userCreateSchema: Joi.ObjectSchema<any>;
3
+ export declare const loginSchema: Joi.ObjectSchema<any>;
4
+ export declare const jobCreateSchema: Joi.ObjectSchema<any>;
5
+ export declare const jobUpdateSchema: Joi.ObjectSchema<any>;
6
+ export declare const jobListQuerySchema: Joi.ObjectSchema<any>;
7
+ export declare const conversationCreateSchema: Joi.ObjectSchema<any>;
8
+ export declare const messageCreateSchema: Joi.ObjectSchema<any>;
9
+ export declare const messageListQuerySchema: Joi.ObjectSchema<any>;
10
+ export declare const claudeLoginStartSchema: Joi.ObjectSchema<any>;
11
+ export declare const claudeLoginCompleteSchema: Joi.ObjectSchema<any>;
12
+ export declare const codexLoginPollSchema: Joi.ObjectSchema<any>;
13
+ export declare const geminiLoginCompleteSchema: Joi.ObjectSchema<any>;
14
+ /**
15
+ * Validate data against a Joi schema
16
+ */
17
+ export declare function validate<T>(schema: Joi.Schema, data: any): T;
18
+ /**
19
+ * Middleware for request validation
20
+ */
21
+ export declare function validateRequest(schema: Joi.Schema, property?: 'body' | 'query' | 'params'): (req: any, res: any, next: any) => void;
22
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,gBAAgB,uBAmB3B,CAAC;AAEH,eAAO,MAAM,WAAW,uBAGtB,CAAC;AAGH,eAAO,MAAM,eAAe,uBAO1B,CAAC;AAEH,eAAO,MAAM,eAAe,uBAO1B,CAAC;AAEH,eAAO,MAAM,kBAAkB,uBAO7B,CAAC;AAGH,eAAO,MAAM,wBAAwB,uBAInC,CAAC;AAEH,eAAO,MAAM,mBAAmB,uBAI9B,CAAC;AAEH,eAAO,MAAM,sBAAsB,uBAIjC,CAAC;AAGH,eAAO,MAAM,sBAAsB,uBAEjC,CAAC;AAEH,eAAO,MAAM,yBAAyB,uBAIpC,CAAC;AAEH,eAAO,MAAM,oBAAoB,uBAG/B,CAAC;AAEH,eAAO,MAAM,yBAAyB,uBAIpC,CAAC;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAY5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAE,MAAM,GAAG,OAAO,GAAG,QAAiB,IACxF,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,UAatC"}
@@ -0,0 +1,127 @@
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.geminiLoginCompleteSchema = exports.codexLoginPollSchema = exports.claudeLoginCompleteSchema = exports.claudeLoginStartSchema = exports.messageListQuerySchema = exports.messageCreateSchema = exports.conversationCreateSchema = exports.jobListQuerySchema = exports.jobUpdateSchema = exports.jobCreateSchema = exports.loginSchema = exports.userCreateSchema = void 0;
7
+ exports.validate = validate;
8
+ exports.validateRequest = validateRequest;
9
+ const joi_1 = __importDefault(require("joi"));
10
+ // User validation schemas
11
+ exports.userCreateSchema = joi_1.default.object({
12
+ username: joi_1.default.string()
13
+ .alphanum()
14
+ .min(3)
15
+ .max(30)
16
+ .required()
17
+ .messages({
18
+ 'string.alphanum': 'Username must contain only alphanumeric characters',
19
+ 'string.min': 'Username must be at least 3 characters long',
20
+ 'string.max': 'Username must not exceed 30 characters',
21
+ 'any.required': 'Username is required',
22
+ }),
23
+ password: joi_1.default.string()
24
+ .min(8)
25
+ .required()
26
+ .messages({
27
+ 'string.min': 'Password must be at least 8 characters long',
28
+ 'any.required': 'Password is required',
29
+ }),
30
+ });
31
+ exports.loginSchema = joi_1.default.object({
32
+ username: joi_1.default.string().required(),
33
+ password: joi_1.default.string().required(),
34
+ });
35
+ // Job validation schemas
36
+ exports.jobCreateSchema = joi_1.default.object({
37
+ name: joi_1.default.string().min(1).max(100).required(),
38
+ provider: joi_1.default.string().valid('claude', 'codex', 'gemini').required(),
39
+ workingDirectory: joi_1.default.string().required(),
40
+ model: joi_1.default.string().optional(),
41
+ systemPrompt: joi_1.default.string().optional(),
42
+ maxBudgetUsd: joi_1.default.number().positive().optional(),
43
+ });
44
+ exports.jobUpdateSchema = joi_1.default.object({
45
+ name: joi_1.default.string().min(1).max(100).optional(),
46
+ status: joi_1.default.string()
47
+ .valid('pending', 'running', 'completed', 'failed', 'cancelled')
48
+ .optional(),
49
+ systemPrompt: joi_1.default.string().optional(),
50
+ maxBudgetUsd: joi_1.default.number().positive().optional(),
51
+ });
52
+ exports.jobListQuerySchema = joi_1.default.object({
53
+ status: joi_1.default.string()
54
+ .valid('pending', 'running', 'completed', 'failed', 'cancelled')
55
+ .optional(),
56
+ provider: joi_1.default.string().valid('claude', 'codex', 'gemini').optional(),
57
+ limit: joi_1.default.number().integer().min(1).max(100).default(20),
58
+ offset: joi_1.default.number().integer().min(0).default(0),
59
+ });
60
+ // Conversation validation schemas
61
+ exports.conversationCreateSchema = joi_1.default.object({
62
+ jobId: joi_1.default.string().uuid().required(),
63
+ model: joi_1.default.string().optional(),
64
+ systemPrompt: joi_1.default.string().optional(),
65
+ });
66
+ exports.messageCreateSchema = joi_1.default.object({
67
+ content: joi_1.default.string().min(1).required(),
68
+ attachments: joi_1.default.array().items(joi_1.default.string()).optional(),
69
+ toolCalls: joi_1.default.any().optional(),
70
+ });
71
+ exports.messageListQuerySchema = joi_1.default.object({
72
+ limit: joi_1.default.number().integer().min(1).max(100).default(20),
73
+ offset: joi_1.default.number().integer().min(0).default(0),
74
+ since: joi_1.default.date().iso().optional(),
75
+ });
76
+ // OAuth validation schemas
77
+ exports.claudeLoginStartSchema = joi_1.default.object({
78
+ loginWithClaudeAi: joi_1.default.boolean().optional().default(false),
79
+ });
80
+ exports.claudeLoginCompleteSchema = joi_1.default.object({
81
+ sessionId: joi_1.default.string().uuid().required(),
82
+ code: joi_1.default.string().required(),
83
+ state: joi_1.default.string().required(),
84
+ });
85
+ exports.codexLoginPollSchema = joi_1.default.object({
86
+ deviceAuthId: joi_1.default.string().required(),
87
+ userCode: joi_1.default.string().required(),
88
+ });
89
+ exports.geminiLoginCompleteSchema = joi_1.default.object({
90
+ sessionId: joi_1.default.string().uuid().required(),
91
+ code: joi_1.default.string().required(),
92
+ state: joi_1.default.string().required(),
93
+ });
94
+ /**
95
+ * Validate data against a Joi schema
96
+ */
97
+ function validate(schema, data) {
98
+ const { error, value } = schema.validate(data, {
99
+ abortEarly: false,
100
+ stripUnknown: true,
101
+ });
102
+ if (error) {
103
+ const details = error.details.map((detail) => detail.message).join(', ');
104
+ throw new Error(`Validation failed: ${details}`);
105
+ }
106
+ return value;
107
+ }
108
+ /**
109
+ * Middleware for request validation
110
+ */
111
+ function validateRequest(schema, property = 'body') {
112
+ return (req, res, next) => {
113
+ try {
114
+ req[property] = validate(schema, req[property]);
115
+ next();
116
+ }
117
+ catch (error) {
118
+ const message = error instanceof Error ? error.message : String(error);
119
+ res.status(400).json({
120
+ error: 'Validation Error',
121
+ message,
122
+ statusCode: 400,
123
+ });
124
+ }
125
+ };
126
+ }
127
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@chrishdx/llm-dev-server-backend",
3
+ "version": "1.0.0",
4
+ "description": "Backend for Multi-LLM Development Server",
5
+ "private": true,
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "llm-dev-server": "bin/llm-dev-server.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "nodemon --exec ts-node src/index.ts",
12
+ "build": "tsc",
13
+ "start": "node dist/cli.js",
14
+ "test": "jest",
15
+ "lint": "eslint src/**/*.ts"
16
+ },
17
+ "dependencies": {
18
+ "express": "^4.18.2",
19
+ "sequelize": "^6.37.1",
20
+ "sqlite3": "^5.1.7",
21
+ "jsonwebtoken": "^9.0.2",
22
+ "bcrypt": "^5.1.1",
23
+ "winston": "^3.11.0",
24
+ "joi": "^17.12.0",
25
+ "cors": "^2.8.5",
26
+ "dotenv": "^16.4.1",
27
+ "@anthropic-ai/claude-agent-sdk": "^0.1.76",
28
+ "@openai/codex-sdk": "^0.77.0",
29
+ "@google/gemini-cli": "^0.22.5",
30
+ "google-auth-library": "^9.14.2"
31
+ },
32
+ "devDependencies": {
33
+ "@types/express": "^4.17.21",
34
+ "@types/node": "^20.11.10",
35
+ "@types/bcrypt": "^5.0.2",
36
+ "@types/jsonwebtoken": "^9.0.5",
37
+ "@types/cors": "^2.8.17",
38
+ "typescript": "^5.3.3",
39
+ "nodemon": "^3.0.3",
40
+ "ts-node": "^10.9.2",
41
+ "@types/jest": "^29.5.11",
42
+ "jest": "^29.7.0",
43
+ "ts-jest": "^29.1.2"
44
+ }
45
+ }