ai-prompt-guide-mcp 1.0.0

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 (887) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +271 -0
  3. package/dist/__tests__/config-loading.test.d.ts +5 -0
  4. package/dist/__tests__/config-loading.test.d.ts.map +1 -0
  5. package/dist/__tests__/config-loading.test.js +127 -0
  6. package/dist/__tests__/config-loading.test.js.map +1 -0
  7. package/dist/__tests__/config-logging.test.d.ts +5 -0
  8. package/dist/__tests__/config-logging.test.d.ts.map +1 -0
  9. package/dist/__tests__/config-logging.test.js +146 -0
  10. package/dist/__tests__/config-logging.test.js.map +1 -0
  11. package/dist/__tests__/config-path-resolution.test.d.ts +5 -0
  12. package/dist/__tests__/config-path-resolution.test.d.ts.map +1 -0
  13. package/dist/__tests__/config-path-resolution.test.js +88 -0
  14. package/dist/__tests__/config-path-resolution.test.js.map +1 -0
  15. package/dist/__tests__/config-path-validation.test.d.ts +6 -0
  16. package/dist/__tests__/config-path-validation.test.d.ts.map +1 -0
  17. package/dist/__tests__/config-path-validation.test.js +203 -0
  18. package/dist/__tests__/config-path-validation.test.js.map +1 -0
  19. package/dist/__tests__/config-precedence.test.d.ts +5 -0
  20. package/dist/__tests__/config-precedence.test.d.ts.map +1 -0
  21. package/dist/__tests__/config-precedence.test.js +200 -0
  22. package/dist/__tests__/config-precedence.test.js.map +1 -0
  23. package/dist/__tests__/config-types.test.d.ts +5 -0
  24. package/dist/__tests__/config-types.test.d.ts.map +1 -0
  25. package/dist/__tests__/config-types.test.js +189 -0
  26. package/dist/__tests__/config-types.test.js.map +1 -0
  27. package/dist/__tests__/config.test.d.ts +5 -0
  28. package/dist/__tests__/config.test.d.ts.map +1 -0
  29. package/dist/__tests__/config.test.js +229 -0
  30. package/dist/__tests__/config.test.js.map +1 -0
  31. package/dist/config.d.ts +87 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +498 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/constants/defaults.d.ts +78 -0
  36. package/dist/constants/defaults.d.ts.map +1 -0
  37. package/dist/constants/defaults.js +78 -0
  38. package/dist/constants/defaults.js.map +1 -0
  39. package/dist/document-cache.d.ts +485 -0
  40. package/dist/document-cache.d.ts.map +1 -0
  41. package/dist/document-cache.hierarchical.test.d.ts +2 -0
  42. package/dist/document-cache.hierarchical.test.d.ts.map +1 -0
  43. package/dist/document-cache.hierarchical.test.js +243 -0
  44. package/dist/document-cache.hierarchical.test.js.map +1 -0
  45. package/dist/document-cache.js +965 -0
  46. package/dist/document-cache.js.map +1 -0
  47. package/dist/document-cache.test.d.ts +8 -0
  48. package/dist/document-cache.test.d.ts.map +1 -0
  49. package/dist/document-cache.test.js +624 -0
  50. package/dist/document-cache.test.js.map +1 -0
  51. package/dist/document-manager.d.ts +252 -0
  52. package/dist/document-manager.d.ts.map +1 -0
  53. package/dist/document-manager.js +760 -0
  54. package/dist/document-manager.js.map +1 -0
  55. package/dist/document-manager.race-condition.test.d.ts +8 -0
  56. package/dist/document-manager.race-condition.test.d.ts.map +1 -0
  57. package/dist/document-manager.race-condition.test.js +139 -0
  58. package/dist/document-manager.race-condition.test.js.map +1 -0
  59. package/dist/fingerprint-index.d.ts +177 -0
  60. package/dist/fingerprint-index.d.ts.map +1 -0
  61. package/dist/fingerprint-index.js +374 -0
  62. package/dist/fingerprint-index.js.map +1 -0
  63. package/dist/fingerprint-index.test.d.ts +15 -0
  64. package/dist/fingerprint-index.test.d.ts.map +1 -0
  65. package/dist/fingerprint-index.test.js +482 -0
  66. package/dist/fingerprint-index.test.js.map +1 -0
  67. package/dist/fsio.d.ts +76 -0
  68. package/dist/fsio.d.ts.map +1 -0
  69. package/dist/fsio.js +506 -0
  70. package/dist/fsio.js.map +1 -0
  71. package/dist/index.d.ts +6 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +20 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/markdown-tools.test.d.ts +5 -0
  76. package/dist/markdown-tools.test.d.ts.map +1 -0
  77. package/dist/markdown-tools.test.js +200 -0
  78. package/dist/markdown-tools.test.js.map +1 -0
  79. package/dist/parse.d.ts +19 -0
  80. package/dist/parse.d.ts.map +1 -0
  81. package/dist/parse.js +144 -0
  82. package/dist/parse.js.map +1 -0
  83. package/dist/prompts/__tests__/prompt-loader.test.d.ts +5 -0
  84. package/dist/prompts/__tests__/prompt-loader.test.d.ts.map +1 -0
  85. package/dist/prompts/__tests__/prompt-loader.test.js +300 -0
  86. package/dist/prompts/__tests__/prompt-loader.test.js.map +1 -0
  87. package/dist/prompts/prompt-loader.d.ts +58 -0
  88. package/dist/prompts/prompt-loader.d.ts.map +1 -0
  89. package/dist/prompts/prompt-loader.js +215 -0
  90. package/dist/prompts/prompt-loader.js.map +1 -0
  91. package/dist/prompts/prompt-validator.d.ts +30 -0
  92. package/dist/prompts/prompt-validator.d.ts.map +1 -0
  93. package/dist/prompts/prompt-validator.js +65 -0
  94. package/dist/prompts/prompt-validator.js.map +1 -0
  95. package/dist/prompts/types.d.ts +46 -0
  96. package/dist/prompts/types.d.ts.map +1 -0
  97. package/dist/prompts/types.js +14 -0
  98. package/dist/prompts/types.js.map +1 -0
  99. package/dist/prompts/workflow-prompts.d.ts +42 -0
  100. package/dist/prompts/workflow-prompts.d.ts.map +1 -0
  101. package/dist/prompts/workflow-prompts.js +61 -0
  102. package/dist/prompts/workflow-prompts.js.map +1 -0
  103. package/dist/sections.d.ts +67 -0
  104. package/dist/sections.d.ts.map +1 -0
  105. package/dist/sections.hierarchical.test.d.ts +8 -0
  106. package/dist/sections.hierarchical.test.d.ts.map +1 -0
  107. package/dist/sections.hierarchical.test.js +397 -0
  108. package/dist/sections.hierarchical.test.js.map +1 -0
  109. package/dist/sections.js +1229 -0
  110. package/dist/sections.js.map +1 -0
  111. package/dist/server/default-dependencies.d.ts +134 -0
  112. package/dist/server/default-dependencies.d.ts.map +1 -0
  113. package/dist/server/default-dependencies.js +176 -0
  114. package/dist/server/default-dependencies.js.map +1 -0
  115. package/dist/server/dependencies.d.ts +161 -0
  116. package/dist/server/dependencies.d.ts.map +1 -0
  117. package/dist/server/dependencies.js +50 -0
  118. package/dist/server/dependencies.js.map +1 -0
  119. package/dist/server/index.d.ts +10 -0
  120. package/dist/server/index.d.ts.map +1 -0
  121. package/dist/server/index.js +9 -0
  122. package/dist/server/index.js.map +1 -0
  123. package/dist/server/middleware/error-handling.d.ts +52 -0
  124. package/dist/server/middleware/error-handling.d.ts.map +1 -0
  125. package/dist/server/middleware/error-handling.js +76 -0
  126. package/dist/server/middleware/error-handling.js.map +1 -0
  127. package/dist/server/middleware/index.d.ts +7 -0
  128. package/dist/server/middleware/index.d.ts.map +1 -0
  129. package/dist/server/middleware/index.js +7 -0
  130. package/dist/server/middleware/index.js.map +1 -0
  131. package/dist/server/middleware/logging.d.ts +29 -0
  132. package/dist/server/middleware/logging.d.ts.map +1 -0
  133. package/dist/server/middleware/logging.js +49 -0
  134. package/dist/server/middleware/logging.js.map +1 -0
  135. package/dist/server/middleware/session-management.d.ts +38 -0
  136. package/dist/server/middleware/session-management.d.ts.map +1 -0
  137. package/dist/server/middleware/session-management.js +66 -0
  138. package/dist/server/middleware/session-management.js.map +1 -0
  139. package/dist/server/request-handlers/index.d.ts +5 -0
  140. package/dist/server/request-handlers/index.d.ts.map +1 -0
  141. package/dist/server/request-handlers/index.js +5 -0
  142. package/dist/server/request-handlers/index.js.map +1 -0
  143. package/dist/server/request-handlers/prompt-handlers.d.ts +13 -0
  144. package/dist/server/request-handlers/prompt-handlers.d.ts.map +1 -0
  145. package/dist/server/request-handlers/prompt-handlers.js +80 -0
  146. package/dist/server/request-handlers/prompt-handlers.js.map +1 -0
  147. package/dist/server/request-handlers/tool-handlers.d.ts +11 -0
  148. package/dist/server/request-handlers/tool-handlers.d.ts.map +1 -0
  149. package/dist/server/request-handlers/tool-handlers.js +85 -0
  150. package/dist/server/request-handlers/tool-handlers.js.map +1 -0
  151. package/dist/server/server-factory.d.ts +68 -0
  152. package/dist/server/server-factory.d.ts.map +1 -0
  153. package/dist/server/server-factory.js +135 -0
  154. package/dist/server/server-factory.js.map +1 -0
  155. package/dist/server/transport/stdio-transport.d.ts +9 -0
  156. package/dist/server/transport/stdio-transport.d.ts.map +1 -0
  157. package/dist/server/transport/stdio-transport.js +11 -0
  158. package/dist/server/transport/stdio-transport.js.map +1 -0
  159. package/dist/session/index.d.ts +5 -0
  160. package/dist/session/index.d.ts.map +1 -0
  161. package/dist/session/index.js +7 -0
  162. package/dist/session/index.js.map +1 -0
  163. package/dist/session/session-store.d.ts +74 -0
  164. package/dist/session/session-store.d.ts.map +1 -0
  165. package/dist/session/session-store.js +150 -0
  166. package/dist/session/session-store.js.map +1 -0
  167. package/dist/session/types.d.ts +96 -0
  168. package/dist/session/types.d.ts.map +1 -0
  169. package/dist/session/types.js +9 -0
  170. package/dist/session/types.js.map +1 -0
  171. package/dist/shared/__tests__/addressing-system.batch-cache.test.d.ts +12 -0
  172. package/dist/shared/__tests__/addressing-system.batch-cache.test.d.ts.map +1 -0
  173. package/dist/shared/__tests__/addressing-system.batch-cache.test.js +306 -0
  174. package/dist/shared/__tests__/addressing-system.batch-cache.test.js.map +1 -0
  175. package/dist/shared/__tests__/addressing-system.hierarchical.test.d.ts +6 -0
  176. package/dist/shared/__tests__/addressing-system.hierarchical.test.d.ts.map +1 -0
  177. package/dist/shared/__tests__/addressing-system.hierarchical.test.js +205 -0
  178. package/dist/shared/__tests__/addressing-system.hierarchical.test.js.map +1 -0
  179. package/dist/shared/__tests__/addressing-system.lru.test.d.ts +6 -0
  180. package/dist/shared/__tests__/addressing-system.lru.test.d.ts.map +1 -0
  181. package/dist/shared/__tests__/addressing-system.lru.test.js +159 -0
  182. package/dist/shared/__tests__/addressing-system.lru.test.js.map +1 -0
  183. package/dist/shared/__tests__/addressing-system.relative-paths.test.d.ts +14 -0
  184. package/dist/shared/__tests__/addressing-system.relative-paths.test.d.ts.map +1 -0
  185. package/dist/shared/__tests__/addressing-system.relative-paths.test.js +249 -0
  186. package/dist/shared/__tests__/addressing-system.relative-paths.test.js.map +1 -0
  187. package/dist/shared/__tests__/document-analysis-enhanced.test.d.ts +9 -0
  188. package/dist/shared/__tests__/document-analysis-enhanced.test.d.ts.map +1 -0
  189. package/dist/shared/__tests__/document-analysis-enhanced.test.js +419 -0
  190. package/dist/shared/__tests__/document-analysis-enhanced.test.js.map +1 -0
  191. package/dist/shared/__tests__/document-analysis.test.d.ts +8 -0
  192. package/dist/shared/__tests__/document-analysis.test.d.ts.map +1 -0
  193. package/dist/shared/__tests__/document-analysis.test.js +904 -0
  194. package/dist/shared/__tests__/document-analysis.test.js.map +1 -0
  195. package/dist/shared/__tests__/keyword-utils-integration.test.d.ts +9 -0
  196. package/dist/shared/__tests__/keyword-utils-integration.test.d.ts.map +1 -0
  197. package/dist/shared/__tests__/keyword-utils-integration.test.js +317 -0
  198. package/dist/shared/__tests__/keyword-utils-integration.test.js.map +1 -0
  199. package/dist/shared/__tests__/link-utils.test.d.ts +5 -0
  200. package/dist/shared/__tests__/link-utils.test.d.ts.map +1 -0
  201. package/dist/shared/__tests__/link-utils.test.js +560 -0
  202. package/dist/shared/__tests__/link-utils.test.js.map +1 -0
  203. package/dist/shared/__tests__/link-validation.test.d.ts +5 -0
  204. package/dist/shared/__tests__/link-validation.test.d.ts.map +1 -0
  205. package/dist/shared/__tests__/link-validation.test.js +473 -0
  206. package/dist/shared/__tests__/link-validation.test.js.map +1 -0
  207. package/dist/shared/__tests__/reference-extractor.test.d.ts +8 -0
  208. package/dist/shared/__tests__/reference-extractor.test.d.ts.map +1 -0
  209. package/dist/shared/__tests__/reference-extractor.test.js +260 -0
  210. package/dist/shared/__tests__/reference-extractor.test.js.map +1 -0
  211. package/dist/shared/__tests__/reference-loader.test.d.ts +8 -0
  212. package/dist/shared/__tests__/reference-loader.test.d.ts.map +1 -0
  213. package/dist/shared/__tests__/reference-loader.test.js +622 -0
  214. package/dist/shared/__tests__/reference-loader.test.js.map +1 -0
  215. package/dist/shared/__tests__/section-operations.append.test.d.ts +8 -0
  216. package/dist/shared/__tests__/section-operations.append.test.d.ts.map +1 -0
  217. package/dist/shared/__tests__/section-operations.append.test.js +150 -0
  218. package/dist/shared/__tests__/section-operations.append.test.js.map +1 -0
  219. package/dist/shared/__tests__/section-operations.test.d.ts +7 -0
  220. package/dist/shared/__tests__/section-operations.test.d.ts.map +1 -0
  221. package/dist/shared/__tests__/section-operations.test.js +118 -0
  222. package/dist/shared/__tests__/section-operations.test.js.map +1 -0
  223. package/dist/shared/__tests__/slug-utils.test.d.ts +5 -0
  224. package/dist/shared/__tests__/slug-utils.test.d.ts.map +1 -0
  225. package/dist/shared/__tests__/slug-utils.test.js +542 -0
  226. package/dist/shared/__tests__/slug-utils.test.js.map +1 -0
  227. package/dist/shared/__tests__/task-operations.test.d.ts +9 -0
  228. package/dist/shared/__tests__/task-operations.test.d.ts.map +1 -0
  229. package/dist/shared/__tests__/task-operations.test.js +257 -0
  230. package/dist/shared/__tests__/task-operations.test.js.map +1 -0
  231. package/dist/shared/__tests__/task-validation.test.d.ts +6 -0
  232. package/dist/shared/__tests__/task-validation.test.d.ts.map +1 -0
  233. package/dist/shared/__tests__/task-validation.test.js +129 -0
  234. package/dist/shared/__tests__/task-validation.test.js.map +1 -0
  235. package/dist/shared/__tests__/task-view-utilities.test.d.ts +5 -0
  236. package/dist/shared/__tests__/task-view-utilities.test.d.ts.map +1 -0
  237. package/dist/shared/__tests__/task-view-utilities.test.js +312 -0
  238. package/dist/shared/__tests__/task-view-utilities.test.js.map +1 -0
  239. package/dist/shared/__tests__/tool-integration.array-validation.test.d.ts +7 -0
  240. package/dist/shared/__tests__/tool-integration.array-validation.test.d.ts.map +1 -0
  241. package/dist/shared/__tests__/tool-integration.array-validation.test.js +169 -0
  242. package/dist/shared/__tests__/tool-integration.array-validation.test.js.map +1 -0
  243. package/dist/shared/__tests__/tool-integration.hierarchical.test.d.ts +7 -0
  244. package/dist/shared/__tests__/tool-integration.hierarchical.test.d.ts.map +1 -0
  245. package/dist/shared/__tests__/tool-integration.hierarchical.test.js +204 -0
  246. package/dist/shared/__tests__/tool-integration.hierarchical.test.js.map +1 -0
  247. package/dist/shared/__tests__/workflow-prompt-utilities.test.d.ts +8 -0
  248. package/dist/shared/__tests__/workflow-prompt-utilities.test.d.ts.map +1 -0
  249. package/dist/shared/__tests__/workflow-prompt-utilities.test.js +722 -0
  250. package/dist/shared/__tests__/workflow-prompt-utilities.test.js.map +1 -0
  251. package/dist/shared/addressing-system.d.ts +799 -0
  252. package/dist/shared/addressing-system.d.ts.map +1 -0
  253. package/dist/shared/addressing-system.js +1074 -0
  254. package/dist/shared/addressing-system.js.map +1 -0
  255. package/dist/shared/document-analysis/__tests__/keyword-utils.test.d.ts +8 -0
  256. package/dist/shared/document-analysis/__tests__/keyword-utils.test.d.ts.map +1 -0
  257. package/dist/shared/document-analysis/__tests__/keyword-utils.test.js +601 -0
  258. package/dist/shared/document-analysis/__tests__/keyword-utils.test.js.map +1 -0
  259. package/dist/shared/document-analysis/index.d.ts +67 -0
  260. package/dist/shared/document-analysis/index.d.ts.map +1 -0
  261. package/dist/shared/document-analysis/index.js +166 -0
  262. package/dist/shared/document-analysis/index.js.map +1 -0
  263. package/dist/shared/document-analysis/keyword-utils.d.ts +405 -0
  264. package/dist/shared/document-analysis/keyword-utils.d.ts.map +1 -0
  265. package/dist/shared/document-analysis/keyword-utils.js +1147 -0
  266. package/dist/shared/document-analysis/keyword-utils.js.map +1 -0
  267. package/dist/shared/document-analysis/reference-validation.d.ts +27 -0
  268. package/dist/shared/document-analysis/reference-validation.d.ts.map +1 -0
  269. package/dist/shared/document-analysis/reference-validation.js +173 -0
  270. package/dist/shared/document-analysis/reference-validation.js.map +1 -0
  271. package/dist/shared/document-analysis/related-docs.d.ts +27 -0
  272. package/dist/shared/document-analysis/related-docs.d.ts.map +1 -0
  273. package/dist/shared/document-analysis/related-docs.js +459 -0
  274. package/dist/shared/document-analysis/related-docs.js.map +1 -0
  275. package/dist/shared/document-analysis/types.d.ts +89 -0
  276. package/dist/shared/document-analysis/types.d.ts.map +1 -0
  277. package/dist/shared/document-analysis/types.js +41 -0
  278. package/dist/shared/document-analysis/types.js.map +1 -0
  279. package/dist/shared/document-analysis.d.ts +15 -0
  280. package/dist/shared/document-analysis.d.ts.map +1 -0
  281. package/dist/shared/document-analysis.js +16 -0
  282. package/dist/shared/document-analysis.js.map +1 -0
  283. package/dist/shared/document-manager-factory.d.ts +32 -0
  284. package/dist/shared/document-manager-factory.d.ts.map +1 -0
  285. package/dist/shared/document-manager-factory.js +75 -0
  286. package/dist/shared/document-manager-factory.js.map +1 -0
  287. package/dist/shared/index.d.ts +5 -0
  288. package/dist/shared/index.d.ts.map +1 -0
  289. package/dist/shared/index.js +7 -0
  290. package/dist/shared/index.js.map +1 -0
  291. package/dist/shared/link-analysis.d.ts +84 -0
  292. package/dist/shared/link-analysis.d.ts.map +1 -0
  293. package/dist/shared/link-analysis.js +213 -0
  294. package/dist/shared/link-analysis.js.map +1 -0
  295. package/dist/shared/link-context.d.ts +23 -0
  296. package/dist/shared/link-context.d.ts.map +1 -0
  297. package/dist/shared/link-context.js +172 -0
  298. package/dist/shared/link-context.js.map +1 -0
  299. package/dist/shared/link-utils.d.ts +33 -0
  300. package/dist/shared/link-utils.d.ts.map +1 -0
  301. package/dist/shared/link-utils.js +301 -0
  302. package/dist/shared/link-utils.js.map +1 -0
  303. package/dist/shared/link-validation.d.ts +79 -0
  304. package/dist/shared/link-validation.d.ts.map +1 -0
  305. package/dist/shared/link-validation.js +340 -0
  306. package/dist/shared/link-validation.js.map +1 -0
  307. package/dist/shared/namespace-analysis.d.ts +10 -0
  308. package/dist/shared/namespace-analysis.d.ts.map +1 -0
  309. package/dist/shared/namespace-analysis.js +100 -0
  310. package/dist/shared/namespace-analysis.js.map +1 -0
  311. package/dist/shared/namespace-constants.d.ts +69 -0
  312. package/dist/shared/namespace-constants.d.ts.map +1 -0
  313. package/dist/shared/namespace-constants.js +97 -0
  314. package/dist/shared/namespace-constants.js.map +1 -0
  315. package/dist/shared/path-utilities.d.ts +13 -0
  316. package/dist/shared/path-utilities.d.ts.map +1 -0
  317. package/dist/shared/path-utilities.js +39 -0
  318. package/dist/shared/path-utilities.js.map +1 -0
  319. package/dist/shared/reference-extractor.d.ts +121 -0
  320. package/dist/shared/reference-extractor.d.ts.map +1 -0
  321. package/dist/shared/reference-extractor.js +195 -0
  322. package/dist/shared/reference-extractor.js.map +1 -0
  323. package/dist/shared/reference-loader.d.ts +163 -0
  324. package/dist/shared/reference-loader.d.ts.map +1 -0
  325. package/dist/shared/reference-loader.js +265 -0
  326. package/dist/shared/reference-loader.js.map +1 -0
  327. package/dist/shared/section-operations.d.ts +14 -0
  328. package/dist/shared/section-operations.d.ts.map +1 -0
  329. package/dist/shared/section-operations.js +115 -0
  330. package/dist/shared/section-operations.js.map +1 -0
  331. package/dist/shared/slug-utils.d.ts +109 -0
  332. package/dist/shared/slug-utils.d.ts.map +1 -0
  333. package/dist/shared/slug-utils.js +302 -0
  334. package/dist/shared/slug-utils.js.map +1 -0
  335. package/dist/shared/task-operations.d.ts +152 -0
  336. package/dist/shared/task-operations.d.ts.map +1 -0
  337. package/dist/shared/task-operations.js +416 -0
  338. package/dist/shared/task-operations.js.map +1 -0
  339. package/dist/shared/task-utilities.d.ts +63 -0
  340. package/dist/shared/task-utilities.d.ts.map +1 -0
  341. package/dist/shared/task-utilities.js +86 -0
  342. package/dist/shared/task-utilities.js.map +1 -0
  343. package/dist/shared/task-validation.d.ts +50 -0
  344. package/dist/shared/task-validation.d.ts.map +1 -0
  345. package/dist/shared/task-validation.js +97 -0
  346. package/dist/shared/task-validation.js.map +1 -0
  347. package/dist/shared/task-view-utilities.d.ts +109 -0
  348. package/dist/shared/task-view-utilities.d.ts.map +1 -0
  349. package/dist/shared/task-view-utilities.js +255 -0
  350. package/dist/shared/task-view-utilities.js.map +1 -0
  351. package/dist/shared/utilities.d.ts +14 -0
  352. package/dist/shared/utilities.d.ts.map +1 -0
  353. package/dist/shared/utilities.js +23 -0
  354. package/dist/shared/utilities.js.map +1 -0
  355. package/dist/shared/utilities.test.d.ts +5 -0
  356. package/dist/shared/utilities.test.d.ts.map +1 -0
  357. package/dist/shared/utilities.test.js +422 -0
  358. package/dist/shared/utilities.test.js.map +1 -0
  359. package/dist/shared/validation-utils.d.ts +57 -0
  360. package/dist/shared/validation-utils.d.ts.map +1 -0
  361. package/dist/shared/validation-utils.js +63 -0
  362. package/dist/shared/validation-utils.js.map +1 -0
  363. package/dist/shared/workflow-prompt-utilities.d.ts +64 -0
  364. package/dist/shared/workflow-prompt-utilities.d.ts.map +1 -0
  365. package/dist/shared/workflow-prompt-utilities.js +163 -0
  366. package/dist/shared/workflow-prompt-utilities.js.map +1 -0
  367. package/dist/slug.d.ts +9 -0
  368. package/dist/slug.d.ts.map +1 -0
  369. package/dist/slug.js +40 -0
  370. package/dist/slug.js.map +1 -0
  371. package/dist/template-loader.d.ts +6 -0
  372. package/dist/template-loader.d.ts.map +1 -0
  373. package/dist/template-loader.js +8 -0
  374. package/dist/template-loader.js.map +1 -0
  375. package/dist/tools/__tests__/create-document-self-reference.test.d.ts +2 -0
  376. package/dist/tools/__tests__/create-document-self-reference.test.d.ts.map +1 -0
  377. package/dist/tools/__tests__/create-document-self-reference.test.js +124 -0
  378. package/dist/tools/__tests__/create-document-self-reference.test.js.map +1 -0
  379. package/dist/tools/__tests__/create-document-workflow-regression.test.d.ts +16 -0
  380. package/dist/tools/__tests__/create-document-workflow-regression.test.d.ts.map +1 -0
  381. package/dist/tools/__tests__/create-document-workflow-regression.test.js +655 -0
  382. package/dist/tools/__tests__/create-document-workflow-regression.test.js.map +1 -0
  383. package/dist/tools/__tests__/create-document.test.d.ts +2 -0
  384. package/dist/tools/__tests__/create-document.test.d.ts.map +1 -0
  385. package/dist/tools/__tests__/create-document.test.js +255 -0
  386. package/dist/tools/__tests__/create-document.test.js.map +1 -0
  387. package/dist/tools/__tests__/delete-document.test.d.ts +7 -0
  388. package/dist/tools/__tests__/delete-document.test.d.ts.map +1 -0
  389. package/dist/tools/__tests__/delete-document.test.js +311 -0
  390. package/dist/tools/__tests__/delete-document.test.js.map +1 -0
  391. package/dist/tools/__tests__/edit-document.test.d.ts +2 -0
  392. package/dist/tools/__tests__/edit-document.test.d.ts.map +1 -0
  393. package/dist/tools/__tests__/edit-document.test.js +644 -0
  394. package/dist/tools/__tests__/edit-document.test.js.map +1 -0
  395. package/dist/tools/__tests__/error-scenarios.test.d.ts +5 -0
  396. package/dist/tools/__tests__/error-scenarios.test.d.ts.map +1 -0
  397. package/dist/tools/__tests__/error-scenarios.test.js +105 -0
  398. package/dist/tools/__tests__/error-scenarios.test.js.map +1 -0
  399. package/dist/tools/__tests__/mocks/document-manager.mock.d.ts +99 -0
  400. package/dist/tools/__tests__/mocks/document-manager.mock.d.ts.map +1 -0
  401. package/dist/tools/__tests__/mocks/document-manager.mock.js +457 -0
  402. package/dist/tools/__tests__/mocks/document-manager.mock.js.map +1 -0
  403. package/dist/tools/__tests__/mocks/filesystem.mock.d.ts +103 -0
  404. package/dist/tools/__tests__/mocks/filesystem.mock.d.ts.map +1 -0
  405. package/dist/tools/__tests__/mocks/filesystem.mock.js +247 -0
  406. package/dist/tools/__tests__/mocks/filesystem.mock.js.map +1 -0
  407. package/dist/tools/__tests__/move-document.test.d.ts +12 -0
  408. package/dist/tools/__tests__/move-document.test.d.ts.map +1 -0
  409. package/dist/tools/__tests__/move-document.test.js +214 -0
  410. package/dist/tools/__tests__/move-document.test.js.map +1 -0
  411. package/dist/tools/__tests__/move.test.d.ts +13 -0
  412. package/dist/tools/__tests__/move.test.d.ts.map +1 -0
  413. package/dist/tools/__tests__/move.test.js +939 -0
  414. package/dist/tools/__tests__/move.test.js.map +1 -0
  415. package/dist/tools/__tests__/section.integration.improved.test.d.ts +5 -0
  416. package/dist/tools/__tests__/section.integration.improved.test.d.ts.map +1 -0
  417. package/dist/tools/__tests__/section.integration.improved.test.js +199 -0
  418. package/dist/tools/__tests__/section.integration.improved.test.js.map +1 -0
  419. package/dist/tools/__tests__/section.integration.test.d.ts +5 -0
  420. package/dist/tools/__tests__/section.integration.test.d.ts.map +1 -0
  421. package/dist/tools/__tests__/section.integration.test.js +637 -0
  422. package/dist/tools/__tests__/section.integration.test.js.map +1 -0
  423. package/dist/tools/__tests__/setup/test-environment.d.ts +111 -0
  424. package/dist/tools/__tests__/setup/test-environment.d.ts.map +1 -0
  425. package/dist/tools/__tests__/setup/test-environment.js +322 -0
  426. package/dist/tools/__tests__/setup/test-environment.js.map +1 -0
  427. package/dist/tools/__tests__/suggestion-generator.test.d.ts +8 -0
  428. package/dist/tools/__tests__/suggestion-generator.test.d.ts.map +1 -0
  429. package/dist/tools/__tests__/suggestion-generator.test.js +508 -0
  430. package/dist/tools/__tests__/suggestion-generator.test.js.map +1 -0
  431. package/dist/tools/__tests__/task-consistency.test.d.ts +11 -0
  432. package/dist/tools/__tests__/task-consistency.test.d.ts.map +1 -0
  433. package/dist/tools/__tests__/task-consistency.test.js +93 -0
  434. package/dist/tools/__tests__/task-consistency.test.js.map +1 -0
  435. package/dist/tools/__tests__/task-status-parsing.test.d.ts +15 -0
  436. package/dist/tools/__tests__/task-status-parsing.test.d.ts.map +1 -0
  437. package/dist/tools/__tests__/task-status-parsing.test.js +126 -0
  438. package/dist/tools/__tests__/task-status-parsing.test.js.map +1 -0
  439. package/dist/tools/__tests__/view-section-boundary.test.d.ts +2 -0
  440. package/dist/tools/__tests__/view-section-boundary.test.d.ts.map +1 -0
  441. package/dist/tools/__tests__/view-section-boundary.test.js +132 -0
  442. package/dist/tools/__tests__/view-section-boundary.test.js.map +1 -0
  443. package/dist/tools/__tests__/write-operations-integration.test.d.ts +8 -0
  444. package/dist/tools/__tests__/write-operations-integration.test.d.ts.map +1 -0
  445. package/dist/tools/__tests__/write-operations-integration.test.js +136 -0
  446. package/dist/tools/__tests__/write-operations-integration.test.js.map +1 -0
  447. package/dist/tools/browse/content-analyzer.d.ts +27 -0
  448. package/dist/tools/browse/content-analyzer.d.ts.map +1 -0
  449. package/dist/tools/browse/content-analyzer.js +150 -0
  450. package/dist/tools/browse/content-analyzer.js.map +1 -0
  451. package/dist/tools/browse/dependency-analyzer.d.ts +63 -0
  452. package/dist/tools/browse/dependency-analyzer.d.ts.map +1 -0
  453. package/dist/tools/browse/dependency-analyzer.js +261 -0
  454. package/dist/tools/browse/dependency-analyzer.js.map +1 -0
  455. package/dist/tools/browse/folder-navigator.d.ts +35 -0
  456. package/dist/tools/browse/folder-navigator.d.ts.map +1 -0
  457. package/dist/tools/browse/folder-navigator.js +154 -0
  458. package/dist/tools/browse/folder-navigator.js.map +1 -0
  459. package/dist/tools/browse/index.d.ts +10 -0
  460. package/dist/tools/browse/index.d.ts.map +1 -0
  461. package/dist/tools/browse/index.js +14 -0
  462. package/dist/tools/browse/index.js.map +1 -0
  463. package/dist/tools/browse/relationship-classifier.d.ts +9 -0
  464. package/dist/tools/browse/relationship-classifier.d.ts.map +1 -0
  465. package/dist/tools/browse/relationship-classifier.js +38 -0
  466. package/dist/tools/browse/relationship-classifier.js.map +1 -0
  467. package/dist/tools/browse/search-engine.d.ts +69 -0
  468. package/dist/tools/browse/search-engine.d.ts.map +1 -0
  469. package/dist/tools/browse/search-engine.js +197 -0
  470. package/dist/tools/browse/search-engine.js.map +1 -0
  471. package/dist/tools/create/__tests__/file-creator.test.d.ts +6 -0
  472. package/dist/tools/create/__tests__/file-creator.test.d.ts.map +1 -0
  473. package/dist/tools/create/__tests__/file-creator.test.js +138 -0
  474. package/dist/tools/create/__tests__/file-creator.test.js.map +1 -0
  475. package/dist/tools/create/__tests__/template-processor.test.d.ts +6 -0
  476. package/dist/tools/create/__tests__/template-processor.test.d.ts.map +1 -0
  477. package/dist/tools/create/__tests__/template-processor.test.js +130 -0
  478. package/dist/tools/create/__tests__/template-processor.test.js.map +1 -0
  479. package/dist/tools/create/file-creator.d.ts +35 -0
  480. package/dist/tools/create/file-creator.d.ts.map +1 -0
  481. package/dist/tools/create/file-creator.js +103 -0
  482. package/dist/tools/create/file-creator.js.map +1 -0
  483. package/dist/tools/create/index.d.ts +6 -0
  484. package/dist/tools/create/index.d.ts.map +1 -0
  485. package/dist/tools/create/index.js +7 -0
  486. package/dist/tools/create/index.js.map +1 -0
  487. package/dist/tools/create/pipeline.d.ts +39 -0
  488. package/dist/tools/create/pipeline.d.ts.map +1 -0
  489. package/dist/tools/create/pipeline.js +112 -0
  490. package/dist/tools/create/pipeline.js.map +1 -0
  491. package/dist/tools/create/suggestion-generator.d.ts +47 -0
  492. package/dist/tools/create/suggestion-generator.d.ts.map +1 -0
  493. package/dist/tools/create/suggestion-generator.js +51 -0
  494. package/dist/tools/create/suggestion-generator.js.map +1 -0
  495. package/dist/tools/create/template-processor.d.ts +27 -0
  496. package/dist/tools/create/template-processor.d.ts.map +1 -0
  497. package/dist/tools/create/template-processor.js +74 -0
  498. package/dist/tools/create/template-processor.js.map +1 -0
  499. package/dist/tools/create/validation-processor.d.ts +48 -0
  500. package/dist/tools/create/validation-processor.d.ts.map +1 -0
  501. package/dist/tools/create/validation-processor.js +107 -0
  502. package/dist/tools/create/validation-processor.js.map +1 -0
  503. package/dist/tools/executor.d.ts +19 -0
  504. package/dist/tools/executor.d.ts.map +1 -0
  505. package/dist/tools/executor.js +53 -0
  506. package/dist/tools/executor.js.map +1 -0
  507. package/dist/tools/implementations/__tests__/browse-documents.test.d.ts +8 -0
  508. package/dist/tools/implementations/__tests__/browse-documents.test.d.ts.map +1 -0
  509. package/dist/tools/implementations/__tests__/browse-documents.test.js +319 -0
  510. package/dist/tools/implementations/__tests__/browse-documents.test.js.map +1 -0
  511. package/dist/tools/implementations/__tests__/complete-coordinator-task.test.d.ts +7 -0
  512. package/dist/tools/implementations/__tests__/complete-coordinator-task.test.d.ts.map +1 -0
  513. package/dist/tools/implementations/__tests__/complete-coordinator-task.test.js +440 -0
  514. package/dist/tools/implementations/__tests__/complete-coordinator-task.test.js.map +1 -0
  515. package/dist/tools/implementations/__tests__/complete-subagent-task.test.d.ts +14 -0
  516. package/dist/tools/implementations/__tests__/complete-subagent-task.test.d.ts.map +1 -0
  517. package/dist/tools/implementations/__tests__/complete-subagent-task.test.js +851 -0
  518. package/dist/tools/implementations/__tests__/complete-subagent-task.test.js.map +1 -0
  519. package/dist/tools/implementations/__tests__/complete-task-notes.test.d.ts +6 -0
  520. package/dist/tools/implementations/__tests__/complete-task-notes.test.d.ts.map +1 -0
  521. package/dist/tools/implementations/__tests__/complete-task-notes.test.js +157 -0
  522. package/dist/tools/implementations/__tests__/complete-task-notes.test.js.map +1 -0
  523. package/dist/tools/implementations/__tests__/complete-task.test.d.ts +14 -0
  524. package/dist/tools/implementations/__tests__/complete-task.test.d.ts.map +1 -0
  525. package/dist/tools/implementations/__tests__/complete-task.test.js +867 -0
  526. package/dist/tools/implementations/__tests__/complete-task.test.js.map +1 -0
  527. package/dist/tools/implementations/__tests__/continue-task.test.d.ts +11 -0
  528. package/dist/tools/implementations/__tests__/continue-task.test.d.ts.map +1 -0
  529. package/dist/tools/implementations/__tests__/continue-task.test.js +845 -0
  530. package/dist/tools/implementations/__tests__/continue-task.test.js.map +1 -0
  531. package/dist/tools/implementations/__tests__/coordinator-task.test.d.ts +7 -0
  532. package/dist/tools/implementations/__tests__/coordinator-task.test.d.ts.map +1 -0
  533. package/dist/tools/implementations/__tests__/coordinator-task.test.js +495 -0
  534. package/dist/tools/implementations/__tests__/coordinator-task.test.js.map +1 -0
  535. package/dist/tools/implementations/__tests__/get-guide.test.d.ts +8 -0
  536. package/dist/tools/implementations/__tests__/get-guide.test.d.ts.map +1 -0
  537. package/dist/tools/implementations/__tests__/get-guide.test.js +242 -0
  538. package/dist/tools/implementations/__tests__/get-guide.test.js.map +1 -0
  539. package/dist/tools/implementations/__tests__/get-workflow.test.d.ts +8 -0
  540. package/dist/tools/implementations/__tests__/get-workflow.test.d.ts.map +1 -0
  541. package/dist/tools/implementations/__tests__/get-workflow.test.js +232 -0
  542. package/dist/tools/implementations/__tests__/get-workflow.test.js.map +1 -0
  543. package/dist/tools/implementations/__tests__/search-documents.test.d.ts +8 -0
  544. package/dist/tools/implementations/__tests__/search-documents.test.d.ts.map +1 -0
  545. package/dist/tools/implementations/__tests__/search-documents.test.js +336 -0
  546. package/dist/tools/implementations/__tests__/search-documents.test.js.map +1 -0
  547. package/dist/tools/implementations/__tests__/start-coordinator-task.test.d.ts +7 -0
  548. package/dist/tools/implementations/__tests__/start-coordinator-task.test.d.ts.map +1 -0
  549. package/dist/tools/implementations/__tests__/start-coordinator-task.test.js +177 -0
  550. package/dist/tools/implementations/__tests__/start-coordinator-task.test.js.map +1 -0
  551. package/dist/tools/implementations/__tests__/start-subagent-task.test.d.ts +11 -0
  552. package/dist/tools/implementations/__tests__/start-subagent-task.test.d.ts.map +1 -0
  553. package/dist/tools/implementations/__tests__/start-subagent-task.test.js +846 -0
  554. package/dist/tools/implementations/__tests__/start-subagent-task.test.js.map +1 -0
  555. package/dist/tools/implementations/__tests__/start-task.test.d.ts +11 -0
  556. package/dist/tools/implementations/__tests__/start-task.test.d.ts.map +1 -0
  557. package/dist/tools/implementations/__tests__/start-task.test.js +828 -0
  558. package/dist/tools/implementations/__tests__/start-task.test.js.map +1 -0
  559. package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.d.ts +8 -0
  560. package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.d.ts.map +1 -0
  561. package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.js +199 -0
  562. package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.js.map +1 -0
  563. package/dist/tools/implementations/__tests__/subagent-task.test.d.ts +7 -0
  564. package/dist/tools/implementations/__tests__/subagent-task.test.d.ts.map +1 -0
  565. package/dist/tools/implementations/__tests__/subagent-task.test.js +720 -0
  566. package/dist/tools/implementations/__tests__/subagent-task.test.js.map +1 -0
  567. package/dist/tools/implementations/__tests__/task-batch-operations.test.d.ts +8 -0
  568. package/dist/tools/implementations/__tests__/task-batch-operations.test.d.ts.map +1 -0
  569. package/dist/tools/implementations/__tests__/task-batch-operations.test.js +200 -0
  570. package/dist/tools/implementations/__tests__/task-batch-operations.test.js.map +1 -0
  571. package/dist/tools/implementations/__tests__/task.test.d.ts +7 -0
  572. package/dist/tools/implementations/__tests__/task.test.d.ts.map +1 -0
  573. package/dist/tools/implementations/__tests__/task.test.js +578 -0
  574. package/dist/tools/implementations/__tests__/task.test.js.map +1 -0
  575. package/dist/tools/implementations/__tests__/view-coordinator-task.test.d.ts +13 -0
  576. package/dist/tools/implementations/__tests__/view-coordinator-task.test.d.ts.map +1 -0
  577. package/dist/tools/implementations/__tests__/view-coordinator-task.test.js +1404 -0
  578. package/dist/tools/implementations/__tests__/view-coordinator-task.test.js.map +1 -0
  579. package/dist/tools/implementations/__tests__/view-document.linked-context.test.d.ts +8 -0
  580. package/dist/tools/implementations/__tests__/view-document.linked-context.test.d.ts.map +1 -0
  581. package/dist/tools/implementations/__tests__/view-document.linked-context.test.js +235 -0
  582. package/dist/tools/implementations/__tests__/view-document.linked-context.test.js.map +1 -0
  583. package/dist/tools/implementations/__tests__/view-document.simplification.test.d.ts +9 -0
  584. package/dist/tools/implementations/__tests__/view-document.simplification.test.d.ts.map +1 -0
  585. package/dist/tools/implementations/__tests__/view-document.simplification.test.js +160 -0
  586. package/dist/tools/implementations/__tests__/view-document.simplification.test.js.map +1 -0
  587. package/dist/tools/implementations/__tests__/view-task.test.d.ts +12 -0
  588. package/dist/tools/implementations/__tests__/view-task.test.d.ts.map +1 -0
  589. package/dist/tools/implementations/__tests__/view-task.test.js +1158 -0
  590. package/dist/tools/implementations/__tests__/view-task.test.js.map +1 -0
  591. package/dist/tools/implementations/browse-documents.d.ts +36 -0
  592. package/dist/tools/implementations/browse-documents.d.ts.map +1 -0
  593. package/dist/tools/implementations/browse-documents.js +123 -0
  594. package/dist/tools/implementations/browse-documents.js.map +1 -0
  595. package/dist/tools/implementations/complete-coordinator-task.d.ts +53 -0
  596. package/dist/tools/implementations/complete-coordinator-task.d.ts.map +1 -0
  597. package/dist/tools/implementations/complete-coordinator-task.js +159 -0
  598. package/dist/tools/implementations/complete-coordinator-task.js.map +1 -0
  599. package/dist/tools/implementations/complete-subagent-task.d.ts +47 -0
  600. package/dist/tools/implementations/complete-subagent-task.d.ts.map +1 -0
  601. package/dist/tools/implementations/complete-subagent-task.js +141 -0
  602. package/dist/tools/implementations/complete-subagent-task.js.map +1 -0
  603. package/dist/tools/implementations/complete-task.d.ts +32 -0
  604. package/dist/tools/implementations/complete-task.d.ts.map +1 -0
  605. package/dist/tools/implementations/complete-task.hierarchical.test.d.ts +8 -0
  606. package/dist/tools/implementations/complete-task.hierarchical.test.d.ts.map +1 -0
  607. package/dist/tools/implementations/complete-task.hierarchical.test.js +363 -0
  608. package/dist/tools/implementations/complete-task.hierarchical.test.js.map +1 -0
  609. package/dist/tools/implementations/complete-task.js +122 -0
  610. package/dist/tools/implementations/complete-task.js.map +1 -0
  611. package/dist/tools/implementations/continue-task.d.ts +48 -0
  612. package/dist/tools/implementations/continue-task.d.ts.map +1 -0
  613. package/dist/tools/implementations/continue-task.js +167 -0
  614. package/dist/tools/implementations/continue-task.js.map +1 -0
  615. package/dist/tools/implementations/coordinator-task.d.ts +72 -0
  616. package/dist/tools/implementations/coordinator-task.d.ts.map +1 -0
  617. package/dist/tools/implementations/coordinator-task.js +169 -0
  618. package/dist/tools/implementations/coordinator-task.js.map +1 -0
  619. package/dist/tools/implementations/create-document.d.ts +12 -0
  620. package/dist/tools/implementations/create-document.d.ts.map +1 -0
  621. package/dist/tools/implementations/create-document.js +15 -0
  622. package/dist/tools/implementations/create-document.js.map +1 -0
  623. package/dist/tools/implementations/delete-document.d.ts +16 -0
  624. package/dist/tools/implementations/delete-document.d.ts.map +1 -0
  625. package/dist/tools/implementations/delete-document.js +70 -0
  626. package/dist/tools/implementations/delete-document.js.map +1 -0
  627. package/dist/tools/implementations/edit-document.d.ts +8 -0
  628. package/dist/tools/implementations/edit-document.d.ts.map +1 -0
  629. package/dist/tools/implementations/edit-document.js +118 -0
  630. package/dist/tools/implementations/edit-document.js.map +1 -0
  631. package/dist/tools/implementations/get-guide.d.ts +13 -0
  632. package/dist/tools/implementations/get-guide.d.ts.map +1 -0
  633. package/dist/tools/implementations/get-guide.js +64 -0
  634. package/dist/tools/implementations/get-guide.js.map +1 -0
  635. package/dist/tools/implementations/get-workflow.d.ts +12 -0
  636. package/dist/tools/implementations/get-workflow.d.ts.map +1 -0
  637. package/dist/tools/implementations/get-workflow.js +71 -0
  638. package/dist/tools/implementations/get-workflow.js.map +1 -0
  639. package/dist/tools/implementations/index.d.ts +24 -0
  640. package/dist/tools/implementations/index.d.ts.map +1 -0
  641. package/dist/tools/implementations/index.js +24 -0
  642. package/dist/tools/implementations/index.js.map +1 -0
  643. package/dist/tools/implementations/manage-document.d.ts +8 -0
  644. package/dist/tools/implementations/manage-document.d.ts.map +1 -0
  645. package/dist/tools/implementations/manage-document.js +180 -0
  646. package/dist/tools/implementations/manage-document.js.map +1 -0
  647. package/dist/tools/implementations/move-document.d.ts +12 -0
  648. package/dist/tools/implementations/move-document.d.ts.map +1 -0
  649. package/dist/tools/implementations/move-document.js +72 -0
  650. package/dist/tools/implementations/move-document.js.map +1 -0
  651. package/dist/tools/implementations/move.d.ts +24 -0
  652. package/dist/tools/implementations/move.d.ts.map +1 -0
  653. package/dist/tools/implementations/move.js +167 -0
  654. package/dist/tools/implementations/move.js.map +1 -0
  655. package/dist/tools/implementations/search-documents.d.ts +39 -0
  656. package/dist/tools/implementations/search-documents.d.ts.map +1 -0
  657. package/dist/tools/implementations/search-documents.js +246 -0
  658. package/dist/tools/implementations/search-documents.js.map +1 -0
  659. package/dist/tools/implementations/section.d.ts +42 -0
  660. package/dist/tools/implementations/section.d.ts.map +1 -0
  661. package/dist/tools/implementations/section.hierarchical.test.d.ts +8 -0
  662. package/dist/tools/implementations/section.hierarchical.test.d.ts.map +1 -0
  663. package/dist/tools/implementations/section.hierarchical.test.js +299 -0
  664. package/dist/tools/implementations/section.hierarchical.test.js.map +1 -0
  665. package/dist/tools/implementations/section.js +244 -0
  666. package/dist/tools/implementations/section.js.map +1 -0
  667. package/dist/tools/implementations/section.test.d.ts +5 -0
  668. package/dist/tools/implementations/section.test.d.ts.map +1 -0
  669. package/dist/tools/implementations/section.test.js +371 -0
  670. package/dist/tools/implementations/section.test.js.map +1 -0
  671. package/dist/tools/implementations/start-coordinator-task.d.ts +44 -0
  672. package/dist/tools/implementations/start-coordinator-task.d.ts.map +1 -0
  673. package/dist/tools/implementations/start-coordinator-task.js +125 -0
  674. package/dist/tools/implementations/start-coordinator-task.js.map +1 -0
  675. package/dist/tools/implementations/start-subagent-task.d.ts +53 -0
  676. package/dist/tools/implementations/start-subagent-task.d.ts.map +1 -0
  677. package/dist/tools/implementations/start-subagent-task.js +179 -0
  678. package/dist/tools/implementations/start-subagent-task.js.map +1 -0
  679. package/dist/tools/implementations/start-task.d.ts +48 -0
  680. package/dist/tools/implementations/start-task.d.ts.map +1 -0
  681. package/dist/tools/implementations/start-task.js +216 -0
  682. package/dist/tools/implementations/start-task.js.map +1 -0
  683. package/dist/tools/implementations/subagent-task.d.ts +98 -0
  684. package/dist/tools/implementations/subagent-task.d.ts.map +1 -0
  685. package/dist/tools/implementations/subagent-task.js +277 -0
  686. package/dist/tools/implementations/subagent-task.js.map +1 -0
  687. package/dist/tools/implementations/task.d.ts +97 -0
  688. package/dist/tools/implementations/task.d.ts.map +1 -0
  689. package/dist/tools/implementations/task.hierarchical.test.d.ts +8 -0
  690. package/dist/tools/implementations/task.hierarchical.test.d.ts.map +1 -0
  691. package/dist/tools/implementations/task.hierarchical.test.js +333 -0
  692. package/dist/tools/implementations/task.hierarchical.test.js.map +1 -0
  693. package/dist/tools/implementations/task.js +235 -0
  694. package/dist/tools/implementations/task.js.map +1 -0
  695. package/dist/tools/implementations/view-coordinator-task.d.ts +61 -0
  696. package/dist/tools/implementations/view-coordinator-task.d.ts.map +1 -0
  697. package/dist/tools/implementations/view-coordinator-task.js +295 -0
  698. package/dist/tools/implementations/view-coordinator-task.js.map +1 -0
  699. package/dist/tools/implementations/view-document.d.ts +84 -0
  700. package/dist/tools/implementations/view-document.d.ts.map +1 -0
  701. package/dist/tools/implementations/view-document.js +287 -0
  702. package/dist/tools/implementations/view-document.js.map +1 -0
  703. package/dist/tools/implementations/view-section.d.ts +28 -0
  704. package/dist/tools/implementations/view-section.d.ts.map +1 -0
  705. package/dist/tools/implementations/view-section.hierarchical.test.d.ts +8 -0
  706. package/dist/tools/implementations/view-section.hierarchical.test.d.ts.map +1 -0
  707. package/dist/tools/implementations/view-section.hierarchical.test.js +318 -0
  708. package/dist/tools/implementations/view-section.hierarchical.test.js.map +1 -0
  709. package/dist/tools/implementations/view-section.js +167 -0
  710. package/dist/tools/implementations/view-section.js.map +1 -0
  711. package/dist/tools/implementations/view-subagent-task.d.ts +46 -0
  712. package/dist/tools/implementations/view-subagent-task.d.ts.map +1 -0
  713. package/dist/tools/implementations/view-subagent-task.js +283 -0
  714. package/dist/tools/implementations/view-subagent-task.js.map +1 -0
  715. package/dist/tools/implementations/view-task.d.ts +43 -0
  716. package/dist/tools/implementations/view-task.d.ts.map +1 -0
  717. package/dist/tools/implementations/view-task.hierarchical.test.d.ts +8 -0
  718. package/dist/tools/implementations/view-task.hierarchical.test.d.ts.map +1 -0
  719. package/dist/tools/implementations/view-task.hierarchical.test.js +420 -0
  720. package/dist/tools/implementations/view-task.hierarchical.test.js.map +1 -0
  721. package/dist/tools/implementations/view-task.js +280 -0
  722. package/dist/tools/implementations/view-task.js.map +1 -0
  723. package/dist/tools/index.d.ts +6 -0
  724. package/dist/tools/index.d.ts.map +1 -0
  725. package/dist/tools/index.js +6 -0
  726. package/dist/tools/index.js.map +1 -0
  727. package/dist/tools/registry.d.ts +10 -0
  728. package/dist/tools/registry.d.ts.map +1 -0
  729. package/dist/tools/registry.js +132 -0
  730. package/dist/tools/registry.js.map +1 -0
  731. package/dist/tools/schemas/__tests__/get-guide-schemas.test.d.ts +8 -0
  732. package/dist/tools/schemas/__tests__/get-guide-schemas.test.d.ts.map +1 -0
  733. package/dist/tools/schemas/__tests__/get-guide-schemas.test.js +216 -0
  734. package/dist/tools/schemas/__tests__/get-guide-schemas.test.js.map +1 -0
  735. package/dist/tools/schemas/__tests__/get-workflow-schemas.test.d.ts +8 -0
  736. package/dist/tools/schemas/__tests__/get-workflow-schemas.test.d.ts.map +1 -0
  737. package/dist/tools/schemas/__tests__/get-workflow-schemas.test.js +229 -0
  738. package/dist/tools/schemas/__tests__/get-workflow-schemas.test.js.map +1 -0
  739. package/dist/tools/schemas/browse-documents-schemas.d.ts +47 -0
  740. package/dist/tools/schemas/browse-documents-schemas.d.ts.map +1 -0
  741. package/dist/tools/schemas/browse-documents-schemas.js +48 -0
  742. package/dist/tools/schemas/browse-documents-schemas.js.map +1 -0
  743. package/dist/tools/schemas/complete-coordinator-task-schemas.d.ts +41 -0
  744. package/dist/tools/schemas/complete-coordinator-task-schemas.d.ts.map +1 -0
  745. package/dist/tools/schemas/complete-coordinator-task-schemas.js +42 -0
  746. package/dist/tools/schemas/complete-coordinator-task-schemas.js.map +1 -0
  747. package/dist/tools/schemas/complete-subagent-task-schemas.d.ts +38 -0
  748. package/dist/tools/schemas/complete-subagent-task-schemas.d.ts.map +1 -0
  749. package/dist/tools/schemas/complete-subagent-task-schemas.js +41 -0
  750. package/dist/tools/schemas/complete-subagent-task-schemas.js.map +1 -0
  751. package/dist/tools/schemas/complete-task-schemas.d.ts +33 -0
  752. package/dist/tools/schemas/complete-task-schemas.d.ts.map +1 -0
  753. package/dist/tools/schemas/complete-task-schemas.js +36 -0
  754. package/dist/tools/schemas/complete-task-schemas.js.map +1 -0
  755. package/dist/tools/schemas/continue-task-schemas.d.ts +27 -0
  756. package/dist/tools/schemas/continue-task-schemas.d.ts.map +1 -0
  757. package/dist/tools/schemas/continue-task-schemas.js +28 -0
  758. package/dist/tools/schemas/continue-task-schemas.js.map +1 -0
  759. package/dist/tools/schemas/coordinator-task-schemas.d.ts +87 -0
  760. package/dist/tools/schemas/coordinator-task-schemas.d.ts.map +1 -0
  761. package/dist/tools/schemas/coordinator-task-schemas.js +80 -0
  762. package/dist/tools/schemas/coordinator-task-schemas.js.map +1 -0
  763. package/dist/tools/schemas/create-document-schemas.d.ts +61 -0
  764. package/dist/tools/schemas/create-document-schemas.d.ts.map +1 -0
  765. package/dist/tools/schemas/create-document-schemas.js +143 -0
  766. package/dist/tools/schemas/create-document-schemas.js.map +1 -0
  767. package/dist/tools/schemas/delete-document-schemas.d.ts +24 -0
  768. package/dist/tools/schemas/delete-document-schemas.d.ts.map +1 -0
  769. package/dist/tools/schemas/delete-document-schemas.js +25 -0
  770. package/dist/tools/schemas/delete-document-schemas.js.map +1 -0
  771. package/dist/tools/schemas/edit-document-schemas.d.ts +27 -0
  772. package/dist/tools/schemas/edit-document-schemas.d.ts.map +1 -0
  773. package/dist/tools/schemas/edit-document-schemas.js +28 -0
  774. package/dist/tools/schemas/edit-document-schemas.js.map +1 -0
  775. package/dist/tools/schemas/get-guide-schemas.d.ts +35 -0
  776. package/dist/tools/schemas/get-guide-schemas.d.ts.map +1 -0
  777. package/dist/tools/schemas/get-guide-schemas.js +66 -0
  778. package/dist/tools/schemas/get-guide-schemas.js.map +1 -0
  779. package/dist/tools/schemas/get-workflow-schemas.d.ts +35 -0
  780. package/dist/tools/schemas/get-workflow-schemas.d.ts.map +1 -0
  781. package/dist/tools/schemas/get-workflow-schemas.js +67 -0
  782. package/dist/tools/schemas/get-workflow-schemas.js.map +1 -0
  783. package/dist/tools/schemas/manage-document-schemas.d.ts +59 -0
  784. package/dist/tools/schemas/manage-document-schemas.d.ts.map +1 -0
  785. package/dist/tools/schemas/manage-document-schemas.js +83 -0
  786. package/dist/tools/schemas/manage-document-schemas.js.map +1 -0
  787. package/dist/tools/schemas/move-document-schemas.d.ts +25 -0
  788. package/dist/tools/schemas/move-document-schemas.d.ts.map +1 -0
  789. package/dist/tools/schemas/move-document-schemas.js +26 -0
  790. package/dist/tools/schemas/move-document-schemas.js.map +1 -0
  791. package/dist/tools/schemas/move-schemas.d.ts +43 -0
  792. package/dist/tools/schemas/move-schemas.d.ts.map +1 -0
  793. package/dist/tools/schemas/move-schemas.js +43 -0
  794. package/dist/tools/schemas/move-schemas.js.map +1 -0
  795. package/dist/tools/schemas/search-documents-schemas.d.ts +77 -0
  796. package/dist/tools/schemas/search-documents-schemas.d.ts.map +1 -0
  797. package/dist/tools/schemas/search-documents-schemas.js +78 -0
  798. package/dist/tools/schemas/search-documents-schemas.js.map +1 -0
  799. package/dist/tools/schemas/section-schemas.d.ts +361 -0
  800. package/dist/tools/schemas/section-schemas.d.ts.map +1 -0
  801. package/dist/tools/schemas/section-schemas.js +182 -0
  802. package/dist/tools/schemas/section-schemas.js.map +1 -0
  803. package/dist/tools/schemas/start-coordinator-task-schemas.d.ts +30 -0
  804. package/dist/tools/schemas/start-coordinator-task-schemas.d.ts.map +1 -0
  805. package/dist/tools/schemas/start-coordinator-task-schemas.js +31 -0
  806. package/dist/tools/schemas/start-coordinator-task-schemas.js.map +1 -0
  807. package/dist/tools/schemas/start-subagent-task-schemas.d.ts +29 -0
  808. package/dist/tools/schemas/start-subagent-task-schemas.d.ts.map +1 -0
  809. package/dist/tools/schemas/start-subagent-task-schemas.js +40 -0
  810. package/dist/tools/schemas/start-subagent-task-schemas.js.map +1 -0
  811. package/dist/tools/schemas/start-task-schemas.d.ts +23 -0
  812. package/dist/tools/schemas/start-task-schemas.d.ts.map +1 -0
  813. package/dist/tools/schemas/start-task-schemas.js +39 -0
  814. package/dist/tools/schemas/start-task-schemas.js.map +1 -0
  815. package/dist/tools/schemas/subagent-task-schemas.d.ts +93 -0
  816. package/dist/tools/schemas/subagent-task-schemas.d.ts.map +1 -0
  817. package/dist/tools/schemas/subagent-task-schemas.js +81 -0
  818. package/dist/tools/schemas/subagent-task-schemas.js.map +1 -0
  819. package/dist/tools/schemas/task-schemas.d.ts +88 -0
  820. package/dist/tools/schemas/task-schemas.d.ts.map +1 -0
  821. package/dist/tools/schemas/task-schemas.js +80 -0
  822. package/dist/tools/schemas/task-schemas.js.map +1 -0
  823. package/dist/tools/schemas/view-coordinator-task-schemas.d.ts +27 -0
  824. package/dist/tools/schemas/view-coordinator-task-schemas.d.ts.map +1 -0
  825. package/dist/tools/schemas/view-coordinator-task-schemas.js +46 -0
  826. package/dist/tools/schemas/view-coordinator-task-schemas.js.map +1 -0
  827. package/dist/tools/schemas/view-document-schemas.d.ts +152 -0
  828. package/dist/tools/schemas/view-document-schemas.d.ts.map +1 -0
  829. package/dist/tools/schemas/view-document-schemas.js +70 -0
  830. package/dist/tools/schemas/view-document-schemas.js.map +1 -0
  831. package/dist/tools/schemas/view-section-schemas.d.ts +31 -0
  832. package/dist/tools/schemas/view-section-schemas.d.ts.map +1 -0
  833. package/dist/tools/schemas/view-section-schemas.js +56 -0
  834. package/dist/tools/schemas/view-section-schemas.js.map +1 -0
  835. package/dist/tools/schemas/view-subagent-task-schemas.d.ts +31 -0
  836. package/dist/tools/schemas/view-subagent-task-schemas.d.ts.map +1 -0
  837. package/dist/tools/schemas/view-subagent-task-schemas.js +65 -0
  838. package/dist/tools/schemas/view-subagent-task-schemas.js.map +1 -0
  839. package/dist/tools/schemas/view-task-schemas.d.ts +31 -0
  840. package/dist/tools/schemas/view-task-schemas.d.ts.map +1 -0
  841. package/dist/tools/schemas/view-task-schemas.js +62 -0
  842. package/dist/tools/schemas/view-task-schemas.js.map +1 -0
  843. package/dist/tools/types.d.ts +98 -0
  844. package/dist/tools/types.d.ts.map +1 -0
  845. package/dist/tools/types.js +9 -0
  846. package/dist/tools/types.js.map +1 -0
  847. package/dist/tools-manager.d.ts +8 -0
  848. package/dist/tools-manager.d.ts.map +1 -0
  849. package/dist/tools-manager.js +9 -0
  850. package/dist/tools-manager.js.map +1 -0
  851. package/dist/types/core.d.ts +71 -0
  852. package/dist/types/core.d.ts.map +1 -0
  853. package/dist/types/core.js +5 -0
  854. package/dist/types/core.js.map +1 -0
  855. package/dist/types/index.d.ts +5 -0
  856. package/dist/types/index.d.ts.map +1 -0
  857. package/dist/types/index.js +5 -0
  858. package/dist/types/index.js.map +1 -0
  859. package/dist/types/linking.d.ts +97 -0
  860. package/dist/types/linking.d.ts.map +1 -0
  861. package/dist/types/linking.js +5 -0
  862. package/dist/types/linking.js.map +1 -0
  863. package/dist/utils/__tests__/path-handler.archive.test.d.ts +8 -0
  864. package/dist/utils/__tests__/path-handler.archive.test.d.ts.map +1 -0
  865. package/dist/utils/__tests__/path-handler.archive.test.js +163 -0
  866. package/dist/utils/__tests__/path-handler.archive.test.js.map +1 -0
  867. package/dist/utils/error-formatter.d.ts +32 -0
  868. package/dist/utils/error-formatter.d.ts.map +1 -0
  869. package/dist/utils/error-formatter.js +79 -0
  870. package/dist/utils/error-formatter.js.map +1 -0
  871. package/dist/utils/logger.d.ts +21 -0
  872. package/dist/utils/logger.d.ts.map +1 -0
  873. package/dist/utils/logger.js +154 -0
  874. package/dist/utils/logger.js.map +1 -0
  875. package/dist/utils/path-handler.d.ts +52 -0
  876. package/dist/utils/path-handler.d.ts.map +1 -0
  877. package/dist/utils/path-handler.js +129 -0
  878. package/dist/utils/path-handler.js.map +1 -0
  879. package/dist/utils/security-audit-logger.d.ts +64 -0
  880. package/dist/utils/security-audit-logger.d.ts.map +1 -0
  881. package/dist/utils/security-audit-logger.js +56 -0
  882. package/dist/utils/security-audit-logger.js.map +1 -0
  883. package/dist/utils/virtual-path-resolver.d.ts +126 -0
  884. package/dist/utils/virtual-path-resolver.d.ts.map +1 -0
  885. package/dist/utils/virtual-path-resolver.js +171 -0
  886. package/dist/utils/virtual-path-resolver.js.map +1 -0
  887. package/package.json +82 -0
