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
package/.env.example
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
NODE_ENV=development
|
|
2
|
+
# Unique default port for this project (override anytime)
|
|
3
|
+
PORT=3847
|
|
4
|
+
HOST=0.0.0.0
|
|
5
|
+
|
|
6
|
+
# Optional: override data home (default ~/.gctoac when using global CLI)
|
|
7
|
+
# GCTOAC_HOME=/path/to/home
|
|
8
|
+
|
|
9
|
+
# SQLite — absolute file: path, or relative to prisma/ when developing in-repo
|
|
10
|
+
DATABASE_URL="file:../data/gateway.db"
|
|
11
|
+
|
|
12
|
+
# 32-byte key, base64-encoded (generate: openssl rand -base64 32)
|
|
13
|
+
ENCRYPTION_KEY=
|
|
14
|
+
|
|
15
|
+
# Optional: seed will create this admin key if set; otherwise generates a random one
|
|
16
|
+
# ADMIN_BOOTSTRAP_KEY=gk_live_your_admin_key_here
|
|
17
|
+
|
|
18
|
+
GROK_BIN=grok
|
|
19
|
+
GROK_DEFAULT_MODEL=grok-4.5
|
|
20
|
+
GROK_DEFAULT_CWD=.
|
|
21
|
+
# Comma-separated absolute paths allowed for --cwd (empty = only GROK_DEFAULT_CWD)
|
|
22
|
+
GROK_CWD_ALLOWLIST=
|
|
23
|
+
GROK_TIMEOUT_MS=600000
|
|
24
|
+
GROK_MAX_CONCURRENT=4
|
|
25
|
+
GROK_ALWAYS_APPROVE=true
|
|
26
|
+
# Force all API keys into safe mode (overrides per-key agent)
|
|
27
|
+
GROK_SAFE_MODE=false
|
|
28
|
+
GROK_SAFE_MAX_TURNS=4
|
|
29
|
+
GROK_SAFE_TIMEOUT_MS=120000
|
|
30
|
+
ADMIN_PANEL_ENABLED=true
|
|
31
|
+
|
|
32
|
+
CORS_ORIGINS=http://localhost:3847,http://127.0.0.1:3847
|
|
33
|
+
RATE_LIMIT_WINDOW_MS=60000
|
|
34
|
+
RATE_LIMIT_MAX=120
|
|
35
|
+
BODY_LIMIT=1mb
|
|
36
|
+
UPLOAD_MAX_BYTES=10485760
|
|
37
|
+
DOCUMENT_DB_MAX_BYTES=1048576
|
|
38
|
+
STORAGE_DIR=./storage
|
|
39
|
+
|
|
40
|
+
LOG_LEVEL=info
|
|
41
|
+
TRUST_PROXY=true
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 yanshekki
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
# Grok CLI → OpenAI-Compatible Gateway
|
|
2
|
+
|
|
3
|
+
[](https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/grok-cli-to-openai-compatible)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://nodejs.org/)
|
|
7
|
+
[](#default-port-3847)
|
|
8
|
+
|
|
9
|
+
Turn local **[Grok CLI](https://x.ai)** headless mode (`grok -p`) into a production-ready **OpenAI-compatible HTTP API**, with encryption, audit logging, per-key **safe/agent** security policy, a full **Admin Panel**, and a control CLI (`gctoac` / `gcoa`).
|
|
10
|
+
|
|
11
|
+
**npm package:** [`grok-cli-to-openai-compatible`](https://www.npmjs.com/package/grok-cli-to-openai-compatible)
|
|
12
|
+
**CLI:** `gctoac` · short alias `gcoa`
|
|
13
|
+
**Default port:** **`3847`** (unique to this project; override with `PORT=`)
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
Client (OpenAI SDK / curl)
|
|
17
|
+
│ Authorization: Bearer gk_live_...
|
|
18
|
+
▼
|
|
19
|
+
┌───────────────────────────────────────┐
|
|
20
|
+
│ Express Gateway :3847 │
|
|
21
|
+
│ · Auth / rate limit / validation │
|
|
22
|
+
│ · Safe | Agent policy │
|
|
23
|
+
│ · Encrypt + audit every chat │
|
|
24
|
+
│ · Admin Panel @ /admin │
|
|
25
|
+
│ · CLI: gctoac start|stop|status… │
|
|
26
|
+
└───────────────────┬───────────────────┘
|
|
27
|
+
│ spawn
|
|
28
|
+
▼
|
|
29
|
+
grok -p … (local CLI)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Install (npm)
|
|
35
|
+
|
|
36
|
+
### Global (recommended for daily use)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# After publish to npm:
|
|
40
|
+
npm install -g grok-cli-to-openai-compatible
|
|
41
|
+
|
|
42
|
+
# Or from GitHub without waiting for npm:
|
|
43
|
+
npm install -g github:yanshekki/Grok-Cli-to-OpenAI-compatible
|
|
44
|
+
|
|
45
|
+
gctoac doctor
|
|
46
|
+
gctoac setup # ~/.gctoac — .env, DB migrate, admin key
|
|
47
|
+
gctoac start # background on port 3847
|
|
48
|
+
gctoac status
|
|
49
|
+
gcoa open # same binary, short name
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Data directory for global installs: **`~/.gctoac/`** (override with `GCTOAC_HOME` or `gctoac --home /path`).
|
|
53
|
+
|
|
54
|
+
### Local project
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install grok-cli-to-openai-compatible
|
|
58
|
+
npx gctoac setup
|
|
59
|
+
npx gctoac start --foreground
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### From source
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible.git
|
|
66
|
+
cd Grok-Cli-to-OpenAI-compatible
|
|
67
|
+
npm install
|
|
68
|
+
npm run build
|
|
69
|
+
npx gctoac setup # uses project ./data when run inside repo
|
|
70
|
+
npx gctoac start
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## CLI reference (`gctoac` / `gcoa`)
|
|
76
|
+
|
|
77
|
+
| Command | Description |
|
|
78
|
+
|---------|-------------|
|
|
79
|
+
| `gctoac setup` | Create data dirs, `.env`, migrate, seed admin key |
|
|
80
|
+
| `gctoac start` | Start gateway in background |
|
|
81
|
+
| `gctoac start -f` | Start in foreground |
|
|
82
|
+
| `gctoac stop` | Stop background process |
|
|
83
|
+
| `gctoac restart` | Stop + start |
|
|
84
|
+
| `gctoac status` | PID + `/health` check |
|
|
85
|
+
| `gctoac migrate` | `prisma migrate deploy` |
|
|
86
|
+
| `gctoac seed` | Bootstrap admin API key |
|
|
87
|
+
| `gctoac doctor` | Check Node, Grok CLI, env, build |
|
|
88
|
+
| `gctoac update` | **Self-update** (git / npm / GitHub) then restart |
|
|
89
|
+
| `gctoac update --check` | Only check for newer version |
|
|
90
|
+
| `gctoac update --no-restart` | Update without restarting |
|
|
91
|
+
| `gctoac open` | Print API / Admin URLs |
|
|
92
|
+
| `gctoac open --admin` | Admin URL only |
|
|
93
|
+
| `gctoac version` | Package version |
|
|
94
|
+
|
|
95
|
+
**Global flags:**
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
gctoac --home ~/.gctoac-alt setup
|
|
99
|
+
gctoac --port 3847 start
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Default port `3847`
|
|
105
|
+
|
|
106
|
+
| URL | Purpose |
|
|
107
|
+
|-----|---------|
|
|
108
|
+
| `http://127.0.0.1:3847/v1` | OpenAI-compatible API base |
|
|
109
|
+
| `http://127.0.0.1:3847/admin/` | Admin Panel |
|
|
110
|
+
| `http://127.0.0.1:3847/health` | Liveness |
|
|
111
|
+
|
|
112
|
+
Change with `PORT=` in `.env` or `gctoac --port … start`.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Features
|
|
117
|
+
|
|
118
|
+
| Area | Details |
|
|
119
|
+
|------|---------|
|
|
120
|
+
| **OpenAI API** | `POST /v1/chat/completions` (stream + non-stream), `GET /v1/models` |
|
|
121
|
+
| **Thinking** | DeepSeek-style `reasoning_content` + Grok `thought` alias + `grok.*` metadata |
|
|
122
|
+
| **Documents** | Encrypted upload; attach via `document_ids` in chat |
|
|
123
|
+
| **Security modes** | Per-key `safe` / `agent`; optional global force-safe |
|
|
124
|
+
| **Encryption** | AES-256-GCM for prompts, responses, document bodies |
|
|
125
|
+
| **Admin UI** | Dashboard, full chat in/out decrypt, keys, docs, audit, settings |
|
|
126
|
+
| **CLI** | `gctoac` / `gcoa` lifecycle + **self-update** |
|
|
127
|
+
| **One-click update** | Admin → 系統狀態 → 一鍵更新並重啟 |
|
|
128
|
+
| **Ops** | SQLite, PM2, GitHub Actions CI, structured logging |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Tech stack
|
|
133
|
+
|
|
134
|
+
- **Runtime:** Node.js 20+, TypeScript (strict)
|
|
135
|
+
- **HTTP:** Express, Helmet, CORS, express-rate-limit, Zod
|
|
136
|
+
- **Data:** Prisma + **SQLite**
|
|
137
|
+
- **CLI:** Commander (`gctoac` / `gcoa`)
|
|
138
|
+
- **Process:** PM2 (fork, single instance) or `gctoac start`
|
|
139
|
+
- **Grok:** Local CLI via `execa` (argv only, no shell)
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Prerequisites
|
|
144
|
+
|
|
145
|
+
1. [Node.js](https://nodejs.org/) ≥ 20
|
|
146
|
+
2. [Grok CLI](https://x.ai) installed and authenticated:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
curl -fsSL https://x.ai/cli/install.sh | bash
|
|
150
|
+
grok login
|
|
151
|
+
grok --version
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Quick start (source / dev)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
git clone https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible.git
|
|
160
|
+
cd Grok-Cli-to-OpenAI-compatible
|
|
161
|
+
|
|
162
|
+
cp .env.example .env
|
|
163
|
+
# Generate a 32-byte key and paste into ENCRYPTION_KEY=
|
|
164
|
+
openssl rand -base64 32
|
|
165
|
+
|
|
166
|
+
npm install
|
|
167
|
+
npm run db:setup # migrate + seed (prints admin API key ONCE)
|
|
168
|
+
|
|
169
|
+
npm run dev
|
|
170
|
+
# → API: http://127.0.0.1:3847
|
|
171
|
+
# → Admin: http://127.0.0.1:3847/admin/
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Or: `npm run build && gctoac setup && gctoac start`
|
|
175
|
+
|
|
176
|
+
### First admin login
|
|
177
|
+
|
|
178
|
+
1. Copy the **admin API key** printed by `gctoac setup` / `npm run seed` (only shown once).
|
|
179
|
+
2. Open **http://127.0.0.1:3847/admin/**
|
|
180
|
+
3. Paste the key to sign in.
|
|
181
|
+
4. Create a **client** key (`mode=safe` for external apps, `mode=agent` for trusted internal use).
|
|
182
|
+
|
|
183
|
+
> **Security:** Admin can decrypt all chat prompts/responses. Never commit `.env` or share admin keys.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Production (PM2)
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
npm run build
|
|
191
|
+
pm2 start ecosystem.config.cjs
|
|
192
|
+
pm2 status
|
|
193
|
+
pm2 logs grok-openai-gateway
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Uses **fork mode, 1 instance** so concurrent Grok child processes stay predictable.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Project layout
|
|
201
|
+
|
|
202
|
+
```text
|
|
203
|
+
src/
|
|
204
|
+
app.ts / server.ts # Express app + graceful shutdown
|
|
205
|
+
config/ # env, database, cors, constants
|
|
206
|
+
dto/ # Zod request schemas
|
|
207
|
+
interfaces/ # OpenAI / Grok / auth types
|
|
208
|
+
entities/ # Domain shapes
|
|
209
|
+
exceptions/ # HTTP errors (OpenAI-ish JSON)
|
|
210
|
+
middlewares/ # auth, rate-limit, validate, upload…
|
|
211
|
+
controllers/ # HTTP layer (+ admin)
|
|
212
|
+
routes/v1/ # public OpenAI-compatible API
|
|
213
|
+
routes/admin.routes.ts # /admin/api/*
|
|
214
|
+
services/ # business logic
|
|
215
|
+
grok-cli.service.ts # spawn + parse CLI
|
|
216
|
+
policy.service.ts # safe/agent resolution
|
|
217
|
+
chat.service.ts # completions + audit encrypt
|
|
218
|
+
chat-admin.service.ts # decrypt for admin
|
|
219
|
+
settings.service.ts # runtime settings (DB)
|
|
220
|
+
…
|
|
221
|
+
utils/ # logger, SSE, mappers, path-safe
|
|
222
|
+
public/admin/ # Admin SPA (static)
|
|
223
|
+
prisma/ # schema + migrations + seed
|
|
224
|
+
data/ # gateway.db (gitignored)
|
|
225
|
+
storage/ # encrypted files + sandboxes
|
|
226
|
+
tests/ # Vitest unit + integration
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Admin Panel
|
|
232
|
+
|
|
233
|
+
| Page | Capabilities |
|
|
234
|
+
|------|----------------|
|
|
235
|
+
| **Dashboard** | Totals, 24h volume, concurrency, recent chats |
|
|
236
|
+
| **Chat 記錄** | List + **full decrypted prompt / reasoning / content** |
|
|
237
|
+
| **API Keys** | Create / edit `role` + `mode` + rate limit / revoke |
|
|
238
|
+
| **文件** | List, decrypt preview modal, soft-delete |
|
|
239
|
+
| **Audit Logs** | Lifecycle events |
|
|
240
|
+
| **安全設定** | Global safe mode, tools policy, timeouts, default model |
|
|
241
|
+
| **系統狀態** | DB / Grok CLI / env summary (no secrets) |
|
|
242
|
+
|
|
243
|
+
**Admin JSON API** (Bearer admin key):
|
|
244
|
+
|
|
245
|
+
| Method | Path |
|
|
246
|
+
|--------|------|
|
|
247
|
+
| GET | `/admin/api/me` |
|
|
248
|
+
| GET | `/admin/api/stats` |
|
|
249
|
+
| GET | `/admin/api/chats`, `/admin/api/chats/:id` |
|
|
250
|
+
| GET/POST/PATCH/DELETE | `/admin/api/keys`… |
|
|
251
|
+
| GET/DELETE | `/admin/api/documents`… |
|
|
252
|
+
| GET | `/admin/api/audit-logs` |
|
|
253
|
+
| GET/PUT | `/admin/api/settings` |
|
|
254
|
+
| GET | `/admin/api/system` |
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Safe / Agent policy
|
|
259
|
+
|
|
260
|
+
| Mode | Default for | Behavior |
|
|
261
|
+
|------|-------------|----------|
|
|
262
|
+
| **`safe`** | New client keys | Forced sandbox cwd under `storage/sandboxes/{keyId}`, **no** `--always-approve`, tool denylist (or readonly allowlist), shorter timeout / max-turns |
|
|
263
|
+
| **`agent`** | Admin / trusted | Full CLI capability (optional always-approve), cwd still limited by `GROK_CWD_ALLOWLIST` |
|
|
264
|
+
|
|
265
|
+
- **Global force-safe:** `GROK_SAFE_MODE=true` **or** Admin → 安全設定 →「全域 Safe Mode」
|
|
266
|
+
- Clients **cannot** escalate privileges via request body (safe mode ignores arbitrary `cwd`).
|
|
267
|
+
|
|
268
|
+
> Exposing this gateway on the public internet with `agent` keys is dangerous: Grok CLI is an **agent** with tools, not a pure chat API. Prefer **`safe`** for third parties.
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Public API
|
|
273
|
+
|
|
274
|
+
All protected routes require:
|
|
275
|
+
|
|
276
|
+
```http
|
|
277
|
+
Authorization: Bearer gk_live_...
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Health
|
|
281
|
+
|
|
282
|
+
| Method | Path | Auth |
|
|
283
|
+
|--------|------|------|
|
|
284
|
+
| GET | `/health` | No |
|
|
285
|
+
| GET | `/ready` | No (DB required; reports Grok CLI) |
|
|
286
|
+
|
|
287
|
+
### OpenAI-compatible
|
|
288
|
+
|
|
289
|
+
| Method | Path | Description |
|
|
290
|
+
|--------|------|-------------|
|
|
291
|
+
| GET | `/v1/models` | List models |
|
|
292
|
+
| GET | `/v1/models/:model` | Get model |
|
|
293
|
+
| POST | `/v1/chat/completions` | Chat (`stream`, thinking) |
|
|
294
|
+
|
|
295
|
+
#### Chat body (extensions)
|
|
296
|
+
|
|
297
|
+
```json
|
|
298
|
+
{
|
|
299
|
+
"model": "grok-4.5",
|
|
300
|
+
"messages": [{ "role": "user", "content": "Hello" }],
|
|
301
|
+
"stream": false,
|
|
302
|
+
"include_reasoning": true,
|
|
303
|
+
"cwd": "/allowed/workspace",
|
|
304
|
+
"session_id": "optional-grok-session",
|
|
305
|
+
"document_ids": ["uuid-of-uploaded-doc"]
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
| Field | Notes |
|
|
310
|
+
|-------|--------|
|
|
311
|
+
| `include_reasoning` | Default `true`. Maps Grok `thought` → `reasoning_content` |
|
|
312
|
+
| `cwd` | Only honored in **agent** mode and inside allowlist; **safe** forces sandbox |
|
|
313
|
+
| `session_id` | Passed to `grok -s` for multi-turn CLI sessions |
|
|
314
|
+
| `document_ids` | Inject decrypted document text as system context |
|
|
315
|
+
|
|
316
|
+
#### Thinking mapping
|
|
317
|
+
|
|
318
|
+
| Grok CLI event | Mainstream (DeepSeek) | Grok extras |
|
|
319
|
+
|----------------|----------------------|-------------|
|
|
320
|
+
| `type: thought` | `reasoning_content` / `delta.reasoning_content` | `thought` / `delta.thought` |
|
|
321
|
+
| `type: text` | `content` / `delta.content` | same |
|
|
322
|
+
| `type: end` | `finish_reason` | `grok.sessionId`, `grok.stopReason` |
|
|
323
|
+
|
|
324
|
+
Stream order: **reasoning deltas → content deltas → finish (+ `grok`) → `[DONE]`**.
|
|
325
|
+
|
|
326
|
+
#### curl examples
|
|
327
|
+
|
|
328
|
+
**Non-stream**
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
export API_KEY=gk_live_...
|
|
332
|
+
|
|
333
|
+
curl -s http://127.0.0.1:3847/v1/chat/completions \
|
|
334
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
335
|
+
-H "Content-Type: application/json" \
|
|
336
|
+
-d '{
|
|
337
|
+
"model": "grok-4.5",
|
|
338
|
+
"messages": [{"role":"user","content":"Say hi in one word"}]
|
|
339
|
+
}'
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**Stream**
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
curl -sN http://127.0.0.1:3847/v1/chat/completions \
|
|
346
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
347
|
+
-H "Content-Type: application/json" \
|
|
348
|
+
-d '{
|
|
349
|
+
"model": "grok-4.5",
|
|
350
|
+
"stream": true,
|
|
351
|
+
"include_reasoning": true,
|
|
352
|
+
"messages": [{"role":"user","content":"Count to 3"}]
|
|
353
|
+
}'
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
#### OpenAI SDK
|
|
357
|
+
|
|
358
|
+
```ts
|
|
359
|
+
import OpenAI from 'openai';
|
|
360
|
+
|
|
361
|
+
const client = new OpenAI({
|
|
362
|
+
apiKey: process.env.API_KEY,
|
|
363
|
+
baseURL: 'http://127.0.0.1:3847/v1',
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
const res = await client.chat.completions.create({
|
|
367
|
+
model: 'grok-4.5',
|
|
368
|
+
messages: [{ role: 'user', content: 'Hello' }],
|
|
369
|
+
// @ts-expect-error gateway extension
|
|
370
|
+
include_reasoning: true,
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
const msg = res.choices[0].message as {
|
|
374
|
+
content?: string | null;
|
|
375
|
+
reasoning_content?: string | null;
|
|
376
|
+
};
|
|
377
|
+
console.log(msg.reasoning_content, msg.content);
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Documents
|
|
381
|
+
|
|
382
|
+
| Method | Path | Description |
|
|
383
|
+
|--------|------|-------------|
|
|
384
|
+
| POST | `/v1/documents` | multipart field `file` |
|
|
385
|
+
| GET | `/v1/documents` | list |
|
|
386
|
+
| GET | `/v1/documents/:id` | metadata |
|
|
387
|
+
| DELETE | `/v1/documents/:id` | soft delete |
|
|
388
|
+
|
|
389
|
+
```bash
|
|
390
|
+
curl -s http://127.0.0.1:3847/v1/documents \
|
|
391
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
392
|
+
-F "file=@./notes.txt"
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### API keys (admin role via `/v1` or Admin Panel)
|
|
396
|
+
|
|
397
|
+
| Method | Path | Description |
|
|
398
|
+
|--------|------|-------------|
|
|
399
|
+
| POST | `/v1/api-keys` | Create (plaintext returned **once**) |
|
|
400
|
+
| GET | `/v1/api-keys` | List (prefix only) |
|
|
401
|
+
| DELETE | `/v1/api-keys/:id` | Revoke |
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## Environment variables
|
|
406
|
+
|
|
407
|
+
See [`.env.example`](.env.example). Critical keys:
|
|
408
|
+
|
|
409
|
+
| Variable | Description |
|
|
410
|
+
|----------|-------------|
|
|
411
|
+
| `DATABASE_URL` | SQLite path relative to `prisma/` e.g. `file:../data/gateway.db` |
|
|
412
|
+
| `ENCRYPTION_KEY` | 32-byte key, base64 or 64-char hex (`openssl rand -base64 32`) |
|
|
413
|
+
| `GROK_BIN` | CLI binary (default `grok`) |
|
|
414
|
+
| `GROK_DEFAULT_MODEL` | Default model id |
|
|
415
|
+
| `GROK_DEFAULT_CWD` / `GROK_CWD_ALLOWLIST` | Working directory policy for **agent** mode |
|
|
416
|
+
| `GROK_ALWAYS_APPROVE` | Agent mode only; safe mode always disables |
|
|
417
|
+
| `GROK_SAFE_MODE` | Force all keys into safe mode |
|
|
418
|
+
| `GROK_SAFE_MAX_TURNS` / `GROK_SAFE_TIMEOUT_MS` | Safe defaults |
|
|
419
|
+
| `GROK_MAX_CONCURRENT` | Max parallel CLI processes |
|
|
420
|
+
| `ADMIN_PANEL_ENABLED` | Master switch for `/admin` |
|
|
421
|
+
| `CORS_ORIGINS` | Comma-separated origins |
|
|
422
|
+
| `PORT` / `HOST` | Listen address (**default `3847`** / `0.0.0.0`) |
|
|
423
|
+
| `GCTOAC_HOME` | CLI data home (default `~/.gctoac` for global install) |
|
|
424
|
+
|
|
425
|
+
**Back up `ENCRYPTION_KEY`.** Losing it makes historical ciphertext unreadable.
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Security summary
|
|
430
|
+
|
|
431
|
+
| Control | Detail |
|
|
432
|
+
|---------|--------|
|
|
433
|
+
| Auth | Bearer API keys; only SHA-256 **hash** stored |
|
|
434
|
+
| Encryption | AES-256-GCM at rest for chat + documents |
|
|
435
|
+
| Safe policy | Sandbox cwd, tool limits, no always-approve |
|
|
436
|
+
| Rate limit | Global + per-key |
|
|
437
|
+
| Concurrency | Caps Grok spawns |
|
|
438
|
+
| Process | `execa` argv arrays only; env scrubbed |
|
|
439
|
+
| Path | CWD allowlist (agent); forced sandbox (safe) |
|
|
440
|
+
| Upload | Size / extension / MIME allowlists |
|
|
441
|
+
| HTTP | Helmet, CORS, body size limit |
|
|
442
|
+
| Audit | Encrypted chats + `audit_logs` for admin actions |
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## Scripts
|
|
447
|
+
|
|
448
|
+
```bash
|
|
449
|
+
npm run dev # tsx watch
|
|
450
|
+
npm run build # tsc → dist/ (+ chmod CLI)
|
|
451
|
+
npm start # node dist/server.js
|
|
452
|
+
npm test # Vitest (unit + integration)
|
|
453
|
+
npm run typecheck
|
|
454
|
+
npm run db:setup # migrate deploy + seed
|
|
455
|
+
npm run seed # bootstrap admin key
|
|
456
|
+
npm run smoke # API_KEY=... bash scripts/smoke.sh
|
|
457
|
+
gctoac setup|start|status|stop|doctor
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### Publish (maintainers)
|
|
461
|
+
|
|
462
|
+
```bash
|
|
463
|
+
npm run build
|
|
464
|
+
npm publish --access public
|
|
465
|
+
# requires npm login + package name available
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
Install from GitHub without npm publish:
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
npm install -g github:yanshekki/Grok-Cli-to-OpenAI-compatible
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## License
|
|
477
|
+
|
|
478
|
+
MIT — see repository license terms.
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## Disclaimer
|
|
483
|
+
|
|
484
|
+
This project shells out to **Grok CLI**, which can run tools (filesystem, shell, web, etc.) depending on policy and flags. You are responsible for authentication, network exposure, and key mode (`safe` vs `agent`). The authors are not responsible for misuse or data loss.
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAaA,OAAO,gCAAgC,CAAC;AAExC,wBAAgB,SAAS,gDAyDxB"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
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.createApp = createApp;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const express_1 = __importDefault(require("express"));
|
|
9
|
+
const cors_1 = __importDefault(require("cors"));
|
|
10
|
+
const helmet_1 = __importDefault(require("helmet"));
|
|
11
|
+
const pino_http_1 = __importDefault(require("pino-http"));
|
|
12
|
+
const env_1 = require("./config/env");
|
|
13
|
+
const cors_2 = require("./config/cors");
|
|
14
|
+
const routes_1 = __importDefault(require("./routes"));
|
|
15
|
+
const admin_routes_1 = __importDefault(require("./routes/admin.routes"));
|
|
16
|
+
const request_id_middleware_1 = require("./middlewares/request-id.middleware");
|
|
17
|
+
const rate_limit_middleware_1 = require("./middlewares/rate-limit.middleware");
|
|
18
|
+
const error_middleware_1 = require("./middlewares/error.middleware");
|
|
19
|
+
const logger_1 = require("./utils/logger");
|
|
20
|
+
require("./interfaces/express.interface");
|
|
21
|
+
function createApp() {
|
|
22
|
+
const app = (0, express_1.default)();
|
|
23
|
+
if (env_1.env.TRUST_PROXY) {
|
|
24
|
+
app.set('trust proxy', 1);
|
|
25
|
+
}
|
|
26
|
+
app.disable('x-powered-by');
|
|
27
|
+
app.use((0, helmet_1.default)({
|
|
28
|
+
contentSecurityPolicy: false, // admin SPA inline styles
|
|
29
|
+
}));
|
|
30
|
+
app.use((0, cors_1.default)(cors_2.corsOptions));
|
|
31
|
+
app.use(request_id_middleware_1.requestIdMiddleware);
|
|
32
|
+
app.use((0, pino_http_1.default)({
|
|
33
|
+
logger: logger_1.logger,
|
|
34
|
+
genReqId: (req) => req.requestId,
|
|
35
|
+
customProps: (req) => ({
|
|
36
|
+
requestId: req.requestId,
|
|
37
|
+
}),
|
|
38
|
+
autoLogging: {
|
|
39
|
+
ignore: (req) => req.url === '/health' ||
|
|
40
|
+
req.url === '/ready' ||
|
|
41
|
+
(req.url?.startsWith('/admin') && !req.url.startsWith('/admin/api')),
|
|
42
|
+
},
|
|
43
|
+
}));
|
|
44
|
+
app.use(express_1.default.json({ limit: env_1.env.BODY_LIMIT }));
|
|
45
|
+
app.use(express_1.default.urlencoded({ extended: false, limit: env_1.env.BODY_LIMIT }));
|
|
46
|
+
app.use(rate_limit_middleware_1.globalRateLimiter);
|
|
47
|
+
// Admin JSON API
|
|
48
|
+
app.use('/admin/api', admin_routes_1.default);
|
|
49
|
+
// Admin SPA static files
|
|
50
|
+
const adminDir = node_path_1.default.join(process.cwd(), 'public', 'admin');
|
|
51
|
+
app.use('/admin', express_1.default.static(adminDir, { index: 'index.html' }));
|
|
52
|
+
app.get(['/admin', '/admin/*'], (req, res, next) => {
|
|
53
|
+
if (req.path.startsWith('/admin/api')) {
|
|
54
|
+
next();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
res.sendFile(node_path_1.default.join(adminDir, 'index.html'), (err) => {
|
|
58
|
+
if (err)
|
|
59
|
+
next();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
app.use(routes_1.default);
|
|
63
|
+
app.use(error_middleware_1.notFoundHandler);
|
|
64
|
+
app.use(error_middleware_1.errorMiddleware);
|
|
65
|
+
return app;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAUA,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DhB"}
|