@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,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulk Archive (Legacy)
|
|
3
|
+
*
|
|
4
|
+
* @deprecated This module is being replaced by the hybrid architecture in core/src/cache/.
|
|
5
|
+
* The new architecture reads directly from JSONL files without copying content.
|
|
6
|
+
*
|
|
7
|
+
* This module remains for backwards compatibility with the old archive system.
|
|
8
|
+
* New code should use the cache module from core/src/cache/ instead.
|
|
9
|
+
*
|
|
10
|
+
* Functions for scanning and bulk-archiving Claude Code conversations.
|
|
11
|
+
* Scans ~/.claude/projects/ for all session files and archives them
|
|
12
|
+
* to the global archive.
|
|
13
|
+
*/
|
|
14
|
+
import type { ArchiveProgress, ArchiveInitResult, SessionFileInfo } from "./types.js";
|
|
15
|
+
import { FilterType } from "../session/filters.js";
|
|
16
|
+
import { decodeProjectPath, decodeProjectPathNaive } from "../session/detector.js";
|
|
17
|
+
export { decodeProjectPath, decodeProjectPathNaive };
|
|
18
|
+
/**
|
|
19
|
+
* List all project directories in ~/.claude/projects/
|
|
20
|
+
*/
|
|
21
|
+
export declare function listAllProjects(): Promise<Array<{
|
|
22
|
+
encodedPath: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
projectPath: string;
|
|
25
|
+
projectSlug: string;
|
|
26
|
+
}>>;
|
|
27
|
+
/**
|
|
28
|
+
* List all session JSONL files across all projects.
|
|
29
|
+
*/
|
|
30
|
+
export declare function listAllSessions(): Promise<SessionFileInfo[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a session is already archived.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isSessionArchived(sessionId: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Archive a single session file.
|
|
37
|
+
* Returns true if archived, false if skipped (already archived or error).
|
|
38
|
+
* Also archives any subagent conversations associated with this session.
|
|
39
|
+
*/
|
|
40
|
+
export declare function archiveSessionFile(session: SessionFileInfo, options?: {
|
|
41
|
+
saveToLocal?: boolean;
|
|
42
|
+
filterType?: FilterType;
|
|
43
|
+
force?: boolean;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
archived: boolean;
|
|
46
|
+
error?: string;
|
|
47
|
+
subagentsArchived?: number;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Initialize the archive by bulk-archiving all sessions.
|
|
51
|
+
* Skips sessions that are already archived (unless force=true).
|
|
52
|
+
*/
|
|
53
|
+
export declare function initializeArchive(options: {
|
|
54
|
+
/** Whether to save to local project directories as well */
|
|
55
|
+
saveToLocal?: boolean;
|
|
56
|
+
/** Force re-archiving of all sessions (skips already-archived check) */
|
|
57
|
+
force?: boolean;
|
|
58
|
+
/** Filter type to use when archiving (default: EVERYTHING for full content) */
|
|
59
|
+
filterType?: FilterType;
|
|
60
|
+
/** Progress callback - called for each step */
|
|
61
|
+
onProgress?: (progress: ArchiveProgress) => void;
|
|
62
|
+
}): Promise<ArchiveInitResult>;
|
|
63
|
+
//# sourceMappingURL=bulk-archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-archive.d.ts","sourceRoot":"","sources":["../../src/archive/bulk-archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,UAAU,EAAe,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAqB,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGtG,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;AAYrD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAC9C,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAC5F,CAiCA;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAwClE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG3E;AAoFD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChF,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+F5E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;CAClD,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiF7B"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bulk Archive (Legacy)
|
|
3
|
+
*
|
|
4
|
+
* @deprecated This module is being replaced by the hybrid architecture in core/src/cache/.
|
|
5
|
+
* The new architecture reads directly from JSONL files without copying content.
|
|
6
|
+
*
|
|
7
|
+
* This module remains for backwards compatibility with the old archive system.
|
|
8
|
+
* New code should use the cache module from core/src/cache/ instead.
|
|
9
|
+
*
|
|
10
|
+
* Functions for scanning and bulk-archiving Claude Code conversations.
|
|
11
|
+
* Scans ~/.claude/projects/ for all session files and archives them
|
|
12
|
+
* to the global archive.
|
|
13
|
+
*/
|
|
14
|
+
import { promises as fs } from "fs";
|
|
15
|
+
import * as path from "path";
|
|
16
|
+
import { homedir } from "os";
|
|
17
|
+
import { extractManifest } from "./manifest-extractor.js";
|
|
18
|
+
import { archiveConversation, listManifests } from "./archive-store.js";
|
|
19
|
+
import { parseJSONL, getEntryStatistics } from "../session/parser.js";
|
|
20
|
+
import { transformToSavedContext } from "../session/transformer.js";
|
|
21
|
+
import { FilterType, applyFilter } from "../session/filters.js";
|
|
22
|
+
import { listSubagentFiles, decodeProjectPath, decodeProjectPathNaive } from "../session/detector.js";
|
|
23
|
+
// Re-export for backwards compatibility (archive/index.ts exports these)
|
|
24
|
+
export { decodeProjectPath, decodeProjectPathNaive };
|
|
25
|
+
import { archiveSubagent, isSubagentArchived, createSubagentReference, } from "./subagent-store.js";
|
|
26
|
+
/** Claude projects directory */
|
|
27
|
+
const CLAUDE_PROJECTS_PATH = path.join(homedir(), ".claude", "projects");
|
|
28
|
+
/**
|
|
29
|
+
* List all project directories in ~/.claude/projects/
|
|
30
|
+
*/
|
|
31
|
+
export async function listAllProjects() {
|
|
32
|
+
const projects = [];
|
|
33
|
+
try {
|
|
34
|
+
const entries = await fs.readdir(CLAUDE_PROJECTS_PATH, {
|
|
35
|
+
withFileTypes: true,
|
|
36
|
+
});
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
const projectPath = await decodeProjectPath(entry.name);
|
|
40
|
+
// Generate projectId from full path using dash-encoding
|
|
41
|
+
const projectId = projectPath.replace(/\//g, "-");
|
|
42
|
+
const projectSlug = path.basename(projectPath);
|
|
43
|
+
projects.push({
|
|
44
|
+
encodedPath: path.join(CLAUDE_PROJECTS_PATH, entry.name),
|
|
45
|
+
projectId,
|
|
46
|
+
projectPath,
|
|
47
|
+
projectSlug,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Projects directory doesn't exist
|
|
54
|
+
}
|
|
55
|
+
return projects;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* List all session JSONL files across all projects.
|
|
59
|
+
*/
|
|
60
|
+
export async function listAllSessions() {
|
|
61
|
+
const sessions = [];
|
|
62
|
+
const projects = await listAllProjects();
|
|
63
|
+
for (const project of projects) {
|
|
64
|
+
try {
|
|
65
|
+
const entries = await fs.readdir(project.encodedPath, {
|
|
66
|
+
withFileTypes: true,
|
|
67
|
+
});
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
70
|
+
const sessionId = entry.name.replace(".jsonl", "");
|
|
71
|
+
const filePath = path.join(project.encodedPath, entry.name);
|
|
72
|
+
try {
|
|
73
|
+
const stats = await fs.stat(filePath);
|
|
74
|
+
sessions.push({
|
|
75
|
+
filePath,
|
|
76
|
+
sessionId,
|
|
77
|
+
projectId: project.projectId,
|
|
78
|
+
projectPath: project.projectPath,
|
|
79
|
+
projectSlug: project.projectSlug,
|
|
80
|
+
modifiedAt: stats.mtime,
|
|
81
|
+
sizeBytes: stats.size,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Skip files we can't stat
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Skip projects we can't read
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Sort by modification time (newest first)
|
|
95
|
+
sessions.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());
|
|
96
|
+
return sessions;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if a session is already archived.
|
|
100
|
+
*/
|
|
101
|
+
export async function isSessionArchived(sessionId) {
|
|
102
|
+
const manifestIds = await listManifests();
|
|
103
|
+
return manifestIds.includes(sessionId);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Parse and archive a single subagent file.
|
|
107
|
+
* Returns the archived subagent data or null if archiving fails.
|
|
108
|
+
*/
|
|
109
|
+
async function archiveSubagentFile(subagentFilePath, agentId, sessionId, projectSlug, force = false) {
|
|
110
|
+
try {
|
|
111
|
+
// Check if already archived (unless forcing)
|
|
112
|
+
if (!force && (await isSubagentArchived(agentId))) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// Parse the subagent JSONL
|
|
116
|
+
const entries = await parseJSONL(subagentFilePath);
|
|
117
|
+
if (entries.length === 0) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
// Get statistics
|
|
121
|
+
const stats = getEntryStatistics(entries);
|
|
122
|
+
// Transform to display messages
|
|
123
|
+
const savedContext = transformToSavedContext(entries, {
|
|
124
|
+
sessionFile: {
|
|
125
|
+
filePath: subagentFilePath,
|
|
126
|
+
sessionId: agentId,
|
|
127
|
+
modifiedAt: new Date(),
|
|
128
|
+
sizeBytes: 0,
|
|
129
|
+
},
|
|
130
|
+
sessionSlug: `agent-${agentId}`,
|
|
131
|
+
workingDirectory: "",
|
|
132
|
+
});
|
|
133
|
+
// Extract prompt from first user message
|
|
134
|
+
const firstUserEntry = entries.find((e) => e.type === "user_message");
|
|
135
|
+
const prompt = firstUserEntry?.content.text || "Unknown task";
|
|
136
|
+
// Extract model from first assistant entry
|
|
137
|
+
const firstAssistant = entries.find((e) => e.type === "assistant_message" || e.type === "tool_call");
|
|
138
|
+
const model = firstAssistant?.content.model;
|
|
139
|
+
// Create archived subagent
|
|
140
|
+
const archivedSubagent = {
|
|
141
|
+
id: agentId,
|
|
142
|
+
sessionId,
|
|
143
|
+
projectSlug,
|
|
144
|
+
archivedAt: new Date().toISOString(),
|
|
145
|
+
prompt,
|
|
146
|
+
model,
|
|
147
|
+
conversation: savedContext.conversation,
|
|
148
|
+
statistics: {
|
|
149
|
+
messageCount: stats.userMessages + stats.assistantMessages,
|
|
150
|
+
toolCallCount: stats.toolCalls,
|
|
151
|
+
tokens: {
|
|
152
|
+
totalInput: stats.totalInputTokens,
|
|
153
|
+
totalOutput: stats.totalOutputTokens,
|
|
154
|
+
cacheCreation: stats.totalCacheCreation > 0 ? stats.totalCacheCreation : undefined,
|
|
155
|
+
cacheRead: stats.totalCacheRead > 0 ? stats.totalCacheRead : undefined,
|
|
156
|
+
},
|
|
157
|
+
durationMs: stats.totalDurationMs > 0 ? stats.totalDurationMs : undefined,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
// Archive to storage
|
|
161
|
+
await archiveSubagent(archivedSubagent);
|
|
162
|
+
return archivedSubagent;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Archive a single session file.
|
|
170
|
+
* Returns true if archived, false if skipped (already archived or error).
|
|
171
|
+
* Also archives any subagent conversations associated with this session.
|
|
172
|
+
*/
|
|
173
|
+
export async function archiveSessionFile(session, options = {}) {
|
|
174
|
+
try {
|
|
175
|
+
// Use provided filter type or default to EVERYTHING (preserves all content types)
|
|
176
|
+
const filterType = options.filterType ?? FilterType.EVERYTHING;
|
|
177
|
+
const force = options.force ?? false;
|
|
178
|
+
// Parse the JSONL file
|
|
179
|
+
const entries = await parseJSONL(session.filePath);
|
|
180
|
+
if (entries.length === 0) {
|
|
181
|
+
return { archived: false, error: "Empty session file" };
|
|
182
|
+
}
|
|
183
|
+
// Detect and archive subagents
|
|
184
|
+
const subagentFiles = await listSubagentFiles(session.filePath);
|
|
185
|
+
const subagentRefs = [];
|
|
186
|
+
let subagentTotalTokens = 0;
|
|
187
|
+
const subagentIds = [];
|
|
188
|
+
// Find agent_progress entries to determine position in parent conversation
|
|
189
|
+
const agentProgressIndices = new Map();
|
|
190
|
+
entries.forEach((entry, index) => {
|
|
191
|
+
if (entry.type === "agent_progress" && entry.content.agentId) {
|
|
192
|
+
agentProgressIndices.set(entry.content.agentId, index);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
for (const subagentFile of subagentFiles) {
|
|
196
|
+
const archivedSubagent = await archiveSubagentFile(subagentFile.filePath, subagentFile.agentId, session.sessionId, session.projectSlug, force);
|
|
197
|
+
if (archivedSubagent) {
|
|
198
|
+
const positionIndex = agentProgressIndices.get(subagentFile.agentId) ?? subagentRefs.length;
|
|
199
|
+
const ref = createSubagentReference(archivedSubagent, positionIndex, entries[positionIndex - 1]?.uuid);
|
|
200
|
+
subagentRefs.push(ref);
|
|
201
|
+
subagentTotalTokens += ref.tokenCount;
|
|
202
|
+
subagentIds.push(subagentFile.agentId);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Extract manifest
|
|
206
|
+
const manifest = await extractManifest(session.filePath, session.projectPath, { autoArchived: false });
|
|
207
|
+
// Add subagent summary to manifest if any were found
|
|
208
|
+
if (subagentIds.length > 0) {
|
|
209
|
+
manifest.subagents = {
|
|
210
|
+
count: subagentIds.length,
|
|
211
|
+
totalTokens: subagentTotalTokens,
|
|
212
|
+
ids: subagentIds,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Apply selected filter and transform
|
|
216
|
+
const filteredEntries = applyFilter(entries, filterType);
|
|
217
|
+
const savedContext = transformToSavedContext(filteredEntries, {
|
|
218
|
+
sessionFile: {
|
|
219
|
+
filePath: session.filePath,
|
|
220
|
+
sessionId: session.sessionId,
|
|
221
|
+
modifiedAt: session.modifiedAt,
|
|
222
|
+
sizeBytes: session.sizeBytes,
|
|
223
|
+
},
|
|
224
|
+
sessionSlug: manifest.title.substring(0, 30),
|
|
225
|
+
workingDirectory: session.projectPath,
|
|
226
|
+
filterType,
|
|
227
|
+
});
|
|
228
|
+
// Archive the conversation
|
|
229
|
+
await archiveConversation(savedContext, manifest, {
|
|
230
|
+
saveToLocal: options.saveToLocal ?? false,
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
233
|
+
archived: true,
|
|
234
|
+
subagentsArchived: subagentIds.length,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
return {
|
|
239
|
+
archived: false,
|
|
240
|
+
error: error instanceof Error ? error.message : String(error),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Initialize the archive by bulk-archiving all sessions.
|
|
246
|
+
* Skips sessions that are already archived (unless force=true).
|
|
247
|
+
*/
|
|
248
|
+
export async function initializeArchive(options) {
|
|
249
|
+
const { saveToLocal = false, force = false, filterType = FilterType.EVERYTHING, onProgress, } = options;
|
|
250
|
+
const result = {
|
|
251
|
+
totalSessions: 0,
|
|
252
|
+
archived: 0,
|
|
253
|
+
skipped: 0,
|
|
254
|
+
errors: 0,
|
|
255
|
+
};
|
|
256
|
+
// Phase 1: Scan for sessions
|
|
257
|
+
onProgress?.({
|
|
258
|
+
phase: "scanning",
|
|
259
|
+
total: 0,
|
|
260
|
+
completed: 0,
|
|
261
|
+
current: "Scanning projects...",
|
|
262
|
+
skipped: 0,
|
|
263
|
+
errors: 0,
|
|
264
|
+
});
|
|
265
|
+
const sessions = await listAllSessions();
|
|
266
|
+
result.totalSessions = sessions.length;
|
|
267
|
+
if (sessions.length === 0) {
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
// Get already archived session IDs (only needed when not forcing)
|
|
271
|
+
const archivedIds = force ? new Set() : new Set(await listManifests());
|
|
272
|
+
// Phase 2: Archive sessions
|
|
273
|
+
for (let i = 0; i < sessions.length; i++) {
|
|
274
|
+
const session = sessions[i];
|
|
275
|
+
onProgress?.({
|
|
276
|
+
phase: "archiving",
|
|
277
|
+
total: sessions.length,
|
|
278
|
+
completed: i,
|
|
279
|
+
current: `${session.projectSlug}/${session.sessionId.substring(0, 8)}...`,
|
|
280
|
+
skipped: result.skipped,
|
|
281
|
+
errors: result.errors,
|
|
282
|
+
});
|
|
283
|
+
// Check if already archived (skip check when force=true)
|
|
284
|
+
if (!force && archivedIds.has(session.sessionId)) {
|
|
285
|
+
result.skipped++;
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
// Archive the session with the specified filter type
|
|
289
|
+
const archiveResult = await archiveSessionFile(session, {
|
|
290
|
+
saveToLocal,
|
|
291
|
+
filterType,
|
|
292
|
+
force,
|
|
293
|
+
});
|
|
294
|
+
if (archiveResult.archived) {
|
|
295
|
+
result.archived++;
|
|
296
|
+
}
|
|
297
|
+
else if (archiveResult.error) {
|
|
298
|
+
result.errors++;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
result.skipped++;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Final progress update
|
|
305
|
+
onProgress?.({
|
|
306
|
+
phase: "archiving",
|
|
307
|
+
total: sessions.length,
|
|
308
|
+
completed: sessions.length,
|
|
309
|
+
current: "Complete",
|
|
310
|
+
skipped: result.skipped,
|
|
311
|
+
errors: result.errors,
|
|
312
|
+
});
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=bulk-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-archive.js","sourceRoot":"","sources":["../../src/archive/bulk-archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filename Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared functions for generating plan filenames and handling
|
|
5
|
+
* versioned file naming to avoid collisions.
|
|
6
|
+
*
|
|
7
|
+
* Consolidated from plan-extractor.ts, plan-cataloger.ts,
|
|
8
|
+
* archive-store.ts, and catalog/extractor.ts.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Slugify a string for use in filenames.
|
|
12
|
+
* Converts to lowercase, replaces non-alphanumeric chars with dashes,
|
|
13
|
+
* trims leading/trailing dashes, and truncates.
|
|
14
|
+
*/
|
|
15
|
+
export declare function slugify(text: string, maxLength?: number): string;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a filename for a plan from a title string.
|
|
18
|
+
* Format: YYYY-MM-DD_title-slug.md
|
|
19
|
+
*/
|
|
20
|
+
export declare function generatePlanFilename(title: string, options?: {
|
|
21
|
+
slugMaxLength?: number;
|
|
22
|
+
date?: Date;
|
|
23
|
+
}): string;
|
|
24
|
+
/**
|
|
25
|
+
* Generate a filename for archiving a plan file.
|
|
26
|
+
* Tries to extract title from content's first # heading,
|
|
27
|
+
* falls back to the original filename (basename without extension).
|
|
28
|
+
* Format: YYYY-MM-DD_title-slug.md
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateArchivePlanFilename(planPath: string, options?: {
|
|
31
|
+
content?: string;
|
|
32
|
+
createdAt?: Date;
|
|
33
|
+
}): string;
|
|
34
|
+
/**
|
|
35
|
+
* Generate a versioned filename to avoid collisions.
|
|
36
|
+
* If the base filename exists, appends -v2, -v3, etc.
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateVersionedFilename(basePath: string, filename: string): Promise<string>;
|
|
39
|
+
//# sourceMappingURL=filename-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filename-utils.d.ts","sourceRoot":"","sources":["../../src/archive/filename-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAOpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAChD,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAO,GACnD,MAAM,CAaR;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filename Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared functions for generating plan filenames and handling
|
|
5
|
+
* versioned file naming to avoid collisions.
|
|
6
|
+
*
|
|
7
|
+
* Consolidated from plan-extractor.ts, plan-cataloger.ts,
|
|
8
|
+
* archive-store.ts, and catalog/extractor.ts.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from "fs";
|
|
11
|
+
import { join, basename } from "path";
|
|
12
|
+
/**
|
|
13
|
+
* Slugify a string for use in filenames.
|
|
14
|
+
* Converts to lowercase, replaces non-alphanumeric chars with dashes,
|
|
15
|
+
* trims leading/trailing dashes, and truncates.
|
|
16
|
+
*/
|
|
17
|
+
export function slugify(text, maxLength = 40) {
|
|
18
|
+
return text
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
21
|
+
.replace(/^-+|-+$/g, "")
|
|
22
|
+
.substring(0, maxLength)
|
|
23
|
+
.replace(/-+$/, ""); // Clean trailing dash from truncation
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generate a filename for a plan from a title string.
|
|
27
|
+
* Format: YYYY-MM-DD_title-slug.md
|
|
28
|
+
*/
|
|
29
|
+
export function generatePlanFilename(title, options) {
|
|
30
|
+
const dateStr = (options?.date ?? new Date()).toISOString().split("T")[0];
|
|
31
|
+
const slug = slugify(title, options?.slugMaxLength ?? 50);
|
|
32
|
+
return `${dateStr}_${slug}.md`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate a filename for archiving a plan file.
|
|
36
|
+
* Tries to extract title from content's first # heading,
|
|
37
|
+
* falls back to the original filename (basename without extension).
|
|
38
|
+
* Format: YYYY-MM-DD_title-slug.md
|
|
39
|
+
*/
|
|
40
|
+
export function generateArchivePlanFilename(planPath, options = {}) {
|
|
41
|
+
let title = null;
|
|
42
|
+
if (options.content) {
|
|
43
|
+
const titleMatch = options.content.match(/^#\s+(.+)$/m);
|
|
44
|
+
title = titleMatch ? titleMatch[1].trim() : null;
|
|
45
|
+
}
|
|
46
|
+
if (!title) {
|
|
47
|
+
title = basename(planPath, ".md");
|
|
48
|
+
}
|
|
49
|
+
return generatePlanFilename(title, {
|
|
50
|
+
slugMaxLength: 40,
|
|
51
|
+
date: options.createdAt,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate a versioned filename to avoid collisions.
|
|
56
|
+
* If the base filename exists, appends -v2, -v3, etc.
|
|
57
|
+
*/
|
|
58
|
+
export async function generateVersionedFilename(basePath, filename) {
|
|
59
|
+
const ext = ".md";
|
|
60
|
+
const nameWithoutExt = filename.replace(ext, "");
|
|
61
|
+
let version = 2;
|
|
62
|
+
let versionedFilename = filename;
|
|
63
|
+
let versionedPath = join(basePath, versionedFilename);
|
|
64
|
+
while (true) {
|
|
65
|
+
try {
|
|
66
|
+
await fs.access(versionedPath);
|
|
67
|
+
// File exists, try next version
|
|
68
|
+
versionedFilename = `${nameWithoutExt}-v${version}${ext}`;
|
|
69
|
+
versionedPath = join(basePath, versionedFilename);
|
|
70
|
+
version++;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// File doesn't exist, we can use this version
|
|
74
|
+
return versionedFilename;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=filename-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filename-utils.js","sourceRoot":"","sources":["../../src/archive/filename-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,YAAoB,EAAE;IAC1D,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,sCAAsC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,OAAiD;IAEjD,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,GAAG,OAAO,IAAI,IAAI,KAAK,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAgB,EAChB,UAAkD,EAAE;IAEpD,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxD,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,EAAE;QACjC,aAAa,EAAE,EAAE;QACjB,IAAI,EAAE,OAAO,CAAC,SAAS;KACxB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,QAAgB,EAChB,QAAgB;IAEhB,MAAM,GAAG,GAAG,KAAK,CAAC;IAClB,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAEjD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,iBAAiB,GAAG,QAAQ,CAAC;IACjC,IAAI,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEtD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC/B,gCAAgC;YAChC,iBAAiB,GAAG,GAAG,cAAc,KAAK,OAAO,GAAG,GAAG,EAAE,CAAC;YAC1D,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;YAC9C,OAAO,iBAAiB,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive Module
|
|
3
|
+
*
|
|
4
|
+
* Cross-project search over saved Claude Code conversations.
|
|
5
|
+
*/
|
|
6
|
+
export type { ConversationManifest, PlanReference, SubagentSummary, SearchIndex, IndexReference, ProjectInfo, SearchInput, SearchOutput, SearchResult, ArchiveSettings, ArchiveProgress, ArchiveInitResult, SessionFileInfo, } from "./types.js";
|
|
7
|
+
export { getDefaultSearchIndex, getDefaultArchiveSettings } from "./types.js";
|
|
8
|
+
export { extractManifest, extractManifestFromEntries, detectPlans, getPlansDirectory, readPlanContent, } from "./manifest-extractor.js";
|
|
9
|
+
export { PLAN_TRIGGER_PATTERNS, detectEmbeddedPlans, extractEmbeddedPlans, findDuplicatePlan, extractPlanTitle, generatePlanFingerprint, calculateSimilarity, indexEmbeddedPlan, splitMultiplePlans, } from "./plan-extractor.js";
|
|
10
|
+
export type { DetectedPlan, PlanFingerprint } from "./plan-extractor.js";
|
|
11
|
+
export { slugify, generatePlanFilename, generateArchivePlanFilename, generateVersionedFilename, } from "./filename-utils.js";
|
|
12
|
+
export { catalogPlan } from "./plan-cataloger.js";
|
|
13
|
+
export type { CatalogPlanInput } from "./plan-cataloger.js";
|
|
14
|
+
export { tokenize, extractPathKeywords, extractKeywordsWithFields, addToIndex, removeFromIndex, searchIndex, getIndexStats, } from "./search-indexer.js";
|
|
15
|
+
export { getGlobalArchivePath, getGlobalIndexPath, getManifestPath, getConversationPath, getPlanPath, getLocalArchivePath, getLocalIndexPath, ensureGlobalArchive, ensureLocalArchive, readGlobalIndex, writeGlobalIndex, readLocalIndex, writeLocalIndex, saveManifest, readManifest, listManifests, listAllManifests, listManifestsByProject, saveConversation, readConversation, archivePlan, isPlanArchived, readArchiveSettings, writeArchiveSettings, archiveConversation, searchConversations, getArchiveStats, } from "./archive-store.js";
|
|
16
|
+
export { decodeProjectPath, decodeProjectPathNaive, listAllProjects, listAllSessions, isSessionArchived, archiveSessionFile, initializeArchive, } from "./bulk-archive.js";
|
|
17
|
+
export { archiveSubagent, readSubagent, listSubagentsForSession, isSubagentArchived, listAllSubagentIds, createSubagentReference, deleteSubagent, getSubagentArchiveStats, } from "./subagent-store.js";
|
|
18
|
+
export type { ArchivedSubagent, SubagentReference, SubagentTokenStats, } from "./subagent-store.js";
|
|
19
|
+
export { migrateToProjectId, isMigrationNeeded, getMigrationStatus, migrateProjectPaths, } from "./migration.js";
|
|
20
|
+
export type { MigrationResult, PathMigrationResult } from "./migration.js";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/archive/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAEL,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EAEjB,mBAAmB,EACnB,kBAAkB,EAElB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EAEf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EAEtB,gBAAgB,EAChB,gBAAgB,EAEhB,WAAW,EACX,cAAc,EAEd,mBAAmB,EACnB,oBAAoB,EAEpB,mBAAmB,EAEnB,mBAAmB,EAEnB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive Module
|
|
3
|
+
*
|
|
4
|
+
* Cross-project search over saved Claude Code conversations.
|
|
5
|
+
*/
|
|
6
|
+
export { getDefaultSearchIndex, getDefaultArchiveSettings } from "./types.js";
|
|
7
|
+
// Manifest Extractor
|
|
8
|
+
export { extractManifest, extractManifestFromEntries, detectPlans, getPlansDirectory, readPlanContent, } from "./manifest-extractor.js";
|
|
9
|
+
// Plan Extractor
|
|
10
|
+
export { PLAN_TRIGGER_PATTERNS, detectEmbeddedPlans, extractEmbeddedPlans, findDuplicatePlan, extractPlanTitle, generatePlanFingerprint, calculateSimilarity, indexEmbeddedPlan, splitMultiplePlans, } from "./plan-extractor.js";
|
|
11
|
+
// Filename Utilities
|
|
12
|
+
export { slugify, generatePlanFilename, generateArchivePlanFilename, generateVersionedFilename, } from "./filename-utils.js";
|
|
13
|
+
// Plan Cataloger
|
|
14
|
+
export { catalogPlan } from "./plan-cataloger.js";
|
|
15
|
+
// Search Indexer
|
|
16
|
+
export { tokenize, extractPathKeywords, extractKeywordsWithFields, addToIndex, removeFromIndex, searchIndex, getIndexStats, } from "./search-indexer.js";
|
|
17
|
+
// Archive Store
|
|
18
|
+
export {
|
|
19
|
+
// Path helpers
|
|
20
|
+
getGlobalArchivePath, getGlobalIndexPath, getManifestPath, getConversationPath, getPlanPath, getLocalArchivePath, getLocalIndexPath,
|
|
21
|
+
// Directory setup
|
|
22
|
+
ensureGlobalArchive, ensureLocalArchive,
|
|
23
|
+
// Index operations
|
|
24
|
+
readGlobalIndex, writeGlobalIndex, readLocalIndex, writeLocalIndex,
|
|
25
|
+
// Manifest operations
|
|
26
|
+
saveManifest, readManifest, listManifests, listAllManifests, listManifestsByProject,
|
|
27
|
+
// Conversation operations
|
|
28
|
+
saveConversation, readConversation,
|
|
29
|
+
// Plan operations
|
|
30
|
+
archivePlan, isPlanArchived,
|
|
31
|
+
// Settings
|
|
32
|
+
readArchiveSettings, writeArchiveSettings,
|
|
33
|
+
// Full archive flow
|
|
34
|
+
archiveConversation,
|
|
35
|
+
// Search
|
|
36
|
+
searchConversations,
|
|
37
|
+
// Statistics
|
|
38
|
+
getArchiveStats, } from "./archive-store.js";
|
|
39
|
+
// Bulk Archive
|
|
40
|
+
export { decodeProjectPath, decodeProjectPathNaive, listAllProjects, listAllSessions, isSessionArchived, archiveSessionFile, initializeArchive, } from "./bulk-archive.js";
|
|
41
|
+
// Subagent Store
|
|
42
|
+
export { archiveSubagent, readSubagent, listSubagentsForSession, isSubagentArchived, listAllSubagentIds, createSubagentReference, deleteSubagent, getSubagentArchiveStats, } from "./subagent-store.js";
|
|
43
|
+
// Migration
|
|
44
|
+
export { migrateToProjectId, isMigrationNeeded, getMigrationStatus, migrateProjectPaths, } from "./migration.js";
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/archive/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE9E,qBAAqB;AACrB,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,iBAAiB;AACjB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAI7B,qBAAqB;AACrB,OAAO,EACL,OAAO,EACP,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,iBAAiB;AACjB,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,gBAAgB;AAChB,OAAO;AACL,eAAe;AACf,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,iBAAiB;AACjB,kBAAkB;AAClB,mBAAmB,EACnB,kBAAkB;AAClB,mBAAmB;AACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe;AACf,sBAAsB;AACtB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,sBAAsB;AACtB,0BAA0B;AAC1B,gBAAgB,EAChB,gBAAgB;AAChB,kBAAkB;AAClB,WAAW,EACX,cAAc;AACd,WAAW;AACX,mBAAmB,EACnB,oBAAoB;AACpB,oBAAoB;AACpB,mBAAmB;AACnB,SAAS;AACT,mBAAmB;AACnB,aAAa;AACb,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,eAAe;AACf,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAQ7B,YAAY;AACZ,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts ConversationManifest from JSONL session files.
|
|
5
|
+
* Reuses existing parser for JSONL parsing.
|
|
6
|
+
*/
|
|
7
|
+
import type { ParsedEntry } from "../session/parser.js";
|
|
8
|
+
import type { ConversationManifest, PlanReference } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Get the plans directory from Claude Code settings
|
|
11
|
+
*/
|
|
12
|
+
export declare function getPlansDirectory(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Extract a manifest from a JSONL session file.
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractManifest(jsonlPath: string, projectPath: string, options?: {
|
|
17
|
+
userLabel?: string;
|
|
18
|
+
autoArchived?: boolean;
|
|
19
|
+
}): Promise<ConversationManifest>;
|
|
20
|
+
/**
|
|
21
|
+
* Extract a manifest from already-parsed entries.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractManifestFromEntries(entries: ParsedEntry[], projectPath: string, jsonlPath: string, options?: {
|
|
24
|
+
userLabel?: string;
|
|
25
|
+
autoArchived?: boolean;
|
|
26
|
+
}): Promise<ConversationManifest>;
|
|
27
|
+
/**
|
|
28
|
+
* Detect plan file paths written in this conversation.
|
|
29
|
+
* Returns paths to plan files that were written via the Write tool.
|
|
30
|
+
*/
|
|
31
|
+
export declare function detectWrittenPlanPaths(entries: ParsedEntry[]): string[];
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Use detectWrittenPlanPaths instead
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectPlans(entries: ParsedEntry[]): PlanReference[];
|
|
36
|
+
/**
|
|
37
|
+
* Read a plan file's content.
|
|
38
|
+
*/
|
|
39
|
+
export declare function readPlanContent(planPath: string): Promise<string | null>;
|
|
40
|
+
//# sourceMappingURL=manifest-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-extractor.d.ts","sourceRoot":"","sources":["../../src/archive/manifest-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoEtE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GACL,OAAO,CAAC,oBAAoB,CAAC,CAG/B;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GACL,OAAO,CAAC,oBAAoB,CAAC,CA8F/B;AAoKD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAsBvE;AA4GD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAQnE;AA6BD;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB"}
|