@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 @@
1
+ {"version":3,"file":"metadata-extractor.js","sourceRoot":"","sources":["../../src/cache/metadata-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Mode Detector
3
+ *
4
+ * Detect session mode (planning vs execution) and extract plan references
5
+ * from parsed JSONL entries.
6
+ */
7
+ import type { ParsedEntry } from "../session/parser.js";
8
+ import type { PlanRef } from "./types.js";
9
+ /**
10
+ * Detect session mode (planning vs execution) and extract plan references.
11
+ *
12
+ * - Planning mode: EnterPlanMode tool was called during session
13
+ * - Execution mode: First user message contains plan trigger pattern
14
+ */
15
+ export declare function detectModeAndPlans(entries: ParsedEntry[]): {
16
+ mode: 'planning' | 'execution' | null;
17
+ planRefs: PlanRef[];
18
+ };
19
+ //# sourceMappingURL=mode-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-detector.d.ts","sourceRoot":"","sources":["../../src/cache/mode-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG;IAC1D,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAyKA"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Mode Detector
3
+ *
4
+ * Detect session mode (planning vs execution) and extract plan references
5
+ * from parsed JSONL entries.
6
+ */
7
+ import { PLAN_TRIGGER_PATTERNS, extractPlanTitle } from "../archive/plan-extractor.js";
8
+ /**
9
+ * Detect session mode (planning vs execution) and extract plan references.
10
+ *
11
+ * - Planning mode: EnterPlanMode tool was called during session
12
+ * - Execution mode: First user message contains plan trigger pattern
13
+ */
14
+ export function detectModeAndPlans(entries) {
15
+ let mode = null;
16
+ const planRefs = [];
17
+ // Track if currently in plan mode (enter/exit pairs)
18
+ let inPlanMode = false;
19
+ // Track first real user message for execution mode detection
20
+ let firstUserMessageChecked = false;
21
+ entries.forEach((entry, index) => {
22
+ // Check for EnterPlanMode / ExitPlanMode tool calls
23
+ if (entry.type === 'tool_call' && entry.content.toolName === 'EnterPlanMode') {
24
+ inPlanMode = true;
25
+ }
26
+ if (entry.type === 'tool_call' && entry.content.toolName === 'ExitPlanMode') {
27
+ inPlanMode = false;
28
+ }
29
+ // Check first user message for execution mode
30
+ if (entry.type === 'user_message' && entry.content.text && !firstUserMessageChecked) {
31
+ const text = entry.content.text.trim();
32
+ // Skip internal command messages
33
+ if (text.startsWith('<local-command') ||
34
+ text.startsWith('<command-') ||
35
+ text.length === 0) {
36
+ return;
37
+ }
38
+ firstUserMessageChecked = true;
39
+ // Check if first message matches plan trigger patterns
40
+ for (const pattern of PLAN_TRIGGER_PATTERNS) {
41
+ if (pattern.test(text)) {
42
+ mode = 'execution';
43
+ // Extract plan content and title
44
+ const match = text.match(pattern);
45
+ if (match) {
46
+ const planContent = text.substring(match[0].length).trim();
47
+ // Only count as plan if it has content with markdown heading
48
+ if (planContent.length >= 100 && planContent.includes('#')) {
49
+ const title = extractPlanTitle(planContent);
50
+ planRefs.push({
51
+ title,
52
+ source: 'embedded',
53
+ messageIndex: index,
54
+ });
55
+ }
56
+ }
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ // Check for embedded plans in other user messages (not just first)
62
+ if (entry.type === 'user_message' && entry.content.text && firstUserMessageChecked) {
63
+ const text = entry.content.text.trim();
64
+ // Skip internal command messages
65
+ if (text.startsWith('<local-command') ||
66
+ text.startsWith('<command-') ||
67
+ text.length === 0) {
68
+ return;
69
+ }
70
+ // Check for plan trigger patterns in subsequent messages
71
+ for (const pattern of PLAN_TRIGGER_PATTERNS) {
72
+ if (pattern.test(text)) {
73
+ const match = text.match(pattern);
74
+ if (match) {
75
+ const planContent = text.substring(match[0].length).trim();
76
+ if (planContent.length >= 100 && planContent.includes('#')) {
77
+ const title = extractPlanTitle(planContent);
78
+ // Avoid duplicate entries for the same message
79
+ if (!planRefs.some(r => r.messageIndex === index)) {
80
+ planRefs.push({
81
+ title,
82
+ source: 'embedded',
83
+ messageIndex: index,
84
+ });
85
+ }
86
+ }
87
+ }
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ // Check for Plan agent responses from agent_progress entries
93
+ if (entry.type === 'agent_progress' && entry.content.agentType === 'Plan') {
94
+ const agentId = entry.content.agentId;
95
+ if (agentId && !planRefs.some(r => r.source === 'agent' && r.agentId === agentId)) {
96
+ planRefs.push({
97
+ title: entry.content.agentDescription || 'Agent-Generated Plan',
98
+ source: 'agent',
99
+ messageIndex: index,
100
+ agentId,
101
+ });
102
+ }
103
+ }
104
+ // Check for Write tool calls to plan files
105
+ if (entry.type === 'tool_call' && entry.content.toolName === 'Write') {
106
+ const input = entry.content.toolInput;
107
+ const filePath = input?.file_path || '';
108
+ const content = input?.content || '';
109
+ // Skip code files - they're not plans even if "plan" is in the name
110
+ const codeExtensions = [
111
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
112
+ '.py', '.rb', '.go', '.rs', '.java', '.kt', '.swift',
113
+ '.c', '.cpp', '.h', '.hpp', '.cs', '.php',
114
+ '.vue', '.svelte', '.astro',
115
+ '.css', '.scss', '.less', '.sass',
116
+ '.html', '.htm', '.xml', '.svg',
117
+ '.json', '.yaml', '.yml', '.toml',
118
+ '.sh', '.bash', '.zsh', '.fish',
119
+ '.sql', '.graphql', '.prisma',
120
+ ];
121
+ const isCodeFile = codeExtensions.some(ext => filePath.toLowerCase().endsWith(ext));
122
+ if (isCodeFile) {
123
+ return;
124
+ }
125
+ // Check if path looks like a plan file
126
+ const pathLooksLikePlan = filePath.toLowerCase().includes('plan') ||
127
+ filePath.endsWith('.plan.md') ||
128
+ filePath.includes('.jacques/plans/');
129
+ // Check if content looks like markdown plan (not code)
130
+ const hasHeading = /^#+\s+.+/m.test(content);
131
+ const hasListOrParagraph = /^[-*]\s+.+/m.test(content) || content.split('\n\n').length > 1;
132
+ const firstLine = content.split('\n').find(line => line.trim().length > 0) || '';
133
+ const codePatterns = [
134
+ /^import\s+/,
135
+ /^export\s+/,
136
+ /^const\s+/,
137
+ /^function\s+/,
138
+ /^class\s+/,
139
+ /^interface\s+/,
140
+ /^type\s+/,
141
+ ];
142
+ const looksLikeCode = codePatterns.some(p => p.test(firstLine.trim()));
143
+ const looksLikeMarkdown = hasHeading && hasListOrParagraph && !looksLikeCode;
144
+ if (pathLooksLikePlan && looksLikeMarkdown) {
145
+ const title = extractPlanTitle(content);
146
+ planRefs.push({
147
+ title,
148
+ source: 'write',
149
+ messageIndex: index,
150
+ filePath,
151
+ });
152
+ }
153
+ }
154
+ });
155
+ // Planning mode takes precedence if currently in plan mode
156
+ if (inPlanMode) {
157
+ mode = 'planning';
158
+ }
159
+ return { mode, planRefs };
160
+ }
161
+ //# sourceMappingURL=mode-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-detector.js","sourceRoot":"","sources":["../../src/cache/mode-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGvF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IAIvD,IAAI,IAAI,GAAoC,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,qDAAqD;IACrD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,6DAA6D;IAC7D,IAAI,uBAAuB,GAAG,KAAK,CAAC;IAEpC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/B,oDAAoD;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YAC7E,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC5E,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,8CAA8C;QAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACpF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEvC,iCAAiC;YACjC,IACE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;gBAC5B,IAAI,CAAC,MAAM,KAAK,CAAC,EACjB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,uBAAuB,GAAG,IAAI,CAAC;YAE/B,uDAAuD;YACvD,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;gBAC5C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,IAAI,GAAG,WAAW,CAAC;oBAEnB,iCAAiC;oBACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAClC,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC3D,6DAA6D;wBAC7D,IAAI,WAAW,CAAC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC3D,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;4BAC5C,QAAQ,CAAC,IAAI,CAAC;gCACZ,KAAK;gCACL,MAAM,EAAE,UAAU;gCAClB,YAAY,EAAE,KAAK;6BACpB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,mEAAmE;QACnE,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,EAAE,CAAC;YACnF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEvC,iCAAiC;YACjC,IACE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;gBAC5B,IAAI,CAAC,MAAM,KAAK,CAAC,EACjB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,yDAAyD;YACzD,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;gBAC5C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAClC,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC3D,IAAI,WAAW,CAAC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC3D,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;4BAC5C,+CAA+C;4BAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,EAAE,CAAC;gCAClD,QAAQ,CAAC,IAAI,CAAC;oCACZ,KAAK;oCACL,MAAM,EAAE,UAAU;oCAClB,YAAY,EAAE,KAAK;iCACpB,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACtC,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;gBAClF,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,IAAI,sBAAsB;oBAC/D,MAAM,EAAE,OAAO;oBACf,YAAY,EAAE,KAAK;oBACnB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAiE,CAAC;YAC9F,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;YAErC,oEAAoE;YACpE,MAAM,cAAc,GAAG;gBACrB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;gBAC5C,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ;gBACpD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;gBACzC,MAAM,EAAE,SAAS,EAAE,QAAQ;gBAC3B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;gBACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;gBAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;gBACjC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;gBAC/B,MAAM,EAAE,UAAU,EAAE,SAAS;aAC9B,CAAC;YACF,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACpF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,MAAM,iBAAiB,GACrB,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACvC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC7B,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAEvC,uDAAuD;YACvD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,kBAAkB,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACjF,MAAM,YAAY,GAAG;gBACnB,YAAY;gBACZ,YAAY;gBACZ,WAAW;gBACX,cAAc;gBACd,WAAW;gBACX,eAAe;gBACf,UAAU;aACX,CAAC;YACF,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACvE,MAAM,iBAAiB,GAAG,UAAU,IAAI,kBAAkB,IAAI,CAAC,aAAa,CAAC;YAE7E,IAAI,iBAAiB,IAAI,iBAAiB,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK;oBACL,MAAM,EAAE,OAAO;oBACf,YAAY,EAAE,KAAK;oBACnB,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,2DAA2D;IAC3D,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,GAAG,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Persistence
3
+ *
4
+ * Session index file I/O and caching with build deduplication.
5
+ */
6
+ import type { SessionIndex } from "./types.js";
7
+ /**
8
+ * Get the cache directory path
9
+ */
10
+ export declare function getCacheDir(): string;
11
+ /**
12
+ * Get the session index file path
13
+ */
14
+ export declare function getIndexPath(): string;
15
+ /**
16
+ * Ensure cache directory exists
17
+ */
18
+ export declare function ensureCacheDir(): Promise<void>;
19
+ /**
20
+ * Read the session index from disk
21
+ */
22
+ export declare function readSessionIndex(): Promise<SessionIndex>;
23
+ /**
24
+ * Write the session index to disk
25
+ */
26
+ export declare function writeSessionIndex(index: SessionIndex): Promise<void>;
27
+ /**
28
+ * Get the session index, building if necessary.
29
+ * Concurrent calls that trigger a rebuild share a single build.
30
+ * @param maxAge Maximum age in milliseconds before rebuilding (default: 5 minutes)
31
+ */
32
+ export declare function getSessionIndex(options?: {
33
+ maxAge?: number;
34
+ }): Promise<SessionIndex>;
35
+ /**
36
+ * Invalidate the index (force rebuild on next read)
37
+ */
38
+ export declare function invalidateIndex(): Promise<void>;
39
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/cache/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAW9D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1E;AASD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAOrD"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Persistence
3
+ *
4
+ * Session index file I/O and caching with build deduplication.
5
+ */
6
+ import { promises as fs } from "fs";
7
+ import * as path from "path";
8
+ import { getDefaultSessionIndex, JACQUES_CACHE_PATH, SESSION_INDEX_FILE } from "./types.js";
9
+ import { isNotFoundError, getErrorMessage } from "../logging/error-utils.js";
10
+ import { createLogger } from "../logging/logger.js";
11
+ const logger = createLogger({ prefix: "[Cache]" });
12
+ /**
13
+ * Get the cache directory path
14
+ */
15
+ export function getCacheDir() {
16
+ return JACQUES_CACHE_PATH;
17
+ }
18
+ /**
19
+ * Get the session index file path
20
+ */
21
+ export function getIndexPath() {
22
+ return path.join(JACQUES_CACHE_PATH, SESSION_INDEX_FILE);
23
+ }
24
+ /**
25
+ * Ensure cache directory exists
26
+ */
27
+ export async function ensureCacheDir() {
28
+ await fs.mkdir(JACQUES_CACHE_PATH, { recursive: true });
29
+ }
30
+ /**
31
+ * Read the session index from disk
32
+ */
33
+ export async function readSessionIndex() {
34
+ try {
35
+ const indexPath = getIndexPath();
36
+ const content = await fs.readFile(indexPath, "utf-8");
37
+ return JSON.parse(content);
38
+ }
39
+ catch (err) {
40
+ if (!isNotFoundError(err)) {
41
+ logger.warn("Failed to read session index:", getErrorMessage(err));
42
+ }
43
+ return getDefaultSessionIndex();
44
+ }
45
+ }
46
+ /**
47
+ * Write the session index to disk
48
+ */
49
+ export async function writeSessionIndex(index) {
50
+ await ensureCacheDir();
51
+ const indexPath = getIndexPath();
52
+ await fs.writeFile(indexPath, JSON.stringify(index, null, 2), "utf-8");
53
+ }
54
+ /**
55
+ * In-flight build promise — deduplicates concurrent buildSessionIndex() calls.
56
+ * When multiple callers (e.g. /api/sessions/by-project and /api/projects)
57
+ * request the index simultaneously, only one build runs.
58
+ */
59
+ let buildInProgress = null;
60
+ /**
61
+ * Get the session index, building if necessary.
62
+ * Concurrent calls that trigger a rebuild share a single build.
63
+ * @param maxAge Maximum age in milliseconds before rebuilding (default: 5 minutes)
64
+ */
65
+ export async function getSessionIndex(options) {
66
+ const { maxAge = 5 * 60 * 1000 } = options || {};
67
+ const existing = await readSessionIndex();
68
+ // Check if index is fresh enough
69
+ const lastScanned = new Date(existing.lastScanned).getTime();
70
+ const age = Date.now() - lastScanned;
71
+ if (age < maxAge && existing.sessions.length > 0) {
72
+ return existing;
73
+ }
74
+ // Deduplicate concurrent builds
75
+ if (buildInProgress) {
76
+ return buildInProgress;
77
+ }
78
+ // Dynamic import to avoid circular dependency:
79
+ // persistence -> metadata-extractor -> persistence (via writeSessionIndex)
80
+ const { buildSessionIndex } = await import("./metadata-extractor.js");
81
+ buildInProgress = buildSessionIndex().finally(() => {
82
+ buildInProgress = null;
83
+ });
84
+ return buildInProgress;
85
+ }
86
+ /**
87
+ * Invalidate the index (force rebuild on next read)
88
+ */
89
+ export async function invalidateIndex() {
90
+ try {
91
+ const indexPath = getIndexPath();
92
+ await fs.unlink(indexPath);
93
+ }
94
+ catch {
95
+ // Index doesn't exist, nothing to do
96
+ }
97
+ }
98
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/cache/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Project Discovery
3
+ *
4
+ * Discovers projects from ~/.claude/projects/, groups by git repo root,
5
+ * merges worktrees, and provides session query helpers.
6
+ */
7
+ import type { SessionEntry, DiscoveredProject } from "./types.js";
8
+ /**
9
+ * Get the project group key for a session.
10
+ * Uses basename of gitRepoRoot when available (groups worktrees together).
11
+ * Canonical implementation — CLI imports this; GUI mirrors it for browser compat.
12
+ */
13
+ export declare function getProjectGroupKey(session: {
14
+ git_repo_root?: string | null;
15
+ project: string;
16
+ }): string;
17
+ /**
18
+ * Get a single session entry by ID
19
+ */
20
+ export declare function getSessionEntry(sessionId: string): Promise<SessionEntry | null>;
21
+ /**
22
+ * Get sessions grouped by project.
23
+ * Uses basename of gitRepoRoot when available to group worktrees together.
24
+ */
25
+ export declare function getSessionsByProject(): Promise<Map<string, SessionEntry[]>>;
26
+ /**
27
+ * Get index statistics
28
+ */
29
+ export declare function getIndexStats(): Promise<{
30
+ totalSessions: number;
31
+ totalProjects: number;
32
+ totalSizeBytes: number;
33
+ lastScanned: string;
34
+ }>;
35
+ /**
36
+ * Discover all projects from ~/.claude/projects/, grouped by git repo root.
37
+ * Git worktrees of the same repo are merged into a single project entry.
38
+ * Non-git projects are standalone entries.
39
+ */
40
+ export declare function discoverProjects(): Promise<DiscoveredProject[]>;
41
+ //# sourceMappingURL=project-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/cache/project-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAgB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMhF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAMtG;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG9B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CACnD,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAC5B,CAeA;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAeD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2JrE"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Project Discovery
3
+ *
4
+ * Discovers projects from ~/.claude/projects/, groups by git repo root,
5
+ * merges worktrees, and provides session query helpers.
6
+ */
7
+ import * as path from "path";
8
+ import { getSessionIndex } from "./persistence.js";
9
+ import { detectGitInfo, readWorktreeRepoRoot } from "./git-utils.js";
10
+ import { getHiddenProjects } from "./hidden-projects.js";
11
+ import { listAllProjects } from "./metadata-extractor.js";
12
+ /**
13
+ * Get the project group key for a session.
14
+ * Uses basename of gitRepoRoot when available (groups worktrees together).
15
+ * Canonical implementation — CLI imports this; GUI mirrors it for browser compat.
16
+ */
17
+ export function getProjectGroupKey(session) {
18
+ if (session.git_repo_root) {
19
+ // Handle both / and \ separators (Windows uses backslashes)
20
+ return session.git_repo_root.split(/[/\\]/).pop() || session.project;
21
+ }
22
+ return session.project;
23
+ }
24
+ /**
25
+ * Get a single session entry by ID
26
+ */
27
+ export async function getSessionEntry(sessionId) {
28
+ const index = await getSessionIndex();
29
+ return index.sessions.find((s) => s.id === sessionId) || null;
30
+ }
31
+ /**
32
+ * Get sessions grouped by project.
33
+ * Uses basename of gitRepoRoot when available to group worktrees together.
34
+ */
35
+ export async function getSessionsByProject() {
36
+ const index = await getSessionIndex();
37
+ const byProject = new Map();
38
+ for (const session of index.sessions) {
39
+ // Group by git repo root basename when available (groups worktrees together)
40
+ const groupKey = session.gitRepoRoot
41
+ ? path.basename(session.gitRepoRoot)
42
+ : session.projectSlug;
43
+ const existing = byProject.get(groupKey) || [];
44
+ existing.push(session);
45
+ byProject.set(groupKey, existing);
46
+ }
47
+ return byProject;
48
+ }
49
+ /**
50
+ * Get index statistics
51
+ */
52
+ export async function getIndexStats() {
53
+ const index = await getSessionIndex();
54
+ // Count unique projects
55
+ const projects = new Set(index.sessions.map((s) => s.projectSlug));
56
+ // Sum file sizes
57
+ const totalSize = index.sessions.reduce((sum, s) => sum + s.fileSizeBytes, 0);
58
+ return {
59
+ totalSessions: index.sessions.length,
60
+ totalProjects: projects.size,
61
+ totalSizeBytes: totalSize,
62
+ lastScanned: index.lastScanned,
63
+ };
64
+ }
65
+ /**
66
+ * Discover all projects from ~/.claude/projects/, grouped by git repo root.
67
+ * Git worktrees of the same repo are merged into a single project entry.
68
+ * Non-git projects are standalone entries.
69
+ */
70
+ export async function discoverProjects() {
71
+ const rawProjects = await listAllProjects();
72
+ const index = await getSessionIndex();
73
+ // Build a lookup: encoded directory name -> sessions
74
+ // Uses the encoded dir (literal folder name in ~/.claude/projects/) rather than
75
+ // decoded projectPath, because the session index cache may have been built with
76
+ // stale/naive path decoding. The encoded dir name is always stable.
77
+ const sessionsByEncodedDir = new Map();
78
+ for (const session of index.sessions) {
79
+ const encodedDir = path.basename(path.dirname(session.jsonlPath));
80
+ const existing = sessionsByEncodedDir.get(encodedDir) || [];
81
+ existing.push(session);
82
+ sessionsByEncodedDir.set(encodedDir, existing);
83
+ }
84
+ const projectMap = new Map();
85
+ for (const raw of rawProjects) {
86
+ const encodedDir = path.basename(raw.encodedPath);
87
+ const matchingSessions = sessionsByEncodedDir.get(encodedDir) || [];
88
+ // Determine group key and git repo root
89
+ let groupKey;
90
+ let gitRepoRoot = null;
91
+ let isGitProject = false;
92
+ // First: check if any indexed session has gitRepoRoot
93
+ const sessionWithGit = matchingSessions.find((s) => s.gitRepoRoot);
94
+ if (sessionWithGit?.gitRepoRoot) {
95
+ gitRepoRoot = sessionWithGit.gitRepoRoot;
96
+ groupKey = path.basename(gitRepoRoot);
97
+ isGitProject = true;
98
+ }
99
+ else {
100
+ // No git info in index — probe the filesystem
101
+ const gitInfo = await detectGitInfo(raw.projectPath);
102
+ if (gitInfo.repoRoot) {
103
+ gitRepoRoot = gitInfo.repoRoot;
104
+ groupKey = path.basename(gitInfo.repoRoot);
105
+ isGitProject = true;
106
+ }
107
+ else {
108
+ // Non-git project: standalone entry
109
+ groupKey = raw.projectSlug;
110
+ isGitProject = false;
111
+ }
112
+ }
113
+ // Find most recent activity among matching sessions
114
+ let latestActivity = null;
115
+ for (const s of matchingSessions) {
116
+ if (s.endedAt && (!latestActivity || s.endedAt > latestActivity)) {
117
+ latestActivity = s.endedAt;
118
+ }
119
+ }
120
+ // Merge into existing group or create new
121
+ const existing = projectMap.get(groupKey);
122
+ if (existing) {
123
+ existing.projectPaths.push(raw.projectPath);
124
+ existing.encodedPaths.push(raw.encodedPath);
125
+ existing.sessionCount += matchingSessions.length;
126
+ if (latestActivity && (!existing.lastActivity || latestActivity > existing.lastActivity)) {
127
+ existing.lastActivity = latestActivity;
128
+ }
129
+ }
130
+ else {
131
+ projectMap.set(groupKey, {
132
+ name: groupKey,
133
+ gitRepoRoot,
134
+ isGitProject,
135
+ projectPaths: [raw.projectPath],
136
+ encodedPaths: [raw.encodedPath],
137
+ sessionCount: matchingSessions.length,
138
+ lastActivity: latestActivity,
139
+ });
140
+ }
141
+ }
142
+ // Second pass: merge non-git projects that have git evidence into matching git projects.
143
+ // This handles deleted worktrees whose directories no longer exist on disk —
144
+ // detectGitInfo fails but the JSONL sessions still have gitBranch/gitRepoRoot set.
145
+ const nonGitKeys = Array.from(projectMap.entries())
146
+ .filter(([, p]) => !p.isGitProject)
147
+ .map(([key]) => key);
148
+ const gitProjects = Array.from(projectMap.values()).filter((p) => p.isGitProject && p.gitRepoRoot);
149
+ for (const key of nonGitKeys) {
150
+ const project = projectMap.get(key);
151
+ if (!project)
152
+ continue;
153
+ const allSessions = project.encodedPaths.flatMap((ep) => sessionsByEncodedDir.get(path.basename(ep)) || []);
154
+ const hasGitBranch = allSessions.some((s) => s.gitBranch);
155
+ if (!hasGitBranch)
156
+ continue;
157
+ let matchingGit;
158
+ // Strategy 1: Read .git file in zombie worktree (dir exists, .git file present).
159
+ // Zombie worktrees have a .git file pointing to the main repo's worktrees dir.
160
+ const projectDir = project.projectPaths[0];
161
+ const repoRoot = await readWorktreeRepoRoot(projectDir);
162
+ if (repoRoot) {
163
+ matchingGit = gitProjects.find((gp) => gp.gitRepoRoot === repoRoot);
164
+ }
165
+ // Strategy 2: Name-prefix heuristic for truly deleted worktrees (dir gone).
166
+ // Worktree dirs are typically named <repo>-<branch>, so the repo basename
167
+ // is a prefix of the worktree dirname. Only merge when unambiguous.
168
+ if (!matchingGit) {
169
+ const worktreeDirname = path.basename(projectDir);
170
+ const candidates = gitProjects.filter((gp) => gp.gitRepoRoot && worktreeDirname.startsWith(path.basename(gp.gitRepoRoot)));
171
+ if (candidates.length === 1) {
172
+ matchingGit = candidates[0];
173
+ }
174
+ else if (candidates.length > 1) {
175
+ // Prefer longest prefix match (most specific repo name)
176
+ candidates.sort((a, b) => path.basename(b.gitRepoRoot).length - path.basename(a.gitRepoRoot).length);
177
+ matchingGit = candidates[0];
178
+ }
179
+ }
180
+ if (!matchingGit)
181
+ continue;
182
+ // Merge into the git project
183
+ matchingGit.projectPaths.push(...project.projectPaths);
184
+ matchingGit.encodedPaths.push(...project.encodedPaths);
185
+ matchingGit.sessionCount += project.sessionCount;
186
+ if (project.lastActivity && (!matchingGit.lastActivity || project.lastActivity > matchingGit.lastActivity)) {
187
+ matchingGit.lastActivity = project.lastActivity;
188
+ }
189
+ projectMap.delete(key);
190
+ }
191
+ // Filter out hidden projects
192
+ const hidden = await getHiddenProjects();
193
+ if (hidden.size > 0) {
194
+ for (const [key, project] of projectMap) {
195
+ if (hidden.has(project.name)) {
196
+ projectMap.delete(key);
197
+ }
198
+ }
199
+ }
200
+ // Sort: most recent activity first, then alphabetically
201
+ return Array.from(projectMap.values()).sort((a, b) => {
202
+ if (a.lastActivity && b.lastActivity) {
203
+ return b.lastActivity.localeCompare(a.lastActivity);
204
+ }
205
+ if (a.lastActivity && !b.lastActivity)
206
+ return -1;
207
+ if (!a.lastActivity && b.lastActivity)
208
+ return 1;
209
+ return a.name.localeCompare(b.name);
210
+ });
211
+ }
212
+ //# sourceMappingURL=project-discovery.js.map