@foothill/agent-move 1.0.8 → 1.0.10

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 (122) hide show
  1. package/README.md +46 -9
  2. package/package.json +2 -1
  3. package/packages/client/dist/assets/{BufferResource-Ddjob236.js → BufferResource-Dfd5uHKt.js} +1 -1
  4. package/packages/client/dist/assets/{CanvasRenderer-B0w6SYyW.js → CanvasRenderer-7Cv6xZVP.js} +1 -1
  5. package/packages/client/dist/assets/{Filter-NcMGuiK-.js → Filter-CBX7EB7j.js} +1 -1
  6. package/packages/client/dist/assets/{RenderTargetSystem-DgAzY5_U.js → RenderTargetSystem-ko-v73NG.js} +1 -1
  7. package/packages/client/dist/assets/{WebGLRenderer-DUWXDPIX.js → WebGLRenderer-vhPQEPUG.js} +1 -1
  8. package/packages/client/dist/assets/{WebGPURenderer-C1HbrllR.js → WebGPURenderer-Dwywvwqe.js} +1 -1
  9. package/packages/client/dist/assets/{browserAll-CaF1Fl0O.js → browserAll-QyCAT8_K.js} +1 -1
  10. package/packages/client/dist/assets/index-BPJtz4FL.js +722 -0
  11. package/packages/client/dist/assets/{webworkerAll-BJ6UhC7r.js → webworkerAll-hM-gNP7L.js} +1 -1
  12. package/packages/client/dist/index.html +1 -1
  13. package/packages/server/dist/config.d.ts +4 -0
  14. package/packages/server/dist/config.d.ts.map +1 -1
  15. package/packages/server/dist/config.js +5 -5
  16. package/packages/server/dist/config.js.map +1 -1
  17. package/packages/server/dist/hooks/hook-event-manager.js +0 -4
  18. package/packages/server/dist/hooks/hook-installer.js +0 -4
  19. package/packages/server/dist/index.d.ts.map +1 -1
  20. package/packages/server/dist/index.js +792 -856
  21. package/packages/server/dist/index.js.map +1 -1
  22. package/packages/server/dist/routes/api.js +0 -4
  23. package/packages/server/dist/state/activity-processor.d.ts +1 -1
  24. package/packages/server/dist/state/activity-processor.d.ts.map +1 -1
  25. package/packages/server/dist/state/activity-processor.js +1 -5
  26. package/packages/server/dist/state/activity-processor.js.map +1 -1
  27. package/packages/server/dist/state/agent-state-manager.d.ts +1 -2
  28. package/packages/server/dist/state/agent-state-manager.d.ts.map +1 -1
  29. package/packages/server/dist/state/agent-state-manager.js +87 -6
  30. package/packages/server/dist/state/agent-state-manager.js.map +1 -1
  31. package/packages/server/dist/state/anomaly-detector.js +0 -4
  32. package/packages/server/dist/state/identity-manager.js +0 -4
  33. package/packages/server/dist/state/role-resolver.d.ts +1 -2
  34. package/packages/server/dist/state/role-resolver.d.ts.map +1 -1
  35. package/packages/server/dist/state/role-resolver.js +0 -4
  36. package/packages/server/dist/state/role-resolver.js.map +1 -1
  37. package/packages/server/dist/state/task-graph-manager.d.ts +12 -0
  38. package/packages/server/dist/state/task-graph-manager.d.ts.map +1 -1
  39. package/packages/server/dist/state/task-graph-manager.js +80 -4
  40. package/packages/server/dist/state/task-graph-manager.js.map +1 -1
  41. package/packages/server/dist/state/tool-chain-tracker.js +0 -4
  42. package/packages/server/dist/watcher/agent-watcher.js +0 -5
  43. package/packages/server/dist/watcher/claude/claude-paths.d.ts +18 -0
  44. package/packages/server/dist/watcher/claude/claude-paths.d.ts.map +1 -0
  45. package/packages/server/dist/watcher/{claude-paths.js → claude/claude-paths.js} +47 -59
  46. package/packages/server/dist/watcher/claude/claude-paths.js.map +1 -0
  47. package/packages/server/dist/watcher/{file-watcher.d.ts → claude/claude-watcher.d.ts} +3 -3
  48. package/packages/server/dist/watcher/claude/claude-watcher.d.ts.map +1 -0
  49. package/packages/server/dist/watcher/{file-watcher.js → claude/claude-watcher.js} +59 -69
  50. package/packages/server/dist/watcher/claude/claude-watcher.js.map +1 -0
  51. package/packages/server/dist/watcher/claude/jsonl-parser.d.ts +6 -0
  52. package/packages/server/dist/watcher/claude/jsonl-parser.d.ts.map +1 -0
  53. package/packages/server/dist/watcher/{jsonl-parser.js → claude/jsonl-parser.js} +1 -5
  54. package/packages/server/dist/watcher/claude/jsonl-parser.js.map +1 -0
  55. package/packages/server/dist/watcher/codex/codex-parser.d.ts +30 -0
  56. package/packages/server/dist/watcher/codex/codex-parser.d.ts.map +1 -0
  57. package/packages/server/dist/watcher/codex/codex-parser.js +326 -0
  58. package/packages/server/dist/watcher/codex/codex-parser.js.map +1 -0
  59. package/packages/server/dist/watcher/codex/codex-paths.d.ts +35 -0
  60. package/packages/server/dist/watcher/codex/codex-paths.d.ts.map +1 -0
  61. package/packages/server/dist/watcher/codex/codex-paths.js +46 -0
  62. package/packages/server/dist/watcher/codex/codex-paths.js.map +1 -0
  63. package/packages/server/dist/watcher/codex/codex-watcher.d.ts +42 -0
  64. package/packages/server/dist/watcher/codex/codex-watcher.d.ts.map +1 -0
  65. package/packages/server/dist/watcher/codex/codex-watcher.js +577 -0
  66. package/packages/server/dist/watcher/codex/codex-watcher.js.map +1 -0
  67. package/packages/server/dist/watcher/git-info.js +0 -4
  68. package/packages/server/dist/watcher/opencode/opencode-parser.d.ts +1 -1
  69. package/packages/server/dist/watcher/opencode/opencode-parser.d.ts.map +1 -1
  70. package/packages/server/dist/watcher/opencode/opencode-parser.js +31 -6
  71. package/packages/server/dist/watcher/opencode/opencode-paths.d.ts +1 -1
  72. package/packages/server/dist/watcher/opencode/opencode-paths.d.ts.map +1 -1
  73. package/packages/server/dist/watcher/opencode/opencode-paths.js +1 -4
  74. package/packages/server/dist/watcher/opencode/opencode-paths.js.map +1 -1
  75. package/packages/server/dist/watcher/opencode/opencode-watcher.d.ts.map +1 -1
  76. package/packages/server/dist/watcher/opencode/opencode-watcher.js +50 -789
  77. package/packages/server/dist/watcher/opencode/opencode-watcher.js.map +1 -1
  78. package/packages/server/dist/watcher/path-utils.d.ts +10 -0
  79. package/packages/server/dist/watcher/path-utils.d.ts.map +1 -0
  80. package/packages/server/dist/watcher/path-utils.js +38 -0
  81. package/packages/server/dist/watcher/path-utils.js.map +1 -0
  82. package/packages/server/dist/watcher/pi/pi-parser.d.ts +19 -0
  83. package/packages/server/dist/watcher/pi/pi-parser.d.ts.map +1 -0
  84. package/packages/server/dist/watcher/pi/pi-parser.js +307 -0
  85. package/packages/server/dist/watcher/pi/pi-parser.js.map +1 -0
  86. package/packages/server/dist/watcher/pi/pi-paths.d.ts +28 -0
  87. package/packages/server/dist/watcher/pi/pi-paths.d.ts.map +1 -0
  88. package/packages/server/dist/watcher/pi/pi-paths.js +86 -0
  89. package/packages/server/dist/watcher/pi/pi-paths.js.map +1 -0
  90. package/packages/server/dist/watcher/pi/pi-watcher.d.ts +36 -0
  91. package/packages/server/dist/watcher/pi/pi-watcher.d.ts.map +1 -0
  92. package/packages/server/dist/watcher/pi/pi-watcher.js +593 -0
  93. package/packages/server/dist/watcher/pi/pi-watcher.js.map +1 -0
  94. package/packages/server/dist/watcher/session-scanner.d.ts +9 -3
  95. package/packages/server/dist/watcher/session-scanner.d.ts.map +1 -1
  96. package/packages/server/dist/watcher/session-scanner.js +11 -13
  97. package/packages/server/dist/watcher/session-scanner.js.map +1 -1
  98. package/packages/server/dist/watcher/types.d.ts +30 -0
  99. package/packages/server/dist/watcher/types.d.ts.map +1 -0
  100. package/packages/server/dist/watcher/types.js +14 -0
  101. package/packages/server/dist/watcher/types.js.map +1 -0
  102. package/packages/server/dist/ws/broadcaster.js +0 -4
  103. package/packages/server/dist/ws/ws-handler.js +0 -4
  104. package/packages/shared/dist/constants/colors.d.ts +1 -1
  105. package/packages/shared/dist/constants/colors.js +1 -1
  106. package/packages/shared/dist/constants/colors.js.map +1 -1
  107. package/packages/shared/dist/constants/tools.d.ts.map +1 -1
  108. package/packages/shared/dist/constants/tools.js +30 -1
  109. package/packages/shared/dist/constants/tools.js.map +1 -1
  110. package/packages/shared/dist/index.d.ts +1 -1
  111. package/packages/shared/dist/index.d.ts.map +1 -1
  112. package/packages/shared/dist/types/agent.d.ts +3 -0
  113. package/packages/shared/dist/types/agent.d.ts.map +1 -1
  114. package/packages/client/dist/assets/index-Dh8yWoLP.js +0 -711
  115. package/packages/server/dist/watcher/claude-paths.d.ts +0 -32
  116. package/packages/server/dist/watcher/claude-paths.d.ts.map +0 -1
  117. package/packages/server/dist/watcher/claude-paths.js.map +0 -1
  118. package/packages/server/dist/watcher/file-watcher.d.ts.map +0 -1
  119. package/packages/server/dist/watcher/file-watcher.js.map +0 -1
  120. package/packages/server/dist/watcher/jsonl-parser.d.ts +0 -21
  121. package/packages/server/dist/watcher/jsonl-parser.d.ts.map +0 -1
  122. package/packages/server/dist/watcher/jsonl-parser.js.map +0 -1
