@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,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 @@
|
|
|
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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"}
|