@myagentroam/node 0.9.9 → 0.9.11

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 (214) hide show
  1. package/dist/capabilities.js +2 -92
  2. package/dist/claude-agent-sdk.js +2 -330
  3. package/dist/claude-channel.js +2 -44
  4. package/dist/codex-app-server.js +2 -503
  5. package/dist/config.js +2 -56
  6. package/dist/connector/node-connector-options.js +2 -1
  7. package/dist/connector/node-operation-router.js +2 -22
  8. package/dist/connector.js +2 -845
  9. package/dist/control-outbound-scheduler.js +2 -154
  10. package/dist/database.js +2 -1418
  11. package/dist/event-buffer.js +2 -19
  12. package/dist/fake-runner.js +2 -129
  13. package/dist/health.js +2 -3
  14. package/dist/main.js +2 -54
  15. package/dist/migrations/v001.js +3 -144
  16. package/dist/migrations/v002.js +2 -143
  17. package/dist/migrations/v003.js +2 -44
  18. package/dist/migrations/v004.js +34 -30
  19. package/dist/native-jsonl-reader.js +2 -186
  20. package/dist/native-session-history.js +2 -1119
  21. package/dist/opencode-runtime.js +2 -80
  22. package/dist/opencode-server.js +2 -263
  23. package/dist/operational.js +2 -122
  24. package/dist/process-tree.js +2 -18
  25. package/dist/rotating-log.js +2 -67
  26. package/dist/runner/abstract-runner.js +2 -232
  27. package/dist/runner/claude/managed-run-controller.js +2 -345
  28. package/dist/runner/claude-code-runner.js +2 -303
  29. package/dist/runner/codex/composer-image-markers.js +2 -0
  30. package/dist/runner/codex/conversation-parser.js +2 -861
  31. package/dist/runner/codex/managed-run-controller.js +2 -460
  32. package/dist/runner/codex-runner.js +2 -628
  33. package/dist/runner/fake-test-runner.js +2 -47
  34. package/dist/runner/opencode/conversation-parser.js +2 -221
  35. package/dist/runner/opencode/managed-run-controller.js +2 -537
  36. package/dist/runner/opencode-runner.js +2 -448
  37. package/dist/runner/runner-registry.js +2 -90
  38. package/dist/runner-command-engine.js +2 -70
  39. package/dist/runner-profiles.js +2 -215
  40. package/dist/runner-usage.js +2 -190
  41. package/dist/runtime-command-detector.js +2 -73
  42. package/dist/runtime-state.js +2 -982
  43. package/dist/service/attachment-domain-state.js +2 -7
  44. package/dist/service/conversation-history-service.js +2 -457
  45. package/dist/service/conversation-segment-service.js +2 -162
  46. package/dist/service/external-session-resume-service.js +2 -118
  47. package/dist/service/fake-managed-run-service.js +2 -60
  48. package/dist/service/managed-runner-session-service.js +2 -35
  49. package/dist/service/mcp-installation-verifier.js +2 -87
  50. package/dist/service/mcp-node-operation-service.js +2 -90
  51. package/dist/service/mcp-package-installer.js +2 -136
  52. package/dist/service/native-session-projection-service.js +2 -280
  53. package/dist/service/native-session-watch-service.js +2 -383
  54. package/dist/service/node-connection-lifecycle-service.js +2 -84
  55. package/dist/service/node-control-channel.js +2 -85
  56. package/dist/service/node-control-message-service.js +2 -107
  57. package/dist/service/node-request-service.js +2 -52
  58. package/dist/service/node-run-event-bridge.js +2 -83
  59. package/dist/service/node-terminal-channel.js +2 -182
  60. package/dist/service/node-upgrade-coordinator.js +2 -137
  61. package/dist/service/node-workspace-coordinator.js +2 -70
  62. package/dist/service/recent-run-projection-service.js +2 -78
  63. package/dist/service/run-attachment-service.js +2 -194
  64. package/dist/service/run-domain-state.js +2 -4
  65. package/dist/service/run-event-service.js +2 -193
  66. package/dist/service/run-workbench-service.js +2 -104
  67. package/dist/service/runner-channel-message-service.js +2 -20
  68. package/dist/service/runner-interaction-service.js +2 -243
  69. package/dist/service/runner-service.js +2 -71
  70. package/dist/service/session-catalog-service.js +2 -224
  71. package/dist/service/session-command-service.js +2 -76
  72. package/dist/service/session-context-service.js +2 -101
  73. package/dist/service/session-domain-state.js +2 -9
  74. package/dist/service/session-identity-service.js +2 -86
  75. package/dist/service/session-lifecycle-service.js +2 -240
  76. package/dist/service/session-message-service.js +2 -173
  77. package/dist/service/session-presentation-service.js +2 -43
  78. package/dist/service/session-query-service.js +2 -82
  79. package/dist/service/skill-directory-service.js +2 -238
  80. package/dist/service/skill-install-service.js +2 -434
  81. package/dist/service/skill-node-operation-service.js +2 -206
  82. package/dist/service/terminal-relay-state.js +2 -3
  83. package/dist/service/terminal-service.js +2 -52
  84. package/dist/service/workbench-event-service.js +2 -19
  85. package/dist/service/workbench-manifest-service.js +2 -69
  86. package/dist/service/workspace-change-service.js +2 -86
  87. package/dist/service/workspace-content-search-service.js +2 -477
  88. package/dist/service/workspace-domain-state.js +2 -41
  89. package/dist/service/workspace-file-service.js +2 -122
  90. package/dist/service/workspace-git-exclude-service.js +2 -119
  91. package/dist/service/workspace-queue-workbench-service.js +2 -304
  92. package/dist/service/workspace-service.js +2 -69
  93. package/dist/service/workspace-session-service.js +2 -139
  94. package/dist/service/workspace-upload-service.js +2 -262
  95. package/dist/service/workspace-watch-service.js +2 -146
  96. package/dist/service/workspace-workbench-service.js +2 -405
  97. package/dist/service.js +2 -38
  98. package/dist/storage.js +2 -32
  99. package/dist/supervisor.js +2 -136
  100. package/dist/terminal.js +2 -416
  101. package/dist/util/node-operation-parsers.js +2 -382
  102. package/dist/util/personal-instructions.js +2 -31
  103. package/dist/util/runner-error.js +2 -52
  104. package/dist/util/runner-native-session-parsers.js +2 -490
  105. package/dist/util/safe-error.js +2 -5
  106. package/dist/util/secret-environment.js +2 -25
  107. package/dist/workspace.js +2 -1519
  108. package/package.json +3 -3
  109. package/dist/capabilities.d.ts +0 -12
  110. package/dist/claude-agent-sdk.d.ts +0 -92
  111. package/dist/claude-channel.d.ts +0 -28
  112. package/dist/codex-app-server.d.ts +0 -133
  113. package/dist/config.d.ts +0 -18
  114. package/dist/connector/node-connector-options.d.ts +0 -27
  115. package/dist/connector/node-operation-router.d.ts +0 -9
  116. package/dist/connector.d.ts +0 -94
  117. package/dist/control-outbound-scheduler.d.ts +0 -29
  118. package/dist/database.d.ts +0 -305
  119. package/dist/event-buffer.d.ts +0 -9
  120. package/dist/fake-runner.d.ts +0 -42
  121. package/dist/health.d.ts +0 -4
  122. package/dist/main.d.ts +0 -2
  123. package/dist/migrations/v001.d.ts +0 -3
  124. package/dist/migrations/v002.d.ts +0 -4
  125. package/dist/migrations/v003.d.ts +0 -4
  126. package/dist/migrations/v004.d.ts +0 -4
  127. package/dist/native-jsonl-reader.d.ts +0 -35
  128. package/dist/native-session-history.d.ts +0 -126
  129. package/dist/opencode-runtime.d.ts +0 -33
  130. package/dist/opencode-server.d.ts +0 -49
  131. package/dist/operational.d.ts +0 -39
  132. package/dist/process-tree.d.ts +0 -9
  133. package/dist/rotating-log.d.ts +0 -17
  134. package/dist/runner/abstract-runner.d.ts +0 -172
  135. package/dist/runner/claude/managed-run-controller.d.ts +0 -51
  136. package/dist/runner/claude-code-runner.d.ts +0 -72
  137. package/dist/runner/codex/conversation-parser.d.ts +0 -59
  138. package/dist/runner/codex/managed-run-controller.d.ts +0 -90
  139. package/dist/runner/codex-runner.d.ts +0 -103
  140. package/dist/runner/fake-test-runner.d.ts +0 -26
  141. package/dist/runner/opencode/conversation-parser.d.ts +0 -31
  142. package/dist/runner/opencode/managed-run-controller.d.ts +0 -82
  143. package/dist/runner/opencode-runner.d.ts +0 -71
  144. package/dist/runner/runner-registry.d.ts +0 -19
  145. package/dist/runner-command-engine.d.ts +0 -28
  146. package/dist/runner-profiles.d.ts +0 -15
  147. package/dist/runner-usage.d.ts +0 -33
  148. package/dist/runtime-command-detector.d.ts +0 -3
  149. package/dist/runtime-state.d.ts +0 -171
  150. package/dist/service/attachment-domain-state.d.ts +0 -7
  151. package/dist/service/conversation-history-service.d.ts +0 -43
  152. package/dist/service/conversation-segment-service.d.ts +0 -20
  153. package/dist/service/external-session-resume-service.d.ts +0 -34
  154. package/dist/service/fake-managed-run-service.d.ts +0 -28
  155. package/dist/service/managed-runner-session-service.d.ts +0 -12
  156. package/dist/service/mcp-installation-verifier.d.ts +0 -9
  157. package/dist/service/mcp-node-operation-service.d.ts +0 -11
  158. package/dist/service/mcp-package-installer.d.ts +0 -8
  159. package/dist/service/native-session-projection-service.d.ts +0 -52
  160. package/dist/service/native-session-watch-service.d.ts +0 -62
  161. package/dist/service/node-connection-lifecycle-service.d.ts +0 -36
  162. package/dist/service/node-control-channel.d.ts +0 -32
  163. package/dist/service/node-control-message-service.d.ts +0 -27
  164. package/dist/service/node-request-service.d.ts +0 -14
  165. package/dist/service/node-run-event-bridge.d.ts +0 -40
  166. package/dist/service/node-terminal-channel.d.ts +0 -29
  167. package/dist/service/node-upgrade-coordinator.d.ts +0 -29
  168. package/dist/service/node-workspace-coordinator.d.ts +0 -29
  169. package/dist/service/recent-run-projection-service.d.ts +0 -14
  170. package/dist/service/run-attachment-service.d.ts +0 -38
  171. package/dist/service/run-domain-state.d.ts +0 -4
  172. package/dist/service/run-event-service.d.ts +0 -33
  173. package/dist/service/run-workbench-service.d.ts +0 -25
  174. package/dist/service/runner-channel-message-service.d.ts +0 -13
  175. package/dist/service/runner-interaction-service.d.ts +0 -39
  176. package/dist/service/runner-service.d.ts +0 -46
  177. package/dist/service/session-catalog-service.d.ts +0 -45
  178. package/dist/service/session-command-service.d.ts +0 -24
  179. package/dist/service/session-context-service.d.ts +0 -35
  180. package/dist/service/session-domain-state.d.ts +0 -9
  181. package/dist/service/session-identity-service.d.ts +0 -24
  182. package/dist/service/session-lifecycle-service.d.ts +0 -31
  183. package/dist/service/session-message-service.d.ts +0 -33
  184. package/dist/service/session-presentation-service.d.ts +0 -34
  185. package/dist/service/session-query-service.d.ts +0 -35
  186. package/dist/service/skill-directory-service.d.ts +0 -20
  187. package/dist/service/skill-install-service.d.ts +0 -21
  188. package/dist/service/skill-node-operation-service.d.ts +0 -44
  189. package/dist/service/terminal-relay-state.d.ts +0 -6
  190. package/dist/service/terminal-service.d.ts +0 -12
  191. package/dist/service/workbench-event-service.d.ts +0 -9
  192. package/dist/service/workbench-manifest-service.d.ts +0 -90
  193. package/dist/service/workspace-change-service.d.ts +0 -9
  194. package/dist/service/workspace-content-search-service.d.ts +0 -14
  195. package/dist/service/workspace-domain-state.d.ts +0 -79
  196. package/dist/service/workspace-file-service.d.ts +0 -18
  197. package/dist/service/workspace-git-exclude-service.d.ts +0 -4
  198. package/dist/service/workspace-queue-workbench-service.d.ts +0 -86
  199. package/dist/service/workspace-service.d.ts +0 -15
  200. package/dist/service/workspace-session-service.d.ts +0 -23
  201. package/dist/service/workspace-upload-service.d.ts +0 -39
  202. package/dist/service/workspace-watch-service.d.ts +0 -23
  203. package/dist/service/workspace-workbench-service.d.ts +0 -58
  204. package/dist/service.d.ts +0 -4
  205. package/dist/storage.d.ts +0 -2
  206. package/dist/supervisor.d.ts +0 -1
  207. package/dist/terminal.d.ts +0 -133
  208. package/dist/util/node-operation-parsers.d.ts +0 -92
  209. package/dist/util/personal-instructions.d.ts +0 -2
  210. package/dist/util/runner-error.d.ts +0 -6
  211. package/dist/util/runner-native-session-parsers.d.ts +0 -74
  212. package/dist/util/safe-error.d.ts +0 -2
  213. package/dist/util/secret-environment.d.ts +0 -1
  214. package/dist/workspace.d.ts +0 -217