@@ -0,0 +1,577 @@
1
+ // dist/watcher/codex/codex-watcher.js
2
+ import chokidar from "chokidar";
3
+ import { stat, open, readdir } from "fs/promises";
4
+ import { join as join3, basename as basename2 } from "path";
5
+ import { homedir } from "os";
6
+ import { join } from "path";
7
+ import { homedir as homedir2 } from "os";
8
+ import { join as join2, basename } from "path";
9
+ import { existsSync } from "fs";
10
+ function createFallbackSession(agentType, name) {
11
+ return {
12
+ agentType,
13
+ projectPath: name,
14
+ projectName: name,
15
+ isSubagent: false,
16
+ projectDir: name,
17
+ parentSessionId: null
18
+ };
19
+ }
20
+ var TOOL_NAME_MAP = {
21
+ // OpenCode / pi lowercase → canonical PascalCase
22
+ read: "Read",
23
+ write: "Write",
24
+ edit: "Edit",
25
+ patch: "Patch",
26
+ glob: "Glob",
27
+ bash: "Bash",
28
+ grep: "Grep",
29
+ websearch: "WebSearch",
30
+ webfetch: "WebFetch",
31
+ todoread: "TodoRead",
32
+ todowrite: "TodoWrite",
33
+ // pi-specific tool names
34
+ "edit-diff": "Patch",
35
+ find: "Glob",
36
+ ls: "Bash",
37
+ truncate: "Write",
38
+ // Codex CLI tool names
39
+ shell_command: "Bash",
40
+ exec_command: "Bash",
41
+ read_file: "Read",
42
+ apply_patch: "Patch",
43
+ list_dir: "Bash",
44
+ grep_files: "Grep",
45
+ web_search: "WebSearch",
46
+ js_repl: "Bash",
47
+ js_repl_reset: "Bash",
48
+ spawn_agent: "Agent",
49
+ send_input: "Agent",
50
+ wait: "Agent",
51
+ close_agent: "Agent",
52
+ resume_agent: "Agent",
53
+ spawn_agents_on_csv: "Agent",
54
+ report_agent_job_result: "Agent",
55
+ request_user_input: "AskUserQuestion",
56
+ request_permissions: "AskUserQuestion",
57
+ update_plan: "TodoWrite",
58
+ view_image: "Read",
59
+ image_generation: "Write",
60
+ write_stdin: "Bash",
61
+ search_apps: "WebSearch"
62
+ };
63
+ function normalizeToolName(name) {
64
+ return TOOL_NAME_MAP[name] ?? name;
65
+ }
66
+ function normalizeToolInput(input) {
67
+ if (!("filePath" in input) && !("oldString" in input) && !("newString" in input) && !("replaceAll" in input)) {
68
+ return input;
69
+ }
70
+ const out = { ...input };
71
+ if ("filePath" in out) {
72
+ out.file_path = out.filePath;
73
+ delete out.filePath;
74
+ }
75
+ if ("oldString" in out) {
76
+ out.old_string = out.oldString;
77
+ delete out.oldString;
78
+ }
79
+ if ("newString" in out) {
80
+ out.new_string = out.newString;
81
+ delete out.newString;
82
+ }
83
+ if ("replaceAll" in out) {
84
+ out.replace_all = out.replaceAll;
85
+ delete out.replaceAll;
86
+ }
87
+ return out;
88
+ }
89
+ var ZONES = [
90
+ // Row 0
91
+ {
92
+ id: "search",
93
+ label: "Search",
94
+ description: "Grep, WebSearch \u2014 Research & lookup",
95
+ icon: "\u{1F4DA}",
96
+ color: 15381256,
97
+ colStart: 0,
98
+ colSpan: 5,
99
+ rowStart: 0,
100
+ rowSpan: 1,
101
+ x: 0,
102
+ y: 0,
103
+ width: 0,
104
+ height: 0
105
+ },
106
+ {
107
+ id: "terminal",
108
+ label: "Terminal",
109
+ description: "Bash commands \u2014 Server room",
110
+ icon: "\u{1F4BB}",
111
+ color: 2278750,
112
+ colStart: 5,
113
+ colSpan: 3,
114
+ rowStart: 0,
115
+ rowSpan: 1,
116
+ x: 0,
117
+ y: 0,
118
+ width: 0,
119
+ height: 0
120
+ },
121
+ {
122
+ id: "web",
123
+ label: "Web",
124
+ description: "WebFetch, Browser \u2014 Network hub",
125
+ icon: "\u{1F310}",
126
+ color: 9133302,
127
+ colStart: 8,
128
+ colSpan: 4,
129
+ rowStart: 0,
130
+ rowSpan: 1,
131
+ x: 0,
132
+ y: 0,
133
+ width: 0,
134
+ height: 0
135
+ },
136
+ // Row 1
137
+ {
138
+ id: "files",
139
+ label: "Files",
140
+ description: "Read, Write, Edit, Glob \u2014 File storage",
141
+ icon: "\u{1F4C1}",
142
+ color: 3900150,
143
+ colStart: 0,
144
+ colSpan: 4,
145
+ rowStart: 1,
146
+ rowSpan: 1,
147
+ x: 0,
148
+ y: 0,
149
+ width: 0,
150
+ height: 0
151
+ },
152
+ {
153
+ id: "thinking",
154
+ label: "Thinking",
155
+ description: "Planning, Questions \u2014 Conference area",
156
+ icon: "\u{1F4AD}",
157
+ color: 16347926,
158
+ colStart: 4,
159
+ colSpan: 5,
160
+ rowStart: 1,
161
+ rowSpan: 1,
162
+ x: 0,
163
+ y: 0,
164
+ width: 0,
165
+ height: 0
166
+ },
167
+ {
168
+ id: "messaging",
169
+ label: "Messaging",
170
+ description: "SendMessage, Teams \u2014 Chat & relax",
171
+ icon: "\u{1F4AC}",
172
+ color: 15485081,
173
+ colStart: 9,
174
+ colSpan: 3,
175
+ rowStart: 1,
176
+ rowSpan: 1,
177
+ x: 0,
178
+ y: 0,
179
+ width: 0,
180
+ height: 0
181
+ },
182
+ // Row 2
183
+ {
184
+ id: "spawn",
185
+ label: "Spawn",
186
+ description: "Agent spawn/despawn \u2014 Entry portal",
187
+ icon: "\u{1F300}",
188
+ color: 11032055,
189
+ colStart: 0,
190
+ colSpan: 3,
191
+ rowStart: 2,
192
+ rowSpan: 1,
193
+ x: 0,
194
+ y: 0,
195
+ width: 0,
196
+ height: 0
197
+ },
198
+ {
199
+ id: "idle",
200
+ label: "Idle",
201
+ description: "Idle agents rest here \u2014 Kitchen & lounge",
202
+ icon: "\u2615",
203
+ color: 7041664,
204
+ colStart: 3,
205
+ colSpan: 5,
206
+ rowStart: 2,
207
+ rowSpan: 1,
208
+ x: 0,
209
+ y: 0,
210
+ width: 0,
211
+ height: 0
212
+ },
213
+ {
214
+ id: "tasks",
215
+ label: "Tasks",
216
+ description: "TaskCreate, TaskUpdate \u2014 Kanban & planning",
217
+ icon: "\u{1F4CB}",
218
+ color: 1357990,
219
+ colStart: 8,
220
+ colSpan: 4,
221
+ rowStart: 2,
222
+ rowSpan: 1,
223
+ x: 0,
224
+ y: 0,
225
+ width: 0,
226
+ height: 0
227
+ }
228
+ ];
229
+ var ZONE_MAP = new Map(ZONES.map((z) => [z.id, z]));
230
+ var CodexParser = class {
231
+ /**
232
+ * Parse a single JSONL line into the envelope structure.
233
+ */
234
+ parseRaw(line) {
235
+ try {
236
+ const obj = JSON.parse(line);
237
+ if (obj && typeof obj.type === "string") {
238
+ return obj;
239
+ }
240
+ return null;
241
+ } catch {
242
+ return null;
243
+ }
244
+ }
245
+ /**
246
+ * Try to extract session_meta payload. Returns null if not a session_meta envelope.
247
+ */
248
+ tryGetSessionMeta(envelope) {
249
+ if (envelope.type !== "session_meta")
250
+ return null;
251
+ return envelope.payload;
252
+ }
253
+ /**
254
+ * Try to extract model from a turn_context envelope. Returns null otherwise.
255
+ */
256
+ tryGetModel(envelope) {
257
+ if (envelope.type !== "turn_context")
258
+ return null;
259
+ const model = envelope.payload?.model;
260
+ return model ?? null;
261
+ }
262
+ /**
263
+ * Parse a Codex JSONL envelope into a ParsedActivity.
264
+ * Model is passed in from the watcher (tracked per-file).
265
+ * Returns null for non-actionable entries.
266
+ */
267
+ parseEntry(envelope, model) {
268
+ if (envelope.type === "response_item") {
269
+ return this.parseResponseItem(envelope.payload, model);
270
+ }
271
+ if (envelope.type === "event_msg") {
272
+ return this.parseEventMsg(envelope.payload, model);
273
+ }
274
+ return null;
275
+ }
276
+ parseResponseItem(payload, model) {
277
+ const itemType = payload.type;
278
+ if (itemType === "function_call") {
279
+ const fc = payload;
280
+ let toolInput = {};
281
+ try {
282
+ toolInput = JSON.parse(fc.arguments);
283
+ } catch {
284
+ }
285
+ return {
286
+ type: "tool_use",
287
+ toolName: normalizeToolName(fc.name),
288
+ toolInput: normalizeToolInput(toolInput),
289
+ model: model ?? void 0
290
+ };
291
+ }
292
+ if (itemType.endsWith("_call") && itemType !== "function_call") {
293
+ const nativeName = itemType.replace(/_call$/, "");
294
+ const toolInput = {};
295
+ const action = payload.action;
296
+ if (action?.query)
297
+ toolInput.query = action.query;
298
+ return {
299
+ type: "tool_use",
300
+ toolName: normalizeToolName(nativeName),
301
+ toolInput,
302
+ model: model ?? void 0
303
+ };
304
+ }
305
+ return null;
306
+ }
307
+ parseEventMsg(payload, model) {
308
+ const eventType = payload.type;
309
+ if (eventType === "token_count") {
310
+ const info = payload.info;
311
+ if (!info?.last_token_usage)
312
+ return null;
313
+ const usage = info.last_token_usage;
314
+ return {
315
+ type: "token_usage",
316
+ inputTokens: usage.input_tokens,
317
+ outputTokens: (usage.output_tokens ?? 0) + (usage.reasoning_output_tokens ?? 0),
318
+ cacheReadTokens: usage.cached_input_tokens,
319
+ model: model ?? void 0
320
+ };
321
+ }
322
+ if (eventType === "agent_message") {
323
+ const text = payload.message?.trim();
324
+ if (text && text.length > 0 && text.length < 200) {
325
+ return { type: "text", text, model: model ?? void 0 };
326
+ }
327
+ }
328
+ if (eventType === "agent_reasoning") {
329
+ const text = payload.text?.trim();
330
+ if (!text)
331
+ return null;
332
+ return {
333
+ type: "tool_use",
334
+ toolName: "thinking",
335
+ toolInput: { thought: text.slice(0, 120) },
336
+ model: model ?? void 0
337
+ };
338
+ }
339
+ return null;
340
+ }
341
+ };
342
+ var config = {
343
+ port: parseInt(process.env.AGENT_MOVE_PORT || "3333", 10),
344
+ claudeHome: join(homedir(), ".claude"),
345
+ idleTimeoutMs: 45e3,
346
+ /** How long after going idle before an agent is automatically shutdown/removed */
347
+ shutdownTimeoutMs: 30 * 60 * 1e3,
348
+ // 30 minutes
349
+ /** How recently a session file must be modified to be considered "active" on startup */
350
+ activeThresholdMs: 10 * 60 * 1e3,
351
+ // 10 minutes
352
+ /** Enable OpenCode session watching (auto-detected if storage dir exists) */
353
+ enableOpenCode: process.env.AGENT_MOVE_OPENCODE !== "false",
354
+ /** Enable pi coding agent session watching (auto-detected if sessions dir exists) */
355
+ enablePi: process.env.AGENT_MOVE_PI !== "false",
356
+ /** Enable Codex CLI session watching (auto-detected if sessions dir exists) */
357
+ enableCodex: process.env.AGENT_MOVE_CODEX !== "false"
358
+ };
359
+ function getCodexSessionsDir() {
360
+ const candidate = join2(homedir2(), ".codex", "sessions");
361
+ return existsSync(candidate) ? candidate : null;
362
+ }
363
+ var UUID_RE = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;
364
+ function extractCodexSessionId(filePath) {
365
+ const name = basename(filePath, ".jsonl");
366
+ const match = name.match(UUID_RE);
367
+ if (match) {
368
+ return `codex:${match[1]}`;
369
+ }
370
+ return `codex:${name}`;
371
+ }
372
+ function parseCodexSessionInfo(meta) {
373
+ const cwd = meta.cwd || "codex";
374
+ const parts = cwd.replace(/\\/g, "/").split("/").filter(Boolean);
375
+ const projectName = parts[parts.length - 1] || "codex";
376
+ return {
377
+ agentType: "codex",
378
+ projectPath: cwd,
379
+ projectName,
380
+ isSubagent: false,
381
+ projectDir: cwd,
382
+ parentSessionId: null
383
+ };
384
+ }
385
+ function createCodexSubagentSession(parentSessionId, parentInfo) {
386
+ return {
387
+ agentType: "codex",
388
+ projectPath: parentInfo.projectPath,
389
+ projectName: parentInfo.projectName,
390
+ isSubagent: true,
391
+ projectDir: parentInfo.projectDir,
392
+ parentSessionId
393
+ };
394
+ }
395
+ var CodexWatcher = class {
396
+ stateManager;
397
+ watcher = null;
398
+ byteOffsets = /* @__PURE__ */ new Map();
399
+ parser = new CodexParser();
400
+ /** Per-file lock to prevent concurrent processFile calls */
401
+ fileLocks = /* @__PURE__ */ new Map();
402
+ /** Cached session info per file (parsed from session_meta) */
403
+ sessionInfoCache = /* @__PURE__ */ new Map();
404
+ /** Per-file model tracking (from turn_context events) */
405
+ fileModels = /* @__PURE__ */ new Map();
406
+ /** Deduplication of spawn_agent call IDs already processed */
407
+ seenSubagentCalls = /* @__PURE__ */ new Set();
408
+ /** Counter for generating unique subagent session IDs */
409
+ subagentCounter = 0;
410
+ constructor(stateManager) {
411
+ this.stateManager = stateManager;
412
+ }
413
+ async start() {
414
+ const sessionsDir = getCodexSessionsDir();
415
+ if (!sessionsDir) {
416
+ console.log("[codex] No sessions directory found \u2014 Codex CLI not installed or not yet used");
417
+ return;
418
+ }
419
+ console.log(`[codex] Sessions directory found at ${sessionsDir}`);
420
+ const existingFiles = await this.scanDeep(sessionsDir);
421
+ for (const file of existingFiles) {
422
+ await this.processFile(file);
423
+ }
424
+ const pattern = join3(sessionsDir, "**", "*.jsonl");
425
+ const usePolling = process.platform === "win32";
426
+ this.watcher = chokidar.watch(pattern, {
427
+ persistent: true,
428
+ ignoreInitial: true,
429
+ usePolling,
430
+ interval: usePolling ? 500 : void 0,
431
+ awaitWriteFinish: usePolling ? false : { stabilityThreshold: 200, pollInterval: 50 }
432
+ });
433
+ this.watcher.on("add", (filePath) => {
434
+ console.log(`[codex] New session file: ${filePath}`);
435
+ this.processFile(filePath);
436
+ });
437
+ this.watcher.on("change", (filePath) => {
438
+ this.processFile(filePath);
439
+ });
440
+ console.log(`[codex] Watching for JSONL files in ${sessionsDir} (polling: ${usePolling})`);
441
+ }
442
+ stop() {
443
+ this.watcher?.close();
444
+ this.byteOffsets.clear();
445
+ this.fileLocks.clear();
446
+ this.sessionInfoCache.clear();
447
+ this.fileModels.clear();
448
+ this.seenSubagentCalls.clear();
449
+ }
450
+ /**
451
+ * Recursively scan for recently-modified JSONL files under the sessions dir.
452
+ * Codex nests files as sessions/YYYY/MM/DD/rollout-*.jsonl.
453
+ */
454
+ async scanDeep(dir) {
455
+ const results = [];
456
+ const now = Date.now();
457
+ const walk = async (current) => {
458
+ try {
459
+ const entries = await readdir(current, { withFileTypes: true });
460
+ for (const entry of entries) {
461
+ const full = join3(current, entry.name);
462
+ if (entry.isDirectory()) {
463
+ await walk(full);
464
+ } else if (entry.name.endsWith(".jsonl")) {
465
+ try {
466
+ const s = await stat(full);
467
+ if (now - s.mtimeMs < config.activeThresholdMs) {
468
+ results.push(full);
469
+ }
470
+ } catch {
471
+ }
472
+ }
473
+ }
474
+ } catch {
475
+ }
476
+ };
477
+ await walk(dir);
478
+ return results;
479
+ }
480
+ processFile(filePath) {
481
+ const prev = this.fileLocks.get(filePath) ?? Promise.resolve();
482
+ const next = prev.then(() => this.doProcessFile(filePath)).catch(() => {
483
+ }).finally(() => {
484
+ if (this.fileLocks.get(filePath) === next) {
485
+ this.fileLocks.delete(filePath);
486
+ }
487
+ });
488
+ this.fileLocks.set(filePath, next);
489
+ }
490
+ async doProcessFile(filePath) {
491
+ try {
492
+ const fileStats = await stat(filePath);
493
+ const currentOffset = this.byteOffsets.get(filePath) ?? 0;
494
+ if (fileStats.size <= currentOffset)
495
+ return;
496
+ const handle = await open(filePath, "r");
497
+ try {
498
+ const buffer = Buffer.alloc(fileStats.size - currentOffset);
499
+ await handle.read(buffer, 0, buffer.length, currentOffset);
500
+ this.byteOffsets.set(filePath, fileStats.size);
501
+ const newContent = buffer.toString("utf-8");
502
+ const lines = newContent.split("\n").filter((l) => l.trim());
503
+ const sessionId = extractCodexSessionId(filePath);
504
+ let sessionInfo = this.sessionInfoCache.get(filePath);
505
+ let hadParsedActivity = false;
506
+ for (const line of lines) {
507
+ const envelope = this.parser.parseRaw(line);
508
+ if (!envelope)
509
+ continue;
510
+ if (!sessionInfo) {
511
+ const meta = this.parser.tryGetSessionMeta(envelope);
512
+ if (meta) {
513
+ sessionInfo = parseCodexSessionInfo(meta);
514
+ this.sessionInfoCache.set(filePath, sessionInfo);
515
+ continue;
516
+ }
517
+ }
518
+ const model = this.parser.tryGetModel(envelope);
519
+ if (model) {
520
+ this.fileModels.set(filePath, model);
521
+ continue;
522
+ }
523
+ const currentModel = this.fileModels.get(filePath) ?? null;
524
+ const parsed = this.parser.parseEntry(envelope, currentModel);
525
+ if (parsed) {
526
+ hadParsedActivity = true;
527
+ if (!sessionInfo) {
528
+ sessionInfo = this.buildFallbackSession(filePath);
529
+ this.sessionInfoCache.set(filePath, sessionInfo);
530
+ }
531
+ if (parsed.type === "tool_use" && parsed.toolName === "Agent") {
532
+ this.handleSubagentSpawn(sessionId, sessionInfo, parsed, envelope.payload);
533
+ }
534
+ this.stateManager.processMessage(sessionId, parsed, sessionInfo);
535
+ }
536
+ }
537
+ if (!hadParsedActivity && lines.length > 0) {
538
+ this.stateManager.heartbeat(sessionId);
539
+ }
540
+ } finally {
541
+ await handle.close();
542
+ }
543
+ } catch (err) {
544
+ if (err.code !== "ENOENT") {
545
+ console.error(`[codex] Error processing ${filePath}:`, err);
546
+ }
547
+ }
548
+ }
549
+ /**
550
+ * When a spawn_agent tool call is detected, create a synthetic subagent session
551
+ * so the visualization shows the child agent.
552
+ */
553
+ handleSubagentSpawn(parentSessionId, parentInfo, parsed, payload) {
554
+ const callId = payload.call_id;
555
+ if (!callId || this.seenSubagentCalls.has(callId))
556
+ return;
557
+ this.subagentCounter++;
558
+ this.seenSubagentCalls.add(callId);
559
+ const subSessionId = `codex:sub-${parentSessionId.replace("codex:", "")}-${this.subagentCounter}`;
560
+ const subInfo = createCodexSubagentSession(parentSessionId, parentInfo);
561
+ const agentName = parsed.toolInput?.agent_type || parsed.toolInput?.message?.slice(0, 30) || `agent-${this.subagentCounter}`;
562
+ this.stateManager.processMessage(subSessionId, {
563
+ type: "tool_use",
564
+ toolName: "thinking",
565
+ toolInput: { thought: `Subagent: ${agentName}` },
566
+ model: parsed.model,
567
+ agentName
568
+ }, subInfo);
569
+ }
570
+ buildFallbackSession(filePath) {
571
+ const name = basename2(filePath, ".jsonl");
572
+ return createFallbackSession("codex", name);
573
+ }
574
+ };
575
+ export {
576
+ CodexWatcher
577
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-watcher.js","sourceRoot":"","sources":["../../../src/watcher/codex/codex-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IAeH;IAdZ,OAAO,GAA8B,IAAI,CAAC;IAC1C,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACnC,4DAA4D;IACpD,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IACrD,8DAA8D;IACtD,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC1D,yDAAyD;IACjD,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,8DAA8D;IACtD,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,yDAAyD;IACjD,eAAe,GAAG,CAAC,CAAC;IAE5B,YAAoB,YAA+B;QAA/B,iBAAY,GAAZ,YAAY,CAAmB;IAAG,CAAC;IAEvD,KAAK,CAAC,KAAK;QACT,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;QAElE,2DAA2D;QAC3D,wDAAwD;QACxD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACnD,oEAAoE;QACpE,wDAAwD;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;YACrC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,UAAU;YACV,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACtC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;SACrF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE;YAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;YACrC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,cAAc,UAAU,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,QAAQ,CAAC,GAAW;QAChC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACzC,IAAI,CAAC;4BACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC3B,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;gCAC/C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACrB,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,WAAW,CAAC,QAAgB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;aACxC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAAgB;QAC1C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE1D,IAAI,SAAS,CAAC,IAAI,IAAI,aAAa;gBAAE,OAAO;YAE5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC;gBAC5D,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBAC3D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAE/C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAE7D,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAEtD,IAAI,iBAAiB,GAAG,KAAK,CAAC;gBAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,CAAC,QAAQ;wBAAE,SAAS;oBAExB,+CAA+C;oBAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;wBACrD,IAAI,IAAI,EAAE,CAAC;4BACT,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;4BAC1C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;4BACjD,SAAS;wBACX,CAAC;oBACH,CAAC;oBAED,kDAAkD;oBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;wBACrC,SAAS;oBACX,CAAC;oBAED,2CAA2C;oBAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;oBAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAC9D,IAAI,MAAM,EAAE,CAAC;wBACX,iBAAiB,GAAG,IAAI,CAAC;wBACzB,IAAI,CAAC,WAAW,EAAE,CAAC;4BACjB,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;4BAClD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;wBACnD,CAAC;wBAED,gEAAgE;wBAChE,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;4BAC9D,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;wBAC7E,CAAC;wBAED,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBACnE,CAAC;gBACH,CAAC;gBAED,gEAAgE;gBAChE,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,mBAAmB,CACzB,eAAuB,EACvB,UAAuB,EACvB,MAAsB,EACtB,OAAgC;QAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,OAA6B,CAAC;QACrD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAE1D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,YAAY,GAAG,aAAa,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAClG,MAAM,OAAO,GAAG,0BAA0B,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAExE,8CAA8C;QAC9C,MAAM,SAAS,GAAI,MAAM,CAAC,SAAS,EAAE,UAAqB;eACpD,MAAM,CAAC,SAAS,EAAE,OAAkB,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;eACnD,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;QAErC,iDAAiD;QACjD,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,YAAY,EAAE;YAC7C,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,EAAE,OAAO,EAAE,aAAa,SAAS,EAAE,EAAE;YAChD,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS;SACV,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAEO,oBAAoB,CAAC,QAAgB;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,9 +1,5 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
-
3
1
  // dist/watcher/git-info.js
4
- import { createRequire } from "module";
5
2
  import { execSync } from "child_process";
6
- var require2 = createRequire(import.meta.url);
7
3
  var branchCache = /* @__PURE__ */ new Map();
8
4
  var CACHE_TTL = 3e4;
9
5
  var MAX_CACHE_SIZE = 100;
@@ -1,4 +1,4 @@
1
- import type { ParsedActivity } from '../jsonl-parser.js';
1
+ import type { ParsedActivity } from '../types.js';
2
2
  export interface OpenCodeMessageData {
3
3
  id: string;
4
4
  sessionID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-parser.d.ts","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,UAAU,SAAS;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI;IAiDnF;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI;CAezE"}
1
+ {"version":3,"file":"opencode-parser.d.ts","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,UAAU,SAAS;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI;IAiDnF;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI;CAezE"}
@@ -1,10 +1,6 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
-
3
1
  // dist/watcher/opencode/opencode-parser.js
4
- import { createRequire } from "module";
5
- var require2 = createRequire(import.meta.url);
6
2
  var TOOL_NAME_MAP = {
7
- // OpenCode lowercase → canonical PascalCase
3
+ // OpenCode / pi lowercase → canonical PascalCase
8
4
  read: "Read",
9
5
  write: "Write",
10
6
  edit: "Edit",
@@ -15,7 +11,36 @@ var TOOL_NAME_MAP = {
15
11
  websearch: "WebSearch",
16
12
  webfetch: "WebFetch",
17
13
  todoread: "TodoRead",
18
- todowrite: "TodoWrite"
14
+ todowrite: "TodoWrite",
15
+ // pi-specific tool names
16
+ "edit-diff": "Patch",
17
+ find: "Glob",
18
+ ls: "Bash",
19
+ truncate: "Write",
20
+ // Codex CLI tool names
21
+ shell_command: "Bash",
22
+ exec_command: "Bash",
23
+ read_file: "Read",
24
+ apply_patch: "Patch",
25
+ list_dir: "Bash",
26
+ grep_files: "Grep",
27
+ web_search: "WebSearch",
28
+ js_repl: "Bash",
29
+ js_repl_reset: "Bash",
30
+ spawn_agent: "Agent",
31
+ send_input: "Agent",
32
+ wait: "Agent",
33
+ close_agent: "Agent",
34
+ resume_agent: "Agent",
35
+ spawn_agents_on_csv: "Agent",
36
+ report_agent_job_result: "Agent",
37
+ request_user_input: "AskUserQuestion",
38
+ request_permissions: "AskUserQuestion",
39
+ update_plan: "TodoWrite",
40
+ view_image: "Read",
41
+ image_generation: "Write",
42
+ write_stdin: "Bash",
43
+ search_apps: "WebSearch"
19
44
  };
20
45
  function normalizeToolName(name) {
21
46
  return TOOL_NAME_MAP[name] ?? name;
@@ -1,4 +1,4 @@
1
- import type { SessionInfo } from '../claude-paths.js';
1
+ import type { SessionInfo } from '../types.js';
2
2
  /**
3
3
  * Find the OpenCode SQLite database file.
4
4
  * OpenCode stores everything in a single DB at:
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-paths.d.ts","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAejD;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,WAAW,CAazE"}
1
+ {"version":3,"file":"opencode-paths.d.ts","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAejD;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,WAAW,CAczE"}