@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,228 @@
1
+ /**
2
+ * Obsidian Integration
3
+ *
4
+ * Detects Obsidian vaults and lists markdown files from a vault.
5
+ */
6
+ import { promises as fs } from "fs";
7
+ import { existsSync, readFileSync } from "fs";
8
+ import { homedir } from "os";
9
+ import { join, basename, relative } from "path";
10
+ // macOS Obsidian config location
11
+ const OBSIDIAN_CONFIG_PATH = join(homedir(), "Library", "Application Support", "obsidian", "obsidian.json");
12
+ /**
13
+ * Detect installed Obsidian vaults from system configuration.
14
+ * Returns empty array if Obsidian is not installed or no vaults found.
15
+ */
16
+ export async function detectObsidianVaults() {
17
+ try {
18
+ if (!existsSync(OBSIDIAN_CONFIG_PATH)) {
19
+ return [];
20
+ }
21
+ const content = readFileSync(OBSIDIAN_CONFIG_PATH, "utf-8");
22
+ const config = JSON.parse(content);
23
+ if (!config.vaults || typeof config.vaults !== "object") {
24
+ return [];
25
+ }
26
+ const vaults = [];
27
+ for (const [id, vault] of Object.entries(config.vaults)) {
28
+ if (vault && typeof vault.path === "string") {
29
+ vaults.push({
30
+ id,
31
+ path: vault.path,
32
+ name: basename(vault.path),
33
+ isOpen: vault.open === true,
34
+ });
35
+ }
36
+ }
37
+ // Sort by open status (open vaults first), then by name
38
+ return vaults.sort((a, b) => {
39
+ if (a.isOpen && !b.isOpen)
40
+ return -1;
41
+ if (!a.isOpen && b.isOpen)
42
+ return 1;
43
+ return a.name.localeCompare(b.name);
44
+ });
45
+ }
46
+ catch {
47
+ return [];
48
+ }
49
+ }
50
+ /**
51
+ * Validate that a path is a valid Obsidian vault.
52
+ * A vault must have a .obsidian directory.
53
+ */
54
+ export function validateVaultPath(vaultPath) {
55
+ try {
56
+ const obsidianDir = join(vaultPath, ".obsidian");
57
+ return existsSync(vaultPath) && existsSync(obsidianDir);
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * List all markdown files in an Obsidian vault.
65
+ * Skips hidden directories (starting with .) and the .obsidian folder.
66
+ */
67
+ export async function listVaultFiles(vaultPath) {
68
+ const files = [];
69
+ async function walkDirectory(dirPath) {
70
+ try {
71
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
72
+ for (const entry of entries) {
73
+ const fullPath = join(dirPath, entry.name);
74
+ // Skip hidden directories and .obsidian
75
+ if (entry.isDirectory()) {
76
+ if (entry.name.startsWith(".")) {
77
+ continue;
78
+ }
79
+ await walkDirectory(fullPath);
80
+ }
81
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
82
+ try {
83
+ const stats = await fs.stat(fullPath);
84
+ files.push({
85
+ path: fullPath,
86
+ relativePath: relative(vaultPath, fullPath),
87
+ name: entry.name.replace(/\.md$/, ""),
88
+ sizeBytes: stats.size,
89
+ modifiedAt: stats.mtime,
90
+ });
91
+ }
92
+ catch {
93
+ // Skip files we can't stat
94
+ }
95
+ }
96
+ }
97
+ }
98
+ catch {
99
+ // Skip directories we can't read
100
+ }
101
+ }
102
+ await walkDirectory(vaultPath);
103
+ // Sort by modification time (most recent first)
104
+ return files.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());
105
+ }
106
+ /**
107
+ * Get vault name from path
108
+ */
109
+ export function getVaultName(vaultPath) {
110
+ return basename(vaultPath);
111
+ }
112
+ /**
113
+ * Build a tree structure from flat file list
114
+ */
115
+ export function buildFileTree(files) {
116
+ const root = { children: new Map() };
117
+ for (const file of files) {
118
+ const parts = file.relativePath.split("/");
119
+ let current = root;
120
+ let currentPath = "";
121
+ for (let i = 0; i < parts.length; i++) {
122
+ const part = parts[i];
123
+ currentPath = currentPath ? `${currentPath}/${part}` : part;
124
+ const isFile = i === parts.length - 1;
125
+ if (!current.children.has(part)) {
126
+ const node = {
127
+ id: currentPath,
128
+ name: isFile ? file.name : part,
129
+ type: isFile ? "file" : "folder",
130
+ depth: i,
131
+ path: isFile ? file.path : currentPath,
132
+ relativePath: currentPath,
133
+ ...(isFile
134
+ ? { sizeBytes: file.sizeBytes, modifiedAt: file.modifiedAt }
135
+ : { children: [], fileCount: 0 }),
136
+ };
137
+ current.children.set(part, { node, children: new Map() });
138
+ }
139
+ current = current.children.get(part);
140
+ }
141
+ }
142
+ // Convert builder to array structure
143
+ function builderToArray(builder) {
144
+ const result = [];
145
+ for (const child of builder.children.values()) {
146
+ if (child.node) {
147
+ if (child.node.type === "folder") {
148
+ child.node.children = builderToArray(child);
149
+ }
150
+ result.push(child.node);
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ const result = builderToArray(root);
156
+ countFilesRecursive(result);
157
+ sortTree(result);
158
+ return result;
159
+ }
160
+ /**
161
+ * Count files in each folder recursively
162
+ */
163
+ function countFilesRecursive(nodes) {
164
+ let count = 0;
165
+ for (const node of nodes) {
166
+ if (node.type === "file") {
167
+ count++;
168
+ }
169
+ else if (node.children) {
170
+ node.fileCount = countFilesRecursive(node.children);
171
+ count += node.fileCount;
172
+ }
173
+ }
174
+ return count;
175
+ }
176
+ /**
177
+ * Sort tree: folders first, then alphabetically
178
+ */
179
+ function sortTree(nodes) {
180
+ nodes.sort((a, b) => {
181
+ // Folders before files
182
+ if (a.type !== b.type) {
183
+ return a.type === "folder" ? -1 : 1;
184
+ }
185
+ // Alphabetically within same type
186
+ return a.name.localeCompare(b.name);
187
+ });
188
+ // Recursively sort children
189
+ for (const node of nodes) {
190
+ if (node.children) {
191
+ sortTree(node.children);
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * Flatten tree into list for rendering, respecting expanded state
197
+ */
198
+ export function flattenTree(nodes, expandedFolders, depth = 0) {
199
+ const result = [];
200
+ for (const node of nodes) {
201
+ const isExpanded = expandedFolders.has(node.id);
202
+ result.push({
203
+ id: node.id,
204
+ name: node.name,
205
+ type: node.type,
206
+ depth: depth,
207
+ path: node.path,
208
+ relativePath: node.relativePath,
209
+ sizeBytes: node.sizeBytes,
210
+ modifiedAt: node.modifiedAt,
211
+ isExpanded: node.type === "folder" ? isExpanded : undefined,
212
+ fileCount: node.fileCount,
213
+ });
214
+ // Add children if folder is expanded
215
+ if (node.type === "folder" && isExpanded && node.children) {
216
+ result.push(...flattenTree(node.children, expandedFolders, depth + 1));
217
+ }
218
+ }
219
+ return result;
220
+ }
221
+ /**
222
+ * Get file tree from vault - builds tree structure from files
223
+ */
224
+ export async function getVaultFileTree(vaultPath) {
225
+ const files = await listVaultFiles(vaultPath);
226
+ return buildFileTree(files);
227
+ }
228
+ //# sourceMappingURL=obsidian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../src/sources/obsidian.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Source Types
3
+ *
4
+ * Type definitions for external context sources (Obsidian, Google Docs, Notion).
5
+ */
6
+ /**
7
+ * OAuth tokens for API access
8
+ */
9
+ export interface OAuthTokens {
10
+ access_token: string;
11
+ refresh_token?: string;
12
+ expires_at?: number;
13
+ }
14
+ /**
15
+ * Jacques global configuration stored in ~/.jacques/config.json
16
+ */
17
+ export interface JacquesConfig {
18
+ version: string;
19
+ /** Path to Claude's .claude directory (defaults to ~/.claude) */
20
+ rootPath?: string;
21
+ sources: {
22
+ obsidian?: ObsidianSourceConfig;
23
+ googleDocs?: GoogleDocsSourceConfig;
24
+ notion?: NotionSourceConfig;
25
+ };
26
+ }
27
+ /**
28
+ * Obsidian-specific configuration
29
+ */
30
+ export interface ObsidianSourceConfig {
31
+ enabled: boolean;
32
+ vaultPath?: string;
33
+ configuredAt?: string;
34
+ }
35
+ /**
36
+ * Google Docs source configuration
37
+ */
38
+ export interface GoogleDocsSourceConfig {
39
+ enabled: boolean;
40
+ client_id?: string;
41
+ client_secret?: string;
42
+ tokens?: OAuthTokens;
43
+ connected_email?: string;
44
+ configured_at?: string;
45
+ }
46
+ /**
47
+ * Notion source configuration
48
+ */
49
+ export interface NotionSourceConfig {
50
+ enabled: boolean;
51
+ client_id?: string;
52
+ client_secret?: string;
53
+ tokens?: OAuthTokens;
54
+ workspace_id?: string;
55
+ workspace_name?: string;
56
+ configured_at?: string;
57
+ }
58
+ /**
59
+ * Google Drive file from API
60
+ */
61
+ export interface GoogleDriveFile {
62
+ id: string;
63
+ name: string;
64
+ mimeType: string;
65
+ modifiedTime: string;
66
+ parents?: string[];
67
+ size?: string;
68
+ }
69
+ /**
70
+ * Notion page from API
71
+ */
72
+ export interface NotionPage {
73
+ id: string;
74
+ title: string;
75
+ parent_type: "workspace" | "page" | "database";
76
+ parent_id?: string;
77
+ last_edited_time: string;
78
+ icon?: string;
79
+ }
80
+ /**
81
+ * Detected Obsidian vault from system
82
+ */
83
+ export interface ObsidianVault {
84
+ id: string;
85
+ path: string;
86
+ name: string;
87
+ isOpen?: boolean;
88
+ }
89
+ /**
90
+ * Markdown file within an Obsidian vault
91
+ */
92
+ export interface ObsidianFile {
93
+ path: string;
94
+ relativePath: string;
95
+ name: string;
96
+ sizeBytes: number;
97
+ modifiedAt: Date;
98
+ }
99
+ /**
100
+ * Tree node for file explorer (can be folder or file)
101
+ */
102
+ export interface FileTreeNode {
103
+ id: string;
104
+ name: string;
105
+ type: "folder" | "file";
106
+ depth: number;
107
+ path: string;
108
+ relativePath: string;
109
+ sizeBytes?: number;
110
+ modifiedAt?: Date;
111
+ children?: FileTreeNode[];
112
+ fileCount?: number;
113
+ }
114
+ /**
115
+ * Flattened tree item for rendering (includes expansion state)
116
+ */
117
+ export interface FlatTreeItem {
118
+ id: string;
119
+ name: string;
120
+ type: "folder" | "file";
121
+ depth: number;
122
+ path: string;
123
+ relativePath: string;
124
+ sizeBytes?: number;
125
+ modifiedAt?: Date;
126
+ isExpanded?: boolean;
127
+ fileCount?: number;
128
+ }
129
+ /**
130
+ * Default empty configuration
131
+ */
132
+ export declare function getDefaultConfig(): JacquesConfig;
133
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Source Types
3
+ *
4
+ * Type definitions for external context sources (Obsidian, Google Docs, Notion).
5
+ */
6
+ /**
7
+ * Default empty configuration
8
+ */
9
+ export function getDefaultConfig() {
10
+ return {
11
+ version: "1.0.0",
12
+ sources: {
13
+ obsidian: { enabled: false },
14
+ googleDocs: { enabled: false },
15
+ notion: { enabled: false },
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0IH;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE;YACP,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YAC5B,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YAC9B,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SAC3B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Storage module exports
3
+ */
4
+ export { saveContext, saveToArchive, generateFilename, formatFileSize, listSavedContexts, ensureContextDirectory, } from "./writer.js";
5
+ export type { WriteOptions, WriteResult, SaveToArchiveOptions, SaveToArchiveResult, } from "./writer.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Storage module exports
3
+ */
4
+ export { saveContext, saveToArchive, generateFilename, formatFileSize, listSavedContexts, ensureContextDirectory, } from "./writer.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Storage Writer
3
+ *
4
+ * Saves context JSON files to .context/saved/ directory and global archive.
5
+ * Naming convention: [YYYY-MM-DD]_[session-id-short]_[optional-label].json
6
+ */
7
+ import type { SavedContext } from "../session/transformer.js";
8
+ import { FilterType } from "../session/filters.js";
9
+ import type { ParsedEntry } from "../session/parser.js";
10
+ export interface WriteOptions {
11
+ /** Working directory (where .context/ will be created) */
12
+ cwd?: string;
13
+ /** Optional user-provided label */
14
+ label?: string;
15
+ /** Filter type applied */
16
+ filterType?: FilterType;
17
+ }
18
+ export interface WriteResult {
19
+ /** Full path to the saved file */
20
+ filePath: string;
21
+ /** Relative path from cwd */
22
+ relativePath: string;
23
+ /** File size in bytes */
24
+ sizeBytes: number;
25
+ /** Human-readable file size */
26
+ sizeFormatted: string;
27
+ }
28
+ /**
29
+ * Save context to .context/saved/ directory.
30
+ */
31
+ export declare function saveContext(context: SavedContext, options?: WriteOptions): Promise<WriteResult>;
32
+ /**
33
+ * Generate a filename for the saved context.
34
+ * Format: [YYYY-MM-DD]_[session-id-short]_[filter-suffix]_[optional-label].json
35
+ */
36
+ export declare function generateFilename(sessionId: string, filterType: FilterType, label?: string): string;
37
+ /**
38
+ * Format file size in human-readable format.
39
+ */
40
+ export declare function formatFileSize(bytes: number): string;
41
+ /**
42
+ * List all saved context files in .context/saved/
43
+ */
44
+ export declare function listSavedContexts(cwd?: string): Promise<Array<{
45
+ filePath: string;
46
+ filename: string;
47
+ modifiedAt: Date;
48
+ sizeBytes: number;
49
+ }>>;
50
+ /**
51
+ * Check if .context/ directory exists and create if needed.
52
+ */
53
+ export declare function ensureContextDirectory(cwd?: string): Promise<string>;
54
+ export interface SaveToArchiveOptions {
55
+ /** Working directory (project path) */
56
+ cwd?: string;
57
+ /** Optional user-provided label */
58
+ label?: string;
59
+ /** Filter type applied */
60
+ filterType?: FilterType;
61
+ /** Original JSONL file path */
62
+ jsonlPath: string;
63
+ /** Parsed entries (for manifest extraction) */
64
+ entries: ParsedEntry[];
65
+ }
66
+ export interface SaveToArchiveResult {
67
+ /** Session filename (readable format) */
68
+ filename: string;
69
+ /** Local project path */
70
+ localPath: string;
71
+ /** Global archive path */
72
+ globalPath: string;
73
+ /** File size formatted */
74
+ sizeFormatted: string;
75
+ /** Plans that were archived */
76
+ plansArchived: string[];
77
+ }
78
+ /**
79
+ * Save context to both global archive and local project .jacques/sessions/.
80
+ * This is the main save function that archives conversations for cross-project search.
81
+ *
82
+ * Filename format: YYYY-MM-DD_HH-MM_title-slug_id.json
83
+ * Example: 2026-01-31_14-30_jwt-auth-setup_8d84.json
84
+ */
85
+ export declare function saveToArchive(context: SavedContext, options: SaveToArchiveOptions): Promise<SaveToArchiveResult>;
86
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/storage/writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAkB,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CACR,KAAK,CAAC;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CACH,CA8BA;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E;AAMD,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAgC9B"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Storage Writer
3
+ *
4
+ * Saves context JSON files to .context/saved/ directory and global archive.
5
+ * Naming convention: [YYYY-MM-DD]_[session-id-short]_[optional-label].json
6
+ */
7
+ import { promises as fs } from "fs";
8
+ import * as path from "path";
9
+ import { FilterType, FILTER_CONFIGS } from "../session/filters.js";
10
+ import { extractManifestFromEntries, archiveConversation, } from "../archive/index.js";
11
+ /**
12
+ * Save context to .context/saved/ directory.
13
+ */
14
+ export async function saveContext(context, options = {}) {
15
+ const cwd = options.cwd || process.cwd();
16
+ const label = options.label;
17
+ const filterType = options.filterType || FilterType.EVERYTHING;
18
+ // Ensure .context/saved/ directory exists
19
+ const savedDir = path.join(cwd, ".context", "saved");
20
+ await fs.mkdir(savedDir, { recursive: true });
21
+ // Generate filename
22
+ const filename = generateFilename(context.session.id, filterType, label);
23
+ const filePath = path.join(savedDir, filename);
24
+ const relativePath = path.join(".context", "saved", filename);
25
+ // Serialize to JSON with pretty formatting
26
+ const jsonContent = JSON.stringify(context, null, 2);
27
+ // Write to file
28
+ await fs.writeFile(filePath, jsonContent, "utf-8");
29
+ // Get file size
30
+ const stats = await fs.stat(filePath);
31
+ const sizeBytes = stats.size;
32
+ return {
33
+ filePath,
34
+ relativePath,
35
+ sizeBytes,
36
+ sizeFormatted: formatFileSize(sizeBytes),
37
+ };
38
+ }
39
+ /**
40
+ * Generate a filename for the saved context.
41
+ * Format: [YYYY-MM-DD]_[session-id-short]_[filter-suffix]_[optional-label].json
42
+ */
43
+ export function generateFilename(sessionId, filterType, label) {
44
+ const date = new Date().toISOString().split("T")[0]; // YYYY-MM-DD
45
+ const shortId = sessionId.substring(0, 8);
46
+ const suffix = FILTER_CONFIGS[filterType].suffix;
47
+ if (label && label.trim()) {
48
+ // Sanitize label: only alphanumeric, dash, underscore
49
+ const sanitizedLabel = label
50
+ .trim()
51
+ .toLowerCase()
52
+ .replace(/[^a-z0-9_-]/g, "-")
53
+ .replace(/-+/g, "-")
54
+ .substring(0, 50); // Limit length
55
+ return `${date}_${shortId}${suffix}_${sanitizedLabel}.json`;
56
+ }
57
+ return `${date}_${shortId}${suffix}.json`;
58
+ }
59
+ /**
60
+ * Format file size in human-readable format.
61
+ */
62
+ export function formatFileSize(bytes) {
63
+ if (bytes < 1024) {
64
+ return `${bytes} B`;
65
+ }
66
+ if (bytes < 1024 * 1024) {
67
+ return `${(bytes / 1024).toFixed(1)} KB`;
68
+ }
69
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
70
+ }
71
+ /**
72
+ * List all saved context files in .context/saved/
73
+ */
74
+ export async function listSavedContexts(cwd) {
75
+ const baseDir = cwd || process.cwd();
76
+ const savedDir = path.join(baseDir, ".context", "saved");
77
+ try {
78
+ await fs.access(savedDir);
79
+ }
80
+ catch {
81
+ return []; // Directory doesn't exist
82
+ }
83
+ const files = await fs.readdir(savedDir);
84
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
85
+ const fileInfos = await Promise.all(jsonFiles.map(async (filename) => {
86
+ const filePath = path.join(savedDir, filename);
87
+ const stats = await fs.stat(filePath);
88
+ return {
89
+ filePath,
90
+ filename,
91
+ modifiedAt: stats.mtime,
92
+ sizeBytes: stats.size,
93
+ };
94
+ }));
95
+ // Sort by modification time (most recent first)
96
+ return fileInfos.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());
97
+ }
98
+ /**
99
+ * Check if .context/ directory exists and create if needed.
100
+ */
101
+ export async function ensureContextDirectory(cwd) {
102
+ const baseDir = cwd || process.cwd();
103
+ const contextDir = path.join(baseDir, ".context", "saved");
104
+ await fs.mkdir(contextDir, { recursive: true });
105
+ return contextDir;
106
+ }
107
+ /**
108
+ * Save context to both global archive and local project .jacques/sessions/.
109
+ * This is the main save function that archives conversations for cross-project search.
110
+ *
111
+ * Filename format: YYYY-MM-DD_HH-MM_title-slug_id.json
112
+ * Example: 2026-01-31_14-30_jwt-auth-setup_8d84.json
113
+ */
114
+ export async function saveToArchive(context, options) {
115
+ const cwd = options.cwd || process.cwd();
116
+ // 1. Extract manifest from entries
117
+ const manifest = await extractManifestFromEntries(options.entries, cwd, options.jsonlPath, {
118
+ userLabel: options.label,
119
+ autoArchived: false,
120
+ });
121
+ // 2. Archive to global ~/.jacques/archive/ AND local .jacques/sessions/
122
+ const archiveResult = await archiveConversation(context, manifest, {
123
+ saveToLocal: true,
124
+ });
125
+ // Calculate size for display
126
+ const jsonContent = JSON.stringify(context, null, 2);
127
+ const sizeBytes = Buffer.byteLength(jsonContent, "utf-8");
128
+ return {
129
+ filename: archiveResult.filename,
130
+ localPath: archiveResult.localPath ||
131
+ `.jacques/sessions/${archiveResult.filename}`,
132
+ globalPath: archiveResult.conversationPath,
133
+ sizeFormatted: formatFileSize(sizeBytes),
134
+ plansArchived: archiveResult.plansArchived,
135
+ };
136
+ }
137
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/storage/writer.ts"],"names":[],"mappings":"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"}