@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,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Indexer
|
|
3
|
+
*
|
|
4
|
+
* Reads and writes .jacques/index.json - the unified project knowledge index.
|
|
5
|
+
* Tracks context files, sessions, and plans in a single location.
|
|
6
|
+
*/
|
|
7
|
+
import { promises as fs } from "fs";
|
|
8
|
+
import { existsSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { getDefaultIndex, migrateIndex } from "./types.js";
|
|
11
|
+
const JACQUES_DIR = ".jacques";
|
|
12
|
+
const INDEX_FILE = "index.json";
|
|
13
|
+
/**
|
|
14
|
+
* Get the path to the index file for a project
|
|
15
|
+
*/
|
|
16
|
+
export function getIndexPath(cwd) {
|
|
17
|
+
return join(cwd, JACQUES_DIR, INDEX_FILE);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Read the unified project index from .jacques/index.json
|
|
21
|
+
* Automatically migrates legacy format (files-only) to new format
|
|
22
|
+
*/
|
|
23
|
+
export async function readProjectIndex(cwd) {
|
|
24
|
+
const indexPath = getIndexPath(cwd);
|
|
25
|
+
try {
|
|
26
|
+
if (!existsSync(indexPath)) {
|
|
27
|
+
return getDefaultIndex();
|
|
28
|
+
}
|
|
29
|
+
const content = await fs.readFile(indexPath, "utf-8");
|
|
30
|
+
const parsed = JSON.parse(content);
|
|
31
|
+
// Check if this is a legacy format (has 'files' instead of 'context')
|
|
32
|
+
if (parsed.files && !parsed.context) {
|
|
33
|
+
// Migrate legacy format
|
|
34
|
+
return migrateIndex(parsed);
|
|
35
|
+
}
|
|
36
|
+
// New format - validate and merge with defaults (v2 adds subagents)
|
|
37
|
+
return {
|
|
38
|
+
version: parsed.version || "2.0.0",
|
|
39
|
+
updatedAt: parsed.updatedAt || new Date().toISOString(),
|
|
40
|
+
context: Array.isArray(parsed.context) ? parsed.context : [],
|
|
41
|
+
sessions: Array.isArray(parsed.sessions) ? parsed.sessions : [],
|
|
42
|
+
plans: Array.isArray(parsed.plans) ? parsed.plans : [],
|
|
43
|
+
subagents: Array.isArray(parsed.subagents) ? parsed.subagents : [],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return getDefaultIndex();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Write the project index to .jacques/index.json
|
|
52
|
+
*/
|
|
53
|
+
export async function writeProjectIndex(cwd, index) {
|
|
54
|
+
const jacquesDir = join(cwd, JACQUES_DIR);
|
|
55
|
+
const indexPath = getIndexPath(cwd);
|
|
56
|
+
// Ensure .jacques directory exists
|
|
57
|
+
await fs.mkdir(jacquesDir, { recursive: true });
|
|
58
|
+
// Update timestamp
|
|
59
|
+
index.updatedAt = new Date().toISOString();
|
|
60
|
+
// Write with pretty formatting
|
|
61
|
+
await fs.writeFile(indexPath, JSON.stringify(index, null, 2), "utf-8");
|
|
62
|
+
}
|
|
63
|
+
// ============================================================
|
|
64
|
+
// Context File Operations
|
|
65
|
+
// ============================================================
|
|
66
|
+
/**
|
|
67
|
+
* Add a context file to the index
|
|
68
|
+
*/
|
|
69
|
+
export async function addContextToIndex(cwd, file) {
|
|
70
|
+
const index = await readProjectIndex(cwd);
|
|
71
|
+
const existingIdx = index.context.findIndex((f) => f.id === file.id);
|
|
72
|
+
if (existingIdx >= 0) {
|
|
73
|
+
index.context[existingIdx] = file;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
index.context.push(file);
|
|
77
|
+
}
|
|
78
|
+
await writeProjectIndex(cwd, index);
|
|
79
|
+
return index;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Remove a context file from the index
|
|
83
|
+
*/
|
|
84
|
+
export async function removeContextFromIndex(cwd, fileId) {
|
|
85
|
+
const index = await readProjectIndex(cwd);
|
|
86
|
+
index.context = index.context.filter((f) => f.id !== fileId);
|
|
87
|
+
await writeProjectIndex(cwd, index);
|
|
88
|
+
return index;
|
|
89
|
+
}
|
|
90
|
+
// ============================================================
|
|
91
|
+
// Session Operations
|
|
92
|
+
// ============================================================
|
|
93
|
+
/**
|
|
94
|
+
* Add a session to the index
|
|
95
|
+
*/
|
|
96
|
+
export async function addSessionToIndex(cwd, session) {
|
|
97
|
+
const index = await readProjectIndex(cwd);
|
|
98
|
+
const existingIdx = index.sessions.findIndex((s) => s.id === session.id);
|
|
99
|
+
if (existingIdx >= 0) {
|
|
100
|
+
index.sessions[existingIdx] = session;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
index.sessions.push(session);
|
|
104
|
+
}
|
|
105
|
+
// Sort sessions by savedAt (newest first)
|
|
106
|
+
index.sessions.sort((a, b) => new Date(b.savedAt).getTime() - new Date(a.savedAt).getTime());
|
|
107
|
+
await writeProjectIndex(cwd, index);
|
|
108
|
+
return index;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Remove a session from the index
|
|
112
|
+
*/
|
|
113
|
+
export async function removeSessionFromIndex(cwd, sessionId) {
|
|
114
|
+
const index = await readProjectIndex(cwd);
|
|
115
|
+
index.sessions = index.sessions.filter((s) => s.id !== sessionId);
|
|
116
|
+
await writeProjectIndex(cwd, index);
|
|
117
|
+
return index;
|
|
118
|
+
}
|
|
119
|
+
// ============================================================
|
|
120
|
+
// Plan Operations
|
|
121
|
+
// ============================================================
|
|
122
|
+
/**
|
|
123
|
+
* Add a plan to the index
|
|
124
|
+
*/
|
|
125
|
+
export async function addPlanToIndex(cwd, plan) {
|
|
126
|
+
const index = await readProjectIndex(cwd);
|
|
127
|
+
const existingIdx = index.plans.findIndex((p) => p.id === plan.id);
|
|
128
|
+
if (existingIdx >= 0) {
|
|
129
|
+
// Merge session references
|
|
130
|
+
const existing = index.plans[existingIdx];
|
|
131
|
+
const mergedSessions = [
|
|
132
|
+
...new Set([...existing.sessions, ...plan.sessions]),
|
|
133
|
+
];
|
|
134
|
+
index.plans[existingIdx] = { ...plan, sessions: mergedSessions };
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
index.plans.push(plan);
|
|
138
|
+
}
|
|
139
|
+
// Sort plans by updatedAt (newest first)
|
|
140
|
+
index.plans.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
141
|
+
await writeProjectIndex(cwd, index);
|
|
142
|
+
return index;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Remove a plan from the index
|
|
146
|
+
*/
|
|
147
|
+
export async function removePlanFromIndex(cwd, planId) {
|
|
148
|
+
const index = await readProjectIndex(cwd);
|
|
149
|
+
index.plans = index.plans.filter((p) => p.id !== planId);
|
|
150
|
+
await writeProjectIndex(cwd, index);
|
|
151
|
+
return index;
|
|
152
|
+
}
|
|
153
|
+
// ============================================================
|
|
154
|
+
// Subagent Operations
|
|
155
|
+
// ============================================================
|
|
156
|
+
/**
|
|
157
|
+
* Add a subagent entry to the index
|
|
158
|
+
*/
|
|
159
|
+
export async function addSubagentToIndex(cwd, entry) {
|
|
160
|
+
const index = await readProjectIndex(cwd);
|
|
161
|
+
const existingIdx = index.subagents.findIndex((s) => s.id === entry.id);
|
|
162
|
+
if (existingIdx >= 0) {
|
|
163
|
+
index.subagents[existingIdx] = entry;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
index.subagents.push(entry);
|
|
167
|
+
}
|
|
168
|
+
// Sort subagents by timestamp (newest first)
|
|
169
|
+
index.subagents.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
170
|
+
await writeProjectIndex(cwd, index);
|
|
171
|
+
return index;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Remove a subagent entry from the index
|
|
175
|
+
*/
|
|
176
|
+
export async function removeSubagentFromIndex(cwd, subagentId) {
|
|
177
|
+
const index = await readProjectIndex(cwd);
|
|
178
|
+
index.subagents = index.subagents.filter((s) => s.id !== subagentId);
|
|
179
|
+
await writeProjectIndex(cwd, index);
|
|
180
|
+
return index;
|
|
181
|
+
}
|
|
182
|
+
// ============================================================
|
|
183
|
+
// Legacy Compatibility
|
|
184
|
+
// ============================================================
|
|
185
|
+
/**
|
|
186
|
+
* @deprecated Use readProjectIndex instead
|
|
187
|
+
*/
|
|
188
|
+
export async function readContextIndex(cwd) {
|
|
189
|
+
const index = await readProjectIndex(cwd);
|
|
190
|
+
return {
|
|
191
|
+
version: index.version,
|
|
192
|
+
updatedAt: index.updatedAt,
|
|
193
|
+
files: index.context,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* @deprecated Use writeProjectIndex instead
|
|
198
|
+
*/
|
|
199
|
+
export async function writeContextIndex(cwd, legacyIndex) {
|
|
200
|
+
const index = await readProjectIndex(cwd);
|
|
201
|
+
index.context = legacyIndex.files;
|
|
202
|
+
await writeProjectIndex(cwd, index);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* @deprecated Use addContextToIndex instead
|
|
206
|
+
*/
|
|
207
|
+
export async function addToIndex(cwd, file) {
|
|
208
|
+
const index = await addContextToIndex(cwd, file);
|
|
209
|
+
return {
|
|
210
|
+
version: index.version,
|
|
211
|
+
updatedAt: index.updatedAt,
|
|
212
|
+
files: index.context,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* @deprecated Use removeContextFromIndex instead
|
|
217
|
+
*/
|
|
218
|
+
export async function removeFromIndex(cwd, fileId) {
|
|
219
|
+
const index = await removeContextFromIndex(cwd, fileId);
|
|
220
|
+
return {
|
|
221
|
+
version: index.version,
|
|
222
|
+
updatedAt: index.updatedAt,
|
|
223
|
+
files: index.context,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Check if a context file exists in the index
|
|
228
|
+
*/
|
|
229
|
+
export async function fileExistsInIndex(cwd, fileId) {
|
|
230
|
+
const index = await readProjectIndex(cwd);
|
|
231
|
+
return index.context.some((f) => f.id === fileId);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/context/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages adding/removing context files to/from .jacques/context/
|
|
5
|
+
*/
|
|
6
|
+
import type { ContextFile, AddContextOptions } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Extract tags from Obsidian file content.
|
|
9
|
+
* Supports both frontmatter tags and inline #tags.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractTags(filePath: string): Promise<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Generate a unique ID for a context file
|
|
14
|
+
* Format: slugified-name-randomhex
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateContextId(name: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Sanitize a filename for safe filesystem use
|
|
19
|
+
* - Converts spaces to dashes
|
|
20
|
+
* - Removes special characters
|
|
21
|
+
* - Keeps alphanumeric, dashes, underscores
|
|
22
|
+
*/
|
|
23
|
+
export declare function sanitizeFilename(name: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Get the context directory path for a project
|
|
26
|
+
*/
|
|
27
|
+
export declare function getContextDir(cwd: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Add a context file from an external source
|
|
30
|
+
* Copies the file to .jacques/context/ and updates the index
|
|
31
|
+
*/
|
|
32
|
+
export declare function addContext(options: AddContextOptions): Promise<ContextFile>;
|
|
33
|
+
/**
|
|
34
|
+
* Remove a context file by ID
|
|
35
|
+
* Deletes the file from .jacques/context/ and updates the index
|
|
36
|
+
*/
|
|
37
|
+
export declare function removeContext(cwd: string, contextFile: ContextFile): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if context directory exists and has files
|
|
40
|
+
*/
|
|
41
|
+
export declare function hasContextFiles(cwd: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Format file size in human-readable format
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatFileSize(bytes: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* Estimate tokens from file size (quick estimation).
|
|
48
|
+
* Uses ~4.5 characters per token for English markdown text.
|
|
49
|
+
*/
|
|
50
|
+
export declare function estimateTokensFromSize(bytes: number): number;
|
|
51
|
+
/**
|
|
52
|
+
* Count tokens in text content using tiktoken.
|
|
53
|
+
* Falls back to character-based estimation if tiktoken unavailable.
|
|
54
|
+
*/
|
|
55
|
+
export declare function countTokens(text: string): Promise<number>;
|
|
56
|
+
/**
|
|
57
|
+
* Count tokens in a file using tiktoken.
|
|
58
|
+
* Falls back to size-based estimation if file read fails.
|
|
59
|
+
*/
|
|
60
|
+
export declare function countFileTokens(filePath: string): Promise<number>;
|
|
61
|
+
/**
|
|
62
|
+
* Format token count as human-readable string.
|
|
63
|
+
* Examples: "523", "1.2k", "45.2k"
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatTokenCount(tokens: number): string;
|
|
66
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/context/manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA4FjE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAuCtB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AA2BD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe/D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages adding/removing context files to/from .jacques/context/
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
import { addToIndex } from "./indexer.js";
|
|
9
|
+
const JACQUES_DIR = ".jacques";
|
|
10
|
+
const CONTEXT_DIR = "context";
|
|
11
|
+
/**
|
|
12
|
+
* Parse YAML frontmatter from markdown content.
|
|
13
|
+
* Returns null if no frontmatter found.
|
|
14
|
+
*/
|
|
15
|
+
function parseFrontmatter(content) {
|
|
16
|
+
// Frontmatter must start at the beginning of the file
|
|
17
|
+
if (!content.startsWith("---")) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
// Find the closing ---
|
|
21
|
+
const endIndex = content.indexOf("\n---", 3);
|
|
22
|
+
if (endIndex === -1) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const yamlContent = content.substring(4, endIndex).trim();
|
|
26
|
+
if (!yamlContent) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// Simple YAML parser for common frontmatter patterns
|
|
30
|
+
const result = {};
|
|
31
|
+
const lines = yamlContent.split("\n");
|
|
32
|
+
let currentKey = null;
|
|
33
|
+
let currentArray = null;
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
const trimmed = line.trim();
|
|
36
|
+
// Skip empty lines and comments
|
|
37
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Check for array item (starts with -)
|
|
41
|
+
if (trimmed.startsWith("- ") && currentKey && currentArray) {
|
|
42
|
+
// Remove quotes from array item
|
|
43
|
+
const item = trimmed.substring(2).trim().replace(/^["']|["']$/g, "");
|
|
44
|
+
currentArray.push(item);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Check for key: value pair
|
|
48
|
+
const colonIndex = trimmed.indexOf(":");
|
|
49
|
+
if (colonIndex > 0) {
|
|
50
|
+
// Save previous array if exists
|
|
51
|
+
if (currentKey && currentArray) {
|
|
52
|
+
result[currentKey] = currentArray;
|
|
53
|
+
}
|
|
54
|
+
currentKey = trimmed.substring(0, colonIndex).trim();
|
|
55
|
+
const value = trimmed.substring(colonIndex + 1).trim();
|
|
56
|
+
if (value) {
|
|
57
|
+
// Inline value - could be array [a, b, c] or string
|
|
58
|
+
if (value.startsWith("[") && value.endsWith("]")) {
|
|
59
|
+
// Inline array: [tag1, tag2, tag3]
|
|
60
|
+
const arrayContent = value.substring(1, value.length - 1);
|
|
61
|
+
result[currentKey] = arrayContent
|
|
62
|
+
.split(",")
|
|
63
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
64
|
+
.filter((s) => s.length > 0);
|
|
65
|
+
currentKey = null;
|
|
66
|
+
currentArray = null;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// String value
|
|
70
|
+
result[currentKey] = value.replace(/^["']|["']$/g, "");
|
|
71
|
+
currentKey = null;
|
|
72
|
+
currentArray = null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Value on next lines (array)
|
|
77
|
+
currentArray = [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Save final array if exists
|
|
82
|
+
if (currentKey && currentArray) {
|
|
83
|
+
result[currentKey] = currentArray;
|
|
84
|
+
}
|
|
85
|
+
return Object.keys(result).length > 0 ? result : null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Extract tags from Obsidian file content.
|
|
89
|
+
* Supports both frontmatter tags and inline #tags.
|
|
90
|
+
*/
|
|
91
|
+
export async function extractTags(filePath) {
|
|
92
|
+
try {
|
|
93
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
94
|
+
const tags = new Set();
|
|
95
|
+
// Extract from frontmatter
|
|
96
|
+
const frontmatter = parseFrontmatter(content);
|
|
97
|
+
if (frontmatter?.tags) {
|
|
98
|
+
const fmTags = Array.isArray(frontmatter.tags)
|
|
99
|
+
? frontmatter.tags
|
|
100
|
+
: [frontmatter.tags];
|
|
101
|
+
fmTags.forEach((tag) => {
|
|
102
|
+
// Remove # prefix if present
|
|
103
|
+
const cleaned = tag.replace(/^#/, "").trim();
|
|
104
|
+
if (cleaned)
|
|
105
|
+
tags.add(cleaned);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Also check for 'tag' (singular) in frontmatter
|
|
109
|
+
if (frontmatter?.tag) {
|
|
110
|
+
const fmTag = Array.isArray(frontmatter.tag)
|
|
111
|
+
? frontmatter.tag
|
|
112
|
+
: [frontmatter.tag];
|
|
113
|
+
fmTag.forEach((tag) => {
|
|
114
|
+
const cleaned = tag.replace(/^#/, "").trim();
|
|
115
|
+
if (cleaned)
|
|
116
|
+
tags.add(cleaned);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return Array.from(tags).sort();
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Generate a unique ID for a context file
|
|
127
|
+
* Format: slugified-name-randomhex
|
|
128
|
+
*/
|
|
129
|
+
export function generateContextId(name) {
|
|
130
|
+
const slug = sanitizeFilename(name).toLowerCase().substring(0, 30);
|
|
131
|
+
const randomSuffix = Math.random().toString(16).substring(2, 8);
|
|
132
|
+
return `${slug}-${randomSuffix}`;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Sanitize a filename for safe filesystem use
|
|
136
|
+
* - Converts spaces to dashes
|
|
137
|
+
* - Removes special characters
|
|
138
|
+
* - Keeps alphanumeric, dashes, underscores
|
|
139
|
+
*/
|
|
140
|
+
export function sanitizeFilename(name) {
|
|
141
|
+
return name
|
|
142
|
+
.trim()
|
|
143
|
+
.replace(/\s+/g, "-") // spaces to dashes
|
|
144
|
+
.replace(/[^a-zA-Z0-9_-]/g, "") // remove special chars
|
|
145
|
+
.replace(/-+/g, "-") // collapse multiple dashes
|
|
146
|
+
.replace(/^-|-$/g, ""); // trim leading/trailing dashes
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get the context directory path for a project
|
|
150
|
+
*/
|
|
151
|
+
export function getContextDir(cwd) {
|
|
152
|
+
return join(cwd, JACQUES_DIR, CONTEXT_DIR);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Add a context file from an external source
|
|
156
|
+
* Copies the file to .jacques/context/ and updates the index
|
|
157
|
+
*/
|
|
158
|
+
export async function addContext(options) {
|
|
159
|
+
const { cwd, sourceFile, name, source, description } = options;
|
|
160
|
+
// Ensure context directory exists
|
|
161
|
+
const contextDir = getContextDir(cwd);
|
|
162
|
+
await fs.mkdir(contextDir, { recursive: true });
|
|
163
|
+
// Generate unique ID and destination filename
|
|
164
|
+
const id = generateContextId(name);
|
|
165
|
+
const destFilename = `${sanitizeFilename(name)}.md`;
|
|
166
|
+
const destPath = join(contextDir, destFilename);
|
|
167
|
+
const relativePath = join(JACQUES_DIR, CONTEXT_DIR, destFilename);
|
|
168
|
+
// Extract tags before copying (from source file)
|
|
169
|
+
const tags = await extractTags(sourceFile);
|
|
170
|
+
// Copy the file
|
|
171
|
+
await fs.copyFile(sourceFile, destPath);
|
|
172
|
+
// Get file size
|
|
173
|
+
const stats = await fs.stat(destPath);
|
|
174
|
+
// Create context file entry
|
|
175
|
+
const contextFile = {
|
|
176
|
+
id,
|
|
177
|
+
name,
|
|
178
|
+
path: relativePath,
|
|
179
|
+
source,
|
|
180
|
+
sourceFile,
|
|
181
|
+
addedAt: new Date().toISOString(),
|
|
182
|
+
description,
|
|
183
|
+
sizeBytes: stats.size,
|
|
184
|
+
...(tags.length > 0 && { tags }),
|
|
185
|
+
};
|
|
186
|
+
// Add to index
|
|
187
|
+
await addToIndex(cwd, contextFile);
|
|
188
|
+
return contextFile;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Remove a context file by ID
|
|
192
|
+
* Deletes the file from .jacques/context/ and updates the index
|
|
193
|
+
*/
|
|
194
|
+
export async function removeContext(cwd, contextFile) {
|
|
195
|
+
// Delete the file
|
|
196
|
+
const filePath = join(cwd, contextFile.path);
|
|
197
|
+
try {
|
|
198
|
+
await fs.unlink(filePath);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// File may already be deleted
|
|
202
|
+
}
|
|
203
|
+
// Remove from index
|
|
204
|
+
const { removeFromIndex } = await import("./indexer.js");
|
|
205
|
+
await removeFromIndex(cwd, contextFile.id);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if context directory exists and has files
|
|
209
|
+
*/
|
|
210
|
+
export async function hasContextFiles(cwd) {
|
|
211
|
+
const contextDir = getContextDir(cwd);
|
|
212
|
+
try {
|
|
213
|
+
const entries = await fs.readdir(contextDir);
|
|
214
|
+
return entries.some((e) => e.endsWith(".md"));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Format file size in human-readable format
|
|
222
|
+
*/
|
|
223
|
+
export function formatFileSize(bytes) {
|
|
224
|
+
if (bytes < 1024) {
|
|
225
|
+
return `${bytes} B`;
|
|
226
|
+
}
|
|
227
|
+
if (bytes < 1024 * 1024) {
|
|
228
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
229
|
+
}
|
|
230
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
231
|
+
}
|
|
232
|
+
// Lazy-load tiktoken to avoid import errors if unavailable
|
|
233
|
+
let tiktokenModule = null;
|
|
234
|
+
let encoder = null;
|
|
235
|
+
/**
|
|
236
|
+
* Initialize tiktoken encoder (lazy-loaded).
|
|
237
|
+
* Uses cl100k_base encoding which is compatible with Claude models.
|
|
238
|
+
*/
|
|
239
|
+
async function getEncoder() {
|
|
240
|
+
if (encoder)
|
|
241
|
+
return encoder;
|
|
242
|
+
try {
|
|
243
|
+
if (!tiktokenModule) {
|
|
244
|
+
tiktokenModule = await import("@dqbd/tiktoken");
|
|
245
|
+
}
|
|
246
|
+
encoder = tiktokenModule.get_encoding("cl100k_base");
|
|
247
|
+
return encoder;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Estimate tokens from file size (quick estimation).
|
|
255
|
+
* Uses ~4.5 characters per token for English markdown text.
|
|
256
|
+
*/
|
|
257
|
+
export function estimateTokensFromSize(bytes) {
|
|
258
|
+
return Math.ceil(bytes / 4.5);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Count tokens in text content using tiktoken.
|
|
262
|
+
* Falls back to character-based estimation if tiktoken unavailable.
|
|
263
|
+
*/
|
|
264
|
+
export async function countTokens(text) {
|
|
265
|
+
if (!text)
|
|
266
|
+
return 0;
|
|
267
|
+
const enc = await getEncoder();
|
|
268
|
+
if (enc) {
|
|
269
|
+
try {
|
|
270
|
+
const tokens = enc.encode(text);
|
|
271
|
+
return tokens.length;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Fall through to estimation
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Fallback: character-based estimation
|
|
278
|
+
return Math.ceil(text.length / 4.5);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Count tokens in a file using tiktoken.
|
|
282
|
+
* Falls back to size-based estimation if file read fails.
|
|
283
|
+
*/
|
|
284
|
+
export async function countFileTokens(filePath) {
|
|
285
|
+
try {
|
|
286
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
287
|
+
return countTokens(content);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// If we can't read the file, estimate from size
|
|
291
|
+
try {
|
|
292
|
+
const stats = await fs.stat(filePath);
|
|
293
|
+
return estimateTokensFromSize(stats.size);
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
return 0;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Format token count as human-readable string.
|
|
302
|
+
* Examples: "523", "1.2k", "45.2k"
|
|
303
|
+
*/
|
|
304
|
+
export function formatTokenCount(tokens) {
|
|
305
|
+
if (tokens < 1000) {
|
|
306
|
+
return tokens.toString();
|
|
307
|
+
}
|
|
308
|
+
return `${(tokens / 1000).toFixed(1)}k`;
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/context/manager.ts"],"names":[],"mappings":"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"}
|