grok-cli-to-openai-compatible 1.2.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 (308) hide show
  1. package/.env.example +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +484 -0
  4. package/dist/app.d.ts +3 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +67 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/cli/commands/doctor.d.ts +5 -0
  9. package/dist/cli/commands/doctor.d.ts.map +1 -0
  10. package/dist/cli/commands/doctor.js +77 -0
  11. package/dist/cli/commands/doctor.js.map +1 -0
  12. package/dist/cli/commands/migrate.d.ts +5 -0
  13. package/dist/cli/commands/migrate.d.ts.map +1 -0
  14. package/dist/cli/commands/migrate.js +25 -0
  15. package/dist/cli/commands/migrate.js.map +1 -0
  16. package/dist/cli/commands/open.d.ts +6 -0
  17. package/dist/cli/commands/open.d.ts.map +1 -0
  18. package/dist/cli/commands/open.js +24 -0
  19. package/dist/cli/commands/open.js.map +1 -0
  20. package/dist/cli/commands/restart.d.ts +7 -0
  21. package/dist/cli/commands/restart.d.ts.map +1 -0
  22. package/dist/cli/commands/restart.js +12 -0
  23. package/dist/cli/commands/restart.js.map +1 -0
  24. package/dist/cli/commands/seed.d.ts +5 -0
  25. package/dist/cli/commands/seed.d.ts.map +1 -0
  26. package/dist/cli/commands/seed.js +38 -0
  27. package/dist/cli/commands/seed.js.map +1 -0
  28. package/dist/cli/commands/setup.d.ts +6 -0
  29. package/dist/cli/commands/setup.d.ts.map +1 -0
  30. package/dist/cli/commands/setup.js +73 -0
  31. package/dist/cli/commands/setup.js.map +1 -0
  32. package/dist/cli/commands/start.d.ts +7 -0
  33. package/dist/cli/commands/start.d.ts.map +1 -0
  34. package/dist/cli/commands/start.js +57 -0
  35. package/dist/cli/commands/start.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts +5 -0
  37. package/dist/cli/commands/status.d.ts.map +1 -0
  38. package/dist/cli/commands/status.js +42 -0
  39. package/dist/cli/commands/status.js.map +1 -0
  40. package/dist/cli/commands/stop.d.ts +5 -0
  41. package/dist/cli/commands/stop.d.ts.map +1 -0
  42. package/dist/cli/commands/stop.js +21 -0
  43. package/dist/cli/commands/stop.js.map +1 -0
  44. package/dist/cli/commands/update.d.ts +8 -0
  45. package/dist/cli/commands/update.d.ts.map +1 -0
  46. package/dist/cli/commands/update.js +58 -0
  47. package/dist/cli/commands/update.js.map +1 -0
  48. package/dist/cli/commands/version.d.ts +2 -0
  49. package/dist/cli/commands/version.d.ts.map +1 -0
  50. package/dist/cli/commands/version.js +16 -0
  51. package/dist/cli/commands/version.js.map +1 -0
  52. package/dist/cli/index.d.ts +3 -0
  53. package/dist/cli/index.d.ts.map +1 -0
  54. package/dist/cli/index.js +128 -0
  55. package/dist/cli/index.js.map +1 -0
  56. package/dist/cli/lib/env-file.d.ts +7 -0
  57. package/dist/cli/lib/env-file.d.ts.map +1 -0
  58. package/dist/cli/lib/env-file.js +99 -0
  59. package/dist/cli/lib/env-file.js.map +1 -0
  60. package/dist/cli/lib/paths.d.ts +27 -0
  61. package/dist/cli/lib/paths.d.ts.map +1 -0
  62. package/dist/cli/lib/paths.js +90 -0
  63. package/dist/cli/lib/paths.js.map +1 -0
  64. package/dist/cli/lib/print.d.ts +10 -0
  65. package/dist/cli/lib/print.d.ts.map +1 -0
  66. package/dist/cli/lib/print.js +28 -0
  67. package/dist/cli/lib/print.js.map +1 -0
  68. package/dist/cli/lib/process-mgr.d.ts +8 -0
  69. package/dist/cli/lib/process-mgr.d.ts.map +1 -0
  70. package/dist/cli/lib/process-mgr.js +105 -0
  71. package/dist/cli/lib/process-mgr.js.map +1 -0
  72. package/dist/config/constants.d.ts +60 -0
  73. package/dist/config/constants.d.ts.map +1 -0
  74. package/dist/config/constants.js +127 -0
  75. package/dist/config/constants.js.map +1 -0
  76. package/dist/config/cors.d.ts +3 -0
  77. package/dist/config/cors.d.ts.map +1 -0
  78. package/dist/config/cors.js +22 -0
  79. package/dist/config/cors.js.map +1 -0
  80. package/dist/config/database.d.ts +4 -0
  81. package/dist/config/database.d.ts.map +1 -0
  82. package/dist/config/database.js +18 -0
  83. package/dist/config/database.js.map +1 -0
  84. package/dist/config/env.d.ts +38 -0
  85. package/dist/config/env.d.ts.map +1 -0
  86. package/dist/config/env.js +97 -0
  87. package/dist/config/env.js.map +1 -0
  88. package/dist/controllers/admin.controller.d.ts +21 -0
  89. package/dist/controllers/admin.controller.d.ts.map +1 -0
  90. package/dist/controllers/admin.controller.js +315 -0
  91. package/dist/controllers/admin.controller.js.map +1 -0
  92. package/dist/controllers/api-key.controller.d.ts +7 -0
  93. package/dist/controllers/api-key.controller.d.ts.map +1 -0
  94. package/dist/controllers/api-key.controller.js +48 -0
  95. package/dist/controllers/api-key.controller.js.map +1 -0
  96. package/dist/controllers/chat.controller.d.ts +5 -0
  97. package/dist/controllers/chat.controller.d.ts.map +1 -0
  98. package/dist/controllers/chat.controller.js +27 -0
  99. package/dist/controllers/chat.controller.js.map +1 -0
  100. package/dist/controllers/document.controller.d.ts +8 -0
  101. package/dist/controllers/document.controller.d.ts.map +1 -0
  102. package/dist/controllers/document.controller.js +53 -0
  103. package/dist/controllers/document.controller.js.map +1 -0
  104. package/dist/controllers/health.controller.d.ts +6 -0
  105. package/dist/controllers/health.controller.d.ts.map +1 -0
  106. package/dist/controllers/health.controller.js +39 -0
  107. package/dist/controllers/health.controller.js.map +1 -0
  108. package/dist/controllers/models.controller.d.ts +6 -0
  109. package/dist/controllers/models.controller.d.ts.map +1 -0
  110. package/dist/controllers/models.controller.js +18 -0
  111. package/dist/controllers/models.controller.js.map +1 -0
  112. package/dist/dto/admin.dto.d.ts +104 -0
  113. package/dist/dto/admin.dto.d.ts.map +1 -0
  114. package/dist/dto/admin.dto.js +45 -0
  115. package/dist/dto/admin.dto.js.map +1 -0
  116. package/dist/dto/api-key.dto.d.ts +27 -0
  117. package/dist/dto/api-key.dto.d.ts.map +1 -0
  118. package/dist/dto/api-key.dto.js +15 -0
  119. package/dist/dto/api-key.dto.js.map +1 -0
  120. package/dist/dto/chat.dto.d.ts +70 -0
  121. package/dist/dto/chat.dto.d.ts.map +1 -0
  122. package/dist/dto/chat.dto.js +49 -0
  123. package/dist/dto/chat.dto.js.map +1 -0
  124. package/dist/dto/document.dto.d.ts +21 -0
  125. package/dist/dto/document.dto.d.ts.map +1 -0
  126. package/dist/dto/document.dto.js +12 -0
  127. package/dist/dto/document.dto.js.map +1 -0
  128. package/dist/entities/api-key.entity.d.ts +33 -0
  129. package/dist/entities/api-key.entity.d.ts.map +1 -0
  130. package/dist/entities/api-key.entity.js +3 -0
  131. package/dist/entities/api-key.entity.js.map +1 -0
  132. package/dist/entities/audit-log.entity.d.ts +19 -0
  133. package/dist/entities/audit-log.entity.d.ts.map +1 -0
  134. package/dist/entities/audit-log.entity.js +3 -0
  135. package/dist/entities/audit-log.entity.js.map +1 -0
  136. package/dist/entities/chat-request.entity.d.ts +21 -0
  137. package/dist/entities/chat-request.entity.d.ts.map +1 -0
  138. package/dist/entities/chat-request.entity.js +3 -0
  139. package/dist/entities/chat-request.entity.js.map +1 -0
  140. package/dist/entities/document.entity.d.ts +22 -0
  141. package/dist/entities/document.entity.d.ts.map +1 -0
  142. package/dist/entities/document.entity.js +3 -0
  143. package/dist/entities/document.entity.js.map +1 -0
  144. package/dist/exceptions/error-codes.d.ts +18 -0
  145. package/dist/exceptions/error-codes.d.ts.map +1 -0
  146. package/dist/exceptions/error-codes.js +20 -0
  147. package/dist/exceptions/error-codes.js.map +1 -0
  148. package/dist/exceptions/exception.factory.d.ts +18 -0
  149. package/dist/exceptions/exception.factory.d.ts.map +1 -0
  150. package/dist/exceptions/exception.factory.js +50 -0
  151. package/dist/exceptions/exception.factory.js.map +1 -0
  152. package/dist/exceptions/http.exception.d.ts +18 -0
  153. package/dist/exceptions/http.exception.d.ts.map +1 -0
  154. package/dist/exceptions/http.exception.js +45 -0
  155. package/dist/exceptions/http.exception.js.map +1 -0
  156. package/dist/interfaces/auth.interface.d.ts +14 -0
  157. package/dist/interfaces/auth.interface.d.ts.map +1 -0
  158. package/dist/interfaces/auth.interface.js +3 -0
  159. package/dist/interfaces/auth.interface.js.map +1 -0
  160. package/dist/interfaces/express.interface.d.ts +11 -0
  161. package/dist/interfaces/express.interface.d.ts.map +1 -0
  162. package/dist/interfaces/express.interface.js +3 -0
  163. package/dist/interfaces/express.interface.js.map +1 -0
  164. package/dist/interfaces/grok.interface.d.ts +41 -0
  165. package/dist/interfaces/grok.interface.d.ts.map +1 -0
  166. package/dist/interfaces/grok.interface.js +3 -0
  167. package/dist/interfaces/grok.interface.js.map +1 -0
  168. package/dist/interfaces/openai.interface.d.ts +97 -0
  169. package/dist/interfaces/openai.interface.d.ts.map +1 -0
  170. package/dist/interfaces/openai.interface.js +3 -0
  171. package/dist/interfaces/openai.interface.js.map +1 -0
  172. package/dist/middlewares/auth.middleware.d.ts +5 -0
  173. package/dist/middlewares/auth.middleware.d.ts.map +1 -0
  174. package/dist/middlewares/auth.middleware.js +40 -0
  175. package/dist/middlewares/auth.middleware.js.map +1 -0
  176. package/dist/middlewares/concurrency.middleware.d.ts +6 -0
  177. package/dist/middlewares/concurrency.middleware.d.ts.map +1 -0
  178. package/dist/middlewares/concurrency.middleware.js +16 -0
  179. package/dist/middlewares/concurrency.middleware.js.map +1 -0
  180. package/dist/middlewares/error.middleware.d.ts +4 -0
  181. package/dist/middlewares/error.middleware.d.ts.map +1 -0
  182. package/dist/middlewares/error.middleware.js +38 -0
  183. package/dist/middlewares/error.middleware.js.map +1 -0
  184. package/dist/middlewares/rate-limit.middleware.d.ts +3 -0
  185. package/dist/middlewares/rate-limit.middleware.d.ts.map +1 -0
  186. package/dist/middlewares/rate-limit.middleware.js +40 -0
  187. package/dist/middlewares/rate-limit.middleware.js.map +1 -0
  188. package/dist/middlewares/request-id.middleware.d.ts +3 -0
  189. package/dist/middlewares/request-id.middleware.d.ts.map +1 -0
  190. package/dist/middlewares/request-id.middleware.js +12 -0
  191. package/dist/middlewares/request-id.middleware.js.map +1 -0
  192. package/dist/middlewares/upload.middleware.d.ts +2 -0
  193. package/dist/middlewares/upload.middleware.d.ts.map +1 -0
  194. package/dist/middlewares/upload.middleware.js +26 -0
  195. package/dist/middlewares/upload.middleware.js.map +1 -0
  196. package/dist/middlewares/validate.middleware.d.ts +6 -0
  197. package/dist/middlewares/validate.middleware.d.ts.map +1 -0
  198. package/dist/middlewares/validate.middleware.js +21 -0
  199. package/dist/middlewares/validate.middleware.js.map +1 -0
  200. package/dist/routes/admin.routes.d.ts +3 -0
  201. package/dist/routes/admin.routes.d.ts.map +1 -0
  202. package/dist/routes/admin.routes.js +44 -0
  203. package/dist/routes/admin.routes.js.map +1 -0
  204. package/dist/routes/index.d.ts +3 -0
  205. package/dist/routes/index.d.ts.map +1 -0
  206. package/dist/routes/index.js +20 -0
  207. package/dist/routes/index.js.map +1 -0
  208. package/dist/routes/v1/api-keys.routes.d.ts +3 -0
  209. package/dist/routes/v1/api-keys.routes.d.ts.map +1 -0
  210. package/dist/routes/v1/api-keys.routes.js +13 -0
  211. package/dist/routes/v1/api-keys.routes.js.map +1 -0
  212. package/dist/routes/v1/chat.routes.d.ts +3 -0
  213. package/dist/routes/v1/chat.routes.d.ts.map +1 -0
  214. package/dist/routes/v1/chat.routes.js +13 -0
  215. package/dist/routes/v1/chat.routes.js.map +1 -0
  216. package/dist/routes/v1/documents.routes.d.ts +3 -0
  217. package/dist/routes/v1/documents.routes.d.ts.map +1 -0
  218. package/dist/routes/v1/documents.routes.js +15 -0
  219. package/dist/routes/v1/documents.routes.js.map +1 -0
  220. package/dist/routes/v1/models.routes.d.ts +3 -0
  221. package/dist/routes/v1/models.routes.d.ts.map +1 -0
  222. package/dist/routes/v1/models.routes.js +10 -0
  223. package/dist/routes/v1/models.routes.js.map +1 -0
  224. package/dist/server.d.ts +2 -0
  225. package/dist/server.d.ts.map +1 -0
  226. package/dist/server.js +42 -0
  227. package/dist/server.js.map +1 -0
  228. package/dist/services/api-key.service.d.ts +33 -0
  229. package/dist/services/api-key.service.d.ts.map +1 -0
  230. package/dist/services/api-key.service.js +168 -0
  231. package/dist/services/api-key.service.js.map +1 -0
  232. package/dist/services/audit.service.d.ts +6 -0
  233. package/dist/services/audit.service.d.ts.map +1 -0
  234. package/dist/services/audit.service.js +21 -0
  235. package/dist/services/audit.service.js.map +1 -0
  236. package/dist/services/chat-admin.service.d.ts +76 -0
  237. package/dist/services/chat-admin.service.d.ts.map +1 -0
  238. package/dist/services/chat-admin.service.js +160 -0
  239. package/dist/services/chat-admin.service.js.map +1 -0
  240. package/dist/services/chat.service.d.ts +19 -0
  241. package/dist/services/chat.service.d.ts.map +1 -0
  242. package/dist/services/chat.service.js +335 -0
  243. package/dist/services/chat.service.js.map +1 -0
  244. package/dist/services/document.service.d.ts +37 -0
  245. package/dist/services/document.service.d.ts.map +1 -0
  246. package/dist/services/document.service.js +206 -0
  247. package/dist/services/document.service.js.map +1 -0
  248. package/dist/services/encryption.service.d.ts +8 -0
  249. package/dist/services/encryption.service.d.ts.map +1 -0
  250. package/dist/services/encryption.service.js +34 -0
  251. package/dist/services/encryption.service.js.map +1 -0
  252. package/dist/services/grok-cli.service.d.ts +18 -0
  253. package/dist/services/grok-cli.service.d.ts.map +1 -0
  254. package/dist/services/grok-cli.service.js +213 -0
  255. package/dist/services/grok-cli.service.js.map +1 -0
  256. package/dist/services/models.service.d.ts +10 -0
  257. package/dist/services/models.service.d.ts.map +1 -0
  258. package/dist/services/models.service.js +43 -0
  259. package/dist/services/models.service.js.map +1 -0
  260. package/dist/services/policy.service.d.ts +20 -0
  261. package/dist/services/policy.service.d.ts.map +1 -0
  262. package/dist/services/policy.service.js +66 -0
  263. package/dist/services/policy.service.js.map +1 -0
  264. package/dist/services/settings.service.d.ts +14 -0
  265. package/dist/services/settings.service.d.ts.map +1 -0
  266. package/dist/services/settings.service.js +86 -0
  267. package/dist/services/settings.service.js.map +1 -0
  268. package/dist/services/stats.service.d.ts +35 -0
  269. package/dist/services/stats.service.d.ts.map +1 -0
  270. package/dist/services/stats.service.js +59 -0
  271. package/dist/services/stats.service.js.map +1 -0
  272. package/dist/services/update.service.d.ts +44 -0
  273. package/dist/services/update.service.d.ts.map +1 -0
  274. package/dist/services/update.service.js +278 -0
  275. package/dist/services/update.service.js.map +1 -0
  276. package/dist/utils/async-handler.d.ts +5 -0
  277. package/dist/utils/async-handler.d.ts.map +1 -0
  278. package/dist/utils/async-handler.js +9 -0
  279. package/dist/utils/async-handler.js.map +1 -0
  280. package/dist/utils/id.d.ts +6 -0
  281. package/dist/utils/id.d.ts.map +1 -0
  282. package/dist/utils/id.js +24 -0
  283. package/dist/utils/id.js.map +1 -0
  284. package/dist/utils/logger.d.ts +3 -0
  285. package/dist/utils/logger.d.ts.map +1 -0
  286. package/dist/utils/logger.js +34 -0
  287. package/dist/utils/logger.js.map +1 -0
  288. package/dist/utils/openai-mapper.d.ts +30 -0
  289. package/dist/utils/openai-mapper.d.ts.map +1 -0
  290. package/dist/utils/openai-mapper.js +176 -0
  291. package/dist/utils/openai-mapper.js.map +1 -0
  292. package/dist/utils/path-safe.d.ts +4 -0
  293. package/dist/utils/path-safe.d.ts.map +1 -0
  294. package/dist/utils/path-safe.js +37 -0
  295. package/dist/utils/path-safe.js.map +1 -0
  296. package/dist/utils/stream.d.ts +5 -0
  297. package/dist/utils/stream.d.ts.map +1 -0
  298. package/dist/utils/stream.js +22 -0
  299. package/dist/utils/stream.js.map +1 -0
  300. package/package.json +87 -0
  301. package/prisma/migrations/20260714084159_init_sqlite/migration.sql +106 -0
  302. package/prisma/migrations/20260714090338_safe_mode_admin/migration.sql +36 -0
  303. package/prisma/migrations/migration_lock.toml +3 -0
  304. package/prisma/schema.prisma +122 -0
  305. package/prisma/seed.ts +79 -0
  306. package/public/admin/app.js +734 -0
  307. package/public/admin/index.html +13 -0
  308. package/public/admin/styles.css +296 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-handler.js","sourceRoot":"","sources":["../../src/utils/async-handler.ts"],"names":[],"mappings":";;AAQA,oCAIC;AAJD,SAAgB,YAAY,CAAC,EAAuB;IAClD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function createId(): string;
