@very_aq/codex-cli-web 0.0.1

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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/README.zh-CN.md +228 -0
  4. package/package.json +38 -0
  5. package/server/dist/admin/userAdminRoutes.d.ts +7 -0
  6. package/server/dist/admin/userAdminRoutes.js +91 -0
  7. package/server/dist/admin/userAdminRoutes.js.map +1 -0
  8. package/server/dist/app.d.ts +22 -0
  9. package/server/dist/app.js +993 -0
  10. package/server/dist/app.js.map +1 -0
  11. package/server/dist/auth/adminInit.d.ts +41 -0
  12. package/server/dist/auth/adminInit.js +126 -0
  13. package/server/dist/auth/adminInit.js.map +1 -0
  14. package/server/dist/auth/bootstrapAdmin.d.ts +6 -0
  15. package/server/dist/auth/bootstrapAdmin.js +11 -0
  16. package/server/dist/auth/bootstrapAdmin.js.map +1 -0
  17. package/server/dist/auth/httpAuth.d.ts +16 -0
  18. package/server/dist/auth/httpAuth.js +31 -0
  19. package/server/dist/auth/httpAuth.js.map +1 -0
  20. package/server/dist/auth/password.d.ts +2 -0
  21. package/server/dist/auth/password.js +68 -0
  22. package/server/dist/auth/password.js.map +1 -0
  23. package/server/dist/auth/requireAdmin.d.ts +2 -0
  24. package/server/dist/auth/requireAdmin.js +14 -0
  25. package/server/dist/auth/requireAdmin.js.map +1 -0
  26. package/server/dist/auth/roles.d.ts +3 -0
  27. package/server/dist/auth/roles.js +13 -0
  28. package/server/dist/auth/roles.js.map +1 -0
  29. package/server/dist/auth/session.d.ts +24 -0
  30. package/server/dist/auth/session.js +127 -0
  31. package/server/dist/auth/session.js.map +1 -0
  32. package/server/dist/auth/sqlite/authDb.d.ts +18 -0
  33. package/server/dist/auth/sqlite/authDb.js +26 -0
  34. package/server/dist/auth/sqlite/authDb.js.map +1 -0
  35. package/server/dist/auth/sqlite/legacyImport.d.ts +22 -0
  36. package/server/dist/auth/sqlite/legacyImport.js +208 -0
  37. package/server/dist/auth/sqlite/legacyImport.js.map +1 -0
  38. package/server/dist/auth/sqlite/schema.d.ts +11 -0
  39. package/server/dist/auth/sqlite/schema.js +47 -0
  40. package/server/dist/auth/sqlite/schema.js.map +1 -0
  41. package/server/dist/auth/sqlite/sqliteUserStore.d.ts +12 -0
  42. package/server/dist/auth/sqlite/sqliteUserStore.js +194 -0
  43. package/server/dist/auth/sqlite/sqliteUserStore.js.map +1 -0
  44. package/server/dist/auth/userStore.d.ts +19 -0
  45. package/server/dist/auth/userStore.js +26 -0
  46. package/server/dist/auth/userStore.js.map +1 -0
  47. package/server/dist/auth/userTypes.d.ts +13 -0
  48. package/server/dist/auth/userTypes.js +3 -0
  49. package/server/dist/auth/userTypes.js.map +1 -0
  50. package/server/dist/chat/attachmentPathRedaction.d.ts +5 -0
  51. package/server/dist/chat/attachmentPathRedaction.js +67 -0
  52. package/server/dist/chat/attachmentPathRedaction.js.map +1 -0
  53. package/server/dist/chat/chatItemEnricher.d.ts +5 -0
  54. package/server/dist/chat/chatItemEnricher.js +40 -0
  55. package/server/dist/chat/chatItemEnricher.js.map +1 -0
  56. package/server/dist/chat/codexEventProjector.d.ts +33 -0
  57. package/server/dist/chat/codexEventProjector.js +482 -0
  58. package/server/dist/chat/codexEventProjector.js.map +1 -0
  59. package/server/dist/chat/contextUsageProjector.d.ts +10 -0
  60. package/server/dist/chat/contextUsageProjector.js +472 -0
  61. package/server/dist/chat/contextUsageProjector.js.map +1 -0
  62. package/server/dist/chat/fileChangeExtractor.d.ts +5 -0
  63. package/server/dist/chat/fileChangeExtractor.js +121 -0
  64. package/server/dist/chat/fileChangeExtractor.js.map +1 -0
  65. package/server/dist/chat/markdown/markdownAst.d.ts +5 -0
  66. package/server/dist/chat/markdown/markdownAst.js +154 -0
  67. package/server/dist/chat/markdown/markdownAst.js.map +1 -0
  68. package/server/dist/chat/systemToolCallSummary.d.ts +10 -0
  69. package/server/dist/chat/systemToolCallSummary.js +112 -0
  70. package/server/dist/chat/systemToolCallSummary.js.map +1 -0
  71. package/server/dist/chat/terminal/terminalPlainText.d.ts +14 -0
  72. package/server/dist/chat/terminal/terminalPlainText.js +139 -0
  73. package/server/dist/chat/terminal/terminalPlainText.js.map +1 -0
  74. package/server/dist/chat/textMetrics.d.ts +9 -0
  75. package/server/dist/chat/textMetrics.js +24 -0
  76. package/server/dist/chat/textMetrics.js.map +1 -0
  77. package/server/dist/chat/threadTurnsProjector.d.ts +12 -0
  78. package/server/dist/chat/threadTurnsProjector.js +292 -0
  79. package/server/dist/chat/threadTurnsProjector.js.map +1 -0
  80. package/server/dist/chat/todoPlanProjector.d.ts +8 -0
  81. package/server/dist/chat/todoPlanProjector.js +94 -0
  82. package/server/dist/chat/todoPlanProjector.js.map +1 -0
  83. package/server/dist/chat/todoPlanTypes.d.ts +21 -0
  84. package/server/dist/chat/todoPlanTypes.js +3 -0
  85. package/server/dist/chat/todoPlanTypes.js.map +1 -0
  86. package/server/dist/chat/types.d.ts +138 -0
  87. package/server/dist/chat/types.js +3 -0
  88. package/server/dist/chat/types.js.map +1 -0
  89. package/server/dist/cli/configArg.d.ts +21 -0
  90. package/server/dist/cli/configArg.js +70 -0
  91. package/server/dist/cli/configArg.js.map +1 -0
  92. package/server/dist/codex/appServerProcess.d.ts +24 -0
  93. package/server/dist/codex/appServerProcess.js +56 -0
  94. package/server/dist/codex/appServerProcess.js.map +1 -0
  95. package/server/dist/codex/cliArgs.d.ts +17 -0
  96. package/server/dist/codex/cliArgs.js +34 -0
  97. package/server/dist/codex/cliArgs.js.map +1 -0
  98. package/server/dist/codex/codexAppServer.d.ts +103 -0
  99. package/server/dist/codex/codexAppServer.js +206 -0
  100. package/server/dist/codex/codexAppServer.js.map +1 -0
  101. package/server/dist/codex/jsonl.d.ts +4 -0
  102. package/server/dist/codex/jsonl.js +23 -0
  103. package/server/dist/codex/jsonl.js.map +1 -0
  104. package/server/dist/codex/jsonrpc.d.ts +43 -0
  105. package/server/dist/codex/jsonrpc.js +96 -0
  106. package/server/dist/codex/jsonrpc.js.map +1 -0
  107. package/server/dist/config/serverConfig.d.ts +150 -0
  108. package/server/dist/config/serverConfig.js +64 -0
  109. package/server/dist/config/serverConfig.js.map +1 -0
  110. package/server/dist/env.d.ts +101 -0
  111. package/server/dist/env.js +523 -0
  112. package/server/dist/env.js.map +1 -0
  113. package/server/dist/history/http/historyRoutes.d.ts +18 -0
  114. package/server/dist/history/http/historyRoutes.js +67 -0
  115. package/server/dist/history/http/historyRoutes.js.map +1 -0
  116. package/server/dist/history/index.d.ts +24 -0
  117. package/server/dist/history/index.js +30 -0
  118. package/server/dist/history/index.js.map +1 -0
  119. package/server/dist/history/ingest/historyIngestService.d.ts +15 -0
  120. package/server/dist/history/ingest/historyIngestService.js +42 -0
  121. package/server/dist/history/ingest/historyIngestService.js.map +1 -0
  122. package/server/dist/history/projector/extractIds.d.ts +36 -0
  123. package/server/dist/history/projector/extractIds.js +111 -0
  124. package/server/dist/history/projector/extractIds.js.map +1 -0
  125. package/server/dist/history/projector/projectCodexEvent.d.ts +27 -0
  126. package/server/dist/history/projector/projectCodexEvent.js +845 -0
  127. package/server/dist/history/projector/projectCodexEvent.js.map +1 -0
  128. package/server/dist/history/query/historyQueryService.d.ts +34 -0
  129. package/server/dist/history/query/historyQueryService.js +170 -0
  130. package/server/dist/history/query/historyQueryService.js.map +1 -0
  131. package/server/dist/history/sqlite/schema.d.ts +11 -0
  132. package/server/dist/history/sqlite/schema.js +34 -0
  133. package/server/dist/history/sqlite/schema.js.map +1 -0
  134. package/server/dist/history/sqlite/sqliteHistoryStore.d.ts +69 -0
  135. package/server/dist/history/sqlite/sqliteHistoryStore.js +206 -0
  136. package/server/dist/history/sqlite/sqliteHistoryStore.js.map +1 -0
  137. package/server/dist/history/types.d.ts +29 -0
  138. package/server/dist/history/types.js +3 -0
  139. package/server/dist/history/types.js.map +1 -0
  140. package/server/dist/index.d.ts +1 -0
  141. package/server/dist/index.js +166 -0
  142. package/server/dist/index.js.map +1 -0
  143. package/server/dist/security/executionPolicy.d.ts +33 -0
  144. package/server/dist/security/executionPolicy.js +72 -0
  145. package/server/dist/security/executionPolicy.js.map +1 -0
  146. package/server/dist/security/origin.d.ts +11 -0
  147. package/server/dist/security/origin.js +40 -0
  148. package/server/dist/security/origin.js.map +1 -0
  149. package/server/dist/settings/sqliteUserSettingsStore.d.ts +12 -0
  150. package/server/dist/settings/sqliteUserSettingsStore.js +62 -0
  151. package/server/dist/settings/sqliteUserSettingsStore.js.map +1 -0
  152. package/server/dist/settings/userSettingsRoutes.d.ts +8 -0
  153. package/server/dist/settings/userSettingsRoutes.js +55 -0
  154. package/server/dist/settings/userSettingsRoutes.js.map +1 -0
  155. package/server/dist/settings/userSettingsStore.d.ts +19 -0
  156. package/server/dist/settings/userSettingsStore.js +26 -0
  157. package/server/dist/settings/userSettingsStore.js.map +1 -0
  158. package/server/dist/settings/userSettingsTypes.d.ts +70 -0
  159. package/server/dist/settings/userSettingsTypes.js +196 -0
  160. package/server/dist/settings/userSettingsTypes.js.map +1 -0
  161. package/server/dist/status/codexTaskTracker.d.ts +21 -0
  162. package/server/dist/status/codexTaskTracker.js +123 -0
  163. package/server/dist/status/codexTaskTracker.js.map +1 -0
  164. package/server/dist/status/threadContextUsage.d.ts +19 -0
  165. package/server/dist/status/threadContextUsage.js +229 -0
  166. package/server/dist/status/threadContextUsage.js.map +1 -0
  167. package/server/dist/threadList/threadListServerCache.d.ts +10 -0
  168. package/server/dist/threadList/threadListServerCache.js +42 -0
  169. package/server/dist/threadList/threadListServerCache.js.map +1 -0
  170. package/server/dist/tools/cwdSuggest.d.ts +11 -0
  171. package/server/dist/tools/cwdSuggest.js +128 -0
  172. package/server/dist/tools/cwdSuggest.js.map +1 -0
  173. package/server/dist/workspace/accessControl.d.ts +16 -0
  174. package/server/dist/workspace/accessControl.js +82 -0
  175. package/server/dist/workspace/accessControl.js.map +1 -0
  176. package/server/dist/workspace/sqliteUserWorkspaceStore.d.ts +12 -0
  177. package/server/dist/workspace/sqliteUserWorkspaceStore.js +82 -0
  178. package/server/dist/workspace/sqliteUserWorkspaceStore.js.map +1 -0
  179. package/server/dist/workspace/threadAccess.d.ts +19 -0
  180. package/server/dist/workspace/threadAccess.js +22 -0
  181. package/server/dist/workspace/threadAccess.js.map +1 -0
  182. package/server/dist/workspace/threadListVisibility.d.ts +25 -0
  183. package/server/dist/workspace/threadListVisibility.js +104 -0
  184. package/server/dist/workspace/threadListVisibility.js.map +1 -0
  185. package/server/dist/workspace/userWorkspaceRoutes.d.ts +7 -0
  186. package/server/dist/workspace/userWorkspaceRoutes.js +124 -0
  187. package/server/dist/workspace/userWorkspaceRoutes.js.map +1 -0
  188. package/server/dist/workspace/userWorkspaceStore.d.ts +12 -0
  189. package/server/dist/workspace/userWorkspaceStore.js +23 -0
  190. package/server/dist/workspace/userWorkspaceStore.js.map +1 -0
  191. package/server/dist/ws/socketIoBridge.d.ts +32 -0
  192. package/server/dist/ws/socketIoBridge.js +194 -0
  193. package/server/dist/ws/socketIoBridge.js.map +1 -0
  194. package/server/dist/ws/types.d.ts +113 -0
  195. package/server/dist/ws/types.js +3 -0
  196. package/server/dist/ws/types.js.map +1 -0
  197. package/server/dist/ws/wsHub.d.ts +119 -0
  198. package/server/dist/ws/wsHub.js +1259 -0
  199. package/server/dist/ws/wsHub.js.map +1 -0
  200. package/web/dist/assets/index-CY6cnwQz.js +174 -0
  201. package/web/dist/assets/index-DI7kJHr2.css +32 -0
  202. package/web/dist/favicon-mask.svg +9 -0
  203. package/web/dist/favicon.svg +26 -0
  204. package/web/dist/index.html +75 -0