@@ -0,0 +1,965 @@
1
+ /**
2
+ * Document cache system with file watching and lazy loading
3
+ */
4
+ import { promises as fs } from 'node:fs';
5
+ import { createHash } from 'node:crypto';
6
+ import path from 'node:path';
7
+ import { watch } from 'chokidar';
8
+ import { EventEmitter } from 'node:events';
9
+ import { listHeadings, buildToc } from './parse.js';
10
+ import { getGlobalLogger } from './utils/logger.js';
11
+ import { invalidateAddressCache } from './shared/addressing-system.js';
12
+ import { pathToNamespace } from './shared/path-utilities.js';
13
+ import { ERROR_CODES, DEFAULT_LIMITS } from './constants/defaults.js';
14
+ import { createRequire } from 'node:module';
15
+ const logger = getGlobalLogger();
16
+ const require = createRequire(import.meta.url);
17
+ const packageJson = require('../package.json');
18
+ /**
19
+ * Creates a custom error with code, context, and version information
20
+ */
21
+ function createError(message, code, context) {
22
+ const error = new Error(message);
23
+ return Object.assign(error, {
24
+ code,
25
+ context: { ...context, version: packageJson.version }
26
+ });
27
+ }
28
+ /**
29
+ * Access context for cache operations
30
+ *
31
+ * Tracks the purpose of document access to apply appropriate caching strategies.
32
+ * Different contexts receive different eviction resistance (boost factors).
33
+ */
34
+ export var AccessContext;
35
+ (function (AccessContext) {
36
+ /** Search operations (lowest eviction resistance) */
37
+ AccessContext["SEARCH"] = "search";
38
+ /** Direct document access (standard eviction resistance) */
39
+ AccessContext["DIRECT"] = "direct";
40
+ /** Reference loading (highest eviction resistance, 2x boost) */
41
+ AccessContext["REFERENCE"] = "reference";
42
+ })(AccessContext || (AccessContext = {}));
43
+ /**
44
+ * Pre-compiled regex patterns for metadata extraction
45
+ * These patterns are created once at module load time for optimal performance
46
+ */
47
+ const MARKDOWN_LINK_PATTERN = /\[([^\]]+)\]\([^)]+\)/g;
48
+ const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g;
49
+ /**
50
+ * Stop words Set for keyword extraction
51
+ * Created once at module load time for optimal performance
52
+ */
53
+ const STOP_WORDS = new Set([
54
+ 'the', 'and', 'for', 'with', 'this', 'that', 'will', 'can', 'are', 'you',
55
+ 'how', 'what', 'when', 'where', 'why', 'who', 'which', 'was', 'were',
56
+ 'been', 'have', 'has', 'had', 'should', 'would', 'could', 'may', 'might',
57
+ 'must', 'shall', 'not', 'but', 'however', 'therefore', 'thus', 'also',
58
+ 'such', 'very', 'more', 'most', 'much', 'many', 'some', 'any', 'all'
59
+ ]);
60
+ const DEFAULT_OPTIONS = {
61
+ maxCacheSize: 100,
62
+ enableWatching: true,
63
+ watchIgnorePatterns: ['**/node_modules/**', '**/.git/**', '**/dist/**'],
64
+ evictionPolicy: 'lru',
65
+ boostFactors: {
66
+ search: 3.0,
67
+ direct: 1.0,
68
+ reference: 2.0
69
+ }
70
+ };
71
+ /**
72
+ * Document cache with file watching and intelligent invalidation
73
+ */
74
+ export class DocumentCache extends EventEmitter {
75
+ cache = new Map();
76
+ accessOrder = new Map();
77
+ accessMetadata = new Map();
78
+ options;
79
+ docsRoot;
80
+ coordinatorRoot;
81
+ watcher;
82
+ accessCounter = 0;
83
+ boostFactors;
84
+ watcherErrorCount = 0;
85
+ MAX_WATCHER_ERRORS = 3;
86
+ pollingInterval;
87
+ totalHeadingsLoaded = 0;
88
+ constructor(docsRoot, options = {}, coordinatorRoot) {
89
+ super();
90
+ this.docsRoot = path.resolve(docsRoot);
91
+ // Coordinator root defaults to sibling of docs root if not provided
92
+ this.coordinatorRoot = coordinatorRoot != null
93
+ ? path.resolve(coordinatorRoot)
94
+ : path.join(path.dirname(this.docsRoot), 'coordinator');
95
+ this.options = { ...DEFAULT_OPTIONS, ...options };
96
+ // Merge boost factors with defaults
97
+ this.boostFactors = {
98
+ search: options.boostFactors?.search ?? DEFAULT_OPTIONS.boostFactors?.search ?? 3.0,
99
+ direct: options.boostFactors?.direct ?? DEFAULT_OPTIONS.boostFactors?.direct ?? 1.0,
100
+ reference: options.boostFactors?.reference ?? DEFAULT_OPTIONS.boostFactors?.reference ?? 2.0
101
+ };
102
+ if (this.options.enableWatching) {
103
+ this.initializeWatcher();
104
+ }
105
+ // Integrate with addressing system cache for consistency
106
+ this.setupAddressingCacheIntegration();
107
+ logger.info('DocumentCache initialized', {
108
+ docsRoot: this.docsRoot,
109
+ maxSize: this.options.maxCacheSize
110
+ });
111
+ }
112
+ /**
113
+ * Setup integration with addressing system cache to maintain consistency
114
+ */
115
+ setupAddressingCacheIntegration() {
116
+ // Listen to our own document change events and invalidate addressing cache
117
+ this.on('document:changed', (docPath) => {
118
+ try {
119
+ invalidateAddressCache(docPath);
120
+ logger.debug('Invalidated addressing cache for changed document', { path: docPath });
121
+ }
122
+ catch (error) {
123
+ logger.error('CRITICAL: Failed to invalidate addressing cache - MANUAL INTERVENTION REQUIRED', {
124
+ path: docPath,
125
+ error,
126
+ remedy: 'Restart server or manually clear caches'
127
+ });
128
+ // Don't re-throw - log for monitoring but continue operation
129
+ // Emit a separate critical error event for alerting
130
+ this.emit('cache:inconsistency:critical', { docPath, error });
131
+ }
132
+ });
133
+ this.on('document:deleted', (docPath) => {
134
+ try {
135
+ invalidateAddressCache(docPath);
136
+ logger.debug('Invalidated addressing cache for deleted document', { path: docPath });
137
+ }
138
+ catch (error) {
139
+ logger.error('CRITICAL: Failed to invalidate addressing cache - MANUAL INTERVENTION REQUIRED', {
140
+ path: docPath,
141
+ error,
142
+ remedy: 'Restart server or manually clear caches'
143
+ });
144
+ // Don't re-throw - log for monitoring but continue operation
145
+ // Emit a separate critical error event for alerting
146
+ this.emit('cache:inconsistency:critical', { docPath, error });
147
+ }
148
+ });
149
+ }
150
+ /**
151
+ * Initialize file system watcher
152
+ */
153
+ initializeWatcher() {
154
+ this.watcher = watch(this.docsRoot, {
155
+ ignored: this.options.watchIgnorePatterns,
156
+ persistent: true,
157
+ ignoreInitial: true,
158
+ awaitWriteFinish: {
159
+ stabilityThreshold: 100,
160
+ pollInterval: 20
161
+ }
162
+ });
163
+ // Critical: Handle watcher errors with recovery mechanism
164
+ this.watcher.on('error', (error) => {
165
+ this.watcherErrorCount++;
166
+ const errorMessage = error instanceof Error ? error.message : String(error);
167
+ logger.error('File watcher error - attempting recovery', {
168
+ error: errorMessage,
169
+ errorCount: this.watcherErrorCount,
170
+ maxErrors: this.MAX_WATCHER_ERRORS,
171
+ docsRoot: this.docsRoot
172
+ });
173
+ this.emit('watcher:error', error);
174
+ // After MAX_WATCHER_ERRORS, switch to polling mode
175
+ if (this.watcherErrorCount >= this.MAX_WATCHER_ERRORS) {
176
+ logger.error('Maximum watcher errors reached - switching to polling mode', {
177
+ errorCount: this.watcherErrorCount
178
+ });
179
+ this.switchToPollingMode();
180
+ }
181
+ else {
182
+ // Attempt to reinitialize with exponential backoff
183
+ this.reinitializeWatcher();
184
+ }
185
+ });
186
+ this.watcher.on('change', (filePath) => {
187
+ try {
188
+ const relativePath = this.getRelativePath(filePath);
189
+ this.invalidateDocument(relativePath);
190
+ this.emit('document:changed', relativePath);
191
+ logger.debug('Document changed', { path: relativePath });
192
+ }
193
+ catch (error) {
194
+ logger.error('Error handling file change', { filePath, error });
195
+ }
196
+ });
197
+ this.watcher.on('unlink', (filePath) => {
198
+ try {
199
+ const relativePath = this.getRelativePath(filePath);
200
+ this.invalidateDocument(relativePath);
201
+ this.emit('document:deleted', relativePath);
202
+ logger.debug('Document deleted', { path: relativePath });
203
+ }
204
+ catch (error) {
205
+ logger.error('Error handling file deletion', { filePath, error });
206
+ }
207
+ });
208
+ logger.info('File watcher initialized', { docsRoot: this.docsRoot });
209
+ }
210
+ /**
211
+ * Reinitialize file watcher with exponential backoff after error
212
+ */
213
+ reinitializeWatcher() {
214
+ if (this.watcher != null) {
215
+ this.watcher.close().catch((error) => {
216
+ logger.warn('Error closing watcher during reinitialize', { error });
217
+ });
218
+ this.watcher = undefined;
219
+ }
220
+ const backoffDelay = 5000 * this.watcherErrorCount;
221
+ logger.info('Scheduling watcher reinitialize with backoff', {
222
+ errorCount: this.watcherErrorCount,
223
+ delayMs: backoffDelay
224
+ });
225
+ setTimeout(() => {
226
+ logger.info('Attempting to reinitialize file watcher');
227
+ this.initializeWatcher();
228
+ }, backoffDelay);
229
+ }
230
+ /**
231
+ * Switch to polling mode after repeated watcher failures
232
+ *
233
+ * Implements fallback polling mechanism that validates cache consistency
234
+ * every 30 seconds by checking file modification times. This ensures the
235
+ * cache stays synchronized even when the file watcher is unavailable.
236
+ */
237
+ switchToPollingMode() {
238
+ if (this.watcher != null) {
239
+ this.watcher.close().catch((error) => {
240
+ logger.warn('Error closing watcher during switch to polling', { error });
241
+ });
242
+ this.watcher = undefined;
243
+ }
244
+ logger.warn('Switching to polling mode after repeated watcher failures', {
245
+ errorCount: this.watcherErrorCount,
246
+ pollingInterval: 30000
247
+ });
248
+ this.pollingInterval = setInterval(() => {
249
+ this.validateCacheConsistency().catch((error) => {
250
+ logger.error('Error during cache validation in polling mode', { error });
251
+ });
252
+ }, 30000);
253
+ this.emit('watcher:polling-mode');
254
+ }
255
+ /**
256
+ * Validate cache consistency by checking file modification times
257
+ *
258
+ * Used in polling mode to detect file changes when the watcher is unavailable.
259
+ * Compares cached modification times with current file stats and invalidates
260
+ * stale entries.
261
+ */
262
+ async validateCacheConsistency() {
263
+ const cachedPaths = Array.from(this.cache.keys());
264
+ for (const docPath of cachedPaths) {
265
+ try {
266
+ const absolutePath = this.getAbsolutePath(docPath);
267
+ const stats = await fs.stat(absolutePath);
268
+ const cached = this.cache.get(docPath);
269
+ if (cached != null) {
270
+ const cachedMtime = cached.metadata.lastModified.getTime();
271
+ const currentMtime = stats.mtimeMs;
272
+ if (currentMtime !== cachedMtime) {
273
+ logger.debug('Detected stale document in polling mode', {
274
+ path: docPath,
275
+ cachedMtime: new Date(cachedMtime).toISOString(),
276
+ currentMtime: new Date(currentMtime).toISOString()
277
+ });
278
+ this.invalidateDocument(docPath);
279
+ this.emit('document:changed', docPath);
280
+ }
281
+ }
282
+ }
283
+ catch (error) {
284
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
285
+ // File was deleted
286
+ logger.debug('Detected deleted document in polling mode', { path: docPath });
287
+ this.invalidateDocument(docPath);
288
+ this.emit('document:deleted', docPath);
289
+ }
290
+ else {
291
+ logger.warn('Error validating document in polling mode', {
292
+ path: docPath,
293
+ error
294
+ });
295
+ }
296
+ }
297
+ }
298
+ }
299
+ /**
300
+ * Convert absolute path to relative document path
301
+ */
302
+ getRelativePath(filePath) {
303
+ const relative = path.relative(this.docsRoot, filePath);
304
+ return relative.startsWith('/') ? relative : `/${relative}`;
305
+ }
306
+ /**
307
+ * Get absolute file path from document path
308
+ */
309
+ getAbsolutePath(docPath) {
310
+ const relativePath = docPath.startsWith('/') ? docPath.slice(1) : docPath;
311
+ // Check if this is a coordinator path
312
+ if (relativePath.startsWith('coordinator/') || relativePath === 'coordinator') {
313
+ // Use coordinator root and remove the 'coordinator/' prefix
314
+ const coordPath = relativePath === 'coordinator'
315
+ ? ''
316
+ : relativePath.slice('coordinator/'.length);
317
+ return path.join(this.coordinatorRoot, coordPath);
318
+ }
319
+ // Default to docs root
320
+ return path.join(this.docsRoot, relativePath);
321
+ }
322
+ /**
323
+ * Calculate content hash for cache validation
324
+ */
325
+ calculateHash(content) {
326
+ return createHash('sha256').update(content, 'utf8').digest('hex').slice(0, 16);
327
+ }
328
+ /**
329
+ * Extract lightweight keywords from document content for fingerprinting
330
+ *
331
+ * Optimized for cache operations - extracts meaningful keywords from
332
+ * title and content while being lightweight enough for frequent use.
333
+ *
334
+ * @param title - Document title
335
+ * @param content - Full document content
336
+ * @returns Array of keywords limited to 20 items for performance
337
+ */
338
+ extractKeywordsForFingerprint(title, content) {
339
+ try {
340
+ // Handle null/undefined inputs gracefully
341
+ const safeTitle = title ?? '';
342
+ const safeContent = content ?? '';
343
+ // Focus on title and first few paragraphs for performance
344
+ const textForAnalysis = `${safeTitle} ${safeContent.slice(0, 1000)}`;
345
+ const text = textForAnalysis.toLowerCase();
346
+ if (text.trim().length === 0) {
347
+ return [];
348
+ }
349
+ // Split into words and filter by length
350
+ const words = text
351
+ .split(/\s+/)
352
+ .map(word => word.trim())
353
+ .filter(word => word.length > 2);
354
+ if (words.length === 0) {
355
+ return [];
356
+ }
357
+ // Filter out stop words and non-meaningful content
358
+ const keywords = words.filter(word => {
359
+ // Remove stop words using module-level constant
360
+ if (STOP_WORDS.has(word)) {
361
+ return false;
362
+ }
363
+ // Remove words that are just punctuation or numbers
364
+ if (/^[\d\W]+$/.test(word)) {
365
+ return false;
366
+ }
367
+ return true;
368
+ });
369
+ // Remove duplicates and limit for performance
370
+ const uniqueKeywords = [...new Set(keywords)];
371
+ return uniqueKeywords.slice(0, 20);
372
+ }
373
+ catch (error) {
374
+ logger.warn('Keyword extraction failed during fingerprinting', { error });
375
+ return [];
376
+ }
377
+ }
378
+ /**
379
+ * Extract metadata from markdown content
380
+ */
381
+ extractMetadata(content, filePath, stats) {
382
+ const lines = content.split('\n');
383
+ const firstHeading = lines.find(line => line.startsWith('#'));
384
+ const title = firstHeading?.replace(/^#+\s*/, '') ?? path.basename(filePath, '.md');
385
+ // Simple content analysis using pre-compiled regex patterns
386
+ const wordCount = content.split(/\s+/).length;
387
+ const linkMatches = content.match(MARKDOWN_LINK_PATTERN) ?? [];
388
+ const codeBlockMatches = content.match(CODE_BLOCK_PATTERN) ?? [];
389
+ // Generate namespace from path
390
+ const relativePath = this.getRelativePath(filePath);
391
+ const namespace = pathToNamespace(relativePath);
392
+ // Extract keywords for fingerprinting
393
+ const keywords = this.extractKeywordsForFingerprint(title, content);
394
+ // Current timestamp for fingerprint generation
395
+ const fingerprintGenerated = new Date();
396
+ return {
397
+ path: relativePath,
398
+ title,
399
+ lastModified: stats.mtime,
400
+ contentHash: this.calculateHash(content),
401
+ wordCount,
402
+ linkCount: linkMatches.length,
403
+ codeBlockCount: codeBlockMatches.length,
404
+ lastAccessed: new Date(),
405
+ cacheGeneration: 0, // No longer used, kept for backward compatibility
406
+ namespace,
407
+ keywords,
408
+ fingerprintGenerated
409
+ };
410
+ }
411
+ /**
412
+ * Build slug index for fast section lookups
413
+ */
414
+ buildSlugIndex(headings) {
415
+ const index = new Map();
416
+ headings.forEach((heading, index_) => {
417
+ index.set(heading.slug, index_);
418
+ });
419
+ return index;
420
+ }
421
+ /**
422
+ * Enforce cache size limits with boost-aware LRU/MRU eviction
423
+ *
424
+ * Uses access metadata to calculate eviction scores that incorporate
425
+ * both access time and boost factors. Documents with higher boost factors
426
+ * (e.g., search-accessed) are less likely to be evicted.
427
+ */
428
+ enforceCacheSize() {
429
+ if (this.cache.size <= this.options.maxCacheSize) {
430
+ return;
431
+ }
432
+ const entriesToRemove = this.cache.size - this.options.maxCacheSize;
433
+ // Calculate eviction scores (lower score = evict first)
434
+ // Use normalized scoring to prevent integer overflow
435
+ const scoredPaths = Array.from(this.accessMetadata.entries())
436
+ .map(([path, metadata]) => {
437
+ // Normalize timestamp to prevent overflow when multiplying by boost factor
438
+ const normalizedTimestamp = metadata.timestamp / this.accessCounter;
439
+ const score = this.options.evictionPolicy === 'lru'
440
+ ? normalizedTimestamp * metadata.boostFactor // Boost search-accessed docs
441
+ : -normalizedTimestamp * metadata.boostFactor; // MRU with boost
442
+ return { path, score };
443
+ })
444
+ .sort((a, b) => a.score - b.score) // Lowest score first
445
+ .slice(0, entriesToRemove)
446
+ .map(entry => entry.path);
447
+ for (const docPath of scoredPaths) {
448
+ // Get document before deletion to track heading count
449
+ const doc = this.cache.get(docPath);
450
+ this.cache.delete(docPath);
451
+ this.accessOrder.delete(docPath);
452
+ this.accessMetadata.delete(docPath);
453
+ // Decrement total heading count for evicted document
454
+ if (doc != null) {
455
+ this.totalHeadingsLoaded -= doc.headings.length;
456
+ logger.debug('Evicted document from cache', {
457
+ path: docPath,
458
+ headingsRemoved: doc.headings.length,
459
+ totalHeadingsRemaining: this.totalHeadingsLoaded
460
+ });
461
+ }
462
+ else {
463
+ logger.debug('Evicted document from cache', {
464
+ path: docPath
465
+ });
466
+ }
467
+ }
468
+ }
469
+ /**
470
+ * Update access tracking for cache policies with context-aware boost
471
+ *
472
+ * @param docPath - Document path
473
+ * @param context - Access context (search, direct, reference)
474
+ */
475
+ updateAccess(docPath, context = AccessContext.DIRECT) {
476
+ this.accessCounter++;
477
+ this.accessOrder.set(docPath, this.accessCounter);
478
+ // Track access metadata with boost factor
479
+ this.accessMetadata.set(docPath, {
480
+ timestamp: this.accessCounter,
481
+ context,
482
+ boostFactor: this.boostFactors[context]
483
+ });
484
+ }
485
+ /**
486
+ * Retrieves a document from cache or loads it from the filesystem
487
+ *
488
+ * Uses boost-aware LRU eviction policy and automatic cache invalidation on file changes.
489
+ * Documents are parsed to extract headings, table of contents, and metadata.
490
+ *
491
+ * @param docPath - Relative path to the document (e.g., "api/auth.md")
492
+ * @param context - Access context for boost-aware caching (search, direct, reference)
493
+ * @returns Cached document with metadata and structure, or null if file doesn't exist
494
+ *
495
+ * @example Basic usage (default DIRECT context)
496
+ * const doc = await cache.getDocument("api/authentication.md");
497
+ * if (doc) {
498
+ * console.log(`Title: ${doc.metadata.title}`);
499
+ * console.log(`Headings: ${doc.headings.length}`);
500
+ * }
501
+ *
502
+ * @example Search context (3x eviction resistance)
503
+ * const doc = await cache.getDocument("api/authentication.md", AccessContext.SEARCH);
504
+ *
505
+ * @example Reference context (2x eviction resistance)
506
+ * const doc = await cache.getDocument("api/tokens.md", AccessContext.REFERENCE);
507
+ *
508
+ * @throws {Error} When file access fails due to permissions or other filesystem errors
509
+ */
510
+ async getDocument(docPath, context = AccessContext.DIRECT) {
511
+ // Check cache first
512
+ const cached = this.cache.get(docPath);
513
+ if (cached) {
514
+ this.updateAccess(docPath, context);
515
+ cached.metadata.lastAccessed = new Date();
516
+ return cached;
517
+ }
518
+ // Load from file system
519
+ try {
520
+ const absolutePath = this.getAbsolutePath(docPath);
521
+ const [content, stats] = await Promise.all([
522
+ fs.readFile(absolutePath, 'utf8'),
523
+ fs.stat(absolutePath)
524
+ ]);
525
+ // Parse content
526
+ const headings = listHeadings(content);
527
+ // Check global heading limit to prevent DoS via heading accumulation
528
+ const newTotal = this.totalHeadingsLoaded + headings.length;
529
+ if (newTotal > DEFAULT_LIMITS.MAX_TOTAL_HEADINGS) {
530
+ logger.error('Global heading limit exceeded', {
531
+ currentTotal: this.totalHeadingsLoaded,
532
+ newDocument: headings.length,
533
+ maxTotal: DEFAULT_LIMITS.MAX_TOTAL_HEADINGS,
534
+ docPath
535
+ });
536
+ throw createError('Global heading limit exceeded. Clear cache or increase limit.', ERROR_CODES.RESOURCE_EXHAUSTED, {
537
+ currentTotal: this.totalHeadingsLoaded,
538
+ newDocument: headings.length,
539
+ maxTotal: DEFAULT_LIMITS.MAX_TOTAL_HEADINGS
540
+ });
541
+ }
542
+ // Update total heading count
543
+ this.totalHeadingsLoaded = newTotal;
544
+ const toc = buildToc(content);
545
+ const slugIndex = this.buildSlugIndex(headings);
546
+ const metadata = this.extractMetadata(content, absolutePath, stats);
547
+ // Create cached document
548
+ const document = {
549
+ metadata,
550
+ headings,
551
+ toc,
552
+ slugIndex
553
+ };
554
+ // Add to cache
555
+ this.cache.set(docPath, document);
556
+ this.updateAccess(docPath, context);
557
+ this.enforceCacheSize();
558
+ logger.debug('Loaded document into cache', {
559
+ path: docPath,
560
+ context,
561
+ headings: headings.length,
562
+ size: this.cache.size
563
+ });
564
+ return document;
565
+ }
566
+ catch (error) {
567
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
568
+ return null; // File not found
569
+ }
570
+ throw error;
571
+ }
572
+ }
573
+ /**
574
+ * Retrieves the content of a specific section from a document
575
+ *
576
+ * Uses slugIndex for O(1) validation before parsing section content.
577
+ * No caching of section content (sections typically accessed once).
578
+ *
579
+ * @param docPath - Relative path to the document
580
+ * @param slug - Section slug (flat or hierarchical path)
581
+ * @returns Section content or null if section not found
582
+ *
583
+ * @example
584
+ * // Flat addressing
585
+ * const content = await cache.getSectionContent("api/auth.md", "overview");
586
+ *
587
+ * // Hierarchical addressing
588
+ * const content = await cache.getSectionContent("api/auth.md", "api/auth/jwt-tokens");
589
+ *
590
+ * @throws {Error} When document cannot be loaded or section extraction fails
591
+ */
592
+ async getSectionContent(docPath, slug) {
593
+ const document = await this.getDocument(docPath);
594
+ if (!document) {
595
+ return null;
596
+ }
597
+ // OPTIMIZATION: Fast validation using slugIndex (O(1))
598
+ // Skip validation for hierarchical paths as they need special handling
599
+ if (!slug.includes('/')) {
600
+ const headingIndex = document.slugIndex.get(slug);
601
+ if (headingIndex === undefined) {
602
+ logger.debug('Section not found (invalid slug)', { docPath, slug });
603
+ return null; // Invalid slug - fail fast
604
+ }
605
+ }
606
+ // Parse section content from full document (no caching needed)
607
+ // readSection handles both flat and hierarchical slugs
608
+ try {
609
+ const absolutePath = this.getAbsolutePath(docPath);
610
+ const content = await fs.readFile(absolutePath, 'utf8');
611
+ const { readSection } = await import('./sections.js');
612
+ const sectionContent = readSection(content, slug);
613
+ if (sectionContent == null) {
614
+ logger.debug('Section content not found', { docPath, slug });
615
+ return null;
616
+ }
617
+ logger.debug('Section content loaded', {
618
+ docPath,
619
+ slug,
620
+ length: sectionContent.length
621
+ });
622
+ return sectionContent;
623
+ }
624
+ catch (error) {
625
+ logger.error('Failed to read section content', {
626
+ docPath,
627
+ slug,
628
+ error
629
+ });
630
+ return null;
631
+ }
632
+ }
633
+ /**
634
+ * Invalidate a document in the cache
635
+ */
636
+ invalidateDocument(docPath) {
637
+ // Get the cached document to track heading count before deletion
638
+ const cachedDoc = this.cache.get(docPath);
639
+ const existed = this.cache.delete(docPath);
640
+ this.accessOrder.delete(docPath);
641
+ this.accessMetadata.delete(docPath);
642
+ if (existed) {
643
+ // Decrement total heading count when removing a document
644
+ if (cachedDoc != null) {
645
+ this.totalHeadingsLoaded -= cachedDoc.headings.length;
646
+ logger.debug('Invalidated cached document', {
647
+ path: docPath,
648
+ headingsRemoved: cachedDoc.headings.length,
649
+ totalHeadingsRemaining: this.totalHeadingsLoaded
650
+ });
651
+ }
652
+ else {
653
+ logger.debug('Invalidated cached document', { path: docPath });
654
+ }
655
+ // Also invalidate addressing cache for consistency
656
+ try {
657
+ invalidateAddressCache(docPath);
658
+ logger.debug('Invalidated addressing cache for manually invalidated document', { path: docPath });
659
+ }
660
+ catch (error) {
661
+ logger.error('CRITICAL: Failed to invalidate addressing cache - MANUAL INTERVENTION REQUIRED', {
662
+ path: docPath,
663
+ error,
664
+ remedy: 'Restart server or manually clear caches'
665
+ });
666
+ // Don't re-throw - log for monitoring but continue operation
667
+ // Emit a separate critical error event for alerting
668
+ this.emit('cache:inconsistency:critical', { docPath, error });
669
+ }
670
+ }
671
+ return existed;
672
+ }
673
+ /**
674
+ * Get all cached document paths
675
+ */
676
+ getCachedPaths() {
677
+ return Array.from(this.cache.keys());
678
+ }
679
+ /**
680
+ * Get all cached document paths (alias for getCachedPaths)
681
+ *
682
+ * Provides explicit API for retrieving cached document paths without
683
+ * requiring access to cache internals. Preferred over direct cache access.
684
+ *
685
+ * @returns Array of document paths currently in cache
686
+ *
687
+ * @example
688
+ * ```typescript
689
+ * const paths = cache.getCachedDocumentPaths();
690
+ * console.log(`Currently caching ${paths.length} documents`);
691
+ * paths.forEach(path => console.log(` - ${path}`));
692
+ * ```
693
+ */
694
+ getCachedDocumentPaths() {
695
+ return this.getCachedPaths();
696
+ }
697
+ /**
698
+ * Invalidate all documents matching a path prefix
699
+ *
700
+ * Useful for invalidating entire folders when archiving or moving documents.
701
+ * Uses proper encapsulation instead of accessing cache internals directly.
702
+ *
703
+ * @param prefix - Path prefix to match (e.g., '/api/' to invalidate all /api/* documents)
704
+ * @returns Number of documents invalidated
705
+ *
706
+ * @example Invalidate all documents in a folder
707
+ * ```typescript
708
+ * const count = cache.invalidateDocumentsByPrefix('/api/');
709
+ * console.log(`Invalidated ${count} documents in /api/ folder`);
710
+ * ```
711
+ *
712
+ * @example Invalidate documents before archiving
713
+ * ```typescript
714
+ * // Before moving folder to archive
715
+ * const invalidated = cache.invalidateDocumentsByPrefix('/old-docs/');
716
+ * logger.info('Prepared folder for archival', { invalidated });
717
+ * ```
718
+ */
719
+ invalidateDocumentsByPrefix(prefix) {
720
+ let count = 0;
721
+ for (const docPath of this.cache.keys()) {
722
+ if (docPath.startsWith(prefix)) {
723
+ this.invalidateDocument(docPath);
724
+ count++;
725
+ }
726
+ }
727
+ if (count > 0) {
728
+ logger.debug('Invalidated documents by prefix', { prefix, count });
729
+ }
730
+ return count;
731
+ }
732
+ /**
733
+ * Get cache statistics including boost information
734
+ */
735
+ getStats() {
736
+ const documents = Array.from(this.cache.values());
737
+ const accessTimes = documents.map(doc => doc.metadata.lastAccessed);
738
+ // Count documents by access context
739
+ const contextCounts = {
740
+ search: 0,
741
+ reference: 0,
742
+ direct: 0
743
+ };
744
+ for (const metadata of this.accessMetadata.values()) {
745
+ contextCounts[metadata.context]++;
746
+ }
747
+ return {
748
+ size: this.cache.size,
749
+ maxSize: this.options.maxCacheSize,
750
+ hitRate: 0, // Would need request tracking to calculate
751
+ oldestAccess: accessTimes.length > 0 ? new Date(Math.min(...accessTimes.map(d => d.getTime()))) : null,
752
+ newestAccess: accessTimes.length > 0 ? new Date(Math.max(...accessTimes.map(d => d.getTime()))) : null,
753
+ boostedDocuments: contextCounts
754
+ };
755
+ }
756
+ /**
757
+ * Clear all cached documents
758
+ */
759
+ clear() {
760
+ const size = this.cache.size;
761
+ this.cache.clear();
762
+ this.accessOrder.clear();
763
+ this.accessMetadata.clear();
764
+ this.accessCounter = 0;
765
+ this.totalHeadingsLoaded = 0;
766
+ logger.info('Cache cleared', { previousSize: size });
767
+ }
768
+ /**
769
+ * Create a fingerprint entry from document metadata
770
+ *
771
+ * Extracts the fingerprint-relevant information from cached metadata
772
+ * for use in document discovery and cache invalidation operations.
773
+ *
774
+ * @param metadata - Document metadata containing fingerprint information
775
+ * @returns FingerprintEntry with extracted data
776
+ */
777
+ createFingerprintEntry(metadata) {
778
+ return {
779
+ keywords: [...metadata.keywords], // Create defensive copy
780
+ lastModified: metadata.lastModified,
781
+ contentHash: metadata.contentHash,
782
+ namespace: metadata.namespace
783
+ };
784
+ }
785
+ /**
786
+ * Check if a document's fingerprint is stale compared to file system
787
+ *
788
+ * Compares the cached fingerprint timestamp and content hash with the
789
+ * actual file modification time to determine if the cache needs updating.
790
+ *
791
+ * @param docPath - Relative path to the document
792
+ * @returns Promise resolving to true if fingerprint is stale, false if current
793
+ *
794
+ * @example
795
+ * ```typescript
796
+ * const isStale = await cache.isFingerprintStale('/api/auth.md');
797
+ * if (isStale) {
798
+ * cache.invalidateDocument('/api/auth.md');
799
+ * // Fingerprint will be regenerated on next getDocument call
800
+ * }
801
+ * ```
802
+ */
803
+ async isFingerprintStale(docPath) {
804
+ try {
805
+ const cached = this.cache.get(docPath);
806
+ if (cached == null) {
807
+ // No cached version means we need to load (not stale in the traditional sense)
808
+ return false;
809
+ }
810
+ const absolutePath = this.getAbsolutePath(docPath);
811
+ const stats = await fs.stat(absolutePath);
812
+ const currentMtime = stats.mtimeMs;
813
+ // Fast path: Use stored mtime from metadata if available
814
+ // This avoids reading file content in most cases
815
+ if (cached.metadata.lastModified != null) {
816
+ const cachedMtime = cached.metadata.lastModified.getTime();
817
+ if (currentMtime === cachedMtime) {
818
+ // mtime matches exactly - cache is fresh (no file content read needed!)
819
+ logger.debug('Fingerprint is fresh - mtime unchanged (fast path)', {
820
+ path: docPath,
821
+ mtime: new Date(currentMtime).toISOString()
822
+ });
823
+ return false;
824
+ }
825
+ logger.debug('mtime changed, verifying with content hash (slow path)', {
826
+ path: docPath,
827
+ cachedMtime: new Date(cachedMtime).toISOString(),
828
+ currentMtime: new Date(currentMtime).toISOString()
829
+ });
830
+ }
831
+ // Slow path: mtime changed or missing from fingerprint
832
+ // Verify staleness with content hash comparison
833
+ // This only happens when file has been modified or on legacy cache entries
834
+ const content = await fs.readFile(absolutePath, 'utf8');
835
+ const currentHash = this.calculateHash(content);
836
+ if (currentHash !== cached.metadata.contentHash) {
837
+ logger.debug('Fingerprint is stale - content hash mismatch', {
838
+ path: docPath,
839
+ cachedHash: cached.metadata.contentHash,
840
+ currentHash
841
+ });
842
+ return true;
843
+ }
844
+ // Hash matches despite mtime change (rare case - e.g., file touched but not modified)
845
+ logger.debug('Content unchanged despite mtime change', {
846
+ path: docPath,
847
+ hash: currentHash
848
+ });
849
+ return false;
850
+ }
851
+ catch (error) {
852
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
853
+ // File no longer exists - consider stale for cleanup
854
+ logger.debug('File no longer exists for fingerprint staleness check', { path: docPath });
855
+ return true;
856
+ }
857
+ logger.warn('Error checking fingerprint staleness', { path: docPath, error });
858
+ // On error, assume stale to trigger refresh on next access
859
+ return true;
860
+ }
861
+ }
862
+ /**
863
+ * Read the complete content of a document from the filesystem
864
+ *
865
+ * Provides direct access to the full document content without going through
866
+ * the section-based cache system. Used for operations that need the entire
867
+ * document content like relevance analysis and keyword extraction.
868
+ *
869
+ * @param docPath - Relative path to the document (e.g., "api/auth.md")
870
+ * @returns Promise resolving to full document content or null if file doesn't exist
871
+ *
872
+ * @example
873
+ * const content = await cache.readDocumentContent("api/authentication.md");
874
+ * if (content) {
875
+ * console.log(`Document length: ${content.length} characters`);
876
+ * }
877
+ *
878
+ * @throws {Error} When file access fails due to permissions or other filesystem errors
879
+ */
880
+ async readDocumentContent(docPath) {
881
+ try {
882
+ const absolutePath = this.getAbsolutePath(docPath);
883
+ const content = await fs.readFile(absolutePath, 'utf8');
884
+ logger.debug('Read full document content', {
885
+ path: docPath,
886
+ length: content.length
887
+ });
888
+ return content;
889
+ }
890
+ catch (error) {
891
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
892
+ logger.debug('Document not found for content read', { path: docPath });
893
+ return null; // File not found
894
+ }
895
+ logger.error('Failed to read document content', { path: docPath, error });
896
+ throw error;
897
+ }
898
+ }
899
+ /**
900
+ * Cleanup resources
901
+ */
902
+ async destroy() {
903
+ if (this.watcher != null) {
904
+ await this.watcher.close();
905
+ this.watcher = undefined;
906
+ logger.debug('File watcher closed');
907
+ }
908
+ if (this.pollingInterval != null) {
909
+ clearInterval(this.pollingInterval);
910
+ this.pollingInterval = undefined;
911
+ logger.debug('Polling interval cleared');
912
+ }
913
+ // Invalidate all addressing cache entries for cached documents
914
+ let documentsInvalidated = 0;
915
+ for (const docPath of this.getCachedPaths()) {
916
+ try {
917
+ invalidateAddressCache(docPath);
918
+ documentsInvalidated++;
919
+ }
920
+ catch (error) {
921
+ logger.warn('Failed to invalidate address cache during destroy', {
922
+ path: docPath,
923
+ error: error instanceof Error ? error.message : String(error)
924
+ });
925
+ }
926
+ }
927
+ this.clear();
928
+ this.removeAllListeners();
929
+ logger.info('DocumentCache destroyed', { documentsInvalidated });
930
+ }
931
+ }
932
+ /**
933
+ * Global cache instance (singleton pattern)
934
+ * @deprecated Use dependency injection with DocumentCache constructor instead
935
+ */
936
+ let globalCache;
937
+ /**
938
+ * Initialize global document cache
939
+ * @deprecated Use dependency injection with DocumentCache constructor instead
940
+ */
941
+ export function initializeGlobalCache(docsRoot, options) {
942
+ if (globalCache) {
943
+ throw new Error('Global document cache already initialized');
944
+ }
945
+ globalCache = new DocumentCache(docsRoot, options);
946
+ return globalCache;
947
+ }
948
+ /**
949
+ * Get global cache instance
950
+ * @deprecated Use dependency injection with DocumentCache constructor instead
951
+ */
952
+ export function getGlobalCache() {
953
+ if (!globalCache) {
954
+ throw new Error('Global document cache not initialized. Call initializeGlobalCache() first.');
955
+ }
956
+ return globalCache;
957
+ }
958
+ /**
959
+ * Factory function for creating DocumentCache instances with explicit configuration
960
+ * This is the recommended approach for new code instead of global singletons
961
+ */
962
+ export function createDocumentCache(docsRoot, options, coordinatorRoot) {
963
+ return new DocumentCache(docsRoot, options, coordinatorRoot);
964
+ }
965
+ //# sourceMappingURL=document-cache.js.map