@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,292 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.projectThreadToChatItems = projectThreadToChatItems;
4
+ exports.projectTurnsToChatItems = projectTurnsToChatItems;
5
+ const attachmentPathRedaction_1 = require("./attachmentPathRedaction");
6
+ const chatItemEnricher_1 = require("./chatItemEnricher");
7
+ const fileChangeExtractor_1 = require("./fileChangeExtractor");
8
+ /**
9
+ * 将历史 turn 里的完整 diff 收敛为摘要,避免在聊天记录中携带大 patch 内容。
10
+ */
11
+ function toDiffSummaryChanges(changes) {
12
+ return changes.map((change) => ({
13
+ path: change.path,
14
+ kind: change.kind,
15
+ diff: "",
16
+ }));
17
+ }
18
+ /**
19
+ * 构造 reasoning summary 的稳定消息 id(与实时 chat_ops / SQLite 历史保持一致)。
20
+ */
21
+ function buildReasoningSummaryMessageId(turnId, itemId, summaryIndex) {
22
+ const normalizedTurnId = String(turnId ?? "").trim();
23
+ const normalizedItemId = String(itemId ?? "").trim();
24
+ const normalizedSummaryIndex = Number.isFinite(summaryIndex) ? Math.max(0, Math.floor(summaryIndex)) : 0;
25
+ return `v2:rs-${normalizedTurnId}:${normalizedItemId}:${normalizedSummaryIndex}`;
26
+ }
27
+ /**
28
+ * 把 turns/item 中的 id 归一化为稳定字符串:
29
+ * - 支持 string/number;
30
+ * - 其他类型视为缺失,回退到既有的 best-effort id 生成逻辑。
31
+ */
32
+ function normalizeStableId(rawId) {
33
+ if (typeof rawId === "string")
34
+ return rawId.trim();
35
+ if (typeof rawId === "number" && Number.isFinite(rawId))
36
+ return String(rawId);
37
+ return "";
38
+ }
39
+ /**
40
+ * 将 thread payload 中的 turns 转换为 ChatItem[](用于 thread_opened 快照)。
41
+ */
42
+ function projectThreadToChatItems(thread) {
43
+ const t = thread;
44
+ const turns = Array.isArray(t?.turns) ? t.turns : [];
45
+ const turnsStart = Number.isFinite(t?.turnsStart) ? Math.max(0, Math.floor(Number(t.turnsStart))) : 0;
46
+ const createdAtMs = Number.isFinite(t?.createdAt) ? Number(t.createdAt) * 1000 : Date.now();
47
+ return projectTurnsToChatItems(turns, { createdAtMs, turnsStart });
48
+ }
49
+ /**
50
+ * 将 thread turns slice 转换为 ChatItem[](用于翻页加载旧消息)。
51
+ */
52
+ function projectTurnsToChatItems(turns, opts) {
53
+ const out = [];
54
+ const baseTs = Number.isFinite(opts.createdAtMs) ? opts.createdAtMs : Date.now();
55
+ const start = Number.isFinite(opts.turnsStart) ? Math.max(0, Math.floor(opts.turnsStart)) : 0;
56
+ for (let turnIdx = 0; turnIdx < turns.length; turnIdx += 1) {
57
+ const turn = turns[turnIdx];
58
+ const stableTurnId = normalizeStableId(turn?.id);
59
+ const turnId = stableTurnId || `turn-${start + turnIdx}`;
60
+ const items = Array.isArray(turn?.items) ? turn.items : [];
61
+ const turnTsBase = baseTs + (start + turnIdx) * 1000;
62
+ for (let itemIdx = 0; itemIdx < items.length; itemIdx += 1) {
63
+ const item = items[itemIdx];
64
+ const changes = (0, fileChangeExtractor_1.extractFileChangesFromAny)(item);
65
+ const role = roleFromTurnItem(item);
66
+ const effectiveRole = role ?? (changes.length ? "system" : null);
67
+ if (!effectiveRole)
68
+ continue;
69
+ if (changes.length) {
70
+ const stableItemId = normalizeStableId(item?.id);
71
+ const itemId = stableItemId || `${role}-${out.length}`;
72
+ const title = "文件变更";
73
+ const summaryChanges = toDiffSummaryChanges(changes);
74
+ out.push((0, chatItemEnricher_1.enrichChatItemForUi)({
75
+ id: `${turnId}:${itemId}`,
76
+ ts: turnTsBase + itemIdx,
77
+ role: effectiveRole === "assistant" ? "system" : effectiveRole,
78
+ text: title,
79
+ render: "diff",
80
+ diff: { title, changes: summaryChanges },
81
+ }));
82
+ continue;
83
+ }
84
+ // reasoning summary 在 SQLite 历史中会按 summaryIndex 拆分为多条记录;
85
+ // turns 投影也需要使用相同 v2 id,否则前端合并历史时会产生重复卡片。
86
+ if (effectiveRole === "reasoning") {
87
+ const summaryItems = Array.isArray(item?.summary) ? item.summary : [];
88
+ const itemId = normalizeStableId(item?.id);
89
+ if (summaryItems.length && itemId) {
90
+ for (let summaryIndex = 0; summaryIndex < summaryItems.length; summaryIndex += 1) {
91
+ const summaryText = String(summaryItems[summaryIndex] ?? "").trim();
92
+ if (!summaryText)
93
+ continue;
94
+ out.push((0, chatItemEnricher_1.enrichChatItemForUi)({
95
+ id: buildReasoningSummaryMessageId(turnId, itemId, summaryIndex),
96
+ // turns 的 ts 仅用于排序;这里用极小增量确保每条 summary 在同一 item 内保持稳定顺序。
97
+ ts: turnTsBase + itemIdx + summaryIndex / 1000,
98
+ role: "reasoning",
99
+ text: summaryText,
100
+ }));
101
+ }
102
+ continue;
103
+ }
104
+ }
105
+ const text = extractTurnItemText(item);
106
+ if (!text)
107
+ continue;
108
+ const displayText = effectiveRole === "user" ? (0, attachmentPathRedaction_1.redactAttachmentPathsForDisplay)(text) : text;
109
+ const stableItemId = normalizeStableId(item?.id);
110
+ const itemId = stableItemId || `${role}-${out.length}`;
111
+ const render = typeof item?.command === "string" ? "terminal" : undefined;
112
+ const itemType = typeof item?.type === "string" ? String(item.type).toLowerCase() : "";
113
+ const id = itemType.includes("plan") ? `v2:plan-${turnId}:${itemId}` : `${turnId}:${itemId}`;
114
+ out.push((0, chatItemEnricher_1.enrichChatItemForUi)({
115
+ id,
116
+ ts: turnTsBase + itemIdx,
117
+ role: effectiveRole,
118
+ text: displayText,
119
+ render,
120
+ deliveryStatus: effectiveRole === "user" ? "sent" : undefined,
121
+ }));
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ /**
127
+ * 从 turn item 推导其角色(兼容 `role` 字段与 `type` 字段)。
128
+ */
129
+ function roleFromTurnItem(item) {
130
+ const it = item;
131
+ const role = typeof it?.role === "string" ? it.role.toLowerCase() : "";
132
+ if (role === "user" || role === "assistant" || role === "system" || role === "reasoning")
133
+ return role;
134
+ const t = it?.type;
135
+ if (typeof t !== "string")
136
+ return null;
137
+ const normalized = t.toLowerCase();
138
+ if (normalized.includes("user"))
139
+ return "user";
140
+ if (normalized.includes("system"))
141
+ return "system";
142
+ if (normalized.includes("reasoning"))
143
+ return "reasoning";
144
+ if (normalized.includes("assistant") || normalized.includes("agent"))
145
+ return "assistant";
146
+ if (normalized.includes("plan"))
147
+ return "assistant";
148
+ return null;
149
+ }
150
+ /**
151
+ * 将历史 plan step 的状态值归一化为 Web 侧统一状态。
152
+ */
153
+ function normalizeStructuredPlanStepStatus(rawStatus) {
154
+ if (typeof rawStatus !== "string")
155
+ return null;
156
+ const normalized = rawStatus
157
+ .trim()
158
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
159
+ .toLowerCase()
160
+ .replace(/[\s-]+/g, "_");
161
+ if (!normalized)
162
+ return null;
163
+ if (normalized === "pending")
164
+ return "pending";
165
+ if (normalized === "completed" || normalized === "done")
166
+ return "completed";
167
+ if (normalized === "in_progress" || normalized === "inprogress" || normalized === "doing")
168
+ return "in_progress";
169
+ return null;
170
+ }
171
+ /**
172
+ * 从结构化 step 对象中抽取可展示的文本。
173
+ */
174
+ function extractStructuredPlanStepText(rawStep) {
175
+ if (typeof rawStep === "string")
176
+ return rawStep.trim();
177
+ if (!rawStep || typeof rawStep !== "object")
178
+ return "";
179
+ const step = rawStep;
180
+ const candidates = [step.step, step.text, step.title, step.description, step.name, step.task, step.label];
181
+ for (const candidate of candidates) {
182
+ if (typeof candidate !== "string")
183
+ continue;
184
+ const normalizedText = candidate.trim();
185
+ if (normalizedText)
186
+ return normalizedText;
187
+ }
188
+ return "";
189
+ }
190
+ /**
191
+ * 从结构化 plan item 中提取步骤数组(兼容 plan/steps/items 字段)。
192
+ */
193
+ function extractStructuredPlanSteps(item) {
194
+ const stepSources = [item.plan, item.steps, item.items];
195
+ const parsedSteps = [];
196
+ for (const rawSource of stepSources) {
197
+ if (!Array.isArray(rawSource))
198
+ continue;
199
+ for (const rawStep of rawSource) {
200
+ const stepText = extractStructuredPlanStepText(rawStep);
201
+ if (!stepText)
202
+ continue;
203
+ const stepRecord = rawStep && typeof rawStep === "object" ? rawStep : {};
204
+ const statusFromStatusField = normalizeStructuredPlanStepStatus(stepRecord.status);
205
+ const statusFromStateField = normalizeStructuredPlanStepStatus(stepRecord.state);
206
+ const completedFlag = typeof stepRecord.completed === "boolean" ? stepRecord.completed : null;
207
+ const inProgressFlag = typeof stepRecord.inProgress === "boolean" ? stepRecord.inProgress : null;
208
+ const inProgressSnakeFlag = typeof stepRecord.in_progress === "boolean" ? stepRecord.in_progress : null;
209
+ const status = statusFromStatusField ??
210
+ statusFromStateField ??
211
+ (inProgressFlag || inProgressSnakeFlag ? "in_progress" : null) ??
212
+ (completedFlag === null ? null : completedFlag ? "completed" : "pending") ??
213
+ "pending";
214
+ parsedSteps.push({ status, step: stepText });
215
+ }
216
+ if (parsedSteps.length)
217
+ return parsedSteps;
218
+ }
219
+ return parsedSteps;
220
+ }
221
+ /**
222
+ * 当历史 plan item 缺少 `text` 时,将结构化字段拼成可复用的文本计划。
223
+ */
224
+ function extractStructuredPlanText(item) {
225
+ const explanationFromField = typeof item.explanation === "string" ? item.explanation.trim() : "";
226
+ const summaryFromArray = Array.isArray(item.summary)
227
+ ? item.summary.map((value) => String(value ?? "").trim()).filter(Boolean).join("\n")
228
+ : "";
229
+ const explanation = explanationFromField || summaryFromArray;
230
+ const steps = extractStructuredPlanSteps(item);
231
+ if (!steps.length)
232
+ return explanation;
233
+ const stepLines = steps.map((step) => `- (${step.status}) ${step.step}`);
234
+ if (!explanation)
235
+ return stepLines.join("\n");
236
+ return `${explanation}\n${stepLines.join("\n")}`.trim();
237
+ }
238
+ /**
239
+ * 从 turn item 中抽取可展示的 text(兼容多种字段与结构化 plan)。
240
+ */
241
+ function extractTurnItemText(item) {
242
+ const it = item;
243
+ const itemType = typeof it?.type === "string" ? String(it.type).toLowerCase() : "";
244
+ if (typeof it?.text === "string")
245
+ return it.text;
246
+ if (typeof it?.message === "string")
247
+ return it.message;
248
+ if (itemType.includes("plan")) {
249
+ const structuredPlanText = extractStructuredPlanText(it);
250
+ if (structuredPlanText)
251
+ return structuredPlanText;
252
+ }
253
+ if (Array.isArray(it?.summary) && it.summary.length) {
254
+ return it.summary.map(String).filter(Boolean).join("\n").trim();
255
+ }
256
+ if (typeof it?.command === "string") {
257
+ const aggregated = typeof it?.aggregatedOutput === "string" ? it.aggregatedOutput : "";
258
+ const exit = typeof it?.exitCode === "number" ? `exitCode=${it.exitCode}` : "";
259
+ const header = `command: ${it.command}${exit ? ` (${exit})` : ""}`;
260
+ if (aggregated && aggregated.trim())
261
+ return `${header}\n\n${aggregated}`.trim();
262
+ return header;
263
+ }
264
+ const content = Array.isArray(it?.content)
265
+ ? it.content
266
+ : Array.isArray(it?.contentItems)
267
+ ? it.contentItems
268
+ : null;
269
+ if (content) {
270
+ const parts = content
271
+ .map((p) => extractTextPart(p))
272
+ .filter((s) => Boolean(s && s.trim()));
273
+ return parts.join("\n").trim();
274
+ }
275
+ return "";
276
+ }
277
+ /**
278
+ * 从 content item 中提取文本字段。
279
+ */
280
+ function extractTextPart(part) {
281
+ const p = part;
282
+ if (!p)
283
+ return null;
284
+ if (typeof p === "string")
285
+ return p;
286
+ if (typeof p?.text === "string")
287
+ return p.text;
288
+ if (typeof p?.value === "string")
289
+ return p.value;
290
+ return null;
291
+ }
292
+ //# sourceMappingURL=threadTurnsProjector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadTurnsProjector.js","sourceRoot":"","sources":["../../src/chat/threadTurnsProjector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TodoPlanUpdate } from "./todoPlanTypes";
2
+ /**
3
+ * 解析 Codex 通知 payload({method, params}),提取 TODO/Checklist 更新。
4
+ *
5
+ * 支持来源:
6
+ * - app-server v2:`turn/plan/updated`
7
+ */
8
+ export declare function extractTodoPlanUpdateFromCodexPayload(payload: unknown): TodoPlanUpdate | null;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractTodoPlanUpdateFromCodexPayload = extractTodoPlanUpdateFromCodexPayload;
4
+ /**
5
+ * 判断值是否为普通对象,避免把 `null`/数组误判为可索引对象。
6
+ */
7
+ function isPlainRecord(value) {
8
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
9
+ }
10
+ /**
11
+ * 归一化 threadId/turnId:空值返回 `null`。
12
+ */
13
+ function normalizeId(value) {
14
+ if (typeof value !== "string")
15
+ return null;
16
+ const trimmed = value.trim();
17
+ return trimmed ? trimmed : null;
18
+ }
19
+ /**
20
+ * 归一化 explanation:空白字符串返回 `null`。
21
+ */
22
+ function normalizeExplanation(value) {
23
+ if (value === null || value === undefined)
24
+ return null;
25
+ if (typeof value !== "string")
26
+ return null;
27
+ const trimmed = value.trim();
28
+ return trimmed ? trimmed : null;
29
+ }
30
+ /**
31
+ * 将不同协议里的 step status 统一映射为 Web 内部的 snake_case。
32
+ */
33
+ function normalizeTodoPlanStepStatus(value) {
34
+ if (typeof value !== "string")
35
+ return null;
36
+ const raw = value.trim();
37
+ if (!raw)
38
+ return null;
39
+ // app-server v2 使用 `inProgress`;v1/工具参数使用 `in_progress`。
40
+ if (raw === "inProgress")
41
+ return "in_progress";
42
+ const lower = raw.toLowerCase();
43
+ if (lower === "pending")
44
+ return "pending";
45
+ if (lower === "completed")
46
+ return "completed";
47
+ if (lower === "in_progress" || lower === "inprogress")
48
+ return "in_progress";
49
+ return null;
50
+ }
51
+ /**
52
+ * 将未知结构的 plan 数组解析为 `TodoPlanStep[]`,并过滤非法条目。
53
+ */
54
+ function normalizeTodoPlanSteps(value) {
55
+ const steps = Array.isArray(value) ? value : [];
56
+ const out = [];
57
+ for (const stepItem of steps) {
58
+ if (!isPlainRecord(stepItem))
59
+ continue;
60
+ const stepText = typeof stepItem.step === "string" ? stepItem.step.trim() : "";
61
+ if (!stepText)
62
+ continue;
63
+ const status = normalizeTodoPlanStepStatus(stepItem.status);
64
+ if (!status)
65
+ continue;
66
+ out.push({ status, step: stepText });
67
+ }
68
+ return out;
69
+ }
70
+ /**
71
+ * 解析 Codex 通知 payload({method, params}),提取 TODO/Checklist 更新。
72
+ *
73
+ * 支持来源:
74
+ * - app-server v2:`turn/plan/updated`
75
+ */
76
+ function extractTodoPlanUpdateFromCodexPayload(payload) {
77
+ if (!isPlainRecord(payload))
78
+ return null;
79
+ const method = typeof payload.method === "string" ? payload.method : "";
80
+ const params = payload.params;
81
+ if (method === "turn/plan/updated") {
82
+ if (!isPlainRecord(params))
83
+ return null;
84
+ const threadId = normalizeId(params.threadId ?? params.thread_id);
85
+ if (!threadId)
86
+ return null;
87
+ const turnId = normalizeId(params.turnId ?? params.turn_id);
88
+ const explanation = normalizeExplanation(params.explanation);
89
+ const plan = normalizeTodoPlanSteps(params.plan);
90
+ return { threadId, turnId, explanation, plan };
91
+ }
92
+ return null;
93
+ }
94
+ //# sourceMappingURL=todoPlanProjector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoPlanProjector.js","sourceRoot":"","sources":["../../src/chat/todoPlanProjector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Codex CLI 的 TODO/Checklist(由 `turn/plan/updated` 等事件驱动)。
3
+ * 说明:状态统一收敛为 snake_case,便于前端样式与统计。
4
+ */
5
+ export type TodoPlanStepStatus = "pending" | "in_progress" | "completed";
6
+ /**
7
+ * TODO/Checklist 的单步条目。
8
+ */
9
+ export type TodoPlanStep = {
10
+ status: TodoPlanStepStatus;
11
+ step: string;
12
+ };
13
+ /**
14
+ * WS 事件解析后的 TODO 更新载荷(用于上报到 App 状态)。
15
+ */
16
+ export type TodoPlanUpdate = {
17
+ threadId: string;
18
+ turnId: string | null;
19
+ explanation: string | null;
20
+ plan: TodoPlanStep[];
21
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=todoPlanTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoPlanTypes.js","sourceRoot":"","sources":["../../src/chat/todoPlanTypes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * WS/HTTP 层下发给 Web UI 的聊天消息角色值。
3
+ */
4
+ export type ChatRole = "user" | "assistant" | "system" | "reasoning";
5
+ /**
6
+ * Web UI 渲染类型:用于切换 terminal/diff/approval 等卡片样式。
7
+ */
8
+ export type ChatRender = "text" | "terminal" | "diff" | "approval";
9
+ /**
10
+ * 文本指标:用于前端折叠阈值与高度估算。
11
+ */
12
+ export type TextMetrics = {
13
+ lines: number;
14
+ chars: number;
15
+ };
16
+ /**
17
+ * 后端解析后的 Markdown AST(HAST 精简版,可 JSON 序列化)。
18
+ *
19
+ * 说明:
20
+ * - 前端不再解析 Markdown 字符串;
21
+ * - 前端仅负责把 AST 渲染为 React 节点。
22
+ */
23
+ export type UiMarkdownAst = {
24
+ type: "root" | "element" | "text";
25
+ tagName?: string;
26
+ properties?: Record<string, unknown>;
27
+ children?: UiMarkdownAst[];
28
+ value?: string;
29
+ };
30
+ /**
31
+ * CLI 风格 system 工具调用摘要里的“阶段”节点。
32
+ */
33
+ export type SystemToolCallStage = {
34
+ title: string;
35
+ steps: string[];
36
+ };
37
+ /**
38
+ * 解析后的 system 工具调用摘要结构。
39
+ */
40
+ export type SystemToolCallSummary = {
41
+ stages: SystemToolCallStage[];
42
+ statusLines: string[];
43
+ };
44
+ /**
45
+ * 单条文件变更记录(diff 渲染的最小单元)。
46
+ */
47
+ export type FileChange = {
48
+ path: string;
49
+ kind: string;
50
+ diff: string;
51
+ };
52
+ /**
53
+ * 文件变更渲染数据(包含变更列表与可选工具输出)。
54
+ */
55
+ export type DiffData = {
56
+ title: string;
57
+ changes: FileChange[];
58
+ output?: string;
59
+ };
60
+ /**
61
+ * 消息投递状态:用于本地乐观消息展示。
62
+ */
63
+ export type MessageDeliveryStatus = "pending" | "sent" | "failed";
64
+ /**
65
+ * Web UI 的单条聊天消息结构(用于渲染与历史合并)。
66
+ */
67
+ export type ChatItem = {
68
+ id: string;
69
+ ts: number;
70
+ role: ChatRole;
71
+ text: string;
72
+ /**
73
+ * plainText:用于复制/折叠预览的“纯文本”(terminal 会做转义与擦除序列归一化)。
74
+ */
75
+ plainText?: string;
76
+ /**
77
+ * metrics:文本指标;优先由后端/增量合并逻辑维护,避免前端重复扫描大字符串。
78
+ */
79
+ metrics?: TextMetrics;
80
+ clientMessageId?: string;
81
+ deliveryStatus?: MessageDeliveryStatus;
82
+ deliveryError?: string;
83
+ streaming?: boolean;
84
+ render?: ChatRender;
85
+ diff?: DiffData;
86
+ /**
87
+ * markdownAst:后端解析后的 Markdown AST(仅对 text 渲染场景生效)。
88
+ */
89
+ markdownAst?: UiMarkdownAst | null;
90
+ /**
91
+ * systemToolCallSummary:后端解析后的 system 工具调用摘要(仅对 system/text 生效)。
92
+ */
93
+ systemToolCallSummary?: SystemToolCallSummary | null;
94
+ };
95
+ /**
96
+ * ChatItem 的补丁结构:仅覆盖需要变更的字段。
97
+ */
98
+ export type ChatItemPatch = {
99
+ text?: string;
100
+ plainText?: string;
101
+ metrics?: TextMetrics;
102
+ render?: ChatRender;
103
+ diff?: DiffData;
104
+ markdownAst?: UiMarkdownAst | null;
105
+ systemToolCallSummary?: SystemToolCallSummary | null;
106
+ };
107
+ /**
108
+ * 后端投影后的增量操作;前端只需要按 op 合并并渲染即可。
109
+ */
110
+ export type ChatOp = {
111
+ op: "upsert";
112
+ item: ChatItem;
113
+ preserveTs?: boolean;
114
+ } | {
115
+ op: "text_delta";
116
+ id: string;
117
+ ts: number;
118
+ role: ChatRole;
119
+ delta: string;
120
+ render?: ChatRender;
121
+ } | {
122
+ op: "diff_output_delta";
123
+ id: string;
124
+ ts: number;
125
+ delta: string;
126
+ } | {
127
+ op: "finalize";
128
+ id: string;
129
+ ts: number;
130
+ patch?: ChatItemPatch;
131
+ } | {
132
+ op: "mark_all_streaming_done";
133
+ ts: number;
134
+ } | {
135
+ op: "mark_streaming_done_by_prefix";
136
+ ts: number;
137
+ prefix: string;
138
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * config 启动参数解析结果。
3
+ * Parsed result for config startup argument.
4
+ */
5
+ export type ConfigArgParseResult = {
6
+ /**
7
+ * 解析出的配置值;未传入时为 null。
8
+ * Parsed config value; null when not provided.
9
+ */
10
+ configValue: string | null;
11
+ };
12
+ /**
13
+ * 从 argv 中解析 `--config` / `---config` 参数。
14
+ * Parse `--config` / `---config` from argv.
15
+ */
16
+ export declare function parseConfigArgFromArgv(argv: string[]): ConfigArgParseResult;
17
+ /**
18
+ * 将 argv 中的 config 参数同步到环境变量 `CODEX_CONFIG`。
19
+ * Sync parsed config arg into env var `CODEX_CONFIG`.
20
+ */
21
+ export declare function applyConfigArgToEnv(argv: string[], env?: NodeJS.ProcessEnv): void;