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.
- package/.env.example +41 -0
- package/LICENSE +21 -0
- package/README.md +484 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +67 -0
- package/dist/app.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +5 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +77 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +5 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +25 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/open.d.ts +6 -0
- package/dist/cli/commands/open.d.ts.map +1 -0
- package/dist/cli/commands/open.js +24 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +7 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +12 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +5 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +38 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +6 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +73 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +57 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +5 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +42 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +5 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +21 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/update.d.ts +8 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +58 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/version.d.ts +2 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +16 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +128 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/env-file.d.ts +7 -0
- package/dist/cli/lib/env-file.d.ts.map +1 -0
- package/dist/cli/lib/env-file.js +99 -0
- package/dist/cli/lib/env-file.js.map +1 -0
- package/dist/cli/lib/paths.d.ts +27 -0
- package/dist/cli/lib/paths.d.ts.map +1 -0
- package/dist/cli/lib/paths.js +90 -0
- package/dist/cli/lib/paths.js.map +1 -0
- package/dist/cli/lib/print.d.ts +10 -0
- package/dist/cli/lib/print.d.ts.map +1 -0
- package/dist/cli/lib/print.js +28 -0
- package/dist/cli/lib/print.js.map +1 -0
- package/dist/cli/lib/process-mgr.d.ts +8 -0
- package/dist/cli/lib/process-mgr.d.ts.map +1 -0
- package/dist/cli/lib/process-mgr.js +105 -0
- package/dist/cli/lib/process-mgr.js.map +1 -0
- package/dist/config/constants.d.ts +60 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +127 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/cors.d.ts +3 -0
- package/dist/config/cors.d.ts.map +1 -0
- package/dist/config/cors.js +22 -0
- package/dist/config/cors.js.map +1 -0
- package/dist/config/database.d.ts +4 -0
- package/dist/config/database.d.ts.map +1 -0
- package/dist/config/database.js +18 -0
- package/dist/config/database.js.map +1 -0
- package/dist/config/env.d.ts +38 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +97 -0
- package/dist/config/env.js.map +1 -0
- package/dist/controllers/admin.controller.d.ts +21 -0
- package/dist/controllers/admin.controller.d.ts.map +1 -0
- package/dist/controllers/admin.controller.js +315 -0
- package/dist/controllers/admin.controller.js.map +1 -0
- package/dist/controllers/api-key.controller.d.ts +7 -0
- package/dist/controllers/api-key.controller.d.ts.map +1 -0
- package/dist/controllers/api-key.controller.js +48 -0
- package/dist/controllers/api-key.controller.js.map +1 -0
- package/dist/controllers/chat.controller.d.ts +5 -0
- package/dist/controllers/chat.controller.d.ts.map +1 -0
- package/dist/controllers/chat.controller.js +27 -0
- package/dist/controllers/chat.controller.js.map +1 -0
- package/dist/controllers/document.controller.d.ts +8 -0
- package/dist/controllers/document.controller.d.ts.map +1 -0
- package/dist/controllers/document.controller.js +53 -0
- package/dist/controllers/document.controller.js.map +1 -0
- package/dist/controllers/health.controller.d.ts +6 -0
- package/dist/controllers/health.controller.d.ts.map +1 -0
- package/dist/controllers/health.controller.js +39 -0
- package/dist/controllers/health.controller.js.map +1 -0
- package/dist/controllers/models.controller.d.ts +6 -0
- package/dist/controllers/models.controller.d.ts.map +1 -0
- package/dist/controllers/models.controller.js +18 -0
- package/dist/controllers/models.controller.js.map +1 -0
- package/dist/dto/admin.dto.d.ts +104 -0
- package/dist/dto/admin.dto.d.ts.map +1 -0
- package/dist/dto/admin.dto.js +45 -0
- package/dist/dto/admin.dto.js.map +1 -0
- package/dist/dto/api-key.dto.d.ts +27 -0
- package/dist/dto/api-key.dto.d.ts.map +1 -0
- package/dist/dto/api-key.dto.js +15 -0
- package/dist/dto/api-key.dto.js.map +1 -0
- package/dist/dto/chat.dto.d.ts +70 -0
- package/dist/dto/chat.dto.d.ts.map +1 -0
- package/dist/dto/chat.dto.js +49 -0
- package/dist/dto/chat.dto.js.map +1 -0
- package/dist/dto/document.dto.d.ts +21 -0
- package/dist/dto/document.dto.d.ts.map +1 -0
- package/dist/dto/document.dto.js +12 -0
- package/dist/dto/document.dto.js.map +1 -0
- package/dist/entities/api-key.entity.d.ts +33 -0
- package/dist/entities/api-key.entity.d.ts.map +1 -0
- package/dist/entities/api-key.entity.js +3 -0
- package/dist/entities/api-key.entity.js.map +1 -0
- package/dist/entities/audit-log.entity.d.ts +19 -0
- package/dist/entities/audit-log.entity.d.ts.map +1 -0
- package/dist/entities/audit-log.entity.js +3 -0
- package/dist/entities/audit-log.entity.js.map +1 -0
- package/dist/entities/chat-request.entity.d.ts +21 -0
- package/dist/entities/chat-request.entity.d.ts.map +1 -0
- package/dist/entities/chat-request.entity.js +3 -0
- package/dist/entities/chat-request.entity.js.map +1 -0
- package/dist/entities/document.entity.d.ts +22 -0
- package/dist/entities/document.entity.d.ts.map +1 -0
- package/dist/entities/document.entity.js +3 -0
- package/dist/entities/document.entity.js.map +1 -0
- package/dist/exceptions/error-codes.d.ts +18 -0
- package/dist/exceptions/error-codes.d.ts.map +1 -0
- package/dist/exceptions/error-codes.js +20 -0
- package/dist/exceptions/error-codes.js.map +1 -0
- package/dist/exceptions/exception.factory.d.ts +18 -0
- package/dist/exceptions/exception.factory.d.ts.map +1 -0
- package/dist/exceptions/exception.factory.js +50 -0
- package/dist/exceptions/exception.factory.js.map +1 -0
- package/dist/exceptions/http.exception.d.ts +18 -0
- package/dist/exceptions/http.exception.d.ts.map +1 -0
- package/dist/exceptions/http.exception.js +45 -0
- package/dist/exceptions/http.exception.js.map +1 -0
- package/dist/interfaces/auth.interface.d.ts +14 -0
- package/dist/interfaces/auth.interface.d.ts.map +1 -0
- package/dist/interfaces/auth.interface.js +3 -0
- package/dist/interfaces/auth.interface.js.map +1 -0
- package/dist/interfaces/express.interface.d.ts +11 -0
- package/dist/interfaces/express.interface.d.ts.map +1 -0
- package/dist/interfaces/express.interface.js +3 -0
- package/dist/interfaces/express.interface.js.map +1 -0
- package/dist/interfaces/grok.interface.d.ts +41 -0
- package/dist/interfaces/grok.interface.d.ts.map +1 -0
- package/dist/interfaces/grok.interface.js +3 -0
- package/dist/interfaces/grok.interface.js.map +1 -0
- package/dist/interfaces/openai.interface.d.ts +97 -0
- package/dist/interfaces/openai.interface.d.ts.map +1 -0
- package/dist/interfaces/openai.interface.js +3 -0
- package/dist/interfaces/openai.interface.js.map +1 -0
- package/dist/middlewares/auth.middleware.d.ts +5 -0
- package/dist/middlewares/auth.middleware.d.ts.map +1 -0
- package/dist/middlewares/auth.middleware.js +40 -0
- package/dist/middlewares/auth.middleware.js.map +1 -0
- package/dist/middlewares/concurrency.middleware.d.ts +6 -0
- package/dist/middlewares/concurrency.middleware.d.ts.map +1 -0
- package/dist/middlewares/concurrency.middleware.js +16 -0
- package/dist/middlewares/concurrency.middleware.js.map +1 -0
- package/dist/middlewares/error.middleware.d.ts +4 -0
- package/dist/middlewares/error.middleware.d.ts.map +1 -0
- package/dist/middlewares/error.middleware.js +38 -0
- package/dist/middlewares/error.middleware.js.map +1 -0
- package/dist/middlewares/rate-limit.middleware.d.ts +3 -0
- package/dist/middlewares/rate-limit.middleware.d.ts.map +1 -0
- package/dist/middlewares/rate-limit.middleware.js +40 -0
- package/dist/middlewares/rate-limit.middleware.js.map +1 -0
- package/dist/middlewares/request-id.middleware.d.ts +3 -0
- package/dist/middlewares/request-id.middleware.d.ts.map +1 -0
- package/dist/middlewares/request-id.middleware.js +12 -0
- package/dist/middlewares/request-id.middleware.js.map +1 -0
- package/dist/middlewares/upload.middleware.d.ts +2 -0
- package/dist/middlewares/upload.middleware.d.ts.map +1 -0
- package/dist/middlewares/upload.middleware.js +26 -0
- package/dist/middlewares/upload.middleware.js.map +1 -0
- package/dist/middlewares/validate.middleware.d.ts +6 -0
- package/dist/middlewares/validate.middleware.d.ts.map +1 -0
- package/dist/middlewares/validate.middleware.js +21 -0
- package/dist/middlewares/validate.middleware.js.map +1 -0
- package/dist/routes/admin.routes.d.ts +3 -0
- package/dist/routes/admin.routes.d.ts.map +1 -0
- package/dist/routes/admin.routes.js +44 -0
- package/dist/routes/admin.routes.js.map +1 -0
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +20 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/v1/api-keys.routes.d.ts +3 -0
- package/dist/routes/v1/api-keys.routes.d.ts.map +1 -0
- package/dist/routes/v1/api-keys.routes.js +13 -0
- package/dist/routes/v1/api-keys.routes.js.map +1 -0
- package/dist/routes/v1/chat.routes.d.ts +3 -0
- package/dist/routes/v1/chat.routes.d.ts.map +1 -0
- package/dist/routes/v1/chat.routes.js +13 -0
- package/dist/routes/v1/chat.routes.js.map +1 -0
- package/dist/routes/v1/documents.routes.d.ts +3 -0
- package/dist/routes/v1/documents.routes.d.ts.map +1 -0
- package/dist/routes/v1/documents.routes.js +15 -0
- package/dist/routes/v1/documents.routes.js.map +1 -0
- package/dist/routes/v1/models.routes.d.ts +3 -0
- package/dist/routes/v1/models.routes.d.ts.map +1 -0
- package/dist/routes/v1/models.routes.js +10 -0
- package/dist/routes/v1/models.routes.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +42 -0
- package/dist/server.js.map +1 -0
- package/dist/services/api-key.service.d.ts +33 -0
- package/dist/services/api-key.service.d.ts.map +1 -0
- package/dist/services/api-key.service.js +168 -0
- package/dist/services/api-key.service.js.map +1 -0
- package/dist/services/audit.service.d.ts +6 -0
- package/dist/services/audit.service.d.ts.map +1 -0
- package/dist/services/audit.service.js +21 -0
- package/dist/services/audit.service.js.map +1 -0
- package/dist/services/chat-admin.service.d.ts +76 -0
- package/dist/services/chat-admin.service.d.ts.map +1 -0
- package/dist/services/chat-admin.service.js +160 -0
- package/dist/services/chat-admin.service.js.map +1 -0
- package/dist/services/chat.service.d.ts +19 -0
- package/dist/services/chat.service.d.ts.map +1 -0
- package/dist/services/chat.service.js +335 -0
- package/dist/services/chat.service.js.map +1 -0
- package/dist/services/document.service.d.ts +37 -0
- package/dist/services/document.service.d.ts.map +1 -0
- package/dist/services/document.service.js +206 -0
- package/dist/services/document.service.js.map +1 -0
- package/dist/services/encryption.service.d.ts +8 -0
- package/dist/services/encryption.service.d.ts.map +1 -0
- package/dist/services/encryption.service.js +34 -0
- package/dist/services/encryption.service.js.map +1 -0
- package/dist/services/grok-cli.service.d.ts +18 -0
- package/dist/services/grok-cli.service.d.ts.map +1 -0
- package/dist/services/grok-cli.service.js +213 -0
- package/dist/services/grok-cli.service.js.map +1 -0
- package/dist/services/models.service.d.ts +10 -0
- package/dist/services/models.service.d.ts.map +1 -0
- package/dist/services/models.service.js +43 -0
- package/dist/services/models.service.js.map +1 -0
- package/dist/services/policy.service.d.ts +20 -0
- package/dist/services/policy.service.d.ts.map +1 -0
- package/dist/services/policy.service.js +66 -0
- package/dist/services/policy.service.js.map +1 -0
- package/dist/services/settings.service.d.ts +14 -0
- package/dist/services/settings.service.d.ts.map +1 -0
- package/dist/services/settings.service.js +86 -0
- package/dist/services/settings.service.js.map +1 -0
- package/dist/services/stats.service.d.ts +35 -0
- package/dist/services/stats.service.d.ts.map +1 -0
- package/dist/services/stats.service.js +59 -0
- package/dist/services/stats.service.js.map +1 -0
- package/dist/services/update.service.d.ts +44 -0
- package/dist/services/update.service.d.ts.map +1 -0
- package/dist/services/update.service.js +278 -0
- package/dist/services/update.service.js.map +1 -0
- package/dist/utils/async-handler.d.ts +5 -0
- package/dist/utils/async-handler.d.ts.map +1 -0
- package/dist/utils/async-handler.js +9 -0
- package/dist/utils/async-handler.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +34 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/openai-mapper.d.ts +30 -0
- package/dist/utils/openai-mapper.d.ts.map +1 -0
- package/dist/utils/openai-mapper.js +176 -0
- package/dist/utils/openai-mapper.js.map +1 -0
- package/dist/utils/path-safe.d.ts +4 -0
- package/dist/utils/path-safe.d.ts.map +1 -0
- package/dist/utils/path-safe.js +37 -0
- package/dist/utils/path-safe.js.map +1 -0
- package/dist/utils/stream.d.ts +5 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +22 -0
- package/dist/utils/stream.js.map +1 -0
- package/package.json +87 -0
- package/prisma/migrations/20260714084159_init_sqlite/migration.sql +106 -0
- package/prisma/migrations/20260714090338_safe_mode_admin/migration.sql +36 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +122 -0
- package/prisma/seed.ts +79 -0
- package/public/admin/app.js +734 -0
- package/public/admin/index.html +13 -0
- 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"}
|
package/dist/utils/id.js
ADDED
|
@@ -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 @@
|
|
|
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":";;AAiBA,0DAqDC;AAED,8CAmBC;AAMD,wDA0BC;AAED,oCAkBC;AAED,wCAwBC;AAED,sCAQC;AA+BD,4CAYC;AAtND,6BAA8C;AAS9C,SAAgB,uBAAuB,CACrC,KAAa,EACb,MAAsB,EACtB,UAAgC,EAAE;IAElC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAA,2BAAsB,GAAE,CAAC;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,KAAK,KAAK,CAAC;IAC5D,MAAM,SAAS,GACb,gBAAgB,IAAI,OAAO,CAAC,gBAAgB;QAC1C,CAAC,CAAC,OAAO,CAAC,gBAAgB;QAC1B,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,OAAO,GAAkD;QAC7D,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;KAC3B,CAAC;IAEF,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACtC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,aAAa;IAC5C,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACjC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAElF,MAAM,QAAQ,GAAyB;QACrC,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACtC,KAAK;QACL,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,CAAC;gBACR,OAAO;gBACP,aAAa,EAAE,YAAY;gBAC3B,QAAQ,EAAE,IAAI;aACf;SACF;QACD,KAAK,EAAE;YACL,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;SAChB;KACF,CAAC;IAEF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,iBAAiB,CAC/B,KAAa,EACb,OAAe,EACf,YAAoB,EACpB,OAAe;IAEf,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,uBAAuB;QAC/B,OAAO;QACP,KAAK;QACL,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,EAAE,OAAO,EAAE;gBAClB,aAAa,EAAE,IAAI;aACpB;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,KAAa,EACb,gBAAwB,EACxB,YAAoB,EACpB,OAAe,EACf,gBAAgB,GAAG,IAAI;IAEvB,MAAM,KAAK,GAAqD;QAC9D,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;IACF,IAAI,gBAAgB,EAAE,CAAC;QACrB,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC;IACnC,CAAC;IACD,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,uBAAuB;QAC/B,OAAO;QACP,KAAK;QACL,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,CAAC;gBACR,KAAK;gBACL,aAAa,EAAE,IAAI;aACpB;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAC1B,KAAa,EACb,YAAoB,EACpB,OAAe;IAEf,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,uBAAuB;QAC/B,OAAO;QACP,KAAK;QACL,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;gBACzC,aAAa,EAAE,IAAI;aACpB;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAC5B,KAAa,EACb,YAAoB,EACpB,OAAe,EACf,UAAmB,EACnB,IAAuB;IAEvB,MAAM,KAAK,GAA8B;QACvC,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,uBAAuB;QAC/B,OAAO;QACP,KAAK;QACL,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC;aACzC;SACF;KACF,CAAC;IACF,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,aAAa,CAAC,MAAgB;IAC5C,MAAM,IAAI,GAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE;QACF,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACtC,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,UAAmB;IACxC,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CACpB,MAAsB,EACtB,KAAwB;IAExB,MAAM,IAAI,GAAqB;QAC7B,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM,CAAC,SAAS;QAC/C,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,MAAM,CAAC,UAAU;QAClD,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,MAAM,CAAC,SAAS;KAChD,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAC9B,QAAqF;IAErF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,gEAAgE;QAChE,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -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;
|