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