@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,91 @@
1
+ /**
2
+ * Jacques Configuration
3
+ *
4
+ * Reads and writes ~/.jacques/config.json for external source settings.
5
+ */
6
+ import type { JacquesConfig, GoogleDocsSourceConfig, NotionSourceConfig, OAuthTokens } from "./types.js";
7
+ /**
8
+ * Read Jacques configuration from ~/.jacques/config.json
9
+ */
10
+ export declare function getJacquesConfig(): JacquesConfig;
11
+ /**
12
+ * Write Jacques configuration to ~/.jacques/config.json
13
+ */
14
+ export declare function saveJacquesConfig(config: JacquesConfig): boolean;
15
+ /**
16
+ * Check if Obsidian is configured with a valid vault path
17
+ */
18
+ export declare function isObsidianConfigured(): boolean;
19
+ /**
20
+ * Configure Obsidian vault path
21
+ */
22
+ export declare function configureObsidian(vaultPath: string): boolean;
23
+ /**
24
+ * Get configured Obsidian vault path, or null if not configured
25
+ */
26
+ export declare function getObsidianVaultPath(): string | null;
27
+ /**
28
+ * Check if Google Docs is configured with valid tokens
29
+ */
30
+ export declare function isGoogleDocsConfigured(): boolean;
31
+ /**
32
+ * Get Google Docs configuration
33
+ */
34
+ export declare function getGoogleDocsConfig(): GoogleDocsSourceConfig | null;
35
+ /**
36
+ * Configure Google Docs with OAuth tokens
37
+ */
38
+ export declare function configureGoogleDocs(options: {
39
+ client_id: string;
40
+ client_secret: string;
41
+ tokens: OAuthTokens;
42
+ connected_email?: string;
43
+ }): boolean;
44
+ /**
45
+ * Update Google Docs tokens (e.g., after refresh)
46
+ */
47
+ export declare function updateGoogleDocsTokens(tokens: OAuthTokens): boolean;
48
+ /**
49
+ * Disconnect Google Docs
50
+ */
51
+ export declare function disconnectGoogleDocs(): boolean;
52
+ /**
53
+ * Check if Notion is configured with valid tokens
54
+ */
55
+ export declare function isNotionConfigured(): boolean;
56
+ /**
57
+ * Get Notion configuration
58
+ */
59
+ export declare function getNotionConfig(): NotionSourceConfig | null;
60
+ /**
61
+ * Configure Notion with OAuth tokens
62
+ */
63
+ export declare function configureNotion(options: {
64
+ client_id: string;
65
+ client_secret: string;
66
+ tokens: OAuthTokens;
67
+ workspace_id?: string;
68
+ workspace_name?: string;
69
+ }): boolean;
70
+ /**
71
+ * Disconnect Notion
72
+ */
73
+ export declare function disconnectNotion(): boolean;
74
+ /**
75
+ * Get the root catalog path (where Claude stores sessions)
76
+ * Returns configured path or default ~/.claude
77
+ */
78
+ export declare function getRootCatalogPath(): string;
79
+ /**
80
+ * Set the root catalog path
81
+ */
82
+ export declare function setRootCatalogPath(path: string): boolean;
83
+ /**
84
+ * Detect the default catalog path and check if it exists
85
+ * Returns the default path and whether it was found
86
+ */
87
+ export declare function detectDefaultCatalogPath(): {
88
+ path: string;
89
+ exists: boolean;
90
+ };
91
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sources/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzG;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAyChD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAUhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAMpD;AAID;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAOhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,sBAAsB,GAAG,IAAI,CAMnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAWV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAOnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAID;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAO5C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,kBAAkB,GAAG,IAAI,CAM3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAYV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAI1C;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAK5E"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Jacques Configuration
3
+ *
4
+ * Reads and writes ~/.jacques/config.json for external source settings.
5
+ */
6
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
7
+ import { homedir } from "os";
8
+ import { join } from "path";
9
+ import { getDefaultConfig } from "./types.js";
10
+ const JACQUES_DIR = join(homedir(), ".jacques");
11
+ const JACQUES_CONFIG_PATH = join(JACQUES_DIR, "config.json");
12
+ const DEFAULT_CLAUDE_DIR = join(homedir(), ".claude");
13
+ /**
14
+ * Read Jacques configuration from ~/.jacques/config.json
15
+ */
16
+ export function getJacquesConfig() {
17
+ try {
18
+ if (!existsSync(JACQUES_CONFIG_PATH)) {
19
+ return getDefaultConfig();
20
+ }
21
+ const content = readFileSync(JACQUES_CONFIG_PATH, "utf-8");
22
+ const parsed = JSON.parse(content);
23
+ // Merge with defaults to ensure all fields exist
24
+ const defaults = getDefaultConfig();
25
+ return {
26
+ version: parsed.version || defaults.version,
27
+ rootPath: parsed.rootPath,
28
+ sources: {
29
+ obsidian: {
30
+ enabled: parsed.sources?.obsidian?.enabled ?? defaults.sources.obsidian?.enabled ?? false,
31
+ vaultPath: parsed.sources?.obsidian?.vaultPath,
32
+ configuredAt: parsed.sources?.obsidian?.configuredAt,
33
+ },
34
+ googleDocs: {
35
+ enabled: parsed.sources?.googleDocs?.enabled ?? false,
36
+ client_id: parsed.sources?.googleDocs?.client_id,
37
+ client_secret: parsed.sources?.googleDocs?.client_secret,
38
+ tokens: parsed.sources?.googleDocs?.tokens,
39
+ connected_email: parsed.sources?.googleDocs?.connected_email,
40
+ configured_at: parsed.sources?.googleDocs?.configured_at,
41
+ },
42
+ notion: {
43
+ enabled: parsed.sources?.notion?.enabled ?? false,
44
+ client_id: parsed.sources?.notion?.client_id,
45
+ client_secret: parsed.sources?.notion?.client_secret,
46
+ tokens: parsed.sources?.notion?.tokens,
47
+ workspace_id: parsed.sources?.notion?.workspace_id,
48
+ workspace_name: parsed.sources?.notion?.workspace_name,
49
+ configured_at: parsed.sources?.notion?.configured_at,
50
+ },
51
+ },
52
+ };
53
+ }
54
+ catch {
55
+ return getDefaultConfig();
56
+ }
57
+ }
58
+ /**
59
+ * Write Jacques configuration to ~/.jacques/config.json
60
+ */
61
+ export function saveJacquesConfig(config) {
62
+ try {
63
+ if (!existsSync(JACQUES_DIR)) {
64
+ mkdirSync(JACQUES_DIR, { recursive: true });
65
+ }
66
+ writeFileSync(JACQUES_CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ /**
74
+ * Check if Obsidian is configured with a valid vault path
75
+ */
76
+ export function isObsidianConfigured() {
77
+ const config = getJacquesConfig();
78
+ return (config.sources.obsidian?.enabled === true &&
79
+ typeof config.sources.obsidian?.vaultPath === "string" &&
80
+ config.sources.obsidian.vaultPath.length > 0);
81
+ }
82
+ /**
83
+ * Configure Obsidian vault path
84
+ */
85
+ export function configureObsidian(vaultPath) {
86
+ const config = getJacquesConfig();
87
+ config.sources.obsidian = {
88
+ enabled: true,
89
+ vaultPath,
90
+ configuredAt: new Date().toISOString(),
91
+ };
92
+ return saveJacquesConfig(config);
93
+ }
94
+ /**
95
+ * Get configured Obsidian vault path, or null if not configured
96
+ */
97
+ export function getObsidianVaultPath() {
98
+ const config = getJacquesConfig();
99
+ if (isObsidianConfigured()) {
100
+ return config.sources.obsidian?.vaultPath || null;
101
+ }
102
+ return null;
103
+ }
104
+ // ===== Google Docs Configuration =====
105
+ /**
106
+ * Check if Google Docs is configured with valid tokens
107
+ */
108
+ export function isGoogleDocsConfigured() {
109
+ const config = getJacquesConfig();
110
+ return (config.sources.googleDocs?.enabled === true &&
111
+ typeof config.sources.googleDocs?.tokens?.access_token === "string" &&
112
+ config.sources.googleDocs.tokens.access_token.length > 0);
113
+ }
114
+ /**
115
+ * Get Google Docs configuration
116
+ */
117
+ export function getGoogleDocsConfig() {
118
+ const config = getJacquesConfig();
119
+ if (config.sources.googleDocs?.enabled) {
120
+ return config.sources.googleDocs;
121
+ }
122
+ return null;
123
+ }
124
+ /**
125
+ * Configure Google Docs with OAuth tokens
126
+ */
127
+ export function configureGoogleDocs(options) {
128
+ const config = getJacquesConfig();
129
+ config.sources.googleDocs = {
130
+ enabled: true,
131
+ client_id: options.client_id,
132
+ client_secret: options.client_secret,
133
+ tokens: options.tokens,
134
+ connected_email: options.connected_email,
135
+ configured_at: new Date().toISOString(),
136
+ };
137
+ return saveJacquesConfig(config);
138
+ }
139
+ /**
140
+ * Update Google Docs tokens (e.g., after refresh)
141
+ */
142
+ export function updateGoogleDocsTokens(tokens) {
143
+ const config = getJacquesConfig();
144
+ if (config.sources.googleDocs) {
145
+ config.sources.googleDocs.tokens = tokens;
146
+ return saveJacquesConfig(config);
147
+ }
148
+ return false;
149
+ }
150
+ /**
151
+ * Disconnect Google Docs
152
+ */
153
+ export function disconnectGoogleDocs() {
154
+ const config = getJacquesConfig();
155
+ config.sources.googleDocs = { enabled: false };
156
+ return saveJacquesConfig(config);
157
+ }
158
+ // ===== Notion Configuration =====
159
+ /**
160
+ * Check if Notion is configured with valid tokens
161
+ */
162
+ export function isNotionConfigured() {
163
+ const config = getJacquesConfig();
164
+ return (config.sources.notion?.enabled === true &&
165
+ typeof config.sources.notion?.tokens?.access_token === "string" &&
166
+ config.sources.notion.tokens.access_token.length > 0);
167
+ }
168
+ /**
169
+ * Get Notion configuration
170
+ */
171
+ export function getNotionConfig() {
172
+ const config = getJacquesConfig();
173
+ if (config.sources.notion?.enabled) {
174
+ return config.sources.notion;
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Configure Notion with OAuth tokens
180
+ */
181
+ export function configureNotion(options) {
182
+ const config = getJacquesConfig();
183
+ config.sources.notion = {
184
+ enabled: true,
185
+ client_id: options.client_id,
186
+ client_secret: options.client_secret,
187
+ tokens: options.tokens,
188
+ workspace_id: options.workspace_id,
189
+ workspace_name: options.workspace_name,
190
+ configured_at: new Date().toISOString(),
191
+ };
192
+ return saveJacquesConfig(config);
193
+ }
194
+ /**
195
+ * Disconnect Notion
196
+ */
197
+ export function disconnectNotion() {
198
+ const config = getJacquesConfig();
199
+ config.sources.notion = { enabled: false };
200
+ return saveJacquesConfig(config);
201
+ }
202
+ // ===== Root Catalog Path Configuration =====
203
+ /**
204
+ * Get the root catalog path (where Claude stores sessions)
205
+ * Returns configured path or default ~/.claude
206
+ */
207
+ export function getRootCatalogPath() {
208
+ const config = getJacquesConfig();
209
+ return config.rootPath || DEFAULT_CLAUDE_DIR;
210
+ }
211
+ /**
212
+ * Set the root catalog path
213
+ */
214
+ export function setRootCatalogPath(path) {
215
+ const config = getJacquesConfig();
216
+ config.rootPath = path;
217
+ return saveJacquesConfig(config);
218
+ }
219
+ /**
220
+ * Detect the default catalog path and check if it exists
221
+ * Returns the default path and whether it was found
222
+ */
223
+ export function detectDefaultCatalogPath() {
224
+ return {
225
+ path: DEFAULT_CLAUDE_DIR,
226
+ exists: existsSync(DEFAULT_CLAUDE_DIR),
227
+ };
228
+ }
229
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/sources/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Google Docs Integration
3
+ *
4
+ * Lists files from Google Drive and exports Google Docs to plain text/markdown.
5
+ */
6
+ import type { OAuthTokens, GoogleDriveFile, FileTreeNode, FlatTreeItem } from "./types.js";
7
+ /**
8
+ * Refresh Google access token using refresh token
9
+ */
10
+ export declare function refreshGoogleToken(): Promise<OAuthTokens | null>;
11
+ /**
12
+ * List files from Google Drive
13
+ * Returns Google Docs and folders by default
14
+ */
15
+ export declare function listGoogleDriveFiles(folderId?: string, pageToken?: string): Promise<{
16
+ files: GoogleDriveFile[];
17
+ nextPageToken?: string;
18
+ } | null>;
19
+ /**
20
+ * List all files recursively (up to a limit)
21
+ */
22
+ export declare function listAllGoogleDriveFiles(folderId?: string, maxFiles?: number): Promise<GoogleDriveFile[]>;
23
+ /**
24
+ * Export Google Doc to plain text
25
+ */
26
+ export declare function exportGoogleDoc(docId: string): Promise<string | null>;
27
+ /**
28
+ * Get file metadata
29
+ */
30
+ export declare function getGoogleDriveFile(fileId: string): Promise<GoogleDriveFile | null>;
31
+ /**
32
+ * Build tree structure from flat file list
33
+ */
34
+ export declare function buildGoogleDocsTree(files: GoogleDriveFile[]): FileTreeNode[];
35
+ /**
36
+ * Flatten tree into list for rendering, respecting expanded state
37
+ */
38
+ export declare function flattenGoogleDocsTree(nodes: FileTreeNode[], expandedFolders: Set<string>, depth?: number): FlatTreeItem[];
39
+ /**
40
+ * Get Google Docs file tree
41
+ */
42
+ export declare function getGoogleDocsFileTree(folderId?: string): Promise<FileTreeNode[]>;
43
+ //# sourceMappingURL=googledocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googledocs.d.ts","sourceRoot":"","sources":["../../src/sources/googledocs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU3F;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqCtE;AAwDD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0BtE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,SAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAe5B;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyB3E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAGxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE,CAqE5E;AAoCD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EAAE,EACrB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,KAAK,SAAI,GACR,YAAY,EAAE,CAwBhB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGtF"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Google Docs Integration
3
+ *
4
+ * Lists files from Google Drive and exports Google Docs to plain text/markdown.
5
+ */
6
+ import { getGoogleDocsConfig, updateGoogleDocsTokens } from "./config.js";
7
+ const GOOGLE_DRIVE_API = "https://www.googleapis.com/drive/v3";
8
+ const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
9
+ // Google Docs MIME types
10
+ const GOOGLE_DOC_MIME = "application/vnd.google-apps.document";
11
+ const GOOGLE_FOLDER_MIME = "application/vnd.google-apps.folder";
12
+ /**
13
+ * Refresh Google access token using refresh token
14
+ */
15
+ export async function refreshGoogleToken() {
16
+ const config = getGoogleDocsConfig();
17
+ if (!config?.tokens?.refresh_token || !config.client_id || !config.client_secret) {
18
+ return null;
19
+ }
20
+ try {
21
+ const response = await fetch(GOOGLE_TOKEN_URL, {
22
+ method: "POST",
23
+ headers: {
24
+ "Content-Type": "application/x-www-form-urlencoded",
25
+ },
26
+ body: new URLSearchParams({
27
+ client_id: config.client_id,
28
+ client_secret: config.client_secret,
29
+ refresh_token: config.tokens.refresh_token,
30
+ grant_type: "refresh_token",
31
+ }),
32
+ });
33
+ if (!response.ok) {
34
+ return null;
35
+ }
36
+ const data = await response.json();
37
+ const newTokens = {
38
+ access_token: data.access_token,
39
+ refresh_token: config.tokens.refresh_token, // Keep existing refresh token
40
+ expires_at: Date.now() + (data.expires_in * 1000),
41
+ };
42
+ // Save updated tokens
43
+ updateGoogleDocsTokens(newTokens);
44
+ return newTokens;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Get valid access token, refreshing if needed
52
+ */
53
+ async function getValidToken() {
54
+ const config = getGoogleDocsConfig();
55
+ if (!config?.tokens?.access_token) {
56
+ return null;
57
+ }
58
+ // Check if token is expired (with 5 min buffer)
59
+ if (config.tokens.expires_at && config.tokens.expires_at < Date.now() + 300000) {
60
+ const newTokens = await refreshGoogleToken();
61
+ if (newTokens) {
62
+ return newTokens.access_token;
63
+ }
64
+ return null;
65
+ }
66
+ return config.tokens.access_token;
67
+ }
68
+ /**
69
+ * Make authenticated request to Google API
70
+ */
71
+ async function googleApiRequest(url, options = {}) {
72
+ const token = await getValidToken();
73
+ if (!token) {
74
+ return null;
75
+ }
76
+ try {
77
+ const response = await fetch(url, {
78
+ ...options,
79
+ headers: {
80
+ ...options.headers,
81
+ Authorization: `Bearer ${token}`,
82
+ },
83
+ });
84
+ if (!response.ok) {
85
+ console.error(`Google API error: ${response.status} ${response.statusText}`);
86
+ return null;
87
+ }
88
+ return response.json();
89
+ }
90
+ catch (error) {
91
+ console.error("Google API request failed:", error);
92
+ return null;
93
+ }
94
+ }
95
+ /**
96
+ * List files from Google Drive
97
+ * Returns Google Docs and folders by default
98
+ */
99
+ export async function listGoogleDriveFiles(folderId, pageToken) {
100
+ // Build query: Google Docs and folders only, not in trash
101
+ let query = "trashed = false and (mimeType = 'application/vnd.google-apps.document' or mimeType = 'application/vnd.google-apps.folder')";
102
+ if (folderId) {
103
+ query += ` and '${folderId}' in parents`;
104
+ }
105
+ const params = new URLSearchParams({
106
+ q: query,
107
+ fields: "nextPageToken,files(id,name,mimeType,modifiedTime,parents,size)",
108
+ pageSize: "100",
109
+ orderBy: "folder,name",
110
+ });
111
+ if (pageToken) {
112
+ params.set("pageToken", pageToken);
113
+ }
114
+ const url = `${GOOGLE_DRIVE_API}/files?${params}`;
115
+ const data = await googleApiRequest(url);
116
+ return data;
117
+ }
118
+ /**
119
+ * List all files recursively (up to a limit)
120
+ */
121
+ export async function listAllGoogleDriveFiles(folderId, maxFiles = 500) {
122
+ const allFiles = [];
123
+ let pageToken;
124
+ do {
125
+ const result = await listGoogleDriveFiles(folderId, pageToken);
126
+ if (!result)
127
+ break;
128
+ allFiles.push(...result.files);
129
+ pageToken = result.nextPageToken;
130
+ if (allFiles.length >= maxFiles)
131
+ break;
132
+ } while (pageToken);
133
+ return allFiles.slice(0, maxFiles);
134
+ }
135
+ /**
136
+ * Export Google Doc to plain text
137
+ */
138
+ export async function exportGoogleDoc(docId) {
139
+ const token = await getValidToken();
140
+ if (!token) {
141
+ return null;
142
+ }
143
+ try {
144
+ // Export as plain text
145
+ const url = `${GOOGLE_DRIVE_API}/files/${docId}/export?mimeType=text/plain`;
146
+ const response = await fetch(url, {
147
+ headers: {
148
+ Authorization: `Bearer ${token}`,
149
+ },
150
+ });
151
+ if (!response.ok) {
152
+ console.error(`Export failed: ${response.status} ${response.statusText}`);
153
+ return null;
154
+ }
155
+ return response.text();
156
+ }
157
+ catch (error) {
158
+ console.error("Export failed:", error);
159
+ return null;
160
+ }
161
+ }
162
+ /**
163
+ * Get file metadata
164
+ */
165
+ export async function getGoogleDriveFile(fileId) {
166
+ const url = `${GOOGLE_DRIVE_API}/files/${fileId}?fields=id,name,mimeType,modifiedTime,parents,size`;
167
+ return googleApiRequest(url);
168
+ }
169
+ /**
170
+ * Build tree structure from flat file list
171
+ */
172
+ export function buildGoogleDocsTree(files) {
173
+ // Separate folders and files
174
+ const folders = files.filter(f => f.mimeType === GOOGLE_FOLDER_MIME);
175
+ const docs = files.filter(f => f.mimeType === GOOGLE_DOC_MIME);
176
+ // Build folder lookup
177
+ const folderMap = new Map();
178
+ // Create root nodes for folders
179
+ for (const folder of folders) {
180
+ folderMap.set(folder.id, {
181
+ id: folder.id,
182
+ name: folder.name,
183
+ type: "folder",
184
+ depth: 0,
185
+ path: folder.id,
186
+ relativePath: folder.name,
187
+ children: [],
188
+ fileCount: 0,
189
+ });
190
+ }
191
+ // Build hierarchy
192
+ const rootNodes = [];
193
+ for (const folder of folders) {
194
+ const node = folderMap.get(folder.id);
195
+ const parentId = folder.parents?.[0];
196
+ if (parentId && folderMap.has(parentId)) {
197
+ // Add to parent
198
+ const parent = folderMap.get(parentId);
199
+ node.depth = parent.depth + 1;
200
+ node.relativePath = `${parent.relativePath}/${folder.name}`;
201
+ parent.children.push(node);
202
+ }
203
+ else {
204
+ // Root level folder
205
+ rootNodes.push(node);
206
+ }
207
+ }
208
+ // Add docs to their parent folders or root
209
+ for (const doc of docs) {
210
+ const parentId = doc.parents?.[0];
211
+ const docNode = {
212
+ id: doc.id,
213
+ name: doc.name,
214
+ type: "file",
215
+ depth: 0,
216
+ path: doc.id,
217
+ relativePath: doc.name,
218
+ modifiedAt: new Date(doc.modifiedTime),
219
+ };
220
+ if (parentId && folderMap.has(parentId)) {
221
+ const parent = folderMap.get(parentId);
222
+ docNode.depth = parent.depth + 1;
223
+ docNode.relativePath = `${parent.relativePath}/${doc.name}`;
224
+ parent.children.push(docNode);
225
+ }
226
+ else {
227
+ rootNodes.push(docNode);
228
+ }
229
+ }
230
+ // Count files and sort
231
+ countFilesRecursive(rootNodes);
232
+ sortTree(rootNodes);
233
+ return rootNodes;
234
+ }
235
+ /**
236
+ * Count files in each folder recursively
237
+ */
238
+ function countFilesRecursive(nodes) {
239
+ let count = 0;
240
+ for (const node of nodes) {
241
+ if (node.type === "file") {
242
+ count++;
243
+ }
244
+ else if (node.children) {
245
+ node.fileCount = countFilesRecursive(node.children);
246
+ count += node.fileCount;
247
+ }
248
+ }
249
+ return count;
250
+ }
251
+ /**
252
+ * Sort tree: folders first, then alphabetically
253
+ */
254
+ function sortTree(nodes) {
255
+ nodes.sort((a, b) => {
256
+ if (a.type !== b.type) {
257
+ return a.type === "folder" ? -1 : 1;
258
+ }
259
+ return a.name.localeCompare(b.name);
260
+ });
261
+ for (const node of nodes) {
262
+ if (node.children) {
263
+ sortTree(node.children);
264
+ }
265
+ }
266
+ }
267
+ /**
268
+ * Flatten tree into list for rendering, respecting expanded state
269
+ */
270
+ export function flattenGoogleDocsTree(nodes, expandedFolders, depth = 0) {
271
+ const result = [];
272
+ for (const node of nodes) {
273
+ const isExpanded = expandedFolders.has(node.id);
274
+ result.push({
275
+ id: node.id,
276
+ name: node.name,
277
+ type: node.type,
278
+ depth: depth,
279
+ path: node.path,
280
+ relativePath: node.relativePath,
281
+ modifiedAt: node.modifiedAt,
282
+ isExpanded: node.type === "folder" ? isExpanded : undefined,
283
+ fileCount: node.fileCount,
284
+ });
285
+ if (node.type === "folder" && isExpanded && node.children) {
286
+ result.push(...flattenGoogleDocsTree(node.children, expandedFolders, depth + 1));
287
+ }
288
+ }
289
+ return result;
290
+ }
291
+ /**
292
+ * Get Google Docs file tree
293
+ */
294
+ export async function getGoogleDocsFileTree(folderId) {
295
+ const files = await listAllGoogleDriveFiles(folderId);
296
+ return buildGoogleDocsTree(files);
297
+ }
298
+ //# sourceMappingURL=googledocs.js.map