@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,326 @@
1
+ // dist/watcher/codex/codex-parser.js
2
+ var TOOL_NAME_MAP = {
3
+ // OpenCode / pi lowercase → canonical PascalCase
4
+ read: "Read",
5
+ write: "Write",
6
+ edit: "Edit",
7
+ patch: "Patch",
8
+ glob: "Glob",
9
+ bash: "Bash",
10
+ grep: "Grep",
11
+ websearch: "WebSearch",
12
+ webfetch: "WebFetch",
13
+ todoread: "TodoRead",
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"
44
+ };
45
+ function normalizeToolName(name) {
46
+ return TOOL_NAME_MAP[name] ?? name;
47
+ }
48
+ function normalizeToolInput(input) {
49
+ if (!("filePath" in input) && !("oldString" in input) && !("newString" in input) && !("replaceAll" in input)) {
50
+ return input;
51
+ }
52
+ const out = { ...input };
53
+ if ("filePath" in out) {
54
+ out.file_path = out.filePath;
55
+ delete out.filePath;
56
+ }
57
+ if ("oldString" in out) {
58
+ out.old_string = out.oldString;
59
+ delete out.oldString;
60
+ }
61
+ if ("newString" in out) {
62
+ out.new_string = out.newString;
63
+ delete out.newString;
64
+ }
65
+ if ("replaceAll" in out) {
66
+ out.replace_all = out.replaceAll;
67
+ delete out.replaceAll;
68
+ }
69
+ return out;
70
+ }
71
+ var ZONES = [
72
+ // Row 0
73
+ {
74
+ id: "search",
75
+ label: "Search",
76
+ description: "Grep, WebSearch \u2014 Research & lookup",
77
+ icon: "\u{1F4DA}",
78
+ color: 15381256,
79
+ colStart: 0,
80
+ colSpan: 5,
81
+ rowStart: 0,
82
+ rowSpan: 1,
83
+ x: 0,
84
+ y: 0,
85
+ width: 0,
86
+ height: 0
87
+ },
88
+ {
89
+ id: "terminal",
90
+ label: "Terminal",
91
+ description: "Bash commands \u2014 Server room",
92
+ icon: "\u{1F4BB}",
93
+ color: 2278750,
94
+ colStart: 5,
95
+ colSpan: 3,
96
+ rowStart: 0,
97
+ rowSpan: 1,
98
+ x: 0,
99
+ y: 0,
100
+ width: 0,
101
+ height: 0
102
+ },
103
+ {
104
+ id: "web",
105
+ label: "Web",
106
+ description: "WebFetch, Browser \u2014 Network hub",
107
+ icon: "\u{1F310}",
108
+ color: 9133302,
109
+ colStart: 8,
110
+ colSpan: 4,
111
+ rowStart: 0,
112
+ rowSpan: 1,
113
+ x: 0,
114
+ y: 0,
115
+ width: 0,
116
+ height: 0
117
+ },
118
+ // Row 1
119
+ {
120
+ id: "files",
121
+ label: "Files",
122
+ description: "Read, Write, Edit, Glob \u2014 File storage",
123
+ icon: "\u{1F4C1}",
124
+ color: 3900150,
125
+ colStart: 0,
126
+ colSpan: 4,
127
+ rowStart: 1,
128
+ rowSpan: 1,
129
+ x: 0,
130
+ y: 0,
131
+ width: 0,
132
+ height: 0
133
+ },
134
+ {
135
+ id: "thinking",
136
+ label: "Thinking",
137
+ description: "Planning, Questions \u2014 Conference area",
138
+ icon: "\u{1F4AD}",
139
+ color: 16347926,
140
+ colStart: 4,
141
+ colSpan: 5,
142
+ rowStart: 1,
143
+ rowSpan: 1,
144
+ x: 0,
145
+ y: 0,
146
+ width: 0,
147
+ height: 0
148
+ },
149
+ {
150
+ id: "messaging",
151
+ label: "Messaging",
152
+ description: "SendMessage, Teams \u2014 Chat & relax",
153
+ icon: "\u{1F4AC}",
154
+ color: 15485081,
155
+ colStart: 9,
156
+ colSpan: 3,
157
+ rowStart: 1,
158
+ rowSpan: 1,
159
+ x: 0,
160
+ y: 0,
161
+ width: 0,
162
+ height: 0
163
+ },
164
+ // Row 2
165
+ {
166
+ id: "spawn",
167
+ label: "Spawn",
168
+ description: "Agent spawn/despawn \u2014 Entry portal",
169
+ icon: "\u{1F300}",
170
+ color: 11032055,
171
+ colStart: 0,
172
+ colSpan: 3,
173
+ rowStart: 2,
174
+ rowSpan: 1,
175
+ x: 0,
176
+ y: 0,
177
+ width: 0,
178
+ height: 0
179
+ },
180
+ {
181
+ id: "idle",
182
+ label: "Idle",
183
+ description: "Idle agents rest here \u2014 Kitchen & lounge",
184
+ icon: "\u2615",
185
+ color: 7041664,
186
+ colStart: 3,
187
+ colSpan: 5,
188
+ rowStart: 2,
189
+ rowSpan: 1,
190
+ x: 0,
191
+ y: 0,
192
+ width: 0,
193
+ height: 0
194
+ },
195
+ {
196
+ id: "tasks",
197
+ label: "Tasks",
198
+ description: "TaskCreate, TaskUpdate \u2014 Kanban & planning",
199
+ icon: "\u{1F4CB}",
200
+ color: 1357990,
201
+ colStart: 8,
202
+ colSpan: 4,
203
+ rowStart: 2,
204
+ rowSpan: 1,
205
+ x: 0,
206
+ y: 0,
207
+ width: 0,
208
+ height: 0
209
+ }
210
+ ];
211
+ var ZONE_MAP = new Map(ZONES.map((z) => [z.id, z]));
212
+ var CodexParser = class {
213
+ /**
214
+ * Parse a single JSONL line into the envelope structure.
215
+ */
216
+ parseRaw(line) {
217
+ try {
218
+ const obj = JSON.parse(line);
219
+ if (obj && typeof obj.type === "string") {
220
+ return obj;
221
+ }
222
+ return null;
223
+ } catch {
224
+ return null;
225
+ }
226
+ }
227
+ /**
228
+ * Try to extract session_meta payload. Returns null if not a session_meta envelope.
229
+ */
230
+ tryGetSessionMeta(envelope) {
231
+ if (envelope.type !== "session_meta")
232
+ return null;
233
+ return envelope.payload;
234
+ }
235
+ /**
236
+ * Try to extract model from a turn_context envelope. Returns null otherwise.
237
+ */
238
+ tryGetModel(envelope) {
239
+ if (envelope.type !== "turn_context")
240
+ return null;
241
+ const model = envelope.payload?.model;
242
+ return model ?? null;
243
+ }
244
+ /**
245
+ * Parse a Codex JSONL envelope into a ParsedActivity.
246
+ * Model is passed in from the watcher (tracked per-file).
247
+ * Returns null for non-actionable entries.
248
+ */
249
+ parseEntry(envelope, model) {
250
+ if (envelope.type === "response_item") {
251
+ return this.parseResponseItem(envelope.payload, model);
252
+ }
253
+ if (envelope.type === "event_msg") {
254
+ return this.parseEventMsg(envelope.payload, model);
255
+ }
256
+ return null;
257
+ }
258
+ parseResponseItem(payload, model) {
259
+ const itemType = payload.type;
260
+ if (itemType === "function_call") {
261
+ const fc = payload;
262
+ let toolInput = {};
263
+ try {
264
+ toolInput = JSON.parse(fc.arguments);
265
+ } catch {
266
+ }
267
+ return {
268
+ type: "tool_use",
269
+ toolName: normalizeToolName(fc.name),
270
+ toolInput: normalizeToolInput(toolInput),
271
+ model: model ?? void 0
272
+ };
273
+ }
274
+ if (itemType.endsWith("_call") && itemType !== "function_call") {
275
+ const nativeName = itemType.replace(/_call$/, "");
276
+ const toolInput = {};
277
+ const action = payload.action;
278
+ if (action?.query)
279
+ toolInput.query = action.query;
280
+ return {
281
+ type: "tool_use",
282
+ toolName: normalizeToolName(nativeName),
283
+ toolInput,
284
+ model: model ?? void 0
285
+ };
286
+ }
287
+ return null;
288
+ }
289
+ parseEventMsg(payload, model) {
290
+ const eventType = payload.type;
291
+ if (eventType === "token_count") {
292
+ const info = payload.info;
293
+ if (!info?.last_token_usage)
294
+ return null;
295
+ const usage = info.last_token_usage;
296
+ return {
297
+ type: "token_usage",
298
+ inputTokens: usage.input_tokens,
299
+ outputTokens: (usage.output_tokens ?? 0) + (usage.reasoning_output_tokens ?? 0),
300
+ cacheReadTokens: usage.cached_input_tokens,
301
+ model: model ?? void 0
302
+ };
303
+ }
304
+ if (eventType === "agent_message") {
305
+ const text = payload.message?.trim();
306
+ if (text && text.length > 0 && text.length < 200) {
307
+ return { type: "text", text, model: model ?? void 0 };
308
+ }
309
+ }
310
+ if (eventType === "agent_reasoning") {
311
+ const text = payload.text?.trim();
312
+ if (!text)
313
+ return null;
314
+ return {
315
+ type: "tool_use",
316
+ toolName: "thinking",
317
+ toolInput: { thought: text.slice(0, 120) },
318
+ model: model ?? void 0
319
+ };
320
+ }
321
+ return null;
322
+ }
323
+ };
324
+ export {
325
+ CodexParser
326
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-parser.js","sourceRoot":"","sources":["../../../src/watcher/codex/codex-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAsC3E,8EAA8E;AAE9E,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,QAAQ,CAAC,IAAY;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,GAAoB,CAAC;YAC9B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAuB;QACvC,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,QAAQ,CAAC,OAAsC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAuB;QACjC,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,KAA2B,CAAC;QAC5D,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,QAAuB,EAAE,KAAoB;QACtD,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,iBAAiB,CAAC,OAAgC,EAAE,KAAoB;QAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAc,CAAC;QAExC,2BAA2B;QAC3B,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,OAAyC,CAAC;YACrD,IAAI,SAAS,GAA4B,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAE5B,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC;gBACpC,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;gBACxC,KAAK,EAAE,KAAK,IAAI,SAAS;aAC1B,CAAC;QACJ,CAAC;QAED,oFAAoF;QACpF,oFAAoF;QAEpF,qFAAqF;QACrF,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;YAC/D,2EAA2E;YAC3E,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,SAAS,GAA4B,EAAE,CAAC;YAC9C,0CAA0C;YAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAA6C,CAAC;YACrE,IAAI,MAAM,EAAE,KAAK;gBAAE,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAClD,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC;gBACvC,SAAS;gBACT,KAAK,EAAE,KAAK,IAAI,SAAS;aAC1B,CAAC;QACJ,CAAC;QAED,8EAA8E;QAC9E,sFAAsF;QAEtF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,OAAgC,EAAE,KAAoB;QAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,IAAc,CAAC;QAEzC,cAAc;QACd,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAkC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,gBAAgB;gBAAE,OAAO,IAAI,CAAC;YAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACpC,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,KAAK,CAAC,YAAY;gBAC/B,YAAY,EAAE,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;gBAC/E,eAAe,EAAE,KAAK,CAAC,mBAAmB;gBAC1C,KAAK,EAAE,KAAK,IAAI,SAAS;aAC1B,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,GAAI,OAAO,CAAC,OAAkB,EAAE,IAAI,EAAE,CAAC;YACjD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACpC,MAAM,IAAI,GAAI,OAAO,CAAC,IAAe,EAAE,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBAC1C,KAAK,EAAE,KAAK,IAAI,SAAS;aAC1B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { SessionInfo } from '../types.js';
2
+ /**
3
+ * Get the Codex CLI sessions directory.
4
+ * Codex stores sessions at: ~/.codex/sessions/
5
+ */
6
+ export declare function getCodexSessionsDir(): string | null;
7
+ /**
8
+ * Codex session_meta payload from the first JSONL entry.
9
+ */
10
+ export interface CodexSessionMeta {
11
+ session_id: string;
12
+ cwd?: string;
13
+ cli_version?: string;
14
+ model_provider?: string;
15
+ git?: {
16
+ branch?: string;
17
+ commit?: string;
18
+ repo_url?: string;
19
+ };
20
+ }
21
+ /**
22
+ * Extract session ID from a Codex rollout filename.
23
+ * Format: rollout-YYYY-MM-DDTHH-MM-SS-{uuid}.jsonl
24
+ * Returns a prefixed session ID.
25
+ */
26
+ export declare function extractCodexSessionId(filePath: string): string;
27
+ /**
28
+ * Build SessionInfo from a Codex session_meta payload.
29
+ */
30
+ export declare function parseCodexSessionInfo(meta: CodexSessionMeta): SessionInfo;
31
+ /**
32
+ * Build SessionInfo for a Codex subagent spawned via spawn_agent.
33
+ */
34
+ export declare function createCodexSubagentSession(parentSessionId: string, parentInfo: SessionInfo): SessionInfo;
35
+ //# sourceMappingURL=codex-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-paths.d.ts","sourceRoot":"","sources":["../../../src/watcher/codex/codex-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,WAAW,CAczE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,WAAW,GACtB,WAAW,CASb"}
@@ -0,0 +1,46 @@
1
+ // dist/watcher/codex/codex-paths.js
2
+ import { homedir } from "os";
3
+ import { join, basename } from "path";
4
+ import { existsSync } from "fs";
5
+ function getCodexSessionsDir() {
6
+ const candidate = join(homedir(), ".codex", "sessions");
7
+ return existsSync(candidate) ? candidate : null;
8
+ }
9
+ var UUID_RE = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;
10
+ function extractCodexSessionId(filePath) {
11
+ const name = basename(filePath, ".jsonl");
12
+ const match = name.match(UUID_RE);
13
+ if (match) {
14
+ return `codex:${match[1]}`;
15
+ }
16
+ return `codex:${name}`;
17
+ }
18
+ function parseCodexSessionInfo(meta) {
19
+ const cwd = meta.cwd || "codex";
20
+ const parts = cwd.replace(/\\/g, "/").split("/").filter(Boolean);
21
+ const projectName = parts[parts.length - 1] || "codex";
22
+ return {
23
+ agentType: "codex",
24
+ projectPath: cwd,
25
+ projectName,
26
+ isSubagent: false,
27
+ projectDir: cwd,
28
+ parentSessionId: null
29
+ };
30
+ }
31
+ function createCodexSubagentSession(parentSessionId, parentInfo) {
32
+ return {
33
+ agentType: "codex",
34
+ projectPath: parentInfo.projectPath,
35
+ projectName: parentInfo.projectName,
36
+ isSubagent: true,
37
+ projectDir: parentInfo.projectDir,
38
+ parentSessionId
39
+ };
40
+ }
41
+ export {
42
+ createCodexSubagentSession,
43
+ extractCodexSessionId,
44
+ getCodexSessionsDir,
45
+ parseCodexSessionInfo
46
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-paths.js","sourceRoot":"","sources":["../../../src/watcher/codex/codex-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAiBD,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAsB;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;IAChC,2DAA2D;IAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;IAEvD,OAAO;QACL,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,GAAG;QAChB,WAAW;QACX,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,GAAG;QACf,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,eAAuB,EACvB,UAAuB;IAEvB,OAAO;QACL,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { AgentStateManager } from '../../state/agent-state-manager.js';
2
+ import type { AgentWatcher } from '../agent-watcher.js';
3
+ /**
4
+ * Watches Codex CLI session JSONL files for new activity.
5
+ *
6
+ * Codex stores sessions at: ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{uuid}.jsonl
7
+ * Each line is a JSON envelope: {timestamp, type, payload}
8
+ * Types include: session_meta, response_item, event_msg, turn_context
9
+ */
10
+ export declare class CodexWatcher implements AgentWatcher {
11
+ private stateManager;
12
+ private watcher;
13
+ private byteOffsets;
14
+ private parser;
15
+ /** Per-file lock to prevent concurrent processFile calls */
16
+ private fileLocks;
17
+ /** Cached session info per file (parsed from session_meta) */
18
+ private sessionInfoCache;
19
+ /** Per-file model tracking (from turn_context events) */
20
+ private fileModels;
21
+ /** Deduplication of spawn_agent call IDs already processed */
22
+ private seenSubagentCalls;
23
+ /** Counter for generating unique subagent session IDs */
24
+ private subagentCounter;
25
+ constructor(stateManager: AgentStateManager);
26
+ start(): Promise<void>;
27
+ stop(): void;
28
+ /**
29
+ * Recursively scan for recently-modified JSONL files under the sessions dir.
30
+ * Codex nests files as sessions/YYYY/MM/DD/rollout-*.jsonl.
31
+ */
32
+ private scanDeep;
33
+ private processFile;
34
+ private doProcessFile;
35
+ /**
36
+ * When a spawn_agent tool call is detected, create a synthetic subagent session
37
+ * so the visualization shows the child agent.
38
+ */
39
+ private handleSubagentSpawn;
40
+ private buildFallbackSession;
41
+ }
42
+ //# sourceMappingURL=codex-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-watcher.d.ts","sourceRoot":"","sources":["../../../src/watcher/codex/codex-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,YAAY;IAenC,OAAO,CAAC,YAAY;IAdhC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,MAAM,CAAqB;IACnC,4DAA4D;IAC5D,OAAO,CAAC,SAAS,CAAoC;IACrD,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,yDAAyD;IACzD,OAAO,CAAC,UAAU,CAA6B;IAC/C,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,yDAAyD;IACzD,OAAO,CAAC,eAAe,CAAK;gBAER,YAAY,EAAE,iBAAiB;IAE7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC5B,IAAI,IAAI,IAAI;IASZ;;;OAGG;YACW,QAAQ;IA2BtB,OAAO,CAAC,WAAW;YAaL,aAAa;IA0E3B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,oBAAoB;CAI7B"}