@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,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Indexer
|
|
3
|
+
*
|
|
4
|
+
* Builds and maintains a keyword inverted index for conversation search.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Words to exclude from keyword indexing.
|
|
8
|
+
* Reduced from original 102 words to focus on actual stop words,
|
|
9
|
+
* keeping tech-relevant verbs and terms that might be meaningful in searches.
|
|
10
|
+
*
|
|
11
|
+
* Removed from original: create, make, use, new, get, help, look, need, want
|
|
12
|
+
* These can be meaningful in technical contexts (e.g., "create user", "use api", "get data")
|
|
13
|
+
*/
|
|
14
|
+
const STOP_WORDS = new Set([
|
|
15
|
+
// Articles and determiners
|
|
16
|
+
"a",
|
|
17
|
+
"an",
|
|
18
|
+
"the",
|
|
19
|
+
// Pronouns
|
|
20
|
+
"i",
|
|
21
|
+
"you",
|
|
22
|
+
"we",
|
|
23
|
+
"he",
|
|
24
|
+
"she",
|
|
25
|
+
"it",
|
|
26
|
+
"they",
|
|
27
|
+
"them",
|
|
28
|
+
"me",
|
|
29
|
+
"my",
|
|
30
|
+
"your",
|
|
31
|
+
"our",
|
|
32
|
+
"their",
|
|
33
|
+
"its",
|
|
34
|
+
// Prepositions
|
|
35
|
+
"at",
|
|
36
|
+
"by",
|
|
37
|
+
"for",
|
|
38
|
+
"from",
|
|
39
|
+
"in",
|
|
40
|
+
"of",
|
|
41
|
+
"on",
|
|
42
|
+
"to",
|
|
43
|
+
"with",
|
|
44
|
+
"as",
|
|
45
|
+
"about",
|
|
46
|
+
// Conjunctions
|
|
47
|
+
"and",
|
|
48
|
+
"or",
|
|
49
|
+
"but",
|
|
50
|
+
"if",
|
|
51
|
+
"so",
|
|
52
|
+
// Common verbs (that don't carry meaning)
|
|
53
|
+
"are",
|
|
54
|
+
"be",
|
|
55
|
+
"been",
|
|
56
|
+
"is",
|
|
57
|
+
"was",
|
|
58
|
+
"has",
|
|
59
|
+
"have",
|
|
60
|
+
"had",
|
|
61
|
+
"do",
|
|
62
|
+
"does",
|
|
63
|
+
"did",
|
|
64
|
+
"done",
|
|
65
|
+
"doing",
|
|
66
|
+
"will",
|
|
67
|
+
"would",
|
|
68
|
+
"can",
|
|
69
|
+
"could",
|
|
70
|
+
"may",
|
|
71
|
+
"might",
|
|
72
|
+
"must",
|
|
73
|
+
"should",
|
|
74
|
+
// Other common words without technical meaning
|
|
75
|
+
"that",
|
|
76
|
+
"this",
|
|
77
|
+
"what",
|
|
78
|
+
"when",
|
|
79
|
+
"where",
|
|
80
|
+
"who",
|
|
81
|
+
"which",
|
|
82
|
+
"why",
|
|
83
|
+
"how",
|
|
84
|
+
"all",
|
|
85
|
+
"there",
|
|
86
|
+
"here",
|
|
87
|
+
"not",
|
|
88
|
+
"just",
|
|
89
|
+
"also",
|
|
90
|
+
"then",
|
|
91
|
+
"now",
|
|
92
|
+
"please",
|
|
93
|
+
"thanks",
|
|
94
|
+
]);
|
|
95
|
+
/** Score weights by field type */
|
|
96
|
+
const FIELD_WEIGHTS = {
|
|
97
|
+
title: 2.0,
|
|
98
|
+
question: 1.5,
|
|
99
|
+
tool: 1.2, // Tools used (Read, Write, Bash, etc.)
|
|
100
|
+
file: 1.0,
|
|
101
|
+
tech: 1.0,
|
|
102
|
+
subagent: 0.8, // Subagent prompts
|
|
103
|
+
snippet: 0.5,
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Tokenize text into keywords.
|
|
107
|
+
*/
|
|
108
|
+
export function tokenize(text) {
|
|
109
|
+
return text
|
|
110
|
+
.toLowerCase()
|
|
111
|
+
.split(/\W+/)
|
|
112
|
+
.filter((w) => w.length >= 2 && w.length <= 50)
|
|
113
|
+
.filter((w) => !STOP_WORDS.has(w))
|
|
114
|
+
.filter((w) => !/^\d+$/.test(w));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extract keywords from a file path.
|
|
118
|
+
* "src/auth/jwt.ts" → ["src", "auth", "jwt", "ts"]
|
|
119
|
+
*/
|
|
120
|
+
export function extractPathKeywords(filePath) {
|
|
121
|
+
return filePath
|
|
122
|
+
.split(/[\/\\\-_\.]/)
|
|
123
|
+
.map((p) => p.toLowerCase())
|
|
124
|
+
.filter((p) => p.length >= 2 && !STOP_WORDS.has(p));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Extract all keywords from a manifest with field attribution.
|
|
128
|
+
*/
|
|
129
|
+
export function extractKeywordsWithFields(manifest) {
|
|
130
|
+
const results = [];
|
|
131
|
+
const seenKeywords = new Map();
|
|
132
|
+
// Helper to add keyword with deduplication (keep highest score)
|
|
133
|
+
const addKeyword = (keyword, field) => {
|
|
134
|
+
const score = FIELD_WEIGHTS[field] || 1.0;
|
|
135
|
+
const existing = seenKeywords.get(keyword);
|
|
136
|
+
if (!existing || existing.score < score) {
|
|
137
|
+
seenKeywords.set(keyword, { field, score });
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
// From title (highest weight)
|
|
141
|
+
tokenize(manifest.title).forEach((w) => addKeyword(w, "title"));
|
|
142
|
+
// From user questions (all of them, not limited)
|
|
143
|
+
manifest.userQuestions.forEach((q) => tokenize(q).forEach((w) => addKeyword(w, "question")));
|
|
144
|
+
// From tools used (meaningful for search - "used Bash", "used Write", etc.)
|
|
145
|
+
manifest.toolsUsed.forEach((tool) => {
|
|
146
|
+
// Add the tool name itself
|
|
147
|
+
addKeyword(tool.toLowerCase(), "tool");
|
|
148
|
+
// Also tokenize for compound names
|
|
149
|
+
tokenize(tool).forEach((w) => addKeyword(w, "tool"));
|
|
150
|
+
});
|
|
151
|
+
// From file paths
|
|
152
|
+
manifest.filesModified.forEach((f) => extractPathKeywords(f).forEach((w) => addKeyword(w, "file")));
|
|
153
|
+
// Technologies (exact match)
|
|
154
|
+
manifest.technologies.forEach((t) => addKeyword(t.toLowerCase(), "tech"));
|
|
155
|
+
// From context snippets (increased from 5 to capture more)
|
|
156
|
+
manifest.contextSnippets?.forEach((s) => tokenize(s).forEach((w) => addKeyword(w, "snippet")));
|
|
157
|
+
// From subagent information if available
|
|
158
|
+
if (manifest.subagents && manifest.subagents.ids.length > 0) {
|
|
159
|
+
// Add "subagent" as a keyword so users can search for sessions with subagents
|
|
160
|
+
addKeyword("subagent", "subagent");
|
|
161
|
+
addKeyword("agent", "subagent");
|
|
162
|
+
// Note: Full subagent prompts are stored separately and indexed when archived
|
|
163
|
+
}
|
|
164
|
+
// From plan references if available
|
|
165
|
+
manifest.plans.forEach((plan) => {
|
|
166
|
+
// Index plan names
|
|
167
|
+
extractPathKeywords(plan.name).forEach((w) => addKeyword(w, "file"));
|
|
168
|
+
addKeyword("plan", "file");
|
|
169
|
+
});
|
|
170
|
+
// Convert map to array
|
|
171
|
+
for (const [keyword, { field, score }] of seenKeywords) {
|
|
172
|
+
results.push({ keyword, field, score });
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Add a conversation to the search index.
|
|
178
|
+
*/
|
|
179
|
+
export function addToIndex(index, manifest) {
|
|
180
|
+
// Extract keywords
|
|
181
|
+
const keywordData = extractKeywordsWithFields(manifest);
|
|
182
|
+
// Update inverted index
|
|
183
|
+
for (const { keyword, field, score } of keywordData) {
|
|
184
|
+
if (!index.keywords[keyword]) {
|
|
185
|
+
index.keywords[keyword] = [];
|
|
186
|
+
}
|
|
187
|
+
// Check if this manifest is already indexed for this keyword
|
|
188
|
+
const existingIdx = index.keywords[keyword].findIndex((r) => r.id === manifest.id);
|
|
189
|
+
const ref = {
|
|
190
|
+
id: manifest.id,
|
|
191
|
+
score,
|
|
192
|
+
field,
|
|
193
|
+
};
|
|
194
|
+
if (existingIdx >= 0) {
|
|
195
|
+
// Update if new score is higher
|
|
196
|
+
if (index.keywords[keyword][existingIdx].score < score) {
|
|
197
|
+
index.keywords[keyword][existingIdx] = ref;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
index.keywords[keyword].push(ref);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Update project info (keyed by projectId for uniqueness)
|
|
205
|
+
const projectKey = manifest.projectId || manifest.projectSlug;
|
|
206
|
+
if (!index.projects[projectKey]) {
|
|
207
|
+
index.projects[projectKey] = {
|
|
208
|
+
path: manifest.projectPath,
|
|
209
|
+
conversationCount: 0,
|
|
210
|
+
lastActivity: manifest.endedAt,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const projectInfo = index.projects[projectKey];
|
|
214
|
+
projectInfo.conversationCount++;
|
|
215
|
+
// Update last activity if newer
|
|
216
|
+
if (manifest.endedAt > projectInfo.lastActivity) {
|
|
217
|
+
projectInfo.lastActivity = manifest.endedAt;
|
|
218
|
+
}
|
|
219
|
+
// Update metadata
|
|
220
|
+
index.metadata.totalConversations++;
|
|
221
|
+
index.metadata.totalKeywords = Object.keys(index.keywords).length;
|
|
222
|
+
index.lastUpdated = new Date().toISOString();
|
|
223
|
+
return index;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Remove a conversation from the search index.
|
|
227
|
+
* @param projectId The projectId (encoded path) or projectSlug for old data
|
|
228
|
+
*/
|
|
229
|
+
export function removeFromIndex(index, manifestId, projectId) {
|
|
230
|
+
// Remove from keyword index
|
|
231
|
+
for (const keyword of Object.keys(index.keywords)) {
|
|
232
|
+
index.keywords[keyword] = index.keywords[keyword].filter((r) => r.id !== manifestId);
|
|
233
|
+
// Remove empty keyword entries
|
|
234
|
+
if (index.keywords[keyword].length === 0) {
|
|
235
|
+
delete index.keywords[keyword];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Update project info
|
|
239
|
+
if (index.projects[projectId]) {
|
|
240
|
+
index.projects[projectId].conversationCount--;
|
|
241
|
+
// Remove project if no more conversations
|
|
242
|
+
if (index.projects[projectId].conversationCount <= 0) {
|
|
243
|
+
delete index.projects[projectId];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Update metadata
|
|
247
|
+
index.metadata.totalConversations = Math.max(0, index.metadata.totalConversations - 1);
|
|
248
|
+
index.metadata.totalKeywords = Object.keys(index.keywords).length;
|
|
249
|
+
index.lastUpdated = new Date().toISOString();
|
|
250
|
+
return index;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Search the index for matching conversations.
|
|
254
|
+
* Returns manifest IDs sorted by relevance score.
|
|
255
|
+
*/
|
|
256
|
+
export function searchIndex(index, query) {
|
|
257
|
+
const queryKeywords = tokenize(query);
|
|
258
|
+
if (queryKeywords.length === 0) {
|
|
259
|
+
return [];
|
|
260
|
+
}
|
|
261
|
+
// Aggregate scores for each manifest
|
|
262
|
+
const scores = new Map();
|
|
263
|
+
for (const keyword of queryKeywords) {
|
|
264
|
+
const refs = index.keywords[keyword];
|
|
265
|
+
if (!refs)
|
|
266
|
+
continue;
|
|
267
|
+
for (const ref of refs) {
|
|
268
|
+
const currentScore = scores.get(ref.id) || 0;
|
|
269
|
+
scores.set(ref.id, currentScore + ref.score);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Convert to array and sort by score
|
|
273
|
+
const results = [];
|
|
274
|
+
for (const [id, score] of scores) {
|
|
275
|
+
results.push({ id, score });
|
|
276
|
+
}
|
|
277
|
+
return results.sort((a, b) => b.score - a.score);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get index statistics.
|
|
281
|
+
*/
|
|
282
|
+
export function getIndexStats(index) {
|
|
283
|
+
const totalProjects = Object.keys(index.projects).length;
|
|
284
|
+
const avgKeywords = index.metadata.totalConversations > 0
|
|
285
|
+
? index.metadata.totalKeywords / index.metadata.totalConversations
|
|
286
|
+
: 0;
|
|
287
|
+
return {
|
|
288
|
+
totalConversations: index.metadata.totalConversations,
|
|
289
|
+
totalKeywords: index.metadata.totalKeywords,
|
|
290
|
+
totalProjects,
|
|
291
|
+
averageKeywordsPerConversation: Math.round(avgKeywords * 10) / 10,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=search-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-indexer.js","sourceRoot":"","sources":["../../src/archive/search-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent Store
|
|
3
|
+
*
|
|
4
|
+
* Manages storage and retrieval of archived subagent conversations.
|
|
5
|
+
* Subagents are stored separately from main sessions because Claude Code
|
|
6
|
+
* stores their conversations in separate JSONL files.
|
|
7
|
+
*
|
|
8
|
+
* Storage structure:
|
|
9
|
+
* ~/.jacques/archive/subagents/{agentId}.json
|
|
10
|
+
*/
|
|
11
|
+
import type { DisplayMessage } from "../session/transformer.js";
|
|
12
|
+
/**
|
|
13
|
+
* Token statistics for a subagent conversation
|
|
14
|
+
*/
|
|
15
|
+
export interface SubagentTokenStats {
|
|
16
|
+
totalInput: number;
|
|
17
|
+
totalOutput: number;
|
|
18
|
+
cacheCreation?: number;
|
|
19
|
+
cacheRead?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Archived subagent conversation
|
|
23
|
+
*/
|
|
24
|
+
export interface ArchivedSubagent {
|
|
25
|
+
/** Agent ID (e.g., "a0323e0") */
|
|
26
|
+
id: string;
|
|
27
|
+
/** Parent session ID */
|
|
28
|
+
sessionId: string;
|
|
29
|
+
/** Project slug for context */
|
|
30
|
+
projectSlug: string;
|
|
31
|
+
/** ISO timestamp when archived */
|
|
32
|
+
archivedAt: string;
|
|
33
|
+
/** Task prompt given to the agent */
|
|
34
|
+
prompt: string;
|
|
35
|
+
/** Model used (e.g., "claude-haiku-4-5") */
|
|
36
|
+
model?: string;
|
|
37
|
+
/** Full conversation messages */
|
|
38
|
+
conversation: DisplayMessage[];
|
|
39
|
+
/** Statistics about the subagent conversation */
|
|
40
|
+
statistics: {
|
|
41
|
+
messageCount: number;
|
|
42
|
+
toolCallCount: number;
|
|
43
|
+
tokens: SubagentTokenStats;
|
|
44
|
+
durationMs?: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Reference to a subagent stored in the archive
|
|
49
|
+
* Used in manifests and indexes to link to full content
|
|
50
|
+
*/
|
|
51
|
+
export interface SubagentReference {
|
|
52
|
+
/** Agent ID */
|
|
53
|
+
id: string;
|
|
54
|
+
/** Parent session ID */
|
|
55
|
+
sessionId: string;
|
|
56
|
+
/** Truncated prompt preview (max 100 chars) */
|
|
57
|
+
promptPreview: string;
|
|
58
|
+
/** Model used */
|
|
59
|
+
model?: string;
|
|
60
|
+
/** Total tokens used */
|
|
61
|
+
tokenCount: number;
|
|
62
|
+
/** Number of messages in the conversation */
|
|
63
|
+
messageCount: number;
|
|
64
|
+
/** Position in parent conversation */
|
|
65
|
+
position: {
|
|
66
|
+
/** UUID of the preceding message in parent session */
|
|
67
|
+
afterMessageUuid?: string;
|
|
68
|
+
/** Index in the parent conversation */
|
|
69
|
+
index: number;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Archive a subagent conversation
|
|
74
|
+
*/
|
|
75
|
+
export declare function archiveSubagent(subagent: ArchivedSubagent): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Read a subagent from the archive
|
|
78
|
+
*/
|
|
79
|
+
export declare function readSubagent(agentId: string): Promise<ArchivedSubagent | null>;
|
|
80
|
+
/**
|
|
81
|
+
* List all subagents for a given session
|
|
82
|
+
*/
|
|
83
|
+
export declare function listSubagentsForSession(sessionId: string): Promise<ArchivedSubagent[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a subagent is already archived
|
|
86
|
+
*/
|
|
87
|
+
export declare function isSubagentArchived(agentId: string): Promise<boolean>;
|
|
88
|
+
/**
|
|
89
|
+
* List all subagent IDs in the archive
|
|
90
|
+
*/
|
|
91
|
+
export declare function listAllSubagentIds(): Promise<string[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Create a SubagentReference from an ArchivedSubagent
|
|
94
|
+
* Token counts include:
|
|
95
|
+
* - totalInput: non-cached input tokens
|
|
96
|
+
* - cacheCreation: new tokens written to cache
|
|
97
|
+
* - cacheRead: tokens read from cache
|
|
98
|
+
* - totalOutput: tokens generated by Claude
|
|
99
|
+
*/
|
|
100
|
+
export declare function createSubagentReference(subagent: ArchivedSubagent, positionIndex: number, afterMessageUuid?: string): SubagentReference;
|
|
101
|
+
/**
|
|
102
|
+
* Delete a subagent from the archive
|
|
103
|
+
*/
|
|
104
|
+
export declare function deleteSubagent(agentId: string): Promise<boolean>;
|
|
105
|
+
/**
|
|
106
|
+
* Get statistics about the subagent archive
|
|
107
|
+
*/
|
|
108
|
+
export declare function getSubagentArchiveStats(): Promise<{
|
|
109
|
+
totalSubagents: number;
|
|
110
|
+
totalTokens: number;
|
|
111
|
+
bySession: Map<string, number>;
|
|
112
|
+
}>;
|
|
113
|
+
//# sourceMappingURL=subagent-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-store.d.ts","sourceRoot":"","sources":["../../src/archive/subagent-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAUhE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,iDAAiD;IACjD,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,kBAAkB,CAAC;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,EAAE;QACR,sDAAsD;QACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,uCAAuC;QACvC,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAgBD;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAQlC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB7B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAU5D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,MAAM,GACxB,iBAAiB,CAyBnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQtE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,CAAC,CAuBD"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent Store
|
|
3
|
+
*
|
|
4
|
+
* Manages storage and retrieval of archived subagent conversations.
|
|
5
|
+
* Subagents are stored separately from main sessions because Claude Code
|
|
6
|
+
* stores their conversations in separate JSONL files.
|
|
7
|
+
*
|
|
8
|
+
* Storage structure:
|
|
9
|
+
* ~/.jacques/archive/subagents/{agentId}.json
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from "fs";
|
|
12
|
+
import * as path from "path";
|
|
13
|
+
import { homedir } from "os";
|
|
14
|
+
/** Archive directory for subagents */
|
|
15
|
+
const SUBAGENTS_DIR = path.join(homedir(), ".jacques", "archive", "subagents");
|
|
16
|
+
/**
|
|
17
|
+
* Ensure the subagents archive directory exists
|
|
18
|
+
*/
|
|
19
|
+
async function ensureSubagentsDir() {
|
|
20
|
+
await fs.mkdir(SUBAGENTS_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the file path for a subagent archive
|
|
24
|
+
*/
|
|
25
|
+
function getSubagentPath(agentId) {
|
|
26
|
+
return path.join(SUBAGENTS_DIR, `${agentId}.json`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Archive a subagent conversation
|
|
30
|
+
*/
|
|
31
|
+
export async function archiveSubagent(subagent) {
|
|
32
|
+
await ensureSubagentsDir();
|
|
33
|
+
const filePath = getSubagentPath(subagent.id);
|
|
34
|
+
await fs.writeFile(filePath, JSON.stringify(subagent, null, 2), "utf-8");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read a subagent from the archive
|
|
38
|
+
*/
|
|
39
|
+
export async function readSubagent(agentId) {
|
|
40
|
+
const filePath = getSubagentPath(agentId);
|
|
41
|
+
try {
|
|
42
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
43
|
+
return JSON.parse(content);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* List all subagents for a given session
|
|
51
|
+
*/
|
|
52
|
+
export async function listSubagentsForSession(sessionId) {
|
|
53
|
+
try {
|
|
54
|
+
await ensureSubagentsDir();
|
|
55
|
+
const files = await fs.readdir(SUBAGENTS_DIR);
|
|
56
|
+
const subagents = [];
|
|
57
|
+
for (const file of files) {
|
|
58
|
+
if (!file.endsWith(".json"))
|
|
59
|
+
continue;
|
|
60
|
+
const filePath = path.join(SUBAGENTS_DIR, file);
|
|
61
|
+
try {
|
|
62
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
63
|
+
const subagent = JSON.parse(content);
|
|
64
|
+
if (subagent.sessionId === sessionId) {
|
|
65
|
+
subagents.push(subagent);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Skip invalid files
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return subagents;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a subagent is already archived
|
|
80
|
+
*/
|
|
81
|
+
export async function isSubagentArchived(agentId) {
|
|
82
|
+
const filePath = getSubagentPath(agentId);
|
|
83
|
+
try {
|
|
84
|
+
await fs.access(filePath);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* List all subagent IDs in the archive
|
|
93
|
+
*/
|
|
94
|
+
export async function listAllSubagentIds() {
|
|
95
|
+
try {
|
|
96
|
+
await ensureSubagentsDir();
|
|
97
|
+
const files = await fs.readdir(SUBAGENTS_DIR);
|
|
98
|
+
return files
|
|
99
|
+
.filter((f) => f.endsWith(".json"))
|
|
100
|
+
.map((f) => path.basename(f, ".json"));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Create a SubagentReference from an ArchivedSubagent
|
|
108
|
+
* Token counts include:
|
|
109
|
+
* - totalInput: non-cached input tokens
|
|
110
|
+
* - cacheCreation: new tokens written to cache
|
|
111
|
+
* - cacheRead: tokens read from cache
|
|
112
|
+
* - totalOutput: tokens generated by Claude
|
|
113
|
+
*/
|
|
114
|
+
export function createSubagentReference(subagent, positionIndex, afterMessageUuid) {
|
|
115
|
+
const tokens = subagent.statistics.tokens;
|
|
116
|
+
// Total context = input + cache creation + cache read
|
|
117
|
+
const totalContext = tokens.totalInput +
|
|
118
|
+
(tokens.cacheCreation ?? 0) +
|
|
119
|
+
(tokens.cacheRead ?? 0);
|
|
120
|
+
// Total tokens includes output
|
|
121
|
+
const totalTokens = totalContext + tokens.totalOutput;
|
|
122
|
+
return {
|
|
123
|
+
id: subagent.id,
|
|
124
|
+
sessionId: subagent.sessionId,
|
|
125
|
+
promptPreview: subagent.prompt.length > 100
|
|
126
|
+
? subagent.prompt.slice(0, 97) + "..."
|
|
127
|
+
: subagent.prompt,
|
|
128
|
+
model: subagent.model,
|
|
129
|
+
tokenCount: totalTokens,
|
|
130
|
+
messageCount: subagent.statistics.messageCount,
|
|
131
|
+
position: {
|
|
132
|
+
afterMessageUuid,
|
|
133
|
+
index: positionIndex,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Delete a subagent from the archive
|
|
139
|
+
*/
|
|
140
|
+
export async function deleteSubagent(agentId) {
|
|
141
|
+
const filePath = getSubagentPath(agentId);
|
|
142
|
+
try {
|
|
143
|
+
await fs.unlink(filePath);
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get statistics about the subagent archive
|
|
152
|
+
*/
|
|
153
|
+
export async function getSubagentArchiveStats() {
|
|
154
|
+
const ids = await listAllSubagentIds();
|
|
155
|
+
let totalTokens = 0;
|
|
156
|
+
const bySession = new Map();
|
|
157
|
+
for (const id of ids) {
|
|
158
|
+
const subagent = await readSubagent(id);
|
|
159
|
+
if (subagent) {
|
|
160
|
+
const tokens = subagent.statistics.tokens.totalInput +
|
|
161
|
+
subagent.statistics.tokens.totalOutput;
|
|
162
|
+
totalTokens += tokens;
|
|
163
|
+
const sessionCount = bySession.get(subagent.sessionId) || 0;
|
|
164
|
+
bySession.set(subagent.sessionId, sessionCount + 1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
totalSubagents: ids.length,
|
|
169
|
+
totalTokens,
|
|
170
|
+
bySession,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=subagent-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-store.js","sourceRoot":"","sources":["../../src/archive/subagent-store.ts"],"names":[],"mappings":"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"}
|