@right-link/paperclip-plugin-codex-remote 0.3.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/dist/cli/format-event.d.ts +2 -0
  4. package/dist/cli/format-event.d.ts.map +1 -0
  5. package/dist/cli/format-event.js +213 -0
  6. package/dist/cli/format-event.js.map +1 -0
  7. package/dist/cli/index.d.ts +2 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +2 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/quota-probe.d.ts +3 -0
  12. package/dist/cli/quota-probe.d.ts.map +1 -0
  13. package/dist/cli/quota-probe.js +97 -0
  14. package/dist/cli/quota-probe.js.map +1 -0
  15. package/dist/index.d.ts +17 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +84 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/server/adapter.d.ts +16 -0
  20. package/dist/server/adapter.d.ts.map +1 -0
  21. package/dist/server/adapter.js +157 -0
  22. package/dist/server/adapter.js.map +1 -0
  23. package/dist/server/adapter.test.d.ts +2 -0
  24. package/dist/server/adapter.test.d.ts.map +1 -0
  25. package/dist/server/adapter.test.js +84 -0
  26. package/dist/server/adapter.test.js.map +1 -0
  27. package/dist/server/codex-args.d.ts +13 -0
  28. package/dist/server/codex-args.d.ts.map +1 -0
  29. package/dist/server/codex-args.js +60 -0
  30. package/dist/server/codex-args.js.map +1 -0
  31. package/dist/server/codex-args.test.d.ts +2 -0
  32. package/dist/server/codex-args.test.d.ts.map +1 -0
  33. package/dist/server/codex-args.test.js +94 -0
  34. package/dist/server/codex-args.test.js.map +1 -0
  35. package/dist/server/codex-home.d.ts +47 -0
  36. package/dist/server/codex-home.d.ts.map +1 -0
  37. package/dist/server/codex-home.js +378 -0
  38. package/dist/server/codex-home.js.map +1 -0
  39. package/dist/server/codex-home.test.d.ts +2 -0
  40. package/dist/server/codex-home.test.d.ts.map +1 -0
  41. package/dist/server/codex-home.test.js +244 -0
  42. package/dist/server/codex-home.test.js.map +1 -0
  43. package/dist/server/execute.d.ts +16 -0
  44. package/dist/server/execute.d.ts.map +1 -0
  45. package/dist/server/execute.js +906 -0
  46. package/dist/server/execute.js.map +1 -0
  47. package/dist/server/execute.remote.test.d.ts +2 -0
  48. package/dist/server/execute.remote.test.d.ts.map +1 -0
  49. package/dist/server/execute.remote.test.js +487 -0
  50. package/dist/server/execute.remote.test.js.map +1 -0
  51. package/dist/server/index.d.ts +8 -0
  52. package/dist/server/index.d.ts.map +1 -0
  53. package/dist/server/index.js +57 -0
  54. package/dist/server/index.js.map +1 -0
  55. package/dist/server/parse.d.ts +22 -0
  56. package/dist/server/parse.d.ts.map +1 -0
  57. package/dist/server/parse.js +213 -0
  58. package/dist/server/parse.js.map +1 -0
  59. package/dist/server/parse.test.d.ts +2 -0
  60. package/dist/server/parse.test.d.ts.map +1 -0
  61. package/dist/server/parse.test.js +107 -0
  62. package/dist/server/parse.test.js.map +1 -0
  63. package/dist/server/quota-spawn-error.test.d.ts +2 -0
  64. package/dist/server/quota-spawn-error.test.d.ts.map +1 -0
  65. package/dist/server/quota-spawn-error.test.js +77 -0
  66. package/dist/server/quota-spawn-error.test.js.map +1 -0
  67. package/dist/server/quota.d.ts +64 -0
  68. package/dist/server/quota.d.ts.map +1 -0
  69. package/dist/server/quota.js +432 -0
  70. package/dist/server/quota.js.map +1 -0
  71. package/dist/server/sandbox-env.d.ts +4 -0
  72. package/dist/server/sandbox-env.d.ts.map +1 -0
  73. package/dist/server/sandbox-env.js +23 -0
  74. package/dist/server/sandbox-env.js.map +1 -0
  75. package/dist/server/skills.d.ts +8 -0
  76. package/dist/server/skills.d.ts.map +1 -0
  77. package/dist/server/skills.js +24 -0
  78. package/dist/server/skills.js.map +1 -0
  79. package/dist/server/tailscale.d.ts +24 -0
  80. package/dist/server/tailscale.d.ts.map +1 -0
  81. package/dist/server/tailscale.js +95 -0
  82. package/dist/server/tailscale.js.map +1 -0
  83. package/dist/server/test.d.ts +3 -0
  84. package/dist/server/test.d.ts.map +1 -0
  85. package/dist/server/test.js +811 -0
  86. package/dist/server/test.js.map +1 -0
  87. package/dist/server/test.remote.test.d.ts +2 -0
  88. package/dist/server/test.remote.test.d.ts.map +1 -0
  89. package/dist/server/test.remote.test.js +257 -0
  90. package/dist/server/test.remote.test.js.map +1 -0
  91. package/dist/ui/build-config.d.ts +3 -0
  92. package/dist/ui/build-config.d.ts.map +1 -0
  93. package/dist/ui/build-config.js +113 -0
  94. package/dist/ui/build-config.js.map +1 -0
  95. package/dist/ui/build-config.test.d.ts +2 -0
  96. package/dist/ui/build-config.test.d.ts.map +1 -0
  97. package/dist/ui/build-config.test.js +49 -0
  98. package/dist/ui/build-config.test.js.map +1 -0
  99. package/dist/ui/index.d.ts +3 -0
  100. package/dist/ui/index.d.ts.map +1 -0
  101. package/dist/ui/index.js +3 -0
  102. package/dist/ui/index.js.map +1 -0
  103. package/dist/ui/parse-stdout.d.ts +3 -0
  104. package/dist/ui/parse-stdout.d.ts.map +1 -0
  105. package/dist/ui/parse-stdout.js +261 -0
  106. package/dist/ui/parse-stdout.js.map +1 -0
  107. package/dist/ui/parse-stdout.test.d.ts +2 -0
  108. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  109. package/dist/ui/parse-stdout.test.js +77 -0
  110. package/dist/ui/parse-stdout.test.js.map +1 -0
  111. package/dist/ui-parser.d.ts +2 -0
  112. package/dist/ui-parser.d.ts.map +1 -0
  113. package/dist/ui-parser.js +245 -0
  114. package/dist/ui-parser.js.map +1 -0
  115. package/package.json +69 -0
