@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,236 @@
1
+ /**
2
+ * Archive Types
3
+ *
4
+ * Type definitions for the conversation archive system.
5
+ * Supports cross-project search over saved Claude Code conversations.
6
+ */
7
+ /**
8
+ * Reference to a plan file used in a conversation
9
+ */
10
+ export interface PlanReference {
11
+ /** Original path (e.g., ~/.claude/plans/foo.md) */
12
+ path: string;
13
+ /** Plan filename (e.g., "foo.md") */
14
+ name: string;
15
+ /** Path in archive (e.g., plans/foo.md) */
16
+ archivedPath: string;
17
+ /** Detection method: embedded (from user message), write (from Write tool), or agent (from Plan subagent) */
18
+ source: "embedded" | "write" | "agent";
19
+ }
20
+ /**
21
+ * Summary of subagents used in a conversation
22
+ * Full subagent content stored separately in ~/.jacques/archive/subagents/
23
+ */
24
+ export interface SubagentSummary {
25
+ /** Number of subagents invoked */
26
+ count: number;
27
+ /** Total tokens used across all subagents */
28
+ totalTokens: number;
29
+ /** List of subagent IDs (for linking to full archives) */
30
+ ids: string[];
31
+ }
32
+ /**
33
+ * Lightweight manifest for a conversation (~1-2KB)
34
+ * Contains all searchable metadata without full content
35
+ */
36
+ export interface ConversationManifest {
37
+ /** Session UUID */
38
+ id: string;
39
+ /** Unique project identifier using encoded full path (e.g., "-Users-gole-Desktop-jacques-context-manager") */
40
+ projectId: string;
41
+ /** Project slug for display (e.g., "jacques-context-manager") */
42
+ projectSlug: string;
43
+ /** Full project path (e.g., "/Users/gole/Desktop/jacques-context-manager") */
44
+ projectPath: string;
45
+ /** ISO timestamp when archived */
46
+ archivedAt: string;
47
+ /** true = SessionEnd hook, false = manual save */
48
+ autoArchived: boolean;
49
+ /** Claude's auto-generated summary (or fallback) */
50
+ title: string;
51
+ /** Session timestamps */
52
+ startedAt: string;
53
+ endedAt: string;
54
+ durationMinutes: number;
55
+ /** Searchable content */
56
+ userQuestions: string[];
57
+ filesModified: string[];
58
+ toolsUsed: string[];
59
+ technologies: string[];
60
+ /** Plans created/edited in this conversation */
61
+ plans: PlanReference[];
62
+ /** Subagents invoked during this conversation */
63
+ subagents?: SubagentSummary;
64
+ /** Optional context snippets from assistant responses */
65
+ contextSnippets?: string[];
66
+ /** Statistics */
67
+ messageCount: number;
68
+ toolCallCount: number;
69
+ /** Manual save metadata */
70
+ userLabel?: string;
71
+ }
72
+ /**
73
+ * Reference to a manifest in the search index
74
+ */
75
+ export interface IndexReference {
76
+ /** Manifest/conversation ID */
77
+ id: string;
78
+ /** Frequency-based weight */
79
+ score: number;
80
+ /** Source field: "title" | "question" | "file" | "tech" */
81
+ field: string;
82
+ }
83
+ /**
84
+ * Project info in the search index
85
+ */
86
+ export interface ProjectInfo {
87
+ /** Full project path */
88
+ path: string;
89
+ /** Number of conversations */
90
+ conversationCount: number;
91
+ /** Last activity timestamp */
92
+ lastActivity: string;
93
+ }
94
+ /**
95
+ * Inverted search index for keywords
96
+ */
97
+ export interface SearchIndex {
98
+ version: string;
99
+ lastUpdated: string;
100
+ /** Inverted index: keyword → manifest references */
101
+ keywords: {
102
+ [keyword: string]: IndexReference[];
103
+ };
104
+ /** Quick access to project list (keyed by projectId for uniqueness) */
105
+ projects: {
106
+ [projectId: string]: ProjectInfo;
107
+ };
108
+ metadata: {
109
+ totalConversations: number;
110
+ totalKeywords: number;
111
+ };
112
+ }
113
+ /**
114
+ * Search input parameters
115
+ */
116
+ export interface SearchInput {
117
+ /** Keywords to search */
118
+ query: string;
119
+ /** Filter by project slug */
120
+ project?: string;
121
+ /** ISO date filter (from) */
122
+ dateFrom?: string;
123
+ /** ISO date filter (to) */
124
+ dateTo?: string;
125
+ /** Filter by tech stack */
126
+ technologies?: string[];
127
+ /** Default 10, max 50 */
128
+ limit?: number;
129
+ /** Default 0 */
130
+ offset?: number;
131
+ }
132
+ /**
133
+ * Single search result
134
+ */
135
+ export interface SearchResult {
136
+ rank: number;
137
+ id: string;
138
+ score: number;
139
+ /** Session title */
140
+ title: string;
141
+ /** Project slug */
142
+ project: string;
143
+ /** ISO date */
144
+ date: string;
145
+ /** First user question (truncated) */
146
+ preview: string;
147
+ /** Top 5 modified files */
148
+ filesModified: string[];
149
+ technologies: string[];
150
+ messageCount: number;
151
+ durationMinutes: number;
152
+ }
153
+ /**
154
+ * Search output response
155
+ */
156
+ export interface SearchOutput {
157
+ query: string;
158
+ filters: {
159
+ project?: string;
160
+ dateFrom?: string;
161
+ dateTo?: string;
162
+ technologies?: string[];
163
+ };
164
+ totalMatches: number;
165
+ showing: {
166
+ from: number;
167
+ to: number;
168
+ };
169
+ hasMore: boolean;
170
+ results: SearchResult[];
171
+ }
172
+ /**
173
+ * Archive settings stored in ~/.jacques/config.json
174
+ */
175
+ export interface ArchiveSettings {
176
+ /** Auto-archive on session end (default false) */
177
+ autoArchive: boolean;
178
+ }
179
+ /**
180
+ * Default archive settings
181
+ */
182
+ export declare function getDefaultArchiveSettings(): ArchiveSettings;
183
+ /**
184
+ * Default empty search index
185
+ */
186
+ export declare function getDefaultSearchIndex(): SearchIndex;
187
+ /**
188
+ * Progress callback for archive initialization
189
+ */
190
+ export interface ArchiveProgress {
191
+ /** Current phase: scanning for sessions or archiving them */
192
+ phase: "scanning" | "archiving";
193
+ /** Total items to process */
194
+ total: number;
195
+ /** Items completed */
196
+ completed: number;
197
+ /** Current item being processed (filename or path) */
198
+ current: string;
199
+ /** Number of items skipped (already archived) */
200
+ skipped: number;
201
+ /** Number of items that failed */
202
+ errors: number;
203
+ }
204
+ /**
205
+ * Result of archive initialization
206
+ */
207
+ export interface ArchiveInitResult {
208
+ /** Total sessions found */
209
+ totalSessions: number;
210
+ /** Sessions successfully archived */
211
+ archived: number;
212
+ /** Sessions skipped (already archived) */
213
+ skipped: number;
214
+ /** Sessions that failed to archive */
215
+ errors: number;
216
+ }
217
+ /**
218
+ * Session file info for bulk archiving
219
+ */
220
+ export interface SessionFileInfo {
221
+ /** Full path to the JSONL file */
222
+ filePath: string;
223
+ /** Session ID (from filename) */
224
+ sessionId: string;
225
+ /** Unique project identifier using encoded full path */
226
+ projectId: string;
227
+ /** Project path (decoded from Claude projects path) */
228
+ projectPath: string;
229
+ /** Project slug (basename of project path) */
230
+ projectSlug: string;
231
+ /** File modification time */
232
+ modifiedAt: Date;
233
+ /** File size in bytes */
234
+ sizeBytes: number;
235
+ }
236
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/archive/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Archive Types
3
+ *
4
+ * Type definitions for the conversation archive system.
5
+ * Supports cross-project search over saved Claude Code conversations.
6
+ */
7
+ /**
8
+ * Default archive settings
9
+ */
10
+ export function getDefaultArchiveSettings() {
11
+ return {
12
+ autoArchive: false,
13
+ };
14
+ }
15
+ /**
16
+ * Default empty search index
17
+ */
18
+ export function getDefaultSearchIndex() {
19
+ return {
20
+ version: "1.0.0",
21
+ lastUpdated: new Date().toISOString(),
22
+ keywords: {},
23
+ projects: {},
24
+ metadata: {
25
+ totalConversations: 0,
26
+ totalKeywords: 0,
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/archive/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgMH;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE;YACR,kBAAkB,EAAE,CAAC;YACrB,aAAa,EAAE,CAAC;SACjB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Endearment phrases displayed before "Jacques" in the CLI header.
3
+ * A random phrase is selected on each app startup.
4
+ */
5
+ export declare const ENDEARMENT_PHRASES: string[];
6
+ export declare function getRandomEndearment(): string;
7
+ /** Selected once at module load (app startup). Same value for the entire process lifetime. */
8
+ export declare const APP_ENDEARMENT: string;
9
+ //# sourceMappingURL=branding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,kBAAkB,UAuC9B,CAAC;AAEF,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,8FAA8F;AAC9F,eAAO,MAAM,cAAc,QAAwB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Endearment phrases displayed before "Jacques" in the CLI header.
3
+ * A random phrase is selected on each app startup.
4
+ */
5
+ export const ENDEARMENT_PHRASES = [
6
+ "My Dearest",
7
+ "My sweet",
8
+ "My love",
9
+ "My sunshine",
10
+ "My precious",
11
+ "My lambkin",
12
+ "My kitten",
13
+ "My honeybunny",
14
+ "My cupcake",
15
+ "My pookie",
16
+ "My boo",
17
+ "My sweetling",
18
+ "Mi amor",
19
+ "Mój kochany",
20
+ "Mi cariño",
21
+ "Mio amore",
22
+ "Mon chéri",
23
+ "Mon petit chou",
24
+ "Mein Schatz",
25
+ "Mein Liebling",
26
+ "Habibi",
27
+ "Azizam",
28
+ "Meri jaan",
29
+ "Amar shona",
30
+ "Meri priya",
31
+ "Meu carinho",
32
+ "Moya dusya",
33
+ "Wǒ de xīn gān",
34
+ "Watashi no hime",
35
+ "Nae sarang",
36
+ "En uyire",
37
+ "Cintaku",
38
+ "Mahal ko",
39
+ "Con mèo con của tôi",
40
+ "Prana-priya",
41
+ "Nyan-nyan",
42
+ "Kame-chan",
43
+ "Manisanku",
44
+ ];
45
+ export function getRandomEndearment() {
46
+ return ENDEARMENT_PHRASES[Math.floor(Math.random() * ENDEARMENT_PHRASES.length)];
47
+ }
48
+ /** Selected once at module load (app startup). Same value for the entire process lifetime. */
49
+ export const APP_ENDEARMENT = getRandomEndearment();
50
+ //# sourceMappingURL=branding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,YAAY;IACZ,UAAU;IACV,SAAS;IACT,aAAa;IACb,aAAa;IACb,YAAY;IACZ,WAAW;IACX,eAAe;IACf,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,cAAc;IACd,SAAS;IACT,aAAa;IACb,WAAW;IACX,WAAW;IACX,WAAW;IACX,gBAAgB;IAChB,aAAa;IACb,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,YAAY;IACZ,UAAU;IACV,SAAS;IACT,UAAU;IACV,qBAAqB;IACrB,aAAa;IACb,WAAW;IACX,WAAW;IACX,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Git Utilities
3
+ *
4
+ * Detect git repository info (root, branch, worktree) for a project path.
5
+ * Falls back to reading gitBranch from JSONL when filesystem detection fails.
6
+ */
7
+ import type { GitInfo, BranchDivergence } from "./types.js";
8
+ /**
9
+ * Detect git info for a project path: repo root, branch, and worktree name.
10
+ * If the path doesn't exist, walks up parent directories to find a git repo.
11
+ *
12
+ * Uses async exec to avoid blocking the Node.js event loop (important when
13
+ * the server is embedded in the CLI — sync git calls freeze the TUI).
14
+ */
15
+ export declare function detectGitInfo(projectPath: string): Promise<GitInfo>;
16
+ /**
17
+ * Read the gitBranch field from early JSONL entries.
18
+ * Used when detectGitInfo fails (e.g., deleted worktrees).
19
+ */
20
+ export declare function readGitBranchFromJsonl(jsonlPath: string): Promise<string | null>;
21
+ /**
22
+ * Read the .git file in a worktree directory to extract the main repo root.
23
+ * Worktree .git files contain: gitdir: /path/to/main-repo/.git/worktrees/<name>
24
+ * Returns the repo root path, or null if not a worktree .git file.
25
+ */
26
+ export declare function readWorktreeRepoRoot(dirPath: string): Promise<string | null>;
27
+ /**
28
+ * Compute how many commits a branch is ahead/behind the default branch.
29
+ * Uses `git rev-list --left-right --count` which is fast even on large repos.
30
+ */
31
+ export declare function computeBranchDivergence(repoRoot: string, branch: string, defaultBranch: string): Promise<BranchDivergence>;
32
+ /**
33
+ * Check whether a worktree/directory has uncommitted changes (staged or unstaged).
34
+ */
35
+ export declare function checkDirtyStatus(worktreePath: string): Promise<boolean>;
36
+ //# sourceMappingURL=git-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/cache/git-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAO5D;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiDzE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BtF;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBlF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAc3B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW7E"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Git Utilities
3
+ *
4
+ * Detect git repository info (root, branch, worktree) for a project path.
5
+ * Falls back to reading gitBranch from JSONL when filesystem detection fails.
6
+ */
7
+ import { promises as fs } from "fs";
8
+ import * as path from "path";
9
+ import { exec as execCb } from "child_process";
10
+ import { promisify } from "util";
11
+ import { isNotFoundError, getErrorMessage } from "../logging/error-utils.js";
12
+ import { createLogger } from "../logging/logger.js";
13
+ const execAsync = promisify(execCb);
14
+ const logger = createLogger({ prefix: "[Git]" });
15
+ /**
16
+ * Detect git info for a project path: repo root, branch, and worktree name.
17
+ * If the path doesn't exist, walks up parent directories to find a git repo.
18
+ *
19
+ * Uses async exec to avoid blocking the Node.js event loop (important when
20
+ * the server is embedded in the CLI — sync git calls freeze the TUI).
21
+ */
22
+ export async function detectGitInfo(projectPath) {
23
+ // Try the exact path first, then walk up parents if it doesn't exist
24
+ const candidates = [projectPath];
25
+ let dir = projectPath;
26
+ while (true) {
27
+ const parent = path.dirname(dir);
28
+ if (parent === dir)
29
+ break; // reached filesystem root
30
+ candidates.push(parent);
31
+ dir = parent;
32
+ }
33
+ for (const candidate of candidates) {
34
+ try {
35
+ const { stdout } = await execAsync(`git -C "${candidate}" rev-parse --abbrev-ref HEAD --git-common-dir`, { timeout: 5000 });
36
+ const output = stdout.trim();
37
+ if (!output)
38
+ continue;
39
+ const lines = output.split("\n");
40
+ const branch = lines[0] || undefined;
41
+ const commonDir = lines[1];
42
+ if (!commonDir)
43
+ return { branch };
44
+ // Resolve relative paths (e.g., "../.git" from subdirectories) to absolute
45
+ const resolved = path.resolve(candidate, commonDir);
46
+ let repoRoot;
47
+ let worktree;
48
+ if (resolved.endsWith(`${path.sep}.git`) || resolved.endsWith("/.git")) {
49
+ // Normal repo or subdirectory: .git parent is repo root
50
+ repoRoot = path.dirname(resolved);
51
+ }
52
+ else {
53
+ // Worktree: common dir points to shared .git dir
54
+ repoRoot = path.dirname(resolved);
55
+ worktree = path.basename(projectPath);
56
+ }
57
+ return { repoRoot, branch, worktree };
58
+ }
59
+ catch {
60
+ // This candidate didn't work, try the next parent
61
+ continue;
62
+ }
63
+ }
64
+ return {};
65
+ }
66
+ /**
67
+ * Read the gitBranch field from early JSONL entries.
68
+ * Used when detectGitInfo fails (e.g., deleted worktrees).
69
+ */
70
+ export async function readGitBranchFromJsonl(jsonlPath) {
71
+ try {
72
+ const handle = await fs.open(jsonlPath, "r");
73
+ try {
74
+ const buf = Buffer.alloc(8192);
75
+ const { bytesRead } = await handle.read(buf, 0, 8192, 0);
76
+ const chunk = buf.toString("utf-8", 0, bytesRead);
77
+ for (const line of chunk.split("\n")) {
78
+ if (!line.trim())
79
+ continue;
80
+ try {
81
+ const entry = JSON.parse(line);
82
+ if (typeof entry.gitBranch === "string") {
83
+ return entry.gitBranch;
84
+ }
85
+ }
86
+ catch {
87
+ // Partial line
88
+ }
89
+ }
90
+ }
91
+ finally {
92
+ await handle.close();
93
+ }
94
+ }
95
+ catch (err) {
96
+ if (!isNotFoundError(err)) {
97
+ logger.warn("Failed to read gitBranch from JSONL:", getErrorMessage(err));
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Read the .git file in a worktree directory to extract the main repo root.
104
+ * Worktree .git files contain: gitdir: /path/to/main-repo/.git/worktrees/<name>
105
+ * Returns the repo root path, or null if not a worktree .git file.
106
+ */
107
+ export async function readWorktreeRepoRoot(dirPath) {
108
+ const dotGitPath = path.join(dirPath, ".git");
109
+ try {
110
+ const stat = await fs.stat(dotGitPath);
111
+ if (!stat.isFile())
112
+ return null; // Regular .git directory, not a worktree
113
+ const content = await fs.readFile(dotGitPath, "utf-8");
114
+ const match = content.match(/^gitdir:\s*(.+)/m);
115
+ if (!match)
116
+ return null;
117
+ const gitdir = match[1].trim();
118
+ // Find .git/worktrees/ segment and extract repo root before it
119
+ for (const marker of ["/.git/worktrees/", `${path.sep}.git${path.sep}worktrees${path.sep}`]) {
120
+ const idx = gitdir.indexOf(marker);
121
+ if (idx >= 0)
122
+ return gitdir.substring(0, idx);
123
+ }
124
+ return null;
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ }
130
+ /**
131
+ * Compute how many commits a branch is ahead/behind the default branch.
132
+ * Uses `git rev-list --left-right --count` which is fast even on large repos.
133
+ */
134
+ export async function computeBranchDivergence(repoRoot, branch, defaultBranch) {
135
+ try {
136
+ const escaped = repoRoot.replace(/'/g, "'\\''");
137
+ const { stdout } = await execAsync(`git -C '${escaped}' rev-list --left-right --count '${defaultBranch}...${branch}'`, { timeout: 5000 });
138
+ const parts = stdout.trim().split(/\s+/);
139
+ const behind = parseInt(parts[0], 10) || 0;
140
+ const ahead = parseInt(parts[1], 10) || 0;
141
+ return { ahead, behind };
142
+ }
143
+ catch {
144
+ return { ahead: 0, behind: 0 };
145
+ }
146
+ }
147
+ /**
148
+ * Check whether a worktree/directory has uncommitted changes (staged or unstaged).
149
+ */
150
+ export async function checkDirtyStatus(worktreePath) {
151
+ try {
152
+ const escaped = worktreePath.replace(/'/g, "'\\''");
153
+ const { stdout } = await execAsync(`git -C '${escaped}' status --porcelain`, { timeout: 5000 });
154
+ return stdout.trim().length > 0;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ //# sourceMappingURL=git-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/cache/git-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AACpC,MAAM,MAAM,GAAW,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,qEAAqE;IACrE,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,IAAI,GAAG,GAAG,WAAW,CAAC;IACtB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,CAAC,0BAA0B;QACrD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,WAAW,SAAS,gDAAgD,EACpE,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAE7B,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAElC,2EAA2E;YAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAEpD,IAAI,QAAgB,CAAC;YACrB,IAAI,QAA4B,CAAC;YAEjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvE,wDAAwD;gBACxD,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAClC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;YAClD,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAClD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/B,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;wBACxC,OAAO,KAAK,CAAC,SAAS,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,eAAe;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,yCAAyC;QAE1E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,+DAA+D;QAC/D,KAAK,MAAM,MAAM,IAAI,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,GAAG,IAAI,CAAC;gBAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,MAAc,EACd,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,WAAW,OAAO,oCAAoC,aAAa,MAAM,MAAM,GAAG,EAClF,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAoB;IACzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,WAAW,OAAO,sBAAsB,EACxC,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Hidden Projects
3
+ *
4
+ * Manages the list of projects hidden from the discovered projects view.
5
+ * Persisted in ~/.jacques/hidden-projects.json.
6
+ */
7
+ /**
8
+ * Get the set of hidden project names.
9
+ */
10
+ export declare function getHiddenProjects(): Promise<Set<string>>;
11
+ /**
12
+ * Hide a project from the discovered list.
13
+ */
14
+ export declare function hideProject(name: string): Promise<void>;
15
+ /**
16
+ * Unhide a project (restore it to the discovered list).
17
+ */
18
+ export declare function unhideProject(name: string): Promise<void>;
19
+ //# sourceMappingURL=hidden-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden-projects.d.ts","sourceRoot":"","sources":["../../src/cache/hidden-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAa9D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Hidden Projects
3
+ *
4
+ * Manages the list of projects hidden from the discovered projects view.
5
+ * Persisted in ~/.jacques/hidden-projects.json.
6
+ */
7
+ import { promises as fs } from "fs";
8
+ import * as path from "path";
9
+ import { HIDDEN_PROJECTS_FILE } from "./types.js";
10
+ import { isNotFoundError, getErrorMessage } from "../logging/error-utils.js";
11
+ import { createLogger } from "../logging/logger.js";
12
+ const logger = createLogger({ prefix: "[Hidden]" });
13
+ /**
14
+ * Get the set of hidden project names.
15
+ */
16
+ export async function getHiddenProjects() {
17
+ try {
18
+ const content = await fs.readFile(HIDDEN_PROJECTS_FILE, "utf-8");
19
+ const data = JSON.parse(content);
20
+ if (Array.isArray(data)) {
21
+ return new Set(data);
22
+ }
23
+ }
24
+ catch (err) {
25
+ if (!isNotFoundError(err)) {
26
+ logger.warn("Failed to read hidden projects:", getErrorMessage(err));
27
+ }
28
+ }
29
+ return new Set();
30
+ }
31
+ /**
32
+ * Hide a project from the discovered list.
33
+ */
34
+ export async function hideProject(name) {
35
+ const hidden = await getHiddenProjects();
36
+ hidden.add(name);
37
+ await fs.mkdir(path.dirname(HIDDEN_PROJECTS_FILE), { recursive: true });
38
+ await fs.writeFile(HIDDEN_PROJECTS_FILE, JSON.stringify([...hidden], null, 2));
39
+ }
40
+ /**
41
+ * Unhide a project (restore it to the discovered list).
42
+ */
43
+ export async function unhideProject(name) {
44
+ const hidden = await getHiddenProjects();
45
+ hidden.delete(name);
46
+ await fs.writeFile(HIDDEN_PROJECTS_FILE, JSON.stringify([...hidden], null, 2));
47
+ }
48
+ //# sourceMappingURL=hidden-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden-projects.js","sourceRoot":"","sources":["../../src/cache/hidden-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,GAAW,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,GAAG,EAAE,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,MAAM,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cache Module
3
+ *
4
+ * Lightweight session indexing without content duplication.
5
+ * Reads directly from Claude Code JSONL files.
6
+ */
7
+ export type { SessionEntry, SessionIndex, DiscoveredProject, PlanRef, ExploreAgentRef, WebSearchRef, GitInfo, BranchDivergence, } from "./types.js";
8
+ export { getDefaultSessionIndex, decodeProjectPath, } from "./types.js";
9
+ export { getCacheDir, getIndexPath, ensureCacheDir, readSessionIndex, writeSessionIndex, getSessionIndex, invalidateIndex, } from "./persistence.js";
10
+ export { detectModeAndPlans } from "./mode-detector.js";
11
+ export { detectGitInfo, readGitBranchFromJsonl, readWorktreeRepoRoot, computeBranchDivergence, checkDirtyStatus } from "./git-utils.js";
12
+ export { extractTitle, extractTimestamps, extractSessionMetadata, extractContinueTitleFromHandoff, listAllProjects, buildSessionIndex, } from "./metadata-extractor.js";
13
+ export { getProjectGroupKey, discoverProjects, getSessionEntry, getSessionsByProject, getIndexStats, } from "./project-discovery.js";
14
+ export { getHiddenProjects, hideProject, unhideProject, } from "./hidden-projects.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,eAAe,EACf,YAAY,EACZ,OAAO,EACP,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGxI,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,+BAA+B,EAC/B,eAAe,EACf,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC"}