@@ -0,0 +1,523 @@
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.WORKSPACE_ROOT = void 0;
7
+ exports.getHost = getHost;
8
+ exports.getPort = getPort;
9
+ exports.getSessionToken = getSessionToken;
10
+ exports.getCodexBin = getCodexBin;
11
+ exports.getCodexCwd = getCodexCwd;
12
+ exports.getWebHistoryMode = getWebHistoryMode;
13
+ exports.getWebHistoryDbPath = getWebHistoryDbPath;
14
+ exports.getWebOpenThreadTurnsLimit = getWebOpenThreadTurnsLimit;
15
+ exports.getCodexWebAuthDbPath = getCodexWebAuthDbPath;
16
+ exports.getCodexWebUsersFile = getCodexWebUsersFile;
17
+ exports.getCodexWebUserWorkspacesFile = getCodexWebUserWorkspacesFile;
18
+ exports.getCodexAllowedCwdRoots = getCodexAllowedCwdRoots;
19
+ exports.getCodexApprovalPolicy = getCodexApprovalPolicy;
20
+ exports.getCodexSandboxMode = getCodexSandboxMode;
21
+ exports.getCodexHistoryPersistence = getCodexHistoryPersistence;
22
+ exports.getCodexDisableResponseStorage = getCodexDisableResponseStorage;
23
+ exports.getWebMaxUploadBytes = getWebMaxUploadBytes;
24
+ exports.getWebUploadBaseDir = getWebUploadBaseDir;
25
+ const crypto_1 = __importDefault(require("crypto"));
26
+ const fs_1 = __importDefault(require("fs"));
27
+ const path_1 = __importDefault(require("path"));
28
+ const serverConfig_1 = require("./config/serverConfig");
29
+ exports.WORKSPACE_ROOT = path_1.default.resolve(__dirname, "..", "..");
30
+ /**
31
+ * 服务端配置统一入口。
32
+ * Single source of truth for server configuration access.
33
+ *
34
+ * 说明:
35
+ * - 默认值来自 `server/src/config/serverConfig.ts`;
36
+ * - `CODEX_CONFIG` 可一次性覆盖默认值(支持 JSON 字符串或 JSON 文件路径);
37
+ * - 对应环境变量存在时,环境变量优先。
38
+ *
39
+ * Notes:
40
+ * - Default values are sourced from `server/src/config/serverConfig.ts`;
41
+ * - `CODEX_CONFIG` can override defaults in one place (inline JSON or JSON file path);
42
+ * - Matching environment variables still take precedence.
43
+ */
44
+ /**
45
+ * 缓存最近一次解析的 `CODEX_CONFIG` 原始值。
46
+ * Cache the last raw `CODEX_CONFIG` value.
47
+ */
48
+ let cachedCodexConfigRaw = "__UNSET__";
49
+ /**
50
+ * 缓存最近一次合并后的运行时配置。
51
+ * Cache the last merged runtime configuration.
52
+ */
53
+ let cachedRuntimeConfig = serverConfig_1.SERVER_CONFIG;
54
+ /**
55
+ * 运行时配置获取器。
56
+ * Runtime configuration accessor.
57
+ */
58
+ function getRuntimeServerConfig() {
59
+ // 支持单变量配置入口:`CODEX_CONFIG`。
60
+ // Support single-entry config via `CODEX_CONFIG`.
61
+ const rawCodexConfig = String(process.env.CODEX_CONFIG ?? "").trim();
62
+ // 原始值未变化时直接走缓存,避免重复解析文件/JSON。
63
+ // Reuse cache when raw value is unchanged.
64
+ if (rawCodexConfig === cachedCodexConfigRaw)
65
+ return cachedRuntimeConfig;
66
+ const parsedCodexConfig = loadCodexConfigOverride(rawCodexConfig);
67
+ const mergedRuntimeConfig = mergeServerConfig(serverConfig_1.SERVER_CONFIG, parsedCodexConfig);
68
+ cachedCodexConfigRaw = rawCodexConfig;
69
+ cachedRuntimeConfig = mergedRuntimeConfig;
70
+ return mergedRuntimeConfig;
71
+ }
72
+ /**
73
+ * 解析 `CODEX_CONFIG` 覆盖内容。
74
+ * Parse `CODEX_CONFIG` override value.
75
+ */
76
+ function loadCodexConfigOverride(rawCodexConfig) {
77
+ if (!rawCodexConfig)
78
+ return null;
79
+ try {
80
+ // 形态 1:内联 JSON 字符串。
81
+ // Form 1: inline JSON string.
82
+ if (rawCodexConfig.startsWith("{")) {
83
+ return JSON.parse(rawCodexConfig);
84
+ }
85
+ // 形态 2:JSON 文件路径。
86
+ // Form 2: JSON file path.
87
+ const resolvedConfigPath = path_1.default.isAbsolute(rawCodexConfig)
88
+ ? rawCodexConfig
89
+ : path_1.default.resolve(process.cwd(), rawCodexConfig);
90
+ const configFileContent = fs_1.default.readFileSync(resolvedConfigPath, "utf8");
91
+ return JSON.parse(configFileContent);
92
+ }
93
+ catch {
94
+ // 解析失败时回退默认配置,避免启动失败。
95
+ // Fallback to default config when parsing fails.
96
+ return null;
97
+ }
98
+ }
99
+ /**
100
+ * 判断值是否为 plain object。
101
+ * Check whether a value is a plain object.
102
+ */
103
+ function isRecord(input) {
104
+ return typeof input === "object" && input !== null && !Array.isArray(input);
105
+ }
106
+ /**
107
+ * 读取字符串配置项。
108
+ * Pick string config value.
109
+ */
110
+ function pickString(defaultValue, candidateValue) {
111
+ return typeof candidateValue === "string" ? candidateValue : defaultValue;
112
+ }
113
+ /**
114
+ * 读取数值配置项。
115
+ * Pick number config value.
116
+ */
117
+ function pickNumber(defaultValue, candidateValue) {
118
+ return typeof candidateValue === "number" && Number.isFinite(candidateValue) ? candidateValue : defaultValue;
119
+ }
120
+ /**
121
+ * 读取字符串数组配置项。
122
+ * Pick string-array config value.
123
+ */
124
+ function pickStringArray(defaultValue, candidateValue) {
125
+ if (!Array.isArray(candidateValue))
126
+ return [...defaultValue];
127
+ const normalizedValues = candidateValue
128
+ .map((item) => (typeof item === "string" ? item.trim() : ""))
129
+ .filter(Boolean);
130
+ return normalizedValues;
131
+ }
132
+ /**
133
+ * 读取历史模式配置项。
134
+ * Pick history mode config value.
135
+ */
136
+ function pickWebHistoryMode(defaultValue, candidateValue) {
137
+ if (candidateValue === "off" || candidateValue === "shadow" || candidateValue === "primary") {
138
+ return candidateValue;
139
+ }
140
+ return defaultValue;
141
+ }
142
+ /**
143
+ * 读取审批策略配置项。
144
+ * Pick approval policy config value.
145
+ */
146
+ function pickApprovalPolicy(defaultValue, candidateValue) {
147
+ if (candidateValue === "untrusted" ||
148
+ candidateValue === "on-failure" ||
149
+ candidateValue === "on-request" ||
150
+ candidateValue === "never") {
151
+ return candidateValue;
152
+ }
153
+ return defaultValue;
154
+ }
155
+ /**
156
+ * 读取沙箱模式配置项。
157
+ * Pick sandbox mode config value.
158
+ */
159
+ function pickSandboxMode(defaultValue, candidateValue) {
160
+ if (candidateValue === "read-only" ||
161
+ candidateValue === "workspace-write" ||
162
+ candidateValue === "danger-full-access") {
163
+ return candidateValue;
164
+ }
165
+ return defaultValue;
166
+ }
167
+ /**
168
+ * 读取 history persistence 配置项。
169
+ * Pick history persistence config value.
170
+ */
171
+ function pickHistoryPersistence(defaultValue, candidateValue) {
172
+ if (candidateValue === null)
173
+ return null;
174
+ if (candidateValue === "none" || candidateValue === "save-all" || candidateValue === "resume-based") {
175
+ return candidateValue;
176
+ }
177
+ return defaultValue;
178
+ }
179
+ /**
180
+ * 读取可空布尔配置项。
181
+ * Pick nullable boolean config value.
182
+ */
183
+ function pickBooleanOrNull(defaultValue, candidateValue) {
184
+ if (candidateValue === null)
185
+ return null;
186
+ if (typeof candidateValue === "boolean")
187
+ return candidateValue;
188
+ return defaultValue;
189
+ }
190
+ /**
191
+ * 合并默认配置与 `CODEX_CONFIG` 覆盖。
192
+ * Merge default config with `CODEX_CONFIG` override.
193
+ */
194
+ function mergeServerConfig(baseConfig, overrideConfig) {
195
+ const overrideRoot = isRecord(overrideConfig) ? overrideConfig : {};
196
+ const overrideWeb = isRecord(overrideRoot.web) ? overrideRoot.web : {};
197
+ const overrideWebHistory = isRecord(overrideWeb.history) ? overrideWeb.history : {};
198
+ const overrideAuth = isRecord(overrideRoot.auth) ? overrideRoot.auth : {};
199
+ const overrideCodex = isRecord(overrideRoot.codex) ? overrideRoot.codex : {};
200
+ return {
201
+ web: {
202
+ host: pickString(baseConfig.web.host, overrideWeb.host),
203
+ port: pickNumber(baseConfig.web.port, overrideWeb.port),
204
+ openThreadTurnsLimit: pickNumber(baseConfig.web.openThreadTurnsLimit, overrideWeb.openThreadTurnsLimit),
205
+ maxUploadBytes: pickNumber(baseConfig.web.maxUploadBytes, overrideWeb.maxUploadBytes),
206
+ uploadBaseDir: pickString(baseConfig.web.uploadBaseDir, overrideWeb.uploadBaseDir),
207
+ history: {
208
+ mode: pickWebHistoryMode(baseConfig.web.history.mode, overrideWebHistory.mode),
209
+ dbPath: pickString(baseConfig.web.history.dbPath, overrideWebHistory.dbPath),
210
+ },
211
+ },
212
+ auth: {
213
+ sessionToken: pickString(baseConfig.auth.sessionToken, overrideAuth.sessionToken),
214
+ usersFile: pickString(baseConfig.auth.usersFile, overrideAuth.usersFile),
215
+ userWorkspacesFile: pickString(baseConfig.auth.userWorkspacesFile, overrideAuth.userWorkspacesFile),
216
+ dbPath: pickString(baseConfig.auth.dbPath, overrideAuth.dbPath),
217
+ },
218
+ codex: {
219
+ bin: pickString(baseConfig.codex.bin, overrideCodex.bin),
220
+ cwd: pickString(baseConfig.codex.cwd, overrideCodex.cwd),
221
+ allowedCwdRoots: pickStringArray(baseConfig.codex.allowedCwdRoots, overrideCodex.allowedCwdRoots),
222
+ approvalPolicy: pickApprovalPolicy(baseConfig.codex.approvalPolicy, overrideCodex.approvalPolicy),
223
+ sandboxMode: pickSandboxMode(baseConfig.codex.sandboxMode, overrideCodex.sandboxMode),
224
+ historyPersistence: pickHistoryPersistence(baseConfig.codex.historyPersistence, overrideCodex.historyPersistence),
225
+ disableResponseStorage: pickBooleanOrNull(baseConfig.codex.disableResponseStorage, overrideCodex.disableResponseStorage),
226
+ },
227
+ };
228
+ }
229
+ /**
230
+ * 获取 Web 监听地址。
231
+ * Get web bind host.
232
+ */
233
+ function getHost() {
234
+ const runtimeConfig = getRuntimeServerConfig();
235
+ // 默认仅绑定 loopback,避免误部署导致服务对外暴露。
236
+ // Default binds loopback only to reduce accidental exposure.
237
+ return process.env.CODEX_WEB_HOST ?? runtimeConfig.web.host;
238
+ }
239
+ /**
240
+ * 获取 Web 监听端口。
241
+ * Get web bind port.
242
+ */
243
+ function getPort() {
244
+ const runtimeConfig = getRuntimeServerConfig();
245
+ const defaultPort = Number(runtimeConfig.web.port);
246
+ const rawPort = process.env.CODEX_WEB_PORT ?? String(defaultPort);
247
+ const parsedPort = Number(rawPort);
248
+ if (!Number.isFinite(parsedPort) || parsedPort <= 0)
249
+ return defaultPort;
250
+ return Math.floor(parsedPort);
251
+ }
252
+ /**
253
+ * 获取会话签名密钥。
254
+ * Get session token secret.
255
+ */
256
+ function getSessionToken() {
257
+ const runtimeConfig = getRuntimeServerConfig();
258
+ const configuredSessionToken = String(process.env.SESSION_TOKEN ?? runtimeConfig.auth.sessionToken ?? "").trim();
259
+ if (configuredSessionToken)
260
+ return configuredSessionToken;
261
+ return crypto_1.default.randomBytes(24).toString("hex");
262
+ }
263
+ /**
264
+ * 获取 Codex 可执行命令。
265
+ * Get codex executable command.
266
+ */
267
+ function getCodexBin() {
268
+ const runtimeConfig = getRuntimeServerConfig();
269
+ return process.env.CODEX_BIN ?? runtimeConfig.codex.bin;
270
+ }
271
+ /**
272
+ * 获取 Codex 工作目录。
273
+ * Get codex working directory.
274
+ */
275
+ function getCodexCwd() {
276
+ const runtimeConfig = getRuntimeServerConfig();
277
+ const envCwd = process.env.CODEX_CWD;
278
+ if (envCwd)
279
+ return envCwd;
280
+ // 配置文件中的相对路径统一按仓库根目录解析。
281
+ // Relative path in config file resolves from workspace root.
282
+ return path_1.default.resolve(exports.WORKSPACE_ROOT, runtimeConfig.codex.cwd);
283
+ }
284
+ /**
285
+ * 获取 Web 历史模式:
286
+ * - off: 完全关闭 SQLite 历史链路。
287
+ * - shadow: 保留旧读取链路,仅做 SQLite 双写。
288
+ * - primary: 读取优先走 SQLite 历史接口。
289
+ *
290
+ * Get web history mode:
291
+ * - off: disable sqlite history runtime.
292
+ * - shadow: keep old read path with sqlite dual-write.
293
+ * - primary: use sqlite as primary read path.
294
+ */
295
+ function getWebHistoryMode() {
296
+ const runtimeConfig = getRuntimeServerConfig();
297
+ const rawMode = String(process.env.CODEX_WEB_HISTORY_MODE ?? runtimeConfig.web.history.mode ?? "")
298
+ .trim()
299
+ .toLowerCase();
300
+ if (rawMode === "off" || rawMode === "shadow" || rawMode === "primary")
301
+ return rawMode;
302
+ // 默认启用主读(同时保留双写),减少首次部署时遗漏配置导致历史不可读。
303
+ // Default to primary read mode for safer first deployment.
304
+ return "primary";
305
+ }
306
+ /**
307
+ * 获取 Web 历史 SQLite 路径;支持相对路径并统一转绝对路径。
308
+ * Get web history sqlite path as an absolute path.
309
+ */
310
+ function getWebHistoryDbPath() {
311
+ const runtimeConfig = getRuntimeServerConfig();
312
+ const configuredHistoryDbPath = String(process.env.CODEX_WEB_HISTORY_DB_PATH ?? runtimeConfig.web.history.dbPath ?? "").trim();
313
+ if (!configuredHistoryDbPath)
314
+ return path_1.default.resolve(serverConfig_1.DEFAULT_CODEX_WEB_HISTORY_DB_PATH);
315
+ if (path_1.default.isAbsolute(configuredHistoryDbPath))
316
+ return path_1.default.resolve(configuredHistoryDbPath);
317
+ return path_1.default.resolve(exports.WORKSPACE_ROOT, configuredHistoryDbPath);
318
+ }
319
+ /**
320
+ * 获取打开线程时的 turns 数量上限。
321
+ * Get open-thread turns limit.
322
+ */
323
+ function getWebOpenThreadTurnsLimit() {
324
+ const runtimeConfig = getRuntimeServerConfig();
325
+ const defaultTurnsLimit = Number(runtimeConfig.web.openThreadTurnsLimit);
326
+ const rawTurnsLimit = String(process.env.CODEX_WEB_OPEN_THREAD_TURNS_LIMIT ?? defaultTurnsLimit).trim().toLowerCase();
327
+ if (!rawTurnsLimit)
328
+ return defaultTurnsLimit;
329
+ if (rawTurnsLimit === "all" || rawTurnsLimit === "unlimited" || rawTurnsLimit === "infinite")
330
+ return Number.MAX_SAFE_INTEGER;
331
+ const parsedTurnsLimit = Number(rawTurnsLimit);
332
+ if (!Number.isFinite(parsedTurnsLimit) || parsedTurnsLimit <= 0)
333
+ return defaultTurnsLimit;
334
+ return Math.min(Number.MAX_SAFE_INTEGER, Math.floor(parsedTurnsLimit));
335
+ }
336
+ /**
337
+ * 获取认证/工作区设置 SQLite 路径。
338
+ * Get auth/settings sqlite path.
339
+ */
340
+ function getCodexWebAuthDbPath() {
341
+ const runtimeConfig = getRuntimeServerConfig();
342
+ const envAuthDbPath = process.env.CODEX_WEB_AUTH_DB_PATH?.trim();
343
+ if (envAuthDbPath)
344
+ return path_1.default.resolve(envAuthDbPath);
345
+ const configuredAuthDbPath = String(runtimeConfig.auth.dbPath ?? "").trim();
346
+ if (!configuredAuthDbPath)
347
+ return path_1.default.resolve(serverConfig_1.DEFAULT_CODEX_WEB_AUTH_DB_PATH);
348
+ if (path_1.default.isAbsolute(configuredAuthDbPath))
349
+ return path_1.default.resolve(configuredAuthDbPath);
350
+ return path_1.default.resolve(getCodexCwd(), configuredAuthDbPath);
351
+ }
352
+ /**
353
+ * 获取用户仓库存储文件路径。
354
+ * Get legacy user-store json path.
355
+ */
356
+ function getCodexWebUsersFile() {
357
+ const runtimeConfig = getRuntimeServerConfig();
358
+ const envUsersFile = process.env.CODEX_WEB_USERS_FILE?.trim();
359
+ if (envUsersFile)
360
+ return path_1.default.resolve(envUsersFile);
361
+ const configuredUsersFile = String(runtimeConfig.auth.usersFile).trim();
362
+ if (path_1.default.isAbsolute(configuredUsersFile))
363
+ return path_1.default.resolve(configuredUsersFile);
364
+ const defaultUsersFile = path_1.default.join(getCodexCwd(), configuredUsersFile);
365
+ return path_1.default.resolve(defaultUsersFile);
366
+ }
367
+ /**
368
+ * 获取用户工作区仓库存储文件路径。
369
+ * Get legacy user-workspace-store json path.
370
+ */
371
+ function getCodexWebUserWorkspacesFile() {
372
+ const runtimeConfig = getRuntimeServerConfig();
373
+ const envUserWorkspacesFile = process.env.CODEX_WEB_USER_WORKSPACES_FILE?.trim();
374
+ if (envUserWorkspacesFile)
375
+ return path_1.default.resolve(envUserWorkspacesFile);
376
+ const configuredUserWorkspacesFile = String(runtimeConfig.auth.userWorkspacesFile).trim();
377
+ if (path_1.default.isAbsolute(configuredUserWorkspacesFile))
378
+ return path_1.default.resolve(configuredUserWorkspacesFile);
379
+ const defaultUserWorkspacesFile = path_1.default.join(getCodexCwd(), configuredUserWorkspacesFile);
380
+ return path_1.default.resolve(defaultUserWorkspacesFile);
381
+ }
382
+ /**
383
+ * 转义正则特殊字符。
384
+ * Escape regexp special characters.
385
+ */
386
+ function escapeRegExp(input) {
387
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
388
+ }
389
+ /**
390
+ * 解析环境变量列表(逗号/换行/path.delimiter 分隔)。
391
+ * Parse env list split by comma/newline/path.delimiter.
392
+ */
393
+ function splitEnvList(raw) {
394
+ const trimmedRaw = raw.trim();
395
+ if (!trimmedRaw)
396
+ return [];
397
+ const delimiterPattern = escapeRegExp(path_1.default.delimiter);
398
+ const listParts = trimmedRaw.split(new RegExp(`[,\n${delimiterPattern}]`, "g"));
399
+ return listParts.map((part) => part.trim()).filter(Boolean);
400
+ }
401
+ /**
402
+ * 获取全局允许的 cwd 根目录列表。
403
+ * Get globally allowed cwd roots.
404
+ */
405
+ function getCodexAllowedCwdRoots() {
406
+ const runtimeConfig = getRuntimeServerConfig();
407
+ const rawAllowedRootsEnv = process.env.CODEX_ALLOWED_CWD_ROOTS ?? "";
408
+ const parsedAllowedRootsFromEnv = splitEnvList(rawAllowedRootsEnv);
409
+ const configuredAllowedRoots = (runtimeConfig.codex.allowedCwdRoots ?? []).map((root) => String(root ?? "").trim()).filter(Boolean);
410
+ const defaultRoot = getCodexCwd();
411
+ const candidateRoots = parsedAllowedRootsFromEnv.length
412
+ ? parsedAllowedRootsFromEnv
413
+ : configuredAllowedRoots.length
414
+ ? configuredAllowedRoots
415
+ : [defaultRoot, path_1.default.dirname(defaultRoot)];
416
+ const seenResolvedRoots = new Set();
417
+ const resolvedRoots = [];
418
+ for (const candidateRoot of candidateRoots) {
419
+ const resolvedRoot = path_1.default.resolve(candidateRoot);
420
+ if (seenResolvedRoots.has(resolvedRoot))
421
+ continue;
422
+ seenResolvedRoots.add(resolvedRoot);
423
+ resolvedRoots.push(resolvedRoot);
424
+ }
425
+ return resolvedRoots;
426
+ }
427
+ /**
428
+ * 获取 Codex 审批策略。
429
+ * Get codex approval policy.
430
+ */
431
+ function getCodexApprovalPolicy() {
432
+ const runtimeConfig = getRuntimeServerConfig();
433
+ const defaultApprovalPolicy = runtimeConfig.codex.approvalPolicy;
434
+ const configuredApprovalPolicy = process.env.CODEX_APPROVAL_POLICY ?? defaultApprovalPolicy;
435
+ if (configuredApprovalPolicy === "untrusted" ||
436
+ configuredApprovalPolicy === "on-failure" ||
437
+ configuredApprovalPolicy === "on-request" ||
438
+ configuredApprovalPolicy === "never") {
439
+ return configuredApprovalPolicy;
440
+ }
441
+ return defaultApprovalPolicy;
442
+ }
443
+ /**
444
+ * 获取 Codex 沙箱模式。
445
+ * Get codex sandbox mode.
446
+ */
447
+ function getCodexSandboxMode() {
448
+ const runtimeConfig = getRuntimeServerConfig();
449
+ const defaultSandboxMode = runtimeConfig.codex.sandboxMode;
450
+ const configuredSandboxMode = process.env.CODEX_SANDBOX_MODE ?? defaultSandboxMode;
451
+ if (configuredSandboxMode === "read-only" ||
452
+ configuredSandboxMode === "workspace-write" ||
453
+ configuredSandboxMode === "danger-full-access") {
454
+ return configuredSandboxMode;
455
+ }
456
+ return defaultSandboxMode;
457
+ }
458
+ /**
459
+ * 可选覆盖 Codex 的 history.persistence。
460
+ * Optional override for codex history.persistence.
461
+ */
462
+ function getCodexHistoryPersistence() {
463
+ const runtimeConfig = getRuntimeServerConfig();
464
+ const configuredHistoryPersistence = process.env.CODEX_HISTORY_PERSISTENCE ?? runtimeConfig.codex.historyPersistence ?? "";
465
+ const normalizedHistoryPersistence = String(configuredHistoryPersistence).trim().toLowerCase();
466
+ if (!normalizedHistoryPersistence)
467
+ return null;
468
+ if (normalizedHistoryPersistence === "none" ||
469
+ normalizedHistoryPersistence === "save-all" ||
470
+ normalizedHistoryPersistence === "resume-based") {
471
+ return normalizedHistoryPersistence;
472
+ }
473
+ return null;
474
+ }
475
+ /**
476
+ * 可选覆盖 Codex 的 disable_response_storage。
477
+ * Optional override for codex disable_response_storage.
478
+ */
479
+ function getCodexDisableResponseStorage() {
480
+ const runtimeConfig = getRuntimeServerConfig();
481
+ const configuredDisableResponseStorage = process.env.CODEX_DISABLE_RESPONSE_STORAGE;
482
+ if (typeof configuredDisableResponseStorage === "string") {
483
+ const normalizedEnvValue = configuredDisableResponseStorage.trim().toLowerCase();
484
+ if (!normalizedEnvValue)
485
+ return null;
486
+ if (normalizedEnvValue === "1" || normalizedEnvValue === "true" || normalizedEnvValue === "yes")
487
+ return true;
488
+ if (normalizedEnvValue === "0" || normalizedEnvValue === "false" || normalizedEnvValue === "no")
489
+ return false;
490
+ return null;
491
+ }
492
+ const defaultDisableResponseStorage = runtimeConfig.codex.disableResponseStorage;
493
+ if (typeof defaultDisableResponseStorage === "boolean")
494
+ return defaultDisableResponseStorage;
495
+ return null;
496
+ }
497
+ /**
498
+ * 获取上传单文件最大体积(字节)。
499
+ * Get max upload bytes for a single file.
500
+ */
501
+ function getWebMaxUploadBytes() {
502
+ const runtimeConfig = getRuntimeServerConfig();
503
+ const defaultMaxUploadBytes = Number(runtimeConfig.web.maxUploadBytes);
504
+ const rawMaxUploadBytes = process.env.CODEX_WEB_MAX_UPLOAD_BYTES ?? String(defaultMaxUploadBytes);
505
+ const parsedMaxUploadBytes = Number(rawMaxUploadBytes);
506
+ if (!Number.isFinite(parsedMaxUploadBytes) || parsedMaxUploadBytes <= 0)
507
+ return defaultMaxUploadBytes;
508
+ return Math.floor(parsedMaxUploadBytes);
509
+ }
510
+ /**
511
+ * 获取上传目录根路径(按用户子目录继续划分)。
512
+ * Get upload base directory (per-user subdirs are created under it).
513
+ */
514
+ function getWebUploadBaseDir() {
515
+ const runtimeConfig = getRuntimeServerConfig();
516
+ const rawUploadBaseDir = String(process.env.CODEX_WEB_UPLOAD_BASE_DIR ?? runtimeConfig.web.uploadBaseDir ?? "").trim();
517
+ if (!rawUploadBaseDir)
518
+ return path_1.default.resolve(getCodexCwd(), ".codex-web", "uploads");
519
+ if (path_1.default.isAbsolute(rawUploadBaseDir))
520
+ return path_1.default.resolve(rawUploadBaseDir);
521
+ return path_1.default.resolve(getCodexCwd(), rawUploadBaseDir);
522
+ }
523
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import express from "express";
2
+ import type { Request, Response } from "express";
3
+ import type { HistoryQueryService } from "../query/historyQueryService";
4
+ /**
5
+ * 线程访问校验函数签名。
6
+ */
7
+ export type RequireThreadAccess = (req: Request, res: Response, threadId: string) => Promise<boolean>;
8
+ /**
9
+ * 历史路由构造参数。
10
+ */
11
+ export type CreateHistoryRoutesOptions = {
12
+ historyQuery: HistoryQueryService;
13
+ requireThreadAccess: RequireThreadAccess;
14
+ };
15
+ /**
16
+ * 创建历史查询 HTTP 路由。
17
+ */
18
+ export declare function createHistoryRoutes(options: CreateHistoryRoutesOptions): express.Router;
@@ -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.createHistoryRoutes = createHistoryRoutes;
7
+ const express_1 = __importDefault(require("express"));
8
+ /**
9
+ * 解析消息查询 limit,默认 200,范围 [1, 500]。
10
+ */
11
+ function parseHistoryLimit(rawLimit) {
12
+ const parsedLimit = Number(rawLimit);
13
+ if (!Number.isFinite(parsedLimit))
14
+ return 200;
15
+ return Math.min(500, Math.max(1, Math.floor(parsedLimit)));
16
+ }
17
+ /**
18
+ * 解析 beforeTs;非法值返回 null(表示不启用 before 过滤)。
19
+ */
20
+ function parseBeforeTs(rawBeforeTs) {
21
+ const parsedBeforeTs = Number(rawBeforeTs);
22
+ if (!Number.isFinite(parsedBeforeTs))
23
+ return null;
24
+ return Math.max(0, Math.floor(parsedBeforeTs));
25
+ }
26
+ /**
27
+ * 创建历史查询 HTTP 路由。
28
+ */
29
+ function createHistoryRoutes(options) {
30
+ const router = express_1.default.Router();
31
+ router.get("/threads/:threadId/messages", async (req, res) => {
32
+ const threadId = String(req.params.threadId ?? "").trim();
33
+ if (!threadId) {
34
+ res.status(400).json({ ok: false, error: "invalid_request" });
35
+ return;
36
+ }
37
+ if (!(await options.requireThreadAccess(req, res, threadId)))
38
+ return;
39
+ const limit = parseHistoryLimit(req.query?.limit);
40
+ const beforeTs = parseBeforeTs(req.query?.beforeTs);
41
+ const items = options.historyQuery.listMessages({ threadId, limit, beforeTs });
42
+ res.json({ ok: true, items });
43
+ });
44
+ router.get("/threads/:threadId/messages/:messageId/diff", async (req, res) => {
45
+ const threadId = String(req.params.threadId ?? "").trim();
46
+ const messageId = String(req.params.messageId ?? "").trim();
47
+ if (!threadId || !messageId) {
48
+ res.status(400).json({ ok: false, error: "invalid_request" });
49
+ return;
50
+ }
51
+ if (!(await options.requireThreadAccess(req, res, threadId)))
52
+ return;
53
+ const getMessageDiff = options.historyQuery.getMessageDiff;
54
+ if (typeof getMessageDiff !== "function") {
55
+ res.status(404).json({ ok: false, error: "not_found" });
56
+ return;
57
+ }
58
+ const diff = getMessageDiff({ threadId, messageId });
59
+ if (!diff) {
60
+ res.status(404).json({ ok: false, error: "not_found" });
61
+ return;
62
+ }
63
+ res.json({ ok: true, diff });
64
+ });
65
+ return router;
66
+ }
67
+ //# sourceMappingURL=historyRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyRoutes.js","sourceRoot":"","sources":["../../../src/history/http/historyRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { HistoryQueryService } from "./query/historyQueryService";
2
+ import type { HistoryIngestService, WebHistoryMode } from "./types";
3
+ export type { CodexEventPayload, HistoryIngestService, RecordCodexEventInput, WebHistoryMode, } from "./types";
4
+ /**
5
+ * 历史运行时实例。
6
+ */
7
+ export type WebHistoryRuntime = {
8
+ ingest: HistoryIngestService;
9
+ query: HistoryQueryService;
10
+ close: () => Promise<void>;
11
+ };
12
+ /**
13
+ * 创建历史运行时参数。
14
+ */
15
+ export type CreateWebHistoryRuntimeOptions = {
16
+ mode: WebHistoryMode;
17
+ dbPath: string;
18
+ };
19
+ /**
20
+ * 根据配置模式创建历史运行时:
21
+ * - off: 不创建任何历史资源;
22
+ * - shadow/primary: 初始化 SQLite store 与 ingest 服务。
23
+ */
24
+ export declare function createWebHistoryRuntime(options: CreateWebHistoryRuntimeOptions): WebHistoryRuntime | null;