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,600 @@
1
+ // Adapter contract: each AI CLI (Claude Code, Codex) implements this to turn
2
+ // its own JSONL session format into a common shape. Keeps tool-specific
3
+ // parsing quirks out of the daemon/storage/mcp layers.
4
+ //
5
+ // This file owns the one piece of logic that must not be duplicated per
6
+ // adapter: turn-boundary assembly. A turn is only emitted once provably
7
+ // closed (a subsequent turn-opening line was parsed, or the caller asserts
8
+ // the file has been idle past its debounce window). Getting this wrong is
9
+ // not self-correcting — see ParseTurnsOptions in ../types.
10
+ import { createHash } from 'node:crypto';
11
+ import { open, stat } from 'node:fs/promises';
12
+ import path from 'node:path';
13
+ import { FINGERPRINT_WINDOW_BYTES, MAX_JSON_VALUE_DEPTH, MAX_JSON_VALUE_NODES, MAX_TRANSCRIPT_RECORD_BYTES, MAX_UNKNOWN_LINE_DISCRIMINATOR_CHARS, } from '../config/constants.js';
14
+ import { turnText } from '../security/self-ingestion.js';
15
+ import { containsSentinel } from '../security/sentinel.js';
16
+ const NEWLINE = 0x0a;
17
+ const TRANSCRIPT_READ_CHUNK_BYTES = 64 * 1024;
18
+ const DISCRIMINATOR_DIGEST_HEX_CHARS = 8;
19
+ const DISCRIMINATOR_DIGEST_SEPARATOR = '…#';
20
+ const UNSAFE_DISCRIMINATOR_CHARACTERS = /[\p{Cc}\u2028\u2029]/gu;
21
+ function discriminatorDigest(value) {
22
+ let digestInput;
23
+ if (typeof value === 'string') {
24
+ digestInput = value;
25
+ }
26
+ else {
27
+ try {
28
+ digestInput = JSON.stringify(value) ?? `${typeof value}:${String(value)}`;
29
+ }
30
+ catch {
31
+ digestInput = `${typeof value}:${Object.prototype.toString.call(value)}`;
32
+ }
33
+ }
34
+ return createHash('sha256').update(digestInput).digest('hex').slice(0, DISCRIMINATOR_DIGEST_HEX_CHARS);
35
+ }
36
+ /** Renders an untrusted line discriminator without copying arbitrary transcript content into diagnostics. */
37
+ export function safeDiscriminator(value) {
38
+ const isString = typeof value === 'string';
39
+ const display = isString ? value : value === null ? 'null' : Array.isArray(value) ? 'array' : typeof value;
40
+ const sanitized = display.replace(UNSAFE_DISCRIMINATOR_CHARACTERS, '');
41
+ const sanitizedCharacters = [...sanitized];
42
+ const needsDigest = !isString || sanitized !== display || sanitizedCharacters.length > MAX_UNKNOWN_LINE_DISCRIMINATOR_CHARS;
43
+ if (!needsDigest) {
44
+ return sanitized;
45
+ }
46
+ const suffix = `${DISCRIMINATOR_DIGEST_SEPARATOR}${discriminatorDigest(value)}`;
47
+ const prefixLength = MAX_UNKNOWN_LINE_DISCRIMINATOR_CHARS - [...suffix].length;
48
+ return `${sanitizedCharacters.slice(0, prefixLength).join('')}${suffix}`;
49
+ }
50
+ function* childValues(value) {
51
+ if (Array.isArray(value)) {
52
+ for (const child of value) {
53
+ yield child;
54
+ }
55
+ return;
56
+ }
57
+ for (const key in value) {
58
+ if (Object.hasOwn(value, key)) {
59
+ yield value[key];
60
+ }
61
+ }
62
+ }
63
+ export function textValues(value) {
64
+ const strings = [];
65
+ const stack = [{ value, depth: 0, entered: false }];
66
+ let visitedNodes = 0;
67
+ while (stack.length > 0 && visitedNodes < MAX_JSON_VALUE_NODES) {
68
+ const frame = stack.at(-1);
69
+ if (!frame) {
70
+ break;
71
+ }
72
+ if (!frame.entered) {
73
+ frame.entered = true;
74
+ visitedNodes++;
75
+ if (typeof frame.value === 'string') {
76
+ strings.push(frame.value);
77
+ stack.pop();
78
+ continue;
79
+ }
80
+ if (!frame.value || typeof frame.value !== 'object' || frame.depth >= MAX_JSON_VALUE_DEPTH) {
81
+ stack.pop();
82
+ continue;
83
+ }
84
+ frame.children = childValues(frame.value);
85
+ }
86
+ if (!frame.children) {
87
+ stack.pop();
88
+ continue;
89
+ }
90
+ const child = frame.children.next();
91
+ if (child.done) {
92
+ stack.pop();
93
+ }
94
+ else {
95
+ stack.push({ value: child.value, depth: frame.depth + 1, entered: false });
96
+ }
97
+ }
98
+ return strings;
99
+ }
100
+ export const OVERSIZED_TRANSCRIPT_RECORD_REASON = `oversized record exceeds the ${MAX_TRANSCRIPT_RECORD_BYTES}-byte limit`;
101
+ export function malformedCompleteRecordsDiagnostic(filePath, count) {
102
+ const record = count === 1 ? 'record' : 'records';
103
+ return `[elepha] skipped ${count} malformed complete JSONL ${record} in ${filePath}`;
104
+ }
105
+ export class OversizedTranscriptRecordError extends Error {
106
+ constructor() {
107
+ super(OVERSIZED_TRANSCRIPT_RECORD_REASON);
108
+ this.name = 'OversizedTranscriptRecordError';
109
+ }
110
+ }
111
+ /** Reads JSONL records without retaining a pending record beyond the per-record ceiling. */
112
+ export async function* readBoundedLines(filePath, options = {}) {
113
+ const start = options.start ?? 0;
114
+ const maxRecordBytes = options.maxRecordBytes ?? MAX_TRANSCRIPT_RECORD_BYTES;
115
+ if (!Number.isSafeInteger(start) || start < 0) {
116
+ throw new RangeError('start must be a non-negative safe integer');
117
+ }
118
+ if (!Number.isSafeInteger(maxRecordBytes) || maxRecordBytes < 0) {
119
+ throw new RangeError('maxRecordBytes must be a non-negative safe integer');
120
+ }
121
+ const suppliedHandle = options.handle;
122
+ const handle = suppliedHandle ?? (await open(filePath, 'r'));
123
+ let readOffset = start;
124
+ let pendingChunks = [];
125
+ let pendingBytes = 0;
126
+ try {
127
+ for (;;) {
128
+ const bytesUntilOversized = maxRecordBytes - pendingBytes + 1;
129
+ const chunk = Buffer.alloc(Math.min(TRANSCRIPT_READ_CHUNK_BYTES, bytesUntilOversized));
130
+ const { bytesRead } = await handle.read(chunk, 0, chunk.length, readOffset);
131
+ if (bytesRead === 0) {
132
+ break;
133
+ }
134
+ readOffset += bytesRead;
135
+ const data = chunk.subarray(0, bytesRead);
136
+ let lineStart = 0;
137
+ for (;;) {
138
+ const newline = data.indexOf(NEWLINE, lineStart);
139
+ if (newline === -1) {
140
+ const tail = data.subarray(lineStart);
141
+ if (pendingBytes + tail.length > maxRecordBytes) {
142
+ throw new OversizedTranscriptRecordError();
143
+ }
144
+ if (tail.length > 0) {
145
+ pendingChunks.push(tail);
146
+ pendingBytes += tail.length;
147
+ }
148
+ break;
149
+ }
150
+ const lineTail = data.subarray(lineStart, newline);
151
+ const recordBytes = pendingBytes + lineTail.length;
152
+ if (recordBytes > maxRecordBytes) {
153
+ throw new OversizedTranscriptRecordError();
154
+ }
155
+ const record = pendingChunks.length === 0
156
+ ? data.subarray(lineStart, newline)
157
+ : Buffer.concat(lineTail.length === 0 ? pendingChunks : [...pendingChunks, lineTail], recordBytes);
158
+ yield { text: record.toString('utf8'), byteLength: recordBytes + 1, terminated: true };
159
+ pendingChunks = [];
160
+ pendingBytes = 0;
161
+ lineStart = newline + 1;
162
+ }
163
+ }
164
+ if (pendingBytes > 0) {
165
+ yield {
166
+ text: Buffer.concat(pendingChunks, pendingBytes).toString('utf8'),
167
+ byteLength: pendingBytes,
168
+ terminated: false,
169
+ };
170
+ }
171
+ }
172
+ finally {
173
+ if (!suppliedHandle) {
174
+ await handle.close();
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * Reads a transcript through filesystem APIs and applies the classification
180
+ * precedence shared by both JSONL formats. Adapters provide their own line
181
+ * signals so format knowledge remains at the adapter boundary.
182
+ */
183
+ export async function classifyEmptyJsonlSession(filePath, signalsFor) {
184
+ const signals = {
185
+ assistantContribution: false,
186
+ toolCall: false,
187
+ abortedPrompt: false,
188
+ internalCommand: false,
189
+ internalCommandRollout: false,
190
+ nonInternalUserContent: false,
191
+ userContentSeen: false,
192
+ };
193
+ let malformed = false;
194
+ for await (const { text } of readBoundedLines(filePath)) {
195
+ let line;
196
+ try {
197
+ line = JSON.parse(text);
198
+ }
199
+ catch {
200
+ malformed = true;
201
+ continue;
202
+ }
203
+ const lineSignals = signalsFor(line);
204
+ for (const key of Object.keys(signals)) {
205
+ signals[key] ||= lineSignals[key] ?? false;
206
+ }
207
+ }
208
+ if (malformed) {
209
+ return undefined;
210
+ }
211
+ if (signals.internalCommandRollout) {
212
+ return { kind: 'internal command' };
213
+ }
214
+ if (signals.assistantContribution || signals.toolCall) {
215
+ return undefined;
216
+ }
217
+ if (signals.abortedPrompt) {
218
+ return { kind: 'aborted prompt' };
219
+ }
220
+ if (signals.userContentSeen && signals.internalCommand && !signals.nonInternalUserContent) {
221
+ return { kind: 'internal command' };
222
+ }
223
+ return { kind: 'no assistant contribution' };
224
+ }
225
+ /**
226
+ * Resolves a possibly-relative path emitted by a tool call to an absolute,
227
+ * normalized form. Does not resolve symlinks: the file may already be gone
228
+ * by the time we parse the turn, and realpath would throw on that.
229
+ */
230
+ export function resolveAbsolute(filePath, baseDir) {
231
+ return path.isAbsolute(filePath) ? path.normalize(filePath) : path.normalize(path.resolve(baseDir, filePath));
232
+ }
233
+ function normalizeTimestamp(ts) {
234
+ const d = new Date(ts);
235
+ return Number.isNaN(d.getTime()) ? ts : d.toISOString();
236
+ }
237
+ function parseCursor(cursor) {
238
+ if (!cursor) {
239
+ return { byteOffset: 0, nextTurnIndex: 0, fingerprint: undefined };
240
+ }
241
+ // Third segment is optional - an older cursor has
242
+ // only two. Missing means "nothing to verify against", not "verified
243
+ // empty": the rewrite check is skipped for that one scan rather than
244
+ // treated as a mismatch.
245
+ const [offsetStr, indexStr, fingerprint] = cursor.split('|');
246
+ return { byteOffset: Number(offsetStr) || 0, nextTurnIndex: Number(indexStr) || 0, fingerprint: fingerprint || undefined };
247
+ }
248
+ function formatCursor(byteOffset, nextTurnIndex, fingerprint) {
249
+ return `${byteOffset}|${nextTurnIndex}|${fingerprint}`;
250
+ }
251
+ // The byte cursor alone cannot tell "nothing new yet" from "this file got
252
+ // rewritten out from under me" - a rewrite at the same or larger size lands
253
+ // the cursor mid-record with no signal. Fingerprinting a small trailing
254
+ // window ending at the cursor, and re-checking that exact window (not the
255
+ // whole file) on the next scan, catches a rewrite at a cost that doesn't
256
+ // scale with file size.
257
+ async function fingerprintWindow(handle, endOffset) {
258
+ const start = Math.max(0, endOffset - FINGERPRINT_WINDOW_BYTES);
259
+ const len = endOffset - start;
260
+ if (len <= 0) {
261
+ return '';
262
+ }
263
+ const chunk = Buffer.alloc(len);
264
+ await handle.read(chunk, 0, len, start);
265
+ // Not a security boundary - just a reliability check, so a short digest
266
+ // (collision risk irrelevant at this scale) keeps the cursor string small.
267
+ return createHash('sha256').update(chunk).digest('hex').slice(0, 16);
268
+ }
269
+ function freshState() {
270
+ return {
271
+ userMessageParts: [],
272
+ assistantTextParts: [],
273
+ toolCalls: [],
274
+ openToolCallIds: new Set(),
275
+ startedAt: undefined,
276
+ endedAt: undefined,
277
+ projectPath: undefined,
278
+ surface: undefined,
279
+ gitBranch: undefined,
280
+ aiTitle: undefined,
281
+ hasExternalContent: false,
282
+ resumeMarkerBefore: false,
283
+ };
284
+ }
285
+ function isEmptyTurn(state) {
286
+ return (state.userMessageParts.every((s) => s.trim() === '') &&
287
+ state.assistantTextParts.every((s) => s.trim() === '') &&
288
+ state.toolCalls.length === 0);
289
+ }
290
+ // Idle close requires a real assistant contribution and, at the call site,
291
+ // no unresolved tool call. A lone user message with no reply yet is still
292
+ // waiting even past the idle window, so it must stay open.
293
+ function hasAssistantContribution(state) {
294
+ return state.assistantTextParts.some((s) => s.trim() !== '');
295
+ }
296
+ /**
297
+ * Shared turn-assembly engine. Adapters supply the tool-specific line
298
+ * classification and folding logic; this class owns byte-offset tracking,
299
+ * partial-line discard, and the boundary-vs-idle close rule.
300
+ */
301
+ export class JsonlTurnAdapter {
302
+ warnUnknownLine;
303
+ /**
304
+ * Called whenever classify() sees a line shape it doesn't explicitly
305
+ * recognize. The bug this guards against: an adapter's classify() falls
306
+ * through to 'skip' by default, so a wrong or outdated assumption about
307
+ * the source format produces months of silently-empty data with zero
308
+ * signal - exactly what happened with Codex's apply_patch envelope.
309
+ * Defaults to console.warn; the daemon wires this into its own log.
310
+ */
311
+ constructor(warnUnknownLine = (msg) => console.warn(msg)) {
312
+ this.warnUnknownLine = warnUnknownLine;
313
+ }
314
+ /** Files already alerted for a cursor desync, deduped so a frozen session does not re-log identically on every debounced rescan. */
315
+ desyncAlerted = new Set();
316
+ /** Defaults to 'primary'; adapters override where the format exposes a reliable signal. */
317
+ async classifySession(_filePath) {
318
+ return { kind: 'primary' };
319
+ }
320
+ /** Most transcript formats do not expose a user-set session title. */
321
+ async readCustomTitle(_filePath, _fromOffset = 0) {
322
+ return { scannedTo: 0 };
323
+ }
324
+ /**
325
+ * Session-surface discriminator on this line, if any (Claude Code:
326
+ * per-line `entrypoint`; Codex: `originator`, only on session_meta).
327
+ * Not abstract - most lines in both formats don't carry it, so the base
328
+ * loop tracks "last seen" exactly like cwdOf, and an adapter that never
329
+ * overrides this just never sets a surface (NULL, not a wrong guess).
330
+ */
331
+ surfaceOf(_line) {
332
+ return undefined;
333
+ }
334
+ /**
335
+ * Git branch on this line, if any. Per-turn for Claude Code
336
+ * (`gitBranch`), session-constant for Codex (`session_meta.payload.git.branch`; no
337
+ * per-turn equivalent found in the full local corpus).
338
+ */
339
+ branchOf(_line) {
340
+ return undefined;
341
+ }
342
+ /**
343
+ * True if this raw line is a tool-fetched-external-content call. Checked
344
+ * on every line regardless of classify()'s boundary/content/skip verdict
345
+ * (Codex's web_search_call is itself a 'skip' line under KNOWN_RESPONSE_ITEM_SKIP -
346
+ * this hook still needs to see it, the same way cwdOf sees skip lines).
347
+ */
348
+ isExternalFetchLine(_line) {
349
+ return false;
350
+ }
351
+ /**
352
+ * True if this raw line is a Codex resume marker (`<environment_context>`) - a boundary signal
353
+ * only, never content. Checked on every line, independent of classify()'s
354
+ * verdict, the same way isExternalFetchLine is: the marker line itself is
355
+ * classified 'skip' (it's a synthetic role:user response_item, "not
356
+ * something a person typed"), so it never opens or closes a turn on its
357
+ * own - it just sets a pending flag the next turn boundary picks up. Base
358
+ * default false; Claude Code never overrides this (it has per-turn
359
+ * gitBranch and doesn't need it).
360
+ */
361
+ isResumeMarkerLine(_line) {
362
+ return false;
363
+ }
364
+ /** Claude Code emits ai-title as standalone metadata between a prompt and its response. */
365
+ aiTitleOf(_line) {
366
+ return undefined;
367
+ }
368
+ /** Updates transient assembly bookkeeping without making a skipped plumbing line part of the turn payload. */
369
+ observeToolCallState(_state, _line) { }
370
+ async *parseTurns(filePath, sinceCursor, options) {
371
+ if (options?.signal?.aborted) {
372
+ return;
373
+ }
374
+ const { byteOffset: startOffset, nextTurnIndex: startTurnIndex, fingerprint: expectedFingerprint } = parseCursor(sinceCursor);
375
+ const suppliedHandle = options?.handle;
376
+ const fileStat = await (suppliedHandle ? suppliedHandle.stat() : stat(filePath)).catch(() => null);
377
+ if (!fileStat) {
378
+ return;
379
+ }
380
+ // Strictly less than, not <=. size === startOffset is the normal
381
+ // steady-state case (nothing new since the last scan) and must stay
382
+ // silent; only a real shrink - the file got rotated or truncated out
383
+ // from under the cursor - is a bug. Deduped per file: every debounced
384
+ // rescan of a frozen session would otherwise re-alert identically
385
+ // forever.
386
+ if (fileStat.size < startOffset) {
387
+ if (!this.desyncAlerted.has(filePath)) {
388
+ this.desyncAlerted.add(filePath);
389
+ this.warnUnknownLine(`[cursor desync] ${filePath} shrank below its stored cursor (${fileStat.size} < ${startOffset} bytes) - ` +
390
+ 'looks rotated or truncated. Refusing to read until an operator resolves this (see elepha reingest).');
391
+ }
392
+ return;
393
+ }
394
+ if (fileStat.size === startOffset) {
395
+ return;
396
+ }
397
+ const handle = suppliedHandle ?? (await open(filePath, 'r'));
398
+ try {
399
+ // Before trusting startOffset, re-verify the bytes immediately
400
+ // preceding it still match what was fingerprinted when the cursor
401
+ // was set. A rewrite that grows the file (rotation, compaction)
402
+ // passes the size check above but lands the cursor mid-record -
403
+ // this catches it at the cost of one small re-read, not O(file size).
404
+ if (expectedFingerprint !== undefined) {
405
+ const actualFingerprint = await fingerprintWindow(handle, startOffset);
406
+ if (actualFingerprint !== expectedFingerprint) {
407
+ if (!this.desyncAlerted.has(filePath)) {
408
+ this.desyncAlerted.add(filePath);
409
+ this.warnUnknownLine(`[cursor desync] ${filePath} was rewritten: content preceding the stored cursor (offset ${startOffset}) no ` +
410
+ 'longer matches (mismatch on the trailing fingerprint). Refusing to read until an operator resolves this ' +
411
+ '(see elepha reingest).');
412
+ }
413
+ return;
414
+ }
415
+ }
416
+ const sessionId = this.nativeSessionId(filePath);
417
+ let currentCwd;
418
+ let currentSurface;
419
+ let currentBranch;
420
+ // Latches true on a resume-marker line, consumed (and reset) by the
421
+ // next turn boundary - it describes what immediately preceded THAT
422
+ // turn, not a running session-wide state like currentBranch.
423
+ let pendingResumeMarker = false;
424
+ let currentTurn = null;
425
+ let nextTurnIndex = startTurnIndex;
426
+ let pendingChunks = [];
427
+ let pendingBytes = 0;
428
+ let pendingOffset = startOffset;
429
+ let readOffset = startOffset;
430
+ let lastCompleteLineEnd;
431
+ let malformedCompleteRecords = 0;
432
+ const parsedTurn = async (state, endOffset) => {
433
+ const turnIndex = nextTurnIndex++;
434
+ return {
435
+ tool: this.tool,
436
+ sessionId,
437
+ sourcePath: filePath,
438
+ projectPath: state.projectPath ?? '',
439
+ turnIndex,
440
+ startedAt: state.startedAt ?? new Date(0).toISOString(),
441
+ endedAt: state.endedAt ?? state.startedAt ?? new Date(0).toISOString(),
442
+ userMessage: state.userMessageParts.join('\n').trim(),
443
+ aiTitle: state.aiTitle,
444
+ assistantText: state.assistantTextParts.join('\n').trim(),
445
+ toolCalls: state.toolCalls,
446
+ cursor: formatCursor(endOffset, turnIndex + 1, await fingerprintWindow(handle, endOffset)),
447
+ surface: state.surface,
448
+ gitBranch: state.gitBranch,
449
+ hasExternalContent: state.hasExternalContent,
450
+ resumeMarkerBefore: state.resumeMarkerBefore,
451
+ };
452
+ };
453
+ while (readOffset < fileStat.size) {
454
+ if (options?.signal?.aborted) {
455
+ return;
456
+ }
457
+ const chunk = Buffer.alloc(Math.min(TRANSCRIPT_READ_CHUNK_BYTES, fileStat.size - readOffset));
458
+ const { bytesRead } = await handle.read(chunk, 0, chunk.length, readOffset);
459
+ if (bytesRead === 0) {
460
+ break;
461
+ }
462
+ const chunkOffset = readOffset;
463
+ readOffset += bytesRead;
464
+ const data = chunk.subarray(0, bytesRead);
465
+ let lineStart = 0;
466
+ for (;;) {
467
+ const newline = data.indexOf(NEWLINE, lineStart);
468
+ if (newline === -1) {
469
+ const tail = data.subarray(lineStart);
470
+ if (pendingBytes + tail.length > MAX_TRANSCRIPT_RECORD_BYTES) {
471
+ throw new OversizedTranscriptRecordError();
472
+ }
473
+ if (tail.length > 0) {
474
+ pendingChunks.push(tail);
475
+ pendingBytes += tail.length;
476
+ }
477
+ break;
478
+ }
479
+ const lineTail = data.subarray(lineStart, newline);
480
+ const recordBytes = pendingBytes + lineTail.length;
481
+ if (recordBytes > MAX_TRANSCRIPT_RECORD_BYTES) {
482
+ throw new OversizedTranscriptRecordError();
483
+ }
484
+ const line = {
485
+ text: pendingChunks.length === 0
486
+ ? data.toString('utf8', lineStart, newline)
487
+ : Buffer.concat(lineTail.length === 0 ? pendingChunks : [...pendingChunks, lineTail], recordBytes).toString('utf8'),
488
+ byteStart: pendingOffset,
489
+ byteEnd: chunkOffset + newline + 1,
490
+ };
491
+ lineStart = newline + 1;
492
+ pendingChunks = [];
493
+ pendingBytes = 0;
494
+ pendingOffset = line.byteEnd;
495
+ lastCompleteLineEnd = line.byteEnd;
496
+ if (options?.signal?.aborted) {
497
+ return;
498
+ }
499
+ let parsed;
500
+ try {
501
+ parsed = JSON.parse(line.text);
502
+ }
503
+ catch {
504
+ // The newline proves this is a complete record rather than
505
+ // a normal partial tail that may finish on the next scan.
506
+ // Keep consuming it: refusing to advance would let one
507
+ // permanently malformed record stall all future ingestion.
508
+ malformedCompleteRecords++;
509
+ continue;
510
+ }
511
+ const cwd = this.cwdOf(parsed);
512
+ if (cwd) {
513
+ currentCwd = cwd;
514
+ }
515
+ const surface = this.surfaceOf(parsed);
516
+ if (surface) {
517
+ currentSurface = surface;
518
+ }
519
+ const branch = this.branchOf(parsed);
520
+ if (branch) {
521
+ currentBranch = branch;
522
+ }
523
+ if (currentTurn && this.isExternalFetchLine(parsed)) {
524
+ currentTurn.hasExternalContent = true;
525
+ }
526
+ if (currentTurn) {
527
+ const aiTitle = this.aiTitleOf(parsed);
528
+ if (aiTitle !== undefined) {
529
+ currentTurn.aiTitle = aiTitle;
530
+ }
531
+ }
532
+ if (this.isResumeMarkerLine(parsed)) {
533
+ pendingResumeMarker = true;
534
+ }
535
+ if (currentTurn) {
536
+ this.observeToolCallState(currentTurn, parsed);
537
+ }
538
+ const cls = this.classify(parsed, filePath);
539
+ if (cls === 'skip') {
540
+ continue;
541
+ }
542
+ if (cls === 'boundary') {
543
+ const closed = currentTurn;
544
+ currentTurn = freshState();
545
+ currentTurn.resumeMarkerBefore = pendingResumeMarker;
546
+ pendingResumeMarker = false;
547
+ if (closed && !isEmptyTurn(closed)) {
548
+ const turn = await parsedTurn(closed, line.byteStart);
549
+ if (containsSentinel(turnText(turn))) {
550
+ this.warnUnknownLine(`[elepha] dropped turn ${turn.turnIndex} of ${sessionId}: self-injected content (sentinel)`);
551
+ yield { ...turn, droppedReason: 'sentinel' };
552
+ }
553
+ else {
554
+ yield turn;
555
+ }
556
+ }
557
+ }
558
+ if (!currentTurn) {
559
+ continue;
560
+ } // content line before any boundary ever seen - drop
561
+ currentTurn.projectPath = currentCwd;
562
+ currentTurn.surface = currentSurface;
563
+ currentTurn.gitBranch = currentBranch;
564
+ const ts = this.timestampOf(parsed);
565
+ if (ts) {
566
+ const normalized = normalizeTimestamp(ts);
567
+ if (!currentTurn.startedAt) {
568
+ currentTurn.startedAt = normalized;
569
+ }
570
+ currentTurn.endedAt = normalized;
571
+ }
572
+ this.fold(currentTurn, parsed);
573
+ }
574
+ }
575
+ if (malformedCompleteRecords > 0) {
576
+ this.warnUnknownLine(malformedCompleteRecordsDiagnostic(filePath, malformedCompleteRecords));
577
+ }
578
+ if (currentTurn &&
579
+ lastCompleteLineEnd !== undefined &&
580
+ options?.closeTrailingOnIdle &&
581
+ hasAssistantContribution(currentTurn) &&
582
+ currentTurn.openToolCallIds.size === 0) {
583
+ const turn = await parsedTurn(currentTurn, lastCompleteLineEnd);
584
+ if (containsSentinel(turnText(turn))) {
585
+ this.warnUnknownLine(`[elepha] dropped turn ${turn.turnIndex} of ${sessionId}: self-injected content (sentinel)`);
586
+ yield { ...turn, droppedReason: 'sentinel' };
587
+ }
588
+ else {
589
+ yield turn;
590
+ }
591
+ }
592
+ }
593
+ finally {
594
+ if (!suppliedHandle) {
595
+ await handle.close();
596
+ }
597
+ }
598
+ }
599
+ }
600
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"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"}