@juspay/shooter 1.15.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/build/client/_app/immutable/assets/{0.BZLcOr5z.css → 0.DEfoFaGR.css} +1 -1
  2. package/build/client/_app/immutable/assets/0.DEfoFaGR.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.DEfoFaGR.css.gz +0 -0
  4. package/build/client/_app/immutable/chunks/Bkqjn62J.js +1 -0
  5. package/build/client/_app/immutable/chunks/Bkqjn62J.js.br +1 -0
  6. package/build/client/_app/immutable/chunks/Bkqjn62J.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{gxvWeAns.js → DOHhmtDH.js} +1 -1
  8. package/build/client/_app/immutable/chunks/DOHhmtDH.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/DOHhmtDH.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{pMo6RVvN.js → DlS3abGJ.js} +1 -1
  11. package/build/client/_app/immutable/chunks/DlS3abGJ.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/DlS3abGJ.js.gz +0 -0
  13. package/build/client/_app/immutable/entry/{app.B0PrrcUG.js → app.CSJG7N9H.js} +2 -2
  14. package/build/client/_app/immutable/entry/app.CSJG7N9H.js.br +0 -0
  15. package/build/client/_app/immutable/entry/app.CSJG7N9H.js.gz +0 -0
  16. package/build/client/_app/immutable/entry/start.CTt1901T.js +1 -0
  17. package/build/client/_app/immutable/entry/start.CTt1901T.js.br +2 -0
  18. package/build/client/_app/immutable/entry/start.CTt1901T.js.gz +0 -0
  19. package/build/client/_app/immutable/nodes/{0.D4GLHqPM.js → 0.qOL7xtFn.js} +1 -1
  20. package/build/client/_app/immutable/nodes/0.qOL7xtFn.js.br +0 -0
  21. package/build/client/_app/immutable/nodes/0.qOL7xtFn.js.gz +0 -0
  22. package/build/client/_app/immutable/nodes/{1.nJde5z5O.js → 1.Di708Ago.js} +1 -1
  23. package/build/client/_app/immutable/nodes/1.Di708Ago.js.br +0 -0
  24. package/build/client/_app/immutable/nodes/1.Di708Ago.js.gz +0 -0
  25. package/build/client/_app/immutable/nodes/{2.CLtsjLeG.js → 2.DSM1znqa.js} +1 -1
  26. package/build/client/_app/immutable/nodes/2.DSM1znqa.js.br +0 -0
  27. package/build/client/_app/immutable/nodes/2.DSM1znqa.js.gz +0 -0
  28. package/build/client/_app/immutable/nodes/{3.CKTUHtnx.js → 3.BPa5fh75.js} +1 -1
  29. package/build/client/_app/immutable/nodes/3.BPa5fh75.js.br +0 -0
  30. package/build/client/_app/immutable/nodes/3.BPa5fh75.js.gz +0 -0
  31. package/build/client/_app/immutable/nodes/6.B1LwwEF-.js +1 -0
  32. package/build/client/_app/immutable/nodes/6.B1LwwEF-.js.br +0 -0
  33. package/build/client/_app/immutable/nodes/6.B1LwwEF-.js.gz +0 -0
  34. package/build/client/_app/immutable/nodes/7.B7UJd8GQ.js +4 -0
  35. package/build/client/_app/immutable/nodes/7.B7UJd8GQ.js.br +0 -0
  36. package/build/client/_app/immutable/nodes/7.B7UJd8GQ.js.gz +0 -0
  37. package/build/client/_app/immutable/nodes/8.CG0mrgBU.js +2 -0
  38. package/build/client/_app/immutable/nodes/8.CG0mrgBU.js.br +0 -0
  39. package/build/client/_app/immutable/nodes/8.CG0mrgBU.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/9.KwzWaMHj.js +2 -0
  41. package/build/client/_app/immutable/nodes/9.KwzWaMHj.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/9.KwzWaMHj.js.gz +0 -0
  43. package/build/client/_app/version.json +1 -1
  44. package/build/client/_app/version.json.br +0 -0
  45. package/build/client/_app/version.json.gz +0 -0
  46. package/build/server/chunks/{0-BUSWGJr9.js → 0-D8uPamNd.js} +3 -3
  47. package/build/server/chunks/{0-BUSWGJr9.js.map → 0-D8uPamNd.js.map} +1 -1
  48. package/build/server/chunks/{1-DjiQE1K0.js → 1-DhtioHbs.js} +2 -2
  49. package/build/server/chunks/{1-DjiQE1K0.js.map → 1-DhtioHbs.js.map} +1 -1
  50. package/build/server/chunks/{2-ThgVrRKa.js → 2-Cgh7ZFgE.js} +2 -2
  51. package/build/server/chunks/{2-ThgVrRKa.js.map → 2-Cgh7ZFgE.js.map} +1 -1
  52. package/build/server/chunks/{3-G5LiDFQ9.js → 3-I6hnjssH.js} +2 -2
  53. package/build/server/chunks/{3-G5LiDFQ9.js.map → 3-I6hnjssH.js.map} +1 -1
  54. package/build/server/chunks/{6--I7fF3Bx.js → 6-bPDbH1_W.js} +2 -2
  55. package/build/server/chunks/{6--I7fF3Bx.js.map → 6-bPDbH1_W.js.map} +1 -1
  56. package/build/server/chunks/{7-BwPLVwOR.js → 7-CpBrOkxQ.js} +2 -2
  57. package/build/server/chunks/{7-BwPLVwOR.js.map → 7-CpBrOkxQ.js.map} +1 -1
  58. package/build/server/chunks/{8-BwOMHaoQ.js → 8-BRGAVfze.js} +2 -2
  59. package/build/server/chunks/{8-BwOMHaoQ.js.map → 8-BRGAVfze.js.map} +1 -1
  60. package/build/server/chunks/{9-DkO6aJIB.js → 9-C6xuAb_Y.js} +2 -2
  61. package/build/server/chunks/{9-DkO6aJIB.js.map → 9-C6xuAb_Y.js.map} +1 -1
  62. package/build/server/chunks/{_server.ts-ByPExYfO.js → _server.ts-BLNDdFWC.js} +3 -3
  63. package/build/server/chunks/_server.ts-BLNDdFWC.js.map +1 -0
  64. package/build/server/chunks/{_server.ts-40c_epk8.js → _server.ts-BrRZXr-8.js} +5 -4
  65. package/build/server/chunks/_server.ts-BrRZXr-8.js.map +1 -0
  66. package/build/server/chunks/{_server.ts-BuYyCrnF.js → _server.ts-C6xbNz6d.js} +4 -3
  67. package/build/server/chunks/_server.ts-C6xbNz6d.js.map +1 -0
  68. package/build/server/chunks/{_server.ts-CjpQ10xh.js → _server.ts-CjK0g9dO.js} +18 -2
  69. package/build/server/chunks/_server.ts-CjK0g9dO.js.map +1 -0
  70. package/build/server/chunks/{_server.ts-0Xr2fWaq.js → _server.ts-Cq9_scaV.js} +17 -7
  71. package/build/server/chunks/_server.ts-Cq9_scaV.js.map +1 -0
  72. package/build/server/chunks/{_server.ts-CilRds58.js → _server.ts-D--_NXt2.js} +25 -16
  73. package/build/server/chunks/_server.ts-D--_NXt2.js.map +1 -0
  74. package/build/server/chunks/{_server.ts-2ixC-X3K.js → _server.ts-Dekgb6Hx.js} +4 -3
  75. package/build/server/chunks/_server.ts-Dekgb6Hx.js.map +1 -0
  76. package/build/server/chunks/opencode-db-path-CRgzBK5U.js +402 -0
  77. package/build/server/chunks/opencode-db-path-CRgzBK5U.js.map +1 -0
  78. package/build/server/chunks/{pty-manager-TyMUpDA9.js → pty-manager-aFpChJah.js} +35 -2
  79. package/build/server/chunks/pty-manager-aFpChJah.js.map +1 -0
  80. package/build/server/index.js +1 -1
  81. package/build/server/index.js.map +1 -1
  82. package/build/server/manifest.js +16 -16
  83. package/build/server/manifest.js.map +1 -1
  84. package/package.json +2 -2
  85. package/server.ts +12 -0
  86. package/src/lib/modules/client/common/index.ts +1 -0
  87. package/src/lib/modules/client/common/provider.ts +30 -0
  88. package/src/lib/modules/client/terminal/LaunchSheet.svelte +2 -0
  89. package/src/lib/modules/server/sessions/codex-parser.ts +286 -0
  90. package/src/lib/modules/server/sessions/codex-reader.ts +293 -0
  91. package/src/lib/modules/server/sessions/process-detector.ts +23 -0
  92. package/src/lib/modules/server/terminal/codex-watcher.ts +179 -0
  93. package/src/lib/modules/server/terminal/pty-manager.ts +41 -0
  94. package/src/lib/theme.css +21 -1
  95. package/src/lib/types/codex.ts +21 -0
  96. package/src/lib/types/generated/Sessions.ts +5 -1
  97. package/src/lib/types/index.ts +1 -0
  98. package/src/lib/types/server.ts +18 -5
  99. package/src/lib/types/sessions.ts +1 -1
  100. package/src/routes/api/device-token/+server.ts +7 -3
  101. package/src/routes/api/sessions/+server.ts +27 -15
  102. package/src/routes/api/sessions/connect/+server.ts +19 -11
  103. package/src/routes/api/terminals/+server.ts +1 -1
  104. package/src/routes/project/+page.svelte +7 -23
  105. package/src/routes/session/[id]/+page.svelte +3 -3
  106. package/src/routes/terminals/+page.svelte +1 -1
  107. package/src/routes/terminals/[id]/+page.svelte +1 -1
  108. package/build/client/_app/immutable/assets/0.BZLcOr5z.css.br +0 -0
  109. package/build/client/_app/immutable/assets/0.BZLcOr5z.css.gz +0 -0
  110. package/build/client/_app/immutable/chunks/X-tVU_3P.js +0 -1
  111. package/build/client/_app/immutable/chunks/X-tVU_3P.js.br +0 -0
  112. package/build/client/_app/immutable/chunks/X-tVU_3P.js.gz +0 -0
  113. package/build/client/_app/immutable/chunks/gxvWeAns.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/gxvWeAns.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/pMo6RVvN.js.br +0 -0
  116. package/build/client/_app/immutable/chunks/pMo6RVvN.js.gz +0 -0
  117. package/build/client/_app/immutable/entry/app.B0PrrcUG.js.br +0 -0
  118. package/build/client/_app/immutable/entry/app.B0PrrcUG.js.gz +0 -0
  119. package/build/client/_app/immutable/entry/start.B1obDjVk.js +0 -1
  120. package/build/client/_app/immutable/entry/start.B1obDjVk.js.br +0 -0
  121. package/build/client/_app/immutable/entry/start.B1obDjVk.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/0.D4GLHqPM.js.br +0 -0
  123. package/build/client/_app/immutable/nodes/0.D4GLHqPM.js.gz +0 -0
  124. package/build/client/_app/immutable/nodes/1.nJde5z5O.js.br +0 -0
  125. package/build/client/_app/immutable/nodes/1.nJde5z5O.js.gz +0 -0
  126. package/build/client/_app/immutable/nodes/2.CLtsjLeG.js.br +0 -0
  127. package/build/client/_app/immutable/nodes/2.CLtsjLeG.js.gz +0 -0
  128. package/build/client/_app/immutable/nodes/3.CKTUHtnx.js.br +0 -0
  129. package/build/client/_app/immutable/nodes/3.CKTUHtnx.js.gz +0 -0
  130. package/build/client/_app/immutable/nodes/6.Cgc5iTlM.js +0 -1
  131. package/build/client/_app/immutable/nodes/6.Cgc5iTlM.js.br +0 -0
  132. package/build/client/_app/immutable/nodes/6.Cgc5iTlM.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/7.BXKvUopV.js +0 -4
  134. package/build/client/_app/immutable/nodes/7.BXKvUopV.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/7.BXKvUopV.js.gz +0 -0
  136. package/build/client/_app/immutable/nodes/8.Df0leW0d.js +0 -2
  137. package/build/client/_app/immutable/nodes/8.Df0leW0d.js.br +0 -0
  138. package/build/client/_app/immutable/nodes/8.Df0leW0d.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/9.C4-N3geF.js +0 -2
  140. package/build/client/_app/immutable/nodes/9.C4-N3geF.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/9.C4-N3geF.js.gz +0 -0
  142. package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +0 -1
  143. package/build/server/chunks/_server.ts-2ixC-X3K.js.map +0 -1
  144. package/build/server/chunks/_server.ts-40c_epk8.js.map +0 -1
  145. package/build/server/chunks/_server.ts-BuYyCrnF.js.map +0 -1
  146. package/build/server/chunks/_server.ts-ByPExYfO.js.map +0 -1
  147. package/build/server/chunks/_server.ts-CilRds58.js.map +0 -1
  148. package/build/server/chunks/_server.ts-CjpQ10xh.js.map +0 -1
  149. package/build/server/chunks/opencode-db-path-DcfhJtJy.js +0 -15
  150. package/build/server/chunks/opencode-db-path-DcfhJtJy.js.map +0 -1
  151. package/build/server/chunks/pty-manager-TyMUpDA9.js.map +0 -1