@@ -1,1119 +1,2 @@
1
- import { createHash } from 'node:crypto';
2
- import { readFile, readdir, stat, unlink } from 'node:fs/promises';
3
- import { homedir } from 'node:os';
4
- import { basename, join, resolve } from 'node:path';
5
- import { forEachJsonlRecord, listJsonlFiles, mapConcurrent, readJsonlBackwardWindow, readJsonlFileAnchor, readJsonlWindow } from './native-jsonl-reader.js';
6
- import { nodeLog } from './operational.js';
7
- import { stripClaudePlanTag } from './runner-command-engine.js';
8
- const DISCOVERY_READ_BYTES = 32 * 1024;
9
- const TRANSCRIPT_HEADER_READ_BYTES = 32 * 1024;
10
- const TRANSCRIPT_READ_MAX_BYTES = 16 * 1024 * 1024;
11
- const TRANSCRIPT_MIN_LINES = 256;
12
- const TRANSCRIPT_MAX_LINES = 4096;
13
- const TRANSCRIPT_LINES_PER_TURN = 32;
14
- const CONTEXT_USAGE_READ_BYTES = 256 * 1024;
15
- const CLAUDE_CONTEXT_USAGE_READ_BYTES = [CONTEXT_USAGE_READ_BYTES, 1024 * 1024, 4 * 1024 * 1024];
16
- const TRANSCRIPT_INDEX_TTL_MS = 60 * 60_000;
17
- const DISCOVERY_SNAPSHOT_TTL_MS = 15_000;
18
- const TRANSCRIPT_DETAIL_CACHE_TTL_MS = 60_000;
19
- const TRANSCRIPT_DETAIL_CACHE_MAX_ENTRIES = 16;
20
- const transcriptIndex = new Map();
21
- const transcriptIndexTimers = new Map();
22
- const transcriptDetailCache = new Map();
23
- const transcriptDetailReads = new Map();
24
- const discoveryReads = new Map();
25
- const discoverySnapshots = new Map();
26
- const discoveryGenerations = new Map();
27
- const DEFAULT_CLAUDE_CONTEXT_WINDOW_TOKENS = 200_000;
28
- const CLAUDE_CONTEXT_WINDOW_ENV = 'MAR_CLAUDE_CONTEXT_WINDOW_TOKENS';
29
- /**
30
- * Read-only adapter for the supported vendor JSONL stores. It requires an
31
- * explicit cwd on the record and returns normalized visible messages and tool
32
- * cards; no raw vendor events or hidden reasoning are exposed to the Workbench.
33
- */
34
- export async function discoverNativeSessions(runner, workspacePath) {
35
- const wanted = canonical(workspacePath);
36
- return (await discoverAllNativeSessions(runner)).filter((value) => canonical(value.cwd) === wanted);
37
- }
38
- /**
39
- * Reads every supported transcript header before applying a Workspace filter.
40
- * A short Runner-level snapshot is shared across Workspaces and refreshes only
41
- * files whose size or modification time changed. A fixed file-count cutoff
42
- * would silently hide older sessions from a project with a large global history.
43
- */
44
- export async function discoverAllNativeSessions(runner) {
45
- const key = discoveryKey(runner);
46
- const snapshot = discoverySnapshots.get(key);
47
- if (snapshot !== undefined && snapshot.expiresAt > Date.now()) {
48
- snapshot.cacheHits += 1;
49
- return snapshot.sessions;
50
- }
51
- const current = discoveryReads.get(key);
52
- if (current !== undefined) {
53
- nodeLog('native.session.discovery.single-flight-joined', { runner });
54
- return current;
55
- }
56
- const generation = discoveryGenerations.get(key) ?? 0;
57
- const discovery = performNativeSessionDiscovery(runner, snapshot)
58
- .then((next) => {
59
- if ((discoveryGenerations.get(key) ?? 0) === generation)
60
- discoverySnapshots.set(key, next);
61
- return next.sessions;
62
- })
63
- .finally(() => {
64
- if (discoveryReads.get(key) === discovery)
65
- discoveryReads.delete(key);
66
- });
67
- discoveryReads.set(key, discovery);
68
- return discovery;
69
- }
70
- async function performNativeSessionDiscovery(runner, previous) {
71
- const startedAt = performance.now();
72
- const found = new Map();
73
- nodeLog('native.session.discovery.started', { runner });
74
- const files = (await listJsonlFiles(transcriptRoot(runner))).filter((path) => runner !== 'claude-code' || !path.split(/[\\/]/u).includes('subagents'));
75
- nodeLog('native.session.discovery.files-listed', {
76
- runner,
77
- files: files.length,
78
- durationMs: Math.round(performance.now() - startedAt)
79
- });
80
- let completed = 0;
81
- let parsedCount = 0;
82
- let reusedCount = 0;
83
- let metadataFailures = 0;
84
- let metadataWorkMs = 0;
85
- let parseWorkMs = 0;
86
- const discoveredFiles = await mapConcurrent(files, 32, async (path) => {
87
- let fingerprint;
88
- const metadataStartedAt = performance.now();
89
- try {
90
- const metadata = await stat(path);
91
- fingerprint = `${metadata.size}:${metadata.mtimeMs}`;
92
- }
93
- catch {
94
- metadataFailures += 1;
95
- return undefined;
96
- }
97
- finally {
98
- metadataWorkMs += performance.now() - metadataStartedAt;
99
- }
100
- const cached = previous?.files.get(path);
101
- let parsed;
102
- if (cached?.fingerprint === fingerprint) {
103
- parsed = cached.parsed;
104
- reusedCount += 1;
105
- }
106
- else {
107
- const parseStartedAt = performance.now();
108
- parsed = await readTranscript(path, runner, DISCOVERY_READ_BYTES);
109
- parseWorkMs += performance.now() - parseStartedAt;
110
- parsedCount += 1;
111
- }
112
- completed += 1;
113
- if (completed % 250 === 0)
114
- nodeLog('native.session.discovery.progress', {
115
- runner,
116
- completed,
117
- files: files.length,
118
- parsedFiles: parsedCount,
119
- reusedFiles: reusedCount,
120
- metadataFailures,
121
- metadataWorkMs: Math.round(metadataWorkMs),
122
- parseWorkMs: Math.round(parseWorkMs),
123
- durationMs: Math.round(performance.now() - startedAt)
124
- });
125
- return { path, fingerprint, parsed };
126
- });
127
- const snapshotFiles = new Map();
128
- for (const file of discoveredFiles) {
129
- if (file === undefined)
130
- continue;
131
- snapshotFiles.set(file.path, { fingerprint: file.fingerprint, parsed: file.parsed });
132
- const parsed = file.parsed;
133
- // Discovery only needs a session identity, cwd and an optional early
134
- // title. Loading entire JSONL files here made opening a Workspace depend
135
- // on the total history of every other project on the Node.
136
- if (parsed === undefined)
137
- continue;
138
- const cwd = canonical(parsed.cwd);
139
- setTranscriptIndex(indexKey(runner, cwd, parsed.externalSessionId), file.path);
140
- found.set(`${cwd}\u0000${parsed.externalSessionId}`, parsed);
141
- }
142
- nodeLog('native.session.discovery.completed', {
143
- runner,
144
- files: files.length,
145
- sessions: found.size,
146
- parsedFiles: parsedCount,
147
- reusedFiles: reusedCount,
148
- unparsedFiles: [...snapshotFiles.values()].filter((file) => file.parsed === undefined).length,
149
- metadataFailures,
150
- metadataWorkMs: Math.round(metadataWorkMs),
151
- parseWorkMs: Math.round(parseWorkMs),
152
- cacheMode: previous === undefined ? 'cold' : 'refresh',
153
- previousCacheHits: previous?.cacheHits ?? 0,
154
- durationMs: Math.round(performance.now() - startedAt)
155
- });
156
- return {
157
- expiresAt: Date.now() + DISCOVERY_SNAPSHOT_TTL_MS,
158
- files: snapshotFiles,
159
- sessions: [...found.values()],
160
- cacheHits: 0
161
- };
162
- }
163
- /** Reads one already-discovered external session again to follow appended JSONL records. */
164
- export async function readNativeSession(runner, workspacePath, externalSessionId, page, limit = 30) {
165
- const wanted = canonical(workspacePath);
166
- const path = getTranscriptIndex(indexKey(runner, wanted, externalSessionId));
167
- if (path === undefined)
168
- return undefined;
169
- const detail = await readTranscriptDetail(path, runner, page, page?.readLimit ?? limit);
170
- const parsed = detail?.history;
171
- if (parsed === undefined ||
172
- parsed.externalSessionId !== externalSessionId ||
173
- canonical(parsed.cwd) !== wanted) {
174
- deleteTranscriptIndex(indexKey(runner, wanted, externalSessionId));
175
- return undefined;
176
- }
177
- return detail?.cursorAccepted === false ? { ...parsed, cursorReset: true } : parsed;
178
- }
179
- async function readTranscriptDetail(path, runner, page, limit) {
180
- let fingerprint;
181
- try {
182
- const metadata = await stat(path);
183
- fingerprint = `${metadata.size}:${metadata.mtimeMs}`;
184
- }
185
- catch {
186
- return undefined;
187
- }
188
- const metadataSize = Number(fingerprint.slice(0, fingerprint.indexOf(':')));
189
- const validPage = page !== undefined &&
190
- page.snapshotEnd <= metadataSize &&
191
- (await readJsonlFileAnchor(path, page.anchorBytes)) === page.fileAnchor
192
- ? page
193
- : undefined;
194
- const targetLines = Math.min(TRANSCRIPT_MAX_LINES, Math.max(TRANSCRIPT_MIN_LINES, Math.max(1, limit) * TRANSCRIPT_LINES_PER_TURN));
195
- const pageKey = `${validPage === undefined
196
- ? 'latest'
197
- : `${validPage.fileAnchor}:${validPage.snapshotEnd}:${validPage.nextEnd}`}:${targetLines}`;
198
- const key = `${runner}\u0000${path}\u0000${pageKey}`;
199
- const cacheFingerprint = validPage === undefined ? fingerprint : `${validPage.fileAnchor}:${validPage.snapshotEnd}`;
200
- const cached = transcriptDetailCache.get(key);
201
- if (cached?.fingerprint === cacheFingerprint && cached.expiresAt > Date.now()) {
202
- cached.expiresAt = Date.now() + TRANSCRIPT_DETAIL_CACHE_TTL_MS;
203
- transcriptDetailCache.delete(key);
204
- transcriptDetailCache.set(key, cached);
205
- return {
206
- history: cached.parsed,
207
- cursorAccepted: page === undefined || validPage !== undefined
208
- };
209
- }
210
- transcriptDetailCache.delete(key);
211
- const current = transcriptDetailReads.get(key);
212
- if (current?.fingerprint === cacheFingerprint) {
213
- nodeLog('native.session.history.single-flight-joined', { runner });
214
- return {
215
- history: await current.read,
216
- cursorAccepted: page === undefined || validPage !== undefined
217
- };
218
- }
219
- const startedAt = performance.now();
220
- const read = readTranscript(path, runner, TRANSCRIPT_READ_MAX_BYTES, validPage, targetLines)
221
- .then((parsed) => parsed === undefined ? undefined : { ...parsed, windowReadLimit: page?.readLimit ?? limit })
222
- .then((parsed) => {
223
- if (transcriptDetailReads.get(key)?.read === read) {
224
- transcriptDetailCache.set(key, {
225
- fingerprint: cacheFingerprint,
226
- parsed,
227
- expiresAt: Date.now() + TRANSCRIPT_DETAIL_CACHE_TTL_MS
228
- });
229
- pruneTranscriptDetailCache();
230
- }
231
- const durationMs = Math.round(performance.now() - startedAt);
232
- if (durationMs >= 250)
233
- nodeLog('native.session.history.detail-parse.completed', {
234
- runner,
235
- bytes: Number(fingerprint.slice(0, fingerprint.indexOf(':'))),
236
- durationMs
237
- });
238
- return parsed;
239
- })
240
- .finally(() => {
241
- if (transcriptDetailReads.get(key)?.read === read)
242
- transcriptDetailReads.delete(key);
243
- });
244
- transcriptDetailReads.set(key, { fingerprint: cacheFingerprint, read });
245
- return { history: await read, cursorAccepted: page === undefined || validPage !== undefined };
246
- }
247
- function pruneTranscriptDetailCache() {
248
- const now = Date.now();
249
- for (const [key, cached] of transcriptDetailCache)
250
- if (cached.expiresAt <= now)
251
- transcriptDetailCache.delete(key);
252
- while (transcriptDetailCache.size > TRANSCRIPT_DETAIL_CACHE_MAX_ENTRIES) {
253
- const oldest = transcriptDetailCache.keys().next().value;
254
- if (oldest === undefined)
255
- return;
256
- transcriptDetailCache.delete(oldest);
257
- }
258
- }
259
- /**
260
- * Codex records the most recent prompt token count alongside the model context
261
- * window in `event_msg/token_count`. Read only the tail of an already
262
- * discovered transcript: the count is append-only and never needs a costly
263
- * full-history scan.
264
- */
265
- export async function readCodexNativeContextUsage(workspacePath, externalSessionId) {
266
- const wanted = canonical(workspacePath);
267
- let path = getTranscriptIndex(indexKey('codex', wanted, externalSessionId));
268
- if (path === undefined) {
269
- await discoverNativeSessions('codex', workspacePath);
270
- path = getTranscriptIndex(indexKey('codex', wanted, externalSessionId));
271
- }
272
- if (path === undefined)
273
- return undefined;
274
- const window = await readJsonlWindow(path, { tailBytes: CONTEXT_USAGE_READ_BYTES });
275
- if (window === undefined)
276
- return undefined;
277
- let usage;
278
- forEachJsonlRecord(window.content, (record) => {
279
- const next = codexContextUsage(record);
280
- if (next !== undefined)
281
- usage = next;
282
- });
283
- return usage;
284
- }
285
- /** Reads the latest actual Claude prompt occupancy without starting a CLI/SDK control stream. */
286
- export async function readClaudeNativeContextUsage(workspacePath, externalSessionId, options = {}) {
287
- const wanted = canonical(workspacePath);
288
- let path = getTranscriptIndex(indexKey('claude-code', wanted, externalSessionId));
289
- path ??= await locateClaudeTranscript(wanted, externalSessionId);
290
- if (path === undefined) {
291
- await discoverNativeSessions('claude-code', workspacePath);
292
- path = getTranscriptIndex(indexKey('claude-code', wanted, externalSessionId));
293
- }
294
- if (path === undefined)
295
- return undefined;
296
- const latest = await readLatestClaudeContextUsage(path);
297
- if (latest === undefined)
298
- return undefined;
299
- return {
300
- ...latest,
301
- maxTokens: await claudeContextWindowTokens(options)
302
- };
303
- }
304
- async function readLatestClaudeContextUsage(path) {
305
- for (const tailBytes of CLAUDE_CONTEXT_USAGE_READ_BYTES) {
306
- const window = await readJsonlWindow(path, { tailBytes });
307
- if (window === undefined)
308
- return undefined;
309
- let latest;
310
- forEachJsonlRecord(window.content, (record) => {
311
- const usage = claudeContextUsage(record);
312
- if (usage !== undefined)
313
- latest = usage;
314
- });
315
- if (latest !== undefined)
316
- return latest;
317
- if (!window.truncated)
318
- return undefined;
319
- }
320
- return undefined;
321
- }
322
- /** Claude main transcripts use the native session ID as their filename. */
323
- async function locateClaudeTranscript(wantedCwd, externalSessionId) {
324
- const root = transcriptRoot('claude-code');
325
- let entries;
326
- try {
327
- entries = await readdir(root, { withFileTypes: true });
328
- }
329
- catch {
330
- return undefined;
331
- }
332
- const candidates = entries
333
- .filter((entry) => entry.isDirectory())
334
- .map((entry) => join(root, entry.name, `${externalSessionId}.jsonl`));
335
- const parsed = await mapConcurrent(candidates, 16, async (path) => ({
336
- path,
337
- history: await readTranscript(path, 'claude-code', DISCOVERY_READ_BYTES)
338
- }));
339
- const match = parsed.find(({ history }) => history?.externalSessionId === externalSessionId && canonical(history.cwd) === wantedCwd);
340
- if (match === undefined)
341
- return undefined;
342
- setTranscriptIndex(indexKey('claude-code', wantedCwd, externalSessionId), match.path);
343
- return match.path;
344
- }
345
- export async function claudeContextWindowTokens(options = {}) {
346
- const environment = options.environment ?? process.env;
347
- const direct = positiveInteger(environment[CLAUDE_CONTEXT_WINDOW_ENV]);
348
- if (direct !== undefined)
349
- return direct;
350
- try {
351
- const settings = JSON.parse(await readFile(options.settingsPath ?? join(homedir(), '.claude', 'settings.json'), 'utf8'));
352
- if (isRecord(settings) && isRecord(settings.env)) {
353
- const configured = positiveInteger(settings.env[CLAUDE_CONTEXT_WINDOW_ENV]);
354
- if (configured !== undefined)
355
- return configured;
356
- }
357
- }
358
- catch {
359
- // Missing or malformed optional Claude settings use the stable default.
360
- }
361
- return DEFAULT_CLAUDE_CONTEXT_WINDOW_TOKENS;
362
- }
363
- /**
364
- * Permanently removes exactly one previously discovered transcript. The
365
- * caller supplies no path: the in-process discovery index resolves it, then
366
- * the record is re-read and its runner/cwd/native ID are checked again before
367
- * unlinking. This keeps a destructive operation bounded to one known file.
368
- */
369
- export async function removeNativeSession(runner, workspacePath, externalSessionId) {
370
- const wanted = canonical(workspacePath);
371
- let path = getTranscriptIndex(indexKey(runner, wanted, externalSessionId));
372
- if (path === undefined) {
373
- await discoverNativeSessions(runner, workspacePath);
374
- path = getTranscriptIndex(indexKey(runner, wanted, externalSessionId));
375
- }
376
- if (path === undefined)
377
- throw new Error('NATIVE_TRANSCRIPT_UNAVAILABLE');
378
- const parsed = await readTranscript(path, runner, DISCOVERY_READ_BYTES);
379
- if (parsed === undefined ||
380
- parsed.externalSessionId !== externalSessionId ||
381
- canonical(parsed.cwd) !== wanted) {
382
- deleteTranscriptIndex(indexKey(runner, wanted, externalSessionId));
383
- throw new Error('NATIVE_TRANSCRIPT_UNAVAILABLE');
384
- }
385
- try {
386
- await unlink(path);
387
- }
388
- catch (error) {
389
- if (error.code === 'ENOENT')
390
- throw new Error('NATIVE_TRANSCRIPT_UNAVAILABLE');
391
- throw error;
392
- }
393
- deleteTranscriptIndex(indexKey(runner, wanted, externalSessionId));
394
- const detailKeyPrefix = `${runner}\u0000${path}\u0000`;
395
- for (const key of transcriptDetailCache.keys())
396
- if (key.startsWith(detailKeyPrefix))
397
- transcriptDetailCache.delete(key);
398
- for (const key of transcriptDetailReads.keys())
399
- if (key.startsWith(detailKeyPrefix))
400
- transcriptDetailReads.delete(key);
401
- invalidateNativeDiscovery(runner);
402
- }
403
- function transcriptRoot(runner) {
404
- return runner === 'codex'
405
- ? join(homedir(), '.codex', 'sessions')
406
- : join(homedir(), '.claude', 'projects');
407
- }
408
- function discoveryKey(runner) {
409
- return `${runner}\u0000${transcriptRoot(runner)}`;
410
- }
411
- function invalidateNativeDiscovery(runner) {
412
- const key = discoveryKey(runner);
413
- discoveryGenerations.set(key, (discoveryGenerations.get(key) ?? 0) + 1);
414
- discoverySnapshots.delete(key);
415
- discoveryReads.delete(key);
416
- }
417
- async function readTranscript(path, runner, byteLimit, page, targetLines = Number.MAX_SAFE_INTEGER) {
418
- const window = await readJsonlBackwardWindow(path, {
419
- headBytes: Math.min(byteLimit, TRANSCRIPT_HEADER_READ_BYTES),
420
- targetLines,
421
- maxBytes: byteLimit,
422
- ...(page === undefined ? {} : { page })
423
- });
424
- if (window === undefined)
425
- return undefined;
426
- const { content, truncated } = window;
427
- let cwd;
428
- let id;
429
- let derivedSession = false;
430
- const items = [];
431
- const toolIndexes = new Map();
432
- const pendingToolResults = new Map();
433
- const metaRecordIds = new Set();
434
- forEachJsonlRecord(content, (value) => {
435
- if (derivedTranscriptRecord(runner, value))
436
- derivedSession = true;
437
- cwd ??= workspacePath(value);
438
- id ??= sessionId(value);
439
- });
440
- forEachJsonlRecord(truncated ? window.pageContent : content, (value) => {
441
- const recordId = typeof value['uuid'] === 'string' ? value['uuid'] : undefined;
442
- const parentId = typeof value['parentUuid'] === 'string' ? value['parentUuid'] : undefined;
443
- if (value['isMeta'] === true && recordId !== undefined)
444
- metaRecordIds.add(recordId);
445
- if (isHiddenTranscriptRecord(value) ||
446
- (parentId !== undefined && metaRecordIds.has(parentId))) {
447
- return;
448
- }
449
- const generatedImage = codexGeneratedImageEvent(value);
450
- if (generatedImage !== undefined)
451
- items.push(generatedImage);
452
- for (const parsedItem of transcriptItems(value)) {
453
- const item = recordId === undefined ? parsedItem : { ...parsedItem, nativeId: recordId };
454
- if (item.kind === 'tool_result') {
455
- const toolIndex = toolIndexes.get(item.toolUseId);
456
- if (toolIndex === undefined)
457
- pendingToolResults.set(item.toolUseId, item);
458
- else
459
- items[toolIndex] = withToolResult(items[toolIndex], item);
460
- continue;
461
- }
462
- if (item.kind === 'tool_call') {
463
- const pending = pendingToolResults.get(item.toolUseId);
464
- const completed = pending === undefined ? item : withToolResult(item, pending);
465
- pendingToolResults.delete(item.toolUseId);
466
- toolIndexes.set(item.toolUseId, items.length);
467
- items.push(completed);
468
- continue;
469
- }
470
- items.push(item);
471
- }
472
- });
473
- if (derivedSession)
474
- return undefined;
475
- for (const result of pendingToolResults.values())
476
- items.push({
477
- kind: 'tool_call',
478
- toolUseId: result.toolUseId,
479
- toolName: 'Tool',
480
- input: null,
481
- inputSummary: null,
482
- inputTruncated: false,
483
- outputSummary: result.output,
484
- outputTruncated: result.truncated,
485
- ...(result.imageAttachments === undefined
486
- ? {}
487
- : { imageAttachments: result.imageAttachments }),
488
- failed: result.failed,
489
- createdAt: result.createdAt
490
- });
491
- if (cwd === undefined)
492
- return undefined;
493
- const title = items.find((item) => item.kind === 'message' && item.role === 'USER')?.text;
494
- // Tagged Plan Mode instruction labels do not form a session title.
495
- const strippedTitle = title === undefined ? undefined : stripClaudePlanTag(title);
496
- return {
497
- runner,
498
- externalSessionId: id ?? basename(path, '.jsonl'),
499
- cwd,
500
- ...(strippedTitle === undefined || strippedTitle.length === 0
501
- ? {}
502
- : { title: compact(strippedTitle) }),
503
- digest: createHash('sha256').update(content).digest('hex'),
504
- items,
505
- lastActivityAt: Math.max(0, ...items.map((item) => item.createdAt ?? 0)),
506
- truncated,
507
- windowStart: window.start,
508
- windowEnd: window.end,
509
- snapshotEnd: window.snapshotEnd,
510
- fileAnchor: window.fileAnchor,
511
- anchorBytes: window.anchorBytes
512
- };
513
- }
514
- function derivedTranscriptRecord(runner, value) {
515
- if (runner === 'claude-code')
516
- return value['isSidechain'] === true;
517
- if (runner !== 'codex' || value['type'] !== 'session_meta')
518
- return false;
519
- const payload = isRecord(value['payload']) ? value['payload'] : undefined;
520
- if (payload === undefined)
521
- return false;
522
- if (payload['thread_source'] === 'subagent')
523
- return true;
524
- const source = payload['source'];
525
- return (source === 'subagent' ||
526
- (isRecord(source) && (source['kind'] === 'subagent' || isRecord(source['subagent']))));
527
- }
528
- function workspacePath(record) {
529
- return (firstString(record, ['cwd', 'working_directory', 'workspacePath']) ??
530
- nestedString(record, ['payload', 'cwd']) ??
531
- nestedString(record, ['message', 'cwd']));
532
- }
533
- function sessionId(record) {
534
- // A Codex sub-agent transcript records its own thread in `payload.id`, but
535
- // retains the parent thread in `payload.session_id`. Treating the latter
536
- // as this file's identity makes the child file overwrite the parent thread
537
- // in the discovery index, which then shows unrelated messages for the
538
- // parent Chat.
539
- if (record['type'] === 'session_meta') {
540
- const transcriptId = nestedString(record, ['payload', 'id']);
541
- if (transcriptId !== undefined)
542
- return transcriptId;
543
- }
544
- return (firstString(record, ['sessionId', 'session_id', 'thread_id', 'conversationId']) ??
545
- nestedString(record, ['payload', 'id']) ??
546
- nestedString(record, ['payload', 'session_id']) ??
547
- nestedString(record, ['payload', 'thread_id']));
548
- }
549
- function codexContextUsage(value) {
550
- if (!isRecord(value) || value.type !== 'event_msg' || !isRecord(value.payload))
551
- return undefined;
552
- const payload = value.payload;
553
- if (payload.type !== 'token_count' || !isRecord(payload.info))
554
- return undefined;
555
- const promptUsage = payload.info.last_token_usage;
556
- const maxTokens = payload.info.model_context_window;
557
- if (!isRecord(promptUsage) ||
558
- typeof promptUsage.input_tokens !== 'number' ||
559
- typeof maxTokens !== 'number')
560
- return undefined;
561
- if (!Number.isFinite(promptUsage.input_tokens) ||
562
- !Number.isInteger(promptUsage.input_tokens) ||
563
- !Number.isFinite(maxTokens) ||
564
- !Number.isInteger(maxTokens) ||
565
- maxTokens <= 0 ||
566
- promptUsage.input_tokens < 0)
567
- return undefined;
568
- return { usedTokens: promptUsage.input_tokens, maxTokens };
569
- }
570
- function claudeContextUsage(value) {
571
- if (value.type !== 'assistant' || !isRecord(value.message))
572
- return undefined;
573
- const model = value.message.model;
574
- const usage = value.message.usage;
575
- if (typeof model !== 'string' ||
576
- model.length === 0 ||
577
- model === '<synthetic>' ||
578
- !isRecord(usage))
579
- return undefined;
580
- const inputTokens = nonNegativeInteger(usage.input_tokens);
581
- const cacheCreationTokens = optionalNonNegativeInteger(usage.cache_creation_input_tokens);
582
- const cacheReadTokens = optionalNonNegativeInteger(usage.cache_read_input_tokens);
583
- if (inputTokens === undefined ||
584
- cacheCreationTokens === undefined ||
585
- cacheReadTokens === undefined)
586
- return undefined;
587
- return { model, usedTokens: inputTokens + cacheCreationTokens + cacheReadTokens };
588
- }
589
- function optionalNonNegativeInteger(value) {
590
- return value === undefined ? 0 : nonNegativeInteger(value);
591
- }
592
- function nonNegativeInteger(value) {
593
- return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
594
- }
595
- function positiveInteger(value) {
596
- if (typeof value !== 'string' || !/^\d+$/.test(value.trim()))
597
- return undefined;
598
- const parsed = Number(value);
599
- return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
600
- }
601
- function transcriptItems(record) {
602
- const createdAt = timestampOf(record);
603
- const results = [...toolResultsOf(record, createdAt), ...codexToolResultsOf(record, createdAt)];
604
- if (results.length > 0)
605
- return results;
606
- const values = [
607
- ...toolUsesOf(record, createdAt),
608
- ...codexToolUsesOf(record, createdAt),
609
- ...codexReasoningSummariesOf(record, createdAt),
610
- ...unsupportedCodexResponseItems(record, createdAt),
611
- ...unsupportedTranscriptItems(record, createdAt)
612
- ];
613
- const role = roleOf(record);
614
- if (role === undefined)
615
- return values;
616
- const text = messageText(textOf(record) ?? '');
617
- if (text.length === 0)
618
- return values;
619
- // Codex transcripts can contain the host's injected AGENTS.md and runtime
620
- // context as a `user` item before the first actual prompt. It is neither a
621
- // user-visible chat turn nor a meaningful session title.
622
- if (role === 'USER' && isInjectedContextPrompt(text))
623
- return values;
624
- values.unshift({ kind: 'message', role, text, createdAt });
625
- return values;
626
- }
627
- function unsupportedCodexResponseItems(record, createdAt) {
628
- const payload = codexToolPayload(record);
629
- const type = typeof payload?.type === 'string' ? payload.type : undefined;
630
- if (type === undefined ||
631
- typeof payload?.role === 'string' ||
632
- type === 'reasoning' ||
633
- type === 'custom_tool_call' ||
634
- type === 'custom_tool_call_output' ||
635
- type === 'function_call' ||
636
- type === 'function_call_output')
637
- return [];
638
- return [
639
- {
640
- kind: 'unknown',
641
- sourceEventType: `codex:${type}`,
642
- label: `Codex ${compact(type).slice(0, 128)}`,
643
- createdAt
644
- }
645
- ];
646
- }
647
- function codexReasoningSummariesOf(record, createdAt) {
648
- const payload = codexToolPayload(record);
649
- if (payload?.type !== 'reasoning')
650
- return [];
651
- const sections = Array.isArray(payload.summary)
652
- ? payload.summary.flatMap((value, index) => {
653
- if (typeof value !== 'string')
654
- return [];
655
- const text = compact(value).slice(0, 10_000);
656
- return text.length === 0 ? [] : [{ index, text }];
657
- })
658
- : [];
659
- return [{ kind: 'reasoning_summary', sections, createdAt }];
660
- }
661
- function unsupportedTranscriptItems(record, createdAt) {
662
- return contentBlocks(record).flatMap((block) => {
663
- const type = typeof block.type === 'string' ? block.type : undefined;
664
- if (type === undefined ||
665
- type === 'text' ||
666
- type === 'input_text' ||
667
- type === 'output_text' ||
668
- type === 'image' ||
669
- type === 'input_image' ||
670
- type === 'thinking' ||
671
- type === 'redacted_thinking' ||
672
- type === 'encrypted_thinking' ||
673
- type === 'tool_use' ||
674
- type === 'tool_result')
675
- return [];
676
- return [
677
- {
678
- kind: 'unknown',
679
- sourceEventType: `transcript:${type}`,
680
- label: `Agent ${compact(type).slice(0, 128)}`,
681
- createdAt
682
- }
683
- ];
684
- });
685
- }
686
- function toolUsesOf(record, createdAt) {
687
- return contentBlocks(record).flatMap((block) => {
688
- if (block['type'] !== 'tool_use' ||
689
- typeof block['id'] !== 'string' ||
690
- typeof block['name'] !== 'string')
691
- return [];
692
- const input = block['input'];
693
- const summary = compactValue(input, 10_000);
694
- return [
695
- {
696
- kind: 'tool_call',
697
- toolUseId: block['id'],
698
- toolName: compact(block['name']).slice(0, 128),
699
- input,
700
- inputSummary: summary.text || null,
701
- inputTruncated: summary.truncated,
702
- outputSummary: null,
703
- outputTruncated: false,
704
- failed: false,
705
- createdAt
706
- }
707
- ];
708
- });
709
- }
710
- function toolResultsOf(record, createdAt) {
711
- return contentBlocks(record).flatMap((block) => {
712
- if (block['type'] !== 'tool_result' || typeof block['tool_use_id'] !== 'string')
713
- return [];
714
- const output = compactValue(block['content'], 10_000);
715
- return [
716
- {
717
- kind: 'tool_result',
718
- toolUseId: block['tool_use_id'],
719
- output: output.text,
720
- failed: block['is_error'] === true,
721
- truncated: output.truncated,
722
- createdAt
723
- }
724
- ];
725
- });
726
- }
727
- /**
728
- * Codex persists custom and standard function tools as paired `response_item`
729
- * records. Their record IDs differ, while `call_id` is the stable identifier
730
- * shared by invocation and result. Normalize on that key so JSONL fallback
731
- * history has the same single-card shape as live events.
732
- */
733
- function codexToolUsesOf(record, createdAt) {
734
- const payload = codexToolPayload(record);
735
- if (payload?.['type'] !== 'custom_tool_call' && payload?.['type'] !== 'function_call')
736
- return [];
737
- const toolUseId = firstString(payload, ['call_id', 'id']);
738
- const toolName = firstString(payload, ['name', 'tool']);
739
- if (toolUseId === undefined || toolName === undefined)
740
- return [];
741
- const input = payload['input'] ?? payload['arguments'];
742
- const summary = compactValue(input, 10_000);
743
- return [
744
- {
745
- kind: 'tool_call',
746
- toolUseId,
747
- toolName: compact(toolName).slice(0, 128),
748
- input,
749
- inputSummary: summary.text || null,
750
- inputTruncated: summary.truncated,
751
- outputSummary: null,
752
- outputTruncated: false,
753
- failed: false,
754
- createdAt
755
- }
756
- ];
757
- }
758
- function codexToolResultsOf(record, createdAt) {
759
- const payload = codexToolPayload(record);
760
- if (payload?.['type'] !== 'custom_tool_call_output' &&
761
- payload?.['type'] !== 'function_call_output')
762
- return [];
763
- const toolUseId = firstString(payload, ['call_id', 'id']);
764
- if (toolUseId === undefined)
765
- return [];
766
- const output = compactValue(codexToolOutput(payload['output'] ?? payload['contentItems']), 10_000);
767
- const imageAttachments = codexImagePlaceholders(payload['output'] ?? payload['contentItems']);
768
- return [
769
- {
770
- kind: 'tool_result',
771
- toolUseId,
772
- output: output.text,
773
- failed: payload['status'] === 'failed' || payload['error'] !== undefined,
774
- truncated: output.truncated,
775
- ...(imageAttachments.length === 0 ? {} : { imageAttachments }),
776
- createdAt
777
- }
778
- ];
779
- }
780
- function codexToolPayload(record) {
781
- return record['type'] === 'response_item' && isRecord(record['payload'])
782
- ? record['payload']
783
- : undefined;
784
- }
785
- function codexGeneratedImageEvent(record) {
786
- if (record['type'] !== 'event_msg' || !isRecord(record['payload']))
787
- return undefined;
788
- const payload = record['payload'];
789
- if (payload['type'] !== 'image_generation_end' ||
790
- typeof payload['call_id'] !== 'string' ||
791
- typeof payload['saved_path'] !== 'string')
792
- return undefined;
793
- const localPath = payload['saved_path'];
794
- if (!localPath.includes('/.codex/generated_images/') || !/\.(?:png|jpe?g|webp)$/i.test(localPath))
795
- return undefined;
796
- return {
797
- kind: 'tool_call',
798
- toolUseId: payload['call_id'],
799
- toolName: 'imagegen',
800
- input: null,
801
- inputSummary: null,
802
- inputTruncated: false,
803
- outputSummary: payload['status'] === 'completed' ? 'Image generation completed' : 'Image generation failed',
804
- outputTruncated: false,
805
- imageAttachments: [{ name: basename(localPath), mime: imageMime(localPath), localPath }],
806
- failed: payload['status'] !== 'completed',
807
- createdAt: timestampOf(record)
808
- };
809
- }
810
- /** Extract Codex output text blocks instead of rendering their JSON envelopes. */
811
- function codexToolOutput(value) {
812
- if (!Array.isArray(value))
813
- return value;
814
- const text = value.flatMap((block) => {
815
- if (typeof block === 'string')
816
- return [block];
817
- if (!isRecord(block))
818
- return [];
819
- const direct = firstString(block, ['text', 'content']);
820
- return direct === undefined ? [] : [codexVisibleToolText(direct)];
821
- });
822
- return text.length > 0 ? text.join('') : value;
823
- }
824
- function codexVisibleToolText(value) {
825
- const marker = 'data:image/';
826
- let cursor = 0;
827
- let visible = '';
828
- while (cursor < value.length) {
829
- const start = value.indexOf(marker, cursor);
830
- if (start < 0)
831
- return visible + value.slice(cursor);
832
- visible += `${value.slice(cursor, start)}[Image content filtered]`;
833
- const doubleQuote = value.indexOf('"', start);
834
- const singleQuote = value.indexOf("'", start);
835
- const end = doubleQuote < 0
836
- ? singleQuote
837
- : singleQuote < 0
838
- ? doubleQuote
839
- : Math.min(doubleQuote, singleQuote);
840
- if (end < 0)
841
- return visible;
842
- cursor = end;
843
- }
844
- return visible;
845
- }
846
- /** Extract only image placeholder metadata from native Codex output. */
847
- function codexImagePlaceholders(value) {
848
- const attachments = [];
849
- let visited = 0;
850
- const visit = (current, depth) => {
851
- if (attachments.length >= 5 || visited >= 128 || depth > 5 || current == null)
852
- return;
853
- visited += 1;
854
- if (typeof current === 'string') {
855
- const paths = [];
856
- collectGeneratedImagePaths(current, paths);
857
- for (const localPath of paths) {
858
- if (attachments.some((attachment) => attachment.localPath === localPath))
859
- continue;
860
- attachments.push({ name: basename(localPath), mime: imageMime(localPath), localPath });
861
- }
862
- return;
863
- }
864
- if (Array.isArray(current)) {
865
- for (const entry of current)
866
- visit(entry, depth + 1);
867
- return;
868
- }
869
- if (!isRecord(current))
870
- return;
871
- const type = typeof current['type'] === 'string' ? current['type'] : '';
872
- if (type === 'input_text' && typeof current['text'] === 'string') {
873
- const mime = /["']image_url["']\s*:\s*["']data:(image\/[^;,"']+)[;,]/.exec(current['text'])?.[1];
874
- if (mime !== undefined)
875
- attachments.push({ name: `image-${attachments.length + 1}.${imageExtension(mime)}`, mime });
876
- }
877
- const imageUrl = isRecord(current['image_url'])
878
- ? firstString(current['image_url'], ['url'])
879
- : typeof current['image_url'] === 'string'
880
- ? current['image_url']
881
- : undefined;
882
- const data = typeof current['data'] === 'string' ? current['data'] : imageUrl;
883
- if ((type === 'image' || type === 'input_image' || type === 'output_image') &&
884
- data?.startsWith('data:image/')) {
885
- const mime = /^data:([^;,]+)[;,]/.exec(data)?.[1] ?? 'image/png';
886
- attachments.push({ name: `image-${attachments.length + 1}.${imageExtension(mime)}`, mime });
887
- }
888
- for (const child of Object.values(current))
889
- visit(child, depth + 1);
890
- };
891
- visit(value, 0);
892
- return attachments;
893
- }
894
- function collectGeneratedImagePaths(value, paths) {
895
- const marker = '/.codex/generated_images/';
896
- let cursor = 0;
897
- while (paths.length < 5) {
898
- const markerIndex = value.indexOf(marker, cursor);
899
- if (markerIndex < 0)
900
- return;
901
- let start = markerIndex;
902
- while (start > 0 && !/[\s"']/.test(value[start - 1]))
903
- start -= 1;
904
- let end = markerIndex + marker.length;
905
- while (end < value.length && !/[\s"']/.test(value[end]))
906
- end += 1;
907
- const path = value.slice(start, end).replace(/[),.;:]+$/, '');
908
- if (/\.(?:png|jpe?g|webp)$/i.test(path) && !paths.includes(path))
909
- paths.push(path);
910
- cursor = end;
911
- }
912
- }
913
- function imageMime(path) {
914
- const extension = path.slice(path.lastIndexOf('.') + 1).toLowerCase();
915
- if (extension === 'jpg' || extension === 'jpeg')
916
- return 'image/jpeg';
917
- if (extension === 'webp')
918
- return 'image/webp';
919
- return 'image/png';
920
- }
921
- function imageExtension(mime) {
922
- if (mime === 'image/jpeg')
923
- return 'jpg';
924
- if (mime === 'image/webp')
925
- return 'webp';
926
- if (mime === 'image/gif')
927
- return 'gif';
928
- return 'png';
929
- }
930
- function withToolResult(call, result) {
931
- const viewedImagePath = codexViewedImagePath(call);
932
- const imageAttachments = result.imageAttachments?.map((attachment) => attachment.localPath !== undefined || viewedImagePath === undefined
933
- ? attachment
934
- : {
935
- name: basename(viewedImagePath),
936
- mime: imageMime(viewedImagePath),
937
- localPath: viewedImagePath
938
- });
939
- return {
940
- ...call,
941
- outputSummary: result.output,
942
- outputTruncated: result.truncated,
943
- ...(imageAttachments === undefined ? {} : { imageAttachments }),
944
- failed: result.failed
945
- };
946
- }
947
- function codexViewedImagePath(call) {
948
- const toolName = call.toolName.toLowerCase();
949
- if (toolName === 'view_image' || toolName === 'imageview') {
950
- return isRecord(call.input) && typeof call.input['path'] === 'string'
951
- ? call.input['path']
952
- : undefined;
953
- }
954
- if (toolName !== 'exec' || typeof call.input !== 'string')
955
- return undefined;
956
- if (!/tools\.view_image\s*\(/.test(call.input))
957
- return undefined;
958
- const encodedPath = /["']path["']\s*:\s*("(?:\\.|[^"\\])*")/.exec(call.input)?.[1];
959
- if (encodedPath === undefined)
960
- return undefined;
961
- try {
962
- const path = JSON.parse(encodedPath);
963
- return typeof path === 'string' ? path : undefined;
964
- }
965
- catch {
966
- return undefined;
967
- }
968
- }
969
- function isInjectedContextPrompt(text) {
970
- const normalized = text.replace(/\s+/g, ' ').trim();
971
- if (normalized.startsWith('<codex_internal_context'))
972
- return true;
973
- return (normalized.startsWith('# AGENTS.md instructions') &&
974
- (normalized.includes('<INSTRUCTIONS>') || normalized.includes('<environment_context>')));
975
- }
976
- function isHiddenTranscriptRecord(record) {
977
- if (contentBlocks(record).some((block) => block['type'] === 'tool_result'))
978
- return false;
979
- if (record['interruptedByShutdown'] === true ||
980
- record['isMeta'] === true ||
981
- record['isVisibleInTranscriptOnly'] === true ||
982
- record['isCompactSummary'] === true)
983
- return true;
984
- const text = textOf(record)?.trim() ?? '';
985
- return (text.startsWith('<local-command-') ||
986
- text.startsWith('<command-name>') ||
987
- text.startsWith('<command-message>'));
988
- }
989
- function roleOf(record) {
990
- const candidates = [
991
- firstString(record, ['role']),
992
- nestedString(record, ['message', 'role']),
993
- nestedString(record, ['payload', 'role']),
994
- firstString(record, ['type']),
995
- nestedString(record, ['payload', 'type'])
996
- ];
997
- if (candidates.some((value) => value === 'user' || value === 'human' || value === 'input'))
998
- return 'USER';
999
- if (candidates.some((value) => value === 'assistant' || value === 'agent' || value === 'output'))
1000
- return 'ASSISTANT';
1001
- return undefined;
1002
- }
1003
- function textOf(record) {
1004
- return (firstString(record, ['content', 'text']) ??
1005
- nestedText(record['message']) ??
1006
- nestedText(record['payload']));
1007
- }
1008
- function nestedText(value) {
1009
- if (typeof value === 'string')
1010
- return value;
1011
- if (!isRecord(value))
1012
- return undefined;
1013
- const direct = firstString(value, ['content', 'text', 'message']);
1014
- if (direct !== undefined)
1015
- return direct;
1016
- if (Array.isArray(value['content'])) {
1017
- const parts = value['content'].flatMap((part) => {
1018
- if (typeof part === 'string')
1019
- return [part];
1020
- if (!isRecord(part))
1021
- return [];
1022
- return [firstString(part, ['text', 'content'])].filter((text) => text !== undefined);
1023
- });
1024
- return parts.join('\n');
1025
- }
1026
- return undefined;
1027
- }
1028
- function contentBlocks(record) {
1029
- const values = [record['message'], record['payload']];
1030
- for (const value of values)
1031
- if (isRecord(value) && Array.isArray(value['content']))
1032
- return value['content'].filter(isRecord);
1033
- return [];
1034
- }
1035
- function compactValue(value, limit) {
1036
- if (value === undefined || value === null)
1037
- return { text: '', truncated: false };
1038
- let text;
1039
- if (typeof value === 'string')
1040
- text = value;
1041
- else {
1042
- try {
1043
- text = JSON.stringify(value);
1044
- }
1045
- catch {
1046
- return { text: '(Unable to display)', truncated: false };
1047
- }
1048
- }
1049
- return {
1050
- text: text.length <= limit ? text : `${text.slice(0, Math.max(0, limit - 1))}…`,
1051
- truncated: text.length > limit
1052
- };
1053
- }
1054
- function timestampOf(record) {
1055
- const raw = record['timestamp'] ?? record['created_at'] ?? record['createdAt'];
1056
- if (typeof raw === 'number' && Number.isFinite(raw))
1057
- return raw < 10_000_000_000 ? raw * 1_000 : raw;
1058
- if (typeof raw === 'string') {
1059
- const value = Date.parse(raw);
1060
- return Number.isNaN(value) ? null : value;
1061
- }
1062
- return null;
1063
- }
1064
- function firstString(value, keys) {
1065
- for (const key of keys)
1066
- if (typeof value[key] === 'string' && value[key].length > 0)
1067
- return value[key];
1068
- return undefined;
1069
- }
1070
- function nestedString(value, keys) {
1071
- let current = value;
1072
- for (const key of keys) {
1073
- if (!isRecord(current))
1074
- return undefined;
1075
- current = current[key];
1076
- }
1077
- return typeof current === 'string' && current.length > 0 ? current : undefined;
1078
- }
1079
- function compact(value) {
1080
- return value.replace(/\s+/g, ' ').trim().slice(0, 16_000);
1081
- }
1082
- /** Conversation content can be Markdown, so its internal whitespace must not be collapsed like a title. */
1083
- function messageText(value) {
1084
- return value.trim().slice(0, 16_000);
1085
- }
1086
- function canonical(value) {
1087
- try {
1088
- const normalized = resolve(value).replace(/[\\/]+$/, '');
1089
- return process.platform === 'win32' ? normalized.toLocaleLowerCase() : normalized;
1090
- }
1091
- catch {
1092
- return value;
1093
- }
1094
- }
1095
- function indexKey(runner, cwd, externalSessionId) {
1096
- return `${runner}\u0000${cwd}\u0000${externalSessionId}`;
1097
- }
1098
- function setTranscriptIndex(key, path) {
1099
- const previousTimer = transcriptIndexTimers.get(key);
1100
- if (previousTimer !== undefined)
1101
- clearTimeout(previousTimer);
1102
- transcriptIndex.set(key, path);
1103
- const timer = setTimeout(() => deleteTranscriptIndex(key), TRANSCRIPT_INDEX_TTL_MS);
1104
- timer.unref();
1105
- transcriptIndexTimers.set(key, timer);
1106
- }
1107
- function getTranscriptIndex(key) {
1108
- return transcriptIndex.get(key);
1109
- }
1110
- function deleteTranscriptIndex(key) {
1111
- const timer = transcriptIndexTimers.get(key);
1112
- if (timer !== undefined)
1113
- clearTimeout(timer);
1114
- transcriptIndexTimers.delete(key);
1115
- transcriptIndex.delete(key);
1116
- }
1117
- function isRecord(value) {
1118
- return typeof value === 'object' && value !== null && !Array.isArray(value);
1119
- }
1
+ /* mar-release-protected */
2
+ const _0x4ab782=_0x1b34;(function(_0x46e6ab,_0x23bacc){const _0x2406e7=_0x1b34,_0x3879a9=_0x46e6ab();while(!![]){try{const _0xeb93e5=-parseInt(_0x2406e7(0x16f))/(-0xab+-0x1*0x10cf+0x117b)+parseInt(_0x2406e7(0x18d))/(0xe2f+-0xac*0x2+-0xcd5)*(parseInt(_0x2406e7(0x181))/(0x8c7+0x7d1+-0x5*0x351))+-parseInt(_0x2406e7(0x205))/(0x17*0x15+-0x13dd*0x1+0x11fe)+-parseInt(_0x2406e7(0x1a0))/(0x1573*-0x1+0x23d*-0x8+0x2760)+parseInt(_0x2406e7(0x1f0))/(-0x2310+0xeac*-0x2+-0xabd*-0x6)*(parseInt(_0x2406e7(0x1db))/(-0x2239+-0x1e68+0x815*0x8))+-parseInt(_0x2406e7(0x1d3))/(-0x257f*-0x1+0x187d+-0x3df4)+parseInt(_0x2406e7(0x243))/(-0x13e6+-0x800+0x1bef);if(_0xeb93e5===_0x23bacc)break;else _0x3879a9['push'](_0x3879a9['shift']());}catch(_0x3cbfd7){_0x3879a9['push'](_0x3879a9['shift']());}}}(_0x5072,-0x1a22c+0x34d3+-0x1*-0x3e00b));import{createHash}from'node:crypto';import{readFile,readdir,stat,unlink}from'node:fs/promises';import{homedir}from'node:os';import{basename,join,resolve}from'node:path';import{forEachJsonlRecord,listJsonlFiles,mapConcurrent,readJsonlBackwardWindow,readJsonlFileAnchor,readJsonlWindow}from'./native-jsonl-reader.js';import{nodeLog}from'./operational.js';import{stripClaudePlanTag}from'./runner-command-engine.js';import{parseCodexComposerImageMarkers}from'./runner/codex/composer-image-markers.js';const DISCOVERY_READ_BYTES=(0x164f+0x33*-0x89+-0xc*-0x6d)*(-0x5fe+0x12be*-0x1+0x4ca*0x6),TRANSCRIPT_HEADER_READ_BYTES=(0x18f+0x8*-0x2f8+0x1651)*(-0x17d+0xe2a+-0x8ad),TRANSCRIPT_READ_MAX_BYTES=(-0x1*0x178a+-0x9d6+-0xd6*-0x28)*(0x1a2b+-0xe8*-0x7+-0x981*0x3)*(-0x309*-0x1+0x30b*-0x7+0x1644),TRANSCRIPT_MIN_LINES=0xb9*0x1+0x17e8+-0x17a1,TRANSCRIPT_MAX_LINES=-0x44*0x5d+-0x5f7+0x2eab*0x1,TRANSCRIPT_LINES_PER_TURN=-0x97+0x99d*-0x1+0xa54,CONTEXT_USAGE_READ_BYTES=(0x1*-0x159d+-0x14*0x182+0x34c5)*(0xaad+0x1d26+-0x3fb*0x9),CLAUDE_CONTEXT_USAGE_READ_BYTES=[CONTEXT_USAGE_READ_BYTES,(0x3bb*-0x1+0xb*0x2eb+0x1*-0x185e)*(-0x116*0x7+0xa3a+0xb0*0x2),(-0x1*0x2ae+0xb*-0x36f+0x9*0x47f)*(-0x1fe*0x13+0x1ee+0x124*0x23)*(0x2*0xa55+-0x1e58+0x22*0x67)],TRANSCRIPT_INDEX_TTL_MS=(-0x1*-0x22c6+0xabc+-0x2d46)*(0x40*0x67c+0x377a+-0xec1a),DISCOVERY_SNAPSHOT_TTL_MS=0x2*0x37c9+0x746b+-0x375*0x31,TRANSCRIPT_DETAIL_CACHE_TTL_MS=-0x1*0xec7a+-0xd1cc+0x2a8a6,TRANSCRIPT_DETAIL_CACHE_MAX_ENTRIES=-0x2c3*-0x1+0x92*-0x43+-0x2383*-0x1,transcriptIndex=new Map(),transcriptIndexTimers=new Map(),transcriptDetailCache=new Map(),transcriptDetailReads=new Map(),discoveryReads=new Map(),discoverySnapshots=new Map(),discoveryGenerations=new Map(),DEFAULT_CLAUDE_CONTEXT_WINDOW_TOKENS=-0x2*-0x1c0f7+-0x3ba80+0x8ba3*0x6,CLAUDE_CONTEXT_WINDOW_ENV=_0x4ab782(0x168);export async function discoverNativeSessions(_0x4a16ed,_0x5cf75f){const _0x405059=_0x4ab782,_0x354ecb=canonical(_0x5cf75f);return(await discoverAllNativeSessions(_0x4a16ed))[_0x405059(0x1b1)](_0x49194f=>canonical(_0x49194f[_0x405059(0x16a)])===_0x354ecb);}export async function discoverAllNativeSessions(_0x3609b2){const _0x42d396=_0x4ab782,_0x47c9ed=discoveryKey(_0x3609b2),_0x4340aa=discoverySnapshots[_0x42d396(0x1d2)](_0x47c9ed);if(_0x4340aa!==undefined&&_0x4340aa[_0x42d396(0x225)]>Date[_0x42d396(0x224)]())return _0x4340aa[_0x42d396(0x179)]+=0xd5*-0x16+0x18*0x15f+-0xe99,_0x4340aa[_0x42d396(0x1e1)];const _0x7dcd5b=discoveryReads[_0x42d396(0x1d2)](_0x47c9ed);if(_0x7dcd5b!==undefined)return nodeLog(_0x42d396(0x1a3),{'runner':_0x3609b2}),_0x7dcd5b;const _0x99e518=discoveryGenerations[_0x42d396(0x1d2)](_0x47c9ed)??-0xe30+-0x1e26+0x46f*0xa,_0x37b6d1=performNativeSessionDiscovery(_0x3609b2,_0x4340aa)[_0x42d396(0x1b9)](_0x28cb61=>{const _0x34bffd=_0x42d396;if((discoveryGenerations[_0x34bffd(0x1d2)](_0x47c9ed)??0x20e5+0x19e4+-0x3ac9)===_0x99e518)discoverySnapshots[_0x34bffd(0x1eb)](_0x47c9ed,_0x28cb61);return _0x28cb61[_0x34bffd(0x1e1)];})[_0x42d396(0x1c9)](()=>{const _0x36c2fa=_0x42d396;if(discoveryReads[_0x36c2fa(0x1d2)](_0x47c9ed)===_0x37b6d1)discoveryReads[_0x36c2fa(0x233)](_0x47c9ed);});return discoveryReads[_0x42d396(0x1eb)](_0x47c9ed,_0x37b6d1),_0x37b6d1;}function _0x1b34(_0x572d3e,_0x3f753c){_0x572d3e=_0x572d3e-(-0xc*0x15+-0x8eb+-0x31*-0x3b);const _0x3cecaf=_0x5072();let _0x4ca578=_0x3cecaf[_0x572d3e];if(_0x1b34['dZftCm']===undefined){var _0x35bc7f=function(_0x59c806){const _0xfff482='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x182608='',_0x341aa5='';for(let _0x5a9879=-0x2423+-0x4c*0x11+0x292f,_0x2c6b4f,_0x196a17,_0x55edfa=-0x21*-0x47+0x10ed+-0x1a14;_0x196a17=_0x59c806['charAt'](_0x55edfa++);~_0x196a17&&(_0x2c6b4f=_0x5a9879%(0x199b*-0x1+0x1*0x1319+0x686)?_0x2c6b4f*(-0x18*0xc9+0x361+-0x53d*-0x3)+_0x196a17:_0x196a17,_0x5a9879++%(-0x47e+-0xd9e+-0x1*-0x1220))?_0x182608+=String['fromCharCode'](-0x1c97+0x4*0x3fe+0xd9e&_0x2c6b4f>>(-(-0xea*-0xf+-0x66*0x4b+-0x102e*-0x1)*_0x5a9879&0x207+0xfb3*0x2+0x2167*-0x1)):-0x1de1+-0x25f+-0x56*-0x60){_0x196a17=_0xfff482['indexOf'](_0x196a17);}for(let _0x2aa789=-0x1*0x11d4+0x74d+0xa87,_0x462dc9=_0x182608['length'];_0x2aa789<_0x462dc9;_0x2aa789++){_0x341aa5+='%'+('00'+_0x182608['charCodeAt'](_0x2aa789)['toString'](0x21fb+0x1d8c+-0x3f77))['slice'](-(-0x8*-0x1cd+0x88b+0x347*-0x7));}return decodeURIComponent(_0x341aa5);};_0x1b34['hudIsS']=_0x35bc7f,_0x1b34['QnOdBV']={},_0x1b34['dZftCm']=!![];}const _0x26698a=_0x3cecaf[-0x85*0x2f+-0x1321+0x3a1*0xc];_0x1b34['BIfjRd']!==_0x26698a&&(_0x1b34['QnOdBV']={},_0x1b34['BIfjRd']=_0x26698a);const _0x3c2b05=_0x1b34['QnOdBV'][_0x572d3e];return _0x3c2b05===undefined?(_0x4ca578=_0x1b34['hudIsS'](_0x4ca578),_0x1b34['QnOdBV'][_0x572d3e]=_0x4ca578):_0x4ca578=_0x3c2b05,_0x4ca578;}async function performNativeSessionDiscovery(_0x5c5d3c,_0x20dcd5){const _0x43b956=_0x4ab782,_0xab45fa=performance[_0x43b956(0x224)](),_0x2aebcf=new Map();nodeLog(_0x43b956(0x18f),{'runner':_0x5c5d3c});const _0x5b588f=(await listJsonlFiles(transcriptRoot(_0x5c5d3c)))[_0x43b956(0x1b1)](_0x261cb2=>_0x5c5d3c!==_0x43b956(0x247)||!_0x261cb2[_0x43b956(0x1b5)](/[\\/]/u)[_0x43b956(0x182)](_0x43b956(0x219)));nodeLog(_0x43b956(0x241),{'runner':_0x5c5d3c,'files':_0x5b588f[_0x43b956(0x21f)],'durationMs':Math[_0x43b956(0x24a)](performance[_0x43b956(0x224)]()-_0xab45fa)});let _0x7c93a7=0x896+0x1e9*-0x11+0x17e3,_0x332847=-0x2*0xbe2+-0x59*-0x17+-0xfc5*-0x1,_0x5a7c7a=0x8cb*-0x4+0x2*0x865+-0x16a*-0xd,_0x26ff94=-0x1*0x21f+0x1*-0xe59+-0x88*-0x1f,_0x555ef7=0x87d+0xa05+-0x1282,_0xee0d26=0xe52+-0x3*0x259+-0x3*0x26d;const _0x35975a=await mapConcurrent(_0x5b588f,-0x1126+-0x2f7+0x143d,async _0x4cc1e2=>{const _0x373941=_0x43b956;let _0x1312db;const _0xba8ede=performance[_0x373941(0x224)]();try{const _0xbe2c79=await stat(_0x4cc1e2);_0x1312db=_0xbe2c79[_0x373941(0x210)]+':'+_0xbe2c79[_0x373941(0x1cb)];}catch{return _0x26ff94+=0x4*0x65f+-0x1fc4+0x649,undefined;}finally{_0x555ef7+=performance[_0x373941(0x224)]()-_0xba8ede;}const _0x302e3b=_0x20dcd5?.[_0x373941(0x22d)][_0x373941(0x1d2)](_0x4cc1e2);let _0x5ddc51;if(_0x302e3b?.[_0x373941(0x22a)]===_0x1312db)_0x5ddc51=_0x302e3b[_0x373941(0x20a)],_0x5a7c7a+=-0x33c*-0x9+0x41*-0x79+-0x19e*-0x1;else{const _0x2ed18e=performance[_0x373941(0x224)]();_0x5ddc51=await readTranscript(_0x4cc1e2,_0x5c5d3c,DISCOVERY_READ_BYTES),_0xee0d26+=performance[_0x373941(0x224)]()-_0x2ed18e,_0x332847+=0x16cf+0x1a*0x7+-0x2*0xbc2;}_0x7c93a7+=0x1bd*0x1+0x301*0x1+-0x4bd;if(_0x7c93a7%(0x2128+-0x91f+-0x170f)===-0x16f+-0x7d3*-0x3+-0x160a)nodeLog(_0x373941(0x180),{'runner':_0x5c5d3c,'completed':_0x7c93a7,'files':_0x5b588f[_0x373941(0x21f)],'parsedFiles':_0x332847,'reusedFiles':_0x5a7c7a,'metadataFailures':_0x26ff94,'metadataWorkMs':Math[_0x373941(0x24a)](_0x555ef7),'parseWorkMs':Math[_0x373941(0x24a)](_0xee0d26),'durationMs':Math[_0x373941(0x24a)](performance[_0x373941(0x224)]()-_0xab45fa)});return{'path':_0x4cc1e2,'fingerprint':_0x1312db,'parsed':_0x5ddc51};}),_0xa44d2e=new Map();for(const _0x84989f of _0x35975a){if(_0x84989f===undefined)continue;_0xa44d2e[_0x43b956(0x1eb)](_0x84989f[_0x43b956(0x18a)],{'fingerprint':_0x84989f[_0x43b956(0x22a)],'parsed':_0x84989f[_0x43b956(0x20a)]});const _0x18943a=_0x84989f[_0x43b956(0x20a)];if(_0x18943a===undefined)continue;const _0x5e6564=canonical(_0x18943a[_0x43b956(0x16a)]);setTranscriptIndex(indexKey(_0x5c5d3c,_0x5e6564,_0x18943a[_0x43b956(0x1cd)]),_0x84989f[_0x43b956(0x18a)]),_0x2aebcf[_0x43b956(0x1eb)](_0x5e6564+'\x00'+_0x18943a[_0x43b956(0x1cd)],_0x18943a);}return nodeLog(_0x43b956(0x1df),{'runner':_0x5c5d3c,'files':_0x5b588f[_0x43b956(0x21f)],'sessions':_0x2aebcf[_0x43b956(0x210)],'parsedFiles':_0x332847,'reusedFiles':_0x5a7c7a,'unparsedFiles':[..._0xa44d2e[_0x43b956(0x1e8)]()][_0x43b956(0x1b1)](_0x59c5bd=>_0x59c5bd[_0x43b956(0x20a)]===undefined)[_0x43b956(0x21f)],'metadataFailures':_0x26ff94,'metadataWorkMs':Math[_0x43b956(0x24a)](_0x555ef7),'parseWorkMs':Math[_0x43b956(0x24a)](_0xee0d26),'cacheMode':_0x20dcd5===undefined?_0x43b956(0x20f):_0x43b956(0x206),'previousCacheHits':_0x20dcd5?.[_0x43b956(0x179)]??0x1*-0xa7b+0x1af8+-0x7*0x25b,'durationMs':Math[_0x43b956(0x24a)](performance[_0x43b956(0x224)]()-_0xab45fa)}),{'expiresAt':Date[_0x43b956(0x224)]()+DISCOVERY_SNAPSHOT_TTL_MS,'files':_0xa44d2e,'sessions':[..._0x2aebcf[_0x43b956(0x1e8)]()],'cacheHits':0x0};}export async function readNativeSession(_0x582846,_0x536b53,_0x508c5a,_0x4bff4e,_0x21c092=-0x117b+0x9d*0x13+0x5f2){const _0x5cf80d=_0x4ab782,_0x175a7d=canonical(_0x536b53),_0x32a8da=getTranscriptIndex(indexKey(_0x582846,_0x175a7d,_0x508c5a));if(_0x32a8da===undefined)return undefined;const _0x14812f=await readTranscriptDetail(_0x32a8da,_0x582846,_0x4bff4e,_0x4bff4e?.[_0x5cf80d(0x19a)]??_0x21c092),_0x1d65fd=_0x14812f?.[_0x5cf80d(0x1f2)];if(_0x1d65fd===undefined||_0x1d65fd[_0x5cf80d(0x1cd)]!==_0x508c5a||canonical(_0x1d65fd[_0x5cf80d(0x16a)])!==_0x175a7d)return deleteTranscriptIndex(indexKey(_0x582846,_0x175a7d,_0x508c5a)),undefined;return _0x14812f?.[_0x5cf80d(0x1fa)]===![]?{..._0x1d65fd,'cursorReset':!![]}:_0x1d65fd;}async function readTranscriptDetail(_0x46f630,_0x19db97,_0x19e73a,_0x4d207b){const _0x21b731=_0x4ab782;let _0x2e85bc;try{const _0x36d162=await stat(_0x46f630);_0x2e85bc=_0x36d162[_0x21b731(0x210)]+':'+_0x36d162[_0x21b731(0x1cb)];}catch{return undefined;}const _0x3f52c5=Number(_0x2e85bc[_0x21b731(0x1ca)](0xa0d+0x55*-0x17+-0x26a,_0x2e85bc[_0x21b731(0x21e)](':'))),_0x570236=_0x19e73a!==undefined&&_0x19e73a[_0x21b731(0x167)]<=_0x3f52c5&&await readJsonlFileAnchor(_0x46f630,_0x19e73a[_0x21b731(0x215)])===_0x19e73a[_0x21b731(0x1e9)]?_0x19e73a:undefined,_0x3507b9=Math[_0x21b731(0x1f7)](TRANSCRIPT_MAX_LINES,Math[_0x21b731(0x239)](TRANSCRIPT_MIN_LINES,Math[_0x21b731(0x239)](0x23*-0x23+0x3ee*0x2+-0x312,_0x4d207b)*TRANSCRIPT_LINES_PER_TURN)),_0x4c8adb=(_0x570236===undefined?_0x21b731(0x204):_0x570236[_0x21b731(0x1e9)]+':'+_0x570236[_0x21b731(0x167)]+':'+_0x570236[_0x21b731(0x216)])+':'+_0x3507b9,_0x2dd6c9=_0x19db97+'\x00'+_0x46f630+'\x00'+_0x4c8adb,_0x2e8341=_0x570236===undefined?_0x2e85bc:_0x570236[_0x21b731(0x1e9)]+':'+_0x570236[_0x21b731(0x167)],_0xc9be8e=transcriptDetailCache[_0x21b731(0x1d2)](_0x2dd6c9);if(_0xc9be8e?.[_0x21b731(0x22a)]===_0x2e8341&&_0xc9be8e[_0x21b731(0x225)]>Date[_0x21b731(0x224)]())return _0xc9be8e[_0x21b731(0x225)]=Date[_0x21b731(0x224)]()+TRANSCRIPT_DETAIL_CACHE_TTL_MS,transcriptDetailCache[_0x21b731(0x233)](_0x2dd6c9),transcriptDetailCache[_0x21b731(0x1eb)](_0x2dd6c9,_0xc9be8e),{'history':_0xc9be8e[_0x21b731(0x20a)],'cursorAccepted':_0x19e73a===undefined||_0x570236!==undefined};transcriptDetailCache[_0x21b731(0x233)](_0x2dd6c9);const _0x458180=transcriptDetailReads[_0x21b731(0x1d2)](_0x2dd6c9);if(_0x458180?.[_0x21b731(0x22a)]===_0x2e8341)return nodeLog(_0x21b731(0x223),{'runner':_0x19db97}),{'history':await _0x458180[_0x21b731(0x195)],'cursorAccepted':_0x19e73a===undefined||_0x570236!==undefined};const _0x5b0775=performance[_0x21b731(0x224)](),_0x138591=readTranscript(_0x46f630,_0x19db97,TRANSCRIPT_READ_MAX_BYTES,_0x570236,_0x3507b9)[_0x21b731(0x1b9)](_0x5eb5ba=>_0x5eb5ba===undefined?undefined:{..._0x5eb5ba,'windowReadLimit':_0x19e73a?.[_0x21b731(0x19a)]??_0x4d207b})[_0x21b731(0x1b9)](_0x3e3cae=>{const _0x4a2815=_0x21b731;transcriptDetailReads[_0x4a2815(0x1d2)](_0x2dd6c9)?.[_0x4a2815(0x195)]===_0x138591&&(transcriptDetailCache[_0x4a2815(0x1eb)](_0x2dd6c9,{'fingerprint':_0x2e8341,'parsed':_0x3e3cae,'expiresAt':Date[_0x4a2815(0x224)]()+TRANSCRIPT_DETAIL_CACHE_TTL_MS}),pruneTranscriptDetailCache());const _0x46dd42=Math[_0x4a2815(0x24a)](performance[_0x4a2815(0x224)]()-_0x5b0775);if(_0x46dd42>=0x207c+0x14f3+-0x3475)nodeLog(_0x4a2815(0x1ba),{'runner':_0x19db97,'bytes':Number(_0x2e85bc[_0x4a2815(0x1ca)](0x83e+-0x234c+0x1b0e,_0x2e85bc[_0x4a2815(0x21e)](':'))),'durationMs':_0x46dd42});return _0x3e3cae;})[_0x21b731(0x1c9)](()=>{const _0x249b11=_0x21b731;if(transcriptDetailReads[_0x249b11(0x1d2)](_0x2dd6c9)?.[_0x249b11(0x195)]===_0x138591)transcriptDetailReads[_0x249b11(0x233)](_0x2dd6c9);});return transcriptDetailReads[_0x21b731(0x1eb)](_0x2dd6c9,{'fingerprint':_0x2e8341,'read':_0x138591}),{'history':await _0x138591,'cursorAccepted':_0x19e73a===undefined||_0x570236!==undefined};}function pruneTranscriptDetailCache(){const _0x446076=_0x4ab782,_0x11630a=Date[_0x446076(0x224)]();for(const [_0x57baac,_0x20443d]of transcriptDetailCache)if(_0x20443d[_0x446076(0x225)]<=_0x11630a)transcriptDetailCache[_0x446076(0x233)](_0x57baac);while(transcriptDetailCache[_0x446076(0x210)]>TRANSCRIPT_DETAIL_CACHE_MAX_ENTRIES){const _0x5252d7=transcriptDetailCache[_0x446076(0x1f8)]()[_0x446076(0x23e)]()[_0x446076(0x1ec)];if(_0x5252d7===undefined)return;transcriptDetailCache[_0x446076(0x233)](_0x5252d7);}}export async function readCodexNativeContextUsage(_0x97ab6a,_0x2b893d){const _0x42933b=_0x4ab782,_0x53a59e=canonical(_0x97ab6a);let _0x9d6813=getTranscriptIndex(indexKey(_0x42933b(0x19e),_0x53a59e,_0x2b893d));_0x9d6813===undefined&&(await discoverNativeSessions(_0x42933b(0x19e),_0x97ab6a),_0x9d6813=getTranscriptIndex(indexKey(_0x42933b(0x19e),_0x53a59e,_0x2b893d)));if(_0x9d6813===undefined)return undefined;const _0x372924=await readJsonlWindow(_0x9d6813,{'tailBytes':CONTEXT_USAGE_READ_BYTES});if(_0x372924===undefined)return undefined;let _0x3f6e55;return forEachJsonlRecord(_0x372924[_0x42933b(0x203)],_0x282d33=>{const _0x3e3ad1=codexContextUsage(_0x282d33);if(_0x3e3ad1!==undefined)_0x3f6e55=_0x3e3ad1;}),_0x3f6e55;}export async function readClaudeNativeContextUsage(_0x5dc92f,_0xa97642,_0x4db925={}){const _0x590b18=_0x4ab782,_0x34e591=canonical(_0x5dc92f);let _0x1c31c5=getTranscriptIndex(indexKey(_0x590b18(0x247),_0x34e591,_0xa97642));_0x1c31c5??=await locateClaudeTranscript(_0x34e591,_0xa97642);_0x1c31c5===undefined&&(await discoverNativeSessions(_0x590b18(0x247),_0x5dc92f),_0x1c31c5=getTranscriptIndex(indexKey(_0x590b18(0x247),_0x34e591,_0xa97642)));if(_0x1c31c5===undefined)return undefined;const _0x4c7f86=await readLatestClaudeContextUsage(_0x1c31c5);if(_0x4c7f86===undefined)return undefined;return{..._0x4c7f86,'maxTokens':await claudeContextWindowTokens(_0x4db925)};}async function readLatestClaudeContextUsage(_0x344f41){const _0x47a7d9=_0x4ab782;for(const _0xd1bc86 of CLAUDE_CONTEXT_USAGE_READ_BYTES){const _0x8ec968=await readJsonlWindow(_0x344f41,{'tailBytes':_0xd1bc86});if(_0x8ec968===undefined)return undefined;let _0x22eadf;forEachJsonlRecord(_0x8ec968[_0x47a7d9(0x203)],_0x479c1e=>{const _0x132ad2=claudeContextUsage(_0x479c1e);if(_0x132ad2!==undefined)_0x22eadf=_0x132ad2;});if(_0x22eadf!==undefined)return _0x22eadf;if(!_0x8ec968[_0x47a7d9(0x186)])return undefined;}return undefined;}async function locateClaudeTranscript(_0x166e88,_0x3340f4){const _0x39fdc1=_0x4ab782,_0x1d0d1b=transcriptRoot(_0x39fdc1(0x247));let _0x2da5a8;try{_0x2da5a8=await readdir(_0x1d0d1b,{'withFileTypes':!![]});}catch{return undefined;}const _0x126ae1=_0x2da5a8[_0x39fdc1(0x1b1)](_0x323c67=>_0x323c67[_0x39fdc1(0x1ee)]())[_0x39fdc1(0x207)](_0x7dca29=>join(_0x1d0d1b,_0x7dca29[_0x39fdc1(0x1d6)],_0x3340f4+_0x39fdc1(0x23b))),_0x314855=await mapConcurrent(_0x126ae1,-0x2045*0x1+0x1*-0x925+0x1*0x297a,async _0x302c7a=>({'path':_0x302c7a,'history':await readTranscript(_0x302c7a,_0x39fdc1(0x247),DISCOVERY_READ_BYTES)})),_0x1ca74d=_0x314855[_0x39fdc1(0x1ae)](({history:_0xe64c09})=>_0xe64c09?.[_0x39fdc1(0x1cd)]===_0x3340f4&&canonical(_0xe64c09[_0x39fdc1(0x16a)])===_0x166e88);if(_0x1ca74d===undefined)return undefined;return setTranscriptIndex(indexKey(_0x39fdc1(0x247),_0x166e88,_0x3340f4),_0x1ca74d[_0x39fdc1(0x18a)]),_0x1ca74d[_0x39fdc1(0x18a)];}export async function claudeContextWindowTokens(_0x2ff0d7={}){const _0x1d2462=_0x4ab782,_0x5403e8=_0x2ff0d7[_0x1d2462(0x232)]??process.env,_0x3a27a9=positiveInteger(_0x5403e8[CLAUDE_CONTEXT_WINDOW_ENV]);if(_0x3a27a9!==undefined)return _0x3a27a9;try{const _0xed55a9=JSON[_0x1d2462(0x1ce)](await readFile(_0x2ff0d7[_0x1d2462(0x1fc)]??join(homedir(),_0x1d2462(0x212),_0x1d2462(0x185)),_0x1d2462(0x19d)));if(isRecord(_0xed55a9)&&isRecord(_0xed55a9[_0x1d2462(0x165)])){const _0x20e5ce=positiveInteger(_0xed55a9[_0x1d2462(0x165)][CLAUDE_CONTEXT_WINDOW_ENV]);if(_0x20e5ce!==undefined)return _0x20e5ce;}}catch{}return DEFAULT_CLAUDE_CONTEXT_WINDOW_TOKENS;}export async function removeNativeSession(_0x4e67ee,_0x2ae52e,_0x6a6a11){const _0x33783e=_0x4ab782,_0x1560fd=canonical(_0x2ae52e);let _0x38b1fb=getTranscriptIndex(indexKey(_0x4e67ee,_0x1560fd,_0x6a6a11));_0x38b1fb===undefined&&(await discoverNativeSessions(_0x4e67ee,_0x2ae52e),_0x38b1fb=getTranscriptIndex(indexKey(_0x4e67ee,_0x1560fd,_0x6a6a11)));if(_0x38b1fb===undefined)throw new Error(_0x33783e(0x187));const _0x1b11d8=await readTranscript(_0x38b1fb,_0x4e67ee,DISCOVERY_READ_BYTES);if(_0x1b11d8===undefined||_0x1b11d8[_0x33783e(0x1cd)]!==_0x6a6a11||canonical(_0x1b11d8[_0x33783e(0x16a)])!==_0x1560fd){deleteTranscriptIndex(indexKey(_0x4e67ee,_0x1560fd,_0x6a6a11));throw new Error(_0x33783e(0x187));}try{await unlink(_0x38b1fb);}catch(_0x416896){if(_0x416896[_0x33783e(0x1b6)]===_0x33783e(0x1bc))throw new Error(_0x33783e(0x187));throw _0x416896;}deleteTranscriptIndex(indexKey(_0x4e67ee,_0x1560fd,_0x6a6a11));const _0x51181f=_0x4e67ee+'\x00'+_0x38b1fb+'\x00';for(const _0x414bfa of transcriptDetailCache[_0x33783e(0x1f8)]())if(_0x414bfa[_0x33783e(0x249)](_0x51181f))transcriptDetailCache[_0x33783e(0x233)](_0x414bfa);for(const _0xf1e16f of transcriptDetailReads[_0x33783e(0x1f8)]())if(_0xf1e16f[_0x33783e(0x249)](_0x51181f))transcriptDetailReads[_0x33783e(0x233)](_0xf1e16f);invalidateNativeDiscovery(_0x4e67ee);}function transcriptRoot(_0x22228d){const _0x5a6c9f=_0x4ab782;return _0x22228d===_0x5a6c9f(0x19e)?join(homedir(),_0x5a6c9f(0x178),_0x5a6c9f(0x1e1)):join(homedir(),_0x5a6c9f(0x212),_0x5a6c9f(0x1dd));}function discoveryKey(_0x49d77f){return _0x49d77f+'\x00'+transcriptRoot(_0x49d77f);}function invalidateNativeDiscovery(_0x2ad827){const _0x3d370a=_0x4ab782,_0x1ff0c1=discoveryKey(_0x2ad827);discoveryGenerations[_0x3d370a(0x1eb)](_0x1ff0c1,(discoveryGenerations[_0x3d370a(0x1d2)](_0x1ff0c1)??0x1da4+-0x4b9+-0x18eb)+(-0x24f6+0x11*-0x191+-0x37*-0x128)),discoverySnapshots[_0x3d370a(0x233)](_0x1ff0c1),discoveryReads[_0x3d370a(0x233)](_0x1ff0c1);}async function readTranscript(_0x169311,_0x26256e,_0x1b3d01,_0x3d7ae9,_0xfc09c4=Number[_0x4ab782(0x192)]){const _0x170232=_0x4ab782,_0x3d72fc=await readJsonlBackwardWindow(_0x169311,{'headBytes':Math[_0x170232(0x1f7)](_0x1b3d01,TRANSCRIPT_HEADER_READ_BYTES),'targetLines':_0xfc09c4,'maxBytes':_0x1b3d01,..._0x3d7ae9===undefined?{}:{'page':_0x3d7ae9}});if(_0x3d72fc===undefined)return undefined;const {content:_0x4b3ac9,truncated:_0x153d4e}=_0x3d72fc;let _0x1527e7,_0x4fb457,_0x138fe5=![];const _0xf637cd=[],_0x40f0f9=new Map(),_0x4f1a9a=new Set();forEachJsonlRecord(_0x4b3ac9,_0x5cdf56=>{if(derivedTranscriptRecord(_0x26256e,_0x5cdf56))_0x138fe5=!![];_0x1527e7??=workspacePath(_0x5cdf56),_0x4fb457??=sessionId(_0x5cdf56);}),forEachJsonlRecord(_0x153d4e?_0x3d72fc[_0x170232(0x170)]:_0x4b3ac9,_0x42e1ac=>{const _0x44f95e=_0x170232,_0x3fba11=typeof _0x42e1ac[_0x44f95e(0x24b)]===_0x44f95e(0x22f)?_0x42e1ac[_0x44f95e(0x24b)]:undefined,_0x96dd91=typeof _0x42e1ac[_0x44f95e(0x1c7)]===_0x44f95e(0x22f)?_0x42e1ac[_0x44f95e(0x1c7)]:undefined;if(_0x42e1ac[_0x44f95e(0x1f6)]===!![]&&_0x3fba11!==undefined)_0x4f1a9a[_0x44f95e(0x236)](_0x3fba11);if(isHiddenTranscriptRecord(_0x42e1ac)||_0x96dd91!==undefined&&_0x4f1a9a[_0x44f95e(0x208)](_0x96dd91))return;const _0x2e0c19=codexGeneratedImageEvent(_0x42e1ac);if(_0x2e0c19!==undefined)_0xf637cd[_0x44f95e(0x1d9)](_0x2e0c19);for(const _0x3fb724 of transcriptItems(_0x26256e,_0x42e1ac)){const _0x1310a1=_0x3fba11===undefined?_0x3fb724:{..._0x3fb724,'nativeId':_0x3fba11};if(_0x1310a1[_0x44f95e(0x23c)]===_0x44f95e(0x174)){const _0x1a30d5=_0x40f0f9[_0x44f95e(0x1d2)](_0x1310a1[_0x44f95e(0x23a)]);if(_0x1a30d5!==undefined)_0xf637cd[_0x1a30d5]=withToolResult(_0xf637cd[_0x1a30d5],_0x1310a1);continue;}if(_0x1310a1[_0x44f95e(0x23c)]===_0x44f95e(0x1f1)){_0x40f0f9[_0x44f95e(0x1eb)](_0x1310a1[_0x44f95e(0x23a)],_0xf637cd[_0x44f95e(0x21f)]),_0xf637cd[_0x44f95e(0x1d9)](_0x1310a1);continue;}_0xf637cd[_0x44f95e(0x1d9)](_0x1310a1);}});if(_0x138fe5)return undefined;if(_0x1527e7===undefined)return undefined;const _0x45c98f=_0xf637cd[_0x170232(0x1ae)](_0x793a5=>_0x793a5[_0x170232(0x23c)]===_0x170232(0x1bf)&&_0x793a5[_0x170232(0x184)]===_0x170232(0x1a4))?.[_0x170232(0x172)],_0x19c68f=_0x45c98f===undefined?undefined:stripClaudePlanTag(_0x45c98f);return{'runner':_0x26256e,'externalSessionId':_0x4fb457??basename(_0x169311,_0x170232(0x23b)),'cwd':_0x1527e7,..._0x19c68f===undefined||_0x19c68f[_0x170232(0x21f)]===-0xda*-0x23+-0x1549+0x885*-0x1?{}:{'title':compact(_0x19c68f)},'digest':createHash(_0x170232(0x1f4))[_0x170232(0x166)](_0x4b3ac9)[_0x170232(0x1ed)](_0x170232(0x228)),'items':_0xf637cd,'lastActivityAt':Math[_0x170232(0x239)](-0xbd3*-0x2+0x2*-0x1153+-0x10*-0xb0,..._0xf637cd[_0x170232(0x207)](_0x160ec2=>_0x160ec2[_0x170232(0x200)]??-0x4d+-0x19*-0x55+-0x800)),'truncated':_0x153d4e,'windowStart':_0x3d72fc[_0x170232(0x16d)],'windowEnd':_0x3d72fc[_0x170232(0x20e)],'snapshotEnd':_0x3d72fc[_0x170232(0x167)],'fileAnchor':_0x3d72fc[_0x170232(0x1e9)],'anchorBytes':_0x3d72fc[_0x170232(0x215)]};}function derivedTranscriptRecord(_0x4fe71c,_0xaa206e){const _0x11c075=_0x4ab782;if(_0x4fe71c===_0x11c075(0x247))return _0xaa206e[_0x11c075(0x1aa)]===!![];if(_0x4fe71c!==_0x11c075(0x19e)||_0xaa206e[_0x11c075(0x1b8)]!==_0x11c075(0x16b))return![];const _0x53b9d8=isRecord(_0xaa206e[_0x11c075(0x242)])?_0xaa206e[_0x11c075(0x242)]:undefined;if(_0x53b9d8===undefined)return![];if(_0x53b9d8[_0x11c075(0x202)]===_0x11c075(0x1e3))return!![];const _0xe7b3e8=_0x53b9d8[_0x11c075(0x171)];return _0xe7b3e8===_0x11c075(0x1e3)||isRecord(_0xe7b3e8)&&(_0xe7b3e8[_0x11c075(0x23c)]===_0x11c075(0x1e3)||isRecord(_0xe7b3e8[_0x11c075(0x1e3)]));}function workspacePath(_0x2b8590){const _0xa06162=_0x4ab782;return firstString(_0x2b8590,[_0xa06162(0x16a),_0xa06162(0x211),_0xa06162(0x190)])??nestedString(_0x2b8590,[_0xa06162(0x242),_0xa06162(0x16a)])??nestedString(_0x2b8590,[_0xa06162(0x1bf),_0xa06162(0x16a)]);}function sessionId(_0x4593a2){const _0x352a3c=_0x4ab782;if(_0x4593a2[_0x352a3c(0x1b8)]===_0x352a3c(0x16b)){const _0x34641e=nestedString(_0x4593a2,[_0x352a3c(0x242),'id']);if(_0x34641e!==undefined)return _0x34641e;}return firstString(_0x4593a2,[_0x352a3c(0x1b4),_0x352a3c(0x1cc),_0x352a3c(0x164),_0x352a3c(0x19c)])??nestedString(_0x4593a2,[_0x352a3c(0x242),'id'])??nestedString(_0x4593a2,[_0x352a3c(0x242),_0x352a3c(0x1cc)])??nestedString(_0x4593a2,[_0x352a3c(0x242),_0x352a3c(0x164)]);}function codexContextUsage(_0x29b851){const _0x2801cd=_0x4ab782;if(!isRecord(_0x29b851)||_0x29b851[_0x2801cd(0x1b8)]!==_0x2801cd(0x234)||!isRecord(_0x29b851[_0x2801cd(0x242)]))return undefined;const _0x5f8c30=_0x29b851[_0x2801cd(0x242)];if(_0x5f8c30[_0x2801cd(0x1b8)]!==_0x2801cd(0x188)||!isRecord(_0x5f8c30[_0x2801cd(0x22c)]))return undefined;const _0x2f0a4e=_0x5f8c30[_0x2801cd(0x22c)][_0x2801cd(0x183)],_0x5a09dc=_0x5f8c30[_0x2801cd(0x22c)][_0x2801cd(0x209)];if(!isRecord(_0x2f0a4e)||typeof _0x2f0a4e[_0x2801cd(0x1bb)]!==_0x2801cd(0x237)||typeof _0x5a09dc!==_0x2801cd(0x237))return undefined;if(!Number[_0x2801cd(0x1cf)](_0x2f0a4e[_0x2801cd(0x1bb)])||!Number[_0x2801cd(0x21b)](_0x2f0a4e[_0x2801cd(0x1bb)])||!Number[_0x2801cd(0x1cf)](_0x5a09dc)||!Number[_0x2801cd(0x21b)](_0x5a09dc)||_0x5a09dc<=-0x2352+-0x1787+0x1*0x3ad9||_0x2f0a4e[_0x2801cd(0x1bb)]<-0x198*-0x1+-0x1*0x1a6f+-0x18d7*-0x1)return undefined;return{'usedTokens':_0x2f0a4e[_0x2801cd(0x1bb)],'maxTokens':_0x5a09dc};}function claudeContextUsage(_0x4df6d8){const _0x1a096e=_0x4ab782;if(_0x4df6d8[_0x1a096e(0x1b8)]!==_0x1a096e(0x1a9)||!isRecord(_0x4df6d8[_0x1a096e(0x1bf)]))return undefined;const _0x55c473=_0x4df6d8[_0x1a096e(0x1bf)][_0x1a096e(0x220)],_0x13e940=_0x4df6d8[_0x1a096e(0x1bf)][_0x1a096e(0x1e7)];if(typeof _0x55c473!==_0x1a096e(0x22f)||_0x55c473[_0x1a096e(0x21f)]===-0x1c97+0xad*0x10+-0x6f*-0x29||_0x55c473===_0x1a096e(0x17a)||!isRecord(_0x13e940))return undefined;const _0x224d98=nonNegativeInteger(_0x13e940[_0x1a096e(0x1bb)]),_0x5e401e=optionalNonNegativeInteger(_0x13e940[_0x1a096e(0x16c)]),_0x4a123e=optionalNonNegativeInteger(_0x13e940[_0x1a096e(0x1d7)]);if(_0x224d98===undefined||_0x5e401e===undefined||_0x4a123e===undefined)return undefined;return{'model':_0x55c473,'usedTokens':_0x224d98+_0x5e401e+_0x4a123e};}function optionalNonNegativeInteger(_0x5e3689){return _0x5e3689===undefined?-0x23d4+-0x163*-0x19+0x1*0x129:nonNegativeInteger(_0x5e3689);}function nonNegativeInteger(_0x3c8da4){const _0x1f660d=_0x4ab782;return typeof _0x3c8da4===_0x1f660d(0x237)&&Number[_0x1f660d(0x245)](_0x3c8da4)&&_0x3c8da4>=-0xcac+0x2324+-0x1678?_0x3c8da4:undefined;}function positiveInteger(_0x5e9df4){const _0x47da30=_0x4ab782;if(typeof _0x5e9df4!==_0x47da30(0x22f)||!/^\d+$/[_0x47da30(0x1d4)](_0x5e9df4[_0x47da30(0x230)]()))return undefined;const _0x1216b7=Number(_0x5e9df4);return Number[_0x47da30(0x245)](_0x1216b7)&&_0x1216b7>-0x233*-0xd+-0x134*0x20+-0x9e9*-0x1?_0x1216b7:undefined;}function transcriptItems(_0x145c2e,_0x3dfd91){const _0x2d8abd=_0x4ab782,_0x3cfb78=timestampOf(_0x3dfd91),_0x3bd714=[...toolResultsOf(_0x3dfd91,_0x3cfb78),...codexToolResultsOf(_0x3dfd91,_0x3cfb78)];if(_0x3bd714[_0x2d8abd(0x21f)]>-0xa3*0x17+-0x377*0x3+0x190a)return _0x3bd714;const _0x3d8170=[...toolUsesOf(_0x3dfd91,_0x3cfb78),...codexToolUsesOf(_0x3dfd91,_0x3cfb78),...codexReasoningSummariesOf(_0x3dfd91,_0x3cfb78),...unsupportedCodexResponseItems(_0x3dfd91,_0x3cfb78),...unsupportedTranscriptItems(_0x3dfd91,_0x3cfb78)],_0x41891b=roleOf(_0x3dfd91);if(_0x41891b===undefined)return _0x3d8170;const _0x3b03cb=messageText(textOf(_0x3dfd91)??'');if(_0x3b03cb[_0x2d8abd(0x21f)]===-0x8ab+-0x5*0x675+0x2*0x147a)return _0x3d8170;if(_0x41891b===_0x2d8abd(0x1a4)&&isInjectedContextPrompt(_0x3b03cb))return _0x3d8170;const _0x31986c=_0x41891b===_0x2d8abd(0x1a4)&&_0x145c2e===_0x2d8abd(0x19e)?parseCodexComposerImageMarkers(_0x3b03cb):{'text':_0x3b03cb,'images':[]};return _0x3d8170[_0x2d8abd(0x177)]({'kind':_0x2d8abd(0x1bf),'role':_0x41891b,'text':_0x31986c[_0x2d8abd(0x172)],..._0x31986c[_0x2d8abd(0x235)][_0x2d8abd(0x21f)]===-0x7a2*-0x1+0x26*0xc9+-0x2578?{}:{'imageAttachments':_0x31986c[_0x2d8abd(0x235)][_0x2d8abd(0x207)](_0x5e855c=>({'name':_0x2d8abd(0x246)+_0x5e855c[_0x2d8abd(0x217)],'mime':imageMime(_0x5e855c[_0x2d8abd(0x1ef)]),'localPath':_0x5e855c[_0x2d8abd(0x1ef)]}))},'createdAt':_0x3cfb78}),_0x3d8170;}function unsupportedCodexResponseItems(_0x15d7c7,_0x52c9fd){const _0x4a90f5=_0x4ab782,_0x527aa1=codexToolPayload(_0x15d7c7),_0x2978d8=typeof _0x527aa1?.[_0x4a90f5(0x1b8)]===_0x4a90f5(0x22f)?_0x527aa1[_0x4a90f5(0x1b8)]:undefined;if(_0x2978d8===undefined||typeof _0x527aa1?.[_0x4a90f5(0x184)]===_0x4a90f5(0x22f)||_0x2978d8===_0x4a90f5(0x248)||_0x2978d8===_0x4a90f5(0x221)||_0x2978d8===_0x4a90f5(0x198)||_0x2978d8===_0x4a90f5(0x213)||_0x2978d8===_0x4a90f5(0x238))return[];return[{'kind':_0x4a90f5(0x20d),'sourceEventType':_0x4a90f5(0x1b0)+_0x2978d8,'label':_0x4a90f5(0x1f9)+compact(_0x2978d8)[_0x4a90f5(0x1ca)](-0xf*0x21e+-0x522*-0x4+0xb3a,0xa9*0x3b+0x1*0x12af+-0x3922),'createdAt':_0x52c9fd}];}function codexReasoningSummariesOf(_0x5ef4d6,_0x6f5f9c){const _0x12477a=_0x4ab782,_0x547929=codexToolPayload(_0x5ef4d6);if(_0x547929?.[_0x12477a(0x1b8)]!==_0x12477a(0x248))return[];const _0x221626=Array[_0x12477a(0x21a)](_0x547929[_0x12477a(0x20c)])?_0x547929[_0x12477a(0x20c)][_0x12477a(0x1bd)]((_0x36eddf,_0x599f11)=>{const _0x4e2458=_0x12477a;if(typeof _0x36eddf!==_0x4e2458(0x22f))return[];const _0x148497=compact(_0x36eddf)[_0x4e2458(0x1ca)](-0x2*0x1337+-0x115*0xe+0x3594,0x4425+0x2a*-0x1d1+-0x2f35*-0x1);return _0x148497[_0x4e2458(0x21f)]===0x26e4+-0x17*-0x9b+0x3*-0x119b?[]:[{'index':_0x599f11,'text':_0x148497}];}):[];return[{'kind':_0x12477a(0x1e0),'sections':_0x221626,'createdAt':_0x6f5f9c}];}function unsupportedTranscriptItems(_0x22c813,_0x2486b2){const _0x4d3897=_0x4ab782;return contentBlocks(_0x22c813)[_0x4d3897(0x1bd)](_0x4d96a2=>{const _0x10a3ef=_0x4d3897,_0x5cc4e2=typeof _0x4d96a2[_0x10a3ef(0x1b8)]===_0x10a3ef(0x22f)?_0x4d96a2[_0x10a3ef(0x1b8)]:undefined;if(_0x5cc4e2===undefined||_0x5cc4e2===_0x10a3ef(0x172)||_0x5cc4e2===_0x10a3ef(0x1e6)||_0x5cc4e2===_0x10a3ef(0x17c)||_0x5cc4e2===_0x10a3ef(0x1e5)||_0x5cc4e2===_0x10a3ef(0x1d8)||_0x5cc4e2===_0x10a3ef(0x1d0)||_0x5cc4e2===_0x10a3ef(0x1c1)||_0x5cc4e2===_0x10a3ef(0x194)||_0x5cc4e2===_0x10a3ef(0x1a2)||_0x5cc4e2===_0x10a3ef(0x174))return[];return[{'kind':_0x10a3ef(0x20d),'sourceEventType':_0x10a3ef(0x1c2)+_0x5cc4e2,'label':_0x10a3ef(0x1da)+compact(_0x5cc4e2)[_0x10a3ef(0x1ca)](-0x149e+0x99e*-0x1+0x1e3c,0x33c+-0x2405+0x1*0x2149),'createdAt':_0x2486b2}];});}function toolUsesOf(_0x5d0046,_0x2984f0){const _0x245310=_0x4ab782;return contentBlocks(_0x5d0046)[_0x245310(0x1bd)](_0x3b212a=>{const _0x3ffef1=_0x245310;if(_0x3b212a[_0x3ffef1(0x1b8)]!==_0x3ffef1(0x1a2)||typeof _0x3b212a['id']!==_0x3ffef1(0x22f)||typeof _0x3b212a[_0x3ffef1(0x1d6)]!==_0x3ffef1(0x22f))return[];const _0x110dc4=_0x3b212a[_0x3ffef1(0x1f3)],_0x456749=compactValue(_0x110dc4,-0x205*0x1f+-0xb*-0x115+0x5fc*0xf);return[{'kind':_0x3ffef1(0x1f1),'toolUseId':_0x3b212a['id'],'toolName':compact(_0x3b212a[_0x3ffef1(0x1d6)])[_0x3ffef1(0x1ca)](0xb75+-0xb*0x2cf+0x1370,0x266d*0x1+-0x679*0x1+-0x3*0xa7c),'input':_0x110dc4,'inputSummary':_0x456749[_0x3ffef1(0x172)]||null,'inputTruncated':_0x456749[_0x3ffef1(0x186)],'outputSummary':null,'outputTruncated':![],'failed':![],'createdAt':_0x2984f0}];});}function toolResultsOf(_0x2c1dcd,_0x286dbb){const _0x4fed99=_0x4ab782;return contentBlocks(_0x2c1dcd)[_0x4fed99(0x1bd)](_0xae4ec0=>{const _0x258732=_0x4fed99;if(_0xae4ec0[_0x258732(0x1b8)]!==_0x258732(0x174)||typeof _0xae4ec0[_0x258732(0x231)]!==_0x258732(0x22f))return[];const _0x2b2164=compactValue(_0xae4ec0[_0x258732(0x203)],0x138e*-0x2+-0x3aa6+0xa6*0xd3);return[{'kind':_0x258732(0x174),'toolUseId':_0xae4ec0[_0x258732(0x231)],'output':_0x2b2164[_0x258732(0x172)],'failed':_0xae4ec0[_0x258732(0x18e)]===!![],'truncated':_0x2b2164[_0x258732(0x186)],'createdAt':_0x286dbb}];});}function codexToolUsesOf(_0x50a000,_0x30c080){const _0xfbd604=_0x4ab782,_0x3b0244=codexToolPayload(_0x50a000);if(_0x3b0244?.[_0xfbd604(0x1b8)]!==_0xfbd604(0x221)&&_0x3b0244?.[_0xfbd604(0x1b8)]!==_0xfbd604(0x213))return[];const _0x186ce8=firstString(_0x3b0244,[_0xfbd604(0x1d5),'id']),_0x4ede6c=firstString(_0x3b0244,[_0xfbd604(0x1d6),_0xfbd604(0x16e)]);if(_0x186ce8===undefined||_0x4ede6c===undefined)return[];const _0x2945f7=_0x3b0244[_0xfbd604(0x1f3)]??_0x3b0244[_0xfbd604(0x201)],_0x2af54e=compactValue(_0x2945f7,0x8*-0x12b+-0x2669+0x56d1);return[{'kind':_0xfbd604(0x1f1),'toolUseId':_0x186ce8,'toolName':compact(_0x4ede6c)[_0xfbd604(0x1ca)](0x38f+0xeeb+-0x127a,-0x20a6+0xb4a+0x2*0xaee),'input':_0x2945f7,'inputSummary':_0x2af54e[_0xfbd604(0x172)]||null,'inputTruncated':_0x2af54e[_0xfbd604(0x186)],'outputSummary':null,'outputTruncated':![],'failed':![],'createdAt':_0x30c080}];}function codexToolResultsOf(_0x4a15c4,_0x2df623){const _0x1ec2d4=_0x4ab782,_0x4cce65=codexToolPayload(_0x4a15c4);if(_0x4cce65?.[_0x1ec2d4(0x1b8)]!==_0x1ec2d4(0x198)&&_0x4cce65?.[_0x1ec2d4(0x1b8)]!==_0x1ec2d4(0x238))return[];const _0x505d7b=firstString(_0x4cce65,[_0x1ec2d4(0x1d5),'id']);if(_0x505d7b===undefined)return[];const _0x4162f4=compactValue(codexToolOutput(_0x4cce65[_0x1ec2d4(0x193)]??_0x4cce65[_0x1ec2d4(0x1d1)]),-0xdee*0x2+0x1*0x3709+-0x11*-0xb3),_0x3c0642=codexImagePlaceholders(_0x4cce65[_0x1ec2d4(0x193)]??_0x4cce65[_0x1ec2d4(0x1d1)]);return[{'kind':_0x1ec2d4(0x174),'toolUseId':_0x505d7b,'output':_0x4162f4[_0x1ec2d4(0x172)],'failed':_0x4cce65[_0x1ec2d4(0x1ea)]===_0x1ec2d4(0x175)||_0x4cce65[_0x1ec2d4(0x1e2)]!==undefined,'truncated':_0x4162f4[_0x1ec2d4(0x186)],..._0x3c0642[_0x1ec2d4(0x21f)]===-0x247b+0x1997+0xae4?{}:{'imageAttachments':_0x3c0642},'createdAt':_0x2df623}];}function _0x5072(){const _0xd3f587=['mtG4ntaWowrjt3f0wa','y3jLyxrLzf9HDa','ChjVAMvJDhm','Aw1Hz2vFz2vUzxjHDgLVBL9LBMq','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lMnVBxbSzxrLza','CMvHC29UAw5Nx3n1Bw1HCNK','C2vZC2LVBNm','zxjYB3i','C3vIywDLBNq','ANbN','Aw1Hz2u','Aw5WDxrFDgv4Da','DxnHz2u','DMfSDwvZ','zMLSzufUy2HVCG','C3rHDhvZ','C2v0','DMfSDwu','zgLNzxn0','AxneAxjLy3rVCNK','Bg9JywXqyxrO','nKLzqMjKDW','Dg9VBf9JywXS','AgLZDg9YEq','Aw5WDxq','C2HHmJu2','kfvUywjSzsb0BYbKAxnWBgf5kq','AxnnzxrH','BwLU','A2v5CW','q29KzxGG','y3vYC29YqwnJzxb0zwq','CMvZCg9UC2vFAxrLBq','C2v0DgLUz3nqyxrO','D2LUmZi','ywDLBNq','pgnVBw1HBMqTBMfTzt4','y3jLyxrLzef0','yxjNDw1LBNrZ','DgHYzwfKx3nVDxjJzq','y29UDgvUDa','Bgf0zxn0','mta0mdG4ngXusKjcrG','CMvMCMvZAa','BwfW','AgfZ','Bw9KzwXFy29UDgv4Df93Aw5KB3C','CgfYC2vK','AxnwAxnPyMXLsw5uCMfUC2nYAxb0t25SEq','C3vTBwfYEq','Dw5RBM93BG','zw5K','y29Sza','C2L6zq','D29YA2LUz19KAxjLy3rVCNK','lMnSyxvKzq','zNvUy3rPB25Fy2fSBa','C29Tzq','yw5JAg9YqNL0zxm','BMv4DevUza','Aw5KzxG','pgnVBw1HBMqTBwvZC2fNzt4','C3vIywDLBNrZ','AxnbCNjHEq','AxnjBNrLz2vY','DxjS','AhvTyw4','Aw5KzxHpzG','BgvUz3rO','Bw9KzwW','y3vZDg9Tx3rVB2XFy2fSBa','Axnoyu4','BMf0AxzLlNnLC3nPB24UAgLZDg9YEs5ZAw5NBguTzMXPz2H0lwPVAw5Lza','BM93','zxHWAxjLC0f0','BgfZDeLUzgv4t2y','Dw5Yzwy','Agv4','Dg9VBe5HBwu','zMLUz2vYChjPBNq','qvntsvnuqu5u','Aw5MBW','zMLSzxm','Aw1Hz2vNzw4','C3rYAw5N','DhjPBq','Dg9VBf91C2vFAwq','zw52AxjVBM1LBNq','zgvSzxrL','zxzLBNrFBxnN','Aw1Hz2vZ','ywrK','BNvTyMvY','zNvUy3rPB25Fy2fSBf9VDxrWDxq','Bwf4','Dg9VBfvZzuLK','lMPZB25S','A2LUza','Aw1Hz2uVD2vICa','BMv4Da','lY5JB2rLEc9Nzw5LCMf0zwrFAw1Hz2vZlW','Cg5N','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lMzPBgvZlwXPC3rLza','Cgf5Bg9Hza','nJq0mtuXnNHrrvjzAG','B3v0Chv0x2LTywDL','AxntywzLsw50zwDLCG','sw1Hz2uGiW','y2XHDwrLlwnVzgu','CMvHC29UAw5N','C3rHCNrZv2L0Aa','CM91BMq','DxvPza','DgHYzwfKx2LK','zw52','DxbKyxrL','C25HChnOB3rfBMq','tufsx0nmqvverv9dt05urvHux1DjtKrpv19ut0TftLm','Dg9mB2nHBgvmB3DLCKnHC2u','y3DK','C2vZC2LVBL9TzxrH','y2fJAgvFy3jLyxrPB25FAw5WDxrFDg9Rzw5Z','C3rHCNq','Dg9VBa','mJK4nta0uNvfBwnr','CgfNzunVBNrLBNq','C291CMnL','Dgv4Da','CgXHDgzVCM0','Dg9VBf9Yzxn1Bhq','zMfPBgvK','C2f2zwrFCgf0Aa','Dw5ZAgLMDa','lMnVzgv4','y2fJAgviAxrZ','phn5BNrOzxrPyZ4','Aw50zxjYDxb0zwrcEvnODxrKB3DU','B3v0Chv0x3rLEhq','zgf0yq','pgXVy2fSlwnVBw1HBMqT','zxHLyW','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lNbYB2DYzxnZ','mZy1mtbNsvLjwxO','Aw5JBhvKzxm','BgfZDf90B2TLBL91C2fNzq','CM9Szq','C2v0DgLUz3mUANnVBG','Dhj1BMnHDgvK','tKfusvzfx1rsqu5tq1jjufrFvu5bvKfjtefcteu','Dg9Rzw5Fy291BNq','w0LTywDLignVBNrLBNqGzMLSDgvYzwrD','Cgf0Aa','Aw1Hz2uVCg5N','z2LM','ogTVuuzuBq','AxnFzxjYB3i','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lNn0yxj0zwq','D29YA3nWywnLugf0Aa','DgLTzxn0yw1W','tufyx1nbrKvFsu5uruDfuG','B3v0Chv0','zw5JCNLWDgvKx3rOAw5RAw5N','CMvHza','Aw1Hz2vbDhrHy2HTzw50CW','iYbbr0vovfmUBwqGAw5ZDhj1y3rPB25Z','y3vZDg9Tx3rVB2XFy2fSBf9VDxrWDxq','B2jQzwn0','CMvHzeXPBwL0','zgf0ytPPBwfNzs8','y29UDMvYC2f0Aw9Uswq','DxrMoa','y29KzxG','sw1Hz2uGz2vUzxjHDgLVBIbMywLSzwq','mteWmdq4meTXCMzRAa','pgvUDMLYB25Tzw50x2nVBNrLEhq+','Dg9VBf91C2u','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lNnPBMDSzs1MBgLNAhqTAM9PBMvK','vvnfuG','Aw1Hz2uVANbLzW','AM9PBG','pgnVzgv4x2LUDgvYBMfSx2nVBNrLEhq','y29TCgXLDgvK','yxnZAxn0yw50','AxntAwrLy2HHAw4','Aw1Hz2uVz2LM','DMLLD19PBwfNzq','AxndB21Wywn0u3vTBwfYEq','zMLUza','peLou1rsvunusu9ouZ4','y29KzxG6','zMLSDgvY','Aw1Hz2v2Awv3','Aw1Hz2uT','C2vZC2LVBKLK','C3bSAxq','y29Kzq','D2vICa','DhLWzq','DgHLBG','BMf0AxzLlNnLC3nPB24UAgLZDg9YEs5KzxrHAwWTCgfYC2uUy29TCgXLDgvK','Aw5WDxrFDg9Rzw5Z','ru5pru5u','zMXHDe1HCa','sw1Hz2uGz2vUzxjHDgLVBIbJB21WBgv0zwq','BwvZC2fNzq','Dg9mB3DLCKnHC2u','CMvKywn0zwrFDgHPBMTPBMC','DhjHBNnJCMLWDdO','C3rYAw5NAwz5','ANbLzW','Aw1Hz2vFDxjS','CMvWBgfJzq','CgfYzw50vxvPza','DxnLCG','zMLUywXSEq','C2XPy2u','BxrPBwvnCW','C2vZC2LVBL9Pza','zxH0zxjUywXtzxnZAw9Uswq','CgfYC2u','AxngAw5PDgu','DgHPBMTPBMC','y29UDgvUDeL0zw1Z','z2v0','nZu1ndG4EKzrtLrh','DgvZDa','y2fSBf9Pza','BMfTzq','y2fJAgvFCMvHzf9PBNb1Df90B2TLBNm','Aw5WDxrFAw1Hz2u','ChvZAa','qwDLBNqG'];_0x5072=function(){return _0xd3f587;};return _0x5072();}function codexToolPayload(_0xc17389){const _0x1e31dd=_0x4ab782;return _0xc17389[_0x1e31dd(0x1b8)]===_0x1e31dd(0x1fb)&&isRecord(_0xc17389[_0x1e31dd(0x242)])?_0xc17389[_0x1e31dd(0x242)]:undefined;}function codexGeneratedImageEvent(_0x339972){const _0x1f7f83=_0x4ab782;if(_0x339972[_0x1f7f83(0x1b8)]!==_0x1f7f83(0x234)||!isRecord(_0x339972[_0x1f7f83(0x242)]))return undefined;const _0x3bf5d4=_0x339972[_0x1f7f83(0x242)];if(_0x3bf5d4[_0x1f7f83(0x1b8)]!==_0x1f7f83(0x1de)||typeof _0x3bf5d4[_0x1f7f83(0x1d5)]!==_0x1f7f83(0x22f)||typeof _0x3bf5d4[_0x1f7f83(0x176)]!==_0x1f7f83(0x22f))return undefined;const _0x7a638=_0x3bf5d4[_0x1f7f83(0x176)];if(!_0x7a638[_0x1f7f83(0x182)](_0x1f7f83(0x23f))||!/\.(?:png|jpe?g|webp)$/i[_0x1f7f83(0x1d4)](_0x7a638))return undefined;return{'kind':_0x1f7f83(0x1f1),'toolUseId':_0x3bf5d4[_0x1f7f83(0x1d5)],'toolName':_0x1f7f83(0x22e),'input':null,'inputSummary':null,'inputTruncated':![],'outputSummary':_0x3bf5d4[_0x1f7f83(0x1ea)]===_0x1f7f83(0x1a8)?_0x1f7f83(0x1be):_0x1f7f83(0x19f),'outputTruncated':![],'imageAttachments':[{'name':basename(_0x7a638),'mime':imageMime(_0x7a638),'localPath':_0x7a638}],'failed':_0x3bf5d4[_0x1f7f83(0x1ea)]!==_0x1f7f83(0x1a8),'createdAt':timestampOf(_0x339972)};}function codexToolOutput(_0x24fec6){const _0x3d7052=_0x4ab782;if(!Array[_0x3d7052(0x21a)](_0x24fec6))return _0x24fec6;const _0x220efe=_0x24fec6[_0x3d7052(0x1bd)](_0x5b7340=>{const _0x5388a6=_0x3d7052;if(typeof _0x5b7340===_0x5388a6(0x22f))return[_0x5b7340];if(!isRecord(_0x5b7340))return[];const _0x324a3f=firstString(_0x5b7340,[_0x5388a6(0x172),_0x5388a6(0x203)]);return _0x324a3f===undefined?[]:[codexVisibleToolText(_0x324a3f)];});return _0x220efe[_0x3d7052(0x21f)]>-0x1ab1+-0x1bbd+0x366e?_0x220efe[_0x3d7052(0x1a6)](''):_0x24fec6;}function codexVisibleToolText(_0x3ea2b6){const _0x14f6da=_0x4ab782,_0x1dfd8c=_0x14f6da(0x19b);let _0xcd4d69=0x1982+0x10f2+0x23c*-0x13,_0x821936='';while(_0xcd4d69<_0x3ea2b6[_0x14f6da(0x21f)]){const _0x3f0f28=_0x3ea2b6[_0x14f6da(0x21e)](_0x1dfd8c,_0xcd4d69);if(_0x3f0f28<-0x5*0x41f+-0xff3+0x2*0x1247)return _0x821936+_0x3ea2b6[_0x14f6da(0x1ca)](_0xcd4d69);_0x821936+=_0x3ea2b6[_0x14f6da(0x1ca)](_0xcd4d69,_0x3f0f28)+_0x14f6da(0x189);const _0x1a7312=_0x3ea2b6[_0x14f6da(0x21e)]('\x22',_0x3f0f28),_0x2ad550=_0x3ea2b6[_0x14f6da(0x21e)]('\x27',_0x3f0f28),_0x330a9a=_0x1a7312<-0x9a*-0x3f+-0x24d*0x3+-0x1eff?_0x2ad550:_0x2ad550<-0x10a3+-0xe69+0x1f0c?_0x1a7312:Math[_0x14f6da(0x1f7)](_0x1a7312,_0x2ad550);if(_0x330a9a<-0x983+-0x822*-0x2+0x13*-0x5b)return _0x821936;_0xcd4d69=_0x330a9a;}return _0x821936;}function codexImagePlaceholders(_0x39ff9e){const _0x153d5e=[];let _0x1b6539=-0x20a+0x213d+-0x1f33;const _0x2d4825=(_0x2b69f7,_0x3b8f24)=>{const _0x5ac098=_0x1b34;if(_0x153d5e[_0x5ac098(0x21f)]>=-0x13fc+-0x1*-0x151b+-0x11a||_0x1b6539>=0x1c09+-0xe*0x107+-0xd27||_0x3b8f24>-0x1*-0x1d12+-0x5*-0x4d4+0x321*-0x11||_0x2b69f7==null)return;_0x1b6539+=0x919*0x1+-0x1ab*-0xf+-0x221d;if(typeof _0x2b69f7===_0x5ac098(0x22f)){const _0x43a420=[];collectGeneratedImagePaths(_0x2b69f7,_0x43a420);for(const _0x5d351c of _0x43a420){if(_0x153d5e[_0x5ac098(0x214)](_0x5170ad=>_0x5170ad[_0x5ac098(0x1ef)]===_0x5d351c))continue;_0x153d5e[_0x5ac098(0x1d9)]({'name':basename(_0x5d351c),'mime':imageMime(_0x5d351c),'localPath':_0x5d351c});}return;}if(Array[_0x5ac098(0x21a)](_0x2b69f7)){for(const _0x372143 of _0x2b69f7)_0x2d4825(_0x372143,_0x3b8f24+(0x770+0xcf5*-0x1+0x586));return;}if(!isRecord(_0x2b69f7))return;const _0x1a3d58=typeof _0x2b69f7[_0x5ac098(0x1b8)]===_0x5ac098(0x22f)?_0x2b69f7[_0x5ac098(0x1b8)]:'';if(_0x1a3d58===_0x5ac098(0x1e6)&&typeof _0x2b69f7[_0x5ac098(0x172)]===_0x5ac098(0x22f)){const _0x4ac521=/["']image_url["']\s*:\s*["']data:(image\/[^;,"']+)[;,]/[_0x5ac098(0x17f)](_0x2b69f7[_0x5ac098(0x172)])?.[-0x2606+0x129a+0x136d];if(_0x4ac521!==undefined)_0x153d5e[_0x5ac098(0x1d9)]({'name':_0x5ac098(0x1b3)+(_0x153d5e[_0x5ac098(0x21f)]+(0x2664+0x13a5+-0x3*0x1358))+'.'+imageExtension(_0x4ac521),'mime':_0x4ac521});}const _0x348d27=isRecord(_0x2b69f7[_0x5ac098(0x1c5)])?firstString(_0x2b69f7[_0x5ac098(0x1c5)],[_0x5ac098(0x21c)]):typeof _0x2b69f7[_0x5ac098(0x1c5)]===_0x5ac098(0x22f)?_0x2b69f7[_0x5ac098(0x1c5)]:undefined,_0x28bd45=typeof _0x2b69f7[_0x5ac098(0x17d)]===_0x5ac098(0x22f)?_0x2b69f7[_0x5ac098(0x17d)]:_0x348d27;if((_0x1a3d58===_0x5ac098(0x1e5)||_0x1a3d58===_0x5ac098(0x1d8)||_0x1a3d58===_0x5ac098(0x244))&&_0x28bd45?.[_0x5ac098(0x249)](_0x5ac098(0x19b))){const _0x137276=/^data:([^;,]+)[;,]/[_0x5ac098(0x17f)](_0x28bd45)?.[0x5db*-0x1+0x1d00+-0x1724]??_0x5ac098(0x18b);_0x153d5e[_0x5ac098(0x1d9)]({'name':_0x5ac098(0x1b3)+(_0x153d5e[_0x5ac098(0x21f)]+(0xb92+0x106*-0xb+-0x1*0x4f))+'.'+imageExtension(_0x137276),'mime':_0x137276});}for(const _0x24312d of Object[_0x5ac098(0x1e8)](_0x2b69f7))_0x2d4825(_0x24312d,_0x3b8f24+(0xb*0x5e+-0x34*-0x5c+-0x16b9));};return _0x2d4825(_0x39ff9e,0x185e+0x1*0x4be+-0x1d1c),_0x153d5e;}function collectGeneratedImagePaths(_0x242d0f,_0x4e93bc){const _0x488723=_0x4ab782,_0x212c5d=_0x488723(0x23f);let _0xa3a329=-0xf6a+-0x21ba+0x3124;while(_0x4e93bc[_0x488723(0x21f)]<-0x1a5d+-0x6a8+0x210a){const _0x53bf41=_0x242d0f[_0x488723(0x21e)](_0x212c5d,_0xa3a329);if(_0x53bf41<0xc*-0x7f+-0x569+0xb5d)return;let _0x5d8dfa=_0x53bf41;while(_0x5d8dfa>-0x9d*0x39+0x1*0xb11+-0x5f9*-0x4&&!/[\s"']/[_0x488723(0x1d4)](_0x242d0f[_0x5d8dfa-(0x9e+-0x1e5*-0xb+-0x1574)]))_0x5d8dfa-=0x2ff*0x1+0x1*-0xa21+0x723*0x1;let _0x1ad47=_0x53bf41+_0x212c5d[_0x488723(0x21f)];while(_0x1ad47<_0x242d0f[_0x488723(0x21f)]&&!/[\s"']/[_0x488723(0x1d4)](_0x242d0f[_0x1ad47]))_0x1ad47+=0x244b+-0x184d*-0x1+-0x3c97*0x1;const _0x3da14c=_0x242d0f[_0x488723(0x1ca)](_0x5d8dfa,_0x1ad47)[_0x488723(0x1c6)](/[),.;:]+$/,'');if(/\.(?:png|jpe?g|webp)$/i[_0x488723(0x1d4)](_0x3da14c)&&!_0x4e93bc[_0x488723(0x182)](_0x3da14c))_0x4e93bc[_0x488723(0x1d9)](_0x3da14c);_0xa3a329=_0x1ad47;}}function imageMime(_0x4df76d){const _0x5b7baa=_0x4ab782,_0x336950=_0x4df76d[_0x5b7baa(0x1ca)](_0x4df76d[_0x5b7baa(0x226)]('.')+(0x11*-0x1d8+-0xbf*0x4+-0x31f*-0xb))[_0x5b7baa(0x1c0)]();if(_0x336950===_0x5b7baa(0x1e4)||_0x336950===_0x5b7baa(0x1c4))return _0x5b7baa(0x1a5);if(_0x336950===_0x5b7baa(0x1b7))return _0x5b7baa(0x23d);return _0x5b7baa(0x18b);}function imageExtension(_0x5ab997){const _0x10c1b4=_0x4ab782;if(_0x5ab997===_0x10c1b4(0x1a5))return _0x10c1b4(0x1e4);if(_0x5ab997===_0x10c1b4(0x23d))return _0x10c1b4(0x1b7);if(_0x5ab997===_0x10c1b4(0x1ab))return _0x10c1b4(0x18c);return _0x10c1b4(0x240);}function withToolResult(_0x21c112,_0x17ad6d){const _0x3b429e=_0x4ab782,_0x1aa9ee=codexViewedImagePath(_0x21c112),_0x5ece3d=_0x17ad6d[_0x3b429e(0x196)]?.[_0x3b429e(0x207)](_0x38796c=>_0x38796c[_0x3b429e(0x1ef)]!==undefined||_0x1aa9ee===undefined?_0x38796c:{'name':basename(_0x1aa9ee),'mime':imageMime(_0x1aa9ee),'localPath':_0x1aa9ee});return{..._0x21c112,'outputSummary':_0x17ad6d[_0x3b429e(0x193)],'outputTruncated':_0x17ad6d[_0x3b429e(0x186)],..._0x5ece3d===undefined?{}:{'imageAttachments':_0x5ece3d},'failed':_0x17ad6d[_0x3b429e(0x175)]};}function codexViewedImagePath(_0x5c087c){const _0x46d3ec=_0x4ab782,_0x2c4c4d=_0x5c087c[_0x46d3ec(0x229)][_0x46d3ec(0x1c0)]();if(_0x2c4c4d===_0x46d3ec(0x1ac)||_0x2c4c4d===_0x46d3ec(0x1b2))return isRecord(_0x5c087c[_0x46d3ec(0x1f3)])&&typeof _0x5c087c[_0x46d3ec(0x1f3)][_0x46d3ec(0x18a)]===_0x46d3ec(0x22f)?_0x5c087c[_0x46d3ec(0x1f3)][_0x46d3ec(0x18a)]:undefined;if(_0x2c4c4d!==_0x46d3ec(0x17f)||typeof _0x5c087c[_0x46d3ec(0x1f3)]!==_0x46d3ec(0x22f))return undefined;if(!/tools\.view_image\s*\(/[_0x46d3ec(0x1d4)](_0x5c087c[_0x46d3ec(0x1f3)]))return undefined;const _0x2b7b77=/["']path["']\s*:\s*("(?:\\.|[^"\\])*")/[_0x46d3ec(0x17f)](_0x5c087c[_0x46d3ec(0x1f3)])?.[-0x1a1f+-0xea2+0x25*0x11a];if(_0x2b7b77===undefined)return undefined;try{const _0x4f7200=JSON[_0x46d3ec(0x1ce)](_0x2b7b77);return typeof _0x4f7200===_0x46d3ec(0x22f)?_0x4f7200:undefined;}catch{return undefined;}}function isInjectedContextPrompt(_0x1b74a6){const _0x1df406=_0x4ab782,_0x48709f=_0x1b74a6[_0x1df406(0x1c6)](/\s+/g,'\x20')[_0x1df406(0x230)]();if(_0x48709f[_0x1df406(0x249)](_0x1df406(0x1a7)))return!![];return _0x48709f[_0x1df406(0x249)](_0x1df406(0x197))&&(_0x48709f[_0x1df406(0x182)](_0x1df406(0x1af))||_0x48709f[_0x1df406(0x182)](_0x1df406(0x1a1)));}function isHiddenTranscriptRecord(_0x13a3cc){const _0x5118b2=_0x4ab782;if(contentBlocks(_0x13a3cc)[_0x5118b2(0x214)](_0x3a28cb=>_0x3a28cb[_0x5118b2(0x1b8)]===_0x5118b2(0x174)))return![];if(_0x13a3cc[_0x5118b2(0x17b)]===!![]||_0x13a3cc[_0x5118b2(0x1f6)]===!![]||_0x13a3cc[_0x5118b2(0x20b)]===!![]||_0x13a3cc[_0x5118b2(0x1ad)]===!![])return!![];const _0x48ae67=textOf(_0x13a3cc)?.[_0x5118b2(0x230)]()??'';return _0x48ae67[_0x5118b2(0x249)](_0x5118b2(0x17e))||_0x48ae67[_0x5118b2(0x249)](_0x5118b2(0x1ff))||_0x48ae67[_0x5118b2(0x249)](_0x5118b2(0x218));}function roleOf(_0x389716){const _0x2a4c6f=_0x4ab782,_0x134e95=[firstString(_0x389716,[_0x2a4c6f(0x184)]),nestedString(_0x389716,[_0x2a4c6f(0x1bf),_0x2a4c6f(0x184)]),nestedString(_0x389716,[_0x2a4c6f(0x242),_0x2a4c6f(0x184)]),firstString(_0x389716,[_0x2a4c6f(0x1b8)]),nestedString(_0x389716,[_0x2a4c6f(0x242),_0x2a4c6f(0x1b8)])];if(_0x134e95[_0x2a4c6f(0x214)](_0x208658=>_0x208658===_0x2a4c6f(0x1c8)||_0x208658===_0x2a4c6f(0x21d)||_0x208658===_0x2a4c6f(0x1f3)))return _0x2a4c6f(0x1a4);if(_0x134e95[_0x2a4c6f(0x214)](_0x115fc5=>_0x115fc5===_0x2a4c6f(0x1a9)||_0x115fc5===_0x2a4c6f(0x1fe)||_0x115fc5===_0x2a4c6f(0x193)))return _0x2a4c6f(0x22b);return undefined;}function textOf(_0x14b076){const _0x45b46f=_0x4ab782;return firstString(_0x14b076,[_0x45b46f(0x203),_0x45b46f(0x172)])??nestedText(_0x14b076[_0x45b46f(0x1bf)])??nestedText(_0x14b076[_0x45b46f(0x242)]);}function nestedText(_0x17aad5){const _0x43c9ea=_0x4ab782;if(typeof _0x17aad5===_0x43c9ea(0x22f))return _0x17aad5;if(!isRecord(_0x17aad5))return undefined;const _0x134726=firstString(_0x17aad5,[_0x43c9ea(0x203),_0x43c9ea(0x172),_0x43c9ea(0x1bf)]);if(_0x134726!==undefined)return _0x134726;if(Array[_0x43c9ea(0x21a)](_0x17aad5[_0x43c9ea(0x203)])){const _0x10ef2c=_0x17aad5[_0x43c9ea(0x203)][_0x43c9ea(0x1bd)](_0x280284=>{const _0x56d631=_0x43c9ea;if(typeof _0x280284===_0x56d631(0x22f))return[_0x280284];if(!isRecord(_0x280284))return[];return[firstString(_0x280284,[_0x56d631(0x172),_0x56d631(0x203)])][_0x56d631(0x1b1)](_0x897192=>_0x897192!==undefined);});return _0x10ef2c[_0x43c9ea(0x1a6)]('\x0a');}return undefined;}function contentBlocks(_0x147cf9){const _0x7c0768=_0x4ab782,_0x52c5b7=[_0x147cf9[_0x7c0768(0x1bf)],_0x147cf9[_0x7c0768(0x242)]];for(const _0x236cfc of _0x52c5b7)if(isRecord(_0x236cfc)&&Array[_0x7c0768(0x21a)](_0x236cfc[_0x7c0768(0x203)]))return _0x236cfc[_0x7c0768(0x203)][_0x7c0768(0x1b1)](isRecord);return[];}function compactValue(_0x2e621b,_0x3a8e3d){const _0x51b3d8=_0x4ab782;if(_0x2e621b===undefined||_0x2e621b===null)return{'text':'','truncated':![]};let _0x58dc68;if(typeof _0x2e621b===_0x51b3d8(0x22f))_0x58dc68=_0x2e621b;else try{_0x58dc68=JSON[_0x51b3d8(0x1c3)](_0x2e621b);}catch{return{'text':_0x51b3d8(0x1f5),'truncated':![]};}return{'text':_0x58dc68[_0x51b3d8(0x21f)]<=_0x3a8e3d?_0x58dc68:_0x58dc68[_0x51b3d8(0x1ca)](0x1b15+0x1*-0xbcf+0x2*-0x7a3,Math[_0x51b3d8(0x239)](0x12ab*-0x2+0xe51*-0x2+0x1*0x41f8,_0x3a8e3d-(0x1d91+-0x10fb+0x1*-0xc95)))+'…','truncated':_0x58dc68[_0x51b3d8(0x21f)]>_0x3a8e3d};}function timestampOf(_0x438976){const _0x3f663e=_0x4ab782,_0x29afe1=_0x438976[_0x3f663e(0x191)]??_0x438976[_0x3f663e(0x1dc)]??_0x438976[_0x3f663e(0x200)];if(typeof _0x29afe1===_0x3f663e(0x237)&&Number[_0x3f663e(0x1cf)](_0x29afe1))return _0x29afe1<-0x1ad5421ed+-0xf7e36501+0x2b*0x1d9c5bca?_0x29afe1*(-0x42d*-0x1+-0x1f4c+-0x2f*-0xa9):_0x29afe1;if(typeof _0x29afe1===_0x3f663e(0x22f)){const _0xf8f2ad=Date[_0x3f663e(0x1ce)](_0x29afe1);return Number[_0x3f663e(0x222)](_0xf8f2ad)?null:_0xf8f2ad;}return null;}function firstString(_0x6240cf,_0x22e979){const _0x7c40d3=_0x4ab782;for(const _0x1ce062 of _0x22e979)if(typeof _0x6240cf[_0x1ce062]===_0x7c40d3(0x22f)&&_0x6240cf[_0x1ce062][_0x7c40d3(0x21f)]>-0x1a42+0x110d+0x935)return _0x6240cf[_0x1ce062];return undefined;}function nestedString(_0x798845,_0x450399){const _0x4d1aff=_0x4ab782;let _0x401448=_0x798845;for(const _0x219826 of _0x450399){if(!isRecord(_0x401448))return undefined;_0x401448=_0x401448[_0x219826];}return typeof _0x401448===_0x4d1aff(0x22f)&&_0x401448[_0x4d1aff(0x21f)]>0x1*-0x9f5+-0x2659+0x304e?_0x401448:undefined;}function compact(_0x51695b){const _0x367608=_0x4ab782;return _0x51695b[_0x367608(0x1c6)](/\s+/g,'\x20')[_0x367608(0x230)]()[_0x367608(0x1ca)](-0x16cb+0x2239*-0x1+0x3904,-0x3a64+-0x2*0x3499+-0x2b*-0x542);}function messageText(_0xac4009){const _0x4ba0ab=_0x4ab782;return _0xac4009[_0x4ba0ab(0x230)]()[_0x4ba0ab(0x1ca)](0x219b+-0x19dd+0x2*-0x3df,-0x3c86+-0x47*-0x59+-0x19*-0x3ef);}function canonical(_0x2eff49){const _0x3ecd2f=_0x4ab782;try{const _0x281084=resolve(_0x2eff49)[_0x3ecd2f(0x1c6)](/[\\/]+$/,'');return process[_0x3ecd2f(0x173)]===_0x3ecd2f(0x1fd)?_0x281084[_0x3ecd2f(0x169)]():_0x281084;}catch{return _0x2eff49;}}function indexKey(_0x2c69f3,_0x5a19e8,_0x2f6a35){return _0x2c69f3+'\x00'+_0x5a19e8+'\x00'+_0x2f6a35;}function setTranscriptIndex(_0x459e61,_0x489dd7){const _0x254c66=_0x4ab782,_0x504af4=transcriptIndexTimers[_0x254c66(0x1d2)](_0x459e61);if(_0x504af4!==undefined)clearTimeout(_0x504af4);transcriptIndex[_0x254c66(0x1eb)](_0x459e61,_0x489dd7);const _0x36a84b=setTimeout(()=>deleteTranscriptIndex(_0x459e61),TRANSCRIPT_INDEX_TTL_MS);_0x36a84b[_0x254c66(0x227)](),transcriptIndexTimers[_0x254c66(0x1eb)](_0x459e61,_0x36a84b);}function getTranscriptIndex(_0x490026){const _0x127e20=_0x4ab782;return transcriptIndex[_0x127e20(0x1d2)](_0x490026);}function deleteTranscriptIndex(_0x579ba8){const _0xb9fcc0=_0x4ab782,_0x423873=transcriptIndexTimers[_0xb9fcc0(0x1d2)](_0x579ba8);if(_0x423873!==undefined)clearTimeout(_0x423873);transcriptIndexTimers[_0xb9fcc0(0x233)](_0x579ba8),transcriptIndex[_0xb9fcc0(0x233)](_0x579ba8);}function isRecord(_0x288dc0){const _0x922a30=_0x4ab782;return typeof _0x288dc0===_0x922a30(0x199)&&_0x288dc0!==null&&!Array[_0x922a30(0x21a)](_0x288dc0);}