@@ -0,0 +1,261 @@
1
+ function safeJsonParse(text) {
2
+ try {
3
+ return JSON.parse(text);
4
+ }
5
+ catch {
6
+ return null;
7
+ }
8
+ }
9
+ function asRecord(value) {
10
+ if (typeof value !== "object" || value === null || Array.isArray(value))
11
+ return null;
12
+ return value;
13
+ }
14
+ function asString(value, fallback = "") {
15
+ return typeof value === "string" ? value : fallback;
16
+ }
17
+ function asNumber(value, fallback = 0) {
18
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
19
+ }
20
+ function errorText(value) {
21
+ if (typeof value === "string")
22
+ return value;
23
+ const rec = asRecord(value);
24
+ if (!rec)
25
+ return "";
26
+ const msg = (typeof rec.message === "string" && rec.message) ||
27
+ (typeof rec.error === "string" && rec.error) ||
28
+ (typeof rec.code === "string" && rec.code) ||
29
+ "";
30
+ if (msg)
31
+ return msg;
32
+ try {
33
+ return JSON.stringify(rec);
34
+ }
35
+ catch {
36
+ return "";
37
+ }
38
+ }
39
+ function stringifyUnknown(value) {
40
+ if (typeof value === "string")
41
+ return value;
42
+ if (value === null || value === undefined)
43
+ return "";
44
+ try {
45
+ return JSON.stringify(value, null, 2);
46
+ }
47
+ catch {
48
+ return String(value);
49
+ }
50
+ }
51
+ function parseCommandExecutionItem(item, ts, phase) {
52
+ const id = asString(item.id);
53
+ const command = asString(item.command);
54
+ const status = asString(item.status);
55
+ const exitCode = typeof item.exit_code === "number" && Number.isFinite(item.exit_code) ? item.exit_code : null;
56
+ const safeCommand = command;
57
+ const output = asString(item.aggregated_output).replace(/\s+$/, "");
58
+ if (phase === "started") {
59
+ return [{
60
+ kind: "tool_call",
61
+ ts,
62
+ name: "command_execution",
63
+ toolUseId: id || command || "command_execution",
64
+ input: {
65
+ id,
66
+ command: safeCommand,
67
+ },
68
+ }];
69
+ }
70
+ const lines = [];
71
+ if (safeCommand)
72
+ lines.push(`command: ${safeCommand}`);
73
+ if (status)
74
+ lines.push(`status: ${status}`);
75
+ if (exitCode !== null)
76
+ lines.push(`exit_code: ${exitCode}`);
77
+ if (output) {
78
+ if (lines.length > 0)
79
+ lines.push("");
80
+ lines.push(output);
81
+ }
82
+ const isError = (exitCode !== null && exitCode !== 0) ||
83
+ status === "failed" ||
84
+ status === "errored" ||
85
+ status === "error" ||
86
+ status === "cancelled";
87
+ return [{
88
+ kind: "tool_result",
89
+ ts,
90
+ toolUseId: id || command || "command_execution",
91
+ content: lines.join("\n").trim() || "command completed",
92
+ isError,
93
+ }];
94
+ }
95
+ function parseFileChangeItem(item, ts) {
96
+ const changes = Array.isArray(item.changes) ? item.changes : [];
97
+ const entries = changes
98
+ .map((changeRaw) => asRecord(changeRaw))
99
+ .filter((change) => Boolean(change))
100
+ .map((change) => {
101
+ const kind = asString(change.kind, "update");
102
+ const path = asString(change.path, "unknown");
103
+ return `${kind} ${path}`;
104
+ });
105
+ if (entries.length === 0) {
106
+ return [{ kind: "system", ts, text: "file changes applied" }];
107
+ }
108
+ const preview = entries.slice(0, 6).join(", ");
109
+ const more = entries.length > 6 ? ` (+${entries.length - 6} more)` : "";
110
+ return [{ kind: "system", ts, text: `file changes: ${preview}${more}` }];
111
+ }
112
+ function parseToolUseItem(item, ts, phase) {
113
+ const name = asString(item.name, "unknown");
114
+ const toolUseId = asString(item.id, name || "tool_use");
115
+ if (phase === "started") {
116
+ return [{
117
+ kind: "tool_call",
118
+ ts,
119
+ name,
120
+ toolUseId,
121
+ input: item.input ?? {},
122
+ }];
123
+ }
124
+ const status = asString(item.status);
125
+ const isError = item.is_error === true ||
126
+ status === "failed" ||
127
+ status === "errored" ||
128
+ status === "error" ||
129
+ status === "cancelled";
130
+ const rawContent = item.content ??
131
+ item.output ??
132
+ item.result ??
133
+ item.error ??
134
+ item.message;
135
+ const content = asString(rawContent) ||
136
+ errorText(rawContent) ||
137
+ stringifyUnknown(rawContent) ||
138
+ `${name} ${isError ? "failed" : "completed"}`;
139
+ return [{
140
+ kind: "tool_result",
141
+ ts,
142
+ toolUseId,
143
+ content,
144
+ isError,
145
+ }];
146
+ }
147
+ function parseCodexItem(item, ts, phase) {
148
+ const itemType = asString(item.type);
149
+ if (itemType === "agent_message") {
150
+ const text = asString(item.text);
151
+ if (text)
152
+ return [{ kind: "assistant", ts, text }];
153
+ return [];
154
+ }
155
+ if (itemType === "reasoning") {
156
+ const text = asString(item.text);
157
+ if (text)
158
+ return [{ kind: "thinking", ts, text }];
159
+ return [{ kind: "system", ts, text: phase === "started" ? "reasoning started" : "reasoning completed" }];
160
+ }
161
+ if (itemType === "command_execution") {
162
+ return parseCommandExecutionItem(item, ts, phase);
163
+ }
164
+ if (itemType === "file_change" && phase === "completed") {
165
+ return parseFileChangeItem(item, ts);
166
+ }
167
+ if (itemType === "tool_use") {
168
+ return parseToolUseItem(item, ts, phase);
169
+ }
170
+ if (itemType === "tool_result" && phase === "completed") {
171
+ const toolUseId = asString(item.tool_use_id, asString(item.id));
172
+ const content = asString(item.content) ||
173
+ asString(item.output) ||
174
+ asString(item.result) ||
175
+ stringifyUnknown(item.content ?? item.output ?? item.result);
176
+ const isError = item.is_error === true || asString(item.status) === "error";
177
+ return [{ kind: "tool_result", ts, toolUseId, content, isError }];
178
+ }
179
+ if (itemType === "error" && phase === "completed") {
180
+ const text = errorText(item.message ?? item.error ?? item);
181
+ return [{ kind: "stderr", ts, text: text || "error" }];
182
+ }
183
+ const id = asString(item.id);
184
+ const status = asString(item.status);
185
+ const meta = [id ? `id=${id}` : "", status ? `status=${status}` : ""].filter(Boolean).join(" ");
186
+ return [{
187
+ kind: "system",
188
+ ts,
189
+ text: `item ${phase}: ${itemType || "unknown"}${meta ? ` (${meta})` : ""}`,
190
+ }];
191
+ }
192
+ export function parseCodexStdoutLine(line, ts) {
193
+ const parsed = asRecord(safeJsonParse(line));
194
+ if (!parsed) {
195
+ return [{ kind: "stdout", ts, text: line }];
196
+ }
197
+ const type = asString(parsed.type);
198
+ if (type === "thread.started") {
199
+ const threadId = asString(parsed.thread_id);
200
+ return [{
201
+ kind: "init",
202
+ ts,
203
+ model: asString(parsed.model, "codex"),
204
+ sessionId: threadId,
205
+ }];
206
+ }
207
+ if (type === "turn.started") {
208
+ return [{ kind: "system", ts, text: "turn started" }];
209
+ }
210
+ if (type === "item.started" || type === "item.completed") {
211
+ const item = asRecord(parsed.item);
212
+ if (!item)
213
+ return [{ kind: "system", ts, text: type.replace(".", " ") }];
214
+ return parseCodexItem(item, ts, type === "item.started" ? "started" : "completed");
215
+ }
216
+ if (type === "turn.completed") {
217
+ const usage = asRecord(parsed.usage);
218
+ const inputTokens = asNumber(usage?.input_tokens);
219
+ const outputTokens = asNumber(usage?.output_tokens);
220
+ const cachedTokens = asNumber(usage?.cached_input_tokens, asNumber(usage?.cache_read_input_tokens));
221
+ return [{
222
+ kind: "result",
223
+ ts,
224
+ text: asString(parsed.result),
225
+ inputTokens,
226
+ outputTokens,
227
+ cachedTokens,
228
+ costUsd: asNumber(parsed.total_cost_usd),
229
+ subtype: asString(parsed.subtype),
230
+ isError: parsed.is_error === true,
231
+ errors: Array.isArray(parsed.errors)
232
+ ? parsed.errors.map(errorText).filter(Boolean)
233
+ : [],
234
+ }];
235
+ }
236
+ if (type === "turn.failed") {
237
+ const usage = asRecord(parsed.usage);
238
+ const inputTokens = asNumber(usage?.input_tokens);
239
+ const outputTokens = asNumber(usage?.output_tokens);
240
+ const cachedTokens = asNumber(usage?.cached_input_tokens, asNumber(usage?.cache_read_input_tokens));
241
+ const message = errorText(parsed.error ?? parsed.message);
242
+ return [{
243
+ kind: "result",
244
+ ts,
245
+ text: asString(parsed.result),
246
+ inputTokens,
247
+ outputTokens,
248
+ cachedTokens,
249
+ costUsd: asNumber(parsed.total_cost_usd),
250
+ subtype: asString(parsed.subtype, "turn.failed"),
251
+ isError: true,
252
+ errors: message ? [message] : [],
253
+ }];
254
+ }
255
+ if (type === "error") {
256
+ const message = errorText(parsed.message ?? parsed.error ?? parsed);
257
+ return [{ kind: "stderr", ts, text: message || line }];
258
+ }
259
+ return [{ kind: "stdout", ts, text: line }];
260
+ }
261
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAQ,GAAG,EAAE;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAQ,GAAG,CAAC;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChF,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GACP,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC;QAChD,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC;QAC5C,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC;QAC1C,EAAE,CAAC;IACL,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,IAA6B,EAC7B,EAAU,EACV,KAA8B;IAE9B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/G,MAAM,WAAW,GAAG,OAAO,CAAC;IAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEpE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC;gBACN,IAAI,EAAE,WAAW;gBACjB,EAAE;gBACF,IAAI,EAAE,mBAAmB;gBACzB,SAAS,EAAE,EAAE,IAAI,OAAO,IAAI,mBAAmB;gBAC/C,KAAK,EAAE;oBACL,EAAE;oBACF,OAAO,EAAE,WAAW;iBACrB;aACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IACvD,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GACX,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC;QACrC,MAAM,KAAK,QAAQ;QACnB,MAAM,KAAK,SAAS;QACpB,MAAM,KAAK,OAAO;QAClB,MAAM,KAAK,WAAW,CAAC;IAEzB,OAAO,CAAC;YACN,IAAI,EAAE,aAAa;YACnB,EAAE;YACF,SAAS,EAAE,EAAE,IAAI,OAAO,IAAI,mBAAmB;YAC/C,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,mBAAmB;YACvD,OAAO;SACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA6B,EAAE,EAAU;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,OAAO;SACpB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACvC,MAAM,CAAC,CAAC,MAAM,EAAqC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SACtE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,OAAO,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,gBAAgB,CACvB,IAA6B,EAC7B,EAAU,EACV,KAA8B;IAE9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,UAAU,CAAC,CAAC;IAExD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC;gBACN,IAAI,EAAE,WAAW;gBACjB,EAAE;gBACF,IAAI;gBACJ,SAAS;gBACT,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;aACxB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,IAAI;QACtB,MAAM,KAAK,QAAQ;QACnB,MAAM,KAAK,SAAS;QACpB,MAAM,KAAK,OAAO;QAClB,MAAM,KAAK,WAAW,CAAC;IACzB,MAAM,UAAU,GACd,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,OAAO,CAAC;IACf,MAAM,OAAO,GACX,QAAQ,CAAC,UAAU,CAAC;QACpB,SAAS,CAAC,UAAU,CAAC;QACrB,gBAAgB,CAAC,UAAU,CAAC;QAC5B,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhD,OAAO,CAAC;YACN,IAAI,EAAE,aAAa;YACnB,EAAE;YACF,SAAS;YACT,OAAO;YACP,OAAO;SACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,IAA6B,EAC7B,EAAU,EACV,KAA8B;IAE9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACrC,OAAO,yBAAyB,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACxD,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,QAAQ,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB,gBAAgB,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC;QAC5E,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QAC3D,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChG,OAAO,CAAC;YACN,IAAI,EAAE,QAAQ;YACd,EAAE;YACF,IAAI,EAAE,QAAQ,KAAK,KAAK,QAAQ,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;SAC3E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,EAAU;IAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,CAAC;gBACN,IAAI,EAAE,MAAM;gBACZ,EAAE;gBACF,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;gBACtC,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC;gBACN,IAAI,EAAE,QAAQ;gBACd,EAAE;gBACF,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7B,WAAW;gBACX,YAAY;gBACZ,YAAY;gBACZ,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;gBACjC,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,IAAI;gBACjC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;oBAClC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;oBAC9C,CAAC,CAAC,EAAE;aACP,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,CAAC;gBACN,IAAI,EAAE,QAAQ;gBACd,EAAE;gBACF,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7B,WAAW;gBACX,YAAY;gBACZ,YAAY;gBACZ,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;gBAChD,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;aACjC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;QACpE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-stdout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseCodexStdoutLine } from "./parse-stdout.js";
3
+ describe("parseCodexStdoutLine", () => {
4
+ it("marks completed tool_use items as resolved tool results", () => {
5
+ const started = parseCodexStdoutLine(JSON.stringify({
6
+ type: "item.started",
7
+ item: {
8
+ id: "tool-1",
9
+ type: "tool_use",
10
+ name: "search",
11
+ input: { query: "paperclip" },
12
+ },
13
+ }), "2026-04-08T12:00:00.000Z");
14
+ const completed = parseCodexStdoutLine(JSON.stringify({
15
+ type: "item.completed",
16
+ item: {
17
+ id: "tool-1",
18
+ type: "tool_use",
19
+ name: "search",
20
+ status: "completed",
21
+ },
22
+ }), "2026-04-08T12:00:01.000Z");
23
+ expect(started).toEqual([{
24
+ kind: "tool_call",
25
+ ts: "2026-04-08T12:00:00.000Z",
26
+ name: "search",
27
+ toolUseId: "tool-1",
28
+ input: { query: "paperclip" },
29
+ }]);
30
+ expect(completed).toEqual([{
31
+ kind: "tool_result",
32
+ ts: "2026-04-08T12:00:01.000Z",
33
+ toolUseId: "tool-1",
34
+ content: "search completed",
35
+ isError: false,
36
+ }]);
37
+ });
38
+ it("keeps explicit tool_result payloads authoritative after tool_use completion", () => {
39
+ const completed = parseCodexStdoutLine(JSON.stringify({
40
+ type: "item.completed",
41
+ item: {
42
+ id: "tool-2",
43
+ type: "tool_result",
44
+ tool_use_id: "tool-1",
45
+ content: "final payload",
46
+ status: "completed",
47
+ },
48
+ }), "2026-04-08T12:00:02.000Z");
49
+ expect(completed).toEqual([{
50
+ kind: "tool_result",
51
+ ts: "2026-04-08T12:00:02.000Z",
52
+ toolUseId: "tool-1",
53
+ content: "final payload",
54
+ isError: false,
55
+ }]);
56
+ });
57
+ it("marks failed completed tool_use items as error results", () => {
58
+ const completed = parseCodexStdoutLine(JSON.stringify({
59
+ type: "item.completed",
60
+ item: {
61
+ id: "tool-3",
62
+ type: "tool_use",
63
+ name: "write_file",
64
+ status: "error",
65
+ error: { message: "permission denied" },
66
+ },
67
+ }), "2026-04-08T12:00:03.000Z");
68
+ expect(completed).toEqual([{
69
+ kind: "tool_result",
70
+ ts: "2026-04-08T12:00:03.000Z",
71
+ toolUseId: "tool-3",
72
+ content: "permission denied",
73
+ isError: true,
74
+ }]);
75
+ });
76
+ });
77
+ //# sourceMappingURL=parse-stdout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { parseCodexStdoutLine as parseStdoutLine } from "./ui/parse-stdout.js";
2
+ //# sourceMappingURL=ui-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-parser.d.ts","sourceRoot":"","sources":["../src/ui-parser.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ui-parser.ts
21
+ var ui_parser_exports = {};
22
+ __export(ui_parser_exports, {
23
+ parseStdoutLine: () => parseCodexStdoutLine
24
+ });
25
+ module.exports = __toCommonJS(ui_parser_exports);
26
+
27
+ // src/ui/parse-stdout.ts
28
+ function safeJsonParse(text) {
29
+ try {
30
+ return JSON.parse(text);
31
+ } catch {
32
+ return null;
33
+ }
34
+ }
35
+ function asRecord(value) {
36
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
37
+ return value;
38
+ }
39
+ function asString(value, fallback = "") {
40
+ return typeof value === "string" ? value : fallback;
41
+ }
42
+ function asNumber(value, fallback = 0) {
43
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
44
+ }
45
+ function errorText(value) {
46
+ if (typeof value === "string") return value;
47
+ const rec = asRecord(value);
48
+ if (!rec) return "";
49
+ const msg = typeof rec.message === "string" && rec.message || typeof rec.error === "string" && rec.error || typeof rec.code === "string" && rec.code || "";
50
+ if (msg) return msg;
51
+ try {
52
+ return JSON.stringify(rec);
53
+ } catch {
54
+ return "";
55
+ }
56
+ }
57
+ function stringifyUnknown(value) {
58
+ if (typeof value === "string") return value;
59
+ if (value === null || value === void 0) return "";
60
+ try {
61
+ return JSON.stringify(value, null, 2);
62
+ } catch {
63
+ return String(value);
64
+ }
65
+ }
66
+ function parseCommandExecutionItem(item, ts, phase) {
67
+ const id = asString(item.id);
68
+ const command = asString(item.command);
69
+ const status = asString(item.status);
70
+ const exitCode = typeof item.exit_code === "number" && Number.isFinite(item.exit_code) ? item.exit_code : null;
71
+ const safeCommand = command;
72
+ const output = asString(item.aggregated_output).replace(/\s+$/, "");
73
+ if (phase === "started") {
74
+ return [{
75
+ kind: "tool_call",
76
+ ts,
77
+ name: "command_execution",
78
+ toolUseId: id || command || "command_execution",
79
+ input: {
80
+ id,
81
+ command: safeCommand
82
+ }
83
+ }];
84
+ }
85
+ const lines = [];
86
+ if (safeCommand) lines.push(`command: ${safeCommand}`);
87
+ if (status) lines.push(`status: ${status}`);
88
+ if (exitCode !== null) lines.push(`exit_code: ${exitCode}`);
89
+ if (output) {
90
+ if (lines.length > 0) lines.push("");
91
+ lines.push(output);
92
+ }
93
+ const isError = exitCode !== null && exitCode !== 0 || status === "failed" || status === "errored" || status === "error" || status === "cancelled";
94
+ return [{
95
+ kind: "tool_result",
96
+ ts,
97
+ toolUseId: id || command || "command_execution",
98
+ content: lines.join("\n").trim() || "command completed",
99
+ isError
100
+ }];
101
+ }
102
+ function parseFileChangeItem(item, ts) {
103
+ const changes = Array.isArray(item.changes) ? item.changes : [];
104
+ const entries = changes.map((changeRaw) => asRecord(changeRaw)).filter((change) => Boolean(change)).map((change) => {
105
+ const kind = asString(change.kind, "update");
106
+ const path = asString(change.path, "unknown");
107
+ return `${kind} ${path}`;
108
+ });
109
+ if (entries.length === 0) {
110
+ return [{ kind: "system", ts, text: "file changes applied" }];
111
+ }
112
+ const preview = entries.slice(0, 6).join(", ");
113
+ const more = entries.length > 6 ? ` (+${entries.length - 6} more)` : "";
114
+ return [{ kind: "system", ts, text: `file changes: ${preview}${more}` }];
115
+ }
116
+ function parseToolUseItem(item, ts, phase) {
117
+ const name = asString(item.name, "unknown");
118
+ const toolUseId = asString(item.id, name || "tool_use");
119
+ if (phase === "started") {
120
+ return [{
121
+ kind: "tool_call",
122
+ ts,
123
+ name,
124
+ toolUseId,
125
+ input: item.input ?? {}
126
+ }];
127
+ }
128
+ const status = asString(item.status);
129
+ const isError = item.is_error === true || status === "failed" || status === "errored" || status === "error" || status === "cancelled";
130
+ const rawContent = item.content ?? item.output ?? item.result ?? item.error ?? item.message;
131
+ const content = asString(rawContent) || errorText(rawContent) || stringifyUnknown(rawContent) || `${name} ${isError ? "failed" : "completed"}`;
132
+ return [{
133
+ kind: "tool_result",
134
+ ts,
135
+ toolUseId,
136
+ content,
137
+ isError
138
+ }];
139
+ }
140
+ function parseCodexItem(item, ts, phase) {
141
+ const itemType = asString(item.type);
142
+ if (itemType === "agent_message") {
143
+ const text = asString(item.text);
144
+ if (text) return [{ kind: "assistant", ts, text }];
145
+ return [];
146
+ }
147
+ if (itemType === "reasoning") {
148
+ const text = asString(item.text);
149
+ if (text) return [{ kind: "thinking", ts, text }];
150
+ return [{ kind: "system", ts, text: phase === "started" ? "reasoning started" : "reasoning completed" }];
151
+ }
152
+ if (itemType === "command_execution") {
153
+ return parseCommandExecutionItem(item, ts, phase);
154
+ }
155
+ if (itemType === "file_change" && phase === "completed") {
156
+ return parseFileChangeItem(item, ts);
157
+ }
158
+ if (itemType === "tool_use") {
159
+ return parseToolUseItem(item, ts, phase);
160
+ }
161
+ if (itemType === "tool_result" && phase === "completed") {
162
+ const toolUseId = asString(item.tool_use_id, asString(item.id));
163
+ const content = asString(item.content) || asString(item.output) || asString(item.result) || stringifyUnknown(item.content ?? item.output ?? item.result);
164
+ const isError = item.is_error === true || asString(item.status) === "error";
165
+ return [{ kind: "tool_result", ts, toolUseId, content, isError }];
166
+ }
167
+ if (itemType === "error" && phase === "completed") {
168
+ const text = errorText(item.message ?? item.error ?? item);
169
+ return [{ kind: "stderr", ts, text: text || "error" }];
170
+ }
171
+ const id = asString(item.id);
172
+ const status = asString(item.status);
173
+ const meta = [id ? `id=${id}` : "", status ? `status=${status}` : ""].filter(Boolean).join(" ");
174
+ return [{
175
+ kind: "system",
176
+ ts,
177
+ text: `item ${phase}: ${itemType || "unknown"}${meta ? ` (${meta})` : ""}`
178
+ }];
179
+ }
180
+ function parseCodexStdoutLine(line, ts) {
181
+ const parsed = asRecord(safeJsonParse(line));
182
+ if (!parsed) {
183
+ return [{ kind: "stdout", ts, text: line }];
184
+ }
185
+ const type = asString(parsed.type);
186
+ if (type === "thread.started") {
187
+ const threadId = asString(parsed.thread_id);
188
+ return [{
189
+ kind: "init",
190
+ ts,
191
+ model: asString(parsed.model, "codex"),
192
+ sessionId: threadId
193
+ }];
194
+ }
195
+ if (type === "turn.started") {
196
+ return [{ kind: "system", ts, text: "turn started" }];
197
+ }
198
+ if (type === "item.started" || type === "item.completed") {
199
+ const item = asRecord(parsed.item);
200
+ if (!item) return [{ kind: "system", ts, text: type.replace(".", " ") }];
201
+ return parseCodexItem(item, ts, type === "item.started" ? "started" : "completed");
202
+ }
203
+ if (type === "turn.completed") {
204
+ const usage = asRecord(parsed.usage);
205
+ const inputTokens = asNumber(usage?.input_tokens);
206
+ const outputTokens = asNumber(usage?.output_tokens);
207
+ const cachedTokens = asNumber(usage?.cached_input_tokens, asNumber(usage?.cache_read_input_tokens));
208
+ return [{
209
+ kind: "result",
210
+ ts,
211
+ text: asString(parsed.result),
212
+ inputTokens,
213
+ outputTokens,
214
+ cachedTokens,
215
+ costUsd: asNumber(parsed.total_cost_usd),
216
+ subtype: asString(parsed.subtype),
217
+ isError: parsed.is_error === true,
218
+ errors: Array.isArray(parsed.errors) ? parsed.errors.map(errorText).filter(Boolean) : []
219
+ }];
220
+ }
221
+ if (type === "turn.failed") {
222
+ const usage = asRecord(parsed.usage);
223
+ const inputTokens = asNumber(usage?.input_tokens);
224
+ const outputTokens = asNumber(usage?.output_tokens);
225
+ const cachedTokens = asNumber(usage?.cached_input_tokens, asNumber(usage?.cache_read_input_tokens));
226
+ const message = errorText(parsed.error ?? parsed.message);
227
+ return [{
228
+ kind: "result",
229
+ ts,
230
+ text: asString(parsed.result),
231
+ inputTokens,
232
+ outputTokens,
233
+ cachedTokens,
234
+ costUsd: asNumber(parsed.total_cost_usd),
235
+ subtype: asString(parsed.subtype, "turn.failed"),
236
+ isError: true,
237
+ errors: message ? [message] : []
238
+ }];
239
+ }
240
+ if (type === "error") {
241
+ const message = errorText(parsed.message ?? parsed.error ?? parsed);
242
+ return [{ kind: "stderr", ts, text: message || line }];
243
+ }
244
+ return [{ kind: "stdout", ts, text: line }];
245
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-parser.js","sourceRoot":"","sources":["../src/ui-parser.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,oDAAoD;AACpD,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC"}