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
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
+ [![CI](https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible/actions/workflows/ci.yml/badge.svg)](https://github.com/yanshekki/Grok-Cli-to-OpenAI-compatible/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/grok-cli-to-openai-compatible.svg)](https://www.npmjs.com/package/grok-cli-to-openai-compatible)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org/)
7
+ [![Default port](https://img.shields.io/badge/port-3847-informational)](#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,3 @@
1
+ import './interfaces/express.interface';
2
+ export declare function createApp(): import("express-serve-static-core").Express;
3
+ //# sourceMappingURL=app.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cmdDoctor(opts: {
2
+ home?: string;
3
+ forceHome?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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"}