@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,612 @@
1
+ /**
2
+ * Archive Store
3
+ *
4
+ * File I/O for the conversation archive system.
5
+ * Handles storing manifests, conversations, and plans to ~/.jacques/archive/
6
+ * and local project .jacques/ directories.
7
+ */
8
+ import { promises as fs } from "fs";
9
+ import * as path from "path";
10
+ import { homedir } from "os";
11
+ import { getDefaultSearchIndex, getDefaultArchiveSettings } from "./types.js";
12
+ import { addToIndex, searchIndex } from "./search-indexer.js";
13
+ import { addSessionToIndex, addPlanToIndex } from "../context/indexer.js";
14
+ import { slugify, generateArchivePlanFilename } from "./filename-utils.js";
15
+ /** Global archive base path */
16
+ const GLOBAL_ARCHIVE_PATH = path.join(homedir(), ".jacques", "archive");
17
+ /** Global config path */
18
+ const GLOBAL_CONFIG_PATH = path.join(homedir(), ".jacques", "config.json");
19
+ /** Local project archive directory name */
20
+ const LOCAL_ARCHIVE_DIR = ".jacques";
21
+ // ============================================================
22
+ // Filename Generation
23
+ // ============================================================
24
+ /**
25
+ * Generate a readable filename for a session.
26
+ * Format: [YYYY-MM-DD]_[HH-MM]_[title-slug]_[4-char-id].json
27
+ * Example: 2026-01-31_14-30_jwt-auth-setup_8d84.json
28
+ */
29
+ export function generateSessionFilename(manifest) {
30
+ const date = new Date(manifest.endedAt);
31
+ const dateStr = date.toISOString().split("T")[0]; // YYYY-MM-DD
32
+ const timeStr = date.toTimeString().substring(0, 5).replace(":", "-"); // HH-MM
33
+ const titleSlug = slugify(manifest.title);
34
+ const shortId = manifest.id.substring(0, 4);
35
+ return `${dateStr}_${timeStr}_${titleSlug}_${shortId}.json`;
36
+ }
37
+ // ============================================================
38
+ // Path Helpers
39
+ // ============================================================
40
+ /**
41
+ * Get the global archive base path.
42
+ */
43
+ export function getGlobalArchivePath() {
44
+ return GLOBAL_ARCHIVE_PATH;
45
+ }
46
+ /**
47
+ * Get the path to the global search index.
48
+ */
49
+ export function getGlobalIndexPath() {
50
+ return path.join(GLOBAL_ARCHIVE_PATH, "index.json");
51
+ }
52
+ /**
53
+ * Get the path to a manifest in the global archive.
54
+ */
55
+ export function getManifestPath(id) {
56
+ return path.join(GLOBAL_ARCHIVE_PATH, "manifests", `${id}.json`);
57
+ }
58
+ /**
59
+ * Get the path to a conversation in the global archive.
60
+ * Uses projectId (encoded full path) for storage to avoid collisions.
61
+ */
62
+ export function getConversationPath(projectId, id) {
63
+ return path.join(GLOBAL_ARCHIVE_PATH, "conversations", projectId, `${id}.json`);
64
+ }
65
+ /**
66
+ * Get the path to a plan in the global archive.
67
+ * Plans are organized by project: plans/[projectId]/[name].md
68
+ * Uses projectId (encoded full path) for storage to avoid collisions.
69
+ */
70
+ export function getPlanPath(projectId, planName) {
71
+ return path.join(GLOBAL_ARCHIVE_PATH, "plans", projectId, planName);
72
+ }
73
+ /**
74
+ * Get the local project archive path.
75
+ */
76
+ export function getLocalArchivePath(projectPath) {
77
+ return path.join(projectPath, LOCAL_ARCHIVE_DIR);
78
+ }
79
+ /**
80
+ * Get the local project archive index path.
81
+ * Uses sessions/index.json to avoid conflict with context/index.json
82
+ */
83
+ export function getLocalIndexPath(projectPath) {
84
+ return path.join(projectPath, LOCAL_ARCHIVE_DIR, "sessions", "index.json");
85
+ }
86
+ // ============================================================
87
+ // Directory Setup
88
+ // ============================================================
89
+ /**
90
+ * Ensure the global archive directory structure exists.
91
+ */
92
+ export async function ensureGlobalArchive() {
93
+ await fs.mkdir(path.join(GLOBAL_ARCHIVE_PATH, "manifests"), {
94
+ recursive: true,
95
+ });
96
+ await fs.mkdir(path.join(GLOBAL_ARCHIVE_PATH, "conversations"), {
97
+ recursive: true,
98
+ });
99
+ await fs.mkdir(path.join(GLOBAL_ARCHIVE_PATH, "plans"), { recursive: true });
100
+ await fs.mkdir(path.join(GLOBAL_ARCHIVE_PATH, "context"), { recursive: true });
101
+ }
102
+ /**
103
+ * Ensure the local project archive directory structure exists.
104
+ */
105
+ export async function ensureLocalArchive(projectPath) {
106
+ const localPath = getLocalArchivePath(projectPath);
107
+ await fs.mkdir(path.join(localPath, "sessions"), { recursive: true });
108
+ await fs.mkdir(path.join(localPath, "plans"), { recursive: true });
109
+ await fs.mkdir(path.join(localPath, "context"), { recursive: true });
110
+ }
111
+ // ============================================================
112
+ // Index Operations
113
+ // ============================================================
114
+ /**
115
+ * Read the global search index.
116
+ */
117
+ export async function readGlobalIndex() {
118
+ try {
119
+ const content = await fs.readFile(getGlobalIndexPath(), "utf-8");
120
+ return JSON.parse(content);
121
+ }
122
+ catch {
123
+ return getDefaultSearchIndex();
124
+ }
125
+ }
126
+ /**
127
+ * Write the global search index.
128
+ */
129
+ export async function writeGlobalIndex(index) {
130
+ await ensureGlobalArchive();
131
+ await fs.writeFile(getGlobalIndexPath(), JSON.stringify(index, null, 2));
132
+ }
133
+ /**
134
+ * Read a local project index.
135
+ */
136
+ export async function readLocalIndex(projectPath) {
137
+ try {
138
+ const content = await fs.readFile(getLocalIndexPath(projectPath), "utf-8");
139
+ return JSON.parse(content);
140
+ }
141
+ catch {
142
+ return getDefaultSearchIndex();
143
+ }
144
+ }
145
+ /**
146
+ * Write a local project index.
147
+ */
148
+ export async function writeLocalIndex(projectPath, index) {
149
+ await ensureLocalArchive(projectPath);
150
+ await fs.writeFile(getLocalIndexPath(projectPath), JSON.stringify(index, null, 2));
151
+ }
152
+ // ============================================================
153
+ // Manifest Operations
154
+ // ============================================================
155
+ /**
156
+ * Save a manifest to the global archive.
157
+ */
158
+ export async function saveManifest(manifest) {
159
+ await ensureGlobalArchive();
160
+ const manifestPath = getManifestPath(manifest.id);
161
+ await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2));
162
+ }
163
+ /**
164
+ * Read a manifest from the global archive.
165
+ */
166
+ export async function readManifest(id) {
167
+ try {
168
+ const content = await fs.readFile(getManifestPath(id), "utf-8");
169
+ return JSON.parse(content);
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ /**
176
+ * List all manifest IDs in the global archive.
177
+ */
178
+ export async function listManifests() {
179
+ try {
180
+ const manifestsDir = path.join(GLOBAL_ARCHIVE_PATH, "manifests");
181
+ const files = await fs.readdir(manifestsDir);
182
+ return files
183
+ .filter((f) => f.endsWith(".json"))
184
+ .map((f) => f.replace(".json", ""));
185
+ }
186
+ catch {
187
+ return [];
188
+ }
189
+ }
190
+ /**
191
+ * List all manifests with full data, sorted by date (newest first).
192
+ */
193
+ export async function listAllManifests() {
194
+ const ids = await listManifests();
195
+ const manifests = [];
196
+ for (const id of ids) {
197
+ const manifest = await readManifest(id);
198
+ if (manifest) {
199
+ manifests.push(manifest);
200
+ }
201
+ }
202
+ // Sort by endedAt descending (newest first)
203
+ manifests.sort((a, b) => new Date(b.endedAt).getTime() - new Date(a.endedAt).getTime());
204
+ return manifests;
205
+ }
206
+ /**
207
+ * List all manifests grouped by project.
208
+ * Returns a Map with projectId as keys (for uniqueness), sorted manifests as values.
209
+ * Falls back to projectSlug for old manifests without projectId.
210
+ */
211
+ export async function listManifestsByProject() {
212
+ const manifests = await listAllManifests();
213
+ const byProject = new Map();
214
+ for (const manifest of manifests) {
215
+ // Use projectId if available, fallback to projectSlug for old data
216
+ const key = manifest.projectId || manifest.projectSlug;
217
+ const existing = byProject.get(key) || [];
218
+ existing.push(manifest);
219
+ byProject.set(key, existing);
220
+ }
221
+ return byProject;
222
+ }
223
+ // ============================================================
224
+ // Conversation Operations
225
+ // ============================================================
226
+ /**
227
+ * Save a conversation to both global and local archives.
228
+ * Uses readable filename format: YYYY-MM-DD_HH-MM_title-slug_id.json
229
+ */
230
+ export async function saveConversation(conversation, manifest, options = {}) {
231
+ // Generate readable filename
232
+ const filename = generateSessionFilename(manifest);
233
+ // Save to global archive (conversations/[projectId]/[filename])
234
+ // Use projectId (encoded path) for unique directory naming
235
+ await ensureGlobalArchive();
236
+ const globalDir = path.join(GLOBAL_ARCHIVE_PATH, "conversations", manifest.projectId);
237
+ await fs.mkdir(globalDir, { recursive: true });
238
+ const globalPath = path.join(globalDir, filename);
239
+ await fs.writeFile(globalPath, JSON.stringify(conversation, null, 2));
240
+ // Optionally save to local project archive (sessions/[filename])
241
+ let localPath;
242
+ if (options.saveToLocal !== false) {
243
+ await ensureLocalArchive(manifest.projectPath);
244
+ const localDir = path.join(getLocalArchivePath(manifest.projectPath), "sessions");
245
+ await fs.mkdir(localDir, { recursive: true });
246
+ localPath = path.join(localDir, filename);
247
+ await fs.writeFile(localPath, JSON.stringify(conversation, null, 2));
248
+ // Update the unified project index
249
+ const sessionEntry = {
250
+ id: manifest.id,
251
+ title: manifest.title,
252
+ filename,
253
+ path: `sessions/${filename}`,
254
+ savedAt: manifest.archivedAt,
255
+ startedAt: manifest.startedAt,
256
+ endedAt: manifest.endedAt,
257
+ durationMinutes: manifest.durationMinutes,
258
+ messageCount: manifest.messageCount,
259
+ toolCallCount: manifest.toolCallCount,
260
+ technologies: manifest.technologies,
261
+ userLabel: manifest.userLabel,
262
+ };
263
+ await addSessionToIndex(manifest.projectPath, sessionEntry);
264
+ }
265
+ return { globalPath, localPath, filename };
266
+ }
267
+ /**
268
+ * Read a conversation from the global archive.
269
+ * @param projectId The projectId (encoded path) or projectSlug for old data
270
+ */
271
+ export async function readConversation(projectId, id) {
272
+ try {
273
+ const convPath = getConversationPath(projectId, id);
274
+ const content = await fs.readFile(convPath, "utf-8");
275
+ return JSON.parse(content);
276
+ }
277
+ catch {
278
+ return null;
279
+ }
280
+ }
281
+ // ============================================================
282
+ // Plan Operations
283
+ // ============================================================
284
+ /**
285
+ * Archive a plan file (copy to archive if not already there).
286
+ * Uses project subdirectories and readable naming.
287
+ * Extracts title from the plan's # heading for the filename.
288
+ */
289
+ export async function archivePlan(planPath, options = {}) {
290
+ try {
291
+ const content = await fs.readFile(planPath, "utf-8");
292
+ // Generate readable filename using the plan's actual title
293
+ const stats = await fs.stat(planPath);
294
+ const filename = generateArchivePlanFilename(planPath, {
295
+ content,
296
+ createdAt: stats.mtime,
297
+ });
298
+ // Use projectId for storage, derive from path if not provided
299
+ const projectId = options.projectId ||
300
+ (options.projectPath ? options.projectPath.replace(/\//g, "-") : "unknown");
301
+ // Save to global archive (plans/[projectId]/[filename])
302
+ const globalPlanPath = getPlanPath(projectId, filename);
303
+ await ensureGlobalArchive();
304
+ await fs.mkdir(path.dirname(globalPlanPath), { recursive: true });
305
+ await fs.writeFile(globalPlanPath, content);
306
+ // Optionally save to local project archive
307
+ if (options.saveToLocal !== false && options.projectPath) {
308
+ await ensureLocalArchive(options.projectPath);
309
+ const localPlanDir = path.join(getLocalArchivePath(options.projectPath), "plans");
310
+ await fs.mkdir(localPlanDir, { recursive: true });
311
+ const localPlanPath = path.join(localPlanDir, filename);
312
+ await fs.writeFile(localPlanPath, content);
313
+ // Extract title from plan content (first # heading)
314
+ const titleMatch = content.match(/^#\s+(.+)$/m);
315
+ const title = titleMatch ? titleMatch[1] : path.basename(planPath, ".md");
316
+ // Update the unified project index
317
+ const shortHash = Buffer.from(planPath)
318
+ .toString("base64")
319
+ .substring(0, 6);
320
+ const planEntry = {
321
+ id: slugify(path.basename(planPath, ".md")) + "-" + shortHash,
322
+ title,
323
+ filename,
324
+ path: `plans/${filename}`,
325
+ createdAt: stats.mtime.toISOString(),
326
+ updatedAt: new Date().toISOString(),
327
+ sessions: options.sessionId ? [options.sessionId] : [],
328
+ };
329
+ await addPlanToIndex(options.projectPath, planEntry);
330
+ }
331
+ return globalPlanPath;
332
+ }
333
+ catch {
334
+ return null;
335
+ }
336
+ }
337
+ /**
338
+ * Check if a plan is already archived.
339
+ * @param projectId The projectId (encoded path) to check
340
+ */
341
+ export async function isPlanArchived(projectId, planName) {
342
+ try {
343
+ await fs.access(getPlanPath(projectId, planName));
344
+ return true;
345
+ }
346
+ catch {
347
+ return false;
348
+ }
349
+ }
350
+ // ============================================================
351
+ // Archive Settings
352
+ // ============================================================
353
+ /**
354
+ * Read archive settings from global config.
355
+ */
356
+ export async function readArchiveSettings() {
357
+ try {
358
+ const content = await fs.readFile(GLOBAL_CONFIG_PATH, "utf-8");
359
+ const config = JSON.parse(content);
360
+ return {
361
+ ...getDefaultArchiveSettings(),
362
+ ...config.archive,
363
+ };
364
+ }
365
+ catch {
366
+ return getDefaultArchiveSettings();
367
+ }
368
+ }
369
+ /**
370
+ * Write archive settings to global config.
371
+ */
372
+ export async function writeArchiveSettings(settings) {
373
+ // Read existing config
374
+ let config = {};
375
+ try {
376
+ const content = await fs.readFile(GLOBAL_CONFIG_PATH, "utf-8");
377
+ config = JSON.parse(content);
378
+ }
379
+ catch {
380
+ // File doesn't exist, start fresh
381
+ }
382
+ // Update archive settings
383
+ config.archive = settings;
384
+ // Write back
385
+ await fs.mkdir(path.dirname(GLOBAL_CONFIG_PATH), { recursive: true });
386
+ await fs.writeFile(GLOBAL_CONFIG_PATH, JSON.stringify(config, null, 2));
387
+ }
388
+ // ============================================================
389
+ // Full Archive Flow
390
+ // ============================================================
391
+ /**
392
+ * Helper: Update session link for an already-archived plan.
393
+ */
394
+ async function updatePlanSessionLink(projectPath, planFilename, sessionId, planContent) {
395
+ const { readProjectIndex } = await import("../context/indexer.js");
396
+ const index = await readProjectIndex(projectPath);
397
+ // Find the plan entry by filename
398
+ const existingPlan = index.plans.find((p) => p.filename === planFilename);
399
+ if (existingPlan) {
400
+ // Update with merged session IDs
401
+ const titleMatch = planContent.match(/^#\s+(.+)$/m);
402
+ const title = titleMatch ? titleMatch[1] : path.basename(planFilename, ".md");
403
+ const updatedPlan = {
404
+ ...existingPlan,
405
+ updatedAt: new Date().toISOString(),
406
+ sessions: [...new Set([...existingPlan.sessions, sessionId])],
407
+ };
408
+ await addPlanToIndex(projectPath, updatedPlan);
409
+ }
410
+ }
411
+ /**
412
+ * Archive a conversation (full flow).
413
+ * 1. Save manifest to global archive
414
+ * 2. Save conversation to global (and optionally local) archive
415
+ * 3. Archive any new plans
416
+ * 4. Update global search index
417
+ *
418
+ * Note: Local project index is updated automatically by saveConversation
419
+ */
420
+ export async function archiveConversation(conversation, manifest, options = {}) {
421
+ // 1. Save manifest
422
+ await saveManifest(manifest);
423
+ const manifestPath = getManifestPath(manifest.id);
424
+ // 2. Save conversation (also updates unified project index)
425
+ const { globalPath: conversationPath, localPath, filename, } = await saveConversation(conversation, manifest, options);
426
+ // 3. Archive plans
427
+ const plansArchived = [];
428
+ for (const planRef of manifest.plans) {
429
+ try {
430
+ // Read plan content to extract title for filename
431
+ const planContent = await fs.readFile(planRef.path, "utf-8");
432
+ const planStats = await fs.stat(planRef.path);
433
+ const planFilename = generateArchivePlanFilename(planRef.path, {
434
+ content: planContent,
435
+ createdAt: planStats.mtime,
436
+ });
437
+ const isArchived = await isPlanArchived(manifest.projectId, planFilename);
438
+ if (!isArchived) {
439
+ const archivedPath = await archivePlan(planRef.path, {
440
+ saveToLocal: options.saveToLocal,
441
+ projectPath: manifest.projectPath,
442
+ projectId: manifest.projectId,
443
+ sessionId: manifest.id,
444
+ });
445
+ if (archivedPath) {
446
+ plansArchived.push(archivedPath);
447
+ }
448
+ }
449
+ else {
450
+ // Plan already archived, just update session link
451
+ if (options.saveToLocal !== false && manifest.projectPath) {
452
+ await updatePlanSessionLink(manifest.projectPath, planFilename, manifest.id, planContent);
453
+ }
454
+ }
455
+ }
456
+ catch {
457
+ // Plan file may not exist anymore, skip it
458
+ }
459
+ }
460
+ // 4. Update global search index
461
+ const index = await readGlobalIndex();
462
+ addToIndex(index, manifest);
463
+ await writeGlobalIndex(index);
464
+ return {
465
+ manifestPath,
466
+ conversationPath,
467
+ localPath,
468
+ filename,
469
+ plansArchived,
470
+ };
471
+ }
472
+ // ============================================================
473
+ // Search Operations
474
+ // ============================================================
475
+ /**
476
+ * Search conversations with filters.
477
+ */
478
+ export async function searchConversations(input) {
479
+ const index = await readGlobalIndex();
480
+ // Get initial results from index
481
+ const indexResults = searchIndex(index, input.query);
482
+ // Load manifests and apply filters
483
+ const filteredResults = [];
484
+ for (const { id, score } of indexResults) {
485
+ const manifest = await readManifest(id);
486
+ if (!manifest)
487
+ continue;
488
+ // Apply filters
489
+ // Support filtering by either projectId or projectSlug for backward compatibility
490
+ if (input.project && manifest.projectId !== input.project && manifest.projectSlug !== input.project) {
491
+ continue;
492
+ }
493
+ if (input.dateFrom && manifest.endedAt < input.dateFrom) {
494
+ continue;
495
+ }
496
+ if (input.dateTo && manifest.endedAt > input.dateTo) {
497
+ continue;
498
+ }
499
+ if (input.technologies && input.technologies.length > 0) {
500
+ const hasTech = input.technologies.some((t) => manifest.technologies.includes(t.toLowerCase()));
501
+ if (!hasTech)
502
+ continue;
503
+ }
504
+ filteredResults.push({ manifest, score });
505
+ }
506
+ // Apply pagination
507
+ const limit = Math.min(input.limit || 10, 50);
508
+ const offset = input.offset || 0;
509
+ const totalMatches = filteredResults.length;
510
+ const paginatedResults = filteredResults.slice(offset, offset + limit);
511
+ // Transform to SearchResult format
512
+ const results = paginatedResults.map(({ manifest, score }, idx) => ({
513
+ rank: offset + idx + 1,
514
+ id: manifest.id,
515
+ score,
516
+ title: manifest.title,
517
+ project: manifest.projectSlug,
518
+ date: manifest.endedAt.split("T")[0],
519
+ preview: manifest.userQuestions[0] || "",
520
+ filesModified: manifest.filesModified.slice(0, 5),
521
+ technologies: manifest.technologies,
522
+ messageCount: manifest.messageCount,
523
+ durationMinutes: manifest.durationMinutes,
524
+ }));
525
+ return {
526
+ query: input.query,
527
+ filters: {
528
+ project: input.project,
529
+ dateFrom: input.dateFrom,
530
+ dateTo: input.dateTo,
531
+ technologies: input.technologies,
532
+ },
533
+ totalMatches,
534
+ showing: {
535
+ from: offset + 1,
536
+ to: Math.min(offset + limit, totalMatches),
537
+ },
538
+ hasMore: offset + limit < totalMatches,
539
+ results,
540
+ };
541
+ }
542
+ // ============================================================
543
+ // Statistics
544
+ // ============================================================
545
+ /**
546
+ * Get archive statistics.
547
+ */
548
+ export async function getArchiveStats() {
549
+ const index = await readGlobalIndex();
550
+ // Calculate total size
551
+ let totalSizeBytes = 0;
552
+ try {
553
+ const manifestIds = await listManifests();
554
+ for (const id of manifestIds) {
555
+ try {
556
+ const stats = await fs.stat(getManifestPath(id));
557
+ totalSizeBytes += stats.size;
558
+ }
559
+ catch {
560
+ // Skip missing files
561
+ }
562
+ }
563
+ // Add conversation sizes
564
+ const convDir = path.join(GLOBAL_ARCHIVE_PATH, "conversations");
565
+ totalSizeBytes += await calculateDirectorySize(convDir);
566
+ }
567
+ catch {
568
+ // Archive doesn't exist yet
569
+ }
570
+ return {
571
+ totalConversations: index.metadata.totalConversations,
572
+ totalProjects: Object.keys(index.projects).length,
573
+ totalSizeBytes,
574
+ sizeFormatted: formatFileSize(totalSizeBytes),
575
+ };
576
+ }
577
+ /**
578
+ * Calculate total size of a directory recursively.
579
+ */
580
+ async function calculateDirectorySize(dirPath) {
581
+ let totalSize = 0;
582
+ try {
583
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
584
+ for (const entry of entries) {
585
+ const fullPath = path.join(dirPath, entry.name);
586
+ if (entry.isDirectory()) {
587
+ totalSize += await calculateDirectorySize(fullPath);
588
+ }
589
+ else if (entry.isFile()) {
590
+ const stats = await fs.stat(fullPath);
591
+ totalSize += stats.size;
592
+ }
593
+ }
594
+ }
595
+ catch {
596
+ // Directory doesn't exist
597
+ }
598
+ return totalSize;
599
+ }
600
+ /**
601
+ * Format file size in human-readable format.
602
+ */
603
+ function formatFileSize(bytes) {
604
+ if (bytes < 1024) {
605
+ return `${bytes} B`;
606
+ }
607
+ if (bytes < 1024 * 1024) {
608
+ return `${(bytes / 1024).toFixed(1)} KB`;
609
+ }
610
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
611
+ }
612
+ //# sourceMappingURL=archive-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-store.js","sourceRoot":"","sources":["../../src/archive/archive-store.ts"],"names":[],"mappings":"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"}