@@ -0,0 +1,402 @@
1
+ import * as crypto from 'crypto';
2
+ import * as fs from 'fs';
3
+ import { homedir } from 'os';
4
+ import * as path from 'path';
5
+
6
+ class TurnBuilder {
7
+ current = null;
8
+ messages = [];
9
+ /** Messages flushed so far (excludes the still-open run). */
10
+ completed() {
11
+ return this.messages;
12
+ }
13
+ flush() {
14
+ if (this.current && this.current.parts.length > 0) {
15
+ this.messages.push({
16
+ id: `codex-${this.messages.length}`,
17
+ parts: this.current.parts,
18
+ role: this.current.role,
19
+ timestamp: this.current.timestamp
20
+ });
21
+ }
22
+ this.current = null;
23
+ }
24
+ push(role, part, timestamp) {
25
+ const category = role === "user" ? "user" : part.type === "tool_result" ? "system" : "assistant";
26
+ const messageRole = category === "system" ? "system" : role;
27
+ if (this.current?.category !== category) {
28
+ this.flush();
29
+ this.current = { category, parts: [], role: messageRole, timestamp };
30
+ }
31
+ this.current.parts.push(part);
32
+ }
33
+ result() {
34
+ this.flush();
35
+ return this.messages;
36
+ }
37
+ }
38
+ function parseCodexMeta(line) {
39
+ try {
40
+ const entry = JSON.parse(line);
41
+ if (!isRecord(entry) || entry.type !== "session_meta" || !isRecord(entry.payload)) {
42
+ return null;
43
+ }
44
+ const p = entry.payload;
45
+ if (!str(p, "id") || !str(p, "cwd")) {
46
+ return null;
47
+ }
48
+ return {
49
+ cliVersion: str(p, "cli_version"),
50
+ cwd: str(p, "cwd"),
51
+ id: str(p, "id"),
52
+ model: str(p, "model") || str(p, "model_provider"),
53
+ startedAt: str(p, "timestamp") || str(entry, "timestamp")
54
+ };
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+ function parseCodexRollout(text) {
60
+ const builder = new TurnBuilder();
61
+ let meta = null;
62
+ for (const line of text.split("\n")) {
63
+ const trimmed = line.trim();
64
+ if (!trimmed) {
65
+ continue;
66
+ }
67
+ let entry;
68
+ try {
69
+ entry = JSON.parse(trimmed);
70
+ } catch {
71
+ continue;
72
+ }
73
+ if (!isRecord(entry)) {
74
+ continue;
75
+ }
76
+ const ts = str(entry, "timestamp");
77
+ if (entry.type === "session_meta") {
78
+ meta = parseCodexMeta(trimmed);
79
+ continue;
80
+ }
81
+ if (entry.type !== "response_item" || !isRecord(entry.payload)) {
82
+ continue;
83
+ }
84
+ const mapped = responseItemToPart(entry.payload);
85
+ if (mapped) {
86
+ builder.push(mapped.role, mapped.part, ts);
87
+ }
88
+ }
89
+ return { messages: builder.result(), meta };
90
+ }
91
+ function isRecord(value) {
92
+ return typeof value === "object" && value !== null && !Array.isArray(value);
93
+ }
94
+ function joinMessageText(content) {
95
+ if (!Array.isArray(content)) {
96
+ return typeof content === "string" ? content : "";
97
+ }
98
+ return content.filter((c) => isRecord(c)).filter((c) => c.type === "input_text" || c.type === "output_text" || c.type === "text").map((c) => str(c, "text")).join("\n").trim();
99
+ }
100
+ function parseToolInput(raw) {
101
+ if (isRecord(raw)) {
102
+ return raw;
103
+ }
104
+ if (typeof raw === "string") {
105
+ try {
106
+ const parsed = JSON.parse(raw);
107
+ return isRecord(parsed) ? parsed : { raw };
108
+ } catch {
109
+ return { raw };
110
+ }
111
+ }
112
+ return {};
113
+ }
114
+ function reasoningText(payload) {
115
+ const summary = payload.summary;
116
+ if (Array.isArray(summary) && summary.length > 0) {
117
+ const text = summary.map((s) => typeof s === "string" ? s : isRecord(s) ? str(s, "text") : "").join("\n").trim();
118
+ if (text) {
119
+ return text;
120
+ }
121
+ }
122
+ return typeof payload.content === "string" ? payload.content.trim() : "";
123
+ }
124
+ function responseItemToPart(p) {
125
+ switch (p.type) {
126
+ case "custom_tool_call":
127
+ case "function_call": {
128
+ const args = p.type === "function_call" ? p.arguments : p.input;
129
+ return {
130
+ part: {
131
+ id: str(p, "call_id"),
132
+ input: parseToolInput(args),
133
+ toolName: str(p, "name") || "tool",
134
+ type: "tool_use"
135
+ },
136
+ role: "assistant"
137
+ };
138
+ }
139
+ case "custom_tool_call_output":
140
+ case "function_call_output":
141
+ case "tool_search_output": {
142
+ const output = typeof p.output === "string" ? p.output : JSON.stringify(p.output ?? "");
143
+ return {
144
+ part: {
145
+ isError: /exit code:\s*[1-9]/i.test(output),
146
+ output: output.slice(0, 2e3),
147
+ toolUseId: str(p, "call_id"),
148
+ type: "tool_result"
149
+ },
150
+ role: "assistant"
151
+ };
152
+ }
153
+ case "message": {
154
+ if (p.role === "developer") {
155
+ return null;
156
+ }
157
+ const content = joinMessageText(p.content);
158
+ return content ? { part: { content, type: "text" }, role: p.role === "user" ? "user" : "assistant" } : null;
159
+ }
160
+ case "reasoning": {
161
+ const think = reasoningText(p);
162
+ return think ? { part: { content: think, type: "thinking" }, role: "assistant" } : null;
163
+ }
164
+ case "tool_search_call":
165
+ case "web_search_call":
166
+ return {
167
+ part: {
168
+ id: str(p, "call_id"),
169
+ input: parseToolInput(p.action ?? p.query),
170
+ toolName: str(p, "type"),
171
+ type: "tool_use"
172
+ },
173
+ role: "assistant"
174
+ };
175
+ default:
176
+ return null;
177
+ }
178
+ }
179
+ function str(obj, key) {
180
+ const v = obj[key];
181
+ return typeof v === "string" ? v : "";
182
+ }
183
+ const LIST_PREFIX_BYTES = 256 * 1024;
184
+ const MAX_FULL_READ_BYTES = 16 * 1024 * 1024;
185
+ const APPROX_BYTES_PER_MESSAGE = 3e3;
186
+ const SYNTHETIC_PROMPT_PREFIXES = ["<environment_context>", "<user_instructions>", "<permissions"];
187
+ function detectActiveCodexSessions(thresholdMs) {
188
+ const cutoff = Date.now() - thresholdMs;
189
+ const out = [];
190
+ for (const filePath of collectRolloutFiles()) {
191
+ try {
192
+ const stat = fs.statSync(filePath);
193
+ if (stat.mtimeMs < cutoff) {
194
+ continue;
195
+ }
196
+ const meta = parseCodexMeta(readPrefix(filePath).split("\n")[0] ?? "");
197
+ if (meta) {
198
+ out.push({ cwd: meta.cwd, id: meta.id, startedAt: stat.birthtimeMs });
199
+ }
200
+ } catch {
201
+ }
202
+ }
203
+ return out;
204
+ }
205
+ function findCodexRolloutForCwd(cwd, sinceMs) {
206
+ let best = null;
207
+ for (const filePath of collectRolloutFiles()) {
208
+ try {
209
+ const stat = fs.statSync(filePath);
210
+ if (stat.birthtimeMs <= sinceMs) {
211
+ continue;
212
+ }
213
+ const meta = parseCodexMeta(readPrefix(filePath).split("\n")[0] ?? "");
214
+ if (meta?.cwd === cwd && (!best || stat.birthtimeMs > best.birthtime)) {
215
+ best = { birthtime: stat.birthtimeMs, path: filePath };
216
+ }
217
+ } catch {
218
+ }
219
+ }
220
+ return best?.path ?? null;
221
+ }
222
+ function getCodexConversation(sessionId, offset = 0, limit = 200) {
223
+ const filePath = findRolloutPath(sessionId);
224
+ if (!filePath || !fs.existsSync(filePath)) {
225
+ return [];
226
+ }
227
+ try {
228
+ const { messages } = parseCodexRollout(readRolloutText(filePath));
229
+ if (offset === 0 && messages.length > limit) {
230
+ let startIdx = messages.length - limit;
231
+ while (startIdx > 0 && messages[startIdx].role !== "user") {
232
+ startIdx--;
233
+ }
234
+ return messages.slice(startIdx);
235
+ }
236
+ return messages.slice(offset, offset + limit);
237
+ } catch (error) {
238
+ console.error("[codex] Failed to read conversation:", error);
239
+ return [];
240
+ }
241
+ }
242
+ function listCodexProjects() {
243
+ const files = collectRolloutFiles();
244
+ const byCwd = /* @__PURE__ */ new Map();
245
+ for (const filePath of files) {
246
+ let stat;
247
+ try {
248
+ stat = fs.statSync(filePath);
249
+ } catch {
250
+ continue;
251
+ }
252
+ let prefix;
253
+ try {
254
+ prefix = readPrefix(filePath);
255
+ } catch {
256
+ continue;
257
+ }
258
+ const firstLine = prefix.slice(0, Math.max(0, prefix.indexOf("\n")) || prefix.length);
259
+ const meta = parseCodexMeta(firstLine);
260
+ if (!meta) {
261
+ continue;
262
+ }
263
+ const session = {
264
+ created: meta.startedAt || stat.birthtime.toISOString(),
265
+ gitBranch: "",
266
+ id: meta.id,
267
+ messageCount: Math.max(1, Math.round(stat.size / APPROX_BYTES_PER_MESSAGE)),
268
+ modified: stat.mtime.toISOString(),
269
+ projectPath: meta.cwd,
270
+ source: "codex",
271
+ summary: "",
272
+ title: cleanTitle(firstUserPrompt(prefix))
273
+ };
274
+ const bucket = byCwd.get(meta.cwd);
275
+ if (bucket) {
276
+ bucket.push(session);
277
+ } else {
278
+ byCwd.set(meta.cwd, [session]);
279
+ }
280
+ }
281
+ const projects = [];
282
+ for (const [cwd, sessions] of byCwd) {
283
+ sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());
284
+ const segments = cwd.split("/").filter(Boolean);
285
+ projects.push({
286
+ fullPath: cwd,
287
+ id: shortHash(cwd),
288
+ lastModified: sessions[0]?.modified ?? "",
289
+ name: segments.slice(-2).join("/"),
290
+ sessionCount: sessions.length,
291
+ sessions
292
+ });
293
+ }
294
+ return projects.sort(
295
+ (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()
296
+ );
297
+ }
298
+ function cleanTitle(prompt) {
299
+ const firstLine = prompt.replace(/\s+/g, " ").trim().split("\n")[0]?.trim() ?? "";
300
+ if (!firstLine) {
301
+ return "Untitled Session";
302
+ }
303
+ return firstLine.length > 80 ? `${firstLine.slice(0, 77)}...` : firstLine;
304
+ }
305
+ function codexSessionsDirs() {
306
+ const home = homedir();
307
+ return [path.join(home, ".codex", "sessions"), path.join(home, ".codex", "archived_sessions")];
308
+ }
309
+ function collectRolloutFiles() {
310
+ const out = [];
311
+ const walk = (dir) => {
312
+ let entries;
313
+ try {
314
+ entries = fs.readdirSync(dir, { withFileTypes: true });
315
+ } catch {
316
+ return;
317
+ }
318
+ for (const entry of entries) {
319
+ const full = path.join(dir, entry.name);
320
+ if (entry.isDirectory()) {
321
+ walk(full);
322
+ } else if (entry.name.startsWith("rollout-") && entry.name.endsWith(".jsonl")) {
323
+ out.push(full);
324
+ }
325
+ }
326
+ };
327
+ for (const root of codexSessionsDirs()) {
328
+ walk(root);
329
+ }
330
+ return out;
331
+ }
332
+ function findRolloutPath(sessionId) {
333
+ if (!/^[0-9a-f-]+$/i.test(sessionId)) {
334
+ return null;
335
+ }
336
+ const suffix = `-${sessionId}.jsonl`;
337
+ return collectRolloutFiles().find((p) => path.basename(p).endsWith(suffix)) ?? null;
338
+ }
339
+ function firstUserPrompt(prefixText) {
340
+ for (const line of prefixText.split("\n")) {
341
+ const trimmed = line.trim();
342
+ if (!trimmed || !trimmed.includes('"type":"message"') || !trimmed.includes('"role":"user"')) {
343
+ continue;
344
+ }
345
+ try {
346
+ const entry = JSON.parse(trimmed);
347
+ const text = (entry.payload?.content ?? []).filter((c) => c.type === "input_text" && typeof c.text === "string").map((c) => c.text ?? "").join("\n").trim();
348
+ if (text && !SYNTHETIC_PROMPT_PREFIXES.some((p) => text.startsWith(p))) {
349
+ return text;
350
+ }
351
+ } catch {
352
+ continue;
353
+ }
354
+ }
355
+ return "";
356
+ }
357
+ function readPrefix(filePath) {
358
+ const fd = fs.openSync(filePath, "r");
359
+ try {
360
+ const buf = Buffer.alloc(LIST_PREFIX_BYTES);
361
+ const bytesRead = fs.readSync(fd, buf, 0, LIST_PREFIX_BYTES, 0);
362
+ const text = buf.toString("utf-8", 0, bytesRead);
363
+ const lastNl = text.lastIndexOf("\n");
364
+ return lastNl === -1 ? text : text.slice(0, lastNl);
365
+ } finally {
366
+ fs.closeSync(fd);
367
+ }
368
+ }
369
+ function readRolloutText(filePath) {
370
+ const stat = fs.statSync(filePath);
371
+ if (stat.size <= MAX_FULL_READ_BYTES) {
372
+ return fs.readFileSync(filePath, "utf-8");
373
+ }
374
+ const head = readPrefix(filePath).split("\n")[0] ?? "";
375
+ const fd = fs.openSync(filePath, "r");
376
+ try {
377
+ const start = stat.size - MAX_FULL_READ_BYTES;
378
+ const buf = Buffer.alloc(MAX_FULL_READ_BYTES);
379
+ const bytesRead = fs.readSync(fd, buf, 0, MAX_FULL_READ_BYTES, start);
380
+ const tail = buf.toString("utf-8", 0, bytesRead);
381
+ return `${head}
382
+ ${tail.slice(tail.indexOf("\n") + 1)}`;
383
+ } finally {
384
+ fs.closeSync(fd);
385
+ }
386
+ }
387
+ function shortHash(input) {
388
+ return crypto.createHash("sha256").update(input).digest("hex").slice(0, 8);
389
+ }
390
+ function resolveOpenCodeDbPath() {
391
+ const home = process.env.HOME || "";
392
+ if (process.env.XDG_DATA_HOME) {
393
+ return path.join(process.env.XDG_DATA_HOME, "opencode", "opencode.db");
394
+ }
395
+ if (process.platform === "darwin") {
396
+ return path.join(home, "Library", "Application Support", "opencode", "opencode.db");
397
+ }
398
+ return path.join(home, ".local", "share", "opencode", "opencode.db");
399
+ }
400
+
401
+ export { detectActiveCodexSessions as d, findCodexRolloutForCwd as f, getCodexConversation as g, listCodexProjects as l, resolveOpenCodeDbPath as r };
402
+ //# sourceMappingURL=opencode-db-path-CRgzBK5U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-db-path-CRgzBK5U.js","sources":["../../../.svelte-kit/adapter-node/chunks/opencode-db-path.js"],"sourcesContent":["import * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport { homedir } from \"os\";\nimport * as path from \"path\";\nclass TurnBuilder {\n current = null;\n messages = [];\n /** Messages flushed so far (excludes the still-open run). */\n completed() {\n return this.messages;\n }\n flush() {\n if (this.current && this.current.parts.length > 0) {\n this.messages.push({\n id: `codex-${this.messages.length}`,\n parts: this.current.parts,\n role: this.current.role,\n timestamp: this.current.timestamp\n });\n }\n this.current = null;\n }\n push(role, part, timestamp) {\n const category = role === \"user\" ? \"user\" : part.type === \"tool_result\" ? \"system\" : \"assistant\";\n const messageRole = category === \"system\" ? \"system\" : role;\n if (this.current?.category !== category) {\n this.flush();\n this.current = { category, parts: [], role: messageRole, timestamp };\n }\n this.current.parts.push(part);\n }\n result() {\n this.flush();\n return this.messages;\n }\n}\nfunction parseCodexMeta(line) {\n try {\n const entry = JSON.parse(line);\n if (!isRecord(entry) || entry.type !== \"session_meta\" || !isRecord(entry.payload)) {\n return null;\n }\n const p = entry.payload;\n if (!str(p, \"id\") || !str(p, \"cwd\")) {\n return null;\n }\n return {\n cliVersion: str(p, \"cli_version\"),\n cwd: str(p, \"cwd\"),\n id: str(p, \"id\"),\n model: str(p, \"model\") || str(p, \"model_provider\"),\n startedAt: str(p, \"timestamp\") || str(entry, \"timestamp\")\n };\n } catch {\n return null;\n }\n}\nfunction parseCodexRollout(text) {\n const builder = new TurnBuilder();\n let meta = null;\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n let entry;\n try {\n entry = JSON.parse(trimmed);\n } catch {\n continue;\n }\n if (!isRecord(entry)) {\n continue;\n }\n const ts = str(entry, \"timestamp\");\n if (entry.type === \"session_meta\") {\n meta = parseCodexMeta(trimmed);\n continue;\n }\n if (entry.type !== \"response_item\" || !isRecord(entry.payload)) {\n continue;\n }\n const mapped = responseItemToPart(entry.payload);\n if (mapped) {\n builder.push(mapped.role, mapped.part, ts);\n }\n }\n return { messages: builder.result(), meta };\n}\nfunction isRecord(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction joinMessageText(content) {\n if (!Array.isArray(content)) {\n return typeof content === \"string\" ? content : \"\";\n }\n return content.filter((c) => isRecord(c)).filter((c) => c.type === \"input_text\" || c.type === \"output_text\" || c.type === \"text\").map((c) => str(c, \"text\")).join(\"\\n\").trim();\n}\nfunction parseToolInput(raw) {\n if (isRecord(raw)) {\n return raw;\n }\n if (typeof raw === \"string\") {\n try {\n const parsed = JSON.parse(raw);\n return isRecord(parsed) ? parsed : { raw };\n } catch {\n return { raw };\n }\n }\n return {};\n}\nfunction reasoningText(payload) {\n const summary = payload.summary;\n if (Array.isArray(summary) && summary.length > 0) {\n const text = summary.map((s) => typeof s === \"string\" ? s : isRecord(s) ? str(s, \"text\") : \"\").join(\"\\n\").trim();\n if (text) {\n return text;\n }\n }\n return typeof payload.content === \"string\" ? payload.content.trim() : \"\";\n}\nfunction responseItemToPart(p) {\n switch (p.type) {\n case \"custom_tool_call\":\n case \"function_call\": {\n const args = p.type === \"function_call\" ? p.arguments : p.input;\n return {\n part: {\n id: str(p, \"call_id\"),\n input: parseToolInput(args),\n toolName: str(p, \"name\") || \"tool\",\n type: \"tool_use\"\n },\n role: \"assistant\"\n };\n }\n case \"custom_tool_call_output\":\n case \"function_call_output\":\n case \"tool_search_output\": {\n const output = typeof p.output === \"string\" ? p.output : JSON.stringify(p.output ?? \"\");\n return {\n part: {\n isError: /exit code:\\s*[1-9]/i.test(output),\n output: output.slice(0, 2e3),\n toolUseId: str(p, \"call_id\"),\n type: \"tool_result\"\n },\n role: \"assistant\"\n };\n }\n case \"message\": {\n if (p.role === \"developer\") {\n return null;\n }\n const content = joinMessageText(p.content);\n return content ? { part: { content, type: \"text\" }, role: p.role === \"user\" ? \"user\" : \"assistant\" } : null;\n }\n case \"reasoning\": {\n const think = reasoningText(p);\n return think ? { part: { content: think, type: \"thinking\" }, role: \"assistant\" } : null;\n }\n case \"tool_search_call\":\n case \"web_search_call\":\n return {\n part: {\n id: str(p, \"call_id\"),\n input: parseToolInput(p.action ?? p.query),\n toolName: str(p, \"type\"),\n type: \"tool_use\"\n },\n role: \"assistant\"\n };\n default:\n return null;\n }\n}\nfunction str(obj, key) {\n const v = obj[key];\n return typeof v === \"string\" ? v : \"\";\n}\nconst LIST_PREFIX_BYTES = 256 * 1024;\nconst MAX_FULL_READ_BYTES = 16 * 1024 * 1024;\nconst APPROX_BYTES_PER_MESSAGE = 3e3;\nconst SYNTHETIC_PROMPT_PREFIXES = [\"<environment_context>\", \"<user_instructions>\", \"<permissions\"];\nfunction detectActiveCodexSessions(thresholdMs) {\n const cutoff = Date.now() - thresholdMs;\n const out = [];\n for (const filePath of collectRolloutFiles()) {\n try {\n const stat = fs.statSync(filePath);\n if (stat.mtimeMs < cutoff) {\n continue;\n }\n const meta = parseCodexMeta(readPrefix(filePath).split(\"\\n\")[0] ?? \"\");\n if (meta) {\n out.push({ cwd: meta.cwd, id: meta.id, startedAt: stat.birthtimeMs });\n }\n } catch {\n }\n }\n return out;\n}\nfunction findCodexRolloutForCwd(cwd, sinceMs) {\n let best = null;\n for (const filePath of collectRolloutFiles()) {\n try {\n const stat = fs.statSync(filePath);\n if (stat.birthtimeMs <= sinceMs) {\n continue;\n }\n const meta = parseCodexMeta(readPrefix(filePath).split(\"\\n\")[0] ?? \"\");\n if (meta?.cwd === cwd && (!best || stat.birthtimeMs > best.birthtime)) {\n best = { birthtime: stat.birthtimeMs, path: filePath };\n }\n } catch {\n }\n }\n return best?.path ?? null;\n}\nfunction getCodexConversation(sessionId, offset = 0, limit = 200) {\n const filePath = findRolloutPath(sessionId);\n if (!filePath || !fs.existsSync(filePath)) {\n return [];\n }\n try {\n const { messages } = parseCodexRollout(readRolloutText(filePath));\n if (offset === 0 && messages.length > limit) {\n let startIdx = messages.length - limit;\n while (startIdx > 0 && messages[startIdx].role !== \"user\") {\n startIdx--;\n }\n return messages.slice(startIdx);\n }\n return messages.slice(offset, offset + limit);\n } catch (error) {\n console.error(\"[codex] Failed to read conversation:\", error);\n return [];\n }\n}\nfunction listCodexProjects() {\n const files = collectRolloutFiles();\n const byCwd = /* @__PURE__ */ new Map();\n for (const filePath of files) {\n let stat;\n try {\n stat = fs.statSync(filePath);\n } catch {\n continue;\n }\n let prefix;\n try {\n prefix = readPrefix(filePath);\n } catch {\n continue;\n }\n const firstLine = prefix.slice(0, Math.max(0, prefix.indexOf(\"\\n\")) || prefix.length);\n const meta = parseCodexMeta(firstLine);\n if (!meta) {\n continue;\n }\n const session = {\n created: meta.startedAt || stat.birthtime.toISOString(),\n gitBranch: \"\",\n id: meta.id,\n messageCount: Math.max(1, Math.round(stat.size / APPROX_BYTES_PER_MESSAGE)),\n modified: stat.mtime.toISOString(),\n projectPath: meta.cwd,\n source: \"codex\",\n summary: \"\",\n title: cleanTitle(firstUserPrompt(prefix))\n };\n const bucket = byCwd.get(meta.cwd);\n if (bucket) {\n bucket.push(session);\n } else {\n byCwd.set(meta.cwd, [session]);\n }\n }\n const projects = [];\n for (const [cwd, sessions] of byCwd) {\n sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n const segments = cwd.split(\"/\").filter(Boolean);\n projects.push({\n fullPath: cwd,\n id: shortHash(cwd),\n lastModified: sessions[0]?.modified ?? \"\",\n name: segments.slice(-2).join(\"/\"),\n sessionCount: sessions.length,\n sessions\n });\n }\n return projects.sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n}\nfunction cleanTitle(prompt) {\n const firstLine = prompt.replace(/\\s+/g, \" \").trim().split(\"\\n\")[0]?.trim() ?? \"\";\n if (!firstLine) {\n return \"Untitled Session\";\n }\n return firstLine.length > 80 ? `${firstLine.slice(0, 77)}...` : firstLine;\n}\nfunction codexSessionsDirs() {\n const home = homedir();\n return [path.join(home, \".codex\", \"sessions\"), path.join(home, \".codex\", \"archived_sessions\")];\n}\nfunction collectRolloutFiles() {\n const out = [];\n const walk = (dir) => {\n let entries;\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (entry.name.startsWith(\"rollout-\") && entry.name.endsWith(\".jsonl\")) {\n out.push(full);\n }\n }\n };\n for (const root of codexSessionsDirs()) {\n walk(root);\n }\n return out;\n}\nfunction findRolloutPath(sessionId) {\n if (!/^[0-9a-f-]+$/i.test(sessionId)) {\n return null;\n }\n const suffix = `-${sessionId}.jsonl`;\n return collectRolloutFiles().find((p) => path.basename(p).endsWith(suffix)) ?? null;\n}\nfunction firstUserPrompt(prefixText) {\n for (const line of prefixText.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.includes('\"type\":\"message\"') || !trimmed.includes('\"role\":\"user\"')) {\n continue;\n }\n try {\n const entry = JSON.parse(trimmed);\n const text = (entry.payload?.content ?? []).filter((c) => c.type === \"input_text\" && typeof c.text === \"string\").map((c) => c.text ?? \"\").join(\"\\n\").trim();\n if (text && !SYNTHETIC_PROMPT_PREFIXES.some((p) => text.startsWith(p))) {\n return text;\n }\n } catch {\n continue;\n }\n }\n return \"\";\n}\nfunction readPrefix(filePath) {\n const fd = fs.openSync(filePath, \"r\");\n try {\n const buf = Buffer.alloc(LIST_PREFIX_BYTES);\n const bytesRead = fs.readSync(fd, buf, 0, LIST_PREFIX_BYTES, 0);\n const text = buf.toString(\"utf-8\", 0, bytesRead);\n const lastNl = text.lastIndexOf(\"\\n\");\n return lastNl === -1 ? text : text.slice(0, lastNl);\n } finally {\n fs.closeSync(fd);\n }\n}\nfunction readRolloutText(filePath) {\n const stat = fs.statSync(filePath);\n if (stat.size <= MAX_FULL_READ_BYTES) {\n return fs.readFileSync(filePath, \"utf-8\");\n }\n const head = readPrefix(filePath).split(\"\\n\")[0] ?? \"\";\n const fd = fs.openSync(filePath, \"r\");\n try {\n const start = stat.size - MAX_FULL_READ_BYTES;\n const buf = Buffer.alloc(MAX_FULL_READ_BYTES);\n const bytesRead = fs.readSync(fd, buf, 0, MAX_FULL_READ_BYTES, start);\n const tail = buf.toString(\"utf-8\", 0, bytesRead);\n return `${head}\n${tail.slice(tail.indexOf(\"\\n\") + 1)}`;\n } finally {\n fs.closeSync(fd);\n }\n}\nfunction shortHash(input) {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\").slice(0, 8);\n}\nfunction resolveOpenCodeDbPath() {\n const home = process.env.HOME || \"\";\n if (process.env.XDG_DATA_HOME) {\n return path.join(process.env.XDG_DATA_HOME, \"opencode\", \"opencode.db\");\n }\n if (process.platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"opencode\", \"opencode.db\");\n }\n return path.join(home, \".local\", \"share\", \"opencode\", \"opencode.db\");\n}\nexport {\n detectActiveCodexSessions as d,\n findCodexRolloutForCwd as f,\n getCodexConversation as g,\n listCodexProjects as l,\n resolveOpenCodeDbPath as r\n};\n"],"names":[],"mappings":"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"}
@@ -5,10 +5,10 @@ import { existsSync, readFileSync, unlinkSync, readdirSync, statSync } from 'fs'
5
5
  import * as path from 'path';
6
6
  import path__default from 'path';
7
7
  import { fileURLToPath } from 'url';
8
+ import { f as findCodexRolloutForCwd, r as resolveOpenCodeDbPath } from './opencode-db-path-CRgzBK5U.js';
8
9
  import { b as broadcastEvent } from './events-handler-Dm1mNPQP.js';
9
10
  import * as net from 'net';
10
11
  import Database from 'better-sqlite3';
11
- import { r as resolveOpenCodeDbPath } from './opencode-db-path-DcfhJtJy.js';
12
12
 
13
13
  class HolderClient {
14
14
  connected = false;
@@ -1493,6 +1493,39 @@ class PtyManager {
1493
1493
  5 * 60 * 1e3
1494
1494
  );
1495
1495
  }
1496
+ if (command === "codex") {
1497
+ const launchTime = terminal.createdAt.getTime();
1498
+ terminal.pollTimer = setInterval(() => {
1499
+ if (terminal.status === "exited" || terminal.sessionFile) {
1500
+ if (terminal.pollTimer) {
1501
+ clearInterval(terminal.pollTimer);
1502
+ terminal.pollTimer = null;
1503
+ }
1504
+ return;
1505
+ }
1506
+ try {
1507
+ const rollout = findCodexRolloutForCwd(cwd, launchTime);
1508
+ if (rollout) {
1509
+ terminal.sessionFile = rollout;
1510
+ if (terminal.pollTimer) {
1511
+ clearInterval(terminal.pollTimer);
1512
+ terminal.pollTimer = null;
1513
+ }
1514
+ terminalStore.update(id, { sessionFile: rollout });
1515
+ }
1516
+ } catch {
1517
+ }
1518
+ }, 1500);
1519
+ setTimeout(
1520
+ () => {
1521
+ if (terminal.pollTimer) {
1522
+ clearInterval(terminal.pollTimer);
1523
+ terminal.pollTimer = null;
1524
+ }
1525
+ },
1526
+ 5 * 60 * 1e3
1527
+ );
1528
+ }
1496
1529
  }
1497
1530
  /** Wire up all HolderClient callbacks (activity, CWD, output, exit, disconnect). */
1498
1531
  wireHolderCallbacks(client, terminal) {
@@ -1555,4 +1588,4 @@ const ptyManager = globalThis[PTY_GLOBAL_KEY] || new PtyManager();
1555
1588
  globalThis[PTY_GLOBAL_KEY] = ptyManager;
1556
1589
 
1557
1590
  export { ptyManager as p };
1558
- //# sourceMappingURL=pty-manager-TyMUpDA9.js.map
1591
+ //# sourceMappingURL=pty-manager-aFpChJah.js.map