elepha 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/LICENSE.md +375 -0
  2. package/README.md +135 -0
  3. package/bin/elepha.js +2 -0
  4. package/dist/adapters/base.js +600 -0
  5. package/dist/adapters/base.js.map +1 -0
  6. package/dist/adapters/claude-code.js +260 -0
  7. package/dist/adapters/claude-code.js.map +1 -0
  8. package/dist/adapters/codex.js +499 -0
  9. package/dist/adapters/codex.js.map +1 -0
  10. package/dist/adapters/discriminators.js +39 -0
  11. package/dist/adapters/discriminators.js.map +1 -0
  12. package/dist/adapters/index.js +6 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/internal-command.js +3 -0
  15. package/dist/adapters/internal-command.js.map +1 -0
  16. package/dist/cli/backup-wizard.js +97 -0
  17. package/dist/cli/backup-wizard.js.map +1 -0
  18. package/dist/cli/capture-service.js +80 -0
  19. package/dist/cli/capture-service.js.map +1 -0
  20. package/dist/cli/commands/backfills.js +336 -0
  21. package/dist/cli/commands/backfills.js.map +1 -0
  22. package/dist/cli/commands/backup.js +234 -0
  23. package/dist/cli/commands/backup.js.map +1 -0
  24. package/dist/cli/commands/config.js +66 -0
  25. package/dist/cli/commands/config.js.map +1 -0
  26. package/dist/cli/commands/consent.js +237 -0
  27. package/dist/cli/commands/consent.js.map +1 -0
  28. package/dist/cli/commands/daemon-control.js +76 -0
  29. package/dist/cli/commands/daemon-control.js.map +1 -0
  30. package/dist/cli/commands/doctor.js +31 -0
  31. package/dist/cli/commands/doctor.js.map +1 -0
  32. package/dist/cli/commands/hook.js +24 -0
  33. package/dist/cli/commands/hook.js.map +1 -0
  34. package/dist/cli/commands/import.js +611 -0
  35. package/dist/cli/commands/import.js.map +1 -0
  36. package/dist/cli/commands/init.js +19 -0
  37. package/dist/cli/commands/init.js.map +1 -0
  38. package/dist/cli/commands/inspect.js +54 -0
  39. package/dist/cli/commands/inspect.js.map +1 -0
  40. package/dist/cli/commands/install.js +49 -0
  41. package/dist/cli/commands/install.js.map +1 -0
  42. package/dist/cli/commands/internal.js +16 -0
  43. package/dist/cli/commands/internal.js.map +1 -0
  44. package/dist/cli/commands/mcp.js +12 -0
  45. package/dist/cli/commands/mcp.js.map +1 -0
  46. package/dist/cli/commands/projects.js +26 -0
  47. package/dist/cli/commands/projects.js.map +1 -0
  48. package/dist/cli/commands/purge.js +216 -0
  49. package/dist/cli/commands/purge.js.map +1 -0
  50. package/dist/cli/commands/reingest.js +80 -0
  51. package/dist/cli/commands/reingest.js.map +1 -0
  52. package/dist/cli/commands/rekey.js +58 -0
  53. package/dist/cli/commands/rekey.js.map +1 -0
  54. package/dist/cli/commands/restore.js +376 -0
  55. package/dist/cli/commands/restore.js.map +1 -0
  56. package/dist/cli/commands/rollup.js +130 -0
  57. package/dist/cli/commands/rollup.js.map +1 -0
  58. package/dist/cli/commands/sanitize.js +72 -0
  59. package/dist/cli/commands/sanitize.js.map +1 -0
  60. package/dist/cli/commands/segment.js +153 -0
  61. package/dist/cli/commands/segment.js.map +1 -0
  62. package/dist/cli/commands/self-update.js +26 -0
  63. package/dist/cli/commands/self-update.js.map +1 -0
  64. package/dist/cli/commands/start.js +53 -0
  65. package/dist/cli/commands/start.js.map +1 -0
  66. package/dist/cli/commands/stats.js +42 -0
  67. package/dist/cli/commands/stats.js.map +1 -0
  68. package/dist/cli/commands/status.js +73 -0
  69. package/dist/cli/commands/status.js.map +1 -0
  70. package/dist/cli/commands/uninstall.js +23 -0
  71. package/dist/cli/commands/uninstall.js.map +1 -0
  72. package/dist/cli/config-wizard.js +104 -0
  73. package/dist/cli/config-wizard.js.map +1 -0
  74. package/dist/cli/destructive-op.js +32 -0
  75. package/dist/cli/destructive-op.js.map +1 -0
  76. package/dist/cli/import-wizard.js +89 -0
  77. package/dist/cli/import-wizard.js.map +1 -0
  78. package/dist/cli/index.js +74 -0
  79. package/dist/cli/index.js.map +1 -0
  80. package/dist/cli/init-wizard.js +80 -0
  81. package/dist/cli/init-wizard.js.map +1 -0
  82. package/dist/cli/init.js +159 -0
  83. package/dist/cli/init.js.map +1 -0
  84. package/dist/cli/launcher-probe.js +71 -0
  85. package/dist/cli/launcher-probe.js.map +1 -0
  86. package/dist/cli/project-path.js +16 -0
  87. package/dist/cli/project-path.js.map +1 -0
  88. package/dist/cli/purge-wizard.js +200 -0
  89. package/dist/cli/purge-wizard.js.map +1 -0
  90. package/dist/cli/restore-wizard.js +101 -0
  91. package/dist/cli/restore-wizard.js.map +1 -0
  92. package/dist/cli/shared.js +128 -0
  93. package/dist/cli/shared.js.map +1 -0
  94. package/dist/cli/status.js +22 -0
  95. package/dist/cli/status.js.map +1 -0
  96. package/dist/cli/wordmark.js +15 -0
  97. package/dist/cli/wordmark.js.map +1 -0
  98. package/dist/config/constants.js +115 -0
  99. package/dist/config/constants.js.map +1 -0
  100. package/dist/config/env.js +168 -0
  101. package/dist/config/env.js.map +1 -0
  102. package/dist/config/memory-config.js +63 -0
  103. package/dist/config/memory-config.js.map +1 -0
  104. package/dist/config/paths.js +343 -0
  105. package/dist/config/paths.js.map +1 -0
  106. package/dist/config/settings.js +132 -0
  107. package/dist/config/settings.js.map +1 -0
  108. package/dist/config/version.js +12 -0
  109. package/dist/config/version.js.map +1 -0
  110. package/dist/daemon/failure-window.js +38 -0
  111. package/dist/daemon/failure-window.js.map +1 -0
  112. package/dist/daemon/heartbeat.js +40 -0
  113. package/dist/daemon/heartbeat.js.map +1 -0
  114. package/dist/daemon/index.js +873 -0
  115. package/dist/daemon/index.js.map +1 -0
  116. package/dist/daemon/log-rotation.js +27 -0
  117. package/dist/daemon/log-rotation.js.map +1 -0
  118. package/dist/daemon/readability-guard.js +89 -0
  119. package/dist/daemon/readability-guard.js.map +1 -0
  120. package/dist/daemon/rollup-service.js +239 -0
  121. package/dist/daemon/rollup-service.js.map +1 -0
  122. package/dist/daemon/update-check.js +87 -0
  123. package/dist/daemon/update-check.js.map +1 -0
  124. package/dist/daemon/work-queue.js +28 -0
  125. package/dist/daemon/work-queue.js.map +1 -0
  126. package/dist/discovery/session-projects.js +242 -0
  127. package/dist/discovery/session-projects.js.map +1 -0
  128. package/dist/hooks/codex-trust.js +80 -0
  129. package/dist/hooks/codex-trust.js.map +1 -0
  130. package/dist/hooks/common.js +81 -0
  131. package/dist/hooks/common.js.map +1 -0
  132. package/dist/hooks/hook-log.js +38 -0
  133. package/dist/hooks/hook-log.js.map +1 -0
  134. package/dist/hooks/installer.js +200 -0
  135. package/dist/hooks/installer.js.map +1 -0
  136. package/dist/hooks/session-start.js +321 -0
  137. package/dist/hooks/session-start.js.map +1 -0
  138. package/dist/hooks/user-prompt-submit.js +248 -0
  139. package/dist/hooks/user-prompt-submit.js.map +1 -0
  140. package/dist/install/binary.js +72 -0
  141. package/dist/install/binary.js.map +1 -0
  142. package/dist/install/config-file.js +119 -0
  143. package/dist/install/config-file.js.map +1 -0
  144. package/dist/install/daemon-health.js +48 -0
  145. package/dist/install/daemon-health.js.map +1 -0
  146. package/dist/install/daemon-service.js +309 -0
  147. package/dist/install/daemon-service.js.map +1 -0
  148. package/dist/install/doctor.js +180 -0
  149. package/dist/install/doctor.js.map +1 -0
  150. package/dist/install/health-checks.js +90 -0
  151. package/dist/install/health-checks.js.map +1 -0
  152. package/dist/install/installer.js +411 -0
  153. package/dist/install/installer.js.map +1 -0
  154. package/dist/install/launchd-backend.js +261 -0
  155. package/dist/install/launchd-backend.js.map +1 -0
  156. package/dist/install/launcher.js +224 -0
  157. package/dist/install/launcher.js.map +1 -0
  158. package/dist/install/markers.js +14 -0
  159. package/dist/install/markers.js.map +1 -0
  160. package/dist/install/platform.js +29 -0
  161. package/dist/install/platform.js.map +1 -0
  162. package/dist/install/present-tools.js +16 -0
  163. package/dist/install/present-tools.js.map +1 -0
  164. package/dist/install/self-update.js +120 -0
  165. package/dist/install/self-update.js.map +1 -0
  166. package/dist/install/service-backend.js +36 -0
  167. package/dist/install/service-backend.js.map +1 -0
  168. package/dist/install/service-manifest.js +36 -0
  169. package/dist/install/service-manifest.js.map +1 -0
  170. package/dist/install/status.js +58 -0
  171. package/dist/install/status.js.map +1 -0
  172. package/dist/install/systemd-backend.js +225 -0
  173. package/dist/install/systemd-backend.js.map +1 -0
  174. package/dist/markers.js +5 -0
  175. package/dist/markers.js.map +1 -0
  176. package/dist/mcp/installer.js +131 -0
  177. package/dist/mcp/installer.js.map +1 -0
  178. package/dist/mcp/server.js +81 -0
  179. package/dist/mcp/server.js.map +1 -0
  180. package/dist/mcp/tools/get-context.js +3 -0
  181. package/dist/mcp/tools/get-context.js.map +1 -0
  182. package/dist/mcp/tools/list-projects.js +3 -0
  183. package/dist/mcp/tools/list-projects.js.map +1 -0
  184. package/dist/mcp/tools/save-memory.js +3 -0
  185. package/dist/mcp/tools/save-memory.js.map +1 -0
  186. package/dist/mcp/tools.js +288 -0
  187. package/dist/mcp/tools.js.map +1 -0
  188. package/dist/rendering/raw-turn-renderer.js +85 -0
  189. package/dist/rendering/raw-turn-renderer.js.map +1 -0
  190. package/dist/security/file-permissions.js +15 -0
  191. package/dist/security/file-permissions.js.map +1 -0
  192. package/dist/security/provider-transcript.js +74 -0
  193. package/dist/security/provider-transcript.js.map +1 -0
  194. package/dist/security/sanitize.js +210 -0
  195. package/dist/security/sanitize.js.map +1 -0
  196. package/dist/security/self-ingestion.js +47 -0
  197. package/dist/security/self-ingestion.js.map +1 -0
  198. package/dist/security/sentinel.js +19 -0
  199. package/dist/security/sentinel.js.map +1 -0
  200. package/dist/security/subprocess-allowlist.js +421 -0
  201. package/dist/security/subprocess-allowlist.js.map +1 -0
  202. package/dist/serving/instructions.js +33 -0
  203. package/dist/serving/instructions.js.map +1 -0
  204. package/dist/serving/lexical-recall.js +249 -0
  205. package/dist/serving/lexical-recall.js.map +1 -0
  206. package/dist/serving/session-reader.js +302 -0
  207. package/dist/serving/session-reader.js.map +1 -0
  208. package/dist/storage/backfill-runner.js +34 -0
  209. package/dist/storage/backfill-runner.js.map +1 -0
  210. package/dist/storage/backup.js +46 -0
  211. package/dist/storage/backup.js.map +1 -0
  212. package/dist/storage/candidate-validator.js +77 -0
  213. package/dist/storage/candidate-validator.js.map +1 -0
  214. package/dist/storage/consent-store.js +198 -0
  215. package/dist/storage/consent-store.js.map +1 -0
  216. package/dist/storage/custom-title-backfill.js +68 -0
  217. package/dist/storage/custom-title-backfill.js.map +1 -0
  218. package/dist/storage/db.js +312 -0
  219. package/dist/storage/db.js.map +1 -0
  220. package/dist/storage/external-agent-import-purge.js +182 -0
  221. package/dist/storage/external-agent-import-purge.js.map +1 -0
  222. package/dist/storage/first-prompt-search-backfill.js +76 -0
  223. package/dist/storage/first-prompt-search-backfill.js.map +1 -0
  224. package/dist/storage/first-prompt-search.js +7 -0
  225. package/dist/storage/first-prompt-search.js.map +1 -0
  226. package/dist/storage/injection-store.js +37 -0
  227. package/dist/storage/injection-store.js.map +1 -0
  228. package/dist/storage/memory-store.js +428 -0
  229. package/dist/storage/memory-store.js.map +1 -0
  230. package/dist/storage/project-resolver.js +294 -0
  231. package/dist/storage/project-resolver.js.map +1 -0
  232. package/dist/storage/project-store.js +104 -0
  233. package/dist/storage/project-store.js.map +1 -0
  234. package/dist/storage/rendered-chars-backfill.js +85 -0
  235. package/dist/storage/rendered-chars-backfill.js.map +1 -0
  236. package/dist/storage/resegmentation.js +582 -0
  237. package/dist/storage/resegmentation.js.map +1 -0
  238. package/dist/storage/rollup-store.js +246 -0
  239. package/dist/storage/rollup-store.js.map +1 -0
  240. package/dist/storage/root-commit-backfill.js +32 -0
  241. package/dist/storage/root-commit-backfill.js.map +1 -0
  242. package/dist/storage/sanitize-backfill.js +184 -0
  243. package/dist/storage/sanitize-backfill.js.map +1 -0
  244. package/dist/storage/segmentation.js +87 -0
  245. package/dist/storage/segmentation.js.map +1 -0
  246. package/dist/storage/session-fields-backfill.js +196 -0
  247. package/dist/storage/session-fields-backfill.js.map +1 -0
  248. package/dist/storage/session-read-model.js +130 -0
  249. package/dist/storage/session-read-model.js.map +1 -0
  250. package/dist/storage/session-store.js +200 -0
  251. package/dist/storage/session-store.js.map +1 -0
  252. package/dist/storage/session-title-backfill.js +75 -0
  253. package/dist/storage/session-title-backfill.js.map +1 -0
  254. package/dist/storage/session-title.js +71 -0
  255. package/dist/storage/session-title.js.map +1 -0
  256. package/dist/storage/shown-session-list-store.js +33 -0
  257. package/dist/storage/shown-session-list-store.js.map +1 -0
  258. package/dist/storage/stats.js +30 -0
  259. package/dist/storage/stats.js.map +1 -0
  260. package/dist/storage/turn-store.js +202 -0
  261. package/dist/storage/turn-store.js.map +1 -0
  262. package/dist/storage/ulid.js +17 -0
  263. package/dist/storage/ulid.js.map +1 -0
  264. package/dist/summarizer/anthropic-call.js +76 -0
  265. package/dist/summarizer/anthropic-call.js.map +1 -0
  266. package/dist/summarizer/call-log.js +120 -0
  267. package/dist/summarizer/call-log.js.map +1 -0
  268. package/dist/summarizer/haiku-provider.js +136 -0
  269. package/dist/summarizer/haiku-provider.js.map +1 -0
  270. package/dist/summarizer/pricing.js +8 -0
  271. package/dist/summarizer/pricing.js.map +1 -0
  272. package/dist/summarizer/prompt-cache.js +6 -0
  273. package/dist/summarizer/prompt-cache.js.map +1 -0
  274. package/dist/summarizer/prompt.js +47 -0
  275. package/dist/summarizer/prompt.js.map +1 -0
  276. package/dist/summarizer/provider-config.js +25 -0
  277. package/dist/summarizer/provider-config.js.map +1 -0
  278. package/dist/summarizer/rollup-prompt.js +225 -0
  279. package/dist/summarizer/rollup-prompt.js.map +1 -0
  280. package/dist/summarizer/rollup-provider.js +224 -0
  281. package/dist/summarizer/rollup-provider.js.map +1 -0
  282. package/dist/types/index.js +10 -0
  283. package/dist/types/index.js.map +1 -0
  284. package/dist/util/error.js +5 -0
  285. package/dist/util/error.js.map +1 -0
  286. package/dist/util/fs.js +97 -0
  287. package/dist/util/fs.js.map +1 -0
  288. package/dist/util/relative-time.js +12 -0
  289. package/dist/util/relative-time.js.map +1 -0
  290. package/package.json +81 -0
