@viewportai/daemon 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 (350) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +157 -0
  3. package/bin/vpd.js +3 -0
  4. package/dist/adapters/claude.d.ts +119 -0
  5. package/dist/adapters/claude.d.ts.map +1 -0
  6. package/dist/adapters/claude.js +621 -0
  7. package/dist/adapters/claude.js.map +1 -0
  8. package/dist/adapters/codex-event-normalizers.d.ts +10 -0
  9. package/dist/adapters/codex-event-normalizers.d.ts.map +1 -0
  10. package/dist/adapters/codex-event-normalizers.js +208 -0
  11. package/dist/adapters/codex-event-normalizers.js.map +1 -0
  12. package/dist/adapters/codex-sdk-loader.d.ts +47 -0
  13. package/dist/adapters/codex-sdk-loader.d.ts.map +1 -0
  14. package/dist/adapters/codex-sdk-loader.js +19 -0
  15. package/dist/adapters/codex-sdk-loader.js.map +1 -0
  16. package/dist/adapters/codex.d.ts +56 -0
  17. package/dist/adapters/codex.d.ts.map +1 -0
  18. package/dist/adapters/codex.js +267 -0
  19. package/dist/adapters/codex.js.map +1 -0
  20. package/dist/adapters/gemini-cli.d.ts +49 -0
  21. package/dist/adapters/gemini-cli.d.ts.map +1 -0
  22. package/dist/adapters/gemini-cli.js +181 -0
  23. package/dist/adapters/gemini-cli.js.map +1 -0
  24. package/dist/adapters/pty.d.ts +56 -0
  25. package/dist/adapters/pty.d.ts.map +1 -0
  26. package/dist/adapters/pty.js +223 -0
  27. package/dist/adapters/pty.js.map +1 -0
  28. package/dist/agents/aider.d.ts +9 -0
  29. package/dist/agents/aider.d.ts.map +1 -0
  30. package/dist/agents/aider.js +37 -0
  31. package/dist/agents/aider.js.map +1 -0
  32. package/dist/agents/built-in.d.ts +4 -0
  33. package/dist/agents/built-in.d.ts.map +1 -0
  34. package/dist/agents/built-in.js +6 -0
  35. package/dist/agents/built-in.js.map +1 -0
  36. package/dist/agents/claude.d.ts +12 -0
  37. package/dist/agents/claude.d.ts.map +1 -0
  38. package/dist/agents/claude.js +93 -0
  39. package/dist/agents/claude.js.map +1 -0
  40. package/dist/agents/codex.d.ts +6 -0
  41. package/dist/agents/codex.d.ts.map +1 -0
  42. package/dist/agents/codex.js +64 -0
  43. package/dist/agents/codex.js.map +1 -0
  44. package/dist/agents/command-detection.d.ts +6 -0
  45. package/dist/agents/command-detection.d.ts.map +1 -0
  46. package/dist/agents/command-detection.js +12 -0
  47. package/dist/agents/command-detection.js.map +1 -0
  48. package/dist/agents/gemini.d.ts +6 -0
  49. package/dist/agents/gemini.d.ts.map +1 -0
  50. package/dist/agents/gemini.js +36 -0
  51. package/dist/agents/gemini.js.map +1 -0
  52. package/dist/cli/agent-commands.d.ts +2 -0
  53. package/dist/cli/agent-commands.d.ts.map +1 -0
  54. package/dist/cli/agent-commands.js +87 -0
  55. package/dist/cli/agent-commands.js.map +1 -0
  56. package/dist/cli/args.d.ts +9 -0
  57. package/dist/cli/args.d.ts.map +1 -0
  58. package/dist/cli/args.js +34 -0
  59. package/dist/cli/args.js.map +1 -0
  60. package/dist/cli/command-shared.d.ts +53 -0
  61. package/dist/cli/command-shared.d.ts.map +1 -0
  62. package/dist/cli/command-shared.js +239 -0
  63. package/dist/cli/command-shared.js.map +1 -0
  64. package/dist/cli/commands.d.ts +20 -0
  65. package/dist/cli/commands.d.ts.map +1 -0
  66. package/dist/cli/commands.js +20 -0
  67. package/dist/cli/commands.js.map +1 -0
  68. package/dist/cli/daemon-client.d.ts +30 -0
  69. package/dist/cli/daemon-client.d.ts.map +1 -0
  70. package/dist/cli/daemon-client.js +161 -0
  71. package/dist/cli/daemon-client.js.map +1 -0
  72. package/dist/cli/daemon-lifecycle.d.ts +47 -0
  73. package/dist/cli/daemon-lifecycle.d.ts.map +1 -0
  74. package/dist/cli/daemon-lifecycle.js +262 -0
  75. package/dist/cli/daemon-lifecycle.js.map +1 -0
  76. package/dist/cli/daemon-settings.d.ts +9 -0
  77. package/dist/cli/daemon-settings.d.ts.map +1 -0
  78. package/dist/cli/daemon-settings.js +168 -0
  79. package/dist/cli/daemon-settings.js.map +1 -0
  80. package/dist/cli/directory-commands.d.ts +4 -0
  81. package/dist/cli/directory-commands.d.ts.map +1 -0
  82. package/dist/cli/directory-commands.js +190 -0
  83. package/dist/cli/directory-commands.js.map +1 -0
  84. package/dist/cli/hook-command.d.ts +14 -0
  85. package/dist/cli/hook-command.d.ts.map +1 -0
  86. package/dist/cli/hook-command.js +96 -0
  87. package/dist/cli/hook-command.js.map +1 -0
  88. package/dist/cli/install-command.d.ts +2 -0
  89. package/dist/cli/install-command.d.ts.map +1 -0
  90. package/dist/cli/install-command.js +91 -0
  91. package/dist/cli/install-command.js.map +1 -0
  92. package/dist/cli/lifecycle-commands.d.ts +10 -0
  93. package/dist/cli/lifecycle-commands.d.ts.map +1 -0
  94. package/dist/cli/lifecycle-commands.js +524 -0
  95. package/dist/cli/lifecycle-commands.js.map +1 -0
  96. package/dist/cli/listen-target.d.ts +13 -0
  97. package/dist/cli/listen-target.d.ts.map +1 -0
  98. package/dist/cli/listen-target.js +102 -0
  99. package/dist/cli/listen-target.js.map +1 -0
  100. package/dist/cli/orchestration-commands.d.ts +8 -0
  101. package/dist/cli/orchestration-commands.d.ts.map +1 -0
  102. package/dist/cli/orchestration-commands.js +340 -0
  103. package/dist/cli/orchestration-commands.js.map +1 -0
  104. package/dist/cli/permission-commands.d.ts +2 -0
  105. package/dist/cli/permission-commands.d.ts.map +1 -0
  106. package/dist/cli/permission-commands.js +138 -0
  107. package/dist/cli/permission-commands.js.map +1 -0
  108. package/dist/cli/runtime-toolchain.d.ts +35 -0
  109. package/dist/cli/runtime-toolchain.d.ts.map +1 -0
  110. package/dist/cli/runtime-toolchain.js +184 -0
  111. package/dist/cli/runtime-toolchain.js.map +1 -0
  112. package/dist/cli/service-commands.d.ts +19 -0
  113. package/dist/cli/service-commands.d.ts.map +1 -0
  114. package/dist/cli/service-commands.js +273 -0
  115. package/dist/cli/service-commands.js.map +1 -0
  116. package/dist/cli/session-commands.d.ts +3 -0
  117. package/dist/cli/session-commands.d.ts.map +1 -0
  118. package/dist/cli/session-commands.js +146 -0
  119. package/dist/cli/session-commands.js.map +1 -0
  120. package/dist/cli/setup-command.d.ts +12 -0
  121. package/dist/cli/setup-command.d.ts.map +1 -0
  122. package/dist/cli/setup-command.js +223 -0
  123. package/dist/cli/setup-command.js.map +1 -0
  124. package/dist/cli/supervisor-protocol.d.ts +20 -0
  125. package/dist/cli/supervisor-protocol.d.ts.map +1 -0
  126. package/dist/cli/supervisor-protocol.js +5 -0
  127. package/dist/cli/supervisor-protocol.js.map +1 -0
  128. package/dist/cli/supervisor.d.ts +10 -0
  129. package/dist/cli/supervisor.d.ts.map +1 -0
  130. package/dist/cli/supervisor.js +218 -0
  131. package/dist/cli/supervisor.js.map +1 -0
  132. package/dist/cli/worktree-commands.d.ts +2 -0
  133. package/dist/cli/worktree-commands.d.ts.map +1 -0
  134. package/dist/cli/worktree-commands.js +250 -0
  135. package/dist/cli/worktree-commands.js.map +1 -0
  136. package/dist/cli/ws-client.d.ts +20 -0
  137. package/dist/cli/ws-client.d.ts.map +1 -0
  138. package/dist/cli/ws-client.js +103 -0
  139. package/dist/cli/ws-client.js.map +1 -0
  140. package/dist/core/agent-registry.d.ts +128 -0
  141. package/dist/core/agent-registry.d.ts.map +1 -0
  142. package/dist/core/agent-registry.js +131 -0
  143. package/dist/core/agent-registry.js.map +1 -0
  144. package/dist/core/config-schema.d.ts +77 -0
  145. package/dist/core/config-schema.d.ts.map +1 -0
  146. package/dist/core/config-schema.js +66 -0
  147. package/dist/core/config-schema.js.map +1 -0
  148. package/dist/core/config.d.ts +111 -0
  149. package/dist/core/config.d.ts.map +1 -0
  150. package/dist/core/config.js +244 -0
  151. package/dist/core/config.js.map +1 -0
  152. package/dist/core/daemon.d.ts +113 -0
  153. package/dist/core/daemon.d.ts.map +1 -0
  154. package/dist/core/daemon.js +197 -0
  155. package/dist/core/daemon.js.map +1 -0
  156. package/dist/core/discovered-sessions.d.ts +7 -0
  157. package/dist/core/discovered-sessions.d.ts.map +1 -0
  158. package/dist/core/discovered-sessions.js +39 -0
  159. package/dist/core/discovered-sessions.js.map +1 -0
  160. package/dist/core/error-codes.d.ts +31 -0
  161. package/dist/core/error-codes.d.ts.map +1 -0
  162. package/dist/core/error-codes.js +30 -0
  163. package/dist/core/error-codes.js.map +1 -0
  164. package/dist/core/errors.d.ts +16 -0
  165. package/dist/core/errors.d.ts.map +1 -0
  166. package/dist/core/errors.js +43 -0
  167. package/dist/core/errors.js.map +1 -0
  168. package/dist/core/events.d.ts +183 -0
  169. package/dist/core/events.d.ts.map +1 -0
  170. package/dist/core/events.js +61 -0
  171. package/dist/core/events.js.map +1 -0
  172. package/dist/core/interfaces.d.ts +115 -0
  173. package/dist/core/interfaces.d.ts.map +1 -0
  174. package/dist/core/interfaces.js +9 -0
  175. package/dist/core/interfaces.js.map +1 -0
  176. package/dist/core/logger.d.ts +11 -0
  177. package/dist/core/logger.d.ts.map +1 -0
  178. package/dist/core/logger.js +17 -0
  179. package/dist/core/logger.js.map +1 -0
  180. package/dist/core/metrics.d.ts +24 -0
  181. package/dist/core/metrics.d.ts.map +1 -0
  182. package/dist/core/metrics.js +32 -0
  183. package/dist/core/metrics.js.map +1 -0
  184. package/dist/core/output.d.ts +13 -0
  185. package/dist/core/output.d.ts.map +1 -0
  186. package/dist/core/output.js +22 -0
  187. package/dist/core/output.js.map +1 -0
  188. package/dist/core/permission-coordinator.d.ts +67 -0
  189. package/dist/core/permission-coordinator.d.ts.map +1 -0
  190. package/dist/core/permission-coordinator.js +209 -0
  191. package/dist/core/permission-coordinator.js.map +1 -0
  192. package/dist/core/session-manager.d.ts +121 -0
  193. package/dist/core/session-manager.d.ts.map +1 -0
  194. package/dist/core/session-manager.js +354 -0
  195. package/dist/core/session-manager.js.map +1 -0
  196. package/dist/core/session-state-file.d.ts +20 -0
  197. package/dist/core/session-state-file.d.ts.map +1 -0
  198. package/dist/core/session-state-file.js +49 -0
  199. package/dist/core/session-state-file.js.map +1 -0
  200. package/dist/core/types.d.ts +250 -0
  201. package/dist/core/types.d.ts.map +1 -0
  202. package/dist/core/types.js +88 -0
  203. package/dist/core/types.js.map +1 -0
  204. package/dist/directories/manager.d.ts +32 -0
  205. package/dist/directories/manager.d.ts.map +1 -0
  206. package/dist/directories/manager.js +86 -0
  207. package/dist/directories/manager.js.map +1 -0
  208. package/dist/discovery/claude.d.ts +29 -0
  209. package/dist/discovery/claude.d.ts.map +1 -0
  210. package/dist/discovery/claude.js +55 -0
  211. package/dist/discovery/claude.js.map +1 -0
  212. package/dist/discovery/codex.d.ts +11 -0
  213. package/dist/discovery/codex.d.ts.map +1 -0
  214. package/dist/discovery/codex.js +365 -0
  215. package/dist/discovery/codex.js.map +1 -0
  216. package/dist/discovery/gemini.d.ts +15 -0
  217. package/dist/discovery/gemini.d.ts.map +1 -0
  218. package/dist/discovery/gemini.js +151 -0
  219. package/dist/discovery/gemini.js.map +1 -0
  220. package/dist/discovery/jsonl-reader.d.ts +122 -0
  221. package/dist/discovery/jsonl-reader.d.ts.map +1 -0
  222. package/dist/discovery/jsonl-reader.js +622 -0
  223. package/dist/discovery/jsonl-reader.js.map +1 -0
  224. package/dist/discovery/watcher.d.ts +29 -0
  225. package/dist/discovery/watcher.d.ts.map +1 -0
  226. package/dist/discovery/watcher.js +383 -0
  227. package/dist/discovery/watcher.js.map +1 -0
  228. package/dist/hooks/index.d.ts +10 -0
  229. package/dist/hooks/index.d.ts.map +1 -0
  230. package/dist/hooks/index.js +8 -0
  231. package/dist/hooks/index.js.map +1 -0
  232. package/dist/hooks/installers/base.d.ts +27 -0
  233. package/dist/hooks/installers/base.d.ts.map +1 -0
  234. package/dist/hooks/installers/base.js +9 -0
  235. package/dist/hooks/installers/base.js.map +1 -0
  236. package/dist/hooks/installers/claude.d.ts +18 -0
  237. package/dist/hooks/installers/claude.d.ts.map +1 -0
  238. package/dist/hooks/installers/claude.js +120 -0
  239. package/dist/hooks/installers/claude.js.map +1 -0
  240. package/dist/hooks/router.d.ts +63 -0
  241. package/dist/hooks/router.d.ts.map +1 -0
  242. package/dist/hooks/router.js +259 -0
  243. package/dist/hooks/router.js.map +1 -0
  244. package/dist/hooks/supervision.d.ts +27 -0
  245. package/dist/hooks/supervision.d.ts.map +1 -0
  246. package/dist/hooks/supervision.js +67 -0
  247. package/dist/hooks/supervision.js.map +1 -0
  248. package/dist/hooks/types.d.ts +171 -0
  249. package/dist/hooks/types.d.ts.map +1 -0
  250. package/dist/hooks/types.js +148 -0
  251. package/dist/hooks/types.js.map +1 -0
  252. package/dist/index.d.ts +17 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +117 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/permissions/engine.d.ts +23 -0
  257. package/dist/permissions/engine.d.ts.map +1 -0
  258. package/dist/permissions/engine.js +43 -0
  259. package/dist/permissions/engine.js.map +1 -0
  260. package/dist/plugins/loader.d.ts +44 -0
  261. package/dist/plugins/loader.d.ts.map +1 -0
  262. package/dist/plugins/loader.js +177 -0
  263. package/dist/plugins/loader.js.map +1 -0
  264. package/dist/server/auth.d.ts +32 -0
  265. package/dist/server/auth.d.ts.map +1 -0
  266. package/dist/server/auth.js +78 -0
  267. package/dist/server/auth.js.map +1 -0
  268. package/dist/server/discovered-watch-key.d.ts +5 -0
  269. package/dist/server/discovered-watch-key.d.ts.map +1 -0
  270. package/dist/server/discovered-watch-key.js +31 -0
  271. package/dist/server/discovered-watch-key.js.map +1 -0
  272. package/dist/server/hello-builder.d.ts +17 -0
  273. package/dist/server/hello-builder.d.ts.map +1 -0
  274. package/dist/server/hello-builder.js +71 -0
  275. package/dist/server/hello-builder.js.map +1 -0
  276. package/dist/server/http-server.d.ts +30 -0
  277. package/dist/server/http-server.d.ts.map +1 -0
  278. package/dist/server/http-server.js +561 -0
  279. package/dist/server/http-server.js.map +1 -0
  280. package/dist/server/message-normalizers.d.ts +11 -0
  281. package/dist/server/message-normalizers.d.ts.map +1 -0
  282. package/dist/server/message-normalizers.js +104 -0
  283. package/dist/server/message-normalizers.js.map +1 -0
  284. package/dist/server/pairing-offers.d.ts +78 -0
  285. package/dist/server/pairing-offers.d.ts.map +1 -0
  286. package/dist/server/pairing-offers.js +502 -0
  287. package/dist/server/pairing-offers.js.map +1 -0
  288. package/dist/server/rate-limiter.d.ts +21 -0
  289. package/dist/server/rate-limiter.d.ts.map +1 -0
  290. package/dist/server/rate-limiter.js +61 -0
  291. package/dist/server/rate-limiter.js.map +1 -0
  292. package/dist/server/ring-buffer.d.ts +34 -0
  293. package/dist/server/ring-buffer.d.ts.map +1 -0
  294. package/dist/server/ring-buffer.js +73 -0
  295. package/dist/server/ring-buffer.js.map +1 -0
  296. package/dist/server/security.d.ts +22 -0
  297. package/dist/server/security.d.ts.map +1 -0
  298. package/dist/server/security.js +123 -0
  299. package/dist/server/security.js.map +1 -0
  300. package/dist/server/ws-command-handlers.d.ts +25 -0
  301. package/dist/server/ws-command-handlers.d.ts.map +1 -0
  302. package/dist/server/ws-command-handlers.js +218 -0
  303. package/dist/server/ws-command-handlers.js.map +1 -0
  304. package/dist/server/ws-daemon-event-bridge.d.ts +22 -0
  305. package/dist/server/ws-daemon-event-bridge.d.ts.map +1 -0
  306. package/dist/server/ws-daemon-event-bridge.js +321 -0
  307. package/dist/server/ws-daemon-event-bridge.js.map +1 -0
  308. package/dist/server/ws-limits.d.ts +2 -0
  309. package/dist/server/ws-limits.d.ts.map +1 -0
  310. package/dist/server/ws-limits.js +12 -0
  311. package/dist/server/ws-limits.js.map +1 -0
  312. package/dist/server/ws-protocol.d.ts +248 -0
  313. package/dist/server/ws-protocol.d.ts.map +1 -0
  314. package/dist/server/ws-protocol.js +157 -0
  315. package/dist/server/ws-protocol.js.map +1 -0
  316. package/dist/server/ws-server.d.ts +26 -0
  317. package/dist/server/ws-server.d.ts.map +1 -0
  318. package/dist/server/ws-server.js +290 -0
  319. package/dist/server/ws-server.js.map +1 -0
  320. package/dist/startup-agents.d.ts +6 -0
  321. package/dist/startup-agents.d.ts.map +1 -0
  322. package/dist/startup-agents.js +97 -0
  323. package/dist/startup-agents.js.map +1 -0
  324. package/dist/startup-prereqs.d.ts +29 -0
  325. package/dist/startup-prereqs.d.ts.map +1 -0
  326. package/dist/startup-prereqs.js +209 -0
  327. package/dist/startup-prereqs.js.map +1 -0
  328. package/dist/startup-watchers.d.ts +7 -0
  329. package/dist/startup-watchers.d.ts.map +1 -0
  330. package/dist/startup-watchers.js +196 -0
  331. package/dist/startup-watchers.js.map +1 -0
  332. package/dist/startup.d.ts +20 -0
  333. package/dist/startup.d.ts.map +1 -0
  334. package/dist/startup.js +335 -0
  335. package/dist/startup.js.map +1 -0
  336. package/dist/tracking/git-tracker.d.ts +52 -0
  337. package/dist/tracking/git-tracker.d.ts.map +1 -0
  338. package/dist/tracking/git-tracker.js +277 -0
  339. package/dist/tracking/git-tracker.js.map +1 -0
  340. package/dist/tracking/noop-tracker.d.ts +27 -0
  341. package/dist/tracking/noop-tracker.d.ts.map +1 -0
  342. package/dist/tracking/noop-tracker.js +42 -0
  343. package/dist/tracking/noop-tracker.js.map +1 -0
  344. package/docs/configuration.md +75 -0
  345. package/docs/developer-workflows.md +107 -0
  346. package/docs/protocol-matrix.json +155 -0
  347. package/docs/releasing.md +65 -0
  348. package/docs/security.md +48 -0
  349. package/docs/testing.md +112 -0
  350. package/package.json +84 -0
