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.
- package/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/__tests__/config-loading.test.d.ts +5 -0
- package/dist/__tests__/config-loading.test.d.ts.map +1 -0
- package/dist/__tests__/config-loading.test.js +127 -0
- package/dist/__tests__/config-loading.test.js.map +1 -0
- package/dist/__tests__/config-logging.test.d.ts +5 -0
- package/dist/__tests__/config-logging.test.d.ts.map +1 -0
- package/dist/__tests__/config-logging.test.js +146 -0
- package/dist/__tests__/config-logging.test.js.map +1 -0
- package/dist/__tests__/config-path-resolution.test.d.ts +5 -0
- package/dist/__tests__/config-path-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/config-path-resolution.test.js +88 -0
- package/dist/__tests__/config-path-resolution.test.js.map +1 -0
- package/dist/__tests__/config-path-validation.test.d.ts +6 -0
- package/dist/__tests__/config-path-validation.test.d.ts.map +1 -0
- package/dist/__tests__/config-path-validation.test.js +203 -0
- package/dist/__tests__/config-path-validation.test.js.map +1 -0
- package/dist/__tests__/config-precedence.test.d.ts +5 -0
- package/dist/__tests__/config-precedence.test.d.ts.map +1 -0
- package/dist/__tests__/config-precedence.test.js +200 -0
- package/dist/__tests__/config-precedence.test.js.map +1 -0
- package/dist/__tests__/config-types.test.d.ts +5 -0
- package/dist/__tests__/config-types.test.d.ts.map +1 -0
- package/dist/__tests__/config-types.test.js +189 -0
- package/dist/__tests__/config-types.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +5 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +229 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/config.d.ts +87 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +498 -0
- package/dist/config.js.map +1 -0
- package/dist/constants/defaults.d.ts +78 -0
- package/dist/constants/defaults.d.ts.map +1 -0
- package/dist/constants/defaults.js +78 -0
- package/dist/constants/defaults.js.map +1 -0
- package/dist/document-cache.d.ts +485 -0
- package/dist/document-cache.d.ts.map +1 -0
- package/dist/document-cache.hierarchical.test.d.ts +2 -0
- package/dist/document-cache.hierarchical.test.d.ts.map +1 -0
- package/dist/document-cache.hierarchical.test.js +243 -0
- package/dist/document-cache.hierarchical.test.js.map +1 -0
- package/dist/document-cache.js +965 -0
- package/dist/document-cache.js.map +1 -0
- package/dist/document-cache.test.d.ts +8 -0
- package/dist/document-cache.test.d.ts.map +1 -0
- package/dist/document-cache.test.js +624 -0
- package/dist/document-cache.test.js.map +1 -0
- package/dist/document-manager.d.ts +252 -0
- package/dist/document-manager.d.ts.map +1 -0
- package/dist/document-manager.js +760 -0
- package/dist/document-manager.js.map +1 -0
- package/dist/document-manager.race-condition.test.d.ts +8 -0
- package/dist/document-manager.race-condition.test.d.ts.map +1 -0
- package/dist/document-manager.race-condition.test.js +139 -0
- package/dist/document-manager.race-condition.test.js.map +1 -0
- package/dist/fingerprint-index.d.ts +177 -0
- package/dist/fingerprint-index.d.ts.map +1 -0
- package/dist/fingerprint-index.js +374 -0
- package/dist/fingerprint-index.js.map +1 -0
- package/dist/fingerprint-index.test.d.ts +15 -0
- package/dist/fingerprint-index.test.d.ts.map +1 -0
- package/dist/fingerprint-index.test.js +482 -0
- package/dist/fingerprint-index.test.js.map +1 -0
- package/dist/fsio.d.ts +76 -0
- package/dist/fsio.d.ts.map +1 -0
- package/dist/fsio.js +506 -0
- package/dist/fsio.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown-tools.test.d.ts +5 -0
- package/dist/markdown-tools.test.d.ts.map +1 -0
- package/dist/markdown-tools.test.js +200 -0
- package/dist/markdown-tools.test.js.map +1 -0
- package/dist/parse.d.ts +19 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +144 -0
- package/dist/parse.js.map +1 -0
- package/dist/prompts/__tests__/prompt-loader.test.d.ts +5 -0
- package/dist/prompts/__tests__/prompt-loader.test.d.ts.map +1 -0
- package/dist/prompts/__tests__/prompt-loader.test.js +300 -0
- package/dist/prompts/__tests__/prompt-loader.test.js.map +1 -0
- package/dist/prompts/prompt-loader.d.ts +58 -0
- package/dist/prompts/prompt-loader.d.ts.map +1 -0
- package/dist/prompts/prompt-loader.js +215 -0
- package/dist/prompts/prompt-loader.js.map +1 -0
- package/dist/prompts/prompt-validator.d.ts +30 -0
- package/dist/prompts/prompt-validator.d.ts.map +1 -0
- package/dist/prompts/prompt-validator.js +65 -0
- package/dist/prompts/prompt-validator.js.map +1 -0
- package/dist/prompts/types.d.ts +46 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +14 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/prompts/workflow-prompts.d.ts +42 -0
- package/dist/prompts/workflow-prompts.d.ts.map +1 -0
- package/dist/prompts/workflow-prompts.js +61 -0
- package/dist/prompts/workflow-prompts.js.map +1 -0
- package/dist/sections.d.ts +67 -0
- package/dist/sections.d.ts.map +1 -0
- package/dist/sections.hierarchical.test.d.ts +8 -0
- package/dist/sections.hierarchical.test.d.ts.map +1 -0
- package/dist/sections.hierarchical.test.js +397 -0
- package/dist/sections.hierarchical.test.js.map +1 -0
- package/dist/sections.js +1229 -0
- package/dist/sections.js.map +1 -0
- package/dist/server/default-dependencies.d.ts +134 -0
- package/dist/server/default-dependencies.d.ts.map +1 -0
- package/dist/server/default-dependencies.js +176 -0
- package/dist/server/default-dependencies.js.map +1 -0
- package/dist/server/dependencies.d.ts +161 -0
- package/dist/server/dependencies.d.ts.map +1 -0
- package/dist/server/dependencies.js +50 -0
- package/dist/server/dependencies.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +9 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/error-handling.d.ts +52 -0
- package/dist/server/middleware/error-handling.d.ts.map +1 -0
- package/dist/server/middleware/error-handling.js +76 -0
- package/dist/server/middleware/error-handling.js.map +1 -0
- package/dist/server/middleware/index.d.ts +7 -0
- package/dist/server/middleware/index.d.ts.map +1 -0
- package/dist/server/middleware/index.js +7 -0
- package/dist/server/middleware/index.js.map +1 -0
- package/dist/server/middleware/logging.d.ts +29 -0
- package/dist/server/middleware/logging.d.ts.map +1 -0
- package/dist/server/middleware/logging.js +49 -0
- package/dist/server/middleware/logging.js.map +1 -0
- package/dist/server/middleware/session-management.d.ts +38 -0
- package/dist/server/middleware/session-management.d.ts.map +1 -0
- package/dist/server/middleware/session-management.js +66 -0
- package/dist/server/middleware/session-management.js.map +1 -0
- package/dist/server/request-handlers/index.d.ts +5 -0
- package/dist/server/request-handlers/index.d.ts.map +1 -0
- package/dist/server/request-handlers/index.js +5 -0
- package/dist/server/request-handlers/index.js.map +1 -0
- package/dist/server/request-handlers/prompt-handlers.d.ts +13 -0
- package/dist/server/request-handlers/prompt-handlers.d.ts.map +1 -0
- package/dist/server/request-handlers/prompt-handlers.js +80 -0
- package/dist/server/request-handlers/prompt-handlers.js.map +1 -0
- package/dist/server/request-handlers/tool-handlers.d.ts +11 -0
- package/dist/server/request-handlers/tool-handlers.d.ts.map +1 -0
- package/dist/server/request-handlers/tool-handlers.js +85 -0
- package/dist/server/request-handlers/tool-handlers.js.map +1 -0
- package/dist/server/server-factory.d.ts +68 -0
- package/dist/server/server-factory.d.ts.map +1 -0
- package/dist/server/server-factory.js +135 -0
- package/dist/server/server-factory.js.map +1 -0
- package/dist/server/transport/stdio-transport.d.ts +9 -0
- package/dist/server/transport/stdio-transport.d.ts.map +1 -0
- package/dist/server/transport/stdio-transport.js +11 -0
- package/dist/server/transport/stdio-transport.js.map +1 -0
- package/dist/session/index.d.ts +5 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +7 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/session-store.d.ts +74 -0
- package/dist/session/session-store.d.ts.map +1 -0
- package/dist/session/session-store.js +150 -0
- package/dist/session/session-store.js.map +1 -0
- package/dist/session/types.d.ts +96 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +9 -0
- package/dist/session/types.js.map +1 -0
- package/dist/shared/__tests__/addressing-system.batch-cache.test.d.ts +12 -0
- package/dist/shared/__tests__/addressing-system.batch-cache.test.d.ts.map +1 -0
- package/dist/shared/__tests__/addressing-system.batch-cache.test.js +306 -0
- package/dist/shared/__tests__/addressing-system.batch-cache.test.js.map +1 -0
- package/dist/shared/__tests__/addressing-system.hierarchical.test.d.ts +6 -0
- package/dist/shared/__tests__/addressing-system.hierarchical.test.d.ts.map +1 -0
- package/dist/shared/__tests__/addressing-system.hierarchical.test.js +205 -0
- package/dist/shared/__tests__/addressing-system.hierarchical.test.js.map +1 -0
- package/dist/shared/__tests__/addressing-system.lru.test.d.ts +6 -0
- package/dist/shared/__tests__/addressing-system.lru.test.d.ts.map +1 -0
- package/dist/shared/__tests__/addressing-system.lru.test.js +159 -0
- package/dist/shared/__tests__/addressing-system.lru.test.js.map +1 -0
- package/dist/shared/__tests__/addressing-system.relative-paths.test.d.ts +14 -0
- package/dist/shared/__tests__/addressing-system.relative-paths.test.d.ts.map +1 -0
- package/dist/shared/__tests__/addressing-system.relative-paths.test.js +249 -0
- package/dist/shared/__tests__/addressing-system.relative-paths.test.js.map +1 -0
- package/dist/shared/__tests__/document-analysis-enhanced.test.d.ts +9 -0
- package/dist/shared/__tests__/document-analysis-enhanced.test.d.ts.map +1 -0
- package/dist/shared/__tests__/document-analysis-enhanced.test.js +419 -0
- package/dist/shared/__tests__/document-analysis-enhanced.test.js.map +1 -0
- package/dist/shared/__tests__/document-analysis.test.d.ts +8 -0
- package/dist/shared/__tests__/document-analysis.test.d.ts.map +1 -0
- package/dist/shared/__tests__/document-analysis.test.js +904 -0
- package/dist/shared/__tests__/document-analysis.test.js.map +1 -0
- package/dist/shared/__tests__/keyword-utils-integration.test.d.ts +9 -0
- package/dist/shared/__tests__/keyword-utils-integration.test.d.ts.map +1 -0
- package/dist/shared/__tests__/keyword-utils-integration.test.js +317 -0
- package/dist/shared/__tests__/keyword-utils-integration.test.js.map +1 -0
- package/dist/shared/__tests__/link-utils.test.d.ts +5 -0
- package/dist/shared/__tests__/link-utils.test.d.ts.map +1 -0
- package/dist/shared/__tests__/link-utils.test.js +560 -0
- package/dist/shared/__tests__/link-utils.test.js.map +1 -0
- package/dist/shared/__tests__/link-validation.test.d.ts +5 -0
- package/dist/shared/__tests__/link-validation.test.d.ts.map +1 -0
- package/dist/shared/__tests__/link-validation.test.js +473 -0
- package/dist/shared/__tests__/link-validation.test.js.map +1 -0
- package/dist/shared/__tests__/reference-extractor.test.d.ts +8 -0
- package/dist/shared/__tests__/reference-extractor.test.d.ts.map +1 -0
- package/dist/shared/__tests__/reference-extractor.test.js +260 -0
- package/dist/shared/__tests__/reference-extractor.test.js.map +1 -0
- package/dist/shared/__tests__/reference-loader.test.d.ts +8 -0
- package/dist/shared/__tests__/reference-loader.test.d.ts.map +1 -0
- package/dist/shared/__tests__/reference-loader.test.js +622 -0
- package/dist/shared/__tests__/reference-loader.test.js.map +1 -0
- package/dist/shared/__tests__/section-operations.append.test.d.ts +8 -0
- package/dist/shared/__tests__/section-operations.append.test.d.ts.map +1 -0
- package/dist/shared/__tests__/section-operations.append.test.js +150 -0
- package/dist/shared/__tests__/section-operations.append.test.js.map +1 -0
- package/dist/shared/__tests__/section-operations.test.d.ts +7 -0
- package/dist/shared/__tests__/section-operations.test.d.ts.map +1 -0
- package/dist/shared/__tests__/section-operations.test.js +118 -0
- package/dist/shared/__tests__/section-operations.test.js.map +1 -0
- package/dist/shared/__tests__/slug-utils.test.d.ts +5 -0
- package/dist/shared/__tests__/slug-utils.test.d.ts.map +1 -0
- package/dist/shared/__tests__/slug-utils.test.js +542 -0
- package/dist/shared/__tests__/slug-utils.test.js.map +1 -0
- package/dist/shared/__tests__/task-operations.test.d.ts +9 -0
- package/dist/shared/__tests__/task-operations.test.d.ts.map +1 -0
- package/dist/shared/__tests__/task-operations.test.js +257 -0
- package/dist/shared/__tests__/task-operations.test.js.map +1 -0
- package/dist/shared/__tests__/task-validation.test.d.ts +6 -0
- package/dist/shared/__tests__/task-validation.test.d.ts.map +1 -0
- package/dist/shared/__tests__/task-validation.test.js +129 -0
- package/dist/shared/__tests__/task-validation.test.js.map +1 -0
- package/dist/shared/__tests__/task-view-utilities.test.d.ts +5 -0
- package/dist/shared/__tests__/task-view-utilities.test.d.ts.map +1 -0
- package/dist/shared/__tests__/task-view-utilities.test.js +312 -0
- package/dist/shared/__tests__/task-view-utilities.test.js.map +1 -0
- package/dist/shared/__tests__/tool-integration.array-validation.test.d.ts +7 -0
- package/dist/shared/__tests__/tool-integration.array-validation.test.d.ts.map +1 -0
- package/dist/shared/__tests__/tool-integration.array-validation.test.js +169 -0
- package/dist/shared/__tests__/tool-integration.array-validation.test.js.map +1 -0
- package/dist/shared/__tests__/tool-integration.hierarchical.test.d.ts +7 -0
- package/dist/shared/__tests__/tool-integration.hierarchical.test.d.ts.map +1 -0
- package/dist/shared/__tests__/tool-integration.hierarchical.test.js +204 -0
- package/dist/shared/__tests__/tool-integration.hierarchical.test.js.map +1 -0
- package/dist/shared/__tests__/workflow-prompt-utilities.test.d.ts +8 -0
- package/dist/shared/__tests__/workflow-prompt-utilities.test.d.ts.map +1 -0
- package/dist/shared/__tests__/workflow-prompt-utilities.test.js +722 -0
- package/dist/shared/__tests__/workflow-prompt-utilities.test.js.map +1 -0
- package/dist/shared/addressing-system.d.ts +799 -0
- package/dist/shared/addressing-system.d.ts.map +1 -0
- package/dist/shared/addressing-system.js +1074 -0
- package/dist/shared/addressing-system.js.map +1 -0
- package/dist/shared/document-analysis/__tests__/keyword-utils.test.d.ts +8 -0
- package/dist/shared/document-analysis/__tests__/keyword-utils.test.d.ts.map +1 -0
- package/dist/shared/document-analysis/__tests__/keyword-utils.test.js +601 -0
- package/dist/shared/document-analysis/__tests__/keyword-utils.test.js.map +1 -0
- package/dist/shared/document-analysis/index.d.ts +67 -0
- package/dist/shared/document-analysis/index.d.ts.map +1 -0
- package/dist/shared/document-analysis/index.js +166 -0
- package/dist/shared/document-analysis/index.js.map +1 -0
- package/dist/shared/document-analysis/keyword-utils.d.ts +405 -0
- package/dist/shared/document-analysis/keyword-utils.d.ts.map +1 -0
- package/dist/shared/document-analysis/keyword-utils.js +1147 -0
- package/dist/shared/document-analysis/keyword-utils.js.map +1 -0
- package/dist/shared/document-analysis/reference-validation.d.ts +27 -0
- package/dist/shared/document-analysis/reference-validation.d.ts.map +1 -0
- package/dist/shared/document-analysis/reference-validation.js +173 -0
- package/dist/shared/document-analysis/reference-validation.js.map +1 -0
- package/dist/shared/document-analysis/related-docs.d.ts +27 -0
- package/dist/shared/document-analysis/related-docs.d.ts.map +1 -0
- package/dist/shared/document-analysis/related-docs.js +459 -0
- package/dist/shared/document-analysis/related-docs.js.map +1 -0
- package/dist/shared/document-analysis/types.d.ts +89 -0
- package/dist/shared/document-analysis/types.d.ts.map +1 -0
- package/dist/shared/document-analysis/types.js +41 -0
- package/dist/shared/document-analysis/types.js.map +1 -0
- package/dist/shared/document-analysis.d.ts +15 -0
- package/dist/shared/document-analysis.d.ts.map +1 -0
- package/dist/shared/document-analysis.js +16 -0
- package/dist/shared/document-analysis.js.map +1 -0
- package/dist/shared/document-manager-factory.d.ts +32 -0
- package/dist/shared/document-manager-factory.d.ts.map +1 -0
- package/dist/shared/document-manager-factory.js +75 -0
- package/dist/shared/document-manager-factory.js.map +1 -0
- package/dist/shared/index.d.ts +5 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +7 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/link-analysis.d.ts +84 -0
- package/dist/shared/link-analysis.d.ts.map +1 -0
- package/dist/shared/link-analysis.js +213 -0
- package/dist/shared/link-analysis.js.map +1 -0
- package/dist/shared/link-context.d.ts +23 -0
- package/dist/shared/link-context.d.ts.map +1 -0
- package/dist/shared/link-context.js +172 -0
- package/dist/shared/link-context.js.map +1 -0
- package/dist/shared/link-utils.d.ts +33 -0
- package/dist/shared/link-utils.d.ts.map +1 -0
- package/dist/shared/link-utils.js +301 -0
- package/dist/shared/link-utils.js.map +1 -0
- package/dist/shared/link-validation.d.ts +79 -0
- package/dist/shared/link-validation.d.ts.map +1 -0
- package/dist/shared/link-validation.js +340 -0
- package/dist/shared/link-validation.js.map +1 -0
- package/dist/shared/namespace-analysis.d.ts +10 -0
- package/dist/shared/namespace-analysis.d.ts.map +1 -0
- package/dist/shared/namespace-analysis.js +100 -0
- package/dist/shared/namespace-analysis.js.map +1 -0
- package/dist/shared/namespace-constants.d.ts +69 -0
- package/dist/shared/namespace-constants.d.ts.map +1 -0
- package/dist/shared/namespace-constants.js +97 -0
- package/dist/shared/namespace-constants.js.map +1 -0
- package/dist/shared/path-utilities.d.ts +13 -0
- package/dist/shared/path-utilities.d.ts.map +1 -0
- package/dist/shared/path-utilities.js +39 -0
- package/dist/shared/path-utilities.js.map +1 -0
- package/dist/shared/reference-extractor.d.ts +121 -0
- package/dist/shared/reference-extractor.d.ts.map +1 -0
- package/dist/shared/reference-extractor.js +195 -0
- package/dist/shared/reference-extractor.js.map +1 -0
- package/dist/shared/reference-loader.d.ts +163 -0
- package/dist/shared/reference-loader.d.ts.map +1 -0
- package/dist/shared/reference-loader.js +265 -0
- package/dist/shared/reference-loader.js.map +1 -0
- package/dist/shared/section-operations.d.ts +14 -0
- package/dist/shared/section-operations.d.ts.map +1 -0
- package/dist/shared/section-operations.js +115 -0
- package/dist/shared/section-operations.js.map +1 -0
- package/dist/shared/slug-utils.d.ts +109 -0
- package/dist/shared/slug-utils.d.ts.map +1 -0
- package/dist/shared/slug-utils.js +302 -0
- package/dist/shared/slug-utils.js.map +1 -0
- package/dist/shared/task-operations.d.ts +152 -0
- package/dist/shared/task-operations.d.ts.map +1 -0
- package/dist/shared/task-operations.js +416 -0
- package/dist/shared/task-operations.js.map +1 -0
- package/dist/shared/task-utilities.d.ts +63 -0
- package/dist/shared/task-utilities.d.ts.map +1 -0
- package/dist/shared/task-utilities.js +86 -0
- package/dist/shared/task-utilities.js.map +1 -0
- package/dist/shared/task-validation.d.ts +50 -0
- package/dist/shared/task-validation.d.ts.map +1 -0
- package/dist/shared/task-validation.js +97 -0
- package/dist/shared/task-validation.js.map +1 -0
- package/dist/shared/task-view-utilities.d.ts +109 -0
- package/dist/shared/task-view-utilities.d.ts.map +1 -0
- package/dist/shared/task-view-utilities.js +255 -0
- package/dist/shared/task-view-utilities.js.map +1 -0
- package/dist/shared/utilities.d.ts +14 -0
- package/dist/shared/utilities.d.ts.map +1 -0
- package/dist/shared/utilities.js +23 -0
- package/dist/shared/utilities.js.map +1 -0
- package/dist/shared/utilities.test.d.ts +5 -0
- package/dist/shared/utilities.test.d.ts.map +1 -0
- package/dist/shared/utilities.test.js +422 -0
- package/dist/shared/utilities.test.js.map +1 -0
- package/dist/shared/validation-utils.d.ts +57 -0
- package/dist/shared/validation-utils.d.ts.map +1 -0
- package/dist/shared/validation-utils.js +63 -0
- package/dist/shared/validation-utils.js.map +1 -0
- package/dist/shared/workflow-prompt-utilities.d.ts +64 -0
- package/dist/shared/workflow-prompt-utilities.d.ts.map +1 -0
- package/dist/shared/workflow-prompt-utilities.js +163 -0
- package/dist/shared/workflow-prompt-utilities.js.map +1 -0
- package/dist/slug.d.ts +9 -0
- package/dist/slug.d.ts.map +1 -0
- package/dist/slug.js +40 -0
- package/dist/slug.js.map +1 -0
- package/dist/template-loader.d.ts +6 -0
- package/dist/template-loader.d.ts.map +1 -0
- package/dist/template-loader.js +8 -0
- package/dist/template-loader.js.map +1 -0
- package/dist/tools/__tests__/create-document-self-reference.test.d.ts +2 -0
- package/dist/tools/__tests__/create-document-self-reference.test.d.ts.map +1 -0
- package/dist/tools/__tests__/create-document-self-reference.test.js +124 -0
- package/dist/tools/__tests__/create-document-self-reference.test.js.map +1 -0
- package/dist/tools/__tests__/create-document-workflow-regression.test.d.ts +16 -0
- package/dist/tools/__tests__/create-document-workflow-regression.test.d.ts.map +1 -0
- package/dist/tools/__tests__/create-document-workflow-regression.test.js +655 -0
- package/dist/tools/__tests__/create-document-workflow-regression.test.js.map +1 -0
- package/dist/tools/__tests__/create-document.test.d.ts +2 -0
- package/dist/tools/__tests__/create-document.test.d.ts.map +1 -0
- package/dist/tools/__tests__/create-document.test.js +255 -0
- package/dist/tools/__tests__/create-document.test.js.map +1 -0
- package/dist/tools/__tests__/delete-document.test.d.ts +7 -0
- package/dist/tools/__tests__/delete-document.test.d.ts.map +1 -0
- package/dist/tools/__tests__/delete-document.test.js +311 -0
- package/dist/tools/__tests__/delete-document.test.js.map +1 -0
- package/dist/tools/__tests__/edit-document.test.d.ts +2 -0
- package/dist/tools/__tests__/edit-document.test.d.ts.map +1 -0
- package/dist/tools/__tests__/edit-document.test.js +644 -0
- package/dist/tools/__tests__/edit-document.test.js.map +1 -0
- package/dist/tools/__tests__/error-scenarios.test.d.ts +5 -0
- package/dist/tools/__tests__/error-scenarios.test.d.ts.map +1 -0
- package/dist/tools/__tests__/error-scenarios.test.js +105 -0
- package/dist/tools/__tests__/error-scenarios.test.js.map +1 -0
- package/dist/tools/__tests__/mocks/document-manager.mock.d.ts +99 -0
- package/dist/tools/__tests__/mocks/document-manager.mock.d.ts.map +1 -0
- package/dist/tools/__tests__/mocks/document-manager.mock.js +457 -0
- package/dist/tools/__tests__/mocks/document-manager.mock.js.map +1 -0
- package/dist/tools/__tests__/mocks/filesystem.mock.d.ts +103 -0
- package/dist/tools/__tests__/mocks/filesystem.mock.d.ts.map +1 -0
- package/dist/tools/__tests__/mocks/filesystem.mock.js +247 -0
- package/dist/tools/__tests__/mocks/filesystem.mock.js.map +1 -0
- package/dist/tools/__tests__/move-document.test.d.ts +12 -0
- package/dist/tools/__tests__/move-document.test.d.ts.map +1 -0
- package/dist/tools/__tests__/move-document.test.js +214 -0
- package/dist/tools/__tests__/move-document.test.js.map +1 -0
- package/dist/tools/__tests__/move.test.d.ts +13 -0
- package/dist/tools/__tests__/move.test.d.ts.map +1 -0
- package/dist/tools/__tests__/move.test.js +939 -0
- package/dist/tools/__tests__/move.test.js.map +1 -0
- package/dist/tools/__tests__/section.integration.improved.test.d.ts +5 -0
- package/dist/tools/__tests__/section.integration.improved.test.d.ts.map +1 -0
- package/dist/tools/__tests__/section.integration.improved.test.js +199 -0
- package/dist/tools/__tests__/section.integration.improved.test.js.map +1 -0
- package/dist/tools/__tests__/section.integration.test.d.ts +5 -0
- package/dist/tools/__tests__/section.integration.test.d.ts.map +1 -0
- package/dist/tools/__tests__/section.integration.test.js +637 -0
- package/dist/tools/__tests__/section.integration.test.js.map +1 -0
- package/dist/tools/__tests__/setup/test-environment.d.ts +111 -0
- package/dist/tools/__tests__/setup/test-environment.d.ts.map +1 -0
- package/dist/tools/__tests__/setup/test-environment.js +322 -0
- package/dist/tools/__tests__/setup/test-environment.js.map +1 -0
- package/dist/tools/__tests__/suggestion-generator.test.d.ts +8 -0
- package/dist/tools/__tests__/suggestion-generator.test.d.ts.map +1 -0
- package/dist/tools/__tests__/suggestion-generator.test.js +508 -0
- package/dist/tools/__tests__/suggestion-generator.test.js.map +1 -0
- package/dist/tools/__tests__/task-consistency.test.d.ts +11 -0
- package/dist/tools/__tests__/task-consistency.test.d.ts.map +1 -0
- package/dist/tools/__tests__/task-consistency.test.js +93 -0
- package/dist/tools/__tests__/task-consistency.test.js.map +1 -0
- package/dist/tools/__tests__/task-status-parsing.test.d.ts +15 -0
- package/dist/tools/__tests__/task-status-parsing.test.d.ts.map +1 -0
- package/dist/tools/__tests__/task-status-parsing.test.js +126 -0
- package/dist/tools/__tests__/task-status-parsing.test.js.map +1 -0
- package/dist/tools/__tests__/view-section-boundary.test.d.ts +2 -0
- package/dist/tools/__tests__/view-section-boundary.test.d.ts.map +1 -0
- package/dist/tools/__tests__/view-section-boundary.test.js +132 -0
- package/dist/tools/__tests__/view-section-boundary.test.js.map +1 -0
- package/dist/tools/__tests__/write-operations-integration.test.d.ts +8 -0
- package/dist/tools/__tests__/write-operations-integration.test.d.ts.map +1 -0
- package/dist/tools/__tests__/write-operations-integration.test.js +136 -0
- package/dist/tools/__tests__/write-operations-integration.test.js.map +1 -0
- package/dist/tools/browse/content-analyzer.d.ts +27 -0
- package/dist/tools/browse/content-analyzer.d.ts.map +1 -0
- package/dist/tools/browse/content-analyzer.js +150 -0
- package/dist/tools/browse/content-analyzer.js.map +1 -0
- package/dist/tools/browse/dependency-analyzer.d.ts +63 -0
- package/dist/tools/browse/dependency-analyzer.d.ts.map +1 -0
- package/dist/tools/browse/dependency-analyzer.js +261 -0
- package/dist/tools/browse/dependency-analyzer.js.map +1 -0
- package/dist/tools/browse/folder-navigator.d.ts +35 -0
- package/dist/tools/browse/folder-navigator.d.ts.map +1 -0
- package/dist/tools/browse/folder-navigator.js +154 -0
- package/dist/tools/browse/folder-navigator.js.map +1 -0
- package/dist/tools/browse/index.d.ts +10 -0
- package/dist/tools/browse/index.d.ts.map +1 -0
- package/dist/tools/browse/index.js +14 -0
- package/dist/tools/browse/index.js.map +1 -0
- package/dist/tools/browse/relationship-classifier.d.ts +9 -0
- package/dist/tools/browse/relationship-classifier.d.ts.map +1 -0
- package/dist/tools/browse/relationship-classifier.js +38 -0
- package/dist/tools/browse/relationship-classifier.js.map +1 -0
- package/dist/tools/browse/search-engine.d.ts +69 -0
- package/dist/tools/browse/search-engine.d.ts.map +1 -0
- package/dist/tools/browse/search-engine.js +197 -0
- package/dist/tools/browse/search-engine.js.map +1 -0
- package/dist/tools/create/__tests__/file-creator.test.d.ts +6 -0
- package/dist/tools/create/__tests__/file-creator.test.d.ts.map +1 -0
- package/dist/tools/create/__tests__/file-creator.test.js +138 -0
- package/dist/tools/create/__tests__/file-creator.test.js.map +1 -0
- package/dist/tools/create/__tests__/template-processor.test.d.ts +6 -0
- package/dist/tools/create/__tests__/template-processor.test.d.ts.map +1 -0
- package/dist/tools/create/__tests__/template-processor.test.js +130 -0
- package/dist/tools/create/__tests__/template-processor.test.js.map +1 -0
- package/dist/tools/create/file-creator.d.ts +35 -0
- package/dist/tools/create/file-creator.d.ts.map +1 -0
- package/dist/tools/create/file-creator.js +103 -0
- package/dist/tools/create/file-creator.js.map +1 -0
- package/dist/tools/create/index.d.ts +6 -0
- package/dist/tools/create/index.d.ts.map +1 -0
- package/dist/tools/create/index.js +7 -0
- package/dist/tools/create/index.js.map +1 -0
- package/dist/tools/create/pipeline.d.ts +39 -0
- package/dist/tools/create/pipeline.d.ts.map +1 -0
- package/dist/tools/create/pipeline.js +112 -0
- package/dist/tools/create/pipeline.js.map +1 -0
- package/dist/tools/create/suggestion-generator.d.ts +47 -0
- package/dist/tools/create/suggestion-generator.d.ts.map +1 -0
- package/dist/tools/create/suggestion-generator.js +51 -0
- package/dist/tools/create/suggestion-generator.js.map +1 -0
- package/dist/tools/create/template-processor.d.ts +27 -0
- package/dist/tools/create/template-processor.d.ts.map +1 -0
- package/dist/tools/create/template-processor.js +74 -0
- package/dist/tools/create/template-processor.js.map +1 -0
- package/dist/tools/create/validation-processor.d.ts +48 -0
- package/dist/tools/create/validation-processor.d.ts.map +1 -0
- package/dist/tools/create/validation-processor.js +107 -0
- package/dist/tools/create/validation-processor.js.map +1 -0
- package/dist/tools/executor.d.ts +19 -0
- package/dist/tools/executor.d.ts.map +1 -0
- package/dist/tools/executor.js +53 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/implementations/__tests__/browse-documents.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/browse-documents.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/browse-documents.test.js +319 -0
- package/dist/tools/implementations/__tests__/browse-documents.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/complete-coordinator-task.test.d.ts +7 -0
- package/dist/tools/implementations/__tests__/complete-coordinator-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/complete-coordinator-task.test.js +440 -0
- package/dist/tools/implementations/__tests__/complete-coordinator-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/complete-subagent-task.test.d.ts +14 -0
- package/dist/tools/implementations/__tests__/complete-subagent-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/complete-subagent-task.test.js +851 -0
- package/dist/tools/implementations/__tests__/complete-subagent-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/complete-task-notes.test.d.ts +6 -0
- package/dist/tools/implementations/__tests__/complete-task-notes.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/complete-task-notes.test.js +157 -0
- package/dist/tools/implementations/__tests__/complete-task-notes.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/complete-task.test.d.ts +14 -0
- package/dist/tools/implementations/__tests__/complete-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/complete-task.test.js +867 -0
- package/dist/tools/implementations/__tests__/complete-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/continue-task.test.d.ts +11 -0
- package/dist/tools/implementations/__tests__/continue-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/continue-task.test.js +845 -0
- package/dist/tools/implementations/__tests__/continue-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/coordinator-task.test.d.ts +7 -0
- package/dist/tools/implementations/__tests__/coordinator-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/coordinator-task.test.js +495 -0
- package/dist/tools/implementations/__tests__/coordinator-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/get-guide.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/get-guide.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/get-guide.test.js +242 -0
- package/dist/tools/implementations/__tests__/get-guide.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/get-workflow.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/get-workflow.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/get-workflow.test.js +232 -0
- package/dist/tools/implementations/__tests__/get-workflow.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/search-documents.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/search-documents.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/search-documents.test.js +336 -0
- package/dist/tools/implementations/__tests__/search-documents.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/start-coordinator-task.test.d.ts +7 -0
- package/dist/tools/implementations/__tests__/start-coordinator-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/start-coordinator-task.test.js +177 -0
- package/dist/tools/implementations/__tests__/start-coordinator-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/start-subagent-task.test.d.ts +11 -0
- package/dist/tools/implementations/__tests__/start-subagent-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/start-subagent-task.test.js +846 -0
- package/dist/tools/implementations/__tests__/start-subagent-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/start-task.test.d.ts +11 -0
- package/dist/tools/implementations/__tests__/start-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/start-task.test.js +828 -0
- package/dist/tools/implementations/__tests__/start-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.js +199 -0
- package/dist/tools/implementations/__tests__/subagent-task-batch-operations.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/subagent-task.test.d.ts +7 -0
- package/dist/tools/implementations/__tests__/subagent-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/subagent-task.test.js +720 -0
- package/dist/tools/implementations/__tests__/subagent-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/task-batch-operations.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/task-batch-operations.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/task-batch-operations.test.js +200 -0
- package/dist/tools/implementations/__tests__/task-batch-operations.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/task.test.d.ts +7 -0
- package/dist/tools/implementations/__tests__/task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/task.test.js +578 -0
- package/dist/tools/implementations/__tests__/task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/view-coordinator-task.test.d.ts +13 -0
- package/dist/tools/implementations/__tests__/view-coordinator-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/view-coordinator-task.test.js +1404 -0
- package/dist/tools/implementations/__tests__/view-coordinator-task.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/view-document.linked-context.test.d.ts +8 -0
- package/dist/tools/implementations/__tests__/view-document.linked-context.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/view-document.linked-context.test.js +235 -0
- package/dist/tools/implementations/__tests__/view-document.linked-context.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/view-document.simplification.test.d.ts +9 -0
- package/dist/tools/implementations/__tests__/view-document.simplification.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/view-document.simplification.test.js +160 -0
- package/dist/tools/implementations/__tests__/view-document.simplification.test.js.map +1 -0
- package/dist/tools/implementations/__tests__/view-task.test.d.ts +12 -0
- package/dist/tools/implementations/__tests__/view-task.test.d.ts.map +1 -0
- package/dist/tools/implementations/__tests__/view-task.test.js +1158 -0
- package/dist/tools/implementations/__tests__/view-task.test.js.map +1 -0
- package/dist/tools/implementations/browse-documents.d.ts +36 -0
- package/dist/tools/implementations/browse-documents.d.ts.map +1 -0
- package/dist/tools/implementations/browse-documents.js +123 -0
- package/dist/tools/implementations/browse-documents.js.map +1 -0
- package/dist/tools/implementations/complete-coordinator-task.d.ts +53 -0
- package/dist/tools/implementations/complete-coordinator-task.d.ts.map +1 -0
- package/dist/tools/implementations/complete-coordinator-task.js +159 -0
- package/dist/tools/implementations/complete-coordinator-task.js.map +1 -0
- package/dist/tools/implementations/complete-subagent-task.d.ts +47 -0
- package/dist/tools/implementations/complete-subagent-task.d.ts.map +1 -0
- package/dist/tools/implementations/complete-subagent-task.js +141 -0
- package/dist/tools/implementations/complete-subagent-task.js.map +1 -0
- package/dist/tools/implementations/complete-task.d.ts +32 -0
- package/dist/tools/implementations/complete-task.d.ts.map +1 -0
- package/dist/tools/implementations/complete-task.hierarchical.test.d.ts +8 -0
- package/dist/tools/implementations/complete-task.hierarchical.test.d.ts.map +1 -0
- package/dist/tools/implementations/complete-task.hierarchical.test.js +363 -0
- package/dist/tools/implementations/complete-task.hierarchical.test.js.map +1 -0
- package/dist/tools/implementations/complete-task.js +122 -0
- package/dist/tools/implementations/complete-task.js.map +1 -0
- package/dist/tools/implementations/continue-task.d.ts +48 -0
- package/dist/tools/implementations/continue-task.d.ts.map +1 -0
- package/dist/tools/implementations/continue-task.js +167 -0
- package/dist/tools/implementations/continue-task.js.map +1 -0
- package/dist/tools/implementations/coordinator-task.d.ts +72 -0
- package/dist/tools/implementations/coordinator-task.d.ts.map +1 -0
- package/dist/tools/implementations/coordinator-task.js +169 -0
- package/dist/tools/implementations/coordinator-task.js.map +1 -0
- package/dist/tools/implementations/create-document.d.ts +12 -0
- package/dist/tools/implementations/create-document.d.ts.map +1 -0
- package/dist/tools/implementations/create-document.js +15 -0
- package/dist/tools/implementations/create-document.js.map +1 -0
- package/dist/tools/implementations/delete-document.d.ts +16 -0
- package/dist/tools/implementations/delete-document.d.ts.map +1 -0
- package/dist/tools/implementations/delete-document.js +70 -0
- package/dist/tools/implementations/delete-document.js.map +1 -0
- package/dist/tools/implementations/edit-document.d.ts +8 -0
- package/dist/tools/implementations/edit-document.d.ts.map +1 -0
- package/dist/tools/implementations/edit-document.js +118 -0
- package/dist/tools/implementations/edit-document.js.map +1 -0
- package/dist/tools/implementations/get-guide.d.ts +13 -0
- package/dist/tools/implementations/get-guide.d.ts.map +1 -0
- package/dist/tools/implementations/get-guide.js +64 -0
- package/dist/tools/implementations/get-guide.js.map +1 -0
- package/dist/tools/implementations/get-workflow.d.ts +12 -0
- package/dist/tools/implementations/get-workflow.d.ts.map +1 -0
- package/dist/tools/implementations/get-workflow.js +71 -0
- package/dist/tools/implementations/get-workflow.js.map +1 -0
- package/dist/tools/implementations/index.d.ts +24 -0
- package/dist/tools/implementations/index.d.ts.map +1 -0
- package/dist/tools/implementations/index.js +24 -0
- package/dist/tools/implementations/index.js.map +1 -0
- package/dist/tools/implementations/manage-document.d.ts +8 -0
- package/dist/tools/implementations/manage-document.d.ts.map +1 -0
- package/dist/tools/implementations/manage-document.js +180 -0
- package/dist/tools/implementations/manage-document.js.map +1 -0
- package/dist/tools/implementations/move-document.d.ts +12 -0
- package/dist/tools/implementations/move-document.d.ts.map +1 -0
- package/dist/tools/implementations/move-document.js +72 -0
- package/dist/tools/implementations/move-document.js.map +1 -0
- package/dist/tools/implementations/move.d.ts +24 -0
- package/dist/tools/implementations/move.d.ts.map +1 -0
- package/dist/tools/implementations/move.js +167 -0
- package/dist/tools/implementations/move.js.map +1 -0
- package/dist/tools/implementations/search-documents.d.ts +39 -0
- package/dist/tools/implementations/search-documents.d.ts.map +1 -0
- package/dist/tools/implementations/search-documents.js +246 -0
- package/dist/tools/implementations/search-documents.js.map +1 -0
- package/dist/tools/implementations/section.d.ts +42 -0
- package/dist/tools/implementations/section.d.ts.map +1 -0
- package/dist/tools/implementations/section.hierarchical.test.d.ts +8 -0
- package/dist/tools/implementations/section.hierarchical.test.d.ts.map +1 -0
- package/dist/tools/implementations/section.hierarchical.test.js +299 -0
- package/dist/tools/implementations/section.hierarchical.test.js.map +1 -0
- package/dist/tools/implementations/section.js +244 -0
- package/dist/tools/implementations/section.js.map +1 -0
- package/dist/tools/implementations/section.test.d.ts +5 -0
- package/dist/tools/implementations/section.test.d.ts.map +1 -0
- package/dist/tools/implementations/section.test.js +371 -0
- package/dist/tools/implementations/section.test.js.map +1 -0
- package/dist/tools/implementations/start-coordinator-task.d.ts +44 -0
- package/dist/tools/implementations/start-coordinator-task.d.ts.map +1 -0
- package/dist/tools/implementations/start-coordinator-task.js +125 -0
- package/dist/tools/implementations/start-coordinator-task.js.map +1 -0
- package/dist/tools/implementations/start-subagent-task.d.ts +53 -0
- package/dist/tools/implementations/start-subagent-task.d.ts.map +1 -0
- package/dist/tools/implementations/start-subagent-task.js +179 -0
- package/dist/tools/implementations/start-subagent-task.js.map +1 -0
- package/dist/tools/implementations/start-task.d.ts +48 -0
- package/dist/tools/implementations/start-task.d.ts.map +1 -0
- package/dist/tools/implementations/start-task.js +216 -0
- package/dist/tools/implementations/start-task.js.map +1 -0
- package/dist/tools/implementations/subagent-task.d.ts +98 -0
- package/dist/tools/implementations/subagent-task.d.ts.map +1 -0
- package/dist/tools/implementations/subagent-task.js +277 -0
- package/dist/tools/implementations/subagent-task.js.map +1 -0
- package/dist/tools/implementations/task.d.ts +97 -0
- package/dist/tools/implementations/task.d.ts.map +1 -0
- package/dist/tools/implementations/task.hierarchical.test.d.ts +8 -0
- package/dist/tools/implementations/task.hierarchical.test.d.ts.map +1 -0
- package/dist/tools/implementations/task.hierarchical.test.js +333 -0
- package/dist/tools/implementations/task.hierarchical.test.js.map +1 -0
- package/dist/tools/implementations/task.js +235 -0
- package/dist/tools/implementations/task.js.map +1 -0
- package/dist/tools/implementations/view-coordinator-task.d.ts +61 -0
- package/dist/tools/implementations/view-coordinator-task.d.ts.map +1 -0
- package/dist/tools/implementations/view-coordinator-task.js +295 -0
- package/dist/tools/implementations/view-coordinator-task.js.map +1 -0
- package/dist/tools/implementations/view-document.d.ts +84 -0
- package/dist/tools/implementations/view-document.d.ts.map +1 -0
- package/dist/tools/implementations/view-document.js +287 -0
- package/dist/tools/implementations/view-document.js.map +1 -0
- package/dist/tools/implementations/view-section.d.ts +28 -0
- package/dist/tools/implementations/view-section.d.ts.map +1 -0
- package/dist/tools/implementations/view-section.hierarchical.test.d.ts +8 -0
- package/dist/tools/implementations/view-section.hierarchical.test.d.ts.map +1 -0
- package/dist/tools/implementations/view-section.hierarchical.test.js +318 -0
- package/dist/tools/implementations/view-section.hierarchical.test.js.map +1 -0
- package/dist/tools/implementations/view-section.js +167 -0
- package/dist/tools/implementations/view-section.js.map +1 -0
- package/dist/tools/implementations/view-subagent-task.d.ts +46 -0
- package/dist/tools/implementations/view-subagent-task.d.ts.map +1 -0
- package/dist/tools/implementations/view-subagent-task.js +283 -0
- package/dist/tools/implementations/view-subagent-task.js.map +1 -0
- package/dist/tools/implementations/view-task.d.ts +43 -0
- package/dist/tools/implementations/view-task.d.ts.map +1 -0
- package/dist/tools/implementations/view-task.hierarchical.test.d.ts +8 -0
- package/dist/tools/implementations/view-task.hierarchical.test.d.ts.map +1 -0
- package/dist/tools/implementations/view-task.hierarchical.test.js +420 -0
- package/dist/tools/implementations/view-task.hierarchical.test.js.map +1 -0
- package/dist/tools/implementations/view-task.js +280 -0
- package/dist/tools/implementations/view-task.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +10 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +132 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/schemas/__tests__/get-guide-schemas.test.d.ts +8 -0
- package/dist/tools/schemas/__tests__/get-guide-schemas.test.d.ts.map +1 -0
- package/dist/tools/schemas/__tests__/get-guide-schemas.test.js +216 -0
- package/dist/tools/schemas/__tests__/get-guide-schemas.test.js.map +1 -0
- package/dist/tools/schemas/__tests__/get-workflow-schemas.test.d.ts +8 -0
- package/dist/tools/schemas/__tests__/get-workflow-schemas.test.d.ts.map +1 -0
- package/dist/tools/schemas/__tests__/get-workflow-schemas.test.js +229 -0
- package/dist/tools/schemas/__tests__/get-workflow-schemas.test.js.map +1 -0
- package/dist/tools/schemas/browse-documents-schemas.d.ts +47 -0
- package/dist/tools/schemas/browse-documents-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/browse-documents-schemas.js +48 -0
- package/dist/tools/schemas/browse-documents-schemas.js.map +1 -0
- package/dist/tools/schemas/complete-coordinator-task-schemas.d.ts +41 -0
- package/dist/tools/schemas/complete-coordinator-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/complete-coordinator-task-schemas.js +42 -0
- package/dist/tools/schemas/complete-coordinator-task-schemas.js.map +1 -0
- package/dist/tools/schemas/complete-subagent-task-schemas.d.ts +38 -0
- package/dist/tools/schemas/complete-subagent-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/complete-subagent-task-schemas.js +41 -0
- package/dist/tools/schemas/complete-subagent-task-schemas.js.map +1 -0
- package/dist/tools/schemas/complete-task-schemas.d.ts +33 -0
- package/dist/tools/schemas/complete-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/complete-task-schemas.js +36 -0
- package/dist/tools/schemas/complete-task-schemas.js.map +1 -0
- package/dist/tools/schemas/continue-task-schemas.d.ts +27 -0
- package/dist/tools/schemas/continue-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/continue-task-schemas.js +28 -0
- package/dist/tools/schemas/continue-task-schemas.js.map +1 -0
- package/dist/tools/schemas/coordinator-task-schemas.d.ts +87 -0
- package/dist/tools/schemas/coordinator-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/coordinator-task-schemas.js +80 -0
- package/dist/tools/schemas/coordinator-task-schemas.js.map +1 -0
- package/dist/tools/schemas/create-document-schemas.d.ts +61 -0
- package/dist/tools/schemas/create-document-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/create-document-schemas.js +143 -0
- package/dist/tools/schemas/create-document-schemas.js.map +1 -0
- package/dist/tools/schemas/delete-document-schemas.d.ts +24 -0
- package/dist/tools/schemas/delete-document-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/delete-document-schemas.js +25 -0
- package/dist/tools/schemas/delete-document-schemas.js.map +1 -0
- package/dist/tools/schemas/edit-document-schemas.d.ts +27 -0
- package/dist/tools/schemas/edit-document-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/edit-document-schemas.js +28 -0
- package/dist/tools/schemas/edit-document-schemas.js.map +1 -0
- package/dist/tools/schemas/get-guide-schemas.d.ts +35 -0
- package/dist/tools/schemas/get-guide-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/get-guide-schemas.js +66 -0
- package/dist/tools/schemas/get-guide-schemas.js.map +1 -0
- package/dist/tools/schemas/get-workflow-schemas.d.ts +35 -0
- package/dist/tools/schemas/get-workflow-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/get-workflow-schemas.js +67 -0
- package/dist/tools/schemas/get-workflow-schemas.js.map +1 -0
- package/dist/tools/schemas/manage-document-schemas.d.ts +59 -0
- package/dist/tools/schemas/manage-document-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/manage-document-schemas.js +83 -0
- package/dist/tools/schemas/manage-document-schemas.js.map +1 -0
- package/dist/tools/schemas/move-document-schemas.d.ts +25 -0
- package/dist/tools/schemas/move-document-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/move-document-schemas.js +26 -0
- package/dist/tools/schemas/move-document-schemas.js.map +1 -0
- package/dist/tools/schemas/move-schemas.d.ts +43 -0
- package/dist/tools/schemas/move-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/move-schemas.js +43 -0
- package/dist/tools/schemas/move-schemas.js.map +1 -0
- package/dist/tools/schemas/search-documents-schemas.d.ts +77 -0
- package/dist/tools/schemas/search-documents-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/search-documents-schemas.js +78 -0
- package/dist/tools/schemas/search-documents-schemas.js.map +1 -0
- package/dist/tools/schemas/section-schemas.d.ts +361 -0
- package/dist/tools/schemas/section-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/section-schemas.js +182 -0
- package/dist/tools/schemas/section-schemas.js.map +1 -0
- package/dist/tools/schemas/start-coordinator-task-schemas.d.ts +30 -0
- package/dist/tools/schemas/start-coordinator-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/start-coordinator-task-schemas.js +31 -0
- package/dist/tools/schemas/start-coordinator-task-schemas.js.map +1 -0
- package/dist/tools/schemas/start-subagent-task-schemas.d.ts +29 -0
- package/dist/tools/schemas/start-subagent-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/start-subagent-task-schemas.js +40 -0
- package/dist/tools/schemas/start-subagent-task-schemas.js.map +1 -0
- package/dist/tools/schemas/start-task-schemas.d.ts +23 -0
- package/dist/tools/schemas/start-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/start-task-schemas.js +39 -0
- package/dist/tools/schemas/start-task-schemas.js.map +1 -0
- package/dist/tools/schemas/subagent-task-schemas.d.ts +93 -0
- package/dist/tools/schemas/subagent-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/subagent-task-schemas.js +81 -0
- package/dist/tools/schemas/subagent-task-schemas.js.map +1 -0
- package/dist/tools/schemas/task-schemas.d.ts +88 -0
- package/dist/tools/schemas/task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/task-schemas.js +80 -0
- package/dist/tools/schemas/task-schemas.js.map +1 -0
- package/dist/tools/schemas/view-coordinator-task-schemas.d.ts +27 -0
- package/dist/tools/schemas/view-coordinator-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/view-coordinator-task-schemas.js +46 -0
- package/dist/tools/schemas/view-coordinator-task-schemas.js.map +1 -0
- package/dist/tools/schemas/view-document-schemas.d.ts +152 -0
- package/dist/tools/schemas/view-document-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/view-document-schemas.js +70 -0
- package/dist/tools/schemas/view-document-schemas.js.map +1 -0
- package/dist/tools/schemas/view-section-schemas.d.ts +31 -0
- package/dist/tools/schemas/view-section-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/view-section-schemas.js +56 -0
- package/dist/tools/schemas/view-section-schemas.js.map +1 -0
- package/dist/tools/schemas/view-subagent-task-schemas.d.ts +31 -0
- package/dist/tools/schemas/view-subagent-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/view-subagent-task-schemas.js +65 -0
- package/dist/tools/schemas/view-subagent-task-schemas.js.map +1 -0
- package/dist/tools/schemas/view-task-schemas.d.ts +31 -0
- package/dist/tools/schemas/view-task-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/view-task-schemas.js +62 -0
- package/dist/tools/schemas/view-task-schemas.js.map +1 -0
- package/dist/tools/types.d.ts +98 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +9 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools-manager.d.ts +8 -0
- package/dist/tools-manager.d.ts.map +1 -0
- package/dist/tools-manager.js +9 -0
- package/dist/tools-manager.js.map +1 -0
- package/dist/types/core.d.ts +71 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +5 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/linking.d.ts +97 -0
- package/dist/types/linking.d.ts.map +1 -0
- package/dist/types/linking.js +5 -0
- package/dist/types/linking.js.map +1 -0
- package/dist/utils/__tests__/path-handler.archive.test.d.ts +8 -0
- package/dist/utils/__tests__/path-handler.archive.test.d.ts.map +1 -0
- package/dist/utils/__tests__/path-handler.archive.test.js +163 -0
- package/dist/utils/__tests__/path-handler.archive.test.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +32 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/error-formatter.js +79 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +21 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +154 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-handler.d.ts +52 -0
- package/dist/utils/path-handler.d.ts.map +1 -0
- package/dist/utils/path-handler.js +129 -0
- package/dist/utils/path-handler.js.map +1 -0
- package/dist/utils/security-audit-logger.d.ts +64 -0
- package/dist/utils/security-audit-logger.d.ts.map +1 -0
- package/dist/utils/security-audit-logger.js +56 -0
- package/dist/utils/security-audit-logger.js.map +1 -0
- package/dist/utils/virtual-path-resolver.d.ts +126 -0
- package/dist/utils/virtual-path-resolver.d.ts.map +1 -0
- package/dist/utils/virtual-path-resolver.js +171 -0
- package/dist/utils/virtual-path-resolver.js.map +1 -0
- 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
|