@jacques-ai/core 0.0.7-alpha.1

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 (341) hide show
  1. package/dist/archive/archive-store.d.ts +166 -0
  2. package/dist/archive/archive-store.d.ts.map +1 -0
  3. package/dist/archive/archive-store.js +612 -0
  4. package/dist/archive/archive-store.js.map +1 -0
  5. package/dist/archive/bulk-archive.d.ts +63 -0
  6. package/dist/archive/bulk-archive.d.ts.map +1 -0
  7. package/dist/archive/bulk-archive.js +315 -0
  8. package/dist/archive/bulk-archive.js.map +1 -0
  9. package/dist/archive/filename-utils.d.ts +39 -0
  10. package/dist/archive/filename-utils.d.ts.map +1 -0
  11. package/dist/archive/filename-utils.js +78 -0
  12. package/dist/archive/filename-utils.js.map +1 -0
  13. package/dist/archive/index.d.ts +21 -0
  14. package/dist/archive/index.d.ts.map +1 -0
  15. package/dist/archive/index.js +45 -0
  16. package/dist/archive/index.js.map +1 -0
  17. package/dist/archive/manifest-extractor.d.ts +40 -0
  18. package/dist/archive/manifest-extractor.d.ts.map +1 -0
  19. package/dist/archive/manifest-extractor.js +456 -0
  20. package/dist/archive/manifest-extractor.js.map +1 -0
  21. package/dist/archive/migration.d.ts +59 -0
  22. package/dist/archive/migration.d.ts.map +1 -0
  23. package/dist/archive/migration.js +172 -0
  24. package/dist/archive/migration.js.map +1 -0
  25. package/dist/archive/plan-cataloger.d.ts +24 -0
  26. package/dist/archive/plan-cataloger.d.ts.map +1 -0
  27. package/dist/archive/plan-cataloger.js +100 -0
  28. package/dist/archive/plan-cataloger.js.map +1 -0
  29. package/dist/archive/plan-extractor.d.ts +84 -0
  30. package/dist/archive/plan-extractor.d.ts.map +1 -0
  31. package/dist/archive/plan-extractor.js +371 -0
  32. package/dist/archive/plan-extractor.js.map +1 -0
  33. package/dist/archive/search-indexer.d.ts +50 -0
  34. package/dist/archive/search-indexer.d.ts.map +1 -0
  35. package/dist/archive/search-indexer.js +294 -0
  36. package/dist/archive/search-indexer.js.map +1 -0
  37. package/dist/archive/subagent-store.d.ts +113 -0
  38. package/dist/archive/subagent-store.d.ts.map +1 -0
  39. package/dist/archive/subagent-store.js +173 -0
  40. package/dist/archive/subagent-store.js.map +1 -0
  41. package/dist/archive/types.d.ts +236 -0
  42. package/dist/archive/types.d.ts.map +1 -0
  43. package/dist/archive/types.js +30 -0
  44. package/dist/archive/types.js.map +1 -0
  45. package/dist/branding.d.ts +9 -0
  46. package/dist/branding.d.ts.map +1 -0
  47. package/dist/branding.js +50 -0
  48. package/dist/branding.js.map +1 -0
  49. package/dist/cache/git-utils.d.ts +36 -0
  50. package/dist/cache/git-utils.d.ts.map +1 -0
  51. package/dist/cache/git-utils.js +160 -0
  52. package/dist/cache/git-utils.js.map +1 -0
  53. package/dist/cache/hidden-projects.d.ts +19 -0
  54. package/dist/cache/hidden-projects.d.ts.map +1 -0
  55. package/dist/cache/hidden-projects.js +48 -0
  56. package/dist/cache/hidden-projects.js.map +1 -0
  57. package/dist/cache/index.d.ts +15 -0
  58. package/dist/cache/index.d.ts.map +1 -0
  59. package/dist/cache/index.js +20 -0
  60. package/dist/cache/index.js.map +1 -0
  61. package/dist/cache/metadata-extractor.d.ts +62 -0
  62. package/dist/cache/metadata-extractor.d.ts.map +1 -0
  63. package/dist/cache/metadata-extractor.js +574 -0
  64. package/dist/cache/metadata-extractor.js.map +1 -0
  65. package/dist/cache/mode-detector.d.ts +19 -0
  66. package/dist/cache/mode-detector.d.ts.map +1 -0
  67. package/dist/cache/mode-detector.js +161 -0
  68. package/dist/cache/mode-detector.js.map +1 -0
  69. package/dist/cache/persistence.d.ts +39 -0
  70. package/dist/cache/persistence.d.ts.map +1 -0
  71. package/dist/cache/persistence.js +98 -0
  72. package/dist/cache/persistence.js.map +1 -0
  73. package/dist/cache/project-discovery.d.ts +41 -0
  74. package/dist/cache/project-discovery.d.ts.map +1 -0
  75. package/dist/cache/project-discovery.js +212 -0
  76. package/dist/cache/project-discovery.js.map +1 -0
  77. package/dist/cache/session-index.d.ts +258 -0
  78. package/dist/cache/session-index.d.ts.map +1 -0
  79. package/dist/cache/session-index.js +1030 -0
  80. package/dist/cache/session-index.js.map +1 -0
  81. package/dist/cache/types.d.ts +159 -0
  82. package/dist/cache/types.d.ts.map +1 -0
  83. package/dist/cache/types.js +29 -0
  84. package/dist/cache/types.js.map +1 -0
  85. package/dist/catalog/bulk-extractor.d.ts +18 -0
  86. package/dist/catalog/bulk-extractor.d.ts.map +1 -0
  87. package/dist/catalog/bulk-extractor.js +150 -0
  88. package/dist/catalog/bulk-extractor.js.map +1 -0
  89. package/dist/catalog/extractor.d.ts +53 -0
  90. package/dist/catalog/extractor.d.ts.map +1 -0
  91. package/dist/catalog/extractor.js +522 -0
  92. package/dist/catalog/extractor.js.map +1 -0
  93. package/dist/catalog/index.d.ts +10 -0
  94. package/dist/catalog/index.d.ts.map +1 -0
  95. package/dist/catalog/index.js +11 -0
  96. package/dist/catalog/index.js.map +1 -0
  97. package/dist/catalog/types.d.ts +134 -0
  98. package/dist/catalog/types.d.ts.map +1 -0
  99. package/dist/catalog/types.js +8 -0
  100. package/dist/catalog/types.js.map +1 -0
  101. package/dist/client/index.d.ts +6 -0
  102. package/dist/client/index.d.ts.map +1 -0
  103. package/dist/client/index.js +5 -0
  104. package/dist/client/index.js.map +1 -0
  105. package/dist/client/websocket-client.d.ts +96 -0
  106. package/dist/client/websocket-client.d.ts.map +1 -0
  107. package/dist/client/websocket-client.js +222 -0
  108. package/dist/client/websocket-client.js.map +1 -0
  109. package/dist/context/index.d.ts +13 -0
  110. package/dist/context/index.d.ts.map +1 -0
  111. package/dist/context/index.js +26 -0
  112. package/dist/context/index.js.map +1 -0
  113. package/dist/context/indexer.d.ts +73 -0
  114. package/dist/context/indexer.d.ts.map +1 -0
  115. package/dist/context/indexer.js +233 -0
  116. package/dist/context/indexer.js.map +1 -0
  117. package/dist/context/manager.d.ts +66 -0
  118. package/dist/context/manager.d.ts.map +1 -0
  119. package/dist/context/manager.js +310 -0
  120. package/dist/context/manager.js.map +1 -0
  121. package/dist/context/types.d.ts +149 -0
  122. package/dist/context/types.d.ts.map +1 -0
  123. package/dist/context/types.js +36 -0
  124. package/dist/context/types.js.map +1 -0
  125. package/dist/handoff/catalog.d.ts +54 -0
  126. package/dist/handoff/catalog.d.ts.map +1 -0
  127. package/dist/handoff/catalog.js +121 -0
  128. package/dist/handoff/catalog.js.map +1 -0
  129. package/dist/handoff/generator.d.ts +107 -0
  130. package/dist/handoff/generator.d.ts.map +1 -0
  131. package/dist/handoff/generator.js +603 -0
  132. package/dist/handoff/generator.js.map +1 -0
  133. package/dist/handoff/index.d.ts +13 -0
  134. package/dist/handoff/index.d.ts.map +1 -0
  135. package/dist/handoff/index.js +12 -0
  136. package/dist/handoff/index.js.map +1 -0
  137. package/dist/handoff/llm-generator.d.ts +77 -0
  138. package/dist/handoff/llm-generator.d.ts.map +1 -0
  139. package/dist/handoff/llm-generator.js +513 -0
  140. package/dist/handoff/llm-generator.js.map +1 -0
  141. package/dist/handoff/prompts.d.ts +18 -0
  142. package/dist/handoff/prompts.d.ts.map +1 -0
  143. package/dist/handoff/prompts.js +22 -0
  144. package/dist/handoff/prompts.js.map +1 -0
  145. package/dist/handoff/types.d.ts +28 -0
  146. package/dist/handoff/types.d.ts.map +1 -0
  147. package/dist/handoff/types.js +7 -0
  148. package/dist/handoff/types.js.map +1 -0
  149. package/dist/index.d.ts +56 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +132 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/logging/claude-operations.d.ts +111 -0
  154. package/dist/logging/claude-operations.d.ts.map +1 -0
  155. package/dist/logging/claude-operations.js +132 -0
  156. package/dist/logging/claude-operations.js.map +1 -0
  157. package/dist/logging/error-utils.d.ts +18 -0
  158. package/dist/logging/error-utils.d.ts.map +1 -0
  159. package/dist/logging/error-utils.js +37 -0
  160. package/dist/logging/error-utils.js.map +1 -0
  161. package/dist/logging/index.d.ts +11 -0
  162. package/dist/logging/index.d.ts.map +1 -0
  163. package/dist/logging/index.js +10 -0
  164. package/dist/logging/index.js.map +1 -0
  165. package/dist/logging/logger.d.ts +25 -0
  166. package/dist/logging/logger.d.ts.map +1 -0
  167. package/dist/logging/logger.js +39 -0
  168. package/dist/logging/logger.js.map +1 -0
  169. package/dist/notifications/constants.d.ts +16 -0
  170. package/dist/notifications/constants.d.ts.map +1 -0
  171. package/dist/notifications/constants.js +49 -0
  172. package/dist/notifications/constants.js.map +1 -0
  173. package/dist/notifications/index.d.ts +9 -0
  174. package/dist/notifications/index.d.ts.map +1 -0
  175. package/dist/notifications/index.js +8 -0
  176. package/dist/notifications/index.js.map +1 -0
  177. package/dist/notifications/types.d.ts +28 -0
  178. package/dist/notifications/types.d.ts.map +1 -0
  179. package/dist/notifications/types.js +7 -0
  180. package/dist/notifications/types.js.map +1 -0
  181. package/dist/notifications/utils.d.ts +20 -0
  182. package/dist/notifications/utils.d.ts.map +1 -0
  183. package/dist/notifications/utils.js +37 -0
  184. package/dist/notifications/utils.js.map +1 -0
  185. package/dist/plan/index.d.ts +12 -0
  186. package/dist/plan/index.d.ts.map +1 -0
  187. package/dist/plan/index.js +15 -0
  188. package/dist/plan/index.js.map +1 -0
  189. package/dist/plan/plan-parser.d.ts +33 -0
  190. package/dist/plan/plan-parser.d.ts.map +1 -0
  191. package/dist/plan/plan-parser.js +189 -0
  192. package/dist/plan/plan-parser.js.map +1 -0
  193. package/dist/plan/progress-computer.d.ts +34 -0
  194. package/dist/plan/progress-computer.d.ts.map +1 -0
  195. package/dist/plan/progress-computer.js +211 -0
  196. package/dist/plan/progress-computer.js.map +1 -0
  197. package/dist/plan/progress-matcher.d.ts +34 -0
  198. package/dist/plan/progress-matcher.d.ts.map +1 -0
  199. package/dist/plan/progress-matcher.js +297 -0
  200. package/dist/plan/progress-matcher.js.map +1 -0
  201. package/dist/plan/task-extractor.d.ts +30 -0
  202. package/dist/plan/task-extractor.d.ts.map +1 -0
  203. package/dist/plan/task-extractor.js +435 -0
  204. package/dist/plan/task-extractor.js.map +1 -0
  205. package/dist/plan/types.d.ts +131 -0
  206. package/dist/plan/types.d.ts.map +1 -0
  207. package/dist/plan/types.js +8 -0
  208. package/dist/plan/types.js.map +1 -0
  209. package/dist/project/aggregator.d.ts +43 -0
  210. package/dist/project/aggregator.d.ts.map +1 -0
  211. package/dist/project/aggregator.js +218 -0
  212. package/dist/project/aggregator.js.map +1 -0
  213. package/dist/project/index.d.ts +9 -0
  214. package/dist/project/index.d.ts.map +1 -0
  215. package/dist/project/index.js +9 -0
  216. package/dist/project/index.js.map +1 -0
  217. package/dist/project/types.d.ts +65 -0
  218. package/dist/project/types.d.ts.map +1 -0
  219. package/dist/project/types.js +27 -0
  220. package/dist/project/types.js.map +1 -0
  221. package/dist/session/detector.d.ts +113 -0
  222. package/dist/session/detector.d.ts.map +1 -0
  223. package/dist/session/detector.js +333 -0
  224. package/dist/session/detector.js.map +1 -0
  225. package/dist/session/filters.d.ts +32 -0
  226. package/dist/session/filters.d.ts.map +1 -0
  227. package/dist/session/filters.js +100 -0
  228. package/dist/session/filters.js.map +1 -0
  229. package/dist/session/format-title.d.ts +16 -0
  230. package/dist/session/format-title.d.ts.map +1 -0
  231. package/dist/session/format-title.js +54 -0
  232. package/dist/session/format-title.js.map +1 -0
  233. package/dist/session/index.d.ts +16 -0
  234. package/dist/session/index.d.ts.map +1 -0
  235. package/dist/session/index.js +10 -0
  236. package/dist/session/index.js.map +1 -0
  237. package/dist/session/parser.d.ts +264 -0
  238. package/dist/session/parser.d.ts.map +1 -0
  239. package/dist/session/parser.js +588 -0
  240. package/dist/session/parser.js.map +1 -0
  241. package/dist/session/token-estimator.d.ts +32 -0
  242. package/dist/session/token-estimator.d.ts.map +1 -0
  243. package/dist/session/token-estimator.js +139 -0
  244. package/dist/session/token-estimator.js.map +1 -0
  245. package/dist/session/transformer.d.ts +126 -0
  246. package/dist/session/transformer.d.ts.map +1 -0
  247. package/dist/session/transformer.js +158 -0
  248. package/dist/session/transformer.js.map +1 -0
  249. package/dist/setup/hooks-config.d.ts +35 -0
  250. package/dist/setup/hooks-config.d.ts.map +1 -0
  251. package/dist/setup/hooks-config.js +107 -0
  252. package/dist/setup/hooks-config.js.map +1 -0
  253. package/dist/setup/hooks-symlink.d.ts +17 -0
  254. package/dist/setup/hooks-symlink.d.ts.map +1 -0
  255. package/dist/setup/hooks-symlink.js +89 -0
  256. package/dist/setup/hooks-symlink.js.map +1 -0
  257. package/dist/setup/index.d.ts +13 -0
  258. package/dist/setup/index.d.ts.map +1 -0
  259. package/dist/setup/index.js +12 -0
  260. package/dist/setup/index.js.map +1 -0
  261. package/dist/setup/prerequisites.d.ts +11 -0
  262. package/dist/setup/prerequisites.d.ts.map +1 -0
  263. package/dist/setup/prerequisites.js +72 -0
  264. package/dist/setup/prerequisites.js.map +1 -0
  265. package/dist/setup/settings-merge.d.ts +33 -0
  266. package/dist/setup/settings-merge.d.ts.map +1 -0
  267. package/dist/setup/settings-merge.js +131 -0
  268. package/dist/setup/settings-merge.js.map +1 -0
  269. package/dist/setup/skills-install.d.ts +17 -0
  270. package/dist/setup/skills-install.d.ts.map +1 -0
  271. package/dist/setup/skills-install.js +60 -0
  272. package/dist/setup/skills-install.js.map +1 -0
  273. package/dist/setup/types.d.ts +39 -0
  274. package/dist/setup/types.d.ts.map +1 -0
  275. package/dist/setup/types.js +7 -0
  276. package/dist/setup/types.js.map +1 -0
  277. package/dist/setup/verification.d.ts +9 -0
  278. package/dist/setup/verification.d.ts.map +1 -0
  279. package/dist/setup/verification.js +91 -0
  280. package/dist/setup/verification.js.map +1 -0
  281. package/dist/shortcuts/index.d.ts +8 -0
  282. package/dist/shortcuts/index.d.ts.map +1 -0
  283. package/dist/shortcuts/index.js +6 -0
  284. package/dist/shortcuts/index.js.map +1 -0
  285. package/dist/shortcuts/key-utils.d.ts +54 -0
  286. package/dist/shortcuts/key-utils.d.ts.map +1 -0
  287. package/dist/shortcuts/key-utils.js +129 -0
  288. package/dist/shortcuts/key-utils.js.map +1 -0
  289. package/dist/shortcuts/shortcut-registry.d.ts +37 -0
  290. package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
  291. package/dist/shortcuts/shortcut-registry.js +322 -0
  292. package/dist/shortcuts/shortcut-registry.js.map +1 -0
  293. package/dist/sources/config.d.ts +91 -0
  294. package/dist/sources/config.d.ts.map +1 -0
  295. package/dist/sources/config.js +229 -0
  296. package/dist/sources/config.js.map +1 -0
  297. package/dist/sources/googledocs.d.ts +43 -0
  298. package/dist/sources/googledocs.d.ts.map +1 -0
  299. package/dist/sources/googledocs.js +298 -0
  300. package/dist/sources/googledocs.js.map +1 -0
  301. package/dist/sources/index.d.ts +14 -0
  302. package/dist/sources/index.d.ts.map +1 -0
  303. package/dist/sources/index.js +19 -0
  304. package/dist/sources/index.js.map +1 -0
  305. package/dist/sources/notion.d.ts +35 -0
  306. package/dist/sources/notion.d.ts.map +1 -0
  307. package/dist/sources/notion.js +352 -0
  308. package/dist/sources/notion.js.map +1 -0
  309. package/dist/sources/obsidian.d.ts +38 -0
  310. package/dist/sources/obsidian.d.ts.map +1 -0
  311. package/dist/sources/obsidian.js +228 -0
  312. package/dist/sources/obsidian.js.map +1 -0
  313. package/dist/sources/types.d.ts +133 -0
  314. package/dist/sources/types.d.ts.map +1 -0
  315. package/dist/sources/types.js +19 -0
  316. package/dist/sources/types.js.map +1 -0
  317. package/dist/storage/index.d.ts +6 -0
  318. package/dist/storage/index.d.ts.map +1 -0
  319. package/dist/storage/index.js +5 -0
  320. package/dist/storage/index.js.map +1 -0
  321. package/dist/storage/writer.d.ts +86 -0
  322. package/dist/storage/writer.d.ts.map +1 -0
  323. package/dist/storage/writer.js +137 -0
  324. package/dist/storage/writer.js.map +1 -0
  325. package/dist/types.d.ts +203 -0
  326. package/dist/types.d.ts.map +1 -0
  327. package/dist/types.js +8 -0
  328. package/dist/types.js.map +1 -0
  329. package/dist/utils/claude-token.d.ts +49 -0
  330. package/dist/utils/claude-token.d.ts.map +1 -0
  331. package/dist/utils/claude-token.js +169 -0
  332. package/dist/utils/claude-token.js.map +1 -0
  333. package/dist/utils/index.d.ts +7 -0
  334. package/dist/utils/index.d.ts.map +1 -0
  335. package/dist/utils/index.js +13 -0
  336. package/dist/utils/index.js.map +1 -0
  337. package/dist/utils/settings.d.ts +100 -0
  338. package/dist/utils/settings.d.ts.map +1 -0
  339. package/dist/utils/settings.js +206 -0
  340. package/dist/utils/settings.js.map +1 -0
  341. package/package.json +54 -0
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Session Detector
3
+ *
4
+ * Detects the current Claude Code session JSONL file.
5
+ * Claude Code stores session history at:
6
+ * ~/.claude/projects/[encoded-directory-path]/[session-uuid].jsonl
7
+ *
8
+ * Encoding rule: Replace '/' with '-' (e.g., /Users/gole/Desktop/project → -Users-gole-Desktop-project)
9
+ *
10
+ * IMPORTANT: Claude Code encodes BOTH '/' AND '_' as '-', making naive
11
+ * string-based reversal impossible. Use decodeProjectPath() which reads
12
+ * the authoritative originalPath from sessions-index.json.
13
+ */
14
+ import { promises as fs } from "fs";
15
+ import { getErrorMessage } from "../logging/error-utils.js";
16
+ import { createLogger } from "../logging/logger.js";
17
+ import * as path from "path";
18
+ import { getRootCatalogPath } from "../sources/config.js";
19
+ const logger = createLogger({ prefix: "[Detector]" });
20
+ /**
21
+ * Get the Claude projects directory path.
22
+ *
23
+ * Resolution order:
24
+ * 1. CLAUDE_CONFIG_DIR env var + /projects
25
+ * 2. rootPath from ~/.jacques/config.json + /projects
26
+ * 3. Default: ~/.claude/projects
27
+ *
28
+ * Works cross-platform: macOS, Linux, and Windows.
29
+ */
30
+ export function getClaudeProjectsDir() {
31
+ const envDir = process.env.CLAUDE_CONFIG_DIR;
32
+ if (envDir) {
33
+ return path.join(envDir, "projects");
34
+ }
35
+ return path.join(getRootCatalogPath(), "projects");
36
+ }
37
+ /**
38
+ * Get the Claude settings.json path.
39
+ * Uses the same resolution logic as getClaudeProjectsDir().
40
+ */
41
+ export function getClaudeSettingsPath() {
42
+ const envDir = process.env.CLAUDE_CONFIG_DIR;
43
+ if (envDir) {
44
+ return path.join(envDir, "settings.json");
45
+ }
46
+ return path.join(getRootCatalogPath(), "settings.json");
47
+ }
48
+ /**
49
+ * Encode a directory path to Claude's format.
50
+ * Replaces path separators with '-' (keeps leading dash).
51
+ * Example: /Users/gole/Desktop/project -> -Users-gole-Desktop-project
52
+ *
53
+ * Cross-platform: handles both '/' (Unix) and '\' (Windows) separators.
54
+ * On Windows, also strips the drive letter colon (C:\foo → -C-foo).
55
+ * TODO: verify encoding on actual Windows Claude Code installation
56
+ */
57
+ export function encodeProjectPath(dirPath) {
58
+ // Normalize and convert to forward slashes for consistent encoding
59
+ const normalized = path.normalize(dirPath).replace(/\\/g, "/");
60
+ // Strip drive letter colon on Windows (C:/foo → C/foo)
61
+ const noDriveColon = normalized.replace(/^([A-Za-z]):/, "$1");
62
+ return noDriveColon.replace(/\//g, "-");
63
+ }
64
+ /**
65
+ * Read the originalPath field from a project's sessions-index.json.
66
+ * Claude Code stores the real filesystem path here, which is the only
67
+ * reliable way to reverse the encoded directory name.
68
+ */
69
+ async function readOriginalPath(encodedDir, claudeProjectsDir) {
70
+ const claudeDir = claudeProjectsDir || getClaudeProjectsDir();
71
+ const indexPath = path.join(claudeDir, encodedDir, "sessions-index.json");
72
+ try {
73
+ const content = await fs.readFile(indexPath, "utf-8");
74
+ const data = JSON.parse(content);
75
+ return typeof data.originalPath === "string" ? data.originalPath : null;
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /**
82
+ * Read the cwd field from the first available JSONL entry in a project directory.
83
+ * This provides the real project path when sessions-index.json is unavailable.
84
+ */
85
+ async function readCwdFromJsonl(encodedDir, claudeProjectsDir) {
86
+ const claudeDir = claudeProjectsDir || getClaudeProjectsDir();
87
+ const projectDir = path.join(claudeDir, encodedDir);
88
+ try {
89
+ const entries = await fs.readdir(projectDir);
90
+ const jsonlFile = entries.find((e) => e.endsWith(".jsonl"));
91
+ if (!jsonlFile)
92
+ return null;
93
+ const filePath = path.join(projectDir, jsonlFile);
94
+ const handle = await fs.open(filePath, "r");
95
+ try {
96
+ // Read just enough to get the first few lines (cwd appears early)
97
+ const buf = Buffer.alloc(8192);
98
+ const { bytesRead } = await handle.read(buf, 0, 8192, 0);
99
+ const chunk = buf.toString("utf-8", 0, bytesRead);
100
+ const lines = chunk.split("\n");
101
+ for (const line of lines) {
102
+ if (!line.trim())
103
+ continue;
104
+ try {
105
+ const entry = JSON.parse(line);
106
+ if (typeof entry.cwd === "string") {
107
+ return entry.cwd;
108
+ }
109
+ }
110
+ catch {
111
+ // Partial JSON line, skip
112
+ }
113
+ }
114
+ }
115
+ finally {
116
+ await handle.close();
117
+ }
118
+ }
119
+ catch {
120
+ // Directory unreadable or no JSONL files
121
+ }
122
+ return null;
123
+ }
124
+ /**
125
+ * Naive decode: replace all dashes with slashes.
126
+ * This is WRONG for paths containing dashes or underscores, but serves
127
+ * as a fallback when sessions-index.json is unavailable.
128
+ */
129
+ export function decodeProjectPathNaive(encodedDir) {
130
+ if (!encodedDir.startsWith("-")) {
131
+ return encodedDir;
132
+ }
133
+ return "/" + encodedDir.slice(1).split("-").join("/");
134
+ }
135
+ /**
136
+ * Decode an encoded project directory name to the real filesystem path.
137
+ *
138
+ * Resolution order:
139
+ * 1. sessions-index.json originalPath (authoritative, written by Claude Code)
140
+ * 2. cwd field from first JSONL entry (reliable, written at session start)
141
+ * 3. Naive decode: replace all dashes with slashes (last resort, often wrong)
142
+ */
143
+ export async function decodeProjectPath(encodedDir, claudeProjectsDir) {
144
+ const original = await readOriginalPath(encodedDir, claudeProjectsDir);
145
+ if (original)
146
+ return original;
147
+ const cwdPath = await readCwdFromJsonl(encodedDir, claudeProjectsDir);
148
+ if (cwdPath)
149
+ return cwdPath;
150
+ return decodeProjectPathNaive(encodedDir);
151
+ }
152
+ /**
153
+ * Detect the current Claude session JSONL file.
154
+ * Returns the most recently modified .jsonl file in the project directory.
155
+ */
156
+ export async function detectCurrentSession(options = {}) {
157
+ const cwd = options.cwd || process.cwd();
158
+ const claudeDir = options.claudeProjectsDir || getClaudeProjectsDir();
159
+ // Encode the current directory path
160
+ const encodedPath = encodeProjectPath(cwd);
161
+ const projectDir = path.join(claudeDir, encodedPath);
162
+ try {
163
+ // Check if the project directory exists
164
+ await fs.access(projectDir);
165
+ }
166
+ catch {
167
+ // Project directory doesn't exist - no sessions for this project
168
+ return null;
169
+ }
170
+ try {
171
+ // Read all files in the project directory
172
+ const files = await fs.readdir(projectDir);
173
+ const jsonlFiles = files.filter((f) => f.endsWith(".jsonl"));
174
+ if (jsonlFiles.length === 0) {
175
+ return null;
176
+ }
177
+ // Get stats for all JSONL files
178
+ const fileStats = await Promise.all(jsonlFiles.map(async (filename) => {
179
+ const filePath = path.join(projectDir, filename);
180
+ const stats = await fs.stat(filePath);
181
+ return {
182
+ filePath,
183
+ filename,
184
+ mtime: stats.mtime,
185
+ size: stats.size,
186
+ };
187
+ }));
188
+ // Sort by modification time (most recent first)
189
+ fileStats.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
190
+ // Return the most recent file
191
+ const mostRecent = fileStats[0];
192
+ const sessionId = path.basename(mostRecent.filename, ".jsonl");
193
+ return {
194
+ filePath: mostRecent.filePath,
195
+ sessionId,
196
+ modifiedAt: mostRecent.mtime,
197
+ sizeBytes: mostRecent.size,
198
+ };
199
+ }
200
+ catch (err) {
201
+ logger.error(`Error reading project directory ${projectDir}:`, getErrorMessage(err));
202
+ return null;
203
+ }
204
+ }
205
+ /**
206
+ * List all session files for a project.
207
+ * Returns sessions sorted by modification time (most recent first).
208
+ */
209
+ export async function listProjectSessions(options = {}) {
210
+ const cwd = options.cwd || process.cwd();
211
+ const claudeDir = options.claudeProjectsDir || getClaudeProjectsDir();
212
+ const encodedPath = encodeProjectPath(cwd);
213
+ const projectDir = path.join(claudeDir, encodedPath);
214
+ try {
215
+ await fs.access(projectDir);
216
+ }
217
+ catch {
218
+ return [];
219
+ }
220
+ try {
221
+ const files = await fs.readdir(projectDir);
222
+ const jsonlFiles = files.filter((f) => f.endsWith(".jsonl"));
223
+ const fileStats = await Promise.all(jsonlFiles.map(async (filename) => {
224
+ const filePath = path.join(projectDir, filename);
225
+ const stats = await fs.stat(filePath);
226
+ const sessionId = path.basename(filename, ".jsonl");
227
+ return {
228
+ filePath,
229
+ sessionId,
230
+ modifiedAt: stats.mtime,
231
+ sizeBytes: stats.size,
232
+ };
233
+ }));
234
+ // Sort by modification time (most recent first)
235
+ return fileStats.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());
236
+ }
237
+ catch {
238
+ return [];
239
+ }
240
+ }
241
+ /**
242
+ * Get the expected project directory path for a given working directory.
243
+ * Useful for debugging and testing.
244
+ */
245
+ export function getProjectDirPath(cwd, claudeProjectsDir) {
246
+ const claudeDir = claudeProjectsDir || getClaudeProjectsDir();
247
+ const encodedPath = encodeProjectPath(cwd);
248
+ return path.join(claudeDir, encodedPath);
249
+ }
250
+ /**
251
+ * List all subagent JSONL files for a given session.
252
+ * Claude Code stores subagent conversations in:
253
+ * {session-id}/subagents/agent-{agentId}.jsonl
254
+ *
255
+ * @param sessionFilePath Path to the main session JSONL file
256
+ * @returns Array of subagent files found
257
+ */
258
+ export async function listSubagentFiles(sessionFilePath) {
259
+ // The subagents directory is at {session-id}/subagents/ relative to the session file
260
+ const sessionDir = sessionFilePath.replace(".jsonl", "");
261
+ const subagentsDir = path.join(sessionDir, "subagents");
262
+ try {
263
+ await fs.access(subagentsDir);
264
+ }
265
+ catch {
266
+ // No subagents directory exists for this session
267
+ return [];
268
+ }
269
+ try {
270
+ const files = await fs.readdir(subagentsDir);
271
+ const subagentFiles = [];
272
+ for (const filename of files) {
273
+ // Subagent files are named agent-{agentId}.jsonl
274
+ if (!filename.startsWith("agent-") || !filename.endsWith(".jsonl")) {
275
+ continue;
276
+ }
277
+ const filePath = path.join(subagentsDir, filename);
278
+ const stats = await fs.stat(filePath);
279
+ // Extract agent ID from filename: agent-a0323e0.jsonl -> a0323e0
280
+ const agentId = filename.replace("agent-", "").replace(".jsonl", "");
281
+ subagentFiles.push({
282
+ filePath,
283
+ agentId,
284
+ modifiedAt: stats.mtime,
285
+ sizeBytes: stats.size,
286
+ });
287
+ }
288
+ // Sort by modification time (oldest first, since they were likely created in order)
289
+ return subagentFiles.sort((a, b) => a.modifiedAt.getTime() - b.modifiedAt.getTime());
290
+ }
291
+ catch {
292
+ return [];
293
+ }
294
+ }
295
+ /**
296
+ * Find a session file by session ID across all project directories.
297
+ * This is useful when the cwd is incorrect but we know the session ID.
298
+ */
299
+ export async function findSessionById(sessionId, claudeProjectsDir) {
300
+ const claudeDir = claudeProjectsDir || getClaudeProjectsDir();
301
+ try {
302
+ // List all project directories
303
+ const projectDirs = await fs.readdir(claudeDir);
304
+ for (const projectDir of projectDirs) {
305
+ // Skip hidden files/directories
306
+ if (projectDir.startsWith("."))
307
+ continue;
308
+ const projectPath = path.join(claudeDir, projectDir);
309
+ const stat = await fs.stat(projectPath);
310
+ if (!stat.isDirectory())
311
+ continue;
312
+ // Check if the session file exists in this project
313
+ const sessionFile = path.join(projectPath, `${sessionId}.jsonl`);
314
+ try {
315
+ const fileStat = await fs.stat(sessionFile);
316
+ return {
317
+ filePath: sessionFile,
318
+ sessionId,
319
+ modifiedAt: fileStat.mtime,
320
+ sizeBytes: fileStat.size,
321
+ };
322
+ }
323
+ catch {
324
+ // File doesn't exist in this project, continue
325
+ }
326
+ }
327
+ return null;
328
+ }
329
+ catch {
330
+ return null;
331
+ }
332
+ }
333
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/session/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Context Filters
3
+ *
4
+ * Filtering logic for saving contexts with different levels of detail.
5
+ */
6
+ import type { ParsedEntry } from "./parser.js";
7
+ export declare enum FilterType {
8
+ EVERYTHING = "everything",
9
+ WITHOUT_TOOLS = "without_tools",
10
+ MESSAGES_ONLY = "messages_only"
11
+ }
12
+ export interface FilterConfig {
13
+ type: FilterType;
14
+ label: string;
15
+ suffix: string;
16
+ description: string;
17
+ }
18
+ export declare const FILTER_CONFIGS: Record<FilterType, FilterConfig>;
19
+ /**
20
+ * Check if an entry should be included based on filter type.
21
+ */
22
+ export declare function shouldIncludeEntry(entry: ParsedEntry, filterType: FilterType): boolean;
23
+ /**
24
+ * Clean an entry for "Messages Only" filter.
25
+ * Removes thinking blocks and code blocks from text.
26
+ */
27
+ export declare function cleanForMessagesOnly(entry: ParsedEntry): ParsedEntry;
28
+ /**
29
+ * Apply a filter to a list of entries.
30
+ */
31
+ export declare function applyFilter(entries: ParsedEntry[], filterType: FilterType): ParsedEntry[];
32
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/session/filters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,oBAAY,UAAU;IACpB,UAAU,eAAe;IACzB,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,CAmB3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,UAAU,GACrB,OAAO,CA2BT;AAiBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAgBpE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EAAE,EACtB,UAAU,EAAE,UAAU,GACrB,WAAW,EAAE,CAYf"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Context Filters
3
+ *
4
+ * Filtering logic for saving contexts with different levels of detail.
5
+ */
6
+ export var FilterType;
7
+ (function (FilterType) {
8
+ FilterType["EVERYTHING"] = "everything";
9
+ FilterType["WITHOUT_TOOLS"] = "without_tools";
10
+ FilterType["MESSAGES_ONLY"] = "messages_only";
11
+ })(FilterType || (FilterType = {}));
12
+ export const FILTER_CONFIGS = {
13
+ [FilterType.EVERYTHING]: {
14
+ type: FilterType.EVERYTHING,
15
+ label: "Everything",
16
+ suffix: "_full",
17
+ description: "Full context with all data",
18
+ },
19
+ [FilterType.WITHOUT_TOOLS]: {
20
+ type: FilterType.WITHOUT_TOOLS,
21
+ label: "Without Tools",
22
+ suffix: "_no-tools",
23
+ description: "Remove tool calls and results",
24
+ },
25
+ [FilterType.MESSAGES_ONLY]: {
26
+ type: FilterType.MESSAGES_ONLY,
27
+ label: "Messages Only",
28
+ suffix: "_messages",
29
+ description: "Just conversational text, no code/tools/thinking",
30
+ },
31
+ };
32
+ /**
33
+ * Check if an entry should be included based on filter type.
34
+ */
35
+ export function shouldIncludeEntry(entry, filterType) {
36
+ switch (filterType) {
37
+ case FilterType.EVERYTHING:
38
+ // Include everything
39
+ return true;
40
+ case FilterType.WITHOUT_TOOLS:
41
+ // Exclude tool calls, tool results, and progress events
42
+ if (entry.type === "tool_call" ||
43
+ entry.type === "tool_result" ||
44
+ entry.type === "bash_progress" ||
45
+ entry.type === "mcp_progress") {
46
+ return false;
47
+ }
48
+ return true;
49
+ case FilterType.MESSAGES_ONLY:
50
+ // Only include user and assistant messages
51
+ return (entry.type === "user_message" || entry.type === "assistant_message");
52
+ default:
53
+ return true;
54
+ }
55
+ }
56
+ /**
57
+ * Strip markdown code blocks from text.
58
+ * Removes ```language...``` blocks but keeps inline `code`.
59
+ */
60
+ function stripCodeBlocks(text) {
61
+ if (!text)
62
+ return text;
63
+ // Remove fenced code blocks (```...```)
64
+ // This regex matches:
65
+ // - ``` followed by optional language
66
+ // - Any content (non-greedy)
67
+ // - Closing ```
68
+ return text.replace(/```[\s\S]*?```/g, "[code removed]");
69
+ }
70
+ /**
71
+ * Clean an entry for "Messages Only" filter.
72
+ * Removes thinking blocks and code blocks from text.
73
+ */
74
+ export function cleanForMessagesOnly(entry) {
75
+ // Clone the entry to avoid mutation
76
+ const cloned = {
77
+ ...entry,
78
+ content: { ...entry.content },
79
+ };
80
+ // Remove thinking field
81
+ delete cloned.content.thinking;
82
+ // Strip code blocks from text
83
+ if (cloned.content.text) {
84
+ cloned.content.text = stripCodeBlocks(cloned.content.text);
85
+ }
86
+ return cloned;
87
+ }
88
+ /**
89
+ * Apply a filter to a list of entries.
90
+ */
91
+ export function applyFilter(entries, filterType) {
92
+ // Filter entries based on type
93
+ let filtered = entries.filter((entry) => shouldIncludeEntry(entry, filterType));
94
+ // Clean entries for "Messages Only" filter
95
+ if (filterType === FilterType.MESSAGES_ONLY) {
96
+ filtered = filtered.map((entry) => cleanForMessagesOnly(entry));
97
+ }
98
+ return filtered;
99
+ }
100
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/session/filters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,uCAAyB,CAAA;IACzB,6CAA+B,CAAA;IAC/B,6CAA+B,CAAA;AACjC,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AASD,MAAM,CAAC,MAAM,cAAc,GAAqC;IAC9D,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QACvB,IAAI,EAAE,UAAU,CAAC,UAAU;QAC3B,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,4BAA4B;KAC1C;IACD,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;QAC1B,IAAI,EAAE,UAAU,CAAC,aAAa;QAC9B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,+BAA+B;KAC7C;IACD,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;QAC1B,IAAI,EAAE,UAAU,CAAC,aAAa;QAC9B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,kDAAkD;KAChE;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAkB,EAClB,UAAsB;IAEtB,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC,UAAU;YACxB,qBAAqB;YACrB,OAAO,IAAI,CAAC;QAEd,KAAK,UAAU,CAAC,aAAa;YAC3B,wDAAwD;YACxD,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;gBAC1B,KAAK,CAAC,IAAI,KAAK,aAAa;gBAC5B,KAAK,CAAC,IAAI,KAAK,eAAe;gBAC9B,KAAK,CAAC,IAAI,KAAK,cAAc,EAC7B,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QAEd,KAAK,UAAU,CAAC,aAAa;YAC3B,2CAA2C;YAC3C,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,CACpE,CAAC;QAEJ;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,wCAAwC;IACxC,sBAAsB;IACtB,sCAAsC;IACtC,6BAA6B;IAC7B,gBAAgB;IAChB,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,oCAAoC;IACpC,MAAM,MAAM,GAAgB;QAC1B,GAAG,KAAK;QACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;KAC9B,CAAC;IAEF,wBAAwB;IACxB,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;IAE/B,8BAA8B;IAC9B,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAsB,EACtB,UAAsB;IAEtB,+BAA+B;IAC/B,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CACtC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CACtC,CAAC;IAEF,2CAA2C;IAC3C,IAAI,UAAU,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Format session titles for display.
3
+ * Detects plan-triggered sessions, continue sessions, and extracts clean names.
4
+ *
5
+ * Truncation is applied once at the end to avoid stacking ellipses from
6
+ * multiple upstream sources (Claude Code title truncation, extractPlanTitle).
7
+ */
8
+ export interface FormattedSessionTitle {
9
+ isPlan: boolean;
10
+ isContinue: boolean;
11
+ displayTitle: string;
12
+ }
13
+ /** Detect a jacques-continue skill invocation in the raw title. */
14
+ export declare function isContinueSession(rawTitle: string): boolean;
15
+ export declare function formatSessionTitle(rawTitle: string | null, maxLength?: number): FormattedSessionTitle;
16
+ //# sourceMappingURL=format-title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-title.d.ts","sourceRoot":"","sources":["../../src/session/format-title.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAOD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,qBAAqB,CA2CvB"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Format session titles for display.
3
+ * Detects plan-triggered sessions, continue sessions, and extracts clean names.
4
+ *
5
+ * Truncation is applied once at the end to avoid stacking ellipses from
6
+ * multiple upstream sources (Claude Code title truncation, extractPlanTitle).
7
+ */
8
+ import { PLAN_TRIGGER_PATTERNS, extractPlanTitle } from "../archive/plan-extractor.js";
9
+ /** Prefix used by skill expansions in Claude Code. */
10
+ const SKILL_PREFIX = "Base directory for this skill:";
11
+ /** Detect a jacques-continue skill invocation in the raw title. */
12
+ export function isContinueSession(rawTitle) {
13
+ return rawTitle.startsWith(SKILL_PREFIX) && rawTitle.includes("jacques-continue");
14
+ }
15
+ /** Strip trailing triple-dot or unicode ellipsis added by upstream truncators. */
16
+ function stripTrailingEllipsis(s) {
17
+ return s.replace(/\s*\.{3,}$/, "").replace(/\s*\u2026$/, "").trimEnd();
18
+ }
19
+ export function formatSessionTitle(rawTitle, maxLength) {
20
+ if (!rawTitle)
21
+ return { isPlan: false, isContinue: false, displayTitle: "Untitled" };
22
+ const trimmed = rawTitle.trim();
23
+ if (trimmed.startsWith("<local-command") || trimmed.startsWith("<command-")) {
24
+ return { isPlan: false, isContinue: false, displayTitle: "Active Session" };
25
+ }
26
+ // Detect jacques-continue skill — raw title is the skill instructions,
27
+ // not the handoff content. Show fallback; extractTitle resolves the real title.
28
+ if (isContinueSession(trimmed)) {
29
+ return { isPlan: false, isContinue: true, displayTitle: "Continue Session" };
30
+ }
31
+ let title = rawTitle;
32
+ let isPlan = false;
33
+ for (const pattern of PLAN_TRIGGER_PATTERNS) {
34
+ if (pattern.test(rawTitle)) {
35
+ const cleaned = rawTitle.replace(pattern, "").trim();
36
+ title = extractPlanTitle(cleaned) || "Unnamed Plan";
37
+ isPlan = true;
38
+ break;
39
+ }
40
+ }
41
+ // Titles starting with "Cont: " were resolved by extractTitle from handoff data
42
+ const isContinue = title.startsWith("Cont: ");
43
+ // Collapse newlines to spaces for single-line display
44
+ // (must happen after plan detection — extractPlanTitle needs newlines for headings)
45
+ title = title.replace(/\n+/g, " ").trim();
46
+ // Strip any upstream ellipsis before applying our own truncation
47
+ title = stripTrailingEllipsis(title);
48
+ // Single consistent truncation using … (1 char — more title visible)
49
+ if (maxLength && title.length > maxLength) {
50
+ title = title.slice(0, maxLength - 1) + "\u2026";
51
+ }
52
+ return { isPlan, isContinue, displayTitle: title };
53
+ }
54
+ //# sourceMappingURL=format-title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-title.js","sourceRoot":"","sources":["../../src/session/format-title.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAQvF,sDAAsD;AACtD,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAEtD,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AACpF,CAAC;AAED,kFAAkF;AAClF,SAAS,qBAAqB,CAAC,CAAS;IACtC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,SAAkB;IAElB,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IAErF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEhC,IAAI,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;IAC9E,CAAC;IAED,uEAAuE;IACvE,gFAAgF;IAChF,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,KAAK,GAAW,QAAQ,CAAC;IAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC;YACpD,MAAM,GAAG,IAAI,CAAC;YACd,MAAM;QACR,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE9C,sDAAsD;IACtD,oFAAoF;IACpF,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,iEAAiE;IACjE,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAErC,qEAAqE;IACrE,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC1C,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Session module exports
3
+ */
4
+ export { detectCurrentSession, listProjectSessions, getProjectDirPath, getClaudeProjectsDir, getClaudeSettingsPath, encodeProjectPath, decodeProjectPath, decodeProjectPathNaive, findSessionById, listSubagentFiles, } from "./detector.js";
5
+ export type { SessionFile, DetectorOptions, SubagentFile } from "./detector.js";
6
+ export { parseJSONL, parseJSONLContent, categorizeEntry, getEntryStatistics } from "./parser.js";
7
+ export type { ParsedEntry, ParsedEntryType, ParsedContent, RawEntry, RawAssistantEntry, RawProgressEntry, RawQueueOperationEntry, RawUserEntry, RawSystemEntry, RawSummaryEntry, ContentBlock, } from "./parser.js";
8
+ export { transformToSavedContext, getSessionPreview } from "./transformer.js";
9
+ export type { SavedContext, SessionInfo, SessionStatistics, DisplayMessage, MessageContent, MessageMetadata, TransformOptions, } from "./transformer.js";
10
+ export { FilterType, FILTER_CONFIGS, applyFilter } from "./filters.js";
11
+ export type { FilterConfig } from "./filters.js";
12
+ export { estimateTokensForFilters, formatTokenCount, countEntryTokens, } from "./token-estimator.js";
13
+ export type { TokenEstimate, FilterTokenEstimates } from "./token-estimator.js";
14
+ export { formatSessionTitle, isContinueSession } from "./format-title.js";
15
+ export type { FormattedSessionTitle } from "./format-title.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjG,YAAY,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,YAAY,EACV,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Session module exports
3
+ */
4
+ export { detectCurrentSession, listProjectSessions, getProjectDirPath, getClaudeProjectsDir, getClaudeSettingsPath, encodeProjectPath, decodeProjectPath, decodeProjectPathNaive, findSessionById, listSubagentFiles, } from "./detector.js";
5
+ export { parseJSONL, parseJSONLContent, categorizeEntry, getEntryStatistics } from "./parser.js";
6
+ export { transformToSavedContext, getSessionPreview } from "./transformer.js";
7
+ export { FilterType, FILTER_CONFIGS, applyFilter } from "./filters.js";
8
+ export { estimateTokensForFilters, formatTokenCount, countEntryTokens, } from "./token-estimator.js";
9
+ export { formatSessionTitle, isContinueSession } from "./format-title.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAejG,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAW9E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}