@@ -0,0 +1,499 @@
1
+ // Adapter for ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl[.zst] session files.
2
+ //
3
+ // Turn boundary has two observed forms: event_msg.payload.type "user_message"
4
+ // and a non-synthetic response_item message whose role is "user". A file uses
5
+ // one form consistently; the adapter identifies which before parsing so a
6
+ // rollout that contains both records does not create duplicate turns. Real
7
+ // Some primary rollouts omit the event form entirely, so the response item
8
+ // must remain a boundary on its own. Synthetic
9
+ // role:"user"/"developer" response_items remain excluded: in particular,
10
+ // <environment_context> is a resume marker and never turn content.
11
+ //
12
+ // File edits arrive as a response_item with payload.type "custom_tool_call"
13
+ // and payload.name "apply_patch" - the patch text is a RAW string under
14
+ // payload.input (real newlines, not JSON-encoded), not the OpenAI-style
15
+ // function_call/arguments envelope. Verified against 542 real apply_patch
16
+ // calls across CLI versions 0.136.0-0.147.0: the custom_tool_call envelope
17
+ // was 100% of them, 0 used function_call. An earlier version of this adapter
18
+ // assumed function_call/arguments without a real sample and missed every
19
+ // apply_patch call as a result - see test/fixtures/codex for the real
20
+ // samples that now guard against regressing this.
21
+ //
22
+ // function_call/function_call_output IS the real envelope for genuine
23
+ // OpenAI-style tool calls (MCP servers, read_file, exec_command, ...) -
24
+ // arguments there really is a JSON-encoded string.
25
+ //
26
+ // Every payload.type/top-level type this adapter treats as skip is listed
27
+ // explicitly below (KNOWN_*). Anything not in one of those sets triggers
28
+ // warnUnknownLine() instead of silently falling through - the exact failure
29
+ // mode that let the apply_patch envelope bug ship unnoticed.
30
+ import path from 'node:path';
31
+ import { codexSessionsRoot, isWithin, toPosix } from '../config/paths.js';
32
+ import { classifyEmptyJsonlSession, JsonlTurnAdapter, OversizedTranscriptRecordError, readBoundedLines, resolveAbsolute, safeDiscriminator, textValues, } from './base.js';
33
+ import { INTERNAL_COMMAND_NAME, INTERNAL_COMMAND_TAGS } from './internal-command.js';
34
+ const ROLLOUT_ID_RE = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i;
35
+ const EXTERNAL_IMPORT_TURN_PREFIX = 'external-import-turn-';
36
+ // Top-level line types this adapter has observed and deliberately ignores
37
+ // (none carry turn content; session_meta/turn_context are mined for cwd only).
38
+ const KNOWN_TOP_LEVEL_SKIP = new Set(['session_meta', 'turn_context', 'world_state', 'compacted', 'inter_agent_communication_metadata']);
39
+ // event_msg.payload.type subtypes other than "user_message". agent_message is
40
+ // a higher-volume duplicate of the response_item assistant text we already
41
+ // use as the source of truth - intentionally not read here.
42
+ const KNOWN_EVENT_MSG_SKIP = new Set([
43
+ 'token_count',
44
+ 'agent_message',
45
+ 'task_started',
46
+ 'task_complete',
47
+ 'thread_settings_applied',
48
+ 'patch_apply_end',
49
+ 'mcp_tool_call_end',
50
+ 'web_search_end',
51
+ 'item_completed',
52
+ 'context_compacted',
53
+ 'turn_aborted',
54
+ 'sub_agent_activity',
55
+ 'thread_rolled_back',
56
+ // TUI's short thinking header, not chain-of-thought or assistant output.
57
+ // Observed only in a prerelease build; deliberately exclude it.
58
+ 'agent_reasoning',
59
+ ]);
60
+ // response_item.payload.type subtypes other than "message", "custom_tool_call", and "function_call".
61
+ const KNOWN_RESPONSE_ITEM_SKIP = new Set([
62
+ 'reasoning',
63
+ 'custom_tool_call_output',
64
+ 'function_call_output',
65
+ 'web_search_call',
66
+ 'tool_search_call',
67
+ 'tool_search_output',
68
+ 'agent_message', // rare (sub-agent) duplicate of the event_msg subtype of the same name - same "already have this via response_item role:assistant" rationale
69
+ ]);
70
+ // Codex's apply_patch envelope, used both standalone and embedded in shell
71
+ // heredocs. A "*** Move to: X" line marks a rename: the file was touched at
72
+ // BOTH the old and new path - recording only the source path (or only the
73
+ // destination) isn't incomplete data, it's wrong data, since neither alone
74
+ // tells a reader where the file actually lives now.
75
+ const PATCH_FILE_RE = /\*\*\* (?:Update|Add|Delete) File: ([^\\\n"]+)/g;
76
+ const PATCH_MOVE_RE = /\*\*\* Move to: ([^\\\n"]+)/g;
77
+ function hasToolCall(payloadType) {
78
+ return (payloadType === 'function_call' ||
79
+ payloadType === 'custom_tool_call' ||
80
+ payloadType === 'web_search_call' ||
81
+ payloadType === 'tool_search_call' ||
82
+ payloadType === 'custom_tool_call_output' ||
83
+ payloadType === 'function_call_output' ||
84
+ payloadType === 'mcp_tool_call_end' ||
85
+ payloadType === 'web_search_end' ||
86
+ payloadType === 'tool_search_output');
87
+ }
88
+ function emptySessionSignals(line) {
89
+ const payload = line.payload;
90
+ const role = payload?.role;
91
+ const payloadType = payload?.type;
92
+ const isUser = role === 'user' || payloadType === 'user_message';
93
+ const values = textValues(payload?.content ?? payload?.message);
94
+ return {
95
+ userContentSeen: isUser,
96
+ internalCommandRollout: line.type === 'session_meta' && payload?.source?.subagent?.thread_spawn !== undefined,
97
+ internalCommand: isUser && values.some((value) => INTERNAL_COMMAND_NAME.test(value) && INTERNAL_COMMAND_TAGS.test(value)),
98
+ nonInternalUserContent: isUser && values.some((value) => value.trim() !== '' && !INTERNAL_COMMAND_TAGS.test(value)),
99
+ assistantContribution: role === 'assistant' || (line.type === 'event_msg' && payloadType === 'agent_message'),
100
+ abortedPrompt: payloadType === 'turn_aborted',
101
+ toolCall: hasToolCall(payloadType),
102
+ };
103
+ }
104
+ function extractPatchFilePaths(input, cwd) {
105
+ if (!input) {
106
+ return [];
107
+ }
108
+ const paths = new Set();
109
+ for (const match of input.matchAll(PATCH_FILE_RE)) {
110
+ const raw = match[1]?.trim();
111
+ if (raw) {
112
+ paths.add(resolveAbsolute(raw, cwd ?? process.cwd()));
113
+ }
114
+ }
115
+ for (const match of input.matchAll(PATCH_MOVE_RE)) {
116
+ const raw = match[1]?.trim();
117
+ if (raw) {
118
+ paths.add(resolveAbsolute(raw, cwd ?? process.cwd()));
119
+ }
120
+ }
121
+ return [...paths];
122
+ }
123
+ /**
124
+ * The `exec` custom tool carries a JavaScript PROGRAM, not a command string -
125
+ * it can batch N shell commands through Promise.all, and it can carry an
126
+ * apply_patch heredoc inline as a JS string literal
127
+ * (`const patch = "*** Begin Patch\n*** Update File: ..."`).
128
+ *
129
+ * Those embedded patches are real file writes in the identical envelope
130
+ * extractPatchFilePaths already parses; they were simply never fed to it,
131
+ * because extraction was gated on the tool NAME being "apply_patch". Measured
132
+ * against the real corpus: 434 of 3,870 exec/exec_command calls carry patch
133
+ * paths, 349 of them under name "exec" - i.e. previously dropped on the floor.
134
+ *
135
+ * Deliberately NOT attempted here: recovering paths from arbitrary shell
136
+ * argument text (sed/rg/npm targets). That is a further ~20% of calls but it
137
+ * is heuristic and produced false positives (glob artifacts) in measurement.
138
+ * Extraction stays deterministic.
139
+ */
140
+ /** function_call.arguments is a JSON-encoded string; an embedded patch is escaped inside it. Falls back to the raw text if it isn't valid JSON. */
141
+ function decodeArguments(argumentsRaw) {
142
+ if (!argumentsRaw) {
143
+ return undefined;
144
+ }
145
+ try {
146
+ const parsed = JSON.parse(argumentsRaw);
147
+ return Object.values(parsed)
148
+ .filter((v) => typeof v === 'string')
149
+ .join('\n');
150
+ }
151
+ catch {
152
+ return argumentsRaw;
153
+ }
154
+ }
155
+ function extractExecFilePaths(input, cwd) {
156
+ if (!input?.includes('*** ')) {
157
+ return [];
158
+ }
159
+ return extractPatchFilePaths(input, cwd);
160
+ }
161
+ /**
162
+ * read_file is an MCP tool call carrying an explicit file_path argument - the
163
+ * Codex-side parity for Claude Code's Read. Low volume but deterministic (65
164
+ * calls in the local corpus; a 30-day slice happens to contain none, which is
165
+ * NOT evidence the envelope is gone - a dedicated fixture guards it).
166
+ */
167
+ function extractReadFileePaths(name, argumentsRaw, cwd) {
168
+ if (name !== 'read_file' || !argumentsRaw) {
169
+ return [];
170
+ }
171
+ try {
172
+ const args = JSON.parse(argumentsRaw);
173
+ if (typeof args.file_path !== 'string' || args.file_path.length === 0) {
174
+ return [];
175
+ }
176
+ return [resolveAbsolute(args.file_path, args.projectPath ?? cwd ?? process.cwd())];
177
+ }
178
+ catch {
179
+ return [];
180
+ }
181
+ }
182
+ export class CodexAdapter extends JsonlTurnAdapter {
183
+ tool = 'codex';
184
+ watchGlobs = ['*/*/*/rollout-*.jsonl'];
185
+ userBoundaryByFile = new Map();
186
+ matches(filePath) {
187
+ return (isWithin(codexSessionsRoot(), filePath) &&
188
+ path.basename(filePath).startsWith('rollout-') &&
189
+ (toPosix(filePath).endsWith('.jsonl') || toPosix(filePath).endsWith('.jsonl.zst')));
190
+ }
191
+ nativeSessionId(filePath) {
192
+ const m = ROLLOUT_ID_RE.exec(path.basename(filePath));
193
+ return m ? m[1] : path.basename(filePath, '.jsonl');
194
+ }
195
+ /**
196
+ * Codex has emitted both user-turn envelopes. When an event_msg is present
197
+ * before the response, it is the historical boundary; otherwise the
198
+ * role:user response_item is the complete record. Resolve that once per
199
+ * parse so a rollout containing the duplicate pair does not emit twice.
200
+ */
201
+ async userBoundaryFor(filePath, options = {}) {
202
+ let sawUserResponse = false;
203
+ try {
204
+ for await (const { text } of readBoundedLines(filePath, { handle: options.handle })) {
205
+ if (options.signal?.aborted) {
206
+ return 'response_item';
207
+ }
208
+ let line;
209
+ try {
210
+ line = JSON.parse(text);
211
+ }
212
+ catch {
213
+ continue;
214
+ }
215
+ const payload = line.payload;
216
+ if (line.type === 'event_msg' && payload?.type === 'user_message') {
217
+ return 'event_msg';
218
+ }
219
+ if (line.type === 'response_item' &&
220
+ payload?.type === 'message' &&
221
+ payload.role === 'user' &&
222
+ !this.isResumeMarkerLine(line)) {
223
+ sawUserResponse = true;
224
+ continue;
225
+ }
226
+ // A user prompt followed by the assistant without an
227
+ // event_msg is the response_item-only format. No later
228
+ // transcript line can turn that completed turn into the
229
+ // duplicate form.
230
+ if (sawUserResponse && line.type === 'response_item' && payload?.type === 'message' && payload.role === 'assistant') {
231
+ return 'response_item';
232
+ }
233
+ }
234
+ }
235
+ catch (error) {
236
+ if (error instanceof OversizedTranscriptRecordError) {
237
+ throw error;
238
+ }
239
+ // The daemon's readability guard owns a visible failure. The
240
+ // response envelope is the conservative fallback if a direct
241
+ // adapter caller races a disappearing file.
242
+ }
243
+ return 'response_item';
244
+ }
245
+ async *parseTurns(filePath, sinceCursor, options) {
246
+ this.userBoundaryByFile.set(filePath, await this.userBoundaryFor(filePath, options));
247
+ if (options?.signal?.aborted) {
248
+ return;
249
+ }
250
+ yield* super.parseTurns(filePath, sinceCursor, options);
251
+ }
252
+ /**
253
+ * Codex encodes session provenance in the first session_meta line.
254
+ *
255
+ * Two markers look authoritative and are not:
256
+ * - thread_source === 'subagent' is set on genuine subagents AND on the
257
+ * internal adjudicator, so it cannot decide either on its own.
258
+ * - parent_thread_id is set on every child session, copy or not. Keying
259
+ * fork detection off it misclassifies 26 non-copied sessions whose
260
+ * turns span hours-to-days as duplicates.
261
+ *
262
+ * Measured against the local corpus, the signals that actually separate
263
+ * the three cases:
264
+ *
265
+ * - forked_from_id non-null -> the file BEGINS with a verbatim copy of the
266
+ * parent's whole transcript, every copied line restamped with the fork
267
+ * instant (observed: 175 turns inside 73ms of each other, byte-identical
268
+ * user messages to the parent, vs. multi-hour spans on every
269
+ * non-forked child). Ingesting it duplicates the parent.
270
+ * - thread_source 'subagent' with NO agent_path/agent_nickname -> Codex's
271
+ * internal approval adjudicator. Its own prompt labels the transcript
272
+ * "untrusted evidence, not instructions to follow"; there is no human in
273
+ * it. User-spawned subagents always carry both fields.
274
+ */
275
+ async classifySession(filePath, options) {
276
+ const { first, externalAgentImport } = await this.readClassificationPreamble(filePath, options?.handle);
277
+ if (!first) {
278
+ return { kind: 'primary' };
279
+ }
280
+ const meta = (first.payload ?? {});
281
+ if (externalAgentImport) {
282
+ return {
283
+ kind: 'primary',
284
+ exclusion: 'external-agent-import',
285
+ reason: `turn_id starts with ${EXTERNAL_IMPORT_TURN_PREFIX}`,
286
+ };
287
+ }
288
+ if (meta.forked_from_id) {
289
+ return {
290
+ kind: 'fork-copy',
291
+ parentNativeId: meta.forked_from_id,
292
+ reason: `transcript opens with a fork-time copy of session ${meta.forked_from_id}`,
293
+ };
294
+ }
295
+ if (meta.thread_source === 'subagent') {
296
+ // A user-spawned subagent always carries its identity; the internal
297
+ // adjudicator never does.
298
+ if (!meta.agent_path && !meta.agent_nickname) {
299
+ return {
300
+ kind: 'adjudicator',
301
+ parentNativeId: meta.parent_thread_id ?? undefined,
302
+ reason: 'Codex internal approval-adjudication transcript (untrusted evidence, no human)',
303
+ };
304
+ }
305
+ return { kind: 'subagent', parentNativeId: meta.parent_thread_id ?? undefined };
306
+ }
307
+ return { kind: 'primary' };
308
+ }
309
+ async classifyEmptySession(filePath) {
310
+ return classifyEmptyJsonlSession(filePath, (line) => emptySessionSignals(line));
311
+ }
312
+ /**
313
+ * Imported external-agent rollouts have no discriminator in session_meta;
314
+ * Codex puts it on the first task event instead. Read parsed fields from the
315
+ * JSONL preamble and stop at the first turn_id: matching text elsewhere in a
316
+ * prompt, tool payload, or instruction block must never exclude a session.
317
+ */
318
+ async readClassificationPreamble(filePath, handle) {
319
+ let first;
320
+ try {
321
+ for await (const { text } of readBoundedLines(filePath, { handle })) {
322
+ let line;
323
+ try {
324
+ line = JSON.parse(text);
325
+ }
326
+ catch {
327
+ continue;
328
+ }
329
+ first ??= line;
330
+ const turnId = line.type === 'event_msg' ? line.payload?.turn_id : undefined;
331
+ if (typeof turnId === 'string') {
332
+ return { first, externalAgentImport: turnId.startsWith(EXTERNAL_IMPORT_TURN_PREFIX) };
333
+ }
334
+ }
335
+ }
336
+ catch (error) {
337
+ if (error instanceof OversizedTranscriptRecordError) {
338
+ throw error;
339
+ }
340
+ // The daemon's file-level readability guard owns the visible alert.
341
+ }
342
+ return { first, externalAgentImport: false };
343
+ }
344
+ cwdOf(line) {
345
+ const l = line;
346
+ if (l.type === 'session_meta' || l.type === 'turn_context') {
347
+ return typeof l.payload?.cwd === 'string' ? l.payload.cwd : undefined;
348
+ }
349
+ return undefined;
350
+ }
351
+ timestampOf(line) {
352
+ const l = line;
353
+ return typeof l.timestamp === 'string' ? l.timestamp : undefined;
354
+ }
355
+ surfaceOf(line) {
356
+ const l = line;
357
+ if (l.type !== 'session_meta') {
358
+ return undefined;
359
+ }
360
+ const meta = l.payload;
361
+ return typeof meta.originator === 'string' ? meta.originator : undefined;
362
+ }
363
+ branchOf(line) {
364
+ const l = line;
365
+ if (l.type !== 'session_meta') {
366
+ return undefined;
367
+ }
368
+ const meta = l.payload;
369
+ return typeof meta.git?.branch === 'string' ? meta.git.branch : undefined;
370
+ }
371
+ isExternalFetchLine(line) {
372
+ const l = line;
373
+ return l.type === 'response_item' && l.payload?.type === 'web_search_call';
374
+ }
375
+ /**
376
+ * `<environment_context>` resume marker. A marker either starts
377
+ * a content item directly or is appended after a reloaded instruction block
378
+ * in that same item. Matching the complete closing tag avoids treating
379
+ * ordinary prose that merely mentions "environment_context" as a marker.
380
+ */
381
+ isResumeMarkerLine(line) {
382
+ const l = line;
383
+ if (l.type !== 'response_item' || l.payload?.type !== 'message' || l.payload.role !== 'user') {
384
+ return false;
385
+ }
386
+ return (l.payload.content ?? []).some((block) => {
387
+ const text = block.text?.trim();
388
+ return (text?.startsWith('<environment_context>') ||
389
+ (text?.endsWith('</environment_context>') === true && text.includes('\n<environment_context>')));
390
+ });
391
+ }
392
+ classify(line, filePath) {
393
+ const l = line;
394
+ const p = l.payload;
395
+ if (!p) {
396
+ return 'skip';
397
+ }
398
+ if (l.type === 'event_msg') {
399
+ if (p.type === 'user_message') {
400
+ return this.userBoundaryByFile.get(filePath) === 'event_msg' ? 'boundary' : 'skip';
401
+ }
402
+ if (!KNOWN_EVENT_MSG_SKIP.has(p.type)) {
403
+ this.warnUnknownLine(`CodexAdapter: unrecognized event_msg.payload.type "${safeDiscriminator(p.type)}" in ${filePath}`);
404
+ }
405
+ return 'skip';
406
+ }
407
+ if (l.type === 'response_item') {
408
+ if (p.type === 'message') {
409
+ if (p.role === 'assistant') {
410
+ return 'content';
411
+ }
412
+ // This is the portable user-turn record. The only role:user
413
+ // variant that may never open a turn is the synthetic resume
414
+ // marker; it is boundary metadata, not human input.
415
+ return p.role === 'user' && !this.isResumeMarkerLine(l) && this.userBoundaryByFile.get(filePath) === 'response_item'
416
+ ? 'boundary'
417
+ : 'skip';
418
+ }
419
+ if (p.type === 'custom_tool_call' || p.type === 'function_call') {
420
+ return 'content';
421
+ }
422
+ if (!KNOWN_RESPONSE_ITEM_SKIP.has(p.type)) {
423
+ this.warnUnknownLine(`CodexAdapter: unrecognized response_item.payload.type "${safeDiscriminator(p.type)}" in ${filePath}`);
424
+ }
425
+ return 'skip';
426
+ }
427
+ if (!KNOWN_TOP_LEVEL_SKIP.has(l.type)) {
428
+ this.warnUnknownLine(`CodexAdapter: unrecognized top-level type "${safeDiscriminator(l.type)}" in ${filePath}`);
429
+ }
430
+ return 'skip';
431
+ }
432
+ observeToolCallState(state, line) {
433
+ const l = line;
434
+ const payload = l.payload;
435
+ if (l.type !== 'response_item' || typeof payload?.call_id !== 'string') {
436
+ return;
437
+ }
438
+ if (payload.type === 'function_call' || payload.type === 'custom_tool_call') {
439
+ state.openToolCallIds.add(payload.call_id);
440
+ }
441
+ else if (payload.type === 'function_call_output' || payload.type === 'custom_tool_call_output') {
442
+ state.openToolCallIds.delete(payload.call_id);
443
+ }
444
+ }
445
+ fold(state, line) {
446
+ const l = line;
447
+ const p = l.payload;
448
+ if (!p) {
449
+ return;
450
+ }
451
+ if (l.type === 'response_item' && p.type === 'message' && p.role === 'user') {
452
+ for (const block of p.content ?? []) {
453
+ if ((block.type === 'input_text' || block.type === 'text') && typeof block.text === 'string') {
454
+ state.userMessageParts.push(block.text);
455
+ }
456
+ }
457
+ return;
458
+ }
459
+ if (l.type === 'event_msg' && p.type === 'user_message') {
460
+ if (typeof p.message === 'string') {
461
+ state.userMessageParts.push(p.message);
462
+ }
463
+ return;
464
+ }
465
+ if (l.type === 'response_item' && p.type === 'message' && p.role === 'assistant') {
466
+ for (const block of p.content ?? []) {
467
+ if ((block.type === 'output_text' || block.type === 'text') && typeof block.text === 'string') {
468
+ state.assistantTextParts.push(block.text);
469
+ }
470
+ }
471
+ return;
472
+ }
473
+ if (l.type === 'response_item' && p.type === 'custom_tool_call') {
474
+ // apply_patch: the standalone envelope. exec: a JS program that may
475
+ // embed the same patch format - both are real file writes.
476
+ const filePaths = p.name === 'apply_patch'
477
+ ? extractPatchFilePaths(p.input, state.projectPath)
478
+ : extractExecFilePaths(p.input, state.projectPath);
479
+ const call = { name: p.name ?? 'unknown', filePaths, text: p.input ?? '' };
480
+ state.toolCalls.push(call);
481
+ return;
482
+ }
483
+ if (l.type === 'response_item' && p.type === 'function_call') {
484
+ // Two deterministic sources here: read_file's explicit file_path
485
+ // argument, and a patch envelope embedded in an exec_command cmd
486
+ // (arguments are JSON-encoded, so decode before scanning).
487
+ const call = {
488
+ name: p.name ?? 'unknown',
489
+ filePaths: [
490
+ ...extractReadFileePaths(p.name, p.arguments, state.projectPath),
491
+ ...extractExecFilePaths(decodeArguments(p.arguments), state.projectPath),
492
+ ],
493
+ text: p.arguments ?? '',
494
+ };
495
+ state.toolCalls.push(call);
496
+ }
497
+ }
498
+ }
499
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ // Table-driven mapping from each tool's raw surface/kind field to the
2
+ // normalized values sessions.surface/sessions.kind store. Values here are
3
+ // corpus-measured, not assumed. Update this table if future corpus evidence
4
+ // contradicts the values below.
5
+ /** Claude Code's `entrypoint` field. Confirmed values only. */
6
+ export function claudeCodeSurface(entrypoint) {
7
+ if (entrypoint === 'cli') {
8
+ return 'cli';
9
+ }
10
+ if (entrypoint === 'claude-desktop') {
11
+ return 'desktop';
12
+ }
13
+ return null;
14
+ }
15
+ /**
16
+ * Codex's `originator` field. THREE distinct values, not two - "codex-tui" (59/66 sessions),
17
+ * "codex_exec" (6/66), "Codex Desktop" (1/66), full local corpus, no fourth
18
+ * value found. Both non-Desktop values are CLI-originated, so the predicate
19
+ * is "not Desktop", not "equals codex-tui". A value this table has never
20
+ * seen is treated as CLI too (same predicate), not as unknown - Desktop is
21
+ * the one value confirmed to mean something else.
22
+ */
23
+ export function codexSurface(originator) {
24
+ if (originator === undefined) {
25
+ return null;
26
+ }
27
+ return originator === 'Codex Desktop' ? 'desktop' : 'cli';
28
+ }
29
+ const SESSION_KIND_MAP = {
30
+ primary: 'main',
31
+ subagent: 'subagent',
32
+ 'fork-copy': 'fork',
33
+ adjudicator: 'adjudicator',
34
+ };
35
+ /** SessionKind (adapter classification vocabulary) -> sessions.kind (this plan's storage vocabulary). See SessionRowKind's doc comment for why these differ. */
36
+ export function toSessionRowKind(kind) {
37
+ return SESSION_KIND_MAP[kind];
38
+ }
39
+ //# sourceMappingURL=discriminators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discriminators.js","sourceRoot":"","sources":["../../src/adapters/discriminators.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0EAA0E;AAC1E,4EAA4E;AAC5E,gCAAgC;AAIhC,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAAC,UAA8B;IAC5D,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,UAA8B;IACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED,MAAM,gBAAgB,GAAwC;IAC1D,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,aAAa;CAC7B,CAAC;AAEF,gKAAgK;AAChK,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAC9C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ClaudeCodeAdapter } from './claude-code.js';
2
+ import { CodexAdapter } from './codex.js';
3
+ export function defaultAdapters() {
4
+ return { 'claude-code': new ClaudeCodeAdapter(), codex: new CodexAdapter() };
5
+ }
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,eAAe;IAC3B,OAAO,EAAE,aAAa,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,YAAY,EAAE,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const INTERNAL_COMMAND_TAGS = /<(?:command-name|command-message|command-args|local-command-caveat|local-command-stdout)>/;
2
+ export const INTERNAL_COMMAND_NAME = /<command-name>\s*\/[^<]*<\/command-name>/;
3
+ //# sourceMappingURL=internal-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-command.js","sourceRoot":"","sources":["../../src/adapters/internal-command.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,2FAA2F,CAAC;AACjI,MAAM,CAAC,MAAM,qBAAqB,GAAG,0CAA0C,CAAC"}