@myagentroam/node 0.9.8 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) 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 -841
  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 -973
  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 -83
  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 -0
  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 -93
  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 -169
  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 -35
  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/run-attachment-service.d.ts +0 -38
  170. package/dist/service/run-domain-state.d.ts +0 -4
  171. package/dist/service/run-event-service.d.ts +0 -33
  172. package/dist/service/run-workbench-service.d.ts +0 -25
  173. package/dist/service/runner-channel-message-service.d.ts +0 -13
  174. package/dist/service/runner-interaction-service.d.ts +0 -39
  175. package/dist/service/runner-service.d.ts +0 -46
  176. package/dist/service/session-catalog-service.d.ts +0 -45
  177. package/dist/service/session-command-service.d.ts +0 -24
  178. package/dist/service/session-context-service.d.ts +0 -35
  179. package/dist/service/session-domain-state.d.ts +0 -9
  180. package/dist/service/session-identity-service.d.ts +0 -24
  181. package/dist/service/session-lifecycle-service.d.ts +0 -31
  182. package/dist/service/session-message-service.d.ts +0 -33
  183. package/dist/service/session-presentation-service.d.ts +0 -34
  184. package/dist/service/session-query-service.d.ts +0 -35
  185. package/dist/service/skill-directory-service.d.ts +0 -20
  186. package/dist/service/skill-install-service.d.ts +0 -21
  187. package/dist/service/skill-node-operation-service.d.ts +0 -44
  188. package/dist/service/terminal-relay-state.d.ts +0 -6
  189. package/dist/service/terminal-service.d.ts +0 -12
  190. package/dist/service/workbench-event-service.d.ts +0 -9
  191. package/dist/service/workbench-manifest-service.d.ts +0 -90
  192. package/dist/service/workspace-change-service.d.ts +0 -9
  193. package/dist/service/workspace-content-search-service.d.ts +0 -14
  194. package/dist/service/workspace-domain-state.d.ts +0 -79
  195. package/dist/service/workspace-file-service.d.ts +0 -18
  196. package/dist/service/workspace-git-exclude-service.d.ts +0 -4
  197. package/dist/service/workspace-queue-workbench-service.d.ts +0 -86
  198. package/dist/service/workspace-service.d.ts +0 -15
  199. package/dist/service/workspace-session-service.d.ts +0 -23
  200. package/dist/service/workspace-upload-service.d.ts +0 -39
  201. package/dist/service/workspace-watch-service.d.ts +0 -23
  202. package/dist/service/workspace-workbench-service.d.ts +0 -58
  203. package/dist/service.d.ts +0 -4
  204. package/dist/storage.d.ts +0 -2
  205. package/dist/supervisor.d.ts +0 -1
  206. package/dist/terminal.d.ts +0 -133
  207. package/dist/util/node-operation-parsers.d.ts +0 -92
  208. package/dist/util/personal-instructions.d.ts +0 -2
  209. package/dist/util/runner-error.d.ts +0 -6
  210. package/dist/util/runner-native-session-parsers.d.ts +0 -74
  211. package/dist/util/safe-error.d.ts +0 -2
  212. package/dist/util/secret-environment.d.ts +0 -1
  213. 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 _0x3d3b4b=_0x4b0f;(function(_0x56973e,_0x46d00e){const _0x2caaaf=_0x4b0f,_0x19c63a=_0x56973e();while(!![]){try{const _0x299d8b=-parseInt(_0x2caaaf(0x270))/(0x4bb*-0x1+0x43*0x3+0x3f3)*(parseInt(_0x2caaaf(0x1dd))/(0x1*-0x15b3+-0x101*0x3+-0x18b8*-0x1))+-parseInt(_0x2caaaf(0x1e7))/(0x1*-0x1843+0x347*-0xb+-0x3c53*-0x1)+-parseInt(_0x2caaaf(0x2bc))/(0x1efd+-0x5*0x103+-0xd6*0x1f)+-parseInt(_0x2caaaf(0x296))/(-0x329*-0xb+-0x1861+0x1*-0xa5d)+-parseInt(_0x2caaaf(0x243))/(-0xd5c+0x1*0x2461+-0x1d*0xcb)+-parseInt(_0x2caaaf(0x1ed))/(0x1767+-0x119f+-0x5c1)+-parseInt(_0x2caaaf(0x2af))/(0x13cb+0x24f1+-0x17e*0x26)*(-parseInt(_0x2caaaf(0x299))/(0x16df+0x22*0x116+-0x3bc2));if(_0x299d8b===_0x46d00e)break;else _0x19c63a['push'](_0x19c63a['shift']());}catch(_0x1bfcb1){_0x19c63a['push'](_0x19c63a['shift']());}}}(_0x4ccf,0x1*-0x6718f+0x3*0x36127+-0x7*-0x126a6));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=(-0x1b74+-0x21de+0x3d72)*(0x14a1+-0x4e1*-0x3+-0x1f44),TRANSCRIPT_HEADER_READ_BYTES=(0x1*0x1697+0x1*-0xbc3+0x224*-0x5)*(0x3dc*-0x6+0xfef+0xb39*0x1),TRANSCRIPT_READ_MAX_BYTES=(-0x1bb8+0x211*0x4+0x1384)*(-0x11ae*-0x1+-0xb74+-0x1e*0x13)*(-0x47e*-0x7+0x107a+-0x2bec),TRANSCRIPT_MIN_LINES=-0x1*0x3e0+0x22ba+-0x1dda,TRANSCRIPT_MAX_LINES=0x217f+0x1*-0xa7e+0x1*-0x701,TRANSCRIPT_LINES_PER_TURN=0x1*-0xa56+0x5*-0xd7+0xea9,CONTEXT_USAGE_READ_BYTES=(0x1*-0x1306+-0xcb8+0x20be*0x1)*(-0x7*-0x2ad+0xa68+-0x41*0x63),CLAUDE_CONTEXT_USAGE_READ_BYTES=[CONTEXT_USAGE_READ_BYTES,(0x1f3*0x13+-0xade+-0x162b)*(0xb26*0x1+0xba4+-0x965*0x2),(0x10c9+0x7eb+-0x18b0)*(-0x109b*-0x1+-0x2f*0x9f+0x2*0x84b)*(0x1942+0x3*-0x617+0x55*-0x9)],TRANSCRIPT_INDEX_TTL_MS=(-0x25*-0xe9+0xa7*-0x32+-0xd3)*(0x9054+-0x11cc1+0x11d9*0x15),DISCOVERY_SNAPSHOT_TTL_MS=-0x18fb+0xa90*-0x2+0x7*0xef5,TRANSCRIPT_DETAIL_CACHE_TTL_MS=0x5578*-0x1+-0x16660+0x2a638,TRANSCRIPT_DETAIL_CACHE_MAX_ENTRIES=0x491+0xc*-0x20f+-0x1*-0x1433,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=-0x36187+0x271d7*-0x2+0x3c627*0x3,CLAUDE_CONTEXT_WINDOW_ENV=_0x3d3b4b(0x1e9);export async function discoverNativeSessions(_0x370bbd,_0x300ec1){const _0x434a01=_0x3d3b4b,_0x13308e=canonical(_0x300ec1);return(await discoverAllNativeSessions(_0x370bbd))[_0x434a01(0x23e)](_0x4f06f1=>canonical(_0x4f06f1[_0x434a01(0x2a8)])===_0x13308e);}export async function discoverAllNativeSessions(_0x32ab6f){const _0x5c3a84=_0x3d3b4b,_0x301b9d=discoveryKey(_0x32ab6f),_0x4dd13e=discoverySnapshots[_0x5c3a84(0x27c)](_0x301b9d);if(_0x4dd13e!==undefined&&_0x4dd13e[_0x5c3a84(0x2a2)]>Date[_0x5c3a84(0x26d)]())return _0x4dd13e[_0x5c3a84(0x240)]+=0x1*-0xa5a+-0x232*-0xb+-0xdcb,_0x4dd13e[_0x5c3a84(0x253)];const _0x2b45af=discoveryReads[_0x5c3a84(0x27c)](_0x301b9d);if(_0x2b45af!==undefined)return nodeLog(_0x5c3a84(0x20e),{'runner':_0x32ab6f}),_0x2b45af;const _0x449ebb=discoveryGenerations[_0x5c3a84(0x27c)](_0x301b9d)??0x873+0x1771+-0x4*0x7f9,_0x720aba=performNativeSessionDiscovery(_0x32ab6f,_0x4dd13e)[_0x5c3a84(0x236)](_0x52cd1e=>{const _0x17bdf4=_0x5c3a84;if((discoveryGenerations[_0x17bdf4(0x27c)](_0x301b9d)??-0x16fa+-0xa9*0x1f+0x2b71)===_0x449ebb)discoverySnapshots[_0x17bdf4(0x246)](_0x301b9d,_0x52cd1e);return _0x52cd1e[_0x17bdf4(0x253)];})[_0x5c3a84(0x225)](()=>{const _0x1d94b1=_0x5c3a84;if(discoveryReads[_0x1d94b1(0x27c)](_0x301b9d)===_0x720aba)discoveryReads[_0x1d94b1(0x258)](_0x301b9d);});return discoveryReads[_0x5c3a84(0x246)](_0x301b9d,_0x720aba),_0x720aba;}async function performNativeSessionDiscovery(_0x19c2d3,_0x4dc85f){const _0x47df90=_0x3d3b4b,_0x59f10b=performance[_0x47df90(0x26d)](),_0x43df8e=new Map();nodeLog(_0x47df90(0x22f),{'runner':_0x19c2d3});const _0x167ac8=(await listJsonlFiles(transcriptRoot(_0x19c2d3)))[_0x47df90(0x23e)](_0x511cff=>_0x19c2d3!==_0x47df90(0x1e5)||!_0x511cff[_0x47df90(0x283)](/[\\/]/u)[_0x47df90(0x2b3)](_0x47df90(0x22e)));nodeLog(_0x47df90(0x22d),{'runner':_0x19c2d3,'files':_0x167ac8[_0x47df90(0x25c)],'durationMs':Math[_0x47df90(0x2bd)](performance[_0x47df90(0x26d)]()-_0x59f10b)});let _0x83d80f=-0x1c3c+0x1344+-0x148*-0x7,_0x44a6e3=0x9*-0x26b+0x1e43+0x880*-0x1,_0x500108=-0x165e+-0x123b+-0x1*-0x2899,_0x5565ae=-0xc51+0x5*0x10b+0x65*0x12,_0x3426df=-0x15d1+0x5*-0x44b+0x2b48,_0x25484b=-0x55b*-0x4+0x1d*-0xed+-0x56d*-0x1;const _0x584aae=await mapConcurrent(_0x167ac8,0x3*0x1a5+0x1c*-0x133+-0x1cc5*-0x1,async _0x6a26ba=>{const _0xf7f042=_0x47df90;let _0x349b1f;const _0x4f1946=performance[_0xf7f042(0x26d)]();try{const _0x424ef0=await stat(_0x6a26ba);_0x349b1f=_0x424ef0[_0xf7f042(0x24f)]+':'+_0x424ef0[_0xf7f042(0x292)];}catch{return _0x5565ae+=0x1952+-0x2383*0x1+0xa32,undefined;}finally{_0x3426df+=performance[_0xf7f042(0x26d)]()-_0x4f1946;}const _0x4649fe=_0x4dc85f?.[_0xf7f042(0x2b4)][_0xf7f042(0x27c)](_0x6a26ba);let _0x3472d0;if(_0x4649fe?.[_0xf7f042(0x2b2)]===_0x349b1f)_0x3472d0=_0x4649fe[_0xf7f042(0x1f5)],_0x500108+=0x1325+-0x15a*0x2+-0x1070;else{const _0x4dcb07=performance[_0xf7f042(0x26d)]();_0x3472d0=await readTranscript(_0x6a26ba,_0x19c2d3,DISCOVERY_READ_BYTES),_0x25484b+=performance[_0xf7f042(0x26d)]()-_0x4dcb07,_0x44a6e3+=-0x43*-0x7f+-0x416+0xb6*-0x29;}_0x83d80f+=-0x15b3+-0x1d71*-0x1+-0x7bd;if(_0x83d80f%(-0x33*0x3b+0x644+-0x1*-0x677)===-0xe*0x1a3+0x395+0x31*0x65)nodeLog(_0xf7f042(0x220),{'runner':_0x19c2d3,'completed':_0x83d80f,'files':_0x167ac8[_0xf7f042(0x25c)],'parsedFiles':_0x44a6e3,'reusedFiles':_0x500108,'metadataFailures':_0x5565ae,'metadataWorkMs':Math[_0xf7f042(0x2bd)](_0x3426df),'parseWorkMs':Math[_0xf7f042(0x2bd)](_0x25484b),'durationMs':Math[_0xf7f042(0x2bd)](performance[_0xf7f042(0x26d)]()-_0x59f10b)});return{'path':_0x6a26ba,'fingerprint':_0x349b1f,'parsed':_0x3472d0};}),_0x196932=new Map();for(const _0x495795 of _0x584aae){if(_0x495795===undefined)continue;_0x196932[_0x47df90(0x246)](_0x495795[_0x47df90(0x28f)],{'fingerprint':_0x495795[_0x47df90(0x2b2)],'parsed':_0x495795[_0x47df90(0x1f5)]});const _0x4a97b7=_0x495795[_0x47df90(0x1f5)];if(_0x4a97b7===undefined)continue;const _0x7234da=canonical(_0x4a97b7[_0x47df90(0x2a8)]);setTranscriptIndex(indexKey(_0x19c2d3,_0x7234da,_0x4a97b7[_0x47df90(0x2ba)]),_0x495795[_0x47df90(0x28f)]),_0x43df8e[_0x47df90(0x246)](_0x7234da+'\x00'+_0x4a97b7[_0x47df90(0x2ba)],_0x4a97b7);}return nodeLog(_0x47df90(0x21a),{'runner':_0x19c2d3,'files':_0x167ac8[_0x47df90(0x25c)],'sessions':_0x43df8e[_0x47df90(0x24f)],'parsedFiles':_0x44a6e3,'reusedFiles':_0x500108,'unparsedFiles':[..._0x196932[_0x47df90(0x2a5)]()][_0x47df90(0x23e)](_0x519387=>_0x519387[_0x47df90(0x1f5)]===undefined)[_0x47df90(0x25c)],'metadataFailures':_0x5565ae,'metadataWorkMs':Math[_0x47df90(0x2bd)](_0x3426df),'parseWorkMs':Math[_0x47df90(0x2bd)](_0x25484b),'cacheMode':_0x4dc85f===undefined?_0x47df90(0x297):_0x47df90(0x27d),'previousCacheHits':_0x4dc85f?.[_0x47df90(0x240)]??-0x25e2+0x1*0x5a7+0x203b,'durationMs':Math[_0x47df90(0x2bd)](performance[_0x47df90(0x26d)]()-_0x59f10b)}),{'expiresAt':Date[_0x47df90(0x26d)]()+DISCOVERY_SNAPSHOT_TTL_MS,'files':_0x196932,'sessions':[..._0x43df8e[_0x47df90(0x2a5)]()],'cacheHits':0x0};}export async function readNativeSession(_0x1557fc,_0x3eb489,_0xccd550,_0x523ed5,_0x37bae8=0x14e4+0x1660+-0x2b26){const _0x1fab51=_0x3d3b4b,_0x54e6d7=canonical(_0x3eb489),_0x33a4b9=getTranscriptIndex(indexKey(_0x1557fc,_0x54e6d7,_0xccd550));if(_0x33a4b9===undefined)return undefined;const _0x520798=await readTranscriptDetail(_0x33a4b9,_0x1557fc,_0x523ed5,_0x523ed5?.[_0x1fab51(0x29a)]??_0x37bae8),_0x2f95d3=_0x520798?.[_0x1fab51(0x207)];if(_0x2f95d3===undefined||_0x2f95d3[_0x1fab51(0x2ba)]!==_0xccd550||canonical(_0x2f95d3[_0x1fab51(0x2a8)])!==_0x54e6d7)return deleteTranscriptIndex(indexKey(_0x1557fc,_0x54e6d7,_0xccd550)),undefined;return _0x520798?.[_0x1fab51(0x2b8)]===![]?{..._0x2f95d3,'cursorReset':!![]}:_0x2f95d3;}async function readTranscriptDetail(_0x17cf5c,_0x233fc0,_0x1f3df2,_0x300186){const _0x21c2ea=_0x3d3b4b;let _0x2dcf30;try{const _0x43b7e9=await stat(_0x17cf5c);_0x2dcf30=_0x43b7e9[_0x21c2ea(0x24f)]+':'+_0x43b7e9[_0x21c2ea(0x292)];}catch{return undefined;}const _0x48a049=Number(_0x2dcf30[_0x21c2ea(0x249)](-0x1864+-0x1817+-0x24f*-0x15,_0x2dcf30[_0x21c2ea(0x27e)](':'))),_0x160234=_0x1f3df2!==undefined&&_0x1f3df2[_0x21c2ea(0x221)]<=_0x48a049&&await readJsonlFileAnchor(_0x17cf5c,_0x1f3df2[_0x21c2ea(0x229)])===_0x1f3df2[_0x21c2ea(0x1f7)]?_0x1f3df2:undefined,_0x2b734e=Math[_0x21c2ea(0x213)](TRANSCRIPT_MAX_LINES,Math[_0x21c2ea(0x234)](TRANSCRIPT_MIN_LINES,Math[_0x21c2ea(0x234)](0x8bc+0xd80+0x163b*-0x1,_0x300186)*TRANSCRIPT_LINES_PER_TURN)),_0x4f6bc8=(_0x160234===undefined?_0x21c2ea(0x2bf):_0x160234[_0x21c2ea(0x1f7)]+':'+_0x160234[_0x21c2ea(0x221)]+':'+_0x160234[_0x21c2ea(0x1e6)])+':'+_0x2b734e,_0x1ec961=_0x233fc0+'\x00'+_0x17cf5c+'\x00'+_0x4f6bc8,_0x4df18e=_0x160234===undefined?_0x2dcf30:_0x160234[_0x21c2ea(0x1f7)]+':'+_0x160234[_0x21c2ea(0x221)],_0x10ab22=transcriptDetailCache[_0x21c2ea(0x27c)](_0x1ec961);if(_0x10ab22?.[_0x21c2ea(0x2b2)]===_0x4df18e&&_0x10ab22[_0x21c2ea(0x2a2)]>Date[_0x21c2ea(0x26d)]())return _0x10ab22[_0x21c2ea(0x2a2)]=Date[_0x21c2ea(0x26d)]()+TRANSCRIPT_DETAIL_CACHE_TTL_MS,transcriptDetailCache[_0x21c2ea(0x258)](_0x1ec961),transcriptDetailCache[_0x21c2ea(0x246)](_0x1ec961,_0x10ab22),{'history':_0x10ab22[_0x21c2ea(0x1f5)],'cursorAccepted':_0x1f3df2===undefined||_0x160234!==undefined};transcriptDetailCache[_0x21c2ea(0x258)](_0x1ec961);const _0x1b1ab8=transcriptDetailReads[_0x21c2ea(0x27c)](_0x1ec961);if(_0x1b1ab8?.[_0x21c2ea(0x2b2)]===_0x4df18e)return nodeLog(_0x21c2ea(0x223),{'runner':_0x233fc0}),{'history':await _0x1b1ab8[_0x21c2ea(0x289)],'cursorAccepted':_0x1f3df2===undefined||_0x160234!==undefined};const _0x70e07a=performance[_0x21c2ea(0x26d)](),_0x4b21ce=readTranscript(_0x17cf5c,_0x233fc0,TRANSCRIPT_READ_MAX_BYTES,_0x160234,_0x2b734e)[_0x21c2ea(0x236)](_0x4a3b74=>_0x4a3b74===undefined?undefined:{..._0x4a3b74,'windowReadLimit':_0x1f3df2?.[_0x21c2ea(0x29a)]??_0x300186})[_0x21c2ea(0x236)](_0x485e61=>{const _0x38c311=_0x21c2ea;transcriptDetailReads[_0x38c311(0x27c)](_0x1ec961)?.[_0x38c311(0x289)]===_0x4b21ce&&(transcriptDetailCache[_0x38c311(0x246)](_0x1ec961,{'fingerprint':_0x4df18e,'parsed':_0x485e61,'expiresAt':Date[_0x38c311(0x26d)]()+TRANSCRIPT_DETAIL_CACHE_TTL_MS}),pruneTranscriptDetailCache());const _0xed9425=Math[_0x38c311(0x2bd)](performance[_0x38c311(0x26d)]()-_0x70e07a);if(_0xed9425>=0x2342+0x5b4+-0x27fc)nodeLog(_0x38c311(0x25b),{'runner':_0x233fc0,'bytes':Number(_0x2dcf30[_0x38c311(0x249)](0x26ea+-0x3*-0xae1+-0x478d,_0x2dcf30[_0x38c311(0x27e)](':'))),'durationMs':_0xed9425});return _0x485e61;})[_0x21c2ea(0x225)](()=>{const _0x3b4dea=_0x21c2ea;if(transcriptDetailReads[_0x3b4dea(0x27c)](_0x1ec961)?.[_0x3b4dea(0x289)]===_0x4b21ce)transcriptDetailReads[_0x3b4dea(0x258)](_0x1ec961);});return transcriptDetailReads[_0x21c2ea(0x246)](_0x1ec961,{'fingerprint':_0x4df18e,'read':_0x4b21ce}),{'history':await _0x4b21ce,'cursorAccepted':_0x1f3df2===undefined||_0x160234!==undefined};}function pruneTranscriptDetailCache(){const _0x1f08c8=_0x3d3b4b,_0x333dc6=Date[_0x1f08c8(0x26d)]();for(const [_0x40c3f5,_0x255212]of transcriptDetailCache)if(_0x255212[_0x1f08c8(0x2a2)]<=_0x333dc6)transcriptDetailCache[_0x1f08c8(0x258)](_0x40c3f5);while(transcriptDetailCache[_0x1f08c8(0x24f)]>TRANSCRIPT_DETAIL_CACHE_MAX_ENTRIES){const _0x509d35=transcriptDetailCache[_0x1f08c8(0x248)]()[_0x1f08c8(0x298)]()[_0x1f08c8(0x23c)];if(_0x509d35===undefined)return;transcriptDetailCache[_0x1f08c8(0x258)](_0x509d35);}}export async function readCodexNativeContextUsage(_0x4ca4fb,_0x3db70d){const _0x32c8d4=_0x3d3b4b,_0x55d01e=canonical(_0x4ca4fb);let _0x2a1610=getTranscriptIndex(indexKey(_0x32c8d4(0x1eb),_0x55d01e,_0x3db70d));_0x2a1610===undefined&&(await discoverNativeSessions(_0x32c8d4(0x1eb),_0x4ca4fb),_0x2a1610=getTranscriptIndex(indexKey(_0x32c8d4(0x1eb),_0x55d01e,_0x3db70d)));if(_0x2a1610===undefined)return undefined;const _0x20173f=await readJsonlWindow(_0x2a1610,{'tailBytes':CONTEXT_USAGE_READ_BYTES});if(_0x20173f===undefined)return undefined;let _0x1fd781;return forEachJsonlRecord(_0x20173f[_0x32c8d4(0x1e4)],_0x295cfe=>{const _0x92dfa5=codexContextUsage(_0x295cfe);if(_0x92dfa5!==undefined)_0x1fd781=_0x92dfa5;}),_0x1fd781;}export async function readClaudeNativeContextUsage(_0x50cf45,_0x11d592,_0x513506={}){const _0x2ddd4f=_0x3d3b4b,_0x201fcb=canonical(_0x50cf45);let _0x8a7e6b=getTranscriptIndex(indexKey(_0x2ddd4f(0x1e5),_0x201fcb,_0x11d592));_0x8a7e6b??=await locateClaudeTranscript(_0x201fcb,_0x11d592);_0x8a7e6b===undefined&&(await discoverNativeSessions(_0x2ddd4f(0x1e5),_0x50cf45),_0x8a7e6b=getTranscriptIndex(indexKey(_0x2ddd4f(0x1e5),_0x201fcb,_0x11d592)));if(_0x8a7e6b===undefined)return undefined;const _0x4d3321=await readLatestClaudeContextUsage(_0x8a7e6b);if(_0x4d3321===undefined)return undefined;return{..._0x4d3321,'maxTokens':await claudeContextWindowTokens(_0x513506)};}async function readLatestClaudeContextUsage(_0x3b7845){const _0x4e5ff2=_0x3d3b4b;for(const _0x24c7ac of CLAUDE_CONTEXT_USAGE_READ_BYTES){const _0x2070fa=await readJsonlWindow(_0x3b7845,{'tailBytes':_0x24c7ac});if(_0x2070fa===undefined)return undefined;let _0x5db730;forEachJsonlRecord(_0x2070fa[_0x4e5ff2(0x1e4)],_0x32917e=>{const _0x164975=claudeContextUsage(_0x32917e);if(_0x164975!==undefined)_0x5db730=_0x164975;});if(_0x5db730!==undefined)return _0x5db730;if(!_0x2070fa[_0x4e5ff2(0x1f2)])return undefined;}return undefined;}async function locateClaudeTranscript(_0x419deb,_0xd4850f){const _0x39d510=_0x3d3b4b,_0x48267d=transcriptRoot(_0x39d510(0x1e5));let _0x1a3cd8;try{_0x1a3cd8=await readdir(_0x48267d,{'withFileTypes':!![]});}catch{return undefined;}const _0x5639e9=_0x1a3cd8[_0x39d510(0x23e)](_0x233505=>_0x233505[_0x39d510(0x218)]())[_0x39d510(0x274)](_0x1fb2fd=>join(_0x48267d,_0x1fb2fd[_0x39d510(0x263)],_0xd4850f+_0x39d510(0x1e3))),_0x11b8e6=await mapConcurrent(_0x5639e9,0x210c+-0x32*0x66+-0xd10,async _0x1b7f7f=>({'path':_0x1b7f7f,'history':await readTranscript(_0x1b7f7f,_0x39d510(0x1e5),DISCOVERY_READ_BYTES)})),_0x9f399c=_0x11b8e6[_0x39d510(0x26a)](({history:_0x52c00c})=>_0x52c00c?.[_0x39d510(0x2ba)]===_0xd4850f&&canonical(_0x52c00c[_0x39d510(0x2a8)])===_0x419deb);if(_0x9f399c===undefined)return undefined;return setTranscriptIndex(indexKey(_0x39d510(0x1e5),_0x419deb,_0xd4850f),_0x9f399c[_0x39d510(0x28f)]),_0x9f399c[_0x39d510(0x28f)];}export async function claudeContextWindowTokens(_0xcf4d3e={}){const _0x2c7fa2=_0x3d3b4b,_0x391c7=_0xcf4d3e[_0x2c7fa2(0x245)]??process.env,_0x58e84a=positiveInteger(_0x391c7[CLAUDE_CONTEXT_WINDOW_ENV]);if(_0x58e84a!==undefined)return _0x58e84a;try{const _0x160595=JSON[_0x2c7fa2(0x200)](await readFile(_0xcf4d3e[_0x2c7fa2(0x264)]??join(homedir(),_0x2c7fa2(0x24b),_0x2c7fa2(0x2be)),_0x2c7fa2(0x2a9)));if(isRecord(_0x160595)&&isRecord(_0x160595[_0x2c7fa2(0x25f)])){const _0x5b6740=positiveInteger(_0x160595[_0x2c7fa2(0x25f)][CLAUDE_CONTEXT_WINDOW_ENV]);if(_0x5b6740!==undefined)return _0x5b6740;}}catch{}return DEFAULT_CLAUDE_CONTEXT_WINDOW_TOKENS;}export async function removeNativeSession(_0x350fe7,_0x8e1c2a,_0x4e6ce5){const _0x40237c=_0x3d3b4b,_0x59c7fa=canonical(_0x8e1c2a);let _0x204883=getTranscriptIndex(indexKey(_0x350fe7,_0x59c7fa,_0x4e6ce5));_0x204883===undefined&&(await discoverNativeSessions(_0x350fe7,_0x8e1c2a),_0x204883=getTranscriptIndex(indexKey(_0x350fe7,_0x59c7fa,_0x4e6ce5)));if(_0x204883===undefined)throw new Error(_0x40237c(0x2ae));const _0xad6989=await readTranscript(_0x204883,_0x350fe7,DISCOVERY_READ_BYTES);if(_0xad6989===undefined||_0xad6989[_0x40237c(0x2ba)]!==_0x4e6ce5||canonical(_0xad6989[_0x40237c(0x2a8)])!==_0x59c7fa){deleteTranscriptIndex(indexKey(_0x350fe7,_0x59c7fa,_0x4e6ce5));throw new Error(_0x40237c(0x2ae));}try{await unlink(_0x204883);}catch(_0x1095b6){if(_0x1095b6[_0x40237c(0x1f6)]===_0x40237c(0x22a))throw new Error(_0x40237c(0x2ae));throw _0x1095b6;}deleteTranscriptIndex(indexKey(_0x350fe7,_0x59c7fa,_0x4e6ce5));const _0x46a747=_0x350fe7+'\x00'+_0x204883+'\x00';for(const _0x1b8447 of transcriptDetailCache[_0x40237c(0x248)]())if(_0x1b8447[_0x40237c(0x1fb)](_0x46a747))transcriptDetailCache[_0x40237c(0x258)](_0x1b8447);for(const _0x95f49f of transcriptDetailReads[_0x40237c(0x248)]())if(_0x95f49f[_0x40237c(0x1fb)](_0x46a747))transcriptDetailReads[_0x40237c(0x258)](_0x95f49f);invalidateNativeDiscovery(_0x350fe7);}function transcriptRoot(_0x234a32){const _0x1c2c50=_0x3d3b4b;return _0x234a32===_0x1c2c50(0x1eb)?join(homedir(),_0x1c2c50(0x26c),_0x1c2c50(0x253)):join(homedir(),_0x1c2c50(0x24b),_0x1c2c50(0x2a6));}function discoveryKey(_0x55fcef){return _0x55fcef+'\x00'+transcriptRoot(_0x55fcef);}function invalidateNativeDiscovery(_0x2de08e){const _0x1e6d3c=_0x3d3b4b,_0x2d83bc=discoveryKey(_0x2de08e);discoveryGenerations[_0x1e6d3c(0x246)](_0x2d83bc,(discoveryGenerations[_0x1e6d3c(0x27c)](_0x2d83bc)??-0x1*0x2699+-0x22e2+0x1*0x497b)+(-0x2*-0xa16+0x349+-0x1774)),discoverySnapshots[_0x1e6d3c(0x258)](_0x2d83bc),discoveryReads[_0x1e6d3c(0x258)](_0x2d83bc);}async function readTranscript(_0x4780f0,_0x3231e0,_0x3fe0f3,_0x5a86e3,_0x14cf7d=Number[_0x3d3b4b(0x28a)]){const _0x407f5b=_0x3d3b4b,_0x314e1f=await readJsonlBackwardWindow(_0x4780f0,{'headBytes':Math[_0x407f5b(0x213)](_0x3fe0f3,TRANSCRIPT_HEADER_READ_BYTES),'targetLines':_0x14cf7d,'maxBytes':_0x3fe0f3,..._0x5a86e3===undefined?{}:{'page':_0x5a86e3}});if(_0x314e1f===undefined)return undefined;const {content:_0x5e6aa2,truncated:_0x1fa060}=_0x314e1f;let _0x1e9619,_0xe45196,_0x15ba59=![];const _0x296f75=[],_0x19ae00=new Map(),_0x3a2607=new Map(),_0x2927ed=new Set();forEachJsonlRecord(_0x5e6aa2,_0x56eb0e=>{if(derivedTranscriptRecord(_0x3231e0,_0x56eb0e))_0x15ba59=!![];_0x1e9619??=workspacePath(_0x56eb0e),_0xe45196??=sessionId(_0x56eb0e);}),forEachJsonlRecord(_0x1fa060?_0x314e1f[_0x407f5b(0x233)]:_0x5e6aa2,_0x392160=>{const _0x2c1e7d=_0x407f5b,_0x125154=typeof _0x392160[_0x2c1e7d(0x227)]===_0x2c1e7d(0x231)?_0x392160[_0x2c1e7d(0x227)]:undefined,_0x4bc3a1=typeof _0x392160[_0x2c1e7d(0x27f)]===_0x2c1e7d(0x231)?_0x392160[_0x2c1e7d(0x27f)]:undefined;if(_0x392160[_0x2c1e7d(0x2b1)]===!![]&&_0x125154!==undefined)_0x2927ed[_0x2c1e7d(0x1ec)](_0x125154);if(isHiddenTranscriptRecord(_0x392160)||_0x4bc3a1!==undefined&&_0x2927ed[_0x2c1e7d(0x282)](_0x4bc3a1))return;const _0xb7517d=codexGeneratedImageEvent(_0x392160);if(_0xb7517d!==undefined)_0x296f75[_0x2c1e7d(0x22b)](_0xb7517d);for(const _0x46e5b4 of transcriptItems(_0x3231e0,_0x392160)){const _0x1a1515=_0x125154===undefined?_0x46e5b4:{..._0x46e5b4,'nativeId':_0x125154};if(_0x1a1515[_0x2c1e7d(0x2ac)]===_0x2c1e7d(0x1f1)){const _0x3e6424=_0x19ae00[_0x2c1e7d(0x27c)](_0x1a1515[_0x2c1e7d(0x1fa)]);if(_0x3e6424===undefined)_0x3a2607[_0x2c1e7d(0x246)](_0x1a1515[_0x2c1e7d(0x1fa)],_0x1a1515);else _0x296f75[_0x3e6424]=withToolResult(_0x296f75[_0x3e6424],_0x1a1515);continue;}if(_0x1a1515[_0x2c1e7d(0x2ac)]===_0x2c1e7d(0x28c)){const _0x42614e=_0x3a2607[_0x2c1e7d(0x27c)](_0x1a1515[_0x2c1e7d(0x1fa)]),_0x5a5c57=_0x42614e===undefined?_0x1a1515:withToolResult(_0x1a1515,_0x42614e);_0x3a2607[_0x2c1e7d(0x258)](_0x1a1515[_0x2c1e7d(0x1fa)]),_0x19ae00[_0x2c1e7d(0x246)](_0x1a1515[_0x2c1e7d(0x1fa)],_0x296f75[_0x2c1e7d(0x25c)]),_0x296f75[_0x2c1e7d(0x22b)](_0x5a5c57);continue;}_0x296f75[_0x2c1e7d(0x22b)](_0x1a1515);}});if(_0x15ba59)return undefined;for(const _0x21dbd8 of _0x3a2607[_0x407f5b(0x2a5)]())_0x296f75[_0x407f5b(0x22b)]({'kind':_0x407f5b(0x28c),'toolUseId':_0x21dbd8[_0x407f5b(0x1fa)],'toolName':_0x407f5b(0x285),'input':null,'inputSummary':null,'inputTruncated':![],'outputSummary':_0x21dbd8[_0x407f5b(0x209)],'outputTruncated':_0x21dbd8[_0x407f5b(0x1f2)],..._0x21dbd8[_0x407f5b(0x291)]===undefined?{}:{'imageAttachments':_0x21dbd8[_0x407f5b(0x291)]},'failed':_0x21dbd8[_0x407f5b(0x244)],'createdAt':_0x21dbd8[_0x407f5b(0x29e)]});if(_0x1e9619===undefined)return undefined;const _0x47d287=_0x296f75[_0x407f5b(0x26a)](_0x106d62=>_0x106d62[_0x407f5b(0x2ac)]===_0x407f5b(0x1fd)&&_0x106d62[_0x407f5b(0x278)]===_0x407f5b(0x2ab))?.[_0x407f5b(0x222)],_0xfe31fd=_0x47d287===undefined?undefined:stripClaudePlanTag(_0x47d287);return{'runner':_0x3231e0,'externalSessionId':_0xe45196??basename(_0x4780f0,_0x407f5b(0x1e3)),'cwd':_0x1e9619,..._0xfe31fd===undefined||_0xfe31fd[_0x407f5b(0x25c)]===-0x47*-0x71+-0x3*-0x964+-0x569*0xb?{}:{'title':compact(_0xfe31fd)},'digest':createHash(_0x407f5b(0x217))[_0x407f5b(0x214)](_0x5e6aa2)[_0x407f5b(0x1f8)](_0x407f5b(0x2b6)),'items':_0x296f75,'lastActivityAt':Math[_0x407f5b(0x234)](0x176d+-0x215c+0x9ef,..._0x296f75[_0x407f5b(0x274)](_0x47ab3e=>_0x47ab3e[_0x407f5b(0x29e)]??0x1454+0x199+-0x15ed)),'truncated':_0x1fa060,'windowStart':_0x314e1f[_0x407f5b(0x2a4)],'windowEnd':_0x314e1f[_0x407f5b(0x279)],'snapshotEnd':_0x314e1f[_0x407f5b(0x221)],'fileAnchor':_0x314e1f[_0x407f5b(0x1f7)],'anchorBytes':_0x314e1f[_0x407f5b(0x229)]};}function derivedTranscriptRecord(_0x17dff8,_0x107136){const _0xd97914=_0x3d3b4b;if(_0x17dff8===_0xd97914(0x1e5))return _0x107136[_0xd97914(0x232)]===!![];if(_0x17dff8!==_0xd97914(0x1eb)||_0x107136[_0xd97914(0x215)]!==_0xd97914(0x257))return![];const _0x55b5b2=isRecord(_0x107136[_0xd97914(0x262)])?_0x107136[_0xd97914(0x262)]:undefined;if(_0x55b5b2===undefined)return![];if(_0x55b5b2[_0xd97914(0x251)]===_0xd97914(0x284))return!![];const _0x1ce74e=_0x55b5b2[_0xd97914(0x20f)];return _0x1ce74e===_0xd97914(0x284)||isRecord(_0x1ce74e)&&(_0x1ce74e[_0xd97914(0x2ac)]===_0xd97914(0x284)||isRecord(_0x1ce74e[_0xd97914(0x284)]));}function workspacePath(_0x42fc36){const _0x26cbf2=_0x3d3b4b;return firstString(_0x42fc36,[_0x26cbf2(0x2a8),_0x26cbf2(0x2a0),_0x26cbf2(0x254)])??nestedString(_0x42fc36,[_0x26cbf2(0x262),_0x26cbf2(0x2a8)])??nestedString(_0x42fc36,[_0x26cbf2(0x1fd),_0x26cbf2(0x2a8)]);}function sessionId(_0x889ea4){const _0x417154=_0x3d3b4b;if(_0x889ea4[_0x417154(0x215)]===_0x417154(0x257)){const _0x4baa79=nestedString(_0x889ea4,[_0x417154(0x262),'id']);if(_0x4baa79!==undefined)return _0x4baa79;}return firstString(_0x889ea4,[_0x417154(0x277),_0x417154(0x206),_0x417154(0x228),_0x417154(0x24d)])??nestedString(_0x889ea4,[_0x417154(0x262),'id'])??nestedString(_0x889ea4,[_0x417154(0x262),_0x417154(0x206)])??nestedString(_0x889ea4,[_0x417154(0x262),_0x417154(0x228)]);}function codexContextUsage(_0xcc30e2){const _0x3cdd16=_0x3d3b4b;if(!isRecord(_0xcc30e2)||_0xcc30e2[_0x3cdd16(0x215)]!==_0x3cdd16(0x210)||!isRecord(_0xcc30e2[_0x3cdd16(0x262)]))return undefined;const _0x3728cb=_0xcc30e2[_0x3cdd16(0x262)];if(_0x3728cb[_0x3cdd16(0x215)]!==_0x3cdd16(0x252)||!isRecord(_0x3728cb[_0x3cdd16(0x219)]))return undefined;const _0x9dba7=_0x3728cb[_0x3cdd16(0x219)][_0x3cdd16(0x21d)],_0x20a098=_0x3728cb[_0x3cdd16(0x219)][_0x3cdd16(0x25d)];if(!isRecord(_0x9dba7)||typeof _0x9dba7[_0x3cdd16(0x275)]!==_0x3cdd16(0x2c5)||typeof _0x20a098!==_0x3cdd16(0x2c5))return undefined;if(!Number[_0x3cdd16(0x239)](_0x9dba7[_0x3cdd16(0x275)])||!Number[_0x3cdd16(0x266)](_0x9dba7[_0x3cdd16(0x275)])||!Number[_0x3cdd16(0x239)](_0x20a098)||!Number[_0x3cdd16(0x266)](_0x20a098)||_0x20a098<=0x5*0x343+0x7d6+-0x1825||_0x9dba7[_0x3cdd16(0x275)]<0xdb*0xf+-0xb35+-0x1a0)return undefined;return{'usedTokens':_0x9dba7[_0x3cdd16(0x275)],'maxTokens':_0x20a098};}function claudeContextUsage(_0x2d84b0){const _0x1c1844=_0x3d3b4b;if(_0x2d84b0[_0x1c1844(0x215)]!==_0x1c1844(0x204)||!isRecord(_0x2d84b0[_0x1c1844(0x1fd)]))return undefined;const _0x20d309=_0x2d84b0[_0x1c1844(0x1fd)][_0x1c1844(0x255)],_0x460a4=_0x2d84b0[_0x1c1844(0x1fd)][_0x1c1844(0x268)];if(typeof _0x20d309!==_0x1c1844(0x231)||_0x20d309[_0x1c1844(0x25c)]===0x137*-0xf+0x4*0xd4+0xee9||_0x20d309===_0x1c1844(0x2a1)||!isRecord(_0x460a4))return undefined;const _0xa3411a=nonNegativeInteger(_0x460a4[_0x1c1844(0x275)]),_0x1fea84=optionalNonNegativeInteger(_0x460a4[_0x1c1844(0x272)]),_0x38f0b4=optionalNonNegativeInteger(_0x460a4[_0x1c1844(0x230)]);if(_0xa3411a===undefined||_0x1fea84===undefined||_0x38f0b4===undefined)return undefined;return{'model':_0x20d309,'usedTokens':_0xa3411a+_0x1fea84+_0x38f0b4};}function optionalNonNegativeInteger(_0x5b31fe){return _0x5b31fe===undefined?-0x1903+0xc2f+-0x1*-0xcd4:nonNegativeInteger(_0x5b31fe);}function nonNegativeInteger(_0xa3a9f5){const _0x4fdc02=_0x3d3b4b;return typeof _0xa3a9f5===_0x4fdc02(0x2c5)&&Number[_0x4fdc02(0x2c4)](_0xa3a9f5)&&_0xa3a9f5>=0x218f+0x4*0x716+-0x3de7?_0xa3a9f5:undefined;}function positiveInteger(_0x48c787){const _0x18f31e=_0x3d3b4b;if(typeof _0x48c787!==_0x18f31e(0x231)||!/^\d+$/[_0x18f31e(0x290)](_0x48c787[_0x18f31e(0x1f0)]()))return undefined;const _0x534584=Number(_0x48c787);return Number[_0x18f31e(0x2c4)](_0x534584)&&_0x534584>-0x12af+0x1de8+-0xb39?_0x534584:undefined;}function transcriptItems(_0x169b70,_0x1f15ef){const _0x2ed9f5=_0x3d3b4b,_0x38c87a=timestampOf(_0x1f15ef),_0x28f3a7=[...toolResultsOf(_0x1f15ef,_0x38c87a),...codexToolResultsOf(_0x1f15ef,_0x38c87a)];if(_0x28f3a7[_0x2ed9f5(0x25c)]>-0x2138+0x1*-0x131f+0x3457)return _0x28f3a7;const _0x255124=[...toolUsesOf(_0x1f15ef,_0x38c87a),...codexToolUsesOf(_0x1f15ef,_0x38c87a),...codexReasoningSummariesOf(_0x1f15ef,_0x38c87a),...unsupportedCodexResponseItems(_0x1f15ef,_0x38c87a),...unsupportedTranscriptItems(_0x1f15ef,_0x38c87a)],_0x3d7270=roleOf(_0x1f15ef);if(_0x3d7270===undefined)return _0x255124;const _0x1ae378=messageText(textOf(_0x1f15ef)??'');if(_0x1ae378[_0x2ed9f5(0x25c)]===0x5*-0x2ad+-0x191f*-0x1+-0xbbe)return _0x255124;if(_0x3d7270===_0x2ed9f5(0x2ab)&&isInjectedContextPrompt(_0x1ae378))return _0x255124;const _0x45eac8=_0x3d7270===_0x2ed9f5(0x2ab)&&_0x169b70===_0x2ed9f5(0x1eb)?parseCodexComposerImageMarkers(_0x1ae378):{'text':_0x1ae378,'images':[]};return _0x255124[_0x2ed9f5(0x2c2)]({'kind':_0x2ed9f5(0x1fd),'role':_0x3d7270,'text':_0x45eac8[_0x2ed9f5(0x222)],..._0x45eac8[_0x2ed9f5(0x241)][_0x2ed9f5(0x25c)]===-0x1*0x10e7+0x8b8+0x82f?{}:{'imageAttachments':_0x45eac8[_0x2ed9f5(0x241)][_0x2ed9f5(0x274)](_0x4a00d6=>({'name':_0x2ed9f5(0x1ee)+_0x4a00d6[_0x2ed9f5(0x22c)],'mime':imageMime(_0x4a00d6[_0x2ed9f5(0x273)]),'localPath':_0x4a00d6[_0x2ed9f5(0x273)]}))},'createdAt':_0x38c87a}),_0x255124;}function unsupportedCodexResponseItems(_0x37ef1a,_0x3ab1ab){const _0x10b87a=_0x3d3b4b,_0xa95d6c=codexToolPayload(_0x37ef1a),_0x3e262f=typeof _0xa95d6c?.[_0x10b87a(0x215)]===_0x10b87a(0x231)?_0xa95d6c[_0x10b87a(0x215)]:undefined;if(_0x3e262f===undefined||typeof _0xa95d6c?.[_0x10b87a(0x278)]===_0x10b87a(0x231)||_0x3e262f===_0x10b87a(0x21f)||_0x3e262f===_0x10b87a(0x265)||_0x3e262f===_0x10b87a(0x260)||_0x3e262f===_0x10b87a(0x1fe)||_0x3e262f===_0x10b87a(0x26f))return[];return[{'kind':_0x10b87a(0x1e8),'sourceEventType':_0x10b87a(0x288)+_0x3e262f,'label':_0x10b87a(0x224)+compact(_0x3e262f)[_0x10b87a(0x249)](-0x85*0x5+-0x252a+-0x27*-0x105,0x219*0xd+0x503+-0x1fc8),'createdAt':_0x3ab1ab}];}function codexReasoningSummariesOf(_0x5e9206,_0x204a32){const _0x24f930=_0x3d3b4b,_0x1435c9=codexToolPayload(_0x5e9206);if(_0x1435c9?.[_0x24f930(0x215)]!==_0x24f930(0x21f))return[];const _0x44ff49=Array[_0x24f930(0x2bb)](_0x1435c9[_0x24f930(0x203)])?_0x1435c9[_0x24f930(0x203)][_0x24f930(0x28e)]((_0x4a4535,_0x1fe1b0)=>{const _0x5f6778=_0x24f930;if(typeof _0x4a4535!==_0x5f6778(0x231))return[];const _0x43ec5e=compact(_0x4a4535)[_0x5f6778(0x249)](0x1914+0x64+0x2*-0xcbc,-0x2957+-0xa97*0x5+0x855a);return _0x43ec5e[_0x5f6778(0x25c)]===-0x1328+0xb*-0x95+0x1*0x198f?[]:[{'index':_0x1fe1b0,'text':_0x43ec5e}];}):[];return[{'kind':_0x24f930(0x24c),'sections':_0x44ff49,'createdAt':_0x204a32}];}function unsupportedTranscriptItems(_0xe253a1,_0x7df83f){const _0x40edc2=_0x3d3b4b;return contentBlocks(_0xe253a1)[_0x40edc2(0x28e)](_0x227f2c=>{const _0x20129f=_0x40edc2,_0x42e1a6=typeof _0x227f2c[_0x20129f(0x215)]===_0x20129f(0x231)?_0x227f2c[_0x20129f(0x215)]:undefined;if(_0x42e1a6===undefined||_0x42e1a6===_0x20129f(0x222)||_0x42e1a6===_0x20129f(0x212)||_0x42e1a6===_0x20129f(0x201)||_0x42e1a6===_0x20129f(0x294)||_0x42e1a6===_0x20129f(0x250)||_0x42e1a6===_0x20129f(0x20a)||_0x42e1a6===_0x20129f(0x25a)||_0x42e1a6===_0x20129f(0x23b)||_0x42e1a6===_0x20129f(0x2c3)||_0x42e1a6===_0x20129f(0x1f1))return[];return[{'kind':_0x20129f(0x1e8),'sourceEventType':_0x20129f(0x1e2)+_0x42e1a6,'label':_0x20129f(0x2a7)+compact(_0x42e1a6)[_0x20129f(0x249)](0x6*-0x2df+-0x1ebb*0x1+0x2ff5,-0x3*0x171+0x49*0x49+-0xffe),'createdAt':_0x7df83f}];});}function toolUsesOf(_0x4b37a8,_0x20eb0c){const _0x357cc4=_0x3d3b4b;return contentBlocks(_0x4b37a8)[_0x357cc4(0x28e)](_0x40cb56=>{const _0x181d81=_0x357cc4;if(_0x40cb56[_0x181d81(0x215)]!==_0x181d81(0x2c3)||typeof _0x40cb56['id']!==_0x181d81(0x231)||typeof _0x40cb56[_0x181d81(0x263)]!==_0x181d81(0x231))return[];const _0x729f8d=_0x40cb56[_0x181d81(0x295)],_0x5bd9dd=compactValue(_0x729f8d,0x279a+0x1*-0x2275+0x21eb);return[{'kind':_0x181d81(0x28c),'toolUseId':_0x40cb56['id'],'toolName':compact(_0x40cb56[_0x181d81(0x263)])[_0x181d81(0x249)](-0x40e+0x35*0x29+-0x5*0xe3,0x125+0x10a5*0x1+-0x2*0x8a5),'input':_0x729f8d,'inputSummary':_0x5bd9dd[_0x181d81(0x222)]||null,'inputTruncated':_0x5bd9dd[_0x181d81(0x1f2)],'outputSummary':null,'outputTruncated':![],'failed':![],'createdAt':_0x20eb0c}];});}function toolResultsOf(_0x4a871a,_0x4fcdc8){const _0x268911=_0x3d3b4b;return contentBlocks(_0x4a871a)[_0x268911(0x28e)](_0x390112=>{const _0x4900f5=_0x268911;if(_0x390112[_0x4900f5(0x215)]!==_0x4900f5(0x1f1)||typeof _0x390112[_0x4900f5(0x1ff)]!==_0x4900f5(0x231))return[];const _0x2c1c55=compactValue(_0x390112[_0x4900f5(0x1e4)],0x128*0x8+-0xa7e+0x86*0x4d);return[{'kind':_0x4900f5(0x1f1),'toolUseId':_0x390112[_0x4900f5(0x1ff)],'output':_0x2c1c55[_0x4900f5(0x222)],'failed':_0x390112[_0x4900f5(0x1ef)]===!![],'truncated':_0x2c1c55[_0x4900f5(0x1f2)],'createdAt':_0x4fcdc8}];});}function codexToolUsesOf(_0x52beb5,_0x1a94ef){const _0x526823=_0x3d3b4b,_0x2aede6=codexToolPayload(_0x52beb5);if(_0x2aede6?.[_0x526823(0x215)]!==_0x526823(0x265)&&_0x2aede6?.[_0x526823(0x215)]!==_0x526823(0x1fe))return[];const _0x2761e8=firstString(_0x2aede6,[_0x526823(0x235),'id']),_0x5c89fa=firstString(_0x2aede6,[_0x526823(0x263),_0x526823(0x247)]);if(_0x2761e8===undefined||_0x5c89fa===undefined)return[];const _0x1135d2=_0x2aede6[_0x526823(0x295)]??_0x2aede6[_0x526823(0x238)],_0x1d43fa=compactValue(_0x1135d2,-0x386*0x3+0x4375*0x1+-0xd*0x15f);return[{'kind':_0x526823(0x28c),'toolUseId':_0x2761e8,'toolName':compact(_0x5c89fa)[_0x526823(0x249)](0x1e54+-0x1ac8+-0x38c,-0x2627+0x4*0x3e1+0x1*0x1723),'input':_0x1135d2,'inputSummary':_0x1d43fa[_0x526823(0x222)]||null,'inputTruncated':_0x1d43fa[_0x526823(0x1f2)],'outputSummary':null,'outputTruncated':![],'failed':![],'createdAt':_0x1a94ef}];}function codexToolResultsOf(_0x26aab6,_0x23de6e){const _0x3464a4=_0x3d3b4b,_0x56c510=codexToolPayload(_0x26aab6);if(_0x56c510?.[_0x3464a4(0x215)]!==_0x3464a4(0x260)&&_0x56c510?.[_0x3464a4(0x215)]!==_0x3464a4(0x26f))return[];const _0x5bc251=firstString(_0x56c510,[_0x3464a4(0x235),'id']);if(_0x5bc251===undefined)return[];const _0x53b294=compactValue(codexToolOutput(_0x56c510[_0x3464a4(0x209)]??_0x56c510[_0x3464a4(0x1e1)]),-0x27*-0x1ba+-0x123+0x1*-0x1b23),_0xa6b8a6=codexImagePlaceholders(_0x56c510[_0x3464a4(0x209)]??_0x56c510[_0x3464a4(0x1e1)]);return[{'kind':_0x3464a4(0x1f1),'toolUseId':_0x5bc251,'output':_0x53b294[_0x3464a4(0x222)],'failed':_0x56c510[_0x3464a4(0x1fc)]===_0x3464a4(0x244)||_0x56c510[_0x3464a4(0x2aa)]!==undefined,'truncated':_0x53b294[_0x3464a4(0x1f2)],..._0xa6b8a6[_0x3464a4(0x25c)]===-0x41*-0x47+-0x1849+0x642?{}:{'imageAttachments':_0xa6b8a6},'createdAt':_0x23de6e}];}function codexToolPayload(_0x5d971e){const _0x5c2149=_0x3d3b4b;return _0x5d971e[_0x5c2149(0x215)]===_0x5c2149(0x24a)&&isRecord(_0x5d971e[_0x5c2149(0x262)])?_0x5d971e[_0x5c2149(0x262)]:undefined;}function codexGeneratedImageEvent(_0x27fe2b){const _0xf419dc=_0x3d3b4b;if(_0x27fe2b[_0xf419dc(0x215)]!==_0xf419dc(0x210)||!isRecord(_0x27fe2b[_0xf419dc(0x262)]))return undefined;const _0x5dd096=_0x27fe2b[_0xf419dc(0x262)];if(_0x5dd096[_0xf419dc(0x215)]!==_0xf419dc(0x1e0)||typeof _0x5dd096[_0xf419dc(0x235)]!==_0xf419dc(0x231)||typeof _0x5dd096[_0xf419dc(0x28d)]!==_0xf419dc(0x231))return undefined;const _0x9280a9=_0x5dd096[_0xf419dc(0x28d)];if(!_0x9280a9[_0xf419dc(0x2b3)](_0xf419dc(0x21c))||!/\.(?:png|jpe?g|webp)$/i[_0xf419dc(0x290)](_0x9280a9))return undefined;return{'kind':_0xf419dc(0x28c),'toolUseId':_0x5dd096[_0xf419dc(0x235)],'toolName':_0xf419dc(0x24e),'input':null,'inputSummary':null,'inputTruncated':![],'outputSummary':_0x5dd096[_0xf419dc(0x1fc)]===_0xf419dc(0x276)?_0xf419dc(0x205):_0xf419dc(0x259),'outputTruncated':![],'imageAttachments':[{'name':basename(_0x9280a9),'mime':imageMime(_0x9280a9),'localPath':_0x9280a9}],'failed':_0x5dd096[_0xf419dc(0x1fc)]!==_0xf419dc(0x276),'createdAt':timestampOf(_0x27fe2b)};}function _0x4b0f(_0x5ce3cf,_0x226d16){_0x5ce3cf=_0x5ce3cf-(0x72*-0x35+-0x1c2f+0x35a6);const _0x342473=_0x4ccf();let _0x4d394d=_0x342473[_0x5ce3cf];if(_0x4b0f['JBPuZC']===undefined){var _0x2d02e3=function(_0x3de54c){const _0x3cf3ad='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5f3e29='',_0xa7fb01='';for(let _0x59ceb1=0x267b+0x19de+-0x4059,_0x3e7b15,_0x442ccc,_0x395a8a=-0x21de+-0x12d5+0x9*0x5db;_0x442ccc=_0x3de54c['charAt'](_0x395a8a++);~_0x442ccc&&(_0x3e7b15=_0x59ceb1%(-0x2f3+0x1bc4+-0x7*0x38b)?_0x3e7b15*(0x1*0x45a+0x471*0x4+-0x15de)+_0x442ccc:_0x442ccc,_0x59ceb1++%(-0xfef*-0x1+0xcb1*0x2+-0x294d))?_0x5f3e29+=String['fromCharCode'](0x211*0x4+-0x1c14+-0x7*-0x2f9&_0x3e7b15>>(-(0x24b8+-0x1af*0x15+0x1*-0x15b)*_0x59ceb1&0x1a82+-0x21b2+0x736)):0x22ba+0x16e7+-0x39a1){_0x442ccc=_0x3cf3ad['indexOf'](_0x442ccc);}for(let _0xc93d59=0x217f+0x1*-0xa7e+0x3*-0x7ab,_0x10685b=_0x5f3e29['length'];_0xc93d59<_0x10685b;_0xc93d59++){_0xa7fb01+='%'+('00'+_0x5f3e29['charCodeAt'](_0xc93d59)['toString'](0x1*-0xa56+0x5*-0xd7+0xe99))['slice'](-(0x1*-0x1306+-0xcb8+0x1fc0*0x1));}return decodeURIComponent(_0xa7fb01);};_0x4b0f['riOWRy']=_0x2d02e3,_0x4b0f['YzQBwN']={},_0x4b0f['JBPuZC']=!![];}const _0x257482=_0x342473[-0x7*-0x2ad+0xa68+-0x1*0x1d23];_0x4b0f['jpWpjn']!==_0x257482&&(_0x4b0f['YzQBwN']={},_0x4b0f['jpWpjn']=_0x257482);const _0x3d4b78=_0x4b0f['YzQBwN'][_0x5ce3cf];return _0x3d4b78===undefined?(_0x4d394d=_0x4b0f['riOWRy'](_0x4d394d),_0x4b0f['YzQBwN'][_0x5ce3cf]=_0x4d394d):_0x4d394d=_0x3d4b78,_0x4d394d;}function codexToolOutput(_0x30e7a0){const _0x4dfe90=_0x3d3b4b;if(!Array[_0x4dfe90(0x2bb)](_0x30e7a0))return _0x30e7a0;const _0x2f736d=_0x30e7a0[_0x4dfe90(0x28e)](_0x85bb75=>{const _0xd09c97=_0x4dfe90;if(typeof _0x85bb75===_0xd09c97(0x231))return[_0x85bb75];if(!isRecord(_0x85bb75))return[];const _0x1bd5f3=firstString(_0x85bb75,[_0xd09c97(0x222),_0xd09c97(0x1e4)]);return _0x1bd5f3===undefined?[]:[codexVisibleToolText(_0x1bd5f3)];});return _0x2f736d[_0x4dfe90(0x25c)]>0x79f+0x6d9*0x5+-0x29dc?_0x2f736d[_0x4dfe90(0x29c)](''):_0x30e7a0;}function codexVisibleToolText(_0x5e19e3){const _0x7bd22f=_0x3d3b4b,_0x38f179=_0x7bd22f(0x29f);let _0x1382a3=0x1*-0x2299+-0x1*0x2a+0x22c3,_0x31eabb='';while(_0x1382a3<_0x5e19e3[_0x7bd22f(0x25c)]){const _0x30eb7e=_0x5e19e3[_0x7bd22f(0x27e)](_0x38f179,_0x1382a3);if(_0x30eb7e<0x1f3+0x1*0x1f63+-0x2156)return _0x31eabb+_0x5e19e3[_0x7bd22f(0x249)](_0x1382a3);_0x31eabb+=_0x5e19e3[_0x7bd22f(0x249)](_0x1382a3,_0x30eb7e)+_0x7bd22f(0x271);const _0x5a1868=_0x5e19e3[_0x7bd22f(0x27e)]('\x22',_0x30eb7e),_0x3a44c6=_0x5e19e3[_0x7bd22f(0x27e)]('\x27',_0x30eb7e),_0x1bf6c3=_0x5a1868<-0x26b5+0x7c1+-0x1*-0x1ef4?_0x3a44c6:_0x3a44c6<-0x858*-0x2+0x452+0x2*-0xa81?_0x5a1868:Math[_0x7bd22f(0x213)](_0x5a1868,_0x3a44c6);if(_0x1bf6c3<-0x1b54+-0x1e3c+0x3990)return _0x31eabb;_0x1382a3=_0x1bf6c3;}return _0x31eabb;}function codexImagePlaceholders(_0x13ec0b){const _0x43f8d1=[];let _0x3fa692=0xbe*-0x2b+0xb00+0x14ea;const _0x26e75f=(_0x49323e,_0x5a1a7e)=>{const _0x1c8823=_0x4b0f;if(_0x43f8d1[_0x1c8823(0x25c)]>=0x3*-0x94f+-0x5*-0x68f+-0x4d9||_0x3fa692>=-0x21c5+0x1*-0xb1f+0x2d64||_0x5a1a7e>0x135*0x10+0x1456+0x1*-0x27a1||_0x49323e==null)return;_0x3fa692+=0x190e+-0x123c+-0x1*0x6d1;if(typeof _0x49323e===_0x1c8823(0x231)){const _0x144d46=[];collectGeneratedImagePaths(_0x49323e,_0x144d46);for(const _0x311ee3 of _0x144d46){if(_0x43f8d1[_0x1c8823(0x1f4)](_0x95c3a8=>_0x95c3a8[_0x1c8823(0x273)]===_0x311ee3))continue;_0x43f8d1[_0x1c8823(0x22b)]({'name':basename(_0x311ee3),'mime':imageMime(_0x311ee3),'localPath':_0x311ee3});}return;}if(Array[_0x1c8823(0x2bb)](_0x49323e)){for(const _0x77302c of _0x49323e)_0x26e75f(_0x77302c,_0x5a1a7e+(-0x2593*0x1+-0xe1f+0x1*0x33b3));return;}if(!isRecord(_0x49323e))return;const _0x555ee9=typeof _0x49323e[_0x1c8823(0x215)]===_0x1c8823(0x231)?_0x49323e[_0x1c8823(0x215)]:'';if(_0x555ee9===_0x1c8823(0x212)&&typeof _0x49323e[_0x1c8823(0x222)]===_0x1c8823(0x231)){const _0x58b40c=/["']image_url["']\s*:\s*["']data:(image\/[^;,"']+)[;,]/[_0x1c8823(0x226)](_0x49323e[_0x1c8823(0x222)])?.[0x191+-0x1943*0x1+0x17b3*0x1];if(_0x58b40c!==undefined)_0x43f8d1[_0x1c8823(0x22b)]({'name':_0x1c8823(0x216)+(_0x43f8d1[_0x1c8823(0x25c)]+(-0x1*0x5d1+-0x1*0x14e5+-0x3d1*-0x7))+'.'+imageExtension(_0x58b40c),'mime':_0x58b40c});}const _0xc0c38c=isRecord(_0x49323e[_0x1c8823(0x29b)])?firstString(_0x49323e[_0x1c8823(0x29b)],[_0x1c8823(0x2c1)]):typeof _0x49323e[_0x1c8823(0x29b)]===_0x1c8823(0x231)?_0x49323e[_0x1c8823(0x29b)]:undefined,_0x1c6ddf=typeof _0x49323e[_0x1c8823(0x2b0)]===_0x1c8823(0x231)?_0x49323e[_0x1c8823(0x2b0)]:_0xc0c38c;if((_0x555ee9===_0x1c8823(0x294)||_0x555ee9===_0x1c8823(0x250)||_0x555ee9===_0x1c8823(0x1f9))&&_0x1c6ddf?.[_0x1c8823(0x1fb)](_0x1c8823(0x29f))){const _0x5a17be=/^data:([^;,]+)[;,]/[_0x1c8823(0x226)](_0x1c6ddf)?.[-0x20+-0x21c7+0x118*0x1f]??_0x1c8823(0x20c);_0x43f8d1[_0x1c8823(0x22b)]({'name':_0x1c8823(0x216)+(_0x43f8d1[_0x1c8823(0x25c)]+(-0xa22+-0x212d+0x2b50))+'.'+imageExtension(_0x5a17be),'mime':_0x5a17be});}for(const _0x12ef42 of Object[_0x1c8823(0x2a5)](_0x49323e))_0x26e75f(_0x12ef42,_0x5a1a7e+(-0x1276*0x2+0x1*0x20b5+0x12*0x3c));};return _0x26e75f(_0x13ec0b,0x2160+0x37d*0x1+-0x24dd),_0x43f8d1;}function collectGeneratedImagePaths(_0x1143fe,_0x38db26){const _0x2afce1=_0x3d3b4b,_0x4bd2aa=_0x2afce1(0x21c);let _0x175165=0x1*-0x199+-0x26c7+0x2860;while(_0x38db26[_0x2afce1(0x25c)]<-0x2*0xbe1+-0x5a3+-0x9ce*-0x3){const _0x47c38f=_0x1143fe[_0x2afce1(0x27e)](_0x4bd2aa,_0x175165);if(_0x47c38f<-0x13*0x12f+-0x1110+0x278d)return;let _0x10eaea=_0x47c38f;while(_0x10eaea>-0xc52+-0x376+-0x7e4*-0x2&&!/[\s"']/[_0x2afce1(0x290)](_0x1143fe[_0x10eaea-(0x1bc7+-0x2348+0x782)]))_0x10eaea-=0x21d5+-0x1*0x10e0+-0x2*0x87a;let _0x438873=_0x47c38f+_0x4bd2aa[_0x2afce1(0x25c)];while(_0x438873<_0x1143fe[_0x2afce1(0x25c)]&&!/[\s"']/[_0x2afce1(0x290)](_0x1143fe[_0x438873]))_0x438873+=-0x1cc9+-0x1e21+-0x3aeb*-0x1;const _0x17c986=_0x1143fe[_0x2afce1(0x249)](_0x10eaea,_0x438873)[_0x2afce1(0x2c0)](/[),.;:]+$/,'');if(/\.(?:png|jpe?g|webp)$/i[_0x2afce1(0x290)](_0x17c986)&&!_0x38db26[_0x2afce1(0x2b3)](_0x17c986))_0x38db26[_0x2afce1(0x22b)](_0x17c986);_0x175165=_0x438873;}}function imageMime(_0x393b85){const _0x16a61e=_0x3d3b4b,_0x1e8ae9=_0x393b85[_0x16a61e(0x249)](_0x393b85[_0x16a61e(0x2b7)]('.')+(-0x9a8+-0x237d+0x2d26))[_0x16a61e(0x27b)]();if(_0x1e8ae9===_0x16a61e(0x242)||_0x1e8ae9===_0x16a61e(0x293))return _0x16a61e(0x26b);if(_0x1e8ae9===_0x16a61e(0x21b))return _0x16a61e(0x20b);return _0x16a61e(0x20c);}function imageExtension(_0x1f36da){const _0xdbe5ae=_0x3d3b4b;if(_0x1f36da===_0xdbe5ae(0x26b))return _0xdbe5ae(0x242);if(_0x1f36da===_0xdbe5ae(0x20b))return _0xdbe5ae(0x21b);if(_0x1f36da===_0xdbe5ae(0x211))return _0xdbe5ae(0x2b9);return _0xdbe5ae(0x21e);}function _0x4ccf(){const _0x31f07d=['mJq0mJy2mgfIsuDAvG','CM91BMq','C2v0DgLUz3mUANnVBG','Bgf0zxn0','CMvWBgfJzq','DxjS','Dw5ZAgLMDa','Dg9VBf91C2u','AxntywzLsw50zwDLCG','BNvTyMvY','mti3ngHWtxDOwa','DgLTzxn0yw1W','pgXVy2fSlwnVBw1HBMqT','Aw1Hz2vFz2vUzxjHDgLVBL9LBMq','y29UDgvUDeL0zw1Z','DhjHBNnJCMLWDdO','lMPZB25S','y29UDgvUDa','y2XHDwrLlwnVzgu','BMv4DevUza','mtuYndyYnefAr2vxsG','Dw5RBM93BG','tufsx0nmqvverv9dt05urvHux1DjtKrpv19ut0TftLm','qvntsvnuqu5u','y29KzxG','ywrK','odC4ndyWmuDozgXnqW','sw1Hz2uGiW','AxnFzxjYB3i','DhjPBq','Dg9VBf9Yzxn1Bhq','Dhj1BMnHDgvK','peLou1rsvunusu9ouZ4','C29Tzq','CgfYC2vK','y29Kzq','zMLSzufUy2HVCG','zgLNzxn0','B3v0Chv0x2LTywDL','Dg9VBfvZzuLK','C3rHCNrZv2L0Aa','C3rHDhvZ','BwvZC2fNzq','zNvUy3rPB25Fy2fSBa','Dg9VBf91C2vFAwq','CgfYC2u','B3v0Chv0x3rLEhq','D2LUmZi','C3vTBwfYEq','yxnZAxn0yw50','sw1Hz2uGz2vUzxjHDgLVBIbJB21WBgv0zwq','C2vZC2LVBL9Pza','AgLZDg9YEq','AhvTyw4','B3v0Chv0','DgHPBMTPBMC','Aw1Hz2uVD2vICa','Aw1Hz2uVCg5N','Dg9VBe5HBwu','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lNnPBMDSzs1MBgLNAhqTAM9PBMvK','C291CMnL','zxzLBNrFBxnN','Aw1Hz2uVz2LM','Aw5WDxrFDgv4Da','BwLU','DxbKyxrL','DhLWzq','Aw1Hz2uT','C2HHmJu2','AxneAxjLy3rVCNK','Aw5MBW','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lMnVBxbSzxrLza','D2vICa','lY5JB2rLEc9Nzw5LCMf0zwrFAw1Hz2vZlW','BgfZDf90B2TLBL91C2fNzq','Cg5N','CMvHC29UAw5N','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lNbYB2DYzxnZ','C25HChnOB3rfBMq','Dgv4Da','BMf0AxzLlNnLC3nPB24UAgLZDg9YEs5ZAw5NBguTzMXPz2H0lwPVAw5Lza','q29KzxGG','zMLUywXSEq','zxHLyW','DxvPza','DgHYzwfKx2LK','yw5JAg9YqNL0zxm','ru5pru5u','ChvZAa','Aw5KzxG','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lMzPBgvZlwXPC3rLza','C3vIywDLBNrZ','BMf0AxzLlNnLC3nPB24UzgLZy292zxj5lNn0yxj0zwq','y2fJAgvFCMvHzf9PBNb1Df90B2TLBNm','C3rYAw5N','AxntAwrLy2HHAw4','CgfNzunVBNrLBNq','Bwf4','y2fSBf9Pza','DgHLBG','Dw5Yzwy','yxjNDw1LBNrZ','AxngAw5PDgu','kfvUywjSzsb0BYbKAxnWBgf5kq','zw5JCNLWDgvKx3rOAw5RAw5N','DMfSDwu','Aw1Hz2v2Awv3','zMLSDgvY','B2jQzwn0','y2fJAgviAxrZ','Aw1Hz2vZ','ANbN','oda3nJqZmK1utevcvq','zMfPBgvK','zw52AxjVBM1LBNq','C2v0','Dg9VBa','A2v5CW','C2XPy2u','CMvZCg9UC2vFAxrLBq','lMnSyxvKzq','CMvHC29UAw5Nx3n1Bw1HCNK','y29UDMvYC2f0Aw9Uswq','Aw1Hz2vNzw4','C2L6zq','Aw5WDxrFAw1Hz2u','DgHYzwfKx3nVDxjJzq','Dg9Rzw5Fy291BNq','C2vZC2LVBNm','D29YA3nWywnLugf0Aa','Bw9KzwW','Dg9mB2nHBgvmB3DLCKnHC2u','C2vZC2LVBL9TzxrH','zgvSzxrL','sw1Hz2uGz2vUzxjHDgLVBIbMywLSzwq','CMvKywn0zwrFDgHPBMTPBMC','BMf0AxzLlNnLC3nPB24UAgLZDg9YEs5KzxrHAwWTCgfYC2uUy29TCgXLDgvK','BgvUz3rO','Bw9KzwXFy29UDgv4Df93Aw5KB3C','DxnLCG','zw52','y3vZDg9Tx3rVB2XFy2fSBf9VDxrWDxq','AxndB21Wywn0u3vTBwfYEq','Cgf5Bg9Hza','BMfTzq','C2v0DgLUz3nqyxrO','y3vZDg9Tx3rVB2XFy2fSBa','AxnjBNrLz2vY','pgnVBw1HBMqTBMfTzt4','DxnHz2u','iYbbr0vovfmUBwqGAw5ZDhj1y3rPB25Z','zMLUza','Aw1Hz2uVANbLzW','lMnVzgv4','BM93','pgvUDMLYB25Tzw50x2nVBNrLEhq+','zNvUy3rPB25Fy2fSBf9VDxrWDxq','nJu5tfPHEgDR','w0LTywDLignVBNrLBNqGzMLSDgvYzwrD','y2fJAgvFy3jLyxrPB25FAw5WDxrFDg9Rzw5Z','Bg9JywXqyxrO','BwfW','Aw5WDxrFDg9Rzw5Z','y29TCgXLDgvK','C2vZC2LVBKLK','CM9Szq','zw5K','AxnwAxnPyMXLsw5uCMfUC2nYAxb0t25SEq','Dg9mB3DLCKnHC2u','z2v0','CMvMCMvZAa','Aw5KzxHpzG','CgfYzw50vxvPza','pgnVBw1HBMqTBwvZC2fNzt4','y3jLyxrLzf9HDa','AgfZ','C3bSAxq','C3vIywDLBNq','vg9VBa','C3rYAw5NAwz5','Aw50zxjYDxb0zwrcEvnODxrKB3DU','y29KzxG6','CMvHza','tufyx1nbrKvFsu5uruDfuG','CgXHDgzVCM0','Dg9VBf9JywXS','C2f2zwrFCgf0Aa','zMXHDe1HCa','Cgf0Aa','DgvZDa','Aw1Hz2vbDhrHy2HTzw50CW','BxrPBwvnCW','ANbLzW','Aw1Hz2u','Aw5WDxq','ntG0mtC3me9ftwX0AG','y29Sza','BMv4Da','mta5nda3mZn3yLHdEwS','CMvHzeXPBwL0','Aw1Hz2vFDxjS','AM9PBG','ywDLBNq','y3jLyxrLzef0','zgf0ytPPBwfNzs8','D29YA2LUz19KAxjLy3rVCNK','phn5BNrOzxrPyZ4','zxHWAxjLC0f0','Axnoyu4','C3rHCNq','DMfSDwvZ','ChjVAMvJDhm','qwDLBNqG','y3DK','DxrMoa','zxjYB3i','vvnfuG','A2LUza','pgnVzgv4x2LUDgvYBMfSx2nVBNrLEhq','tKfusvzfx1rsqu5tq1jjufrFvu5bvKfjtefcteu','ndbdBwflzuu','zgf0yq','AxnnzxrH','zMLUz2vYChjPBNq','Aw5JBhvKzxm','zMLSzxm','DMLLD19PBwfNzq','Agv4','BgfZDeLUzgv4t2y','y3vYC29YqwnJzxb0zwq','z2LM','zxH0zxjUywXtzxnZAw9Uswq','AxnbCNjHEq'];_0x4ccf=function(){return _0x31f07d;};return _0x4ccf();}function withToolResult(_0x1b4bd8,_0xbbe6d){const _0x2dbd2c=_0x3d3b4b,_0x31a7dc=codexViewedImagePath(_0x1b4bd8),_0xe021b=_0xbbe6d[_0x2dbd2c(0x291)]?.[_0x2dbd2c(0x274)](_0x110f70=>_0x110f70[_0x2dbd2c(0x273)]!==undefined||_0x31a7dc===undefined?_0x110f70:{'name':basename(_0x31a7dc),'mime':imageMime(_0x31a7dc),'localPath':_0x31a7dc});return{..._0x1b4bd8,'outputSummary':_0xbbe6d[_0x2dbd2c(0x209)],'outputTruncated':_0xbbe6d[_0x2dbd2c(0x1f2)],..._0xe021b===undefined?{}:{'imageAttachments':_0xe021b},'failed':_0xbbe6d[_0x2dbd2c(0x244)]};}function codexViewedImagePath(_0x3cdf3c){const _0x3f194f=_0x3d3b4b,_0x1080c5=_0x3cdf3c[_0x3f194f(0x20d)][_0x3f194f(0x27b)]();if(_0x1080c5===_0x3f194f(0x2b5)||_0x1080c5===_0x3f194f(0x23d))return isRecord(_0x3cdf3c[_0x3f194f(0x295)])&&typeof _0x3cdf3c[_0x3f194f(0x295)][_0x3f194f(0x28f)]===_0x3f194f(0x231)?_0x3cdf3c[_0x3f194f(0x295)][_0x3f194f(0x28f)]:undefined;if(_0x1080c5!==_0x3f194f(0x226)||typeof _0x3cdf3c[_0x3f194f(0x295)]!==_0x3f194f(0x231))return undefined;if(!/tools\.view_image\s*\(/[_0x3f194f(0x290)](_0x3cdf3c[_0x3f194f(0x295)]))return undefined;const _0x2034b6=/["']path["']\s*:\s*("(?:\\.|[^"\\])*")/[_0x3f194f(0x226)](_0x3cdf3c[_0x3f194f(0x295)])?.[-0x1*-0x1501+0x26ff*0x1+-0x3bff];if(_0x2034b6===undefined)return undefined;try{const _0x2e1c29=JSON[_0x3f194f(0x200)](_0x2034b6);return typeof _0x2e1c29===_0x3f194f(0x231)?_0x2e1c29:undefined;}catch{return undefined;}}function isInjectedContextPrompt(_0x31d61c){const _0x453e79=_0x3d3b4b,_0x55e695=_0x31d61c[_0x453e79(0x2c0)](/\s+/g,'\x20')[_0x453e79(0x1f0)]();if(_0x55e695[_0x453e79(0x1fb)](_0x453e79(0x2ad)))return!![];return _0x55e695[_0x453e79(0x1fb)](_0x453e79(0x269))&&(_0x55e695[_0x453e79(0x2b3)](_0x453e79(0x1f3))||_0x55e695[_0x453e79(0x2b3)](_0x453e79(0x26e)));}function isHiddenTranscriptRecord(_0x342f8c){const _0x47300e=_0x3d3b4b;if(contentBlocks(_0x342f8c)[_0x47300e(0x1f4)](_0x4edaa0=>_0x4edaa0[_0x47300e(0x215)]===_0x47300e(0x1f1)))return![];if(_0x342f8c[_0x47300e(0x287)]===!![]||_0x342f8c[_0x47300e(0x2b1)]===!![]||_0x342f8c[_0x47300e(0x27a)]===!![]||_0x342f8c[_0x47300e(0x261)]===!![])return!![];const _0x225372=textOf(_0x342f8c)?.[_0x47300e(0x1f0)]()??'';return _0x225372[_0x47300e(0x1fb)](_0x47300e(0x1df))||_0x225372[_0x47300e(0x1fb)](_0x47300e(0x267))||_0x225372[_0x47300e(0x1fb)](_0x47300e(0x280));}function roleOf(_0x3816ee){const _0x521307=_0x3d3b4b,_0x10fe63=[firstString(_0x3816ee,[_0x521307(0x278)]),nestedString(_0x3816ee,[_0x521307(0x1fd),_0x521307(0x278)]),nestedString(_0x3816ee,[_0x521307(0x262),_0x521307(0x278)]),firstString(_0x3816ee,[_0x521307(0x215)]),nestedString(_0x3816ee,[_0x521307(0x262),_0x521307(0x215)])];if(_0x10fe63[_0x521307(0x1f4)](_0x53efc3=>_0x53efc3===_0x521307(0x25e)||_0x53efc3===_0x521307(0x208)||_0x53efc3===_0x521307(0x295)))return _0x521307(0x2ab);if(_0x10fe63[_0x521307(0x1f4)](_0x43464a=>_0x43464a===_0x521307(0x204)||_0x43464a===_0x521307(0x29d)||_0x43464a===_0x521307(0x209)))return _0x521307(0x1ea);return undefined;}function textOf(_0x2e4862){const _0x27f0ec=_0x3d3b4b;return firstString(_0x2e4862,[_0x27f0ec(0x1e4),_0x27f0ec(0x222)])??nestedText(_0x2e4862[_0x27f0ec(0x1fd)])??nestedText(_0x2e4862[_0x27f0ec(0x262)]);}function nestedText(_0x5d19e1){const _0x1b8fc3=_0x3d3b4b;if(typeof _0x5d19e1===_0x1b8fc3(0x231))return _0x5d19e1;if(!isRecord(_0x5d19e1))return undefined;const _0x301050=firstString(_0x5d19e1,[_0x1b8fc3(0x1e4),_0x1b8fc3(0x222),_0x1b8fc3(0x1fd)]);if(_0x301050!==undefined)return _0x301050;if(Array[_0x1b8fc3(0x2bb)](_0x5d19e1[_0x1b8fc3(0x1e4)])){const _0x282f56=_0x5d19e1[_0x1b8fc3(0x1e4)][_0x1b8fc3(0x28e)](_0x31f414=>{const _0x4035b9=_0x1b8fc3;if(typeof _0x31f414===_0x4035b9(0x231))return[_0x31f414];if(!isRecord(_0x31f414))return[];return[firstString(_0x31f414,[_0x4035b9(0x222),_0x4035b9(0x1e4)])][_0x4035b9(0x23e)](_0x3499b3=>_0x3499b3!==undefined);});return _0x282f56[_0x1b8fc3(0x29c)]('\x0a');}return undefined;}function contentBlocks(_0x8a1663){const _0x3f5774=_0x3d3b4b,_0x5d315a=[_0x8a1663[_0x3f5774(0x1fd)],_0x8a1663[_0x3f5774(0x262)]];for(const _0x26fb9f of _0x5d315a)if(isRecord(_0x26fb9f)&&Array[_0x3f5774(0x2bb)](_0x26fb9f[_0x3f5774(0x1e4)]))return _0x26fb9f[_0x3f5774(0x1e4)][_0x3f5774(0x23e)](isRecord);return[];}function compactValue(_0x32d894,_0x32f096){const _0x1b9977=_0x3d3b4b;if(_0x32d894===undefined||_0x32d894===null)return{'text':'','truncated':![]};let _0x469b68;if(typeof _0x32d894===_0x1b9977(0x231))_0x469b68=_0x32d894;else try{_0x469b68=JSON[_0x1b9977(0x286)](_0x32d894);}catch{return{'text':_0x1b9977(0x23a),'truncated':![]};}return{'text':_0x469b68[_0x1b9977(0x25c)]<=_0x32f096?_0x469b68:_0x469b68[_0x1b9977(0x249)](0x7*-0x18f+0xc82+0x1*-0x199,Math[_0x1b9977(0x234)](-0x228*-0x7+-0x21*0x64+-0x234,_0x32f096-(-0x1d*0xa1+0xf*-0x41+-0x160d*-0x1)))+'…','truncated':_0x469b68[_0x1b9977(0x25c)]>_0x32f096};}function timestampOf(_0x1a0836){const _0xf759bb=_0x3d3b4b,_0x28a8b8=_0x1a0836[_0xf759bb(0x1de)]??_0x1a0836[_0xf759bb(0x281)]??_0x1a0836[_0xf759bb(0x29e)];if(typeof _0x28a8b8===_0xf759bb(0x2c5)&&Number[_0xf759bb(0x239)](_0x28a8b8))return _0x28a8b8<-0x1*-0x37bd4087e+0xaac45558+-0x1d28c79d6?_0x28a8b8*(-0xfb9+-0x26*-0x89+0x1*-0xb5):_0x28a8b8;if(typeof _0x28a8b8===_0xf759bb(0x231)){const _0xb1b593=Date[_0xf759bb(0x200)](_0x28a8b8);return Number[_0xf759bb(0x2a3)](_0xb1b593)?null:_0xb1b593;}return null;}function firstString(_0x44fbec,_0x4f98d3){const _0x5390de=_0x3d3b4b;for(const _0x2df79 of _0x4f98d3)if(typeof _0x44fbec[_0x2df79]===_0x5390de(0x231)&&_0x44fbec[_0x2df79][_0x5390de(0x25c)]>-0xe8*-0x1d+0x18d6+-0x331e)return _0x44fbec[_0x2df79];return undefined;}function nestedString(_0x32fd8b,_0x48f16a){const _0x42c7d8=_0x3d3b4b;let _0x15ce25=_0x32fd8b;for(const _0x2ecd37 of _0x48f16a){if(!isRecord(_0x15ce25))return undefined;_0x15ce25=_0x15ce25[_0x2ecd37];}return typeof _0x15ce25===_0x42c7d8(0x231)&&_0x15ce25[_0x42c7d8(0x25c)]>-0x1*-0x98e+0x11a8+0x2b*-0xa2?_0x15ce25:undefined;}function compact(_0x447d36){const _0x2cfac5=_0x3d3b4b;return _0x447d36[_0x2cfac5(0x2c0)](/\s+/g,'\x20')[_0x2cfac5(0x1f0)]()[_0x2cfac5(0x249)](0x218a+0x23a4+0x4d*-0xe6,0x6bcf+-0x1*0x6212+0x34c3*0x1);}function messageText(_0xed756c){const _0x4054e6=_0x3d3b4b;return _0xed756c[_0x4054e6(0x1f0)]()[_0x4054e6(0x249)](-0x89*-0xd+0x1c4d+0x2*-0x11a1,0x2f39*-0x2+-0x48ed+0xe5df*0x1);}function canonical(_0x987f2c){const _0x1e3697=_0x3d3b4b;try{const _0x4907ff=resolve(_0x987f2c)[_0x1e3697(0x2c0)](/[\\/]+$/,'');return process[_0x1e3697(0x28b)]===_0x1e3697(0x202)?_0x4907ff[_0x1e3697(0x256)]():_0x4907ff;}catch{return _0x987f2c;}}function indexKey(_0x8456b5,_0x103fa4,_0x4adf7b){return _0x8456b5+'\x00'+_0x103fa4+'\x00'+_0x4adf7b;}function setTranscriptIndex(_0x3a9354,_0xd60ab4){const _0x5bf057=_0x3d3b4b,_0x41287f=transcriptIndexTimers[_0x5bf057(0x27c)](_0x3a9354);if(_0x41287f!==undefined)clearTimeout(_0x41287f);transcriptIndex[_0x5bf057(0x246)](_0x3a9354,_0xd60ab4);const _0x230ca3=setTimeout(()=>deleteTranscriptIndex(_0x3a9354),TRANSCRIPT_INDEX_TTL_MS);_0x230ca3[_0x5bf057(0x237)](),transcriptIndexTimers[_0x5bf057(0x246)](_0x3a9354,_0x230ca3);}function getTranscriptIndex(_0xbcdf30){const _0x503b7c=_0x3d3b4b;return transcriptIndex[_0x503b7c(0x27c)](_0xbcdf30);}function deleteTranscriptIndex(_0x48ccdd){const _0x5552f7=_0x3d3b4b,_0x3aeff2=transcriptIndexTimers[_0x5552f7(0x27c)](_0x48ccdd);if(_0x3aeff2!==undefined)clearTimeout(_0x3aeff2);transcriptIndexTimers[_0x5552f7(0x258)](_0x48ccdd),transcriptIndex[_0x5552f7(0x258)](_0x48ccdd);}function isRecord(_0x505237){const _0x42ad0c=_0x3d3b4b;return typeof _0x505237===_0x42ad0c(0x23f)&&_0x505237!==null&&!Array[_0x42ad0c(0x2bb)](_0x505237);}