@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.
Files changed (341) hide show
  1. package/dist/archive/archive-store.d.ts +166 -0
  2. package/dist/archive/archive-store.d.ts.map +1 -0
  3. package/dist/archive/archive-store.js +612 -0
  4. package/dist/archive/archive-store.js.map +1 -0
  5. package/dist/archive/bulk-archive.d.ts +63 -0
  6. package/dist/archive/bulk-archive.d.ts.map +1 -0
  7. package/dist/archive/bulk-archive.js +315 -0
  8. package/dist/archive/bulk-archive.js.map +1 -0
  9. package/dist/archive/filename-utils.d.ts +39 -0
  10. package/dist/archive/filename-utils.d.ts.map +1 -0
  11. package/dist/archive/filename-utils.js +78 -0
  12. package/dist/archive/filename-utils.js.map +1 -0
  13. package/dist/archive/index.d.ts +21 -0
  14. package/dist/archive/index.d.ts.map +1 -0
  15. package/dist/archive/index.js +45 -0
  16. package/dist/archive/index.js.map +1 -0
  17. package/dist/archive/manifest-extractor.d.ts +40 -0
  18. package/dist/archive/manifest-extractor.d.ts.map +1 -0
  19. package/dist/archive/manifest-extractor.js +456 -0
  20. package/dist/archive/manifest-extractor.js.map +1 -0
  21. package/dist/archive/migration.d.ts +59 -0
  22. package/dist/archive/migration.d.ts.map +1 -0
  23. package/dist/archive/migration.js +172 -0
  24. package/dist/archive/migration.js.map +1 -0
  25. package/dist/archive/plan-cataloger.d.ts +24 -0
  26. package/dist/archive/plan-cataloger.d.ts.map +1 -0
  27. package/dist/archive/plan-cataloger.js +100 -0
  28. package/dist/archive/plan-cataloger.js.map +1 -0
  29. package/dist/archive/plan-extractor.d.ts +84 -0
  30. package/dist/archive/plan-extractor.d.ts.map +1 -0
  31. package/dist/archive/plan-extractor.js +371 -0
  32. package/dist/archive/plan-extractor.js.map +1 -0
  33. package/dist/archive/search-indexer.d.ts +50 -0
  34. package/dist/archive/search-indexer.d.ts.map +1 -0
  35. package/dist/archive/search-indexer.js +294 -0
  36. package/dist/archive/search-indexer.js.map +1 -0
  37. package/dist/archive/subagent-store.d.ts +113 -0
  38. package/dist/archive/subagent-store.d.ts.map +1 -0
  39. package/dist/archive/subagent-store.js +173 -0
  40. package/dist/archive/subagent-store.js.map +1 -0
  41. package/dist/archive/types.d.ts +236 -0
  42. package/dist/archive/types.d.ts.map +1 -0
  43. package/dist/archive/types.js +30 -0
  44. package/dist/archive/types.js.map +1 -0
  45. package/dist/branding.d.ts +9 -0
  46. package/dist/branding.d.ts.map +1 -0
  47. package/dist/branding.js +50 -0
  48. package/dist/branding.js.map +1 -0
  49. package/dist/cache/git-utils.d.ts +36 -0
  50. package/dist/cache/git-utils.d.ts.map +1 -0
  51. package/dist/cache/git-utils.js +160 -0
  52. package/dist/cache/git-utils.js.map +1 -0
  53. package/dist/cache/hidden-projects.d.ts +19 -0
  54. package/dist/cache/hidden-projects.d.ts.map +1 -0
  55. package/dist/cache/hidden-projects.js +48 -0
  56. package/dist/cache/hidden-projects.js.map +1 -0
  57. package/dist/cache/index.d.ts +15 -0
  58. package/dist/cache/index.d.ts.map +1 -0
  59. package/dist/cache/index.js +20 -0
  60. package/dist/cache/index.js.map +1 -0
  61. package/dist/cache/metadata-extractor.d.ts +62 -0
  62. package/dist/cache/metadata-extractor.d.ts.map +1 -0
  63. package/dist/cache/metadata-extractor.js +574 -0
  64. package/dist/cache/metadata-extractor.js.map +1 -0
  65. package/dist/cache/mode-detector.d.ts +19 -0
  66. package/dist/cache/mode-detector.d.ts.map +1 -0
  67. package/dist/cache/mode-detector.js +161 -0
  68. package/dist/cache/mode-detector.js.map +1 -0
  69. package/dist/cache/persistence.d.ts +39 -0
  70. package/dist/cache/persistence.d.ts.map +1 -0
  71. package/dist/cache/persistence.js +98 -0
  72. package/dist/cache/persistence.js.map +1 -0
  73. package/dist/cache/project-discovery.d.ts +41 -0
  74. package/dist/cache/project-discovery.d.ts.map +1 -0
  75. package/dist/cache/project-discovery.js +212 -0
  76. package/dist/cache/project-discovery.js.map +1 -0
  77. package/dist/cache/session-index.d.ts +258 -0
  78. package/dist/cache/session-index.d.ts.map +1 -0
  79. package/dist/cache/session-index.js +1030 -0
  80. package/dist/cache/session-index.js.map +1 -0
  81. package/dist/cache/types.d.ts +159 -0
  82. package/dist/cache/types.d.ts.map +1 -0
  83. package/dist/cache/types.js +29 -0
  84. package/dist/cache/types.js.map +1 -0
  85. package/dist/catalog/bulk-extractor.d.ts +18 -0
  86. package/dist/catalog/bulk-extractor.d.ts.map +1 -0
  87. package/dist/catalog/bulk-extractor.js +150 -0
  88. package/dist/catalog/bulk-extractor.js.map +1 -0
  89. package/dist/catalog/extractor.d.ts +53 -0
  90. package/dist/catalog/extractor.d.ts.map +1 -0
  91. package/dist/catalog/extractor.js +522 -0
  92. package/dist/catalog/extractor.js.map +1 -0
  93. package/dist/catalog/index.d.ts +10 -0
  94. package/dist/catalog/index.d.ts.map +1 -0
  95. package/dist/catalog/index.js +11 -0
  96. package/dist/catalog/index.js.map +1 -0
  97. package/dist/catalog/types.d.ts +134 -0
  98. package/dist/catalog/types.d.ts.map +1 -0
  99. package/dist/catalog/types.js +8 -0
  100. package/dist/catalog/types.js.map +1 -0
  101. package/dist/client/index.d.ts +6 -0
  102. package/dist/client/index.d.ts.map +1 -0
  103. package/dist/client/index.js +5 -0
  104. package/dist/client/index.js.map +1 -0
  105. package/dist/client/websocket-client.d.ts +96 -0
  106. package/dist/client/websocket-client.d.ts.map +1 -0
  107. package/dist/client/websocket-client.js +222 -0
  108. package/dist/client/websocket-client.js.map +1 -0
  109. package/dist/context/index.d.ts +13 -0
  110. package/dist/context/index.d.ts.map +1 -0
  111. package/dist/context/index.js +26 -0
  112. package/dist/context/index.js.map +1 -0
  113. package/dist/context/indexer.d.ts +73 -0
  114. package/dist/context/indexer.d.ts.map +1 -0
  115. package/dist/context/indexer.js +233 -0
  116. package/dist/context/indexer.js.map +1 -0
  117. package/dist/context/manager.d.ts +66 -0
  118. package/dist/context/manager.d.ts.map +1 -0
  119. package/dist/context/manager.js +310 -0
  120. package/dist/context/manager.js.map +1 -0
  121. package/dist/context/types.d.ts +149 -0
  122. package/dist/context/types.d.ts.map +1 -0
  123. package/dist/context/types.js +36 -0
  124. package/dist/context/types.js.map +1 -0
  125. package/dist/handoff/catalog.d.ts +54 -0
  126. package/dist/handoff/catalog.d.ts.map +1 -0
  127. package/dist/handoff/catalog.js +121 -0
  128. package/dist/handoff/catalog.js.map +1 -0
  129. package/dist/handoff/generator.d.ts +107 -0
  130. package/dist/handoff/generator.d.ts.map +1 -0
  131. package/dist/handoff/generator.js +603 -0
  132. package/dist/handoff/generator.js.map +1 -0
  133. package/dist/handoff/index.d.ts +13 -0
  134. package/dist/handoff/index.d.ts.map +1 -0
  135. package/dist/handoff/index.js +12 -0
  136. package/dist/handoff/index.js.map +1 -0
  137. package/dist/handoff/llm-generator.d.ts +77 -0
  138. package/dist/handoff/llm-generator.d.ts.map +1 -0
  139. package/dist/handoff/llm-generator.js +513 -0
  140. package/dist/handoff/llm-generator.js.map +1 -0
  141. package/dist/handoff/prompts.d.ts +18 -0
  142. package/dist/handoff/prompts.d.ts.map +1 -0
  143. package/dist/handoff/prompts.js +22 -0
  144. package/dist/handoff/prompts.js.map +1 -0
  145. package/dist/handoff/types.d.ts +28 -0
  146. package/dist/handoff/types.d.ts.map +1 -0
  147. package/dist/handoff/types.js +7 -0
  148. package/dist/handoff/types.js.map +1 -0
  149. package/dist/index.d.ts +56 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +132 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/logging/claude-operations.d.ts +111 -0
  154. package/dist/logging/claude-operations.d.ts.map +1 -0
  155. package/dist/logging/claude-operations.js +132 -0
  156. package/dist/logging/claude-operations.js.map +1 -0
  157. package/dist/logging/error-utils.d.ts +18 -0
  158. package/dist/logging/error-utils.d.ts.map +1 -0
  159. package/dist/logging/error-utils.js +37 -0
  160. package/dist/logging/error-utils.js.map +1 -0
  161. package/dist/logging/index.d.ts +11 -0
  162. package/dist/logging/index.d.ts.map +1 -0
  163. package/dist/logging/index.js +10 -0
  164. package/dist/logging/index.js.map +1 -0
  165. package/dist/logging/logger.d.ts +25 -0
  166. package/dist/logging/logger.d.ts.map +1 -0
  167. package/dist/logging/logger.js +39 -0
  168. package/dist/logging/logger.js.map +1 -0
  169. package/dist/notifications/constants.d.ts +16 -0
  170. package/dist/notifications/constants.d.ts.map +1 -0
  171. package/dist/notifications/constants.js +49 -0
  172. package/dist/notifications/constants.js.map +1 -0
  173. package/dist/notifications/index.d.ts +9 -0
  174. package/dist/notifications/index.d.ts.map +1 -0
  175. package/dist/notifications/index.js +8 -0
  176. package/dist/notifications/index.js.map +1 -0
  177. package/dist/notifications/types.d.ts +28 -0
  178. package/dist/notifications/types.d.ts.map +1 -0
  179. package/dist/notifications/types.js +7 -0
  180. package/dist/notifications/types.js.map +1 -0
  181. package/dist/notifications/utils.d.ts +20 -0
  182. package/dist/notifications/utils.d.ts.map +1 -0
  183. package/dist/notifications/utils.js +37 -0
  184. package/dist/notifications/utils.js.map +1 -0
  185. package/dist/plan/index.d.ts +12 -0
  186. package/dist/plan/index.d.ts.map +1 -0
  187. package/dist/plan/index.js +15 -0
  188. package/dist/plan/index.js.map +1 -0
  189. package/dist/plan/plan-parser.d.ts +33 -0
  190. package/dist/plan/plan-parser.d.ts.map +1 -0
  191. package/dist/plan/plan-parser.js +189 -0
  192. package/dist/plan/plan-parser.js.map +1 -0
  193. package/dist/plan/progress-computer.d.ts +34 -0
  194. package/dist/plan/progress-computer.d.ts.map +1 -0
  195. package/dist/plan/progress-computer.js +211 -0
  196. package/dist/plan/progress-computer.js.map +1 -0
  197. package/dist/plan/progress-matcher.d.ts +34 -0
  198. package/dist/plan/progress-matcher.d.ts.map +1 -0
  199. package/dist/plan/progress-matcher.js +297 -0
  200. package/dist/plan/progress-matcher.js.map +1 -0
  201. package/dist/plan/task-extractor.d.ts +30 -0
  202. package/dist/plan/task-extractor.d.ts.map +1 -0
  203. package/dist/plan/task-extractor.js +435 -0
  204. package/dist/plan/task-extractor.js.map +1 -0
  205. package/dist/plan/types.d.ts +131 -0
  206. package/dist/plan/types.d.ts.map +1 -0
  207. package/dist/plan/types.js +8 -0
  208. package/dist/plan/types.js.map +1 -0
  209. package/dist/project/aggregator.d.ts +43 -0
  210. package/dist/project/aggregator.d.ts.map +1 -0
  211. package/dist/project/aggregator.js +218 -0
  212. package/dist/project/aggregator.js.map +1 -0
  213. package/dist/project/index.d.ts +9 -0
  214. package/dist/project/index.d.ts.map +1 -0
  215. package/dist/project/index.js +9 -0
  216. package/dist/project/index.js.map +1 -0
  217. package/dist/project/types.d.ts +65 -0
  218. package/dist/project/types.d.ts.map +1 -0
  219. package/dist/project/types.js +27 -0
  220. package/dist/project/types.js.map +1 -0
  221. package/dist/session/detector.d.ts +113 -0
  222. package/dist/session/detector.d.ts.map +1 -0
  223. package/dist/session/detector.js +333 -0
  224. package/dist/session/detector.js.map +1 -0
  225. package/dist/session/filters.d.ts +32 -0
  226. package/dist/session/filters.d.ts.map +1 -0
  227. package/dist/session/filters.js +100 -0
  228. package/dist/session/filters.js.map +1 -0
  229. package/dist/session/format-title.d.ts +16 -0
  230. package/dist/session/format-title.d.ts.map +1 -0
  231. package/dist/session/format-title.js +54 -0
  232. package/dist/session/format-title.js.map +1 -0
  233. package/dist/session/index.d.ts +16 -0
  234. package/dist/session/index.d.ts.map +1 -0
  235. package/dist/session/index.js +10 -0
  236. package/dist/session/index.js.map +1 -0
  237. package/dist/session/parser.d.ts +264 -0
  238. package/dist/session/parser.d.ts.map +1 -0
  239. package/dist/session/parser.js +588 -0
  240. package/dist/session/parser.js.map +1 -0
  241. package/dist/session/token-estimator.d.ts +32 -0
  242. package/dist/session/token-estimator.d.ts.map +1 -0
  243. package/dist/session/token-estimator.js +139 -0
  244. package/dist/session/token-estimator.js.map +1 -0
  245. package/dist/session/transformer.d.ts +126 -0
  246. package/dist/session/transformer.d.ts.map +1 -0
  247. package/dist/session/transformer.js +158 -0
  248. package/dist/session/transformer.js.map +1 -0
  249. package/dist/setup/hooks-config.d.ts +35 -0
  250. package/dist/setup/hooks-config.d.ts.map +1 -0
  251. package/dist/setup/hooks-config.js +107 -0
  252. package/dist/setup/hooks-config.js.map +1 -0
  253. package/dist/setup/hooks-symlink.d.ts +17 -0
  254. package/dist/setup/hooks-symlink.d.ts.map +1 -0
  255. package/dist/setup/hooks-symlink.js +89 -0
  256. package/dist/setup/hooks-symlink.js.map +1 -0
  257. package/dist/setup/index.d.ts +13 -0
  258. package/dist/setup/index.d.ts.map +1 -0
  259. package/dist/setup/index.js +12 -0
  260. package/dist/setup/index.js.map +1 -0
  261. package/dist/setup/prerequisites.d.ts +11 -0
  262. package/dist/setup/prerequisites.d.ts.map +1 -0
  263. package/dist/setup/prerequisites.js +72 -0
  264. package/dist/setup/prerequisites.js.map +1 -0
  265. package/dist/setup/settings-merge.d.ts +33 -0
  266. package/dist/setup/settings-merge.d.ts.map +1 -0
  267. package/dist/setup/settings-merge.js +131 -0
  268. package/dist/setup/settings-merge.js.map +1 -0
  269. package/dist/setup/skills-install.d.ts +17 -0
  270. package/dist/setup/skills-install.d.ts.map +1 -0
  271. package/dist/setup/skills-install.js +60 -0
  272. package/dist/setup/skills-install.js.map +1 -0
  273. package/dist/setup/types.d.ts +39 -0
  274. package/dist/setup/types.d.ts.map +1 -0
  275. package/dist/setup/types.js +7 -0
  276. package/dist/setup/types.js.map +1 -0
  277. package/dist/setup/verification.d.ts +9 -0
  278. package/dist/setup/verification.d.ts.map +1 -0
  279. package/dist/setup/verification.js +91 -0
  280. package/dist/setup/verification.js.map +1 -0
  281. package/dist/shortcuts/index.d.ts +8 -0
  282. package/dist/shortcuts/index.d.ts.map +1 -0
  283. package/dist/shortcuts/index.js +6 -0
  284. package/dist/shortcuts/index.js.map +1 -0
  285. package/dist/shortcuts/key-utils.d.ts +54 -0
  286. package/dist/shortcuts/key-utils.d.ts.map +1 -0
  287. package/dist/shortcuts/key-utils.js +129 -0
  288. package/dist/shortcuts/key-utils.js.map +1 -0
  289. package/dist/shortcuts/shortcut-registry.d.ts +37 -0
  290. package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
  291. package/dist/shortcuts/shortcut-registry.js +322 -0
  292. package/dist/shortcuts/shortcut-registry.js.map +1 -0
  293. package/dist/sources/config.d.ts +91 -0
  294. package/dist/sources/config.d.ts.map +1 -0
  295. package/dist/sources/config.js +229 -0
  296. package/dist/sources/config.js.map +1 -0
  297. package/dist/sources/googledocs.d.ts +43 -0
  298. package/dist/sources/googledocs.d.ts.map +1 -0
  299. package/dist/sources/googledocs.js +298 -0
  300. package/dist/sources/googledocs.js.map +1 -0
  301. package/dist/sources/index.d.ts +14 -0
  302. package/dist/sources/index.d.ts.map +1 -0
  303. package/dist/sources/index.js +19 -0
  304. package/dist/sources/index.js.map +1 -0
  305. package/dist/sources/notion.d.ts +35 -0
  306. package/dist/sources/notion.d.ts.map +1 -0
  307. package/dist/sources/notion.js +352 -0
  308. package/dist/sources/notion.js.map +1 -0
  309. package/dist/sources/obsidian.d.ts +38 -0
  310. package/dist/sources/obsidian.d.ts.map +1 -0
  311. package/dist/sources/obsidian.js +228 -0
  312. package/dist/sources/obsidian.js.map +1 -0
  313. package/dist/sources/types.d.ts +133 -0
  314. package/dist/sources/types.d.ts.map +1 -0
  315. package/dist/sources/types.js +19 -0
  316. package/dist/sources/types.js.map +1 -0
  317. package/dist/storage/index.d.ts +6 -0
  318. package/dist/storage/index.d.ts.map +1 -0
  319. package/dist/storage/index.js +5 -0
  320. package/dist/storage/index.js.map +1 -0
  321. package/dist/storage/writer.d.ts +86 -0
  322. package/dist/storage/writer.d.ts.map +1 -0
  323. package/dist/storage/writer.js +137 -0
  324. package/dist/storage/writer.js.map +1 -0
  325. package/dist/types.d.ts +203 -0
  326. package/dist/types.d.ts.map +1 -0
  327. package/dist/types.js +8 -0
  328. package/dist/types.js.map +1 -0
  329. package/dist/utils/claude-token.d.ts +49 -0
  330. package/dist/utils/claude-token.d.ts.map +1 -0
  331. package/dist/utils/claude-token.js +169 -0
  332. package/dist/utils/claude-token.js.map +1 -0
  333. package/dist/utils/index.d.ts +7 -0
  334. package/dist/utils/index.d.ts.map +1 -0
  335. package/dist/utils/index.js +13 -0
  336. package/dist/utils/index.js.map +1 -0
  337. package/dist/utils/settings.d.ts +100 -0
  338. package/dist/utils/settings.d.ts.map +1 -0
  339. package/dist/utils/settings.js +206 -0
  340. package/dist/utils/settings.js.map +1 -0
  341. 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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"}