2
+ export declare function createRequestId(): string;
3
+ export declare function createChatCompletionId(): string;
4
+ export declare function createApiKeySecret(): string;
5
+ export declare function apiKeyPrefix(rawKey: string): string;
6
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createId = createId;
4
+ exports.createRequestId = createRequestId;
5
+ exports.createChatCompletionId = createChatCompletionId;
6
+ exports.createApiKeySecret = createApiKeySecret;
7
+ exports.apiKeyPrefix = apiKeyPrefix;
8
+ const node_crypto_1 = require("node:crypto");
9
+ function createId() {
10
+ return (0, node_crypto_1.randomUUID)();
11
+ }
12
+ function createRequestId() {
13
+ return `req_${(0, node_crypto_1.randomBytes)(12).toString('hex')}`;
14
+ }
15
+ function createChatCompletionId() {
16
+ return `chatcmpl_${(0, node_crypto_1.randomBytes)(12).toString('hex')}`;
17
+ }
18
+ function createApiKeySecret() {
19
+ return `gk_live_${(0, node_crypto_1.randomBytes)(24).toString('base64url')}`;
20
+ }
21
+ function apiKeyPrefix(rawKey) {
22
+ return rawKey.slice(0, 16);
23
+ }
24
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,0CAEC;AAED,wDAEC;AAED,gDAEC;AAED,oCAEC;AApBD,6CAAsD;AAEtD,SAAgB,QAAQ;IACtB,OAAO,IAAA,wBAAU,GAAE,CAAC;AACtB,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,OAAO,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,SAAgB,sBAAsB;IACpC,OAAO,YAAY,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,WAAW,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAgB,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -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/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,eAAO,MAAM,MAAM,6BAyBjB,CAAC"}
@@ -0,0 +1,34 @@
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 env_1 = require("../config/env");
9
+ exports.logger = (0, pino_1.default)({
10
+ level: env_1.env.LOG_LEVEL,
11
+ transport: env_1.env.isDev
12
+ ? {
13
+ target: 'pino-pretty',
14
+ options: {
15
+ colorize: true,
16
+ translateTime: 'SYS:standard',
17
+ ignore: 'pid,hostname',
18
+ },
19
+ }
20
+ : undefined,
21
+ base: { service: 'grok-openai-gateway' },
22
+ redact: {
23
+ paths: [
24
+ 'req.headers.authorization',
25
+ 'apiKey',
26
+ 'api_key',
27
+ 'key',
28
+ 'password',
29
+ 'ENCRYPTION_KEY',
30
+ ],
31
+ remove: true,
32
+ },
33
+ });
34
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,uCAAoC;AAEvB,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC;IACzB,KAAK,EAAE,SAAG,CAAC,SAAS;IACpB,SAAS,EACP,SAAG,CAAC,KAAK;QACP,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,cAAc;aACvB;SACF;QACH,CAAC,CAAC,SAAS;IACf,IAAI,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACxC,MAAM,EAAE;QACN,KAAK,EAAE;YACL,2BAA2B;YAC3B,QAAQ;YACR,SAAS;YACT,KAAK;YACL,UAAU;YACV,gBAAgB;SACjB;QACD,MAAM,EAAE,IAAI;KACb;CACF,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { GrokResponseMeta, OpenAiChatCompletion, OpenAiChatCompletionChunk, OpenAiModelList } from '../interfaces/openai.interface';
2
+ import type { GrokJsonResult } from '../interfaces/grok.interface';
3
+ export interface MapCompletionOptions {
4
+ completionId?: string;
5
+ reasoningContent?: string | null;
6
+ includeReasoning?: boolean;
7
+ grok?: GrokResponseMeta;
8
+ }
9
+ export declare function mapGrokToChatCompletion(model: string, result: GrokJsonResult, options?: MapCompletionOptions): OpenAiChatCompletion;
10
+ export declare function mapTextDeltaChunk(model: string, content: string, completionId: string, created: number): OpenAiChatCompletionChunk;
11
+ /**
12
+ * DeepSeek-compatible reasoning stream chunk.
13
+ * Also sets Grok alias `thought` to the same string.
14
+ */
15
+ export declare function mapReasoningDeltaChunk(model: string, reasoningContent: string, completionId: string, created: number, includeGrokAlias?: boolean): OpenAiChatCompletionChunk;
16
+ export declare function mapRoleChunk(model: string, completionId: string, created: number): OpenAiChatCompletionChunk;
17
+ export declare function mapFinishChunk(model: string, completionId: string, created: number, stopReason?: string, grok?: GrokResponseMeta): OpenAiChatCompletionChunk;
18
+ export declare function mapModelsList(models: string[]): OpenAiModelList;
19
+ /**
20
+ * Build prompt from messages.
21
+ * Multi-turn: uses role + content only (DeepSeek-style: prior reasoning_content not required).
22
+ * If an assistant message only has reasoning_content, it is ignored unless content is empty
23
+ * and we fall back (should not normally happen).
24
+ */
25
+ export declare function messagesToPrompt(messages: Array<{
26
+ role: string;
27
+ content: string;
28
+ reasoning_content?: string | null;
29
+ }>): string;
30
+ //# sourceMappingURL=openai-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-mapper.d.ts","sourceRoot":"","sources":["../../src/utils/openai-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EAEzB,eAAe,EAChB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGnE,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,oBAAyB,GACjC,oBAAoB,CAiDtB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,yBAAyB,CAc3B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,gBAAgB,UAAO,GACtB,yBAAyB,CAoB3B;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,yBAAyB,CAc3B;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,gBAAgB,GACtB,yBAAyB,CAkB3B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAQ/D;AAyBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GACpF,MAAM,CAUR"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapGrokToChatCompletion = mapGrokToChatCompletion;
4
+ exports.mapTextDeltaChunk = mapTextDeltaChunk;
5
+ exports.mapReasoningDeltaChunk = mapReasoningDeltaChunk;
6
+ exports.mapRoleChunk = mapRoleChunk;
7
+ exports.mapFinishChunk = mapFinishChunk;
8
+ exports.mapModelsList = mapModelsList;
9
+ exports.messagesToPrompt = messagesToPrompt;
10
+ const id_1 = require("./id");
11
+ function mapGrokToChatCompletion(model, result, options = {}) {
12
+ const completionId = options.completionId ?? (0, id_1.createChatCompletionId)();
13
+ const includeReasoning = options.includeReasoning !== false;
14
+ const reasoning = includeReasoning && options.reasoningContent
15
+ ? options.reasoningContent
16
+ : null;
17
+ const message = {
18
+ role: 'assistant',
19
+ content: result.text ?? '',
20
+ };
21
+ if (includeReasoning && reasoning) {
22
+ message.reasoning_content = reasoning;
23
+ message.thought = reasoning; // Grok alias
24
+ }
25
+ else if (includeReasoning) {
26
+ message.reasoning_content = null;
27
+ message.thought = null;
28
+ }
29
+ const finishReason = mapStopReason(result.stopReason ?? options.grok?.stopReason);
30
+ const response = {
31
+ id: completionId,
32
+ object: 'chat.completion',
33
+ created: Math.floor(Date.now() / 1000),
34
+ model,
35
+ choices: [
36
+ {
37
+ index: 0,
38
+ message,
39
+ finish_reason: finishReason,
40
+ logprobs: null,
41
+ },
42
+ ],
43
+ usage: {
44
+ prompt_tokens: 0,
45
+ completion_tokens: 0,
46
+ total_tokens: 0,
47
+ },
48
+ };
49
+ const grok = buildGrokMeta(result, options.grok);
50
+ if (grok) {
51
+ response.grok = grok;
52
+ }
53
+ return response;
54
+ }
55
+ function mapTextDeltaChunk(model, content, completionId, created) {
56
+ return {
57
+ id: completionId,
58
+ object: 'chat.completion.chunk',
59
+ created,
60
+ model,
61
+ choices: [
62
+ {
63
+ index: 0,
64
+ delta: { content },
65
+ finish_reason: null,
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ /**
71
+ * DeepSeek-compatible reasoning stream chunk.
72
+ * Also sets Grok alias `thought` to the same string.
73
+ */
74
+ function mapReasoningDeltaChunk(model, reasoningContent, completionId, created, includeGrokAlias = true) {
75
+ const delta = {
76
+ reasoning_content: reasoningContent,
77
+ };
78
+ if (includeGrokAlias) {
79
+ delta.thought = reasoningContent;
80
+ }
81
+ return {
82
+ id: completionId,
83
+ object: 'chat.completion.chunk',
84
+ created,
85
+ model,
86
+ choices: [
87
+ {
88
+ index: 0,
89
+ delta,
90
+ finish_reason: null,
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ function mapRoleChunk(model, completionId, created) {
96
+ return {
97
+ id: completionId,
98
+ object: 'chat.completion.chunk',
99
+ created,
100
+ model,
101
+ choices: [
102
+ {
103
+ index: 0,
104
+ delta: { role: 'assistant', content: '' },
105
+ finish_reason: null,
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ function mapFinishChunk(model, completionId, created, stopReason, grok) {
111
+ const chunk = {
112
+ id: completionId,
113
+ object: 'chat.completion.chunk',
114
+ created,
115
+ model,
116
+ choices: [
117
+ {
118
+ index: 0,
119
+ delta: {},
120
+ finish_reason: mapStopReason(stopReason),
121
+ },
122
+ ],
123
+ };
124
+ if (grok && (grok.sessionId || grok.stopReason || grok.requestId)) {
125
+ chunk.grok = grok;
126
+ }
127
+ return chunk;
128
+ }
129
+ function mapModelsList(models) {
130
+ const data = models.map((id) => ({
131
+ id,
132
+ object: 'model',
133
+ created: Math.floor(Date.now() / 1000),
134
+ owned_by: 'xai',
135
+ }));
136
+ return { object: 'list', data };
137
+ }
138
+ function mapStopReason(stopReason) {
139
+ if (!stopReason)
140
+ return 'stop';
141
+ const lower = stopReason.toLowerCase();
142
+ if (lower.includes('length') || lower.includes('max'))
143
+ return 'length';
144
+ if (lower.includes('filter') || lower.includes('content'))
145
+ return 'content_filter';
146
+ return 'stop';
147
+ }
148
+ function buildGrokMeta(result, extra) {
149
+ const meta = {
150
+ sessionId: extra?.sessionId ?? result.sessionId,
151
+ stopReason: extra?.stopReason ?? result.stopReason,
152
+ requestId: extra?.requestId ?? result.requestId,
153
+ };
154
+ if (!meta.sessionId && !meta.stopReason && !meta.requestId) {
155
+ return undefined;
156
+ }
157
+ return meta;
158
+ }
159
+ /**
160
+ * Build prompt from messages.
161
+ * Multi-turn: uses role + content only (DeepSeek-style: prior reasoning_content not required).
162
+ * If an assistant message only has reasoning_content, it is ignored unless content is empty
163
+ * and we fall back (should not normally happen).
164
+ */
165
+ function messagesToPrompt(messages) {
166
+ if (messages.length === 1) {
167
+ return messages[0]?.content ?? '';
168
+ }
169
+ return messages
170
+ .map((m) => {
171
+ // Mainstream: only final answer content participates in context
172
+ return `${m.role}: ${m.content}`;
173
+ })
174
+ .join('\n');
175
+ }
176
+ //# sourceMappingURL=openai-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-mapper.js","sourceRoot":"","sources":["../../src/utils/openai-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function resolveSafeCwd(input?: string | null): string;
2
+ export declare function sanitizeFilename(name: string): string;
3
+ export declare function ensureRelativeStoragePath(fileId: string): string;
4
+ //# sourceMappingURL=path-safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-safe.d.ts","sourceRoot":"","sources":["../../src/utils/path-safe.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAe5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAShE"}
@@ -0,0 +1,37 @@
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.resolveSafeCwd = resolveSafeCwd;
7
+ exports.sanitizeFilename = sanitizeFilename;
8
+ exports.ensureRelativeStoragePath = ensureRelativeStoragePath;
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const env_1 = require("../config/env");
11
+ const exception_factory_1 = require("../exceptions/exception.factory");
12
+ function resolveSafeCwd(input) {
13
+ const candidate = node_path_1.default.resolve(input?.trim() || env_1.env.defaultCwd);
14
+ const allowed = env_1.env.cwdAllowlist.some((root) => {
15
+ const resolvedRoot = node_path_1.default.resolve(root);
16
+ return candidate === resolvedRoot || candidate.startsWith(resolvedRoot + node_path_1.default.sep);
17
+ });
18
+ if (!allowed) {
19
+ throw exception_factory_1.ExceptionFactory.invalidCwd(`cwd "${candidate}" is outside the allowlist: ${env_1.env.cwdAllowlist.join(', ')}`);
20
+ }
21
+ return candidate;
22
+ }
23
+ function sanitizeFilename(name) {
24
+ const base = node_path_1.default.basename(name).replace(/[^\w.\-()+ ]+/g, '_').slice(0, 200);
25
+ return base.length > 0 ? base : 'upload.bin';
26
+ }
27
+ function ensureRelativeStoragePath(fileId) {
28
+ if (!fileId || fileId.includes('..') || fileId.includes('/') || fileId.includes('\\')) {
29
+ throw exception_factory_1.ExceptionFactory.validation('Invalid storage path');
30
+ }
31
+ const safe = fileId.replace(/[^a-zA-Z0-9\-_]/g, '');
32
+ if (!safe || safe !== fileId) {
33
+ throw exception_factory_1.ExceptionFactory.validation('Invalid storage path');
34
+ }
35
+ return safe;
36
+ }
37
+ //# sourceMappingURL=path-safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-safe.js","sourceRoot":"","sources":["../../src/utils/path-safe.ts"],"names":[],"mappings":";;;;;AAIA,wCAeC;AAED,4CAGC;AAED,8DASC;AAnCD,0DAA6B;AAC7B,uCAAoC;AACpC,uEAAmE;AAEnE,SAAgB,cAAc,CAAC,KAAqB;IAClD,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAG,CAAC,UAAU,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,SAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,SAAS,KAAK,YAAY,IAAI,SAAS,CAAC,UAAU,CAAC,YAAY,GAAG,mBAAI,CAAC,GAAG,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,oCAAgB,CAAC,UAAU,CAC/B,QAAQ,SAAS,+BAA+B,SAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,mBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;AAC/C,CAAC;AAED,SAAgB,yBAAyB,CAAC,MAAc;IACtD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtF,MAAM,oCAAgB,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,oCAAgB,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Response } from 'express';
2
+ export declare function initSse(res: Response): void;
3
+ export declare function writeSseData(res: Response, data: unknown): void;
4
+ export declare function writeSseDone(res: Response): void;
5
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAS3C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAE/D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAEhD"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initSse = initSse;
4
+ exports.writeSseData = writeSseData;
5
+ exports.writeSseDone = writeSseDone;
6
+ function initSse(res) {
7
+ res.status(200);
8
+ res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');
9
+ res.setHeader('Cache-Control', 'no-cache, no-transform');
10
+ res.setHeader('Connection', 'keep-alive');
11
+ res.setHeader('X-Accel-Buffering', 'no');
12
+ if (typeof res.flushHeaders === 'function') {
13
+ res.flushHeaders();
14
+ }
15
+ }
16
+ function writeSseData(res, data) {
17
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
18
+ }
19
+ function writeSseDone(res) {
20
+ res.write('data: [DONE]\n\n');
21
+ }
22
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":";;AAEA,0BASC;AAED,oCAEC;AAED,oCAEC;AAjBD,SAAgB,OAAO,CAAC,GAAa;IACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;IAClE,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IACzD,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1C,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC3C,GAAG,CAAC,YAAY,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,GAAa,EAAE,IAAa;IACvD,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,YAAY,CAAC,GAAa;IACxC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAChC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "grok-cli-to-openai-compatible",
3
+ "version": "1.2.0",
4
+ "description": "OpenAI-compatible API gateway for Grok CLI — with Admin panel, safe mode, and gctoac CLI",
5
+ "keywords": [
6
+ "grok",
7
+ "xai",
8
+ "openai",
9
+ "openai-compatible",
10
+ "cli",
11
+ "gateway",
12
+ "gctoac",
13
+ "gcoa"
14
+ ],
15
+ "homepage": "https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible/issues"
22
+ },
23
+ "license": "MIT",
24
+ "author": "yanshekki",
25
+ "main": "dist/server.js",
26
+ "bin": {
27
+ "gctoac": "dist/cli/index.js",
28
+ "gcoa": "dist/cli/index.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "prisma",
33
+ "public",
34
+ "README.md",
35
+ "LICENSE",
36
+ ".env.example"
37
+ ],
38
+ "scripts": {
39
+ "dev": "tsx watch src/server.ts",
40
+ "build": "tsc -p tsconfig.json && node -e \"require('fs').chmodSync('dist/cli/index.js',0o755)\"",
41
+ "start": "node dist/server.js",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest",
44
+ "test:coverage": "vitest run --coverage",
45
+ "typecheck": "tsc -p tsconfig.json --noEmit",
46
+ "prisma:generate": "prisma generate",
47
+ "prisma:migrate": "mkdir -p data && prisma migrate dev",
48
+ "prisma:deploy": "mkdir -p data && prisma migrate deploy",
49
+ "db:setup": "mkdir -p data && prisma migrate deploy && tsx prisma/seed.ts",
50
+ "seed": "tsx prisma/seed.ts",
51
+ "smoke": "bash scripts/smoke.sh",
52
+ "postinstall": "prisma generate || true",
53
+ "prepublishOnly": "npm run build"
54
+ },
55
+ "prisma": {
56
+ "seed": "tsx prisma/seed.ts"
57
+ },
58
+ "dependencies": {
59
+ "@prisma/client": "^6.5.0",
60
+ "commander": "^13.1.0",
61
+ "cors": "^2.8.5",
62
+ "dotenv": "^16.4.7",
63
+ "execa": "^8.0.1",
64
+ "express": "^4.21.2",
65
+ "express-rate-limit": "^7.5.0",
66
+ "helmet": "^8.0.0",
67
+ "multer": "^1.4.5-lts.1",
68
+ "pino": "^9.6.0",
69
+ "pino-http": "^10.4.0",
70
+ "prisma": "^6.5.0",
71
+ "zod": "^3.24.2"
72
+ },
73
+ "devDependencies": {
74
+ "@types/cors": "^2.8.17",
75
+ "@types/express": "^4.17.21",
76
+ "@types/multer": "^1.4.12",
77
+ "@types/node": "^22.13.10",
78
+ "@vitest/coverage-v8": "^3.0.9",
79
+ "pino-pretty": "^13.0.0",
80
+ "tsx": "^4.19.3",
81
+ "typescript": "^5.8.2",
82
+ "vitest": "^3.0.9"
83
+ },
84
+ "engines": {
85
+ "node": ">=20"
86
+ }
87
+ }
@@ -0,0 +1,106 @@
1
+ -- CreateTable
2
+ CREATE TABLE "api_keys" (
3
+ "id" TEXT NOT NULL PRIMARY KEY,
4
+ "name" TEXT NOT NULL,
5
+ "keyPrefix" TEXT NOT NULL,
6
+ "keyHash" TEXT NOT NULL,
7
+ "role" TEXT NOT NULL DEFAULT 'client',
8
+ "isActive" BOOLEAN NOT NULL DEFAULT true,
9
+ "rateLimit" INTEGER NOT NULL DEFAULT 60,
10
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
11
+ "lastUsedAt" DATETIME
12
+ );
13
+
14
+ -- CreateTable
15
+ CREATE TABLE "chat_requests" (
16
+ "id" TEXT NOT NULL PRIMARY KEY,
17
+ "requestId" TEXT NOT NULL,
18
+ "apiKeyId" TEXT NOT NULL,
19
+ "model" TEXT NOT NULL,
20
+ "stream" BOOLEAN NOT NULL DEFAULT false,
21
+ "status" TEXT NOT NULL,
22
+ "durationMs" INTEGER,
23
+ "grokSessionId" TEXT,
24
+ "promptCiphertext" BLOB NOT NULL,
25
+ "promptIv" BLOB NOT NULL,
26
+ "promptTag" BLOB NOT NULL,
27
+ "responseCiphertext" BLOB,
28
+ "responseIv" BLOB,
29
+ "responseTag" BLOB,
30
+ "errorMessage" TEXT,
31
+ "ip" TEXT,
32
+ "userAgent" TEXT,
33
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
34
+ CONSTRAINT "chat_requests_apiKeyId_fkey" FOREIGN KEY ("apiKeyId") REFERENCES "api_keys" ("id") ON DELETE CASCADE ON UPDATE CASCADE
35
+ );
36
+
37
+ -- CreateTable
38
+ CREATE TABLE "documents" (
39
+ "id" TEXT NOT NULL PRIMARY KEY,
40
+ "apiKeyId" TEXT NOT NULL,
41
+ "originalName" TEXT NOT NULL,
42
+ "mimeType" TEXT NOT NULL,
43
+ "sizeBytes" INTEGER NOT NULL,
44
+ "storageType" TEXT NOT NULL,
45
+ "contentCiphertext" BLOB,
46
+ "contentIv" BLOB,
47
+ "contentTag" BLOB,
48
+ "storagePath" TEXT,
49
+ "checksumSha256" TEXT NOT NULL,
50
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
51
+ "deletedAt" DATETIME,
52
+ CONSTRAINT "documents_apiKeyId_fkey" FOREIGN KEY ("apiKeyId") REFERENCES "api_keys" ("id") ON DELETE CASCADE ON UPDATE CASCADE
53
+ );
54
+
55
+ -- CreateTable
56
+ CREATE TABLE "chat_request_documents" (
57
+ "chatRequestId" TEXT NOT NULL,
58
+ "documentId" TEXT NOT NULL,
59
+
60
+ PRIMARY KEY ("chatRequestId", "documentId"),
61
+ CONSTRAINT "chat_request_documents_chatRequestId_fkey" FOREIGN KEY ("chatRequestId") REFERENCES "chat_requests" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
62
+ CONSTRAINT "chat_request_documents_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "documents" ("id") ON DELETE CASCADE ON UPDATE CASCADE
63
+ );
64
+
65
+ -- CreateTable
66
+ CREATE TABLE "audit_logs" (
67
+ "id" TEXT NOT NULL PRIMARY KEY,
68
+ "apiKeyId" TEXT,
69
+ "action" TEXT NOT NULL,
70
+ "resource" TEXT,
71
+ "resourceId" TEXT,
72
+ "metaJson" TEXT,
73
+ "ip" TEXT,
74
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
75
+ CONSTRAINT "audit_logs_apiKeyId_fkey" FOREIGN KEY ("apiKeyId") REFERENCES "api_keys" ("id") ON DELETE SET NULL ON UPDATE CASCADE
76
+ );
77
+
78
+ -- CreateIndex
79
+ CREATE UNIQUE INDEX "api_keys_keyHash_key" ON "api_keys"("keyHash");
80
+
81
+ -- CreateIndex
82
+ CREATE INDEX "api_keys_keyPrefix_idx" ON "api_keys"("keyPrefix");
83
+
84
+ -- CreateIndex
85
+ CREATE INDEX "api_keys_isActive_idx" ON "api_keys"("isActive");
86
+
87
+ -- CreateIndex
88
+ CREATE UNIQUE INDEX "chat_requests_requestId_key" ON "chat_requests"("requestId");
89
+
90
+ -- CreateIndex
91
+ CREATE INDEX "chat_requests_apiKeyId_createdAt_idx" ON "chat_requests"("apiKeyId", "createdAt");
92
+
93
+ -- CreateIndex
94
+ CREATE INDEX "chat_requests_status_idx" ON "chat_requests"("status");
95
+
96
+ -- CreateIndex
97
+ CREATE INDEX "documents_apiKeyId_createdAt_idx" ON "documents"("apiKeyId", "createdAt");
98
+
99
+ -- CreateIndex
100
+ CREATE INDEX "documents_deletedAt_idx" ON "documents"("deletedAt");
101
+
102
+ -- CreateIndex
103
+ CREATE INDEX "audit_logs_apiKeyId_createdAt_idx" ON "audit_logs"("apiKeyId", "createdAt");
104
+
105
+ -- CreateIndex
106
+ CREATE INDEX "audit_logs_action_createdAt_idx" ON "audit_logs"("action", "createdAt");
@@ -0,0 +1,36 @@
1
+ -- AlterTable
2
+ ALTER TABLE "chat_requests" ADD COLUMN "policyMode" TEXT;
3
+
4
+ -- CreateTable
5
+ CREATE TABLE "settings" (
6
+ "key" TEXT NOT NULL PRIMARY KEY,
7
+ "value" TEXT NOT NULL,
8
+ "updatedAt" DATETIME NOT NULL
9
+ );
10
+
11
+ -- RedefineTables
12
+ PRAGMA defer_foreign_keys=ON;
13
+ PRAGMA foreign_keys=OFF;
14
+ CREATE TABLE "new_api_keys" (
15
+ "id" TEXT NOT NULL PRIMARY KEY,
16
+ "name" TEXT NOT NULL,
17
+ "keyPrefix" TEXT NOT NULL,
18
+ "keyHash" TEXT NOT NULL,
19
+ "role" TEXT NOT NULL DEFAULT 'client',
20
+ "mode" TEXT NOT NULL DEFAULT 'safe',
21
+ "isActive" BOOLEAN NOT NULL DEFAULT true,
22
+ "rateLimit" INTEGER NOT NULL DEFAULT 60,
23
+ "maxTurns" INTEGER,
24
+ "timeoutMs" INTEGER,
25
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
26
+ "lastUsedAt" DATETIME
27
+ );
28
+ INSERT INTO "new_api_keys" ("createdAt", "id", "isActive", "keyHash", "keyPrefix", "lastUsedAt", "name", "rateLimit", "role") SELECT "createdAt", "id", "isActive", "keyHash", "keyPrefix", "lastUsedAt", "name", "rateLimit", "role" FROM "api_keys";
29
+ DROP TABLE "api_keys";
30
+ ALTER TABLE "new_api_keys" RENAME TO "api_keys";
31
+ CREATE UNIQUE INDEX "api_keys_keyHash_key" ON "api_keys"("keyHash");
32
+ CREATE INDEX "api_keys_keyPrefix_idx" ON "api_keys"("keyPrefix");
33
+ CREATE INDEX "api_keys_isActive_idx" ON "api_keys"("isActive");
34
+ CREATE INDEX "api_keys_mode_idx" ON "api_keys"("mode");
35
+ PRAGMA foreign_keys=ON;
36
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "sqlite"