@@ -0,0 +1,622 @@
1
+ /**
2
+ * JSONL session reader — reads Claude Code session files from ~/.claude/projects/.
3
+ *
4
+ * Claude Code stores conversation history as JSONL files:
5
+ * ~/.claude/projects/{encoded-path}/{session-id}.jsonl
6
+ *
7
+ * Each line is a JSON object with a `type` field:
8
+ * - 'user' — user message (message.content is text or content blocks)
9
+ * - 'assistant' — agent message (message.content is text or content blocks)
10
+ * - 'progress' — tool progress events
11
+ * - 'system' — system events
12
+ * - 'file-history-snapshot' — file state snapshots
13
+ *
14
+ * Each line also carries: sessionId, cwd, timestamp, uuid, parentUuid.
15
+ */
16
+ import fs from 'node:fs/promises';
17
+ import path from 'node:path';
18
+ import os from 'node:os';
19
+ import { createReadStream } from 'node:fs';
20
+ import { createInterface } from 'node:readline';
21
+ // ---------------------------------------------------------------------------
22
+ // Path encoding (matches Claude Code's directory naming)
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Decode a Claude Code project directory name back to a filesystem path.
26
+ * Claude-style encoding:
27
+ * '/' -> '-'
28
+ * '-' -> '--'
29
+ * Example: /Users/dev-user/my-project -> -Users-dev--user-my--project
30
+ */
31
+ export function decodeProjectDir(dirName) {
32
+ const hasLeadingSlash = dirName.startsWith('-');
33
+ const source = hasLeadingSlash ? dirName.slice(1) : dirName;
34
+ let decoded = '';
35
+ for (let i = 0; i < source.length; i += 1) {
36
+ const ch = source[i];
37
+ if (ch !== '-') {
38
+ decoded += ch;
39
+ continue;
40
+ }
41
+ const next = source[i + 1];
42
+ if (next === '-') {
43
+ decoded += '-';
44
+ i += 1;
45
+ }
46
+ else {
47
+ decoded += '/';
48
+ }
49
+ }
50
+ return hasLeadingSlash ? `/${decoded}` : decoded;
51
+ }
52
+ /**
53
+ * Encode a filesystem path to a Claude Code project directory name.
54
+ * '/' -> '-'
55
+ * '-' -> '--'
56
+ */
57
+ export function encodeProjectDir(fsPath) {
58
+ const normalized = path.resolve(fsPath);
59
+ let encoded = '';
60
+ for (const ch of normalized) {
61
+ if (ch === '/') {
62
+ encoded += '-';
63
+ }
64
+ else if (ch === '-') {
65
+ encoded += '--';
66
+ }
67
+ else {
68
+ encoded += ch;
69
+ }
70
+ }
71
+ return encoded;
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Discovery
75
+ // ---------------------------------------------------------------------------
76
+ /** Path to Claude Code's projects directory. */
77
+ export function claudeProjectsDir() {
78
+ return path.join(os.homedir(), '.claude', 'projects');
79
+ }
80
+ /**
81
+ * List all Claude Code project directories.
82
+ * Returns decoded paths and their encoded directory names.
83
+ */
84
+ export async function listProjects() {
85
+ const projectsDir = claudeProjectsDir();
86
+ try {
87
+ const entries = await fs.readdir(projectsDir, { withFileTypes: true });
88
+ const projects = [];
89
+ for (const entry of entries) {
90
+ if (entry.isDirectory()) {
91
+ const decoded = decodeProjectDir(entry.name);
92
+ // Verify the decoded path exists on disk
93
+ try {
94
+ await fs.access(decoded);
95
+ projects.push({ dirName: entry.name, fsPath: decoded });
96
+ }
97
+ catch {
98
+ // Directory no longer exists on disk, skip
99
+ }
100
+ }
101
+ }
102
+ return projects;
103
+ }
104
+ catch {
105
+ return [];
106
+ }
107
+ }
108
+ /**
109
+ * List sessions for a specific project directory.
110
+ * Reads JSONL files and extracts summary metadata.
111
+ * @param projectDirName - Encoded project directory name
112
+ * @param basePath - Override base path (defaults to ~/.claude/projects/)
113
+ */
114
+ export async function listProjectSessions(projectDirName, basePath) {
115
+ const projectPath = path.join(basePath ?? claudeProjectsDir(), projectDirName);
116
+ try {
117
+ const entries = await fs.readdir(projectPath, { withFileTypes: true });
118
+ const sessions = [];
119
+ for (const entry of entries) {
120
+ // Only process direct .jsonl files (skip subagent directories)
121
+ if (entry.isFile() && entry.name.endsWith('.jsonl')) {
122
+ const sessionId = entry.name.replace('.jsonl', '');
123
+ const filePath = path.join(projectPath, entry.name);
124
+ try {
125
+ const summary = await parseSessionSummary(filePath, sessionId);
126
+ if (summary) {
127
+ sessions.push(summary);
128
+ }
129
+ }
130
+ catch {
131
+ // Skip malformed files
132
+ }
133
+ }
134
+ }
135
+ // Sort by last activity (most recent first)
136
+ sessions.sort((a, b) => {
137
+ const ta = new Date(a.lastActivity).getTime();
138
+ const tb = new Date(b.lastActivity).getTime();
139
+ return tb - ta;
140
+ });
141
+ return sessions;
142
+ }
143
+ catch {
144
+ return [];
145
+ }
146
+ }
147
+ /**
148
+ * Parse a JSONL file to extract session summary metadata.
149
+ * Reads only enough lines to get summary info (not full message content).
150
+ */
151
+ async function parseSessionSummary(filePath, sessionId) {
152
+ let firstUserMessage = '';
153
+ let messageCount = 0;
154
+ let lastTimestamp = '';
155
+ let cwd = '';
156
+ let gitBranch;
157
+ let resumePoisoned = false;
158
+ const rl = createInterface({
159
+ input: createReadStream(filePath, { encoding: 'utf-8' }),
160
+ crlfDelay: Infinity,
161
+ });
162
+ for await (const line of rl) {
163
+ if (!line.trim())
164
+ continue;
165
+ try {
166
+ const entry = JSON.parse(line);
167
+ const type = entry.type;
168
+ // Extract cwd and gitBranch from any line that has them
169
+ if (!cwd && typeof entry.cwd === 'string') {
170
+ cwd = entry.cwd;
171
+ }
172
+ if (!gitBranch && typeof entry.gitBranch === 'string' && entry.gitBranch !== 'HEAD') {
173
+ gitBranch = entry.gitBranch;
174
+ }
175
+ if (type === 'user' || type === 'assistant') {
176
+ messageCount++;
177
+ // Track timestamp
178
+ if (typeof entry.timestamp === 'string') {
179
+ lastTimestamp = entry.timestamp;
180
+ }
181
+ const message = entry.message;
182
+ if (type === 'user' && hasEmptyUserTextBlock(message)) {
183
+ resumePoisoned = true;
184
+ }
185
+ if (type === 'assistant' &&
186
+ entry.isApiErrorMessage === true &&
187
+ isEmptyTextApiErrorMessage(extractTextContent(message))) {
188
+ resumePoisoned = true;
189
+ }
190
+ // Get first user message as summary
191
+ if (type === 'user' && !firstUserMessage) {
192
+ firstUserMessage = extractTextContent(message);
193
+ }
194
+ }
195
+ }
196
+ catch {
197
+ // Skip malformed lines
198
+ }
199
+ }
200
+ if (messageCount === 0)
201
+ return null;
202
+ // Skip sessions with no meaningful user message (e.g. subagent stubs, API errors)
203
+ if (!firstUserMessage.trim())
204
+ return null;
205
+ return {
206
+ sessionId,
207
+ summary: firstUserMessage.slice(0, 120),
208
+ messageCount,
209
+ lastActivity: lastTimestamp || new Date().toISOString(),
210
+ cwd,
211
+ gitBranch,
212
+ resumable: !resumePoisoned,
213
+ };
214
+ }
215
+ /**
216
+ * Read full session messages from a JSONL file.
217
+ * Returns user and assistant messages in order (flat text only).
218
+ * @deprecated Use readSessionMessagesRich() for structured content blocks.
219
+ */
220
+ export async function readSessionMessages(projectDirName, sessionId, basePath) {
221
+ const filePath = path.join(basePath ?? claudeProjectsDir(), projectDirName, `${sessionId}.jsonl`);
222
+ const messages = [];
223
+ const rl = createInterface({
224
+ input: createReadStream(filePath, { encoding: 'utf-8' }),
225
+ crlfDelay: Infinity,
226
+ });
227
+ for await (const line of rl) {
228
+ if (!line.trim())
229
+ continue;
230
+ try {
231
+ const entry = JSON.parse(line);
232
+ const type = entry.type;
233
+ if (type === 'user' || type === 'assistant') {
234
+ const text = extractTextContent(entry.message);
235
+ if (text) {
236
+ messages.push({
237
+ type,
238
+ text,
239
+ timestamp: entry.timestamp || new Date().toISOString(),
240
+ uuid: entry.uuid || '',
241
+ });
242
+ }
243
+ }
244
+ }
245
+ catch {
246
+ // Skip malformed lines
247
+ }
248
+ }
249
+ return messages;
250
+ }
251
+ /**
252
+ * Read full session messages from a JSONL file as structured content blocks.
253
+ * Each content block (text, tool_use, tool_result, thinking) becomes its own
254
+ * RichSessionMessage, preserving the order they appear in the JSONL.
255
+ *
256
+ * Delegates per-entry parsing to parseJSONLEntry().
257
+ */
258
+ export async function readSessionMessagesRich(projectDirName, sessionId, basePath) {
259
+ const filePath = path.join(basePath ?? claudeProjectsDir(), projectDirName, `${sessionId}.jsonl`);
260
+ return readRichSessionMessagesFromFile(filePath);
261
+ }
262
+ /**
263
+ * Read rich session messages from an arbitrary JSONL file path.
264
+ * Supports both Claude JSONL and Codex session JSONL envelope formats.
265
+ */
266
+ export async function readRichSessionMessagesFromFile(filePath) {
267
+ const blocks = [];
268
+ const rl = createInterface({
269
+ input: createReadStream(filePath, { encoding: 'utf-8' }),
270
+ crlfDelay: Infinity,
271
+ });
272
+ for await (const line of rl) {
273
+ if (!line.trim())
274
+ continue;
275
+ try {
276
+ const entry = JSON.parse(line);
277
+ blocks.push(...parseJSONLEntry(entry));
278
+ }
279
+ catch {
280
+ // Skip malformed lines
281
+ }
282
+ }
283
+ return blocks;
284
+ }
285
+ // ---------------------------------------------------------------------------
286
+ // Single-entry parser (used by both readSessionMessagesRich and tail events)
287
+ // ---------------------------------------------------------------------------
288
+ /**
289
+ * Parse a single JSONL entry (already JSON.parsed) into RichSessionMessage blocks.
290
+ * A single entry may produce 0, 1, or many blocks (e.g. an assistant message
291
+ * with text + tool_use + thinking blocks).
292
+ *
293
+ * Extracted from readSessionMessagesRich() so both the full-file reader
294
+ * and the incremental tailer can share the same parsing logic.
295
+ */
296
+ export function parseJSONLEntry(entry) {
297
+ if (typeof entry !== 'object' || entry === null)
298
+ return [];
299
+ const e = entry;
300
+ return parseClaudeEntry(e) ?? parseCodexEntry(e) ?? [];
301
+ }
302
+ function parseClaudeEntry(e) {
303
+ const type = e.type;
304
+ if (type !== 'user' && type !== 'assistant')
305
+ return null;
306
+ const ts = e.timestamp || new Date().toISOString();
307
+ const uuid = e.uuid || '';
308
+ const message = e.message;
309
+ if (!message)
310
+ return [];
311
+ const content = message.content;
312
+ const blocks = [];
313
+ // Simple string content → single text block
314
+ if (typeof content === 'string') {
315
+ if (content) {
316
+ blocks.push({ kind: 'text', role: type, text: content, ts, uuid });
317
+ }
318
+ return blocks;
319
+ }
320
+ if (!Array.isArray(content))
321
+ return blocks;
322
+ for (const block of content) {
323
+ if (typeof block === 'string') {
324
+ if (block) {
325
+ blocks.push({ kind: 'text', role: type, text: block, ts, uuid });
326
+ }
327
+ continue;
328
+ }
329
+ if (typeof block !== 'object' || block === null)
330
+ continue;
331
+ const b = block;
332
+ const blockType = b.type;
333
+ switch (blockType) {
334
+ case 'text':
335
+ if (typeof b.text === 'string' && b.text) {
336
+ blocks.push({ kind: 'text', role: type, text: b.text, ts, uuid });
337
+ }
338
+ break;
339
+ case 'thinking':
340
+ if (typeof b.thinking === 'string' && b.thinking) {
341
+ blocks.push({ kind: 'thinking', text: b.thinking, ts, uuid });
342
+ }
343
+ break;
344
+ case 'tool_use':
345
+ blocks.push({
346
+ kind: 'tool_use',
347
+ toolName: b.name || 'unknown',
348
+ toolId: b.id || '',
349
+ input: typeof b.input === 'object' && b.input !== null
350
+ ? b.input
351
+ : {},
352
+ ts,
353
+ uuid,
354
+ });
355
+ break;
356
+ case 'tool_result': {
357
+ const toolId = b.tool_use_id || '';
358
+ const isError = b.is_error === true;
359
+ const output = extractToolResultContent(b.content);
360
+ blocks.push({ kind: 'tool_result', toolId, output, isError, ts, uuid });
361
+ break;
362
+ }
363
+ }
364
+ }
365
+ return blocks;
366
+ }
367
+ function parseCodexEntry(e) {
368
+ const envelopeType = e.type;
369
+ if (envelopeType !== 'response_item')
370
+ return null;
371
+ const payload = typeof e.payload === 'object' && e.payload !== null
372
+ ? e.payload
373
+ : null;
374
+ if (!payload)
375
+ return [];
376
+ const ts = timestampFromEntry(e, payload);
377
+ const itemType = payload.type;
378
+ if (itemType === 'message') {
379
+ const role = normalizeCodexRole(payload.role);
380
+ const messageBlocks = [];
381
+ const content = payload.content;
382
+ const baseUuid = codexUuid(payload, ts, 'message');
383
+ if (typeof content === 'string') {
384
+ const text = content.trim();
385
+ if (text) {
386
+ messageBlocks.push({ kind: 'text', role, text, ts, uuid: baseUuid });
387
+ }
388
+ return messageBlocks;
389
+ }
390
+ if (!Array.isArray(content))
391
+ return messageBlocks;
392
+ for (let i = 0; i < content.length; i += 1) {
393
+ const item = content[i];
394
+ const itemRec = typeof item === 'object' && item !== null ? item : null;
395
+ const text = extractCodexContentText(itemRec ?? item);
396
+ if (!text)
397
+ continue;
398
+ messageBlocks.push({
399
+ kind: 'text',
400
+ role,
401
+ text,
402
+ ts,
403
+ uuid: `${baseUuid}-${i}`,
404
+ });
405
+ }
406
+ return messageBlocks;
407
+ }
408
+ if (itemType === 'function_call') {
409
+ const toolId = codexToolId(payload);
410
+ const toolName = (typeof payload.name === 'string' && payload.name) ||
411
+ (typeof payload.tool_name === 'string' && payload.tool_name) ||
412
+ 'tool';
413
+ return [
414
+ {
415
+ kind: 'tool_use',
416
+ toolName,
417
+ toolId,
418
+ input: parseCodexFunctionCallInput(payload.arguments),
419
+ ts,
420
+ uuid: codexUuid(payload, ts, 'tool-use'),
421
+ },
422
+ ];
423
+ }
424
+ if (itemType === 'function_call_output') {
425
+ const output = (typeof payload.output === 'string' && payload.output) ||
426
+ (typeof payload.result === 'string' && payload.result) ||
427
+ '';
428
+ return [
429
+ {
430
+ kind: 'tool_result',
431
+ toolId: codexToolId(payload),
432
+ output,
433
+ isError: payload.is_error === true || payload.isError === true,
434
+ ts,
435
+ uuid: codexUuid(payload, ts, 'tool-result'),
436
+ },
437
+ ];
438
+ }
439
+ if (itemType === 'reasoning') {
440
+ const thinking = extractCodexReasoning(payload);
441
+ if (!thinking)
442
+ return [];
443
+ return [
444
+ {
445
+ kind: 'thinking',
446
+ text: thinking,
447
+ ts,
448
+ uuid: codexUuid(payload, ts, 'thinking'),
449
+ },
450
+ ];
451
+ }
452
+ return [];
453
+ }
454
+ // ---------------------------------------------------------------------------
455
+ // Helpers
456
+ // ---------------------------------------------------------------------------
457
+ /**
458
+ * Extract text from a tool_result content field.
459
+ * Content can be a string, an array of text blocks, or absent.
460
+ */
461
+ function extractToolResultContent(content) {
462
+ if (typeof content === 'string')
463
+ return content;
464
+ if (Array.isArray(content)) {
465
+ const parts = [];
466
+ for (const item of content) {
467
+ if (typeof item === 'string') {
468
+ parts.push(item);
469
+ }
470
+ else if (typeof item === 'object' && item !== null) {
471
+ const c = item;
472
+ if (c.type === 'text' && typeof c.text === 'string') {
473
+ parts.push(c.text);
474
+ }
475
+ }
476
+ }
477
+ return parts.join('\n');
478
+ }
479
+ return '';
480
+ }
481
+ function timestampFromEntry(entry, payload) {
482
+ const fromPayload = payload?.timestamp;
483
+ if (typeof fromPayload === 'string' && fromPayload)
484
+ return fromPayload;
485
+ const fromEntry = entry.timestamp;
486
+ if (typeof fromEntry === 'string' && fromEntry)
487
+ return fromEntry;
488
+ return new Date().toISOString();
489
+ }
490
+ function normalizeCodexRole(value) {
491
+ return value === 'user' ? 'user' : 'assistant';
492
+ }
493
+ function codexToolId(payload) {
494
+ const candidates = [payload.call_id, payload.callId, payload.id];
495
+ for (const candidate of candidates) {
496
+ if (typeof candidate === 'string' && candidate)
497
+ return candidate;
498
+ }
499
+ return '';
500
+ }
501
+ function codexUuid(payload, ts, suffix) {
502
+ const candidates = [payload.id, payload.call_id, payload.callId];
503
+ for (const candidate of candidates) {
504
+ if (typeof candidate === 'string' && candidate)
505
+ return candidate;
506
+ }
507
+ return `codex-${suffix}-${ts}`;
508
+ }
509
+ function parseCodexFunctionCallInput(value) {
510
+ if (typeof value === 'object' && value !== null) {
511
+ return value;
512
+ }
513
+ if (typeof value === 'string') {
514
+ try {
515
+ const parsed = JSON.parse(value);
516
+ if (typeof parsed === 'object' && parsed !== null) {
517
+ return parsed;
518
+ }
519
+ }
520
+ catch {
521
+ return {};
522
+ }
523
+ }
524
+ return {};
525
+ }
526
+ function extractCodexContentText(value) {
527
+ if (typeof value === 'string') {
528
+ const trimmed = value.trim();
529
+ return trimmed;
530
+ }
531
+ if (typeof value !== 'object' || value === null)
532
+ return '';
533
+ const rec = value;
534
+ const candidates = [rec.text, rec.output_text, rec.input_text, rec.value, rec.content];
535
+ for (const candidate of candidates) {
536
+ if (typeof candidate === 'string' && candidate.trim())
537
+ return candidate.trim();
538
+ }
539
+ return '';
540
+ }
541
+ function extractCodexReasoning(payload) {
542
+ const summary = payload.summary;
543
+ if (Array.isArray(summary)) {
544
+ const pieces = [];
545
+ for (const item of summary) {
546
+ if (typeof item === 'string' && item.trim()) {
547
+ pieces.push(item.trim());
548
+ continue;
549
+ }
550
+ if (typeof item !== 'object' || item === null)
551
+ continue;
552
+ const rec = item;
553
+ const text = extractCodexContentText(rec);
554
+ if (text)
555
+ pieces.push(text);
556
+ }
557
+ if (pieces.length > 0)
558
+ return pieces.join('\n');
559
+ }
560
+ const fallback = extractCodexContentText(payload);
561
+ return fallback;
562
+ }
563
+ /**
564
+ * Extract text content from a Claude message object.
565
+ * Content can be a string or an array of content blocks.
566
+ */
567
+ function extractTextContent(message) {
568
+ if (!message)
569
+ return '';
570
+ const content = message.content;
571
+ if (typeof content === 'string')
572
+ return content;
573
+ if (Array.isArray(content)) {
574
+ const parts = [];
575
+ for (const block of content) {
576
+ if (typeof block === 'string') {
577
+ parts.push(block);
578
+ }
579
+ else if (typeof block === 'object' && block !== null) {
580
+ const b = block;
581
+ if (b.type === 'text' && typeof b.text === 'string') {
582
+ parts.push(b.text);
583
+ }
584
+ }
585
+ }
586
+ return parts.join('\n');
587
+ }
588
+ return '';
589
+ }
590
+ function hasEmptyUserTextBlock(message) {
591
+ if (!message)
592
+ return false;
593
+ const content = message.content;
594
+ if (typeof content === 'string') {
595
+ return content.trim().length === 0;
596
+ }
597
+ if (!Array.isArray(content)) {
598
+ return false;
599
+ }
600
+ for (const block of content) {
601
+ if (typeof block === 'string') {
602
+ if (block.trim().length === 0)
603
+ return true;
604
+ continue;
605
+ }
606
+ if (typeof block !== 'object' || block === null)
607
+ continue;
608
+ const b = block;
609
+ if (b.type !== 'text')
610
+ continue;
611
+ const text = b.text;
612
+ if (typeof text !== 'string' || text.trim().length === 0) {
613
+ return true;
614
+ }
615
+ }
616
+ return false;
617
+ }
618
+ function isEmptyTextApiErrorMessage(text) {
619
+ return (text.includes('messages: text content blocks must be non-empty') ||
620
+ text.includes('cache_control cannot be set for empty text blocks'));
621
+ }
622
+ //# sourceMappingURL=jsonl-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-reader.js","sourceRoot":"","sources":["../../src/discovery/jsonl-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface WatcherOptions {
2
+ /** Directory to watch (defaults to ~/.claude/projects/). */
3
+ watchDir?: string;
4
+ /** Debounce delay in ms (default: 300). */
5
+ debounceMs?: number;
6
+ /** Watch nested directories recursively. */
7
+ recursive?: boolean;
8
+ /** Emit onFileChanged for JSONL files directly in watchDir. */
9
+ includeTopLevelFiles?: boolean;
10
+ /** Callback when changes are detected. */
11
+ onChange: () => void;
12
+ /** Optional: called with the specific file that changed. */
13
+ onFileChanged?: (filePath: string) => void;
14
+ }
15
+ /**
16
+ * Watch ~/.claude/projects/ for changes.
17
+ * Returns a cleanup function to stop watching.
18
+ */
19
+ export declare function watchProjects(options: WatcherOptions): () => void;
20
+ export interface SessionTailer {
21
+ /** Read new lines since last call. Returns parsed JSON objects. */
22
+ readNew(): Promise<unknown[]>;
23
+ /** Get the session ID (from filename). */
24
+ readonly sessionId: string;
25
+ /** Get the file path. */
26
+ readonly filePath: string;
27
+ }
28
+ export declare function createSessionTailer(filePath: string): SessionTailer;
29
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/discovery/watcher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,IAAI,CAuOjE;AAED,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAwEnE"}