@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.
- package/dist/archive/archive-store.d.ts +166 -0
- package/dist/archive/archive-store.d.ts.map +1 -0
- package/dist/archive/archive-store.js +612 -0
- package/dist/archive/archive-store.js.map +1 -0
- package/dist/archive/bulk-archive.d.ts +63 -0
- package/dist/archive/bulk-archive.d.ts.map +1 -0
- package/dist/archive/bulk-archive.js +315 -0
- package/dist/archive/bulk-archive.js.map +1 -0
- package/dist/archive/filename-utils.d.ts +39 -0
- package/dist/archive/filename-utils.d.ts.map +1 -0
- package/dist/archive/filename-utils.js +78 -0
- package/dist/archive/filename-utils.js.map +1 -0
- package/dist/archive/index.d.ts +21 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +45 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/manifest-extractor.d.ts +40 -0
- package/dist/archive/manifest-extractor.d.ts.map +1 -0
- package/dist/archive/manifest-extractor.js +456 -0
- package/dist/archive/manifest-extractor.js.map +1 -0
- package/dist/archive/migration.d.ts +59 -0
- package/dist/archive/migration.d.ts.map +1 -0
- package/dist/archive/migration.js +172 -0
- package/dist/archive/migration.js.map +1 -0
- package/dist/archive/plan-cataloger.d.ts +24 -0
- package/dist/archive/plan-cataloger.d.ts.map +1 -0
- package/dist/archive/plan-cataloger.js +100 -0
- package/dist/archive/plan-cataloger.js.map +1 -0
- package/dist/archive/plan-extractor.d.ts +84 -0
- package/dist/archive/plan-extractor.d.ts.map +1 -0
- package/dist/archive/plan-extractor.js +371 -0
- package/dist/archive/plan-extractor.js.map +1 -0
- package/dist/archive/search-indexer.d.ts +50 -0
- package/dist/archive/search-indexer.d.ts.map +1 -0
- package/dist/archive/search-indexer.js +294 -0
- package/dist/archive/search-indexer.js.map +1 -0
- package/dist/archive/subagent-store.d.ts +113 -0
- package/dist/archive/subagent-store.d.ts.map +1 -0
- package/dist/archive/subagent-store.js +173 -0
- package/dist/archive/subagent-store.js.map +1 -0
- package/dist/archive/types.d.ts +236 -0
- package/dist/archive/types.d.ts.map +1 -0
- package/dist/archive/types.js +30 -0
- package/dist/archive/types.js.map +1 -0
- package/dist/branding.d.ts +9 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +50 -0
- package/dist/branding.js.map +1 -0
- package/dist/cache/git-utils.d.ts +36 -0
- package/dist/cache/git-utils.d.ts.map +1 -0
- package/dist/cache/git-utils.js +160 -0
- package/dist/cache/git-utils.js.map +1 -0
- package/dist/cache/hidden-projects.d.ts +19 -0
- package/dist/cache/hidden-projects.d.ts.map +1 -0
- package/dist/cache/hidden-projects.js +48 -0
- package/dist/cache/hidden-projects.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +20 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/metadata-extractor.d.ts +62 -0
- package/dist/cache/metadata-extractor.d.ts.map +1 -0
- package/dist/cache/metadata-extractor.js +574 -0
- package/dist/cache/metadata-extractor.js.map +1 -0
- package/dist/cache/mode-detector.d.ts +19 -0
- package/dist/cache/mode-detector.d.ts.map +1 -0
- package/dist/cache/mode-detector.js +161 -0
- package/dist/cache/mode-detector.js.map +1 -0
- package/dist/cache/persistence.d.ts +39 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +98 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/project-discovery.d.ts +41 -0
- package/dist/cache/project-discovery.d.ts.map +1 -0
- package/dist/cache/project-discovery.js +212 -0
- package/dist/cache/project-discovery.js.map +1 -0
- package/dist/cache/session-index.d.ts +258 -0
- package/dist/cache/session-index.d.ts.map +1 -0
- package/dist/cache/session-index.js +1030 -0
- package/dist/cache/session-index.js.map +1 -0
- package/dist/cache/types.d.ts +159 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +29 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/catalog/bulk-extractor.d.ts +18 -0
- package/dist/catalog/bulk-extractor.d.ts.map +1 -0
- package/dist/catalog/bulk-extractor.js +150 -0
- package/dist/catalog/bulk-extractor.js.map +1 -0
- package/dist/catalog/extractor.d.ts +53 -0
- package/dist/catalog/extractor.d.ts.map +1 -0
- package/dist/catalog/extractor.js +522 -0
- package/dist/catalog/extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +10 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +11 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +134 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +8 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +96 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +222 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/context/index.d.ts +13 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/indexer.d.ts +73 -0
- package/dist/context/indexer.d.ts.map +1 -0
- package/dist/context/indexer.js +233 -0
- package/dist/context/indexer.js.map +1 -0
- package/dist/context/manager.d.ts +66 -0
- package/dist/context/manager.d.ts.map +1 -0
- package/dist/context/manager.js +310 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/types.d.ts +149 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +36 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handoff/catalog.d.ts +54 -0
- package/dist/handoff/catalog.d.ts.map +1 -0
- package/dist/handoff/catalog.js +121 -0
- package/dist/handoff/catalog.js.map +1 -0
- package/dist/handoff/generator.d.ts +107 -0
- package/dist/handoff/generator.d.ts.map +1 -0
- package/dist/handoff/generator.js +603 -0
- package/dist/handoff/generator.js.map +1 -0
- package/dist/handoff/index.d.ts +13 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +12 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/llm-generator.d.ts +77 -0
- package/dist/handoff/llm-generator.d.ts.map +1 -0
- package/dist/handoff/llm-generator.js +513 -0
- package/dist/handoff/llm-generator.js.map +1 -0
- package/dist/handoff/prompts.d.ts +18 -0
- package/dist/handoff/prompts.d.ts.map +1 -0
- package/dist/handoff/prompts.js +22 -0
- package/dist/handoff/prompts.js.map +1 -0
- package/dist/handoff/types.d.ts +28 -0
- package/dist/handoff/types.d.ts.map +1 -0
- package/dist/handoff/types.js +7 -0
- package/dist/handoff/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/claude-operations.d.ts +111 -0
- package/dist/logging/claude-operations.d.ts.map +1 -0
- package/dist/logging/claude-operations.js +132 -0
- package/dist/logging/claude-operations.js.map +1 -0
- package/dist/logging/error-utils.d.ts +18 -0
- package/dist/logging/error-utils.d.ts.map +1 -0
- package/dist/logging/error-utils.js +37 -0
- package/dist/logging/error-utils.js.map +1 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +10 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +25 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/notifications/constants.d.ts +16 -0
- package/dist/notifications/constants.d.ts.map +1 -0
- package/dist/notifications/constants.js +49 -0
- package/dist/notifications/constants.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/types.d.ts +28 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +7 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/utils.d.ts +20 -0
- package/dist/notifications/utils.d.ts.map +1 -0
- package/dist/notifications/utils.js +37 -0
- package/dist/notifications/utils.js.map +1 -0
- package/dist/plan/index.d.ts +12 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +15 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/plan-parser.d.ts +33 -0
- package/dist/plan/plan-parser.d.ts.map +1 -0
- package/dist/plan/plan-parser.js +189 -0
- package/dist/plan/plan-parser.js.map +1 -0
- package/dist/plan/progress-computer.d.ts +34 -0
- package/dist/plan/progress-computer.d.ts.map +1 -0
- package/dist/plan/progress-computer.js +211 -0
- package/dist/plan/progress-computer.js.map +1 -0
- package/dist/plan/progress-matcher.d.ts +34 -0
- package/dist/plan/progress-matcher.d.ts.map +1 -0
- package/dist/plan/progress-matcher.js +297 -0
- package/dist/plan/progress-matcher.js.map +1 -0
- package/dist/plan/task-extractor.d.ts +30 -0
- package/dist/plan/task-extractor.d.ts.map +1 -0
- package/dist/plan/task-extractor.js +435 -0
- package/dist/plan/task-extractor.js.map +1 -0
- package/dist/plan/types.d.ts +131 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +8 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/project/aggregator.d.ts +43 -0
- package/dist/project/aggregator.d.ts.map +1 -0
- package/dist/project/aggregator.js +218 -0
- package/dist/project/aggregator.js.map +1 -0
- package/dist/project/index.d.ts +9 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/types.d.ts +65 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +27 -0
- package/dist/project/types.js.map +1 -0
- package/dist/session/detector.d.ts +113 -0
- package/dist/session/detector.d.ts.map +1 -0
- package/dist/session/detector.js +333 -0
- package/dist/session/detector.js.map +1 -0
- package/dist/session/filters.d.ts +32 -0
- package/dist/session/filters.d.ts.map +1 -0
- package/dist/session/filters.js +100 -0
- package/dist/session/filters.js.map +1 -0
- package/dist/session/format-title.d.ts +16 -0
- package/dist/session/format-title.d.ts.map +1 -0
- package/dist/session/format-title.js +54 -0
- package/dist/session/format-title.js.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/parser.d.ts +264 -0
- package/dist/session/parser.d.ts.map +1 -0
- package/dist/session/parser.js +588 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/session/token-estimator.d.ts +32 -0
- package/dist/session/token-estimator.d.ts.map +1 -0
- package/dist/session/token-estimator.js +139 -0
- package/dist/session/token-estimator.js.map +1 -0
- package/dist/session/transformer.d.ts +126 -0
- package/dist/session/transformer.d.ts.map +1 -0
- package/dist/session/transformer.js +158 -0
- package/dist/session/transformer.js.map +1 -0
- package/dist/setup/hooks-config.d.ts +35 -0
- package/dist/setup/hooks-config.d.ts.map +1 -0
- package/dist/setup/hooks-config.js +107 -0
- package/dist/setup/hooks-config.js.map +1 -0
- package/dist/setup/hooks-symlink.d.ts +17 -0
- package/dist/setup/hooks-symlink.d.ts.map +1 -0
- package/dist/setup/hooks-symlink.js +89 -0
- package/dist/setup/hooks-symlink.js.map +1 -0
- package/dist/setup/index.d.ts +13 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +12 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/prerequisites.d.ts +11 -0
- package/dist/setup/prerequisites.d.ts.map +1 -0
- package/dist/setup/prerequisites.js +72 -0
- package/dist/setup/prerequisites.js.map +1 -0
- package/dist/setup/settings-merge.d.ts +33 -0
- package/dist/setup/settings-merge.d.ts.map +1 -0
- package/dist/setup/settings-merge.js +131 -0
- package/dist/setup/settings-merge.js.map +1 -0
- package/dist/setup/skills-install.d.ts +17 -0
- package/dist/setup/skills-install.d.ts.map +1 -0
- package/dist/setup/skills-install.js +60 -0
- package/dist/setup/skills-install.js.map +1 -0
- package/dist/setup/types.d.ts +39 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +7 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/setup/verification.d.ts +9 -0
- package/dist/setup/verification.d.ts.map +1 -0
- package/dist/setup/verification.js +91 -0
- package/dist/setup/verification.js.map +1 -0
- package/dist/shortcuts/index.d.ts +8 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +6 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/key-utils.d.ts +54 -0
- package/dist/shortcuts/key-utils.d.ts.map +1 -0
- package/dist/shortcuts/key-utils.js +129 -0
- package/dist/shortcuts/key-utils.js.map +1 -0
- package/dist/shortcuts/shortcut-registry.d.ts +37 -0
- package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
- package/dist/shortcuts/shortcut-registry.js +322 -0
- package/dist/shortcuts/shortcut-registry.js.map +1 -0
- package/dist/sources/config.d.ts +91 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +229 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/googledocs.d.ts +43 -0
- package/dist/sources/googledocs.d.ts.map +1 -0
- package/dist/sources/googledocs.js +298 -0
- package/dist/sources/googledocs.js.map +1 -0
- package/dist/sources/index.d.ts +14 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +19 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/notion.d.ts +35 -0
- package/dist/sources/notion.d.ts.map +1 -0
- package/dist/sources/notion.js +352 -0
- package/dist/sources/notion.js.map +1 -0
- package/dist/sources/obsidian.d.ts +38 -0
- package/dist/sources/obsidian.d.ts.map +1 -0
- package/dist/sources/obsidian.js +228 -0
- package/dist/sources/obsidian.js.map +1 -0
- package/dist/sources/types.d.ts +133 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +19 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/writer.d.ts +86 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +137 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/claude-token.d.ts +49 -0
- package/dist/utils/claude-token.d.ts.map +1 -0
- package/dist/utils/claude-token.js +169 -0
- package/dist/utils/claude-token.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC7D,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrC,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2B,CAAC;QAE7D,iDAAiD;QACjD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE;gBACP,QAAQ,EAAE;oBACR,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK;oBACzF,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS;oBAC9C,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY;iBACrD;gBACD,UAAU,EAAE;oBACV,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,KAAK;oBACrD,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS;oBAChD,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa;oBACxD,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM;oBAC1C,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe;oBAC5D,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa;iBACzD;gBACD,MAAM,EAAE;oBACN,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;oBACjD,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS;oBAC5C,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa;oBACpD,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM;oBACtC,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY;oBAClD,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc;oBACtD,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa;iBACrD;aACF;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,CACL,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,KAAK,QAAQ;QACtD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG;QACxB,OAAO,EAAE,IAAI;QACb,SAAS;QACT,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvC,CAAC;IACF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wCAAwC;AAExC;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,CACL,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI;QAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,KAAK,QAAQ;QACnE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CACzD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAKnC;IACC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG;QAC1B,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IACF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1C,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC/C,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,mCAAmC;AAEnC;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,CACL,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,QAAQ;QAC/D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAM/B;IACC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG;QACtB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IACF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3C,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,8CAA8C;AAE9C;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,IAAI,kBAAkB,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,UAAU,CAAC,kBAAkB,CAAC;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -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
|