glancey 2.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 +435 -0
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
- package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +157 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.js +178 -0
- package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +273 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +334 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +102 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +279 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +1305 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
- package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.js +153 -0
- package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.js +184 -0
- package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
- package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.js +175 -0
- package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.js +229 -0
- package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
- package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
- package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
- package/dist/__tests__/utils/cache.test.d.ts +2 -0
- package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/cache.test.js +147 -0
- package/dist/__tests__/utils/cache.test.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/logger.test.d.ts +2 -0
- package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
- package/dist/__tests__/utils/logger.test.js +131 -0
- package/dist/__tests__/utils/logger.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +191 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +788 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +64 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +211 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +505 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +172 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +362 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/token-tracking.d.ts +143 -0
- package/dist/dashboard/token-tracking.d.ts.map +1 -0
- package/dist/dashboard/token-tracking.js +363 -0
- package/dist/dashboard/token-tracking.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +2710 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +28 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +165 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +34 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +120 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +22 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +179 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +20 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +227 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +103 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +23 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2028 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +29 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +236 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/chunk-utils.d.ts +24 -0
- package/dist/search/chunk-utils.d.ts.map +1 -0
- package/dist/search/chunk-utils.js +41 -0
- package/dist/search/chunk-utils.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +377 -0
- package/dist/search/indexer.d.ts.map +1 -0
- package/dist/search/indexer.js +1557 -0
- package/dist/search/indexer.js.map +1 -0
- package/dist/search/tree-sitter-chunker.d.ts +64 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +412 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/tools/clustering-handlers.d.ts +70 -0
- package/dist/tools/clustering-handlers.d.ts.map +1 -0
- package/dist/tools/clustering-handlers.js +150 -0
- package/dist/tools/clustering-handlers.js.map +1 -0
- package/dist/tools/commit-handlers.d.ts +77 -0
- package/dist/tools/commit-handlers.d.ts.map +1 -0
- package/dist/tools/commit-handlers.js +251 -0
- package/dist/tools/commit-handlers.js.map +1 -0
- package/dist/tools/index-handlers.d.ts +31 -0
- package/dist/tools/index-handlers.d.ts.map +1 -0
- package/dist/tools/index-handlers.js +53 -0
- package/dist/tools/index-handlers.js.map +1 -0
- package/dist/tools/instructions-handlers.d.ts +25 -0
- package/dist/tools/instructions-handlers.d.ts.map +1 -0
- package/dist/tools/instructions-handlers.js +36 -0
- package/dist/tools/instructions-handlers.js.map +1 -0
- package/dist/tools/memory-handlers.d.ts +95 -0
- package/dist/tools/memory-handlers.d.ts.map +1 -0
- package/dist/tools/memory-handlers.js +126 -0
- package/dist/tools/memory-handlers.js.map +1 -0
- package/dist/tools/search-handlers.d.ts +51 -0
- package/dist/tools/search-handlers.d.ts.map +1 -0
- package/dist/tools/search-handlers.js +128 -0
- package/dist/tools/search-handlers.js.map +1 -0
- package/dist/tools/symbol-handlers.d.ts +171 -0
- package/dist/tools/symbol-handlers.d.ts.map +1 -0
- package/dist/tools/symbol-handlers.js +456 -0
- package/dist/tools/symbol-handlers.js.map +1 -0
- package/dist/tools/types.d.ts +32 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +17 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/worktree-handlers.d.ts +96 -0
- package/dist/tools/worktree-handlers.d.ts.map +1 -0
- package/dist/tools/worktree-handlers.js +186 -0
- package/dist/tools/worktree-handlers.js.map +1 -0
- package/dist/utils/cache.d.ts +77 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +134 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +114 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +87 -0
- package/scripts/postinstall.js +48 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common types for MCP tool handlers.
|
|
3
|
+
*/
|
|
4
|
+
import type { CodeIndexer } from '../search/indexer.js';
|
|
5
|
+
/**
|
|
6
|
+
* Standard MCP tool response format.
|
|
7
|
+
*/
|
|
8
|
+
export interface ToolResponse {
|
|
9
|
+
content: Array<{
|
|
10
|
+
type: 'text';
|
|
11
|
+
text: string;
|
|
12
|
+
}>;
|
|
13
|
+
/** Indicates an error response */
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Context passed to all tool handlers.
|
|
18
|
+
*/
|
|
19
|
+
export interface ToolContext {
|
|
20
|
+
indexer: CodeIndexer;
|
|
21
|
+
projectPath: string;
|
|
22
|
+
toolGuidance: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generic tool handler function signature.
|
|
26
|
+
*/
|
|
27
|
+
export type ToolHandler<TArgs = Record<string, unknown>> = (args: TArgs, context: ToolContext) => Promise<ToolResponse>;
|
|
28
|
+
/**
|
|
29
|
+
* Helper to create a successful tool response.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createToolResponse(text: string, guidance?: string): ToolResponse;
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CACzD,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,YAAY,CASpF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common types for MCP tool handlers.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Helper to create a successful tool response.
|
|
6
|
+
*/
|
|
7
|
+
export function createToolResponse(text, guidance = '') {
|
|
8
|
+
return {
|
|
9
|
+
content: [
|
|
10
|
+
{
|
|
11
|
+
type: 'text',
|
|
12
|
+
text: text + guidance,
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiCH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,WAAmB,EAAE;IACpE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,GAAG,QAAQ;aACtB;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for worktree operations.
|
|
3
|
+
*/
|
|
4
|
+
import { type WorktreeInfo, type CreateWorktreeResult, type RemoveWorktreeResult, type ListWorktreesResult } from '../worktree/index.js';
|
|
5
|
+
import type { ToolResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Interface for worktree manager operations (for testability).
|
|
8
|
+
*/
|
|
9
|
+
export interface IWorktreeManager {
|
|
10
|
+
createWorktree(options: {
|
|
11
|
+
shortName: string;
|
|
12
|
+
issueId?: string;
|
|
13
|
+
prefix?: 'feature' | 'fix' | 'refactor' | 'docs' | 'test';
|
|
14
|
+
baseBranch?: string;
|
|
15
|
+
installDeps?: boolean;
|
|
16
|
+
packageManager?: 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
17
|
+
}): Promise<CreateWorktreeResult>;
|
|
18
|
+
listWorktrees(): Promise<ListWorktreesResult>;
|
|
19
|
+
removeWorktree(options: {
|
|
20
|
+
name: string;
|
|
21
|
+
deleteBranch?: boolean;
|
|
22
|
+
force?: boolean;
|
|
23
|
+
}): Promise<RemoveWorktreeResult>;
|
|
24
|
+
getWorktreeInfo(name: string): Promise<WorktreeInfo | null>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Context for worktree tools.
|
|
28
|
+
*/
|
|
29
|
+
export interface WorktreeToolContext {
|
|
30
|
+
projectPath: string;
|
|
31
|
+
toolGuidance: string;
|
|
32
|
+
/** Optional worktree manager instance (for testing). */
|
|
33
|
+
worktreeManager?: IWorktreeManager;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Arguments for create_worktree tool.
|
|
37
|
+
*/
|
|
38
|
+
export interface CreateWorktreeArgs {
|
|
39
|
+
shortName: string;
|
|
40
|
+
issueId?: string;
|
|
41
|
+
prefix?: 'feature' | 'fix' | 'refactor' | 'docs' | 'test';
|
|
42
|
+
baseBranch?: string;
|
|
43
|
+
installDeps?: boolean;
|
|
44
|
+
packageManager?: 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse and validate create_worktree arguments.
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseCreateWorktreeArgs(args: Record<string, unknown> | undefined): CreateWorktreeArgs;
|
|
50
|
+
/**
|
|
51
|
+
* Format worktree creation result.
|
|
52
|
+
*/
|
|
53
|
+
export declare function formatWorktreeCreationResult(result: CreateWorktreeResult): string;
|
|
54
|
+
/**
|
|
55
|
+
* Handle create_worktree tool.
|
|
56
|
+
*/
|
|
57
|
+
export declare function handleCreateWorktree(args: CreateWorktreeArgs, context: WorktreeToolContext): Promise<ToolResponse>;
|
|
58
|
+
/**
|
|
59
|
+
* Handle list_worktrees tool.
|
|
60
|
+
*/
|
|
61
|
+
export declare function handleListWorktrees(context: WorktreeToolContext): Promise<ToolResponse>;
|
|
62
|
+
/**
|
|
63
|
+
* Arguments for remove_worktree tool.
|
|
64
|
+
*/
|
|
65
|
+
export interface RemoveWorktreeArgs {
|
|
66
|
+
name: string;
|
|
67
|
+
deleteBranch?: boolean;
|
|
68
|
+
force?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse and validate remove_worktree arguments.
|
|
72
|
+
*/
|
|
73
|
+
export declare function parseRemoveWorktreeArgs(args: Record<string, unknown> | undefined): RemoveWorktreeArgs;
|
|
74
|
+
/**
|
|
75
|
+
* Format worktree removal result.
|
|
76
|
+
*/
|
|
77
|
+
export declare function formatWorktreeRemovalResult(name: string, result: RemoveWorktreeResult): string;
|
|
78
|
+
/**
|
|
79
|
+
* Handle remove_worktree tool.
|
|
80
|
+
*/
|
|
81
|
+
export declare function handleRemoveWorktree(args: RemoveWorktreeArgs, context: WorktreeToolContext): Promise<ToolResponse>;
|
|
82
|
+
/**
|
|
83
|
+
* Arguments for worktree_status tool.
|
|
84
|
+
*/
|
|
85
|
+
export interface WorktreeStatusArgs {
|
|
86
|
+
name: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse and validate worktree_status arguments.
|
|
90
|
+
*/
|
|
91
|
+
export declare function parseWorktreeStatusArgs(args: Record<string, unknown> | undefined): WorktreeStatusArgs;
|
|
92
|
+
/**
|
|
93
|
+
* Handle worktree_status tool.
|
|
94
|
+
*/
|
|
95
|
+
export declare function handleWorktreeStatus(args: WorktreeStatusArgs, context: WorktreeToolContext): Promise<ToolResponse>;
|
|
96
|
+
//# sourceMappingURL=worktree-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/worktree-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool handlers for worktree operations.
|
|
3
|
+
*/
|
|
4
|
+
import { WorktreeManager, formatWorktreeInfo, formatWorktreeList, } from '../worktree/index.js';
|
|
5
|
+
import { createToolResponse } from './types.js';
|
|
6
|
+
import { isString, isBoolean } from '../utils/type-guards.js';
|
|
7
|
+
import { GlanceyError } from '../utils/errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get or create a worktree manager instance.
|
|
10
|
+
*/
|
|
11
|
+
function getWorktreeManager(context) {
|
|
12
|
+
return context.worktreeManager ?? new WorktreeManager(context.projectPath);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse and validate create_worktree arguments.
|
|
16
|
+
*/
|
|
17
|
+
export function parseCreateWorktreeArgs(args) {
|
|
18
|
+
const shortName = isString(args?.short_name) ? args.short_name : '';
|
|
19
|
+
if (!shortName) {
|
|
20
|
+
throw new GlanceyError('short_name is required', 'validation', {
|
|
21
|
+
tool: 'create_worktree',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const prefix = isString(args?.prefix) ? args.prefix : undefined;
|
|
25
|
+
const validPrefixes = ['feature', 'fix', 'refactor', 'docs', 'test'];
|
|
26
|
+
if (prefix && !validPrefixes.includes(prefix)) {
|
|
27
|
+
throw new GlanceyError(`prefix must be one of: ${validPrefixes.join(', ')}`, 'validation', {
|
|
28
|
+
tool: 'create_worktree',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const packageManager = isString(args?.package_manager) ? args.package_manager : undefined;
|
|
32
|
+
const validPackageManagers = ['npm', 'yarn', 'pnpm', 'bun'];
|
|
33
|
+
if (packageManager && !validPackageManagers.includes(packageManager)) {
|
|
34
|
+
throw new GlanceyError(`package_manager must be one of: ${validPackageManagers.join(', ')}`, 'validation', { tool: 'create_worktree' });
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
shortName,
|
|
38
|
+
issueId: isString(args?.issue_id) ? args.issue_id : undefined,
|
|
39
|
+
prefix: prefix,
|
|
40
|
+
baseBranch: isString(args?.base_branch) ? args.base_branch : undefined,
|
|
41
|
+
installDeps: isBoolean(args?.install_deps) ? args.install_deps : true,
|
|
42
|
+
packageManager: packageManager,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Format worktree creation result.
|
|
47
|
+
*/
|
|
48
|
+
export function formatWorktreeCreationResult(result) {
|
|
49
|
+
if (!result.success) {
|
|
50
|
+
return `Failed to create worktree: ${result.error}`;
|
|
51
|
+
}
|
|
52
|
+
const worktree = result.worktree;
|
|
53
|
+
const parts = [];
|
|
54
|
+
parts.push('## Worktree Created\n');
|
|
55
|
+
parts.push(`**Name:** ${worktree?.name}`);
|
|
56
|
+
parts.push(`**Path:** ${worktree?.path}`);
|
|
57
|
+
parts.push(`**Branch:** ${worktree?.branch}`);
|
|
58
|
+
if (result.depsInstalled !== undefined) {
|
|
59
|
+
const depsStatus = result.depsInstalled ? 'installed' : 'skipped/failed';
|
|
60
|
+
const timeInfo = result.depsInstallTime ? ` (${result.depsInstallTime}ms)` : '';
|
|
61
|
+
parts.push(`**Dependencies:** ${depsStatus}${timeInfo}`);
|
|
62
|
+
}
|
|
63
|
+
parts.push('\n**Usage:** Spawn agent with `cwd: "' + (worktree?.path ?? '') + '"`');
|
|
64
|
+
return parts.join('\n');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Handle create_worktree tool.
|
|
68
|
+
*/
|
|
69
|
+
export async function handleCreateWorktree(args, context) {
|
|
70
|
+
const worktreeManager = getWorktreeManager(context);
|
|
71
|
+
const result = await worktreeManager.createWorktree({
|
|
72
|
+
shortName: args.shortName,
|
|
73
|
+
issueId: args.issueId,
|
|
74
|
+
prefix: args.prefix,
|
|
75
|
+
baseBranch: args.baseBranch,
|
|
76
|
+
installDeps: args.installDeps,
|
|
77
|
+
packageManager: args.packageManager,
|
|
78
|
+
});
|
|
79
|
+
if (!result.success) {
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: 'text',
|
|
84
|
+
text: `Failed to create worktree: ${result.error}` + context.toolGuidance,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
isError: true,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return createToolResponse(formatWorktreeCreationResult(result), context.toolGuidance);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Handle list_worktrees tool.
|
|
94
|
+
*/
|
|
95
|
+
export async function handleListWorktrees(context) {
|
|
96
|
+
const worktreeManager = getWorktreeManager(context);
|
|
97
|
+
const result = await worktreeManager.listWorktrees();
|
|
98
|
+
return createToolResponse(formatWorktreeList(result), context.toolGuidance);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse and validate remove_worktree arguments.
|
|
102
|
+
*/
|
|
103
|
+
export function parseRemoveWorktreeArgs(args) {
|
|
104
|
+
const name = isString(args?.name) ? args.name : '';
|
|
105
|
+
if (!name) {
|
|
106
|
+
throw new GlanceyError('name is required', 'validation', {
|
|
107
|
+
tool: 'remove_worktree',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
name,
|
|
112
|
+
deleteBranch: isBoolean(args?.delete_branch) ? args.delete_branch : false,
|
|
113
|
+
force: isBoolean(args?.force) ? args.force : false,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format worktree removal result.
|
|
118
|
+
*/
|
|
119
|
+
export function formatWorktreeRemovalResult(name, result) {
|
|
120
|
+
if (!result.success) {
|
|
121
|
+
return `Failed to remove worktree: ${result.error}`;
|
|
122
|
+
}
|
|
123
|
+
const parts = [];
|
|
124
|
+
parts.push('## Worktree Removed\n');
|
|
125
|
+
parts.push(`**Name:** ${name}`);
|
|
126
|
+
if (result.branch) {
|
|
127
|
+
parts.push(`**Branch:** ${result.branch}`);
|
|
128
|
+
parts.push(`**Branch deleted:** ${result.branchDeleted ? 'yes' : 'no'}`);
|
|
129
|
+
}
|
|
130
|
+
return parts.join('\n');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Handle remove_worktree tool.
|
|
134
|
+
*/
|
|
135
|
+
export async function handleRemoveWorktree(args, context) {
|
|
136
|
+
const worktreeManager = getWorktreeManager(context);
|
|
137
|
+
const result = await worktreeManager.removeWorktree({
|
|
138
|
+
name: args.name,
|
|
139
|
+
deleteBranch: args.deleteBranch,
|
|
140
|
+
force: args.force,
|
|
141
|
+
});
|
|
142
|
+
if (!result.success) {
|
|
143
|
+
return {
|
|
144
|
+
content: [
|
|
145
|
+
{
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: `Failed to remove worktree: ${result.error}` + context.toolGuidance,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
isError: true,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return createToolResponse(formatWorktreeRemovalResult(args.name, result), context.toolGuidance);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Parse and validate worktree_status arguments.
|
|
157
|
+
*/
|
|
158
|
+
export function parseWorktreeStatusArgs(args) {
|
|
159
|
+
const name = isString(args?.name) ? args.name : '';
|
|
160
|
+
if (!name) {
|
|
161
|
+
throw new GlanceyError('name is required', 'validation', {
|
|
162
|
+
tool: 'worktree_status',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return { name };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Handle worktree_status tool.
|
|
169
|
+
*/
|
|
170
|
+
export async function handleWorktreeStatus(args, context) {
|
|
171
|
+
const worktreeManager = getWorktreeManager(context);
|
|
172
|
+
const info = await worktreeManager.getWorktreeInfo(args.name);
|
|
173
|
+
if (!info) {
|
|
174
|
+
return {
|
|
175
|
+
content: [
|
|
176
|
+
{
|
|
177
|
+
type: 'text',
|
|
178
|
+
text: `Worktree "${args.name}" not found.` + context.toolGuidance,
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
isError: true,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return createToolResponse(formatWorktreeInfo(info), context.toolGuidance);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=worktree-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-handlers.js","sourceRoot":"","sources":["../../src/tools/worktree-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic TTL-based LRU cache with configurable size and expiration.
|
|
3
|
+
* Provides a reusable caching utility for embeddings, metadata, and other data.
|
|
4
|
+
*/
|
|
5
|
+
export interface CacheOptions {
|
|
6
|
+
/** Maximum number of entries (default: 100) */
|
|
7
|
+
maxSize?: number;
|
|
8
|
+
/** Time-to-live in milliseconds (default: 1 hour) */
|
|
9
|
+
ttlMs?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A generic LRU cache with TTL-based expiration.
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Configurable max size with LRU eviction
|
|
16
|
+
* - TTL-based expiration for entries
|
|
17
|
+
* - Automatic cleanup of expired entries on access
|
|
18
|
+
* - Thread-safe for single-threaded Node.js
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const cache = new TTLCache<number[]>({ maxSize: 50, ttlMs: 30000 });
|
|
23
|
+
* cache.set('key', [1, 2, 3]);
|
|
24
|
+
* const value = cache.get('key'); // [1, 2, 3] or undefined if expired
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class TTLCache<T> {
|
|
28
|
+
private cache;
|
|
29
|
+
private readonly maxSize;
|
|
30
|
+
private readonly ttlMs;
|
|
31
|
+
constructor(options?: CacheOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Get a value from the cache.
|
|
34
|
+
* Returns undefined if not found or expired.
|
|
35
|
+
* Updates access time for LRU tracking.
|
|
36
|
+
*/
|
|
37
|
+
get(key: string): T | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Set a value in the cache.
|
|
40
|
+
* Evicts expired entries and oldest entry if at capacity.
|
|
41
|
+
*/
|
|
42
|
+
set(key: string, value: T): void;
|
|
43
|
+
/**
|
|
44
|
+
* Check if a key exists and is not expired.
|
|
45
|
+
*/
|
|
46
|
+
has(key: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Delete a specific key from the cache.
|
|
49
|
+
*/
|
|
50
|
+
delete(key: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Clear all entries from the cache.
|
|
53
|
+
*/
|
|
54
|
+
clear(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Get the current number of entries (including potentially expired ones).
|
|
57
|
+
*/
|
|
58
|
+
get size(): number;
|
|
59
|
+
/**
|
|
60
|
+
* Get cache statistics.
|
|
61
|
+
*/
|
|
62
|
+
getStats(): {
|
|
63
|
+
size: number;
|
|
64
|
+
maxSize: number;
|
|
65
|
+
ttlMs: number;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Evict all expired entries.
|
|
69
|
+
*/
|
|
70
|
+
private evictExpired;
|
|
71
|
+
/**
|
|
72
|
+
* Force cleanup of all expired entries.
|
|
73
|
+
* Useful for periodic maintenance.
|
|
74
|
+
*/
|
|
75
|
+
cleanup(): number;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,GAAE,YAAiB;IAKtC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAmB/B;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAqBhC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYzB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQ5D;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACH,OAAO,IAAI,MAAM;CAKlB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic TTL-based LRU cache with configurable size and expiration.
|
|
3
|
+
* Provides a reusable caching utility for embeddings, metadata, and other data.
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_MAX_SIZE = 100;
|
|
6
|
+
const DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
7
|
+
/**
|
|
8
|
+
* A generic LRU cache with TTL-based expiration.
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Configurable max size with LRU eviction
|
|
12
|
+
* - TTL-based expiration for entries
|
|
13
|
+
* - Automatic cleanup of expired entries on access
|
|
14
|
+
* - Thread-safe for single-threaded Node.js
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const cache = new TTLCache<number[]>({ maxSize: 50, ttlMs: 30000 });
|
|
19
|
+
* cache.set('key', [1, 2, 3]);
|
|
20
|
+
* const value = cache.get('key'); // [1, 2, 3] or undefined if expired
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class TTLCache {
|
|
24
|
+
cache = new Map();
|
|
25
|
+
maxSize;
|
|
26
|
+
ttlMs;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.maxSize = options.maxSize ?? DEFAULT_MAX_SIZE;
|
|
29
|
+
this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get a value from the cache.
|
|
33
|
+
* Returns undefined if not found or expired.
|
|
34
|
+
* Updates access time for LRU tracking.
|
|
35
|
+
*/
|
|
36
|
+
get(key) {
|
|
37
|
+
const entry = this.cache.get(key);
|
|
38
|
+
if (!entry) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
if (now - entry.timestamp > this.ttlMs) {
|
|
43
|
+
// Entry expired
|
|
44
|
+
this.cache.delete(key);
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
// Move to end for LRU (delete and re-insert with updated timestamp)
|
|
48
|
+
this.cache.delete(key);
|
|
49
|
+
this.cache.set(key, { value: entry.value, timestamp: now });
|
|
50
|
+
return entry.value;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Set a value in the cache.
|
|
54
|
+
* Evicts expired entries and oldest entry if at capacity.
|
|
55
|
+
*/
|
|
56
|
+
set(key, value) {
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
// Remove existing entry if present (will be re-added at end)
|
|
59
|
+
this.cache.delete(key);
|
|
60
|
+
// Evict expired entries first
|
|
61
|
+
this.evictExpired(now);
|
|
62
|
+
// Evict oldest entry if still at capacity
|
|
63
|
+
if (this.cache.size >= this.maxSize) {
|
|
64
|
+
const oldestKey = this.cache.keys().next().value;
|
|
65
|
+
if (oldestKey !== undefined) {
|
|
66
|
+
this.cache.delete(oldestKey);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Add new entry
|
|
70
|
+
this.cache.set(key, { value, timestamp: now });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a key exists and is not expired.
|
|
74
|
+
*/
|
|
75
|
+
has(key) {
|
|
76
|
+
const entry = this.cache.get(key);
|
|
77
|
+
if (!entry) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (Date.now() - entry.timestamp > this.ttlMs) {
|
|
81
|
+
this.cache.delete(key);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Delete a specific key from the cache.
|
|
88
|
+
*/
|
|
89
|
+
delete(key) {
|
|
90
|
+
return this.cache.delete(key);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Clear all entries from the cache.
|
|
94
|
+
*/
|
|
95
|
+
clear() {
|
|
96
|
+
this.cache.clear();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the current number of entries (including potentially expired ones).
|
|
100
|
+
*/
|
|
101
|
+
get size() {
|
|
102
|
+
return this.cache.size;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get cache statistics.
|
|
106
|
+
*/
|
|
107
|
+
getStats() {
|
|
108
|
+
return {
|
|
109
|
+
size: this.cache.size,
|
|
110
|
+
maxSize: this.maxSize,
|
|
111
|
+
ttlMs: this.ttlMs,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Evict all expired entries.
|
|
116
|
+
*/
|
|
117
|
+
evictExpired(now = Date.now()) {
|
|
118
|
+
for (const [key, entry] of this.cache) {
|
|
119
|
+
if (now - entry.timestamp > this.ttlMs) {
|
|
120
|
+
this.cache.delete(key);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Force cleanup of all expired entries.
|
|
126
|
+
* Useful for periodic maintenance.
|
|
127
|
+
*/
|
|
128
|
+
cleanup() {
|
|
129
|
+
const sizeBefore = this.cache.size;
|
|
130
|
+
this.evictExpired();
|
|
131
|
+
return sizeBefore - this.cache.size;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process items in parallel with controlled concurrency.
|
|
3
|
+
* Unlike Promise.all which starts all promises at once, this limits
|
|
4
|
+
* how many are running at any time.
|
|
5
|
+
*
|
|
6
|
+
* @param items - Items to process
|
|
7
|
+
* @param fn - Async function to apply to each item
|
|
8
|
+
* @param concurrency - Maximum number of concurrent operations (default: 10)
|
|
9
|
+
* @returns Promise resolving to results in the same order as items
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const results = await mapWithConcurrency(
|
|
14
|
+
* files,
|
|
15
|
+
* async (file) => processFile(file),
|
|
16
|
+
* 10 // max 10 concurrent file operations
|
|
17
|
+
* );
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function mapWithConcurrency<T, R>(items: T[], fn: (item: T, index: number) => Promise<R>, concurrency?: number): Promise<R[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Process items in batches, where each batch is processed in parallel.
|
|
23
|
+
* Useful when you want to process groups at a time with progress reporting.
|
|
24
|
+
*
|
|
25
|
+
* @param items - Items to process
|
|
26
|
+
* @param fn - Async function to apply to each item
|
|
27
|
+
* @param batchSize - Number of items per batch
|
|
28
|
+
* @param onBatchComplete - Optional callback after each batch completes
|
|
29
|
+
* @returns Promise resolving to results in the same order as items
|
|
30
|
+
*/
|
|
31
|
+
export declare function mapInBatches<T, R>(items: T[], fn: (item: T, index: number) => Promise<R>, batchSize?: number, onBatchComplete?: (completedCount: number, totalCount: number) => void): Promise<R[]>;
|
|
32
|
+
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAkBd;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,CAAC,EACrC,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,SAAS,GAAE,MAAW,EACtB,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GACrE,OAAO,CAAC,CAAC,EAAE,CAAC,CAcd"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process items in parallel with controlled concurrency.
|
|
3
|
+
* Unlike Promise.all which starts all promises at once, this limits
|
|
4
|
+
* how many are running at any time.
|
|
5
|
+
*
|
|
6
|
+
* @param items - Items to process
|
|
7
|
+
* @param fn - Async function to apply to each item
|
|
8
|
+
* @param concurrency - Maximum number of concurrent operations (default: 10)
|
|
9
|
+
* @returns Promise resolving to results in the same order as items
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const results = await mapWithConcurrency(
|
|
14
|
+
* files,
|
|
15
|
+
* async (file) => processFile(file),
|
|
16
|
+
* 10 // max 10 concurrent file operations
|
|
17
|
+
* );
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export async function mapWithConcurrency(items, fn, concurrency = 10) {
|
|
21
|
+
const results = new Array(items.length);
|
|
22
|
+
let currentIndex = 0;
|
|
23
|
+
async function processNext() {
|
|
24
|
+
while (currentIndex < items.length) {
|
|
25
|
+
const index = currentIndex++;
|
|
26
|
+
results[index] = await fn(items[index], index);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Start 'concurrency' number of workers
|
|
30
|
+
const workers = Array(Math.min(concurrency, items.length))
|
|
31
|
+
.fill(null)
|
|
32
|
+
.map(() => processNext());
|
|
33
|
+
await Promise.all(workers);
|
|
34
|
+
return results;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Process items in batches, where each batch is processed in parallel.
|
|
38
|
+
* Useful when you want to process groups at a time with progress reporting.
|
|
39
|
+
*
|
|
40
|
+
* @param items - Items to process
|
|
41
|
+
* @param fn - Async function to apply to each item
|
|
42
|
+
* @param batchSize - Number of items per batch
|
|
43
|
+
* @param onBatchComplete - Optional callback after each batch completes
|
|
44
|
+
* @returns Promise resolving to results in the same order as items
|
|
45
|
+
*/
|
|
46
|
+
export async function mapInBatches(items, fn, batchSize = 10, onBatchComplete) {
|
|
47
|
+
const results = [];
|
|
48
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
49
|
+
const batch = items.slice(i, i + batchSize);
|
|
50
|
+
const batchStartIndex = i;
|
|
51
|
+
const batchResults = await Promise.all(batch.map((item, idx) => fn(item, batchStartIndex + idx)));
|
|
52
|
+
results.push(...batchResults);
|
|
53
|
+
onBatchComplete?.(results.length, items.length);
|
|
54
|
+
}
|
|
55
|
+
return results;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=concurrency.js.map
|